diff --git a/editor/.gitignore b/editor/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/.project b/editor/.project
new file mode 100644
index 0000000..ce41b20
--- /dev/null
+++ b/editor/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.modeling.editor</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/.settings/org.eclipse.core.resources.prefs b/editor/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/.settings/org.eclipse.m2e.core.prefs b/editor/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/README.md b/editor/README.md
new file mode 100644
index 0000000..4334edc
--- /dev/null
+++ b/editor/README.md
@@ -0,0 +1 @@
+# Eclipse Formal Modeling Xtext's based Editor
diff --git a/editor/about.html b/editor/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/pom.xml b/editor/pom.xml
new file mode 100644
index 0000000..73bff0c
--- /dev/null
+++ b/editor/pom.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.parent</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.modeling.editor</artifactId>
+	<packaging>pom</packaging>
+	<name>org.eclipse.efm-modeling Editor</name>
+	<description>This module contains the different plugins relative to the XText Editor for efm-modeling.</description>
+
+	<modules>
+		<module>sew</module>
+		<module>transition</module>
+		<module>xlia</module>
+	</modules>
+</project>
diff --git a/editor/sew/.gitignore b/editor/sew/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/sew/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/sew/.project b/editor/sew/.project
new file mode 100644
index 0000000..a6799be
--- /dev/null
+++ b/editor/sew/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.modeling.editor.sew</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/sew/.settings/org.eclipse.core.resources.prefs b/editor/sew/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/sew/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/sew/.settings/org.eclipse.m2e.core.prefs b/editor/sew/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/sew/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/sew/README.md b/editor/sew/README.md
new file mode 100644
index 0000000..bba46a1
--- /dev/null
+++ b/editor/sew/README.md
@@ -0,0 +1 @@
+# Eclipse Formal Modeling SEW i.e. Symbolic Execution Workflow Xtext's based Editor
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/.classpath b/editor/sew/org.eclipse.efm.sew.ecore/.classpath
new file mode 100644
index 0000000..e9b9bf7
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/.gitignore b/editor/sew/org.eclipse.efm.sew.ecore/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/.project b/editor/sew/org.eclipse.efm.sew.ecore/.project
new file mode 100644
index 0000000..2405bed
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/.project
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.sew.ecore</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.sirius.nature.modelingproject</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/.settings/org.eclipse.core.resources.prefs b/editor/sew/org.eclipse.efm.sew.ecore/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/.settings/org.eclipse.jdt.core.prefs b/editor/sew/org.eclipse.efm.sew.ecore/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/.settings/org.eclipse.m2e.core.prefs b/editor/sew/org.eclipse.efm.sew.ecore/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/META-INF/MANIFEST.MF b/editor/sew/org.eclipse.efm.sew.ecore/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..410233e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.efm.sew.ecore;singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.efm.sew.ecore.Activator
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;visibility:=reexport
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.ecore.sew,
+ org.eclipse.efm.ecore.sew.expression,
+ org.eclipse.efm.ecore.sew.expression.impl,
+ org.eclipse.efm.ecore.sew.expression.util,
+ org.eclipse.efm.ecore.sew.impl,
+ org.eclipse.efm.ecore.sew.util
+Bundle-ActivationPolicy: lazy
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/README.md b/editor/sew/org.eclipse.efm.sew.ecore/README.md
new file mode 100644
index 0000000..69e9837
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/README.md
@@ -0,0 +1,3 @@
+# Eclipse Formal Modeling, SEW Ecore
+
+Model Ecore for Xtext Editor
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/about.html b/editor/sew/org.eclipse.efm.sew.ecore/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/build.properties b/editor/sew/org.eclipse.efm.sew.ecore/build.properties
new file mode 100644
index 0000000..789f9d4
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               plugin.properties,\
+               .
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/plugin.properties b/editor/sew/org.eclipse.efm.sew.ecore/plugin.properties
new file mode 100644
index 0000000..b7cc1d9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/plugin.properties
@@ -0,0 +1,25 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+# 
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+
+pluginName = Sew Model
+providerName = www.example.org
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/plugin.xml b/editor/sew/org.eclipse.efm.sew.ecore/plugin.xml
new file mode 100644
index 0000000..74361cf
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/plugin.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<plugin>
+
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated sew -->
+      <package
+            uri="http://www.eclipse.org/efm/SEW"
+            class="org.eclipse.efm.ecore.sew.SewPackage"
+            genModel="resources/ecore/sew.genmodel"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated sew -->
+      <package
+            uri="http://www.eclipse.org/efm/SEW/Expression"
+            class="org.eclipse.efm.ecore.sew.expression.ExpressionPackage"
+            genModel="resources/ecore/sew.genmodel"/>
+   </extension>
+
+</plugin>
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/pom.xml b/editor/sew/org.eclipse.efm.sew.ecore/pom.xml
new file mode 100644
index 0000000..f690731
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.sew</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.sew.ecore</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.sew.ecore</name>
+	<description>This plug-in contains the Symbex Workflow's Xtext based editor ECORE model.</description>
+</project>
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/resources/ecore/sew.aird b/editor/sew/org.eclipse.efm.sew.ecore/resources/ecore/sew.aird
new file mode 100644
index 0000000..15c8c17
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/resources/ecore/sew.aird
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<viewpoint:DAnalysis xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style" xmi:id="_ebHsUOtREeWrjOO9KgllWw" selectedViews="_fWyDUOtREeWrjOO9KgllWw _fXTAsOtREeWrjOO9KgllWw _fXYgQOtREeWrjOO9KgllWw" version="10.1.0.201509162000">
+  <semanticResources>sew.ecore</semanticResources>
+  <semanticResources>sew.genmodel</semanticResources>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_fWyDUOtREeWrjOO9KgllWw">
+    <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Review']"/>
+  </ownedViews>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_fXTAsOtREeWrjOO9KgllWw">
+    <ownedRepresentations xmi:type="diagram:DSemanticDiagram" xmi:id="_fgfY8OtREeWrjOO9KgllWw" name="sew">
+      <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_fgfY8etREeWrjOO9KgllWw" source="DANNOTATION_CUSTOMIZATION_KEY">
+        <data xmi:type="diagram:ComputedStyleDescriptionRegistry" xmi:id="_fgfY8utREeWrjOO9KgllWw"/>
+      </ownedAnnotationEntries>
+      <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_fkehEOtREeWrjOO9KgllWw" source="GMF_DIAGRAMS">
+        <data xmi:type="notation:Diagram" xmi:id="_fkehEetREeWrjOO9KgllWw" type="Sirius" element="_fgfY8OtREeWrjOO9KgllWw" measurementUnit="Pixel">
+          <children xmi:type="notation:Node" xmi:id="_fk5-4OtREeWrjOO9KgllWw" type="2001" element="_fgfY8-tREeWrjOO9KgllWw">
+            <children xmi:type="notation:Node" xmi:id="_fmUUIOtREeWrjOO9KgllWw" type="5002">
+              <layoutConstraint xmi:type="notation:Location" xmi:id="_fmUUIetREeWrjOO9KgllWw" y="5"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_fupJsOtREeWrjOO9KgllWw" type="3005" element="_fgfY9OtREeWrjOO9KgllWw">
+              <styles xmi:type="notation:ShapeStyle" xmi:id="_fupJsetREeWrjOO9KgllWw" fontName="Segoe UI"/>
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fupJsutREeWrjOO9KgllWw"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_fk5-4etREeWrjOO9KgllWw" fontName="Segoe UI" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fk5-4utREeWrjOO9KgllWw" width="640" height="85"/>
+          </children>
+          <styles xmi:type="notation:DiagramStyle" xmi:id="_fkehEutREeWrjOO9KgllWw"/>
+        </data>
+      </ownedAnnotationEntries>
+      <ownedDiagramElements xmi:type="diagram:DNode" xmi:id="_fgfY8-tREeWrjOO9KgllWw" width="-1" height="-1">
+        <target xmi:type="ecore:EPackage" href="sew.ecore#/"/>
+        <semanticElements xmi:type="ecore:EPackage" href="sew.ecore#/"/>
+        <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_fgfY9OtREeWrjOO9KgllWw" showIcon="false" labelPosition="node" workspacePath="/org.eclipse.emf.ecoretools.design/icons/full/back/empty.svg">
+          <description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']/@style"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']"/>
+      </ownedDiagramElements>
+      <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
+      <filterVariableHistory xmi:type="diagram:FilterVariableHistory" xmi:id="_fgfY9etREeWrjOO9KgllWw"/>
+      <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
+      <activatedLayers xmi:type="description_1:AdditionalLayer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@additionalLayers[name='Package']"/>
+      <activatedLayers xmi:type="description_1:AdditionalLayer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@additionalLayers[name='Validation']"/>
+      <activatedLayers xmi:type="description_1:AdditionalLayer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Archetype']/@ownedRepresentationExtensions[name='Entities%20With%20Archetypes']/@layers[name='Archetypes']"/>
+      <target xmi:type="ecore:EPackage" href="sew.ecore#/"/>
+    </ownedRepresentations>
+    <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
+  </ownedViews>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_fXYgQOtREeWrjOO9KgllWw">
+    <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Archetype']"/>
+  </ownedViews>
+</viewpoint:DAnalysis>
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/resources/ecore/sew.ecore b/editor/sew/org.eclipse.efm.sew.ecore/resources/ecore/sew.ecore
new file mode 100644
index 0000000..8b562ff
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/resources/ecore/sew.ecore
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="sew" nsURI="http://www.eclipse.org/efm/SEW" nsPrefix="SEW">
+  <eAnnotations source="http://www.eclipse.org/OCL/Import">
+    <details key="ecore" value="http://www.eclipse.org/emf/2002/Ecore"/>
+  </eAnnotations>
+  <eClassifiers xsi:type="ecore:EClass" name="WNamedElement">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="SEWorkflow" eSuperTypes="#//WObject"/>
+  <eClassifiers xsi:type="ecore:EClass" name="WObject" eSuperTypes="#//WNamedElement">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="element" upperBound="-1"
+        eType="#//WNamedElement" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="WProperty" abstract="true" eSuperTypes="#//WNamedElement"/>
+  <eClassifiers xsi:type="ecore:EClass" name="WSection" eSuperTypes="#//WProperty">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="element" upperBound="-1"
+        eType="#//WNamedElement" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="WAttribute" eSuperTypes="#//WProperty">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="#//WValueSpecification"
+        containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="WValueSpecification" abstract="true"/>
+  <eSubpackages name="expression" nsURI="http://www.eclipse.org/efm/SEW/Expression"
+      nsPrefix="Expression">
+    <eClassifiers xsi:type="ecore:EClass" name="Expression" eSuperTypes="#//WValueSpecification">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="operand" upperBound="-1"
+          eType="#//WValueSpecification" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralExpressionValue" eSuperTypes="#//WValueSpecification"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralArrayValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="values" upperBound="-1"
+          eType="#//WValueSpecification" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralIntegerValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong" defaultValueLiteral="0"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralBooleanValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralCharacterValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EChar" defaultValueLiteral="0"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralRationalValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="numerator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong" defaultValueLiteral="0"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="denominator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong" defaultValueLiteral="1"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralStringValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralNullValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralFloatValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralRealValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBigDecimal"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralReferenceValue" eSuperTypes="#//expression/LiteralExpressionValue">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="symbol" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralObjectReference" eSuperTypes="#//expression/LiteralReferenceValue">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="object" eType="#//WObject"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralThisInstance" eSuperTypes="#//expression/LiteralReferenceValue"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralSelfInstance" eSuperTypes="#//expression/LiteralReferenceValue"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralParentInstance" eSuperTypes="#//expression/LiteralReferenceValue"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralSuperInstance" eSuperTypes="#//expression/LiteralReferenceValue"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralSystemInstance" eSuperTypes="#//expression/LiteralReferenceValue"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralEnvInstance" eSuperTypes="#//expression/LiteralReferenceValue"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralTimeVariable" eSuperTypes="#//expression/LiteralReferenceValue"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralTimeDeltaVariable" eSuperTypes="#//expression/LiteralReferenceValue"/>
+  </eSubpackages>
+</ecore:EPackage>
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/resources/ecore/sew.genmodel b/editor/sew/org.eclipse.efm.sew.ecore/resources/ecore/sew.genmodel
new file mode 100644
index 0000000..2700256
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/resources/ecore/sew.genmodel
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2016 CEA LIST.&#xD;&#xA;&#xD;&#xA;All rights reserved. This program and the accompanying materials&#xD;&#xA;are made available under the terms of the Eclipse Public License v1.0&#xD;&#xA;which accompanies this distribution, and is available at&#xD;&#xA;http://www.eclipse.org/legal/epl-v10.html&#xD;&#xA;&#xD;&#xA;Contributors:&#xD;&#xA; Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr&#xD;&#xA;  - Initial API and Implementation"
+    modelDirectory="/org.eclipse.efm.sew.ecore/src-gen" editDirectory="/org.eclipse.efm.sew.ecore.edit/src-gen"
+    editorDirectory="/org.eclipse.efm.sew.ecore.editor/src-gen" modelPluginID="org.eclipse.efm.sew.ecore"
+    modelName="Sew" editorPluginClass="org.eclipse.efm.sew.ecore.presentation.SewEditorPlugin"
+    rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container" testsDirectory="/org.eclipse.efm.sew.ecore.tests/emf-gen"
+    testSuiteClass="org.eclipse.efm.sew.ecore.tests.SewAllTests" importerID="org.eclipse.emf.importer.ecore"
+    complianceLevel="8.0" copyrightFields="false" language="" classNamePattern=""
+    operationReflection="true" importOrganizing="true">
+  <foreignModel>sew.ecore</foreignModel>
+  <genPackages prefix="Sew" basePackage="org.eclipse.efm.ecore" disposableProviderFactory="true"
+      ecorePackage="sew.ecore#/">
+    <genClasses ecoreClass="sew.ecore#//WNamedElement">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//WNamedElement/name"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//WNamedElement/description"/>
+    </genClasses>
+    <genClasses ecoreClass="sew.ecore#//SEWorkflow"/>
+    <genClasses ecoreClass="sew.ecore#//WObject">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//WObject/type"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sew.ecore#//WObject/element"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="sew.ecore#//WProperty"/>
+    <genClasses ecoreClass="sew.ecore#//WSection">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sew.ecore#//WSection/element"/>
+    </genClasses>
+    <genClasses ecoreClass="sew.ecore#//WAttribute">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sew.ecore#//WAttribute/value"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="sew.ecore#//WValueSpecification"/>
+    <nestedGenPackages prefix="Expression" basePackage="org.eclipse.efm.ecore.sew"
+        disposableProviderFactory="true" ecorePackage="sew.ecore#//expression">
+      <genClasses ecoreClass="sew.ecore#//expression/Expression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/Expression/operator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sew.ecore#//expression/Expression/operand"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralExpressionValue"/>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralArrayValue">
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference sew.ecore#//expression/LiteralArrayValue/values"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralIntegerValue">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralIntegerValue/value"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralBooleanValue">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralBooleanValue/value"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralCharacterValue">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralCharacterValue/value"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralRationalValue">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralRationalValue/numerator"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralRationalValue/denominator"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralStringValue">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralStringValue/value"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralNullValue">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralNullValue/type"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralFloatValue">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralFloatValue/value"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralRealValue">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralRealValue/value"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralReferenceValue">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sew.ecore#//expression/LiteralReferenceValue/symbol"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralObjectReference">
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference sew.ecore#//expression/LiteralObjectReference/object"/>
+      </genClasses>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralThisInstance"/>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralSelfInstance"/>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralParentInstance"/>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralSuperInstance"/>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralSystemInstance"/>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralEnvInstance"/>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralTimeVariable"/>
+      <genClasses ecoreClass="sew.ecore#//expression/LiteralTimeDeltaVariable"/>
+    </nestedGenPackages>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/resources/text/description.txt b/editor/sew/org.eclipse.efm.sew.ecore/resources/text/description.txt
new file mode 100644
index 0000000..79dc71a
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/resources/text/description.txt
@@ -0,0 +1,28 @@
+Model Sew
+
+This model description is not a real EMF artifact. It was generated by the
+org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's
+code generator can be extended.
+This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+
+Package sew <http://www.eclipse.org/efm/SEW>
+
+  Class WNamedElement
+    Attribute name : EString
+    Attribute description : EString
+
+  Class SEWorkflow -> WObject
+
+  Class WObject -> WNamedElement
+    Attribute type : EString
+    Reference element : WNamedElement<<0..*>>
+
+  Class WProperty -> WNamedElement
+
+  Class WSection -> WProperty
+    Reference element : WNamedElement<<0..*>>
+
+  Class WAttribute -> WProperty
+    Reference value : WValueSpecification<<1..1>>
+
+  Class WValueSpecification
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/SEWorkflow.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/SEWorkflow.java
new file mode 100644
index 0000000..42232c3
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/SEWorkflow.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>SE Workflow</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.SewPackage#getSEWorkflow()
+ * @model
+ * @generated
+ */
+public interface SEWorkflow extends WObject {
+} // SEWorkflow
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/SewFactory.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/SewFactory.java
new file mode 100644
index 0000000..25d6967
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/SewFactory.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.sew.SewPackage
+ * @generated
+ */
+public interface SewFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	SewFactory eINSTANCE = org.eclipse.efm.ecore.sew.impl.SewFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>WNamed Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>WNamed Element</em>'.
+	 * @generated
+	 */
+	WNamedElement createWNamedElement();
+
+	/**
+	 * Returns a new object of class '<em>SE Workflow</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>SE Workflow</em>'.
+	 * @generated
+	 */
+	SEWorkflow createSEWorkflow();
+
+	/**
+	 * Returns a new object of class '<em>WObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>WObject</em>'.
+	 * @generated
+	 */
+	WObject createWObject();
+
+	/**
+	 * Returns a new object of class '<em>WSection</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>WSection</em>'.
+	 * @generated
+	 */
+	WSection createWSection();
+
+	/**
+	 * Returns a new object of class '<em>WAttribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>WAttribute</em>'.
+	 * @generated
+	 */
+	WAttribute createWAttribute();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	SewPackage getSewPackage();
+
+} //SewFactory
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/SewPackage.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/SewPackage.java
new file mode 100644
index 0000000..258f9d1
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/SewPackage.java
@@ -0,0 +1,708 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.sew.SewFactory
+ * @model kind="package"
+ *        annotation="http://www.eclipse.org/OCL/Import ecore='http://www.eclipse.org/emf/2002/Ecore'"
+ * @generated
+ */
+public interface SewPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "sew";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efm/SEW";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "SEW";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	SewPackage eINSTANCE = org.eclipse.efm.ecore.sew.impl.SewPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.impl.WNamedElementImpl <em>WNamed Element</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.impl.WNamedElementImpl
+	 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWNamedElement()
+	 * @generated
+	 */
+	int WNAMED_ELEMENT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WNAMED_ELEMENT__NAME = 0;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WNAMED_ELEMENT__DESCRIPTION = 1;
+
+	/**
+	 * The number of structural features of the '<em>WNamed Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WNAMED_ELEMENT_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>WNamed Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WNAMED_ELEMENT_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.impl.WObjectImpl <em>WObject</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.impl.WObjectImpl
+	 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWObject()
+	 * @generated
+	 */
+	int WOBJECT = 2;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WOBJECT__NAME = WNAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WOBJECT__DESCRIPTION = WNAMED_ELEMENT__DESCRIPTION;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WOBJECT__TYPE = WNAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Element</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WOBJECT__ELEMENT = WNAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>WObject</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WOBJECT_FEATURE_COUNT = WNAMED_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>WObject</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WOBJECT_OPERATION_COUNT = WNAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.impl.SEWorkflowImpl <em>SE Workflow</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.impl.SEWorkflowImpl
+	 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getSEWorkflow()
+	 * @generated
+	 */
+	int SE_WORKFLOW = 1;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SE_WORKFLOW__NAME = WOBJECT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SE_WORKFLOW__DESCRIPTION = WOBJECT__DESCRIPTION;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SE_WORKFLOW__TYPE = WOBJECT__TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Element</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SE_WORKFLOW__ELEMENT = WOBJECT__ELEMENT;
+
+	/**
+	 * The number of structural features of the '<em>SE Workflow</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SE_WORKFLOW_FEATURE_COUNT = WOBJECT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>SE Workflow</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SE_WORKFLOW_OPERATION_COUNT = WOBJECT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.impl.WPropertyImpl <em>WProperty</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.impl.WPropertyImpl
+	 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWProperty()
+	 * @generated
+	 */
+	int WPROPERTY = 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WPROPERTY__NAME = WNAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WPROPERTY__DESCRIPTION = WNAMED_ELEMENT__DESCRIPTION;
+
+	/**
+	 * The number of structural features of the '<em>WProperty</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WPROPERTY_FEATURE_COUNT = WNAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>WProperty</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WPROPERTY_OPERATION_COUNT = WNAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.impl.WSectionImpl <em>WSection</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.impl.WSectionImpl
+	 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWSection()
+	 * @generated
+	 */
+	int WSECTION = 4;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WSECTION__NAME = WPROPERTY__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WSECTION__DESCRIPTION = WPROPERTY__DESCRIPTION;
+
+	/**
+	 * The feature id for the '<em><b>Element</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WSECTION__ELEMENT = WPROPERTY_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>WSection</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WSECTION_FEATURE_COUNT = WPROPERTY_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>WSection</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WSECTION_OPERATION_COUNT = WPROPERTY_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.impl.WAttributeImpl <em>WAttribute</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.impl.WAttributeImpl
+	 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWAttribute()
+	 * @generated
+	 */
+	int WATTRIBUTE = 5;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WATTRIBUTE__NAME = WPROPERTY__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WATTRIBUTE__DESCRIPTION = WPROPERTY__DESCRIPTION;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WATTRIBUTE__VALUE = WPROPERTY_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>WAttribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WATTRIBUTE_FEATURE_COUNT = WPROPERTY_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>WAttribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WATTRIBUTE_OPERATION_COUNT = WPROPERTY_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.impl.WValueSpecificationImpl <em>WValue Specification</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.impl.WValueSpecificationImpl
+	 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWValueSpecification()
+	 * @generated
+	 */
+	int WVALUE_SPECIFICATION = 6;
+
+	/**
+	 * The number of structural features of the '<em>WValue Specification</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WVALUE_SPECIFICATION_FEATURE_COUNT = 0;
+
+	/**
+	 * The number of operations of the '<em>WValue Specification</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WVALUE_SPECIFICATION_OPERATION_COUNT = 0;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.WNamedElement <em>WNamed Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>WNamed Element</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WNamedElement
+	 * @generated
+	 */
+	EClass getWNamedElement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.WNamedElement#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WNamedElement#getName()
+	 * @see #getWNamedElement()
+	 * @generated
+	 */
+	EAttribute getWNamedElement_Name();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.WNamedElement#getDescription <em>Description</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Description</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WNamedElement#getDescription()
+	 * @see #getWNamedElement()
+	 * @generated
+	 */
+	EAttribute getWNamedElement_Description();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.SEWorkflow <em>SE Workflow</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>SE Workflow</em>'.
+	 * @see org.eclipse.efm.ecore.sew.SEWorkflow
+	 * @generated
+	 */
+	EClass getSEWorkflow();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.WObject <em>WObject</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>WObject</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WObject
+	 * @generated
+	 */
+	EClass getWObject();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.WObject#getType <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Type</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WObject#getType()
+	 * @see #getWObject()
+	 * @generated
+	 */
+	EAttribute getWObject_Type();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.sew.WObject#getElement <em>Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Element</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WObject#getElement()
+	 * @see #getWObject()
+	 * @generated
+	 */
+	EReference getWObject_Element();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.WProperty <em>WProperty</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>WProperty</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WProperty
+	 * @generated
+	 */
+	EClass getWProperty();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.WSection <em>WSection</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>WSection</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WSection
+	 * @generated
+	 */
+	EClass getWSection();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.sew.WSection#getElement <em>Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Element</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WSection#getElement()
+	 * @see #getWSection()
+	 * @generated
+	 */
+	EReference getWSection_Element();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.WAttribute <em>WAttribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>WAttribute</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WAttribute
+	 * @generated
+	 */
+	EClass getWAttribute();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.sew.WAttribute#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WAttribute#getValue()
+	 * @see #getWAttribute()
+	 * @generated
+	 */
+	EReference getWAttribute_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.WValueSpecification <em>WValue Specification</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>WValue Specification</em>'.
+	 * @see org.eclipse.efm.ecore.sew.WValueSpecification
+	 * @generated
+	 */
+	EClass getWValueSpecification();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	SewFactory getSewFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.impl.WNamedElementImpl <em>WNamed Element</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.impl.WNamedElementImpl
+		 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWNamedElement()
+		 * @generated
+		 */
+		EClass WNAMED_ELEMENT = eINSTANCE.getWNamedElement();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute WNAMED_ELEMENT__NAME = eINSTANCE.getWNamedElement_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute WNAMED_ELEMENT__DESCRIPTION = eINSTANCE.getWNamedElement_Description();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.impl.SEWorkflowImpl <em>SE Workflow</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.impl.SEWorkflowImpl
+		 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getSEWorkflow()
+		 * @generated
+		 */
+		EClass SE_WORKFLOW = eINSTANCE.getSEWorkflow();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.impl.WObjectImpl <em>WObject</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.impl.WObjectImpl
+		 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWObject()
+		 * @generated
+		 */
+		EClass WOBJECT = eINSTANCE.getWObject();
+
+		/**
+		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute WOBJECT__TYPE = eINSTANCE.getWObject_Type();
+
+		/**
+		 * The meta object literal for the '<em><b>Element</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference WOBJECT__ELEMENT = eINSTANCE.getWObject_Element();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.impl.WPropertyImpl <em>WProperty</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.impl.WPropertyImpl
+		 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWProperty()
+		 * @generated
+		 */
+		EClass WPROPERTY = eINSTANCE.getWProperty();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.impl.WSectionImpl <em>WSection</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.impl.WSectionImpl
+		 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWSection()
+		 * @generated
+		 */
+		EClass WSECTION = eINSTANCE.getWSection();
+
+		/**
+		 * The meta object literal for the '<em><b>Element</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference WSECTION__ELEMENT = eINSTANCE.getWSection_Element();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.impl.WAttributeImpl <em>WAttribute</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.impl.WAttributeImpl
+		 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWAttribute()
+		 * @generated
+		 */
+		EClass WATTRIBUTE = eINSTANCE.getWAttribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference WATTRIBUTE__VALUE = eINSTANCE.getWAttribute_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.impl.WValueSpecificationImpl <em>WValue Specification</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.impl.WValueSpecificationImpl
+		 * @see org.eclipse.efm.ecore.sew.impl.SewPackageImpl#getWValueSpecification()
+		 * @generated
+		 */
+		EClass WVALUE_SPECIFICATION = eINSTANCE.getWValueSpecification();
+
+	}
+
+} //SewPackage
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WAttribute.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WAttribute.java
new file mode 100644
index 0000000..9ae88e6
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WAttribute.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>WAttribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.WAttribute#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.SewPackage#getWAttribute()
+ * @model
+ * @generated
+ */
+public interface WAttribute extends WProperty {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' containment reference.
+	 * @see #setValue(WValueSpecification)
+	 * @see org.eclipse.efm.ecore.sew.SewPackage#getWAttribute_Value()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	WValueSpecification getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.WAttribute#getValue <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' containment reference.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(WValueSpecification value);
+
+} // WAttribute
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WNamedElement.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WNamedElement.java
new file mode 100644
index 0000000..cd9765d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WNamedElement.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>WNamed Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.WNamedElement#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.sew.WNamedElement#getDescription <em>Description</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.SewPackage#getWNamedElement()
+ * @model
+ * @generated
+ */
+public interface WNamedElement extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.efm.ecore.sew.SewPackage#getWNamedElement_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.WNamedElement#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Description</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Description</em>' attribute.
+	 * @see #setDescription(String)
+	 * @see org.eclipse.efm.ecore.sew.SewPackage#getWNamedElement_Description()
+	 * @model
+	 * @generated
+	 */
+	String getDescription();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.WNamedElement#getDescription <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Description</em>' attribute.
+	 * @see #getDescription()
+	 * @generated
+	 */
+	void setDescription(String value);
+
+} // WNamedElement
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WObject.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WObject.java
new file mode 100644
index 0000000..475b9e5
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WObject.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>WObject</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.WObject#getType <em>Type</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.sew.WObject#getElement <em>Element</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.SewPackage#getWObject()
+ * @model
+ * @generated
+ */
+public interface WObject extends WNamedElement {
+	/**
+	 * Returns the value of the '<em><b>Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Type</em>' attribute.
+	 * @see #setType(String)
+	 * @see org.eclipse.efm.ecore.sew.SewPackage#getWObject_Type()
+	 * @model
+	 * @generated
+	 */
+	String getType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.WObject#getType <em>Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Type</em>' attribute.
+	 * @see #getType()
+	 * @generated
+	 */
+	void setType(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Element</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.sew.WNamedElement}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Element</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Element</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.sew.SewPackage#getWObject_Element()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<WNamedElement> getElement();
+
+} // WObject
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WProperty.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WProperty.java
new file mode 100644
index 0000000..1d3fb75
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WProperty.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>WProperty</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.SewPackage#getWProperty()
+ * @model abstract="true"
+ * @generated
+ */
+public interface WProperty extends WNamedElement {
+} // WProperty
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WSection.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WSection.java
new file mode 100644
index 0000000..96464f4
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WSection.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>WSection</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.WSection#getElement <em>Element</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.SewPackage#getWSection()
+ * @model
+ * @generated
+ */
+public interface WSection extends WProperty {
+	/**
+	 * Returns the value of the '<em><b>Element</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.sew.WNamedElement}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Element</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Element</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.sew.SewPackage#getWSection_Element()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<WNamedElement> getElement();
+
+} // WSection
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WValueSpecification.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WValueSpecification.java
new file mode 100644
index 0000000..1ee07da
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/WValueSpecification.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>WValue Specification</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.SewPackage#getWValueSpecification()
+ * @model abstract="true"
+ * @generated
+ */
+public interface WValueSpecification extends EObject {
+} // WValueSpecification
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/Expression.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/Expression.java
new file mode 100644
index 0000000..991d012
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/Expression.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.Expression#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.Expression#getOperand <em>Operand</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getExpression()
+ * @model
+ * @generated
+ */
+public interface Expression extends WValueSpecification {
+	/**
+	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operator</em>' attribute.
+	 * @see #setOperator(String)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getExpression_Operator()
+	 * @model
+	 * @generated
+	 */
+	String getOperator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.Expression#getOperator <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operator</em>' attribute.
+	 * @see #getOperator()
+	 * @generated
+	 */
+	void setOperator(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Operand</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.sew.WValueSpecification}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operand</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operand</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getExpression_Operand()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<WValueSpecification> getOperand();
+
+} // Expression
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/ExpressionFactory.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/ExpressionFactory.java
new file mode 100644
index 0000000..9bbd3e9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/ExpressionFactory.java
@@ -0,0 +1,232 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage
+ * @generated
+ */
+public interface ExpressionFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	ExpressionFactory eINSTANCE = org.eclipse.efm.ecore.sew.expression.impl.ExpressionFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Expression</em>'.
+	 * @generated
+	 */
+	Expression createExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Expression Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Expression Value</em>'.
+	 * @generated
+	 */
+	LiteralExpressionValue createLiteralExpressionValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Array Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Array Value</em>'.
+	 * @generated
+	 */
+	LiteralArrayValue createLiteralArrayValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Integer Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Integer Value</em>'.
+	 * @generated
+	 */
+	LiteralIntegerValue createLiteralIntegerValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Boolean Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Boolean Value</em>'.
+	 * @generated
+	 */
+	LiteralBooleanValue createLiteralBooleanValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Character Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Character Value</em>'.
+	 * @generated
+	 */
+	LiteralCharacterValue createLiteralCharacterValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Rational Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Rational Value</em>'.
+	 * @generated
+	 */
+	LiteralRationalValue createLiteralRationalValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal String Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal String Value</em>'.
+	 * @generated
+	 */
+	LiteralStringValue createLiteralStringValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Null Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Null Value</em>'.
+	 * @generated
+	 */
+	LiteralNullValue createLiteralNullValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Float Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Float Value</em>'.
+	 * @generated
+	 */
+	LiteralFloatValue createLiteralFloatValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Real Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Real Value</em>'.
+	 * @generated
+	 */
+	LiteralRealValue createLiteralRealValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Reference Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Reference Value</em>'.
+	 * @generated
+	 */
+	LiteralReferenceValue createLiteralReferenceValue();
+
+	/**
+	 * Returns a new object of class '<em>Literal Object Reference</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Object Reference</em>'.
+	 * @generated
+	 */
+	LiteralObjectReference createLiteralObjectReference();
+
+	/**
+	 * Returns a new object of class '<em>Literal This Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal This Instance</em>'.
+	 * @generated
+	 */
+	LiteralThisInstance createLiteralThisInstance();
+
+	/**
+	 * Returns a new object of class '<em>Literal Self Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Self Instance</em>'.
+	 * @generated
+	 */
+	LiteralSelfInstance createLiteralSelfInstance();
+
+	/**
+	 * Returns a new object of class '<em>Literal Parent Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Parent Instance</em>'.
+	 * @generated
+	 */
+	LiteralParentInstance createLiteralParentInstance();
+
+	/**
+	 * Returns a new object of class '<em>Literal Super Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Super Instance</em>'.
+	 * @generated
+	 */
+	LiteralSuperInstance createLiteralSuperInstance();
+
+	/**
+	 * Returns a new object of class '<em>Literal System Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal System Instance</em>'.
+	 * @generated
+	 */
+	LiteralSystemInstance createLiteralSystemInstance();
+
+	/**
+	 * Returns a new object of class '<em>Literal Env Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Env Instance</em>'.
+	 * @generated
+	 */
+	LiteralEnvInstance createLiteralEnvInstance();
+
+	/**
+	 * Returns a new object of class '<em>Literal Time Variable</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Time Variable</em>'.
+	 * @generated
+	 */
+	LiteralTimeVariable createLiteralTimeVariable();
+
+	/**
+	 * Returns a new object of class '<em>Literal Time Delta Variable</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Time Delta Variable</em>'.
+	 * @generated
+	 */
+	LiteralTimeDeltaVariable createLiteralTimeDeltaVariable();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	ExpressionPackage getExpressionPackage();
+
+} //ExpressionFactory
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/ExpressionPackage.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/ExpressionPackage.java
new file mode 100644
index 0000000..3b6490d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/ExpressionPackage.java
@@ -0,0 +1,1578 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+import org.eclipse.efm.ecore.sew.SewPackage;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface ExpressionPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "expression";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efm/SEW/Expression";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "Expression";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	ExpressionPackage eINSTANCE = org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.ExpressionImpl <em>Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getExpression()
+	 * @generated
+	 */
+	int EXPRESSION = 0;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION__OPERATOR = SewPackage.WVALUE_SPECIFICATION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION__OPERAND = SewPackage.WVALUE_SPECIFICATION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_FEATURE_COUNT = SewPackage.WVALUE_SPECIFICATION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_OPERATION_COUNT = SewPackage.WVALUE_SPECIFICATION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralExpressionValueImpl <em>Literal Expression Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralExpressionValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralExpressionValue()
+	 * @generated
+	 */
+	int LITERAL_EXPRESSION_VALUE = 1;
+
+	/**
+	 * The number of structural features of the '<em>Literal Expression Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_EXPRESSION_VALUE_FEATURE_COUNT = SewPackage.WVALUE_SPECIFICATION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Expression Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_EXPRESSION_VALUE_OPERATION_COUNT = SewPackage.WVALUE_SPECIFICATION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralArrayValueImpl <em>Literal Array Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralArrayValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralArrayValue()
+	 * @generated
+	 */
+	int LITERAL_ARRAY_VALUE = 2;
+
+	/**
+	 * The feature id for the '<em><b>Values</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_ARRAY_VALUE__VALUES = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Array Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_ARRAY_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Array Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_ARRAY_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralIntegerValueImpl <em>Literal Integer Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralIntegerValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralIntegerValue()
+	 * @generated
+	 */
+	int LITERAL_INTEGER_VALUE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_INTEGER_VALUE__VALUE = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Integer Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_INTEGER_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Integer Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_INTEGER_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralBooleanValueImpl <em>Literal Boolean Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralBooleanValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralBooleanValue()
+	 * @generated
+	 */
+	int LITERAL_BOOLEAN_VALUE = 4;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_BOOLEAN_VALUE__VALUE = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Boolean Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_BOOLEAN_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Boolean Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_BOOLEAN_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralCharacterValueImpl <em>Literal Character Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralCharacterValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralCharacterValue()
+	 * @generated
+	 */
+	int LITERAL_CHARACTER_VALUE = 5;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_CHARACTER_VALUE__VALUE = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Character Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_CHARACTER_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Character Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_CHARACTER_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralRationalValueImpl <em>Literal Rational Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralRationalValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralRationalValue()
+	 * @generated
+	 */
+	int LITERAL_RATIONAL_VALUE = 6;
+
+	/**
+	 * The feature id for the '<em><b>Numerator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_RATIONAL_VALUE__NUMERATOR = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Denominator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_RATIONAL_VALUE__DENOMINATOR = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Literal Rational Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_RATIONAL_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Literal Rational Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_RATIONAL_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralStringValueImpl <em>Literal String Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralStringValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralStringValue()
+	 * @generated
+	 */
+	int LITERAL_STRING_VALUE = 7;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_STRING_VALUE__VALUE = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal String Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_STRING_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal String Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_STRING_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralNullValueImpl <em>Literal Null Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralNullValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralNullValue()
+	 * @generated
+	 */
+	int LITERAL_NULL_VALUE = 8;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_NULL_VALUE__TYPE = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Null Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_NULL_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Null Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_NULL_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralFloatValueImpl <em>Literal Float Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralFloatValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralFloatValue()
+	 * @generated
+	 */
+	int LITERAL_FLOAT_VALUE = 9;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_FLOAT_VALUE__VALUE = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Float Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_FLOAT_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Float Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_FLOAT_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralRealValueImpl <em>Literal Real Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralRealValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralRealValue()
+	 * @generated
+	 */
+	int LITERAL_REAL_VALUE = 10;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REAL_VALUE__VALUE = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Real Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REAL_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Real Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REAL_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralReferenceValueImpl <em>Literal Reference Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralReferenceValueImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralReferenceValue()
+	 * @generated
+	 */
+	int LITERAL_REFERENCE_VALUE = 11;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_VALUE__SYMBOL = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Reference Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_VALUE_FEATURE_COUNT = LITERAL_EXPRESSION_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Reference Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_VALUE_OPERATION_COUNT = LITERAL_EXPRESSION_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralObjectReferenceImpl <em>Literal Object Reference</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralObjectReferenceImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralObjectReference()
+	 * @generated
+	 */
+	int LITERAL_OBJECT_REFERENCE = 12;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_OBJECT_REFERENCE__SYMBOL = LITERAL_REFERENCE_VALUE__SYMBOL;
+
+	/**
+	 * The feature id for the '<em><b>Object</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_OBJECT_REFERENCE__OBJECT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Object Reference</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_OBJECT_REFERENCE_FEATURE_COUNT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Object Reference</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_OBJECT_REFERENCE_OPERATION_COUNT = LITERAL_REFERENCE_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralThisInstanceImpl <em>Literal This Instance</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralThisInstanceImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralThisInstance()
+	 * @generated
+	 */
+	int LITERAL_THIS_INSTANCE = 13;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_THIS_INSTANCE__SYMBOL = LITERAL_REFERENCE_VALUE__SYMBOL;
+
+	/**
+	 * The number of structural features of the '<em>Literal This Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_THIS_INSTANCE_FEATURE_COUNT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal This Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_THIS_INSTANCE_OPERATION_COUNT = LITERAL_REFERENCE_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralSelfInstanceImpl <em>Literal Self Instance</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralSelfInstanceImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralSelfInstance()
+	 * @generated
+	 */
+	int LITERAL_SELF_INSTANCE = 14;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SELF_INSTANCE__SYMBOL = LITERAL_REFERENCE_VALUE__SYMBOL;
+
+	/**
+	 * The number of structural features of the '<em>Literal Self Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SELF_INSTANCE_FEATURE_COUNT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Self Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SELF_INSTANCE_OPERATION_COUNT = LITERAL_REFERENCE_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralParentInstanceImpl <em>Literal Parent Instance</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralParentInstanceImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralParentInstance()
+	 * @generated
+	 */
+	int LITERAL_PARENT_INSTANCE = 15;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_PARENT_INSTANCE__SYMBOL = LITERAL_REFERENCE_VALUE__SYMBOL;
+
+	/**
+	 * The number of structural features of the '<em>Literal Parent Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_PARENT_INSTANCE_FEATURE_COUNT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Parent Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_PARENT_INSTANCE_OPERATION_COUNT = LITERAL_REFERENCE_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralSuperInstanceImpl <em>Literal Super Instance</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralSuperInstanceImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralSuperInstance()
+	 * @generated
+	 */
+	int LITERAL_SUPER_INSTANCE = 16;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SUPER_INSTANCE__SYMBOL = LITERAL_REFERENCE_VALUE__SYMBOL;
+
+	/**
+	 * The number of structural features of the '<em>Literal Super Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SUPER_INSTANCE_FEATURE_COUNT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Super Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SUPER_INSTANCE_OPERATION_COUNT = LITERAL_REFERENCE_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralSystemInstanceImpl <em>Literal System Instance</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralSystemInstanceImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralSystemInstance()
+	 * @generated
+	 */
+	int LITERAL_SYSTEM_INSTANCE = 17;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SYSTEM_INSTANCE__SYMBOL = LITERAL_REFERENCE_VALUE__SYMBOL;
+
+	/**
+	 * The number of structural features of the '<em>Literal System Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SYSTEM_INSTANCE_FEATURE_COUNT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal System Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SYSTEM_INSTANCE_OPERATION_COUNT = LITERAL_REFERENCE_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralEnvInstanceImpl <em>Literal Env Instance</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralEnvInstanceImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralEnvInstance()
+	 * @generated
+	 */
+	int LITERAL_ENV_INSTANCE = 18;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_ENV_INSTANCE__SYMBOL = LITERAL_REFERENCE_VALUE__SYMBOL;
+
+	/**
+	 * The number of structural features of the '<em>Literal Env Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_ENV_INSTANCE_FEATURE_COUNT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Env Instance</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_ENV_INSTANCE_OPERATION_COUNT = LITERAL_REFERENCE_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralTimeVariableImpl <em>Literal Time Variable</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralTimeVariableImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralTimeVariable()
+	 * @generated
+	 */
+	int LITERAL_TIME_VARIABLE = 19;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_VARIABLE__SYMBOL = LITERAL_REFERENCE_VALUE__SYMBOL;
+
+	/**
+	 * The number of structural features of the '<em>Literal Time Variable</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_VARIABLE_FEATURE_COUNT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Time Variable</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_VARIABLE_OPERATION_COUNT = LITERAL_REFERENCE_VALUE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralTimeDeltaVariableImpl <em>Literal Time Delta Variable</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralTimeDeltaVariableImpl
+	 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralTimeDeltaVariable()
+	 * @generated
+	 */
+	int LITERAL_TIME_DELTA_VARIABLE = 20;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_DELTA_VARIABLE__SYMBOL = LITERAL_REFERENCE_VALUE__SYMBOL;
+
+	/**
+	 * The number of structural features of the '<em>Literal Time Delta Variable</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_DELTA_VARIABLE_FEATURE_COUNT = LITERAL_REFERENCE_VALUE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Time Delta Variable</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_DELTA_VARIABLE_OPERATION_COUNT = LITERAL_REFERENCE_VALUE_OPERATION_COUNT + 0;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.Expression <em>Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Expression</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.Expression
+	 * @generated
+	 */
+	EClass getExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.Expression#getOperator <em>Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.Expression#getOperator()
+	 * @see #getExpression()
+	 * @generated
+	 */
+	EAttribute getExpression_Operator();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.sew.expression.Expression#getOperand <em>Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Operand</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.Expression#getOperand()
+	 * @see #getExpression()
+	 * @generated
+	 */
+	EReference getExpression_Operand();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralExpressionValue <em>Literal Expression Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Expression Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralExpressionValue
+	 * @generated
+	 */
+	EClass getLiteralExpressionValue();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralArrayValue <em>Literal Array Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Array Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralArrayValue
+	 * @generated
+	 */
+	EClass getLiteralArrayValue();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.sew.expression.LiteralArrayValue#getValues <em>Values</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Values</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralArrayValue#getValues()
+	 * @see #getLiteralArrayValue()
+	 * @generated
+	 */
+	EReference getLiteralArrayValue_Values();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue <em>Literal Integer Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Integer Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue
+	 * @generated
+	 */
+	EClass getLiteralIntegerValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue#getValue()
+	 * @see #getLiteralIntegerValue()
+	 * @generated
+	 */
+	EAttribute getLiteralIntegerValue_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue <em>Literal Boolean Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Boolean Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue
+	 * @generated
+	 */
+	EClass getLiteralBooleanValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue#isValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue#isValue()
+	 * @see #getLiteralBooleanValue()
+	 * @generated
+	 */
+	EAttribute getLiteralBooleanValue_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue <em>Literal Character Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Character Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue
+	 * @generated
+	 */
+	EClass getLiteralCharacterValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue#getValue()
+	 * @see #getLiteralCharacterValue()
+	 * @generated
+	 */
+	EAttribute getLiteralCharacterValue_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralRationalValue <em>Literal Rational Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Rational Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralRationalValue
+	 * @generated
+	 */
+	EClass getLiteralRationalValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralRationalValue#getNumerator <em>Numerator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Numerator</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralRationalValue#getNumerator()
+	 * @see #getLiteralRationalValue()
+	 * @generated
+	 */
+	EAttribute getLiteralRationalValue_Numerator();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralRationalValue#getDenominator <em>Denominator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Denominator</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralRationalValue#getDenominator()
+	 * @see #getLiteralRationalValue()
+	 * @generated
+	 */
+	EAttribute getLiteralRationalValue_Denominator();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralStringValue <em>Literal String Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal String Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralStringValue
+	 * @generated
+	 */
+	EClass getLiteralStringValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralStringValue#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralStringValue#getValue()
+	 * @see #getLiteralStringValue()
+	 * @generated
+	 */
+	EAttribute getLiteralStringValue_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralNullValue <em>Literal Null Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Null Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralNullValue
+	 * @generated
+	 */
+	EClass getLiteralNullValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralNullValue#getType <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Type</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralNullValue#getType()
+	 * @see #getLiteralNullValue()
+	 * @generated
+	 */
+	EAttribute getLiteralNullValue_Type();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralFloatValue <em>Literal Float Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Float Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralFloatValue
+	 * @generated
+	 */
+	EClass getLiteralFloatValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralFloatValue#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralFloatValue#getValue()
+	 * @see #getLiteralFloatValue()
+	 * @generated
+	 */
+	EAttribute getLiteralFloatValue_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralRealValue <em>Literal Real Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Real Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralRealValue
+	 * @generated
+	 */
+	EClass getLiteralRealValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralRealValue#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralRealValue#getValue()
+	 * @see #getLiteralRealValue()
+	 * @generated
+	 */
+	EAttribute getLiteralRealValue_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue <em>Literal Reference Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Reference Value</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue
+	 * @generated
+	 */
+	EClass getLiteralReferenceValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue#getSymbol <em>Symbol</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Symbol</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue#getSymbol()
+	 * @see #getLiteralReferenceValue()
+	 * @generated
+	 */
+	EAttribute getLiteralReferenceValue_Symbol();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralObjectReference <em>Literal Object Reference</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Object Reference</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralObjectReference
+	 * @generated
+	 */
+	EClass getLiteralObjectReference();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.sew.expression.LiteralObjectReference#getObject <em>Object</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Object</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralObjectReference#getObject()
+	 * @see #getLiteralObjectReference()
+	 * @generated
+	 */
+	EReference getLiteralObjectReference_Object();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralThisInstance <em>Literal This Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal This Instance</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralThisInstance
+	 * @generated
+	 */
+	EClass getLiteralThisInstance();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralSelfInstance <em>Literal Self Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Self Instance</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralSelfInstance
+	 * @generated
+	 */
+	EClass getLiteralSelfInstance();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralParentInstance <em>Literal Parent Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Parent Instance</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralParentInstance
+	 * @generated
+	 */
+	EClass getLiteralParentInstance();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralSuperInstance <em>Literal Super Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Super Instance</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralSuperInstance
+	 * @generated
+	 */
+	EClass getLiteralSuperInstance();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralSystemInstance <em>Literal System Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal System Instance</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralSystemInstance
+	 * @generated
+	 */
+	EClass getLiteralSystemInstance();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralEnvInstance <em>Literal Env Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Env Instance</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralEnvInstance
+	 * @generated
+	 */
+	EClass getLiteralEnvInstance();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralTimeVariable <em>Literal Time Variable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Time Variable</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralTimeVariable
+	 * @generated
+	 */
+	EClass getLiteralTimeVariable();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.sew.expression.LiteralTimeDeltaVariable <em>Literal Time Delta Variable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Time Delta Variable</em>'.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralTimeDeltaVariable
+	 * @generated
+	 */
+	EClass getLiteralTimeDeltaVariable();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	ExpressionFactory getExpressionFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.ExpressionImpl <em>Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getExpression()
+		 * @generated
+		 */
+		EClass EXPRESSION = eINSTANCE.getExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute EXPRESSION__OPERATOR = eINSTANCE.getExpression_Operator();
+
+		/**
+		 * The meta object literal for the '<em><b>Operand</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXPRESSION__OPERAND = eINSTANCE.getExpression_Operand();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralExpressionValueImpl <em>Literal Expression Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralExpressionValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralExpressionValue()
+		 * @generated
+		 */
+		EClass LITERAL_EXPRESSION_VALUE = eINSTANCE.getLiteralExpressionValue();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralArrayValueImpl <em>Literal Array Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralArrayValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralArrayValue()
+		 * @generated
+		 */
+		EClass LITERAL_ARRAY_VALUE = eINSTANCE.getLiteralArrayValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Values</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference LITERAL_ARRAY_VALUE__VALUES = eINSTANCE.getLiteralArrayValue_Values();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralIntegerValueImpl <em>Literal Integer Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralIntegerValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralIntegerValue()
+		 * @generated
+		 */
+		EClass LITERAL_INTEGER_VALUE = eINSTANCE.getLiteralIntegerValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_INTEGER_VALUE__VALUE = eINSTANCE.getLiteralIntegerValue_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralBooleanValueImpl <em>Literal Boolean Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralBooleanValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralBooleanValue()
+		 * @generated
+		 */
+		EClass LITERAL_BOOLEAN_VALUE = eINSTANCE.getLiteralBooleanValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_BOOLEAN_VALUE__VALUE = eINSTANCE.getLiteralBooleanValue_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralCharacterValueImpl <em>Literal Character Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralCharacterValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralCharacterValue()
+		 * @generated
+		 */
+		EClass LITERAL_CHARACTER_VALUE = eINSTANCE.getLiteralCharacterValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_CHARACTER_VALUE__VALUE = eINSTANCE.getLiteralCharacterValue_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralRationalValueImpl <em>Literal Rational Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralRationalValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralRationalValue()
+		 * @generated
+		 */
+		EClass LITERAL_RATIONAL_VALUE = eINSTANCE.getLiteralRationalValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Numerator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_RATIONAL_VALUE__NUMERATOR = eINSTANCE.getLiteralRationalValue_Numerator();
+
+		/**
+		 * The meta object literal for the '<em><b>Denominator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_RATIONAL_VALUE__DENOMINATOR = eINSTANCE.getLiteralRationalValue_Denominator();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralStringValueImpl <em>Literal String Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralStringValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralStringValue()
+		 * @generated
+		 */
+		EClass LITERAL_STRING_VALUE = eINSTANCE.getLiteralStringValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_STRING_VALUE__VALUE = eINSTANCE.getLiteralStringValue_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralNullValueImpl <em>Literal Null Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralNullValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralNullValue()
+		 * @generated
+		 */
+		EClass LITERAL_NULL_VALUE = eINSTANCE.getLiteralNullValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_NULL_VALUE__TYPE = eINSTANCE.getLiteralNullValue_Type();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralFloatValueImpl <em>Literal Float Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralFloatValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralFloatValue()
+		 * @generated
+		 */
+		EClass LITERAL_FLOAT_VALUE = eINSTANCE.getLiteralFloatValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_FLOAT_VALUE__VALUE = eINSTANCE.getLiteralFloatValue_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralRealValueImpl <em>Literal Real Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralRealValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralRealValue()
+		 * @generated
+		 */
+		EClass LITERAL_REAL_VALUE = eINSTANCE.getLiteralRealValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_REAL_VALUE__VALUE = eINSTANCE.getLiteralRealValue_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralReferenceValueImpl <em>Literal Reference Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralReferenceValueImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralReferenceValue()
+		 * @generated
+		 */
+		EClass LITERAL_REFERENCE_VALUE = eINSTANCE.getLiteralReferenceValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Symbol</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_REFERENCE_VALUE__SYMBOL = eINSTANCE.getLiteralReferenceValue_Symbol();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralObjectReferenceImpl <em>Literal Object Reference</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralObjectReferenceImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralObjectReference()
+		 * @generated
+		 */
+		EClass LITERAL_OBJECT_REFERENCE = eINSTANCE.getLiteralObjectReference();
+
+		/**
+		 * The meta object literal for the '<em><b>Object</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference LITERAL_OBJECT_REFERENCE__OBJECT = eINSTANCE.getLiteralObjectReference_Object();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralThisInstanceImpl <em>Literal This Instance</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralThisInstanceImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralThisInstance()
+		 * @generated
+		 */
+		EClass LITERAL_THIS_INSTANCE = eINSTANCE.getLiteralThisInstance();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralSelfInstanceImpl <em>Literal Self Instance</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralSelfInstanceImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralSelfInstance()
+		 * @generated
+		 */
+		EClass LITERAL_SELF_INSTANCE = eINSTANCE.getLiteralSelfInstance();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralParentInstanceImpl <em>Literal Parent Instance</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralParentInstanceImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralParentInstance()
+		 * @generated
+		 */
+		EClass LITERAL_PARENT_INSTANCE = eINSTANCE.getLiteralParentInstance();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralSuperInstanceImpl <em>Literal Super Instance</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralSuperInstanceImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralSuperInstance()
+		 * @generated
+		 */
+		EClass LITERAL_SUPER_INSTANCE = eINSTANCE.getLiteralSuperInstance();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralSystemInstanceImpl <em>Literal System Instance</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralSystemInstanceImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralSystemInstance()
+		 * @generated
+		 */
+		EClass LITERAL_SYSTEM_INSTANCE = eINSTANCE.getLiteralSystemInstance();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralEnvInstanceImpl <em>Literal Env Instance</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralEnvInstanceImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralEnvInstance()
+		 * @generated
+		 */
+		EClass LITERAL_ENV_INSTANCE = eINSTANCE.getLiteralEnvInstance();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralTimeVariableImpl <em>Literal Time Variable</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralTimeVariableImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralTimeVariable()
+		 * @generated
+		 */
+		EClass LITERAL_TIME_VARIABLE = eINSTANCE.getLiteralTimeVariable();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralTimeDeltaVariableImpl <em>Literal Time Delta Variable</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.LiteralTimeDeltaVariableImpl
+		 * @see org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl#getLiteralTimeDeltaVariable()
+		 * @generated
+		 */
+		EClass LITERAL_TIME_DELTA_VARIABLE = eINSTANCE.getLiteralTimeDeltaVariable();
+
+	}
+
+} //ExpressionPackage
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralArrayValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralArrayValue.java
new file mode 100644
index 0000000..091cdb9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralArrayValue.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Array Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralArrayValue#getValues <em>Values</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralArrayValue()
+ * @model
+ * @generated
+ */
+public interface LiteralArrayValue extends LiteralExpressionValue {
+	/**
+	 * Returns the value of the '<em><b>Values</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.sew.WValueSpecification}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Values</em>' reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Values</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralArrayValue_Values()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<WValueSpecification> getValues();
+
+} // LiteralArrayValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralBooleanValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralBooleanValue.java
new file mode 100644
index 0000000..315440c
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralBooleanValue.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Boolean Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue#isValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralBooleanValue()
+ * @model
+ * @generated
+ */
+public interface LiteralBooleanValue extends LiteralExpressionValue {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(boolean)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralBooleanValue_Value()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue#isValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #isValue()
+	 * @generated
+	 */
+	void setValue(boolean value);
+
+} // LiteralBooleanValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralCharacterValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralCharacterValue.java
new file mode 100644
index 0000000..ad4563c
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralCharacterValue.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Character Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralCharacterValue()
+ * @model
+ * @generated
+ */
+public interface LiteralCharacterValue extends LiteralExpressionValue {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * The default value is <code>"0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(char)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralCharacterValue_Value()
+	 * @model default="0" required="true"
+	 * @generated
+	 */
+	char getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(char value);
+
+} // LiteralCharacterValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralEnvInstance.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralEnvInstance.java
new file mode 100644
index 0000000..c612ff1
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralEnvInstance.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Env Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralEnvInstance()
+ * @model
+ * @generated
+ */
+public interface LiteralEnvInstance extends LiteralReferenceValue {
+} // LiteralEnvInstance
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralExpressionValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralExpressionValue.java
new file mode 100644
index 0000000..01e8c07
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralExpressionValue.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Expression Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralExpressionValue()
+ * @model
+ * @generated
+ */
+public interface LiteralExpressionValue extends WValueSpecification {
+} // LiteralExpressionValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralFloatValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralFloatValue.java
new file mode 100644
index 0000000..5cd0fa8
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralFloatValue.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Float Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralFloatValue#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralFloatValue()
+ * @model
+ * @generated
+ */
+public interface LiteralFloatValue extends LiteralExpressionValue {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(double)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralFloatValue_Value()
+	 * @model required="true"
+	 * @generated
+	 */
+	double getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralFloatValue#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(double value);
+
+} // LiteralFloatValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralIntegerValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralIntegerValue.java
new file mode 100644
index 0000000..7ef7c6b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralIntegerValue.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Integer Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralIntegerValue()
+ * @model
+ * @generated
+ */
+public interface LiteralIntegerValue extends LiteralExpressionValue {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * The default value is <code>"0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(long)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralIntegerValue_Value()
+	 * @model default="0" required="true"
+	 * @generated
+	 */
+	long getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(long value);
+
+} // LiteralIntegerValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralNullValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralNullValue.java
new file mode 100644
index 0000000..42f0c86
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralNullValue.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Null Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralNullValue#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralNullValue()
+ * @model
+ * @generated
+ */
+public interface LiteralNullValue extends LiteralExpressionValue {
+	/**
+	 * Returns the value of the '<em><b>Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Type</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Type</em>' attribute.
+	 * @see #setType(String)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralNullValue_Type()
+	 * @model
+	 * @generated
+	 */
+	String getType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralNullValue#getType <em>Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Type</em>' attribute.
+	 * @see #getType()
+	 * @generated
+	 */
+	void setType(String value);
+
+} // LiteralNullValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralObjectReference.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralObjectReference.java
new file mode 100644
index 0000000..421d27a
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralObjectReference.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+import org.eclipse.efm.ecore.sew.WObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Object Reference</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralObjectReference#getObject <em>Object</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralObjectReference()
+ * @model
+ * @generated
+ */
+public interface LiteralObjectReference extends LiteralReferenceValue {
+	/**
+	 * Returns the value of the '<em><b>Object</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Object</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Object</em>' reference.
+	 * @see #setObject(WObject)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralObjectReference_Object()
+	 * @model
+	 * @generated
+	 */
+	WObject getObject();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralObjectReference#getObject <em>Object</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Object</em>' reference.
+	 * @see #getObject()
+	 * @generated
+	 */
+	void setObject(WObject value);
+
+} // LiteralObjectReference
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralParentInstance.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralParentInstance.java
new file mode 100644
index 0000000..da8e1cb
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralParentInstance.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Parent Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralParentInstance()
+ * @model
+ * @generated
+ */
+public interface LiteralParentInstance extends LiteralReferenceValue {
+} // LiteralParentInstance
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralRationalValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralRationalValue.java
new file mode 100644
index 0000000..3a1c651
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralRationalValue.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Rational Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralRationalValue#getNumerator <em>Numerator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralRationalValue#getDenominator <em>Denominator</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralRationalValue()
+ * @model
+ * @generated
+ */
+public interface LiteralRationalValue extends LiteralExpressionValue {
+	/**
+	 * Returns the value of the '<em><b>Numerator</b></em>' attribute.
+	 * The default value is <code>"0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Numerator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Numerator</em>' attribute.
+	 * @see #setNumerator(long)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralRationalValue_Numerator()
+	 * @model default="0" required="true"
+	 * @generated
+	 */
+	long getNumerator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralRationalValue#getNumerator <em>Numerator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Numerator</em>' attribute.
+	 * @see #getNumerator()
+	 * @generated
+	 */
+	void setNumerator(long value);
+
+	/**
+	 * Returns the value of the '<em><b>Denominator</b></em>' attribute.
+	 * The default value is <code>"1"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Denominator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Denominator</em>' attribute.
+	 * @see #setDenominator(long)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralRationalValue_Denominator()
+	 * @model default="1" required="true"
+	 * @generated
+	 */
+	long getDenominator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralRationalValue#getDenominator <em>Denominator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Denominator</em>' attribute.
+	 * @see #getDenominator()
+	 * @generated
+	 */
+	void setDenominator(long value);
+
+} // LiteralRationalValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralRealValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralRealValue.java
new file mode 100644
index 0000000..6fde8d1
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralRealValue.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+import java.math.BigDecimal;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Real Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralRealValue#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralRealValue()
+ * @model
+ * @generated
+ */
+public interface LiteralRealValue extends LiteralExpressionValue {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(BigDecimal)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralRealValue_Value()
+	 * @model required="true"
+	 * @generated
+	 */
+	BigDecimal getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralRealValue#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(BigDecimal value);
+
+} // LiteralRealValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralReferenceValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralReferenceValue.java
new file mode 100644
index 0000000..1defa17
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralReferenceValue.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Reference Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue#getSymbol <em>Symbol</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralReferenceValue()
+ * @model
+ * @generated
+ */
+public interface LiteralReferenceValue extends LiteralExpressionValue {
+
+	/**
+	 * Returns the value of the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Symbol</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Symbol</em>' attribute.
+	 * @see #setSymbol(String)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralReferenceValue_Symbol()
+	 * @model
+	 * @generated
+	 */
+	String getSymbol();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue#getSymbol <em>Symbol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Symbol</em>' attribute.
+	 * @see #getSymbol()
+	 * @generated
+	 */
+	void setSymbol(String value);
+} // LiteralReferenceValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralSelfInstance.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralSelfInstance.java
new file mode 100644
index 0000000..40fcb7b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralSelfInstance.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Self Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralSelfInstance()
+ * @model
+ * @generated
+ */
+public interface LiteralSelfInstance extends LiteralReferenceValue {
+} // LiteralSelfInstance
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralStringValue.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralStringValue.java
new file mode 100644
index 0000000..4c3b19e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralStringValue.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal String Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.LiteralStringValue#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralStringValue()
+ * @model
+ * @generated
+ */
+public interface LiteralStringValue extends LiteralExpressionValue {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(String)
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralStringValue_Value()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.sew.expression.LiteralStringValue#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(String value);
+
+} // LiteralStringValue
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralSuperInstance.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralSuperInstance.java
new file mode 100644
index 0000000..34f1d8f
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralSuperInstance.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Super Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralSuperInstance()
+ * @model
+ * @generated
+ */
+public interface LiteralSuperInstance extends LiteralReferenceValue {
+} // LiteralSuperInstance
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralSystemInstance.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralSystemInstance.java
new file mode 100644
index 0000000..b243fc0
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralSystemInstance.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal System Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralSystemInstance()
+ * @model
+ * @generated
+ */
+public interface LiteralSystemInstance extends LiteralReferenceValue {
+} // LiteralSystemInstance
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralThisInstance.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralThisInstance.java
new file mode 100644
index 0000000..8b9c0db
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralThisInstance.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal This Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralThisInstance()
+ * @model
+ * @generated
+ */
+public interface LiteralThisInstance extends LiteralReferenceValue {
+} // LiteralThisInstance
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralTimeDeltaVariable.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralTimeDeltaVariable.java
new file mode 100644
index 0000000..9f2cbb4
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralTimeDeltaVariable.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Time Delta Variable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralTimeDeltaVariable()
+ * @model
+ * @generated
+ */
+public interface LiteralTimeDeltaVariable extends LiteralReferenceValue {
+} // LiteralTimeDeltaVariable
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralTimeVariable.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralTimeVariable.java
new file mode 100644
index 0000000..5182fd7
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/LiteralTimeVariable.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Time Variable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#getLiteralTimeVariable()
+ * @model
+ * @generated
+ */
+public interface LiteralTimeVariable extends LiteralReferenceValue {
+} // LiteralTimeVariable
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/ExpressionFactoryImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/ExpressionFactoryImpl.java
new file mode 100644
index 0000000..efd693c
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/ExpressionFactoryImpl.java
@@ -0,0 +1,325 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ExpressionFactoryImpl extends EFactoryImpl implements ExpressionFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static ExpressionFactory init() {
+		try {
+			ExpressionFactory theExpressionFactory = (ExpressionFactory)EPackage.Registry.INSTANCE.getEFactory(ExpressionPackage.eNS_URI);
+			if (theExpressionFactory != null) {
+				return theExpressionFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new ExpressionFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case ExpressionPackage.EXPRESSION: return createExpression();
+			case ExpressionPackage.LITERAL_EXPRESSION_VALUE: return createLiteralExpressionValue();
+			case ExpressionPackage.LITERAL_ARRAY_VALUE: return createLiteralArrayValue();
+			case ExpressionPackage.LITERAL_INTEGER_VALUE: return createLiteralIntegerValue();
+			case ExpressionPackage.LITERAL_BOOLEAN_VALUE: return createLiteralBooleanValue();
+			case ExpressionPackage.LITERAL_CHARACTER_VALUE: return createLiteralCharacterValue();
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE: return createLiteralRationalValue();
+			case ExpressionPackage.LITERAL_STRING_VALUE: return createLiteralStringValue();
+			case ExpressionPackage.LITERAL_NULL_VALUE: return createLiteralNullValue();
+			case ExpressionPackage.LITERAL_FLOAT_VALUE: return createLiteralFloatValue();
+			case ExpressionPackage.LITERAL_REAL_VALUE: return createLiteralRealValue();
+			case ExpressionPackage.LITERAL_REFERENCE_VALUE: return createLiteralReferenceValue();
+			case ExpressionPackage.LITERAL_OBJECT_REFERENCE: return createLiteralObjectReference();
+			case ExpressionPackage.LITERAL_THIS_INSTANCE: return createLiteralThisInstance();
+			case ExpressionPackage.LITERAL_SELF_INSTANCE: return createLiteralSelfInstance();
+			case ExpressionPackage.LITERAL_PARENT_INSTANCE: return createLiteralParentInstance();
+			case ExpressionPackage.LITERAL_SUPER_INSTANCE: return createLiteralSuperInstance();
+			case ExpressionPackage.LITERAL_SYSTEM_INSTANCE: return createLiteralSystemInstance();
+			case ExpressionPackage.LITERAL_ENV_INSTANCE: return createLiteralEnvInstance();
+			case ExpressionPackage.LITERAL_TIME_VARIABLE: return createLiteralTimeVariable();
+			case ExpressionPackage.LITERAL_TIME_DELTA_VARIABLE: return createLiteralTimeDeltaVariable();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression createExpression() {
+		ExpressionImpl expression = new ExpressionImpl();
+		return expression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralExpressionValue createLiteralExpressionValue() {
+		LiteralExpressionValueImpl literalExpressionValue = new LiteralExpressionValueImpl();
+		return literalExpressionValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralArrayValue createLiteralArrayValue() {
+		LiteralArrayValueImpl literalArrayValue = new LiteralArrayValueImpl();
+		return literalArrayValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralIntegerValue createLiteralIntegerValue() {
+		LiteralIntegerValueImpl literalIntegerValue = new LiteralIntegerValueImpl();
+		return literalIntegerValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralBooleanValue createLiteralBooleanValue() {
+		LiteralBooleanValueImpl literalBooleanValue = new LiteralBooleanValueImpl();
+		return literalBooleanValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralCharacterValue createLiteralCharacterValue() {
+		LiteralCharacterValueImpl literalCharacterValue = new LiteralCharacterValueImpl();
+		return literalCharacterValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralRationalValue createLiteralRationalValue() {
+		LiteralRationalValueImpl literalRationalValue = new LiteralRationalValueImpl();
+		return literalRationalValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralStringValue createLiteralStringValue() {
+		LiteralStringValueImpl literalStringValue = new LiteralStringValueImpl();
+		return literalStringValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralNullValue createLiteralNullValue() {
+		LiteralNullValueImpl literalNullValue = new LiteralNullValueImpl();
+		return literalNullValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralFloatValue createLiteralFloatValue() {
+		LiteralFloatValueImpl literalFloatValue = new LiteralFloatValueImpl();
+		return literalFloatValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralRealValue createLiteralRealValue() {
+		LiteralRealValueImpl literalRealValue = new LiteralRealValueImpl();
+		return literalRealValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralReferenceValue createLiteralReferenceValue() {
+		LiteralReferenceValueImpl literalReferenceValue = new LiteralReferenceValueImpl();
+		return literalReferenceValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralObjectReference createLiteralObjectReference() {
+		LiteralObjectReferenceImpl literalObjectReference = new LiteralObjectReferenceImpl();
+		return literalObjectReference;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralThisInstance createLiteralThisInstance() {
+		LiteralThisInstanceImpl literalThisInstance = new LiteralThisInstanceImpl();
+		return literalThisInstance;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralSelfInstance createLiteralSelfInstance() {
+		LiteralSelfInstanceImpl literalSelfInstance = new LiteralSelfInstanceImpl();
+		return literalSelfInstance;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralParentInstance createLiteralParentInstance() {
+		LiteralParentInstanceImpl literalParentInstance = new LiteralParentInstanceImpl();
+		return literalParentInstance;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralSuperInstance createLiteralSuperInstance() {
+		LiteralSuperInstanceImpl literalSuperInstance = new LiteralSuperInstanceImpl();
+		return literalSuperInstance;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralSystemInstance createLiteralSystemInstance() {
+		LiteralSystemInstanceImpl literalSystemInstance = new LiteralSystemInstanceImpl();
+		return literalSystemInstance;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralEnvInstance createLiteralEnvInstance() {
+		LiteralEnvInstanceImpl literalEnvInstance = new LiteralEnvInstanceImpl();
+		return literalEnvInstance;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralTimeVariable createLiteralTimeVariable() {
+		LiteralTimeVariableImpl literalTimeVariable = new LiteralTimeVariableImpl();
+		return literalTimeVariable;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralTimeDeltaVariable createLiteralTimeDeltaVariable() {
+		LiteralTimeDeltaVariableImpl literalTimeDeltaVariable = new LiteralTimeDeltaVariableImpl();
+		return literalTimeDeltaVariable;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionPackage getExpressionPackage() {
+		return (ExpressionPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static ExpressionPackage getPackage() {
+		return ExpressionPackage.eINSTANCE;
+	}
+
+} //ExpressionFactoryImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/ExpressionImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/ExpressionImpl.java
new file mode 100644
index 0000000..2a41e9b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/ExpressionImpl.java
@@ -0,0 +1,234 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.efm.ecore.sew.expression.Expression;
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+
+import org.eclipse.efm.ecore.sew.impl.WValueSpecificationImpl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.ExpressionImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.ExpressionImpl#getOperand <em>Operand</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ExpressionImpl extends WValueSpecificationImpl implements Expression {
+	/**
+	 * The default value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OPERATOR_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected String operator = OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getOperand() <em>Operand</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<WValueSpecification> operand;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOperator() {
+		return operator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator(String newOperator) {
+		String oldOperator = operator;
+		operator = newOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.EXPRESSION__OPERATOR, oldOperator, operator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<WValueSpecification> getOperand() {
+		if (operand == null) {
+			operand = new EObjectContainmentEList<WValueSpecification>(WValueSpecification.class, this, ExpressionPackage.EXPRESSION__OPERAND);
+		}
+		return operand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION__OPERAND:
+				return ((InternalEList<?>)getOperand()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION__OPERATOR:
+				return getOperator();
+			case ExpressionPackage.EXPRESSION__OPERAND:
+				return getOperand();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION__OPERATOR:
+				setOperator((String)newValue);
+				return;
+			case ExpressionPackage.EXPRESSION__OPERAND:
+				getOperand().clear();
+				getOperand().addAll((Collection<? extends WValueSpecification>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION__OPERATOR:
+				setOperator(OPERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.EXPRESSION__OPERAND:
+				getOperand().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION__OPERATOR:
+				return OPERATOR_EDEFAULT == null ? operator != null : !OPERATOR_EDEFAULT.equals(operator);
+			case ExpressionPackage.EXPRESSION__OPERAND:
+				return operand != null && !operand.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (operator: ");
+		result.append(operator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ExpressionImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/ExpressionPackageImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/ExpressionPackageImpl.java
new file mode 100644
index 0000000..1a3f2b4
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/ExpressionPackageImpl.java
@@ -0,0 +1,781 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.SewPackage;
+
+import org.eclipse.efm.ecore.sew.expression.Expression;
+import org.eclipse.efm.ecore.sew.expression.ExpressionFactory;
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralArrayValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralEnvInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralExpressionValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralFloatValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralNullValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralObjectReference;
+import org.eclipse.efm.ecore.sew.expression.LiteralParentInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralRationalValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralRealValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralSelfInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralStringValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralSuperInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralSystemInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralThisInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralTimeDeltaVariable;
+import org.eclipse.efm.ecore.sew.expression.LiteralTimeVariable;
+
+import org.eclipse.efm.ecore.sew.impl.SewPackageImpl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ExpressionPackageImpl extends EPackageImpl implements ExpressionPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass expressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalExpressionValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalArrayValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalIntegerValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalBooleanValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalCharacterValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalRationalValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalStringValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalNullValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalFloatValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalRealValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalReferenceValueEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalObjectReferenceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalThisInstanceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalSelfInstanceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalParentInstanceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalSuperInstanceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalSystemInstanceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalEnvInstanceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalTimeVariableEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalTimeDeltaVariableEClass = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private ExpressionPackageImpl() {
+		super(eNS_URI, ExpressionFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link ExpressionPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static ExpressionPackage init() {
+		if (isInited) return (ExpressionPackage)EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI);
+
+		// Obtain or create and register package
+		ExpressionPackageImpl theExpressionPackage = (ExpressionPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ExpressionPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new ExpressionPackageImpl());
+
+		isInited = true;
+
+		// Obtain or create and register interdependencies
+		SewPackageImpl theSewPackage = (SewPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(SewPackage.eNS_URI) instanceof SewPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(SewPackage.eNS_URI) : SewPackage.eINSTANCE);
+
+		// Create package meta-data objects
+		theExpressionPackage.createPackageContents();
+		theSewPackage.createPackageContents();
+
+		// Initialize created meta-data
+		theExpressionPackage.initializePackageContents();
+		theSewPackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theExpressionPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(ExpressionPackage.eNS_URI, theExpressionPackage);
+		return theExpressionPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getExpression() {
+		return expressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getExpression_Operator() {
+		return (EAttribute)expressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExpression_Operand() {
+		return (EReference)expressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralExpressionValue() {
+		return literalExpressionValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralArrayValue() {
+		return literalArrayValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getLiteralArrayValue_Values() {
+		return (EReference)literalArrayValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralIntegerValue() {
+		return literalIntegerValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralIntegerValue_Value() {
+		return (EAttribute)literalIntegerValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralBooleanValue() {
+		return literalBooleanValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralBooleanValue_Value() {
+		return (EAttribute)literalBooleanValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralCharacterValue() {
+		return literalCharacterValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralCharacterValue_Value() {
+		return (EAttribute)literalCharacterValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralRationalValue() {
+		return literalRationalValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralRationalValue_Numerator() {
+		return (EAttribute)literalRationalValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralRationalValue_Denominator() {
+		return (EAttribute)literalRationalValueEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralStringValue() {
+		return literalStringValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralStringValue_Value() {
+		return (EAttribute)literalStringValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralNullValue() {
+		return literalNullValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralNullValue_Type() {
+		return (EAttribute)literalNullValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralFloatValue() {
+		return literalFloatValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralFloatValue_Value() {
+		return (EAttribute)literalFloatValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralRealValue() {
+		return literalRealValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralRealValue_Value() {
+		return (EAttribute)literalRealValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralReferenceValue() {
+		return literalReferenceValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralReferenceValue_Symbol() {
+		return (EAttribute)literalReferenceValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralObjectReference() {
+		return literalObjectReferenceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getLiteralObjectReference_Object() {
+		return (EReference)literalObjectReferenceEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralThisInstance() {
+		return literalThisInstanceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralSelfInstance() {
+		return literalSelfInstanceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralParentInstance() {
+		return literalParentInstanceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralSuperInstance() {
+		return literalSuperInstanceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralSystemInstance() {
+		return literalSystemInstanceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralEnvInstance() {
+		return literalEnvInstanceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralTimeVariable() {
+		return literalTimeVariableEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralTimeDeltaVariable() {
+		return literalTimeDeltaVariableEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionFactory getExpressionFactory() {
+		return (ExpressionFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		expressionEClass = createEClass(EXPRESSION);
+		createEAttribute(expressionEClass, EXPRESSION__OPERATOR);
+		createEReference(expressionEClass, EXPRESSION__OPERAND);
+
+		literalExpressionValueEClass = createEClass(LITERAL_EXPRESSION_VALUE);
+
+		literalArrayValueEClass = createEClass(LITERAL_ARRAY_VALUE);
+		createEReference(literalArrayValueEClass, LITERAL_ARRAY_VALUE__VALUES);
+
+		literalIntegerValueEClass = createEClass(LITERAL_INTEGER_VALUE);
+		createEAttribute(literalIntegerValueEClass, LITERAL_INTEGER_VALUE__VALUE);
+
+		literalBooleanValueEClass = createEClass(LITERAL_BOOLEAN_VALUE);
+		createEAttribute(literalBooleanValueEClass, LITERAL_BOOLEAN_VALUE__VALUE);
+
+		literalCharacterValueEClass = createEClass(LITERAL_CHARACTER_VALUE);
+		createEAttribute(literalCharacterValueEClass, LITERAL_CHARACTER_VALUE__VALUE);
+
+		literalRationalValueEClass = createEClass(LITERAL_RATIONAL_VALUE);
+		createEAttribute(literalRationalValueEClass, LITERAL_RATIONAL_VALUE__NUMERATOR);
+		createEAttribute(literalRationalValueEClass, LITERAL_RATIONAL_VALUE__DENOMINATOR);
+
+		literalStringValueEClass = createEClass(LITERAL_STRING_VALUE);
+		createEAttribute(literalStringValueEClass, LITERAL_STRING_VALUE__VALUE);
+
+		literalNullValueEClass = createEClass(LITERAL_NULL_VALUE);
+		createEAttribute(literalNullValueEClass, LITERAL_NULL_VALUE__TYPE);
+
+		literalFloatValueEClass = createEClass(LITERAL_FLOAT_VALUE);
+		createEAttribute(literalFloatValueEClass, LITERAL_FLOAT_VALUE__VALUE);
+
+		literalRealValueEClass = createEClass(LITERAL_REAL_VALUE);
+		createEAttribute(literalRealValueEClass, LITERAL_REAL_VALUE__VALUE);
+
+		literalReferenceValueEClass = createEClass(LITERAL_REFERENCE_VALUE);
+		createEAttribute(literalReferenceValueEClass, LITERAL_REFERENCE_VALUE__SYMBOL);
+
+		literalObjectReferenceEClass = createEClass(LITERAL_OBJECT_REFERENCE);
+		createEReference(literalObjectReferenceEClass, LITERAL_OBJECT_REFERENCE__OBJECT);
+
+		literalThisInstanceEClass = createEClass(LITERAL_THIS_INSTANCE);
+
+		literalSelfInstanceEClass = createEClass(LITERAL_SELF_INSTANCE);
+
+		literalParentInstanceEClass = createEClass(LITERAL_PARENT_INSTANCE);
+
+		literalSuperInstanceEClass = createEClass(LITERAL_SUPER_INSTANCE);
+
+		literalSystemInstanceEClass = createEClass(LITERAL_SYSTEM_INSTANCE);
+
+		literalEnvInstanceEClass = createEClass(LITERAL_ENV_INSTANCE);
+
+		literalTimeVariableEClass = createEClass(LITERAL_TIME_VARIABLE);
+
+		literalTimeDeltaVariableEClass = createEClass(LITERAL_TIME_DELTA_VARIABLE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		SewPackage theSewPackage = (SewPackage)EPackage.Registry.INSTANCE.getEPackage(SewPackage.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		expressionEClass.getESuperTypes().add(theSewPackage.getWValueSpecification());
+		literalExpressionValueEClass.getESuperTypes().add(theSewPackage.getWValueSpecification());
+		literalArrayValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalIntegerValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalBooleanValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalCharacterValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalRationalValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalStringValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalNullValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalFloatValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalRealValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalReferenceValueEClass.getESuperTypes().add(this.getLiteralExpressionValue());
+		literalObjectReferenceEClass.getESuperTypes().add(this.getLiteralReferenceValue());
+		literalThisInstanceEClass.getESuperTypes().add(this.getLiteralReferenceValue());
+		literalSelfInstanceEClass.getESuperTypes().add(this.getLiteralReferenceValue());
+		literalParentInstanceEClass.getESuperTypes().add(this.getLiteralReferenceValue());
+		literalSuperInstanceEClass.getESuperTypes().add(this.getLiteralReferenceValue());
+		literalSystemInstanceEClass.getESuperTypes().add(this.getLiteralReferenceValue());
+		literalEnvInstanceEClass.getESuperTypes().add(this.getLiteralReferenceValue());
+		literalTimeVariableEClass.getESuperTypes().add(this.getLiteralReferenceValue());
+		literalTimeDeltaVariableEClass.getESuperTypes().add(this.getLiteralReferenceValue());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(expressionEClass, Expression.class, "Expression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getExpression_Operator(), ecorePackage.getEString(), "operator", null, 0, 1, Expression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getExpression_Operand(), theSewPackage.getWValueSpecification(), null, "operand", null, 0, -1, Expression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalExpressionValueEClass, LiteralExpressionValue.class, "LiteralExpressionValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalArrayValueEClass, LiteralArrayValue.class, "LiteralArrayValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getLiteralArrayValue_Values(), theSewPackage.getWValueSpecification(), null, "values", null, 0, -1, LiteralArrayValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalIntegerValueEClass, LiteralIntegerValue.class, "LiteralIntegerValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralIntegerValue_Value(), ecorePackage.getELong(), "value", "0", 1, 1, LiteralIntegerValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalBooleanValueEClass, LiteralBooleanValue.class, "LiteralBooleanValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralBooleanValue_Value(), ecorePackage.getEBoolean(), "value", "false", 1, 1, LiteralBooleanValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalCharacterValueEClass, LiteralCharacterValue.class, "LiteralCharacterValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralCharacterValue_Value(), ecorePackage.getEChar(), "value", "0", 1, 1, LiteralCharacterValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalRationalValueEClass, LiteralRationalValue.class, "LiteralRationalValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralRationalValue_Numerator(), ecorePackage.getELong(), "numerator", "0", 1, 1, LiteralRationalValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getLiteralRationalValue_Denominator(), ecorePackage.getELong(), "denominator", "1", 1, 1, LiteralRationalValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalStringValueEClass, LiteralStringValue.class, "LiteralStringValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralStringValue_Value(), ecorePackage.getEString(), "value", null, 1, 1, LiteralStringValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalNullValueEClass, LiteralNullValue.class, "LiteralNullValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralNullValue_Type(), ecorePackage.getEString(), "type", null, 0, 1, LiteralNullValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalFloatValueEClass, LiteralFloatValue.class, "LiteralFloatValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralFloatValue_Value(), ecorePackage.getEDouble(), "value", null, 1, 1, LiteralFloatValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalRealValueEClass, LiteralRealValue.class, "LiteralRealValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralRealValue_Value(), ecorePackage.getEBigDecimal(), "value", null, 1, 1, LiteralRealValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalReferenceValueEClass, LiteralReferenceValue.class, "LiteralReferenceValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralReferenceValue_Symbol(), ecorePackage.getEString(), "symbol", null, 0, 1, LiteralReferenceValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalObjectReferenceEClass, LiteralObjectReference.class, "LiteralObjectReference", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getLiteralObjectReference_Object(), theSewPackage.getWObject(), null, "object", null, 0, 1, LiteralObjectReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalThisInstanceEClass, LiteralThisInstance.class, "LiteralThisInstance", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalSelfInstanceEClass, LiteralSelfInstance.class, "LiteralSelfInstance", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalParentInstanceEClass, LiteralParentInstance.class, "LiteralParentInstance", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalSuperInstanceEClass, LiteralSuperInstance.class, "LiteralSuperInstance", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalSystemInstanceEClass, LiteralSystemInstance.class, "LiteralSystemInstance", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalEnvInstanceEClass, LiteralEnvInstance.class, "LiteralEnvInstance", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalTimeVariableEClass, LiteralTimeVariable.class, "LiteralTimeVariable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalTimeDeltaVariableEClass, LiteralTimeDeltaVariable.class, "LiteralTimeDeltaVariable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+	}
+
+} //ExpressionPackageImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralArrayValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralArrayValueImpl.java
new file mode 100644
index 0000000..d84a632
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralArrayValueImpl.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralArrayValue;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Array Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralArrayValueImpl#getValues <em>Values</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralArrayValueImpl extends LiteralExpressionValueImpl implements LiteralArrayValue {
+	/**
+	 * The cached value of the '{@link #getValues() <em>Values</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValues()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<WValueSpecification> values;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralArrayValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_ARRAY_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<WValueSpecification> getValues() {
+		if (values == null) {
+			values = new EObjectContainmentEList<WValueSpecification>(WValueSpecification.class, this, ExpressionPackage.LITERAL_ARRAY_VALUE__VALUES);
+		}
+		return values;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_ARRAY_VALUE__VALUES:
+				return ((InternalEList<?>)getValues()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_ARRAY_VALUE__VALUES:
+				return getValues();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_ARRAY_VALUE__VALUES:
+				getValues().clear();
+				getValues().addAll((Collection<? extends WValueSpecification>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_ARRAY_VALUE__VALUES:
+				getValues().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_ARRAY_VALUE__VALUES:
+				return values != null && !values.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //LiteralArrayValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralBooleanValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralBooleanValueImpl.java
new file mode 100644
index 0000000..8cb5b11
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralBooleanValueImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Boolean Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralBooleanValueImpl#isValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralBooleanValueImpl extends LiteralExpressionValueImpl implements LiteralBooleanValue {
+	/**
+	 * The default value of the '{@link #isValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean VALUE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralBooleanValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_BOOLEAN_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(boolean newValue) {
+		boolean oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_BOOLEAN_VALUE__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_BOOLEAN_VALUE__VALUE:
+				return isValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_BOOLEAN_VALUE__VALUE:
+				setValue((Boolean)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_BOOLEAN_VALUE__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_BOOLEAN_VALUE__VALUE:
+				return value != VALUE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralBooleanValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralCharacterValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralCharacterValueImpl.java
new file mode 100644
index 0000000..31a8e22
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralCharacterValueImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Character Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralCharacterValueImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralCharacterValueImpl extends LiteralExpressionValueImpl implements LiteralCharacterValue {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final char VALUE_EDEFAULT = '\u0000';
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected char value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralCharacterValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_CHARACTER_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public char getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(char newValue) {
+		char oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_CHARACTER_VALUE__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_CHARACTER_VALUE__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_CHARACTER_VALUE__VALUE:
+				setValue((Character)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_CHARACTER_VALUE__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_CHARACTER_VALUE__VALUE:
+				return value != VALUE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralCharacterValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralEnvInstanceImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralEnvInstanceImpl.java
new file mode 100644
index 0000000..918cc3a
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralEnvInstanceImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralEnvInstance;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Env Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralEnvInstanceImpl extends LiteralReferenceValueImpl implements LiteralEnvInstance {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralEnvInstanceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_ENV_INSTANCE;
+	}
+
+} //LiteralEnvInstanceImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralExpressionValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralExpressionValueImpl.java
new file mode 100644
index 0000000..c167338
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralExpressionValueImpl.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralExpressionValue;
+
+import org.eclipse.efm.ecore.sew.impl.WValueSpecificationImpl;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Expression Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralExpressionValueImpl extends WValueSpecificationImpl implements LiteralExpressionValue {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralExpressionValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_EXPRESSION_VALUE;
+	}
+
+} //LiteralExpressionValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralFloatValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralFloatValueImpl.java
new file mode 100644
index 0000000..0daef21
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralFloatValueImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralFloatValue;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Float Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralFloatValueImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralFloatValueImpl extends LiteralExpressionValueImpl implements LiteralFloatValue {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double VALUE_EDEFAULT = 0.0;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected double value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralFloatValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_FLOAT_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(double newValue) {
+		double oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_FLOAT_VALUE__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_FLOAT_VALUE__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_FLOAT_VALUE__VALUE:
+				setValue((Double)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_FLOAT_VALUE__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_FLOAT_VALUE__VALUE:
+				return value != VALUE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralFloatValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralIntegerValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralIntegerValueImpl.java
new file mode 100644
index 0000000..20d0008
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralIntegerValueImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Integer Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralIntegerValueImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralIntegerValueImpl extends LiteralExpressionValueImpl implements LiteralIntegerValue {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final long VALUE_EDEFAULT = 0L;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected long value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralIntegerValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_INTEGER_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public long getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(long newValue) {
+		long oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_INTEGER_VALUE__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_INTEGER_VALUE__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_INTEGER_VALUE__VALUE:
+				setValue((Long)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_INTEGER_VALUE__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_INTEGER_VALUE__VALUE:
+				return value != VALUE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralIntegerValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralNullValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralNullValueImpl.java
new file mode 100644
index 0000000..bafff65
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralNullValueImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralNullValue;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Null Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralNullValueImpl#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralNullValueImpl extends LiteralExpressionValueImpl implements LiteralNullValue {
+	/**
+	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String TYPE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getType()
+	 * @generated
+	 * @ordered
+	 */
+	protected String type = TYPE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralNullValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_NULL_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setType(String newType) {
+		String oldType = type;
+		type = newType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_NULL_VALUE__TYPE, oldType, type));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_NULL_VALUE__TYPE:
+				return getType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_NULL_VALUE__TYPE:
+				setType((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_NULL_VALUE__TYPE:
+				setType(TYPE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_NULL_VALUE__TYPE:
+				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (type: ");
+		result.append(type);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralNullValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralObjectReferenceImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralObjectReferenceImpl.java
new file mode 100644
index 0000000..f2418e3
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralObjectReferenceImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.WObject;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralObjectReference;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Object Reference</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralObjectReferenceImpl#getObject <em>Object</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralObjectReferenceImpl extends LiteralReferenceValueImpl implements LiteralObjectReference {
+	/**
+	 * The cached value of the '{@link #getObject() <em>Object</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getObject()
+	 * @generated
+	 * @ordered
+	 */
+	protected WObject object;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralObjectReferenceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_OBJECT_REFERENCE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public WObject getObject() {
+		if (object != null && object.eIsProxy()) {
+			InternalEObject oldObject = (InternalEObject)object;
+			object = (WObject)eResolveProxy(oldObject);
+			if (object != oldObject) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ExpressionPackage.LITERAL_OBJECT_REFERENCE__OBJECT, oldObject, object));
+			}
+		}
+		return object;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public WObject basicGetObject() {
+		return object;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setObject(WObject newObject) {
+		WObject oldObject = object;
+		object = newObject;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_OBJECT_REFERENCE__OBJECT, oldObject, object));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_OBJECT_REFERENCE__OBJECT:
+				if (resolve) return getObject();
+				return basicGetObject();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_OBJECT_REFERENCE__OBJECT:
+				setObject((WObject)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_OBJECT_REFERENCE__OBJECT:
+				setObject((WObject)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_OBJECT_REFERENCE__OBJECT:
+				return object != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //LiteralObjectReferenceImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralParentInstanceImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralParentInstanceImpl.java
new file mode 100644
index 0000000..e4723b1
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralParentInstanceImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralParentInstance;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Parent Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralParentInstanceImpl extends LiteralReferenceValueImpl implements LiteralParentInstance {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralParentInstanceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_PARENT_INSTANCE;
+	}
+
+} //LiteralParentInstanceImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralRationalValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralRationalValueImpl.java
new file mode 100644
index 0000000..3397d82
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralRationalValueImpl.java
@@ -0,0 +1,226 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralRationalValue;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Rational Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralRationalValueImpl#getNumerator <em>Numerator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralRationalValueImpl#getDenominator <em>Denominator</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralRationalValueImpl extends LiteralExpressionValueImpl implements LiteralRationalValue {
+	/**
+	 * The default value of the '{@link #getNumerator() <em>Numerator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNumerator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final long NUMERATOR_EDEFAULT = 0L;
+
+	/**
+	 * The cached value of the '{@link #getNumerator() <em>Numerator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNumerator()
+	 * @generated
+	 * @ordered
+	 */
+	protected long numerator = NUMERATOR_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getDenominator() <em>Denominator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDenominator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final long DENOMINATOR_EDEFAULT = 1L;
+
+	/**
+	 * The cached value of the '{@link #getDenominator() <em>Denominator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDenominator()
+	 * @generated
+	 * @ordered
+	 */
+	protected long denominator = DENOMINATOR_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralRationalValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_RATIONAL_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public long getNumerator() {
+		return numerator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setNumerator(long newNumerator) {
+		long oldNumerator = numerator;
+		numerator = newNumerator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_RATIONAL_VALUE__NUMERATOR, oldNumerator, numerator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public long getDenominator() {
+		return denominator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDenominator(long newDenominator) {
+		long oldDenominator = denominator;
+		denominator = newDenominator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_RATIONAL_VALUE__DENOMINATOR, oldDenominator, denominator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE__NUMERATOR:
+				return getNumerator();
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE__DENOMINATOR:
+				return getDenominator();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE__NUMERATOR:
+				setNumerator((Long)newValue);
+				return;
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE__DENOMINATOR:
+				setDenominator((Long)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE__NUMERATOR:
+				setNumerator(NUMERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE__DENOMINATOR:
+				setDenominator(DENOMINATOR_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE__NUMERATOR:
+				return numerator != NUMERATOR_EDEFAULT;
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE__DENOMINATOR:
+				return denominator != DENOMINATOR_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (numerator: ");
+		result.append(numerator);
+		result.append(", denominator: ");
+		result.append(denominator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralRationalValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralRealValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralRealValueImpl.java
new file mode 100644
index 0000000..602f199
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralRealValueImpl.java
@@ -0,0 +1,174 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import java.math.BigDecimal;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralRealValue;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Real Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralRealValueImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralRealValueImpl extends LiteralExpressionValueImpl implements LiteralRealValue {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final BigDecimal VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected BigDecimal value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralRealValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_REAL_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BigDecimal getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(BigDecimal newValue) {
+		BigDecimal oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_REAL_VALUE__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REAL_VALUE__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REAL_VALUE__VALUE:
+				setValue((BigDecimal)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REAL_VALUE__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REAL_VALUE__VALUE:
+				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralRealValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralReferenceValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralReferenceValueImpl.java
new file mode 100644
index 0000000..a8c0a63
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralReferenceValueImpl.java
@@ -0,0 +1,169 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Reference Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralReferenceValueImpl#getSymbol <em>Symbol</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralReferenceValueImpl extends LiteralExpressionValueImpl implements LiteralReferenceValue {
+	/**
+	 * The default value of the '{@link #getSymbol() <em>Symbol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSymbol()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String SYMBOL_EDEFAULT = null;
+	/**
+	 * The cached value of the '{@link #getSymbol() <em>Symbol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSymbol()
+	 * @generated
+	 * @ordered
+	 */
+	protected String symbol = SYMBOL_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralReferenceValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getSymbol() {
+		return symbol;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSymbol(String newSymbol) {
+		String oldSymbol = symbol;
+		symbol = newSymbol;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_REFERENCE_VALUE__SYMBOL, oldSymbol, symbol));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REFERENCE_VALUE__SYMBOL:
+				return getSymbol();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REFERENCE_VALUE__SYMBOL:
+				setSymbol((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REFERENCE_VALUE__SYMBOL:
+				setSymbol(SYMBOL_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REFERENCE_VALUE__SYMBOL:
+				return SYMBOL_EDEFAULT == null ? symbol != null : !SYMBOL_EDEFAULT.equals(symbol);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (symbol: ");
+		result.append(symbol);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralReferenceValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralSelfInstanceImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralSelfInstanceImpl.java
new file mode 100644
index 0000000..7935da6
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralSelfInstanceImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralSelfInstance;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Self Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralSelfInstanceImpl extends LiteralReferenceValueImpl implements LiteralSelfInstance {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralSelfInstanceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_SELF_INSTANCE;
+	}
+
+} //LiteralSelfInstanceImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralStringValueImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralStringValueImpl.java
new file mode 100644
index 0000000..0328d61
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralStringValueImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralStringValue;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal String Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.expression.impl.LiteralStringValueImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralStringValueImpl extends LiteralExpressionValueImpl implements LiteralStringValue {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected String value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralStringValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_STRING_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(String newValue) {
+		String oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_STRING_VALUE__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_STRING_VALUE__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_STRING_VALUE__VALUE:
+				setValue((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_STRING_VALUE__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_STRING_VALUE__VALUE:
+				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralStringValueImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralSuperInstanceImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralSuperInstanceImpl.java
new file mode 100644
index 0000000..c942eac
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralSuperInstanceImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralSuperInstance;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Super Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralSuperInstanceImpl extends LiteralReferenceValueImpl implements LiteralSuperInstance {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralSuperInstanceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_SUPER_INSTANCE;
+	}
+
+} //LiteralSuperInstanceImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralSystemInstanceImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralSystemInstanceImpl.java
new file mode 100644
index 0000000..edde9e5
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralSystemInstanceImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralSystemInstance;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal System Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralSystemInstanceImpl extends LiteralReferenceValueImpl implements LiteralSystemInstance {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralSystemInstanceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_SYSTEM_INSTANCE;
+	}
+
+} //LiteralSystemInstanceImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralThisInstanceImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralThisInstanceImpl.java
new file mode 100644
index 0000000..af9256f
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralThisInstanceImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralThisInstance;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal This Instance</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralThisInstanceImpl extends LiteralReferenceValueImpl implements LiteralThisInstance {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralThisInstanceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_THIS_INSTANCE;
+	}
+
+} //LiteralThisInstanceImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralTimeDeltaVariableImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralTimeDeltaVariableImpl.java
new file mode 100644
index 0000000..ddc5dcf
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralTimeDeltaVariableImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralTimeDeltaVariable;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Time Delta Variable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralTimeDeltaVariableImpl extends LiteralReferenceValueImpl implements LiteralTimeDeltaVariable {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralTimeDeltaVariableImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_TIME_DELTA_VARIABLE;
+	}
+
+} //LiteralTimeDeltaVariableImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralTimeVariableImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralTimeVariableImpl.java
new file mode 100644
index 0000000..f3be798
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/impl/LiteralTimeVariableImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.impl;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralTimeVariable;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Time Variable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralTimeVariableImpl extends LiteralReferenceValueImpl implements LiteralTimeVariable {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralTimeVariableImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_TIME_VARIABLE;
+	}
+
+} //LiteralTimeVariableImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/util/ExpressionAdapterFactory.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/util/ExpressionAdapterFactory.java
new file mode 100644
index 0000000..d5e2b80
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/util/ExpressionAdapterFactory.java
@@ -0,0 +1,510 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.util;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.efm.ecore.sew.expression.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage
+ * @generated
+ */
+public class ExpressionAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static ExpressionPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = ExpressionPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExpressionSwitch<Adapter> modelSwitch =
+		new ExpressionSwitch<Adapter>() {
+			@Override
+			public Adapter caseExpression(Expression object) {
+				return createExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralExpressionValue(LiteralExpressionValue object) {
+				return createLiteralExpressionValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralArrayValue(LiteralArrayValue object) {
+				return createLiteralArrayValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralIntegerValue(LiteralIntegerValue object) {
+				return createLiteralIntegerValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralBooleanValue(LiteralBooleanValue object) {
+				return createLiteralBooleanValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralCharacterValue(LiteralCharacterValue object) {
+				return createLiteralCharacterValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralRationalValue(LiteralRationalValue object) {
+				return createLiteralRationalValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralStringValue(LiteralStringValue object) {
+				return createLiteralStringValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralNullValue(LiteralNullValue object) {
+				return createLiteralNullValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralFloatValue(LiteralFloatValue object) {
+				return createLiteralFloatValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralRealValue(LiteralRealValue object) {
+				return createLiteralRealValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralReferenceValue(LiteralReferenceValue object) {
+				return createLiteralReferenceValueAdapter();
+			}
+			@Override
+			public Adapter caseLiteralObjectReference(LiteralObjectReference object) {
+				return createLiteralObjectReferenceAdapter();
+			}
+			@Override
+			public Adapter caseLiteralThisInstance(LiteralThisInstance object) {
+				return createLiteralThisInstanceAdapter();
+			}
+			@Override
+			public Adapter caseLiteralSelfInstance(LiteralSelfInstance object) {
+				return createLiteralSelfInstanceAdapter();
+			}
+			@Override
+			public Adapter caseLiteralParentInstance(LiteralParentInstance object) {
+				return createLiteralParentInstanceAdapter();
+			}
+			@Override
+			public Adapter caseLiteralSuperInstance(LiteralSuperInstance object) {
+				return createLiteralSuperInstanceAdapter();
+			}
+			@Override
+			public Adapter caseLiteralSystemInstance(LiteralSystemInstance object) {
+				return createLiteralSystemInstanceAdapter();
+			}
+			@Override
+			public Adapter caseLiteralEnvInstance(LiteralEnvInstance object) {
+				return createLiteralEnvInstanceAdapter();
+			}
+			@Override
+			public Adapter caseLiteralTimeVariable(LiteralTimeVariable object) {
+				return createLiteralTimeVariableAdapter();
+			}
+			@Override
+			public Adapter caseLiteralTimeDeltaVariable(LiteralTimeDeltaVariable object) {
+				return createLiteralTimeDeltaVariableAdapter();
+			}
+			@Override
+			public Adapter caseWValueSpecification(WValueSpecification object) {
+				return createWValueSpecificationAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.Expression <em>Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.Expression
+	 * @generated
+	 */
+	public Adapter createExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralExpressionValue <em>Literal Expression Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralExpressionValue
+	 * @generated
+	 */
+	public Adapter createLiteralExpressionValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralArrayValue <em>Literal Array Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralArrayValue
+	 * @generated
+	 */
+	public Adapter createLiteralArrayValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue <em>Literal Integer Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue
+	 * @generated
+	 */
+	public Adapter createLiteralIntegerValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue <em>Literal Boolean Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue
+	 * @generated
+	 */
+	public Adapter createLiteralBooleanValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue <em>Literal Character Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue
+	 * @generated
+	 */
+	public Adapter createLiteralCharacterValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralRationalValue <em>Literal Rational Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralRationalValue
+	 * @generated
+	 */
+	public Adapter createLiteralRationalValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralStringValue <em>Literal String Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralStringValue
+	 * @generated
+	 */
+	public Adapter createLiteralStringValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralNullValue <em>Literal Null Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralNullValue
+	 * @generated
+	 */
+	public Adapter createLiteralNullValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralFloatValue <em>Literal Float Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralFloatValue
+	 * @generated
+	 */
+	public Adapter createLiteralFloatValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralRealValue <em>Literal Real Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralRealValue
+	 * @generated
+	 */
+	public Adapter createLiteralRealValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue <em>Literal Reference Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue
+	 * @generated
+	 */
+	public Adapter createLiteralReferenceValueAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralObjectReference <em>Literal Object Reference</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralObjectReference
+	 * @generated
+	 */
+	public Adapter createLiteralObjectReferenceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralThisInstance <em>Literal This Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralThisInstance
+	 * @generated
+	 */
+	public Adapter createLiteralThisInstanceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralSelfInstance <em>Literal Self Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralSelfInstance
+	 * @generated
+	 */
+	public Adapter createLiteralSelfInstanceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralParentInstance <em>Literal Parent Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralParentInstance
+	 * @generated
+	 */
+	public Adapter createLiteralParentInstanceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralSuperInstance <em>Literal Super Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralSuperInstance
+	 * @generated
+	 */
+	public Adapter createLiteralSuperInstanceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralSystemInstance <em>Literal System Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralSystemInstance
+	 * @generated
+	 */
+	public Adapter createLiteralSystemInstanceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralEnvInstance <em>Literal Env Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralEnvInstance
+	 * @generated
+	 */
+	public Adapter createLiteralEnvInstanceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralTimeVariable <em>Literal Time Variable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralTimeVariable
+	 * @generated
+	 */
+	public Adapter createLiteralTimeVariableAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.expression.LiteralTimeDeltaVariable <em>Literal Time Delta Variable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.expression.LiteralTimeDeltaVariable
+	 * @generated
+	 */
+	public Adapter createLiteralTimeDeltaVariableAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.WValueSpecification <em>WValue Specification</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.WValueSpecification
+	 * @generated
+	 */
+	public Adapter createWValueSpecificationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //ExpressionAdapterFactory
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/util/ExpressionSwitch.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/util/ExpressionSwitch.java
new file mode 100644
index 0000000..8c98b23
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/util/ExpressionSwitch.java
@@ -0,0 +1,606 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.expression.util;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.efm.ecore.sew.expression.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.sew.expression.ExpressionPackage
+ * @generated
+ */
+public class ExpressionSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static ExpressionPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionSwitch() {
+		if (modelPackage == null) {
+			modelPackage = ExpressionPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case ExpressionPackage.EXPRESSION: {
+				Expression expression = (Expression)theEObject;
+				T result = caseExpression(expression);
+				if (result == null) result = caseWValueSpecification(expression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_EXPRESSION_VALUE: {
+				LiteralExpressionValue literalExpressionValue = (LiteralExpressionValue)theEObject;
+				T result = caseLiteralExpressionValue(literalExpressionValue);
+				if (result == null) result = caseWValueSpecification(literalExpressionValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_ARRAY_VALUE: {
+				LiteralArrayValue literalArrayValue = (LiteralArrayValue)theEObject;
+				T result = caseLiteralArrayValue(literalArrayValue);
+				if (result == null) result = caseLiteralExpressionValue(literalArrayValue);
+				if (result == null) result = caseWValueSpecification(literalArrayValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_INTEGER_VALUE: {
+				LiteralIntegerValue literalIntegerValue = (LiteralIntegerValue)theEObject;
+				T result = caseLiteralIntegerValue(literalIntegerValue);
+				if (result == null) result = caseLiteralExpressionValue(literalIntegerValue);
+				if (result == null) result = caseWValueSpecification(literalIntegerValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_BOOLEAN_VALUE: {
+				LiteralBooleanValue literalBooleanValue = (LiteralBooleanValue)theEObject;
+				T result = caseLiteralBooleanValue(literalBooleanValue);
+				if (result == null) result = caseLiteralExpressionValue(literalBooleanValue);
+				if (result == null) result = caseWValueSpecification(literalBooleanValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_CHARACTER_VALUE: {
+				LiteralCharacterValue literalCharacterValue = (LiteralCharacterValue)theEObject;
+				T result = caseLiteralCharacterValue(literalCharacterValue);
+				if (result == null) result = caseLiteralExpressionValue(literalCharacterValue);
+				if (result == null) result = caseWValueSpecification(literalCharacterValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE: {
+				LiteralRationalValue literalRationalValue = (LiteralRationalValue)theEObject;
+				T result = caseLiteralRationalValue(literalRationalValue);
+				if (result == null) result = caseLiteralExpressionValue(literalRationalValue);
+				if (result == null) result = caseWValueSpecification(literalRationalValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_STRING_VALUE: {
+				LiteralStringValue literalStringValue = (LiteralStringValue)theEObject;
+				T result = caseLiteralStringValue(literalStringValue);
+				if (result == null) result = caseLiteralExpressionValue(literalStringValue);
+				if (result == null) result = caseWValueSpecification(literalStringValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_NULL_VALUE: {
+				LiteralNullValue literalNullValue = (LiteralNullValue)theEObject;
+				T result = caseLiteralNullValue(literalNullValue);
+				if (result == null) result = caseLiteralExpressionValue(literalNullValue);
+				if (result == null) result = caseWValueSpecification(literalNullValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_FLOAT_VALUE: {
+				LiteralFloatValue literalFloatValue = (LiteralFloatValue)theEObject;
+				T result = caseLiteralFloatValue(literalFloatValue);
+				if (result == null) result = caseLiteralExpressionValue(literalFloatValue);
+				if (result == null) result = caseWValueSpecification(literalFloatValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_REAL_VALUE: {
+				LiteralRealValue literalRealValue = (LiteralRealValue)theEObject;
+				T result = caseLiteralRealValue(literalRealValue);
+				if (result == null) result = caseLiteralExpressionValue(literalRealValue);
+				if (result == null) result = caseWValueSpecification(literalRealValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_REFERENCE_VALUE: {
+				LiteralReferenceValue literalReferenceValue = (LiteralReferenceValue)theEObject;
+				T result = caseLiteralReferenceValue(literalReferenceValue);
+				if (result == null) result = caseLiteralExpressionValue(literalReferenceValue);
+				if (result == null) result = caseWValueSpecification(literalReferenceValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_OBJECT_REFERENCE: {
+				LiteralObjectReference literalObjectReference = (LiteralObjectReference)theEObject;
+				T result = caseLiteralObjectReference(literalObjectReference);
+				if (result == null) result = caseLiteralReferenceValue(literalObjectReference);
+				if (result == null) result = caseLiteralExpressionValue(literalObjectReference);
+				if (result == null) result = caseWValueSpecification(literalObjectReference);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_THIS_INSTANCE: {
+				LiteralThisInstance literalThisInstance = (LiteralThisInstance)theEObject;
+				T result = caseLiteralThisInstance(literalThisInstance);
+				if (result == null) result = caseLiteralReferenceValue(literalThisInstance);
+				if (result == null) result = caseLiteralExpressionValue(literalThisInstance);
+				if (result == null) result = caseWValueSpecification(literalThisInstance);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_SELF_INSTANCE: {
+				LiteralSelfInstance literalSelfInstance = (LiteralSelfInstance)theEObject;
+				T result = caseLiteralSelfInstance(literalSelfInstance);
+				if (result == null) result = caseLiteralReferenceValue(literalSelfInstance);
+				if (result == null) result = caseLiteralExpressionValue(literalSelfInstance);
+				if (result == null) result = caseWValueSpecification(literalSelfInstance);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_PARENT_INSTANCE: {
+				LiteralParentInstance literalParentInstance = (LiteralParentInstance)theEObject;
+				T result = caseLiteralParentInstance(literalParentInstance);
+				if (result == null) result = caseLiteralReferenceValue(literalParentInstance);
+				if (result == null) result = caseLiteralExpressionValue(literalParentInstance);
+				if (result == null) result = caseWValueSpecification(literalParentInstance);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_SUPER_INSTANCE: {
+				LiteralSuperInstance literalSuperInstance = (LiteralSuperInstance)theEObject;
+				T result = caseLiteralSuperInstance(literalSuperInstance);
+				if (result == null) result = caseLiteralReferenceValue(literalSuperInstance);
+				if (result == null) result = caseLiteralExpressionValue(literalSuperInstance);
+				if (result == null) result = caseWValueSpecification(literalSuperInstance);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_SYSTEM_INSTANCE: {
+				LiteralSystemInstance literalSystemInstance = (LiteralSystemInstance)theEObject;
+				T result = caseLiteralSystemInstance(literalSystemInstance);
+				if (result == null) result = caseLiteralReferenceValue(literalSystemInstance);
+				if (result == null) result = caseLiteralExpressionValue(literalSystemInstance);
+				if (result == null) result = caseWValueSpecification(literalSystemInstance);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_ENV_INSTANCE: {
+				LiteralEnvInstance literalEnvInstance = (LiteralEnvInstance)theEObject;
+				T result = caseLiteralEnvInstance(literalEnvInstance);
+				if (result == null) result = caseLiteralReferenceValue(literalEnvInstance);
+				if (result == null) result = caseLiteralExpressionValue(literalEnvInstance);
+				if (result == null) result = caseWValueSpecification(literalEnvInstance);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_TIME_VARIABLE: {
+				LiteralTimeVariable literalTimeVariable = (LiteralTimeVariable)theEObject;
+				T result = caseLiteralTimeVariable(literalTimeVariable);
+				if (result == null) result = caseLiteralReferenceValue(literalTimeVariable);
+				if (result == null) result = caseLiteralExpressionValue(literalTimeVariable);
+				if (result == null) result = caseWValueSpecification(literalTimeVariable);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_TIME_DELTA_VARIABLE: {
+				LiteralTimeDeltaVariable literalTimeDeltaVariable = (LiteralTimeDeltaVariable)theEObject;
+				T result = caseLiteralTimeDeltaVariable(literalTimeDeltaVariable);
+				if (result == null) result = caseLiteralReferenceValue(literalTimeDeltaVariable);
+				if (result == null) result = caseLiteralExpressionValue(literalTimeDeltaVariable);
+				if (result == null) result = caseWValueSpecification(literalTimeDeltaVariable);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseExpression(Expression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Expression Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Expression Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralExpressionValue(LiteralExpressionValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Array Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Array Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralArrayValue(LiteralArrayValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Integer Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Integer Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralIntegerValue(LiteralIntegerValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Boolean Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Boolean Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralBooleanValue(LiteralBooleanValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Character Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Character Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralCharacterValue(LiteralCharacterValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Rational Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Rational Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralRationalValue(LiteralRationalValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal String Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal String Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralStringValue(LiteralStringValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Null Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Null Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralNullValue(LiteralNullValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Float Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Float Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralFloatValue(LiteralFloatValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Real Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Real Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralRealValue(LiteralRealValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Reference Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Reference Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralReferenceValue(LiteralReferenceValue object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Object Reference</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Object Reference</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralObjectReference(LiteralObjectReference object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal This Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal This Instance</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralThisInstance(LiteralThisInstance object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Self Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Self Instance</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralSelfInstance(LiteralSelfInstance object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Parent Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Parent Instance</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralParentInstance(LiteralParentInstance object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Super Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Super Instance</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralSuperInstance(LiteralSuperInstance object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal System Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal System Instance</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralSystemInstance(LiteralSystemInstance object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Env Instance</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Env Instance</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralEnvInstance(LiteralEnvInstance object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Time Variable</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Time Variable</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralTimeVariable(LiteralTimeVariable object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Time Delta Variable</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Time Delta Variable</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralTimeDeltaVariable(LiteralTimeDeltaVariable object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>WValue Specification</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>WValue Specification</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseWValueSpecification(WValueSpecification object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //ExpressionSwitch
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/ExpressionValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/ExpressionValidator.java
new file mode 100644
index 0000000..9d61706
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/ExpressionValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.Expression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ExpressionValidator {
+	boolean validate();
+
+	boolean validateOperator(String value);
+	boolean validateOperand(EList<WValueSpecification> value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralArrayValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralArrayValueValidator.java
new file mode 100644
index 0000000..24791b4
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralArrayValueValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralArrayValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralArrayValueValidator {
+	boolean validate();
+
+	boolean validateValues(EList<WValueSpecification> value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralBooleanValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralBooleanValueValidator.java
new file mode 100644
index 0000000..2ce15f5
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralBooleanValueValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralBooleanValueValidator {
+	boolean validate();
+
+	boolean validateValue(boolean value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralCharacterValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralCharacterValueValidator.java
new file mode 100644
index 0000000..c73a7e4
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralCharacterValueValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralCharacterValueValidator {
+	boolean validate();
+
+	boolean validateValue(char value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralEnvInstanceValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralEnvInstanceValidator.java
new file mode 100644
index 0000000..75046d9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralEnvInstanceValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralEnvInstance}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralEnvInstanceValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralExpressionValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralExpressionValueValidator.java
new file mode 100644
index 0000000..61174a9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralExpressionValueValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralExpressionValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralExpressionValueValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralFloatValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralFloatValueValidator.java
new file mode 100644
index 0000000..6fe2f4c
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralFloatValueValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralFloatValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralFloatValueValidator {
+	boolean validate();
+
+	boolean validateValue(double value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralIntegerValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralIntegerValueValidator.java
new file mode 100644
index 0000000..8b61c93
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralIntegerValueValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralIntegerValueValidator {
+	boolean validate();
+
+	boolean validateValue(long value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralNullValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralNullValueValidator.java
new file mode 100644
index 0000000..ca68d85
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralNullValueValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralNullValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralNullValueValidator {
+	boolean validate();
+
+	boolean validateType(String value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralObjectReferenceValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralObjectReferenceValidator.java
new file mode 100644
index 0000000..2561503
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralObjectReferenceValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+import org.eclipse.efm.ecore.sew.WObject;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralObjectReference}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralObjectReferenceValidator {
+	boolean validate();
+
+	boolean validateObject(WObject value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralParentInstanceValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralParentInstanceValidator.java
new file mode 100644
index 0000000..daa4f3e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralParentInstanceValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralParentInstance}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralParentInstanceValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralRationalValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralRationalValueValidator.java
new file mode 100644
index 0000000..3a32292
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralRationalValueValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralRationalValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralRationalValueValidator {
+	boolean validate();
+
+	boolean validateNumerator(long value);
+	boolean validateDenominator(long value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralRealValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralRealValueValidator.java
new file mode 100644
index 0000000..a82c9bf
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralRealValueValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+import java.math.BigDecimal;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralRealValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralRealValueValidator {
+	boolean validate();
+
+	boolean validateValue(BigDecimal value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralReferenceValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralReferenceValueValidator.java
new file mode 100644
index 0000000..63633cd
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralReferenceValueValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralReferenceValueValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralSelfInstanceValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralSelfInstanceValidator.java
new file mode 100644
index 0000000..603ff4e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralSelfInstanceValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralSelfInstance}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralSelfInstanceValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralStringValueValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralStringValueValidator.java
new file mode 100644
index 0000000..9adba80
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralStringValueValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralStringValue}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralStringValueValidator {
+	boolean validate();
+
+	boolean validateValue(String value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralSuperInstanceValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralSuperInstanceValidator.java
new file mode 100644
index 0000000..a186832
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralSuperInstanceValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralSuperInstance}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralSuperInstanceValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralSystemInstanceValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralSystemInstanceValidator.java
new file mode 100644
index 0000000..ae9d6bd
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralSystemInstanceValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralSystemInstance}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralSystemInstanceValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralThisInstanceValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralThisInstanceValidator.java
new file mode 100644
index 0000000..d6749a8
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralThisInstanceValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralThisInstance}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralThisInstanceValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralTimeDeltaVariableValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralTimeDeltaVariableValidator.java
new file mode 100644
index 0000000..cf62f50
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralTimeDeltaVariableValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralTimeDeltaVariable}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralTimeDeltaVariableValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralTimeVariableValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralTimeVariableValidator.java
new file mode 100644
index 0000000..e0ac6f0
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/expression/validation/LiteralTimeVariableValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.expression.LiteralTimeVariable}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralTimeVariableValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/SEWorkflowImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/SEWorkflowImpl.java
new file mode 100644
index 0000000..02e83b3
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/SEWorkflowImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.impl;
+
+import org.eclipse.efm.ecore.sew.SEWorkflow;
+import org.eclipse.efm.ecore.sew.SewPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>SE Workflow</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class SEWorkflowImpl extends WObjectImpl implements SEWorkflow {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SEWorkflowImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return SewPackage.Literals.SE_WORKFLOW;
+	}
+
+} //SEWorkflowImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/SewFactoryImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/SewFactoryImpl.java
new file mode 100644
index 0000000..089c0e6
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/SewFactoryImpl.java
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.impl;
+
+import org.eclipse.efm.ecore.sew.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SewFactoryImpl extends EFactoryImpl implements SewFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static SewFactory init() {
+		try {
+			SewFactory theSewFactory = (SewFactory)EPackage.Registry.INSTANCE.getEFactory(SewPackage.eNS_URI);
+			if (theSewFactory != null) {
+				return theSewFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new SewFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SewFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case SewPackage.WNAMED_ELEMENT: return createWNamedElement();
+			case SewPackage.SE_WORKFLOW: return createSEWorkflow();
+			case SewPackage.WOBJECT: return createWObject();
+			case SewPackage.WSECTION: return createWSection();
+			case SewPackage.WATTRIBUTE: return createWAttribute();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public WNamedElement createWNamedElement() {
+		WNamedElementImpl wNamedElement = new WNamedElementImpl();
+		return wNamedElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SEWorkflow createSEWorkflow() {
+		SEWorkflowImpl seWorkflow = new SEWorkflowImpl();
+		return seWorkflow;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public WObject createWObject() {
+		WObjectImpl wObject = new WObjectImpl();
+		return wObject;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public WSection createWSection() {
+		WSectionImpl wSection = new WSectionImpl();
+		return wSection;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public WAttribute createWAttribute() {
+		WAttributeImpl wAttribute = new WAttributeImpl();
+		return wAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SewPackage getSewPackage() {
+		return (SewPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static SewPackage getPackage() {
+		return SewPackage.eINSTANCE;
+	}
+
+} //SewFactoryImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/SewPackageImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/SewPackageImpl.java
new file mode 100644
index 0000000..7899ffc
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/SewPackageImpl.java
@@ -0,0 +1,409 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.impl;
+
+import org.eclipse.efm.ecore.sew.SEWorkflow;
+import org.eclipse.efm.ecore.sew.SewFactory;
+import org.eclipse.efm.ecore.sew.SewPackage;
+import org.eclipse.efm.ecore.sew.WAttribute;
+import org.eclipse.efm.ecore.sew.WNamedElement;
+import org.eclipse.efm.ecore.sew.WObject;
+import org.eclipse.efm.ecore.sew.WProperty;
+import org.eclipse.efm.ecore.sew.WSection;
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+
+import org.eclipse.efm.ecore.sew.expression.impl.ExpressionPackageImpl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SewPackageImpl extends EPackageImpl implements SewPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass wNamedElementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass seWorkflowEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass wObjectEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass wPropertyEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass wSectionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass wAttributeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass wValueSpecificationEClass = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.efm.ecore.sew.SewPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private SewPackageImpl() {
+		super(eNS_URI, SewFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link SewPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static SewPackage init() {
+		if (isInited) return (SewPackage)EPackage.Registry.INSTANCE.getEPackage(SewPackage.eNS_URI);
+
+		// Obtain or create and register package
+		SewPackageImpl theSewPackage = (SewPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof SewPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new SewPackageImpl());
+
+		isInited = true;
+
+		// Obtain or create and register interdependencies
+		ExpressionPackageImpl theExpressionPackage = (ExpressionPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) instanceof ExpressionPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) : ExpressionPackage.eINSTANCE);
+
+		// Create package meta-data objects
+		theSewPackage.createPackageContents();
+		theExpressionPackage.createPackageContents();
+
+		// Initialize created meta-data
+		theSewPackage.initializePackageContents();
+		theExpressionPackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theSewPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(SewPackage.eNS_URI, theSewPackage);
+		return theSewPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getWNamedElement() {
+		return wNamedElementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getWNamedElement_Name() {
+		return (EAttribute)wNamedElementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getWNamedElement_Description() {
+		return (EAttribute)wNamedElementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSEWorkflow() {
+		return seWorkflowEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getWObject() {
+		return wObjectEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getWObject_Type() {
+		return (EAttribute)wObjectEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getWObject_Element() {
+		return (EReference)wObjectEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getWProperty() {
+		return wPropertyEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getWSection() {
+		return wSectionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getWSection_Element() {
+		return (EReference)wSectionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getWAttribute() {
+		return wAttributeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getWAttribute_Value() {
+		return (EReference)wAttributeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getWValueSpecification() {
+		return wValueSpecificationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SewFactory getSewFactory() {
+		return (SewFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		wNamedElementEClass = createEClass(WNAMED_ELEMENT);
+		createEAttribute(wNamedElementEClass, WNAMED_ELEMENT__NAME);
+		createEAttribute(wNamedElementEClass, WNAMED_ELEMENT__DESCRIPTION);
+
+		seWorkflowEClass = createEClass(SE_WORKFLOW);
+
+		wObjectEClass = createEClass(WOBJECT);
+		createEAttribute(wObjectEClass, WOBJECT__TYPE);
+		createEReference(wObjectEClass, WOBJECT__ELEMENT);
+
+		wPropertyEClass = createEClass(WPROPERTY);
+
+		wSectionEClass = createEClass(WSECTION);
+		createEReference(wSectionEClass, WSECTION__ELEMENT);
+
+		wAttributeEClass = createEClass(WATTRIBUTE);
+		createEReference(wAttributeEClass, WATTRIBUTE__VALUE);
+
+		wValueSpecificationEClass = createEClass(WVALUE_SPECIFICATION);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		ExpressionPackage theExpressionPackage = (ExpressionPackage)EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI);
+
+		// Add subpackages
+		getESubpackages().add(theExpressionPackage);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		seWorkflowEClass.getESuperTypes().add(this.getWObject());
+		wObjectEClass.getESuperTypes().add(this.getWNamedElement());
+		wPropertyEClass.getESuperTypes().add(this.getWNamedElement());
+		wSectionEClass.getESuperTypes().add(this.getWProperty());
+		wAttributeEClass.getESuperTypes().add(this.getWProperty());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(wNamedElementEClass, WNamedElement.class, "WNamedElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getWNamedElement_Name(), ecorePackage.getEString(), "name", null, 0, 1, WNamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getWNamedElement_Description(), ecorePackage.getEString(), "description", null, 0, 1, WNamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(seWorkflowEClass, SEWorkflow.class, "SEWorkflow", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(wObjectEClass, WObject.class, "WObject", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getWObject_Type(), ecorePackage.getEString(), "type", null, 0, 1, WObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getWObject_Element(), this.getWNamedElement(), null, "element", null, 0, -1, WObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(wPropertyEClass, WProperty.class, "WProperty", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(wSectionEClass, WSection.class, "WSection", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getWSection_Element(), this.getWNamedElement(), null, "element", null, 0, -1, WSection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(wAttributeEClass, WAttribute.class, "WAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getWAttribute_Value(), this.getWValueSpecification(), null, "value", null, 1, 1, WAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(wValueSpecificationEClass, WValueSpecification.class, "WValueSpecification", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		// Create resource
+		createResource(eNS_URI);
+
+		// Create annotations
+		// http://www.eclipse.org/OCL/Import
+		createImportAnnotations();
+	}
+
+	/**
+	 * Initializes the annotations for <b>http://www.eclipse.org/OCL/Import</b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void createImportAnnotations() {
+		String source = "http://www.eclipse.org/OCL/Import";	
+		addAnnotation
+		  (this, 
+		   source, 
+		   new String[] {
+			 "ecore", "http://www.eclipse.org/emf/2002/Ecore"
+		   });
+	}
+
+} //SewPackageImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WAttributeImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WAttributeImpl.java
new file mode 100644
index 0000000..84d0eab
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WAttributeImpl.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.impl;
+
+import org.eclipse.efm.ecore.sew.SewPackage;
+import org.eclipse.efm.ecore.sew.WAttribute;
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>WAttribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.impl.WAttributeImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class WAttributeImpl extends WPropertyImpl implements WAttribute {
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected WValueSpecification value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected WAttributeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return SewPackage.Literals.WATTRIBUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public WValueSpecification getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetValue(WValueSpecification newValue, NotificationChain msgs) {
+		WValueSpecification oldValue = value;
+		value = newValue;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SewPackage.WATTRIBUTE__VALUE, oldValue, newValue);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(WValueSpecification newValue) {
+		if (newValue != value) {
+			NotificationChain msgs = null;
+			if (value != null)
+				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SewPackage.WATTRIBUTE__VALUE, null, msgs);
+			if (newValue != null)
+				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SewPackage.WATTRIBUTE__VALUE, null, msgs);
+			msgs = basicSetValue(newValue, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, SewPackage.WATTRIBUTE__VALUE, newValue, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case SewPackage.WATTRIBUTE__VALUE:
+				return basicSetValue(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case SewPackage.WATTRIBUTE__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case SewPackage.WATTRIBUTE__VALUE:
+				setValue((WValueSpecification)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case SewPackage.WATTRIBUTE__VALUE:
+				setValue((WValueSpecification)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case SewPackage.WATTRIBUTE__VALUE:
+				return value != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //WAttributeImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WNamedElementImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WNamedElementImpl.java
new file mode 100644
index 0000000..9542e79
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WNamedElementImpl.java
@@ -0,0 +1,227 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.impl;
+
+import org.eclipse.efm.ecore.sew.SewPackage;
+import org.eclipse.efm.ecore.sew.WNamedElement;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>WNamed Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.impl.WNamedElementImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.sew.impl.WNamedElementImpl#getDescription <em>Description</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class WNamedElementImpl extends MinimalEObjectImpl.Container implements WNamedElement {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String DESCRIPTION_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected String description = DESCRIPTION_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected WNamedElementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return SewPackage.Literals.WNAMED_ELEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, SewPackage.WNAMED_ELEMENT__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDescription(String newDescription) {
+		String oldDescription = description;
+		description = newDescription;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, SewPackage.WNAMED_ELEMENT__DESCRIPTION, oldDescription, description));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case SewPackage.WNAMED_ELEMENT__NAME:
+				return getName();
+			case SewPackage.WNAMED_ELEMENT__DESCRIPTION:
+				return getDescription();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case SewPackage.WNAMED_ELEMENT__NAME:
+				setName((String)newValue);
+				return;
+			case SewPackage.WNAMED_ELEMENT__DESCRIPTION:
+				setDescription((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case SewPackage.WNAMED_ELEMENT__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case SewPackage.WNAMED_ELEMENT__DESCRIPTION:
+				setDescription(DESCRIPTION_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case SewPackage.WNAMED_ELEMENT__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case SewPackage.WNAMED_ELEMENT__DESCRIPTION:
+				return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(", description: ");
+		result.append(description);
+		result.append(')');
+		return result.toString();
+	}
+
+} //WNamedElementImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WObjectImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WObjectImpl.java
new file mode 100644
index 0000000..f4e4e03
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WObjectImpl.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.sew.SewPackage;
+import org.eclipse.efm.ecore.sew.WNamedElement;
+import org.eclipse.efm.ecore.sew.WObject;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>WObject</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.impl.WObjectImpl#getType <em>Type</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.sew.impl.WObjectImpl#getElement <em>Element</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class WObjectImpl extends WNamedElementImpl implements WObject {
+	/**
+	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getType()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String TYPE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getType()
+	 * @generated
+	 * @ordered
+	 */
+	protected String type = TYPE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getElement() <em>Element</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getElement()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<WNamedElement> element;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected WObjectImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return SewPackage.Literals.WOBJECT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getType() {
+		return type;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setType(String newType) {
+		String oldType = type;
+		type = newType;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, SewPackage.WOBJECT__TYPE, oldType, type));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<WNamedElement> getElement() {
+		if (element == null) {
+			element = new EObjectContainmentEList<WNamedElement>(WNamedElement.class, this, SewPackage.WOBJECT__ELEMENT);
+		}
+		return element;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case SewPackage.WOBJECT__ELEMENT:
+				return ((InternalEList<?>)getElement()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case SewPackage.WOBJECT__TYPE:
+				return getType();
+			case SewPackage.WOBJECT__ELEMENT:
+				return getElement();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case SewPackage.WOBJECT__TYPE:
+				setType((String)newValue);
+				return;
+			case SewPackage.WOBJECT__ELEMENT:
+				getElement().clear();
+				getElement().addAll((Collection<? extends WNamedElement>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case SewPackage.WOBJECT__TYPE:
+				setType(TYPE_EDEFAULT);
+				return;
+			case SewPackage.WOBJECT__ELEMENT:
+				getElement().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case SewPackage.WOBJECT__TYPE:
+				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
+			case SewPackage.WOBJECT__ELEMENT:
+				return element != null && !element.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (type: ");
+		result.append(type);
+		result.append(')');
+		return result.toString();
+	}
+
+} //WObjectImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WPropertyImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WPropertyImpl.java
new file mode 100644
index 0000000..04dcc0e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WPropertyImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.impl;
+
+import org.eclipse.efm.ecore.sew.SewPackage;
+import org.eclipse.efm.ecore.sew.WProperty;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>WProperty</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public abstract class WPropertyImpl extends WNamedElementImpl implements WProperty {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected WPropertyImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return SewPackage.Literals.WPROPERTY;
+	}
+
+} //WPropertyImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WSectionImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WSectionImpl.java
new file mode 100644
index 0000000..d4a56e2
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WSectionImpl.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.sew.SewPackage;
+import org.eclipse.efm.ecore.sew.WNamedElement;
+import org.eclipse.efm.ecore.sew.WSection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>WSection</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.sew.impl.WSectionImpl#getElement <em>Element</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class WSectionImpl extends WPropertyImpl implements WSection {
+	/**
+	 * The cached value of the '{@link #getElement() <em>Element</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getElement()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<WNamedElement> element;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected WSectionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return SewPackage.Literals.WSECTION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<WNamedElement> getElement() {
+		if (element == null) {
+			element = new EObjectContainmentEList<WNamedElement>(WNamedElement.class, this, SewPackage.WSECTION__ELEMENT);
+		}
+		return element;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case SewPackage.WSECTION__ELEMENT:
+				return ((InternalEList<?>)getElement()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case SewPackage.WSECTION__ELEMENT:
+				return getElement();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case SewPackage.WSECTION__ELEMENT:
+				getElement().clear();
+				getElement().addAll((Collection<? extends WNamedElement>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case SewPackage.WSECTION__ELEMENT:
+				getElement().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case SewPackage.WSECTION__ELEMENT:
+				return element != null && !element.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //WSectionImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WValueSpecificationImpl.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WValueSpecificationImpl.java
new file mode 100644
index 0000000..5e10187
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/impl/WValueSpecificationImpl.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.impl;
+
+import org.eclipse.efm.ecore.sew.SewPackage;
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>WValue Specification</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public abstract class WValueSpecificationImpl extends MinimalEObjectImpl.Container implements WValueSpecification {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected WValueSpecificationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return SewPackage.Literals.WVALUE_SPECIFICATION;
+	}
+
+} //WValueSpecificationImpl
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/util/SewAdapterFactory.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/util/SewAdapterFactory.java
new file mode 100644
index 0000000..620dd4b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/util/SewAdapterFactory.java
@@ -0,0 +1,238 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.util;
+
+import org.eclipse.efm.ecore.sew.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.sew.SewPackage
+ * @generated
+ */
+public class SewAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static SewPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SewAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = SewPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SewSwitch<Adapter> modelSwitch =
+		new SewSwitch<Adapter>() {
+			@Override
+			public Adapter caseWNamedElement(WNamedElement object) {
+				return createWNamedElementAdapter();
+			}
+			@Override
+			public Adapter caseSEWorkflow(SEWorkflow object) {
+				return createSEWorkflowAdapter();
+			}
+			@Override
+			public Adapter caseWObject(WObject object) {
+				return createWObjectAdapter();
+			}
+			@Override
+			public Adapter caseWProperty(WProperty object) {
+				return createWPropertyAdapter();
+			}
+			@Override
+			public Adapter caseWSection(WSection object) {
+				return createWSectionAdapter();
+			}
+			@Override
+			public Adapter caseWAttribute(WAttribute object) {
+				return createWAttributeAdapter();
+			}
+			@Override
+			public Adapter caseWValueSpecification(WValueSpecification object) {
+				return createWValueSpecificationAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.WNamedElement <em>WNamed Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.WNamedElement
+	 * @generated
+	 */
+	public Adapter createWNamedElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.SEWorkflow <em>SE Workflow</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.SEWorkflow
+	 * @generated
+	 */
+	public Adapter createSEWorkflowAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.WObject <em>WObject</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.WObject
+	 * @generated
+	 */
+	public Adapter createWObjectAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.WProperty <em>WProperty</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.WProperty
+	 * @generated
+	 */
+	public Adapter createWPropertyAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.WSection <em>WSection</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.WSection
+	 * @generated
+	 */
+	public Adapter createWSectionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.WAttribute <em>WAttribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.WAttribute
+	 * @generated
+	 */
+	public Adapter createWAttributeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.sew.WValueSpecification <em>WValue Specification</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.sew.WValueSpecification
+	 * @generated
+	 */
+	public Adapter createWValueSpecificationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //SewAdapterFactory
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/util/SewSwitch.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/util/SewSwitch.java
new file mode 100644
index 0000000..281538e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/util/SewSwitch.java
@@ -0,0 +1,254 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.sew.util;
+
+import org.eclipse.efm.ecore.sew.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.sew.SewPackage
+ * @generated
+ */
+public class SewSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static SewPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SewSwitch() {
+		if (modelPackage == null) {
+			modelPackage = SewPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case SewPackage.WNAMED_ELEMENT: {
+				WNamedElement wNamedElement = (WNamedElement)theEObject;
+				T result = caseWNamedElement(wNamedElement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case SewPackage.SE_WORKFLOW: {
+				SEWorkflow seWorkflow = (SEWorkflow)theEObject;
+				T result = caseSEWorkflow(seWorkflow);
+				if (result == null) result = caseWObject(seWorkflow);
+				if (result == null) result = caseWNamedElement(seWorkflow);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case SewPackage.WOBJECT: {
+				WObject wObject = (WObject)theEObject;
+				T result = caseWObject(wObject);
+				if (result == null) result = caseWNamedElement(wObject);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case SewPackage.WPROPERTY: {
+				WProperty wProperty = (WProperty)theEObject;
+				T result = caseWProperty(wProperty);
+				if (result == null) result = caseWNamedElement(wProperty);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case SewPackage.WSECTION: {
+				WSection wSection = (WSection)theEObject;
+				T result = caseWSection(wSection);
+				if (result == null) result = caseWProperty(wSection);
+				if (result == null) result = caseWNamedElement(wSection);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case SewPackage.WATTRIBUTE: {
+				WAttribute wAttribute = (WAttribute)theEObject;
+				T result = caseWAttribute(wAttribute);
+				if (result == null) result = caseWProperty(wAttribute);
+				if (result == null) result = caseWNamedElement(wAttribute);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case SewPackage.WVALUE_SPECIFICATION: {
+				WValueSpecification wValueSpecification = (WValueSpecification)theEObject;
+				T result = caseWValueSpecification(wValueSpecification);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>WNamed Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>WNamed Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseWNamedElement(WNamedElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>SE Workflow</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>SE Workflow</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseSEWorkflow(SEWorkflow object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>WObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>WObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseWObject(WObject object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>WProperty</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>WProperty</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseWProperty(WProperty object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>WSection</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>WSection</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseWSection(WSection object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>WAttribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>WAttribute</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseWAttribute(WAttribute object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>WValue Specification</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>WValue Specification</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseWValueSpecification(WValueSpecification object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //SewSwitch
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/SEWorkflowValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/SEWorkflowValidator.java
new file mode 100644
index 0000000..b98c011
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/SEWorkflowValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.SEWorkflow}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface SEWorkflowValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WAttributeValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WAttributeValidator.java
new file mode 100644
index 0000000..6e06de3
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WAttributeValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.validation;
+
+import org.eclipse.efm.ecore.sew.WValueSpecification;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.WAttribute}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface WAttributeValidator {
+	boolean validate();
+
+	boolean validateValue(WValueSpecification value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WNamedElementValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WNamedElementValidator.java
new file mode 100644
index 0000000..3d7d7b9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WNamedElementValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.WNamedElement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface WNamedElementValidator {
+	boolean validate();
+
+	boolean validateName(String value);
+	boolean validateDescription(String value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WObjectValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WObjectValidator.java
new file mode 100644
index 0000000..c530e77
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WObjectValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.validation;
+
+import org.eclipse.efm.ecore.sew.WNamedElement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.WObject}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface WObjectValidator {
+	boolean validate();
+
+	boolean validateType(String value);
+	boolean validateElement(EList<WNamedElement> value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WPropertyValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WPropertyValidator.java
new file mode 100644
index 0000000..e648c27
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WPropertyValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.WProperty}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface WPropertyValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WSectionValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WSectionValidator.java
new file mode 100644
index 0000000..4ecb6e9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WSectionValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.validation;
+
+import org.eclipse.efm.ecore.sew.WNamedElement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.WSection}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface WSectionValidator {
+	boolean validate();
+
+	boolean validateElement(EList<WNamedElement> value);
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WValueSpecificationValidator.java b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WValueSpecificationValidator.java
new file mode 100644
index 0000000..b815d1f
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src-gen/org/eclipse/efm/ecore/sew/validation/WValueSpecificationValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.sew.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.sew.WValueSpecification}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface WValueSpecificationValidator {
+	boolean validate();
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.ecore/src/org/eclipse/efm/sew/ecore/Activator.java b/editor/sew/org.eclipse.efm.sew.ecore/src/org/eclipse/efm/sew/ecore/Activator.java
new file mode 100644
index 0000000..48e19ff
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.ecore/src/org/eclipse/efm/sew/ecore/Activator.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+package org.eclipse.efm.sew.ecore;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.efm.sew.ecore"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/.classpath b/editor/sew/org.eclipse.efm.sew.xtext.ide/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.ide/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/.project b/editor/sew/org.eclipse.efm.sew.xtext.ide/.project
new file mode 100644
index 0000000..67defab
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.sew.xtext.ide</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/.settings/org.eclipse.core.resources.prefs b/editor/sew/org.eclipse.efm.sew.xtext.ide/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/.settings/org.eclipse.jdt.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext.ide/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/.settings/org.eclipse.m2e.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext.ide/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/META-INF/MANIFEST.MF b/editor/sew/org.eclipse.efm.sew.xtext.ide/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7b10f4d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.sew.xtext.ide; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.sew.xtext,
+ org.eclipse.efm.sew.ecore,
+ org.eclipse.xtext.ide,
+ org.eclipse.xtext.xbase.ide
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.sew.xtext.ide.contentassist.antlr.internal,
+ org.eclipse.efm.sew.xtext.ide.contentassist.antlr
+
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/README.md b/editor/sew/org.eclipse.efm.sew.xtext.ide/README.md
new file mode 100644
index 0000000..09cd108
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/README.md
@@ -0,0 +1,3 @@
+# EFM, Symbolic Execution Workflow Xtext based Editor IDE
+
+Model Ecore for Xtext Editor
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/about.html b/editor/sew/org.eclipse.efm.sew.xtext.ide/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/build.properties b/editor/sew/org.eclipse.efm.sew.xtext.ide/build.properties
new file mode 100644
index 0000000..db8fe81
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/pom.xml b/editor/sew/org.eclipse.efm.sew.xtext.ide/pom.xml
new file mode 100644
index 0000000..a9f73be
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.sew</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.sew.xtext.ide</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.sew.xtext.ide</name>
+	<description>This plug-in contains the Symbex Workflow's Xtext based editor IDE.</description>
+
+		<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/PartialSEWContentAssistParser.java b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/PartialSEWContentAssistParser.java
new file mode 100644
index 0000000..e4aa9e7
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/PartialSEWContentAssistParser.java
@@ -0,0 +1,43 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ide.contentassist.antlr;
+
+import java.util.Collection;
+import java.util.Collections;
+import org.eclipse.xtext.AbstractRule;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.util.PolymorphicDispatcher;
+
+public class PartialSEWContentAssistParser extends SEWParser implements IPartialEditingContentAssistParser {
+
+	private AbstractRule rule;
+
+	@Override
+	public void initializeFor(AbstractRule rule) {
+		this.rule = rule;
+	}
+
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		if (rule == null || rule.eIsProxy())
+			return Collections.emptyList();
+		String methodName = "entryRule" + rule.getName();
+		PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
+			new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
+		dispatcher.invoke();
+		return parser.getFollowElements();
+	}
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/SEWParser.java b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/SEWParser.java
new file mode 100644
index 0000000..08e56e4
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/SEWParser.java
@@ -0,0 +1,279 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ide.contentassist.antlr;
+
+import com.google.inject.Inject;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.antlr.runtime.RecognitionException;
+import org.eclipse.efm.sew.xtext.ide.contentassist.antlr.internal.InternalSEWParser;
+import org.eclipse.efm.sew.xtext.services.SEWGrammarAccess;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+
+public class SEWParser extends AbstractContentAssistParser {
+
+	@Inject
+	private SEWGrammarAccess grammarAccess;
+
+	private Map<AbstractElement, String> nameMappings;
+
+	@Override
+	protected InternalSEWParser createParser() {
+		InternalSEWParser result = new InternalSEWParser(null);
+		result.setGrammarAccess(grammarAccess);
+		return result;
+	}
+
+	@Override
+	protected String getRuleName(AbstractElement element) {
+		if (nameMappings == null) {
+			nameMappings = new HashMap<AbstractElement, String>() {
+				private static final long serialVersionUID = 1L;
+				{
+					put(grammarAccess.getWorkflowAccess().getAlternatives_2(), "rule__Workflow__Alternatives_2");
+					put(grammarAccess.getWorkflowAccess().getTypeAlternatives_2_0_0_0(), "rule__Workflow__TypeAlternatives_2_0_0_0");
+					put(grammarAccess.getWorkflowAccess().getElementAlternatives_2_0_4_0(), "rule__Workflow__ElementAlternatives_2_0_4_0");
+					put(grammarAccess.getPrologAccess().getAlternatives_0(), "rule__Prolog__Alternatives_0");
+					put(grammarAccess.getPrologAccess().getAlternatives_2(), "rule__Prolog__Alternatives_2");
+					put(grammarAccess.getPrologAccess().getAlternatives_4(), "rule__Prolog__Alternatives_4");
+					put(grammarAccess.getReservedWordAccess().getAlternatives(), "rule__ReservedWord__Alternatives");
+					put(grammarAccess.getXIDAccess().getAlternatives(), "rule__XID__Alternatives");
+					put(grammarAccess.getUFIAccess().getAlternatives_1_0(), "rule__UFI__Alternatives_1_0");
+					put(grammarAccess.getObjectAccess().getAlternatives(), "rule__Object__Alternatives");
+					put(grammarAccess.getObjectAccess().getElementAlternatives_0_5_0(), "rule__Object__ElementAlternatives_0_5_0");
+					put(grammarAccess.getObjectAccess().getAlternatives_1_2(), "rule__Object__Alternatives_1_2");
+					put(grammarAccess.getObjectAccess().getElementAlternatives_1_5_0(), "rule__Object__ElementAlternatives_1_5_0");
+					put(grammarAccess.getPropertyAccess().getAlternatives(), "rule__Property__Alternatives");
+					put(grammarAccess.getSectionAccess().getAlternatives_2(), "rule__Section__Alternatives_2");
+					put(grammarAccess.getSectionAccess().getElementAlternatives_2_0_1_0(), "rule__Section__ElementAlternatives_2_0_1_0");
+					put(grammarAccess.getSectionAccess().getElementAlternatives_2_1_1_0(), "rule__Section__ElementAlternatives_2_1_1_0");
+					put(grammarAccess.getExpressionAccess().getAlternatives(), "rule__Expression__Alternatives");
+					put(grammarAccess.getConditionalOrExpressionAccess().getOperatorAlternatives_1_1_0(), "rule__ConditionalOrExpression__OperatorAlternatives_1_1_0");
+					put(grammarAccess.getConditionalOrExpressionAccess().getAlternatives_1_3_0(), "rule__ConditionalOrExpression__Alternatives_1_3_0");
+					put(grammarAccess.getConditionalAndExpressionAccess().getOperatorAlternatives_1_1_0(), "rule__ConditionalAndExpression__OperatorAlternatives_1_1_0");
+					put(grammarAccess.getConditionalAndExpressionAccess().getAlternatives_1_3_0(), "rule__ConditionalAndExpression__Alternatives_1_3_0");
+					put(grammarAccess.getEqualityExpressionAccess().getOperatorAlternatives_1_1_0(), "rule__EqualityExpression__OperatorAlternatives_1_1_0");
+					put(grammarAccess.getRelationalExpressionAccess().getOperatorAlternatives_1_1_0(), "rule__RelationalExpression__OperatorAlternatives_1_1_0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1(), "rule__MultiplicativeExpression__Alternatives_1");
+					put(grammarAccess.getPrimaryExpressionAccess().getAlternatives(), "rule__PrimaryExpression__Alternatives");
+					put(grammarAccess.getPrimaryExpressionAccess().getOperatorAlternatives_2_1_0_0(), "rule__PrimaryExpression__OperatorAlternatives_2_1_0_0");
+					put(grammarAccess.getLiteralExpressionAccess().getAlternatives(), "rule__LiteralExpression__Alternatives");
+					put(grammarAccess.getLiteralObjectReferenceAccess().getAlternatives_1(), "rule__LiteralObjectReference__Alternatives_1");
+					put(grammarAccess.getLiteralVariableReferenceAccess().getAlternatives(), "rule__LiteralVariableReference__Alternatives");
+					put(grammarAccess.getLiteralInstanceReferenceAccess().getAlternatives(), "rule__LiteralInstanceReference__Alternatives");
+					put(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAlternatives_1_0(), "rule__LiteralEnvInstance__SymbolAlternatives_1_0");
+					put(grammarAccess.getEBooleanAccess().getAlternatives(), "rule__EBoolean__Alternatives");
+					put(grammarAccess.getDeprecatedReservedWordAccess().getAlternatives(), "rule__DeprecatedReservedWord__Alternatives");
+					put(grammarAccess.getDeprecatedObjectAccess().getAlternatives(), "rule__DeprecatedObject__Alternatives");
+					put(grammarAccess.getDeprecatedPropertyAccess().getAlternatives(), "rule__DeprecatedProperty__Alternatives");
+					put(grammarAccess.getDeprecatedSectionAccess().getAlternatives(), "rule__DeprecatedSection__Alternatives");
+					put(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_0_3_0(), "rule__DeprecatedSection__ElementAlternatives_0_3_0");
+					put(grammarAccess.getDeprecatedSectionAccess().getAlternatives_1_2(), "rule__DeprecatedSection__Alternatives_1_2");
+					put(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_0_1_0(), "rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0");
+					put(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_1_1_0(), "rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0");
+					put(grammarAccess.getDeprecatedAttributeIDAccess().getAlternatives(), "rule__DeprecatedAttributeID__Alternatives");
+					put(grammarAccess.getDeprecatedExpressionAccess().getOperatorAlternatives_2_0(), "rule__DeprecatedExpression__OperatorAlternatives_2_0");
+					put(grammarAccess.getWorkflowAccess().getGroup(), "rule__Workflow__Group__0");
+					put(grammarAccess.getWorkflowAccess().getGroup_2_0(), "rule__Workflow__Group_2_0__0");
+					put(grammarAccess.getPrologAccess().getGroup(), "rule__Prolog__Group__0");
+					put(grammarAccess.getPrologAccess().getGroup_3(), "rule__Prolog__Group_3__0");
+					put(grammarAccess.getPrologAccess().getGroup_4_0(), "rule__Prolog__Group_4_0__0");
+					put(grammarAccess.getUFIAccess().getGroup(), "rule__UFI__Group__0");
+					put(grammarAccess.getUFIAccess().getGroup_1(), "rule__UFI__Group_1__0");
+					put(grammarAccess.getObjectAccess().getGroup_0(), "rule__Object__Group_0__0");
+					put(grammarAccess.getObjectAccess().getGroup_1(), "rule__Object__Group_1__0");
+					put(grammarAccess.getObjectAccess().getGroup_1_3(), "rule__Object__Group_1_3__0");
+					put(grammarAccess.getSectionAccess().getGroup(), "rule__Section__Group__0");
+					put(grammarAccess.getSectionAccess().getGroup_2_0(), "rule__Section__Group_2_0__0");
+					put(grammarAccess.getSectionAccess().getGroup_2_1(), "rule__Section__Group_2_1__0");
+					put(grammarAccess.getAttributeAccess().getGroup(), "rule__Attribute__Group__0");
+					put(grammarAccess.getConditionalExpressionAccess().getGroup(), "rule__ConditionalExpression__Group__0");
+					put(grammarAccess.getConditionalExpressionAccess().getGroup_1(), "rule__ConditionalExpression__Group_1__0");
+					put(grammarAccess.getConditionalOrExpressionAccess().getGroup(), "rule__ConditionalOrExpression__Group__0");
+					put(grammarAccess.getConditionalOrExpressionAccess().getGroup_1(), "rule__ConditionalOrExpression__Group_1__0");
+					put(grammarAccess.getConditionalOrExpressionAccess().getGroup_1_3(), "rule__ConditionalOrExpression__Group_1_3__0");
+					put(grammarAccess.getConditionalAndExpressionAccess().getGroup(), "rule__ConditionalAndExpression__Group__0");
+					put(grammarAccess.getConditionalAndExpressionAccess().getGroup_1(), "rule__ConditionalAndExpression__Group_1__0");
+					put(grammarAccess.getConditionalAndExpressionAccess().getGroup_1_3(), "rule__ConditionalAndExpression__Group_1_3__0");
+					put(grammarAccess.getEqualityExpressionAccess().getGroup(), "rule__EqualityExpression__Group__0");
+					put(grammarAccess.getEqualityExpressionAccess().getGroup_1(), "rule__EqualityExpression__Group_1__0");
+					put(grammarAccess.getRelationalExpressionAccess().getGroup(), "rule__RelationalExpression__Group__0");
+					put(grammarAccess.getRelationalExpressionAccess().getGroup_1(), "rule__RelationalExpression__Group_1__0");
+					put(grammarAccess.getAdditiveExpressionAccess().getGroup(), "rule__AdditiveExpression__Group__0");
+					put(grammarAccess.getAdditiveExpressionAccess().getGroup_1(), "rule__AdditiveExpression__Group_1__0");
+					put(grammarAccess.getAdditiveExpressionAccess().getGroup_1_3(), "rule__AdditiveExpression__Group_1_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup(), "rule__MultiplicativeExpression__Group__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0(), "rule__MultiplicativeExpression__Group_1_0__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3(), "rule__MultiplicativeExpression__Group_1_0_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1(), "rule__MultiplicativeExpression__Group_1_1__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3(), "rule__MultiplicativeExpression__Group_1_1_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2(), "rule__MultiplicativeExpression__Group_1_2__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3(), "rule__MultiplicativeExpression__Group_1_2_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3(), "rule__MultiplicativeExpression__Group_1_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3(), "rule__MultiplicativeExpression__Group_1_3_3__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_0(), "rule__PrimaryExpression__Group_0__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_1(), "rule__PrimaryExpression__Group_1__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_1_1(), "rule__PrimaryExpression__Group_1_1__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_2(), "rule__PrimaryExpression__Group_2__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_2_1(), "rule__PrimaryExpression__Group_2_1__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_3(), "rule__PrimaryExpression__Group_3__0");
+					put(grammarAccess.getLiteralArrayValueAccess().getGroup(), "rule__LiteralArrayValue__Group__0");
+					put(grammarAccess.getLiteralArrayValueAccess().getGroup_2(), "rule__LiteralArrayValue__Group_2__0");
+					put(grammarAccess.getLiteralArrayValueAccess().getGroup_2_1(), "rule__LiteralArrayValue__Group_2_1__0");
+					put(grammarAccess.getLiteralObjectReferenceAccess().getGroup(), "rule__LiteralObjectReference__Group__0");
+					put(grammarAccess.getLiteralRationalValueAccess().getGroup(), "rule__LiteralRationalValue__Group__0");
+					put(grammarAccess.getLiteralNullValueAccess().getGroup(), "rule__LiteralNullValue__Group__0");
+					put(grammarAccess.getLiteralNullValueAccess().getGroup_2(), "rule__LiteralNullValue__Group_2__0");
+					put(grammarAccess.getLiteralTimeVariableAccess().getGroup(), "rule__LiteralTimeVariable__Group__0");
+					put(grammarAccess.getLiteralTimeDeltaVariableAccess().getGroup(), "rule__LiteralTimeDeltaVariable__Group__0");
+					put(grammarAccess.getLiteralThisInstanceAccess().getGroup(), "rule__LiteralThisInstance__Group__0");
+					put(grammarAccess.getLiteralSelfInstanceAccess().getGroup(), "rule__LiteralSelfInstance__Group__0");
+					put(grammarAccess.getLiteralParentInstanceAccess().getGroup(), "rule__LiteralParentInstance__Group__0");
+					put(grammarAccess.getLiteralSuperInstanceAccess().getGroup(), "rule__LiteralSuperInstance__Group__0");
+					put(grammarAccess.getLiteralSystemInstanceAccess().getGroup(), "rule__LiteralSystemInstance__Group__0");
+					put(grammarAccess.getLiteralEnvInstanceAccess().getGroup(), "rule__LiteralEnvInstance__Group__0");
+					put(grammarAccess.getELongAccess().getGroup(), "rule__ELong__Group__0");
+					put(grammarAccess.getEDoubleAccess().getGroup(), "rule__EDouble__Group__0");
+					put(grammarAccess.getEBigDecimalAccess().getGroup(), "rule__EBigDecimal__Group__0");
+					put(grammarAccess.getDeprecatedObjectAccess().getGroup_0(), "rule__DeprecatedObject__Group_0__0");
+					put(grammarAccess.getDeprecatedObjectAccess().getGroup_1(), "rule__DeprecatedObject__Group_1__0");
+					put(grammarAccess.getDeprecatedSectionAccess().getGroup_0(), "rule__DeprecatedSection__Group_0__0");
+					put(grammarAccess.getDeprecatedSectionAccess().getGroup_1(), "rule__DeprecatedSection__Group_1__0");
+					put(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_0(), "rule__DeprecatedSection__Group_1_2_0__0");
+					put(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_1(), "rule__DeprecatedSection__Group_1_2_1__0");
+					put(grammarAccess.getDeprecatedAttributeAccess().getGroup(), "rule__DeprecatedAttribute__Group__0");
+					put(grammarAccess.getDeprecatedExpressionAccess().getGroup(), "rule__DeprecatedExpression__Group__0");
+					put(grammarAccess.getWorkflowAccess().getTypeAssignment_2_0_0(), "rule__Workflow__TypeAssignment_2_0_0");
+					put(grammarAccess.getWorkflowAccess().getNameAssignment_2_0_1(), "rule__Workflow__NameAssignment_2_0_1");
+					put(grammarAccess.getWorkflowAccess().getDescriptionAssignment_2_0_2(), "rule__Workflow__DescriptionAssignment_2_0_2");
+					put(grammarAccess.getWorkflowAccess().getElementAssignment_2_0_4(), "rule__Workflow__ElementAssignment_2_0_4");
+					put(grammarAccess.getWorkflowAccess().getElementAssignment_2_1(), "rule__Workflow__ElementAssignment_2_1");
+					put(grammarAccess.getObjectAccess().getTypeAssignment_0_1(), "rule__Object__TypeAssignment_0_1");
+					put(grammarAccess.getObjectAccess().getNameAssignment_0_2(), "rule__Object__NameAssignment_0_2");
+					put(grammarAccess.getObjectAccess().getDescriptionAssignment_0_3(), "rule__Object__DescriptionAssignment_0_3");
+					put(grammarAccess.getObjectAccess().getElementAssignment_0_5(), "rule__Object__ElementAssignment_0_5");
+					put(grammarAccess.getObjectAccess().getNameAssignment_1_1(), "rule__Object__NameAssignment_1_1");
+					put(grammarAccess.getObjectAccess().getTypeAssignment_1_3_0(), "rule__Object__TypeAssignment_1_3_0");
+					put(grammarAccess.getObjectAccess().getDescriptionAssignment_1_3_1(), "rule__Object__DescriptionAssignment_1_3_1");
+					put(grammarAccess.getObjectAccess().getElementAssignment_1_5(), "rule__Object__ElementAssignment_1_5");
+					put(grammarAccess.getSectionAccess().getNameAssignment_0(), "rule__Section__NameAssignment_0");
+					put(grammarAccess.getSectionAccess().getDescriptionAssignment_1(), "rule__Section__DescriptionAssignment_1");
+					put(grammarAccess.getSectionAccess().getElementAssignment_2_0_1(), "rule__Section__ElementAssignment_2_0_1");
+					put(grammarAccess.getSectionAccess().getElementAssignment_2_1_1(), "rule__Section__ElementAssignment_2_1_1");
+					put(grammarAccess.getAttributeAccess().getNameAssignment_1(), "rule__Attribute__NameAssignment_1");
+					put(grammarAccess.getAttributeAccess().getValueAssignment_3(), "rule__Attribute__ValueAssignment_3");
+					put(grammarAccess.getConditionalExpressionAccess().getOperatorAssignment_1_1(), "rule__ConditionalExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_2(), "rule__ConditionalExpression__OperandAssignment_1_2");
+					put(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_4(), "rule__ConditionalExpression__OperandAssignment_1_4");
+					put(grammarAccess.getConditionalOrExpressionAccess().getOperatorAssignment_1_1(), "rule__ConditionalOrExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_2(), "rule__ConditionalOrExpression__OperandAssignment_1_2");
+					put(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_3_1(), "rule__ConditionalOrExpression__OperandAssignment_1_3_1");
+					put(grammarAccess.getConditionalAndExpressionAccess().getOperatorAssignment_1_1(), "rule__ConditionalAndExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_2(), "rule__ConditionalAndExpression__OperandAssignment_1_2");
+					put(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_3_1(), "rule__ConditionalAndExpression__OperandAssignment_1_3_1");
+					put(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1(), "rule__EqualityExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getEqualityExpressionAccess().getOperandAssignment_1_2(), "rule__EqualityExpression__OperandAssignment_1_2");
+					put(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1(), "rule__RelationalExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getRelationalExpressionAccess().getOperandAssignment_1_2(), "rule__RelationalExpression__OperandAssignment_1_2");
+					put(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1(), "rule__AdditiveExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_2(), "rule__AdditiveExpression__OperandAssignment_1_2");
+					put(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_3_1(), "rule__AdditiveExpression__OperandAssignment_1_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1(), "rule__MultiplicativeExpression__OperatorAssignment_1_0_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2(), "rule__MultiplicativeExpression__OperandAssignment_1_0_2");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1(), "rule__MultiplicativeExpression__OperandAssignment_1_0_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1(), "rule__MultiplicativeExpression__OperatorAssignment_1_1_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2(), "rule__MultiplicativeExpression__OperandAssignment_1_1_2");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1(), "rule__MultiplicativeExpression__OperandAssignment_1_1_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1(), "rule__MultiplicativeExpression__OperatorAssignment_1_2_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2(), "rule__MultiplicativeExpression__OperandAssignment_1_2_2");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1(), "rule__MultiplicativeExpression__OperandAssignment_1_2_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1(), "rule__MultiplicativeExpression__OperatorAssignment_1_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2(), "rule__MultiplicativeExpression__OperandAssignment_1_3_2");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1(), "rule__MultiplicativeExpression__OperandAssignment_1_3_3_1");
+					put(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_1_1_0(), "rule__PrimaryExpression__OperatorAssignment_1_1_0");
+					put(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_1_1_1(), "rule__PrimaryExpression__OperandAssignment_1_1_1");
+					put(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_2_1_0(), "rule__PrimaryExpression__OperatorAssignment_2_1_0");
+					put(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_2_1_1(), "rule__PrimaryExpression__OperandAssignment_2_1_1");
+					put(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_0(), "rule__LiteralArrayValue__ValuesAssignment_2_0");
+					put(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_1_1(), "rule__LiteralArrayValue__ValuesAssignment_2_1_1");
+					put(grammarAccess.getLiteralObjectReferenceAccess().getObjectAssignment_1_0(), "rule__LiteralObjectReference__ObjectAssignment_1_0");
+					put(grammarAccess.getLiteralObjectReferenceAccess().getSymbolAssignment_1_1(), "rule__LiteralObjectReference__SymbolAssignment_1_1");
+					put(grammarAccess.getLiteralBooleanValueAccess().getValueAssignment(), "rule__LiteralBooleanValue__ValueAssignment");
+					put(grammarAccess.getLiteralCharacterValueAccess().getValueAssignment(), "rule__LiteralCharacterValue__ValueAssignment");
+					put(grammarAccess.getLiteralIntegerValueAccess().getValueAssignment(), "rule__LiteralIntegerValue__ValueAssignment");
+					put(grammarAccess.getLiteralRationalValueAccess().getNumeratorAssignment_0(), "rule__LiteralRationalValue__NumeratorAssignment_0");
+					put(grammarAccess.getLiteralRationalValueAccess().getDenominatorAssignment_2(), "rule__LiteralRationalValue__DenominatorAssignment_2");
+					put(grammarAccess.getLiteralFloatValueAccess().getValueAssignment(), "rule__LiteralFloatValue__ValueAssignment");
+					put(grammarAccess.getLiteralRealValueAccess().getValueAssignment(), "rule__LiteralRealValue__ValueAssignment");
+					put(grammarAccess.getLiteralStringValueAccess().getValueAssignment(), "rule__LiteralStringValue__ValueAssignment");
+					put(grammarAccess.getLiteralNullValueAccess().getTypeAssignment_2_1(), "rule__LiteralNullValue__TypeAssignment_2_1");
+					put(grammarAccess.getLiteralTimeVariableAccess().getSymbolAssignment_1(), "rule__LiteralTimeVariable__SymbolAssignment_1");
+					put(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolAssignment_1(), "rule__LiteralTimeDeltaVariable__SymbolAssignment_1");
+					put(grammarAccess.getLiteralThisInstanceAccess().getSymbolAssignment_1(), "rule__LiteralThisInstance__SymbolAssignment_1");
+					put(grammarAccess.getLiteralSelfInstanceAccess().getSymbolAssignment_1(), "rule__LiteralSelfInstance__SymbolAssignment_1");
+					put(grammarAccess.getLiteralParentInstanceAccess().getSymbolAssignment_1(), "rule__LiteralParentInstance__SymbolAssignment_1");
+					put(grammarAccess.getLiteralSuperInstanceAccess().getSymbolAssignment_1(), "rule__LiteralSuperInstance__SymbolAssignment_1");
+					put(grammarAccess.getLiteralSystemInstanceAccess().getSymbolAssignment_1(), "rule__LiteralSystemInstance__SymbolAssignment_1");
+					put(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAssignment_1(), "rule__LiteralEnvInstance__SymbolAssignment_1");
+					put(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_0_2(), "rule__DeprecatedObject__NameAssignment_0_2");
+					put(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_0_3(), "rule__DeprecatedObject__DescriptionAssignment_0_3");
+					put(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_0_6(), "rule__DeprecatedObject__TypeAssignment_0_6");
+					put(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_0_8(), "rule__DeprecatedObject__ElementAssignment_0_8");
+					put(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_1_2(), "rule__DeprecatedObject__NameAssignment_1_2");
+					put(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_1_3(), "rule__DeprecatedObject__DescriptionAssignment_1_3");
+					put(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_1_6(), "rule__DeprecatedObject__TypeAssignment_1_6");
+					put(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_1_8(), "rule__DeprecatedObject__ElementAssignment_1_8");
+					put(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_0_2(), "rule__DeprecatedSection__NameAssignment_0_2");
+					put(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_0_3(), "rule__DeprecatedSection__ElementAssignment_0_3");
+					put(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_1_0(), "rule__DeprecatedSection__NameAssignment_1_0");
+					put(grammarAccess.getDeprecatedSectionAccess().getDescriptionAssignment_1_1(), "rule__DeprecatedSection__DescriptionAssignment_1_1");
+					put(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_0_1(), "rule__DeprecatedSection__ElementAssignment_1_2_0_1");
+					put(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_1_1(), "rule__DeprecatedSection__ElementAssignment_1_2_1_1");
+					put(grammarAccess.getDeprecatedAttributeAccess().getNameAssignment_1(), "rule__DeprecatedAttribute__NameAssignment_1");
+					put(grammarAccess.getDeprecatedAttributeAccess().getValueAssignment_3(), "rule__DeprecatedAttribute__ValueAssignment_3");
+					put(grammarAccess.getDeprecatedExpressionAccess().getOperatorAssignment_2(), "rule__DeprecatedExpression__OperatorAssignment_2");
+					put(grammarAccess.getDeprecatedExpressionAccess().getOperandAssignment_3(), "rule__DeprecatedExpression__OperandAssignment_3");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		try {
+			InternalSEWParser typedParser = (InternalSEWParser) parser;
+			typedParser.entryRuleWorkflow();
+			return typedParser.getFollowElements();
+		} catch(RecognitionException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
+	@Override
+	protected String[] getInitialHiddenTokens() {
+		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
+	}
+
+	public SEWGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(SEWGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEW.g b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEW.g
new file mode 100644
index 0000000..ec4626b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEW.g
@@ -0,0 +1,9804 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+grammar InternalSEW;
+
+options {
+	superClass=AbstractInternalContentAssistParser;
+	backtrack=true;
+}
+
+@lexer::header {
+package org.eclipse.efm.sew.xtext.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+}
+
+@parser::header {
+package org.eclipse.efm.sew.xtext.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.efm.sew.xtext.services.SEWGrammarAccess;
+
+}
+@parser::members {
+	private SEWGrammarAccess grammarAccess;
+
+	public void setGrammarAccess(SEWGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+
+	@Override
+	protected Grammar getGrammar() {
+		return grammarAccess.getGrammar();
+	}
+
+	@Override
+	protected String getValueForTokenName(String tokenName) {
+		return tokenName;
+	}
+}
+
+// Entry rule entryRuleWorkflow
+entryRuleWorkflow
+:
+{ before(grammarAccess.getWorkflowRule()); }
+	 ruleWorkflow
+{ after(grammarAccess.getWorkflowRule()); } 
+	 EOF 
+;
+
+// Rule Workflow
+ruleWorkflow 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getWorkflowAccess().getGroup()); }
+		(rule__Workflow__Group__0)
+		{ after(grammarAccess.getWorkflowAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleProlog
+entryRuleProlog
+:
+{ before(grammarAccess.getPrologRule()); }
+	 ruleProlog
+{ after(grammarAccess.getPrologRule()); } 
+	 EOF 
+;
+
+// Rule Prolog
+ruleProlog 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrologAccess().getGroup()); }
+		(rule__Prolog__Group__0)
+		{ after(grammarAccess.getPrologAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleReservedWord
+entryRuleReservedWord
+:
+{ before(grammarAccess.getReservedWordRule()); }
+	 ruleReservedWord
+{ after(grammarAccess.getReservedWordRule()); } 
+	 EOF 
+;
+
+// Rule ReservedWord
+ruleReservedWord 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getReservedWordAccess().getAlternatives()); }
+		(rule__ReservedWord__Alternatives)
+		{ after(grammarAccess.getReservedWordAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXID
+entryRuleXID
+:
+{ before(grammarAccess.getXIDRule()); }
+	 ruleXID
+{ after(grammarAccess.getXIDRule()); } 
+	 EOF 
+;
+
+// Rule XID
+ruleXID 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXIDAccess().getAlternatives()); }
+		(rule__XID__Alternatives)
+		{ after(grammarAccess.getXIDAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleUFI
+entryRuleUFI
+:
+{ before(grammarAccess.getUFIRule()); }
+	 ruleUFI
+{ after(grammarAccess.getUFIRule()); } 
+	 EOF 
+;
+
+// Rule UFI
+ruleUFI 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getUFIAccess().getGroup()); }
+		(rule__UFI__Group__0)
+		{ after(grammarAccess.getUFIAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleObject
+entryRuleObject
+:
+{ before(grammarAccess.getObjectRule()); }
+	 ruleObject
+{ after(grammarAccess.getObjectRule()); } 
+	 EOF 
+;
+
+// Rule Object
+ruleObject 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getObjectAccess().getAlternatives()); }
+		(rule__Object__Alternatives)
+		{ after(grammarAccess.getObjectAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleProperty
+entryRuleProperty
+:
+{ before(grammarAccess.getPropertyRule()); }
+	 ruleProperty
+{ after(grammarAccess.getPropertyRule()); } 
+	 EOF 
+;
+
+// Rule Property
+ruleProperty 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyAccess().getAlternatives()); }
+		(rule__Property__Alternatives)
+		{ after(grammarAccess.getPropertyAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSection
+entryRuleSection
+:
+{ before(grammarAccess.getSectionRule()); }
+	 ruleSection
+{ after(grammarAccess.getSectionRule()); } 
+	 EOF 
+;
+
+// Rule Section
+ruleSection 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSectionAccess().getGroup()); }
+		(rule__Section__Group__0)
+		{ after(grammarAccess.getSectionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleAttribute
+entryRuleAttribute
+:
+{ before(grammarAccess.getAttributeRule()); }
+	 ruleAttribute
+{ after(grammarAccess.getAttributeRule()); } 
+	 EOF 
+;
+
+// Rule Attribute
+ruleAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getAttributeAccess().getGroup()); }
+		(rule__Attribute__Group__0)
+		{ after(grammarAccess.getAttributeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleValueSpecification
+entryRuleValueSpecification
+:
+{ before(grammarAccess.getValueSpecificationRule()); }
+	 ruleValueSpecification
+{ after(grammarAccess.getValueSpecificationRule()); } 
+	 EOF 
+;
+
+// Rule ValueSpecification
+ruleValueSpecification 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getValueSpecificationAccess().getExpressionParserRuleCall()); }
+		ruleExpression
+		{ after(grammarAccess.getValueSpecificationAccess().getExpressionParserRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleExpression
+entryRuleExpression
+:
+{ before(grammarAccess.getExpressionRule()); }
+	 ruleExpression
+{ after(grammarAccess.getExpressionRule()); } 
+	 EOF 
+;
+
+// Rule Expression
+ruleExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getExpressionAccess().getAlternatives()); }
+		(rule__Expression__Alternatives)
+		{ after(grammarAccess.getExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleconditionalExpression
+entryRuleconditionalExpression
+:
+{ before(grammarAccess.getConditionalExpressionRule()); }
+	 ruleconditionalExpression
+{ after(grammarAccess.getConditionalExpressionRule()); } 
+	 EOF 
+;
+
+// Rule conditionalExpression
+ruleconditionalExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getConditionalExpressionAccess().getGroup()); }
+		(rule__ConditionalExpression__Group__0)
+		{ after(grammarAccess.getConditionalExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleconditionalOrExpression
+entryRuleconditionalOrExpression
+:
+{ before(grammarAccess.getConditionalOrExpressionRule()); }
+	 ruleconditionalOrExpression
+{ after(grammarAccess.getConditionalOrExpressionRule()); } 
+	 EOF 
+;
+
+// Rule conditionalOrExpression
+ruleconditionalOrExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getConditionalOrExpressionAccess().getGroup()); }
+		(rule__ConditionalOrExpression__Group__0)
+		{ after(grammarAccess.getConditionalOrExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleconditionalAndExpression
+entryRuleconditionalAndExpression
+:
+{ before(grammarAccess.getConditionalAndExpressionRule()); }
+	 ruleconditionalAndExpression
+{ after(grammarAccess.getConditionalAndExpressionRule()); } 
+	 EOF 
+;
+
+// Rule conditionalAndExpression
+ruleconditionalAndExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getConditionalAndExpressionAccess().getGroup()); }
+		(rule__ConditionalAndExpression__Group__0)
+		{ after(grammarAccess.getConditionalAndExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleequalityExpression
+entryRuleequalityExpression
+:
+{ before(grammarAccess.getEqualityExpressionRule()); }
+	 ruleequalityExpression
+{ after(grammarAccess.getEqualityExpressionRule()); } 
+	 EOF 
+;
+
+// Rule equalityExpression
+ruleequalityExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getGroup()); }
+		(rule__EqualityExpression__Group__0)
+		{ after(grammarAccess.getEqualityExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulerelationalExpression
+entryRulerelationalExpression
+:
+{ before(grammarAccess.getRelationalExpressionRule()); }
+	 rulerelationalExpression
+{ after(grammarAccess.getRelationalExpressionRule()); } 
+	 EOF 
+;
+
+// Rule relationalExpression
+rulerelationalExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getGroup()); }
+		(rule__RelationalExpression__Group__0)
+		{ after(grammarAccess.getRelationalExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleadditiveExpression
+entryRuleadditiveExpression
+:
+{ before(grammarAccess.getAdditiveExpressionRule()); }
+	 ruleadditiveExpression
+{ after(grammarAccess.getAdditiveExpressionRule()); } 
+	 EOF 
+;
+
+// Rule additiveExpression
+ruleadditiveExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getGroup()); }
+		(rule__AdditiveExpression__Group__0)
+		{ after(grammarAccess.getAdditiveExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulemultiplicativeExpression
+entryRulemultiplicativeExpression
+:
+{ before(grammarAccess.getMultiplicativeExpressionRule()); }
+	 rulemultiplicativeExpression
+{ after(grammarAccess.getMultiplicativeExpressionRule()); } 
+	 EOF 
+;
+
+// Rule multiplicativeExpression
+rulemultiplicativeExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup()); }
+		(rule__MultiplicativeExpression__Group__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleprimaryExpression
+entryRuleprimaryExpression
+:
+{ before(grammarAccess.getPrimaryExpressionRule()); }
+	 ruleprimaryExpression
+{ after(grammarAccess.getPrimaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule primaryExpression
+ruleprimaryExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getAlternatives()); }
+		(rule__PrimaryExpression__Alternatives)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralExpression
+entryRuleLiteralExpression
+:
+{ before(grammarAccess.getLiteralExpressionRule()); }
+	 ruleLiteralExpression
+{ after(grammarAccess.getLiteralExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralExpression
+ruleLiteralExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getAlternatives()); }
+		(rule__LiteralExpression__Alternatives)
+		{ after(grammarAccess.getLiteralExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralArrayValue
+entryRuleLiteralArrayValue
+:
+{ before(grammarAccess.getLiteralArrayValueRule()); }
+	 ruleLiteralArrayValue
+{ after(grammarAccess.getLiteralArrayValueRule()); } 
+	 EOF 
+;
+
+// Rule LiteralArrayValue
+ruleLiteralArrayValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralArrayValueAccess().getGroup()); }
+		(rule__LiteralArrayValue__Group__0)
+		{ after(grammarAccess.getLiteralArrayValueAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralObjectReference
+entryRuleLiteralObjectReference
+:
+{ before(grammarAccess.getLiteralObjectReferenceRule()); }
+	 ruleLiteralObjectReference
+{ after(grammarAccess.getLiteralObjectReferenceRule()); } 
+	 EOF 
+;
+
+// Rule LiteralObjectReference
+ruleLiteralObjectReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralObjectReferenceAccess().getGroup()); }
+		(rule__LiteralObjectReference__Group__0)
+		{ after(grammarAccess.getLiteralObjectReferenceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralBooleanValue
+entryRuleLiteralBooleanValue
+:
+{ before(grammarAccess.getLiteralBooleanValueRule()); }
+	 ruleLiteralBooleanValue
+{ after(grammarAccess.getLiteralBooleanValueRule()); } 
+	 EOF 
+;
+
+// Rule LiteralBooleanValue
+ruleLiteralBooleanValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralBooleanValueAccess().getValueAssignment()); }
+		(rule__LiteralBooleanValue__ValueAssignment)
+		{ after(grammarAccess.getLiteralBooleanValueAccess().getValueAssignment()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralCharacterValue
+entryRuleLiteralCharacterValue
+:
+{ before(grammarAccess.getLiteralCharacterValueRule()); }
+	 ruleLiteralCharacterValue
+{ after(grammarAccess.getLiteralCharacterValueRule()); } 
+	 EOF 
+;
+
+// Rule LiteralCharacterValue
+ruleLiteralCharacterValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralCharacterValueAccess().getValueAssignment()); }
+		(rule__LiteralCharacterValue__ValueAssignment)
+		{ after(grammarAccess.getLiteralCharacterValueAccess().getValueAssignment()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralIntegerValue
+entryRuleLiteralIntegerValue
+:
+{ before(grammarAccess.getLiteralIntegerValueRule()); }
+	 ruleLiteralIntegerValue
+{ after(grammarAccess.getLiteralIntegerValueRule()); } 
+	 EOF 
+;
+
+// Rule LiteralIntegerValue
+ruleLiteralIntegerValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralIntegerValueAccess().getValueAssignment()); }
+		(rule__LiteralIntegerValue__ValueAssignment)
+		{ after(grammarAccess.getLiteralIntegerValueAccess().getValueAssignment()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralRationalValue
+entryRuleLiteralRationalValue
+:
+{ before(grammarAccess.getLiteralRationalValueRule()); }
+	 ruleLiteralRationalValue
+{ after(grammarAccess.getLiteralRationalValueRule()); } 
+	 EOF 
+;
+
+// Rule LiteralRationalValue
+ruleLiteralRationalValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralRationalValueAccess().getGroup()); }
+		(rule__LiteralRationalValue__Group__0)
+		{ after(grammarAccess.getLiteralRationalValueAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralFloatValue
+entryRuleLiteralFloatValue
+:
+{ before(grammarAccess.getLiteralFloatValueRule()); }
+	 ruleLiteralFloatValue
+{ after(grammarAccess.getLiteralFloatValueRule()); } 
+	 EOF 
+;
+
+// Rule LiteralFloatValue
+ruleLiteralFloatValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralFloatValueAccess().getValueAssignment()); }
+		(rule__LiteralFloatValue__ValueAssignment)
+		{ after(grammarAccess.getLiteralFloatValueAccess().getValueAssignment()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralStringValue
+entryRuleLiteralStringValue
+:
+{ before(grammarAccess.getLiteralStringValueRule()); }
+	 ruleLiteralStringValue
+{ after(grammarAccess.getLiteralStringValueRule()); } 
+	 EOF 
+;
+
+// Rule LiteralStringValue
+ruleLiteralStringValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralStringValueAccess().getValueAssignment()); }
+		(rule__LiteralStringValue__ValueAssignment)
+		{ after(grammarAccess.getLiteralStringValueAccess().getValueAssignment()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralNullValue
+entryRuleLiteralNullValue
+:
+{ before(grammarAccess.getLiteralNullValueRule()); }
+	 ruleLiteralNullValue
+{ after(grammarAccess.getLiteralNullValueRule()); } 
+	 EOF 
+;
+
+// Rule LiteralNullValue
+ruleLiteralNullValue 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralNullValueAccess().getGroup()); }
+		(rule__LiteralNullValue__Group__0)
+		{ after(grammarAccess.getLiteralNullValueAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralVariableReference
+entryRuleLiteralVariableReference
+:
+{ before(grammarAccess.getLiteralVariableReferenceRule()); }
+	 ruleLiteralVariableReference
+{ after(grammarAccess.getLiteralVariableReferenceRule()); } 
+	 EOF 
+;
+
+// Rule LiteralVariableReference
+ruleLiteralVariableReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralVariableReferenceAccess().getAlternatives()); }
+		(rule__LiteralVariableReference__Alternatives)
+		{ after(grammarAccess.getLiteralVariableReferenceAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralTimeVariable
+entryRuleLiteralTimeVariable
+:
+{ before(grammarAccess.getLiteralTimeVariableRule()); }
+	 ruleLiteralTimeVariable
+{ after(grammarAccess.getLiteralTimeVariableRule()); } 
+	 EOF 
+;
+
+// Rule LiteralTimeVariable
+ruleLiteralTimeVariable 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralTimeVariableAccess().getGroup()); }
+		(rule__LiteralTimeVariable__Group__0)
+		{ after(grammarAccess.getLiteralTimeVariableAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralTimeDeltaVariable
+entryRuleLiteralTimeDeltaVariable
+:
+{ before(grammarAccess.getLiteralTimeDeltaVariableRule()); }
+	 ruleLiteralTimeDeltaVariable
+{ after(grammarAccess.getLiteralTimeDeltaVariableRule()); } 
+	 EOF 
+;
+
+// Rule LiteralTimeDeltaVariable
+ruleLiteralTimeDeltaVariable 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralTimeDeltaVariableAccess().getGroup()); }
+		(rule__LiteralTimeDeltaVariable__Group__0)
+		{ after(grammarAccess.getLiteralTimeDeltaVariableAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralInstanceReference
+entryRuleLiteralInstanceReference
+:
+{ before(grammarAccess.getLiteralInstanceReferenceRule()); }
+	 ruleLiteralInstanceReference
+{ after(grammarAccess.getLiteralInstanceReferenceRule()); } 
+	 EOF 
+;
+
+// Rule LiteralInstanceReference
+ruleLiteralInstanceReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralInstanceReferenceAccess().getAlternatives()); }
+		(rule__LiteralInstanceReference__Alternatives)
+		{ after(grammarAccess.getLiteralInstanceReferenceAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralThisInstance
+entryRuleLiteralThisInstance
+:
+{ before(grammarAccess.getLiteralThisInstanceRule()); }
+	 ruleLiteralThisInstance
+{ after(grammarAccess.getLiteralThisInstanceRule()); } 
+	 EOF 
+;
+
+// Rule LiteralThisInstance
+ruleLiteralThisInstance 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralThisInstanceAccess().getGroup()); }
+		(rule__LiteralThisInstance__Group__0)
+		{ after(grammarAccess.getLiteralThisInstanceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralSelfInstance
+entryRuleLiteralSelfInstance
+:
+{ before(grammarAccess.getLiteralSelfInstanceRule()); }
+	 ruleLiteralSelfInstance
+{ after(grammarAccess.getLiteralSelfInstanceRule()); } 
+	 EOF 
+;
+
+// Rule LiteralSelfInstance
+ruleLiteralSelfInstance 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralSelfInstanceAccess().getGroup()); }
+		(rule__LiteralSelfInstance__Group__0)
+		{ after(grammarAccess.getLiteralSelfInstanceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralParentInstance
+entryRuleLiteralParentInstance
+:
+{ before(grammarAccess.getLiteralParentInstanceRule()); }
+	 ruleLiteralParentInstance
+{ after(grammarAccess.getLiteralParentInstanceRule()); } 
+	 EOF 
+;
+
+// Rule LiteralParentInstance
+ruleLiteralParentInstance 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralParentInstanceAccess().getGroup()); }
+		(rule__LiteralParentInstance__Group__0)
+		{ after(grammarAccess.getLiteralParentInstanceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralSuperInstance
+entryRuleLiteralSuperInstance
+:
+{ before(grammarAccess.getLiteralSuperInstanceRule()); }
+	 ruleLiteralSuperInstance
+{ after(grammarAccess.getLiteralSuperInstanceRule()); } 
+	 EOF 
+;
+
+// Rule LiteralSuperInstance
+ruleLiteralSuperInstance 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralSuperInstanceAccess().getGroup()); }
+		(rule__LiteralSuperInstance__Group__0)
+		{ after(grammarAccess.getLiteralSuperInstanceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralSystemInstance
+entryRuleLiteralSystemInstance
+:
+{ before(grammarAccess.getLiteralSystemInstanceRule()); }
+	 ruleLiteralSystemInstance
+{ after(grammarAccess.getLiteralSystemInstanceRule()); } 
+	 EOF 
+;
+
+// Rule LiteralSystemInstance
+ruleLiteralSystemInstance 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralSystemInstanceAccess().getGroup()); }
+		(rule__LiteralSystemInstance__Group__0)
+		{ after(grammarAccess.getLiteralSystemInstanceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralEnvInstance
+entryRuleLiteralEnvInstance
+:
+{ before(grammarAccess.getLiteralEnvInstanceRule()); }
+	 ruleLiteralEnvInstance
+{ after(grammarAccess.getLiteralEnvInstanceRule()); } 
+	 EOF 
+;
+
+// Rule LiteralEnvInstance
+ruleLiteralEnvInstance 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralEnvInstanceAccess().getGroup()); }
+		(rule__LiteralEnvInstance__Group__0)
+		{ after(grammarAccess.getLiteralEnvInstanceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEBoolean
+entryRuleEBoolean
+:
+{ before(grammarAccess.getEBooleanRule()); }
+	 ruleEBoolean
+{ after(grammarAccess.getEBooleanRule()); } 
+	 EOF 
+;
+
+// Rule EBoolean
+ruleEBoolean 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEBooleanAccess().getAlternatives()); }
+		(rule__EBoolean__Alternatives)
+		{ after(grammarAccess.getEBooleanAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEChar
+entryRuleEChar
+:
+{ before(grammarAccess.getECharRule()); }
+	 ruleEChar
+{ after(grammarAccess.getECharRule()); } 
+	 EOF 
+;
+
+// Rule EChar
+ruleEChar 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getECharAccess().getCHARACTERTerminalRuleCall()); }
+		RULE_CHARACTER
+		{ after(grammarAccess.getECharAccess().getCHARACTERTerminalRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleELong
+entryRuleELong
+:
+{ before(grammarAccess.getELongRule()); }
+	 ruleELong
+{ after(grammarAccess.getELongRule()); } 
+	 EOF 
+;
+
+// Rule ELong
+ruleELong 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getELongAccess().getGroup()); }
+		(rule__ELong__Group__0)
+		{ after(grammarAccess.getELongAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEDouble
+entryRuleEDouble
+:
+{ before(grammarAccess.getEDoubleRule()); }
+	 ruleEDouble
+{ after(grammarAccess.getEDoubleRule()); } 
+	 EOF 
+;
+
+// Rule EDouble
+ruleEDouble 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEDoubleAccess().getGroup()); }
+		(rule__EDouble__Group__0)
+		{ after(grammarAccess.getEDoubleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEBigDecimal
+entryRuleEBigDecimal
+:
+{ before(grammarAccess.getEBigDecimalRule()); }
+	 ruleEBigDecimal
+{ after(grammarAccess.getEBigDecimalRule()); } 
+	 EOF 
+;
+
+// Rule EBigDecimal
+ruleEBigDecimal 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEBigDecimalAccess().getGroup()); }
+		(rule__EBigDecimal__Group__0)
+		{ after(grammarAccess.getEBigDecimalAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEString
+entryRuleEString
+:
+{ before(grammarAccess.getEStringRule()); }
+	 ruleEString
+{ after(grammarAccess.getEStringRule()); } 
+	 EOF 
+;
+
+// Rule EString
+ruleEString 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall()); }
+		RULE_STRING
+		{ after(grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDeprecatedReservedWord
+entryRuleDeprecatedReservedWord
+:
+{ before(grammarAccess.getDeprecatedReservedWordRule()); }
+	 ruleDeprecatedReservedWord
+{ after(grammarAccess.getDeprecatedReservedWordRule()); } 
+	 EOF 
+;
+
+// Rule DeprecatedReservedWord
+ruleDeprecatedReservedWord 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDeprecatedReservedWordAccess().getAlternatives()); }
+		(rule__DeprecatedReservedWord__Alternatives)
+		{ after(grammarAccess.getDeprecatedReservedWordAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDeprecatedObject
+entryRuleDeprecatedObject
+:
+{ before(grammarAccess.getDeprecatedObjectRule()); }
+	 ruleDeprecatedObject
+{ after(grammarAccess.getDeprecatedObjectRule()); } 
+	 EOF 
+;
+
+// Rule DeprecatedObject
+ruleDeprecatedObject 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getAlternatives()); }
+		(rule__DeprecatedObject__Alternatives)
+		{ after(grammarAccess.getDeprecatedObjectAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDeprecatedProperty
+entryRuleDeprecatedProperty
+:
+{ before(grammarAccess.getDeprecatedPropertyRule()); }
+	 ruleDeprecatedProperty
+{ after(grammarAccess.getDeprecatedPropertyRule()); } 
+	 EOF 
+;
+
+// Rule DeprecatedProperty
+ruleDeprecatedProperty 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDeprecatedPropertyAccess().getAlternatives()); }
+		(rule__DeprecatedProperty__Alternatives)
+		{ after(grammarAccess.getDeprecatedPropertyAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDeprecatedSection
+entryRuleDeprecatedSection
+:
+{ before(grammarAccess.getDeprecatedSectionRule()); }
+	 ruleDeprecatedSection
+{ after(grammarAccess.getDeprecatedSectionRule()); } 
+	 EOF 
+;
+
+// Rule DeprecatedSection
+ruleDeprecatedSection 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getAlternatives()); }
+		(rule__DeprecatedSection__Alternatives)
+		{ after(grammarAccess.getDeprecatedSectionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDeprecatedAttribute
+entryRuleDeprecatedAttribute
+:
+{ before(grammarAccess.getDeprecatedAttributeRule()); }
+	 ruleDeprecatedAttribute
+{ after(grammarAccess.getDeprecatedAttributeRule()); } 
+	 EOF 
+;
+
+// Rule DeprecatedAttribute
+ruleDeprecatedAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDeprecatedAttributeAccess().getGroup()); }
+		(rule__DeprecatedAttribute__Group__0)
+		{ after(grammarAccess.getDeprecatedAttributeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDeprecatedAttributeID
+entryRuleDeprecatedAttributeID
+:
+{ before(grammarAccess.getDeprecatedAttributeIDRule()); }
+	 ruleDeprecatedAttributeID
+{ after(grammarAccess.getDeprecatedAttributeIDRule()); } 
+	 EOF 
+;
+
+// Rule DeprecatedAttributeID
+ruleDeprecatedAttributeID 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDeprecatedAttributeIDAccess().getAlternatives()); }
+		(rule__DeprecatedAttributeID__Alternatives)
+		{ after(grammarAccess.getDeprecatedAttributeIDAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDeprecatedExpression
+entryRuleDeprecatedExpression
+:
+{ before(grammarAccess.getDeprecatedExpressionRule()); }
+	 ruleDeprecatedExpression
+{ after(grammarAccess.getDeprecatedExpressionRule()); } 
+	 EOF 
+;
+
+// Rule DeprecatedExpression
+ruleDeprecatedExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDeprecatedExpressionAccess().getGroup()); }
+		(rule__DeprecatedExpression__Group__0)
+		{ after(grammarAccess.getDeprecatedExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWorkflowAccess().getGroup_2_0()); }
+		(rule__Workflow__Group_2_0__0)
+		{ after(grammarAccess.getWorkflowAccess().getGroup_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getWorkflowAccess().getElementAssignment_2_1()); }
+		(rule__Workflow__ElementAssignment_2_1)
+		{ after(grammarAccess.getWorkflowAccess().getElementAssignment_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__TypeAlternatives_2_0_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWorkflowAccess().getTypeWorkflowKeyword_2_0_0_0_0()); }
+		'workflow'
+		{ after(grammarAccess.getWorkflowAccess().getTypeWorkflowKeyword_2_0_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getWorkflowAccess().getTypeSymbexWorkflowKeyword_2_0_0_0_1()); }
+		'symbex-workflow'
+		{ after(grammarAccess.getWorkflowAccess().getTypeSymbexWorkflowKeyword_2_0_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__ElementAlternatives_2_0_4_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWorkflowAccess().getElementObjectParserRuleCall_2_0_4_0_0()); }
+		ruleObject
+		{ after(grammarAccess.getWorkflowAccess().getElementObjectParserRuleCall_2_0_4_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getWorkflowAccess().getElementPropertyParserRuleCall_2_0_4_0_1()); }
+		ruleProperty
+		{ after(grammarAccess.getWorkflowAccess().getElementPropertyParserRuleCall_2_0_4_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Alternatives_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrologAccess().getSewKeyword_0_0()); }
+		'@sew'
+		{ after(grammarAccess.getPrologAccess().getSewKeyword_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrologAccess().getFavmKeyword_0_1()); }
+		'@favm'
+		{ after(grammarAccess.getPrologAccess().getFavmKeyword_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrologAccess().getWorkflowKeyword_2_0()); }
+		'workflow'
+		{ after(grammarAccess.getPrologAccess().getWorkflowKeyword_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrologAccess().getSewKeyword_2_1()); }
+		'sew'
+		{ after(grammarAccess.getPrologAccess().getSewKeyword_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Alternatives_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrologAccess().getGroup_4_0()); }
+		(rule__Prolog__Group_4_0__0)
+		{ after(grammarAccess.getPrologAccess().getGroup_4_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrologAccess().getEStringParserRuleCall_4_1()); }
+		ruleEString
+		{ after(grammarAccess.getPrologAccess().getEStringParserRuleCall_4_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReservedWord__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getReservedWordAccess().getWorkflowKeyword_0()); }
+		'workflow'
+		{ after(grammarAccess.getReservedWordAccess().getWorkflowKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getReservedWordAccess().getSewKeyword_1()); }
+		'sew'
+		{ after(grammarAccess.getReservedWordAccess().getSewKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getReservedWordAccess().getDeprecatedReservedWordParserRuleCall_2()); }
+		ruleDeprecatedReservedWord
+		{ after(grammarAccess.getReservedWordAccess().getDeprecatedReservedWordParserRuleCall_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XID__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXIDAccess().getReservedWordParserRuleCall_0()); }
+		ruleReservedWord
+		{ after(grammarAccess.getXIDAccess().getReservedWordParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXIDAccess().getXIDENDIFIERTerminalRuleCall_1()); }
+		RULE_XIDENDIFIER
+		{ after(grammarAccess.getXIDAccess().getXIDENDIFIERTerminalRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UFI__Alternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUFIAccess().getColonColonKeyword_1_0_0()); }
+		'::'
+		{ after(grammarAccess.getUFIAccess().getColonColonKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getUFIAccess().getFullStopKeyword_1_0_1()); }
+		'.'
+		{ after(grammarAccess.getUFIAccess().getFullStopKeyword_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getGroup_0()); }
+		(rule__Object__Group_0__0)
+		{ after(grammarAccess.getObjectAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getObjectAccess().getGroup_1()); }
+		(rule__Object__Group_1__0)
+		{ after(grammarAccess.getObjectAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__ElementAlternatives_0_5_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_0_5_0_0()); }
+		ruleObject
+		{ after(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_0_5_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_0_5_0_1()); }
+		ruleProperty
+		{ after(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_0_5_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Alternatives_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getColonEqualsSignKeyword_1_2_0()); }
+		':='
+		{ after(grammarAccess.getObjectAccess().getColonEqualsSignKeyword_1_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getObjectAccess().getPlusSignColonEqualsSignKeyword_1_2_1()); }
+		'+:='
+		{ after(grammarAccess.getObjectAccess().getPlusSignColonEqualsSignKeyword_1_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__ElementAlternatives_1_5_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_1_5_0_0()); }
+		ruleObject
+		{ after(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_1_5_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_1_5_0_1()); }
+		ruleProperty
+		{ after(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_1_5_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyAccess().getSectionParserRuleCall_0()); }
+		ruleSection
+		{ after(grammarAccess.getPropertyAccess().getSectionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyAccess().getAttributeParserRuleCall_1()); }
+		ruleAttribute
+		{ after(grammarAccess.getPropertyAccess().getAttributeParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSectionAccess().getGroup_2_0()); }
+		(rule__Section__Group_2_0__0)
+		{ after(grammarAccess.getSectionAccess().getGroup_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSectionAccess().getGroup_2_1()); }
+		(rule__Section__Group_2_1__0)
+		{ after(grammarAccess.getSectionAccess().getGroup_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__ElementAlternatives_2_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_0_1_0_0()); }
+		ruleObject
+		{ after(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_0_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_0_1_0_1()); }
+		ruleAttribute
+		{ after(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_0_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__ElementAlternatives_2_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_1_1_0_0()); }
+		ruleObject
+		{ after(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_1_1_0_1()); }
+		ruleAttribute
+		{ after(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_1_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Expression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getExpressionAccess().getConditionalExpressionParserRuleCall_0()); }
+		ruleconditionalExpression
+		{ after(grammarAccess.getExpressionAccess().getConditionalExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getExpressionAccess().getDeprecatedExpressionParserRuleCall_1()); }
+		ruleDeprecatedExpression
+		{ after(grammarAccess.getExpressionAccess().getDeprecatedExpressionParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__OperatorAlternatives_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0()); }
+		'||'
+		{ after(grammarAccess.getConditionalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getConditionalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1()); }
+		'or'
+		{ after(grammarAccess.getConditionalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Alternatives_1_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()); }
+		'||'
+		{ after(grammarAccess.getConditionalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getConditionalOrExpressionAccess().getOrKeyword_1_3_0_1()); }
+		'or'
+		{ after(grammarAccess.getConditionalOrExpressionAccess().getOrKeyword_1_3_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__OperatorAlternatives_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0()); }
+		'&&'
+		{ after(grammarAccess.getConditionalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getConditionalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1()); }
+		'and'
+		{ after(grammarAccess.getConditionalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Alternatives_1_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()); }
+		'&&'
+		{ after(grammarAccess.getConditionalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getConditionalAndExpressionAccess().getAndKeyword_1_3_0_1()); }
+		'and'
+		{ after(grammarAccess.getConditionalAndExpressionAccess().getAndKeyword_1_3_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__OperatorAlternatives_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignKeyword_1_1_0_0()); }
+		'=='
+		{ after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignKeyword_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getOperatorExclamationMarkEqualsSignKeyword_1_1_0_1()); }
+		'!='
+		{ after(grammarAccess.getEqualityExpressionAccess().getOperatorExclamationMarkEqualsSignKeyword_1_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignEqualsSignKeyword_1_1_0_2()); }
+		'==='
+		{ after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignEqualsSignKeyword_1_1_0_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignExclamationMarkEqualsSignKeyword_1_1_0_3()); }
+		'=!='
+		{ after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignExclamationMarkEqualsSignKeyword_1_1_0_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignSolidusEqualsSignKeyword_1_1_0_4()); }
+		'=/='
+		{ after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignSolidusEqualsSignKeyword_1_1_0_4()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__OperatorAlternatives_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignKeyword_1_1_0_0()); }
+		'<'
+		{ after(grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignKeyword_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignEqualsSignKeyword_1_1_0_1()); }
+		'<='
+		{ after(grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignEqualsSignKeyword_1_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignKeyword_1_1_0_2()); }
+		'>'
+		{ after(grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignKeyword_1_1_0_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignEqualsSignKeyword_1_1_0_3()); }
+		'>='
+		{ after(grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignEqualsSignKeyword_1_1_0_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0()); }
+		(rule__MultiplicativeExpression__Group_1_0__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1()); }
+		(rule__MultiplicativeExpression__Group_1_1__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2()); }
+		(rule__MultiplicativeExpression__Group_1_2__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3()); }
+		(rule__MultiplicativeExpression__Group_1_3__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_0()); }
+		(rule__PrimaryExpression__Group_0__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_1()); }
+		(rule__PrimaryExpression__Group_1__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_2()); }
+		(rule__PrimaryExpression__Group_2__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_3()); }
+		(rule__PrimaryExpression__Group_3__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getLiteralExpressionParserRuleCall_4()); }
+		ruleLiteralExpression
+		{ after(grammarAccess.getPrimaryExpressionAccess().getLiteralExpressionParserRuleCall_4()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__OperatorAlternatives_2_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getOperatorExclamationMarkKeyword_2_1_0_0_0()); }
+		'!'
+		{ after(grammarAccess.getPrimaryExpressionAccess().getOperatorExclamationMarkKeyword_2_1_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getOperatorNotKeyword_2_1_0_0_1()); }
+		'not'
+		{ after(grammarAccess.getPrimaryExpressionAccess().getOperatorNotKeyword_2_1_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralBooleanValueParserRuleCall_0()); }
+		ruleLiteralBooleanValue
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralBooleanValueParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralCharacterValueParserRuleCall_1()); }
+		ruleLiteralCharacterValue
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralCharacterValueParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralIntegerValueParserRuleCall_2()); }
+		ruleLiteralIntegerValue
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralIntegerValueParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralRationalValueParserRuleCall_3()); }
+		ruleLiteralRationalValue
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralRationalValueParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralFloatValueParserRuleCall_4()); }
+		ruleLiteralFloatValue
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralFloatValueParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralStringValueParserRuleCall_5()); }
+		ruleLiteralStringValue
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralStringValueParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralNullValueParserRuleCall_6()); }
+		ruleLiteralNullValue
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralNullValueParserRuleCall_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralArrayValueParserRuleCall_7()); }
+		ruleLiteralArrayValue
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralArrayValueParserRuleCall_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralObjectReferenceParserRuleCall_8()); }
+		ruleLiteralObjectReference
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralObjectReferenceParserRuleCall_8()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralVariableReferenceParserRuleCall_9()); }
+		ruleLiteralVariableReference
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralVariableReferenceParserRuleCall_9()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralExpressionAccess().getLiteralInstanceReferenceParserRuleCall_10()); }
+		ruleLiteralInstanceReference
+		{ after(grammarAccess.getLiteralExpressionAccess().getLiteralInstanceReferenceParserRuleCall_10()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralObjectReference__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralObjectReferenceAccess().getObjectAssignment_1_0()); }
+		(rule__LiteralObjectReference__ObjectAssignment_1_0)
+		{ after(grammarAccess.getLiteralObjectReferenceAccess().getObjectAssignment_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralObjectReferenceAccess().getSymbolAssignment_1_1()); }
+		(rule__LiteralObjectReference__SymbolAssignment_1_1)
+		{ after(grammarAccess.getLiteralObjectReferenceAccess().getSymbolAssignment_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralVariableReference__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeVariableParserRuleCall_0()); }
+		ruleLiteralTimeVariable
+		{ after(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeVariableParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeDeltaVariableParserRuleCall_1()); }
+		ruleLiteralTimeDeltaVariable
+		{ after(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeDeltaVariableParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralInstanceReference__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralThisInstanceParserRuleCall_0()); }
+		ruleLiteralThisInstance
+		{ after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralThisInstanceParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSelfInstanceParserRuleCall_1()); }
+		ruleLiteralSelfInstance
+		{ after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSelfInstanceParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralParentInstanceParserRuleCall_2()); }
+		ruleLiteralParentInstance
+		{ after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralParentInstanceParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSuperInstanceParserRuleCall_3()); }
+		ruleLiteralSuperInstance
+		{ after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSuperInstanceParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSystemInstanceParserRuleCall_4()); }
+		ruleLiteralSystemInstance
+		{ after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSystemInstanceParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralEnvInstanceParserRuleCall_5()); }
+		ruleLiteralEnvInstance
+		{ after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralEnvInstanceParserRuleCall_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralEnvInstance__SymbolAlternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_0()); }
+		'$env'
+		{ after(grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_1()); }
+		'env'
+		{ after(grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EBoolean__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEBooleanAccess().getTrueKeyword_0()); }
+		'true'
+		{ after(grammarAccess.getEBooleanAccess().getTrueKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEBooleanAccess().getFalseKeyword_1()); }
+		'false'
+		{ after(grammarAccess.getEBooleanAccess().getFalseKeyword_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedReservedWord__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedReservedWordAccess().getFormKeyword_0()); }
+		'form'
+		{ after(grammarAccess.getDeprecatedReservedWordAccess().getFormKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedReservedWordAccess().getEndformKeyword_1()); }
+		'endform'
+		{ after(grammarAccess.getDeprecatedReservedWordAccess().getEndformKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedReservedWordAccess().getPrototypeKeyword_2()); }
+		'prototype'
+		{ after(grammarAccess.getDeprecatedReservedWordAccess().getPrototypeKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedReservedWordAccess().getEndprototypeKeyword_3()); }
+		'endprototype'
+		{ after(grammarAccess.getDeprecatedReservedWordAccess().getEndprototypeKeyword_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedReservedWordAccess().getSectionKeyword_4()); }
+		'section'
+		{ after(grammarAccess.getDeprecatedReservedWordAccess().getSectionKeyword_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedReservedWordAccess().getEndsectionKeyword_5()); }
+		'endsection'
+		{ after(grammarAccess.getDeprecatedReservedWordAccess().getEndsectionKeyword_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getGroup_0()); }
+		(rule__DeprecatedObject__Group_0__0)
+		{ after(grammarAccess.getDeprecatedObjectAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getGroup_1()); }
+		(rule__DeprecatedObject__Group_1__0)
+		{ after(grammarAccess.getDeprecatedObjectAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedProperty__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedSectionParserRuleCall_0()); }
+		ruleDeprecatedSection
+		{ after(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedSectionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedAttributeParserRuleCall_1()); }
+		ruleDeprecatedAttribute
+		{ after(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedAttributeParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getGroup_0()); }
+		(rule__DeprecatedSection__Group_0__0)
+		{ after(grammarAccess.getDeprecatedSectionAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getGroup_1()); }
+		(rule__DeprecatedSection__Group_1__0)
+		{ after(grammarAccess.getDeprecatedSectionAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__ElementAlternatives_0_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_0_3_0_0()); }
+		ruleDeprecatedAttribute
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_0_3_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_0_3_0_1()); }
+		ruleDeprecatedObject
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_0_3_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_0_3_0_2()); }
+		ruleObject
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_0_3_0_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Alternatives_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_0()); }
+		(rule__DeprecatedSection__Group_1_2_0__0)
+		{ after(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_1()); }
+		(rule__DeprecatedSection__Group_1_2_1__0)
+		{ after(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_0_1_0_0()); }
+		ruleDeprecatedAttribute
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_0_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_0_1_0_1()); }
+		ruleDeprecatedObject
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_0_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_0_1_0_2()); }
+		ruleObject
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_0_1_0_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_1_1_0_0()); }
+		ruleDeprecatedAttribute
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_1_1_0_1()); }
+		ruleDeprecatedObject
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_1_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_1_1_0_2()); }
+		ruleObject
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_1_1_0_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttributeID__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedAttributeIDAccess().getXIDParserRuleCall_0()); }
+		ruleXID
+		{ after(grammarAccess.getDeprecatedAttributeIDAccess().getXIDParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedAttributeIDAccess().getAT_IDENTIFIERTerminalRuleCall_1()); }
+		RULE_AT_IDENTIFIER
+		{ after(grammarAccess.getDeprecatedAttributeIDAccess().getAT_IDENTIFIERTerminalRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__OperatorAlternatives_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedExpressionAccess().getOperatorVerticalLineSemicolonVerticalLineKeyword_2_0_0()); }
+		'|;|'
+		{ after(grammarAccess.getDeprecatedExpressionAccess().getOperatorVerticalLineSemicolonVerticalLineKeyword_2_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDeprecatedExpressionAccess().getOperatorIKeyword_2_0_1()); }
+		'|i|'
+		{ after(grammarAccess.getDeprecatedExpressionAccess().getOperatorIKeyword_2_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Workflow__Group__0__Impl
+	rule__Workflow__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWorkflowAccess().getSEWorkflowAction_0()); }
+	()
+	{ after(grammarAccess.getWorkflowAccess().getSEWorkflowAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Workflow__Group__1__Impl
+	rule__Workflow__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWorkflowAccess().getPrologParserRuleCall_1()); }
+	(ruleProlog)?
+	{ after(grammarAccess.getWorkflowAccess().getPrologParserRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Workflow__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWorkflowAccess().getAlternatives_2()); }
+	(rule__Workflow__Alternatives_2)
+	{ after(grammarAccess.getWorkflowAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Workflow__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Workflow__Group_2_0__0__Impl
+	rule__Workflow__Group_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWorkflowAccess().getTypeAssignment_2_0_0()); }
+	(rule__Workflow__TypeAssignment_2_0_0)
+	{ after(grammarAccess.getWorkflowAccess().getTypeAssignment_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Workflow__Group_2_0__1__Impl
+	rule__Workflow__Group_2_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWorkflowAccess().getNameAssignment_2_0_1()); }
+	(rule__Workflow__NameAssignment_2_0_1)?
+	{ after(grammarAccess.getWorkflowAccess().getNameAssignment_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Workflow__Group_2_0__2__Impl
+	rule__Workflow__Group_2_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWorkflowAccess().getDescriptionAssignment_2_0_2()); }
+	(rule__Workflow__DescriptionAssignment_2_0_2)?
+	{ after(grammarAccess.getWorkflowAccess().getDescriptionAssignment_2_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Workflow__Group_2_0__3__Impl
+	rule__Workflow__Group_2_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWorkflowAccess().getLeftCurlyBracketKeyword_2_0_3()); }
+	'{'
+	{ after(grammarAccess.getWorkflowAccess().getLeftCurlyBracketKeyword_2_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Workflow__Group_2_0__4__Impl
+	rule__Workflow__Group_2_0__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWorkflowAccess().getElementAssignment_2_0_4()); }
+	(rule__Workflow__ElementAssignment_2_0_4)*
+	{ after(grammarAccess.getWorkflowAccess().getElementAssignment_2_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Workflow__Group_2_0__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__Group_2_0__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWorkflowAccess().getRightCurlyBracketKeyword_2_0_5()); }
+	'}'
+	{ after(grammarAccess.getWorkflowAccess().getRightCurlyBracketKeyword_2_0_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Prolog__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group__0__Impl
+	rule__Prolog__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getAlternatives_0()); }
+	(rule__Prolog__Alternatives_0)
+	{ after(grammarAccess.getPrologAccess().getAlternatives_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group__1__Impl
+	rule__Prolog__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getLessThanSignKeyword_1()); }
+	'<'
+	{ after(grammarAccess.getPrologAccess().getLessThanSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group__2__Impl
+	rule__Prolog__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getAlternatives_2()); }
+	(rule__Prolog__Alternatives_2)
+	{ after(grammarAccess.getPrologAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group__3__Impl
+	rule__Prolog__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getGroup_3()); }
+	(rule__Prolog__Group_3__0)?
+	{ after(grammarAccess.getPrologAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group__4__Impl
+	rule__Prolog__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getAlternatives_4()); }
+	(rule__Prolog__Alternatives_4)?
+	{ after(grammarAccess.getPrologAccess().getAlternatives_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getGreaterThanSignColonKeyword_5()); }
+	'>:'
+	{ after(grammarAccess.getPrologAccess().getGreaterThanSignColonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Prolog__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group_3__0__Impl
+	rule__Prolog__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getCommaKeyword_3_0()); }
+	','
+	{ after(grammarAccess.getPrologAccess().getCommaKeyword_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getEDoubleParserRuleCall_3_1()); }
+	ruleEDouble
+	{ after(grammarAccess.getPrologAccess().getEDoubleParserRuleCall_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Prolog__Group_4_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group_4_0__0__Impl
+	rule__Prolog__Group_4_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group_4_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getCommaKeyword_4_0_0()); }
+	','
+	{ after(grammarAccess.getPrologAccess().getCommaKeyword_4_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group_4_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Prolog__Group_4_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Prolog__Group_4_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrologAccess().getUFIParserRuleCall_4_0_1()); }
+	ruleUFI
+	{ after(grammarAccess.getPrologAccess().getUFIParserRuleCall_4_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__UFI__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UFI__Group__0__Impl
+	rule__UFI__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UFI__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUFIAccess().getXIDParserRuleCall_0()); }
+	ruleXID
+	{ after(grammarAccess.getUFIAccess().getXIDParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UFI__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UFI__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UFI__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUFIAccess().getGroup_1()); }
+	(rule__UFI__Group_1__0)*
+	{ after(grammarAccess.getUFIAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__UFI__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UFI__Group_1__0__Impl
+	rule__UFI__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UFI__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUFIAccess().getAlternatives_1_0()); }
+	(rule__UFI__Alternatives_1_0)
+	{ after(grammarAccess.getUFIAccess().getAlternatives_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UFI__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UFI__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UFI__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUFIAccess().getXIDParserRuleCall_1_1()); }
+	ruleXID
+	{ after(grammarAccess.getUFIAccess().getXIDParserRuleCall_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Object__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_0__0__Impl
+	rule__Object__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getWObjectAction_0_0()); }
+	()
+	{ after(grammarAccess.getObjectAccess().getWObjectAction_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_0__1__Impl
+	rule__Object__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getTypeAssignment_0_1()); }
+	(rule__Object__TypeAssignment_0_1)
+	{ after(grammarAccess.getObjectAccess().getTypeAssignment_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_0__2__Impl
+	rule__Object__Group_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getNameAssignment_0_2()); }
+	(rule__Object__NameAssignment_0_2)?
+	{ after(grammarAccess.getObjectAccess().getNameAssignment_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_0__3__Impl
+	rule__Object__Group_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getDescriptionAssignment_0_3()); }
+	(rule__Object__DescriptionAssignment_0_3)?
+	{ after(grammarAccess.getObjectAccess().getDescriptionAssignment_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_0__4__Impl
+	rule__Object__Group_0__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_0_4()); }
+	'{'
+	{ after(grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_0__5__Impl
+	rule__Object__Group_0__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getElementAssignment_0_5()); }
+	(rule__Object__ElementAssignment_0_5)*
+	{ after(grammarAccess.getObjectAccess().getElementAssignment_0_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_0__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_0__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_0_6()); }
+	'}'
+	{ after(grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_0_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Object__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_1__0__Impl
+	rule__Object__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getWObjectAction_1_0()); }
+	()
+	{ after(grammarAccess.getObjectAccess().getWObjectAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_1__1__Impl
+	rule__Object__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getNameAssignment_1_1()); }
+	(rule__Object__NameAssignment_1_1)
+	{ after(grammarAccess.getObjectAccess().getNameAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_1__2__Impl
+	rule__Object__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getAlternatives_1_2()); }
+	(rule__Object__Alternatives_1_2)
+	{ after(grammarAccess.getObjectAccess().getAlternatives_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_1__3__Impl
+	rule__Object__Group_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getGroup_1_3()); }
+	(rule__Object__Group_1_3__0)?
+	{ after(grammarAccess.getObjectAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_1__4__Impl
+	rule__Object__Group_1__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_1_4()); }
+	'{'
+	{ after(grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_1__5__Impl
+	rule__Object__Group_1__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getElementAssignment_1_5()); }
+	(rule__Object__ElementAssignment_1_5)*
+	{ after(grammarAccess.getObjectAccess().getElementAssignment_1_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_1__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_1_6()); }
+	'}'
+	{ after(grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_1_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Object__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_1_3__0__Impl
+	rule__Object__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getTypeAssignment_1_3_0()); }
+	(rule__Object__TypeAssignment_1_3_0)
+	{ after(grammarAccess.getObjectAccess().getTypeAssignment_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Object__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getObjectAccess().getDescriptionAssignment_1_3_1()); }
+	(rule__Object__DescriptionAssignment_1_3_1)?
+	{ after(grammarAccess.getObjectAccess().getDescriptionAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Section__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Section__Group__0__Impl
+	rule__Section__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSectionAccess().getNameAssignment_0()); }
+	(rule__Section__NameAssignment_0)
+	{ after(grammarAccess.getSectionAccess().getNameAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Section__Group__1__Impl
+	rule__Section__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSectionAccess().getDescriptionAssignment_1()); }
+	(rule__Section__DescriptionAssignment_1)?
+	{ after(grammarAccess.getSectionAccess().getDescriptionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Section__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSectionAccess().getAlternatives_2()); }
+	(rule__Section__Alternatives_2)
+	{ after(grammarAccess.getSectionAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Section__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Section__Group_2_0__0__Impl
+	rule__Section__Group_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSectionAccess().getLeftSquareBracketKeyword_2_0_0()); }
+	'['
+	{ after(grammarAccess.getSectionAccess().getLeftSquareBracketKeyword_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Section__Group_2_0__1__Impl
+	rule__Section__Group_2_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSectionAccess().getElementAssignment_2_0_1()); }
+	(rule__Section__ElementAssignment_2_0_1)*
+	{ after(grammarAccess.getSectionAccess().getElementAssignment_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group_2_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Section__Group_2_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group_2_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSectionAccess().getRightSquareBracketKeyword_2_0_2()); }
+	']'
+	{ after(grammarAccess.getSectionAccess().getRightSquareBracketKeyword_2_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Section__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Section__Group_2_1__0__Impl
+	rule__Section__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSectionAccess().getColonKeyword_2_1_0()); }
+	':'
+	{ after(grammarAccess.getSectionAccess().getColonKeyword_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Section__Group_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSectionAccess().getElementAssignment_2_1_1()); }
+	(rule__Section__ElementAssignment_2_1_1)*
+	{ after(grammarAccess.getSectionAccess().getElementAssignment_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Attribute__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Attribute__Group__0__Impl
+	rule__Attribute__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAttributeAccess().getWAttributeAction_0()); }
+	()
+	{ after(grammarAccess.getAttributeAccess().getWAttributeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Attribute__Group__1__Impl
+	rule__Attribute__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAttributeAccess().getNameAssignment_1()); }
+	(rule__Attribute__NameAssignment_1)
+	{ after(grammarAccess.getAttributeAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Attribute__Group__2__Impl
+	rule__Attribute__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAttributeAccess().getEqualsSignKeyword_2()); }
+	'='
+	{ after(grammarAccess.getAttributeAccess().getEqualsSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Attribute__Group__3__Impl
+	rule__Attribute__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAttributeAccess().getValueAssignment_3()); }
+	(rule__Attribute__ValueAssignment_3)
+	{ after(grammarAccess.getAttributeAccess().getValueAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Attribute__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAttributeAccess().getSemicolonKeyword_4()); }
+	(';')?
+	{ after(grammarAccess.getAttributeAccess().getSemicolonKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalExpression__Group__0__Impl
+	rule__ConditionalExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalExpressionAccess().getConditionalOrExpressionParserRuleCall_0()); }
+	ruleconditionalOrExpression
+	{ after(grammarAccess.getConditionalExpressionAccess().getConditionalOrExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalExpressionAccess().getGroup_1()); }
+	(rule__ConditionalExpression__Group_1__0)?
+	{ after(grammarAccess.getConditionalExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalExpression__Group_1__0__Impl
+	rule__ConditionalExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalExpressionAccess().getExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getConditionalExpressionAccess().getExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalExpression__Group_1__1__Impl
+	rule__ConditionalExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__ConditionalExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getConditionalExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalExpression__Group_1__2__Impl
+	rule__ConditionalExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__ConditionalExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalExpression__Group_1__3__Impl
+	rule__ConditionalExpression__Group_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalExpressionAccess().getColonKeyword_1_3()); }
+	':'
+	{ after(grammarAccess.getConditionalExpressionAccess().getColonKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalExpression__Group_1__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__Group_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_4()); }
+	(rule__ConditionalExpression__OperandAssignment_1_4)
+	{ after(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalOrExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalOrExpression__Group__0__Impl
+	rule__ConditionalOrExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalOrExpressionAccess().getConditionalAndExpressionParserRuleCall_0()); }
+	ruleconditionalAndExpression
+	{ after(grammarAccess.getConditionalOrExpressionAccess().getConditionalAndExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalOrExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalOrExpressionAccess().getGroup_1()); }
+	(rule__ConditionalOrExpression__Group_1__0)?
+	{ after(grammarAccess.getConditionalOrExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalOrExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalOrExpression__Group_1__0__Impl
+	rule__ConditionalOrExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalOrExpressionAccess().getExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getConditionalOrExpressionAccess().getExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalOrExpression__Group_1__1__Impl
+	rule__ConditionalOrExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalOrExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__ConditionalOrExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getConditionalOrExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalOrExpression__Group_1__2__Impl
+	rule__ConditionalOrExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__ConditionalOrExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalOrExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalOrExpressionAccess().getGroup_1_3()); }
+	(rule__ConditionalOrExpression__Group_1_3__0)*
+	{ after(grammarAccess.getConditionalOrExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalOrExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalOrExpression__Group_1_3__0__Impl
+	rule__ConditionalOrExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalOrExpressionAccess().getAlternatives_1_3_0()); }
+	(rule__ConditionalOrExpression__Alternatives_1_3_0)
+	{ after(grammarAccess.getConditionalOrExpressionAccess().getAlternatives_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalOrExpression__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_3_1()); }
+	(rule__ConditionalOrExpression__OperandAssignment_1_3_1)
+	{ after(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalAndExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalAndExpression__Group__0__Impl
+	rule__ConditionalAndExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalAndExpressionAccess().getEqualityExpressionParserRuleCall_0()); }
+	ruleequalityExpression
+	{ after(grammarAccess.getConditionalAndExpressionAccess().getEqualityExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalAndExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalAndExpressionAccess().getGroup_1()); }
+	(rule__ConditionalAndExpression__Group_1__0)?
+	{ after(grammarAccess.getConditionalAndExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalAndExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalAndExpression__Group_1__0__Impl
+	rule__ConditionalAndExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalAndExpressionAccess().getExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getConditionalAndExpressionAccess().getExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalAndExpression__Group_1__1__Impl
+	rule__ConditionalAndExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalAndExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__ConditionalAndExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getConditionalAndExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalAndExpression__Group_1__2__Impl
+	rule__ConditionalAndExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__ConditionalAndExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalAndExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalAndExpressionAccess().getGroup_1_3()); }
+	(rule__ConditionalAndExpression__Group_1_3__0)*
+	{ after(grammarAccess.getConditionalAndExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalAndExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalAndExpression__Group_1_3__0__Impl
+	rule__ConditionalAndExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalAndExpressionAccess().getAlternatives_1_3_0()); }
+	(rule__ConditionalAndExpression__Alternatives_1_3_0)
+	{ after(grammarAccess.getConditionalAndExpressionAccess().getAlternatives_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalAndExpression__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_3_1()); }
+	(rule__ConditionalAndExpression__OperandAssignment_1_3_1)
+	{ after(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EqualityExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group__0__Impl
+	rule__EqualityExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0()); }
+	rulerelationalExpression
+	{ after(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getGroup_1()); }
+	(rule__EqualityExpression__Group_1__0)?
+	{ after(grammarAccess.getEqualityExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EqualityExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group_1__0__Impl
+	rule__EqualityExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getEqualityExpressionAccess().getExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group_1__1__Impl
+	rule__EqualityExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__EqualityExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__EqualityExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getEqualityExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RelationalExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group__0__Impl
+	rule__RelationalExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0()); }
+	ruleadditiveExpression
+	{ after(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getGroup_1()); }
+	(rule__RelationalExpression__Group_1__0)?
+	{ after(grammarAccess.getRelationalExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RelationalExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1__0__Impl
+	rule__RelationalExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getRelationalExpressionAccess().getExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1__1__Impl
+	rule__RelationalExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__RelationalExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__RelationalExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getRelationalExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__AdditiveExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group__0__Impl
+	rule__AdditiveExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0()); }
+	rulemultiplicativeExpression
+	{ after(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getGroup_1()); }
+	(rule__AdditiveExpression__Group_1__0)?
+	{ after(grammarAccess.getAdditiveExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__AdditiveExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1__0__Impl
+	rule__AdditiveExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getAdditiveExpressionAccess().getExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1__1__Impl
+	rule__AdditiveExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__AdditiveExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1__2__Impl
+	rule__AdditiveExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__AdditiveExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_3()); }
+	(rule__AdditiveExpression__Group_1_3__0)*
+	{ after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__AdditiveExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_3__0__Impl
+	rule__AdditiveExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_3_0()); }
+	'+'
+	{ after(grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_3_1()); }
+	(rule__AdditiveExpression__OperandAssignment_1_3_1)
+	{ after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group__0__Impl
+	rule__MultiplicativeExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getPrimaryExpressionParserRuleCall_0()); }
+	ruleprimaryExpression
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getPrimaryExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1()); }
+	(rule__MultiplicativeExpression__Alternatives_1)?
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0__0__Impl
+	rule__MultiplicativeExpression__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_0_0()); }
+	()
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0__1__Impl
+	rule__MultiplicativeExpression__Group_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1()); }
+	(rule__MultiplicativeExpression__OperatorAssignment_1_0_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0__2__Impl
+	rule__MultiplicativeExpression__Group_1_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_0_2)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3()); }
+	(rule__MultiplicativeExpression__Group_1_0_3__0)*
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_0_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_0_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0()); }
+	'*'
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_0_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1__0__Impl
+	rule__MultiplicativeExpression__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_1_0()); }
+	()
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1__1__Impl
+	rule__MultiplicativeExpression__Group_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1()); }
+	(rule__MultiplicativeExpression__OperatorAssignment_1_1_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1__2__Impl
+	rule__MultiplicativeExpression__Group_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_1_2)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3()); }
+	(rule__MultiplicativeExpression__Group_1_1_3__0)*
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0()); }
+	'**'
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_1_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2__0__Impl
+	rule__MultiplicativeExpression__Group_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_2_0()); }
+	()
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2__1__Impl
+	rule__MultiplicativeExpression__Group_1_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1()); }
+	(rule__MultiplicativeExpression__OperatorAssignment_1_2_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2__2__Impl
+	rule__MultiplicativeExpression__Group_1_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_2_2)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3()); }
+	(rule__MultiplicativeExpression__Group_1_2_3__0)*
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_2_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_2_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0()); }
+	'/'
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_2_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_3_0()); }
+	()
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3__1__Impl
+	rule__MultiplicativeExpression__Group_1_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1()); }
+	(rule__MultiplicativeExpression__OperatorAssignment_1_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3__2__Impl
+	rule__MultiplicativeExpression__Group_1_3__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_3_2)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3()); }
+	(rule__MultiplicativeExpression__Group_1_3_3__0)*
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_3_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_3_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0()); }
+	'%'
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_3_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_0__0__Impl
+	rule__PrimaryExpression__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getPlusSignKeyword_0_0()); }
+	'+'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getPlusSignKeyword_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getPrimaryExpressionParserRuleCall_0_1()); }
+	ruleprimaryExpression
+	{ after(grammarAccess.getPrimaryExpressionAccess().getPrimaryExpressionParserRuleCall_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1__0__Impl
+	rule__PrimaryExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getExpressionAction_1_0()); }
+	()
+	{ after(grammarAccess.getPrimaryExpressionAccess().getExpressionAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_1_1()); }
+	(rule__PrimaryExpression__Group_1_1__0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1_1__0__Impl
+	rule__PrimaryExpression__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_1_1_0()); }
+	(rule__PrimaryExpression__OperatorAssignment_1_1_0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_1_1_1()); }
+	(rule__PrimaryExpression__OperandAssignment_1_1_1)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2__0__Impl
+	rule__PrimaryExpression__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getExpressionAction_2_0()); }
+	()
+	{ after(grammarAccess.getPrimaryExpressionAccess().getExpressionAction_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_1()); }
+	(rule__PrimaryExpression__Group_2_1__0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_1__0__Impl
+	rule__PrimaryExpression__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_2_1_0()); }
+	(rule__PrimaryExpression__OperatorAssignment_2_1_0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_2_1_1()); }
+	(rule__PrimaryExpression__OperandAssignment_2_1_1)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_3__0__Impl
+	rule__PrimaryExpression__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getLeftParenthesisKeyword_3_0()); }
+	'('
+	{ after(grammarAccess.getPrimaryExpressionAccess().getLeftParenthesisKeyword_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_3__1__Impl
+	rule__PrimaryExpression__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getExpressionParserRuleCall_3_1()); }
+	ruleExpression
+	{ after(grammarAccess.getPrimaryExpressionAccess().getExpressionParserRuleCall_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_3_2()); }
+	')'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralArrayValue__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralArrayValue__Group__0__Impl
+	rule__LiteralArrayValue__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralArrayValueAccess().getLiteralArrayValueAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralArrayValueAccess().getLiteralArrayValueAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralArrayValue__Group__1__Impl
+	rule__LiteralArrayValue__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralArrayValueAccess().getLeftSquareBracketKeyword_1()); }
+	'['
+	{ after(grammarAccess.getLiteralArrayValueAccess().getLeftSquareBracketKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralArrayValue__Group__2__Impl
+	rule__LiteralArrayValue__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralArrayValueAccess().getGroup_2()); }
+	(rule__LiteralArrayValue__Group_2__0)?
+	{ after(grammarAccess.getLiteralArrayValueAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralArrayValue__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralArrayValueAccess().getRightSquareBracketKeyword_3()); }
+	']'
+	{ after(grammarAccess.getLiteralArrayValueAccess().getRightSquareBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralArrayValue__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralArrayValue__Group_2__0__Impl
+	rule__LiteralArrayValue__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_0()); }
+	(rule__LiteralArrayValue__ValuesAssignment_2_0)
+	{ after(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralArrayValue__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralArrayValueAccess().getGroup_2_1()); }
+	(rule__LiteralArrayValue__Group_2_1__0)*
+	{ after(grammarAccess.getLiteralArrayValueAccess().getGroup_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralArrayValue__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralArrayValue__Group_2_1__0__Impl
+	rule__LiteralArrayValue__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralArrayValueAccess().getCommaKeyword_2_1_0()); }
+	','
+	{ after(grammarAccess.getLiteralArrayValueAccess().getCommaKeyword_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralArrayValue__Group_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_1_1()); }
+	(rule__LiteralArrayValue__ValuesAssignment_2_1_1)
+	{ after(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralObjectReference__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralObjectReference__Group__0__Impl
+	rule__LiteralObjectReference__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralObjectReference__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralObjectReferenceAccess().getAmpersandKeyword_0()); }
+	('&')?
+	{ after(grammarAccess.getLiteralObjectReferenceAccess().getAmpersandKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralObjectReference__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralObjectReference__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralObjectReference__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralObjectReferenceAccess().getAlternatives_1()); }
+	(rule__LiteralObjectReference__Alternatives_1)
+	{ after(grammarAccess.getLiteralObjectReferenceAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralRationalValue__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralRationalValue__Group__0__Impl
+	rule__LiteralRationalValue__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalValue__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralRationalValueAccess().getNumeratorAssignment_0()); }
+	(rule__LiteralRationalValue__NumeratorAssignment_0)
+	{ after(grammarAccess.getLiteralRationalValueAccess().getNumeratorAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalValue__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralRationalValue__Group__1__Impl
+	rule__LiteralRationalValue__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalValue__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralRationalValueAccess().getSolidusKeyword_1()); }
+	'/'
+	{ after(grammarAccess.getLiteralRationalValueAccess().getSolidusKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalValue__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralRationalValue__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalValue__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralRationalValueAccess().getDenominatorAssignment_2()); }
+	(rule__LiteralRationalValue__DenominatorAssignment_2)
+	{ after(grammarAccess.getLiteralRationalValueAccess().getDenominatorAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralNullValue__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullValue__Group__0__Impl
+	rule__LiteralNullValue__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullValueAccess().getLiteralNullValueAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralNullValueAccess().getLiteralNullValueAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullValue__Group__1__Impl
+	rule__LiteralNullValue__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullValueAccess().getNullKeyword_1()); }
+	'null'
+	{ after(grammarAccess.getLiteralNullValueAccess().getNullKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullValue__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullValueAccess().getGroup_2()); }
+	(rule__LiteralNullValue__Group_2__0)?
+	{ after(grammarAccess.getLiteralNullValueAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralNullValue__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullValue__Group_2__0__Impl
+	rule__LiteralNullValue__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullValueAccess().getLessThanSignKeyword_2_0()); }
+	'<'
+	{ after(grammarAccess.getLiteralNullValueAccess().getLessThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullValue__Group_2__1__Impl
+	rule__LiteralNullValue__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullValueAccess().getTypeAssignment_2_1()); }
+	(rule__LiteralNullValue__TypeAssignment_2_1)
+	{ after(grammarAccess.getLiteralNullValueAccess().getTypeAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullValue__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullValueAccess().getGreaterThanSignKeyword_2_2()); }
+	'>'
+	{ after(grammarAccess.getLiteralNullValueAccess().getGreaterThanSignKeyword_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralTimeVariable__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralTimeVariable__Group__0__Impl
+	rule__LiteralTimeVariable__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeVariable__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralTimeVariableAccess().getLiteralTimeVariableAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralTimeVariableAccess().getLiteralTimeVariableAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeVariable__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralTimeVariable__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeVariable__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralTimeVariableAccess().getSymbolAssignment_1()); }
+	(rule__LiteralTimeVariable__SymbolAssignment_1)
+	{ after(grammarAccess.getLiteralTimeVariableAccess().getSymbolAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralTimeDeltaVariable__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralTimeDeltaVariable__Group__0__Impl
+	rule__LiteralTimeDeltaVariable__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeDeltaVariable__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralTimeDeltaVariableAccess().getLiteralTimeDeltaVariableAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralTimeDeltaVariableAccess().getLiteralTimeDeltaVariableAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeDeltaVariable__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralTimeDeltaVariable__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeDeltaVariable__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolAssignment_1()); }
+	(rule__LiteralTimeDeltaVariable__SymbolAssignment_1)
+	{ after(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralThisInstance__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralThisInstance__Group__0__Impl
+	rule__LiteralThisInstance__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralThisInstance__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralThisInstanceAccess().getLiteralThisInstanceAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralThisInstanceAccess().getLiteralThisInstanceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralThisInstance__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralThisInstance__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralThisInstance__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralThisInstanceAccess().getSymbolAssignment_1()); }
+	(rule__LiteralThisInstance__SymbolAssignment_1)
+	{ after(grammarAccess.getLiteralThisInstanceAccess().getSymbolAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralSelfInstance__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSelfInstance__Group__0__Impl
+	rule__LiteralSelfInstance__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSelfInstance__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSelfInstanceAccess().getLiteralSelfInstanceAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralSelfInstanceAccess().getLiteralSelfInstanceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSelfInstance__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSelfInstance__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSelfInstance__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSelfInstanceAccess().getSymbolAssignment_1()); }
+	(rule__LiteralSelfInstance__SymbolAssignment_1)
+	{ after(grammarAccess.getLiteralSelfInstanceAccess().getSymbolAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralParentInstance__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralParentInstance__Group__0__Impl
+	rule__LiteralParentInstance__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralParentInstance__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralParentInstanceAccess().getLiteralParentInstanceAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralParentInstanceAccess().getLiteralParentInstanceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralParentInstance__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralParentInstance__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralParentInstance__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralParentInstanceAccess().getSymbolAssignment_1()); }
+	(rule__LiteralParentInstance__SymbolAssignment_1)
+	{ after(grammarAccess.getLiteralParentInstanceAccess().getSymbolAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralSuperInstance__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSuperInstance__Group__0__Impl
+	rule__LiteralSuperInstance__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSuperInstance__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSuperInstanceAccess().getLiteralSuperInstanceAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralSuperInstanceAccess().getLiteralSuperInstanceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSuperInstance__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSuperInstance__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSuperInstance__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSuperInstanceAccess().getSymbolAssignment_1()); }
+	(rule__LiteralSuperInstance__SymbolAssignment_1)
+	{ after(grammarAccess.getLiteralSuperInstanceAccess().getSymbolAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralSystemInstance__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSystemInstance__Group__0__Impl
+	rule__LiteralSystemInstance__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSystemInstance__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSystemInstanceAccess().getLiteralSystemInstanceAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralSystemInstanceAccess().getLiteralSystemInstanceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSystemInstance__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSystemInstance__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSystemInstance__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSystemInstanceAccess().getSymbolAssignment_1()); }
+	(rule__LiteralSystemInstance__SymbolAssignment_1)
+	{ after(grammarAccess.getLiteralSystemInstanceAccess().getSymbolAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralEnvInstance__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralEnvInstance__Group__0__Impl
+	rule__LiteralEnvInstance__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralEnvInstance__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralEnvInstanceAccess().getLiteralEnvInstanceAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralEnvInstanceAccess().getLiteralEnvInstanceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralEnvInstance__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralEnvInstance__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralEnvInstance__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAssignment_1()); }
+	(rule__LiteralEnvInstance__SymbolAssignment_1)
+	{ after(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ELong__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ELong__Group__0__Impl
+	rule__ELong__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ELong__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getELongAccess().getHyphenMinusKeyword_0()); }
+	('-')?
+	{ after(grammarAccess.getELongAccess().getHyphenMinusKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ELong__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ELong__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ELong__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getELongAccess().getINTTerminalRuleCall_1()); }
+	RULE_INT
+	{ after(grammarAccess.getELongAccess().getINTTerminalRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EDouble__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EDouble__Group__0__Impl
+	rule__EDouble__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0()); }
+	('-')?
+	{ after(grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EDouble__Group__1__Impl
+	rule__EDouble__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1()); }
+	(RULE_INT)?
+	{ after(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EDouble__Group__2__Impl
+	rule__EDouble__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEDoubleAccess().getFullStopKeyword_2()); }
+	'.'
+	{ after(grammarAccess.getEDoubleAccess().getFullStopKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EDouble__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3()); }
+	RULE_INT
+	{ after(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EBigDecimal__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EBigDecimal__Group__0__Impl
+	rule__EBigDecimal__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EBigDecimal__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_0()); }
+	(RULE_INT)?
+	{ after(grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EBigDecimal__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EBigDecimal__Group__1__Impl
+	rule__EBigDecimal__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EBigDecimal__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEBigDecimalAccess().getFullStopKeyword_1()); }
+	'.'
+	{ after(grammarAccess.getEBigDecimalAccess().getFullStopKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EBigDecimal__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EBigDecimal__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EBigDecimal__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_2()); }
+	RULE_INT
+	{ after(grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DeprecatedObject__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__0__Impl
+	rule__DeprecatedObject__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getWObjectAction_0_0()); }
+	()
+	{ after(grammarAccess.getDeprecatedObjectAccess().getWObjectAction_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__1__Impl
+	rule__DeprecatedObject__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getFormKeyword_0_1()); }
+	'form'
+	{ after(grammarAccess.getDeprecatedObjectAccess().getFormKeyword_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__2__Impl
+	rule__DeprecatedObject__Group_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_0_2()); }
+	(rule__DeprecatedObject__NameAssignment_0_2)
+	{ after(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__3__Impl
+	rule__DeprecatedObject__Group_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_0_3()); }
+	(rule__DeprecatedObject__DescriptionAssignment_0_3)?
+	{ after(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__4__Impl
+	rule__DeprecatedObject__Group_0__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getAsKeyword_0_4()); }
+	'as'
+	{ after(grammarAccess.getDeprecatedObjectAccess().getAsKeyword_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__5__Impl
+	rule__DeprecatedObject__Group_0__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_0_5()); }
+	('&')?
+	{ after(grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_0_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__6__Impl
+	rule__DeprecatedObject__Group_0__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_0_6()); }
+	(rule__DeprecatedObject__TypeAssignment_0_6)
+	{ after(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_0_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__7__Impl
+	rule__DeprecatedObject__Group_0__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getIsKeyword_0_7()); }
+	'is'
+	{ after(grammarAccess.getDeprecatedObjectAccess().getIsKeyword_0_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__8__Impl
+	rule__DeprecatedObject__Group_0__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_0_8()); }
+	(rule__DeprecatedObject__ElementAssignment_0_8)*
+	{ after(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_0_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_0__9__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_0__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getEndformKeyword_0_9()); }
+	'endform'
+	{ after(grammarAccess.getDeprecatedObjectAccess().getEndformKeyword_0_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DeprecatedObject__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__0__Impl
+	rule__DeprecatedObject__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getWObjectAction_1_0()); }
+	()
+	{ after(grammarAccess.getDeprecatedObjectAccess().getWObjectAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__1__Impl
+	rule__DeprecatedObject__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getPrototypeKeyword_1_1()); }
+	'prototype'
+	{ after(grammarAccess.getDeprecatedObjectAccess().getPrototypeKeyword_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__2__Impl
+	rule__DeprecatedObject__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_1_2()); }
+	(rule__DeprecatedObject__NameAssignment_1_2)
+	{ after(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__3__Impl
+	rule__DeprecatedObject__Group_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_1_3()); }
+	(rule__DeprecatedObject__DescriptionAssignment_1_3)?
+	{ after(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__4__Impl
+	rule__DeprecatedObject__Group_1__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getAsKeyword_1_4()); }
+	'as'
+	{ after(grammarAccess.getDeprecatedObjectAccess().getAsKeyword_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__5__Impl
+	rule__DeprecatedObject__Group_1__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_1_5()); }
+	('&')?
+	{ after(grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_1_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__6__Impl
+	rule__DeprecatedObject__Group_1__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_1_6()); }
+	(rule__DeprecatedObject__TypeAssignment_1_6)
+	{ after(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_1_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__7__Impl
+	rule__DeprecatedObject__Group_1__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getIsKeyword_1_7()); }
+	'is'
+	{ after(grammarAccess.getDeprecatedObjectAccess().getIsKeyword_1_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__8__Impl
+	rule__DeprecatedObject__Group_1__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_1_8()); }
+	(rule__DeprecatedObject__ElementAssignment_1_8)*
+	{ after(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_1_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedObject__Group_1__9__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__Group_1__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedObjectAccess().getEndprototypeKeyword_1_9()); }
+	'endprototype'
+	{ after(grammarAccess.getDeprecatedObjectAccess().getEndprototypeKeyword_1_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DeprecatedSection__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_0__0__Impl
+	rule__DeprecatedSection__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getWSectionAction_0_0()); }
+	()
+	{ after(grammarAccess.getDeprecatedSectionAccess().getWSectionAction_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_0__1__Impl
+	rule__DeprecatedSection__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getSectionKeyword_0_1()); }
+	'section'
+	{ after(grammarAccess.getDeprecatedSectionAccess().getSectionKeyword_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_0__2__Impl
+	rule__DeprecatedSection__Group_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_0_2()); }
+	(rule__DeprecatedSection__NameAssignment_0_2)
+	{ after(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_0__3__Impl
+	rule__DeprecatedSection__Group_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_0_3()); }
+	(rule__DeprecatedSection__ElementAssignment_0_3)*
+	{ after(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_0__4__Impl
+	rule__DeprecatedSection__Group_0__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getEndsectionKeyword_0_4()); }
+	'endsection'
+	{ after(grammarAccess.getDeprecatedSectionAccess().getEndsectionKeyword_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_0__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_0__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getXIDParserRuleCall_0_5()); }
+	(ruleXID)?
+	{ after(grammarAccess.getDeprecatedSectionAccess().getXIDParserRuleCall_0_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DeprecatedSection__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_1__0__Impl
+	rule__DeprecatedSection__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_1_0()); }
+	(rule__DeprecatedSection__NameAssignment_1_0)
+	{ after(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_1__1__Impl
+	rule__DeprecatedSection__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getDescriptionAssignment_1_1()); }
+	(rule__DeprecatedSection__DescriptionAssignment_1_1)?
+	{ after(grammarAccess.getDeprecatedSectionAccess().getDescriptionAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getAlternatives_1_2()); }
+	(rule__DeprecatedSection__Alternatives_1_2)
+	{ after(grammarAccess.getDeprecatedSectionAccess().getAlternatives_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DeprecatedSection__Group_1_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_1_2_0__0__Impl
+	rule__DeprecatedSection__Group_1_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getLeftSquareBracketKeyword_1_2_0_0()); }
+	'['
+	{ after(grammarAccess.getDeprecatedSectionAccess().getLeftSquareBracketKeyword_1_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_1_2_0__1__Impl
+	rule__DeprecatedSection__Group_1_2_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_0_1()); }
+	(rule__DeprecatedSection__ElementAssignment_1_2_0_1)*
+	{ after(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1_2_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_1_2_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1_2_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getRightSquareBracketKeyword_1_2_0_2()); }
+	']'
+	{ after(grammarAccess.getDeprecatedSectionAccess().getRightSquareBracketKeyword_1_2_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DeprecatedSection__Group_1_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_1_2_1__0__Impl
+	rule__DeprecatedSection__Group_1_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getColonKeyword_1_2_1_0()); }
+	':'
+	{ after(grammarAccess.getDeprecatedSectionAccess().getColonKeyword_1_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedSection__Group_1_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__Group_1_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_1_1()); }
+	(rule__DeprecatedSection__ElementAssignment_1_2_1_1)*
+	{ after(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DeprecatedAttribute__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedAttribute__Group__0__Impl
+	rule__DeprecatedAttribute__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedAttributeAccess().getWAttributeAction_0()); }
+	()
+	{ after(grammarAccess.getDeprecatedAttributeAccess().getWAttributeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedAttribute__Group__1__Impl
+	rule__DeprecatedAttribute__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedAttributeAccess().getNameAssignment_1()); }
+	(rule__DeprecatedAttribute__NameAssignment_1)
+	{ after(grammarAccess.getDeprecatedAttributeAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedAttribute__Group__2__Impl
+	rule__DeprecatedAttribute__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedAttributeAccess().getEqualsSignKeyword_2()); }
+	'='
+	{ after(grammarAccess.getDeprecatedAttributeAccess().getEqualsSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedAttribute__Group__3__Impl
+	rule__DeprecatedAttribute__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedAttributeAccess().getValueAssignment_3()); }
+	(rule__DeprecatedAttribute__ValueAssignment_3)
+	{ after(grammarAccess.getDeprecatedAttributeAccess().getValueAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedAttribute__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedAttributeAccess().getSemicolonKeyword_4()); }
+	(';')?
+	{ after(grammarAccess.getDeprecatedAttributeAccess().getSemicolonKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DeprecatedExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedExpression__Group__0__Impl
+	rule__DeprecatedExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedExpressionAccess().getExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getDeprecatedExpressionAccess().getExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedExpression__Group__1__Impl
+	rule__DeprecatedExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedExpressionAccess().getDollarSignLeftCurlyBracketKeyword_1()); }
+	'${'
+	{ after(grammarAccess.getDeprecatedExpressionAccess().getDollarSignLeftCurlyBracketKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedExpression__Group__2__Impl
+	rule__DeprecatedExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedExpressionAccess().getOperatorAssignment_2()); }
+	(rule__DeprecatedExpression__OperatorAssignment_2)
+	{ after(grammarAccess.getDeprecatedExpressionAccess().getOperatorAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedExpression__Group__3__Impl
+	rule__DeprecatedExpression__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedExpressionAccess().getOperandAssignment_3()); }
+	(rule__DeprecatedExpression__OperandAssignment_3)*
+	{ after(grammarAccess.getDeprecatedExpressionAccess().getOperandAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DeprecatedExpression__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDeprecatedExpressionAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getDeprecatedExpressionAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Workflow__TypeAssignment_2_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWorkflowAccess().getTypeAlternatives_2_0_0_0()); }
+		(rule__Workflow__TypeAlternatives_2_0_0_0)
+		{ after(grammarAccess.getWorkflowAccess().getTypeAlternatives_2_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__NameAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWorkflowAccess().getNameUFIParserRuleCall_2_0_1_0()); }
+		ruleUFI
+		{ after(grammarAccess.getWorkflowAccess().getNameUFIParserRuleCall_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__DescriptionAssignment_2_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWorkflowAccess().getDescriptionEStringParserRuleCall_2_0_2_0()); }
+		ruleEString
+		{ after(grammarAccess.getWorkflowAccess().getDescriptionEStringParserRuleCall_2_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__ElementAssignment_2_0_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWorkflowAccess().getElementAlternatives_2_0_4_0()); }
+		(rule__Workflow__ElementAlternatives_2_0_4_0)
+		{ after(grammarAccess.getWorkflowAccess().getElementAlternatives_2_0_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Workflow__ElementAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWorkflowAccess().getElementDeprecatedObjectParserRuleCall_2_1_0()); }
+		ruleDeprecatedObject
+		{ after(grammarAccess.getWorkflowAccess().getElementDeprecatedObjectParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__TypeAssignment_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_0_1_0()); }
+		ruleUFI
+		{ after(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__NameAssignment_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_0_2_0()); }
+		ruleUFI
+		{ after(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__DescriptionAssignment_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_0_3_0()); }
+		ruleEString
+		{ after(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_0_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__ElementAssignment_0_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getElementAlternatives_0_5_0()); }
+		(rule__Object__ElementAlternatives_0_5_0)
+		{ after(grammarAccess.getObjectAccess().getElementAlternatives_0_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__NameAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_1_1_0()); }
+		ruleUFI
+		{ after(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__TypeAssignment_1_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_1_3_0_0()); }
+		ruleUFI
+		{ after(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_1_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__DescriptionAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_1_3_1_0()); }
+		ruleEString
+		{ after(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Object__ElementAssignment_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getObjectAccess().getElementAlternatives_1_5_0()); }
+		(rule__Object__ElementAlternatives_1_5_0)
+		{ after(grammarAccess.getObjectAccess().getElementAlternatives_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__NameAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSectionAccess().getNameXIDParserRuleCall_0_0()); }
+		ruleXID
+		{ after(grammarAccess.getSectionAccess().getNameXIDParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__DescriptionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSectionAccess().getDescriptionEStringParserRuleCall_1_0()); }
+		ruleEString
+		{ after(grammarAccess.getSectionAccess().getDescriptionEStringParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__ElementAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSectionAccess().getElementAlternatives_2_0_1_0()); }
+		(rule__Section__ElementAlternatives_2_0_1_0)
+		{ after(grammarAccess.getSectionAccess().getElementAlternatives_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Section__ElementAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSectionAccess().getElementAlternatives_2_1_1_0()); }
+		(rule__Section__ElementAlternatives_2_1_1_0)
+		{ after(grammarAccess.getSectionAccess().getElementAlternatives_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAttributeAccess().getNameXIDParserRuleCall_1_0()); }
+		ruleXID
+		{ after(grammarAccess.getAttributeAccess().getNameXIDParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Attribute__ValueAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAttributeAccess().getValueValueSpecificationParserRuleCall_3_0()); }
+		ruleValueSpecification
+		{ after(grammarAccess.getAttributeAccess().getValueValueSpecificationParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); }
+			'?'
+			{ after(grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_2_0()); }
+		ruleExpression
+		{ after(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalExpression__OperandAssignment_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_4_0()); }
+		ruleExpression
+		{ after(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalOrExpressionAccess().getOperatorAlternatives_1_1_0()); }
+		(rule__ConditionalOrExpression__OperatorAlternatives_1_1_0)
+		{ after(grammarAccess.getConditionalOrExpressionAccess().getOperatorAlternatives_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_2_0()); }
+		ruleconditionalAndExpression
+		{ after(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalOrExpression__OperandAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_3_1_0()); }
+		ruleconditionalAndExpression
+		{ after(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalAndExpressionAccess().getOperatorAlternatives_1_1_0()); }
+		(rule__ConditionalAndExpression__OperatorAlternatives_1_1_0)
+		{ after(grammarAccess.getConditionalAndExpressionAccess().getOperatorAlternatives_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0()); }
+		ruleequalityExpression
+		{ after(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalAndExpression__OperandAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0()); }
+		ruleequalityExpression
+		{ after(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getOperatorAlternatives_1_1_0()); }
+		(rule__EqualityExpression__OperatorAlternatives_1_1_0)
+		{ after(grammarAccess.getEqualityExpressionAccess().getOperatorAlternatives_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getOperandRelationalExpressionParserRuleCall_1_2_0()); }
+		rulerelationalExpression
+		{ after(grammarAccess.getEqualityExpressionAccess().getOperandRelationalExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getOperatorAlternatives_1_1_0()); }
+		(rule__RelationalExpression__OperatorAlternatives_1_1_0)
+		{ after(grammarAccess.getRelationalExpressionAccess().getOperatorAlternatives_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getOperandAdditiveExpressionParserRuleCall_1_2_0()); }
+		ruleadditiveExpression
+		{ after(grammarAccess.getRelationalExpressionAccess().getOperandAdditiveExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0()); }
+			'+'
+			{ after(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_2_0()); }
+		rulemultiplicativeExpression
+		{ after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__OperandAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_3_1_0()); }
+		rulemultiplicativeExpression
+		{ after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperatorAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); }
+		(
+			{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); }
+			'*'
+			{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); }
+		)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_2_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_0_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_3_1_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperatorAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); }
+			'**'
+			{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); }
+		)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_2_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_3_1_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperatorAssignment_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); }
+		(
+			{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); }
+			'/'
+			{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); }
+		)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_2_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_2_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_3_1_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperatorAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); }
+		(
+			{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); }
+			'%'
+			{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); }
+		)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_3_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_2_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_3_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_3_1_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__OperatorAssignment_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0()); }
+		(
+			{ before(grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0()); }
+			'-'
+			{ after(grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0()); }
+		)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__OperandAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_1_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__OperatorAssignment_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getOperatorAlternatives_2_1_0_0()); }
+		(rule__PrimaryExpression__OperatorAlternatives_2_1_0_0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getOperatorAlternatives_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__OperandAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_2_1_1_0()); }
+		ruleprimaryExpression
+		{ after(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__ValuesAssignment_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_0_0()); }
+		ruleValueSpecification
+		{ after(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralArrayValue__ValuesAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_1_1_0()); }
+		ruleValueSpecification
+		{ after(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralObjectReference__ObjectAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectCrossReference_1_0_0()); }
+		(
+			{ before(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectUFIParserRuleCall_1_0_0_1()); }
+			ruleUFI
+			{ after(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectUFIParserRuleCall_1_0_0_1()); }
+		)
+		{ after(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectCrossReference_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralObjectReference__SymbolAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralObjectReferenceAccess().getSymbolUFIParserRuleCall_1_1_0()); }
+		ruleUFI
+		{ after(grammarAccess.getLiteralObjectReferenceAccess().getSymbolUFIParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralBooleanValue__ValueAssignment
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralBooleanValueAccess().getValueEBooleanParserRuleCall_0()); }
+		ruleEBoolean
+		{ after(grammarAccess.getLiteralBooleanValueAccess().getValueEBooleanParserRuleCall_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCharacterValue__ValueAssignment
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralCharacterValueAccess().getValueECharParserRuleCall_0()); }
+		ruleEChar
+		{ after(grammarAccess.getLiteralCharacterValueAccess().getValueECharParserRuleCall_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralIntegerValue__ValueAssignment
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralIntegerValueAccess().getValueELongParserRuleCall_0()); }
+		ruleELong
+		{ after(grammarAccess.getLiteralIntegerValueAccess().getValueELongParserRuleCall_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalValue__NumeratorAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralRationalValueAccess().getNumeratorELongParserRuleCall_0_0()); }
+		ruleELong
+		{ after(grammarAccess.getLiteralRationalValueAccess().getNumeratorELongParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalValue__DenominatorAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralRationalValueAccess().getDenominatorELongParserRuleCall_2_0()); }
+		ruleELong
+		{ after(grammarAccess.getLiteralRationalValueAccess().getDenominatorELongParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralFloatValue__ValueAssignment
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralFloatValueAccess().getValueEDoubleParserRuleCall_0()); }
+		ruleEDouble
+		{ after(grammarAccess.getLiteralFloatValueAccess().getValueEDoubleParserRuleCall_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralStringValue__ValueAssignment
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralStringValueAccess().getValueEStringParserRuleCall_0()); }
+		ruleEString
+		{ after(grammarAccess.getLiteralStringValueAccess().getValueEStringParserRuleCall_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullValue__TypeAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralNullValueAccess().getTypeXIDParserRuleCall_2_1_0()); }
+		ruleXID
+		{ after(grammarAccess.getLiteralNullValueAccess().getTypeXIDParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeVariable__SymbolAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0()); }
+			'$time'
+			{ after(grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeDeltaVariable__SymbolAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0()); }
+			'$delta'
+			{ after(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralThisInstance__SymbolAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0()); }
+			'$this'
+			{ after(grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSelfInstance__SymbolAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0()); }
+			'$self'
+			{ after(grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralParentInstance__SymbolAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0()); }
+			'$parent'
+			{ after(grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSuperInstance__SymbolAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0()); }
+			'$super'
+			{ after(grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSystemInstance__SymbolAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0()); }
+			'$system'
+			{ after(grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralEnvInstance__SymbolAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAlternatives_1_0()); }
+		(rule__LiteralEnvInstance__SymbolAlternatives_1_0)
+		{ after(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAlternatives_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__NameAssignment_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_0_2_0()); }
+		ruleUFI
+		{ after(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__DescriptionAssignment_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_0_3_0()); }
+		ruleEString
+		{ after(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_0_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__TypeAssignment_0_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_0_6_0()); }
+		ruleUFI
+		{ after(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_0_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__ElementAssignment_0_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_0_8_0()); }
+		ruleDeprecatedProperty
+		{ after(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_0_8_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__NameAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_1_2_0()); }
+		ruleUFI
+		{ after(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__DescriptionAssignment_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_1_3_0()); }
+		ruleEString
+		{ after(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__TypeAssignment_1_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_1_6_0()); }
+		ruleUFI
+		{ after(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_1_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedObject__ElementAssignment_1_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_1_8_0()); }
+		ruleDeprecatedProperty
+		{ after(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_1_8_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__NameAssignment_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_0_2_0()); }
+		ruleXID
+		{ after(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__ElementAssignment_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_0_3_0()); }
+		(rule__DeprecatedSection__ElementAlternatives_0_3_0)
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_0_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__NameAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_1_0_0()); }
+		ruleXID
+		{ after(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__DescriptionAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getDescriptionEStringParserRuleCall_1_1_0()); }
+		ruleEString
+		{ after(grammarAccess.getDeprecatedSectionAccess().getDescriptionEStringParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__ElementAssignment_1_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_0_1_0()); }
+		(rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0)
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedSection__ElementAssignment_1_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_1_1_0()); }
+		(rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0)
+		{ after(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedAttributeAccess().getNameDeprecatedAttributeIDParserRuleCall_1_0()); }
+		ruleDeprecatedAttributeID
+		{ after(grammarAccess.getDeprecatedAttributeAccess().getNameDeprecatedAttributeIDParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedAttribute__ValueAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedAttributeAccess().getValueValueSpecificationParserRuleCall_3_0()); }
+		ruleValueSpecification
+		{ after(grammarAccess.getDeprecatedAttributeAccess().getValueValueSpecificationParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__OperatorAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedExpressionAccess().getOperatorAlternatives_2_0()); }
+		(rule__DeprecatedExpression__OperatorAlternatives_2_0)
+		{ after(grammarAccess.getDeprecatedExpressionAccess().getOperatorAlternatives_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DeprecatedExpression__OperandAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDeprecatedExpressionAccess().getOperandValueSpecificationParserRuleCall_3_0()); }
+		ruleValueSpecification
+		{ after(grammarAccess.getDeprecatedExpressionAccess().getOperandValueSpecificationParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+RULE_XIDENDIFIER : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'#')*;
+
+RULE_AT_IDENTIFIER : '@' RULE_XIDENDIFIER;
+
+RULE_CHARACTER : '\'' . '\'';
+
+RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
+
+RULE_INT : ('0'..'9')+;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEW.tokens b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEW.tokens
new file mode 100644
index 0000000..345a9c0
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEW.tokens
@@ -0,0 +1,142 @@
+'!'=36
+'!='=28
+'$delta'=74
+'$env'=38
+'$parent'=77
+'$self'=76
+'$super'=78
+'$system'=79
+'$this'=75
+'$time'=73
+'${'=71
+'%'=63
+'&&'=25
+'&'=66
+'('=64
+')'=65
+'*'=60
+'**'=61
+'+'=59
+'+:='=22
+','=53
+'-'=68
+'.'=20
+'/'=62
+':'=56
+'::'=19
+':='=21
+';'=58
+'<'=32
+'<='=33
+'=!='=30
+'='=57
+'=/='=31
+'=='=27
+'==='=29
+'>'=34
+'>:'=52
+'>='=35
+'?'=72
+'@favm'=17
+'@sew'=16
+'['=54
+']'=55
+'and'=26
+'as'=69
+'endform'=43
+'endprototype'=45
+'endsection'=47
+'env'=39
+'false'=41
+'form'=42
+'is'=70
+'not'=37
+'null'=67
+'or'=24
+'prototype'=44
+'section'=46
+'sew'=18
+'symbex-workflow'=15
+'true'=40
+'workflow'=14
+'{'=50
+'|;|'=48
+'|i|'=49
+'||'=23
+'}'=51
+RULE_ANY_OTHER=13
+RULE_AT_IDENTIFIER=7
+RULE_CHARACTER=4
+RULE_ID=9
+RULE_INT=8
+RULE_ML_COMMENT=10
+RULE_SL_COMMENT=11
+RULE_STRING=5
+RULE_WS=12
+RULE_XIDENDIFIER=6
+T__14=14
+T__15=15
+T__16=16
+T__17=17
+T__18=18
+T__19=19
+T__20=20
+T__21=21
+T__22=22
+T__23=23
+T__24=24
+T__25=25
+T__26=26
+T__27=27
+T__28=28
+T__29=29
+T__30=30
+T__31=31
+T__32=32
+T__33=33
+T__34=34
+T__35=35
+T__36=36
+T__37=37
+T__38=38
+T__39=39
+T__40=40
+T__41=41
+T__42=42
+T__43=43
+T__44=44
+T__45=45
+T__46=46
+T__47=47
+T__48=48
+T__49=49
+T__50=50
+T__51=51
+T__52=52
+T__53=53
+T__54=54
+T__55=55
+T__56=56
+T__57=57
+T__58=58
+T__59=59
+T__60=60
+T__61=61
+T__62=62
+T__63=63
+T__64=64
+T__65=65
+T__66=66
+T__67=67
+T__68=68
+T__69=69
+T__70=70
+T__71=71
+T__72=72
+T__73=73
+T__74=74
+T__75=75
+T__76=76
+T__77=77
+T__78=78
+T__79=79
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEWLexer.java b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEWLexer.java
new file mode 100644
index 0000000..d5980d9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEWLexer.java
@@ -0,0 +1,3034 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+package org.eclipse.efm.sew.xtext.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalSEWLexer extends Lexer {
+    public static final int T__50=50;
+    public static final int RULE_CHARACTER=4;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__59=59;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__14=14;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__52=52;
+    public static final int T__53=53;
+    public static final int T__54=54;
+    public static final int T__60=60;
+    public static final int T__61=61;
+    public static final int RULE_XIDENDIFIER=6;
+    public static final int RULE_ID=9;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int RULE_INT=8;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__66=66;
+    public static final int RULE_ML_COMMENT=10;
+    public static final int T__23=23;
+    public static final int T__67=67;
+    public static final int T__24=24;
+    public static final int T__68=68;
+    public static final int T__25=25;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__63=63;
+    public static final int T__20=20;
+    public static final int T__64=64;
+    public static final int T__21=21;
+    public static final int T__65=65;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=5;
+    public static final int RULE_SL_COMMENT=11;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__77=77;
+    public static final int T__34=34;
+    public static final int T__78=78;
+    public static final int T__35=35;
+    public static final int T__79=79;
+    public static final int T__36=36;
+    public static final int T__73=73;
+    public static final int EOF=-1;
+    public static final int T__30=30;
+    public static final int T__74=74;
+    public static final int T__31=31;
+    public static final int T__75=75;
+    public static final int T__32=32;
+    public static final int T__76=76;
+    public static final int RULE_WS=12;
+    public static final int RULE_ANY_OTHER=13;
+    public static final int RULE_AT_IDENTIFIER=7;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__41=41;
+    public static final int T__42=42;
+    public static final int T__43=43;
+
+    // delegates
+    // delegators
+
+    public InternalSEWLexer() {;} 
+    public InternalSEWLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalSEWLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "InternalSEW.g"; }
+
+    // $ANTLR start "T__14"
+    public final void mT__14() throws RecognitionException {
+        try {
+            int _type = T__14;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:11:7: ( 'workflow' )
+            // InternalSEW.g:11:9: 'workflow'
+            {
+            match("workflow"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__14"
+
+    // $ANTLR start "T__15"
+    public final void mT__15() throws RecognitionException {
+        try {
+            int _type = T__15;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:12:7: ( 'symbex-workflow' )
+            // InternalSEW.g:12:9: 'symbex-workflow'
+            {
+            match("symbex-workflow"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__15"
+
+    // $ANTLR start "T__16"
+    public final void mT__16() throws RecognitionException {
+        try {
+            int _type = T__16;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:13:7: ( '@sew' )
+            // InternalSEW.g:13:9: '@sew'
+            {
+            match("@sew"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__16"
+
+    // $ANTLR start "T__17"
+    public final void mT__17() throws RecognitionException {
+        try {
+            int _type = T__17;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:14:7: ( '@favm' )
+            // InternalSEW.g:14:9: '@favm'
+            {
+            match("@favm"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__17"
+
+    // $ANTLR start "T__18"
+    public final void mT__18() throws RecognitionException {
+        try {
+            int _type = T__18;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:15:7: ( 'sew' )
+            // InternalSEW.g:15:9: 'sew'
+            {
+            match("sew"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__18"
+
+    // $ANTLR start "T__19"
+    public final void mT__19() throws RecognitionException {
+        try {
+            int _type = T__19;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:16:7: ( '::' )
+            // InternalSEW.g:16:9: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__19"
+
+    // $ANTLR start "T__20"
+    public final void mT__20() throws RecognitionException {
+        try {
+            int _type = T__20;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:17:7: ( '.' )
+            // InternalSEW.g:17:9: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__20"
+
+    // $ANTLR start "T__21"
+    public final void mT__21() throws RecognitionException {
+        try {
+            int _type = T__21;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:18:7: ( ':=' )
+            // InternalSEW.g:18:9: ':='
+            {
+            match(":="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__21"
+
+    // $ANTLR start "T__22"
+    public final void mT__22() throws RecognitionException {
+        try {
+            int _type = T__22;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:19:7: ( '+:=' )
+            // InternalSEW.g:19:9: '+:='
+            {
+            match("+:="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__22"
+
+    // $ANTLR start "T__23"
+    public final void mT__23() throws RecognitionException {
+        try {
+            int _type = T__23;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:20:7: ( '||' )
+            // InternalSEW.g:20:9: '||'
+            {
+            match("||"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__23"
+
+    // $ANTLR start "T__24"
+    public final void mT__24() throws RecognitionException {
+        try {
+            int _type = T__24;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:21:7: ( 'or' )
+            // InternalSEW.g:21:9: 'or'
+            {
+            match("or"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__24"
+
+    // $ANTLR start "T__25"
+    public final void mT__25() throws RecognitionException {
+        try {
+            int _type = T__25;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:22:7: ( '&&' )
+            // InternalSEW.g:22:9: '&&'
+            {
+            match("&&"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__25"
+
+    // $ANTLR start "T__26"
+    public final void mT__26() throws RecognitionException {
+        try {
+            int _type = T__26;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:23:7: ( 'and' )
+            // InternalSEW.g:23:9: 'and'
+            {
+            match("and"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__26"
+
+    // $ANTLR start "T__27"
+    public final void mT__27() throws RecognitionException {
+        try {
+            int _type = T__27;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:24:7: ( '==' )
+            // InternalSEW.g:24:9: '=='
+            {
+            match("=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__27"
+
+    // $ANTLR start "T__28"
+    public final void mT__28() throws RecognitionException {
+        try {
+            int _type = T__28;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:25:7: ( '!=' )
+            // InternalSEW.g:25:9: '!='
+            {
+            match("!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__28"
+
+    // $ANTLR start "T__29"
+    public final void mT__29() throws RecognitionException {
+        try {
+            int _type = T__29;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:26:7: ( '===' )
+            // InternalSEW.g:26:9: '==='
+            {
+            match("==="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__29"
+
+    // $ANTLR start "T__30"
+    public final void mT__30() throws RecognitionException {
+        try {
+            int _type = T__30;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:27:7: ( '=!=' )
+            // InternalSEW.g:27:9: '=!='
+            {
+            match("=!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__30"
+
+    // $ANTLR start "T__31"
+    public final void mT__31() throws RecognitionException {
+        try {
+            int _type = T__31;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:28:7: ( '=/=' )
+            // InternalSEW.g:28:9: '=/='
+            {
+            match("=/="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__31"
+
+    // $ANTLR start "T__32"
+    public final void mT__32() throws RecognitionException {
+        try {
+            int _type = T__32;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:29:7: ( '<' )
+            // InternalSEW.g:29:9: '<'
+            {
+            match('<'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__32"
+
+    // $ANTLR start "T__33"
+    public final void mT__33() throws RecognitionException {
+        try {
+            int _type = T__33;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:30:7: ( '<=' )
+            // InternalSEW.g:30:9: '<='
+            {
+            match("<="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__33"
+
+    // $ANTLR start "T__34"
+    public final void mT__34() throws RecognitionException {
+        try {
+            int _type = T__34;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:31:7: ( '>' )
+            // InternalSEW.g:31:9: '>'
+            {
+            match('>'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__34"
+
+    // $ANTLR start "T__35"
+    public final void mT__35() throws RecognitionException {
+        try {
+            int _type = T__35;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:32:7: ( '>=' )
+            // InternalSEW.g:32:9: '>='
+            {
+            match(">="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__35"
+
+    // $ANTLR start "T__36"
+    public final void mT__36() throws RecognitionException {
+        try {
+            int _type = T__36;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:33:7: ( '!' )
+            // InternalSEW.g:33:9: '!'
+            {
+            match('!'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__36"
+
+    // $ANTLR start "T__37"
+    public final void mT__37() throws RecognitionException {
+        try {
+            int _type = T__37;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:34:7: ( 'not' )
+            // InternalSEW.g:34:9: 'not'
+            {
+            match("not"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__37"
+
+    // $ANTLR start "T__38"
+    public final void mT__38() throws RecognitionException {
+        try {
+            int _type = T__38;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:35:7: ( '$env' )
+            // InternalSEW.g:35:9: '$env'
+            {
+            match("$env"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__38"
+
+    // $ANTLR start "T__39"
+    public final void mT__39() throws RecognitionException {
+        try {
+            int _type = T__39;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:36:7: ( 'env' )
+            // InternalSEW.g:36:9: 'env'
+            {
+            match("env"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__39"
+
+    // $ANTLR start "T__40"
+    public final void mT__40() throws RecognitionException {
+        try {
+            int _type = T__40;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:37:7: ( 'true' )
+            // InternalSEW.g:37:9: 'true'
+            {
+            match("true"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__40"
+
+    // $ANTLR start "T__41"
+    public final void mT__41() throws RecognitionException {
+        try {
+            int _type = T__41;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:38:7: ( 'false' )
+            // InternalSEW.g:38:9: 'false'
+            {
+            match("false"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__41"
+
+    // $ANTLR start "T__42"
+    public final void mT__42() throws RecognitionException {
+        try {
+            int _type = T__42;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:39:7: ( 'form' )
+            // InternalSEW.g:39:9: 'form'
+            {
+            match("form"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__42"
+
+    // $ANTLR start "T__43"
+    public final void mT__43() throws RecognitionException {
+        try {
+            int _type = T__43;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:40:7: ( 'endform' )
+            // InternalSEW.g:40:9: 'endform'
+            {
+            match("endform"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__43"
+
+    // $ANTLR start "T__44"
+    public final void mT__44() throws RecognitionException {
+        try {
+            int _type = T__44;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:41:7: ( 'prototype' )
+            // InternalSEW.g:41:9: 'prototype'
+            {
+            match("prototype"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__44"
+
+    // $ANTLR start "T__45"
+    public final void mT__45() throws RecognitionException {
+        try {
+            int _type = T__45;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:42:7: ( 'endprototype' )
+            // InternalSEW.g:42:9: 'endprototype'
+            {
+            match("endprototype"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__45"
+
+    // $ANTLR start "T__46"
+    public final void mT__46() throws RecognitionException {
+        try {
+            int _type = T__46;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:43:7: ( 'section' )
+            // InternalSEW.g:43:9: 'section'
+            {
+            match("section"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__46"
+
+    // $ANTLR start "T__47"
+    public final void mT__47() throws RecognitionException {
+        try {
+            int _type = T__47;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:44:7: ( 'endsection' )
+            // InternalSEW.g:44:9: 'endsection'
+            {
+            match("endsection"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__47"
+
+    // $ANTLR start "T__48"
+    public final void mT__48() throws RecognitionException {
+        try {
+            int _type = T__48;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:45:7: ( '|;|' )
+            // InternalSEW.g:45:9: '|;|'
+            {
+            match("|;|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__48"
+
+    // $ANTLR start "T__49"
+    public final void mT__49() throws RecognitionException {
+        try {
+            int _type = T__49;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:46:7: ( '|i|' )
+            // InternalSEW.g:46:9: '|i|'
+            {
+            match("|i|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__49"
+
+    // $ANTLR start "T__50"
+    public final void mT__50() throws RecognitionException {
+        try {
+            int _type = T__50;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:47:7: ( '{' )
+            // InternalSEW.g:47:9: '{'
+            {
+            match('{'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__50"
+
+    // $ANTLR start "T__51"
+    public final void mT__51() throws RecognitionException {
+        try {
+            int _type = T__51;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:48:7: ( '}' )
+            // InternalSEW.g:48:9: '}'
+            {
+            match('}'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__51"
+
+    // $ANTLR start "T__52"
+    public final void mT__52() throws RecognitionException {
+        try {
+            int _type = T__52;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:49:7: ( '>:' )
+            // InternalSEW.g:49:9: '>:'
+            {
+            match(">:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__52"
+
+    // $ANTLR start "T__53"
+    public final void mT__53() throws RecognitionException {
+        try {
+            int _type = T__53;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:50:7: ( ',' )
+            // InternalSEW.g:50:9: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__53"
+
+    // $ANTLR start "T__54"
+    public final void mT__54() throws RecognitionException {
+        try {
+            int _type = T__54;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:51:7: ( '[' )
+            // InternalSEW.g:51:9: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__54"
+
+    // $ANTLR start "T__55"
+    public final void mT__55() throws RecognitionException {
+        try {
+            int _type = T__55;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:52:7: ( ']' )
+            // InternalSEW.g:52:9: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__55"
+
+    // $ANTLR start "T__56"
+    public final void mT__56() throws RecognitionException {
+        try {
+            int _type = T__56;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:53:7: ( ':' )
+            // InternalSEW.g:53:9: ':'
+            {
+            match(':'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__56"
+
+    // $ANTLR start "T__57"
+    public final void mT__57() throws RecognitionException {
+        try {
+            int _type = T__57;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:54:7: ( '=' )
+            // InternalSEW.g:54:9: '='
+            {
+            match('='); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__57"
+
+    // $ANTLR start "T__58"
+    public final void mT__58() throws RecognitionException {
+        try {
+            int _type = T__58;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:55:7: ( ';' )
+            // InternalSEW.g:55:9: ';'
+            {
+            match(';'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__58"
+
+    // $ANTLR start "T__59"
+    public final void mT__59() throws RecognitionException {
+        try {
+            int _type = T__59;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:56:7: ( '+' )
+            // InternalSEW.g:56:9: '+'
+            {
+            match('+'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__59"
+
+    // $ANTLR start "T__60"
+    public final void mT__60() throws RecognitionException {
+        try {
+            int _type = T__60;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:57:7: ( '*' )
+            // InternalSEW.g:57:9: '*'
+            {
+            match('*'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__60"
+
+    // $ANTLR start "T__61"
+    public final void mT__61() throws RecognitionException {
+        try {
+            int _type = T__61;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:58:7: ( '**' )
+            // InternalSEW.g:58:9: '**'
+            {
+            match("**"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__61"
+
+    // $ANTLR start "T__62"
+    public final void mT__62() throws RecognitionException {
+        try {
+            int _type = T__62;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:59:7: ( '/' )
+            // InternalSEW.g:59:9: '/'
+            {
+            match('/'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__62"
+
+    // $ANTLR start "T__63"
+    public final void mT__63() throws RecognitionException {
+        try {
+            int _type = T__63;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:60:7: ( '%' )
+            // InternalSEW.g:60:9: '%'
+            {
+            match('%'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__63"
+
+    // $ANTLR start "T__64"
+    public final void mT__64() throws RecognitionException {
+        try {
+            int _type = T__64;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:61:7: ( '(' )
+            // InternalSEW.g:61:9: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__64"
+
+    // $ANTLR start "T__65"
+    public final void mT__65() throws RecognitionException {
+        try {
+            int _type = T__65;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:62:7: ( ')' )
+            // InternalSEW.g:62:9: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__65"
+
+    // $ANTLR start "T__66"
+    public final void mT__66() throws RecognitionException {
+        try {
+            int _type = T__66;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:63:7: ( '&' )
+            // InternalSEW.g:63:9: '&'
+            {
+            match('&'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__66"
+
+    // $ANTLR start "T__67"
+    public final void mT__67() throws RecognitionException {
+        try {
+            int _type = T__67;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:64:7: ( 'null' )
+            // InternalSEW.g:64:9: 'null'
+            {
+            match("null"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__67"
+
+    // $ANTLR start "T__68"
+    public final void mT__68() throws RecognitionException {
+        try {
+            int _type = T__68;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:65:7: ( '-' )
+            // InternalSEW.g:65:9: '-'
+            {
+            match('-'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__68"
+
+    // $ANTLR start "T__69"
+    public final void mT__69() throws RecognitionException {
+        try {
+            int _type = T__69;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:66:7: ( 'as' )
+            // InternalSEW.g:66:9: 'as'
+            {
+            match("as"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__69"
+
+    // $ANTLR start "T__70"
+    public final void mT__70() throws RecognitionException {
+        try {
+            int _type = T__70;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:67:7: ( 'is' )
+            // InternalSEW.g:67:9: 'is'
+            {
+            match("is"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__70"
+
+    // $ANTLR start "T__71"
+    public final void mT__71() throws RecognitionException {
+        try {
+            int _type = T__71;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:68:7: ( '${' )
+            // InternalSEW.g:68:9: '${'
+            {
+            match("${"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__71"
+
+    // $ANTLR start "T__72"
+    public final void mT__72() throws RecognitionException {
+        try {
+            int _type = T__72;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:69:7: ( '?' )
+            // InternalSEW.g:69:9: '?'
+            {
+            match('?'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__72"
+
+    // $ANTLR start "T__73"
+    public final void mT__73() throws RecognitionException {
+        try {
+            int _type = T__73;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:70:7: ( '$time' )
+            // InternalSEW.g:70:9: '$time'
+            {
+            match("$time"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__73"
+
+    // $ANTLR start "T__74"
+    public final void mT__74() throws RecognitionException {
+        try {
+            int _type = T__74;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:71:7: ( '$delta' )
+            // InternalSEW.g:71:9: '$delta'
+            {
+            match("$delta"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__74"
+
+    // $ANTLR start "T__75"
+    public final void mT__75() throws RecognitionException {
+        try {
+            int _type = T__75;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:72:7: ( '$this' )
+            // InternalSEW.g:72:9: '$this'
+            {
+            match("$this"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__75"
+
+    // $ANTLR start "T__76"
+    public final void mT__76() throws RecognitionException {
+        try {
+            int _type = T__76;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:73:7: ( '$self' )
+            // InternalSEW.g:73:9: '$self'
+            {
+            match("$self"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__76"
+
+    // $ANTLR start "T__77"
+    public final void mT__77() throws RecognitionException {
+        try {
+            int _type = T__77;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:74:7: ( '$parent' )
+            // InternalSEW.g:74:9: '$parent'
+            {
+            match("$parent"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__77"
+
+    // $ANTLR start "T__78"
+    public final void mT__78() throws RecognitionException {
+        try {
+            int _type = T__78;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:75:7: ( '$super' )
+            // InternalSEW.g:75:9: '$super'
+            {
+            match("$super"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__78"
+
+    // $ANTLR start "T__79"
+    public final void mT__79() throws RecognitionException {
+        try {
+            int _type = T__79;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:76:7: ( '$system' )
+            // InternalSEW.g:76:9: '$system'
+            {
+            match("$system"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__79"
+
+    // $ANTLR start "RULE_XIDENDIFIER"
+    public final void mRULE_XIDENDIFIER() throws RecognitionException {
+        try {
+            int _type = RULE_XIDENDIFIER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9786:18: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )* )
+            // InternalSEW.g:9786:20: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )*
+            {
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalSEW.g:9786:44: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0=='#'||(LA1_0>='0' && LA1_0<='9')||(LA1_0>='A' && LA1_0<='Z')||LA1_0=='_'||(LA1_0>='a' && LA1_0<='z')) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // InternalSEW.g:
+            	    {
+            	    if ( input.LA(1)=='#'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_XIDENDIFIER"
+
+    // $ANTLR start "RULE_AT_IDENTIFIER"
+    public final void mRULE_AT_IDENTIFIER() throws RecognitionException {
+        try {
+            int _type = RULE_AT_IDENTIFIER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9788:20: ( '@' RULE_XIDENDIFIER )
+            // InternalSEW.g:9788:22: '@' RULE_XIDENDIFIER
+            {
+            match('@'); 
+            mRULE_XIDENDIFIER(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_AT_IDENTIFIER"
+
+    // $ANTLR start "RULE_CHARACTER"
+    public final void mRULE_CHARACTER() throws RecognitionException {
+        try {
+            int _type = RULE_CHARACTER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9790:16: ( '\\'' . '\\'' )
+            // InternalSEW.g:9790:18: '\\'' . '\\''
+            {
+            match('\''); 
+            matchAny(); 
+            match('\''); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_CHARACTER"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9792:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* )
+            // InternalSEW.g:9792:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            {
+            // InternalSEW.g:9792:11: ( '^' )?
+            int alt2=2;
+            int LA2_0 = input.LA(1);
+
+            if ( (LA2_0=='^') ) {
+                alt2=1;
+            }
+            switch (alt2) {
+                case 1 :
+                    // InternalSEW.g:9792:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalSEW.g:9792:40: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( ((LA3_0>='0' && LA3_0<='9')||(LA3_0>='A' && LA3_0<='Z')||LA3_0=='_'||(LA3_0>='a' && LA3_0<='z')) ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+            	case 1 :
+            	    // InternalSEW.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop3;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9794:10: ( ( '0' .. '9' )+ )
+            // InternalSEW.g:9794:12: ( '0' .. '9' )+
+            {
+            // InternalSEW.g:9794:12: ( '0' .. '9' )+
+            int cnt4=0;
+            loop4:
+            do {
+                int alt4=2;
+                int LA4_0 = input.LA(1);
+
+                if ( ((LA4_0>='0' && LA4_0<='9')) ) {
+                    alt4=1;
+                }
+
+
+                switch (alt4) {
+            	case 1 :
+            	    // InternalSEW.g:9794:13: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt4 >= 1 ) break loop4;
+                        EarlyExitException eee =
+                            new EarlyExitException(4, input);
+                        throw eee;
+                }
+                cnt4++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9796:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
+            // InternalSEW.g:9796:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            {
+            // InternalSEW.g:9796:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0=='\"') ) {
+                alt7=1;
+            }
+            else if ( (LA7_0=='\'') ) {
+                alt7=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalSEW.g:9796:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+                    {
+                    match('\"'); 
+                    // InternalSEW.g:9796:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop5:
+                    do {
+                        int alt5=3;
+                        int LA5_0 = input.LA(1);
+
+                        if ( (LA5_0=='\\') ) {
+                            alt5=1;
+                        }
+                        else if ( ((LA5_0>='\u0000' && LA5_0<='!')||(LA5_0>='#' && LA5_0<='[')||(LA5_0>=']' && LA5_0<='\uFFFF')) ) {
+                            alt5=2;
+                        }
+
+
+                        switch (alt5) {
+                    	case 1 :
+                    	    // InternalSEW.g:9796:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalSEW.g:9796:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop5;
+                        }
+                    } while (true);
+
+                    match('\"'); 
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:9796:48: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+                    {
+                    match('\''); 
+                    // InternalSEW.g:9796:53: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop6:
+                    do {
+                        int alt6=3;
+                        int LA6_0 = input.LA(1);
+
+                        if ( (LA6_0=='\\') ) {
+                            alt6=1;
+                        }
+                        else if ( ((LA6_0>='\u0000' && LA6_0<='&')||(LA6_0>='(' && LA6_0<='[')||(LA6_0>=']' && LA6_0<='\uFFFF')) ) {
+                            alt6=2;
+                        }
+
+
+                        switch (alt6) {
+                    	case 1 :
+                    	    // InternalSEW.g:9796:54: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalSEW.g:9796:61: ~ ( ( '\\\\' | '\\'' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop6;
+                        }
+                    } while (true);
+
+                    match('\''); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_STRING"
+
+    // $ANTLR start "RULE_ML_COMMENT"
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9798:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalSEW.g:9798:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // InternalSEW.g:9798:24: ( options {greedy=false; } : . )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( (LA8_0=='*') ) {
+                    int LA8_1 = input.LA(2);
+
+                    if ( (LA8_1=='/') ) {
+                        alt8=2;
+                    }
+                    else if ( ((LA8_1>='\u0000' && LA8_1<='.')||(LA8_1>='0' && LA8_1<='\uFFFF')) ) {
+                        alt8=1;
+                    }
+
+
+                }
+                else if ( ((LA8_0>='\u0000' && LA8_0<=')')||(LA8_0>='+' && LA8_0<='\uFFFF')) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // InternalSEW.g:9798:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ML_COMMENT"
+
+    // $ANTLR start "RULE_SL_COMMENT"
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9800:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalSEW.g:9800:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // InternalSEW.g:9800:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop9:
+            do {
+                int alt9=2;
+                int LA9_0 = input.LA(1);
+
+                if ( ((LA9_0>='\u0000' && LA9_0<='\t')||(LA9_0>='\u000B' && LA9_0<='\f')||(LA9_0>='\u000E' && LA9_0<='\uFFFF')) ) {
+                    alt9=1;
+                }
+
+
+                switch (alt9) {
+            	case 1 :
+            	    // InternalSEW.g:9800:24: ~ ( ( '\\n' | '\\r' ) )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop9;
+                }
+            } while (true);
+
+            // InternalSEW.g:9800:40: ( ( '\\r' )? '\\n' )?
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0=='\n'||LA11_0=='\r') ) {
+                alt11=1;
+            }
+            switch (alt11) {
+                case 1 :
+                    // InternalSEW.g:9800:41: ( '\\r' )? '\\n'
+                    {
+                    // InternalSEW.g:9800:41: ( '\\r' )?
+                    int alt10=2;
+                    int LA10_0 = input.LA(1);
+
+                    if ( (LA10_0=='\r') ) {
+                        alt10=1;
+                    }
+                    switch (alt10) {
+                        case 1 :
+                            // InternalSEW.g:9800:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_SL_COMMENT"
+
+    // $ANTLR start "RULE_WS"
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9802:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalSEW.g:9802:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // InternalSEW.g:9802:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt12=0;
+            loop12:
+            do {
+                int alt12=2;
+                int LA12_0 = input.LA(1);
+
+                if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {
+                    alt12=1;
+                }
+
+
+                switch (alt12) {
+            	case 1 :
+            	    // InternalSEW.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt12 >= 1 ) break loop12;
+                        EarlyExitException eee =
+                            new EarlyExitException(12, input);
+                        throw eee;
+                }
+                cnt12++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_WS"
+
+    // $ANTLR start "RULE_ANY_OTHER"
+    public final void mRULE_ANY_OTHER() throws RecognitionException {
+        try {
+            int _type = RULE_ANY_OTHER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:9804:16: ( . )
+            // InternalSEW.g:9804:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // InternalSEW.g:1:8: ( T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | RULE_XIDENDIFIER | RULE_AT_IDENTIFIER | RULE_CHARACTER | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt13=76;
+        alt13 = dfa13.predict(input);
+        switch (alt13) {
+            case 1 :
+                // InternalSEW.g:1:10: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 2 :
+                // InternalSEW.g:1:16: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 3 :
+                // InternalSEW.g:1:22: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 4 :
+                // InternalSEW.g:1:28: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 5 :
+                // InternalSEW.g:1:34: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 6 :
+                // InternalSEW.g:1:40: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 7 :
+                // InternalSEW.g:1:46: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 8 :
+                // InternalSEW.g:1:52: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 9 :
+                // InternalSEW.g:1:58: T__22
+                {
+                mT__22(); 
+
+                }
+                break;
+            case 10 :
+                // InternalSEW.g:1:64: T__23
+                {
+                mT__23(); 
+
+                }
+                break;
+            case 11 :
+                // InternalSEW.g:1:70: T__24
+                {
+                mT__24(); 
+
+                }
+                break;
+            case 12 :
+                // InternalSEW.g:1:76: T__25
+                {
+                mT__25(); 
+
+                }
+                break;
+            case 13 :
+                // InternalSEW.g:1:82: T__26
+                {
+                mT__26(); 
+
+                }
+                break;
+            case 14 :
+                // InternalSEW.g:1:88: T__27
+                {
+                mT__27(); 
+
+                }
+                break;
+            case 15 :
+                // InternalSEW.g:1:94: T__28
+                {
+                mT__28(); 
+
+                }
+                break;
+            case 16 :
+                // InternalSEW.g:1:100: T__29
+                {
+                mT__29(); 
+
+                }
+                break;
+            case 17 :
+                // InternalSEW.g:1:106: T__30
+                {
+                mT__30(); 
+
+                }
+                break;
+            case 18 :
+                // InternalSEW.g:1:112: T__31
+                {
+                mT__31(); 
+
+                }
+                break;
+            case 19 :
+                // InternalSEW.g:1:118: T__32
+                {
+                mT__32(); 
+
+                }
+                break;
+            case 20 :
+                // InternalSEW.g:1:124: T__33
+                {
+                mT__33(); 
+
+                }
+                break;
+            case 21 :
+                // InternalSEW.g:1:130: T__34
+                {
+                mT__34(); 
+
+                }
+                break;
+            case 22 :
+                // InternalSEW.g:1:136: T__35
+                {
+                mT__35(); 
+
+                }
+                break;
+            case 23 :
+                // InternalSEW.g:1:142: T__36
+                {
+                mT__36(); 
+
+                }
+                break;
+            case 24 :
+                // InternalSEW.g:1:148: T__37
+                {
+                mT__37(); 
+
+                }
+                break;
+            case 25 :
+                // InternalSEW.g:1:154: T__38
+                {
+                mT__38(); 
+
+                }
+                break;
+            case 26 :
+                // InternalSEW.g:1:160: T__39
+                {
+                mT__39(); 
+
+                }
+                break;
+            case 27 :
+                // InternalSEW.g:1:166: T__40
+                {
+                mT__40(); 
+
+                }
+                break;
+            case 28 :
+                // InternalSEW.g:1:172: T__41
+                {
+                mT__41(); 
+
+                }
+                break;
+            case 29 :
+                // InternalSEW.g:1:178: T__42
+                {
+                mT__42(); 
+
+                }
+                break;
+            case 30 :
+                // InternalSEW.g:1:184: T__43
+                {
+                mT__43(); 
+
+                }
+                break;
+            case 31 :
+                // InternalSEW.g:1:190: T__44
+                {
+                mT__44(); 
+
+                }
+                break;
+            case 32 :
+                // InternalSEW.g:1:196: T__45
+                {
+                mT__45(); 
+
+                }
+                break;
+            case 33 :
+                // InternalSEW.g:1:202: T__46
+                {
+                mT__46(); 
+
+                }
+                break;
+            case 34 :
+                // InternalSEW.g:1:208: T__47
+                {
+                mT__47(); 
+
+                }
+                break;
+            case 35 :
+                // InternalSEW.g:1:214: T__48
+                {
+                mT__48(); 
+
+                }
+                break;
+            case 36 :
+                // InternalSEW.g:1:220: T__49
+                {
+                mT__49(); 
+
+                }
+                break;
+            case 37 :
+                // InternalSEW.g:1:226: T__50
+                {
+                mT__50(); 
+
+                }
+                break;
+            case 38 :
+                // InternalSEW.g:1:232: T__51
+                {
+                mT__51(); 
+
+                }
+                break;
+            case 39 :
+                // InternalSEW.g:1:238: T__52
+                {
+                mT__52(); 
+
+                }
+                break;
+            case 40 :
+                // InternalSEW.g:1:244: T__53
+                {
+                mT__53(); 
+
+                }
+                break;
+            case 41 :
+                // InternalSEW.g:1:250: T__54
+                {
+                mT__54(); 
+
+                }
+                break;
+            case 42 :
+                // InternalSEW.g:1:256: T__55
+                {
+                mT__55(); 
+
+                }
+                break;
+            case 43 :
+                // InternalSEW.g:1:262: T__56
+                {
+                mT__56(); 
+
+                }
+                break;
+            case 44 :
+                // InternalSEW.g:1:268: T__57
+                {
+                mT__57(); 
+
+                }
+                break;
+            case 45 :
+                // InternalSEW.g:1:274: T__58
+                {
+                mT__58(); 
+
+                }
+                break;
+            case 46 :
+                // InternalSEW.g:1:280: T__59
+                {
+                mT__59(); 
+
+                }
+                break;
+            case 47 :
+                // InternalSEW.g:1:286: T__60
+                {
+                mT__60(); 
+
+                }
+                break;
+            case 48 :
+                // InternalSEW.g:1:292: T__61
+                {
+                mT__61(); 
+
+                }
+                break;
+            case 49 :
+                // InternalSEW.g:1:298: T__62
+                {
+                mT__62(); 
+
+                }
+                break;
+            case 50 :
+                // InternalSEW.g:1:304: T__63
+                {
+                mT__63(); 
+
+                }
+                break;
+            case 51 :
+                // InternalSEW.g:1:310: T__64
+                {
+                mT__64(); 
+
+                }
+                break;
+            case 52 :
+                // InternalSEW.g:1:316: T__65
+                {
+                mT__65(); 
+
+                }
+                break;
+            case 53 :
+                // InternalSEW.g:1:322: T__66
+                {
+                mT__66(); 
+
+                }
+                break;
+            case 54 :
+                // InternalSEW.g:1:328: T__67
+                {
+                mT__67(); 
+
+                }
+                break;
+            case 55 :
+                // InternalSEW.g:1:334: T__68
+                {
+                mT__68(); 
+
+                }
+                break;
+            case 56 :
+                // InternalSEW.g:1:340: T__69
+                {
+                mT__69(); 
+
+                }
+                break;
+            case 57 :
+                // InternalSEW.g:1:346: T__70
+                {
+                mT__70(); 
+
+                }
+                break;
+            case 58 :
+                // InternalSEW.g:1:352: T__71
+                {
+                mT__71(); 
+
+                }
+                break;
+            case 59 :
+                // InternalSEW.g:1:358: T__72
+                {
+                mT__72(); 
+
+                }
+                break;
+            case 60 :
+                // InternalSEW.g:1:364: T__73
+                {
+                mT__73(); 
+
+                }
+                break;
+            case 61 :
+                // InternalSEW.g:1:370: T__74
+                {
+                mT__74(); 
+
+                }
+                break;
+            case 62 :
+                // InternalSEW.g:1:376: T__75
+                {
+                mT__75(); 
+
+                }
+                break;
+            case 63 :
+                // InternalSEW.g:1:382: T__76
+                {
+                mT__76(); 
+
+                }
+                break;
+            case 64 :
+                // InternalSEW.g:1:388: T__77
+                {
+                mT__77(); 
+
+                }
+                break;
+            case 65 :
+                // InternalSEW.g:1:394: T__78
+                {
+                mT__78(); 
+
+                }
+                break;
+            case 66 :
+                // InternalSEW.g:1:400: T__79
+                {
+                mT__79(); 
+
+                }
+                break;
+            case 67 :
+                // InternalSEW.g:1:406: RULE_XIDENDIFIER
+                {
+                mRULE_XIDENDIFIER(); 
+
+                }
+                break;
+            case 68 :
+                // InternalSEW.g:1:423: RULE_AT_IDENTIFIER
+                {
+                mRULE_AT_IDENTIFIER(); 
+
+                }
+                break;
+            case 69 :
+                // InternalSEW.g:1:442: RULE_CHARACTER
+                {
+                mRULE_CHARACTER(); 
+
+                }
+                break;
+            case 70 :
+                // InternalSEW.g:1:457: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 71 :
+                // InternalSEW.g:1:465: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 72 :
+                // InternalSEW.g:1:474: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 73 :
+                // InternalSEW.g:1:486: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 74 :
+                // InternalSEW.g:1:502: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 75 :
+                // InternalSEW.g:1:518: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 76 :
+                // InternalSEW.g:1:526: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA13 dfa13 = new DFA13(this);
+    static final String DFA13_eotS =
+        "\1\uffff\2\53\1\51\1\64\1\uffff\1\67\1\51\1\53\1\75\1\53\1\103\1\105\1\107\1\112\1\53\1\51\4\53\6\uffff\1\137\1\142\4\uffff\1\53\1\uffff\1\53\2\51\1\uffff\1\51\2\uffff\1\53\1\uffff\3\53\2\61\12\uffff\1\166\2\uffff\1\53\1\170\1\172\12\uffff\2\53\6\uffff\5\53\17\uffff\1\u0088\3\uffff\1\156\4\uffff\2\53\1\u008e\1\53\2\61\1\uffff\1\u0092\3\uffff\1\u0093\1\53\5\uffff\1\u0095\5\53\1\uffff\1\u008b\2\uffff\2\53\1\uffff\1\53\1\u00a0\1\61\2\uffff\1\u00a2\1\uffff\3\53\1\u00a6\1\53\1\u00a8\4\53\1\uffff\1\u00ad\1\uffff\3\53\1\uffff\1\u00b1\1\uffff\4\53\1\uffff\3\53\1\uffff\2\53\1\uffff\1\u00bb\1\u00bc\3\53\1\u00c0\2\uffff\3\53\1\uffff\2\53\1\u00c6\1\53\1\u00c8\1\uffff\1\53\1\uffff\1\u00ca\1\uffff";
+    static final String DFA13_eofS =
+        "\u00cb\uffff";
+    static final String DFA13_minS =
+        "\1\0\2\60\1\101\1\72\1\uffff\1\72\1\73\1\60\1\46\1\60\1\41\2\75\1\72\1\60\1\144\4\60\6\uffff\2\52\4\uffff\1\60\1\uffff\1\60\1\0\1\101\1\uffff\1\0\2\uffff\1\60\1\uffff\3\60\1\145\1\141\12\uffff\1\43\2\uffff\1\60\1\43\1\75\12\uffff\2\60\2\uffff\1\150\1\uffff\1\145\1\uffff\5\60\17\uffff\1\43\1\uffff\2\0\1\47\4\uffff\2\60\1\43\1\60\1\167\1\166\1\uffff\1\43\3\uffff\1\43\1\60\5\uffff\1\43\5\60\1\uffff\1\0\2\uffff\2\60\1\uffff\1\60\1\43\1\155\2\uffff\1\43\1\uffff\3\60\1\43\1\60\1\43\4\60\1\uffff\1\43\1\uffff\3\60\1\uffff\1\43\1\uffff\2\60\1\55\1\60\1\uffff\3\60\1\uffff\2\60\1\uffff\2\43\3\60\1\43\2\uffff\3\60\1\uffff\2\60\1\43\1\60\1\43\1\uffff\1\60\1\uffff\1\43\1\uffff";
+    static final String DFA13_maxS =
+        "\1\uffff\3\172\1\75\1\uffff\1\72\1\174\1\172\1\46\1\172\4\75\1\172\1\173\4\172\6\uffff\1\52\1\57\4\uffff\1\172\1\uffff\1\172\1\uffff\1\172\1\uffff\1\uffff\2\uffff\1\172\1\uffff\3\172\1\145\1\141\12\uffff\1\172\2\uffff\2\172\1\75\12\uffff\2\172\2\uffff\1\151\1\uffff\1\171\1\uffff\5\172\17\uffff\1\172\1\uffff\2\uffff\1\47\4\uffff\4\172\1\167\1\166\1\uffff\1\172\3\uffff\2\172\5\uffff\6\172\1\uffff\1\uffff\2\uffff\2\172\1\uffff\2\172\1\155\2\uffff\1\172\1\uffff\12\172\1\uffff\1\172\1\uffff\3\172\1\uffff\1\172\1\uffff\4\172\1\uffff\3\172\1\uffff\2\172\1\uffff\6\172\2\uffff\3\172\1\uffff\5\172\1\uffff\1\172\1\uffff\1\172\1\uffff";
+    static final String DFA13_acceptS =
+        "\5\uffff\1\7\17\uffff\1\45\1\46\1\50\1\51\1\52\1\55\2\uffff\1\62\1\63\1\64\1\67\1\uffff\1\73\3\uffff\1\107\1\uffff\1\113\1\114\1\uffff\1\103\5\uffff\1\104\1\6\1\10\1\53\1\7\1\11\1\56\1\12\1\43\1\44\1\uffff\1\14\1\65\3\uffff\1\21\1\22\1\54\1\17\1\27\1\24\1\23\1\26\1\47\1\25\2\uffff\1\31\1\72\1\uffff\1\75\1\uffff\1\100\5\uffff\1\45\1\46\1\50\1\51\1\52\1\55\1\60\1\57\1\111\1\112\1\61\1\62\1\63\1\64\1\67\1\uffff\1\73\3\uffff\1\106\1\107\1\110\1\113\6\uffff\1\13\1\uffff\1\70\1\20\1\16\2\uffff\1\74\1\76\1\77\1\101\1\102\6\uffff\1\71\1\uffff\2\105\2\uffff\1\5\3\uffff\1\15\1\30\1\uffff\1\32\12\uffff\1\3\1\uffff\1\66\3\uffff\1\33\1\uffff\1\35\4\uffff\1\4\3\uffff\1\34\2\uffff\1\2\6\uffff\1\41\1\36\3\uffff\1\1\5\uffff\1\37\1\uffff\1\42\1\uffff\1\40";
+    static final String DFA13_specialS =
+        "\1\4\43\uffff\1\5\2\uffff\1\3\101\uffff\1\2\1\0\36\uffff\1\1\101\uffff}>";
+    static final String[] DFA13_transitionS = {
+            "\11\51\2\50\2\51\1\50\22\51\1\50\1\14\1\47\1\51\1\20\1\35\1\11\1\44\1\36\1\37\1\33\1\6\1\27\1\40\1\5\1\34\12\46\1\4\1\32\1\15\1\13\1\16\1\42\1\3\32\43\1\30\1\51\1\31\1\45\1\43\1\51\1\12\3\43\1\21\1\23\2\43\1\41\4\43\1\17\1\10\1\24\2\43\1\2\1\22\2\43\1\1\3\43\1\25\1\7\1\26\uff82\51",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\52\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\56\23\54\1\55\1\54",
+            "\32\61\4\uffff\1\61\1\uffff\5\61\1\60\14\61\1\57\7\61",
+            "\1\62\2\uffff\1\63",
+            "",
+            "\1\66",
+            "\1\71\55\uffff\1\72\22\uffff\1\70",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\73\10\54",
+            "\1\74",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\15\54\1\76\4\54\1\77\7\54",
+            "\1\101\15\uffff\1\102\15\uffff\1\100",
+            "\1\104",
+            "\1\106",
+            "\1\111\2\uffff\1\110",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\113\5\54\1\114\5\54",
+            "\1\120\1\115\12\uffff\1\122\2\uffff\1\121\1\117\6\uffff\1\116",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\15\54\1\123\14\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\124\10\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\1\125\15\54\1\126\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\127\10\54",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\136",
+            "\1\140\4\uffff\1\141",
+            "",
+            "",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\22\54\1\147\7\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\47\152\1\153\64\152\1\151\uffa3\152",
+            "\32\154\4\uffff\1\154\1\uffff\32\154",
+            "",
+            "\0\156",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\160\10\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\14\54\1\161\15\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\2\54\1\163\23\54\1\162\3\54",
+            "\1\164",
+            "\1\165",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\3\54\1\167\26\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\1\171",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\173\6\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\13\54\1\174\16\54",
+            "",
+            "",
+            "\1\176\1\175",
+            "",
+            "\1\177\17\uffff\1\u0080\3\uffff\1\u0081",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\3\54\1\u0083\21\54\1\u0082\4\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\24\54\1\u0084\5\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\13\54\1\u0085\16\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\u0086\10\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u0087\13\54",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "\47\156\1\u0089\uffd8\156",
+            "\47\156\1\u008a\uffd8\156",
+            "\1\u008b",
+            "",
+            "",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\12\54\1\u008c\17\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\1\54\1\u008d\30\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u008f\6\54",
+            "\1\u0090",
+            "\1\u0091",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\13\54\1\u0094\16\54",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\5\54\1\u0096\11\54\1\u0097\2\54\1\u0098\7\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u0099\25\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\22\54\1\u009a\7\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\14\54\1\u009b\15\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u009c\6\54",
+            "",
+            "\0\156",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\5\54\1\u009d\24\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u009e\25\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\10\54\1\u009f\21\54",
+            "\1\61\14\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00a1",
+            "",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00a3\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\u00a4\10\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u00a5\25\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u00a7\25\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00a9\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\13\54\1\u00aa\16\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\27\54\1\u00ab\2\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00ac\13\54",
+            "",
+            "\1\61\14\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\u00ae\10\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00af\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\2\54\1\u00b0\27\54",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u00b2\6\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00b3\13\54",
+            "\1\u00b4\2\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\15\54\1\u00b5\14\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\14\54\1\u00b6\15\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u00b7\6\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u00b8\6\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\30\54\1\u00b9\1\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\26\54\1\u00ba\3\54",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00bd\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\10\54\1\u00be\21\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\17\54\1\u00bf\12\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u00c1\6\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00c2\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u00c3\25\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\30\54\1\u00c4\1\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\15\54\1\u00c5\14\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\17\54\1\u00c7\12\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u00c9\25\54",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            ""
+    };
+
+    static final short[] DFA13_eot = DFA.unpackEncodedString(DFA13_eotS);
+    static final short[] DFA13_eof = DFA.unpackEncodedString(DFA13_eofS);
+    static final char[] DFA13_min = DFA.unpackEncodedStringToUnsignedChars(DFA13_minS);
+    static final char[] DFA13_max = DFA.unpackEncodedStringToUnsignedChars(DFA13_maxS);
+    static final short[] DFA13_accept = DFA.unpackEncodedString(DFA13_acceptS);
+    static final short[] DFA13_special = DFA.unpackEncodedString(DFA13_specialS);
+    static final short[][] DFA13_transition;
+
+    static {
+        int numStates = DFA13_transitionS.length;
+        DFA13_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA13_transition[i] = DFA.unpackEncodedString(DFA13_transitionS[i]);
+        }
+    }
+
+    static class DFA13 extends DFA {
+
+        public DFA13(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 13;
+            this.eot = DFA13_eot;
+            this.eof = DFA13_eof;
+            this.min = DFA13_min;
+            this.max = DFA13_max;
+            this.accept = DFA13_accept;
+            this.special = DFA13_special;
+            this.transition = DFA13_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | RULE_XIDENDIFIER | RULE_AT_IDENTIFIER | RULE_CHARACTER | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            IntStream input = _input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA13_106 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_106=='\'') ) {s = 138;}
+
+                        else if ( ((LA13_106>='\u0000' && LA13_106<='&')||(LA13_106>='(' && LA13_106<='\uFFFF')) ) {s = 110;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA13_137 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA13_137>='\u0000' && LA13_137<='\uFFFF')) ) {s = 110;}
+
+                        else s = 139;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA13_105 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_105=='\'') ) {s = 137;}
+
+                        else if ( ((LA13_105>='\u0000' && LA13_105<='&')||(LA13_105>='(' && LA13_105<='\uFFFF')) ) {s = 110;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA13_39 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA13_39>='\u0000' && LA13_39<='\uFFFF')) ) {s = 110;}
+
+                        else s = 41;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA13_0 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_0=='w') ) {s = 1;}
+
+                        else if ( (LA13_0=='s') ) {s = 2;}
+
+                        else if ( (LA13_0=='@') ) {s = 3;}
+
+                        else if ( (LA13_0==':') ) {s = 4;}
+
+                        else if ( (LA13_0=='.') ) {s = 5;}
+
+                        else if ( (LA13_0=='+') ) {s = 6;}
+
+                        else if ( (LA13_0=='|') ) {s = 7;}
+
+                        else if ( (LA13_0=='o') ) {s = 8;}
+
+                        else if ( (LA13_0=='&') ) {s = 9;}
+
+                        else if ( (LA13_0=='a') ) {s = 10;}
+
+                        else if ( (LA13_0=='=') ) {s = 11;}
+
+                        else if ( (LA13_0=='!') ) {s = 12;}
+
+                        else if ( (LA13_0=='<') ) {s = 13;}
+
+                        else if ( (LA13_0=='>') ) {s = 14;}
+
+                        else if ( (LA13_0=='n') ) {s = 15;}
+
+                        else if ( (LA13_0=='$') ) {s = 16;}
+
+                        else if ( (LA13_0=='e') ) {s = 17;}
+
+                        else if ( (LA13_0=='t') ) {s = 18;}
+
+                        else if ( (LA13_0=='f') ) {s = 19;}
+
+                        else if ( (LA13_0=='p') ) {s = 20;}
+
+                        else if ( (LA13_0=='{') ) {s = 21;}
+
+                        else if ( (LA13_0=='}') ) {s = 22;}
+
+                        else if ( (LA13_0==',') ) {s = 23;}
+
+                        else if ( (LA13_0=='[') ) {s = 24;}
+
+                        else if ( (LA13_0==']') ) {s = 25;}
+
+                        else if ( (LA13_0==';') ) {s = 26;}
+
+                        else if ( (LA13_0=='*') ) {s = 27;}
+
+                        else if ( (LA13_0=='/') ) {s = 28;}
+
+                        else if ( (LA13_0=='%') ) {s = 29;}
+
+                        else if ( (LA13_0=='(') ) {s = 30;}
+
+                        else if ( (LA13_0==')') ) {s = 31;}
+
+                        else if ( (LA13_0=='-') ) {s = 32;}
+
+                        else if ( (LA13_0=='i') ) {s = 33;}
+
+                        else if ( (LA13_0=='?') ) {s = 34;}
+
+                        else if ( ((LA13_0>='A' && LA13_0<='Z')||LA13_0=='_'||(LA13_0>='b' && LA13_0<='d')||(LA13_0>='g' && LA13_0<='h')||(LA13_0>='j' && LA13_0<='m')||(LA13_0>='q' && LA13_0<='r')||(LA13_0>='u' && LA13_0<='v')||(LA13_0>='x' && LA13_0<='z')) ) {s = 35;}
+
+                        else if ( (LA13_0=='\'') ) {s = 36;}
+
+                        else if ( (LA13_0=='^') ) {s = 37;}
+
+                        else if ( ((LA13_0>='0' && LA13_0<='9')) ) {s = 38;}
+
+                        else if ( (LA13_0=='\"') ) {s = 39;}
+
+                        else if ( ((LA13_0>='\t' && LA13_0<='\n')||LA13_0=='\r'||LA13_0==' ') ) {s = 40;}
+
+                        else if ( ((LA13_0>='\u0000' && LA13_0<='\b')||(LA13_0>='\u000B' && LA13_0<='\f')||(LA13_0>='\u000E' && LA13_0<='\u001F')||LA13_0=='#'||LA13_0=='\\'||LA13_0=='`'||(LA13_0>='~' && LA13_0<='\uFFFF')) ) {s = 41;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA13_36 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_36=='\\') ) {s = 105;}
+
+                        else if ( ((LA13_36>='\u0000' && LA13_36<='&')||(LA13_36>='(' && LA13_36<='[')||(LA13_36>=']' && LA13_36<='\uFFFF')) ) {s = 106;}
+
+                        else if ( (LA13_36=='\'') ) {s = 107;}
+
+                        else s = 41;
+
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 13, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+}
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEWParser.java b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEWParser.java
new file mode 100644
index 0000000..5e82318
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/src-gen/org/eclipse/efm/sew/xtext/ide/contentassist/antlr/internal/InternalSEWParser.java
@@ -0,0 +1,34213 @@
+package org.eclipse.efm.sew.xtext.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.efm.sew.xtext.services.SEWGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+@SuppressWarnings("all")
+public class InternalSEWParser extends AbstractInternalContentAssistParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_CHARACTER", "RULE_STRING", "RULE_XIDENDIFIER", "RULE_AT_IDENTIFIER", "RULE_INT", "RULE_ID", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'workflow'", "'symbex-workflow'", "'@sew'", "'@favm'", "'sew'", "'::'", "'.'", "':='", "'+:='", "'||'", "'or'", "'&&'", "'and'", "'=='", "'!='", "'==='", "'=!='", "'=/='", "'<'", "'<='", "'>'", "'>='", "'!'", "'not'", "'$env'", "'env'", "'true'", "'false'", "'form'", "'endform'", "'prototype'", "'endprototype'", "'section'", "'endsection'", "'|;|'", "'|i|'", "'{'", "'}'", "'>:'", "','", "'['", "']'", "':'", "'='", "';'", "'+'", "'*'", "'**'", "'/'", "'%'", "'('", "')'", "'&'", "'null'", "'-'", "'as'", "'is'", "'${'", "'?'", "'$time'", "'$delta'", "'$this'", "'$self'", "'$parent'", "'$super'", "'$system'"
+    };
+    public static final int T__50=50;
+    public static final int RULE_CHARACTER=4;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__59=59;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__14=14;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__52=52;
+    public static final int T__53=53;
+    public static final int T__54=54;
+    public static final int T__60=60;
+    public static final int T__61=61;
+    public static final int RULE_XIDENDIFIER=6;
+    public static final int RULE_ID=9;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int RULE_INT=8;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__66=66;
+    public static final int RULE_ML_COMMENT=10;
+    public static final int T__23=23;
+    public static final int T__67=67;
+    public static final int T__24=24;
+    public static final int T__68=68;
+    public static final int T__25=25;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__63=63;
+    public static final int T__20=20;
+    public static final int T__64=64;
+    public static final int T__21=21;
+    public static final int T__65=65;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=5;
+    public static final int RULE_SL_COMMENT=11;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__77=77;
+    public static final int T__34=34;
+    public static final int T__78=78;
+    public static final int T__35=35;
+    public static final int T__79=79;
+    public static final int T__36=36;
+    public static final int T__73=73;
+    public static final int EOF=-1;
+    public static final int T__30=30;
+    public static final int T__74=74;
+    public static final int T__31=31;
+    public static final int T__75=75;
+    public static final int T__32=32;
+    public static final int T__76=76;
+    public static final int RULE_WS=12;
+    public static final int RULE_ANY_OTHER=13;
+    public static final int RULE_AT_IDENTIFIER=7;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__41=41;
+    public static final int T__42=42;
+    public static final int T__43=43;
+
+    // delegates
+    // delegators
+
+
+        public InternalSEWParser(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+        public InternalSEWParser(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+             
+        }
+        
+
+    public String[] getTokenNames() { return InternalSEWParser.tokenNames; }
+    public String getGrammarFileName() { return "InternalSEW.g"; }
+
+
+    	private SEWGrammarAccess grammarAccess;
+
+    	public void setGrammarAccess(SEWGrammarAccess grammarAccess) {
+    		this.grammarAccess = grammarAccess;
+    	}
+
+    	@Override
+    	protected Grammar getGrammar() {
+    		return grammarAccess.getGrammar();
+    	}
+
+    	@Override
+    	protected String getValueForTokenName(String tokenName) {
+    		return tokenName;
+    	}
+
+
+
+    // $ANTLR start "entryRuleWorkflow"
+    // InternalSEW.g:63:1: entryRuleWorkflow : ruleWorkflow EOF ;
+    public final void entryRuleWorkflow() throws RecognitionException {
+        try {
+            // InternalSEW.g:64:1: ( ruleWorkflow EOF )
+            // InternalSEW.g:65:1: ruleWorkflow EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleWorkflow();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleWorkflow"
+
+
+    // $ANTLR start "ruleWorkflow"
+    // InternalSEW.g:72:1: ruleWorkflow : ( ( rule__Workflow__Group__0 ) ) ;
+    public final void ruleWorkflow() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:76:2: ( ( ( rule__Workflow__Group__0 ) ) )
+            // InternalSEW.g:77:2: ( ( rule__Workflow__Group__0 ) )
+            {
+            // InternalSEW.g:77:2: ( ( rule__Workflow__Group__0 ) )
+            // InternalSEW.g:78:3: ( rule__Workflow__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getGroup()); 
+            }
+            // InternalSEW.g:79:3: ( rule__Workflow__Group__0 )
+            // InternalSEW.g:79:4: rule__Workflow__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleWorkflow"
+
+
+    // $ANTLR start "entryRuleProlog"
+    // InternalSEW.g:88:1: entryRuleProlog : ruleProlog EOF ;
+    public final void entryRuleProlog() throws RecognitionException {
+        try {
+            // InternalSEW.g:89:1: ( ruleProlog EOF )
+            // InternalSEW.g:90:1: ruleProlog EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleProlog();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleProlog"
+
+
+    // $ANTLR start "ruleProlog"
+    // InternalSEW.g:97:1: ruleProlog : ( ( rule__Prolog__Group__0 ) ) ;
+    public final void ruleProlog() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:101:2: ( ( ( rule__Prolog__Group__0 ) ) )
+            // InternalSEW.g:102:2: ( ( rule__Prolog__Group__0 ) )
+            {
+            // InternalSEW.g:102:2: ( ( rule__Prolog__Group__0 ) )
+            // InternalSEW.g:103:3: ( rule__Prolog__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getGroup()); 
+            }
+            // InternalSEW.g:104:3: ( rule__Prolog__Group__0 )
+            // InternalSEW.g:104:4: rule__Prolog__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProlog"
+
+
+    // $ANTLR start "entryRuleReservedWord"
+    // InternalSEW.g:113:1: entryRuleReservedWord : ruleReservedWord EOF ;
+    public final void entryRuleReservedWord() throws RecognitionException {
+        try {
+            // InternalSEW.g:114:1: ( ruleReservedWord EOF )
+            // InternalSEW.g:115:1: ruleReservedWord EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getReservedWordRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleReservedWord();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getReservedWordRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleReservedWord"
+
+
+    // $ANTLR start "ruleReservedWord"
+    // InternalSEW.g:122:1: ruleReservedWord : ( ( rule__ReservedWord__Alternatives ) ) ;
+    public final void ruleReservedWord() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:126:2: ( ( ( rule__ReservedWord__Alternatives ) ) )
+            // InternalSEW.g:127:2: ( ( rule__ReservedWord__Alternatives ) )
+            {
+            // InternalSEW.g:127:2: ( ( rule__ReservedWord__Alternatives ) )
+            // InternalSEW.g:128:3: ( rule__ReservedWord__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getReservedWordAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:129:3: ( rule__ReservedWord__Alternatives )
+            // InternalSEW.g:129:4: rule__ReservedWord__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ReservedWord__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getReservedWordAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleReservedWord"
+
+
+    // $ANTLR start "entryRuleXID"
+    // InternalSEW.g:138:1: entryRuleXID : ruleXID EOF ;
+    public final void entryRuleXID() throws RecognitionException {
+        try {
+            // InternalSEW.g:139:1: ( ruleXID EOF )
+            // InternalSEW.g:140:1: ruleXID EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIDRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleXID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIDRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXID"
+
+
+    // $ANTLR start "ruleXID"
+    // InternalSEW.g:147:1: ruleXID : ( ( rule__XID__Alternatives ) ) ;
+    public final void ruleXID() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:151:2: ( ( ( rule__XID__Alternatives ) ) )
+            // InternalSEW.g:152:2: ( ( rule__XID__Alternatives ) )
+            {
+            // InternalSEW.g:152:2: ( ( rule__XID__Alternatives ) )
+            // InternalSEW.g:153:3: ( rule__XID__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXIDAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:154:3: ( rule__XID__Alternatives )
+            // InternalSEW.g:154:4: rule__XID__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XID__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXIDAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXID"
+
+
+    // $ANTLR start "entryRuleUFI"
+    // InternalSEW.g:163:1: entryRuleUFI : ruleUFI EOF ;
+    public final void entryRuleUFI() throws RecognitionException {
+        try {
+            // InternalSEW.g:164:1: ( ruleUFI EOF )
+            // InternalSEW.g:165:1: ruleUFI EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUFIRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUFIRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleUFI"
+
+
+    // $ANTLR start "ruleUFI"
+    // InternalSEW.g:172:1: ruleUFI : ( ( rule__UFI__Group__0 ) ) ;
+    public final void ruleUFI() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:176:2: ( ( ( rule__UFI__Group__0 ) ) )
+            // InternalSEW.g:177:2: ( ( rule__UFI__Group__0 ) )
+            {
+            // InternalSEW.g:177:2: ( ( rule__UFI__Group__0 ) )
+            // InternalSEW.g:178:3: ( rule__UFI__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUFIAccess().getGroup()); 
+            }
+            // InternalSEW.g:179:3: ( rule__UFI__Group__0 )
+            // InternalSEW.g:179:4: rule__UFI__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UFI__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUFIAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleUFI"
+
+
+    // $ANTLR start "entryRuleObject"
+    // InternalSEW.g:188:1: entryRuleObject : ruleObject EOF ;
+    public final void entryRuleObject() throws RecognitionException {
+        try {
+            // InternalSEW.g:189:1: ( ruleObject EOF )
+            // InternalSEW.g:190:1: ruleObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleObject"
+
+
+    // $ANTLR start "ruleObject"
+    // InternalSEW.g:197:1: ruleObject : ( ( rule__Object__Alternatives ) ) ;
+    public final void ruleObject() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:201:2: ( ( ( rule__Object__Alternatives ) ) )
+            // InternalSEW.g:202:2: ( ( rule__Object__Alternatives ) )
+            {
+            // InternalSEW.g:202:2: ( ( rule__Object__Alternatives ) )
+            // InternalSEW.g:203:3: ( rule__Object__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:204:3: ( rule__Object__Alternatives )
+            // InternalSEW.g:204:4: rule__Object__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleObject"
+
+
+    // $ANTLR start "entryRuleProperty"
+    // InternalSEW.g:213:1: entryRuleProperty : ruleProperty EOF ;
+    public final void entryRuleProperty() throws RecognitionException {
+        try {
+            // InternalSEW.g:214:1: ( ruleProperty EOF )
+            // InternalSEW.g:215:1: ruleProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleProperty"
+
+
+    // $ANTLR start "ruleProperty"
+    // InternalSEW.g:222:1: ruleProperty : ( ( rule__Property__Alternatives ) ) ;
+    public final void ruleProperty() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:226:2: ( ( ( rule__Property__Alternatives ) ) )
+            // InternalSEW.g:227:2: ( ( rule__Property__Alternatives ) )
+            {
+            // InternalSEW.g:227:2: ( ( rule__Property__Alternatives ) )
+            // InternalSEW.g:228:3: ( rule__Property__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:229:3: ( rule__Property__Alternatives )
+            // InternalSEW.g:229:4: rule__Property__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Property__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProperty"
+
+
+    // $ANTLR start "entryRuleSection"
+    // InternalSEW.g:238:1: entryRuleSection : ruleSection EOF ;
+    public final void entryRuleSection() throws RecognitionException {
+        try {
+            // InternalSEW.g:239:1: ( ruleSection EOF )
+            // InternalSEW.g:240:1: ruleSection EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSection"
+
+
+    // $ANTLR start "ruleSection"
+    // InternalSEW.g:247:1: ruleSection : ( ( rule__Section__Group__0 ) ) ;
+    public final void ruleSection() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:251:2: ( ( ( rule__Section__Group__0 ) ) )
+            // InternalSEW.g:252:2: ( ( rule__Section__Group__0 ) )
+            {
+            // InternalSEW.g:252:2: ( ( rule__Section__Group__0 ) )
+            // InternalSEW.g:253:3: ( rule__Section__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getGroup()); 
+            }
+            // InternalSEW.g:254:3: ( rule__Section__Group__0 )
+            // InternalSEW.g:254:4: rule__Section__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSection"
+
+
+    // $ANTLR start "entryRuleAttribute"
+    // InternalSEW.g:263:1: entryRuleAttribute : ruleAttribute EOF ;
+    public final void entryRuleAttribute() throws RecognitionException {
+        try {
+            // InternalSEW.g:264:1: ( ruleAttribute EOF )
+            // InternalSEW.g:265:1: ruleAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAttributeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAttributeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleAttribute"
+
+
+    // $ANTLR start "ruleAttribute"
+    // InternalSEW.g:272:1: ruleAttribute : ( ( rule__Attribute__Group__0 ) ) ;
+    public final void ruleAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:276:2: ( ( ( rule__Attribute__Group__0 ) ) )
+            // InternalSEW.g:277:2: ( ( rule__Attribute__Group__0 ) )
+            {
+            // InternalSEW.g:277:2: ( ( rule__Attribute__Group__0 ) )
+            // InternalSEW.g:278:3: ( rule__Attribute__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAttributeAccess().getGroup()); 
+            }
+            // InternalSEW.g:279:3: ( rule__Attribute__Group__0 )
+            // InternalSEW.g:279:4: rule__Attribute__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Attribute__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAttributeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleAttribute"
+
+
+    // $ANTLR start "entryRuleValueSpecification"
+    // InternalSEW.g:288:1: entryRuleValueSpecification : ruleValueSpecification EOF ;
+    public final void entryRuleValueSpecification() throws RecognitionException {
+        try {
+            // InternalSEW.g:289:1: ( ruleValueSpecification EOF )
+            // InternalSEW.g:290:1: ruleValueSpecification EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSpecificationRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleValueSpecification();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSpecificationRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleValueSpecification"
+
+
+    // $ANTLR start "ruleValueSpecification"
+    // InternalSEW.g:297:1: ruleValueSpecification : ( ruleExpression ) ;
+    public final void ruleValueSpecification() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:301:2: ( ( ruleExpression ) )
+            // InternalSEW.g:302:2: ( ruleExpression )
+            {
+            // InternalSEW.g:302:2: ( ruleExpression )
+            // InternalSEW.g:303:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSpecificationAccess().getExpressionParserRuleCall()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSpecificationAccess().getExpressionParserRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleValueSpecification"
+
+
+    // $ANTLR start "entryRuleExpression"
+    // InternalSEW.g:313:1: entryRuleExpression : ruleExpression EOF ;
+    public final void entryRuleExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:314:1: ( ruleExpression EOF )
+            // InternalSEW.g:315:1: ruleExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleExpression"
+
+
+    // $ANTLR start "ruleExpression"
+    // InternalSEW.g:322:1: ruleExpression : ( ( rule__Expression__Alternatives ) ) ;
+    public final void ruleExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:326:2: ( ( ( rule__Expression__Alternatives ) ) )
+            // InternalSEW.g:327:2: ( ( rule__Expression__Alternatives ) )
+            {
+            // InternalSEW.g:327:2: ( ( rule__Expression__Alternatives ) )
+            // InternalSEW.g:328:3: ( rule__Expression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:329:3: ( rule__Expression__Alternatives )
+            // InternalSEW.g:329:4: rule__Expression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Expression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleExpression"
+
+
+    // $ANTLR start "entryRuleconditionalExpression"
+    // InternalSEW.g:338:1: entryRuleconditionalExpression : ruleconditionalExpression EOF ;
+    public final void entryRuleconditionalExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:339:1: ( ruleconditionalExpression EOF )
+            // InternalSEW.g:340:1: ruleconditionalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleconditionalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleconditionalExpression"
+
+
+    // $ANTLR start "ruleconditionalExpression"
+    // InternalSEW.g:347:1: ruleconditionalExpression : ( ( rule__ConditionalExpression__Group__0 ) ) ;
+    public final void ruleconditionalExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:351:2: ( ( ( rule__ConditionalExpression__Group__0 ) ) )
+            // InternalSEW.g:352:2: ( ( rule__ConditionalExpression__Group__0 ) )
+            {
+            // InternalSEW.g:352:2: ( ( rule__ConditionalExpression__Group__0 ) )
+            // InternalSEW.g:353:3: ( rule__ConditionalExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getGroup()); 
+            }
+            // InternalSEW.g:354:3: ( rule__ConditionalExpression__Group__0 )
+            // InternalSEW.g:354:4: rule__ConditionalExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleconditionalExpression"
+
+
+    // $ANTLR start "entryRuleconditionalOrExpression"
+    // InternalSEW.g:363:1: entryRuleconditionalOrExpression : ruleconditionalOrExpression EOF ;
+    public final void entryRuleconditionalOrExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:364:1: ( ruleconditionalOrExpression EOF )
+            // InternalSEW.g:365:1: ruleconditionalOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleconditionalOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleconditionalOrExpression"
+
+
+    // $ANTLR start "ruleconditionalOrExpression"
+    // InternalSEW.g:372:1: ruleconditionalOrExpression : ( ( rule__ConditionalOrExpression__Group__0 ) ) ;
+    public final void ruleconditionalOrExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:376:2: ( ( ( rule__ConditionalOrExpression__Group__0 ) ) )
+            // InternalSEW.g:377:2: ( ( rule__ConditionalOrExpression__Group__0 ) )
+            {
+            // InternalSEW.g:377:2: ( ( rule__ConditionalOrExpression__Group__0 ) )
+            // InternalSEW.g:378:3: ( rule__ConditionalOrExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getGroup()); 
+            }
+            // InternalSEW.g:379:3: ( rule__ConditionalOrExpression__Group__0 )
+            // InternalSEW.g:379:4: rule__ConditionalOrExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleconditionalOrExpression"
+
+
+    // $ANTLR start "entryRuleconditionalAndExpression"
+    // InternalSEW.g:388:1: entryRuleconditionalAndExpression : ruleconditionalAndExpression EOF ;
+    public final void entryRuleconditionalAndExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:389:1: ( ruleconditionalAndExpression EOF )
+            // InternalSEW.g:390:1: ruleconditionalAndExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleconditionalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleconditionalAndExpression"
+
+
+    // $ANTLR start "ruleconditionalAndExpression"
+    // InternalSEW.g:397:1: ruleconditionalAndExpression : ( ( rule__ConditionalAndExpression__Group__0 ) ) ;
+    public final void ruleconditionalAndExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:401:2: ( ( ( rule__ConditionalAndExpression__Group__0 ) ) )
+            // InternalSEW.g:402:2: ( ( rule__ConditionalAndExpression__Group__0 ) )
+            {
+            // InternalSEW.g:402:2: ( ( rule__ConditionalAndExpression__Group__0 ) )
+            // InternalSEW.g:403:3: ( rule__ConditionalAndExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getGroup()); 
+            }
+            // InternalSEW.g:404:3: ( rule__ConditionalAndExpression__Group__0 )
+            // InternalSEW.g:404:4: rule__ConditionalAndExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleconditionalAndExpression"
+
+
+    // $ANTLR start "entryRuleequalityExpression"
+    // InternalSEW.g:413:1: entryRuleequalityExpression : ruleequalityExpression EOF ;
+    public final void entryRuleequalityExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:414:1: ( ruleequalityExpression EOF )
+            // InternalSEW.g:415:1: ruleequalityExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleequalityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleequalityExpression"
+
+
+    // $ANTLR start "ruleequalityExpression"
+    // InternalSEW.g:422:1: ruleequalityExpression : ( ( rule__EqualityExpression__Group__0 ) ) ;
+    public final void ruleequalityExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:426:2: ( ( ( rule__EqualityExpression__Group__0 ) ) )
+            // InternalSEW.g:427:2: ( ( rule__EqualityExpression__Group__0 ) )
+            {
+            // InternalSEW.g:427:2: ( ( rule__EqualityExpression__Group__0 ) )
+            // InternalSEW.g:428:3: ( rule__EqualityExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getGroup()); 
+            }
+            // InternalSEW.g:429:3: ( rule__EqualityExpression__Group__0 )
+            // InternalSEW.g:429:4: rule__EqualityExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleequalityExpression"
+
+
+    // $ANTLR start "entryRulerelationalExpression"
+    // InternalSEW.g:438:1: entryRulerelationalExpression : rulerelationalExpression EOF ;
+    public final void entryRulerelationalExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:439:1: ( rulerelationalExpression EOF )
+            // InternalSEW.g:440:1: rulerelationalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulerelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulerelationalExpression"
+
+
+    // $ANTLR start "rulerelationalExpression"
+    // InternalSEW.g:447:1: rulerelationalExpression : ( ( rule__RelationalExpression__Group__0 ) ) ;
+    public final void rulerelationalExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:451:2: ( ( ( rule__RelationalExpression__Group__0 ) ) )
+            // InternalSEW.g:452:2: ( ( rule__RelationalExpression__Group__0 ) )
+            {
+            // InternalSEW.g:452:2: ( ( rule__RelationalExpression__Group__0 ) )
+            // InternalSEW.g:453:3: ( rule__RelationalExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getGroup()); 
+            }
+            // InternalSEW.g:454:3: ( rule__RelationalExpression__Group__0 )
+            // InternalSEW.g:454:4: rule__RelationalExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulerelationalExpression"
+
+
+    // $ANTLR start "entryRuleadditiveExpression"
+    // InternalSEW.g:463:1: entryRuleadditiveExpression : ruleadditiveExpression EOF ;
+    public final void entryRuleadditiveExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:464:1: ( ruleadditiveExpression EOF )
+            // InternalSEW.g:465:1: ruleadditiveExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleadditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleadditiveExpression"
+
+
+    // $ANTLR start "ruleadditiveExpression"
+    // InternalSEW.g:472:1: ruleadditiveExpression : ( ( rule__AdditiveExpression__Group__0 ) ) ;
+    public final void ruleadditiveExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:476:2: ( ( ( rule__AdditiveExpression__Group__0 ) ) )
+            // InternalSEW.g:477:2: ( ( rule__AdditiveExpression__Group__0 ) )
+            {
+            // InternalSEW.g:477:2: ( ( rule__AdditiveExpression__Group__0 ) )
+            // InternalSEW.g:478:3: ( rule__AdditiveExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getGroup()); 
+            }
+            // InternalSEW.g:479:3: ( rule__AdditiveExpression__Group__0 )
+            // InternalSEW.g:479:4: rule__AdditiveExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleadditiveExpression"
+
+
+    // $ANTLR start "entryRulemultiplicativeExpression"
+    // InternalSEW.g:488:1: entryRulemultiplicativeExpression : rulemultiplicativeExpression EOF ;
+    public final void entryRulemultiplicativeExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:489:1: ( rulemultiplicativeExpression EOF )
+            // InternalSEW.g:490:1: rulemultiplicativeExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulemultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulemultiplicativeExpression"
+
+
+    // $ANTLR start "rulemultiplicativeExpression"
+    // InternalSEW.g:497:1: rulemultiplicativeExpression : ( ( rule__MultiplicativeExpression__Group__0 ) ) ;
+    public final void rulemultiplicativeExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:501:2: ( ( ( rule__MultiplicativeExpression__Group__0 ) ) )
+            // InternalSEW.g:502:2: ( ( rule__MultiplicativeExpression__Group__0 ) )
+            {
+            // InternalSEW.g:502:2: ( ( rule__MultiplicativeExpression__Group__0 ) )
+            // InternalSEW.g:503:3: ( rule__MultiplicativeExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup()); 
+            }
+            // InternalSEW.g:504:3: ( rule__MultiplicativeExpression__Group__0 )
+            // InternalSEW.g:504:4: rule__MultiplicativeExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulemultiplicativeExpression"
+
+
+    // $ANTLR start "entryRuleprimaryExpression"
+    // InternalSEW.g:513:1: entryRuleprimaryExpression : ruleprimaryExpression EOF ;
+    public final void entryRuleprimaryExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:514:1: ( ruleprimaryExpression EOF )
+            // InternalSEW.g:515:1: ruleprimaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleprimaryExpression"
+
+
+    // $ANTLR start "ruleprimaryExpression"
+    // InternalSEW.g:522:1: ruleprimaryExpression : ( ( rule__PrimaryExpression__Alternatives ) ) ;
+    public final void ruleprimaryExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:526:2: ( ( ( rule__PrimaryExpression__Alternatives ) ) )
+            // InternalSEW.g:527:2: ( ( rule__PrimaryExpression__Alternatives ) )
+            {
+            // InternalSEW.g:527:2: ( ( rule__PrimaryExpression__Alternatives ) )
+            // InternalSEW.g:528:3: ( rule__PrimaryExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:529:3: ( rule__PrimaryExpression__Alternatives )
+            // InternalSEW.g:529:4: rule__PrimaryExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleprimaryExpression"
+
+
+    // $ANTLR start "entryRuleLiteralExpression"
+    // InternalSEW.g:538:1: entryRuleLiteralExpression : ruleLiteralExpression EOF ;
+    public final void entryRuleLiteralExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:539:1: ( ruleLiteralExpression EOF )
+            // InternalSEW.g:540:1: ruleLiteralExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralExpression"
+
+
+    // $ANTLR start "ruleLiteralExpression"
+    // InternalSEW.g:547:1: ruleLiteralExpression : ( ( rule__LiteralExpression__Alternatives ) ) ;
+    public final void ruleLiteralExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:551:2: ( ( ( rule__LiteralExpression__Alternatives ) ) )
+            // InternalSEW.g:552:2: ( ( rule__LiteralExpression__Alternatives ) )
+            {
+            // InternalSEW.g:552:2: ( ( rule__LiteralExpression__Alternatives ) )
+            // InternalSEW.g:553:3: ( rule__LiteralExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralExpressionAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:554:3: ( rule__LiteralExpression__Alternatives )
+            // InternalSEW.g:554:4: rule__LiteralExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralExpression"
+
+
+    // $ANTLR start "entryRuleLiteralArrayValue"
+    // InternalSEW.g:563:1: entryRuleLiteralArrayValue : ruleLiteralArrayValue EOF ;
+    public final void entryRuleLiteralArrayValue() throws RecognitionException {
+        try {
+            // InternalSEW.g:564:1: ( ruleLiteralArrayValue EOF )
+            // InternalSEW.g:565:1: ruleLiteralArrayValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralArrayValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralArrayValue"
+
+
+    // $ANTLR start "ruleLiteralArrayValue"
+    // InternalSEW.g:572:1: ruleLiteralArrayValue : ( ( rule__LiteralArrayValue__Group__0 ) ) ;
+    public final void ruleLiteralArrayValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:576:2: ( ( ( rule__LiteralArrayValue__Group__0 ) ) )
+            // InternalSEW.g:577:2: ( ( rule__LiteralArrayValue__Group__0 ) )
+            {
+            // InternalSEW.g:577:2: ( ( rule__LiteralArrayValue__Group__0 ) )
+            // InternalSEW.g:578:3: ( rule__LiteralArrayValue__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getGroup()); 
+            }
+            // InternalSEW.g:579:3: ( rule__LiteralArrayValue__Group__0 )
+            // InternalSEW.g:579:4: rule__LiteralArrayValue__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralArrayValue"
+
+
+    // $ANTLR start "entryRuleLiteralObjectReference"
+    // InternalSEW.g:588:1: entryRuleLiteralObjectReference : ruleLiteralObjectReference EOF ;
+    public final void entryRuleLiteralObjectReference() throws RecognitionException {
+        try {
+            // InternalSEW.g:589:1: ( ruleLiteralObjectReference EOF )
+            // InternalSEW.g:590:1: ruleLiteralObjectReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralObjectReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralObjectReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralObjectReferenceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralObjectReference"
+
+
+    // $ANTLR start "ruleLiteralObjectReference"
+    // InternalSEW.g:597:1: ruleLiteralObjectReference : ( ( rule__LiteralObjectReference__Group__0 ) ) ;
+    public final void ruleLiteralObjectReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:601:2: ( ( ( rule__LiteralObjectReference__Group__0 ) ) )
+            // InternalSEW.g:602:2: ( ( rule__LiteralObjectReference__Group__0 ) )
+            {
+            // InternalSEW.g:602:2: ( ( rule__LiteralObjectReference__Group__0 ) )
+            // InternalSEW.g:603:3: ( rule__LiteralObjectReference__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralObjectReferenceAccess().getGroup()); 
+            }
+            // InternalSEW.g:604:3: ( rule__LiteralObjectReference__Group__0 )
+            // InternalSEW.g:604:4: rule__LiteralObjectReference__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralObjectReference__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralObjectReferenceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralObjectReference"
+
+
+    // $ANTLR start "entryRuleLiteralBooleanValue"
+    // InternalSEW.g:613:1: entryRuleLiteralBooleanValue : ruleLiteralBooleanValue EOF ;
+    public final void entryRuleLiteralBooleanValue() throws RecognitionException {
+        try {
+            // InternalSEW.g:614:1: ( ruleLiteralBooleanValue EOF )
+            // InternalSEW.g:615:1: ruleLiteralBooleanValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralBooleanValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralBooleanValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralBooleanValueRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralBooleanValue"
+
+
+    // $ANTLR start "ruleLiteralBooleanValue"
+    // InternalSEW.g:622:1: ruleLiteralBooleanValue : ( ( rule__LiteralBooleanValue__ValueAssignment ) ) ;
+    public final void ruleLiteralBooleanValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:626:2: ( ( ( rule__LiteralBooleanValue__ValueAssignment ) ) )
+            // InternalSEW.g:627:2: ( ( rule__LiteralBooleanValue__ValueAssignment ) )
+            {
+            // InternalSEW.g:627:2: ( ( rule__LiteralBooleanValue__ValueAssignment ) )
+            // InternalSEW.g:628:3: ( rule__LiteralBooleanValue__ValueAssignment )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralBooleanValueAccess().getValueAssignment()); 
+            }
+            // InternalSEW.g:629:3: ( rule__LiteralBooleanValue__ValueAssignment )
+            // InternalSEW.g:629:4: rule__LiteralBooleanValue__ValueAssignment
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralBooleanValue__ValueAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralBooleanValueAccess().getValueAssignment()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralBooleanValue"
+
+
+    // $ANTLR start "entryRuleLiteralCharacterValue"
+    // InternalSEW.g:638:1: entryRuleLiteralCharacterValue : ruleLiteralCharacterValue EOF ;
+    public final void entryRuleLiteralCharacterValue() throws RecognitionException {
+        try {
+            // InternalSEW.g:639:1: ( ruleLiteralCharacterValue EOF )
+            // InternalSEW.g:640:1: ruleLiteralCharacterValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCharacterValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralCharacterValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCharacterValueRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralCharacterValue"
+
+
+    // $ANTLR start "ruleLiteralCharacterValue"
+    // InternalSEW.g:647:1: ruleLiteralCharacterValue : ( ( rule__LiteralCharacterValue__ValueAssignment ) ) ;
+    public final void ruleLiteralCharacterValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:651:2: ( ( ( rule__LiteralCharacterValue__ValueAssignment ) ) )
+            // InternalSEW.g:652:2: ( ( rule__LiteralCharacterValue__ValueAssignment ) )
+            {
+            // InternalSEW.g:652:2: ( ( rule__LiteralCharacterValue__ValueAssignment ) )
+            // InternalSEW.g:653:3: ( rule__LiteralCharacterValue__ValueAssignment )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCharacterValueAccess().getValueAssignment()); 
+            }
+            // InternalSEW.g:654:3: ( rule__LiteralCharacterValue__ValueAssignment )
+            // InternalSEW.g:654:4: rule__LiteralCharacterValue__ValueAssignment
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCharacterValue__ValueAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCharacterValueAccess().getValueAssignment()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralCharacterValue"
+
+
+    // $ANTLR start "entryRuleLiteralIntegerValue"
+    // InternalSEW.g:663:1: entryRuleLiteralIntegerValue : ruleLiteralIntegerValue EOF ;
+    public final void entryRuleLiteralIntegerValue() throws RecognitionException {
+        try {
+            // InternalSEW.g:664:1: ( ruleLiteralIntegerValue EOF )
+            // InternalSEW.g:665:1: ruleLiteralIntegerValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralIntegerValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralIntegerValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralIntegerValueRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralIntegerValue"
+
+
+    // $ANTLR start "ruleLiteralIntegerValue"
+    // InternalSEW.g:672:1: ruleLiteralIntegerValue : ( ( rule__LiteralIntegerValue__ValueAssignment ) ) ;
+    public final void ruleLiteralIntegerValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:676:2: ( ( ( rule__LiteralIntegerValue__ValueAssignment ) ) )
+            // InternalSEW.g:677:2: ( ( rule__LiteralIntegerValue__ValueAssignment ) )
+            {
+            // InternalSEW.g:677:2: ( ( rule__LiteralIntegerValue__ValueAssignment ) )
+            // InternalSEW.g:678:3: ( rule__LiteralIntegerValue__ValueAssignment )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralIntegerValueAccess().getValueAssignment()); 
+            }
+            // InternalSEW.g:679:3: ( rule__LiteralIntegerValue__ValueAssignment )
+            // InternalSEW.g:679:4: rule__LiteralIntegerValue__ValueAssignment
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralIntegerValue__ValueAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralIntegerValueAccess().getValueAssignment()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralIntegerValue"
+
+
+    // $ANTLR start "entryRuleLiteralRationalValue"
+    // InternalSEW.g:688:1: entryRuleLiteralRationalValue : ruleLiteralRationalValue EOF ;
+    public final void entryRuleLiteralRationalValue() throws RecognitionException {
+        try {
+            // InternalSEW.g:689:1: ( ruleLiteralRationalValue EOF )
+            // InternalSEW.g:690:1: ruleLiteralRationalValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralRationalValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalValueRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralRationalValue"
+
+
+    // $ANTLR start "ruleLiteralRationalValue"
+    // InternalSEW.g:697:1: ruleLiteralRationalValue : ( ( rule__LiteralRationalValue__Group__0 ) ) ;
+    public final void ruleLiteralRationalValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:701:2: ( ( ( rule__LiteralRationalValue__Group__0 ) ) )
+            // InternalSEW.g:702:2: ( ( rule__LiteralRationalValue__Group__0 ) )
+            {
+            // InternalSEW.g:702:2: ( ( rule__LiteralRationalValue__Group__0 ) )
+            // InternalSEW.g:703:3: ( rule__LiteralRationalValue__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalValueAccess().getGroup()); 
+            }
+            // InternalSEW.g:704:3: ( rule__LiteralRationalValue__Group__0 )
+            // InternalSEW.g:704:4: rule__LiteralRationalValue__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalValue__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalValueAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralRationalValue"
+
+
+    // $ANTLR start "entryRuleLiteralFloatValue"
+    // InternalSEW.g:713:1: entryRuleLiteralFloatValue : ruleLiteralFloatValue EOF ;
+    public final void entryRuleLiteralFloatValue() throws RecognitionException {
+        try {
+            // InternalSEW.g:714:1: ( ruleLiteralFloatValue EOF )
+            // InternalSEW.g:715:1: ruleLiteralFloatValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralFloatValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralFloatValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralFloatValueRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralFloatValue"
+
+
+    // $ANTLR start "ruleLiteralFloatValue"
+    // InternalSEW.g:722:1: ruleLiteralFloatValue : ( ( rule__LiteralFloatValue__ValueAssignment ) ) ;
+    public final void ruleLiteralFloatValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:726:2: ( ( ( rule__LiteralFloatValue__ValueAssignment ) ) )
+            // InternalSEW.g:727:2: ( ( rule__LiteralFloatValue__ValueAssignment ) )
+            {
+            // InternalSEW.g:727:2: ( ( rule__LiteralFloatValue__ValueAssignment ) )
+            // InternalSEW.g:728:3: ( rule__LiteralFloatValue__ValueAssignment )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralFloatValueAccess().getValueAssignment()); 
+            }
+            // InternalSEW.g:729:3: ( rule__LiteralFloatValue__ValueAssignment )
+            // InternalSEW.g:729:4: rule__LiteralFloatValue__ValueAssignment
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralFloatValue__ValueAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralFloatValueAccess().getValueAssignment()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralFloatValue"
+
+
+    // $ANTLR start "entryRuleLiteralStringValue"
+    // InternalSEW.g:738:1: entryRuleLiteralStringValue : ruleLiteralStringValue EOF ;
+    public final void entryRuleLiteralStringValue() throws RecognitionException {
+        try {
+            // InternalSEW.g:739:1: ( ruleLiteralStringValue EOF )
+            // InternalSEW.g:740:1: ruleLiteralStringValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralStringValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralStringValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralStringValueRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralStringValue"
+
+
+    // $ANTLR start "ruleLiteralStringValue"
+    // InternalSEW.g:747:1: ruleLiteralStringValue : ( ( rule__LiteralStringValue__ValueAssignment ) ) ;
+    public final void ruleLiteralStringValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:751:2: ( ( ( rule__LiteralStringValue__ValueAssignment ) ) )
+            // InternalSEW.g:752:2: ( ( rule__LiteralStringValue__ValueAssignment ) )
+            {
+            // InternalSEW.g:752:2: ( ( rule__LiteralStringValue__ValueAssignment ) )
+            // InternalSEW.g:753:3: ( rule__LiteralStringValue__ValueAssignment )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralStringValueAccess().getValueAssignment()); 
+            }
+            // InternalSEW.g:754:3: ( rule__LiteralStringValue__ValueAssignment )
+            // InternalSEW.g:754:4: rule__LiteralStringValue__ValueAssignment
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralStringValue__ValueAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralStringValueAccess().getValueAssignment()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralStringValue"
+
+
+    // $ANTLR start "entryRuleLiteralNullValue"
+    // InternalSEW.g:763:1: entryRuleLiteralNullValue : ruleLiteralNullValue EOF ;
+    public final void entryRuleLiteralNullValue() throws RecognitionException {
+        try {
+            // InternalSEW.g:764:1: ( ruleLiteralNullValue EOF )
+            // InternalSEW.g:765:1: ruleLiteralNullValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralNullValue();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullValueRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralNullValue"
+
+
+    // $ANTLR start "ruleLiteralNullValue"
+    // InternalSEW.g:772:1: ruleLiteralNullValue : ( ( rule__LiteralNullValue__Group__0 ) ) ;
+    public final void ruleLiteralNullValue() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:776:2: ( ( ( rule__LiteralNullValue__Group__0 ) ) )
+            // InternalSEW.g:777:2: ( ( rule__LiteralNullValue__Group__0 ) )
+            {
+            // InternalSEW.g:777:2: ( ( rule__LiteralNullValue__Group__0 ) )
+            // InternalSEW.g:778:3: ( rule__LiteralNullValue__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullValueAccess().getGroup()); 
+            }
+            // InternalSEW.g:779:3: ( rule__LiteralNullValue__Group__0 )
+            // InternalSEW.g:779:4: rule__LiteralNullValue__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullValue__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullValueAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralNullValue"
+
+
+    // $ANTLR start "entryRuleLiteralVariableReference"
+    // InternalSEW.g:788:1: entryRuleLiteralVariableReference : ruleLiteralVariableReference EOF ;
+    public final void entryRuleLiteralVariableReference() throws RecognitionException {
+        try {
+            // InternalSEW.g:789:1: ( ruleLiteralVariableReference EOF )
+            // InternalSEW.g:790:1: ruleLiteralVariableReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralVariableReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralVariableReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralVariableReferenceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralVariableReference"
+
+
+    // $ANTLR start "ruleLiteralVariableReference"
+    // InternalSEW.g:797:1: ruleLiteralVariableReference : ( ( rule__LiteralVariableReference__Alternatives ) ) ;
+    public final void ruleLiteralVariableReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:801:2: ( ( ( rule__LiteralVariableReference__Alternatives ) ) )
+            // InternalSEW.g:802:2: ( ( rule__LiteralVariableReference__Alternatives ) )
+            {
+            // InternalSEW.g:802:2: ( ( rule__LiteralVariableReference__Alternatives ) )
+            // InternalSEW.g:803:3: ( rule__LiteralVariableReference__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralVariableReferenceAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:804:3: ( rule__LiteralVariableReference__Alternatives )
+            // InternalSEW.g:804:4: rule__LiteralVariableReference__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralVariableReference__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralVariableReferenceAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralVariableReference"
+
+
+    // $ANTLR start "entryRuleLiteralTimeVariable"
+    // InternalSEW.g:813:1: entryRuleLiteralTimeVariable : ruleLiteralTimeVariable EOF ;
+    public final void entryRuleLiteralTimeVariable() throws RecognitionException {
+        try {
+            // InternalSEW.g:814:1: ( ruleLiteralTimeVariable EOF )
+            // InternalSEW.g:815:1: ruleLiteralTimeVariable EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeVariableRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralTimeVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeVariableRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralTimeVariable"
+
+
+    // $ANTLR start "ruleLiteralTimeVariable"
+    // InternalSEW.g:822:1: ruleLiteralTimeVariable : ( ( rule__LiteralTimeVariable__Group__0 ) ) ;
+    public final void ruleLiteralTimeVariable() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:826:2: ( ( ( rule__LiteralTimeVariable__Group__0 ) ) )
+            // InternalSEW.g:827:2: ( ( rule__LiteralTimeVariable__Group__0 ) )
+            {
+            // InternalSEW.g:827:2: ( ( rule__LiteralTimeVariable__Group__0 ) )
+            // InternalSEW.g:828:3: ( rule__LiteralTimeVariable__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeVariableAccess().getGroup()); 
+            }
+            // InternalSEW.g:829:3: ( rule__LiteralTimeVariable__Group__0 )
+            // InternalSEW.g:829:4: rule__LiteralTimeVariable__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeVariable__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeVariableAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralTimeVariable"
+
+
+    // $ANTLR start "entryRuleLiteralTimeDeltaVariable"
+    // InternalSEW.g:838:1: entryRuleLiteralTimeDeltaVariable : ruleLiteralTimeDeltaVariable EOF ;
+    public final void entryRuleLiteralTimeDeltaVariable() throws RecognitionException {
+        try {
+            // InternalSEW.g:839:1: ( ruleLiteralTimeDeltaVariable EOF )
+            // InternalSEW.g:840:1: ruleLiteralTimeDeltaVariable EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaVariableRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralTimeDeltaVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaVariableRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralTimeDeltaVariable"
+
+
+    // $ANTLR start "ruleLiteralTimeDeltaVariable"
+    // InternalSEW.g:847:1: ruleLiteralTimeDeltaVariable : ( ( rule__LiteralTimeDeltaVariable__Group__0 ) ) ;
+    public final void ruleLiteralTimeDeltaVariable() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:851:2: ( ( ( rule__LiteralTimeDeltaVariable__Group__0 ) ) )
+            // InternalSEW.g:852:2: ( ( rule__LiteralTimeDeltaVariable__Group__0 ) )
+            {
+            // InternalSEW.g:852:2: ( ( rule__LiteralTimeDeltaVariable__Group__0 ) )
+            // InternalSEW.g:853:3: ( rule__LiteralTimeDeltaVariable__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaVariableAccess().getGroup()); 
+            }
+            // InternalSEW.g:854:3: ( rule__LiteralTimeDeltaVariable__Group__0 )
+            // InternalSEW.g:854:4: rule__LiteralTimeDeltaVariable__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeDeltaVariable__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaVariableAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralTimeDeltaVariable"
+
+
+    // $ANTLR start "entryRuleLiteralInstanceReference"
+    // InternalSEW.g:863:1: entryRuleLiteralInstanceReference : ruleLiteralInstanceReference EOF ;
+    public final void entryRuleLiteralInstanceReference() throws RecognitionException {
+        try {
+            // InternalSEW.g:864:1: ( ruleLiteralInstanceReference EOF )
+            // InternalSEW.g:865:1: ruleLiteralInstanceReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralInstanceReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralInstanceReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralInstanceReferenceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralInstanceReference"
+
+
+    // $ANTLR start "ruleLiteralInstanceReference"
+    // InternalSEW.g:872:1: ruleLiteralInstanceReference : ( ( rule__LiteralInstanceReference__Alternatives ) ) ;
+    public final void ruleLiteralInstanceReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:876:2: ( ( ( rule__LiteralInstanceReference__Alternatives ) ) )
+            // InternalSEW.g:877:2: ( ( rule__LiteralInstanceReference__Alternatives ) )
+            {
+            // InternalSEW.g:877:2: ( ( rule__LiteralInstanceReference__Alternatives ) )
+            // InternalSEW.g:878:3: ( rule__LiteralInstanceReference__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralInstanceReferenceAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:879:3: ( rule__LiteralInstanceReference__Alternatives )
+            // InternalSEW.g:879:4: rule__LiteralInstanceReference__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralInstanceReference__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralInstanceReferenceAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralInstanceReference"
+
+
+    // $ANTLR start "entryRuleLiteralThisInstance"
+    // InternalSEW.g:888:1: entryRuleLiteralThisInstance : ruleLiteralThisInstance EOF ;
+    public final void entryRuleLiteralThisInstance() throws RecognitionException {
+        try {
+            // InternalSEW.g:889:1: ( ruleLiteralThisInstance EOF )
+            // InternalSEW.g:890:1: ruleLiteralThisInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralThisInstance();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisInstanceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralThisInstance"
+
+
+    // $ANTLR start "ruleLiteralThisInstance"
+    // InternalSEW.g:897:1: ruleLiteralThisInstance : ( ( rule__LiteralThisInstance__Group__0 ) ) ;
+    public final void ruleLiteralThisInstance() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:901:2: ( ( ( rule__LiteralThisInstance__Group__0 ) ) )
+            // InternalSEW.g:902:2: ( ( rule__LiteralThisInstance__Group__0 ) )
+            {
+            // InternalSEW.g:902:2: ( ( rule__LiteralThisInstance__Group__0 ) )
+            // InternalSEW.g:903:3: ( rule__LiteralThisInstance__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisInstanceAccess().getGroup()); 
+            }
+            // InternalSEW.g:904:3: ( rule__LiteralThisInstance__Group__0 )
+            // InternalSEW.g:904:4: rule__LiteralThisInstance__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralThisInstance__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisInstanceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralThisInstance"
+
+
+    // $ANTLR start "entryRuleLiteralSelfInstance"
+    // InternalSEW.g:913:1: entryRuleLiteralSelfInstance : ruleLiteralSelfInstance EOF ;
+    public final void entryRuleLiteralSelfInstance() throws RecognitionException {
+        try {
+            // InternalSEW.g:914:1: ( ruleLiteralSelfInstance EOF )
+            // InternalSEW.g:915:1: ruleLiteralSelfInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralSelfInstance();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfInstanceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralSelfInstance"
+
+
+    // $ANTLR start "ruleLiteralSelfInstance"
+    // InternalSEW.g:922:1: ruleLiteralSelfInstance : ( ( rule__LiteralSelfInstance__Group__0 ) ) ;
+    public final void ruleLiteralSelfInstance() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:926:2: ( ( ( rule__LiteralSelfInstance__Group__0 ) ) )
+            // InternalSEW.g:927:2: ( ( rule__LiteralSelfInstance__Group__0 ) )
+            {
+            // InternalSEW.g:927:2: ( ( rule__LiteralSelfInstance__Group__0 ) )
+            // InternalSEW.g:928:3: ( rule__LiteralSelfInstance__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfInstanceAccess().getGroup()); 
+            }
+            // InternalSEW.g:929:3: ( rule__LiteralSelfInstance__Group__0 )
+            // InternalSEW.g:929:4: rule__LiteralSelfInstance__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSelfInstance__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfInstanceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralSelfInstance"
+
+
+    // $ANTLR start "entryRuleLiteralParentInstance"
+    // InternalSEW.g:938:1: entryRuleLiteralParentInstance : ruleLiteralParentInstance EOF ;
+    public final void entryRuleLiteralParentInstance() throws RecognitionException {
+        try {
+            // InternalSEW.g:939:1: ( ruleLiteralParentInstance EOF )
+            // InternalSEW.g:940:1: ruleLiteralParentInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralParentInstance();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentInstanceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralParentInstance"
+
+
+    // $ANTLR start "ruleLiteralParentInstance"
+    // InternalSEW.g:947:1: ruleLiteralParentInstance : ( ( rule__LiteralParentInstance__Group__0 ) ) ;
+    public final void ruleLiteralParentInstance() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:951:2: ( ( ( rule__LiteralParentInstance__Group__0 ) ) )
+            // InternalSEW.g:952:2: ( ( rule__LiteralParentInstance__Group__0 ) )
+            {
+            // InternalSEW.g:952:2: ( ( rule__LiteralParentInstance__Group__0 ) )
+            // InternalSEW.g:953:3: ( rule__LiteralParentInstance__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentInstanceAccess().getGroup()); 
+            }
+            // InternalSEW.g:954:3: ( rule__LiteralParentInstance__Group__0 )
+            // InternalSEW.g:954:4: rule__LiteralParentInstance__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralParentInstance__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentInstanceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralParentInstance"
+
+
+    // $ANTLR start "entryRuleLiteralSuperInstance"
+    // InternalSEW.g:963:1: entryRuleLiteralSuperInstance : ruleLiteralSuperInstance EOF ;
+    public final void entryRuleLiteralSuperInstance() throws RecognitionException {
+        try {
+            // InternalSEW.g:964:1: ( ruleLiteralSuperInstance EOF )
+            // InternalSEW.g:965:1: ruleLiteralSuperInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralSuperInstance();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperInstanceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralSuperInstance"
+
+
+    // $ANTLR start "ruleLiteralSuperInstance"
+    // InternalSEW.g:972:1: ruleLiteralSuperInstance : ( ( rule__LiteralSuperInstance__Group__0 ) ) ;
+    public final void ruleLiteralSuperInstance() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:976:2: ( ( ( rule__LiteralSuperInstance__Group__0 ) ) )
+            // InternalSEW.g:977:2: ( ( rule__LiteralSuperInstance__Group__0 ) )
+            {
+            // InternalSEW.g:977:2: ( ( rule__LiteralSuperInstance__Group__0 ) )
+            // InternalSEW.g:978:3: ( rule__LiteralSuperInstance__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperInstanceAccess().getGroup()); 
+            }
+            // InternalSEW.g:979:3: ( rule__LiteralSuperInstance__Group__0 )
+            // InternalSEW.g:979:4: rule__LiteralSuperInstance__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSuperInstance__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperInstanceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralSuperInstance"
+
+
+    // $ANTLR start "entryRuleLiteralSystemInstance"
+    // InternalSEW.g:988:1: entryRuleLiteralSystemInstance : ruleLiteralSystemInstance EOF ;
+    public final void entryRuleLiteralSystemInstance() throws RecognitionException {
+        try {
+            // InternalSEW.g:989:1: ( ruleLiteralSystemInstance EOF )
+            // InternalSEW.g:990:1: ruleLiteralSystemInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralSystemInstance();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemInstanceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralSystemInstance"
+
+
+    // $ANTLR start "ruleLiteralSystemInstance"
+    // InternalSEW.g:997:1: ruleLiteralSystemInstance : ( ( rule__LiteralSystemInstance__Group__0 ) ) ;
+    public final void ruleLiteralSystemInstance() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1001:2: ( ( ( rule__LiteralSystemInstance__Group__0 ) ) )
+            // InternalSEW.g:1002:2: ( ( rule__LiteralSystemInstance__Group__0 ) )
+            {
+            // InternalSEW.g:1002:2: ( ( rule__LiteralSystemInstance__Group__0 ) )
+            // InternalSEW.g:1003:3: ( rule__LiteralSystemInstance__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemInstanceAccess().getGroup()); 
+            }
+            // InternalSEW.g:1004:3: ( rule__LiteralSystemInstance__Group__0 )
+            // InternalSEW.g:1004:4: rule__LiteralSystemInstance__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSystemInstance__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemInstanceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralSystemInstance"
+
+
+    // $ANTLR start "entryRuleLiteralEnvInstance"
+    // InternalSEW.g:1013:1: entryRuleLiteralEnvInstance : ruleLiteralEnvInstance EOF ;
+    public final void entryRuleLiteralEnvInstance() throws RecognitionException {
+        try {
+            // InternalSEW.g:1014:1: ( ruleLiteralEnvInstance EOF )
+            // InternalSEW.g:1015:1: ruleLiteralEnvInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralEnvInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralEnvInstance();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralEnvInstanceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralEnvInstance"
+
+
+    // $ANTLR start "ruleLiteralEnvInstance"
+    // InternalSEW.g:1022:1: ruleLiteralEnvInstance : ( ( rule__LiteralEnvInstance__Group__0 ) ) ;
+    public final void ruleLiteralEnvInstance() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1026:2: ( ( ( rule__LiteralEnvInstance__Group__0 ) ) )
+            // InternalSEW.g:1027:2: ( ( rule__LiteralEnvInstance__Group__0 ) )
+            {
+            // InternalSEW.g:1027:2: ( ( rule__LiteralEnvInstance__Group__0 ) )
+            // InternalSEW.g:1028:3: ( rule__LiteralEnvInstance__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralEnvInstanceAccess().getGroup()); 
+            }
+            // InternalSEW.g:1029:3: ( rule__LiteralEnvInstance__Group__0 )
+            // InternalSEW.g:1029:4: rule__LiteralEnvInstance__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralEnvInstance__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralEnvInstanceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralEnvInstance"
+
+
+    // $ANTLR start "entryRuleEBoolean"
+    // InternalSEW.g:1038:1: entryRuleEBoolean : ruleEBoolean EOF ;
+    public final void entryRuleEBoolean() throws RecognitionException {
+        try {
+            // InternalSEW.g:1039:1: ( ruleEBoolean EOF )
+            // InternalSEW.g:1040:1: ruleEBoolean EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEBooleanRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEBoolean();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEBooleanRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEBoolean"
+
+
+    // $ANTLR start "ruleEBoolean"
+    // InternalSEW.g:1047:1: ruleEBoolean : ( ( rule__EBoolean__Alternatives ) ) ;
+    public final void ruleEBoolean() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1051:2: ( ( ( rule__EBoolean__Alternatives ) ) )
+            // InternalSEW.g:1052:2: ( ( rule__EBoolean__Alternatives ) )
+            {
+            // InternalSEW.g:1052:2: ( ( rule__EBoolean__Alternatives ) )
+            // InternalSEW.g:1053:3: ( rule__EBoolean__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEBooleanAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:1054:3: ( rule__EBoolean__Alternatives )
+            // InternalSEW.g:1054:4: rule__EBoolean__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EBoolean__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEBooleanAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEBoolean"
+
+
+    // $ANTLR start "entryRuleEChar"
+    // InternalSEW.g:1063:1: entryRuleEChar : ruleEChar EOF ;
+    public final void entryRuleEChar() throws RecognitionException {
+        try {
+            // InternalSEW.g:1064:1: ( ruleEChar EOF )
+            // InternalSEW.g:1065:1: ruleEChar EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getECharRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEChar();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getECharRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEChar"
+
+
+    // $ANTLR start "ruleEChar"
+    // InternalSEW.g:1072:1: ruleEChar : ( RULE_CHARACTER ) ;
+    public final void ruleEChar() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1076:2: ( ( RULE_CHARACTER ) )
+            // InternalSEW.g:1077:2: ( RULE_CHARACTER )
+            {
+            // InternalSEW.g:1077:2: ( RULE_CHARACTER )
+            // InternalSEW.g:1078:3: RULE_CHARACTER
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getECharAccess().getCHARACTERTerminalRuleCall()); 
+            }
+            match(input,RULE_CHARACTER,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getECharAccess().getCHARACTERTerminalRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEChar"
+
+
+    // $ANTLR start "entryRuleELong"
+    // InternalSEW.g:1088:1: entryRuleELong : ruleELong EOF ;
+    public final void entryRuleELong() throws RecognitionException {
+        try {
+            // InternalSEW.g:1089:1: ( ruleELong EOF )
+            // InternalSEW.g:1090:1: ruleELong EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getELongRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleELong();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getELongRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleELong"
+
+
+    // $ANTLR start "ruleELong"
+    // InternalSEW.g:1097:1: ruleELong : ( ( rule__ELong__Group__0 ) ) ;
+    public final void ruleELong() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1101:2: ( ( ( rule__ELong__Group__0 ) ) )
+            // InternalSEW.g:1102:2: ( ( rule__ELong__Group__0 ) )
+            {
+            // InternalSEW.g:1102:2: ( ( rule__ELong__Group__0 ) )
+            // InternalSEW.g:1103:3: ( rule__ELong__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getELongAccess().getGroup()); 
+            }
+            // InternalSEW.g:1104:3: ( rule__ELong__Group__0 )
+            // InternalSEW.g:1104:4: rule__ELong__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ELong__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getELongAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleELong"
+
+
+    // $ANTLR start "entryRuleEDouble"
+    // InternalSEW.g:1113:1: entryRuleEDouble : ruleEDouble EOF ;
+    public final void entryRuleEDouble() throws RecognitionException {
+        try {
+            // InternalSEW.g:1114:1: ( ruleEDouble EOF )
+            // InternalSEW.g:1115:1: ruleEDouble EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEDouble"
+
+
+    // $ANTLR start "ruleEDouble"
+    // InternalSEW.g:1122:1: ruleEDouble : ( ( rule__EDouble__Group__0 ) ) ;
+    public final void ruleEDouble() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1126:2: ( ( ( rule__EDouble__Group__0 ) ) )
+            // InternalSEW.g:1127:2: ( ( rule__EDouble__Group__0 ) )
+            {
+            // InternalSEW.g:1127:2: ( ( rule__EDouble__Group__0 ) )
+            // InternalSEW.g:1128:3: ( rule__EDouble__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getGroup()); 
+            }
+            // InternalSEW.g:1129:3: ( rule__EDouble__Group__0 )
+            // InternalSEW.g:1129:4: rule__EDouble__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEDouble"
+
+
+    // $ANTLR start "entryRuleEBigDecimal"
+    // InternalSEW.g:1138:1: entryRuleEBigDecimal : ruleEBigDecimal EOF ;
+    public final void entryRuleEBigDecimal() throws RecognitionException {
+        try {
+            // InternalSEW.g:1139:1: ( ruleEBigDecimal EOF )
+            // InternalSEW.g:1140:1: ruleEBigDecimal EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEBigDecimalRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEBigDecimal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEBigDecimalRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEBigDecimal"
+
+
+    // $ANTLR start "ruleEBigDecimal"
+    // InternalSEW.g:1147:1: ruleEBigDecimal : ( ( rule__EBigDecimal__Group__0 ) ) ;
+    public final void ruleEBigDecimal() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1151:2: ( ( ( rule__EBigDecimal__Group__0 ) ) )
+            // InternalSEW.g:1152:2: ( ( rule__EBigDecimal__Group__0 ) )
+            {
+            // InternalSEW.g:1152:2: ( ( rule__EBigDecimal__Group__0 ) )
+            // InternalSEW.g:1153:3: ( rule__EBigDecimal__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEBigDecimalAccess().getGroup()); 
+            }
+            // InternalSEW.g:1154:3: ( rule__EBigDecimal__Group__0 )
+            // InternalSEW.g:1154:4: rule__EBigDecimal__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EBigDecimal__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEBigDecimalAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEBigDecimal"
+
+
+    // $ANTLR start "entryRuleEString"
+    // InternalSEW.g:1163:1: entryRuleEString : ruleEString EOF ;
+    public final void entryRuleEString() throws RecognitionException {
+        try {
+            // InternalSEW.g:1164:1: ( ruleEString EOF )
+            // InternalSEW.g:1165:1: ruleEString EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEStringRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEStringRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEString"
+
+
+    // $ANTLR start "ruleEString"
+    // InternalSEW.g:1172:1: ruleEString : ( RULE_STRING ) ;
+    public final void ruleEString() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1176:2: ( ( RULE_STRING ) )
+            // InternalSEW.g:1177:2: ( RULE_STRING )
+            {
+            // InternalSEW.g:1177:2: ( RULE_STRING )
+            // InternalSEW.g:1178:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall()); 
+            }
+            match(input,RULE_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEString"
+
+
+    // $ANTLR start "entryRuleDeprecatedReservedWord"
+    // InternalSEW.g:1188:1: entryRuleDeprecatedReservedWord : ruleDeprecatedReservedWord EOF ;
+    public final void entryRuleDeprecatedReservedWord() throws RecognitionException {
+        try {
+            // InternalSEW.g:1189:1: ( ruleDeprecatedReservedWord EOF )
+            // InternalSEW.g:1190:1: ruleDeprecatedReservedWord EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedReservedWordRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDeprecatedReservedWord();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedReservedWordRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDeprecatedReservedWord"
+
+
+    // $ANTLR start "ruleDeprecatedReservedWord"
+    // InternalSEW.g:1197:1: ruleDeprecatedReservedWord : ( ( rule__DeprecatedReservedWord__Alternatives ) ) ;
+    public final void ruleDeprecatedReservedWord() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1201:2: ( ( ( rule__DeprecatedReservedWord__Alternatives ) ) )
+            // InternalSEW.g:1202:2: ( ( rule__DeprecatedReservedWord__Alternatives ) )
+            {
+            // InternalSEW.g:1202:2: ( ( rule__DeprecatedReservedWord__Alternatives ) )
+            // InternalSEW.g:1203:3: ( rule__DeprecatedReservedWord__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedReservedWordAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:1204:3: ( rule__DeprecatedReservedWord__Alternatives )
+            // InternalSEW.g:1204:4: rule__DeprecatedReservedWord__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedReservedWord__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedReservedWordAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDeprecatedReservedWord"
+
+
+    // $ANTLR start "entryRuleDeprecatedObject"
+    // InternalSEW.g:1213:1: entryRuleDeprecatedObject : ruleDeprecatedObject EOF ;
+    public final void entryRuleDeprecatedObject() throws RecognitionException {
+        try {
+            // InternalSEW.g:1214:1: ( ruleDeprecatedObject EOF )
+            // InternalSEW.g:1215:1: ruleDeprecatedObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDeprecatedObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDeprecatedObject"
+
+
+    // $ANTLR start "ruleDeprecatedObject"
+    // InternalSEW.g:1222:1: ruleDeprecatedObject : ( ( rule__DeprecatedObject__Alternatives ) ) ;
+    public final void ruleDeprecatedObject() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1226:2: ( ( ( rule__DeprecatedObject__Alternatives ) ) )
+            // InternalSEW.g:1227:2: ( ( rule__DeprecatedObject__Alternatives ) )
+            {
+            // InternalSEW.g:1227:2: ( ( rule__DeprecatedObject__Alternatives ) )
+            // InternalSEW.g:1228:3: ( rule__DeprecatedObject__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:1229:3: ( rule__DeprecatedObject__Alternatives )
+            // InternalSEW.g:1229:4: rule__DeprecatedObject__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDeprecatedObject"
+
+
+    // $ANTLR start "entryRuleDeprecatedProperty"
+    // InternalSEW.g:1238:1: entryRuleDeprecatedProperty : ruleDeprecatedProperty EOF ;
+    public final void entryRuleDeprecatedProperty() throws RecognitionException {
+        try {
+            // InternalSEW.g:1239:1: ( ruleDeprecatedProperty EOF )
+            // InternalSEW.g:1240:1: ruleDeprecatedProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedPropertyRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDeprecatedProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedPropertyRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDeprecatedProperty"
+
+
+    // $ANTLR start "ruleDeprecatedProperty"
+    // InternalSEW.g:1247:1: ruleDeprecatedProperty : ( ( rule__DeprecatedProperty__Alternatives ) ) ;
+    public final void ruleDeprecatedProperty() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1251:2: ( ( ( rule__DeprecatedProperty__Alternatives ) ) )
+            // InternalSEW.g:1252:2: ( ( rule__DeprecatedProperty__Alternatives ) )
+            {
+            // InternalSEW.g:1252:2: ( ( rule__DeprecatedProperty__Alternatives ) )
+            // InternalSEW.g:1253:3: ( rule__DeprecatedProperty__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedPropertyAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:1254:3: ( rule__DeprecatedProperty__Alternatives )
+            // InternalSEW.g:1254:4: rule__DeprecatedProperty__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedProperty__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedPropertyAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDeprecatedProperty"
+
+
+    // $ANTLR start "entryRuleDeprecatedSection"
+    // InternalSEW.g:1263:1: entryRuleDeprecatedSection : ruleDeprecatedSection EOF ;
+    public final void entryRuleDeprecatedSection() throws RecognitionException {
+        try {
+            // InternalSEW.g:1264:1: ( ruleDeprecatedSection EOF )
+            // InternalSEW.g:1265:1: ruleDeprecatedSection EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDeprecatedSection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDeprecatedSection"
+
+
+    // $ANTLR start "ruleDeprecatedSection"
+    // InternalSEW.g:1272:1: ruleDeprecatedSection : ( ( rule__DeprecatedSection__Alternatives ) ) ;
+    public final void ruleDeprecatedSection() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1276:2: ( ( ( rule__DeprecatedSection__Alternatives ) ) )
+            // InternalSEW.g:1277:2: ( ( rule__DeprecatedSection__Alternatives ) )
+            {
+            // InternalSEW.g:1277:2: ( ( rule__DeprecatedSection__Alternatives ) )
+            // InternalSEW.g:1278:3: ( rule__DeprecatedSection__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:1279:3: ( rule__DeprecatedSection__Alternatives )
+            // InternalSEW.g:1279:4: rule__DeprecatedSection__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDeprecatedSection"
+
+
+    // $ANTLR start "entryRuleDeprecatedAttribute"
+    // InternalSEW.g:1288:1: entryRuleDeprecatedAttribute : ruleDeprecatedAttribute EOF ;
+    public final void entryRuleDeprecatedAttribute() throws RecognitionException {
+        try {
+            // InternalSEW.g:1289:1: ( ruleDeprecatedAttribute EOF )
+            // InternalSEW.g:1290:1: ruleDeprecatedAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDeprecatedAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDeprecatedAttribute"
+
+
+    // $ANTLR start "ruleDeprecatedAttribute"
+    // InternalSEW.g:1297:1: ruleDeprecatedAttribute : ( ( rule__DeprecatedAttribute__Group__0 ) ) ;
+    public final void ruleDeprecatedAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1301:2: ( ( ( rule__DeprecatedAttribute__Group__0 ) ) )
+            // InternalSEW.g:1302:2: ( ( rule__DeprecatedAttribute__Group__0 ) )
+            {
+            // InternalSEW.g:1302:2: ( ( rule__DeprecatedAttribute__Group__0 ) )
+            // InternalSEW.g:1303:3: ( rule__DeprecatedAttribute__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeAccess().getGroup()); 
+            }
+            // InternalSEW.g:1304:3: ( rule__DeprecatedAttribute__Group__0 )
+            // InternalSEW.g:1304:4: rule__DeprecatedAttribute__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedAttribute__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDeprecatedAttribute"
+
+
+    // $ANTLR start "entryRuleDeprecatedAttributeID"
+    // InternalSEW.g:1313:1: entryRuleDeprecatedAttributeID : ruleDeprecatedAttributeID EOF ;
+    public final void entryRuleDeprecatedAttributeID() throws RecognitionException {
+        try {
+            // InternalSEW.g:1314:1: ( ruleDeprecatedAttributeID EOF )
+            // InternalSEW.g:1315:1: ruleDeprecatedAttributeID EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeIDRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDeprecatedAttributeID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeIDRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDeprecatedAttributeID"
+
+
+    // $ANTLR start "ruleDeprecatedAttributeID"
+    // InternalSEW.g:1322:1: ruleDeprecatedAttributeID : ( ( rule__DeprecatedAttributeID__Alternatives ) ) ;
+    public final void ruleDeprecatedAttributeID() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1326:2: ( ( ( rule__DeprecatedAttributeID__Alternatives ) ) )
+            // InternalSEW.g:1327:2: ( ( rule__DeprecatedAttributeID__Alternatives ) )
+            {
+            // InternalSEW.g:1327:2: ( ( rule__DeprecatedAttributeID__Alternatives ) )
+            // InternalSEW.g:1328:3: ( rule__DeprecatedAttributeID__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeIDAccess().getAlternatives()); 
+            }
+            // InternalSEW.g:1329:3: ( rule__DeprecatedAttributeID__Alternatives )
+            // InternalSEW.g:1329:4: rule__DeprecatedAttributeID__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedAttributeID__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeIDAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDeprecatedAttributeID"
+
+
+    // $ANTLR start "entryRuleDeprecatedExpression"
+    // InternalSEW.g:1338:1: entryRuleDeprecatedExpression : ruleDeprecatedExpression EOF ;
+    public final void entryRuleDeprecatedExpression() throws RecognitionException {
+        try {
+            // InternalSEW.g:1339:1: ( ruleDeprecatedExpression EOF )
+            // InternalSEW.g:1340:1: ruleDeprecatedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDeprecatedExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDeprecatedExpression"
+
+
+    // $ANTLR start "ruleDeprecatedExpression"
+    // InternalSEW.g:1347:1: ruleDeprecatedExpression : ( ( rule__DeprecatedExpression__Group__0 ) ) ;
+    public final void ruleDeprecatedExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1351:2: ( ( ( rule__DeprecatedExpression__Group__0 ) ) )
+            // InternalSEW.g:1352:2: ( ( rule__DeprecatedExpression__Group__0 ) )
+            {
+            // InternalSEW.g:1352:2: ( ( rule__DeprecatedExpression__Group__0 ) )
+            // InternalSEW.g:1353:3: ( rule__DeprecatedExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedExpressionAccess().getGroup()); 
+            }
+            // InternalSEW.g:1354:3: ( rule__DeprecatedExpression__Group__0 )
+            // InternalSEW.g:1354:4: rule__DeprecatedExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDeprecatedExpression"
+
+
+    // $ANTLR start "rule__Workflow__Alternatives_2"
+    // InternalSEW.g:1362:1: rule__Workflow__Alternatives_2 : ( ( ( rule__Workflow__Group_2_0__0 ) ) | ( ( rule__Workflow__ElementAssignment_2_1 ) ) );
+    public final void rule__Workflow__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1366:1: ( ( ( rule__Workflow__Group_2_0__0 ) ) | ( ( rule__Workflow__ElementAssignment_2_1 ) ) )
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( ((LA1_0>=14 && LA1_0<=15)) ) {
+                alt1=1;
+            }
+            else if ( (LA1_0==42||LA1_0==44) ) {
+                alt1=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 1, 0, input);
+
+                throw nvae;
+            }
+            switch (alt1) {
+                case 1 :
+                    // InternalSEW.g:1367:2: ( ( rule__Workflow__Group_2_0__0 ) )
+                    {
+                    // InternalSEW.g:1367:2: ( ( rule__Workflow__Group_2_0__0 ) )
+                    // InternalSEW.g:1368:3: ( rule__Workflow__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getWorkflowAccess().getGroup_2_0()); 
+                    }
+                    // InternalSEW.g:1369:3: ( rule__Workflow__Group_2_0__0 )
+                    // InternalSEW.g:1369:4: rule__Workflow__Group_2_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Workflow__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getWorkflowAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1373:2: ( ( rule__Workflow__ElementAssignment_2_1 ) )
+                    {
+                    // InternalSEW.g:1373:2: ( ( rule__Workflow__ElementAssignment_2_1 ) )
+                    // InternalSEW.g:1374:3: ( rule__Workflow__ElementAssignment_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getWorkflowAccess().getElementAssignment_2_1()); 
+                    }
+                    // InternalSEW.g:1375:3: ( rule__Workflow__ElementAssignment_2_1 )
+                    // InternalSEW.g:1375:4: rule__Workflow__ElementAssignment_2_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Workflow__ElementAssignment_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getWorkflowAccess().getElementAssignment_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Alternatives_2"
+
+
+    // $ANTLR start "rule__Workflow__TypeAlternatives_2_0_0_0"
+    // InternalSEW.g:1383:1: rule__Workflow__TypeAlternatives_2_0_0_0 : ( ( 'workflow' ) | ( 'symbex-workflow' ) );
+    public final void rule__Workflow__TypeAlternatives_2_0_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1387:1: ( ( 'workflow' ) | ( 'symbex-workflow' ) )
+            int alt2=2;
+            int LA2_0 = input.LA(1);
+
+            if ( (LA2_0==14) ) {
+                alt2=1;
+            }
+            else if ( (LA2_0==15) ) {
+                alt2=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 2, 0, input);
+
+                throw nvae;
+            }
+            switch (alt2) {
+                case 1 :
+                    // InternalSEW.g:1388:2: ( 'workflow' )
+                    {
+                    // InternalSEW.g:1388:2: ( 'workflow' )
+                    // InternalSEW.g:1389:3: 'workflow'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getWorkflowAccess().getTypeWorkflowKeyword_2_0_0_0_0()); 
+                    }
+                    match(input,14,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getWorkflowAccess().getTypeWorkflowKeyword_2_0_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1394:2: ( 'symbex-workflow' )
+                    {
+                    // InternalSEW.g:1394:2: ( 'symbex-workflow' )
+                    // InternalSEW.g:1395:3: 'symbex-workflow'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getWorkflowAccess().getTypeSymbexWorkflowKeyword_2_0_0_0_1()); 
+                    }
+                    match(input,15,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getWorkflowAccess().getTypeSymbexWorkflowKeyword_2_0_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__TypeAlternatives_2_0_0_0"
+
+
+    // $ANTLR start "rule__Workflow__ElementAlternatives_2_0_4_0"
+    // InternalSEW.g:1404:1: rule__Workflow__ElementAlternatives_2_0_4_0 : ( ( ruleObject ) | ( ruleProperty ) );
+    public final void rule__Workflow__ElementAlternatives_2_0_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1408:1: ( ( ruleObject ) | ( ruleProperty ) )
+            int alt3=2;
+            alt3 = dfa3.predict(input);
+            switch (alt3) {
+                case 1 :
+                    // InternalSEW.g:1409:2: ( ruleObject )
+                    {
+                    // InternalSEW.g:1409:2: ( ruleObject )
+                    // InternalSEW.g:1410:3: ruleObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getWorkflowAccess().getElementObjectParserRuleCall_2_0_4_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getWorkflowAccess().getElementObjectParserRuleCall_2_0_4_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1415:2: ( ruleProperty )
+                    {
+                    // InternalSEW.g:1415:2: ( ruleProperty )
+                    // InternalSEW.g:1416:3: ruleProperty
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getWorkflowAccess().getElementPropertyParserRuleCall_2_0_4_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleProperty();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getWorkflowAccess().getElementPropertyParserRuleCall_2_0_4_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__ElementAlternatives_2_0_4_0"
+
+
+    // $ANTLR start "rule__Prolog__Alternatives_0"
+    // InternalSEW.g:1425:1: rule__Prolog__Alternatives_0 : ( ( '@sew' ) | ( '@favm' ) );
+    public final void rule__Prolog__Alternatives_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1429:1: ( ( '@sew' ) | ( '@favm' ) )
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0==16) ) {
+                alt4=1;
+            }
+            else if ( (LA4_0==17) ) {
+                alt4=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 4, 0, input);
+
+                throw nvae;
+            }
+            switch (alt4) {
+                case 1 :
+                    // InternalSEW.g:1430:2: ( '@sew' )
+                    {
+                    // InternalSEW.g:1430:2: ( '@sew' )
+                    // InternalSEW.g:1431:3: '@sew'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrologAccess().getSewKeyword_0_0()); 
+                    }
+                    match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrologAccess().getSewKeyword_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1436:2: ( '@favm' )
+                    {
+                    // InternalSEW.g:1436:2: ( '@favm' )
+                    // InternalSEW.g:1437:3: '@favm'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrologAccess().getFavmKeyword_0_1()); 
+                    }
+                    match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrologAccess().getFavmKeyword_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Alternatives_0"
+
+
+    // $ANTLR start "rule__Prolog__Alternatives_2"
+    // InternalSEW.g:1446:1: rule__Prolog__Alternatives_2 : ( ( 'workflow' ) | ( 'sew' ) );
+    public final void rule__Prolog__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1450:1: ( ( 'workflow' ) | ( 'sew' ) )
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==14) ) {
+                alt5=1;
+            }
+            else if ( (LA5_0==18) ) {
+                alt5=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 5, 0, input);
+
+                throw nvae;
+            }
+            switch (alt5) {
+                case 1 :
+                    // InternalSEW.g:1451:2: ( 'workflow' )
+                    {
+                    // InternalSEW.g:1451:2: ( 'workflow' )
+                    // InternalSEW.g:1452:3: 'workflow'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrologAccess().getWorkflowKeyword_2_0()); 
+                    }
+                    match(input,14,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrologAccess().getWorkflowKeyword_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1457:2: ( 'sew' )
+                    {
+                    // InternalSEW.g:1457:2: ( 'sew' )
+                    // InternalSEW.g:1458:3: 'sew'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrologAccess().getSewKeyword_2_1()); 
+                    }
+                    match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrologAccess().getSewKeyword_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Alternatives_2"
+
+
+    // $ANTLR start "rule__Prolog__Alternatives_4"
+    // InternalSEW.g:1467:1: rule__Prolog__Alternatives_4 : ( ( ( rule__Prolog__Group_4_0__0 ) ) | ( ruleEString ) );
+    public final void rule__Prolog__Alternatives_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1471:1: ( ( ( rule__Prolog__Group_4_0__0 ) ) | ( ruleEString ) )
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0==53) ) {
+                alt6=1;
+            }
+            else if ( (LA6_0==RULE_STRING) ) {
+                alt6=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 6, 0, input);
+
+                throw nvae;
+            }
+            switch (alt6) {
+                case 1 :
+                    // InternalSEW.g:1472:2: ( ( rule__Prolog__Group_4_0__0 ) )
+                    {
+                    // InternalSEW.g:1472:2: ( ( rule__Prolog__Group_4_0__0 ) )
+                    // InternalSEW.g:1473:3: ( rule__Prolog__Group_4_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrologAccess().getGroup_4_0()); 
+                    }
+                    // InternalSEW.g:1474:3: ( rule__Prolog__Group_4_0__0 )
+                    // InternalSEW.g:1474:4: rule__Prolog__Group_4_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Prolog__Group_4_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrologAccess().getGroup_4_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1478:2: ( ruleEString )
+                    {
+                    // InternalSEW.g:1478:2: ( ruleEString )
+                    // InternalSEW.g:1479:3: ruleEString
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrologAccess().getEStringParserRuleCall_4_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleEString();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrologAccess().getEStringParserRuleCall_4_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Alternatives_4"
+
+
+    // $ANTLR start "rule__ReservedWord__Alternatives"
+    // InternalSEW.g:1488:1: rule__ReservedWord__Alternatives : ( ( 'workflow' ) | ( 'sew' ) | ( ruleDeprecatedReservedWord ) );
+    public final void rule__ReservedWord__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1492:1: ( ( 'workflow' ) | ( 'sew' ) | ( ruleDeprecatedReservedWord ) )
+            int alt7=3;
+            switch ( input.LA(1) ) {
+            case 14:
+                {
+                alt7=1;
+                }
+                break;
+            case 18:
+                {
+                alt7=2;
+                }
+                break;
+            case 42:
+            case 43:
+            case 44:
+            case 45:
+            case 46:
+            case 47:
+                {
+                alt7=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt7) {
+                case 1 :
+                    // InternalSEW.g:1493:2: ( 'workflow' )
+                    {
+                    // InternalSEW.g:1493:2: ( 'workflow' )
+                    // InternalSEW.g:1494:3: 'workflow'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getReservedWordAccess().getWorkflowKeyword_0()); 
+                    }
+                    match(input,14,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getReservedWordAccess().getWorkflowKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1499:2: ( 'sew' )
+                    {
+                    // InternalSEW.g:1499:2: ( 'sew' )
+                    // InternalSEW.g:1500:3: 'sew'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getReservedWordAccess().getSewKeyword_1()); 
+                    }
+                    match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getReservedWordAccess().getSewKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:1505:2: ( ruleDeprecatedReservedWord )
+                    {
+                    // InternalSEW.g:1505:2: ( ruleDeprecatedReservedWord )
+                    // InternalSEW.g:1506:3: ruleDeprecatedReservedWord
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getReservedWordAccess().getDeprecatedReservedWordParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedReservedWord();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getReservedWordAccess().getDeprecatedReservedWordParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReservedWord__Alternatives"
+
+
+    // $ANTLR start "rule__XID__Alternatives"
+    // InternalSEW.g:1515:1: rule__XID__Alternatives : ( ( ruleReservedWord ) | ( RULE_XIDENDIFIER ) );
+    public final void rule__XID__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1519:1: ( ( ruleReservedWord ) | ( RULE_XIDENDIFIER ) )
+            int alt8=2;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0==14||LA8_0==18||(LA8_0>=42 && LA8_0<=47)) ) {
+                alt8=1;
+            }
+            else if ( (LA8_0==RULE_XIDENDIFIER) ) {
+                alt8=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 8, 0, input);
+
+                throw nvae;
+            }
+            switch (alt8) {
+                case 1 :
+                    // InternalSEW.g:1520:2: ( ruleReservedWord )
+                    {
+                    // InternalSEW.g:1520:2: ( ruleReservedWord )
+                    // InternalSEW.g:1521:3: ruleReservedWord
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXIDAccess().getReservedWordParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleReservedWord();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXIDAccess().getReservedWordParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1526:2: ( RULE_XIDENDIFIER )
+                    {
+                    // InternalSEW.g:1526:2: ( RULE_XIDENDIFIER )
+                    // InternalSEW.g:1527:3: RULE_XIDENDIFIER
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXIDAccess().getXIDENDIFIERTerminalRuleCall_1()); 
+                    }
+                    match(input,RULE_XIDENDIFIER,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXIDAccess().getXIDENDIFIERTerminalRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XID__Alternatives"
+
+
+    // $ANTLR start "rule__UFI__Alternatives_1_0"
+    // InternalSEW.g:1536:1: rule__UFI__Alternatives_1_0 : ( ( '::' ) | ( '.' ) );
+    public final void rule__UFI__Alternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1540:1: ( ( '::' ) | ( '.' ) )
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==19) ) {
+                alt9=1;
+            }
+            else if ( (LA9_0==20) ) {
+                alt9=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 9, 0, input);
+
+                throw nvae;
+            }
+            switch (alt9) {
+                case 1 :
+                    // InternalSEW.g:1541:2: ( '::' )
+                    {
+                    // InternalSEW.g:1541:2: ( '::' )
+                    // InternalSEW.g:1542:3: '::'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUFIAccess().getColonColonKeyword_1_0_0()); 
+                    }
+                    match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUFIAccess().getColonColonKeyword_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1547:2: ( '.' )
+                    {
+                    // InternalSEW.g:1547:2: ( '.' )
+                    // InternalSEW.g:1548:3: '.'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUFIAccess().getFullStopKeyword_1_0_1()); 
+                    }
+                    match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUFIAccess().getFullStopKeyword_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UFI__Alternatives_1_0"
+
+
+    // $ANTLR start "rule__Object__Alternatives"
+    // InternalSEW.g:1557:1: rule__Object__Alternatives : ( ( ( rule__Object__Group_0__0 ) ) | ( ( rule__Object__Group_1__0 ) ) );
+    public final void rule__Object__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1561:1: ( ( ( rule__Object__Group_0__0 ) ) | ( ( rule__Object__Group_1__0 ) ) )
+            int alt10=2;
+            alt10 = dfa10.predict(input);
+            switch (alt10) {
+                case 1 :
+                    // InternalSEW.g:1562:2: ( ( rule__Object__Group_0__0 ) )
+                    {
+                    // InternalSEW.g:1562:2: ( ( rule__Object__Group_0__0 ) )
+                    // InternalSEW.g:1563:3: ( rule__Object__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getObjectAccess().getGroup_0()); 
+                    }
+                    // InternalSEW.g:1564:3: ( rule__Object__Group_0__0 )
+                    // InternalSEW.g:1564:4: rule__Object__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Object__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getObjectAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1568:2: ( ( rule__Object__Group_1__0 ) )
+                    {
+                    // InternalSEW.g:1568:2: ( ( rule__Object__Group_1__0 ) )
+                    // InternalSEW.g:1569:3: ( rule__Object__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getObjectAccess().getGroup_1()); 
+                    }
+                    // InternalSEW.g:1570:3: ( rule__Object__Group_1__0 )
+                    // InternalSEW.g:1570:4: rule__Object__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Object__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getObjectAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Alternatives"
+
+
+    // $ANTLR start "rule__Object__ElementAlternatives_0_5_0"
+    // InternalSEW.g:1578:1: rule__Object__ElementAlternatives_0_5_0 : ( ( ruleObject ) | ( ruleProperty ) );
+    public final void rule__Object__ElementAlternatives_0_5_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1582:1: ( ( ruleObject ) | ( ruleProperty ) )
+            int alt11=2;
+            alt11 = dfa11.predict(input);
+            switch (alt11) {
+                case 1 :
+                    // InternalSEW.g:1583:2: ( ruleObject )
+                    {
+                    // InternalSEW.g:1583:2: ( ruleObject )
+                    // InternalSEW.g:1584:3: ruleObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_0_5_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_0_5_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1589:2: ( ruleProperty )
+                    {
+                    // InternalSEW.g:1589:2: ( ruleProperty )
+                    // InternalSEW.g:1590:3: ruleProperty
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_0_5_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleProperty();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_0_5_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__ElementAlternatives_0_5_0"
+
+
+    // $ANTLR start "rule__Object__Alternatives_1_2"
+    // InternalSEW.g:1599:1: rule__Object__Alternatives_1_2 : ( ( ':=' ) | ( '+:=' ) );
+    public final void rule__Object__Alternatives_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1603:1: ( ( ':=' ) | ( '+:=' ) )
+            int alt12=2;
+            int LA12_0 = input.LA(1);
+
+            if ( (LA12_0==21) ) {
+                alt12=1;
+            }
+            else if ( (LA12_0==22) ) {
+                alt12=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 12, 0, input);
+
+                throw nvae;
+            }
+            switch (alt12) {
+                case 1 :
+                    // InternalSEW.g:1604:2: ( ':=' )
+                    {
+                    // InternalSEW.g:1604:2: ( ':=' )
+                    // InternalSEW.g:1605:3: ':='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getObjectAccess().getColonEqualsSignKeyword_1_2_0()); 
+                    }
+                    match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getObjectAccess().getColonEqualsSignKeyword_1_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1610:2: ( '+:=' )
+                    {
+                    // InternalSEW.g:1610:2: ( '+:=' )
+                    // InternalSEW.g:1611:3: '+:='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getObjectAccess().getPlusSignColonEqualsSignKeyword_1_2_1()); 
+                    }
+                    match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getObjectAccess().getPlusSignColonEqualsSignKeyword_1_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Alternatives_1_2"
+
+
+    // $ANTLR start "rule__Object__ElementAlternatives_1_5_0"
+    // InternalSEW.g:1620:1: rule__Object__ElementAlternatives_1_5_0 : ( ( ruleObject ) | ( ruleProperty ) );
+    public final void rule__Object__ElementAlternatives_1_5_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1624:1: ( ( ruleObject ) | ( ruleProperty ) )
+            int alt13=2;
+            alt13 = dfa13.predict(input);
+            switch (alt13) {
+                case 1 :
+                    // InternalSEW.g:1625:2: ( ruleObject )
+                    {
+                    // InternalSEW.g:1625:2: ( ruleObject )
+                    // InternalSEW.g:1626:3: ruleObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_1_5_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_1_5_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1631:2: ( ruleProperty )
+                    {
+                    // InternalSEW.g:1631:2: ( ruleProperty )
+                    // InternalSEW.g:1632:3: ruleProperty
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_1_5_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleProperty();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_1_5_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__ElementAlternatives_1_5_0"
+
+
+    // $ANTLR start "rule__Property__Alternatives"
+    // InternalSEW.g:1641:1: rule__Property__Alternatives : ( ( ruleSection ) | ( ruleAttribute ) );
+    public final void rule__Property__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1645:1: ( ( ruleSection ) | ( ruleAttribute ) )
+            int alt14=2;
+            alt14 = dfa14.predict(input);
+            switch (alt14) {
+                case 1 :
+                    // InternalSEW.g:1646:2: ( ruleSection )
+                    {
+                    // InternalSEW.g:1646:2: ( ruleSection )
+                    // InternalSEW.g:1647:3: ruleSection
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyAccess().getSectionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleSection();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyAccess().getSectionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1652:2: ( ruleAttribute )
+                    {
+                    // InternalSEW.g:1652:2: ( ruleAttribute )
+                    // InternalSEW.g:1653:3: ruleAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyAccess().getAttributeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyAccess().getAttributeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__Alternatives"
+
+
+    // $ANTLR start "rule__Section__Alternatives_2"
+    // InternalSEW.g:1662:1: rule__Section__Alternatives_2 : ( ( ( rule__Section__Group_2_0__0 ) ) | ( ( rule__Section__Group_2_1__0 ) ) );
+    public final void rule__Section__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1666:1: ( ( ( rule__Section__Group_2_0__0 ) ) | ( ( rule__Section__Group_2_1__0 ) ) )
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0==54) ) {
+                alt15=1;
+            }
+            else if ( (LA15_0==56) ) {
+                alt15=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 15, 0, input);
+
+                throw nvae;
+            }
+            switch (alt15) {
+                case 1 :
+                    // InternalSEW.g:1667:2: ( ( rule__Section__Group_2_0__0 ) )
+                    {
+                    // InternalSEW.g:1667:2: ( ( rule__Section__Group_2_0__0 ) )
+                    // InternalSEW.g:1668:3: ( rule__Section__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSectionAccess().getGroup_2_0()); 
+                    }
+                    // InternalSEW.g:1669:3: ( rule__Section__Group_2_0__0 )
+                    // InternalSEW.g:1669:4: rule__Section__Group_2_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Section__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSectionAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1673:2: ( ( rule__Section__Group_2_1__0 ) )
+                    {
+                    // InternalSEW.g:1673:2: ( ( rule__Section__Group_2_1__0 ) )
+                    // InternalSEW.g:1674:3: ( rule__Section__Group_2_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSectionAccess().getGroup_2_1()); 
+                    }
+                    // InternalSEW.g:1675:3: ( rule__Section__Group_2_1__0 )
+                    // InternalSEW.g:1675:4: rule__Section__Group_2_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Section__Group_2_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSectionAccess().getGroup_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Alternatives_2"
+
+
+    // $ANTLR start "rule__Section__ElementAlternatives_2_0_1_0"
+    // InternalSEW.g:1683:1: rule__Section__ElementAlternatives_2_0_1_0 : ( ( ruleObject ) | ( ruleAttribute ) );
+    public final void rule__Section__ElementAlternatives_2_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1687:1: ( ( ruleObject ) | ( ruleAttribute ) )
+            int alt16=2;
+            alt16 = dfa16.predict(input);
+            switch (alt16) {
+                case 1 :
+                    // InternalSEW.g:1688:2: ( ruleObject )
+                    {
+                    // InternalSEW.g:1688:2: ( ruleObject )
+                    // InternalSEW.g:1689:3: ruleObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_0_1_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_0_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1694:2: ( ruleAttribute )
+                    {
+                    // InternalSEW.g:1694:2: ( ruleAttribute )
+                    // InternalSEW.g:1695:3: ruleAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_0_1_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_0_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__ElementAlternatives_2_0_1_0"
+
+
+    // $ANTLR start "rule__Section__ElementAlternatives_2_1_1_0"
+    // InternalSEW.g:1704:1: rule__Section__ElementAlternatives_2_1_1_0 : ( ( ruleObject ) | ( ruleAttribute ) );
+    public final void rule__Section__ElementAlternatives_2_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1708:1: ( ( ruleObject ) | ( ruleAttribute ) )
+            int alt17=2;
+            alt17 = dfa17.predict(input);
+            switch (alt17) {
+                case 1 :
+                    // InternalSEW.g:1709:2: ( ruleObject )
+                    {
+                    // InternalSEW.g:1709:2: ( ruleObject )
+                    // InternalSEW.g:1710:3: ruleObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_1_1_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1715:2: ( ruleAttribute )
+                    {
+                    // InternalSEW.g:1715:2: ( ruleAttribute )
+                    // InternalSEW.g:1716:3: ruleAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_1_1_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__ElementAlternatives_2_1_1_0"
+
+
+    // $ANTLR start "rule__Expression__Alternatives"
+    // InternalSEW.g:1725:1: rule__Expression__Alternatives : ( ( ruleconditionalExpression ) | ( ruleDeprecatedExpression ) );
+    public final void rule__Expression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1729:1: ( ( ruleconditionalExpression ) | ( ruleDeprecatedExpression ) )
+            int alt18=2;
+            int LA18_0 = input.LA(1);
+
+            if ( ((LA18_0>=RULE_CHARACTER && LA18_0<=RULE_XIDENDIFIER)||LA18_0==RULE_INT||LA18_0==14||LA18_0==18||LA18_0==20||(LA18_0>=36 && LA18_0<=47)||LA18_0==54||LA18_0==59||LA18_0==64||(LA18_0>=66 && LA18_0<=68)||(LA18_0>=73 && LA18_0<=79)) ) {
+                alt18=1;
+            }
+            else if ( (LA18_0==71) ) {
+                alt18=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 18, 0, input);
+
+                throw nvae;
+            }
+            switch (alt18) {
+                case 1 :
+                    // InternalSEW.g:1730:2: ( ruleconditionalExpression )
+                    {
+                    // InternalSEW.g:1730:2: ( ruleconditionalExpression )
+                    // InternalSEW.g:1731:3: ruleconditionalExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getExpressionAccess().getConditionalExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleconditionalExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getExpressionAccess().getConditionalExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1736:2: ( ruleDeprecatedExpression )
+                    {
+                    // InternalSEW.g:1736:2: ( ruleDeprecatedExpression )
+                    // InternalSEW.g:1737:3: ruleDeprecatedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getExpressionAccess().getDeprecatedExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getExpressionAccess().getDeprecatedExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Expression__Alternatives"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__OperatorAlternatives_1_1_0"
+    // InternalSEW.g:1746:1: rule__ConditionalOrExpression__OperatorAlternatives_1_1_0 : ( ( '||' ) | ( 'or' ) );
+    public final void rule__ConditionalOrExpression__OperatorAlternatives_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1750:1: ( ( '||' ) | ( 'or' ) )
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0==23) ) {
+                alt19=1;
+            }
+            else if ( (LA19_0==24) ) {
+                alt19=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 19, 0, input);
+
+                throw nvae;
+            }
+            switch (alt19) {
+                case 1 :
+                    // InternalSEW.g:1751:2: ( '||' )
+                    {
+                    // InternalSEW.g:1751:2: ( '||' )
+                    // InternalSEW.g:1752:3: '||'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getConditionalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0()); 
+                    }
+                    match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getConditionalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1757:2: ( 'or' )
+                    {
+                    // InternalSEW.g:1757:2: ( 'or' )
+                    // InternalSEW.g:1758:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getConditionalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1()); 
+                    }
+                    match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getConditionalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__OperatorAlternatives_1_1_0"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Alternatives_1_3_0"
+    // InternalSEW.g:1767:1: rule__ConditionalOrExpression__Alternatives_1_3_0 : ( ( '||' ) | ( 'or' ) );
+    public final void rule__ConditionalOrExpression__Alternatives_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1771:1: ( ( '||' ) | ( 'or' ) )
+            int alt20=2;
+            int LA20_0 = input.LA(1);
+
+            if ( (LA20_0==23) ) {
+                alt20=1;
+            }
+            else if ( (LA20_0==24) ) {
+                alt20=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 20, 0, input);
+
+                throw nvae;
+            }
+            switch (alt20) {
+                case 1 :
+                    // InternalSEW.g:1772:2: ( '||' )
+                    {
+                    // InternalSEW.g:1772:2: ( '||' )
+                    // InternalSEW.g:1773:3: '||'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getConditionalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()); 
+                    }
+                    match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getConditionalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1778:2: ( 'or' )
+                    {
+                    // InternalSEW.g:1778:2: ( 'or' )
+                    // InternalSEW.g:1779:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getConditionalOrExpressionAccess().getOrKeyword_1_3_0_1()); 
+                    }
+                    match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getConditionalOrExpressionAccess().getOrKeyword_1_3_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Alternatives_1_3_0"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__OperatorAlternatives_1_1_0"
+    // InternalSEW.g:1788:1: rule__ConditionalAndExpression__OperatorAlternatives_1_1_0 : ( ( '&&' ) | ( 'and' ) );
+    public final void rule__ConditionalAndExpression__OperatorAlternatives_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1792:1: ( ( '&&' ) | ( 'and' ) )
+            int alt21=2;
+            int LA21_0 = input.LA(1);
+
+            if ( (LA21_0==25) ) {
+                alt21=1;
+            }
+            else if ( (LA21_0==26) ) {
+                alt21=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 21, 0, input);
+
+                throw nvae;
+            }
+            switch (alt21) {
+                case 1 :
+                    // InternalSEW.g:1793:2: ( '&&' )
+                    {
+                    // InternalSEW.g:1793:2: ( '&&' )
+                    // InternalSEW.g:1794:3: '&&'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getConditionalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0()); 
+                    }
+                    match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getConditionalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1799:2: ( 'and' )
+                    {
+                    // InternalSEW.g:1799:2: ( 'and' )
+                    // InternalSEW.g:1800:3: 'and'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getConditionalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1()); 
+                    }
+                    match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getConditionalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__OperatorAlternatives_1_1_0"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Alternatives_1_3_0"
+    // InternalSEW.g:1809:1: rule__ConditionalAndExpression__Alternatives_1_3_0 : ( ( '&&' ) | ( 'and' ) );
+    public final void rule__ConditionalAndExpression__Alternatives_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1813:1: ( ( '&&' ) | ( 'and' ) )
+            int alt22=2;
+            int LA22_0 = input.LA(1);
+
+            if ( (LA22_0==25) ) {
+                alt22=1;
+            }
+            else if ( (LA22_0==26) ) {
+                alt22=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 22, 0, input);
+
+                throw nvae;
+            }
+            switch (alt22) {
+                case 1 :
+                    // InternalSEW.g:1814:2: ( '&&' )
+                    {
+                    // InternalSEW.g:1814:2: ( '&&' )
+                    // InternalSEW.g:1815:3: '&&'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getConditionalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()); 
+                    }
+                    match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getConditionalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1820:2: ( 'and' )
+                    {
+                    // InternalSEW.g:1820:2: ( 'and' )
+                    // InternalSEW.g:1821:3: 'and'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getConditionalAndExpressionAccess().getAndKeyword_1_3_0_1()); 
+                    }
+                    match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getConditionalAndExpressionAccess().getAndKeyword_1_3_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Alternatives_1_3_0"
+
+
+    // $ANTLR start "rule__EqualityExpression__OperatorAlternatives_1_1_0"
+    // InternalSEW.g:1830:1: rule__EqualityExpression__OperatorAlternatives_1_1_0 : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '=!=' ) | ( '=/=' ) );
+    public final void rule__EqualityExpression__OperatorAlternatives_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1834:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '=!=' ) | ( '=/=' ) )
+            int alt23=5;
+            switch ( input.LA(1) ) {
+            case 27:
+                {
+                alt23=1;
+                }
+                break;
+            case 28:
+                {
+                alt23=2;
+                }
+                break;
+            case 29:
+                {
+                alt23=3;
+                }
+                break;
+            case 30:
+                {
+                alt23=4;
+                }
+                break;
+            case 31:
+                {
+                alt23=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 23, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt23) {
+                case 1 :
+                    // InternalSEW.g:1835:2: ( '==' )
+                    {
+                    // InternalSEW.g:1835:2: ( '==' )
+                    // InternalSEW.g:1836:3: '=='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignKeyword_1_1_0_0()); 
+                    }
+                    match(input,27,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignKeyword_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1841:2: ( '!=' )
+                    {
+                    // InternalSEW.g:1841:2: ( '!=' )
+                    // InternalSEW.g:1842:3: '!='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityExpressionAccess().getOperatorExclamationMarkEqualsSignKeyword_1_1_0_1()); 
+                    }
+                    match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityExpressionAccess().getOperatorExclamationMarkEqualsSignKeyword_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:1847:2: ( '===' )
+                    {
+                    // InternalSEW.g:1847:2: ( '===' )
+                    // InternalSEW.g:1848:3: '==='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignEqualsSignKeyword_1_1_0_2()); 
+                    }
+                    match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignEqualsSignKeyword_1_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:1853:2: ( '=!=' )
+                    {
+                    // InternalSEW.g:1853:2: ( '=!=' )
+                    // InternalSEW.g:1854:3: '=!='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignExclamationMarkEqualsSignKeyword_1_1_0_3()); 
+                    }
+                    match(input,30,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignExclamationMarkEqualsSignKeyword_1_1_0_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalSEW.g:1859:2: ( '=/=' )
+                    {
+                    // InternalSEW.g:1859:2: ( '=/=' )
+                    // InternalSEW.g:1860:3: '=/='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignSolidusEqualsSignKeyword_1_1_0_4()); 
+                    }
+                    match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignSolidusEqualsSignKeyword_1_1_0_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__OperatorAlternatives_1_1_0"
+
+
+    // $ANTLR start "rule__RelationalExpression__OperatorAlternatives_1_1_0"
+    // InternalSEW.g:1869:1: rule__RelationalExpression__OperatorAlternatives_1_1_0 : ( ( '<' ) | ( '<=' ) | ( '>' ) | ( '>=' ) );
+    public final void rule__RelationalExpression__OperatorAlternatives_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1873:1: ( ( '<' ) | ( '<=' ) | ( '>' ) | ( '>=' ) )
+            int alt24=4;
+            switch ( input.LA(1) ) {
+            case 32:
+                {
+                alt24=1;
+                }
+                break;
+            case 33:
+                {
+                alt24=2;
+                }
+                break;
+            case 34:
+                {
+                alt24=3;
+                }
+                break;
+            case 35:
+                {
+                alt24=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 24, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt24) {
+                case 1 :
+                    // InternalSEW.g:1874:2: ( '<' )
+                    {
+                    // InternalSEW.g:1874:2: ( '<' )
+                    // InternalSEW.g:1875:3: '<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignKeyword_1_1_0_0()); 
+                    }
+                    match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignKeyword_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1880:2: ( '<=' )
+                    {
+                    // InternalSEW.g:1880:2: ( '<=' )
+                    // InternalSEW.g:1881:3: '<='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignEqualsSignKeyword_1_1_0_1()); 
+                    }
+                    match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignEqualsSignKeyword_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:1886:2: ( '>' )
+                    {
+                    // InternalSEW.g:1886:2: ( '>' )
+                    // InternalSEW.g:1887:3: '>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignKeyword_1_1_0_2()); 
+                    }
+                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignKeyword_1_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:1892:2: ( '>=' )
+                    {
+                    // InternalSEW.g:1892:2: ( '>=' )
+                    // InternalSEW.g:1893:3: '>='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignEqualsSignKeyword_1_1_0_3()); 
+                    }
+                    match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignEqualsSignKeyword_1_1_0_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__OperatorAlternatives_1_1_0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Alternatives_1"
+    // InternalSEW.g:1902:1: rule__MultiplicativeExpression__Alternatives_1 : ( ( ( rule__MultiplicativeExpression__Group_1_0__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_1__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_2__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_3__0 ) ) );
+    public final void rule__MultiplicativeExpression__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1906:1: ( ( ( rule__MultiplicativeExpression__Group_1_0__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_1__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_2__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_3__0 ) ) )
+            int alt25=4;
+            switch ( input.LA(1) ) {
+            case 60:
+                {
+                alt25=1;
+                }
+                break;
+            case 61:
+                {
+                alt25=2;
+                }
+                break;
+            case 62:
+                {
+                alt25=3;
+                }
+                break;
+            case 63:
+                {
+                alt25=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 25, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt25) {
+                case 1 :
+                    // InternalSEW.g:1907:2: ( ( rule__MultiplicativeExpression__Group_1_0__0 ) )
+                    {
+                    // InternalSEW.g:1907:2: ( ( rule__MultiplicativeExpression__Group_1_0__0 ) )
+                    // InternalSEW.g:1908:3: ( rule__MultiplicativeExpression__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0()); 
+                    }
+                    // InternalSEW.g:1909:3: ( rule__MultiplicativeExpression__Group_1_0__0 )
+                    // InternalSEW.g:1909:4: rule__MultiplicativeExpression__Group_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MultiplicativeExpression__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1913:2: ( ( rule__MultiplicativeExpression__Group_1_1__0 ) )
+                    {
+                    // InternalSEW.g:1913:2: ( ( rule__MultiplicativeExpression__Group_1_1__0 ) )
+                    // InternalSEW.g:1914:3: ( rule__MultiplicativeExpression__Group_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1()); 
+                    }
+                    // InternalSEW.g:1915:3: ( rule__MultiplicativeExpression__Group_1_1__0 )
+                    // InternalSEW.g:1915:4: rule__MultiplicativeExpression__Group_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MultiplicativeExpression__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:1919:2: ( ( rule__MultiplicativeExpression__Group_1_2__0 ) )
+                    {
+                    // InternalSEW.g:1919:2: ( ( rule__MultiplicativeExpression__Group_1_2__0 ) )
+                    // InternalSEW.g:1920:3: ( rule__MultiplicativeExpression__Group_1_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2()); 
+                    }
+                    // InternalSEW.g:1921:3: ( rule__MultiplicativeExpression__Group_1_2__0 )
+                    // InternalSEW.g:1921:4: rule__MultiplicativeExpression__Group_1_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MultiplicativeExpression__Group_1_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:1925:2: ( ( rule__MultiplicativeExpression__Group_1_3__0 ) )
+                    {
+                    // InternalSEW.g:1925:2: ( ( rule__MultiplicativeExpression__Group_1_3__0 ) )
+                    // InternalSEW.g:1926:3: ( rule__MultiplicativeExpression__Group_1_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3()); 
+                    }
+                    // InternalSEW.g:1927:3: ( rule__MultiplicativeExpression__Group_1_3__0 )
+                    // InternalSEW.g:1927:4: rule__MultiplicativeExpression__Group_1_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MultiplicativeExpression__Group_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Alternatives_1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Alternatives"
+    // InternalSEW.g:1935:1: rule__PrimaryExpression__Alternatives : ( ( ( rule__PrimaryExpression__Group_0__0 ) ) | ( ( rule__PrimaryExpression__Group_1__0 ) ) | ( ( rule__PrimaryExpression__Group_2__0 ) ) | ( ( rule__PrimaryExpression__Group_3__0 ) ) | ( ruleLiteralExpression ) );
+    public final void rule__PrimaryExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1939:1: ( ( ( rule__PrimaryExpression__Group_0__0 ) ) | ( ( rule__PrimaryExpression__Group_1__0 ) ) | ( ( rule__PrimaryExpression__Group_2__0 ) ) | ( ( rule__PrimaryExpression__Group_3__0 ) ) | ( ruleLiteralExpression ) )
+            int alt26=5;
+            switch ( input.LA(1) ) {
+            case 59:
+                {
+                alt26=1;
+                }
+                break;
+            case 68:
+                {
+                int LA26_2 = input.LA(2);
+
+                if ( (synpred35_InternalSEW()) ) {
+                    alt26=2;
+                }
+                else if ( (true) ) {
+                    alt26=5;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 26, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 36:
+            case 37:
+                {
+                alt26=3;
+                }
+                break;
+            case 64:
+                {
+                alt26=4;
+                }
+                break;
+            case RULE_CHARACTER:
+            case RULE_STRING:
+            case RULE_XIDENDIFIER:
+            case RULE_INT:
+            case 14:
+            case 18:
+            case 20:
+            case 38:
+            case 39:
+            case 40:
+            case 41:
+            case 42:
+            case 43:
+            case 44:
+            case 45:
+            case 46:
+            case 47:
+            case 54:
+            case 66:
+            case 67:
+            case 73:
+            case 74:
+            case 75:
+            case 76:
+            case 77:
+            case 78:
+            case 79:
+                {
+                alt26=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 26, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt26) {
+                case 1 :
+                    // InternalSEW.g:1940:2: ( ( rule__PrimaryExpression__Group_0__0 ) )
+                    {
+                    // InternalSEW.g:1940:2: ( ( rule__PrimaryExpression__Group_0__0 ) )
+                    // InternalSEW.g:1941:3: ( rule__PrimaryExpression__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_0()); 
+                    }
+                    // InternalSEW.g:1942:3: ( rule__PrimaryExpression__Group_0__0 )
+                    // InternalSEW.g:1942:4: rule__PrimaryExpression__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1946:2: ( ( rule__PrimaryExpression__Group_1__0 ) )
+                    {
+                    // InternalSEW.g:1946:2: ( ( rule__PrimaryExpression__Group_1__0 ) )
+                    // InternalSEW.g:1947:3: ( rule__PrimaryExpression__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_1()); 
+                    }
+                    // InternalSEW.g:1948:3: ( rule__PrimaryExpression__Group_1__0 )
+                    // InternalSEW.g:1948:4: rule__PrimaryExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:1952:2: ( ( rule__PrimaryExpression__Group_2__0 ) )
+                    {
+                    // InternalSEW.g:1952:2: ( ( rule__PrimaryExpression__Group_2__0 ) )
+                    // InternalSEW.g:1953:3: ( rule__PrimaryExpression__Group_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_2()); 
+                    }
+                    // InternalSEW.g:1954:3: ( rule__PrimaryExpression__Group_2__0 )
+                    // InternalSEW.g:1954:4: rule__PrimaryExpression__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:1958:2: ( ( rule__PrimaryExpression__Group_3__0 ) )
+                    {
+                    // InternalSEW.g:1958:2: ( ( rule__PrimaryExpression__Group_3__0 ) )
+                    // InternalSEW.g:1959:3: ( rule__PrimaryExpression__Group_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_3()); 
+                    }
+                    // InternalSEW.g:1960:3: ( rule__PrimaryExpression__Group_3__0 )
+                    // InternalSEW.g:1960:4: rule__PrimaryExpression__Group_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalSEW.g:1964:2: ( ruleLiteralExpression )
+                    {
+                    // InternalSEW.g:1964:2: ( ruleLiteralExpression )
+                    // InternalSEW.g:1965:3: ruleLiteralExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getLiteralExpressionParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getLiteralExpressionParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Alternatives"
+
+
+    // $ANTLR start "rule__PrimaryExpression__OperatorAlternatives_2_1_0_0"
+    // InternalSEW.g:1974:1: rule__PrimaryExpression__OperatorAlternatives_2_1_0_0 : ( ( '!' ) | ( 'not' ) );
+    public final void rule__PrimaryExpression__OperatorAlternatives_2_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1978:1: ( ( '!' ) | ( 'not' ) )
+            int alt27=2;
+            int LA27_0 = input.LA(1);
+
+            if ( (LA27_0==36) ) {
+                alt27=1;
+            }
+            else if ( (LA27_0==37) ) {
+                alt27=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 27, 0, input);
+
+                throw nvae;
+            }
+            switch (alt27) {
+                case 1 :
+                    // InternalSEW.g:1979:2: ( '!' )
+                    {
+                    // InternalSEW.g:1979:2: ( '!' )
+                    // InternalSEW.g:1980:3: '!'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getOperatorExclamationMarkKeyword_2_1_0_0_0()); 
+                    }
+                    match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getOperatorExclamationMarkKeyword_2_1_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1985:2: ( 'not' )
+                    {
+                    // InternalSEW.g:1985:2: ( 'not' )
+                    // InternalSEW.g:1986:3: 'not'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getOperatorNotKeyword_2_1_0_0_1()); 
+                    }
+                    match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getOperatorNotKeyword_2_1_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__OperatorAlternatives_2_1_0_0"
+
+
+    // $ANTLR start "rule__LiteralExpression__Alternatives"
+    // InternalSEW.g:1995:1: rule__LiteralExpression__Alternatives : ( ( ruleLiteralBooleanValue ) | ( ruleLiteralCharacterValue ) | ( ruleLiteralIntegerValue ) | ( ruleLiteralRationalValue ) | ( ruleLiteralFloatValue ) | ( ruleLiteralStringValue ) | ( ruleLiteralNullValue ) | ( ruleLiteralArrayValue ) | ( ruleLiteralObjectReference ) | ( ruleLiteralVariableReference ) | ( ruleLiteralInstanceReference ) );
+    public final void rule__LiteralExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:1999:1: ( ( ruleLiteralBooleanValue ) | ( ruleLiteralCharacterValue ) | ( ruleLiteralIntegerValue ) | ( ruleLiteralRationalValue ) | ( ruleLiteralFloatValue ) | ( ruleLiteralStringValue ) | ( ruleLiteralNullValue ) | ( ruleLiteralArrayValue ) | ( ruleLiteralObjectReference ) | ( ruleLiteralVariableReference ) | ( ruleLiteralInstanceReference ) )
+            int alt28=11;
+            alt28 = dfa28.predict(input);
+            switch (alt28) {
+                case 1 :
+                    // InternalSEW.g:2000:2: ( ruleLiteralBooleanValue )
+                    {
+                    // InternalSEW.g:2000:2: ( ruleLiteralBooleanValue )
+                    // InternalSEW.g:2001:3: ruleLiteralBooleanValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralBooleanValueParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralBooleanValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralBooleanValueParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2006:2: ( ruleLiteralCharacterValue )
+                    {
+                    // InternalSEW.g:2006:2: ( ruleLiteralCharacterValue )
+                    // InternalSEW.g:2007:3: ruleLiteralCharacterValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralCharacterValueParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralCharacterValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralCharacterValueParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:2012:2: ( ruleLiteralIntegerValue )
+                    {
+                    // InternalSEW.g:2012:2: ( ruleLiteralIntegerValue )
+                    // InternalSEW.g:2013:3: ruleLiteralIntegerValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralIntegerValueParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralIntegerValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralIntegerValueParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:2018:2: ( ruleLiteralRationalValue )
+                    {
+                    // InternalSEW.g:2018:2: ( ruleLiteralRationalValue )
+                    // InternalSEW.g:2019:3: ruleLiteralRationalValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralRationalValueParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralRationalValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralRationalValueParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalSEW.g:2024:2: ( ruleLiteralFloatValue )
+                    {
+                    // InternalSEW.g:2024:2: ( ruleLiteralFloatValue )
+                    // InternalSEW.g:2025:3: ruleLiteralFloatValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralFloatValueParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralFloatValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralFloatValueParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalSEW.g:2030:2: ( ruleLiteralStringValue )
+                    {
+                    // InternalSEW.g:2030:2: ( ruleLiteralStringValue )
+                    // InternalSEW.g:2031:3: ruleLiteralStringValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralStringValueParserRuleCall_5()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralStringValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralStringValueParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalSEW.g:2036:2: ( ruleLiteralNullValue )
+                    {
+                    // InternalSEW.g:2036:2: ( ruleLiteralNullValue )
+                    // InternalSEW.g:2037:3: ruleLiteralNullValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralNullValueParserRuleCall_6()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralNullValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralNullValueParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalSEW.g:2042:2: ( ruleLiteralArrayValue )
+                    {
+                    // InternalSEW.g:2042:2: ( ruleLiteralArrayValue )
+                    // InternalSEW.g:2043:3: ruleLiteralArrayValue
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralArrayValueParserRuleCall_7()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralArrayValue();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralArrayValueParserRuleCall_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalSEW.g:2048:2: ( ruleLiteralObjectReference )
+                    {
+                    // InternalSEW.g:2048:2: ( ruleLiteralObjectReference )
+                    // InternalSEW.g:2049:3: ruleLiteralObjectReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralObjectReferenceParserRuleCall_8()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralObjectReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralObjectReferenceParserRuleCall_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalSEW.g:2054:2: ( ruleLiteralVariableReference )
+                    {
+                    // InternalSEW.g:2054:2: ( ruleLiteralVariableReference )
+                    // InternalSEW.g:2055:3: ruleLiteralVariableReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralVariableReferenceParserRuleCall_9()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralVariableReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralVariableReferenceParserRuleCall_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalSEW.g:2060:2: ( ruleLiteralInstanceReference )
+                    {
+                    // InternalSEW.g:2060:2: ( ruleLiteralInstanceReference )
+                    // InternalSEW.g:2061:3: ruleLiteralInstanceReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralExpressionAccess().getLiteralInstanceReferenceParserRuleCall_10()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralInstanceReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralExpressionAccess().getLiteralInstanceReferenceParserRuleCall_10()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralExpression__Alternatives"
+
+
+    // $ANTLR start "rule__LiteralObjectReference__Alternatives_1"
+    // InternalSEW.g:2070:1: rule__LiteralObjectReference__Alternatives_1 : ( ( ( rule__LiteralObjectReference__ObjectAssignment_1_0 ) ) | ( ( rule__LiteralObjectReference__SymbolAssignment_1_1 ) ) );
+    public final void rule__LiteralObjectReference__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2074:1: ( ( ( rule__LiteralObjectReference__ObjectAssignment_1_0 ) ) | ( ( rule__LiteralObjectReference__SymbolAssignment_1_1 ) ) )
+            int alt29=2;
+            alt29 = dfa29.predict(input);
+            switch (alt29) {
+                case 1 :
+                    // InternalSEW.g:2075:2: ( ( rule__LiteralObjectReference__ObjectAssignment_1_0 ) )
+                    {
+                    // InternalSEW.g:2075:2: ( ( rule__LiteralObjectReference__ObjectAssignment_1_0 ) )
+                    // InternalSEW.g:2076:3: ( rule__LiteralObjectReference__ObjectAssignment_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralObjectReferenceAccess().getObjectAssignment_1_0()); 
+                    }
+                    // InternalSEW.g:2077:3: ( rule__LiteralObjectReference__ObjectAssignment_1_0 )
+                    // InternalSEW.g:2077:4: rule__LiteralObjectReference__ObjectAssignment_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralObjectReference__ObjectAssignment_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralObjectReferenceAccess().getObjectAssignment_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2081:2: ( ( rule__LiteralObjectReference__SymbolAssignment_1_1 ) )
+                    {
+                    // InternalSEW.g:2081:2: ( ( rule__LiteralObjectReference__SymbolAssignment_1_1 ) )
+                    // InternalSEW.g:2082:3: ( rule__LiteralObjectReference__SymbolAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralObjectReferenceAccess().getSymbolAssignment_1_1()); 
+                    }
+                    // InternalSEW.g:2083:3: ( rule__LiteralObjectReference__SymbolAssignment_1_1 )
+                    // InternalSEW.g:2083:4: rule__LiteralObjectReference__SymbolAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralObjectReference__SymbolAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralObjectReferenceAccess().getSymbolAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralObjectReference__Alternatives_1"
+
+
+    // $ANTLR start "rule__LiteralVariableReference__Alternatives"
+    // InternalSEW.g:2091:1: rule__LiteralVariableReference__Alternatives : ( ( ruleLiteralTimeVariable ) | ( ruleLiteralTimeDeltaVariable ) );
+    public final void rule__LiteralVariableReference__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2095:1: ( ( ruleLiteralTimeVariable ) | ( ruleLiteralTimeDeltaVariable ) )
+            int alt30=2;
+            int LA30_0 = input.LA(1);
+
+            if ( (LA30_0==73) ) {
+                alt30=1;
+            }
+            else if ( (LA30_0==74) ) {
+                alt30=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 30, 0, input);
+
+                throw nvae;
+            }
+            switch (alt30) {
+                case 1 :
+                    // InternalSEW.g:2096:2: ( ruleLiteralTimeVariable )
+                    {
+                    // InternalSEW.g:2096:2: ( ruleLiteralTimeVariable )
+                    // InternalSEW.g:2097:3: ruleLiteralTimeVariable
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeVariableParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralTimeVariable();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeVariableParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2102:2: ( ruleLiteralTimeDeltaVariable )
+                    {
+                    // InternalSEW.g:2102:2: ( ruleLiteralTimeDeltaVariable )
+                    // InternalSEW.g:2103:3: ruleLiteralTimeDeltaVariable
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeDeltaVariableParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralTimeDeltaVariable();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeDeltaVariableParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralVariableReference__Alternatives"
+
+
+    // $ANTLR start "rule__LiteralInstanceReference__Alternatives"
+    // InternalSEW.g:2112:1: rule__LiteralInstanceReference__Alternatives : ( ( ruleLiteralThisInstance ) | ( ruleLiteralSelfInstance ) | ( ruleLiteralParentInstance ) | ( ruleLiteralSuperInstance ) | ( ruleLiteralSystemInstance ) | ( ruleLiteralEnvInstance ) );
+    public final void rule__LiteralInstanceReference__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2116:1: ( ( ruleLiteralThisInstance ) | ( ruleLiteralSelfInstance ) | ( ruleLiteralParentInstance ) | ( ruleLiteralSuperInstance ) | ( ruleLiteralSystemInstance ) | ( ruleLiteralEnvInstance ) )
+            int alt31=6;
+            switch ( input.LA(1) ) {
+            case 75:
+                {
+                alt31=1;
+                }
+                break;
+            case 76:
+                {
+                alt31=2;
+                }
+                break;
+            case 77:
+                {
+                alt31=3;
+                }
+                break;
+            case 78:
+                {
+                alt31=4;
+                }
+                break;
+            case 79:
+                {
+                alt31=5;
+                }
+                break;
+            case 38:
+            case 39:
+                {
+                alt31=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 31, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt31) {
+                case 1 :
+                    // InternalSEW.g:2117:2: ( ruleLiteralThisInstance )
+                    {
+                    // InternalSEW.g:2117:2: ( ruleLiteralThisInstance )
+                    // InternalSEW.g:2118:3: ruleLiteralThisInstance
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralThisInstanceParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralThisInstance();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralThisInstanceParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2123:2: ( ruleLiteralSelfInstance )
+                    {
+                    // InternalSEW.g:2123:2: ( ruleLiteralSelfInstance )
+                    // InternalSEW.g:2124:3: ruleLiteralSelfInstance
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSelfInstanceParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralSelfInstance();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSelfInstanceParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:2129:2: ( ruleLiteralParentInstance )
+                    {
+                    // InternalSEW.g:2129:2: ( ruleLiteralParentInstance )
+                    // InternalSEW.g:2130:3: ruleLiteralParentInstance
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralParentInstanceParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralParentInstance();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralParentInstanceParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:2135:2: ( ruleLiteralSuperInstance )
+                    {
+                    // InternalSEW.g:2135:2: ( ruleLiteralSuperInstance )
+                    // InternalSEW.g:2136:3: ruleLiteralSuperInstance
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSuperInstanceParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralSuperInstance();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSuperInstanceParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalSEW.g:2141:2: ( ruleLiteralSystemInstance )
+                    {
+                    // InternalSEW.g:2141:2: ( ruleLiteralSystemInstance )
+                    // InternalSEW.g:2142:3: ruleLiteralSystemInstance
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSystemInstanceParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralSystemInstance();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSystemInstanceParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalSEW.g:2147:2: ( ruleLiteralEnvInstance )
+                    {
+                    // InternalSEW.g:2147:2: ( ruleLiteralEnvInstance )
+                    // InternalSEW.g:2148:3: ruleLiteralEnvInstance
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralEnvInstanceParserRuleCall_5()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralEnvInstance();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralEnvInstanceParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralInstanceReference__Alternatives"
+
+
+    // $ANTLR start "rule__LiteralEnvInstance__SymbolAlternatives_1_0"
+    // InternalSEW.g:2157:1: rule__LiteralEnvInstance__SymbolAlternatives_1_0 : ( ( '$env' ) | ( 'env' ) );
+    public final void rule__LiteralEnvInstance__SymbolAlternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2161:1: ( ( '$env' ) | ( 'env' ) )
+            int alt32=2;
+            int LA32_0 = input.LA(1);
+
+            if ( (LA32_0==38) ) {
+                alt32=1;
+            }
+            else if ( (LA32_0==39) ) {
+                alt32=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 32, 0, input);
+
+                throw nvae;
+            }
+            switch (alt32) {
+                case 1 :
+                    // InternalSEW.g:2162:2: ( '$env' )
+                    {
+                    // InternalSEW.g:2162:2: ( '$env' )
+                    // InternalSEW.g:2163:3: '$env'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_0()); 
+                    }
+                    match(input,38,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2168:2: ( 'env' )
+                    {
+                    // InternalSEW.g:2168:2: ( 'env' )
+                    // InternalSEW.g:2169:3: 'env'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_1()); 
+                    }
+                    match(input,39,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvInstance__SymbolAlternatives_1_0"
+
+
+    // $ANTLR start "rule__EBoolean__Alternatives"
+    // InternalSEW.g:2178:1: rule__EBoolean__Alternatives : ( ( 'true' ) | ( 'false' ) );
+    public final void rule__EBoolean__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2182:1: ( ( 'true' ) | ( 'false' ) )
+            int alt33=2;
+            int LA33_0 = input.LA(1);
+
+            if ( (LA33_0==40) ) {
+                alt33=1;
+            }
+            else if ( (LA33_0==41) ) {
+                alt33=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 33, 0, input);
+
+                throw nvae;
+            }
+            switch (alt33) {
+                case 1 :
+                    // InternalSEW.g:2183:2: ( 'true' )
+                    {
+                    // InternalSEW.g:2183:2: ( 'true' )
+                    // InternalSEW.g:2184:3: 'true'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEBooleanAccess().getTrueKeyword_0()); 
+                    }
+                    match(input,40,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEBooleanAccess().getTrueKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2189:2: ( 'false' )
+                    {
+                    // InternalSEW.g:2189:2: ( 'false' )
+                    // InternalSEW.g:2190:3: 'false'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEBooleanAccess().getFalseKeyword_1()); 
+                    }
+                    match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEBooleanAccess().getFalseKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EBoolean__Alternatives"
+
+
+    // $ANTLR start "rule__DeprecatedReservedWord__Alternatives"
+    // InternalSEW.g:2199:1: rule__DeprecatedReservedWord__Alternatives : ( ( 'form' ) | ( 'endform' ) | ( 'prototype' ) | ( 'endprototype' ) | ( 'section' ) | ( 'endsection' ) );
+    public final void rule__DeprecatedReservedWord__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2203:1: ( ( 'form' ) | ( 'endform' ) | ( 'prototype' ) | ( 'endprototype' ) | ( 'section' ) | ( 'endsection' ) )
+            int alt34=6;
+            switch ( input.LA(1) ) {
+            case 42:
+                {
+                alt34=1;
+                }
+                break;
+            case 43:
+                {
+                alt34=2;
+                }
+                break;
+            case 44:
+                {
+                alt34=3;
+                }
+                break;
+            case 45:
+                {
+                alt34=4;
+                }
+                break;
+            case 46:
+                {
+                alt34=5;
+                }
+                break;
+            case 47:
+                {
+                alt34=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 34, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt34) {
+                case 1 :
+                    // InternalSEW.g:2204:2: ( 'form' )
+                    {
+                    // InternalSEW.g:2204:2: ( 'form' )
+                    // InternalSEW.g:2205:3: 'form'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedReservedWordAccess().getFormKeyword_0()); 
+                    }
+                    match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedReservedWordAccess().getFormKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2210:2: ( 'endform' )
+                    {
+                    // InternalSEW.g:2210:2: ( 'endform' )
+                    // InternalSEW.g:2211:3: 'endform'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedReservedWordAccess().getEndformKeyword_1()); 
+                    }
+                    match(input,43,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedReservedWordAccess().getEndformKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:2216:2: ( 'prototype' )
+                    {
+                    // InternalSEW.g:2216:2: ( 'prototype' )
+                    // InternalSEW.g:2217:3: 'prototype'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedReservedWordAccess().getPrototypeKeyword_2()); 
+                    }
+                    match(input,44,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedReservedWordAccess().getPrototypeKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:2222:2: ( 'endprototype' )
+                    {
+                    // InternalSEW.g:2222:2: ( 'endprototype' )
+                    // InternalSEW.g:2223:3: 'endprototype'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedReservedWordAccess().getEndprototypeKeyword_3()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedReservedWordAccess().getEndprototypeKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalSEW.g:2228:2: ( 'section' )
+                    {
+                    // InternalSEW.g:2228:2: ( 'section' )
+                    // InternalSEW.g:2229:3: 'section'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedReservedWordAccess().getSectionKeyword_4()); 
+                    }
+                    match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedReservedWordAccess().getSectionKeyword_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalSEW.g:2234:2: ( 'endsection' )
+                    {
+                    // InternalSEW.g:2234:2: ( 'endsection' )
+                    // InternalSEW.g:2235:3: 'endsection'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedReservedWordAccess().getEndsectionKeyword_5()); 
+                    }
+                    match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedReservedWordAccess().getEndsectionKeyword_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedReservedWord__Alternatives"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Alternatives"
+    // InternalSEW.g:2244:1: rule__DeprecatedObject__Alternatives : ( ( ( rule__DeprecatedObject__Group_0__0 ) ) | ( ( rule__DeprecatedObject__Group_1__0 ) ) );
+    public final void rule__DeprecatedObject__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2248:1: ( ( ( rule__DeprecatedObject__Group_0__0 ) ) | ( ( rule__DeprecatedObject__Group_1__0 ) ) )
+            int alt35=2;
+            int LA35_0 = input.LA(1);
+
+            if ( (LA35_0==42) ) {
+                alt35=1;
+            }
+            else if ( (LA35_0==44) ) {
+                alt35=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 35, 0, input);
+
+                throw nvae;
+            }
+            switch (alt35) {
+                case 1 :
+                    // InternalSEW.g:2249:2: ( ( rule__DeprecatedObject__Group_0__0 ) )
+                    {
+                    // InternalSEW.g:2249:2: ( ( rule__DeprecatedObject__Group_0__0 ) )
+                    // InternalSEW.g:2250:3: ( rule__DeprecatedObject__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedObjectAccess().getGroup_0()); 
+                    }
+                    // InternalSEW.g:2251:3: ( rule__DeprecatedObject__Group_0__0 )
+                    // InternalSEW.g:2251:4: rule__DeprecatedObject__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DeprecatedObject__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedObjectAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2255:2: ( ( rule__DeprecatedObject__Group_1__0 ) )
+                    {
+                    // InternalSEW.g:2255:2: ( ( rule__DeprecatedObject__Group_1__0 ) )
+                    // InternalSEW.g:2256:3: ( rule__DeprecatedObject__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedObjectAccess().getGroup_1()); 
+                    }
+                    // InternalSEW.g:2257:3: ( rule__DeprecatedObject__Group_1__0 )
+                    // InternalSEW.g:2257:4: rule__DeprecatedObject__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DeprecatedObject__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedObjectAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Alternatives"
+
+
+    // $ANTLR start "rule__DeprecatedProperty__Alternatives"
+    // InternalSEW.g:2265:1: rule__DeprecatedProperty__Alternatives : ( ( ruleDeprecatedSection ) | ( ruleDeprecatedAttribute ) );
+    public final void rule__DeprecatedProperty__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2269:1: ( ( ruleDeprecatedSection ) | ( ruleDeprecatedAttribute ) )
+            int alt36=2;
+            alt36 = dfa36.predict(input);
+            switch (alt36) {
+                case 1 :
+                    // InternalSEW.g:2270:2: ( ruleDeprecatedSection )
+                    {
+                    // InternalSEW.g:2270:2: ( ruleDeprecatedSection )
+                    // InternalSEW.g:2271:3: ruleDeprecatedSection
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedSectionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedSection();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedSectionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2276:2: ( ruleDeprecatedAttribute )
+                    {
+                    // InternalSEW.g:2276:2: ( ruleDeprecatedAttribute )
+                    // InternalSEW.g:2277:3: ruleDeprecatedAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedAttributeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedAttributeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedProperty__Alternatives"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Alternatives"
+    // InternalSEW.g:2286:1: rule__DeprecatedSection__Alternatives : ( ( ( rule__DeprecatedSection__Group_0__0 ) ) | ( ( rule__DeprecatedSection__Group_1__0 ) ) );
+    public final void rule__DeprecatedSection__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2290:1: ( ( ( rule__DeprecatedSection__Group_0__0 ) ) | ( ( rule__DeprecatedSection__Group_1__0 ) ) )
+            int alt37=2;
+            int LA37_0 = input.LA(1);
+
+            if ( (LA37_0==46) ) {
+                int LA37_1 = input.LA(2);
+
+                if ( (LA37_1==RULE_XIDENDIFIER||LA37_1==14||LA37_1==18||(LA37_1>=42 && LA37_1<=47)) ) {
+                    alt37=1;
+                }
+                else if ( (LA37_1==RULE_STRING||LA37_1==54||LA37_1==56) ) {
+                    alt37=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 37, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA37_0==RULE_XIDENDIFIER||LA37_0==14||LA37_0==18||(LA37_0>=42 && LA37_0<=45)||LA37_0==47) ) {
+                alt37=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 37, 0, input);
+
+                throw nvae;
+            }
+            switch (alt37) {
+                case 1 :
+                    // InternalSEW.g:2291:2: ( ( rule__DeprecatedSection__Group_0__0 ) )
+                    {
+                    // InternalSEW.g:2291:2: ( ( rule__DeprecatedSection__Group_0__0 ) )
+                    // InternalSEW.g:2292:3: ( rule__DeprecatedSection__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getGroup_0()); 
+                    }
+                    // InternalSEW.g:2293:3: ( rule__DeprecatedSection__Group_0__0 )
+                    // InternalSEW.g:2293:4: rule__DeprecatedSection__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DeprecatedSection__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2297:2: ( ( rule__DeprecatedSection__Group_1__0 ) )
+                    {
+                    // InternalSEW.g:2297:2: ( ( rule__DeprecatedSection__Group_1__0 ) )
+                    // InternalSEW.g:2298:3: ( rule__DeprecatedSection__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getGroup_1()); 
+                    }
+                    // InternalSEW.g:2299:3: ( rule__DeprecatedSection__Group_1__0 )
+                    // InternalSEW.g:2299:4: rule__DeprecatedSection__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DeprecatedSection__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Alternatives"
+
+
+    // $ANTLR start "rule__DeprecatedSection__ElementAlternatives_0_3_0"
+    // InternalSEW.g:2307:1: rule__DeprecatedSection__ElementAlternatives_0_3_0 : ( ( ruleDeprecatedAttribute ) | ( ruleDeprecatedObject ) | ( ruleObject ) );
+    public final void rule__DeprecatedSection__ElementAlternatives_0_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2311:1: ( ( ruleDeprecatedAttribute ) | ( ruleDeprecatedObject ) | ( ruleObject ) )
+            int alt38=3;
+            alt38 = dfa38.predict(input);
+            switch (alt38) {
+                case 1 :
+                    // InternalSEW.g:2312:2: ( ruleDeprecatedAttribute )
+                    {
+                    // InternalSEW.g:2312:2: ( ruleDeprecatedAttribute )
+                    // InternalSEW.g:2313:3: ruleDeprecatedAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_0_3_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_0_3_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2318:2: ( ruleDeprecatedObject )
+                    {
+                    // InternalSEW.g:2318:2: ( ruleDeprecatedObject )
+                    // InternalSEW.g:2319:3: ruleDeprecatedObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_0_3_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_0_3_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:2324:2: ( ruleObject )
+                    {
+                    // InternalSEW.g:2324:2: ( ruleObject )
+                    // InternalSEW.g:2325:3: ruleObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_0_3_0_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_0_3_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__ElementAlternatives_0_3_0"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Alternatives_1_2"
+    // InternalSEW.g:2334:1: rule__DeprecatedSection__Alternatives_1_2 : ( ( ( rule__DeprecatedSection__Group_1_2_0__0 ) ) | ( ( rule__DeprecatedSection__Group_1_2_1__0 ) ) );
+    public final void rule__DeprecatedSection__Alternatives_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2338:1: ( ( ( rule__DeprecatedSection__Group_1_2_0__0 ) ) | ( ( rule__DeprecatedSection__Group_1_2_1__0 ) ) )
+            int alt39=2;
+            int LA39_0 = input.LA(1);
+
+            if ( (LA39_0==54) ) {
+                alt39=1;
+            }
+            else if ( (LA39_0==56) ) {
+                alt39=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 39, 0, input);
+
+                throw nvae;
+            }
+            switch (alt39) {
+                case 1 :
+                    // InternalSEW.g:2339:2: ( ( rule__DeprecatedSection__Group_1_2_0__0 ) )
+                    {
+                    // InternalSEW.g:2339:2: ( ( rule__DeprecatedSection__Group_1_2_0__0 ) )
+                    // InternalSEW.g:2340:3: ( rule__DeprecatedSection__Group_1_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_0()); 
+                    }
+                    // InternalSEW.g:2341:3: ( rule__DeprecatedSection__Group_1_2_0__0 )
+                    // InternalSEW.g:2341:4: rule__DeprecatedSection__Group_1_2_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DeprecatedSection__Group_1_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2345:2: ( ( rule__DeprecatedSection__Group_1_2_1__0 ) )
+                    {
+                    // InternalSEW.g:2345:2: ( ( rule__DeprecatedSection__Group_1_2_1__0 ) )
+                    // InternalSEW.g:2346:3: ( rule__DeprecatedSection__Group_1_2_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_1()); 
+                    }
+                    // InternalSEW.g:2347:3: ( rule__DeprecatedSection__Group_1_2_1__0 )
+                    // InternalSEW.g:2347:4: rule__DeprecatedSection__Group_1_2_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DeprecatedSection__Group_1_2_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getGroup_1_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Alternatives_1_2"
+
+
+    // $ANTLR start "rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0"
+    // InternalSEW.g:2355:1: rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0 : ( ( ruleDeprecatedAttribute ) | ( ruleDeprecatedObject ) | ( ruleObject ) );
+    public final void rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2359:1: ( ( ruleDeprecatedAttribute ) | ( ruleDeprecatedObject ) | ( ruleObject ) )
+            int alt40=3;
+            alt40 = dfa40.predict(input);
+            switch (alt40) {
+                case 1 :
+                    // InternalSEW.g:2360:2: ( ruleDeprecatedAttribute )
+                    {
+                    // InternalSEW.g:2360:2: ( ruleDeprecatedAttribute )
+                    // InternalSEW.g:2361:3: ruleDeprecatedAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_0_1_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_0_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2366:2: ( ruleDeprecatedObject )
+                    {
+                    // InternalSEW.g:2366:2: ( ruleDeprecatedObject )
+                    // InternalSEW.g:2367:3: ruleDeprecatedObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_0_1_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_0_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:2372:2: ( ruleObject )
+                    {
+                    // InternalSEW.g:2372:2: ( ruleObject )
+                    // InternalSEW.g:2373:3: ruleObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_0_1_0_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_0_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0"
+
+
+    // $ANTLR start "rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0"
+    // InternalSEW.g:2382:1: rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0 : ( ( ruleDeprecatedAttribute ) | ( ruleDeprecatedObject ) | ( ruleObject ) );
+    public final void rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2386:1: ( ( ruleDeprecatedAttribute ) | ( ruleDeprecatedObject ) | ( ruleObject ) )
+            int alt41=3;
+            alt41 = dfa41.predict(input);
+            switch (alt41) {
+                case 1 :
+                    // InternalSEW.g:2387:2: ( ruleDeprecatedAttribute )
+                    {
+                    // InternalSEW.g:2387:2: ( ruleDeprecatedAttribute )
+                    // InternalSEW.g:2388:3: ruleDeprecatedAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_1_1_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2393:2: ( ruleDeprecatedObject )
+                    {
+                    // InternalSEW.g:2393:2: ( ruleDeprecatedObject )
+                    // InternalSEW.g:2394:3: ruleDeprecatedObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_1_1_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDeprecatedObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:2399:2: ( ruleObject )
+                    {
+                    // InternalSEW.g:2399:2: ( ruleObject )
+                    // InternalSEW.g:2400:3: ruleObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_1_1_0_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_1_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0"
+
+
+    // $ANTLR start "rule__DeprecatedAttributeID__Alternatives"
+    // InternalSEW.g:2409:1: rule__DeprecatedAttributeID__Alternatives : ( ( ruleXID ) | ( RULE_AT_IDENTIFIER ) );
+    public final void rule__DeprecatedAttributeID__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2413:1: ( ( ruleXID ) | ( RULE_AT_IDENTIFIER ) )
+            int alt42=2;
+            int LA42_0 = input.LA(1);
+
+            if ( (LA42_0==RULE_XIDENDIFIER||LA42_0==14||LA42_0==18||(LA42_0>=42 && LA42_0<=47)) ) {
+                alt42=1;
+            }
+            else if ( (LA42_0==RULE_AT_IDENTIFIER) ) {
+                alt42=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 42, 0, input);
+
+                throw nvae;
+            }
+            switch (alt42) {
+                case 1 :
+                    // InternalSEW.g:2414:2: ( ruleXID )
+                    {
+                    // InternalSEW.g:2414:2: ( ruleXID )
+                    // InternalSEW.g:2415:3: ruleXID
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedAttributeIDAccess().getXIDParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleXID();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedAttributeIDAccess().getXIDParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2420:2: ( RULE_AT_IDENTIFIER )
+                    {
+                    // InternalSEW.g:2420:2: ( RULE_AT_IDENTIFIER )
+                    // InternalSEW.g:2421:3: RULE_AT_IDENTIFIER
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedAttributeIDAccess().getAT_IDENTIFIERTerminalRuleCall_1()); 
+                    }
+                    match(input,RULE_AT_IDENTIFIER,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedAttributeIDAccess().getAT_IDENTIFIERTerminalRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttributeID__Alternatives"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__OperatorAlternatives_2_0"
+    // InternalSEW.g:2430:1: rule__DeprecatedExpression__OperatorAlternatives_2_0 : ( ( '|;|' ) | ( '|i|' ) );
+    public final void rule__DeprecatedExpression__OperatorAlternatives_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2434:1: ( ( '|;|' ) | ( '|i|' ) )
+            int alt43=2;
+            int LA43_0 = input.LA(1);
+
+            if ( (LA43_0==48) ) {
+                alt43=1;
+            }
+            else if ( (LA43_0==49) ) {
+                alt43=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 43, 0, input);
+
+                throw nvae;
+            }
+            switch (alt43) {
+                case 1 :
+                    // InternalSEW.g:2435:2: ( '|;|' )
+                    {
+                    // InternalSEW.g:2435:2: ( '|;|' )
+                    // InternalSEW.g:2436:3: '|;|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedExpressionAccess().getOperatorVerticalLineSemicolonVerticalLineKeyword_2_0_0()); 
+                    }
+                    match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedExpressionAccess().getOperatorVerticalLineSemicolonVerticalLineKeyword_2_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2441:2: ( '|i|' )
+                    {
+                    // InternalSEW.g:2441:2: ( '|i|' )
+                    // InternalSEW.g:2442:3: '|i|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDeprecatedExpressionAccess().getOperatorIKeyword_2_0_1()); 
+                    }
+                    match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDeprecatedExpressionAccess().getOperatorIKeyword_2_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__OperatorAlternatives_2_0"
+
+
+    // $ANTLR start "rule__Workflow__Group__0"
+    // InternalSEW.g:2451:1: rule__Workflow__Group__0 : rule__Workflow__Group__0__Impl rule__Workflow__Group__1 ;
+    public final void rule__Workflow__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2455:1: ( rule__Workflow__Group__0__Impl rule__Workflow__Group__1 )
+            // InternalSEW.g:2456:2: rule__Workflow__Group__0__Impl rule__Workflow__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_3);
+            rule__Workflow__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group__0"
+
+
+    // $ANTLR start "rule__Workflow__Group__0__Impl"
+    // InternalSEW.g:2463:1: rule__Workflow__Group__0__Impl : ( () ) ;
+    public final void rule__Workflow__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2467:1: ( ( () ) )
+            // InternalSEW.g:2468:1: ( () )
+            {
+            // InternalSEW.g:2468:1: ( () )
+            // InternalSEW.g:2469:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getSEWorkflowAction_0()); 
+            }
+            // InternalSEW.g:2470:2: ()
+            // InternalSEW.g:2470:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getSEWorkflowAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Workflow__Group__1"
+    // InternalSEW.g:2478:1: rule__Workflow__Group__1 : rule__Workflow__Group__1__Impl rule__Workflow__Group__2 ;
+    public final void rule__Workflow__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2482:1: ( rule__Workflow__Group__1__Impl rule__Workflow__Group__2 )
+            // InternalSEW.g:2483:2: rule__Workflow__Group__1__Impl rule__Workflow__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_3);
+            rule__Workflow__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group__1"
+
+
+    // $ANTLR start "rule__Workflow__Group__1__Impl"
+    // InternalSEW.g:2490:1: rule__Workflow__Group__1__Impl : ( ( ruleProlog )? ) ;
+    public final void rule__Workflow__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2494:1: ( ( ( ruleProlog )? ) )
+            // InternalSEW.g:2495:1: ( ( ruleProlog )? )
+            {
+            // InternalSEW.g:2495:1: ( ( ruleProlog )? )
+            // InternalSEW.g:2496:2: ( ruleProlog )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getPrologParserRuleCall_1()); 
+            }
+            // InternalSEW.g:2497:2: ( ruleProlog )?
+            int alt44=2;
+            int LA44_0 = input.LA(1);
+
+            if ( ((LA44_0>=16 && LA44_0<=17)) ) {
+                alt44=1;
+            }
+            switch (alt44) {
+                case 1 :
+                    // InternalSEW.g:2497:3: ruleProlog
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleProlog();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getPrologParserRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Workflow__Group__2"
+    // InternalSEW.g:2505:1: rule__Workflow__Group__2 : rule__Workflow__Group__2__Impl ;
+    public final void rule__Workflow__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2509:1: ( rule__Workflow__Group__2__Impl )
+            // InternalSEW.g:2510:2: rule__Workflow__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group__2"
+
+
+    // $ANTLR start "rule__Workflow__Group__2__Impl"
+    // InternalSEW.g:2516:1: rule__Workflow__Group__2__Impl : ( ( rule__Workflow__Alternatives_2 ) ) ;
+    public final void rule__Workflow__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2520:1: ( ( ( rule__Workflow__Alternatives_2 ) ) )
+            // InternalSEW.g:2521:1: ( ( rule__Workflow__Alternatives_2 ) )
+            {
+            // InternalSEW.g:2521:1: ( ( rule__Workflow__Alternatives_2 ) )
+            // InternalSEW.g:2522:2: ( rule__Workflow__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getAlternatives_2()); 
+            }
+            // InternalSEW.g:2523:2: ( rule__Workflow__Alternatives_2 )
+            // InternalSEW.g:2523:3: rule__Workflow__Alternatives_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__0"
+    // InternalSEW.g:2532:1: rule__Workflow__Group_2_0__0 : rule__Workflow__Group_2_0__0__Impl rule__Workflow__Group_2_0__1 ;
+    public final void rule__Workflow__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2536:1: ( rule__Workflow__Group_2_0__0__Impl rule__Workflow__Group_2_0__1 )
+            // InternalSEW.g:2537:2: rule__Workflow__Group_2_0__0__Impl rule__Workflow__Group_2_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_4);
+            rule__Workflow__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__0"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__0__Impl"
+    // InternalSEW.g:2544:1: rule__Workflow__Group_2_0__0__Impl : ( ( rule__Workflow__TypeAssignment_2_0_0 ) ) ;
+    public final void rule__Workflow__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2548:1: ( ( ( rule__Workflow__TypeAssignment_2_0_0 ) ) )
+            // InternalSEW.g:2549:1: ( ( rule__Workflow__TypeAssignment_2_0_0 ) )
+            {
+            // InternalSEW.g:2549:1: ( ( rule__Workflow__TypeAssignment_2_0_0 ) )
+            // InternalSEW.g:2550:2: ( rule__Workflow__TypeAssignment_2_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getTypeAssignment_2_0_0()); 
+            }
+            // InternalSEW.g:2551:2: ( rule__Workflow__TypeAssignment_2_0_0 )
+            // InternalSEW.g:2551:3: rule__Workflow__TypeAssignment_2_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__TypeAssignment_2_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getTypeAssignment_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__1"
+    // InternalSEW.g:2559:1: rule__Workflow__Group_2_0__1 : rule__Workflow__Group_2_0__1__Impl rule__Workflow__Group_2_0__2 ;
+    public final void rule__Workflow__Group_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2563:1: ( rule__Workflow__Group_2_0__1__Impl rule__Workflow__Group_2_0__2 )
+            // InternalSEW.g:2564:2: rule__Workflow__Group_2_0__1__Impl rule__Workflow__Group_2_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_4);
+            rule__Workflow__Group_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group_2_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__1"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__1__Impl"
+    // InternalSEW.g:2571:1: rule__Workflow__Group_2_0__1__Impl : ( ( rule__Workflow__NameAssignment_2_0_1 )? ) ;
+    public final void rule__Workflow__Group_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2575:1: ( ( ( rule__Workflow__NameAssignment_2_0_1 )? ) )
+            // InternalSEW.g:2576:1: ( ( rule__Workflow__NameAssignment_2_0_1 )? )
+            {
+            // InternalSEW.g:2576:1: ( ( rule__Workflow__NameAssignment_2_0_1 )? )
+            // InternalSEW.g:2577:2: ( rule__Workflow__NameAssignment_2_0_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getNameAssignment_2_0_1()); 
+            }
+            // InternalSEW.g:2578:2: ( rule__Workflow__NameAssignment_2_0_1 )?
+            int alt45=2;
+            int LA45_0 = input.LA(1);
+
+            if ( (LA45_0==RULE_XIDENDIFIER||LA45_0==14||LA45_0==18||(LA45_0>=42 && LA45_0<=47)) ) {
+                alt45=1;
+            }
+            switch (alt45) {
+                case 1 :
+                    // InternalSEW.g:2578:3: rule__Workflow__NameAssignment_2_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Workflow__NameAssignment_2_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getNameAssignment_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__2"
+    // InternalSEW.g:2586:1: rule__Workflow__Group_2_0__2 : rule__Workflow__Group_2_0__2__Impl rule__Workflow__Group_2_0__3 ;
+    public final void rule__Workflow__Group_2_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2590:1: ( rule__Workflow__Group_2_0__2__Impl rule__Workflow__Group_2_0__3 )
+            // InternalSEW.g:2591:2: rule__Workflow__Group_2_0__2__Impl rule__Workflow__Group_2_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_4);
+            rule__Workflow__Group_2_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group_2_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__2"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__2__Impl"
+    // InternalSEW.g:2598:1: rule__Workflow__Group_2_0__2__Impl : ( ( rule__Workflow__DescriptionAssignment_2_0_2 )? ) ;
+    public final void rule__Workflow__Group_2_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2602:1: ( ( ( rule__Workflow__DescriptionAssignment_2_0_2 )? ) )
+            // InternalSEW.g:2603:1: ( ( rule__Workflow__DescriptionAssignment_2_0_2 )? )
+            {
+            // InternalSEW.g:2603:1: ( ( rule__Workflow__DescriptionAssignment_2_0_2 )? )
+            // InternalSEW.g:2604:2: ( rule__Workflow__DescriptionAssignment_2_0_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getDescriptionAssignment_2_0_2()); 
+            }
+            // InternalSEW.g:2605:2: ( rule__Workflow__DescriptionAssignment_2_0_2 )?
+            int alt46=2;
+            int LA46_0 = input.LA(1);
+
+            if ( (LA46_0==RULE_STRING) ) {
+                alt46=1;
+            }
+            switch (alt46) {
+                case 1 :
+                    // InternalSEW.g:2605:3: rule__Workflow__DescriptionAssignment_2_0_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Workflow__DescriptionAssignment_2_0_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getDescriptionAssignment_2_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__2__Impl"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__3"
+    // InternalSEW.g:2613:1: rule__Workflow__Group_2_0__3 : rule__Workflow__Group_2_0__3__Impl rule__Workflow__Group_2_0__4 ;
+    public final void rule__Workflow__Group_2_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2617:1: ( rule__Workflow__Group_2_0__3__Impl rule__Workflow__Group_2_0__4 )
+            // InternalSEW.g:2618:2: rule__Workflow__Group_2_0__3__Impl rule__Workflow__Group_2_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__Workflow__Group_2_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group_2_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__3"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__3__Impl"
+    // InternalSEW.g:2625:1: rule__Workflow__Group_2_0__3__Impl : ( '{' ) ;
+    public final void rule__Workflow__Group_2_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2629:1: ( ( '{' ) )
+            // InternalSEW.g:2630:1: ( '{' )
+            {
+            // InternalSEW.g:2630:1: ( '{' )
+            // InternalSEW.g:2631:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getLeftCurlyBracketKeyword_2_0_3()); 
+            }
+            match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getLeftCurlyBracketKeyword_2_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__3__Impl"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__4"
+    // InternalSEW.g:2640:1: rule__Workflow__Group_2_0__4 : rule__Workflow__Group_2_0__4__Impl rule__Workflow__Group_2_0__5 ;
+    public final void rule__Workflow__Group_2_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2644:1: ( rule__Workflow__Group_2_0__4__Impl rule__Workflow__Group_2_0__5 )
+            // InternalSEW.g:2645:2: rule__Workflow__Group_2_0__4__Impl rule__Workflow__Group_2_0__5
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__Workflow__Group_2_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group_2_0__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__4"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__4__Impl"
+    // InternalSEW.g:2652:1: rule__Workflow__Group_2_0__4__Impl : ( ( rule__Workflow__ElementAssignment_2_0_4 )* ) ;
+    public final void rule__Workflow__Group_2_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2656:1: ( ( ( rule__Workflow__ElementAssignment_2_0_4 )* ) )
+            // InternalSEW.g:2657:1: ( ( rule__Workflow__ElementAssignment_2_0_4 )* )
+            {
+            // InternalSEW.g:2657:1: ( ( rule__Workflow__ElementAssignment_2_0_4 )* )
+            // InternalSEW.g:2658:2: ( rule__Workflow__ElementAssignment_2_0_4 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getElementAssignment_2_0_4()); 
+            }
+            // InternalSEW.g:2659:2: ( rule__Workflow__ElementAssignment_2_0_4 )*
+            loop47:
+            do {
+                int alt47=2;
+                int LA47_0 = input.LA(1);
+
+                if ( (LA47_0==RULE_XIDENDIFIER||LA47_0==14||LA47_0==18||(LA47_0>=42 && LA47_0<=47)) ) {
+                    alt47=1;
+                }
+
+
+                switch (alt47) {
+            	case 1 :
+            	    // InternalSEW.g:2659:3: rule__Workflow__ElementAssignment_2_0_4
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__Workflow__ElementAssignment_2_0_4();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop47;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getElementAssignment_2_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__4__Impl"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__5"
+    // InternalSEW.g:2667:1: rule__Workflow__Group_2_0__5 : rule__Workflow__Group_2_0__5__Impl ;
+    public final void rule__Workflow__Group_2_0__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2671:1: ( rule__Workflow__Group_2_0__5__Impl )
+            // InternalSEW.g:2672:2: rule__Workflow__Group_2_0__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__Group_2_0__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__5"
+
+
+    // $ANTLR start "rule__Workflow__Group_2_0__5__Impl"
+    // InternalSEW.g:2678:1: rule__Workflow__Group_2_0__5__Impl : ( '}' ) ;
+    public final void rule__Workflow__Group_2_0__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2682:1: ( ( '}' ) )
+            // InternalSEW.g:2683:1: ( '}' )
+            {
+            // InternalSEW.g:2683:1: ( '}' )
+            // InternalSEW.g:2684:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getRightCurlyBracketKeyword_2_0_5()); 
+            }
+            match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getRightCurlyBracketKeyword_2_0_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__Group_2_0__5__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group__0"
+    // InternalSEW.g:2694:1: rule__Prolog__Group__0 : rule__Prolog__Group__0__Impl rule__Prolog__Group__1 ;
+    public final void rule__Prolog__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2698:1: ( rule__Prolog__Group__0__Impl rule__Prolog__Group__1 )
+            // InternalSEW.g:2699:2: rule__Prolog__Group__0__Impl rule__Prolog__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_7);
+            rule__Prolog__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__0"
+
+
+    // $ANTLR start "rule__Prolog__Group__0__Impl"
+    // InternalSEW.g:2706:1: rule__Prolog__Group__0__Impl : ( ( rule__Prolog__Alternatives_0 ) ) ;
+    public final void rule__Prolog__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2710:1: ( ( ( rule__Prolog__Alternatives_0 ) ) )
+            // InternalSEW.g:2711:1: ( ( rule__Prolog__Alternatives_0 ) )
+            {
+            // InternalSEW.g:2711:1: ( ( rule__Prolog__Alternatives_0 ) )
+            // InternalSEW.g:2712:2: ( rule__Prolog__Alternatives_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getAlternatives_0()); 
+            }
+            // InternalSEW.g:2713:2: ( rule__Prolog__Alternatives_0 )
+            // InternalSEW.g:2713:3: rule__Prolog__Alternatives_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Alternatives_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getAlternatives_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group__1"
+    // InternalSEW.g:2721:1: rule__Prolog__Group__1 : rule__Prolog__Group__1__Impl rule__Prolog__Group__2 ;
+    public final void rule__Prolog__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2725:1: ( rule__Prolog__Group__1__Impl rule__Prolog__Group__2 )
+            // InternalSEW.g:2726:2: rule__Prolog__Group__1__Impl rule__Prolog__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_8);
+            rule__Prolog__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__1"
+
+
+    // $ANTLR start "rule__Prolog__Group__1__Impl"
+    // InternalSEW.g:2733:1: rule__Prolog__Group__1__Impl : ( '<' ) ;
+    public final void rule__Prolog__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2737:1: ( ( '<' ) )
+            // InternalSEW.g:2738:1: ( '<' )
+            {
+            // InternalSEW.g:2738:1: ( '<' )
+            // InternalSEW.g:2739:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getLessThanSignKeyword_1()); 
+            }
+            match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getLessThanSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group__2"
+    // InternalSEW.g:2748:1: rule__Prolog__Group__2 : rule__Prolog__Group__2__Impl rule__Prolog__Group__3 ;
+    public final void rule__Prolog__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2752:1: ( rule__Prolog__Group__2__Impl rule__Prolog__Group__3 )
+            // InternalSEW.g:2753:2: rule__Prolog__Group__2__Impl rule__Prolog__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_9);
+            rule__Prolog__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__2"
+
+
+    // $ANTLR start "rule__Prolog__Group__2__Impl"
+    // InternalSEW.g:2760:1: rule__Prolog__Group__2__Impl : ( ( rule__Prolog__Alternatives_2 ) ) ;
+    public final void rule__Prolog__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2764:1: ( ( ( rule__Prolog__Alternatives_2 ) ) )
+            // InternalSEW.g:2765:1: ( ( rule__Prolog__Alternatives_2 ) )
+            {
+            // InternalSEW.g:2765:1: ( ( rule__Prolog__Alternatives_2 ) )
+            // InternalSEW.g:2766:2: ( rule__Prolog__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getAlternatives_2()); 
+            }
+            // InternalSEW.g:2767:2: ( rule__Prolog__Alternatives_2 )
+            // InternalSEW.g:2767:3: rule__Prolog__Alternatives_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group__3"
+    // InternalSEW.g:2775:1: rule__Prolog__Group__3 : rule__Prolog__Group__3__Impl rule__Prolog__Group__4 ;
+    public final void rule__Prolog__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2779:1: ( rule__Prolog__Group__3__Impl rule__Prolog__Group__4 )
+            // InternalSEW.g:2780:2: rule__Prolog__Group__3__Impl rule__Prolog__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_9);
+            rule__Prolog__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__3"
+
+
+    // $ANTLR start "rule__Prolog__Group__3__Impl"
+    // InternalSEW.g:2787:1: rule__Prolog__Group__3__Impl : ( ( rule__Prolog__Group_3__0 )? ) ;
+    public final void rule__Prolog__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2791:1: ( ( ( rule__Prolog__Group_3__0 )? ) )
+            // InternalSEW.g:2792:1: ( ( rule__Prolog__Group_3__0 )? )
+            {
+            // InternalSEW.g:2792:1: ( ( rule__Prolog__Group_3__0 )? )
+            // InternalSEW.g:2793:2: ( rule__Prolog__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getGroup_3()); 
+            }
+            // InternalSEW.g:2794:2: ( rule__Prolog__Group_3__0 )?
+            int alt48=2;
+            int LA48_0 = input.LA(1);
+
+            if ( (LA48_0==53) ) {
+                int LA48_1 = input.LA(2);
+
+                if ( (LA48_1==RULE_INT||LA48_1==20||LA48_1==68) ) {
+                    alt48=1;
+                }
+            }
+            switch (alt48) {
+                case 1 :
+                    // InternalSEW.g:2794:3: rule__Prolog__Group_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Prolog__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group__4"
+    // InternalSEW.g:2802:1: rule__Prolog__Group__4 : rule__Prolog__Group__4__Impl rule__Prolog__Group__5 ;
+    public final void rule__Prolog__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2806:1: ( rule__Prolog__Group__4__Impl rule__Prolog__Group__5 )
+            // InternalSEW.g:2807:2: rule__Prolog__Group__4__Impl rule__Prolog__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_9);
+            rule__Prolog__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__4"
+
+
+    // $ANTLR start "rule__Prolog__Group__4__Impl"
+    // InternalSEW.g:2814:1: rule__Prolog__Group__4__Impl : ( ( rule__Prolog__Alternatives_4 )? ) ;
+    public final void rule__Prolog__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2818:1: ( ( ( rule__Prolog__Alternatives_4 )? ) )
+            // InternalSEW.g:2819:1: ( ( rule__Prolog__Alternatives_4 )? )
+            {
+            // InternalSEW.g:2819:1: ( ( rule__Prolog__Alternatives_4 )? )
+            // InternalSEW.g:2820:2: ( rule__Prolog__Alternatives_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getAlternatives_4()); 
+            }
+            // InternalSEW.g:2821:2: ( rule__Prolog__Alternatives_4 )?
+            int alt49=2;
+            int LA49_0 = input.LA(1);
+
+            if ( (LA49_0==RULE_STRING||LA49_0==53) ) {
+                alt49=1;
+            }
+            switch (alt49) {
+                case 1 :
+                    // InternalSEW.g:2821:3: rule__Prolog__Alternatives_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Prolog__Alternatives_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getAlternatives_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group__5"
+    // InternalSEW.g:2829:1: rule__Prolog__Group__5 : rule__Prolog__Group__5__Impl ;
+    public final void rule__Prolog__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2833:1: ( rule__Prolog__Group__5__Impl )
+            // InternalSEW.g:2834:2: rule__Prolog__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__5"
+
+
+    // $ANTLR start "rule__Prolog__Group__5__Impl"
+    // InternalSEW.g:2840:1: rule__Prolog__Group__5__Impl : ( '>:' ) ;
+    public final void rule__Prolog__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2844:1: ( ( '>:' ) )
+            // InternalSEW.g:2845:1: ( '>:' )
+            {
+            // InternalSEW.g:2845:1: ( '>:' )
+            // InternalSEW.g:2846:2: '>:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getGreaterThanSignColonKeyword_5()); 
+            }
+            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getGreaterThanSignColonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group_3__0"
+    // InternalSEW.g:2856:1: rule__Prolog__Group_3__0 : rule__Prolog__Group_3__0__Impl rule__Prolog__Group_3__1 ;
+    public final void rule__Prolog__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2860:1: ( rule__Prolog__Group_3__0__Impl rule__Prolog__Group_3__1 )
+            // InternalSEW.g:2861:2: rule__Prolog__Group_3__0__Impl rule__Prolog__Group_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__Prolog__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group_3__0"
+
+
+    // $ANTLR start "rule__Prolog__Group_3__0__Impl"
+    // InternalSEW.g:2868:1: rule__Prolog__Group_3__0__Impl : ( ',' ) ;
+    public final void rule__Prolog__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2872:1: ( ( ',' ) )
+            // InternalSEW.g:2873:1: ( ',' )
+            {
+            // InternalSEW.g:2873:1: ( ',' )
+            // InternalSEW.g:2874:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getCommaKeyword_3_0()); 
+            }
+            match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getCommaKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group_3__1"
+    // InternalSEW.g:2883:1: rule__Prolog__Group_3__1 : rule__Prolog__Group_3__1__Impl ;
+    public final void rule__Prolog__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2887:1: ( rule__Prolog__Group_3__1__Impl )
+            // InternalSEW.g:2888:2: rule__Prolog__Group_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group_3__1"
+
+
+    // $ANTLR start "rule__Prolog__Group_3__1__Impl"
+    // InternalSEW.g:2894:1: rule__Prolog__Group_3__1__Impl : ( ruleEDouble ) ;
+    public final void rule__Prolog__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2898:1: ( ( ruleEDouble ) )
+            // InternalSEW.g:2899:1: ( ruleEDouble )
+            {
+            // InternalSEW.g:2899:1: ( ruleEDouble )
+            // InternalSEW.g:2900:2: ruleEDouble
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getEDoubleParserRuleCall_3_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getEDoubleParserRuleCall_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group_4_0__0"
+    // InternalSEW.g:2910:1: rule__Prolog__Group_4_0__0 : rule__Prolog__Group_4_0__0__Impl rule__Prolog__Group_4_0__1 ;
+    public final void rule__Prolog__Group_4_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2914:1: ( rule__Prolog__Group_4_0__0__Impl rule__Prolog__Group_4_0__1 )
+            // InternalSEW.g:2915:2: rule__Prolog__Group_4_0__0__Impl rule__Prolog__Group_4_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__Prolog__Group_4_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group_4_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group_4_0__0"
+
+
+    // $ANTLR start "rule__Prolog__Group_4_0__0__Impl"
+    // InternalSEW.g:2922:1: rule__Prolog__Group_4_0__0__Impl : ( ',' ) ;
+    public final void rule__Prolog__Group_4_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2926:1: ( ( ',' ) )
+            // InternalSEW.g:2927:1: ( ',' )
+            {
+            // InternalSEW.g:2927:1: ( ',' )
+            // InternalSEW.g:2928:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getCommaKeyword_4_0_0()); 
+            }
+            match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getCommaKeyword_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group_4_0__0__Impl"
+
+
+    // $ANTLR start "rule__Prolog__Group_4_0__1"
+    // InternalSEW.g:2937:1: rule__Prolog__Group_4_0__1 : rule__Prolog__Group_4_0__1__Impl ;
+    public final void rule__Prolog__Group_4_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2941:1: ( rule__Prolog__Group_4_0__1__Impl )
+            // InternalSEW.g:2942:2: rule__Prolog__Group_4_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Prolog__Group_4_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group_4_0__1"
+
+
+    // $ANTLR start "rule__Prolog__Group_4_0__1__Impl"
+    // InternalSEW.g:2948:1: rule__Prolog__Group_4_0__1__Impl : ( ruleUFI ) ;
+    public final void rule__Prolog__Group_4_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2952:1: ( ( ruleUFI ) )
+            // InternalSEW.g:2953:1: ( ruleUFI )
+            {
+            // InternalSEW.g:2953:1: ( ruleUFI )
+            // InternalSEW.g:2954:2: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrologAccess().getUFIParserRuleCall_4_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrologAccess().getUFIParserRuleCall_4_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Prolog__Group_4_0__1__Impl"
+
+
+    // $ANTLR start "rule__UFI__Group__0"
+    // InternalSEW.g:2964:1: rule__UFI__Group__0 : rule__UFI__Group__0__Impl rule__UFI__Group__1 ;
+    public final void rule__UFI__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2968:1: ( rule__UFI__Group__0__Impl rule__UFI__Group__1 )
+            // InternalSEW.g:2969:2: rule__UFI__Group__0__Impl rule__UFI__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_12);
+            rule__UFI__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UFI__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UFI__Group__0"
+
+
+    // $ANTLR start "rule__UFI__Group__0__Impl"
+    // InternalSEW.g:2976:1: rule__UFI__Group__0__Impl : ( ruleXID ) ;
+    public final void rule__UFI__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2980:1: ( ( ruleXID ) )
+            // InternalSEW.g:2981:1: ( ruleXID )
+            {
+            // InternalSEW.g:2981:1: ( ruleXID )
+            // InternalSEW.g:2982:2: ruleXID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUFIAccess().getXIDParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUFIAccess().getXIDParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UFI__Group__0__Impl"
+
+
+    // $ANTLR start "rule__UFI__Group__1"
+    // InternalSEW.g:2991:1: rule__UFI__Group__1 : rule__UFI__Group__1__Impl ;
+    public final void rule__UFI__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:2995:1: ( rule__UFI__Group__1__Impl )
+            // InternalSEW.g:2996:2: rule__UFI__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UFI__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UFI__Group__1"
+
+
+    // $ANTLR start "rule__UFI__Group__1__Impl"
+    // InternalSEW.g:3002:1: rule__UFI__Group__1__Impl : ( ( rule__UFI__Group_1__0 )* ) ;
+    public final void rule__UFI__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3006:1: ( ( ( rule__UFI__Group_1__0 )* ) )
+            // InternalSEW.g:3007:1: ( ( rule__UFI__Group_1__0 )* )
+            {
+            // InternalSEW.g:3007:1: ( ( rule__UFI__Group_1__0 )* )
+            // InternalSEW.g:3008:2: ( rule__UFI__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUFIAccess().getGroup_1()); 
+            }
+            // InternalSEW.g:3009:2: ( rule__UFI__Group_1__0 )*
+            loop50:
+            do {
+                int alt50=2;
+                int LA50_0 = input.LA(1);
+
+                if ( (LA50_0==20) ) {
+                    int LA50_2 = input.LA(2);
+
+                    if ( (LA50_2==RULE_XIDENDIFIER||LA50_2==14||LA50_2==18||(LA50_2>=42 && LA50_2<=47)) ) {
+                        alt50=1;
+                    }
+
+
+                }
+                else if ( (LA50_0==19) ) {
+                    alt50=1;
+                }
+
+
+                switch (alt50) {
+            	case 1 :
+            	    // InternalSEW.g:3009:3: rule__UFI__Group_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_13);
+            	    rule__UFI__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop50;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUFIAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UFI__Group__1__Impl"
+
+
+    // $ANTLR start "rule__UFI__Group_1__0"
+    // InternalSEW.g:3018:1: rule__UFI__Group_1__0 : rule__UFI__Group_1__0__Impl rule__UFI__Group_1__1 ;
+    public final void rule__UFI__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3022:1: ( rule__UFI__Group_1__0__Impl rule__UFI__Group_1__1 )
+            // InternalSEW.g:3023:2: rule__UFI__Group_1__0__Impl rule__UFI__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__UFI__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UFI__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UFI__Group_1__0"
+
+
+    // $ANTLR start "rule__UFI__Group_1__0__Impl"
+    // InternalSEW.g:3030:1: rule__UFI__Group_1__0__Impl : ( ( rule__UFI__Alternatives_1_0 ) ) ;
+    public final void rule__UFI__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3034:1: ( ( ( rule__UFI__Alternatives_1_0 ) ) )
+            // InternalSEW.g:3035:1: ( ( rule__UFI__Alternatives_1_0 ) )
+            {
+            // InternalSEW.g:3035:1: ( ( rule__UFI__Alternatives_1_0 ) )
+            // InternalSEW.g:3036:2: ( rule__UFI__Alternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUFIAccess().getAlternatives_1_0()); 
+            }
+            // InternalSEW.g:3037:2: ( rule__UFI__Alternatives_1_0 )
+            // InternalSEW.g:3037:3: rule__UFI__Alternatives_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UFI__Alternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUFIAccess().getAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UFI__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__UFI__Group_1__1"
+    // InternalSEW.g:3045:1: rule__UFI__Group_1__1 : rule__UFI__Group_1__1__Impl ;
+    public final void rule__UFI__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3049:1: ( rule__UFI__Group_1__1__Impl )
+            // InternalSEW.g:3050:2: rule__UFI__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UFI__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UFI__Group_1__1"
+
+
+    // $ANTLR start "rule__UFI__Group_1__1__Impl"
+    // InternalSEW.g:3056:1: rule__UFI__Group_1__1__Impl : ( ruleXID ) ;
+    public final void rule__UFI__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3060:1: ( ( ruleXID ) )
+            // InternalSEW.g:3061:1: ( ruleXID )
+            {
+            // InternalSEW.g:3061:1: ( ruleXID )
+            // InternalSEW.g:3062:2: ruleXID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUFIAccess().getXIDParserRuleCall_1_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUFIAccess().getXIDParserRuleCall_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UFI__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_0__0"
+    // InternalSEW.g:3072:1: rule__Object__Group_0__0 : rule__Object__Group_0__0__Impl rule__Object__Group_0__1 ;
+    public final void rule__Object__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3076:1: ( rule__Object__Group_0__0__Impl rule__Object__Group_0__1 )
+            // InternalSEW.g:3077:2: rule__Object__Group_0__0__Impl rule__Object__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__Object__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__0"
+
+
+    // $ANTLR start "rule__Object__Group_0__0__Impl"
+    // InternalSEW.g:3084:1: rule__Object__Group_0__0__Impl : ( () ) ;
+    public final void rule__Object__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3088:1: ( ( () ) )
+            // InternalSEW.g:3089:1: ( () )
+            {
+            // InternalSEW.g:3089:1: ( () )
+            // InternalSEW.g:3090:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getWObjectAction_0_0()); 
+            }
+            // InternalSEW.g:3091:2: ()
+            // InternalSEW.g:3091:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getWObjectAction_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_0__1"
+    // InternalSEW.g:3099:1: rule__Object__Group_0__1 : rule__Object__Group_0__1__Impl rule__Object__Group_0__2 ;
+    public final void rule__Object__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3103:1: ( rule__Object__Group_0__1__Impl rule__Object__Group_0__2 )
+            // InternalSEW.g:3104:2: rule__Object__Group_0__1__Impl rule__Object__Group_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_4);
+            rule__Object__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__1"
+
+
+    // $ANTLR start "rule__Object__Group_0__1__Impl"
+    // InternalSEW.g:3111:1: rule__Object__Group_0__1__Impl : ( ( rule__Object__TypeAssignment_0_1 ) ) ;
+    public final void rule__Object__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3115:1: ( ( ( rule__Object__TypeAssignment_0_1 ) ) )
+            // InternalSEW.g:3116:1: ( ( rule__Object__TypeAssignment_0_1 ) )
+            {
+            // InternalSEW.g:3116:1: ( ( rule__Object__TypeAssignment_0_1 ) )
+            // InternalSEW.g:3117:2: ( rule__Object__TypeAssignment_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getTypeAssignment_0_1()); 
+            }
+            // InternalSEW.g:3118:2: ( rule__Object__TypeAssignment_0_1 )
+            // InternalSEW.g:3118:3: rule__Object__TypeAssignment_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__TypeAssignment_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getTypeAssignment_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_0__2"
+    // InternalSEW.g:3126:1: rule__Object__Group_0__2 : rule__Object__Group_0__2__Impl rule__Object__Group_0__3 ;
+    public final void rule__Object__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3130:1: ( rule__Object__Group_0__2__Impl rule__Object__Group_0__3 )
+            // InternalSEW.g:3131:2: rule__Object__Group_0__2__Impl rule__Object__Group_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_4);
+            rule__Object__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__2"
+
+
+    // $ANTLR start "rule__Object__Group_0__2__Impl"
+    // InternalSEW.g:3138:1: rule__Object__Group_0__2__Impl : ( ( rule__Object__NameAssignment_0_2 )? ) ;
+    public final void rule__Object__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3142:1: ( ( ( rule__Object__NameAssignment_0_2 )? ) )
+            // InternalSEW.g:3143:1: ( ( rule__Object__NameAssignment_0_2 )? )
+            {
+            // InternalSEW.g:3143:1: ( ( rule__Object__NameAssignment_0_2 )? )
+            // InternalSEW.g:3144:2: ( rule__Object__NameAssignment_0_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getNameAssignment_0_2()); 
+            }
+            // InternalSEW.g:3145:2: ( rule__Object__NameAssignment_0_2 )?
+            int alt51=2;
+            int LA51_0 = input.LA(1);
+
+            if ( (LA51_0==RULE_XIDENDIFIER||LA51_0==14||LA51_0==18||(LA51_0>=42 && LA51_0<=47)) ) {
+                alt51=1;
+            }
+            switch (alt51) {
+                case 1 :
+                    // InternalSEW.g:3145:3: rule__Object__NameAssignment_0_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Object__NameAssignment_0_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getNameAssignment_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_0__3"
+    // InternalSEW.g:3153:1: rule__Object__Group_0__3 : rule__Object__Group_0__3__Impl rule__Object__Group_0__4 ;
+    public final void rule__Object__Group_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3157:1: ( rule__Object__Group_0__3__Impl rule__Object__Group_0__4 )
+            // InternalSEW.g:3158:2: rule__Object__Group_0__3__Impl rule__Object__Group_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_4);
+            rule__Object__Group_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__3"
+
+
+    // $ANTLR start "rule__Object__Group_0__3__Impl"
+    // InternalSEW.g:3165:1: rule__Object__Group_0__3__Impl : ( ( rule__Object__DescriptionAssignment_0_3 )? ) ;
+    public final void rule__Object__Group_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3169:1: ( ( ( rule__Object__DescriptionAssignment_0_3 )? ) )
+            // InternalSEW.g:3170:1: ( ( rule__Object__DescriptionAssignment_0_3 )? )
+            {
+            // InternalSEW.g:3170:1: ( ( rule__Object__DescriptionAssignment_0_3 )? )
+            // InternalSEW.g:3171:2: ( rule__Object__DescriptionAssignment_0_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getDescriptionAssignment_0_3()); 
+            }
+            // InternalSEW.g:3172:2: ( rule__Object__DescriptionAssignment_0_3 )?
+            int alt52=2;
+            int LA52_0 = input.LA(1);
+
+            if ( (LA52_0==RULE_STRING) ) {
+                alt52=1;
+            }
+            switch (alt52) {
+                case 1 :
+                    // InternalSEW.g:3172:3: rule__Object__DescriptionAssignment_0_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Object__DescriptionAssignment_0_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getDescriptionAssignment_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__3__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_0__4"
+    // InternalSEW.g:3180:1: rule__Object__Group_0__4 : rule__Object__Group_0__4__Impl rule__Object__Group_0__5 ;
+    public final void rule__Object__Group_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3184:1: ( rule__Object__Group_0__4__Impl rule__Object__Group_0__5 )
+            // InternalSEW.g:3185:2: rule__Object__Group_0__4__Impl rule__Object__Group_0__5
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__Object__Group_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_0__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__4"
+
+
+    // $ANTLR start "rule__Object__Group_0__4__Impl"
+    // InternalSEW.g:3192:1: rule__Object__Group_0__4__Impl : ( '{' ) ;
+    public final void rule__Object__Group_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3196:1: ( ( '{' ) )
+            // InternalSEW.g:3197:1: ( '{' )
+            {
+            // InternalSEW.g:3197:1: ( '{' )
+            // InternalSEW.g:3198:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_0_4()); 
+            }
+            match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__4__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_0__5"
+    // InternalSEW.g:3207:1: rule__Object__Group_0__5 : rule__Object__Group_0__5__Impl rule__Object__Group_0__6 ;
+    public final void rule__Object__Group_0__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3211:1: ( rule__Object__Group_0__5__Impl rule__Object__Group_0__6 )
+            // InternalSEW.g:3212:2: rule__Object__Group_0__5__Impl rule__Object__Group_0__6
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__Object__Group_0__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_0__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__5"
+
+
+    // $ANTLR start "rule__Object__Group_0__5__Impl"
+    // InternalSEW.g:3219:1: rule__Object__Group_0__5__Impl : ( ( rule__Object__ElementAssignment_0_5 )* ) ;
+    public final void rule__Object__Group_0__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3223:1: ( ( ( rule__Object__ElementAssignment_0_5 )* ) )
+            // InternalSEW.g:3224:1: ( ( rule__Object__ElementAssignment_0_5 )* )
+            {
+            // InternalSEW.g:3224:1: ( ( rule__Object__ElementAssignment_0_5 )* )
+            // InternalSEW.g:3225:2: ( rule__Object__ElementAssignment_0_5 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getElementAssignment_0_5()); 
+            }
+            // InternalSEW.g:3226:2: ( rule__Object__ElementAssignment_0_5 )*
+            loop53:
+            do {
+                int alt53=2;
+                int LA53_0 = input.LA(1);
+
+                if ( (LA53_0==RULE_XIDENDIFIER||LA53_0==14||LA53_0==18||(LA53_0>=42 && LA53_0<=47)) ) {
+                    alt53=1;
+                }
+
+
+                switch (alt53) {
+            	case 1 :
+            	    // InternalSEW.g:3226:3: rule__Object__ElementAssignment_0_5
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__Object__ElementAssignment_0_5();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop53;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getElementAssignment_0_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__5__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_0__6"
+    // InternalSEW.g:3234:1: rule__Object__Group_0__6 : rule__Object__Group_0__6__Impl ;
+    public final void rule__Object__Group_0__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3238:1: ( rule__Object__Group_0__6__Impl )
+            // InternalSEW.g:3239:2: rule__Object__Group_0__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_0__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__6"
+
+
+    // $ANTLR start "rule__Object__Group_0__6__Impl"
+    // InternalSEW.g:3245:1: rule__Object__Group_0__6__Impl : ( '}' ) ;
+    public final void rule__Object__Group_0__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3249:1: ( ( '}' ) )
+            // InternalSEW.g:3250:1: ( '}' )
+            {
+            // InternalSEW.g:3250:1: ( '}' )
+            // InternalSEW.g:3251:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_0_6()); 
+            }
+            match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_0_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_0__6__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_1__0"
+    // InternalSEW.g:3261:1: rule__Object__Group_1__0 : rule__Object__Group_1__0__Impl rule__Object__Group_1__1 ;
+    public final void rule__Object__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3265:1: ( rule__Object__Group_1__0__Impl rule__Object__Group_1__1 )
+            // InternalSEW.g:3266:2: rule__Object__Group_1__0__Impl rule__Object__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__Object__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__0"
+
+
+    // $ANTLR start "rule__Object__Group_1__0__Impl"
+    // InternalSEW.g:3273:1: rule__Object__Group_1__0__Impl : ( () ) ;
+    public final void rule__Object__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3277:1: ( ( () ) )
+            // InternalSEW.g:3278:1: ( () )
+            {
+            // InternalSEW.g:3278:1: ( () )
+            // InternalSEW.g:3279:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getWObjectAction_1_0()); 
+            }
+            // InternalSEW.g:3280:2: ()
+            // InternalSEW.g:3280:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getWObjectAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_1__1"
+    // InternalSEW.g:3288:1: rule__Object__Group_1__1 : rule__Object__Group_1__1__Impl rule__Object__Group_1__2 ;
+    public final void rule__Object__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3292:1: ( rule__Object__Group_1__1__Impl rule__Object__Group_1__2 )
+            // InternalSEW.g:3293:2: rule__Object__Group_1__1__Impl rule__Object__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__Object__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__1"
+
+
+    // $ANTLR start "rule__Object__Group_1__1__Impl"
+    // InternalSEW.g:3300:1: rule__Object__Group_1__1__Impl : ( ( rule__Object__NameAssignment_1_1 ) ) ;
+    public final void rule__Object__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3304:1: ( ( ( rule__Object__NameAssignment_1_1 ) ) )
+            // InternalSEW.g:3305:1: ( ( rule__Object__NameAssignment_1_1 ) )
+            {
+            // InternalSEW.g:3305:1: ( ( rule__Object__NameAssignment_1_1 ) )
+            // InternalSEW.g:3306:2: ( rule__Object__NameAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getNameAssignment_1_1()); 
+            }
+            // InternalSEW.g:3307:2: ( rule__Object__NameAssignment_1_1 )
+            // InternalSEW.g:3307:3: rule__Object__NameAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__NameAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getNameAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_1__2"
+    // InternalSEW.g:3315:1: rule__Object__Group_1__2 : rule__Object__Group_1__2__Impl rule__Object__Group_1__3 ;
+    public final void rule__Object__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3319:1: ( rule__Object__Group_1__2__Impl rule__Object__Group_1__3 )
+            // InternalSEW.g:3320:2: rule__Object__Group_1__2__Impl rule__Object__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_15);
+            rule__Object__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__2"
+
+
+    // $ANTLR start "rule__Object__Group_1__2__Impl"
+    // InternalSEW.g:3327:1: rule__Object__Group_1__2__Impl : ( ( rule__Object__Alternatives_1_2 ) ) ;
+    public final void rule__Object__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3331:1: ( ( ( rule__Object__Alternatives_1_2 ) ) )
+            // InternalSEW.g:3332:1: ( ( rule__Object__Alternatives_1_2 ) )
+            {
+            // InternalSEW.g:3332:1: ( ( rule__Object__Alternatives_1_2 ) )
+            // InternalSEW.g:3333:2: ( rule__Object__Alternatives_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getAlternatives_1_2()); 
+            }
+            // InternalSEW.g:3334:2: ( rule__Object__Alternatives_1_2 )
+            // InternalSEW.g:3334:3: rule__Object__Alternatives_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Alternatives_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getAlternatives_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_1__3"
+    // InternalSEW.g:3342:1: rule__Object__Group_1__3 : rule__Object__Group_1__3__Impl rule__Object__Group_1__4 ;
+    public final void rule__Object__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3346:1: ( rule__Object__Group_1__3__Impl rule__Object__Group_1__4 )
+            // InternalSEW.g:3347:2: rule__Object__Group_1__3__Impl rule__Object__Group_1__4
+            {
+            pushFollow(FollowSets000.FOLLOW_15);
+            rule__Object__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__3"
+
+
+    // $ANTLR start "rule__Object__Group_1__3__Impl"
+    // InternalSEW.g:3354:1: rule__Object__Group_1__3__Impl : ( ( rule__Object__Group_1_3__0 )? ) ;
+    public final void rule__Object__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3358:1: ( ( ( rule__Object__Group_1_3__0 )? ) )
+            // InternalSEW.g:3359:1: ( ( rule__Object__Group_1_3__0 )? )
+            {
+            // InternalSEW.g:3359:1: ( ( rule__Object__Group_1_3__0 )? )
+            // InternalSEW.g:3360:2: ( rule__Object__Group_1_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getGroup_1_3()); 
+            }
+            // InternalSEW.g:3361:2: ( rule__Object__Group_1_3__0 )?
+            int alt54=2;
+            int LA54_0 = input.LA(1);
+
+            if ( (LA54_0==RULE_XIDENDIFIER||LA54_0==14||LA54_0==18||(LA54_0>=42 && LA54_0<=47)) ) {
+                alt54=1;
+            }
+            switch (alt54) {
+                case 1 :
+                    // InternalSEW.g:3361:3: rule__Object__Group_1_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Object__Group_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_1__4"
+    // InternalSEW.g:3369:1: rule__Object__Group_1__4 : rule__Object__Group_1__4__Impl rule__Object__Group_1__5 ;
+    public final void rule__Object__Group_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3373:1: ( rule__Object__Group_1__4__Impl rule__Object__Group_1__5 )
+            // InternalSEW.g:3374:2: rule__Object__Group_1__4__Impl rule__Object__Group_1__5
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__Object__Group_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_1__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__4"
+
+
+    // $ANTLR start "rule__Object__Group_1__4__Impl"
+    // InternalSEW.g:3381:1: rule__Object__Group_1__4__Impl : ( '{' ) ;
+    public final void rule__Object__Group_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3385:1: ( ( '{' ) )
+            // InternalSEW.g:3386:1: ( '{' )
+            {
+            // InternalSEW.g:3386:1: ( '{' )
+            // InternalSEW.g:3387:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_1_4()); 
+            }
+            match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__4__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_1__5"
+    // InternalSEW.g:3396:1: rule__Object__Group_1__5 : rule__Object__Group_1__5__Impl rule__Object__Group_1__6 ;
+    public final void rule__Object__Group_1__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3400:1: ( rule__Object__Group_1__5__Impl rule__Object__Group_1__6 )
+            // InternalSEW.g:3401:2: rule__Object__Group_1__5__Impl rule__Object__Group_1__6
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__Object__Group_1__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_1__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__5"
+
+
+    // $ANTLR start "rule__Object__Group_1__5__Impl"
+    // InternalSEW.g:3408:1: rule__Object__Group_1__5__Impl : ( ( rule__Object__ElementAssignment_1_5 )* ) ;
+    public final void rule__Object__Group_1__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3412:1: ( ( ( rule__Object__ElementAssignment_1_5 )* ) )
+            // InternalSEW.g:3413:1: ( ( rule__Object__ElementAssignment_1_5 )* )
+            {
+            // InternalSEW.g:3413:1: ( ( rule__Object__ElementAssignment_1_5 )* )
+            // InternalSEW.g:3414:2: ( rule__Object__ElementAssignment_1_5 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getElementAssignment_1_5()); 
+            }
+            // InternalSEW.g:3415:2: ( rule__Object__ElementAssignment_1_5 )*
+            loop55:
+            do {
+                int alt55=2;
+                int LA55_0 = input.LA(1);
+
+                if ( (LA55_0==RULE_XIDENDIFIER||LA55_0==14||LA55_0==18||(LA55_0>=42 && LA55_0<=47)) ) {
+                    alt55=1;
+                }
+
+
+                switch (alt55) {
+            	case 1 :
+            	    // InternalSEW.g:3415:3: rule__Object__ElementAssignment_1_5
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__Object__ElementAssignment_1_5();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop55;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getElementAssignment_1_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__5__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_1__6"
+    // InternalSEW.g:3423:1: rule__Object__Group_1__6 : rule__Object__Group_1__6__Impl ;
+    public final void rule__Object__Group_1__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3427:1: ( rule__Object__Group_1__6__Impl )
+            // InternalSEW.g:3428:2: rule__Object__Group_1__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_1__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__6"
+
+
+    // $ANTLR start "rule__Object__Group_1__6__Impl"
+    // InternalSEW.g:3434:1: rule__Object__Group_1__6__Impl : ( '}' ) ;
+    public final void rule__Object__Group_1__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3438:1: ( ( '}' ) )
+            // InternalSEW.g:3439:1: ( '}' )
+            {
+            // InternalSEW.g:3439:1: ( '}' )
+            // InternalSEW.g:3440:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_1_6()); 
+            }
+            match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_1_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1__6__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_1_3__0"
+    // InternalSEW.g:3450:1: rule__Object__Group_1_3__0 : rule__Object__Group_1_3__0__Impl rule__Object__Group_1_3__1 ;
+    public final void rule__Object__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3454:1: ( rule__Object__Group_1_3__0__Impl rule__Object__Group_1_3__1 )
+            // InternalSEW.g:3455:2: rule__Object__Group_1_3__0__Impl rule__Object__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__Object__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1_3__0"
+
+
+    // $ANTLR start "rule__Object__Group_1_3__0__Impl"
+    // InternalSEW.g:3462:1: rule__Object__Group_1_3__0__Impl : ( ( rule__Object__TypeAssignment_1_3_0 ) ) ;
+    public final void rule__Object__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3466:1: ( ( ( rule__Object__TypeAssignment_1_3_0 ) ) )
+            // InternalSEW.g:3467:1: ( ( rule__Object__TypeAssignment_1_3_0 ) )
+            {
+            // InternalSEW.g:3467:1: ( ( rule__Object__TypeAssignment_1_3_0 ) )
+            // InternalSEW.g:3468:2: ( rule__Object__TypeAssignment_1_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getTypeAssignment_1_3_0()); 
+            }
+            // InternalSEW.g:3469:2: ( rule__Object__TypeAssignment_1_3_0 )
+            // InternalSEW.g:3469:3: rule__Object__TypeAssignment_1_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__TypeAssignment_1_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getTypeAssignment_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__Object__Group_1_3__1"
+    // InternalSEW.g:3477:1: rule__Object__Group_1_3__1 : rule__Object__Group_1_3__1__Impl ;
+    public final void rule__Object__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3481:1: ( rule__Object__Group_1_3__1__Impl )
+            // InternalSEW.g:3482:2: rule__Object__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1_3__1"
+
+
+    // $ANTLR start "rule__Object__Group_1_3__1__Impl"
+    // InternalSEW.g:3488:1: rule__Object__Group_1_3__1__Impl : ( ( rule__Object__DescriptionAssignment_1_3_1 )? ) ;
+    public final void rule__Object__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3492:1: ( ( ( rule__Object__DescriptionAssignment_1_3_1 )? ) )
+            // InternalSEW.g:3493:1: ( ( rule__Object__DescriptionAssignment_1_3_1 )? )
+            {
+            // InternalSEW.g:3493:1: ( ( rule__Object__DescriptionAssignment_1_3_1 )? )
+            // InternalSEW.g:3494:2: ( rule__Object__DescriptionAssignment_1_3_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getDescriptionAssignment_1_3_1()); 
+            }
+            // InternalSEW.g:3495:2: ( rule__Object__DescriptionAssignment_1_3_1 )?
+            int alt56=2;
+            int LA56_0 = input.LA(1);
+
+            if ( (LA56_0==RULE_STRING) ) {
+                alt56=1;
+            }
+            switch (alt56) {
+                case 1 :
+                    // InternalSEW.g:3495:3: rule__Object__DescriptionAssignment_1_3_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Object__DescriptionAssignment_1_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getDescriptionAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__Section__Group__0"
+    // InternalSEW.g:3504:1: rule__Section__Group__0 : rule__Section__Group__0__Impl rule__Section__Group__1 ;
+    public final void rule__Section__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3508:1: ( rule__Section__Group__0__Impl rule__Section__Group__1 )
+            // InternalSEW.g:3509:2: rule__Section__Group__0__Impl rule__Section__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__Section__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group__0"
+
+
+    // $ANTLR start "rule__Section__Group__0__Impl"
+    // InternalSEW.g:3516:1: rule__Section__Group__0__Impl : ( ( rule__Section__NameAssignment_0 ) ) ;
+    public final void rule__Section__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3520:1: ( ( ( rule__Section__NameAssignment_0 ) ) )
+            // InternalSEW.g:3521:1: ( ( rule__Section__NameAssignment_0 ) )
+            {
+            // InternalSEW.g:3521:1: ( ( rule__Section__NameAssignment_0 ) )
+            // InternalSEW.g:3522:2: ( rule__Section__NameAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getNameAssignment_0()); 
+            }
+            // InternalSEW.g:3523:2: ( rule__Section__NameAssignment_0 )
+            // InternalSEW.g:3523:3: rule__Section__NameAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__NameAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getNameAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Section__Group__1"
+    // InternalSEW.g:3531:1: rule__Section__Group__1 : rule__Section__Group__1__Impl rule__Section__Group__2 ;
+    public final void rule__Section__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3535:1: ( rule__Section__Group__1__Impl rule__Section__Group__2 )
+            // InternalSEW.g:3536:2: rule__Section__Group__1__Impl rule__Section__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__Section__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group__1"
+
+
+    // $ANTLR start "rule__Section__Group__1__Impl"
+    // InternalSEW.g:3543:1: rule__Section__Group__1__Impl : ( ( rule__Section__DescriptionAssignment_1 )? ) ;
+    public final void rule__Section__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3547:1: ( ( ( rule__Section__DescriptionAssignment_1 )? ) )
+            // InternalSEW.g:3548:1: ( ( rule__Section__DescriptionAssignment_1 )? )
+            {
+            // InternalSEW.g:3548:1: ( ( rule__Section__DescriptionAssignment_1 )? )
+            // InternalSEW.g:3549:2: ( rule__Section__DescriptionAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getDescriptionAssignment_1()); 
+            }
+            // InternalSEW.g:3550:2: ( rule__Section__DescriptionAssignment_1 )?
+            int alt57=2;
+            int LA57_0 = input.LA(1);
+
+            if ( (LA57_0==RULE_STRING) ) {
+                alt57=1;
+            }
+            switch (alt57) {
+                case 1 :
+                    // InternalSEW.g:3550:3: rule__Section__DescriptionAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Section__DescriptionAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getDescriptionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Section__Group__2"
+    // InternalSEW.g:3558:1: rule__Section__Group__2 : rule__Section__Group__2__Impl ;
+    public final void rule__Section__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3562:1: ( rule__Section__Group__2__Impl )
+            // InternalSEW.g:3563:2: rule__Section__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group__2"
+
+
+    // $ANTLR start "rule__Section__Group__2__Impl"
+    // InternalSEW.g:3569:1: rule__Section__Group__2__Impl : ( ( rule__Section__Alternatives_2 ) ) ;
+    public final void rule__Section__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3573:1: ( ( ( rule__Section__Alternatives_2 ) ) )
+            // InternalSEW.g:3574:1: ( ( rule__Section__Alternatives_2 ) )
+            {
+            // InternalSEW.g:3574:1: ( ( rule__Section__Alternatives_2 ) )
+            // InternalSEW.g:3575:2: ( rule__Section__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getAlternatives_2()); 
+            }
+            // InternalSEW.g:3576:2: ( rule__Section__Alternatives_2 )
+            // InternalSEW.g:3576:3: rule__Section__Alternatives_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Section__Group_2_0__0"
+    // InternalSEW.g:3585:1: rule__Section__Group_2_0__0 : rule__Section__Group_2_0__0__Impl rule__Section__Group_2_0__1 ;
+    public final void rule__Section__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3589:1: ( rule__Section__Group_2_0__0__Impl rule__Section__Group_2_0__1 )
+            // InternalSEW.g:3590:2: rule__Section__Group_2_0__0__Impl rule__Section__Group_2_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_18);
+            rule__Section__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Group_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_0__0"
+
+
+    // $ANTLR start "rule__Section__Group_2_0__0__Impl"
+    // InternalSEW.g:3597:1: rule__Section__Group_2_0__0__Impl : ( '[' ) ;
+    public final void rule__Section__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3601:1: ( ( '[' ) )
+            // InternalSEW.g:3602:1: ( '[' )
+            {
+            // InternalSEW.g:3602:1: ( '[' )
+            // InternalSEW.g:3603:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getLeftSquareBracketKeyword_2_0_0()); 
+            }
+            match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getLeftSquareBracketKeyword_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__Section__Group_2_0__1"
+    // InternalSEW.g:3612:1: rule__Section__Group_2_0__1 : rule__Section__Group_2_0__1__Impl rule__Section__Group_2_0__2 ;
+    public final void rule__Section__Group_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3616:1: ( rule__Section__Group_2_0__1__Impl rule__Section__Group_2_0__2 )
+            // InternalSEW.g:3617:2: rule__Section__Group_2_0__1__Impl rule__Section__Group_2_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_18);
+            rule__Section__Group_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Group_2_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_0__1"
+
+
+    // $ANTLR start "rule__Section__Group_2_0__1__Impl"
+    // InternalSEW.g:3624:1: rule__Section__Group_2_0__1__Impl : ( ( rule__Section__ElementAssignment_2_0_1 )* ) ;
+    public final void rule__Section__Group_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3628:1: ( ( ( rule__Section__ElementAssignment_2_0_1 )* ) )
+            // InternalSEW.g:3629:1: ( ( rule__Section__ElementAssignment_2_0_1 )* )
+            {
+            // InternalSEW.g:3629:1: ( ( rule__Section__ElementAssignment_2_0_1 )* )
+            // InternalSEW.g:3630:2: ( rule__Section__ElementAssignment_2_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getElementAssignment_2_0_1()); 
+            }
+            // InternalSEW.g:3631:2: ( rule__Section__ElementAssignment_2_0_1 )*
+            loop58:
+            do {
+                int alt58=2;
+                int LA58_0 = input.LA(1);
+
+                if ( (LA58_0==RULE_XIDENDIFIER||LA58_0==14||LA58_0==18||(LA58_0>=42 && LA58_0<=47)) ) {
+                    alt58=1;
+                }
+
+
+                switch (alt58) {
+            	case 1 :
+            	    // InternalSEW.g:3631:3: rule__Section__ElementAssignment_2_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__Section__ElementAssignment_2_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop58;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getElementAssignment_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__Section__Group_2_0__2"
+    // InternalSEW.g:3639:1: rule__Section__Group_2_0__2 : rule__Section__Group_2_0__2__Impl ;
+    public final void rule__Section__Group_2_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3643:1: ( rule__Section__Group_2_0__2__Impl )
+            // InternalSEW.g:3644:2: rule__Section__Group_2_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Group_2_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_0__2"
+
+
+    // $ANTLR start "rule__Section__Group_2_0__2__Impl"
+    // InternalSEW.g:3650:1: rule__Section__Group_2_0__2__Impl : ( ']' ) ;
+    public final void rule__Section__Group_2_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3654:1: ( ( ']' ) )
+            // InternalSEW.g:3655:1: ( ']' )
+            {
+            // InternalSEW.g:3655:1: ( ']' )
+            // InternalSEW.g:3656:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getRightSquareBracketKeyword_2_0_2()); 
+            }
+            match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getRightSquareBracketKeyword_2_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_0__2__Impl"
+
+
+    // $ANTLR start "rule__Section__Group_2_1__0"
+    // InternalSEW.g:3666:1: rule__Section__Group_2_1__0 : rule__Section__Group_2_1__0__Impl rule__Section__Group_2_1__1 ;
+    public final void rule__Section__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3670:1: ( rule__Section__Group_2_1__0__Impl rule__Section__Group_2_1__1 )
+            // InternalSEW.g:3671:2: rule__Section__Group_2_1__0__Impl rule__Section__Group_2_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__Section__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_1__0"
+
+
+    // $ANTLR start "rule__Section__Group_2_1__0__Impl"
+    // InternalSEW.g:3678:1: rule__Section__Group_2_1__0__Impl : ( ':' ) ;
+    public final void rule__Section__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3682:1: ( ( ':' ) )
+            // InternalSEW.g:3683:1: ( ':' )
+            {
+            // InternalSEW.g:3683:1: ( ':' )
+            // InternalSEW.g:3684:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getColonKeyword_2_1_0()); 
+            }
+            match(input,56,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getColonKeyword_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__Section__Group_2_1__1"
+    // InternalSEW.g:3693:1: rule__Section__Group_2_1__1 : rule__Section__Group_2_1__1__Impl ;
+    public final void rule__Section__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3697:1: ( rule__Section__Group_2_1__1__Impl )
+            // InternalSEW.g:3698:2: rule__Section__Group_2_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_1__1"
+
+
+    // $ANTLR start "rule__Section__Group_2_1__1__Impl"
+    // InternalSEW.g:3704:1: rule__Section__Group_2_1__1__Impl : ( ( rule__Section__ElementAssignment_2_1_1 )* ) ;
+    public final void rule__Section__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3708:1: ( ( ( rule__Section__ElementAssignment_2_1_1 )* ) )
+            // InternalSEW.g:3709:1: ( ( rule__Section__ElementAssignment_2_1_1 )* )
+            {
+            // InternalSEW.g:3709:1: ( ( rule__Section__ElementAssignment_2_1_1 )* )
+            // InternalSEW.g:3710:2: ( rule__Section__ElementAssignment_2_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getElementAssignment_2_1_1()); 
+            }
+            // InternalSEW.g:3711:2: ( rule__Section__ElementAssignment_2_1_1 )*
+            loop59:
+            do {
+                int alt59=2;
+                alt59 = dfa59.predict(input);
+                switch (alt59) {
+            	case 1 :
+            	    // InternalSEW.g:3711:3: rule__Section__ElementAssignment_2_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__Section__ElementAssignment_2_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop59;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getElementAssignment_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__Attribute__Group__0"
+    // InternalSEW.g:3720:1: rule__Attribute__Group__0 : rule__Attribute__Group__0__Impl rule__Attribute__Group__1 ;
+    public final void rule__Attribute__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3724:1: ( rule__Attribute__Group__0__Impl rule__Attribute__Group__1 )
+            // InternalSEW.g:3725:2: rule__Attribute__Group__0__Impl rule__Attribute__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__Attribute__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Attribute__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__0"
+
+
+    // $ANTLR start "rule__Attribute__Group__0__Impl"
+    // InternalSEW.g:3732:1: rule__Attribute__Group__0__Impl : ( () ) ;
+    public final void rule__Attribute__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3736:1: ( ( () ) )
+            // InternalSEW.g:3737:1: ( () )
+            {
+            // InternalSEW.g:3737:1: ( () )
+            // InternalSEW.g:3738:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAttributeAccess().getWAttributeAction_0()); 
+            }
+            // InternalSEW.g:3739:2: ()
+            // InternalSEW.g:3739:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAttributeAccess().getWAttributeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Attribute__Group__1"
+    // InternalSEW.g:3747:1: rule__Attribute__Group__1 : rule__Attribute__Group__1__Impl rule__Attribute__Group__2 ;
+    public final void rule__Attribute__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3751:1: ( rule__Attribute__Group__1__Impl rule__Attribute__Group__2 )
+            // InternalSEW.g:3752:2: rule__Attribute__Group__1__Impl rule__Attribute__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_19);
+            rule__Attribute__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Attribute__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__1"
+
+
+    // $ANTLR start "rule__Attribute__Group__1__Impl"
+    // InternalSEW.g:3759:1: rule__Attribute__Group__1__Impl : ( ( rule__Attribute__NameAssignment_1 ) ) ;
+    public final void rule__Attribute__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3763:1: ( ( ( rule__Attribute__NameAssignment_1 ) ) )
+            // InternalSEW.g:3764:1: ( ( rule__Attribute__NameAssignment_1 ) )
+            {
+            // InternalSEW.g:3764:1: ( ( rule__Attribute__NameAssignment_1 ) )
+            // InternalSEW.g:3765:2: ( rule__Attribute__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAttributeAccess().getNameAssignment_1()); 
+            }
+            // InternalSEW.g:3766:2: ( rule__Attribute__NameAssignment_1 )
+            // InternalSEW.g:3766:3: rule__Attribute__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Attribute__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAttributeAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Attribute__Group__2"
+    // InternalSEW.g:3774:1: rule__Attribute__Group__2 : rule__Attribute__Group__2__Impl rule__Attribute__Group__3 ;
+    public final void rule__Attribute__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3778:1: ( rule__Attribute__Group__2__Impl rule__Attribute__Group__3 )
+            // InternalSEW.g:3779:2: rule__Attribute__Group__2__Impl rule__Attribute__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__Attribute__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Attribute__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__2"
+
+
+    // $ANTLR start "rule__Attribute__Group__2__Impl"
+    // InternalSEW.g:3786:1: rule__Attribute__Group__2__Impl : ( '=' ) ;
+    public final void rule__Attribute__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3790:1: ( ( '=' ) )
+            // InternalSEW.g:3791:1: ( '=' )
+            {
+            // InternalSEW.g:3791:1: ( '=' )
+            // InternalSEW.g:3792:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAttributeAccess().getEqualsSignKeyword_2()); 
+            }
+            match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAttributeAccess().getEqualsSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Attribute__Group__3"
+    // InternalSEW.g:3801:1: rule__Attribute__Group__3 : rule__Attribute__Group__3__Impl rule__Attribute__Group__4 ;
+    public final void rule__Attribute__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3805:1: ( rule__Attribute__Group__3__Impl rule__Attribute__Group__4 )
+            // InternalSEW.g:3806:2: rule__Attribute__Group__3__Impl rule__Attribute__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__Attribute__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Attribute__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__3"
+
+
+    // $ANTLR start "rule__Attribute__Group__3__Impl"
+    // InternalSEW.g:3813:1: rule__Attribute__Group__3__Impl : ( ( rule__Attribute__ValueAssignment_3 ) ) ;
+    public final void rule__Attribute__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3817:1: ( ( ( rule__Attribute__ValueAssignment_3 ) ) )
+            // InternalSEW.g:3818:1: ( ( rule__Attribute__ValueAssignment_3 ) )
+            {
+            // InternalSEW.g:3818:1: ( ( rule__Attribute__ValueAssignment_3 ) )
+            // InternalSEW.g:3819:2: ( rule__Attribute__ValueAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAttributeAccess().getValueAssignment_3()); 
+            }
+            // InternalSEW.g:3820:2: ( rule__Attribute__ValueAssignment_3 )
+            // InternalSEW.g:3820:3: rule__Attribute__ValueAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Attribute__ValueAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAttributeAccess().getValueAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Attribute__Group__4"
+    // InternalSEW.g:3828:1: rule__Attribute__Group__4 : rule__Attribute__Group__4__Impl ;
+    public final void rule__Attribute__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3832:1: ( rule__Attribute__Group__4__Impl )
+            // InternalSEW.g:3833:2: rule__Attribute__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Attribute__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__4"
+
+
+    // $ANTLR start "rule__Attribute__Group__4__Impl"
+    // InternalSEW.g:3839:1: rule__Attribute__Group__4__Impl : ( ( ';' )? ) ;
+    public final void rule__Attribute__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3843:1: ( ( ( ';' )? ) )
+            // InternalSEW.g:3844:1: ( ( ';' )? )
+            {
+            // InternalSEW.g:3844:1: ( ( ';' )? )
+            // InternalSEW.g:3845:2: ( ';' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAttributeAccess().getSemicolonKeyword_4()); 
+            }
+            // InternalSEW.g:3846:2: ( ';' )?
+            int alt60=2;
+            int LA60_0 = input.LA(1);
+
+            if ( (LA60_0==58) ) {
+                alt60=1;
+            }
+            switch (alt60) {
+                case 1 :
+                    // InternalSEW.g:3846:3: ';'
+                    {
+                    match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAttributeAccess().getSemicolonKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group__0"
+    // InternalSEW.g:3855:1: rule__ConditionalExpression__Group__0 : rule__ConditionalExpression__Group__0__Impl rule__ConditionalExpression__Group__1 ;
+    public final void rule__ConditionalExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3859:1: ( rule__ConditionalExpression__Group__0__Impl rule__ConditionalExpression__Group__1 )
+            // InternalSEW.g:3860:2: rule__ConditionalExpression__Group__0__Impl rule__ConditionalExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_22);
+            rule__ConditionalExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group__0"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group__0__Impl"
+    // InternalSEW.g:3867:1: rule__ConditionalExpression__Group__0__Impl : ( ruleconditionalOrExpression ) ;
+    public final void rule__ConditionalExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3871:1: ( ( ruleconditionalOrExpression ) )
+            // InternalSEW.g:3872:1: ( ruleconditionalOrExpression )
+            {
+            // InternalSEW.g:3872:1: ( ruleconditionalOrExpression )
+            // InternalSEW.g:3873:2: ruleconditionalOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getConditionalOrExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleconditionalOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getConditionalOrExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group__1"
+    // InternalSEW.g:3882:1: rule__ConditionalExpression__Group__1 : rule__ConditionalExpression__Group__1__Impl ;
+    public final void rule__ConditionalExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3886:1: ( rule__ConditionalExpression__Group__1__Impl )
+            // InternalSEW.g:3887:2: rule__ConditionalExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group__1"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group__1__Impl"
+    // InternalSEW.g:3893:1: rule__ConditionalExpression__Group__1__Impl : ( ( rule__ConditionalExpression__Group_1__0 )? ) ;
+    public final void rule__ConditionalExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3897:1: ( ( ( rule__ConditionalExpression__Group_1__0 )? ) )
+            // InternalSEW.g:3898:1: ( ( rule__ConditionalExpression__Group_1__0 )? )
+            {
+            // InternalSEW.g:3898:1: ( ( rule__ConditionalExpression__Group_1__0 )? )
+            // InternalSEW.g:3899:2: ( rule__ConditionalExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getGroup_1()); 
+            }
+            // InternalSEW.g:3900:2: ( rule__ConditionalExpression__Group_1__0 )?
+            int alt61=2;
+            int LA61_0 = input.LA(1);
+
+            if ( (LA61_0==72) ) {
+                alt61=1;
+            }
+            switch (alt61) {
+                case 1 :
+                    // InternalSEW.g:3900:3: rule__ConditionalExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ConditionalExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__0"
+    // InternalSEW.g:3909:1: rule__ConditionalExpression__Group_1__0 : rule__ConditionalExpression__Group_1__0__Impl rule__ConditionalExpression__Group_1__1 ;
+    public final void rule__ConditionalExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3913:1: ( rule__ConditionalExpression__Group_1__0__Impl rule__ConditionalExpression__Group_1__1 )
+            // InternalSEW.g:3914:2: rule__ConditionalExpression__Group_1__0__Impl rule__ConditionalExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_22);
+            rule__ConditionalExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__0__Impl"
+    // InternalSEW.g:3921:1: rule__ConditionalExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__ConditionalExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3925:1: ( ( () ) )
+            // InternalSEW.g:3926:1: ( () )
+            {
+            // InternalSEW.g:3926:1: ( () )
+            // InternalSEW.g:3927:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+            // InternalSEW.g:3928:2: ()
+            // InternalSEW.g:3928:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__1"
+    // InternalSEW.g:3936:1: rule__ConditionalExpression__Group_1__1 : rule__ConditionalExpression__Group_1__1__Impl rule__ConditionalExpression__Group_1__2 ;
+    public final void rule__ConditionalExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3940:1: ( rule__ConditionalExpression__Group_1__1__Impl rule__ConditionalExpression__Group_1__2 )
+            // InternalSEW.g:3941:2: rule__ConditionalExpression__Group_1__1__Impl rule__ConditionalExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ConditionalExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__1__Impl"
+    // InternalSEW.g:3948:1: rule__ConditionalExpression__Group_1__1__Impl : ( ( rule__ConditionalExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__ConditionalExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3952:1: ( ( ( rule__ConditionalExpression__OperatorAssignment_1_1 ) ) )
+            // InternalSEW.g:3953:1: ( ( rule__ConditionalExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalSEW.g:3953:1: ( ( rule__ConditionalExpression__OperatorAssignment_1_1 ) )
+            // InternalSEW.g:3954:2: ( rule__ConditionalExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalSEW.g:3955:2: ( rule__ConditionalExpression__OperatorAssignment_1_1 )
+            // InternalSEW.g:3955:3: rule__ConditionalExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__2"
+    // InternalSEW.g:3963:1: rule__ConditionalExpression__Group_1__2 : rule__ConditionalExpression__Group_1__2__Impl rule__ConditionalExpression__Group_1__3 ;
+    public final void rule__ConditionalExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3967:1: ( rule__ConditionalExpression__Group_1__2__Impl rule__ConditionalExpression__Group_1__3 )
+            // InternalSEW.g:3968:2: rule__ConditionalExpression__Group_1__2__Impl rule__ConditionalExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__ConditionalExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__2__Impl"
+    // InternalSEW.g:3975:1: rule__ConditionalExpression__Group_1__2__Impl : ( ( rule__ConditionalExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__ConditionalExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3979:1: ( ( ( rule__ConditionalExpression__OperandAssignment_1_2 ) ) )
+            // InternalSEW.g:3980:1: ( ( rule__ConditionalExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalSEW.g:3980:1: ( ( rule__ConditionalExpression__OperandAssignment_1_2 ) )
+            // InternalSEW.g:3981:2: ( rule__ConditionalExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalSEW.g:3982:2: ( rule__ConditionalExpression__OperandAssignment_1_2 )
+            // InternalSEW.g:3982:3: rule__ConditionalExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__3"
+    // InternalSEW.g:3990:1: rule__ConditionalExpression__Group_1__3 : rule__ConditionalExpression__Group_1__3__Impl rule__ConditionalExpression__Group_1__4 ;
+    public final void rule__ConditionalExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:3994:1: ( rule__ConditionalExpression__Group_1__3__Impl rule__ConditionalExpression__Group_1__4 )
+            // InternalSEW.g:3995:2: rule__ConditionalExpression__Group_1__3__Impl rule__ConditionalExpression__Group_1__4
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ConditionalExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__Group_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__3__Impl"
+    // InternalSEW.g:4002:1: rule__ConditionalExpression__Group_1__3__Impl : ( ':' ) ;
+    public final void rule__ConditionalExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4006:1: ( ( ':' ) )
+            // InternalSEW.g:4007:1: ( ':' )
+            {
+            // InternalSEW.g:4007:1: ( ':' )
+            // InternalSEW.g:4008:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getColonKeyword_1_3()); 
+            }
+            match(input,56,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getColonKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__4"
+    // InternalSEW.g:4017:1: rule__ConditionalExpression__Group_1__4 : rule__ConditionalExpression__Group_1__4__Impl ;
+    public final void rule__ConditionalExpression__Group_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4021:1: ( rule__ConditionalExpression__Group_1__4__Impl )
+            // InternalSEW.g:4022:2: rule__ConditionalExpression__Group_1__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__Group_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__4"
+
+
+    // $ANTLR start "rule__ConditionalExpression__Group_1__4__Impl"
+    // InternalSEW.g:4028:1: rule__ConditionalExpression__Group_1__4__Impl : ( ( rule__ConditionalExpression__OperandAssignment_1_4 ) ) ;
+    public final void rule__ConditionalExpression__Group_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4032:1: ( ( ( rule__ConditionalExpression__OperandAssignment_1_4 ) ) )
+            // InternalSEW.g:4033:1: ( ( rule__ConditionalExpression__OperandAssignment_1_4 ) )
+            {
+            // InternalSEW.g:4033:1: ( ( rule__ConditionalExpression__OperandAssignment_1_4 ) )
+            // InternalSEW.g:4034:2: ( rule__ConditionalExpression__OperandAssignment_1_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_4()); 
+            }
+            // InternalSEW.g:4035:2: ( rule__ConditionalExpression__OperandAssignment_1_4 )
+            // InternalSEW.g:4035:3: rule__ConditionalExpression__OperandAssignment_1_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalExpression__OperandAssignment_1_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getOperandAssignment_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__Group_1__4__Impl"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group__0"
+    // InternalSEW.g:4044:1: rule__ConditionalOrExpression__Group__0 : rule__ConditionalOrExpression__Group__0__Impl rule__ConditionalOrExpression__Group__1 ;
+    public final void rule__ConditionalOrExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4048:1: ( rule__ConditionalOrExpression__Group__0__Impl rule__ConditionalOrExpression__Group__1 )
+            // InternalSEW.g:4049:2: rule__ConditionalOrExpression__Group__0__Impl rule__ConditionalOrExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_24);
+            rule__ConditionalOrExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group__0"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group__0__Impl"
+    // InternalSEW.g:4056:1: rule__ConditionalOrExpression__Group__0__Impl : ( ruleconditionalAndExpression ) ;
+    public final void rule__ConditionalOrExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4060:1: ( ( ruleconditionalAndExpression ) )
+            // InternalSEW.g:4061:1: ( ruleconditionalAndExpression )
+            {
+            // InternalSEW.g:4061:1: ( ruleconditionalAndExpression )
+            // InternalSEW.g:4062:2: ruleconditionalAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getConditionalAndExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleconditionalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getConditionalAndExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group__1"
+    // InternalSEW.g:4071:1: rule__ConditionalOrExpression__Group__1 : rule__ConditionalOrExpression__Group__1__Impl ;
+    public final void rule__ConditionalOrExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4075:1: ( rule__ConditionalOrExpression__Group__1__Impl )
+            // InternalSEW.g:4076:2: rule__ConditionalOrExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group__1"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group__1__Impl"
+    // InternalSEW.g:4082:1: rule__ConditionalOrExpression__Group__1__Impl : ( ( rule__ConditionalOrExpression__Group_1__0 )? ) ;
+    public final void rule__ConditionalOrExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4086:1: ( ( ( rule__ConditionalOrExpression__Group_1__0 )? ) )
+            // InternalSEW.g:4087:1: ( ( rule__ConditionalOrExpression__Group_1__0 )? )
+            {
+            // InternalSEW.g:4087:1: ( ( rule__ConditionalOrExpression__Group_1__0 )? )
+            // InternalSEW.g:4088:2: ( rule__ConditionalOrExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getGroup_1()); 
+            }
+            // InternalSEW.g:4089:2: ( rule__ConditionalOrExpression__Group_1__0 )?
+            int alt62=2;
+            int LA62_0 = input.LA(1);
+
+            if ( ((LA62_0>=23 && LA62_0<=24)) ) {
+                alt62=1;
+            }
+            switch (alt62) {
+                case 1 :
+                    // InternalSEW.g:4089:3: rule__ConditionalOrExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ConditionalOrExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1__0"
+    // InternalSEW.g:4098:1: rule__ConditionalOrExpression__Group_1__0 : rule__ConditionalOrExpression__Group_1__0__Impl rule__ConditionalOrExpression__Group_1__1 ;
+    public final void rule__ConditionalOrExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4102:1: ( rule__ConditionalOrExpression__Group_1__0__Impl rule__ConditionalOrExpression__Group_1__1 )
+            // InternalSEW.g:4103:2: rule__ConditionalOrExpression__Group_1__0__Impl rule__ConditionalOrExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_24);
+            rule__ConditionalOrExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1__0__Impl"
+    // InternalSEW.g:4110:1: rule__ConditionalOrExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__ConditionalOrExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4114:1: ( ( () ) )
+            // InternalSEW.g:4115:1: ( () )
+            {
+            // InternalSEW.g:4115:1: ( () )
+            // InternalSEW.g:4116:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+            // InternalSEW.g:4117:2: ()
+            // InternalSEW.g:4117:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1__1"
+    // InternalSEW.g:4125:1: rule__ConditionalOrExpression__Group_1__1 : rule__ConditionalOrExpression__Group_1__1__Impl rule__ConditionalOrExpression__Group_1__2 ;
+    public final void rule__ConditionalOrExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4129:1: ( rule__ConditionalOrExpression__Group_1__1__Impl rule__ConditionalOrExpression__Group_1__2 )
+            // InternalSEW.g:4130:2: rule__ConditionalOrExpression__Group_1__1__Impl rule__ConditionalOrExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__ConditionalOrExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1__1__Impl"
+    // InternalSEW.g:4137:1: rule__ConditionalOrExpression__Group_1__1__Impl : ( ( rule__ConditionalOrExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__ConditionalOrExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4141:1: ( ( ( rule__ConditionalOrExpression__OperatorAssignment_1_1 ) ) )
+            // InternalSEW.g:4142:1: ( ( rule__ConditionalOrExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalSEW.g:4142:1: ( ( rule__ConditionalOrExpression__OperatorAssignment_1_1 ) )
+            // InternalSEW.g:4143:2: ( rule__ConditionalOrExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalSEW.g:4144:2: ( rule__ConditionalOrExpression__OperatorAssignment_1_1 )
+            // InternalSEW.g:4144:3: rule__ConditionalOrExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1__2"
+    // InternalSEW.g:4152:1: rule__ConditionalOrExpression__Group_1__2 : rule__ConditionalOrExpression__Group_1__2__Impl rule__ConditionalOrExpression__Group_1__3 ;
+    public final void rule__ConditionalOrExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4156:1: ( rule__ConditionalOrExpression__Group_1__2__Impl rule__ConditionalOrExpression__Group_1__3 )
+            // InternalSEW.g:4157:2: rule__ConditionalOrExpression__Group_1__2__Impl rule__ConditionalOrExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_24);
+            rule__ConditionalOrExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1__2__Impl"
+    // InternalSEW.g:4164:1: rule__ConditionalOrExpression__Group_1__2__Impl : ( ( rule__ConditionalOrExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__ConditionalOrExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4168:1: ( ( ( rule__ConditionalOrExpression__OperandAssignment_1_2 ) ) )
+            // InternalSEW.g:4169:1: ( ( rule__ConditionalOrExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalSEW.g:4169:1: ( ( rule__ConditionalOrExpression__OperandAssignment_1_2 ) )
+            // InternalSEW.g:4170:2: ( rule__ConditionalOrExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalSEW.g:4171:2: ( rule__ConditionalOrExpression__OperandAssignment_1_2 )
+            // InternalSEW.g:4171:3: rule__ConditionalOrExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1__3"
+    // InternalSEW.g:4179:1: rule__ConditionalOrExpression__Group_1__3 : rule__ConditionalOrExpression__Group_1__3__Impl ;
+    public final void rule__ConditionalOrExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4183:1: ( rule__ConditionalOrExpression__Group_1__3__Impl )
+            // InternalSEW.g:4184:2: rule__ConditionalOrExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1__3__Impl"
+    // InternalSEW.g:4190:1: rule__ConditionalOrExpression__Group_1__3__Impl : ( ( rule__ConditionalOrExpression__Group_1_3__0 )* ) ;
+    public final void rule__ConditionalOrExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4194:1: ( ( ( rule__ConditionalOrExpression__Group_1_3__0 )* ) )
+            // InternalSEW.g:4195:1: ( ( rule__ConditionalOrExpression__Group_1_3__0 )* )
+            {
+            // InternalSEW.g:4195:1: ( ( rule__ConditionalOrExpression__Group_1_3__0 )* )
+            // InternalSEW.g:4196:2: ( rule__ConditionalOrExpression__Group_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalSEW.g:4197:2: ( rule__ConditionalOrExpression__Group_1_3__0 )*
+            loop63:
+            do {
+                int alt63=2;
+                int LA63_0 = input.LA(1);
+
+                if ( ((LA63_0>=23 && LA63_0<=24)) ) {
+                    alt63=1;
+                }
+
+
+                switch (alt63) {
+            	case 1 :
+            	    // InternalSEW.g:4197:3: rule__ConditionalOrExpression__Group_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_26);
+            	    rule__ConditionalOrExpression__Group_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop63;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1_3__0"
+    // InternalSEW.g:4206:1: rule__ConditionalOrExpression__Group_1_3__0 : rule__ConditionalOrExpression__Group_1_3__0__Impl rule__ConditionalOrExpression__Group_1_3__1 ;
+    public final void rule__ConditionalOrExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4210:1: ( rule__ConditionalOrExpression__Group_1_3__0__Impl rule__ConditionalOrExpression__Group_1_3__1 )
+            // InternalSEW.g:4211:2: rule__ConditionalOrExpression__Group_1_3__0__Impl rule__ConditionalOrExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__ConditionalOrExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1_3__0__Impl"
+    // InternalSEW.g:4218:1: rule__ConditionalOrExpression__Group_1_3__0__Impl : ( ( rule__ConditionalOrExpression__Alternatives_1_3_0 ) ) ;
+    public final void rule__ConditionalOrExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4222:1: ( ( ( rule__ConditionalOrExpression__Alternatives_1_3_0 ) ) )
+            // InternalSEW.g:4223:1: ( ( rule__ConditionalOrExpression__Alternatives_1_3_0 ) )
+            {
+            // InternalSEW.g:4223:1: ( ( rule__ConditionalOrExpression__Alternatives_1_3_0 ) )
+            // InternalSEW.g:4224:2: ( rule__ConditionalOrExpression__Alternatives_1_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getAlternatives_1_3_0()); 
+            }
+            // InternalSEW.g:4225:2: ( rule__ConditionalOrExpression__Alternatives_1_3_0 )
+            // InternalSEW.g:4225:3: rule__ConditionalOrExpression__Alternatives_1_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Alternatives_1_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getAlternatives_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1_3__1"
+    // InternalSEW.g:4233:1: rule__ConditionalOrExpression__Group_1_3__1 : rule__ConditionalOrExpression__Group_1_3__1__Impl ;
+    public final void rule__ConditionalOrExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4237:1: ( rule__ConditionalOrExpression__Group_1_3__1__Impl )
+            // InternalSEW.g:4238:2: rule__ConditionalOrExpression__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__Group_1_3__1__Impl"
+    // InternalSEW.g:4244:1: rule__ConditionalOrExpression__Group_1_3__1__Impl : ( ( rule__ConditionalOrExpression__OperandAssignment_1_3_1 ) ) ;
+    public final void rule__ConditionalOrExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4248:1: ( ( ( rule__ConditionalOrExpression__OperandAssignment_1_3_1 ) ) )
+            // InternalSEW.g:4249:1: ( ( rule__ConditionalOrExpression__OperandAssignment_1_3_1 ) )
+            {
+            // InternalSEW.g:4249:1: ( ( rule__ConditionalOrExpression__OperandAssignment_1_3_1 ) )
+            // InternalSEW.g:4250:2: ( rule__ConditionalOrExpression__OperandAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+            // InternalSEW.g:4251:2: ( rule__ConditionalOrExpression__OperandAssignment_1_3_1 )
+            // InternalSEW.g:4251:3: rule__ConditionalOrExpression__OperandAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__OperandAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group__0"
+    // InternalSEW.g:4260:1: rule__ConditionalAndExpression__Group__0 : rule__ConditionalAndExpression__Group__0__Impl rule__ConditionalAndExpression__Group__1 ;
+    public final void rule__ConditionalAndExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4264:1: ( rule__ConditionalAndExpression__Group__0__Impl rule__ConditionalAndExpression__Group__1 )
+            // InternalSEW.g:4265:2: rule__ConditionalAndExpression__Group__0__Impl rule__ConditionalAndExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ConditionalAndExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group__0"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group__0__Impl"
+    // InternalSEW.g:4272:1: rule__ConditionalAndExpression__Group__0__Impl : ( ruleequalityExpression ) ;
+    public final void rule__ConditionalAndExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4276:1: ( ( ruleequalityExpression ) )
+            // InternalSEW.g:4277:1: ( ruleequalityExpression )
+            {
+            // InternalSEW.g:4277:1: ( ruleequalityExpression )
+            // InternalSEW.g:4278:2: ruleequalityExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getEqualityExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleequalityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getEqualityExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group__1"
+    // InternalSEW.g:4287:1: rule__ConditionalAndExpression__Group__1 : rule__ConditionalAndExpression__Group__1__Impl ;
+    public final void rule__ConditionalAndExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4291:1: ( rule__ConditionalAndExpression__Group__1__Impl )
+            // InternalSEW.g:4292:2: rule__ConditionalAndExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group__1"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group__1__Impl"
+    // InternalSEW.g:4298:1: rule__ConditionalAndExpression__Group__1__Impl : ( ( rule__ConditionalAndExpression__Group_1__0 )? ) ;
+    public final void rule__ConditionalAndExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4302:1: ( ( ( rule__ConditionalAndExpression__Group_1__0 )? ) )
+            // InternalSEW.g:4303:1: ( ( rule__ConditionalAndExpression__Group_1__0 )? )
+            {
+            // InternalSEW.g:4303:1: ( ( rule__ConditionalAndExpression__Group_1__0 )? )
+            // InternalSEW.g:4304:2: ( rule__ConditionalAndExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getGroup_1()); 
+            }
+            // InternalSEW.g:4305:2: ( rule__ConditionalAndExpression__Group_1__0 )?
+            int alt64=2;
+            int LA64_0 = input.LA(1);
+
+            if ( ((LA64_0>=25 && LA64_0<=26)) ) {
+                alt64=1;
+            }
+            switch (alt64) {
+                case 1 :
+                    // InternalSEW.g:4305:3: rule__ConditionalAndExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ConditionalAndExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1__0"
+    // InternalSEW.g:4314:1: rule__ConditionalAndExpression__Group_1__0 : rule__ConditionalAndExpression__Group_1__0__Impl rule__ConditionalAndExpression__Group_1__1 ;
+    public final void rule__ConditionalAndExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4318:1: ( rule__ConditionalAndExpression__Group_1__0__Impl rule__ConditionalAndExpression__Group_1__1 )
+            // InternalSEW.g:4319:2: rule__ConditionalAndExpression__Group_1__0__Impl rule__ConditionalAndExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ConditionalAndExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1__0__Impl"
+    // InternalSEW.g:4326:1: rule__ConditionalAndExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__ConditionalAndExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4330:1: ( ( () ) )
+            // InternalSEW.g:4331:1: ( () )
+            {
+            // InternalSEW.g:4331:1: ( () )
+            // InternalSEW.g:4332:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+            // InternalSEW.g:4333:2: ()
+            // InternalSEW.g:4333:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1__1"
+    // InternalSEW.g:4341:1: rule__ConditionalAndExpression__Group_1__1 : rule__ConditionalAndExpression__Group_1__1__Impl rule__ConditionalAndExpression__Group_1__2 ;
+    public final void rule__ConditionalAndExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4345:1: ( rule__ConditionalAndExpression__Group_1__1__Impl rule__ConditionalAndExpression__Group_1__2 )
+            // InternalSEW.g:4346:2: rule__ConditionalAndExpression__Group_1__1__Impl rule__ConditionalAndExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__ConditionalAndExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1__1__Impl"
+    // InternalSEW.g:4353:1: rule__ConditionalAndExpression__Group_1__1__Impl : ( ( rule__ConditionalAndExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__ConditionalAndExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4357:1: ( ( ( rule__ConditionalAndExpression__OperatorAssignment_1_1 ) ) )
+            // InternalSEW.g:4358:1: ( ( rule__ConditionalAndExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalSEW.g:4358:1: ( ( rule__ConditionalAndExpression__OperatorAssignment_1_1 ) )
+            // InternalSEW.g:4359:2: ( rule__ConditionalAndExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalSEW.g:4360:2: ( rule__ConditionalAndExpression__OperatorAssignment_1_1 )
+            // InternalSEW.g:4360:3: rule__ConditionalAndExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1__2"
+    // InternalSEW.g:4368:1: rule__ConditionalAndExpression__Group_1__2 : rule__ConditionalAndExpression__Group_1__2__Impl rule__ConditionalAndExpression__Group_1__3 ;
+    public final void rule__ConditionalAndExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4372:1: ( rule__ConditionalAndExpression__Group_1__2__Impl rule__ConditionalAndExpression__Group_1__3 )
+            // InternalSEW.g:4373:2: rule__ConditionalAndExpression__Group_1__2__Impl rule__ConditionalAndExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ConditionalAndExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1__2__Impl"
+    // InternalSEW.g:4380:1: rule__ConditionalAndExpression__Group_1__2__Impl : ( ( rule__ConditionalAndExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__ConditionalAndExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4384:1: ( ( ( rule__ConditionalAndExpression__OperandAssignment_1_2 ) ) )
+            // InternalSEW.g:4385:1: ( ( rule__ConditionalAndExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalSEW.g:4385:1: ( ( rule__ConditionalAndExpression__OperandAssignment_1_2 ) )
+            // InternalSEW.g:4386:2: ( rule__ConditionalAndExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalSEW.g:4387:2: ( rule__ConditionalAndExpression__OperandAssignment_1_2 )
+            // InternalSEW.g:4387:3: rule__ConditionalAndExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1__3"
+    // InternalSEW.g:4395:1: rule__ConditionalAndExpression__Group_1__3 : rule__ConditionalAndExpression__Group_1__3__Impl ;
+    public final void rule__ConditionalAndExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4399:1: ( rule__ConditionalAndExpression__Group_1__3__Impl )
+            // InternalSEW.g:4400:2: rule__ConditionalAndExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1__3__Impl"
+    // InternalSEW.g:4406:1: rule__ConditionalAndExpression__Group_1__3__Impl : ( ( rule__ConditionalAndExpression__Group_1_3__0 )* ) ;
+    public final void rule__ConditionalAndExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4410:1: ( ( ( rule__ConditionalAndExpression__Group_1_3__0 )* ) )
+            // InternalSEW.g:4411:1: ( ( rule__ConditionalAndExpression__Group_1_3__0 )* )
+            {
+            // InternalSEW.g:4411:1: ( ( rule__ConditionalAndExpression__Group_1_3__0 )* )
+            // InternalSEW.g:4412:2: ( rule__ConditionalAndExpression__Group_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalSEW.g:4413:2: ( rule__ConditionalAndExpression__Group_1_3__0 )*
+            loop65:
+            do {
+                int alt65=2;
+                int LA65_0 = input.LA(1);
+
+                if ( ((LA65_0>=25 && LA65_0<=26)) ) {
+                    alt65=1;
+                }
+
+
+                switch (alt65) {
+            	case 1 :
+            	    // InternalSEW.g:4413:3: rule__ConditionalAndExpression__Group_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_28);
+            	    rule__ConditionalAndExpression__Group_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop65;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1_3__0"
+    // InternalSEW.g:4422:1: rule__ConditionalAndExpression__Group_1_3__0 : rule__ConditionalAndExpression__Group_1_3__0__Impl rule__ConditionalAndExpression__Group_1_3__1 ;
+    public final void rule__ConditionalAndExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4426:1: ( rule__ConditionalAndExpression__Group_1_3__0__Impl rule__ConditionalAndExpression__Group_1_3__1 )
+            // InternalSEW.g:4427:2: rule__ConditionalAndExpression__Group_1_3__0__Impl rule__ConditionalAndExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__ConditionalAndExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1_3__0__Impl"
+    // InternalSEW.g:4434:1: rule__ConditionalAndExpression__Group_1_3__0__Impl : ( ( rule__ConditionalAndExpression__Alternatives_1_3_0 ) ) ;
+    public final void rule__ConditionalAndExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4438:1: ( ( ( rule__ConditionalAndExpression__Alternatives_1_3_0 ) ) )
+            // InternalSEW.g:4439:1: ( ( rule__ConditionalAndExpression__Alternatives_1_3_0 ) )
+            {
+            // InternalSEW.g:4439:1: ( ( rule__ConditionalAndExpression__Alternatives_1_3_0 ) )
+            // InternalSEW.g:4440:2: ( rule__ConditionalAndExpression__Alternatives_1_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getAlternatives_1_3_0()); 
+            }
+            // InternalSEW.g:4441:2: ( rule__ConditionalAndExpression__Alternatives_1_3_0 )
+            // InternalSEW.g:4441:3: rule__ConditionalAndExpression__Alternatives_1_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Alternatives_1_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getAlternatives_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1_3__1"
+    // InternalSEW.g:4449:1: rule__ConditionalAndExpression__Group_1_3__1 : rule__ConditionalAndExpression__Group_1_3__1__Impl ;
+    public final void rule__ConditionalAndExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4453:1: ( rule__ConditionalAndExpression__Group_1_3__1__Impl )
+            // InternalSEW.g:4454:2: rule__ConditionalAndExpression__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__Group_1_3__1__Impl"
+    // InternalSEW.g:4460:1: rule__ConditionalAndExpression__Group_1_3__1__Impl : ( ( rule__ConditionalAndExpression__OperandAssignment_1_3_1 ) ) ;
+    public final void rule__ConditionalAndExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4464:1: ( ( ( rule__ConditionalAndExpression__OperandAssignment_1_3_1 ) ) )
+            // InternalSEW.g:4465:1: ( ( rule__ConditionalAndExpression__OperandAssignment_1_3_1 ) )
+            {
+            // InternalSEW.g:4465:1: ( ( rule__ConditionalAndExpression__OperandAssignment_1_3_1 ) )
+            // InternalSEW.g:4466:2: ( rule__ConditionalAndExpression__OperandAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+            // InternalSEW.g:4467:2: ( rule__ConditionalAndExpression__OperandAssignment_1_3_1 )
+            // InternalSEW.g:4467:3: rule__ConditionalAndExpression__OperandAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__OperandAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group__0"
+    // InternalSEW.g:4476:1: rule__EqualityExpression__Group__0 : rule__EqualityExpression__Group__0__Impl rule__EqualityExpression__Group__1 ;
+    public final void rule__EqualityExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4480:1: ( rule__EqualityExpression__Group__0__Impl rule__EqualityExpression__Group__1 )
+            // InternalSEW.g:4481:2: rule__EqualityExpression__Group__0__Impl rule__EqualityExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__EqualityExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group__0"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group__0__Impl"
+    // InternalSEW.g:4488:1: rule__EqualityExpression__Group__0__Impl : ( rulerelationalExpression ) ;
+    public final void rule__EqualityExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4492:1: ( ( rulerelationalExpression ) )
+            // InternalSEW.g:4493:1: ( rulerelationalExpression )
+            {
+            // InternalSEW.g:4493:1: ( rulerelationalExpression )
+            // InternalSEW.g:4494:2: rulerelationalExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulerelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group__1"
+    // InternalSEW.g:4503:1: rule__EqualityExpression__Group__1 : rule__EqualityExpression__Group__1__Impl ;
+    public final void rule__EqualityExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4507:1: ( rule__EqualityExpression__Group__1__Impl )
+            // InternalSEW.g:4508:2: rule__EqualityExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group__1"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group__1__Impl"
+    // InternalSEW.g:4514:1: rule__EqualityExpression__Group__1__Impl : ( ( rule__EqualityExpression__Group_1__0 )? ) ;
+    public final void rule__EqualityExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4518:1: ( ( ( rule__EqualityExpression__Group_1__0 )? ) )
+            // InternalSEW.g:4519:1: ( ( rule__EqualityExpression__Group_1__0 )? )
+            {
+            // InternalSEW.g:4519:1: ( ( rule__EqualityExpression__Group_1__0 )? )
+            // InternalSEW.g:4520:2: ( rule__EqualityExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getGroup_1()); 
+            }
+            // InternalSEW.g:4521:2: ( rule__EqualityExpression__Group_1__0 )?
+            int alt66=2;
+            int LA66_0 = input.LA(1);
+
+            if ( ((LA66_0>=27 && LA66_0<=31)) ) {
+                alt66=1;
+            }
+            switch (alt66) {
+                case 1 :
+                    // InternalSEW.g:4521:3: rule__EqualityExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__EqualityExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__0"
+    // InternalSEW.g:4530:1: rule__EqualityExpression__Group_1__0 : rule__EqualityExpression__Group_1__0__Impl rule__EqualityExpression__Group_1__1 ;
+    public final void rule__EqualityExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4534:1: ( rule__EqualityExpression__Group_1__0__Impl rule__EqualityExpression__Group_1__1 )
+            // InternalSEW.g:4535:2: rule__EqualityExpression__Group_1__0__Impl rule__EqualityExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__EqualityExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__0__Impl"
+    // InternalSEW.g:4542:1: rule__EqualityExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__EqualityExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4546:1: ( ( () ) )
+            // InternalSEW.g:4547:1: ( () )
+            {
+            // InternalSEW.g:4547:1: ( () )
+            // InternalSEW.g:4548:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+            // InternalSEW.g:4549:2: ()
+            // InternalSEW.g:4549:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__1"
+    // InternalSEW.g:4557:1: rule__EqualityExpression__Group_1__1 : rule__EqualityExpression__Group_1__1__Impl rule__EqualityExpression__Group_1__2 ;
+    public final void rule__EqualityExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4561:1: ( rule__EqualityExpression__Group_1__1__Impl rule__EqualityExpression__Group_1__2 )
+            // InternalSEW.g:4562:2: rule__EqualityExpression__Group_1__1__Impl rule__EqualityExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__EqualityExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__1__Impl"
+    // InternalSEW.g:4569:1: rule__EqualityExpression__Group_1__1__Impl : ( ( rule__EqualityExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__EqualityExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4573:1: ( ( ( rule__EqualityExpression__OperatorAssignment_1_1 ) ) )
+            // InternalSEW.g:4574:1: ( ( rule__EqualityExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalSEW.g:4574:1: ( ( rule__EqualityExpression__OperatorAssignment_1_1 ) )
+            // InternalSEW.g:4575:2: ( rule__EqualityExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalSEW.g:4576:2: ( rule__EqualityExpression__OperatorAssignment_1_1 )
+            // InternalSEW.g:4576:3: rule__EqualityExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__2"
+    // InternalSEW.g:4584:1: rule__EqualityExpression__Group_1__2 : rule__EqualityExpression__Group_1__2__Impl ;
+    public final void rule__EqualityExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4588:1: ( rule__EqualityExpression__Group_1__2__Impl )
+            // InternalSEW.g:4589:2: rule__EqualityExpression__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__2__Impl"
+    // InternalSEW.g:4595:1: rule__EqualityExpression__Group_1__2__Impl : ( ( rule__EqualityExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__EqualityExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4599:1: ( ( ( rule__EqualityExpression__OperandAssignment_1_2 ) ) )
+            // InternalSEW.g:4600:1: ( ( rule__EqualityExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalSEW.g:4600:1: ( ( rule__EqualityExpression__OperandAssignment_1_2 ) )
+            // InternalSEW.g:4601:2: ( rule__EqualityExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalSEW.g:4602:2: ( rule__EqualityExpression__OperandAssignment_1_2 )
+            // InternalSEW.g:4602:3: rule__EqualityExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group__0"
+    // InternalSEW.g:4611:1: rule__RelationalExpression__Group__0 : rule__RelationalExpression__Group__0__Impl rule__RelationalExpression__Group__1 ;
+    public final void rule__RelationalExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4615:1: ( rule__RelationalExpression__Group__0__Impl rule__RelationalExpression__Group__1 )
+            // InternalSEW.g:4616:2: rule__RelationalExpression__Group__0__Impl rule__RelationalExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__RelationalExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group__0"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group__0__Impl"
+    // InternalSEW.g:4623:1: rule__RelationalExpression__Group__0__Impl : ( ruleadditiveExpression ) ;
+    public final void rule__RelationalExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4627:1: ( ( ruleadditiveExpression ) )
+            // InternalSEW.g:4628:1: ( ruleadditiveExpression )
+            {
+            // InternalSEW.g:4628:1: ( ruleadditiveExpression )
+            // InternalSEW.g:4629:2: ruleadditiveExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleadditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group__1"
+    // InternalSEW.g:4638:1: rule__RelationalExpression__Group__1 : rule__RelationalExpression__Group__1__Impl ;
+    public final void rule__RelationalExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4642:1: ( rule__RelationalExpression__Group__1__Impl )
+            // InternalSEW.g:4643:2: rule__RelationalExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group__1"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group__1__Impl"
+    // InternalSEW.g:4649:1: rule__RelationalExpression__Group__1__Impl : ( ( rule__RelationalExpression__Group_1__0 )? ) ;
+    public final void rule__RelationalExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4653:1: ( ( ( rule__RelationalExpression__Group_1__0 )? ) )
+            // InternalSEW.g:4654:1: ( ( rule__RelationalExpression__Group_1__0 )? )
+            {
+            // InternalSEW.g:4654:1: ( ( rule__RelationalExpression__Group_1__0 )? )
+            // InternalSEW.g:4655:2: ( rule__RelationalExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getGroup_1()); 
+            }
+            // InternalSEW.g:4656:2: ( rule__RelationalExpression__Group_1__0 )?
+            int alt67=2;
+            int LA67_0 = input.LA(1);
+
+            if ( ((LA67_0>=32 && LA67_0<=35)) ) {
+                alt67=1;
+            }
+            switch (alt67) {
+                case 1 :
+                    // InternalSEW.g:4656:3: rule__RelationalExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__RelationalExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__0"
+    // InternalSEW.g:4665:1: rule__RelationalExpression__Group_1__0 : rule__RelationalExpression__Group_1__0__Impl rule__RelationalExpression__Group_1__1 ;
+    public final void rule__RelationalExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4669:1: ( rule__RelationalExpression__Group_1__0__Impl rule__RelationalExpression__Group_1__1 )
+            // InternalSEW.g:4670:2: rule__RelationalExpression__Group_1__0__Impl rule__RelationalExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__RelationalExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__0__Impl"
+    // InternalSEW.g:4677:1: rule__RelationalExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__RelationalExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4681:1: ( ( () ) )
+            // InternalSEW.g:4682:1: ( () )
+            {
+            // InternalSEW.g:4682:1: ( () )
+            // InternalSEW.g:4683:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+            // InternalSEW.g:4684:2: ()
+            // InternalSEW.g:4684:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__1"
+    // InternalSEW.g:4692:1: rule__RelationalExpression__Group_1__1 : rule__RelationalExpression__Group_1__1__Impl rule__RelationalExpression__Group_1__2 ;
+    public final void rule__RelationalExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4696:1: ( rule__RelationalExpression__Group_1__1__Impl rule__RelationalExpression__Group_1__2 )
+            // InternalSEW.g:4697:2: rule__RelationalExpression__Group_1__1__Impl rule__RelationalExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__RelationalExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__1__Impl"
+    // InternalSEW.g:4704:1: rule__RelationalExpression__Group_1__1__Impl : ( ( rule__RelationalExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__RelationalExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4708:1: ( ( ( rule__RelationalExpression__OperatorAssignment_1_1 ) ) )
+            // InternalSEW.g:4709:1: ( ( rule__RelationalExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalSEW.g:4709:1: ( ( rule__RelationalExpression__OperatorAssignment_1_1 ) )
+            // InternalSEW.g:4710:2: ( rule__RelationalExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalSEW.g:4711:2: ( rule__RelationalExpression__OperatorAssignment_1_1 )
+            // InternalSEW.g:4711:3: rule__RelationalExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__2"
+    // InternalSEW.g:4719:1: rule__RelationalExpression__Group_1__2 : rule__RelationalExpression__Group_1__2__Impl ;
+    public final void rule__RelationalExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4723:1: ( rule__RelationalExpression__Group_1__2__Impl )
+            // InternalSEW.g:4724:2: rule__RelationalExpression__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__2__Impl"
+    // InternalSEW.g:4730:1: rule__RelationalExpression__Group_1__2__Impl : ( ( rule__RelationalExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__RelationalExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4734:1: ( ( ( rule__RelationalExpression__OperandAssignment_1_2 ) ) )
+            // InternalSEW.g:4735:1: ( ( rule__RelationalExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalSEW.g:4735:1: ( ( rule__RelationalExpression__OperandAssignment_1_2 ) )
+            // InternalSEW.g:4736:2: ( rule__RelationalExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalSEW.g:4737:2: ( rule__RelationalExpression__OperandAssignment_1_2 )
+            // InternalSEW.g:4737:3: rule__RelationalExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group__0"
+    // InternalSEW.g:4746:1: rule__AdditiveExpression__Group__0 : rule__AdditiveExpression__Group__0__Impl rule__AdditiveExpression__Group__1 ;
+    public final void rule__AdditiveExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4750:1: ( rule__AdditiveExpression__Group__0__Impl rule__AdditiveExpression__Group__1 )
+            // InternalSEW.g:4751:2: rule__AdditiveExpression__Group__0__Impl rule__AdditiveExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_31);
+            rule__AdditiveExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group__0"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group__0__Impl"
+    // InternalSEW.g:4758:1: rule__AdditiveExpression__Group__0__Impl : ( rulemultiplicativeExpression ) ;
+    public final void rule__AdditiveExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4762:1: ( ( rulemultiplicativeExpression ) )
+            // InternalSEW.g:4763:1: ( rulemultiplicativeExpression )
+            {
+            // InternalSEW.g:4763:1: ( rulemultiplicativeExpression )
+            // InternalSEW.g:4764:2: rulemultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group__1"
+    // InternalSEW.g:4773:1: rule__AdditiveExpression__Group__1 : rule__AdditiveExpression__Group__1__Impl ;
+    public final void rule__AdditiveExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4777:1: ( rule__AdditiveExpression__Group__1__Impl )
+            // InternalSEW.g:4778:2: rule__AdditiveExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group__1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group__1__Impl"
+    // InternalSEW.g:4784:1: rule__AdditiveExpression__Group__1__Impl : ( ( rule__AdditiveExpression__Group_1__0 )? ) ;
+    public final void rule__AdditiveExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4788:1: ( ( ( rule__AdditiveExpression__Group_1__0 )? ) )
+            // InternalSEW.g:4789:1: ( ( rule__AdditiveExpression__Group_1__0 )? )
+            {
+            // InternalSEW.g:4789:1: ( ( rule__AdditiveExpression__Group_1__0 )? )
+            // InternalSEW.g:4790:2: ( rule__AdditiveExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getGroup_1()); 
+            }
+            // InternalSEW.g:4791:2: ( rule__AdditiveExpression__Group_1__0 )?
+            int alt68=2;
+            alt68 = dfa68.predict(input);
+            switch (alt68) {
+                case 1 :
+                    // InternalSEW.g:4791:3: rule__AdditiveExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__AdditiveExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1__0"
+    // InternalSEW.g:4800:1: rule__AdditiveExpression__Group_1__0 : rule__AdditiveExpression__Group_1__0__Impl rule__AdditiveExpression__Group_1__1 ;
+    public final void rule__AdditiveExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4804:1: ( rule__AdditiveExpression__Group_1__0__Impl rule__AdditiveExpression__Group_1__1 )
+            // InternalSEW.g:4805:2: rule__AdditiveExpression__Group_1__0__Impl rule__AdditiveExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_31);
+            rule__AdditiveExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1__0__Impl"
+    // InternalSEW.g:4812:1: rule__AdditiveExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__AdditiveExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4816:1: ( ( () ) )
+            // InternalSEW.g:4817:1: ( () )
+            {
+            // InternalSEW.g:4817:1: ( () )
+            // InternalSEW.g:4818:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+            // InternalSEW.g:4819:2: ()
+            // InternalSEW.g:4819:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1__1"
+    // InternalSEW.g:4827:1: rule__AdditiveExpression__Group_1__1 : rule__AdditiveExpression__Group_1__1__Impl rule__AdditiveExpression__Group_1__2 ;
+    public final void rule__AdditiveExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4831:1: ( rule__AdditiveExpression__Group_1__1__Impl rule__AdditiveExpression__Group_1__2 )
+            // InternalSEW.g:4832:2: rule__AdditiveExpression__Group_1__1__Impl rule__AdditiveExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__AdditiveExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1__1__Impl"
+    // InternalSEW.g:4839:1: rule__AdditiveExpression__Group_1__1__Impl : ( ( rule__AdditiveExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__AdditiveExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4843:1: ( ( ( rule__AdditiveExpression__OperatorAssignment_1_1 ) ) )
+            // InternalSEW.g:4844:1: ( ( rule__AdditiveExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalSEW.g:4844:1: ( ( rule__AdditiveExpression__OperatorAssignment_1_1 ) )
+            // InternalSEW.g:4845:2: ( rule__AdditiveExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalSEW.g:4846:2: ( rule__AdditiveExpression__OperatorAssignment_1_1 )
+            // InternalSEW.g:4846:3: rule__AdditiveExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1__2"
+    // InternalSEW.g:4854:1: rule__AdditiveExpression__Group_1__2 : rule__AdditiveExpression__Group_1__2__Impl rule__AdditiveExpression__Group_1__3 ;
+    public final void rule__AdditiveExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4858:1: ( rule__AdditiveExpression__Group_1__2__Impl rule__AdditiveExpression__Group_1__3 )
+            // InternalSEW.g:4859:2: rule__AdditiveExpression__Group_1__2__Impl rule__AdditiveExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_31);
+            rule__AdditiveExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1__2__Impl"
+    // InternalSEW.g:4866:1: rule__AdditiveExpression__Group_1__2__Impl : ( ( rule__AdditiveExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__AdditiveExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4870:1: ( ( ( rule__AdditiveExpression__OperandAssignment_1_2 ) ) )
+            // InternalSEW.g:4871:1: ( ( rule__AdditiveExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalSEW.g:4871:1: ( ( rule__AdditiveExpression__OperandAssignment_1_2 ) )
+            // InternalSEW.g:4872:2: ( rule__AdditiveExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalSEW.g:4873:2: ( rule__AdditiveExpression__OperandAssignment_1_2 )
+            // InternalSEW.g:4873:3: rule__AdditiveExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1__3"
+    // InternalSEW.g:4881:1: rule__AdditiveExpression__Group_1__3 : rule__AdditiveExpression__Group_1__3__Impl ;
+    public final void rule__AdditiveExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4885:1: ( rule__AdditiveExpression__Group_1__3__Impl )
+            // InternalSEW.g:4886:2: rule__AdditiveExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1__3__Impl"
+    // InternalSEW.g:4892:1: rule__AdditiveExpression__Group_1__3__Impl : ( ( rule__AdditiveExpression__Group_1_3__0 )* ) ;
+    public final void rule__AdditiveExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4896:1: ( ( ( rule__AdditiveExpression__Group_1_3__0 )* ) )
+            // InternalSEW.g:4897:1: ( ( rule__AdditiveExpression__Group_1_3__0 )* )
+            {
+            // InternalSEW.g:4897:1: ( ( rule__AdditiveExpression__Group_1_3__0 )* )
+            // InternalSEW.g:4898:2: ( rule__AdditiveExpression__Group_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalSEW.g:4899:2: ( rule__AdditiveExpression__Group_1_3__0 )*
+            loop69:
+            do {
+                int alt69=2;
+                alt69 = dfa69.predict(input);
+                switch (alt69) {
+            	case 1 :
+            	    // InternalSEW.g:4899:3: rule__AdditiveExpression__Group_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_32);
+            	    rule__AdditiveExpression__Group_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop69;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_3__0"
+    // InternalSEW.g:4908:1: rule__AdditiveExpression__Group_1_3__0 : rule__AdditiveExpression__Group_1_3__0__Impl rule__AdditiveExpression__Group_1_3__1 ;
+    public final void rule__AdditiveExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4912:1: ( rule__AdditiveExpression__Group_1_3__0__Impl rule__AdditiveExpression__Group_1_3__1 )
+            // InternalSEW.g:4913:2: rule__AdditiveExpression__Group_1_3__0__Impl rule__AdditiveExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__AdditiveExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_3__0__Impl"
+    // InternalSEW.g:4920:1: rule__AdditiveExpression__Group_1_3__0__Impl : ( '+' ) ;
+    public final void rule__AdditiveExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4924:1: ( ( '+' ) )
+            // InternalSEW.g:4925:1: ( '+' )
+            {
+            // InternalSEW.g:4925:1: ( '+' )
+            // InternalSEW.g:4926:2: '+'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_3_0()); 
+            }
+            match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_3__1"
+    // InternalSEW.g:4935:1: rule__AdditiveExpression__Group_1_3__1 : rule__AdditiveExpression__Group_1_3__1__Impl ;
+    public final void rule__AdditiveExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4939:1: ( rule__AdditiveExpression__Group_1_3__1__Impl )
+            // InternalSEW.g:4940:2: rule__AdditiveExpression__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_3__1__Impl"
+    // InternalSEW.g:4946:1: rule__AdditiveExpression__Group_1_3__1__Impl : ( ( rule__AdditiveExpression__OperandAssignment_1_3_1 ) ) ;
+    public final void rule__AdditiveExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4950:1: ( ( ( rule__AdditiveExpression__OperandAssignment_1_3_1 ) ) )
+            // InternalSEW.g:4951:1: ( ( rule__AdditiveExpression__OperandAssignment_1_3_1 ) )
+            {
+            // InternalSEW.g:4951:1: ( ( rule__AdditiveExpression__OperandAssignment_1_3_1 ) )
+            // InternalSEW.g:4952:2: ( rule__AdditiveExpression__OperandAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+            // InternalSEW.g:4953:2: ( rule__AdditiveExpression__OperandAssignment_1_3_1 )
+            // InternalSEW.g:4953:3: rule__AdditiveExpression__OperandAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__OperandAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group__0"
+    // InternalSEW.g:4962:1: rule__MultiplicativeExpression__Group__0 : rule__MultiplicativeExpression__Group__0__Impl rule__MultiplicativeExpression__Group__1 ;
+    public final void rule__MultiplicativeExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4966:1: ( rule__MultiplicativeExpression__Group__0__Impl rule__MultiplicativeExpression__Group__1 )
+            // InternalSEW.g:4967:2: rule__MultiplicativeExpression__Group__0__Impl rule__MultiplicativeExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__MultiplicativeExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group__0__Impl"
+    // InternalSEW.g:4974:1: rule__MultiplicativeExpression__Group__0__Impl : ( ruleprimaryExpression ) ;
+    public final void rule__MultiplicativeExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4978:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:4979:1: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:4979:1: ( ruleprimaryExpression )
+            // InternalSEW.g:4980:2: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getPrimaryExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getPrimaryExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group__1"
+    // InternalSEW.g:4989:1: rule__MultiplicativeExpression__Group__1 : rule__MultiplicativeExpression__Group__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:4993:1: ( rule__MultiplicativeExpression__Group__1__Impl )
+            // InternalSEW.g:4994:2: rule__MultiplicativeExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group__1__Impl"
+    // InternalSEW.g:5000:1: rule__MultiplicativeExpression__Group__1__Impl : ( ( rule__MultiplicativeExpression__Alternatives_1 )? ) ;
+    public final void rule__MultiplicativeExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5004:1: ( ( ( rule__MultiplicativeExpression__Alternatives_1 )? ) )
+            // InternalSEW.g:5005:1: ( ( rule__MultiplicativeExpression__Alternatives_1 )? )
+            {
+            // InternalSEW.g:5005:1: ( ( rule__MultiplicativeExpression__Alternatives_1 )? )
+            // InternalSEW.g:5006:2: ( rule__MultiplicativeExpression__Alternatives_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1()); 
+            }
+            // InternalSEW.g:5007:2: ( rule__MultiplicativeExpression__Alternatives_1 )?
+            int alt70=2;
+            int LA70_0 = input.LA(1);
+
+            if ( ((LA70_0>=60 && LA70_0<=63)) ) {
+                alt70=1;
+            }
+            switch (alt70) {
+                case 1 :
+                    // InternalSEW.g:5007:3: rule__MultiplicativeExpression__Alternatives_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MultiplicativeExpression__Alternatives_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__0"
+    // InternalSEW.g:5016:1: rule__MultiplicativeExpression__Group_1_0__0 : rule__MultiplicativeExpression__Group_1_0__0__Impl rule__MultiplicativeExpression__Group_1_0__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5020:1: ( rule__MultiplicativeExpression__Group_1_0__0__Impl rule__MultiplicativeExpression__Group_1_0__1 )
+            // InternalSEW.g:5021:2: rule__MultiplicativeExpression__Group_1_0__0__Impl rule__MultiplicativeExpression__Group_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_34);
+            rule__MultiplicativeExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__0__Impl"
+    // InternalSEW.g:5028:1: rule__MultiplicativeExpression__Group_1_0__0__Impl : ( () ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5032:1: ( ( () ) )
+            // InternalSEW.g:5033:1: ( () )
+            {
+            // InternalSEW.g:5033:1: ( () )
+            // InternalSEW.g:5034:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_0_0()); 
+            }
+            // InternalSEW.g:5035:2: ()
+            // InternalSEW.g:5035:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__1"
+    // InternalSEW.g:5043:1: rule__MultiplicativeExpression__Group_1_0__1 : rule__MultiplicativeExpression__Group_1_0__1__Impl rule__MultiplicativeExpression__Group_1_0__2 ;
+    public final void rule__MultiplicativeExpression__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5047:1: ( rule__MultiplicativeExpression__Group_1_0__1__Impl rule__MultiplicativeExpression__Group_1_0__2 )
+            // InternalSEW.g:5048:2: rule__MultiplicativeExpression__Group_1_0__1__Impl rule__MultiplicativeExpression__Group_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__MultiplicativeExpression__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__1__Impl"
+    // InternalSEW.g:5055:1: rule__MultiplicativeExpression__Group_1_0__1__Impl : ( ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5059:1: ( ( ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 ) ) )
+            // InternalSEW.g:5060:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 ) )
+            {
+            // InternalSEW.g:5060:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 ) )
+            // InternalSEW.g:5061:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1()); 
+            }
+            // InternalSEW.g:5062:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 )
+            // InternalSEW.g:5062:3: rule__MultiplicativeExpression__OperatorAssignment_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperatorAssignment_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__2"
+    // InternalSEW.g:5070:1: rule__MultiplicativeExpression__Group_1_0__2 : rule__MultiplicativeExpression__Group_1_0__2__Impl rule__MultiplicativeExpression__Group_1_0__3 ;
+    public final void rule__MultiplicativeExpression__Group_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5074:1: ( rule__MultiplicativeExpression__Group_1_0__2__Impl rule__MultiplicativeExpression__Group_1_0__3 )
+            // InternalSEW.g:5075:2: rule__MultiplicativeExpression__Group_1_0__2__Impl rule__MultiplicativeExpression__Group_1_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_34);
+            rule__MultiplicativeExpression__Group_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__2__Impl"
+    // InternalSEW.g:5082:1: rule__MultiplicativeExpression__Group_1_0__2__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5086:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 ) ) )
+            // InternalSEW.g:5087:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 ) )
+            {
+            // InternalSEW.g:5087:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 ) )
+            // InternalSEW.g:5088:2: ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2()); 
+            }
+            // InternalSEW.g:5089:2: ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 )
+            // InternalSEW.g:5089:3: rule__MultiplicativeExpression__OperandAssignment_1_0_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__3"
+    // InternalSEW.g:5097:1: rule__MultiplicativeExpression__Group_1_0__3 : rule__MultiplicativeExpression__Group_1_0__3__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5101:1: ( rule__MultiplicativeExpression__Group_1_0__3__Impl )
+            // InternalSEW.g:5102:2: rule__MultiplicativeExpression__Group_1_0__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__3"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__3__Impl"
+    // InternalSEW.g:5108:1: rule__MultiplicativeExpression__Group_1_0__3__Impl : ( ( rule__MultiplicativeExpression__Group_1_0_3__0 )* ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5112:1: ( ( ( rule__MultiplicativeExpression__Group_1_0_3__0 )* ) )
+            // InternalSEW.g:5113:1: ( ( rule__MultiplicativeExpression__Group_1_0_3__0 )* )
+            {
+            // InternalSEW.g:5113:1: ( ( rule__MultiplicativeExpression__Group_1_0_3__0 )* )
+            // InternalSEW.g:5114:2: ( rule__MultiplicativeExpression__Group_1_0_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3()); 
+            }
+            // InternalSEW.g:5115:2: ( rule__MultiplicativeExpression__Group_1_0_3__0 )*
+            loop71:
+            do {
+                int alt71=2;
+                int LA71_0 = input.LA(1);
+
+                if ( (LA71_0==60) ) {
+                    alt71=1;
+                }
+
+
+                switch (alt71) {
+            	case 1 :
+            	    // InternalSEW.g:5115:3: rule__MultiplicativeExpression__Group_1_0_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_35);
+            	    rule__MultiplicativeExpression__Group_1_0_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop71;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__3__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0_3__0"
+    // InternalSEW.g:5124:1: rule__MultiplicativeExpression__Group_1_0_3__0 : rule__MultiplicativeExpression__Group_1_0_3__0__Impl rule__MultiplicativeExpression__Group_1_0_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_0_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5128:1: ( rule__MultiplicativeExpression__Group_1_0_3__0__Impl rule__MultiplicativeExpression__Group_1_0_3__1 )
+            // InternalSEW.g:5129:2: rule__MultiplicativeExpression__Group_1_0_3__0__Impl rule__MultiplicativeExpression__Group_1_0_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__MultiplicativeExpression__Group_1_0_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0_3__0__Impl"
+    // InternalSEW.g:5136:1: rule__MultiplicativeExpression__Group_1_0_3__0__Impl : ( '*' ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5140:1: ( ( '*' ) )
+            // InternalSEW.g:5141:1: ( '*' )
+            {
+            // InternalSEW.g:5141:1: ( '*' )
+            // InternalSEW.g:5142:2: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0()); 
+            }
+            match(input,60,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0_3__1"
+    // InternalSEW.g:5151:1: rule__MultiplicativeExpression__Group_1_0_3__1 : rule__MultiplicativeExpression__Group_1_0_3__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_0_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5155:1: ( rule__MultiplicativeExpression__Group_1_0_3__1__Impl )
+            // InternalSEW.g:5156:2: rule__MultiplicativeExpression__Group_1_0_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0_3__1__Impl"
+    // InternalSEW.g:5162:1: rule__MultiplicativeExpression__Group_1_0_3__1__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5166:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 ) ) )
+            // InternalSEW.g:5167:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 ) )
+            {
+            // InternalSEW.g:5167:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 ) )
+            // InternalSEW.g:5168:2: ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1()); 
+            }
+            // InternalSEW.g:5169:2: ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 )
+            // InternalSEW.g:5169:3: rule__MultiplicativeExpression__OperandAssignment_1_0_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_0_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__0"
+    // InternalSEW.g:5178:1: rule__MultiplicativeExpression__Group_1_1__0 : rule__MultiplicativeExpression__Group_1_1__0__Impl rule__MultiplicativeExpression__Group_1_1__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5182:1: ( rule__MultiplicativeExpression__Group_1_1__0__Impl rule__MultiplicativeExpression__Group_1_1__1 )
+            // InternalSEW.g:5183:2: rule__MultiplicativeExpression__Group_1_1__0__Impl rule__MultiplicativeExpression__Group_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__MultiplicativeExpression__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__0__Impl"
+    // InternalSEW.g:5190:1: rule__MultiplicativeExpression__Group_1_1__0__Impl : ( () ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5194:1: ( ( () ) )
+            // InternalSEW.g:5195:1: ( () )
+            {
+            // InternalSEW.g:5195:1: ( () )
+            // InternalSEW.g:5196:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_1_0()); 
+            }
+            // InternalSEW.g:5197:2: ()
+            // InternalSEW.g:5197:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__1"
+    // InternalSEW.g:5205:1: rule__MultiplicativeExpression__Group_1_1__1 : rule__MultiplicativeExpression__Group_1_1__1__Impl rule__MultiplicativeExpression__Group_1_1__2 ;
+    public final void rule__MultiplicativeExpression__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5209:1: ( rule__MultiplicativeExpression__Group_1_1__1__Impl rule__MultiplicativeExpression__Group_1_1__2 )
+            // InternalSEW.g:5210:2: rule__MultiplicativeExpression__Group_1_1__1__Impl rule__MultiplicativeExpression__Group_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__MultiplicativeExpression__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__1__Impl"
+    // InternalSEW.g:5217:1: rule__MultiplicativeExpression__Group_1_1__1__Impl : ( ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5221:1: ( ( ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 ) ) )
+            // InternalSEW.g:5222:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 ) )
+            {
+            // InternalSEW.g:5222:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 ) )
+            // InternalSEW.g:5223:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1()); 
+            }
+            // InternalSEW.g:5224:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 )
+            // InternalSEW.g:5224:3: rule__MultiplicativeExpression__OperatorAssignment_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperatorAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__2"
+    // InternalSEW.g:5232:1: rule__MultiplicativeExpression__Group_1_1__2 : rule__MultiplicativeExpression__Group_1_1__2__Impl rule__MultiplicativeExpression__Group_1_1__3 ;
+    public final void rule__MultiplicativeExpression__Group_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5236:1: ( rule__MultiplicativeExpression__Group_1_1__2__Impl rule__MultiplicativeExpression__Group_1_1__3 )
+            // InternalSEW.g:5237:2: rule__MultiplicativeExpression__Group_1_1__2__Impl rule__MultiplicativeExpression__Group_1_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__MultiplicativeExpression__Group_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__2__Impl"
+    // InternalSEW.g:5244:1: rule__MultiplicativeExpression__Group_1_1__2__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5248:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 ) ) )
+            // InternalSEW.g:5249:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 ) )
+            {
+            // InternalSEW.g:5249:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 ) )
+            // InternalSEW.g:5250:2: ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2()); 
+            }
+            // InternalSEW.g:5251:2: ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 )
+            // InternalSEW.g:5251:3: rule__MultiplicativeExpression__OperandAssignment_1_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__3"
+    // InternalSEW.g:5259:1: rule__MultiplicativeExpression__Group_1_1__3 : rule__MultiplicativeExpression__Group_1_1__3__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5263:1: ( rule__MultiplicativeExpression__Group_1_1__3__Impl )
+            // InternalSEW.g:5264:2: rule__MultiplicativeExpression__Group_1_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__3"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__3__Impl"
+    // InternalSEW.g:5270:1: rule__MultiplicativeExpression__Group_1_1__3__Impl : ( ( rule__MultiplicativeExpression__Group_1_1_3__0 )* ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5274:1: ( ( ( rule__MultiplicativeExpression__Group_1_1_3__0 )* ) )
+            // InternalSEW.g:5275:1: ( ( rule__MultiplicativeExpression__Group_1_1_3__0 )* )
+            {
+            // InternalSEW.g:5275:1: ( ( rule__MultiplicativeExpression__Group_1_1_3__0 )* )
+            // InternalSEW.g:5276:2: ( rule__MultiplicativeExpression__Group_1_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3()); 
+            }
+            // InternalSEW.g:5277:2: ( rule__MultiplicativeExpression__Group_1_1_3__0 )*
+            loop72:
+            do {
+                int alt72=2;
+                int LA72_0 = input.LA(1);
+
+                if ( (LA72_0==61) ) {
+                    alt72=1;
+                }
+
+
+                switch (alt72) {
+            	case 1 :
+            	    // InternalSEW.g:5277:3: rule__MultiplicativeExpression__Group_1_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_37);
+            	    rule__MultiplicativeExpression__Group_1_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop72;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1_3__0"
+    // InternalSEW.g:5286:1: rule__MultiplicativeExpression__Group_1_1_3__0 : rule__MultiplicativeExpression__Group_1_1_3__0__Impl rule__MultiplicativeExpression__Group_1_1_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5290:1: ( rule__MultiplicativeExpression__Group_1_1_3__0__Impl rule__MultiplicativeExpression__Group_1_1_3__1 )
+            // InternalSEW.g:5291:2: rule__MultiplicativeExpression__Group_1_1_3__0__Impl rule__MultiplicativeExpression__Group_1_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__MultiplicativeExpression__Group_1_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1_3__0__Impl"
+    // InternalSEW.g:5298:1: rule__MultiplicativeExpression__Group_1_1_3__0__Impl : ( '**' ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5302:1: ( ( '**' ) )
+            // InternalSEW.g:5303:1: ( '**' )
+            {
+            // InternalSEW.g:5303:1: ( '**' )
+            // InternalSEW.g:5304:2: '**'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0()); 
+            }
+            match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1_3__1"
+    // InternalSEW.g:5313:1: rule__MultiplicativeExpression__Group_1_1_3__1 : rule__MultiplicativeExpression__Group_1_1_3__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5317:1: ( rule__MultiplicativeExpression__Group_1_1_3__1__Impl )
+            // InternalSEW.g:5318:2: rule__MultiplicativeExpression__Group_1_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1_3__1__Impl"
+    // InternalSEW.g:5324:1: rule__MultiplicativeExpression__Group_1_1_3__1__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5328:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 ) ) )
+            // InternalSEW.g:5329:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 ) )
+            {
+            // InternalSEW.g:5329:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 ) )
+            // InternalSEW.g:5330:2: ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1()); 
+            }
+            // InternalSEW.g:5331:2: ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 )
+            // InternalSEW.g:5331:3: rule__MultiplicativeExpression__OperandAssignment_1_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__0"
+    // InternalSEW.g:5340:1: rule__MultiplicativeExpression__Group_1_2__0 : rule__MultiplicativeExpression__Group_1_2__0__Impl rule__MultiplicativeExpression__Group_1_2__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5344:1: ( rule__MultiplicativeExpression__Group_1_2__0__Impl rule__MultiplicativeExpression__Group_1_2__1 )
+            // InternalSEW.g:5345:2: rule__MultiplicativeExpression__Group_1_2__0__Impl rule__MultiplicativeExpression__Group_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__MultiplicativeExpression__Group_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__0__Impl"
+    // InternalSEW.g:5352:1: rule__MultiplicativeExpression__Group_1_2__0__Impl : ( () ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5356:1: ( ( () ) )
+            // InternalSEW.g:5357:1: ( () )
+            {
+            // InternalSEW.g:5357:1: ( () )
+            // InternalSEW.g:5358:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_2_0()); 
+            }
+            // InternalSEW.g:5359:2: ()
+            // InternalSEW.g:5359:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__1"
+    // InternalSEW.g:5367:1: rule__MultiplicativeExpression__Group_1_2__1 : rule__MultiplicativeExpression__Group_1_2__1__Impl rule__MultiplicativeExpression__Group_1_2__2 ;
+    public final void rule__MultiplicativeExpression__Group_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5371:1: ( rule__MultiplicativeExpression__Group_1_2__1__Impl rule__MultiplicativeExpression__Group_1_2__2 )
+            // InternalSEW.g:5372:2: rule__MultiplicativeExpression__Group_1_2__1__Impl rule__MultiplicativeExpression__Group_1_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__MultiplicativeExpression__Group_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__1__Impl"
+    // InternalSEW.g:5379:1: rule__MultiplicativeExpression__Group_1_2__1__Impl : ( ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5383:1: ( ( ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 ) ) )
+            // InternalSEW.g:5384:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 ) )
+            {
+            // InternalSEW.g:5384:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 ) )
+            // InternalSEW.g:5385:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1()); 
+            }
+            // InternalSEW.g:5386:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 )
+            // InternalSEW.g:5386:3: rule__MultiplicativeExpression__OperatorAssignment_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperatorAssignment_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__2"
+    // InternalSEW.g:5394:1: rule__MultiplicativeExpression__Group_1_2__2 : rule__MultiplicativeExpression__Group_1_2__2__Impl rule__MultiplicativeExpression__Group_1_2__3 ;
+    public final void rule__MultiplicativeExpression__Group_1_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5398:1: ( rule__MultiplicativeExpression__Group_1_2__2__Impl rule__MultiplicativeExpression__Group_1_2__3 )
+            // InternalSEW.g:5399:2: rule__MultiplicativeExpression__Group_1_2__2__Impl rule__MultiplicativeExpression__Group_1_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__MultiplicativeExpression__Group_1_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__2__Impl"
+    // InternalSEW.g:5406:1: rule__MultiplicativeExpression__Group_1_2__2__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5410:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 ) ) )
+            // InternalSEW.g:5411:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 ) )
+            {
+            // InternalSEW.g:5411:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 ) )
+            // InternalSEW.g:5412:2: ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2()); 
+            }
+            // InternalSEW.g:5413:2: ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 )
+            // InternalSEW.g:5413:3: rule__MultiplicativeExpression__OperandAssignment_1_2_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__2__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__3"
+    // InternalSEW.g:5421:1: rule__MultiplicativeExpression__Group_1_2__3 : rule__MultiplicativeExpression__Group_1_2__3__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5425:1: ( rule__MultiplicativeExpression__Group_1_2__3__Impl )
+            // InternalSEW.g:5426:2: rule__MultiplicativeExpression__Group_1_2__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__3"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__3__Impl"
+    // InternalSEW.g:5432:1: rule__MultiplicativeExpression__Group_1_2__3__Impl : ( ( rule__MultiplicativeExpression__Group_1_2_3__0 )* ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5436:1: ( ( ( rule__MultiplicativeExpression__Group_1_2_3__0 )* ) )
+            // InternalSEW.g:5437:1: ( ( rule__MultiplicativeExpression__Group_1_2_3__0 )* )
+            {
+            // InternalSEW.g:5437:1: ( ( rule__MultiplicativeExpression__Group_1_2_3__0 )* )
+            // InternalSEW.g:5438:2: ( rule__MultiplicativeExpression__Group_1_2_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3()); 
+            }
+            // InternalSEW.g:5439:2: ( rule__MultiplicativeExpression__Group_1_2_3__0 )*
+            loop73:
+            do {
+                int alt73=2;
+                int LA73_0 = input.LA(1);
+
+                if ( (LA73_0==62) ) {
+                    alt73=1;
+                }
+
+
+                switch (alt73) {
+            	case 1 :
+            	    // InternalSEW.g:5439:3: rule__MultiplicativeExpression__Group_1_2_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_39);
+            	    rule__MultiplicativeExpression__Group_1_2_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop73;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__3__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2_3__0"
+    // InternalSEW.g:5448:1: rule__MultiplicativeExpression__Group_1_2_3__0 : rule__MultiplicativeExpression__Group_1_2_3__0__Impl rule__MultiplicativeExpression__Group_1_2_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_2_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5452:1: ( rule__MultiplicativeExpression__Group_1_2_3__0__Impl rule__MultiplicativeExpression__Group_1_2_3__1 )
+            // InternalSEW.g:5453:2: rule__MultiplicativeExpression__Group_1_2_3__0__Impl rule__MultiplicativeExpression__Group_1_2_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__MultiplicativeExpression__Group_1_2_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2_3__0__Impl"
+    // InternalSEW.g:5460:1: rule__MultiplicativeExpression__Group_1_2_3__0__Impl : ( '/' ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5464:1: ( ( '/' ) )
+            // InternalSEW.g:5465:1: ( '/' )
+            {
+            // InternalSEW.g:5465:1: ( '/' )
+            // InternalSEW.g:5466:2: '/'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0()); 
+            }
+            match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2_3__1"
+    // InternalSEW.g:5475:1: rule__MultiplicativeExpression__Group_1_2_3__1 : rule__MultiplicativeExpression__Group_1_2_3__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_2_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5479:1: ( rule__MultiplicativeExpression__Group_1_2_3__1__Impl )
+            // InternalSEW.g:5480:2: rule__MultiplicativeExpression__Group_1_2_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2_3__1__Impl"
+    // InternalSEW.g:5486:1: rule__MultiplicativeExpression__Group_1_2_3__1__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5490:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 ) ) )
+            // InternalSEW.g:5491:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 ) )
+            {
+            // InternalSEW.g:5491:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 ) )
+            // InternalSEW.g:5492:2: ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1()); 
+            }
+            // InternalSEW.g:5493:2: ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 )
+            // InternalSEW.g:5493:3: rule__MultiplicativeExpression__OperandAssignment_1_2_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_2_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__0"
+    // InternalSEW.g:5502:1: rule__MultiplicativeExpression__Group_1_3__0 : rule__MultiplicativeExpression__Group_1_3__0__Impl rule__MultiplicativeExpression__Group_1_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5506:1: ( rule__MultiplicativeExpression__Group_1_3__0__Impl rule__MultiplicativeExpression__Group_1_3__1 )
+            // InternalSEW.g:5507:2: rule__MultiplicativeExpression__Group_1_3__0__Impl rule__MultiplicativeExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__MultiplicativeExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__0__Impl"
+    // InternalSEW.g:5514:1: rule__MultiplicativeExpression__Group_1_3__0__Impl : ( () ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5518:1: ( ( () ) )
+            // InternalSEW.g:5519:1: ( () )
+            {
+            // InternalSEW.g:5519:1: ( () )
+            // InternalSEW.g:5520:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_3_0()); 
+            }
+            // InternalSEW.g:5521:2: ()
+            // InternalSEW.g:5521:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__1"
+    // InternalSEW.g:5529:1: rule__MultiplicativeExpression__Group_1_3__1 : rule__MultiplicativeExpression__Group_1_3__1__Impl rule__MultiplicativeExpression__Group_1_3__2 ;
+    public final void rule__MultiplicativeExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5533:1: ( rule__MultiplicativeExpression__Group_1_3__1__Impl rule__MultiplicativeExpression__Group_1_3__2 )
+            // InternalSEW.g:5534:2: rule__MultiplicativeExpression__Group_1_3__1__Impl rule__MultiplicativeExpression__Group_1_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__MultiplicativeExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__1__Impl"
+    // InternalSEW.g:5541:1: rule__MultiplicativeExpression__Group_1_3__1__Impl : ( ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5545:1: ( ( ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 ) ) )
+            // InternalSEW.g:5546:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 ) )
+            {
+            // InternalSEW.g:5546:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 ) )
+            // InternalSEW.g:5547:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1()); 
+            }
+            // InternalSEW.g:5548:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 )
+            // InternalSEW.g:5548:3: rule__MultiplicativeExpression__OperatorAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperatorAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__2"
+    // InternalSEW.g:5556:1: rule__MultiplicativeExpression__Group_1_3__2 : rule__MultiplicativeExpression__Group_1_3__2__Impl rule__MultiplicativeExpression__Group_1_3__3 ;
+    public final void rule__MultiplicativeExpression__Group_1_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5560:1: ( rule__MultiplicativeExpression__Group_1_3__2__Impl rule__MultiplicativeExpression__Group_1_3__3 )
+            // InternalSEW.g:5561:2: rule__MultiplicativeExpression__Group_1_3__2__Impl rule__MultiplicativeExpression__Group_1_3__3
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__MultiplicativeExpression__Group_1_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__2__Impl"
+    // InternalSEW.g:5568:1: rule__MultiplicativeExpression__Group_1_3__2__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5572:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 ) ) )
+            // InternalSEW.g:5573:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 ) )
+            {
+            // InternalSEW.g:5573:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 ) )
+            // InternalSEW.g:5574:2: ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2()); 
+            }
+            // InternalSEW.g:5575:2: ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 )
+            // InternalSEW.g:5575:3: rule__MultiplicativeExpression__OperandAssignment_1_3_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_3_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__2__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__3"
+    // InternalSEW.g:5583:1: rule__MultiplicativeExpression__Group_1_3__3 : rule__MultiplicativeExpression__Group_1_3__3__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_3__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5587:1: ( rule__MultiplicativeExpression__Group_1_3__3__Impl )
+            // InternalSEW.g:5588:2: rule__MultiplicativeExpression__Group_1_3__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__3"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__3__Impl"
+    // InternalSEW.g:5594:1: rule__MultiplicativeExpression__Group_1_3__3__Impl : ( ( rule__MultiplicativeExpression__Group_1_3_3__0 )* ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5598:1: ( ( ( rule__MultiplicativeExpression__Group_1_3_3__0 )* ) )
+            // InternalSEW.g:5599:1: ( ( rule__MultiplicativeExpression__Group_1_3_3__0 )* )
+            {
+            // InternalSEW.g:5599:1: ( ( rule__MultiplicativeExpression__Group_1_3_3__0 )* )
+            // InternalSEW.g:5600:2: ( rule__MultiplicativeExpression__Group_1_3_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3()); 
+            }
+            // InternalSEW.g:5601:2: ( rule__MultiplicativeExpression__Group_1_3_3__0 )*
+            loop74:
+            do {
+                int alt74=2;
+                int LA74_0 = input.LA(1);
+
+                if ( (LA74_0==63) ) {
+                    alt74=1;
+                }
+
+
+                switch (alt74) {
+            	case 1 :
+            	    // InternalSEW.g:5601:3: rule__MultiplicativeExpression__Group_1_3_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__MultiplicativeExpression__Group_1_3_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop74;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__3__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3_3__0"
+    // InternalSEW.g:5610:1: rule__MultiplicativeExpression__Group_1_3_3__0 : rule__MultiplicativeExpression__Group_1_3_3__0__Impl rule__MultiplicativeExpression__Group_1_3_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_3_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5614:1: ( rule__MultiplicativeExpression__Group_1_3_3__0__Impl rule__MultiplicativeExpression__Group_1_3_3__1 )
+            // InternalSEW.g:5615:2: rule__MultiplicativeExpression__Group_1_3_3__0__Impl rule__MultiplicativeExpression__Group_1_3_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__MultiplicativeExpression__Group_1_3_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3_3__0__Impl"
+    // InternalSEW.g:5622:1: rule__MultiplicativeExpression__Group_1_3_3__0__Impl : ( '%' ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5626:1: ( ( '%' ) )
+            // InternalSEW.g:5627:1: ( '%' )
+            {
+            // InternalSEW.g:5627:1: ( '%' )
+            // InternalSEW.g:5628:2: '%'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0()); 
+            }
+            match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3_3__1"
+    // InternalSEW.g:5637:1: rule__MultiplicativeExpression__Group_1_3_3__1 : rule__MultiplicativeExpression__Group_1_3_3__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_3_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5641:1: ( rule__MultiplicativeExpression__Group_1_3_3__1__Impl )
+            // InternalSEW.g:5642:2: rule__MultiplicativeExpression__Group_1_3_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3_3__1__Impl"
+    // InternalSEW.g:5648:1: rule__MultiplicativeExpression__Group_1_3_3__1__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5652:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 ) ) )
+            // InternalSEW.g:5653:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 ) )
+            {
+            // InternalSEW.g:5653:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 ) )
+            // InternalSEW.g:5654:2: ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1()); 
+            }
+            // InternalSEW.g:5655:2: ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 )
+            // InternalSEW.g:5655:3: rule__MultiplicativeExpression__OperandAssignment_1_3_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_3_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3_3__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_0__0"
+    // InternalSEW.g:5664:1: rule__PrimaryExpression__Group_0__0 : rule__PrimaryExpression__Group_0__0__Impl rule__PrimaryExpression__Group_0__1 ;
+    public final void rule__PrimaryExpression__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5668:1: ( rule__PrimaryExpression__Group_0__0__Impl rule__PrimaryExpression__Group_0__1 )
+            // InternalSEW.g:5669:2: rule__PrimaryExpression__Group_0__0__Impl rule__PrimaryExpression__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__PrimaryExpression__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_0__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_0__0__Impl"
+    // InternalSEW.g:5676:1: rule__PrimaryExpression__Group_0__0__Impl : ( '+' ) ;
+    public final void rule__PrimaryExpression__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5680:1: ( ( '+' ) )
+            // InternalSEW.g:5681:1: ( '+' )
+            {
+            // InternalSEW.g:5681:1: ( '+' )
+            // InternalSEW.g:5682:2: '+'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getPlusSignKeyword_0_0()); 
+            }
+            match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getPlusSignKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_0__1"
+    // InternalSEW.g:5691:1: rule__PrimaryExpression__Group_0__1 : rule__PrimaryExpression__Group_0__1__Impl ;
+    public final void rule__PrimaryExpression__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5695:1: ( rule__PrimaryExpression__Group_0__1__Impl )
+            // InternalSEW.g:5696:2: rule__PrimaryExpression__Group_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_0__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_0__1__Impl"
+    // InternalSEW.g:5702:1: rule__PrimaryExpression__Group_0__1__Impl : ( ruleprimaryExpression ) ;
+    public final void rule__PrimaryExpression__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5706:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:5707:1: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:5707:1: ( ruleprimaryExpression )
+            // InternalSEW.g:5708:2: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getPrimaryExpressionParserRuleCall_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getPrimaryExpressionParserRuleCall_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__0"
+    // InternalSEW.g:5718:1: rule__PrimaryExpression__Group_1__0 : rule__PrimaryExpression__Group_1__0__Impl rule__PrimaryExpression__Group_1__1 ;
+    public final void rule__PrimaryExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5722:1: ( rule__PrimaryExpression__Group_1__0__Impl rule__PrimaryExpression__Group_1__1 )
+            // InternalSEW.g:5723:2: rule__PrimaryExpression__Group_1__0__Impl rule__PrimaryExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_42);
+            rule__PrimaryExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__0__Impl"
+    // InternalSEW.g:5730:1: rule__PrimaryExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__PrimaryExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5734:1: ( ( () ) )
+            // InternalSEW.g:5735:1: ( () )
+            {
+            // InternalSEW.g:5735:1: ( () )
+            // InternalSEW.g:5736:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getExpressionAction_1_0()); 
+            }
+            // InternalSEW.g:5737:2: ()
+            // InternalSEW.g:5737:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getExpressionAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__1"
+    // InternalSEW.g:5745:1: rule__PrimaryExpression__Group_1__1 : rule__PrimaryExpression__Group_1__1__Impl ;
+    public final void rule__PrimaryExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5749:1: ( rule__PrimaryExpression__Group_1__1__Impl )
+            // InternalSEW.g:5750:2: rule__PrimaryExpression__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__1__Impl"
+    // InternalSEW.g:5756:1: rule__PrimaryExpression__Group_1__1__Impl : ( ( rule__PrimaryExpression__Group_1_1__0 ) ) ;
+    public final void rule__PrimaryExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5760:1: ( ( ( rule__PrimaryExpression__Group_1_1__0 ) ) )
+            // InternalSEW.g:5761:1: ( ( rule__PrimaryExpression__Group_1_1__0 ) )
+            {
+            // InternalSEW.g:5761:1: ( ( rule__PrimaryExpression__Group_1_1__0 ) )
+            // InternalSEW.g:5762:2: ( rule__PrimaryExpression__Group_1_1__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getGroup_1_1()); 
+            }
+            // InternalSEW.g:5763:2: ( rule__PrimaryExpression__Group_1_1__0 )
+            // InternalSEW.g:5763:3: rule__PrimaryExpression__Group_1_1__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1_1__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getGroup_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_1__0"
+    // InternalSEW.g:5772:1: rule__PrimaryExpression__Group_1_1__0 : rule__PrimaryExpression__Group_1_1__0__Impl rule__PrimaryExpression__Group_1_1__1 ;
+    public final void rule__PrimaryExpression__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5776:1: ( rule__PrimaryExpression__Group_1_1__0__Impl rule__PrimaryExpression__Group_1_1__1 )
+            // InternalSEW.g:5777:2: rule__PrimaryExpression__Group_1_1__0__Impl rule__PrimaryExpression__Group_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__PrimaryExpression__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_1__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_1__0__Impl"
+    // InternalSEW.g:5784:1: rule__PrimaryExpression__Group_1_1__0__Impl : ( ( rule__PrimaryExpression__OperatorAssignment_1_1_0 ) ) ;
+    public final void rule__PrimaryExpression__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5788:1: ( ( ( rule__PrimaryExpression__OperatorAssignment_1_1_0 ) ) )
+            // InternalSEW.g:5789:1: ( ( rule__PrimaryExpression__OperatorAssignment_1_1_0 ) )
+            {
+            // InternalSEW.g:5789:1: ( ( rule__PrimaryExpression__OperatorAssignment_1_1_0 ) )
+            // InternalSEW.g:5790:2: ( rule__PrimaryExpression__OperatorAssignment_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_1_1_0()); 
+            }
+            // InternalSEW.g:5791:2: ( rule__PrimaryExpression__OperatorAssignment_1_1_0 )
+            // InternalSEW.g:5791:3: rule__PrimaryExpression__OperatorAssignment_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__OperatorAssignment_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_1__1"
+    // InternalSEW.g:5799:1: rule__PrimaryExpression__Group_1_1__1 : rule__PrimaryExpression__Group_1_1__1__Impl ;
+    public final void rule__PrimaryExpression__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5803:1: ( rule__PrimaryExpression__Group_1_1__1__Impl )
+            // InternalSEW.g:5804:2: rule__PrimaryExpression__Group_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_1__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_1__1__Impl"
+    // InternalSEW.g:5810:1: rule__PrimaryExpression__Group_1_1__1__Impl : ( ( rule__PrimaryExpression__OperandAssignment_1_1_1 ) ) ;
+    public final void rule__PrimaryExpression__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5814:1: ( ( ( rule__PrimaryExpression__OperandAssignment_1_1_1 ) ) )
+            // InternalSEW.g:5815:1: ( ( rule__PrimaryExpression__OperandAssignment_1_1_1 ) )
+            {
+            // InternalSEW.g:5815:1: ( ( rule__PrimaryExpression__OperandAssignment_1_1_1 ) )
+            // InternalSEW.g:5816:2: ( rule__PrimaryExpression__OperandAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_1_1_1()); 
+            }
+            // InternalSEW.g:5817:2: ( rule__PrimaryExpression__OperandAssignment_1_1_1 )
+            // InternalSEW.g:5817:3: rule__PrimaryExpression__OperandAssignment_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__OperandAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__0"
+    // InternalSEW.g:5826:1: rule__PrimaryExpression__Group_2__0 : rule__PrimaryExpression__Group_2__0__Impl rule__PrimaryExpression__Group_2__1 ;
+    public final void rule__PrimaryExpression__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5830:1: ( rule__PrimaryExpression__Group_2__0__Impl rule__PrimaryExpression__Group_2__1 )
+            // InternalSEW.g:5831:2: rule__PrimaryExpression__Group_2__0__Impl rule__PrimaryExpression__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_43);
+            rule__PrimaryExpression__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__0__Impl"
+    // InternalSEW.g:5838:1: rule__PrimaryExpression__Group_2__0__Impl : ( () ) ;
+    public final void rule__PrimaryExpression__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5842:1: ( ( () ) )
+            // InternalSEW.g:5843:1: ( () )
+            {
+            // InternalSEW.g:5843:1: ( () )
+            // InternalSEW.g:5844:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getExpressionAction_2_0()); 
+            }
+            // InternalSEW.g:5845:2: ()
+            // InternalSEW.g:5845:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getExpressionAction_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__1"
+    // InternalSEW.g:5853:1: rule__PrimaryExpression__Group_2__1 : rule__PrimaryExpression__Group_2__1__Impl ;
+    public final void rule__PrimaryExpression__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5857:1: ( rule__PrimaryExpression__Group_2__1__Impl )
+            // InternalSEW.g:5858:2: rule__PrimaryExpression__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__1__Impl"
+    // InternalSEW.g:5864:1: rule__PrimaryExpression__Group_2__1__Impl : ( ( rule__PrimaryExpression__Group_2_1__0 ) ) ;
+    public final void rule__PrimaryExpression__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5868:1: ( ( ( rule__PrimaryExpression__Group_2_1__0 ) ) )
+            // InternalSEW.g:5869:1: ( ( rule__PrimaryExpression__Group_2_1__0 ) )
+            {
+            // InternalSEW.g:5869:1: ( ( rule__PrimaryExpression__Group_2_1__0 ) )
+            // InternalSEW.g:5870:2: ( rule__PrimaryExpression__Group_2_1__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_1()); 
+            }
+            // InternalSEW.g:5871:2: ( rule__PrimaryExpression__Group_2_1__0 )
+            // InternalSEW.g:5871:3: rule__PrimaryExpression__Group_2_1__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_1__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_1__0"
+    // InternalSEW.g:5880:1: rule__PrimaryExpression__Group_2_1__0 : rule__PrimaryExpression__Group_2_1__0__Impl rule__PrimaryExpression__Group_2_1__1 ;
+    public final void rule__PrimaryExpression__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5884:1: ( rule__PrimaryExpression__Group_2_1__0__Impl rule__PrimaryExpression__Group_2_1__1 )
+            // InternalSEW.g:5885:2: rule__PrimaryExpression__Group_2_1__0__Impl rule__PrimaryExpression__Group_2_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__PrimaryExpression__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_1__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_1__0__Impl"
+    // InternalSEW.g:5892:1: rule__PrimaryExpression__Group_2_1__0__Impl : ( ( rule__PrimaryExpression__OperatorAssignment_2_1_0 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5896:1: ( ( ( rule__PrimaryExpression__OperatorAssignment_2_1_0 ) ) )
+            // InternalSEW.g:5897:1: ( ( rule__PrimaryExpression__OperatorAssignment_2_1_0 ) )
+            {
+            // InternalSEW.g:5897:1: ( ( rule__PrimaryExpression__OperatorAssignment_2_1_0 ) )
+            // InternalSEW.g:5898:2: ( rule__PrimaryExpression__OperatorAssignment_2_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_2_1_0()); 
+            }
+            // InternalSEW.g:5899:2: ( rule__PrimaryExpression__OperatorAssignment_2_1_0 )
+            // InternalSEW.g:5899:3: rule__PrimaryExpression__OperatorAssignment_2_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__OperatorAssignment_2_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getOperatorAssignment_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_1__1"
+    // InternalSEW.g:5907:1: rule__PrimaryExpression__Group_2_1__1 : rule__PrimaryExpression__Group_2_1__1__Impl ;
+    public final void rule__PrimaryExpression__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5911:1: ( rule__PrimaryExpression__Group_2_1__1__Impl )
+            // InternalSEW.g:5912:2: rule__PrimaryExpression__Group_2_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_1__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_1__1__Impl"
+    // InternalSEW.g:5918:1: rule__PrimaryExpression__Group_2_1__1__Impl : ( ( rule__PrimaryExpression__OperandAssignment_2_1_1 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5922:1: ( ( ( rule__PrimaryExpression__OperandAssignment_2_1_1 ) ) )
+            // InternalSEW.g:5923:1: ( ( rule__PrimaryExpression__OperandAssignment_2_1_1 ) )
+            {
+            // InternalSEW.g:5923:1: ( ( rule__PrimaryExpression__OperandAssignment_2_1_1 ) )
+            // InternalSEW.g:5924:2: ( rule__PrimaryExpression__OperandAssignment_2_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_2_1_1()); 
+            }
+            // InternalSEW.g:5925:2: ( rule__PrimaryExpression__OperandAssignment_2_1_1 )
+            // InternalSEW.g:5925:3: rule__PrimaryExpression__OperandAssignment_2_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__OperandAssignment_2_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getOperandAssignment_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_3__0"
+    // InternalSEW.g:5934:1: rule__PrimaryExpression__Group_3__0 : rule__PrimaryExpression__Group_3__0__Impl rule__PrimaryExpression__Group_3__1 ;
+    public final void rule__PrimaryExpression__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5938:1: ( rule__PrimaryExpression__Group_3__0__Impl rule__PrimaryExpression__Group_3__1 )
+            // InternalSEW.g:5939:2: rule__PrimaryExpression__Group_3__0__Impl rule__PrimaryExpression__Group_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__PrimaryExpression__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_3__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_3__0__Impl"
+    // InternalSEW.g:5946:1: rule__PrimaryExpression__Group_3__0__Impl : ( '(' ) ;
+    public final void rule__PrimaryExpression__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5950:1: ( ( '(' ) )
+            // InternalSEW.g:5951:1: ( '(' )
+            {
+            // InternalSEW.g:5951:1: ( '(' )
+            // InternalSEW.g:5952:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getLeftParenthesisKeyword_3_0()); 
+            }
+            match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getLeftParenthesisKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_3__1"
+    // InternalSEW.g:5961:1: rule__PrimaryExpression__Group_3__1 : rule__PrimaryExpression__Group_3__1__Impl rule__PrimaryExpression__Group_3__2 ;
+    public final void rule__PrimaryExpression__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5965:1: ( rule__PrimaryExpression__Group_3__1__Impl rule__PrimaryExpression__Group_3__2 )
+            // InternalSEW.g:5966:2: rule__PrimaryExpression__Group_3__1__Impl rule__PrimaryExpression__Group_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_44);
+            rule__PrimaryExpression__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_3__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_3__1__Impl"
+    // InternalSEW.g:5973:1: rule__PrimaryExpression__Group_3__1__Impl : ( ruleExpression ) ;
+    public final void rule__PrimaryExpression__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5977:1: ( ( ruleExpression ) )
+            // InternalSEW.g:5978:1: ( ruleExpression )
+            {
+            // InternalSEW.g:5978:1: ( ruleExpression )
+            // InternalSEW.g:5979:2: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getExpressionParserRuleCall_3_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getExpressionParserRuleCall_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_3__2"
+    // InternalSEW.g:5988:1: rule__PrimaryExpression__Group_3__2 : rule__PrimaryExpression__Group_3__2__Impl ;
+    public final void rule__PrimaryExpression__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:5992:1: ( rule__PrimaryExpression__Group_3__2__Impl )
+            // InternalSEW.g:5993:2: rule__PrimaryExpression__Group_3__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_3__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_3__2__Impl"
+    // InternalSEW.g:5999:1: rule__PrimaryExpression__Group_3__2__Impl : ( ')' ) ;
+    public final void rule__PrimaryExpression__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6003:1: ( ( ')' ) )
+            // InternalSEW.g:6004:1: ( ')' )
+            {
+            // InternalSEW.g:6004:1: ( ')' )
+            // InternalSEW.g:6005:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_3_2()); 
+            }
+            match(input,65,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group__0"
+    // InternalSEW.g:6015:1: rule__LiteralArrayValue__Group__0 : rule__LiteralArrayValue__Group__0__Impl rule__LiteralArrayValue__Group__1 ;
+    public final void rule__LiteralArrayValue__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6019:1: ( rule__LiteralArrayValue__Group__0__Impl rule__LiteralArrayValue__Group__1 )
+            // InternalSEW.g:6020:2: rule__LiteralArrayValue__Group__0__Impl rule__LiteralArrayValue__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_45);
+            rule__LiteralArrayValue__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group__0"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group__0__Impl"
+    // InternalSEW.g:6027:1: rule__LiteralArrayValue__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralArrayValue__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6031:1: ( ( () ) )
+            // InternalSEW.g:6032:1: ( () )
+            {
+            // InternalSEW.g:6032:1: ( () )
+            // InternalSEW.g:6033:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getLiteralArrayValueAction_0()); 
+            }
+            // InternalSEW.g:6034:2: ()
+            // InternalSEW.g:6034:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getLiteralArrayValueAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group__1"
+    // InternalSEW.g:6042:1: rule__LiteralArrayValue__Group__1 : rule__LiteralArrayValue__Group__1__Impl rule__LiteralArrayValue__Group__2 ;
+    public final void rule__LiteralArrayValue__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6046:1: ( rule__LiteralArrayValue__Group__1__Impl rule__LiteralArrayValue__Group__2 )
+            // InternalSEW.g:6047:2: rule__LiteralArrayValue__Group__1__Impl rule__LiteralArrayValue__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_46);
+            rule__LiteralArrayValue__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group__1"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group__1__Impl"
+    // InternalSEW.g:6054:1: rule__LiteralArrayValue__Group__1__Impl : ( '[' ) ;
+    public final void rule__LiteralArrayValue__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6058:1: ( ( '[' ) )
+            // InternalSEW.g:6059:1: ( '[' )
+            {
+            // InternalSEW.g:6059:1: ( '[' )
+            // InternalSEW.g:6060:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getLeftSquareBracketKeyword_1()); 
+            }
+            match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getLeftSquareBracketKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group__2"
+    // InternalSEW.g:6069:1: rule__LiteralArrayValue__Group__2 : rule__LiteralArrayValue__Group__2__Impl rule__LiteralArrayValue__Group__3 ;
+    public final void rule__LiteralArrayValue__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6073:1: ( rule__LiteralArrayValue__Group__2__Impl rule__LiteralArrayValue__Group__3 )
+            // InternalSEW.g:6074:2: rule__LiteralArrayValue__Group__2__Impl rule__LiteralArrayValue__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_46);
+            rule__LiteralArrayValue__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group__2"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group__2__Impl"
+    // InternalSEW.g:6081:1: rule__LiteralArrayValue__Group__2__Impl : ( ( rule__LiteralArrayValue__Group_2__0 )? ) ;
+    public final void rule__LiteralArrayValue__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6085:1: ( ( ( rule__LiteralArrayValue__Group_2__0 )? ) )
+            // InternalSEW.g:6086:1: ( ( rule__LiteralArrayValue__Group_2__0 )? )
+            {
+            // InternalSEW.g:6086:1: ( ( rule__LiteralArrayValue__Group_2__0 )? )
+            // InternalSEW.g:6087:2: ( rule__LiteralArrayValue__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getGroup_2()); 
+            }
+            // InternalSEW.g:6088:2: ( rule__LiteralArrayValue__Group_2__0 )?
+            int alt75=2;
+            int LA75_0 = input.LA(1);
+
+            if ( ((LA75_0>=RULE_CHARACTER && LA75_0<=RULE_XIDENDIFIER)||LA75_0==RULE_INT||LA75_0==14||LA75_0==18||LA75_0==20||(LA75_0>=36 && LA75_0<=47)||LA75_0==54||LA75_0==59||LA75_0==64||(LA75_0>=66 && LA75_0<=68)||LA75_0==71||(LA75_0>=73 && LA75_0<=79)) ) {
+                alt75=1;
+            }
+            switch (alt75) {
+                case 1 :
+                    // InternalSEW.g:6088:3: rule__LiteralArrayValue__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralArrayValue__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group__3"
+    // InternalSEW.g:6096:1: rule__LiteralArrayValue__Group__3 : rule__LiteralArrayValue__Group__3__Impl ;
+    public final void rule__LiteralArrayValue__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6100:1: ( rule__LiteralArrayValue__Group__3__Impl )
+            // InternalSEW.g:6101:2: rule__LiteralArrayValue__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group__3"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group__3__Impl"
+    // InternalSEW.g:6107:1: rule__LiteralArrayValue__Group__3__Impl : ( ']' ) ;
+    public final void rule__LiteralArrayValue__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6111:1: ( ( ']' ) )
+            // InternalSEW.g:6112:1: ( ']' )
+            {
+            // InternalSEW.g:6112:1: ( ']' )
+            // InternalSEW.g:6113:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getRightSquareBracketKeyword_3()); 
+            }
+            match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getRightSquareBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group__3__Impl"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group_2__0"
+    // InternalSEW.g:6123:1: rule__LiteralArrayValue__Group_2__0 : rule__LiteralArrayValue__Group_2__0__Impl rule__LiteralArrayValue__Group_2__1 ;
+    public final void rule__LiteralArrayValue__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6127:1: ( rule__LiteralArrayValue__Group_2__0__Impl rule__LiteralArrayValue__Group_2__1 )
+            // InternalSEW.g:6128:2: rule__LiteralArrayValue__Group_2__0__Impl rule__LiteralArrayValue__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__LiteralArrayValue__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group_2__0"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group_2__0__Impl"
+    // InternalSEW.g:6135:1: rule__LiteralArrayValue__Group_2__0__Impl : ( ( rule__LiteralArrayValue__ValuesAssignment_2_0 ) ) ;
+    public final void rule__LiteralArrayValue__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6139:1: ( ( ( rule__LiteralArrayValue__ValuesAssignment_2_0 ) ) )
+            // InternalSEW.g:6140:1: ( ( rule__LiteralArrayValue__ValuesAssignment_2_0 ) )
+            {
+            // InternalSEW.g:6140:1: ( ( rule__LiteralArrayValue__ValuesAssignment_2_0 ) )
+            // InternalSEW.g:6141:2: ( rule__LiteralArrayValue__ValuesAssignment_2_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_0()); 
+            }
+            // InternalSEW.g:6142:2: ( rule__LiteralArrayValue__ValuesAssignment_2_0 )
+            // InternalSEW.g:6142:3: rule__LiteralArrayValue__ValuesAssignment_2_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__ValuesAssignment_2_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group_2__1"
+    // InternalSEW.g:6150:1: rule__LiteralArrayValue__Group_2__1 : rule__LiteralArrayValue__Group_2__1__Impl ;
+    public final void rule__LiteralArrayValue__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6154:1: ( rule__LiteralArrayValue__Group_2__1__Impl )
+            // InternalSEW.g:6155:2: rule__LiteralArrayValue__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group_2__1"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group_2__1__Impl"
+    // InternalSEW.g:6161:1: rule__LiteralArrayValue__Group_2__1__Impl : ( ( rule__LiteralArrayValue__Group_2_1__0 )* ) ;
+    public final void rule__LiteralArrayValue__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6165:1: ( ( ( rule__LiteralArrayValue__Group_2_1__0 )* ) )
+            // InternalSEW.g:6166:1: ( ( rule__LiteralArrayValue__Group_2_1__0 )* )
+            {
+            // InternalSEW.g:6166:1: ( ( rule__LiteralArrayValue__Group_2_1__0 )* )
+            // InternalSEW.g:6167:2: ( rule__LiteralArrayValue__Group_2_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getGroup_2_1()); 
+            }
+            // InternalSEW.g:6168:2: ( rule__LiteralArrayValue__Group_2_1__0 )*
+            loop76:
+            do {
+                int alt76=2;
+                int LA76_0 = input.LA(1);
+
+                if ( (LA76_0==53) ) {
+                    alt76=1;
+                }
+
+
+                switch (alt76) {
+            	case 1 :
+            	    // InternalSEW.g:6168:3: rule__LiteralArrayValue__Group_2_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_48);
+            	    rule__LiteralArrayValue__Group_2_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop76;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getGroup_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group_2_1__0"
+    // InternalSEW.g:6177:1: rule__LiteralArrayValue__Group_2_1__0 : rule__LiteralArrayValue__Group_2_1__0__Impl rule__LiteralArrayValue__Group_2_1__1 ;
+    public final void rule__LiteralArrayValue__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6181:1: ( rule__LiteralArrayValue__Group_2_1__0__Impl rule__LiteralArrayValue__Group_2_1__1 )
+            // InternalSEW.g:6182:2: rule__LiteralArrayValue__Group_2_1__0__Impl rule__LiteralArrayValue__Group_2_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__LiteralArrayValue__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group_2_1__0"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group_2_1__0__Impl"
+    // InternalSEW.g:6189:1: rule__LiteralArrayValue__Group_2_1__0__Impl : ( ',' ) ;
+    public final void rule__LiteralArrayValue__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6193:1: ( ( ',' ) )
+            // InternalSEW.g:6194:1: ( ',' )
+            {
+            // InternalSEW.g:6194:1: ( ',' )
+            // InternalSEW.g:6195:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getCommaKeyword_2_1_0()); 
+            }
+            match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getCommaKeyword_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group_2_1__1"
+    // InternalSEW.g:6204:1: rule__LiteralArrayValue__Group_2_1__1 : rule__LiteralArrayValue__Group_2_1__1__Impl ;
+    public final void rule__LiteralArrayValue__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6208:1: ( rule__LiteralArrayValue__Group_2_1__1__Impl )
+            // InternalSEW.g:6209:2: rule__LiteralArrayValue__Group_2_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group_2_1__1"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__Group_2_1__1__Impl"
+    // InternalSEW.g:6215:1: rule__LiteralArrayValue__Group_2_1__1__Impl : ( ( rule__LiteralArrayValue__ValuesAssignment_2_1_1 ) ) ;
+    public final void rule__LiteralArrayValue__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6219:1: ( ( ( rule__LiteralArrayValue__ValuesAssignment_2_1_1 ) ) )
+            // InternalSEW.g:6220:1: ( ( rule__LiteralArrayValue__ValuesAssignment_2_1_1 ) )
+            {
+            // InternalSEW.g:6220:1: ( ( rule__LiteralArrayValue__ValuesAssignment_2_1_1 ) )
+            // InternalSEW.g:6221:2: ( rule__LiteralArrayValue__ValuesAssignment_2_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_1_1()); 
+            }
+            // InternalSEW.g:6222:2: ( rule__LiteralArrayValue__ValuesAssignment_2_1_1 )
+            // InternalSEW.g:6222:3: rule__LiteralArrayValue__ValuesAssignment_2_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralArrayValue__ValuesAssignment_2_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getValuesAssignment_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralObjectReference__Group__0"
+    // InternalSEW.g:6231:1: rule__LiteralObjectReference__Group__0 : rule__LiteralObjectReference__Group__0__Impl rule__LiteralObjectReference__Group__1 ;
+    public final void rule__LiteralObjectReference__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6235:1: ( rule__LiteralObjectReference__Group__0__Impl rule__LiteralObjectReference__Group__1 )
+            // InternalSEW.g:6236:2: rule__LiteralObjectReference__Group__0__Impl rule__LiteralObjectReference__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_49);
+            rule__LiteralObjectReference__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralObjectReference__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralObjectReference__Group__0"
+
+
+    // $ANTLR start "rule__LiteralObjectReference__Group__0__Impl"
+    // InternalSEW.g:6243:1: rule__LiteralObjectReference__Group__0__Impl : ( ( '&' )? ) ;
+    public final void rule__LiteralObjectReference__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6247:1: ( ( ( '&' )? ) )
+            // InternalSEW.g:6248:1: ( ( '&' )? )
+            {
+            // InternalSEW.g:6248:1: ( ( '&' )? )
+            // InternalSEW.g:6249:2: ( '&' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralObjectReferenceAccess().getAmpersandKeyword_0()); 
+            }
+            // InternalSEW.g:6250:2: ( '&' )?
+            int alt77=2;
+            int LA77_0 = input.LA(1);
+
+            if ( (LA77_0==66) ) {
+                alt77=1;
+            }
+            switch (alt77) {
+                case 1 :
+                    // InternalSEW.g:6250:3: '&'
+                    {
+                    match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralObjectReferenceAccess().getAmpersandKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralObjectReference__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralObjectReference__Group__1"
+    // InternalSEW.g:6258:1: rule__LiteralObjectReference__Group__1 : rule__LiteralObjectReference__Group__1__Impl ;
+    public final void rule__LiteralObjectReference__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6262:1: ( rule__LiteralObjectReference__Group__1__Impl )
+            // InternalSEW.g:6263:2: rule__LiteralObjectReference__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralObjectReference__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralObjectReference__Group__1"
+
+
+    // $ANTLR start "rule__LiteralObjectReference__Group__1__Impl"
+    // InternalSEW.g:6269:1: rule__LiteralObjectReference__Group__1__Impl : ( ( rule__LiteralObjectReference__Alternatives_1 ) ) ;
+    public final void rule__LiteralObjectReference__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6273:1: ( ( ( rule__LiteralObjectReference__Alternatives_1 ) ) )
+            // InternalSEW.g:6274:1: ( ( rule__LiteralObjectReference__Alternatives_1 ) )
+            {
+            // InternalSEW.g:6274:1: ( ( rule__LiteralObjectReference__Alternatives_1 ) )
+            // InternalSEW.g:6275:2: ( rule__LiteralObjectReference__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralObjectReferenceAccess().getAlternatives_1()); 
+            }
+            // InternalSEW.g:6276:2: ( rule__LiteralObjectReference__Alternatives_1 )
+            // InternalSEW.g:6276:3: rule__LiteralObjectReference__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralObjectReference__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralObjectReferenceAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralObjectReference__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralRationalValue__Group__0"
+    // InternalSEW.g:6285:1: rule__LiteralRationalValue__Group__0 : rule__LiteralRationalValue__Group__0__Impl rule__LiteralRationalValue__Group__1 ;
+    public final void rule__LiteralRationalValue__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6289:1: ( rule__LiteralRationalValue__Group__0__Impl rule__LiteralRationalValue__Group__1 )
+            // InternalSEW.g:6290:2: rule__LiteralRationalValue__Group__0__Impl rule__LiteralRationalValue__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__LiteralRationalValue__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalValue__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalValue__Group__0"
+
+
+    // $ANTLR start "rule__LiteralRationalValue__Group__0__Impl"
+    // InternalSEW.g:6297:1: rule__LiteralRationalValue__Group__0__Impl : ( ( rule__LiteralRationalValue__NumeratorAssignment_0 ) ) ;
+    public final void rule__LiteralRationalValue__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6301:1: ( ( ( rule__LiteralRationalValue__NumeratorAssignment_0 ) ) )
+            // InternalSEW.g:6302:1: ( ( rule__LiteralRationalValue__NumeratorAssignment_0 ) )
+            {
+            // InternalSEW.g:6302:1: ( ( rule__LiteralRationalValue__NumeratorAssignment_0 ) )
+            // InternalSEW.g:6303:2: ( rule__LiteralRationalValue__NumeratorAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalValueAccess().getNumeratorAssignment_0()); 
+            }
+            // InternalSEW.g:6304:2: ( rule__LiteralRationalValue__NumeratorAssignment_0 )
+            // InternalSEW.g:6304:3: rule__LiteralRationalValue__NumeratorAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalValue__NumeratorAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalValueAccess().getNumeratorAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalValue__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralRationalValue__Group__1"
+    // InternalSEW.g:6312:1: rule__LiteralRationalValue__Group__1 : rule__LiteralRationalValue__Group__1__Impl rule__LiteralRationalValue__Group__2 ;
+    public final void rule__LiteralRationalValue__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6316:1: ( rule__LiteralRationalValue__Group__1__Impl rule__LiteralRationalValue__Group__2 )
+            // InternalSEW.g:6317:2: rule__LiteralRationalValue__Group__1__Impl rule__LiteralRationalValue__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__LiteralRationalValue__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalValue__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalValue__Group__1"
+
+
+    // $ANTLR start "rule__LiteralRationalValue__Group__1__Impl"
+    // InternalSEW.g:6324:1: rule__LiteralRationalValue__Group__1__Impl : ( '/' ) ;
+    public final void rule__LiteralRationalValue__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6328:1: ( ( '/' ) )
+            // InternalSEW.g:6329:1: ( '/' )
+            {
+            // InternalSEW.g:6329:1: ( '/' )
+            // InternalSEW.g:6330:2: '/'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalValueAccess().getSolidusKeyword_1()); 
+            }
+            match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalValueAccess().getSolidusKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalValue__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralRationalValue__Group__2"
+    // InternalSEW.g:6339:1: rule__LiteralRationalValue__Group__2 : rule__LiteralRationalValue__Group__2__Impl ;
+    public final void rule__LiteralRationalValue__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6343:1: ( rule__LiteralRationalValue__Group__2__Impl )
+            // InternalSEW.g:6344:2: rule__LiteralRationalValue__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalValue__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalValue__Group__2"
+
+
+    // $ANTLR start "rule__LiteralRationalValue__Group__2__Impl"
+    // InternalSEW.g:6350:1: rule__LiteralRationalValue__Group__2__Impl : ( ( rule__LiteralRationalValue__DenominatorAssignment_2 ) ) ;
+    public final void rule__LiteralRationalValue__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6354:1: ( ( ( rule__LiteralRationalValue__DenominatorAssignment_2 ) ) )
+            // InternalSEW.g:6355:1: ( ( rule__LiteralRationalValue__DenominatorAssignment_2 ) )
+            {
+            // InternalSEW.g:6355:1: ( ( rule__LiteralRationalValue__DenominatorAssignment_2 ) )
+            // InternalSEW.g:6356:2: ( rule__LiteralRationalValue__DenominatorAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalValueAccess().getDenominatorAssignment_2()); 
+            }
+            // InternalSEW.g:6357:2: ( rule__LiteralRationalValue__DenominatorAssignment_2 )
+            // InternalSEW.g:6357:3: rule__LiteralRationalValue__DenominatorAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalValue__DenominatorAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalValueAccess().getDenominatorAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalValue__Group__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group__0"
+    // InternalSEW.g:6366:1: rule__LiteralNullValue__Group__0 : rule__LiteralNullValue__Group__0__Impl rule__LiteralNullValue__Group__1 ;
+    public final void rule__LiteralNullValue__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6370:1: ( rule__LiteralNullValue__Group__0__Impl rule__LiteralNullValue__Group__1 )
+            // InternalSEW.g:6371:2: rule__LiteralNullValue__Group__0__Impl rule__LiteralNullValue__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_51);
+            rule__LiteralNullValue__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullValue__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group__0"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group__0__Impl"
+    // InternalSEW.g:6378:1: rule__LiteralNullValue__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralNullValue__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6382:1: ( ( () ) )
+            // InternalSEW.g:6383:1: ( () )
+            {
+            // InternalSEW.g:6383:1: ( () )
+            // InternalSEW.g:6384:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullValueAccess().getLiteralNullValueAction_0()); 
+            }
+            // InternalSEW.g:6385:2: ()
+            // InternalSEW.g:6385:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullValueAccess().getLiteralNullValueAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group__1"
+    // InternalSEW.g:6393:1: rule__LiteralNullValue__Group__1 : rule__LiteralNullValue__Group__1__Impl rule__LiteralNullValue__Group__2 ;
+    public final void rule__LiteralNullValue__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6397:1: ( rule__LiteralNullValue__Group__1__Impl rule__LiteralNullValue__Group__2 )
+            // InternalSEW.g:6398:2: rule__LiteralNullValue__Group__1__Impl rule__LiteralNullValue__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_7);
+            rule__LiteralNullValue__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullValue__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group__1"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group__1__Impl"
+    // InternalSEW.g:6405:1: rule__LiteralNullValue__Group__1__Impl : ( 'null' ) ;
+    public final void rule__LiteralNullValue__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6409:1: ( ( 'null' ) )
+            // InternalSEW.g:6410:1: ( 'null' )
+            {
+            // InternalSEW.g:6410:1: ( 'null' )
+            // InternalSEW.g:6411:2: 'null'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullValueAccess().getNullKeyword_1()); 
+            }
+            match(input,67,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullValueAccess().getNullKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group__2"
+    // InternalSEW.g:6420:1: rule__LiteralNullValue__Group__2 : rule__LiteralNullValue__Group__2__Impl ;
+    public final void rule__LiteralNullValue__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6424:1: ( rule__LiteralNullValue__Group__2__Impl )
+            // InternalSEW.g:6425:2: rule__LiteralNullValue__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullValue__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group__2"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group__2__Impl"
+    // InternalSEW.g:6431:1: rule__LiteralNullValue__Group__2__Impl : ( ( rule__LiteralNullValue__Group_2__0 )? ) ;
+    public final void rule__LiteralNullValue__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6435:1: ( ( ( rule__LiteralNullValue__Group_2__0 )? ) )
+            // InternalSEW.g:6436:1: ( ( rule__LiteralNullValue__Group_2__0 )? )
+            {
+            // InternalSEW.g:6436:1: ( ( rule__LiteralNullValue__Group_2__0 )? )
+            // InternalSEW.g:6437:2: ( rule__LiteralNullValue__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullValueAccess().getGroup_2()); 
+            }
+            // InternalSEW.g:6438:2: ( rule__LiteralNullValue__Group_2__0 )?
+            int alt78=2;
+            alt78 = dfa78.predict(input);
+            switch (alt78) {
+                case 1 :
+                    // InternalSEW.g:6438:3: rule__LiteralNullValue__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralNullValue__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullValueAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group_2__0"
+    // InternalSEW.g:6447:1: rule__LiteralNullValue__Group_2__0 : rule__LiteralNullValue__Group_2__0__Impl rule__LiteralNullValue__Group_2__1 ;
+    public final void rule__LiteralNullValue__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6451:1: ( rule__LiteralNullValue__Group_2__0__Impl rule__LiteralNullValue__Group_2__1 )
+            // InternalSEW.g:6452:2: rule__LiteralNullValue__Group_2__0__Impl rule__LiteralNullValue__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__LiteralNullValue__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullValue__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group_2__0"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group_2__0__Impl"
+    // InternalSEW.g:6459:1: rule__LiteralNullValue__Group_2__0__Impl : ( '<' ) ;
+    public final void rule__LiteralNullValue__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6463:1: ( ( '<' ) )
+            // InternalSEW.g:6464:1: ( '<' )
+            {
+            // InternalSEW.g:6464:1: ( '<' )
+            // InternalSEW.g:6465:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullValueAccess().getLessThanSignKeyword_2_0()); 
+            }
+            match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullValueAccess().getLessThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group_2__1"
+    // InternalSEW.g:6474:1: rule__LiteralNullValue__Group_2__1 : rule__LiteralNullValue__Group_2__1__Impl rule__LiteralNullValue__Group_2__2 ;
+    public final void rule__LiteralNullValue__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6478:1: ( rule__LiteralNullValue__Group_2__1__Impl rule__LiteralNullValue__Group_2__2 )
+            // InternalSEW.g:6479:2: rule__LiteralNullValue__Group_2__1__Impl rule__LiteralNullValue__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_52);
+            rule__LiteralNullValue__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullValue__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group_2__1"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group_2__1__Impl"
+    // InternalSEW.g:6486:1: rule__LiteralNullValue__Group_2__1__Impl : ( ( rule__LiteralNullValue__TypeAssignment_2_1 ) ) ;
+    public final void rule__LiteralNullValue__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6490:1: ( ( ( rule__LiteralNullValue__TypeAssignment_2_1 ) ) )
+            // InternalSEW.g:6491:1: ( ( rule__LiteralNullValue__TypeAssignment_2_1 ) )
+            {
+            // InternalSEW.g:6491:1: ( ( rule__LiteralNullValue__TypeAssignment_2_1 ) )
+            // InternalSEW.g:6492:2: ( rule__LiteralNullValue__TypeAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullValueAccess().getTypeAssignment_2_1()); 
+            }
+            // InternalSEW.g:6493:2: ( rule__LiteralNullValue__TypeAssignment_2_1 )
+            // InternalSEW.g:6493:3: rule__LiteralNullValue__TypeAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullValue__TypeAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullValueAccess().getTypeAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group_2__2"
+    // InternalSEW.g:6501:1: rule__LiteralNullValue__Group_2__2 : rule__LiteralNullValue__Group_2__2__Impl ;
+    public final void rule__LiteralNullValue__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6505:1: ( rule__LiteralNullValue__Group_2__2__Impl )
+            // InternalSEW.g:6506:2: rule__LiteralNullValue__Group_2__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullValue__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group_2__2"
+
+
+    // $ANTLR start "rule__LiteralNullValue__Group_2__2__Impl"
+    // InternalSEW.g:6512:1: rule__LiteralNullValue__Group_2__2__Impl : ( '>' ) ;
+    public final void rule__LiteralNullValue__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6516:1: ( ( '>' ) )
+            // InternalSEW.g:6517:1: ( '>' )
+            {
+            // InternalSEW.g:6517:1: ( '>' )
+            // InternalSEW.g:6518:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullValueAccess().getGreaterThanSignKeyword_2_2()); 
+            }
+            match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullValueAccess().getGreaterThanSignKeyword_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralTimeVariable__Group__0"
+    // InternalSEW.g:6528:1: rule__LiteralTimeVariable__Group__0 : rule__LiteralTimeVariable__Group__0__Impl rule__LiteralTimeVariable__Group__1 ;
+    public final void rule__LiteralTimeVariable__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6532:1: ( rule__LiteralTimeVariable__Group__0__Impl rule__LiteralTimeVariable__Group__1 )
+            // InternalSEW.g:6533:2: rule__LiteralTimeVariable__Group__0__Impl rule__LiteralTimeVariable__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_53);
+            rule__LiteralTimeVariable__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeVariable__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeVariable__Group__0"
+
+
+    // $ANTLR start "rule__LiteralTimeVariable__Group__0__Impl"
+    // InternalSEW.g:6540:1: rule__LiteralTimeVariable__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralTimeVariable__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6544:1: ( ( () ) )
+            // InternalSEW.g:6545:1: ( () )
+            {
+            // InternalSEW.g:6545:1: ( () )
+            // InternalSEW.g:6546:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeVariableAccess().getLiteralTimeVariableAction_0()); 
+            }
+            // InternalSEW.g:6547:2: ()
+            // InternalSEW.g:6547:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeVariableAccess().getLiteralTimeVariableAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeVariable__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralTimeVariable__Group__1"
+    // InternalSEW.g:6555:1: rule__LiteralTimeVariable__Group__1 : rule__LiteralTimeVariable__Group__1__Impl ;
+    public final void rule__LiteralTimeVariable__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6559:1: ( rule__LiteralTimeVariable__Group__1__Impl )
+            // InternalSEW.g:6560:2: rule__LiteralTimeVariable__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeVariable__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeVariable__Group__1"
+
+
+    // $ANTLR start "rule__LiteralTimeVariable__Group__1__Impl"
+    // InternalSEW.g:6566:1: rule__LiteralTimeVariable__Group__1__Impl : ( ( rule__LiteralTimeVariable__SymbolAssignment_1 ) ) ;
+    public final void rule__LiteralTimeVariable__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6570:1: ( ( ( rule__LiteralTimeVariable__SymbolAssignment_1 ) ) )
+            // InternalSEW.g:6571:1: ( ( rule__LiteralTimeVariable__SymbolAssignment_1 ) )
+            {
+            // InternalSEW.g:6571:1: ( ( rule__LiteralTimeVariable__SymbolAssignment_1 ) )
+            // InternalSEW.g:6572:2: ( rule__LiteralTimeVariable__SymbolAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeVariableAccess().getSymbolAssignment_1()); 
+            }
+            // InternalSEW.g:6573:2: ( rule__LiteralTimeVariable__SymbolAssignment_1 )
+            // InternalSEW.g:6573:3: rule__LiteralTimeVariable__SymbolAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeVariable__SymbolAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeVariableAccess().getSymbolAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeVariable__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralTimeDeltaVariable__Group__0"
+    // InternalSEW.g:6582:1: rule__LiteralTimeDeltaVariable__Group__0 : rule__LiteralTimeDeltaVariable__Group__0__Impl rule__LiteralTimeDeltaVariable__Group__1 ;
+    public final void rule__LiteralTimeDeltaVariable__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6586:1: ( rule__LiteralTimeDeltaVariable__Group__0__Impl rule__LiteralTimeDeltaVariable__Group__1 )
+            // InternalSEW.g:6587:2: rule__LiteralTimeDeltaVariable__Group__0__Impl rule__LiteralTimeDeltaVariable__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_54);
+            rule__LiteralTimeDeltaVariable__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeDeltaVariable__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeDeltaVariable__Group__0"
+
+
+    // $ANTLR start "rule__LiteralTimeDeltaVariable__Group__0__Impl"
+    // InternalSEW.g:6594:1: rule__LiteralTimeDeltaVariable__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralTimeDeltaVariable__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6598:1: ( ( () ) )
+            // InternalSEW.g:6599:1: ( () )
+            {
+            // InternalSEW.g:6599:1: ( () )
+            // InternalSEW.g:6600:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaVariableAccess().getLiteralTimeDeltaVariableAction_0()); 
+            }
+            // InternalSEW.g:6601:2: ()
+            // InternalSEW.g:6601:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaVariableAccess().getLiteralTimeDeltaVariableAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeDeltaVariable__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralTimeDeltaVariable__Group__1"
+    // InternalSEW.g:6609:1: rule__LiteralTimeDeltaVariable__Group__1 : rule__LiteralTimeDeltaVariable__Group__1__Impl ;
+    public final void rule__LiteralTimeDeltaVariable__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6613:1: ( rule__LiteralTimeDeltaVariable__Group__1__Impl )
+            // InternalSEW.g:6614:2: rule__LiteralTimeDeltaVariable__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeDeltaVariable__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeDeltaVariable__Group__1"
+
+
+    // $ANTLR start "rule__LiteralTimeDeltaVariable__Group__1__Impl"
+    // InternalSEW.g:6620:1: rule__LiteralTimeDeltaVariable__Group__1__Impl : ( ( rule__LiteralTimeDeltaVariable__SymbolAssignment_1 ) ) ;
+    public final void rule__LiteralTimeDeltaVariable__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6624:1: ( ( ( rule__LiteralTimeDeltaVariable__SymbolAssignment_1 ) ) )
+            // InternalSEW.g:6625:1: ( ( rule__LiteralTimeDeltaVariable__SymbolAssignment_1 ) )
+            {
+            // InternalSEW.g:6625:1: ( ( rule__LiteralTimeDeltaVariable__SymbolAssignment_1 ) )
+            // InternalSEW.g:6626:2: ( rule__LiteralTimeDeltaVariable__SymbolAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolAssignment_1()); 
+            }
+            // InternalSEW.g:6627:2: ( rule__LiteralTimeDeltaVariable__SymbolAssignment_1 )
+            // InternalSEW.g:6627:3: rule__LiteralTimeDeltaVariable__SymbolAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeDeltaVariable__SymbolAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeDeltaVariable__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralThisInstance__Group__0"
+    // InternalSEW.g:6636:1: rule__LiteralThisInstance__Group__0 : rule__LiteralThisInstance__Group__0__Impl rule__LiteralThisInstance__Group__1 ;
+    public final void rule__LiteralThisInstance__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6640:1: ( rule__LiteralThisInstance__Group__0__Impl rule__LiteralThisInstance__Group__1 )
+            // InternalSEW.g:6641:2: rule__LiteralThisInstance__Group__0__Impl rule__LiteralThisInstance__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_55);
+            rule__LiteralThisInstance__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralThisInstance__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralThisInstance__Group__0"
+
+
+    // $ANTLR start "rule__LiteralThisInstance__Group__0__Impl"
+    // InternalSEW.g:6648:1: rule__LiteralThisInstance__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralThisInstance__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6652:1: ( ( () ) )
+            // InternalSEW.g:6653:1: ( () )
+            {
+            // InternalSEW.g:6653:1: ( () )
+            // InternalSEW.g:6654:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisInstanceAccess().getLiteralThisInstanceAction_0()); 
+            }
+            // InternalSEW.g:6655:2: ()
+            // InternalSEW.g:6655:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisInstanceAccess().getLiteralThisInstanceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralThisInstance__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralThisInstance__Group__1"
+    // InternalSEW.g:6663:1: rule__LiteralThisInstance__Group__1 : rule__LiteralThisInstance__Group__1__Impl ;
+    public final void rule__LiteralThisInstance__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6667:1: ( rule__LiteralThisInstance__Group__1__Impl )
+            // InternalSEW.g:6668:2: rule__LiteralThisInstance__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralThisInstance__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralThisInstance__Group__1"
+
+
+    // $ANTLR start "rule__LiteralThisInstance__Group__1__Impl"
+    // InternalSEW.g:6674:1: rule__LiteralThisInstance__Group__1__Impl : ( ( rule__LiteralThisInstance__SymbolAssignment_1 ) ) ;
+    public final void rule__LiteralThisInstance__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6678:1: ( ( ( rule__LiteralThisInstance__SymbolAssignment_1 ) ) )
+            // InternalSEW.g:6679:1: ( ( rule__LiteralThisInstance__SymbolAssignment_1 ) )
+            {
+            // InternalSEW.g:6679:1: ( ( rule__LiteralThisInstance__SymbolAssignment_1 ) )
+            // InternalSEW.g:6680:2: ( rule__LiteralThisInstance__SymbolAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisInstanceAccess().getSymbolAssignment_1()); 
+            }
+            // InternalSEW.g:6681:2: ( rule__LiteralThisInstance__SymbolAssignment_1 )
+            // InternalSEW.g:6681:3: rule__LiteralThisInstance__SymbolAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralThisInstance__SymbolAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisInstanceAccess().getSymbolAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralThisInstance__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralSelfInstance__Group__0"
+    // InternalSEW.g:6690:1: rule__LiteralSelfInstance__Group__0 : rule__LiteralSelfInstance__Group__0__Impl rule__LiteralSelfInstance__Group__1 ;
+    public final void rule__LiteralSelfInstance__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6694:1: ( rule__LiteralSelfInstance__Group__0__Impl rule__LiteralSelfInstance__Group__1 )
+            // InternalSEW.g:6695:2: rule__LiteralSelfInstance__Group__0__Impl rule__LiteralSelfInstance__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_56);
+            rule__LiteralSelfInstance__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSelfInstance__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSelfInstance__Group__0"
+
+
+    // $ANTLR start "rule__LiteralSelfInstance__Group__0__Impl"
+    // InternalSEW.g:6702:1: rule__LiteralSelfInstance__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralSelfInstance__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6706:1: ( ( () ) )
+            // InternalSEW.g:6707:1: ( () )
+            {
+            // InternalSEW.g:6707:1: ( () )
+            // InternalSEW.g:6708:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfInstanceAccess().getLiteralSelfInstanceAction_0()); 
+            }
+            // InternalSEW.g:6709:2: ()
+            // InternalSEW.g:6709:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfInstanceAccess().getLiteralSelfInstanceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSelfInstance__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralSelfInstance__Group__1"
+    // InternalSEW.g:6717:1: rule__LiteralSelfInstance__Group__1 : rule__LiteralSelfInstance__Group__1__Impl ;
+    public final void rule__LiteralSelfInstance__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6721:1: ( rule__LiteralSelfInstance__Group__1__Impl )
+            // InternalSEW.g:6722:2: rule__LiteralSelfInstance__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSelfInstance__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSelfInstance__Group__1"
+
+
+    // $ANTLR start "rule__LiteralSelfInstance__Group__1__Impl"
+    // InternalSEW.g:6728:1: rule__LiteralSelfInstance__Group__1__Impl : ( ( rule__LiteralSelfInstance__SymbolAssignment_1 ) ) ;
+    public final void rule__LiteralSelfInstance__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6732:1: ( ( ( rule__LiteralSelfInstance__SymbolAssignment_1 ) ) )
+            // InternalSEW.g:6733:1: ( ( rule__LiteralSelfInstance__SymbolAssignment_1 ) )
+            {
+            // InternalSEW.g:6733:1: ( ( rule__LiteralSelfInstance__SymbolAssignment_1 ) )
+            // InternalSEW.g:6734:2: ( rule__LiteralSelfInstance__SymbolAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfInstanceAccess().getSymbolAssignment_1()); 
+            }
+            // InternalSEW.g:6735:2: ( rule__LiteralSelfInstance__SymbolAssignment_1 )
+            // InternalSEW.g:6735:3: rule__LiteralSelfInstance__SymbolAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSelfInstance__SymbolAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfInstanceAccess().getSymbolAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSelfInstance__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralParentInstance__Group__0"
+    // InternalSEW.g:6744:1: rule__LiteralParentInstance__Group__0 : rule__LiteralParentInstance__Group__0__Impl rule__LiteralParentInstance__Group__1 ;
+    public final void rule__LiteralParentInstance__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6748:1: ( rule__LiteralParentInstance__Group__0__Impl rule__LiteralParentInstance__Group__1 )
+            // InternalSEW.g:6749:2: rule__LiteralParentInstance__Group__0__Impl rule__LiteralParentInstance__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_57);
+            rule__LiteralParentInstance__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralParentInstance__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralParentInstance__Group__0"
+
+
+    // $ANTLR start "rule__LiteralParentInstance__Group__0__Impl"
+    // InternalSEW.g:6756:1: rule__LiteralParentInstance__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralParentInstance__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6760:1: ( ( () ) )
+            // InternalSEW.g:6761:1: ( () )
+            {
+            // InternalSEW.g:6761:1: ( () )
+            // InternalSEW.g:6762:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentInstanceAccess().getLiteralParentInstanceAction_0()); 
+            }
+            // InternalSEW.g:6763:2: ()
+            // InternalSEW.g:6763:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentInstanceAccess().getLiteralParentInstanceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralParentInstance__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralParentInstance__Group__1"
+    // InternalSEW.g:6771:1: rule__LiteralParentInstance__Group__1 : rule__LiteralParentInstance__Group__1__Impl ;
+    public final void rule__LiteralParentInstance__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6775:1: ( rule__LiteralParentInstance__Group__1__Impl )
+            // InternalSEW.g:6776:2: rule__LiteralParentInstance__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralParentInstance__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralParentInstance__Group__1"
+
+
+    // $ANTLR start "rule__LiteralParentInstance__Group__1__Impl"
+    // InternalSEW.g:6782:1: rule__LiteralParentInstance__Group__1__Impl : ( ( rule__LiteralParentInstance__SymbolAssignment_1 ) ) ;
+    public final void rule__LiteralParentInstance__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6786:1: ( ( ( rule__LiteralParentInstance__SymbolAssignment_1 ) ) )
+            // InternalSEW.g:6787:1: ( ( rule__LiteralParentInstance__SymbolAssignment_1 ) )
+            {
+            // InternalSEW.g:6787:1: ( ( rule__LiteralParentInstance__SymbolAssignment_1 ) )
+            // InternalSEW.g:6788:2: ( rule__LiteralParentInstance__SymbolAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentInstanceAccess().getSymbolAssignment_1()); 
+            }
+            // InternalSEW.g:6789:2: ( rule__LiteralParentInstance__SymbolAssignment_1 )
+            // InternalSEW.g:6789:3: rule__LiteralParentInstance__SymbolAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralParentInstance__SymbolAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentInstanceAccess().getSymbolAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralParentInstance__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralSuperInstance__Group__0"
+    // InternalSEW.g:6798:1: rule__LiteralSuperInstance__Group__0 : rule__LiteralSuperInstance__Group__0__Impl rule__LiteralSuperInstance__Group__1 ;
+    public final void rule__LiteralSuperInstance__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6802:1: ( rule__LiteralSuperInstance__Group__0__Impl rule__LiteralSuperInstance__Group__1 )
+            // InternalSEW.g:6803:2: rule__LiteralSuperInstance__Group__0__Impl rule__LiteralSuperInstance__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_58);
+            rule__LiteralSuperInstance__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSuperInstance__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSuperInstance__Group__0"
+
+
+    // $ANTLR start "rule__LiteralSuperInstance__Group__0__Impl"
+    // InternalSEW.g:6810:1: rule__LiteralSuperInstance__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralSuperInstance__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6814:1: ( ( () ) )
+            // InternalSEW.g:6815:1: ( () )
+            {
+            // InternalSEW.g:6815:1: ( () )
+            // InternalSEW.g:6816:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperInstanceAccess().getLiteralSuperInstanceAction_0()); 
+            }
+            // InternalSEW.g:6817:2: ()
+            // InternalSEW.g:6817:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperInstanceAccess().getLiteralSuperInstanceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSuperInstance__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralSuperInstance__Group__1"
+    // InternalSEW.g:6825:1: rule__LiteralSuperInstance__Group__1 : rule__LiteralSuperInstance__Group__1__Impl ;
+    public final void rule__LiteralSuperInstance__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6829:1: ( rule__LiteralSuperInstance__Group__1__Impl )
+            // InternalSEW.g:6830:2: rule__LiteralSuperInstance__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSuperInstance__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSuperInstance__Group__1"
+
+
+    // $ANTLR start "rule__LiteralSuperInstance__Group__1__Impl"
+    // InternalSEW.g:6836:1: rule__LiteralSuperInstance__Group__1__Impl : ( ( rule__LiteralSuperInstance__SymbolAssignment_1 ) ) ;
+    public final void rule__LiteralSuperInstance__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6840:1: ( ( ( rule__LiteralSuperInstance__SymbolAssignment_1 ) ) )
+            // InternalSEW.g:6841:1: ( ( rule__LiteralSuperInstance__SymbolAssignment_1 ) )
+            {
+            // InternalSEW.g:6841:1: ( ( rule__LiteralSuperInstance__SymbolAssignment_1 ) )
+            // InternalSEW.g:6842:2: ( rule__LiteralSuperInstance__SymbolAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperInstanceAccess().getSymbolAssignment_1()); 
+            }
+            // InternalSEW.g:6843:2: ( rule__LiteralSuperInstance__SymbolAssignment_1 )
+            // InternalSEW.g:6843:3: rule__LiteralSuperInstance__SymbolAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSuperInstance__SymbolAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperInstanceAccess().getSymbolAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSuperInstance__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralSystemInstance__Group__0"
+    // InternalSEW.g:6852:1: rule__LiteralSystemInstance__Group__0 : rule__LiteralSystemInstance__Group__0__Impl rule__LiteralSystemInstance__Group__1 ;
+    public final void rule__LiteralSystemInstance__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6856:1: ( rule__LiteralSystemInstance__Group__0__Impl rule__LiteralSystemInstance__Group__1 )
+            // InternalSEW.g:6857:2: rule__LiteralSystemInstance__Group__0__Impl rule__LiteralSystemInstance__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_59);
+            rule__LiteralSystemInstance__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSystemInstance__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSystemInstance__Group__0"
+
+
+    // $ANTLR start "rule__LiteralSystemInstance__Group__0__Impl"
+    // InternalSEW.g:6864:1: rule__LiteralSystemInstance__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralSystemInstance__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6868:1: ( ( () ) )
+            // InternalSEW.g:6869:1: ( () )
+            {
+            // InternalSEW.g:6869:1: ( () )
+            // InternalSEW.g:6870:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemInstanceAccess().getLiteralSystemInstanceAction_0()); 
+            }
+            // InternalSEW.g:6871:2: ()
+            // InternalSEW.g:6871:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemInstanceAccess().getLiteralSystemInstanceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSystemInstance__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralSystemInstance__Group__1"
+    // InternalSEW.g:6879:1: rule__LiteralSystemInstance__Group__1 : rule__LiteralSystemInstance__Group__1__Impl ;
+    public final void rule__LiteralSystemInstance__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6883:1: ( rule__LiteralSystemInstance__Group__1__Impl )
+            // InternalSEW.g:6884:2: rule__LiteralSystemInstance__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSystemInstance__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSystemInstance__Group__1"
+
+
+    // $ANTLR start "rule__LiteralSystemInstance__Group__1__Impl"
+    // InternalSEW.g:6890:1: rule__LiteralSystemInstance__Group__1__Impl : ( ( rule__LiteralSystemInstance__SymbolAssignment_1 ) ) ;
+    public final void rule__LiteralSystemInstance__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6894:1: ( ( ( rule__LiteralSystemInstance__SymbolAssignment_1 ) ) )
+            // InternalSEW.g:6895:1: ( ( rule__LiteralSystemInstance__SymbolAssignment_1 ) )
+            {
+            // InternalSEW.g:6895:1: ( ( rule__LiteralSystemInstance__SymbolAssignment_1 ) )
+            // InternalSEW.g:6896:2: ( rule__LiteralSystemInstance__SymbolAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemInstanceAccess().getSymbolAssignment_1()); 
+            }
+            // InternalSEW.g:6897:2: ( rule__LiteralSystemInstance__SymbolAssignment_1 )
+            // InternalSEW.g:6897:3: rule__LiteralSystemInstance__SymbolAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSystemInstance__SymbolAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemInstanceAccess().getSymbolAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSystemInstance__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralEnvInstance__Group__0"
+    // InternalSEW.g:6906:1: rule__LiteralEnvInstance__Group__0 : rule__LiteralEnvInstance__Group__0__Impl rule__LiteralEnvInstance__Group__1 ;
+    public final void rule__LiteralEnvInstance__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6910:1: ( rule__LiteralEnvInstance__Group__0__Impl rule__LiteralEnvInstance__Group__1 )
+            // InternalSEW.g:6911:2: rule__LiteralEnvInstance__Group__0__Impl rule__LiteralEnvInstance__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__LiteralEnvInstance__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralEnvInstance__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvInstance__Group__0"
+
+
+    // $ANTLR start "rule__LiteralEnvInstance__Group__0__Impl"
+    // InternalSEW.g:6918:1: rule__LiteralEnvInstance__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralEnvInstance__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6922:1: ( ( () ) )
+            // InternalSEW.g:6923:1: ( () )
+            {
+            // InternalSEW.g:6923:1: ( () )
+            // InternalSEW.g:6924:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralEnvInstanceAccess().getLiteralEnvInstanceAction_0()); 
+            }
+            // InternalSEW.g:6925:2: ()
+            // InternalSEW.g:6925:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralEnvInstanceAccess().getLiteralEnvInstanceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvInstance__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralEnvInstance__Group__1"
+    // InternalSEW.g:6933:1: rule__LiteralEnvInstance__Group__1 : rule__LiteralEnvInstance__Group__1__Impl ;
+    public final void rule__LiteralEnvInstance__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6937:1: ( rule__LiteralEnvInstance__Group__1__Impl )
+            // InternalSEW.g:6938:2: rule__LiteralEnvInstance__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralEnvInstance__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvInstance__Group__1"
+
+
+    // $ANTLR start "rule__LiteralEnvInstance__Group__1__Impl"
+    // InternalSEW.g:6944:1: rule__LiteralEnvInstance__Group__1__Impl : ( ( rule__LiteralEnvInstance__SymbolAssignment_1 ) ) ;
+    public final void rule__LiteralEnvInstance__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6948:1: ( ( ( rule__LiteralEnvInstance__SymbolAssignment_1 ) ) )
+            // InternalSEW.g:6949:1: ( ( rule__LiteralEnvInstance__SymbolAssignment_1 ) )
+            {
+            // InternalSEW.g:6949:1: ( ( rule__LiteralEnvInstance__SymbolAssignment_1 ) )
+            // InternalSEW.g:6950:2: ( rule__LiteralEnvInstance__SymbolAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAssignment_1()); 
+            }
+            // InternalSEW.g:6951:2: ( rule__LiteralEnvInstance__SymbolAssignment_1 )
+            // InternalSEW.g:6951:3: rule__LiteralEnvInstance__SymbolAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralEnvInstance__SymbolAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvInstance__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ELong__Group__0"
+    // InternalSEW.g:6960:1: rule__ELong__Group__0 : rule__ELong__Group__0__Impl rule__ELong__Group__1 ;
+    public final void rule__ELong__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6964:1: ( rule__ELong__Group__0__Impl rule__ELong__Group__1 )
+            // InternalSEW.g:6965:2: rule__ELong__Group__0__Impl rule__ELong__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__ELong__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ELong__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ELong__Group__0"
+
+
+    // $ANTLR start "rule__ELong__Group__0__Impl"
+    // InternalSEW.g:6972:1: rule__ELong__Group__0__Impl : ( ( '-' )? ) ;
+    public final void rule__ELong__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6976:1: ( ( ( '-' )? ) )
+            // InternalSEW.g:6977:1: ( ( '-' )? )
+            {
+            // InternalSEW.g:6977:1: ( ( '-' )? )
+            // InternalSEW.g:6978:2: ( '-' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getELongAccess().getHyphenMinusKeyword_0()); 
+            }
+            // InternalSEW.g:6979:2: ( '-' )?
+            int alt79=2;
+            int LA79_0 = input.LA(1);
+
+            if ( (LA79_0==68) ) {
+                alt79=1;
+            }
+            switch (alt79) {
+                case 1 :
+                    // InternalSEW.g:6979:3: '-'
+                    {
+                    match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getELongAccess().getHyphenMinusKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ELong__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ELong__Group__1"
+    // InternalSEW.g:6987:1: rule__ELong__Group__1 : rule__ELong__Group__1__Impl ;
+    public final void rule__ELong__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:6991:1: ( rule__ELong__Group__1__Impl )
+            // InternalSEW.g:6992:2: rule__ELong__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ELong__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ELong__Group__1"
+
+
+    // $ANTLR start "rule__ELong__Group__1__Impl"
+    // InternalSEW.g:6998:1: rule__ELong__Group__1__Impl : ( RULE_INT ) ;
+    public final void rule__ELong__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7002:1: ( ( RULE_INT ) )
+            // InternalSEW.g:7003:1: ( RULE_INT )
+            {
+            // InternalSEW.g:7003:1: ( RULE_INT )
+            // InternalSEW.g:7004:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getELongAccess().getINTTerminalRuleCall_1()); 
+            }
+            match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getELongAccess().getINTTerminalRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ELong__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EDouble__Group__0"
+    // InternalSEW.g:7014:1: rule__EDouble__Group__0 : rule__EDouble__Group__0__Impl rule__EDouble__Group__1 ;
+    public final void rule__EDouble__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7018:1: ( rule__EDouble__Group__0__Impl rule__EDouble__Group__1 )
+            // InternalSEW.g:7019:2: rule__EDouble__Group__0__Impl rule__EDouble__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__EDouble__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__0"
+
+
+    // $ANTLR start "rule__EDouble__Group__0__Impl"
+    // InternalSEW.g:7026:1: rule__EDouble__Group__0__Impl : ( ( '-' )? ) ;
+    public final void rule__EDouble__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7030:1: ( ( ( '-' )? ) )
+            // InternalSEW.g:7031:1: ( ( '-' )? )
+            {
+            // InternalSEW.g:7031:1: ( ( '-' )? )
+            // InternalSEW.g:7032:2: ( '-' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0()); 
+            }
+            // InternalSEW.g:7033:2: ( '-' )?
+            int alt80=2;
+            int LA80_0 = input.LA(1);
+
+            if ( (LA80_0==68) ) {
+                alt80=1;
+            }
+            switch (alt80) {
+                case 1 :
+                    // InternalSEW.g:7033:3: '-'
+                    {
+                    match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EDouble__Group__1"
+    // InternalSEW.g:7041:1: rule__EDouble__Group__1 : rule__EDouble__Group__1__Impl rule__EDouble__Group__2 ;
+    public final void rule__EDouble__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7045:1: ( rule__EDouble__Group__1__Impl rule__EDouble__Group__2 )
+            // InternalSEW.g:7046:2: rule__EDouble__Group__1__Impl rule__EDouble__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__EDouble__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__1"
+
+
+    // $ANTLR start "rule__EDouble__Group__1__Impl"
+    // InternalSEW.g:7053:1: rule__EDouble__Group__1__Impl : ( ( RULE_INT )? ) ;
+    public final void rule__EDouble__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7057:1: ( ( ( RULE_INT )? ) )
+            // InternalSEW.g:7058:1: ( ( RULE_INT )? )
+            {
+            // InternalSEW.g:7058:1: ( ( RULE_INT )? )
+            // InternalSEW.g:7059:2: ( RULE_INT )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1()); 
+            }
+            // InternalSEW.g:7060:2: ( RULE_INT )?
+            int alt81=2;
+            int LA81_0 = input.LA(1);
+
+            if ( (LA81_0==RULE_INT) ) {
+                alt81=1;
+            }
+            switch (alt81) {
+                case 1 :
+                    // InternalSEW.g:7060:3: RULE_INT
+                    {
+                    match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EDouble__Group__2"
+    // InternalSEW.g:7068:1: rule__EDouble__Group__2 : rule__EDouble__Group__2__Impl rule__EDouble__Group__3 ;
+    public final void rule__EDouble__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7072:1: ( rule__EDouble__Group__2__Impl rule__EDouble__Group__3 )
+            // InternalSEW.g:7073:2: rule__EDouble__Group__2__Impl rule__EDouble__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_60);
+            rule__EDouble__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__2"
+
+
+    // $ANTLR start "rule__EDouble__Group__2__Impl"
+    // InternalSEW.g:7080:1: rule__EDouble__Group__2__Impl : ( '.' ) ;
+    public final void rule__EDouble__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7084:1: ( ( '.' ) )
+            // InternalSEW.g:7085:1: ( '.' )
+            {
+            // InternalSEW.g:7085:1: ( '.' )
+            // InternalSEW.g:7086:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getFullStopKeyword_2()); 
+            }
+            match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getFullStopKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EDouble__Group__3"
+    // InternalSEW.g:7095:1: rule__EDouble__Group__3 : rule__EDouble__Group__3__Impl ;
+    public final void rule__EDouble__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7099:1: ( rule__EDouble__Group__3__Impl )
+            // InternalSEW.g:7100:2: rule__EDouble__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__3"
+
+
+    // $ANTLR start "rule__EDouble__Group__3__Impl"
+    // InternalSEW.g:7106:1: rule__EDouble__Group__3__Impl : ( RULE_INT ) ;
+    public final void rule__EDouble__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7110:1: ( ( RULE_INT ) )
+            // InternalSEW.g:7111:1: ( RULE_INT )
+            {
+            // InternalSEW.g:7111:1: ( RULE_INT )
+            // InternalSEW.g:7112:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3()); 
+            }
+            match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EBigDecimal__Group__0"
+    // InternalSEW.g:7122:1: rule__EBigDecimal__Group__0 : rule__EBigDecimal__Group__0__Impl rule__EBigDecimal__Group__1 ;
+    public final void rule__EBigDecimal__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7126:1: ( rule__EBigDecimal__Group__0__Impl rule__EBigDecimal__Group__1 )
+            // InternalSEW.g:7127:2: rule__EBigDecimal__Group__0__Impl rule__EBigDecimal__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_61);
+            rule__EBigDecimal__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EBigDecimal__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EBigDecimal__Group__0"
+
+
+    // $ANTLR start "rule__EBigDecimal__Group__0__Impl"
+    // InternalSEW.g:7134:1: rule__EBigDecimal__Group__0__Impl : ( ( RULE_INT )? ) ;
+    public final void rule__EBigDecimal__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7138:1: ( ( ( RULE_INT )? ) )
+            // InternalSEW.g:7139:1: ( ( RULE_INT )? )
+            {
+            // InternalSEW.g:7139:1: ( ( RULE_INT )? )
+            // InternalSEW.g:7140:2: ( RULE_INT )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_0()); 
+            }
+            // InternalSEW.g:7141:2: ( RULE_INT )?
+            int alt82=2;
+            int LA82_0 = input.LA(1);
+
+            if ( (LA82_0==RULE_INT) ) {
+                alt82=1;
+            }
+            switch (alt82) {
+                case 1 :
+                    // InternalSEW.g:7141:3: RULE_INT
+                    {
+                    match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EBigDecimal__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EBigDecimal__Group__1"
+    // InternalSEW.g:7149:1: rule__EBigDecimal__Group__1 : rule__EBigDecimal__Group__1__Impl rule__EBigDecimal__Group__2 ;
+    public final void rule__EBigDecimal__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7153:1: ( rule__EBigDecimal__Group__1__Impl rule__EBigDecimal__Group__2 )
+            // InternalSEW.g:7154:2: rule__EBigDecimal__Group__1__Impl rule__EBigDecimal__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_60);
+            rule__EBigDecimal__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EBigDecimal__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EBigDecimal__Group__1"
+
+
+    // $ANTLR start "rule__EBigDecimal__Group__1__Impl"
+    // InternalSEW.g:7161:1: rule__EBigDecimal__Group__1__Impl : ( '.' ) ;
+    public final void rule__EBigDecimal__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7165:1: ( ( '.' ) )
+            // InternalSEW.g:7166:1: ( '.' )
+            {
+            // InternalSEW.g:7166:1: ( '.' )
+            // InternalSEW.g:7167:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEBigDecimalAccess().getFullStopKeyword_1()); 
+            }
+            match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEBigDecimalAccess().getFullStopKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EBigDecimal__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EBigDecimal__Group__2"
+    // InternalSEW.g:7176:1: rule__EBigDecimal__Group__2 : rule__EBigDecimal__Group__2__Impl ;
+    public final void rule__EBigDecimal__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7180:1: ( rule__EBigDecimal__Group__2__Impl )
+            // InternalSEW.g:7181:2: rule__EBigDecimal__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EBigDecimal__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EBigDecimal__Group__2"
+
+
+    // $ANTLR start "rule__EBigDecimal__Group__2__Impl"
+    // InternalSEW.g:7187:1: rule__EBigDecimal__Group__2__Impl : ( RULE_INT ) ;
+    public final void rule__EBigDecimal__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7191:1: ( ( RULE_INT ) )
+            // InternalSEW.g:7192:1: ( RULE_INT )
+            {
+            // InternalSEW.g:7192:1: ( RULE_INT )
+            // InternalSEW.g:7193:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_2()); 
+            }
+            match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EBigDecimal__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__0"
+    // InternalSEW.g:7203:1: rule__DeprecatedObject__Group_0__0 : rule__DeprecatedObject__Group_0__0__Impl rule__DeprecatedObject__Group_0__1 ;
+    public final void rule__DeprecatedObject__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7207:1: ( rule__DeprecatedObject__Group_0__0__Impl rule__DeprecatedObject__Group_0__1 )
+            // InternalSEW.g:7208:2: rule__DeprecatedObject__Group_0__0__Impl rule__DeprecatedObject__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_62);
+            rule__DeprecatedObject__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__0"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__0__Impl"
+    // InternalSEW.g:7215:1: rule__DeprecatedObject__Group_0__0__Impl : ( () ) ;
+    public final void rule__DeprecatedObject__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7219:1: ( ( () ) )
+            // InternalSEW.g:7220:1: ( () )
+            {
+            // InternalSEW.g:7220:1: ( () )
+            // InternalSEW.g:7221:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getWObjectAction_0_0()); 
+            }
+            // InternalSEW.g:7222:2: ()
+            // InternalSEW.g:7222:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getWObjectAction_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__1"
+    // InternalSEW.g:7230:1: rule__DeprecatedObject__Group_0__1 : rule__DeprecatedObject__Group_0__1__Impl rule__DeprecatedObject__Group_0__2 ;
+    public final void rule__DeprecatedObject__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7234:1: ( rule__DeprecatedObject__Group_0__1__Impl rule__DeprecatedObject__Group_0__2 )
+            // InternalSEW.g:7235:2: rule__DeprecatedObject__Group_0__1__Impl rule__DeprecatedObject__Group_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__DeprecatedObject__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__1"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__1__Impl"
+    // InternalSEW.g:7242:1: rule__DeprecatedObject__Group_0__1__Impl : ( 'form' ) ;
+    public final void rule__DeprecatedObject__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7246:1: ( ( 'form' ) )
+            // InternalSEW.g:7247:1: ( 'form' )
+            {
+            // InternalSEW.g:7247:1: ( 'form' )
+            // InternalSEW.g:7248:2: 'form'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getFormKeyword_0_1()); 
+            }
+            match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getFormKeyword_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__2"
+    // InternalSEW.g:7257:1: rule__DeprecatedObject__Group_0__2 : rule__DeprecatedObject__Group_0__2__Impl rule__DeprecatedObject__Group_0__3 ;
+    public final void rule__DeprecatedObject__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7261:1: ( rule__DeprecatedObject__Group_0__2__Impl rule__DeprecatedObject__Group_0__3 )
+            // InternalSEW.g:7262:2: rule__DeprecatedObject__Group_0__2__Impl rule__DeprecatedObject__Group_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__DeprecatedObject__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__2"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__2__Impl"
+    // InternalSEW.g:7269:1: rule__DeprecatedObject__Group_0__2__Impl : ( ( rule__DeprecatedObject__NameAssignment_0_2 ) ) ;
+    public final void rule__DeprecatedObject__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7273:1: ( ( ( rule__DeprecatedObject__NameAssignment_0_2 ) ) )
+            // InternalSEW.g:7274:1: ( ( rule__DeprecatedObject__NameAssignment_0_2 ) )
+            {
+            // InternalSEW.g:7274:1: ( ( rule__DeprecatedObject__NameAssignment_0_2 ) )
+            // InternalSEW.g:7275:2: ( rule__DeprecatedObject__NameAssignment_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_0_2()); 
+            }
+            // InternalSEW.g:7276:2: ( rule__DeprecatedObject__NameAssignment_0_2 )
+            // InternalSEW.g:7276:3: rule__DeprecatedObject__NameAssignment_0_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__NameAssignment_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__3"
+    // InternalSEW.g:7284:1: rule__DeprecatedObject__Group_0__3 : rule__DeprecatedObject__Group_0__3__Impl rule__DeprecatedObject__Group_0__4 ;
+    public final void rule__DeprecatedObject__Group_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7288:1: ( rule__DeprecatedObject__Group_0__3__Impl rule__DeprecatedObject__Group_0__4 )
+            // InternalSEW.g:7289:2: rule__DeprecatedObject__Group_0__3__Impl rule__DeprecatedObject__Group_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__DeprecatedObject__Group_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__3"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__3__Impl"
+    // InternalSEW.g:7296:1: rule__DeprecatedObject__Group_0__3__Impl : ( ( rule__DeprecatedObject__DescriptionAssignment_0_3 )? ) ;
+    public final void rule__DeprecatedObject__Group_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7300:1: ( ( ( rule__DeprecatedObject__DescriptionAssignment_0_3 )? ) )
+            // InternalSEW.g:7301:1: ( ( rule__DeprecatedObject__DescriptionAssignment_0_3 )? )
+            {
+            // InternalSEW.g:7301:1: ( ( rule__DeprecatedObject__DescriptionAssignment_0_3 )? )
+            // InternalSEW.g:7302:2: ( rule__DeprecatedObject__DescriptionAssignment_0_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_0_3()); 
+            }
+            // InternalSEW.g:7303:2: ( rule__DeprecatedObject__DescriptionAssignment_0_3 )?
+            int alt83=2;
+            int LA83_0 = input.LA(1);
+
+            if ( (LA83_0==RULE_STRING) ) {
+                alt83=1;
+            }
+            switch (alt83) {
+                case 1 :
+                    // InternalSEW.g:7303:3: rule__DeprecatedObject__DescriptionAssignment_0_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DeprecatedObject__DescriptionAssignment_0_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__3__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__4"
+    // InternalSEW.g:7311:1: rule__DeprecatedObject__Group_0__4 : rule__DeprecatedObject__Group_0__4__Impl rule__DeprecatedObject__Group_0__5 ;
+    public final void rule__DeprecatedObject__Group_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7315:1: ( rule__DeprecatedObject__Group_0__4__Impl rule__DeprecatedObject__Group_0__5 )
+            // InternalSEW.g:7316:2: rule__DeprecatedObject__Group_0__4__Impl rule__DeprecatedObject__Group_0__5
+            {
+            pushFollow(FollowSets000.FOLLOW_49);
+            rule__DeprecatedObject__Group_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__4"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__4__Impl"
+    // InternalSEW.g:7323:1: rule__DeprecatedObject__Group_0__4__Impl : ( 'as' ) ;
+    public final void rule__DeprecatedObject__Group_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7327:1: ( ( 'as' ) )
+            // InternalSEW.g:7328:1: ( 'as' )
+            {
+            // InternalSEW.g:7328:1: ( 'as' )
+            // InternalSEW.g:7329:2: 'as'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getAsKeyword_0_4()); 
+            }
+            match(input,69,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getAsKeyword_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__4__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__5"
+    // InternalSEW.g:7338:1: rule__DeprecatedObject__Group_0__5 : rule__DeprecatedObject__Group_0__5__Impl rule__DeprecatedObject__Group_0__6 ;
+    public final void rule__DeprecatedObject__Group_0__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7342:1: ( rule__DeprecatedObject__Group_0__5__Impl rule__DeprecatedObject__Group_0__6 )
+            // InternalSEW.g:7343:2: rule__DeprecatedObject__Group_0__5__Impl rule__DeprecatedObject__Group_0__6
+            {
+            pushFollow(FollowSets000.FOLLOW_49);
+            rule__DeprecatedObject__Group_0__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__5"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__5__Impl"
+    // InternalSEW.g:7350:1: rule__DeprecatedObject__Group_0__5__Impl : ( ( '&' )? ) ;
+    public final void rule__DeprecatedObject__Group_0__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7354:1: ( ( ( '&' )? ) )
+            // InternalSEW.g:7355:1: ( ( '&' )? )
+            {
+            // InternalSEW.g:7355:1: ( ( '&' )? )
+            // InternalSEW.g:7356:2: ( '&' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_0_5()); 
+            }
+            // InternalSEW.g:7357:2: ( '&' )?
+            int alt84=2;
+            int LA84_0 = input.LA(1);
+
+            if ( (LA84_0==66) ) {
+                alt84=1;
+            }
+            switch (alt84) {
+                case 1 :
+                    // InternalSEW.g:7357:3: '&'
+                    {
+                    match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_0_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__5__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__6"
+    // InternalSEW.g:7365:1: rule__DeprecatedObject__Group_0__6 : rule__DeprecatedObject__Group_0__6__Impl rule__DeprecatedObject__Group_0__7 ;
+    public final void rule__DeprecatedObject__Group_0__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7369:1: ( rule__DeprecatedObject__Group_0__6__Impl rule__DeprecatedObject__Group_0__7 )
+            // InternalSEW.g:7370:2: rule__DeprecatedObject__Group_0__6__Impl rule__DeprecatedObject__Group_0__7
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__DeprecatedObject__Group_0__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__6"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__6__Impl"
+    // InternalSEW.g:7377:1: rule__DeprecatedObject__Group_0__6__Impl : ( ( rule__DeprecatedObject__TypeAssignment_0_6 ) ) ;
+    public final void rule__DeprecatedObject__Group_0__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7381:1: ( ( ( rule__DeprecatedObject__TypeAssignment_0_6 ) ) )
+            // InternalSEW.g:7382:1: ( ( rule__DeprecatedObject__TypeAssignment_0_6 ) )
+            {
+            // InternalSEW.g:7382:1: ( ( rule__DeprecatedObject__TypeAssignment_0_6 ) )
+            // InternalSEW.g:7383:2: ( rule__DeprecatedObject__TypeAssignment_0_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_0_6()); 
+            }
+            // InternalSEW.g:7384:2: ( rule__DeprecatedObject__TypeAssignment_0_6 )
+            // InternalSEW.g:7384:3: rule__DeprecatedObject__TypeAssignment_0_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__TypeAssignment_0_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_0_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__6__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__7"
+    // InternalSEW.g:7392:1: rule__DeprecatedObject__Group_0__7 : rule__DeprecatedObject__Group_0__7__Impl rule__DeprecatedObject__Group_0__8 ;
+    public final void rule__DeprecatedObject__Group_0__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7396:1: ( rule__DeprecatedObject__Group_0__7__Impl rule__DeprecatedObject__Group_0__8 )
+            // InternalSEW.g:7397:2: rule__DeprecatedObject__Group_0__7__Impl rule__DeprecatedObject__Group_0__8
+            {
+            pushFollow(FollowSets000.FOLLOW_65);
+            rule__DeprecatedObject__Group_0__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__7"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__7__Impl"
+    // InternalSEW.g:7404:1: rule__DeprecatedObject__Group_0__7__Impl : ( 'is' ) ;
+    public final void rule__DeprecatedObject__Group_0__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7408:1: ( ( 'is' ) )
+            // InternalSEW.g:7409:1: ( 'is' )
+            {
+            // InternalSEW.g:7409:1: ( 'is' )
+            // InternalSEW.g:7410:2: 'is'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getIsKeyword_0_7()); 
+            }
+            match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getIsKeyword_0_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__7__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__8"
+    // InternalSEW.g:7419:1: rule__DeprecatedObject__Group_0__8 : rule__DeprecatedObject__Group_0__8__Impl rule__DeprecatedObject__Group_0__9 ;
+    public final void rule__DeprecatedObject__Group_0__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7423:1: ( rule__DeprecatedObject__Group_0__8__Impl rule__DeprecatedObject__Group_0__9 )
+            // InternalSEW.g:7424:2: rule__DeprecatedObject__Group_0__8__Impl rule__DeprecatedObject__Group_0__9
+            {
+            pushFollow(FollowSets000.FOLLOW_65);
+            rule__DeprecatedObject__Group_0__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__8"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__8__Impl"
+    // InternalSEW.g:7431:1: rule__DeprecatedObject__Group_0__8__Impl : ( ( rule__DeprecatedObject__ElementAssignment_0_8 )* ) ;
+    public final void rule__DeprecatedObject__Group_0__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7435:1: ( ( ( rule__DeprecatedObject__ElementAssignment_0_8 )* ) )
+            // InternalSEW.g:7436:1: ( ( rule__DeprecatedObject__ElementAssignment_0_8 )* )
+            {
+            // InternalSEW.g:7436:1: ( ( rule__DeprecatedObject__ElementAssignment_0_8 )* )
+            // InternalSEW.g:7437:2: ( rule__DeprecatedObject__ElementAssignment_0_8 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_0_8()); 
+            }
+            // InternalSEW.g:7438:2: ( rule__DeprecatedObject__ElementAssignment_0_8 )*
+            loop85:
+            do {
+                int alt85=2;
+                int LA85_0 = input.LA(1);
+
+                if ( (LA85_0==43) ) {
+                    int LA85_1 = input.LA(2);
+
+                    if ( (LA85_1==RULE_STRING||LA85_1==54||(LA85_1>=56 && LA85_1<=57)) ) {
+                        alt85=1;
+                    }
+
+
+                }
+                else if ( ((LA85_0>=RULE_XIDENDIFIER && LA85_0<=RULE_AT_IDENTIFIER)||LA85_0==14||LA85_0==18||LA85_0==42||(LA85_0>=44 && LA85_0<=47)) ) {
+                    alt85=1;
+                }
+
+
+                switch (alt85) {
+            	case 1 :
+            	    // InternalSEW.g:7438:3: rule__DeprecatedObject__ElementAssignment_0_8
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_66);
+            	    rule__DeprecatedObject__ElementAssignment_0_8();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop85;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_0_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__8__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__9"
+    // InternalSEW.g:7446:1: rule__DeprecatedObject__Group_0__9 : rule__DeprecatedObject__Group_0__9__Impl ;
+    public final void rule__DeprecatedObject__Group_0__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7450:1: ( rule__DeprecatedObject__Group_0__9__Impl )
+            // InternalSEW.g:7451:2: rule__DeprecatedObject__Group_0__9__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_0__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__9"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_0__9__Impl"
+    // InternalSEW.g:7457:1: rule__DeprecatedObject__Group_0__9__Impl : ( 'endform' ) ;
+    public final void rule__DeprecatedObject__Group_0__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7461:1: ( ( 'endform' ) )
+            // InternalSEW.g:7462:1: ( 'endform' )
+            {
+            // InternalSEW.g:7462:1: ( 'endform' )
+            // InternalSEW.g:7463:2: 'endform'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getEndformKeyword_0_9()); 
+            }
+            match(input,43,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getEndformKeyword_0_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_0__9__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__0"
+    // InternalSEW.g:7473:1: rule__DeprecatedObject__Group_1__0 : rule__DeprecatedObject__Group_1__0__Impl rule__DeprecatedObject__Group_1__1 ;
+    public final void rule__DeprecatedObject__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7477:1: ( rule__DeprecatedObject__Group_1__0__Impl rule__DeprecatedObject__Group_1__1 )
+            // InternalSEW.g:7478:2: rule__DeprecatedObject__Group_1__0__Impl rule__DeprecatedObject__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_3);
+            rule__DeprecatedObject__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__0"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__0__Impl"
+    // InternalSEW.g:7485:1: rule__DeprecatedObject__Group_1__0__Impl : ( () ) ;
+    public final void rule__DeprecatedObject__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7489:1: ( ( () ) )
+            // InternalSEW.g:7490:1: ( () )
+            {
+            // InternalSEW.g:7490:1: ( () )
+            // InternalSEW.g:7491:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getWObjectAction_1_0()); 
+            }
+            // InternalSEW.g:7492:2: ()
+            // InternalSEW.g:7492:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getWObjectAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__1"
+    // InternalSEW.g:7500:1: rule__DeprecatedObject__Group_1__1 : rule__DeprecatedObject__Group_1__1__Impl rule__DeprecatedObject__Group_1__2 ;
+    public final void rule__DeprecatedObject__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7504:1: ( rule__DeprecatedObject__Group_1__1__Impl rule__DeprecatedObject__Group_1__2 )
+            // InternalSEW.g:7505:2: rule__DeprecatedObject__Group_1__1__Impl rule__DeprecatedObject__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__DeprecatedObject__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__1"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__1__Impl"
+    // InternalSEW.g:7512:1: rule__DeprecatedObject__Group_1__1__Impl : ( 'prototype' ) ;
+    public final void rule__DeprecatedObject__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7516:1: ( ( 'prototype' ) )
+            // InternalSEW.g:7517:1: ( 'prototype' )
+            {
+            // InternalSEW.g:7517:1: ( 'prototype' )
+            // InternalSEW.g:7518:2: 'prototype'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getPrototypeKeyword_1_1()); 
+            }
+            match(input,44,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getPrototypeKeyword_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__2"
+    // InternalSEW.g:7527:1: rule__DeprecatedObject__Group_1__2 : rule__DeprecatedObject__Group_1__2__Impl rule__DeprecatedObject__Group_1__3 ;
+    public final void rule__DeprecatedObject__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7531:1: ( rule__DeprecatedObject__Group_1__2__Impl rule__DeprecatedObject__Group_1__3 )
+            // InternalSEW.g:7532:2: rule__DeprecatedObject__Group_1__2__Impl rule__DeprecatedObject__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__DeprecatedObject__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__2"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__2__Impl"
+    // InternalSEW.g:7539:1: rule__DeprecatedObject__Group_1__2__Impl : ( ( rule__DeprecatedObject__NameAssignment_1_2 ) ) ;
+    public final void rule__DeprecatedObject__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7543:1: ( ( ( rule__DeprecatedObject__NameAssignment_1_2 ) ) )
+            // InternalSEW.g:7544:1: ( ( rule__DeprecatedObject__NameAssignment_1_2 ) )
+            {
+            // InternalSEW.g:7544:1: ( ( rule__DeprecatedObject__NameAssignment_1_2 ) )
+            // InternalSEW.g:7545:2: ( rule__DeprecatedObject__NameAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_1_2()); 
+            }
+            // InternalSEW.g:7546:2: ( rule__DeprecatedObject__NameAssignment_1_2 )
+            // InternalSEW.g:7546:3: rule__DeprecatedObject__NameAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__NameAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getNameAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__3"
+    // InternalSEW.g:7554:1: rule__DeprecatedObject__Group_1__3 : rule__DeprecatedObject__Group_1__3__Impl rule__DeprecatedObject__Group_1__4 ;
+    public final void rule__DeprecatedObject__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7558:1: ( rule__DeprecatedObject__Group_1__3__Impl rule__DeprecatedObject__Group_1__4 )
+            // InternalSEW.g:7559:2: rule__DeprecatedObject__Group_1__3__Impl rule__DeprecatedObject__Group_1__4
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__DeprecatedObject__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__3"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__3__Impl"
+    // InternalSEW.g:7566:1: rule__DeprecatedObject__Group_1__3__Impl : ( ( rule__DeprecatedObject__DescriptionAssignment_1_3 )? ) ;
+    public final void rule__DeprecatedObject__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7570:1: ( ( ( rule__DeprecatedObject__DescriptionAssignment_1_3 )? ) )
+            // InternalSEW.g:7571:1: ( ( rule__DeprecatedObject__DescriptionAssignment_1_3 )? )
+            {
+            // InternalSEW.g:7571:1: ( ( rule__DeprecatedObject__DescriptionAssignment_1_3 )? )
+            // InternalSEW.g:7572:2: ( rule__DeprecatedObject__DescriptionAssignment_1_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_1_3()); 
+            }
+            // InternalSEW.g:7573:2: ( rule__DeprecatedObject__DescriptionAssignment_1_3 )?
+            int alt86=2;
+            int LA86_0 = input.LA(1);
+
+            if ( (LA86_0==RULE_STRING) ) {
+                alt86=1;
+            }
+            switch (alt86) {
+                case 1 :
+                    // InternalSEW.g:7573:3: rule__DeprecatedObject__DescriptionAssignment_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DeprecatedObject__DescriptionAssignment_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getDescriptionAssignment_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__4"
+    // InternalSEW.g:7581:1: rule__DeprecatedObject__Group_1__4 : rule__DeprecatedObject__Group_1__4__Impl rule__DeprecatedObject__Group_1__5 ;
+    public final void rule__DeprecatedObject__Group_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7585:1: ( rule__DeprecatedObject__Group_1__4__Impl rule__DeprecatedObject__Group_1__5 )
+            // InternalSEW.g:7586:2: rule__DeprecatedObject__Group_1__4__Impl rule__DeprecatedObject__Group_1__5
+            {
+            pushFollow(FollowSets000.FOLLOW_49);
+            rule__DeprecatedObject__Group_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__4"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__4__Impl"
+    // InternalSEW.g:7593:1: rule__DeprecatedObject__Group_1__4__Impl : ( 'as' ) ;
+    public final void rule__DeprecatedObject__Group_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7597:1: ( ( 'as' ) )
+            // InternalSEW.g:7598:1: ( 'as' )
+            {
+            // InternalSEW.g:7598:1: ( 'as' )
+            // InternalSEW.g:7599:2: 'as'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getAsKeyword_1_4()); 
+            }
+            match(input,69,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getAsKeyword_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__4__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__5"
+    // InternalSEW.g:7608:1: rule__DeprecatedObject__Group_1__5 : rule__DeprecatedObject__Group_1__5__Impl rule__DeprecatedObject__Group_1__6 ;
+    public final void rule__DeprecatedObject__Group_1__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7612:1: ( rule__DeprecatedObject__Group_1__5__Impl rule__DeprecatedObject__Group_1__6 )
+            // InternalSEW.g:7613:2: rule__DeprecatedObject__Group_1__5__Impl rule__DeprecatedObject__Group_1__6
+            {
+            pushFollow(FollowSets000.FOLLOW_49);
+            rule__DeprecatedObject__Group_1__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__5"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__5__Impl"
+    // InternalSEW.g:7620:1: rule__DeprecatedObject__Group_1__5__Impl : ( ( '&' )? ) ;
+    public final void rule__DeprecatedObject__Group_1__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7624:1: ( ( ( '&' )? ) )
+            // InternalSEW.g:7625:1: ( ( '&' )? )
+            {
+            // InternalSEW.g:7625:1: ( ( '&' )? )
+            // InternalSEW.g:7626:2: ( '&' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_1_5()); 
+            }
+            // InternalSEW.g:7627:2: ( '&' )?
+            int alt87=2;
+            int LA87_0 = input.LA(1);
+
+            if ( (LA87_0==66) ) {
+                alt87=1;
+            }
+            switch (alt87) {
+                case 1 :
+                    // InternalSEW.g:7627:3: '&'
+                    {
+                    match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_1_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__5__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__6"
+    // InternalSEW.g:7635:1: rule__DeprecatedObject__Group_1__6 : rule__DeprecatedObject__Group_1__6__Impl rule__DeprecatedObject__Group_1__7 ;
+    public final void rule__DeprecatedObject__Group_1__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7639:1: ( rule__DeprecatedObject__Group_1__6__Impl rule__DeprecatedObject__Group_1__7 )
+            // InternalSEW.g:7640:2: rule__DeprecatedObject__Group_1__6__Impl rule__DeprecatedObject__Group_1__7
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__DeprecatedObject__Group_1__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__6"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__6__Impl"
+    // InternalSEW.g:7647:1: rule__DeprecatedObject__Group_1__6__Impl : ( ( rule__DeprecatedObject__TypeAssignment_1_6 ) ) ;
+    public final void rule__DeprecatedObject__Group_1__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7651:1: ( ( ( rule__DeprecatedObject__TypeAssignment_1_6 ) ) )
+            // InternalSEW.g:7652:1: ( ( rule__DeprecatedObject__TypeAssignment_1_6 ) )
+            {
+            // InternalSEW.g:7652:1: ( ( rule__DeprecatedObject__TypeAssignment_1_6 ) )
+            // InternalSEW.g:7653:2: ( rule__DeprecatedObject__TypeAssignment_1_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_1_6()); 
+            }
+            // InternalSEW.g:7654:2: ( rule__DeprecatedObject__TypeAssignment_1_6 )
+            // InternalSEW.g:7654:3: rule__DeprecatedObject__TypeAssignment_1_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__TypeAssignment_1_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getTypeAssignment_1_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__6__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__7"
+    // InternalSEW.g:7662:1: rule__DeprecatedObject__Group_1__7 : rule__DeprecatedObject__Group_1__7__Impl rule__DeprecatedObject__Group_1__8 ;
+    public final void rule__DeprecatedObject__Group_1__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7666:1: ( rule__DeprecatedObject__Group_1__7__Impl rule__DeprecatedObject__Group_1__8 )
+            // InternalSEW.g:7667:2: rule__DeprecatedObject__Group_1__7__Impl rule__DeprecatedObject__Group_1__8
+            {
+            pushFollow(FollowSets000.FOLLOW_65);
+            rule__DeprecatedObject__Group_1__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__7"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__7__Impl"
+    // InternalSEW.g:7674:1: rule__DeprecatedObject__Group_1__7__Impl : ( 'is' ) ;
+    public final void rule__DeprecatedObject__Group_1__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7678:1: ( ( 'is' ) )
+            // InternalSEW.g:7679:1: ( 'is' )
+            {
+            // InternalSEW.g:7679:1: ( 'is' )
+            // InternalSEW.g:7680:2: 'is'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getIsKeyword_1_7()); 
+            }
+            match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getIsKeyword_1_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__7__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__8"
+    // InternalSEW.g:7689:1: rule__DeprecatedObject__Group_1__8 : rule__DeprecatedObject__Group_1__8__Impl rule__DeprecatedObject__Group_1__9 ;
+    public final void rule__DeprecatedObject__Group_1__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7693:1: ( rule__DeprecatedObject__Group_1__8__Impl rule__DeprecatedObject__Group_1__9 )
+            // InternalSEW.g:7694:2: rule__DeprecatedObject__Group_1__8__Impl rule__DeprecatedObject__Group_1__9
+            {
+            pushFollow(FollowSets000.FOLLOW_65);
+            rule__DeprecatedObject__Group_1__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__8"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__8__Impl"
+    // InternalSEW.g:7701:1: rule__DeprecatedObject__Group_1__8__Impl : ( ( rule__DeprecatedObject__ElementAssignment_1_8 )* ) ;
+    public final void rule__DeprecatedObject__Group_1__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7705:1: ( ( ( rule__DeprecatedObject__ElementAssignment_1_8 )* ) )
+            // InternalSEW.g:7706:1: ( ( rule__DeprecatedObject__ElementAssignment_1_8 )* )
+            {
+            // InternalSEW.g:7706:1: ( ( rule__DeprecatedObject__ElementAssignment_1_8 )* )
+            // InternalSEW.g:7707:2: ( rule__DeprecatedObject__ElementAssignment_1_8 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_1_8()); 
+            }
+            // InternalSEW.g:7708:2: ( rule__DeprecatedObject__ElementAssignment_1_8 )*
+            loop88:
+            do {
+                int alt88=2;
+                int LA88_0 = input.LA(1);
+
+                if ( (LA88_0==45) ) {
+                    int LA88_1 = input.LA(2);
+
+                    if ( (LA88_1==RULE_STRING||LA88_1==54||(LA88_1>=56 && LA88_1<=57)) ) {
+                        alt88=1;
+                    }
+
+
+                }
+                else if ( ((LA88_0>=RULE_XIDENDIFIER && LA88_0<=RULE_AT_IDENTIFIER)||LA88_0==14||LA88_0==18||(LA88_0>=42 && LA88_0<=44)||(LA88_0>=46 && LA88_0<=47)) ) {
+                    alt88=1;
+                }
+
+
+                switch (alt88) {
+            	case 1 :
+            	    // InternalSEW.g:7708:3: rule__DeprecatedObject__ElementAssignment_1_8
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_66);
+            	    rule__DeprecatedObject__ElementAssignment_1_8();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop88;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getElementAssignment_1_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__8__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__9"
+    // InternalSEW.g:7716:1: rule__DeprecatedObject__Group_1__9 : rule__DeprecatedObject__Group_1__9__Impl ;
+    public final void rule__DeprecatedObject__Group_1__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7720:1: ( rule__DeprecatedObject__Group_1__9__Impl )
+            // InternalSEW.g:7721:2: rule__DeprecatedObject__Group_1__9__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedObject__Group_1__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__9"
+
+
+    // $ANTLR start "rule__DeprecatedObject__Group_1__9__Impl"
+    // InternalSEW.g:7727:1: rule__DeprecatedObject__Group_1__9__Impl : ( 'endprototype' ) ;
+    public final void rule__DeprecatedObject__Group_1__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7731:1: ( ( 'endprototype' ) )
+            // InternalSEW.g:7732:1: ( 'endprototype' )
+            {
+            // InternalSEW.g:7732:1: ( 'endprototype' )
+            // InternalSEW.g:7733:2: 'endprototype'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getEndprototypeKeyword_1_9()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getEndprototypeKeyword_1_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__Group_1__9__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__0"
+    // InternalSEW.g:7743:1: rule__DeprecatedSection__Group_0__0 : rule__DeprecatedSection__Group_0__0__Impl rule__DeprecatedSection__Group_0__1 ;
+    public final void rule__DeprecatedSection__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7747:1: ( rule__DeprecatedSection__Group_0__0__Impl rule__DeprecatedSection__Group_0__1 )
+            // InternalSEW.g:7748:2: rule__DeprecatedSection__Group_0__0__Impl rule__DeprecatedSection__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_67);
+            rule__DeprecatedSection__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__0"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__0__Impl"
+    // InternalSEW.g:7755:1: rule__DeprecatedSection__Group_0__0__Impl : ( () ) ;
+    public final void rule__DeprecatedSection__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7759:1: ( ( () ) )
+            // InternalSEW.g:7760:1: ( () )
+            {
+            // InternalSEW.g:7760:1: ( () )
+            // InternalSEW.g:7761:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getWSectionAction_0_0()); 
+            }
+            // InternalSEW.g:7762:2: ()
+            // InternalSEW.g:7762:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getWSectionAction_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__1"
+    // InternalSEW.g:7770:1: rule__DeprecatedSection__Group_0__1 : rule__DeprecatedSection__Group_0__1__Impl rule__DeprecatedSection__Group_0__2 ;
+    public final void rule__DeprecatedSection__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7774:1: ( rule__DeprecatedSection__Group_0__1__Impl rule__DeprecatedSection__Group_0__2 )
+            // InternalSEW.g:7775:2: rule__DeprecatedSection__Group_0__1__Impl rule__DeprecatedSection__Group_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__DeprecatedSection__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__1"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__1__Impl"
+    // InternalSEW.g:7782:1: rule__DeprecatedSection__Group_0__1__Impl : ( 'section' ) ;
+    public final void rule__DeprecatedSection__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7786:1: ( ( 'section' ) )
+            // InternalSEW.g:7787:1: ( 'section' )
+            {
+            // InternalSEW.g:7787:1: ( 'section' )
+            // InternalSEW.g:7788:2: 'section'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getSectionKeyword_0_1()); 
+            }
+            match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getSectionKeyword_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__2"
+    // InternalSEW.g:7797:1: rule__DeprecatedSection__Group_0__2 : rule__DeprecatedSection__Group_0__2__Impl rule__DeprecatedSection__Group_0__3 ;
+    public final void rule__DeprecatedSection__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7801:1: ( rule__DeprecatedSection__Group_0__2__Impl rule__DeprecatedSection__Group_0__3 )
+            // InternalSEW.g:7802:2: rule__DeprecatedSection__Group_0__2__Impl rule__DeprecatedSection__Group_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_68);
+            rule__DeprecatedSection__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__2"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__2__Impl"
+    // InternalSEW.g:7809:1: rule__DeprecatedSection__Group_0__2__Impl : ( ( rule__DeprecatedSection__NameAssignment_0_2 ) ) ;
+    public final void rule__DeprecatedSection__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7813:1: ( ( ( rule__DeprecatedSection__NameAssignment_0_2 ) ) )
+            // InternalSEW.g:7814:1: ( ( rule__DeprecatedSection__NameAssignment_0_2 ) )
+            {
+            // InternalSEW.g:7814:1: ( ( rule__DeprecatedSection__NameAssignment_0_2 ) )
+            // InternalSEW.g:7815:2: ( rule__DeprecatedSection__NameAssignment_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_0_2()); 
+            }
+            // InternalSEW.g:7816:2: ( rule__DeprecatedSection__NameAssignment_0_2 )
+            // InternalSEW.g:7816:3: rule__DeprecatedSection__NameAssignment_0_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__NameAssignment_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__3"
+    // InternalSEW.g:7824:1: rule__DeprecatedSection__Group_0__3 : rule__DeprecatedSection__Group_0__3__Impl rule__DeprecatedSection__Group_0__4 ;
+    public final void rule__DeprecatedSection__Group_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7828:1: ( rule__DeprecatedSection__Group_0__3__Impl rule__DeprecatedSection__Group_0__4 )
+            // InternalSEW.g:7829:2: rule__DeprecatedSection__Group_0__3__Impl rule__DeprecatedSection__Group_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_68);
+            rule__DeprecatedSection__Group_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__3"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__3__Impl"
+    // InternalSEW.g:7836:1: rule__DeprecatedSection__Group_0__3__Impl : ( ( rule__DeprecatedSection__ElementAssignment_0_3 )* ) ;
+    public final void rule__DeprecatedSection__Group_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7840:1: ( ( ( rule__DeprecatedSection__ElementAssignment_0_3 )* ) )
+            // InternalSEW.g:7841:1: ( ( rule__DeprecatedSection__ElementAssignment_0_3 )* )
+            {
+            // InternalSEW.g:7841:1: ( ( rule__DeprecatedSection__ElementAssignment_0_3 )* )
+            // InternalSEW.g:7842:2: ( rule__DeprecatedSection__ElementAssignment_0_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_0_3()); 
+            }
+            // InternalSEW.g:7843:2: ( rule__DeprecatedSection__ElementAssignment_0_3 )*
+            loop89:
+            do {
+                int alt89=2;
+                alt89 = dfa89.predict(input);
+                switch (alt89) {
+            	case 1 :
+            	    // InternalSEW.g:7843:3: rule__DeprecatedSection__ElementAssignment_0_3
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_69);
+            	    rule__DeprecatedSection__ElementAssignment_0_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop89;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__3__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__4"
+    // InternalSEW.g:7851:1: rule__DeprecatedSection__Group_0__4 : rule__DeprecatedSection__Group_0__4__Impl rule__DeprecatedSection__Group_0__5 ;
+    public final void rule__DeprecatedSection__Group_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7855:1: ( rule__DeprecatedSection__Group_0__4__Impl rule__DeprecatedSection__Group_0__5 )
+            // InternalSEW.g:7856:2: rule__DeprecatedSection__Group_0__4__Impl rule__DeprecatedSection__Group_0__5
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__DeprecatedSection__Group_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_0__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__4"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__4__Impl"
+    // InternalSEW.g:7863:1: rule__DeprecatedSection__Group_0__4__Impl : ( 'endsection' ) ;
+    public final void rule__DeprecatedSection__Group_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7867:1: ( ( 'endsection' ) )
+            // InternalSEW.g:7868:1: ( 'endsection' )
+            {
+            // InternalSEW.g:7868:1: ( 'endsection' )
+            // InternalSEW.g:7869:2: 'endsection'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getEndsectionKeyword_0_4()); 
+            }
+            match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getEndsectionKeyword_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__4__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__5"
+    // InternalSEW.g:7878:1: rule__DeprecatedSection__Group_0__5 : rule__DeprecatedSection__Group_0__5__Impl ;
+    public final void rule__DeprecatedSection__Group_0__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7882:1: ( rule__DeprecatedSection__Group_0__5__Impl )
+            // InternalSEW.g:7883:2: rule__DeprecatedSection__Group_0__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_0__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__5"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_0__5__Impl"
+    // InternalSEW.g:7889:1: rule__DeprecatedSection__Group_0__5__Impl : ( ( ruleXID )? ) ;
+    public final void rule__DeprecatedSection__Group_0__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7893:1: ( ( ( ruleXID )? ) )
+            // InternalSEW.g:7894:1: ( ( ruleXID )? )
+            {
+            // InternalSEW.g:7894:1: ( ( ruleXID )? )
+            // InternalSEW.g:7895:2: ( ruleXID )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getXIDParserRuleCall_0_5()); 
+            }
+            // InternalSEW.g:7896:2: ( ruleXID )?
+            int alt90=2;
+            alt90 = dfa90.predict(input);
+            switch (alt90) {
+                case 1 :
+                    // InternalSEW.g:7896:3: ruleXID
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleXID();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getXIDParserRuleCall_0_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_0__5__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1__0"
+    // InternalSEW.g:7905:1: rule__DeprecatedSection__Group_1__0 : rule__DeprecatedSection__Group_1__0__Impl rule__DeprecatedSection__Group_1__1 ;
+    public final void rule__DeprecatedSection__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7909:1: ( rule__DeprecatedSection__Group_1__0__Impl rule__DeprecatedSection__Group_1__1 )
+            // InternalSEW.g:7910:2: rule__DeprecatedSection__Group_1__0__Impl rule__DeprecatedSection__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__DeprecatedSection__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1__0"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1__0__Impl"
+    // InternalSEW.g:7917:1: rule__DeprecatedSection__Group_1__0__Impl : ( ( rule__DeprecatedSection__NameAssignment_1_0 ) ) ;
+    public final void rule__DeprecatedSection__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7921:1: ( ( ( rule__DeprecatedSection__NameAssignment_1_0 ) ) )
+            // InternalSEW.g:7922:1: ( ( rule__DeprecatedSection__NameAssignment_1_0 ) )
+            {
+            // InternalSEW.g:7922:1: ( ( rule__DeprecatedSection__NameAssignment_1_0 ) )
+            // InternalSEW.g:7923:2: ( rule__DeprecatedSection__NameAssignment_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_1_0()); 
+            }
+            // InternalSEW.g:7924:2: ( rule__DeprecatedSection__NameAssignment_1_0 )
+            // InternalSEW.g:7924:3: rule__DeprecatedSection__NameAssignment_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__NameAssignment_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getNameAssignment_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1__1"
+    // InternalSEW.g:7932:1: rule__DeprecatedSection__Group_1__1 : rule__DeprecatedSection__Group_1__1__Impl rule__DeprecatedSection__Group_1__2 ;
+    public final void rule__DeprecatedSection__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7936:1: ( rule__DeprecatedSection__Group_1__1__Impl rule__DeprecatedSection__Group_1__2 )
+            // InternalSEW.g:7937:2: rule__DeprecatedSection__Group_1__1__Impl rule__DeprecatedSection__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__DeprecatedSection__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1__1"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1__1__Impl"
+    // InternalSEW.g:7944:1: rule__DeprecatedSection__Group_1__1__Impl : ( ( rule__DeprecatedSection__DescriptionAssignment_1_1 )? ) ;
+    public final void rule__DeprecatedSection__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7948:1: ( ( ( rule__DeprecatedSection__DescriptionAssignment_1_1 )? ) )
+            // InternalSEW.g:7949:1: ( ( rule__DeprecatedSection__DescriptionAssignment_1_1 )? )
+            {
+            // InternalSEW.g:7949:1: ( ( rule__DeprecatedSection__DescriptionAssignment_1_1 )? )
+            // InternalSEW.g:7950:2: ( rule__DeprecatedSection__DescriptionAssignment_1_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getDescriptionAssignment_1_1()); 
+            }
+            // InternalSEW.g:7951:2: ( rule__DeprecatedSection__DescriptionAssignment_1_1 )?
+            int alt91=2;
+            int LA91_0 = input.LA(1);
+
+            if ( (LA91_0==RULE_STRING) ) {
+                alt91=1;
+            }
+            switch (alt91) {
+                case 1 :
+                    // InternalSEW.g:7951:3: rule__DeprecatedSection__DescriptionAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DeprecatedSection__DescriptionAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getDescriptionAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1__2"
+    // InternalSEW.g:7959:1: rule__DeprecatedSection__Group_1__2 : rule__DeprecatedSection__Group_1__2__Impl ;
+    public final void rule__DeprecatedSection__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7963:1: ( rule__DeprecatedSection__Group_1__2__Impl )
+            // InternalSEW.g:7964:2: rule__DeprecatedSection__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1__2"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1__2__Impl"
+    // InternalSEW.g:7970:1: rule__DeprecatedSection__Group_1__2__Impl : ( ( rule__DeprecatedSection__Alternatives_1_2 ) ) ;
+    public final void rule__DeprecatedSection__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7974:1: ( ( ( rule__DeprecatedSection__Alternatives_1_2 ) ) )
+            // InternalSEW.g:7975:1: ( ( rule__DeprecatedSection__Alternatives_1_2 ) )
+            {
+            // InternalSEW.g:7975:1: ( ( rule__DeprecatedSection__Alternatives_1_2 ) )
+            // InternalSEW.g:7976:2: ( rule__DeprecatedSection__Alternatives_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getAlternatives_1_2()); 
+            }
+            // InternalSEW.g:7977:2: ( rule__DeprecatedSection__Alternatives_1_2 )
+            // InternalSEW.g:7977:3: rule__DeprecatedSection__Alternatives_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Alternatives_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getAlternatives_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_0__0"
+    // InternalSEW.g:7986:1: rule__DeprecatedSection__Group_1_2_0__0 : rule__DeprecatedSection__Group_1_2_0__0__Impl rule__DeprecatedSection__Group_1_2_0__1 ;
+    public final void rule__DeprecatedSection__Group_1_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:7990:1: ( rule__DeprecatedSection__Group_1_2_0__0__Impl rule__DeprecatedSection__Group_1_2_0__1 )
+            // InternalSEW.g:7991:2: rule__DeprecatedSection__Group_1_2_0__0__Impl rule__DeprecatedSection__Group_1_2_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__DeprecatedSection__Group_1_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_1_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_0__0"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_0__0__Impl"
+    // InternalSEW.g:7998:1: rule__DeprecatedSection__Group_1_2_0__0__Impl : ( '[' ) ;
+    public final void rule__DeprecatedSection__Group_1_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8002:1: ( ( '[' ) )
+            // InternalSEW.g:8003:1: ( '[' )
+            {
+            // InternalSEW.g:8003:1: ( '[' )
+            // InternalSEW.g:8004:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getLeftSquareBracketKeyword_1_2_0_0()); 
+            }
+            match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getLeftSquareBracketKeyword_1_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_0__1"
+    // InternalSEW.g:8013:1: rule__DeprecatedSection__Group_1_2_0__1 : rule__DeprecatedSection__Group_1_2_0__1__Impl rule__DeprecatedSection__Group_1_2_0__2 ;
+    public final void rule__DeprecatedSection__Group_1_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8017:1: ( rule__DeprecatedSection__Group_1_2_0__1__Impl rule__DeprecatedSection__Group_1_2_0__2 )
+            // InternalSEW.g:8018:2: rule__DeprecatedSection__Group_1_2_0__1__Impl rule__DeprecatedSection__Group_1_2_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__DeprecatedSection__Group_1_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_1_2_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_0__1"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_0__1__Impl"
+    // InternalSEW.g:8025:1: rule__DeprecatedSection__Group_1_2_0__1__Impl : ( ( rule__DeprecatedSection__ElementAssignment_1_2_0_1 )* ) ;
+    public final void rule__DeprecatedSection__Group_1_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8029:1: ( ( ( rule__DeprecatedSection__ElementAssignment_1_2_0_1 )* ) )
+            // InternalSEW.g:8030:1: ( ( rule__DeprecatedSection__ElementAssignment_1_2_0_1 )* )
+            {
+            // InternalSEW.g:8030:1: ( ( rule__DeprecatedSection__ElementAssignment_1_2_0_1 )* )
+            // InternalSEW.g:8031:2: ( rule__DeprecatedSection__ElementAssignment_1_2_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_0_1()); 
+            }
+            // InternalSEW.g:8032:2: ( rule__DeprecatedSection__ElementAssignment_1_2_0_1 )*
+            loop92:
+            do {
+                int alt92=2;
+                int LA92_0 = input.LA(1);
+
+                if ( ((LA92_0>=RULE_XIDENDIFIER && LA92_0<=RULE_AT_IDENTIFIER)||LA92_0==14||LA92_0==18||(LA92_0>=42 && LA92_0<=47)) ) {
+                    alt92=1;
+                }
+
+
+                switch (alt92) {
+            	case 1 :
+            	    // InternalSEW.g:8032:3: rule__DeprecatedSection__ElementAssignment_1_2_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_69);
+            	    rule__DeprecatedSection__ElementAssignment_1_2_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop92;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_0__2"
+    // InternalSEW.g:8040:1: rule__DeprecatedSection__Group_1_2_0__2 : rule__DeprecatedSection__Group_1_2_0__2__Impl ;
+    public final void rule__DeprecatedSection__Group_1_2_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8044:1: ( rule__DeprecatedSection__Group_1_2_0__2__Impl )
+            // InternalSEW.g:8045:2: rule__DeprecatedSection__Group_1_2_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_1_2_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_0__2"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_0__2__Impl"
+    // InternalSEW.g:8051:1: rule__DeprecatedSection__Group_1_2_0__2__Impl : ( ']' ) ;
+    public final void rule__DeprecatedSection__Group_1_2_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8055:1: ( ( ']' ) )
+            // InternalSEW.g:8056:1: ( ']' )
+            {
+            // InternalSEW.g:8056:1: ( ']' )
+            // InternalSEW.g:8057:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getRightSquareBracketKeyword_1_2_0_2()); 
+            }
+            match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getRightSquareBracketKeyword_1_2_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_0__2__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_1__0"
+    // InternalSEW.g:8067:1: rule__DeprecatedSection__Group_1_2_1__0 : rule__DeprecatedSection__Group_1_2_1__0__Impl rule__DeprecatedSection__Group_1_2_1__1 ;
+    public final void rule__DeprecatedSection__Group_1_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8071:1: ( rule__DeprecatedSection__Group_1_2_1__0__Impl rule__DeprecatedSection__Group_1_2_1__1 )
+            // InternalSEW.g:8072:2: rule__DeprecatedSection__Group_1_2_1__0__Impl rule__DeprecatedSection__Group_1_2_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_68);
+            rule__DeprecatedSection__Group_1_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_1_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_1__0"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_1__0__Impl"
+    // InternalSEW.g:8079:1: rule__DeprecatedSection__Group_1_2_1__0__Impl : ( ':' ) ;
+    public final void rule__DeprecatedSection__Group_1_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8083:1: ( ( ':' ) )
+            // InternalSEW.g:8084:1: ( ':' )
+            {
+            // InternalSEW.g:8084:1: ( ':' )
+            // InternalSEW.g:8085:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getColonKeyword_1_2_1_0()); 
+            }
+            match(input,56,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getColonKeyword_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_1__1"
+    // InternalSEW.g:8094:1: rule__DeprecatedSection__Group_1_2_1__1 : rule__DeprecatedSection__Group_1_2_1__1__Impl ;
+    public final void rule__DeprecatedSection__Group_1_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8098:1: ( rule__DeprecatedSection__Group_1_2_1__1__Impl )
+            // InternalSEW.g:8099:2: rule__DeprecatedSection__Group_1_2_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__Group_1_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_1__1"
+
+
+    // $ANTLR start "rule__DeprecatedSection__Group_1_2_1__1__Impl"
+    // InternalSEW.g:8105:1: rule__DeprecatedSection__Group_1_2_1__1__Impl : ( ( rule__DeprecatedSection__ElementAssignment_1_2_1_1 )* ) ;
+    public final void rule__DeprecatedSection__Group_1_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8109:1: ( ( ( rule__DeprecatedSection__ElementAssignment_1_2_1_1 )* ) )
+            // InternalSEW.g:8110:1: ( ( rule__DeprecatedSection__ElementAssignment_1_2_1_1 )* )
+            {
+            // InternalSEW.g:8110:1: ( ( rule__DeprecatedSection__ElementAssignment_1_2_1_1 )* )
+            // InternalSEW.g:8111:2: ( rule__DeprecatedSection__ElementAssignment_1_2_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_1_1()); 
+            }
+            // InternalSEW.g:8112:2: ( rule__DeprecatedSection__ElementAssignment_1_2_1_1 )*
+            loop93:
+            do {
+                int alt93=2;
+                alt93 = dfa93.predict(input);
+                switch (alt93) {
+            	case 1 :
+            	    // InternalSEW.g:8112:3: rule__DeprecatedSection__ElementAssignment_1_2_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_69);
+            	    rule__DeprecatedSection__ElementAssignment_1_2_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop93;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getElementAssignment_1_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__Group_1_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__0"
+    // InternalSEW.g:8121:1: rule__DeprecatedAttribute__Group__0 : rule__DeprecatedAttribute__Group__0__Impl rule__DeprecatedAttribute__Group__1 ;
+    public final void rule__DeprecatedAttribute__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8125:1: ( rule__DeprecatedAttribute__Group__0__Impl rule__DeprecatedAttribute__Group__1 )
+            // InternalSEW.g:8126:2: rule__DeprecatedAttribute__Group__0__Impl rule__DeprecatedAttribute__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_65);
+            rule__DeprecatedAttribute__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedAttribute__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__0"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__0__Impl"
+    // InternalSEW.g:8133:1: rule__DeprecatedAttribute__Group__0__Impl : ( () ) ;
+    public final void rule__DeprecatedAttribute__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8137:1: ( ( () ) )
+            // InternalSEW.g:8138:1: ( () )
+            {
+            // InternalSEW.g:8138:1: ( () )
+            // InternalSEW.g:8139:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeAccess().getWAttributeAction_0()); 
+            }
+            // InternalSEW.g:8140:2: ()
+            // InternalSEW.g:8140:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeAccess().getWAttributeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__1"
+    // InternalSEW.g:8148:1: rule__DeprecatedAttribute__Group__1 : rule__DeprecatedAttribute__Group__1__Impl rule__DeprecatedAttribute__Group__2 ;
+    public final void rule__DeprecatedAttribute__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8152:1: ( rule__DeprecatedAttribute__Group__1__Impl rule__DeprecatedAttribute__Group__2 )
+            // InternalSEW.g:8153:2: rule__DeprecatedAttribute__Group__1__Impl rule__DeprecatedAttribute__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_19);
+            rule__DeprecatedAttribute__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedAttribute__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__1"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__1__Impl"
+    // InternalSEW.g:8160:1: rule__DeprecatedAttribute__Group__1__Impl : ( ( rule__DeprecatedAttribute__NameAssignment_1 ) ) ;
+    public final void rule__DeprecatedAttribute__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8164:1: ( ( ( rule__DeprecatedAttribute__NameAssignment_1 ) ) )
+            // InternalSEW.g:8165:1: ( ( rule__DeprecatedAttribute__NameAssignment_1 ) )
+            {
+            // InternalSEW.g:8165:1: ( ( rule__DeprecatedAttribute__NameAssignment_1 ) )
+            // InternalSEW.g:8166:2: ( rule__DeprecatedAttribute__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeAccess().getNameAssignment_1()); 
+            }
+            // InternalSEW.g:8167:2: ( rule__DeprecatedAttribute__NameAssignment_1 )
+            // InternalSEW.g:8167:3: rule__DeprecatedAttribute__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedAttribute__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__1__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__2"
+    // InternalSEW.g:8175:1: rule__DeprecatedAttribute__Group__2 : rule__DeprecatedAttribute__Group__2__Impl rule__DeprecatedAttribute__Group__3 ;
+    public final void rule__DeprecatedAttribute__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8179:1: ( rule__DeprecatedAttribute__Group__2__Impl rule__DeprecatedAttribute__Group__3 )
+            // InternalSEW.g:8180:2: rule__DeprecatedAttribute__Group__2__Impl rule__DeprecatedAttribute__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__DeprecatedAttribute__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedAttribute__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__2"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__2__Impl"
+    // InternalSEW.g:8187:1: rule__DeprecatedAttribute__Group__2__Impl : ( '=' ) ;
+    public final void rule__DeprecatedAttribute__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8191:1: ( ( '=' ) )
+            // InternalSEW.g:8192:1: ( '=' )
+            {
+            // InternalSEW.g:8192:1: ( '=' )
+            // InternalSEW.g:8193:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeAccess().getEqualsSignKeyword_2()); 
+            }
+            match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeAccess().getEqualsSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__3"
+    // InternalSEW.g:8202:1: rule__DeprecatedAttribute__Group__3 : rule__DeprecatedAttribute__Group__3__Impl rule__DeprecatedAttribute__Group__4 ;
+    public final void rule__DeprecatedAttribute__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8206:1: ( rule__DeprecatedAttribute__Group__3__Impl rule__DeprecatedAttribute__Group__4 )
+            // InternalSEW.g:8207:2: rule__DeprecatedAttribute__Group__3__Impl rule__DeprecatedAttribute__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__DeprecatedAttribute__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedAttribute__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__3"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__3__Impl"
+    // InternalSEW.g:8214:1: rule__DeprecatedAttribute__Group__3__Impl : ( ( rule__DeprecatedAttribute__ValueAssignment_3 ) ) ;
+    public final void rule__DeprecatedAttribute__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8218:1: ( ( ( rule__DeprecatedAttribute__ValueAssignment_3 ) ) )
+            // InternalSEW.g:8219:1: ( ( rule__DeprecatedAttribute__ValueAssignment_3 ) )
+            {
+            // InternalSEW.g:8219:1: ( ( rule__DeprecatedAttribute__ValueAssignment_3 ) )
+            // InternalSEW.g:8220:2: ( rule__DeprecatedAttribute__ValueAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeAccess().getValueAssignment_3()); 
+            }
+            // InternalSEW.g:8221:2: ( rule__DeprecatedAttribute__ValueAssignment_3 )
+            // InternalSEW.g:8221:3: rule__DeprecatedAttribute__ValueAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedAttribute__ValueAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeAccess().getValueAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__3__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__4"
+    // InternalSEW.g:8229:1: rule__DeprecatedAttribute__Group__4 : rule__DeprecatedAttribute__Group__4__Impl ;
+    public final void rule__DeprecatedAttribute__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8233:1: ( rule__DeprecatedAttribute__Group__4__Impl )
+            // InternalSEW.g:8234:2: rule__DeprecatedAttribute__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedAttribute__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__4"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__Group__4__Impl"
+    // InternalSEW.g:8240:1: rule__DeprecatedAttribute__Group__4__Impl : ( ( ';' )? ) ;
+    public final void rule__DeprecatedAttribute__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8244:1: ( ( ( ';' )? ) )
+            // InternalSEW.g:8245:1: ( ( ';' )? )
+            {
+            // InternalSEW.g:8245:1: ( ( ';' )? )
+            // InternalSEW.g:8246:2: ( ';' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeAccess().getSemicolonKeyword_4()); 
+            }
+            // InternalSEW.g:8247:2: ( ';' )?
+            int alt94=2;
+            int LA94_0 = input.LA(1);
+
+            if ( (LA94_0==58) ) {
+                alt94=1;
+            }
+            switch (alt94) {
+                case 1 :
+                    // InternalSEW.g:8247:3: ';'
+                    {
+                    match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeAccess().getSemicolonKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__Group__4__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__0"
+    // InternalSEW.g:8256:1: rule__DeprecatedExpression__Group__0 : rule__DeprecatedExpression__Group__0__Impl rule__DeprecatedExpression__Group__1 ;
+    public final void rule__DeprecatedExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8260:1: ( rule__DeprecatedExpression__Group__0__Impl rule__DeprecatedExpression__Group__1 )
+            // InternalSEW.g:8261:2: rule__DeprecatedExpression__Group__0__Impl rule__DeprecatedExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__DeprecatedExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__0"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__0__Impl"
+    // InternalSEW.g:8268:1: rule__DeprecatedExpression__Group__0__Impl : ( () ) ;
+    public final void rule__DeprecatedExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8272:1: ( ( () ) )
+            // InternalSEW.g:8273:1: ( () )
+            {
+            // InternalSEW.g:8273:1: ( () )
+            // InternalSEW.g:8274:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedExpressionAccess().getExpressionAction_0()); 
+            }
+            // InternalSEW.g:8275:2: ()
+            // InternalSEW.g:8275:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedExpressionAccess().getExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__1"
+    // InternalSEW.g:8283:1: rule__DeprecatedExpression__Group__1 : rule__DeprecatedExpression__Group__1__Impl rule__DeprecatedExpression__Group__2 ;
+    public final void rule__DeprecatedExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8287:1: ( rule__DeprecatedExpression__Group__1__Impl rule__DeprecatedExpression__Group__2 )
+            // InternalSEW.g:8288:2: rule__DeprecatedExpression__Group__1__Impl rule__DeprecatedExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__DeprecatedExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__1"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__1__Impl"
+    // InternalSEW.g:8295:1: rule__DeprecatedExpression__Group__1__Impl : ( '${' ) ;
+    public final void rule__DeprecatedExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8299:1: ( ( '${' ) )
+            // InternalSEW.g:8300:1: ( '${' )
+            {
+            // InternalSEW.g:8300:1: ( '${' )
+            // InternalSEW.g:8301:2: '${'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedExpressionAccess().getDollarSignLeftCurlyBracketKeyword_1()); 
+            }
+            match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedExpressionAccess().getDollarSignLeftCurlyBracketKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__2"
+    // InternalSEW.g:8310:1: rule__DeprecatedExpression__Group__2 : rule__DeprecatedExpression__Group__2__Impl rule__DeprecatedExpression__Group__3 ;
+    public final void rule__DeprecatedExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8314:1: ( rule__DeprecatedExpression__Group__2__Impl rule__DeprecatedExpression__Group__3 )
+            // InternalSEW.g:8315:2: rule__DeprecatedExpression__Group__2__Impl rule__DeprecatedExpression__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_72);
+            rule__DeprecatedExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__2"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__2__Impl"
+    // InternalSEW.g:8322:1: rule__DeprecatedExpression__Group__2__Impl : ( ( rule__DeprecatedExpression__OperatorAssignment_2 ) ) ;
+    public final void rule__DeprecatedExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8326:1: ( ( ( rule__DeprecatedExpression__OperatorAssignment_2 ) ) )
+            // InternalSEW.g:8327:1: ( ( rule__DeprecatedExpression__OperatorAssignment_2 ) )
+            {
+            // InternalSEW.g:8327:1: ( ( rule__DeprecatedExpression__OperatorAssignment_2 ) )
+            // InternalSEW.g:8328:2: ( rule__DeprecatedExpression__OperatorAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedExpressionAccess().getOperatorAssignment_2()); 
+            }
+            // InternalSEW.g:8329:2: ( rule__DeprecatedExpression__OperatorAssignment_2 )
+            // InternalSEW.g:8329:3: rule__DeprecatedExpression__OperatorAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedExpression__OperatorAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedExpressionAccess().getOperatorAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__3"
+    // InternalSEW.g:8337:1: rule__DeprecatedExpression__Group__3 : rule__DeprecatedExpression__Group__3__Impl rule__DeprecatedExpression__Group__4 ;
+    public final void rule__DeprecatedExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8341:1: ( rule__DeprecatedExpression__Group__3__Impl rule__DeprecatedExpression__Group__4 )
+            // InternalSEW.g:8342:2: rule__DeprecatedExpression__Group__3__Impl rule__DeprecatedExpression__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_72);
+            rule__DeprecatedExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedExpression__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__3"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__3__Impl"
+    // InternalSEW.g:8349:1: rule__DeprecatedExpression__Group__3__Impl : ( ( rule__DeprecatedExpression__OperandAssignment_3 )* ) ;
+    public final void rule__DeprecatedExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8353:1: ( ( ( rule__DeprecatedExpression__OperandAssignment_3 )* ) )
+            // InternalSEW.g:8354:1: ( ( rule__DeprecatedExpression__OperandAssignment_3 )* )
+            {
+            // InternalSEW.g:8354:1: ( ( rule__DeprecatedExpression__OperandAssignment_3 )* )
+            // InternalSEW.g:8355:2: ( rule__DeprecatedExpression__OperandAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedExpressionAccess().getOperandAssignment_3()); 
+            }
+            // InternalSEW.g:8356:2: ( rule__DeprecatedExpression__OperandAssignment_3 )*
+            loop95:
+            do {
+                int alt95=2;
+                int LA95_0 = input.LA(1);
+
+                if ( ((LA95_0>=RULE_CHARACTER && LA95_0<=RULE_XIDENDIFIER)||LA95_0==RULE_INT||LA95_0==14||LA95_0==18||LA95_0==20||(LA95_0>=36 && LA95_0<=47)||LA95_0==54||LA95_0==59||LA95_0==64||(LA95_0>=66 && LA95_0<=68)||LA95_0==71||(LA95_0>=73 && LA95_0<=79)) ) {
+                    alt95=1;
+                }
+
+
+                switch (alt95) {
+            	case 1 :
+            	    // InternalSEW.g:8356:3: rule__DeprecatedExpression__OperandAssignment_3
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_73);
+            	    rule__DeprecatedExpression__OperandAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop95;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedExpressionAccess().getOperandAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__4"
+    // InternalSEW.g:8364:1: rule__DeprecatedExpression__Group__4 : rule__DeprecatedExpression__Group__4__Impl ;
+    public final void rule__DeprecatedExpression__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8368:1: ( rule__DeprecatedExpression__Group__4__Impl )
+            // InternalSEW.g:8369:2: rule__DeprecatedExpression__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedExpression__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__4"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__Group__4__Impl"
+    // InternalSEW.g:8375:1: rule__DeprecatedExpression__Group__4__Impl : ( '}' ) ;
+    public final void rule__DeprecatedExpression__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8379:1: ( ( '}' ) )
+            // InternalSEW.g:8380:1: ( '}' )
+            {
+            // InternalSEW.g:8380:1: ( '}' )
+            // InternalSEW.g:8381:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedExpressionAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedExpressionAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Workflow__TypeAssignment_2_0_0"
+    // InternalSEW.g:8391:1: rule__Workflow__TypeAssignment_2_0_0 : ( ( rule__Workflow__TypeAlternatives_2_0_0_0 ) ) ;
+    public final void rule__Workflow__TypeAssignment_2_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8395:1: ( ( ( rule__Workflow__TypeAlternatives_2_0_0_0 ) ) )
+            // InternalSEW.g:8396:2: ( ( rule__Workflow__TypeAlternatives_2_0_0_0 ) )
+            {
+            // InternalSEW.g:8396:2: ( ( rule__Workflow__TypeAlternatives_2_0_0_0 ) )
+            // InternalSEW.g:8397:3: ( rule__Workflow__TypeAlternatives_2_0_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getTypeAlternatives_2_0_0_0()); 
+            }
+            // InternalSEW.g:8398:3: ( rule__Workflow__TypeAlternatives_2_0_0_0 )
+            // InternalSEW.g:8398:4: rule__Workflow__TypeAlternatives_2_0_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__TypeAlternatives_2_0_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getTypeAlternatives_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__TypeAssignment_2_0_0"
+
+
+    // $ANTLR start "rule__Workflow__NameAssignment_2_0_1"
+    // InternalSEW.g:8406:1: rule__Workflow__NameAssignment_2_0_1 : ( ruleUFI ) ;
+    public final void rule__Workflow__NameAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8410:1: ( ( ruleUFI ) )
+            // InternalSEW.g:8411:2: ( ruleUFI )
+            {
+            // InternalSEW.g:8411:2: ( ruleUFI )
+            // InternalSEW.g:8412:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getNameUFIParserRuleCall_2_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getNameUFIParserRuleCall_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__NameAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__Workflow__DescriptionAssignment_2_0_2"
+    // InternalSEW.g:8421:1: rule__Workflow__DescriptionAssignment_2_0_2 : ( ruleEString ) ;
+    public final void rule__Workflow__DescriptionAssignment_2_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8425:1: ( ( ruleEString ) )
+            // InternalSEW.g:8426:2: ( ruleEString )
+            {
+            // InternalSEW.g:8426:2: ( ruleEString )
+            // InternalSEW.g:8427:3: ruleEString
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getDescriptionEStringParserRuleCall_2_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getDescriptionEStringParserRuleCall_2_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__DescriptionAssignment_2_0_2"
+
+
+    // $ANTLR start "rule__Workflow__ElementAssignment_2_0_4"
+    // InternalSEW.g:8436:1: rule__Workflow__ElementAssignment_2_0_4 : ( ( rule__Workflow__ElementAlternatives_2_0_4_0 ) ) ;
+    public final void rule__Workflow__ElementAssignment_2_0_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8440:1: ( ( ( rule__Workflow__ElementAlternatives_2_0_4_0 ) ) )
+            // InternalSEW.g:8441:2: ( ( rule__Workflow__ElementAlternatives_2_0_4_0 ) )
+            {
+            // InternalSEW.g:8441:2: ( ( rule__Workflow__ElementAlternatives_2_0_4_0 ) )
+            // InternalSEW.g:8442:3: ( rule__Workflow__ElementAlternatives_2_0_4_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getElementAlternatives_2_0_4_0()); 
+            }
+            // InternalSEW.g:8443:3: ( rule__Workflow__ElementAlternatives_2_0_4_0 )
+            // InternalSEW.g:8443:4: rule__Workflow__ElementAlternatives_2_0_4_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Workflow__ElementAlternatives_2_0_4_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getElementAlternatives_2_0_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__ElementAssignment_2_0_4"
+
+
+    // $ANTLR start "rule__Workflow__ElementAssignment_2_1"
+    // InternalSEW.g:8451:1: rule__Workflow__ElementAssignment_2_1 : ( ruleDeprecatedObject ) ;
+    public final void rule__Workflow__ElementAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8455:1: ( ( ruleDeprecatedObject ) )
+            // InternalSEW.g:8456:2: ( ruleDeprecatedObject )
+            {
+            // InternalSEW.g:8456:2: ( ruleDeprecatedObject )
+            // InternalSEW.g:8457:3: ruleDeprecatedObject
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWorkflowAccess().getElementDeprecatedObjectParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDeprecatedObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWorkflowAccess().getElementDeprecatedObjectParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Workflow__ElementAssignment_2_1"
+
+
+    // $ANTLR start "rule__Object__TypeAssignment_0_1"
+    // InternalSEW.g:8466:1: rule__Object__TypeAssignment_0_1 : ( ruleUFI ) ;
+    public final void rule__Object__TypeAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8470:1: ( ( ruleUFI ) )
+            // InternalSEW.g:8471:2: ( ruleUFI )
+            {
+            // InternalSEW.g:8471:2: ( ruleUFI )
+            // InternalSEW.g:8472:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__TypeAssignment_0_1"
+
+
+    // $ANTLR start "rule__Object__NameAssignment_0_2"
+    // InternalSEW.g:8481:1: rule__Object__NameAssignment_0_2 : ( ruleUFI ) ;
+    public final void rule__Object__NameAssignment_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8485:1: ( ( ruleUFI ) )
+            // InternalSEW.g:8486:2: ( ruleUFI )
+            {
+            // InternalSEW.g:8486:2: ( ruleUFI )
+            // InternalSEW.g:8487:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__NameAssignment_0_2"
+
+
+    // $ANTLR start "rule__Object__DescriptionAssignment_0_3"
+    // InternalSEW.g:8496:1: rule__Object__DescriptionAssignment_0_3 : ( ruleEString ) ;
+    public final void rule__Object__DescriptionAssignment_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8500:1: ( ( ruleEString ) )
+            // InternalSEW.g:8501:2: ( ruleEString )
+            {
+            // InternalSEW.g:8501:2: ( ruleEString )
+            // InternalSEW.g:8502:3: ruleEString
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_0_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__DescriptionAssignment_0_3"
+
+
+    // $ANTLR start "rule__Object__ElementAssignment_0_5"
+    // InternalSEW.g:8511:1: rule__Object__ElementAssignment_0_5 : ( ( rule__Object__ElementAlternatives_0_5_0 ) ) ;
+    public final void rule__Object__ElementAssignment_0_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8515:1: ( ( ( rule__Object__ElementAlternatives_0_5_0 ) ) )
+            // InternalSEW.g:8516:2: ( ( rule__Object__ElementAlternatives_0_5_0 ) )
+            {
+            // InternalSEW.g:8516:2: ( ( rule__Object__ElementAlternatives_0_5_0 ) )
+            // InternalSEW.g:8517:3: ( rule__Object__ElementAlternatives_0_5_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getElementAlternatives_0_5_0()); 
+            }
+            // InternalSEW.g:8518:3: ( rule__Object__ElementAlternatives_0_5_0 )
+            // InternalSEW.g:8518:4: rule__Object__ElementAlternatives_0_5_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__ElementAlternatives_0_5_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getElementAlternatives_0_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__ElementAssignment_0_5"
+
+
+    // $ANTLR start "rule__Object__NameAssignment_1_1"
+    // InternalSEW.g:8526:1: rule__Object__NameAssignment_1_1 : ( ruleUFI ) ;
+    public final void rule__Object__NameAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8530:1: ( ( ruleUFI ) )
+            // InternalSEW.g:8531:2: ( ruleUFI )
+            {
+            // InternalSEW.g:8531:2: ( ruleUFI )
+            // InternalSEW.g:8532:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__NameAssignment_1_1"
+
+
+    // $ANTLR start "rule__Object__TypeAssignment_1_3_0"
+    // InternalSEW.g:8541:1: rule__Object__TypeAssignment_1_3_0 : ( ruleUFI ) ;
+    public final void rule__Object__TypeAssignment_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8545:1: ( ( ruleUFI ) )
+            // InternalSEW.g:8546:2: ( ruleUFI )
+            {
+            // InternalSEW.g:8546:2: ( ruleUFI )
+            // InternalSEW.g:8547:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_1_3_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_1_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__TypeAssignment_1_3_0"
+
+
+    // $ANTLR start "rule__Object__DescriptionAssignment_1_3_1"
+    // InternalSEW.g:8556:1: rule__Object__DescriptionAssignment_1_3_1 : ( ruleEString ) ;
+    public final void rule__Object__DescriptionAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8560:1: ( ( ruleEString ) )
+            // InternalSEW.g:8561:2: ( ruleEString )
+            {
+            // InternalSEW.g:8561:2: ( ruleEString )
+            // InternalSEW.g:8562:3: ruleEString
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__DescriptionAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__Object__ElementAssignment_1_5"
+    // InternalSEW.g:8571:1: rule__Object__ElementAssignment_1_5 : ( ( rule__Object__ElementAlternatives_1_5_0 ) ) ;
+    public final void rule__Object__ElementAssignment_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8575:1: ( ( ( rule__Object__ElementAlternatives_1_5_0 ) ) )
+            // InternalSEW.g:8576:2: ( ( rule__Object__ElementAlternatives_1_5_0 ) )
+            {
+            // InternalSEW.g:8576:2: ( ( rule__Object__ElementAlternatives_1_5_0 ) )
+            // InternalSEW.g:8577:3: ( rule__Object__ElementAlternatives_1_5_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getObjectAccess().getElementAlternatives_1_5_0()); 
+            }
+            // InternalSEW.g:8578:3: ( rule__Object__ElementAlternatives_1_5_0 )
+            // InternalSEW.g:8578:4: rule__Object__ElementAlternatives_1_5_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Object__ElementAlternatives_1_5_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getObjectAccess().getElementAlternatives_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Object__ElementAssignment_1_5"
+
+
+    // $ANTLR start "rule__Section__NameAssignment_0"
+    // InternalSEW.g:8586:1: rule__Section__NameAssignment_0 : ( ruleXID ) ;
+    public final void rule__Section__NameAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8590:1: ( ( ruleXID ) )
+            // InternalSEW.g:8591:2: ( ruleXID )
+            {
+            // InternalSEW.g:8591:2: ( ruleXID )
+            // InternalSEW.g:8592:3: ruleXID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getNameXIDParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getNameXIDParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__NameAssignment_0"
+
+
+    // $ANTLR start "rule__Section__DescriptionAssignment_1"
+    // InternalSEW.g:8601:1: rule__Section__DescriptionAssignment_1 : ( ruleEString ) ;
+    public final void rule__Section__DescriptionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8605:1: ( ( ruleEString ) )
+            // InternalSEW.g:8606:2: ( ruleEString )
+            {
+            // InternalSEW.g:8606:2: ( ruleEString )
+            // InternalSEW.g:8607:3: ruleEString
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getDescriptionEStringParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getDescriptionEStringParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__DescriptionAssignment_1"
+
+
+    // $ANTLR start "rule__Section__ElementAssignment_2_0_1"
+    // InternalSEW.g:8616:1: rule__Section__ElementAssignment_2_0_1 : ( ( rule__Section__ElementAlternatives_2_0_1_0 ) ) ;
+    public final void rule__Section__ElementAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8620:1: ( ( ( rule__Section__ElementAlternatives_2_0_1_0 ) ) )
+            // InternalSEW.g:8621:2: ( ( rule__Section__ElementAlternatives_2_0_1_0 ) )
+            {
+            // InternalSEW.g:8621:2: ( ( rule__Section__ElementAlternatives_2_0_1_0 ) )
+            // InternalSEW.g:8622:3: ( rule__Section__ElementAlternatives_2_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getElementAlternatives_2_0_1_0()); 
+            }
+            // InternalSEW.g:8623:3: ( rule__Section__ElementAlternatives_2_0_1_0 )
+            // InternalSEW.g:8623:4: rule__Section__ElementAlternatives_2_0_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__ElementAlternatives_2_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getElementAlternatives_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__ElementAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__Section__ElementAssignment_2_1_1"
+    // InternalSEW.g:8631:1: rule__Section__ElementAssignment_2_1_1 : ( ( rule__Section__ElementAlternatives_2_1_1_0 ) ) ;
+    public final void rule__Section__ElementAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8635:1: ( ( ( rule__Section__ElementAlternatives_2_1_1_0 ) ) )
+            // InternalSEW.g:8636:2: ( ( rule__Section__ElementAlternatives_2_1_1_0 ) )
+            {
+            // InternalSEW.g:8636:2: ( ( rule__Section__ElementAlternatives_2_1_1_0 ) )
+            // InternalSEW.g:8637:3: ( rule__Section__ElementAlternatives_2_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSectionAccess().getElementAlternatives_2_1_1_0()); 
+            }
+            // InternalSEW.g:8638:3: ( rule__Section__ElementAlternatives_2_1_1_0 )
+            // InternalSEW.g:8638:4: rule__Section__ElementAlternatives_2_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Section__ElementAlternatives_2_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSectionAccess().getElementAlternatives_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Section__ElementAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__Attribute__NameAssignment_1"
+    // InternalSEW.g:8646:1: rule__Attribute__NameAssignment_1 : ( ruleXID ) ;
+    public final void rule__Attribute__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8650:1: ( ( ruleXID ) )
+            // InternalSEW.g:8651:2: ( ruleXID )
+            {
+            // InternalSEW.g:8651:2: ( ruleXID )
+            // InternalSEW.g:8652:3: ruleXID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAttributeAccess().getNameXIDParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAttributeAccess().getNameXIDParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__NameAssignment_1"
+
+
+    // $ANTLR start "rule__Attribute__ValueAssignment_3"
+    // InternalSEW.g:8661:1: rule__Attribute__ValueAssignment_3 : ( ruleValueSpecification ) ;
+    public final void rule__Attribute__ValueAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8665:1: ( ( ruleValueSpecification ) )
+            // InternalSEW.g:8666:2: ( ruleValueSpecification )
+            {
+            // InternalSEW.g:8666:2: ( ruleValueSpecification )
+            // InternalSEW.g:8667:3: ruleValueSpecification
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAttributeAccess().getValueValueSpecificationParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueSpecification();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAttributeAccess().getValueValueSpecificationParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Attribute__ValueAssignment_3"
+
+
+    // $ANTLR start "rule__ConditionalExpression__OperatorAssignment_1_1"
+    // InternalSEW.g:8676:1: rule__ConditionalExpression__OperatorAssignment_1_1 : ( ( '?' ) ) ;
+    public final void rule__ConditionalExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8680:1: ( ( ( '?' ) ) )
+            // InternalSEW.g:8681:2: ( ( '?' ) )
+            {
+            // InternalSEW.g:8681:2: ( ( '?' ) )
+            // InternalSEW.g:8682:3: ( '?' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); 
+            }
+            // InternalSEW.g:8683:3: ( '?' )
+            // InternalSEW.g:8684:4: '?'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); 
+            }
+            match(input,72,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__ConditionalExpression__OperandAssignment_1_2"
+    // InternalSEW.g:8695:1: rule__ConditionalExpression__OperandAssignment_1_2 : ( ruleExpression ) ;
+    public final void rule__ConditionalExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8699:1: ( ( ruleExpression ) )
+            // InternalSEW.g:8700:2: ( ruleExpression )
+            {
+            // InternalSEW.g:8700:2: ( ruleExpression )
+            // InternalSEW.g:8701:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__ConditionalExpression__OperandAssignment_1_4"
+    // InternalSEW.g:8710:1: rule__ConditionalExpression__OperandAssignment_1_4 : ( ruleExpression ) ;
+    public final void rule__ConditionalExpression__OperandAssignment_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8714:1: ( ( ruleExpression ) )
+            // InternalSEW.g:8715:2: ( ruleExpression )
+            {
+            // InternalSEW.g:8715:2: ( ruleExpression )
+            // InternalSEW.g:8716:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalExpression__OperandAssignment_1_4"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__OperatorAssignment_1_1"
+    // InternalSEW.g:8725:1: rule__ConditionalOrExpression__OperatorAssignment_1_1 : ( ( rule__ConditionalOrExpression__OperatorAlternatives_1_1_0 ) ) ;
+    public final void rule__ConditionalOrExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8729:1: ( ( ( rule__ConditionalOrExpression__OperatorAlternatives_1_1_0 ) ) )
+            // InternalSEW.g:8730:2: ( ( rule__ConditionalOrExpression__OperatorAlternatives_1_1_0 ) )
+            {
+            // InternalSEW.g:8730:2: ( ( rule__ConditionalOrExpression__OperatorAlternatives_1_1_0 ) )
+            // InternalSEW.g:8731:3: ( rule__ConditionalOrExpression__OperatorAlternatives_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+            // InternalSEW.g:8732:3: ( rule__ConditionalOrExpression__OperatorAlternatives_1_1_0 )
+            // InternalSEW.g:8732:4: rule__ConditionalOrExpression__OperatorAlternatives_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalOrExpression__OperatorAlternatives_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__OperandAssignment_1_2"
+    // InternalSEW.g:8740:1: rule__ConditionalOrExpression__OperandAssignment_1_2 : ( ruleconditionalAndExpression ) ;
+    public final void rule__ConditionalOrExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8744:1: ( ( ruleconditionalAndExpression ) )
+            // InternalSEW.g:8745:2: ( ruleconditionalAndExpression )
+            {
+            // InternalSEW.g:8745:2: ( ruleconditionalAndExpression )
+            // InternalSEW.g:8746:3: ruleconditionalAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleconditionalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__ConditionalOrExpression__OperandAssignment_1_3_1"
+    // InternalSEW.g:8755:1: rule__ConditionalOrExpression__OperandAssignment_1_3_1 : ( ruleconditionalAndExpression ) ;
+    public final void rule__ConditionalOrExpression__OperandAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8759:1: ( ( ruleconditionalAndExpression ) )
+            // InternalSEW.g:8760:2: ( ruleconditionalAndExpression )
+            {
+            // InternalSEW.g:8760:2: ( ruleconditionalAndExpression )
+            // InternalSEW.g:8761:3: ruleconditionalAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleconditionalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalOrExpression__OperandAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__OperatorAssignment_1_1"
+    // InternalSEW.g:8770:1: rule__ConditionalAndExpression__OperatorAssignment_1_1 : ( ( rule__ConditionalAndExpression__OperatorAlternatives_1_1_0 ) ) ;
+    public final void rule__ConditionalAndExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8774:1: ( ( ( rule__ConditionalAndExpression__OperatorAlternatives_1_1_0 ) ) )
+            // InternalSEW.g:8775:2: ( ( rule__ConditionalAndExpression__OperatorAlternatives_1_1_0 ) )
+            {
+            // InternalSEW.g:8775:2: ( ( rule__ConditionalAndExpression__OperatorAlternatives_1_1_0 ) )
+            // InternalSEW.g:8776:3: ( rule__ConditionalAndExpression__OperatorAlternatives_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+            // InternalSEW.g:8777:3: ( rule__ConditionalAndExpression__OperatorAlternatives_1_1_0 )
+            // InternalSEW.g:8777:4: rule__ConditionalAndExpression__OperatorAlternatives_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalAndExpression__OperatorAlternatives_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__OperandAssignment_1_2"
+    // InternalSEW.g:8785:1: rule__ConditionalAndExpression__OperandAssignment_1_2 : ( ruleequalityExpression ) ;
+    public final void rule__ConditionalAndExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8789:1: ( ( ruleequalityExpression ) )
+            // InternalSEW.g:8790:2: ( ruleequalityExpression )
+            {
+            // InternalSEW.g:8790:2: ( ruleequalityExpression )
+            // InternalSEW.g:8791:3: ruleequalityExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleequalityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__ConditionalAndExpression__OperandAssignment_1_3_1"
+    // InternalSEW.g:8800:1: rule__ConditionalAndExpression__OperandAssignment_1_3_1 : ( ruleequalityExpression ) ;
+    public final void rule__ConditionalAndExpression__OperandAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8804:1: ( ( ruleequalityExpression ) )
+            // InternalSEW.g:8805:2: ( ruleequalityExpression )
+            {
+            // InternalSEW.g:8805:2: ( ruleequalityExpression )
+            // InternalSEW.g:8806:3: ruleequalityExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleequalityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalAndExpression__OperandAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__EqualityExpression__OperatorAssignment_1_1"
+    // InternalSEW.g:8815:1: rule__EqualityExpression__OperatorAssignment_1_1 : ( ( rule__EqualityExpression__OperatorAlternatives_1_1_0 ) ) ;
+    public final void rule__EqualityExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8819:1: ( ( ( rule__EqualityExpression__OperatorAlternatives_1_1_0 ) ) )
+            // InternalSEW.g:8820:2: ( ( rule__EqualityExpression__OperatorAlternatives_1_1_0 ) )
+            {
+            // InternalSEW.g:8820:2: ( ( rule__EqualityExpression__OperatorAlternatives_1_1_0 ) )
+            // InternalSEW.g:8821:3: ( rule__EqualityExpression__OperatorAlternatives_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+            // InternalSEW.g:8822:3: ( rule__EqualityExpression__OperatorAlternatives_1_1_0 )
+            // InternalSEW.g:8822:4: rule__EqualityExpression__OperatorAlternatives_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__OperatorAlternatives_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__EqualityExpression__OperandAssignment_1_2"
+    // InternalSEW.g:8830:1: rule__EqualityExpression__OperandAssignment_1_2 : ( rulerelationalExpression ) ;
+    public final void rule__EqualityExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8834:1: ( ( rulerelationalExpression ) )
+            // InternalSEW.g:8835:2: ( rulerelationalExpression )
+            {
+            // InternalSEW.g:8835:2: ( rulerelationalExpression )
+            // InternalSEW.g:8836:3: rulerelationalExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getOperandRelationalExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulerelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getOperandRelationalExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__RelationalExpression__OperatorAssignment_1_1"
+    // InternalSEW.g:8845:1: rule__RelationalExpression__OperatorAssignment_1_1 : ( ( rule__RelationalExpression__OperatorAlternatives_1_1_0 ) ) ;
+    public final void rule__RelationalExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8849:1: ( ( ( rule__RelationalExpression__OperatorAlternatives_1_1_0 ) ) )
+            // InternalSEW.g:8850:2: ( ( rule__RelationalExpression__OperatorAlternatives_1_1_0 ) )
+            {
+            // InternalSEW.g:8850:2: ( ( rule__RelationalExpression__OperatorAlternatives_1_1_0 ) )
+            // InternalSEW.g:8851:3: ( rule__RelationalExpression__OperatorAlternatives_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+            // InternalSEW.g:8852:3: ( rule__RelationalExpression__OperatorAlternatives_1_1_0 )
+            // InternalSEW.g:8852:4: rule__RelationalExpression__OperatorAlternatives_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__OperatorAlternatives_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__RelationalExpression__OperandAssignment_1_2"
+    // InternalSEW.g:8860:1: rule__RelationalExpression__OperandAssignment_1_2 : ( ruleadditiveExpression ) ;
+    public final void rule__RelationalExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8864:1: ( ( ruleadditiveExpression ) )
+            // InternalSEW.g:8865:2: ( ruleadditiveExpression )
+            {
+            // InternalSEW.g:8865:2: ( ruleadditiveExpression )
+            // InternalSEW.g:8866:3: ruleadditiveExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getOperandAdditiveExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleadditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getOperandAdditiveExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__AdditiveExpression__OperatorAssignment_1_1"
+    // InternalSEW.g:8875:1: rule__AdditiveExpression__OperatorAssignment_1_1 : ( ( '+' ) ) ;
+    public final void rule__AdditiveExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8879:1: ( ( ( '+' ) ) )
+            // InternalSEW.g:8880:2: ( ( '+' ) )
+            {
+            // InternalSEW.g:8880:2: ( ( '+' ) )
+            // InternalSEW.g:8881:3: ( '+' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0()); 
+            }
+            // InternalSEW.g:8882:3: ( '+' )
+            // InternalSEW.g:8883:4: '+'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0()); 
+            }
+            match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__OperandAssignment_1_2"
+    // InternalSEW.g:8894:1: rule__AdditiveExpression__OperandAssignment_1_2 : ( rulemultiplicativeExpression ) ;
+    public final void rule__AdditiveExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8898:1: ( ( rulemultiplicativeExpression ) )
+            // InternalSEW.g:8899:2: ( rulemultiplicativeExpression )
+            {
+            // InternalSEW.g:8899:2: ( rulemultiplicativeExpression )
+            // InternalSEW.g:8900:3: rulemultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__AdditiveExpression__OperandAssignment_1_3_1"
+    // InternalSEW.g:8909:1: rule__AdditiveExpression__OperandAssignment_1_3_1 : ( rulemultiplicativeExpression ) ;
+    public final void rule__AdditiveExpression__OperandAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8913:1: ( ( rulemultiplicativeExpression ) )
+            // InternalSEW.g:8914:2: ( rulemultiplicativeExpression )
+            {
+            // InternalSEW.g:8914:2: ( rulemultiplicativeExpression )
+            // InternalSEW.g:8915:3: rulemultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__OperandAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperatorAssignment_1_0_1"
+    // InternalSEW.g:8924:1: rule__MultiplicativeExpression__OperatorAssignment_1_0_1 : ( ( '*' ) ) ;
+    public final void rule__MultiplicativeExpression__OperatorAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8928:1: ( ( ( '*' ) ) )
+            // InternalSEW.g:8929:2: ( ( '*' ) )
+            {
+            // InternalSEW.g:8929:2: ( ( '*' ) )
+            // InternalSEW.g:8930:3: ( '*' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); 
+            }
+            // InternalSEW.g:8931:3: ( '*' )
+            // InternalSEW.g:8932:4: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); 
+            }
+            match(input,60,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperatorAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_0_2"
+    // InternalSEW.g:8943:1: rule__MultiplicativeExpression__OperandAssignment_1_0_2 : ( ruleprimaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8947:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:8948:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:8948:2: ( ruleprimaryExpression )
+            // InternalSEW.g:8949:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_0_2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_0_3_1"
+    // InternalSEW.g:8958:1: rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 : ( ruleprimaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_0_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8962:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:8963:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:8963:2: ( ruleprimaryExpression )
+            // InternalSEW.g:8964:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_0_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperatorAssignment_1_1_1"
+    // InternalSEW.g:8973:1: rule__MultiplicativeExpression__OperatorAssignment_1_1_1 : ( ( '**' ) ) ;
+    public final void rule__MultiplicativeExpression__OperatorAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8977:1: ( ( ( '**' ) ) )
+            // InternalSEW.g:8978:2: ( ( '**' ) )
+            {
+            // InternalSEW.g:8978:2: ( ( '**' ) )
+            // InternalSEW.g:8979:3: ( '**' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); 
+            }
+            // InternalSEW.g:8980:3: ( '**' )
+            // InternalSEW.g:8981:4: '**'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); 
+            }
+            match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperatorAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_1_2"
+    // InternalSEW.g:8992:1: rule__MultiplicativeExpression__OperandAssignment_1_1_2 : ( ruleprimaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:8996:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:8997:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:8997:2: ( ruleprimaryExpression )
+            // InternalSEW.g:8998:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_1_2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_1_3_1"
+    // InternalSEW.g:9007:1: rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 : ( ruleprimaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9011:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:9012:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:9012:2: ( ruleprimaryExpression )
+            // InternalSEW.g:9013:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_1_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperatorAssignment_1_2_1"
+    // InternalSEW.g:9022:1: rule__MultiplicativeExpression__OperatorAssignment_1_2_1 : ( ( '/' ) ) ;
+    public final void rule__MultiplicativeExpression__OperatorAssignment_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9026:1: ( ( ( '/' ) ) )
+            // InternalSEW.g:9027:2: ( ( '/' ) )
+            {
+            // InternalSEW.g:9027:2: ( ( '/' ) )
+            // InternalSEW.g:9028:3: ( '/' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); 
+            }
+            // InternalSEW.g:9029:3: ( '/' )
+            // InternalSEW.g:9030:4: '/'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); 
+            }
+            match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperatorAssignment_1_2_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_2_2"
+    // InternalSEW.g:9041:1: rule__MultiplicativeExpression__OperandAssignment_1_2_2 : ( ruleprimaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9045:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:9046:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:9046:2: ( ruleprimaryExpression )
+            // InternalSEW.g:9047:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_2_2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_2_3_1"
+    // InternalSEW.g:9056:1: rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 : ( ruleprimaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_2_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9060:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:9061:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:9061:2: ( ruleprimaryExpression )
+            // InternalSEW.g:9062:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_2_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperatorAssignment_1_3_1"
+    // InternalSEW.g:9071:1: rule__MultiplicativeExpression__OperatorAssignment_1_3_1 : ( ( '%' ) ) ;
+    public final void rule__MultiplicativeExpression__OperatorAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9075:1: ( ( ( '%' ) ) )
+            // InternalSEW.g:9076:2: ( ( '%' ) )
+            {
+            // InternalSEW.g:9076:2: ( ( '%' ) )
+            // InternalSEW.g:9077:3: ( '%' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); 
+            }
+            // InternalSEW.g:9078:3: ( '%' )
+            // InternalSEW.g:9079:4: '%'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); 
+            }
+            match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperatorAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_3_2"
+    // InternalSEW.g:9090:1: rule__MultiplicativeExpression__OperandAssignment_1_3_2 : ( ruleprimaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9094:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:9095:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:9095:2: ( ruleprimaryExpression )
+            // InternalSEW.g:9096:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_3_2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_3_3_1"
+    // InternalSEW.g:9105:1: rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 : ( ruleprimaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_3_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9109:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:9110:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:9110:2: ( ruleprimaryExpression )
+            // InternalSEW.g:9111:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_3_3_1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__OperatorAssignment_1_1_0"
+    // InternalSEW.g:9120:1: rule__PrimaryExpression__OperatorAssignment_1_1_0 : ( ( '-' ) ) ;
+    public final void rule__PrimaryExpression__OperatorAssignment_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9124:1: ( ( ( '-' ) ) )
+            // InternalSEW.g:9125:2: ( ( '-' ) )
+            {
+            // InternalSEW.g:9125:2: ( ( '-' ) )
+            // InternalSEW.g:9126:3: ( '-' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0()); 
+            }
+            // InternalSEW.g:9127:3: ( '-' )
+            // InternalSEW.g:9128:4: '-'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0()); 
+            }
+            match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__OperatorAssignment_1_1_0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__OperandAssignment_1_1_1"
+    // InternalSEW.g:9139:1: rule__PrimaryExpression__OperandAssignment_1_1_1 : ( ruleprimaryExpression ) ;
+    public final void rule__PrimaryExpression__OperandAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9143:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:9144:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:9144:2: ( ruleprimaryExpression )
+            // InternalSEW.g:9145:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__OperandAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__OperatorAssignment_2_1_0"
+    // InternalSEW.g:9154:1: rule__PrimaryExpression__OperatorAssignment_2_1_0 : ( ( rule__PrimaryExpression__OperatorAlternatives_2_1_0_0 ) ) ;
+    public final void rule__PrimaryExpression__OperatorAssignment_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9158:1: ( ( ( rule__PrimaryExpression__OperatorAlternatives_2_1_0_0 ) ) )
+            // InternalSEW.g:9159:2: ( ( rule__PrimaryExpression__OperatorAlternatives_2_1_0_0 ) )
+            {
+            // InternalSEW.g:9159:2: ( ( rule__PrimaryExpression__OperatorAlternatives_2_1_0_0 ) )
+            // InternalSEW.g:9160:3: ( rule__PrimaryExpression__OperatorAlternatives_2_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getOperatorAlternatives_2_1_0_0()); 
+            }
+            // InternalSEW.g:9161:3: ( rule__PrimaryExpression__OperatorAlternatives_2_1_0_0 )
+            // InternalSEW.g:9161:4: rule__PrimaryExpression__OperatorAlternatives_2_1_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__OperatorAlternatives_2_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getOperatorAlternatives_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__OperatorAssignment_2_1_0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__OperandAssignment_2_1_1"
+    // InternalSEW.g:9169:1: rule__PrimaryExpression__OperandAssignment_2_1_1 : ( ruleprimaryExpression ) ;
+    public final void rule__PrimaryExpression__OperandAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9173:1: ( ( ruleprimaryExpression ) )
+            // InternalSEW.g:9174:2: ( ruleprimaryExpression )
+            {
+            // InternalSEW.g:9174:2: ( ruleprimaryExpression )
+            // InternalSEW.g:9175:3: ruleprimaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_2_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__OperandAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__ValuesAssignment_2_0"
+    // InternalSEW.g:9184:1: rule__LiteralArrayValue__ValuesAssignment_2_0 : ( ruleValueSpecification ) ;
+    public final void rule__LiteralArrayValue__ValuesAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9188:1: ( ( ruleValueSpecification ) )
+            // InternalSEW.g:9189:2: ( ruleValueSpecification )
+            {
+            // InternalSEW.g:9189:2: ( ruleValueSpecification )
+            // InternalSEW.g:9190:3: ruleValueSpecification
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueSpecification();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__ValuesAssignment_2_0"
+
+
+    // $ANTLR start "rule__LiteralArrayValue__ValuesAssignment_2_1_1"
+    // InternalSEW.g:9199:1: rule__LiteralArrayValue__ValuesAssignment_2_1_1 : ( ruleValueSpecification ) ;
+    public final void rule__LiteralArrayValue__ValuesAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9203:1: ( ( ruleValueSpecification ) )
+            // InternalSEW.g:9204:2: ( ruleValueSpecification )
+            {
+            // InternalSEW.g:9204:2: ( ruleValueSpecification )
+            // InternalSEW.g:9205:3: ruleValueSpecification
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueSpecification();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralArrayValue__ValuesAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__LiteralObjectReference__ObjectAssignment_1_0"
+    // InternalSEW.g:9214:1: rule__LiteralObjectReference__ObjectAssignment_1_0 : ( ( ruleUFI ) ) ;
+    public final void rule__LiteralObjectReference__ObjectAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9218:1: ( ( ( ruleUFI ) ) )
+            // InternalSEW.g:9219:2: ( ( ruleUFI ) )
+            {
+            // InternalSEW.g:9219:2: ( ( ruleUFI ) )
+            // InternalSEW.g:9220:3: ( ruleUFI )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectCrossReference_1_0_0()); 
+            }
+            // InternalSEW.g:9221:3: ( ruleUFI )
+            // InternalSEW.g:9222:4: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectUFIParserRuleCall_1_0_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectUFIParserRuleCall_1_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectCrossReference_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralObjectReference__ObjectAssignment_1_0"
+
+
+    // $ANTLR start "rule__LiteralObjectReference__SymbolAssignment_1_1"
+    // InternalSEW.g:9233:1: rule__LiteralObjectReference__SymbolAssignment_1_1 : ( ruleUFI ) ;
+    public final void rule__LiteralObjectReference__SymbolAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9237:1: ( ( ruleUFI ) )
+            // InternalSEW.g:9238:2: ( ruleUFI )
+            {
+            // InternalSEW.g:9238:2: ( ruleUFI )
+            // InternalSEW.g:9239:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralObjectReferenceAccess().getSymbolUFIParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralObjectReferenceAccess().getSymbolUFIParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralObjectReference__SymbolAssignment_1_1"
+
+
+    // $ANTLR start "rule__LiteralBooleanValue__ValueAssignment"
+    // InternalSEW.g:9248:1: rule__LiteralBooleanValue__ValueAssignment : ( ruleEBoolean ) ;
+    public final void rule__LiteralBooleanValue__ValueAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9252:1: ( ( ruleEBoolean ) )
+            // InternalSEW.g:9253:2: ( ruleEBoolean )
+            {
+            // InternalSEW.g:9253:2: ( ruleEBoolean )
+            // InternalSEW.g:9254:3: ruleEBoolean
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralBooleanValueAccess().getValueEBooleanParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEBoolean();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralBooleanValueAccess().getValueEBooleanParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralBooleanValue__ValueAssignment"
+
+
+    // $ANTLR start "rule__LiteralCharacterValue__ValueAssignment"
+    // InternalSEW.g:9263:1: rule__LiteralCharacterValue__ValueAssignment : ( ruleEChar ) ;
+    public final void rule__LiteralCharacterValue__ValueAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9267:1: ( ( ruleEChar ) )
+            // InternalSEW.g:9268:2: ( ruleEChar )
+            {
+            // InternalSEW.g:9268:2: ( ruleEChar )
+            // InternalSEW.g:9269:3: ruleEChar
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCharacterValueAccess().getValueECharParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEChar();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCharacterValueAccess().getValueECharParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCharacterValue__ValueAssignment"
+
+
+    // $ANTLR start "rule__LiteralIntegerValue__ValueAssignment"
+    // InternalSEW.g:9278:1: rule__LiteralIntegerValue__ValueAssignment : ( ruleELong ) ;
+    public final void rule__LiteralIntegerValue__ValueAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9282:1: ( ( ruleELong ) )
+            // InternalSEW.g:9283:2: ( ruleELong )
+            {
+            // InternalSEW.g:9283:2: ( ruleELong )
+            // InternalSEW.g:9284:3: ruleELong
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralIntegerValueAccess().getValueELongParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleELong();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralIntegerValueAccess().getValueELongParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralIntegerValue__ValueAssignment"
+
+
+    // $ANTLR start "rule__LiteralRationalValue__NumeratorAssignment_0"
+    // InternalSEW.g:9293:1: rule__LiteralRationalValue__NumeratorAssignment_0 : ( ruleELong ) ;
+    public final void rule__LiteralRationalValue__NumeratorAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9297:1: ( ( ruleELong ) )
+            // InternalSEW.g:9298:2: ( ruleELong )
+            {
+            // InternalSEW.g:9298:2: ( ruleELong )
+            // InternalSEW.g:9299:3: ruleELong
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalValueAccess().getNumeratorELongParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleELong();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalValueAccess().getNumeratorELongParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalValue__NumeratorAssignment_0"
+
+
+    // $ANTLR start "rule__LiteralRationalValue__DenominatorAssignment_2"
+    // InternalSEW.g:9308:1: rule__LiteralRationalValue__DenominatorAssignment_2 : ( ruleELong ) ;
+    public final void rule__LiteralRationalValue__DenominatorAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9312:1: ( ( ruleELong ) )
+            // InternalSEW.g:9313:2: ( ruleELong )
+            {
+            // InternalSEW.g:9313:2: ( ruleELong )
+            // InternalSEW.g:9314:3: ruleELong
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalValueAccess().getDenominatorELongParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleELong();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalValueAccess().getDenominatorELongParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalValue__DenominatorAssignment_2"
+
+
+    // $ANTLR start "rule__LiteralFloatValue__ValueAssignment"
+    // InternalSEW.g:9323:1: rule__LiteralFloatValue__ValueAssignment : ( ruleEDouble ) ;
+    public final void rule__LiteralFloatValue__ValueAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9327:1: ( ( ruleEDouble ) )
+            // InternalSEW.g:9328:2: ( ruleEDouble )
+            {
+            // InternalSEW.g:9328:2: ( ruleEDouble )
+            // InternalSEW.g:9329:3: ruleEDouble
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralFloatValueAccess().getValueEDoubleParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralFloatValueAccess().getValueEDoubleParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralFloatValue__ValueAssignment"
+
+
+    // $ANTLR start "rule__LiteralStringValue__ValueAssignment"
+    // InternalSEW.g:9338:1: rule__LiteralStringValue__ValueAssignment : ( ruleEString ) ;
+    public final void rule__LiteralStringValue__ValueAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9342:1: ( ( ruleEString ) )
+            // InternalSEW.g:9343:2: ( ruleEString )
+            {
+            // InternalSEW.g:9343:2: ( ruleEString )
+            // InternalSEW.g:9344:3: ruleEString
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralStringValueAccess().getValueEStringParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralStringValueAccess().getValueEStringParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralStringValue__ValueAssignment"
+
+
+    // $ANTLR start "rule__LiteralNullValue__TypeAssignment_2_1"
+    // InternalSEW.g:9353:1: rule__LiteralNullValue__TypeAssignment_2_1 : ( ruleXID ) ;
+    public final void rule__LiteralNullValue__TypeAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9357:1: ( ( ruleXID ) )
+            // InternalSEW.g:9358:2: ( ruleXID )
+            {
+            // InternalSEW.g:9358:2: ( ruleXID )
+            // InternalSEW.g:9359:3: ruleXID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullValueAccess().getTypeXIDParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullValueAccess().getTypeXIDParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullValue__TypeAssignment_2_1"
+
+
+    // $ANTLR start "rule__LiteralTimeVariable__SymbolAssignment_1"
+    // InternalSEW.g:9368:1: rule__LiteralTimeVariable__SymbolAssignment_1 : ( ( '$time' ) ) ;
+    public final void rule__LiteralTimeVariable__SymbolAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9372:1: ( ( ( '$time' ) ) )
+            // InternalSEW.g:9373:2: ( ( '$time' ) )
+            {
+            // InternalSEW.g:9373:2: ( ( '$time' ) )
+            // InternalSEW.g:9374:3: ( '$time' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0()); 
+            }
+            // InternalSEW.g:9375:3: ( '$time' )
+            // InternalSEW.g:9376:4: '$time'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0()); 
+            }
+            match(input,73,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeVariable__SymbolAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralTimeDeltaVariable__SymbolAssignment_1"
+    // InternalSEW.g:9387:1: rule__LiteralTimeDeltaVariable__SymbolAssignment_1 : ( ( '$delta' ) ) ;
+    public final void rule__LiteralTimeDeltaVariable__SymbolAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9391:1: ( ( ( '$delta' ) ) )
+            // InternalSEW.g:9392:2: ( ( '$delta' ) )
+            {
+            // InternalSEW.g:9392:2: ( ( '$delta' ) )
+            // InternalSEW.g:9393:3: ( '$delta' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0()); 
+            }
+            // InternalSEW.g:9394:3: ( '$delta' )
+            // InternalSEW.g:9395:4: '$delta'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0()); 
+            }
+            match(input,74,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeDeltaVariable__SymbolAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralThisInstance__SymbolAssignment_1"
+    // InternalSEW.g:9406:1: rule__LiteralThisInstance__SymbolAssignment_1 : ( ( '$this' ) ) ;
+    public final void rule__LiteralThisInstance__SymbolAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9410:1: ( ( ( '$this' ) ) )
+            // InternalSEW.g:9411:2: ( ( '$this' ) )
+            {
+            // InternalSEW.g:9411:2: ( ( '$this' ) )
+            // InternalSEW.g:9412:3: ( '$this' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0()); 
+            }
+            // InternalSEW.g:9413:3: ( '$this' )
+            // InternalSEW.g:9414:4: '$this'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralThisInstance__SymbolAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralSelfInstance__SymbolAssignment_1"
+    // InternalSEW.g:9425:1: rule__LiteralSelfInstance__SymbolAssignment_1 : ( ( '$self' ) ) ;
+    public final void rule__LiteralSelfInstance__SymbolAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9429:1: ( ( ( '$self' ) ) )
+            // InternalSEW.g:9430:2: ( ( '$self' ) )
+            {
+            // InternalSEW.g:9430:2: ( ( '$self' ) )
+            // InternalSEW.g:9431:3: ( '$self' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0()); 
+            }
+            // InternalSEW.g:9432:3: ( '$self' )
+            // InternalSEW.g:9433:4: '$self'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0()); 
+            }
+            match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSelfInstance__SymbolAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralParentInstance__SymbolAssignment_1"
+    // InternalSEW.g:9444:1: rule__LiteralParentInstance__SymbolAssignment_1 : ( ( '$parent' ) ) ;
+    public final void rule__LiteralParentInstance__SymbolAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9448:1: ( ( ( '$parent' ) ) )
+            // InternalSEW.g:9449:2: ( ( '$parent' ) )
+            {
+            // InternalSEW.g:9449:2: ( ( '$parent' ) )
+            // InternalSEW.g:9450:3: ( '$parent' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0()); 
+            }
+            // InternalSEW.g:9451:3: ( '$parent' )
+            // InternalSEW.g:9452:4: '$parent'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0()); 
+            }
+            match(input,77,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralParentInstance__SymbolAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralSuperInstance__SymbolAssignment_1"
+    // InternalSEW.g:9463:1: rule__LiteralSuperInstance__SymbolAssignment_1 : ( ( '$super' ) ) ;
+    public final void rule__LiteralSuperInstance__SymbolAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9467:1: ( ( ( '$super' ) ) )
+            // InternalSEW.g:9468:2: ( ( '$super' ) )
+            {
+            // InternalSEW.g:9468:2: ( ( '$super' ) )
+            // InternalSEW.g:9469:3: ( '$super' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0()); 
+            }
+            // InternalSEW.g:9470:3: ( '$super' )
+            // InternalSEW.g:9471:4: '$super'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0()); 
+            }
+            match(input,78,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSuperInstance__SymbolAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralSystemInstance__SymbolAssignment_1"
+    // InternalSEW.g:9482:1: rule__LiteralSystemInstance__SymbolAssignment_1 : ( ( '$system' ) ) ;
+    public final void rule__LiteralSystemInstance__SymbolAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9486:1: ( ( ( '$system' ) ) )
+            // InternalSEW.g:9487:2: ( ( '$system' ) )
+            {
+            // InternalSEW.g:9487:2: ( ( '$system' ) )
+            // InternalSEW.g:9488:3: ( '$system' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0()); 
+            }
+            // InternalSEW.g:9489:3: ( '$system' )
+            // InternalSEW.g:9490:4: '$system'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0()); 
+            }
+            match(input,79,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSystemInstance__SymbolAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralEnvInstance__SymbolAssignment_1"
+    // InternalSEW.g:9501:1: rule__LiteralEnvInstance__SymbolAssignment_1 : ( ( rule__LiteralEnvInstance__SymbolAlternatives_1_0 ) ) ;
+    public final void rule__LiteralEnvInstance__SymbolAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9505:1: ( ( ( rule__LiteralEnvInstance__SymbolAlternatives_1_0 ) ) )
+            // InternalSEW.g:9506:2: ( ( rule__LiteralEnvInstance__SymbolAlternatives_1_0 ) )
+            {
+            // InternalSEW.g:9506:2: ( ( rule__LiteralEnvInstance__SymbolAlternatives_1_0 ) )
+            // InternalSEW.g:9507:3: ( rule__LiteralEnvInstance__SymbolAlternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAlternatives_1_0()); 
+            }
+            // InternalSEW.g:9508:3: ( rule__LiteralEnvInstance__SymbolAlternatives_1_0 )
+            // InternalSEW.g:9508:4: rule__LiteralEnvInstance__SymbolAlternatives_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralEnvInstance__SymbolAlternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralEnvInstanceAccess().getSymbolAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvInstance__SymbolAssignment_1"
+
+
+    // $ANTLR start "rule__DeprecatedObject__NameAssignment_0_2"
+    // InternalSEW.g:9516:1: rule__DeprecatedObject__NameAssignment_0_2 : ( ruleUFI ) ;
+    public final void rule__DeprecatedObject__NameAssignment_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9520:1: ( ( ruleUFI ) )
+            // InternalSEW.g:9521:2: ( ruleUFI )
+            {
+            // InternalSEW.g:9521:2: ( ruleUFI )
+            // InternalSEW.g:9522:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__NameAssignment_0_2"
+
+
+    // $ANTLR start "rule__DeprecatedObject__DescriptionAssignment_0_3"
+    // InternalSEW.g:9531:1: rule__DeprecatedObject__DescriptionAssignment_0_3 : ( ruleEString ) ;
+    public final void rule__DeprecatedObject__DescriptionAssignment_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9535:1: ( ( ruleEString ) )
+            // InternalSEW.g:9536:2: ( ruleEString )
+            {
+            // InternalSEW.g:9536:2: ( ruleEString )
+            // InternalSEW.g:9537:3: ruleEString
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_0_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__DescriptionAssignment_0_3"
+
+
+    // $ANTLR start "rule__DeprecatedObject__TypeAssignment_0_6"
+    // InternalSEW.g:9546:1: rule__DeprecatedObject__TypeAssignment_0_6 : ( ruleUFI ) ;
+    public final void rule__DeprecatedObject__TypeAssignment_0_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9550:1: ( ( ruleUFI ) )
+            // InternalSEW.g:9551:2: ( ruleUFI )
+            {
+            // InternalSEW.g:9551:2: ( ruleUFI )
+            // InternalSEW.g:9552:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_0_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_0_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__TypeAssignment_0_6"
+
+
+    // $ANTLR start "rule__DeprecatedObject__ElementAssignment_0_8"
+    // InternalSEW.g:9561:1: rule__DeprecatedObject__ElementAssignment_0_8 : ( ruleDeprecatedProperty ) ;
+    public final void rule__DeprecatedObject__ElementAssignment_0_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9565:1: ( ( ruleDeprecatedProperty ) )
+            // InternalSEW.g:9566:2: ( ruleDeprecatedProperty )
+            {
+            // InternalSEW.g:9566:2: ( ruleDeprecatedProperty )
+            // InternalSEW.g:9567:3: ruleDeprecatedProperty
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_0_8_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDeprecatedProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_0_8_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__ElementAssignment_0_8"
+
+
+    // $ANTLR start "rule__DeprecatedObject__NameAssignment_1_2"
+    // InternalSEW.g:9576:1: rule__DeprecatedObject__NameAssignment_1_2 : ( ruleUFI ) ;
+    public final void rule__DeprecatedObject__NameAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9580:1: ( ( ruleUFI ) )
+            // InternalSEW.g:9581:2: ( ruleUFI )
+            {
+            // InternalSEW.g:9581:2: ( ruleUFI )
+            // InternalSEW.g:9582:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__NameAssignment_1_2"
+
+
+    // $ANTLR start "rule__DeprecatedObject__DescriptionAssignment_1_3"
+    // InternalSEW.g:9591:1: rule__DeprecatedObject__DescriptionAssignment_1_3 : ( ruleEString ) ;
+    public final void rule__DeprecatedObject__DescriptionAssignment_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9595:1: ( ( ruleEString ) )
+            // InternalSEW.g:9596:2: ( ruleEString )
+            {
+            // InternalSEW.g:9596:2: ( ruleEString )
+            // InternalSEW.g:9597:3: ruleEString
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__DescriptionAssignment_1_3"
+
+
+    // $ANTLR start "rule__DeprecatedObject__TypeAssignment_1_6"
+    // InternalSEW.g:9606:1: rule__DeprecatedObject__TypeAssignment_1_6 : ( ruleUFI ) ;
+    public final void rule__DeprecatedObject__TypeAssignment_1_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9610:1: ( ( ruleUFI ) )
+            // InternalSEW.g:9611:2: ( ruleUFI )
+            {
+            // InternalSEW.g:9611:2: ( ruleUFI )
+            // InternalSEW.g:9612:3: ruleUFI
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_1_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_1_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__TypeAssignment_1_6"
+
+
+    // $ANTLR start "rule__DeprecatedObject__ElementAssignment_1_8"
+    // InternalSEW.g:9621:1: rule__DeprecatedObject__ElementAssignment_1_8 : ( ruleDeprecatedProperty ) ;
+    public final void rule__DeprecatedObject__ElementAssignment_1_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9625:1: ( ( ruleDeprecatedProperty ) )
+            // InternalSEW.g:9626:2: ( ruleDeprecatedProperty )
+            {
+            // InternalSEW.g:9626:2: ( ruleDeprecatedProperty )
+            // InternalSEW.g:9627:3: ruleDeprecatedProperty
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_1_8_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDeprecatedProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_1_8_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedObject__ElementAssignment_1_8"
+
+
+    // $ANTLR start "rule__DeprecatedSection__NameAssignment_0_2"
+    // InternalSEW.g:9636:1: rule__DeprecatedSection__NameAssignment_0_2 : ( ruleXID ) ;
+    public final void rule__DeprecatedSection__NameAssignment_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9640:1: ( ( ruleXID ) )
+            // InternalSEW.g:9641:2: ( ruleXID )
+            {
+            // InternalSEW.g:9641:2: ( ruleXID )
+            // InternalSEW.g:9642:3: ruleXID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__NameAssignment_0_2"
+
+
+    // $ANTLR start "rule__DeprecatedSection__ElementAssignment_0_3"
+    // InternalSEW.g:9651:1: rule__DeprecatedSection__ElementAssignment_0_3 : ( ( rule__DeprecatedSection__ElementAlternatives_0_3_0 ) ) ;
+    public final void rule__DeprecatedSection__ElementAssignment_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9655:1: ( ( ( rule__DeprecatedSection__ElementAlternatives_0_3_0 ) ) )
+            // InternalSEW.g:9656:2: ( ( rule__DeprecatedSection__ElementAlternatives_0_3_0 ) )
+            {
+            // InternalSEW.g:9656:2: ( ( rule__DeprecatedSection__ElementAlternatives_0_3_0 ) )
+            // InternalSEW.g:9657:3: ( rule__DeprecatedSection__ElementAlternatives_0_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_0_3_0()); 
+            }
+            // InternalSEW.g:9658:3: ( rule__DeprecatedSection__ElementAlternatives_0_3_0 )
+            // InternalSEW.g:9658:4: rule__DeprecatedSection__ElementAlternatives_0_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__ElementAlternatives_0_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__ElementAssignment_0_3"
+
+
+    // $ANTLR start "rule__DeprecatedSection__NameAssignment_1_0"
+    // InternalSEW.g:9666:1: rule__DeprecatedSection__NameAssignment_1_0 : ( ruleXID ) ;
+    public final void rule__DeprecatedSection__NameAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9670:1: ( ( ruleXID ) )
+            // InternalSEW.g:9671:2: ( ruleXID )
+            {
+            // InternalSEW.g:9671:2: ( ruleXID )
+            // InternalSEW.g:9672:3: ruleXID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__NameAssignment_1_0"
+
+
+    // $ANTLR start "rule__DeprecatedSection__DescriptionAssignment_1_1"
+    // InternalSEW.g:9681:1: rule__DeprecatedSection__DescriptionAssignment_1_1 : ( ruleEString ) ;
+    public final void rule__DeprecatedSection__DescriptionAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9685:1: ( ( ruleEString ) )
+            // InternalSEW.g:9686:2: ( ruleEString )
+            {
+            // InternalSEW.g:9686:2: ( ruleEString )
+            // InternalSEW.g:9687:3: ruleEString
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getDescriptionEStringParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getDescriptionEStringParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__DescriptionAssignment_1_1"
+
+
+    // $ANTLR start "rule__DeprecatedSection__ElementAssignment_1_2_0_1"
+    // InternalSEW.g:9696:1: rule__DeprecatedSection__ElementAssignment_1_2_0_1 : ( ( rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0 ) ) ;
+    public final void rule__DeprecatedSection__ElementAssignment_1_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9700:1: ( ( ( rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0 ) ) )
+            // InternalSEW.g:9701:2: ( ( rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0 ) )
+            {
+            // InternalSEW.g:9701:2: ( ( rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0 ) )
+            // InternalSEW.g:9702:3: ( rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_0_1_0()); 
+            }
+            // InternalSEW.g:9703:3: ( rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0 )
+            // InternalSEW.g:9703:4: rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__ElementAssignment_1_2_0_1"
+
+
+    // $ANTLR start "rule__DeprecatedSection__ElementAssignment_1_2_1_1"
+    // InternalSEW.g:9711:1: rule__DeprecatedSection__ElementAssignment_1_2_1_1 : ( ( rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0 ) ) ;
+    public final void rule__DeprecatedSection__ElementAssignment_1_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9715:1: ( ( ( rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0 ) ) )
+            // InternalSEW.g:9716:2: ( ( rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0 ) )
+            {
+            // InternalSEW.g:9716:2: ( ( rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0 ) )
+            // InternalSEW.g:9717:3: ( rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_1_1_0()); 
+            }
+            // InternalSEW.g:9718:3: ( rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0 )
+            // InternalSEW.g:9718:4: rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedSectionAccess().getElementAlternatives_1_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedSection__ElementAssignment_1_2_1_1"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__NameAssignment_1"
+    // InternalSEW.g:9726:1: rule__DeprecatedAttribute__NameAssignment_1 : ( ruleDeprecatedAttributeID ) ;
+    public final void rule__DeprecatedAttribute__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9730:1: ( ( ruleDeprecatedAttributeID ) )
+            // InternalSEW.g:9731:2: ( ruleDeprecatedAttributeID )
+            {
+            // InternalSEW.g:9731:2: ( ruleDeprecatedAttributeID )
+            // InternalSEW.g:9732:3: ruleDeprecatedAttributeID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeAccess().getNameDeprecatedAttributeIDParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDeprecatedAttributeID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeAccess().getNameDeprecatedAttributeIDParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__NameAssignment_1"
+
+
+    // $ANTLR start "rule__DeprecatedAttribute__ValueAssignment_3"
+    // InternalSEW.g:9741:1: rule__DeprecatedAttribute__ValueAssignment_3 : ( ruleValueSpecification ) ;
+    public final void rule__DeprecatedAttribute__ValueAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9745:1: ( ( ruleValueSpecification ) )
+            // InternalSEW.g:9746:2: ( ruleValueSpecification )
+            {
+            // InternalSEW.g:9746:2: ( ruleValueSpecification )
+            // InternalSEW.g:9747:3: ruleValueSpecification
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedAttributeAccess().getValueValueSpecificationParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueSpecification();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedAttributeAccess().getValueValueSpecificationParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedAttribute__ValueAssignment_3"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__OperatorAssignment_2"
+    // InternalSEW.g:9756:1: rule__DeprecatedExpression__OperatorAssignment_2 : ( ( rule__DeprecatedExpression__OperatorAlternatives_2_0 ) ) ;
+    public final void rule__DeprecatedExpression__OperatorAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9760:1: ( ( ( rule__DeprecatedExpression__OperatorAlternatives_2_0 ) ) )
+            // InternalSEW.g:9761:2: ( ( rule__DeprecatedExpression__OperatorAlternatives_2_0 ) )
+            {
+            // InternalSEW.g:9761:2: ( ( rule__DeprecatedExpression__OperatorAlternatives_2_0 ) )
+            // InternalSEW.g:9762:3: ( rule__DeprecatedExpression__OperatorAlternatives_2_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedExpressionAccess().getOperatorAlternatives_2_0()); 
+            }
+            // InternalSEW.g:9763:3: ( rule__DeprecatedExpression__OperatorAlternatives_2_0 )
+            // InternalSEW.g:9763:4: rule__DeprecatedExpression__OperatorAlternatives_2_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DeprecatedExpression__OperatorAlternatives_2_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedExpressionAccess().getOperatorAlternatives_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__OperatorAssignment_2"
+
+
+    // $ANTLR start "rule__DeprecatedExpression__OperandAssignment_3"
+    // InternalSEW.g:9771:1: rule__DeprecatedExpression__OperandAssignment_3 : ( ruleValueSpecification ) ;
+    public final void rule__DeprecatedExpression__OperandAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalSEW.g:9775:1: ( ( ruleValueSpecification ) )
+            // InternalSEW.g:9776:2: ( ruleValueSpecification )
+            {
+            // InternalSEW.g:9776:2: ( ruleValueSpecification )
+            // InternalSEW.g:9777:3: ruleValueSpecification
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDeprecatedExpressionAccess().getOperandValueSpecificationParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueSpecification();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDeprecatedExpressionAccess().getOperandValueSpecificationParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DeprecatedExpression__OperandAssignment_3"
+
+    // $ANTLR start synpred35_InternalSEW
+    public final void synpred35_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:1946:2: ( ( ( rule__PrimaryExpression__Group_1__0 ) ) )
+        // InternalSEW.g:1946:2: ( ( rule__PrimaryExpression__Group_1__0 ) )
+        {
+        // InternalSEW.g:1946:2: ( ( rule__PrimaryExpression__Group_1__0 ) )
+        // InternalSEW.g:1947:3: ( rule__PrimaryExpression__Group_1__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getPrimaryExpressionAccess().getGroup_1()); 
+        }
+        // InternalSEW.g:1948:3: ( rule__PrimaryExpression__Group_1__0 )
+        // InternalSEW.g:1948:4: rule__PrimaryExpression__Group_1__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__PrimaryExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred35_InternalSEW
+
+    // $ANTLR start synpred41_InternalSEW
+    public final void synpred41_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:2012:2: ( ( ruleLiteralIntegerValue ) )
+        // InternalSEW.g:2012:2: ( ruleLiteralIntegerValue )
+        {
+        // InternalSEW.g:2012:2: ( ruleLiteralIntegerValue )
+        // InternalSEW.g:2013:3: ruleLiteralIntegerValue
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getLiteralExpressionAccess().getLiteralIntegerValueParserRuleCall_2()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleLiteralIntegerValue();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred41_InternalSEW
+
+    // $ANTLR start synpred43_InternalSEW
+    public final void synpred43_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:2024:2: ( ( ruleLiteralFloatValue ) )
+        // InternalSEW.g:2024:2: ( ruleLiteralFloatValue )
+        {
+        // InternalSEW.g:2024:2: ( ruleLiteralFloatValue )
+        // InternalSEW.g:2025:3: ruleLiteralFloatValue
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getLiteralExpressionAccess().getLiteralFloatValueParserRuleCall_4()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleLiteralFloatValue();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred43_InternalSEW
+
+    // $ANTLR start synpred49_InternalSEW
+    public final void synpred49_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:2075:2: ( ( ( rule__LiteralObjectReference__ObjectAssignment_1_0 ) ) )
+        // InternalSEW.g:2075:2: ( ( rule__LiteralObjectReference__ObjectAssignment_1_0 ) )
+        {
+        // InternalSEW.g:2075:2: ( ( rule__LiteralObjectReference__ObjectAssignment_1_0 ) )
+        // InternalSEW.g:2076:3: ( rule__LiteralObjectReference__ObjectAssignment_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getLiteralObjectReferenceAccess().getObjectAssignment_1_0()); 
+        }
+        // InternalSEW.g:2077:3: ( rule__LiteralObjectReference__ObjectAssignment_1_0 )
+        // InternalSEW.g:2077:4: rule__LiteralObjectReference__ObjectAssignment_1_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__LiteralObjectReference__ObjectAssignment_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred49_InternalSEW
+
+    // $ANTLR start synpred90_InternalSEW
+    public final void synpred90_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:3711:3: ( rule__Section__ElementAssignment_2_1_1 )
+        // InternalSEW.g:3711:3: rule__Section__ElementAssignment_2_1_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Section__ElementAssignment_2_1_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred90_InternalSEW
+
+    // $ANTLR start synpred99_InternalSEW
+    public final void synpred99_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:4791:3: ( rule__AdditiveExpression__Group_1__0 )
+        // InternalSEW.g:4791:3: rule__AdditiveExpression__Group_1__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__AdditiveExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred99_InternalSEW
+
+    // $ANTLR start synpred100_InternalSEW
+    public final void synpred100_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:4899:3: ( rule__AdditiveExpression__Group_1_3__0 )
+        // InternalSEW.g:4899:3: rule__AdditiveExpression__Group_1_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__AdditiveExpression__Group_1_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred100_InternalSEW
+
+    // $ANTLR start synpred121_InternalSEW
+    public final void synpred121_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:7896:3: ( ruleXID )
+        // InternalSEW.g:7896:3: ruleXID
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleXID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred121_InternalSEW
+
+    // $ANTLR start synpred124_InternalSEW
+    public final void synpred124_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:8112:3: ( rule__DeprecatedSection__ElementAssignment_1_2_1_1 )
+        // InternalSEW.g:8112:3: rule__DeprecatedSection__ElementAssignment_1_2_1_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__DeprecatedSection__ElementAssignment_1_2_1_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred124_InternalSEW
+
+    // Delegated rules
+
+    public final boolean synpred99_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred99_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred124_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred124_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred35_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred35_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred41_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred41_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred43_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred43_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred49_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred49_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred90_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred90_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred100_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred100_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred121_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred121_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+
+
+    protected DFA3 dfa3 = new DFA3(this);
+    protected DFA10 dfa10 = new DFA10(this);
+    protected DFA11 dfa11 = new DFA11(this);
+    protected DFA13 dfa13 = new DFA13(this);
+    protected DFA14 dfa14 = new DFA14(this);
+    protected DFA16 dfa16 = new DFA16(this);
+    protected DFA17 dfa17 = new DFA17(this);
+    protected DFA28 dfa28 = new DFA28(this);
+    protected DFA29 dfa29 = new DFA29(this);
+    protected DFA36 dfa36 = new DFA36(this);
+    protected DFA38 dfa38 = new DFA38(this);
+    protected DFA40 dfa40 = new DFA40(this);
+    protected DFA41 dfa41 = new DFA41(this);
+    protected DFA59 dfa59 = new DFA59(this);
+    protected DFA68 dfa68 = new DFA68(this);
+    protected DFA69 dfa69 = new DFA69(this);
+    protected DFA78 dfa78 = new DFA78(this);
+    protected DFA89 dfa89 = new DFA89(this);
+    protected DFA90 dfa90 = new DFA90(this);
+    protected DFA93 dfa93 = new DFA93(this);
+    static final String dfa_1s = "\15\uffff";
+    static final String dfa_2s = "\1\6\11\5\1\62\2\uffff";
+    static final String dfa_3s = "\1\57\11\71\1\70\2\uffff";
+    static final String dfa_4s = "\13\uffff\1\2\1\1";
+    static final String dfa_5s = "\15\uffff}>";
+    static final String[] dfa_6s = {
+            "\1\11\7\uffff\1\1\3\uffff\1\2\27\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\12\1\14\7\uffff\1\14\3\uffff\5\14\23\uffff\6\14\2\uffff\1\14\3\uffff\1\13\1\uffff\2\13",
+            "\1\12\1\14\7\uffff\1\14\3\uffff\5\14\23\uffff\6\14\2\uffff\1\14\3\uffff\1\13\1\uffff\2\13",
+            "\1\12\1\14\7\uffff\1\14\3\uffff\5\14\23\uffff\6\14\2\uffff\1\14\3\uffff\1\13\1\uffff\2\13",
+            "\1\12\1\14\7\uffff\1\14\3\uffff\5\14\23\uffff\6\14\2\uffff\1\14\3\uffff\1\13\1\uffff\2\13",
+            "\1\12\1\14\7\uffff\1\14\3\uffff\5\14\23\uffff\6\14\2\uffff\1\14\3\uffff\1\13\1\uffff\2\13",
+            "\1\12\1\14\7\uffff\1\14\3\uffff\5\14\23\uffff\6\14\2\uffff\1\14\3\uffff\1\13\1\uffff\2\13",
+            "\1\12\1\14\7\uffff\1\14\3\uffff\5\14\23\uffff\6\14\2\uffff\1\14\3\uffff\1\13\1\uffff\2\13",
+            "\1\12\1\14\7\uffff\1\14\3\uffff\5\14\23\uffff\6\14\2\uffff\1\14\3\uffff\1\13\1\uffff\2\13",
+            "\1\12\1\14\7\uffff\1\14\3\uffff\5\14\23\uffff\6\14\2\uffff\1\14\3\uffff\1\13\1\uffff\2\13",
+            "\1\14\3\uffff\1\13\1\uffff\1\13",
+            "",
+            ""
+    };
+
+    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
+    static final char[] dfa_2 = DFA.unpackEncodedStringToUnsignedChars(dfa_2s);
+    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
+    static final short[] dfa_4 = DFA.unpackEncodedString(dfa_4s);
+    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
+    static final short[][] dfa_6 = unpackEncodedStringArray(dfa_6s);
+
+    class DFA3 extends DFA {
+
+        public DFA3(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 3;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "1404:1: rule__Workflow__ElementAlternatives_2_0_4_0 : ( ( ruleObject ) | ( ruleProperty ) );";
+        }
+    }
+    static final String dfa_7s = "\27\uffff";
+    static final String dfa_8s = "\1\6\11\5\2\6\2\uffff\11\5";
+    static final String dfa_9s = "\1\57\11\62\2\57\2\uffff\11\62";
+    static final String dfa_10s = "\14\uffff\1\2\1\1\11\uffff";
+    static final String dfa_11s = "\27\uffff}>";
+    static final String[] dfa_12s = {
+            "\1\11\7\uffff\1\1\3\uffff\1\2\27\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\1\26\7\uffff\1\16\3\uffff\1\17\27\uffff\1\20\1\21\1\22\1\23\1\24\1\25",
+            "\1\26\7\uffff\1\16\3\uffff\1\17\27\uffff\1\20\1\21\1\22\1\23\1\24\1\25",
+            "",
+            "",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15",
+            "\2\15\7\uffff\1\15\3\uffff\1\15\1\12\1\13\2\14\23\uffff\6\15\2\uffff\1\15"
+    };
+
+    static final short[] dfa_7 = DFA.unpackEncodedString(dfa_7s);
+    static final char[] dfa_8 = DFA.unpackEncodedStringToUnsignedChars(dfa_8s);
+    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
+    static final short[] dfa_10 = DFA.unpackEncodedString(dfa_10s);
+    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
+    static final short[][] dfa_12 = unpackEncodedStringArray(dfa_12s);
+
+    class DFA10 extends DFA {
+
+        public DFA10(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 10;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_12;
+        }
+        public String getDescription() {
+            return "1557:1: rule__Object__Alternatives : ( ( ( rule__Object__Group_0__0 ) ) | ( ( rule__Object__Group_1__0 ) ) );";
+        }
+    }
+    static final String dfa_13s = "\1\6\11\5\1\uffff\1\62\1\uffff";
+    static final String dfa_14s = "\1\57\11\71\1\uffff\1\70\1\uffff";
+    static final String dfa_15s = "\12\uffff\1\1\1\uffff\1\2";
+    static final String[] dfa_16s = {
+            "\1\11\7\uffff\1\1\3\uffff\1\2\27\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\13\1\12\7\uffff\1\12\3\uffff\5\12\23\uffff\6\12\2\uffff\1\12\3\uffff\1\14\1\uffff\2\14",
+            "\1\13\1\12\7\uffff\1\12\3\uffff\5\12\23\uffff\6\12\2\uffff\1\12\3\uffff\1\14\1\uffff\2\14",
+            "\1\13\1\12\7\uffff\1\12\3\uffff\5\12\23\uffff\6\12\2\uffff\1\12\3\uffff\1\14\1\uffff\2\14",
+            "\1\13\1\12\7\uffff\1\12\3\uffff\5\12\23\uffff\6\12\2\uffff\1\12\3\uffff\1\14\1\uffff\2\14",
+            "\1\13\1\12\7\uffff\1\12\3\uffff\5\12\23\uffff\6\12\2\uffff\1\12\3\uffff\1\14\1\uffff\2\14",
+            "\1\13\1\12\7\uffff\1\12\3\uffff\5\12\23\uffff\6\12\2\uffff\1\12\3\uffff\1\14\1\uffff\2\14",
+            "\1\13\1\12\7\uffff\1\12\3\uffff\5\12\23\uffff\6\12\2\uffff\1\12\3\uffff\1\14\1\uffff\2\14",
+            "\1\13\1\12\7\uffff\1\12\3\uffff\5\12\23\uffff\6\12\2\uffff\1\12\3\uffff\1\14\1\uffff\2\14",
+            "\1\13\1\12\7\uffff\1\12\3\uffff\5\12\23\uffff\6\12\2\uffff\1\12\3\uffff\1\14\1\uffff\2\14",
+            "",
+            "\1\12\3\uffff\1\14\1\uffff\1\14",
+            ""
+    };
+    static final char[] dfa_13 = DFA.unpackEncodedStringToUnsignedChars(dfa_13s);
+    static final char[] dfa_14 = DFA.unpackEncodedStringToUnsignedChars(dfa_14s);
+    static final short[] dfa_15 = DFA.unpackEncodedString(dfa_15s);
+    static final short[][] dfa_16 = unpackEncodedStringArray(dfa_16s);
+
+    class DFA11 extends DFA {
+
+        public DFA11(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 11;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_13;
+            this.max = dfa_14;
+            this.accept = dfa_15;
+            this.special = dfa_5;
+            this.transition = dfa_16;
+        }
+        public String getDescription() {
+            return "1578:1: rule__Object__ElementAlternatives_0_5_0 : ( ( ruleObject ) | ( ruleProperty ) );";
+        }
+    }
+
+    class DFA13 extends DFA {
+
+        public DFA13(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 13;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "1620:1: rule__Object__ElementAlternatives_1_5_0 : ( ( ruleObject ) | ( ruleProperty ) );";
+        }
+    }
+    static final String dfa_17s = "\14\uffff";
+    static final String dfa_18s = "\1\6\11\5\2\uffff";
+    static final String dfa_19s = "\1\57\11\71\2\uffff";
+    static final String dfa_20s = "\12\uffff\1\1\1\2";
+    static final String dfa_21s = "\14\uffff}>";
+    static final String[] dfa_22s = {
+            "\1\11\7\uffff\1\1\3\uffff\1\2\27\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\12\60\uffff\1\12\1\uffff\1\12\1\13",
+            "\1\12\60\uffff\1\12\1\uffff\1\12\1\13",
+            "\1\12\60\uffff\1\12\1\uffff\1\12\1\13",
+            "\1\12\60\uffff\1\12\1\uffff\1\12\1\13",
+            "\1\12\60\uffff\1\12\1\uffff\1\12\1\13",
+            "\1\12\60\uffff\1\12\1\uffff\1\12\1\13",
+            "\1\12\60\uffff\1\12\1\uffff\1\12\1\13",
+            "\1\12\60\uffff\1\12\1\uffff\1\12\1\13",
+            "\1\12\60\uffff\1\12\1\uffff\1\12\1\13",
+            "",
+            ""
+    };
+
+    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
+    static final char[] dfa_18 = DFA.unpackEncodedStringToUnsignedChars(dfa_18s);
+    static final char[] dfa_19 = DFA.unpackEncodedStringToUnsignedChars(dfa_19s);
+    static final short[] dfa_20 = DFA.unpackEncodedString(dfa_20s);
+    static final short[] dfa_21 = DFA.unpackEncodedString(dfa_21s);
+    static final short[][] dfa_22 = unpackEncodedStringArray(dfa_22s);
+
+    class DFA14 extends DFA {
+
+        public DFA14(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 14;
+            this.eot = dfa_17;
+            this.eof = dfa_17;
+            this.min = dfa_18;
+            this.max = dfa_19;
+            this.accept = dfa_20;
+            this.special = dfa_21;
+            this.transition = dfa_22;
+        }
+        public String getDescription() {
+            return "1641:1: rule__Property__Alternatives : ( ( ruleSection ) | ( ruleAttribute ) );";
+        }
+    }
+    static final String dfa_23s = "\12\uffff\1\2\1\1";
+    static final String[] dfa_24s = {
+            "\1\11\7\uffff\1\1\3\uffff\1\2\27\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "",
+            ""
+    };
+    static final short[] dfa_23 = DFA.unpackEncodedString(dfa_23s);
+    static final short[][] dfa_24 = unpackEncodedStringArray(dfa_24s);
+
+    class DFA16 extends DFA {
+
+        public DFA16(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 16;
+            this.eot = dfa_17;
+            this.eof = dfa_17;
+            this.min = dfa_18;
+            this.max = dfa_19;
+            this.accept = dfa_23;
+            this.special = dfa_21;
+            this.transition = dfa_24;
+        }
+        public String getDescription() {
+            return "1683:1: rule__Section__ElementAlternatives_2_0_1_0 : ( ( ruleObject ) | ( ruleAttribute ) );";
+        }
+    }
+
+    class DFA17 extends DFA {
+
+        public DFA17(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 17;
+            this.eot = dfa_17;
+            this.eof = dfa_17;
+            this.min = dfa_18;
+            this.max = dfa_19;
+            this.accept = dfa_23;
+            this.special = dfa_21;
+            this.transition = dfa_24;
+        }
+        public String getDescription() {
+            return "1704:1: rule__Section__ElementAlternatives_2_1_1_0 : ( ( ruleObject ) | ( ruleAttribute ) );";
+        }
+    }
+    static final String dfa_25s = "\16\uffff";
+    static final String dfa_26s = "\1\4\2\uffff\1\10\1\76\11\uffff";
+    static final String dfa_27s = "\1\117\2\uffff\1\24\1\76\11\uffff";
+    static final String dfa_28s = "\1\uffff\1\1\1\2\2\uffff\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\4\1\3";
+    static final String dfa_29s = "\4\uffff\1\0\11\uffff}>";
+    static final String[] dfa_30s = {
+            "\1\2\1\6\1\11\1\uffff\1\4\5\uffff\1\11\3\uffff\1\11\1\uffff\1\5\21\uffff\2\13\2\1\6\11\6\uffff\1\10\13\uffff\1\11\1\7\1\3\4\uffff\2\12\5\13",
+            "",
+            "",
+            "\1\4\13\uffff\1\5",
+            "\1\14",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
+    static final char[] dfa_26 = DFA.unpackEncodedStringToUnsignedChars(dfa_26s);
+    static final char[] dfa_27 = DFA.unpackEncodedStringToUnsignedChars(dfa_27s);
+    static final short[] dfa_28 = DFA.unpackEncodedString(dfa_28s);
+    static final short[] dfa_29 = DFA.unpackEncodedString(dfa_29s);
+    static final short[][] dfa_30 = unpackEncodedStringArray(dfa_30s);
+
+    class DFA28 extends DFA {
+
+        public DFA28(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 28;
+            this.eot = dfa_25;
+            this.eof = dfa_25;
+            this.min = dfa_26;
+            this.max = dfa_27;
+            this.accept = dfa_28;
+            this.special = dfa_29;
+            this.transition = dfa_30;
+        }
+        public String getDescription() {
+            return "1995:1: rule__LiteralExpression__Alternatives : ( ( ruleLiteralBooleanValue ) | ( ruleLiteralCharacterValue ) | ( ruleLiteralIntegerValue ) | ( ruleLiteralRationalValue ) | ( ruleLiteralFloatValue ) | ( ruleLiteralStringValue ) | ( ruleLiteralNullValue ) | ( ruleLiteralArrayValue ) | ( ruleLiteralObjectReference ) | ( ruleLiteralVariableReference ) | ( ruleLiteralInstanceReference ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA28_4 = input.LA(1);
+
+                         
+                        int index28_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA28_4==62) ) {s = 12;}
+
+                        else if ( (synpred41_InternalSEW()) ) {s = 13;}
+
+                        else if ( (synpred43_InternalSEW()) ) {s = 5;}
+
+                         
+                        input.seek(index28_4);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 28, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_31s = "\1\6\11\0\2\uffff";
+    static final String dfa_32s = "\1\57\11\0\2\uffff";
+    static final String dfa_33s = "\1\uffff\1\2\1\6\1\5\1\10\1\0\1\3\1\7\1\4\1\1\2\uffff}>";
+    static final String[] dfa_34s = {
+            "\1\11\7\uffff\1\1\3\uffff\1\2\27\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            ""
+    };
+    static final char[] dfa_31 = DFA.unpackEncodedStringToUnsignedChars(dfa_31s);
+    static final char[] dfa_32 = DFA.unpackEncodedStringToUnsignedChars(dfa_32s);
+    static final short[] dfa_33 = DFA.unpackEncodedString(dfa_33s);
+    static final short[][] dfa_34 = unpackEncodedStringArray(dfa_34s);
+
+    class DFA29 extends DFA {
+
+        public DFA29(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 29;
+            this.eot = dfa_17;
+            this.eof = dfa_17;
+            this.min = dfa_31;
+            this.max = dfa_32;
+            this.accept = dfa_20;
+            this.special = dfa_33;
+            this.transition = dfa_34;
+        }
+        public String getDescription() {
+            return "2070:1: rule__LiteralObjectReference__Alternatives_1 : ( ( ( rule__LiteralObjectReference__ObjectAssignment_1_0 ) ) | ( ( rule__LiteralObjectReference__SymbolAssignment_1_1 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA29_5 = input.LA(1);
+
+                         
+                        int index29_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred49_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index29_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA29_9 = input.LA(1);
+
+                         
+                        int index29_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred49_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index29_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA29_1 = input.LA(1);
+
+                         
+                        int index29_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred49_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index29_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA29_6 = input.LA(1);
+
+                         
+                        int index29_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred49_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index29_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA29_8 = input.LA(1);
+
+                         
+                        int index29_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred49_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index29_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA29_3 = input.LA(1);
+
+                         
+                        int index29_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred49_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index29_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA29_2 = input.LA(1);
+
+                         
+                        int index29_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred49_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index29_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA29_7 = input.LA(1);
+
+                         
+                        int index29_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred49_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index29_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA29_4 = input.LA(1);
+
+                         
+                        int index29_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred49_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index29_4);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 29, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_35s = {
+            "\1\11\1\12\6\uffff\1\2\3\uffff\1\3\27\uffff\1\4\1\5\1\6\1\7\1\1\1\10",
+            "\2\13\7\uffff\1\13\3\uffff\1\13\27\uffff\6\13\6\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\60\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\60\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\60\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\60\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\60\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\60\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\60\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\60\uffff\1\13\1\uffff\1\13\1\12",
+            "",
+            ""
+    };
+    static final short[][] dfa_35 = unpackEncodedStringArray(dfa_35s);
+
+    class DFA36 extends DFA {
+
+        public DFA36(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 36;
+            this.eot = dfa_17;
+            this.eof = dfa_17;
+            this.min = dfa_18;
+            this.max = dfa_19;
+            this.accept = dfa_23;
+            this.special = dfa_21;
+            this.transition = dfa_35;
+        }
+        public String getDescription() {
+            return "2265:1: rule__DeprecatedProperty__Alternatives : ( ( ruleDeprecatedSection ) | ( ruleDeprecatedAttribute ) );";
+        }
+    }
+    static final String dfa_36s = "\67\uffff";
+    static final String dfa_37s = "\1\6\11\5\2\uffff\22\5\2\6\1\62\1\uffff\2\6\1\62\22\5";
+    static final String dfa_38s = "\1\57\11\71\2\uffff\22\105\2\57\1\105\1\uffff\2\57\23\105";
+    static final String dfa_39s = "\12\uffff\1\1\1\3\25\uffff\1\2\25\uffff";
+    static final String dfa_40s = "\67\uffff}>";
+    static final String[] dfa_41s = {
+            "\1\11\1\12\6\uffff\1\1\3\uffff\1\2\27\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\1\13\1\24\7\uffff\1\14\3\uffff\1\15\4\13\23\uffff\1\16\1\17\1\20\1\21\1\22\1\23\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\1\13\1\35\7\uffff\1\25\3\uffff\1\26\4\13\23\uffff\1\27\1\30\1\31\1\32\1\33\1\34\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "\2\13\7\uffff\1\13\3\uffff\5\13\23\uffff\6\13\2\uffff\1\13\6\uffff\1\12",
+            "",
+            "",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\55\7\uffff\1\45\3\uffff\1\46\27\uffff\1\47\1\50\1\51\1\52\1\53\1\54",
+            "\1\55\7\uffff\1\45\3\uffff\1\46\27\uffff\1\47\1\50\1\51\1\52\1\53\1\54",
+            "\1\13\22\uffff\1\41",
+            "",
+            "\1\66\7\uffff\1\56\3\uffff\1\57\27\uffff\1\60\1\61\1\62\1\63\1\64\1\65",
+            "\1\66\7\uffff\1\56\3\uffff\1\57\27\uffff\1\60\1\61\1\62\1\63\1\64\1\65",
+            "\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\40\15\uffff\1\36\1\37\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41",
+            "\1\44\15\uffff\1\42\1\43\35\uffff\1\13\22\uffff\1\41"
+    };
+
+    static final short[] dfa_36 = DFA.unpackEncodedString(dfa_36s);
+    static final char[] dfa_37 = DFA.unpackEncodedStringToUnsignedChars(dfa_37s);
+    static final char[] dfa_38 = DFA.unpackEncodedStringToUnsignedChars(dfa_38s);
+    static final short[] dfa_39 = DFA.unpackEncodedString(dfa_39s);
+    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
+    static final short[][] dfa_41 = unpackEncodedStringArray(dfa_41s);
+
+    class DFA38 extends DFA {
+
+        public DFA38(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 38;
+            this.eot = dfa_36;
+            this.eof = dfa_36;
+            this.min = dfa_37;
+            this.max = dfa_38;
+            this.accept = dfa_39;
+            this.special = dfa_40;
+            this.transition = dfa_41;
+        }
+        public String getDescription() {
+            return "2307:1: rule__DeprecatedSection__ElementAlternatives_0_3_0 : ( ( ruleDeprecatedAttribute ) | ( ruleDeprecatedObject ) | ( ruleObject ) );";
+        }
+    }
+
+    class DFA40 extends DFA {
+
+        public DFA40(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 40;
+            this.eot = dfa_36;
+            this.eof = dfa_36;
+            this.min = dfa_37;
+            this.max = dfa_38;
+            this.accept = dfa_39;
+            this.special = dfa_40;
+            this.transition = dfa_41;
+        }
+        public String getDescription() {
+            return "2355:1: rule__DeprecatedSection__ElementAlternatives_1_2_0_1_0 : ( ( ruleDeprecatedAttribute ) | ( ruleDeprecatedObject ) | ( ruleObject ) );";
+        }
+    }
+
+    class DFA41 extends DFA {
+
+        public DFA41(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 41;
+            this.eot = dfa_36;
+            this.eof = dfa_36;
+            this.min = dfa_37;
+            this.max = dfa_38;
+            this.accept = dfa_39;
+            this.special = dfa_40;
+            this.transition = dfa_41;
+        }
+        public String getDescription() {
+            return "2382:1: rule__DeprecatedSection__ElementAlternatives_1_2_1_1_0 : ( ( ruleDeprecatedAttribute ) | ( ruleDeprecatedObject ) | ( ruleObject ) );";
+        }
+    }
+    static final String dfa_42s = "\1\1\14\uffff";
+    static final String dfa_43s = "\1\6\2\uffff\11\0\1\uffff";
+    static final String dfa_44s = "\1\63\2\uffff\11\0\1\uffff";
+    static final String dfa_45s = "\1\uffff\1\2\12\uffff\1\1";
+    static final String dfa_46s = "\3\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\uffff}>";
+    static final String[] dfa_47s = {
+            "\1\13\7\uffff\1\3\3\uffff\1\4\27\uffff\1\5\1\6\1\7\1\10\1\11\1\12\3\uffff\1\1",
+            "",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+    static final short[] dfa_42 = DFA.unpackEncodedString(dfa_42s);
+    static final char[] dfa_43 = DFA.unpackEncodedStringToUnsignedChars(dfa_43s);
+    static final char[] dfa_44 = DFA.unpackEncodedStringToUnsignedChars(dfa_44s);
+    static final short[] dfa_45 = DFA.unpackEncodedString(dfa_45s);
+    static final short[] dfa_46 = DFA.unpackEncodedString(dfa_46s);
+    static final short[][] dfa_47 = unpackEncodedStringArray(dfa_47s);
+
+    class DFA59 extends DFA {
+
+        public DFA59(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 59;
+            this.eot = dfa_1;
+            this.eof = dfa_42;
+            this.min = dfa_43;
+            this.max = dfa_44;
+            this.accept = dfa_45;
+            this.special = dfa_46;
+            this.transition = dfa_47;
+        }
+        public String getDescription() {
+            return "()* loopback of 3711:2: ( rule__Section__ElementAssignment_2_1_1 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA59_3 = input.LA(1);
+
+                         
+                        int index59_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred90_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index59_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA59_4 = input.LA(1);
+
+                         
+                        int index59_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred90_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index59_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA59_5 = input.LA(1);
+
+                         
+                        int index59_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred90_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index59_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA59_6 = input.LA(1);
+
+                         
+                        int index59_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred90_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index59_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA59_7 = input.LA(1);
+
+                         
+                        int index59_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred90_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index59_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA59_8 = input.LA(1);
+
+                         
+                        int index59_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred90_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index59_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA59_9 = input.LA(1);
+
+                         
+                        int index59_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred90_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index59_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA59_10 = input.LA(1);
+
+                         
+                        int index59_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred90_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index59_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA59_11 = input.LA(1);
+
+                         
+                        int index59_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred90_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index59_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 59, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_48s = "\71\uffff";
+    static final String dfa_49s = "\1\2\70\uffff";
+    static final String dfa_50s = "\1\4\1\0\67\uffff";
+    static final String dfa_51s = "\1\117\1\0\67\uffff";
+    static final String dfa_52s = "\2\uffff\1\2\65\uffff\1\1";
+    static final String dfa_53s = "\1\uffff\1\0\67\uffff}>";
+    static final String[] dfa_54s = {
+            "\5\2\5\uffff\1\2\3\uffff\1\2\1\uffff\1\2\2\uffff\31\2\3\uffff\1\2\1\uffff\4\2\1\uffff\1\2\1\1\4\uffff\5\2\2\uffff\11\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_48 = DFA.unpackEncodedString(dfa_48s);
+    static final short[] dfa_49 = DFA.unpackEncodedString(dfa_49s);
+    static final char[] dfa_50 = DFA.unpackEncodedStringToUnsignedChars(dfa_50s);
+    static final char[] dfa_51 = DFA.unpackEncodedStringToUnsignedChars(dfa_51s);
+    static final short[] dfa_52 = DFA.unpackEncodedString(dfa_52s);
+    static final short[] dfa_53 = DFA.unpackEncodedString(dfa_53s);
+    static final short[][] dfa_54 = unpackEncodedStringArray(dfa_54s);
+
+    class DFA68 extends DFA {
+
+        public DFA68(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 68;
+            this.eot = dfa_48;
+            this.eof = dfa_49;
+            this.min = dfa_50;
+            this.max = dfa_51;
+            this.accept = dfa_52;
+            this.special = dfa_53;
+            this.transition = dfa_54;
+        }
+        public String getDescription() {
+            return "4791:2: ( rule__AdditiveExpression__Group_1__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA68_1 = input.LA(1);
+
+                         
+                        int index68_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred99_InternalSEW()) ) {s = 56;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index68_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 68, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_55s = "\1\1\70\uffff";
+    static final String dfa_56s = "\1\4\35\uffff\1\0\32\uffff";
+    static final String dfa_57s = "\1\117\35\uffff\1\0\32\uffff";
+    static final String dfa_58s = "\1\uffff\1\2\66\uffff\1\1";
+    static final String dfa_59s = "\36\uffff\1\0\32\uffff}>";
+    static final String[] dfa_60s = {
+            "\5\1\5\uffff\1\1\3\uffff\1\1\1\uffff\1\1\2\uffff\31\1\3\uffff\1\1\1\uffff\4\1\1\uffff\1\1\1\36\4\uffff\5\1\2\uffff\11\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[] dfa_55 = DFA.unpackEncodedString(dfa_55s);
+    static final char[] dfa_56 = DFA.unpackEncodedStringToUnsignedChars(dfa_56s);
+    static final char[] dfa_57 = DFA.unpackEncodedStringToUnsignedChars(dfa_57s);
+    static final short[] dfa_58 = DFA.unpackEncodedString(dfa_58s);
+    static final short[] dfa_59 = DFA.unpackEncodedString(dfa_59s);
+    static final short[][] dfa_60 = unpackEncodedStringArray(dfa_60s);
+
+    class DFA69 extends DFA {
+
+        public DFA69(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 69;
+            this.eot = dfa_48;
+            this.eof = dfa_55;
+            this.min = dfa_56;
+            this.max = dfa_57;
+            this.accept = dfa_58;
+            this.special = dfa_59;
+            this.transition = dfa_60;
+        }
+        public String getDescription() {
+            return "()* loopback of 4899:2: ( rule__AdditiveExpression__Group_1_3__0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA69_30 = input.LA(1);
+
+                         
+                        int index69_30 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred100_InternalSEW()) ) {s = 56;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index69_30);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 69, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_61s = "\1\2\2\uffff\11\2\1\uffff";
+    static final String dfa_62s = "\2\4\1\uffff\11\4\1\uffff";
+    static final String dfa_63s = "\2\117\1\uffff\11\117\1\uffff";
+    static final String dfa_64s = "\2\uffff\1\2\11\uffff\1\1";
+    static final String[] dfa_65s = {
+            "\5\2\5\uffff\1\2\3\uffff\1\2\1\uffff\1\2\2\uffff\11\2\1\1\17\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            "\2\2\1\13\1\uffff\1\2\5\uffff\1\3\3\uffff\1\4\1\uffff\1\2\17\uffff\6\2\1\5\1\6\1\7\1\10\1\11\1\12\6\uffff\1\2\4\uffff\1\2\4\uffff\1\2\1\uffff\3\2\4\uffff\7\2",
+            "",
+            "\5\2\5\uffff\1\2\3\uffff\3\2\2\uffff\11\2\2\uffff\1\14\1\uffff\14\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            "\5\2\5\uffff\1\2\3\uffff\3\2\2\uffff\11\2\2\uffff\1\14\1\uffff\14\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            "\5\2\5\uffff\1\2\3\uffff\3\2\2\uffff\11\2\2\uffff\1\14\1\uffff\14\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            "\5\2\5\uffff\1\2\3\uffff\3\2\2\uffff\11\2\2\uffff\1\14\1\uffff\14\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            "\5\2\5\uffff\1\2\3\uffff\3\2\2\uffff\11\2\2\uffff\1\14\1\uffff\14\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            "\5\2\5\uffff\1\2\3\uffff\3\2\2\uffff\11\2\2\uffff\1\14\1\uffff\14\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            "\5\2\5\uffff\1\2\3\uffff\3\2\2\uffff\11\2\2\uffff\1\14\1\uffff\14\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            "\5\2\5\uffff\1\2\3\uffff\3\2\2\uffff\11\2\2\uffff\1\14\1\uffff\14\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            "\5\2\5\uffff\1\2\3\uffff\3\2\2\uffff\11\2\2\uffff\1\14\1\uffff\14\2\3\uffff\1\2\1\uffff\4\2\1\uffff\13\2\2\uffff\11\2",
+            ""
+    };
+    static final short[] dfa_61 = DFA.unpackEncodedString(dfa_61s);
+    static final char[] dfa_62 = DFA.unpackEncodedStringToUnsignedChars(dfa_62s);
+    static final char[] dfa_63 = DFA.unpackEncodedStringToUnsignedChars(dfa_63s);
+    static final short[] dfa_64 = DFA.unpackEncodedString(dfa_64s);
+    static final short[][] dfa_65 = unpackEncodedStringArray(dfa_65s);
+
+    class DFA78 extends DFA {
+
+        public DFA78(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 78;
+            this.eot = dfa_1;
+            this.eof = dfa_61;
+            this.min = dfa_62;
+            this.max = dfa_63;
+            this.accept = dfa_64;
+            this.special = dfa_5;
+            this.transition = dfa_65;
+        }
+        public String getDescription() {
+            return "6438:2: ( rule__LiteralNullValue__Group_2__0 )?";
+        }
+    }
+    static final String dfa_66s = "\1\uffff\1\14\1\uffff\11\14\2\uffff";
+    static final String dfa_67s = "\1\6\1\5\1\uffff\11\5\1\uffff\1\62";
+    static final String dfa_68s = "\1\57\1\71\1\uffff\11\71\1\uffff\1\70";
+    static final String dfa_69s = "\2\uffff\1\1\11\uffff\1\2\1\uffff";
+    static final String dfa_70s = "\16\uffff}>";
+    static final String[] dfa_71s = {
+            "\2\2\6\uffff\1\2\3\uffff\1\2\27\uffff\5\2\1\1",
+            "\1\2\1\13\1\14\6\uffff\1\3\3\uffff\1\4\4\2\23\uffff\1\5\1\6\1\7\1\10\1\11\1\12\2\uffff\1\2\6\uffff\1\2",
+            "",
+            "\1\15\2\14\6\uffff\1\14\3\uffff\1\14\2\2\25\uffff\6\14\2\uffff\1\2\3\uffff\1\14\1\uffff\2\14",
+            "\1\15\2\14\6\uffff\1\14\3\uffff\1\14\2\2\25\uffff\6\14\2\uffff\1\2\3\uffff\1\14\1\uffff\2\14",
+            "\1\15\2\14\6\uffff\1\14\3\uffff\1\14\2\2\25\uffff\6\14\2\uffff\1\2\3\uffff\1\14\1\uffff\2\14",
+            "\1\15\2\14\6\uffff\1\14\3\uffff\1\14\2\2\25\uffff\6\14\2\uffff\1\2\3\uffff\4\14",
+            "\1\15\2\14\6\uffff\1\14\3\uffff\1\14\2\2\25\uffff\6\14\2\uffff\1\2\3\uffff\1\14\1\uffff\2\14",
+            "\1\15\2\14\6\uffff\1\14\3\uffff\1\14\2\2\25\uffff\6\14\2\uffff\1\2\3\uffff\4\14",
+            "\1\15\2\14\6\uffff\1\14\3\uffff\1\14\2\2\25\uffff\6\14\2\uffff\1\2\3\uffff\1\14\1\uffff\2\14",
+            "\1\15\2\14\6\uffff\1\14\3\uffff\1\14\2\2\25\uffff\6\14\2\uffff\1\2\3\uffff\1\14\1\uffff\2\14",
+            "\1\15\2\14\6\uffff\1\14\3\uffff\1\14\2\2\25\uffff\6\14\2\uffff\1\2\3\uffff\1\14\1\uffff\2\14",
+            "",
+            "\1\2\3\uffff\1\14\1\uffff\1\14"
+    };
+    static final short[] dfa_66 = DFA.unpackEncodedString(dfa_66s);
+    static final char[] dfa_67 = DFA.unpackEncodedStringToUnsignedChars(dfa_67s);
+    static final char[] dfa_68 = DFA.unpackEncodedStringToUnsignedChars(dfa_68s);
+    static final short[] dfa_69 = DFA.unpackEncodedString(dfa_69s);
+    static final short[] dfa_70 = DFA.unpackEncodedString(dfa_70s);
+    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);
+
+    class DFA89 extends DFA {
+
+        public DFA89(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 89;
+            this.eot = dfa_25;
+            this.eof = dfa_66;
+            this.min = dfa_67;
+            this.max = dfa_68;
+            this.accept = dfa_69;
+            this.special = dfa_70;
+            this.transition = dfa_71;
+        }
+        public String getDescription() {
+            return "()* loopback of 7843:2: ( rule__DeprecatedSection__ElementAssignment_0_3 )*";
+        }
+    }
+    static final String dfa_72s = "\1\12\14\uffff";
+    static final String dfa_73s = "\1\6\11\0\3\uffff";
+    static final String dfa_74s = "\1\57\11\0\3\uffff";
+    static final String dfa_75s = "\12\uffff\1\2\1\uffff\1\1";
+    static final String dfa_76s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\3\uffff}>";
+    static final String[] dfa_77s = {
+            "\1\11\1\12\6\uffff\1\1\3\uffff\1\2\27\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            ""
+    };
+    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
+    static final char[] dfa_73 = DFA.unpackEncodedStringToUnsignedChars(dfa_73s);
+    static final char[] dfa_74 = DFA.unpackEncodedStringToUnsignedChars(dfa_74s);
+    static final short[] dfa_75 = DFA.unpackEncodedString(dfa_75s);
+    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
+    static final short[][] dfa_77 = unpackEncodedStringArray(dfa_77s);
+
+    class DFA90 extends DFA {
+
+        public DFA90(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 90;
+            this.eot = dfa_1;
+            this.eof = dfa_72;
+            this.min = dfa_73;
+            this.max = dfa_74;
+            this.accept = dfa_75;
+            this.special = dfa_76;
+            this.transition = dfa_77;
+        }
+        public String getDescription() {
+            return "7896:2: ( ruleXID )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA90_1 = input.LA(1);
+
+                         
+                        int index90_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred121_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index90_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA90_2 = input.LA(1);
+
+                         
+                        int index90_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred121_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index90_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA90_3 = input.LA(1);
+
+                         
+                        int index90_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred121_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index90_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA90_4 = input.LA(1);
+
+                         
+                        int index90_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred121_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index90_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA90_5 = input.LA(1);
+
+                         
+                        int index90_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred121_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index90_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA90_6 = input.LA(1);
+
+                         
+                        int index90_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred121_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index90_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA90_7 = input.LA(1);
+
+                         
+                        int index90_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred121_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index90_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA90_8 = input.LA(1);
+
+                         
+                        int index90_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred121_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index90_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA90_9 = input.LA(1);
+
+                         
+                        int index90_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred121_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index90_9);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 90, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_78s = "\1\6\1\uffff\12\0\1\uffff";
+    static final String dfa_79s = "\1\57\1\uffff\12\0\1\uffff";
+    static final String dfa_80s = "\2\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\uffff}>";
+    static final String[] dfa_81s = {
+            "\1\12\1\13\6\uffff\1\4\3\uffff\1\5\27\uffff\1\6\1\2\1\7\1\10\1\3\1\11",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+    static final char[] dfa_78 = DFA.unpackEncodedStringToUnsignedChars(dfa_78s);
+    static final char[] dfa_79 = DFA.unpackEncodedStringToUnsignedChars(dfa_79s);
+    static final short[] dfa_80 = DFA.unpackEncodedString(dfa_80s);
+    static final short[][] dfa_81 = unpackEncodedStringArray(dfa_81s);
+
+    class DFA93 extends DFA {
+
+        public DFA93(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 93;
+            this.eot = dfa_1;
+            this.eof = dfa_42;
+            this.min = dfa_78;
+            this.max = dfa_79;
+            this.accept = dfa_45;
+            this.special = dfa_80;
+            this.transition = dfa_81;
+        }
+        public String getDescription() {
+            return "()* loopback of 8112:2: ( rule__DeprecatedSection__ElementAssignment_1_2_1_1 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA93_2 = input.LA(1);
+
+                         
+                        int index93_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA93_3 = input.LA(1);
+
+                         
+                        int index93_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA93_4 = input.LA(1);
+
+                         
+                        int index93_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA93_5 = input.LA(1);
+
+                         
+                        int index93_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA93_6 = input.LA(1);
+
+                         
+                        int index93_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA93_7 = input.LA(1);
+
+                         
+                        int index93_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA93_8 = input.LA(1);
+
+                         
+                        int index93_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA93_9 = input.LA(1);
+
+                         
+                        int index93_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA93_10 = input.LA(1);
+
+                         
+                        int index93_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA93_11 = input.LA(1);
+
+                         
+                        int index93_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred124_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index93_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 93, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+    
+    private static class FollowSets000 {
+        public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x000014000003C000L});
+        public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0004FC0000044060L});
+        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0008FC0000044040L});
+        public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000FC0000044042L});
+        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000100000000L});
+        public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000044000L});
+        public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0030000000000020L});
+        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000100100L,0x0000000000000010L});
+        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000FC0000044040L});
+        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000180000L});
+        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000180002L});
+        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000600000L});
+        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0004FC0000044040L});
+        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0140000000000020L});
+        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0080FC0000044040L});
+        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0200000000000000L});
+        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0840FFF000144170L,0x000000000000FE9DL});
+        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0400000000000000L});
+        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000100L});
+        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0100000000000000L});
+        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000001800000L});
+        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0840FFF000144170L,0x000000000000FE1DL});
+        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000001800002L});
+        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000006000000L});
+        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000006000002L});
+        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x00000000F8000000L});
+        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000F00000000L});
+        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0800000000000000L});
+        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0800000000000002L});
+        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0xF000000000000000L});
+        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x1000000000000000L});
+        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x1000000000000002L});
+        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x2000000000000000L});
+        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x2000000000000002L});
+        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x4000000000000000L});
+        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x4000000000000002L});
+        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x8000000000000000L});
+        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x8000000000000002L});
+        public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000003000000000L});
+        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0040000000000000L});
+        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x08C0FFF000144170L,0x000000000000FE9DL});
+        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0020000000000000L});
+        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0020000000000002L});
+        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000FC0000044040L,0x0000000000000004L});
+        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000100L,0x0000000000000010L});
+        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000400000000L});
+        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000600L});
+        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
+        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
+        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
+        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000100L});
+        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000100000L});
+        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000040000000000L});
+        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000020L,0x0000000000000020L});
+        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000FC00000440C0L});
+        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000FC00000440C2L});
+        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000400000000000L});
+        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000FC000007C0C0L});
+        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000FC000007C0C2L});
+        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0080FC000007C0C0L});
+        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0003000000000000L});
+        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0848FFF000144170L,0x000000000000FE9DL});
+        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0840FFF000144172L,0x000000000000FE9DL});
+    }
+
+
+}
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/src/.gitkeep b/editor/sew/org.eclipse.efm.sew.xtext.ide/src/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/src/.gitkeep
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ide/xtend-gen/.gitkeep b/editor/sew/org.eclipse.efm.sew.xtext.ide/xtend-gen/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ide/xtend-gen/.gitkeep
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/.classpath b/editor/sew/org.eclipse.efm.sew.xtext.tests/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.tests/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/.project b/editor/sew/org.eclipse.efm.sew.xtext.tests/.project
new file mode 100644
index 0000000..ee2e231
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.sew.xtext.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/.settings/org.eclipse.core.resources.prefs b/editor/sew/org.eclipse.efm.sew.xtext.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/.settings/org.eclipse.jdt.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/.settings/org.eclipse.m2e.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext.tests/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/META-INF/MANIFEST.MF b/editor/sew/org.eclipse.efm.sew.xtext.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e7cdc14
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.sew.xtext.tests; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.sew.xtext,
+ org.eclipse.efm.sew.ecore,
+ org.junit;bundle-version="4.7.0",
+ org.eclipse.xtext.junit4,
+ org.eclipse.xtext.xbase.junit,
+ org.eclipse.xtext.xbase.lib
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.sew.xtext.tests
+Import-Package: org.hamcrest.core,
+ org.junit;version="4.5.0",
+ org.junit.runners.model;version="4.5.0",
+ org.junit.runner;version="4.5.0",
+ org.junit.runners;version="4.5.0",
+ org.junit.runner.manipulation;version="4.5.0",
+ org.junit.runner.notification;version="4.5.0"
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/build.properties b/editor/sew/org.eclipse.efm.sew.xtext.tests/build.properties
new file mode 100644
index 0000000..db8fe81
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/pom.xml b/editor/sew/org.eclipse.efm.sew.xtext.tests/pom.xml
new file mode 100644
index 0000000..ac845d6
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.sew</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.sew.xtext.tests</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.sew.xtext.tests</name>
+	<description>This plug-in contains the Symbex Workflow's Xtext based editor core tests.</description>
+
+		<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/src-gen/org/eclipse/efm/sew/xtext/tests/SEWInjectorProvider.java b/editor/sew/org.eclipse.efm.sew.xtext.tests/src-gen/org/eclipse/efm/sew/xtext/tests/SEWInjectorProvider.java
new file mode 100644
index 0000000..b4cb017
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/src-gen/org/eclipse/efm/sew/xtext/tests/SEWInjectorProvider.java
@@ -0,0 +1,75 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.tests;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.efm.sew.xtext.SEWRuntimeModule;
+import org.eclipse.efm.sew.xtext.SEWStandaloneSetup;
+import org.eclipse.xtext.junit4.GlobalRegistries;
+import org.eclipse.xtext.junit4.GlobalRegistries.GlobalStateMemento;
+import org.eclipse.xtext.junit4.IInjectorProvider;
+import org.eclipse.xtext.junit4.IRegistryConfigurator;
+
+public class SEWInjectorProvider implements IInjectorProvider, IRegistryConfigurator {
+
+	protected GlobalStateMemento stateBeforeInjectorCreation;
+	protected GlobalStateMemento stateAfterInjectorCreation;
+	protected Injector injector;
+
+	static {
+		GlobalRegistries.initializeDefaults();
+	}
+
+	@Override
+	public Injector getInjector() {
+		if (injector == null) {
+			stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+			this.injector = internalCreateInjector();
+			stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+		}
+		return injector;
+	}
+
+	protected Injector internalCreateInjector() {
+		return new SEWStandaloneSetup() {
+			@Override
+			public Injector createInjector() {
+				return Guice.createInjector(createRuntimeModule());
+			}
+		}.createInjectorAndDoEMFRegistration();
+	}
+
+	protected SEWRuntimeModule createRuntimeModule() {
+		// make it work also with Maven/Tycho and OSGI
+		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=493672
+		return new SEWRuntimeModule() {
+			@Override
+			public ClassLoader bindClassLoaderToInstance() {
+				return SEWInjectorProvider.class
+						.getClassLoader();
+			}
+		};
+	}
+
+	@Override
+	public void restoreRegistry() {
+		stateBeforeInjectorCreation.restoreGlobalState();
+	}
+
+	@Override
+	public void setupRegistry() {
+		getInjector();
+		stateAfterInjectorCreation.restoreGlobalState();
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/src/org/eclipse/efm/sew/xtext/tests/SEWParsingTest.xtend b/editor/sew/org.eclipse.efm.sew.xtext.tests/src/org/eclipse/efm/sew/xtext/tests/SEWParsingTest.xtend
new file mode 100644
index 0000000..7760fa4
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/src/org/eclipse/efm/sew/xtext/tests/SEWParsingTest.xtend
@@ -0,0 +1,39 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.tests
+
+import com.google.inject.Inject
+import org.eclipse.xtext.junit4.InjectWith
+import org.eclipse.xtext.junit4.XtextRunner
+import org.eclipse.xtext.junit4.util.ParseHelper
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.eclipse.efm.ecore.sew.SEWorkflow
+
+@RunWith(XtextRunner)
+@InjectWith(SEWInjectorProvider)
+class SEWParsingTest{
+
+	@Inject
+	ParseHelper<SEWorkflow> parseHelper;
+
+	@Test
+	def void loadModel() {
+		val result = parseHelper.parse('''
+			Hello Xtext!
+		''')
+		Assert.assertNotNull(result)
+	}
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/xtend-gen/.SEWParsingTest.xtendbin b/editor/sew/org.eclipse.efm.sew.xtext.tests/xtend-gen/.SEWParsingTest.xtendbin
new file mode 100644
index 0000000..e5250a7
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/xtend-gen/.SEWParsingTest.xtendbin
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.tests/xtend-gen/org/eclipse/efm/sew/xtext/tests/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.tests/xtend-gen/org/eclipse/efm/sew/xtext/tests/.gitignore
new file mode 100644
index 0000000..074ff3f
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.tests/xtend-gen/org/eclipse/efm/sew/xtext/tests/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/SEWParsingTest.java
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.classpath b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.project b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.project
new file mode 100644
index 0000000..28e7427
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.sew.xtext.ui.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.settings/org.eclipse.core.resources.prefs b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.settings/org.eclipse.jdt.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.settings/org.eclipse.m2e.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/META-INF/MANIFEST.MF b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..49b2c20
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.sew.xtext.ui.tests; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.sew.xtext.ui,
+ org.eclipse.efm.sew.ecore,
+ org.junit;bundle-version="4.7.0",
+ org.eclipse.xtext.junit4,
+ org.eclipse.xtext.xbase.junit,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.workbench;resolution:=optional
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.sew.xtext.ui.tests
+Import-Package: org.hamcrest.core,
+ org.junit;version="4.5.0",
+ org.junit.runners.model;version="4.5.0",
+ org.junit.runner;version="4.5.0",
+ org.junit.runners;version="4.5.0",
+ org.junit.runner.manipulation;version="4.5.0",
+ org.junit.runner.notification;version="4.5.0"
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/build.properties b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/build.properties
new file mode 100644
index 0000000..db8fe81
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/pom.xml b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/pom.xml
new file mode 100644
index 0000000..b334e1f
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.sew</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.sew.xtext.ui.tests</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.sew.xtext.ui.tests</name>
+	<description>This plug-in contains the Symbex Workflow's Xtext based editor UI tests.</description>
+
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/src-gen/org/eclipse/efm/sew/xtext/ui/tests/SEWUiInjectorProvider.java b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/src-gen/org/eclipse/efm/sew/xtext/ui/tests/SEWUiInjectorProvider.java
new file mode 100644
index 0000000..f4e34eb
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/src-gen/org/eclipse/efm/sew/xtext/ui/tests/SEWUiInjectorProvider.java
@@ -0,0 +1,26 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui.tests;
+
+import com.google.inject.Injector;
+import org.eclipse.efm.sew.xtext.ui.internal.XtextActivator;
+import org.eclipse.xtext.junit4.IInjectorProvider;
+
+public class SEWUiInjectorProvider implements IInjectorProvider {
+
+	@Override
+	public Injector getInjector() {
+		return XtextActivator.getInstance().getInjector("org.eclipse.efm.sew.xtext.SEW");
+	}
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/src/.gitkeep b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/src/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/src/.gitkeep
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/xtend-gen/.gitkeep b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/xtend-gen/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui.tests/xtend-gen/.gitkeep
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/.classpath b/editor/sew/org.eclipse.efm.sew.xtext.ui/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.ui/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/.project b/editor/sew/org.eclipse.efm.sew.xtext.ui/.project
new file mode 100644
index 0000000..0bb93cc
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.sew.xtext.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/.settings/org.eclipse.core.resources.prefs b/editor/sew/org.eclipse.efm.sew.xtext.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/.settings/org.eclipse.jdt.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/.settings/org.eclipse.m2e.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext.ui/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/META-INF/MANIFEST.MF b/editor/sew/org.eclipse.efm.sew.xtext.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..733aaaf
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.sew.xtext.ui; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.sew.xtext,
+ org.eclipse.efm.sew.xtext.ide,
+ org.eclipse.efm.sew.ecore,
+ org.eclipse.xtext.ui,
+ org.eclipse.xtext.ui.shared,
+ org.eclipse.xtext.ui.codetemplates.ui,
+ org.eclipse.ui.editors;bundle-version="3.5.0",
+ org.eclipse.ui.ide;bundle-version="3.5.0",
+ org.eclipse.ui,
+ org.eclipse.compare,
+ org.eclipse.xtext.builder,
+ org.eclipse.xtend.lib;resolution:=optional,
+ org.eclipse.xtext.xbase.lib
+Import-Package: org.apache.log4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.sew.xtext.ui.internal,
+ org.eclipse.efm.sew.xtext.ui.quickfix,
+ org.eclipse.efm.sew.xtext.ui.contentassist
+Bundle-Activator: org.eclipse.efm.sew.xtext.ui.internal.XtextActivator
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/README.md b/editor/sew/org.eclipse.efm.sew.xtext.ui/README.md
new file mode 100644
index 0000000..e78d298
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/README.md
@@ -0,0 +1,3 @@
+# EFM, Symbolic Execution Workflow Xtext based Editor UI
+
+Model Ecore for Xtext Editor
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/about.html b/editor/sew/org.eclipse.efm.sew.xtext.ui/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/build.properties b/editor/sew/org.eclipse.efm.sew.xtext.ui/build.properties
new file mode 100644
index 0000000..17460c9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/,\
+               plugin.xml,\
+               icons/
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Class.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Class.gif
new file mode 100644
index 0000000..7c33c76
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Class.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Constraint.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Constraint.gif
new file mode 100644
index 0000000..eed6ace
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Constraint.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/EnumerationLiteral.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/EnumerationLiteral.gif
new file mode 100644
index 0000000..4967b56
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/EnumerationLiteral.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Expression.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Expression.gif
new file mode 100644
index 0000000..4c5d117
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Expression.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/False.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/False.gif
new file mode 100644
index 0000000..2877ea2
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/False.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Folder.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Folder.gif
new file mode 100644
index 0000000..51e703b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/Folder.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralBoolean.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralBoolean.gif
new file mode 100644
index 0000000..656797f
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralBoolean.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralInteger.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralInteger.gif
new file mode 100644
index 0000000..3bd99b3
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralInteger.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralReal.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralReal.gif
new file mode 100644
index 0000000..8bbd722
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralReal.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralString.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralString.gif
new file mode 100644
index 0000000..ef367ef
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/LiteralString.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/True.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/True.gif
new file mode 100644
index 0000000..8202d32
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/True.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/newprj_wiz.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/newprj_wiz.gif
new file mode 100644
index 0000000..dc7d3a7
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/newprj_wiz.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/stack.gif b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/stack.gif
new file mode 100644
index 0000000..2344861
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/icons/stack.gif
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/plugin.xml b/editor/sew/org.eclipse.efm.sew.xtext.ui/plugin.xml
new file mode 100644
index 0000000..53b8d2e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/plugin.xml
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<plugin>
+	<extension
+		point="org.eclipse.ui.editors">
+		<editor
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+			contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+			default="true"
+			extensions="sew,favm"
+			id="org.eclipse.efm.sew.xtext.SEW"
+			name="SymbEx-Workflow Editor">
+		</editor>
+	</extension>
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+			commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+			commandId="org.eclipse.efm.sew.xtext.SEW.validate">
+		<activeWhen>
+			<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+			</reference>
+		</activeWhen>
+		</handler>
+		<!-- copy qualified name -->
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+			<activeWhen>
+				<and>
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.XtextEditor.opened" />
+					<iterate>
+						<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+					</iterate>
+				</and>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+			<and>
+				<reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+						value="org.eclipse.efm.sew.xtext.SEW"
+						forcePluginActivation="true"/>
+				</with>
+			</and>
+		</definition>
+		<definition id="org.eclipse.efm.sew.xtext.SEW.XtextEditor.opened">
+			<and>
+				<reference definitionId="isXtextEditorActive"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+						value="org.eclipse.efm.sew.xtext.SEW"
+						forcePluginActivation="true"/>
+				</with>
+			</and>
+		</definition>
+	</extension>
+	<extension
+			point="org.eclipse.ui.preferencePages">
+		<page
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW"
+			name="SEW">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.coloring"
+			name="Syntax Coloring">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.templates"
+			name="Templates">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+	</extension>
+	<extension
+			point="org.eclipse.ui.propertyPages">
+		<page
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW"
+			name="SEW">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension
+		point="org.eclipse.ui.keywords">
+		<keyword
+			id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"
+			label="SEW"/>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+	<command
+			description="Trigger expensive validation"
+			id="org.eclipse.efm.sew.xtext.SEW.validate"
+			name="Validate">
+	</command>
+	<!-- copy qualified name -->
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			 <command
+				 commandId="org.eclipse.efm.sew.xtext.SEW.validate"
+				 style="push"
+				 tooltip="Trigger expensive validation">
+			<visibleWhen checkEnabled="false">
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</visibleWhen>
+		</command>
+		</menuContribution>
+		<!-- copy qualified name -->
+		<menuContribution locationURI="popup:#TextEditorContext?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="menu:edit?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<and>
+						<reference definitionId="org.eclipse.efm.sew.xtext.SEW.XtextEditor.opened" />
+						<iterate>
+							<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+						</iterate>
+					</and>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?endof=group.find">
+			<command commandId="org.eclipse.xtext.ui.editor.FindReferences">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+			commandId="org.eclipse.xtext.ui.editor.FindReferences">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- adding resource factories -->
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="sew">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+	    <resourceServiceProvider
+	        class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+	        uriExtension="sew">
+	    </resourceServiceProvider>
+	</extension>
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="favm">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+	    <resourceServiceProvider
+	        class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+	        uriExtension="favm">
+	    </resourceServiceProvider>
+	</extension>
+	<!-- marker definitions for org.eclipse.efm.sew.xtext.SEW -->
+	<extension
+			id="sew.check.fast"
+			name="SEW Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.fast"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="sew.check.normal"
+			name="SEW Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.normal"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="sew.check.expensive"
+			name="SEW Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.expensive"/>
+		<persistent value="true"/>
+	</extension>
+	<extension point="org.eclipse.xtext.builder.participant">
+		<participant
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+			fileExtensions="sew,favm"/>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.compiler.preferencePage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.propertyPages">
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.compiler.propertyPage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?after=xtext.ui.openDeclaration">
+			<command
+				commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand"
+				id="org.eclipse.efm.sew.xtext.SEW.OpenGeneratedCode"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"
+			commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- Quick Outline -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+		<command
+			description="Open the quick outline."
+			id="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+			name="Quick Outline">
+		</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.open">
+			<command commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+				style="push"
+				tooltip="Open Quick Outline">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<!-- quickfix marker resolution generator for org.eclipse.efm.sew.xtext.SEW -->
+	<extension
+	        point="org.eclipse.ui.ide.markerResolution">
+	    <markerResolutionGenerator
+	        class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+	        markerType="org.eclipse.efm.sew.xtext.ui.sew.check.fast">
+	        <attribute
+	            name="FIXABLE_KEY"
+	            value="true">
+	        </attribute>
+	    </markerResolutionGenerator>
+	    <markerResolutionGenerator
+	        class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+	        markerType="org.eclipse.efm.sew.xtext.ui.sew.check.normal">
+	        <attribute
+	            name="FIXABLE_KEY"
+	            value="true">
+	        </attribute>
+	    </markerResolutionGenerator>
+	    <markerResolutionGenerator
+	        class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+	        markerType="org.eclipse.efm.sew.xtext.ui.sew.check.expensive">
+	        <attribute
+	            name="FIXABLE_KEY"
+	            value="true">
+	        </attribute>
+	    </markerResolutionGenerator>
+	</extension>
+	<!-- Rename Refactoring -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
+			commandId="org.eclipse.xtext.ui.refactoring.RenameElement">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			<command commandId="org.eclipse.xtext.ui.refactoring.RenameElement"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference
+						definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.refactoring"
+			name="Refactoring">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.compare.contentViewers">
+		<viewer id="org.eclipse.efm.sew.xtext.SEW.compare.contentViewers"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="sew,favm">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.compare.contentMergeViewers">
+		<viewer id="org.eclipse.efm.sew.xtext.SEW.compare.contentMergeViewers"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="sew,favm" label="SEW Compare">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider id="org.eclipse.efm.sew.xtext.SEW.editors.documentProviders"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+			extensions="sew,favm">
+		</provider>
+	</extension>
+	<extension point="org.eclipse.team.core.fileTypes">
+		<fileTypes
+			extension="sew"
+			type="text">
+		</fileTypes>
+		<fileTypes
+			extension="favm"
+			type="text">
+		</fileTypes>
+	</extension>
+</plugin>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/plugin.xml_gen b/editor/sew/org.eclipse.efm.sew.xtext.ui/plugin.xml_gen
new file mode 100644
index 0000000..176420d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/plugin.xml_gen
@@ -0,0 +1,427 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+	<extension
+		point="org.eclipse.ui.editors">
+		<editor
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+			contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+			default="true"
+			extensions="sew,favm"
+			id="org.eclipse.efm.sew.xtext.SEW"
+			name="SEW Editor">
+		</editor>
+	</extension>
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+			commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+			commandId="org.eclipse.efm.sew.xtext.SEW.validate">
+		<activeWhen>
+			<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+			</reference>
+		</activeWhen>
+		</handler>
+		<!-- copy qualified name -->
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+			<activeWhen>
+				<and>
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.XtextEditor.opened" />
+					<iterate>
+						<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+					</iterate>
+				</and>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+			<and>
+				<reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+						value="org.eclipse.efm.sew.xtext.SEW" 
+						forcePluginActivation="true"/>
+				</with>		
+			</and>
+		</definition>
+		<definition id="org.eclipse.efm.sew.xtext.SEW.XtextEditor.opened">
+			<and>
+				<reference definitionId="isXtextEditorActive"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+						value="org.eclipse.efm.sew.xtext.SEW" 
+						forcePluginActivation="true"/>
+				</with>		
+			</and>
+		</definition>
+	</extension>
+	<extension
+			point="org.eclipse.ui.preferencePages">
+		<page
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW"
+			name="SEW">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.coloring"
+			name="Syntax Coloring">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.templates"
+			name="Templates">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+	</extension>
+	<extension
+			point="org.eclipse.ui.propertyPages">
+		<page
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW"
+			name="SEW">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension
+		point="org.eclipse.ui.keywords">
+		<keyword
+			id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"
+			label="SEW"/>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+	<command
+			description="Trigger expensive validation"
+			id="org.eclipse.efm.sew.xtext.SEW.validate"
+			name="Validate">
+	</command>
+	<!-- copy qualified name -->
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			 <command
+				 commandId="org.eclipse.efm.sew.xtext.SEW.validate"
+				 style="push"
+				 tooltip="Trigger expensive validation">
+			<visibleWhen checkEnabled="false">
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</visibleWhen>
+		</command>
+		</menuContribution>
+		<!-- copy qualified name -->
+		<menuContribution locationURI="popup:#TextEditorContext?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName" 
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="menu:edit?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName" 
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<and>
+						<reference definitionId="org.eclipse.efm.sew.xtext.SEW.XtextEditor.opened" />
+						<iterate>
+							<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+						</iterate>
+					</and>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?endof=group.find">
+			<command commandId="org.eclipse.xtext.ui.editor.FindReferences">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+			commandId="org.eclipse.xtext.ui.editor.FindReferences">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- adding resource factories -->
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="sew">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="sew">
+		</resourceServiceProvider>
+	</extension>
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="favm">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="favm">
+		</resourceServiceProvider>
+	</extension>
+	<!-- marker definitions for org.eclipse.efm.sew.xtext.SEW -->
+	<extension
+			id="sew.check.fast"
+			name="SEW Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.fast"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="sew.check.normal"
+			name="SEW Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.normal"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="sew.check.expensive"
+			name="SEW Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.expensive"/>
+		<persistent value="true"/>
+	</extension>
+	<extension point="org.eclipse.xtext.builder.participant">
+		<participant
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+			fileExtensions="sew,favm"/>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.compiler.preferencePage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.propertyPages">
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.compiler.propertyPage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?after=xtext.ui.openDeclaration">
+			<command
+				commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand"
+				id="org.eclipse.efm.sew.xtext.SEW.OpenGeneratedCode"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"
+			commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened" />
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- Quick Outline -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+		<command
+			description="Open the quick outline."
+			id="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+			name="Quick Outline">
+		</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.open">
+			<command commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+				style="push"
+				tooltip="Open Quick Outline">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<!-- quickfix marker resolution generator for org.eclipse.efm.sew.xtext.SEW -->
+	<extension
+			point="org.eclipse.ui.ide.markerResolution">
+		<markerResolutionGenerator
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.sew.xtext.ui.sew.check.fast">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.sew.xtext.ui.sew.check.normal">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.sew.xtext.ui.sew.check.expensive">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+	</extension>
+	<!-- Rename Refactoring -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
+			commandId="org.eclipse.xtext.ui.refactoring.RenameElement">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			<command commandId="org.eclipse.xtext.ui.refactoring.RenameElement"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference
+						definitionId="org.eclipse.efm.sew.xtext.SEW.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.sew.xtext.SEW"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+			id="org.eclipse.efm.sew.xtext.SEW.refactoring"
+			name="Refactoring">
+			<keywordReference id="org.eclipse.efm.sew.xtext.ui.keyword_SEW"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.compare.contentViewers">
+		<viewer id="org.eclipse.efm.sew.xtext.SEW.compare.contentViewers"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="sew,favm">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.compare.contentMergeViewers">
+		<viewer id="org.eclipse.efm.sew.xtext.SEW.compare.contentMergeViewers"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="sew,favm" label="SEW Compare">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider id="org.eclipse.efm.sew.xtext.SEW.editors.documentProviders"
+			class="org.eclipse.efm.sew.xtext.ui.SEWExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+			extensions="sew,favm">
+		</provider>
+	</extension>
+	<extension point="org.eclipse.team.core.fileTypes">
+		<fileTypes
+			extension="sew"
+			type="text">
+		</fileTypes>
+		<fileTypes
+			extension="favm"
+			type="text">
+		</fileTypes>
+	</extension>
+</plugin>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/pom.xml b/editor/sew/org.eclipse.efm.sew.xtext.ui/pom.xml
new file mode 100644
index 0000000..c4bd2cf
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.sew</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.sew.xtext.ui</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.sew.xtext.ui</name>
+	<description>This plug-in contains the Symbex Workflow's Xtext based editor UI.</description>
+
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/AbstractSEWUiModule.java b/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/AbstractSEWUiModule.java
new file mode 100644
index 0000000..ad8b54b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/AbstractSEWUiModule.java
@@ -0,0 +1,289 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui;
+
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import org.eclipse.compare.IViewerCreator;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.efm.sew.xtext.ide.contentassist.antlr.PartialSEWContentAssistParser;
+import org.eclipse.efm.sew.xtext.ide.contentassist.antlr.SEWParser;
+import org.eclipse.efm.sew.xtext.ide.contentassist.antlr.internal.InternalSEWLexer;
+import org.eclipse.efm.sew.xtext.ui.contentassist.SEWProposalProvider;
+import org.eclipse.efm.sew.xtext.ui.labeling.SEWDescriptionLabelProvider;
+import org.eclipse.efm.sew.xtext.ui.labeling.SEWLabelProvider;
+import org.eclipse.efm.sew.xtext.ui.outline.SEWOutlineTreeProvider;
+import org.eclipse.efm.sew.xtext.ui.quickfix.SEWQuickfixProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.builder.BuilderParticipant;
+import org.eclipse.xtext.builder.EclipseOutputConfigurationProvider;
+import org.eclipse.xtext.builder.IXtextBuilderParticipant;
+import org.eclipse.xtext.builder.builderState.IBuilderState;
+import org.eclipse.xtext.builder.clustering.CurrentDescriptions;
+import org.eclipse.xtext.builder.impl.PersistentDataAwareDirtyResource;
+import org.eclipse.xtext.builder.nature.NatureAddingEditorCallback;
+import org.eclipse.xtext.builder.preferences.BuilderPreferenceAccess;
+import org.eclipse.xtext.generator.IContextualOutputConfigurationProvider;
+import org.eclipse.xtext.ide.LexerIdeBindings;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.IContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.service.SingletonBinding;
+import org.eclipse.xtext.ui.DefaultUiModule;
+import org.eclipse.xtext.ui.codetemplates.ui.AccessibleCodetemplatesActivator;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.PartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.AdvancedTemplatesPreferencePage;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.TemplatesLanguageConfiguration;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistrar;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistry;
+import org.eclipse.xtext.ui.compare.DefaultViewerCreator;
+import org.eclipse.xtext.ui.editor.DocumentBasedDirtyResource;
+import org.eclipse.xtext.ui.editor.IXtextEditorCallback;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.FQNPrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.IContentProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.IProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.AntlrProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.DelegatingContentAssistContextFactory;
+import org.eclipse.xtext.ui.editor.outline.IOutlineTreeProvider;
+import org.eclipse.xtext.ui.editor.outline.impl.IOutlineTreeStructureProvider;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider;
+import org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage;
+import org.eclipse.xtext.ui.refactoring.IDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.IReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.IRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.IRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.ui.DefaultRenameSupport;
+import org.eclipse.xtext.ui.refactoring.ui.IRenameSupport;
+import org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferences;
+import org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider;
+import org.eclipse.xtext.ui.shared.Access;
+
+/**
+ * Manual modifications go to {@link SEWUiModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractSEWUiModule extends DefaultUiModule {
+
+	public AbstractSEWUiModule(AbstractUIPlugin plugin) {
+		super(plugin);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ImplicitFragment
+	public Provider<IAllContainersState> provideIAllContainersState() {
+		return Access.getJavaProjectsState();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IProposalConflictHelper> bindIProposalConflictHelper() {
+		return AntlrProposalConflictHelper.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureContentAssistLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.CONTENT_ASSIST))
+			.to(InternalSEWLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureHighlightingLexer(Binder binder) {
+		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(org.eclipse.efm.sew.xtext.parser.antlr.internal.InternalSEWLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureHighlightingTokenDefProvider(Binder binder) {
+		binder.bind(ITokenDefProvider.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(AntlrTokenDefProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ContentAssistContext.Factory> bindContentAssistContext$Factory() {
+		return DelegatingContentAssistContextFactory.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IContentAssistParser> bindIContentAssistParser() {
+		return SEWParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureContentAssistLexerProvider(Binder binder) {
+		binder.bind(InternalSEWLexer.class).toProvider(LexerProvider.create(InternalSEWLexer.class));
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+	public Class<? extends PrefixMatcher> bindPrefixMatcher() {
+		return FQNPrefixMatcher.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsBuilderScope(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.NAMED_BUILDER_SCOPE)).to(CurrentDescriptions.ResourceSetAware.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IXtextEditorCallback> bindIXtextEditorCallback() {
+		return NatureAddingEditorCallback.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContextualOutputConfigurationProvider> bindIContextualOutputConfigurationProvider() {
+		return EclipseOutputConfigurationProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsPersisted(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(IBuilderState.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends DocumentBasedDirtyResource> bindDocumentBasedDirtyResource() {
+		return PersistentDataAwareDirtyResource.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public Class<? extends IXtextBuilderParticipant> bindIXtextBuilderParticipant() {
+		return BuilderParticipant.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public IWorkspaceRoot bindIWorkspaceRootToInstance() {
+		return ResourcesPlugin.getWorkspace().getRoot();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public void configureBuilderPreferenceStoreInitializer(Binder binder) {
+		binder.bind(IPreferenceStoreInitializer.class)
+			.annotatedWith(Names.named("builderPreferenceInitializer"))
+			.to(BuilderPreferenceAccess.Initializer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public Class<? extends ILabelProvider> bindILabelProvider() {
+		return SEWLabelProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public void configureResourceUIServiceLabelProvider(Binder binder) {
+		binder.bind(ILabelProvider.class).annotatedWith(ResourceServiceDescriptionLabelProvider.class).to(SEWDescriptionLabelProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeProvider> bindIOutlineTreeProvider() {
+		return SEWOutlineTreeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
+		return SEWOutlineTreeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.quickfix.QuickfixProviderFragment2
+	public Class<? extends IssueResolutionProvider> bindIssueResolutionProvider() {
+		return SEWQuickfixProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.contentAssist.ContentAssistFragment2
+	public Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
+		return SEWProposalProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameStrategy> bindIRenameStrategy() {
+		return DefaultRenameStrategy.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IReferenceUpdater> bindIReferenceUpdater() {
+		return DefaultReferenceUpdater.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public void configureIPreferenceStoreInitializer(Binder binder) {
+		binder.bind(IPreferenceStoreInitializer.class)
+			.annotatedWith(Names.named("RefactoringPreferences"))
+			.to(RefactoringPreferences.Initializer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
+		return DefaultRenameRefactoringProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameSupport.Factory> bindIRenameSupport$Factory() {
+		return DefaultRenameSupport.Factory.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<TemplatesLanguageConfiguration> provideTemplatesLanguageConfiguration() {
+		return AccessibleCodetemplatesActivator.getTemplatesLanguageConfigurationProvider();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<LanguageRegistry> provideLanguageRegistry() {
+		return AccessibleCodetemplatesActivator.getLanguageRegistry();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends LanguageRegistrar> bindLanguageRegistrar() {
+		return LanguageRegistrar.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends XtextTemplatePreferencePage> bindXtextTemplatePreferencePage() {
+		return AdvancedTemplatesPreferencePage.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistParser> bindIPartialEditingContentAssistParser() {
+		return PartialSEWContentAssistParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistContextFactory> bindIPartialEditingContentAssistContextFactory() {
+		return PartialEditingContentAssistContextFactory.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.compare.CompareFragment2
+	public Class<? extends IViewerCreator> bindIViewerCreator() {
+		return DefaultViewerCreator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.SimpleNamesFragment2
+	public Class<? extends IDependentElementsCalculator> bindIDependentElementsCalculator() {
+		return DefaultDependentElementsCalculator.class;
+	}
+	
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/SEWExecutableExtensionFactory.java b/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/SEWExecutableExtensionFactory.java
new file mode 100644
index 0000000..b4b46f8
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/SEWExecutableExtensionFactory.java
@@ -0,0 +1,36 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui;
+
+import com.google.inject.Injector;
+import org.eclipse.efm.sew.xtext.ui.internal.XtextActivator;
+import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
+import org.osgi.framework.Bundle;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass. 
+ */
+public class SEWExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
+
+	@Override
+	protected Bundle getBundle() {
+		return XtextActivator.getInstance().getBundle();
+	}
+	
+	@Override
+	protected Injector getInjector() {
+		return XtextActivator.getInstance().getInjector(XtextActivator.ORG_ECLIPSE_EFM_SEW_XTEXT_SEW);
+	}
+	
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/contentassist/AbstractSEWProposalProvider.java b/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/contentassist/AbstractSEWProposalProvider.java
new file mode 100644
index 0000000..1418844
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/contentassist/AbstractSEWProposalProvider.java
@@ -0,0 +1,409 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui.contentassist;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+
+/**
+ * Represents a generated, default implementation of superclass {@link TerminalsProposalProvider}.
+ * Methods are dynamically dispatched on the first parameter, i.e., you can override them 
+ * with a more concrete subtype. 
+ */
+public abstract class AbstractSEWProposalProvider extends TerminalsProposalProvider {
+
+	public void completeWorkflow_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeWorkflow_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeWorkflow_Description(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeWorkflow_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		if (assignment.getTerminal() instanceof Alternatives) {
+			completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+			completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(1)), context, acceptor);
+		}
+		if (assignment.getTerminal() instanceof RuleCall) {
+			completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+		}
+	}
+	public void completeObject_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeObject_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeObject_Description(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeObject_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(1)), context, acceptor);
+	}
+	public void completeSection_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSection_Description(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSection_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(1)), context, acceptor);
+	}
+	public void completeAttribute_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeAttribute_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeConditionalExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeConditionalExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeConditionalOrExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeConditionalOrExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeConditionalAndExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeConditionalAndExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEqualityExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeEqualityExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRelationalExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeRelationalExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeAdditiveExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeAdditiveExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMultiplicativeExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeMultiplicativeExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimaryExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		if (assignment.getTerminal() instanceof Keyword) {
+			// subclasses may override
+		}
+		if (assignment.getTerminal() instanceof Alternatives) {
+			// subclasses may override
+			// subclasses may override
+		}
+	}
+	public void completePrimaryExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralArrayValue_Values(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralObjectReference_Object(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralObjectReference_Symbol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralBooleanValue_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralCharacterValue_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralIntegerValue_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralRationalValue_Numerator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralRationalValue_Denominator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralFloatValue_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralRealValue_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralStringValue_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralNullValue_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralTimeVariable_Symbol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeLiteralTimeDeltaVariable_Symbol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeLiteralThisInstance_Symbol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeLiteralSelfInstance_Symbol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeLiteralParentInstance_Symbol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeLiteralSuperInstance_Symbol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeLiteralSystemInstance_Symbol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeLiteralEnvInstance_Symbol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeDeprecatedObject_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDeprecatedObject_Description(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDeprecatedObject_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDeprecatedObject_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDeprecatedSection_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDeprecatedSection_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(1)), context, acceptor);
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(2)), context, acceptor);
+	}
+	public void completeDeprecatedSection_Description(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDeprecatedAttribute_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDeprecatedAttribute_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDeprecatedExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeDeprecatedExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+
+	public void complete_Workflow(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Prolog(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ReservedWord(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_XIDENDIFIER(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_AT_IDENTIFIER(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_XID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_UFI(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Object(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Property(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Section(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Attribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ValueSpecification(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Expression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_conditionalExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_conditionalOrExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_conditionalAndExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_equalityExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_relationalExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_additiveExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_multiplicativeExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_primaryExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralArrayValue(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralObjectReference(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralBooleanValue(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralCharacterValue(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralIntegerValue(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralRationalValue(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralFloatValue(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralRealValue(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralStringValue(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralNullValue(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralVariableReference(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralTimeVariable(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralTimeDeltaVariable(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralInstanceReference(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralThisInstance(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralSelfInstance(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralParentInstance(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralSuperInstance(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralSystemInstance(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralEnvInstance(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EBoolean(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_CHARACTER(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EChar(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ELong(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EDouble(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EBigDecimal(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EString(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DeprecatedReservedWord(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DeprecatedObject(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DeprecatedProperty(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DeprecatedSection(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DeprecatedAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DeprecatedAttributeID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DeprecatedExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/internal/XtextActivator.java b/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/internal/XtextActivator.java
new file mode 100644
index 0000000..3ff3a69
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src-gen/org/eclipse/efm/sew/xtext/ui/internal/XtextActivator.java
@@ -0,0 +1,102 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui.internal;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import java.util.Collections;
+import java.util.Map;
+import org.apache.log4j.Logger;
+import org.eclipse.efm.sew.xtext.SEWRuntimeModule;
+import org.eclipse.efm.sew.xtext.ui.SEWUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.ui.shared.SharedStateModule;
+import org.eclipse.xtext.util.Modules2;
+import org.osgi.framework.BundleContext;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass. 
+ */
+public class XtextActivator extends AbstractUIPlugin {
+
+	public static final String ORG_ECLIPSE_EFM_SEW_XTEXT_SEW = "org.eclipse.efm.sew.xtext.SEW";
+	
+	private static final Logger logger = Logger.getLogger(XtextActivator.class);
+	
+	private static XtextActivator INSTANCE;
+	
+	private Map<String, Injector> injectors = Collections.synchronizedMap(Maps.<String, Injector> newHashMapWithExpectedSize(1));
+	
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		INSTANCE = this;
+	}
+	
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		injectors.clear();
+		INSTANCE = null;
+		super.stop(context);
+	}
+	
+	public static XtextActivator getInstance() {
+		return INSTANCE;
+	}
+	
+	public Injector getInjector(String language) {
+		synchronized (injectors) {
+			Injector injector = injectors.get(language);
+			if (injector == null) {
+				injectors.put(language, injector = createInjector(language));
+			}
+			return injector;
+		}
+	}
+	
+	protected Injector createInjector(String language) {
+		try {
+			Module runtimeModule = getRuntimeModule(language);
+			Module sharedStateModule = getSharedStateModule();
+			Module uiModule = getUiModule(language);
+			Module mergedModule = Modules2.mixin(runtimeModule, sharedStateModule, uiModule);
+			return Guice.createInjector(mergedModule);
+		} catch (Exception e) {
+			logger.error("Failed to create injector for " + language);
+			logger.error(e.getMessage(), e);
+			throw new RuntimeException("Failed to create injector for " + language, e);
+		}
+	}
+	
+	protected Module getRuntimeModule(String grammar) {
+		if (ORG_ECLIPSE_EFM_SEW_XTEXT_SEW.equals(grammar)) {
+			return new SEWRuntimeModule();
+		}
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getUiModule(String grammar) {
+		if (ORG_ECLIPSE_EFM_SEW_XTEXT_SEW.equals(grammar)) {
+			return new SEWUiModule(this);
+		}
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getSharedStateModule() {
+		return new SharedStateModule();
+	}
+	
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/SEWUiModule.xtend b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/SEWUiModule.xtend
new file mode 100644
index 0000000..5b0205d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/SEWUiModule.xtend
@@ -0,0 +1,22 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui
+
+import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
+
+/**
+ * Use this class to register components to be used within the Eclipse IDE.
+ */
+@FinalFieldsConstructor
+class SEWUiModule extends AbstractSEWUiModule {
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/contentassist/SEWProposalProvider.xtend b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/contentassist/SEWProposalProvider.xtend
new file mode 100644
index 0000000..650f3ec
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/contentassist/SEWProposalProvider.xtend
@@ -0,0 +1,21 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui.contentassist
+
+
+/**
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#content-assist
+ * on how to customize the content assistant.
+ */
+class SEWProposalProvider extends AbstractSEWProposalProvider {
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/labeling/SEWDescriptionLabelProvider.xtend b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/labeling/SEWDescriptionLabelProvider.xtend
new file mode 100644
index 0000000..cc81d03
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/labeling/SEWDescriptionLabelProvider.xtend
@@ -0,0 +1,33 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui.labeling
+
+import org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider
+
+/**
+ * Provides labels for IEObjectDescriptions and IResourceDescriptions.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+class SEWDescriptionLabelProvider extends DefaultDescriptionLabelProvider {
+
+	// Labels and icons can be computed like this:
+	
+//	override text(IEObjectDescription ele) {
+//		ele.name.toString
+//	}
+//	 
+//	override image(IEObjectDescription ele) {
+//		ele.EClass.name + '.gif'
+//	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/labeling/SEWLabelProvider.xtend b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/labeling/SEWLabelProvider.xtend
new file mode 100644
index 0000000..3339c6e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/labeling/SEWLabelProvider.xtend
@@ -0,0 +1,311 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui.labeling
+
+import com.google.inject.Inject
+import org.eclipse.efm.ecore.sew.SEWorkflow
+import org.eclipse.efm.ecore.sew.WAttribute
+import org.eclipse.efm.ecore.sew.WObject
+import org.eclipse.efm.ecore.sew.WSection
+import org.eclipse.efm.ecore.sew.expression.Expression
+import org.eclipse.efm.ecore.sew.expression.LiteralArrayValue
+import org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue
+import org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue
+import org.eclipse.efm.ecore.sew.expression.LiteralFloatValue
+import org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue
+import org.eclipse.efm.ecore.sew.expression.LiteralNullValue
+import org.eclipse.efm.ecore.sew.expression.LiteralRationalValue
+import org.eclipse.efm.ecore.sew.expression.LiteralRealValue
+import org.eclipse.efm.ecore.sew.expression.LiteralReferenceValue
+import org.eclipse.efm.ecore.sew.expression.LiteralStringValue
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider
+import org.eclipse.jface.viewers.StyledString
+import org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider
+import org.eclipse.efm.ecore.sew.expression.LiteralObjectReference
+
+/**
+ * Provides labels for EObjects.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+class SEWLabelProvider extends DefaultEObjectLabelProvider {
+
+	@Inject
+	new(AdapterFactoryLabelProvider delegate) {
+		super(delegate);
+	}
+
+	// Labels and icons can be computed like this:
+
+//	def text(Greeting ele) {
+//		'A greeting to ' + ele.name
+//	}
+//
+//	def image(Greeting ele) {
+//		'Greeting.gif'
+//	}
+
+
+	def text(SEWorkflow workflow) {
+		val str = new StyledString("SymbEx-Workflow")
+
+		if( (workflow.type != null)
+			&& (! workflow.type.toLowerCase().contains("workflow"))
+			&& (workflow.type != "SEW") ) {
+			str.append( new StyledString( " <" + workflow.type + ">",
+				StyledString::DECORATIONS_STYLER ) )
+		}
+
+		if( workflow.name != null  ) {
+			str.append( new StyledString( " " + workflow.name,
+				StyledString::DECORATIONS_STYLER ) )
+		}
+		else if( workflow.description != null  ) {
+			str.append( new StyledString( " " + workflow.description,
+				StyledString::DECORATIONS_STYLER ) )
+		}
+
+		str
+	}
+
+	def image(SEWorkflow workflow) {
+		"Folder.gif"
+	}
+
+	def text(WObject object) {
+		val str = new StyledString()
+
+		if( object.type != null  ) {
+			str.append( new StyledString( " <" + object.type + ">" ) )
+		}
+
+		if( object.name != null  ) {
+			str.append( new StyledString( " " + object.name,
+				StyledString::DECORATIONS_STYLER ) )
+		}
+		else if( object.description != null  ) {
+			str.append( new StyledString( " " + object.description,
+				StyledString::DECORATIONS_STYLER ) )
+		}
+		else if( str.length == 0 ) {
+			str.append( "WObject##untyped#unamed" );
+		}
+		
+		str
+	}
+
+	def image(WObject object) {
+		"Class.gif"
+	}
+
+
+	def text(WSection section) {
+		if( section.name != null ) {
+			if( section.name.startsWith("@") ) {
+				section.name.substring(1)
+			}
+			else {
+				section.name
+			}
+		}
+		else {
+			"WSection#unamed"
+		}
+	}
+
+	def image(WSection section) {
+		"stack.gif"
+	}
+
+
+	def text(WAttribute attribute) {
+		val str = new StyledString()
+		
+		if( attribute.name != null ) {
+			if( attribute.name.startsWith("@") ) {
+				str.append( attribute.name.substring(1) )
+			}
+			else {
+				str.append( attribute.name )
+			}
+		}
+		else {
+			str.append( "WAttribute#unamed" )
+		}
+		
+		val valueSpec = attribute.value
+		switch( valueSpec ) {
+			LiteralIntegerValue: {
+				str.append( new StyledString( " : " + valueSpec.value,
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			LiteralRationalValue: {
+				str.append( new StyledString( " : " +
+					valueSpec.numerator + "/" + valueSpec.denominator,
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			
+			LiteralFloatValue: {
+				str.append( new StyledString( " : " + valueSpec.value,
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			LiteralRealValue: {
+				str.append( new StyledString( " : " + valueSpec.value,
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			
+			LiteralCharacterValue: {
+				str.append( new StyledString( " : '" + valueSpec.value + "'",
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			LiteralStringValue: {
+				val printValue = valueSpec.value.replaceAll("\\R", "\\\\n")
+				str.append( new StyledString( " : \"" + printValue + "\"",
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			
+			LiteralObjectReference: {
+				val objID =
+					if( valueSpec.object.name != null ) { 
+						valueSpec.object.name
+					}
+					else if( valueSpec.object.type != null ) {
+						valueSpec.object.type
+					}
+					else {
+						"<null>"
+					}
+					
+				str.append( new StyledString( " : &" + objID,
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			
+			LiteralReferenceValue: {
+				str.append( new StyledString( " : " + valueSpec.symbol,
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			LiteralNullValue: {
+				str.append( new StyledString( " : null<" + valueSpec.type + ">",
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			
+
+			LiteralArrayValue: {
+				str.append( new StyledString( " [ " +
+					(if( valueSpec.values.size > 0 ) "... ]" else "]"),
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			
+			Expression: {
+				if( ((valueSpec.operator == "-") || (valueSpec.operator == "+"))
+					&& (valueSpec.operand.size == 1) ){
+						
+					val operand = valueSpec.operand.get(0)
+					switch( operand ) {
+						LiteralIntegerValue: {
+							str.append( new StyledString( " : " +
+								valueSpec.operator + operand.value,
+								StyledString::DECORATIONS_STYLER ) )
+						}
+						LiteralRationalValue: {
+							str.append( new StyledString( " : " +
+								valueSpec.operator +
+								operand.numerator + "/" + operand.denominator,
+								StyledString::DECORATIONS_STYLER ) )
+						}
+						
+						LiteralFloatValue: {
+							str.append( new StyledString( " : " +
+								valueSpec.operator + operand.value,
+								StyledString::DECORATIONS_STYLER ) )
+						}
+						LiteralRealValue: {
+							str.append( new StyledString( " : " +
+								valueSpec.operator + operand.value,
+								StyledString::DECORATIONS_STYLER ) )
+						}
+												
+						default: {
+							//!! NOTHING
+						}
+					}
+				}
+				else {
+					str.append( new StyledString( " : { " +
+						valueSpec.operator +
+						(if( valueSpec.operand.size > 0 ) " ..." else " }"),
+						StyledString::DECORATIONS_STYLER ) )
+					
+				}
+			}
+			
+			default: {
+				//!! NOTHING
+			}
+		}
+		
+		str
+	}
+
+	def image(WAttribute attribute) {
+		switch( attribute.value ) {
+			LiteralBooleanValue: {
+//				"LiteralBoolean.gif"
+				if( ( attribute.value as LiteralBooleanValue ).value ) {
+					"True.gif"
+				}
+				else {
+					"False.gif"
+				}
+			}
+			
+			LiteralIntegerValue: {
+				"LiteralInteger.gif"
+			}
+			LiteralRationalValue: {
+				"LiteralInteger.gif"
+			}
+			
+			LiteralFloatValue: {
+				"LiteralReal.gif"
+			}
+			LiteralRealValue: {
+				"LiteralReal.gif"
+			}
+			
+			LiteralCharacterValue: {
+				"LiteralString.gif"
+			}
+			LiteralStringValue: {
+				"LiteralString.gif"
+			}
+			
+			LiteralArrayValue: {
+				"Constraint.gif"
+			}
+			
+			LiteralReferenceValue: {
+				"EnumerationLiteral.gif"
+			}
+
+			LiteralNullValue: {
+				"Class.gif"
+			}
+
+			default: {
+				"Expression.gif"
+			}
+		}
+	}
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/outline/SEWOutlineTreeProvider.xtend b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/outline/SEWOutlineTreeProvider.xtend
new file mode 100644
index 0000000..1e4dd3a
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/outline/SEWOutlineTreeProvider.xtend
@@ -0,0 +1,48 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui.outline
+
+import org.eclipse.efm.ecore.sew.WAttribute
+import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider
+
+/**
+ * Customization of the default outline structure.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#outline
+ */
+class SEWOutlineTreeProvider extends DefaultOutlineTreeProvider {
+
+	def _isLeaf(WAttribute attribute) {
+		true
+		
+//		val valueSpec = attribute.value
+//		switch( valueSpec ) {
+//			LiteralArrayValue: {
+//				false
+//			}
+//			
+//			Expression: {
+//				(valueSpec.operand.size == 0)
+//				|| (((valueSpec.operator == "-") || (valueSpec.operator == "+"))
+//					&& (valueSpec.operand.size == 1)
+//					&& (valueSpec.operand.get(0) instanceof LiteralExpressionValue)
+//					)
+//			}
+//			
+//			default: {
+//				true
+//			}
+//		}
+	}
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/quickfix/SEWQuickfixProvider.xtend b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/quickfix/SEWQuickfixProvider.xtend
new file mode 100644
index 0000000..bc81edf
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/src/org/eclipse/efm/sew/xtext/ui/quickfix/SEWQuickfixProvider.xtend
@@ -0,0 +1,33 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.ui.quickfix
+
+import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider
+
+/**
+ * Custom quickfixes.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#quick-fixes
+ */
+class SEWQuickfixProvider extends DefaultQuickfixProvider {
+
+//	@Fix(SEWValidator.INVALID_NAME)
+//	def capitalizeName(Issue issue, IssueResolutionAcceptor acceptor) {
+//		acceptor.accept(issue, 'Capitalize name', 'Capitalize the name.', 'upcase.png') [
+//			context |
+//			val xtextDocument = context.xtextDocument
+//			val firstLetter = xtextDocument.get(issue.offset, 1)
+//			xtextDocument.replace(issue.offset, 1, firstLetter.toUpperCase)
+//		]
+//	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWDescriptionLabelProvider.xtendbin b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWDescriptionLabelProvider.xtendbin
new file mode 100644
index 0000000..1c3c08e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWDescriptionLabelProvider.xtendbin
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWLabelProvider.xtendbin b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWLabelProvider.xtendbin
new file mode 100644
index 0000000..1bfe4bc
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWLabelProvider.xtendbin
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWOutlineTreeProvider.xtendbin b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWOutlineTreeProvider.xtendbin
new file mode 100644
index 0000000..c4d2384
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWOutlineTreeProvider.xtendbin
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWProposalProvider.xtendbin b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWProposalProvider.xtendbin
new file mode 100644
index 0000000..6944593
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWProposalProvider.xtendbin
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWQuickfixProvider.xtendbin b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWQuickfixProvider.xtendbin
new file mode 100644
index 0000000..e96db08
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWQuickfixProvider.xtendbin
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWUiModule.xtendbin b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWUiModule.xtendbin
new file mode 100644
index 0000000..9b99108
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/.SEWUiModule.xtendbin
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/.gitignore
new file mode 100644
index 0000000..cf78c50
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/SEWUiModule.java
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/contentassist/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/contentassist/.gitignore
new file mode 100644
index 0000000..3aebe97
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/contentassist/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/SEWProposalProvider.java
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/labeling/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/labeling/.gitignore
new file mode 100644
index 0000000..811414a
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/labeling/.gitignore
@@ -0,0 +1,4 @@
+*._trace
+*.xtendbin
+/SEWDescriptionLabelProvider.java
+/SEWLabelProvider.java
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/outline/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/outline/.gitignore
new file mode 100644
index 0000000..c98c164
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/outline/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/SEWOutlineTreeProvider.java
diff --git a/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/quickfix/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/quickfix/.gitignore
new file mode 100644
index 0000000..d85d8d6
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext.ui/xtend-gen/org/eclipse/efm/sew/xtext/ui/quickfix/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/SEWQuickfixProvider.java
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/.antlr-generator-3.2.0-patch.jar b/editor/sew/org.eclipse.efm.sew.xtext/.antlr-generator-3.2.0-patch.jar
new file mode 100644
index 0000000..90516fd
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/.antlr-generator-3.2.0-patch.jar
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/.classpath b/editor/sew/org.eclipse.efm.sew.xtext/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/.project b/editor/sew/org.eclipse.efm.sew.xtext/.project
new file mode 100644
index 0000000..344e762
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.sew.xtext</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/.settings/org.eclipse.core.resources.prefs b/editor/sew/org.eclipse.efm.sew.xtext/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/.settings/org.eclipse.jdt.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/.settings/org.eclipse.m2e.core.prefs b/editor/sew/org.eclipse.efm.sew.xtext/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/META-INF/MANIFEST.MF b/editor/sew/org.eclipse.efm.sew.xtext/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d5eef09
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.sew.xtext; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.sew.ecore,
+ org.eclipse.xtext,
+ org.eclipse.xtext.xbase,
+ org.eclipse.equinox.common;bundle-version="3.5.0",
+ org.eclipse.xtext.xbase.lib,
+ org.antlr.runtime,
+ org.eclipse.xtext.util,
+ org.eclipse.xtend.lib
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.sew.xtext.services,
+ org.eclipse.efm.sew.xtext.parser.antlr.internal,
+ org.eclipse.efm.sew.xtext,
+ org.eclipse.efm.sew.xtext.parser.antlr,
+ org.eclipse.efm.sew.xtext.validation,
+ org.eclipse.efm.sew.xtext.scoping,
+ org.eclipse.efm.sew.xtext.generator,
+ org.eclipse.efm.sew.xtext.serializer
+Import-Package: org.apache.log4j
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/README.md b/editor/sew/org.eclipse.efm.sew.xtext/README.md
new file mode 100644
index 0000000..845133d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/README.md
@@ -0,0 +1,3 @@
+# EFM, Symbolic Execution Workflow Xtext based Editor
+
+Model Ecore for Xtext Editor
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/about.html b/editor/sew/org.eclipse.efm.sew.xtext/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/build.properties b/editor/sew/org.eclipse.efm.sew.xtext/build.properties
new file mode 100644
index 0000000..748fc4d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/build.properties
@@ -0,0 +1,29 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/,\
+               build.properties
+additional.bundles = org.eclipse.xtext.xbase,\
+                     org.eclipse.xtext.common.types,\
+                     org.eclipse.xtext.xtext.generator,\
+                     org.eclipse.emf.codegen.ecore,\
+                     org.eclipse.emf.mwe.utils,\
+                     org.eclipse.emf.mwe2.launch,\
+                     org.eclipse.emf.mwe2.lib,\
+                     org.objectweb.asm,\
+                     org.apache.commons.logging,\
+                     org.apache.log4j,\
+                     com.ibm.icu
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/pom.xml b/editor/sew/org.eclipse.efm.sew.xtext/pom.xml
new file mode 100644
index 0000000..f48073d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.sew</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.sew.xtext</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.sew.xtext</name>
+	<description>This plug-in contains the Symbex Workflow's Xtext based editor core elements (grammar, workflow...).</description>
+	
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/AbstractSEWRuntimeModule.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/AbstractSEWRuntimeModule.java
new file mode 100644
index 0000000..5f90ca9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/AbstractSEWRuntimeModule.java
@@ -0,0 +1,210 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext;
+
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import java.util.Properties;
+import org.eclipse.efm.sew.xtext.generator.SEWGenerator;
+import org.eclipse.efm.sew.xtext.parser.antlr.SEWAntlrTokenFileProvider;
+import org.eclipse.efm.sew.xtext.parser.antlr.SEWParser;
+import org.eclipse.efm.sew.xtext.parser.antlr.internal.InternalSEWLexer;
+import org.eclipse.efm.sew.xtext.scoping.SEWScopeProvider;
+import org.eclipse.efm.sew.xtext.serializer.SEWSemanticSequencer;
+import org.eclipse.efm.sew.xtext.serializer.SEWSyntacticSequencer;
+import org.eclipse.efm.sew.xtext.services.SEWGrammarAccess;
+import org.eclipse.efm.sew.xtext.validation.SEWValidator;
+import org.eclipse.xtext.Constants;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.common.services.Ecore2XtextTerminalConverters;
+import org.eclipse.xtext.conversion.IValueConverterService;
+import org.eclipse.xtext.generator.IGenerator2;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.naming.SimpleNameProvider;
+import org.eclipse.xtext.parser.IParser;
+import org.eclipse.xtext.parser.ITokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.AntlrTokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.Lexer;
+import org.eclipse.xtext.parser.antlr.LexerBindings;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.resource.IContainer;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.containers.ResourceSetBasedAllContainersStateProvider;
+import org.eclipse.xtext.resource.containers.StateBasedContainerManager;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions;
+import org.eclipse.xtext.scoping.IGlobalScopeProvider;
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.eclipse.xtext.scoping.IgnoreCaseLinking;
+import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
+import org.eclipse.xtext.scoping.impl.DefaultGlobalScopeProvider;
+import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider;
+import org.eclipse.xtext.serializer.ISerializer;
+import org.eclipse.xtext.serializer.impl.Serializer;
+import org.eclipse.xtext.serializer.sequencer.ISemanticSequencer;
+import org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer;
+import org.eclipse.xtext.service.DefaultRuntimeModule;
+import org.eclipse.xtext.service.SingletonBinding;
+
+/**
+ * Manual modifications go to {@link SEWRuntimeModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractSEWRuntimeModule extends DefaultRuntimeModule {
+
+	protected Properties properties = null;
+
+	@Override
+	public void configure(Binder binder) {
+		properties = tryBindProperties(binder, "org/eclipse/efm/sew/xtext/SEW.properties");
+		super.configure(binder);
+	}
+	
+	public void configureLanguageName(Binder binder) {
+		binder.bind(String.class).annotatedWith(Names.named(Constants.LANGUAGE_NAME)).toInstance("org.eclipse.efm.sew.xtext.SEW");
+	}
+	
+	public void configureFileExtensions(Binder binder) {
+		if (properties == null || properties.getProperty(Constants.FILE_EXTENSIONS) == null)
+			binder.bind(String.class).annotatedWith(Names.named(Constants.FILE_EXTENSIONS)).toInstance("sew,favm");
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public ClassLoader bindClassLoaderToInstance() {
+		return getClass().getClassLoader();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public Class<? extends IGrammarAccess> bindIGrammarAccess() {
+		return SEWGrammarAccess.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISemanticSequencer> bindISemanticSequencer() {
+		return SEWSemanticSequencer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISyntacticSequencer> bindISyntacticSequencer() {
+		return SEWSyntacticSequencer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISerializer> bindISerializer() {
+		return Serializer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IParser> bindIParser() {
+		return SEWParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenToStringConverter> bindITokenToStringConverter() {
+		return AntlrTokenToStringConverter.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
+		return SEWAntlrTokenFileProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends Lexer> bindLexer() {
+		return InternalSEWLexer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenDefProvider> bindITokenDefProvider() {
+		return AntlrTokenDefProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Provider<InternalSEWLexer> provideInternalSEWLexer() {
+		return LexerProvider.create(InternalSEWLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureRuntimeLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerBindings.RUNTIME))
+			.to(InternalSEWLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.validation.ValidatorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends SEWValidator> bindSEWValidator() {
+		return SEWValidator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IScopeProvider> bindIScopeProvider() {
+		return SEWScopeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIScopeProviderDelegate(Binder binder) {
+		binder.bind(IScopeProvider.class).annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(ImportedNamespaceAwareLocalScopeProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return DefaultGlobalScopeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIgnoreCaseLinking(Binder binder) {
+		binder.bindConstant().annotatedWith(IgnoreCaseLinking.class).to(false);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContainer.Manager> bindIContainer$Manager() {
+		return StateBasedContainerManager.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IAllContainersState.Provider> bindIAllContainersState$Provider() {
+		return ResourceSetBasedAllContainersStateProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptions(Binder binder) {
+		binder.bind(IResourceDescriptions.class).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsPersisted(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public Class<? extends IGenerator2> bindIGenerator2() {
+		return SEWGenerator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ecore2xtext.Ecore2XtextValueConverterServiceFragment2
+	public Class<? extends IValueConverterService> bindIValueConverterService() {
+		return Ecore2XtextTerminalConverters.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.SimpleNamesFragment2
+	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+		return SimpleNameProvider.class;
+	}
+	
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/SEW.xtextbin b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/SEW.xtextbin
new file mode 100644
index 0000000..1f2fd94
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/SEW.xtextbin
Binary files differ
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/SEWStandaloneSetupGenerated.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/SEWStandaloneSetupGenerated.java
new file mode 100644
index 0000000..e15e25a
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/SEWStandaloneSetupGenerated.java
@@ -0,0 +1,48 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.ISetup;
+import org.eclipse.xtext.common.TerminalsStandaloneSetup;
+import org.eclipse.xtext.resource.IResourceFactory;
+import org.eclipse.xtext.resource.IResourceServiceProvider;
+
+@SuppressWarnings("all")
+public class SEWStandaloneSetupGenerated implements ISetup {
+
+	@Override
+	public Injector createInjectorAndDoEMFRegistration() {
+		TerminalsStandaloneSetup.doSetup();
+
+		Injector injector = createInjector();
+		register(injector);
+		return injector;
+	}
+	
+	public Injector createInjector() {
+		return Guice.createInjector(new SEWRuntimeModule());
+	}
+	
+	public void register(Injector injector) {
+		IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class);
+		IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class);
+		
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("sew", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("sew", serviceProvider);
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("favm", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("favm", serviceProvider);
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/SEWAntlrTokenFileProvider.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/SEWAntlrTokenFileProvider.java
new file mode 100644
index 0000000..8cb06b9
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/SEWAntlrTokenFileProvider.java
@@ -0,0 +1,25 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.parser.antlr;
+
+import java.io.InputStream;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+
+public class SEWAntlrTokenFileProvider implements IAntlrTokenFileProvider {
+
+	@Override
+	public InputStream getAntlrTokenFile() {
+		ClassLoader classLoader = getClass().getClassLoader();
+		return classLoader.getResourceAsStream("org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEW.tokens");
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/SEWParser.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/SEWParser.java
new file mode 100644
index 0000000..f4b63b0
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/SEWParser.java
@@ -0,0 +1,49 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.parser.antlr;
+
+import com.google.inject.Inject;
+import org.eclipse.efm.sew.xtext.parser.antlr.internal.InternalSEWParser;
+import org.eclipse.efm.sew.xtext.services.SEWGrammarAccess;
+import org.eclipse.xtext.parser.antlr.AbstractAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+
+public class SEWParser extends AbstractAntlrParser {
+
+	@Inject
+	private SEWGrammarAccess grammarAccess;
+
+	@Override
+	protected void setInitialHiddenTokens(XtextTokenStream tokenStream) {
+		tokenStream.setInitialHiddenTokens("RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT");
+	}
+	
+
+	@Override
+	protected InternalSEWParser createParser(XtextTokenStream stream) {
+		return new InternalSEWParser(stream, getGrammarAccess());
+	}
+
+	@Override 
+	protected String getDefaultRuleName() {
+		return "Workflow";
+	}
+
+	public SEWGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(SEWGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEW.g b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEW.g
new file mode 100644
index 0000000..d10db99
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEW.g
@@ -0,0 +1,4379 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+grammar InternalSEW;
+
+options {
+	superClass=AbstractInternalAntlrParser;
+	backtrack=true;
+}
+
+@lexer::header {
+package org.eclipse.efm.sew.xtext.parser.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.parser.antlr.Lexer;
+}
+
+@parser::header {
+package org.eclipse.efm.sew.xtext.parser.antlr.internal;
+
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+import org.eclipse.efm.sew.xtext.services.SEWGrammarAccess;
+
+}
+
+@parser::members {
+
+/*
+  This grammar contains a lot of empty actions to work around a bug in ANTLR.
+  Otherwise the ANTLR tool will create synpreds that cannot be compiled in some rare cases.
+*/
+
+ 	private SEWGrammarAccess grammarAccess;
+
+    public InternalSEWParser(TokenStream input, SEWGrammarAccess grammarAccess) {
+        this(input);
+        this.grammarAccess = grammarAccess;
+        registerRules(grammarAccess.getGrammar());
+    }
+
+    @Override
+    protected String getFirstRuleName() {
+    	return "Workflow";
+   	}
+
+   	@Override
+   	protected SEWGrammarAccess getGrammarAccess() {
+   		return grammarAccess;
+   	}
+
+}
+
+@rulecatch {
+    catch (RecognitionException re) {
+        recover(input,re);
+        appendSkippedTokens();
+    }
+}
+
+// Entry rule entryRuleWorkflow
+entryRuleWorkflow returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getWorkflowRule()); }
+	iv_ruleWorkflow=ruleWorkflow
+	{ $current=$iv_ruleWorkflow.current; }
+	EOF;
+
+// Rule Workflow
+ruleWorkflow returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getWorkflowAccess().getSEWorkflowAction_0(),
+					$current);
+			}
+		)
+		(
+			{
+				/* */
+			}
+			{
+				newCompositeNode(grammarAccess.getWorkflowAccess().getPrologParserRuleCall_1());
+			}
+			ruleProlog
+			{
+				afterParserOrEnumRuleCall();
+			}
+		)?
+		(
+			(
+				(
+					(
+						(
+							lv_type_2_1='workflow'
+							{
+								newLeafNode(lv_type_2_1, grammarAccess.getWorkflowAccess().getTypeWorkflowKeyword_2_0_0_0_0());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getWorkflowRule());
+								}
+								setWithLastConsumed($current, "type", lv_type_2_1, null);
+							}
+							    |
+							lv_type_2_2='symbex-workflow'
+							{
+								newLeafNode(lv_type_2_2, grammarAccess.getWorkflowAccess().getTypeSymbexWorkflowKeyword_2_0_0_0_1());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getWorkflowRule());
+								}
+								setWithLastConsumed($current, "type", lv_type_2_2, null);
+							}
+						)
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getWorkflowAccess().getNameUFIParserRuleCall_2_0_1_0());
+						}
+						lv_name_3_0=ruleUFI
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getWorkflowRule());
+							}
+							set(
+								$current,
+								"name",
+								lv_name_3_0,
+								"org.eclipse.efm.sew.xtext.SEW.UFI");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)?
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getWorkflowAccess().getDescriptionEStringParserRuleCall_2_0_2_0());
+						}
+						lv_description_4_0=ruleEString
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getWorkflowRule());
+							}
+							set(
+								$current,
+								"description",
+								lv_description_4_0,
+								"org.eclipse.efm.sew.xtext.SEW.EString");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)?
+				otherlv_5='{'
+				{
+					newLeafNode(otherlv_5, grammarAccess.getWorkflowAccess().getLeftCurlyBracketKeyword_2_0_3());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getWorkflowAccess().getElementObjectParserRuleCall_2_0_4_0_0());
+							}
+							lv_element_6_1=ruleObject
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getWorkflowRule());
+								}
+								add(
+									$current,
+									"element",
+									lv_element_6_1,
+									"org.eclipse.efm.sew.xtext.SEW.Object");
+								afterParserOrEnumRuleCall();
+							}
+							    |
+							{
+								newCompositeNode(grammarAccess.getWorkflowAccess().getElementPropertyParserRuleCall_2_0_4_0_1());
+							}
+							lv_element_6_2=ruleProperty
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getWorkflowRule());
+								}
+								add(
+									$current,
+									"element",
+									lv_element_6_2,
+									"org.eclipse.efm.sew.xtext.SEW.Property");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+				otherlv_7='}'
+				{
+					newLeafNode(otherlv_7, grammarAccess.getWorkflowAccess().getRightCurlyBracketKeyword_2_0_5());
+				}
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getWorkflowAccess().getElementDeprecatedObjectParserRuleCall_2_1_0());
+					}
+					lv_element_8_0=ruleDeprecatedObject
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getWorkflowRule());
+						}
+						add(
+							$current,
+							"element",
+							lv_element_8_0,
+							"org.eclipse.efm.sew.xtext.SEW.DeprecatedObject");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleProlog
+entryRuleProlog returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getPrologRule()); }
+	iv_ruleProlog=ruleProlog
+	{ $current=$iv_ruleProlog.current.getText(); }
+	EOF;
+
+// Rule Prolog
+ruleProlog returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			kw='@sew'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getPrologAccess().getSewKeyword_0_0());
+			}
+			    |
+			kw='@favm'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getPrologAccess().getFavmKeyword_0_1());
+			}
+		)
+		kw='<'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getPrologAccess().getLessThanSignKeyword_1());
+		}
+		(
+			kw='workflow'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getPrologAccess().getWorkflowKeyword_2_0());
+			}
+			    |
+			kw='sew'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getPrologAccess().getSewKeyword_2_1());
+			}
+		)
+		(
+			kw=','
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getPrologAccess().getCommaKeyword_3_0());
+			}
+			{
+				newCompositeNode(grammarAccess.getPrologAccess().getEDoubleParserRuleCall_3_1());
+			}
+			this_EDouble_6=ruleEDouble
+			{
+				$current.merge(this_EDouble_6);
+			}
+			{
+				afterParserOrEnumRuleCall();
+			}
+		)?
+		(
+			(
+				kw=','
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getPrologAccess().getCommaKeyword_4_0_0());
+				}
+				{
+					newCompositeNode(grammarAccess.getPrologAccess().getUFIParserRuleCall_4_0_1());
+				}
+				this_UFI_8=ruleUFI
+				{
+					$current.merge(this_UFI_8);
+				}
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+			    |
+			{
+				newCompositeNode(grammarAccess.getPrologAccess().getEStringParserRuleCall_4_1());
+			}
+			this_EString_9=ruleEString
+			{
+				$current.merge(this_EString_9);
+			}
+			{
+				afterParserOrEnumRuleCall();
+			}
+		)?
+		kw='>:'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getPrologAccess().getGreaterThanSignColonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleReservedWord
+entryRuleReservedWord returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getReservedWordRule()); }
+	iv_ruleReservedWord=ruleReservedWord
+	{ $current=$iv_ruleReservedWord.current.getText(); }
+	EOF;
+
+// Rule ReservedWord
+ruleReservedWord returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='workflow'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getReservedWordAccess().getWorkflowKeyword_0());
+		}
+		    |
+		kw='sew'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getReservedWordAccess().getSewKeyword_1());
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getReservedWordAccess().getDeprecatedReservedWordParserRuleCall_2());
+		}
+		this_DeprecatedReservedWord_2=ruleDeprecatedReservedWord
+		{
+			$current.merge(this_DeprecatedReservedWord_2);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleXID
+entryRuleXID returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getXIDRule()); }
+	iv_ruleXID=ruleXID
+	{ $current=$iv_ruleXID.current.getText(); }
+	EOF;
+
+// Rule XID
+ruleXID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getXIDAccess().getReservedWordParserRuleCall_0());
+		}
+		this_ReservedWord_0=ruleReservedWord
+		{
+			$current.merge(this_ReservedWord_0);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		this_XIDENDIFIER_1=RULE_XIDENDIFIER
+		{
+			$current.merge(this_XIDENDIFIER_1);
+		}
+		{
+			newLeafNode(this_XIDENDIFIER_1, grammarAccess.getXIDAccess().getXIDENDIFIERTerminalRuleCall_1());
+		}
+	)
+;
+
+// Entry rule entryRuleUFI
+entryRuleUFI returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getUFIRule()); }
+	iv_ruleUFI=ruleUFI
+	{ $current=$iv_ruleUFI.current.getText(); }
+	EOF;
+
+// Rule UFI
+ruleUFI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getUFIAccess().getXIDParserRuleCall_0());
+		}
+		this_XID_0=ruleXID
+		{
+			$current.merge(this_XID_0);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				kw='::'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getUFIAccess().getColonColonKeyword_1_0_0());
+				}
+				    |
+				kw='.'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getUFIAccess().getFullStopKeyword_1_0_1());
+				}
+			)
+			{
+				newCompositeNode(grammarAccess.getUFIAccess().getXIDParserRuleCall_1_1());
+			}
+			this_XID_3=ruleXID
+			{
+				$current.merge(this_XID_3);
+			}
+			{
+				afterParserOrEnumRuleCall();
+			}
+		)*
+	)
+;
+
+// Entry rule entryRuleObject
+entryRuleObject returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getObjectRule()); }
+	iv_ruleObject=ruleObject
+	{ $current=$iv_ruleObject.current; }
+	EOF;
+
+// Rule Object
+ruleObject returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getObjectAccess().getWObjectAction_0_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_0_1_0());
+					}
+					lv_type_1_0=ruleUFI
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getObjectRule());
+						}
+						set(
+							$current,
+							"type",
+							lv_type_1_0,
+							"org.eclipse.efm.sew.xtext.SEW.UFI");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_0_2_0());
+					}
+					lv_name_2_0=ruleUFI
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getObjectRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_2_0,
+							"org.eclipse.efm.sew.xtext.SEW.UFI");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_0_3_0());
+					}
+					lv_description_3_0=ruleEString
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getObjectRule());
+						}
+						set(
+							$current,
+							"description",
+							lv_description_3_0,
+							"org.eclipse.efm.sew.xtext.SEW.EString");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_4='{'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_0_4());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_0_5_0_0());
+						}
+						lv_element_5_1=ruleObject
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getObjectRule());
+							}
+							add(
+								$current,
+								"element",
+								lv_element_5_1,
+								"org.eclipse.efm.sew.xtext.SEW.Object");
+							afterParserOrEnumRuleCall();
+						}
+						    |
+						{
+							newCompositeNode(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_0_5_0_1());
+						}
+						lv_element_5_2=ruleProperty
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getObjectRule());
+							}
+							add(
+								$current,
+								"element",
+								lv_element_5_2,
+								"org.eclipse.efm.sew.xtext.SEW.Property");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_6='}'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_0_6());
+			}
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getObjectAccess().getWObjectAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_1_1_0());
+					}
+					lv_name_8_0=ruleUFI
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getObjectRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_8_0,
+							"org.eclipse.efm.sew.xtext.SEW.UFI");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_9=':='
+				{
+					newLeafNode(otherlv_9, grammarAccess.getObjectAccess().getColonEqualsSignKeyword_1_2_0());
+				}
+				    |
+				otherlv_10='+:='
+				{
+					newLeafNode(otherlv_10, grammarAccess.getObjectAccess().getPlusSignColonEqualsSignKeyword_1_2_1());
+				}
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_1_3_0_0());
+						}
+						lv_type_11_0=ruleUFI
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getObjectRule());
+							}
+							set(
+								$current,
+								"type",
+								lv_type_11_0,
+								"org.eclipse.efm.sew.xtext.SEW.UFI");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_1_3_1_0());
+						}
+						lv_description_12_0=ruleEString
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getObjectRule());
+							}
+							set(
+								$current,
+								"description",
+								lv_description_12_0,
+								"org.eclipse.efm.sew.xtext.SEW.EString");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)?
+			)?
+			otherlv_13='{'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_1_4());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_1_5_0_0());
+						}
+						lv_element_14_1=ruleObject
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getObjectRule());
+							}
+							add(
+								$current,
+								"element",
+								lv_element_14_1,
+								"org.eclipse.efm.sew.xtext.SEW.Object");
+							afterParserOrEnumRuleCall();
+						}
+						    |
+						{
+							newCompositeNode(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_1_5_0_1());
+						}
+						lv_element_14_2=ruleProperty
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getObjectRule());
+							}
+							add(
+								$current,
+								"element",
+								lv_element_14_2,
+								"org.eclipse.efm.sew.xtext.SEW.Property");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_15='}'
+			{
+				newLeafNode(otherlv_15, grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_1_6());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleProperty
+entryRuleProperty returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPropertyRule()); }
+	iv_ruleProperty=ruleProperty
+	{ $current=$iv_ruleProperty.current; }
+	EOF;
+
+// Rule Property
+ruleProperty returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPropertyAccess().getSectionParserRuleCall_0());
+		}
+		this_Section_0=ruleSection
+		{
+			$current = $this_Section_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPropertyAccess().getAttributeParserRuleCall_1());
+		}
+		this_Attribute_1=ruleAttribute
+		{
+			$current = $this_Attribute_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleSection
+entryRuleSection returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSectionRule()); }
+	iv_ruleSection=ruleSection
+	{ $current=$iv_ruleSection.current; }
+	EOF;
+
+// Rule Section
+ruleSection returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSectionAccess().getNameXIDParserRuleCall_0_0());
+				}
+				lv_name_0_0=ruleXID
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSectionRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_0_0,
+						"org.eclipse.efm.sew.xtext.SEW.XID");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSectionAccess().getDescriptionEStringParserRuleCall_1_0());
+				}
+				lv_description_1_0=ruleEString
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSectionRule());
+					}
+					set(
+						$current,
+						"description",
+						lv_description_1_0,
+						"org.eclipse.efm.sew.xtext.SEW.EString");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				otherlv_2='['
+				{
+					newLeafNode(otherlv_2, grammarAccess.getSectionAccess().getLeftSquareBracketKeyword_2_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_0_1_0_0());
+							}
+							lv_element_3_1=ruleObject
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSectionRule());
+								}
+								add(
+									$current,
+									"element",
+									lv_element_3_1,
+									"org.eclipse.efm.sew.xtext.SEW.Object");
+								afterParserOrEnumRuleCall();
+							}
+							    |
+							{
+								newCompositeNode(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_0_1_0_1());
+							}
+							lv_element_3_2=ruleAttribute
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSectionRule());
+								}
+								add(
+									$current,
+									"element",
+									lv_element_3_2,
+									"org.eclipse.efm.sew.xtext.SEW.Attribute");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+				otherlv_4=']'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getSectionAccess().getRightSquareBracketKeyword_2_0_2());
+				}
+			)
+			    |
+			(
+				otherlv_5=':'
+				{
+					newLeafNode(otherlv_5, grammarAccess.getSectionAccess().getColonKeyword_2_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_1_1_0_0());
+							}
+							lv_element_6_1=ruleObject
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSectionRule());
+								}
+								add(
+									$current,
+									"element",
+									lv_element_6_1,
+									"org.eclipse.efm.sew.xtext.SEW.Object");
+								afterParserOrEnumRuleCall();
+							}
+							    |
+							{
+								newCompositeNode(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_1_1_0_1());
+							}
+							lv_element_6_2=ruleAttribute
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSectionRule());
+								}
+								add(
+									$current,
+									"element",
+									lv_element_6_2,
+									"org.eclipse.efm.sew.xtext.SEW.Attribute");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleAttribute
+entryRuleAttribute returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getAttributeRule()); }
+	iv_ruleAttribute=ruleAttribute
+	{ $current=$iv_ruleAttribute.current; }
+	EOF;
+
+// Rule Attribute
+ruleAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getAttributeAccess().getWAttributeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getAttributeAccess().getNameXIDParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleXID
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getAttributeRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.sew.xtext.SEW.XID");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='='
+		{
+			newLeafNode(otherlv_2, grammarAccess.getAttributeAccess().getEqualsSignKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getAttributeAccess().getValueValueSpecificationParserRuleCall_3_0());
+				}
+				lv_value_3_0=ruleValueSpecification
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getAttributeRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_3_0,
+						"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_4=';'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getAttributeAccess().getSemicolonKeyword_4());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleValueSpecification
+entryRuleValueSpecification returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getValueSpecificationRule()); }
+	iv_ruleValueSpecification=ruleValueSpecification
+	{ $current=$iv_ruleValueSpecification.current; }
+	EOF;
+
+// Rule ValueSpecification
+ruleValueSpecification returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	{
+		/* */
+	}
+	{
+		newCompositeNode(grammarAccess.getValueSpecificationAccess().getExpressionParserRuleCall());
+	}
+	this_Expression_0=ruleExpression
+	{
+		$current = $this_Expression_0.current;
+		afterParserOrEnumRuleCall();
+	}
+;
+
+// Entry rule entryRuleExpression
+entryRuleExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getExpressionRule()); }
+	iv_ruleExpression=ruleExpression
+	{ $current=$iv_ruleExpression.current; }
+	EOF;
+
+// Rule Expression
+ruleExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getExpressionAccess().getConditionalExpressionParserRuleCall_0());
+		}
+		this_conditionalExpression_0=ruleconditionalExpression
+		{
+			$current = $this_conditionalExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getExpressionAccess().getDeprecatedExpressionParserRuleCall_1());
+		}
+		this_DeprecatedExpression_1=ruleDeprecatedExpression
+		{
+			$current = $this_DeprecatedExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleconditionalExpression
+entryRuleconditionalExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getConditionalExpressionRule()); }
+	iv_ruleconditionalExpression=ruleconditionalExpression
+	{ $current=$iv_ruleconditionalExpression.current; }
+	EOF;
+
+// Rule conditionalExpression
+ruleconditionalExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getConditionalExpressionAccess().getConditionalOrExpressionParserRuleCall_0());
+		}
+		this_conditionalOrExpression_0=ruleconditionalOrExpression
+		{
+			$current = $this_conditionalOrExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getConditionalExpressionAccess().getExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					lv_operator_2_0='?'
+					{
+						newLeafNode(lv_operator_2_0, grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getConditionalExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_2_0, "?");
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getConditionalExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.sew.xtext.SEW.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_4=':'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getConditionalExpressionAccess().getColonKeyword_1_3());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_4_0());
+					}
+					lv_operand_5_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getConditionalExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_5_0,
+							"org.eclipse.efm.sew.xtext.SEW.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleconditionalOrExpression
+entryRuleconditionalOrExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getConditionalOrExpressionRule()); }
+	iv_ruleconditionalOrExpression=ruleconditionalOrExpression
+	{ $current=$iv_ruleconditionalOrExpression.current; }
+	EOF;
+
+// Rule conditionalOrExpression
+ruleconditionalOrExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getConditionalOrExpressionAccess().getConditionalAndExpressionParserRuleCall_0());
+		}
+		this_conditionalAndExpression_0=ruleconditionalAndExpression
+		{
+			$current = $this_conditionalAndExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getConditionalOrExpressionAccess().getExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					(
+						lv_operator_2_1='||'
+						{
+							newLeafNode(lv_operator_2_1, grammarAccess.getConditionalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getConditionalOrExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_1, null);
+						}
+						    |
+						lv_operator_2_2='or'
+						{
+							newLeafNode(lv_operator_2_2, grammarAccess.getConditionalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getConditionalOrExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_2, null);
+						}
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=ruleconditionalAndExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getConditionalOrExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.sew.xtext.SEW.conditionalAndExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					otherlv_4='||'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getConditionalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0());
+					}
+					    |
+					otherlv_5='or'
+					{
+						newLeafNode(otherlv_5, grammarAccess.getConditionalOrExpressionAccess().getOrKeyword_1_3_0_1());
+					}
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_3_1_0());
+						}
+						lv_operand_6_0=ruleconditionalAndExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getConditionalOrExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_6_0,
+								"org.eclipse.efm.sew.xtext.SEW.conditionalAndExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleconditionalAndExpression
+entryRuleconditionalAndExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getConditionalAndExpressionRule()); }
+	iv_ruleconditionalAndExpression=ruleconditionalAndExpression
+	{ $current=$iv_ruleconditionalAndExpression.current; }
+	EOF;
+
+// Rule conditionalAndExpression
+ruleconditionalAndExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getConditionalAndExpressionAccess().getEqualityExpressionParserRuleCall_0());
+		}
+		this_equalityExpression_0=ruleequalityExpression
+		{
+			$current = $this_equalityExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getConditionalAndExpressionAccess().getExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					(
+						lv_operator_2_1='&&'
+						{
+							newLeafNode(lv_operator_2_1, grammarAccess.getConditionalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getConditionalAndExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_1, null);
+						}
+						    |
+						lv_operator_2_2='and'
+						{
+							newLeafNode(lv_operator_2_2, grammarAccess.getConditionalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getConditionalAndExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_2, null);
+						}
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=ruleequalityExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getConditionalAndExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.sew.xtext.SEW.equalityExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					otherlv_4='&&'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getConditionalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0());
+					}
+					    |
+					otherlv_5='and'
+					{
+						newLeafNode(otherlv_5, grammarAccess.getConditionalAndExpressionAccess().getAndKeyword_1_3_0_1());
+					}
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0());
+						}
+						lv_operand_6_0=ruleequalityExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getConditionalAndExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_6_0,
+								"org.eclipse.efm.sew.xtext.SEW.equalityExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleequalityExpression
+entryRuleequalityExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEqualityExpressionRule()); }
+	iv_ruleequalityExpression=ruleequalityExpression
+	{ $current=$iv_ruleequalityExpression.current; }
+	EOF;
+
+// Rule equalityExpression
+ruleequalityExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0());
+		}
+		this_relationalExpression_0=rulerelationalExpression
+		{
+			$current = $this_relationalExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getEqualityExpressionAccess().getExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					(
+						lv_operator_2_1='=='
+						{
+							newLeafNode(lv_operator_2_1, grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignKeyword_1_1_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEqualityExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_1, null);
+						}
+						    |
+						lv_operator_2_2='!='
+						{
+							newLeafNode(lv_operator_2_2, grammarAccess.getEqualityExpressionAccess().getOperatorExclamationMarkEqualsSignKeyword_1_1_0_1());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEqualityExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_2, null);
+						}
+						    |
+						lv_operator_2_3='==='
+						{
+							newLeafNode(lv_operator_2_3, grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignEqualsSignKeyword_1_1_0_2());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEqualityExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_3, null);
+						}
+						    |
+						lv_operator_2_4='=!='
+						{
+							newLeafNode(lv_operator_2_4, grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignExclamationMarkEqualsSignKeyword_1_1_0_3());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEqualityExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_4, null);
+						}
+						    |
+						lv_operator_2_5='=/='
+						{
+							newLeafNode(lv_operator_2_5, grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignSolidusEqualsSignKeyword_1_1_0_4());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getEqualityExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_5, null);
+						}
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEqualityExpressionAccess().getOperandRelationalExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=rulerelationalExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.sew.xtext.SEW.relationalExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRulerelationalExpression
+entryRulerelationalExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getRelationalExpressionRule()); }
+	iv_rulerelationalExpression=rulerelationalExpression
+	{ $current=$iv_rulerelationalExpression.current; }
+	EOF;
+
+// Rule relationalExpression
+rulerelationalExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0());
+		}
+		this_additiveExpression_0=ruleadditiveExpression
+		{
+			$current = $this_additiveExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getRelationalExpressionAccess().getExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					(
+						lv_operator_2_1='<'
+						{
+							newLeafNode(lv_operator_2_1, grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignKeyword_1_1_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getRelationalExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_1, null);
+						}
+						    |
+						lv_operator_2_2='<='
+						{
+							newLeafNode(lv_operator_2_2, grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignEqualsSignKeyword_1_1_0_1());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getRelationalExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_2, null);
+						}
+						    |
+						lv_operator_2_3='>'
+						{
+							newLeafNode(lv_operator_2_3, grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignKeyword_1_1_0_2());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getRelationalExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_3, null);
+						}
+						    |
+						lv_operator_2_4='>='
+						{
+							newLeafNode(lv_operator_2_4, grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignEqualsSignKeyword_1_1_0_3());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getRelationalExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_4, null);
+						}
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getOperandAdditiveExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=ruleadditiveExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.sew.xtext.SEW.additiveExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleadditiveExpression
+entryRuleadditiveExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getAdditiveExpressionRule()); }
+	iv_ruleadditiveExpression=ruleadditiveExpression
+	{ $current=$iv_ruleadditiveExpression.current; }
+	EOF;
+
+// Rule additiveExpression
+ruleadditiveExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0());
+		}
+		this_multiplicativeExpression_0=rulemultiplicativeExpression
+		{
+			$current = $this_multiplicativeExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getAdditiveExpressionAccess().getExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					lv_operator_2_0='+'
+					{
+						newLeafNode(lv_operator_2_0, grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getAdditiveExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_2_0, "+");
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=rulemultiplicativeExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.sew.xtext.SEW.multiplicativeExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_4='+'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_3_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_3_1_0());
+						}
+						lv_operand_5_0=rulemultiplicativeExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_5_0,
+								"org.eclipse.efm.sew.xtext.SEW.multiplicativeExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRulemultiplicativeExpression
+entryRulemultiplicativeExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getMultiplicativeExpressionRule()); }
+	iv_rulemultiplicativeExpression=rulemultiplicativeExpression
+	{ $current=$iv_rulemultiplicativeExpression.current; }
+	EOF;
+
+// Rule multiplicativeExpression
+rulemultiplicativeExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getPrimaryExpressionParserRuleCall_0());
+		}
+		this_primaryExpression_0=ruleprimaryExpression
+		{
+			$current = $this_primaryExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_0_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_2_0='*'
+						{
+							newLeafNode(lv_operator_2_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_0, "*");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_2_0());
+						}
+						lv_operand_3_0=ruleprimaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_3_0,
+								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_4='*'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_3_1_0());
+							}
+							lv_operand_5_0=ruleprimaryExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_5_0,
+									"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_1_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_7_0='**'
+						{
+							newLeafNode(lv_operator_7_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_7_0, "**");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_2_0());
+						}
+						lv_operand_8_0=ruleprimaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_8_0,
+								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_9='**'
+					{
+						newLeafNode(otherlv_9, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_3_1_0());
+							}
+							lv_operand_10_0=ruleprimaryExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_10_0,
+									"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_2_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_12_0='/'
+						{
+							newLeafNode(lv_operator_12_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_12_0, "/");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_2_0());
+						}
+						lv_operand_13_0=ruleprimaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_13_0,
+								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_14='/'
+					{
+						newLeafNode(otherlv_14, grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_3_1_0());
+							}
+							lv_operand_15_0=ruleprimaryExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_15_0,
+									"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_3_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_17_0='%'
+						{
+							newLeafNode(lv_operator_17_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_17_0, "\%");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_2_0());
+						}
+						lv_operand_18_0=ruleprimaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_18_0,
+								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_19='%'
+					{
+						newLeafNode(otherlv_19, grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_3_1_0());
+							}
+							lv_operand_20_0=ruleprimaryExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_20_0,
+									"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleprimaryExpression
+entryRuleprimaryExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimaryExpressionRule()); }
+	iv_ruleprimaryExpression=ruleprimaryExpression
+	{ $current=$iv_ruleprimaryExpression.current; }
+	EOF;
+
+// Rule primaryExpression
+ruleprimaryExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			otherlv_0='+'
+			{
+				newLeafNode(otherlv_0, grammarAccess.getPrimaryExpressionAccess().getPlusSignKeyword_0_0());
+			}
+			{
+				/* */
+			}
+			{
+				newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getPrimaryExpressionParserRuleCall_0_1());
+			}
+			this_primaryExpression_1=ruleprimaryExpression
+			{
+				$current = $this_primaryExpression_1.current;
+				afterParserOrEnumRuleCall();
+			}
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getPrimaryExpressionAccess().getExpressionAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					(
+						lv_operator_3_0='-'
+						{
+							newLeafNode(lv_operator_3_0, grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_3_0, "-");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_1_0());
+						}
+						lv_operand_4_0=ruleprimaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_4_0,
+								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getPrimaryExpressionAccess().getExpressionAction_2_0(),
+						$current);
+				}
+			)
+			(
+				(
+					(
+						(
+							lv_operator_6_1='!'
+							{
+								newLeafNode(lv_operator_6_1, grammarAccess.getPrimaryExpressionAccess().getOperatorExclamationMarkKeyword_2_1_0_0_0());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+								}
+								setWithLastConsumed($current, "operator", lv_operator_6_1, null);
+							}
+							    |
+							lv_operator_6_2='not'
+							{
+								newLeafNode(lv_operator_6_2, grammarAccess.getPrimaryExpressionAccess().getOperatorNotKeyword_2_1_0_0_1());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+								}
+								setWithLastConsumed($current, "operator", lv_operator_6_2, null);
+							}
+						)
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_2_1_1_0());
+						}
+						lv_operand_7_0=ruleprimaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_7_0,
+								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)
+		    |
+		(
+			otherlv_8='('
+			{
+				newLeafNode(otherlv_8, grammarAccess.getPrimaryExpressionAccess().getLeftParenthesisKeyword_3_0());
+			}
+			{
+				/* */
+			}
+			{
+				newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getExpressionParserRuleCall_3_1());
+			}
+			this_Expression_9=ruleExpression
+			{
+				$current = $this_Expression_9.current;
+				afterParserOrEnumRuleCall();
+			}
+			otherlv_10=')'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_3_2());
+			}
+		)
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getLiteralExpressionParserRuleCall_4());
+		}
+		this_LiteralExpression_11=ruleLiteralExpression
+		{
+			$current = $this_LiteralExpression_11.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralExpression
+entryRuleLiteralExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralExpressionRule()); }
+	iv_ruleLiteralExpression=ruleLiteralExpression
+	{ $current=$iv_ruleLiteralExpression.current; }
+	EOF;
+
+// Rule LiteralExpression
+ruleLiteralExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralBooleanValueParserRuleCall_0());
+		}
+		this_LiteralBooleanValue_0=ruleLiteralBooleanValue
+		{
+			$current = $this_LiteralBooleanValue_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralCharacterValueParserRuleCall_1());
+		}
+		this_LiteralCharacterValue_1=ruleLiteralCharacterValue
+		{
+			$current = $this_LiteralCharacterValue_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralIntegerValueParserRuleCall_2());
+		}
+		this_LiteralIntegerValue_2=ruleLiteralIntegerValue
+		{
+			$current = $this_LiteralIntegerValue_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralRationalValueParserRuleCall_3());
+		}
+		this_LiteralRationalValue_3=ruleLiteralRationalValue
+		{
+			$current = $this_LiteralRationalValue_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralFloatValueParserRuleCall_4());
+		}
+		this_LiteralFloatValue_4=ruleLiteralFloatValue
+		{
+			$current = $this_LiteralFloatValue_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralStringValueParserRuleCall_5());
+		}
+		this_LiteralStringValue_5=ruleLiteralStringValue
+		{
+			$current = $this_LiteralStringValue_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralNullValueParserRuleCall_6());
+		}
+		this_LiteralNullValue_6=ruleLiteralNullValue
+		{
+			$current = $this_LiteralNullValue_6.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralArrayValueParserRuleCall_7());
+		}
+		this_LiteralArrayValue_7=ruleLiteralArrayValue
+		{
+			$current = $this_LiteralArrayValue_7.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralObjectReferenceParserRuleCall_8());
+		}
+		this_LiteralObjectReference_8=ruleLiteralObjectReference
+		{
+			$current = $this_LiteralObjectReference_8.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralVariableReferenceParserRuleCall_9());
+		}
+		this_LiteralVariableReference_9=ruleLiteralVariableReference
+		{
+			$current = $this_LiteralVariableReference_9.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralInstanceReferenceParserRuleCall_10());
+		}
+		this_LiteralInstanceReference_10=ruleLiteralInstanceReference
+		{
+			$current = $this_LiteralInstanceReference_10.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralArrayValue
+entryRuleLiteralArrayValue returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralArrayValueRule()); }
+	iv_ruleLiteralArrayValue=ruleLiteralArrayValue
+	{ $current=$iv_ruleLiteralArrayValue.current; }
+	EOF;
+
+// Rule LiteralArrayValue
+ruleLiteralArrayValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralArrayValueAccess().getLiteralArrayValueAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='['
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralArrayValueAccess().getLeftSquareBracketKeyword_1());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_0_0());
+					}
+					lv_values_2_0=ruleValueSpecification
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getLiteralArrayValueRule());
+						}
+						add(
+							$current,
+							"values",
+							lv_values_2_0,
+							"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_3=','
+				{
+					newLeafNode(otherlv_3, grammarAccess.getLiteralArrayValueAccess().getCommaKeyword_2_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_1_1_0());
+						}
+						lv_values_4_0=ruleValueSpecification
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLiteralArrayValueRule());
+							}
+							add(
+								$current,
+								"values",
+								lv_values_4_0,
+								"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		otherlv_5=']'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getLiteralArrayValueAccess().getRightSquareBracketKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralObjectReference
+entryRuleLiteralObjectReference returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralObjectReferenceRule()); }
+	iv_ruleLiteralObjectReference=ruleLiteralObjectReference
+	{ $current=$iv_ruleLiteralObjectReference.current; }
+	EOF;
+
+// Rule LiteralObjectReference
+ruleLiteralObjectReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			otherlv_0='&'
+			{
+				newLeafNode(otherlv_0, grammarAccess.getLiteralObjectReferenceAccess().getAmpersandKeyword_0());
+			}
+		)?
+		(
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getLiteralObjectReferenceRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectCrossReference_1_0_0());
+					}
+					ruleUFI
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getLiteralObjectReferenceAccess().getSymbolUFIParserRuleCall_1_1_0());
+					}
+					lv_symbol_2_0=ruleUFI
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getLiteralObjectReferenceRule());
+						}
+						set(
+							$current,
+							"symbol",
+							lv_symbol_2_0,
+							"org.eclipse.efm.sew.xtext.SEW.UFI");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralBooleanValue
+entryRuleLiteralBooleanValue returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralBooleanValueRule()); }
+	iv_ruleLiteralBooleanValue=ruleLiteralBooleanValue
+	{ $current=$iv_ruleLiteralBooleanValue.current; }
+	EOF;
+
+// Rule LiteralBooleanValue
+ruleLiteralBooleanValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getLiteralBooleanValueAccess().getValueEBooleanParserRuleCall_0());
+			}
+			lv_value_0_0=ruleEBoolean
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getLiteralBooleanValueRule());
+				}
+				set(
+					$current,
+					"value",
+					lv_value_0_0,
+					"org.eclipse.efm.sew.xtext.SEW.EBoolean");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralCharacterValue
+entryRuleLiteralCharacterValue returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralCharacterValueRule()); }
+	iv_ruleLiteralCharacterValue=ruleLiteralCharacterValue
+	{ $current=$iv_ruleLiteralCharacterValue.current; }
+	EOF;
+
+// Rule LiteralCharacterValue
+ruleLiteralCharacterValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getLiteralCharacterValueAccess().getValueECharParserRuleCall_0());
+			}
+			lv_value_0_0=ruleEChar
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getLiteralCharacterValueRule());
+				}
+				set(
+					$current,
+					"value",
+					lv_value_0_0,
+					"org.eclipse.efm.sew.xtext.SEW.EChar");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralIntegerValue
+entryRuleLiteralIntegerValue returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralIntegerValueRule()); }
+	iv_ruleLiteralIntegerValue=ruleLiteralIntegerValue
+	{ $current=$iv_ruleLiteralIntegerValue.current; }
+	EOF;
+
+// Rule LiteralIntegerValue
+ruleLiteralIntegerValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getLiteralIntegerValueAccess().getValueELongParserRuleCall_0());
+			}
+			lv_value_0_0=ruleELong
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getLiteralIntegerValueRule());
+				}
+				set(
+					$current,
+					"value",
+					lv_value_0_0,
+					"org.eclipse.efm.sew.xtext.SEW.ELong");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralRationalValue
+entryRuleLiteralRationalValue returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralRationalValueRule()); }
+	iv_ruleLiteralRationalValue=ruleLiteralRationalValue
+	{ $current=$iv_ruleLiteralRationalValue.current; }
+	EOF;
+
+// Rule LiteralRationalValue
+ruleLiteralRationalValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLiteralRationalValueAccess().getNumeratorELongParserRuleCall_0_0());
+				}
+				lv_numerator_0_0=ruleELong
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLiteralRationalValueRule());
+					}
+					set(
+						$current,
+						"numerator",
+						lv_numerator_0_0,
+						"org.eclipse.efm.sew.xtext.SEW.ELong");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_1='/'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralRationalValueAccess().getSolidusKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLiteralRationalValueAccess().getDenominatorELongParserRuleCall_2_0());
+				}
+				lv_denominator_2_0=ruleELong
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLiteralRationalValueRule());
+					}
+					set(
+						$current,
+						"denominator",
+						lv_denominator_2_0,
+						"org.eclipse.efm.sew.xtext.SEW.ELong");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralFloatValue
+entryRuleLiteralFloatValue returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralFloatValueRule()); }
+	iv_ruleLiteralFloatValue=ruleLiteralFloatValue
+	{ $current=$iv_ruleLiteralFloatValue.current; }
+	EOF;
+
+// Rule LiteralFloatValue
+ruleLiteralFloatValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getLiteralFloatValueAccess().getValueEDoubleParserRuleCall_0());
+			}
+			lv_value_0_0=ruleEDouble
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getLiteralFloatValueRule());
+				}
+				set(
+					$current,
+					"value",
+					lv_value_0_0,
+					"org.eclipse.efm.sew.xtext.SEW.EDouble");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralStringValue
+entryRuleLiteralStringValue returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralStringValueRule()); }
+	iv_ruleLiteralStringValue=ruleLiteralStringValue
+	{ $current=$iv_ruleLiteralStringValue.current; }
+	EOF;
+
+// Rule LiteralStringValue
+ruleLiteralStringValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getLiteralStringValueAccess().getValueEStringParserRuleCall_0());
+			}
+			lv_value_0_0=ruleEString
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getLiteralStringValueRule());
+				}
+				set(
+					$current,
+					"value",
+					lv_value_0_0,
+					"org.eclipse.efm.sew.xtext.SEW.EString");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralNullValue
+entryRuleLiteralNullValue returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralNullValueRule()); }
+	iv_ruleLiteralNullValue=ruleLiteralNullValue
+	{ $current=$iv_ruleLiteralNullValue.current; }
+	EOF;
+
+// Rule LiteralNullValue
+ruleLiteralNullValue returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralNullValueAccess().getLiteralNullValueAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='null'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralNullValueAccess().getNullKeyword_1());
+		}
+		(
+			otherlv_2='<'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getLiteralNullValueAccess().getLessThanSignKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getLiteralNullValueAccess().getTypeXIDParserRuleCall_2_1_0());
+					}
+					lv_type_3_0=ruleXID
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getLiteralNullValueRule());
+						}
+						set(
+							$current,
+							"type",
+							lv_type_3_0,
+							"org.eclipse.efm.sew.xtext.SEW.XID");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_4='>'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getLiteralNullValueAccess().getGreaterThanSignKeyword_2_2());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleLiteralVariableReference
+entryRuleLiteralVariableReference returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralVariableReferenceRule()); }
+	iv_ruleLiteralVariableReference=ruleLiteralVariableReference
+	{ $current=$iv_ruleLiteralVariableReference.current; }
+	EOF;
+
+// Rule LiteralVariableReference
+ruleLiteralVariableReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeVariableParserRuleCall_0());
+		}
+		this_LiteralTimeVariable_0=ruleLiteralTimeVariable
+		{
+			$current = $this_LiteralTimeVariable_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeDeltaVariableParserRuleCall_1());
+		}
+		this_LiteralTimeDeltaVariable_1=ruleLiteralTimeDeltaVariable
+		{
+			$current = $this_LiteralTimeDeltaVariable_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralTimeVariable
+entryRuleLiteralTimeVariable returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralTimeVariableRule()); }
+	iv_ruleLiteralTimeVariable=ruleLiteralTimeVariable
+	{ $current=$iv_ruleLiteralTimeVariable.current; }
+	EOF;
+
+// Rule LiteralTimeVariable
+ruleLiteralTimeVariable returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralTimeVariableAccess().getLiteralTimeVariableAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_symbol_1_0='$time'
+				{
+					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getLiteralTimeVariableRule());
+					}
+					setWithLastConsumed($current, "symbol", lv_symbol_1_0, "\$time");
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralTimeDeltaVariable
+entryRuleLiteralTimeDeltaVariable returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralTimeDeltaVariableRule()); }
+	iv_ruleLiteralTimeDeltaVariable=ruleLiteralTimeDeltaVariable
+	{ $current=$iv_ruleLiteralTimeDeltaVariable.current; }
+	EOF;
+
+// Rule LiteralTimeDeltaVariable
+ruleLiteralTimeDeltaVariable returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralTimeDeltaVariableAccess().getLiteralTimeDeltaVariableAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_symbol_1_0='$delta'
+				{
+					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getLiteralTimeDeltaVariableRule());
+					}
+					setWithLastConsumed($current, "symbol", lv_symbol_1_0, "\$delta");
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralInstanceReference
+entryRuleLiteralInstanceReference returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralInstanceReferenceRule()); }
+	iv_ruleLiteralInstanceReference=ruleLiteralInstanceReference
+	{ $current=$iv_ruleLiteralInstanceReference.current; }
+	EOF;
+
+// Rule LiteralInstanceReference
+ruleLiteralInstanceReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralThisInstanceParserRuleCall_0());
+		}
+		this_LiteralThisInstance_0=ruleLiteralThisInstance
+		{
+			$current = $this_LiteralThisInstance_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSelfInstanceParserRuleCall_1());
+		}
+		this_LiteralSelfInstance_1=ruleLiteralSelfInstance
+		{
+			$current = $this_LiteralSelfInstance_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralParentInstanceParserRuleCall_2());
+		}
+		this_LiteralParentInstance_2=ruleLiteralParentInstance
+		{
+			$current = $this_LiteralParentInstance_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSuperInstanceParserRuleCall_3());
+		}
+		this_LiteralSuperInstance_3=ruleLiteralSuperInstance
+		{
+			$current = $this_LiteralSuperInstance_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSystemInstanceParserRuleCall_4());
+		}
+		this_LiteralSystemInstance_4=ruleLiteralSystemInstance
+		{
+			$current = $this_LiteralSystemInstance_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralEnvInstanceParserRuleCall_5());
+		}
+		this_LiteralEnvInstance_5=ruleLiteralEnvInstance
+		{
+			$current = $this_LiteralEnvInstance_5.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralThisInstance
+entryRuleLiteralThisInstance returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralThisInstanceRule()); }
+	iv_ruleLiteralThisInstance=ruleLiteralThisInstance
+	{ $current=$iv_ruleLiteralThisInstance.current; }
+	EOF;
+
+// Rule LiteralThisInstance
+ruleLiteralThisInstance returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralThisInstanceAccess().getLiteralThisInstanceAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_symbol_1_0='$this'
+				{
+					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getLiteralThisInstanceRule());
+					}
+					setWithLastConsumed($current, "symbol", lv_symbol_1_0, "\$this");
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralSelfInstance
+entryRuleLiteralSelfInstance returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralSelfInstanceRule()); }
+	iv_ruleLiteralSelfInstance=ruleLiteralSelfInstance
+	{ $current=$iv_ruleLiteralSelfInstance.current; }
+	EOF;
+
+// Rule LiteralSelfInstance
+ruleLiteralSelfInstance returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralSelfInstanceAccess().getLiteralSelfInstanceAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_symbol_1_0='$self'
+				{
+					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getLiteralSelfInstanceRule());
+					}
+					setWithLastConsumed($current, "symbol", lv_symbol_1_0, "\$self");
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralParentInstance
+entryRuleLiteralParentInstance returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralParentInstanceRule()); }
+	iv_ruleLiteralParentInstance=ruleLiteralParentInstance
+	{ $current=$iv_ruleLiteralParentInstance.current; }
+	EOF;
+
+// Rule LiteralParentInstance
+ruleLiteralParentInstance returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralParentInstanceAccess().getLiteralParentInstanceAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_symbol_1_0='$parent'
+				{
+					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getLiteralParentInstanceRule());
+					}
+					setWithLastConsumed($current, "symbol", lv_symbol_1_0, "\$parent");
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralSuperInstance
+entryRuleLiteralSuperInstance returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralSuperInstanceRule()); }
+	iv_ruleLiteralSuperInstance=ruleLiteralSuperInstance
+	{ $current=$iv_ruleLiteralSuperInstance.current; }
+	EOF;
+
+// Rule LiteralSuperInstance
+ruleLiteralSuperInstance returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralSuperInstanceAccess().getLiteralSuperInstanceAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_symbol_1_0='$super'
+				{
+					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getLiteralSuperInstanceRule());
+					}
+					setWithLastConsumed($current, "symbol", lv_symbol_1_0, "\$super");
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralSystemInstance
+entryRuleLiteralSystemInstance returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralSystemInstanceRule()); }
+	iv_ruleLiteralSystemInstance=ruleLiteralSystemInstance
+	{ $current=$iv_ruleLiteralSystemInstance.current; }
+	EOF;
+
+// Rule LiteralSystemInstance
+ruleLiteralSystemInstance returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralSystemInstanceAccess().getLiteralSystemInstanceAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_symbol_1_0='$system'
+				{
+					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getLiteralSystemInstanceRule());
+					}
+					setWithLastConsumed($current, "symbol", lv_symbol_1_0, "\$system");
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralEnvInstance
+entryRuleLiteralEnvInstance returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralEnvInstanceRule()); }
+	iv_ruleLiteralEnvInstance=ruleLiteralEnvInstance
+	{ $current=$iv_ruleLiteralEnvInstance.current; }
+	EOF;
+
+// Rule LiteralEnvInstance
+ruleLiteralEnvInstance returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralEnvInstanceAccess().getLiteralEnvInstanceAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					lv_symbol_1_1='$env'
+					{
+						newLeafNode(lv_symbol_1_1, grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getLiteralEnvInstanceRule());
+						}
+						setWithLastConsumed($current, "symbol", lv_symbol_1_1, null);
+					}
+					    |
+					lv_symbol_1_2='env'
+					{
+						newLeafNode(lv_symbol_1_2, grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getLiteralEnvInstanceRule());
+						}
+						setWithLastConsumed($current, "symbol", lv_symbol_1_2, null);
+					}
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleEBoolean
+entryRuleEBoolean returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEBooleanRule()); }
+	iv_ruleEBoolean=ruleEBoolean
+	{ $current=$iv_ruleEBoolean.current.getText(); }
+	EOF;
+
+// Rule EBoolean
+ruleEBoolean returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='true'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEBooleanAccess().getTrueKeyword_0());
+		}
+		    |
+		kw='false'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEBooleanAccess().getFalseKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleEChar
+entryRuleEChar returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getECharRule()); }
+	iv_ruleEChar=ruleEChar
+	{ $current=$iv_ruleEChar.current.getText(); }
+	EOF;
+
+// Rule EChar
+ruleEChar returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	this_CHARACTER_0=RULE_CHARACTER
+	{
+		$current.merge(this_CHARACTER_0);
+	}
+	{
+		newLeafNode(this_CHARACTER_0, grammarAccess.getECharAccess().getCHARACTERTerminalRuleCall());
+	}
+;
+
+// Entry rule entryRuleELong
+entryRuleELong returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getELongRule()); }
+	iv_ruleELong=ruleELong
+	{ $current=$iv_ruleELong.current.getText(); }
+	EOF;
+
+// Rule ELong
+ruleELong returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			kw='-'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getELongAccess().getHyphenMinusKeyword_0());
+			}
+		)?
+		this_INT_1=RULE_INT
+		{
+			$current.merge(this_INT_1);
+		}
+		{
+			newLeafNode(this_INT_1, grammarAccess.getELongAccess().getINTTerminalRuleCall_1());
+		}
+	)
+;
+
+// Entry rule entryRuleEDouble
+entryRuleEDouble returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEDoubleRule()); }
+	iv_ruleEDouble=ruleEDouble
+	{ $current=$iv_ruleEDouble.current.getText(); }
+	EOF;
+
+// Rule EDouble
+ruleEDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			kw='-'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0());
+			}
+		)?
+		(
+			this_INT_1=RULE_INT
+			{
+				$current.merge(this_INT_1);
+			}
+			{
+				newLeafNode(this_INT_1, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1());
+			}
+		)?
+		kw='.'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEDoubleAccess().getFullStopKeyword_2());
+		}
+		this_INT_3=RULE_INT
+		{
+			$current.merge(this_INT_3);
+		}
+		{
+			newLeafNode(this_INT_3, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3());
+		}
+	)
+;
+
+// Entry rule entryRuleEBigDecimal
+entryRuleEBigDecimal returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEBigDecimalRule()); }
+	iv_ruleEBigDecimal=ruleEBigDecimal
+	{ $current=$iv_ruleEBigDecimal.current.getText(); }
+	EOF;
+
+// Rule EBigDecimal
+ruleEBigDecimal returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			this_INT_0=RULE_INT
+			{
+				$current.merge(this_INT_0);
+			}
+			{
+				newLeafNode(this_INT_0, grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_0());
+			}
+		)?
+		kw='.'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEBigDecimalAccess().getFullStopKeyword_1());
+		}
+		this_INT_2=RULE_INT
+		{
+			$current.merge(this_INT_2);
+		}
+		{
+			newLeafNode(this_INT_2, grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_2());
+		}
+	)
+;
+
+// Entry rule entryRuleEString
+entryRuleEString returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEStringRule()); }
+	iv_ruleEString=ruleEString
+	{ $current=$iv_ruleEString.current.getText(); }
+	EOF;
+
+// Rule EString
+ruleEString returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	this_STRING_0=RULE_STRING
+	{
+		$current.merge(this_STRING_0);
+	}
+	{
+		newLeafNode(this_STRING_0, grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall());
+	}
+;
+
+// Entry rule entryRuleDeprecatedReservedWord
+entryRuleDeprecatedReservedWord returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getDeprecatedReservedWordRule()); }
+	iv_ruleDeprecatedReservedWord=ruleDeprecatedReservedWord
+	{ $current=$iv_ruleDeprecatedReservedWord.current.getText(); }
+	EOF;
+
+// Rule DeprecatedReservedWord
+ruleDeprecatedReservedWord returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='form'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getFormKeyword_0());
+		}
+		    |
+		kw='endform'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getEndformKeyword_1());
+		}
+		    |
+		kw='prototype'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getPrototypeKeyword_2());
+		}
+		    |
+		kw='endprototype'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getEndprototypeKeyword_3());
+		}
+		    |
+		kw='section'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getSectionKeyword_4());
+		}
+		    |
+		kw='endsection'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getEndsectionKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleDeprecatedObject
+entryRuleDeprecatedObject returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDeprecatedObjectRule()); }
+	iv_ruleDeprecatedObject=ruleDeprecatedObject
+	{ $current=$iv_ruleDeprecatedObject.current; }
+	EOF;
+
+// Rule DeprecatedObject
+ruleDeprecatedObject returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getDeprecatedObjectAccess().getWObjectAction_0_0(),
+						$current);
+				}
+			)
+			otherlv_1='form'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getDeprecatedObjectAccess().getFormKeyword_0_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_0_2_0());
+					}
+					lv_name_2_0=ruleUFI
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_2_0,
+							"org.eclipse.efm.sew.xtext.SEW.UFI");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_0_3_0());
+					}
+					lv_description_3_0=ruleEString
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+						}
+						set(
+							$current,
+							"description",
+							lv_description_3_0,
+							"org.eclipse.efm.sew.xtext.SEW.EString");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_4='as'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getDeprecatedObjectAccess().getAsKeyword_0_4());
+			}
+			(
+				otherlv_5='&'
+				{
+					newLeafNode(otherlv_5, grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_0_5());
+				}
+			)?
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_0_6_0());
+					}
+					lv_type_6_0=ruleUFI
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+						}
+						set(
+							$current,
+							"type",
+							lv_type_6_0,
+							"org.eclipse.efm.sew.xtext.SEW.UFI");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_7='is'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getDeprecatedObjectAccess().getIsKeyword_0_7());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_0_8_0());
+					}
+					lv_element_8_0=ruleDeprecatedProperty
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+						}
+						add(
+							$current,
+							"element",
+							lv_element_8_0,
+							"org.eclipse.efm.sew.xtext.SEW.DeprecatedProperty");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_9='endform'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getDeprecatedObjectAccess().getEndformKeyword_0_9());
+			}
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getDeprecatedObjectAccess().getWObjectAction_1_0(),
+						$current);
+				}
+			)
+			otherlv_11='prototype'
+			{
+				newLeafNode(otherlv_11, grammarAccess.getDeprecatedObjectAccess().getPrototypeKeyword_1_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_1_2_0());
+					}
+					lv_name_12_0=ruleUFI
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_12_0,
+							"org.eclipse.efm.sew.xtext.SEW.UFI");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_1_3_0());
+					}
+					lv_description_13_0=ruleEString
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+						}
+						set(
+							$current,
+							"description",
+							lv_description_13_0,
+							"org.eclipse.efm.sew.xtext.SEW.EString");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_14='as'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getDeprecatedObjectAccess().getAsKeyword_1_4());
+			}
+			(
+				otherlv_15='&'
+				{
+					newLeafNode(otherlv_15, grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_1_5());
+				}
+			)?
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_1_6_0());
+					}
+					lv_type_16_0=ruleUFI
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+						}
+						set(
+							$current,
+							"type",
+							lv_type_16_0,
+							"org.eclipse.efm.sew.xtext.SEW.UFI");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_17='is'
+			{
+				newLeafNode(otherlv_17, grammarAccess.getDeprecatedObjectAccess().getIsKeyword_1_7());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_1_8_0());
+					}
+					lv_element_18_0=ruleDeprecatedProperty
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+						}
+						add(
+							$current,
+							"element",
+							lv_element_18_0,
+							"org.eclipse.efm.sew.xtext.SEW.DeprecatedProperty");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)*
+			otherlv_19='endprototype'
+			{
+				newLeafNode(otherlv_19, grammarAccess.getDeprecatedObjectAccess().getEndprototypeKeyword_1_9());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleDeprecatedProperty
+entryRuleDeprecatedProperty returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDeprecatedPropertyRule()); }
+	iv_ruleDeprecatedProperty=ruleDeprecatedProperty
+	{ $current=$iv_ruleDeprecatedProperty.current; }
+	EOF;
+
+// Rule DeprecatedProperty
+ruleDeprecatedProperty returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedSectionParserRuleCall_0());
+		}
+		this_DeprecatedSection_0=ruleDeprecatedSection
+		{
+			$current = $this_DeprecatedSection_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedAttributeParserRuleCall_1());
+		}
+		this_DeprecatedAttribute_1=ruleDeprecatedAttribute
+		{
+			$current = $this_DeprecatedAttribute_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleDeprecatedSection
+entryRuleDeprecatedSection returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDeprecatedSectionRule()); }
+	iv_ruleDeprecatedSection=ruleDeprecatedSection
+	{ $current=$iv_ruleDeprecatedSection.current; }
+	EOF;
+
+// Rule DeprecatedSection
+ruleDeprecatedSection returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getDeprecatedSectionAccess().getWSectionAction_0_0(),
+						$current);
+				}
+			)
+			otherlv_1='section'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getDeprecatedSectionAccess().getSectionKeyword_0_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_0_2_0());
+					}
+					lv_name_2_0=ruleXID
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_2_0,
+							"org.eclipse.efm.sew.xtext.SEW.XID");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_0_3_0_0());
+						}
+						lv_element_3_1=ruleDeprecatedAttribute
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+							}
+							add(
+								$current,
+								"element",
+								lv_element_3_1,
+								"org.eclipse.efm.sew.xtext.SEW.DeprecatedAttribute");
+							afterParserOrEnumRuleCall();
+						}
+						    |
+						{
+							newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_0_3_0_1());
+						}
+						lv_element_3_2=ruleDeprecatedObject
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+							}
+							add(
+								$current,
+								"element",
+								lv_element_3_2,
+								"org.eclipse.efm.sew.xtext.SEW.DeprecatedObject");
+							afterParserOrEnumRuleCall();
+						}
+						    |
+						{
+							newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_0_3_0_2());
+						}
+						lv_element_3_3=ruleObject
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+							}
+							add(
+								$current,
+								"element",
+								lv_element_3_3,
+								"org.eclipse.efm.sew.xtext.SEW.Object");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_4='endsection'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getDeprecatedSectionAccess().getEndsectionKeyword_0_4());
+			}
+			(
+				{
+					/* */
+				}
+				{
+					newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getXIDParserRuleCall_0_5());
+				}
+				ruleXID
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)?
+		)
+		    |
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_1_0_0());
+					}
+					lv_name_6_0=ruleXID
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_6_0,
+							"org.eclipse.efm.sew.xtext.SEW.XID");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getDescriptionEStringParserRuleCall_1_1_0());
+					}
+					lv_description_7_0=ruleEString
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+						}
+						set(
+							$current,
+							"description",
+							lv_description_7_0,
+							"org.eclipse.efm.sew.xtext.SEW.EString");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			(
+				(
+					otherlv_8='['
+					{
+						newLeafNode(otherlv_8, grammarAccess.getDeprecatedSectionAccess().getLeftSquareBracketKeyword_1_2_0_0());
+					}
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_0_1_0_0());
+								}
+								lv_element_9_1=ruleDeprecatedAttribute
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+									}
+									add(
+										$current,
+										"element",
+										lv_element_9_1,
+										"org.eclipse.efm.sew.xtext.SEW.DeprecatedAttribute");
+									afterParserOrEnumRuleCall();
+								}
+								    |
+								{
+									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_0_1_0_1());
+								}
+								lv_element_9_2=ruleDeprecatedObject
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+									}
+									add(
+										$current,
+										"element",
+										lv_element_9_2,
+										"org.eclipse.efm.sew.xtext.SEW.DeprecatedObject");
+									afterParserOrEnumRuleCall();
+								}
+								    |
+								{
+									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_0_1_0_2());
+								}
+								lv_element_9_3=ruleObject
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+									}
+									add(
+										$current,
+										"element",
+										lv_element_9_3,
+										"org.eclipse.efm.sew.xtext.SEW.Object");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+					otherlv_10=']'
+					{
+						newLeafNode(otherlv_10, grammarAccess.getDeprecatedSectionAccess().getRightSquareBracketKeyword_1_2_0_2());
+					}
+				)
+				    |
+				(
+					otherlv_11=':'
+					{
+						newLeafNode(otherlv_11, grammarAccess.getDeprecatedSectionAccess().getColonKeyword_1_2_1_0());
+					}
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_1_1_0_0());
+								}
+								lv_element_12_1=ruleDeprecatedAttribute
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+									}
+									add(
+										$current,
+										"element",
+										lv_element_12_1,
+										"org.eclipse.efm.sew.xtext.SEW.DeprecatedAttribute");
+									afterParserOrEnumRuleCall();
+								}
+								    |
+								{
+									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_1_1_0_1());
+								}
+								lv_element_12_2=ruleDeprecatedObject
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+									}
+									add(
+										$current,
+										"element",
+										lv_element_12_2,
+										"org.eclipse.efm.sew.xtext.SEW.DeprecatedObject");
+									afterParserOrEnumRuleCall();
+								}
+								    |
+								{
+									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_1_1_0_2());
+								}
+								lv_element_12_3=ruleObject
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+									}
+									add(
+										$current,
+										"element",
+										lv_element_12_3,
+										"org.eclipse.efm.sew.xtext.SEW.Object");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleDeprecatedAttribute
+entryRuleDeprecatedAttribute returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDeprecatedAttributeRule()); }
+	iv_ruleDeprecatedAttribute=ruleDeprecatedAttribute
+	{ $current=$iv_ruleDeprecatedAttribute.current; }
+	EOF;
+
+// Rule DeprecatedAttribute
+ruleDeprecatedAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getDeprecatedAttributeAccess().getWAttributeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDeprecatedAttributeAccess().getNameDeprecatedAttributeIDParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleDeprecatedAttributeID
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDeprecatedAttributeRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.sew.xtext.SEW.DeprecatedAttributeID");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='='
+		{
+			newLeafNode(otherlv_2, grammarAccess.getDeprecatedAttributeAccess().getEqualsSignKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDeprecatedAttributeAccess().getValueValueSpecificationParserRuleCall_3_0());
+				}
+				lv_value_3_0=ruleValueSpecification
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDeprecatedAttributeRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_3_0,
+						"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_4=';'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getDeprecatedAttributeAccess().getSemicolonKeyword_4());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleDeprecatedAttributeID
+entryRuleDeprecatedAttributeID returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getDeprecatedAttributeIDRule()); }
+	iv_ruleDeprecatedAttributeID=ruleDeprecatedAttributeID
+	{ $current=$iv_ruleDeprecatedAttributeID.current.getText(); }
+	EOF;
+
+// Rule DeprecatedAttributeID
+ruleDeprecatedAttributeID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getDeprecatedAttributeIDAccess().getXIDParserRuleCall_0());
+		}
+		this_XID_0=ruleXID
+		{
+			$current.merge(this_XID_0);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		this_AT_IDENTIFIER_1=RULE_AT_IDENTIFIER
+		{
+			$current.merge(this_AT_IDENTIFIER_1);
+		}
+		{
+			newLeafNode(this_AT_IDENTIFIER_1, grammarAccess.getDeprecatedAttributeIDAccess().getAT_IDENTIFIERTerminalRuleCall_1());
+		}
+	)
+;
+
+// Entry rule entryRuleDeprecatedExpression
+entryRuleDeprecatedExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDeprecatedExpressionRule()); }
+	iv_ruleDeprecatedExpression=ruleDeprecatedExpression
+	{ $current=$iv_ruleDeprecatedExpression.current; }
+	EOF;
+
+// Rule DeprecatedExpression
+ruleDeprecatedExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getDeprecatedExpressionAccess().getExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='${'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getDeprecatedExpressionAccess().getDollarSignLeftCurlyBracketKeyword_1());
+		}
+		(
+			(
+				(
+					lv_operator_2_1='|;|'
+					{
+						newLeafNode(lv_operator_2_1, grammarAccess.getDeprecatedExpressionAccess().getOperatorVerticalLineSemicolonVerticalLineKeyword_2_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getDeprecatedExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_2_1, null);
+					}
+					    |
+					lv_operator_2_2='|i|'
+					{
+						newLeafNode(lv_operator_2_2, grammarAccess.getDeprecatedExpressionAccess().getOperatorIKeyword_2_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getDeprecatedExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_2_2, null);
+					}
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDeprecatedExpressionAccess().getOperandValueSpecificationParserRuleCall_3_0());
+				}
+				lv_operand_3_0=ruleValueSpecification
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDeprecatedExpressionRule());
+					}
+					add(
+						$current,
+						"operand",
+						lv_operand_3_0,
+						"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getDeprecatedExpressionAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
+;
+
+RULE_XIDENDIFIER : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'#')*;
+
+RULE_AT_IDENTIFIER : '@' RULE_XIDENDIFIER;
+
+RULE_CHARACTER : '\'' . '\'';
+
+RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
+
+RULE_INT : ('0'..'9')+;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEW.tokens b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEW.tokens
new file mode 100644
index 0000000..ed7a171
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEW.tokens
@@ -0,0 +1,142 @@
+'!'=52
+'!='=39
+'$delta'=59
+'$env'=65
+'$parent'=62
+'$self'=61
+'$super'=63
+'$system'=64
+'$this'=60
+'$time'=58
+'${'=77
+'%'=50
+'&&'=36
+'&'=56
+'('=54
+')'=55
+'*'=47
+'**'=48
+'+'=46
+'+:='=27
+','=22
+'-'=51
+'.'=25
+'/'=49
+':'=30
+'::'=24
+':='=26
+';'=32
+'<'=20
+'<='=43
+'=!='=41
+'='=31
+'=/='=42
+'=='=38
+'==='=40
+'>'=44
+'>:'=23
+'>='=45
+'?'=33
+'@favm'=19
+'@sew'=18
+'['=28
+']'=29
+'and'=37
+'as'=75
+'endform'=70
+'endprototype'=72
+'endsection'=74
+'env'=66
+'false'=68
+'form'=69
+'is'=76
+'not'=53
+'null'=57
+'or'=35
+'prototype'=71
+'section'=73
+'sew'=21
+'symbex-workflow'=15
+'true'=67
+'workflow'=14
+'{'=16
+'|;|'=78
+'|i|'=79
+'||'=34
+'}'=17
+RULE_ANY_OTHER=13
+RULE_AT_IDENTIFIER=8
+RULE_CHARACTER=5
+RULE_ID=9
+RULE_INT=6
+RULE_ML_COMMENT=10
+RULE_SL_COMMENT=11
+RULE_STRING=7
+RULE_WS=12
+RULE_XIDENDIFIER=4
+T__14=14
+T__15=15
+T__16=16
+T__17=17
+T__18=18
+T__19=19
+T__20=20
+T__21=21
+T__22=22
+T__23=23
+T__24=24
+T__25=25
+T__26=26
+T__27=27
+T__28=28
+T__29=29
+T__30=30
+T__31=31
+T__32=32
+T__33=33
+T__34=34
+T__35=35
+T__36=36
+T__37=37
+T__38=38
+T__39=39
+T__40=40
+T__41=41
+T__42=42
+T__43=43
+T__44=44
+T__45=45
+T__46=46
+T__47=47
+T__48=48
+T__49=49
+T__50=50
+T__51=51
+T__52=52
+T__53=53
+T__54=54
+T__55=55
+T__56=56
+T__57=57
+T__58=58
+T__59=59
+T__60=60
+T__61=61
+T__62=62
+T__63=63
+T__64=64
+T__65=65
+T__66=66
+T__67=67
+T__68=68
+T__69=69
+T__70=70
+T__71=71
+T__72=72
+T__73=73
+T__74=74
+T__75=75
+T__76=76
+T__77=77
+T__78=78
+T__79=79
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEWLexer.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEWLexer.java
new file mode 100644
index 0000000..71e24b0
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEWLexer.java
@@ -0,0 +1,3034 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+package org.eclipse.efm.sew.xtext.parser.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.parser.antlr.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalSEWLexer extends Lexer {
+    public static final int T__50=50;
+    public static final int RULE_CHARACTER=5;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__59=59;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__14=14;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__52=52;
+    public static final int T__53=53;
+    public static final int T__54=54;
+    public static final int T__60=60;
+    public static final int T__61=61;
+    public static final int RULE_XIDENDIFIER=4;
+    public static final int RULE_ID=9;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int RULE_INT=6;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__66=66;
+    public static final int RULE_ML_COMMENT=10;
+    public static final int T__23=23;
+    public static final int T__67=67;
+    public static final int T__24=24;
+    public static final int T__68=68;
+    public static final int T__25=25;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__63=63;
+    public static final int T__20=20;
+    public static final int T__64=64;
+    public static final int T__21=21;
+    public static final int T__65=65;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=7;
+    public static final int RULE_SL_COMMENT=11;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__77=77;
+    public static final int T__34=34;
+    public static final int T__78=78;
+    public static final int T__35=35;
+    public static final int T__79=79;
+    public static final int T__36=36;
+    public static final int T__73=73;
+    public static final int EOF=-1;
+    public static final int T__30=30;
+    public static final int T__74=74;
+    public static final int T__31=31;
+    public static final int T__75=75;
+    public static final int T__32=32;
+    public static final int T__76=76;
+    public static final int RULE_WS=12;
+    public static final int RULE_ANY_OTHER=13;
+    public static final int RULE_AT_IDENTIFIER=8;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__41=41;
+    public static final int T__42=42;
+    public static final int T__43=43;
+
+    // delegates
+    // delegators
+
+    public InternalSEWLexer() {;} 
+    public InternalSEWLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalSEWLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "InternalSEW.g"; }
+
+    // $ANTLR start "T__14"
+    public final void mT__14() throws RecognitionException {
+        try {
+            int _type = T__14;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:11:7: ( 'workflow' )
+            // InternalSEW.g:11:9: 'workflow'
+            {
+            match("workflow"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__14"
+
+    // $ANTLR start "T__15"
+    public final void mT__15() throws RecognitionException {
+        try {
+            int _type = T__15;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:12:7: ( 'symbex-workflow' )
+            // InternalSEW.g:12:9: 'symbex-workflow'
+            {
+            match("symbex-workflow"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__15"
+
+    // $ANTLR start "T__16"
+    public final void mT__16() throws RecognitionException {
+        try {
+            int _type = T__16;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:13:7: ( '{' )
+            // InternalSEW.g:13:9: '{'
+            {
+            match('{'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__16"
+
+    // $ANTLR start "T__17"
+    public final void mT__17() throws RecognitionException {
+        try {
+            int _type = T__17;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:14:7: ( '}' )
+            // InternalSEW.g:14:9: '}'
+            {
+            match('}'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__17"
+
+    // $ANTLR start "T__18"
+    public final void mT__18() throws RecognitionException {
+        try {
+            int _type = T__18;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:15:7: ( '@sew' )
+            // InternalSEW.g:15:9: '@sew'
+            {
+            match("@sew"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__18"
+
+    // $ANTLR start "T__19"
+    public final void mT__19() throws RecognitionException {
+        try {
+            int _type = T__19;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:16:7: ( '@favm' )
+            // InternalSEW.g:16:9: '@favm'
+            {
+            match("@favm"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__19"
+
+    // $ANTLR start "T__20"
+    public final void mT__20() throws RecognitionException {
+        try {
+            int _type = T__20;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:17:7: ( '<' )
+            // InternalSEW.g:17:9: '<'
+            {
+            match('<'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__20"
+
+    // $ANTLR start "T__21"
+    public final void mT__21() throws RecognitionException {
+        try {
+            int _type = T__21;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:18:7: ( 'sew' )
+            // InternalSEW.g:18:9: 'sew'
+            {
+            match("sew"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__21"
+
+    // $ANTLR start "T__22"
+    public final void mT__22() throws RecognitionException {
+        try {
+            int _type = T__22;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:19:7: ( ',' )
+            // InternalSEW.g:19:9: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__22"
+
+    // $ANTLR start "T__23"
+    public final void mT__23() throws RecognitionException {
+        try {
+            int _type = T__23;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:20:7: ( '>:' )
+            // InternalSEW.g:20:9: '>:'
+            {
+            match(">:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__23"
+
+    // $ANTLR start "T__24"
+    public final void mT__24() throws RecognitionException {
+        try {
+            int _type = T__24;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:21:7: ( '::' )
+            // InternalSEW.g:21:9: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__24"
+
+    // $ANTLR start "T__25"
+    public final void mT__25() throws RecognitionException {
+        try {
+            int _type = T__25;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:22:7: ( '.' )
+            // InternalSEW.g:22:9: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__25"
+
+    // $ANTLR start "T__26"
+    public final void mT__26() throws RecognitionException {
+        try {
+            int _type = T__26;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:23:7: ( ':=' )
+            // InternalSEW.g:23:9: ':='
+            {
+            match(":="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__26"
+
+    // $ANTLR start "T__27"
+    public final void mT__27() throws RecognitionException {
+        try {
+            int _type = T__27;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:24:7: ( '+:=' )
+            // InternalSEW.g:24:9: '+:='
+            {
+            match("+:="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__27"
+
+    // $ANTLR start "T__28"
+    public final void mT__28() throws RecognitionException {
+        try {
+            int _type = T__28;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:25:7: ( '[' )
+            // InternalSEW.g:25:9: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__28"
+
+    // $ANTLR start "T__29"
+    public final void mT__29() throws RecognitionException {
+        try {
+            int _type = T__29;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:26:7: ( ']' )
+            // InternalSEW.g:26:9: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__29"
+
+    // $ANTLR start "T__30"
+    public final void mT__30() throws RecognitionException {
+        try {
+            int _type = T__30;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:27:7: ( ':' )
+            // InternalSEW.g:27:9: ':'
+            {
+            match(':'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__30"
+
+    // $ANTLR start "T__31"
+    public final void mT__31() throws RecognitionException {
+        try {
+            int _type = T__31;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:28:7: ( '=' )
+            // InternalSEW.g:28:9: '='
+            {
+            match('='); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__31"
+
+    // $ANTLR start "T__32"
+    public final void mT__32() throws RecognitionException {
+        try {
+            int _type = T__32;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:29:7: ( ';' )
+            // InternalSEW.g:29:9: ';'
+            {
+            match(';'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__32"
+
+    // $ANTLR start "T__33"
+    public final void mT__33() throws RecognitionException {
+        try {
+            int _type = T__33;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:30:7: ( '?' )
+            // InternalSEW.g:30:9: '?'
+            {
+            match('?'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__33"
+
+    // $ANTLR start "T__34"
+    public final void mT__34() throws RecognitionException {
+        try {
+            int _type = T__34;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:31:7: ( '||' )
+            // InternalSEW.g:31:9: '||'
+            {
+            match("||"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__34"
+
+    // $ANTLR start "T__35"
+    public final void mT__35() throws RecognitionException {
+        try {
+            int _type = T__35;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:32:7: ( 'or' )
+            // InternalSEW.g:32:9: 'or'
+            {
+            match("or"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__35"
+
+    // $ANTLR start "T__36"
+    public final void mT__36() throws RecognitionException {
+        try {
+            int _type = T__36;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:33:7: ( '&&' )
+            // InternalSEW.g:33:9: '&&'
+            {
+            match("&&"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__36"
+
+    // $ANTLR start "T__37"
+    public final void mT__37() throws RecognitionException {
+        try {
+            int _type = T__37;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:34:7: ( 'and' )
+            // InternalSEW.g:34:9: 'and'
+            {
+            match("and"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__37"
+
+    // $ANTLR start "T__38"
+    public final void mT__38() throws RecognitionException {
+        try {
+            int _type = T__38;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:35:7: ( '==' )
+            // InternalSEW.g:35:9: '=='
+            {
+            match("=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__38"
+
+    // $ANTLR start "T__39"
+    public final void mT__39() throws RecognitionException {
+        try {
+            int _type = T__39;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:36:7: ( '!=' )
+            // InternalSEW.g:36:9: '!='
+            {
+            match("!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__39"
+
+    // $ANTLR start "T__40"
+    public final void mT__40() throws RecognitionException {
+        try {
+            int _type = T__40;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:37:7: ( '===' )
+            // InternalSEW.g:37:9: '==='
+            {
+            match("==="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__40"
+
+    // $ANTLR start "T__41"
+    public final void mT__41() throws RecognitionException {
+        try {
+            int _type = T__41;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:38:7: ( '=!=' )
+            // InternalSEW.g:38:9: '=!='
+            {
+            match("=!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__41"
+
+    // $ANTLR start "T__42"
+    public final void mT__42() throws RecognitionException {
+        try {
+            int _type = T__42;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:39:7: ( '=/=' )
+            // InternalSEW.g:39:9: '=/='
+            {
+            match("=/="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__42"
+
+    // $ANTLR start "T__43"
+    public final void mT__43() throws RecognitionException {
+        try {
+            int _type = T__43;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:40:7: ( '<=' )
+            // InternalSEW.g:40:9: '<='
+            {
+            match("<="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__43"
+
+    // $ANTLR start "T__44"
+    public final void mT__44() throws RecognitionException {
+        try {
+            int _type = T__44;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:41:7: ( '>' )
+            // InternalSEW.g:41:9: '>'
+            {
+            match('>'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__44"
+
+    // $ANTLR start "T__45"
+    public final void mT__45() throws RecognitionException {
+        try {
+            int _type = T__45;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:42:7: ( '>=' )
+            // InternalSEW.g:42:9: '>='
+            {
+            match(">="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__45"
+
+    // $ANTLR start "T__46"
+    public final void mT__46() throws RecognitionException {
+        try {
+            int _type = T__46;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:43:7: ( '+' )
+            // InternalSEW.g:43:9: '+'
+            {
+            match('+'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__46"
+
+    // $ANTLR start "T__47"
+    public final void mT__47() throws RecognitionException {
+        try {
+            int _type = T__47;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:44:7: ( '*' )
+            // InternalSEW.g:44:9: '*'
+            {
+            match('*'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__47"
+
+    // $ANTLR start "T__48"
+    public final void mT__48() throws RecognitionException {
+        try {
+            int _type = T__48;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:45:7: ( '**' )
+            // InternalSEW.g:45:9: '**'
+            {
+            match("**"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__48"
+
+    // $ANTLR start "T__49"
+    public final void mT__49() throws RecognitionException {
+        try {
+            int _type = T__49;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:46:7: ( '/' )
+            // InternalSEW.g:46:9: '/'
+            {
+            match('/'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__49"
+
+    // $ANTLR start "T__50"
+    public final void mT__50() throws RecognitionException {
+        try {
+            int _type = T__50;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:47:7: ( '%' )
+            // InternalSEW.g:47:9: '%'
+            {
+            match('%'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__50"
+
+    // $ANTLR start "T__51"
+    public final void mT__51() throws RecognitionException {
+        try {
+            int _type = T__51;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:48:7: ( '-' )
+            // InternalSEW.g:48:9: '-'
+            {
+            match('-'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__51"
+
+    // $ANTLR start "T__52"
+    public final void mT__52() throws RecognitionException {
+        try {
+            int _type = T__52;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:49:7: ( '!' )
+            // InternalSEW.g:49:9: '!'
+            {
+            match('!'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__52"
+
+    // $ANTLR start "T__53"
+    public final void mT__53() throws RecognitionException {
+        try {
+            int _type = T__53;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:50:7: ( 'not' )
+            // InternalSEW.g:50:9: 'not'
+            {
+            match("not"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__53"
+
+    // $ANTLR start "T__54"
+    public final void mT__54() throws RecognitionException {
+        try {
+            int _type = T__54;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:51:7: ( '(' )
+            // InternalSEW.g:51:9: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__54"
+
+    // $ANTLR start "T__55"
+    public final void mT__55() throws RecognitionException {
+        try {
+            int _type = T__55;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:52:7: ( ')' )
+            // InternalSEW.g:52:9: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__55"
+
+    // $ANTLR start "T__56"
+    public final void mT__56() throws RecognitionException {
+        try {
+            int _type = T__56;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:53:7: ( '&' )
+            // InternalSEW.g:53:9: '&'
+            {
+            match('&'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__56"
+
+    // $ANTLR start "T__57"
+    public final void mT__57() throws RecognitionException {
+        try {
+            int _type = T__57;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:54:7: ( 'null' )
+            // InternalSEW.g:54:9: 'null'
+            {
+            match("null"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__57"
+
+    // $ANTLR start "T__58"
+    public final void mT__58() throws RecognitionException {
+        try {
+            int _type = T__58;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:55:7: ( '$time' )
+            // InternalSEW.g:55:9: '$time'
+            {
+            match("$time"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__58"
+
+    // $ANTLR start "T__59"
+    public final void mT__59() throws RecognitionException {
+        try {
+            int _type = T__59;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:56:7: ( '$delta' )
+            // InternalSEW.g:56:9: '$delta'
+            {
+            match("$delta"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__59"
+
+    // $ANTLR start "T__60"
+    public final void mT__60() throws RecognitionException {
+        try {
+            int _type = T__60;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:57:7: ( '$this' )
+            // InternalSEW.g:57:9: '$this'
+            {
+            match("$this"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__60"
+
+    // $ANTLR start "T__61"
+    public final void mT__61() throws RecognitionException {
+        try {
+            int _type = T__61;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:58:7: ( '$self' )
+            // InternalSEW.g:58:9: '$self'
+            {
+            match("$self"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__61"
+
+    // $ANTLR start "T__62"
+    public final void mT__62() throws RecognitionException {
+        try {
+            int _type = T__62;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:59:7: ( '$parent' )
+            // InternalSEW.g:59:9: '$parent'
+            {
+            match("$parent"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__62"
+
+    // $ANTLR start "T__63"
+    public final void mT__63() throws RecognitionException {
+        try {
+            int _type = T__63;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:60:7: ( '$super' )
+            // InternalSEW.g:60:9: '$super'
+            {
+            match("$super"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__63"
+
+    // $ANTLR start "T__64"
+    public final void mT__64() throws RecognitionException {
+        try {
+            int _type = T__64;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:61:7: ( '$system' )
+            // InternalSEW.g:61:9: '$system'
+            {
+            match("$system"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__64"
+
+    // $ANTLR start "T__65"
+    public final void mT__65() throws RecognitionException {
+        try {
+            int _type = T__65;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:62:7: ( '$env' )
+            // InternalSEW.g:62:9: '$env'
+            {
+            match("$env"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__65"
+
+    // $ANTLR start "T__66"
+    public final void mT__66() throws RecognitionException {
+        try {
+            int _type = T__66;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:63:7: ( 'env' )
+            // InternalSEW.g:63:9: 'env'
+            {
+            match("env"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__66"
+
+    // $ANTLR start "T__67"
+    public final void mT__67() throws RecognitionException {
+        try {
+            int _type = T__67;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:64:7: ( 'true' )
+            // InternalSEW.g:64:9: 'true'
+            {
+            match("true"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__67"
+
+    // $ANTLR start "T__68"
+    public final void mT__68() throws RecognitionException {
+        try {
+            int _type = T__68;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:65:7: ( 'false' )
+            // InternalSEW.g:65:9: 'false'
+            {
+            match("false"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__68"
+
+    // $ANTLR start "T__69"
+    public final void mT__69() throws RecognitionException {
+        try {
+            int _type = T__69;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:66:7: ( 'form' )
+            // InternalSEW.g:66:9: 'form'
+            {
+            match("form"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__69"
+
+    // $ANTLR start "T__70"
+    public final void mT__70() throws RecognitionException {
+        try {
+            int _type = T__70;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:67:7: ( 'endform' )
+            // InternalSEW.g:67:9: 'endform'
+            {
+            match("endform"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__70"
+
+    // $ANTLR start "T__71"
+    public final void mT__71() throws RecognitionException {
+        try {
+            int _type = T__71;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:68:7: ( 'prototype' )
+            // InternalSEW.g:68:9: 'prototype'
+            {
+            match("prototype"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__71"
+
+    // $ANTLR start "T__72"
+    public final void mT__72() throws RecognitionException {
+        try {
+            int _type = T__72;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:69:7: ( 'endprototype' )
+            // InternalSEW.g:69:9: 'endprototype'
+            {
+            match("endprototype"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__72"
+
+    // $ANTLR start "T__73"
+    public final void mT__73() throws RecognitionException {
+        try {
+            int _type = T__73;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:70:7: ( 'section' )
+            // InternalSEW.g:70:9: 'section'
+            {
+            match("section"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__73"
+
+    // $ANTLR start "T__74"
+    public final void mT__74() throws RecognitionException {
+        try {
+            int _type = T__74;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:71:7: ( 'endsection' )
+            // InternalSEW.g:71:9: 'endsection'
+            {
+            match("endsection"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__74"
+
+    // $ANTLR start "T__75"
+    public final void mT__75() throws RecognitionException {
+        try {
+            int _type = T__75;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:72:7: ( 'as' )
+            // InternalSEW.g:72:9: 'as'
+            {
+            match("as"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__75"
+
+    // $ANTLR start "T__76"
+    public final void mT__76() throws RecognitionException {
+        try {
+            int _type = T__76;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:73:7: ( 'is' )
+            // InternalSEW.g:73:9: 'is'
+            {
+            match("is"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__76"
+
+    // $ANTLR start "T__77"
+    public final void mT__77() throws RecognitionException {
+        try {
+            int _type = T__77;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:74:7: ( '${' )
+            // InternalSEW.g:74:9: '${'
+            {
+            match("${"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__77"
+
+    // $ANTLR start "T__78"
+    public final void mT__78() throws RecognitionException {
+        try {
+            int _type = T__78;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:75:7: ( '|;|' )
+            // InternalSEW.g:75:9: '|;|'
+            {
+            match("|;|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__78"
+
+    // $ANTLR start "T__79"
+    public final void mT__79() throws RecognitionException {
+        try {
+            int _type = T__79;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:76:7: ( '|i|' )
+            // InternalSEW.g:76:9: '|i|'
+            {
+            match("|i|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__79"
+
+    // $ANTLR start "RULE_XIDENDIFIER"
+    public final void mRULE_XIDENDIFIER() throws RecognitionException {
+        try {
+            int _type = RULE_XIDENDIFIER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4361:18: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )* )
+            // InternalSEW.g:4361:20: ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )*
+            {
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalSEW.g:4361:44: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0=='#'||(LA1_0>='0' && LA1_0<='9')||(LA1_0>='A' && LA1_0<='Z')||LA1_0=='_'||(LA1_0>='a' && LA1_0<='z')) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // InternalSEW.g:
+            	    {
+            	    if ( input.LA(1)=='#'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_XIDENDIFIER"
+
+    // $ANTLR start "RULE_AT_IDENTIFIER"
+    public final void mRULE_AT_IDENTIFIER() throws RecognitionException {
+        try {
+            int _type = RULE_AT_IDENTIFIER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4363:20: ( '@' RULE_XIDENDIFIER )
+            // InternalSEW.g:4363:22: '@' RULE_XIDENDIFIER
+            {
+            match('@'); 
+            mRULE_XIDENDIFIER(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_AT_IDENTIFIER"
+
+    // $ANTLR start "RULE_CHARACTER"
+    public final void mRULE_CHARACTER() throws RecognitionException {
+        try {
+            int _type = RULE_CHARACTER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4365:16: ( '\\'' . '\\'' )
+            // InternalSEW.g:4365:18: '\\'' . '\\''
+            {
+            match('\''); 
+            matchAny(); 
+            match('\''); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_CHARACTER"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4367:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* )
+            // InternalSEW.g:4367:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            {
+            // InternalSEW.g:4367:11: ( '^' )?
+            int alt2=2;
+            int LA2_0 = input.LA(1);
+
+            if ( (LA2_0=='^') ) {
+                alt2=1;
+            }
+            switch (alt2) {
+                case 1 :
+                    // InternalSEW.g:4367:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalSEW.g:4367:40: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( ((LA3_0>='0' && LA3_0<='9')||(LA3_0>='A' && LA3_0<='Z')||LA3_0=='_'||(LA3_0>='a' && LA3_0<='z')) ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+            	case 1 :
+            	    // InternalSEW.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop3;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4369:10: ( ( '0' .. '9' )+ )
+            // InternalSEW.g:4369:12: ( '0' .. '9' )+
+            {
+            // InternalSEW.g:4369:12: ( '0' .. '9' )+
+            int cnt4=0;
+            loop4:
+            do {
+                int alt4=2;
+                int LA4_0 = input.LA(1);
+
+                if ( ((LA4_0>='0' && LA4_0<='9')) ) {
+                    alt4=1;
+                }
+
+
+                switch (alt4) {
+            	case 1 :
+            	    // InternalSEW.g:4369:13: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt4 >= 1 ) break loop4;
+                        EarlyExitException eee =
+                            new EarlyExitException(4, input);
+                        throw eee;
+                }
+                cnt4++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4371:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
+            // InternalSEW.g:4371:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            {
+            // InternalSEW.g:4371:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0=='\"') ) {
+                alt7=1;
+            }
+            else if ( (LA7_0=='\'') ) {
+                alt7=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalSEW.g:4371:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+                    {
+                    match('\"'); 
+                    // InternalSEW.g:4371:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop5:
+                    do {
+                        int alt5=3;
+                        int LA5_0 = input.LA(1);
+
+                        if ( (LA5_0=='\\') ) {
+                            alt5=1;
+                        }
+                        else if ( ((LA5_0>='\u0000' && LA5_0<='!')||(LA5_0>='#' && LA5_0<='[')||(LA5_0>=']' && LA5_0<='\uFFFF')) ) {
+                            alt5=2;
+                        }
+
+
+                        switch (alt5) {
+                    	case 1 :
+                    	    // InternalSEW.g:4371:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalSEW.g:4371:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop5;
+                        }
+                    } while (true);
+
+                    match('\"'); 
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:4371:48: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+                    {
+                    match('\''); 
+                    // InternalSEW.g:4371:53: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop6:
+                    do {
+                        int alt6=3;
+                        int LA6_0 = input.LA(1);
+
+                        if ( (LA6_0=='\\') ) {
+                            alt6=1;
+                        }
+                        else if ( ((LA6_0>='\u0000' && LA6_0<='&')||(LA6_0>='(' && LA6_0<='[')||(LA6_0>=']' && LA6_0<='\uFFFF')) ) {
+                            alt6=2;
+                        }
+
+
+                        switch (alt6) {
+                    	case 1 :
+                    	    // InternalSEW.g:4371:54: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalSEW.g:4371:61: ~ ( ( '\\\\' | '\\'' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop6;
+                        }
+                    } while (true);
+
+                    match('\''); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_STRING"
+
+    // $ANTLR start "RULE_ML_COMMENT"
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4373:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalSEW.g:4373:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // InternalSEW.g:4373:24: ( options {greedy=false; } : . )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( (LA8_0=='*') ) {
+                    int LA8_1 = input.LA(2);
+
+                    if ( (LA8_1=='/') ) {
+                        alt8=2;
+                    }
+                    else if ( ((LA8_1>='\u0000' && LA8_1<='.')||(LA8_1>='0' && LA8_1<='\uFFFF')) ) {
+                        alt8=1;
+                    }
+
+
+                }
+                else if ( ((LA8_0>='\u0000' && LA8_0<=')')||(LA8_0>='+' && LA8_0<='\uFFFF')) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // InternalSEW.g:4373:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ML_COMMENT"
+
+    // $ANTLR start "RULE_SL_COMMENT"
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4375:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalSEW.g:4375:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // InternalSEW.g:4375:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop9:
+            do {
+                int alt9=2;
+                int LA9_0 = input.LA(1);
+
+                if ( ((LA9_0>='\u0000' && LA9_0<='\t')||(LA9_0>='\u000B' && LA9_0<='\f')||(LA9_0>='\u000E' && LA9_0<='\uFFFF')) ) {
+                    alt9=1;
+                }
+
+
+                switch (alt9) {
+            	case 1 :
+            	    // InternalSEW.g:4375:24: ~ ( ( '\\n' | '\\r' ) )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop9;
+                }
+            } while (true);
+
+            // InternalSEW.g:4375:40: ( ( '\\r' )? '\\n' )?
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0=='\n'||LA11_0=='\r') ) {
+                alt11=1;
+            }
+            switch (alt11) {
+                case 1 :
+                    // InternalSEW.g:4375:41: ( '\\r' )? '\\n'
+                    {
+                    // InternalSEW.g:4375:41: ( '\\r' )?
+                    int alt10=2;
+                    int LA10_0 = input.LA(1);
+
+                    if ( (LA10_0=='\r') ) {
+                        alt10=1;
+                    }
+                    switch (alt10) {
+                        case 1 :
+                            // InternalSEW.g:4375:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_SL_COMMENT"
+
+    // $ANTLR start "RULE_WS"
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4377:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalSEW.g:4377:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // InternalSEW.g:4377:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt12=0;
+            loop12:
+            do {
+                int alt12=2;
+                int LA12_0 = input.LA(1);
+
+                if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {
+                    alt12=1;
+                }
+
+
+                switch (alt12) {
+            	case 1 :
+            	    // InternalSEW.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt12 >= 1 ) break loop12;
+                        EarlyExitException eee =
+                            new EarlyExitException(12, input);
+                        throw eee;
+                }
+                cnt12++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_WS"
+
+    // $ANTLR start "RULE_ANY_OTHER"
+    public final void mRULE_ANY_OTHER() throws RecognitionException {
+        try {
+            int _type = RULE_ANY_OTHER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalSEW.g:4379:16: ( . )
+            // InternalSEW.g:4379:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // InternalSEW.g:1:8: ( T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | RULE_XIDENDIFIER | RULE_AT_IDENTIFIER | RULE_CHARACTER | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt13=76;
+        alt13 = dfa13.predict(input);
+        switch (alt13) {
+            case 1 :
+                // InternalSEW.g:1:10: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 2 :
+                // InternalSEW.g:1:16: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 3 :
+                // InternalSEW.g:1:22: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 4 :
+                // InternalSEW.g:1:28: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 5 :
+                // InternalSEW.g:1:34: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 6 :
+                // InternalSEW.g:1:40: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 7 :
+                // InternalSEW.g:1:46: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 8 :
+                // InternalSEW.g:1:52: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 9 :
+                // InternalSEW.g:1:58: T__22
+                {
+                mT__22(); 
+
+                }
+                break;
+            case 10 :
+                // InternalSEW.g:1:64: T__23
+                {
+                mT__23(); 
+
+                }
+                break;
+            case 11 :
+                // InternalSEW.g:1:70: T__24
+                {
+                mT__24(); 
+
+                }
+                break;
+            case 12 :
+                // InternalSEW.g:1:76: T__25
+                {
+                mT__25(); 
+
+                }
+                break;
+            case 13 :
+                // InternalSEW.g:1:82: T__26
+                {
+                mT__26(); 
+
+                }
+                break;
+            case 14 :
+                // InternalSEW.g:1:88: T__27
+                {
+                mT__27(); 
+
+                }
+                break;
+            case 15 :
+                // InternalSEW.g:1:94: T__28
+                {
+                mT__28(); 
+
+                }
+                break;
+            case 16 :
+                // InternalSEW.g:1:100: T__29
+                {
+                mT__29(); 
+
+                }
+                break;
+            case 17 :
+                // InternalSEW.g:1:106: T__30
+                {
+                mT__30(); 
+
+                }
+                break;
+            case 18 :
+                // InternalSEW.g:1:112: T__31
+                {
+                mT__31(); 
+
+                }
+                break;
+            case 19 :
+                // InternalSEW.g:1:118: T__32
+                {
+                mT__32(); 
+
+                }
+                break;
+            case 20 :
+                // InternalSEW.g:1:124: T__33
+                {
+                mT__33(); 
+
+                }
+                break;
+            case 21 :
+                // InternalSEW.g:1:130: T__34
+                {
+                mT__34(); 
+
+                }
+                break;
+            case 22 :
+                // InternalSEW.g:1:136: T__35
+                {
+                mT__35(); 
+
+                }
+                break;
+            case 23 :
+                // InternalSEW.g:1:142: T__36
+                {
+                mT__36(); 
+
+                }
+                break;
+            case 24 :
+                // InternalSEW.g:1:148: T__37
+                {
+                mT__37(); 
+
+                }
+                break;
+            case 25 :
+                // InternalSEW.g:1:154: T__38
+                {
+                mT__38(); 
+
+                }
+                break;
+            case 26 :
+                // InternalSEW.g:1:160: T__39
+                {
+                mT__39(); 
+
+                }
+                break;
+            case 27 :
+                // InternalSEW.g:1:166: T__40
+                {
+                mT__40(); 
+
+                }
+                break;
+            case 28 :
+                // InternalSEW.g:1:172: T__41
+                {
+                mT__41(); 
+
+                }
+                break;
+            case 29 :
+                // InternalSEW.g:1:178: T__42
+                {
+                mT__42(); 
+
+                }
+                break;
+            case 30 :
+                // InternalSEW.g:1:184: T__43
+                {
+                mT__43(); 
+
+                }
+                break;
+            case 31 :
+                // InternalSEW.g:1:190: T__44
+                {
+                mT__44(); 
+
+                }
+                break;
+            case 32 :
+                // InternalSEW.g:1:196: T__45
+                {
+                mT__45(); 
+
+                }
+                break;
+            case 33 :
+                // InternalSEW.g:1:202: T__46
+                {
+                mT__46(); 
+
+                }
+                break;
+            case 34 :
+                // InternalSEW.g:1:208: T__47
+                {
+                mT__47(); 
+
+                }
+                break;
+            case 35 :
+                // InternalSEW.g:1:214: T__48
+                {
+                mT__48(); 
+
+                }
+                break;
+            case 36 :
+                // InternalSEW.g:1:220: T__49
+                {
+                mT__49(); 
+
+                }
+                break;
+            case 37 :
+                // InternalSEW.g:1:226: T__50
+                {
+                mT__50(); 
+
+                }
+                break;
+            case 38 :
+                // InternalSEW.g:1:232: T__51
+                {
+                mT__51(); 
+
+                }
+                break;
+            case 39 :
+                // InternalSEW.g:1:238: T__52
+                {
+                mT__52(); 
+
+                }
+                break;
+            case 40 :
+                // InternalSEW.g:1:244: T__53
+                {
+                mT__53(); 
+
+                }
+                break;
+            case 41 :
+                // InternalSEW.g:1:250: T__54
+                {
+                mT__54(); 
+
+                }
+                break;
+            case 42 :
+                // InternalSEW.g:1:256: T__55
+                {
+                mT__55(); 
+
+                }
+                break;
+            case 43 :
+                // InternalSEW.g:1:262: T__56
+                {
+                mT__56(); 
+
+                }
+                break;
+            case 44 :
+                // InternalSEW.g:1:268: T__57
+                {
+                mT__57(); 
+
+                }
+                break;
+            case 45 :
+                // InternalSEW.g:1:274: T__58
+                {
+                mT__58(); 
+
+                }
+                break;
+            case 46 :
+                // InternalSEW.g:1:280: T__59
+                {
+                mT__59(); 
+
+                }
+                break;
+            case 47 :
+                // InternalSEW.g:1:286: T__60
+                {
+                mT__60(); 
+
+                }
+                break;
+            case 48 :
+                // InternalSEW.g:1:292: T__61
+                {
+                mT__61(); 
+
+                }
+                break;
+            case 49 :
+                // InternalSEW.g:1:298: T__62
+                {
+                mT__62(); 
+
+                }
+                break;
+            case 50 :
+                // InternalSEW.g:1:304: T__63
+                {
+                mT__63(); 
+
+                }
+                break;
+            case 51 :
+                // InternalSEW.g:1:310: T__64
+                {
+                mT__64(); 
+
+                }
+                break;
+            case 52 :
+                // InternalSEW.g:1:316: T__65
+                {
+                mT__65(); 
+
+                }
+                break;
+            case 53 :
+                // InternalSEW.g:1:322: T__66
+                {
+                mT__66(); 
+
+                }
+                break;
+            case 54 :
+                // InternalSEW.g:1:328: T__67
+                {
+                mT__67(); 
+
+                }
+                break;
+            case 55 :
+                // InternalSEW.g:1:334: T__68
+                {
+                mT__68(); 
+
+                }
+                break;
+            case 56 :
+                // InternalSEW.g:1:340: T__69
+                {
+                mT__69(); 
+
+                }
+                break;
+            case 57 :
+                // InternalSEW.g:1:346: T__70
+                {
+                mT__70(); 
+
+                }
+                break;
+            case 58 :
+                // InternalSEW.g:1:352: T__71
+                {
+                mT__71(); 
+
+                }
+                break;
+            case 59 :
+                // InternalSEW.g:1:358: T__72
+                {
+                mT__72(); 
+
+                }
+                break;
+            case 60 :
+                // InternalSEW.g:1:364: T__73
+                {
+                mT__73(); 
+
+                }
+                break;
+            case 61 :
+                // InternalSEW.g:1:370: T__74
+                {
+                mT__74(); 
+
+                }
+                break;
+            case 62 :
+                // InternalSEW.g:1:376: T__75
+                {
+                mT__75(); 
+
+                }
+                break;
+            case 63 :
+                // InternalSEW.g:1:382: T__76
+                {
+                mT__76(); 
+
+                }
+                break;
+            case 64 :
+                // InternalSEW.g:1:388: T__77
+                {
+                mT__77(); 
+
+                }
+                break;
+            case 65 :
+                // InternalSEW.g:1:394: T__78
+                {
+                mT__78(); 
+
+                }
+                break;
+            case 66 :
+                // InternalSEW.g:1:400: T__79
+                {
+                mT__79(); 
+
+                }
+                break;
+            case 67 :
+                // InternalSEW.g:1:406: RULE_XIDENDIFIER
+                {
+                mRULE_XIDENDIFIER(); 
+
+                }
+                break;
+            case 68 :
+                // InternalSEW.g:1:423: RULE_AT_IDENTIFIER
+                {
+                mRULE_AT_IDENTIFIER(); 
+
+                }
+                break;
+            case 69 :
+                // InternalSEW.g:1:442: RULE_CHARACTER
+                {
+                mRULE_CHARACTER(); 
+
+                }
+                break;
+            case 70 :
+                // InternalSEW.g:1:457: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 71 :
+                // InternalSEW.g:1:465: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 72 :
+                // InternalSEW.g:1:474: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 73 :
+                // InternalSEW.g:1:486: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 74 :
+                // InternalSEW.g:1:502: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 75 :
+                // InternalSEW.g:1:518: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 76 :
+                // InternalSEW.g:1:526: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA13 dfa13 = new DFA13(this);
+    static final String DFA13_eotS =
+        "\1\uffff\2\53\2\uffff\1\51\1\65\1\uffff\1\71\1\74\1\uffff\1\77\2\uffff\1\105\2\uffff\1\51\1\53\1\115\1\53\1\121\1\123\1\126\2\uffff\1\53\2\uffff\1\51\6\53\2\51\1\uffff\1\51\2\uffff\1\53\1\uffff\3\53\2\uffff\2\63\17\uffff\1\167\10\uffff\1\170\2\uffff\1\53\1\172\11\uffff\2\53\10\uffff\5\53\1\u0088\2\uffff\1\156\4\uffff\2\53\1\u008e\1\53\2\63\3\uffff\1\u0092\1\uffff\1\u0093\1\53\5\uffff\1\u0095\5\53\1\uffff\1\u008b\2\uffff\2\53\1\uffff\1\53\1\u00a0\1\63\2\uffff\1\u00a2\1\uffff\3\53\1\u00a6\1\53\1\u00a8\4\53\1\uffff\1\u00ad\1\uffff\3\53\1\uffff\1\u00b1\1\uffff\4\53\1\uffff\3\53\1\uffff\2\53\1\uffff\1\u00bb\1\u00bc\3\53\1\u00c0\2\uffff\3\53\1\uffff\2\53\1\u00c6\1\53\1\u00c8\1\uffff\1\53\1\uffff\1\u00ca\1\uffff";
+    static final String DFA13_eofS =
+        "\u00cb\uffff";
+    static final String DFA13_minS =
+        "\1\0\2\60\2\uffff\1\101\1\75\1\uffff\2\72\1\uffff\1\72\2\uffff\1\41\2\uffff\1\73\1\60\1\46\1\60\1\75\2\52\2\uffff\1\60\2\uffff\1\144\6\60\1\0\1\101\1\uffff\1\0\2\uffff\1\60\1\uffff\3\60\2\uffff\1\145\1\141\17\uffff\1\75\10\uffff\1\43\2\uffff\1\60\1\43\11\uffff\2\60\2\uffff\1\150\1\uffff\1\145\3\uffff\5\60\1\43\2\0\1\47\4\uffff\2\60\1\43\1\60\1\167\1\166\3\uffff\1\43\1\uffff\1\43\1\60\5\uffff\1\43\5\60\1\uffff\1\0\2\uffff\2\60\1\uffff\1\60\1\43\1\155\2\uffff\1\43\1\uffff\3\60\1\43\1\60\1\43\4\60\1\uffff\1\43\1\uffff\3\60\1\uffff\1\43\1\uffff\2\60\1\55\1\60\1\uffff\3\60\1\uffff\2\60\1\uffff\2\43\3\60\1\43\2\uffff\3\60\1\uffff\2\60\1\43\1\60\1\43\1\uffff\1\60\1\uffff\1\43\1\uffff";
+    static final String DFA13_maxS =
+        "\1\uffff\2\172\2\uffff\1\172\1\75\1\uffff\2\75\1\uffff\1\72\2\uffff\1\75\2\uffff\1\174\1\172\1\46\1\172\1\75\1\52\1\57\2\uffff\1\172\2\uffff\1\173\6\172\1\uffff\1\172\1\uffff\1\uffff\2\uffff\1\172\1\uffff\3\172\2\uffff\1\145\1\141\17\uffff\1\75\10\uffff\1\172\2\uffff\2\172\11\uffff\2\172\2\uffff\1\151\1\uffff\1\171\3\uffff\6\172\2\uffff\1\47\4\uffff\4\172\1\167\1\166\3\uffff\1\172\1\uffff\2\172\5\uffff\6\172\1\uffff\1\uffff\2\uffff\2\172\1\uffff\2\172\1\155\2\uffff\1\172\1\uffff\12\172\1\uffff\1\172\1\uffff\3\172\1\uffff\1\172\1\uffff\4\172\1\uffff\3\172\1\uffff\2\172\1\uffff\6\172\2\uffff\3\172\1\uffff\5\172\1\uffff\1\172\1\uffff\1\172\1\uffff";
+    static final String DFA13_acceptS =
+        "\3\uffff\1\3\1\4\2\uffff\1\11\2\uffff\1\14\1\uffff\1\17\1\20\1\uffff\1\23\1\24\7\uffff\1\45\1\46\1\uffff\1\51\1\52\11\uffff\1\107\1\uffff\1\113\1\114\1\uffff\1\103\3\uffff\1\3\1\4\2\uffff\1\104\1\36\1\7\1\11\1\12\1\40\1\37\1\13\1\15\1\21\1\14\1\16\1\41\1\17\1\20\1\uffff\1\34\1\35\1\22\1\23\1\24\1\25\1\101\1\102\1\uffff\1\27\1\53\2\uffff\1\32\1\47\1\43\1\42\1\111\1\112\1\44\1\45\1\46\2\uffff\1\51\1\52\1\uffff\1\56\1\uffff\1\61\1\64\1\100\11\uffff\1\106\1\107\1\110\1\113\6\uffff\1\33\1\31\1\26\1\uffff\1\76\2\uffff\1\55\1\57\1\60\1\62\1\63\6\uffff\1\77\1\uffff\2\105\2\uffff\1\10\3\uffff\1\30\1\50\1\uffff\1\65\12\uffff\1\5\1\uffff\1\54\3\uffff\1\66\1\uffff\1\70\4\uffff\1\6\3\uffff\1\67\2\uffff\1\2\6\uffff\1\74\1\71\3\uffff\1\1\5\uffff\1\72\1\uffff\1\75\1\uffff\1\73";
+    static final String DFA13_specialS =
+        "\1\4\43\uffff\1\5\2\uffff\1\3\101\uffff\1\2\1\0\36\uffff\1\1\101\uffff}>";
+    static final String[] DFA13_transitionS = {
+            "\11\51\2\50\2\51\1\50\22\51\1\50\1\25\1\47\1\51\1\35\1\30\1\23\1\44\1\33\1\34\1\26\1\13\1\7\1\31\1\12\1\27\12\46\1\11\1\17\1\6\1\16\1\10\1\20\1\5\32\43\1\14\1\51\1\15\1\45\1\43\1\51\1\24\3\43\1\36\1\40\2\43\1\42\4\43\1\32\1\22\1\41\2\43\1\2\1\37\2\43\1\1\3\43\1\3\1\21\1\4\uff82\51",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\52\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\56\23\54\1\55\1\54",
+            "",
+            "",
+            "\32\63\4\uffff\1\63\1\uffff\5\63\1\62\14\63\1\61\7\63",
+            "\1\64",
+            "",
+            "\1\67\2\uffff\1\70",
+            "\1\72\2\uffff\1\73",
+            "",
+            "\1\76",
+            "",
+            "",
+            "\1\103\15\uffff\1\104\15\uffff\1\102",
+            "",
+            "",
+            "\1\111\55\uffff\1\112\22\uffff\1\110",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\113\10\54",
+            "\1\114",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\15\54\1\116\4\54\1\117\7\54",
+            "\1\120",
+            "\1\122",
+            "\1\124\4\uffff\1\125",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\131\5\54\1\132\5\54",
+            "",
+            "",
+            "\1\136\1\141\12\uffff\1\140\2\uffff\1\137\1\135\6\uffff\1\142",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\15\54\1\143\14\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\144\10\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\1\145\15\54\1\146\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\147\10\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\22\54\1\150\7\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\47\152\1\153\64\152\1\151\uffa3\152",
+            "\32\154\4\uffff\1\154\1\uffff\32\154",
+            "",
+            "\0\156",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\160\10\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\14\54\1\161\15\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\2\54\1\163\23\54\1\162\3\54",
+            "",
+            "",
+            "\1\164",
+            "\1\165",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\166",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\3\54\1\171\26\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\173\6\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\13\54\1\174\16\54",
+            "",
+            "",
+            "\1\176\1\175",
+            "",
+            "\1\177\17\uffff\1\u0080\3\uffff\1\u0081",
+            "",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\3\54\1\u0083\21\54\1\u0082\4\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\24\54\1\u0084\5\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\13\54\1\u0085\16\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\u0086\10\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u0087\13\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\47\156\1\u0089\uffd8\156",
+            "\47\156\1\u008a\uffd8\156",
+            "\1\u008b",
+            "",
+            "",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\12\54\1\u008c\17\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\1\54\1\u008d\30\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u008f\6\54",
+            "\1\u0090",
+            "\1\u0091",
+            "",
+            "",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\13\54\1\u0094\16\54",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\5\54\1\u0096\11\54\1\u0097\2\54\1\u0098\7\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u0099\25\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\22\54\1\u009a\7\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\14\54\1\u009b\15\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u009c\6\54",
+            "",
+            "\0\156",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\5\54\1\u009d\24\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u009e\25\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\10\54\1\u009f\21\54",
+            "\1\63\14\uffff\12\63\7\uffff\32\63\4\uffff\1\63\1\uffff\32\63",
+            "\1\u00a1",
+            "",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00a3\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\u00a4\10\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u00a5\25\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u00a7\25\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00a9\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\13\54\1\u00aa\16\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\27\54\1\u00ab\2\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00ac\13\54",
+            "",
+            "\1\63\14\uffff\12\63\7\uffff\32\63\4\uffff\1\63\1\uffff\32\63",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\21\54\1\u00ae\10\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00af\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\2\54\1\u00b0\27\54",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u00b2\6\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00b3\13\54",
+            "\1\u00b4\2\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\15\54\1\u00b5\14\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\14\54\1\u00b6\15\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u00b7\6\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u00b8\6\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\30\54\1\u00b9\1\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\26\54\1\u00ba\3\54",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00bd\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\10\54\1\u00be\21\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\17\54\1\u00bf\12\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\23\54\1\u00c1\6\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\16\54\1\u00c2\13\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u00c3\25\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\30\54\1\u00c4\1\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\15\54\1\u00c5\14\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\17\54\1\u00c7\12\54",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            "",
+            "\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\4\54\1\u00c9\25\54",
+            "",
+            "\1\53\14\uffff\12\54\7\uffff\32\54\4\uffff\1\54\1\uffff\32\54",
+            ""
+    };
+
+    static final short[] DFA13_eot = DFA.unpackEncodedString(DFA13_eotS);
+    static final short[] DFA13_eof = DFA.unpackEncodedString(DFA13_eofS);
+    static final char[] DFA13_min = DFA.unpackEncodedStringToUnsignedChars(DFA13_minS);
+    static final char[] DFA13_max = DFA.unpackEncodedStringToUnsignedChars(DFA13_maxS);
+    static final short[] DFA13_accept = DFA.unpackEncodedString(DFA13_acceptS);
+    static final short[] DFA13_special = DFA.unpackEncodedString(DFA13_specialS);
+    static final short[][] DFA13_transition;
+
+    static {
+        int numStates = DFA13_transitionS.length;
+        DFA13_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA13_transition[i] = DFA.unpackEncodedString(DFA13_transitionS[i]);
+        }
+    }
+
+    static class DFA13 extends DFA {
+
+        public DFA13(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 13;
+            this.eot = DFA13_eot;
+            this.eof = DFA13_eof;
+            this.min = DFA13_min;
+            this.max = DFA13_max;
+            this.accept = DFA13_accept;
+            this.special = DFA13_special;
+            this.transition = DFA13_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | RULE_XIDENDIFIER | RULE_AT_IDENTIFIER | RULE_CHARACTER | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            IntStream input = _input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA13_106 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_106=='\'') ) {s = 138;}
+
+                        else if ( ((LA13_106>='\u0000' && LA13_106<='&')||(LA13_106>='(' && LA13_106<='\uFFFF')) ) {s = 110;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA13_137 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA13_137>='\u0000' && LA13_137<='\uFFFF')) ) {s = 110;}
+
+                        else s = 139;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA13_105 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_105=='\'') ) {s = 137;}
+
+                        else if ( ((LA13_105>='\u0000' && LA13_105<='&')||(LA13_105>='(' && LA13_105<='\uFFFF')) ) {s = 110;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA13_39 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA13_39>='\u0000' && LA13_39<='\uFFFF')) ) {s = 110;}
+
+                        else s = 41;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA13_0 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_0=='w') ) {s = 1;}
+
+                        else if ( (LA13_0=='s') ) {s = 2;}
+
+                        else if ( (LA13_0=='{') ) {s = 3;}
+
+                        else if ( (LA13_0=='}') ) {s = 4;}
+
+                        else if ( (LA13_0=='@') ) {s = 5;}
+
+                        else if ( (LA13_0=='<') ) {s = 6;}
+
+                        else if ( (LA13_0==',') ) {s = 7;}
+
+                        else if ( (LA13_0=='>') ) {s = 8;}
+
+                        else if ( (LA13_0==':') ) {s = 9;}
+
+                        else if ( (LA13_0=='.') ) {s = 10;}
+
+                        else if ( (LA13_0=='+') ) {s = 11;}
+
+                        else if ( (LA13_0=='[') ) {s = 12;}
+
+                        else if ( (LA13_0==']') ) {s = 13;}
+
+                        else if ( (LA13_0=='=') ) {s = 14;}
+
+                        else if ( (LA13_0==';') ) {s = 15;}
+
+                        else if ( (LA13_0=='?') ) {s = 16;}
+
+                        else if ( (LA13_0=='|') ) {s = 17;}
+
+                        else if ( (LA13_0=='o') ) {s = 18;}
+
+                        else if ( (LA13_0=='&') ) {s = 19;}
+
+                        else if ( (LA13_0=='a') ) {s = 20;}
+
+                        else if ( (LA13_0=='!') ) {s = 21;}
+
+                        else if ( (LA13_0=='*') ) {s = 22;}
+
+                        else if ( (LA13_0=='/') ) {s = 23;}
+
+                        else if ( (LA13_0=='%') ) {s = 24;}
+
+                        else if ( (LA13_0=='-') ) {s = 25;}
+
+                        else if ( (LA13_0=='n') ) {s = 26;}
+
+                        else if ( (LA13_0=='(') ) {s = 27;}
+
+                        else if ( (LA13_0==')') ) {s = 28;}
+
+                        else if ( (LA13_0=='$') ) {s = 29;}
+
+                        else if ( (LA13_0=='e') ) {s = 30;}
+
+                        else if ( (LA13_0=='t') ) {s = 31;}
+
+                        else if ( (LA13_0=='f') ) {s = 32;}
+
+                        else if ( (LA13_0=='p') ) {s = 33;}
+
+                        else if ( (LA13_0=='i') ) {s = 34;}
+
+                        else if ( ((LA13_0>='A' && LA13_0<='Z')||LA13_0=='_'||(LA13_0>='b' && LA13_0<='d')||(LA13_0>='g' && LA13_0<='h')||(LA13_0>='j' && LA13_0<='m')||(LA13_0>='q' && LA13_0<='r')||(LA13_0>='u' && LA13_0<='v')||(LA13_0>='x' && LA13_0<='z')) ) {s = 35;}
+
+                        else if ( (LA13_0=='\'') ) {s = 36;}
+
+                        else if ( (LA13_0=='^') ) {s = 37;}
+
+                        else if ( ((LA13_0>='0' && LA13_0<='9')) ) {s = 38;}
+
+                        else if ( (LA13_0=='\"') ) {s = 39;}
+
+                        else if ( ((LA13_0>='\t' && LA13_0<='\n')||LA13_0=='\r'||LA13_0==' ') ) {s = 40;}
+
+                        else if ( ((LA13_0>='\u0000' && LA13_0<='\b')||(LA13_0>='\u000B' && LA13_0<='\f')||(LA13_0>='\u000E' && LA13_0<='\u001F')||LA13_0=='#'||LA13_0=='\\'||LA13_0=='`'||(LA13_0>='~' && LA13_0<='\uFFFF')) ) {s = 41;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA13_36 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_36=='\\') ) {s = 105;}
+
+                        else if ( ((LA13_36>='\u0000' && LA13_36<='&')||(LA13_36>='(' && LA13_36<='[')||(LA13_36>=']' && LA13_36<='\uFFFF')) ) {s = 106;}
+
+                        else if ( (LA13_36=='\'') ) {s = 107;}
+
+                        else s = 41;
+
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 13, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+}
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEWParser.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEWParser.java
new file mode 100644
index 0000000..5e9ccd0
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/parser/antlr/internal/InternalSEWParser.java
@@ -0,0 +1,14825 @@
+package org.eclipse.efm.sew.xtext.parser.antlr.internal;
+
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+import org.eclipse.efm.sew.xtext.services.SEWGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+@SuppressWarnings("all")
+public class InternalSEWParser extends AbstractInternalAntlrParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_XIDENDIFIER", "RULE_CHARACTER", "RULE_INT", "RULE_STRING", "RULE_AT_IDENTIFIER", "RULE_ID", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'workflow'", "'symbex-workflow'", "'{'", "'}'", "'@sew'", "'@favm'", "'<'", "'sew'", "','", "'>:'", "'::'", "'.'", "':='", "'+:='", "'['", "']'", "':'", "'='", "';'", "'?'", "'||'", "'or'", "'&&'", "'and'", "'=='", "'!='", "'==='", "'=!='", "'=/='", "'<='", "'>'", "'>='", "'+'", "'*'", "'**'", "'/'", "'%'", "'-'", "'!'", "'not'", "'('", "')'", "'&'", "'null'", "'$time'", "'$delta'", "'$this'", "'$self'", "'$parent'", "'$super'", "'$system'", "'$env'", "'env'", "'true'", "'false'", "'form'", "'endform'", "'prototype'", "'endprototype'", "'section'", "'endsection'", "'as'", "'is'", "'${'", "'|;|'", "'|i|'"
+    };
+    public static final int T__50=50;
+    public static final int RULE_CHARACTER=5;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__59=59;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__14=14;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__52=52;
+    public static final int T__53=53;
+    public static final int T__54=54;
+    public static final int T__60=60;
+    public static final int T__61=61;
+    public static final int RULE_XIDENDIFIER=4;
+    public static final int RULE_ID=9;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int RULE_INT=6;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__66=66;
+    public static final int RULE_ML_COMMENT=10;
+    public static final int T__23=23;
+    public static final int T__67=67;
+    public static final int T__24=24;
+    public static final int T__68=68;
+    public static final int T__25=25;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__63=63;
+    public static final int T__20=20;
+    public static final int T__64=64;
+    public static final int T__21=21;
+    public static final int T__65=65;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=7;
+    public static final int RULE_SL_COMMENT=11;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__77=77;
+    public static final int T__34=34;
+    public static final int T__78=78;
+    public static final int T__35=35;
+    public static final int T__79=79;
+    public static final int T__36=36;
+    public static final int T__73=73;
+    public static final int EOF=-1;
+    public static final int T__30=30;
+    public static final int T__74=74;
+    public static final int T__31=31;
+    public static final int T__75=75;
+    public static final int T__32=32;
+    public static final int T__76=76;
+    public static final int RULE_WS=12;
+    public static final int RULE_ANY_OTHER=13;
+    public static final int RULE_AT_IDENTIFIER=8;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__41=41;
+    public static final int T__42=42;
+    public static final int T__43=43;
+
+    // delegates
+    // delegators
+
+
+        public InternalSEWParser(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+        public InternalSEWParser(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+             
+        }
+        
+
+    public String[] getTokenNames() { return InternalSEWParser.tokenNames; }
+    public String getGrammarFileName() { return "InternalSEW.g"; }
+
+
+
+    /*
+      This grammar contains a lot of empty actions to work around a bug in ANTLR.
+      Otherwise the ANTLR tool will create synpreds that cannot be compiled in some rare cases.
+    */
+
+     	private SEWGrammarAccess grammarAccess;
+
+        public InternalSEWParser(TokenStream input, SEWGrammarAccess grammarAccess) {
+            this(input);
+            this.grammarAccess = grammarAccess;
+            registerRules(grammarAccess.getGrammar());
+        }
+
+        @Override
+        protected String getFirstRuleName() {
+        	return "Workflow";
+       	}
+
+       	@Override
+       	protected SEWGrammarAccess getGrammarAccess() {
+       		return grammarAccess;
+       	}
+
+
+
+
+    // $ANTLR start "entryRuleWorkflow"
+    // InternalSEW.g:79:1: entryRuleWorkflow returns [EObject current=null] : iv_ruleWorkflow= ruleWorkflow EOF ;
+    public final EObject entryRuleWorkflow() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleWorkflow = null;
+
+
+        try {
+            // InternalSEW.g:79:49: (iv_ruleWorkflow= ruleWorkflow EOF )
+            // InternalSEW.g:80:2: iv_ruleWorkflow= ruleWorkflow EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getWorkflowRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleWorkflow=ruleWorkflow();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleWorkflow; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleWorkflow"
+
+
+    // $ANTLR start "ruleWorkflow"
+    // InternalSEW.g:86:1: ruleWorkflow returns [EObject current=null] : ( () ( ruleProlog )? ( ( ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) ) ( (lv_name_3_0= ruleUFI ) )? ( (lv_description_4_0= ruleEString ) )? otherlv_5= '{' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )* otherlv_7= '}' ) | ( (lv_element_8_0= ruleDeprecatedObject ) ) ) ) ;
+    public final EObject ruleWorkflow() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_type_2_1=null;
+        Token lv_type_2_2=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_description_4_0 = null;
+
+        EObject lv_element_6_1 = null;
+
+        EObject lv_element_6_2 = null;
+
+        EObject lv_element_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:92:2: ( ( () ( ruleProlog )? ( ( ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) ) ( (lv_name_3_0= ruleUFI ) )? ( (lv_description_4_0= ruleEString ) )? otherlv_5= '{' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )* otherlv_7= '}' ) | ( (lv_element_8_0= ruleDeprecatedObject ) ) ) ) )
+            // InternalSEW.g:93:2: ( () ( ruleProlog )? ( ( ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) ) ( (lv_name_3_0= ruleUFI ) )? ( (lv_description_4_0= ruleEString ) )? otherlv_5= '{' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )* otherlv_7= '}' ) | ( (lv_element_8_0= ruleDeprecatedObject ) ) ) )
+            {
+            // InternalSEW.g:93:2: ( () ( ruleProlog )? ( ( ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) ) ( (lv_name_3_0= ruleUFI ) )? ( (lv_description_4_0= ruleEString ) )? otherlv_5= '{' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )* otherlv_7= '}' ) | ( (lv_element_8_0= ruleDeprecatedObject ) ) ) )
+            // InternalSEW.g:94:3: () ( ruleProlog )? ( ( ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) ) ( (lv_name_3_0= ruleUFI ) )? ( (lv_description_4_0= ruleEString ) )? otherlv_5= '{' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )* otherlv_7= '}' ) | ( (lv_element_8_0= ruleDeprecatedObject ) ) )
+            {
+            // InternalSEW.g:94:3: ()
+            // InternalSEW.g:95:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getWorkflowAccess().getSEWorkflowAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:104:3: ( ruleProlog )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( ((LA1_0>=18 && LA1_0<=19)) ) {
+                alt1=1;
+            }
+            switch (alt1) {
+                case 1 :
+                    // InternalSEW.g:105:4: ruleProlog
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				/* */
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getWorkflowAccess().getPrologParserRuleCall_1());
+                      			
+                    }
+                    pushFollow(FollowSets000.FOLLOW_3);
+                    ruleProlog();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalSEW.g:116:3: ( ( ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) ) ( (lv_name_3_0= ruleUFI ) )? ( (lv_description_4_0= ruleEString ) )? otherlv_5= '{' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )* otherlv_7= '}' ) | ( (lv_element_8_0= ruleDeprecatedObject ) ) )
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( ((LA7_0>=14 && LA7_0<=15)) ) {
+                alt7=1;
+            }
+            else if ( (LA7_0==69||LA7_0==71) ) {
+                alt7=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalSEW.g:117:4: ( ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) ) ( (lv_name_3_0= ruleUFI ) )? ( (lv_description_4_0= ruleEString ) )? otherlv_5= '{' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )* otherlv_7= '}' )
+                    {
+                    // InternalSEW.g:117:4: ( ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) ) ( (lv_name_3_0= ruleUFI ) )? ( (lv_description_4_0= ruleEString ) )? otherlv_5= '{' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )* otherlv_7= '}' )
+                    // InternalSEW.g:118:5: ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) ) ( (lv_name_3_0= ruleUFI ) )? ( (lv_description_4_0= ruleEString ) )? otherlv_5= '{' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )* otherlv_7= '}'
+                    {
+                    // InternalSEW.g:118:5: ( ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) ) )
+                    // InternalSEW.g:119:6: ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) )
+                    {
+                    // InternalSEW.g:119:6: ( (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' ) )
+                    // InternalSEW.g:120:7: (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' )
+                    {
+                    // InternalSEW.g:120:7: (lv_type_2_1= 'workflow' | lv_type_2_2= 'symbex-workflow' )
+                    int alt2=2;
+                    int LA2_0 = input.LA(1);
+
+                    if ( (LA2_0==14) ) {
+                        alt2=1;
+                    }
+                    else if ( (LA2_0==15) ) {
+                        alt2=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 2, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt2) {
+                        case 1 :
+                            // InternalSEW.g:121:8: lv_type_2_1= 'workflow'
+                            {
+                            lv_type_2_1=(Token)match(input,14,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_type_2_1, grammarAccess.getWorkflowAccess().getTypeWorkflowKeyword_2_0_0_0_0());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getWorkflowRule());
+                              								}
+                              								setWithLastConsumed(current, "type", lv_type_2_1, null);
+                              							
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalSEW.g:132:8: lv_type_2_2= 'symbex-workflow'
+                            {
+                            lv_type_2_2=(Token)match(input,15,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_type_2_2, grammarAccess.getWorkflowAccess().getTypeSymbexWorkflowKeyword_2_0_0_0_1());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getWorkflowRule());
+                              								}
+                              								setWithLastConsumed(current, "type", lv_type_2_2, null);
+                              							
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:145:5: ( (lv_name_3_0= ruleUFI ) )?
+                    int alt3=2;
+                    int LA3_0 = input.LA(1);
+
+                    if ( (LA3_0==RULE_XIDENDIFIER||LA3_0==14||LA3_0==21||(LA3_0>=69 && LA3_0<=74)) ) {
+                        alt3=1;
+                    }
+                    switch (alt3) {
+                        case 1 :
+                            // InternalSEW.g:146:6: (lv_name_3_0= ruleUFI )
+                            {
+                            // InternalSEW.g:146:6: (lv_name_3_0= ruleUFI )
+                            // InternalSEW.g:147:7: lv_name_3_0= ruleUFI
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getWorkflowAccess().getNameUFIParserRuleCall_2_0_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_5);
+                            lv_name_3_0=ruleUFI();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getWorkflowRule());
+                              							}
+                              							set(
+                              								current,
+                              								"name",
+                              								lv_name_3_0,
+                              								"org.eclipse.efm.sew.xtext.SEW.UFI");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalSEW.g:164:5: ( (lv_description_4_0= ruleEString ) )?
+                    int alt4=2;
+                    int LA4_0 = input.LA(1);
+
+                    if ( (LA4_0==RULE_STRING) ) {
+                        alt4=1;
+                    }
+                    switch (alt4) {
+                        case 1 :
+                            // InternalSEW.g:165:6: (lv_description_4_0= ruleEString )
+                            {
+                            // InternalSEW.g:165:6: (lv_description_4_0= ruleEString )
+                            // InternalSEW.g:166:7: lv_description_4_0= ruleEString
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getWorkflowAccess().getDescriptionEStringParserRuleCall_2_0_2_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_6);
+                            lv_description_4_0=ruleEString();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getWorkflowRule());
+                              							}
+                              							set(
+                              								current,
+                              								"description",
+                              								lv_description_4_0,
+                              								"org.eclipse.efm.sew.xtext.SEW.EString");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_5=(Token)match(input,16,FollowSets000.FOLLOW_7); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_5, grammarAccess.getWorkflowAccess().getLeftCurlyBracketKeyword_2_0_3());
+                      				
+                    }
+                    // InternalSEW.g:187:5: ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) ) )*
+                    loop6:
+                    do {
+                        int alt6=2;
+                        int LA6_0 = input.LA(1);
+
+                        if ( (LA6_0==RULE_XIDENDIFIER||LA6_0==14||LA6_0==21||(LA6_0>=69 && LA6_0<=74)) ) {
+                            alt6=1;
+                        }
+
+
+                        switch (alt6) {
+                    	case 1 :
+                    	    // InternalSEW.g:188:6: ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) )
+                    	    {
+                    	    // InternalSEW.g:188:6: ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty ) )
+                    	    // InternalSEW.g:189:7: (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty )
+                    	    {
+                    	    // InternalSEW.g:189:7: (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty )
+                    	    int alt5=2;
+                    	    alt5 = dfa5.predict(input);
+                    	    switch (alt5) {
+                    	        case 1 :
+                    	            // InternalSEW.g:190:8: lv_element_6_1= ruleObject
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getWorkflowAccess().getElementObjectParserRuleCall_2_0_4_0_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_7);
+                    	            lv_element_6_1=ruleObject();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getWorkflowRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"element",
+                    	              									lv_element_6_1,
+                    	              									"org.eclipse.efm.sew.xtext.SEW.Object");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalSEW.g:206:8: lv_element_6_2= ruleProperty
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getWorkflowAccess().getElementPropertyParserRuleCall_2_0_4_0_1());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_7);
+                    	            lv_element_6_2=ruleProperty();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getWorkflowRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"element",
+                    	              									lv_element_6_2,
+                    	              									"org.eclipse.efm.sew.xtext.SEW.Property");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop6;
+                        }
+                    } while (true);
+
+                    otherlv_7=(Token)match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_7, grammarAccess.getWorkflowAccess().getRightCurlyBracketKeyword_2_0_5());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:230:4: ( (lv_element_8_0= ruleDeprecatedObject ) )
+                    {
+                    // InternalSEW.g:230:4: ( (lv_element_8_0= ruleDeprecatedObject ) )
+                    // InternalSEW.g:231:5: (lv_element_8_0= ruleDeprecatedObject )
+                    {
+                    // InternalSEW.g:231:5: (lv_element_8_0= ruleDeprecatedObject )
+                    // InternalSEW.g:232:6: lv_element_8_0= ruleDeprecatedObject
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getWorkflowAccess().getElementDeprecatedObjectParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_element_8_0=ruleDeprecatedObject();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getWorkflowRule());
+                      						}
+                      						add(
+                      							current,
+                      							"element",
+                      							lv_element_8_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.DeprecatedObject");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleWorkflow"
+
+
+    // $ANTLR start "entryRuleProlog"
+    // InternalSEW.g:254:1: entryRuleProlog returns [String current=null] : iv_ruleProlog= ruleProlog EOF ;
+    public final String entryRuleProlog() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleProlog = null;
+
+
+        try {
+            // InternalSEW.g:254:46: (iv_ruleProlog= ruleProlog EOF )
+            // InternalSEW.g:255:2: iv_ruleProlog= ruleProlog EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrologRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleProlog=ruleProlog();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleProlog.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleProlog"
+
+
+    // $ANTLR start "ruleProlog"
+    // InternalSEW.g:261:1: ruleProlog returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '@sew' | kw= '@favm' ) kw= '<' (kw= 'workflow' | kw= 'sew' ) (kw= ',' this_EDouble_6= ruleEDouble )? ( (kw= ',' this_UFI_8= ruleUFI ) | this_EString_9= ruleEString )? kw= '>:' ) ;
+    public final AntlrDatatypeRuleToken ruleProlog() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_EDouble_6 = null;
+
+        AntlrDatatypeRuleToken this_UFI_8 = null;
+
+        AntlrDatatypeRuleToken this_EString_9 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:267:2: ( ( (kw= '@sew' | kw= '@favm' ) kw= '<' (kw= 'workflow' | kw= 'sew' ) (kw= ',' this_EDouble_6= ruleEDouble )? ( (kw= ',' this_UFI_8= ruleUFI ) | this_EString_9= ruleEString )? kw= '>:' ) )
+            // InternalSEW.g:268:2: ( (kw= '@sew' | kw= '@favm' ) kw= '<' (kw= 'workflow' | kw= 'sew' ) (kw= ',' this_EDouble_6= ruleEDouble )? ( (kw= ',' this_UFI_8= ruleUFI ) | this_EString_9= ruleEString )? kw= '>:' )
+            {
+            // InternalSEW.g:268:2: ( (kw= '@sew' | kw= '@favm' ) kw= '<' (kw= 'workflow' | kw= 'sew' ) (kw= ',' this_EDouble_6= ruleEDouble )? ( (kw= ',' this_UFI_8= ruleUFI ) | this_EString_9= ruleEString )? kw= '>:' )
+            // InternalSEW.g:269:3: (kw= '@sew' | kw= '@favm' ) kw= '<' (kw= 'workflow' | kw= 'sew' ) (kw= ',' this_EDouble_6= ruleEDouble )? ( (kw= ',' this_UFI_8= ruleUFI ) | this_EString_9= ruleEString )? kw= '>:'
+            {
+            // InternalSEW.g:269:3: (kw= '@sew' | kw= '@favm' )
+            int alt8=2;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0==18) ) {
+                alt8=1;
+            }
+            else if ( (LA8_0==19) ) {
+                alt8=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 8, 0, input);
+
+                throw nvae;
+            }
+            switch (alt8) {
+                case 1 :
+                    // InternalSEW.g:270:4: kw= '@sew'
+                    {
+                    kw=(Token)match(input,18,FollowSets000.FOLLOW_8); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getPrologAccess().getSewKeyword_0_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:276:4: kw= '@favm'
+                    {
+                    kw=(Token)match(input,19,FollowSets000.FOLLOW_8); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getPrologAccess().getFavmKeyword_0_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            kw=(Token)match(input,20,FollowSets000.FOLLOW_9); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getPrologAccess().getLessThanSignKeyword_1());
+              		
+            }
+            // InternalSEW.g:287:3: (kw= 'workflow' | kw= 'sew' )
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==14) ) {
+                alt9=1;
+            }
+            else if ( (LA9_0==21) ) {
+                alt9=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 9, 0, input);
+
+                throw nvae;
+            }
+            switch (alt9) {
+                case 1 :
+                    // InternalSEW.g:288:4: kw= 'workflow'
+                    {
+                    kw=(Token)match(input,14,FollowSets000.FOLLOW_10); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getPrologAccess().getWorkflowKeyword_2_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:294:4: kw= 'sew'
+                    {
+                    kw=(Token)match(input,21,FollowSets000.FOLLOW_10); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getPrologAccess().getSewKeyword_2_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalSEW.g:300:3: (kw= ',' this_EDouble_6= ruleEDouble )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0==22) ) {
+                int LA10_1 = input.LA(2);
+
+                if ( (LA10_1==RULE_INT||LA10_1==25||LA10_1==51) ) {
+                    alt10=1;
+                }
+            }
+            switch (alt10) {
+                case 1 :
+                    // InternalSEW.g:301:4: kw= ',' this_EDouble_6= ruleEDouble
+                    {
+                    kw=(Token)match(input,22,FollowSets000.FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getPrologAccess().getCommaKeyword_3_0());
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getPrologAccess().getEDoubleParserRuleCall_3_1());
+                      			
+                    }
+                    pushFollow(FollowSets000.FOLLOW_10);
+                    this_EDouble_6=ruleEDouble();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(this_EDouble_6);
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalSEW.g:317:3: ( (kw= ',' this_UFI_8= ruleUFI ) | this_EString_9= ruleEString )?
+            int alt11=3;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0==22) ) {
+                alt11=1;
+            }
+            else if ( (LA11_0==RULE_STRING) ) {
+                alt11=2;
+            }
+            switch (alt11) {
+                case 1 :
+                    // InternalSEW.g:318:4: (kw= ',' this_UFI_8= ruleUFI )
+                    {
+                    // InternalSEW.g:318:4: (kw= ',' this_UFI_8= ruleUFI )
+                    // InternalSEW.g:319:5: kw= ',' this_UFI_8= ruleUFI
+                    {
+                    kw=(Token)match(input,22,FollowSets000.FOLLOW_12); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					current.merge(kw);
+                      					newLeafNode(kw, grammarAccess.getPrologAccess().getCommaKeyword_4_0_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPrologAccess().getUFIParserRuleCall_4_0_1());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_13);
+                    this_UFI_8=ruleUFI();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					current.merge(this_UFI_8);
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:336:4: this_EString_9= ruleEString
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getPrologAccess().getEStringParserRuleCall_4_1());
+                      			
+                    }
+                    pushFollow(FollowSets000.FOLLOW_13);
+                    this_EString_9=ruleEString();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(this_EString_9);
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            kw=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getPrologAccess().getGreaterThanSignColonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProlog"
+
+
+    // $ANTLR start "entryRuleReservedWord"
+    // InternalSEW.g:356:1: entryRuleReservedWord returns [String current=null] : iv_ruleReservedWord= ruleReservedWord EOF ;
+    public final String entryRuleReservedWord() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleReservedWord = null;
+
+
+        try {
+            // InternalSEW.g:356:52: (iv_ruleReservedWord= ruleReservedWord EOF )
+            // InternalSEW.g:357:2: iv_ruleReservedWord= ruleReservedWord EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getReservedWordRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleReservedWord=ruleReservedWord();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleReservedWord.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleReservedWord"
+
+
+    // $ANTLR start "ruleReservedWord"
+    // InternalSEW.g:363:1: ruleReservedWord returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'workflow' | kw= 'sew' | this_DeprecatedReservedWord_2= ruleDeprecatedReservedWord ) ;
+    public final AntlrDatatypeRuleToken ruleReservedWord() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_DeprecatedReservedWord_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:369:2: ( (kw= 'workflow' | kw= 'sew' | this_DeprecatedReservedWord_2= ruleDeprecatedReservedWord ) )
+            // InternalSEW.g:370:2: (kw= 'workflow' | kw= 'sew' | this_DeprecatedReservedWord_2= ruleDeprecatedReservedWord )
+            {
+            // InternalSEW.g:370:2: (kw= 'workflow' | kw= 'sew' | this_DeprecatedReservedWord_2= ruleDeprecatedReservedWord )
+            int alt12=3;
+            switch ( input.LA(1) ) {
+            case 14:
+                {
+                alt12=1;
+                }
+                break;
+            case 21:
+                {
+                alt12=2;
+                }
+                break;
+            case 69:
+            case 70:
+            case 71:
+            case 72:
+            case 73:
+            case 74:
+                {
+                alt12=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 12, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt12) {
+                case 1 :
+                    // InternalSEW.g:371:3: kw= 'workflow'
+                    {
+                    kw=(Token)match(input,14,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getReservedWordAccess().getWorkflowKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:377:3: kw= 'sew'
+                    {
+                    kw=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getReservedWordAccess().getSewKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:383:3: this_DeprecatedReservedWord_2= ruleDeprecatedReservedWord
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getReservedWordAccess().getDeprecatedReservedWordParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_DeprecatedReservedWord_2=ruleDeprecatedReservedWord();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(this_DeprecatedReservedWord_2);
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleReservedWord"
+
+
+    // $ANTLR start "entryRuleXID"
+    // InternalSEW.g:397:1: entryRuleXID returns [String current=null] : iv_ruleXID= ruleXID EOF ;
+    public final String entryRuleXID() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleXID = null;
+
+
+        try {
+            // InternalSEW.g:397:43: (iv_ruleXID= ruleXID EOF )
+            // InternalSEW.g:398:2: iv_ruleXID= ruleXID EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXIDRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleXID=ruleXID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXID.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXID"
+
+
+    // $ANTLR start "ruleXID"
+    // InternalSEW.g:404:1: ruleXID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ReservedWord_0= ruleReservedWord | this_XIDENDIFIER_1= RULE_XIDENDIFIER ) ;
+    public final AntlrDatatypeRuleToken ruleXID() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_XIDENDIFIER_1=null;
+        AntlrDatatypeRuleToken this_ReservedWord_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:410:2: ( (this_ReservedWord_0= ruleReservedWord | this_XIDENDIFIER_1= RULE_XIDENDIFIER ) )
+            // InternalSEW.g:411:2: (this_ReservedWord_0= ruleReservedWord | this_XIDENDIFIER_1= RULE_XIDENDIFIER )
+            {
+            // InternalSEW.g:411:2: (this_ReservedWord_0= ruleReservedWord | this_XIDENDIFIER_1= RULE_XIDENDIFIER )
+            int alt13=2;
+            int LA13_0 = input.LA(1);
+
+            if ( (LA13_0==14||LA13_0==21||(LA13_0>=69 && LA13_0<=74)) ) {
+                alt13=1;
+            }
+            else if ( (LA13_0==RULE_XIDENDIFIER) ) {
+                alt13=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 13, 0, input);
+
+                throw nvae;
+            }
+            switch (alt13) {
+                case 1 :
+                    // InternalSEW.g:412:3: this_ReservedWord_0= ruleReservedWord
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXIDAccess().getReservedWordParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ReservedWord_0=ruleReservedWord();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(this_ReservedWord_0);
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:423:3: this_XIDENDIFIER_1= RULE_XIDENDIFIER
+                    {
+                    this_XIDENDIFIER_1=(Token)match(input,RULE_XIDENDIFIER,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(this_XIDENDIFIER_1);
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newLeafNode(this_XIDENDIFIER_1, grammarAccess.getXIDAccess().getXIDENDIFIERTerminalRuleCall_1());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXID"
+
+
+    // $ANTLR start "entryRuleUFI"
+    // InternalSEW.g:434:1: entryRuleUFI returns [String current=null] : iv_ruleUFI= ruleUFI EOF ;
+    public final String entryRuleUFI() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleUFI = null;
+
+
+        try {
+            // InternalSEW.g:434:43: (iv_ruleUFI= ruleUFI EOF )
+            // InternalSEW.g:435:2: iv_ruleUFI= ruleUFI EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUFIRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleUFI=ruleUFI();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUFI.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUFI"
+
+
+    // $ANTLR start "ruleUFI"
+    // InternalSEW.g:441:1: ruleUFI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_XID_0= ruleXID ( (kw= '::' | kw= '.' ) this_XID_3= ruleXID )* ) ;
+    public final AntlrDatatypeRuleToken ruleUFI() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_XID_0 = null;
+
+        AntlrDatatypeRuleToken this_XID_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:447:2: ( (this_XID_0= ruleXID ( (kw= '::' | kw= '.' ) this_XID_3= ruleXID )* ) )
+            // InternalSEW.g:448:2: (this_XID_0= ruleXID ( (kw= '::' | kw= '.' ) this_XID_3= ruleXID )* )
+            {
+            // InternalSEW.g:448:2: (this_XID_0= ruleXID ( (kw= '::' | kw= '.' ) this_XID_3= ruleXID )* )
+            // InternalSEW.g:449:3: this_XID_0= ruleXID ( (kw= '::' | kw= '.' ) this_XID_3= ruleXID )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getUFIAccess().getXIDParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_14);
+            this_XID_0=ruleXID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_XID_0);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalSEW.g:459:3: ( (kw= '::' | kw= '.' ) this_XID_3= ruleXID )*
+            loop15:
+            do {
+                int alt15=2;
+                int LA15_0 = input.LA(1);
+
+                if ( (LA15_0==25) ) {
+                    int LA15_2 = input.LA(2);
+
+                    if ( (LA15_2==RULE_XIDENDIFIER||LA15_2==14||LA15_2==21||(LA15_2>=69 && LA15_2<=74)) ) {
+                        alt15=1;
+                    }
+
+
+                }
+                else if ( (LA15_0==24) ) {
+                    alt15=1;
+                }
+
+
+                switch (alt15) {
+            	case 1 :
+            	    // InternalSEW.g:460:4: (kw= '::' | kw= '.' ) this_XID_3= ruleXID
+            	    {
+            	    // InternalSEW.g:460:4: (kw= '::' | kw= '.' )
+            	    int alt14=2;
+            	    int LA14_0 = input.LA(1);
+
+            	    if ( (LA14_0==24) ) {
+            	        alt14=1;
+            	    }
+            	    else if ( (LA14_0==25) ) {
+            	        alt14=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 14, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt14) {
+            	        case 1 :
+            	            // InternalSEW.g:461:5: kw= '::'
+            	            {
+            	            kw=(Token)match(input,24,FollowSets000.FOLLOW_12); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					current.merge(kw);
+            	              					newLeafNode(kw, grammarAccess.getUFIAccess().getColonColonKeyword_1_0_0());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalSEW.g:467:5: kw= '.'
+            	            {
+            	            kw=(Token)match(input,25,FollowSets000.FOLLOW_12); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					current.merge(kw);
+            	              					newLeafNode(kw, grammarAccess.getUFIAccess().getFullStopKeyword_1_0_1());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    if ( state.backtracking==0 ) {
+
+            	      				newCompositeNode(grammarAccess.getUFIAccess().getXIDParserRuleCall_1_1());
+            	      			
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_14);
+            	    this_XID_3=ruleXID();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				current.merge(this_XID_3);
+            	      			
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      				afterParserOrEnumRuleCall();
+            	      			
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop15;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUFI"
+
+
+    // $ANTLR start "entryRuleObject"
+    // InternalSEW.g:488:1: entryRuleObject returns [EObject current=null] : iv_ruleObject= ruleObject EOF ;
+    public final EObject entryRuleObject() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleObject = null;
+
+
+        try {
+            // InternalSEW.g:488:47: (iv_ruleObject= ruleObject EOF )
+            // InternalSEW.g:489:2: iv_ruleObject= ruleObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleObject=ruleObject();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleObject; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleObject"
+
+
+    // $ANTLR start "ruleObject"
+    // InternalSEW.g:495:1: ruleObject returns [EObject current=null] : ( ( () ( (lv_type_1_0= ruleUFI ) ) ( (lv_name_2_0= ruleUFI ) )? ( (lv_description_3_0= ruleEString ) )? otherlv_4= '{' ( ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) ) )* otherlv_6= '}' ) | ( () ( (lv_name_8_0= ruleUFI ) ) (otherlv_9= ':=' | otherlv_10= '+:=' ) ( ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )? )? otherlv_13= '{' ( ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) ) )* otherlv_15= '}' ) ) ;
+    public final EObject ruleObject() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_13=null;
+        Token otherlv_15=null;
+        AntlrDatatypeRuleToken lv_type_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_description_3_0 = null;
+
+        EObject lv_element_5_1 = null;
+
+        EObject lv_element_5_2 = null;
+
+        AntlrDatatypeRuleToken lv_name_8_0 = null;
+
+        AntlrDatatypeRuleToken lv_type_11_0 = null;
+
+        AntlrDatatypeRuleToken lv_description_12_0 = null;
+
+        EObject lv_element_14_1 = null;
+
+        EObject lv_element_14_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:501:2: ( ( ( () ( (lv_type_1_0= ruleUFI ) ) ( (lv_name_2_0= ruleUFI ) )? ( (lv_description_3_0= ruleEString ) )? otherlv_4= '{' ( ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) ) )* otherlv_6= '}' ) | ( () ( (lv_name_8_0= ruleUFI ) ) (otherlv_9= ':=' | otherlv_10= '+:=' ) ( ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )? )? otherlv_13= '{' ( ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) ) )* otherlv_15= '}' ) ) )
+            // InternalSEW.g:502:2: ( ( () ( (lv_type_1_0= ruleUFI ) ) ( (lv_name_2_0= ruleUFI ) )? ( (lv_description_3_0= ruleEString ) )? otherlv_4= '{' ( ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) ) )* otherlv_6= '}' ) | ( () ( (lv_name_8_0= ruleUFI ) ) (otherlv_9= ':=' | otherlv_10= '+:=' ) ( ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )? )? otherlv_13= '{' ( ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) ) )* otherlv_15= '}' ) )
+            {
+            // InternalSEW.g:502:2: ( ( () ( (lv_type_1_0= ruleUFI ) ) ( (lv_name_2_0= ruleUFI ) )? ( (lv_description_3_0= ruleEString ) )? otherlv_4= '{' ( ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) ) )* otherlv_6= '}' ) | ( () ( (lv_name_8_0= ruleUFI ) ) (otherlv_9= ':=' | otherlv_10= '+:=' ) ( ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )? )? otherlv_13= '{' ( ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) ) )* otherlv_15= '}' ) )
+            int alt25=2;
+            alt25 = dfa25.predict(input);
+            switch (alt25) {
+                case 1 :
+                    // InternalSEW.g:503:3: ( () ( (lv_type_1_0= ruleUFI ) ) ( (lv_name_2_0= ruleUFI ) )? ( (lv_description_3_0= ruleEString ) )? otherlv_4= '{' ( ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) ) )* otherlv_6= '}' )
+                    {
+                    // InternalSEW.g:503:3: ( () ( (lv_type_1_0= ruleUFI ) ) ( (lv_name_2_0= ruleUFI ) )? ( (lv_description_3_0= ruleEString ) )? otherlv_4= '{' ( ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) ) )* otherlv_6= '}' )
+                    // InternalSEW.g:504:4: () ( (lv_type_1_0= ruleUFI ) ) ( (lv_name_2_0= ruleUFI ) )? ( (lv_description_3_0= ruleEString ) )? otherlv_4= '{' ( ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) ) )* otherlv_6= '}'
+                    {
+                    // InternalSEW.g:504:4: ()
+                    // InternalSEW.g:505:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getObjectAccess().getWObjectAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:514:4: ( (lv_type_1_0= ruleUFI ) )
+                    // InternalSEW.g:515:5: (lv_type_1_0= ruleUFI )
+                    {
+                    // InternalSEW.g:515:5: (lv_type_1_0= ruleUFI )
+                    // InternalSEW.g:516:6: lv_type_1_0= ruleUFI
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_0_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_4);
+                    lv_type_1_0=ruleUFI();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getObjectRule());
+                      						}
+                      						set(
+                      							current,
+                      							"type",
+                      							lv_type_1_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.UFI");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:533:4: ( (lv_name_2_0= ruleUFI ) )?
+                    int alt16=2;
+                    int LA16_0 = input.LA(1);
+
+                    if ( (LA16_0==RULE_XIDENDIFIER||LA16_0==14||LA16_0==21||(LA16_0>=69 && LA16_0<=74)) ) {
+                        alt16=1;
+                    }
+                    switch (alt16) {
+                        case 1 :
+                            // InternalSEW.g:534:5: (lv_name_2_0= ruleUFI )
+                            {
+                            // InternalSEW.g:534:5: (lv_name_2_0= ruleUFI )
+                            // InternalSEW.g:535:6: lv_name_2_0= ruleUFI
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_0_2_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_5);
+                            lv_name_2_0=ruleUFI();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getObjectRule());
+                              						}
+                              						set(
+                              							current,
+                              							"name",
+                              							lv_name_2_0,
+                              							"org.eclipse.efm.sew.xtext.SEW.UFI");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalSEW.g:552:4: ( (lv_description_3_0= ruleEString ) )?
+                    int alt17=2;
+                    int LA17_0 = input.LA(1);
+
+                    if ( (LA17_0==RULE_STRING) ) {
+                        alt17=1;
+                    }
+                    switch (alt17) {
+                        case 1 :
+                            // InternalSEW.g:553:5: (lv_description_3_0= ruleEString )
+                            {
+                            // InternalSEW.g:553:5: (lv_description_3_0= ruleEString )
+                            // InternalSEW.g:554:6: lv_description_3_0= ruleEString
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_0_3_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_6);
+                            lv_description_3_0=ruleEString();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getObjectRule());
+                              						}
+                              						set(
+                              							current,
+                              							"description",
+                              							lv_description_3_0,
+                              							"org.eclipse.efm.sew.xtext.SEW.EString");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_4=(Token)match(input,16,FollowSets000.FOLLOW_7); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_0_4());
+                      			
+                    }
+                    // InternalSEW.g:575:4: ( ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) ) )*
+                    loop19:
+                    do {
+                        int alt19=2;
+                        int LA19_0 = input.LA(1);
+
+                        if ( (LA19_0==RULE_XIDENDIFIER||LA19_0==14||LA19_0==21||(LA19_0>=69 && LA19_0<=74)) ) {
+                            alt19=1;
+                        }
+
+
+                        switch (alt19) {
+                    	case 1 :
+                    	    // InternalSEW.g:576:5: ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) )
+                    	    {
+                    	    // InternalSEW.g:576:5: ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) )
+                    	    // InternalSEW.g:577:6: (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty )
+                    	    {
+                    	    // InternalSEW.g:577:6: (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty )
+                    	    int alt18=2;
+                    	    alt18 = dfa18.predict(input);
+                    	    switch (alt18) {
+                    	        case 1 :
+                    	            // InternalSEW.g:578:7: lv_element_5_1= ruleObject
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newCompositeNode(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_0_5_0_0());
+                    	              						
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_7);
+                    	            lv_element_5_1=ruleObject();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							if (current==null) {
+                    	              								current = createModelElementForParent(grammarAccess.getObjectRule());
+                    	              							}
+                    	              							add(
+                    	              								current,
+                    	              								"element",
+                    	              								lv_element_5_1,
+                    	              								"org.eclipse.efm.sew.xtext.SEW.Object");
+                    	              							afterParserOrEnumRuleCall();
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalSEW.g:594:7: lv_element_5_2= ruleProperty
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newCompositeNode(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_0_5_0_1());
+                    	              						
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_7);
+                    	            lv_element_5_2=ruleProperty();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							if (current==null) {
+                    	              								current = createModelElementForParent(grammarAccess.getObjectRule());
+                    	              							}
+                    	              							add(
+                    	              								current,
+                    	              								"element",
+                    	              								lv_element_5_2,
+                    	              								"org.eclipse.efm.sew.xtext.SEW.Property");
+                    	              							afterParserOrEnumRuleCall();
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop19;
+                        }
+                    } while (true);
+
+                    otherlv_6=(Token)match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_0_6());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:618:3: ( () ( (lv_name_8_0= ruleUFI ) ) (otherlv_9= ':=' | otherlv_10= '+:=' ) ( ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )? )? otherlv_13= '{' ( ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) ) )* otherlv_15= '}' )
+                    {
+                    // InternalSEW.g:618:3: ( () ( (lv_name_8_0= ruleUFI ) ) (otherlv_9= ':=' | otherlv_10= '+:=' ) ( ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )? )? otherlv_13= '{' ( ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) ) )* otherlv_15= '}' )
+                    // InternalSEW.g:619:4: () ( (lv_name_8_0= ruleUFI ) ) (otherlv_9= ':=' | otherlv_10= '+:=' ) ( ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )? )? otherlv_13= '{' ( ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) ) )* otherlv_15= '}'
+                    {
+                    // InternalSEW.g:619:4: ()
+                    // InternalSEW.g:620:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getObjectAccess().getWObjectAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:629:4: ( (lv_name_8_0= ruleUFI ) )
+                    // InternalSEW.g:630:5: (lv_name_8_0= ruleUFI )
+                    {
+                    // InternalSEW.g:630:5: (lv_name_8_0= ruleUFI )
+                    // InternalSEW.g:631:6: lv_name_8_0= ruleUFI
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getObjectAccess().getNameUFIParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_15);
+                    lv_name_8_0=ruleUFI();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getObjectRule());
+                      						}
+                      						set(
+                      							current,
+                      							"name",
+                      							lv_name_8_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.UFI");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:648:4: (otherlv_9= ':=' | otherlv_10= '+:=' )
+                    int alt20=2;
+                    int LA20_0 = input.LA(1);
+
+                    if ( (LA20_0==26) ) {
+                        alt20=1;
+                    }
+                    else if ( (LA20_0==27) ) {
+                        alt20=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 20, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt20) {
+                        case 1 :
+                            // InternalSEW.g:649:5: otherlv_9= ':='
+                            {
+                            otherlv_9=(Token)match(input,26,FollowSets000.FOLLOW_16); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_9, grammarAccess.getObjectAccess().getColonEqualsSignKeyword_1_2_0());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalSEW.g:654:5: otherlv_10= '+:='
+                            {
+                            otherlv_10=(Token)match(input,27,FollowSets000.FOLLOW_16); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_10, grammarAccess.getObjectAccess().getPlusSignColonEqualsSignKeyword_1_2_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalSEW.g:659:4: ( ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )? )?
+                    int alt22=2;
+                    int LA22_0 = input.LA(1);
+
+                    if ( (LA22_0==RULE_XIDENDIFIER||LA22_0==14||LA22_0==21||(LA22_0>=69 && LA22_0<=74)) ) {
+                        alt22=1;
+                    }
+                    switch (alt22) {
+                        case 1 :
+                            // InternalSEW.g:660:5: ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )?
+                            {
+                            // InternalSEW.g:660:5: ( (lv_type_11_0= ruleUFI ) )
+                            // InternalSEW.g:661:6: (lv_type_11_0= ruleUFI )
+                            {
+                            // InternalSEW.g:661:6: (lv_type_11_0= ruleUFI )
+                            // InternalSEW.g:662:7: lv_type_11_0= ruleUFI
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getObjectAccess().getTypeUFIParserRuleCall_1_3_0_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_5);
+                            lv_type_11_0=ruleUFI();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getObjectRule());
+                              							}
+                              							set(
+                              								current,
+                              								"type",
+                              								lv_type_11_0,
+                              								"org.eclipse.efm.sew.xtext.SEW.UFI");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalSEW.g:679:5: ( (lv_description_12_0= ruleEString ) )?
+                            int alt21=2;
+                            int LA21_0 = input.LA(1);
+
+                            if ( (LA21_0==RULE_STRING) ) {
+                                alt21=1;
+                            }
+                            switch (alt21) {
+                                case 1 :
+                                    // InternalSEW.g:680:6: (lv_description_12_0= ruleEString )
+                                    {
+                                    // InternalSEW.g:680:6: (lv_description_12_0= ruleEString )
+                                    // InternalSEW.g:681:7: lv_description_12_0= ruleEString
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      							newCompositeNode(grammarAccess.getObjectAccess().getDescriptionEStringParserRuleCall_1_3_1_0());
+                                      						
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_6);
+                                    lv_description_12_0=ruleEString();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							if (current==null) {
+                                      								current = createModelElementForParent(grammarAccess.getObjectRule());
+                                      							}
+                                      							set(
+                                      								current,
+                                      								"description",
+                                      								lv_description_12_0,
+                                      								"org.eclipse.efm.sew.xtext.SEW.EString");
+                                      							afterParserOrEnumRuleCall();
+                                      						
+                                    }
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_13=(Token)match(input,16,FollowSets000.FOLLOW_7); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getObjectAccess().getLeftCurlyBracketKeyword_1_4());
+                      			
+                    }
+                    // InternalSEW.g:703:4: ( ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) ) )*
+                    loop24:
+                    do {
+                        int alt24=2;
+                        int LA24_0 = input.LA(1);
+
+                        if ( (LA24_0==RULE_XIDENDIFIER||LA24_0==14||LA24_0==21||(LA24_0>=69 && LA24_0<=74)) ) {
+                            alt24=1;
+                        }
+
+
+                        switch (alt24) {
+                    	case 1 :
+                    	    // InternalSEW.g:704:5: ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) )
+                    	    {
+                    	    // InternalSEW.g:704:5: ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) )
+                    	    // InternalSEW.g:705:6: (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty )
+                    	    {
+                    	    // InternalSEW.g:705:6: (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty )
+                    	    int alt23=2;
+                    	    alt23 = dfa23.predict(input);
+                    	    switch (alt23) {
+                    	        case 1 :
+                    	            // InternalSEW.g:706:7: lv_element_14_1= ruleObject
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newCompositeNode(grammarAccess.getObjectAccess().getElementObjectParserRuleCall_1_5_0_0());
+                    	              						
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_7);
+                    	            lv_element_14_1=ruleObject();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							if (current==null) {
+                    	              								current = createModelElementForParent(grammarAccess.getObjectRule());
+                    	              							}
+                    	              							add(
+                    	              								current,
+                    	              								"element",
+                    	              								lv_element_14_1,
+                    	              								"org.eclipse.efm.sew.xtext.SEW.Object");
+                    	              							afterParserOrEnumRuleCall();
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalSEW.g:722:7: lv_element_14_2= ruleProperty
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newCompositeNode(grammarAccess.getObjectAccess().getElementPropertyParserRuleCall_1_5_0_1());
+                    	              						
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_7);
+                    	            lv_element_14_2=ruleProperty();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							if (current==null) {
+                    	              								current = createModelElementForParent(grammarAccess.getObjectRule());
+                    	              							}
+                    	              							add(
+                    	              								current,
+                    	              								"element",
+                    	              								lv_element_14_2,
+                    	              								"org.eclipse.efm.sew.xtext.SEW.Property");
+                    	              							afterParserOrEnumRuleCall();
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop24;
+                        }
+                    } while (true);
+
+                    otherlv_15=(Token)match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_15, grammarAccess.getObjectAccess().getRightCurlyBracketKeyword_1_6());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleObject"
+
+
+    // $ANTLR start "entryRuleProperty"
+    // InternalSEW.g:749:1: entryRuleProperty returns [EObject current=null] : iv_ruleProperty= ruleProperty EOF ;
+    public final EObject entryRuleProperty() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleProperty = null;
+
+
+        try {
+            // InternalSEW.g:749:49: (iv_ruleProperty= ruleProperty EOF )
+            // InternalSEW.g:750:2: iv_ruleProperty= ruleProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleProperty=ruleProperty();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleProperty; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleProperty"
+
+
+    // $ANTLR start "ruleProperty"
+    // InternalSEW.g:756:1: ruleProperty returns [EObject current=null] : (this_Section_0= ruleSection | this_Attribute_1= ruleAttribute ) ;
+    public final EObject ruleProperty() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_Section_0 = null;
+
+        EObject this_Attribute_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:762:2: ( (this_Section_0= ruleSection | this_Attribute_1= ruleAttribute ) )
+            // InternalSEW.g:763:2: (this_Section_0= ruleSection | this_Attribute_1= ruleAttribute )
+            {
+            // InternalSEW.g:763:2: (this_Section_0= ruleSection | this_Attribute_1= ruleAttribute )
+            int alt26=2;
+            alt26 = dfa26.predict(input);
+            switch (alt26) {
+                case 1 :
+                    // InternalSEW.g:764:3: this_Section_0= ruleSection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPropertyAccess().getSectionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_Section_0=ruleSection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_Section_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:776:3: this_Attribute_1= ruleAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPropertyAccess().getAttributeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_Attribute_1=ruleAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_Attribute_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProperty"
+
+
+    // $ANTLR start "entryRuleSection"
+    // InternalSEW.g:791:1: entryRuleSection returns [EObject current=null] : iv_ruleSection= ruleSection EOF ;
+    public final EObject entryRuleSection() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSection = null;
+
+
+        try {
+            // InternalSEW.g:791:48: (iv_ruleSection= ruleSection EOF )
+            // InternalSEW.g:792:2: iv_ruleSection= ruleSection EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSectionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSection=ruleSection();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSection; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSection"
+
+
+    // $ANTLR start "ruleSection"
+    // InternalSEW.g:798:1: ruleSection returns [EObject current=null] : ( ( (lv_name_0_0= ruleXID ) ) ( (lv_description_1_0= ruleEString ) )? ( (otherlv_2= '[' ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )* otherlv_4= ']' ) | (otherlv_5= ':' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )* ) ) ) ;
+    public final EObject ruleSection() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        AntlrDatatypeRuleToken lv_name_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_description_1_0 = null;
+
+        EObject lv_element_3_1 = null;
+
+        EObject lv_element_3_2 = null;
+
+        EObject lv_element_6_1 = null;
+
+        EObject lv_element_6_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:804:2: ( ( ( (lv_name_0_0= ruleXID ) ) ( (lv_description_1_0= ruleEString ) )? ( (otherlv_2= '[' ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )* otherlv_4= ']' ) | (otherlv_5= ':' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )* ) ) ) )
+            // InternalSEW.g:805:2: ( ( (lv_name_0_0= ruleXID ) ) ( (lv_description_1_0= ruleEString ) )? ( (otherlv_2= '[' ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )* otherlv_4= ']' ) | (otherlv_5= ':' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )* ) ) )
+            {
+            // InternalSEW.g:805:2: ( ( (lv_name_0_0= ruleXID ) ) ( (lv_description_1_0= ruleEString ) )? ( (otherlv_2= '[' ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )* otherlv_4= ']' ) | (otherlv_5= ':' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )* ) ) )
+            // InternalSEW.g:806:3: ( (lv_name_0_0= ruleXID ) ) ( (lv_description_1_0= ruleEString ) )? ( (otherlv_2= '[' ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )* otherlv_4= ']' ) | (otherlv_5= ':' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )* ) )
+            {
+            // InternalSEW.g:806:3: ( (lv_name_0_0= ruleXID ) )
+            // InternalSEW.g:807:4: (lv_name_0_0= ruleXID )
+            {
+            // InternalSEW.g:807:4: (lv_name_0_0= ruleXID )
+            // InternalSEW.g:808:5: lv_name_0_0= ruleXID
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSectionAccess().getNameXIDParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_17);
+            lv_name_0_0=ruleXID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSectionRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_0_0,
+              						"org.eclipse.efm.sew.xtext.SEW.XID");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalSEW.g:825:3: ( (lv_description_1_0= ruleEString ) )?
+            int alt27=2;
+            int LA27_0 = input.LA(1);
+
+            if ( (LA27_0==RULE_STRING) ) {
+                alt27=1;
+            }
+            switch (alt27) {
+                case 1 :
+                    // InternalSEW.g:826:4: (lv_description_1_0= ruleEString )
+                    {
+                    // InternalSEW.g:826:4: (lv_description_1_0= ruleEString )
+                    // InternalSEW.g:827:5: lv_description_1_0= ruleEString
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSectionAccess().getDescriptionEStringParserRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_18);
+                    lv_description_1_0=ruleEString();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSectionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"description",
+                      						lv_description_1_0,
+                      						"org.eclipse.efm.sew.xtext.SEW.EString");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalSEW.g:844:3: ( (otherlv_2= '[' ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )* otherlv_4= ']' ) | (otherlv_5= ':' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )* ) )
+            int alt32=2;
+            int LA32_0 = input.LA(1);
+
+            if ( (LA32_0==28) ) {
+                alt32=1;
+            }
+            else if ( (LA32_0==30) ) {
+                alt32=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 32, 0, input);
+
+                throw nvae;
+            }
+            switch (alt32) {
+                case 1 :
+                    // InternalSEW.g:845:4: (otherlv_2= '[' ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )* otherlv_4= ']' )
+                    {
+                    // InternalSEW.g:845:4: (otherlv_2= '[' ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )* otherlv_4= ']' )
+                    // InternalSEW.g:846:5: otherlv_2= '[' ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )* otherlv_4= ']'
+                    {
+                    otherlv_2=(Token)match(input,28,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_2, grammarAccess.getSectionAccess().getLeftSquareBracketKeyword_2_0_0());
+                      				
+                    }
+                    // InternalSEW.g:850:5: ( ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) ) )*
+                    loop29:
+                    do {
+                        int alt29=2;
+                        int LA29_0 = input.LA(1);
+
+                        if ( (LA29_0==RULE_XIDENDIFIER||LA29_0==14||LA29_0==21||(LA29_0>=69 && LA29_0<=74)) ) {
+                            alt29=1;
+                        }
+
+
+                        switch (alt29) {
+                    	case 1 :
+                    	    // InternalSEW.g:851:6: ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) )
+                    	    {
+                    	    // InternalSEW.g:851:6: ( (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute ) )
+                    	    // InternalSEW.g:852:7: (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute )
+                    	    {
+                    	    // InternalSEW.g:852:7: (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute )
+                    	    int alt28=2;
+                    	    alt28 = dfa28.predict(input);
+                    	    switch (alt28) {
+                    	        case 1 :
+                    	            // InternalSEW.g:853:8: lv_element_3_1= ruleObject
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_0_1_0_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_19);
+                    	            lv_element_3_1=ruleObject();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getSectionRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"element",
+                    	              									lv_element_3_1,
+                    	              									"org.eclipse.efm.sew.xtext.SEW.Object");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalSEW.g:869:8: lv_element_3_2= ruleAttribute
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_0_1_0_1());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_19);
+                    	            lv_element_3_2=ruleAttribute();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getSectionRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"element",
+                    	              									lv_element_3_2,
+                    	              									"org.eclipse.efm.sew.xtext.SEW.Attribute");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop29;
+                        }
+                    } while (true);
+
+                    otherlv_4=(Token)match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getSectionAccess().getRightSquareBracketKeyword_2_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:893:4: (otherlv_5= ':' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )* )
+                    {
+                    // InternalSEW.g:893:4: (otherlv_5= ':' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )* )
+                    // InternalSEW.g:894:5: otherlv_5= ':' ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )*
+                    {
+                    otherlv_5=(Token)match(input,30,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_5, grammarAccess.getSectionAccess().getColonKeyword_2_1_0());
+                      				
+                    }
+                    // InternalSEW.g:898:5: ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )*
+                    loop31:
+                    do {
+                        int alt31=2;
+                        alt31 = dfa31.predict(input);
+                        switch (alt31) {
+                    	case 1 :
+                    	    // InternalSEW.g:899:6: ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) )
+                    	    {
+                    	    // InternalSEW.g:899:6: ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) )
+                    	    // InternalSEW.g:900:7: (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute )
+                    	    {
+                    	    // InternalSEW.g:900:7: (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute )
+                    	    int alt30=2;
+                    	    alt30 = dfa30.predict(input);
+                    	    switch (alt30) {
+                    	        case 1 :
+                    	            // InternalSEW.g:901:8: lv_element_6_1= ruleObject
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getSectionAccess().getElementObjectParserRuleCall_2_1_1_0_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_20);
+                    	            lv_element_6_1=ruleObject();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getSectionRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"element",
+                    	              									lv_element_6_1,
+                    	              									"org.eclipse.efm.sew.xtext.SEW.Object");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalSEW.g:917:8: lv_element_6_2= ruleAttribute
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_1_1_0_1());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_20);
+                    	            lv_element_6_2=ruleAttribute();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getSectionRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"element",
+                    	              									lv_element_6_2,
+                    	              									"org.eclipse.efm.sew.xtext.SEW.Attribute");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop31;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSection"
+
+
+    // $ANTLR start "entryRuleAttribute"
+    // InternalSEW.g:941:1: entryRuleAttribute returns [EObject current=null] : iv_ruleAttribute= ruleAttribute EOF ;
+    public final EObject entryRuleAttribute() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleAttribute = null;
+
+
+        try {
+            // InternalSEW.g:941:50: (iv_ruleAttribute= ruleAttribute EOF )
+            // InternalSEW.g:942:2: iv_ruleAttribute= ruleAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getAttributeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleAttribute=ruleAttribute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleAttribute; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleAttribute"
+
+
+    // $ANTLR start "ruleAttribute"
+    // InternalSEW.g:948:1: ruleAttribute returns [EObject current=null] : ( () ( (lv_name_1_0= ruleXID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )? ) ;
+    public final EObject ruleAttribute() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        EObject lv_value_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:954:2: ( ( () ( (lv_name_1_0= ruleXID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )? ) )
+            // InternalSEW.g:955:2: ( () ( (lv_name_1_0= ruleXID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )? )
+            {
+            // InternalSEW.g:955:2: ( () ( (lv_name_1_0= ruleXID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )? )
+            // InternalSEW.g:956:3: () ( (lv_name_1_0= ruleXID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )?
+            {
+            // InternalSEW.g:956:3: ()
+            // InternalSEW.g:957:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getAttributeAccess().getWAttributeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:966:3: ( (lv_name_1_0= ruleXID ) )
+            // InternalSEW.g:967:4: (lv_name_1_0= ruleXID )
+            {
+            // InternalSEW.g:967:4: (lv_name_1_0= ruleXID )
+            // InternalSEW.g:968:5: lv_name_1_0= ruleXID
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getAttributeAccess().getNameXIDParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_21);
+            lv_name_1_0=ruleXID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getAttributeRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.sew.xtext.SEW.XID");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,31,FollowSets000.FOLLOW_22); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getAttributeAccess().getEqualsSignKeyword_2());
+              		
+            }
+            // InternalSEW.g:989:3: ( (lv_value_3_0= ruleValueSpecification ) )
+            // InternalSEW.g:990:4: (lv_value_3_0= ruleValueSpecification )
+            {
+            // InternalSEW.g:990:4: (lv_value_3_0= ruleValueSpecification )
+            // InternalSEW.g:991:5: lv_value_3_0= ruleValueSpecification
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getAttributeAccess().getValueValueSpecificationParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_23);
+            lv_value_3_0=ruleValueSpecification();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getAttributeRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_3_0,
+              						"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalSEW.g:1008:3: (otherlv_4= ';' )?
+            int alt33=2;
+            int LA33_0 = input.LA(1);
+
+            if ( (LA33_0==32) ) {
+                alt33=1;
+            }
+            switch (alt33) {
+                case 1 :
+                    // InternalSEW.g:1009:4: otherlv_4= ';'
+                    {
+                    otherlv_4=(Token)match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getAttributeAccess().getSemicolonKeyword_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleAttribute"
+
+
+    // $ANTLR start "entryRuleValueSpecification"
+    // InternalSEW.g:1018:1: entryRuleValueSpecification returns [EObject current=null] : iv_ruleValueSpecification= ruleValueSpecification EOF ;
+    public final EObject entryRuleValueSpecification() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleValueSpecification = null;
+
+
+        try {
+            // InternalSEW.g:1018:59: (iv_ruleValueSpecification= ruleValueSpecification EOF )
+            // InternalSEW.g:1019:2: iv_ruleValueSpecification= ruleValueSpecification EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getValueSpecificationRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleValueSpecification=ruleValueSpecification();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleValueSpecification; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleValueSpecification"
+
+
+    // $ANTLR start "ruleValueSpecification"
+    // InternalSEW.g:1025:1: ruleValueSpecification returns [EObject current=null] : this_Expression_0= ruleExpression ;
+    public final EObject ruleValueSpecification() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_Expression_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:1031:2: (this_Expression_0= ruleExpression )
+            // InternalSEW.g:1032:2: this_Expression_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              		/* */
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newCompositeNode(grammarAccess.getValueSpecificationAccess().getExpressionParserRuleCall());
+              	
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            this_Expression_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current = this_Expression_0;
+              		afterParserOrEnumRuleCall();
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleValueSpecification"
+
+
+    // $ANTLR start "entryRuleExpression"
+    // InternalSEW.g:1046:1: entryRuleExpression returns [EObject current=null] : iv_ruleExpression= ruleExpression EOF ;
+    public final EObject entryRuleExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleExpression = null;
+
+
+        try {
+            // InternalSEW.g:1046:51: (iv_ruleExpression= ruleExpression EOF )
+            // InternalSEW.g:1047:2: iv_ruleExpression= ruleExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleExpression=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleExpression"
+
+
+    // $ANTLR start "ruleExpression"
+    // InternalSEW.g:1053:1: ruleExpression returns [EObject current=null] : (this_conditionalExpression_0= ruleconditionalExpression | this_DeprecatedExpression_1= ruleDeprecatedExpression ) ;
+    public final EObject ruleExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_conditionalExpression_0 = null;
+
+        EObject this_DeprecatedExpression_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:1059:2: ( (this_conditionalExpression_0= ruleconditionalExpression | this_DeprecatedExpression_1= ruleDeprecatedExpression ) )
+            // InternalSEW.g:1060:2: (this_conditionalExpression_0= ruleconditionalExpression | this_DeprecatedExpression_1= ruleDeprecatedExpression )
+            {
+            // InternalSEW.g:1060:2: (this_conditionalExpression_0= ruleconditionalExpression | this_DeprecatedExpression_1= ruleDeprecatedExpression )
+            int alt34=2;
+            int LA34_0 = input.LA(1);
+
+            if ( ((LA34_0>=RULE_XIDENDIFIER && LA34_0<=RULE_STRING)||LA34_0==14||LA34_0==21||LA34_0==25||LA34_0==28||LA34_0==46||(LA34_0>=51 && LA34_0<=54)||(LA34_0>=56 && LA34_0<=74)) ) {
+                alt34=1;
+            }
+            else if ( (LA34_0==77) ) {
+                alt34=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 34, 0, input);
+
+                throw nvae;
+            }
+            switch (alt34) {
+                case 1 :
+                    // InternalSEW.g:1061:3: this_conditionalExpression_0= ruleconditionalExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getExpressionAccess().getConditionalExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_conditionalExpression_0=ruleconditionalExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_conditionalExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1073:3: this_DeprecatedExpression_1= ruleDeprecatedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getExpressionAccess().getDeprecatedExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_DeprecatedExpression_1=ruleDeprecatedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DeprecatedExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleExpression"
+
+
+    // $ANTLR start "entryRuleconditionalExpression"
+    // InternalSEW.g:1088:1: entryRuleconditionalExpression returns [EObject current=null] : iv_ruleconditionalExpression= ruleconditionalExpression EOF ;
+    public final EObject entryRuleconditionalExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleconditionalExpression = null;
+
+
+        try {
+            // InternalSEW.g:1088:62: (iv_ruleconditionalExpression= ruleconditionalExpression EOF )
+            // InternalSEW.g:1089:2: iv_ruleconditionalExpression= ruleconditionalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getConditionalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleconditionalExpression=ruleconditionalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleconditionalExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleconditionalExpression"
+
+
+    // $ANTLR start "ruleconditionalExpression"
+    // InternalSEW.g:1095:1: ruleconditionalExpression returns [EObject current=null] : (this_conditionalOrExpression_0= ruleconditionalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_operand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_operand_5_0= ruleExpression ) ) )? ) ;
+    public final EObject ruleconditionalExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        EObject this_conditionalOrExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:1101:2: ( (this_conditionalOrExpression_0= ruleconditionalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_operand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_operand_5_0= ruleExpression ) ) )? ) )
+            // InternalSEW.g:1102:2: (this_conditionalOrExpression_0= ruleconditionalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_operand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_operand_5_0= ruleExpression ) ) )? )
+            {
+            // InternalSEW.g:1102:2: (this_conditionalOrExpression_0= ruleconditionalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_operand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_operand_5_0= ruleExpression ) ) )? )
+            // InternalSEW.g:1103:3: this_conditionalOrExpression_0= ruleconditionalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_operand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_operand_5_0= ruleExpression ) ) )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getConditionalExpressionAccess().getConditionalOrExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_24);
+            this_conditionalOrExpression_0=ruleconditionalOrExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_conditionalOrExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalSEW.g:1114:3: ( () ( (lv_operator_2_0= '?' ) ) ( (lv_operand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_operand_5_0= ruleExpression ) ) )?
+            int alt35=2;
+            int LA35_0 = input.LA(1);
+
+            if ( (LA35_0==33) ) {
+                alt35=1;
+            }
+            switch (alt35) {
+                case 1 :
+                    // InternalSEW.g:1115:4: () ( (lv_operator_2_0= '?' ) ) ( (lv_operand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_operand_5_0= ruleExpression ) )
+                    {
+                    // InternalSEW.g:1115:4: ()
+                    // InternalSEW.g:1116:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getConditionalExpressionAccess().getExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:1125:4: ( (lv_operator_2_0= '?' ) )
+                    // InternalSEW.g:1126:5: (lv_operator_2_0= '?' )
+                    {
+                    // InternalSEW.g:1126:5: (lv_operator_2_0= '?' )
+                    // InternalSEW.g:1127:6: lv_operator_2_0= '?'
+                    {
+                    lv_operator_2_0=(Token)match(input,33,FollowSets000.FOLLOW_22); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_2_0, grammarAccess.getConditionalExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getConditionalExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_2_0, "?");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1139:4: ( (lv_operand_3_0= ruleExpression ) )
+                    // InternalSEW.g:1140:5: (lv_operand_3_0= ruleExpression )
+                    {
+                    // InternalSEW.g:1140:5: (lv_operand_3_0= ruleExpression )
+                    // InternalSEW.g:1141:6: lv_operand_3_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_25);
+                    lv_operand_3_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getConditionalExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,30,FollowSets000.FOLLOW_22); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getConditionalExpressionAccess().getColonKeyword_1_3());
+                      			
+                    }
+                    // InternalSEW.g:1162:4: ( (lv_operand_5_0= ruleExpression ) )
+                    // InternalSEW.g:1163:5: (lv_operand_5_0= ruleExpression )
+                    {
+                    // InternalSEW.g:1163:5: (lv_operand_5_0= ruleExpression )
+                    // InternalSEW.g:1164:6: lv_operand_5_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getConditionalExpressionAccess().getOperandExpressionParserRuleCall_1_4_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_operand_5_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getConditionalExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_5_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleconditionalExpression"
+
+
+    // $ANTLR start "entryRuleconditionalOrExpression"
+    // InternalSEW.g:1186:1: entryRuleconditionalOrExpression returns [EObject current=null] : iv_ruleconditionalOrExpression= ruleconditionalOrExpression EOF ;
+    public final EObject entryRuleconditionalOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleconditionalOrExpression = null;
+
+
+        try {
+            // InternalSEW.g:1186:64: (iv_ruleconditionalOrExpression= ruleconditionalOrExpression EOF )
+            // InternalSEW.g:1187:2: iv_ruleconditionalOrExpression= ruleconditionalOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getConditionalOrExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleconditionalOrExpression=ruleconditionalOrExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleconditionalOrExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleconditionalOrExpression"
+
+
+    // $ANTLR start "ruleconditionalOrExpression"
+    // InternalSEW.g:1193:1: ruleconditionalOrExpression returns [EObject current=null] : (this_conditionalAndExpression_0= ruleconditionalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleconditionalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleconditionalAndExpression ) ) )* )? ) ;
+    public final EObject ruleconditionalOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_1=null;
+        Token lv_operator_2_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        EObject this_conditionalAndExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:1199:2: ( (this_conditionalAndExpression_0= ruleconditionalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleconditionalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleconditionalAndExpression ) ) )* )? ) )
+            // InternalSEW.g:1200:2: (this_conditionalAndExpression_0= ruleconditionalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleconditionalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleconditionalAndExpression ) ) )* )? )
+            {
+            // InternalSEW.g:1200:2: (this_conditionalAndExpression_0= ruleconditionalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleconditionalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleconditionalAndExpression ) ) )* )? )
+            // InternalSEW.g:1201:3: this_conditionalAndExpression_0= ruleconditionalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleconditionalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleconditionalAndExpression ) ) )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getConditionalOrExpressionAccess().getConditionalAndExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_26);
+            this_conditionalAndExpression_0=ruleconditionalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_conditionalAndExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalSEW.g:1212:3: ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleconditionalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleconditionalAndExpression ) ) )* )?
+            int alt39=2;
+            int LA39_0 = input.LA(1);
+
+            if ( ((LA39_0>=34 && LA39_0<=35)) ) {
+                alt39=1;
+            }
+            switch (alt39) {
+                case 1 :
+                    // InternalSEW.g:1213:4: () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleconditionalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleconditionalAndExpression ) ) )*
+                    {
+                    // InternalSEW.g:1213:4: ()
+                    // InternalSEW.g:1214:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getConditionalOrExpressionAccess().getExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:1223:4: ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) )
+                    // InternalSEW.g:1224:5: ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) )
+                    {
+                    // InternalSEW.g:1224:5: ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) )
+                    // InternalSEW.g:1225:6: (lv_operator_2_1= '||' | lv_operator_2_2= 'or' )
+                    {
+                    // InternalSEW.g:1225:6: (lv_operator_2_1= '||' | lv_operator_2_2= 'or' )
+                    int alt36=2;
+                    int LA36_0 = input.LA(1);
+
+                    if ( (LA36_0==34) ) {
+                        alt36=1;
+                    }
+                    else if ( (LA36_0==35) ) {
+                        alt36=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 36, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt36) {
+                        case 1 :
+                            // InternalSEW.g:1226:7: lv_operator_2_1= '||'
+                            {
+                            lv_operator_2_1=(Token)match(input,34,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_1, grammarAccess.getConditionalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getConditionalOrExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_1, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalSEW.g:1237:7: lv_operator_2_2= 'or'
+                            {
+                            lv_operator_2_2=(Token)match(input,35,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_2, grammarAccess.getConditionalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getConditionalOrExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_2, null);
+                              						
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1250:4: ( (lv_operand_3_0= ruleconditionalAndExpression ) )
+                    // InternalSEW.g:1251:5: (lv_operand_3_0= ruleconditionalAndExpression )
+                    {
+                    // InternalSEW.g:1251:5: (lv_operand_3_0= ruleconditionalAndExpression )
+                    // InternalSEW.g:1252:6: lv_operand_3_0= ruleconditionalAndExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_26);
+                    lv_operand_3_0=ruleconditionalAndExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getConditionalOrExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.conditionalAndExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1269:4: ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleconditionalAndExpression ) ) )*
+                    loop38:
+                    do {
+                        int alt38=2;
+                        int LA38_0 = input.LA(1);
+
+                        if ( ((LA38_0>=34 && LA38_0<=35)) ) {
+                            alt38=1;
+                        }
+
+
+                        switch (alt38) {
+                    	case 1 :
+                    	    // InternalSEW.g:1270:5: (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleconditionalAndExpression ) )
+                    	    {
+                    	    // InternalSEW.g:1270:5: (otherlv_4= '||' | otherlv_5= 'or' )
+                    	    int alt37=2;
+                    	    int LA37_0 = input.LA(1);
+
+                    	    if ( (LA37_0==34) ) {
+                    	        alt37=1;
+                    	    }
+                    	    else if ( (LA37_0==35) ) {
+                    	        alt37=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 37, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt37) {
+                    	        case 1 :
+                    	            // InternalSEW.g:1271:6: otherlv_4= '||'
+                    	            {
+                    	            otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_4, grammarAccess.getConditionalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalSEW.g:1276:6: otherlv_5= 'or'
+                    	            {
+                    	            otherlv_5=(Token)match(input,35,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_5, grammarAccess.getConditionalOrExpressionAccess().getOrKeyword_1_3_0_1());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    // InternalSEW.g:1281:5: ( (lv_operand_6_0= ruleconditionalAndExpression ) )
+                    	    // InternalSEW.g:1282:6: (lv_operand_6_0= ruleconditionalAndExpression )
+                    	    {
+                    	    // InternalSEW.g:1282:6: (lv_operand_6_0= ruleconditionalAndExpression )
+                    	    // InternalSEW.g:1283:7: lv_operand_6_0= ruleconditionalAndExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getConditionalOrExpressionAccess().getOperandConditionalAndExpressionParserRuleCall_1_3_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_26);
+                    	    lv_operand_6_0=ruleconditionalAndExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getConditionalOrExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"operand",
+                    	      								lv_operand_6_0,
+                    	      								"org.eclipse.efm.sew.xtext.SEW.conditionalAndExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop38;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleconditionalOrExpression"
+
+
+    // $ANTLR start "entryRuleconditionalAndExpression"
+    // InternalSEW.g:1306:1: entryRuleconditionalAndExpression returns [EObject current=null] : iv_ruleconditionalAndExpression= ruleconditionalAndExpression EOF ;
+    public final EObject entryRuleconditionalAndExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleconditionalAndExpression = null;
+
+
+        try {
+            // InternalSEW.g:1306:65: (iv_ruleconditionalAndExpression= ruleconditionalAndExpression EOF )
+            // InternalSEW.g:1307:2: iv_ruleconditionalAndExpression= ruleconditionalAndExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getConditionalAndExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleconditionalAndExpression=ruleconditionalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleconditionalAndExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleconditionalAndExpression"
+
+
+    // $ANTLR start "ruleconditionalAndExpression"
+    // InternalSEW.g:1313:1: ruleconditionalAndExpression returns [EObject current=null] : (this_equalityExpression_0= ruleequalityExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleequalityExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleequalityExpression ) ) )* )? ) ;
+    public final EObject ruleconditionalAndExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_1=null;
+        Token lv_operator_2_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        EObject this_equalityExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:1319:2: ( (this_equalityExpression_0= ruleequalityExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleequalityExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleequalityExpression ) ) )* )? ) )
+            // InternalSEW.g:1320:2: (this_equalityExpression_0= ruleequalityExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleequalityExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleequalityExpression ) ) )* )? )
+            {
+            // InternalSEW.g:1320:2: (this_equalityExpression_0= ruleequalityExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleequalityExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleequalityExpression ) ) )* )? )
+            // InternalSEW.g:1321:3: this_equalityExpression_0= ruleequalityExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleequalityExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleequalityExpression ) ) )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getConditionalAndExpressionAccess().getEqualityExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_28);
+            this_equalityExpression_0=ruleequalityExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_equalityExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalSEW.g:1332:3: ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleequalityExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleequalityExpression ) ) )* )?
+            int alt43=2;
+            int LA43_0 = input.LA(1);
+
+            if ( ((LA43_0>=36 && LA43_0<=37)) ) {
+                alt43=1;
+            }
+            switch (alt43) {
+                case 1 :
+                    // InternalSEW.g:1333:4: () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleequalityExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleequalityExpression ) ) )*
+                    {
+                    // InternalSEW.g:1333:4: ()
+                    // InternalSEW.g:1334:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getConditionalAndExpressionAccess().getExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:1343:4: ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) )
+                    // InternalSEW.g:1344:5: ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) )
+                    {
+                    // InternalSEW.g:1344:5: ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) )
+                    // InternalSEW.g:1345:6: (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' )
+                    {
+                    // InternalSEW.g:1345:6: (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' )
+                    int alt40=2;
+                    int LA40_0 = input.LA(1);
+
+                    if ( (LA40_0==36) ) {
+                        alt40=1;
+                    }
+                    else if ( (LA40_0==37) ) {
+                        alt40=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 40, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt40) {
+                        case 1 :
+                            // InternalSEW.g:1346:7: lv_operator_2_1= '&&'
+                            {
+                            lv_operator_2_1=(Token)match(input,36,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_1, grammarAccess.getConditionalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getConditionalAndExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_1, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalSEW.g:1357:7: lv_operator_2_2= 'and'
+                            {
+                            lv_operator_2_2=(Token)match(input,37,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_2, grammarAccess.getConditionalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getConditionalAndExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_2, null);
+                              						
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1370:4: ( (lv_operand_3_0= ruleequalityExpression ) )
+                    // InternalSEW.g:1371:5: (lv_operand_3_0= ruleequalityExpression )
+                    {
+                    // InternalSEW.g:1371:5: (lv_operand_3_0= ruleequalityExpression )
+                    // InternalSEW.g:1372:6: lv_operand_3_0= ruleequalityExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_28);
+                    lv_operand_3_0=ruleequalityExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getConditionalAndExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.equalityExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1389:4: ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleequalityExpression ) ) )*
+                    loop42:
+                    do {
+                        int alt42=2;
+                        int LA42_0 = input.LA(1);
+
+                        if ( ((LA42_0>=36 && LA42_0<=37)) ) {
+                            alt42=1;
+                        }
+
+
+                        switch (alt42) {
+                    	case 1 :
+                    	    // InternalSEW.g:1390:5: (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleequalityExpression ) )
+                    	    {
+                    	    // InternalSEW.g:1390:5: (otherlv_4= '&&' | otherlv_5= 'and' )
+                    	    int alt41=2;
+                    	    int LA41_0 = input.LA(1);
+
+                    	    if ( (LA41_0==36) ) {
+                    	        alt41=1;
+                    	    }
+                    	    else if ( (LA41_0==37) ) {
+                    	        alt41=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 41, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt41) {
+                    	        case 1 :
+                    	            // InternalSEW.g:1391:6: otherlv_4= '&&'
+                    	            {
+                    	            otherlv_4=(Token)match(input,36,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_4, grammarAccess.getConditionalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalSEW.g:1396:6: otherlv_5= 'and'
+                    	            {
+                    	            otherlv_5=(Token)match(input,37,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_5, grammarAccess.getConditionalAndExpressionAccess().getAndKeyword_1_3_0_1());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    // InternalSEW.g:1401:5: ( (lv_operand_6_0= ruleequalityExpression ) )
+                    	    // InternalSEW.g:1402:6: (lv_operand_6_0= ruleequalityExpression )
+                    	    {
+                    	    // InternalSEW.g:1402:6: (lv_operand_6_0= ruleequalityExpression )
+                    	    // InternalSEW.g:1403:7: lv_operand_6_0= ruleequalityExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getConditionalAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_28);
+                    	    lv_operand_6_0=ruleequalityExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getConditionalAndExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"operand",
+                    	      								lv_operand_6_0,
+                    	      								"org.eclipse.efm.sew.xtext.SEW.equalityExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop42;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleconditionalAndExpression"
+
+
+    // $ANTLR start "entryRuleequalityExpression"
+    // InternalSEW.g:1426:1: entryRuleequalityExpression returns [EObject current=null] : iv_ruleequalityExpression= ruleequalityExpression EOF ;
+    public final EObject entryRuleequalityExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleequalityExpression = null;
+
+
+        try {
+            // InternalSEW.g:1426:59: (iv_ruleequalityExpression= ruleequalityExpression EOF )
+            // InternalSEW.g:1427:2: iv_ruleequalityExpression= ruleequalityExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEqualityExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleequalityExpression=ruleequalityExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleequalityExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleequalityExpression"
+
+
+    // $ANTLR start "ruleequalityExpression"
+    // InternalSEW.g:1433:1: ruleequalityExpression returns [EObject current=null] : (this_relationalExpression_0= rulerelationalExpression ( () ( ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) ) ) ( (lv_operand_3_0= rulerelationalExpression ) ) )? ) ;
+    public final EObject ruleequalityExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_1=null;
+        Token lv_operator_2_2=null;
+        Token lv_operator_2_3=null;
+        Token lv_operator_2_4=null;
+        Token lv_operator_2_5=null;
+        EObject this_relationalExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:1439:2: ( (this_relationalExpression_0= rulerelationalExpression ( () ( ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) ) ) ( (lv_operand_3_0= rulerelationalExpression ) ) )? ) )
+            // InternalSEW.g:1440:2: (this_relationalExpression_0= rulerelationalExpression ( () ( ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) ) ) ( (lv_operand_3_0= rulerelationalExpression ) ) )? )
+            {
+            // InternalSEW.g:1440:2: (this_relationalExpression_0= rulerelationalExpression ( () ( ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) ) ) ( (lv_operand_3_0= rulerelationalExpression ) ) )? )
+            // InternalSEW.g:1441:3: this_relationalExpression_0= rulerelationalExpression ( () ( ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) ) ) ( (lv_operand_3_0= rulerelationalExpression ) ) )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_29);
+            this_relationalExpression_0=rulerelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_relationalExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalSEW.g:1452:3: ( () ( ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) ) ) ( (lv_operand_3_0= rulerelationalExpression ) ) )?
+            int alt45=2;
+            int LA45_0 = input.LA(1);
+
+            if ( ((LA45_0>=38 && LA45_0<=42)) ) {
+                alt45=1;
+            }
+            switch (alt45) {
+                case 1 :
+                    // InternalSEW.g:1453:4: () ( ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) ) ) ( (lv_operand_3_0= rulerelationalExpression ) )
+                    {
+                    // InternalSEW.g:1453:4: ()
+                    // InternalSEW.g:1454:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getEqualityExpressionAccess().getExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:1463:4: ( ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) ) )
+                    // InternalSEW.g:1464:5: ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) )
+                    {
+                    // InternalSEW.g:1464:5: ( (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' ) )
+                    // InternalSEW.g:1465:6: (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' )
+                    {
+                    // InternalSEW.g:1465:6: (lv_operator_2_1= '==' | lv_operator_2_2= '!=' | lv_operator_2_3= '===' | lv_operator_2_4= '=!=' | lv_operator_2_5= '=/=' )
+                    int alt44=5;
+                    switch ( input.LA(1) ) {
+                    case 38:
+                        {
+                        alt44=1;
+                        }
+                        break;
+                    case 39:
+                        {
+                        alt44=2;
+                        }
+                        break;
+                    case 40:
+                        {
+                        alt44=3;
+                        }
+                        break;
+                    case 41:
+                        {
+                        alt44=4;
+                        }
+                        break;
+                    case 42:
+                        {
+                        alt44=5;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 44, 0, input);
+
+                        throw nvae;
+                    }
+
+                    switch (alt44) {
+                        case 1 :
+                            // InternalSEW.g:1466:7: lv_operator_2_1= '=='
+                            {
+                            lv_operator_2_1=(Token)match(input,38,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_1, grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignKeyword_1_1_0_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getEqualityExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_1, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalSEW.g:1477:7: lv_operator_2_2= '!='
+                            {
+                            lv_operator_2_2=(Token)match(input,39,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_2, grammarAccess.getEqualityExpressionAccess().getOperatorExclamationMarkEqualsSignKeyword_1_1_0_1());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getEqualityExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_2, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 3 :
+                            // InternalSEW.g:1488:7: lv_operator_2_3= '==='
+                            {
+                            lv_operator_2_3=(Token)match(input,40,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_3, grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignEqualsSignEqualsSignKeyword_1_1_0_2());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getEqualityExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_3, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 4 :
+                            // InternalSEW.g:1499:7: lv_operator_2_4= '=!='
+                            {
+                            lv_operator_2_4=(Token)match(input,41,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_4, grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignExclamationMarkEqualsSignKeyword_1_1_0_3());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getEqualityExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_4, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 5 :
+                            // InternalSEW.g:1510:7: lv_operator_2_5= '=/='
+                            {
+                            lv_operator_2_5=(Token)match(input,42,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_5, grammarAccess.getEqualityExpressionAccess().getOperatorEqualsSignSolidusEqualsSignKeyword_1_1_0_4());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getEqualityExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_5, null);
+                              						
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1523:4: ( (lv_operand_3_0= rulerelationalExpression ) )
+                    // InternalSEW.g:1524:5: (lv_operand_3_0= rulerelationalExpression )
+                    {
+                    // InternalSEW.g:1524:5: (lv_operand_3_0= rulerelationalExpression )
+                    // InternalSEW.g:1525:6: lv_operand_3_0= rulerelationalExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getEqualityExpressionAccess().getOperandRelationalExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_operand_3_0=rulerelationalExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.relationalExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleequalityExpression"
+
+
+    // $ANTLR start "entryRulerelationalExpression"
+    // InternalSEW.g:1547:1: entryRulerelationalExpression returns [EObject current=null] : iv_rulerelationalExpression= rulerelationalExpression EOF ;
+    public final EObject entryRulerelationalExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulerelationalExpression = null;
+
+
+        try {
+            // InternalSEW.g:1547:61: (iv_rulerelationalExpression= rulerelationalExpression EOF )
+            // InternalSEW.g:1548:2: iv_rulerelationalExpression= rulerelationalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getRelationalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulerelationalExpression=rulerelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulerelationalExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulerelationalExpression"
+
+
+    // $ANTLR start "rulerelationalExpression"
+    // InternalSEW.g:1554:1: rulerelationalExpression returns [EObject current=null] : (this_additiveExpression_0= ruleadditiveExpression ( () ( ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) ) ) ( (lv_operand_3_0= ruleadditiveExpression ) ) )? ) ;
+    public final EObject rulerelationalExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_1=null;
+        Token lv_operator_2_2=null;
+        Token lv_operator_2_3=null;
+        Token lv_operator_2_4=null;
+        EObject this_additiveExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:1560:2: ( (this_additiveExpression_0= ruleadditiveExpression ( () ( ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) ) ) ( (lv_operand_3_0= ruleadditiveExpression ) ) )? ) )
+            // InternalSEW.g:1561:2: (this_additiveExpression_0= ruleadditiveExpression ( () ( ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) ) ) ( (lv_operand_3_0= ruleadditiveExpression ) ) )? )
+            {
+            // InternalSEW.g:1561:2: (this_additiveExpression_0= ruleadditiveExpression ( () ( ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) ) ) ( (lv_operand_3_0= ruleadditiveExpression ) ) )? )
+            // InternalSEW.g:1562:3: this_additiveExpression_0= ruleadditiveExpression ( () ( ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) ) ) ( (lv_operand_3_0= ruleadditiveExpression ) ) )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_30);
+            this_additiveExpression_0=ruleadditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_additiveExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalSEW.g:1573:3: ( () ( ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) ) ) ( (lv_operand_3_0= ruleadditiveExpression ) ) )?
+            int alt47=2;
+            int LA47_0 = input.LA(1);
+
+            if ( (LA47_0==20||(LA47_0>=43 && LA47_0<=45)) ) {
+                alt47=1;
+            }
+            switch (alt47) {
+                case 1 :
+                    // InternalSEW.g:1574:4: () ( ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) ) ) ( (lv_operand_3_0= ruleadditiveExpression ) )
+                    {
+                    // InternalSEW.g:1574:4: ()
+                    // InternalSEW.g:1575:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getRelationalExpressionAccess().getExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:1584:4: ( ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) ) )
+                    // InternalSEW.g:1585:5: ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) )
+                    {
+                    // InternalSEW.g:1585:5: ( (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' ) )
+                    // InternalSEW.g:1586:6: (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' )
+                    {
+                    // InternalSEW.g:1586:6: (lv_operator_2_1= '<' | lv_operator_2_2= '<=' | lv_operator_2_3= '>' | lv_operator_2_4= '>=' )
+                    int alt46=4;
+                    switch ( input.LA(1) ) {
+                    case 20:
+                        {
+                        alt46=1;
+                        }
+                        break;
+                    case 43:
+                        {
+                        alt46=2;
+                        }
+                        break;
+                    case 44:
+                        {
+                        alt46=3;
+                        }
+                        break;
+                    case 45:
+                        {
+                        alt46=4;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 46, 0, input);
+
+                        throw nvae;
+                    }
+
+                    switch (alt46) {
+                        case 1 :
+                            // InternalSEW.g:1587:7: lv_operator_2_1= '<'
+                            {
+                            lv_operator_2_1=(Token)match(input,20,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_1, grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignKeyword_1_1_0_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getRelationalExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_1, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalSEW.g:1598:7: lv_operator_2_2= '<='
+                            {
+                            lv_operator_2_2=(Token)match(input,43,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_2, grammarAccess.getRelationalExpressionAccess().getOperatorLessThanSignEqualsSignKeyword_1_1_0_1());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getRelationalExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_2, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 3 :
+                            // InternalSEW.g:1609:7: lv_operator_2_3= '>'
+                            {
+                            lv_operator_2_3=(Token)match(input,44,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_3, grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignKeyword_1_1_0_2());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getRelationalExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_3, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 4 :
+                            // InternalSEW.g:1620:7: lv_operator_2_4= '>='
+                            {
+                            lv_operator_2_4=(Token)match(input,45,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_4, grammarAccess.getRelationalExpressionAccess().getOperatorGreaterThanSignEqualsSignKeyword_1_1_0_3());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getRelationalExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_4, null);
+                              						
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1633:4: ( (lv_operand_3_0= ruleadditiveExpression ) )
+                    // InternalSEW.g:1634:5: (lv_operand_3_0= ruleadditiveExpression )
+                    {
+                    // InternalSEW.g:1634:5: (lv_operand_3_0= ruleadditiveExpression )
+                    // InternalSEW.g:1635:6: lv_operand_3_0= ruleadditiveExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getOperandAdditiveExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_operand_3_0=ruleadditiveExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.additiveExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulerelationalExpression"
+
+
+    // $ANTLR start "entryRuleadditiveExpression"
+    // InternalSEW.g:1657:1: entryRuleadditiveExpression returns [EObject current=null] : iv_ruleadditiveExpression= ruleadditiveExpression EOF ;
+    public final EObject entryRuleadditiveExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleadditiveExpression = null;
+
+
+        try {
+            // InternalSEW.g:1657:59: (iv_ruleadditiveExpression= ruleadditiveExpression EOF )
+            // InternalSEW.g:1658:2: iv_ruleadditiveExpression= ruleadditiveExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getAdditiveExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleadditiveExpression=ruleadditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleadditiveExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleadditiveExpression"
+
+
+    // $ANTLR start "ruleadditiveExpression"
+    // InternalSEW.g:1664:1: ruleadditiveExpression returns [EObject current=null] : (this_multiplicativeExpression_0= rulemultiplicativeExpression ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )* )? ) ;
+    public final EObject ruleadditiveExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        EObject this_multiplicativeExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:1670:2: ( (this_multiplicativeExpression_0= rulemultiplicativeExpression ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )* )? ) )
+            // InternalSEW.g:1671:2: (this_multiplicativeExpression_0= rulemultiplicativeExpression ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )* )? )
+            {
+            // InternalSEW.g:1671:2: (this_multiplicativeExpression_0= rulemultiplicativeExpression ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )* )? )
+            // InternalSEW.g:1672:3: this_multiplicativeExpression_0= rulemultiplicativeExpression ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_31);
+            this_multiplicativeExpression_0=rulemultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_multiplicativeExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalSEW.g:1683:3: ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )* )?
+            int alt49=2;
+            alt49 = dfa49.predict(input);
+            switch (alt49) {
+                case 1 :
+                    // InternalSEW.g:1684:4: () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )*
+                    {
+                    // InternalSEW.g:1684:4: ()
+                    // InternalSEW.g:1685:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getAdditiveExpressionAccess().getExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:1694:4: ( (lv_operator_2_0= '+' ) )
+                    // InternalSEW.g:1695:5: (lv_operator_2_0= '+' )
+                    {
+                    // InternalSEW.g:1695:5: (lv_operator_2_0= '+' )
+                    // InternalSEW.g:1696:6: lv_operator_2_0= '+'
+                    {
+                    lv_operator_2_0=(Token)match(input,46,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_2_0, grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getAdditiveExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_2_0, "+");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1708:4: ( (lv_operand_3_0= rulemultiplicativeExpression ) )
+                    // InternalSEW.g:1709:5: (lv_operand_3_0= rulemultiplicativeExpression )
+                    {
+                    // InternalSEW.g:1709:5: (lv_operand_3_0= rulemultiplicativeExpression )
+                    // InternalSEW.g:1710:6: lv_operand_3_0= rulemultiplicativeExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_31);
+                    lv_operand_3_0=rulemultiplicativeExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.multiplicativeExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1727:4: (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )*
+                    loop48:
+                    do {
+                        int alt48=2;
+                        alt48 = dfa48.predict(input);
+                        switch (alt48) {
+                    	case 1 :
+                    	    // InternalSEW.g:1728:5: otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,46,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_3_0());
+                    	      				
+                    	    }
+                    	    // InternalSEW.g:1732:5: ( (lv_operand_5_0= rulemultiplicativeExpression ) )
+                    	    // InternalSEW.g:1733:6: (lv_operand_5_0= rulemultiplicativeExpression )
+                    	    {
+                    	    // InternalSEW.g:1733:6: (lv_operand_5_0= rulemultiplicativeExpression )
+                    	    // InternalSEW.g:1734:7: lv_operand_5_0= rulemultiplicativeExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_3_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_31);
+                    	    lv_operand_5_0=rulemultiplicativeExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"operand",
+                    	      								lv_operand_5_0,
+                    	      								"org.eclipse.efm.sew.xtext.SEW.multiplicativeExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop48;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleadditiveExpression"
+
+
+    // $ANTLR start "entryRulemultiplicativeExpression"
+    // InternalSEW.g:1757:1: entryRulemultiplicativeExpression returns [EObject current=null] : iv_rulemultiplicativeExpression= rulemultiplicativeExpression EOF ;
+    public final EObject entryRulemultiplicativeExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulemultiplicativeExpression = null;
+
+
+        try {
+            // InternalSEW.g:1757:65: (iv_rulemultiplicativeExpression= rulemultiplicativeExpression EOF )
+            // InternalSEW.g:1758:2: iv_rulemultiplicativeExpression= rulemultiplicativeExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMultiplicativeExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulemultiplicativeExpression=rulemultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulemultiplicativeExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulemultiplicativeExpression"
+
+
+    // $ANTLR start "rulemultiplicativeExpression"
+    // InternalSEW.g:1764:1: rulemultiplicativeExpression returns [EObject current=null] : (this_primaryExpression_0= ruleprimaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleprimaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleprimaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleprimaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleprimaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )* ) )? ) ;
+    public final EObject rulemultiplicativeExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        Token lv_operator_7_0=null;
+        Token otherlv_9=null;
+        Token lv_operator_12_0=null;
+        Token otherlv_14=null;
+        Token lv_operator_17_0=null;
+        Token otherlv_19=null;
+        EObject this_primaryExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+        EObject lv_operand_8_0 = null;
+
+        EObject lv_operand_10_0 = null;
+
+        EObject lv_operand_13_0 = null;
+
+        EObject lv_operand_15_0 = null;
+
+        EObject lv_operand_18_0 = null;
+
+        EObject lv_operand_20_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:1770:2: ( (this_primaryExpression_0= ruleprimaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleprimaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleprimaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleprimaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleprimaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )* ) )? ) )
+            // InternalSEW.g:1771:2: (this_primaryExpression_0= ruleprimaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleprimaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleprimaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleprimaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleprimaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )* ) )? )
+            {
+            // InternalSEW.g:1771:2: (this_primaryExpression_0= ruleprimaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleprimaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleprimaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleprimaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleprimaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )* ) )? )
+            // InternalSEW.g:1772:3: this_primaryExpression_0= ruleprimaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleprimaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleprimaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleprimaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleprimaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )* ) )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getPrimaryExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_32);
+            this_primaryExpression_0=ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_primaryExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalSEW.g:1783:3: ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleprimaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleprimaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleprimaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleprimaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )* ) )?
+            int alt54=5;
+            switch ( input.LA(1) ) {
+                case 47:
+                    {
+                    alt54=1;
+                    }
+                    break;
+                case 48:
+                    {
+                    alt54=2;
+                    }
+                    break;
+                case 49:
+                    {
+                    alt54=3;
+                    }
+                    break;
+                case 50:
+                    {
+                    alt54=4;
+                    }
+                    break;
+            }
+
+            switch (alt54) {
+                case 1 :
+                    // InternalSEW.g:1784:4: ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleprimaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )* )
+                    {
+                    // InternalSEW.g:1784:4: ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleprimaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )* )
+                    // InternalSEW.g:1785:5: () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleprimaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )*
+                    {
+                    // InternalSEW.g:1785:5: ()
+                    // InternalSEW.g:1786:6: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						current = forceCreateModelElementAndAdd(
+                      							grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_0_0(),
+                      							current);
+                      					
+                    }
+
+                    }
+
+                    // InternalSEW.g:1795:5: ( (lv_operator_2_0= '*' ) )
+                    // InternalSEW.g:1796:6: (lv_operator_2_0= '*' )
+                    {
+                    // InternalSEW.g:1796:6: (lv_operator_2_0= '*' )
+                    // InternalSEW.g:1797:7: lv_operator_2_0= '*'
+                    {
+                    lv_operator_2_0=(Token)match(input,47,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_operator_2_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+                      							}
+                      							setWithLastConsumed(current, "operator", lv_operator_2_0, "*");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1809:5: ( (lv_operand_3_0= ruleprimaryExpression ) )
+                    // InternalSEW.g:1810:6: (lv_operand_3_0= ruleprimaryExpression )
+                    {
+                    // InternalSEW.g:1810:6: (lv_operand_3_0= ruleprimaryExpression )
+                    // InternalSEW.g:1811:7: lv_operand_3_0= ruleprimaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_2_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_33);
+                    lv_operand_3_0=ruleprimaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+                      							}
+                      							add(
+                      								current,
+                      								"operand",
+                      								lv_operand_3_0,
+                      								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1828:5: (otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) ) )*
+                    loop50:
+                    do {
+                        int alt50=2;
+                        int LA50_0 = input.LA(1);
+
+                        if ( (LA50_0==47) ) {
+                            alt50=1;
+                        }
+
+
+                        switch (alt50) {
+                    	case 1 :
+                    	    // InternalSEW.g:1829:6: otherlv_4= '*' ( (lv_operand_5_0= ruleprimaryExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,47,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_4, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0());
+                    	      					
+                    	    }
+                    	    // InternalSEW.g:1833:6: ( (lv_operand_5_0= ruleprimaryExpression ) )
+                    	    // InternalSEW.g:1834:7: (lv_operand_5_0= ruleprimaryExpression )
+                    	    {
+                    	    // InternalSEW.g:1834:7: (lv_operand_5_0= ruleprimaryExpression )
+                    	    // InternalSEW.g:1835:8: lv_operand_5_0= ruleprimaryExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_0_3_1_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_33);
+                    	    lv_operand_5_0=ruleprimaryExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"operand",
+                    	      									lv_operand_5_0,
+                    	      									"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop50;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:1855:4: ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleprimaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )* )
+                    {
+                    // InternalSEW.g:1855:4: ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleprimaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )* )
+                    // InternalSEW.g:1856:5: () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleprimaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )*
+                    {
+                    // InternalSEW.g:1856:5: ()
+                    // InternalSEW.g:1857:6: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						current = forceCreateModelElementAndAdd(
+                      							grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_1_0(),
+                      							current);
+                      					
+                    }
+
+                    }
+
+                    // InternalSEW.g:1866:5: ( (lv_operator_7_0= '**' ) )
+                    // InternalSEW.g:1867:6: (lv_operator_7_0= '**' )
+                    {
+                    // InternalSEW.g:1867:6: (lv_operator_7_0= '**' )
+                    // InternalSEW.g:1868:7: lv_operator_7_0= '**'
+                    {
+                    lv_operator_7_0=(Token)match(input,48,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_operator_7_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+                      							}
+                      							setWithLastConsumed(current, "operator", lv_operator_7_0, "**");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1880:5: ( (lv_operand_8_0= ruleprimaryExpression ) )
+                    // InternalSEW.g:1881:6: (lv_operand_8_0= ruleprimaryExpression )
+                    {
+                    // InternalSEW.g:1881:6: (lv_operand_8_0= ruleprimaryExpression )
+                    // InternalSEW.g:1882:7: lv_operand_8_0= ruleprimaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_2_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_34);
+                    lv_operand_8_0=ruleprimaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+                      							}
+                      							add(
+                      								current,
+                      								"operand",
+                      								lv_operand_8_0,
+                      								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1899:5: (otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) ) )*
+                    loop51:
+                    do {
+                        int alt51=2;
+                        int LA51_0 = input.LA(1);
+
+                        if ( (LA51_0==48) ) {
+                            alt51=1;
+                        }
+
+
+                        switch (alt51) {
+                    	case 1 :
+                    	    // InternalSEW.g:1900:6: otherlv_9= '**' ( (lv_operand_10_0= ruleprimaryExpression ) )
+                    	    {
+                    	    otherlv_9=(Token)match(input,48,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_9, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0());
+                    	      					
+                    	    }
+                    	    // InternalSEW.g:1904:6: ( (lv_operand_10_0= ruleprimaryExpression ) )
+                    	    // InternalSEW.g:1905:7: (lv_operand_10_0= ruleprimaryExpression )
+                    	    {
+                    	    // InternalSEW.g:1905:7: (lv_operand_10_0= ruleprimaryExpression )
+                    	    // InternalSEW.g:1906:8: lv_operand_10_0= ruleprimaryExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_3_1_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_34);
+                    	    lv_operand_10_0=ruleprimaryExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"operand",
+                    	      									lv_operand_10_0,
+                    	      									"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop51;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:1926:4: ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleprimaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )* )
+                    {
+                    // InternalSEW.g:1926:4: ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleprimaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )* )
+                    // InternalSEW.g:1927:5: () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleprimaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )*
+                    {
+                    // InternalSEW.g:1927:5: ()
+                    // InternalSEW.g:1928:6: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						current = forceCreateModelElementAndAdd(
+                      							grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_2_0(),
+                      							current);
+                      					
+                    }
+
+                    }
+
+                    // InternalSEW.g:1937:5: ( (lv_operator_12_0= '/' ) )
+                    // InternalSEW.g:1938:6: (lv_operator_12_0= '/' )
+                    {
+                    // InternalSEW.g:1938:6: (lv_operator_12_0= '/' )
+                    // InternalSEW.g:1939:7: lv_operator_12_0= '/'
+                    {
+                    lv_operator_12_0=(Token)match(input,49,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_operator_12_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+                      							}
+                      							setWithLastConsumed(current, "operator", lv_operator_12_0, "/");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1951:5: ( (lv_operand_13_0= ruleprimaryExpression ) )
+                    // InternalSEW.g:1952:6: (lv_operand_13_0= ruleprimaryExpression )
+                    {
+                    // InternalSEW.g:1952:6: (lv_operand_13_0= ruleprimaryExpression )
+                    // InternalSEW.g:1953:7: lv_operand_13_0= ruleprimaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_2_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_35);
+                    lv_operand_13_0=ruleprimaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+                      							}
+                      							add(
+                      								current,
+                      								"operand",
+                      								lv_operand_13_0,
+                      								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:1970:5: (otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) ) )*
+                    loop52:
+                    do {
+                        int alt52=2;
+                        int LA52_0 = input.LA(1);
+
+                        if ( (LA52_0==49) ) {
+                            alt52=1;
+                        }
+
+
+                        switch (alt52) {
+                    	case 1 :
+                    	    // InternalSEW.g:1971:6: otherlv_14= '/' ( (lv_operand_15_0= ruleprimaryExpression ) )
+                    	    {
+                    	    otherlv_14=(Token)match(input,49,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_14, grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0());
+                    	      					
+                    	    }
+                    	    // InternalSEW.g:1975:6: ( (lv_operand_15_0= ruleprimaryExpression ) )
+                    	    // InternalSEW.g:1976:7: (lv_operand_15_0= ruleprimaryExpression )
+                    	    {
+                    	    // InternalSEW.g:1976:7: (lv_operand_15_0= ruleprimaryExpression )
+                    	    // InternalSEW.g:1977:8: lv_operand_15_0= ruleprimaryExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_2_3_1_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_35);
+                    	    lv_operand_15_0=ruleprimaryExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"operand",
+                    	      									lv_operand_15_0,
+                    	      									"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop52;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:1997:4: ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleprimaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )* )
+                    {
+                    // InternalSEW.g:1997:4: ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleprimaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )* )
+                    // InternalSEW.g:1998:5: () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleprimaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )*
+                    {
+                    // InternalSEW.g:1998:5: ()
+                    // InternalSEW.g:1999:6: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						current = forceCreateModelElementAndAdd(
+                      							grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_3_0(),
+                      							current);
+                      					
+                    }
+
+                    }
+
+                    // InternalSEW.g:2008:5: ( (lv_operator_17_0= '%' ) )
+                    // InternalSEW.g:2009:6: (lv_operator_17_0= '%' )
+                    {
+                    // InternalSEW.g:2009:6: (lv_operator_17_0= '%' )
+                    // InternalSEW.g:2010:7: lv_operator_17_0= '%'
+                    {
+                    lv_operator_17_0=(Token)match(input,50,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_operator_17_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+                      							}
+                      							setWithLastConsumed(current, "operator", lv_operator_17_0, "%");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:2022:5: ( (lv_operand_18_0= ruleprimaryExpression ) )
+                    // InternalSEW.g:2023:6: (lv_operand_18_0= ruleprimaryExpression )
+                    {
+                    // InternalSEW.g:2023:6: (lv_operand_18_0= ruleprimaryExpression )
+                    // InternalSEW.g:2024:7: lv_operand_18_0= ruleprimaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_2_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_36);
+                    lv_operand_18_0=ruleprimaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+                      							}
+                      							add(
+                      								current,
+                      								"operand",
+                      								lv_operand_18_0,
+                      								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:2041:5: (otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) ) )*
+                    loop53:
+                    do {
+                        int alt53=2;
+                        int LA53_0 = input.LA(1);
+
+                        if ( (LA53_0==50) ) {
+                            alt53=1;
+                        }
+
+
+                        switch (alt53) {
+                    	case 1 :
+                    	    // InternalSEW.g:2042:6: otherlv_19= '%' ( (lv_operand_20_0= ruleprimaryExpression ) )
+                    	    {
+                    	    otherlv_19=(Token)match(input,50,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_19, grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0());
+                    	      					
+                    	    }
+                    	    // InternalSEW.g:2046:6: ( (lv_operand_20_0= ruleprimaryExpression ) )
+                    	    // InternalSEW.g:2047:7: (lv_operand_20_0= ruleprimaryExpression )
+                    	    {
+                    	    // InternalSEW.g:2047:7: (lv_operand_20_0= ruleprimaryExpression )
+                    	    // InternalSEW.g:2048:8: lv_operand_20_0= ruleprimaryExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_3_3_1_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_36);
+                    	    lv_operand_20_0=ruleprimaryExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"operand",
+                    	      									lv_operand_20_0,
+                    	      									"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop53;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulemultiplicativeExpression"
+
+
+    // $ANTLR start "entryRuleprimaryExpression"
+    // InternalSEW.g:2072:1: entryRuleprimaryExpression returns [EObject current=null] : iv_ruleprimaryExpression= ruleprimaryExpression EOF ;
+    public final EObject entryRuleprimaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleprimaryExpression = null;
+
+
+        try {
+            // InternalSEW.g:2072:58: (iv_ruleprimaryExpression= ruleprimaryExpression EOF )
+            // InternalSEW.g:2073:2: iv_ruleprimaryExpression= ruleprimaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleprimaryExpression=ruleprimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleprimaryExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleprimaryExpression"
+
+
+    // $ANTLR start "ruleprimaryExpression"
+    // InternalSEW.g:2079:1: ruleprimaryExpression returns [EObject current=null] : ( (otherlv_0= '+' this_primaryExpression_1= ruleprimaryExpression ) | ( () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) ) ) | ( () ( ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) ) ( (lv_operand_7_0= ruleprimaryExpression ) ) ) ) | (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' ) | this_LiteralExpression_11= ruleLiteralExpression ) ;
+    public final EObject ruleprimaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_operator_3_0=null;
+        Token lv_operator_6_1=null;
+        Token lv_operator_6_2=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        EObject this_primaryExpression_1 = null;
+
+        EObject lv_operand_4_0 = null;
+
+        EObject lv_operand_7_0 = null;
+
+        EObject this_Expression_9 = null;
+
+        EObject this_LiteralExpression_11 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2085:2: ( ( (otherlv_0= '+' this_primaryExpression_1= ruleprimaryExpression ) | ( () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) ) ) | ( () ( ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) ) ( (lv_operand_7_0= ruleprimaryExpression ) ) ) ) | (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' ) | this_LiteralExpression_11= ruleLiteralExpression ) )
+            // InternalSEW.g:2086:2: ( (otherlv_0= '+' this_primaryExpression_1= ruleprimaryExpression ) | ( () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) ) ) | ( () ( ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) ) ( (lv_operand_7_0= ruleprimaryExpression ) ) ) ) | (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' ) | this_LiteralExpression_11= ruleLiteralExpression )
+            {
+            // InternalSEW.g:2086:2: ( (otherlv_0= '+' this_primaryExpression_1= ruleprimaryExpression ) | ( () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) ) ) | ( () ( ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) ) ( (lv_operand_7_0= ruleprimaryExpression ) ) ) ) | (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' ) | this_LiteralExpression_11= ruleLiteralExpression )
+            int alt56=5;
+            switch ( input.LA(1) ) {
+            case 46:
+                {
+                alt56=1;
+                }
+                break;
+            case 51:
+                {
+                int LA56_2 = input.LA(2);
+
+                if ( (synpred66_InternalSEW()) ) {
+                    alt56=2;
+                }
+                else if ( (true) ) {
+                    alt56=5;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 56, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 52:
+            case 53:
+                {
+                alt56=3;
+                }
+                break;
+            case 54:
+                {
+                alt56=4;
+                }
+                break;
+            case RULE_XIDENDIFIER:
+            case RULE_CHARACTER:
+            case RULE_INT:
+            case RULE_STRING:
+            case 14:
+            case 21:
+            case 25:
+            case 28:
+            case 56:
+            case 57:
+            case 58:
+            case 59:
+            case 60:
+            case 61:
+            case 62:
+            case 63:
+            case 64:
+            case 65:
+            case 66:
+            case 67:
+            case 68:
+            case 69:
+            case 70:
+            case 71:
+            case 72:
+            case 73:
+            case 74:
+                {
+                alt56=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 56, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt56) {
+                case 1 :
+                    // InternalSEW.g:2087:3: (otherlv_0= '+' this_primaryExpression_1= ruleprimaryExpression )
+                    {
+                    // InternalSEW.g:2087:3: (otherlv_0= '+' this_primaryExpression_1= ruleprimaryExpression )
+                    // InternalSEW.g:2088:4: otherlv_0= '+' this_primaryExpression_1= ruleprimaryExpression
+                    {
+                    otherlv_0=(Token)match(input,46,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getPrimaryExpressionAccess().getPlusSignKeyword_0_0());
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				/* */
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getPrimaryExpressionParserRuleCall_0_1());
+                      			
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_primaryExpression_1=ruleprimaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_primaryExpression_1;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2105:3: ( () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) ) )
+                    {
+                    // InternalSEW.g:2105:3: ( () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) ) )
+                    // InternalSEW.g:2106:4: () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) )
+                    {
+                    // InternalSEW.g:2106:4: ()
+                    // InternalSEW.g:2107:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getPrimaryExpressionAccess().getExpressionAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:2116:4: ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) )
+                    // InternalSEW.g:2117:5: ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) )
+                    {
+                    // InternalSEW.g:2117:5: ( (lv_operator_3_0= '-' ) )
+                    // InternalSEW.g:2118:6: (lv_operator_3_0= '-' )
+                    {
+                    // InternalSEW.g:2118:6: (lv_operator_3_0= '-' )
+                    // InternalSEW.g:2119:7: lv_operator_3_0= '-'
+                    {
+                    lv_operator_3_0=(Token)match(input,51,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_operator_3_0, grammarAccess.getPrimaryExpressionAccess().getOperatorHyphenMinusKeyword_1_1_0_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+                      							}
+                      							setWithLastConsumed(current, "operator", lv_operator_3_0, "-");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:2131:5: ( (lv_operand_4_0= ruleprimaryExpression ) )
+                    // InternalSEW.g:2132:6: (lv_operand_4_0= ruleprimaryExpression )
+                    {
+                    // InternalSEW.g:2132:6: (lv_operand_4_0= ruleprimaryExpression )
+                    // InternalSEW.g:2133:7: lv_operand_4_0= ruleprimaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_operand_4_0=ruleprimaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                      							}
+                      							add(
+                      								current,
+                      								"operand",
+                      								lv_operand_4_0,
+                      								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:2153:3: ( () ( ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) ) ( (lv_operand_7_0= ruleprimaryExpression ) ) ) )
+                    {
+                    // InternalSEW.g:2153:3: ( () ( ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) ) ( (lv_operand_7_0= ruleprimaryExpression ) ) ) )
+                    // InternalSEW.g:2154:4: () ( ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) ) ( (lv_operand_7_0= ruleprimaryExpression ) ) )
+                    {
+                    // InternalSEW.g:2154:4: ()
+                    // InternalSEW.g:2155:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getPrimaryExpressionAccess().getExpressionAction_2_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalSEW.g:2164:4: ( ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) ) ( (lv_operand_7_0= ruleprimaryExpression ) ) )
+                    // InternalSEW.g:2165:5: ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) ) ( (lv_operand_7_0= ruleprimaryExpression ) )
+                    {
+                    // InternalSEW.g:2165:5: ( ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) ) )
+                    // InternalSEW.g:2166:6: ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) )
+                    {
+                    // InternalSEW.g:2166:6: ( (lv_operator_6_1= '!' | lv_operator_6_2= 'not' ) )
+                    // InternalSEW.g:2167:7: (lv_operator_6_1= '!' | lv_operator_6_2= 'not' )
+                    {
+                    // InternalSEW.g:2167:7: (lv_operator_6_1= '!' | lv_operator_6_2= 'not' )
+                    int alt55=2;
+                    int LA55_0 = input.LA(1);
+
+                    if ( (LA55_0==52) ) {
+                        alt55=1;
+                    }
+                    else if ( (LA55_0==53) ) {
+                        alt55=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 55, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt55) {
+                        case 1 :
+                            // InternalSEW.g:2168:8: lv_operator_6_1= '!'
+                            {
+                            lv_operator_6_1=(Token)match(input,52,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_operator_6_1, grammarAccess.getPrimaryExpressionAccess().getOperatorExclamationMarkKeyword_2_1_0_0_0());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+                              								}
+                              								setWithLastConsumed(current, "operator", lv_operator_6_1, null);
+                              							
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalSEW.g:2179:8: lv_operator_6_2= 'not'
+                            {
+                            lv_operator_6_2=(Token)match(input,53,FollowSets000.FOLLOW_27); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_operator_6_2, grammarAccess.getPrimaryExpressionAccess().getOperatorNotKeyword_2_1_0_0_1());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+                              								}
+                              								setWithLastConsumed(current, "operator", lv_operator_6_2, null);
+                              							
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:2192:5: ( (lv_operand_7_0= ruleprimaryExpression ) )
+                    // InternalSEW.g:2193:6: (lv_operand_7_0= ruleprimaryExpression )
+                    {
+                    // InternalSEW.g:2193:6: (lv_operand_7_0= ruleprimaryExpression )
+                    // InternalSEW.g:2194:7: lv_operand_7_0= ruleprimaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_2_1_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_operand_7_0=ruleprimaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                      							}
+                      							add(
+                      								current,
+                      								"operand",
+                      								lv_operand_7_0,
+                      								"org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:2214:3: (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' )
+                    {
+                    // InternalSEW.g:2214:3: (otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')' )
+                    // InternalSEW.g:2215:4: otherlv_8= '(' this_Expression_9= ruleExpression otherlv_10= ')'
+                    {
+                    otherlv_8=(Token)match(input,54,FollowSets000.FOLLOW_22); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getPrimaryExpressionAccess().getLeftParenthesisKeyword_3_0());
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				/* */
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getExpressionParserRuleCall_3_1());
+                      			
+                    }
+                    pushFollow(FollowSets000.FOLLOW_37);
+                    this_Expression_9=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_Expression_9;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    otherlv_10=(Token)match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_3_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalSEW.g:2236:3: this_LiteralExpression_11= ruleLiteralExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getLiteralExpressionParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralExpression_11=ruleLiteralExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralExpression_11;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleprimaryExpression"
+
+
+    // $ANTLR start "entryRuleLiteralExpression"
+    // InternalSEW.g:2251:1: entryRuleLiteralExpression returns [EObject current=null] : iv_ruleLiteralExpression= ruleLiteralExpression EOF ;
+    public final EObject entryRuleLiteralExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralExpression = null;
+
+
+        try {
+            // InternalSEW.g:2251:58: (iv_ruleLiteralExpression= ruleLiteralExpression EOF )
+            // InternalSEW.g:2252:2: iv_ruleLiteralExpression= ruleLiteralExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralExpression=ruleLiteralExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralExpression"
+
+
+    // $ANTLR start "ruleLiteralExpression"
+    // InternalSEW.g:2258:1: ruleLiteralExpression returns [EObject current=null] : (this_LiteralBooleanValue_0= ruleLiteralBooleanValue | this_LiteralCharacterValue_1= ruleLiteralCharacterValue | this_LiteralIntegerValue_2= ruleLiteralIntegerValue | this_LiteralRationalValue_3= ruleLiteralRationalValue | this_LiteralFloatValue_4= ruleLiteralFloatValue | this_LiteralStringValue_5= ruleLiteralStringValue | this_LiteralNullValue_6= ruleLiteralNullValue | this_LiteralArrayValue_7= ruleLiteralArrayValue | this_LiteralObjectReference_8= ruleLiteralObjectReference | this_LiteralVariableReference_9= ruleLiteralVariableReference | this_LiteralInstanceReference_10= ruleLiteralInstanceReference ) ;
+    public final EObject ruleLiteralExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralBooleanValue_0 = null;
+
+        EObject this_LiteralCharacterValue_1 = null;
+
+        EObject this_LiteralIntegerValue_2 = null;
+
+        EObject this_LiteralRationalValue_3 = null;
+
+        EObject this_LiteralFloatValue_4 = null;
+
+        EObject this_LiteralStringValue_5 = null;
+
+        EObject this_LiteralNullValue_6 = null;
+
+        EObject this_LiteralArrayValue_7 = null;
+
+        EObject this_LiteralObjectReference_8 = null;
+
+        EObject this_LiteralVariableReference_9 = null;
+
+        EObject this_LiteralInstanceReference_10 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2264:2: ( (this_LiteralBooleanValue_0= ruleLiteralBooleanValue | this_LiteralCharacterValue_1= ruleLiteralCharacterValue | this_LiteralIntegerValue_2= ruleLiteralIntegerValue | this_LiteralRationalValue_3= ruleLiteralRationalValue | this_LiteralFloatValue_4= ruleLiteralFloatValue | this_LiteralStringValue_5= ruleLiteralStringValue | this_LiteralNullValue_6= ruleLiteralNullValue | this_LiteralArrayValue_7= ruleLiteralArrayValue | this_LiteralObjectReference_8= ruleLiteralObjectReference | this_LiteralVariableReference_9= ruleLiteralVariableReference | this_LiteralInstanceReference_10= ruleLiteralInstanceReference ) )
+            // InternalSEW.g:2265:2: (this_LiteralBooleanValue_0= ruleLiteralBooleanValue | this_LiteralCharacterValue_1= ruleLiteralCharacterValue | this_LiteralIntegerValue_2= ruleLiteralIntegerValue | this_LiteralRationalValue_3= ruleLiteralRationalValue | this_LiteralFloatValue_4= ruleLiteralFloatValue | this_LiteralStringValue_5= ruleLiteralStringValue | this_LiteralNullValue_6= ruleLiteralNullValue | this_LiteralArrayValue_7= ruleLiteralArrayValue | this_LiteralObjectReference_8= ruleLiteralObjectReference | this_LiteralVariableReference_9= ruleLiteralVariableReference | this_LiteralInstanceReference_10= ruleLiteralInstanceReference )
+            {
+            // InternalSEW.g:2265:2: (this_LiteralBooleanValue_0= ruleLiteralBooleanValue | this_LiteralCharacterValue_1= ruleLiteralCharacterValue | this_LiteralIntegerValue_2= ruleLiteralIntegerValue | this_LiteralRationalValue_3= ruleLiteralRationalValue | this_LiteralFloatValue_4= ruleLiteralFloatValue | this_LiteralStringValue_5= ruleLiteralStringValue | this_LiteralNullValue_6= ruleLiteralNullValue | this_LiteralArrayValue_7= ruleLiteralArrayValue | this_LiteralObjectReference_8= ruleLiteralObjectReference | this_LiteralVariableReference_9= ruleLiteralVariableReference | this_LiteralInstanceReference_10= ruleLiteralInstanceReference )
+            int alt57=11;
+            alt57 = dfa57.predict(input);
+            switch (alt57) {
+                case 1 :
+                    // InternalSEW.g:2266:3: this_LiteralBooleanValue_0= ruleLiteralBooleanValue
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralBooleanValueParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralBooleanValue_0=ruleLiteralBooleanValue();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralBooleanValue_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2278:3: this_LiteralCharacterValue_1= ruleLiteralCharacterValue
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralCharacterValueParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralCharacterValue_1=ruleLiteralCharacterValue();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralCharacterValue_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:2290:3: this_LiteralIntegerValue_2= ruleLiteralIntegerValue
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralIntegerValueParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralIntegerValue_2=ruleLiteralIntegerValue();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralIntegerValue_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:2302:3: this_LiteralRationalValue_3= ruleLiteralRationalValue
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralRationalValueParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralRationalValue_3=ruleLiteralRationalValue();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralRationalValue_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalSEW.g:2314:3: this_LiteralFloatValue_4= ruleLiteralFloatValue
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralFloatValueParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralFloatValue_4=ruleLiteralFloatValue();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralFloatValue_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalSEW.g:2326:3: this_LiteralStringValue_5= ruleLiteralStringValue
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralStringValueParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralStringValue_5=ruleLiteralStringValue();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralStringValue_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalSEW.g:2338:3: this_LiteralNullValue_6= ruleLiteralNullValue
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralNullValueParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralNullValue_6=ruleLiteralNullValue();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralNullValue_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalSEW.g:2350:3: this_LiteralArrayValue_7= ruleLiteralArrayValue
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralArrayValueParserRuleCall_7());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralArrayValue_7=ruleLiteralArrayValue();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralArrayValue_7;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalSEW.g:2362:3: this_LiteralObjectReference_8= ruleLiteralObjectReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralObjectReferenceParserRuleCall_8());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralObjectReference_8=ruleLiteralObjectReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralObjectReference_8;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // InternalSEW.g:2374:3: this_LiteralVariableReference_9= ruleLiteralVariableReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralVariableReferenceParserRuleCall_9());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralVariableReference_9=ruleLiteralVariableReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralVariableReference_9;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 11 :
+                    // InternalSEW.g:2386:3: this_LiteralInstanceReference_10= ruleLiteralInstanceReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralExpressionAccess().getLiteralInstanceReferenceParserRuleCall_10());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralInstanceReference_10=ruleLiteralInstanceReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralInstanceReference_10;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralExpression"
+
+
+    // $ANTLR start "entryRuleLiteralArrayValue"
+    // InternalSEW.g:2401:1: entryRuleLiteralArrayValue returns [EObject current=null] : iv_ruleLiteralArrayValue= ruleLiteralArrayValue EOF ;
+    public final EObject entryRuleLiteralArrayValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralArrayValue = null;
+
+
+        try {
+            // InternalSEW.g:2401:58: (iv_ruleLiteralArrayValue= ruleLiteralArrayValue EOF )
+            // InternalSEW.g:2402:2: iv_ruleLiteralArrayValue= ruleLiteralArrayValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralArrayValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralArrayValue=ruleLiteralArrayValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralArrayValue; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralArrayValue"
+
+
+    // $ANTLR start "ruleLiteralArrayValue"
+    // InternalSEW.g:2408:1: ruleLiteralArrayValue returns [EObject current=null] : ( () otherlv_1= '[' ( ( (lv_values_2_0= ruleValueSpecification ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleValueSpecification ) ) )* )? otherlv_5= ']' ) ;
+    public final EObject ruleLiteralArrayValue() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        EObject lv_values_2_0 = null;
+
+        EObject lv_values_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2414:2: ( ( () otherlv_1= '[' ( ( (lv_values_2_0= ruleValueSpecification ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleValueSpecification ) ) )* )? otherlv_5= ']' ) )
+            // InternalSEW.g:2415:2: ( () otherlv_1= '[' ( ( (lv_values_2_0= ruleValueSpecification ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleValueSpecification ) ) )* )? otherlv_5= ']' )
+            {
+            // InternalSEW.g:2415:2: ( () otherlv_1= '[' ( ( (lv_values_2_0= ruleValueSpecification ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleValueSpecification ) ) )* )? otherlv_5= ']' )
+            // InternalSEW.g:2416:3: () otherlv_1= '[' ( ( (lv_values_2_0= ruleValueSpecification ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleValueSpecification ) ) )* )? otherlv_5= ']'
+            {
+            // InternalSEW.g:2416:3: ()
+            // InternalSEW.g:2417:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralArrayValueAccess().getLiteralArrayValueAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,28,FollowSets000.FOLLOW_38); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralArrayValueAccess().getLeftSquareBracketKeyword_1());
+              		
+            }
+            // InternalSEW.g:2430:3: ( ( (lv_values_2_0= ruleValueSpecification ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleValueSpecification ) ) )* )?
+            int alt59=2;
+            int LA59_0 = input.LA(1);
+
+            if ( ((LA59_0>=RULE_XIDENDIFIER && LA59_0<=RULE_STRING)||LA59_0==14||LA59_0==21||LA59_0==25||LA59_0==28||LA59_0==46||(LA59_0>=51 && LA59_0<=54)||(LA59_0>=56 && LA59_0<=74)||LA59_0==77) ) {
+                alt59=1;
+            }
+            switch (alt59) {
+                case 1 :
+                    // InternalSEW.g:2431:4: ( (lv_values_2_0= ruleValueSpecification ) ) (otherlv_3= ',' ( (lv_values_4_0= ruleValueSpecification ) ) )*
+                    {
+                    // InternalSEW.g:2431:4: ( (lv_values_2_0= ruleValueSpecification ) )
+                    // InternalSEW.g:2432:5: (lv_values_2_0= ruleValueSpecification )
+                    {
+                    // InternalSEW.g:2432:5: (lv_values_2_0= ruleValueSpecification )
+                    // InternalSEW.g:2433:6: lv_values_2_0= ruleValueSpecification
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_values_2_0=ruleValueSpecification();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getLiteralArrayValueRule());
+                      						}
+                      						add(
+                      							current,
+                      							"values",
+                      							lv_values_2_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:2450:4: (otherlv_3= ',' ( (lv_values_4_0= ruleValueSpecification ) ) )*
+                    loop58:
+                    do {
+                        int alt58=2;
+                        int LA58_0 = input.LA(1);
+
+                        if ( (LA58_0==22) ) {
+                            alt58=1;
+                        }
+
+
+                        switch (alt58) {
+                    	case 1 :
+                    	    // InternalSEW.g:2451:5: otherlv_3= ',' ( (lv_values_4_0= ruleValueSpecification ) )
+                    	    {
+                    	    otherlv_3=(Token)match(input,22,FollowSets000.FOLLOW_22); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_3, grammarAccess.getLiteralArrayValueAccess().getCommaKeyword_2_1_0());
+                    	      				
+                    	    }
+                    	    // InternalSEW.g:2455:5: ( (lv_values_4_0= ruleValueSpecification ) )
+                    	    // InternalSEW.g:2456:6: (lv_values_4_0= ruleValueSpecification )
+                    	    {
+                    	    // InternalSEW.g:2456:6: (lv_values_4_0= ruleValueSpecification )
+                    	    // InternalSEW.g:2457:7: lv_values_4_0= ruleValueSpecification
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getLiteralArrayValueAccess().getValuesValueSpecificationParserRuleCall_2_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_values_4_0=ruleValueSpecification();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getLiteralArrayValueRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"values",
+                    	      								lv_values_4_0,
+                    	      								"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop58;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getLiteralArrayValueAccess().getRightSquareBracketKeyword_3());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralArrayValue"
+
+
+    // $ANTLR start "entryRuleLiteralObjectReference"
+    // InternalSEW.g:2484:1: entryRuleLiteralObjectReference returns [EObject current=null] : iv_ruleLiteralObjectReference= ruleLiteralObjectReference EOF ;
+    public final EObject entryRuleLiteralObjectReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralObjectReference = null;
+
+
+        try {
+            // InternalSEW.g:2484:63: (iv_ruleLiteralObjectReference= ruleLiteralObjectReference EOF )
+            // InternalSEW.g:2485:2: iv_ruleLiteralObjectReference= ruleLiteralObjectReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralObjectReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralObjectReference=ruleLiteralObjectReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralObjectReference; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralObjectReference"
+
+
+    // $ANTLR start "ruleLiteralObjectReference"
+    // InternalSEW.g:2491:1: ruleLiteralObjectReference returns [EObject current=null] : ( (otherlv_0= '&' )? ( ( ( ruleUFI ) ) | ( (lv_symbol_2_0= ruleUFI ) ) ) ) ;
+    public final EObject ruleLiteralObjectReference() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        AntlrDatatypeRuleToken lv_symbol_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2497:2: ( ( (otherlv_0= '&' )? ( ( ( ruleUFI ) ) | ( (lv_symbol_2_0= ruleUFI ) ) ) ) )
+            // InternalSEW.g:2498:2: ( (otherlv_0= '&' )? ( ( ( ruleUFI ) ) | ( (lv_symbol_2_0= ruleUFI ) ) ) )
+            {
+            // InternalSEW.g:2498:2: ( (otherlv_0= '&' )? ( ( ( ruleUFI ) ) | ( (lv_symbol_2_0= ruleUFI ) ) ) )
+            // InternalSEW.g:2499:3: (otherlv_0= '&' )? ( ( ( ruleUFI ) ) | ( (lv_symbol_2_0= ruleUFI ) ) )
+            {
+            // InternalSEW.g:2499:3: (otherlv_0= '&' )?
+            int alt60=2;
+            int LA60_0 = input.LA(1);
+
+            if ( (LA60_0==56) ) {
+                alt60=1;
+            }
+            switch (alt60) {
+                case 1 :
+                    // InternalSEW.g:2500:4: otherlv_0= '&'
+                    {
+                    otherlv_0=(Token)match(input,56,FollowSets000.FOLLOW_12); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getLiteralObjectReferenceAccess().getAmpersandKeyword_0());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalSEW.g:2505:3: ( ( ( ruleUFI ) ) | ( (lv_symbol_2_0= ruleUFI ) ) )
+            int alt61=2;
+            alt61 = dfa61.predict(input);
+            switch (alt61) {
+                case 1 :
+                    // InternalSEW.g:2506:4: ( ( ruleUFI ) )
+                    {
+                    // InternalSEW.g:2506:4: ( ( ruleUFI ) )
+                    // InternalSEW.g:2507:5: ( ruleUFI )
+                    {
+                    // InternalSEW.g:2507:5: ( ruleUFI )
+                    // InternalSEW.g:2508:6: ruleUFI
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getLiteralObjectReferenceRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getLiteralObjectReferenceAccess().getObjectWObjectCrossReference_1_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleUFI();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2526:4: ( (lv_symbol_2_0= ruleUFI ) )
+                    {
+                    // InternalSEW.g:2526:4: ( (lv_symbol_2_0= ruleUFI ) )
+                    // InternalSEW.g:2527:5: (lv_symbol_2_0= ruleUFI )
+                    {
+                    // InternalSEW.g:2527:5: (lv_symbol_2_0= ruleUFI )
+                    // InternalSEW.g:2528:6: lv_symbol_2_0= ruleUFI
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getLiteralObjectReferenceAccess().getSymbolUFIParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_symbol_2_0=ruleUFI();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getLiteralObjectReferenceRule());
+                      						}
+                      						set(
+                      							current,
+                      							"symbol",
+                      							lv_symbol_2_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.UFI");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralObjectReference"
+
+
+    // $ANTLR start "entryRuleLiteralBooleanValue"
+    // InternalSEW.g:2550:1: entryRuleLiteralBooleanValue returns [EObject current=null] : iv_ruleLiteralBooleanValue= ruleLiteralBooleanValue EOF ;
+    public final EObject entryRuleLiteralBooleanValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralBooleanValue = null;
+
+
+        try {
+            // InternalSEW.g:2550:60: (iv_ruleLiteralBooleanValue= ruleLiteralBooleanValue EOF )
+            // InternalSEW.g:2551:2: iv_ruleLiteralBooleanValue= ruleLiteralBooleanValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralBooleanValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralBooleanValue=ruleLiteralBooleanValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralBooleanValue; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralBooleanValue"
+
+
+    // $ANTLR start "ruleLiteralBooleanValue"
+    // InternalSEW.g:2557:1: ruleLiteralBooleanValue returns [EObject current=null] : ( (lv_value_0_0= ruleEBoolean ) ) ;
+    public final EObject ruleLiteralBooleanValue() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2563:2: ( ( (lv_value_0_0= ruleEBoolean ) ) )
+            // InternalSEW.g:2564:2: ( (lv_value_0_0= ruleEBoolean ) )
+            {
+            // InternalSEW.g:2564:2: ( (lv_value_0_0= ruleEBoolean ) )
+            // InternalSEW.g:2565:3: (lv_value_0_0= ruleEBoolean )
+            {
+            // InternalSEW.g:2565:3: (lv_value_0_0= ruleEBoolean )
+            // InternalSEW.g:2566:4: lv_value_0_0= ruleEBoolean
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getLiteralBooleanValueAccess().getValueEBooleanParserRuleCall_0());
+              			
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_0_0=ruleEBoolean();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getLiteralBooleanValueRule());
+              				}
+              				set(
+              					current,
+              					"value",
+              					lv_value_0_0,
+              					"org.eclipse.efm.sew.xtext.SEW.EBoolean");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralBooleanValue"
+
+
+    // $ANTLR start "entryRuleLiteralCharacterValue"
+    // InternalSEW.g:2586:1: entryRuleLiteralCharacterValue returns [EObject current=null] : iv_ruleLiteralCharacterValue= ruleLiteralCharacterValue EOF ;
+    public final EObject entryRuleLiteralCharacterValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralCharacterValue = null;
+
+
+        try {
+            // InternalSEW.g:2586:62: (iv_ruleLiteralCharacterValue= ruleLiteralCharacterValue EOF )
+            // InternalSEW.g:2587:2: iv_ruleLiteralCharacterValue= ruleLiteralCharacterValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralCharacterValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralCharacterValue=ruleLiteralCharacterValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralCharacterValue; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralCharacterValue"
+
+
+    // $ANTLR start "ruleLiteralCharacterValue"
+    // InternalSEW.g:2593:1: ruleLiteralCharacterValue returns [EObject current=null] : ( (lv_value_0_0= ruleEChar ) ) ;
+    public final EObject ruleLiteralCharacterValue() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2599:2: ( ( (lv_value_0_0= ruleEChar ) ) )
+            // InternalSEW.g:2600:2: ( (lv_value_0_0= ruleEChar ) )
+            {
+            // InternalSEW.g:2600:2: ( (lv_value_0_0= ruleEChar ) )
+            // InternalSEW.g:2601:3: (lv_value_0_0= ruleEChar )
+            {
+            // InternalSEW.g:2601:3: (lv_value_0_0= ruleEChar )
+            // InternalSEW.g:2602:4: lv_value_0_0= ruleEChar
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getLiteralCharacterValueAccess().getValueECharParserRuleCall_0());
+              			
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_0_0=ruleEChar();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getLiteralCharacterValueRule());
+              				}
+              				set(
+              					current,
+              					"value",
+              					lv_value_0_0,
+              					"org.eclipse.efm.sew.xtext.SEW.EChar");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralCharacterValue"
+
+
+    // $ANTLR start "entryRuleLiteralIntegerValue"
+    // InternalSEW.g:2622:1: entryRuleLiteralIntegerValue returns [EObject current=null] : iv_ruleLiteralIntegerValue= ruleLiteralIntegerValue EOF ;
+    public final EObject entryRuleLiteralIntegerValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralIntegerValue = null;
+
+
+        try {
+            // InternalSEW.g:2622:60: (iv_ruleLiteralIntegerValue= ruleLiteralIntegerValue EOF )
+            // InternalSEW.g:2623:2: iv_ruleLiteralIntegerValue= ruleLiteralIntegerValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralIntegerValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralIntegerValue=ruleLiteralIntegerValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralIntegerValue; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralIntegerValue"
+
+
+    // $ANTLR start "ruleLiteralIntegerValue"
+    // InternalSEW.g:2629:1: ruleLiteralIntegerValue returns [EObject current=null] : ( (lv_value_0_0= ruleELong ) ) ;
+    public final EObject ruleLiteralIntegerValue() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2635:2: ( ( (lv_value_0_0= ruleELong ) ) )
+            // InternalSEW.g:2636:2: ( (lv_value_0_0= ruleELong ) )
+            {
+            // InternalSEW.g:2636:2: ( (lv_value_0_0= ruleELong ) )
+            // InternalSEW.g:2637:3: (lv_value_0_0= ruleELong )
+            {
+            // InternalSEW.g:2637:3: (lv_value_0_0= ruleELong )
+            // InternalSEW.g:2638:4: lv_value_0_0= ruleELong
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getLiteralIntegerValueAccess().getValueELongParserRuleCall_0());
+              			
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_0_0=ruleELong();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getLiteralIntegerValueRule());
+              				}
+              				set(
+              					current,
+              					"value",
+              					lv_value_0_0,
+              					"org.eclipse.efm.sew.xtext.SEW.ELong");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralIntegerValue"
+
+
+    // $ANTLR start "entryRuleLiteralRationalValue"
+    // InternalSEW.g:2658:1: entryRuleLiteralRationalValue returns [EObject current=null] : iv_ruleLiteralRationalValue= ruleLiteralRationalValue EOF ;
+    public final EObject entryRuleLiteralRationalValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralRationalValue = null;
+
+
+        try {
+            // InternalSEW.g:2658:61: (iv_ruleLiteralRationalValue= ruleLiteralRationalValue EOF )
+            // InternalSEW.g:2659:2: iv_ruleLiteralRationalValue= ruleLiteralRationalValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralRationalValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralRationalValue=ruleLiteralRationalValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralRationalValue; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralRationalValue"
+
+
+    // $ANTLR start "ruleLiteralRationalValue"
+    // InternalSEW.g:2665:1: ruleLiteralRationalValue returns [EObject current=null] : ( ( (lv_numerator_0_0= ruleELong ) ) otherlv_1= '/' ( (lv_denominator_2_0= ruleELong ) ) ) ;
+    public final EObject ruleLiteralRationalValue() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        AntlrDatatypeRuleToken lv_numerator_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_denominator_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2671:2: ( ( ( (lv_numerator_0_0= ruleELong ) ) otherlv_1= '/' ( (lv_denominator_2_0= ruleELong ) ) ) )
+            // InternalSEW.g:2672:2: ( ( (lv_numerator_0_0= ruleELong ) ) otherlv_1= '/' ( (lv_denominator_2_0= ruleELong ) ) )
+            {
+            // InternalSEW.g:2672:2: ( ( (lv_numerator_0_0= ruleELong ) ) otherlv_1= '/' ( (lv_denominator_2_0= ruleELong ) ) )
+            // InternalSEW.g:2673:3: ( (lv_numerator_0_0= ruleELong ) ) otherlv_1= '/' ( (lv_denominator_2_0= ruleELong ) )
+            {
+            // InternalSEW.g:2673:3: ( (lv_numerator_0_0= ruleELong ) )
+            // InternalSEW.g:2674:4: (lv_numerator_0_0= ruleELong )
+            {
+            // InternalSEW.g:2674:4: (lv_numerator_0_0= ruleELong )
+            // InternalSEW.g:2675:5: lv_numerator_0_0= ruleELong
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralRationalValueAccess().getNumeratorELongParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_40);
+            lv_numerator_0_0=ruleELong();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLiteralRationalValueRule());
+              					}
+              					set(
+              						current,
+              						"numerator",
+              						lv_numerator_0_0,
+              						"org.eclipse.efm.sew.xtext.SEW.ELong");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,49,FollowSets000.FOLLOW_41); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralRationalValueAccess().getSolidusKeyword_1());
+              		
+            }
+            // InternalSEW.g:2696:3: ( (lv_denominator_2_0= ruleELong ) )
+            // InternalSEW.g:2697:4: (lv_denominator_2_0= ruleELong )
+            {
+            // InternalSEW.g:2697:4: (lv_denominator_2_0= ruleELong )
+            // InternalSEW.g:2698:5: lv_denominator_2_0= ruleELong
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralRationalValueAccess().getDenominatorELongParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_denominator_2_0=ruleELong();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLiteralRationalValueRule());
+              					}
+              					set(
+              						current,
+              						"denominator",
+              						lv_denominator_2_0,
+              						"org.eclipse.efm.sew.xtext.SEW.ELong");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralRationalValue"
+
+
+    // $ANTLR start "entryRuleLiteralFloatValue"
+    // InternalSEW.g:2719:1: entryRuleLiteralFloatValue returns [EObject current=null] : iv_ruleLiteralFloatValue= ruleLiteralFloatValue EOF ;
+    public final EObject entryRuleLiteralFloatValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralFloatValue = null;
+
+
+        try {
+            // InternalSEW.g:2719:58: (iv_ruleLiteralFloatValue= ruleLiteralFloatValue EOF )
+            // InternalSEW.g:2720:2: iv_ruleLiteralFloatValue= ruleLiteralFloatValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralFloatValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralFloatValue=ruleLiteralFloatValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralFloatValue; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralFloatValue"
+
+
+    // $ANTLR start "ruleLiteralFloatValue"
+    // InternalSEW.g:2726:1: ruleLiteralFloatValue returns [EObject current=null] : ( (lv_value_0_0= ruleEDouble ) ) ;
+    public final EObject ruleLiteralFloatValue() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2732:2: ( ( (lv_value_0_0= ruleEDouble ) ) )
+            // InternalSEW.g:2733:2: ( (lv_value_0_0= ruleEDouble ) )
+            {
+            // InternalSEW.g:2733:2: ( (lv_value_0_0= ruleEDouble ) )
+            // InternalSEW.g:2734:3: (lv_value_0_0= ruleEDouble )
+            {
+            // InternalSEW.g:2734:3: (lv_value_0_0= ruleEDouble )
+            // InternalSEW.g:2735:4: lv_value_0_0= ruleEDouble
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getLiteralFloatValueAccess().getValueEDoubleParserRuleCall_0());
+              			
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_0_0=ruleEDouble();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getLiteralFloatValueRule());
+              				}
+              				set(
+              					current,
+              					"value",
+              					lv_value_0_0,
+              					"org.eclipse.efm.sew.xtext.SEW.EDouble");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralFloatValue"
+
+
+    // $ANTLR start "entryRuleLiteralStringValue"
+    // InternalSEW.g:2755:1: entryRuleLiteralStringValue returns [EObject current=null] : iv_ruleLiteralStringValue= ruleLiteralStringValue EOF ;
+    public final EObject entryRuleLiteralStringValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralStringValue = null;
+
+
+        try {
+            // InternalSEW.g:2755:59: (iv_ruleLiteralStringValue= ruleLiteralStringValue EOF )
+            // InternalSEW.g:2756:2: iv_ruleLiteralStringValue= ruleLiteralStringValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralStringValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralStringValue=ruleLiteralStringValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralStringValue; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralStringValue"
+
+
+    // $ANTLR start "ruleLiteralStringValue"
+    // InternalSEW.g:2762:1: ruleLiteralStringValue returns [EObject current=null] : ( (lv_value_0_0= ruleEString ) ) ;
+    public final EObject ruleLiteralStringValue() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2768:2: ( ( (lv_value_0_0= ruleEString ) ) )
+            // InternalSEW.g:2769:2: ( (lv_value_0_0= ruleEString ) )
+            {
+            // InternalSEW.g:2769:2: ( (lv_value_0_0= ruleEString ) )
+            // InternalSEW.g:2770:3: (lv_value_0_0= ruleEString )
+            {
+            // InternalSEW.g:2770:3: (lv_value_0_0= ruleEString )
+            // InternalSEW.g:2771:4: lv_value_0_0= ruleEString
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getLiteralStringValueAccess().getValueEStringParserRuleCall_0());
+              			
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_0_0=ruleEString();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getLiteralStringValueRule());
+              				}
+              				set(
+              					current,
+              					"value",
+              					lv_value_0_0,
+              					"org.eclipse.efm.sew.xtext.SEW.EString");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralStringValue"
+
+
+    // $ANTLR start "entryRuleLiteralNullValue"
+    // InternalSEW.g:2791:1: entryRuleLiteralNullValue returns [EObject current=null] : iv_ruleLiteralNullValue= ruleLiteralNullValue EOF ;
+    public final EObject entryRuleLiteralNullValue() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralNullValue = null;
+
+
+        try {
+            // InternalSEW.g:2791:57: (iv_ruleLiteralNullValue= ruleLiteralNullValue EOF )
+            // InternalSEW.g:2792:2: iv_ruleLiteralNullValue= ruleLiteralNullValue EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralNullValueRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralNullValue=ruleLiteralNullValue();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralNullValue; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralNullValue"
+
+
+    // $ANTLR start "ruleLiteralNullValue"
+    // InternalSEW.g:2798:1: ruleLiteralNullValue returns [EObject current=null] : ( () otherlv_1= 'null' (otherlv_2= '<' ( (lv_type_3_0= ruleXID ) ) otherlv_4= '>' )? ) ;
+    public final EObject ruleLiteralNullValue() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        AntlrDatatypeRuleToken lv_type_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2804:2: ( ( () otherlv_1= 'null' (otherlv_2= '<' ( (lv_type_3_0= ruleXID ) ) otherlv_4= '>' )? ) )
+            // InternalSEW.g:2805:2: ( () otherlv_1= 'null' (otherlv_2= '<' ( (lv_type_3_0= ruleXID ) ) otherlv_4= '>' )? )
+            {
+            // InternalSEW.g:2805:2: ( () otherlv_1= 'null' (otherlv_2= '<' ( (lv_type_3_0= ruleXID ) ) otherlv_4= '>' )? )
+            // InternalSEW.g:2806:3: () otherlv_1= 'null' (otherlv_2= '<' ( (lv_type_3_0= ruleXID ) ) otherlv_4= '>' )?
+            {
+            // InternalSEW.g:2806:3: ()
+            // InternalSEW.g:2807:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralNullValueAccess().getLiteralNullValueAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,57,FollowSets000.FOLLOW_42); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralNullValueAccess().getNullKeyword_1());
+              		
+            }
+            // InternalSEW.g:2820:3: (otherlv_2= '<' ( (lv_type_3_0= ruleXID ) ) otherlv_4= '>' )?
+            int alt62=2;
+            alt62 = dfa62.predict(input);
+            switch (alt62) {
+                case 1 :
+                    // InternalSEW.g:2821:4: otherlv_2= '<' ( (lv_type_3_0= ruleXID ) ) otherlv_4= '>'
+                    {
+                    otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_12); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getLiteralNullValueAccess().getLessThanSignKeyword_2_0());
+                      			
+                    }
+                    // InternalSEW.g:2825:4: ( (lv_type_3_0= ruleXID ) )
+                    // InternalSEW.g:2826:5: (lv_type_3_0= ruleXID )
+                    {
+                    // InternalSEW.g:2826:5: (lv_type_3_0= ruleXID )
+                    // InternalSEW.g:2827:6: lv_type_3_0= ruleXID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getLiteralNullValueAccess().getTypeXIDParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_43);
+                    lv_type_3_0=ruleXID();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getLiteralNullValueRule());
+                      						}
+                      						set(
+                      							current,
+                      							"type",
+                      							lv_type_3_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.XID");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,44,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getLiteralNullValueAccess().getGreaterThanSignKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralNullValue"
+
+
+    // $ANTLR start "entryRuleLiteralVariableReference"
+    // InternalSEW.g:2853:1: entryRuleLiteralVariableReference returns [EObject current=null] : iv_ruleLiteralVariableReference= ruleLiteralVariableReference EOF ;
+    public final EObject entryRuleLiteralVariableReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralVariableReference = null;
+
+
+        try {
+            // InternalSEW.g:2853:65: (iv_ruleLiteralVariableReference= ruleLiteralVariableReference EOF )
+            // InternalSEW.g:2854:2: iv_ruleLiteralVariableReference= ruleLiteralVariableReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralVariableReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralVariableReference=ruleLiteralVariableReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralVariableReference; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralVariableReference"
+
+
+    // $ANTLR start "ruleLiteralVariableReference"
+    // InternalSEW.g:2860:1: ruleLiteralVariableReference returns [EObject current=null] : (this_LiteralTimeVariable_0= ruleLiteralTimeVariable | this_LiteralTimeDeltaVariable_1= ruleLiteralTimeDeltaVariable ) ;
+    public final EObject ruleLiteralVariableReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralTimeVariable_0 = null;
+
+        EObject this_LiteralTimeDeltaVariable_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2866:2: ( (this_LiteralTimeVariable_0= ruleLiteralTimeVariable | this_LiteralTimeDeltaVariable_1= ruleLiteralTimeDeltaVariable ) )
+            // InternalSEW.g:2867:2: (this_LiteralTimeVariable_0= ruleLiteralTimeVariable | this_LiteralTimeDeltaVariable_1= ruleLiteralTimeDeltaVariable )
+            {
+            // InternalSEW.g:2867:2: (this_LiteralTimeVariable_0= ruleLiteralTimeVariable | this_LiteralTimeDeltaVariable_1= ruleLiteralTimeDeltaVariable )
+            int alt63=2;
+            int LA63_0 = input.LA(1);
+
+            if ( (LA63_0==58) ) {
+                alt63=1;
+            }
+            else if ( (LA63_0==59) ) {
+                alt63=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 63, 0, input);
+
+                throw nvae;
+            }
+            switch (alt63) {
+                case 1 :
+                    // InternalSEW.g:2868:3: this_LiteralTimeVariable_0= ruleLiteralTimeVariable
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeVariableParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralTimeVariable_0=ruleLiteralTimeVariable();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralTimeVariable_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:2880:3: this_LiteralTimeDeltaVariable_1= ruleLiteralTimeDeltaVariable
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralVariableReferenceAccess().getLiteralTimeDeltaVariableParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralTimeDeltaVariable_1=ruleLiteralTimeDeltaVariable();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralTimeDeltaVariable_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralVariableReference"
+
+
+    // $ANTLR start "entryRuleLiteralTimeVariable"
+    // InternalSEW.g:2895:1: entryRuleLiteralTimeVariable returns [EObject current=null] : iv_ruleLiteralTimeVariable= ruleLiteralTimeVariable EOF ;
+    public final EObject entryRuleLiteralTimeVariable() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralTimeVariable = null;
+
+
+        try {
+            // InternalSEW.g:2895:60: (iv_ruleLiteralTimeVariable= ruleLiteralTimeVariable EOF )
+            // InternalSEW.g:2896:2: iv_ruleLiteralTimeVariable= ruleLiteralTimeVariable EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralTimeVariableRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralTimeVariable=ruleLiteralTimeVariable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralTimeVariable; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralTimeVariable"
+
+
+    // $ANTLR start "ruleLiteralTimeVariable"
+    // InternalSEW.g:2902:1: ruleLiteralTimeVariable returns [EObject current=null] : ( () ( (lv_symbol_1_0= '$time' ) ) ) ;
+    public final EObject ruleLiteralTimeVariable() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_symbol_1_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2908:2: ( ( () ( (lv_symbol_1_0= '$time' ) ) ) )
+            // InternalSEW.g:2909:2: ( () ( (lv_symbol_1_0= '$time' ) ) )
+            {
+            // InternalSEW.g:2909:2: ( () ( (lv_symbol_1_0= '$time' ) ) )
+            // InternalSEW.g:2910:3: () ( (lv_symbol_1_0= '$time' ) )
+            {
+            // InternalSEW.g:2910:3: ()
+            // InternalSEW.g:2911:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralTimeVariableAccess().getLiteralTimeVariableAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:2920:3: ( (lv_symbol_1_0= '$time' ) )
+            // InternalSEW.g:2921:4: (lv_symbol_1_0= '$time' )
+            {
+            // InternalSEW.g:2921:4: (lv_symbol_1_0= '$time' )
+            // InternalSEW.g:2922:5: lv_symbol_1_0= '$time'
+            {
+            lv_symbol_1_0=(Token)match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getLiteralTimeVariableRule());
+              					}
+              					setWithLastConsumed(current, "symbol", lv_symbol_1_0, "$time");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralTimeVariable"
+
+
+    // $ANTLR start "entryRuleLiteralTimeDeltaVariable"
+    // InternalSEW.g:2938:1: entryRuleLiteralTimeDeltaVariable returns [EObject current=null] : iv_ruleLiteralTimeDeltaVariable= ruleLiteralTimeDeltaVariable EOF ;
+    public final EObject entryRuleLiteralTimeDeltaVariable() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralTimeDeltaVariable = null;
+
+
+        try {
+            // InternalSEW.g:2938:65: (iv_ruleLiteralTimeDeltaVariable= ruleLiteralTimeDeltaVariable EOF )
+            // InternalSEW.g:2939:2: iv_ruleLiteralTimeDeltaVariable= ruleLiteralTimeDeltaVariable EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralTimeDeltaVariableRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralTimeDeltaVariable=ruleLiteralTimeDeltaVariable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralTimeDeltaVariable; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralTimeDeltaVariable"
+
+
+    // $ANTLR start "ruleLiteralTimeDeltaVariable"
+    // InternalSEW.g:2945:1: ruleLiteralTimeDeltaVariable returns [EObject current=null] : ( () ( (lv_symbol_1_0= '$delta' ) ) ) ;
+    public final EObject ruleLiteralTimeDeltaVariable() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_symbol_1_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2951:2: ( ( () ( (lv_symbol_1_0= '$delta' ) ) ) )
+            // InternalSEW.g:2952:2: ( () ( (lv_symbol_1_0= '$delta' ) ) )
+            {
+            // InternalSEW.g:2952:2: ( () ( (lv_symbol_1_0= '$delta' ) ) )
+            // InternalSEW.g:2953:3: () ( (lv_symbol_1_0= '$delta' ) )
+            {
+            // InternalSEW.g:2953:3: ()
+            // InternalSEW.g:2954:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralTimeDeltaVariableAccess().getLiteralTimeDeltaVariableAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:2963:3: ( (lv_symbol_1_0= '$delta' ) )
+            // InternalSEW.g:2964:4: (lv_symbol_1_0= '$delta' )
+            {
+            // InternalSEW.g:2964:4: (lv_symbol_1_0= '$delta' )
+            // InternalSEW.g:2965:5: lv_symbol_1_0= '$delta'
+            {
+            lv_symbol_1_0=(Token)match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getLiteralTimeDeltaVariableRule());
+              					}
+              					setWithLastConsumed(current, "symbol", lv_symbol_1_0, "$delta");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralTimeDeltaVariable"
+
+
+    // $ANTLR start "entryRuleLiteralInstanceReference"
+    // InternalSEW.g:2981:1: entryRuleLiteralInstanceReference returns [EObject current=null] : iv_ruleLiteralInstanceReference= ruleLiteralInstanceReference EOF ;
+    public final EObject entryRuleLiteralInstanceReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralInstanceReference = null;
+
+
+        try {
+            // InternalSEW.g:2981:65: (iv_ruleLiteralInstanceReference= ruleLiteralInstanceReference EOF )
+            // InternalSEW.g:2982:2: iv_ruleLiteralInstanceReference= ruleLiteralInstanceReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralInstanceReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralInstanceReference=ruleLiteralInstanceReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralInstanceReference; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralInstanceReference"
+
+
+    // $ANTLR start "ruleLiteralInstanceReference"
+    // InternalSEW.g:2988:1: ruleLiteralInstanceReference returns [EObject current=null] : (this_LiteralThisInstance_0= ruleLiteralThisInstance | this_LiteralSelfInstance_1= ruleLiteralSelfInstance | this_LiteralParentInstance_2= ruleLiteralParentInstance | this_LiteralSuperInstance_3= ruleLiteralSuperInstance | this_LiteralSystemInstance_4= ruleLiteralSystemInstance | this_LiteralEnvInstance_5= ruleLiteralEnvInstance ) ;
+    public final EObject ruleLiteralInstanceReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralThisInstance_0 = null;
+
+        EObject this_LiteralSelfInstance_1 = null;
+
+        EObject this_LiteralParentInstance_2 = null;
+
+        EObject this_LiteralSuperInstance_3 = null;
+
+        EObject this_LiteralSystemInstance_4 = null;
+
+        EObject this_LiteralEnvInstance_5 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:2994:2: ( (this_LiteralThisInstance_0= ruleLiteralThisInstance | this_LiteralSelfInstance_1= ruleLiteralSelfInstance | this_LiteralParentInstance_2= ruleLiteralParentInstance | this_LiteralSuperInstance_3= ruleLiteralSuperInstance | this_LiteralSystemInstance_4= ruleLiteralSystemInstance | this_LiteralEnvInstance_5= ruleLiteralEnvInstance ) )
+            // InternalSEW.g:2995:2: (this_LiteralThisInstance_0= ruleLiteralThisInstance | this_LiteralSelfInstance_1= ruleLiteralSelfInstance | this_LiteralParentInstance_2= ruleLiteralParentInstance | this_LiteralSuperInstance_3= ruleLiteralSuperInstance | this_LiteralSystemInstance_4= ruleLiteralSystemInstance | this_LiteralEnvInstance_5= ruleLiteralEnvInstance )
+            {
+            // InternalSEW.g:2995:2: (this_LiteralThisInstance_0= ruleLiteralThisInstance | this_LiteralSelfInstance_1= ruleLiteralSelfInstance | this_LiteralParentInstance_2= ruleLiteralParentInstance | this_LiteralSuperInstance_3= ruleLiteralSuperInstance | this_LiteralSystemInstance_4= ruleLiteralSystemInstance | this_LiteralEnvInstance_5= ruleLiteralEnvInstance )
+            int alt64=6;
+            switch ( input.LA(1) ) {
+            case 60:
+                {
+                alt64=1;
+                }
+                break;
+            case 61:
+                {
+                alt64=2;
+                }
+                break;
+            case 62:
+                {
+                alt64=3;
+                }
+                break;
+            case 63:
+                {
+                alt64=4;
+                }
+                break;
+            case 64:
+                {
+                alt64=5;
+                }
+                break;
+            case 65:
+            case 66:
+                {
+                alt64=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 64, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt64) {
+                case 1 :
+                    // InternalSEW.g:2996:3: this_LiteralThisInstance_0= ruleLiteralThisInstance
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralThisInstanceParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralThisInstance_0=ruleLiteralThisInstance();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralThisInstance_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:3008:3: this_LiteralSelfInstance_1= ruleLiteralSelfInstance
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSelfInstanceParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralSelfInstance_1=ruleLiteralSelfInstance();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralSelfInstance_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:3020:3: this_LiteralParentInstance_2= ruleLiteralParentInstance
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralParentInstanceParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralParentInstance_2=ruleLiteralParentInstance();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralParentInstance_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:3032:3: this_LiteralSuperInstance_3= ruleLiteralSuperInstance
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSuperInstanceParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralSuperInstance_3=ruleLiteralSuperInstance();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralSuperInstance_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalSEW.g:3044:3: this_LiteralSystemInstance_4= ruleLiteralSystemInstance
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralSystemInstanceParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralSystemInstance_4=ruleLiteralSystemInstance();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralSystemInstance_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalSEW.g:3056:3: this_LiteralEnvInstance_5= ruleLiteralEnvInstance
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralInstanceReferenceAccess().getLiteralEnvInstanceParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralEnvInstance_5=ruleLiteralEnvInstance();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralEnvInstance_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralInstanceReference"
+
+
+    // $ANTLR start "entryRuleLiteralThisInstance"
+    // InternalSEW.g:3071:1: entryRuleLiteralThisInstance returns [EObject current=null] : iv_ruleLiteralThisInstance= ruleLiteralThisInstance EOF ;
+    public final EObject entryRuleLiteralThisInstance() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralThisInstance = null;
+
+
+        try {
+            // InternalSEW.g:3071:60: (iv_ruleLiteralThisInstance= ruleLiteralThisInstance EOF )
+            // InternalSEW.g:3072:2: iv_ruleLiteralThisInstance= ruleLiteralThisInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralThisInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralThisInstance=ruleLiteralThisInstance();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralThisInstance; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralThisInstance"
+
+
+    // $ANTLR start "ruleLiteralThisInstance"
+    // InternalSEW.g:3078:1: ruleLiteralThisInstance returns [EObject current=null] : ( () ( (lv_symbol_1_0= '$this' ) ) ) ;
+    public final EObject ruleLiteralThisInstance() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_symbol_1_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3084:2: ( ( () ( (lv_symbol_1_0= '$this' ) ) ) )
+            // InternalSEW.g:3085:2: ( () ( (lv_symbol_1_0= '$this' ) ) )
+            {
+            // InternalSEW.g:3085:2: ( () ( (lv_symbol_1_0= '$this' ) ) )
+            // InternalSEW.g:3086:3: () ( (lv_symbol_1_0= '$this' ) )
+            {
+            // InternalSEW.g:3086:3: ()
+            // InternalSEW.g:3087:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralThisInstanceAccess().getLiteralThisInstanceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:3096:3: ( (lv_symbol_1_0= '$this' ) )
+            // InternalSEW.g:3097:4: (lv_symbol_1_0= '$this' )
+            {
+            // InternalSEW.g:3097:4: (lv_symbol_1_0= '$this' )
+            // InternalSEW.g:3098:5: lv_symbol_1_0= '$this'
+            {
+            lv_symbol_1_0=(Token)match(input,60,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getLiteralThisInstanceRule());
+              					}
+              					setWithLastConsumed(current, "symbol", lv_symbol_1_0, "$this");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralThisInstance"
+
+
+    // $ANTLR start "entryRuleLiteralSelfInstance"
+    // InternalSEW.g:3114:1: entryRuleLiteralSelfInstance returns [EObject current=null] : iv_ruleLiteralSelfInstance= ruleLiteralSelfInstance EOF ;
+    public final EObject entryRuleLiteralSelfInstance() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralSelfInstance = null;
+
+
+        try {
+            // InternalSEW.g:3114:60: (iv_ruleLiteralSelfInstance= ruleLiteralSelfInstance EOF )
+            // InternalSEW.g:3115:2: iv_ruleLiteralSelfInstance= ruleLiteralSelfInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralSelfInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralSelfInstance=ruleLiteralSelfInstance();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralSelfInstance; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralSelfInstance"
+
+
+    // $ANTLR start "ruleLiteralSelfInstance"
+    // InternalSEW.g:3121:1: ruleLiteralSelfInstance returns [EObject current=null] : ( () ( (lv_symbol_1_0= '$self' ) ) ) ;
+    public final EObject ruleLiteralSelfInstance() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_symbol_1_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3127:2: ( ( () ( (lv_symbol_1_0= '$self' ) ) ) )
+            // InternalSEW.g:3128:2: ( () ( (lv_symbol_1_0= '$self' ) ) )
+            {
+            // InternalSEW.g:3128:2: ( () ( (lv_symbol_1_0= '$self' ) ) )
+            // InternalSEW.g:3129:3: () ( (lv_symbol_1_0= '$self' ) )
+            {
+            // InternalSEW.g:3129:3: ()
+            // InternalSEW.g:3130:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralSelfInstanceAccess().getLiteralSelfInstanceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:3139:3: ( (lv_symbol_1_0= '$self' ) )
+            // InternalSEW.g:3140:4: (lv_symbol_1_0= '$self' )
+            {
+            // InternalSEW.g:3140:4: (lv_symbol_1_0= '$self' )
+            // InternalSEW.g:3141:5: lv_symbol_1_0= '$self'
+            {
+            lv_symbol_1_0=(Token)match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getLiteralSelfInstanceRule());
+              					}
+              					setWithLastConsumed(current, "symbol", lv_symbol_1_0, "$self");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralSelfInstance"
+
+
+    // $ANTLR start "entryRuleLiteralParentInstance"
+    // InternalSEW.g:3157:1: entryRuleLiteralParentInstance returns [EObject current=null] : iv_ruleLiteralParentInstance= ruleLiteralParentInstance EOF ;
+    public final EObject entryRuleLiteralParentInstance() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralParentInstance = null;
+
+
+        try {
+            // InternalSEW.g:3157:62: (iv_ruleLiteralParentInstance= ruleLiteralParentInstance EOF )
+            // InternalSEW.g:3158:2: iv_ruleLiteralParentInstance= ruleLiteralParentInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralParentInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralParentInstance=ruleLiteralParentInstance();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralParentInstance; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralParentInstance"
+
+
+    // $ANTLR start "ruleLiteralParentInstance"
+    // InternalSEW.g:3164:1: ruleLiteralParentInstance returns [EObject current=null] : ( () ( (lv_symbol_1_0= '$parent' ) ) ) ;
+    public final EObject ruleLiteralParentInstance() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_symbol_1_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3170:2: ( ( () ( (lv_symbol_1_0= '$parent' ) ) ) )
+            // InternalSEW.g:3171:2: ( () ( (lv_symbol_1_0= '$parent' ) ) )
+            {
+            // InternalSEW.g:3171:2: ( () ( (lv_symbol_1_0= '$parent' ) ) )
+            // InternalSEW.g:3172:3: () ( (lv_symbol_1_0= '$parent' ) )
+            {
+            // InternalSEW.g:3172:3: ()
+            // InternalSEW.g:3173:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralParentInstanceAccess().getLiteralParentInstanceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:3182:3: ( (lv_symbol_1_0= '$parent' ) )
+            // InternalSEW.g:3183:4: (lv_symbol_1_0= '$parent' )
+            {
+            // InternalSEW.g:3183:4: (lv_symbol_1_0= '$parent' )
+            // InternalSEW.g:3184:5: lv_symbol_1_0= '$parent'
+            {
+            lv_symbol_1_0=(Token)match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getLiteralParentInstanceRule());
+              					}
+              					setWithLastConsumed(current, "symbol", lv_symbol_1_0, "$parent");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralParentInstance"
+
+
+    // $ANTLR start "entryRuleLiteralSuperInstance"
+    // InternalSEW.g:3200:1: entryRuleLiteralSuperInstance returns [EObject current=null] : iv_ruleLiteralSuperInstance= ruleLiteralSuperInstance EOF ;
+    public final EObject entryRuleLiteralSuperInstance() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralSuperInstance = null;
+
+
+        try {
+            // InternalSEW.g:3200:61: (iv_ruleLiteralSuperInstance= ruleLiteralSuperInstance EOF )
+            // InternalSEW.g:3201:2: iv_ruleLiteralSuperInstance= ruleLiteralSuperInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralSuperInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralSuperInstance=ruleLiteralSuperInstance();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralSuperInstance; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralSuperInstance"
+
+
+    // $ANTLR start "ruleLiteralSuperInstance"
+    // InternalSEW.g:3207:1: ruleLiteralSuperInstance returns [EObject current=null] : ( () ( (lv_symbol_1_0= '$super' ) ) ) ;
+    public final EObject ruleLiteralSuperInstance() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_symbol_1_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3213:2: ( ( () ( (lv_symbol_1_0= '$super' ) ) ) )
+            // InternalSEW.g:3214:2: ( () ( (lv_symbol_1_0= '$super' ) ) )
+            {
+            // InternalSEW.g:3214:2: ( () ( (lv_symbol_1_0= '$super' ) ) )
+            // InternalSEW.g:3215:3: () ( (lv_symbol_1_0= '$super' ) )
+            {
+            // InternalSEW.g:3215:3: ()
+            // InternalSEW.g:3216:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralSuperInstanceAccess().getLiteralSuperInstanceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:3225:3: ( (lv_symbol_1_0= '$super' ) )
+            // InternalSEW.g:3226:4: (lv_symbol_1_0= '$super' )
+            {
+            // InternalSEW.g:3226:4: (lv_symbol_1_0= '$super' )
+            // InternalSEW.g:3227:5: lv_symbol_1_0= '$super'
+            {
+            lv_symbol_1_0=(Token)match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getLiteralSuperInstanceRule());
+              					}
+              					setWithLastConsumed(current, "symbol", lv_symbol_1_0, "$super");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralSuperInstance"
+
+
+    // $ANTLR start "entryRuleLiteralSystemInstance"
+    // InternalSEW.g:3243:1: entryRuleLiteralSystemInstance returns [EObject current=null] : iv_ruleLiteralSystemInstance= ruleLiteralSystemInstance EOF ;
+    public final EObject entryRuleLiteralSystemInstance() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralSystemInstance = null;
+
+
+        try {
+            // InternalSEW.g:3243:62: (iv_ruleLiteralSystemInstance= ruleLiteralSystemInstance EOF )
+            // InternalSEW.g:3244:2: iv_ruleLiteralSystemInstance= ruleLiteralSystemInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralSystemInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralSystemInstance=ruleLiteralSystemInstance();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralSystemInstance; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralSystemInstance"
+
+
+    // $ANTLR start "ruleLiteralSystemInstance"
+    // InternalSEW.g:3250:1: ruleLiteralSystemInstance returns [EObject current=null] : ( () ( (lv_symbol_1_0= '$system' ) ) ) ;
+    public final EObject ruleLiteralSystemInstance() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_symbol_1_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3256:2: ( ( () ( (lv_symbol_1_0= '$system' ) ) ) )
+            // InternalSEW.g:3257:2: ( () ( (lv_symbol_1_0= '$system' ) ) )
+            {
+            // InternalSEW.g:3257:2: ( () ( (lv_symbol_1_0= '$system' ) ) )
+            // InternalSEW.g:3258:3: () ( (lv_symbol_1_0= '$system' ) )
+            {
+            // InternalSEW.g:3258:3: ()
+            // InternalSEW.g:3259:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralSystemInstanceAccess().getLiteralSystemInstanceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:3268:3: ( (lv_symbol_1_0= '$system' ) )
+            // InternalSEW.g:3269:4: (lv_symbol_1_0= '$system' )
+            {
+            // InternalSEW.g:3269:4: (lv_symbol_1_0= '$system' )
+            // InternalSEW.g:3270:5: lv_symbol_1_0= '$system'
+            {
+            lv_symbol_1_0=(Token)match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_symbol_1_0, grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getLiteralSystemInstanceRule());
+              					}
+              					setWithLastConsumed(current, "symbol", lv_symbol_1_0, "$system");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralSystemInstance"
+
+
+    // $ANTLR start "entryRuleLiteralEnvInstance"
+    // InternalSEW.g:3286:1: entryRuleLiteralEnvInstance returns [EObject current=null] : iv_ruleLiteralEnvInstance= ruleLiteralEnvInstance EOF ;
+    public final EObject entryRuleLiteralEnvInstance() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralEnvInstance = null;
+
+
+        try {
+            // InternalSEW.g:3286:59: (iv_ruleLiteralEnvInstance= ruleLiteralEnvInstance EOF )
+            // InternalSEW.g:3287:2: iv_ruleLiteralEnvInstance= ruleLiteralEnvInstance EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralEnvInstanceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralEnvInstance=ruleLiteralEnvInstance();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralEnvInstance; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralEnvInstance"
+
+
+    // $ANTLR start "ruleLiteralEnvInstance"
+    // InternalSEW.g:3293:1: ruleLiteralEnvInstance returns [EObject current=null] : ( () ( ( (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' ) ) ) ) ;
+    public final EObject ruleLiteralEnvInstance() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_symbol_1_1=null;
+        Token lv_symbol_1_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3299:2: ( ( () ( ( (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' ) ) ) ) )
+            // InternalSEW.g:3300:2: ( () ( ( (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' ) ) ) )
+            {
+            // InternalSEW.g:3300:2: ( () ( ( (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' ) ) ) )
+            // InternalSEW.g:3301:3: () ( ( (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' ) ) )
+            {
+            // InternalSEW.g:3301:3: ()
+            // InternalSEW.g:3302:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralEnvInstanceAccess().getLiteralEnvInstanceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:3311:3: ( ( (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' ) ) )
+            // InternalSEW.g:3312:4: ( (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' ) )
+            {
+            // InternalSEW.g:3312:4: ( (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' ) )
+            // InternalSEW.g:3313:5: (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' )
+            {
+            // InternalSEW.g:3313:5: (lv_symbol_1_1= '$env' | lv_symbol_1_2= 'env' )
+            int alt65=2;
+            int LA65_0 = input.LA(1);
+
+            if ( (LA65_0==65) ) {
+                alt65=1;
+            }
+            else if ( (LA65_0==66) ) {
+                alt65=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 65, 0, input);
+
+                throw nvae;
+            }
+            switch (alt65) {
+                case 1 :
+                    // InternalSEW.g:3314:6: lv_symbol_1_1= '$env'
+                    {
+                    lv_symbol_1_1=(Token)match(input,65,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_symbol_1_1, grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getLiteralEnvInstanceRule());
+                      						}
+                      						setWithLastConsumed(current, "symbol", lv_symbol_1_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:3325:6: lv_symbol_1_2= 'env'
+                    {
+                    lv_symbol_1_2=(Token)match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_symbol_1_2, grammarAccess.getLiteralEnvInstanceAccess().getSymbolEnvKeyword_1_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getLiteralEnvInstanceRule());
+                      						}
+                      						setWithLastConsumed(current, "symbol", lv_symbol_1_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralEnvInstance"
+
+
+    // $ANTLR start "entryRuleEBoolean"
+    // InternalSEW.g:3342:1: entryRuleEBoolean returns [String current=null] : iv_ruleEBoolean= ruleEBoolean EOF ;
+    public final String entryRuleEBoolean() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEBoolean = null;
+
+
+        try {
+            // InternalSEW.g:3342:48: (iv_ruleEBoolean= ruleEBoolean EOF )
+            // InternalSEW.g:3343:2: iv_ruleEBoolean= ruleEBoolean EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEBooleanRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEBoolean=ruleEBoolean();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEBoolean.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEBoolean"
+
+
+    // $ANTLR start "ruleEBoolean"
+    // InternalSEW.g:3349:1: ruleEBoolean returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'true' | kw= 'false' ) ;
+    public final AntlrDatatypeRuleToken ruleEBoolean() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3355:2: ( (kw= 'true' | kw= 'false' ) )
+            // InternalSEW.g:3356:2: (kw= 'true' | kw= 'false' )
+            {
+            // InternalSEW.g:3356:2: (kw= 'true' | kw= 'false' )
+            int alt66=2;
+            int LA66_0 = input.LA(1);
+
+            if ( (LA66_0==67) ) {
+                alt66=1;
+            }
+            else if ( (LA66_0==68) ) {
+                alt66=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 66, 0, input);
+
+                throw nvae;
+            }
+            switch (alt66) {
+                case 1 :
+                    // InternalSEW.g:3357:3: kw= 'true'
+                    {
+                    kw=(Token)match(input,67,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getEBooleanAccess().getTrueKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:3363:3: kw= 'false'
+                    {
+                    kw=(Token)match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getEBooleanAccess().getFalseKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEBoolean"
+
+
+    // $ANTLR start "entryRuleEChar"
+    // InternalSEW.g:3372:1: entryRuleEChar returns [String current=null] : iv_ruleEChar= ruleEChar EOF ;
+    public final String entryRuleEChar() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEChar = null;
+
+
+        try {
+            // InternalSEW.g:3372:45: (iv_ruleEChar= ruleEChar EOF )
+            // InternalSEW.g:3373:2: iv_ruleEChar= ruleEChar EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getECharRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEChar=ruleEChar();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEChar.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEChar"
+
+
+    // $ANTLR start "ruleEChar"
+    // InternalSEW.g:3379:1: ruleEChar returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_CHARACTER_0= RULE_CHARACTER ;
+    public final AntlrDatatypeRuleToken ruleEChar() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_CHARACTER_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3385:2: (this_CHARACTER_0= RULE_CHARACTER )
+            // InternalSEW.g:3386:2: this_CHARACTER_0= RULE_CHARACTER
+            {
+            this_CHARACTER_0=(Token)match(input,RULE_CHARACTER,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_CHARACTER_0);
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(this_CHARACTER_0, grammarAccess.getECharAccess().getCHARACTERTerminalRuleCall());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEChar"
+
+
+    // $ANTLR start "entryRuleELong"
+    // InternalSEW.g:3396:1: entryRuleELong returns [String current=null] : iv_ruleELong= ruleELong EOF ;
+    public final String entryRuleELong() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleELong = null;
+
+
+        try {
+            // InternalSEW.g:3396:45: (iv_ruleELong= ruleELong EOF )
+            // InternalSEW.g:3397:2: iv_ruleELong= ruleELong EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getELongRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleELong=ruleELong();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleELong.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleELong"
+
+
+    // $ANTLR start "ruleELong"
+    // InternalSEW.g:3403:1: ruleELong returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_INT_1= RULE_INT ) ;
+    public final AntlrDatatypeRuleToken ruleELong() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        Token this_INT_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3409:2: ( ( (kw= '-' )? this_INT_1= RULE_INT ) )
+            // InternalSEW.g:3410:2: ( (kw= '-' )? this_INT_1= RULE_INT )
+            {
+            // InternalSEW.g:3410:2: ( (kw= '-' )? this_INT_1= RULE_INT )
+            // InternalSEW.g:3411:3: (kw= '-' )? this_INT_1= RULE_INT
+            {
+            // InternalSEW.g:3411:3: (kw= '-' )?
+            int alt67=2;
+            int LA67_0 = input.LA(1);
+
+            if ( (LA67_0==51) ) {
+                alt67=1;
+            }
+            switch (alt67) {
+                case 1 :
+                    // InternalSEW.g:3412:4: kw= '-'
+                    {
+                    kw=(Token)match(input,51,FollowSets000.FOLLOW_44); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getELongAccess().getHyphenMinusKeyword_0());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            this_INT_1=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_INT_1);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(this_INT_1, grammarAccess.getELongAccess().getINTTerminalRuleCall_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleELong"
+
+
+    // $ANTLR start "entryRuleEDouble"
+    // InternalSEW.g:3429:1: entryRuleEDouble returns [String current=null] : iv_ruleEDouble= ruleEDouble EOF ;
+    public final String entryRuleEDouble() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEDouble = null;
+
+
+        try {
+            // InternalSEW.g:3429:47: (iv_ruleEDouble= ruleEDouble EOF )
+            // InternalSEW.g:3430:2: iv_ruleEDouble= ruleEDouble EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEDoubleRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEDouble=ruleEDouble();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEDouble.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEDouble"
+
+
+    // $ANTLR start "ruleEDouble"
+    // InternalSEW.g:3436:1: ruleEDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT ) ;
+    public final AntlrDatatypeRuleToken ruleEDouble() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        Token this_INT_1=null;
+        Token this_INT_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3442:2: ( ( (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT ) )
+            // InternalSEW.g:3443:2: ( (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT )
+            {
+            // InternalSEW.g:3443:2: ( (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT )
+            // InternalSEW.g:3444:3: (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT
+            {
+            // InternalSEW.g:3444:3: (kw= '-' )?
+            int alt68=2;
+            int LA68_0 = input.LA(1);
+
+            if ( (LA68_0==51) ) {
+                alt68=1;
+            }
+            switch (alt68) {
+                case 1 :
+                    // InternalSEW.g:3445:4: kw= '-'
+                    {
+                    kw=(Token)match(input,51,FollowSets000.FOLLOW_45); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalSEW.g:3451:3: (this_INT_1= RULE_INT )?
+            int alt69=2;
+            int LA69_0 = input.LA(1);
+
+            if ( (LA69_0==RULE_INT) ) {
+                alt69=1;
+            }
+            switch (alt69) {
+                case 1 :
+                    // InternalSEW.g:3452:4: this_INT_1= RULE_INT
+                    {
+                    this_INT_1=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(this_INT_1);
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(this_INT_1, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            kw=(Token)match(input,25,FollowSets000.FOLLOW_44); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getEDoubleAccess().getFullStopKeyword_2());
+              		
+            }
+            this_INT_3=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_INT_3);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(this_INT_3, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEDouble"
+
+
+    // $ANTLR start "entryRuleEBigDecimal"
+    // InternalSEW.g:3476:1: entryRuleEBigDecimal returns [String current=null] : iv_ruleEBigDecimal= ruleEBigDecimal EOF ;
+    public final String entryRuleEBigDecimal() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEBigDecimal = null;
+
+
+        try {
+            // InternalSEW.g:3476:51: (iv_ruleEBigDecimal= ruleEBigDecimal EOF )
+            // InternalSEW.g:3477:2: iv_ruleEBigDecimal= ruleEBigDecimal EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEBigDecimalRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEBigDecimal=ruleEBigDecimal();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEBigDecimal.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEBigDecimal"
+
+
+    // $ANTLR start "ruleEBigDecimal"
+    // InternalSEW.g:3483:1: ruleEBigDecimal returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (this_INT_0= RULE_INT )? kw= '.' this_INT_2= RULE_INT ) ;
+    public final AntlrDatatypeRuleToken ruleEBigDecimal() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_INT_0=null;
+        Token kw=null;
+        Token this_INT_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3489:2: ( ( (this_INT_0= RULE_INT )? kw= '.' this_INT_2= RULE_INT ) )
+            // InternalSEW.g:3490:2: ( (this_INT_0= RULE_INT )? kw= '.' this_INT_2= RULE_INT )
+            {
+            // InternalSEW.g:3490:2: ( (this_INT_0= RULE_INT )? kw= '.' this_INT_2= RULE_INT )
+            // InternalSEW.g:3491:3: (this_INT_0= RULE_INT )? kw= '.' this_INT_2= RULE_INT
+            {
+            // InternalSEW.g:3491:3: (this_INT_0= RULE_INT )?
+            int alt70=2;
+            int LA70_0 = input.LA(1);
+
+            if ( (LA70_0==RULE_INT) ) {
+                alt70=1;
+            }
+            switch (alt70) {
+                case 1 :
+                    // InternalSEW.g:3492:4: this_INT_0= RULE_INT
+                    {
+                    this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(this_INT_0);
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(this_INT_0, grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_0());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            kw=(Token)match(input,25,FollowSets000.FOLLOW_44); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getEBigDecimalAccess().getFullStopKeyword_1());
+              		
+            }
+            this_INT_2=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_INT_2);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(this_INT_2, grammarAccess.getEBigDecimalAccess().getINTTerminalRuleCall_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEBigDecimal"
+
+
+    // $ANTLR start "entryRuleEString"
+    // InternalSEW.g:3516:1: entryRuleEString returns [String current=null] : iv_ruleEString= ruleEString EOF ;
+    public final String entryRuleEString() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEString = null;
+
+
+        try {
+            // InternalSEW.g:3516:47: (iv_ruleEString= ruleEString EOF )
+            // InternalSEW.g:3517:2: iv_ruleEString= ruleEString EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEStringRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEString=ruleEString();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEString.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEString"
+
+
+    // $ANTLR start "ruleEString"
+    // InternalSEW.g:3523:1: ruleEString returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_STRING_0= RULE_STRING ;
+    public final AntlrDatatypeRuleToken ruleEString() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_STRING_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3529:2: (this_STRING_0= RULE_STRING )
+            // InternalSEW.g:3530:2: this_STRING_0= RULE_STRING
+            {
+            this_STRING_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_STRING_0);
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(this_STRING_0, grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEString"
+
+
+    // $ANTLR start "entryRuleDeprecatedReservedWord"
+    // InternalSEW.g:3540:1: entryRuleDeprecatedReservedWord returns [String current=null] : iv_ruleDeprecatedReservedWord= ruleDeprecatedReservedWord EOF ;
+    public final String entryRuleDeprecatedReservedWord() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleDeprecatedReservedWord = null;
+
+
+        try {
+            // InternalSEW.g:3540:62: (iv_ruleDeprecatedReservedWord= ruleDeprecatedReservedWord EOF )
+            // InternalSEW.g:3541:2: iv_ruleDeprecatedReservedWord= ruleDeprecatedReservedWord EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDeprecatedReservedWordRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDeprecatedReservedWord=ruleDeprecatedReservedWord();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDeprecatedReservedWord.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDeprecatedReservedWord"
+
+
+    // $ANTLR start "ruleDeprecatedReservedWord"
+    // InternalSEW.g:3547:1: ruleDeprecatedReservedWord returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'form' | kw= 'endform' | kw= 'prototype' | kw= 'endprototype' | kw= 'section' | kw= 'endsection' ) ;
+    public final AntlrDatatypeRuleToken ruleDeprecatedReservedWord() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3553:2: ( (kw= 'form' | kw= 'endform' | kw= 'prototype' | kw= 'endprototype' | kw= 'section' | kw= 'endsection' ) )
+            // InternalSEW.g:3554:2: (kw= 'form' | kw= 'endform' | kw= 'prototype' | kw= 'endprototype' | kw= 'section' | kw= 'endsection' )
+            {
+            // InternalSEW.g:3554:2: (kw= 'form' | kw= 'endform' | kw= 'prototype' | kw= 'endprototype' | kw= 'section' | kw= 'endsection' )
+            int alt71=6;
+            switch ( input.LA(1) ) {
+            case 69:
+                {
+                alt71=1;
+                }
+                break;
+            case 70:
+                {
+                alt71=2;
+                }
+                break;
+            case 71:
+                {
+                alt71=3;
+                }
+                break;
+            case 72:
+                {
+                alt71=4;
+                }
+                break;
+            case 73:
+                {
+                alt71=5;
+                }
+                break;
+            case 74:
+                {
+                alt71=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 71, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt71) {
+                case 1 :
+                    // InternalSEW.g:3555:3: kw= 'form'
+                    {
+                    kw=(Token)match(input,69,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getFormKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:3561:3: kw= 'endform'
+                    {
+                    kw=(Token)match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getEndformKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalSEW.g:3567:3: kw= 'prototype'
+                    {
+                    kw=(Token)match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getPrototypeKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalSEW.g:3573:3: kw= 'endprototype'
+                    {
+                    kw=(Token)match(input,72,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getEndprototypeKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalSEW.g:3579:3: kw= 'section'
+                    {
+                    kw=(Token)match(input,73,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getSectionKeyword_4());
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalSEW.g:3585:3: kw= 'endsection'
+                    {
+                    kw=(Token)match(input,74,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getDeprecatedReservedWordAccess().getEndsectionKeyword_5());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDeprecatedReservedWord"
+
+
+    // $ANTLR start "entryRuleDeprecatedObject"
+    // InternalSEW.g:3594:1: entryRuleDeprecatedObject returns [EObject current=null] : iv_ruleDeprecatedObject= ruleDeprecatedObject EOF ;
+    public final EObject entryRuleDeprecatedObject() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDeprecatedObject = null;
+
+
+        try {
+            // InternalSEW.g:3594:57: (iv_ruleDeprecatedObject= ruleDeprecatedObject EOF )
+            // InternalSEW.g:3595:2: iv_ruleDeprecatedObject= ruleDeprecatedObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDeprecatedObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDeprecatedObject=ruleDeprecatedObject();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDeprecatedObject; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDeprecatedObject"
+
+
+    // $ANTLR start "ruleDeprecatedObject"
+    // InternalSEW.g:3601:1: ruleDeprecatedObject returns [EObject current=null] : ( ( () otherlv_1= 'form' ( (lv_name_2_0= ruleUFI ) ) ( (lv_description_3_0= ruleEString ) )? otherlv_4= 'as' (otherlv_5= '&' )? ( (lv_type_6_0= ruleUFI ) ) otherlv_7= 'is' ( (lv_element_8_0= ruleDeprecatedProperty ) )* otherlv_9= 'endform' ) | ( () otherlv_11= 'prototype' ( (lv_name_12_0= ruleUFI ) ) ( (lv_description_13_0= ruleEString ) )? otherlv_14= 'as' (otherlv_15= '&' )? ( (lv_type_16_0= ruleUFI ) ) otherlv_17= 'is' ( (lv_element_18_0= ruleDeprecatedProperty ) )* otherlv_19= 'endprototype' ) ) ;
+    public final EObject ruleDeprecatedObject() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_14=null;
+        Token otherlv_15=null;
+        Token otherlv_17=null;
+        Token otherlv_19=null;
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_description_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_type_6_0 = null;
+
+        EObject lv_element_8_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_12_0 = null;
+
+        AntlrDatatypeRuleToken lv_description_13_0 = null;
+
+        AntlrDatatypeRuleToken lv_type_16_0 = null;
+
+        EObject lv_element_18_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3607:2: ( ( ( () otherlv_1= 'form' ( (lv_name_2_0= ruleUFI ) ) ( (lv_description_3_0= ruleEString ) )? otherlv_4= 'as' (otherlv_5= '&' )? ( (lv_type_6_0= ruleUFI ) ) otherlv_7= 'is' ( (lv_element_8_0= ruleDeprecatedProperty ) )* otherlv_9= 'endform' ) | ( () otherlv_11= 'prototype' ( (lv_name_12_0= ruleUFI ) ) ( (lv_description_13_0= ruleEString ) )? otherlv_14= 'as' (otherlv_15= '&' )? ( (lv_type_16_0= ruleUFI ) ) otherlv_17= 'is' ( (lv_element_18_0= ruleDeprecatedProperty ) )* otherlv_19= 'endprototype' ) ) )
+            // InternalSEW.g:3608:2: ( ( () otherlv_1= 'form' ( (lv_name_2_0= ruleUFI ) ) ( (lv_description_3_0= ruleEString ) )? otherlv_4= 'as' (otherlv_5= '&' )? ( (lv_type_6_0= ruleUFI ) ) otherlv_7= 'is' ( (lv_element_8_0= ruleDeprecatedProperty ) )* otherlv_9= 'endform' ) | ( () otherlv_11= 'prototype' ( (lv_name_12_0= ruleUFI ) ) ( (lv_description_13_0= ruleEString ) )? otherlv_14= 'as' (otherlv_15= '&' )? ( (lv_type_16_0= ruleUFI ) ) otherlv_17= 'is' ( (lv_element_18_0= ruleDeprecatedProperty ) )* otherlv_19= 'endprototype' ) )
+            {
+            // InternalSEW.g:3608:2: ( ( () otherlv_1= 'form' ( (lv_name_2_0= ruleUFI ) ) ( (lv_description_3_0= ruleEString ) )? otherlv_4= 'as' (otherlv_5= '&' )? ( (lv_type_6_0= ruleUFI ) ) otherlv_7= 'is' ( (lv_element_8_0= ruleDeprecatedProperty ) )* otherlv_9= 'endform' ) | ( () otherlv_11= 'prototype' ( (lv_name_12_0= ruleUFI ) ) ( (lv_description_13_0= ruleEString ) )? otherlv_14= 'as' (otherlv_15= '&' )? ( (lv_type_16_0= ruleUFI ) ) otherlv_17= 'is' ( (lv_element_18_0= ruleDeprecatedProperty ) )* otherlv_19= 'endprototype' ) )
+            int alt78=2;
+            int LA78_0 = input.LA(1);
+
+            if ( (LA78_0==69) ) {
+                alt78=1;
+            }
+            else if ( (LA78_0==71) ) {
+                alt78=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 78, 0, input);
+
+                throw nvae;
+            }
+            switch (alt78) {
+                case 1 :
+                    // InternalSEW.g:3609:3: ( () otherlv_1= 'form' ( (lv_name_2_0= ruleUFI ) ) ( (lv_description_3_0= ruleEString ) )? otherlv_4= 'as' (otherlv_5= '&' )? ( (lv_type_6_0= ruleUFI ) ) otherlv_7= 'is' ( (lv_element_8_0= ruleDeprecatedProperty ) )* otherlv_9= 'endform' )
+                    {
+                    // InternalSEW.g:3609:3: ( () otherlv_1= 'form' ( (lv_name_2_0= ruleUFI ) ) ( (lv_description_3_0= ruleEString ) )? otherlv_4= 'as' (otherlv_5= '&' )? ( (lv_type_6_0= ruleUFI ) ) otherlv_7= 'is' ( (lv_element_8_0= ruleDeprecatedProperty ) )* otherlv_9= 'endform' )
+                    // InternalSEW.g:3610:4: () otherlv_1= 'form' ( (lv_name_2_0= ruleUFI ) ) ( (lv_description_3_0= ruleEString ) )? otherlv_4= 'as' (otherlv_5= '&' )? ( (lv_type_6_0= ruleUFI ) ) otherlv_7= 'is' ( (lv_element_8_0= ruleDeprecatedProperty ) )* otherlv_9= 'endform'
+                    {
+                    // InternalSEW.g:3610:4: ()
+                    // InternalSEW.g:3611:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getDeprecatedObjectAccess().getWObjectAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    otherlv_1=(Token)match(input,69,FollowSets000.FOLLOW_12); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getDeprecatedObjectAccess().getFormKeyword_0_1());
+                      			
+                    }
+                    // InternalSEW.g:3624:4: ( (lv_name_2_0= ruleUFI ) )
+                    // InternalSEW.g:3625:5: (lv_name_2_0= ruleUFI )
+                    {
+                    // InternalSEW.g:3625:5: (lv_name_2_0= ruleUFI )
+                    // InternalSEW.g:3626:6: lv_name_2_0= ruleUFI
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_0_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_47);
+                    lv_name_2_0=ruleUFI();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+                      						}
+                      						set(
+                      							current,
+                      							"name",
+                      							lv_name_2_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.UFI");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:3643:4: ( (lv_description_3_0= ruleEString ) )?
+                    int alt72=2;
+                    int LA72_0 = input.LA(1);
+
+                    if ( (LA72_0==RULE_STRING) ) {
+                        alt72=1;
+                    }
+                    switch (alt72) {
+                        case 1 :
+                            // InternalSEW.g:3644:5: (lv_description_3_0= ruleEString )
+                            {
+                            // InternalSEW.g:3644:5: (lv_description_3_0= ruleEString )
+                            // InternalSEW.g:3645:6: lv_description_3_0= ruleEString
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_0_3_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_48);
+                            lv_description_3_0=ruleEString();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+                              						}
+                              						set(
+                              							current,
+                              							"description",
+                              							lv_description_3_0,
+                              							"org.eclipse.efm.sew.xtext.SEW.EString");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_4=(Token)match(input,75,FollowSets000.FOLLOW_49); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getDeprecatedObjectAccess().getAsKeyword_0_4());
+                      			
+                    }
+                    // InternalSEW.g:3666:4: (otherlv_5= '&' )?
+                    int alt73=2;
+                    int LA73_0 = input.LA(1);
+
+                    if ( (LA73_0==56) ) {
+                        alt73=1;
+                    }
+                    switch (alt73) {
+                        case 1 :
+                            // InternalSEW.g:3667:5: otherlv_5= '&'
+                            {
+                            otherlv_5=(Token)match(input,56,FollowSets000.FOLLOW_12); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_5, grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_0_5());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalSEW.g:3672:4: ( (lv_type_6_0= ruleUFI ) )
+                    // InternalSEW.g:3673:5: (lv_type_6_0= ruleUFI )
+                    {
+                    // InternalSEW.g:3673:5: (lv_type_6_0= ruleUFI )
+                    // InternalSEW.g:3674:6: lv_type_6_0= ruleUFI
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_0_6_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_50);
+                    lv_type_6_0=ruleUFI();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+                      						}
+                      						set(
+                      							current,
+                      							"type",
+                      							lv_type_6_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.UFI");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_7=(Token)match(input,76,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getDeprecatedObjectAccess().getIsKeyword_0_7());
+                      			
+                    }
+                    // InternalSEW.g:3695:4: ( (lv_element_8_0= ruleDeprecatedProperty ) )*
+                    loop74:
+                    do {
+                        int alt74=2;
+                        int LA74_0 = input.LA(1);
+
+                        if ( (LA74_0==70) ) {
+                            int LA74_1 = input.LA(2);
+
+                            if ( (LA74_1==RULE_STRING||LA74_1==28||(LA74_1>=30 && LA74_1<=31)) ) {
+                                alt74=1;
+                            }
+
+
+                        }
+                        else if ( (LA74_0==RULE_XIDENDIFIER||LA74_0==RULE_AT_IDENTIFIER||LA74_0==14||LA74_0==21||LA74_0==69||(LA74_0>=71 && LA74_0<=74)) ) {
+                            alt74=1;
+                        }
+
+
+                        switch (alt74) {
+                    	case 1 :
+                    	    // InternalSEW.g:3696:5: (lv_element_8_0= ruleDeprecatedProperty )
+                    	    {
+                    	    // InternalSEW.g:3696:5: (lv_element_8_0= ruleDeprecatedProperty )
+                    	    // InternalSEW.g:3697:6: lv_element_8_0= ruleDeprecatedProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_0_8_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_51);
+                    	    lv_element_8_0=ruleDeprecatedProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"element",
+                    	      							lv_element_8_0,
+                    	      							"org.eclipse.efm.sew.xtext.SEW.DeprecatedProperty");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop74;
+                        }
+                    } while (true);
+
+                    otherlv_9=(Token)match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getDeprecatedObjectAccess().getEndformKeyword_0_9());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:3720:3: ( () otherlv_11= 'prototype' ( (lv_name_12_0= ruleUFI ) ) ( (lv_description_13_0= ruleEString ) )? otherlv_14= 'as' (otherlv_15= '&' )? ( (lv_type_16_0= ruleUFI ) ) otherlv_17= 'is' ( (lv_element_18_0= ruleDeprecatedProperty ) )* otherlv_19= 'endprototype' )
+                    {
+                    // InternalSEW.g:3720:3: ( () otherlv_11= 'prototype' ( (lv_name_12_0= ruleUFI ) ) ( (lv_description_13_0= ruleEString ) )? otherlv_14= 'as' (otherlv_15= '&' )? ( (lv_type_16_0= ruleUFI ) ) otherlv_17= 'is' ( (lv_element_18_0= ruleDeprecatedProperty ) )* otherlv_19= 'endprototype' )
+                    // InternalSEW.g:3721:4: () otherlv_11= 'prototype' ( (lv_name_12_0= ruleUFI ) ) ( (lv_description_13_0= ruleEString ) )? otherlv_14= 'as' (otherlv_15= '&' )? ( (lv_type_16_0= ruleUFI ) ) otherlv_17= 'is' ( (lv_element_18_0= ruleDeprecatedProperty ) )* otherlv_19= 'endprototype'
+                    {
+                    // InternalSEW.g:3721:4: ()
+                    // InternalSEW.g:3722:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getDeprecatedObjectAccess().getWObjectAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    otherlv_11=(Token)match(input,71,FollowSets000.FOLLOW_12); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_11, grammarAccess.getDeprecatedObjectAccess().getPrototypeKeyword_1_1());
+                      			
+                    }
+                    // InternalSEW.g:3735:4: ( (lv_name_12_0= ruleUFI ) )
+                    // InternalSEW.g:3736:5: (lv_name_12_0= ruleUFI )
+                    {
+                    // InternalSEW.g:3736:5: (lv_name_12_0= ruleUFI )
+                    // InternalSEW.g:3737:6: lv_name_12_0= ruleUFI
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getNameUFIParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_47);
+                    lv_name_12_0=ruleUFI();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+                      						}
+                      						set(
+                      							current,
+                      							"name",
+                      							lv_name_12_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.UFI");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:3754:4: ( (lv_description_13_0= ruleEString ) )?
+                    int alt75=2;
+                    int LA75_0 = input.LA(1);
+
+                    if ( (LA75_0==RULE_STRING) ) {
+                        alt75=1;
+                    }
+                    switch (alt75) {
+                        case 1 :
+                            // InternalSEW.g:3755:5: (lv_description_13_0= ruleEString )
+                            {
+                            // InternalSEW.g:3755:5: (lv_description_13_0= ruleEString )
+                            // InternalSEW.g:3756:6: lv_description_13_0= ruleEString
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getDescriptionEStringParserRuleCall_1_3_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_48);
+                            lv_description_13_0=ruleEString();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+                              						}
+                              						set(
+                              							current,
+                              							"description",
+                              							lv_description_13_0,
+                              							"org.eclipse.efm.sew.xtext.SEW.EString");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_14=(Token)match(input,75,FollowSets000.FOLLOW_49); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getDeprecatedObjectAccess().getAsKeyword_1_4());
+                      			
+                    }
+                    // InternalSEW.g:3777:4: (otherlv_15= '&' )?
+                    int alt76=2;
+                    int LA76_0 = input.LA(1);
+
+                    if ( (LA76_0==56) ) {
+                        alt76=1;
+                    }
+                    switch (alt76) {
+                        case 1 :
+                            // InternalSEW.g:3778:5: otherlv_15= '&'
+                            {
+                            otherlv_15=(Token)match(input,56,FollowSets000.FOLLOW_12); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_15, grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_1_5());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalSEW.g:3783:4: ( (lv_type_16_0= ruleUFI ) )
+                    // InternalSEW.g:3784:5: (lv_type_16_0= ruleUFI )
+                    {
+                    // InternalSEW.g:3784:5: (lv_type_16_0= ruleUFI )
+                    // InternalSEW.g:3785:6: lv_type_16_0= ruleUFI
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getTypeUFIParserRuleCall_1_6_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_50);
+                    lv_type_16_0=ruleUFI();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+                      						}
+                      						set(
+                      							current,
+                      							"type",
+                      							lv_type_16_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.UFI");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_17=(Token)match(input,76,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_17, grammarAccess.getDeprecatedObjectAccess().getIsKeyword_1_7());
+                      			
+                    }
+                    // InternalSEW.g:3806:4: ( (lv_element_18_0= ruleDeprecatedProperty ) )*
+                    loop77:
+                    do {
+                        int alt77=2;
+                        int LA77_0 = input.LA(1);
+
+                        if ( (LA77_0==72) ) {
+                            int LA77_1 = input.LA(2);
+
+                            if ( (LA77_1==RULE_STRING||LA77_1==28||(LA77_1>=30 && LA77_1<=31)) ) {
+                                alt77=1;
+                            }
+
+
+                        }
+                        else if ( (LA77_0==RULE_XIDENDIFIER||LA77_0==RULE_AT_IDENTIFIER||LA77_0==14||LA77_0==21||(LA77_0>=69 && LA77_0<=71)||(LA77_0>=73 && LA77_0<=74)) ) {
+                            alt77=1;
+                        }
+
+
+                        switch (alt77) {
+                    	case 1 :
+                    	    // InternalSEW.g:3807:5: (lv_element_18_0= ruleDeprecatedProperty )
+                    	    {
+                    	    // InternalSEW.g:3807:5: (lv_element_18_0= ruleDeprecatedProperty )
+                    	    // InternalSEW.g:3808:6: lv_element_18_0= ruleDeprecatedProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getDeprecatedObjectAccess().getElementDeprecatedPropertyParserRuleCall_1_8_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_51);
+                    	    lv_element_18_0=ruleDeprecatedProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getDeprecatedObjectRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"element",
+                    	      							lv_element_18_0,
+                    	      							"org.eclipse.efm.sew.xtext.SEW.DeprecatedProperty");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop77;
+                        }
+                    } while (true);
+
+                    otherlv_19=(Token)match(input,72,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_19, grammarAccess.getDeprecatedObjectAccess().getEndprototypeKeyword_1_9());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDeprecatedObject"
+
+
+    // $ANTLR start "entryRuleDeprecatedProperty"
+    // InternalSEW.g:3834:1: entryRuleDeprecatedProperty returns [EObject current=null] : iv_ruleDeprecatedProperty= ruleDeprecatedProperty EOF ;
+    public final EObject entryRuleDeprecatedProperty() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDeprecatedProperty = null;
+
+
+        try {
+            // InternalSEW.g:3834:59: (iv_ruleDeprecatedProperty= ruleDeprecatedProperty EOF )
+            // InternalSEW.g:3835:2: iv_ruleDeprecatedProperty= ruleDeprecatedProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDeprecatedPropertyRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDeprecatedProperty=ruleDeprecatedProperty();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDeprecatedProperty; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDeprecatedProperty"
+
+
+    // $ANTLR start "ruleDeprecatedProperty"
+    // InternalSEW.g:3841:1: ruleDeprecatedProperty returns [EObject current=null] : (this_DeprecatedSection_0= ruleDeprecatedSection | this_DeprecatedAttribute_1= ruleDeprecatedAttribute ) ;
+    public final EObject ruleDeprecatedProperty() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_DeprecatedSection_0 = null;
+
+        EObject this_DeprecatedAttribute_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3847:2: ( (this_DeprecatedSection_0= ruleDeprecatedSection | this_DeprecatedAttribute_1= ruleDeprecatedAttribute ) )
+            // InternalSEW.g:3848:2: (this_DeprecatedSection_0= ruleDeprecatedSection | this_DeprecatedAttribute_1= ruleDeprecatedAttribute )
+            {
+            // InternalSEW.g:3848:2: (this_DeprecatedSection_0= ruleDeprecatedSection | this_DeprecatedAttribute_1= ruleDeprecatedAttribute )
+            int alt79=2;
+            alt79 = dfa79.predict(input);
+            switch (alt79) {
+                case 1 :
+                    // InternalSEW.g:3849:3: this_DeprecatedSection_0= ruleDeprecatedSection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedSectionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_DeprecatedSection_0=ruleDeprecatedSection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DeprecatedSection_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:3861:3: this_DeprecatedAttribute_1= ruleDeprecatedAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDeprecatedPropertyAccess().getDeprecatedAttributeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_DeprecatedAttribute_1=ruleDeprecatedAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DeprecatedAttribute_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDeprecatedProperty"
+
+
+    // $ANTLR start "entryRuleDeprecatedSection"
+    // InternalSEW.g:3876:1: entryRuleDeprecatedSection returns [EObject current=null] : iv_ruleDeprecatedSection= ruleDeprecatedSection EOF ;
+    public final EObject entryRuleDeprecatedSection() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDeprecatedSection = null;
+
+
+        try {
+            // InternalSEW.g:3876:58: (iv_ruleDeprecatedSection= ruleDeprecatedSection EOF )
+            // InternalSEW.g:3877:2: iv_ruleDeprecatedSection= ruleDeprecatedSection EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDeprecatedSectionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDeprecatedSection=ruleDeprecatedSection();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDeprecatedSection; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDeprecatedSection"
+
+
+    // $ANTLR start "ruleDeprecatedSection"
+    // InternalSEW.g:3883:1: ruleDeprecatedSection returns [EObject current=null] : ( ( () otherlv_1= 'section' ( (lv_name_2_0= ruleXID ) ) ( ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) ) )* otherlv_4= 'endsection' ( ruleXID )? ) | ( ( (lv_name_6_0= ruleXID ) ) ( (lv_description_7_0= ruleEString ) )? ( (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' ) | (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* ) ) ) ) ;
+    public final EObject ruleDeprecatedSection() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_4=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        EObject lv_element_3_1 = null;
+
+        EObject lv_element_3_2 = null;
+
+        EObject lv_element_3_3 = null;
+
+        AntlrDatatypeRuleToken lv_name_6_0 = null;
+
+        AntlrDatatypeRuleToken lv_description_7_0 = null;
+
+        EObject lv_element_9_1 = null;
+
+        EObject lv_element_9_2 = null;
+
+        EObject lv_element_9_3 = null;
+
+        EObject lv_element_12_1 = null;
+
+        EObject lv_element_12_2 = null;
+
+        EObject lv_element_12_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:3889:2: ( ( ( () otherlv_1= 'section' ( (lv_name_2_0= ruleXID ) ) ( ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) ) )* otherlv_4= 'endsection' ( ruleXID )? ) | ( ( (lv_name_6_0= ruleXID ) ) ( (lv_description_7_0= ruleEString ) )? ( (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' ) | (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* ) ) ) ) )
+            // InternalSEW.g:3890:2: ( ( () otherlv_1= 'section' ( (lv_name_2_0= ruleXID ) ) ( ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) ) )* otherlv_4= 'endsection' ( ruleXID )? ) | ( ( (lv_name_6_0= ruleXID ) ) ( (lv_description_7_0= ruleEString ) )? ( (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' ) | (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* ) ) ) )
+            {
+            // InternalSEW.g:3890:2: ( ( () otherlv_1= 'section' ( (lv_name_2_0= ruleXID ) ) ( ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) ) )* otherlv_4= 'endsection' ( ruleXID )? ) | ( ( (lv_name_6_0= ruleXID ) ) ( (lv_description_7_0= ruleEString ) )? ( (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' ) | (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* ) ) ) )
+            int alt89=2;
+            int LA89_0 = input.LA(1);
+
+            if ( (LA89_0==73) ) {
+                int LA89_1 = input.LA(2);
+
+                if ( (LA89_1==RULE_STRING||LA89_1==28||LA89_1==30) ) {
+                    alt89=2;
+                }
+                else if ( (LA89_1==RULE_XIDENDIFIER||LA89_1==14||LA89_1==21||(LA89_1>=69 && LA89_1<=74)) ) {
+                    alt89=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 89, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( (LA89_0==RULE_XIDENDIFIER||LA89_0==14||LA89_0==21||(LA89_0>=69 && LA89_0<=72)||LA89_0==74) ) {
+                alt89=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 89, 0, input);
+
+                throw nvae;
+            }
+            switch (alt89) {
+                case 1 :
+                    // InternalSEW.g:3891:3: ( () otherlv_1= 'section' ( (lv_name_2_0= ruleXID ) ) ( ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) ) )* otherlv_4= 'endsection' ( ruleXID )? )
+                    {
+                    // InternalSEW.g:3891:3: ( () otherlv_1= 'section' ( (lv_name_2_0= ruleXID ) ) ( ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) ) )* otherlv_4= 'endsection' ( ruleXID )? )
+                    // InternalSEW.g:3892:4: () otherlv_1= 'section' ( (lv_name_2_0= ruleXID ) ) ( ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) ) )* otherlv_4= 'endsection' ( ruleXID )?
+                    {
+                    // InternalSEW.g:3892:4: ()
+                    // InternalSEW.g:3893:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getDeprecatedSectionAccess().getWSectionAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    otherlv_1=(Token)match(input,73,FollowSets000.FOLLOW_12); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getDeprecatedSectionAccess().getSectionKeyword_0_1());
+                      			
+                    }
+                    // InternalSEW.g:3906:4: ( (lv_name_2_0= ruleXID ) )
+                    // InternalSEW.g:3907:5: (lv_name_2_0= ruleXID )
+                    {
+                    // InternalSEW.g:3907:5: (lv_name_2_0= ruleXID )
+                    // InternalSEW.g:3908:6: lv_name_2_0= ruleXID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_0_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_52);
+                    lv_name_2_0=ruleXID();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"name",
+                      							lv_name_2_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.XID");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:3925:4: ( ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) ) )*
+                    loop81:
+                    do {
+                        int alt81=2;
+                        alt81 = dfa81.predict(input);
+                        switch (alt81) {
+                    	case 1 :
+                    	    // InternalSEW.g:3926:5: ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) )
+                    	    {
+                    	    // InternalSEW.g:3926:5: ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) )
+                    	    // InternalSEW.g:3927:6: (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject )
+                    	    {
+                    	    // InternalSEW.g:3927:6: (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject )
+                    	    int alt80=3;
+                    	    alt80 = dfa80.predict(input);
+                    	    switch (alt80) {
+                    	        case 1 :
+                    	            // InternalSEW.g:3928:7: lv_element_3_1= ruleDeprecatedAttribute
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_0_3_0_0());
+                    	              						
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_52);
+                    	            lv_element_3_1=ruleDeprecatedAttribute();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							if (current==null) {
+                    	              								current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                    	              							}
+                    	              							add(
+                    	              								current,
+                    	              								"element",
+                    	              								lv_element_3_1,
+                    	              								"org.eclipse.efm.sew.xtext.SEW.DeprecatedAttribute");
+                    	              							afterParserOrEnumRuleCall();
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalSEW.g:3944:7: lv_element_3_2= ruleDeprecatedObject
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_0_3_0_1());
+                    	              						
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_52);
+                    	            lv_element_3_2=ruleDeprecatedObject();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							if (current==null) {
+                    	              								current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                    	              							}
+                    	              							add(
+                    	              								current,
+                    	              								"element",
+                    	              								lv_element_3_2,
+                    	              								"org.eclipse.efm.sew.xtext.SEW.DeprecatedObject");
+                    	              							afterParserOrEnumRuleCall();
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 3 :
+                    	            // InternalSEW.g:3960:7: lv_element_3_3= ruleObject
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_0_3_0_2());
+                    	              						
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_52);
+                    	            lv_element_3_3=ruleObject();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							if (current==null) {
+                    	              								current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                    	              							}
+                    	              							add(
+                    	              								current,
+                    	              								"element",
+                    	              								lv_element_3_3,
+                    	              								"org.eclipse.efm.sew.xtext.SEW.Object");
+                    	              							afterParserOrEnumRuleCall();
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop81;
+                        }
+                    } while (true);
+
+                    otherlv_4=(Token)match(input,74,FollowSets000.FOLLOW_20); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getDeprecatedSectionAccess().getEndsectionKeyword_0_4());
+                      			
+                    }
+                    // InternalSEW.g:3982:4: ( ruleXID )?
+                    int alt82=2;
+                    alt82 = dfa82.predict(input);
+                    switch (alt82) {
+                        case 1 :
+                            // InternalSEW.g:3983:5: ruleXID
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              					/* */
+                              				
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              					newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getXIDParserRuleCall_0_5());
+                              				
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            ruleXID();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					afterParserOrEnumRuleCall();
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:3996:3: ( ( (lv_name_6_0= ruleXID ) ) ( (lv_description_7_0= ruleEString ) )? ( (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' ) | (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* ) ) )
+                    {
+                    // InternalSEW.g:3996:3: ( ( (lv_name_6_0= ruleXID ) ) ( (lv_description_7_0= ruleEString ) )? ( (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' ) | (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* ) ) )
+                    // InternalSEW.g:3997:4: ( (lv_name_6_0= ruleXID ) ) ( (lv_description_7_0= ruleEString ) )? ( (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' ) | (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* ) )
+                    {
+                    // InternalSEW.g:3997:4: ( (lv_name_6_0= ruleXID ) )
+                    // InternalSEW.g:3998:5: (lv_name_6_0= ruleXID )
+                    {
+                    // InternalSEW.g:3998:5: (lv_name_6_0= ruleXID )
+                    // InternalSEW.g:3999:6: lv_name_6_0= ruleXID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getNameXIDParserRuleCall_1_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_17);
+                    lv_name_6_0=ruleXID();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"name",
+                      							lv_name_6_0,
+                      							"org.eclipse.efm.sew.xtext.SEW.XID");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalSEW.g:4016:4: ( (lv_description_7_0= ruleEString ) )?
+                    int alt83=2;
+                    int LA83_0 = input.LA(1);
+
+                    if ( (LA83_0==RULE_STRING) ) {
+                        alt83=1;
+                    }
+                    switch (alt83) {
+                        case 1 :
+                            // InternalSEW.g:4017:5: (lv_description_7_0= ruleEString )
+                            {
+                            // InternalSEW.g:4017:5: (lv_description_7_0= ruleEString )
+                            // InternalSEW.g:4018:6: lv_description_7_0= ruleEString
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getDescriptionEStringParserRuleCall_1_1_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_18);
+                            lv_description_7_0=ruleEString();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                              						}
+                              						set(
+                              							current,
+                              							"description",
+                              							lv_description_7_0,
+                              							"org.eclipse.efm.sew.xtext.SEW.EString");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalSEW.g:4035:4: ( (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' ) | (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* ) )
+                    int alt88=2;
+                    int LA88_0 = input.LA(1);
+
+                    if ( (LA88_0==28) ) {
+                        alt88=1;
+                    }
+                    else if ( (LA88_0==30) ) {
+                        alt88=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 88, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt88) {
+                        case 1 :
+                            // InternalSEW.g:4036:5: (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' )
+                            {
+                            // InternalSEW.g:4036:5: (otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']' )
+                            // InternalSEW.g:4037:6: otherlv_8= '[' ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )* otherlv_10= ']'
+                            {
+                            otherlv_8=(Token)match(input,28,FollowSets000.FOLLOW_53); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_8, grammarAccess.getDeprecatedSectionAccess().getLeftSquareBracketKeyword_1_2_0_0());
+                              					
+                            }
+                            // InternalSEW.g:4041:6: ( ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) ) )*
+                            loop85:
+                            do {
+                                int alt85=2;
+                                int LA85_0 = input.LA(1);
+
+                                if ( (LA85_0==RULE_XIDENDIFIER||LA85_0==RULE_AT_IDENTIFIER||LA85_0==14||LA85_0==21||(LA85_0>=69 && LA85_0<=74)) ) {
+                                    alt85=1;
+                                }
+
+
+                                switch (alt85) {
+                            	case 1 :
+                            	    // InternalSEW.g:4042:7: ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) )
+                            	    {
+                            	    // InternalSEW.g:4042:7: ( (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject ) )
+                            	    // InternalSEW.g:4043:8: (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject )
+                            	    {
+                            	    // InternalSEW.g:4043:8: (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject )
+                            	    int alt84=3;
+                            	    alt84 = dfa84.predict(input);
+                            	    switch (alt84) {
+                            	        case 1 :
+                            	            // InternalSEW.g:4044:9: lv_element_9_1= ruleDeprecatedAttribute
+                            	            {
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_0_1_0_0());
+                            	              								
+                            	            }
+                            	            pushFollow(FollowSets000.FOLLOW_53);
+                            	            lv_element_9_1=ruleDeprecatedAttribute();
+
+                            	            state._fsp--;
+                            	            if (state.failed) return current;
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									if (current==null) {
+                            	              										current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                            	              									}
+                            	              									add(
+                            	              										current,
+                            	              										"element",
+                            	              										lv_element_9_1,
+                            	              										"org.eclipse.efm.sew.xtext.SEW.DeprecatedAttribute");
+                            	              									afterParserOrEnumRuleCall();
+                            	              								
+                            	            }
+
+                            	            }
+                            	            break;
+                            	        case 2 :
+                            	            // InternalSEW.g:4060:9: lv_element_9_2= ruleDeprecatedObject
+                            	            {
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_0_1_0_1());
+                            	              								
+                            	            }
+                            	            pushFollow(FollowSets000.FOLLOW_53);
+                            	            lv_element_9_2=ruleDeprecatedObject();
+
+                            	            state._fsp--;
+                            	            if (state.failed) return current;
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									if (current==null) {
+                            	              										current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                            	              									}
+                            	              									add(
+                            	              										current,
+                            	              										"element",
+                            	              										lv_element_9_2,
+                            	              										"org.eclipse.efm.sew.xtext.SEW.DeprecatedObject");
+                            	              									afterParserOrEnumRuleCall();
+                            	              								
+                            	            }
+
+                            	            }
+                            	            break;
+                            	        case 3 :
+                            	            // InternalSEW.g:4076:9: lv_element_9_3= ruleObject
+                            	            {
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_0_1_0_2());
+                            	              								
+                            	            }
+                            	            pushFollow(FollowSets000.FOLLOW_53);
+                            	            lv_element_9_3=ruleObject();
+
+                            	            state._fsp--;
+                            	            if (state.failed) return current;
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									if (current==null) {
+                            	              										current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                            	              									}
+                            	              									add(
+                            	              										current,
+                            	              										"element",
+                            	              										lv_element_9_3,
+                            	              										"org.eclipse.efm.sew.xtext.SEW.Object");
+                            	              									afterParserOrEnumRuleCall();
+                            	              								
+                            	            }
+
+                            	            }
+                            	            break;
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop85;
+                                }
+                            } while (true);
+
+                            otherlv_10=(Token)match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_10, grammarAccess.getDeprecatedSectionAccess().getRightSquareBracketKeyword_1_2_0_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalSEW.g:4100:5: (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* )
+                            {
+                            // InternalSEW.g:4100:5: (otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )* )
+                            // InternalSEW.g:4101:6: otherlv_11= ':' ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )*
+                            {
+                            otherlv_11=(Token)match(input,30,FollowSets000.FOLLOW_54); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_11, grammarAccess.getDeprecatedSectionAccess().getColonKeyword_1_2_1_0());
+                              					
+                            }
+                            // InternalSEW.g:4105:6: ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )*
+                            loop87:
+                            do {
+                                int alt87=2;
+                                alt87 = dfa87.predict(input);
+                                switch (alt87) {
+                            	case 1 :
+                            	    // InternalSEW.g:4106:7: ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) )
+                            	    {
+                            	    // InternalSEW.g:4106:7: ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) )
+                            	    // InternalSEW.g:4107:8: (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject )
+                            	    {
+                            	    // InternalSEW.g:4107:8: (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject )
+                            	    int alt86=3;
+                            	    alt86 = dfa86.predict(input);
+                            	    switch (alt86) {
+                            	        case 1 :
+                            	            // InternalSEW.g:4108:9: lv_element_12_1= ruleDeprecatedAttribute
+                            	            {
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedAttributeParserRuleCall_1_2_1_1_0_0());
+                            	              								
+                            	            }
+                            	            pushFollow(FollowSets000.FOLLOW_54);
+                            	            lv_element_12_1=ruleDeprecatedAttribute();
+
+                            	            state._fsp--;
+                            	            if (state.failed) return current;
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									if (current==null) {
+                            	              										current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                            	              									}
+                            	              									add(
+                            	              										current,
+                            	              										"element",
+                            	              										lv_element_12_1,
+                            	              										"org.eclipse.efm.sew.xtext.SEW.DeprecatedAttribute");
+                            	              									afterParserOrEnumRuleCall();
+                            	              								
+                            	            }
+
+                            	            }
+                            	            break;
+                            	        case 2 :
+                            	            // InternalSEW.g:4124:9: lv_element_12_2= ruleDeprecatedObject
+                            	            {
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementDeprecatedObjectParserRuleCall_1_2_1_1_0_1());
+                            	              								
+                            	            }
+                            	            pushFollow(FollowSets000.FOLLOW_54);
+                            	            lv_element_12_2=ruleDeprecatedObject();
+
+                            	            state._fsp--;
+                            	            if (state.failed) return current;
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									if (current==null) {
+                            	              										current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                            	              									}
+                            	              									add(
+                            	              										current,
+                            	              										"element",
+                            	              										lv_element_12_2,
+                            	              										"org.eclipse.efm.sew.xtext.SEW.DeprecatedObject");
+                            	              									afterParserOrEnumRuleCall();
+                            	              								
+                            	            }
+
+                            	            }
+                            	            break;
+                            	        case 3 :
+                            	            // InternalSEW.g:4140:9: lv_element_12_3= ruleObject
+                            	            {
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_1_1_0_2());
+                            	              								
+                            	            }
+                            	            pushFollow(FollowSets000.FOLLOW_54);
+                            	            lv_element_12_3=ruleObject();
+
+                            	            state._fsp--;
+                            	            if (state.failed) return current;
+                            	            if ( state.backtracking==0 ) {
+
+                            	              									if (current==null) {
+                            	              										current = createModelElementForParent(grammarAccess.getDeprecatedSectionRule());
+                            	              									}
+                            	              									add(
+                            	              										current,
+                            	              										"element",
+                            	              										lv_element_12_3,
+                            	              										"org.eclipse.efm.sew.xtext.SEW.Object");
+                            	              									afterParserOrEnumRuleCall();
+                            	              								
+                            	            }
+
+                            	            }
+                            	            break;
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop87;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDeprecatedSection"
+
+
+    // $ANTLR start "entryRuleDeprecatedAttribute"
+    // InternalSEW.g:4165:1: entryRuleDeprecatedAttribute returns [EObject current=null] : iv_ruleDeprecatedAttribute= ruleDeprecatedAttribute EOF ;
+    public final EObject entryRuleDeprecatedAttribute() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDeprecatedAttribute = null;
+
+
+        try {
+            // InternalSEW.g:4165:60: (iv_ruleDeprecatedAttribute= ruleDeprecatedAttribute EOF )
+            // InternalSEW.g:4166:2: iv_ruleDeprecatedAttribute= ruleDeprecatedAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDeprecatedAttributeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDeprecatedAttribute=ruleDeprecatedAttribute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDeprecatedAttribute; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDeprecatedAttribute"
+
+
+    // $ANTLR start "ruleDeprecatedAttribute"
+    // InternalSEW.g:4172:1: ruleDeprecatedAttribute returns [EObject current=null] : ( () ( (lv_name_1_0= ruleDeprecatedAttributeID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )? ) ;
+    public final EObject ruleDeprecatedAttribute() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        EObject lv_value_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:4178:2: ( ( () ( (lv_name_1_0= ruleDeprecatedAttributeID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )? ) )
+            // InternalSEW.g:4179:2: ( () ( (lv_name_1_0= ruleDeprecatedAttributeID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )? )
+            {
+            // InternalSEW.g:4179:2: ( () ( (lv_name_1_0= ruleDeprecatedAttributeID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )? )
+            // InternalSEW.g:4180:3: () ( (lv_name_1_0= ruleDeprecatedAttributeID ) ) otherlv_2= '=' ( (lv_value_3_0= ruleValueSpecification ) ) (otherlv_4= ';' )?
+            {
+            // InternalSEW.g:4180:3: ()
+            // InternalSEW.g:4181:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getDeprecatedAttributeAccess().getWAttributeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalSEW.g:4190:3: ( (lv_name_1_0= ruleDeprecatedAttributeID ) )
+            // InternalSEW.g:4191:4: (lv_name_1_0= ruleDeprecatedAttributeID )
+            {
+            // InternalSEW.g:4191:4: (lv_name_1_0= ruleDeprecatedAttributeID )
+            // InternalSEW.g:4192:5: lv_name_1_0= ruleDeprecatedAttributeID
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getDeprecatedAttributeAccess().getNameDeprecatedAttributeIDParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_21);
+            lv_name_1_0=ruleDeprecatedAttributeID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getDeprecatedAttributeRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.sew.xtext.SEW.DeprecatedAttributeID");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,31,FollowSets000.FOLLOW_22); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getDeprecatedAttributeAccess().getEqualsSignKeyword_2());
+              		
+            }
+            // InternalSEW.g:4213:3: ( (lv_value_3_0= ruleValueSpecification ) )
+            // InternalSEW.g:4214:4: (lv_value_3_0= ruleValueSpecification )
+            {
+            // InternalSEW.g:4214:4: (lv_value_3_0= ruleValueSpecification )
+            // InternalSEW.g:4215:5: lv_value_3_0= ruleValueSpecification
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getDeprecatedAttributeAccess().getValueValueSpecificationParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_23);
+            lv_value_3_0=ruleValueSpecification();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getDeprecatedAttributeRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_3_0,
+              						"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalSEW.g:4232:3: (otherlv_4= ';' )?
+            int alt90=2;
+            int LA90_0 = input.LA(1);
+
+            if ( (LA90_0==32) ) {
+                alt90=1;
+            }
+            switch (alt90) {
+                case 1 :
+                    // InternalSEW.g:4233:4: otherlv_4= ';'
+                    {
+                    otherlv_4=(Token)match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getDeprecatedAttributeAccess().getSemicolonKeyword_4());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDeprecatedAttribute"
+
+
+    // $ANTLR start "entryRuleDeprecatedAttributeID"
+    // InternalSEW.g:4242:1: entryRuleDeprecatedAttributeID returns [String current=null] : iv_ruleDeprecatedAttributeID= ruleDeprecatedAttributeID EOF ;
+    public final String entryRuleDeprecatedAttributeID() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleDeprecatedAttributeID = null;
+
+
+        try {
+            // InternalSEW.g:4242:61: (iv_ruleDeprecatedAttributeID= ruleDeprecatedAttributeID EOF )
+            // InternalSEW.g:4243:2: iv_ruleDeprecatedAttributeID= ruleDeprecatedAttributeID EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDeprecatedAttributeIDRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDeprecatedAttributeID=ruleDeprecatedAttributeID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDeprecatedAttributeID.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDeprecatedAttributeID"
+
+
+    // $ANTLR start "ruleDeprecatedAttributeID"
+    // InternalSEW.g:4249:1: ruleDeprecatedAttributeID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_XID_0= ruleXID | this_AT_IDENTIFIER_1= RULE_AT_IDENTIFIER ) ;
+    public final AntlrDatatypeRuleToken ruleDeprecatedAttributeID() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_AT_IDENTIFIER_1=null;
+        AntlrDatatypeRuleToken this_XID_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:4255:2: ( (this_XID_0= ruleXID | this_AT_IDENTIFIER_1= RULE_AT_IDENTIFIER ) )
+            // InternalSEW.g:4256:2: (this_XID_0= ruleXID | this_AT_IDENTIFIER_1= RULE_AT_IDENTIFIER )
+            {
+            // InternalSEW.g:4256:2: (this_XID_0= ruleXID | this_AT_IDENTIFIER_1= RULE_AT_IDENTIFIER )
+            int alt91=2;
+            int LA91_0 = input.LA(1);
+
+            if ( (LA91_0==RULE_XIDENDIFIER||LA91_0==14||LA91_0==21||(LA91_0>=69 && LA91_0<=74)) ) {
+                alt91=1;
+            }
+            else if ( (LA91_0==RULE_AT_IDENTIFIER) ) {
+                alt91=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 91, 0, input);
+
+                throw nvae;
+            }
+            switch (alt91) {
+                case 1 :
+                    // InternalSEW.g:4257:3: this_XID_0= ruleXID
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDeprecatedAttributeIDAccess().getXIDParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_XID_0=ruleXID();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(this_XID_0);
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:4268:3: this_AT_IDENTIFIER_1= RULE_AT_IDENTIFIER
+                    {
+                    this_AT_IDENTIFIER_1=(Token)match(input,RULE_AT_IDENTIFIER,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(this_AT_IDENTIFIER_1);
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newLeafNode(this_AT_IDENTIFIER_1, grammarAccess.getDeprecatedAttributeIDAccess().getAT_IDENTIFIERTerminalRuleCall_1());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDeprecatedAttributeID"
+
+
+    // $ANTLR start "entryRuleDeprecatedExpression"
+    // InternalSEW.g:4279:1: entryRuleDeprecatedExpression returns [EObject current=null] : iv_ruleDeprecatedExpression= ruleDeprecatedExpression EOF ;
+    public final EObject entryRuleDeprecatedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDeprecatedExpression = null;
+
+
+        try {
+            // InternalSEW.g:4279:61: (iv_ruleDeprecatedExpression= ruleDeprecatedExpression EOF )
+            // InternalSEW.g:4280:2: iv_ruleDeprecatedExpression= ruleDeprecatedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDeprecatedExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDeprecatedExpression=ruleDeprecatedExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDeprecatedExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDeprecatedExpression"
+
+
+    // $ANTLR start "ruleDeprecatedExpression"
+    // InternalSEW.g:4286:1: ruleDeprecatedExpression returns [EObject current=null] : ( () otherlv_1= '${' ( ( (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' ) ) ) ( (lv_operand_3_0= ruleValueSpecification ) )* otherlv_4= '}' ) ;
+    public final EObject ruleDeprecatedExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_operator_2_1=null;
+        Token lv_operator_2_2=null;
+        Token otherlv_4=null;
+        EObject lv_operand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalSEW.g:4292:2: ( ( () otherlv_1= '${' ( ( (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' ) ) ) ( (lv_operand_3_0= ruleValueSpecification ) )* otherlv_4= '}' ) )
+            // InternalSEW.g:4293:2: ( () otherlv_1= '${' ( ( (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' ) ) ) ( (lv_operand_3_0= ruleValueSpecification ) )* otherlv_4= '}' )
+            {
+            // InternalSEW.g:4293:2: ( () otherlv_1= '${' ( ( (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' ) ) ) ( (lv_operand_3_0= ruleValueSpecification ) )* otherlv_4= '}' )
+            // InternalSEW.g:4294:3: () otherlv_1= '${' ( ( (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' ) ) ) ( (lv_operand_3_0= ruleValueSpecification ) )* otherlv_4= '}'
+            {
+            // InternalSEW.g:4294:3: ()
+            // InternalSEW.g:4295:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getDeprecatedExpressionAccess().getExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,77,FollowSets000.FOLLOW_55); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getDeprecatedExpressionAccess().getDollarSignLeftCurlyBracketKeyword_1());
+              		
+            }
+            // InternalSEW.g:4308:3: ( ( (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' ) ) )
+            // InternalSEW.g:4309:4: ( (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' ) )
+            {
+            // InternalSEW.g:4309:4: ( (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' ) )
+            // InternalSEW.g:4310:5: (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' )
+            {
+            // InternalSEW.g:4310:5: (lv_operator_2_1= '|;|' | lv_operator_2_2= '|i|' )
+            int alt92=2;
+            int LA92_0 = input.LA(1);
+
+            if ( (LA92_0==78) ) {
+                alt92=1;
+            }
+            else if ( (LA92_0==79) ) {
+                alt92=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 92, 0, input);
+
+                throw nvae;
+            }
+            switch (alt92) {
+                case 1 :
+                    // InternalSEW.g:4311:6: lv_operator_2_1= '|;|'
+                    {
+                    lv_operator_2_1=(Token)match(input,78,FollowSets000.FOLLOW_56); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_2_1, grammarAccess.getDeprecatedExpressionAccess().getOperatorVerticalLineSemicolonVerticalLineKeyword_2_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getDeprecatedExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_2_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalSEW.g:4322:6: lv_operator_2_2= '|i|'
+                    {
+                    lv_operator_2_2=(Token)match(input,79,FollowSets000.FOLLOW_56); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_2_2, grammarAccess.getDeprecatedExpressionAccess().getOperatorIKeyword_2_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getDeprecatedExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_2_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalSEW.g:4335:3: ( (lv_operand_3_0= ruleValueSpecification ) )*
+            loop93:
+            do {
+                int alt93=2;
+                int LA93_0 = input.LA(1);
+
+                if ( ((LA93_0>=RULE_XIDENDIFIER && LA93_0<=RULE_STRING)||LA93_0==14||LA93_0==21||LA93_0==25||LA93_0==28||LA93_0==46||(LA93_0>=51 && LA93_0<=54)||(LA93_0>=56 && LA93_0<=74)||LA93_0==77) ) {
+                    alt93=1;
+                }
+
+
+                switch (alt93) {
+            	case 1 :
+            	    // InternalSEW.g:4336:4: (lv_operand_3_0= ruleValueSpecification )
+            	    {
+            	    // InternalSEW.g:4336:4: (lv_operand_3_0= ruleValueSpecification )
+            	    // InternalSEW.g:4337:5: lv_operand_3_0= ruleValueSpecification
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getDeprecatedExpressionAccess().getOperandValueSpecificationParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_56);
+            	    lv_operand_3_0=ruleValueSpecification();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getDeprecatedExpressionRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"operand",
+            	      						lv_operand_3_0,
+            	      						"org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop93;
+                }
+            } while (true);
+
+            otherlv_4=(Token)match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getDeprecatedExpressionAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDeprecatedExpression"
+
+    // $ANTLR start synpred34_InternalSEW
+    public final void synpred34_InternalSEW_fragment() throws RecognitionException {   
+        EObject lv_element_6_1 = null;
+
+        EObject lv_element_6_2 = null;
+
+
+        // InternalSEW.g:899:6: ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )
+        // InternalSEW.g:899:6: ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) )
+        {
+        // InternalSEW.g:899:6: ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) )
+        // InternalSEW.g:900:7: (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute )
+        {
+        // InternalSEW.g:900:7: (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute )
+        int alt111=2;
+        alt111 = dfa111.predict(input);
+        switch (alt111) {
+            case 1 :
+                // InternalSEW.g:901:8: lv_element_6_1= ruleObject
+                {
+                pushFollow(FollowSets000.FOLLOW_2);
+                lv_element_6_1=ruleObject();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalSEW.g:917:8: lv_element_6_2= ruleAttribute
+                {
+                if ( state.backtracking==0 ) {
+
+                  								newCompositeNode(grammarAccess.getSectionAccess().getElementAttributeParserRuleCall_2_1_1_0_1());
+                  							
+                }
+                pushFollow(FollowSets000.FOLLOW_2);
+                lv_element_6_2=ruleAttribute();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred34_InternalSEW
+
+    // $ANTLR start synpred55_InternalSEW
+    public final void synpred55_InternalSEW_fragment() throws RecognitionException {   
+        Token otherlv_4=null;
+        EObject lv_operand_5_0 = null;
+
+
+        // InternalSEW.g:1728:5: (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )
+        // InternalSEW.g:1728:5: otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) )
+        {
+        otherlv_4=(Token)match(input,46,FollowSets000.FOLLOW_27); if (state.failed) return ;
+        // InternalSEW.g:1732:5: ( (lv_operand_5_0= rulemultiplicativeExpression ) )
+        // InternalSEW.g:1733:6: (lv_operand_5_0= rulemultiplicativeExpression )
+        {
+        // InternalSEW.g:1733:6: (lv_operand_5_0= rulemultiplicativeExpression )
+        // InternalSEW.g:1734:7: lv_operand_5_0= rulemultiplicativeExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_3_1_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_operand_5_0=rulemultiplicativeExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred55_InternalSEW
+
+    // $ANTLR start synpred56_InternalSEW
+    public final void synpred56_InternalSEW_fragment() throws RecognitionException {   
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+
+        // InternalSEW.g:1684:4: ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )* )
+        // InternalSEW.g:1684:4: () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )*
+        {
+        // InternalSEW.g:1684:4: ()
+        // InternalSEW.g:1685:5: 
+        {
+        if ( state.backtracking==0 ) {
+
+          					/* */
+          				
+        }
+
+        }
+
+        // InternalSEW.g:1694:4: ( (lv_operator_2_0= '+' ) )
+        // InternalSEW.g:1695:5: (lv_operator_2_0= '+' )
+        {
+        // InternalSEW.g:1695:5: (lv_operator_2_0= '+' )
+        // InternalSEW.g:1696:6: lv_operator_2_0= '+'
+        {
+        lv_operator_2_0=(Token)match(input,46,FollowSets000.FOLLOW_27); if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalSEW.g:1708:4: ( (lv_operand_3_0= rulemultiplicativeExpression ) )
+        // InternalSEW.g:1709:5: (lv_operand_3_0= rulemultiplicativeExpression )
+        {
+        // InternalSEW.g:1709:5: (lv_operand_3_0= rulemultiplicativeExpression )
+        // InternalSEW.g:1710:6: lv_operand_3_0= rulemultiplicativeExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_2_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_31);
+        lv_operand_3_0=rulemultiplicativeExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalSEW.g:1727:4: (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )*
+        loop122:
+        do {
+            int alt122=2;
+            int LA122_0 = input.LA(1);
+
+            if ( (LA122_0==46) ) {
+                alt122=1;
+            }
+
+
+            switch (alt122) {
+        	case 1 :
+        	    // InternalSEW.g:1728:5: otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) )
+        	    {
+        	    otherlv_4=(Token)match(input,46,FollowSets000.FOLLOW_27); if (state.failed) return ;
+        	    // InternalSEW.g:1732:5: ( (lv_operand_5_0= rulemultiplicativeExpression ) )
+        	    // InternalSEW.g:1733:6: (lv_operand_5_0= rulemultiplicativeExpression )
+        	    {
+        	    // InternalSEW.g:1733:6: (lv_operand_5_0= rulemultiplicativeExpression )
+        	    // InternalSEW.g:1734:7: lv_operand_5_0= rulemultiplicativeExpression
+        	    {
+        	    if ( state.backtracking==0 ) {
+
+        	      							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_3_1_0());
+        	      						
+        	    }
+        	    pushFollow(FollowSets000.FOLLOW_31);
+        	    lv_operand_5_0=rulemultiplicativeExpression();
+
+        	    state._fsp--;
+        	    if (state.failed) return ;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+
+        	default :
+        	    break loop122;
+            }
+        } while (true);
+
+
+        }
+    }
+    // $ANTLR end synpred56_InternalSEW
+
+    // $ANTLR start synpred66_InternalSEW
+    public final void synpred66_InternalSEW_fragment() throws RecognitionException {   
+        Token lv_operator_3_0=null;
+        EObject lv_operand_4_0 = null;
+
+
+        // InternalSEW.g:2105:3: ( ( () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) ) ) )
+        // InternalSEW.g:2105:3: ( () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) ) )
+        {
+        // InternalSEW.g:2105:3: ( () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) ) )
+        // InternalSEW.g:2106:4: () ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) )
+        {
+        // InternalSEW.g:2106:4: ()
+        // InternalSEW.g:2107:5: 
+        {
+        if ( state.backtracking==0 ) {
+
+          					/* */
+          				
+        }
+
+        }
+
+        // InternalSEW.g:2116:4: ( ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) ) )
+        // InternalSEW.g:2117:5: ( (lv_operator_3_0= '-' ) ) ( (lv_operand_4_0= ruleprimaryExpression ) )
+        {
+        // InternalSEW.g:2117:5: ( (lv_operator_3_0= '-' ) )
+        // InternalSEW.g:2118:6: (lv_operator_3_0= '-' )
+        {
+        // InternalSEW.g:2118:6: (lv_operator_3_0= '-' )
+        // InternalSEW.g:2119:7: lv_operator_3_0= '-'
+        {
+        lv_operator_3_0=(Token)match(input,51,FollowSets000.FOLLOW_27); if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalSEW.g:2131:5: ( (lv_operand_4_0= ruleprimaryExpression ) )
+        // InternalSEW.g:2132:6: (lv_operand_4_0= ruleprimaryExpression )
+        {
+        // InternalSEW.g:2132:6: (lv_operand_4_0= ruleprimaryExpression )
+        // InternalSEW.g:2133:7: lv_operand_4_0= ruleprimaryExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getOperandPrimaryExpressionParserRuleCall_1_1_1_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_operand_4_0=ruleprimaryExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred66_InternalSEW
+
+    // $ANTLR start synpred72_InternalSEW
+    public final void synpred72_InternalSEW_fragment() throws RecognitionException {   
+        EObject this_LiteralIntegerValue_2 = null;
+
+
+        // InternalSEW.g:2290:3: (this_LiteralIntegerValue_2= ruleLiteralIntegerValue )
+        // InternalSEW.g:2290:3: this_LiteralIntegerValue_2= ruleLiteralIntegerValue
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_LiteralIntegerValue_2=ruleLiteralIntegerValue();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred72_InternalSEW
+
+    // $ANTLR start synpred74_InternalSEW
+    public final void synpred74_InternalSEW_fragment() throws RecognitionException {   
+        EObject this_LiteralFloatValue_4 = null;
+
+
+        // InternalSEW.g:2314:3: (this_LiteralFloatValue_4= ruleLiteralFloatValue )
+        // InternalSEW.g:2314:3: this_LiteralFloatValue_4= ruleLiteralFloatValue
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_LiteralFloatValue_4=ruleLiteralFloatValue();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred74_InternalSEW
+
+    // $ANTLR start synpred83_InternalSEW
+    public final void synpred83_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:2506:4: ( ( ( ruleUFI ) ) )
+        // InternalSEW.g:2506:4: ( ( ruleUFI ) )
+        {
+        // InternalSEW.g:2506:4: ( ( ruleUFI ) )
+        // InternalSEW.g:2507:5: ( ruleUFI )
+        {
+        // InternalSEW.g:2507:5: ( ruleUFI )
+        // InternalSEW.g:2508:6: ruleUFI
+        {
+        if ( state.backtracking==0 ) {
+
+          						/* */
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleUFI();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred83_InternalSEW
+
+    // $ANTLR start synpred113_InternalSEW
+    public final void synpred113_InternalSEW_fragment() throws RecognitionException {   
+        // InternalSEW.g:3983:5: ( ruleXID )
+        // InternalSEW.g:3983:5: ruleXID
+        {
+        if ( state.backtracking==0 ) {
+
+          					/* */
+          				
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleXID();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred113_InternalSEW
+
+    // $ANTLR start synpred122_InternalSEW
+    public final void synpred122_InternalSEW_fragment() throws RecognitionException {   
+        EObject lv_element_12_1 = null;
+
+        EObject lv_element_12_2 = null;
+
+        EObject lv_element_12_3 = null;
+
+
+        // InternalSEW.g:4106:7: ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )
+        // InternalSEW.g:4106:7: ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) )
+        {
+        // InternalSEW.g:4106:7: ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) )
+        // InternalSEW.g:4107:8: (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject )
+        {
+        // InternalSEW.g:4107:8: (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject )
+        int alt139=3;
+        alt139 = dfa139.predict(input);
+        switch (alt139) {
+            case 1 :
+                // InternalSEW.g:4108:9: lv_element_12_1= ruleDeprecatedAttribute
+                {
+                pushFollow(FollowSets000.FOLLOW_2);
+                lv_element_12_1=ruleDeprecatedAttribute();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalSEW.g:4124:9: lv_element_12_2= ruleDeprecatedObject
+                {
+                pushFollow(FollowSets000.FOLLOW_2);
+                lv_element_12_2=ruleDeprecatedObject();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+                break;
+            case 3 :
+                // InternalSEW.g:4140:9: lv_element_12_3= ruleObject
+                {
+                if ( state.backtracking==0 ) {
+
+                  									newCompositeNode(grammarAccess.getDeprecatedSectionAccess().getElementObjectParserRuleCall_1_2_1_1_0_2());
+                  								
+                }
+                pushFollow(FollowSets000.FOLLOW_2);
+                lv_element_12_3=ruleObject();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred122_InternalSEW
+
+    // Delegated rules
+
+    public final boolean synpred122_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred122_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred56_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred56_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred66_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred66_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred34_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred34_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred113_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred113_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred74_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred74_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred72_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred72_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred55_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred55_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred83_InternalSEW() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred83_InternalSEW_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+
+
+    protected DFA5 dfa5 = new DFA5(this);
+    protected DFA25 dfa25 = new DFA25(this);
+    protected DFA18 dfa18 = new DFA18(this);
+    protected DFA23 dfa23 = new DFA23(this);
+    protected DFA26 dfa26 = new DFA26(this);
+    protected DFA28 dfa28 = new DFA28(this);
+    protected DFA31 dfa31 = new DFA31(this);
+    protected DFA30 dfa30 = new DFA30(this);
+    protected DFA49 dfa49 = new DFA49(this);
+    protected DFA48 dfa48 = new DFA48(this);
+    protected DFA57 dfa57 = new DFA57(this);
+    protected DFA61 dfa61 = new DFA61(this);
+    protected DFA62 dfa62 = new DFA62(this);
+    protected DFA79 dfa79 = new DFA79(this);
+    protected DFA81 dfa81 = new DFA81(this);
+    protected DFA80 dfa80 = new DFA80(this);
+    protected DFA82 dfa82 = new DFA82(this);
+    protected DFA84 dfa84 = new DFA84(this);
+    protected DFA87 dfa87 = new DFA87(this);
+    protected DFA86 dfa86 = new DFA86(this);
+    protected DFA111 dfa111 = new DFA111(this);
+    protected DFA139 dfa139 = new DFA139(this);
+    static final String dfa_1s = "\15\uffff";
+    static final String dfa_2s = "\12\4\1\uffff\1\20\1\uffff";
+    static final String dfa_3s = "\12\112\1\uffff\1\36\1\uffff";
+    static final String dfa_4s = "\12\uffff\1\1\1\uffff\1\2";
+    static final String dfa_5s = "\15\uffff}>";
+    static final String[] dfa_6s = {
+            "\1\11\11\uffff\1\1\6\uffff\1\2\57\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\12\2\uffff\1\13\6\uffff\1\12\1\uffff\1\12\4\uffff\1\12\2\uffff\4\12\1\14\1\uffff\2\14\45\uffff\6\12",
+            "\1\12\2\uffff\1\13\6\uffff\1\12\1\uffff\1\12\4\uffff\1\12\2\uffff\4\12\1\14\1\uffff\2\14\45\uffff\6\12",
+            "\1\12\2\uffff\1\13\6\uffff\1\12\1\uffff\1\12\4\uffff\1\12\2\uffff\4\12\1\14\1\uffff\2\14\45\uffff\6\12",
+            "\1\12\2\uffff\1\13\6\uffff\1\12\1\uffff\1\12\4\uffff\1\12\2\uffff\4\12\1\14\1\uffff\2\14\45\uffff\6\12",
+            "\1\12\2\uffff\1\13\6\uffff\1\12\1\uffff\1\12\4\uffff\1\12\2\uffff\4\12\1\14\1\uffff\2\14\45\uffff\6\12",
+            "\1\12\2\uffff\1\13\6\uffff\1\12\1\uffff\1\12\4\uffff\1\12\2\uffff\4\12\1\14\1\uffff\2\14\45\uffff\6\12",
+            "\1\12\2\uffff\1\13\6\uffff\1\12\1\uffff\1\12\4\uffff\1\12\2\uffff\4\12\1\14\1\uffff\2\14\45\uffff\6\12",
+            "\1\12\2\uffff\1\13\6\uffff\1\12\1\uffff\1\12\4\uffff\1\12\2\uffff\4\12\1\14\1\uffff\2\14\45\uffff\6\12",
+            "\1\12\2\uffff\1\13\6\uffff\1\12\1\uffff\1\12\4\uffff\1\12\2\uffff\4\12\1\14\1\uffff\2\14\45\uffff\6\12",
+            "",
+            "\1\12\13\uffff\1\14\1\uffff\1\14",
+            ""
+    };
+
+    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
+    static final char[] dfa_2 = DFA.unpackEncodedStringToUnsignedChars(dfa_2s);
+    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
+    static final short[] dfa_4 = DFA.unpackEncodedString(dfa_4s);
+    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
+    static final short[][] dfa_6 = unpackEncodedStringArray(dfa_6s);
+
+    class DFA5 extends DFA {
+
+        public DFA5(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 5;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "189:7: (lv_element_6_1= ruleObject | lv_element_6_2= ruleProperty )";
+        }
+    }
+    static final String dfa_7s = "\27\uffff";
+    static final String dfa_8s = "\14\4\2\uffff\11\4";
+    static final String dfa_9s = "\14\112\2\uffff\11\112";
+    static final String dfa_10s = "\14\uffff\1\2\1\1\11\uffff";
+    static final String dfa_11s = "\27\uffff}>";
+    static final String[] dfa_12s = {
+            "\1\11\11\uffff\1\1\6\uffff\1\2\57\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\26\11\uffff\1\16\6\uffff\1\17\57\uffff\1\20\1\21\1\22\1\23\1\24\1\25",
+            "\1\26\11\uffff\1\16\6\uffff\1\17\57\uffff\1\20\1\21\1\22\1\23\1\24\1\25",
+            "",
+            "",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15",
+            "\1\15\2\uffff\1\15\6\uffff\1\15\1\uffff\1\15\4\uffff\1\15\2\uffff\1\12\1\13\2\14\51\uffff\6\15"
+    };
+
+    static final short[] dfa_7 = DFA.unpackEncodedString(dfa_7s);
+    static final char[] dfa_8 = DFA.unpackEncodedStringToUnsignedChars(dfa_8s);
+    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
+    static final short[] dfa_10 = DFA.unpackEncodedString(dfa_10s);
+    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
+    static final short[][] dfa_12 = unpackEncodedStringArray(dfa_12s);
+
+    class DFA25 extends DFA {
+
+        public DFA25(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 25;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_12;
+        }
+        public String getDescription() {
+            return "502:2: ( ( () ( (lv_type_1_0= ruleUFI ) ) ( (lv_name_2_0= ruleUFI ) )? ( (lv_description_3_0= ruleEString ) )? otherlv_4= '{' ( ( (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty ) ) )* otherlv_6= '}' ) | ( () ( (lv_name_8_0= ruleUFI ) ) (otherlv_9= ':=' | otherlv_10= '+:=' ) ( ( (lv_type_11_0= ruleUFI ) ) ( (lv_description_12_0= ruleEString ) )? )? otherlv_13= '{' ( ( (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty ) ) )* otherlv_15= '}' ) )";
+        }
+    }
+
+    class DFA18 extends DFA {
+
+        public DFA18(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 18;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "577:6: (lv_element_5_1= ruleObject | lv_element_5_2= ruleProperty )";
+        }
+    }
+
+    class DFA23 extends DFA {
+
+        public DFA23(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 23;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "705:6: (lv_element_14_1= ruleObject | lv_element_14_2= ruleProperty )";
+        }
+    }
+    static final String dfa_13s = "\14\uffff";
+    static final String dfa_14s = "\1\4\11\7\2\uffff";
+    static final String dfa_15s = "\1\112\11\37\2\uffff";
+    static final String dfa_16s = "\12\uffff\1\2\1\1";
+    static final String dfa_17s = "\14\uffff}>";
+    static final String[] dfa_18s = {
+            "\1\11\11\uffff\1\1\6\uffff\1\2\57\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "",
+            ""
+    };
+
+    static final short[] dfa_13 = DFA.unpackEncodedString(dfa_13s);
+    static final char[] dfa_14 = DFA.unpackEncodedStringToUnsignedChars(dfa_14s);
+    static final char[] dfa_15 = DFA.unpackEncodedStringToUnsignedChars(dfa_15s);
+    static final short[] dfa_16 = DFA.unpackEncodedString(dfa_16s);
+    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
+    static final short[][] dfa_18 = unpackEncodedStringArray(dfa_18s);
+
+    class DFA26 extends DFA {
+
+        public DFA26(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 26;
+            this.eot = dfa_13;
+            this.eof = dfa_13;
+            this.min = dfa_14;
+            this.max = dfa_15;
+            this.accept = dfa_16;
+            this.special = dfa_17;
+            this.transition = dfa_18;
+        }
+        public String getDescription() {
+            return "763:2: (this_Section_0= ruleSection | this_Attribute_1= ruleAttribute )";
+        }
+    }
+    static final String dfa_19s = "\12\4\2\uffff";
+    static final String dfa_20s = "\12\112\2\uffff";
+    static final String[] dfa_21s = {
+            "\1\11\11\uffff\1\1\6\uffff\1\2\57\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "",
+            ""
+    };
+    static final char[] dfa_19 = DFA.unpackEncodedStringToUnsignedChars(dfa_19s);
+    static final char[] dfa_20 = DFA.unpackEncodedStringToUnsignedChars(dfa_20s);
+    static final short[][] dfa_21 = unpackEncodedStringArray(dfa_21s);
+
+    class DFA28 extends DFA {
+
+        public DFA28(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 28;
+            this.eot = dfa_13;
+            this.eof = dfa_13;
+            this.min = dfa_19;
+            this.max = dfa_20;
+            this.accept = dfa_16;
+            this.special = dfa_17;
+            this.transition = dfa_21;
+        }
+        public String getDescription() {
+            return "852:7: (lv_element_3_1= ruleObject | lv_element_3_2= ruleAttribute )";
+        }
+    }
+    static final String dfa_22s = "\1\1\14\uffff";
+    static final String dfa_23s = "\1\4\1\uffff\11\0\2\uffff";
+    static final String dfa_24s = "\1\112\1\uffff\11\0\2\uffff";
+    static final String dfa_25s = "\1\uffff\1\2\12\uffff\1\1";
+    static final String dfa_26s = "\2\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\2\uffff}>";
+    static final String[] dfa_27s = {
+            "\1\12\11\uffff\1\2\2\uffff\1\1\3\uffff\1\3\57\uffff\1\4\1\5\1\6\1\7\1\10\1\11",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            ""
+    };
+    static final short[] dfa_22 = DFA.unpackEncodedString(dfa_22s);
+    static final char[] dfa_23 = DFA.unpackEncodedStringToUnsignedChars(dfa_23s);
+    static final char[] dfa_24 = DFA.unpackEncodedStringToUnsignedChars(dfa_24s);
+    static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
+    static final short[] dfa_26 = DFA.unpackEncodedString(dfa_26s);
+    static final short[][] dfa_27 = unpackEncodedStringArray(dfa_27s);
+
+    class DFA31 extends DFA {
+
+        public DFA31(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 31;
+            this.eot = dfa_1;
+            this.eof = dfa_22;
+            this.min = dfa_23;
+            this.max = dfa_24;
+            this.accept = dfa_25;
+            this.special = dfa_26;
+            this.transition = dfa_27;
+        }
+        public String getDescription() {
+            return "()* loopback of 898:5: ( ( (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA31_2 = input.LA(1);
+
+                         
+                        int index31_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index31_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA31_3 = input.LA(1);
+
+                         
+                        int index31_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index31_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA31_4 = input.LA(1);
+
+                         
+                        int index31_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index31_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA31_5 = input.LA(1);
+
+                         
+                        int index31_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index31_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA31_6 = input.LA(1);
+
+                         
+                        int index31_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index31_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA31_7 = input.LA(1);
+
+                         
+                        int index31_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index31_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA31_8 = input.LA(1);
+
+                         
+                        int index31_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index31_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA31_9 = input.LA(1);
+
+                         
+                        int index31_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index31_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA31_10 = input.LA(1);
+
+                         
+                        int index31_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred34_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index31_10);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 31, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA30 extends DFA {
+
+        public DFA30(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 30;
+            this.eot = dfa_13;
+            this.eof = dfa_13;
+            this.min = dfa_19;
+            this.max = dfa_20;
+            this.accept = dfa_16;
+            this.special = dfa_17;
+            this.transition = dfa_21;
+        }
+        public String getDescription() {
+            return "900:7: (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute )";
+        }
+    }
+    static final String dfa_28s = "\71\uffff";
+    static final String dfa_29s = "\1\2\70\uffff";
+    static final String dfa_30s = "\1\4\1\0\67\uffff";
+    static final String dfa_31s = "\1\115\1\0\67\uffff";
+    static final String dfa_32s = "\2\uffff\1\2\65\uffff\1\1";
+    static final String dfa_33s = "\1\uffff\1\0\67\uffff}>";
+    static final String[] dfa_34s = {
+            "\5\2\5\uffff\1\2\2\uffff\1\2\2\uffff\3\2\2\uffff\1\2\2\uffff\3\2\1\uffff\16\2\1\1\4\uffff\30\2\2\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_28 = DFA.unpackEncodedString(dfa_28s);
+    static final short[] dfa_29 = DFA.unpackEncodedString(dfa_29s);
+    static final char[] dfa_30 = DFA.unpackEncodedStringToUnsignedChars(dfa_30s);
+    static final char[] dfa_31 = DFA.unpackEncodedStringToUnsignedChars(dfa_31s);
+    static final short[] dfa_32 = DFA.unpackEncodedString(dfa_32s);
+    static final short[] dfa_33 = DFA.unpackEncodedString(dfa_33s);
+    static final short[][] dfa_34 = unpackEncodedStringArray(dfa_34s);
+
+    class DFA49 extends DFA {
+
+        public DFA49(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 49;
+            this.eot = dfa_28;
+            this.eof = dfa_29;
+            this.min = dfa_30;
+            this.max = dfa_31;
+            this.accept = dfa_32;
+            this.special = dfa_33;
+            this.transition = dfa_34;
+        }
+        public String getDescription() {
+            return "1683:3: ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= rulemultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )* )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA49_1 = input.LA(1);
+
+                         
+                        int index49_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred56_InternalSEW()) ) {s = 56;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index49_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 49, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_35s = "\1\1\70\uffff";
+    static final String dfa_36s = "\1\4\35\uffff\1\0\32\uffff";
+    static final String dfa_37s = "\1\115\35\uffff\1\0\32\uffff";
+    static final String dfa_38s = "\1\uffff\1\2\66\uffff\1\1";
+    static final String dfa_39s = "\36\uffff\1\0\32\uffff}>";
+    static final String[] dfa_40s = {
+            "\5\1\5\uffff\1\1\2\uffff\1\1\2\uffff\3\1\2\uffff\1\1\2\uffff\3\1\1\uffff\16\1\1\36\4\uffff\30\1\2\uffff\1\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[] dfa_35 = DFA.unpackEncodedString(dfa_35s);
+    static final char[] dfa_36 = DFA.unpackEncodedStringToUnsignedChars(dfa_36s);
+    static final char[] dfa_37 = DFA.unpackEncodedStringToUnsignedChars(dfa_37s);
+    static final short[] dfa_38 = DFA.unpackEncodedString(dfa_38s);
+    static final short[] dfa_39 = DFA.unpackEncodedString(dfa_39s);
+    static final short[][] dfa_40 = unpackEncodedStringArray(dfa_40s);
+
+    class DFA48 extends DFA {
+
+        public DFA48(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 48;
+            this.eot = dfa_28;
+            this.eof = dfa_35;
+            this.min = dfa_36;
+            this.max = dfa_37;
+            this.accept = dfa_38;
+            this.special = dfa_39;
+            this.transition = dfa_40;
+        }
+        public String getDescription() {
+            return "()* loopback of 1727:4: (otherlv_4= '+' ( (lv_operand_5_0= rulemultiplicativeExpression ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA48_30 = input.LA(1);
+
+                         
+                        int index48_30 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred55_InternalSEW()) ) {s = 56;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index48_30);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 48, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_41s = "\16\uffff";
+    static final String dfa_42s = "\1\4\2\uffff\1\6\1\61\11\uffff";
+    static final String dfa_43s = "\1\112\2\uffff\1\31\1\61\11\uffff";
+    static final String dfa_44s = "\1\uffff\1\1\1\2\2\uffff\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\4\1\3";
+    static final String dfa_45s = "\4\uffff\1\0\11\uffff}>";
+    static final String[] dfa_46s = {
+            "\1\11\1\2\1\4\1\6\6\uffff\1\11\6\uffff\1\11\3\uffff\1\5\2\uffff\1\10\26\uffff\1\3\4\uffff\1\11\1\7\2\12\7\13\2\1\6\11",
+            "",
+            "",
+            "\1\4\22\uffff\1\5",
+            "\1\14",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_41 = DFA.unpackEncodedString(dfa_41s);
+    static final char[] dfa_42 = DFA.unpackEncodedStringToUnsignedChars(dfa_42s);
+    static final char[] dfa_43 = DFA.unpackEncodedStringToUnsignedChars(dfa_43s);
+    static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
+    static final short[] dfa_45 = DFA.unpackEncodedString(dfa_45s);
+    static final short[][] dfa_46 = unpackEncodedStringArray(dfa_46s);
+
+    class DFA57 extends DFA {
+
+        public DFA57(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 57;
+            this.eot = dfa_41;
+            this.eof = dfa_41;
+            this.min = dfa_42;
+            this.max = dfa_43;
+            this.accept = dfa_44;
+            this.special = dfa_45;
+            this.transition = dfa_46;
+        }
+        public String getDescription() {
+            return "2265:2: (this_LiteralBooleanValue_0= ruleLiteralBooleanValue | this_LiteralCharacterValue_1= ruleLiteralCharacterValue | this_LiteralIntegerValue_2= ruleLiteralIntegerValue | this_LiteralRationalValue_3= ruleLiteralRationalValue | this_LiteralFloatValue_4= ruleLiteralFloatValue | this_LiteralStringValue_5= ruleLiteralStringValue | this_LiteralNullValue_6= ruleLiteralNullValue | this_LiteralArrayValue_7= ruleLiteralArrayValue | this_LiteralObjectReference_8= ruleLiteralObjectReference | this_LiteralVariableReference_9= ruleLiteralVariableReference | this_LiteralInstanceReference_10= ruleLiteralInstanceReference )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA57_4 = input.LA(1);
+
+                         
+                        int index57_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA57_4==49) ) {s = 12;}
+
+                        else if ( (synpred72_InternalSEW()) ) {s = 13;}
+
+                        else if ( (synpred74_InternalSEW()) ) {s = 5;}
+
+                         
+                        input.seek(index57_4);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 57, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_47s = "\1\4\11\0\2\uffff";
+    static final String dfa_48s = "\1\112\11\0\2\uffff";
+    static final String dfa_49s = "\12\uffff\1\1\1\2";
+    static final String dfa_50s = "\1\uffff\1\1\1\6\1\2\1\7\1\3\1\10\1\4\1\5\1\0\2\uffff}>";
+    static final String[] dfa_51s = {
+            "\1\11\11\uffff\1\1\6\uffff\1\2\57\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            ""
+    };
+    static final char[] dfa_47 = DFA.unpackEncodedStringToUnsignedChars(dfa_47s);
+    static final char[] dfa_48 = DFA.unpackEncodedStringToUnsignedChars(dfa_48s);
+    static final short[] dfa_49 = DFA.unpackEncodedString(dfa_49s);
+    static final short[] dfa_50 = DFA.unpackEncodedString(dfa_50s);
+    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);
+
+    class DFA61 extends DFA {
+
+        public DFA61(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 61;
+            this.eot = dfa_13;
+            this.eof = dfa_13;
+            this.min = dfa_47;
+            this.max = dfa_48;
+            this.accept = dfa_49;
+            this.special = dfa_50;
+            this.transition = dfa_51;
+        }
+        public String getDescription() {
+            return "2505:3: ( ( ( ruleUFI ) ) | ( (lv_symbol_2_0= ruleUFI ) ) )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA61_9 = input.LA(1);
+
+                         
+                        int index61_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred83_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index61_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA61_1 = input.LA(1);
+
+                         
+                        int index61_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred83_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index61_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA61_3 = input.LA(1);
+
+                         
+                        int index61_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred83_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index61_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA61_5 = input.LA(1);
+
+                         
+                        int index61_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred83_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index61_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA61_7 = input.LA(1);
+
+                         
+                        int index61_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred83_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index61_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA61_8 = input.LA(1);
+
+                         
+                        int index61_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred83_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index61_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA61_2 = input.LA(1);
+
+                         
+                        int index61_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred83_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index61_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA61_4 = input.LA(1);
+
+                         
+                        int index61_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred83_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index61_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA61_6 = input.LA(1);
+
+                         
+                        int index61_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred83_InternalSEW()) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index61_6);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 61, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_52s = "\1\2\2\uffff\11\2\1\uffff";
+    static final String dfa_53s = "\2\4\1\uffff\11\4\1\uffff";
+    static final String dfa_54s = "\1\115\1\112\1\uffff\11\115\1\uffff";
+    static final String dfa_55s = "\2\uffff\1\2\11\uffff\1\1";
+    static final String[] dfa_56s = {
+            "\5\2\5\uffff\1\2\2\uffff\1\2\2\uffff\1\1\2\2\2\uffff\1\2\2\uffff\3\2\1\uffff\53\2\2\uffff\1\2",
+            "\1\13\3\2\6\uffff\1\3\6\uffff\1\4\3\uffff\1\2\2\uffff\1\2\21\uffff\1\2\4\uffff\4\2\1\uffff\15\2\1\5\1\6\1\7\1\10\1\11\1\12",
+            "",
+            "\5\2\5\uffff\1\2\2\uffff\1\2\3\uffff\2\2\1\uffff\2\2\2\uffff\3\2\1\uffff\13\2\1\uffff\1\14\1\uffff\35\2\2\uffff\1\2",
+            "\5\2\5\uffff\1\2\2\uffff\1\2\3\uffff\2\2\1\uffff\2\2\2\uffff\3\2\1\uffff\13\2\1\uffff\1\14\1\uffff\35\2\2\uffff\1\2",
+            "\5\2\5\uffff\1\2\2\uffff\1\2\3\uffff\2\2\1\uffff\2\2\2\uffff\3\2\1\uffff\13\2\1\uffff\1\14\1\uffff\35\2\2\uffff\1\2",
+            "\5\2\5\uffff\1\2\2\uffff\1\2\3\uffff\2\2\1\uffff\2\2\2\uffff\3\2\1\uffff\13\2\1\uffff\1\14\1\uffff\35\2\2\uffff\1\2",
+            "\5\2\5\uffff\1\2\2\uffff\1\2\3\uffff\2\2\1\uffff\2\2\2\uffff\3\2\1\uffff\13\2\1\uffff\1\14\1\uffff\35\2\2\uffff\1\2",
+            "\5\2\5\uffff\1\2\2\uffff\1\2\3\uffff\2\2\1\uffff\2\2\2\uffff\3\2\1\uffff\13\2\1\uffff\1\14\1\uffff\35\2\2\uffff\1\2",
+            "\5\2\5\uffff\1\2\2\uffff\1\2\3\uffff\2\2\1\uffff\2\2\2\uffff\3\2\1\uffff\13\2\1\uffff\1\14\1\uffff\35\2\2\uffff\1\2",
+            "\5\2\5\uffff\1\2\2\uffff\1\2\3\uffff\2\2\1\uffff\2\2\2\uffff\3\2\1\uffff\13\2\1\uffff\1\14\1\uffff\35\2\2\uffff\1\2",
+            "\5\2\5\uffff\1\2\2\uffff\1\2\3\uffff\2\2\1\uffff\2\2\2\uffff\3\2\1\uffff\13\2\1\uffff\1\14\1\uffff\35\2\2\uffff\1\2",
+            ""
+    };
+    static final short[] dfa_52 = DFA.unpackEncodedString(dfa_52s);
+    static final char[] dfa_53 = DFA.unpackEncodedStringToUnsignedChars(dfa_53s);
+    static final char[] dfa_54 = DFA.unpackEncodedStringToUnsignedChars(dfa_54s);
+    static final short[] dfa_55 = DFA.unpackEncodedString(dfa_55s);
+    static final short[][] dfa_56 = unpackEncodedStringArray(dfa_56s);
+
+    class DFA62 extends DFA {
+
+        public DFA62(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 62;
+            this.eot = dfa_1;
+            this.eof = dfa_52;
+            this.min = dfa_53;
+            this.max = dfa_54;
+            this.accept = dfa_55;
+            this.special = dfa_5;
+            this.transition = dfa_56;
+        }
+        public String getDescription() {
+            return "2820:3: (otherlv_2= '<' ( (lv_type_3_0= ruleXID ) ) otherlv_4= '>' )?";
+        }
+    }
+    static final String dfa_57s = "\2\4\10\7\2\uffff";
+    static final String dfa_58s = "\2\112\10\37\2\uffff";
+    static final String[] dfa_59s = {
+            "\1\11\3\uffff\1\12\5\uffff\1\2\6\uffff\1\3\57\uffff\1\4\1\5\1\6\1\7\1\1\1\10",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\6\uffff\1\13\6\uffff\1\13\1\uffff\1\13\1\12\45\uffff\6\13",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "\1\13\24\uffff\1\13\1\uffff\1\13\1\12",
+            "",
+            ""
+    };
+    static final char[] dfa_57 = DFA.unpackEncodedStringToUnsignedChars(dfa_57s);
+    static final char[] dfa_58 = DFA.unpackEncodedStringToUnsignedChars(dfa_58s);
+    static final short[][] dfa_59 = unpackEncodedStringArray(dfa_59s);
+
+    class DFA79 extends DFA {
+
+        public DFA79(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 79;
+            this.eot = dfa_13;
+            this.eof = dfa_13;
+            this.min = dfa_57;
+            this.max = dfa_58;
+            this.accept = dfa_16;
+            this.special = dfa_17;
+            this.transition = dfa_59;
+        }
+        public String getDescription() {
+            return "3848:2: (this_DeprecatedSection_0= ruleDeprecatedSection | this_DeprecatedAttribute_1= ruleDeprecatedAttribute )";
+        }
+    }
+    static final String dfa_60s = "\1\uffff\1\14\1\uffff\11\14\2\uffff";
+    static final String dfa_61s = "\2\4\1\uffff\11\4\1\uffff\1\20";
+    static final String dfa_62s = "\2\112\1\uffff\11\112\1\uffff\1\36";
+    static final String dfa_63s = "\2\uffff\1\1\11\uffff\1\2\1\uffff";
+    static final String dfa_64s = "\16\uffff}>";
+    static final String[] dfa_65s = {
+            "\1\2\3\uffff\1\2\5\uffff\1\2\6\uffff\1\2\57\uffff\5\2\1\1",
+            "\1\13\2\uffff\1\2\1\14\5\uffff\1\3\1\uffff\1\2\4\uffff\1\4\2\uffff\4\2\3\uffff\1\2\45\uffff\1\5\1\6\1\7\1\10\1\11\1\12",
+            "",
+            "\1\14\2\uffff\1\15\1\14\5\uffff\1\14\1\uffff\1\2\4\uffff\1\14\2\uffff\2\2\2\uffff\1\14\1\uffff\2\14\45\uffff\6\14",
+            "\1\14\2\uffff\1\15\1\14\5\uffff\1\14\1\uffff\1\2\4\uffff\1\14\2\uffff\2\2\2\uffff\1\14\1\uffff\2\14\45\uffff\6\14",
+            "\1\14\2\uffff\1\15\1\14\5\uffff\1\14\1\uffff\1\2\4\uffff\1\14\2\uffff\2\2\2\uffff\1\14\1\uffff\2\14\45\uffff\6\14",
+            "\1\14\2\uffff\1\15\1\14\5\uffff\1\14\1\uffff\1\2\4\uffff\1\14\2\uffff\2\2\2\uffff\4\14\45\uffff\6\14",
+            "\1\14\2\uffff\1\15\1\14\5\uffff\1\14\1\uffff\1\2\4\uffff\1\14\2\uffff\2\2\2\uffff\1\14\1\uffff\2\14\45\uffff\6\14",
+            "\1\14\2\uffff\1\15\1\14\5\uffff\1\14\1\uffff\1\2\4\uffff\1\14\2\uffff\2\2\2\uffff\4\14\45\uffff\6\14",
+            "\1\14\2\uffff\1\15\1\14\5\uffff\1\14\1\uffff\1\2\4\uffff\1\14\2\uffff\2\2\2\uffff\1\14\1\uffff\2\14\45\uffff\6\14",
+            "\1\14\2\uffff\1\15\1\14\5\uffff\1\14\1\uffff\1\2\4\uffff\1\14\2\uffff\2\2\2\uffff\1\14\1\uffff\2\14\45\uffff\6\14",
+            "\1\14\2\uffff\1\15\1\14\5\uffff\1\14\1\uffff\1\2\4\uffff\1\14\2\uffff\2\2\2\uffff\1\14\1\uffff\2\14\45\uffff\6\14",
+            "",
+            "\1\2\13\uffff\1\14\1\uffff\1\14"
+    };
+    static final short[] dfa_60 = DFA.unpackEncodedString(dfa_60s);
+    static final char[] dfa_61 = DFA.unpackEncodedStringToUnsignedChars(dfa_61s);
+    static final char[] dfa_62 = DFA.unpackEncodedStringToUnsignedChars(dfa_62s);
+    static final short[] dfa_63 = DFA.unpackEncodedString(dfa_63s);
+    static final short[] dfa_64 = DFA.unpackEncodedString(dfa_64s);
+    static final short[][] dfa_65 = unpackEncodedStringArray(dfa_65s);
+
+    class DFA81 extends DFA {
+
+        public DFA81(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 81;
+            this.eot = dfa_41;
+            this.eof = dfa_60;
+            this.min = dfa_61;
+            this.max = dfa_62;
+            this.accept = dfa_63;
+            this.special = dfa_64;
+            this.transition = dfa_65;
+        }
+        public String getDescription() {
+            return "()* loopback of 3925:4: ( ( (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject ) ) )*";
+        }
+    }
+    static final String dfa_66s = "\67\uffff";
+    static final String dfa_67s = "\12\4\2\uffff\22\7\2\4\1\20\1\uffff\2\4\1\20\22\7";
+    static final String dfa_68s = "\12\112\2\uffff\22\113\2\112\1\113\1\uffff\2\112\23\113";
+    static final String dfa_69s = "\12\uffff\1\1\1\3\25\uffff\1\2\25\uffff";
+    static final String dfa_70s = "\67\uffff}>";
+    static final String[] dfa_71s = {
+            "\1\11\3\uffff\1\12\5\uffff\1\1\6\uffff\1\2\57\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\24\2\uffff\1\13\6\uffff\1\14\1\uffff\1\13\4\uffff\1\15\2\uffff\4\13\3\uffff\1\12\45\uffff\1\16\1\17\1\20\1\21\1\22\1\23",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\35\2\uffff\1\13\6\uffff\1\25\1\uffff\1\13\4\uffff\1\26\2\uffff\4\13\3\uffff\1\12\45\uffff\1\27\1\30\1\31\1\32\1\33\1\34",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "\1\13\2\uffff\1\13\6\uffff\1\13\1\uffff\1\13\4\uffff\1\13\2\uffff\4\13\3\uffff\1\12\45\uffff\6\13",
+            "",
+            "",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\55\11\uffff\1\45\6\uffff\1\46\57\uffff\1\47\1\50\1\51\1\52\1\53\1\54",
+            "\1\55\11\uffff\1\45\6\uffff\1\46\57\uffff\1\47\1\50\1\51\1\52\1\53\1\54",
+            "\1\13\72\uffff\1\41",
+            "",
+            "\1\66\11\uffff\1\56\6\uffff\1\57\57\uffff\1\60\1\61\1\62\1\63\1\64\1\65",
+            "\1\66\11\uffff\1\56\6\uffff\1\57\57\uffff\1\60\1\61\1\62\1\63\1\64\1\65",
+            "\1\13\72\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\40\10\uffff\1\13\7\uffff\1\36\1\37\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41",
+            "\1\44\10\uffff\1\13\7\uffff\1\42\1\43\61\uffff\1\41"
+    };
+
+    static final short[] dfa_66 = DFA.unpackEncodedString(dfa_66s);
+    static final char[] dfa_67 = DFA.unpackEncodedStringToUnsignedChars(dfa_67s);
+    static final char[] dfa_68 = DFA.unpackEncodedStringToUnsignedChars(dfa_68s);
+    static final short[] dfa_69 = DFA.unpackEncodedString(dfa_69s);
+    static final short[] dfa_70 = DFA.unpackEncodedString(dfa_70s);
+    static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);
+
+    class DFA80 extends DFA {
+
+        public DFA80(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 80;
+            this.eot = dfa_66;
+            this.eof = dfa_66;
+            this.min = dfa_67;
+            this.max = dfa_68;
+            this.accept = dfa_69;
+            this.special = dfa_70;
+            this.transition = dfa_71;
+        }
+        public String getDescription() {
+            return "3927:6: (lv_element_3_1= ruleDeprecatedAttribute | lv_element_3_2= ruleDeprecatedObject | lv_element_3_3= ruleObject )";
+        }
+    }
+    static final String dfa_72s = "\1\12\14\uffff";
+    static final String dfa_73s = "\1\4\11\0\3\uffff";
+    static final String dfa_74s = "\1\112\11\0\3\uffff";
+    static final String dfa_75s = "\12\uffff\1\2\1\uffff\1\1";
+    static final String dfa_76s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\3\uffff}>";
+    static final String[] dfa_77s = {
+            "\1\11\3\uffff\1\12\5\uffff\1\1\6\uffff\1\2\57\uffff\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            ""
+    };
+    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
+    static final char[] dfa_73 = DFA.unpackEncodedStringToUnsignedChars(dfa_73s);
+    static final char[] dfa_74 = DFA.unpackEncodedStringToUnsignedChars(dfa_74s);
+    static final short[] dfa_75 = DFA.unpackEncodedString(dfa_75s);
+    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
+    static final short[][] dfa_77 = unpackEncodedStringArray(dfa_77s);
+
+    class DFA82 extends DFA {
+
+        public DFA82(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 82;
+            this.eot = dfa_1;
+            this.eof = dfa_72;
+            this.min = dfa_73;
+            this.max = dfa_74;
+            this.accept = dfa_75;
+            this.special = dfa_76;
+            this.transition = dfa_77;
+        }
+        public String getDescription() {
+            return "3982:4: ( ruleXID )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA82_1 = input.LA(1);
+
+                         
+                        int index82_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index82_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA82_2 = input.LA(1);
+
+                         
+                        int index82_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index82_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA82_3 = input.LA(1);
+
+                         
+                        int index82_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index82_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA82_4 = input.LA(1);
+
+                         
+                        int index82_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index82_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA82_5 = input.LA(1);
+
+                         
+                        int index82_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index82_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA82_6 = input.LA(1);
+
+                         
+                        int index82_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index82_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA82_7 = input.LA(1);
+
+                         
+                        int index82_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index82_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA82_8 = input.LA(1);
+
+                         
+                        int index82_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index82_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA82_9 = input.LA(1);
+
+                         
+                        int index82_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred113_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 10;}
+
+                         
+                        input.seek(index82_9);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 82, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA84 extends DFA {
+
+        public DFA84(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 84;
+            this.eot = dfa_66;
+            this.eof = dfa_66;
+            this.min = dfa_67;
+            this.max = dfa_68;
+            this.accept = dfa_69;
+            this.special = dfa_70;
+            this.transition = dfa_71;
+        }
+        public String getDescription() {
+            return "4043:8: (lv_element_9_1= ruleDeprecatedAttribute | lv_element_9_2= ruleDeprecatedObject | lv_element_9_3= ruleObject )";
+        }
+    }
+    static final String dfa_78s = "\1\13\14\uffff";
+    static final String dfa_79s = "\1\4\12\0\2\uffff";
+    static final String dfa_80s = "\1\112\12\0\2\uffff";
+    static final String dfa_81s = "\13\uffff\1\2\1\1";
+    static final String dfa_82s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\2\uffff}>";
+    static final String[] dfa_83s = {
+            "\1\11\3\uffff\1\12\5\uffff\1\3\6\uffff\1\4\57\uffff\1\5\1\1\1\6\1\7\1\2\1\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            ""
+    };
+    static final short[] dfa_78 = DFA.unpackEncodedString(dfa_78s);
+    static final char[] dfa_79 = DFA.unpackEncodedStringToUnsignedChars(dfa_79s);
+    static final char[] dfa_80 = DFA.unpackEncodedStringToUnsignedChars(dfa_80s);
+    static final short[] dfa_81 = DFA.unpackEncodedString(dfa_81s);
+    static final short[] dfa_82 = DFA.unpackEncodedString(dfa_82s);
+    static final short[][] dfa_83 = unpackEncodedStringArray(dfa_83s);
+
+    class DFA87 extends DFA {
+
+        public DFA87(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 87;
+            this.eot = dfa_1;
+            this.eof = dfa_78;
+            this.min = dfa_79;
+            this.max = dfa_80;
+            this.accept = dfa_81;
+            this.special = dfa_82;
+            this.transition = dfa_83;
+        }
+        public String getDescription() {
+            return "()* loopback of 4105:6: ( ( (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA87_1 = input.LA(1);
+
+                         
+                        int index87_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA87_2 = input.LA(1);
+
+                         
+                        int index87_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA87_3 = input.LA(1);
+
+                         
+                        int index87_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA87_4 = input.LA(1);
+
+                         
+                        int index87_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA87_5 = input.LA(1);
+
+                         
+                        int index87_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA87_6 = input.LA(1);
+
+                         
+                        int index87_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA87_7 = input.LA(1);
+
+                         
+                        int index87_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA87_8 = input.LA(1);
+
+                         
+                        int index87_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA87_9 = input.LA(1);
+
+                         
+                        int index87_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA87_10 = input.LA(1);
+
+                         
+                        int index87_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred122_InternalSEW()) ) {s = 12;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index87_10);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 87, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA86 extends DFA {
+
+        public DFA86(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 86;
+            this.eot = dfa_66;
+            this.eof = dfa_66;
+            this.min = dfa_67;
+            this.max = dfa_68;
+            this.accept = dfa_69;
+            this.special = dfa_70;
+            this.transition = dfa_71;
+        }
+        public String getDescription() {
+            return "4107:8: (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject )";
+        }
+    }
+
+    class DFA111 extends DFA {
+
+        public DFA111(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 111;
+            this.eot = dfa_13;
+            this.eof = dfa_13;
+            this.min = dfa_19;
+            this.max = dfa_20;
+            this.accept = dfa_16;
+            this.special = dfa_17;
+            this.transition = dfa_21;
+        }
+        public String getDescription() {
+            return "900:7: (lv_element_6_1= ruleObject | lv_element_6_2= ruleAttribute )";
+        }
+    }
+
+    class DFA139 extends DFA {
+
+        public DFA139(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 139;
+            this.eot = dfa_66;
+            this.eof = dfa_66;
+            this.min = dfa_67;
+            this.max = dfa_68;
+            this.accept = dfa_69;
+            this.special = dfa_70;
+            this.transition = dfa_71;
+        }
+        public String getDescription() {
+            return "4107:8: (lv_element_12_1= ruleDeprecatedAttribute | lv_element_12_2= ruleDeprecatedObject | lv_element_12_3= ruleObject )";
+        }
+    }
+ 
+
+    
+    private static class FollowSets000 {
+        public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x000000000000C000L,0x00000000000000A0L});
+        public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000214090L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000010080L});
+        public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000010000L});
+        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000224010L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000100000L});
+        public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000204000L});
+        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000C00080L});
+        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0008000002000040L});
+        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000204010L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000800000L});
+        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000003000002L});
+        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x000000000C000000L});
+        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000214010L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000050000080L});
+        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000050000000L});
+        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000020204010L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000204012L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000080000000L});
+        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0xFF784000122040F0L,0x00000000000027FFL});
+        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000100000002L});
+        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000200000002L});
+        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000040000000L});
+        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000C00000002L});
+        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0xFF784000122040F0L,0x00000000000007FFL});
+        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000003000000002L});
+        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x000007C000000002L});
+        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000380000100002L});
+        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000400000000002L});
+        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0007800000000002L});
+        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000800000000002L});
+        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0001000000000002L});
+        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0002000000000002L});
+        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0004000000000002L});
+        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0080000000000000L});
+        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0xFF784000322040F0L,0x00000000000027FFL});
+        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000020400000L});
+        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0002000000000000L});
+        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0008000000000040L});
+        public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000100002L});
+        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000100000000000L});
+        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000040L});
+        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000000002000040L});
+        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000002000000L});
+        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000000000080L,0x0000000000000800L});
+        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0100000000204010L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
+        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000204110L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x000000000020C110L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x000000002020C110L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x000000000020C112L,0x00000000000007E0L});
+        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000000000L,0x000000000000C000L});
+        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0xFF784000122240F0L,0x00000000000027FFL});
+    }
+
+
+}
\ No newline at end of file
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/scoping/AbstractSEWScopeProvider.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/scoping/AbstractSEWScopeProvider.java
new file mode 100644
index 0000000..9e1f8cd
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/scoping/AbstractSEWScopeProvider.java
@@ -0,0 +1,18 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.scoping;
+
+import org.eclipse.xtext.scoping.impl.DelegatingScopeProvider;
+
+public abstract class AbstractSEWScopeProvider extends DelegatingScopeProvider {
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/serializer/SEWSemanticSequencer.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/serializer/SEWSemanticSequencer.java
new file mode 100644
index 0000000..f3abb48
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/serializer/SEWSemanticSequencer.java
@@ -0,0 +1,1051 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.serializer;
+
+import com.google.inject.Inject;
+import java.util.Set;
+import org.eclipse.efm.ecore.sew.SEWorkflow;
+import org.eclipse.efm.ecore.sew.SewPackage;
+import org.eclipse.efm.ecore.sew.WAttribute;
+import org.eclipse.efm.ecore.sew.WObject;
+import org.eclipse.efm.ecore.sew.WSection;
+import org.eclipse.efm.ecore.sew.expression.Expression;
+import org.eclipse.efm.ecore.sew.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.sew.expression.LiteralArrayValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralBooleanValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralCharacterValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralEnvInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralFloatValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralIntegerValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralNullValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralObjectReference;
+import org.eclipse.efm.ecore.sew.expression.LiteralParentInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralRationalValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralRealValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralSelfInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralStringValue;
+import org.eclipse.efm.ecore.sew.expression.LiteralSuperInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralSystemInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralThisInstance;
+import org.eclipse.efm.ecore.sew.expression.LiteralTimeDeltaVariable;
+import org.eclipse.efm.ecore.sew.expression.LiteralTimeVariable;
+import org.eclipse.efm.sew.xtext.services.SEWGrammarAccess;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Parameter;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.serializer.ISerializationContext;
+import org.eclipse.xtext.serializer.acceptor.SequenceFeeder;
+import org.eclipse.xtext.serializer.sequencer.AbstractDelegatingSemanticSequencer;
+import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient;
+
+@SuppressWarnings("all")
+public class SEWSemanticSequencer extends AbstractDelegatingSemanticSequencer {
+
+	@Inject
+	private SEWGrammarAccess grammarAccess;
+	
+	@Override
+	public void sequence(ISerializationContext context, EObject semanticObject) {
+		EPackage epackage = semanticObject.eClass().getEPackage();
+		ParserRule rule = context.getParserRule();
+		Action action = context.getAssignedAction();
+		Set<Parameter> parameters = context.getEnabledBooleanParameters();
+		if (epackage == ExpressionPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case ExpressionPackage.EXPRESSION:
+				if (rule == grammarAccess.getDeprecatedExpressionRule()) {
+					sequence_DeprecatedExpression(context, (Expression) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getValueSpecificationRule()
+						|| rule == grammarAccess.getExpressionRule()
+						|| rule == grammarAccess.getConditionalExpressionRule()
+						|| action == grammarAccess.getConditionalExpressionAccess().getExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getConditionalOrExpressionRule()
+						|| action == grammarAccess.getConditionalOrExpressionAccess().getExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getConditionalAndExpressionRule()
+						|| action == grammarAccess.getConditionalAndExpressionAccess().getExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getEqualityExpressionRule()
+						|| action == grammarAccess.getEqualityExpressionAccess().getExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getRelationalExpressionRule()
+						|| action == grammarAccess.getRelationalExpressionAccess().getExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getAdditiveExpressionRule()
+						|| action == grammarAccess.getAdditiveExpressionAccess().getExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getMultiplicativeExpressionRule()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_0_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_1_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_2_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getExpressionOperandAction_1_3_0()
+						|| rule == grammarAccess.getPrimaryExpressionRule()) {
+					sequence_DeprecatedExpression_additiveExpression_conditionalAndExpression_conditionalExpression_conditionalOrExpression_equalityExpression_multiplicativeExpression_primaryExpression_relationalExpression(context, (Expression) semanticObject); 
+					return; 
+				}
+				else break;
+			case ExpressionPackage.LITERAL_ARRAY_VALUE:
+				sequence_LiteralArrayValue(context, (LiteralArrayValue) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_BOOLEAN_VALUE:
+				sequence_LiteralBooleanValue(context, (LiteralBooleanValue) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_CHARACTER_VALUE:
+				sequence_LiteralCharacterValue(context, (LiteralCharacterValue) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_ENV_INSTANCE:
+				sequence_LiteralEnvInstance(context, (LiteralEnvInstance) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_FLOAT_VALUE:
+				sequence_LiteralFloatValue(context, (LiteralFloatValue) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_INTEGER_VALUE:
+				sequence_LiteralIntegerValue(context, (LiteralIntegerValue) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_NULL_VALUE:
+				sequence_LiteralNullValue(context, (LiteralNullValue) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_OBJECT_REFERENCE:
+				sequence_LiteralObjectReference(context, (LiteralObjectReference) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_PARENT_INSTANCE:
+				sequence_LiteralParentInstance(context, (LiteralParentInstance) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_RATIONAL_VALUE:
+				sequence_LiteralRationalValue(context, (LiteralRationalValue) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_REAL_VALUE:
+				sequence_LiteralRealValue(context, (LiteralRealValue) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_SELF_INSTANCE:
+				sequence_LiteralSelfInstance(context, (LiteralSelfInstance) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_STRING_VALUE:
+				sequence_LiteralStringValue(context, (LiteralStringValue) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_SUPER_INSTANCE:
+				sequence_LiteralSuperInstance(context, (LiteralSuperInstance) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_SYSTEM_INSTANCE:
+				sequence_LiteralSystemInstance(context, (LiteralSystemInstance) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_THIS_INSTANCE:
+				sequence_LiteralThisInstance(context, (LiteralThisInstance) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_TIME_DELTA_VARIABLE:
+				sequence_LiteralTimeDeltaVariable(context, (LiteralTimeDeltaVariable) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_TIME_VARIABLE:
+				sequence_LiteralTimeVariable(context, (LiteralTimeVariable) semanticObject); 
+				return; 
+			}
+		else if (epackage == SewPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case SewPackage.SE_WORKFLOW:
+				sequence_Workflow(context, (SEWorkflow) semanticObject); 
+				return; 
+			case SewPackage.WATTRIBUTE:
+				if (rule == grammarAccess.getPropertyRule()
+						|| rule == grammarAccess.getAttributeRule()) {
+					sequence_Attribute(context, (WAttribute) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getDeprecatedPropertyRule()
+						|| rule == grammarAccess.getDeprecatedAttributeRule()) {
+					sequence_DeprecatedAttribute(context, (WAttribute) semanticObject); 
+					return; 
+				}
+				else break;
+			case SewPackage.WOBJECT:
+				if (rule == grammarAccess.getDeprecatedObjectRule()) {
+					sequence_DeprecatedObject(context, (WObject) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getObjectRule()) {
+					sequence_Object(context, (WObject) semanticObject); 
+					return; 
+				}
+				else break;
+			case SewPackage.WSECTION:
+				if (rule == grammarAccess.getDeprecatedPropertyRule()
+						|| rule == grammarAccess.getDeprecatedSectionRule()) {
+					sequence_DeprecatedSection(context, (WSection) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getPropertyRule()
+						|| rule == grammarAccess.getSectionRule()) {
+					sequence_Section(context, (WSection) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		if (errorAcceptor != null)
+			errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
+	}
+	
+	/**
+	 * Contexts:
+	 *     Property returns WAttribute
+	 *     Attribute returns WAttribute
+	 *
+	 * Constraint:
+	 *     (name=XID value=ValueSpecification)
+	 */
+	protected void sequence_Attribute(ISerializationContext context, WAttribute semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, SewPackage.Literals.WNAMED_ELEMENT__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SewPackage.Literals.WNAMED_ELEMENT__NAME));
+			if (transientValues.isValueTransient(semanticObject, SewPackage.Literals.WATTRIBUTE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SewPackage.Literals.WATTRIBUTE__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getAttributeAccess().getNameXIDParserRuleCall_1_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getAttributeAccess().getValueValueSpecificationParserRuleCall_3_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DeprecatedProperty returns WAttribute
+	 *     DeprecatedAttribute returns WAttribute
+	 *
+	 * Constraint:
+	 *     (name=DeprecatedAttributeID value=ValueSpecification)
+	 */
+	protected void sequence_DeprecatedAttribute(ISerializationContext context, WAttribute semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, SewPackage.Literals.WNAMED_ELEMENT__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SewPackage.Literals.WNAMED_ELEMENT__NAME));
+			if (transientValues.isValueTransient(semanticObject, SewPackage.Literals.WATTRIBUTE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SewPackage.Literals.WATTRIBUTE__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getDeprecatedAttributeAccess().getNameDeprecatedAttributeIDParserRuleCall_1_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getDeprecatedAttributeAccess().getValueValueSpecificationParserRuleCall_3_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DeprecatedExpression returns Expression
+	 *
+	 * Constraint:
+	 *     ((operator='|;|' | operator='|i|') operand+=ValueSpecification*)
+	 */
+	protected void sequence_DeprecatedExpression(ISerializationContext context, Expression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns Expression
+	 *     Expression returns Expression
+	 *     conditionalExpression returns Expression
+	 *     conditionalExpression.Expression_1_0 returns Expression
+	 *     conditionalOrExpression returns Expression
+	 *     conditionalOrExpression.Expression_1_0 returns Expression
+	 *     conditionalAndExpression returns Expression
+	 *     conditionalAndExpression.Expression_1_0 returns Expression
+	 *     equalityExpression returns Expression
+	 *     equalityExpression.Expression_1_0 returns Expression
+	 *     relationalExpression returns Expression
+	 *     relationalExpression.Expression_1_0 returns Expression
+	 *     additiveExpression returns Expression
+	 *     additiveExpression.Expression_1_0 returns Expression
+	 *     multiplicativeExpression returns Expression
+	 *     multiplicativeExpression.Expression_1_0_0 returns Expression
+	 *     multiplicativeExpression.Expression_1_1_0 returns Expression
+	 *     multiplicativeExpression.Expression_1_2_0 returns Expression
+	 *     multiplicativeExpression.Expression_1_3_0 returns Expression
+	 *     primaryExpression returns Expression
+	 *
+	 * Constraint:
+	 *     (
+	 *         (operand+=conditionalExpression_Expression_1_0 operator='?' operand+=Expression operand+=Expression) | 
+	 *         (
+	 *             operand+=conditionalOrExpression_Expression_1_0 
+	 *             (operator='||' | operator='or') 
+	 *             operand+=conditionalAndExpression 
+	 *             operand+=conditionalAndExpression*
+	 *         ) | 
+	 *         (operand+=conditionalAndExpression_Expression_1_0 (operator='&&' | operator='and') operand+=equalityExpression operand+=equalityExpression*) | 
+	 *         (
+	 *             operand+=equalityExpression_Expression_1_0 
+	 *             (operator='==' | operator='!=' | operator='===' | operator='=!=' | operator='=/=') 
+	 *             operand+=relationalExpression
+	 *         ) | 
+	 *         (operand+=relationalExpression_Expression_1_0 (operator='<' | operator='<=' | operator='>' | operator='>=') operand+=additiveExpression) | 
+	 *         (operand+=additiveExpression_Expression_1_0 operator='+' operand+=multiplicativeExpression operand+=multiplicativeExpression*) | 
+	 *         (operand+=multiplicativeExpression_Expression_1_0_0 operator='*' operand+=primaryExpression operand+=primaryExpression*) | 
+	 *         (operand+=multiplicativeExpression_Expression_1_1_0 operator='**' operand+=primaryExpression operand+=primaryExpression*) | 
+	 *         (operand+=multiplicativeExpression_Expression_1_2_0 operator='/' operand+=primaryExpression operand+=primaryExpression*) | 
+	 *         (operand+=multiplicativeExpression_Expression_1_3_0 operator='%' operand+=primaryExpression operand+=primaryExpression*) | 
+	 *         (operator='-' operand+=primaryExpression) | 
+	 *         ((operator='!' | operator='not') operand+=primaryExpression) | 
+	 *         ((operator='|;|' | operator='|i|') operand+=ValueSpecification*)
+	 *     )
+	 */
+	protected void sequence_DeprecatedExpression_additiveExpression_conditionalAndExpression_conditionalExpression_conditionalOrExpression_equalityExpression_multiplicativeExpression_primaryExpression_relationalExpression(ISerializationContext context, Expression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DeprecatedObject returns WObject
+	 *
+	 * Constraint:
+	 *     ((name=UFI description=EString? type=UFI element+=DeprecatedProperty*) | (name=UFI description=EString? type=UFI element+=DeprecatedProperty*))
+	 */
+	protected void sequence_DeprecatedObject(ISerializationContext context, WObject semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DeprecatedProperty returns WSection
+	 *     DeprecatedSection returns WSection
+	 *
+	 * Constraint:
+	 *     (
+	 *         (name=XID (element+=DeprecatedAttribute | element+=DeprecatedObject | element+=Object)*) | 
+	 *         (
+	 *             name=XID 
+	 *             description=EString? 
+	 *             (
+	 *                 (element+=DeprecatedAttribute | element+=DeprecatedObject | element+=Object)+ | 
+	 *                 (element+=DeprecatedAttribute | element+=DeprecatedObject | element+=Object)+
+	 *             )?
+	 *         )
+	 *     )
+	 */
+	protected void sequence_DeprecatedSection(ISerializationContext context, WSection semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralArrayValue
+	 *     Expression returns LiteralArrayValue
+	 *     conditionalExpression returns LiteralArrayValue
+	 *     conditionalExpression.Expression_1_0 returns LiteralArrayValue
+	 *     conditionalOrExpression returns LiteralArrayValue
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralArrayValue
+	 *     conditionalAndExpression returns LiteralArrayValue
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralArrayValue
+	 *     equalityExpression returns LiteralArrayValue
+	 *     equalityExpression.Expression_1_0 returns LiteralArrayValue
+	 *     relationalExpression returns LiteralArrayValue
+	 *     relationalExpression.Expression_1_0 returns LiteralArrayValue
+	 *     additiveExpression returns LiteralArrayValue
+	 *     additiveExpression.Expression_1_0 returns LiteralArrayValue
+	 *     multiplicativeExpression returns LiteralArrayValue
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralArrayValue
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralArrayValue
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralArrayValue
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralArrayValue
+	 *     primaryExpression returns LiteralArrayValue
+	 *     LiteralExpression returns LiteralArrayValue
+	 *     LiteralArrayValue returns LiteralArrayValue
+	 *
+	 * Constraint:
+	 *     (values+=ValueSpecification values+=ValueSpecification*)?
+	 */
+	protected void sequence_LiteralArrayValue(ISerializationContext context, LiteralArrayValue semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralBooleanValue
+	 *     Expression returns LiteralBooleanValue
+	 *     conditionalExpression returns LiteralBooleanValue
+	 *     conditionalExpression.Expression_1_0 returns LiteralBooleanValue
+	 *     conditionalOrExpression returns LiteralBooleanValue
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralBooleanValue
+	 *     conditionalAndExpression returns LiteralBooleanValue
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralBooleanValue
+	 *     equalityExpression returns LiteralBooleanValue
+	 *     equalityExpression.Expression_1_0 returns LiteralBooleanValue
+	 *     relationalExpression returns LiteralBooleanValue
+	 *     relationalExpression.Expression_1_0 returns LiteralBooleanValue
+	 *     additiveExpression returns LiteralBooleanValue
+	 *     additiveExpression.Expression_1_0 returns LiteralBooleanValue
+	 *     multiplicativeExpression returns LiteralBooleanValue
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralBooleanValue
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralBooleanValue
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralBooleanValue
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralBooleanValue
+	 *     primaryExpression returns LiteralBooleanValue
+	 *     LiteralExpression returns LiteralBooleanValue
+	 *     LiteralBooleanValue returns LiteralBooleanValue
+	 *
+	 * Constraint:
+	 *     value=EBoolean
+	 */
+	protected void sequence_LiteralBooleanValue(ISerializationContext context, LiteralBooleanValue semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_BOOLEAN_VALUE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_BOOLEAN_VALUE__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralBooleanValueAccess().getValueEBooleanParserRuleCall_0(), semanticObject.isValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralCharacterValue
+	 *     Expression returns LiteralCharacterValue
+	 *     conditionalExpression returns LiteralCharacterValue
+	 *     conditionalExpression.Expression_1_0 returns LiteralCharacterValue
+	 *     conditionalOrExpression returns LiteralCharacterValue
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralCharacterValue
+	 *     conditionalAndExpression returns LiteralCharacterValue
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralCharacterValue
+	 *     equalityExpression returns LiteralCharacterValue
+	 *     equalityExpression.Expression_1_0 returns LiteralCharacterValue
+	 *     relationalExpression returns LiteralCharacterValue
+	 *     relationalExpression.Expression_1_0 returns LiteralCharacterValue
+	 *     additiveExpression returns LiteralCharacterValue
+	 *     additiveExpression.Expression_1_0 returns LiteralCharacterValue
+	 *     multiplicativeExpression returns LiteralCharacterValue
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralCharacterValue
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralCharacterValue
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralCharacterValue
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralCharacterValue
+	 *     primaryExpression returns LiteralCharacterValue
+	 *     LiteralExpression returns LiteralCharacterValue
+	 *     LiteralCharacterValue returns LiteralCharacterValue
+	 *
+	 * Constraint:
+	 *     value=EChar
+	 */
+	protected void sequence_LiteralCharacterValue(ISerializationContext context, LiteralCharacterValue semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_CHARACTER_VALUE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_CHARACTER_VALUE__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralCharacterValueAccess().getValueECharParserRuleCall_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralEnvInstance
+	 *     Expression returns LiteralEnvInstance
+	 *     conditionalExpression returns LiteralEnvInstance
+	 *     conditionalExpression.Expression_1_0 returns LiteralEnvInstance
+	 *     conditionalOrExpression returns LiteralEnvInstance
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralEnvInstance
+	 *     conditionalAndExpression returns LiteralEnvInstance
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralEnvInstance
+	 *     equalityExpression returns LiteralEnvInstance
+	 *     equalityExpression.Expression_1_0 returns LiteralEnvInstance
+	 *     relationalExpression returns LiteralEnvInstance
+	 *     relationalExpression.Expression_1_0 returns LiteralEnvInstance
+	 *     additiveExpression returns LiteralEnvInstance
+	 *     additiveExpression.Expression_1_0 returns LiteralEnvInstance
+	 *     multiplicativeExpression returns LiteralEnvInstance
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralEnvInstance
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralEnvInstance
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralEnvInstance
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralEnvInstance
+	 *     primaryExpression returns LiteralEnvInstance
+	 *     LiteralExpression returns LiteralEnvInstance
+	 *     LiteralInstanceReference returns LiteralEnvInstance
+	 *     LiteralEnvInstance returns LiteralEnvInstance
+	 *
+	 * Constraint:
+	 *     (symbol='$env' | symbol='env')
+	 */
+	protected void sequence_LiteralEnvInstance(ISerializationContext context, LiteralEnvInstance semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralFloatValue
+	 *     Expression returns LiteralFloatValue
+	 *     conditionalExpression returns LiteralFloatValue
+	 *     conditionalExpression.Expression_1_0 returns LiteralFloatValue
+	 *     conditionalOrExpression returns LiteralFloatValue
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralFloatValue
+	 *     conditionalAndExpression returns LiteralFloatValue
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralFloatValue
+	 *     equalityExpression returns LiteralFloatValue
+	 *     equalityExpression.Expression_1_0 returns LiteralFloatValue
+	 *     relationalExpression returns LiteralFloatValue
+	 *     relationalExpression.Expression_1_0 returns LiteralFloatValue
+	 *     additiveExpression returns LiteralFloatValue
+	 *     additiveExpression.Expression_1_0 returns LiteralFloatValue
+	 *     multiplicativeExpression returns LiteralFloatValue
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralFloatValue
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralFloatValue
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralFloatValue
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralFloatValue
+	 *     primaryExpression returns LiteralFloatValue
+	 *     LiteralExpression returns LiteralFloatValue
+	 *     LiteralFloatValue returns LiteralFloatValue
+	 *
+	 * Constraint:
+	 *     value=EDouble
+	 */
+	protected void sequence_LiteralFloatValue(ISerializationContext context, LiteralFloatValue semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_FLOAT_VALUE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_FLOAT_VALUE__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralFloatValueAccess().getValueEDoubleParserRuleCall_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralIntegerValue
+	 *     Expression returns LiteralIntegerValue
+	 *     conditionalExpression returns LiteralIntegerValue
+	 *     conditionalExpression.Expression_1_0 returns LiteralIntegerValue
+	 *     conditionalOrExpression returns LiteralIntegerValue
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralIntegerValue
+	 *     conditionalAndExpression returns LiteralIntegerValue
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralIntegerValue
+	 *     equalityExpression returns LiteralIntegerValue
+	 *     equalityExpression.Expression_1_0 returns LiteralIntegerValue
+	 *     relationalExpression returns LiteralIntegerValue
+	 *     relationalExpression.Expression_1_0 returns LiteralIntegerValue
+	 *     additiveExpression returns LiteralIntegerValue
+	 *     additiveExpression.Expression_1_0 returns LiteralIntegerValue
+	 *     multiplicativeExpression returns LiteralIntegerValue
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralIntegerValue
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralIntegerValue
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralIntegerValue
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralIntegerValue
+	 *     primaryExpression returns LiteralIntegerValue
+	 *     LiteralExpression returns LiteralIntegerValue
+	 *     LiteralIntegerValue returns LiteralIntegerValue
+	 *
+	 * Constraint:
+	 *     value=ELong
+	 */
+	protected void sequence_LiteralIntegerValue(ISerializationContext context, LiteralIntegerValue semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_INTEGER_VALUE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_INTEGER_VALUE__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralIntegerValueAccess().getValueELongParserRuleCall_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralNullValue
+	 *     Expression returns LiteralNullValue
+	 *     conditionalExpression returns LiteralNullValue
+	 *     conditionalExpression.Expression_1_0 returns LiteralNullValue
+	 *     conditionalOrExpression returns LiteralNullValue
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralNullValue
+	 *     conditionalAndExpression returns LiteralNullValue
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralNullValue
+	 *     equalityExpression returns LiteralNullValue
+	 *     equalityExpression.Expression_1_0 returns LiteralNullValue
+	 *     relationalExpression returns LiteralNullValue
+	 *     relationalExpression.Expression_1_0 returns LiteralNullValue
+	 *     additiveExpression returns LiteralNullValue
+	 *     additiveExpression.Expression_1_0 returns LiteralNullValue
+	 *     multiplicativeExpression returns LiteralNullValue
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralNullValue
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralNullValue
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralNullValue
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralNullValue
+	 *     primaryExpression returns LiteralNullValue
+	 *     LiteralExpression returns LiteralNullValue
+	 *     LiteralNullValue returns LiteralNullValue
+	 *
+	 * Constraint:
+	 *     type=XID?
+	 */
+	protected void sequence_LiteralNullValue(ISerializationContext context, LiteralNullValue semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralObjectReference
+	 *     Expression returns LiteralObjectReference
+	 *     conditionalExpression returns LiteralObjectReference
+	 *     conditionalExpression.Expression_1_0 returns LiteralObjectReference
+	 *     conditionalOrExpression returns LiteralObjectReference
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralObjectReference
+	 *     conditionalAndExpression returns LiteralObjectReference
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralObjectReference
+	 *     equalityExpression returns LiteralObjectReference
+	 *     equalityExpression.Expression_1_0 returns LiteralObjectReference
+	 *     relationalExpression returns LiteralObjectReference
+	 *     relationalExpression.Expression_1_0 returns LiteralObjectReference
+	 *     additiveExpression returns LiteralObjectReference
+	 *     additiveExpression.Expression_1_0 returns LiteralObjectReference
+	 *     multiplicativeExpression returns LiteralObjectReference
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralObjectReference
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralObjectReference
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralObjectReference
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralObjectReference
+	 *     primaryExpression returns LiteralObjectReference
+	 *     LiteralExpression returns LiteralObjectReference
+	 *     LiteralObjectReference returns LiteralObjectReference
+	 *
+	 * Constraint:
+	 *     (object=[WObject|UFI] | symbol=UFI)
+	 */
+	protected void sequence_LiteralObjectReference(ISerializationContext context, LiteralObjectReference semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralParentInstance
+	 *     Expression returns LiteralParentInstance
+	 *     conditionalExpression returns LiteralParentInstance
+	 *     conditionalExpression.Expression_1_0 returns LiteralParentInstance
+	 *     conditionalOrExpression returns LiteralParentInstance
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralParentInstance
+	 *     conditionalAndExpression returns LiteralParentInstance
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralParentInstance
+	 *     equalityExpression returns LiteralParentInstance
+	 *     equalityExpression.Expression_1_0 returns LiteralParentInstance
+	 *     relationalExpression returns LiteralParentInstance
+	 *     relationalExpression.Expression_1_0 returns LiteralParentInstance
+	 *     additiveExpression returns LiteralParentInstance
+	 *     additiveExpression.Expression_1_0 returns LiteralParentInstance
+	 *     multiplicativeExpression returns LiteralParentInstance
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralParentInstance
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralParentInstance
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralParentInstance
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralParentInstance
+	 *     primaryExpression returns LiteralParentInstance
+	 *     LiteralExpression returns LiteralParentInstance
+	 *     LiteralInstanceReference returns LiteralParentInstance
+	 *     LiteralParentInstance returns LiteralParentInstance
+	 *
+	 * Constraint:
+	 *     symbol='$parent'
+	 */
+	protected void sequence_LiteralParentInstance(ISerializationContext context, LiteralParentInstance semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralParentInstanceAccess().getSymbolParentKeyword_1_0(), semanticObject.getSymbol());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralRationalValue
+	 *     Expression returns LiteralRationalValue
+	 *     conditionalExpression returns LiteralRationalValue
+	 *     conditionalExpression.Expression_1_0 returns LiteralRationalValue
+	 *     conditionalOrExpression returns LiteralRationalValue
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralRationalValue
+	 *     conditionalAndExpression returns LiteralRationalValue
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralRationalValue
+	 *     equalityExpression returns LiteralRationalValue
+	 *     equalityExpression.Expression_1_0 returns LiteralRationalValue
+	 *     relationalExpression returns LiteralRationalValue
+	 *     relationalExpression.Expression_1_0 returns LiteralRationalValue
+	 *     additiveExpression returns LiteralRationalValue
+	 *     additiveExpression.Expression_1_0 returns LiteralRationalValue
+	 *     multiplicativeExpression returns LiteralRationalValue
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralRationalValue
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralRationalValue
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralRationalValue
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralRationalValue
+	 *     primaryExpression returns LiteralRationalValue
+	 *     LiteralExpression returns LiteralRationalValue
+	 *     LiteralRationalValue returns LiteralRationalValue
+	 *
+	 * Constraint:
+	 *     (numerator=ELong denominator=ELong)
+	 */
+	protected void sequence_LiteralRationalValue(ISerializationContext context, LiteralRationalValue semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_RATIONAL_VALUE__NUMERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_RATIONAL_VALUE__NUMERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_RATIONAL_VALUE__DENOMINATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_RATIONAL_VALUE__DENOMINATOR));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralRationalValueAccess().getNumeratorELongParserRuleCall_0_0(), semanticObject.getNumerator());
+		feeder.accept(grammarAccess.getLiteralRationalValueAccess().getDenominatorELongParserRuleCall_2_0(), semanticObject.getDenominator());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     LiteralRealValue returns LiteralRealValue
+	 *
+	 * Constraint:
+	 *     value=EBigDecimal
+	 */
+	protected void sequence_LiteralRealValue(ISerializationContext context, LiteralRealValue semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_REAL_VALUE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_REAL_VALUE__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralRealValueAccess().getValueEBigDecimalParserRuleCall_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralSelfInstance
+	 *     Expression returns LiteralSelfInstance
+	 *     conditionalExpression returns LiteralSelfInstance
+	 *     conditionalExpression.Expression_1_0 returns LiteralSelfInstance
+	 *     conditionalOrExpression returns LiteralSelfInstance
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralSelfInstance
+	 *     conditionalAndExpression returns LiteralSelfInstance
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralSelfInstance
+	 *     equalityExpression returns LiteralSelfInstance
+	 *     equalityExpression.Expression_1_0 returns LiteralSelfInstance
+	 *     relationalExpression returns LiteralSelfInstance
+	 *     relationalExpression.Expression_1_0 returns LiteralSelfInstance
+	 *     additiveExpression returns LiteralSelfInstance
+	 *     additiveExpression.Expression_1_0 returns LiteralSelfInstance
+	 *     multiplicativeExpression returns LiteralSelfInstance
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralSelfInstance
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralSelfInstance
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralSelfInstance
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralSelfInstance
+	 *     primaryExpression returns LiteralSelfInstance
+	 *     LiteralExpression returns LiteralSelfInstance
+	 *     LiteralInstanceReference returns LiteralSelfInstance
+	 *     LiteralSelfInstance returns LiteralSelfInstance
+	 *
+	 * Constraint:
+	 *     symbol='$self'
+	 */
+	protected void sequence_LiteralSelfInstance(ISerializationContext context, LiteralSelfInstance semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralSelfInstanceAccess().getSymbolSelfKeyword_1_0(), semanticObject.getSymbol());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralStringValue
+	 *     Expression returns LiteralStringValue
+	 *     conditionalExpression returns LiteralStringValue
+	 *     conditionalExpression.Expression_1_0 returns LiteralStringValue
+	 *     conditionalOrExpression returns LiteralStringValue
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralStringValue
+	 *     conditionalAndExpression returns LiteralStringValue
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralStringValue
+	 *     equalityExpression returns LiteralStringValue
+	 *     equalityExpression.Expression_1_0 returns LiteralStringValue
+	 *     relationalExpression returns LiteralStringValue
+	 *     relationalExpression.Expression_1_0 returns LiteralStringValue
+	 *     additiveExpression returns LiteralStringValue
+	 *     additiveExpression.Expression_1_0 returns LiteralStringValue
+	 *     multiplicativeExpression returns LiteralStringValue
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralStringValue
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralStringValue
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralStringValue
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralStringValue
+	 *     primaryExpression returns LiteralStringValue
+	 *     LiteralExpression returns LiteralStringValue
+	 *     LiteralStringValue returns LiteralStringValue
+	 *
+	 * Constraint:
+	 *     value=EString
+	 */
+	protected void sequence_LiteralStringValue(ISerializationContext context, LiteralStringValue semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_STRING_VALUE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_STRING_VALUE__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralStringValueAccess().getValueEStringParserRuleCall_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralSuperInstance
+	 *     Expression returns LiteralSuperInstance
+	 *     conditionalExpression returns LiteralSuperInstance
+	 *     conditionalExpression.Expression_1_0 returns LiteralSuperInstance
+	 *     conditionalOrExpression returns LiteralSuperInstance
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralSuperInstance
+	 *     conditionalAndExpression returns LiteralSuperInstance
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralSuperInstance
+	 *     equalityExpression returns LiteralSuperInstance
+	 *     equalityExpression.Expression_1_0 returns LiteralSuperInstance
+	 *     relationalExpression returns LiteralSuperInstance
+	 *     relationalExpression.Expression_1_0 returns LiteralSuperInstance
+	 *     additiveExpression returns LiteralSuperInstance
+	 *     additiveExpression.Expression_1_0 returns LiteralSuperInstance
+	 *     multiplicativeExpression returns LiteralSuperInstance
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralSuperInstance
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralSuperInstance
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralSuperInstance
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralSuperInstance
+	 *     primaryExpression returns LiteralSuperInstance
+	 *     LiteralExpression returns LiteralSuperInstance
+	 *     LiteralInstanceReference returns LiteralSuperInstance
+	 *     LiteralSuperInstance returns LiteralSuperInstance
+	 *
+	 * Constraint:
+	 *     symbol='$super'
+	 */
+	protected void sequence_LiteralSuperInstance(ISerializationContext context, LiteralSuperInstance semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralSuperInstanceAccess().getSymbolSuperKeyword_1_0(), semanticObject.getSymbol());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralSystemInstance
+	 *     Expression returns LiteralSystemInstance
+	 *     conditionalExpression returns LiteralSystemInstance
+	 *     conditionalExpression.Expression_1_0 returns LiteralSystemInstance
+	 *     conditionalOrExpression returns LiteralSystemInstance
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralSystemInstance
+	 *     conditionalAndExpression returns LiteralSystemInstance
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralSystemInstance
+	 *     equalityExpression returns LiteralSystemInstance
+	 *     equalityExpression.Expression_1_0 returns LiteralSystemInstance
+	 *     relationalExpression returns LiteralSystemInstance
+	 *     relationalExpression.Expression_1_0 returns LiteralSystemInstance
+	 *     additiveExpression returns LiteralSystemInstance
+	 *     additiveExpression.Expression_1_0 returns LiteralSystemInstance
+	 *     multiplicativeExpression returns LiteralSystemInstance
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralSystemInstance
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralSystemInstance
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralSystemInstance
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralSystemInstance
+	 *     primaryExpression returns LiteralSystemInstance
+	 *     LiteralExpression returns LiteralSystemInstance
+	 *     LiteralInstanceReference returns LiteralSystemInstance
+	 *     LiteralSystemInstance returns LiteralSystemInstance
+	 *
+	 * Constraint:
+	 *     symbol='$system'
+	 */
+	protected void sequence_LiteralSystemInstance(ISerializationContext context, LiteralSystemInstance semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralSystemInstanceAccess().getSymbolSystemKeyword_1_0(), semanticObject.getSymbol());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralThisInstance
+	 *     Expression returns LiteralThisInstance
+	 *     conditionalExpression returns LiteralThisInstance
+	 *     conditionalExpression.Expression_1_0 returns LiteralThisInstance
+	 *     conditionalOrExpression returns LiteralThisInstance
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralThisInstance
+	 *     conditionalAndExpression returns LiteralThisInstance
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralThisInstance
+	 *     equalityExpression returns LiteralThisInstance
+	 *     equalityExpression.Expression_1_0 returns LiteralThisInstance
+	 *     relationalExpression returns LiteralThisInstance
+	 *     relationalExpression.Expression_1_0 returns LiteralThisInstance
+	 *     additiveExpression returns LiteralThisInstance
+	 *     additiveExpression.Expression_1_0 returns LiteralThisInstance
+	 *     multiplicativeExpression returns LiteralThisInstance
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralThisInstance
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralThisInstance
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralThisInstance
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralThisInstance
+	 *     primaryExpression returns LiteralThisInstance
+	 *     LiteralExpression returns LiteralThisInstance
+	 *     LiteralInstanceReference returns LiteralThisInstance
+	 *     LiteralThisInstance returns LiteralThisInstance
+	 *
+	 * Constraint:
+	 *     symbol='$this'
+	 */
+	protected void sequence_LiteralThisInstance(ISerializationContext context, LiteralThisInstance semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralThisInstanceAccess().getSymbolThisKeyword_1_0(), semanticObject.getSymbol());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralTimeDeltaVariable
+	 *     Expression returns LiteralTimeDeltaVariable
+	 *     conditionalExpression returns LiteralTimeDeltaVariable
+	 *     conditionalExpression.Expression_1_0 returns LiteralTimeDeltaVariable
+	 *     conditionalOrExpression returns LiteralTimeDeltaVariable
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralTimeDeltaVariable
+	 *     conditionalAndExpression returns LiteralTimeDeltaVariable
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralTimeDeltaVariable
+	 *     equalityExpression returns LiteralTimeDeltaVariable
+	 *     equalityExpression.Expression_1_0 returns LiteralTimeDeltaVariable
+	 *     relationalExpression returns LiteralTimeDeltaVariable
+	 *     relationalExpression.Expression_1_0 returns LiteralTimeDeltaVariable
+	 *     additiveExpression returns LiteralTimeDeltaVariable
+	 *     additiveExpression.Expression_1_0 returns LiteralTimeDeltaVariable
+	 *     multiplicativeExpression returns LiteralTimeDeltaVariable
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralTimeDeltaVariable
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralTimeDeltaVariable
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralTimeDeltaVariable
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralTimeDeltaVariable
+	 *     primaryExpression returns LiteralTimeDeltaVariable
+	 *     LiteralExpression returns LiteralTimeDeltaVariable
+	 *     LiteralVariableReference returns LiteralTimeDeltaVariable
+	 *     LiteralTimeDeltaVariable returns LiteralTimeDeltaVariable
+	 *
+	 * Constraint:
+	 *     symbol='$delta'
+	 */
+	protected void sequence_LiteralTimeDeltaVariable(ISerializationContext context, LiteralTimeDeltaVariable semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralTimeDeltaVariableAccess().getSymbolDeltaKeyword_1_0(), semanticObject.getSymbol());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSpecification returns LiteralTimeVariable
+	 *     Expression returns LiteralTimeVariable
+	 *     conditionalExpression returns LiteralTimeVariable
+	 *     conditionalExpression.Expression_1_0 returns LiteralTimeVariable
+	 *     conditionalOrExpression returns LiteralTimeVariable
+	 *     conditionalOrExpression.Expression_1_0 returns LiteralTimeVariable
+	 *     conditionalAndExpression returns LiteralTimeVariable
+	 *     conditionalAndExpression.Expression_1_0 returns LiteralTimeVariable
+	 *     equalityExpression returns LiteralTimeVariable
+	 *     equalityExpression.Expression_1_0 returns LiteralTimeVariable
+	 *     relationalExpression returns LiteralTimeVariable
+	 *     relationalExpression.Expression_1_0 returns LiteralTimeVariable
+	 *     additiveExpression returns LiteralTimeVariable
+	 *     additiveExpression.Expression_1_0 returns LiteralTimeVariable
+	 *     multiplicativeExpression returns LiteralTimeVariable
+	 *     multiplicativeExpression.Expression_1_0_0 returns LiteralTimeVariable
+	 *     multiplicativeExpression.Expression_1_1_0 returns LiteralTimeVariable
+	 *     multiplicativeExpression.Expression_1_2_0 returns LiteralTimeVariable
+	 *     multiplicativeExpression.Expression_1_3_0 returns LiteralTimeVariable
+	 *     primaryExpression returns LiteralTimeVariable
+	 *     LiteralExpression returns LiteralTimeVariable
+	 *     LiteralVariableReference returns LiteralTimeVariable
+	 *     LiteralTimeVariable returns LiteralTimeVariable
+	 *
+	 * Constraint:
+	 *     symbol='$time'
+	 */
+	protected void sequence_LiteralTimeVariable(ISerializationContext context, LiteralTimeVariable semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_VALUE__SYMBOL));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralTimeVariableAccess().getSymbolTimeKeyword_1_0(), semanticObject.getSymbol());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Object returns WObject
+	 *
+	 * Constraint:
+	 *     (
+	 *         (type=UFI name=UFI? description=EString? (element+=Object | element+=Property)*) | 
+	 *         (name=UFI (type=UFI description=EString?)? (element+=Object | element+=Property)*)
+	 *     )
+	 */
+	protected void sequence_Object(ISerializationContext context, WObject semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Property returns WSection
+	 *     Section returns WSection
+	 *
+	 * Constraint:
+	 *     (name=XID description=EString? ((element+=Object | element+=Attribute)+ | (element+=Object | element+=Attribute)+)?)
+	 */
+	protected void sequence_Section(ISerializationContext context, WSection semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Workflow returns SEWorkflow
+	 *
+	 * Constraint:
+	 *     (
+	 *         ((type='workflow' | type='symbex-workflow') name=UFI? description=EString? element+=Object? (element+=Property? element+=Object?)*) | 
+	 *         element+=DeprecatedObject
+	 *     )
+	 */
+	protected void sequence_Workflow(ISerializationContext context, SEWorkflow semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/serializer/SEWSyntacticSequencer.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/serializer/SEWSyntacticSequencer.java
new file mode 100644
index 0000000..dbf225f
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/serializer/SEWSyntacticSequencer.java
@@ -0,0 +1,352 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.serializer;
+
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.efm.sew.xtext.services.SEWGrammarAccess;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.AbstractElementAlias;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.AlternativeAlias;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.GroupAlias;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.TokenAlias;
+import org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider.ISynNavigable;
+import org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider.ISynTransition;
+import org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer;
+
+@SuppressWarnings("all")
+public class SEWSyntacticSequencer extends AbstractSyntacticSequencer {
+
+	protected SEWGrammarAccess grammarAccess;
+	protected AbstractElementAlias match_Attribute_SemicolonKeyword_4_q;
+	protected AbstractElementAlias match_DeprecatedAttribute_SemicolonKeyword_4_q;
+	protected AbstractElementAlias match_DeprecatedObject_AmpersandKeyword_0_5_q;
+	protected AbstractElementAlias match_DeprecatedObject_AmpersandKeyword_1_5_q;
+	protected AbstractElementAlias match_DeprecatedSection_ColonKeyword_1_2_1_0_or___LeftSquareBracketKeyword_1_2_0_0_RightSquareBracketKeyword_1_2_0_2__;
+	protected AbstractElementAlias match_DeprecatedSection_XIDParserRuleCall_0_5_q;
+	protected AbstractElementAlias match_LiteralObjectReference_AmpersandKeyword_0_q;
+	protected AbstractElementAlias match_Object_ColonEqualsSignKeyword_1_2_0_or_PlusSignColonEqualsSignKeyword_1_2_1;
+	protected AbstractElementAlias match_Section_ColonKeyword_2_1_0_or___LeftSquareBracketKeyword_2_0_0_RightSquareBracketKeyword_2_0_2__;
+	protected AbstractElementAlias match_Workflow_PrologParserRuleCall_1_q;
+	protected AbstractElementAlias match_conditionalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1;
+	protected AbstractElementAlias match_conditionalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0;
+	protected AbstractElementAlias match_primaryExpression___LeftParenthesisKeyword_3_0_or_PlusSignKeyword_0_0__a;
+	protected AbstractElementAlias match_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__a;
+	protected AbstractElementAlias match_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__p;
+	
+	@Inject
+	protected void init(IGrammarAccess access) {
+		grammarAccess = (SEWGrammarAccess) access;
+		match_Attribute_SemicolonKeyword_4_q = new TokenAlias(false, true, grammarAccess.getAttributeAccess().getSemicolonKeyword_4());
+		match_DeprecatedAttribute_SemicolonKeyword_4_q = new TokenAlias(false, true, grammarAccess.getDeprecatedAttributeAccess().getSemicolonKeyword_4());
+		match_DeprecatedObject_AmpersandKeyword_0_5_q = new TokenAlias(false, true, grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_0_5());
+		match_DeprecatedObject_AmpersandKeyword_1_5_q = new TokenAlias(false, true, grammarAccess.getDeprecatedObjectAccess().getAmpersandKeyword_1_5());
+		match_DeprecatedSection_ColonKeyword_1_2_1_0_or___LeftSquareBracketKeyword_1_2_0_0_RightSquareBracketKeyword_1_2_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getDeprecatedSectionAccess().getLeftSquareBracketKeyword_1_2_0_0()), new TokenAlias(false, false, grammarAccess.getDeprecatedSectionAccess().getRightSquareBracketKeyword_1_2_0_2())), new TokenAlias(false, false, grammarAccess.getDeprecatedSectionAccess().getColonKeyword_1_2_1_0()));
+		match_DeprecatedSection_XIDParserRuleCall_0_5_q = new TokenAlias(false, true, grammarAccess.getDeprecatedSectionAccess().getXIDParserRuleCall_0_5());
+		match_LiteralObjectReference_AmpersandKeyword_0_q = new TokenAlias(false, true, grammarAccess.getLiteralObjectReferenceAccess().getAmpersandKeyword_0());
+		match_Object_ColonEqualsSignKeyword_1_2_0_or_PlusSignColonEqualsSignKeyword_1_2_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getObjectAccess().getColonEqualsSignKeyword_1_2_0()), new TokenAlias(false, false, grammarAccess.getObjectAccess().getPlusSignColonEqualsSignKeyword_1_2_1()));
+		match_Section_ColonKeyword_2_1_0_or___LeftSquareBracketKeyword_2_0_0_RightSquareBracketKeyword_2_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getSectionAccess().getLeftSquareBracketKeyword_2_0_0()), new TokenAlias(false, false, grammarAccess.getSectionAccess().getRightSquareBracketKeyword_2_0_2())), new TokenAlias(false, false, grammarAccess.getSectionAccess().getColonKeyword_2_1_0()));
+		match_Workflow_PrologParserRuleCall_1_q = new TokenAlias(false, true, grammarAccess.getWorkflowAccess().getPrologParserRuleCall_1());
+		match_conditionalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getConditionalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()), new TokenAlias(false, false, grammarAccess.getConditionalAndExpressionAccess().getAndKeyword_1_3_0_1()));
+		match_conditionalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getConditionalOrExpressionAccess().getOrKeyword_1_3_0_1()), new TokenAlias(false, false, grammarAccess.getConditionalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()));
+		match_primaryExpression___LeftParenthesisKeyword_3_0_or_PlusSignKeyword_0_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getPrimaryExpressionAccess().getLeftParenthesisKeyword_3_0()), new TokenAlias(false, false, grammarAccess.getPrimaryExpressionAccess().getPlusSignKeyword_0_0()));
+		match_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__a = new GroupAlias(true, true, new TokenAlias(true, true, grammarAccess.getPrimaryExpressionAccess().getPlusSignKeyword_0_0()), new TokenAlias(false, false, grammarAccess.getPrimaryExpressionAccess().getLeftParenthesisKeyword_3_0()));
+		match_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__p = new GroupAlias(true, false, new TokenAlias(true, true, grammarAccess.getPrimaryExpressionAccess().getPlusSignKeyword_0_0()), new TokenAlias(false, false, grammarAccess.getPrimaryExpressionAccess().getLeftParenthesisKeyword_3_0()));
+	}
+	
+	@Override
+	protected String getUnassignedRuleCallToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+		if (ruleCall.getRule() == grammarAccess.getPrologRule())
+			return getPrologToken(semanticObject, ruleCall, node);
+		else if (ruleCall.getRule() == grammarAccess.getXIDRule())
+			return getXIDToken(semanticObject, ruleCall, node);
+		return "";
+	}
+	
+	/**
+	 * Prolog
+	 * : ( '@sew' | '@favm' ) '<'
+	 * 	( 'workflow' | 'sew' )
+	 * 	( ',' EDouble )? ( ',' UFI | EString )? '>:'
+	 * ;
+	 */
+	protected String getPrologToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+		if (node != null)
+			return getTokenText(node);
+		return "@sew<workflow>:";
+	}
+	
+	/**
+	 * XID returns ecore::EString
+	 * : ReservedWord | XIDENDIFIER
+	 * ;
+	 */
+	protected String getXIDToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+		if (node != null)
+			return getTokenText(node);
+		return "workflow";
+	}
+	
+	@Override
+	protected void emitUnassignedTokens(EObject semanticObject, ISynTransition transition, INode fromNode, INode toNode) {
+		if (transition.getAmbiguousSyntaxes().isEmpty()) return;
+		List<INode> transitionNodes = collectNodes(fromNode, toNode);
+		for (AbstractElementAlias syntax : transition.getAmbiguousSyntaxes()) {
+			List<INode> syntaxNodes = getNodesFor(transitionNodes, syntax);
+			if (match_Attribute_SemicolonKeyword_4_q.equals(syntax))
+				emit_Attribute_SemicolonKeyword_4_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DeprecatedAttribute_SemicolonKeyword_4_q.equals(syntax))
+				emit_DeprecatedAttribute_SemicolonKeyword_4_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DeprecatedObject_AmpersandKeyword_0_5_q.equals(syntax))
+				emit_DeprecatedObject_AmpersandKeyword_0_5_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DeprecatedObject_AmpersandKeyword_1_5_q.equals(syntax))
+				emit_DeprecatedObject_AmpersandKeyword_1_5_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DeprecatedSection_ColonKeyword_1_2_1_0_or___LeftSquareBracketKeyword_1_2_0_0_RightSquareBracketKeyword_1_2_0_2__.equals(syntax))
+				emit_DeprecatedSection_ColonKeyword_1_2_1_0_or___LeftSquareBracketKeyword_1_2_0_0_RightSquareBracketKeyword_1_2_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DeprecatedSection_XIDParserRuleCall_0_5_q.equals(syntax))
+				emit_DeprecatedSection_XIDParserRuleCall_0_5_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_LiteralObjectReference_AmpersandKeyword_0_q.equals(syntax))
+				emit_LiteralObjectReference_AmpersandKeyword_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Object_ColonEqualsSignKeyword_1_2_0_or_PlusSignColonEqualsSignKeyword_1_2_1.equals(syntax))
+				emit_Object_ColonEqualsSignKeyword_1_2_0_or_PlusSignColonEqualsSignKeyword_1_2_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Section_ColonKeyword_2_1_0_or___LeftSquareBracketKeyword_2_0_0_RightSquareBracketKeyword_2_0_2__.equals(syntax))
+				emit_Section_ColonKeyword_2_1_0_or___LeftSquareBracketKeyword_2_0_0_RightSquareBracketKeyword_2_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Workflow_PrologParserRuleCall_1_q.equals(syntax))
+				emit_Workflow_PrologParserRuleCall_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_conditionalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1.equals(syntax))
+				emit_conditionalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_conditionalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0.equals(syntax))
+				emit_conditionalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_primaryExpression___LeftParenthesisKeyword_3_0_or_PlusSignKeyword_0_0__a.equals(syntax))
+				emit_primaryExpression___LeftParenthesisKeyword_3_0_or_PlusSignKeyword_0_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__a.equals(syntax))
+				emit_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__p.equals(syntax))
+				emit_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else acceptNodes(getLastNavigableState(), syntaxNodes);
+		}
+	}
+
+	/**
+	 * Ambiguous syntax:
+	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     value=ValueSpecification (ambiguity) (rule end)
+	 */
+	protected void emit_Attribute_SemicolonKeyword_4_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ';'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     value=ValueSpecification (ambiguity) (rule end)
+	 */
+	protected void emit_DeprecatedAttribute_SemicolonKeyword_4_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '&'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     description=EString 'as' (ambiguity) type=UFI
+	 *     name=UFI 'as' (ambiguity) type=UFI
+	 */
+	protected void emit_DeprecatedObject_AmpersandKeyword_0_5_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '&'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     description=EString 'as' (ambiguity) type=UFI
+	 *     name=UFI 'as' (ambiguity) type=UFI
+	 */
+	protected void emit_DeprecatedObject_AmpersandKeyword_1_5_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ':' | ('[' ']')
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     description=EString (ambiguity) (rule end)
+	 *     name=XID (ambiguity) (rule end)
+	 */
+	protected void emit_DeprecatedSection_ColonKeyword_1_2_1_0_or___LeftSquareBracketKeyword_1_2_0_0_RightSquareBracketKeyword_1_2_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     XID?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     element+=DeprecatedAttribute 'endsection' (ambiguity) (rule end)
+	 *     element+=DeprecatedObject 'endsection' (ambiguity) (rule end)
+	 *     element+=Object 'endsection' (ambiguity) (rule end)
+	 *     name=XID 'endsection' (ambiguity) (rule end)
+	 */
+	protected void emit_DeprecatedSection_XIDParserRuleCall_0_5_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '&'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) ('(' | '+')* (ambiguity) object=[WObject|UFI]
+	 *     (rule start) ('(' | '+')* (ambiguity) symbol=UFI
+	 *     (rule start) ('+' | '(')* (ambiguity) object=[WObject|UFI]
+	 *     (rule start) ('+' | '(')* (ambiguity) symbol=UFI
+	 *     (rule start) (ambiguity) object=[WObject|UFI]
+	 *     (rule start) (ambiguity) symbol=UFI
+	 */
+	protected void emit_LiteralObjectReference_AmpersandKeyword_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ':=' | '+:='
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=UFI (ambiguity) '{' '}' (rule end)
+	 *     name=UFI (ambiguity) '{' element+=Object
+	 *     name=UFI (ambiguity) '{' element+=Property
+	 *     name=UFI (ambiguity) type=UFI
+	 */
+	protected void emit_Object_ColonEqualsSignKeyword_1_2_0_or_PlusSignColonEqualsSignKeyword_1_2_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ':' | ('[' ']')
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     description=EString (ambiguity) (rule end)
+	 *     name=XID (ambiguity) (rule end)
+	 */
+	protected void emit_Section_ColonKeyword_2_1_0_or___LeftSquareBracketKeyword_2_0_0_RightSquareBracketKeyword_2_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     Prolog?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) element+=DeprecatedObject
+	 *     (rule start) (ambiguity) type='symbex-workflow'
+	 *     (rule start) (ambiguity) type='workflow'
+	 */
+	protected void emit_Workflow_PrologParserRuleCall_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'and' | '&&'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     operand+=equalityExpression (ambiguity) operand+=equalityExpression
+	 */
+	protected void emit_conditionalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'or' | '||'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     operand+=conditionalAndExpression (ambiguity) operand+=conditionalAndExpression
+	 */
+	protected void emit_conditionalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('(' | '+')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '&'? object=[WObject|UFI]
+	 *     (rule start) (ambiguity) '&'? symbol=UFI
+	 *     (rule start) (ambiguity) '[' ']' (rule start)
+	 *     (rule start) (ambiguity) '[' values+=ValueSpecification
+	 *     (rule start) (ambiguity) 'null' '<' type=XID
+	 *     (rule start) (ambiguity) 'null' (rule start)
+	 *     (rule start) (ambiguity) numerator=ELong
+	 *     (rule start) (ambiguity) operator='!'
+	 *     (rule start) (ambiguity) operator='-'
+	 *     (rule start) (ambiguity) operator='not'
+	 *     (rule start) (ambiguity) symbol='$delta'
+	 *     (rule start) (ambiguity) symbol='$env'
+	 *     (rule start) (ambiguity) symbol='$parent'
+	 *     (rule start) (ambiguity) symbol='$self'
+	 *     (rule start) (ambiguity) symbol='$super'
+	 *     (rule start) (ambiguity) symbol='$system'
+	 *     (rule start) (ambiguity) symbol='$this'
+	 *     (rule start) (ambiguity) symbol='$time'
+	 *     (rule start) (ambiguity) symbol='env'
+	 *     (rule start) (ambiguity) value=EBoolean
+	 *     (rule start) (ambiguity) value=EChar
+	 *     (rule start) (ambiguity) value=EDouble
+	 *     (rule start) (ambiguity) value=ELong
+	 *     (rule start) (ambiguity) value=EString
+	 */
+	protected void emit_primaryExpression___LeftParenthesisKeyword_3_0_or_PlusSignKeyword_0_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('+'* '(')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '${' operator='|;|'
+	 *     (rule start) (ambiguity) '${' operator='|i|'
+	 *     (rule start) (ambiguity) {Expression.operand+=}
+	 */
+	protected void emit_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('+'* '(')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '${' operator='|;|'
+	 *     (rule start) (ambiguity) '${' operator='|i|'
+	 *     (rule start) (ambiguity) {Expression.operand+=}
+	 */
+	protected void emit_primaryExpression___PlusSignKeyword_0_0_a_LeftParenthesisKeyword_3_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/services/SEWGrammarAccess.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/services/SEWGrammarAccess.java
new file mode 100644
index 0000000..b57913b
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/services/SEWGrammarAccess.java
@@ -0,0 +1,3325 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.services;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.List;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.Grammar;
+import org.eclipse.xtext.GrammarUtil;
+import org.eclipse.xtext.Group;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.TerminalRule;
+import org.eclipse.xtext.common.services.TerminalsGrammarAccess;
+import org.eclipse.xtext.service.AbstractElementFinder.AbstractGrammarElementFinder;
+import org.eclipse.xtext.service.GrammarProvider;
+
+@Singleton
+public class SEWGrammarAccess extends AbstractGrammarElementFinder {
+	
+	public class WorkflowElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.Workflow");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cSEWorkflowAction_0 = (Action)cGroup.eContents().get(0);
+		private final RuleCall cPrologParserRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
+		private final Assignment cTypeAssignment_2_0_0 = (Assignment)cGroup_2_0.eContents().get(0);
+		private final Alternatives cTypeAlternatives_2_0_0_0 = (Alternatives)cTypeAssignment_2_0_0.eContents().get(0);
+		private final Keyword cTypeWorkflowKeyword_2_0_0_0_0 = (Keyword)cTypeAlternatives_2_0_0_0.eContents().get(0);
+		private final Keyword cTypeSymbexWorkflowKeyword_2_0_0_0_1 = (Keyword)cTypeAlternatives_2_0_0_0.eContents().get(1);
+		private final Assignment cNameAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
+		private final RuleCall cNameUFIParserRuleCall_2_0_1_0 = (RuleCall)cNameAssignment_2_0_1.eContents().get(0);
+		private final Assignment cDescriptionAssignment_2_0_2 = (Assignment)cGroup_2_0.eContents().get(2);
+		private final RuleCall cDescriptionEStringParserRuleCall_2_0_2_0 = (RuleCall)cDescriptionAssignment_2_0_2.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_2_0_3 = (Keyword)cGroup_2_0.eContents().get(3);
+		private final Assignment cElementAssignment_2_0_4 = (Assignment)cGroup_2_0.eContents().get(4);
+		private final Alternatives cElementAlternatives_2_0_4_0 = (Alternatives)cElementAssignment_2_0_4.eContents().get(0);
+		private final RuleCall cElementObjectParserRuleCall_2_0_4_0_0 = (RuleCall)cElementAlternatives_2_0_4_0.eContents().get(0);
+		private final RuleCall cElementPropertyParserRuleCall_2_0_4_0_1 = (RuleCall)cElementAlternatives_2_0_4_0.eContents().get(1);
+		private final Keyword cRightCurlyBracketKeyword_2_0_5 = (Keyword)cGroup_2_0.eContents().get(5);
+		private final Assignment cElementAssignment_2_1 = (Assignment)cAlternatives_2.eContents().get(1);
+		private final RuleCall cElementDeprecatedObjectParserRuleCall_2_1_0 = (RuleCall)cElementAssignment_2_1.eContents().get(0);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Symbolic Execution Workflow Specification
+		//////////////////////////////////////////////////////////////////////////////////
+		//Workflow sew::SEWorkflow:
+		//	{sew::SEWorkflow} Prolog? (type=('workflow' | 'symbex-workflow') name=UFI? description=EString?
+		//	'{'
+		//	element+=(Object | Property)*
+		//	'}'
+		//	// Deprecated Object as FAVM Workflow
+		//	| element+=DeprecatedObject)
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{sew::SEWorkflow} Prolog? (type=('workflow' | 'symbex-workflow') name=UFI? description=EString? '{' element+=(Object |
+		//Property)* '}' // Deprecated Object as FAVM Workflow
+		//| element+=DeprecatedObject)
+		public Group getGroup() { return cGroup; }
+		
+		//{sew::SEWorkflow}
+		public Action getSEWorkflowAction_0() { return cSEWorkflowAction_0; }
+		
+		//Prolog?
+		public RuleCall getPrologParserRuleCall_1() { return cPrologParserRuleCall_1; }
+		
+		//(type=('workflow' | 'symbex-workflow') name=UFI? description=EString? '{' element+=(Object | Property)* '}' // Deprecated Object as FAVM Workflow
+		//| element+=DeprecatedObject)
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//type=('workflow' | 'symbex-workflow') name=UFI? description=EString? '{' element+=(Object | Property)* '}'
+		public Group getGroup_2_0() { return cGroup_2_0; }
+		
+		//type=('workflow' | 'symbex-workflow')
+		public Assignment getTypeAssignment_2_0_0() { return cTypeAssignment_2_0_0; }
+		
+		//('workflow' | 'symbex-workflow')
+		public Alternatives getTypeAlternatives_2_0_0_0() { return cTypeAlternatives_2_0_0_0; }
+		
+		//'workflow'
+		public Keyword getTypeWorkflowKeyword_2_0_0_0_0() { return cTypeWorkflowKeyword_2_0_0_0_0; }
+		
+		//'symbex-workflow'
+		public Keyword getTypeSymbexWorkflowKeyword_2_0_0_0_1() { return cTypeSymbexWorkflowKeyword_2_0_0_0_1; }
+		
+		//name=UFI?
+		public Assignment getNameAssignment_2_0_1() { return cNameAssignment_2_0_1; }
+		
+		//UFI
+		public RuleCall getNameUFIParserRuleCall_2_0_1_0() { return cNameUFIParserRuleCall_2_0_1_0; }
+		
+		//description=EString?
+		public Assignment getDescriptionAssignment_2_0_2() { return cDescriptionAssignment_2_0_2; }
+		
+		//EString
+		public RuleCall getDescriptionEStringParserRuleCall_2_0_2_0() { return cDescriptionEStringParserRuleCall_2_0_2_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_2_0_3() { return cLeftCurlyBracketKeyword_2_0_3; }
+		
+		//element+=(Object | Property)*
+		public Assignment getElementAssignment_2_0_4() { return cElementAssignment_2_0_4; }
+		
+		//(Object | Property)
+		public Alternatives getElementAlternatives_2_0_4_0() { return cElementAlternatives_2_0_4_0; }
+		
+		//Object
+		public RuleCall getElementObjectParserRuleCall_2_0_4_0_0() { return cElementObjectParserRuleCall_2_0_4_0_0; }
+		
+		//Property
+		public RuleCall getElementPropertyParserRuleCall_2_0_4_0_1() { return cElementPropertyParserRuleCall_2_0_4_0_1; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_2_0_5() { return cRightCurlyBracketKeyword_2_0_5; }
+		
+		//element+=DeprecatedObject
+		public Assignment getElementAssignment_2_1() { return cElementAssignment_2_1; }
+		
+		//DeprecatedObject
+		public RuleCall getElementDeprecatedObjectParserRuleCall_2_1_0() { return cElementDeprecatedObjectParserRuleCall_2_1_0; }
+	}
+	public class PrologElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.Prolog");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Alternatives cAlternatives_0 = (Alternatives)cGroup.eContents().get(0);
+		private final Keyword cSewKeyword_0_0 = (Keyword)cAlternatives_0.eContents().get(0);
+		private final Keyword cFavmKeyword_0_1 = (Keyword)cAlternatives_0.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Keyword cWorkflowKeyword_2_0 = (Keyword)cAlternatives_2.eContents().get(0);
+		private final Keyword cSewKeyword_2_1 = (Keyword)cAlternatives_2.eContents().get(1);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Keyword cCommaKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final RuleCall cEDoubleParserRuleCall_3_1 = (RuleCall)cGroup_3.eContents().get(1);
+		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
+		private final Group cGroup_4_0 = (Group)cAlternatives_4.eContents().get(0);
+		private final Keyword cCommaKeyword_4_0_0 = (Keyword)cGroup_4_0.eContents().get(0);
+		private final RuleCall cUFIParserRuleCall_4_0_1 = (RuleCall)cGroup_4_0.eContents().get(1);
+		private final RuleCall cEStringParserRuleCall_4_1 = (RuleCall)cAlternatives_4.eContents().get(1);
+		private final Keyword cGreaterThanSignColonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//Prolog:
+		//	('@sew' | '@favm') '<' ('workflow' | 'sew') (',' EDouble)? (',' UFI | EString)? '>:';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//('@sew' | '@favm') '<' ('workflow' | 'sew') (',' EDouble)? (',' UFI | EString)? '>:'
+		public Group getGroup() { return cGroup; }
+		
+		//('@sew' | '@favm')
+		public Alternatives getAlternatives_0() { return cAlternatives_0; }
+		
+		//'@sew'
+		public Keyword getSewKeyword_0_0() { return cSewKeyword_0_0; }
+		
+		//'@favm'
+		public Keyword getFavmKeyword_0_1() { return cFavmKeyword_0_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
+		
+		//('workflow' | 'sew')
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//'workflow'
+		public Keyword getWorkflowKeyword_2_0() { return cWorkflowKeyword_2_0; }
+		
+		//'sew'
+		public Keyword getSewKeyword_2_1() { return cSewKeyword_2_1; }
+		
+		//(',' EDouble)?
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//','
+		public Keyword getCommaKeyword_3_0() { return cCommaKeyword_3_0; }
+		
+		//EDouble
+		public RuleCall getEDoubleParserRuleCall_3_1() { return cEDoubleParserRuleCall_3_1; }
+		
+		//(',' UFI | EString)?
+		public Alternatives getAlternatives_4() { return cAlternatives_4; }
+		
+		//',' UFI
+		public Group getGroup_4_0() { return cGroup_4_0; }
+		
+		//','
+		public Keyword getCommaKeyword_4_0_0() { return cCommaKeyword_4_0_0; }
+		
+		//UFI
+		public RuleCall getUFIParserRuleCall_4_0_1() { return cUFIParserRuleCall_4_0_1; }
+		
+		//EString
+		public RuleCall getEStringParserRuleCall_4_1() { return cEStringParserRuleCall_4_1; }
+		
+		//'>:'
+		public Keyword getGreaterThanSignColonKeyword_5() { return cGreaterThanSignColonKeyword_5; }
+	}
+	public class ReservedWordElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.ReservedWord");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cWorkflowKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cSewKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		private final RuleCall cDeprecatedReservedWordParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// [ Qualified ] Identifier
+		//////////////////////////////////////////////////////////////////////////////////
+		//ReservedWord:
+		//	'workflow' | 'sew'
+		//	// Deprecated
+		//	| DeprecatedReservedWord;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'workflow' | 'sew' // Deprecated
+		//| DeprecatedReservedWord
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'workflow'
+		public Keyword getWorkflowKeyword_0() { return cWorkflowKeyword_0; }
+		
+		//'sew'
+		public Keyword getSewKeyword_1() { return cSewKeyword_1; }
+		
+		//DeprecatedReservedWord
+		public RuleCall getDeprecatedReservedWordParserRuleCall_2() { return cDeprecatedReservedWordParserRuleCall_2; }
+	}
+	public class XIDElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.XID");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cReservedWordParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cXIDENDIFIERTerminalRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//XID:
+		//	ReservedWord | XIDENDIFIER;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//ReservedWord | XIDENDIFIER
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//ReservedWord
+		public RuleCall getReservedWordParserRuleCall_0() { return cReservedWordParserRuleCall_0; }
+		
+		//XIDENDIFIER
+		public RuleCall getXIDENDIFIERTerminalRuleCall_1() { return cXIDENDIFIERTerminalRuleCall_1; }
+	}
+	public class UFIElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.UFI");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cXIDParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_1_0 = (Alternatives)cGroup_1.eContents().get(0);
+		private final Keyword cColonColonKeyword_1_0_0 = (Keyword)cAlternatives_1_0.eContents().get(0);
+		private final Keyword cFullStopKeyword_1_0_1 = (Keyword)cAlternatives_1_0.eContents().get(1);
+		private final RuleCall cXIDParserRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
+		
+		//UFI:
+		//	XID (('::' | '.') XID)*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//XID (('::' | '.') XID)*
+		public Group getGroup() { return cGroup; }
+		
+		//XID
+		public RuleCall getXIDParserRuleCall_0() { return cXIDParserRuleCall_0; }
+		
+		//(('::' | '.') XID)*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//('::' | '.')
+		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
+		
+		//'::'
+		public Keyword getColonColonKeyword_1_0_0() { return cColonColonKeyword_1_0_0; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_1_0_1() { return cFullStopKeyword_1_0_1; }
+		
+		//XID
+		public RuleCall getXIDParserRuleCall_1_1() { return cXIDParserRuleCall_1_1; }
+	}
+	public class ObjectElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.Object");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Action cWObjectAction_0_0 = (Action)cGroup_0.eContents().get(0);
+		private final Assignment cTypeAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
+		private final RuleCall cTypeUFIParserRuleCall_0_1_0 = (RuleCall)cTypeAssignment_0_1.eContents().get(0);
+		private final Assignment cNameAssignment_0_2 = (Assignment)cGroup_0.eContents().get(2);
+		private final RuleCall cNameUFIParserRuleCall_0_2_0 = (RuleCall)cNameAssignment_0_2.eContents().get(0);
+		private final Assignment cDescriptionAssignment_0_3 = (Assignment)cGroup_0.eContents().get(3);
+		private final RuleCall cDescriptionEStringParserRuleCall_0_3_0 = (RuleCall)cDescriptionAssignment_0_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_0_4 = (Keyword)cGroup_0.eContents().get(4);
+		private final Assignment cElementAssignment_0_5 = (Assignment)cGroup_0.eContents().get(5);
+		private final Alternatives cElementAlternatives_0_5_0 = (Alternatives)cElementAssignment_0_5.eContents().get(0);
+		private final RuleCall cElementObjectParserRuleCall_0_5_0_0 = (RuleCall)cElementAlternatives_0_5_0.eContents().get(0);
+		private final RuleCall cElementPropertyParserRuleCall_0_5_0_1 = (RuleCall)cElementAlternatives_0_5_0.eContents().get(1);
+		private final Keyword cRightCurlyBracketKeyword_0_6 = (Keyword)cGroup_0.eContents().get(6);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Action cWObjectAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cNameAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cNameUFIParserRuleCall_1_1_0 = (RuleCall)cNameAssignment_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_2 = (Alternatives)cGroup_1.eContents().get(2);
+		private final Keyword cColonEqualsSignKeyword_1_2_0 = (Keyword)cAlternatives_1_2.eContents().get(0);
+		private final Keyword cPlusSignColonEqualsSignKeyword_1_2_1 = (Keyword)cAlternatives_1_2.eContents().get(1);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Assignment cTypeAssignment_1_3_0 = (Assignment)cGroup_1_3.eContents().get(0);
+		private final RuleCall cTypeUFIParserRuleCall_1_3_0_0 = (RuleCall)cTypeAssignment_1_3_0.eContents().get(0);
+		private final Assignment cDescriptionAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cDescriptionEStringParserRuleCall_1_3_1_0 = (RuleCall)cDescriptionAssignment_1_3_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_1_4 = (Keyword)cGroup_1.eContents().get(4);
+		private final Assignment cElementAssignment_1_5 = (Assignment)cGroup_1.eContents().get(5);
+		private final Alternatives cElementAlternatives_1_5_0 = (Alternatives)cElementAssignment_1_5.eContents().get(0);
+		private final RuleCall cElementObjectParserRuleCall_1_5_0_0 = (RuleCall)cElementAlternatives_1_5_0.eContents().get(0);
+		private final RuleCall cElementPropertyParserRuleCall_1_5_0_1 = (RuleCall)cElementAlternatives_1_5_0.eContents().get(1);
+		private final Keyword cRightCurlyBracketKeyword_1_6 = (Keyword)cGroup_1.eContents().get(6);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Object Configuration Specification
+		//////////////////////////////////////////////////////////////////////////////////
+		//Object sew::WObject:
+		//	{sew::WObject} type=UFI name=UFI? description=EString?
+		//	'{'
+		//	element+=(Object | Property)*
+		//	'}'
+		//	| {sew::WObject} name=UFI (':=' | '+:=') (type=UFI description=EString?)?
+		//	'{'
+		//	element+=(Object | Property)*
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{sew::WObject} type=UFI name=UFI? description=EString? '{' element+=(Object | Property)* '}' | {sew::WObject} name=UFI
+		//(':=' | '+:=') (type=UFI description=EString?)? '{' element+=(Object | Property)* '}'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//{sew::WObject} type=UFI name=UFI? description=EString? '{' element+=(Object | Property)* '}'
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//{sew::WObject}
+		public Action getWObjectAction_0_0() { return cWObjectAction_0_0; }
+		
+		//type=UFI
+		public Assignment getTypeAssignment_0_1() { return cTypeAssignment_0_1; }
+		
+		//UFI
+		public RuleCall getTypeUFIParserRuleCall_0_1_0() { return cTypeUFIParserRuleCall_0_1_0; }
+		
+		//name=UFI?
+		public Assignment getNameAssignment_0_2() { return cNameAssignment_0_2; }
+		
+		//UFI
+		public RuleCall getNameUFIParserRuleCall_0_2_0() { return cNameUFIParserRuleCall_0_2_0; }
+		
+		//description=EString?
+		public Assignment getDescriptionAssignment_0_3() { return cDescriptionAssignment_0_3; }
+		
+		//EString
+		public RuleCall getDescriptionEStringParserRuleCall_0_3_0() { return cDescriptionEStringParserRuleCall_0_3_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_0_4() { return cLeftCurlyBracketKeyword_0_4; }
+		
+		//element+=(Object | Property)*
+		public Assignment getElementAssignment_0_5() { return cElementAssignment_0_5; }
+		
+		//(Object | Property)
+		public Alternatives getElementAlternatives_0_5_0() { return cElementAlternatives_0_5_0; }
+		
+		//Object
+		public RuleCall getElementObjectParserRuleCall_0_5_0_0() { return cElementObjectParserRuleCall_0_5_0_0; }
+		
+		//Property
+		public RuleCall getElementPropertyParserRuleCall_0_5_0_1() { return cElementPropertyParserRuleCall_0_5_0_1; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_0_6() { return cRightCurlyBracketKeyword_0_6; }
+		
+		//{sew::WObject} name=UFI (':=' | '+:=') (type=UFI description=EString?)? '{' element+=(Object | Property)* '}'
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{sew::WObject}
+		public Action getWObjectAction_1_0() { return cWObjectAction_1_0; }
+		
+		//name=UFI
+		public Assignment getNameAssignment_1_1() { return cNameAssignment_1_1; }
+		
+		//UFI
+		public RuleCall getNameUFIParserRuleCall_1_1_0() { return cNameUFIParserRuleCall_1_1_0; }
+		
+		//(':=' | '+:=')
+		public Alternatives getAlternatives_1_2() { return cAlternatives_1_2; }
+		
+		//':='
+		public Keyword getColonEqualsSignKeyword_1_2_0() { return cColonEqualsSignKeyword_1_2_0; }
+		
+		//'+:='
+		public Keyword getPlusSignColonEqualsSignKeyword_1_2_1() { return cPlusSignColonEqualsSignKeyword_1_2_1; }
+		
+		//(type=UFI description=EString?)?
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//type=UFI
+		public Assignment getTypeAssignment_1_3_0() { return cTypeAssignment_1_3_0; }
+		
+		//UFI
+		public RuleCall getTypeUFIParserRuleCall_1_3_0_0() { return cTypeUFIParserRuleCall_1_3_0_0; }
+		
+		//description=EString?
+		public Assignment getDescriptionAssignment_1_3_1() { return cDescriptionAssignment_1_3_1; }
+		
+		//EString
+		public RuleCall getDescriptionEStringParserRuleCall_1_3_1_0() { return cDescriptionEStringParserRuleCall_1_3_1_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_1_4() { return cLeftCurlyBracketKeyword_1_4; }
+		
+		//element+=(Object | Property)*
+		public Assignment getElementAssignment_1_5() { return cElementAssignment_1_5; }
+		
+		//(Object | Property)
+		public Alternatives getElementAlternatives_1_5_0() { return cElementAlternatives_1_5_0; }
+		
+		//Object
+		public RuleCall getElementObjectParserRuleCall_1_5_0_0() { return cElementObjectParserRuleCall_1_5_0_0; }
+		
+		//Property
+		public RuleCall getElementPropertyParserRuleCall_1_5_0_1() { return cElementPropertyParserRuleCall_1_5_0_1; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_1_6() { return cRightCurlyBracketKeyword_1_6; }
+	}
+	public class PropertyElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.Property");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cSectionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cAttributeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Property Specification
+		//////////////////////////////////////////////////////////////////////////////////
+		//Property sew::WProperty:
+		//	Section
+		//	| Attribute
+		@Override public ParserRule getRule() { return rule; }
+		
+		//Section | Attribute
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//Section
+		public RuleCall getSectionParserRuleCall_0() { return cSectionParserRuleCall_0; }
+		
+		//Attribute
+		public RuleCall getAttributeParserRuleCall_1() { return cAttributeParserRuleCall_1; }
+	}
+	public class SectionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.Section");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cNameXIDParserRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
+		private final Assignment cDescriptionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDescriptionEStringParserRuleCall_1_0 = (RuleCall)cDescriptionAssignment_1.eContents().get(0);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
+		private final Keyword cLeftSquareBracketKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
+		private final Assignment cElementAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
+		private final Alternatives cElementAlternatives_2_0_1_0 = (Alternatives)cElementAssignment_2_0_1.eContents().get(0);
+		private final RuleCall cElementObjectParserRuleCall_2_0_1_0_0 = (RuleCall)cElementAlternatives_2_0_1_0.eContents().get(0);
+		private final RuleCall cElementAttributeParserRuleCall_2_0_1_0_1 = (RuleCall)cElementAlternatives_2_0_1_0.eContents().get(1);
+		private final Keyword cRightSquareBracketKeyword_2_0_2 = (Keyword)cGroup_2_0.eContents().get(2);
+		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
+		private final Keyword cColonKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
+		private final Assignment cElementAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
+		private final Alternatives cElementAlternatives_2_1_1_0 = (Alternatives)cElementAssignment_2_1_1.eContents().get(0);
+		private final RuleCall cElementObjectParserRuleCall_2_1_1_0_0 = (RuleCall)cElementAlternatives_2_1_1_0.eContents().get(0);
+		private final RuleCall cElementAttributeParserRuleCall_2_1_1_0_1 = (RuleCall)cElementAlternatives_2_1_1_0.eContents().get(1);
+		
+		//Section sew::WSection:
+		//	name=XID description=EString? ('[' element+=(Object | Attribute)* ']'
+		//	| ':' element+=(Object | Attribute)*)
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name=XID description=EString? ('[' element+=(Object | Attribute)* ']' | ':' element+=(Object | Attribute)*)
+		public Group getGroup() { return cGroup; }
+		
+		//name=XID
+		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
+		
+		//XID
+		public RuleCall getNameXIDParserRuleCall_0_0() { return cNameXIDParserRuleCall_0_0; }
+		
+		//description=EString?
+		public Assignment getDescriptionAssignment_1() { return cDescriptionAssignment_1; }
+		
+		//EString
+		public RuleCall getDescriptionEStringParserRuleCall_1_0() { return cDescriptionEStringParserRuleCall_1_0; }
+		
+		//('[' element+=(Object | Attribute)* ']' | ':' element+=(Object | Attribute)*)
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//'[' element+=(Object | Attribute)* ']'
+		public Group getGroup_2_0() { return cGroup_2_0; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_2_0_0() { return cLeftSquareBracketKeyword_2_0_0; }
+		
+		//element+=(Object | Attribute)*
+		public Assignment getElementAssignment_2_0_1() { return cElementAssignment_2_0_1; }
+		
+		//(Object | Attribute)
+		public Alternatives getElementAlternatives_2_0_1_0() { return cElementAlternatives_2_0_1_0; }
+		
+		//Object
+		public RuleCall getElementObjectParserRuleCall_2_0_1_0_0() { return cElementObjectParserRuleCall_2_0_1_0_0; }
+		
+		//Attribute
+		public RuleCall getElementAttributeParserRuleCall_2_0_1_0_1() { return cElementAttributeParserRuleCall_2_0_1_0_1; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_2_0_2() { return cRightSquareBracketKeyword_2_0_2; }
+		
+		//':' element+=(Object | Attribute)*
+		public Group getGroup_2_1() { return cGroup_2_1; }
+		
+		//':'
+		public Keyword getColonKeyword_2_1_0() { return cColonKeyword_2_1_0; }
+		
+		//element+=(Object | Attribute)*
+		public Assignment getElementAssignment_2_1_1() { return cElementAssignment_2_1_1; }
+		
+		//(Object | Attribute)
+		public Alternatives getElementAlternatives_2_1_1_0() { return cElementAlternatives_2_1_1_0; }
+		
+		//Object
+		public RuleCall getElementObjectParserRuleCall_2_1_1_0_0() { return cElementObjectParserRuleCall_2_1_1_0_0; }
+		
+		//Attribute
+		public RuleCall getElementAttributeParserRuleCall_2_1_1_0_1() { return cElementAttributeParserRuleCall_2_1_1_0_1; }
+	}
+	public class AttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.Attribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cWAttributeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameXIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cEqualsSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cValueAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cValueValueSpecificationParserRuleCall_3_0 = (RuleCall)cValueAssignment_3.eContents().get(0);
+		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//Attribute sew::WAttribute:
+		//	{sew::WAttribute} name=XID '=' value=ValueSpecification ';'?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{sew::WAttribute} name=XID '=' value=ValueSpecification ';'?
+		public Group getGroup() { return cGroup; }
+		
+		//{sew::WAttribute}
+		public Action getWAttributeAction_0() { return cWAttributeAction_0; }
+		
+		//name=XID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//XID
+		public RuleCall getNameXIDParserRuleCall_1_0() { return cNameXIDParserRuleCall_1_0; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_2() { return cEqualsSignKeyword_2; }
+		
+		//value=ValueSpecification
+		public Assignment getValueAssignment_3() { return cValueAssignment_3; }
+		
+		//ValueSpecification
+		public RuleCall getValueValueSpecificationParserRuleCall_3_0() { return cValueValueSpecificationParserRuleCall_3_0; }
+		
+		//';'?
+		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
+	}
+	public class ValueSpecificationElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.ValueSpecification");
+		private final RuleCall cExpressionParserRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Value Specification
+		//////////////////////////////////////////////////////////////////////////////////
+		//ValueSpecification sew::WValueSpecification:
+		//	Expression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//Expression
+		public RuleCall getExpressionParserRuleCall() { return cExpressionParserRuleCall; }
+	}
+	public class ExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.Expression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cConditionalExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cDeprecatedExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Expression Specification
+		//////////////////////////////////////////////////////////////////////////////////
+		//Expression sew::WValueSpecification:
+		//	conditionalExpression
+		//	// Deprecated
+		//	| DeprecatedExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//conditionalExpression // Deprecated
+		//| DeprecatedExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//conditionalExpression
+		public RuleCall getConditionalExpressionParserRuleCall_0() { return cConditionalExpressionParserRuleCall_0; }
+		
+		//DeprecatedExpression
+		public RuleCall getDeprecatedExpressionParserRuleCall_1() { return cDeprecatedExpressionParserRuleCall_1; }
+	}
+	public class ConditionalExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.conditionalExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cConditionalOrExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Keyword cOperatorQuestionMarkKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		private final Keyword cColonKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
+		private final Assignment cOperandAssignment_1_4 = (Assignment)cGroup_1.eContents().get(4);
+		private final RuleCall cOperandExpressionParserRuleCall_1_4_0 = (RuleCall)cOperandAssignment_1_4.eContents().get(0);
+		
+		//conditionalExpression sew::WValueSpecification:
+		//	conditionalOrExpression ({expression::Expression.operand+=current} operator='?' operand+=Expression ':'
+		//	operand+=Expression)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//conditionalOrExpression ({expression::Expression.operand+=current} operator='?' operand+=Expression ':'
+		//operand+=Expression)?
+		public Group getGroup() { return cGroup; }
+		
+		//conditionalOrExpression
+		public RuleCall getConditionalOrExpressionParserRuleCall_0() { return cConditionalOrExpressionParserRuleCall_0; }
+		
+		//({expression::Expression.operand+=current} operator='?' operand+=Expression ':' operand+=Expression)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_0() { return cExpressionOperandAction_1_0; }
+		
+		//operator='?'
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//'?'
+		public Keyword getOperatorQuestionMarkKeyword_1_1_0() { return cOperatorQuestionMarkKeyword_1_1_0; }
+		
+		//operand+=Expression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//Expression
+		public RuleCall getOperandExpressionParserRuleCall_1_2_0() { return cOperandExpressionParserRuleCall_1_2_0; }
+		
+		//':'
+		public Keyword getColonKeyword_1_3() { return cColonKeyword_1_3; }
+		
+		//operand+=Expression
+		public Assignment getOperandAssignment_1_4() { return cOperandAssignment_1_4; }
+		
+		//Expression
+		public RuleCall getOperandExpressionParserRuleCall_1_4_0() { return cOperandExpressionParserRuleCall_1_4_0; }
+	}
+	public class ConditionalOrExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.conditionalOrExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cConditionalAndExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Alternatives cOperatorAlternatives_1_1_0 = (Alternatives)cOperatorAssignment_1_1.eContents().get(0);
+		private final Keyword cOperatorVerticalLineVerticalLineKeyword_1_1_0_0 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(0);
+		private final Keyword cOperatorOrKeyword_1_1_0_1 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(1);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandConditionalAndExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Alternatives cAlternatives_1_3_0 = (Alternatives)cGroup_1_3.eContents().get(0);
+		private final Keyword cVerticalLineVerticalLineKeyword_1_3_0_0 = (Keyword)cAlternatives_1_3_0.eContents().get(0);
+		private final Keyword cOrKeyword_1_3_0_1 = (Keyword)cAlternatives_1_3_0.eContents().get(1);
+		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cOperandConditionalAndExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
+		
+		//conditionalOrExpression sew::WValueSpecification:
+		//	conditionalAndExpression ({expression::Expression.operand+=current} operator=('||' | 'or')
+		//	operand+=conditionalAndExpression (('||' | 'or') operand+=conditionalAndExpression)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//conditionalAndExpression ({expression::Expression.operand+=current} operator=('||' | 'or')
+		//operand+=conditionalAndExpression (('||' | 'or') operand+=conditionalAndExpression)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//conditionalAndExpression
+		public RuleCall getConditionalAndExpressionParserRuleCall_0() { return cConditionalAndExpressionParserRuleCall_0; }
+		
+		//({expression::Expression.operand+=current} operator=('||' | 'or') operand+=conditionalAndExpression (('||' | 'or')
+		//operand+=conditionalAndExpression)*)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_0() { return cExpressionOperandAction_1_0; }
+		
+		//operator=('||' | 'or')
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//('||' | 'or')
+		public Alternatives getOperatorAlternatives_1_1_0() { return cOperatorAlternatives_1_1_0; }
+		
+		//'||'
+		public Keyword getOperatorVerticalLineVerticalLineKeyword_1_1_0_0() { return cOperatorVerticalLineVerticalLineKeyword_1_1_0_0; }
+		
+		//'or'
+		public Keyword getOperatorOrKeyword_1_1_0_1() { return cOperatorOrKeyword_1_1_0_1; }
+		
+		//operand+=conditionalAndExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//conditionalAndExpression
+		public RuleCall getOperandConditionalAndExpressionParserRuleCall_1_2_0() { return cOperandConditionalAndExpressionParserRuleCall_1_2_0; }
+		
+		//(('||' | 'or') operand+=conditionalAndExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//('||' | 'or')
+		public Alternatives getAlternatives_1_3_0() { return cAlternatives_1_3_0; }
+		
+		//'||'
+		public Keyword getVerticalLineVerticalLineKeyword_1_3_0_0() { return cVerticalLineVerticalLineKeyword_1_3_0_0; }
+		
+		//'or'
+		public Keyword getOrKeyword_1_3_0_1() { return cOrKeyword_1_3_0_1; }
+		
+		//operand+=conditionalAndExpression
+		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
+		
+		//conditionalAndExpression
+		public RuleCall getOperandConditionalAndExpressionParserRuleCall_1_3_1_0() { return cOperandConditionalAndExpressionParserRuleCall_1_3_1_0; }
+	}
+	public class ConditionalAndExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.conditionalAndExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cEqualityExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Alternatives cOperatorAlternatives_1_1_0 = (Alternatives)cOperatorAssignment_1_1.eContents().get(0);
+		private final Keyword cOperatorAmpersandAmpersandKeyword_1_1_0_0 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(0);
+		private final Keyword cOperatorAndKeyword_1_1_0_1 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(1);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandEqualityExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Alternatives cAlternatives_1_3_0 = (Alternatives)cGroup_1_3.eContents().get(0);
+		private final Keyword cAmpersandAmpersandKeyword_1_3_0_0 = (Keyword)cAlternatives_1_3_0.eContents().get(0);
+		private final Keyword cAndKeyword_1_3_0_1 = (Keyword)cAlternatives_1_3_0.eContents().get(1);
+		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cOperandEqualityExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
+		
+		//conditionalAndExpression sew::WValueSpecification:
+		//	equalityExpression ({expression::Expression.operand+=current} operator=('&&' | 'and') operand+=equalityExpression
+		//	(('&&' | 'and') operand+=equalityExpression)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//equalityExpression ({expression::Expression.operand+=current} operator=('&&' | 'and') operand+=equalityExpression (('&&'
+		//| 'and') operand+=equalityExpression)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//equalityExpression
+		public RuleCall getEqualityExpressionParserRuleCall_0() { return cEqualityExpressionParserRuleCall_0; }
+		
+		//({expression::Expression.operand+=current} operator=('&&' | 'and') operand+=equalityExpression (('&&' | 'and')
+		//operand+=equalityExpression)*)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_0() { return cExpressionOperandAction_1_0; }
+		
+		//operator=('&&' | 'and')
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//('&&' | 'and')
+		public Alternatives getOperatorAlternatives_1_1_0() { return cOperatorAlternatives_1_1_0; }
+		
+		//'&&'
+		public Keyword getOperatorAmpersandAmpersandKeyword_1_1_0_0() { return cOperatorAmpersandAmpersandKeyword_1_1_0_0; }
+		
+		//'and'
+		public Keyword getOperatorAndKeyword_1_1_0_1() { return cOperatorAndKeyword_1_1_0_1; }
+		
+		//operand+=equalityExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//equalityExpression
+		public RuleCall getOperandEqualityExpressionParserRuleCall_1_2_0() { return cOperandEqualityExpressionParserRuleCall_1_2_0; }
+		
+		//(('&&' | 'and') operand+=equalityExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//('&&' | 'and')
+		public Alternatives getAlternatives_1_3_0() { return cAlternatives_1_3_0; }
+		
+		//'&&'
+		public Keyword getAmpersandAmpersandKeyword_1_3_0_0() { return cAmpersandAmpersandKeyword_1_3_0_0; }
+		
+		//'and'
+		public Keyword getAndKeyword_1_3_0_1() { return cAndKeyword_1_3_0_1; }
+		
+		//operand+=equalityExpression
+		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
+		
+		//equalityExpression
+		public RuleCall getOperandEqualityExpressionParserRuleCall_1_3_1_0() { return cOperandEqualityExpressionParserRuleCall_1_3_1_0; }
+	}
+	public class EqualityExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.equalityExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cRelationalExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Alternatives cOperatorAlternatives_1_1_0 = (Alternatives)cOperatorAssignment_1_1.eContents().get(0);
+		private final Keyword cOperatorEqualsSignEqualsSignKeyword_1_1_0_0 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(0);
+		private final Keyword cOperatorExclamationMarkEqualsSignKeyword_1_1_0_1 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(1);
+		private final Keyword cOperatorEqualsSignEqualsSignEqualsSignKeyword_1_1_0_2 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(2);
+		private final Keyword cOperatorEqualsSignExclamationMarkEqualsSignKeyword_1_1_0_3 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(3);
+		private final Keyword cOperatorEqualsSignSolidusEqualsSignKeyword_1_1_0_4 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(4);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandRelationalExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		
+		//equalityExpression sew::WValueSpecification:
+		//	relationalExpression ({expression::Expression.operand+=current} operator=('==' | '!=' | '===' | '=!=' | '=/=')
+		//	operand+=relationalExpression)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//relationalExpression ({expression::Expression.operand+=current} operator=('==' | '!=' | '===' | '=!=' | '=/=')
+		//operand+=relationalExpression)?
+		public Group getGroup() { return cGroup; }
+		
+		//relationalExpression
+		public RuleCall getRelationalExpressionParserRuleCall_0() { return cRelationalExpressionParserRuleCall_0; }
+		
+		//({expression::Expression.operand+=current} operator=('==' | '!=' | '===' | '=!=' | '=/=')
+		//operand+=relationalExpression)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_0() { return cExpressionOperandAction_1_0; }
+		
+		//operator=('==' | '!=' | '===' | '=!=' | '=/=')
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//('==' | '!=' | '===' | '=!=' | '=/=')
+		public Alternatives getOperatorAlternatives_1_1_0() { return cOperatorAlternatives_1_1_0; }
+		
+		//'=='
+		public Keyword getOperatorEqualsSignEqualsSignKeyword_1_1_0_0() { return cOperatorEqualsSignEqualsSignKeyword_1_1_0_0; }
+		
+		//'!='
+		public Keyword getOperatorExclamationMarkEqualsSignKeyword_1_1_0_1() { return cOperatorExclamationMarkEqualsSignKeyword_1_1_0_1; }
+		
+		//'==='
+		public Keyword getOperatorEqualsSignEqualsSignEqualsSignKeyword_1_1_0_2() { return cOperatorEqualsSignEqualsSignEqualsSignKeyword_1_1_0_2; }
+		
+		//'=!='
+		public Keyword getOperatorEqualsSignExclamationMarkEqualsSignKeyword_1_1_0_3() { return cOperatorEqualsSignExclamationMarkEqualsSignKeyword_1_1_0_3; }
+		
+		//'=/='
+		public Keyword getOperatorEqualsSignSolidusEqualsSignKeyword_1_1_0_4() { return cOperatorEqualsSignSolidusEqualsSignKeyword_1_1_0_4; }
+		
+		//operand+=relationalExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//relationalExpression
+		public RuleCall getOperandRelationalExpressionParserRuleCall_1_2_0() { return cOperandRelationalExpressionParserRuleCall_1_2_0; }
+	}
+	public class RelationalExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.relationalExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cAdditiveExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Alternatives cOperatorAlternatives_1_1_0 = (Alternatives)cOperatorAssignment_1_1.eContents().get(0);
+		private final Keyword cOperatorLessThanSignKeyword_1_1_0_0 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(0);
+		private final Keyword cOperatorLessThanSignEqualsSignKeyword_1_1_0_1 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(1);
+		private final Keyword cOperatorGreaterThanSignKeyword_1_1_0_2 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(2);
+		private final Keyword cOperatorGreaterThanSignEqualsSignKeyword_1_1_0_3 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(3);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandAdditiveExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		
+		//relationalExpression sew::WValueSpecification:
+		//	additiveExpression ({expression::Expression.operand+=current} operator=('<' | '<=' | '>' | '>=')
+		//	operand+=additiveExpression)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//additiveExpression ({expression::Expression.operand+=current} operator=('<' | '<=' | '>' | '>=')
+		//operand+=additiveExpression)?
+		public Group getGroup() { return cGroup; }
+		
+		//additiveExpression
+		public RuleCall getAdditiveExpressionParserRuleCall_0() { return cAdditiveExpressionParserRuleCall_0; }
+		
+		//({expression::Expression.operand+=current} operator=('<' | '<=' | '>' | '>=') operand+=additiveExpression)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_0() { return cExpressionOperandAction_1_0; }
+		
+		//operator=('<' | '<=' | '>' | '>=')
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//('<' | '<=' | '>' | '>=')
+		public Alternatives getOperatorAlternatives_1_1_0() { return cOperatorAlternatives_1_1_0; }
+		
+		//'<'
+		public Keyword getOperatorLessThanSignKeyword_1_1_0_0() { return cOperatorLessThanSignKeyword_1_1_0_0; }
+		
+		//'<='
+		public Keyword getOperatorLessThanSignEqualsSignKeyword_1_1_0_1() { return cOperatorLessThanSignEqualsSignKeyword_1_1_0_1; }
+		
+		//'>'
+		public Keyword getOperatorGreaterThanSignKeyword_1_1_0_2() { return cOperatorGreaterThanSignKeyword_1_1_0_2; }
+		
+		//'>='
+		public Keyword getOperatorGreaterThanSignEqualsSignKeyword_1_1_0_3() { return cOperatorGreaterThanSignEqualsSignKeyword_1_1_0_3; }
+		
+		//operand+=additiveExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//additiveExpression
+		public RuleCall getOperandAdditiveExpressionParserRuleCall_1_2_0() { return cOperandAdditiveExpressionParserRuleCall_1_2_0; }
+	}
+	public class AdditiveExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.additiveExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cMultiplicativeExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Keyword cOperatorPlusSignKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Keyword cPlusSignKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
+		
+		//additiveExpression sew::WValueSpecification:
+		//	multiplicativeExpression ({expression::Expression.operand+=current} operator='+' operand+=multiplicativeExpression
+		//	('+' operand+=multiplicativeExpression)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//multiplicativeExpression ({expression::Expression.operand+=current} operator='+' operand+=multiplicativeExpression ('+'
+		//operand+=multiplicativeExpression)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//multiplicativeExpression
+		public RuleCall getMultiplicativeExpressionParserRuleCall_0() { return cMultiplicativeExpressionParserRuleCall_0; }
+		
+		//({expression::Expression.operand+=current} operator='+' operand+=multiplicativeExpression ('+'
+		//operand+=multiplicativeExpression)*)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_0() { return cExpressionOperandAction_1_0; }
+		
+		//operator='+'
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//'+'
+		public Keyword getOperatorPlusSignKeyword_1_1_0() { return cOperatorPlusSignKeyword_1_1_0; }
+		
+		//operand+=multiplicativeExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//multiplicativeExpression
+		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_2_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_2_0; }
+		
+		//('+' operand+=multiplicativeExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//'+'
+		public Keyword getPlusSignKeyword_1_3_0() { return cPlusSignKeyword_1_3_0; }
+		
+		//operand+=multiplicativeExpression
+		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
+		
+		//multiplicativeExpression
+		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_3_1_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_3_1_0; }
+	}
+	public class MultiplicativeExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.multiplicativeExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cPrimaryExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+		private final Action cExpressionOperandAction_1_0_0 = (Action)cGroup_1_0.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
+		private final Keyword cOperatorAsteriskKeyword_1_0_1_0 = (Keyword)cOperatorAssignment_1_0_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_0_2 = (Assignment)cGroup_1_0.eContents().get(2);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_1_0_2_0 = (RuleCall)cOperandAssignment_1_0_2.eContents().get(0);
+		private final Group cGroup_1_0_3 = (Group)cGroup_1_0.eContents().get(3);
+		private final Keyword cAsteriskKeyword_1_0_3_0 = (Keyword)cGroup_1_0_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_0_3_1 = (Assignment)cGroup_1_0_3.eContents().get(1);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_1_0_3_1_0 = (RuleCall)cOperandAssignment_1_0_3_1.eContents().get(0);
+		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+		private final Action cExpressionOperandAction_1_1_0 = (Action)cGroup_1_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
+		private final Keyword cOperatorAsteriskAsteriskKeyword_1_1_1_0 = (Keyword)cOperatorAssignment_1_1_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_1_1_2_0 = (RuleCall)cOperandAssignment_1_1_2.eContents().get(0);
+		private final Group cGroup_1_1_3 = (Group)cGroup_1_1.eContents().get(3);
+		private final Keyword cAsteriskAsteriskKeyword_1_1_3_0 = (Keyword)cGroup_1_1_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_1_3_1 = (Assignment)cGroup_1_1_3.eContents().get(1);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_1_1_3_1_0 = (RuleCall)cOperandAssignment_1_1_3_1.eContents().get(0);
+		private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
+		private final Action cExpressionOperandAction_1_2_0 = (Action)cGroup_1_2.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
+		private final Keyword cOperatorSolidusKeyword_1_2_1_0 = (Keyword)cOperatorAssignment_1_2_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_2_2 = (Assignment)cGroup_1_2.eContents().get(2);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_1_2_2_0 = (RuleCall)cOperandAssignment_1_2_2.eContents().get(0);
+		private final Group cGroup_1_2_3 = (Group)cGroup_1_2.eContents().get(3);
+		private final Keyword cSolidusKeyword_1_2_3_0 = (Keyword)cGroup_1_2_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_2_3_1 = (Assignment)cGroup_1_2_3.eContents().get(1);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_1_2_3_1_0 = (RuleCall)cOperandAssignment_1_2_3_1.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cAlternatives_1.eContents().get(3);
+		private final Action cExpressionOperandAction_1_3_0 = (Action)cGroup_1_3.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final Keyword cOperatorPercentSignKeyword_1_3_1_0 = (Keyword)cOperatorAssignment_1_3_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_3_2 = (Assignment)cGroup_1_3.eContents().get(2);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_1_3_2_0 = (RuleCall)cOperandAssignment_1_3_2.eContents().get(0);
+		private final Group cGroup_1_3_3 = (Group)cGroup_1_3.eContents().get(3);
+		private final Keyword cPercentSignKeyword_1_3_3_0 = (Keyword)cGroup_1_3_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_3_3_1 = (Assignment)cGroup_1_3_3.eContents().get(1);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_1_3_3_1_0 = (RuleCall)cOperandAssignment_1_3_3_1.eContents().get(0);
+		
+		//multiplicativeExpression sew::WValueSpecification:
+		//	primaryExpression ({expression::Expression.operand+=current} operator='*' operand+=primaryExpression ('*'
+		//	operand+=primaryExpression)* | {expression::Expression.operand+=current} operator='**' operand+=primaryExpression
+		//	('**' operand+=primaryExpression)* | {expression::Expression.operand+=current} operator='/'
+		//	operand+=primaryExpression ('/' operand+=primaryExpression)* | {expression::Expression.operand+=current} operator='%'
+		//	operand+=primaryExpression ('%' operand+=primaryExpression)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//primaryExpression ({expression::Expression.operand+=current} operator='*' operand+=primaryExpression ('*'
+		//operand+=primaryExpression)* | {expression::Expression.operand+=current} operator='**' operand+=primaryExpression
+		//('**' operand+=primaryExpression)* | {expression::Expression.operand+=current} operator='/' operand+=primaryExpression
+		//('/' operand+=primaryExpression)* | {expression::Expression.operand+=current} operator='%' operand+=primaryExpression
+		//('%' operand+=primaryExpression)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//primaryExpression
+		public RuleCall getPrimaryExpressionParserRuleCall_0() { return cPrimaryExpressionParserRuleCall_0; }
+		
+		//({expression::Expression.operand+=current} operator='*' operand+=primaryExpression ('*' operand+=primaryExpression)* |
+		//{expression::Expression.operand+=current} operator='**' operand+=primaryExpression ('**' operand+=primaryExpression)*
+		//| {expression::Expression.operand+=current} operator='/' operand+=primaryExpression ('/' operand+=primaryExpression)*
+		//| {expression::Expression.operand+=current} operator='%' operand+=primaryExpression ('%'
+		//operand+=primaryExpression)*)?
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//{expression::Expression.operand+=current} operator='*' operand+=primaryExpression ('*' operand+=primaryExpression)*
+		public Group getGroup_1_0() { return cGroup_1_0; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_0_0() { return cExpressionOperandAction_1_0_0; }
+		
+		//operator='*'
+		public Assignment getOperatorAssignment_1_0_1() { return cOperatorAssignment_1_0_1; }
+		
+		//'*'
+		public Keyword getOperatorAsteriskKeyword_1_0_1_0() { return cOperatorAsteriskKeyword_1_0_1_0; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_1_0_2() { return cOperandAssignment_1_0_2; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_1_0_2_0() { return cOperandPrimaryExpressionParserRuleCall_1_0_2_0; }
+		
+		//('*' operand+=primaryExpression)*
+		public Group getGroup_1_0_3() { return cGroup_1_0_3; }
+		
+		//'*'
+		public Keyword getAsteriskKeyword_1_0_3_0() { return cAsteriskKeyword_1_0_3_0; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_1_0_3_1() { return cOperandAssignment_1_0_3_1; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_1_0_3_1_0() { return cOperandPrimaryExpressionParserRuleCall_1_0_3_1_0; }
+		
+		//{expression::Expression.operand+=current} operator='**' operand+=primaryExpression ('**' operand+=primaryExpression)*
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_1_0() { return cExpressionOperandAction_1_1_0; }
+		
+		//operator='**'
+		public Assignment getOperatorAssignment_1_1_1() { return cOperatorAssignment_1_1_1; }
+		
+		//'**'
+		public Keyword getOperatorAsteriskAsteriskKeyword_1_1_1_0() { return cOperatorAsteriskAsteriskKeyword_1_1_1_0; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_1_1_2() { return cOperandAssignment_1_1_2; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_1_1_2_0() { return cOperandPrimaryExpressionParserRuleCall_1_1_2_0; }
+		
+		//('**' operand+=primaryExpression)*
+		public Group getGroup_1_1_3() { return cGroup_1_1_3; }
+		
+		//'**'
+		public Keyword getAsteriskAsteriskKeyword_1_1_3_0() { return cAsteriskAsteriskKeyword_1_1_3_0; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_1_1_3_1() { return cOperandAssignment_1_1_3_1; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_1_1_3_1_0() { return cOperandPrimaryExpressionParserRuleCall_1_1_3_1_0; }
+		
+		//{expression::Expression.operand+=current} operator='/' operand+=primaryExpression ('/' operand+=primaryExpression)*
+		public Group getGroup_1_2() { return cGroup_1_2; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_2_0() { return cExpressionOperandAction_1_2_0; }
+		
+		//operator='/'
+		public Assignment getOperatorAssignment_1_2_1() { return cOperatorAssignment_1_2_1; }
+		
+		//'/'
+		public Keyword getOperatorSolidusKeyword_1_2_1_0() { return cOperatorSolidusKeyword_1_2_1_0; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_1_2_2() { return cOperandAssignment_1_2_2; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_1_2_2_0() { return cOperandPrimaryExpressionParserRuleCall_1_2_2_0; }
+		
+		//('/' operand+=primaryExpression)*
+		public Group getGroup_1_2_3() { return cGroup_1_2_3; }
+		
+		//'/'
+		public Keyword getSolidusKeyword_1_2_3_0() { return cSolidusKeyword_1_2_3_0; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_1_2_3_1() { return cOperandAssignment_1_2_3_1; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_1_2_3_1_0() { return cOperandPrimaryExpressionParserRuleCall_1_2_3_1_0; }
+		
+		//{expression::Expression.operand+=current} operator='%' operand+=primaryExpression ('%' operand+=primaryExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//{expression::Expression.operand+=current}
+		public Action getExpressionOperandAction_1_3_0() { return cExpressionOperandAction_1_3_0; }
+		
+		//operator='%'
+		public Assignment getOperatorAssignment_1_3_1() { return cOperatorAssignment_1_3_1; }
+		
+		//'%'
+		public Keyword getOperatorPercentSignKeyword_1_3_1_0() { return cOperatorPercentSignKeyword_1_3_1_0; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_1_3_2() { return cOperandAssignment_1_3_2; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_1_3_2_0() { return cOperandPrimaryExpressionParserRuleCall_1_3_2_0; }
+		
+		//('%' operand+=primaryExpression)*
+		public Group getGroup_1_3_3() { return cGroup_1_3_3; }
+		
+		//'%'
+		public Keyword getPercentSignKeyword_1_3_3_0() { return cPercentSignKeyword_1_3_3_0; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_1_3_3_1() { return cOperandAssignment_1_3_3_1; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_1_3_3_1_0() { return cOperandPrimaryExpressionParserRuleCall_1_3_3_1_0; }
+	}
+	public class PrimaryExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.primaryExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Keyword cPlusSignKeyword_0_0 = (Keyword)cGroup_0.eContents().get(0);
+		private final RuleCall cPrimaryExpressionParserRuleCall_0_1 = (RuleCall)cGroup_0.eContents().get(1);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Action cExpressionAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Group cGroup_1_1 = (Group)cGroup_1.eContents().get(1);
+		private final Assignment cOperatorAssignment_1_1_0 = (Assignment)cGroup_1_1.eContents().get(0);
+		private final Keyword cOperatorHyphenMinusKeyword_1_1_0_0 = (Keyword)cOperatorAssignment_1_1_0.eContents().get(0);
+		private final Assignment cOperandAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_1_1_1_0 = (RuleCall)cOperandAssignment_1_1_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
+		private final Action cExpressionAction_2_0 = (Action)cGroup_2.eContents().get(0);
+		private final Group cGroup_2_1 = (Group)cGroup_2.eContents().get(1);
+		private final Assignment cOperatorAssignment_2_1_0 = (Assignment)cGroup_2_1.eContents().get(0);
+		private final Alternatives cOperatorAlternatives_2_1_0_0 = (Alternatives)cOperatorAssignment_2_1_0.eContents().get(0);
+		private final Keyword cOperatorExclamationMarkKeyword_2_1_0_0_0 = (Keyword)cOperatorAlternatives_2_1_0_0.eContents().get(0);
+		private final Keyword cOperatorNotKeyword_2_1_0_0_1 = (Keyword)cOperatorAlternatives_2_1_0_0.eContents().get(1);
+		private final Assignment cOperandAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
+		private final RuleCall cOperandPrimaryExpressionParserRuleCall_2_1_1_0 = (RuleCall)cOperandAssignment_2_1_1.eContents().get(0);
+		private final Group cGroup_3 = (Group)cAlternatives.eContents().get(3);
+		private final Keyword cLeftParenthesisKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final RuleCall cExpressionParserRuleCall_3_1 = (RuleCall)cGroup_3.eContents().get(1);
+		private final Keyword cRightParenthesisKeyword_3_2 = (Keyword)cGroup_3.eContents().get(2);
+		private final RuleCall cLiteralExpressionParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		
+		//primaryExpression sew::WValueSpecification:
+		//	'+' primaryExpression
+		//	| {expression::Expression} (operator='-' operand+=primaryExpression) | {expression::Expression} (operator=('!' |
+		//	'not') operand+=primaryExpression) | '(' Expression ')'
+		//	| LiteralExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'+' primaryExpression | {expression::Expression} (operator='-' operand+=primaryExpression) | {expression::Expression}
+		//(operator=('!' | 'not') operand+=primaryExpression) | '(' Expression ')' | LiteralExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'+' primaryExpression
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//'+'
+		public Keyword getPlusSignKeyword_0_0() { return cPlusSignKeyword_0_0; }
+		
+		//primaryExpression
+		public RuleCall getPrimaryExpressionParserRuleCall_0_1() { return cPrimaryExpressionParserRuleCall_0_1; }
+		
+		//{expression::Expression} (operator='-' operand+=primaryExpression)
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{expression::Expression}
+		public Action getExpressionAction_1_0() { return cExpressionAction_1_0; }
+		
+		//(operator='-' operand+=primaryExpression)
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//operator='-'
+		public Assignment getOperatorAssignment_1_1_0() { return cOperatorAssignment_1_1_0; }
+		
+		//'-'
+		public Keyword getOperatorHyphenMinusKeyword_1_1_0_0() { return cOperatorHyphenMinusKeyword_1_1_0_0; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_1_1_1() { return cOperandAssignment_1_1_1; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_1_1_1_0() { return cOperandPrimaryExpressionParserRuleCall_1_1_1_0; }
+		
+		//{expression::Expression} (operator=('!' | 'not') operand+=primaryExpression)
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//{expression::Expression}
+		public Action getExpressionAction_2_0() { return cExpressionAction_2_0; }
+		
+		//(operator=('!' | 'not') operand+=primaryExpression)
+		public Group getGroup_2_1() { return cGroup_2_1; }
+		
+		//operator=('!' | 'not')
+		public Assignment getOperatorAssignment_2_1_0() { return cOperatorAssignment_2_1_0; }
+		
+		//('!' | 'not')
+		public Alternatives getOperatorAlternatives_2_1_0_0() { return cOperatorAlternatives_2_1_0_0; }
+		
+		//'!'
+		public Keyword getOperatorExclamationMarkKeyword_2_1_0_0_0() { return cOperatorExclamationMarkKeyword_2_1_0_0_0; }
+		
+		//'not'
+		public Keyword getOperatorNotKeyword_2_1_0_0_1() { return cOperatorNotKeyword_2_1_0_0_1; }
+		
+		//operand+=primaryExpression
+		public Assignment getOperandAssignment_2_1_1() { return cOperandAssignment_2_1_1; }
+		
+		//primaryExpression
+		public RuleCall getOperandPrimaryExpressionParserRuleCall_2_1_1_0() { return cOperandPrimaryExpressionParserRuleCall_2_1_1_0; }
+		
+		//'(' Expression ')'
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_3_0() { return cLeftParenthesisKeyword_3_0; }
+		
+		//Expression
+		public RuleCall getExpressionParserRuleCall_3_1() { return cExpressionParserRuleCall_3_1; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_3_2() { return cRightParenthesisKeyword_3_2; }
+		
+		//LiteralExpression
+		public RuleCall getLiteralExpressionParserRuleCall_4() { return cLiteralExpressionParserRuleCall_4; }
+	}
+	public class LiteralExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralBooleanValueParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralCharacterValueParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cLiteralIntegerValueParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cLiteralRationalValueParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cLiteralFloatValueParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cLiteralStringValueParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cLiteralNullValueParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		private final RuleCall cLiteralArrayValueParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		private final RuleCall cLiteralObjectReferenceParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
+		private final RuleCall cLiteralVariableReferenceParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
+		private final RuleCall cLiteralInstanceReferenceParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
+		
+		//LiteralExpression sew::WValueSpecification:
+		//	LiteralBooleanValue
+		//	| LiteralCharacterValue
+		//	| LiteralIntegerValue
+		//	| LiteralRationalValue
+		//	| LiteralFloatValue
+		//	//| LiteralRealValue
+		//	| LiteralStringValue
+		//	| LiteralNullValue
+		//	| LiteralArrayValue
+		//	| LiteralObjectReference
+		//	| LiteralVariableReference
+		//	| LiteralInstanceReference
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralBooleanValue | LiteralCharacterValue | LiteralIntegerValue | LiteralRationalValue | LiteralFloatValue //| LiteralRealValue
+		//| LiteralStringValue | LiteralNullValue | LiteralArrayValue | LiteralObjectReference | LiteralVariableReference |
+		//LiteralInstanceReference
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralBooleanValue
+		public RuleCall getLiteralBooleanValueParserRuleCall_0() { return cLiteralBooleanValueParserRuleCall_0; }
+		
+		//LiteralCharacterValue
+		public RuleCall getLiteralCharacterValueParserRuleCall_1() { return cLiteralCharacterValueParserRuleCall_1; }
+		
+		//LiteralIntegerValue
+		public RuleCall getLiteralIntegerValueParserRuleCall_2() { return cLiteralIntegerValueParserRuleCall_2; }
+		
+		//LiteralRationalValue
+		public RuleCall getLiteralRationalValueParserRuleCall_3() { return cLiteralRationalValueParserRuleCall_3; }
+		
+		//LiteralFloatValue
+		public RuleCall getLiteralFloatValueParserRuleCall_4() { return cLiteralFloatValueParserRuleCall_4; }
+		
+		//LiteralStringValue
+		public RuleCall getLiteralStringValueParserRuleCall_5() { return cLiteralStringValueParserRuleCall_5; }
+		
+		//LiteralNullValue
+		public RuleCall getLiteralNullValueParserRuleCall_6() { return cLiteralNullValueParserRuleCall_6; }
+		
+		//LiteralArrayValue
+		public RuleCall getLiteralArrayValueParserRuleCall_7() { return cLiteralArrayValueParserRuleCall_7; }
+		
+		//LiteralObjectReference
+		public RuleCall getLiteralObjectReferenceParserRuleCall_8() { return cLiteralObjectReferenceParserRuleCall_8; }
+		
+		//LiteralVariableReference
+		public RuleCall getLiteralVariableReferenceParserRuleCall_9() { return cLiteralVariableReferenceParserRuleCall_9; }
+		
+		//LiteralInstanceReference
+		public RuleCall getLiteralInstanceReferenceParserRuleCall_10() { return cLiteralInstanceReferenceParserRuleCall_10; }
+	}
+	public class LiteralArrayValueElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralArrayValue");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralArrayValueAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cLeftSquareBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Assignment cValuesAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final RuleCall cValuesValueSpecificationParserRuleCall_2_0_0 = (RuleCall)cValuesAssignment_2_0.eContents().get(0);
+		private final Group cGroup_2_1 = (Group)cGroup_2.eContents().get(1);
+		private final Keyword cCommaKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
+		private final Assignment cValuesAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
+		private final RuleCall cValuesValueSpecificationParserRuleCall_2_1_1_0 = (RuleCall)cValuesAssignment_2_1_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Array of Literal Specification
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralArrayValue expression::LiteralArrayValue:
+		//	{expression::LiteralArrayValue}
+		//	'[' (values+=ValueSpecification (',' values+=ValueSpecification)*)?
+		//	']'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralArrayValue} '[' (values+=ValueSpecification (',' values+=ValueSpecification)*)? ']'
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralArrayValue}
+		public Action getLiteralArrayValueAction_0() { return cLiteralArrayValueAction_0; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_1() { return cLeftSquareBracketKeyword_1; }
+		
+		//(values+=ValueSpecification (',' values+=ValueSpecification)*)?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//values+=ValueSpecification
+		public Assignment getValuesAssignment_2_0() { return cValuesAssignment_2_0; }
+		
+		//ValueSpecification
+		public RuleCall getValuesValueSpecificationParserRuleCall_2_0_0() { return cValuesValueSpecificationParserRuleCall_2_0_0; }
+		
+		//(',' values+=ValueSpecification)*
+		public Group getGroup_2_1() { return cGroup_2_1; }
+		
+		//','
+		public Keyword getCommaKeyword_2_1_0() { return cCommaKeyword_2_1_0; }
+		
+		//values+=ValueSpecification
+		public Assignment getValuesAssignment_2_1_1() { return cValuesAssignment_2_1_1; }
+		
+		//ValueSpecification
+		public RuleCall getValuesValueSpecificationParserRuleCall_2_1_1_0() { return cValuesValueSpecificationParserRuleCall_2_1_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_3() { return cRightSquareBracketKeyword_3; }
+	}
+	public class LiteralObjectReferenceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralObjectReference");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cAmpersandKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Assignment cObjectAssignment_1_0 = (Assignment)cAlternatives_1.eContents().get(0);
+		private final CrossReference cObjectWObjectCrossReference_1_0_0 = (CrossReference)cObjectAssignment_1_0.eContents().get(0);
+		private final RuleCall cObjectWObjectUFIParserRuleCall_1_0_0_1 = (RuleCall)cObjectWObjectCrossReference_1_0_0.eContents().get(1);
+		private final Assignment cSymbolAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
+		private final RuleCall cSymbolUFIParserRuleCall_1_1_0 = (RuleCall)cSymbolAssignment_1_1.eContents().get(0);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Literal Object Reference Specification
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralObjectReference expression::LiteralObjectReference:
+		//	'&'? (object=[sew::WObject|UFI] | symbol=UFI)
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'&'? (object=[sew::WObject|UFI] | symbol=UFI)
+		public Group getGroup() { return cGroup; }
+		
+		//'&'?
+		public Keyword getAmpersandKeyword_0() { return cAmpersandKeyword_0; }
+		
+		//(object=[sew::WObject|UFI] | symbol=UFI)
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//object=[sew::WObject|UFI]
+		public Assignment getObjectAssignment_1_0() { return cObjectAssignment_1_0; }
+		
+		//[sew::WObject|UFI]
+		public CrossReference getObjectWObjectCrossReference_1_0_0() { return cObjectWObjectCrossReference_1_0_0; }
+		
+		//UFI
+		public RuleCall getObjectWObjectUFIParserRuleCall_1_0_0_1() { return cObjectWObjectUFIParserRuleCall_1_0_0_1; }
+		
+		//symbol=UFI
+		public Assignment getSymbolAssignment_1_1() { return cSymbolAssignment_1_1; }
+		
+		//UFI
+		public RuleCall getSymbolUFIParserRuleCall_1_1_0() { return cSymbolUFIParserRuleCall_1_1_0; }
+	}
+	public class LiteralBooleanValueElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralBooleanValue");
+		private final Assignment cValueAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cValueEBooleanParserRuleCall_0 = (RuleCall)cValueAssignment.eContents().get(0);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Literal Specification
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralBooleanValue expression::LiteralBooleanValue:
+		//	value=EBoolean
+		@Override public ParserRule getRule() { return rule; }
+		
+		//value=EBoolean
+		public Assignment getValueAssignment() { return cValueAssignment; }
+		
+		//EBoolean
+		public RuleCall getValueEBooleanParserRuleCall_0() { return cValueEBooleanParserRuleCall_0; }
+	}
+	public class LiteralCharacterValueElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralCharacterValue");
+		private final Assignment cValueAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cValueECharParserRuleCall_0 = (RuleCall)cValueAssignment.eContents().get(0);
+		
+		//LiteralCharacterValue expression::LiteralCharacterValue:
+		//	value=EChar
+		@Override public ParserRule getRule() { return rule; }
+		
+		//value=EChar
+		public Assignment getValueAssignment() { return cValueAssignment; }
+		
+		//EChar
+		public RuleCall getValueECharParserRuleCall_0() { return cValueECharParserRuleCall_0; }
+	}
+	public class LiteralIntegerValueElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralIntegerValue");
+		private final Assignment cValueAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cValueELongParserRuleCall_0 = (RuleCall)cValueAssignment.eContents().get(0);
+		
+		//LiteralIntegerValue expression::LiteralIntegerValue:
+		//	value=ELong
+		@Override public ParserRule getRule() { return rule; }
+		
+		//value=ELong
+		public Assignment getValueAssignment() { return cValueAssignment; }
+		
+		//ELong
+		public RuleCall getValueELongParserRuleCall_0() { return cValueELongParserRuleCall_0; }
+	}
+	public class LiteralRationalValueElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralRationalValue");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cNumeratorAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cNumeratorELongParserRuleCall_0_0 = (RuleCall)cNumeratorAssignment_0.eContents().get(0);
+		private final Keyword cSolidusKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cDenominatorAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cDenominatorELongParserRuleCall_2_0 = (RuleCall)cDenominatorAssignment_2.eContents().get(0);
+		
+		//LiteralRationalValue expression::LiteralRationalValue:
+		//	numerator=ELong '/' denominator=ELong
+		@Override public ParserRule getRule() { return rule; }
+		
+		//numerator=ELong '/' denominator=ELong
+		public Group getGroup() { return cGroup; }
+		
+		//numerator=ELong
+		public Assignment getNumeratorAssignment_0() { return cNumeratorAssignment_0; }
+		
+		//ELong
+		public RuleCall getNumeratorELongParserRuleCall_0_0() { return cNumeratorELongParserRuleCall_0_0; }
+		
+		//'/'
+		public Keyword getSolidusKeyword_1() { return cSolidusKeyword_1; }
+		
+		//denominator=ELong
+		public Assignment getDenominatorAssignment_2() { return cDenominatorAssignment_2; }
+		
+		//ELong
+		public RuleCall getDenominatorELongParserRuleCall_2_0() { return cDenominatorELongParserRuleCall_2_0; }
+	}
+	public class LiteralFloatValueElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralFloatValue");
+		private final Assignment cValueAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cValueEDoubleParserRuleCall_0 = (RuleCall)cValueAssignment.eContents().get(0);
+		
+		//LiteralFloatValue expression::LiteralFloatValue:
+		//	value=EDouble
+		@Override public ParserRule getRule() { return rule; }
+		
+		//value=EDouble
+		public Assignment getValueAssignment() { return cValueAssignment; }
+		
+		//EDouble
+		public RuleCall getValueEDoubleParserRuleCall_0() { return cValueEDoubleParserRuleCall_0; }
+	}
+	public class LiteralRealValueElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralRealValue");
+		private final Assignment cValueAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cValueEBigDecimalParserRuleCall_0 = (RuleCall)cValueAssignment.eContents().get(0);
+		
+		//LiteralRealValue expression::LiteralRealValue:
+		//	value=EBigDecimal
+		@Override public ParserRule getRule() { return rule; }
+		
+		//value=EBigDecimal
+		public Assignment getValueAssignment() { return cValueAssignment; }
+		
+		//EBigDecimal
+		public RuleCall getValueEBigDecimalParserRuleCall_0() { return cValueEBigDecimalParserRuleCall_0; }
+	}
+	public class LiteralStringValueElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralStringValue");
+		private final Assignment cValueAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cValueEStringParserRuleCall_0 = (RuleCall)cValueAssignment.eContents().get(0);
+		
+		//LiteralStringValue expression::LiteralStringValue:
+		//	value=EString
+		@Override public ParserRule getRule() { return rule; }
+		
+		//value=EString
+		public Assignment getValueAssignment() { return cValueAssignment; }
+		
+		//EString
+		public RuleCall getValueEStringParserRuleCall_0() { return cValueEStringParserRuleCall_0; }
+	}
+	public class LiteralNullValueElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralNullValue");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralNullValueAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cNullKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cTypeAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cTypeXIDParserRuleCall_2_1_0 = (RuleCall)cTypeAssignment_2_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
+		
+		//LiteralNullValue expression::LiteralNullValue:
+		//	{expression::LiteralNullValue}
+		//	'null' ('<' type=XID '>')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralNullValue} 'null' ('<' type=XID '>')?
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralNullValue}
+		public Action getLiteralNullValueAction_0() { return cLiteralNullValueAction_0; }
+		
+		//'null'
+		public Keyword getNullKeyword_1() { return cNullKeyword_1; }
+		
+		//('<' type=XID '>')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
+		
+		//type=XID
+		public Assignment getTypeAssignment_2_1() { return cTypeAssignment_2_1; }
+		
+		//XID
+		public RuleCall getTypeXIDParserRuleCall_2_1_0() { return cTypeXIDParserRuleCall_2_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
+	}
+	public class LiteralVariableReferenceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralVariableReference");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralTimeVariableParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralTimeDeltaVariableParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//LiteralVariableReference expression::LiteralReferenceValue:
+		//	LiteralTimeVariable
+		//	| LiteralTimeDeltaVariable
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralTimeVariable | LiteralTimeDeltaVariable
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralTimeVariable
+		public RuleCall getLiteralTimeVariableParserRuleCall_0() { return cLiteralTimeVariableParserRuleCall_0; }
+		
+		//LiteralTimeDeltaVariable
+		public RuleCall getLiteralTimeDeltaVariableParserRuleCall_1() { return cLiteralTimeDeltaVariableParserRuleCall_1; }
+	}
+	public class LiteralTimeVariableElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralTimeVariable");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralTimeVariableAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSymbolAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cSymbolTimeKeyword_1_0 = (Keyword)cSymbolAssignment_1.eContents().get(0);
+		
+		//LiteralTimeVariable expression::LiteralTimeVariable:
+		//	{expression::LiteralTimeVariable} symbol='$time'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralTimeVariable} symbol='$time'
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralTimeVariable}
+		public Action getLiteralTimeVariableAction_0() { return cLiteralTimeVariableAction_0; }
+		
+		//symbol='$time'
+		public Assignment getSymbolAssignment_1() { return cSymbolAssignment_1; }
+		
+		//'$time'
+		public Keyword getSymbolTimeKeyword_1_0() { return cSymbolTimeKeyword_1_0; }
+	}
+	public class LiteralTimeDeltaVariableElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralTimeDeltaVariable");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralTimeDeltaVariableAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSymbolAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cSymbolDeltaKeyword_1_0 = (Keyword)cSymbolAssignment_1.eContents().get(0);
+		
+		//LiteralTimeDeltaVariable expression::LiteralTimeDeltaVariable:
+		//	{expression::LiteralTimeDeltaVariable} symbol='$delta'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralTimeDeltaVariable} symbol='$delta'
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralTimeDeltaVariable}
+		public Action getLiteralTimeDeltaVariableAction_0() { return cLiteralTimeDeltaVariableAction_0; }
+		
+		//symbol='$delta'
+		public Assignment getSymbolAssignment_1() { return cSymbolAssignment_1; }
+		
+		//'$delta'
+		public Keyword getSymbolDeltaKeyword_1_0() { return cSymbolDeltaKeyword_1_0; }
+	}
+	public class LiteralInstanceReferenceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralInstanceReference");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralThisInstanceParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralSelfInstanceParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cLiteralParentInstanceParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cLiteralSuperInstanceParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cLiteralSystemInstanceParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cLiteralEnvInstanceParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		
+		//LiteralInstanceReference expression::LiteralReferenceValue:
+		//	LiteralThisInstance
+		//	| LiteralSelfInstance
+		//	| LiteralParentInstance
+		//	| LiteralSuperInstance
+		//	| LiteralSystemInstance
+		//	| LiteralEnvInstance
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralThisInstance | LiteralSelfInstance | LiteralParentInstance | LiteralSuperInstance | LiteralSystemInstance |
+		//LiteralEnvInstance
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralThisInstance
+		public RuleCall getLiteralThisInstanceParserRuleCall_0() { return cLiteralThisInstanceParserRuleCall_0; }
+		
+		//LiteralSelfInstance
+		public RuleCall getLiteralSelfInstanceParserRuleCall_1() { return cLiteralSelfInstanceParserRuleCall_1; }
+		
+		//LiteralParentInstance
+		public RuleCall getLiteralParentInstanceParserRuleCall_2() { return cLiteralParentInstanceParserRuleCall_2; }
+		
+		//LiteralSuperInstance
+		public RuleCall getLiteralSuperInstanceParserRuleCall_3() { return cLiteralSuperInstanceParserRuleCall_3; }
+		
+		//LiteralSystemInstance
+		public RuleCall getLiteralSystemInstanceParserRuleCall_4() { return cLiteralSystemInstanceParserRuleCall_4; }
+		
+		//LiteralEnvInstance
+		public RuleCall getLiteralEnvInstanceParserRuleCall_5() { return cLiteralEnvInstanceParserRuleCall_5; }
+	}
+	public class LiteralThisInstanceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralThisInstance");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralThisInstanceAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSymbolAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cSymbolThisKeyword_1_0 = (Keyword)cSymbolAssignment_1.eContents().get(0);
+		
+		//LiteralThisInstance expression::LiteralThisInstance:
+		//	{expression::LiteralThisInstance} symbol='$this'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralThisInstance} symbol='$this'
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralThisInstance}
+		public Action getLiteralThisInstanceAction_0() { return cLiteralThisInstanceAction_0; }
+		
+		//symbol='$this'
+		public Assignment getSymbolAssignment_1() { return cSymbolAssignment_1; }
+		
+		//'$this'
+		public Keyword getSymbolThisKeyword_1_0() { return cSymbolThisKeyword_1_0; }
+	}
+	public class LiteralSelfInstanceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralSelfInstance");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralSelfInstanceAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSymbolAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cSymbolSelfKeyword_1_0 = (Keyword)cSymbolAssignment_1.eContents().get(0);
+		
+		//LiteralSelfInstance expression::LiteralSelfInstance:
+		//	{expression::LiteralSelfInstance} symbol='$self'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralSelfInstance} symbol='$self'
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralSelfInstance}
+		public Action getLiteralSelfInstanceAction_0() { return cLiteralSelfInstanceAction_0; }
+		
+		//symbol='$self'
+		public Assignment getSymbolAssignment_1() { return cSymbolAssignment_1; }
+		
+		//'$self'
+		public Keyword getSymbolSelfKeyword_1_0() { return cSymbolSelfKeyword_1_0; }
+	}
+	public class LiteralParentInstanceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralParentInstance");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralParentInstanceAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSymbolAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cSymbolParentKeyword_1_0 = (Keyword)cSymbolAssignment_1.eContents().get(0);
+		
+		//LiteralParentInstance expression::LiteralParentInstance:
+		//	{expression::LiteralParentInstance} symbol='$parent'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralParentInstance} symbol='$parent'
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralParentInstance}
+		public Action getLiteralParentInstanceAction_0() { return cLiteralParentInstanceAction_0; }
+		
+		//symbol='$parent'
+		public Assignment getSymbolAssignment_1() { return cSymbolAssignment_1; }
+		
+		//'$parent'
+		public Keyword getSymbolParentKeyword_1_0() { return cSymbolParentKeyword_1_0; }
+	}
+	public class LiteralSuperInstanceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralSuperInstance");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralSuperInstanceAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSymbolAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cSymbolSuperKeyword_1_0 = (Keyword)cSymbolAssignment_1.eContents().get(0);
+		
+		//LiteralSuperInstance expression::LiteralSuperInstance:
+		//	{expression::LiteralSuperInstance} symbol='$super'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralSuperInstance} symbol='$super'
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralSuperInstance}
+		public Action getLiteralSuperInstanceAction_0() { return cLiteralSuperInstanceAction_0; }
+		
+		//symbol='$super'
+		public Assignment getSymbolAssignment_1() { return cSymbolAssignment_1; }
+		
+		//'$super'
+		public Keyword getSymbolSuperKeyword_1_0() { return cSymbolSuperKeyword_1_0; }
+	}
+	public class LiteralSystemInstanceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralSystemInstance");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralSystemInstanceAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSymbolAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cSymbolSystemKeyword_1_0 = (Keyword)cSymbolAssignment_1.eContents().get(0);
+		
+		//LiteralSystemInstance expression::LiteralSystemInstance:
+		//	{expression::LiteralSystemInstance} symbol='$system'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralSystemInstance} symbol='$system'
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralSystemInstance}
+		public Action getLiteralSystemInstanceAction_0() { return cLiteralSystemInstanceAction_0; }
+		
+		//symbol='$system'
+		public Assignment getSymbolAssignment_1() { return cSymbolAssignment_1; }
+		
+		//'$system'
+		public Keyword getSymbolSystemKeyword_1_0() { return cSymbolSystemKeyword_1_0; }
+	}
+	public class LiteralEnvInstanceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.LiteralEnvInstance");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralEnvInstanceAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSymbolAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Alternatives cSymbolAlternatives_1_0 = (Alternatives)cSymbolAssignment_1.eContents().get(0);
+		private final Keyword cSymbolEnvKeyword_1_0_0 = (Keyword)cSymbolAlternatives_1_0.eContents().get(0);
+		private final Keyword cSymbolEnvKeyword_1_0_1 = (Keyword)cSymbolAlternatives_1_0.eContents().get(1);
+		
+		//LiteralEnvInstance expression::LiteralEnvInstance:
+		//	{expression::LiteralEnvInstance} symbol=('$env' | 'env')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::LiteralEnvInstance} symbol=('$env' | 'env')
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::LiteralEnvInstance}
+		public Action getLiteralEnvInstanceAction_0() { return cLiteralEnvInstanceAction_0; }
+		
+		//symbol=('$env' | 'env')
+		public Assignment getSymbolAssignment_1() { return cSymbolAssignment_1; }
+		
+		//('$env' | 'env')
+		public Alternatives getSymbolAlternatives_1_0() { return cSymbolAlternatives_1_0; }
+		
+		//'$env'
+		public Keyword getSymbolEnvKeyword_1_0_0() { return cSymbolEnvKeyword_1_0_0; }
+		
+		//'env'
+		public Keyword getSymbolEnvKeyword_1_0_1() { return cSymbolEnvKeyword_1_0_1; }
+	}
+	public class EBooleanElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.EBoolean");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cTrueKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cFalseKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Terminal Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//EBoolean ecore::EBoolean:
+		//	'true'
+		//	| 'false'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'true' | 'false'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'true'
+		public Keyword getTrueKeyword_0() { return cTrueKeyword_0; }
+		
+		//'false'
+		public Keyword getFalseKeyword_1() { return cFalseKeyword_1; }
+	}
+	public class ECharElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.EChar");
+		private final RuleCall cCHARACTERTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//EChar ecore::EChar:
+		//	CHARACTER
+		@Override public ParserRule getRule() { return rule; }
+		
+		//CHARACTER
+		public RuleCall getCHARACTERTerminalRuleCall() { return cCHARACTERTerminalRuleCall; }
+	}
+	public class ELongElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.ELong");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
+		
+		//ELong ecore::ELong:
+		//	'-'? INT
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'-'? INT
+		public Group getGroup() { return cGroup; }
+		
+		//'-'?
+		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
+		
+		//INT
+		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
+	}
+	public class EDoubleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.EDouble");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
+		private final Keyword cFullStopKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final RuleCall cINTTerminalRuleCall_3 = (RuleCall)cGroup.eContents().get(3);
+		
+		//EDouble ecore::EDouble:
+		//	'-'? INT? '.' INT
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'-'? INT? '.' INT
+		public Group getGroup() { return cGroup; }
+		
+		//'-'?
+		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
+		
+		//INT?
+		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_2() { return cFullStopKeyword_2; }
+		
+		//INT
+		public RuleCall getINTTerminalRuleCall_3() { return cINTTerminalRuleCall_3; }
+	}
+	public class EBigDecimalElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.EBigDecimal");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cINTTerminalRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Keyword cFullStopKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final RuleCall cINTTerminalRuleCall_2 = (RuleCall)cGroup.eContents().get(2);
+		
+		//EBigDecimal ecore::EBigDecimal:
+		//	INT? '.' INT
+		@Override public ParserRule getRule() { return rule; }
+		
+		//INT? '.' INT
+		public Group getGroup() { return cGroup; }
+		
+		//INT?
+		public RuleCall getINTTerminalRuleCall_0() { return cINTTerminalRuleCall_0; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_1() { return cFullStopKeyword_1; }
+		
+		//INT
+		public RuleCall getINTTerminalRuleCall_2() { return cINTTerminalRuleCall_2; }
+	}
+	public class EStringElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.EString");
+		private final RuleCall cSTRINGTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//EString:
+		//	STRING;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//STRING
+		public RuleCall getSTRINGTerminalRuleCall() { return cSTRINGTerminalRuleCall; }
+	}
+	public class DeprecatedReservedWordElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.DeprecatedReservedWord");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cFormKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cEndformKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		private final Keyword cPrototypeKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
+		private final Keyword cEndprototypeKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
+		private final Keyword cSectionKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
+		private final Keyword cEndsectionKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// @DEPRECATED Diversity Configuration Specification
+		//////////////////////////////////////////////////////////////////////////////////
+		//DeprecatedReservedWord:
+		//	'form' | 'endform'
+		//	| 'prototype' | 'endprototype'
+		//	| 'section' | 'endsection';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'form' | 'endform' | 'prototype' | 'endprototype' | 'section' | 'endsection'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'form'
+		public Keyword getFormKeyword_0() { return cFormKeyword_0; }
+		
+		//'endform'
+		public Keyword getEndformKeyword_1() { return cEndformKeyword_1; }
+		
+		//'prototype'
+		public Keyword getPrototypeKeyword_2() { return cPrototypeKeyword_2; }
+		
+		//'endprototype'
+		public Keyword getEndprototypeKeyword_3() { return cEndprototypeKeyword_3; }
+		
+		//'section'
+		public Keyword getSectionKeyword_4() { return cSectionKeyword_4; }
+		
+		//'endsection'
+		public Keyword getEndsectionKeyword_5() { return cEndsectionKeyword_5; }
+	}
+	public class DeprecatedObjectElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.DeprecatedObject");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Action cWObjectAction_0_0 = (Action)cGroup_0.eContents().get(0);
+		private final Keyword cFormKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
+		private final Assignment cNameAssignment_0_2 = (Assignment)cGroup_0.eContents().get(2);
+		private final RuleCall cNameUFIParserRuleCall_0_2_0 = (RuleCall)cNameAssignment_0_2.eContents().get(0);
+		private final Assignment cDescriptionAssignment_0_3 = (Assignment)cGroup_0.eContents().get(3);
+		private final RuleCall cDescriptionEStringParserRuleCall_0_3_0 = (RuleCall)cDescriptionAssignment_0_3.eContents().get(0);
+		private final Keyword cAsKeyword_0_4 = (Keyword)cGroup_0.eContents().get(4);
+		private final Keyword cAmpersandKeyword_0_5 = (Keyword)cGroup_0.eContents().get(5);
+		private final Assignment cTypeAssignment_0_6 = (Assignment)cGroup_0.eContents().get(6);
+		private final RuleCall cTypeUFIParserRuleCall_0_6_0 = (RuleCall)cTypeAssignment_0_6.eContents().get(0);
+		private final Keyword cIsKeyword_0_7 = (Keyword)cGroup_0.eContents().get(7);
+		private final Assignment cElementAssignment_0_8 = (Assignment)cGroup_0.eContents().get(8);
+		private final RuleCall cElementDeprecatedPropertyParserRuleCall_0_8_0 = (RuleCall)cElementAssignment_0_8.eContents().get(0);
+		private final Keyword cEndformKeyword_0_9 = (Keyword)cGroup_0.eContents().get(9);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Action cWObjectAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Keyword cPrototypeKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
+		private final Assignment cNameAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cNameUFIParserRuleCall_1_2_0 = (RuleCall)cNameAssignment_1_2.eContents().get(0);
+		private final Assignment cDescriptionAssignment_1_3 = (Assignment)cGroup_1.eContents().get(3);
+		private final RuleCall cDescriptionEStringParserRuleCall_1_3_0 = (RuleCall)cDescriptionAssignment_1_3.eContents().get(0);
+		private final Keyword cAsKeyword_1_4 = (Keyword)cGroup_1.eContents().get(4);
+		private final Keyword cAmpersandKeyword_1_5 = (Keyword)cGroup_1.eContents().get(5);
+		private final Assignment cTypeAssignment_1_6 = (Assignment)cGroup_1.eContents().get(6);
+		private final RuleCall cTypeUFIParserRuleCall_1_6_0 = (RuleCall)cTypeAssignment_1_6.eContents().get(0);
+		private final Keyword cIsKeyword_1_7 = (Keyword)cGroup_1.eContents().get(7);
+		private final Assignment cElementAssignment_1_8 = (Assignment)cGroup_1.eContents().get(8);
+		private final RuleCall cElementDeprecatedPropertyParserRuleCall_1_8_0 = (RuleCall)cElementAssignment_1_8.eContents().get(0);
+		private final Keyword cEndprototypeKeyword_1_9 = (Keyword)cGroup_1.eContents().get(9);
+		
+		//DeprecatedObject sew::WObject:
+		//	{sew::WObject}
+		//	'form'
+		//	name=UFI description=EString? 'as' '&'? type=UFI 'is'
+		//	element+=DeprecatedProperty*
+		//	'endform'
+		//	| {sew::WObject}
+		//	'prototype'
+		//	name=UFI description=EString? 'as' '&'? type=UFI 'is'
+		//	element+=DeprecatedProperty*
+		//	'endprototype'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{sew::WObject} 'form' name=UFI description=EString? 'as' '&'? type=UFI 'is' element+=DeprecatedProperty* 'endform' |
+		//{sew::WObject} 'prototype' name=UFI description=EString? 'as' '&'? type=UFI 'is' element+=DeprecatedProperty*
+		//'endprototype'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//{sew::WObject} 'form' name=UFI description=EString? 'as' '&'? type=UFI 'is' element+=DeprecatedProperty* 'endform'
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//{sew::WObject}
+		public Action getWObjectAction_0_0() { return cWObjectAction_0_0; }
+		
+		//'form'
+		public Keyword getFormKeyword_0_1() { return cFormKeyword_0_1; }
+		
+		//name=UFI
+		public Assignment getNameAssignment_0_2() { return cNameAssignment_0_2; }
+		
+		//UFI
+		public RuleCall getNameUFIParserRuleCall_0_2_0() { return cNameUFIParserRuleCall_0_2_0; }
+		
+		//description=EString?
+		public Assignment getDescriptionAssignment_0_3() { return cDescriptionAssignment_0_3; }
+		
+		//EString
+		public RuleCall getDescriptionEStringParserRuleCall_0_3_0() { return cDescriptionEStringParserRuleCall_0_3_0; }
+		
+		//'as'
+		public Keyword getAsKeyword_0_4() { return cAsKeyword_0_4; }
+		
+		//'&'?
+		public Keyword getAmpersandKeyword_0_5() { return cAmpersandKeyword_0_5; }
+		
+		//type=UFI
+		public Assignment getTypeAssignment_0_6() { return cTypeAssignment_0_6; }
+		
+		//UFI
+		public RuleCall getTypeUFIParserRuleCall_0_6_0() { return cTypeUFIParserRuleCall_0_6_0; }
+		
+		//'is'
+		public Keyword getIsKeyword_0_7() { return cIsKeyword_0_7; }
+		
+		//element+=DeprecatedProperty*
+		public Assignment getElementAssignment_0_8() { return cElementAssignment_0_8; }
+		
+		//DeprecatedProperty
+		public RuleCall getElementDeprecatedPropertyParserRuleCall_0_8_0() { return cElementDeprecatedPropertyParserRuleCall_0_8_0; }
+		
+		//'endform'
+		public Keyword getEndformKeyword_0_9() { return cEndformKeyword_0_9; }
+		
+		//{sew::WObject} 'prototype' name=UFI description=EString? 'as' '&'? type=UFI 'is' element+=DeprecatedProperty*
+		//'endprototype'
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{sew::WObject}
+		public Action getWObjectAction_1_0() { return cWObjectAction_1_0; }
+		
+		//'prototype'
+		public Keyword getPrototypeKeyword_1_1() { return cPrototypeKeyword_1_1; }
+		
+		//name=UFI
+		public Assignment getNameAssignment_1_2() { return cNameAssignment_1_2; }
+		
+		//UFI
+		public RuleCall getNameUFIParserRuleCall_1_2_0() { return cNameUFIParserRuleCall_1_2_0; }
+		
+		//description=EString?
+		public Assignment getDescriptionAssignment_1_3() { return cDescriptionAssignment_1_3; }
+		
+		//EString
+		public RuleCall getDescriptionEStringParserRuleCall_1_3_0() { return cDescriptionEStringParserRuleCall_1_3_0; }
+		
+		//'as'
+		public Keyword getAsKeyword_1_4() { return cAsKeyword_1_4; }
+		
+		//'&'?
+		public Keyword getAmpersandKeyword_1_5() { return cAmpersandKeyword_1_5; }
+		
+		//type=UFI
+		public Assignment getTypeAssignment_1_6() { return cTypeAssignment_1_6; }
+		
+		//UFI
+		public RuleCall getTypeUFIParserRuleCall_1_6_0() { return cTypeUFIParserRuleCall_1_6_0; }
+		
+		//'is'
+		public Keyword getIsKeyword_1_7() { return cIsKeyword_1_7; }
+		
+		//element+=DeprecatedProperty*
+		public Assignment getElementAssignment_1_8() { return cElementAssignment_1_8; }
+		
+		//DeprecatedProperty
+		public RuleCall getElementDeprecatedPropertyParserRuleCall_1_8_0() { return cElementDeprecatedPropertyParserRuleCall_1_8_0; }
+		
+		//'endprototype'
+		public Keyword getEndprototypeKeyword_1_9() { return cEndprototypeKeyword_1_9; }
+	}
+	public class DeprecatedPropertyElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.DeprecatedProperty");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cDeprecatedSectionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cDeprecatedAttributeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//DeprecatedProperty sew::WProperty:
+		//	DeprecatedSection
+		//	| DeprecatedAttribute
+		@Override public ParserRule getRule() { return rule; }
+		
+		//DeprecatedSection | DeprecatedAttribute
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//DeprecatedSection
+		public RuleCall getDeprecatedSectionParserRuleCall_0() { return cDeprecatedSectionParserRuleCall_0; }
+		
+		//DeprecatedAttribute
+		public RuleCall getDeprecatedAttributeParserRuleCall_1() { return cDeprecatedAttributeParserRuleCall_1; }
+	}
+	public class DeprecatedSectionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.DeprecatedSection");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Action cWSectionAction_0_0 = (Action)cGroup_0.eContents().get(0);
+		private final Keyword cSectionKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
+		private final Assignment cNameAssignment_0_2 = (Assignment)cGroup_0.eContents().get(2);
+		private final RuleCall cNameXIDParserRuleCall_0_2_0 = (RuleCall)cNameAssignment_0_2.eContents().get(0);
+		private final Assignment cElementAssignment_0_3 = (Assignment)cGroup_0.eContents().get(3);
+		private final Alternatives cElementAlternatives_0_3_0 = (Alternatives)cElementAssignment_0_3.eContents().get(0);
+		private final RuleCall cElementDeprecatedAttributeParserRuleCall_0_3_0_0 = (RuleCall)cElementAlternatives_0_3_0.eContents().get(0);
+		private final RuleCall cElementDeprecatedObjectParserRuleCall_0_3_0_1 = (RuleCall)cElementAlternatives_0_3_0.eContents().get(1);
+		private final RuleCall cElementObjectParserRuleCall_0_3_0_2 = (RuleCall)cElementAlternatives_0_3_0.eContents().get(2);
+		private final Keyword cEndsectionKeyword_0_4 = (Keyword)cGroup_0.eContents().get(4);
+		private final RuleCall cXIDParserRuleCall_0_5 = (RuleCall)cGroup_0.eContents().get(5);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Assignment cNameAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
+		private final RuleCall cNameXIDParserRuleCall_1_0_0 = (RuleCall)cNameAssignment_1_0.eContents().get(0);
+		private final Assignment cDescriptionAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cDescriptionEStringParserRuleCall_1_1_0 = (RuleCall)cDescriptionAssignment_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_2 = (Alternatives)cGroup_1.eContents().get(2);
+		private final Group cGroup_1_2_0 = (Group)cAlternatives_1_2.eContents().get(0);
+		private final Keyword cLeftSquareBracketKeyword_1_2_0_0 = (Keyword)cGroup_1_2_0.eContents().get(0);
+		private final Assignment cElementAssignment_1_2_0_1 = (Assignment)cGroup_1_2_0.eContents().get(1);
+		private final Alternatives cElementAlternatives_1_2_0_1_0 = (Alternatives)cElementAssignment_1_2_0_1.eContents().get(0);
+		private final RuleCall cElementDeprecatedAttributeParserRuleCall_1_2_0_1_0_0 = (RuleCall)cElementAlternatives_1_2_0_1_0.eContents().get(0);
+		private final RuleCall cElementDeprecatedObjectParserRuleCall_1_2_0_1_0_1 = (RuleCall)cElementAlternatives_1_2_0_1_0.eContents().get(1);
+		private final RuleCall cElementObjectParserRuleCall_1_2_0_1_0_2 = (RuleCall)cElementAlternatives_1_2_0_1_0.eContents().get(2);
+		private final Keyword cRightSquareBracketKeyword_1_2_0_2 = (Keyword)cGroup_1_2_0.eContents().get(2);
+		private final Group cGroup_1_2_1 = (Group)cAlternatives_1_2.eContents().get(1);
+		private final Keyword cColonKeyword_1_2_1_0 = (Keyword)cGroup_1_2_1.eContents().get(0);
+		private final Assignment cElementAssignment_1_2_1_1 = (Assignment)cGroup_1_2_1.eContents().get(1);
+		private final Alternatives cElementAlternatives_1_2_1_1_0 = (Alternatives)cElementAssignment_1_2_1_1.eContents().get(0);
+		private final RuleCall cElementDeprecatedAttributeParserRuleCall_1_2_1_1_0_0 = (RuleCall)cElementAlternatives_1_2_1_1_0.eContents().get(0);
+		private final RuleCall cElementDeprecatedObjectParserRuleCall_1_2_1_1_0_1 = (RuleCall)cElementAlternatives_1_2_1_1_0.eContents().get(1);
+		private final RuleCall cElementObjectParserRuleCall_1_2_1_1_0_2 = (RuleCall)cElementAlternatives_1_2_1_1_0.eContents().get(2);
+		
+		//DeprecatedSection sew::WSection:
+		//	{sew::WSection}
+		//	'section' name=XID
+		//	//		( element+=( Object | Attribute  ) )*
+		//	element+=(DeprecatedAttribute | DeprecatedObject | Object)*
+		//	'endsection' XID?
+		//	| name=XID description=EString? ('[' element+=(DeprecatedAttribute | DeprecatedObject | Object)* ']'
+		//	| ':' element+=(DeprecatedAttribute | DeprecatedObject | Object)*)
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{sew::WSection} 'section' name=XID //		( element+=( Object | Attribute  ) )*
+		//element+=(DeprecatedAttribute | DeprecatedObject | Object)* 'endsection' XID? | name=XID description=EString? ('['
+		//element+=(DeprecatedAttribute | DeprecatedObject | Object)* ']' | ':' element+=(DeprecatedAttribute | DeprecatedObject
+		//| Object)*)
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//{sew::WSection} 'section' name=XID //		( element+=( Object | Attribute  ) )*
+		//element+=(DeprecatedAttribute | DeprecatedObject | Object)* 'endsection' XID?
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//{sew::WSection}
+		public Action getWSectionAction_0_0() { return cWSectionAction_0_0; }
+		
+		//'section'
+		public Keyword getSectionKeyword_0_1() { return cSectionKeyword_0_1; }
+		
+		//name=XID
+		public Assignment getNameAssignment_0_2() { return cNameAssignment_0_2; }
+		
+		//XID
+		public RuleCall getNameXIDParserRuleCall_0_2_0() { return cNameXIDParserRuleCall_0_2_0; }
+		
+		////		( element+=( Object | Attribute  ) )*
+		//element+=(DeprecatedAttribute | DeprecatedObject | Object)*
+		public Assignment getElementAssignment_0_3() { return cElementAssignment_0_3; }
+		
+		//(DeprecatedAttribute | DeprecatedObject | Object)
+		public Alternatives getElementAlternatives_0_3_0() { return cElementAlternatives_0_3_0; }
+		
+		//DeprecatedAttribute
+		public RuleCall getElementDeprecatedAttributeParserRuleCall_0_3_0_0() { return cElementDeprecatedAttributeParserRuleCall_0_3_0_0; }
+		
+		//DeprecatedObject
+		public RuleCall getElementDeprecatedObjectParserRuleCall_0_3_0_1() { return cElementDeprecatedObjectParserRuleCall_0_3_0_1; }
+		
+		//Object
+		public RuleCall getElementObjectParserRuleCall_0_3_0_2() { return cElementObjectParserRuleCall_0_3_0_2; }
+		
+		//'endsection'
+		public Keyword getEndsectionKeyword_0_4() { return cEndsectionKeyword_0_4; }
+		
+		//XID?
+		public RuleCall getXIDParserRuleCall_0_5() { return cXIDParserRuleCall_0_5; }
+		
+		//name=XID description=EString? ('[' element+=(DeprecatedAttribute | DeprecatedObject | Object)* ']' | ':'
+		//element+=(DeprecatedAttribute | DeprecatedObject | Object)*)
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//name=XID
+		public Assignment getNameAssignment_1_0() { return cNameAssignment_1_0; }
+		
+		//XID
+		public RuleCall getNameXIDParserRuleCall_1_0_0() { return cNameXIDParserRuleCall_1_0_0; }
+		
+		//description=EString?
+		public Assignment getDescriptionAssignment_1_1() { return cDescriptionAssignment_1_1; }
+		
+		//EString
+		public RuleCall getDescriptionEStringParserRuleCall_1_1_0() { return cDescriptionEStringParserRuleCall_1_1_0; }
+		
+		//('[' element+=(DeprecatedAttribute | DeprecatedObject | Object)* ']' | ':' element+=(DeprecatedAttribute |
+		//DeprecatedObject | Object)*)
+		public Alternatives getAlternatives_1_2() { return cAlternatives_1_2; }
+		
+		//'[' element+=(DeprecatedAttribute | DeprecatedObject | Object)* ']'
+		public Group getGroup_1_2_0() { return cGroup_1_2_0; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_1_2_0_0() { return cLeftSquareBracketKeyword_1_2_0_0; }
+		
+		//element+=(DeprecatedAttribute | DeprecatedObject | Object)*
+		public Assignment getElementAssignment_1_2_0_1() { return cElementAssignment_1_2_0_1; }
+		
+		//(DeprecatedAttribute | DeprecatedObject | Object)
+		public Alternatives getElementAlternatives_1_2_0_1_0() { return cElementAlternatives_1_2_0_1_0; }
+		
+		//DeprecatedAttribute
+		public RuleCall getElementDeprecatedAttributeParserRuleCall_1_2_0_1_0_0() { return cElementDeprecatedAttributeParserRuleCall_1_2_0_1_0_0; }
+		
+		//DeprecatedObject
+		public RuleCall getElementDeprecatedObjectParserRuleCall_1_2_0_1_0_1() { return cElementDeprecatedObjectParserRuleCall_1_2_0_1_0_1; }
+		
+		//Object
+		public RuleCall getElementObjectParserRuleCall_1_2_0_1_0_2() { return cElementObjectParserRuleCall_1_2_0_1_0_2; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_1_2_0_2() { return cRightSquareBracketKeyword_1_2_0_2; }
+		
+		//':' element+=(DeprecatedAttribute | DeprecatedObject | Object)*
+		public Group getGroup_1_2_1() { return cGroup_1_2_1; }
+		
+		//':'
+		public Keyword getColonKeyword_1_2_1_0() { return cColonKeyword_1_2_1_0; }
+		
+		//element+=(DeprecatedAttribute | DeprecatedObject | Object)*
+		public Assignment getElementAssignment_1_2_1_1() { return cElementAssignment_1_2_1_1; }
+		
+		//(DeprecatedAttribute | DeprecatedObject | Object)
+		public Alternatives getElementAlternatives_1_2_1_1_0() { return cElementAlternatives_1_2_1_1_0; }
+		
+		//DeprecatedAttribute
+		public RuleCall getElementDeprecatedAttributeParserRuleCall_1_2_1_1_0_0() { return cElementDeprecatedAttributeParserRuleCall_1_2_1_1_0_0; }
+		
+		//DeprecatedObject
+		public RuleCall getElementDeprecatedObjectParserRuleCall_1_2_1_1_0_1() { return cElementDeprecatedObjectParserRuleCall_1_2_1_1_0_1; }
+		
+		//Object
+		public RuleCall getElementObjectParserRuleCall_1_2_1_1_0_2() { return cElementObjectParserRuleCall_1_2_1_1_0_2; }
+	}
+	public class DeprecatedAttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.DeprecatedAttribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cWAttributeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameDeprecatedAttributeIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Keyword cEqualsSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cValueAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cValueValueSpecificationParserRuleCall_3_0 = (RuleCall)cValueAssignment_3.eContents().get(0);
+		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//DeprecatedAttribute sew::WAttribute:
+		//	{sew::WAttribute} name=DeprecatedAttributeID '=' value=ValueSpecification ';'?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{sew::WAttribute} name=DeprecatedAttributeID '=' value=ValueSpecification ';'?
+		public Group getGroup() { return cGroup; }
+		
+		//{sew::WAttribute}
+		public Action getWAttributeAction_0() { return cWAttributeAction_0; }
+		
+		//name=DeprecatedAttributeID
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//DeprecatedAttributeID
+		public RuleCall getNameDeprecatedAttributeIDParserRuleCall_1_0() { return cNameDeprecatedAttributeIDParserRuleCall_1_0; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_2() { return cEqualsSignKeyword_2; }
+		
+		//value=ValueSpecification
+		public Assignment getValueAssignment_3() { return cValueAssignment_3; }
+		
+		//ValueSpecification
+		public RuleCall getValueValueSpecificationParserRuleCall_3_0() { return cValueValueSpecificationParserRuleCall_3_0; }
+		
+		//';'?
+		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
+	}
+	public class DeprecatedAttributeIDElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.DeprecatedAttributeID");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cXIDParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cAT_IDENTIFIERTerminalRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//DeprecatedAttributeID:
+		//	XID
+		//	| AT_IDENTIFIER;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//XID | AT_IDENTIFIER
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//XID
+		public RuleCall getXIDParserRuleCall_0() { return cXIDParserRuleCall_0; }
+		
+		//AT_IDENTIFIER
+		public RuleCall getAT_IDENTIFIERTerminalRuleCall_1() { return cAT_IDENTIFIERTerminalRuleCall_1; }
+	}
+	public class DeprecatedExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.DeprecatedExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cDollarSignLeftCurlyBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cOperatorAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final Alternatives cOperatorAlternatives_2_0 = (Alternatives)cOperatorAssignment_2.eContents().get(0);
+		private final Keyword cOperatorVerticalLineSemicolonVerticalLineKeyword_2_0_0 = (Keyword)cOperatorAlternatives_2_0.eContents().get(0);
+		private final Keyword cOperatorIKeyword_2_0_1 = (Keyword)cOperatorAlternatives_2_0.eContents().get(1);
+		private final Assignment cOperandAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cOperandValueSpecificationParserRuleCall_3_0 = (RuleCall)cOperandAssignment_3.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//DeprecatedExpression sew::WValueSpecification:
+		//	{expression::Expression}
+		//	'${'
+		//	operator=('|;|' | '|i|') operand+=ValueSpecification*
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{expression::Expression} '${' operator=('|;|' | '|i|') operand+=ValueSpecification* '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{expression::Expression}
+		public Action getExpressionAction_0() { return cExpressionAction_0; }
+		
+		//'${'
+		public Keyword getDollarSignLeftCurlyBracketKeyword_1() { return cDollarSignLeftCurlyBracketKeyword_1; }
+		
+		//operator=('|;|' | '|i|')
+		public Assignment getOperatorAssignment_2() { return cOperatorAssignment_2; }
+		
+		//('|;|' | '|i|')
+		public Alternatives getOperatorAlternatives_2_0() { return cOperatorAlternatives_2_0; }
+		
+		//'|;|'
+		public Keyword getOperatorVerticalLineSemicolonVerticalLineKeyword_2_0_0() { return cOperatorVerticalLineSemicolonVerticalLineKeyword_2_0_0; }
+		
+		//'|i|'
+		public Keyword getOperatorIKeyword_2_0_1() { return cOperatorIKeyword_2_0_1; }
+		
+		//operand+=ValueSpecification*
+		public Assignment getOperandAssignment_3() { return cOperandAssignment_3; }
+		
+		//ValueSpecification
+		public RuleCall getOperandValueSpecificationParserRuleCall_3_0() { return cOperandValueSpecificationParserRuleCall_3_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+	
+	
+	private final WorkflowElements pWorkflow;
+	private final PrologElements pProlog;
+	private final ReservedWordElements pReservedWord;
+	private final TerminalRule tXIDENDIFIER;
+	private final TerminalRule tAT_IDENTIFIER;
+	private final XIDElements pXID;
+	private final UFIElements pUFI;
+	private final ObjectElements pObject;
+	private final PropertyElements pProperty;
+	private final SectionElements pSection;
+	private final AttributeElements pAttribute;
+	private final ValueSpecificationElements pValueSpecification;
+	private final ExpressionElements pExpression;
+	private final ConditionalExpressionElements pConditionalExpression;
+	private final ConditionalOrExpressionElements pConditionalOrExpression;
+	private final ConditionalAndExpressionElements pConditionalAndExpression;
+	private final EqualityExpressionElements pEqualityExpression;
+	private final RelationalExpressionElements pRelationalExpression;
+	private final AdditiveExpressionElements pAdditiveExpression;
+	private final MultiplicativeExpressionElements pMultiplicativeExpression;
+	private final PrimaryExpressionElements pPrimaryExpression;
+	private final LiteralExpressionElements pLiteralExpression;
+	private final LiteralArrayValueElements pLiteralArrayValue;
+	private final LiteralObjectReferenceElements pLiteralObjectReference;
+	private final LiteralBooleanValueElements pLiteralBooleanValue;
+	private final LiteralCharacterValueElements pLiteralCharacterValue;
+	private final LiteralIntegerValueElements pLiteralIntegerValue;
+	private final LiteralRationalValueElements pLiteralRationalValue;
+	private final LiteralFloatValueElements pLiteralFloatValue;
+	private final LiteralRealValueElements pLiteralRealValue;
+	private final LiteralStringValueElements pLiteralStringValue;
+	private final LiteralNullValueElements pLiteralNullValue;
+	private final LiteralVariableReferenceElements pLiteralVariableReference;
+	private final LiteralTimeVariableElements pLiteralTimeVariable;
+	private final LiteralTimeDeltaVariableElements pLiteralTimeDeltaVariable;
+	private final LiteralInstanceReferenceElements pLiteralInstanceReference;
+	private final LiteralThisInstanceElements pLiteralThisInstance;
+	private final LiteralSelfInstanceElements pLiteralSelfInstance;
+	private final LiteralParentInstanceElements pLiteralParentInstance;
+	private final LiteralSuperInstanceElements pLiteralSuperInstance;
+	private final LiteralSystemInstanceElements pLiteralSystemInstance;
+	private final LiteralEnvInstanceElements pLiteralEnvInstance;
+	private final EBooleanElements pEBoolean;
+	private final TerminalRule tCHARACTER;
+	private final ECharElements pEChar;
+	private final ELongElements pELong;
+	private final EDoubleElements pEDouble;
+	private final EBigDecimalElements pEBigDecimal;
+	private final EStringElements pEString;
+	private final DeprecatedReservedWordElements pDeprecatedReservedWord;
+	private final DeprecatedObjectElements pDeprecatedObject;
+	private final DeprecatedPropertyElements pDeprecatedProperty;
+	private final DeprecatedSectionElements pDeprecatedSection;
+	private final DeprecatedAttributeElements pDeprecatedAttribute;
+	private final DeprecatedAttributeIDElements pDeprecatedAttributeID;
+	private final DeprecatedExpressionElements pDeprecatedExpression;
+	
+	private final Grammar grammar;
+	
+	private final TerminalsGrammarAccess gaTerminals;
+
+	@Inject
+	public SEWGrammarAccess(GrammarProvider grammarProvider,
+			TerminalsGrammarAccess gaTerminals) {
+		this.grammar = internalFindGrammar(grammarProvider);
+		this.gaTerminals = gaTerminals;
+		this.pWorkflow = new WorkflowElements();
+		this.pProlog = new PrologElements();
+		this.pReservedWord = new ReservedWordElements();
+		this.tXIDENDIFIER = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.XIDENDIFIER");
+		this.tAT_IDENTIFIER = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.AT_IDENTIFIER");
+		this.pXID = new XIDElements();
+		this.pUFI = new UFIElements();
+		this.pObject = new ObjectElements();
+		this.pProperty = new PropertyElements();
+		this.pSection = new SectionElements();
+		this.pAttribute = new AttributeElements();
+		this.pValueSpecification = new ValueSpecificationElements();
+		this.pExpression = new ExpressionElements();
+		this.pConditionalExpression = new ConditionalExpressionElements();
+		this.pConditionalOrExpression = new ConditionalOrExpressionElements();
+		this.pConditionalAndExpression = new ConditionalAndExpressionElements();
+		this.pEqualityExpression = new EqualityExpressionElements();
+		this.pRelationalExpression = new RelationalExpressionElements();
+		this.pAdditiveExpression = new AdditiveExpressionElements();
+		this.pMultiplicativeExpression = new MultiplicativeExpressionElements();
+		this.pPrimaryExpression = new PrimaryExpressionElements();
+		this.pLiteralExpression = new LiteralExpressionElements();
+		this.pLiteralArrayValue = new LiteralArrayValueElements();
+		this.pLiteralObjectReference = new LiteralObjectReferenceElements();
+		this.pLiteralBooleanValue = new LiteralBooleanValueElements();
+		this.pLiteralCharacterValue = new LiteralCharacterValueElements();
+		this.pLiteralIntegerValue = new LiteralIntegerValueElements();
+		this.pLiteralRationalValue = new LiteralRationalValueElements();
+		this.pLiteralFloatValue = new LiteralFloatValueElements();
+		this.pLiteralRealValue = new LiteralRealValueElements();
+		this.pLiteralStringValue = new LiteralStringValueElements();
+		this.pLiteralNullValue = new LiteralNullValueElements();
+		this.pLiteralVariableReference = new LiteralVariableReferenceElements();
+		this.pLiteralTimeVariable = new LiteralTimeVariableElements();
+		this.pLiteralTimeDeltaVariable = new LiteralTimeDeltaVariableElements();
+		this.pLiteralInstanceReference = new LiteralInstanceReferenceElements();
+		this.pLiteralThisInstance = new LiteralThisInstanceElements();
+		this.pLiteralSelfInstance = new LiteralSelfInstanceElements();
+		this.pLiteralParentInstance = new LiteralParentInstanceElements();
+		this.pLiteralSuperInstance = new LiteralSuperInstanceElements();
+		this.pLiteralSystemInstance = new LiteralSystemInstanceElements();
+		this.pLiteralEnvInstance = new LiteralEnvInstanceElements();
+		this.pEBoolean = new EBooleanElements();
+		this.tCHARACTER = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.sew.xtext.SEW.CHARACTER");
+		this.pEChar = new ECharElements();
+		this.pELong = new ELongElements();
+		this.pEDouble = new EDoubleElements();
+		this.pEBigDecimal = new EBigDecimalElements();
+		this.pEString = new EStringElements();
+		this.pDeprecatedReservedWord = new DeprecatedReservedWordElements();
+		this.pDeprecatedObject = new DeprecatedObjectElements();
+		this.pDeprecatedProperty = new DeprecatedPropertyElements();
+		this.pDeprecatedSection = new DeprecatedSectionElements();
+		this.pDeprecatedAttribute = new DeprecatedAttributeElements();
+		this.pDeprecatedAttributeID = new DeprecatedAttributeIDElements();
+		this.pDeprecatedExpression = new DeprecatedExpressionElements();
+	}
+	
+	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
+		Grammar grammar = grammarProvider.getGrammar(this);
+		while (grammar != null) {
+			if ("org.eclipse.efm.sew.xtext.SEW".equals(grammar.getName())) {
+				return grammar;
+			}
+			List<Grammar> grammars = grammar.getUsedGrammars();
+			if (!grammars.isEmpty()) {
+				grammar = grammars.iterator().next();
+			} else {
+				return null;
+			}
+		}
+		return grammar;
+	}
+	
+	@Override
+	public Grammar getGrammar() {
+		return grammar;
+	}
+	
+	
+	public TerminalsGrammarAccess getTerminalsGrammarAccess() {
+		return gaTerminals;
+	}
+
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Symbolic Execution Workflow Specification
+	//////////////////////////////////////////////////////////////////////////////////
+	//Workflow sew::SEWorkflow:
+	//	{sew::SEWorkflow} Prolog? (type=('workflow' | 'symbex-workflow') name=UFI? description=EString?
+	//	'{'
+	//	element+=(Object | Property)*
+	//	'}'
+	//	// Deprecated Object as FAVM Workflow
+	//	| element+=DeprecatedObject)
+	public WorkflowElements getWorkflowAccess() {
+		return pWorkflow;
+	}
+	
+	public ParserRule getWorkflowRule() {
+		return getWorkflowAccess().getRule();
+	}
+	
+	//Prolog:
+	//	('@sew' | '@favm') '<' ('workflow' | 'sew') (',' EDouble)? (',' UFI | EString)? '>:';
+	public PrologElements getPrologAccess() {
+		return pProlog;
+	}
+	
+	public ParserRule getPrologRule() {
+		return getPrologAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// [ Qualified ] Identifier
+	//////////////////////////////////////////////////////////////////////////////////
+	//ReservedWord:
+	//	'workflow' | 'sew'
+	//	// Deprecated
+	//	| DeprecatedReservedWord;
+	public ReservedWordElements getReservedWordAccess() {
+		return pReservedWord;
+	}
+	
+	public ParserRule getReservedWordRule() {
+		return getReservedWordAccess().getRule();
+	}
+	
+	//terminal XIDENDIFIER:
+	//	('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '#')*;
+	public TerminalRule getXIDENDIFIERRule() {
+		return tXIDENDIFIER;
+	}
+	
+	//terminal AT_IDENTIFIER:
+	//	'@' XIDENDIFIER;
+	public TerminalRule getAT_IDENTIFIERRule() {
+		return tAT_IDENTIFIER;
+	}
+	
+	//XID:
+	//	ReservedWord | XIDENDIFIER;
+	public XIDElements getXIDAccess() {
+		return pXID;
+	}
+	
+	public ParserRule getXIDRule() {
+		return getXIDAccess().getRule();
+	}
+	
+	//UFI:
+	//	XID (('::' | '.') XID)*;
+	public UFIElements getUFIAccess() {
+		return pUFI;
+	}
+	
+	public ParserRule getUFIRule() {
+		return getUFIAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Object Configuration Specification
+	//////////////////////////////////////////////////////////////////////////////////
+	//Object sew::WObject:
+	//	{sew::WObject} type=UFI name=UFI? description=EString?
+	//	'{'
+	//	element+=(Object | Property)*
+	//	'}'
+	//	| {sew::WObject} name=UFI (':=' | '+:=') (type=UFI description=EString?)?
+	//	'{'
+	//	element+=(Object | Property)*
+	//	'}'
+	public ObjectElements getObjectAccess() {
+		return pObject;
+	}
+	
+	public ParserRule getObjectRule() {
+		return getObjectAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Property Specification
+	//////////////////////////////////////////////////////////////////////////////////
+	//Property sew::WProperty:
+	//	Section
+	//	| Attribute
+	public PropertyElements getPropertyAccess() {
+		return pProperty;
+	}
+	
+	public ParserRule getPropertyRule() {
+		return getPropertyAccess().getRule();
+	}
+	
+	//Section sew::WSection:
+	//	name=XID description=EString? ('[' element+=(Object | Attribute)* ']'
+	//	| ':' element+=(Object | Attribute)*)
+	public SectionElements getSectionAccess() {
+		return pSection;
+	}
+	
+	public ParserRule getSectionRule() {
+		return getSectionAccess().getRule();
+	}
+	
+	//Attribute sew::WAttribute:
+	//	{sew::WAttribute} name=XID '=' value=ValueSpecification ';'?
+	public AttributeElements getAttributeAccess() {
+		return pAttribute;
+	}
+	
+	public ParserRule getAttributeRule() {
+		return getAttributeAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Value Specification
+	//////////////////////////////////////////////////////////////////////////////////
+	//ValueSpecification sew::WValueSpecification:
+	//	Expression
+	public ValueSpecificationElements getValueSpecificationAccess() {
+		return pValueSpecification;
+	}
+	
+	public ParserRule getValueSpecificationRule() {
+		return getValueSpecificationAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Expression Specification
+	//////////////////////////////////////////////////////////////////////////////////
+	//Expression sew::WValueSpecification:
+	//	conditionalExpression
+	//	// Deprecated
+	//	| DeprecatedExpression
+	public ExpressionElements getExpressionAccess() {
+		return pExpression;
+	}
+	
+	public ParserRule getExpressionRule() {
+		return getExpressionAccess().getRule();
+	}
+	
+	//conditionalExpression sew::WValueSpecification:
+	//	conditionalOrExpression ({expression::Expression.operand+=current} operator='?' operand+=Expression ':'
+	//	operand+=Expression)?
+	public ConditionalExpressionElements getConditionalExpressionAccess() {
+		return pConditionalExpression;
+	}
+	
+	public ParserRule getConditionalExpressionRule() {
+		return getConditionalExpressionAccess().getRule();
+	}
+	
+	//conditionalOrExpression sew::WValueSpecification:
+	//	conditionalAndExpression ({expression::Expression.operand+=current} operator=('||' | 'or')
+	//	operand+=conditionalAndExpression (('||' | 'or') operand+=conditionalAndExpression)*)?
+	public ConditionalOrExpressionElements getConditionalOrExpressionAccess() {
+		return pConditionalOrExpression;
+	}
+	
+	public ParserRule getConditionalOrExpressionRule() {
+		return getConditionalOrExpressionAccess().getRule();
+	}
+	
+	//conditionalAndExpression sew::WValueSpecification:
+	//	equalityExpression ({expression::Expression.operand+=current} operator=('&&' | 'and') operand+=equalityExpression
+	//	(('&&' | 'and') operand+=equalityExpression)*)?
+	public ConditionalAndExpressionElements getConditionalAndExpressionAccess() {
+		return pConditionalAndExpression;
+	}
+	
+	public ParserRule getConditionalAndExpressionRule() {
+		return getConditionalAndExpressionAccess().getRule();
+	}
+	
+	//equalityExpression sew::WValueSpecification:
+	//	relationalExpression ({expression::Expression.operand+=current} operator=('==' | '!=' | '===' | '=!=' | '=/=')
+	//	operand+=relationalExpression)?
+	public EqualityExpressionElements getEqualityExpressionAccess() {
+		return pEqualityExpression;
+	}
+	
+	public ParserRule getEqualityExpressionRule() {
+		return getEqualityExpressionAccess().getRule();
+	}
+	
+	//relationalExpression sew::WValueSpecification:
+	//	additiveExpression ({expression::Expression.operand+=current} operator=('<' | '<=' | '>' | '>=')
+	//	operand+=additiveExpression)?
+	public RelationalExpressionElements getRelationalExpressionAccess() {
+		return pRelationalExpression;
+	}
+	
+	public ParserRule getRelationalExpressionRule() {
+		return getRelationalExpressionAccess().getRule();
+	}
+	
+	//additiveExpression sew::WValueSpecification:
+	//	multiplicativeExpression ({expression::Expression.operand+=current} operator='+' operand+=multiplicativeExpression
+	//	('+' operand+=multiplicativeExpression)*)?
+	public AdditiveExpressionElements getAdditiveExpressionAccess() {
+		return pAdditiveExpression;
+	}
+	
+	public ParserRule getAdditiveExpressionRule() {
+		return getAdditiveExpressionAccess().getRule();
+	}
+	
+	//multiplicativeExpression sew::WValueSpecification:
+	//	primaryExpression ({expression::Expression.operand+=current} operator='*' operand+=primaryExpression ('*'
+	//	operand+=primaryExpression)* | {expression::Expression.operand+=current} operator='**' operand+=primaryExpression
+	//	('**' operand+=primaryExpression)* | {expression::Expression.operand+=current} operator='/'
+	//	operand+=primaryExpression ('/' operand+=primaryExpression)* | {expression::Expression.operand+=current} operator='%'
+	//	operand+=primaryExpression ('%' operand+=primaryExpression)*)?
+	public MultiplicativeExpressionElements getMultiplicativeExpressionAccess() {
+		return pMultiplicativeExpression;
+	}
+	
+	public ParserRule getMultiplicativeExpressionRule() {
+		return getMultiplicativeExpressionAccess().getRule();
+	}
+	
+	//primaryExpression sew::WValueSpecification:
+	//	'+' primaryExpression
+	//	| {expression::Expression} (operator='-' operand+=primaryExpression) | {expression::Expression} (operator=('!' |
+	//	'not') operand+=primaryExpression) | '(' Expression ')'
+	//	| LiteralExpression
+	public PrimaryExpressionElements getPrimaryExpressionAccess() {
+		return pPrimaryExpression;
+	}
+	
+	public ParserRule getPrimaryExpressionRule() {
+		return getPrimaryExpressionAccess().getRule();
+	}
+	
+	//LiteralExpression sew::WValueSpecification:
+	//	LiteralBooleanValue
+	//	| LiteralCharacterValue
+	//	| LiteralIntegerValue
+	//	| LiteralRationalValue
+	//	| LiteralFloatValue
+	//	//| LiteralRealValue
+	//	| LiteralStringValue
+	//	| LiteralNullValue
+	//	| LiteralArrayValue
+	//	| LiteralObjectReference
+	//	| LiteralVariableReference
+	//	| LiteralInstanceReference
+	public LiteralExpressionElements getLiteralExpressionAccess() {
+		return pLiteralExpression;
+	}
+	
+	public ParserRule getLiteralExpressionRule() {
+		return getLiteralExpressionAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Array of Literal Specification
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralArrayValue expression::LiteralArrayValue:
+	//	{expression::LiteralArrayValue}
+	//	'[' (values+=ValueSpecification (',' values+=ValueSpecification)*)?
+	//	']'
+	public LiteralArrayValueElements getLiteralArrayValueAccess() {
+		return pLiteralArrayValue;
+	}
+	
+	public ParserRule getLiteralArrayValueRule() {
+		return getLiteralArrayValueAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Literal Object Reference Specification
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralObjectReference expression::LiteralObjectReference:
+	//	'&'? (object=[sew::WObject|UFI] | symbol=UFI)
+	public LiteralObjectReferenceElements getLiteralObjectReferenceAccess() {
+		return pLiteralObjectReference;
+	}
+	
+	public ParserRule getLiteralObjectReferenceRule() {
+		return getLiteralObjectReferenceAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Literal Specification
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralBooleanValue expression::LiteralBooleanValue:
+	//	value=EBoolean
+	public LiteralBooleanValueElements getLiteralBooleanValueAccess() {
+		return pLiteralBooleanValue;
+	}
+	
+	public ParserRule getLiteralBooleanValueRule() {
+		return getLiteralBooleanValueAccess().getRule();
+	}
+	
+	//LiteralCharacterValue expression::LiteralCharacterValue:
+	//	value=EChar
+	public LiteralCharacterValueElements getLiteralCharacterValueAccess() {
+		return pLiteralCharacterValue;
+	}
+	
+	public ParserRule getLiteralCharacterValueRule() {
+		return getLiteralCharacterValueAccess().getRule();
+	}
+	
+	//LiteralIntegerValue expression::LiteralIntegerValue:
+	//	value=ELong
+	public LiteralIntegerValueElements getLiteralIntegerValueAccess() {
+		return pLiteralIntegerValue;
+	}
+	
+	public ParserRule getLiteralIntegerValueRule() {
+		return getLiteralIntegerValueAccess().getRule();
+	}
+	
+	//LiteralRationalValue expression::LiteralRationalValue:
+	//	numerator=ELong '/' denominator=ELong
+	public LiteralRationalValueElements getLiteralRationalValueAccess() {
+		return pLiteralRationalValue;
+	}
+	
+	public ParserRule getLiteralRationalValueRule() {
+		return getLiteralRationalValueAccess().getRule();
+	}
+	
+	//LiteralFloatValue expression::LiteralFloatValue:
+	//	value=EDouble
+	public LiteralFloatValueElements getLiteralFloatValueAccess() {
+		return pLiteralFloatValue;
+	}
+	
+	public ParserRule getLiteralFloatValueRule() {
+		return getLiteralFloatValueAccess().getRule();
+	}
+	
+	//LiteralRealValue expression::LiteralRealValue:
+	//	value=EBigDecimal
+	public LiteralRealValueElements getLiteralRealValueAccess() {
+		return pLiteralRealValue;
+	}
+	
+	public ParserRule getLiteralRealValueRule() {
+		return getLiteralRealValueAccess().getRule();
+	}
+	
+	//LiteralStringValue expression::LiteralStringValue:
+	//	value=EString
+	public LiteralStringValueElements getLiteralStringValueAccess() {
+		return pLiteralStringValue;
+	}
+	
+	public ParserRule getLiteralStringValueRule() {
+		return getLiteralStringValueAccess().getRule();
+	}
+	
+	//LiteralNullValue expression::LiteralNullValue:
+	//	{expression::LiteralNullValue}
+	//	'null' ('<' type=XID '>')?
+	public LiteralNullValueElements getLiteralNullValueAccess() {
+		return pLiteralNullValue;
+	}
+	
+	public ParserRule getLiteralNullValueRule() {
+		return getLiteralNullValueAccess().getRule();
+	}
+	
+	//LiteralVariableReference expression::LiteralReferenceValue:
+	//	LiteralTimeVariable
+	//	| LiteralTimeDeltaVariable
+	public LiteralVariableReferenceElements getLiteralVariableReferenceAccess() {
+		return pLiteralVariableReference;
+	}
+	
+	public ParserRule getLiteralVariableReferenceRule() {
+		return getLiteralVariableReferenceAccess().getRule();
+	}
+	
+	//LiteralTimeVariable expression::LiteralTimeVariable:
+	//	{expression::LiteralTimeVariable} symbol='$time'
+	public LiteralTimeVariableElements getLiteralTimeVariableAccess() {
+		return pLiteralTimeVariable;
+	}
+	
+	public ParserRule getLiteralTimeVariableRule() {
+		return getLiteralTimeVariableAccess().getRule();
+	}
+	
+	//LiteralTimeDeltaVariable expression::LiteralTimeDeltaVariable:
+	//	{expression::LiteralTimeDeltaVariable} symbol='$delta'
+	public LiteralTimeDeltaVariableElements getLiteralTimeDeltaVariableAccess() {
+		return pLiteralTimeDeltaVariable;
+	}
+	
+	public ParserRule getLiteralTimeDeltaVariableRule() {
+		return getLiteralTimeDeltaVariableAccess().getRule();
+	}
+	
+	//LiteralInstanceReference expression::LiteralReferenceValue:
+	//	LiteralThisInstance
+	//	| LiteralSelfInstance
+	//	| LiteralParentInstance
+	//	| LiteralSuperInstance
+	//	| LiteralSystemInstance
+	//	| LiteralEnvInstance
+	public LiteralInstanceReferenceElements getLiteralInstanceReferenceAccess() {
+		return pLiteralInstanceReference;
+	}
+	
+	public ParserRule getLiteralInstanceReferenceRule() {
+		return getLiteralInstanceReferenceAccess().getRule();
+	}
+	
+	//LiteralThisInstance expression::LiteralThisInstance:
+	//	{expression::LiteralThisInstance} symbol='$this'
+	public LiteralThisInstanceElements getLiteralThisInstanceAccess() {
+		return pLiteralThisInstance;
+	}
+	
+	public ParserRule getLiteralThisInstanceRule() {
+		return getLiteralThisInstanceAccess().getRule();
+	}
+	
+	//LiteralSelfInstance expression::LiteralSelfInstance:
+	//	{expression::LiteralSelfInstance} symbol='$self'
+	public LiteralSelfInstanceElements getLiteralSelfInstanceAccess() {
+		return pLiteralSelfInstance;
+	}
+	
+	public ParserRule getLiteralSelfInstanceRule() {
+		return getLiteralSelfInstanceAccess().getRule();
+	}
+	
+	//LiteralParentInstance expression::LiteralParentInstance:
+	//	{expression::LiteralParentInstance} symbol='$parent'
+	public LiteralParentInstanceElements getLiteralParentInstanceAccess() {
+		return pLiteralParentInstance;
+	}
+	
+	public ParserRule getLiteralParentInstanceRule() {
+		return getLiteralParentInstanceAccess().getRule();
+	}
+	
+	//LiteralSuperInstance expression::LiteralSuperInstance:
+	//	{expression::LiteralSuperInstance} symbol='$super'
+	public LiteralSuperInstanceElements getLiteralSuperInstanceAccess() {
+		return pLiteralSuperInstance;
+	}
+	
+	public ParserRule getLiteralSuperInstanceRule() {
+		return getLiteralSuperInstanceAccess().getRule();
+	}
+	
+	//LiteralSystemInstance expression::LiteralSystemInstance:
+	//	{expression::LiteralSystemInstance} symbol='$system'
+	public LiteralSystemInstanceElements getLiteralSystemInstanceAccess() {
+		return pLiteralSystemInstance;
+	}
+	
+	public ParserRule getLiteralSystemInstanceRule() {
+		return getLiteralSystemInstanceAccess().getRule();
+	}
+	
+	//LiteralEnvInstance expression::LiteralEnvInstance:
+	//	{expression::LiteralEnvInstance} symbol=('$env' | 'env')
+	public LiteralEnvInstanceElements getLiteralEnvInstanceAccess() {
+		return pLiteralEnvInstance;
+	}
+	
+	public ParserRule getLiteralEnvInstanceRule() {
+		return getLiteralEnvInstanceAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Terminal Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//EBoolean ecore::EBoolean:
+	//	'true'
+	//	| 'false'
+	public EBooleanElements getEBooleanAccess() {
+		return pEBoolean;
+	}
+	
+	public ParserRule getEBooleanRule() {
+		return getEBooleanAccess().getRule();
+	}
+	
+	//terminal CHARACTER:
+	//	"'" . "'";
+	public TerminalRule getCHARACTERRule() {
+		return tCHARACTER;
+	}
+	
+	//EChar ecore::EChar:
+	//	CHARACTER
+	public ECharElements getECharAccess() {
+		return pEChar;
+	}
+	
+	public ParserRule getECharRule() {
+		return getECharAccess().getRule();
+	}
+	
+	//ELong ecore::ELong:
+	//	'-'? INT
+	public ELongElements getELongAccess() {
+		return pELong;
+	}
+	
+	public ParserRule getELongRule() {
+		return getELongAccess().getRule();
+	}
+	
+	//EDouble ecore::EDouble:
+	//	'-'? INT? '.' INT
+	public EDoubleElements getEDoubleAccess() {
+		return pEDouble;
+	}
+	
+	public ParserRule getEDoubleRule() {
+		return getEDoubleAccess().getRule();
+	}
+	
+	//EBigDecimal ecore::EBigDecimal:
+	//	INT? '.' INT
+	public EBigDecimalElements getEBigDecimalAccess() {
+		return pEBigDecimal;
+	}
+	
+	public ParserRule getEBigDecimalRule() {
+		return getEBigDecimalAccess().getRule();
+	}
+	
+	//EString:
+	//	STRING;
+	public EStringElements getEStringAccess() {
+		return pEString;
+	}
+	
+	public ParserRule getEStringRule() {
+		return getEStringAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// @DEPRECATED Diversity Configuration Specification
+	//////////////////////////////////////////////////////////////////////////////////
+	//DeprecatedReservedWord:
+	//	'form' | 'endform'
+	//	| 'prototype' | 'endprototype'
+	//	| 'section' | 'endsection';
+	public DeprecatedReservedWordElements getDeprecatedReservedWordAccess() {
+		return pDeprecatedReservedWord;
+	}
+	
+	public ParserRule getDeprecatedReservedWordRule() {
+		return getDeprecatedReservedWordAccess().getRule();
+	}
+	
+	//DeprecatedObject sew::WObject:
+	//	{sew::WObject}
+	//	'form'
+	//	name=UFI description=EString? 'as' '&'? type=UFI 'is'
+	//	element+=DeprecatedProperty*
+	//	'endform'
+	//	| {sew::WObject}
+	//	'prototype'
+	//	name=UFI description=EString? 'as' '&'? type=UFI 'is'
+	//	element+=DeprecatedProperty*
+	//	'endprototype'
+	public DeprecatedObjectElements getDeprecatedObjectAccess() {
+		return pDeprecatedObject;
+	}
+	
+	public ParserRule getDeprecatedObjectRule() {
+		return getDeprecatedObjectAccess().getRule();
+	}
+	
+	//DeprecatedProperty sew::WProperty:
+	//	DeprecatedSection
+	//	| DeprecatedAttribute
+	public DeprecatedPropertyElements getDeprecatedPropertyAccess() {
+		return pDeprecatedProperty;
+	}
+	
+	public ParserRule getDeprecatedPropertyRule() {
+		return getDeprecatedPropertyAccess().getRule();
+	}
+	
+	//DeprecatedSection sew::WSection:
+	//	{sew::WSection}
+	//	'section' name=XID
+	//	//		( element+=( Object | Attribute  ) )*
+	//	element+=(DeprecatedAttribute | DeprecatedObject | Object)*
+	//	'endsection' XID?
+	//	| name=XID description=EString? ('[' element+=(DeprecatedAttribute | DeprecatedObject | Object)* ']'
+	//	| ':' element+=(DeprecatedAttribute | DeprecatedObject | Object)*)
+	public DeprecatedSectionElements getDeprecatedSectionAccess() {
+		return pDeprecatedSection;
+	}
+	
+	public ParserRule getDeprecatedSectionRule() {
+		return getDeprecatedSectionAccess().getRule();
+	}
+	
+	//DeprecatedAttribute sew::WAttribute:
+	//	{sew::WAttribute} name=DeprecatedAttributeID '=' value=ValueSpecification ';'?
+	public DeprecatedAttributeElements getDeprecatedAttributeAccess() {
+		return pDeprecatedAttribute;
+	}
+	
+	public ParserRule getDeprecatedAttributeRule() {
+		return getDeprecatedAttributeAccess().getRule();
+	}
+	
+	//DeprecatedAttributeID:
+	//	XID
+	//	| AT_IDENTIFIER;
+	public DeprecatedAttributeIDElements getDeprecatedAttributeIDAccess() {
+		return pDeprecatedAttributeID;
+	}
+	
+	public ParserRule getDeprecatedAttributeIDRule() {
+		return getDeprecatedAttributeIDAccess().getRule();
+	}
+	
+	//DeprecatedExpression sew::WValueSpecification:
+	//	{expression::Expression}
+	//	'${'
+	//	operator=('|;|' | '|i|') operand+=ValueSpecification*
+	//	'}'
+	public DeprecatedExpressionElements getDeprecatedExpressionAccess() {
+		return pDeprecatedExpression;
+	}
+	
+	public ParserRule getDeprecatedExpressionRule() {
+		return getDeprecatedExpressionAccess().getRule();
+	}
+	
+	//terminal ID:
+	//	'^'? ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*;
+	public TerminalRule getIDRule() {
+		return gaTerminals.getIDRule();
+	}
+	
+	//terminal INT returns ecore::EInt:
+	//	'0'..'9'+;
+	public TerminalRule getINTRule() {
+		return gaTerminals.getINTRule();
+	}
+	
+	//terminal STRING:
+	//	'"' ('\\' . | !('\\' | '"'))* '"' | "'" ('\\' . | !('\\' | "'"))* "'";
+	public TerminalRule getSTRINGRule() {
+		return gaTerminals.getSTRINGRule();
+	}
+	
+	//terminal ML_COMMENT:
+	//	'/ *'->'* /';
+	public TerminalRule getML_COMMENTRule() {
+		return gaTerminals.getML_COMMENTRule();
+	}
+	
+	//terminal SL_COMMENT:
+	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
+	public TerminalRule getSL_COMMENTRule() {
+		return gaTerminals.getSL_COMMENTRule();
+	}
+	
+	//terminal WS:
+	//	' ' | '\t' | '\r' | '\n'+;
+	public TerminalRule getWSRule() {
+		return gaTerminals.getWSRule();
+	}
+	
+	//terminal ANY_OTHER:
+	//	.;
+	public TerminalRule getANY_OTHERRule() {
+		return gaTerminals.getANY_OTHERRule();
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/validation/AbstractSEWValidator.java b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/validation/AbstractSEWValidator.java
new file mode 100644
index 0000000..2b2d105
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src-gen/org/eclipse/efm/sew/xtext/validation/AbstractSEWValidator.java
@@ -0,0 +1,30 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.validation;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.xtext.validation.AbstractDeclarativeValidator;
+
+public abstract class AbstractSEWValidator extends AbstractDeclarativeValidator {
+	
+	@Override
+	protected List<EPackage> getEPackages() {
+		List<EPackage> result = new ArrayList<EPackage>();
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/efm/SEW"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/efm/SEW/Expression"));
+		return result;
+	}
+	
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/GenerateSEW.mwe2 b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/GenerateSEW.mwe2
new file mode 100644
index 0000000..5e458c3
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/GenerateSEW.mwe2
@@ -0,0 +1,82 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+module org.eclipse.efm.sew.xtext.GenerateSEW
+
+import org.eclipse.xtext.xtext.generator.*
+import org.eclipse.xtext.xtext.generator.model.project.*
+
+var rootPath = ".."
+
+var fileHeader =
+"/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/"
+
+
+Workflow {
+
+	component = XtextGenerator {
+		configuration = {
+			project = StandardProjectConfig {
+				baseName = "org.eclipse.efm.sew.xtext"
+				rootPath = rootPath
+				runtimeTest = {
+					enabled = true
+				}
+				eclipsePlugin = {
+					enabled = true
+				}
+				eclipsePluginTest = {
+					enabled = true
+				}
+				createEclipseMetaData = true
+			}
+			code = {
+				encoding = "UTF-8"
+				fileHeader = fileHeader
+			}
+		}
+		language = StandardLanguage {
+			name = "org.eclipse.efm.sew.xtext.SEW"
+			fileExtensions = "sew,favm"
+			referencedResource = "platform:/resource/org.eclipse.efm.sew.ecore/resources/ecore/sew.genmodel"
+
+			fragment = ecore2xtext.Ecore2XtextValueConverterServiceFragment2 auto-inject {}
+
+			parserGenerator = {
+				options = auto-inject {
+					classSplitting = true
+					backtrack = true
+				}
+			}
+
+			fragment = exporting.SimpleNamesFragment2 auto-inject {}
+
+			serializer = {
+				generateStub = false
+			}
+			validator = {
+				// composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
+			}
+		}
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/SEW.xtext b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/SEW.xtext
new file mode 100644
index 0000000..02f5381
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/SEW.xtext
@@ -0,0 +1,453 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+grammar org.eclipse.efm.sew.xtext.SEW with org.eclipse.xtext.common.Terminals
+
+
+// [XTEXT-BUG] https://www.eclipse.org/forums/index.php/t/1081040/
+// Nested packages is not supported well unless you use 
+// import platform:/resource/xxxxx/yyy.ecore#//pack 
+// instead of namespace imports (there is somewhere a bug around this)
+import "platform:/resource/org.eclipse.efm.sew.ecore/resources/ecore/sew.ecore#//expression"  as expression
+//import "http://www.eclipse.org/efm/SEW/Expression" as expression
+
+import "http://www.eclipse.org/emf/2002/Ecore" as ecore
+import "http://www.eclipse.org/efm/SEW" as sew
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Symbolic Execution Workflow Specification
+////////////////////////////////////////////////////////////////////////////////
+
+Workflow returns sew::SEWorkflow
+: {sew::SEWorkflow}
+	( Prolog )?
+	( type=( 'workflow' | 'symbex-workflow' )
+		( name=UFI )?  ( description=EString )?
+		'{'
+			( element+=( Object | Property ) )*
+		'}'
+
+	// Deprecated Object as FAVM Workflow
+	| element+=DeprecatedObject
+	)
+;
+
+
+Prolog
+: ( '@sew' | '@favm' ) '<'
+	( 'workflow' | 'sew' )
+	( ',' EDouble )? ( ',' UFI | EString )? '>:'
+;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// [ Qualified ] Identifier
+////////////////////////////////////////////////////////////////////////////////
+
+ ReservedWord
+: 'workflow' | 'sew'
+
+// Deprecated
+| DeprecatedReservedWord
+;
+
+terminal XIDENDIFIER
+: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'#')*
+;
+
+terminal AT_IDENTIFIER
+: '@' XIDENDIFIER
+;
+
+XID returns ecore::EString
+: ReservedWord | XIDENDIFIER
+;
+
+UFI returns ecore::EString
+: XID ( ( '::' | '.' ) XID )*
+;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Object Configuration Specification
+////////////////////////////////////////////////////////////////////////////////
+
+Object returns sew::WObject
+: {sew::WObject}
+	type=UFI  ( name=UFI )?  ( description=EString )?
+	'{'
+		( element+=( Object | Property ) )*
+	'}'
+
+| {sew::WObject}
+	name=UFI  ( ':=' | '+:=' )  ( type=UFI  ( description=EString )? )?
+	'{'
+		( element+=( Object | Property ) )*
+	'}'
+;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Property Specification
+////////////////////////////////////////////////////////////////////////////////
+
+Property returns sew::WProperty
+: Section
+| Attribute
+;
+
+
+Section returns sew::WSection
+: name=XID  ( description=EString )?
+	( '[' ( element+=( Object | Attribute ) )* ']'
+	
+	| ':' ( element+=( Object | Attribute ) )*
+	)
+;
+
+Attribute returns sew::WAttribute
+: {sew::WAttribute}
+	name=XID  '='  value=ValueSpecification  ( ';' )?
+;
+
+////////////////////////////////////////////////////////////////////////////////
+// Value Specification
+////////////////////////////////////////////////////////////////////////////////
+
+ValueSpecification returns sew::WValueSpecification
+: Expression
+;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Expression Specification
+////////////////////////////////////////////////////////////////////////////////
+
+Expression returns sew::WValueSpecification
+: conditionalExpression
+
+// Deprecated
+| DeprecatedExpression
+;
+
+
+conditionalExpression returns sew::WValueSpecification
+: conditionalOrExpression
+	( {expression::Expression.operand+=current}
+		operator='?' operand+=Expression ':' operand+=Expression
+	)?
+;
+
+conditionalOrExpression returns sew::WValueSpecification
+: conditionalAndExpression
+	( {expression::Expression.operand+=current}
+		operator=( '||' | 'or' ) operand+=conditionalAndExpression
+		( ( '||' | 'or' ) operand+=conditionalAndExpression )*
+	)?
+;
+
+conditionalAndExpression returns sew::WValueSpecification
+: equalityExpression
+	( {expression::Expression.operand+=current}
+		operator=( '&&' | 'and' ) operand+=equalityExpression
+		( ( '&&' | 'and' ) operand+=equalityExpression )*
+	)?
+;
+
+equalityExpression returns sew::WValueSpecification
+: relationalExpression
+	( {expression::Expression.operand+=current}
+		operator=( '==' | '!=' | '===' | '=!=' | '=/=' )
+		operand+=relationalExpression
+	)?
+;
+
+relationalExpression returns sew::WValueSpecification
+: additiveExpression
+	( {expression::Expression.operand+=current}
+		operator=( '<' | '<=' | '>' | '>=' )
+		operand+=additiveExpression
+	)?
+;
+
+additiveExpression returns sew::WValueSpecification
+: multiplicativeExpression
+	( ( {expression::Expression.operand+=current}
+		operator='+' operand+=multiplicativeExpression
+		( '+' operand+=multiplicativeExpression )* )
+
+//	| ( {expression::Expression.operand+=current}
+//		operator='-' operand+=multiplicativeExpression
+//		( '-' operand+=multiplicativeExpression )* )
+	)?
+;
+
+multiplicativeExpression returns sew::WValueSpecification
+: primaryExpression
+	( ( {expression::Expression.operand+=current}
+		operator='*' operand+=primaryExpression
+		( '*' operand+=primaryExpression )* )
+
+	| ( {expression::Expression.operand+=current}
+		operator='**' operand+=primaryExpression
+		( '**' operand+=primaryExpression )* )
+
+	| ( {expression::Expression.operand+=current}
+		operator='/' operand+=primaryExpression
+		( '/' operand+=primaryExpression )* )
+
+	| ( {expression::Expression.operand+=current}
+		operator='%' operand+=primaryExpression
+		( '%' operand+=primaryExpression )* )
+	)?
+;
+
+primaryExpression returns sew::WValueSpecification
+: '+' primaryExpression
+| { expression::Expression }( operator='-' operand+=primaryExpression )
+| { expression::Expression }( operator=( '!' | 'not' ) operand+=primaryExpression )
+| '(' Expression ')'
+| LiteralExpression
+;
+
+
+LiteralExpression returns sew::WValueSpecification
+: LiteralBooleanValue
+| LiteralCharacterValue
+| LiteralIntegerValue
+| LiteralRationalValue
+| LiteralFloatValue
+//| LiteralRealValue
+| LiteralStringValue
+| LiteralNullValue
+| LiteralArrayValue
+
+| LiteralObjectReference
+
+| LiteralVariableReference
+| LiteralInstanceReference
+;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Array of Literal Specification
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralArrayValue  returns expression::LiteralArrayValue
+: {expression::LiteralArrayValue}
+	'['
+		( values+=ValueSpecification
+			( ',' values+=ValueSpecification )*
+		)?
+	']'
+;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Literal Object Reference Specification
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralObjectReference returns expression::LiteralObjectReference
+: ( '&' )? ( object=[sew::WObject|UFI] | symbol=UFI )
+;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Literal Specification
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralBooleanValue  returns expression::LiteralBooleanValue
+: value=EBoolean
+;
+
+LiteralCharacterValue  returns expression::LiteralCharacterValue
+: value=EChar
+;
+
+LiteralIntegerValue  returns expression::LiteralIntegerValue
+: value=ELong
+;
+
+LiteralRationalValue  returns expression::LiteralRationalValue
+: numerator=ELong '/' denominator=ELong
+;
+
+LiteralFloatValue  returns expression::LiteralFloatValue
+: value=EDouble
+;
+
+LiteralRealValue  returns expression::LiteralRealValue
+: value=EBigDecimal
+;
+
+LiteralStringValue  returns expression::LiteralStringValue
+: value=EString
+;
+
+LiteralNullValue  returns expression::LiteralNullValue
+: {expression::LiteralNullValue}
+	'null' ( '<' type=XID '>' )?
+;
+
+LiteralVariableReference returns expression::LiteralReferenceValue
+: LiteralTimeVariable
+| LiteralTimeDeltaVariable
+;
+
+LiteralTimeVariable returns expression::LiteralTimeVariable
+	: {expression::LiteralTimeVariable} ( symbol='$time' )
+	;
+
+LiteralTimeDeltaVariable returns expression::LiteralTimeDeltaVariable
+	: {expression::LiteralTimeDeltaVariable} ( symbol='$delta' )
+	;
+
+
+LiteralInstanceReference returns expression::LiteralReferenceValue
+: LiteralThisInstance
+| LiteralSelfInstance
+
+| LiteralParentInstance
+| LiteralSuperInstance
+
+| LiteralSystemInstance
+
+| LiteralEnvInstance
+;
+
+LiteralThisInstance returns expression::LiteralThisInstance
+: {expression::LiteralThisInstance} ( symbol='$this' )
+;
+
+LiteralSelfInstance returns expression::LiteralSelfInstance
+: {expression::LiteralSelfInstance} ( symbol='$self' )
+;
+
+LiteralParentInstance returns expression::LiteralParentInstance
+: {expression::LiteralParentInstance} ( symbol='$parent' )
+;
+
+LiteralSuperInstance returns expression::LiteralSuperInstance
+: {expression::LiteralSuperInstance} ( symbol='$super' )
+;
+
+LiteralSystemInstance returns expression::LiteralSystemInstance
+: {expression::LiteralSystemInstance} ( symbol='$system' )
+;
+
+
+LiteralEnvInstance returns expression::LiteralEnvInstance
+: {expression::LiteralEnvInstance} symbol=( '$env' | 'env' )
+;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Terminal Rules
+////////////////////////////////////////////////////////////////////////////////
+
+EBoolean returns ecore::EBoolean
+: 'true'
+| 'false'
+;
+
+terminal CHARACTER
+: "'" . "'"
+;
+
+EChar returns ecore::EChar
+: CHARACTER
+;
+
+ELong returns ecore::ELong:
+	'-'? INT;
+
+EDouble returns ecore::EDouble
+: '-'? INT? '.' INT //(('E'|'e') '-'? INT)?
+;
+
+EBigDecimal returns ecore::EBigDecimal
+: INT? '.' INT
+;
+
+EString returns ecore::EString
+: STRING
+;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// @DEPRECATED Diversity Configuration Specification
+////////////////////////////////////////////////////////////////////////////////
+
+DeprecatedReservedWord
+: 'form'      | 'endform'
+| 'prototype' | 'endprototype'
+| 'section'   | 'endsection'
+;
+
+
+DeprecatedObject returns sew::WObject
+: {sew::WObject}
+	'form'
+		name=UFI  ( description=EString )?  'as'  ( '&' )?  type=UFI  'is'
+		( element+=DeprecatedProperty )*
+	'endform'
+
+| {sew::WObject}
+	'prototype'
+		name=UFI  ( description=EString )?  'as'  ( '&' )?  type=UFI  'is'
+		( element+=DeprecatedProperty )*
+	'endprototype'
+;
+
+
+DeprecatedProperty returns sew::WProperty
+: DeprecatedSection
+| DeprecatedAttribute
+;
+
+
+DeprecatedSection returns sew::WSection
+: {sew::WSection}
+	'section'  name=XID
+//		( element+=( Object | Attribute  ) )*
+		( element+=( DeprecatedAttribute | DeprecatedObject | Object ) )*
+	'endsection'  ( XID )?
+
+| name=XID  ( description=EString )?
+	( '[' ( element+=( DeprecatedAttribute | DeprecatedObject | Object ) )* ']'
+	
+	| ':' ( element+=( DeprecatedAttribute | DeprecatedObject | Object ) )*
+	)
+;
+
+
+DeprecatedAttribute returns sew::WAttribute
+: {sew::WAttribute}
+	name=DeprecatedAttributeID  '='  value=ValueSpecification  ( ';' )?
+;
+
+DeprecatedAttributeID
+: XID
+| AT_IDENTIFIER
+;
+
+
+DeprecatedExpression returns sew::WValueSpecification
+: {expression::Expression}
+	'${'
+		operator=( '|;|' | '|i|' )
+		( operand+=ValueSpecification )*
+	'}'
+;
+
+
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/SEWRuntimeModule.xtend b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/SEWRuntimeModule.xtend
new file mode 100644
index 0000000..532593e
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/SEWRuntimeModule.xtend
@@ -0,0 +1,26 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext
+
+import org.eclipse.xtext.conversion.IValueConverterService
+import org.eclipse.efm.sew.xtext.converter.AtIdentifierValueConverter
+
+/**
+ * Use this class to register components to be used at runtime / without the Equinox extension registry.
+ */
+class SEWRuntimeModule extends AbstractSEWRuntimeModule {
+
+    override public Class<? extends IValueConverterService> bindIValueConverterService() {
+        return AtIdentifierValueConverter;
+    }
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/SEWStandaloneSetup.xtend b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/SEWStandaloneSetup.xtend
new file mode 100644
index 0000000..0b07c29
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/SEWStandaloneSetup.xtend
@@ -0,0 +1,24 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext
+
+
+/**
+ * Initialization support for running Xtext languages without Equinox extension registry.
+ */
+class SEWStandaloneSetup extends SEWStandaloneSetupGenerated {
+
+	def static void doSetup() {
+		new SEWStandaloneSetup().createInjectorAndDoEMFRegistration()
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/converter/AtIdentifierValueConverter.java b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/converter/AtIdentifierValueConverter.java
new file mode 100644
index 0000000..33013bd
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/converter/AtIdentifierValueConverter.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+package org.eclipse.efm.sew.xtext.converter;
+
+import org.eclipse.xtext.common.services.Ecore2XtextTerminalConverters;
+import org.eclipse.xtext.conversion.IValueConverter;
+import org.eclipse.xtext.conversion.ValueConverter;
+import org.eclipse.xtext.conversion.impl.AbstractNullSafeConverter;
+import org.eclipse.xtext.nodemodel.INode;
+
+public class AtIdentifierValueConverter extends Ecore2XtextTerminalConverters {
+
+	@ValueConverter(rule = "AT_IDENTIFIER")
+	public IValueConverter<String> PROPERTY_ID() {
+		return new AbstractNullSafeConverter<String>() {
+			@Override
+			public String internalToValue(String string, INode  node)  {
+				if( string.charAt(0) == '@' ) {
+					return( string.substring(1) );
+				} else {
+					return( string );
+				}
+			}
+			@Override
+			public String internalToString(String value) {
+				if( (value != null) && (value.charAt(0) != '@') ) {
+					return( "@" + value );
+				} else {
+					return( value );
+				}
+			}
+		};
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/generator/SEWGenerator.xtend b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/generator/SEWGenerator.xtend
new file mode 100644
index 0000000..650ca3f
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/generator/SEWGenerator.xtend
@@ -0,0 +1,34 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.generator
+
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.generator.AbstractGenerator
+import org.eclipse.xtext.generator.IFileSystemAccess2
+import org.eclipse.xtext.generator.IGeneratorContext
+
+/**
+ * Generates code from your model files on save.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation
+ */
+class SEWGenerator extends AbstractGenerator {
+
+	override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
+//		fsa.generateFile('greetings.txt', 'People to greet: ' + 
+//			resource.allContents
+//				.filter(typeof(Greeting))
+//				.map[name]
+//				.join(', '))
+	}
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/scoping/SEWScopeProvider.xtend b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/scoping/SEWScopeProvider.xtend
new file mode 100644
index 0000000..c63b464
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/scoping/SEWScopeProvider.xtend
@@ -0,0 +1,64 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.scoping
+
+import org.eclipse.xtext.EcoreUtil2
+import org.eclipse.xtext.scoping.IScope
+import org.eclipse.efm.ecore.sew.WObject
+import org.eclipse.emf.ecore.EReference
+import org.eclipse.xtext.scoping.Scopes
+import org.eclipse.efm.ecore.sew.expression.LiteralObjectReference
+import org.eclipse.efm.ecore.sew.WSection
+
+/**
+ * This class contains custom scoping description.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
+ * on how and when to use it.
+ */
+class SEWScopeProvider extends AbstractSEWScopeProvider {
+
+	def scope_LiteralObject_object(LiteralObjectReference context, EReference r) {
+		val contextObject = EcoreUtil2.getContainerOfType(
+			context.eContainer, typeof(WObject) )
+
+		var parentScope = IScope::NULLSCOPE
+
+		for( object : contextObject.objectHierarchy.reverseView ) {
+			for( property : object.element.filter( typeof(WSection) )) {
+				parentScope = Scopes::scopeFor(
+					property.element.filter( typeof(WObject) ), parentScope)
+			}
+		}
+
+		parentScope
+	}
+
+
+	def objectHierarchy(WObject object) {
+		val hierarchy = <WObject>newArrayList()
+
+		var container = EcoreUtil2.getContainerOfType(
+			object.eContainer, typeof(WObject) )
+
+		while( container != null ) {
+			hierarchy.add( container )
+
+			container = EcoreUtil2.getContainerOfType(
+				container.eContainer, typeof(WObject) )
+		}
+
+		hierarchy
+	}
+
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/validation/SEWValidator.xtend b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/validation/SEWValidator.xtend
new file mode 100644
index 0000000..12c900f
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/src/org/eclipse/efm/sew/xtext/validation/SEWValidator.xtend
@@ -0,0 +1,34 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.sew.xtext.validation
+
+
+/**
+ * This class contains custom validation rules. 
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
+ */
+class SEWValidator extends AbstractSEWValidator {
+	
+//  public static val INVALID_NAME = 'invalidName'
+//
+//	@Check
+//	def checkGreetingStartsWithCapital(Greeting greeting) {
+//		if (!Character.isUpperCase(greeting.name.charAt(0))) {
+//			warning('Name should start with a capital', 
+//					SEWPackage.Literals.GREETING__NAME,
+//					INVALID_NAME)
+//		}
+//	}
+	
+}
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/.gitignore
new file mode 100644
index 0000000..f2c2c82
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/.gitignore
@@ -0,0 +1,4 @@
+*._trace
+*.xtendbin
+/SEWRuntimeModule.java
+/SEWStandaloneSetup.java
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/generator/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/generator/.gitignore
new file mode 100644
index 0000000..3bfe63d
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/generator/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/SEWGenerator.java
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/scoping/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/scoping/.gitignore
new file mode 100644
index 0000000..d9925c7
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/scoping/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/SEWScopeProvider.java
diff --git a/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/validation/.gitignore b/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/validation/.gitignore
new file mode 100644
index 0000000..1586a01
--- /dev/null
+++ b/editor/sew/org.eclipse.efm.sew.xtext/xtend-gen/org/eclipse/efm/sew/xtext/validation/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/SEWValidator.java
diff --git a/editor/sew/pom.xml b/editor/sew/pom.xml
new file mode 100644
index 0000000..180369d
--- /dev/null
+++ b/editor/sew/pom.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.modeling.editor.sew</artifactId>
+	<packaging>pom</packaging>
+	<name>org.eclipse.efm-modeling Workflow Editor</name>
+	<description>This module contains the different plugins relative to the XText Editor for efm-modeling-workflow.</description>
+
+	<modules>
+		<module>org.eclipse.efm.sew.ecore</module>
+		<module>org.eclipse.efm.sew.xtext</module>
+		<module>org.eclipse.efm.sew.xtext.ide</module>
+		<module>org.eclipse.efm.sew.xtext.tests</module>
+		<module>org.eclipse.efm.sew.xtext.ui</module>
+		<module>org.eclipse.efm.sew.xtext.ui.tests</module>
+	</modules>
+</project>
diff --git a/editor/transition/.gitignore b/editor/transition/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/transition/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/transition/.project b/editor/transition/.project
new file mode 100644
index 0000000..de29d2e
--- /dev/null
+++ b/editor/transition/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.modeling.editor.transition</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/transition/.settings/org.eclipse.core.resources.prefs b/editor/transition/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/transition/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/transition/.settings/org.eclipse.m2e.core.prefs b/editor/transition/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/transition/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/transition/README.md b/editor/transition/README.md
new file mode 100644
index 0000000..96c86ba
--- /dev/null
+++ b/editor/transition/README.md
@@ -0,0 +1 @@
+# Eclipse Formal Modeling [UML] Transition Xtext's based Editor
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.classpath b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.project b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.project
new file mode 100644
index 0000000..c4a9243
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.papyrus.xtext.transition.ide</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.settings/org.eclipse.core.resources.prefs b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.settings/org.eclipse.jdt.core.prefs b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.settings/org.eclipse.m2e.core.prefs b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/META-INF/MANIFEST.MF b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5c000a3
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.papyrus.xtext.transition.ide; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.papyrus.xtext.transition,
+ org.eclipse.xtext.ide,
+ org.eclipse.xtext.xbase.ide
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr,
+ org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr.internal
+
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/build.properties b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/build.properties
new file mode 100644
index 0000000..db8fe81
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/pom.xml b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/pom.xml
new file mode 100644
index 0000000..ad4ab4a
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.transition</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.papyrus.xtext.transition.ide</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.papyrus.xtext.transition.ide</name>
+	<description>This plug-in contains the UML/Transition' Xtext based editor IDE.</description>
+
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/PartialTransitionContentAssistParser.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/PartialTransitionContentAssistParser.java
new file mode 100644
index 0000000..92fab3e
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/PartialTransitionContentAssistParser.java
@@ -0,0 +1,43 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr;
+
+import java.util.Collection;
+import java.util.Collections;
+import org.eclipse.xtext.AbstractRule;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.util.PolymorphicDispatcher;
+
+public class PartialTransitionContentAssistParser extends TransitionParser implements IPartialEditingContentAssistParser {
+
+	private AbstractRule rule;
+
+	@Override
+	public void initializeFor(AbstractRule rule) {
+		this.rule = rule;
+	}
+
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		if (rule == null || rule.eIsProxy())
+			return Collections.emptyList();
+		String methodName = "entryRule" + rule.getName();
+		PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
+			new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
+		dispatcher.invoke();
+		return parser.getFollowElements();
+	}
+
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/TransitionParser.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/TransitionParser.java
new file mode 100644
index 0000000..aac026d
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/TransitionParser.java
@@ -0,0 +1,100 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr;
+
+import com.google.inject.Inject;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.antlr.runtime.RecognitionException;
+import org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr.internal.InternalTransitionParser;
+import org.eclipse.efm.papyrus.xtext.services.TransitionGrammarAccess;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+
+public class TransitionParser extends AbstractContentAssistParser {
+
+	@Inject
+	private TransitionGrammarAccess grammarAccess;
+
+	private Map<AbstractElement, String> nameMappings;
+
+	@Override
+	protected InternalTransitionParser createParser() {
+		InternalTransitionParser result = new InternalTransitionParser(null);
+		result.setGrammarAccess(grammarAccess);
+		return result;
+	}
+
+	@Override
+	protected String getRuleName(AbstractElement element) {
+		if (nameMappings == null) {
+			nameMappings = new HashMap<AbstractElement, String>() {
+				private static final long serialVersionUID = 1L;
+				{
+					put(grammarAccess.getFQNAccess().getAlternatives_1_0(), "rule__FQN__Alternatives_1_0");
+					put(grammarAccess.getTransitionRuleAccess().getGroup(), "rule__TransitionRule__Group__0");
+					put(grammarAccess.getTransitionRuleAccess().getGroup_0(), "rule__TransitionRule__Group_0__0");
+					put(grammarAccess.getTransitionRuleAccess().getGroup_0_1(), "rule__TransitionRule__Group_0_1__0");
+					put(grammarAccess.getTransitionRuleAccess().getGroup_3(), "rule__TransitionRule__Group_3__0");
+					put(grammarAccess.getFQNAccess().getGroup(), "rule__FQN__Group__0");
+					put(grammarAccess.getFQNAccess().getGroup_1(), "rule__FQN__Group_1__0");
+					put(grammarAccess.getTriggerRuleAccess().getGroup(), "rule__TriggerRule__Group__0");
+					put(grammarAccess.getReceiveSignalEventRuleAccess().getGroup(), "rule__ReceiveSignalEventRule__Group__0");
+					put(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2(), "rule__ReceiveSignalEventRule__Group_2__0");
+					put(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2_1(), "rule__ReceiveSignalEventRule__Group_2_1__0");
+					put(grammarAccess.getGuardRuleAccess().getGroup(), "rule__GuardRule__Group__0");
+					put(grammarAccess.getTGuardRuleAccess().getGroup(), "rule__TGuardRule__Group__0");
+					put(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_0(), "rule__TransitionRule__TriggersAssignment_0_0");
+					put(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_1_1(), "rule__TransitionRule__TriggersAssignment_0_1_1");
+					put(grammarAccess.getTransitionRuleAccess().getGuardAssignment_1(), "rule__TransitionRule__GuardAssignment_1");
+					put(grammarAccess.getTransitionRuleAccess().getTguardAssignment_2(), "rule__TransitionRule__TguardAssignment_2");
+					put(grammarAccess.getTransitionRuleAccess().getEffectBodyAssignment_3_1(), "rule__TransitionRule__EffectBodyAssignment_3_1");
+					put(grammarAccess.getTriggerRuleAccess().getPortAssignment_1(), "rule__TriggerRule__PortAssignment_1");
+					put(grammarAccess.getTriggerRuleAccess().getEventAssignment_2(), "rule__TriggerRule__EventAssignment_2");
+					put(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_0(), "rule__ReceiveSignalEventRule__ParametersAssignment_2_0");
+					put(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_1_1(), "rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1");
+					put(grammarAccess.getGuardRuleAccess().getConstraintAssignment_1(), "rule__GuardRule__ConstraintAssignment_1");
+					put(grammarAccess.getTGuardRuleAccess().getConstraintAssignment_1(), "rule__TGuardRule__ConstraintAssignment_1");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		try {
+			InternalTransitionParser typedParser = (InternalTransitionParser) parser;
+			typedParser.entryRuleTransitionRule();
+			return typedParser.getFollowElements();
+		} catch(RecognitionException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
+	@Override
+	protected String[] getInitialHiddenTokens() {
+		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
+	}
+
+	public TransitionGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(TransitionGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransition.g b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransition.g
new file mode 100644
index 0000000..3e16444
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransition.g
@@ -0,0 +1,1283 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+grammar InternalTransition;
+
+options {
+	superClass=AbstractInternalContentAssistParser;
+}
+
+@lexer::header {
+package org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+}
+
+@parser::header {
+package org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.efm.papyrus.xtext.services.TransitionGrammarAccess;
+
+}
+@parser::members {
+	private TransitionGrammarAccess grammarAccess;
+
+	public void setGrammarAccess(TransitionGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+
+	@Override
+	protected Grammar getGrammar() {
+		return grammarAccess.getGrammar();
+	}
+
+	@Override
+	protected String getValueForTokenName(String tokenName) {
+		return tokenName;
+	}
+}
+
+// Entry rule entryRuleTransitionRule
+entryRuleTransitionRule
+:
+{ before(grammarAccess.getTransitionRuleRule()); }
+	 ruleTransitionRule
+{ after(grammarAccess.getTransitionRuleRule()); } 
+	 EOF 
+;
+
+// Rule TransitionRule
+ruleTransitionRule 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionRuleAccess().getGroup()); }
+		(rule__TransitionRule__Group__0)
+		{ after(grammarAccess.getTransitionRuleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleFQN
+entryRuleFQN
+:
+{ before(grammarAccess.getFQNRule()); }
+	 ruleFQN
+{ after(grammarAccess.getFQNRule()); } 
+	 EOF 
+;
+
+// Rule FQN
+ruleFQN 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getFQNAccess().getGroup()); }
+		(rule__FQN__Group__0)
+		{ after(grammarAccess.getFQNAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTriggerRule
+entryRuleTriggerRule
+:
+{ before(grammarAccess.getTriggerRuleRule()); }
+	 ruleTriggerRule
+{ after(grammarAccess.getTriggerRuleRule()); } 
+	 EOF 
+;
+
+// Rule TriggerRule
+ruleTriggerRule 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTriggerRuleAccess().getGroup()); }
+		(rule__TriggerRule__Group__0)
+		{ after(grammarAccess.getTriggerRuleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEventRule
+entryRuleEventRule
+:
+{ before(grammarAccess.getEventRuleRule()); }
+	 ruleEventRule
+{ after(grammarAccess.getEventRuleRule()); } 
+	 EOF 
+;
+
+// Rule EventRule
+ruleEventRule 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEventRuleAccess().getReceiveSignalEventRuleParserRuleCall()); }
+		ruleReceiveSignalEventRule
+		{ after(grammarAccess.getEventRuleAccess().getReceiveSignalEventRuleParserRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleReceiveSignalEventRule
+entryRuleReceiveSignalEventRule
+:
+{ before(grammarAccess.getReceiveSignalEventRuleRule()); }
+	 ruleReceiveSignalEventRule
+{ after(grammarAccess.getReceiveSignalEventRuleRule()); } 
+	 EOF 
+;
+
+// Rule ReceiveSignalEventRule
+ruleReceiveSignalEventRule 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getReceiveSignalEventRuleAccess().getGroup()); }
+		(rule__ReceiveSignalEventRule__Group__0)
+		{ after(grammarAccess.getReceiveSignalEventRuleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleGuardRule
+entryRuleGuardRule
+:
+{ before(grammarAccess.getGuardRuleRule()); }
+	 ruleGuardRule
+{ after(grammarAccess.getGuardRuleRule()); } 
+	 EOF 
+;
+
+// Rule GuardRule
+ruleGuardRule 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getGuardRuleAccess().getGroup()); }
+		(rule__GuardRule__Group__0)
+		{ after(grammarAccess.getGuardRuleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTGuardRule
+entryRuleTGuardRule
+:
+{ before(grammarAccess.getTGuardRuleRule()); }
+	 ruleTGuardRule
+{ after(grammarAccess.getTGuardRuleRule()); } 
+	 EOF 
+;
+
+// Rule TGuardRule
+ruleTGuardRule 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTGuardRuleAccess().getGroup()); }
+		(rule__TGuardRule__Group__0)
+		{ after(grammarAccess.getTGuardRuleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FQN__Alternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFQNAccess().getFullStopKeyword_1_0_0()); }
+		'.'
+		{ after(grammarAccess.getFQNAccess().getFullStopKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getFQNAccess().getColonColonKeyword_1_0_1()); }
+		'::'
+		{ after(grammarAccess.getFQNAccess().getColonColonKeyword_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group__0__Impl
+	rule__TransitionRule__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getGroup_0()); }
+	(rule__TransitionRule__Group_0__0)?
+	{ after(grammarAccess.getTransitionRuleAccess().getGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group__1__Impl
+	rule__TransitionRule__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getGuardAssignment_1()); }
+	(rule__TransitionRule__GuardAssignment_1)?
+	{ after(grammarAccess.getTransitionRuleAccess().getGuardAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group__2__Impl
+	rule__TransitionRule__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getTguardAssignment_2()); }
+	(rule__TransitionRule__TguardAssignment_2)?
+	{ after(grammarAccess.getTransitionRuleAccess().getTguardAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getGroup_3()); }
+	(rule__TransitionRule__Group_3__0)?
+	{ after(grammarAccess.getTransitionRuleAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionRule__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group_0__0__Impl
+	rule__TransitionRule__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_0()); }
+	(rule__TransitionRule__TriggersAssignment_0_0)
+	{ after(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getGroup_0_1()); }
+	(rule__TransitionRule__Group_0_1__0)*
+	{ after(grammarAccess.getTransitionRuleAccess().getGroup_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionRule__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group_0_1__0__Impl
+	rule__TransitionRule__Group_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getCommaKeyword_0_1_0()); }
+	','
+	{ after(grammarAccess.getTransitionRuleAccess().getCommaKeyword_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_1_1()); }
+	(rule__TransitionRule__TriggersAssignment_0_1_1)
+	{ after(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionRule__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group_3__0__Impl
+	rule__TransitionRule__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getSolidusKeyword_3_0()); }
+	'/'
+	{ after(grammarAccess.getTransitionRuleAccess().getSolidusKeyword_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionRule__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionRuleAccess().getEffectBodyAssignment_3_1()); }
+	(rule__TransitionRule__EffectBodyAssignment_3_1)
+	{ after(grammarAccess.getTransitionRuleAccess().getEffectBodyAssignment_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FQN__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FQN__Group__0__Impl
+	rule__FQN__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FQN__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFQNAccess().getIDTerminalRuleCall_0()); }
+	RULE_ID
+	{ after(grammarAccess.getFQNAccess().getIDTerminalRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FQN__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FQN__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FQN__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFQNAccess().getGroup_1()); }
+	(rule__FQN__Group_1__0)*
+	{ after(grammarAccess.getFQNAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FQN__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FQN__Group_1__0__Impl
+	rule__FQN__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FQN__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFQNAccess().getAlternatives_1_0()); }
+	(rule__FQN__Alternatives_1_0)
+	{ after(grammarAccess.getFQNAccess().getAlternatives_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FQN__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FQN__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FQN__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFQNAccess().getIDTerminalRuleCall_1_1()); }
+	RULE_ID
+	{ after(grammarAccess.getFQNAccess().getIDTerminalRuleCall_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TriggerRule__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TriggerRule__Group__0__Impl
+	rule__TriggerRule__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TriggerRule__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTriggerRuleAccess().getInputKeyword_0()); }
+	'input'
+	{ after(grammarAccess.getTriggerRuleAccess().getInputKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TriggerRule__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TriggerRule__Group__1__Impl
+	rule__TriggerRule__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TriggerRule__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTriggerRuleAccess().getPortAssignment_1()); }
+	(rule__TriggerRule__PortAssignment_1)
+	{ after(grammarAccess.getTriggerRuleAccess().getPortAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TriggerRule__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TriggerRule__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TriggerRule__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTriggerRuleAccess().getEventAssignment_2()); }
+	(rule__TriggerRule__EventAssignment_2)?
+	{ after(grammarAccess.getTriggerRuleAccess().getEventAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ReceiveSignalEventRule__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ReceiveSignalEventRule__Group__0__Impl
+	rule__ReceiveSignalEventRule__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getReceiveSignalEventRuleAccess().getReceiveSignalEventRuleAction_0()); }
+	()
+	{ after(grammarAccess.getReceiveSignalEventRuleAccess().getReceiveSignalEventRuleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ReceiveSignalEventRule__Group__1__Impl
+	rule__ReceiveSignalEventRule__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getReceiveSignalEventRuleAccess().getLeftParenthesisKeyword_1()); }
+	'('
+	{ after(grammarAccess.getReceiveSignalEventRuleAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ReceiveSignalEventRule__Group__2__Impl
+	rule__ReceiveSignalEventRule__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2()); }
+	(rule__ReceiveSignalEventRule__Group_2__0)?
+	{ after(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ReceiveSignalEventRule__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getReceiveSignalEventRuleAccess().getRightParenthesisKeyword_3()); }
+	')'
+	{ after(grammarAccess.getReceiveSignalEventRuleAccess().getRightParenthesisKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ReceiveSignalEventRule__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ReceiveSignalEventRule__Group_2__0__Impl
+	rule__ReceiveSignalEventRule__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_0()); }
+	(rule__ReceiveSignalEventRule__ParametersAssignment_2_0)
+	{ after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ReceiveSignalEventRule__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2_1()); }
+	(rule__ReceiveSignalEventRule__Group_2_1__0)*
+	{ after(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ReceiveSignalEventRule__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ReceiveSignalEventRule__Group_2_1__0__Impl
+	rule__ReceiveSignalEventRule__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getReceiveSignalEventRuleAccess().getCommaKeyword_2_1_0()); }
+	','
+	{ after(grammarAccess.getReceiveSignalEventRuleAccess().getCommaKeyword_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ReceiveSignalEventRule__Group_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_1_1()); }
+	(rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1)
+	{ after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__GuardRule__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GuardRule__Group__0__Impl
+	rule__GuardRule__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardRule__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGuardRuleAccess().getLeftSquareBracketKeyword_0()); }
+	'['
+	{ after(grammarAccess.getGuardRuleAccess().getLeftSquareBracketKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardRule__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GuardRule__Group__1__Impl
+	rule__GuardRule__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardRule__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGuardRuleAccess().getConstraintAssignment_1()); }
+	(rule__GuardRule__ConstraintAssignment_1)
+	{ after(grammarAccess.getGuardRuleAccess().getConstraintAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardRule__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GuardRule__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardRule__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGuardRuleAccess().getRightSquareBracketKeyword_2()); }
+	']'
+	{ after(grammarAccess.getGuardRuleAccess().getRightSquareBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TGuardRule__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TGuardRule__Group__0__Impl
+	rule__TGuardRule__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TGuardRule__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTGuardRuleAccess().getLeftCurlyBracketKeyword_0()); }
+	'{'
+	{ after(grammarAccess.getTGuardRuleAccess().getLeftCurlyBracketKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TGuardRule__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TGuardRule__Group__1__Impl
+	rule__TGuardRule__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TGuardRule__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTGuardRuleAccess().getConstraintAssignment_1()); }
+	(rule__TGuardRule__ConstraintAssignment_1)
+	{ after(grammarAccess.getTGuardRuleAccess().getConstraintAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TGuardRule__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TGuardRule__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TGuardRule__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTGuardRuleAccess().getRightCurlyBracketKeyword_2()); }
+	'}'
+	{ after(grammarAccess.getTGuardRuleAccess().getRightCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionRule__TriggersAssignment_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_0_0()); }
+		ruleTriggerRule
+		{ after(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__TriggersAssignment_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_1_1_0()); }
+		ruleTriggerRule
+		{ after(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__GuardAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionRuleAccess().getGuardGuardRuleParserRuleCall_1_0()); }
+		ruleGuardRule
+		{ after(grammarAccess.getTransitionRuleAccess().getGuardGuardRuleParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__TguardAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionRuleAccess().getTguardTGuardRuleParserRuleCall_2_0()); }
+		ruleTGuardRule
+		{ after(grammarAccess.getTransitionRuleAccess().getTguardTGuardRuleParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionRule__EffectBodyAssignment_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionRuleAccess().getEffectBodySTRINGTerminalRuleCall_3_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getTransitionRuleAccess().getEffectBodySTRINGTerminalRuleCall_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TriggerRule__PortAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTriggerRuleAccess().getPortNamedElementCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getTriggerRuleAccess().getPortNamedElementFQNParserRuleCall_1_0_1()); }
+			ruleFQN
+			{ after(grammarAccess.getTriggerRuleAccess().getPortNamedElementFQNParserRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getTriggerRuleAccess().getPortNamedElementCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TriggerRule__EventAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTriggerRuleAccess().getEventEventRuleParserRuleCall_2_0()); }
+		ruleEventRule
+		{ after(grammarAccess.getTriggerRuleAccess().getEventEventRuleParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__ParametersAssignment_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_0_0()); }
+		(
+			{ before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyFQNParserRuleCall_2_0_0_1()); }
+			ruleFQN
+			{ after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyFQNParserRuleCall_2_0_0_1()); }
+		)
+		{ after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_1_1_0()); }
+		(
+			{ before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyFQNParserRuleCall_2_1_1_0_1()); }
+			ruleFQN
+			{ after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyFQNParserRuleCall_2_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardRule__ConstraintAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TGuardRule__ConstraintAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getTGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
+
+RULE_INT : ('0'..'9')+;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransition.tokens b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransition.tokens
new file mode 100644
index 0000000..6488c15
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransition.tokens
@@ -0,0 +1,29 @@
+'('=16
+')'=17
+','=13
+'.'=11
+'/'=14
+'::'=12
+'['=18
+']'=19
+'input'=15
+'{'=20
+'}'=21
+RULE_ANY_OTHER=10
+RULE_ID=4
+RULE_INT=6
+RULE_ML_COMMENT=7
+RULE_SL_COMMENT=8
+RULE_STRING=5
+RULE_WS=9
+T__11=11
+T__12=12
+T__13=13
+T__14=14
+T__15=15
+T__16=16
+T__17=17
+T__18=18
+T__19=19
+T__20=20
+T__21=21
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransitionLexer.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransitionLexer.java
new file mode 100644
index 0000000..8cf31be
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransitionLexer.java
@@ -0,0 +1,1080 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalTransitionLexer extends Lexer {
+    public static final int RULE_STRING=5;
+    public static final int RULE_SL_COMMENT=8;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__11=11;
+    public static final int T__12=12;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int EOF=-1;
+    public static final int RULE_ID=4;
+    public static final int RULE_WS=9;
+    public static final int RULE_ANY_OTHER=10;
+    public static final int RULE_INT=6;
+    public static final int RULE_ML_COMMENT=7;
+    public static final int T__20=20;
+    public static final int T__21=21;
+
+    // delegates
+    // delegators
+
+    public InternalTransitionLexer() {;} 
+    public InternalTransitionLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalTransitionLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "InternalTransition.g"; }
+
+    // $ANTLR start "T__11"
+    public final void mT__11() throws RecognitionException {
+        try {
+            int _type = T__11;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:11:7: ( '.' )
+            // InternalTransition.g:11:9: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__11"
+
+    // $ANTLR start "T__12"
+    public final void mT__12() throws RecognitionException {
+        try {
+            int _type = T__12;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:12:7: ( '::' )
+            // InternalTransition.g:12:9: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__12"
+
+    // $ANTLR start "T__13"
+    public final void mT__13() throws RecognitionException {
+        try {
+            int _type = T__13;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:13:7: ( ',' )
+            // InternalTransition.g:13:9: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__13"
+
+    // $ANTLR start "T__14"
+    public final void mT__14() throws RecognitionException {
+        try {
+            int _type = T__14;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:14:7: ( '/' )
+            // InternalTransition.g:14:9: '/'
+            {
+            match('/'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__14"
+
+    // $ANTLR start "T__15"
+    public final void mT__15() throws RecognitionException {
+        try {
+            int _type = T__15;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:15:7: ( 'input' )
+            // InternalTransition.g:15:9: 'input'
+            {
+            match("input"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__15"
+
+    // $ANTLR start "T__16"
+    public final void mT__16() throws RecognitionException {
+        try {
+            int _type = T__16;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:16:7: ( '(' )
+            // InternalTransition.g:16:9: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__16"
+
+    // $ANTLR start "T__17"
+    public final void mT__17() throws RecognitionException {
+        try {
+            int _type = T__17;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:17:7: ( ')' )
+            // InternalTransition.g:17:9: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__17"
+
+    // $ANTLR start "T__18"
+    public final void mT__18() throws RecognitionException {
+        try {
+            int _type = T__18;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:18:7: ( '[' )
+            // InternalTransition.g:18:9: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__18"
+
+    // $ANTLR start "T__19"
+    public final void mT__19() throws RecognitionException {
+        try {
+            int _type = T__19;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:19:7: ( ']' )
+            // InternalTransition.g:19:9: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__19"
+
+    // $ANTLR start "T__20"
+    public final void mT__20() throws RecognitionException {
+        try {
+            int _type = T__20;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:20:7: ( '{' )
+            // InternalTransition.g:20:9: '{'
+            {
+            match('{'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__20"
+
+    // $ANTLR start "T__21"
+    public final void mT__21() throws RecognitionException {
+        try {
+            int _type = T__21;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:21:7: ( '}' )
+            // InternalTransition.g:21:9: '}'
+            {
+            match('}'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__21"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:1271:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* )
+            // InternalTransition.g:1271:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            {
+            // InternalTransition.g:1271:11: ( '^' )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0=='^') ) {
+                alt1=1;
+            }
+            switch (alt1) {
+                case 1 :
+                    // InternalTransition.g:1271:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalTransition.g:1271:40: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( ((LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='Z')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='z')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // InternalTransition.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:1273:10: ( ( '0' .. '9' )+ )
+            // InternalTransition.g:1273:12: ( '0' .. '9' )+
+            {
+            // InternalTransition.g:1273:12: ( '0' .. '9' )+
+            int cnt3=0;
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( ((LA3_0>='0' && LA3_0<='9')) ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+            	case 1 :
+            	    // InternalTransition.g:1273:13: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt3 >= 1 ) break loop3;
+                        EarlyExitException eee =
+                            new EarlyExitException(3, input);
+                        throw eee;
+                }
+                cnt3++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:1275:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
+            // InternalTransition.g:1275:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            {
+            // InternalTransition.g:1275:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0=='\"') ) {
+                alt6=1;
+            }
+            else if ( (LA6_0=='\'') ) {
+                alt6=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 6, 0, input);
+
+                throw nvae;
+            }
+            switch (alt6) {
+                case 1 :
+                    // InternalTransition.g:1275:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+                    {
+                    match('\"'); 
+                    // InternalTransition.g:1275:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop4:
+                    do {
+                        int alt4=3;
+                        int LA4_0 = input.LA(1);
+
+                        if ( (LA4_0=='\\') ) {
+                            alt4=1;
+                        }
+                        else if ( ((LA4_0>='\u0000' && LA4_0<='!')||(LA4_0>='#' && LA4_0<='[')||(LA4_0>=']' && LA4_0<='\uFFFF')) ) {
+                            alt4=2;
+                        }
+
+
+                        switch (alt4) {
+                    	case 1 :
+                    	    // InternalTransition.g:1275:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalTransition.g:1275:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop4;
+                        }
+                    } while (true);
+
+                    match('\"'); 
+
+                    }
+                    break;
+                case 2 :
+                    // InternalTransition.g:1275:48: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+                    {
+                    match('\''); 
+                    // InternalTransition.g:1275:53: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop5:
+                    do {
+                        int alt5=3;
+                        int LA5_0 = input.LA(1);
+
+                        if ( (LA5_0=='\\') ) {
+                            alt5=1;
+                        }
+                        else if ( ((LA5_0>='\u0000' && LA5_0<='&')||(LA5_0>='(' && LA5_0<='[')||(LA5_0>=']' && LA5_0<='\uFFFF')) ) {
+                            alt5=2;
+                        }
+
+
+                        switch (alt5) {
+                    	case 1 :
+                    	    // InternalTransition.g:1275:54: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalTransition.g:1275:61: ~ ( ( '\\\\' | '\\'' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop5;
+                        }
+                    } while (true);
+
+                    match('\''); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_STRING"
+
+    // $ANTLR start "RULE_ML_COMMENT"
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:1277:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalTransition.g:1277:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // InternalTransition.g:1277:24: ( options {greedy=false; } : . )*
+            loop7:
+            do {
+                int alt7=2;
+                int LA7_0 = input.LA(1);
+
+                if ( (LA7_0=='*') ) {
+                    int LA7_1 = input.LA(2);
+
+                    if ( (LA7_1=='/') ) {
+                        alt7=2;
+                    }
+                    else if ( ((LA7_1>='\u0000' && LA7_1<='.')||(LA7_1>='0' && LA7_1<='\uFFFF')) ) {
+                        alt7=1;
+                    }
+
+
+                }
+                else if ( ((LA7_0>='\u0000' && LA7_0<=')')||(LA7_0>='+' && LA7_0<='\uFFFF')) ) {
+                    alt7=1;
+                }
+
+
+                switch (alt7) {
+            	case 1 :
+            	    // InternalTransition.g:1277:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop7;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ML_COMMENT"
+
+    // $ANTLR start "RULE_SL_COMMENT"
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:1279:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalTransition.g:1279:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // InternalTransition.g:1279:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( ((LA8_0>='\u0000' && LA8_0<='\t')||(LA8_0>='\u000B' && LA8_0<='\f')||(LA8_0>='\u000E' && LA8_0<='\uFFFF')) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // InternalTransition.g:1279:24: ~ ( ( '\\n' | '\\r' ) )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            // InternalTransition.g:1279:40: ( ( '\\r' )? '\\n' )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0=='\n'||LA10_0=='\r') ) {
+                alt10=1;
+            }
+            switch (alt10) {
+                case 1 :
+                    // InternalTransition.g:1279:41: ( '\\r' )? '\\n'
+                    {
+                    // InternalTransition.g:1279:41: ( '\\r' )?
+                    int alt9=2;
+                    int LA9_0 = input.LA(1);
+
+                    if ( (LA9_0=='\r') ) {
+                        alt9=1;
+                    }
+                    switch (alt9) {
+                        case 1 :
+                            // InternalTransition.g:1279:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_SL_COMMENT"
+
+    // $ANTLR start "RULE_WS"
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:1281:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalTransition.g:1281:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // InternalTransition.g:1281:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt11=0;
+            loop11:
+            do {
+                int alt11=2;
+                int LA11_0 = input.LA(1);
+
+                if ( ((LA11_0>='\t' && LA11_0<='\n')||LA11_0=='\r'||LA11_0==' ') ) {
+                    alt11=1;
+                }
+
+
+                switch (alt11) {
+            	case 1 :
+            	    // InternalTransition.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt11 >= 1 ) break loop11;
+                        EarlyExitException eee =
+                            new EarlyExitException(11, input);
+                        throw eee;
+                }
+                cnt11++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_WS"
+
+    // $ANTLR start "RULE_ANY_OTHER"
+    public final void mRULE_ANY_OTHER() throws RecognitionException {
+        try {
+            int _type = RULE_ANY_OTHER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:1283:16: ( . )
+            // InternalTransition.g:1283:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // InternalTransition.g:1:8: ( T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt12=18;
+        alt12 = dfa12.predict(input);
+        switch (alt12) {
+            case 1 :
+                // InternalTransition.g:1:10: T__11
+                {
+                mT__11(); 
+
+                }
+                break;
+            case 2 :
+                // InternalTransition.g:1:16: T__12
+                {
+                mT__12(); 
+
+                }
+                break;
+            case 3 :
+                // InternalTransition.g:1:22: T__13
+                {
+                mT__13(); 
+
+                }
+                break;
+            case 4 :
+                // InternalTransition.g:1:28: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 5 :
+                // InternalTransition.g:1:34: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 6 :
+                // InternalTransition.g:1:40: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 7 :
+                // InternalTransition.g:1:46: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 8 :
+                // InternalTransition.g:1:52: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 9 :
+                // InternalTransition.g:1:58: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 10 :
+                // InternalTransition.g:1:64: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 11 :
+                // InternalTransition.g:1:70: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 12 :
+                // InternalTransition.g:1:76: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 13 :
+                // InternalTransition.g:1:84: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 14 :
+                // InternalTransition.g:1:93: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 15 :
+                // InternalTransition.g:1:105: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 16 :
+                // InternalTransition.g:1:121: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 17 :
+                // InternalTransition.g:1:137: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 18 :
+                // InternalTransition.g:1:145: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA12 dfa12 = new DFA12(this);
+    static final String DFA12_eotS =
+        "\2\uffff\1\22\1\uffff\1\30\1\32\6\uffff\1\22\2\uffff\2\22\10\uffff\1\32\12\uffff\2\32\1\47\1\uffff";
+    static final String DFA12_eofS =
+        "\50\uffff";
+    static final String DFA12_minS =
+        "\1\0\1\uffff\1\72\1\uffff\1\52\1\156\6\uffff\1\101\2\uffff\2\0\10\uffff\1\160\12\uffff\1\165\1\164\1\60\1\uffff";
+    static final String DFA12_maxS =
+        "\1\uffff\1\uffff\1\72\1\uffff\1\57\1\156\6\uffff\1\172\2\uffff\2\uffff\10\uffff\1\160\12\uffff\1\165\1\164\1\172\1\uffff";
+    static final String DFA12_acceptS =
+        "\1\uffff\1\1\1\uffff\1\3\2\uffff\1\6\1\7\1\10\1\11\1\12\1\13\1\uffff\1\14\1\15\2\uffff\1\21\1\22\1\1\1\2\1\3\1\17\1\20\1\4\1\uffff\1\14\1\6\1\7\1\10\1\11\1\12\1\13\1\15\1\16\1\21\3\uffff\1\5";
+    static final String DFA12_specialS =
+        "\1\1\16\uffff\1\0\1\2\27\uffff}>";
+    static final String[] DFA12_transitionS = {
+            "\11\22\2\21\2\22\1\21\22\22\1\21\1\22\1\17\4\22\1\20\1\6\1\7\2\22\1\3\1\22\1\1\1\4\12\16\1\2\6\22\32\15\1\10\1\22\1\11\1\14\1\15\1\22\10\15\1\5\21\15\1\12\1\22\1\13\uff82\22",
+            "",
+            "\1\24",
+            "",
+            "\1\26\4\uffff\1\27",
+            "\1\31",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\32\32\4\uffff\1\32\1\uffff\32\32",
+            "",
+            "",
+            "\0\42",
+            "\0\42",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\44",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\45",
+            "\1\46",
+            "\12\32\7\uffff\32\32\4\uffff\1\32\1\uffff\32\32",
+            ""
+    };
+
+    static final short[] DFA12_eot = DFA.unpackEncodedString(DFA12_eotS);
+    static final short[] DFA12_eof = DFA.unpackEncodedString(DFA12_eofS);
+    static final char[] DFA12_min = DFA.unpackEncodedStringToUnsignedChars(DFA12_minS);
+    static final char[] DFA12_max = DFA.unpackEncodedStringToUnsignedChars(DFA12_maxS);
+    static final short[] DFA12_accept = DFA.unpackEncodedString(DFA12_acceptS);
+    static final short[] DFA12_special = DFA.unpackEncodedString(DFA12_specialS);
+    static final short[][] DFA12_transition;
+
+    static {
+        int numStates = DFA12_transitionS.length;
+        DFA12_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA12_transition[i] = DFA.unpackEncodedString(DFA12_transitionS[i]);
+        }
+    }
+
+    class DFA12 extends DFA {
+
+        public DFA12(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 12;
+            this.eot = DFA12_eot;
+            this.eof = DFA12_eof;
+            this.min = DFA12_min;
+            this.max = DFA12_max;
+            this.accept = DFA12_accept;
+            this.special = DFA12_special;
+            this.transition = DFA12_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            IntStream input = _input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA12_15 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA12_15>='\u0000' && LA12_15<='\uFFFF')) ) {s = 34;}
+
+                        else s = 18;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA12_0 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA12_0=='.') ) {s = 1;}
+
+                        else if ( (LA12_0==':') ) {s = 2;}
+
+                        else if ( (LA12_0==',') ) {s = 3;}
+
+                        else if ( (LA12_0=='/') ) {s = 4;}
+
+                        else if ( (LA12_0=='i') ) {s = 5;}
+
+                        else if ( (LA12_0=='(') ) {s = 6;}
+
+                        else if ( (LA12_0==')') ) {s = 7;}
+
+                        else if ( (LA12_0=='[') ) {s = 8;}
+
+                        else if ( (LA12_0==']') ) {s = 9;}
+
+                        else if ( (LA12_0=='{') ) {s = 10;}
+
+                        else if ( (LA12_0=='}') ) {s = 11;}
+
+                        else if ( (LA12_0=='^') ) {s = 12;}
+
+                        else if ( ((LA12_0>='A' && LA12_0<='Z')||LA12_0=='_'||(LA12_0>='a' && LA12_0<='h')||(LA12_0>='j' && LA12_0<='z')) ) {s = 13;}
+
+                        else if ( ((LA12_0>='0' && LA12_0<='9')) ) {s = 14;}
+
+                        else if ( (LA12_0=='\"') ) {s = 15;}
+
+                        else if ( (LA12_0=='\'') ) {s = 16;}
+
+                        else if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {s = 17;}
+
+                        else if ( ((LA12_0>='\u0000' && LA12_0<='\b')||(LA12_0>='\u000B' && LA12_0<='\f')||(LA12_0>='\u000E' && LA12_0<='\u001F')||LA12_0=='!'||(LA12_0>='#' && LA12_0<='&')||(LA12_0>='*' && LA12_0<='+')||LA12_0=='-'||(LA12_0>=';' && LA12_0<='@')||LA12_0=='\\'||LA12_0=='`'||LA12_0=='|'||(LA12_0>='~' && LA12_0<='\uFFFF')) ) {s = 18;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA12_16 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA12_16>='\u0000' && LA12_16<='\uFFFF')) ) {s = 34;}
+
+                        else s = 18;
+
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 12, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+}
\ No newline at end of file
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransitionParser.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransitionParser.java
new file mode 100644
index 0000000..bce1586
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src-gen/org/eclipse/efm/papyrus/xtext/ide/contentassist/antlr/internal/InternalTransitionParser.java
@@ -0,0 +1,3745 @@
+package org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.efm.papyrus.xtext.services.TransitionGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+@SuppressWarnings("all")
+public class InternalTransitionParser extends AbstractInternalContentAssistParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_STRING", "RULE_INT", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'.'", "'::'", "','", "'/'", "'input'", "'('", "')'", "'['", "']'", "'{'", "'}'"
+    };
+    public static final int RULE_STRING=5;
+    public static final int RULE_SL_COMMENT=8;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__11=11;
+    public static final int T__12=12;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int EOF=-1;
+    public static final int RULE_ID=4;
+    public static final int RULE_WS=9;
+    public static final int RULE_ANY_OTHER=10;
+    public static final int RULE_INT=6;
+    public static final int RULE_ML_COMMENT=7;
+    public static final int T__20=20;
+    public static final int T__21=21;
+
+    // delegates
+    // delegators
+
+
+        public InternalTransitionParser(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+        public InternalTransitionParser(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+             
+        }
+        
+
+    public String[] getTokenNames() { return InternalTransitionParser.tokenNames; }
+    public String getGrammarFileName() { return "InternalTransition.g"; }
+
+
+    	private TransitionGrammarAccess grammarAccess;
+
+    	public void setGrammarAccess(TransitionGrammarAccess grammarAccess) {
+    		this.grammarAccess = grammarAccess;
+    	}
+
+    	@Override
+    	protected Grammar getGrammar() {
+    		return grammarAccess.getGrammar();
+    	}
+
+    	@Override
+    	protected String getValueForTokenName(String tokenName) {
+    		return tokenName;
+    	}
+
+
+
+    // $ANTLR start "entryRuleTransitionRule"
+    // InternalTransition.g:62:1: entryRuleTransitionRule : ruleTransitionRule EOF ;
+    public final void entryRuleTransitionRule() throws RecognitionException {
+        try {
+            // InternalTransition.g:63:1: ( ruleTransitionRule EOF )
+            // InternalTransition.g:64:1: ruleTransitionRule EOF
+            {
+             before(grammarAccess.getTransitionRuleRule()); 
+            pushFollow(FOLLOW_1);
+            ruleTransitionRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getTransitionRuleRule()); 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransitionRule"
+
+
+    // $ANTLR start "ruleTransitionRule"
+    // InternalTransition.g:71:1: ruleTransitionRule : ( ( rule__TransitionRule__Group__0 ) ) ;
+    public final void ruleTransitionRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:75:2: ( ( ( rule__TransitionRule__Group__0 ) ) )
+            // InternalTransition.g:76:2: ( ( rule__TransitionRule__Group__0 ) )
+            {
+            // InternalTransition.g:76:2: ( ( rule__TransitionRule__Group__0 ) )
+            // InternalTransition.g:77:3: ( rule__TransitionRule__Group__0 )
+            {
+             before(grammarAccess.getTransitionRuleAccess().getGroup()); 
+            // InternalTransition.g:78:3: ( rule__TransitionRule__Group__0 )
+            // InternalTransition.g:78:4: rule__TransitionRule__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group__0();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getTransitionRuleAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionRule"
+
+
+    // $ANTLR start "entryRuleFQN"
+    // InternalTransition.g:87:1: entryRuleFQN : ruleFQN EOF ;
+    public final void entryRuleFQN() throws RecognitionException {
+        try {
+            // InternalTransition.g:88:1: ( ruleFQN EOF )
+            // InternalTransition.g:89:1: ruleFQN EOF
+            {
+             before(grammarAccess.getFQNRule()); 
+            pushFollow(FOLLOW_1);
+            ruleFQN();
+
+            state._fsp--;
+
+             after(grammarAccess.getFQNRule()); 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleFQN"
+
+
+    // $ANTLR start "ruleFQN"
+    // InternalTransition.g:96:1: ruleFQN : ( ( rule__FQN__Group__0 ) ) ;
+    public final void ruleFQN() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:100:2: ( ( ( rule__FQN__Group__0 ) ) )
+            // InternalTransition.g:101:2: ( ( rule__FQN__Group__0 ) )
+            {
+            // InternalTransition.g:101:2: ( ( rule__FQN__Group__0 ) )
+            // InternalTransition.g:102:3: ( rule__FQN__Group__0 )
+            {
+             before(grammarAccess.getFQNAccess().getGroup()); 
+            // InternalTransition.g:103:3: ( rule__FQN__Group__0 )
+            // InternalTransition.g:103:4: rule__FQN__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__FQN__Group__0();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getFQNAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleFQN"
+
+
+    // $ANTLR start "entryRuleTriggerRule"
+    // InternalTransition.g:112:1: entryRuleTriggerRule : ruleTriggerRule EOF ;
+    public final void entryRuleTriggerRule() throws RecognitionException {
+        try {
+            // InternalTransition.g:113:1: ( ruleTriggerRule EOF )
+            // InternalTransition.g:114:1: ruleTriggerRule EOF
+            {
+             before(grammarAccess.getTriggerRuleRule()); 
+            pushFollow(FOLLOW_1);
+            ruleTriggerRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getTriggerRuleRule()); 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTriggerRule"
+
+
+    // $ANTLR start "ruleTriggerRule"
+    // InternalTransition.g:121:1: ruleTriggerRule : ( ( rule__TriggerRule__Group__0 ) ) ;
+    public final void ruleTriggerRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:125:2: ( ( ( rule__TriggerRule__Group__0 ) ) )
+            // InternalTransition.g:126:2: ( ( rule__TriggerRule__Group__0 ) )
+            {
+            // InternalTransition.g:126:2: ( ( rule__TriggerRule__Group__0 ) )
+            // InternalTransition.g:127:3: ( rule__TriggerRule__Group__0 )
+            {
+             before(grammarAccess.getTriggerRuleAccess().getGroup()); 
+            // InternalTransition.g:128:3: ( rule__TriggerRule__Group__0 )
+            // InternalTransition.g:128:4: rule__TriggerRule__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__TriggerRule__Group__0();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getTriggerRuleAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTriggerRule"
+
+
+    // $ANTLR start "entryRuleEventRule"
+    // InternalTransition.g:137:1: entryRuleEventRule : ruleEventRule EOF ;
+    public final void entryRuleEventRule() throws RecognitionException {
+        try {
+            // InternalTransition.g:138:1: ( ruleEventRule EOF )
+            // InternalTransition.g:139:1: ruleEventRule EOF
+            {
+             before(grammarAccess.getEventRuleRule()); 
+            pushFollow(FOLLOW_1);
+            ruleEventRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getEventRuleRule()); 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEventRule"
+
+
+    // $ANTLR start "ruleEventRule"
+    // InternalTransition.g:146:1: ruleEventRule : ( ruleReceiveSignalEventRule ) ;
+    public final void ruleEventRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:150:2: ( ( ruleReceiveSignalEventRule ) )
+            // InternalTransition.g:151:2: ( ruleReceiveSignalEventRule )
+            {
+            // InternalTransition.g:151:2: ( ruleReceiveSignalEventRule )
+            // InternalTransition.g:152:3: ruleReceiveSignalEventRule
+            {
+             before(grammarAccess.getEventRuleAccess().getReceiveSignalEventRuleParserRuleCall()); 
+            pushFollow(FOLLOW_2);
+            ruleReceiveSignalEventRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getEventRuleAccess().getReceiveSignalEventRuleParserRuleCall()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEventRule"
+
+
+    // $ANTLR start "entryRuleReceiveSignalEventRule"
+    // InternalTransition.g:162:1: entryRuleReceiveSignalEventRule : ruleReceiveSignalEventRule EOF ;
+    public final void entryRuleReceiveSignalEventRule() throws RecognitionException {
+        try {
+            // InternalTransition.g:163:1: ( ruleReceiveSignalEventRule EOF )
+            // InternalTransition.g:164:1: ruleReceiveSignalEventRule EOF
+            {
+             before(grammarAccess.getReceiveSignalEventRuleRule()); 
+            pushFollow(FOLLOW_1);
+            ruleReceiveSignalEventRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getReceiveSignalEventRuleRule()); 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleReceiveSignalEventRule"
+
+
+    // $ANTLR start "ruleReceiveSignalEventRule"
+    // InternalTransition.g:171:1: ruleReceiveSignalEventRule : ( ( rule__ReceiveSignalEventRule__Group__0 ) ) ;
+    public final void ruleReceiveSignalEventRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:175:2: ( ( ( rule__ReceiveSignalEventRule__Group__0 ) ) )
+            // InternalTransition.g:176:2: ( ( rule__ReceiveSignalEventRule__Group__0 ) )
+            {
+            // InternalTransition.g:176:2: ( ( rule__ReceiveSignalEventRule__Group__0 ) )
+            // InternalTransition.g:177:3: ( rule__ReceiveSignalEventRule__Group__0 )
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getGroup()); 
+            // InternalTransition.g:178:3: ( rule__ReceiveSignalEventRule__Group__0 )
+            // InternalTransition.g:178:4: rule__ReceiveSignalEventRule__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__Group__0();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleReceiveSignalEventRule"
+
+
+    // $ANTLR start "entryRuleGuardRule"
+    // InternalTransition.g:187:1: entryRuleGuardRule : ruleGuardRule EOF ;
+    public final void entryRuleGuardRule() throws RecognitionException {
+        try {
+            // InternalTransition.g:188:1: ( ruleGuardRule EOF )
+            // InternalTransition.g:189:1: ruleGuardRule EOF
+            {
+             before(grammarAccess.getGuardRuleRule()); 
+            pushFollow(FOLLOW_1);
+            ruleGuardRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getGuardRuleRule()); 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleGuardRule"
+
+
+    // $ANTLR start "ruleGuardRule"
+    // InternalTransition.g:196:1: ruleGuardRule : ( ( rule__GuardRule__Group__0 ) ) ;
+    public final void ruleGuardRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:200:2: ( ( ( rule__GuardRule__Group__0 ) ) )
+            // InternalTransition.g:201:2: ( ( rule__GuardRule__Group__0 ) )
+            {
+            // InternalTransition.g:201:2: ( ( rule__GuardRule__Group__0 ) )
+            // InternalTransition.g:202:3: ( rule__GuardRule__Group__0 )
+            {
+             before(grammarAccess.getGuardRuleAccess().getGroup()); 
+            // InternalTransition.g:203:3: ( rule__GuardRule__Group__0 )
+            // InternalTransition.g:203:4: rule__GuardRule__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__GuardRule__Group__0();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getGuardRuleAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleGuardRule"
+
+
+    // $ANTLR start "entryRuleTGuardRule"
+    // InternalTransition.g:212:1: entryRuleTGuardRule : ruleTGuardRule EOF ;
+    public final void entryRuleTGuardRule() throws RecognitionException {
+        try {
+            // InternalTransition.g:213:1: ( ruleTGuardRule EOF )
+            // InternalTransition.g:214:1: ruleTGuardRule EOF
+            {
+             before(grammarAccess.getTGuardRuleRule()); 
+            pushFollow(FOLLOW_1);
+            ruleTGuardRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getTGuardRuleRule()); 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTGuardRule"
+
+
+    // $ANTLR start "ruleTGuardRule"
+    // InternalTransition.g:221:1: ruleTGuardRule : ( ( rule__TGuardRule__Group__0 ) ) ;
+    public final void ruleTGuardRule() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:225:2: ( ( ( rule__TGuardRule__Group__0 ) ) )
+            // InternalTransition.g:226:2: ( ( rule__TGuardRule__Group__0 ) )
+            {
+            // InternalTransition.g:226:2: ( ( rule__TGuardRule__Group__0 ) )
+            // InternalTransition.g:227:3: ( rule__TGuardRule__Group__0 )
+            {
+             before(grammarAccess.getTGuardRuleAccess().getGroup()); 
+            // InternalTransition.g:228:3: ( rule__TGuardRule__Group__0 )
+            // InternalTransition.g:228:4: rule__TGuardRule__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__TGuardRule__Group__0();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getTGuardRuleAccess().getGroup()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTGuardRule"
+
+
+    // $ANTLR start "rule__FQN__Alternatives_1_0"
+    // InternalTransition.g:236:1: rule__FQN__Alternatives_1_0 : ( ( '.' ) | ( '::' ) );
+    public final void rule__FQN__Alternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:240:1: ( ( '.' ) | ( '::' ) )
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0==11) ) {
+                alt1=1;
+            }
+            else if ( (LA1_0==12) ) {
+                alt1=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 1, 0, input);
+
+                throw nvae;
+            }
+            switch (alt1) {
+                case 1 :
+                    // InternalTransition.g:241:2: ( '.' )
+                    {
+                    // InternalTransition.g:241:2: ( '.' )
+                    // InternalTransition.g:242:3: '.'
+                    {
+                     before(grammarAccess.getFQNAccess().getFullStopKeyword_1_0_0()); 
+                    match(input,11,FOLLOW_2); 
+                     after(grammarAccess.getFQNAccess().getFullStopKeyword_1_0_0()); 
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalTransition.g:247:2: ( '::' )
+                    {
+                    // InternalTransition.g:247:2: ( '::' )
+                    // InternalTransition.g:248:3: '::'
+                    {
+                     before(grammarAccess.getFQNAccess().getColonColonKeyword_1_0_1()); 
+                    match(input,12,FOLLOW_2); 
+                     after(grammarAccess.getFQNAccess().getColonColonKeyword_1_0_1()); 
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FQN__Alternatives_1_0"
+
+
+    // $ANTLR start "rule__TransitionRule__Group__0"
+    // InternalTransition.g:257:1: rule__TransitionRule__Group__0 : rule__TransitionRule__Group__0__Impl rule__TransitionRule__Group__1 ;
+    public final void rule__TransitionRule__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:261:1: ( rule__TransitionRule__Group__0__Impl rule__TransitionRule__Group__1 )
+            // InternalTransition.g:262:2: rule__TransitionRule__Group__0__Impl rule__TransitionRule__Group__1
+            {
+            pushFollow(FOLLOW_3);
+            rule__TransitionRule__Group__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group__0"
+
+
+    // $ANTLR start "rule__TransitionRule__Group__0__Impl"
+    // InternalTransition.g:269:1: rule__TransitionRule__Group__0__Impl : ( ( rule__TransitionRule__Group_0__0 )? ) ;
+    public final void rule__TransitionRule__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:273:1: ( ( ( rule__TransitionRule__Group_0__0 )? ) )
+            // InternalTransition.g:274:1: ( ( rule__TransitionRule__Group_0__0 )? )
+            {
+            // InternalTransition.g:274:1: ( ( rule__TransitionRule__Group_0__0 )? )
+            // InternalTransition.g:275:2: ( rule__TransitionRule__Group_0__0 )?
+            {
+             before(grammarAccess.getTransitionRuleAccess().getGroup_0()); 
+            // InternalTransition.g:276:2: ( rule__TransitionRule__Group_0__0 )?
+            int alt2=2;
+            int LA2_0 = input.LA(1);
+
+            if ( (LA2_0==15) ) {
+                alt2=1;
+            }
+            switch (alt2) {
+                case 1 :
+                    // InternalTransition.g:276:3: rule__TransitionRule__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__TransitionRule__Group_0__0();
+
+                    state._fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getTransitionRuleAccess().getGroup_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__Group__1"
+    // InternalTransition.g:284:1: rule__TransitionRule__Group__1 : rule__TransitionRule__Group__1__Impl rule__TransitionRule__Group__2 ;
+    public final void rule__TransitionRule__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:288:1: ( rule__TransitionRule__Group__1__Impl rule__TransitionRule__Group__2 )
+            // InternalTransition.g:289:2: rule__TransitionRule__Group__1__Impl rule__TransitionRule__Group__2
+            {
+            pushFollow(FOLLOW_3);
+            rule__TransitionRule__Group__1__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group__2();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group__1"
+
+
+    // $ANTLR start "rule__TransitionRule__Group__1__Impl"
+    // InternalTransition.g:296:1: rule__TransitionRule__Group__1__Impl : ( ( rule__TransitionRule__GuardAssignment_1 )? ) ;
+    public final void rule__TransitionRule__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:300:1: ( ( ( rule__TransitionRule__GuardAssignment_1 )? ) )
+            // InternalTransition.g:301:1: ( ( rule__TransitionRule__GuardAssignment_1 )? )
+            {
+            // InternalTransition.g:301:1: ( ( rule__TransitionRule__GuardAssignment_1 )? )
+            // InternalTransition.g:302:2: ( rule__TransitionRule__GuardAssignment_1 )?
+            {
+             before(grammarAccess.getTransitionRuleAccess().getGuardAssignment_1()); 
+            // InternalTransition.g:303:2: ( rule__TransitionRule__GuardAssignment_1 )?
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0==18) ) {
+                alt3=1;
+            }
+            switch (alt3) {
+                case 1 :
+                    // InternalTransition.g:303:3: rule__TransitionRule__GuardAssignment_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__TransitionRule__GuardAssignment_1();
+
+                    state._fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getTransitionRuleAccess().getGuardAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__Group__2"
+    // InternalTransition.g:311:1: rule__TransitionRule__Group__2 : rule__TransitionRule__Group__2__Impl rule__TransitionRule__Group__3 ;
+    public final void rule__TransitionRule__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:315:1: ( rule__TransitionRule__Group__2__Impl rule__TransitionRule__Group__3 )
+            // InternalTransition.g:316:2: rule__TransitionRule__Group__2__Impl rule__TransitionRule__Group__3
+            {
+            pushFollow(FOLLOW_3);
+            rule__TransitionRule__Group__2__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group__3();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group__2"
+
+
+    // $ANTLR start "rule__TransitionRule__Group__2__Impl"
+    // InternalTransition.g:323:1: rule__TransitionRule__Group__2__Impl : ( ( rule__TransitionRule__TguardAssignment_2 )? ) ;
+    public final void rule__TransitionRule__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:327:1: ( ( ( rule__TransitionRule__TguardAssignment_2 )? ) )
+            // InternalTransition.g:328:1: ( ( rule__TransitionRule__TguardAssignment_2 )? )
+            {
+            // InternalTransition.g:328:1: ( ( rule__TransitionRule__TguardAssignment_2 )? )
+            // InternalTransition.g:329:2: ( rule__TransitionRule__TguardAssignment_2 )?
+            {
+             before(grammarAccess.getTransitionRuleAccess().getTguardAssignment_2()); 
+            // InternalTransition.g:330:2: ( rule__TransitionRule__TguardAssignment_2 )?
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0==20) ) {
+                alt4=1;
+            }
+            switch (alt4) {
+                case 1 :
+                    // InternalTransition.g:330:3: rule__TransitionRule__TguardAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__TransitionRule__TguardAssignment_2();
+
+                    state._fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getTransitionRuleAccess().getTguardAssignment_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__Group__3"
+    // InternalTransition.g:338:1: rule__TransitionRule__Group__3 : rule__TransitionRule__Group__3__Impl ;
+    public final void rule__TransitionRule__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:342:1: ( rule__TransitionRule__Group__3__Impl )
+            // InternalTransition.g:343:2: rule__TransitionRule__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group__3__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group__3"
+
+
+    // $ANTLR start "rule__TransitionRule__Group__3__Impl"
+    // InternalTransition.g:349:1: rule__TransitionRule__Group__3__Impl : ( ( rule__TransitionRule__Group_3__0 )? ) ;
+    public final void rule__TransitionRule__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:353:1: ( ( ( rule__TransitionRule__Group_3__0 )? ) )
+            // InternalTransition.g:354:1: ( ( rule__TransitionRule__Group_3__0 )? )
+            {
+            // InternalTransition.g:354:1: ( ( rule__TransitionRule__Group_3__0 )? )
+            // InternalTransition.g:355:2: ( rule__TransitionRule__Group_3__0 )?
+            {
+             before(grammarAccess.getTransitionRuleAccess().getGroup_3()); 
+            // InternalTransition.g:356:2: ( rule__TransitionRule__Group_3__0 )?
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==14) ) {
+                alt5=1;
+            }
+            switch (alt5) {
+                case 1 :
+                    // InternalTransition.g:356:3: rule__TransitionRule__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__TransitionRule__Group_3__0();
+
+                    state._fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getTransitionRuleAccess().getGroup_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group__3__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_0__0"
+    // InternalTransition.g:365:1: rule__TransitionRule__Group_0__0 : rule__TransitionRule__Group_0__0__Impl rule__TransitionRule__Group_0__1 ;
+    public final void rule__TransitionRule__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:369:1: ( rule__TransitionRule__Group_0__0__Impl rule__TransitionRule__Group_0__1 )
+            // InternalTransition.g:370:2: rule__TransitionRule__Group_0__0__Impl rule__TransitionRule__Group_0__1
+            {
+            pushFollow(FOLLOW_4);
+            rule__TransitionRule__Group_0__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group_0__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_0__0"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_0__0__Impl"
+    // InternalTransition.g:377:1: rule__TransitionRule__Group_0__0__Impl : ( ( rule__TransitionRule__TriggersAssignment_0_0 ) ) ;
+    public final void rule__TransitionRule__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:381:1: ( ( ( rule__TransitionRule__TriggersAssignment_0_0 ) ) )
+            // InternalTransition.g:382:1: ( ( rule__TransitionRule__TriggersAssignment_0_0 ) )
+            {
+            // InternalTransition.g:382:1: ( ( rule__TransitionRule__TriggersAssignment_0_0 ) )
+            // InternalTransition.g:383:2: ( rule__TransitionRule__TriggersAssignment_0_0 )
+            {
+             before(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_0()); 
+            // InternalTransition.g:384:2: ( rule__TransitionRule__TriggersAssignment_0_0 )
+            // InternalTransition.g:384:3: rule__TransitionRule__TriggersAssignment_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__TriggersAssignment_0_0();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_0__1"
+    // InternalTransition.g:392:1: rule__TransitionRule__Group_0__1 : rule__TransitionRule__Group_0__1__Impl ;
+    public final void rule__TransitionRule__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:396:1: ( rule__TransitionRule__Group_0__1__Impl )
+            // InternalTransition.g:397:2: rule__TransitionRule__Group_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group_0__1__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_0__1"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_0__1__Impl"
+    // InternalTransition.g:403:1: rule__TransitionRule__Group_0__1__Impl : ( ( rule__TransitionRule__Group_0_1__0 )* ) ;
+    public final void rule__TransitionRule__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:407:1: ( ( ( rule__TransitionRule__Group_0_1__0 )* ) )
+            // InternalTransition.g:408:1: ( ( rule__TransitionRule__Group_0_1__0 )* )
+            {
+            // InternalTransition.g:408:1: ( ( rule__TransitionRule__Group_0_1__0 )* )
+            // InternalTransition.g:409:2: ( rule__TransitionRule__Group_0_1__0 )*
+            {
+             before(grammarAccess.getTransitionRuleAccess().getGroup_0_1()); 
+            // InternalTransition.g:410:2: ( rule__TransitionRule__Group_0_1__0 )*
+            loop6:
+            do {
+                int alt6=2;
+                int LA6_0 = input.LA(1);
+
+                if ( (LA6_0==13) ) {
+                    alt6=1;
+                }
+
+
+                switch (alt6) {
+            	case 1 :
+            	    // InternalTransition.g:410:3: rule__TransitionRule__Group_0_1__0
+            	    {
+            	    pushFollow(FOLLOW_5);
+            	    rule__TransitionRule__Group_0_1__0();
+
+            	    state._fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop6;
+                }
+            } while (true);
+
+             after(grammarAccess.getTransitionRuleAccess().getGroup_0_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_0_1__0"
+    // InternalTransition.g:419:1: rule__TransitionRule__Group_0_1__0 : rule__TransitionRule__Group_0_1__0__Impl rule__TransitionRule__Group_0_1__1 ;
+    public final void rule__TransitionRule__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:423:1: ( rule__TransitionRule__Group_0_1__0__Impl rule__TransitionRule__Group_0_1__1 )
+            // InternalTransition.g:424:2: rule__TransitionRule__Group_0_1__0__Impl rule__TransitionRule__Group_0_1__1
+            {
+            pushFollow(FOLLOW_6);
+            rule__TransitionRule__Group_0_1__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group_0_1__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_0_1__0"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_0_1__0__Impl"
+    // InternalTransition.g:431:1: rule__TransitionRule__Group_0_1__0__Impl : ( ',' ) ;
+    public final void rule__TransitionRule__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:435:1: ( ( ',' ) )
+            // InternalTransition.g:436:1: ( ',' )
+            {
+            // InternalTransition.g:436:1: ( ',' )
+            // InternalTransition.g:437:2: ','
+            {
+             before(grammarAccess.getTransitionRuleAccess().getCommaKeyword_0_1_0()); 
+            match(input,13,FOLLOW_2); 
+             after(grammarAccess.getTransitionRuleAccess().getCommaKeyword_0_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_0_1__1"
+    // InternalTransition.g:446:1: rule__TransitionRule__Group_0_1__1 : rule__TransitionRule__Group_0_1__1__Impl ;
+    public final void rule__TransitionRule__Group_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:450:1: ( rule__TransitionRule__Group_0_1__1__Impl )
+            // InternalTransition.g:451:2: rule__TransitionRule__Group_0_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group_0_1__1__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_0_1__1"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_0_1__1__Impl"
+    // InternalTransition.g:457:1: rule__TransitionRule__Group_0_1__1__Impl : ( ( rule__TransitionRule__TriggersAssignment_0_1_1 ) ) ;
+    public final void rule__TransitionRule__Group_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:461:1: ( ( ( rule__TransitionRule__TriggersAssignment_0_1_1 ) ) )
+            // InternalTransition.g:462:1: ( ( rule__TransitionRule__TriggersAssignment_0_1_1 ) )
+            {
+            // InternalTransition.g:462:1: ( ( rule__TransitionRule__TriggersAssignment_0_1_1 ) )
+            // InternalTransition.g:463:2: ( rule__TransitionRule__TriggersAssignment_0_1_1 )
+            {
+             before(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_1_1()); 
+            // InternalTransition.g:464:2: ( rule__TransitionRule__TriggersAssignment_0_1_1 )
+            // InternalTransition.g:464:3: rule__TransitionRule__TriggersAssignment_0_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__TriggersAssignment_0_1_1();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getTransitionRuleAccess().getTriggersAssignment_0_1_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_3__0"
+    // InternalTransition.g:473:1: rule__TransitionRule__Group_3__0 : rule__TransitionRule__Group_3__0__Impl rule__TransitionRule__Group_3__1 ;
+    public final void rule__TransitionRule__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:477:1: ( rule__TransitionRule__Group_3__0__Impl rule__TransitionRule__Group_3__1 )
+            // InternalTransition.g:478:2: rule__TransitionRule__Group_3__0__Impl rule__TransitionRule__Group_3__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__TransitionRule__Group_3__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group_3__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_3__0"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_3__0__Impl"
+    // InternalTransition.g:485:1: rule__TransitionRule__Group_3__0__Impl : ( '/' ) ;
+    public final void rule__TransitionRule__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:489:1: ( ( '/' ) )
+            // InternalTransition.g:490:1: ( '/' )
+            {
+            // InternalTransition.g:490:1: ( '/' )
+            // InternalTransition.g:491:2: '/'
+            {
+             before(grammarAccess.getTransitionRuleAccess().getSolidusKeyword_3_0()); 
+            match(input,14,FOLLOW_2); 
+             after(grammarAccess.getTransitionRuleAccess().getSolidusKeyword_3_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_3__1"
+    // InternalTransition.g:500:1: rule__TransitionRule__Group_3__1 : rule__TransitionRule__Group_3__1__Impl ;
+    public final void rule__TransitionRule__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:504:1: ( rule__TransitionRule__Group_3__1__Impl )
+            // InternalTransition.g:505:2: rule__TransitionRule__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__Group_3__1__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_3__1"
+
+
+    // $ANTLR start "rule__TransitionRule__Group_3__1__Impl"
+    // InternalTransition.g:511:1: rule__TransitionRule__Group_3__1__Impl : ( ( rule__TransitionRule__EffectBodyAssignment_3_1 ) ) ;
+    public final void rule__TransitionRule__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:515:1: ( ( ( rule__TransitionRule__EffectBodyAssignment_3_1 ) ) )
+            // InternalTransition.g:516:1: ( ( rule__TransitionRule__EffectBodyAssignment_3_1 ) )
+            {
+            // InternalTransition.g:516:1: ( ( rule__TransitionRule__EffectBodyAssignment_3_1 ) )
+            // InternalTransition.g:517:2: ( rule__TransitionRule__EffectBodyAssignment_3_1 )
+            {
+             before(grammarAccess.getTransitionRuleAccess().getEffectBodyAssignment_3_1()); 
+            // InternalTransition.g:518:2: ( rule__TransitionRule__EffectBodyAssignment_3_1 )
+            // InternalTransition.g:518:3: rule__TransitionRule__EffectBodyAssignment_3_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__TransitionRule__EffectBodyAssignment_3_1();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getTransitionRuleAccess().getEffectBodyAssignment_3_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__FQN__Group__0"
+    // InternalTransition.g:527:1: rule__FQN__Group__0 : rule__FQN__Group__0__Impl rule__FQN__Group__1 ;
+    public final void rule__FQN__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:531:1: ( rule__FQN__Group__0__Impl rule__FQN__Group__1 )
+            // InternalTransition.g:532:2: rule__FQN__Group__0__Impl rule__FQN__Group__1
+            {
+            pushFollow(FOLLOW_8);
+            rule__FQN__Group__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__FQN__Group__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FQN__Group__0"
+
+
+    // $ANTLR start "rule__FQN__Group__0__Impl"
+    // InternalTransition.g:539:1: rule__FQN__Group__0__Impl : ( RULE_ID ) ;
+    public final void rule__FQN__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:543:1: ( ( RULE_ID ) )
+            // InternalTransition.g:544:1: ( RULE_ID )
+            {
+            // InternalTransition.g:544:1: ( RULE_ID )
+            // InternalTransition.g:545:2: RULE_ID
+            {
+             before(grammarAccess.getFQNAccess().getIDTerminalRuleCall_0()); 
+            match(input,RULE_ID,FOLLOW_2); 
+             after(grammarAccess.getFQNAccess().getIDTerminalRuleCall_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FQN__Group__0__Impl"
+
+
+    // $ANTLR start "rule__FQN__Group__1"
+    // InternalTransition.g:554:1: rule__FQN__Group__1 : rule__FQN__Group__1__Impl ;
+    public final void rule__FQN__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:558:1: ( rule__FQN__Group__1__Impl )
+            // InternalTransition.g:559:2: rule__FQN__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__FQN__Group__1__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FQN__Group__1"
+
+
+    // $ANTLR start "rule__FQN__Group__1__Impl"
+    // InternalTransition.g:565:1: rule__FQN__Group__1__Impl : ( ( rule__FQN__Group_1__0 )* ) ;
+    public final void rule__FQN__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:569:1: ( ( ( rule__FQN__Group_1__0 )* ) )
+            // InternalTransition.g:570:1: ( ( rule__FQN__Group_1__0 )* )
+            {
+            // InternalTransition.g:570:1: ( ( rule__FQN__Group_1__0 )* )
+            // InternalTransition.g:571:2: ( rule__FQN__Group_1__0 )*
+            {
+             before(grammarAccess.getFQNAccess().getGroup_1()); 
+            // InternalTransition.g:572:2: ( rule__FQN__Group_1__0 )*
+            loop7:
+            do {
+                int alt7=2;
+                int LA7_0 = input.LA(1);
+
+                if ( ((LA7_0>=11 && LA7_0<=12)) ) {
+                    alt7=1;
+                }
+
+
+                switch (alt7) {
+            	case 1 :
+            	    // InternalTransition.g:572:3: rule__FQN__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_9);
+            	    rule__FQN__Group_1__0();
+
+            	    state._fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop7;
+                }
+            } while (true);
+
+             after(grammarAccess.getFQNAccess().getGroup_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FQN__Group__1__Impl"
+
+
+    // $ANTLR start "rule__FQN__Group_1__0"
+    // InternalTransition.g:581:1: rule__FQN__Group_1__0 : rule__FQN__Group_1__0__Impl rule__FQN__Group_1__1 ;
+    public final void rule__FQN__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:585:1: ( rule__FQN__Group_1__0__Impl rule__FQN__Group_1__1 )
+            // InternalTransition.g:586:2: rule__FQN__Group_1__0__Impl rule__FQN__Group_1__1
+            {
+            pushFollow(FOLLOW_10);
+            rule__FQN__Group_1__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__FQN__Group_1__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FQN__Group_1__0"
+
+
+    // $ANTLR start "rule__FQN__Group_1__0__Impl"
+    // InternalTransition.g:593:1: rule__FQN__Group_1__0__Impl : ( ( rule__FQN__Alternatives_1_0 ) ) ;
+    public final void rule__FQN__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:597:1: ( ( ( rule__FQN__Alternatives_1_0 ) ) )
+            // InternalTransition.g:598:1: ( ( rule__FQN__Alternatives_1_0 ) )
+            {
+            // InternalTransition.g:598:1: ( ( rule__FQN__Alternatives_1_0 ) )
+            // InternalTransition.g:599:2: ( rule__FQN__Alternatives_1_0 )
+            {
+             before(grammarAccess.getFQNAccess().getAlternatives_1_0()); 
+            // InternalTransition.g:600:2: ( rule__FQN__Alternatives_1_0 )
+            // InternalTransition.g:600:3: rule__FQN__Alternatives_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__FQN__Alternatives_1_0();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getFQNAccess().getAlternatives_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FQN__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__FQN__Group_1__1"
+    // InternalTransition.g:608:1: rule__FQN__Group_1__1 : rule__FQN__Group_1__1__Impl ;
+    public final void rule__FQN__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:612:1: ( rule__FQN__Group_1__1__Impl )
+            // InternalTransition.g:613:2: rule__FQN__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__FQN__Group_1__1__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FQN__Group_1__1"
+
+
+    // $ANTLR start "rule__FQN__Group_1__1__Impl"
+    // InternalTransition.g:619:1: rule__FQN__Group_1__1__Impl : ( RULE_ID ) ;
+    public final void rule__FQN__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:623:1: ( ( RULE_ID ) )
+            // InternalTransition.g:624:1: ( RULE_ID )
+            {
+            // InternalTransition.g:624:1: ( RULE_ID )
+            // InternalTransition.g:625:2: RULE_ID
+            {
+             before(grammarAccess.getFQNAccess().getIDTerminalRuleCall_1_1()); 
+            match(input,RULE_ID,FOLLOW_2); 
+             after(grammarAccess.getFQNAccess().getIDTerminalRuleCall_1_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FQN__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__TriggerRule__Group__0"
+    // InternalTransition.g:635:1: rule__TriggerRule__Group__0 : rule__TriggerRule__Group__0__Impl rule__TriggerRule__Group__1 ;
+    public final void rule__TriggerRule__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:639:1: ( rule__TriggerRule__Group__0__Impl rule__TriggerRule__Group__1 )
+            // InternalTransition.g:640:2: rule__TriggerRule__Group__0__Impl rule__TriggerRule__Group__1
+            {
+            pushFollow(FOLLOW_10);
+            rule__TriggerRule__Group__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TriggerRule__Group__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TriggerRule__Group__0"
+
+
+    // $ANTLR start "rule__TriggerRule__Group__0__Impl"
+    // InternalTransition.g:647:1: rule__TriggerRule__Group__0__Impl : ( 'input' ) ;
+    public final void rule__TriggerRule__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:651:1: ( ( 'input' ) )
+            // InternalTransition.g:652:1: ( 'input' )
+            {
+            // InternalTransition.g:652:1: ( 'input' )
+            // InternalTransition.g:653:2: 'input'
+            {
+             before(grammarAccess.getTriggerRuleAccess().getInputKeyword_0()); 
+            match(input,15,FOLLOW_2); 
+             after(grammarAccess.getTriggerRuleAccess().getInputKeyword_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TriggerRule__Group__0__Impl"
+
+
+    // $ANTLR start "rule__TriggerRule__Group__1"
+    // InternalTransition.g:662:1: rule__TriggerRule__Group__1 : rule__TriggerRule__Group__1__Impl rule__TriggerRule__Group__2 ;
+    public final void rule__TriggerRule__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:666:1: ( rule__TriggerRule__Group__1__Impl rule__TriggerRule__Group__2 )
+            // InternalTransition.g:667:2: rule__TriggerRule__Group__1__Impl rule__TriggerRule__Group__2
+            {
+            pushFollow(FOLLOW_11);
+            rule__TriggerRule__Group__1__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TriggerRule__Group__2();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TriggerRule__Group__1"
+
+
+    // $ANTLR start "rule__TriggerRule__Group__1__Impl"
+    // InternalTransition.g:674:1: rule__TriggerRule__Group__1__Impl : ( ( rule__TriggerRule__PortAssignment_1 ) ) ;
+    public final void rule__TriggerRule__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:678:1: ( ( ( rule__TriggerRule__PortAssignment_1 ) ) )
+            // InternalTransition.g:679:1: ( ( rule__TriggerRule__PortAssignment_1 ) )
+            {
+            // InternalTransition.g:679:1: ( ( rule__TriggerRule__PortAssignment_1 ) )
+            // InternalTransition.g:680:2: ( rule__TriggerRule__PortAssignment_1 )
+            {
+             before(grammarAccess.getTriggerRuleAccess().getPortAssignment_1()); 
+            // InternalTransition.g:681:2: ( rule__TriggerRule__PortAssignment_1 )
+            // InternalTransition.g:681:3: rule__TriggerRule__PortAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__TriggerRule__PortAssignment_1();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getTriggerRuleAccess().getPortAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TriggerRule__Group__1__Impl"
+
+
+    // $ANTLR start "rule__TriggerRule__Group__2"
+    // InternalTransition.g:689:1: rule__TriggerRule__Group__2 : rule__TriggerRule__Group__2__Impl ;
+    public final void rule__TriggerRule__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:693:1: ( rule__TriggerRule__Group__2__Impl )
+            // InternalTransition.g:694:2: rule__TriggerRule__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__TriggerRule__Group__2__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TriggerRule__Group__2"
+
+
+    // $ANTLR start "rule__TriggerRule__Group__2__Impl"
+    // InternalTransition.g:700:1: rule__TriggerRule__Group__2__Impl : ( ( rule__TriggerRule__EventAssignment_2 )? ) ;
+    public final void rule__TriggerRule__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:704:1: ( ( ( rule__TriggerRule__EventAssignment_2 )? ) )
+            // InternalTransition.g:705:1: ( ( rule__TriggerRule__EventAssignment_2 )? )
+            {
+            // InternalTransition.g:705:1: ( ( rule__TriggerRule__EventAssignment_2 )? )
+            // InternalTransition.g:706:2: ( rule__TriggerRule__EventAssignment_2 )?
+            {
+             before(grammarAccess.getTriggerRuleAccess().getEventAssignment_2()); 
+            // InternalTransition.g:707:2: ( rule__TriggerRule__EventAssignment_2 )?
+            int alt8=2;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0==16) ) {
+                alt8=1;
+            }
+            switch (alt8) {
+                case 1 :
+                    // InternalTransition.g:707:3: rule__TriggerRule__EventAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__TriggerRule__EventAssignment_2();
+
+                    state._fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getTriggerRuleAccess().getEventAssignment_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TriggerRule__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group__0"
+    // InternalTransition.g:716:1: rule__ReceiveSignalEventRule__Group__0 : rule__ReceiveSignalEventRule__Group__0__Impl rule__ReceiveSignalEventRule__Group__1 ;
+    public final void rule__ReceiveSignalEventRule__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:720:1: ( rule__ReceiveSignalEventRule__Group__0__Impl rule__ReceiveSignalEventRule__Group__1 )
+            // InternalTransition.g:721:2: rule__ReceiveSignalEventRule__Group__0__Impl rule__ReceiveSignalEventRule__Group__1
+            {
+            pushFollow(FOLLOW_11);
+            rule__ReceiveSignalEventRule__Group__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__Group__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group__0"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group__0__Impl"
+    // InternalTransition.g:728:1: rule__ReceiveSignalEventRule__Group__0__Impl : ( () ) ;
+    public final void rule__ReceiveSignalEventRule__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:732:1: ( ( () ) )
+            // InternalTransition.g:733:1: ( () )
+            {
+            // InternalTransition.g:733:1: ( () )
+            // InternalTransition.g:734:2: ()
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getReceiveSignalEventRuleAction_0()); 
+            // InternalTransition.g:735:2: ()
+            // InternalTransition.g:735:3: 
+            {
+            }
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getReceiveSignalEventRuleAction_0()); 
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group__1"
+    // InternalTransition.g:743:1: rule__ReceiveSignalEventRule__Group__1 : rule__ReceiveSignalEventRule__Group__1__Impl rule__ReceiveSignalEventRule__Group__2 ;
+    public final void rule__ReceiveSignalEventRule__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:747:1: ( rule__ReceiveSignalEventRule__Group__1__Impl rule__ReceiveSignalEventRule__Group__2 )
+            // InternalTransition.g:748:2: rule__ReceiveSignalEventRule__Group__1__Impl rule__ReceiveSignalEventRule__Group__2
+            {
+            pushFollow(FOLLOW_12);
+            rule__ReceiveSignalEventRule__Group__1__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__Group__2();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group__1"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group__1__Impl"
+    // InternalTransition.g:755:1: rule__ReceiveSignalEventRule__Group__1__Impl : ( '(' ) ;
+    public final void rule__ReceiveSignalEventRule__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:759:1: ( ( '(' ) )
+            // InternalTransition.g:760:1: ( '(' )
+            {
+            // InternalTransition.g:760:1: ( '(' )
+            // InternalTransition.g:761:2: '('
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getLeftParenthesisKeyword_1()); 
+            match(input,16,FOLLOW_2); 
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getLeftParenthesisKeyword_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group__2"
+    // InternalTransition.g:770:1: rule__ReceiveSignalEventRule__Group__2 : rule__ReceiveSignalEventRule__Group__2__Impl rule__ReceiveSignalEventRule__Group__3 ;
+    public final void rule__ReceiveSignalEventRule__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:774:1: ( rule__ReceiveSignalEventRule__Group__2__Impl rule__ReceiveSignalEventRule__Group__3 )
+            // InternalTransition.g:775:2: rule__ReceiveSignalEventRule__Group__2__Impl rule__ReceiveSignalEventRule__Group__3
+            {
+            pushFollow(FOLLOW_12);
+            rule__ReceiveSignalEventRule__Group__2__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__Group__3();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group__2"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group__2__Impl"
+    // InternalTransition.g:782:1: rule__ReceiveSignalEventRule__Group__2__Impl : ( ( rule__ReceiveSignalEventRule__Group_2__0 )? ) ;
+    public final void rule__ReceiveSignalEventRule__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:786:1: ( ( ( rule__ReceiveSignalEventRule__Group_2__0 )? ) )
+            // InternalTransition.g:787:1: ( ( rule__ReceiveSignalEventRule__Group_2__0 )? )
+            {
+            // InternalTransition.g:787:1: ( ( rule__ReceiveSignalEventRule__Group_2__0 )? )
+            // InternalTransition.g:788:2: ( rule__ReceiveSignalEventRule__Group_2__0 )?
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2()); 
+            // InternalTransition.g:789:2: ( rule__ReceiveSignalEventRule__Group_2__0 )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==RULE_ID) ) {
+                alt9=1;
+            }
+            switch (alt9) {
+                case 1 :
+                    // InternalTransition.g:789:3: rule__ReceiveSignalEventRule__Group_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__ReceiveSignalEventRule__Group_2__0();
+
+                    state._fsp--;
+
+
+                    }
+                    break;
+
+            }
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group__3"
+    // InternalTransition.g:797:1: rule__ReceiveSignalEventRule__Group__3 : rule__ReceiveSignalEventRule__Group__3__Impl ;
+    public final void rule__ReceiveSignalEventRule__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:801:1: ( rule__ReceiveSignalEventRule__Group__3__Impl )
+            // InternalTransition.g:802:2: rule__ReceiveSignalEventRule__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__Group__3__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group__3"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group__3__Impl"
+    // InternalTransition.g:808:1: rule__ReceiveSignalEventRule__Group__3__Impl : ( ')' ) ;
+    public final void rule__ReceiveSignalEventRule__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:812:1: ( ( ')' ) )
+            // InternalTransition.g:813:1: ( ')' )
+            {
+            // InternalTransition.g:813:1: ( ')' )
+            // InternalTransition.g:814:2: ')'
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getRightParenthesisKeyword_3()); 
+            match(input,17,FOLLOW_2); 
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getRightParenthesisKeyword_3()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group_2__0"
+    // InternalTransition.g:824:1: rule__ReceiveSignalEventRule__Group_2__0 : rule__ReceiveSignalEventRule__Group_2__0__Impl rule__ReceiveSignalEventRule__Group_2__1 ;
+    public final void rule__ReceiveSignalEventRule__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:828:1: ( rule__ReceiveSignalEventRule__Group_2__0__Impl rule__ReceiveSignalEventRule__Group_2__1 )
+            // InternalTransition.g:829:2: rule__ReceiveSignalEventRule__Group_2__0__Impl rule__ReceiveSignalEventRule__Group_2__1
+            {
+            pushFollow(FOLLOW_4);
+            rule__ReceiveSignalEventRule__Group_2__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__Group_2__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group_2__0"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group_2__0__Impl"
+    // InternalTransition.g:836:1: rule__ReceiveSignalEventRule__Group_2__0__Impl : ( ( rule__ReceiveSignalEventRule__ParametersAssignment_2_0 ) ) ;
+    public final void rule__ReceiveSignalEventRule__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:840:1: ( ( ( rule__ReceiveSignalEventRule__ParametersAssignment_2_0 ) ) )
+            // InternalTransition.g:841:1: ( ( rule__ReceiveSignalEventRule__ParametersAssignment_2_0 ) )
+            {
+            // InternalTransition.g:841:1: ( ( rule__ReceiveSignalEventRule__ParametersAssignment_2_0 ) )
+            // InternalTransition.g:842:2: ( rule__ReceiveSignalEventRule__ParametersAssignment_2_0 )
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_0()); 
+            // InternalTransition.g:843:2: ( rule__ReceiveSignalEventRule__ParametersAssignment_2_0 )
+            // InternalTransition.g:843:3: rule__ReceiveSignalEventRule__ParametersAssignment_2_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__ParametersAssignment_2_0();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group_2__1"
+    // InternalTransition.g:851:1: rule__ReceiveSignalEventRule__Group_2__1 : rule__ReceiveSignalEventRule__Group_2__1__Impl ;
+    public final void rule__ReceiveSignalEventRule__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:855:1: ( rule__ReceiveSignalEventRule__Group_2__1__Impl )
+            // InternalTransition.g:856:2: rule__ReceiveSignalEventRule__Group_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__Group_2__1__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group_2__1"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group_2__1__Impl"
+    // InternalTransition.g:862:1: rule__ReceiveSignalEventRule__Group_2__1__Impl : ( ( rule__ReceiveSignalEventRule__Group_2_1__0 )* ) ;
+    public final void rule__ReceiveSignalEventRule__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:866:1: ( ( ( rule__ReceiveSignalEventRule__Group_2_1__0 )* ) )
+            // InternalTransition.g:867:1: ( ( rule__ReceiveSignalEventRule__Group_2_1__0 )* )
+            {
+            // InternalTransition.g:867:1: ( ( rule__ReceiveSignalEventRule__Group_2_1__0 )* )
+            // InternalTransition.g:868:2: ( rule__ReceiveSignalEventRule__Group_2_1__0 )*
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2_1()); 
+            // InternalTransition.g:869:2: ( rule__ReceiveSignalEventRule__Group_2_1__0 )*
+            loop10:
+            do {
+                int alt10=2;
+                int LA10_0 = input.LA(1);
+
+                if ( (LA10_0==13) ) {
+                    alt10=1;
+                }
+
+
+                switch (alt10) {
+            	case 1 :
+            	    // InternalTransition.g:869:3: rule__ReceiveSignalEventRule__Group_2_1__0
+            	    {
+            	    pushFollow(FOLLOW_5);
+            	    rule__ReceiveSignalEventRule__Group_2_1__0();
+
+            	    state._fsp--;
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop10;
+                }
+            } while (true);
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getGroup_2_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group_2_1__0"
+    // InternalTransition.g:878:1: rule__ReceiveSignalEventRule__Group_2_1__0 : rule__ReceiveSignalEventRule__Group_2_1__0__Impl rule__ReceiveSignalEventRule__Group_2_1__1 ;
+    public final void rule__ReceiveSignalEventRule__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:882:1: ( rule__ReceiveSignalEventRule__Group_2_1__0__Impl rule__ReceiveSignalEventRule__Group_2_1__1 )
+            // InternalTransition.g:883:2: rule__ReceiveSignalEventRule__Group_2_1__0__Impl rule__ReceiveSignalEventRule__Group_2_1__1
+            {
+            pushFollow(FOLLOW_10);
+            rule__ReceiveSignalEventRule__Group_2_1__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__Group_2_1__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group_2_1__0"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group_2_1__0__Impl"
+    // InternalTransition.g:890:1: rule__ReceiveSignalEventRule__Group_2_1__0__Impl : ( ',' ) ;
+    public final void rule__ReceiveSignalEventRule__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:894:1: ( ( ',' ) )
+            // InternalTransition.g:895:1: ( ',' )
+            {
+            // InternalTransition.g:895:1: ( ',' )
+            // InternalTransition.g:896:2: ','
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getCommaKeyword_2_1_0()); 
+            match(input,13,FOLLOW_2); 
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getCommaKeyword_2_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group_2_1__1"
+    // InternalTransition.g:905:1: rule__ReceiveSignalEventRule__Group_2_1__1 : rule__ReceiveSignalEventRule__Group_2_1__1__Impl ;
+    public final void rule__ReceiveSignalEventRule__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:909:1: ( rule__ReceiveSignalEventRule__Group_2_1__1__Impl )
+            // InternalTransition.g:910:2: rule__ReceiveSignalEventRule__Group_2_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__Group_2_1__1__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group_2_1__1"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__Group_2_1__1__Impl"
+    // InternalTransition.g:916:1: rule__ReceiveSignalEventRule__Group_2_1__1__Impl : ( ( rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1 ) ) ;
+    public final void rule__ReceiveSignalEventRule__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:920:1: ( ( ( rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1 ) ) )
+            // InternalTransition.g:921:1: ( ( rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1 ) )
+            {
+            // InternalTransition.g:921:1: ( ( rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1 ) )
+            // InternalTransition.g:922:2: ( rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1 )
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_1_1()); 
+            // InternalTransition.g:923:2: ( rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1 )
+            // InternalTransition.g:923:3: rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersAssignment_2_1_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__GuardRule__Group__0"
+    // InternalTransition.g:932:1: rule__GuardRule__Group__0 : rule__GuardRule__Group__0__Impl rule__GuardRule__Group__1 ;
+    public final void rule__GuardRule__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:936:1: ( rule__GuardRule__Group__0__Impl rule__GuardRule__Group__1 )
+            // InternalTransition.g:937:2: rule__GuardRule__Group__0__Impl rule__GuardRule__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__GuardRule__Group__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__GuardRule__Group__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardRule__Group__0"
+
+
+    // $ANTLR start "rule__GuardRule__Group__0__Impl"
+    // InternalTransition.g:944:1: rule__GuardRule__Group__0__Impl : ( '[' ) ;
+    public final void rule__GuardRule__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:948:1: ( ( '[' ) )
+            // InternalTransition.g:949:1: ( '[' )
+            {
+            // InternalTransition.g:949:1: ( '[' )
+            // InternalTransition.g:950:2: '['
+            {
+             before(grammarAccess.getGuardRuleAccess().getLeftSquareBracketKeyword_0()); 
+            match(input,18,FOLLOW_2); 
+             after(grammarAccess.getGuardRuleAccess().getLeftSquareBracketKeyword_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardRule__Group__0__Impl"
+
+
+    // $ANTLR start "rule__GuardRule__Group__1"
+    // InternalTransition.g:959:1: rule__GuardRule__Group__1 : rule__GuardRule__Group__1__Impl rule__GuardRule__Group__2 ;
+    public final void rule__GuardRule__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:963:1: ( rule__GuardRule__Group__1__Impl rule__GuardRule__Group__2 )
+            // InternalTransition.g:964:2: rule__GuardRule__Group__1__Impl rule__GuardRule__Group__2
+            {
+            pushFollow(FOLLOW_13);
+            rule__GuardRule__Group__1__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__GuardRule__Group__2();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardRule__Group__1"
+
+
+    // $ANTLR start "rule__GuardRule__Group__1__Impl"
+    // InternalTransition.g:971:1: rule__GuardRule__Group__1__Impl : ( ( rule__GuardRule__ConstraintAssignment_1 ) ) ;
+    public final void rule__GuardRule__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:975:1: ( ( ( rule__GuardRule__ConstraintAssignment_1 ) ) )
+            // InternalTransition.g:976:1: ( ( rule__GuardRule__ConstraintAssignment_1 ) )
+            {
+            // InternalTransition.g:976:1: ( ( rule__GuardRule__ConstraintAssignment_1 ) )
+            // InternalTransition.g:977:2: ( rule__GuardRule__ConstraintAssignment_1 )
+            {
+             before(grammarAccess.getGuardRuleAccess().getConstraintAssignment_1()); 
+            // InternalTransition.g:978:2: ( rule__GuardRule__ConstraintAssignment_1 )
+            // InternalTransition.g:978:3: rule__GuardRule__ConstraintAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__GuardRule__ConstraintAssignment_1();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getGuardRuleAccess().getConstraintAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardRule__Group__1__Impl"
+
+
+    // $ANTLR start "rule__GuardRule__Group__2"
+    // InternalTransition.g:986:1: rule__GuardRule__Group__2 : rule__GuardRule__Group__2__Impl ;
+    public final void rule__GuardRule__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:990:1: ( rule__GuardRule__Group__2__Impl )
+            // InternalTransition.g:991:2: rule__GuardRule__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__GuardRule__Group__2__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardRule__Group__2"
+
+
+    // $ANTLR start "rule__GuardRule__Group__2__Impl"
+    // InternalTransition.g:997:1: rule__GuardRule__Group__2__Impl : ( ']' ) ;
+    public final void rule__GuardRule__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1001:1: ( ( ']' ) )
+            // InternalTransition.g:1002:1: ( ']' )
+            {
+            // InternalTransition.g:1002:1: ( ']' )
+            // InternalTransition.g:1003:2: ']'
+            {
+             before(grammarAccess.getGuardRuleAccess().getRightSquareBracketKeyword_2()); 
+            match(input,19,FOLLOW_2); 
+             after(grammarAccess.getGuardRuleAccess().getRightSquareBracketKeyword_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardRule__Group__2__Impl"
+
+
+    // $ANTLR start "rule__TGuardRule__Group__0"
+    // InternalTransition.g:1013:1: rule__TGuardRule__Group__0 : rule__TGuardRule__Group__0__Impl rule__TGuardRule__Group__1 ;
+    public final void rule__TGuardRule__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1017:1: ( rule__TGuardRule__Group__0__Impl rule__TGuardRule__Group__1 )
+            // InternalTransition.g:1018:2: rule__TGuardRule__Group__0__Impl rule__TGuardRule__Group__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__TGuardRule__Group__0__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TGuardRule__Group__1();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TGuardRule__Group__0"
+
+
+    // $ANTLR start "rule__TGuardRule__Group__0__Impl"
+    // InternalTransition.g:1025:1: rule__TGuardRule__Group__0__Impl : ( '{' ) ;
+    public final void rule__TGuardRule__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1029:1: ( ( '{' ) )
+            // InternalTransition.g:1030:1: ( '{' )
+            {
+            // InternalTransition.g:1030:1: ( '{' )
+            // InternalTransition.g:1031:2: '{'
+            {
+             before(grammarAccess.getTGuardRuleAccess().getLeftCurlyBracketKeyword_0()); 
+            match(input,20,FOLLOW_2); 
+             after(grammarAccess.getTGuardRuleAccess().getLeftCurlyBracketKeyword_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TGuardRule__Group__0__Impl"
+
+
+    // $ANTLR start "rule__TGuardRule__Group__1"
+    // InternalTransition.g:1040:1: rule__TGuardRule__Group__1 : rule__TGuardRule__Group__1__Impl rule__TGuardRule__Group__2 ;
+    public final void rule__TGuardRule__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1044:1: ( rule__TGuardRule__Group__1__Impl rule__TGuardRule__Group__2 )
+            // InternalTransition.g:1045:2: rule__TGuardRule__Group__1__Impl rule__TGuardRule__Group__2
+            {
+            pushFollow(FOLLOW_14);
+            rule__TGuardRule__Group__1__Impl();
+
+            state._fsp--;
+
+            pushFollow(FOLLOW_2);
+            rule__TGuardRule__Group__2();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TGuardRule__Group__1"
+
+
+    // $ANTLR start "rule__TGuardRule__Group__1__Impl"
+    // InternalTransition.g:1052:1: rule__TGuardRule__Group__1__Impl : ( ( rule__TGuardRule__ConstraintAssignment_1 ) ) ;
+    public final void rule__TGuardRule__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1056:1: ( ( ( rule__TGuardRule__ConstraintAssignment_1 ) ) )
+            // InternalTransition.g:1057:1: ( ( rule__TGuardRule__ConstraintAssignment_1 ) )
+            {
+            // InternalTransition.g:1057:1: ( ( rule__TGuardRule__ConstraintAssignment_1 ) )
+            // InternalTransition.g:1058:2: ( rule__TGuardRule__ConstraintAssignment_1 )
+            {
+             before(grammarAccess.getTGuardRuleAccess().getConstraintAssignment_1()); 
+            // InternalTransition.g:1059:2: ( rule__TGuardRule__ConstraintAssignment_1 )
+            // InternalTransition.g:1059:3: rule__TGuardRule__ConstraintAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__TGuardRule__ConstraintAssignment_1();
+
+            state._fsp--;
+
+
+            }
+
+             after(grammarAccess.getTGuardRuleAccess().getConstraintAssignment_1()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TGuardRule__Group__1__Impl"
+
+
+    // $ANTLR start "rule__TGuardRule__Group__2"
+    // InternalTransition.g:1067:1: rule__TGuardRule__Group__2 : rule__TGuardRule__Group__2__Impl ;
+    public final void rule__TGuardRule__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1071:1: ( rule__TGuardRule__Group__2__Impl )
+            // InternalTransition.g:1072:2: rule__TGuardRule__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__TGuardRule__Group__2__Impl();
+
+            state._fsp--;
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TGuardRule__Group__2"
+
+
+    // $ANTLR start "rule__TGuardRule__Group__2__Impl"
+    // InternalTransition.g:1078:1: rule__TGuardRule__Group__2__Impl : ( '}' ) ;
+    public final void rule__TGuardRule__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1082:1: ( ( '}' ) )
+            // InternalTransition.g:1083:1: ( '}' )
+            {
+            // InternalTransition.g:1083:1: ( '}' )
+            // InternalTransition.g:1084:2: '}'
+            {
+             before(grammarAccess.getTGuardRuleAccess().getRightCurlyBracketKeyword_2()); 
+            match(input,21,FOLLOW_2); 
+             after(grammarAccess.getTGuardRuleAccess().getRightCurlyBracketKeyword_2()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TGuardRule__Group__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionRule__TriggersAssignment_0_0"
+    // InternalTransition.g:1094:1: rule__TransitionRule__TriggersAssignment_0_0 : ( ruleTriggerRule ) ;
+    public final void rule__TransitionRule__TriggersAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1098:1: ( ( ruleTriggerRule ) )
+            // InternalTransition.g:1099:2: ( ruleTriggerRule )
+            {
+            // InternalTransition.g:1099:2: ( ruleTriggerRule )
+            // InternalTransition.g:1100:3: ruleTriggerRule
+            {
+             before(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_0_0()); 
+            pushFollow(FOLLOW_2);
+            ruleTriggerRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__TriggersAssignment_0_0"
+
+
+    // $ANTLR start "rule__TransitionRule__TriggersAssignment_0_1_1"
+    // InternalTransition.g:1109:1: rule__TransitionRule__TriggersAssignment_0_1_1 : ( ruleTriggerRule ) ;
+    public final void rule__TransitionRule__TriggersAssignment_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1113:1: ( ( ruleTriggerRule ) )
+            // InternalTransition.g:1114:2: ( ruleTriggerRule )
+            {
+            // InternalTransition.g:1114:2: ( ruleTriggerRule )
+            // InternalTransition.g:1115:3: ruleTriggerRule
+            {
+             before(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_1_1_0()); 
+            pushFollow(FOLLOW_2);
+            ruleTriggerRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_1_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__TriggersAssignment_0_1_1"
+
+
+    // $ANTLR start "rule__TransitionRule__GuardAssignment_1"
+    // InternalTransition.g:1124:1: rule__TransitionRule__GuardAssignment_1 : ( ruleGuardRule ) ;
+    public final void rule__TransitionRule__GuardAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1128:1: ( ( ruleGuardRule ) )
+            // InternalTransition.g:1129:2: ( ruleGuardRule )
+            {
+            // InternalTransition.g:1129:2: ( ruleGuardRule )
+            // InternalTransition.g:1130:3: ruleGuardRule
+            {
+             before(grammarAccess.getTransitionRuleAccess().getGuardGuardRuleParserRuleCall_1_0()); 
+            pushFollow(FOLLOW_2);
+            ruleGuardRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getTransitionRuleAccess().getGuardGuardRuleParserRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__GuardAssignment_1"
+
+
+    // $ANTLR start "rule__TransitionRule__TguardAssignment_2"
+    // InternalTransition.g:1139:1: rule__TransitionRule__TguardAssignment_2 : ( ruleTGuardRule ) ;
+    public final void rule__TransitionRule__TguardAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1143:1: ( ( ruleTGuardRule ) )
+            // InternalTransition.g:1144:2: ( ruleTGuardRule )
+            {
+            // InternalTransition.g:1144:2: ( ruleTGuardRule )
+            // InternalTransition.g:1145:3: ruleTGuardRule
+            {
+             before(grammarAccess.getTransitionRuleAccess().getTguardTGuardRuleParserRuleCall_2_0()); 
+            pushFollow(FOLLOW_2);
+            ruleTGuardRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getTransitionRuleAccess().getTguardTGuardRuleParserRuleCall_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__TguardAssignment_2"
+
+
+    // $ANTLR start "rule__TransitionRule__EffectBodyAssignment_3_1"
+    // InternalTransition.g:1154:1: rule__TransitionRule__EffectBodyAssignment_3_1 : ( RULE_STRING ) ;
+    public final void rule__TransitionRule__EffectBodyAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1158:1: ( ( RULE_STRING ) )
+            // InternalTransition.g:1159:2: ( RULE_STRING )
+            {
+            // InternalTransition.g:1159:2: ( RULE_STRING )
+            // InternalTransition.g:1160:3: RULE_STRING
+            {
+             before(grammarAccess.getTransitionRuleAccess().getEffectBodySTRINGTerminalRuleCall_3_1_0()); 
+            match(input,RULE_STRING,FOLLOW_2); 
+             after(grammarAccess.getTransitionRuleAccess().getEffectBodySTRINGTerminalRuleCall_3_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionRule__EffectBodyAssignment_3_1"
+
+
+    // $ANTLR start "rule__TriggerRule__PortAssignment_1"
+    // InternalTransition.g:1169:1: rule__TriggerRule__PortAssignment_1 : ( ( ruleFQN ) ) ;
+    public final void rule__TriggerRule__PortAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1173:1: ( ( ( ruleFQN ) ) )
+            // InternalTransition.g:1174:2: ( ( ruleFQN ) )
+            {
+            // InternalTransition.g:1174:2: ( ( ruleFQN ) )
+            // InternalTransition.g:1175:3: ( ruleFQN )
+            {
+             before(grammarAccess.getTriggerRuleAccess().getPortNamedElementCrossReference_1_0()); 
+            // InternalTransition.g:1176:3: ( ruleFQN )
+            // InternalTransition.g:1177:4: ruleFQN
+            {
+             before(grammarAccess.getTriggerRuleAccess().getPortNamedElementFQNParserRuleCall_1_0_1()); 
+            pushFollow(FOLLOW_2);
+            ruleFQN();
+
+            state._fsp--;
+
+             after(grammarAccess.getTriggerRuleAccess().getPortNamedElementFQNParserRuleCall_1_0_1()); 
+
+            }
+
+             after(grammarAccess.getTriggerRuleAccess().getPortNamedElementCrossReference_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TriggerRule__PortAssignment_1"
+
+
+    // $ANTLR start "rule__TriggerRule__EventAssignment_2"
+    // InternalTransition.g:1188:1: rule__TriggerRule__EventAssignment_2 : ( ruleEventRule ) ;
+    public final void rule__TriggerRule__EventAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1192:1: ( ( ruleEventRule ) )
+            // InternalTransition.g:1193:2: ( ruleEventRule )
+            {
+            // InternalTransition.g:1193:2: ( ruleEventRule )
+            // InternalTransition.g:1194:3: ruleEventRule
+            {
+             before(grammarAccess.getTriggerRuleAccess().getEventEventRuleParserRuleCall_2_0()); 
+            pushFollow(FOLLOW_2);
+            ruleEventRule();
+
+            state._fsp--;
+
+             after(grammarAccess.getTriggerRuleAccess().getEventEventRuleParserRuleCall_2_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TriggerRule__EventAssignment_2"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__ParametersAssignment_2_0"
+    // InternalTransition.g:1203:1: rule__ReceiveSignalEventRule__ParametersAssignment_2_0 : ( ( ruleFQN ) ) ;
+    public final void rule__ReceiveSignalEventRule__ParametersAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1207:1: ( ( ( ruleFQN ) ) )
+            // InternalTransition.g:1208:2: ( ( ruleFQN ) )
+            {
+            // InternalTransition.g:1208:2: ( ( ruleFQN ) )
+            // InternalTransition.g:1209:3: ( ruleFQN )
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_0_0()); 
+            // InternalTransition.g:1210:3: ( ruleFQN )
+            // InternalTransition.g:1211:4: ruleFQN
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyFQNParserRuleCall_2_0_0_1()); 
+            pushFollow(FOLLOW_2);
+            ruleFQN();
+
+            state._fsp--;
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyFQNParserRuleCall_2_0_0_1()); 
+
+            }
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_0_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__ParametersAssignment_2_0"
+
+
+    // $ANTLR start "rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1"
+    // InternalTransition.g:1222:1: rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1 : ( ( ruleFQN ) ) ;
+    public final void rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1226:1: ( ( ( ruleFQN ) ) )
+            // InternalTransition.g:1227:2: ( ( ruleFQN ) )
+            {
+            // InternalTransition.g:1227:2: ( ( ruleFQN ) )
+            // InternalTransition.g:1228:3: ( ruleFQN )
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_1_1_0()); 
+            // InternalTransition.g:1229:3: ( ruleFQN )
+            // InternalTransition.g:1230:4: ruleFQN
+            {
+             before(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyFQNParserRuleCall_2_1_1_0_1()); 
+            pushFollow(FOLLOW_2);
+            ruleFQN();
+
+            state._fsp--;
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyFQNParserRuleCall_2_1_1_0_1()); 
+
+            }
+
+             after(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_1_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ReceiveSignalEventRule__ParametersAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__GuardRule__ConstraintAssignment_1"
+    // InternalTransition.g:1241:1: rule__GuardRule__ConstraintAssignment_1 : ( RULE_STRING ) ;
+    public final void rule__GuardRule__ConstraintAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1245:1: ( ( RULE_STRING ) )
+            // InternalTransition.g:1246:2: ( RULE_STRING )
+            {
+            // InternalTransition.g:1246:2: ( RULE_STRING )
+            // InternalTransition.g:1247:3: RULE_STRING
+            {
+             before(grammarAccess.getGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0()); 
+            match(input,RULE_STRING,FOLLOW_2); 
+             after(grammarAccess.getGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardRule__ConstraintAssignment_1"
+
+
+    // $ANTLR start "rule__TGuardRule__ConstraintAssignment_1"
+    // InternalTransition.g:1256:1: rule__TGuardRule__ConstraintAssignment_1 : ( RULE_STRING ) ;
+    public final void rule__TGuardRule__ConstraintAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalTransition.g:1260:1: ( ( RULE_STRING ) )
+            // InternalTransition.g:1261:2: ( RULE_STRING )
+            {
+            // InternalTransition.g:1261:2: ( RULE_STRING )
+            // InternalTransition.g:1262:3: RULE_STRING
+            {
+             before(grammarAccess.getTGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0()); 
+            match(input,RULE_STRING,FOLLOW_2); 
+             after(grammarAccess.getTGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0()); 
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TGuardRule__ConstraintAssignment_1"
+
+    // Delegated rules
+
+
+ 
+
+    public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000000000144000L});
+    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000002002L});
+    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000001800L});
+    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000001802L});
+    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000010000L});
+    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000020010L});
+    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000080000L});
+    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000200000L});
+
+}
\ No newline at end of file
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/src/.gitignore
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/xtend-gen/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/xtend-gen/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ide/xtend-gen/.gitignore
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.classpath b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.project b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.project
new file mode 100644
index 0000000..473e4b1
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.papyrus.xtext.transition.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.settings/org.eclipse.core.resources.prefs b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.settings/org.eclipse.jdt.core.prefs b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.settings/org.eclipse.m2e.core.prefs b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/META-INF/MANIFEST.MF b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0c2fb81
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.papyrus.xtext.transition.ui; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.papyrus.xtext.transition,
+ org.eclipse.efm.papyrus.xtext.transition.ide,
+ org.eclipse.xtext.ui,
+ org.eclipse.xtext.ui.shared,
+ org.eclipse.xtext.ui.codetemplates.ui,
+ org.eclipse.ui.editors;bundle-version="3.5.0",
+ org.eclipse.ui.ide;bundle-version="3.5.0",
+ org.eclipse.ui,
+ org.eclipse.compare,
+ org.eclipse.xtext.builder,
+ org.eclipse.xtend.lib;resolution:=optional,
+ org.eclipse.xtext.xbase.lib,
+ org.eclipse.papyrus.infra.core.log;bundle-version="1.1.3",
+ org.eclipse.uml2.uml,
+ org.eclipse.papyrus.uml.xtext.integration.ui,
+ org.eclipse.papyrus.infra.emf,
+ org.eclipse.papyrus.infra.core;bundle-version="1.1.3",
+ org.eclipse.efm.formalml;bundle-version="[0.0.1,1.0.0)"
+Import-Package: org.apache.log4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.papyrus.xtext.ui.quickfix,
+ org.eclipse.efm.papyrus.xtext.transition.ui.internal,
+ org.eclipse.efm.papyrus.xtext.ui.contentassist
+Bundle-Activator: org.eclipse.efm.papyrus.xtext.transition.ui.internal.TransitionActivator
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/build.properties b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/build.properties
new file mode 100644
index 0000000..591c651
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/,\
+               plugin.xml
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/plugin.xml b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/plugin.xml
new file mode 100644
index 0000000..5097a02
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/plugin.xml
@@ -0,0 +1,436 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<plugin>
+	<extension
+		point="org.eclipse.ui.editors">
+		<editor
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+			contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+			default="true"
+			extensions="fmltransition"
+			id="org.eclipse.efm.papyrus.xtext.Transition"
+			name="Transition Editor">
+		</editor>
+	</extension>
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+			commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+			commandId="org.eclipse.efm.papyrus.xtext.Transition.validate">
+		<activeWhen>
+			<reference
+					definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened">
+			</reference>
+		</activeWhen>
+		</handler>
+		<!-- copy qualified name -->
+		<handler
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened" />
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+			<activeWhen>
+				<and>
+					<reference definitionId="org.eclipse.efm.papyrus.xtext.Transition.XtextEditor.opened" />
+					<iterate>
+						<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+					</iterate>
+				</and>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened">
+			<and>
+				<reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+						value="org.eclipse.efm.papyrus.xtext.Transition" 
+						forcePluginActivation="true"/>
+				</with>		
+			</and>
+		</definition>
+		<definition id="org.eclipse.efm.papyrus.xtext.Transition.XtextEditor.opened">
+			<and>
+				<reference definitionId="isXtextEditorActive"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+						value="org.eclipse.efm.papyrus.xtext.Transition" 
+						forcePluginActivation="true"/>
+				</with>		
+			</and>
+		</definition>
+	</extension>
+	<extension
+			point="org.eclipse.ui.preferencePages">
+		<page
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.papyrus.xtext.Transition"
+			name="Transition">
+			<keywordReference id="org.eclipse.efm.papyrus.xtext.ui.keyword_Transition"/>
+		</page>
+		<page
+			category="org.eclipse.efm.papyrus.xtext.Transition"
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+			id="org.eclipse.efm.papyrus.xtext.Transition.coloring"
+			name="Syntax Coloring">
+			<keywordReference id="org.eclipse.efm.papyrus.xtext.ui.keyword_Transition"/>
+		</page>
+		<page
+			category="org.eclipse.efm.papyrus.xtext.Transition"
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+			id="org.eclipse.efm.papyrus.xtext.Transition.templates"
+			name="Templates">
+			<keywordReference id="org.eclipse.efm.papyrus.xtext.ui.keyword_Transition"/>
+		</page>
+	</extension>
+	<extension
+			point="org.eclipse.ui.propertyPages">
+		<page
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.papyrus.xtext.Transition"
+			name="Transition">
+			<keywordReference id="org.eclipse.efm.papyrus.xtext.ui.keyword_Transition"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension
+		point="org.eclipse.ui.keywords">
+		<keyword
+			id="org.eclipse.efm.papyrus.xtext.ui.keyword_Transition"
+			label="Transition"/>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+	<command
+			description="Trigger expensive validation"
+			id="org.eclipse.efm.papyrus.xtext.Transition.validate"
+			name="Validate">
+	</command>
+	<!-- copy qualified name -->
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			 <command
+				 commandId="org.eclipse.efm.papyrus.xtext.Transition.validate"
+				 style="push"
+				 tooltip="Trigger expensive validation">
+			<visibleWhen checkEnabled="false">
+				<reference
+					definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened">
+				</reference>
+			</visibleWhen>
+		</command>
+		</menuContribution>
+		<!-- copy qualified name -->
+		<menuContribution locationURI="popup:#TextEditorContext?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName" 
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="menu:edit?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName" 
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<and>
+						<reference definitionId="org.eclipse.efm.papyrus.xtext.Transition.XtextEditor.opened" />
+						<iterate>
+							<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+						</iterate>
+					</and>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?endof=group.find">
+			<command commandId="org.eclipse.xtext.ui.editor.FindReferences">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+			commandId="org.eclipse.xtext.ui.editor.FindReferences">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- adding resource factories -->
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="fmltransition">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="fmltransition">
+		</resourceServiceProvider>
+	</extension>
+	<!-- marker definitions for org.eclipse.efm.papyrus.xtext.Transition -->
+	<extension
+			id="transition.check.fast"
+			name="Transition Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.fast"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="transition.check.normal"
+			name="Transition Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.normal"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="transition.check.expensive"
+			name="Transition Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.expensive"/>
+		<persistent value="true"/>
+	</extension>
+	<extension point="org.eclipse.xtext.builder.participant">
+		<participant
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+			fileExtensions="fmltransition"/>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.papyrus.xtext.Transition"
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.papyrus.xtext.Transition.compiler.preferencePage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.papyrus.xtext.ui.keyword_Transition"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.propertyPages">
+		<page
+			category="org.eclipse.efm.papyrus.xtext.Transition"
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.papyrus.xtext.Transition.compiler.propertyPage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.papyrus.xtext.ui.keyword_Transition"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?after=xtext.ui.openDeclaration">
+			<command
+				commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand"
+				id="org.eclipse.efm.papyrus.xtext.Transition.OpenGeneratedCode"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"
+			commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened" />
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- Quick Outline -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+		<command
+			description="Open the quick outline."
+			id="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+			name="Quick Outline">
+		</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.open">
+			<command commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+				style="push"
+				tooltip="Open Quick Outline">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<!-- quickfix marker resolution generator for org.eclipse.efm.papyrus.xtext.Transition -->
+	<extension
+			point="org.eclipse.ui.ide.markerResolution">
+		<markerResolutionGenerator
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.papyrus.xtext.transition.ui.transition.check.fast">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.papyrus.xtext.transition.ui.transition.check.normal">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.papyrus.xtext.transition.ui.transition.check.expensive">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+	</extension>
+	<!-- Rename Refactoring -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
+			commandId="org.eclipse.xtext.ui.refactoring.RenameElement">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			<command commandId="org.eclipse.xtext.ui.refactoring.RenameElement"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference
+						definitionId="org.eclipse.efm.papyrus.xtext.Transition.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.papyrus.xtext.Transition"
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+			id="org.eclipse.efm.papyrus.xtext.Transition.refactoring"
+			name="Refactoring">
+			<keywordReference id="org.eclipse.efm.papyrus.xtext.ui.keyword_Transition"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.compare.contentViewers">
+		<viewer id="org.eclipse.efm.papyrus.xtext.Transition.compare.contentViewers"
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="fmltransition">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.compare.contentMergeViewers">
+		<viewer id="org.eclipse.efm.papyrus.xtext.Transition.compare.contentMergeViewers"
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="fmltransition" label="Transition Compare">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider id="org.eclipse.efm.papyrus.xtext.Transition.editors.documentProviders"
+			class="org.eclipse.efm.papyrus.xtext.ui.TransitionExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+			extensions="fmltransition">
+		</provider>
+	</extension>
+	<extension point="org.eclipse.team.core.fileTypes">
+		<fileTypes
+			extension="fmltransition"
+			type="text">
+		</fileTypes>
+	</extension>
+ <extension
+       point="org.eclipse.papyrus.extensionpoints.editors.DirectEditor">
+    <DirectEditor
+          language="Formal Modeling Advanced Transition Editor"
+          objectToEdit="org.eclipse.uml2.uml.Transition">
+       <popupeditor
+             editorConfiguration="org.eclipse.efm.papyrus.xtext.ui.contibution.TransitionEditorConfigurationContribution">
+       </popupeditor>
+       <Priority
+             name="High">
+       </Priority>
+    </DirectEditor>
+ </extension>
+</plugin>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/pom.xml b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/pom.xml
new file mode 100644
index 0000000..89f659c
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.transition</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.papyrus.xtext.transition.ui</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.papyrus.xtext.transition.ui</name>
+	<description>This plug-in contains the UML/Transition' Xtext based editor UI.</description>
+	
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/transition/ui/internal/TransitionActivator.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/transition/ui/internal/TransitionActivator.java
new file mode 100644
index 0000000..bea0a37
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/transition/ui/internal/TransitionActivator.java
@@ -0,0 +1,102 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.transition.ui.internal;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import java.util.Collections;
+import java.util.Map;
+import org.apache.log4j.Logger;
+import org.eclipse.efm.papyrus.xtext.TransitionRuntimeModule;
+import org.eclipse.efm.papyrus.xtext.ui.TransitionUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.ui.shared.SharedStateModule;
+import org.eclipse.xtext.util.Modules2;
+import org.osgi.framework.BundleContext;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass. 
+ */
+public class TransitionActivator extends AbstractUIPlugin {
+
+	public static final String ORG_ECLIPSE_EFM_PAPYRUS_XTEXT_TRANSITION = "org.eclipse.efm.papyrus.xtext.Transition";
+	
+	private static final Logger logger = Logger.getLogger(TransitionActivator.class);
+	
+	private static TransitionActivator INSTANCE;
+	
+	private Map<String, Injector> injectors = Collections.synchronizedMap(Maps.<String, Injector> newHashMapWithExpectedSize(1));
+	
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		INSTANCE = this;
+	}
+	
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		injectors.clear();
+		INSTANCE = null;
+		super.stop(context);
+	}
+	
+	public static TransitionActivator getInstance() {
+		return INSTANCE;
+	}
+	
+	public Injector getInjector(String language) {
+		synchronized (injectors) {
+			Injector injector = injectors.get(language);
+			if (injector == null) {
+				injectors.put(language, injector = createInjector(language));
+			}
+			return injector;
+		}
+	}
+	
+	protected Injector createInjector(String language) {
+		try {
+			Module runtimeModule = getRuntimeModule(language);
+			Module sharedStateModule = getSharedStateModule();
+			Module uiModule = getUiModule(language);
+			Module mergedModule = Modules2.mixin(runtimeModule, sharedStateModule, uiModule);
+			return Guice.createInjector(mergedModule);
+		} catch (Exception e) {
+			logger.error("Failed to create injector for " + language);
+			logger.error(e.getMessage(), e);
+			throw new RuntimeException("Failed to create injector for " + language, e);
+		}
+	}
+	
+	protected Module getRuntimeModule(String grammar) {
+		if (ORG_ECLIPSE_EFM_PAPYRUS_XTEXT_TRANSITION.equals(grammar)) {
+			return new TransitionRuntimeModule();
+		}
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getUiModule(String grammar) {
+		if (ORG_ECLIPSE_EFM_PAPYRUS_XTEXT_TRANSITION.equals(grammar)) {
+			return new TransitionUiModule(this);
+		}
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getSharedStateModule() {
+		return new SharedStateModule();
+	}
+	
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/ui/AbstractTransitionUiModule.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/ui/AbstractTransitionUiModule.java
new file mode 100644
index 0000000..80e1d13
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/ui/AbstractTransitionUiModule.java
@@ -0,0 +1,289 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ui;
+
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import org.eclipse.compare.IViewerCreator;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr.PartialTransitionContentAssistParser;
+import org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr.TransitionParser;
+import org.eclipse.efm.papyrus.xtext.ide.contentassist.antlr.internal.InternalTransitionLexer;
+import org.eclipse.efm.papyrus.xtext.ui.contentassist.TransitionProposalProvider;
+import org.eclipse.efm.papyrus.xtext.ui.labeling.TransitionDescriptionLabelProvider;
+import org.eclipse.efm.papyrus.xtext.ui.labeling.TransitionLabelProvider;
+import org.eclipse.efm.papyrus.xtext.ui.outline.TransitionOutlineTreeProvider;
+import org.eclipse.efm.papyrus.xtext.ui.quickfix.TransitionQuickfixProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.builder.BuilderParticipant;
+import org.eclipse.xtext.builder.EclipseOutputConfigurationProvider;
+import org.eclipse.xtext.builder.IXtextBuilderParticipant;
+import org.eclipse.xtext.builder.builderState.IBuilderState;
+import org.eclipse.xtext.builder.clustering.CurrentDescriptions;
+import org.eclipse.xtext.builder.impl.PersistentDataAwareDirtyResource;
+import org.eclipse.xtext.builder.nature.NatureAddingEditorCallback;
+import org.eclipse.xtext.builder.preferences.BuilderPreferenceAccess;
+import org.eclipse.xtext.generator.IContextualOutputConfigurationProvider;
+import org.eclipse.xtext.ide.LexerIdeBindings;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.IContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.service.SingletonBinding;
+import org.eclipse.xtext.ui.DefaultUiModule;
+import org.eclipse.xtext.ui.codetemplates.ui.AccessibleCodetemplatesActivator;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.PartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.AdvancedTemplatesPreferencePage;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.TemplatesLanguageConfiguration;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistrar;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistry;
+import org.eclipse.xtext.ui.compare.DefaultViewerCreator;
+import org.eclipse.xtext.ui.editor.DocumentBasedDirtyResource;
+import org.eclipse.xtext.ui.editor.IXtextEditorCallback;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.FQNPrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.IContentProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.IProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.AntlrProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.DelegatingContentAssistContextFactory;
+import org.eclipse.xtext.ui.editor.outline.IOutlineTreeProvider;
+import org.eclipse.xtext.ui.editor.outline.impl.IOutlineTreeStructureProvider;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider;
+import org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage;
+import org.eclipse.xtext.ui.refactoring.IDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.IReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.IRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.IRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.ui.DefaultRenameSupport;
+import org.eclipse.xtext.ui.refactoring.ui.IRenameSupport;
+import org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferences;
+import org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider;
+import org.eclipse.xtext.ui.shared.Access;
+
+/**
+ * Manual modifications go to {@link TransitionUiModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractTransitionUiModule extends DefaultUiModule {
+
+	public AbstractTransitionUiModule(AbstractUIPlugin plugin) {
+		super(plugin);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ImplicitFragment
+	public Provider<IAllContainersState> provideIAllContainersState() {
+		return Access.getJavaProjectsState();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IProposalConflictHelper> bindIProposalConflictHelper() {
+		return AntlrProposalConflictHelper.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureContentAssistLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.CONTENT_ASSIST))
+			.to(InternalTransitionLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureHighlightingLexer(Binder binder) {
+		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(org.eclipse.efm.papyrus.xtext.parser.antlr.internal.InternalTransitionLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureHighlightingTokenDefProvider(Binder binder) {
+		binder.bind(ITokenDefProvider.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(AntlrTokenDefProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ContentAssistContext.Factory> bindContentAssistContext$Factory() {
+		return DelegatingContentAssistContextFactory.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IContentAssistParser> bindIContentAssistParser() {
+		return TransitionParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureContentAssistLexerProvider(Binder binder) {
+		binder.bind(InternalTransitionLexer.class).toProvider(LexerProvider.create(InternalTransitionLexer.class));
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+	public Class<? extends PrefixMatcher> bindPrefixMatcher() {
+		return FQNPrefixMatcher.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+	public Class<? extends IDependentElementsCalculator> bindIDependentElementsCalculator() {
+		return DefaultDependentElementsCalculator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsBuilderScope(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.NAMED_BUILDER_SCOPE)).to(CurrentDescriptions.ResourceSetAware.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IXtextEditorCallback> bindIXtextEditorCallback() {
+		return NatureAddingEditorCallback.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContextualOutputConfigurationProvider> bindIContextualOutputConfigurationProvider() {
+		return EclipseOutputConfigurationProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsPersisted(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(IBuilderState.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends DocumentBasedDirtyResource> bindDocumentBasedDirtyResource() {
+		return PersistentDataAwareDirtyResource.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public Class<? extends IXtextBuilderParticipant> bindIXtextBuilderParticipant() {
+		return BuilderParticipant.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public IWorkspaceRoot bindIWorkspaceRootToInstance() {
+		return ResourcesPlugin.getWorkspace().getRoot();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public void configureBuilderPreferenceStoreInitializer(Binder binder) {
+		binder.bind(IPreferenceStoreInitializer.class)
+			.annotatedWith(Names.named("builderPreferenceInitializer"))
+			.to(BuilderPreferenceAccess.Initializer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public Class<? extends ILabelProvider> bindILabelProvider() {
+		return TransitionLabelProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public void configureResourceUIServiceLabelProvider(Binder binder) {
+		binder.bind(ILabelProvider.class).annotatedWith(ResourceServiceDescriptionLabelProvider.class).to(TransitionDescriptionLabelProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeProvider> bindIOutlineTreeProvider() {
+		return TransitionOutlineTreeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
+		return TransitionOutlineTreeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.quickfix.QuickfixProviderFragment2
+	public Class<? extends IssueResolutionProvider> bindIssueResolutionProvider() {
+		return TransitionQuickfixProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.contentAssist.ContentAssistFragment2
+	public Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
+		return TransitionProposalProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameStrategy> bindIRenameStrategy() {
+		return DefaultRenameStrategy.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IReferenceUpdater> bindIReferenceUpdater() {
+		return DefaultReferenceUpdater.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public void configureIPreferenceStoreInitializer(Binder binder) {
+		binder.bind(IPreferenceStoreInitializer.class)
+			.annotatedWith(Names.named("RefactoringPreferences"))
+			.to(RefactoringPreferences.Initializer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
+		return DefaultRenameRefactoringProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameSupport.Factory> bindIRenameSupport$Factory() {
+		return DefaultRenameSupport.Factory.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<TemplatesLanguageConfiguration> provideTemplatesLanguageConfiguration() {
+		return AccessibleCodetemplatesActivator.getTemplatesLanguageConfigurationProvider();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<LanguageRegistry> provideLanguageRegistry() {
+		return AccessibleCodetemplatesActivator.getLanguageRegistry();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends LanguageRegistrar> bindLanguageRegistrar() {
+		return LanguageRegistrar.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends XtextTemplatePreferencePage> bindXtextTemplatePreferencePage() {
+		return AdvancedTemplatesPreferencePage.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistParser> bindIPartialEditingContentAssistParser() {
+		return PartialTransitionContentAssistParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistContextFactory> bindIPartialEditingContentAssistContextFactory() {
+		return PartialEditingContentAssistContextFactory.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.compare.CompareFragment2
+	public Class<? extends IViewerCreator> bindIViewerCreator() {
+		return DefaultViewerCreator.class;
+	}
+	
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/ui/TransitionExecutableExtensionFactory.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/ui/TransitionExecutableExtensionFactory.java
new file mode 100644
index 0000000..1b206d9
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/ui/TransitionExecutableExtensionFactory.java
@@ -0,0 +1,36 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ui;
+
+import com.google.inject.Injector;
+import org.eclipse.efm.papyrus.xtext.transition.ui.internal.TransitionActivator;
+import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
+import org.osgi.framework.Bundle;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass. 
+ */
+public class TransitionExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
+
+	@Override
+	protected Bundle getBundle() {
+		return TransitionActivator.getInstance().getBundle();
+	}
+	
+	@Override
+	protected Injector getInjector() {
+		return TransitionActivator.getInstance().getInjector(TransitionActivator.ORG_ECLIPSE_EFM_PAPYRUS_XTEXT_TRANSITION);
+	}
+	
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/ui/contentassist/AbstractTransitionProposalProvider.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/ui/contentassist/AbstractTransitionProposalProvider.java
new file mode 100644
index 0000000..026a23a
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src-gen/org/eclipse/efm/papyrus/xtext/ui/contentassist/AbstractTransitionProposalProvider.java
@@ -0,0 +1,79 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ui.contentassist;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+
+/**
+ * Represents a generated, default implementation of superclass {@link TerminalsProposalProvider}.
+ * Methods are dynamically dispatched on the first parameter, i.e., you can override them 
+ * with a more concrete subtype. 
+ */
+public abstract class AbstractTransitionProposalProvider extends TerminalsProposalProvider {
+
+	public void completeTransitionRule_Triggers(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionRule_Guard(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionRule_Tguard(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionRule_EffectBody(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTriggerRule_Port(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTriggerRule_Event(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeReceiveSignalEventRule_Parameters(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeGuardRule_Constraint(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTGuardRule_Constraint(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+
+	public void complete_TransitionRule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_FQN(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TriggerRule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EventRule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ReceiveSignalEventRule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_GuardRule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TGuardRule(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/TransitionUiModule.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/TransitionUiModule.xtend
new file mode 100644
index 0000000..ae7efa4
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/TransitionUiModule.xtend
@@ -0,0 +1,22 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ui
+
+import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
+
+/**
+ * Use this class to register components to be used within the Eclipse IDE.
+ */
+@FinalFieldsConstructor
+class TransitionUiModule extends AbstractTransitionUiModule {
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/contentassist/TransitionProposalProvider.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/contentassist/TransitionProposalProvider.xtend
new file mode 100644
index 0000000..f4d070c
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/contentassist/TransitionProposalProvider.xtend
@@ -0,0 +1,21 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ui.contentassist
+
+
+/**
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#content-assist
+ * on how to customize the content assistant.
+ */
+class TransitionProposalProvider extends AbstractTransitionProposalProvider {
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/contibution/TransitionEditorConfigurationContribution.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/contibution/TransitionEditorConfigurationContribution.java
new file mode 100644
index 0000000..5a4082f
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/contibution/TransitionEditorConfigurationContribution.java
@@ -0,0 +1,298 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Xavier ZEITOUN (CEA LIST) xavier.zeitoun@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************/
+
+package org.eclipse.efm.papyrus.xtext.ui.contibution;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.efm.formalml.util.PrintingUtil;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionRule;
+import org.eclipse.efm.papyrus.xtext.transition.TriggerRule;
+import org.eclipse.efm.papyrus.xtext.transition.ui.internal.TransitionActivator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature.Setting;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
+import org.eclipse.papyrus.extensionpoints.editors.configuration.ICustomDirectEditorConfiguration;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.Activator;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.uml.xtext.integration.DefaultXtextDirectEditorConfiguration;
+import org.eclipse.swt.SWT;
+import org.eclipse.uml2.common.util.UML2Util;
+import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Event;
+import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.OpaqueBehavior;
+import org.eclipse.uml2.uml.OpaqueExpression;
+import org.eclipse.uml2.uml.Package;
+import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Signal;
+import org.eclipse.uml2.uml.Transition;
+import org.eclipse.uml2.uml.Trigger;
+import org.eclipse.uml2.uml.UMLFactory;
+
+import com.google.inject.Injector;
+
+public class TransitionEditorConfigurationContribution
+		extends DefaultXtextDirectEditorConfiguration
+		implements ICustomDirectEditorConfiguration {
+	private static final String EMPTY = ""; //$NON-NLS-1$
+	private final static String EVENTS = "events"; //$NON-NLS-1$
+
+	/**
+	 * Override to change style to {@link SWT}.MULTI
+	 */
+	@Override
+	public int getStyle() {
+		return SWT.MULTI | SWT.WRAP;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.papyrus.infra.gmfdiag.xtext.glue.PopupEditorConfiguration#getTextToEdit(java.lang.Object)
+	 */
+	@SuppressWarnings("nls")
+	@Override
+	public String getTextToEdit(Object editedObject) {
+		if (editedObject instanceof Transition) {
+
+			return PrintingUtil.printTransition((Transition)editedObject);
+		}
+
+		return "not a valid DTransition";
+	}
+
+
+	/**
+	 * @author CEA LIST
+	 *
+	 *         A command for updating the context UML model
+	 */
+	public class UpdateUMLTransitionCommand extends AbstractTransactionalCommand {
+
+		private static final String ANY = "any"; //$NON-NLS-1$
+
+		private static final String NATURAL_LANGUAGE = "Natural language"; //$NON-NLS-1$
+
+		private final Transition transition;
+
+		private final TransitionRule transitionRuleObject;
+
+		private List<Trigger> newTriggers = new ArrayList<Trigger>();
+
+		private Constraint newConstraint = null;
+
+		/*
+		 * (non-Javadoc)
+		 *
+		 * @see
+		 * org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand#doExecuteWithResult(org.eclipse.core.runtime.IProgressMonitor
+		 * , org.eclipse.core.runtime.IAdaptable)
+		 */
+		@Override
+		protected CommandResult doExecuteWithResult(IProgressMonitor arg0, IAdaptable arg1) throws ExecutionException {
+			String oldBody = null;
+			// - Events associated with triggers of this transition
+			for (Trigger t : transition.getTriggers()) {
+				Event e = t.getEvent();
+				t.setEvent(null);
+				if(e!=null){
+					Collection<Setting> set = UML2Util.getNonNavigableInverseReferences(e);
+					if (UML2Util.getNonNavigableInverseReferences(e).size() <= 1) {
+						// no trigger is referencing the event any more, delete call event
+						e.destroy();
+					}
+				}
+			}
+			// - Triggers owned by this transition
+			transition.getTriggers().removeAll(transition.getTriggers());
+			// - Guard associated with the transition
+			Constraint guard = transition.getGuard();
+			transition.setGuard(null);
+			if (guard != null) {
+				guard.destroy();
+			}
+
+			// ////////////////////////////////////////////////////////////////////////////////////////////////
+			// Then extract any relevant information from the TransitionRuleObject, and update the Transition
+			// ////////////////////////////////////////////////////////////////////////////////////////////////
+
+			// Create the new triggers
+			if (transitionRuleObject != null) {
+				if (transitionRuleObject.getTriggers() != null) {
+//					int i=1;
+					for (TriggerRule triggerRule : transitionRuleObject.getTriggers()) {
+						Trigger newTrigger = UMLFactory.eINSTANCE.createTrigger();
+						NamedElement element = triggerRule.getPort();
+						if( element instanceof Port ) {
+							newTrigger.getPorts().add((Port)(triggerRule.getPort()));
+							this.newTriggers.add(newTrigger);
+
+//							EventRule eventRule = triggerRule.getEvent();
+//							Event newEvent = createDiversityEvent(eventRule);
+//							newTrigger.setEvent(newEvent);
+//							newTrigger.setName("Trigger"+i);
+						}
+						else if( element instanceof Signal ) {
+							// TODO by BB
+						}
+
+//						i++;
+					}
+					transition.getTriggers().addAll(this.newTriggers);
+				}
+				// Create the new constraint
+				if (transitionRuleObject.getGuard() != null && transitionRuleObject.getGuard().getConstraint() != null) {
+					this.newConstraint = transition.createGuard(EMPTY);
+					OpaqueExpression guardSpecification = UMLFactory.eINSTANCE.createOpaqueExpression();
+					guardSpecification.getLanguages().add(NATURAL_LANGUAGE);
+					guardSpecification.getBodies().add(EMPTY + transitionRuleObject.getGuard().getConstraint());
+					this.newConstraint.setSpecification(guardSpecification);
+					this.newConstraint.setName("guard");
+				}
+
+				boolean hasEffectBody= transitionRuleObject.getEffectBody()!=null;
+				if(transition.getEffect() instanceof OpaqueBehavior)
+					oldBody = ((OpaqueBehavior)transition.getEffect()).getBodies().get(0);
+
+				if ((!hasEffectBody) || !(transitionRuleObject.getEffectBody().equals(oldBody))) {
+					// delete owned effect behavior
+					Behavior effect = transition.getEffect();
+					transition.setEffect(null);
+					if (effect != null) {
+						effect.destroy();
+					}
+				}
+
+				// Create the new behavior
+				if (hasEffectBody) {
+					if (transition.getEffect() == null) {
+						// behavior does exist yet => create
+						Behavior newEffectBehavior = createXLIAOpaqueBehavior(transitionRuleObject.getEffectBody());
+						transition.setEffect(newEffectBehavior);
+
+					}
+				}
+			} else {
+				// no effect, remove it.
+				Behavior effect = transition.getEffect();
+				transition.setEffect(null);
+				if (effect != null) {
+					effect.destroy();
+				}
+			}
+
+			return CommandResult.newOKCommandResult(transition);
+		}
+
+//		private Event createDiversityEvent(EventRule eventRule) {
+//			AnyReceiveEvent anyEvent = UMLFactory.eINSTANCE.createAnyReceiveEvent();
+//			getEventPackage().getPackagedElements().add(anyEvent);
+//			int dEventCount = getDEventCount();
+//			anyEvent.setName("DivEvent"+dEventCount);
+//			StereotypeApplicationHelper stereotypeApplicationHelper = StereotypeApplicationHelper.getInstance(null);
+//			ReceiveAnyEvent e = (ReceiveAnyEvent) stereotypeApplicationHelper.applyStereotype(anyEvent, DiversityPackage.eINSTANCE.getReceiveEvent());
+//			e.getParameters().addAll(((ReceiveSignalEventRule)eventRule).getParameters());
+//			return anyEvent;
+//		}
+//
+//		private int getDEventCount() {
+//			Package eventPackage = getEventPackage();
+//			int count = 0;
+//			for(PackageableElement e : eventPackage.getPackagedElements()){
+//				if(DiversityStereotype.getReceiveEvent(e)!=null) {
+//					count++;
+//				}
+//			}
+//			return count;
+//		}
+
+		private Behavior createXLIAOpaqueBehavior(String effectBody) {
+			OpaqueBehavior b = UMLFactory.eINSTANCE.createOpaqueBehavior();
+			b.getLanguages().add("XLIA");
+			b.getBodies().add(effectBody);
+			b.setName("effect");
+			return b;
+		}
+
+		/**
+		 * put events in a sub-directory of the nearest package
+		 *
+		 * @return the resulting package
+		 */
+		protected Package getEventPackage() {
+			Package np = transition.getNearestPackage();
+			for (int i = 0;; i++) {
+				String name = EVENTS;
+				if (i > 0) {
+					name += i;
+				}
+				PackageableElement ep = np.getPackagedElement(name);
+				if (ep instanceof Package) {
+					return (Package) ep;
+				} else if (ep == null) {
+					// does not exist, create
+					return np.createNestedPackage(name);
+				}
+				// exists, but is not a package, try again with different name ...
+			}
+		}
+
+
+		public UpdateUMLTransitionCommand(TransactionalEditingDomain domain, Transition transition, TransitionRule transitionRule) {
+			super(domain, "Transition Update", getWorkspaceFiles(transition)); //$NON-NLS-1$
+			this.transition = transition;
+			this.transitionRuleObject = transitionRule;
+		}
+	}
+
+	@Override
+	public Injector getInjector() {
+		return TransitionActivator.getInstance().getInjector(TransitionActivator.ORG_ECLIPSE_EFM_PAPYRUS_XTEXT_TRANSITION);
+	}
+
+	@Override
+	protected ICommand getParseCommand(EObject modelObject, EObject xtextObject) {
+
+		if (!(modelObject instanceof Transition)) {
+			return null;
+		}
+
+		Transition transition = (Transition) modelObject;
+
+		TransitionRule transitionRuleObject = (TransitionRule) xtextObject;
+		// transitionRuleObject may be null, if we have no input left
+
+		// Creates and executes the update command
+		try {
+			TransactionalEditingDomain dom = ServiceUtilsForEObject.getInstance().getTransactionalEditingDomain(transition);
+			UpdateUMLTransitionCommand updateCommand = new UpdateUMLTransitionCommand(dom, transition, transitionRuleObject);
+			return updateCommand;
+		} catch (ServiceException ex) {
+			Activator.log.error(ex);
+			return null;
+		}
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/labeling/TransitionDescriptionLabelProvider.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/labeling/TransitionDescriptionLabelProvider.xtend
new file mode 100644
index 0000000..fdaabeb
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/labeling/TransitionDescriptionLabelProvider.xtend
@@ -0,0 +1,33 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ui.labeling
+
+import org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider
+
+/**
+ * Provides labels for IEObjectDescriptions and IResourceDescriptions.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+class TransitionDescriptionLabelProvider extends DefaultDescriptionLabelProvider {
+
+	// Labels and icons can be computed like this:
+	
+//	override text(IEObjectDescription ele) {
+//		ele.name.toString
+//	}
+//	 
+//	override image(IEObjectDescription ele) {
+//		ele.EClass.name + '.gif'
+//	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/labeling/TransitionLabelProvider.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/labeling/TransitionLabelProvider.xtend
new file mode 100644
index 0000000..d9930a5
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/labeling/TransitionLabelProvider.xtend
@@ -0,0 +1,40 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ui.labeling
+
+import com.google.inject.Inject
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider
+import org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider
+
+/**
+ * Provides labels for EObjects.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+class TransitionLabelProvider extends DefaultEObjectLabelProvider {
+
+	@Inject
+	new(AdapterFactoryLabelProvider delegate) {
+		super(delegate);
+	}
+
+	// Labels and icons can be computed like this:
+	
+//	def text(Greeting ele) {
+//		'A greeting to ' + ele.name
+//	}
+//
+//	def image(Greeting ele) {
+//		'Greeting.gif'
+//	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/outline/TransitionOutlineTreeProvider.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/outline/TransitionOutlineTreeProvider.xtend
new file mode 100644
index 0000000..4cdd076
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/outline/TransitionOutlineTreeProvider.xtend
@@ -0,0 +1,24 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ui.outline
+
+import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider
+
+/**
+ * Customization of the default outline structure.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#outline
+ */
+class TransitionOutlineTreeProvider extends DefaultOutlineTreeProvider {
+
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/quickfix/TransitionQuickfixProvider.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/quickfix/TransitionQuickfixProvider.xtend
new file mode 100644
index 0000000..d796626
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/src/org/eclipse/efm/papyrus/xtext/ui/quickfix/TransitionQuickfixProvider.xtend
@@ -0,0 +1,33 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.ui.quickfix
+
+import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider
+
+/**
+ * Custom quickfixes.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/310_eclipse_support.html#quick-fixes
+ */
+class TransitionQuickfixProvider extends DefaultQuickfixProvider {
+
+//	@Fix(TransitionValidator.INVALID_NAME)
+//	def capitalizeName(Issue issue, IssueResolutionAcceptor acceptor) {
+//		acceptor.accept(issue, 'Capitalize name', 'Capitalize the name.', 'upcase.png') [
+//			context |
+//			val xtextDocument = context.xtextDocument
+//			val firstLetter = xtextDocument.get(issue.offset, 1)
+//			xtextDocument.replace(issue.offset, 1, firstLetter.toUpperCase)
+//		]
+//	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionDescriptionLabelProvider.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionDescriptionLabelProvider.xtendbin
new file mode 100644
index 0000000..31ecaf7
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionDescriptionLabelProvider.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionLabelProvider.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionLabelProvider.xtendbin
new file mode 100644
index 0000000..8586a6a
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionLabelProvider.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionOutlineTreeProvider.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionOutlineTreeProvider.xtendbin
new file mode 100644
index 0000000..eea7e6c
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionOutlineTreeProvider.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionProposalProvider.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionProposalProvider.xtendbin
new file mode 100644
index 0000000..903923e
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionProposalProvider.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionQuickfixProvider.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionQuickfixProvider.xtendbin
new file mode 100644
index 0000000..a596e3f
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionQuickfixProvider.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionUiModule.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionUiModule.xtendbin
new file mode 100644
index 0000000..4704d15
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/.TransitionUiModule.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/.gitignore
new file mode 100644
index 0000000..636a9ae
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/.gitignore
@@ -0,0 +1,3 @@
+/.TransitionUiModule.java._trace
+/.TransitionUiModule.xtendbin
+/TransitionUiModule.java
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/contentassist/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/contentassist/.gitignore
new file mode 100644
index 0000000..ae4c86c
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/contentassist/.gitignore
@@ -0,0 +1,3 @@
+/.TransitionProposalProvider.java._trace
+/.TransitionProposalProvider.xtendbin
+/TransitionProposalProvider.java
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/labeling/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/labeling/.gitignore
new file mode 100644
index 0000000..f6a0d48
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/labeling/.gitignore
@@ -0,0 +1,6 @@
+/.TransitionDescriptionLabelProvider.java._trace
+/.TransitionDescriptionLabelProvider.xtendbin
+/.TransitionLabelProvider.java._trace
+/.TransitionLabelProvider.xtendbin
+/TransitionDescriptionLabelProvider.java
+/TransitionLabelProvider.java
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/outline/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/outline/.gitignore
new file mode 100644
index 0000000..54021d3
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/outline/.gitignore
@@ -0,0 +1,3 @@
+/.TransitionOutlineTreeProvider.java._trace
+/.TransitionOutlineTreeProvider.xtendbin
+/TransitionOutlineTreeProvider.java
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/quickfix/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/quickfix/.gitignore
new file mode 100644
index 0000000..a65dfe8
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition.ui/xtend-gen/org/eclipse/efm/papyrus/xtext/ui/quickfix/.gitignore
@@ -0,0 +1,3 @@
+/.TransitionQuickfixProvider.java._trace
+/.TransitionQuickfixProvider.xtendbin
+/TransitionQuickfixProvider.java
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.antlr-generator-3.2.0-patch.jar b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.antlr-generator-3.2.0-patch.jar
new file mode 100644
index 0000000..90516fd
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.antlr-generator-3.2.0-patch.jar
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.classpath b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.project b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.project
new file mode 100644
index 0000000..4637163
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.papyrus.xtext.transition</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.settings/org.eclipse.core.resources.prefs b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.settings/org.eclipse.jdt.core.prefs b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.settings/org.eclipse.m2e.core.prefs b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/META-INF/MANIFEST.MF b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..26b41ea
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.papyrus.xtext.transition; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.xtext,
+ org.eclipse.xtext.xbase,
+ org.eclipse.equinox.common;bundle-version="3.5.0",
+ org.eclipse.uml2.uml,
+ org.eclipse.uml2.codegen.ecore,
+ org.eclipse.emf.ecore,
+ org.eclipse.xtext.xbase.lib,
+ org.antlr.runtime,
+ org.eclipse.xtext.util,
+ org.eclipse.xtend.lib,
+ org.eclipse.emf.common
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.papyrus.xtext.transition,
+ org.eclipse.efm.papyrus.xtext.services,
+ org.eclipse.efm.papyrus.xtext.transition.util,
+ org.eclipse.efm.papyrus.xtext.validation,
+ org.eclipse.efm.papyrus.xtext,
+ org.eclipse.efm.papyrus.xtext.scoping,
+ org.eclipse.efm.papyrus.xtext.parser.antlr.internal,
+ org.eclipse.efm.papyrus.xtext.transition.impl,
+ org.eclipse.efm.papyrus.xtext.serializer,
+ org.eclipse.efm.papyrus.xtext.parser.antlr,
+ org.eclipse.efm.papyrus.xtext.generator
+Import-Package: org.apache.log4j
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/build.properties b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/build.properties
new file mode 100644
index 0000000..180c434
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/build.properties
@@ -0,0 +1,30 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = model/generated/,\
+               .,\
+               META-INF/,\
+               plugin.xml
+additional.bundles = org.eclipse.xtext.xbase,\
+                     org.eclipse.xtext.common.types,\
+                     org.eclipse.xtext.xtext.generator,\
+                     org.eclipse.emf.codegen.ecore,\
+                     org.eclipse.emf.mwe.utils,\
+                     org.eclipse.emf.mwe2.launch,\
+                     org.eclipse.emf.mwe2.lib,\
+                     org.objectweb.asm,\
+                     org.apache.commons.logging,\
+                     org.apache.log4j,\
+                     com.ibm.icu
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/model/generated/Transition.ecore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/model/generated/Transition.ecore
new file mode 100644
index 0000000..c83a5f7
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/model/generated/Transition.ecore
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="transition" nsURI="http://www.eclipse.org/efm/papyrus/xtext/Transition"
+    nsPrefix="transition">
+  <eClassifiers xsi:type="ecore:EClass" name="TransitionRule">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="triggers" upperBound="-1"
+        eType="#//TriggerRule" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="guard" eType="#//GuardRule"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="tguard" eType="#//TGuardRule"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="effectBody" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="TriggerRule">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="port" eType="ecore:EClass platform:/resource/org.eclipse.uml2.uml/model/UML.ecore#//NamedElement"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="event" eType="#//EventRule"
+        containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="EventRule"/>
+  <eClassifiers xsi:type="ecore:EClass" name="ReceiveSignalEventRule" eSuperTypes="#//EventRule">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" unique="false"
+        upperBound="-1" eType="ecore:EClass platform:/resource/org.eclipse.uml2.uml/model/UML.ecore#//Property"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="GuardRule">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="constraint" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="TGuardRule">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="constraint" eType="ecore:EDataType platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EString"/>
+  </eClassifiers>
+</ecore:EPackage>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/model/generated/Transition.genmodel b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/model/generated/Transition.genmodel
new file mode 100644
index 0000000..adb2efe
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/model/generated/Transition.genmodel
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="****************************************************************************&#xD;&#xA;* Copyright (c) 2016 CEA LIST.&#xD;&#xA;*&#xD;&#xA;* All rights reserved. This program and the accompanying materials&#xD;&#xA;* are made available under the terms of the Eclipse Public License v1.0&#xD;&#xA;* which accompanies this distribution, and is available at&#xD;&#xA;* http://www.eclipse.org/legal/epl-v10.html&#xD;&#xA;*&#xD;&#xA;* Contributors:&#xD;&#xA;*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr&#xD;&#xA;*  - Initial API and implementation&#xD;&#xA;****************************************************************************"
+    modelDirectory="/org.eclipse.efm.papyrus.xtext.transition/src-gen" modelPluginID="org.eclipse.efm.papyrus.xtext.transition"
+    forceOverwrite="true" modelName="Transition" updateClasspath="false" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
+    complianceLevel="6.0" copyrightFields="false" runtimeVersion="2.12" usedGenPackages="platform:/resource/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore platform:/resource/org.eclipse.uml2.uml/model/UML.genmodel#//uml">
+  <genPackages prefix="Transition" basePackage="org.eclipse.efm.papyrus.xtext" disposableProviderFactory="true"
+      fileExtensions="fmltransition" ecorePackage="Transition.ecore#/">
+    <genClasses ecoreClass="Transition.ecore#//TransitionRule">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Transition.ecore#//TransitionRule/triggers"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Transition.ecore#//TransitionRule/guard"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Transition.ecore#//TransitionRule/tguard"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Transition.ecore#//TransitionRule/effectBody"/>
+    </genClasses>
+    <genClasses ecoreClass="Transition.ecore#//TriggerRule">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference Transition.ecore#//TriggerRule/port"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Transition.ecore#//TriggerRule/event"/>
+    </genClasses>
+    <genClasses ecoreClass="Transition.ecore#//EventRule"/>
+    <genClasses ecoreClass="Transition.ecore#//ReceiveSignalEventRule">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference Transition.ecore#//ReceiveSignalEventRule/parameters"/>
+    </genClasses>
+    <genClasses ecoreClass="Transition.ecore#//GuardRule">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Transition.ecore#//GuardRule/constraint"/>
+    </genClasses>
+    <genClasses ecoreClass="Transition.ecore#//TGuardRule">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Transition.ecore#//TGuardRule/constraint"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/plugin.xml b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/plugin.xml
new file mode 100644
index 0000000..e42ca1a
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/plugin.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<plugin>
+	<extension point="org.eclipse.emf.ecore.generated_package">
+		<package 
+			uri = "http://www.eclipse.org/efm/papyrus/xtext/Transition"
+			class = "org.eclipse.efm.papyrus.xtext.transition.TransitionPackage"
+			genModel = "model/generated/Transition.genmodel" />
+	</extension>
+</plugin>
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/pom.xml b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/pom.xml
new file mode 100644
index 0000000..4c22da0
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.transition</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.papyrus.xtext.transition</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.papyrus.xtext.transition</name>
+	<description>This plug-in contains the UML/Transition' Xtext based editor core elements (grammar, workflow...).</description>
+
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/AbstractTransitionRuntimeModule.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/AbstractTransitionRuntimeModule.java
new file mode 100644
index 0000000..9ae9c73
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/AbstractTransitionRuntimeModule.java
@@ -0,0 +1,203 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext;
+
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import java.util.Properties;
+import org.eclipse.efm.papyrus.xtext.generator.TransitionGenerator;
+import org.eclipse.efm.papyrus.xtext.parser.antlr.TransitionAntlrTokenFileProvider;
+import org.eclipse.efm.papyrus.xtext.parser.antlr.TransitionParser;
+import org.eclipse.efm.papyrus.xtext.parser.antlr.internal.InternalTransitionLexer;
+import org.eclipse.efm.papyrus.xtext.scoping.TransitionScopeProvider;
+import org.eclipse.efm.papyrus.xtext.serializer.TransitionSemanticSequencer;
+import org.eclipse.efm.papyrus.xtext.serializer.TransitionSyntacticSequencer;
+import org.eclipse.efm.papyrus.xtext.services.TransitionGrammarAccess;
+import org.eclipse.efm.papyrus.xtext.validation.TransitionValidator;
+import org.eclipse.xtext.Constants;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.generator.IGenerator2;
+import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.parser.IParser;
+import org.eclipse.xtext.parser.ITokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.AntlrTokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.Lexer;
+import org.eclipse.xtext.parser.antlr.LexerBindings;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.resource.IContainer;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.containers.ResourceSetBasedAllContainersStateProvider;
+import org.eclipse.xtext.resource.containers.StateBasedContainerManager;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions;
+import org.eclipse.xtext.scoping.IGlobalScopeProvider;
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.eclipse.xtext.scoping.IgnoreCaseLinking;
+import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
+import org.eclipse.xtext.scoping.impl.DefaultGlobalScopeProvider;
+import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider;
+import org.eclipse.xtext.serializer.ISerializer;
+import org.eclipse.xtext.serializer.impl.Serializer;
+import org.eclipse.xtext.serializer.sequencer.ISemanticSequencer;
+import org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer;
+import org.eclipse.xtext.service.DefaultRuntimeModule;
+import org.eclipse.xtext.service.SingletonBinding;
+
+/**
+ * Manual modifications go to {@link TransitionRuntimeModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractTransitionRuntimeModule extends DefaultRuntimeModule {
+
+	protected Properties properties = null;
+
+	@Override
+	public void configure(Binder binder) {
+		properties = tryBindProperties(binder, "org/eclipse/efm/papyrus/xtext/Transition.properties");
+		super.configure(binder);
+	}
+	
+	public void configureLanguageName(Binder binder) {
+		binder.bind(String.class).annotatedWith(Names.named(Constants.LANGUAGE_NAME)).toInstance("org.eclipse.efm.papyrus.xtext.Transition");
+	}
+	
+	public void configureFileExtensions(Binder binder) {
+		if (properties == null || properties.getProperty(Constants.FILE_EXTENSIONS) == null)
+			binder.bind(String.class).annotatedWith(Names.named(Constants.FILE_EXTENSIONS)).toInstance("fmltransition");
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public ClassLoader bindClassLoaderToInstance() {
+		return getClass().getClassLoader();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public Class<? extends IGrammarAccess> bindIGrammarAccess() {
+		return TransitionGrammarAccess.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISemanticSequencer> bindISemanticSequencer() {
+		return TransitionSemanticSequencer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISyntacticSequencer> bindISyntacticSequencer() {
+		return TransitionSyntacticSequencer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISerializer> bindISerializer() {
+		return Serializer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IParser> bindIParser() {
+		return TransitionParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenToStringConverter> bindITokenToStringConverter() {
+		return AntlrTokenToStringConverter.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
+		return TransitionAntlrTokenFileProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends Lexer> bindLexer() {
+		return InternalTransitionLexer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenDefProvider> bindITokenDefProvider() {
+		return AntlrTokenDefProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Provider<InternalTransitionLexer> provideInternalTransitionLexer() {
+		return LexerProvider.create(InternalTransitionLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureRuntimeLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerBindings.RUNTIME))
+			.to(InternalTransitionLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.validation.ValidatorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends TransitionValidator> bindTransitionValidator() {
+		return TransitionValidator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IScopeProvider> bindIScopeProvider() {
+		return TransitionScopeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIScopeProviderDelegate(Binder binder) {
+		binder.bind(IScopeProvider.class).annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(ImportedNamespaceAwareLocalScopeProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return DefaultGlobalScopeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIgnoreCaseLinking(Binder binder) {
+		binder.bindConstant().annotatedWith(IgnoreCaseLinking.class).to(false);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+		return DefaultDeclarativeQualifiedNameProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContainer.Manager> bindIContainer$Manager() {
+		return StateBasedContainerManager.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IAllContainersState.Provider> bindIAllContainersState$Provider() {
+		return ResourceSetBasedAllContainersStateProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptions(Binder binder) {
+		binder.bind(IResourceDescriptions.class).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsPersisted(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public Class<? extends IGenerator2> bindIGenerator2() {
+		return TransitionGenerator.class;
+	}
+	
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/Transition.xtextbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/Transition.xtextbin
new file mode 100644
index 0000000..7d3b4cb
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/Transition.xtextbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/TransitionStandaloneSetupGenerated.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/TransitionStandaloneSetupGenerated.java
new file mode 100644
index 0000000..8816b90
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/TransitionStandaloneSetupGenerated.java
@@ -0,0 +1,51 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionPackage;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.ISetup;
+import org.eclipse.xtext.common.TerminalsStandaloneSetup;
+import org.eclipse.xtext.resource.IResourceFactory;
+import org.eclipse.xtext.resource.IResourceServiceProvider;
+
+@SuppressWarnings("all")
+public class TransitionStandaloneSetupGenerated implements ISetup {
+
+	@Override
+	public Injector createInjectorAndDoEMFRegistration() {
+		TerminalsStandaloneSetup.doSetup();
+
+		Injector injector = createInjector();
+		register(injector);
+		return injector;
+	}
+	
+	public Injector createInjector() {
+		return Guice.createInjector(new TransitionRuntimeModule());
+	}
+	
+	public void register(Injector injector) {
+		if (!EPackage.Registry.INSTANCE.containsKey("http://www.eclipse.org/efm/papyrus/xtext/Transition")) {
+			EPackage.Registry.INSTANCE.put("http://www.eclipse.org/efm/papyrus/xtext/Transition", TransitionPackage.eINSTANCE);
+		}
+		IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class);
+		IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class);
+		
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("fmltransition", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("fmltransition", serviceProvider);
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/TransitionAntlrTokenFileProvider.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/TransitionAntlrTokenFileProvider.java
new file mode 100644
index 0000000..11be925
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/TransitionAntlrTokenFileProvider.java
@@ -0,0 +1,25 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.parser.antlr;
+
+import java.io.InputStream;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+
+public class TransitionAntlrTokenFileProvider implements IAntlrTokenFileProvider {
+
+	@Override
+	public InputStream getAntlrTokenFile() {
+		ClassLoader classLoader = getClass().getClassLoader();
+		return classLoader.getResourceAsStream("org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransition.tokens");
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/TransitionParser.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/TransitionParser.java
new file mode 100644
index 0000000..7649042
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/TransitionParser.java
@@ -0,0 +1,49 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.parser.antlr;
+
+import com.google.inject.Inject;
+import org.eclipse.efm.papyrus.xtext.parser.antlr.internal.InternalTransitionParser;
+import org.eclipse.efm.papyrus.xtext.services.TransitionGrammarAccess;
+import org.eclipse.xtext.parser.antlr.AbstractAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+
+public class TransitionParser extends AbstractAntlrParser {
+
+	@Inject
+	private TransitionGrammarAccess grammarAccess;
+
+	@Override
+	protected void setInitialHiddenTokens(XtextTokenStream tokenStream) {
+		tokenStream.setInitialHiddenTokens("RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT");
+	}
+	
+
+	@Override
+	protected InternalTransitionParser createParser(XtextTokenStream stream) {
+		return new InternalTransitionParser(stream, getGrammarAccess());
+	}
+
+	@Override 
+	protected String getDefaultRuleName() {
+		return "TransitionRule";
+	}
+
+	public TransitionGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(TransitionGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransition.g b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransition.g
new file mode 100644
index 0000000..5e5e733
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransition.g
@@ -0,0 +1,506 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+grammar InternalTransition;
+
+options {
+	superClass=AbstractInternalAntlrParser;
+}
+
+@lexer::header {
+package org.eclipse.efm.papyrus.xtext.parser.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.parser.antlr.Lexer;
+}
+
+@parser::header {
+package org.eclipse.efm.papyrus.xtext.parser.antlr.internal;
+
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+import org.eclipse.efm.papyrus.xtext.services.TransitionGrammarAccess;
+
+}
+
+@parser::members {
+
+ 	private TransitionGrammarAccess grammarAccess;
+
+    public InternalTransitionParser(TokenStream input, TransitionGrammarAccess grammarAccess) {
+        this(input);
+        this.grammarAccess = grammarAccess;
+        registerRules(grammarAccess.getGrammar());
+    }
+
+    @Override
+    protected String getFirstRuleName() {
+    	return "TransitionRule";
+   	}
+
+   	@Override
+   	protected TransitionGrammarAccess getGrammarAccess() {
+   		return grammarAccess;
+   	}
+
+}
+
+@rulecatch {
+    catch (RecognitionException re) {
+        recover(input,re);
+        appendSkippedTokens();
+    }
+}
+
+// Entry rule entryRuleTransitionRule
+entryRuleTransitionRule returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionRuleRule()); }
+	iv_ruleTransitionRule=ruleTransitionRule
+	{ $current=$iv_ruleTransitionRule.current; }
+	EOF;
+
+// Rule TransitionRule
+ruleTransitionRule returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_0_0());
+					}
+					lv_triggers_0_0=ruleTriggerRule
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getTransitionRuleRule());
+						}
+						add(
+							$current,
+							"triggers",
+							lv_triggers_0_0,
+							"org.eclipse.efm.papyrus.xtext.Transition.TriggerRule");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_1=','
+				{
+					newLeafNode(otherlv_1, grammarAccess.getTransitionRuleAccess().getCommaKeyword_0_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_1_1_0());
+						}
+						lv_triggers_2_0=ruleTriggerRule
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getTransitionRuleRule());
+							}
+							add(
+								$current,
+								"triggers",
+								lv_triggers_2_0,
+								"org.eclipse.efm.papyrus.xtext.Transition.TriggerRule");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getTransitionRuleAccess().getGuardGuardRuleParserRuleCall_1_0());
+				}
+				lv_guard_3_0=ruleGuardRule
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getTransitionRuleRule());
+					}
+					set(
+						$current,
+						"guard",
+						lv_guard_3_0,
+						"org.eclipse.efm.papyrus.xtext.Transition.GuardRule");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getTransitionRuleAccess().getTguardTGuardRuleParserRuleCall_2_0());
+				}
+				lv_tguard_4_0=ruleTGuardRule
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getTransitionRuleRule());
+					}
+					set(
+						$current,
+						"tguard",
+						lv_tguard_4_0,
+						"org.eclipse.efm.papyrus.xtext.Transition.TGuardRule");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_5='/'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getTransitionRuleAccess().getSolidusKeyword_3_0());
+			}
+			(
+				(
+					lv_effectBody_6_0=RULE_STRING
+					{
+						newLeafNode(lv_effectBody_6_0, grammarAccess.getTransitionRuleAccess().getEffectBodySTRINGTerminalRuleCall_3_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getTransitionRuleRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"effectBody",
+							lv_effectBody_6_0,
+							"org.eclipse.xtext.common.Terminals.STRING");
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleFQN
+entryRuleFQN returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getFQNRule()); }
+	iv_ruleFQN=ruleFQN
+	{ $current=$iv_ruleFQN.current.getText(); }
+	EOF;
+
+// Rule FQN
+ruleFQN returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		this_ID_0=RULE_ID
+		{
+			$current.merge(this_ID_0);
+		}
+		{
+			newLeafNode(this_ID_0, grammarAccess.getFQNAccess().getIDTerminalRuleCall_0());
+		}
+		(
+			(
+				kw='.'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getFQNAccess().getFullStopKeyword_1_0_0());
+				}
+				    |
+				kw='::'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getFQNAccess().getColonColonKeyword_1_0_1());
+				}
+			)
+			this_ID_3=RULE_ID
+			{
+				$current.merge(this_ID_3);
+			}
+			{
+				newLeafNode(this_ID_3, grammarAccess.getFQNAccess().getIDTerminalRuleCall_1_1());
+			}
+		)*
+	)
+;
+
+// Entry rule entryRuleTriggerRule
+entryRuleTriggerRule returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTriggerRuleRule()); }
+	iv_ruleTriggerRule=ruleTriggerRule
+	{ $current=$iv_ruleTriggerRule.current; }
+	EOF;
+
+// Rule TriggerRule
+ruleTriggerRule returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='input'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getTriggerRuleAccess().getInputKeyword_0());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getTriggerRuleRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getTriggerRuleAccess().getPortNamedElementCrossReference_1_0());
+				}
+				ruleFQN
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getTriggerRuleAccess().getEventEventRuleParserRuleCall_2_0());
+				}
+				lv_event_2_0=ruleEventRule
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getTriggerRuleRule());
+					}
+					set(
+						$current,
+						"event",
+						lv_event_2_0,
+						"org.eclipse.efm.papyrus.xtext.Transition.EventRule");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleEventRule
+entryRuleEventRule returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEventRuleRule()); }
+	iv_ruleEventRule=ruleEventRule
+	{ $current=$iv_ruleEventRule.current; }
+	EOF;
+
+// Rule EventRule
+ruleEventRule returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	{
+		newCompositeNode(grammarAccess.getEventRuleAccess().getReceiveSignalEventRuleParserRuleCall());
+	}
+	this_ReceiveSignalEventRule_0=ruleReceiveSignalEventRule
+	{
+		$current = $this_ReceiveSignalEventRule_0.current;
+		afterParserOrEnumRuleCall();
+	}
+;
+
+// Entry rule entryRuleReceiveSignalEventRule
+entryRuleReceiveSignalEventRule returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getReceiveSignalEventRuleRule()); }
+	iv_ruleReceiveSignalEventRule=ruleReceiveSignalEventRule
+	{ $current=$iv_ruleReceiveSignalEventRule.current; }
+	EOF;
+
+// Rule ReceiveSignalEventRule
+ruleReceiveSignalEventRule returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getReceiveSignalEventRuleAccess().getReceiveSignalEventRuleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='('
+		{
+			newLeafNode(otherlv_1, grammarAccess.getReceiveSignalEventRuleAccess().getLeftParenthesisKeyword_1());
+		}
+		(
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getReceiveSignalEventRuleRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_0_0());
+					}
+					ruleFQN
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_3=','
+				{
+					newLeafNode(otherlv_3, grammarAccess.getReceiveSignalEventRuleAccess().getCommaKeyword_2_1_0());
+				}
+				(
+					(
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getReceiveSignalEventRuleRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_1_1_0());
+						}
+						ruleFQN
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getReceiveSignalEventRuleAccess().getRightParenthesisKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleGuardRule
+entryRuleGuardRule returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getGuardRuleRule()); }
+	iv_ruleGuardRule=ruleGuardRule
+	{ $current=$iv_ruleGuardRule.current; }
+	EOF;
+
+// Rule GuardRule
+ruleGuardRule returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='['
+		{
+			newLeafNode(otherlv_0, grammarAccess.getGuardRuleAccess().getLeftSquareBracketKeyword_0());
+		}
+		(
+			(
+				lv_constraint_1_0=RULE_STRING
+				{
+					newLeafNode(lv_constraint_1_0, grammarAccess.getGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getGuardRuleRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"constraint",
+						lv_constraint_1_0,
+						"org.eclipse.xtext.common.Terminals.STRING");
+				}
+			)
+		)
+		otherlv_2=']'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getGuardRuleAccess().getRightSquareBracketKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleTGuardRule
+entryRuleTGuardRule returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTGuardRuleRule()); }
+	iv_ruleTGuardRule=ruleTGuardRule
+	{ $current=$iv_ruleTGuardRule.current; }
+	EOF;
+
+// Rule TGuardRule
+ruleTGuardRule returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='{'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getTGuardRuleAccess().getLeftCurlyBracketKeyword_0());
+		}
+		(
+			(
+				lv_constraint_1_0=RULE_STRING
+				{
+					newLeafNode(lv_constraint_1_0, grammarAccess.getTGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getTGuardRuleRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"constraint",
+						lv_constraint_1_0,
+						"org.eclipse.xtext.common.Terminals.STRING");
+				}
+			)
+		)
+		otherlv_2='}'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getTGuardRuleAccess().getRightCurlyBracketKeyword_2());
+		}
+	)
+;
+
+RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
+
+RULE_INT : ('0'..'9')+;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransition.tokens b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransition.tokens
new file mode 100644
index 0000000..558d7c0
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransition.tokens
@@ -0,0 +1,29 @@
+'('=16
+')'=17
+','=11
+'.'=13
+'/'=12
+'::'=14
+'['=18
+']'=19
+'input'=15
+'{'=20
+'}'=21
+RULE_ANY_OTHER=10
+RULE_ID=5
+RULE_INT=6
+RULE_ML_COMMENT=7
+RULE_SL_COMMENT=8
+RULE_STRING=4
+RULE_WS=9
+T__11=11
+T__12=12
+T__13=13
+T__14=14
+T__15=15
+T__16=16
+T__17=17
+T__18=18
+T__19=19
+T__20=20
+T__21=21
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransitionLexer.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransitionLexer.java
new file mode 100644
index 0000000..857339d
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransitionLexer.java
@@ -0,0 +1,1080 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+package org.eclipse.efm.papyrus.xtext.parser.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.parser.antlr.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalTransitionLexer extends Lexer {
+    public static final int RULE_STRING=4;
+    public static final int RULE_SL_COMMENT=8;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__11=11;
+    public static final int T__12=12;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int EOF=-1;
+    public static final int RULE_ID=5;
+    public static final int RULE_WS=9;
+    public static final int RULE_ANY_OTHER=10;
+    public static final int RULE_INT=6;
+    public static final int RULE_ML_COMMENT=7;
+    public static final int T__20=20;
+    public static final int T__21=21;
+
+    // delegates
+    // delegators
+
+    public InternalTransitionLexer() {;} 
+    public InternalTransitionLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalTransitionLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "InternalTransition.g"; }
+
+    // $ANTLR start "T__11"
+    public final void mT__11() throws RecognitionException {
+        try {
+            int _type = T__11;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:11:7: ( ',' )
+            // InternalTransition.g:11:9: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__11"
+
+    // $ANTLR start "T__12"
+    public final void mT__12() throws RecognitionException {
+        try {
+            int _type = T__12;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:12:7: ( '/' )
+            // InternalTransition.g:12:9: '/'
+            {
+            match('/'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__12"
+
+    // $ANTLR start "T__13"
+    public final void mT__13() throws RecognitionException {
+        try {
+            int _type = T__13;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:13:7: ( '.' )
+            // InternalTransition.g:13:9: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__13"
+
+    // $ANTLR start "T__14"
+    public final void mT__14() throws RecognitionException {
+        try {
+            int _type = T__14;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:14:7: ( '::' )
+            // InternalTransition.g:14:9: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__14"
+
+    // $ANTLR start "T__15"
+    public final void mT__15() throws RecognitionException {
+        try {
+            int _type = T__15;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:15:7: ( 'input' )
+            // InternalTransition.g:15:9: 'input'
+            {
+            match("input"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__15"
+
+    // $ANTLR start "T__16"
+    public final void mT__16() throws RecognitionException {
+        try {
+            int _type = T__16;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:16:7: ( '(' )
+            // InternalTransition.g:16:9: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__16"
+
+    // $ANTLR start "T__17"
+    public final void mT__17() throws RecognitionException {
+        try {
+            int _type = T__17;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:17:7: ( ')' )
+            // InternalTransition.g:17:9: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__17"
+
+    // $ANTLR start "T__18"
+    public final void mT__18() throws RecognitionException {
+        try {
+            int _type = T__18;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:18:7: ( '[' )
+            // InternalTransition.g:18:9: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__18"
+
+    // $ANTLR start "T__19"
+    public final void mT__19() throws RecognitionException {
+        try {
+            int _type = T__19;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:19:7: ( ']' )
+            // InternalTransition.g:19:9: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__19"
+
+    // $ANTLR start "T__20"
+    public final void mT__20() throws RecognitionException {
+        try {
+            int _type = T__20;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:20:7: ( '{' )
+            // InternalTransition.g:20:9: '{'
+            {
+            match('{'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__20"
+
+    // $ANTLR start "T__21"
+    public final void mT__21() throws RecognitionException {
+        try {
+            int _type = T__21;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:21:7: ( '}' )
+            // InternalTransition.g:21:9: '}'
+            {
+            match('}'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__21"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:494:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* )
+            // InternalTransition.g:494:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            {
+            // InternalTransition.g:494:11: ( '^' )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0=='^') ) {
+                alt1=1;
+            }
+            switch (alt1) {
+                case 1 :
+                    // InternalTransition.g:494:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalTransition.g:494:40: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( ((LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='Z')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='z')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // InternalTransition.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:496:10: ( ( '0' .. '9' )+ )
+            // InternalTransition.g:496:12: ( '0' .. '9' )+
+            {
+            // InternalTransition.g:496:12: ( '0' .. '9' )+
+            int cnt3=0;
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( ((LA3_0>='0' && LA3_0<='9')) ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+            	case 1 :
+            	    // InternalTransition.g:496:13: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt3 >= 1 ) break loop3;
+                        EarlyExitException eee =
+                            new EarlyExitException(3, input);
+                        throw eee;
+                }
+                cnt3++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:498:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
+            // InternalTransition.g:498:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            {
+            // InternalTransition.g:498:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0=='\"') ) {
+                alt6=1;
+            }
+            else if ( (LA6_0=='\'') ) {
+                alt6=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 6, 0, input);
+
+                throw nvae;
+            }
+            switch (alt6) {
+                case 1 :
+                    // InternalTransition.g:498:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+                    {
+                    match('\"'); 
+                    // InternalTransition.g:498:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop4:
+                    do {
+                        int alt4=3;
+                        int LA4_0 = input.LA(1);
+
+                        if ( (LA4_0=='\\') ) {
+                            alt4=1;
+                        }
+                        else if ( ((LA4_0>='\u0000' && LA4_0<='!')||(LA4_0>='#' && LA4_0<='[')||(LA4_0>=']' && LA4_0<='\uFFFF')) ) {
+                            alt4=2;
+                        }
+
+
+                        switch (alt4) {
+                    	case 1 :
+                    	    // InternalTransition.g:498:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalTransition.g:498:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop4;
+                        }
+                    } while (true);
+
+                    match('\"'); 
+
+                    }
+                    break;
+                case 2 :
+                    // InternalTransition.g:498:48: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+                    {
+                    match('\''); 
+                    // InternalTransition.g:498:53: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop5:
+                    do {
+                        int alt5=3;
+                        int LA5_0 = input.LA(1);
+
+                        if ( (LA5_0=='\\') ) {
+                            alt5=1;
+                        }
+                        else if ( ((LA5_0>='\u0000' && LA5_0<='&')||(LA5_0>='(' && LA5_0<='[')||(LA5_0>=']' && LA5_0<='\uFFFF')) ) {
+                            alt5=2;
+                        }
+
+
+                        switch (alt5) {
+                    	case 1 :
+                    	    // InternalTransition.g:498:54: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalTransition.g:498:61: ~ ( ( '\\\\' | '\\'' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop5;
+                        }
+                    } while (true);
+
+                    match('\''); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_STRING"
+
+    // $ANTLR start "RULE_ML_COMMENT"
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:500:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalTransition.g:500:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // InternalTransition.g:500:24: ( options {greedy=false; } : . )*
+            loop7:
+            do {
+                int alt7=2;
+                int LA7_0 = input.LA(1);
+
+                if ( (LA7_0=='*') ) {
+                    int LA7_1 = input.LA(2);
+
+                    if ( (LA7_1=='/') ) {
+                        alt7=2;
+                    }
+                    else if ( ((LA7_1>='\u0000' && LA7_1<='.')||(LA7_1>='0' && LA7_1<='\uFFFF')) ) {
+                        alt7=1;
+                    }
+
+
+                }
+                else if ( ((LA7_0>='\u0000' && LA7_0<=')')||(LA7_0>='+' && LA7_0<='\uFFFF')) ) {
+                    alt7=1;
+                }
+
+
+                switch (alt7) {
+            	case 1 :
+            	    // InternalTransition.g:500:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop7;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ML_COMMENT"
+
+    // $ANTLR start "RULE_SL_COMMENT"
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:502:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalTransition.g:502:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // InternalTransition.g:502:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( ((LA8_0>='\u0000' && LA8_0<='\t')||(LA8_0>='\u000B' && LA8_0<='\f')||(LA8_0>='\u000E' && LA8_0<='\uFFFF')) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // InternalTransition.g:502:24: ~ ( ( '\\n' | '\\r' ) )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            // InternalTransition.g:502:40: ( ( '\\r' )? '\\n' )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0=='\n'||LA10_0=='\r') ) {
+                alt10=1;
+            }
+            switch (alt10) {
+                case 1 :
+                    // InternalTransition.g:502:41: ( '\\r' )? '\\n'
+                    {
+                    // InternalTransition.g:502:41: ( '\\r' )?
+                    int alt9=2;
+                    int LA9_0 = input.LA(1);
+
+                    if ( (LA9_0=='\r') ) {
+                        alt9=1;
+                    }
+                    switch (alt9) {
+                        case 1 :
+                            // InternalTransition.g:502:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_SL_COMMENT"
+
+    // $ANTLR start "RULE_WS"
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:504:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalTransition.g:504:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // InternalTransition.g:504:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt11=0;
+            loop11:
+            do {
+                int alt11=2;
+                int LA11_0 = input.LA(1);
+
+                if ( ((LA11_0>='\t' && LA11_0<='\n')||LA11_0=='\r'||LA11_0==' ') ) {
+                    alt11=1;
+                }
+
+
+                switch (alt11) {
+            	case 1 :
+            	    // InternalTransition.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt11 >= 1 ) break loop11;
+                        EarlyExitException eee =
+                            new EarlyExitException(11, input);
+                        throw eee;
+                }
+                cnt11++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_WS"
+
+    // $ANTLR start "RULE_ANY_OTHER"
+    public final void mRULE_ANY_OTHER() throws RecognitionException {
+        try {
+            int _type = RULE_ANY_OTHER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalTransition.g:506:16: ( . )
+            // InternalTransition.g:506:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // InternalTransition.g:1:8: ( T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt12=18;
+        alt12 = dfa12.predict(input);
+        switch (alt12) {
+            case 1 :
+                // InternalTransition.g:1:10: T__11
+                {
+                mT__11(); 
+
+                }
+                break;
+            case 2 :
+                // InternalTransition.g:1:16: T__12
+                {
+                mT__12(); 
+
+                }
+                break;
+            case 3 :
+                // InternalTransition.g:1:22: T__13
+                {
+                mT__13(); 
+
+                }
+                break;
+            case 4 :
+                // InternalTransition.g:1:28: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 5 :
+                // InternalTransition.g:1:34: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 6 :
+                // InternalTransition.g:1:40: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 7 :
+                // InternalTransition.g:1:46: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 8 :
+                // InternalTransition.g:1:52: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 9 :
+                // InternalTransition.g:1:58: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 10 :
+                // InternalTransition.g:1:64: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 11 :
+                // InternalTransition.g:1:70: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 12 :
+                // InternalTransition.g:1:76: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 13 :
+                // InternalTransition.g:1:84: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 14 :
+                // InternalTransition.g:1:93: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 15 :
+                // InternalTransition.g:1:105: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 16 :
+                // InternalTransition.g:1:121: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 17 :
+                // InternalTransition.g:1:137: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 18 :
+                // InternalTransition.g:1:145: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA12 dfa12 = new DFA12(this);
+    static final String DFA12_eotS =
+        "\2\uffff\1\26\1\uffff\1\22\1\32\6\uffff\1\22\2\uffff\2\22\10\uffff\1\32\12\uffff\2\32\1\47\1\uffff";
+    static final String DFA12_eofS =
+        "\50\uffff";
+    static final String DFA12_minS =
+        "\1\0\1\uffff\1\52\1\uffff\1\72\1\156\6\uffff\1\101\2\uffff\2\0\10\uffff\1\160\12\uffff\1\165\1\164\1\60\1\uffff";
+    static final String DFA12_maxS =
+        "\1\uffff\1\uffff\1\57\1\uffff\1\72\1\156\6\uffff\1\172\2\uffff\2\uffff\10\uffff\1\160\12\uffff\1\165\1\164\1\172\1\uffff";
+    static final String DFA12_acceptS =
+        "\1\uffff\1\1\1\uffff\1\3\2\uffff\1\6\1\7\1\10\1\11\1\12\1\13\1\uffff\1\14\1\15\2\uffff\1\21\1\22\1\1\1\17\1\20\1\2\1\3\1\4\1\uffff\1\14\1\6\1\7\1\10\1\11\1\12\1\13\1\15\1\16\1\21\3\uffff\1\5";
+    static final String DFA12_specialS =
+        "\1\1\16\uffff\1\0\1\2\27\uffff}>";
+    static final String[] DFA12_transitionS = {
+            "\11\22\2\21\2\22\1\21\22\22\1\21\1\22\1\17\4\22\1\20\1\6\1\7\2\22\1\1\1\22\1\3\1\2\12\16\1\4\6\22\32\15\1\10\1\22\1\11\1\14\1\15\1\22\10\15\1\5\21\15\1\12\1\22\1\13\uff82\22",
+            "",
+            "\1\24\4\uffff\1\25",
+            "",
+            "\1\30",
+            "\1\31",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\32\32\4\uffff\1\32\1\uffff\32\32",
+            "",
+            "",
+            "\0\42",
+            "\0\42",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\44",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\45",
+            "\1\46",
+            "\12\32\7\uffff\32\32\4\uffff\1\32\1\uffff\32\32",
+            ""
+    };
+
+    static final short[] DFA12_eot = DFA.unpackEncodedString(DFA12_eotS);
+    static final short[] DFA12_eof = DFA.unpackEncodedString(DFA12_eofS);
+    static final char[] DFA12_min = DFA.unpackEncodedStringToUnsignedChars(DFA12_minS);
+    static final char[] DFA12_max = DFA.unpackEncodedStringToUnsignedChars(DFA12_maxS);
+    static final short[] DFA12_accept = DFA.unpackEncodedString(DFA12_acceptS);
+    static final short[] DFA12_special = DFA.unpackEncodedString(DFA12_specialS);
+    static final short[][] DFA12_transition;
+
+    static {
+        int numStates = DFA12_transitionS.length;
+        DFA12_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA12_transition[i] = DFA.unpackEncodedString(DFA12_transitionS[i]);
+        }
+    }
+
+    class DFA12 extends DFA {
+
+        public DFA12(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 12;
+            this.eot = DFA12_eot;
+            this.eof = DFA12_eof;
+            this.min = DFA12_min;
+            this.max = DFA12_max;
+            this.accept = DFA12_accept;
+            this.special = DFA12_special;
+            this.transition = DFA12_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            IntStream input = _input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA12_15 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA12_15>='\u0000' && LA12_15<='\uFFFF')) ) {s = 34;}
+
+                        else s = 18;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA12_0 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA12_0==',') ) {s = 1;}
+
+                        else if ( (LA12_0=='/') ) {s = 2;}
+
+                        else if ( (LA12_0=='.') ) {s = 3;}
+
+                        else if ( (LA12_0==':') ) {s = 4;}
+
+                        else if ( (LA12_0=='i') ) {s = 5;}
+
+                        else if ( (LA12_0=='(') ) {s = 6;}
+
+                        else if ( (LA12_0==')') ) {s = 7;}
+
+                        else if ( (LA12_0=='[') ) {s = 8;}
+
+                        else if ( (LA12_0==']') ) {s = 9;}
+
+                        else if ( (LA12_0=='{') ) {s = 10;}
+
+                        else if ( (LA12_0=='}') ) {s = 11;}
+
+                        else if ( (LA12_0=='^') ) {s = 12;}
+
+                        else if ( ((LA12_0>='A' && LA12_0<='Z')||LA12_0=='_'||(LA12_0>='a' && LA12_0<='h')||(LA12_0>='j' && LA12_0<='z')) ) {s = 13;}
+
+                        else if ( ((LA12_0>='0' && LA12_0<='9')) ) {s = 14;}
+
+                        else if ( (LA12_0=='\"') ) {s = 15;}
+
+                        else if ( (LA12_0=='\'') ) {s = 16;}
+
+                        else if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {s = 17;}
+
+                        else if ( ((LA12_0>='\u0000' && LA12_0<='\b')||(LA12_0>='\u000B' && LA12_0<='\f')||(LA12_0>='\u000E' && LA12_0<='\u001F')||LA12_0=='!'||(LA12_0>='#' && LA12_0<='&')||(LA12_0>='*' && LA12_0<='+')||LA12_0=='-'||(LA12_0>=';' && LA12_0<='@')||LA12_0=='\\'||LA12_0=='`'||LA12_0=='|'||(LA12_0>='~' && LA12_0<='\uFFFF')) ) {s = 18;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA12_16 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA12_16>='\u0000' && LA12_16<='\uFFFF')) ) {s = 34;}
+
+                        else s = 18;
+
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 12, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+}
\ No newline at end of file
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransitionParser.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransitionParser.java
new file mode 100644
index 0000000..5328351
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/parser/antlr/internal/InternalTransitionParser.java
@@ -0,0 +1,1248 @@
+package org.eclipse.efm.papyrus.xtext.parser.antlr.internal;
+
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+import org.eclipse.efm.papyrus.xtext.services.TransitionGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+@SuppressWarnings("all")
+public class InternalTransitionParser extends AbstractInternalAntlrParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_ID", "RULE_INT", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "','", "'/'", "'.'", "'::'", "'input'", "'('", "')'", "'['", "']'", "'{'", "'}'"
+    };
+    public static final int RULE_STRING=4;
+    public static final int RULE_SL_COMMENT=8;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__11=11;
+    public static final int T__12=12;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int EOF=-1;
+    public static final int RULE_ID=5;
+    public static final int RULE_WS=9;
+    public static final int RULE_ANY_OTHER=10;
+    public static final int RULE_INT=6;
+    public static final int RULE_ML_COMMENT=7;
+    public static final int T__20=20;
+    public static final int T__21=21;
+
+    // delegates
+    // delegators
+
+
+        public InternalTransitionParser(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+        public InternalTransitionParser(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+             
+        }
+        
+
+    public String[] getTokenNames() { return InternalTransitionParser.tokenNames; }
+    public String getGrammarFileName() { return "InternalTransition.g"; }
+
+
+
+     	private TransitionGrammarAccess grammarAccess;
+
+        public InternalTransitionParser(TokenStream input, TransitionGrammarAccess grammarAccess) {
+            this(input);
+            this.grammarAccess = grammarAccess;
+            registerRules(grammarAccess.getGrammar());
+        }
+
+        @Override
+        protected String getFirstRuleName() {
+        	return "TransitionRule";
+       	}
+
+       	@Override
+       	protected TransitionGrammarAccess getGrammarAccess() {
+       		return grammarAccess;
+       	}
+
+
+
+
+    // $ANTLR start "entryRuleTransitionRule"
+    // InternalTransition.g:73:1: entryRuleTransitionRule returns [EObject current=null] : iv_ruleTransitionRule= ruleTransitionRule EOF ;
+    public final EObject entryRuleTransitionRule() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransitionRule = null;
+
+
+        try {
+            // InternalTransition.g:73:55: (iv_ruleTransitionRule= ruleTransitionRule EOF )
+            // InternalTransition.g:74:2: iv_ruleTransitionRule= ruleTransitionRule EOF
+            {
+             newCompositeNode(grammarAccess.getTransitionRuleRule()); 
+            pushFollow(FOLLOW_1);
+            iv_ruleTransitionRule=ruleTransitionRule();
+
+            state._fsp--;
+
+             current =iv_ruleTransitionRule; 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransitionRule"
+
+
+    // $ANTLR start "ruleTransitionRule"
+    // InternalTransition.g:80:1: ruleTransitionRule returns [EObject current=null] : ( ( ( (lv_triggers_0_0= ruleTriggerRule ) ) (otherlv_1= ',' ( (lv_triggers_2_0= ruleTriggerRule ) ) )* )? ( (lv_guard_3_0= ruleGuardRule ) )? ( (lv_tguard_4_0= ruleTGuardRule ) )? (otherlv_5= '/' ( (lv_effectBody_6_0= RULE_STRING ) ) )? ) ;
+    public final EObject ruleTransitionRule() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_5=null;
+        Token lv_effectBody_6_0=null;
+        EObject lv_triggers_0_0 = null;
+
+        EObject lv_triggers_2_0 = null;
+
+        EObject lv_guard_3_0 = null;
+
+        EObject lv_tguard_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalTransition.g:86:2: ( ( ( ( (lv_triggers_0_0= ruleTriggerRule ) ) (otherlv_1= ',' ( (lv_triggers_2_0= ruleTriggerRule ) ) )* )? ( (lv_guard_3_0= ruleGuardRule ) )? ( (lv_tguard_4_0= ruleTGuardRule ) )? (otherlv_5= '/' ( (lv_effectBody_6_0= RULE_STRING ) ) )? ) )
+            // InternalTransition.g:87:2: ( ( ( (lv_triggers_0_0= ruleTriggerRule ) ) (otherlv_1= ',' ( (lv_triggers_2_0= ruleTriggerRule ) ) )* )? ( (lv_guard_3_0= ruleGuardRule ) )? ( (lv_tguard_4_0= ruleTGuardRule ) )? (otherlv_5= '/' ( (lv_effectBody_6_0= RULE_STRING ) ) )? )
+            {
+            // InternalTransition.g:87:2: ( ( ( (lv_triggers_0_0= ruleTriggerRule ) ) (otherlv_1= ',' ( (lv_triggers_2_0= ruleTriggerRule ) ) )* )? ( (lv_guard_3_0= ruleGuardRule ) )? ( (lv_tguard_4_0= ruleTGuardRule ) )? (otherlv_5= '/' ( (lv_effectBody_6_0= RULE_STRING ) ) )? )
+            // InternalTransition.g:88:3: ( ( (lv_triggers_0_0= ruleTriggerRule ) ) (otherlv_1= ',' ( (lv_triggers_2_0= ruleTriggerRule ) ) )* )? ( (lv_guard_3_0= ruleGuardRule ) )? ( (lv_tguard_4_0= ruleTGuardRule ) )? (otherlv_5= '/' ( (lv_effectBody_6_0= RULE_STRING ) ) )?
+            {
+            // InternalTransition.g:88:3: ( ( (lv_triggers_0_0= ruleTriggerRule ) ) (otherlv_1= ',' ( (lv_triggers_2_0= ruleTriggerRule ) ) )* )?
+            int alt2=2;
+            int LA2_0 = input.LA(1);
+
+            if ( (LA2_0==15) ) {
+                alt2=1;
+            }
+            switch (alt2) {
+                case 1 :
+                    // InternalTransition.g:89:4: ( (lv_triggers_0_0= ruleTriggerRule ) ) (otherlv_1= ',' ( (lv_triggers_2_0= ruleTriggerRule ) ) )*
+                    {
+                    // InternalTransition.g:89:4: ( (lv_triggers_0_0= ruleTriggerRule ) )
+                    // InternalTransition.g:90:5: (lv_triggers_0_0= ruleTriggerRule )
+                    {
+                    // InternalTransition.g:90:5: (lv_triggers_0_0= ruleTriggerRule )
+                    // InternalTransition.g:91:6: lv_triggers_0_0= ruleTriggerRule
+                    {
+
+                    						newCompositeNode(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_0_0());
+                    					
+                    pushFollow(FOLLOW_3);
+                    lv_triggers_0_0=ruleTriggerRule();
+
+                    state._fsp--;
+
+
+                    						if (current==null) {
+                    							current = createModelElementForParent(grammarAccess.getTransitionRuleRule());
+                    						}
+                    						add(
+                    							current,
+                    							"triggers",
+                    							lv_triggers_0_0,
+                    							"org.eclipse.efm.papyrus.xtext.Transition.TriggerRule");
+                    						afterParserOrEnumRuleCall();
+                    					
+
+                    }
+
+
+                    }
+
+                    // InternalTransition.g:108:4: (otherlv_1= ',' ( (lv_triggers_2_0= ruleTriggerRule ) ) )*
+                    loop1:
+                    do {
+                        int alt1=2;
+                        int LA1_0 = input.LA(1);
+
+                        if ( (LA1_0==11) ) {
+                            alt1=1;
+                        }
+
+
+                        switch (alt1) {
+                    	case 1 :
+                    	    // InternalTransition.g:109:5: otherlv_1= ',' ( (lv_triggers_2_0= ruleTriggerRule ) )
+                    	    {
+                    	    otherlv_1=(Token)match(input,11,FOLLOW_4); 
+
+                    	    					newLeafNode(otherlv_1, grammarAccess.getTransitionRuleAccess().getCommaKeyword_0_1_0());
+                    	    				
+                    	    // InternalTransition.g:113:5: ( (lv_triggers_2_0= ruleTriggerRule ) )
+                    	    // InternalTransition.g:114:6: (lv_triggers_2_0= ruleTriggerRule )
+                    	    {
+                    	    // InternalTransition.g:114:6: (lv_triggers_2_0= ruleTriggerRule )
+                    	    // InternalTransition.g:115:7: lv_triggers_2_0= ruleTriggerRule
+                    	    {
+
+                    	    							newCompositeNode(grammarAccess.getTransitionRuleAccess().getTriggersTriggerRuleParserRuleCall_0_1_1_0());
+                    	    						
+                    	    pushFollow(FOLLOW_3);
+                    	    lv_triggers_2_0=ruleTriggerRule();
+
+                    	    state._fsp--;
+
+
+                    	    							if (current==null) {
+                    	    								current = createModelElementForParent(grammarAccess.getTransitionRuleRule());
+                    	    							}
+                    	    							add(
+                    	    								current,
+                    	    								"triggers",
+                    	    								lv_triggers_2_0,
+                    	    								"org.eclipse.efm.papyrus.xtext.Transition.TriggerRule");
+                    	    							afterParserOrEnumRuleCall();
+                    	    						
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop1;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalTransition.g:134:3: ( (lv_guard_3_0= ruleGuardRule ) )?
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0==18) ) {
+                alt3=1;
+            }
+            switch (alt3) {
+                case 1 :
+                    // InternalTransition.g:135:4: (lv_guard_3_0= ruleGuardRule )
+                    {
+                    // InternalTransition.g:135:4: (lv_guard_3_0= ruleGuardRule )
+                    // InternalTransition.g:136:5: lv_guard_3_0= ruleGuardRule
+                    {
+
+                    					newCompositeNode(grammarAccess.getTransitionRuleAccess().getGuardGuardRuleParserRuleCall_1_0());
+                    				
+                    pushFollow(FOLLOW_5);
+                    lv_guard_3_0=ruleGuardRule();
+
+                    state._fsp--;
+
+
+                    					if (current==null) {
+                    						current = createModelElementForParent(grammarAccess.getTransitionRuleRule());
+                    					}
+                    					set(
+                    						current,
+                    						"guard",
+                    						lv_guard_3_0,
+                    						"org.eclipse.efm.papyrus.xtext.Transition.GuardRule");
+                    					afterParserOrEnumRuleCall();
+                    				
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalTransition.g:153:3: ( (lv_tguard_4_0= ruleTGuardRule ) )?
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0==20) ) {
+                alt4=1;
+            }
+            switch (alt4) {
+                case 1 :
+                    // InternalTransition.g:154:4: (lv_tguard_4_0= ruleTGuardRule )
+                    {
+                    // InternalTransition.g:154:4: (lv_tguard_4_0= ruleTGuardRule )
+                    // InternalTransition.g:155:5: lv_tguard_4_0= ruleTGuardRule
+                    {
+
+                    					newCompositeNode(grammarAccess.getTransitionRuleAccess().getTguardTGuardRuleParserRuleCall_2_0());
+                    				
+                    pushFollow(FOLLOW_6);
+                    lv_tguard_4_0=ruleTGuardRule();
+
+                    state._fsp--;
+
+
+                    					if (current==null) {
+                    						current = createModelElementForParent(grammarAccess.getTransitionRuleRule());
+                    					}
+                    					set(
+                    						current,
+                    						"tguard",
+                    						lv_tguard_4_0,
+                    						"org.eclipse.efm.papyrus.xtext.Transition.TGuardRule");
+                    					afterParserOrEnumRuleCall();
+                    				
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalTransition.g:172:3: (otherlv_5= '/' ( (lv_effectBody_6_0= RULE_STRING ) ) )?
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==12) ) {
+                alt5=1;
+            }
+            switch (alt5) {
+                case 1 :
+                    // InternalTransition.g:173:4: otherlv_5= '/' ( (lv_effectBody_6_0= RULE_STRING ) )
+                    {
+                    otherlv_5=(Token)match(input,12,FOLLOW_7); 
+
+                    				newLeafNode(otherlv_5, grammarAccess.getTransitionRuleAccess().getSolidusKeyword_3_0());
+                    			
+                    // InternalTransition.g:177:4: ( (lv_effectBody_6_0= RULE_STRING ) )
+                    // InternalTransition.g:178:5: (lv_effectBody_6_0= RULE_STRING )
+                    {
+                    // InternalTransition.g:178:5: (lv_effectBody_6_0= RULE_STRING )
+                    // InternalTransition.g:179:6: lv_effectBody_6_0= RULE_STRING
+                    {
+                    lv_effectBody_6_0=(Token)match(input,RULE_STRING,FOLLOW_2); 
+
+                    						newLeafNode(lv_effectBody_6_0, grammarAccess.getTransitionRuleAccess().getEffectBodySTRINGTerminalRuleCall_3_1_0());
+                    					
+
+                    						if (current==null) {
+                    							current = createModelElement(grammarAccess.getTransitionRuleRule());
+                    						}
+                    						setWithLastConsumed(
+                    							current,
+                    							"effectBody",
+                    							lv_effectBody_6_0,
+                    							"org.eclipse.xtext.common.Terminals.STRING");
+                    					
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+
+            	leaveRule();
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionRule"
+
+
+    // $ANTLR start "entryRuleFQN"
+    // InternalTransition.g:200:1: entryRuleFQN returns [String current=null] : iv_ruleFQN= ruleFQN EOF ;
+    public final String entryRuleFQN() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleFQN = null;
+
+
+        try {
+            // InternalTransition.g:200:43: (iv_ruleFQN= ruleFQN EOF )
+            // InternalTransition.g:201:2: iv_ruleFQN= ruleFQN EOF
+            {
+             newCompositeNode(grammarAccess.getFQNRule()); 
+            pushFollow(FOLLOW_1);
+            iv_ruleFQN=ruleFQN();
+
+            state._fsp--;
+
+             current =iv_ruleFQN.getText(); 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleFQN"
+
+
+    // $ANTLR start "ruleFQN"
+    // InternalTransition.g:207:1: ruleFQN returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ID_0= RULE_ID ( (kw= '.' | kw= '::' ) this_ID_3= RULE_ID )* ) ;
+    public final AntlrDatatypeRuleToken ruleFQN() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_ID_0=null;
+        Token kw=null;
+        Token this_ID_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalTransition.g:213:2: ( (this_ID_0= RULE_ID ( (kw= '.' | kw= '::' ) this_ID_3= RULE_ID )* ) )
+            // InternalTransition.g:214:2: (this_ID_0= RULE_ID ( (kw= '.' | kw= '::' ) this_ID_3= RULE_ID )* )
+            {
+            // InternalTransition.g:214:2: (this_ID_0= RULE_ID ( (kw= '.' | kw= '::' ) this_ID_3= RULE_ID )* )
+            // InternalTransition.g:215:3: this_ID_0= RULE_ID ( (kw= '.' | kw= '::' ) this_ID_3= RULE_ID )*
+            {
+            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_8); 
+
+            			current.merge(this_ID_0);
+            		
+
+            			newLeafNode(this_ID_0, grammarAccess.getFQNAccess().getIDTerminalRuleCall_0());
+            		
+            // InternalTransition.g:222:3: ( (kw= '.' | kw= '::' ) this_ID_3= RULE_ID )*
+            loop7:
+            do {
+                int alt7=2;
+                int LA7_0 = input.LA(1);
+
+                if ( ((LA7_0>=13 && LA7_0<=14)) ) {
+                    alt7=1;
+                }
+
+
+                switch (alt7) {
+            	case 1 :
+            	    // InternalTransition.g:223:4: (kw= '.' | kw= '::' ) this_ID_3= RULE_ID
+            	    {
+            	    // InternalTransition.g:223:4: (kw= '.' | kw= '::' )
+            	    int alt6=2;
+            	    int LA6_0 = input.LA(1);
+
+            	    if ( (LA6_0==13) ) {
+            	        alt6=1;
+            	    }
+            	    else if ( (LA6_0==14) ) {
+            	        alt6=2;
+            	    }
+            	    else {
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 6, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt6) {
+            	        case 1 :
+            	            // InternalTransition.g:224:5: kw= '.'
+            	            {
+            	            kw=(Token)match(input,13,FOLLOW_9); 
+
+            	            					current.merge(kw);
+            	            					newLeafNode(kw, grammarAccess.getFQNAccess().getFullStopKeyword_1_0_0());
+            	            				
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalTransition.g:230:5: kw= '::'
+            	            {
+            	            kw=(Token)match(input,14,FOLLOW_9); 
+
+            	            					current.merge(kw);
+            	            					newLeafNode(kw, grammarAccess.getFQNAccess().getColonColonKeyword_1_0_1());
+            	            				
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    this_ID_3=(Token)match(input,RULE_ID,FOLLOW_8); 
+
+            	    				current.merge(this_ID_3);
+            	    			
+
+            	    				newLeafNode(this_ID_3, grammarAccess.getFQNAccess().getIDTerminalRuleCall_1_1());
+            	    			
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop7;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+
+            	leaveRule();
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleFQN"
+
+
+    // $ANTLR start "entryRuleTriggerRule"
+    // InternalTransition.g:248:1: entryRuleTriggerRule returns [EObject current=null] : iv_ruleTriggerRule= ruleTriggerRule EOF ;
+    public final EObject entryRuleTriggerRule() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTriggerRule = null;
+
+
+        try {
+            // InternalTransition.g:248:52: (iv_ruleTriggerRule= ruleTriggerRule EOF )
+            // InternalTransition.g:249:2: iv_ruleTriggerRule= ruleTriggerRule EOF
+            {
+             newCompositeNode(grammarAccess.getTriggerRuleRule()); 
+            pushFollow(FOLLOW_1);
+            iv_ruleTriggerRule=ruleTriggerRule();
+
+            state._fsp--;
+
+             current =iv_ruleTriggerRule; 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTriggerRule"
+
+
+    // $ANTLR start "ruleTriggerRule"
+    // InternalTransition.g:255:1: ruleTriggerRule returns [EObject current=null] : (otherlv_0= 'input' ( ( ruleFQN ) ) ( (lv_event_2_0= ruleEventRule ) )? ) ;
+    public final EObject ruleTriggerRule() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_event_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalTransition.g:261:2: ( (otherlv_0= 'input' ( ( ruleFQN ) ) ( (lv_event_2_0= ruleEventRule ) )? ) )
+            // InternalTransition.g:262:2: (otherlv_0= 'input' ( ( ruleFQN ) ) ( (lv_event_2_0= ruleEventRule ) )? )
+            {
+            // InternalTransition.g:262:2: (otherlv_0= 'input' ( ( ruleFQN ) ) ( (lv_event_2_0= ruleEventRule ) )? )
+            // InternalTransition.g:263:3: otherlv_0= 'input' ( ( ruleFQN ) ) ( (lv_event_2_0= ruleEventRule ) )?
+            {
+            otherlv_0=(Token)match(input,15,FOLLOW_9); 
+
+            			newLeafNode(otherlv_0, grammarAccess.getTriggerRuleAccess().getInputKeyword_0());
+            		
+            // InternalTransition.g:267:3: ( ( ruleFQN ) )
+            // InternalTransition.g:268:4: ( ruleFQN )
+            {
+            // InternalTransition.g:268:4: ( ruleFQN )
+            // InternalTransition.g:269:5: ruleFQN
+            {
+
+            					if (current==null) {
+            						current = createModelElement(grammarAccess.getTriggerRuleRule());
+            					}
+            				
+
+            					newCompositeNode(grammarAccess.getTriggerRuleAccess().getPortNamedElementCrossReference_1_0());
+            				
+            pushFollow(FOLLOW_10);
+            ruleFQN();
+
+            state._fsp--;
+
+
+            					afterParserOrEnumRuleCall();
+            				
+
+            }
+
+
+            }
+
+            // InternalTransition.g:283:3: ( (lv_event_2_0= ruleEventRule ) )?
+            int alt8=2;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0==16) ) {
+                alt8=1;
+            }
+            switch (alt8) {
+                case 1 :
+                    // InternalTransition.g:284:4: (lv_event_2_0= ruleEventRule )
+                    {
+                    // InternalTransition.g:284:4: (lv_event_2_0= ruleEventRule )
+                    // InternalTransition.g:285:5: lv_event_2_0= ruleEventRule
+                    {
+
+                    					newCompositeNode(grammarAccess.getTriggerRuleAccess().getEventEventRuleParserRuleCall_2_0());
+                    				
+                    pushFollow(FOLLOW_2);
+                    lv_event_2_0=ruleEventRule();
+
+                    state._fsp--;
+
+
+                    					if (current==null) {
+                    						current = createModelElementForParent(grammarAccess.getTriggerRuleRule());
+                    					}
+                    					set(
+                    						current,
+                    						"event",
+                    						lv_event_2_0,
+                    						"org.eclipse.efm.papyrus.xtext.Transition.EventRule");
+                    					afterParserOrEnumRuleCall();
+                    				
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+
+            	leaveRule();
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTriggerRule"
+
+
+    // $ANTLR start "entryRuleEventRule"
+    // InternalTransition.g:306:1: entryRuleEventRule returns [EObject current=null] : iv_ruleEventRule= ruleEventRule EOF ;
+    public final EObject entryRuleEventRule() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEventRule = null;
+
+
+        try {
+            // InternalTransition.g:306:50: (iv_ruleEventRule= ruleEventRule EOF )
+            // InternalTransition.g:307:2: iv_ruleEventRule= ruleEventRule EOF
+            {
+             newCompositeNode(grammarAccess.getEventRuleRule()); 
+            pushFollow(FOLLOW_1);
+            iv_ruleEventRule=ruleEventRule();
+
+            state._fsp--;
+
+             current =iv_ruleEventRule; 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEventRule"
+
+
+    // $ANTLR start "ruleEventRule"
+    // InternalTransition.g:313:1: ruleEventRule returns [EObject current=null] : this_ReceiveSignalEventRule_0= ruleReceiveSignalEventRule ;
+    public final EObject ruleEventRule() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_ReceiveSignalEventRule_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalTransition.g:319:2: (this_ReceiveSignalEventRule_0= ruleReceiveSignalEventRule )
+            // InternalTransition.g:320:2: this_ReceiveSignalEventRule_0= ruleReceiveSignalEventRule
+            {
+
+            		newCompositeNode(grammarAccess.getEventRuleAccess().getReceiveSignalEventRuleParserRuleCall());
+            	
+            pushFollow(FOLLOW_2);
+            this_ReceiveSignalEventRule_0=ruleReceiveSignalEventRule();
+
+            state._fsp--;
+
+
+            		current = this_ReceiveSignalEventRule_0;
+            		afterParserOrEnumRuleCall();
+            	
+
+            }
+
+
+            	leaveRule();
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEventRule"
+
+
+    // $ANTLR start "entryRuleReceiveSignalEventRule"
+    // InternalTransition.g:331:1: entryRuleReceiveSignalEventRule returns [EObject current=null] : iv_ruleReceiveSignalEventRule= ruleReceiveSignalEventRule EOF ;
+    public final EObject entryRuleReceiveSignalEventRule() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleReceiveSignalEventRule = null;
+
+
+        try {
+            // InternalTransition.g:331:63: (iv_ruleReceiveSignalEventRule= ruleReceiveSignalEventRule EOF )
+            // InternalTransition.g:332:2: iv_ruleReceiveSignalEventRule= ruleReceiveSignalEventRule EOF
+            {
+             newCompositeNode(grammarAccess.getReceiveSignalEventRuleRule()); 
+            pushFollow(FOLLOW_1);
+            iv_ruleReceiveSignalEventRule=ruleReceiveSignalEventRule();
+
+            state._fsp--;
+
+             current =iv_ruleReceiveSignalEventRule; 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleReceiveSignalEventRule"
+
+
+    // $ANTLR start "ruleReceiveSignalEventRule"
+    // InternalTransition.g:338:1: ruleReceiveSignalEventRule returns [EObject current=null] : ( () otherlv_1= '(' ( ( ( ruleFQN ) ) (otherlv_3= ',' ( ( ruleFQN ) ) )* )? otherlv_5= ')' ) ;
+    public final EObject ruleReceiveSignalEventRule() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalTransition.g:344:2: ( ( () otherlv_1= '(' ( ( ( ruleFQN ) ) (otherlv_3= ',' ( ( ruleFQN ) ) )* )? otherlv_5= ')' ) )
+            // InternalTransition.g:345:2: ( () otherlv_1= '(' ( ( ( ruleFQN ) ) (otherlv_3= ',' ( ( ruleFQN ) ) )* )? otherlv_5= ')' )
+            {
+            // InternalTransition.g:345:2: ( () otherlv_1= '(' ( ( ( ruleFQN ) ) (otherlv_3= ',' ( ( ruleFQN ) ) )* )? otherlv_5= ')' )
+            // InternalTransition.g:346:3: () otherlv_1= '(' ( ( ( ruleFQN ) ) (otherlv_3= ',' ( ( ruleFQN ) ) )* )? otherlv_5= ')'
+            {
+            // InternalTransition.g:346:3: ()
+            // InternalTransition.g:347:4: 
+            {
+
+            				current = forceCreateModelElement(
+            					grammarAccess.getReceiveSignalEventRuleAccess().getReceiveSignalEventRuleAction_0(),
+            					current);
+            			
+
+            }
+
+            otherlv_1=(Token)match(input,16,FOLLOW_11); 
+
+            			newLeafNode(otherlv_1, grammarAccess.getReceiveSignalEventRuleAccess().getLeftParenthesisKeyword_1());
+            		
+            // InternalTransition.g:357:3: ( ( ( ruleFQN ) ) (otherlv_3= ',' ( ( ruleFQN ) ) )* )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0==RULE_ID) ) {
+                alt10=1;
+            }
+            switch (alt10) {
+                case 1 :
+                    // InternalTransition.g:358:4: ( ( ruleFQN ) ) (otherlv_3= ',' ( ( ruleFQN ) ) )*
+                    {
+                    // InternalTransition.g:358:4: ( ( ruleFQN ) )
+                    // InternalTransition.g:359:5: ( ruleFQN )
+                    {
+                    // InternalTransition.g:359:5: ( ruleFQN )
+                    // InternalTransition.g:360:6: ruleFQN
+                    {
+
+                    						if (current==null) {
+                    							current = createModelElement(grammarAccess.getReceiveSignalEventRuleRule());
+                    						}
+                    					
+
+                    						newCompositeNode(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_0_0());
+                    					
+                    pushFollow(FOLLOW_12);
+                    ruleFQN();
+
+                    state._fsp--;
+
+
+                    						afterParserOrEnumRuleCall();
+                    					
+
+                    }
+
+
+                    }
+
+                    // InternalTransition.g:374:4: (otherlv_3= ',' ( ( ruleFQN ) ) )*
+                    loop9:
+                    do {
+                        int alt9=2;
+                        int LA9_0 = input.LA(1);
+
+                        if ( (LA9_0==11) ) {
+                            alt9=1;
+                        }
+
+
+                        switch (alt9) {
+                    	case 1 :
+                    	    // InternalTransition.g:375:5: otherlv_3= ',' ( ( ruleFQN ) )
+                    	    {
+                    	    otherlv_3=(Token)match(input,11,FOLLOW_9); 
+
+                    	    					newLeafNode(otherlv_3, grammarAccess.getReceiveSignalEventRuleAccess().getCommaKeyword_2_1_0());
+                    	    				
+                    	    // InternalTransition.g:379:5: ( ( ruleFQN ) )
+                    	    // InternalTransition.g:380:6: ( ruleFQN )
+                    	    {
+                    	    // InternalTransition.g:380:6: ( ruleFQN )
+                    	    // InternalTransition.g:381:7: ruleFQN
+                    	    {
+
+                    	    							if (current==null) {
+                    	    								current = createModelElement(grammarAccess.getReceiveSignalEventRuleRule());
+                    	    							}
+                    	    						
+
+                    	    							newCompositeNode(grammarAccess.getReceiveSignalEventRuleAccess().getParametersPropertyCrossReference_2_1_1_0());
+                    	    						
+                    	    pushFollow(FOLLOW_12);
+                    	    ruleFQN();
+
+                    	    state._fsp--;
+
+
+                    	    							afterParserOrEnumRuleCall();
+                    	    						
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop9;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,17,FOLLOW_2); 
+
+            			newLeafNode(otherlv_5, grammarAccess.getReceiveSignalEventRuleAccess().getRightParenthesisKeyword_3());
+            		
+
+            }
+
+
+            }
+
+
+            	leaveRule();
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleReceiveSignalEventRule"
+
+
+    // $ANTLR start "entryRuleGuardRule"
+    // InternalTransition.g:405:1: entryRuleGuardRule returns [EObject current=null] : iv_ruleGuardRule= ruleGuardRule EOF ;
+    public final EObject entryRuleGuardRule() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleGuardRule = null;
+
+
+        try {
+            // InternalTransition.g:405:50: (iv_ruleGuardRule= ruleGuardRule EOF )
+            // InternalTransition.g:406:2: iv_ruleGuardRule= ruleGuardRule EOF
+            {
+             newCompositeNode(grammarAccess.getGuardRuleRule()); 
+            pushFollow(FOLLOW_1);
+            iv_ruleGuardRule=ruleGuardRule();
+
+            state._fsp--;
+
+             current =iv_ruleGuardRule; 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleGuardRule"
+
+
+    // $ANTLR start "ruleGuardRule"
+    // InternalTransition.g:412:1: ruleGuardRule returns [EObject current=null] : (otherlv_0= '[' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= ']' ) ;
+    public final EObject ruleGuardRule() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_constraint_1_0=null;
+        Token otherlv_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalTransition.g:418:2: ( (otherlv_0= '[' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= ']' ) )
+            // InternalTransition.g:419:2: (otherlv_0= '[' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= ']' )
+            {
+            // InternalTransition.g:419:2: (otherlv_0= '[' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= ']' )
+            // InternalTransition.g:420:3: otherlv_0= '[' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= ']'
+            {
+            otherlv_0=(Token)match(input,18,FOLLOW_7); 
+
+            			newLeafNode(otherlv_0, grammarAccess.getGuardRuleAccess().getLeftSquareBracketKeyword_0());
+            		
+            // InternalTransition.g:424:3: ( (lv_constraint_1_0= RULE_STRING ) )
+            // InternalTransition.g:425:4: (lv_constraint_1_0= RULE_STRING )
+            {
+            // InternalTransition.g:425:4: (lv_constraint_1_0= RULE_STRING )
+            // InternalTransition.g:426:5: lv_constraint_1_0= RULE_STRING
+            {
+            lv_constraint_1_0=(Token)match(input,RULE_STRING,FOLLOW_13); 
+
+            					newLeafNode(lv_constraint_1_0, grammarAccess.getGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0());
+            				
+
+            					if (current==null) {
+            						current = createModelElement(grammarAccess.getGuardRuleRule());
+            					}
+            					setWithLastConsumed(
+            						current,
+            						"constraint",
+            						lv_constraint_1_0,
+            						"org.eclipse.xtext.common.Terminals.STRING");
+            				
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,19,FOLLOW_2); 
+
+            			newLeafNode(otherlv_2, grammarAccess.getGuardRuleAccess().getRightSquareBracketKeyword_2());
+            		
+
+            }
+
+
+            }
+
+
+            	leaveRule();
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleGuardRule"
+
+
+    // $ANTLR start "entryRuleTGuardRule"
+    // InternalTransition.g:450:1: entryRuleTGuardRule returns [EObject current=null] : iv_ruleTGuardRule= ruleTGuardRule EOF ;
+    public final EObject entryRuleTGuardRule() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTGuardRule = null;
+
+
+        try {
+            // InternalTransition.g:450:51: (iv_ruleTGuardRule= ruleTGuardRule EOF )
+            // InternalTransition.g:451:2: iv_ruleTGuardRule= ruleTGuardRule EOF
+            {
+             newCompositeNode(grammarAccess.getTGuardRuleRule()); 
+            pushFollow(FOLLOW_1);
+            iv_ruleTGuardRule=ruleTGuardRule();
+
+            state._fsp--;
+
+             current =iv_ruleTGuardRule; 
+            match(input,EOF,FOLLOW_2); 
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTGuardRule"
+
+
+    // $ANTLR start "ruleTGuardRule"
+    // InternalTransition.g:457:1: ruleTGuardRule returns [EObject current=null] : (otherlv_0= '{' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= '}' ) ;
+    public final EObject ruleTGuardRule() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_constraint_1_0=null;
+        Token otherlv_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalTransition.g:463:2: ( (otherlv_0= '{' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= '}' ) )
+            // InternalTransition.g:464:2: (otherlv_0= '{' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= '}' )
+            {
+            // InternalTransition.g:464:2: (otherlv_0= '{' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= '}' )
+            // InternalTransition.g:465:3: otherlv_0= '{' ( (lv_constraint_1_0= RULE_STRING ) ) otherlv_2= '}'
+            {
+            otherlv_0=(Token)match(input,20,FOLLOW_7); 
+
+            			newLeafNode(otherlv_0, grammarAccess.getTGuardRuleAccess().getLeftCurlyBracketKeyword_0());
+            		
+            // InternalTransition.g:469:3: ( (lv_constraint_1_0= RULE_STRING ) )
+            // InternalTransition.g:470:4: (lv_constraint_1_0= RULE_STRING )
+            {
+            // InternalTransition.g:470:4: (lv_constraint_1_0= RULE_STRING )
+            // InternalTransition.g:471:5: lv_constraint_1_0= RULE_STRING
+            {
+            lv_constraint_1_0=(Token)match(input,RULE_STRING,FOLLOW_14); 
+
+            					newLeafNode(lv_constraint_1_0, grammarAccess.getTGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0());
+            				
+
+            					if (current==null) {
+            						current = createModelElement(grammarAccess.getTGuardRuleRule());
+            					}
+            					setWithLastConsumed(
+            						current,
+            						"constraint",
+            						lv_constraint_1_0,
+            						"org.eclipse.xtext.common.Terminals.STRING");
+            				
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,21,FOLLOW_2); 
+
+            			newLeafNode(otherlv_2, grammarAccess.getTGuardRuleAccess().getRightCurlyBracketKeyword_2());
+            		
+
+            }
+
+
+            }
+
+
+            	leaveRule();
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTGuardRule"
+
+    // Delegated rules
+
+
+ 
+
+    public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000000000141802L});
+    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000101002L});
+    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000001002L});
+    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000006002L});
+    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000010002L});
+    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000020020L});
+    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000020800L});
+    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000080000L});
+    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000200000L});
+
+}
\ No newline at end of file
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/scoping/AbstractTransitionScopeProvider.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/scoping/AbstractTransitionScopeProvider.java
new file mode 100644
index 0000000..a7e5908
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/scoping/AbstractTransitionScopeProvider.java
@@ -0,0 +1,18 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.scoping;
+
+import org.eclipse.xtext.scoping.impl.DelegatingScopeProvider;
+
+public abstract class AbstractTransitionScopeProvider extends DelegatingScopeProvider {
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/serializer/TransitionSemanticSequencer.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/serializer/TransitionSemanticSequencer.java
new file mode 100644
index 0000000..c7b0e40
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/serializer/TransitionSemanticSequencer.java
@@ -0,0 +1,150 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.serializer;
+
+import com.google.inject.Inject;
+import java.util.Set;
+import org.eclipse.efm.papyrus.xtext.services.TransitionGrammarAccess;
+import org.eclipse.efm.papyrus.xtext.transition.GuardRule;
+import org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule;
+import org.eclipse.efm.papyrus.xtext.transition.TGuardRule;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionPackage;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionRule;
+import org.eclipse.efm.papyrus.xtext.transition.TriggerRule;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Parameter;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.serializer.ISerializationContext;
+import org.eclipse.xtext.serializer.acceptor.SequenceFeeder;
+import org.eclipse.xtext.serializer.sequencer.AbstractDelegatingSemanticSequencer;
+import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient;
+
+@SuppressWarnings("all")
+public class TransitionSemanticSequencer extends AbstractDelegatingSemanticSequencer {
+
+	@Inject
+	private TransitionGrammarAccess grammarAccess;
+	
+	@Override
+	public void sequence(ISerializationContext context, EObject semanticObject) {
+		EPackage epackage = semanticObject.eClass().getEPackage();
+		ParserRule rule = context.getParserRule();
+		Action action = context.getAssignedAction();
+		Set<Parameter> parameters = context.getEnabledBooleanParameters();
+		if (epackage == TransitionPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case TransitionPackage.GUARD_RULE:
+				sequence_GuardRule(context, (GuardRule) semanticObject); 
+				return; 
+			case TransitionPackage.RECEIVE_SIGNAL_EVENT_RULE:
+				sequence_ReceiveSignalEventRule(context, (ReceiveSignalEventRule) semanticObject); 
+				return; 
+			case TransitionPackage.TGUARD_RULE:
+				sequence_TGuardRule(context, (TGuardRule) semanticObject); 
+				return; 
+			case TransitionPackage.TRANSITION_RULE:
+				sequence_TransitionRule(context, (TransitionRule) semanticObject); 
+				return; 
+			case TransitionPackage.TRIGGER_RULE:
+				sequence_TriggerRule(context, (TriggerRule) semanticObject); 
+				return; 
+			}
+		if (errorAcceptor != null)
+			errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
+	}
+	
+	/**
+	 * Contexts:
+	 *     GuardRule returns GuardRule
+	 *
+	 * Constraint:
+	 *     constraint=STRING
+	 */
+	protected void sequence_GuardRule(ISerializationContext context, GuardRule semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, TransitionPackage.Literals.GUARD_RULE__CONSTRAINT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, TransitionPackage.Literals.GUARD_RULE__CONSTRAINT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0(), semanticObject.getConstraint());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EventRule returns ReceiveSignalEventRule
+	 *     ReceiveSignalEventRule returns ReceiveSignalEventRule
+	 *
+	 * Constraint:
+	 *     (parameters+=[Property|FQN] parameters+=[Property|FQN]*)?
+	 */
+	protected void sequence_ReceiveSignalEventRule(ISerializationContext context, ReceiveSignalEventRule semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TGuardRule returns TGuardRule
+	 *
+	 * Constraint:
+	 *     constraint=STRING
+	 */
+	protected void sequence_TGuardRule(ISerializationContext context, TGuardRule semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, TransitionPackage.Literals.TGUARD_RULE__CONSTRAINT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, TransitionPackage.Literals.TGUARD_RULE__CONSTRAINT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getTGuardRuleAccess().getConstraintSTRINGTerminalRuleCall_1_0(), semanticObject.getConstraint());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionRule returns TransitionRule
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             triggers+=TriggerRule 
+	 *             triggers+=TriggerRule* 
+	 *             ((guard=GuardRule? tguard=TGuardRule effectBody=STRING) | (guard=GuardRule? effectBody=STRING) | effectBody=STRING)
+	 *         ) | 
+	 *         (guard=GuardRule? tguard=TGuardRule effectBody=STRING) | 
+	 *         (guard=GuardRule? effectBody=STRING) | 
+	 *         effectBody=STRING
+	 *     )?
+	 */
+	protected void sequence_TransitionRule(ISerializationContext context, TransitionRule semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TriggerRule returns TriggerRule
+	 *
+	 * Constraint:
+	 *     (port=[NamedElement|FQN] event=EventRule?)
+	 */
+	protected void sequence_TriggerRule(ISerializationContext context, TriggerRule semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/serializer/TransitionSyntacticSequencer.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/serializer/TransitionSyntacticSequencer.java
new file mode 100644
index 0000000..e39a4dd
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/serializer/TransitionSyntacticSequencer.java
@@ -0,0 +1,52 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.serializer;
+
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.efm.papyrus.xtext.services.TransitionGrammarAccess;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.AbstractElementAlias;
+import org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider.ISynTransition;
+import org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer;
+
+@SuppressWarnings("all")
+public class TransitionSyntacticSequencer extends AbstractSyntacticSequencer {
+
+	protected TransitionGrammarAccess grammarAccess;
+	
+	@Inject
+	protected void init(IGrammarAccess access) {
+		grammarAccess = (TransitionGrammarAccess) access;
+	}
+	
+	@Override
+	protected String getUnassignedRuleCallToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+		return "";
+	}
+	
+	
+	@Override
+	protected void emitUnassignedTokens(EObject semanticObject, ISynTransition transition, INode fromNode, INode toNode) {
+		if (transition.getAmbiguousSyntaxes().isEmpty()) return;
+		List<INode> transitionNodes = collectNodes(fromNode, toNode);
+		for (AbstractElementAlias syntax : transition.getAmbiguousSyntaxes()) {
+			List<INode> syntaxNodes = getNodesFor(transitionNodes, syntax);
+			acceptNodes(getLastNavigableState(), syntaxNodes);
+		}
+	}
+
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/services/TransitionGrammarAccess.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/services/TransitionGrammarAccess.java
new file mode 100644
index 0000000..1b340c7
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/services/TransitionGrammarAccess.java
@@ -0,0 +1,525 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.services;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.List;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.Grammar;
+import org.eclipse.xtext.GrammarUtil;
+import org.eclipse.xtext.Group;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.TerminalRule;
+import org.eclipse.xtext.common.services.TerminalsGrammarAccess;
+import org.eclipse.xtext.service.AbstractElementFinder.AbstractGrammarElementFinder;
+import org.eclipse.xtext.service.GrammarProvider;
+
+@Singleton
+public class TransitionGrammarAccess extends AbstractGrammarElementFinder {
+	
+	public class TransitionRuleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.papyrus.xtext.Transition.TransitionRule");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cGroup.eContents().get(0);
+		private final Assignment cTriggersAssignment_0_0 = (Assignment)cGroup_0.eContents().get(0);
+		private final RuleCall cTriggersTriggerRuleParserRuleCall_0_0_0 = (RuleCall)cTriggersAssignment_0_0.eContents().get(0);
+		private final Group cGroup_0_1 = (Group)cGroup_0.eContents().get(1);
+		private final Keyword cCommaKeyword_0_1_0 = (Keyword)cGroup_0_1.eContents().get(0);
+		private final Assignment cTriggersAssignment_0_1_1 = (Assignment)cGroup_0_1.eContents().get(1);
+		private final RuleCall cTriggersTriggerRuleParserRuleCall_0_1_1_0 = (RuleCall)cTriggersAssignment_0_1_1.eContents().get(0);
+		private final Assignment cGuardAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cGuardGuardRuleParserRuleCall_1_0 = (RuleCall)cGuardAssignment_1.eContents().get(0);
+		private final Assignment cTguardAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTguardTGuardRuleParserRuleCall_2_0 = (RuleCall)cTguardAssignment_2.eContents().get(0);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Keyword cSolidusKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final Assignment cEffectBodyAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final RuleCall cEffectBodySTRINGTerminalRuleCall_3_1_0 = (RuleCall)cEffectBodyAssignment_3_1.eContents().get(0);
+		
+		////Model:
+		////	greetings+=Greeting*;
+		////	
+		////Greeting:
+		////	'Hello' name=ID '!';
+		/////////////////////////
+		//// Transition Rule
+		/////////////////////////
+		//TransitionRule:
+		//	(triggers+=TriggerRule (',' triggers+=TriggerRule)*)?
+		//	guard=GuardRule?
+		//	tguard=TGuardRule? ('/' effectBody=STRING)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//(triggers+=TriggerRule (',' triggers+=TriggerRule)*)? guard=GuardRule? tguard=TGuardRule? ('/' effectBody=STRING)?
+		public Group getGroup() { return cGroup; }
+		
+		//(triggers+=TriggerRule (',' triggers+=TriggerRule)*)?
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//triggers+=TriggerRule
+		public Assignment getTriggersAssignment_0_0() { return cTriggersAssignment_0_0; }
+		
+		//TriggerRule
+		public RuleCall getTriggersTriggerRuleParserRuleCall_0_0_0() { return cTriggersTriggerRuleParserRuleCall_0_0_0; }
+		
+		//(',' triggers+=TriggerRule)*
+		public Group getGroup_0_1() { return cGroup_0_1; }
+		
+		//','
+		public Keyword getCommaKeyword_0_1_0() { return cCommaKeyword_0_1_0; }
+		
+		//triggers+=TriggerRule
+		public Assignment getTriggersAssignment_0_1_1() { return cTriggersAssignment_0_1_1; }
+		
+		//TriggerRule
+		public RuleCall getTriggersTriggerRuleParserRuleCall_0_1_1_0() { return cTriggersTriggerRuleParserRuleCall_0_1_1_0; }
+		
+		//guard=GuardRule?
+		public Assignment getGuardAssignment_1() { return cGuardAssignment_1; }
+		
+		//GuardRule
+		public RuleCall getGuardGuardRuleParserRuleCall_1_0() { return cGuardGuardRuleParserRuleCall_1_0; }
+		
+		//tguard=TGuardRule?
+		public Assignment getTguardAssignment_2() { return cTguardAssignment_2; }
+		
+		//TGuardRule
+		public RuleCall getTguardTGuardRuleParserRuleCall_2_0() { return cTguardTGuardRuleParserRuleCall_2_0; }
+		
+		//('/' effectBody=STRING)?
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//'/'
+		public Keyword getSolidusKeyword_3_0() { return cSolidusKeyword_3_0; }
+		
+		//effectBody=STRING
+		public Assignment getEffectBodyAssignment_3_1() { return cEffectBodyAssignment_3_1; }
+		
+		//STRING
+		public RuleCall getEffectBodySTRINGTerminalRuleCall_3_1_0() { return cEffectBodySTRINGTerminalRuleCall_3_1_0; }
+	}
+	public class FQNElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.papyrus.xtext.Transition.FQN");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cIDTerminalRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_1_0 = (Alternatives)cGroup_1.eContents().get(0);
+		private final Keyword cFullStopKeyword_1_0_0 = (Keyword)cAlternatives_1_0.eContents().get(0);
+		private final Keyword cColonColonKeyword_1_0_1 = (Keyword)cAlternatives_1_0.eContents().get(1);
+		private final RuleCall cIDTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
+		
+		/////////////////////////
+		//// [ Fully  [ Qualified ] ] Name
+		/////////////////////////
+		//FQN:
+		//	ID (('.' | '::') ID)*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//ID (('.' | '::') ID)*
+		public Group getGroup() { return cGroup; }
+		
+		//ID
+		public RuleCall getIDTerminalRuleCall_0() { return cIDTerminalRuleCall_0; }
+		
+		//(('.' | '::') ID)*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//('.' | '::')
+		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_1_0_0() { return cFullStopKeyword_1_0_0; }
+		
+		//'::'
+		public Keyword getColonColonKeyword_1_0_1() { return cColonColonKeyword_1_0_1; }
+		
+		//ID
+		public RuleCall getIDTerminalRuleCall_1_1() { return cIDTerminalRuleCall_1_1; }
+	}
+	public class TriggerRuleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.papyrus.xtext.Transition.TriggerRule");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cInputKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cPortAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cPortNamedElementCrossReference_1_0 = (CrossReference)cPortAssignment_1.eContents().get(0);
+		private final RuleCall cPortNamedElementFQNParserRuleCall_1_0_1 = (RuleCall)cPortNamedElementCrossReference_1_0.eContents().get(1);
+		private final Assignment cEventAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cEventEventRuleParserRuleCall_2_0 = (RuleCall)cEventAssignment_2.eContents().get(0);
+		
+		////////////////////////
+		//// EVENTS
+		////////////////////////
+		//TriggerRule:
+		//	"input" / *(path=QualifiedName)?* / port=[uml::NamedElement|FQN] event=EventRule?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//"input" / *(path=QualifiedName)?* / port=[uml::NamedElement|FQN] event=EventRule?
+		public Group getGroup() { return cGroup; }
+		
+		//"input"
+		public Keyword getInputKeyword_0() { return cInputKeyword_0; }
+		
+		/// *(path=QualifiedName)?* / port=[uml::NamedElement|FQN]
+		public Assignment getPortAssignment_1() { return cPortAssignment_1; }
+		
+		//[uml::NamedElement|FQN]
+		public CrossReference getPortNamedElementCrossReference_1_0() { return cPortNamedElementCrossReference_1_0; }
+		
+		//FQN
+		public RuleCall getPortNamedElementFQNParserRuleCall_1_0_1() { return cPortNamedElementFQNParserRuleCall_1_0_1; }
+		
+		//event=EventRule?
+		public Assignment getEventAssignment_2() { return cEventAssignment_2; }
+		
+		//EventRule
+		public RuleCall getEventEventRuleParserRuleCall_2_0() { return cEventEventRuleParserRuleCall_2_0; }
+	}
+	public class EventRuleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.papyrus.xtext.Transition.EventRule");
+		private final RuleCall cReceiveSignalEventRuleParserRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//EventRule:
+		//	ReceiveSignalEventRule
+		//	//	|CallOrSignalEventRule
+		//	//	| AnyReceiveEventRule
+		//	//	| TimeEventRule
+		//	//	| ChangeEventRule
+		//;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//ReceiveSignalEventRule
+		public RuleCall getReceiveSignalEventRuleParserRuleCall() { return cReceiveSignalEventRuleParserRuleCall; }
+	}
+	public class ReceiveSignalEventRuleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.papyrus.xtext.Transition.ReceiveSignalEventRule");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cReceiveSignalEventRuleAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Assignment cParametersAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final CrossReference cParametersPropertyCrossReference_2_0_0 = (CrossReference)cParametersAssignment_2_0.eContents().get(0);
+		private final RuleCall cParametersPropertyFQNParserRuleCall_2_0_0_1 = (RuleCall)cParametersPropertyCrossReference_2_0_0.eContents().get(1);
+		private final Group cGroup_2_1 = (Group)cGroup_2.eContents().get(1);
+		private final Keyword cCommaKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
+		private final Assignment cParametersAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
+		private final CrossReference cParametersPropertyCrossReference_2_1_1_0 = (CrossReference)cParametersAssignment_2_1_1.eContents().get(0);
+		private final RuleCall cParametersPropertyFQNParserRuleCall_2_1_1_0_1 = (RuleCall)cParametersPropertyCrossReference_2_1_1_0.eContents().get(1);
+		private final Keyword cRightParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		
+		//ReceiveSignalEventRule:
+		//	{ReceiveSignalEventRule}
+		//	'(' (parameters+=[uml::Property|FQN] (',' parameters+=[uml::Property|FQN])*)? ')';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{ReceiveSignalEventRule} '(' (parameters+=[uml::Property|FQN] (',' parameters+=[uml::Property|FQN])*)? ')'
+		public Group getGroup() { return cGroup; }
+		
+		//{ReceiveSignalEventRule}
+		public Action getReceiveSignalEventRuleAction_0() { return cReceiveSignalEventRuleAction_0; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
+		
+		//(parameters+=[uml::Property|FQN] (',' parameters+=[uml::Property|FQN])*)?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//parameters+=[uml::Property|FQN]
+		public Assignment getParametersAssignment_2_0() { return cParametersAssignment_2_0; }
+		
+		//[uml::Property|FQN]
+		public CrossReference getParametersPropertyCrossReference_2_0_0() { return cParametersPropertyCrossReference_2_0_0; }
+		
+		//FQN
+		public RuleCall getParametersPropertyFQNParserRuleCall_2_0_0_1() { return cParametersPropertyFQNParserRuleCall_2_0_0_1; }
+		
+		//(',' parameters+=[uml::Property|FQN])*
+		public Group getGroup_2_1() { return cGroup_2_1; }
+		
+		//','
+		public Keyword getCommaKeyword_2_1_0() { return cCommaKeyword_2_1_0; }
+		
+		//parameters+=[uml::Property|FQN]
+		public Assignment getParametersAssignment_2_1_1() { return cParametersAssignment_2_1_1; }
+		
+		//[uml::Property|FQN]
+		public CrossReference getParametersPropertyCrossReference_2_1_1_0() { return cParametersPropertyCrossReference_2_1_1_0; }
+		
+		//FQN
+		public RuleCall getParametersPropertyFQNParserRuleCall_2_1_1_0_1() { return cParametersPropertyFQNParserRuleCall_2_1_1_0_1; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_3() { return cRightParenthesisKeyword_3; }
+	}
+	public class GuardRuleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.papyrus.xtext.Transition.GuardRule");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cLeftSquareBracketKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cConstraintAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cConstraintSTRINGTerminalRuleCall_1_0 = (RuleCall)cConstraintAssignment_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		
+		/// *QualifiedName :
+		//	path=[uml::Namespace]'::' (remaining=QualifiedName)? ; * / ///////////////////////
+		//// GUARD
+		/////////////////////////
+		//GuardRule:
+		//	'[' constraint=STRING ']';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'[' constraint=STRING ']'
+		public Group getGroup() { return cGroup; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_0() { return cLeftSquareBracketKeyword_0; }
+		
+		//constraint=STRING
+		public Assignment getConstraintAssignment_1() { return cConstraintAssignment_1; }
+		
+		//STRING
+		public RuleCall getConstraintSTRINGTerminalRuleCall_1_0() { return cConstraintSTRINGTerminalRuleCall_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_2() { return cRightSquareBracketKeyword_2; }
+	}
+	public class TGuardRuleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.papyrus.xtext.Transition.TGuardRule");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cConstraintAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cConstraintSTRINGTerminalRuleCall_1_0 = (RuleCall)cConstraintAssignment_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		
+		/////////////////////////
+		//// TGUARD
+		/////////////////////////
+		//TGuardRule:
+		//	'{' constraint=STRING '}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'{' constraint=STRING '}'
+		public Group getGroup() { return cGroup; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_0() { return cLeftCurlyBracketKeyword_0; }
+		
+		//constraint=STRING
+		public Assignment getConstraintAssignment_1() { return cConstraintAssignment_1; }
+		
+		//STRING
+		public RuleCall getConstraintSTRINGTerminalRuleCall_1_0() { return cConstraintSTRINGTerminalRuleCall_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_2() { return cRightCurlyBracketKeyword_2; }
+	}
+	
+	
+	private final TransitionRuleElements pTransitionRule;
+	private final FQNElements pFQN;
+	private final TriggerRuleElements pTriggerRule;
+	private final EventRuleElements pEventRule;
+	private final ReceiveSignalEventRuleElements pReceiveSignalEventRule;
+	private final GuardRuleElements pGuardRule;
+	private final TGuardRuleElements pTGuardRule;
+	
+	private final Grammar grammar;
+	
+	private final TerminalsGrammarAccess gaTerminals;
+
+	@Inject
+	public TransitionGrammarAccess(GrammarProvider grammarProvider,
+			TerminalsGrammarAccess gaTerminals) {
+		this.grammar = internalFindGrammar(grammarProvider);
+		this.gaTerminals = gaTerminals;
+		this.pTransitionRule = new TransitionRuleElements();
+		this.pFQN = new FQNElements();
+		this.pTriggerRule = new TriggerRuleElements();
+		this.pEventRule = new EventRuleElements();
+		this.pReceiveSignalEventRule = new ReceiveSignalEventRuleElements();
+		this.pGuardRule = new GuardRuleElements();
+		this.pTGuardRule = new TGuardRuleElements();
+	}
+	
+	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
+		Grammar grammar = grammarProvider.getGrammar(this);
+		while (grammar != null) {
+			if ("org.eclipse.efm.papyrus.xtext.Transition".equals(grammar.getName())) {
+				return grammar;
+			}
+			List<Grammar> grammars = grammar.getUsedGrammars();
+			if (!grammars.isEmpty()) {
+				grammar = grammars.iterator().next();
+			} else {
+				return null;
+			}
+		}
+		return grammar;
+	}
+	
+	@Override
+	public Grammar getGrammar() {
+		return grammar;
+	}
+	
+	
+	public TerminalsGrammarAccess getTerminalsGrammarAccess() {
+		return gaTerminals;
+	}
+
+	
+	////Model:
+	////	greetings+=Greeting*;
+	////	
+	////Greeting:
+	////	'Hello' name=ID '!';
+	/////////////////////////
+	//// Transition Rule
+	/////////////////////////
+	//TransitionRule:
+	//	(triggers+=TriggerRule (',' triggers+=TriggerRule)*)?
+	//	guard=GuardRule?
+	//	tguard=TGuardRule? ('/' effectBody=STRING)?;
+	public TransitionRuleElements getTransitionRuleAccess() {
+		return pTransitionRule;
+	}
+	
+	public ParserRule getTransitionRuleRule() {
+		return getTransitionRuleAccess().getRule();
+	}
+	
+	/////////////////////////
+	//// [ Fully  [ Qualified ] ] Name
+	/////////////////////////
+	//FQN:
+	//	ID (('.' | '::') ID)*;
+	public FQNElements getFQNAccess() {
+		return pFQN;
+	}
+	
+	public ParserRule getFQNRule() {
+		return getFQNAccess().getRule();
+	}
+	
+	////////////////////////
+	//// EVENTS
+	////////////////////////
+	//TriggerRule:
+	//	"input" / *(path=QualifiedName)?* / port=[uml::NamedElement|FQN] event=EventRule?;
+	public TriggerRuleElements getTriggerRuleAccess() {
+		return pTriggerRule;
+	}
+	
+	public ParserRule getTriggerRuleRule() {
+		return getTriggerRuleAccess().getRule();
+	}
+	
+	//EventRule:
+	//	ReceiveSignalEventRule
+	//	//	|CallOrSignalEventRule
+	//	//	| AnyReceiveEventRule
+	//	//	| TimeEventRule
+	//	//	| ChangeEventRule
+	//;
+	public EventRuleElements getEventRuleAccess() {
+		return pEventRule;
+	}
+	
+	public ParserRule getEventRuleRule() {
+		return getEventRuleAccess().getRule();
+	}
+	
+	//ReceiveSignalEventRule:
+	//	{ReceiveSignalEventRule}
+	//	'(' (parameters+=[uml::Property|FQN] (',' parameters+=[uml::Property|FQN])*)? ')';
+	public ReceiveSignalEventRuleElements getReceiveSignalEventRuleAccess() {
+		return pReceiveSignalEventRule;
+	}
+	
+	public ParserRule getReceiveSignalEventRuleRule() {
+		return getReceiveSignalEventRuleAccess().getRule();
+	}
+	
+	/// *QualifiedName :
+	//	path=[uml::Namespace]'::' (remaining=QualifiedName)? ; * / ///////////////////////
+	//// GUARD
+	/////////////////////////
+	//GuardRule:
+	//	'[' constraint=STRING ']';
+	public GuardRuleElements getGuardRuleAccess() {
+		return pGuardRule;
+	}
+	
+	public ParserRule getGuardRuleRule() {
+		return getGuardRuleAccess().getRule();
+	}
+	
+	/////////////////////////
+	//// TGUARD
+	/////////////////////////
+	//TGuardRule:
+	//	'{' constraint=STRING '}';
+	public TGuardRuleElements getTGuardRuleAccess() {
+		return pTGuardRule;
+	}
+	
+	public ParserRule getTGuardRuleRule() {
+		return getTGuardRuleAccess().getRule();
+	}
+	
+	//terminal ID:
+	//	'^'? ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*;
+	public TerminalRule getIDRule() {
+		return gaTerminals.getIDRule();
+	}
+	
+	//terminal INT returns ecore::EInt:
+	//	'0'..'9'+;
+	public TerminalRule getINTRule() {
+		return gaTerminals.getINTRule();
+	}
+	
+	//terminal STRING:
+	//	'"' ('\\' . | !('\\' | '"'))* '"' | "'" ('\\' . | !('\\' | "'"))* "'";
+	public TerminalRule getSTRINGRule() {
+		return gaTerminals.getSTRINGRule();
+	}
+	
+	//terminal ML_COMMENT:
+	//	'/ *'->'* /';
+	public TerminalRule getML_COMMENTRule() {
+		return gaTerminals.getML_COMMENTRule();
+	}
+	
+	//terminal SL_COMMENT:
+	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
+	public TerminalRule getSL_COMMENTRule() {
+		return gaTerminals.getSL_COMMENTRule();
+	}
+	
+	//terminal WS:
+	//	' ' | '\t' | '\r' | '\n'+;
+	public TerminalRule getWSRule() {
+		return gaTerminals.getWSRule();
+	}
+	
+	//terminal ANY_OTHER:
+	//	.;
+	public TerminalRule getANY_OTHERRule() {
+		return gaTerminals.getANY_OTHERRule();
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/EventRule.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/EventRule.java
new file mode 100644
index 0000000..89b1bdf
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/EventRule.java
@@ -0,0 +1,31 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Event Rule</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getEventRule()
+ * @model
+ * @generated
+ */
+public interface EventRule extends EObject
+{
+} // EventRule
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/GuardRule.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/GuardRule.java
new file mode 100644
index 0000000..95d1b38
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/GuardRule.java
@@ -0,0 +1,63 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Guard Rule</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.GuardRule#getConstraint <em>Constraint</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getGuardRule()
+ * @model
+ * @generated
+ */
+public interface GuardRule extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Constraint</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Constraint</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Constraint</em>' attribute.
+   * @see #setConstraint(String)
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getGuardRule_Constraint()
+   * @model
+   * @generated
+   */
+  String getConstraint();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.efm.papyrus.xtext.transition.GuardRule#getConstraint <em>Constraint</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Constraint</em>' attribute.
+   * @see #getConstraint()
+   * @generated
+   */
+  void setConstraint(String value);
+
+} // GuardRule
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/ReceiveSignalEventRule.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/ReceiveSignalEventRule.java
new file mode 100644
index 0000000..0fa815f
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/ReceiveSignalEventRule.java
@@ -0,0 +1,55 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.uml2.uml.Property;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Receive Signal Event Rule</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule#getParameters <em>Parameters</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getReceiveSignalEventRule()
+ * @model
+ * @generated
+ */
+public interface ReceiveSignalEventRule extends EventRule
+{
+  /**
+   * Returns the value of the '<em><b>Parameters</b></em>' reference list.
+   * The list contents are of type {@link org.eclipse.uml2.uml.Property}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Parameters</em>' reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Parameters</em>' reference list.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getReceiveSignalEventRule_Parameters()
+   * @model
+   * @generated
+   */
+  EList<Property> getParameters();
+
+} // ReceiveSignalEventRule
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TGuardRule.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TGuardRule.java
new file mode 100644
index 0000000..00c17ff
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TGuardRule.java
@@ -0,0 +1,63 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>TGuard Rule</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.TGuardRule#getConstraint <em>Constraint</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTGuardRule()
+ * @model
+ * @generated
+ */
+public interface TGuardRule extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Constraint</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Constraint</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Constraint</em>' attribute.
+   * @see #setConstraint(String)
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTGuardRule_Constraint()
+   * @model
+   * @generated
+   */
+  String getConstraint();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.efm.papyrus.xtext.transition.TGuardRule#getConstraint <em>Constraint</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Constraint</em>' attribute.
+   * @see #getConstraint()
+   * @generated
+   */
+  void setConstraint(String value);
+
+} // TGuardRule
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TransitionFactory.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TransitionFactory.java
new file mode 100644
index 0000000..ff785b6
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TransitionFactory.java
@@ -0,0 +1,100 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage
+ * @generated
+ */
+public interface TransitionFactory extends EFactory
+{
+  /**
+   * The singleton instance of the factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  TransitionFactory eINSTANCE = org.eclipse.efm.papyrus.xtext.transition.impl.TransitionFactoryImpl.init();
+
+  /**
+   * Returns a new object of class '<em>Rule</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Rule</em>'.
+   * @generated
+   */
+  TransitionRule createTransitionRule();
+
+  /**
+   * Returns a new object of class '<em>Trigger Rule</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Trigger Rule</em>'.
+   * @generated
+   */
+  TriggerRule createTriggerRule();
+
+  /**
+   * Returns a new object of class '<em>Event Rule</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Event Rule</em>'.
+   * @generated
+   */
+  EventRule createEventRule();
+
+  /**
+   * Returns a new object of class '<em>Receive Signal Event Rule</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Receive Signal Event Rule</em>'.
+   * @generated
+   */
+  ReceiveSignalEventRule createReceiveSignalEventRule();
+
+  /**
+   * Returns a new object of class '<em>Guard Rule</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Guard Rule</em>'.
+   * @generated
+   */
+  GuardRule createGuardRule();
+
+  /**
+   * Returns a new object of class '<em>TGuard Rule</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>TGuard Rule</em>'.
+   * @generated
+   */
+  TGuardRule createTGuardRule();
+
+  /**
+   * Returns the package supported by this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the package supported by this factory.
+   * @generated
+   */
+  TransitionPackage getTransitionPackage();
+
+} //TransitionFactory
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TransitionPackage.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TransitionPackage.java
new file mode 100644
index 0000000..961c8ff
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TransitionPackage.java
@@ -0,0 +1,583 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface TransitionPackage extends EPackage
+{
+  /**
+   * The package name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNAME = "transition";
+
+  /**
+   * The package namespace URI.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNS_URI = "http://www.eclipse.org/efm/papyrus/xtext/Transition";
+
+  /**
+   * The package namespace name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNS_PREFIX = "transition";
+
+  /**
+   * The singleton instance of the package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  TransitionPackage eINSTANCE = org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl.init();
+
+  /**
+   * The meta object id for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.TransitionRuleImpl <em>Rule</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionRuleImpl
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getTransitionRule()
+   * @generated
+   */
+  int TRANSITION_RULE = 0;
+
+  /**
+   * The feature id for the '<em><b>Triggers</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TRANSITION_RULE__TRIGGERS = 0;
+
+  /**
+   * The feature id for the '<em><b>Guard</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TRANSITION_RULE__GUARD = 1;
+
+  /**
+   * The feature id for the '<em><b>Tguard</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TRANSITION_RULE__TGUARD = 2;
+
+  /**
+   * The feature id for the '<em><b>Effect Body</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TRANSITION_RULE__EFFECT_BODY = 3;
+
+  /**
+   * The number of structural features of the '<em>Rule</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TRANSITION_RULE_FEATURE_COUNT = 4;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.TriggerRuleImpl <em>Trigger Rule</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.TriggerRuleImpl
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getTriggerRule()
+   * @generated
+   */
+  int TRIGGER_RULE = 1;
+
+  /**
+   * The feature id for the '<em><b>Port</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TRIGGER_RULE__PORT = 0;
+
+  /**
+   * The feature id for the '<em><b>Event</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TRIGGER_RULE__EVENT = 1;
+
+  /**
+   * The number of structural features of the '<em>Trigger Rule</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TRIGGER_RULE_FEATURE_COUNT = 2;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.EventRuleImpl <em>Event Rule</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.EventRuleImpl
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getEventRule()
+   * @generated
+   */
+  int EVENT_RULE = 2;
+
+  /**
+   * The number of structural features of the '<em>Event Rule</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int EVENT_RULE_FEATURE_COUNT = 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.ReceiveSignalEventRuleImpl <em>Receive Signal Event Rule</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.ReceiveSignalEventRuleImpl
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getReceiveSignalEventRule()
+   * @generated
+   */
+  int RECEIVE_SIGNAL_EVENT_RULE = 3;
+
+  /**
+   * The feature id for the '<em><b>Parameters</b></em>' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RECEIVE_SIGNAL_EVENT_RULE__PARAMETERS = EVENT_RULE_FEATURE_COUNT + 0;
+
+  /**
+   * The number of structural features of the '<em>Receive Signal Event Rule</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int RECEIVE_SIGNAL_EVENT_RULE_FEATURE_COUNT = EVENT_RULE_FEATURE_COUNT + 1;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.GuardRuleImpl <em>Guard Rule</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.GuardRuleImpl
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getGuardRule()
+   * @generated
+   */
+  int GUARD_RULE = 4;
+
+  /**
+   * The feature id for the '<em><b>Constraint</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int GUARD_RULE__CONSTRAINT = 0;
+
+  /**
+   * The number of structural features of the '<em>Guard Rule</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int GUARD_RULE_FEATURE_COUNT = 1;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.TGuardRuleImpl <em>TGuard Rule</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.TGuardRuleImpl
+   * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getTGuardRule()
+   * @generated
+   */
+  int TGUARD_RULE = 5;
+
+  /**
+   * The feature id for the '<em><b>Constraint</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TGUARD_RULE__CONSTRAINT = 0;
+
+  /**
+   * The number of structural features of the '<em>TGuard Rule</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TGUARD_RULE_FEATURE_COUNT = 1;
+
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule <em>Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Rule</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionRule
+   * @generated
+   */
+  EClass getTransitionRule();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getTriggers <em>Triggers</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Triggers</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getTriggers()
+   * @see #getTransitionRule()
+   * @generated
+   */
+  EReference getTransitionRule_Triggers();
+
+  /**
+   * Returns the meta object for the containment reference '{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getGuard <em>Guard</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference '<em>Guard</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getGuard()
+   * @see #getTransitionRule()
+   * @generated
+   */
+  EReference getTransitionRule_Guard();
+
+  /**
+   * Returns the meta object for the containment reference '{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getTguard <em>Tguard</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference '<em>Tguard</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getTguard()
+   * @see #getTransitionRule()
+   * @generated
+   */
+  EReference getTransitionRule_Tguard();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getEffectBody <em>Effect Body</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Effect Body</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getEffectBody()
+   * @see #getTransitionRule()
+   * @generated
+   */
+  EAttribute getTransitionRule_EffectBody();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.efm.papyrus.xtext.transition.TriggerRule <em>Trigger Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Trigger Rule</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TriggerRule
+   * @generated
+   */
+  EClass getTriggerRule();
+
+  /**
+   * Returns the meta object for the reference '{@link org.eclipse.efm.papyrus.xtext.transition.TriggerRule#getPort <em>Port</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference '<em>Port</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TriggerRule#getPort()
+   * @see #getTriggerRule()
+   * @generated
+   */
+  EReference getTriggerRule_Port();
+
+  /**
+   * Returns the meta object for the containment reference '{@link org.eclipse.efm.papyrus.xtext.transition.TriggerRule#getEvent <em>Event</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference '<em>Event</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TriggerRule#getEvent()
+   * @see #getTriggerRule()
+   * @generated
+   */
+  EReference getTriggerRule_Event();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.efm.papyrus.xtext.transition.EventRule <em>Event Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Event Rule</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.EventRule
+   * @generated
+   */
+  EClass getEventRule();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule <em>Receive Signal Event Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Receive Signal Event Rule</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule
+   * @generated
+   */
+  EClass getReceiveSignalEventRule();
+
+  /**
+   * Returns the meta object for the reference list '{@link org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule#getParameters <em>Parameters</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the reference list '<em>Parameters</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule#getParameters()
+   * @see #getReceiveSignalEventRule()
+   * @generated
+   */
+  EReference getReceiveSignalEventRule_Parameters();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.efm.papyrus.xtext.transition.GuardRule <em>Guard Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Guard Rule</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.GuardRule
+   * @generated
+   */
+  EClass getGuardRule();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.efm.papyrus.xtext.transition.GuardRule#getConstraint <em>Constraint</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Constraint</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.GuardRule#getConstraint()
+   * @see #getGuardRule()
+   * @generated
+   */
+  EAttribute getGuardRule_Constraint();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.efm.papyrus.xtext.transition.TGuardRule <em>TGuard Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>TGuard Rule</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TGuardRule
+   * @generated
+   */
+  EClass getTGuardRule();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.efm.papyrus.xtext.transition.TGuardRule#getConstraint <em>Constraint</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Constraint</em>'.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TGuardRule#getConstraint()
+   * @see #getTGuardRule()
+   * @generated
+   */
+  EAttribute getTGuardRule_Constraint();
+
+  /**
+   * Returns the factory that creates the instances of the model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the factory that creates the instances of the model.
+   * @generated
+   */
+  TransitionFactory getTransitionFactory();
+
+  /**
+   * <!-- begin-user-doc -->
+   * Defines literals for the meta objects that represent
+   * <ul>
+   *   <li>each class,</li>
+   *   <li>each feature of each class,</li>
+   *   <li>each enum,</li>
+   *   <li>and each data type</li>
+   * </ul>
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  interface Literals
+  {
+    /**
+     * The meta object literal for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.TransitionRuleImpl <em>Rule</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionRuleImpl
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getTransitionRule()
+     * @generated
+     */
+    EClass TRANSITION_RULE = eINSTANCE.getTransitionRule();
+
+    /**
+     * The meta object literal for the '<em><b>Triggers</b></em>' containment reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference TRANSITION_RULE__TRIGGERS = eINSTANCE.getTransitionRule_Triggers();
+
+    /**
+     * The meta object literal for the '<em><b>Guard</b></em>' containment reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference TRANSITION_RULE__GUARD = eINSTANCE.getTransitionRule_Guard();
+
+    /**
+     * The meta object literal for the '<em><b>Tguard</b></em>' containment reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference TRANSITION_RULE__TGUARD = eINSTANCE.getTransitionRule_Tguard();
+
+    /**
+     * The meta object literal for the '<em><b>Effect Body</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute TRANSITION_RULE__EFFECT_BODY = eINSTANCE.getTransitionRule_EffectBody();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.TriggerRuleImpl <em>Trigger Rule</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.TriggerRuleImpl
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getTriggerRule()
+     * @generated
+     */
+    EClass TRIGGER_RULE = eINSTANCE.getTriggerRule();
+
+    /**
+     * The meta object literal for the '<em><b>Port</b></em>' reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference TRIGGER_RULE__PORT = eINSTANCE.getTriggerRule_Port();
+
+    /**
+     * The meta object literal for the '<em><b>Event</b></em>' containment reference feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference TRIGGER_RULE__EVENT = eINSTANCE.getTriggerRule_Event();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.EventRuleImpl <em>Event Rule</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.EventRuleImpl
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getEventRule()
+     * @generated
+     */
+    EClass EVENT_RULE = eINSTANCE.getEventRule();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.ReceiveSignalEventRuleImpl <em>Receive Signal Event Rule</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.ReceiveSignalEventRuleImpl
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getReceiveSignalEventRule()
+     * @generated
+     */
+    EClass RECEIVE_SIGNAL_EVENT_RULE = eINSTANCE.getReceiveSignalEventRule();
+
+    /**
+     * The meta object literal for the '<em><b>Parameters</b></em>' reference list feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EReference RECEIVE_SIGNAL_EVENT_RULE__PARAMETERS = eINSTANCE.getReceiveSignalEventRule_Parameters();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.GuardRuleImpl <em>Guard Rule</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.GuardRuleImpl
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getGuardRule()
+     * @generated
+     */
+    EClass GUARD_RULE = eINSTANCE.getGuardRule();
+
+    /**
+     * The meta object literal for the '<em><b>Constraint</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute GUARD_RULE__CONSTRAINT = eINSTANCE.getGuardRule_Constraint();
+
+    /**
+     * The meta object literal for the '{@link org.eclipse.efm.papyrus.xtext.transition.impl.TGuardRuleImpl <em>TGuard Rule</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.TGuardRuleImpl
+     * @see org.eclipse.efm.papyrus.xtext.transition.impl.TransitionPackageImpl#getTGuardRule()
+     * @generated
+     */
+    EClass TGUARD_RULE = eINSTANCE.getTGuardRule();
+
+    /**
+     * The meta object literal for the '<em><b>Constraint</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute TGUARD_RULE__CONSTRAINT = eINSTANCE.getTGuardRule_Constraint();
+
+  }
+
+} //TransitionPackage
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TransitionRule.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TransitionRule.java
new file mode 100644
index 0000000..f00bd57
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TransitionRule.java
@@ -0,0 +1,136 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Rule</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getTriggers <em>Triggers</em>}</li>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getGuard <em>Guard</em>}</li>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getTguard <em>Tguard</em>}</li>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getEffectBody <em>Effect Body</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTransitionRule()
+ * @model
+ * @generated
+ */
+public interface TransitionRule extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Triggers</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.efm.papyrus.xtext.transition.TriggerRule}.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Triggers</em>' containment reference list isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Triggers</em>' containment reference list.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTransitionRule_Triggers()
+   * @model containment="true"
+   * @generated
+   */
+  EList<TriggerRule> getTriggers();
+
+  /**
+   * Returns the value of the '<em><b>Guard</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Guard</em>' containment reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Guard</em>' containment reference.
+   * @see #setGuard(GuardRule)
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTransitionRule_Guard()
+   * @model containment="true"
+   * @generated
+   */
+  GuardRule getGuard();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getGuard <em>Guard</em>}' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Guard</em>' containment reference.
+   * @see #getGuard()
+   * @generated
+   */
+  void setGuard(GuardRule value);
+
+  /**
+   * Returns the value of the '<em><b>Tguard</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Tguard</em>' containment reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Tguard</em>' containment reference.
+   * @see #setTguard(TGuardRule)
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTransitionRule_Tguard()
+   * @model containment="true"
+   * @generated
+   */
+  TGuardRule getTguard();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getTguard <em>Tguard</em>}' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Tguard</em>' containment reference.
+   * @see #getTguard()
+   * @generated
+   */
+  void setTguard(TGuardRule value);
+
+  /**
+   * Returns the value of the '<em><b>Effect Body</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Effect Body</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Effect Body</em>' attribute.
+   * @see #setEffectBody(String)
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTransitionRule_EffectBody()
+   * @model
+   * @generated
+   */
+  String getEffectBody();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule#getEffectBody <em>Effect Body</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Effect Body</em>' attribute.
+   * @see #getEffectBody()
+   * @generated
+   */
+  void setEffectBody(String value);
+
+} // TransitionRule
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TriggerRule.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TriggerRule.java
new file mode 100644
index 0000000..2fd414a
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/TriggerRule.java
@@ -0,0 +1,92 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.uml2.uml.NamedElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Trigger Rule</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.TriggerRule#getPort <em>Port</em>}</li>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.TriggerRule#getEvent <em>Event</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTriggerRule()
+ * @model
+ * @generated
+ */
+public interface TriggerRule extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Port</b></em>' reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Port</em>' reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Port</em>' reference.
+   * @see #setPort(NamedElement)
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTriggerRule_Port()
+   * @model
+   * @generated
+   */
+  NamedElement getPort();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.efm.papyrus.xtext.transition.TriggerRule#getPort <em>Port</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Port</em>' reference.
+   * @see #getPort()
+   * @generated
+   */
+  void setPort(NamedElement value);
+
+  /**
+   * Returns the value of the '<em><b>Event</b></em>' containment reference.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Event</em>' containment reference isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Event</em>' containment reference.
+   * @see #setEvent(EventRule)
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#getTriggerRule_Event()
+   * @model containment="true"
+   * @generated
+   */
+  EventRule getEvent();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.efm.papyrus.xtext.transition.TriggerRule#getEvent <em>Event</em>}' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Event</em>' containment reference.
+   * @see #getEvent()
+   * @generated
+   */
+  void setEvent(EventRule value);
+
+} // TriggerRule
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/EventRuleImpl.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/EventRuleImpl.java
new file mode 100644
index 0000000..586c1a1
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/EventRuleImpl.java
@@ -0,0 +1,54 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.impl;
+
+import org.eclipse.efm.papyrus.xtext.transition.EventRule;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Event Rule</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class EventRuleImpl extends MinimalEObjectImpl.Container implements EventRule
+{
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EventRuleImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return TransitionPackage.Literals.EVENT_RULE;
+  }
+
+} //EventRuleImpl
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/GuardRuleImpl.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/GuardRuleImpl.java
new file mode 100644
index 0000000..0538808
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/GuardRuleImpl.java
@@ -0,0 +1,189 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.impl;
+
+import org.eclipse.efm.papyrus.xtext.transition.GuardRule;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Guard Rule</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.impl.GuardRuleImpl#getConstraint <em>Constraint</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class GuardRuleImpl extends MinimalEObjectImpl.Container implements GuardRule
+{
+  /**
+   * The default value of the '{@link #getConstraint() <em>Constraint</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getConstraint()
+   * @generated
+   * @ordered
+   */
+  protected static final String CONSTRAINT_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getConstraint() <em>Constraint</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getConstraint()
+   * @generated
+   * @ordered
+   */
+  protected String constraint = CONSTRAINT_EDEFAULT;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected GuardRuleImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return TransitionPackage.Literals.GUARD_RULE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String getConstraint()
+  {
+    return constraint;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setConstraint(String newConstraint)
+  {
+    String oldConstraint = constraint;
+    constraint = newConstraint;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, TransitionPackage.GUARD_RULE__CONSTRAINT, oldConstraint, constraint));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.GUARD_RULE__CONSTRAINT:
+        return getConstraint();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.GUARD_RULE__CONSTRAINT:
+        setConstraint((String)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.GUARD_RULE__CONSTRAINT:
+        setConstraint(CONSTRAINT_EDEFAULT);
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.GUARD_RULE__CONSTRAINT:
+        return CONSTRAINT_EDEFAULT == null ? constraint != null : !CONSTRAINT_EDEFAULT.equals(constraint);
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy()) return super.toString();
+
+    StringBuffer result = new StringBuffer(super.toString());
+    result.append(" (constraint: ");
+    result.append(constraint);
+    result.append(')');
+    return result.toString();
+  }
+
+} //GuardRuleImpl
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/ReceiveSignalEventRuleImpl.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/ReceiveSignalEventRuleImpl.java
new file mode 100644
index 0000000..847cae4
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/ReceiveSignalEventRuleImpl.java
@@ -0,0 +1,158 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionPackage;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
+import org.eclipse.uml2.uml.Property;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Receive Signal Event Rule</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.impl.ReceiveSignalEventRuleImpl#getParameters <em>Parameters</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ReceiveSignalEventRuleImpl extends EventRuleImpl implements ReceiveSignalEventRule
+{
+  /**
+   * The cached value of the '{@link #getParameters() <em>Parameters</em>}' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getParameters()
+   * @generated
+   * @ordered
+   */
+  protected EList<Property> parameters;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ReceiveSignalEventRuleImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return TransitionPackage.Literals.RECEIVE_SIGNAL_EVENT_RULE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<Property> getParameters()
+  {
+    if (parameters == null)
+    {
+      parameters = new EObjectResolvingEList<Property>(Property.class, this, TransitionPackage.RECEIVE_SIGNAL_EVENT_RULE__PARAMETERS);
+    }
+    return parameters;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.RECEIVE_SIGNAL_EVENT_RULE__PARAMETERS:
+        return getParameters();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.RECEIVE_SIGNAL_EVENT_RULE__PARAMETERS:
+        getParameters().clear();
+        getParameters().addAll((Collection<? extends Property>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.RECEIVE_SIGNAL_EVENT_RULE__PARAMETERS:
+        getParameters().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.RECEIVE_SIGNAL_EVENT_RULE__PARAMETERS:
+        return parameters != null && !parameters.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+} //ReceiveSignalEventRuleImpl
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TGuardRuleImpl.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TGuardRuleImpl.java
new file mode 100644
index 0000000..6af77fe
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TGuardRuleImpl.java
@@ -0,0 +1,189 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.impl;
+
+import org.eclipse.efm.papyrus.xtext.transition.TGuardRule;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>TGuard Rule</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.impl.TGuardRuleImpl#getConstraint <em>Constraint</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TGuardRuleImpl extends MinimalEObjectImpl.Container implements TGuardRule
+{
+  /**
+   * The default value of the '{@link #getConstraint() <em>Constraint</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getConstraint()
+   * @generated
+   * @ordered
+   */
+  protected static final String CONSTRAINT_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getConstraint() <em>Constraint</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getConstraint()
+   * @generated
+   * @ordered
+   */
+  protected String constraint = CONSTRAINT_EDEFAULT;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TGuardRuleImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return TransitionPackage.Literals.TGUARD_RULE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String getConstraint()
+  {
+    return constraint;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setConstraint(String newConstraint)
+  {
+    String oldConstraint = constraint;
+    constraint = newConstraint;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, TransitionPackage.TGUARD_RULE__CONSTRAINT, oldConstraint, constraint));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TGUARD_RULE__CONSTRAINT:
+        return getConstraint();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TGUARD_RULE__CONSTRAINT:
+        setConstraint((String)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TGUARD_RULE__CONSTRAINT:
+        setConstraint(CONSTRAINT_EDEFAULT);
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TGUARD_RULE__CONSTRAINT:
+        return CONSTRAINT_EDEFAULT == null ? constraint != null : !CONSTRAINT_EDEFAULT.equals(constraint);
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy()) return super.toString();
+
+    StringBuffer result = new StringBuffer(super.toString());
+    result.append(" (constraint: ");
+    result.append(constraint);
+    result.append(')');
+    return result.toString();
+  }
+
+} //TGuardRuleImpl
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TransitionFactoryImpl.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TransitionFactoryImpl.java
new file mode 100644
index 0000000..b2c7942
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TransitionFactoryImpl.java
@@ -0,0 +1,178 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.impl;
+
+import org.eclipse.efm.papyrus.xtext.transition.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class TransitionFactoryImpl extends EFactoryImpl implements TransitionFactory
+{
+  /**
+   * Creates the default factory implementation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static TransitionFactory init()
+  {
+    try
+    {
+      TransitionFactory theTransitionFactory = (TransitionFactory)EPackage.Registry.INSTANCE.getEFactory(TransitionPackage.eNS_URI);
+      if (theTransitionFactory != null)
+      {
+        return theTransitionFactory;
+      }
+    }
+    catch (Exception exception)
+    {
+      EcorePlugin.INSTANCE.log(exception);
+    }
+    return new TransitionFactoryImpl();
+  }
+
+  /**
+   * Creates an instance of the factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TransitionFactoryImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EObject create(EClass eClass)
+  {
+    switch (eClass.getClassifierID())
+    {
+      case TransitionPackage.TRANSITION_RULE: return createTransitionRule();
+      case TransitionPackage.TRIGGER_RULE: return createTriggerRule();
+      case TransitionPackage.EVENT_RULE: return createEventRule();
+      case TransitionPackage.RECEIVE_SIGNAL_EVENT_RULE: return createReceiveSignalEventRule();
+      case TransitionPackage.GUARD_RULE: return createGuardRule();
+      case TransitionPackage.TGUARD_RULE: return createTGuardRule();
+      default:
+        throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TransitionRule createTransitionRule()
+  {
+    TransitionRuleImpl transitionRule = new TransitionRuleImpl();
+    return transitionRule;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TriggerRule createTriggerRule()
+  {
+    TriggerRuleImpl triggerRule = new TriggerRuleImpl();
+    return triggerRule;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EventRule createEventRule()
+  {
+    EventRuleImpl eventRule = new EventRuleImpl();
+    return eventRule;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ReceiveSignalEventRule createReceiveSignalEventRule()
+  {
+    ReceiveSignalEventRuleImpl receiveSignalEventRule = new ReceiveSignalEventRuleImpl();
+    return receiveSignalEventRule;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public GuardRule createGuardRule()
+  {
+    GuardRuleImpl guardRule = new GuardRuleImpl();
+    return guardRule;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TGuardRule createTGuardRule()
+  {
+    TGuardRuleImpl tGuardRule = new TGuardRuleImpl();
+    return tGuardRule;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TransitionPackage getTransitionPackage()
+  {
+    return (TransitionPackage)getEPackage();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @deprecated
+   * @generated
+   */
+  @Deprecated
+  public static TransitionPackage getPackage()
+  {
+    return TransitionPackage.eINSTANCE;
+  }
+
+} //TransitionFactoryImpl
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TransitionPackageImpl.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TransitionPackageImpl.java
new file mode 100644
index 0000000..469274a
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TransitionPackageImpl.java
@@ -0,0 +1,416 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.impl;
+
+import org.eclipse.efm.papyrus.xtext.transition.EventRule;
+import org.eclipse.efm.papyrus.xtext.transition.GuardRule;
+import org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule;
+import org.eclipse.efm.papyrus.xtext.transition.TGuardRule;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionFactory;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionPackage;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionRule;
+import org.eclipse.efm.papyrus.xtext.transition.TriggerRule;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EcorePackage;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class TransitionPackageImpl extends EPackageImpl implements TransitionPackage
+{
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass transitionRuleEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass triggerRuleEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass eventRuleEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass receiveSignalEventRuleEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass guardRuleEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass tGuardRuleEClass = null;
+
+  /**
+   * Creates an instance of the model <b>Package</b>, registered with
+   * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+   * package URI value.
+   * <p>Note: the correct way to create the package is via the static
+   * factory method {@link #init init()}, which also performs
+   * initialization of the package, or returns the registered package,
+   * if one already exists.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.EPackage.Registry
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage#eNS_URI
+   * @see #init()
+   * @generated
+   */
+  private TransitionPackageImpl()
+  {
+    super(eNS_URI, TransitionFactory.eINSTANCE);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static boolean isInited = false;
+
+  /**
+   * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+   * 
+   * <p>This method is used to initialize {@link TransitionPackage#eINSTANCE} when that field is accessed.
+   * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #eNS_URI
+   * @see #createPackageContents()
+   * @see #initializePackageContents()
+   * @generated
+   */
+  public static TransitionPackage init()
+  {
+    if (isInited) return (TransitionPackage)EPackage.Registry.INSTANCE.getEPackage(TransitionPackage.eNS_URI);
+
+    // Obtain or create and register package
+    TransitionPackageImpl theTransitionPackage = (TransitionPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof TransitionPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new TransitionPackageImpl());
+
+    isInited = true;
+
+    // Initialize simple dependencies
+    EcorePackage.eINSTANCE.eClass();
+    UMLPackage.eINSTANCE.eClass();
+
+    // Create package meta-data objects
+    theTransitionPackage.createPackageContents();
+
+    // Initialize created meta-data
+    theTransitionPackage.initializePackageContents();
+
+    // Mark meta-data to indicate it can't be changed
+    theTransitionPackage.freeze();
+
+  
+    // Update the registry and return the package
+    EPackage.Registry.INSTANCE.put(TransitionPackage.eNS_URI, theTransitionPackage);
+    return theTransitionPackage;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getTransitionRule()
+  {
+    return transitionRuleEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getTransitionRule_Triggers()
+  {
+    return (EReference)transitionRuleEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getTransitionRule_Guard()
+  {
+    return (EReference)transitionRuleEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getTransitionRule_Tguard()
+  {
+    return (EReference)transitionRuleEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getTransitionRule_EffectBody()
+  {
+    return (EAttribute)transitionRuleEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getTriggerRule()
+  {
+    return triggerRuleEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getTriggerRule_Port()
+  {
+    return (EReference)triggerRuleEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getTriggerRule_Event()
+  {
+    return (EReference)triggerRuleEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getEventRule()
+  {
+    return eventRuleEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getReceiveSignalEventRule()
+  {
+    return receiveSignalEventRuleEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EReference getReceiveSignalEventRule_Parameters()
+  {
+    return (EReference)receiveSignalEventRuleEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getGuardRule()
+  {
+    return guardRuleEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getGuardRule_Constraint()
+  {
+    return (EAttribute)guardRuleEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EClass getTGuardRule()
+  {
+    return tGuardRuleEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getTGuardRule_Constraint()
+  {
+    return (EAttribute)tGuardRuleEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TransitionFactory getTransitionFactory()
+  {
+    return (TransitionFactory)getEFactoryInstance();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private boolean isCreated = false;
+
+  /**
+   * Creates the meta-model objects for the package.  This method is
+   * guarded to have no affect on any invocation but its first.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void createPackageContents()
+  {
+    if (isCreated) return;
+    isCreated = true;
+
+    // Create classes and their features
+    transitionRuleEClass = createEClass(TRANSITION_RULE);
+    createEReference(transitionRuleEClass, TRANSITION_RULE__TRIGGERS);
+    createEReference(transitionRuleEClass, TRANSITION_RULE__GUARD);
+    createEReference(transitionRuleEClass, TRANSITION_RULE__TGUARD);
+    createEAttribute(transitionRuleEClass, TRANSITION_RULE__EFFECT_BODY);
+
+    triggerRuleEClass = createEClass(TRIGGER_RULE);
+    createEReference(triggerRuleEClass, TRIGGER_RULE__PORT);
+    createEReference(triggerRuleEClass, TRIGGER_RULE__EVENT);
+
+    eventRuleEClass = createEClass(EVENT_RULE);
+
+    receiveSignalEventRuleEClass = createEClass(RECEIVE_SIGNAL_EVENT_RULE);
+    createEReference(receiveSignalEventRuleEClass, RECEIVE_SIGNAL_EVENT_RULE__PARAMETERS);
+
+    guardRuleEClass = createEClass(GUARD_RULE);
+    createEAttribute(guardRuleEClass, GUARD_RULE__CONSTRAINT);
+
+    tGuardRuleEClass = createEClass(TGUARD_RULE);
+    createEAttribute(tGuardRuleEClass, TGUARD_RULE__CONSTRAINT);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private boolean isInitialized = false;
+
+  /**
+   * Complete the initialization of the package and its meta-model.  This
+   * method is guarded to have no affect on any invocation but its first.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void initializePackageContents()
+  {
+    if (isInitialized) return;
+    isInitialized = true;
+
+    // Initialize package
+    setName(eNAME);
+    setNsPrefix(eNS_PREFIX);
+    setNsURI(eNS_URI);
+
+    // Obtain other dependent packages
+    EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
+    UMLPackage theUMLPackage = (UMLPackage)EPackage.Registry.INSTANCE.getEPackage(UMLPackage.eNS_URI);
+
+    // Create type parameters
+
+    // Set bounds for type parameters
+
+    // Add supertypes to classes
+    receiveSignalEventRuleEClass.getESuperTypes().add(this.getEventRule());
+
+    // Initialize classes and features; add operations and parameters
+    initEClass(transitionRuleEClass, TransitionRule.class, "TransitionRule", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getTransitionRule_Triggers(), this.getTriggerRule(), null, "triggers", null, 0, -1, TransitionRule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getTransitionRule_Guard(), this.getGuardRule(), null, "guard", null, 0, 1, TransitionRule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getTransitionRule_Tguard(), this.getTGuardRule(), null, "tguard", null, 0, 1, TransitionRule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getTransitionRule_EffectBody(), theEcorePackage.getEString(), "effectBody", null, 0, 1, TransitionRule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEClass(triggerRuleEClass, TriggerRule.class, "TriggerRule", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getTriggerRule_Port(), theUMLPackage.getNamedElement(), null, "port", null, 0, 1, TriggerRule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEReference(getTriggerRule_Event(), this.getEventRule(), null, "event", null, 0, 1, TriggerRule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEClass(eventRuleEClass, EventRule.class, "EventRule", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+    initEClass(receiveSignalEventRuleEClass, ReceiveSignalEventRule.class, "ReceiveSignalEventRule", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(getReceiveSignalEventRule_Parameters(), theUMLPackage.getProperty(), null, "parameters", null, 0, -1, ReceiveSignalEventRule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEClass(guardRuleEClass, GuardRule.class, "GuardRule", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(getGuardRule_Constraint(), theEcorePackage.getEString(), "constraint", null, 0, 1, GuardRule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    initEClass(tGuardRuleEClass, TGuardRule.class, "TGuardRule", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(getTGuardRule_Constraint(), theEcorePackage.getEString(), "constraint", null, 0, 1, TGuardRule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+    // Create resource
+    createResource(eNS_URI);
+  }
+
+} //TransitionPackageImpl
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TransitionRuleImpl.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TransitionRuleImpl.java
new file mode 100644
index 0000000..2383abc
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TransitionRuleImpl.java
@@ -0,0 +1,396 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.papyrus.xtext.transition.GuardRule;
+import org.eclipse.efm.papyrus.xtext.transition.TGuardRule;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionPackage;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionRule;
+import org.eclipse.efm.papyrus.xtext.transition.TriggerRule;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Rule</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.impl.TransitionRuleImpl#getTriggers <em>Triggers</em>}</li>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.impl.TransitionRuleImpl#getGuard <em>Guard</em>}</li>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.impl.TransitionRuleImpl#getTguard <em>Tguard</em>}</li>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.impl.TransitionRuleImpl#getEffectBody <em>Effect Body</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TransitionRuleImpl extends MinimalEObjectImpl.Container implements TransitionRule
+{
+  /**
+   * The cached value of the '{@link #getTriggers() <em>Triggers</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getTriggers()
+   * @generated
+   * @ordered
+   */
+  protected EList<TriggerRule> triggers;
+
+  /**
+   * The cached value of the '{@link #getGuard() <em>Guard</em>}' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getGuard()
+   * @generated
+   * @ordered
+   */
+  protected GuardRule guard;
+
+  /**
+   * The cached value of the '{@link #getTguard() <em>Tguard</em>}' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getTguard()
+   * @generated
+   * @ordered
+   */
+  protected TGuardRule tguard;
+
+  /**
+   * The default value of the '{@link #getEffectBody() <em>Effect Body</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getEffectBody()
+   * @generated
+   * @ordered
+   */
+  protected static final String EFFECT_BODY_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getEffectBody() <em>Effect Body</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getEffectBody()
+   * @generated
+   * @ordered
+   */
+  protected String effectBody = EFFECT_BODY_EDEFAULT;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TransitionRuleImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return TransitionPackage.Literals.TRANSITION_RULE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<TriggerRule> getTriggers()
+  {
+    if (triggers == null)
+    {
+      triggers = new EObjectContainmentEList<TriggerRule>(TriggerRule.class, this, TransitionPackage.TRANSITION_RULE__TRIGGERS);
+    }
+    return triggers;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public GuardRule getGuard()
+  {
+    return guard;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetGuard(GuardRule newGuard, NotificationChain msgs)
+  {
+    GuardRule oldGuard = guard;
+    guard = newGuard;
+    if (eNotificationRequired())
+    {
+      ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, TransitionPackage.TRANSITION_RULE__GUARD, oldGuard, newGuard);
+      if (msgs == null) msgs = notification; else msgs.add(notification);
+    }
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setGuard(GuardRule newGuard)
+  {
+    if (newGuard != guard)
+    {
+      NotificationChain msgs = null;
+      if (guard != null)
+        msgs = ((InternalEObject)guard).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - TransitionPackage.TRANSITION_RULE__GUARD, null, msgs);
+      if (newGuard != null)
+        msgs = ((InternalEObject)newGuard).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - TransitionPackage.TRANSITION_RULE__GUARD, null, msgs);
+      msgs = basicSetGuard(newGuard, msgs);
+      if (msgs != null) msgs.dispatch();
+    }
+    else if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, TransitionPackage.TRANSITION_RULE__GUARD, newGuard, newGuard));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TGuardRule getTguard()
+  {
+    return tguard;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetTguard(TGuardRule newTguard, NotificationChain msgs)
+  {
+    TGuardRule oldTguard = tguard;
+    tguard = newTguard;
+    if (eNotificationRequired())
+    {
+      ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, TransitionPackage.TRANSITION_RULE__TGUARD, oldTguard, newTguard);
+      if (msgs == null) msgs = notification; else msgs.add(notification);
+    }
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setTguard(TGuardRule newTguard)
+  {
+    if (newTguard != tguard)
+    {
+      NotificationChain msgs = null;
+      if (tguard != null)
+        msgs = ((InternalEObject)tguard).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - TransitionPackage.TRANSITION_RULE__TGUARD, null, msgs);
+      if (newTguard != null)
+        msgs = ((InternalEObject)newTguard).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - TransitionPackage.TRANSITION_RULE__TGUARD, null, msgs);
+      msgs = basicSetTguard(newTguard, msgs);
+      if (msgs != null) msgs.dispatch();
+    }
+    else if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, TransitionPackage.TRANSITION_RULE__TGUARD, newTguard, newTguard));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String getEffectBody()
+  {
+    return effectBody;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setEffectBody(String newEffectBody)
+  {
+    String oldEffectBody = effectBody;
+    effectBody = newEffectBody;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, TransitionPackage.TRANSITION_RULE__EFFECT_BODY, oldEffectBody, effectBody));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRANSITION_RULE__TRIGGERS:
+        return ((InternalEList<?>)getTriggers()).basicRemove(otherEnd, msgs);
+      case TransitionPackage.TRANSITION_RULE__GUARD:
+        return basicSetGuard(null, msgs);
+      case TransitionPackage.TRANSITION_RULE__TGUARD:
+        return basicSetTguard(null, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRANSITION_RULE__TRIGGERS:
+        return getTriggers();
+      case TransitionPackage.TRANSITION_RULE__GUARD:
+        return getGuard();
+      case TransitionPackage.TRANSITION_RULE__TGUARD:
+        return getTguard();
+      case TransitionPackage.TRANSITION_RULE__EFFECT_BODY:
+        return getEffectBody();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRANSITION_RULE__TRIGGERS:
+        getTriggers().clear();
+        getTriggers().addAll((Collection<? extends TriggerRule>)newValue);
+        return;
+      case TransitionPackage.TRANSITION_RULE__GUARD:
+        setGuard((GuardRule)newValue);
+        return;
+      case TransitionPackage.TRANSITION_RULE__TGUARD:
+        setTguard((TGuardRule)newValue);
+        return;
+      case TransitionPackage.TRANSITION_RULE__EFFECT_BODY:
+        setEffectBody((String)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRANSITION_RULE__TRIGGERS:
+        getTriggers().clear();
+        return;
+      case TransitionPackage.TRANSITION_RULE__GUARD:
+        setGuard((GuardRule)null);
+        return;
+      case TransitionPackage.TRANSITION_RULE__TGUARD:
+        setTguard((TGuardRule)null);
+        return;
+      case TransitionPackage.TRANSITION_RULE__EFFECT_BODY:
+        setEffectBody(EFFECT_BODY_EDEFAULT);
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRANSITION_RULE__TRIGGERS:
+        return triggers != null && !triggers.isEmpty();
+      case TransitionPackage.TRANSITION_RULE__GUARD:
+        return guard != null;
+      case TransitionPackage.TRANSITION_RULE__TGUARD:
+        return tguard != null;
+      case TransitionPackage.TRANSITION_RULE__EFFECT_BODY:
+        return EFFECT_BODY_EDEFAULT == null ? effectBody != null : !EFFECT_BODY_EDEFAULT.equals(effectBody);
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy()) return super.toString();
+
+    StringBuffer result = new StringBuffer(super.toString());
+    result.append(" (effectBody: ");
+    result.append(effectBody);
+    result.append(')');
+    return result.toString();
+  }
+
+} //TransitionRuleImpl
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TriggerRuleImpl.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TriggerRuleImpl.java
new file mode 100644
index 0000000..1be4d43
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/impl/TriggerRuleImpl.java
@@ -0,0 +1,273 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.impl;
+
+import org.eclipse.efm.papyrus.xtext.transition.EventRule;
+import org.eclipse.efm.papyrus.xtext.transition.TransitionPackage;
+import org.eclipse.efm.papyrus.xtext.transition.TriggerRule;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.uml2.uml.NamedElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Trigger Rule</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.impl.TriggerRuleImpl#getPort <em>Port</em>}</li>
+ *   <li>{@link org.eclipse.efm.papyrus.xtext.transition.impl.TriggerRuleImpl#getEvent <em>Event</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TriggerRuleImpl extends MinimalEObjectImpl.Container implements TriggerRule
+{
+  /**
+   * The cached value of the '{@link #getPort() <em>Port</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getPort()
+   * @generated
+   * @ordered
+   */
+  protected NamedElement port;
+
+  /**
+   * The cached value of the '{@link #getEvent() <em>Event</em>}' containment reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getEvent()
+   * @generated
+   * @ordered
+   */
+  protected EventRule event;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TriggerRuleImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return TransitionPackage.Literals.TRIGGER_RULE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NamedElement getPort()
+  {
+    if (port != null && port.eIsProxy())
+    {
+      InternalEObject oldPort = (InternalEObject)port;
+      port = (NamedElement)eResolveProxy(oldPort);
+      if (port != oldPort)
+      {
+        if (eNotificationRequired())
+          eNotify(new ENotificationImpl(this, Notification.RESOLVE, TransitionPackage.TRIGGER_RULE__PORT, oldPort, port));
+      }
+    }
+    return port;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NamedElement basicGetPort()
+  {
+    return port;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setPort(NamedElement newPort)
+  {
+    NamedElement oldPort = port;
+    port = newPort;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, TransitionPackage.TRIGGER_RULE__PORT, oldPort, port));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EventRule getEvent()
+  {
+    return event;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetEvent(EventRule newEvent, NotificationChain msgs)
+  {
+    EventRule oldEvent = event;
+    event = newEvent;
+    if (eNotificationRequired())
+    {
+      ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, TransitionPackage.TRIGGER_RULE__EVENT, oldEvent, newEvent);
+      if (msgs == null) msgs = notification; else msgs.add(notification);
+    }
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setEvent(EventRule newEvent)
+  {
+    if (newEvent != event)
+    {
+      NotificationChain msgs = null;
+      if (event != null)
+        msgs = ((InternalEObject)event).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - TransitionPackage.TRIGGER_RULE__EVENT, null, msgs);
+      if (newEvent != null)
+        msgs = ((InternalEObject)newEvent).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - TransitionPackage.TRIGGER_RULE__EVENT, null, msgs);
+      msgs = basicSetEvent(newEvent, msgs);
+      if (msgs != null) msgs.dispatch();
+    }
+    else if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, TransitionPackage.TRIGGER_RULE__EVENT, newEvent, newEvent));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRIGGER_RULE__EVENT:
+        return basicSetEvent(null, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRIGGER_RULE__PORT:
+        if (resolve) return getPort();
+        return basicGetPort();
+      case TransitionPackage.TRIGGER_RULE__EVENT:
+        return getEvent();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRIGGER_RULE__PORT:
+        setPort((NamedElement)newValue);
+        return;
+      case TransitionPackage.TRIGGER_RULE__EVENT:
+        setEvent((EventRule)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRIGGER_RULE__PORT:
+        setPort((NamedElement)null);
+        return;
+      case TransitionPackage.TRIGGER_RULE__EVENT:
+        setEvent((EventRule)null);
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case TransitionPackage.TRIGGER_RULE__PORT:
+        return port != null;
+      case TransitionPackage.TRIGGER_RULE__EVENT:
+        return event != null;
+    }
+    return super.eIsSet(featureID);
+  }
+
+} //TriggerRuleImpl
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/util/TransitionAdapterFactory.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/util/TransitionAdapterFactory.java
new file mode 100644
index 0000000..a9e2102
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/util/TransitionAdapterFactory.java
@@ -0,0 +1,244 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.util;
+
+import org.eclipse.efm.papyrus.xtext.transition.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage
+ * @generated
+ */
+public class TransitionAdapterFactory extends AdapterFactoryImpl
+{
+  /**
+   * The cached model package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected static TransitionPackage modelPackage;
+
+  /**
+   * Creates an instance of the adapter factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TransitionAdapterFactory()
+  {
+    if (modelPackage == null)
+    {
+      modelPackage = TransitionPackage.eINSTANCE;
+    }
+  }
+
+  /**
+   * Returns whether this factory is applicable for the type of the object.
+   * <!-- begin-user-doc -->
+   * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+   * <!-- end-user-doc -->
+   * @return whether this factory is applicable for the type of the object.
+   * @generated
+   */
+  @Override
+  public boolean isFactoryForType(Object object)
+  {
+    if (object == modelPackage)
+    {
+      return true;
+    }
+    if (object instanceof EObject)
+    {
+      return ((EObject)object).eClass().getEPackage() == modelPackage;
+    }
+    return false;
+  }
+
+  /**
+   * The switch that delegates to the <code>createXXX</code> methods.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TransitionSwitch<Adapter> modelSwitch =
+    new TransitionSwitch<Adapter>()
+    {
+      @Override
+      public Adapter caseTransitionRule(TransitionRule object)
+      {
+        return createTransitionRuleAdapter();
+      }
+      @Override
+      public Adapter caseTriggerRule(TriggerRule object)
+      {
+        return createTriggerRuleAdapter();
+      }
+      @Override
+      public Adapter caseEventRule(EventRule object)
+      {
+        return createEventRuleAdapter();
+      }
+      @Override
+      public Adapter caseReceiveSignalEventRule(ReceiveSignalEventRule object)
+      {
+        return createReceiveSignalEventRuleAdapter();
+      }
+      @Override
+      public Adapter caseGuardRule(GuardRule object)
+      {
+        return createGuardRuleAdapter();
+      }
+      @Override
+      public Adapter caseTGuardRule(TGuardRule object)
+      {
+        return createTGuardRuleAdapter();
+      }
+      @Override
+      public Adapter defaultCase(EObject object)
+      {
+        return createEObjectAdapter();
+      }
+    };
+
+  /**
+   * Creates an adapter for the <code>target</code>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param target the object to adapt.
+   * @return the adapter for the <code>target</code>.
+   * @generated
+   */
+  @Override
+  public Adapter createAdapter(Notifier target)
+  {
+    return modelSwitch.doSwitch((EObject)target);
+  }
+
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.efm.papyrus.xtext.transition.TransitionRule <em>Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TransitionRule
+   * @generated
+   */
+  public Adapter createTransitionRuleAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.efm.papyrus.xtext.transition.TriggerRule <em>Trigger Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TriggerRule
+   * @generated
+   */
+  public Adapter createTriggerRuleAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.efm.papyrus.xtext.transition.EventRule <em>Event Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.efm.papyrus.xtext.transition.EventRule
+   * @generated
+   */
+  public Adapter createEventRuleAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule <em>Receive Signal Event Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.efm.papyrus.xtext.transition.ReceiveSignalEventRule
+   * @generated
+   */
+  public Adapter createReceiveSignalEventRuleAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.efm.papyrus.xtext.transition.GuardRule <em>Guard Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.efm.papyrus.xtext.transition.GuardRule
+   * @generated
+   */
+  public Adapter createGuardRuleAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.efm.papyrus.xtext.transition.TGuardRule <em>TGuard Rule</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.efm.papyrus.xtext.transition.TGuardRule
+   * @generated
+   */
+  public Adapter createTGuardRuleAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for the default case.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @generated
+   */
+  public Adapter createEObjectAdapter()
+  {
+    return null;
+  }
+
+} //TransitionAdapterFactory
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/util/TransitionSwitch.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/util/TransitionSwitch.java
new file mode 100644
index 0000000..d4c899a
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/transition/util/TransitionSwitch.java
@@ -0,0 +1,247 @@
+/**
+ * ****************************************************************************
+ * * Copyright (c) 2016 CEA LIST.
+ * *
+ * * All rights reserved. This program and the accompanying materials
+ * * are made available under the terms of the Eclipse Public License v1.0
+ * * which accompanies this distribution, and is available at
+ * * http://www.eclipse.org/legal/epl-v10.html
+ * *
+ * * Contributors:
+ * *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ * *  - Initial API and implementation
+ * ****************************************************************************
+ */
+package org.eclipse.efm.papyrus.xtext.transition.util;
+
+import org.eclipse.efm.papyrus.xtext.transition.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.papyrus.xtext.transition.TransitionPackage
+ * @generated
+ */
+public class TransitionSwitch<T> extends Switch<T>
+{
+  /**
+   * The cached model package
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected static TransitionPackage modelPackage;
+
+  /**
+   * Creates an instance of the switch.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TransitionSwitch()
+  {
+    if (modelPackage == null)
+    {
+      modelPackage = TransitionPackage.eINSTANCE;
+    }
+  }
+
+  /**
+   * Checks whether this is a switch for the given package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param ePackage the package in question.
+   * @return whether this is a switch for the given package.
+   * @generated
+   */
+  @Override
+  protected boolean isSwitchFor(EPackage ePackage)
+  {
+    return ePackage == modelPackage;
+  }
+
+  /**
+   * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the first non-null result returned by a <code>caseXXX</code> call.
+   * @generated
+   */
+  @Override
+  protected T doSwitch(int classifierID, EObject theEObject)
+  {
+    switch (classifierID)
+    {
+      case TransitionPackage.TRANSITION_RULE:
+      {
+        TransitionRule transitionRule = (TransitionRule)theEObject;
+        T result = caseTransitionRule(transitionRule);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case TransitionPackage.TRIGGER_RULE:
+      {
+        TriggerRule triggerRule = (TriggerRule)theEObject;
+        T result = caseTriggerRule(triggerRule);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case TransitionPackage.EVENT_RULE:
+      {
+        EventRule eventRule = (EventRule)theEObject;
+        T result = caseEventRule(eventRule);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case TransitionPackage.RECEIVE_SIGNAL_EVENT_RULE:
+      {
+        ReceiveSignalEventRule receiveSignalEventRule = (ReceiveSignalEventRule)theEObject;
+        T result = caseReceiveSignalEventRule(receiveSignalEventRule);
+        if (result == null) result = caseEventRule(receiveSignalEventRule);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case TransitionPackage.GUARD_RULE:
+      {
+        GuardRule guardRule = (GuardRule)theEObject;
+        T result = caseGuardRule(guardRule);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      case TransitionPackage.TGUARD_RULE:
+      {
+        TGuardRule tGuardRule = (TGuardRule)theEObject;
+        T result = caseTGuardRule(tGuardRule);
+        if (result == null) result = defaultCase(theEObject);
+        return result;
+      }
+      default: return defaultCase(theEObject);
+    }
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Rule</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Rule</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseTransitionRule(TransitionRule object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Trigger Rule</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Trigger Rule</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseTriggerRule(TriggerRule object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Event Rule</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Event Rule</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseEventRule(EventRule object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Receive Signal Event Rule</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Receive Signal Event Rule</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseReceiveSignalEventRule(ReceiveSignalEventRule object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Guard Rule</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Guard Rule</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseGuardRule(GuardRule object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>TGuard Rule</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>TGuard Rule</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseTGuardRule(TGuardRule object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch, but this is the last case anyway.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+   * @generated
+   */
+  @Override
+  public T defaultCase(EObject object)
+  {
+    return null;
+  }
+
+} //TransitionSwitch
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/validation/AbstractTransitionValidator.java b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/validation/AbstractTransitionValidator.java
new file mode 100644
index 0000000..17d58bd
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src-gen/org/eclipse/efm/papyrus/xtext/validation/AbstractTransitionValidator.java
@@ -0,0 +1,29 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.validation;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.xtext.validation.AbstractDeclarativeValidator;
+
+public abstract class AbstractTransitionValidator extends AbstractDeclarativeValidator {
+	
+	@Override
+	protected List<EPackage> getEPackages() {
+		List<EPackage> result = new ArrayList<EPackage>();
+		result.add(org.eclipse.efm.papyrus.xtext.transition.TransitionPackage.eINSTANCE);
+		return result;
+	}
+	
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/GenerateTransition.mwe2 b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/GenerateTransition.mwe2
new file mode 100644
index 0000000..c482923
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/GenerateTransition.mwe2
@@ -0,0 +1,121 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+module org.eclipse.efm.papyrus.xtext.GenerateTransition
+
+import org.eclipse.xtext.xtext.generator.*
+import org.eclipse.xtext.xtext.generator.model.project.*
+
+var rootPath = ".."
+
+var fileHeader =
+"/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/"
+
+var projectName = "org.eclipse.efm.papyrus.xtext.transition"
+var runtimeProject = "../${projectName}"
+
+
+Workflow {
+
+	bean = org.eclipse.emf.mwe.utils.StandaloneSetup{
+		scanClassPath  = true
+		platformUri = "${runtimeProject}/.."
+				
+		//load EMF ECORE	
+		uriMap = {
+            from = "platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore"
+            to = "platform:/resource/org.eclipse.emf.ecore/model/Ecore.ecore"
+        }
+		
+		uriMap = { from = "platform:/plugin/org.eclipse.emf.codegen.ecore/model/GenModel.genmodel"
+           		   to = "platform:/resource/org.eclipse.emf.codegen.ecore/model/GenModel.genmodel"
+       	}
+       	
+        registerGeneratedEPackage = "org.eclipse.emf.ecore.EcorePackage"
+        registerGeneratedEPackage = "org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage"
+        registerGenModelFile = "platform:/resource/org.eclipse.emf.ecore/model/Ecore.genmodel"	
+		registerGenModelFile = "platform:/resource/org.eclipse.emf.codegen.ecore/model/GenModel.genmodel"
+		
+		//load UML
+		
+		uriMap = {
+            from = "platform:/plugin/org.eclipse.uml2.types/model/Types.genmodel"
+            to = "platform:/resource/org.eclipse.uml2.types/model/Types.genmodel"
+        }
+        uriMap = {
+            from = "platform:/plugin/org.eclipse.uml2.uml/model/UML.genmodel"
+            to = "platform:/resource/org.eclipse.uml2.uml/model/UML.genmodel"
+        }
+		        
+        uriMap = {
+            from = "platform:/plugin/org.eclipse.uml2.uml/model/UML.ecore"
+            to = "platform:/resource/org.eclipse.uml2.uml/model/UML.ecore"
+        }
+		
+		uriMap = {
+            from = "platform:/plugin/org.eclipse.uml2.types/model/Types.ecore"
+            to = "platform:/resource/org.eclipse.uml2.types/model/Types.ecore"
+        }
+        
+        registerGeneratedEPackage = "org.eclipse.uml2.types.TypesPackage"
+        registerGeneratedEPackage = "org.eclipse.uml2.uml.UMLPackage"
+        registerGeneratedEPackage = "org.eclipse.uml2.codegen.ecore.genmodel.GenModelPackage"
+        
+	 	registerGenModelFile = "platform:/resource/org.eclipse.uml2.types/model/Types.genmodel"
+	 	registerGenModelFile = "platform:/resource/org.eclipse.uml2.uml/model/UML.genmodel"
+        registerGenModelFile = "platform:/resource/org.eclipse.uml2.codegen.ecore/model/GenModel.genmodel"
+	}
+		
+	component = XtextGenerator {
+		configuration = {
+			project = StandardProjectConfig {
+				baseName = "org.eclipse.efm.papyrus.xtext.transition"
+				rootPath = rootPath
+				eclipsePlugin = {
+					enabled = true
+				}
+				createEclipseMetaData = true
+			}
+			code = {
+				encoding = "UTF-8"
+				fileHeader = fileHeader
+			}
+		}
+		
+		language = StandardLanguage {
+			name = "org.eclipse.efm.papyrus.xtext.Transition"
+			fileExtensions = "fmltransition"
+
+//			referencedResource = "platform:/resource/org.eclipse.efm.formalml/resources/profile/FormalML.profile.genmodel"
+			referencedResource = "platform:/resource/org.eclipse.uml2.uml/model/UML.genmodel"
+       		referencedResource = "platform:/resource/org.eclipse.uml2.codegen.ecore/model/GenModel.genmodel"
+
+			serializer = {
+				generateStub = false
+			}
+			validator = {
+				// composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
+			}
+		}
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/Transition.xtext b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/Transition.xtext
new file mode 100644
index 0000000..3029714
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/Transition.xtext
@@ -0,0 +1,112 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+grammar org.eclipse.efm.papyrus.xtext.Transition with org.eclipse.xtext.common.Terminals
+
+generate transition "http://www.eclipse.org/efm/papyrus/xtext/Transition"
+
+//import "http://org.eclipse.efm.formalml" as fml
+
+import "http://www.eclipse.org/uml2/5.0.0/UML" as uml
+
+import "http://www.eclipse.org/emf/2002/Ecore" as ecore
+
+
+
+//Model:
+//	greetings+=Greeting*;
+//	
+//Greeting:
+//	'Hello' name=ID '!';
+
+
+///////////////////////
+// Transition Rule
+///////////////////////
+
+TransitionRule
+	: ( triggers+=TriggerRule ( ',' triggers+=TriggerRule )* )?
+		( guard=GuardRule   )?
+		( tguard=TGuardRule )?
+		( '/' effectBody=STRING )?
+	;
+
+
+///////////////////////
+// [ Fully  [ Qualified ] ] Name
+///////////////////////
+
+FQN 
+	: ID ( ( '.' | '::' ) ID )*
+	;
+
+
+//////////////////////
+// EVENTS
+//////////////////////
+
+
+TriggerRule
+	: "input" /*(path=QualifiedName)?*/ port=[uml::NamedElement|FQN]
+		( event=EventRule )?
+	;
+
+
+EventRule
+	: ReceiveSignalEventRule
+//	|CallOrSignalEventRule
+//	| AnyReceiveEventRule
+//	| TimeEventRule
+//	| ChangeEventRule
+	;
+
+
+ReceiveSignalEventRule
+	: { ReceiveSignalEventRule }
+		'(' ( 
+			parameters+=[uml::Property|FQN]
+			( ',' parameters+=[uml::Property|FQN] )*
+		)? ')'
+	;
+
+/*QualifiedName :
+	path=[uml::Namespace]'::' (remaining=QualifiedName)? ; */
+
+///////////////////////
+// GUARD
+///////////////////////
+
+GuardRule :
+	'[' ( constraint=STRING ) ']';
+
+
+///////////////////////
+// TGUARD
+///////////////////////
+
+TGuardRule :
+'{' constraint=STRING '}';
+
+
+//TODO
+///////////////////////
+// EFFECT
+///////////////////////
+
+//EffectRule :
+//	'/' kind = BehaviorKind
+//	behaviorName = ID ;
+//
+//enum BehaviorKind :
+//	ACTIVITY = "Activity" |
+//	STATE_MACHINE = "StateMachine" |
+//	OPAQUE_BEHAVIOR = "OpaqueBehavior";
\ No newline at end of file
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/TransitionRuntimeModule.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/TransitionRuntimeModule.xtend
new file mode 100644
index 0000000..bc583aa
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/TransitionRuntimeModule.xtend
@@ -0,0 +1,20 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext
+
+
+/**
+ * Use this class to register components to be used at runtime / without the Equinox extension registry.
+ */
+class TransitionRuntimeModule extends AbstractTransitionRuntimeModule {
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/TransitionStandaloneSetup.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/TransitionStandaloneSetup.xtend
new file mode 100644
index 0000000..9230944
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/TransitionStandaloneSetup.xtend
@@ -0,0 +1,24 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext
+
+
+/**
+ * Initialization support for running Xtext languages without Equinox extension registry.
+ */
+class TransitionStandaloneSetup extends TransitionStandaloneSetupGenerated {
+
+	def static void doSetup() {
+		new TransitionStandaloneSetup().createInjectorAndDoEMFRegistration()
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/generator/TransitionGenerator.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/generator/TransitionGenerator.xtend
new file mode 100644
index 0000000..233bac3
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/generator/TransitionGenerator.xtend
@@ -0,0 +1,34 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.generator
+
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.generator.AbstractGenerator
+import org.eclipse.xtext.generator.IFileSystemAccess2
+import org.eclipse.xtext.generator.IGeneratorContext
+
+/**
+ * Generates code from your model files on save.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation
+ */
+class TransitionGenerator extends AbstractGenerator {
+
+	override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
+//		fsa.generateFile('greetings.txt', 'People to greet: ' + 
+//			resource.allContents
+//				.filter(typeof(Greeting))
+//				.map[name]
+//				.join(', '))
+	}
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/scoping/TransitionScopeProvider.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/scoping/TransitionScopeProvider.xtend
new file mode 100644
index 0000000..39f515e
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/scoping/TransitionScopeProvider.xtend
@@ -0,0 +1,24 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.scoping
+
+
+/**
+ * This class contains custom scoping description.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
+ * on how and when to use it.
+ */
+class TransitionScopeProvider extends AbstractTransitionScopeProvider {
+
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/validation/TransitionValidator.xtend b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/validation/TransitionValidator.xtend
new file mode 100644
index 0000000..3544700
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/src/org/eclipse/efm/papyrus/xtext/validation/TransitionValidator.xtend
@@ -0,0 +1,34 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.papyrus.xtext.validation
+
+
+/**
+ * This class contains custom validation rules. 
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
+ */
+class TransitionValidator extends AbstractTransitionValidator {
+	
+//	public static val INVALID_NAME = 'invalidName'
+//
+//	@Check
+//	def checkGreetingStartsWithCapital(Greeting greeting) {
+//		if (!Character.isUpperCase(greeting.name.charAt(0))) {
+//			warning('Name should start with a capital', 
+//					TransitionPackage.Literals.GREETING__NAME,
+//					INVALID_NAME)
+//		}
+//	}
+	
+}
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionGenerator.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionGenerator.xtendbin
new file mode 100644
index 0000000..50c9195
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionGenerator.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionRuntimeModule.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionRuntimeModule.xtendbin
new file mode 100644
index 0000000..7d8c26b
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionRuntimeModule.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionScopeProvider.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionScopeProvider.xtendbin
new file mode 100644
index 0000000..276b3a3
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionScopeProvider.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionStandaloneSetup.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionStandaloneSetup.xtendbin
new file mode 100644
index 0000000..6db95d4
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionStandaloneSetup.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionValidator.xtendbin b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionValidator.xtendbin
new file mode 100644
index 0000000..09fc70e
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/.TransitionValidator.xtendbin
Binary files differ
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/.gitignore
new file mode 100644
index 0000000..fac8bd9
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/.gitignore
@@ -0,0 +1,6 @@
+/.TransitionRuntimeModule.java._trace
+/.TransitionRuntimeModule.xtendbin
+/.TransitionStandaloneSetup.java._trace
+/.TransitionStandaloneSetup.xtendbin
+/TransitionRuntimeModule.java
+/TransitionStandaloneSetup.java
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/generator/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/generator/.gitignore
new file mode 100644
index 0000000..1e7ad03
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/generator/.gitignore
@@ -0,0 +1,3 @@
+/.TransitionGenerator.java._trace
+/.TransitionGenerator.xtendbin
+/TransitionGenerator.java
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/scoping/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/scoping/.gitignore
new file mode 100644
index 0000000..c1d4773
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/scoping/.gitignore
@@ -0,0 +1,3 @@
+/.TransitionScopeProvider.java._trace
+/.TransitionScopeProvider.xtendbin
+/TransitionScopeProvider.java
diff --git a/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/validation/.gitignore b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/validation/.gitignore
new file mode 100644
index 0000000..af71b3f
--- /dev/null
+++ b/editor/transition/org.eclipse.efm.papyrus.xtext.transition/xtend-gen/org/eclipse/efm/papyrus/xtext/validation/.gitignore
@@ -0,0 +1,3 @@
+/.TransitionValidator.java._trace
+/.TransitionValidator.xtendbin
+/TransitionValidator.java
diff --git a/editor/transition/pom.xml b/editor/transition/pom.xml
new file mode 100644
index 0000000..d0ac016
--- /dev/null
+++ b/editor/transition/pom.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.modeling.editor.transition</artifactId>
+	<packaging>pom</packaging>
+	<name>org.eclipse.efm-modeling Transition Editor</name>
+	<description>This module contains the different plugins relative to the XText Editor for efm-modeling-uml-transition.</description>
+
+	<modules>
+		<module>org.eclipse.efm.papyrus.xtext.transition</module>
+		<module>org.eclipse.efm.papyrus.xtext.transition.ide</module>
+		<module>org.eclipse.efm.papyrus.xtext.transition.ui</module>
+	</modules>
+</project>
diff --git a/editor/xlia/.gitignore b/editor/xlia/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/xlia/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/xlia/.project b/editor/xlia/.project
new file mode 100644
index 0000000..78746d9
--- /dev/null
+++ b/editor/xlia/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.modeling.editor.xlia</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/xlia/.settings/org.eclipse.core.resources.prefs b/editor/xlia/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/xlia/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/xlia/.settings/org.eclipse.m2e.core.prefs b/editor/xlia/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/xlia/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/xlia/README.md b/editor/xlia/README.md
new file mode 100644
index 0000000..572a45e
--- /dev/null
+++ b/editor/xlia/README.md
@@ -0,0 +1 @@
+# Eclipse Formal Modeling xLIA Xtext's based Editor
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/.classpath b/editor/xlia/org.eclipse.efm.formalml.ecore/.classpath
new file mode 100644
index 0000000..e9b9bf7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/.gitignore b/editor/xlia/org.eclipse.efm.formalml.ecore/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/.project b/editor/xlia/org.eclipse.efm.formalml.ecore/.project
new file mode 100644
index 0000000..f49be75
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/.project
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.formalml.ecore</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.sirius.nature.modelingproject</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/.settings/org.eclipse.core.resources.prefs b/editor/xlia/org.eclipse.efm.formalml.ecore/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/.settings/org.eclipse.jdt.core.prefs b/editor/xlia/org.eclipse.efm.formalml.ecore/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/.settings/org.eclipse.m2e.core.prefs b/editor/xlia/org.eclipse.efm.formalml.ecore/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/META-INF/MANIFEST.MF b/editor/xlia/org.eclipse.efm.formalml.ecore/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cfde5c6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/META-INF/MANIFEST.MF
@@ -0,0 +1,36 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.efm.formalml.ecore;singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.efm.formalml.ecore.Activator
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;visibility:=reexport,
+ org.eclipse.core.resources
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.ecore.formalml,
+ org.eclipse.efm.ecore.formalml.common,
+ org.eclipse.efm.ecore.formalml.common.impl,
+ org.eclipse.efm.ecore.formalml.common.util,
+ org.eclipse.efm.ecore.formalml.datatype,
+ org.eclipse.efm.ecore.formalml.datatype.impl,
+ org.eclipse.efm.ecore.formalml.datatype.util,
+ org.eclipse.efm.ecore.formalml.expression,
+ org.eclipse.efm.ecore.formalml.expression.impl,
+ org.eclipse.efm.ecore.formalml.expression.util,
+ org.eclipse.efm.ecore.formalml.impl,
+ org.eclipse.efm.ecore.formalml.infrastructure,
+ org.eclipse.efm.ecore.formalml.infrastructure.impl,
+ org.eclipse.efm.ecore.formalml.infrastructure.util,
+ org.eclipse.efm.ecore.formalml.statemachine,
+ org.eclipse.efm.ecore.formalml.statemachine.impl,
+ org.eclipse.efm.ecore.formalml.statemachine.util,
+ org.eclipse.efm.ecore.formalml.statement,
+ org.eclipse.efm.ecore.formalml.statement.impl,
+ org.eclipse.efm.ecore.formalml.statement.util,
+ org.eclipse.efm.ecore.formalml.util
+Bundle-ActivationPolicy: lazy
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/README.md b/editor/xlia/org.eclipse.efm.formalml.ecore/README.md
new file mode 100644
index 0000000..f18aac5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/README.md
@@ -0,0 +1,3 @@
+# Eclipse Formal Modeling, FormalML Ecore
+
+Model Ecore for Xtext Editor
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/about.html b/editor/xlia/org.eclipse.efm.formalml.ecore/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/build.properties b/editor/xlia/org.eclipse.efm.formalml.ecore/build.properties
new file mode 100644
index 0000000..2e463ed
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               plugin.properties,\
+               .
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/plugin.properties b/editor/xlia/org.eclipse.efm.formalml.ecore/plugin.properties
new file mode 100644
index 0000000..9913980
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/plugin.properties
@@ -0,0 +1,24 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+# 
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and implementation
+
+pluginName = FormalML Model
+providerName = www.example.org
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/plugin.xml b/editor/xlia/org.eclipse.efm.formalml.ecore/plugin.xml
new file mode 100644
index 0000000..04f4cdc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/plugin.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+      Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<plugin>
+
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated formalml -->
+      <package
+            uri="http://www.eclipse.org/efm/FormalML"
+            class="org.eclipse.efm.ecore.formalml.FormalmlPackage"
+            genModel="resources/ecore/formalml.genmodel"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated formalml -->
+      <package
+            uri="http://www.eclipse.org/efm/FormalML/Common"
+            class="org.eclipse.efm.ecore.formalml.common.CommonPackage"
+            genModel="resources/ecore/formalml.genmodel"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated formalml -->
+      <package
+            uri="http://www.eclipse.org/efm/FormalML/Infrastructure"
+            class="org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage"
+            genModel="resources/ecore/formalml.genmodel"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated formalml -->
+      <package
+            uri="http://www.eclipse.org/efm/FormalML/DataType"
+            class="org.eclipse.efm.ecore.formalml.datatype.DatatypePackage"
+            genModel="resources/ecore/formalml.genmodel"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated formalml -->
+      <package
+            uri="http://www.eclipse.org/efm/FormalML/Expression"
+            class="org.eclipse.efm.ecore.formalml.expression.ExpressionPackage"
+            genModel="resources/ecore/formalml.genmodel"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated formalml -->
+      <package
+            uri="http://www.eclipse.org/efm/FormalML/Statement"
+            class="org.eclipse.efm.ecore.formalml.statement.StatementPackage"
+            genModel="resources/ecore/formalml.genmodel"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated formalml -->
+      <package
+            uri="http://www.eclipse.org/efm/FormalML/Statemachine"
+            class="org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage"
+            genModel="resources/ecore/formalml.genmodel"/>
+   </extension>
+
+</plugin>
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/pom.xml b/editor/xlia/org.eclipse.efm.formalml.ecore/pom.xml
new file mode 100644
index 0000000..abfdee6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.xlia</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.formalml.ecore</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.formalml.ecore</name>
+	<description>This plug-in contains the xLIA's Xtext based editor ECORE model.</description>
+</project>
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.aird b/editor/xlia/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.aird
new file mode 100644
index 0000000..a1df411
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.aird
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<viewpoint:DAnalysis xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style" xmi:id="_Tb8hoOtUEeWrjOO9KgllWw" selectedViews="_TgN9oOtUEeWrjOO9KgllWw _TgQZ4OtUEeWrjOO9KgllWw _TgUEQOtUEeWrjOO9KgllWw" version="10.1.0.201509162000">
+  <semanticResources>formalml.ecore</semanticResources>
+  <semanticResources>formalml.genmodel</semanticResources>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_TgN9oOtUEeWrjOO9KgllWw">
+    <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Review']"/>
+  </ownedViews>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_TgQZ4OtUEeWrjOO9KgllWw">
+    <ownedRepresentations xmi:type="diagram:DSemanticDiagram" xmi:id="_TgqCgOtUEeWrjOO9KgllWw" name="formalml">
+      <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_TgqCgetUEeWrjOO9KgllWw" source="DANNOTATION_CUSTOMIZATION_KEY">
+        <data xmi:type="diagram:ComputedStyleDescriptionRegistry" xmi:id="_TgqCgutUEeWrjOO9KgllWw"/>
+      </ownedAnnotationEntries>
+      <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_TgqpkOtUEeWrjOO9KgllWw" source="GMF_DIAGRAMS">
+        <data xmi:type="notation:Diagram" xmi:id="_TgqpketUEeWrjOO9KgllWw" type="Sirius" element="_TgqCgOtUEeWrjOO9KgllWw" measurementUnit="Pixel">
+          <children xmi:type="notation:Node" xmi:id="_Tgqpk-tUEeWrjOO9KgllWw" type="2001" element="_TgqCg-tUEeWrjOO9KgllWw">
+            <children xmi:type="notation:Node" xmi:id="_TgrQoOtUEeWrjOO9KgllWw" type="5002">
+              <layoutConstraint xmi:type="notation:Location" xmi:id="_TgrQoetUEeWrjOO9KgllWw" y="5"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_Tg-yoOtUEeWrjOO9KgllWw" type="3005" element="_TgqChOtUEeWrjOO9KgllWw">
+              <styles xmi:type="notation:ShapeStyle" xmi:id="_Tg-yoetUEeWrjOO9KgllWw" fontName="Segoe UI"/>
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Tg-youtUEeWrjOO9KgllWw"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_TgqplOtUEeWrjOO9KgllWw" fontName="Segoe UI" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TgqpletUEeWrjOO9KgllWw" width="640" height="85"/>
+          </children>
+          <styles xmi:type="notation:DiagramStyle" xmi:id="_TgqpkutUEeWrjOO9KgllWw"/>
+        </data>
+      </ownedAnnotationEntries>
+      <ownedDiagramElements xmi:type="diagram:DNode" xmi:id="_TgqCg-tUEeWrjOO9KgllWw" width="-1" height="-1">
+        <target xmi:type="ecore:EPackage" href="formalml.ecore#/"/>
+        <semanticElements xmi:type="ecore:EPackage" href="formalml.ecore#/"/>
+        <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_TgqChOtUEeWrjOO9KgllWw" showIcon="false" labelPosition="node" workspacePath="/org.eclipse.emf.ecoretools.design/icons/full/back/empty.svg">
+          <description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']/@style"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']"/>
+      </ownedDiagramElements>
+      <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
+      <filterVariableHistory xmi:type="diagram:FilterVariableHistory" xmi:id="_TgqChetUEeWrjOO9KgllWw"/>
+      <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
+      <activatedLayers xmi:type="description_1:AdditionalLayer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@additionalLayers[name='Package']"/>
+      <activatedLayers xmi:type="description_1:AdditionalLayer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@additionalLayers[name='Validation']"/>
+      <activatedLayers xmi:type="description_1:AdditionalLayer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Archetype']/@ownedRepresentationExtensions[name='Entities%20With%20Archetypes']/@layers[name='Archetypes']"/>
+      <target xmi:type="ecore:EPackage" href="formalml.ecore#/"/>
+    </ownedRepresentations>
+    <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
+  </ownedViews>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_TgUEQOtUEeWrjOO9KgllWw">
+    <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Archetype']"/>
+  </ownedViews>
+</viewpoint:DAnalysis>
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.ecore b/editor/xlia/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.ecore
new file mode 100644
index 0000000..e127a20
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.ecore
@@ -0,0 +1,894 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="formalml" nsURI="http://www.eclipse.org/efm/FormalML" nsPrefix="FormalML">
+  <eAnnotations source="http://www.eclipse.org/OCL/Import">
+    <details key="ecore" value="http://www.eclipse.org/emf/2002/Ecore"/>
+  </eAnnotations>
+  <eClassifiers xsi:type="ecore:EEnum" name="XliaModelKind">
+    <eLiterals name="system"/>
+    <eLiterals name="package" value="1"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="XliaModel">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="prolog" lowerBound="1"
+        eType="#//XliaObject" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="system" lowerBound="1"
+        eType="#//infrastructure/System" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="XliaNamedElement">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        defaultValueLiteral="1.0"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="XliaObject" eSuperTypes="#//XliaNamedElement">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="#//expression/Expression"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="elements" upperBound="-1"
+        eType="#//XliaNamedElement" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="XliaAttribute" eSuperTypes="#//XliaNamedElement">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//expression/Expression"
+        containment="true"/>
+  </eClassifiers>
+  <eSubpackages name="common" nsURI="http://www.eclipse.org/efm/FormalML/Common" nsPrefix="Common">
+    <eClassifiers xsi:type="ecore:EClass" name="AbstractElement" abstract="true"/>
+    <eClassifiers xsi:type="ecore:EClass" name="QualifiedName" eSuperTypes="#//common/AbstractElement">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="isAmbiguous" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="pathName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="nameBinding" upperBound="-1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="unqualifiedName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="VisibilityKind">
+      <eLiterals name="public"/>
+      <eLiterals name="private" value="1"/>
+      <eLiterals name="protected" value="2"/>
+      <eLiterals name="package" value="3"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="NamedElement" abstract="true" eSuperTypes="#//common/AbstractElement">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="unrestrictedName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="qualifiedName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="visibility" eType="#//common/VisibilityKind"
+          defaultValueLiteral="protected"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Type" eSuperTypes="#//common/NamedElement"/>
+    <eClassifiers xsi:type="ecore:EClass" name="TypedElement" eSuperTypes="#//common/NamedElement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="type" eType="#//common/Type"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ClassifierDefinition" eSuperTypes="#//common/Type"/>
+  </eSubpackages>
+  <eSubpackages name="infrastructure" nsURI="http://www.eclipse.org/efm/FormalML/Infrastructure"
+      nsPrefix="Infrastructure">
+    <eClassifiers xsi:type="ecore:EEnum" name="DesignKind">
+      <eLiterals name="model"/>
+      <eLiterals name="instance" value="1"/>
+      <eLiterals name="prototype" value="2"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Machine" eSuperTypes="#//common/ClassifierDefinition">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="input_enabled" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="timed" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="design" lowerBound="1"
+          eType="#//infrastructure/DesignKind" defaultValueLiteral="prototype"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="machine" upperBound="-1"
+          eType="#//infrastructure/Machine" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="typedef" upperBound="-1"
+          eType="#//datatype/DataType" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
+          eType="#//infrastructure/PropertyDefinition" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="channel" upperBound="-1"
+          eType="#//infrastructure/Channel" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="port" upperBound="-1"
+          eType="#//infrastructure/Port" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="signal" upperBound="-1"
+          eType="#//infrastructure/Signal" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="buffer" upperBound="-1"
+          eType="#//infrastructure/Buffer" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="routine" upperBound="-1"
+          eType="#//infrastructure/Routine" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="procedure" upperBound="-1"
+          eType="#//infrastructure/Procedure" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="instance" upperBound="-1"
+          eType="#//infrastructure/InstanceMachine" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="behavior" upperBound="-1"
+          eType="#//infrastructure/Behavior" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="main" eType="#//infrastructure/Behavior"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="System" eSuperTypes="#//infrastructure/Machine"/>
+    <eClassifiers xsi:type="ecore:EClass" name="Modifier">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="static" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="final" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="reference" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="volatile" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="transient" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="PropertyDefinition" eSuperTypes="#//common/TypedElement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="modifier" eType="#//infrastructure/Modifier"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Variable" eSuperTypes="#//infrastructure/PropertyDefinition">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="const" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="macro" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="onWriteAction" eType="#//infrastructure/Routine"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Buffer" eSuperTypes="#//infrastructure/PropertyDefinition #//infrastructure/ComProtocol"/>
+    <eClassifiers xsi:type="ecore:EEnum" name="ChannelDirection">
+      <eLiterals name="input"/>
+      <eLiterals name="inout" value="1"/>
+      <eLiterals name="output" value="2"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Port" eSuperTypes="#//infrastructure/PropertyDefinition">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="direction" eType="#//infrastructure/ChannelDirection"
+          defaultValueLiteral="inout"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="signal" upperBound="-1"
+          eType="#//infrastructure/Signal" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" upperBound="-1"
+          eType="#//infrastructure/Parameter" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Channel" eSuperTypes="#//infrastructure/PropertyDefinition">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="direction" eType="#//infrastructure/ChannelDirection"
+          defaultValueLiteral="inout"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="machine" eType="#//infrastructure/Machine"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="port" upperBound="-1"
+          eType="#//infrastructure/Port" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="signal" upperBound="-1"
+          eType="#//infrastructure/Signal" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Signal" eSuperTypes="#//common/ClassifierDefinition">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="direction" eType="#//infrastructure/ChannelDirection"
+          defaultValueLiteral="inout"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" upperBound="-1"
+          eType="#//infrastructure/Parameter" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Procedure" eSuperTypes="#//statemachine/Statemachine"/>
+    <eClassifiers xsi:type="ecore:EClass" name="Routine" eSuperTypes="#//common/NamedElement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" upperBound="-1"
+          eType="#//infrastructure/Parameter" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="bodyBlock" lowerBound="1"
+          eType="#//statement/BlockStatement" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="domain" eType="#//infrastructure/ParameterSet"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="codomain" eType="#//infrastructure/ParameterSet"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="InstanceMachine" eSuperTypes="#//common/TypedElement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="modifier" eType="#//infrastructure/Modifier"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="model" eType="#//infrastructure/Machine"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="arg" eType="#//expression/MixTupleExpression"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="slot" upperBound="-1"
+          eType="#//infrastructure/SlotProperty" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="SlotProperty">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="xliaProperty" eType="#//infrastructure/PropertyDefinition"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="ParameterDirectionKind">
+      <eLiterals name="in"/>
+      <eLiterals name="inout" value="1"/>
+      <eLiterals name="out" value="2"/>
+      <eLiterals name="return" value="3"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="#//infrastructure/PropertyDefinition">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="direction" lowerBound="1"
+          eType="#//infrastructure/ParameterDirectionKind" defaultValueLiteral="in"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ParameterSet">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" upperBound="-1"
+          eType="#//infrastructure/Parameter" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Behavior" eSuperTypes="#//infrastructure/Machine">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" upperBound="-1"
+          eType="#//infrastructure/Parameter" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="computation" eType="#//infrastructure/ModelOfComputation"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="execution" eType="#//infrastructure/ModelOfExecution"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="interaction" eType="#//infrastructure/ModelOfInteraction"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ModelOfComputation"/>
+    <eClassifiers xsi:type="ecore:EClass" name="ModelOfExecution">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="initRoutine" eType="#//infrastructure/Routine"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="finalRoutine" eType="#//infrastructure/Routine"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="enableRoutine" eType="#//infrastructure/Routine"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="disableRoutine" eType="#//infrastructure/Routine"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="concurrencyRoutine" eType="#//infrastructure/Routine"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="scheduleRoutine" eType="#//infrastructure/Routine"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="irunRoutine" eType="#//infrastructure/Routine"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="runRoutine" eType="#//infrastructure/Routine"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="routine" upperBound="-1"
+          eType="#//infrastructure/Routine" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ModelOfInteraction">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="routes" upperBound="-1"
+          eType="#//infrastructure/Route" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="connections" upperBound="-1"
+          eType="#//infrastructure/Connection" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ComProtocol">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="protocol" eType="#//infrastructure/ComProtocolKind"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="cast" eType="#//infrastructure/ComCastKind"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="inner_buffer" eType="#//datatype/CollectionType"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="ref_buffer" eType="#//infrastructure/Buffer"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Route" eSuperTypes="#//common/NamedElement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="signals" upperBound="-1"
+          eType="#//infrastructure/Signal"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="protocol" eType="#//infrastructure/ComProtocol"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Connection" eSuperTypes="#//common/NamedElement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="protocol" eType="#//infrastructure/ComProtocol"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="cast" eType="#//infrastructure/ComCastKind"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="comPoints" lowerBound="1"
+          upperBound="-1" eType="#//infrastructure/ComPoint" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ComPoint">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="direction" eType="#//infrastructure/ChannelDirection"
+          defaultValueLiteral="inout"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="protocol" eType="#//infrastructure/ComProtocol"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="point" eType="#//expression/Expression"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="points" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="ComProtocolKind">
+      <eLiterals name="none"/>
+      <eLiterals name="env" value="1"/>
+      <eLiterals name="buffer" value="2"/>
+      <eLiterals name="rdv" value="3"/>
+      <eLiterals name="multi_rdv" value="4"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="ComCastKind">
+      <eLiterals name="none"/>
+      <eLiterals name="unicast" value="1"/>
+      <eLiterals name="anycast" value="2"/>
+      <eLiterals name="multicast" value="3"/>
+      <eLiterals name="broadcast" value="4"/>
+    </eClassifiers>
+  </eSubpackages>
+  <eSubpackages name="datatype" nsURI="http://www.eclipse.org/efm/FormalML/DataType"
+      nsPrefix="DataType">
+    <eClassifiers xsi:type="ecore:EEnum" name="PrimitiveTypeKind">
+      <eLiterals name="boolean"/>
+      <eLiterals name="int" value="1"/>
+      <eLiterals name="integer" value="2"/>
+      <eLiterals name="rat" value="3"/>
+      <eLiterals name="rational" value="4"/>
+      <eLiterals name="float" value="5"/>
+      <eLiterals name="double" value="6"/>
+      <eLiterals name="real" value="7"/>
+      <eLiterals name="time" value="8"/>
+      <eLiterals name="uint" value="9"/>
+      <eLiterals name="uinteger" value="10"/>
+      <eLiterals name="urat" value="11"/>
+      <eLiterals name="urational" value="12"/>
+      <eLiterals name="ufloat" value="13"/>
+      <eLiterals name="udouble" value="14"/>
+      <eLiterals name="ureal" value="15"/>
+      <eLiterals name="char" value="16"/>
+      <eLiterals name="string" value="17"/>
+      <eLiterals name="buffer" value="18"/>
+      <eLiterals name="message" value="19"/>
+      <eLiterals name="port" value="20"/>
+      <eLiterals name="machine" value="21"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="DataType" abstract="true" eSuperTypes="#//common/ClassifierDefinition">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//datatype/PrimitiveTypeKind"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="typedef" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="multiplicity" eType="#//expression/Expression"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="DataTypeReference" eSuperTypes="#//datatype/DataType">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="typeref" eType="#//datatype/DataType"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="support" eType="#//datatype/DataType"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="EnumerationLiteral" eSuperTypes="#//common/NamedElement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//expression/LiteralExpression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="EnumerationType" eSuperTypes="#//datatype/DataType">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="literal" upperBound="-1"
+          eType="#//datatype/EnumerationLiteral" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="DataStructuredType" abstract="true"
+        eSuperTypes="#//datatype/DataType">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
+          eType="#//infrastructure/PropertyDefinition" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="StructureType" eSuperTypes="#//datatype/DataStructuredType"/>
+    <eClassifiers xsi:type="ecore:EClass" name="UnionType" eSuperTypes="#//datatype/DataStructuredType"/>
+    <eClassifiers xsi:type="ecore:EClass" name="ChoiceType" eSuperTypes="#//datatype/DataStructuredType"/>
+    <eClassifiers xsi:type="ecore:EClass" name="DataSupportedType" abstract="true"
+        eSuperTypes="#//datatype/DataType">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="support" eType="#//datatype/DataType"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="IntervalType" eSuperTypes="#//datatype/DataSupportedType">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="lopen" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="ropen" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="infimum" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="supremum" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="CollectionKind">
+      <eLiterals name="vector"/>
+      <eLiterals name="rvector" value="1"/>
+      <eLiterals name="list" value="2"/>
+      <eLiterals name="set" value="3"/>
+      <eLiterals name="bag" value="4"/>
+      <eLiterals name="fifo" value="5"/>
+      <eLiterals name="lifo" value="6"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="CollectionType" eSuperTypes="#//datatype/DataSupportedType">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="container" eType="#//datatype/CollectionKind"
+          defaultValueLiteral="list"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="size" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
+          defaultValueLiteral="-1"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="unbounded" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveType" abstract="true" eSuperTypes="#//datatype/DataType"/>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveBooleanType" eSuperTypes="#//datatype/PrimitiveType"/>
+    <eClassifiers xsi:type="ecore:EEnum" name="PrimitiveNumberSign">
+      <eLiterals name="any"/>
+      <eLiterals name="negative" value="-1"/>
+      <eLiterals name="negative_strict" value="-2"/>
+      <eLiterals name="positive" value="1"/>
+      <eLiterals name="positive_strict" value="2"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveNumberType" abstract="true"
+        eSuperTypes="#//datatype/PrimitiveType">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="sign" eType="#//datatype/PrimitiveNumberSign"
+          defaultValueLiteral="any"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="size" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveIntegerType" eSuperTypes="#//datatype/PrimitiveNumberType"/>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveRationalType" eSuperTypes="#//datatype/PrimitiveNumberType"/>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveFloatType" eSuperTypes="#//datatype/PrimitiveNumberType"/>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveRealType" eSuperTypes="#//datatype/PrimitiveNumberType"/>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveTimeType" eSuperTypes="#//datatype/PrimitiveNumberType">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="clock" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="support" eType="#//datatype/PrimitiveNumberType"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveCharacterType" eSuperTypes="#//datatype/PrimitiveType"/>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveStringType" eSuperTypes="#//datatype/PrimitiveType">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="size" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="PrimitiveInstanceKind">
+      <eLiterals name="buffer"/>
+      <eLiterals name="message" value="1"/>
+      <eLiterals name="port" value="2"/>
+      <eLiterals name="signal" value="3"/>
+      <eLiterals name="com_point" value="4"/>
+      <eLiterals name="channel" value="5"/>
+      <eLiterals name="machine" value="6"/>
+      <eLiterals name="vertex" value="7"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="PrimitiveInstanceType" eSuperTypes="#//datatype/PrimitiveType">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="expected" eType="#//datatype/PrimitiveInstanceKind"
+          defaultValueLiteral="machine"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="model" eType="#//common/NamedElement"/>
+    </eClassifiers>
+  </eSubpackages>
+  <eSubpackages name="expression" nsURI="http://www.eclipse.org/efm/FormalML/Expression"
+      nsPrefix="Expression">
+    <eClassifiers xsi:type="ecore:EEnum" name="PRINTER_FIX">
+      <eLiterals name="infix"/>
+      <eLiterals name="prefix" value="1"/>
+      <eLiterals name="suffix" value="2"/>
+      <eLiterals name="functional" value="3"/>
+      <eLiterals name="specific" value="4"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ValueExpressionPrettyPrinter" abstract="true">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="symbol" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="fix" lowerBound="1" eType="#//expression/PRINTER_FIX"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="specific" upperBound="-1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ValuePrintableExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="symbol" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="printer" eType="#//expression/ValueExpressionPrettyPrinter"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="operand" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Expression" abstract="true" eSuperTypes="#//common/AbstractElement"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralExpression" eSuperTypes="#//expression/Expression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralBooleanExpression" eSuperTypes="#//expression/LiteralExpression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralIntegerExpression" eSuperTypes="#//expression/LiteralExpression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong"
+          defaultValueLiteral="0"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralRationalExpression" eSuperTypes="#//expression/LiteralExpression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="numerator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong" defaultValueLiteral="0"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="denominator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong" defaultValueLiteral="1"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralFloatExpression" eSuperTypes="#//expression/LiteralExpression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralRealExpression" eSuperTypes="#//expression/LiteralExpression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralCharacterExpression" eSuperTypes="#//expression/LiteralExpression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EChar"
+          defaultValueLiteral="'\0'"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralStringExpression" eSuperTypes="#//expression/LiteralExpression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralCollectionExpression" eSuperTypes="#//expression/LiteralExpression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="datatype" eType="#//datatype/DataType"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralNullExpression" eSuperTypes="#//expression/LiteralExpression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="type" eType="#//common/Type"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralReferenceExpression" eSuperTypes="#//expression/LiteralExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralReferenceElement" eSuperTypes="#//expression/LiteralReferenceExpression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" lowerBound="1"
+          eType="#//expression/ValueElementSpecificationKind" defaultValueLiteral="field"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//common/NamedElement"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="arg" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralThisExpression" eSuperTypes="#//expression/LiteralReferenceExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralSelfExpression" eSuperTypes="#//expression/LiteralReferenceExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralParentExpression" eSuperTypes="#//expression/LiteralReferenceExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralSuperExpression" eSuperTypes="#//expression/LiteralReferenceExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralSystemExpression" eSuperTypes="#//expression/LiteralReferenceExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralEnvExpression" eSuperTypes="#//expression/LiteralReferenceExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralTimeExpression" eSuperTypes="#//expression/LiteralReferenceExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LiteralTimeDeltaExpression" eSuperTypes="#//expression/LiteralReferenceExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LeftHandSideExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="lvalue" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="IncrementOrDecrementExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="leftHandSide" lowerBound="1"
+          eType="#//expression/LeftHandSideExpression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="IncrementOrDecrementPrefixExpression"
+        eSuperTypes="#//expression/IncrementOrDecrementExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="IncrementOrDecrementPostfixExpression"
+        eSuperTypes="#//expression/IncrementOrDecrementExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="AssignmentExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="leftHandSide" lowerBound="1"
+          eType="#//expression/LeftHandSideExpression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="rigthHandSide" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="NewfreshExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="leftHandSide" lowerBound="1"
+          eType="#//expression/LeftHandSideExpression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="UnaryExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="operand" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="BitwiseUnaryExpression" eSuperTypes="#//expression/UnaryExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LogicalUnaryExpression" eSuperTypes="#//expression/UnaryExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="CastExpression" eSuperTypes="#//expression/UnaryExpression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="datatype" eType="#//datatype/DataType"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ArithmeticUnaryExpression" eSuperTypes="#//expression/UnaryExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="BinaryExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="leftOperand" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="rigthOperand" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="EqualityBinaryExpression" eSuperTypes="#//expression/BinaryExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="RelationalBinaryExpression" eSuperTypes="#//expression/BinaryExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="RelationalTernaryExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="leftRelation" lowerBound="1"
+          eType="#//expression/RelationalBinaryExpression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="rigthOperator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="rigthOperand" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ConditionalTestExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="condition" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="thenOperand" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="elseOperand" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="AssociativeExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="operand" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ArithmeticAssociativeExpression" eSuperTypes="#//expression/AssociativeExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="BitwiseAssociativeExpression" eSuperTypes="#//expression/AssociativeExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="LogicalAssociativeExpression" eSuperTypes="#//expression/AssociativeExpression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="InvokeExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="callProcedure" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="invoke" eType="#//expression/Expression"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="args" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="rets" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="NamedExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="target" eType="#//common/NamedElement"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="expression" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="TupleExpression" abstract="true" eSuperTypes="#//expression/Expression"/>
+    <eClassifiers xsi:type="ecore:EClass" name="MixTupleExpression" eSuperTypes="#//expression/TupleExpression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="NamedTupleExpression" eSuperTypes="#//expression/TupleExpression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
+          eType="#//expression/NamedExpression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="PositionalTupleExpression" eSuperTypes="#//expression/TupleExpression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ValueElementSpecification" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" lowerBound="1"
+          eType="#//expression/ValueElementSpecificationKind" defaultValueLiteral="field"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="expected" lowerBound="1"
+          eType="#//expression/ValueElementSpecificationScheme" defaultValueLiteral="any"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="target" eType="#//expression/Expression"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="element" eType="#//common/NamedElement"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="arg" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="ValueElementSpecificationKind">
+      <eLiterals name="field"/>
+      <eLiterals name="index" value="1"/>
+      <eLiterals name="parameter" value="2"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="ValueElementSpecificationScheme">
+      <eLiterals name="any"/>
+      <eLiterals name="variable" value="1"/>
+      <eLiterals name="message" value="2"/>
+      <eLiterals name="signal" value="3"/>
+      <eLiterals name="buffer" value="4"/>
+      <eLiterals name="channel" value="5"/>
+      <eLiterals name="port" value="6"/>
+      <eLiterals name="com_point" value="7"/>
+      <eLiterals name="instance" value="8"/>
+      <eLiterals name="machine" value="9"/>
+      <eLiterals name="model" value="10"/>
+      <eLiterals name="procedure" value="11"/>
+      <eLiterals name="routine" value="12"/>
+      <eLiterals name="vertex" value="13"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="InstantiationExpression" eSuperTypes="#//expression/Expression">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="instance" eType="#//infrastructure/InstanceMachine"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ExpressionAsBuffer">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="buffer" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ExpressionAsChannel">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="channel" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ExpressionAsMachine">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="machine" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ExpressionAsPort">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="port" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+  </eSubpackages>
+  <eSubpackages name="statement" nsURI="http://www.eclipse.org/efm/FormalML/Statement"
+      nsPrefix="Statement">
+    <eClassifiers xsi:type="ecore:EClass" name="Statement" abstract="true"/>
+    <eClassifiers xsi:type="ecore:EClass" name="BlockStatement" eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="statement" upperBound="-1"
+          eType="#//statement/Statement" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ExpressionStatement" eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="expression" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="AssignmentStatement" eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="expression" eType="#//expression/AssignmentExpression"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="leftHandSide" lowerBound="1"
+          eType="#//expression/LeftHandSideExpression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="rigthHandSide" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="NewfreshStatement" eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="leftValue" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="AbstractGuardStatement" abstract="true"
+        eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="condition" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="GuardStatement" eSuperTypes="#//statement/AbstractGuardStatement"/>
+    <eClassifiers xsi:type="ecore:EClass" name="TimedGuardStatement" eSuperTypes="#//statement/AbstractGuardStatement"/>
+    <eClassifiers xsi:type="ecore:EClass" name="EventGuardStatement" eSuperTypes="#//statement/AbstractGuardStatement"/>
+    <eClassifiers xsi:type="ecore:EClass" name="CheckSatGuardStatement" eSuperTypes="#//statement/AbstractGuardStatement">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="solver" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="AbstractComStatement" abstract="true"
+        eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="port" eType="#//common/NamedElement"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="route" eType="#//infrastructure/Channel"
+          resolveProxies="false"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="target" eType="#//expression/ExpressionAsMachine"
+          containment="true" resolveProxies="false"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="InputComStatement" eSuperTypes="#//statement/AbstractComStatement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="leftValue" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="OutputComStatement" eSuperTypes="#//statement/AbstractComStatement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="rigthValue" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ConditionalBlockStatement" eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="condition" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="bodyBlock" lowerBound="1"
+          eType="#//statement/BlockStatement" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="IfStatement" eSuperTypes="#//statement/ConditionalBlockStatement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="elseifStatement" upperBound="-1"
+          eType="#//statement/ConditionalBlockStatement" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="elseBlock" eType="#//statement/BlockStatement"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="WhileDoStatement" eSuperTypes="#//statement/ConditionalBlockStatement"/>
+    <eClassifiers xsi:type="ecore:EClass" name="DoWhileStatement" eSuperTypes="#//statement/ConditionalBlockStatement"/>
+    <eClassifiers xsi:type="ecore:EClass" name="ForStatement" eSuperTypes="#//statement/ConditionalBlockStatement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="init" eType="#//expression/Expression"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="iterate" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ForEachStatement" eSuperTypes="#//statement/ConditionalBlockStatement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="iterator" lowerBound="1"
+          eType="#//expression/LeftHandSideExpression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="enumeration" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="InterruptStatementKind">
+      <eLiterals name="break"/>
+      <eLiterals name="continue" value="1"/>
+      <eLiterals name="return" value="2"/>
+      <eLiterals name="exit" value="3"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="InterruptStatement" eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//statement/InterruptStatementKind"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="expr" upperBound="-1"
+          eType="#//expression/Expression" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="ActivityStatementKind">
+      <eLiterals name="init"/>
+      <eLiterals name="final" value="1"/>
+      <eLiterals name="destroy" value="2"/>
+      <eLiterals name="start" value="3"/>
+      <eLiterals name="stop" value="4"/>
+      <eLiterals name="restart" value="5"/>
+      <eLiterals name="suspend" value="6"/>
+      <eLiterals name="resume" value="7"/>
+      <eLiterals name="wait" value="8"/>
+      <eLiterals name="abort" value="9"/>
+      <eLiterals name="disable" value="10"/>
+      <eLiterals name="enable" value="11"/>
+      <eLiterals name="irun" value="12"/>
+      <eLiterals name="run" value="13"/>
+      <eLiterals name="rtc" value="14"/>
+      <eLiterals name="schedule" value="15"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="ActivityStatement" eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" lowerBound="1" eType="#//statement/ActivityStatementKind"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="machine" lowerBound="1"
+          eType="#//expression/Expression" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="tuple" eType="#//expression/TupleExpression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="InvokeStatement" eSuperTypes="#//statement/Statement">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="callProcedure" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="execRoutine" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="invokable" eType="#//common/NamedElement"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="args" eType="#//expression/TupleExpression"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="rets" upperBound="-1"
+          eType="#//infrastructure/Variable"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="expression" eType="#//expression/Expression"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="AssignmentStatementkind">
+      <eLiterals name="assign"/>
+      <eLiterals name="assign_after" value="1"/>
+      <eLiterals name="assign_ref" value="2"/>
+      <eLiterals name="assign_macro" value="3"/>
+      <eLiterals name="plus_assign" value="4"/>
+      <eLiterals name="plus_assign_after" value="5"/>
+      <eLiterals name="minus_assign" value="6"/>
+      <eLiterals name="minus_assign_after" value="7"/>
+      <eLiterals name="star_assign" value="8"/>
+      <eLiterals name="star_assign_after" value="9"/>
+      <eLiterals name="div_assign_after" value="10"/>
+      <eLiterals name="div_assign" value="11"/>
+      <eLiterals name="mod_assign_after" value="12"/>
+      <eLiterals name="mod_assign" value="13"/>
+      <eLiterals name="land_assign_after" value="14"/>
+      <eLiterals name="land_assign" value="15"/>
+      <eLiterals name="lor_assign_after" value="16"/>
+      <eLiterals name="lor_assign" value="17"/>
+      <eLiterals name="band_assign_after" value="18"/>
+      <eLiterals name="band_assign" value="19"/>
+      <eLiterals name="bor_assign_after" value="20"/>
+      <eLiterals name="bor_assign" value="21"/>
+      <eLiterals name="bxor_assign_after" value="22"/>
+      <eLiterals name="bxor_assign" value="23"/>
+      <eLiterals name="lshift_assign_after" value="24"/>
+      <eLiterals name="lshift_assign" value="25"/>
+      <eLiterals name="rshift_assign_after" value="26"/>
+      <eLiterals name="rshift_assign" value="27"/>
+      <eLiterals name="op_push" value="28"/>
+      <eLiterals name="op_assign_top" value="29"/>
+      <eLiterals name="op_pop" value="30"/>
+      <eLiterals name="incr" value="31"/>
+      <eLiterals name="decr" value="32"/>
+    </eClassifiers>
+  </eSubpackages>
+  <eSubpackages name="statemachine" nsURI="http://www.eclipse.org/efm/FormalML/Statemachine"
+      nsPrefix="Statemachine">
+    <eClassifiers xsi:type="ecore:EClass" name="Statemachine" eSuperTypes="#//infrastructure/Behavior">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="region" upperBound="-1"
+          eType="#//statemachine/Region" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Region" eSuperTypes="#//common/NamedElement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="vertex" upperBound="-1"
+          eType="#//statemachine/Vertex" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Vertex" eSuperTypes="#//common/NamedElement">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="transition" upperBound="-1"
+          eType="#//statemachine/Transition" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="moe" upperBound="-1"
+          eType="#//infrastructure/Routine" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Pseudostate" eSuperTypes="#//statemachine/Vertex">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="kind" eType="#//statemachine/PseudostateKind"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="PseudostateKind">
+      <eLiterals name="initial"/>
+      <eLiterals name="deepHistory" value="1"/>
+      <eLiterals name="shallowHistory" value="2"/>
+      <eLiterals name="join" value="3"/>
+      <eLiterals name="fork" value="4"/>
+      <eLiterals name="junction" value="5"/>
+      <eLiterals name="choice" value="6"/>
+      <eLiterals name="entryPoint" value="7"/>
+      <eLiterals name="exitPoint" value="8"/>
+      <eLiterals name="terminate" value="9"/>
+      <eLiterals name="return" value="10"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="State" eSuperTypes="#//statemachine/Vertex">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="simple" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="composite" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="orthogonal" lowerBound="1"
+          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="region" upperBound="-1"
+          eType="#//statemachine/Region" containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="FinalState" eSuperTypes="#//statemachine/State"/>
+    <eClassifiers xsi:type="ecore:EClass" name="StartState" eSuperTypes="#//statemachine/State"/>
+    <eClassifiers xsi:type="ecore:EClass" name="Transition" eSuperTypes="#//common/NamedElement">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="transient" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="moe" eType="#//statemachine/TransitionMoe"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="target" eType="#//common/NamedElement"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="behavior" eType="#//statement/BlockStatement"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="trigger" upperBound="-1"
+          eType="#//statement/InputComStatement" containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="guard" eType="#//statement/AbstractGuardStatement"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="tguard" eType="#//statement/TimedGuardStatement"
+          containment="true"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="effect" eType="#//statement/Statement"
+          containment="true"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="TransitionMoe">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="moc" eType="#//statemachine/TransitionMoc"
+          defaultValueLiteral="simple"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="isElse" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
+          defaultValueLiteral="false"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="prior" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
+          defaultValueLiteral="0"/>
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="proba" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloat"
+          defaultValueLiteral="1.0"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EEnum" name="TransitionMoc">
+      <eLiterals name="simple"/>
+      <eLiterals name="abort" value="1"/>
+      <eLiterals name="final" value="2"/>
+    </eClassifiers>
+  </eSubpackages>
+</ecore:EPackage>
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.genmodel b/editor/xlia/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.genmodel
new file mode 100644
index 0000000..e71724b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.genmodel
@@ -0,0 +1,708 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2016 CEA LIST.&#xD;&#xA;&#xD;&#xA;All rights reserved. This program and the accompanying materials&#xD;&#xA;are made available under the terms of the Eclipse Public License v1.0&#xD;&#xA;which accompanies this distribution, and is available at&#xD;&#xA;http://www.eclipse.org/legal/epl-v10.html&#xD;&#xA;&#xD;&#xA;Contributors:&#xD;&#xA; Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr&#xD;&#xA; - Initial API and Implementation"
+    modelDirectory="/org.eclipse.efm.formalml.ecore/src-gen" creationIcons="false"
+    editDirectory="/org.eclipse.efm.formalml.ecore.edit/src-gen" editorDirectory="/org.eclipse.efm.formalml.ecore.editor/src-gen"
+    modelPluginID="org.eclipse.efm.formalml.ecore" modelName="FormalML" editPluginClass="org.eclipse.efm.formalml.ecore.provider.FormalMLEditPlugin"
+    rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container" testsDirectory="/org.eclipse.efm.formalml.ecore.tests/emf-gen"
+    testSuiteClass="org.eclipse.efm.formalml.ecore.tests.FormalMLAllTests" importerID="org.eclipse.emf.importer.ecore"
+    complianceLevel="8.0" copyrightFields="false" operationReflection="true" importOrganizing="true">
+  <foreignModel>formalml.ecore</foreignModel>
+  <genPackages prefix="Formalml" basePackage="org.eclipse.efm.ecore" disposableProviderFactory="true"
+      ecorePackage="formalml.ecore#/">
+    <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//XliaModelKind">
+      <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//XliaModelKind/system"/>
+      <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//XliaModelKind/package"/>
+    </genEnums>
+    <genClasses ecoreClass="formalml.ecore#//XliaModel">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//XliaModel/prolog"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//XliaModel/system"/>
+    </genClasses>
+    <genClasses ecoreClass="formalml.ecore#//XliaNamedElement">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//XliaNamedElement/name"/>
+    </genClasses>
+    <genClasses ecoreClass="formalml.ecore#//XliaObject">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//XliaObject/value"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//XliaObject/elements"/>
+    </genClasses>
+    <genClasses ecoreClass="formalml.ecore#//XliaAttribute">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//XliaAttribute/value"/>
+    </genClasses>
+    <nestedGenPackages prefix="Common" basePackage="org.eclipse.efm.ecore.formalml"
+        disposableProviderFactory="true" ecorePackage="formalml.ecore#//common">
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//common/VisibilityKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//common/VisibilityKind/public"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//common/VisibilityKind/private"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//common/VisibilityKind/protected"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//common/VisibilityKind/package"/>
+      </genEnums>
+      <genClasses image="false" ecoreClass="formalml.ecore#//common/AbstractElement"/>
+      <genClasses ecoreClass="formalml.ecore#//common/QualifiedName">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//common/QualifiedName/isAmbiguous"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//common/QualifiedName/pathName"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//common/QualifiedName/nameBinding"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//common/QualifiedName/unqualifiedName"/>
+      </genClasses>
+      <genClasses image="false" ecoreClass="formalml.ecore#//common/NamedElement">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//common/NamedElement/name"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//common/NamedElement/unrestrictedName"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//common/NamedElement/qualifiedName"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//common/NamedElement/visibility"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//common/Type"/>
+      <genClasses ecoreClass="formalml.ecore#//common/TypedElement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//common/TypedElement/type"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//common/ClassifierDefinition"/>
+    </nestedGenPackages>
+    <nestedGenPackages prefix="Infrastructure" basePackage="org.eclipse.efm.ecore.formalml"
+        disposableProviderFactory="true" ecorePackage="formalml.ecore#//infrastructure">
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//infrastructure/DesignKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/DesignKind/model"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/DesignKind/instance"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/DesignKind/prototype"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//infrastructure/ChannelDirection">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ChannelDirection/input"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ChannelDirection/inout"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ChannelDirection/output"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//infrastructure/ParameterDirectionKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ParameterDirectionKind/in"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ParameterDirectionKind/inout"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ParameterDirectionKind/out"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ParameterDirectionKind/return"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//infrastructure/ComProtocolKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComProtocolKind/none"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComProtocolKind/env"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComProtocolKind/buffer"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComProtocolKind/rdv"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComProtocolKind/multi_rdv"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//infrastructure/ComCastKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComCastKind/none"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComCastKind/unicast"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComCastKind/anycast"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComCastKind/multicast"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//infrastructure/ComCastKind/broadcast"/>
+      </genEnums>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Machine">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Machine/input_enabled"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Machine/timed"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Machine/design"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/machine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/typedef"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/property"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/channel"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/port"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/signal"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/buffer"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/routine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/procedure"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/instance"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/behavior"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Machine/main"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/System"/>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Modifier">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Modifier/static"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Modifier/final"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Modifier/reference"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Modifier/volatile"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Modifier/transient"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/PropertyDefinition">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/PropertyDefinition/modifier"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/PropertyDefinition/defaultValue"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Variable">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Variable/const"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Variable/macro"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Variable/onWriteAction"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Buffer"/>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Port">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Port/direction"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Port/signal"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Port/parameter"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Channel">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Channel/direction"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Channel/machine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Channel/port"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Channel/signal"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Signal">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Signal/direction"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Signal/parameter"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Procedure"/>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Routine">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Routine/parameter"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Routine/bodyBlock"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Routine/domain"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Routine/codomain"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/InstanceMachine">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/InstanceMachine/modifier"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/InstanceMachine/model"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/InstanceMachine/arg"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/InstanceMachine/slot"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/SlotProperty">
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/SlotProperty/xliaProperty"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/SlotProperty/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Parameter">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Parameter/direction"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/ParameterSet">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ParameterSet/parameter"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Behavior">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Behavior/parameter"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Behavior/computation"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Behavior/execution"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Behavior/interaction"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/ModelOfComputation"/>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/ModelOfExecution">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfExecution/initRoutine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfExecution/finalRoutine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfExecution/enableRoutine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfExecution/disableRoutine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfExecution/concurrencyRoutine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfExecution/scheduleRoutine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfExecution/irunRoutine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfExecution/runRoutine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfExecution/routine"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/ModelOfInteraction">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfInteraction/routes"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ModelOfInteraction/connections"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/ComProtocol">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/ComProtocol/protocol"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/ComProtocol/cast"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ComProtocol/inner_buffer"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ComProtocol/ref_buffer"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Route">
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Route/signals"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Route/protocol"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/Connection">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Connection/protocol"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/Connection/cast"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/Connection/comPoints"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//infrastructure/ComPoint">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//infrastructure/ComPoint/direction"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ComPoint/protocol"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ComPoint/point"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//infrastructure/ComPoint/points"/>
+      </genClasses>
+    </nestedGenPackages>
+    <nestedGenPackages prefix="Datatype" basePackage="org.eclipse.efm.ecore.formalml"
+        disposableProviderFactory="true" ecorePackage="formalml.ecore#//datatype">
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//datatype/PrimitiveTypeKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/boolean"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/int"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/integer"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/rat"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/rational"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/float"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/double"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/real"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/time"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/uint"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/uinteger"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/urat"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/urational"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/ufloat"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/udouble"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/ureal"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/char"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/string"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/buffer"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/message"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/port"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveTypeKind/machine"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//datatype/CollectionKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/CollectionKind/vector"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/CollectionKind/rvector"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/CollectionKind/list"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/CollectionKind/set"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/CollectionKind/bag"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/CollectionKind/fifo"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/CollectionKind/lifo"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//datatype/PrimitiveNumberSign">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveNumberSign/any"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveNumberSign/negative"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveNumberSign/negative_strict"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveNumberSign/positive"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveNumberSign/positive_strict"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//datatype/PrimitiveInstanceKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveInstanceKind/buffer"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveInstanceKind/message"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveInstanceKind/port"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveInstanceKind/signal"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveInstanceKind/com_point"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveInstanceKind/channel"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveInstanceKind/machine"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//datatype/PrimitiveInstanceKind/vertex"/>
+      </genEnums>
+      <genClasses image="false" ecoreClass="formalml.ecore#//datatype/DataType">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/DataType/kind"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/DataType/typedef"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/DataType/multiplicity"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/DataType/defaultValue"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//datatype/DataTypeReference">
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//datatype/DataTypeReference/typeref"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/DataTypeReference/support"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//datatype/EnumerationLiteral">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/EnumerationLiteral/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//datatype/EnumerationType">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/EnumerationType/literal"/>
+      </genClasses>
+      <genClasses image="false" ecoreClass="formalml.ecore#//datatype/DataStructuredType">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/DataStructuredType/property"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//datatype/StructureType"/>
+      <genClasses ecoreClass="formalml.ecore#//datatype/UnionType"/>
+      <genClasses ecoreClass="formalml.ecore#//datatype/ChoiceType"/>
+      <genClasses image="false" ecoreClass="formalml.ecore#//datatype/DataSupportedType">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/DataSupportedType/support"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//datatype/IntervalType">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/IntervalType/lopen"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/IntervalType/ropen"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/IntervalType/infimum"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/IntervalType/supremum"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//datatype/CollectionType">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/CollectionType/container"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/CollectionType/size"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/CollectionType/unbounded"/>
+      </genClasses>
+      <genClasses image="false" ecoreClass="formalml.ecore#//datatype/PrimitiveType"/>
+      <genClasses ecoreClass="formalml.ecore#//datatype/PrimitiveBooleanType"/>
+      <genClasses image="false" ecoreClass="formalml.ecore#//datatype/PrimitiveNumberType">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/PrimitiveNumberType/sign"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/PrimitiveNumberType/size"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//datatype/PrimitiveIntegerType"/>
+      <genClasses ecoreClass="formalml.ecore#//datatype/PrimitiveRationalType"/>
+      <genClasses ecoreClass="formalml.ecore#//datatype/PrimitiveFloatType"/>
+      <genClasses ecoreClass="formalml.ecore#//datatype/PrimitiveRealType"/>
+      <genClasses ecoreClass="formalml.ecore#//datatype/PrimitiveTimeType">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/PrimitiveTimeType/clock"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//datatype/PrimitiveTimeType/support"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//datatype/PrimitiveCharacterType"/>
+      <genClasses ecoreClass="formalml.ecore#//datatype/PrimitiveStringType">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/PrimitiveStringType/size"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//datatype/PrimitiveInstanceType">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//datatype/PrimitiveInstanceType/expected"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//datatype/PrimitiveInstanceType/model"/>
+      </genClasses>
+    </nestedGenPackages>
+    <nestedGenPackages prefix="Expression" basePackage="org.eclipse.efm.ecore.formalml"
+        disposableProviderFactory="true" ecorePackage="formalml.ecore#//expression">
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//expression/PRINTER_FIX">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/PRINTER_FIX/infix"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/PRINTER_FIX/prefix"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/PRINTER_FIX/suffix"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/PRINTER_FIX/functional"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/PRINTER_FIX/specific"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//expression/ValueElementSpecificationKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationKind/field"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationKind/index"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationKind/parameter"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//expression/ValueElementSpecificationScheme">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/any"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/variable"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/message"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/signal"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/buffer"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/channel"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/port"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/com_point"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/instance"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/machine"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/model"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/procedure"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/routine"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//expression/ValueElementSpecificationScheme/vertex"/>
+      </genEnums>
+      <genClasses image="false" ecoreClass="formalml.ecore#//expression/ValueExpressionPrettyPrinter">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/ValueExpressionPrettyPrinter/symbol"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/ValueExpressionPrettyPrinter/fix"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/ValueExpressionPrettyPrinter/specific"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/ValuePrintableExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/ValuePrintableExpression/symbol"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ValuePrintableExpression/printer"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ValuePrintableExpression/operand"/>
+      </genClasses>
+      <genClasses image="false" ecoreClass="formalml.ecore#//expression/Expression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralBooleanExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/LiteralBooleanExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralIntegerExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/LiteralIntegerExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralRationalExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/LiteralRationalExpression/numerator"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/LiteralRationalExpression/denominator"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralFloatExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/LiteralFloatExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralRealExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/LiteralRealExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralCharacterExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/LiteralCharacterExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralStringExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/LiteralStringExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralCollectionExpression">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/LiteralCollectionExpression/datatype"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/LiteralCollectionExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralNullExpression">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/LiteralNullExpression/type"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralReferenceExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralReferenceElement">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/LiteralReferenceElement/kind"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//expression/LiteralReferenceElement/value"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/LiteralReferenceElement/arg"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralThisExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralSelfExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralParentExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralSuperExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralSystemExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralEnvExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralTimeExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LiteralTimeDeltaExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LeftHandSideExpression">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/LeftHandSideExpression/lvalue"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/IncrementOrDecrementExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/IncrementOrDecrementExpression/operator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/IncrementOrDecrementExpression/leftHandSide"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/IncrementOrDecrementPrefixExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/IncrementOrDecrementPostfixExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/AssignmentExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/AssignmentExpression/operator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/AssignmentExpression/leftHandSide"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/AssignmentExpression/rigthHandSide"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/NewfreshExpression">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/NewfreshExpression/leftHandSide"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/UnaryExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/UnaryExpression/operator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/UnaryExpression/operand"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/BitwiseUnaryExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LogicalUnaryExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/CastExpression">
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//expression/CastExpression/datatype"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/ArithmeticUnaryExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/BinaryExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/BinaryExpression/operator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/BinaryExpression/leftOperand"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/BinaryExpression/rigthOperand"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/EqualityBinaryExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/RelationalBinaryExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/RelationalTernaryExpression">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/RelationalTernaryExpression/leftRelation"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/RelationalTernaryExpression/rigthOperator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/RelationalTernaryExpression/rigthOperand"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/ConditionalTestExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/ConditionalTestExpression/operator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ConditionalTestExpression/condition"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ConditionalTestExpression/thenOperand"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ConditionalTestExpression/elseOperand"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/AssociativeExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/AssociativeExpression/operator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/AssociativeExpression/operand"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/ArithmeticAssociativeExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/BitwiseAssociativeExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/LogicalAssociativeExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/InvokeExpression">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/InvokeExpression/callProcedure"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/InvokeExpression/invoke"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/InvokeExpression/args"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/InvokeExpression/rets"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/NamedExpression">
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//expression/NamedExpression/target"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/NamedExpression/name"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/NamedExpression/expression"/>
+      </genClasses>
+      <genClasses image="false" ecoreClass="formalml.ecore#//expression/TupleExpression"/>
+      <genClasses ecoreClass="formalml.ecore#//expression/MixTupleExpression">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/MixTupleExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/NamedTupleExpression">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/NamedTupleExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/PositionalTupleExpression">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/PositionalTupleExpression/value"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/ValueElementSpecification">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/ValueElementSpecification/kind"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//expression/ValueElementSpecification/expected"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ValueElementSpecification/target"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//expression/ValueElementSpecification/element"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ValueElementSpecification/arg"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/InstantiationExpression">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/InstantiationExpression/instance"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/ExpressionAsBuffer">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ExpressionAsBuffer/buffer"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/ExpressionAsChannel">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ExpressionAsChannel/channel"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/ExpressionAsMachine">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ExpressionAsMachine/machine"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//expression/ExpressionAsPort">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//expression/ExpressionAsPort/port"/>
+      </genClasses>
+    </nestedGenPackages>
+    <nestedGenPackages prefix="Statement" basePackage="org.eclipse.efm.ecore.formalml"
+        disposableProviderFactory="true" ecorePackage="formalml.ecore#//statement">
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//statement/InterruptStatementKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/InterruptStatementKind/break"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/InterruptStatementKind/continue"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/InterruptStatementKind/return"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/InterruptStatementKind/exit"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//statement/ActivityStatementKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/init"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/final"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/destroy"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/start"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/stop"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/restart"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/suspend"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/resume"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/wait"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/abort"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/disable"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/enable"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/irun"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/run"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/rtc"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/ActivityStatementKind/schedule"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//statement/AssignmentStatementkind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/assign_ref"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/assign_macro"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/plus_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/plus_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/minus_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/minus_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/star_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/star_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/div_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/div_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/mod_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/mod_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/land_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/land_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/lor_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/lor_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/band_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/band_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/bor_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/bor_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/bxor_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/bxor_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/lshift_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/lshift_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/rshift_assign_after"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/rshift_assign"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/op_push"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/op_assign_top"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/op_pop"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/incr"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statement/AssignmentStatementkind/decr"/>
+      </genEnums>
+      <genClasses image="false" ecoreClass="formalml.ecore#//statement/Statement"/>
+      <genClasses ecoreClass="formalml.ecore#//statement/BlockStatement">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statement/BlockStatement/op"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/BlockStatement/statement"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/ExpressionStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/ExpressionStatement/expression"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/AssignmentStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/AssignmentStatement/expression"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statement/AssignmentStatement/operator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/AssignmentStatement/leftHandSide"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/AssignmentStatement/rigthHandSide"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/NewfreshStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/NewfreshStatement/leftValue"/>
+      </genClasses>
+      <genClasses image="false" ecoreClass="formalml.ecore#//statement/AbstractGuardStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/AbstractGuardStatement/condition"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/GuardStatement"/>
+      <genClasses ecoreClass="formalml.ecore#//statement/TimedGuardStatement"/>
+      <genClasses ecoreClass="formalml.ecore#//statement/EventGuardStatement"/>
+      <genClasses ecoreClass="formalml.ecore#//statement/CheckSatGuardStatement">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statement/CheckSatGuardStatement/solver"/>
+      </genClasses>
+      <genClasses image="false" ecoreClass="formalml.ecore#//statement/AbstractComStatement">
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//statement/AbstractComStatement/port"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//statement/AbstractComStatement/route"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/AbstractComStatement/target"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/InputComStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/InputComStatement/leftValue"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/OutputComStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/OutputComStatement/rigthValue"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/ConditionalBlockStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/ConditionalBlockStatement/condition"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/ConditionalBlockStatement/bodyBlock"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/IfStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/IfStatement/elseifStatement"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/IfStatement/elseBlock"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/WhileDoStatement"/>
+      <genClasses ecoreClass="formalml.ecore#//statement/DoWhileStatement"/>
+      <genClasses ecoreClass="formalml.ecore#//statement/ForStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/ForStatement/init"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/ForStatement/iterate"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/ForEachStatement">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/ForEachStatement/iterator"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/ForEachStatement/enumeration"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/InterruptStatement">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statement/InterruptStatement/kind"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/InterruptStatement/expr"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/ActivityStatement">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statement/ActivityStatement/op"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/ActivityStatement/machine"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/ActivityStatement/tuple"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statement/InvokeStatement">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statement/InvokeStatement/callProcedure"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statement/InvokeStatement/execRoutine"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//statement/InvokeStatement/invokable"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/InvokeStatement/args"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//statement/InvokeStatement/rets"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statement/InvokeStatement/expression"/>
+      </genClasses>
+    </nestedGenPackages>
+    <nestedGenPackages prefix="Statemachine" basePackage="org.eclipse.efm.ecore.formalml"
+        disposableProviderFactory="true" ecorePackage="formalml.ecore#//statemachine">
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//statemachine/PseudostateKind">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/initial"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/deepHistory"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/shallowHistory"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/join"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/fork"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/junction"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/choice"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/entryPoint"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/exitPoint"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/terminate"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/PseudostateKind/return"/>
+      </genEnums>
+      <genEnums typeSafeEnumCompatible="false" ecoreEnum="formalml.ecore#//statemachine/TransitionMoc">
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/TransitionMoc/simple"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/TransitionMoc/abort"/>
+        <genEnumLiterals ecoreEnumLiteral="formalml.ecore#//statemachine/TransitionMoc/final"/>
+      </genEnums>
+      <genClasses ecoreClass="formalml.ecore#//statemachine/Statemachine">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Statemachine/region"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statemachine/Region">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Region/vertex"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statemachine/Vertex">
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Vertex/transition"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Vertex/moe"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statemachine/Pseudostate">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statemachine/Pseudostate/kind"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statemachine/State">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statemachine/State/simple"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statemachine/State/composite"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statemachine/State/orthogonal"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/State/region"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statemachine/FinalState"/>
+      <genClasses ecoreClass="formalml.ecore#//statemachine/StartState"/>
+      <genClasses ecoreClass="formalml.ecore#//statemachine/Transition">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statemachine/Transition/transient"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Transition/moe"/>
+        <genFeatures notify="false" createChild="false" propertySortChoices="true"
+            ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Transition/target"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Transition/behavior"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Transition/trigger"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Transition/guard"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Transition/tguard"/>
+        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference formalml.ecore#//statemachine/Transition/effect"/>
+      </genClasses>
+      <genClasses ecoreClass="formalml.ecore#//statemachine/TransitionMoe">
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statemachine/TransitionMoe/moc"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statemachine/TransitionMoe/isElse"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statemachine/TransitionMoe/prior"/>
+        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute formalml.ecore#//statemachine/TransitionMoe/proba"/>
+      </genClasses>
+    </nestedGenPackages>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/resources/text/description.txt b/editor/xlia/org.eclipse.efm.formalml.ecore/resources/text/description.txt
new file mode 100644
index 0000000..7574bf1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/resources/text/description.txt
@@ -0,0 +1,26 @@
+Model FormalML
+
+This model description is not a real EMF artifact. It was generated by the
+org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's
+code generator can be extended.
+This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+
+Package formalml <http://www.eclipse.org/efm/FormalML>
+
+  Class XliaModel
+    Reference prolog : XliaObject<<1..1>>
+    Reference system : System<<1..1>>
+
+  Class XliaNamedElement
+    Attribute name : EString
+
+  Class XliaObject -> XliaNamedElement
+    Reference value : Expression<<1..1>>
+    Reference elements : XliaNamedElement<<0..*>>
+
+  Class XliaAttribute -> XliaNamedElement
+    Reference value : Expression
+
+  Enum XliaModelKind
+    Literal system = 0
+    Literal package = 1
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/FormalmlFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/FormalmlFactory.java
new file mode 100644
index 0000000..841b329
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/FormalmlFactory.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.FormalmlPackage
+ * @generated
+ */
+public interface FormalmlFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	FormalmlFactory eINSTANCE = org.eclipse.efm.ecore.formalml.impl.FormalmlFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Xlia Model</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Xlia Model</em>'.
+	 * @generated
+	 */
+	XliaModel createXliaModel();
+
+	/**
+	 * Returns a new object of class '<em>Xlia Named Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Xlia Named Element</em>'.
+	 * @generated
+	 */
+	XliaNamedElement createXliaNamedElement();
+
+	/**
+	 * Returns a new object of class '<em>Xlia Object</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Xlia Object</em>'.
+	 * @generated
+	 */
+	XliaObject createXliaObject();
+
+	/**
+	 * Returns a new object of class '<em>Xlia Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Xlia Attribute</em>'.
+	 * @generated
+	 */
+	XliaAttribute createXliaAttribute();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	FormalmlPackage getFormalmlPackage();
+
+} //FormalmlFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/FormalmlPackage.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/FormalmlPackage.java
new file mode 100644
index 0000000..33adeaf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/FormalmlPackage.java
@@ -0,0 +1,505 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.FormalmlFactory
+ * @model kind="package"
+ *        annotation="http://www.eclipse.org/OCL/Import ecore='http://www.eclipse.org/emf/2002/Ecore'"
+ * @generated
+ */
+public interface FormalmlPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "formalml";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efm/FormalML";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "FormalML";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	FormalmlPackage eINSTANCE = org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.impl.XliaModelImpl <em>Xlia Model</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.impl.XliaModelImpl
+	 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaModel()
+	 * @generated
+	 */
+	int XLIA_MODEL = 0;
+
+	/**
+	 * The feature id for the '<em><b>Prolog</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_MODEL__PROLOG = 0;
+
+	/**
+	 * The feature id for the '<em><b>System</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_MODEL__SYSTEM = 1;
+
+	/**
+	 * The number of structural features of the '<em>Xlia Model</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_MODEL_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Xlia Model</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_MODEL_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.impl.XliaNamedElementImpl <em>Xlia Named Element</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.impl.XliaNamedElementImpl
+	 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaNamedElement()
+	 * @generated
+	 */
+	int XLIA_NAMED_ELEMENT = 1;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_NAMED_ELEMENT__NAME = 0;
+
+	/**
+	 * The number of structural features of the '<em>Xlia Named Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_NAMED_ELEMENT_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Xlia Named Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_NAMED_ELEMENT_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.impl.XliaObjectImpl <em>Xlia Object</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.impl.XliaObjectImpl
+	 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaObject()
+	 * @generated
+	 */
+	int XLIA_OBJECT = 2;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_OBJECT__NAME = XLIA_NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_OBJECT__VALUE = XLIA_NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Elements</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_OBJECT__ELEMENTS = XLIA_NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Xlia Object</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_OBJECT_FEATURE_COUNT = XLIA_NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Xlia Object</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_OBJECT_OPERATION_COUNT = XLIA_NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.impl.XliaAttributeImpl <em>Xlia Attribute</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.impl.XliaAttributeImpl
+	 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaAttribute()
+	 * @generated
+	 */
+	int XLIA_ATTRIBUTE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_ATTRIBUTE__NAME = XLIA_NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_ATTRIBUTE__VALUE = XLIA_NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Xlia Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_ATTRIBUTE_FEATURE_COUNT = XLIA_NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Xlia Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int XLIA_ATTRIBUTE_OPERATION_COUNT = XLIA_NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.XliaModelKind <em>Xlia Model Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.XliaModelKind
+	 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaModelKind()
+	 * @generated
+	 */
+	int XLIA_MODEL_KIND = 4;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.XliaModel <em>Xlia Model</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Xlia Model</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaModel
+	 * @generated
+	 */
+	EClass getXliaModel();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.XliaModel#getProlog <em>Prolog</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Prolog</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaModel#getProlog()
+	 * @see #getXliaModel()
+	 * @generated
+	 */
+	EReference getXliaModel_Prolog();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.XliaModel#getSystem <em>System</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>System</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaModel#getSystem()
+	 * @see #getXliaModel()
+	 * @generated
+	 */
+	EReference getXliaModel_System();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.XliaNamedElement <em>Xlia Named Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Xlia Named Element</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaNamedElement
+	 * @generated
+	 */
+	EClass getXliaNamedElement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.XliaNamedElement#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaNamedElement#getName()
+	 * @see #getXliaNamedElement()
+	 * @generated
+	 */
+	EAttribute getXliaNamedElement_Name();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.XliaObject <em>Xlia Object</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Xlia Object</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaObject
+	 * @generated
+	 */
+	EClass getXliaObject();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.XliaObject#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaObject#getValue()
+	 * @see #getXliaObject()
+	 * @generated
+	 */
+	EReference getXliaObject_Value();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.XliaObject#getElements <em>Elements</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Elements</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaObject#getElements()
+	 * @see #getXliaObject()
+	 * @generated
+	 */
+	EReference getXliaObject_Elements();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.XliaAttribute <em>Xlia Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Xlia Attribute</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaAttribute
+	 * @generated
+	 */
+	EClass getXliaAttribute();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.XliaAttribute#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaAttribute#getValue()
+	 * @see #getXliaAttribute()
+	 * @generated
+	 */
+	EReference getXliaAttribute_Value();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.XliaModelKind <em>Xlia Model Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Xlia Model Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.XliaModelKind
+	 * @generated
+	 */
+	EEnum getXliaModelKind();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	FormalmlFactory getFormalmlFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.impl.XliaModelImpl <em>Xlia Model</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.impl.XliaModelImpl
+		 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaModel()
+		 * @generated
+		 */
+		EClass XLIA_MODEL = eINSTANCE.getXliaModel();
+
+		/**
+		 * The meta object literal for the '<em><b>Prolog</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference XLIA_MODEL__PROLOG = eINSTANCE.getXliaModel_Prolog();
+
+		/**
+		 * The meta object literal for the '<em><b>System</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference XLIA_MODEL__SYSTEM = eINSTANCE.getXliaModel_System();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.impl.XliaNamedElementImpl <em>Xlia Named Element</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.impl.XliaNamedElementImpl
+		 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaNamedElement()
+		 * @generated
+		 */
+		EClass XLIA_NAMED_ELEMENT = eINSTANCE.getXliaNamedElement();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute XLIA_NAMED_ELEMENT__NAME = eINSTANCE.getXliaNamedElement_Name();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.impl.XliaObjectImpl <em>Xlia Object</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.impl.XliaObjectImpl
+		 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaObject()
+		 * @generated
+		 */
+		EClass XLIA_OBJECT = eINSTANCE.getXliaObject();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference XLIA_OBJECT__VALUE = eINSTANCE.getXliaObject_Value();
+
+		/**
+		 * The meta object literal for the '<em><b>Elements</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference XLIA_OBJECT__ELEMENTS = eINSTANCE.getXliaObject_Elements();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.impl.XliaAttributeImpl <em>Xlia Attribute</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.impl.XliaAttributeImpl
+		 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaAttribute()
+		 * @generated
+		 */
+		EClass XLIA_ATTRIBUTE = eINSTANCE.getXliaAttribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference XLIA_ATTRIBUTE__VALUE = eINSTANCE.getXliaAttribute_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.XliaModelKind <em>Xlia Model Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.XliaModelKind
+		 * @see org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl#getXliaModelKind()
+		 * @generated
+		 */
+		EEnum XLIA_MODEL_KIND = eINSTANCE.getXliaModelKind();
+
+	}
+
+} //FormalmlPackage
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaAttribute.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaAttribute.java
new file mode 100644
index 0000000..13f39e3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaAttribute.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Xlia Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.XliaAttribute#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaAttribute()
+ * @model
+ * @generated
+ */
+public interface XliaAttribute extends XliaNamedElement {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' containment reference.
+	 * @see #setValue(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaAttribute_Value()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.XliaAttribute#getValue <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' containment reference.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(Expression value);
+
+} // XliaAttribute
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaModel.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaModel.java
new file mode 100644
index 0000000..559df26
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaModel.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Xlia Model</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.XliaModel#getProlog <em>Prolog</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.XliaModel#getSystem <em>System</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaModel()
+ * @model
+ * @generated
+ */
+public interface XliaModel extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Prolog</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Prolog</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Prolog</em>' containment reference.
+	 * @see #setProlog(XliaObject)
+	 * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaModel_Prolog()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	XliaObject getProlog();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.XliaModel#getProlog <em>Prolog</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Prolog</em>' containment reference.
+	 * @see #getProlog()
+	 * @generated
+	 */
+	void setProlog(XliaObject value);
+
+	/**
+	 * Returns the value of the '<em><b>System</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>System</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>System</em>' containment reference.
+	 * @see #setSystem(org.eclipse.efm.ecore.formalml.infrastructure.System)
+	 * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaModel_System()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	org.eclipse.efm.ecore.formalml.infrastructure.System getSystem();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.XliaModel#getSystem <em>System</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>System</em>' containment reference.
+	 * @see #getSystem()
+	 * @generated
+	 */
+	void setSystem(org.eclipse.efm.ecore.formalml.infrastructure.System value);
+
+} // XliaModel
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaModelKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaModelKind.java
new file mode 100644
index 0000000..19fcbda
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaModelKind.java
@@ -0,0 +1,224 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Xlia Model Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaModelKind()
+ * @model
+ * @generated
+ */
+public enum XliaModelKind implements Enumerator {
+	/**
+	 * The '<em><b>System</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SYSTEM_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SYSTEM(0, "system", "system"),
+
+	/**
+	 * The '<em><b>Package</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PACKAGE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PACKAGE(1, "package", "package");
+
+	/**
+	 * The '<em><b>System</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>System</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SYSTEM
+	 * @model name="system"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SYSTEM_VALUE = 0;
+
+	/**
+	 * The '<em><b>Package</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Package</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PACKAGE
+	 * @model name="package"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PACKAGE_VALUE = 1;
+
+	/**
+	 * An array of all the '<em><b>Xlia Model Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final XliaModelKind[] VALUES_ARRAY =
+		new XliaModelKind[] {
+			SYSTEM,
+			PACKAGE,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Xlia Model Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<XliaModelKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Xlia Model Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static XliaModelKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			XliaModelKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Xlia Model Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static XliaModelKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			XliaModelKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Xlia Model Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static XliaModelKind get(int value) {
+		switch (value) {
+			case SYSTEM_VALUE: return SYSTEM;
+			case PACKAGE_VALUE: return PACKAGE;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private XliaModelKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //XliaModelKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaNamedElement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaNamedElement.java
new file mode 100644
index 0000000..b36c742
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaNamedElement.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Xlia Named Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.XliaNamedElement#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaNamedElement()
+ * @model
+ * @generated
+ */
+public interface XliaNamedElement extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * The default value is <code>"1.0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaNamedElement_Name()
+	 * @model default="1.0"
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.XliaNamedElement#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+} // XliaNamedElement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaObject.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaObject.java
new file mode 100644
index 0000000..13f6a27
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/XliaObject.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Xlia Object</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.XliaObject#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.XliaObject#getElements <em>Elements</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaObject()
+ * @model
+ * @generated
+ */
+public interface XliaObject extends XliaNamedElement {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' containment reference.
+	 * @see #setValue(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaObject_Value()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.XliaObject#getValue <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' containment reference.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Elements</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.XliaNamedElement}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Elements</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Elements</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#getXliaObject_Elements()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<XliaNamedElement> getElements();
+
+} // XliaObject
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/AbstractElement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/AbstractElement.java
new file mode 100644
index 0000000..39cf75d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/AbstractElement.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Abstract Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getAbstractElement()
+ * @model abstract="true"
+ * @generated
+ */
+public interface AbstractElement extends EObject {
+} // AbstractElement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/ClassifierDefinition.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/ClassifierDefinition.java
new file mode 100644
index 0000000..a92a5b2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/ClassifierDefinition.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Classifier Definition</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getClassifierDefinition()
+ * @model
+ * @generated
+ */
+public interface ClassifierDefinition extends Type {
+} // ClassifierDefinition
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/CommonFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/CommonFactory.java
new file mode 100644
index 0000000..be6f882
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/CommonFactory.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage
+ * @generated
+ */
+public interface CommonFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	CommonFactory eINSTANCE = org.eclipse.efm.ecore.formalml.common.impl.CommonFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Qualified Name</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Qualified Name</em>'.
+	 * @generated
+	 */
+	QualifiedName createQualifiedName();
+
+	/**
+	 * Returns a new object of class '<em>Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Type</em>'.
+	 * @generated
+	 */
+	Type createType();
+
+	/**
+	 * Returns a new object of class '<em>Typed Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Typed Element</em>'.
+	 * @generated
+	 */
+	TypedElement createTypedElement();
+
+	/**
+	 * Returns a new object of class '<em>Classifier Definition</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Classifier Definition</em>'.
+	 * @generated
+	 */
+	ClassifierDefinition createClassifierDefinition();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	CommonPackage getCommonPackage();
+
+} //CommonFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/CommonPackage.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/CommonPackage.java
new file mode 100644
index 0000000..6d692d6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/CommonPackage.java
@@ -0,0 +1,774 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.common.CommonFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface CommonPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "common";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efm/FormalML/Common";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "Common";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	CommonPackage eINSTANCE = org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.common.impl.AbstractElementImpl <em>Abstract Element</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.AbstractElementImpl
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getAbstractElement()
+	 * @generated
+	 */
+	int ABSTRACT_ELEMENT = 0;
+
+	/**
+	 * The number of structural features of the '<em>Abstract Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_ELEMENT_FEATURE_COUNT = 0;
+
+	/**
+	 * The number of operations of the '<em>Abstract Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_ELEMENT_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.common.impl.QualifiedNameImpl <em>Qualified Name</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.QualifiedNameImpl
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getQualifiedName()
+	 * @generated
+	 */
+	int QUALIFIED_NAME = 1;
+
+	/**
+	 * The feature id for the '<em><b>Is Ambiguous</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int QUALIFIED_NAME__IS_AMBIGUOUS = ABSTRACT_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Path Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int QUALIFIED_NAME__PATH_NAME = ABSTRACT_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Name Binding</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int QUALIFIED_NAME__NAME_BINDING = ABSTRACT_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Unqualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int QUALIFIED_NAME__UNQUALIFIED_NAME = ABSTRACT_ELEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Qualified Name</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int QUALIFIED_NAME_FEATURE_COUNT = ABSTRACT_ELEMENT_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Qualified Name</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int QUALIFIED_NAME_OPERATION_COUNT = ABSTRACT_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl <em>Named Element</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getNamedElement()
+	 * @generated
+	 */
+	int NAMED_ELEMENT = 2;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_ELEMENT__NAME = ABSTRACT_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_ELEMENT__UNRESTRICTED_NAME = ABSTRACT_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_ELEMENT__QUALIFIED_NAME = ABSTRACT_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_ELEMENT__VISIBILITY = ABSTRACT_ELEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Named Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_ELEMENT_FEATURE_COUNT = ABSTRACT_ELEMENT_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Named Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_ELEMENT_OPERATION_COUNT = ABSTRACT_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.common.impl.TypeImpl <em>Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.TypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getType()
+	 * @generated
+	 */
+	int TYPE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE__NAME = NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE__UNRESTRICTED_NAME = NAMED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE__QUALIFIED_NAME = NAMED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE__VISIBILITY = NAMED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The number of structural features of the '<em>Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE_OPERATION_COUNT = NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.common.impl.TypedElementImpl <em>Typed Element</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.TypedElementImpl
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getTypedElement()
+	 * @generated
+	 */
+	int TYPED_ELEMENT = 4;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPED_ELEMENT__NAME = NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPED_ELEMENT__UNRESTRICTED_NAME = NAMED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPED_ELEMENT__QUALIFIED_NAME = NAMED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPED_ELEMENT__VISIBILITY = NAMED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPED_ELEMENT__TYPE = NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Typed Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPED_ELEMENT_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Typed Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPED_ELEMENT_OPERATION_COUNT = NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.common.impl.ClassifierDefinitionImpl <em>Classifier Definition</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.ClassifierDefinitionImpl
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getClassifierDefinition()
+	 * @generated
+	 */
+	int CLASSIFIER_DEFINITION = 5;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CLASSIFIER_DEFINITION__NAME = TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CLASSIFIER_DEFINITION__UNRESTRICTED_NAME = TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CLASSIFIER_DEFINITION__QUALIFIED_NAME = TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CLASSIFIER_DEFINITION__VISIBILITY = TYPE__VISIBILITY;
+
+	/**
+	 * The number of structural features of the '<em>Classifier Definition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CLASSIFIER_DEFINITION_FEATURE_COUNT = TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Classifier Definition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CLASSIFIER_DEFINITION_OPERATION_COUNT = TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.common.VisibilityKind <em>Visibility Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.common.VisibilityKind
+	 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getVisibilityKind()
+	 * @generated
+	 */
+	int VISIBILITY_KIND = 6;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.common.AbstractElement <em>Abstract Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Abstract Element</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.AbstractElement
+	 * @generated
+	 */
+	EClass getAbstractElement();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.common.QualifiedName <em>Qualified Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Qualified Name</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.QualifiedName
+	 * @generated
+	 */
+	EClass getQualifiedName();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getIsAmbiguous <em>Is Ambiguous</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Is Ambiguous</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.QualifiedName#getIsAmbiguous()
+	 * @see #getQualifiedName()
+	 * @generated
+	 */
+	EAttribute getQualifiedName_IsAmbiguous();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getPathName <em>Path Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Path Name</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.QualifiedName#getPathName()
+	 * @see #getQualifiedName()
+	 * @generated
+	 */
+	EAttribute getQualifiedName_PathName();
+
+	/**
+	 * Returns the meta object for the attribute list '{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getNameBinding <em>Name Binding</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute list '<em>Name Binding</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.QualifiedName#getNameBinding()
+	 * @see #getQualifiedName()
+	 * @generated
+	 */
+	EAttribute getQualifiedName_NameBinding();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getUnqualifiedName <em>Unqualified Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Unqualified Name</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.QualifiedName#getUnqualifiedName()
+	 * @see #getQualifiedName()
+	 * @generated
+	 */
+	EAttribute getQualifiedName_UnqualifiedName();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.common.NamedElement <em>Named Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Named Element</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.NamedElement
+	 * @generated
+	 */
+	EClass getNamedElement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.NamedElement#getName()
+	 * @see #getNamedElement()
+	 * @generated
+	 */
+	EAttribute getNamedElement_Name();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getUnrestrictedName <em>Unrestricted Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Unrestricted Name</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.NamedElement#getUnrestrictedName()
+	 * @see #getNamedElement()
+	 * @generated
+	 */
+	EAttribute getNamedElement_UnrestrictedName();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getQualifiedName <em>Qualified Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Qualified Name</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.NamedElement#getQualifiedName()
+	 * @see #getNamedElement()
+	 * @generated
+	 */
+	EAttribute getNamedElement_QualifiedName();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getVisibility <em>Visibility</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Visibility</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.NamedElement#getVisibility()
+	 * @see #getNamedElement()
+	 * @generated
+	 */
+	EAttribute getNamedElement_Visibility();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.common.Type <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.Type
+	 * @generated
+	 */
+	EClass getType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.common.TypedElement <em>Typed Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Typed Element</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.TypedElement
+	 * @generated
+	 */
+	EClass getTypedElement();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.common.TypedElement#getType <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.TypedElement#getType()
+	 * @see #getTypedElement()
+	 * @generated
+	 */
+	EReference getTypedElement_Type();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.common.ClassifierDefinition <em>Classifier Definition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Classifier Definition</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.ClassifierDefinition
+	 * @generated
+	 */
+	EClass getClassifierDefinition();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.common.VisibilityKind <em>Visibility Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Visibility Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.common.VisibilityKind
+	 * @generated
+	 */
+	EEnum getVisibilityKind();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	CommonFactory getCommonFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.common.impl.AbstractElementImpl <em>Abstract Element</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.AbstractElementImpl
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getAbstractElement()
+		 * @generated
+		 */
+		EClass ABSTRACT_ELEMENT = eINSTANCE.getAbstractElement();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.common.impl.QualifiedNameImpl <em>Qualified Name</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.QualifiedNameImpl
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getQualifiedName()
+		 * @generated
+		 */
+		EClass QUALIFIED_NAME = eINSTANCE.getQualifiedName();
+
+		/**
+		 * The meta object literal for the '<em><b>Is Ambiguous</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute QUALIFIED_NAME__IS_AMBIGUOUS = eINSTANCE.getQualifiedName_IsAmbiguous();
+
+		/**
+		 * The meta object literal for the '<em><b>Path Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute QUALIFIED_NAME__PATH_NAME = eINSTANCE.getQualifiedName_PathName();
+
+		/**
+		 * The meta object literal for the '<em><b>Name Binding</b></em>' attribute list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute QUALIFIED_NAME__NAME_BINDING = eINSTANCE.getQualifiedName_NameBinding();
+
+		/**
+		 * The meta object literal for the '<em><b>Unqualified Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute QUALIFIED_NAME__UNQUALIFIED_NAME = eINSTANCE.getQualifiedName_UnqualifiedName();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl <em>Named Element</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getNamedElement()
+		 * @generated
+		 */
+		EClass NAMED_ELEMENT = eINSTANCE.getNamedElement();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute NAMED_ELEMENT__NAME = eINSTANCE.getNamedElement_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Unrestricted Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute NAMED_ELEMENT__UNRESTRICTED_NAME = eINSTANCE.getNamedElement_UnrestrictedName();
+
+		/**
+		 * The meta object literal for the '<em><b>Qualified Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute NAMED_ELEMENT__QUALIFIED_NAME = eINSTANCE.getNamedElement_QualifiedName();
+
+		/**
+		 * The meta object literal for the '<em><b>Visibility</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute NAMED_ELEMENT__VISIBILITY = eINSTANCE.getNamedElement_Visibility();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.common.impl.TypeImpl <em>Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.TypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getType()
+		 * @generated
+		 */
+		EClass TYPE = eINSTANCE.getType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.common.impl.TypedElementImpl <em>Typed Element</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.TypedElementImpl
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getTypedElement()
+		 * @generated
+		 */
+		EClass TYPED_ELEMENT = eINSTANCE.getTypedElement();
+
+		/**
+		 * The meta object literal for the '<em><b>Type</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TYPED_ELEMENT__TYPE = eINSTANCE.getTypedElement_Type();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.common.impl.ClassifierDefinitionImpl <em>Classifier Definition</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.ClassifierDefinitionImpl
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getClassifierDefinition()
+		 * @generated
+		 */
+		EClass CLASSIFIER_DEFINITION = eINSTANCE.getClassifierDefinition();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.common.VisibilityKind <em>Visibility Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.common.VisibilityKind
+		 * @see org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl#getVisibilityKind()
+		 * @generated
+		 */
+		EEnum VISIBILITY_KIND = eINSTANCE.getVisibilityKind();
+
+	}
+
+} //CommonPackage
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/NamedElement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/NamedElement.java
new file mode 100644
index 0000000..45bc5f8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/NamedElement.java
@@ -0,0 +1,144 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Named Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getUnrestrictedName <em>Unrestricted Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getQualifiedName <em>Qualified Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getVisibility <em>Visibility</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getNamedElement()
+ * @model abstract="true"
+ * @generated
+ */
+public interface NamedElement extends AbstractElement {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getNamedElement_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Unrestricted Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Unrestricted Name</em>' attribute.
+	 * @see #setUnrestrictedName(String)
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getNamedElement_UnrestrictedName()
+	 * @model
+	 * @generated
+	 */
+	String getUnrestrictedName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getUnrestrictedName <em>Unrestricted Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Unrestricted Name</em>' attribute.
+	 * @see #getUnrestrictedName()
+	 * @generated
+	 */
+	void setUnrestrictedName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Qualified Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Qualified Name</em>' attribute.
+	 * @see #setQualifiedName(String)
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getNamedElement_QualifiedName()
+	 * @model
+	 * @generated
+	 */
+	String getQualifiedName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getQualifiedName <em>Qualified Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Qualified Name</em>' attribute.
+	 * @see #getQualifiedName()
+	 * @generated
+	 */
+	void setQualifiedName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Visibility</b></em>' attribute.
+	 * The default value is <code>"protected"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.common.VisibilityKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Visibility</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Visibility</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.common.VisibilityKind
+	 * @see #setVisibility(VisibilityKind)
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getNamedElement_Visibility()
+	 * @model default="protected"
+	 * @generated
+	 */
+	VisibilityKind getVisibility();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.common.NamedElement#getVisibility <em>Visibility</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Visibility</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.common.VisibilityKind
+	 * @see #getVisibility()
+	 * @generated
+	 */
+	void setVisibility(VisibilityKind value);
+
+} // NamedElement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/QualifiedName.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/QualifiedName.java
new file mode 100644
index 0000000..1fac39f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/QualifiedName.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Qualified Name</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getIsAmbiguous <em>Is Ambiguous</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getPathName <em>Path Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getNameBinding <em>Name Binding</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getUnqualifiedName <em>Unqualified Name</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getQualifiedName()
+ * @model
+ * @generated
+ */
+public interface QualifiedName extends AbstractElement {
+	/**
+	 * Returns the value of the '<em><b>Is Ambiguous</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Is Ambiguous</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Is Ambiguous</em>' attribute.
+	 * @see #setIsAmbiguous(Boolean)
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getQualifiedName_IsAmbiguous()
+	 * @model
+	 * @generated
+	 */
+	Boolean getIsAmbiguous();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getIsAmbiguous <em>Is Ambiguous</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Is Ambiguous</em>' attribute.
+	 * @see #getIsAmbiguous()
+	 * @generated
+	 */
+	void setIsAmbiguous(Boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Path Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Path Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Path Name</em>' attribute.
+	 * @see #setPathName(String)
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getQualifiedName_PathName()
+	 * @model
+	 * @generated
+	 */
+	String getPathName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getPathName <em>Path Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Path Name</em>' attribute.
+	 * @see #getPathName()
+	 * @generated
+	 */
+	void setPathName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Name Binding</b></em>' attribute list.
+	 * The list contents are of type {@link java.lang.String}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name Binding</em>' attribute list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name Binding</em>' attribute list.
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getQualifiedName_NameBinding()
+	 * @model
+	 * @generated
+	 */
+	EList<String> getNameBinding();
+
+	/**
+	 * Returns the value of the '<em><b>Unqualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Unqualified Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Unqualified Name</em>' attribute.
+	 * @see #setUnqualifiedName(String)
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getQualifiedName_UnqualifiedName()
+	 * @model
+	 * @generated
+	 */
+	String getUnqualifiedName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.common.QualifiedName#getUnqualifiedName <em>Unqualified Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Unqualified Name</em>' attribute.
+	 * @see #getUnqualifiedName()
+	 * @generated
+	 */
+	void setUnqualifiedName(String value);
+
+} // QualifiedName
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/Type.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/Type.java
new file mode 100644
index 0000000..655578d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/Type.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getType()
+ * @model
+ * @generated
+ */
+public interface Type extends NamedElement {
+} // Type
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/TypedElement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/TypedElement.java
new file mode 100644
index 0000000..a099af1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/TypedElement.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Typed Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.TypedElement#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getTypedElement()
+ * @model
+ * @generated
+ */
+public interface TypedElement extends NamedElement {
+	/**
+	 * Returns the value of the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Type</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Type</em>' containment reference.
+	 * @see #setType(Type)
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getTypedElement_Type()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Type getType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.common.TypedElement#getType <em>Type</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Type</em>' containment reference.
+	 * @see #getType()
+	 * @generated
+	 */
+	void setType(Type value);
+
+} // TypedElement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/VisibilityKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/VisibilityKind.java
new file mode 100644
index 0000000..cb772f3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/VisibilityKind.java
@@ -0,0 +1,278 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Visibility Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#getVisibilityKind()
+ * @model
+ * @generated
+ */
+public enum VisibilityKind implements Enumerator {
+	/**
+	 * The '<em><b>Public</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PUBLIC_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PUBLIC(0, "public", "public"),
+
+	/**
+	 * The '<em><b>Private</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PRIVATE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PRIVATE(1, "private", "private"),
+
+	/**
+	 * The '<em><b>Protected</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PROTECTED_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PROTECTED(2, "protected", "protected"),
+
+	/**
+	 * The '<em><b>Package</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PACKAGE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PACKAGE(3, "package", "package");
+
+	/**
+	 * The '<em><b>Public</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Public</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PUBLIC
+	 * @model name="public"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PUBLIC_VALUE = 0;
+
+	/**
+	 * The '<em><b>Private</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Private</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PRIVATE
+	 * @model name="private"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PRIVATE_VALUE = 1;
+
+	/**
+	 * The '<em><b>Protected</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Protected</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PROTECTED
+	 * @model name="protected"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PROTECTED_VALUE = 2;
+
+	/**
+	 * The '<em><b>Package</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Package</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PACKAGE
+	 * @model name="package"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PACKAGE_VALUE = 3;
+
+	/**
+	 * An array of all the '<em><b>Visibility Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final VisibilityKind[] VALUES_ARRAY =
+		new VisibilityKind[] {
+			PUBLIC,
+			PRIVATE,
+			PROTECTED,
+			PACKAGE,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Visibility Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<VisibilityKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Visibility Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static VisibilityKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			VisibilityKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Visibility Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static VisibilityKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			VisibilityKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Visibility Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static VisibilityKind get(int value) {
+		switch (value) {
+			case PUBLIC_VALUE: return PUBLIC;
+			case PRIVATE_VALUE: return PRIVATE;
+			case PROTECTED_VALUE: return PROTECTED;
+			case PACKAGE_VALUE: return PACKAGE;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private VisibilityKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //VisibilityKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/AbstractElementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/AbstractElementImpl.java
new file mode 100644
index 0000000..3c7bde4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/AbstractElementImpl.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.impl;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Abstract Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public abstract class AbstractElementImpl extends MinimalEObjectImpl.Container implements AbstractElement {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected AbstractElementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return CommonPackage.Literals.ABSTRACT_ELEMENT;
+	}
+
+} //AbstractElementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/ClassifierDefinitionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/ClassifierDefinitionImpl.java
new file mode 100644
index 0000000..2cd44d8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/ClassifierDefinitionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.impl;
+
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Classifier Definition</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class ClassifierDefinitionImpl extends TypeImpl implements ClassifierDefinition {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ClassifierDefinitionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return CommonPackage.Literals.CLASSIFIER_DEFINITION;
+	}
+
+} //ClassifierDefinitionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/CommonFactoryImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/CommonFactoryImpl.java
new file mode 100644
index 0000000..c1b362d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/CommonFactoryImpl.java
@@ -0,0 +1,189 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.impl;
+
+import org.eclipse.efm.ecore.formalml.common.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class CommonFactoryImpl extends EFactoryImpl implements CommonFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static CommonFactory init() {
+		try {
+			CommonFactory theCommonFactory = (CommonFactory)EPackage.Registry.INSTANCE.getEFactory(CommonPackage.eNS_URI);
+			if (theCommonFactory != null) {
+				return theCommonFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new CommonFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CommonFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case CommonPackage.QUALIFIED_NAME: return createQualifiedName();
+			case CommonPackage.TYPE: return createType();
+			case CommonPackage.TYPED_ELEMENT: return createTypedElement();
+			case CommonPackage.CLASSIFIER_DEFINITION: return createClassifierDefinition();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case CommonPackage.VISIBILITY_KIND:
+				return createVisibilityKindFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case CommonPackage.VISIBILITY_KIND:
+				return convertVisibilityKindToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public QualifiedName createQualifiedName() {
+		QualifiedNameImpl qualifiedName = new QualifiedNameImpl();
+		return qualifiedName;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Type createType() {
+		TypeImpl type = new TypeImpl();
+		return type;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TypedElement createTypedElement() {
+		TypedElementImpl typedElement = new TypedElementImpl();
+		return typedElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ClassifierDefinition createClassifierDefinition() {
+		ClassifierDefinitionImpl classifierDefinition = new ClassifierDefinitionImpl();
+		return classifierDefinition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VisibilityKind createVisibilityKindFromString(EDataType eDataType, String initialValue) {
+		VisibilityKind result = VisibilityKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertVisibilityKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CommonPackage getCommonPackage() {
+		return (CommonPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static CommonPackage getPackage() {
+		return CommonPackage.eINSTANCE;
+	}
+
+} //CommonFactoryImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/CommonPackageImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/CommonPackageImpl.java
new file mode 100644
index 0000000..3042079
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/CommonPackageImpl.java
@@ -0,0 +1,455 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+import org.eclipse.efm.ecore.formalml.common.CommonFactory;
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+import org.eclipse.efm.ecore.formalml.common.QualifiedName;
+import org.eclipse.efm.ecore.formalml.common.Type;
+import org.eclipse.efm.ecore.formalml.common.TypedElement;
+import org.eclipse.efm.ecore.formalml.common.VisibilityKind;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class CommonPackageImpl extends EPackageImpl implements CommonPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass abstractElementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass qualifiedNameEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass namedElementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass typeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass typedElementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass classifierDefinitionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum visibilityKindEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.efm.ecore.formalml.common.CommonPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private CommonPackageImpl() {
+		super(eNS_URI, CommonFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link CommonPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static CommonPackage init() {
+		if (isInited) return (CommonPackage)EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI);
+
+		// Obtain or create and register package
+		CommonPackageImpl theCommonPackage = (CommonPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof CommonPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new CommonPackageImpl());
+
+		isInited = true;
+
+		// Obtain or create and register interdependencies
+		FormalmlPackageImpl theFormalmlPackage = (FormalmlPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) instanceof FormalmlPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) : FormalmlPackage.eINSTANCE);
+		InfrastructurePackageImpl theInfrastructurePackage = (InfrastructurePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) instanceof InfrastructurePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) : InfrastructurePackage.eINSTANCE);
+		DatatypePackageImpl theDatatypePackage = (DatatypePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) instanceof DatatypePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) : DatatypePackage.eINSTANCE);
+		ExpressionPackageImpl theExpressionPackage = (ExpressionPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) instanceof ExpressionPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) : ExpressionPackage.eINSTANCE);
+		StatementPackageImpl theStatementPackage = (StatementPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) instanceof StatementPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) : StatementPackage.eINSTANCE);
+		StatemachinePackageImpl theStatemachinePackage = (StatemachinePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) instanceof StatemachinePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) : StatemachinePackage.eINSTANCE);
+
+		// Create package meta-data objects
+		theCommonPackage.createPackageContents();
+		theFormalmlPackage.createPackageContents();
+		theInfrastructurePackage.createPackageContents();
+		theDatatypePackage.createPackageContents();
+		theExpressionPackage.createPackageContents();
+		theStatementPackage.createPackageContents();
+		theStatemachinePackage.createPackageContents();
+
+		// Initialize created meta-data
+		theCommonPackage.initializePackageContents();
+		theFormalmlPackage.initializePackageContents();
+		theInfrastructurePackage.initializePackageContents();
+		theDatatypePackage.initializePackageContents();
+		theExpressionPackage.initializePackageContents();
+		theStatementPackage.initializePackageContents();
+		theStatemachinePackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theCommonPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(CommonPackage.eNS_URI, theCommonPackage);
+		return theCommonPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getAbstractElement() {
+		return abstractElementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getQualifiedName() {
+		return qualifiedNameEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getQualifiedName_IsAmbiguous() {
+		return (EAttribute)qualifiedNameEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getQualifiedName_PathName() {
+		return (EAttribute)qualifiedNameEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getQualifiedName_NameBinding() {
+		return (EAttribute)qualifiedNameEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getQualifiedName_UnqualifiedName() {
+		return (EAttribute)qualifiedNameEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getNamedElement() {
+		return namedElementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getNamedElement_Name() {
+		return (EAttribute)namedElementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getNamedElement_UnrestrictedName() {
+		return (EAttribute)namedElementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getNamedElement_QualifiedName() {
+		return (EAttribute)namedElementEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getNamedElement_Visibility() {
+		return (EAttribute)namedElementEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getType() {
+		return typeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getTypedElement() {
+		return typedElementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTypedElement_Type() {
+		return (EReference)typedElementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getClassifierDefinition() {
+		return classifierDefinitionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getVisibilityKind() {
+		return visibilityKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CommonFactory getCommonFactory() {
+		return (CommonFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		abstractElementEClass = createEClass(ABSTRACT_ELEMENT);
+
+		qualifiedNameEClass = createEClass(QUALIFIED_NAME);
+		createEAttribute(qualifiedNameEClass, QUALIFIED_NAME__IS_AMBIGUOUS);
+		createEAttribute(qualifiedNameEClass, QUALIFIED_NAME__PATH_NAME);
+		createEAttribute(qualifiedNameEClass, QUALIFIED_NAME__NAME_BINDING);
+		createEAttribute(qualifiedNameEClass, QUALIFIED_NAME__UNQUALIFIED_NAME);
+
+		namedElementEClass = createEClass(NAMED_ELEMENT);
+		createEAttribute(namedElementEClass, NAMED_ELEMENT__NAME);
+		createEAttribute(namedElementEClass, NAMED_ELEMENT__UNRESTRICTED_NAME);
+		createEAttribute(namedElementEClass, NAMED_ELEMENT__QUALIFIED_NAME);
+		createEAttribute(namedElementEClass, NAMED_ELEMENT__VISIBILITY);
+
+		typeEClass = createEClass(TYPE);
+
+		typedElementEClass = createEClass(TYPED_ELEMENT);
+		createEReference(typedElementEClass, TYPED_ELEMENT__TYPE);
+
+		classifierDefinitionEClass = createEClass(CLASSIFIER_DEFINITION);
+
+		// Create enums
+		visibilityKindEEnum = createEEnum(VISIBILITY_KIND);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		qualifiedNameEClass.getESuperTypes().add(this.getAbstractElement());
+		namedElementEClass.getESuperTypes().add(this.getAbstractElement());
+		typeEClass.getESuperTypes().add(this.getNamedElement());
+		typedElementEClass.getESuperTypes().add(this.getNamedElement());
+		classifierDefinitionEClass.getESuperTypes().add(this.getType());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(abstractElementEClass, AbstractElement.class, "AbstractElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(qualifiedNameEClass, QualifiedName.class, "QualifiedName", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getQualifiedName_IsAmbiguous(), ecorePackage.getEBooleanObject(), "isAmbiguous", null, 0, 1, QualifiedName.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getQualifiedName_PathName(), ecorePackage.getEString(), "pathName", null, 0, 1, QualifiedName.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getQualifiedName_NameBinding(), ecorePackage.getEString(), "nameBinding", null, 0, -1, QualifiedName.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getQualifiedName_UnqualifiedName(), ecorePackage.getEString(), "unqualifiedName", null, 0, 1, QualifiedName.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(namedElementEClass, NamedElement.class, "NamedElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getNamedElement_Name(), ecorePackage.getEString(), "name", null, 0, 1, NamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getNamedElement_UnrestrictedName(), ecorePackage.getEString(), "unrestrictedName", null, 0, 1, NamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getNamedElement_QualifiedName(), ecorePackage.getEString(), "qualifiedName", null, 0, 1, NamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getNamedElement_Visibility(), this.getVisibilityKind(), "visibility", "protected", 0, 1, NamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(typeEClass, Type.class, "Type", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(typedElementEClass, TypedElement.class, "TypedElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getTypedElement_Type(), this.getType(), null, "type", null, 0, 1, TypedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(classifierDefinitionEClass, ClassifierDefinition.class, "ClassifierDefinition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		// Initialize enums and add enum literals
+		initEEnum(visibilityKindEEnum, VisibilityKind.class, "VisibilityKind");
+		addEEnumLiteral(visibilityKindEEnum, VisibilityKind.PUBLIC);
+		addEEnumLiteral(visibilityKindEEnum, VisibilityKind.PRIVATE);
+		addEEnumLiteral(visibilityKindEEnum, VisibilityKind.PROTECTED);
+		addEEnumLiteral(visibilityKindEEnum, VisibilityKind.PACKAGE);
+	}
+
+} //CommonPackageImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/NamedElementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/NamedElementImpl.java
new file mode 100644
index 0000000..e23852f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/NamedElementImpl.java
@@ -0,0 +1,335 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.impl;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+import org.eclipse.efm.ecore.formalml.common.VisibilityKind;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Named Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl#getUnrestrictedName <em>Unrestricted Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl#getQualifiedName <em>Qualified Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl#getVisibility <em>Visibility</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class NamedElementImpl extends AbstractElementImpl implements NamedElement {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getUnrestrictedName() <em>Unrestricted Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUnrestrictedName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String UNRESTRICTED_NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getUnrestrictedName() <em>Unrestricted Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUnrestrictedName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String unrestrictedName = UNRESTRICTED_NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getQualifiedName() <em>Qualified Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getQualifiedName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String QUALIFIED_NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getQualifiedName() <em>Qualified Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getQualifiedName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String qualifiedName = QUALIFIED_NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getVisibility() <em>Visibility</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getVisibility()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final VisibilityKind VISIBILITY_EDEFAULT = VisibilityKind.PROTECTED;
+
+	/**
+	 * The cached value of the '{@link #getVisibility() <em>Visibility</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getVisibility()
+	 * @generated
+	 * @ordered
+	 */
+	protected VisibilityKind visibility = VISIBILITY_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected NamedElementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return CommonPackage.Literals.NAMED_ELEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, CommonPackage.NAMED_ELEMENT__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getUnrestrictedName() {
+		return unrestrictedName;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setUnrestrictedName(String newUnrestrictedName) {
+		String oldUnrestrictedName = unrestrictedName;
+		unrestrictedName = newUnrestrictedName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME, oldUnrestrictedName, unrestrictedName));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getQualifiedName() {
+		return qualifiedName;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setQualifiedName(String newQualifiedName) {
+		String oldQualifiedName = qualifiedName;
+		qualifiedName = newQualifiedName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME, oldQualifiedName, qualifiedName));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VisibilityKind getVisibility() {
+		return visibility;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setVisibility(VisibilityKind newVisibility) {
+		VisibilityKind oldVisibility = visibility;
+		visibility = newVisibility == null ? VISIBILITY_EDEFAULT : newVisibility;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, CommonPackage.NAMED_ELEMENT__VISIBILITY, oldVisibility, visibility));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case CommonPackage.NAMED_ELEMENT__NAME:
+				return getName();
+			case CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME:
+				return getUnrestrictedName();
+			case CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME:
+				return getQualifiedName();
+			case CommonPackage.NAMED_ELEMENT__VISIBILITY:
+				return getVisibility();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case CommonPackage.NAMED_ELEMENT__NAME:
+				setName((String)newValue);
+				return;
+			case CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME:
+				setUnrestrictedName((String)newValue);
+				return;
+			case CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME:
+				setQualifiedName((String)newValue);
+				return;
+			case CommonPackage.NAMED_ELEMENT__VISIBILITY:
+				setVisibility((VisibilityKind)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case CommonPackage.NAMED_ELEMENT__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME:
+				setUnrestrictedName(UNRESTRICTED_NAME_EDEFAULT);
+				return;
+			case CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME:
+				setQualifiedName(QUALIFIED_NAME_EDEFAULT);
+				return;
+			case CommonPackage.NAMED_ELEMENT__VISIBILITY:
+				setVisibility(VISIBILITY_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case CommonPackage.NAMED_ELEMENT__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME:
+				return UNRESTRICTED_NAME_EDEFAULT == null ? unrestrictedName != null : !UNRESTRICTED_NAME_EDEFAULT.equals(unrestrictedName);
+			case CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME:
+				return QUALIFIED_NAME_EDEFAULT == null ? qualifiedName != null : !QUALIFIED_NAME_EDEFAULT.equals(qualifiedName);
+			case CommonPackage.NAMED_ELEMENT__VISIBILITY:
+				return visibility != VISIBILITY_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(", unrestrictedName: ");
+		result.append(unrestrictedName);
+		result.append(", qualifiedName: ");
+		result.append(qualifiedName);
+		result.append(", visibility: ");
+		result.append(visibility);
+		result.append(')');
+		return result.toString();
+	}
+
+} //NamedElementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/QualifiedNameImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/QualifiedNameImpl.java
new file mode 100644
index 0000000..2c606cd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/QualifiedNameImpl.java
@@ -0,0 +1,323 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+import org.eclipse.efm.ecore.formalml.common.QualifiedName;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Qualified Name</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.impl.QualifiedNameImpl#getIsAmbiguous <em>Is Ambiguous</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.impl.QualifiedNameImpl#getPathName <em>Path Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.impl.QualifiedNameImpl#getNameBinding <em>Name Binding</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.impl.QualifiedNameImpl#getUnqualifiedName <em>Unqualified Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class QualifiedNameImpl extends AbstractElementImpl implements QualifiedName {
+	/**
+	 * The default value of the '{@link #getIsAmbiguous() <em>Is Ambiguous</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getIsAmbiguous()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final Boolean IS_AMBIGUOUS_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getIsAmbiguous() <em>Is Ambiguous</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getIsAmbiguous()
+	 * @generated
+	 * @ordered
+	 */
+	protected Boolean isAmbiguous = IS_AMBIGUOUS_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getPathName() <em>Path Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPathName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String PATH_NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getPathName() <em>Path Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPathName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String pathName = PATH_NAME_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getNameBinding() <em>Name Binding</em>}' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNameBinding()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<String> nameBinding;
+
+	/**
+	 * The default value of the '{@link #getUnqualifiedName() <em>Unqualified Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUnqualifiedName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String UNQUALIFIED_NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getUnqualifiedName() <em>Unqualified Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUnqualifiedName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String unqualifiedName = UNQUALIFIED_NAME_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected QualifiedNameImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return CommonPackage.Literals.QUALIFIED_NAME;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Boolean getIsAmbiguous() {
+		return isAmbiguous;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setIsAmbiguous(Boolean newIsAmbiguous) {
+		Boolean oldIsAmbiguous = isAmbiguous;
+		isAmbiguous = newIsAmbiguous;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, CommonPackage.QUALIFIED_NAME__IS_AMBIGUOUS, oldIsAmbiguous, isAmbiguous));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getPathName() {
+		return pathName;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPathName(String newPathName) {
+		String oldPathName = pathName;
+		pathName = newPathName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, CommonPackage.QUALIFIED_NAME__PATH_NAME, oldPathName, pathName));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<String> getNameBinding() {
+		if (nameBinding == null) {
+			nameBinding = new EDataTypeUniqueEList<String>(String.class, this, CommonPackage.QUALIFIED_NAME__NAME_BINDING);
+		}
+		return nameBinding;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getUnqualifiedName() {
+		return unqualifiedName;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setUnqualifiedName(String newUnqualifiedName) {
+		String oldUnqualifiedName = unqualifiedName;
+		unqualifiedName = newUnqualifiedName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, CommonPackage.QUALIFIED_NAME__UNQUALIFIED_NAME, oldUnqualifiedName, unqualifiedName));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case CommonPackage.QUALIFIED_NAME__IS_AMBIGUOUS:
+				return getIsAmbiguous();
+			case CommonPackage.QUALIFIED_NAME__PATH_NAME:
+				return getPathName();
+			case CommonPackage.QUALIFIED_NAME__NAME_BINDING:
+				return getNameBinding();
+			case CommonPackage.QUALIFIED_NAME__UNQUALIFIED_NAME:
+				return getUnqualifiedName();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case CommonPackage.QUALIFIED_NAME__IS_AMBIGUOUS:
+				setIsAmbiguous((Boolean)newValue);
+				return;
+			case CommonPackage.QUALIFIED_NAME__PATH_NAME:
+				setPathName((String)newValue);
+				return;
+			case CommonPackage.QUALIFIED_NAME__NAME_BINDING:
+				getNameBinding().clear();
+				getNameBinding().addAll((Collection<? extends String>)newValue);
+				return;
+			case CommonPackage.QUALIFIED_NAME__UNQUALIFIED_NAME:
+				setUnqualifiedName((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case CommonPackage.QUALIFIED_NAME__IS_AMBIGUOUS:
+				setIsAmbiguous(IS_AMBIGUOUS_EDEFAULT);
+				return;
+			case CommonPackage.QUALIFIED_NAME__PATH_NAME:
+				setPathName(PATH_NAME_EDEFAULT);
+				return;
+			case CommonPackage.QUALIFIED_NAME__NAME_BINDING:
+				getNameBinding().clear();
+				return;
+			case CommonPackage.QUALIFIED_NAME__UNQUALIFIED_NAME:
+				setUnqualifiedName(UNQUALIFIED_NAME_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case CommonPackage.QUALIFIED_NAME__IS_AMBIGUOUS:
+				return IS_AMBIGUOUS_EDEFAULT == null ? isAmbiguous != null : !IS_AMBIGUOUS_EDEFAULT.equals(isAmbiguous);
+			case CommonPackage.QUALIFIED_NAME__PATH_NAME:
+				return PATH_NAME_EDEFAULT == null ? pathName != null : !PATH_NAME_EDEFAULT.equals(pathName);
+			case CommonPackage.QUALIFIED_NAME__NAME_BINDING:
+				return nameBinding != null && !nameBinding.isEmpty();
+			case CommonPackage.QUALIFIED_NAME__UNQUALIFIED_NAME:
+				return UNQUALIFIED_NAME_EDEFAULT == null ? unqualifiedName != null : !UNQUALIFIED_NAME_EDEFAULT.equals(unqualifiedName);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (isAmbiguous: ");
+		result.append(isAmbiguous);
+		result.append(", pathName: ");
+		result.append(pathName);
+		result.append(", nameBinding: ");
+		result.append(nameBinding);
+		result.append(", unqualifiedName: ");
+		result.append(unqualifiedName);
+		result.append(')');
+		return result.toString();
+	}
+
+} //QualifiedNameImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/TypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/TypeImpl.java
new file mode 100644
index 0000000..91d0654
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/TypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.impl;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+import org.eclipse.efm.ecore.formalml.common.Type;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class TypeImpl extends NamedElementImpl implements Type {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return CommonPackage.Literals.TYPE;
+	}
+
+} //TypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/TypedElementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/TypedElementImpl.java
new file mode 100644
index 0000000..8f56c6a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/impl/TypedElementImpl.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.impl;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+import org.eclipse.efm.ecore.formalml.common.Type;
+import org.eclipse.efm.ecore.formalml.common.TypedElement;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Typed Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.common.impl.TypedElementImpl#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TypedElementImpl extends NamedElementImpl implements TypedElement {
+	/**
+	 * The cached value of the '{@link #getType() <em>Type</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getType()
+	 * @generated
+	 * @ordered
+	 */
+	protected Type type;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TypedElementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return CommonPackage.Literals.TYPED_ELEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Type getType() {
+		return type;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetType(Type newType, NotificationChain msgs) {
+		Type oldType = type;
+		type = newType;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, CommonPackage.TYPED_ELEMENT__TYPE, oldType, newType);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setType(Type newType) {
+		if (newType != type) {
+			NotificationChain msgs = null;
+			if (type != null)
+				msgs = ((InternalEObject)type).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - CommonPackage.TYPED_ELEMENT__TYPE, null, msgs);
+			if (newType != null)
+				msgs = ((InternalEObject)newType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - CommonPackage.TYPED_ELEMENT__TYPE, null, msgs);
+			msgs = basicSetType(newType, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, CommonPackage.TYPED_ELEMENT__TYPE, newType, newType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case CommonPackage.TYPED_ELEMENT__TYPE:
+				return basicSetType(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case CommonPackage.TYPED_ELEMENT__TYPE:
+				return getType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case CommonPackage.TYPED_ELEMENT__TYPE:
+				setType((Type)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case CommonPackage.TYPED_ELEMENT__TYPE:
+				setType((Type)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case CommonPackage.TYPED_ELEMENT__TYPE:
+				return type != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //TypedElementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/util/CommonAdapterFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/util/CommonAdapterFactory.java
new file mode 100644
index 0000000..7b73a18
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/util/CommonAdapterFactory.java
@@ -0,0 +1,220 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.util;
+
+import org.eclipse.efm.ecore.formalml.common.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage
+ * @generated
+ */
+public class CommonAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static CommonPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CommonAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = CommonPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected CommonSwitch<Adapter> modelSwitch =
+		new CommonSwitch<Adapter>() {
+			@Override
+			public Adapter caseAbstractElement(AbstractElement object) {
+				return createAbstractElementAdapter();
+			}
+			@Override
+			public Adapter caseQualifiedName(QualifiedName object) {
+				return createQualifiedNameAdapter();
+			}
+			@Override
+			public Adapter caseNamedElement(NamedElement object) {
+				return createNamedElementAdapter();
+			}
+			@Override
+			public Adapter caseType(Type object) {
+				return createTypeAdapter();
+			}
+			@Override
+			public Adapter caseTypedElement(TypedElement object) {
+				return createTypedElementAdapter();
+			}
+			@Override
+			public Adapter caseClassifierDefinition(ClassifierDefinition object) {
+				return createClassifierDefinitionAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.AbstractElement <em>Abstract Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.AbstractElement
+	 * @generated
+	 */
+	public Adapter createAbstractElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.QualifiedName <em>Qualified Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.QualifiedName
+	 * @generated
+	 */
+	public Adapter createQualifiedNameAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.NamedElement <em>Named Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.NamedElement
+	 * @generated
+	 */
+	public Adapter createNamedElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.Type <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.Type
+	 * @generated
+	 */
+	public Adapter createTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.TypedElement <em>Typed Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.TypedElement
+	 * @generated
+	 */
+	public Adapter createTypedElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.ClassifierDefinition <em>Classifier Definition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.ClassifierDefinition
+	 * @generated
+	 */
+	public Adapter createClassifierDefinitionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //CommonAdapterFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/util/CommonSwitch.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/util/CommonSwitch.java
new file mode 100644
index 0000000..941ceb1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/util/CommonSwitch.java
@@ -0,0 +1,234 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.common.util;
+
+import org.eclipse.efm.ecore.formalml.common.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.common.CommonPackage
+ * @generated
+ */
+public class CommonSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static CommonPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CommonSwitch() {
+		if (modelPackage == null) {
+			modelPackage = CommonPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case CommonPackage.ABSTRACT_ELEMENT: {
+				AbstractElement abstractElement = (AbstractElement)theEObject;
+				T result = caseAbstractElement(abstractElement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case CommonPackage.QUALIFIED_NAME: {
+				QualifiedName qualifiedName = (QualifiedName)theEObject;
+				T result = caseQualifiedName(qualifiedName);
+				if (result == null) result = caseAbstractElement(qualifiedName);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case CommonPackage.NAMED_ELEMENT: {
+				NamedElement namedElement = (NamedElement)theEObject;
+				T result = caseNamedElement(namedElement);
+				if (result == null) result = caseAbstractElement(namedElement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case CommonPackage.TYPE: {
+				Type type = (Type)theEObject;
+				T result = caseType(type);
+				if (result == null) result = caseNamedElement(type);
+				if (result == null) result = caseAbstractElement(type);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case CommonPackage.TYPED_ELEMENT: {
+				TypedElement typedElement = (TypedElement)theEObject;
+				T result = caseTypedElement(typedElement);
+				if (result == null) result = caseNamedElement(typedElement);
+				if (result == null) result = caseAbstractElement(typedElement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case CommonPackage.CLASSIFIER_DEFINITION: {
+				ClassifierDefinition classifierDefinition = (ClassifierDefinition)theEObject;
+				T result = caseClassifierDefinition(classifierDefinition);
+				if (result == null) result = caseType(classifierDefinition);
+				if (result == null) result = caseNamedElement(classifierDefinition);
+				if (result == null) result = caseAbstractElement(classifierDefinition);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAbstractElement(AbstractElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Qualified Name</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Qualified Name</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseQualifiedName(QualifiedName object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Named Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Named Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseNamedElement(NamedElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseType(Type object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Typed Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Typed Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseTypedElement(TypedElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Classifier Definition</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Classifier Definition</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseClassifierDefinition(ClassifierDefinition object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //CommonSwitch
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/AbstractElementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/AbstractElementValidator.java
new file mode 100644
index 0000000..b455a81
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/AbstractElementValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.common.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.common.AbstractElement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface AbstractElementValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/ClassifierDefinitionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/ClassifierDefinitionValidator.java
new file mode 100644
index 0000000..ef0a99d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/ClassifierDefinitionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.common.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.common.ClassifierDefinition}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ClassifierDefinitionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/NamedElementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/NamedElementValidator.java
new file mode 100644
index 0000000..b66f51e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/NamedElementValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.common.validation;
+
+import org.eclipse.efm.ecore.formalml.common.VisibilityKind;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.common.NamedElement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface NamedElementValidator {
+	boolean validate();
+
+	boolean validateName(String value);
+	boolean validateUnrestrictedName(String value);
+	boolean validateQualifiedName(String value);
+	boolean validateVisibility(VisibilityKind value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/QualifiedNameValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/QualifiedNameValidator.java
new file mode 100644
index 0000000..ab74701
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/QualifiedNameValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.common.validation;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.common.QualifiedName}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface QualifiedNameValidator {
+	boolean validate();
+
+	boolean validateIsAmbiguous(Boolean value);
+	boolean validatePathName(String value);
+	boolean validateNameBinding(EList<String> value);
+	boolean validateUnqualifiedName(String value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/TypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/TypeValidator.java
new file mode 100644
index 0000000..589a16d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/TypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.common.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.common.Type}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/TypedElementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/TypedElementValidator.java
new file mode 100644
index 0000000..1b1f166
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/common/validation/TypedElementValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.common.validation;
+
+import org.eclipse.efm.ecore.formalml.common.Type;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.common.TypedElement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TypedElementValidator {
+	boolean validate();
+
+	boolean validateType(Type value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/ChoiceType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/ChoiceType.java
new file mode 100644
index 0000000..61519da
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/ChoiceType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Choice Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getChoiceType()
+ * @model
+ * @generated
+ */
+public interface ChoiceType extends DataStructuredType {
+} // ChoiceType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/CollectionKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/CollectionKind.java
new file mode 100644
index 0000000..f671870
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/CollectionKind.java
@@ -0,0 +1,359 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Collection Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getCollectionKind()
+ * @model
+ * @generated
+ */
+public enum CollectionKind implements Enumerator {
+	/**
+	 * The '<em><b>Vector</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #VECTOR_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	VECTOR(0, "vector", "vector"),
+
+	/**
+	 * The '<em><b>Rvector</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RVECTOR_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RVECTOR(1, "rvector", "rvector"),
+
+	/**
+	 * The '<em><b>List</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LIST_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	LIST(2, "list", "list"),
+
+	/**
+	 * The '<em><b>Set</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SET_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SET(3, "set", "set"),
+
+	/**
+	 * The '<em><b>Bag</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BAG_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BAG(4, "bag", "bag"),
+
+	/**
+	 * The '<em><b>Fifo</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FIFO_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	FIFO(5, "fifo", "fifo"),
+
+	/**
+	 * The '<em><b>Lifo</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LIFO_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	LIFO(6, "lifo", "lifo");
+
+	/**
+	 * The '<em><b>Vector</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Vector</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #VECTOR
+	 * @model name="vector"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int VECTOR_VALUE = 0;
+
+	/**
+	 * The '<em><b>Rvector</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Rvector</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RVECTOR
+	 * @model name="rvector"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RVECTOR_VALUE = 1;
+
+	/**
+	 * The '<em><b>List</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>List</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #LIST
+	 * @model name="list"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int LIST_VALUE = 2;
+
+	/**
+	 * The '<em><b>Set</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Set</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SET
+	 * @model name="set"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SET_VALUE = 3;
+
+	/**
+	 * The '<em><b>Bag</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Bag</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BAG
+	 * @model name="bag"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BAG_VALUE = 4;
+
+	/**
+	 * The '<em><b>Fifo</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Fifo</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #FIFO
+	 * @model name="fifo"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int FIFO_VALUE = 5;
+
+	/**
+	 * The '<em><b>Lifo</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Lifo</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #LIFO
+	 * @model name="lifo"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int LIFO_VALUE = 6;
+
+	/**
+	 * An array of all the '<em><b>Collection Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final CollectionKind[] VALUES_ARRAY =
+		new CollectionKind[] {
+			VECTOR,
+			RVECTOR,
+			LIST,
+			SET,
+			BAG,
+			FIFO,
+			LIFO,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Collection Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<CollectionKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Collection Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static CollectionKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			CollectionKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Collection Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static CollectionKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			CollectionKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Collection Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static CollectionKind get(int value) {
+		switch (value) {
+			case VECTOR_VALUE: return VECTOR;
+			case RVECTOR_VALUE: return RVECTOR;
+			case LIST_VALUE: return LIST;
+			case SET_VALUE: return SET;
+			case BAG_VALUE: return BAG;
+			case FIFO_VALUE: return FIFO;
+			case LIFO_VALUE: return LIFO;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private CollectionKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //CollectionKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/CollectionType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/CollectionType.java
new file mode 100644
index 0000000..ac52e54
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/CollectionType.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Collection Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType#getContainer <em>Container</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType#getSize <em>Size</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType#isUnbounded <em>Unbounded</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getCollectionType()
+ * @model
+ * @generated
+ */
+public interface CollectionType extends DataSupportedType {
+	/**
+	 * Returns the value of the '<em><b>Container</b></em>' attribute.
+	 * The default value is <code>"list"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.datatype.CollectionKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Container</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Container</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionKind
+	 * @see #setContainer(CollectionKind)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getCollectionType_Container()
+	 * @model default="list"
+	 * @generated
+	 */
+	CollectionKind getContainer();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType#getContainer <em>Container</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Container</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionKind
+	 * @see #getContainer()
+	 * @generated
+	 */
+	void setContainer(CollectionKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Size</b></em>' attribute.
+	 * The default value is <code>"-1"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Size</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Size</em>' attribute.
+	 * @see #setSize(int)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getCollectionType_Size()
+	 * @model default="-1"
+	 * @generated
+	 */
+	int getSize();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType#getSize <em>Size</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Size</em>' attribute.
+	 * @see #getSize()
+	 * @generated
+	 */
+	void setSize(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Unbounded</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Unbounded</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Unbounded</em>' attribute.
+	 * @see #setUnbounded(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getCollectionType_Unbounded()
+	 * @model
+	 * @generated
+	 */
+	boolean isUnbounded();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType#isUnbounded <em>Unbounded</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Unbounded</em>' attribute.
+	 * @see #isUnbounded()
+	 * @generated
+	 */
+	void setUnbounded(boolean value);
+
+} // CollectionType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataStructuredType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataStructuredType.java
new file mode 100644
index 0000000..060202a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataStructuredType.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Data Structured Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.DataStructuredType#getProperty <em>Property</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataStructuredType()
+ * @model abstract="true"
+ * @generated
+ */
+public interface DataStructuredType extends DataType {
+	/**
+	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Property</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataStructuredType_Property()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<PropertyDefinition> getProperty();
+
+} // DataStructuredType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataSupportedType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataSupportedType.java
new file mode 100644
index 0000000..c663e61
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataSupportedType.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Data Supported Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.DataSupportedType#getSupport <em>Support</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataSupportedType()
+ * @model abstract="true"
+ * @generated
+ */
+public interface DataSupportedType extends DataType {
+	/**
+	 * Returns the value of the '<em><b>Support</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Support</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Support</em>' containment reference.
+	 * @see #setSupport(DataType)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataSupportedType_Support()
+	 * @model containment="true"
+	 * @generated
+	 */
+	DataType getSupport();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.DataSupportedType#getSupport <em>Support</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Support</em>' containment reference.
+	 * @see #getSupport()
+	 * @generated
+	 */
+	void setSupport(DataType value);
+
+} // DataSupportedType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataType.java
new file mode 100644
index 0000000..1fc4803
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataType.java
@@ -0,0 +1,146 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Data Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.DataType#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.DataType#isTypedef <em>Typedef</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.DataType#getMultiplicity <em>Multiplicity</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.DataType#getDefaultValue <em>Default Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataType()
+ * @model abstract="true"
+ * @generated
+ */
+public interface DataType extends ClassifierDefinition {
+	/**
+	 * Returns the value of the '<em><b>Kind</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Kind</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind
+	 * @see #setKind(PrimitiveTypeKind)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataType_Kind()
+	 * @model
+	 * @generated
+	 */
+	PrimitiveTypeKind getKind();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.DataType#getKind <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind
+	 * @see #getKind()
+	 * @generated
+	 */
+	void setKind(PrimitiveTypeKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Typedef</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Typedef</em>' attribute.
+	 * @see #setTypedef(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataType_Typedef()
+	 * @model
+	 * @generated
+	 */
+	boolean isTypedef();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.DataType#isTypedef <em>Typedef</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Typedef</em>' attribute.
+	 * @see #isTypedef()
+	 * @generated
+	 */
+	void setTypedef(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Multiplicity</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Multiplicity</em>' containment reference.
+	 * @see #setMultiplicity(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataType_Multiplicity()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getMultiplicity();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.DataType#getMultiplicity <em>Multiplicity</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Multiplicity</em>' containment reference.
+	 * @see #getMultiplicity()
+	 * @generated
+	 */
+	void setMultiplicity(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Default Value</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Default Value</em>' containment reference.
+	 * @see #setDefaultValue(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataType_DefaultValue()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getDefaultValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.DataType#getDefaultValue <em>Default Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Default Value</em>' containment reference.
+	 * @see #getDefaultValue()
+	 * @generated
+	 */
+	void setDefaultValue(Expression value);
+
+} // DataType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataTypeReference.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataTypeReference.java
new file mode 100644
index 0000000..09f3940
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DataTypeReference.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Data Type Reference</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.DataTypeReference#getTyperef <em>Typeref</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.DataTypeReference#getSupport <em>Support</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataTypeReference()
+ * @model
+ * @generated
+ */
+public interface DataTypeReference extends DataType {
+	/**
+	 * Returns the value of the '<em><b>Typeref</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Typeref</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Typeref</em>' reference.
+	 * @see #setTyperef(DataType)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataTypeReference_Typeref()
+	 * @model
+	 * @generated
+	 */
+	DataType getTyperef();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.DataTypeReference#getTyperef <em>Typeref</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Typeref</em>' reference.
+	 * @see #getTyperef()
+	 * @generated
+	 */
+	void setTyperef(DataType value);
+
+	/**
+	 * Returns the value of the '<em><b>Support</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Support</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Support</em>' containment reference.
+	 * @see #setSupport(DataType)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getDataTypeReference_Support()
+	 * @model containment="true"
+	 * @generated
+	 */
+	DataType getSupport();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.DataTypeReference#getSupport <em>Support</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Support</em>' containment reference.
+	 * @see #getSupport()
+	 * @generated
+	 */
+	void setSupport(DataType value);
+
+} // DataTypeReference
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DatatypeFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DatatypeFactory.java
new file mode 100644
index 0000000..4449172
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DatatypeFactory.java
@@ -0,0 +1,196 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage
+ * @generated
+ */
+public interface DatatypeFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	DatatypeFactory eINSTANCE = org.eclipse.efm.ecore.formalml.datatype.impl.DatatypeFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Data Type Reference</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Data Type Reference</em>'.
+	 * @generated
+	 */
+	DataTypeReference createDataTypeReference();
+
+	/**
+	 * Returns a new object of class '<em>Enumeration Literal</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Enumeration Literal</em>'.
+	 * @generated
+	 */
+	EnumerationLiteral createEnumerationLiteral();
+
+	/**
+	 * Returns a new object of class '<em>Enumeration Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Enumeration Type</em>'.
+	 * @generated
+	 */
+	EnumerationType createEnumerationType();
+
+	/**
+	 * Returns a new object of class '<em>Structure Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Structure Type</em>'.
+	 * @generated
+	 */
+	StructureType createStructureType();
+
+	/**
+	 * Returns a new object of class '<em>Union Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Union Type</em>'.
+	 * @generated
+	 */
+	UnionType createUnionType();
+
+	/**
+	 * Returns a new object of class '<em>Choice Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Choice Type</em>'.
+	 * @generated
+	 */
+	ChoiceType createChoiceType();
+
+	/**
+	 * Returns a new object of class '<em>Interval Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Interval Type</em>'.
+	 * @generated
+	 */
+	IntervalType createIntervalType();
+
+	/**
+	 * Returns a new object of class '<em>Collection Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Collection Type</em>'.
+	 * @generated
+	 */
+	CollectionType createCollectionType();
+
+	/**
+	 * Returns a new object of class '<em>Primitive Boolean Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Primitive Boolean Type</em>'.
+	 * @generated
+	 */
+	PrimitiveBooleanType createPrimitiveBooleanType();
+
+	/**
+	 * Returns a new object of class '<em>Primitive Integer Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Primitive Integer Type</em>'.
+	 * @generated
+	 */
+	PrimitiveIntegerType createPrimitiveIntegerType();
+
+	/**
+	 * Returns a new object of class '<em>Primitive Rational Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Primitive Rational Type</em>'.
+	 * @generated
+	 */
+	PrimitiveRationalType createPrimitiveRationalType();
+
+	/**
+	 * Returns a new object of class '<em>Primitive Float Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Primitive Float Type</em>'.
+	 * @generated
+	 */
+	PrimitiveFloatType createPrimitiveFloatType();
+
+	/**
+	 * Returns a new object of class '<em>Primitive Real Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Primitive Real Type</em>'.
+	 * @generated
+	 */
+	PrimitiveRealType createPrimitiveRealType();
+
+	/**
+	 * Returns a new object of class '<em>Primitive Time Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Primitive Time Type</em>'.
+	 * @generated
+	 */
+	PrimitiveTimeType createPrimitiveTimeType();
+
+	/**
+	 * Returns a new object of class '<em>Primitive Character Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Primitive Character Type</em>'.
+	 * @generated
+	 */
+	PrimitiveCharacterType createPrimitiveCharacterType();
+
+	/**
+	 * Returns a new object of class '<em>Primitive String Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Primitive String Type</em>'.
+	 * @generated
+	 */
+	PrimitiveStringType createPrimitiveStringType();
+
+	/**
+	 * Returns a new object of class '<em>Primitive Instance Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Primitive Instance Type</em>'.
+	 * @generated
+	 */
+	PrimitiveInstanceType createPrimitiveInstanceType();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	DatatypePackage getDatatypePackage();
+
+} //DatatypeFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DatatypePackage.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DatatypePackage.java
new file mode 100644
index 0000000..c1a73cf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/DatatypePackage.java
@@ -0,0 +1,3593 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypeFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface DatatypePackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "datatype";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efm/FormalML/DataType";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "DataType";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	DatatypePackage eINSTANCE = org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeImpl <em>Data Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getDataType()
+	 * @generated
+	 */
+	int DATA_TYPE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE__NAME = CommonPackage.CLASSIFIER_DEFINITION__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE__UNRESTRICTED_NAME = CommonPackage.CLASSIFIER_DEFINITION__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE__QUALIFIED_NAME = CommonPackage.CLASSIFIER_DEFINITION__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE__VISIBILITY = CommonPackage.CLASSIFIER_DEFINITION__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE__KIND = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE__TYPEDEF = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE__MULTIPLICITY = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE__DEFAULT_VALUE = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Data Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_FEATURE_COUNT = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Data Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_OPERATION_COUNT = CommonPackage.CLASSIFIER_DEFINITION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeReferenceImpl <em>Data Type Reference</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeReferenceImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getDataTypeReference()
+	 * @generated
+	 */
+	int DATA_TYPE_REFERENCE = 1;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__NAME = DATA_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__UNRESTRICTED_NAME = DATA_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__QUALIFIED_NAME = DATA_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__VISIBILITY = DATA_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__KIND = DATA_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__TYPEDEF = DATA_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__MULTIPLICITY = DATA_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__DEFAULT_VALUE = DATA_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Typeref</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__TYPEREF = DATA_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Support</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE__SUPPORT = DATA_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Data Type Reference</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE_FEATURE_COUNT = DATA_TYPE_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Data Type Reference</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_TYPE_REFERENCE_OPERATION_COUNT = DATA_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationLiteralImpl <em>Enumeration Literal</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationLiteralImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getEnumerationLiteral()
+	 * @generated
+	 */
+	int ENUMERATION_LITERAL = 2;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_LITERAL__NAME = CommonPackage.NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_LITERAL__UNRESTRICTED_NAME = CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_LITERAL__QUALIFIED_NAME = CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_LITERAL__VISIBILITY = CommonPackage.NAMED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_LITERAL__VALUE = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Enumeration Literal</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_LITERAL_FEATURE_COUNT = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Enumeration Literal</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_LITERAL_OPERATION_COUNT = CommonPackage.NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationTypeImpl <em>Enumeration Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getEnumerationType()
+	 * @generated
+	 */
+	int ENUMERATION_TYPE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE__NAME = DATA_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE__UNRESTRICTED_NAME = DATA_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE__QUALIFIED_NAME = DATA_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE__VISIBILITY = DATA_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE__KIND = DATA_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE__TYPEDEF = DATA_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE__MULTIPLICITY = DATA_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE__DEFAULT_VALUE = DATA_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Literal</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE__LITERAL = DATA_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Enumeration Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE_FEATURE_COUNT = DATA_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Enumeration Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ENUMERATION_TYPE_OPERATION_COUNT = DATA_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataStructuredTypeImpl <em>Data Structured Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DataStructuredTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getDataStructuredType()
+	 * @generated
+	 */
+	int DATA_STRUCTURED_TYPE = 4;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE__NAME = DATA_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE__UNRESTRICTED_NAME = DATA_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE__QUALIFIED_NAME = DATA_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE__VISIBILITY = DATA_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE__KIND = DATA_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE__TYPEDEF = DATA_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE__MULTIPLICITY = DATA_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE__DEFAULT_VALUE = DATA_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE__PROPERTY = DATA_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Data Structured Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE_FEATURE_COUNT = DATA_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Data Structured Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_STRUCTURED_TYPE_OPERATION_COUNT = DATA_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.StructureTypeImpl <em>Structure Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.StructureTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getStructureType()
+	 * @generated
+	 */
+	int STRUCTURE_TYPE = 5;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE__NAME = DATA_STRUCTURED_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE__UNRESTRICTED_NAME = DATA_STRUCTURED_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE__QUALIFIED_NAME = DATA_STRUCTURED_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE__VISIBILITY = DATA_STRUCTURED_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE__KIND = DATA_STRUCTURED_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE__TYPEDEF = DATA_STRUCTURED_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE__MULTIPLICITY = DATA_STRUCTURED_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE__DEFAULT_VALUE = DATA_STRUCTURED_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE__PROPERTY = DATA_STRUCTURED_TYPE__PROPERTY;
+
+	/**
+	 * The number of structural features of the '<em>Structure Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE_FEATURE_COUNT = DATA_STRUCTURED_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Structure Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRUCTURE_TYPE_OPERATION_COUNT = DATA_STRUCTURED_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.UnionTypeImpl <em>Union Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.UnionTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getUnionType()
+	 * @generated
+	 */
+	int UNION_TYPE = 6;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE__NAME = DATA_STRUCTURED_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE__UNRESTRICTED_NAME = DATA_STRUCTURED_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE__QUALIFIED_NAME = DATA_STRUCTURED_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE__VISIBILITY = DATA_STRUCTURED_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE__KIND = DATA_STRUCTURED_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE__TYPEDEF = DATA_STRUCTURED_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE__MULTIPLICITY = DATA_STRUCTURED_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE__DEFAULT_VALUE = DATA_STRUCTURED_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE__PROPERTY = DATA_STRUCTURED_TYPE__PROPERTY;
+
+	/**
+	 * The number of structural features of the '<em>Union Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE_FEATURE_COUNT = DATA_STRUCTURED_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Union Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNION_TYPE_OPERATION_COUNT = DATA_STRUCTURED_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.ChoiceTypeImpl <em>Choice Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.ChoiceTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getChoiceType()
+	 * @generated
+	 */
+	int CHOICE_TYPE = 7;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE__NAME = DATA_STRUCTURED_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE__UNRESTRICTED_NAME = DATA_STRUCTURED_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE__QUALIFIED_NAME = DATA_STRUCTURED_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE__VISIBILITY = DATA_STRUCTURED_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE__KIND = DATA_STRUCTURED_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE__TYPEDEF = DATA_STRUCTURED_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE__MULTIPLICITY = DATA_STRUCTURED_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE__DEFAULT_VALUE = DATA_STRUCTURED_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE__PROPERTY = DATA_STRUCTURED_TYPE__PROPERTY;
+
+	/**
+	 * The number of structural features of the '<em>Choice Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE_FEATURE_COUNT = DATA_STRUCTURED_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Choice Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHOICE_TYPE_OPERATION_COUNT = DATA_STRUCTURED_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataSupportedTypeImpl <em>Data Supported Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DataSupportedTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getDataSupportedType()
+	 * @generated
+	 */
+	int DATA_SUPPORTED_TYPE = 8;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE__NAME = DATA_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE__UNRESTRICTED_NAME = DATA_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE__QUALIFIED_NAME = DATA_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE__VISIBILITY = DATA_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE__KIND = DATA_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE__TYPEDEF = DATA_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE__MULTIPLICITY = DATA_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE__DEFAULT_VALUE = DATA_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Support</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE__SUPPORT = DATA_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Data Supported Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE_FEATURE_COUNT = DATA_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Data Supported Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_SUPPORTED_TYPE_OPERATION_COUNT = DATA_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.IntervalTypeImpl <em>Interval Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.IntervalTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getIntervalType()
+	 * @generated
+	 */
+	int INTERVAL_TYPE = 9;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__NAME = DATA_SUPPORTED_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__UNRESTRICTED_NAME = DATA_SUPPORTED_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__QUALIFIED_NAME = DATA_SUPPORTED_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__VISIBILITY = DATA_SUPPORTED_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__KIND = DATA_SUPPORTED_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__TYPEDEF = DATA_SUPPORTED_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__MULTIPLICITY = DATA_SUPPORTED_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__DEFAULT_VALUE = DATA_SUPPORTED_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Support</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__SUPPORT = DATA_SUPPORTED_TYPE__SUPPORT;
+
+	/**
+	 * The feature id for the '<em><b>Lopen</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__LOPEN = DATA_SUPPORTED_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Ropen</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__ROPEN = DATA_SUPPORTED_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Infimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__INFIMUM = DATA_SUPPORTED_TYPE_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Supremum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE__SUPREMUM = DATA_SUPPORTED_TYPE_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Interval Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE_FEATURE_COUNT = DATA_SUPPORTED_TYPE_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Interval Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERVAL_TYPE_OPERATION_COUNT = DATA_SUPPORTED_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.CollectionTypeImpl <em>Collection Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.CollectionTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getCollectionType()
+	 * @generated
+	 */
+	int COLLECTION_TYPE = 10;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__NAME = DATA_SUPPORTED_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__UNRESTRICTED_NAME = DATA_SUPPORTED_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__QUALIFIED_NAME = DATA_SUPPORTED_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__VISIBILITY = DATA_SUPPORTED_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__KIND = DATA_SUPPORTED_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__TYPEDEF = DATA_SUPPORTED_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__MULTIPLICITY = DATA_SUPPORTED_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__DEFAULT_VALUE = DATA_SUPPORTED_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Support</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__SUPPORT = DATA_SUPPORTED_TYPE__SUPPORT;
+
+	/**
+	 * The feature id for the '<em><b>Container</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__CONTAINER = DATA_SUPPORTED_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__SIZE = DATA_SUPPORTED_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Unbounded</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE__UNBOUNDED = DATA_SUPPORTED_TYPE_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Collection Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE_FEATURE_COUNT = DATA_SUPPORTED_TYPE_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Collection Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_TYPE_OPERATION_COUNT = DATA_SUPPORTED_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTypeImpl <em>Primitive Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveType()
+	 * @generated
+	 */
+	int PRIMITIVE_TYPE = 11;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE__NAME = DATA_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE__UNRESTRICTED_NAME = DATA_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE__QUALIFIED_NAME = DATA_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE__VISIBILITY = DATA_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE__KIND = DATA_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE__TYPEDEF = DATA_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE__MULTIPLICITY = DATA_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE__DEFAULT_VALUE = DATA_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE_FEATURE_COUNT = DATA_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Primitive Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TYPE_OPERATION_COUNT = DATA_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveBooleanTypeImpl <em>Primitive Boolean Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveBooleanTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveBooleanType()
+	 * @generated
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE = 12;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE__NAME = PRIMITIVE_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE__UNRESTRICTED_NAME = PRIMITIVE_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE__QUALIFIED_NAME = PRIMITIVE_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE__VISIBILITY = PRIMITIVE_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE__KIND = PRIMITIVE_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE__TYPEDEF = PRIMITIVE_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE__MULTIPLICITY = PRIMITIVE_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE__DEFAULT_VALUE = PRIMITIVE_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Boolean Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE_FEATURE_COUNT = PRIMITIVE_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Primitive Boolean Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_BOOLEAN_TYPE_OPERATION_COUNT = PRIMITIVE_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveNumberTypeImpl <em>Primitive Number Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveNumberTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveNumberType()
+	 * @generated
+	 */
+	int PRIMITIVE_NUMBER_TYPE = 13;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__NAME = PRIMITIVE_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__UNRESTRICTED_NAME = PRIMITIVE_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__QUALIFIED_NAME = PRIMITIVE_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__VISIBILITY = PRIMITIVE_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__KIND = PRIMITIVE_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__TYPEDEF = PRIMITIVE_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__MULTIPLICITY = PRIMITIVE_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__DEFAULT_VALUE = PRIMITIVE_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Sign</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__SIGN = PRIMITIVE_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE__SIZE = PRIMITIVE_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Number Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE_FEATURE_COUNT = PRIMITIVE_TYPE_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Primitive Number Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_NUMBER_TYPE_OPERATION_COUNT = PRIMITIVE_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveIntegerTypeImpl <em>Primitive Integer Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveIntegerTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveIntegerType()
+	 * @generated
+	 */
+	int PRIMITIVE_INTEGER_TYPE = 14;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__NAME = PRIMITIVE_NUMBER_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__UNRESTRICTED_NAME = PRIMITIVE_NUMBER_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__QUALIFIED_NAME = PRIMITIVE_NUMBER_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__VISIBILITY = PRIMITIVE_NUMBER_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__KIND = PRIMITIVE_NUMBER_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__TYPEDEF = PRIMITIVE_NUMBER_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__MULTIPLICITY = PRIMITIVE_NUMBER_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__DEFAULT_VALUE = PRIMITIVE_NUMBER_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Sign</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__SIGN = PRIMITIVE_NUMBER_TYPE__SIGN;
+
+	/**
+	 * The feature id for the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE__SIZE = PRIMITIVE_NUMBER_TYPE__SIZE;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Integer Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE_FEATURE_COUNT = PRIMITIVE_NUMBER_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Primitive Integer Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INTEGER_TYPE_OPERATION_COUNT = PRIMITIVE_NUMBER_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveRationalTypeImpl <em>Primitive Rational Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveRationalTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveRationalType()
+	 * @generated
+	 */
+	int PRIMITIVE_RATIONAL_TYPE = 15;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__NAME = PRIMITIVE_NUMBER_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__UNRESTRICTED_NAME = PRIMITIVE_NUMBER_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__QUALIFIED_NAME = PRIMITIVE_NUMBER_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__VISIBILITY = PRIMITIVE_NUMBER_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__KIND = PRIMITIVE_NUMBER_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__TYPEDEF = PRIMITIVE_NUMBER_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__MULTIPLICITY = PRIMITIVE_NUMBER_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__DEFAULT_VALUE = PRIMITIVE_NUMBER_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Sign</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__SIGN = PRIMITIVE_NUMBER_TYPE__SIGN;
+
+	/**
+	 * The feature id for the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE__SIZE = PRIMITIVE_NUMBER_TYPE__SIZE;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Rational Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE_FEATURE_COUNT = PRIMITIVE_NUMBER_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Primitive Rational Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_RATIONAL_TYPE_OPERATION_COUNT = PRIMITIVE_NUMBER_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveFloatTypeImpl <em>Primitive Float Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveFloatTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveFloatType()
+	 * @generated
+	 */
+	int PRIMITIVE_FLOAT_TYPE = 16;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__NAME = PRIMITIVE_NUMBER_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__UNRESTRICTED_NAME = PRIMITIVE_NUMBER_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__QUALIFIED_NAME = PRIMITIVE_NUMBER_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__VISIBILITY = PRIMITIVE_NUMBER_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__KIND = PRIMITIVE_NUMBER_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__TYPEDEF = PRIMITIVE_NUMBER_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__MULTIPLICITY = PRIMITIVE_NUMBER_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__DEFAULT_VALUE = PRIMITIVE_NUMBER_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Sign</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__SIGN = PRIMITIVE_NUMBER_TYPE__SIGN;
+
+	/**
+	 * The feature id for the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE__SIZE = PRIMITIVE_NUMBER_TYPE__SIZE;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Float Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE_FEATURE_COUNT = PRIMITIVE_NUMBER_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Primitive Float Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_FLOAT_TYPE_OPERATION_COUNT = PRIMITIVE_NUMBER_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveRealTypeImpl <em>Primitive Real Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveRealTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveRealType()
+	 * @generated
+	 */
+	int PRIMITIVE_REAL_TYPE = 17;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__NAME = PRIMITIVE_NUMBER_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__UNRESTRICTED_NAME = PRIMITIVE_NUMBER_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__QUALIFIED_NAME = PRIMITIVE_NUMBER_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__VISIBILITY = PRIMITIVE_NUMBER_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__KIND = PRIMITIVE_NUMBER_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__TYPEDEF = PRIMITIVE_NUMBER_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__MULTIPLICITY = PRIMITIVE_NUMBER_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__DEFAULT_VALUE = PRIMITIVE_NUMBER_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Sign</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__SIGN = PRIMITIVE_NUMBER_TYPE__SIGN;
+
+	/**
+	 * The feature id for the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE__SIZE = PRIMITIVE_NUMBER_TYPE__SIZE;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Real Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE_FEATURE_COUNT = PRIMITIVE_NUMBER_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Primitive Real Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_REAL_TYPE_OPERATION_COUNT = PRIMITIVE_NUMBER_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTimeTypeImpl <em>Primitive Time Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTimeTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveTimeType()
+	 * @generated
+	 */
+	int PRIMITIVE_TIME_TYPE = 18;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__NAME = PRIMITIVE_NUMBER_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__UNRESTRICTED_NAME = PRIMITIVE_NUMBER_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__QUALIFIED_NAME = PRIMITIVE_NUMBER_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__VISIBILITY = PRIMITIVE_NUMBER_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__KIND = PRIMITIVE_NUMBER_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__TYPEDEF = PRIMITIVE_NUMBER_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__MULTIPLICITY = PRIMITIVE_NUMBER_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__DEFAULT_VALUE = PRIMITIVE_NUMBER_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Sign</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__SIGN = PRIMITIVE_NUMBER_TYPE__SIGN;
+
+	/**
+	 * The feature id for the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__SIZE = PRIMITIVE_NUMBER_TYPE__SIZE;
+
+	/**
+	 * The feature id for the '<em><b>Clock</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__CLOCK = PRIMITIVE_NUMBER_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Support</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE__SUPPORT = PRIMITIVE_NUMBER_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Time Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE_FEATURE_COUNT = PRIMITIVE_NUMBER_TYPE_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Primitive Time Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_TIME_TYPE_OPERATION_COUNT = PRIMITIVE_NUMBER_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveCharacterTypeImpl <em>Primitive Character Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveCharacterTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveCharacterType()
+	 * @generated
+	 */
+	int PRIMITIVE_CHARACTER_TYPE = 19;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE__NAME = PRIMITIVE_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE__UNRESTRICTED_NAME = PRIMITIVE_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE__QUALIFIED_NAME = PRIMITIVE_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE__VISIBILITY = PRIMITIVE_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE__KIND = PRIMITIVE_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE__TYPEDEF = PRIMITIVE_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE__MULTIPLICITY = PRIMITIVE_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE__DEFAULT_VALUE = PRIMITIVE_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Character Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE_FEATURE_COUNT = PRIMITIVE_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Primitive Character Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_CHARACTER_TYPE_OPERATION_COUNT = PRIMITIVE_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveStringTypeImpl <em>Primitive String Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveStringTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveStringType()
+	 * @generated
+	 */
+	int PRIMITIVE_STRING_TYPE = 20;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE__NAME = PRIMITIVE_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE__UNRESTRICTED_NAME = PRIMITIVE_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE__QUALIFIED_NAME = PRIMITIVE_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE__VISIBILITY = PRIMITIVE_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE__KIND = PRIMITIVE_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE__TYPEDEF = PRIMITIVE_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE__MULTIPLICITY = PRIMITIVE_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE__DEFAULT_VALUE = PRIMITIVE_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE__SIZE = PRIMITIVE_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Primitive String Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE_FEATURE_COUNT = PRIMITIVE_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Primitive String Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_STRING_TYPE_OPERATION_COUNT = PRIMITIVE_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveInstanceTypeImpl <em>Primitive Instance Type</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveInstanceTypeImpl
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveInstanceType()
+	 * @generated
+	 */
+	int PRIMITIVE_INSTANCE_TYPE = 21;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__NAME = PRIMITIVE_TYPE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__UNRESTRICTED_NAME = PRIMITIVE_TYPE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__QUALIFIED_NAME = PRIMITIVE_TYPE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__VISIBILITY = PRIMITIVE_TYPE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__KIND = PRIMITIVE_TYPE__KIND;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__TYPEDEF = PRIMITIVE_TYPE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Multiplicity</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__MULTIPLICITY = PRIMITIVE_TYPE__MULTIPLICITY;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__DEFAULT_VALUE = PRIMITIVE_TYPE__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Expected</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__EXPECTED = PRIMITIVE_TYPE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Model</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE__MODEL = PRIMITIVE_TYPE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Primitive Instance Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE_FEATURE_COUNT = PRIMITIVE_TYPE_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Primitive Instance Type</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_INSTANCE_TYPE_OPERATION_COUNT = PRIMITIVE_TYPE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind <em>Primitive Type Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveTypeKind()
+	 * @generated
+	 */
+	int PRIMITIVE_TYPE_KIND = 22;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionKind <em>Collection Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionKind
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getCollectionKind()
+	 * @generated
+	 */
+	int COLLECTION_KIND = 23;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign <em>Primitive Number Sign</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveNumberSign()
+	 * @generated
+	 */
+	int PRIMITIVE_NUMBER_SIGN = 24;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind <em>Primitive Instance Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind
+	 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveInstanceKind()
+	 * @generated
+	 */
+	int PRIMITIVE_INSTANCE_KIND = 25;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.DataType <em>Data Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataType
+	 * @generated
+	 */
+	EClass getDataType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.DataType#getKind <em>Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataType#getKind()
+	 * @see #getDataType()
+	 * @generated
+	 */
+	EAttribute getDataType_Kind();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.DataType#isTypedef <em>Typedef</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Typedef</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataType#isTypedef()
+	 * @see #getDataType()
+	 * @generated
+	 */
+	EAttribute getDataType_Typedef();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.datatype.DataType#getMultiplicity <em>Multiplicity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Multiplicity</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataType#getMultiplicity()
+	 * @see #getDataType()
+	 * @generated
+	 */
+	EReference getDataType_Multiplicity();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.datatype.DataType#getDefaultValue <em>Default Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Default Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataType#getDefaultValue()
+	 * @see #getDataType()
+	 * @generated
+	 */
+	EReference getDataType_DefaultValue();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.DataTypeReference <em>Data Type Reference</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Type Reference</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataTypeReference
+	 * @generated
+	 */
+	EClass getDataTypeReference();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.datatype.DataTypeReference#getTyperef <em>Typeref</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Typeref</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataTypeReference#getTyperef()
+	 * @see #getDataTypeReference()
+	 * @generated
+	 */
+	EReference getDataTypeReference_Typeref();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.datatype.DataTypeReference#getSupport <em>Support</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Support</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataTypeReference#getSupport()
+	 * @see #getDataTypeReference()
+	 * @generated
+	 */
+	EReference getDataTypeReference_Support();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral <em>Enumeration Literal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Enumeration Literal</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral
+	 * @generated
+	 */
+	EClass getEnumerationLiteral();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral#getValue()
+	 * @see #getEnumerationLiteral()
+	 * @generated
+	 */
+	EReference getEnumerationLiteral_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.EnumerationType <em>Enumeration Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Enumeration Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.EnumerationType
+	 * @generated
+	 */
+	EClass getEnumerationType();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.datatype.EnumerationType#getLiteral <em>Literal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Literal</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.EnumerationType#getLiteral()
+	 * @see #getEnumerationType()
+	 * @generated
+	 */
+	EReference getEnumerationType_Literal();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.DataStructuredType <em>Data Structured Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Structured Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataStructuredType
+	 * @generated
+	 */
+	EClass getDataStructuredType();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.datatype.DataStructuredType#getProperty <em>Property</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Property</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataStructuredType#getProperty()
+	 * @see #getDataStructuredType()
+	 * @generated
+	 */
+	EReference getDataStructuredType_Property();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.StructureType <em>Structure Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Structure Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.StructureType
+	 * @generated
+	 */
+	EClass getStructureType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.UnionType <em>Union Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Union Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.UnionType
+	 * @generated
+	 */
+	EClass getUnionType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.ChoiceType <em>Choice Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Choice Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.ChoiceType
+	 * @generated
+	 */
+	EClass getChoiceType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.DataSupportedType <em>Data Supported Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Supported Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataSupportedType
+	 * @generated
+	 */
+	EClass getDataSupportedType();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.datatype.DataSupportedType#getSupport <em>Support</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Support</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataSupportedType#getSupport()
+	 * @see #getDataSupportedType()
+	 * @generated
+	 */
+	EReference getDataSupportedType_Support();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType <em>Interval Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Interval Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.IntervalType
+	 * @generated
+	 */
+	EClass getIntervalType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#isLopen <em>Lopen</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Lopen</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.IntervalType#isLopen()
+	 * @see #getIntervalType()
+	 * @generated
+	 */
+	EAttribute getIntervalType_Lopen();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#isRopen <em>Ropen</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Ropen</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.IntervalType#isRopen()
+	 * @see #getIntervalType()
+	 * @generated
+	 */
+	EAttribute getIntervalType_Ropen();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#getInfimum <em>Infimum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Infimum</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.IntervalType#getInfimum()
+	 * @see #getIntervalType()
+	 * @generated
+	 */
+	EReference getIntervalType_Infimum();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#getSupremum <em>Supremum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Supremum</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.IntervalType#getSupremum()
+	 * @see #getIntervalType()
+	 * @generated
+	 */
+	EReference getIntervalType_Supremum();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType <em>Collection Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Collection Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionType
+	 * @generated
+	 */
+	EClass getCollectionType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType#getContainer <em>Container</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Container</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionType#getContainer()
+	 * @see #getCollectionType()
+	 * @generated
+	 */
+	EAttribute getCollectionType_Container();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType#getSize <em>Size</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Size</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionType#getSize()
+	 * @see #getCollectionType()
+	 * @generated
+	 */
+	EAttribute getCollectionType_Size();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType#isUnbounded <em>Unbounded</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Unbounded</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionType#isUnbounded()
+	 * @see #getCollectionType()
+	 * @generated
+	 */
+	EAttribute getCollectionType_Unbounded();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveType <em>Primitive Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveType
+	 * @generated
+	 */
+	EClass getPrimitiveType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType <em>Primitive Boolean Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Boolean Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType
+	 * @generated
+	 */
+	EClass getPrimitiveBooleanType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType <em>Primitive Number Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Number Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType
+	 * @generated
+	 */
+	EClass getPrimitiveNumberType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType#getSign <em>Sign</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Sign</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType#getSign()
+	 * @see #getPrimitiveNumberType()
+	 * @generated
+	 */
+	EAttribute getPrimitiveNumberType_Sign();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType#getSize <em>Size</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Size</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType#getSize()
+	 * @see #getPrimitiveNumberType()
+	 * @generated
+	 */
+	EAttribute getPrimitiveNumberType_Size();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType <em>Primitive Integer Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Integer Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType
+	 * @generated
+	 */
+	EClass getPrimitiveIntegerType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType <em>Primitive Rational Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Rational Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType
+	 * @generated
+	 */
+	EClass getPrimitiveRationalType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType <em>Primitive Float Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Float Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType
+	 * @generated
+	 */
+	EClass getPrimitiveFloatType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType <em>Primitive Real Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Real Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType
+	 * @generated
+	 */
+	EClass getPrimitiveRealType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType <em>Primitive Time Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Time Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType
+	 * @generated
+	 */
+	EClass getPrimitiveTimeType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType#isClock <em>Clock</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Clock</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType#isClock()
+	 * @see #getPrimitiveTimeType()
+	 * @generated
+	 */
+	EAttribute getPrimitiveTimeType_Clock();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType#getSupport <em>Support</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Support</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType#getSupport()
+	 * @see #getPrimitiveTimeType()
+	 * @generated
+	 */
+	EReference getPrimitiveTimeType_Support();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType <em>Primitive Character Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Character Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType
+	 * @generated
+	 */
+	EClass getPrimitiveCharacterType();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType <em>Primitive String Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive String Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType
+	 * @generated
+	 */
+	EClass getPrimitiveStringType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType#getSize <em>Size</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Size</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType#getSize()
+	 * @see #getPrimitiveStringType()
+	 * @generated
+	 */
+	EAttribute getPrimitiveStringType_Size();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType <em>Primitive Instance Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Primitive Instance Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType
+	 * @generated
+	 */
+	EClass getPrimitiveInstanceType();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType#getExpected <em>Expected</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Expected</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType#getExpected()
+	 * @see #getPrimitiveInstanceType()
+	 * @generated
+	 */
+	EAttribute getPrimitiveInstanceType_Expected();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType#getModel <em>Model</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Model</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType#getModel()
+	 * @see #getPrimitiveInstanceType()
+	 * @generated
+	 */
+	EReference getPrimitiveInstanceType_Model();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind <em>Primitive Type Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Primitive Type Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind
+	 * @generated
+	 */
+	EEnum getPrimitiveTypeKind();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionKind <em>Collection Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Collection Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionKind
+	 * @generated
+	 */
+	EEnum getCollectionKind();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign <em>Primitive Number Sign</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Primitive Number Sign</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign
+	 * @generated
+	 */
+	EEnum getPrimitiveNumberSign();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind <em>Primitive Instance Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Primitive Instance Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind
+	 * @generated
+	 */
+	EEnum getPrimitiveInstanceKind();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	DatatypeFactory getDatatypeFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeImpl <em>Data Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getDataType()
+		 * @generated
+		 */
+		EClass DATA_TYPE = eINSTANCE.getDataType();
+
+		/**
+		 * The meta object literal for the '<em><b>Kind</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_TYPE__KIND = eINSTANCE.getDataType_Kind();
+
+		/**
+		 * The meta object literal for the '<em><b>Typedef</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_TYPE__TYPEDEF = eINSTANCE.getDataType_Typedef();
+
+		/**
+		 * The meta object literal for the '<em><b>Multiplicity</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_TYPE__MULTIPLICITY = eINSTANCE.getDataType_Multiplicity();
+
+		/**
+		 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_TYPE__DEFAULT_VALUE = eINSTANCE.getDataType_DefaultValue();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeReferenceImpl <em>Data Type Reference</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeReferenceImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getDataTypeReference()
+		 * @generated
+		 */
+		EClass DATA_TYPE_REFERENCE = eINSTANCE.getDataTypeReference();
+
+		/**
+		 * The meta object literal for the '<em><b>Typeref</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_TYPE_REFERENCE__TYPEREF = eINSTANCE.getDataTypeReference_Typeref();
+
+		/**
+		 * The meta object literal for the '<em><b>Support</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_TYPE_REFERENCE__SUPPORT = eINSTANCE.getDataTypeReference_Support();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationLiteralImpl <em>Enumeration Literal</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationLiteralImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getEnumerationLiteral()
+		 * @generated
+		 */
+		EClass ENUMERATION_LITERAL = eINSTANCE.getEnumerationLiteral();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ENUMERATION_LITERAL__VALUE = eINSTANCE.getEnumerationLiteral_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationTypeImpl <em>Enumeration Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getEnumerationType()
+		 * @generated
+		 */
+		EClass ENUMERATION_TYPE = eINSTANCE.getEnumerationType();
+
+		/**
+		 * The meta object literal for the '<em><b>Literal</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ENUMERATION_TYPE__LITERAL = eINSTANCE.getEnumerationType_Literal();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataStructuredTypeImpl <em>Data Structured Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DataStructuredTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getDataStructuredType()
+		 * @generated
+		 */
+		EClass DATA_STRUCTURED_TYPE = eINSTANCE.getDataStructuredType();
+
+		/**
+		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_STRUCTURED_TYPE__PROPERTY = eINSTANCE.getDataStructuredType_Property();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.StructureTypeImpl <em>Structure Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.StructureTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getStructureType()
+		 * @generated
+		 */
+		EClass STRUCTURE_TYPE = eINSTANCE.getStructureType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.UnionTypeImpl <em>Union Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.UnionTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getUnionType()
+		 * @generated
+		 */
+		EClass UNION_TYPE = eINSTANCE.getUnionType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.ChoiceTypeImpl <em>Choice Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.ChoiceTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getChoiceType()
+		 * @generated
+		 */
+		EClass CHOICE_TYPE = eINSTANCE.getChoiceType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataSupportedTypeImpl <em>Data Supported Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DataSupportedTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getDataSupportedType()
+		 * @generated
+		 */
+		EClass DATA_SUPPORTED_TYPE = eINSTANCE.getDataSupportedType();
+
+		/**
+		 * The meta object literal for the '<em><b>Support</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_SUPPORTED_TYPE__SUPPORT = eINSTANCE.getDataSupportedType_Support();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.IntervalTypeImpl <em>Interval Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.IntervalTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getIntervalType()
+		 * @generated
+		 */
+		EClass INTERVAL_TYPE = eINSTANCE.getIntervalType();
+
+		/**
+		 * The meta object literal for the '<em><b>Lopen</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute INTERVAL_TYPE__LOPEN = eINSTANCE.getIntervalType_Lopen();
+
+		/**
+		 * The meta object literal for the '<em><b>Ropen</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute INTERVAL_TYPE__ROPEN = eINSTANCE.getIntervalType_Ropen();
+
+		/**
+		 * The meta object literal for the '<em><b>Infimum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INTERVAL_TYPE__INFIMUM = eINSTANCE.getIntervalType_Infimum();
+
+		/**
+		 * The meta object literal for the '<em><b>Supremum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INTERVAL_TYPE__SUPREMUM = eINSTANCE.getIntervalType_Supremum();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.CollectionTypeImpl <em>Collection Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.CollectionTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getCollectionType()
+		 * @generated
+		 */
+		EClass COLLECTION_TYPE = eINSTANCE.getCollectionType();
+
+		/**
+		 * The meta object literal for the '<em><b>Container</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute COLLECTION_TYPE__CONTAINER = eINSTANCE.getCollectionType_Container();
+
+		/**
+		 * The meta object literal for the '<em><b>Size</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute COLLECTION_TYPE__SIZE = eINSTANCE.getCollectionType_Size();
+
+		/**
+		 * The meta object literal for the '<em><b>Unbounded</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute COLLECTION_TYPE__UNBOUNDED = eINSTANCE.getCollectionType_Unbounded();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTypeImpl <em>Primitive Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_TYPE = eINSTANCE.getPrimitiveType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveBooleanTypeImpl <em>Primitive Boolean Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveBooleanTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveBooleanType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_BOOLEAN_TYPE = eINSTANCE.getPrimitiveBooleanType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveNumberTypeImpl <em>Primitive Number Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveNumberTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveNumberType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_NUMBER_TYPE = eINSTANCE.getPrimitiveNumberType();
+
+		/**
+		 * The meta object literal for the '<em><b>Sign</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute PRIMITIVE_NUMBER_TYPE__SIGN = eINSTANCE.getPrimitiveNumberType_Sign();
+
+		/**
+		 * The meta object literal for the '<em><b>Size</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute PRIMITIVE_NUMBER_TYPE__SIZE = eINSTANCE.getPrimitiveNumberType_Size();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveIntegerTypeImpl <em>Primitive Integer Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveIntegerTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveIntegerType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_INTEGER_TYPE = eINSTANCE.getPrimitiveIntegerType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveRationalTypeImpl <em>Primitive Rational Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveRationalTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveRationalType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_RATIONAL_TYPE = eINSTANCE.getPrimitiveRationalType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveFloatTypeImpl <em>Primitive Float Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveFloatTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveFloatType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_FLOAT_TYPE = eINSTANCE.getPrimitiveFloatType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveRealTypeImpl <em>Primitive Real Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveRealTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveRealType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_REAL_TYPE = eINSTANCE.getPrimitiveRealType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTimeTypeImpl <em>Primitive Time Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTimeTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveTimeType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_TIME_TYPE = eINSTANCE.getPrimitiveTimeType();
+
+		/**
+		 * The meta object literal for the '<em><b>Clock</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute PRIMITIVE_TIME_TYPE__CLOCK = eINSTANCE.getPrimitiveTimeType_Clock();
+
+		/**
+		 * The meta object literal for the '<em><b>Support</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PRIMITIVE_TIME_TYPE__SUPPORT = eINSTANCE.getPrimitiveTimeType_Support();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveCharacterTypeImpl <em>Primitive Character Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveCharacterTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveCharacterType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_CHARACTER_TYPE = eINSTANCE.getPrimitiveCharacterType();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveStringTypeImpl <em>Primitive String Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveStringTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveStringType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_STRING_TYPE = eINSTANCE.getPrimitiveStringType();
+
+		/**
+		 * The meta object literal for the '<em><b>Size</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute PRIMITIVE_STRING_TYPE__SIZE = eINSTANCE.getPrimitiveStringType_Size();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveInstanceTypeImpl <em>Primitive Instance Type</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveInstanceTypeImpl
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveInstanceType()
+		 * @generated
+		 */
+		EClass PRIMITIVE_INSTANCE_TYPE = eINSTANCE.getPrimitiveInstanceType();
+
+		/**
+		 * The meta object literal for the '<em><b>Expected</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute PRIMITIVE_INSTANCE_TYPE__EXPECTED = eINSTANCE.getPrimitiveInstanceType_Expected();
+
+		/**
+		 * The meta object literal for the '<em><b>Model</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PRIMITIVE_INSTANCE_TYPE__MODEL = eINSTANCE.getPrimitiveInstanceType_Model();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind <em>Primitive Type Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveTypeKind()
+		 * @generated
+		 */
+		EEnum PRIMITIVE_TYPE_KIND = eINSTANCE.getPrimitiveTypeKind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionKind <em>Collection Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionKind
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getCollectionKind()
+		 * @generated
+		 */
+		EEnum COLLECTION_KIND = eINSTANCE.getCollectionKind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign <em>Primitive Number Sign</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveNumberSign()
+		 * @generated
+		 */
+		EEnum PRIMITIVE_NUMBER_SIGN = eINSTANCE.getPrimitiveNumberSign();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind <em>Primitive Instance Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind
+		 * @see org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl#getPrimitiveInstanceKind()
+		 * @generated
+		 */
+		EEnum PRIMITIVE_INSTANCE_KIND = eINSTANCE.getPrimitiveInstanceKind();
+
+	}
+
+} //DatatypePackage
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/EnumerationLiteral.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/EnumerationLiteral.java
new file mode 100644
index 0000000..4497408
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/EnumerationLiteral.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.LiteralExpression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Enumeration Literal</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getEnumerationLiteral()
+ * @model
+ * @generated
+ */
+public interface EnumerationLiteral extends NamedElement {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' containment reference.
+	 * @see #setValue(LiteralExpression)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getEnumerationLiteral_Value()
+	 * @model containment="true"
+	 * @generated
+	 */
+	LiteralExpression getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral#getValue <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' containment reference.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(LiteralExpression value);
+
+} // EnumerationLiteral
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/EnumerationType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/EnumerationType.java
new file mode 100644
index 0000000..b5ee250
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/EnumerationType.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Enumeration Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.EnumerationType#getLiteral <em>Literal</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getEnumerationType()
+ * @model
+ * @generated
+ */
+public interface EnumerationType extends DataType {
+	/**
+	 * Returns the value of the '<em><b>Literal</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Literal</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Literal</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getEnumerationType_Literal()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<EnumerationLiteral> getLiteral();
+
+} // EnumerationType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/IntervalType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/IntervalType.java
new file mode 100644
index 0000000..1402195
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/IntervalType.java
@@ -0,0 +1,141 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Interval Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#isLopen <em>Lopen</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#isRopen <em>Ropen</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#getInfimum <em>Infimum</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#getSupremum <em>Supremum</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getIntervalType()
+ * @model
+ * @generated
+ */
+public interface IntervalType extends DataSupportedType {
+	/**
+	 * Returns the value of the '<em><b>Lopen</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Lopen</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Lopen</em>' attribute.
+	 * @see #setLopen(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getIntervalType_Lopen()
+	 * @model required="true"
+	 * @generated
+	 */
+	boolean isLopen();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#isLopen <em>Lopen</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Lopen</em>' attribute.
+	 * @see #isLopen()
+	 * @generated
+	 */
+	void setLopen(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Ropen</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Ropen</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Ropen</em>' attribute.
+	 * @see #setRopen(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getIntervalType_Ropen()
+	 * @model required="true"
+	 * @generated
+	 */
+	boolean isRopen();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#isRopen <em>Ropen</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Ropen</em>' attribute.
+	 * @see #isRopen()
+	 * @generated
+	 */
+	void setRopen(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Infimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Infimum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Infimum</em>' containment reference.
+	 * @see #setInfimum(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getIntervalType_Infimum()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getInfimum();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#getInfimum <em>Infimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Infimum</em>' containment reference.
+	 * @see #getInfimum()
+	 * @generated
+	 */
+	void setInfimum(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Supremum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Supremum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Supremum</em>' containment reference.
+	 * @see #setSupremum(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getIntervalType_Supremum()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getSupremum();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType#getSupremum <em>Supremum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Supremum</em>' containment reference.
+	 * @see #getSupremum()
+	 * @generated
+	 */
+	void setSupremum(Expression value);
+
+} // IntervalType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveBooleanType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveBooleanType.java
new file mode 100644
index 0000000..99acbdb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveBooleanType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Boolean Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveBooleanType()
+ * @model
+ * @generated
+ */
+public interface PrimitiveBooleanType extends PrimitiveType {
+} // PrimitiveBooleanType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveCharacterType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveCharacterType.java
new file mode 100644
index 0000000..08ce982
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveCharacterType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Character Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveCharacterType()
+ * @model
+ * @generated
+ */
+public interface PrimitiveCharacterType extends PrimitiveType {
+} // PrimitiveCharacterType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveFloatType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveFloatType.java
new file mode 100644
index 0000000..d1f9d62
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveFloatType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Float Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveFloatType()
+ * @model
+ * @generated
+ */
+public interface PrimitiveFloatType extends PrimitiveNumberType {
+} // PrimitiveFloatType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveInstanceKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveInstanceKind.java
new file mode 100644
index 0000000..f7dc3d0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveInstanceKind.java
@@ -0,0 +1,386 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Primitive Instance Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveInstanceKind()
+ * @model
+ * @generated
+ */
+public enum PrimitiveInstanceKind implements Enumerator {
+	/**
+	 * The '<em><b>Buffer</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BUFFER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BUFFER(0, "buffer", "buffer"),
+
+	/**
+	 * The '<em><b>Message</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MESSAGE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MESSAGE(1, "message", "message"),
+
+	/**
+	 * The '<em><b>Port</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PORT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PORT(2, "port", "port"),
+
+	/**
+	 * The '<em><b>Signal</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SIGNAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SIGNAL(3, "signal", "signal"),
+
+	/**
+	 * The '<em><b>Com point</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #COM_POINT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	COM_POINT(4, "com_point", "com_point"),
+
+	/**
+	 * The '<em><b>Channel</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CHANNEL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	CHANNEL(5, "channel", "channel"),
+
+	/**
+	 * The '<em><b>Machine</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MACHINE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MACHINE(6, "machine", "machine"),
+
+	/**
+	 * The '<em><b>Vertex</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #VERTEX_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	VERTEX(7, "vertex", "vertex");
+
+	/**
+	 * The '<em><b>Buffer</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Buffer</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BUFFER
+	 * @model name="buffer"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BUFFER_VALUE = 0;
+
+	/**
+	 * The '<em><b>Message</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Message</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MESSAGE
+	 * @model name="message"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MESSAGE_VALUE = 1;
+
+	/**
+	 * The '<em><b>Port</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Port</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PORT
+	 * @model name="port"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PORT_VALUE = 2;
+
+	/**
+	 * The '<em><b>Signal</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Signal</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SIGNAL
+	 * @model name="signal"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SIGNAL_VALUE = 3;
+
+	/**
+	 * The '<em><b>Com point</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Com point</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #COM_POINT
+	 * @model name="com_point"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int COM_POINT_VALUE = 4;
+
+	/**
+	 * The '<em><b>Channel</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Channel</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #CHANNEL
+	 * @model name="channel"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int CHANNEL_VALUE = 5;
+
+	/**
+	 * The '<em><b>Machine</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Machine</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MACHINE
+	 * @model name="machine"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MACHINE_VALUE = 6;
+
+	/**
+	 * The '<em><b>Vertex</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Vertex</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #VERTEX
+	 * @model name="vertex"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int VERTEX_VALUE = 7;
+
+	/**
+	 * An array of all the '<em><b>Primitive Instance Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final PrimitiveInstanceKind[] VALUES_ARRAY =
+		new PrimitiveInstanceKind[] {
+			BUFFER,
+			MESSAGE,
+			PORT,
+			SIGNAL,
+			COM_POINT,
+			CHANNEL,
+			MACHINE,
+			VERTEX,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Primitive Instance Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<PrimitiveInstanceKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Primitive Instance Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PrimitiveInstanceKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PrimitiveInstanceKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Primitive Instance Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PrimitiveInstanceKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PrimitiveInstanceKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Primitive Instance Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PrimitiveInstanceKind get(int value) {
+		switch (value) {
+			case BUFFER_VALUE: return BUFFER;
+			case MESSAGE_VALUE: return MESSAGE;
+			case PORT_VALUE: return PORT;
+			case SIGNAL_VALUE: return SIGNAL;
+			case COM_POINT_VALUE: return COM_POINT;
+			case CHANNEL_VALUE: return CHANNEL;
+			case MACHINE_VALUE: return MACHINE;
+			case VERTEX_VALUE: return VERTEX;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private PrimitiveInstanceKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //PrimitiveInstanceKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveInstanceType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveInstanceType.java
new file mode 100644
index 0000000..31bb5a0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveInstanceType.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Instance Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType#getExpected <em>Expected</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType#getModel <em>Model</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveInstanceType()
+ * @model
+ * @generated
+ */
+public interface PrimitiveInstanceType extends PrimitiveType {
+	/**
+	 * Returns the value of the '<em><b>Expected</b></em>' attribute.
+	 * The default value is <code>"machine"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Expected</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Expected</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind
+	 * @see #setExpected(PrimitiveInstanceKind)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveInstanceType_Expected()
+	 * @model default="machine"
+	 * @generated
+	 */
+	PrimitiveInstanceKind getExpected();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType#getExpected <em>Expected</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Expected</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind
+	 * @see #getExpected()
+	 * @generated
+	 */
+	void setExpected(PrimitiveInstanceKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Model</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Model</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Model</em>' reference.
+	 * @see #setModel(NamedElement)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveInstanceType_Model()
+	 * @model
+	 * @generated
+	 */
+	NamedElement getModel();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType#getModel <em>Model</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Model</em>' reference.
+	 * @see #getModel()
+	 * @generated
+	 */
+	void setModel(NamedElement value);
+
+} // PrimitiveInstanceType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveIntegerType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveIntegerType.java
new file mode 100644
index 0000000..82ddb63
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveIntegerType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Integer Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveIntegerType()
+ * @model
+ * @generated
+ */
+public interface PrimitiveIntegerType extends PrimitiveNumberType {
+} // PrimitiveIntegerType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveNumberSign.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveNumberSign.java
new file mode 100644
index 0000000..09d0e6f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveNumberSign.java
@@ -0,0 +1,305 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Primitive Number Sign</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveNumberSign()
+ * @model
+ * @generated
+ */
+public enum PrimitiveNumberSign implements Enumerator {
+	/**
+	 * The '<em><b>Any</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ANY_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ANY(0, "any", "any"),
+
+	/**
+	 * The '<em><b>Negative</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #NEGATIVE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	NEGATIVE(-1, "negative", "negative"),
+
+	/**
+	 * The '<em><b>Negative strict</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #NEGATIVE_STRICT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	NEGATIVE_STRICT(-2, "negative_strict", "negative_strict"),
+
+	/**
+	 * The '<em><b>Positive</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #POSITIVE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	POSITIVE(1, "positive", "positive"),
+
+	/**
+	 * The '<em><b>Positive strict</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #POSITIVE_STRICT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	POSITIVE_STRICT(2, "positive_strict", "positive_strict");
+
+	/**
+	 * The '<em><b>Any</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Any</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ANY
+	 * @model name="any"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ANY_VALUE = 0;
+
+	/**
+	 * The '<em><b>Negative</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Negative</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #NEGATIVE
+	 * @model name="negative"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int NEGATIVE_VALUE = -1;
+
+	/**
+	 * The '<em><b>Negative strict</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Negative strict</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #NEGATIVE_STRICT
+	 * @model name="negative_strict"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int NEGATIVE_STRICT_VALUE = -2;
+
+	/**
+	 * The '<em><b>Positive</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Positive</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #POSITIVE
+	 * @model name="positive"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int POSITIVE_VALUE = 1;
+
+	/**
+	 * The '<em><b>Positive strict</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Positive strict</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #POSITIVE_STRICT
+	 * @model name="positive_strict"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int POSITIVE_STRICT_VALUE = 2;
+
+	/**
+	 * An array of all the '<em><b>Primitive Number Sign</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final PrimitiveNumberSign[] VALUES_ARRAY =
+		new PrimitiveNumberSign[] {
+			ANY,
+			NEGATIVE,
+			NEGATIVE_STRICT,
+			POSITIVE,
+			POSITIVE_STRICT,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Primitive Number Sign</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<PrimitiveNumberSign> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Primitive Number Sign</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PrimitiveNumberSign get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PrimitiveNumberSign result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Primitive Number Sign</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PrimitiveNumberSign getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PrimitiveNumberSign result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Primitive Number Sign</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PrimitiveNumberSign get(int value) {
+		switch (value) {
+			case ANY_VALUE: return ANY;
+			case NEGATIVE_VALUE: return NEGATIVE;
+			case NEGATIVE_STRICT_VALUE: return NEGATIVE_STRICT;
+			case POSITIVE_VALUE: return POSITIVE;
+			case POSITIVE_STRICT_VALUE: return POSITIVE_STRICT;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private PrimitiveNumberSign(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //PrimitiveNumberSign
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveNumberType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveNumberType.java
new file mode 100644
index 0000000..af32c2d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveNumberType.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Number Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType#getSign <em>Sign</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType#getSize <em>Size</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveNumberType()
+ * @model abstract="true"
+ * @generated
+ */
+public interface PrimitiveNumberType extends PrimitiveType {
+	/**
+	 * Returns the value of the '<em><b>Sign</b></em>' attribute.
+	 * The default value is <code>"any"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Sign</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Sign</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign
+	 * @see #setSign(PrimitiveNumberSign)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveNumberType_Sign()
+	 * @model default="any"
+	 * @generated
+	 */
+	PrimitiveNumberSign getSign();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType#getSign <em>Sign</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Sign</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign
+	 * @see #getSign()
+	 * @generated
+	 */
+	void setSign(PrimitiveNumberSign value);
+
+	/**
+	 * Returns the value of the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Size</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Size</em>' attribute.
+	 * @see #setSize(int)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveNumberType_Size()
+	 * @model
+	 * @generated
+	 */
+	int getSize();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType#getSize <em>Size</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Size</em>' attribute.
+	 * @see #getSize()
+	 * @generated
+	 */
+	void setSize(int value);
+
+} // PrimitiveNumberType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveRationalType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveRationalType.java
new file mode 100644
index 0000000..de8c162
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveRationalType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Rational Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveRationalType()
+ * @model
+ * @generated
+ */
+public interface PrimitiveRationalType extends PrimitiveNumberType {
+} // PrimitiveRationalType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveRealType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveRealType.java
new file mode 100644
index 0000000..28f6af6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveRealType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Real Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveRealType()
+ * @model
+ * @generated
+ */
+public interface PrimitiveRealType extends PrimitiveNumberType {
+} // PrimitiveRealType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveStringType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveStringType.java
new file mode 100644
index 0000000..5c39694
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveStringType.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive String Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType#getSize <em>Size</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveStringType()
+ * @model
+ * @generated
+ */
+public interface PrimitiveStringType extends PrimitiveType {
+	/**
+	 * Returns the value of the '<em><b>Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Size</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Size</em>' attribute.
+	 * @see #setSize(int)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveStringType_Size()
+	 * @model
+	 * @generated
+	 */
+	int getSize();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType#getSize <em>Size</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Size</em>' attribute.
+	 * @see #getSize()
+	 * @generated
+	 */
+	void setSize(int value);
+
+} // PrimitiveStringType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveTimeType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveTimeType.java
new file mode 100644
index 0000000..366cf77
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveTimeType.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Time Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType#isClock <em>Clock</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType#getSupport <em>Support</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveTimeType()
+ * @model
+ * @generated
+ */
+public interface PrimitiveTimeType extends PrimitiveNumberType {
+	/**
+	 * Returns the value of the '<em><b>Clock</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Clock</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Clock</em>' attribute.
+	 * @see #setClock(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveTimeType_Clock()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isClock();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType#isClock <em>Clock</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Clock</em>' attribute.
+	 * @see #isClock()
+	 * @generated
+	 */
+	void setClock(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Support</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Support</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Support</em>' containment reference.
+	 * @see #setSupport(PrimitiveNumberType)
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveTimeType_Support()
+	 * @model containment="true"
+	 * @generated
+	 */
+	PrimitiveNumberType getSupport();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType#getSupport <em>Support</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Support</em>' containment reference.
+	 * @see #getSupport()
+	 * @generated
+	 */
+	void setSupport(PrimitiveNumberType value);
+
+} // PrimitiveTimeType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveType.java
new file mode 100644
index 0000000..9b8dc05
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Primitive Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveType()
+ * @model abstract="true"
+ * @generated
+ */
+public interface PrimitiveType extends DataType {
+} // PrimitiveType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveTypeKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveTypeKind.java
new file mode 100644
index 0000000..0dce171
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/PrimitiveTypeKind.java
@@ -0,0 +1,764 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Primitive Type Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getPrimitiveTypeKind()
+ * @model
+ * @generated
+ */
+public enum PrimitiveTypeKind implements Enumerator {
+	/**
+	 * The '<em><b>Boolean</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BOOLEAN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BOOLEAN(0, "boolean", "boolean"),
+
+	/**
+	 * The '<em><b>Int</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INT(1, "int", "int"),
+
+	/**
+	 * The '<em><b>Integer</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INTEGER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INTEGER(2, "integer", "integer"),
+
+	/**
+	 * The '<em><b>Rat</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RAT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RAT(3, "rat", "rat"),
+
+	/**
+	 * The '<em><b>Rational</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RATIONAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RATIONAL(4, "rational", "rational"),
+
+	/**
+	 * The '<em><b>Float</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FLOAT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	FLOAT(5, "float", "float"),
+
+	/**
+	 * The '<em><b>Double</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DOUBLE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DOUBLE(6, "double", "double"),
+
+	/**
+	 * The '<em><b>Real</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #REAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	REAL(7, "real", "real"),
+
+	/**
+	 * The '<em><b>Time</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #TIME_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	TIME(8, "time", "time"),
+
+	/**
+	 * The '<em><b>Uint</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UINT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	UINT(9, "uint", "uint"),
+
+	/**
+	 * The '<em><b>Uinteger</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UINTEGER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	UINTEGER(10, "uinteger", "uinteger"),
+
+	/**
+	 * The '<em><b>Urat</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #URAT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	URAT(11, "urat", "urat"),
+
+	/**
+	 * The '<em><b>Urational</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #URATIONAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	URATIONAL(12, "urational", "urational"),
+
+	/**
+	 * The '<em><b>Ufloat</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UFLOAT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	UFLOAT(13, "ufloat", "ufloat"),
+
+	/**
+	 * The '<em><b>Udouble</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UDOUBLE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	UDOUBLE(14, "udouble", "udouble"),
+
+	/**
+	 * The '<em><b>Ureal</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UREAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	UREAL(15, "ureal", "ureal"),
+
+	/**
+	 * The '<em><b>Char</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CHAR_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	CHAR(16, "char", "char"),
+
+	/**
+	 * The '<em><b>String</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #STRING_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	STRING(17, "string", "string"),
+
+	/**
+	 * The '<em><b>Buffer</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BUFFER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BUFFER(18, "buffer", "buffer"),
+
+	/**
+	 * The '<em><b>Message</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MESSAGE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MESSAGE(19, "message", "message"),
+
+	/**
+	 * The '<em><b>Port</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PORT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PORT(20, "port", "port"),
+
+	/**
+	 * The '<em><b>Machine</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MACHINE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MACHINE(21, "machine", "machine");
+
+	/**
+	 * The '<em><b>Boolean</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Boolean</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BOOLEAN
+	 * @model name="boolean"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BOOLEAN_VALUE = 0;
+
+	/**
+	 * The '<em><b>Int</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Int</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INT
+	 * @model name="int"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INT_VALUE = 1;
+
+	/**
+	 * The '<em><b>Integer</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Integer</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INTEGER
+	 * @model name="integer"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INTEGER_VALUE = 2;
+
+	/**
+	 * The '<em><b>Rat</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Rat</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RAT
+	 * @model name="rat"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RAT_VALUE = 3;
+
+	/**
+	 * The '<em><b>Rational</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Rational</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RATIONAL
+	 * @model name="rational"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RATIONAL_VALUE = 4;
+
+	/**
+	 * The '<em><b>Float</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Float</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #FLOAT
+	 * @model name="float"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int FLOAT_VALUE = 5;
+
+	/**
+	 * The '<em><b>Double</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Double</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DOUBLE
+	 * @model name="double"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DOUBLE_VALUE = 6;
+
+	/**
+	 * The '<em><b>Real</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Real</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #REAL
+	 * @model name="real"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int REAL_VALUE = 7;
+
+	/**
+	 * The '<em><b>Time</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Time</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #TIME
+	 * @model name="time"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int TIME_VALUE = 8;
+
+	/**
+	 * The '<em><b>Uint</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Uint</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #UINT
+	 * @model name="uint"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int UINT_VALUE = 9;
+
+	/**
+	 * The '<em><b>Uinteger</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Uinteger</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #UINTEGER
+	 * @model name="uinteger"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int UINTEGER_VALUE = 10;
+
+	/**
+	 * The '<em><b>Urat</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Urat</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #URAT
+	 * @model name="urat"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int URAT_VALUE = 11;
+
+	/**
+	 * The '<em><b>Urational</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Urational</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #URATIONAL
+	 * @model name="urational"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int URATIONAL_VALUE = 12;
+
+	/**
+	 * The '<em><b>Ufloat</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Ufloat</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #UFLOAT
+	 * @model name="ufloat"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int UFLOAT_VALUE = 13;
+
+	/**
+	 * The '<em><b>Udouble</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Udouble</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #UDOUBLE
+	 * @model name="udouble"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int UDOUBLE_VALUE = 14;
+
+	/**
+	 * The '<em><b>Ureal</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Ureal</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #UREAL
+	 * @model name="ureal"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int UREAL_VALUE = 15;
+
+	/**
+	 * The '<em><b>Char</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Char</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #CHAR
+	 * @model name="char"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int CHAR_VALUE = 16;
+
+	/**
+	 * The '<em><b>String</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>String</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #STRING
+	 * @model name="string"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int STRING_VALUE = 17;
+
+	/**
+	 * The '<em><b>Buffer</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Buffer</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BUFFER
+	 * @model name="buffer"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BUFFER_VALUE = 18;
+
+	/**
+	 * The '<em><b>Message</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Message</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MESSAGE
+	 * @model name="message"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MESSAGE_VALUE = 19;
+
+	/**
+	 * The '<em><b>Port</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Port</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PORT
+	 * @model name="port"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PORT_VALUE = 20;
+
+	/**
+	 * The '<em><b>Machine</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Machine</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MACHINE
+	 * @model name="machine"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MACHINE_VALUE = 21;
+
+	/**
+	 * An array of all the '<em><b>Primitive Type Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final PrimitiveTypeKind[] VALUES_ARRAY =
+		new PrimitiveTypeKind[] {
+			BOOLEAN,
+			INT,
+			INTEGER,
+			RAT,
+			RATIONAL,
+			FLOAT,
+			DOUBLE,
+			REAL,
+			TIME,
+			UINT,
+			UINTEGER,
+			URAT,
+			URATIONAL,
+			UFLOAT,
+			UDOUBLE,
+			UREAL,
+			CHAR,
+			STRING,
+			BUFFER,
+			MESSAGE,
+			PORT,
+			MACHINE,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Primitive Type Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<PrimitiveTypeKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Primitive Type Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PrimitiveTypeKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PrimitiveTypeKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Primitive Type Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PrimitiveTypeKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PrimitiveTypeKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Primitive Type Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PrimitiveTypeKind get(int value) {
+		switch (value) {
+			case BOOLEAN_VALUE: return BOOLEAN;
+			case INT_VALUE: return INT;
+			case INTEGER_VALUE: return INTEGER;
+			case RAT_VALUE: return RAT;
+			case RATIONAL_VALUE: return RATIONAL;
+			case FLOAT_VALUE: return FLOAT;
+			case DOUBLE_VALUE: return DOUBLE;
+			case REAL_VALUE: return REAL;
+			case TIME_VALUE: return TIME;
+			case UINT_VALUE: return UINT;
+			case UINTEGER_VALUE: return UINTEGER;
+			case URAT_VALUE: return URAT;
+			case URATIONAL_VALUE: return URATIONAL;
+			case UFLOAT_VALUE: return UFLOAT;
+			case UDOUBLE_VALUE: return UDOUBLE;
+			case UREAL_VALUE: return UREAL;
+			case CHAR_VALUE: return CHAR;
+			case STRING_VALUE: return STRING;
+			case BUFFER_VALUE: return BUFFER;
+			case MESSAGE_VALUE: return MESSAGE;
+			case PORT_VALUE: return PORT;
+			case MACHINE_VALUE: return MACHINE;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private PrimitiveTypeKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //PrimitiveTypeKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/StructureType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/StructureType.java
new file mode 100644
index 0000000..bb4745d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/StructureType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Structure Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getStructureType()
+ * @model
+ * @generated
+ */
+public interface StructureType extends DataStructuredType {
+} // StructureType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/UnionType.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/UnionType.java
new file mode 100644
index 0000000..2efffb5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/UnionType.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Union Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#getUnionType()
+ * @model
+ * @generated
+ */
+public interface UnionType extends DataStructuredType {
+} // UnionType
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/ChoiceTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/ChoiceTypeImpl.java
new file mode 100644
index 0000000..e6b4e45
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/ChoiceTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.ChoiceType;
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Choice Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class ChoiceTypeImpl extends DataStructuredTypeImpl implements ChoiceType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ChoiceTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.CHOICE_TYPE;
+	}
+
+} //ChoiceTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/CollectionTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/CollectionTypeImpl.java
new file mode 100644
index 0000000..39b3bbd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/CollectionTypeImpl.java
@@ -0,0 +1,281 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.CollectionKind;
+import org.eclipse.efm.ecore.formalml.datatype.CollectionType;
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Collection Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.CollectionTypeImpl#getContainer <em>Container</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.CollectionTypeImpl#getSize <em>Size</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.CollectionTypeImpl#isUnbounded <em>Unbounded</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class CollectionTypeImpl extends DataSupportedTypeImpl implements CollectionType {
+	/**
+	 * The default value of the '{@link #getContainer() <em>Container</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getContainer()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final CollectionKind CONTAINER_EDEFAULT = CollectionKind.LIST;
+
+	/**
+	 * The cached value of the '{@link #getContainer() <em>Container</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getContainer()
+	 * @generated
+	 * @ordered
+	 */
+	protected CollectionKind container = CONTAINER_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getSize() <em>Size</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSize()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int SIZE_EDEFAULT = -1;
+
+	/**
+	 * The cached value of the '{@link #getSize() <em>Size</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSize()
+	 * @generated
+	 * @ordered
+	 */
+	protected int size = SIZE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isUnbounded() <em>Unbounded</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUnbounded()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UNBOUNDED_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isUnbounded() <em>Unbounded</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUnbounded()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean unbounded = UNBOUNDED_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected CollectionTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.COLLECTION_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CollectionKind getContainer() {
+		return container;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setContainer(CollectionKind newContainer) {
+		CollectionKind oldContainer = container;
+		container = newContainer == null ? CONTAINER_EDEFAULT : newContainer;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.COLLECTION_TYPE__CONTAINER, oldContainer, container));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getSize() {
+		return size;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSize(int newSize) {
+		int oldSize = size;
+		size = newSize;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.COLLECTION_TYPE__SIZE, oldSize, size));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isUnbounded() {
+		return unbounded;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setUnbounded(boolean newUnbounded) {
+		boolean oldUnbounded = unbounded;
+		unbounded = newUnbounded;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.COLLECTION_TYPE__UNBOUNDED, oldUnbounded, unbounded));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.COLLECTION_TYPE__CONTAINER:
+				return getContainer();
+			case DatatypePackage.COLLECTION_TYPE__SIZE:
+				return getSize();
+			case DatatypePackage.COLLECTION_TYPE__UNBOUNDED:
+				return isUnbounded();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.COLLECTION_TYPE__CONTAINER:
+				setContainer((CollectionKind)newValue);
+				return;
+			case DatatypePackage.COLLECTION_TYPE__SIZE:
+				setSize((Integer)newValue);
+				return;
+			case DatatypePackage.COLLECTION_TYPE__UNBOUNDED:
+				setUnbounded((Boolean)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.COLLECTION_TYPE__CONTAINER:
+				setContainer(CONTAINER_EDEFAULT);
+				return;
+			case DatatypePackage.COLLECTION_TYPE__SIZE:
+				setSize(SIZE_EDEFAULT);
+				return;
+			case DatatypePackage.COLLECTION_TYPE__UNBOUNDED:
+				setUnbounded(UNBOUNDED_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.COLLECTION_TYPE__CONTAINER:
+				return container != CONTAINER_EDEFAULT;
+			case DatatypePackage.COLLECTION_TYPE__SIZE:
+				return size != SIZE_EDEFAULT;
+			case DatatypePackage.COLLECTION_TYPE__UNBOUNDED:
+				return unbounded != UNBOUNDED_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (container: ");
+		result.append(container);
+		result.append(", size: ");
+		result.append(size);
+		result.append(", unbounded: ");
+		result.append(unbounded);
+		result.append(')');
+		return result.toString();
+	}
+
+} //CollectionTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataStructuredTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataStructuredTypeImpl.java
new file mode 100644
index 0000000..c7301ee
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataStructuredTypeImpl.java
@@ -0,0 +1,161 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataStructuredType;
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Data Structured Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataStructuredTypeImpl#getProperty <em>Property</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class DataStructuredTypeImpl extends DataTypeImpl implements DataStructuredType {
+	/**
+	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProperty()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<PropertyDefinition> property;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DataStructuredTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.DATA_STRUCTURED_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<PropertyDefinition> getProperty() {
+		if (property == null) {
+			property = new EObjectContainmentEList<PropertyDefinition>(PropertyDefinition.class, this, DatatypePackage.DATA_STRUCTURED_TYPE__PROPERTY);
+		}
+		return property;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case DatatypePackage.DATA_STRUCTURED_TYPE__PROPERTY:
+				return ((InternalEList<?>)getProperty()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.DATA_STRUCTURED_TYPE__PROPERTY:
+				return getProperty();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.DATA_STRUCTURED_TYPE__PROPERTY:
+				getProperty().clear();
+				getProperty().addAll((Collection<? extends PropertyDefinition>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.DATA_STRUCTURED_TYPE__PROPERTY:
+				getProperty().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.DATA_STRUCTURED_TYPE__PROPERTY:
+				return property != null && !property.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //DataStructuredTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataSupportedTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataSupportedTypeImpl.java
new file mode 100644
index 0000000..6fbe288
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataSupportedTypeImpl.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataSupportedType;
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Data Supported Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataSupportedTypeImpl#getSupport <em>Support</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class DataSupportedTypeImpl extends DataTypeImpl implements DataSupportedType {
+	/**
+	 * The cached value of the '{@link #getSupport() <em>Support</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSupport()
+	 * @generated
+	 * @ordered
+	 */
+	protected DataType support;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DataSupportedTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.DATA_SUPPORTED_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataType getSupport() {
+		return support;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetSupport(DataType newSupport, NotificationChain msgs) {
+		DataType oldSupport = support;
+		support = newSupport;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_SUPPORTED_TYPE__SUPPORT, oldSupport, newSupport);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSupport(DataType newSupport) {
+		if (newSupport != support) {
+			NotificationChain msgs = null;
+			if (support != null)
+				msgs = ((InternalEObject)support).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.DATA_SUPPORTED_TYPE__SUPPORT, null, msgs);
+			if (newSupport != null)
+				msgs = ((InternalEObject)newSupport).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.DATA_SUPPORTED_TYPE__SUPPORT, null, msgs);
+			msgs = basicSetSupport(newSupport, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_SUPPORTED_TYPE__SUPPORT, newSupport, newSupport));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case DatatypePackage.DATA_SUPPORTED_TYPE__SUPPORT:
+				return basicSetSupport(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.DATA_SUPPORTED_TYPE__SUPPORT:
+				return getSupport();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.DATA_SUPPORTED_TYPE__SUPPORT:
+				setSupport((DataType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.DATA_SUPPORTED_TYPE__SUPPORT:
+				setSupport((DataType)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.DATA_SUPPORTED_TYPE__SUPPORT:
+				return support != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //DataSupportedTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataTypeImpl.java
new file mode 100644
index 0000000..9ce0e07
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataTypeImpl.java
@@ -0,0 +1,377 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.common.impl.ClassifierDefinitionImpl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Data Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeImpl#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeImpl#isTypedef <em>Typedef</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeImpl#getMultiplicity <em>Multiplicity</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeImpl#getDefaultValue <em>Default Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class DataTypeImpl extends ClassifierDefinitionImpl implements DataType {
+	/**
+	 * The default value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final PrimitiveTypeKind KIND_EDEFAULT = PrimitiveTypeKind.BOOLEAN;
+
+	/**
+	 * The cached value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected PrimitiveTypeKind kind = KIND_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isTypedef() <em>Typedef</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTypedef()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean TYPEDEF_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isTypedef() <em>Typedef</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTypedef()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean typedef = TYPEDEF_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getMultiplicity() <em>Multiplicity</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMultiplicity()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression multiplicity;
+
+	/**
+	 * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDefaultValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression defaultValue;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DataTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.DATA_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveTypeKind getKind() {
+		return kind;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKind(PrimitiveTypeKind newKind) {
+		PrimitiveTypeKind oldKind = kind;
+		kind = newKind == null ? KIND_EDEFAULT : newKind;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_TYPE__KIND, oldKind, kind));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isTypedef() {
+		return typedef;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTypedef(boolean newTypedef) {
+		boolean oldTypedef = typedef;
+		typedef = newTypedef;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_TYPE__TYPEDEF, oldTypedef, typedef));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getMultiplicity() {
+		return multiplicity;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMultiplicity(Expression newMultiplicity, NotificationChain msgs) {
+		Expression oldMultiplicity = multiplicity;
+		multiplicity = newMultiplicity;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_TYPE__MULTIPLICITY, oldMultiplicity, newMultiplicity);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMultiplicity(Expression newMultiplicity) {
+		if (newMultiplicity != multiplicity) {
+			NotificationChain msgs = null;
+			if (multiplicity != null)
+				msgs = ((InternalEObject)multiplicity).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.DATA_TYPE__MULTIPLICITY, null, msgs);
+			if (newMultiplicity != null)
+				msgs = ((InternalEObject)newMultiplicity).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.DATA_TYPE__MULTIPLICITY, null, msgs);
+			msgs = basicSetMultiplicity(newMultiplicity, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_TYPE__MULTIPLICITY, newMultiplicity, newMultiplicity));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getDefaultValue() {
+		return defaultValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetDefaultValue(Expression newDefaultValue, NotificationChain msgs) {
+		Expression oldDefaultValue = defaultValue;
+		defaultValue = newDefaultValue;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_TYPE__DEFAULT_VALUE, oldDefaultValue, newDefaultValue);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDefaultValue(Expression newDefaultValue) {
+		if (newDefaultValue != defaultValue) {
+			NotificationChain msgs = null;
+			if (defaultValue != null)
+				msgs = ((InternalEObject)defaultValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.DATA_TYPE__DEFAULT_VALUE, null, msgs);
+			if (newDefaultValue != null)
+				msgs = ((InternalEObject)newDefaultValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.DATA_TYPE__DEFAULT_VALUE, null, msgs);
+			msgs = basicSetDefaultValue(newDefaultValue, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_TYPE__DEFAULT_VALUE, newDefaultValue, newDefaultValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE__MULTIPLICITY:
+				return basicSetMultiplicity(null, msgs);
+			case DatatypePackage.DATA_TYPE__DEFAULT_VALUE:
+				return basicSetDefaultValue(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE__KIND:
+				return getKind();
+			case DatatypePackage.DATA_TYPE__TYPEDEF:
+				return isTypedef();
+			case DatatypePackage.DATA_TYPE__MULTIPLICITY:
+				return getMultiplicity();
+			case DatatypePackage.DATA_TYPE__DEFAULT_VALUE:
+				return getDefaultValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE__KIND:
+				setKind((PrimitiveTypeKind)newValue);
+				return;
+			case DatatypePackage.DATA_TYPE__TYPEDEF:
+				setTypedef((Boolean)newValue);
+				return;
+			case DatatypePackage.DATA_TYPE__MULTIPLICITY:
+				setMultiplicity((Expression)newValue);
+				return;
+			case DatatypePackage.DATA_TYPE__DEFAULT_VALUE:
+				setDefaultValue((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE__KIND:
+				setKind(KIND_EDEFAULT);
+				return;
+			case DatatypePackage.DATA_TYPE__TYPEDEF:
+				setTypedef(TYPEDEF_EDEFAULT);
+				return;
+			case DatatypePackage.DATA_TYPE__MULTIPLICITY:
+				setMultiplicity((Expression)null);
+				return;
+			case DatatypePackage.DATA_TYPE__DEFAULT_VALUE:
+				setDefaultValue((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE__KIND:
+				return kind != KIND_EDEFAULT;
+			case DatatypePackage.DATA_TYPE__TYPEDEF:
+				return typedef != TYPEDEF_EDEFAULT;
+			case DatatypePackage.DATA_TYPE__MULTIPLICITY:
+				return multiplicity != null;
+			case DatatypePackage.DATA_TYPE__DEFAULT_VALUE:
+				return defaultValue != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (kind: ");
+		result.append(kind);
+		result.append(", typedef: ");
+		result.append(typedef);
+		result.append(')');
+		return result.toString();
+	}
+
+} //DataTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataTypeReferenceImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataTypeReferenceImpl.java
new file mode 100644
index 0000000..9f99333
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DataTypeReferenceImpl.java
@@ -0,0 +1,245 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+import org.eclipse.efm.ecore.formalml.datatype.DataTypeReference;
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Data Type Reference</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeReferenceImpl#getTyperef <em>Typeref</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.DataTypeReferenceImpl#getSupport <em>Support</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DataTypeReferenceImpl extends DataTypeImpl implements DataTypeReference {
+	/**
+	 * The cached value of the '{@link #getTyperef() <em>Typeref</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTyperef()
+	 * @generated
+	 * @ordered
+	 */
+	protected DataType typeref;
+
+	/**
+	 * The cached value of the '{@link #getSupport() <em>Support</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSupport()
+	 * @generated
+	 * @ordered
+	 */
+	protected DataType support;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DataTypeReferenceImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.DATA_TYPE_REFERENCE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataType getTyperef() {
+		if (typeref != null && typeref.eIsProxy()) {
+			InternalEObject oldTyperef = (InternalEObject)typeref;
+			typeref = (DataType)eResolveProxy(oldTyperef);
+			if (typeref != oldTyperef) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DatatypePackage.DATA_TYPE_REFERENCE__TYPEREF, oldTyperef, typeref));
+			}
+		}
+		return typeref;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataType basicGetTyperef() {
+		return typeref;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTyperef(DataType newTyperef) {
+		DataType oldTyperef = typeref;
+		typeref = newTyperef;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_TYPE_REFERENCE__TYPEREF, oldTyperef, typeref));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataType getSupport() {
+		return support;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetSupport(DataType newSupport, NotificationChain msgs) {
+		DataType oldSupport = support;
+		support = newSupport;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_TYPE_REFERENCE__SUPPORT, oldSupport, newSupport);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSupport(DataType newSupport) {
+		if (newSupport != support) {
+			NotificationChain msgs = null;
+			if (support != null)
+				msgs = ((InternalEObject)support).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.DATA_TYPE_REFERENCE__SUPPORT, null, msgs);
+			if (newSupport != null)
+				msgs = ((InternalEObject)newSupport).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.DATA_TYPE_REFERENCE__SUPPORT, null, msgs);
+			msgs = basicSetSupport(newSupport, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.DATA_TYPE_REFERENCE__SUPPORT, newSupport, newSupport));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE_REFERENCE__SUPPORT:
+				return basicSetSupport(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE_REFERENCE__TYPEREF:
+				if (resolve) return getTyperef();
+				return basicGetTyperef();
+			case DatatypePackage.DATA_TYPE_REFERENCE__SUPPORT:
+				return getSupport();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE_REFERENCE__TYPEREF:
+				setTyperef((DataType)newValue);
+				return;
+			case DatatypePackage.DATA_TYPE_REFERENCE__SUPPORT:
+				setSupport((DataType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE_REFERENCE__TYPEREF:
+				setTyperef((DataType)null);
+				return;
+			case DatatypePackage.DATA_TYPE_REFERENCE__SUPPORT:
+				setSupport((DataType)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.DATA_TYPE_REFERENCE__TYPEREF:
+				return typeref != null;
+			case DatatypePackage.DATA_TYPE_REFERENCE__SUPPORT:
+				return support != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //DataTypeReferenceImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DatatypeFactoryImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DatatypeFactoryImpl.java
new file mode 100644
index 0000000..fd7636a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DatatypeFactoryImpl.java
@@ -0,0 +1,404 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DatatypeFactoryImpl extends EFactoryImpl implements DatatypeFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static DatatypeFactory init() {
+		try {
+			DatatypeFactory theDatatypeFactory = (DatatypeFactory)EPackage.Registry.INSTANCE.getEFactory(DatatypePackage.eNS_URI);
+			if (theDatatypeFactory != null) {
+				return theDatatypeFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new DatatypeFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DatatypeFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case DatatypePackage.DATA_TYPE_REFERENCE: return createDataTypeReference();
+			case DatatypePackage.ENUMERATION_LITERAL: return createEnumerationLiteral();
+			case DatatypePackage.ENUMERATION_TYPE: return createEnumerationType();
+			case DatatypePackage.STRUCTURE_TYPE: return createStructureType();
+			case DatatypePackage.UNION_TYPE: return createUnionType();
+			case DatatypePackage.CHOICE_TYPE: return createChoiceType();
+			case DatatypePackage.INTERVAL_TYPE: return createIntervalType();
+			case DatatypePackage.COLLECTION_TYPE: return createCollectionType();
+			case DatatypePackage.PRIMITIVE_BOOLEAN_TYPE: return createPrimitiveBooleanType();
+			case DatatypePackage.PRIMITIVE_INTEGER_TYPE: return createPrimitiveIntegerType();
+			case DatatypePackage.PRIMITIVE_RATIONAL_TYPE: return createPrimitiveRationalType();
+			case DatatypePackage.PRIMITIVE_FLOAT_TYPE: return createPrimitiveFloatType();
+			case DatatypePackage.PRIMITIVE_REAL_TYPE: return createPrimitiveRealType();
+			case DatatypePackage.PRIMITIVE_TIME_TYPE: return createPrimitiveTimeType();
+			case DatatypePackage.PRIMITIVE_CHARACTER_TYPE: return createPrimitiveCharacterType();
+			case DatatypePackage.PRIMITIVE_STRING_TYPE: return createPrimitiveStringType();
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE: return createPrimitiveInstanceType();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case DatatypePackage.PRIMITIVE_TYPE_KIND:
+				return createPrimitiveTypeKindFromString(eDataType, initialValue);
+			case DatatypePackage.COLLECTION_KIND:
+				return createCollectionKindFromString(eDataType, initialValue);
+			case DatatypePackage.PRIMITIVE_NUMBER_SIGN:
+				return createPrimitiveNumberSignFromString(eDataType, initialValue);
+			case DatatypePackage.PRIMITIVE_INSTANCE_KIND:
+				return createPrimitiveInstanceKindFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case DatatypePackage.PRIMITIVE_TYPE_KIND:
+				return convertPrimitiveTypeKindToString(eDataType, instanceValue);
+			case DatatypePackage.COLLECTION_KIND:
+				return convertCollectionKindToString(eDataType, instanceValue);
+			case DatatypePackage.PRIMITIVE_NUMBER_SIGN:
+				return convertPrimitiveNumberSignToString(eDataType, instanceValue);
+			case DatatypePackage.PRIMITIVE_INSTANCE_KIND:
+				return convertPrimitiveInstanceKindToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataTypeReference createDataTypeReference() {
+		DataTypeReferenceImpl dataTypeReference = new DataTypeReferenceImpl();
+		return dataTypeReference;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EnumerationLiteral createEnumerationLiteral() {
+		EnumerationLiteralImpl enumerationLiteral = new EnumerationLiteralImpl();
+		return enumerationLiteral;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EnumerationType createEnumerationType() {
+		EnumerationTypeImpl enumerationType = new EnumerationTypeImpl();
+		return enumerationType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StructureType createStructureType() {
+		StructureTypeImpl structureType = new StructureTypeImpl();
+		return structureType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public UnionType createUnionType() {
+		UnionTypeImpl unionType = new UnionTypeImpl();
+		return unionType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ChoiceType createChoiceType() {
+		ChoiceTypeImpl choiceType = new ChoiceTypeImpl();
+		return choiceType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IntervalType createIntervalType() {
+		IntervalTypeImpl intervalType = new IntervalTypeImpl();
+		return intervalType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CollectionType createCollectionType() {
+		CollectionTypeImpl collectionType = new CollectionTypeImpl();
+		return collectionType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveBooleanType createPrimitiveBooleanType() {
+		PrimitiveBooleanTypeImpl primitiveBooleanType = new PrimitiveBooleanTypeImpl();
+		return primitiveBooleanType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveIntegerType createPrimitiveIntegerType() {
+		PrimitiveIntegerTypeImpl primitiveIntegerType = new PrimitiveIntegerTypeImpl();
+		return primitiveIntegerType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveRationalType createPrimitiveRationalType() {
+		PrimitiveRationalTypeImpl primitiveRationalType = new PrimitiveRationalTypeImpl();
+		return primitiveRationalType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveFloatType createPrimitiveFloatType() {
+		PrimitiveFloatTypeImpl primitiveFloatType = new PrimitiveFloatTypeImpl();
+		return primitiveFloatType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveRealType createPrimitiveRealType() {
+		PrimitiveRealTypeImpl primitiveRealType = new PrimitiveRealTypeImpl();
+		return primitiveRealType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveTimeType createPrimitiveTimeType() {
+		PrimitiveTimeTypeImpl primitiveTimeType = new PrimitiveTimeTypeImpl();
+		return primitiveTimeType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveCharacterType createPrimitiveCharacterType() {
+		PrimitiveCharacterTypeImpl primitiveCharacterType = new PrimitiveCharacterTypeImpl();
+		return primitiveCharacterType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveStringType createPrimitiveStringType() {
+		PrimitiveStringTypeImpl primitiveStringType = new PrimitiveStringTypeImpl();
+		return primitiveStringType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveInstanceType createPrimitiveInstanceType() {
+		PrimitiveInstanceTypeImpl primitiveInstanceType = new PrimitiveInstanceTypeImpl();
+		return primitiveInstanceType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveTypeKind createPrimitiveTypeKindFromString(EDataType eDataType, String initialValue) {
+		PrimitiveTypeKind result = PrimitiveTypeKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertPrimitiveTypeKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CollectionKind createCollectionKindFromString(EDataType eDataType, String initialValue) {
+		CollectionKind result = CollectionKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertCollectionKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveNumberSign createPrimitiveNumberSignFromString(EDataType eDataType, String initialValue) {
+		PrimitiveNumberSign result = PrimitiveNumberSign.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertPrimitiveNumberSignToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveInstanceKind createPrimitiveInstanceKindFromString(EDataType eDataType, String initialValue) {
+		PrimitiveInstanceKind result = PrimitiveInstanceKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertPrimitiveInstanceKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DatatypePackage getDatatypePackage() {
+		return (DatatypePackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static DatatypePackage getPackage() {
+		return DatatypePackage.eINSTANCE;
+	}
+
+} //DatatypeFactoryImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DatatypePackageImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DatatypePackageImpl.java
new file mode 100644
index 0000000..339b78e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/DatatypePackageImpl.java
@@ -0,0 +1,1076 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.datatype.ChoiceType;
+import org.eclipse.efm.ecore.formalml.datatype.CollectionKind;
+import org.eclipse.efm.ecore.formalml.datatype.CollectionType;
+import org.eclipse.efm.ecore.formalml.datatype.DataStructuredType;
+import org.eclipse.efm.ecore.formalml.datatype.DataSupportedType;
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+import org.eclipse.efm.ecore.formalml.datatype.DataTypeReference;
+import org.eclipse.efm.ecore.formalml.datatype.DatatypeFactory;
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral;
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationType;
+import org.eclipse.efm.ecore.formalml.datatype.IntervalType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind;
+import org.eclipse.efm.ecore.formalml.datatype.StructureType;
+import org.eclipse.efm.ecore.formalml.datatype.UnionType;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DatatypePackageImpl extends EPackageImpl implements DatatypePackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass dataTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass dataTypeReferenceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass enumerationLiteralEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass enumerationTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass dataStructuredTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass structureTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass unionTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass choiceTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass dataSupportedTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass intervalTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass collectionTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveBooleanTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveNumberTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveIntegerTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveRationalTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveFloatTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveRealTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveTimeTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveCharacterTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveStringTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass primitiveInstanceTypeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum primitiveTypeKindEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum collectionKindEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum primitiveNumberSignEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum primitiveInstanceKindEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private DatatypePackageImpl() {
+		super(eNS_URI, DatatypeFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link DatatypePackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static DatatypePackage init() {
+		if (isInited) return (DatatypePackage)EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI);
+
+		// Obtain or create and register package
+		DatatypePackageImpl theDatatypePackage = (DatatypePackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof DatatypePackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new DatatypePackageImpl());
+
+		isInited = true;
+
+		// Obtain or create and register interdependencies
+		FormalmlPackageImpl theFormalmlPackage = (FormalmlPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) instanceof FormalmlPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) : FormalmlPackage.eINSTANCE);
+		CommonPackageImpl theCommonPackage = (CommonPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) instanceof CommonPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) : CommonPackage.eINSTANCE);
+		InfrastructurePackageImpl theInfrastructurePackage = (InfrastructurePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) instanceof InfrastructurePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) : InfrastructurePackage.eINSTANCE);
+		ExpressionPackageImpl theExpressionPackage = (ExpressionPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) instanceof ExpressionPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) : ExpressionPackage.eINSTANCE);
+		StatementPackageImpl theStatementPackage = (StatementPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) instanceof StatementPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) : StatementPackage.eINSTANCE);
+		StatemachinePackageImpl theStatemachinePackage = (StatemachinePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) instanceof StatemachinePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) : StatemachinePackage.eINSTANCE);
+
+		// Create package meta-data objects
+		theDatatypePackage.createPackageContents();
+		theFormalmlPackage.createPackageContents();
+		theCommonPackage.createPackageContents();
+		theInfrastructurePackage.createPackageContents();
+		theExpressionPackage.createPackageContents();
+		theStatementPackage.createPackageContents();
+		theStatemachinePackage.createPackageContents();
+
+		// Initialize created meta-data
+		theDatatypePackage.initializePackageContents();
+		theFormalmlPackage.initializePackageContents();
+		theCommonPackage.initializePackageContents();
+		theInfrastructurePackage.initializePackageContents();
+		theExpressionPackage.initializePackageContents();
+		theStatementPackage.initializePackageContents();
+		theStatemachinePackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theDatatypePackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(DatatypePackage.eNS_URI, theDatatypePackage);
+		return theDatatypePackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDataType() {
+		return dataTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataType_Kind() {
+		return (EAttribute)dataTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataType_Typedef() {
+		return (EAttribute)dataTypeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataType_Multiplicity() {
+		return (EReference)dataTypeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataType_DefaultValue() {
+		return (EReference)dataTypeEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDataTypeReference() {
+		return dataTypeReferenceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataTypeReference_Typeref() {
+		return (EReference)dataTypeReferenceEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataTypeReference_Support() {
+		return (EReference)dataTypeReferenceEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getEnumerationLiteral() {
+		return enumerationLiteralEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getEnumerationLiteral_Value() {
+		return (EReference)enumerationLiteralEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getEnumerationType() {
+		return enumerationTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getEnumerationType_Literal() {
+		return (EReference)enumerationTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDataStructuredType() {
+		return dataStructuredTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataStructuredType_Property() {
+		return (EReference)dataStructuredTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStructureType() {
+		return structureTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getUnionType() {
+		return unionTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getChoiceType() {
+		return choiceTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDataSupportedType() {
+		return dataSupportedTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataSupportedType_Support() {
+		return (EReference)dataSupportedTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getIntervalType() {
+		return intervalTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIntervalType_Lopen() {
+		return (EAttribute)intervalTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIntervalType_Ropen() {
+		return (EAttribute)intervalTypeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getIntervalType_Infimum() {
+		return (EReference)intervalTypeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getIntervalType_Supremum() {
+		return (EReference)intervalTypeEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getCollectionType() {
+		return collectionTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getCollectionType_Container() {
+		return (EAttribute)collectionTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getCollectionType_Size() {
+		return (EAttribute)collectionTypeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getCollectionType_Unbounded() {
+		return (EAttribute)collectionTypeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveType() {
+		return primitiveTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveBooleanType() {
+		return primitiveBooleanTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveNumberType() {
+		return primitiveNumberTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getPrimitiveNumberType_Sign() {
+		return (EAttribute)primitiveNumberTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getPrimitiveNumberType_Size() {
+		return (EAttribute)primitiveNumberTypeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveIntegerType() {
+		return primitiveIntegerTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveRationalType() {
+		return primitiveRationalTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveFloatType() {
+		return primitiveFloatTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveRealType() {
+		return primitiveRealTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveTimeType() {
+		return primitiveTimeTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getPrimitiveTimeType_Clock() {
+		return (EAttribute)primitiveTimeTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPrimitiveTimeType_Support() {
+		return (EReference)primitiveTimeTypeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveCharacterType() {
+		return primitiveCharacterTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveStringType() {
+		return primitiveStringTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getPrimitiveStringType_Size() {
+		return (EAttribute)primitiveStringTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPrimitiveInstanceType() {
+		return primitiveInstanceTypeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getPrimitiveInstanceType_Expected() {
+		return (EAttribute)primitiveInstanceTypeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPrimitiveInstanceType_Model() {
+		return (EReference)primitiveInstanceTypeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getPrimitiveTypeKind() {
+		return primitiveTypeKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getCollectionKind() {
+		return collectionKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getPrimitiveNumberSign() {
+		return primitiveNumberSignEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getPrimitiveInstanceKind() {
+		return primitiveInstanceKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DatatypeFactory getDatatypeFactory() {
+		return (DatatypeFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		dataTypeEClass = createEClass(DATA_TYPE);
+		createEAttribute(dataTypeEClass, DATA_TYPE__KIND);
+		createEAttribute(dataTypeEClass, DATA_TYPE__TYPEDEF);
+		createEReference(dataTypeEClass, DATA_TYPE__MULTIPLICITY);
+		createEReference(dataTypeEClass, DATA_TYPE__DEFAULT_VALUE);
+
+		dataTypeReferenceEClass = createEClass(DATA_TYPE_REFERENCE);
+		createEReference(dataTypeReferenceEClass, DATA_TYPE_REFERENCE__TYPEREF);
+		createEReference(dataTypeReferenceEClass, DATA_TYPE_REFERENCE__SUPPORT);
+
+		enumerationLiteralEClass = createEClass(ENUMERATION_LITERAL);
+		createEReference(enumerationLiteralEClass, ENUMERATION_LITERAL__VALUE);
+
+		enumerationTypeEClass = createEClass(ENUMERATION_TYPE);
+		createEReference(enumerationTypeEClass, ENUMERATION_TYPE__LITERAL);
+
+		dataStructuredTypeEClass = createEClass(DATA_STRUCTURED_TYPE);
+		createEReference(dataStructuredTypeEClass, DATA_STRUCTURED_TYPE__PROPERTY);
+
+		structureTypeEClass = createEClass(STRUCTURE_TYPE);
+
+		unionTypeEClass = createEClass(UNION_TYPE);
+
+		choiceTypeEClass = createEClass(CHOICE_TYPE);
+
+		dataSupportedTypeEClass = createEClass(DATA_SUPPORTED_TYPE);
+		createEReference(dataSupportedTypeEClass, DATA_SUPPORTED_TYPE__SUPPORT);
+
+		intervalTypeEClass = createEClass(INTERVAL_TYPE);
+		createEAttribute(intervalTypeEClass, INTERVAL_TYPE__LOPEN);
+		createEAttribute(intervalTypeEClass, INTERVAL_TYPE__ROPEN);
+		createEReference(intervalTypeEClass, INTERVAL_TYPE__INFIMUM);
+		createEReference(intervalTypeEClass, INTERVAL_TYPE__SUPREMUM);
+
+		collectionTypeEClass = createEClass(COLLECTION_TYPE);
+		createEAttribute(collectionTypeEClass, COLLECTION_TYPE__CONTAINER);
+		createEAttribute(collectionTypeEClass, COLLECTION_TYPE__SIZE);
+		createEAttribute(collectionTypeEClass, COLLECTION_TYPE__UNBOUNDED);
+
+		primitiveTypeEClass = createEClass(PRIMITIVE_TYPE);
+
+		primitiveBooleanTypeEClass = createEClass(PRIMITIVE_BOOLEAN_TYPE);
+
+		primitiveNumberTypeEClass = createEClass(PRIMITIVE_NUMBER_TYPE);
+		createEAttribute(primitiveNumberTypeEClass, PRIMITIVE_NUMBER_TYPE__SIGN);
+		createEAttribute(primitiveNumberTypeEClass, PRIMITIVE_NUMBER_TYPE__SIZE);
+
+		primitiveIntegerTypeEClass = createEClass(PRIMITIVE_INTEGER_TYPE);
+
+		primitiveRationalTypeEClass = createEClass(PRIMITIVE_RATIONAL_TYPE);
+
+		primitiveFloatTypeEClass = createEClass(PRIMITIVE_FLOAT_TYPE);
+
+		primitiveRealTypeEClass = createEClass(PRIMITIVE_REAL_TYPE);
+
+		primitiveTimeTypeEClass = createEClass(PRIMITIVE_TIME_TYPE);
+		createEAttribute(primitiveTimeTypeEClass, PRIMITIVE_TIME_TYPE__CLOCK);
+		createEReference(primitiveTimeTypeEClass, PRIMITIVE_TIME_TYPE__SUPPORT);
+
+		primitiveCharacterTypeEClass = createEClass(PRIMITIVE_CHARACTER_TYPE);
+
+		primitiveStringTypeEClass = createEClass(PRIMITIVE_STRING_TYPE);
+		createEAttribute(primitiveStringTypeEClass, PRIMITIVE_STRING_TYPE__SIZE);
+
+		primitiveInstanceTypeEClass = createEClass(PRIMITIVE_INSTANCE_TYPE);
+		createEAttribute(primitiveInstanceTypeEClass, PRIMITIVE_INSTANCE_TYPE__EXPECTED);
+		createEReference(primitiveInstanceTypeEClass, PRIMITIVE_INSTANCE_TYPE__MODEL);
+
+		// Create enums
+		primitiveTypeKindEEnum = createEEnum(PRIMITIVE_TYPE_KIND);
+		collectionKindEEnum = createEEnum(COLLECTION_KIND);
+		primitiveNumberSignEEnum = createEEnum(PRIMITIVE_NUMBER_SIGN);
+		primitiveInstanceKindEEnum = createEEnum(PRIMITIVE_INSTANCE_KIND);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		CommonPackage theCommonPackage = (CommonPackage)EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI);
+		ExpressionPackage theExpressionPackage = (ExpressionPackage)EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI);
+		InfrastructurePackage theInfrastructurePackage = (InfrastructurePackage)EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		dataTypeEClass.getESuperTypes().add(theCommonPackage.getClassifierDefinition());
+		dataTypeReferenceEClass.getESuperTypes().add(this.getDataType());
+		enumerationLiteralEClass.getESuperTypes().add(theCommonPackage.getNamedElement());
+		enumerationTypeEClass.getESuperTypes().add(this.getDataType());
+		dataStructuredTypeEClass.getESuperTypes().add(this.getDataType());
+		structureTypeEClass.getESuperTypes().add(this.getDataStructuredType());
+		unionTypeEClass.getESuperTypes().add(this.getDataStructuredType());
+		choiceTypeEClass.getESuperTypes().add(this.getDataStructuredType());
+		dataSupportedTypeEClass.getESuperTypes().add(this.getDataType());
+		intervalTypeEClass.getESuperTypes().add(this.getDataSupportedType());
+		collectionTypeEClass.getESuperTypes().add(this.getDataSupportedType());
+		primitiveTypeEClass.getESuperTypes().add(this.getDataType());
+		primitiveBooleanTypeEClass.getESuperTypes().add(this.getPrimitiveType());
+		primitiveNumberTypeEClass.getESuperTypes().add(this.getPrimitiveType());
+		primitiveIntegerTypeEClass.getESuperTypes().add(this.getPrimitiveNumberType());
+		primitiveRationalTypeEClass.getESuperTypes().add(this.getPrimitiveNumberType());
+		primitiveFloatTypeEClass.getESuperTypes().add(this.getPrimitiveNumberType());
+		primitiveRealTypeEClass.getESuperTypes().add(this.getPrimitiveNumberType());
+		primitiveTimeTypeEClass.getESuperTypes().add(this.getPrimitiveNumberType());
+		primitiveCharacterTypeEClass.getESuperTypes().add(this.getPrimitiveType());
+		primitiveStringTypeEClass.getESuperTypes().add(this.getPrimitiveType());
+		primitiveInstanceTypeEClass.getESuperTypes().add(this.getPrimitiveType());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(dataTypeEClass, DataType.class, "DataType", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getDataType_Kind(), this.getPrimitiveTypeKind(), "kind", null, 0, 1, DataType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataType_Typedef(), ecorePackage.getEBoolean(), "typedef", null, 0, 1, DataType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getDataType_Multiplicity(), theExpressionPackage.getExpression(), null, "multiplicity", null, 0, 1, DataType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getDataType_DefaultValue(), theExpressionPackage.getExpression(), null, "defaultValue", null, 0, 1, DataType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(dataTypeReferenceEClass, DataTypeReference.class, "DataTypeReference", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getDataTypeReference_Typeref(), this.getDataType(), null, "typeref", null, 0, 1, DataTypeReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getDataTypeReference_Support(), this.getDataType(), null, "support", null, 0, 1, DataTypeReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(enumerationLiteralEClass, EnumerationLiteral.class, "EnumerationLiteral", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getEnumerationLiteral_Value(), theExpressionPackage.getLiteralExpression(), null, "value", null, 0, 1, EnumerationLiteral.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(enumerationTypeEClass, EnumerationType.class, "EnumerationType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getEnumerationType_Literal(), this.getEnumerationLiteral(), null, "literal", null, 0, -1, EnumerationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(dataStructuredTypeEClass, DataStructuredType.class, "DataStructuredType", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getDataStructuredType_Property(), theInfrastructurePackage.getPropertyDefinition(), null, "property", null, 0, -1, DataStructuredType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(structureTypeEClass, StructureType.class, "StructureType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(unionTypeEClass, UnionType.class, "UnionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(choiceTypeEClass, ChoiceType.class, "ChoiceType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(dataSupportedTypeEClass, DataSupportedType.class, "DataSupportedType", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getDataSupportedType_Support(), this.getDataType(), null, "support", null, 0, 1, DataSupportedType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(intervalTypeEClass, IntervalType.class, "IntervalType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getIntervalType_Lopen(), ecorePackage.getEBoolean(), "lopen", null, 1, 1, IntervalType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getIntervalType_Ropen(), ecorePackage.getEBoolean(), "ropen", null, 1, 1, IntervalType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getIntervalType_Infimum(), theExpressionPackage.getExpression(), null, "infimum", null, 1, 1, IntervalType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getIntervalType_Supremum(), theExpressionPackage.getExpression(), null, "supremum", null, 1, 1, IntervalType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(collectionTypeEClass, CollectionType.class, "CollectionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getCollectionType_Container(), this.getCollectionKind(), "container", "list", 0, 1, CollectionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getCollectionType_Size(), ecorePackage.getEInt(), "size", "-1", 0, 1, CollectionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getCollectionType_Unbounded(), ecorePackage.getEBoolean(), "unbounded", null, 0, 1, CollectionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(primitiveTypeEClass, PrimitiveType.class, "PrimitiveType", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(primitiveBooleanTypeEClass, PrimitiveBooleanType.class, "PrimitiveBooleanType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(primitiveNumberTypeEClass, PrimitiveNumberType.class, "PrimitiveNumberType", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getPrimitiveNumberType_Sign(), this.getPrimitiveNumberSign(), "sign", "any", 0, 1, PrimitiveNumberType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getPrimitiveNumberType_Size(), ecorePackage.getEInt(), "size", null, 0, 1, PrimitiveNumberType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(primitiveIntegerTypeEClass, PrimitiveIntegerType.class, "PrimitiveIntegerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(primitiveRationalTypeEClass, PrimitiveRationalType.class, "PrimitiveRationalType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(primitiveFloatTypeEClass, PrimitiveFloatType.class, "PrimitiveFloatType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(primitiveRealTypeEClass, PrimitiveRealType.class, "PrimitiveRealType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(primitiveTimeTypeEClass, PrimitiveTimeType.class, "PrimitiveTimeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getPrimitiveTimeType_Clock(), ecorePackage.getEBoolean(), "clock", "false", 1, 1, PrimitiveTimeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPrimitiveTimeType_Support(), this.getPrimitiveNumberType(), null, "support", null, 0, 1, PrimitiveTimeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(primitiveCharacterTypeEClass, PrimitiveCharacterType.class, "PrimitiveCharacterType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(primitiveStringTypeEClass, PrimitiveStringType.class, "PrimitiveStringType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getPrimitiveStringType_Size(), ecorePackage.getEInt(), "size", null, 0, 1, PrimitiveStringType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(primitiveInstanceTypeEClass, PrimitiveInstanceType.class, "PrimitiveInstanceType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getPrimitiveInstanceType_Expected(), this.getPrimitiveInstanceKind(), "expected", "machine", 0, 1, PrimitiveInstanceType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPrimitiveInstanceType_Model(), theCommonPackage.getNamedElement(), null, "model", null, 0, 1, PrimitiveInstanceType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Initialize enums and add enum literals
+		initEEnum(primitiveTypeKindEEnum, PrimitiveTypeKind.class, "PrimitiveTypeKind");
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.BOOLEAN);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.INT);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.INTEGER);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.RAT);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.RATIONAL);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.FLOAT);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.DOUBLE);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.REAL);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.TIME);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.UINT);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.UINTEGER);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.URAT);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.URATIONAL);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.UFLOAT);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.UDOUBLE);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.UREAL);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.CHAR);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.STRING);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.BUFFER);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.MESSAGE);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.PORT);
+		addEEnumLiteral(primitiveTypeKindEEnum, PrimitiveTypeKind.MACHINE);
+
+		initEEnum(collectionKindEEnum, CollectionKind.class, "CollectionKind");
+		addEEnumLiteral(collectionKindEEnum, CollectionKind.VECTOR);
+		addEEnumLiteral(collectionKindEEnum, CollectionKind.RVECTOR);
+		addEEnumLiteral(collectionKindEEnum, CollectionKind.LIST);
+		addEEnumLiteral(collectionKindEEnum, CollectionKind.SET);
+		addEEnumLiteral(collectionKindEEnum, CollectionKind.BAG);
+		addEEnumLiteral(collectionKindEEnum, CollectionKind.FIFO);
+		addEEnumLiteral(collectionKindEEnum, CollectionKind.LIFO);
+
+		initEEnum(primitiveNumberSignEEnum, PrimitiveNumberSign.class, "PrimitiveNumberSign");
+		addEEnumLiteral(primitiveNumberSignEEnum, PrimitiveNumberSign.ANY);
+		addEEnumLiteral(primitiveNumberSignEEnum, PrimitiveNumberSign.NEGATIVE);
+		addEEnumLiteral(primitiveNumberSignEEnum, PrimitiveNumberSign.NEGATIVE_STRICT);
+		addEEnumLiteral(primitiveNumberSignEEnum, PrimitiveNumberSign.POSITIVE);
+		addEEnumLiteral(primitiveNumberSignEEnum, PrimitiveNumberSign.POSITIVE_STRICT);
+
+		initEEnum(primitiveInstanceKindEEnum, PrimitiveInstanceKind.class, "PrimitiveInstanceKind");
+		addEEnumLiteral(primitiveInstanceKindEEnum, PrimitiveInstanceKind.BUFFER);
+		addEEnumLiteral(primitiveInstanceKindEEnum, PrimitiveInstanceKind.MESSAGE);
+		addEEnumLiteral(primitiveInstanceKindEEnum, PrimitiveInstanceKind.PORT);
+		addEEnumLiteral(primitiveInstanceKindEEnum, PrimitiveInstanceKind.SIGNAL);
+		addEEnumLiteral(primitiveInstanceKindEEnum, PrimitiveInstanceKind.COM_POINT);
+		addEEnumLiteral(primitiveInstanceKindEEnum, PrimitiveInstanceKind.CHANNEL);
+		addEEnumLiteral(primitiveInstanceKindEEnum, PrimitiveInstanceKind.MACHINE);
+		addEEnumLiteral(primitiveInstanceKindEEnum, PrimitiveInstanceKind.VERTEX);
+	}
+
+} //DatatypePackageImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/EnumerationLiteralImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/EnumerationLiteralImpl.java
new file mode 100644
index 0000000..7acae4b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/EnumerationLiteralImpl.java
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral;
+
+import org.eclipse.efm.ecore.formalml.expression.LiteralExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Enumeration Literal</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationLiteralImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class EnumerationLiteralImpl extends NamedElementImpl implements EnumerationLiteral {
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected LiteralExpression value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EnumerationLiteralImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.ENUMERATION_LITERAL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralExpression getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetValue(LiteralExpression newValue, NotificationChain msgs) {
+		LiteralExpression oldValue = value;
+		value = newValue;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DatatypePackage.ENUMERATION_LITERAL__VALUE, oldValue, newValue);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(LiteralExpression newValue) {
+		if (newValue != value) {
+			NotificationChain msgs = null;
+			if (value != null)
+				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.ENUMERATION_LITERAL__VALUE, null, msgs);
+			if (newValue != null)
+				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.ENUMERATION_LITERAL__VALUE, null, msgs);
+			msgs = basicSetValue(newValue, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.ENUMERATION_LITERAL__VALUE, newValue, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_LITERAL__VALUE:
+				return basicSetValue(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_LITERAL__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_LITERAL__VALUE:
+				setValue((LiteralExpression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_LITERAL__VALUE:
+				setValue((LiteralExpression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_LITERAL__VALUE:
+				return value != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //EnumerationLiteralImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/EnumerationTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/EnumerationTypeImpl.java
new file mode 100644
index 0000000..4eb59b7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/EnumerationTypeImpl.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral;
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationType;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Enumeration Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.EnumerationTypeImpl#getLiteral <em>Literal</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class EnumerationTypeImpl extends DataTypeImpl implements EnumerationType {
+	/**
+	 * The cached value of the '{@link #getLiteral() <em>Literal</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLiteral()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<EnumerationLiteral> literal;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EnumerationTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.ENUMERATION_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<EnumerationLiteral> getLiteral() {
+		if (literal == null) {
+			literal = new EObjectContainmentEList<EnumerationLiteral>(EnumerationLiteral.class, this, DatatypePackage.ENUMERATION_TYPE__LITERAL);
+		}
+		return literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_TYPE__LITERAL:
+				return ((InternalEList<?>)getLiteral()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_TYPE__LITERAL:
+				return getLiteral();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_TYPE__LITERAL:
+				getLiteral().clear();
+				getLiteral().addAll((Collection<? extends EnumerationLiteral>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_TYPE__LITERAL:
+				getLiteral().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.ENUMERATION_TYPE__LITERAL:
+				return literal != null && !literal.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //EnumerationTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/IntervalTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/IntervalTypeImpl.java
new file mode 100644
index 0000000..07824b0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/IntervalTypeImpl.java
@@ -0,0 +1,374 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.IntervalType;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Interval Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.IntervalTypeImpl#isLopen <em>Lopen</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.IntervalTypeImpl#isRopen <em>Ropen</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.IntervalTypeImpl#getInfimum <em>Infimum</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.IntervalTypeImpl#getSupremum <em>Supremum</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class IntervalTypeImpl extends DataSupportedTypeImpl implements IntervalType {
+	/**
+	 * The default value of the '{@link #isLopen() <em>Lopen</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isLopen()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean LOPEN_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isLopen() <em>Lopen</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isLopen()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean lopen = LOPEN_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isRopen() <em>Ropen</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isRopen()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean ROPEN_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isRopen() <em>Ropen</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isRopen()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean ropen = ROPEN_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getInfimum() <em>Infimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInfimum()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression infimum;
+
+	/**
+	 * The cached value of the '{@link #getSupremum() <em>Supremum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSupremum()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression supremum;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IntervalTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.INTERVAL_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isLopen() {
+		return lopen;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLopen(boolean newLopen) {
+		boolean oldLopen = lopen;
+		lopen = newLopen;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.INTERVAL_TYPE__LOPEN, oldLopen, lopen));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isRopen() {
+		return ropen;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRopen(boolean newRopen) {
+		boolean oldRopen = ropen;
+		ropen = newRopen;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.INTERVAL_TYPE__ROPEN, oldRopen, ropen));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getInfimum() {
+		return infimum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetInfimum(Expression newInfimum, NotificationChain msgs) {
+		Expression oldInfimum = infimum;
+		infimum = newInfimum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DatatypePackage.INTERVAL_TYPE__INFIMUM, oldInfimum, newInfimum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInfimum(Expression newInfimum) {
+		if (newInfimum != infimum) {
+			NotificationChain msgs = null;
+			if (infimum != null)
+				msgs = ((InternalEObject)infimum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.INTERVAL_TYPE__INFIMUM, null, msgs);
+			if (newInfimum != null)
+				msgs = ((InternalEObject)newInfimum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.INTERVAL_TYPE__INFIMUM, null, msgs);
+			msgs = basicSetInfimum(newInfimum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.INTERVAL_TYPE__INFIMUM, newInfimum, newInfimum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getSupremum() {
+		return supremum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetSupremum(Expression newSupremum, NotificationChain msgs) {
+		Expression oldSupremum = supremum;
+		supremum = newSupremum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DatatypePackage.INTERVAL_TYPE__SUPREMUM, oldSupremum, newSupremum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSupremum(Expression newSupremum) {
+		if (newSupremum != supremum) {
+			NotificationChain msgs = null;
+			if (supremum != null)
+				msgs = ((InternalEObject)supremum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.INTERVAL_TYPE__SUPREMUM, null, msgs);
+			if (newSupremum != null)
+				msgs = ((InternalEObject)newSupremum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.INTERVAL_TYPE__SUPREMUM, null, msgs);
+			msgs = basicSetSupremum(newSupremum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.INTERVAL_TYPE__SUPREMUM, newSupremum, newSupremum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case DatatypePackage.INTERVAL_TYPE__INFIMUM:
+				return basicSetInfimum(null, msgs);
+			case DatatypePackage.INTERVAL_TYPE__SUPREMUM:
+				return basicSetSupremum(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.INTERVAL_TYPE__LOPEN:
+				return isLopen();
+			case DatatypePackage.INTERVAL_TYPE__ROPEN:
+				return isRopen();
+			case DatatypePackage.INTERVAL_TYPE__INFIMUM:
+				return getInfimum();
+			case DatatypePackage.INTERVAL_TYPE__SUPREMUM:
+				return getSupremum();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.INTERVAL_TYPE__LOPEN:
+				setLopen((Boolean)newValue);
+				return;
+			case DatatypePackage.INTERVAL_TYPE__ROPEN:
+				setRopen((Boolean)newValue);
+				return;
+			case DatatypePackage.INTERVAL_TYPE__INFIMUM:
+				setInfimum((Expression)newValue);
+				return;
+			case DatatypePackage.INTERVAL_TYPE__SUPREMUM:
+				setSupremum((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.INTERVAL_TYPE__LOPEN:
+				setLopen(LOPEN_EDEFAULT);
+				return;
+			case DatatypePackage.INTERVAL_TYPE__ROPEN:
+				setRopen(ROPEN_EDEFAULT);
+				return;
+			case DatatypePackage.INTERVAL_TYPE__INFIMUM:
+				setInfimum((Expression)null);
+				return;
+			case DatatypePackage.INTERVAL_TYPE__SUPREMUM:
+				setSupremum((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.INTERVAL_TYPE__LOPEN:
+				return lopen != LOPEN_EDEFAULT;
+			case DatatypePackage.INTERVAL_TYPE__ROPEN:
+				return ropen != ROPEN_EDEFAULT;
+			case DatatypePackage.INTERVAL_TYPE__INFIMUM:
+				return infimum != null;
+			case DatatypePackage.INTERVAL_TYPE__SUPREMUM:
+				return supremum != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (lopen: ");
+		result.append(lopen);
+		result.append(", ropen: ");
+		result.append(ropen);
+		result.append(')');
+		return result.toString();
+	}
+
+} //IntervalTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveBooleanTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveBooleanTypeImpl.java
new file mode 100644
index 0000000..9937b1a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveBooleanTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Boolean Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class PrimitiveBooleanTypeImpl extends PrimitiveTypeImpl implements PrimitiveBooleanType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveBooleanTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_BOOLEAN_TYPE;
+	}
+
+} //PrimitiveBooleanTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveCharacterTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveCharacterTypeImpl.java
new file mode 100644
index 0000000..08af4c8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveCharacterTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Character Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class PrimitiveCharacterTypeImpl extends PrimitiveTypeImpl implements PrimitiveCharacterType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveCharacterTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_CHARACTER_TYPE;
+	}
+
+} //PrimitiveCharacterTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveFloatTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveFloatTypeImpl.java
new file mode 100644
index 0000000..f476a75
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveFloatTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Float Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class PrimitiveFloatTypeImpl extends PrimitiveNumberTypeImpl implements PrimitiveFloatType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveFloatTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_FLOAT_TYPE;
+	}
+
+} //PrimitiveFloatTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveInstanceTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveInstanceTypeImpl.java
new file mode 100644
index 0000000..bd8a0b4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveInstanceTypeImpl.java
@@ -0,0 +1,236 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Instance Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveInstanceTypeImpl#getExpected <em>Expected</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveInstanceTypeImpl#getModel <em>Model</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class PrimitiveInstanceTypeImpl extends PrimitiveTypeImpl implements PrimitiveInstanceType {
+	/**
+	 * The default value of the '{@link #getExpected() <em>Expected</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExpected()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final PrimitiveInstanceKind EXPECTED_EDEFAULT = PrimitiveInstanceKind.MACHINE;
+
+	/**
+	 * The cached value of the '{@link #getExpected() <em>Expected</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExpected()
+	 * @generated
+	 * @ordered
+	 */
+	protected PrimitiveInstanceKind expected = EXPECTED_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getModel() <em>Model</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getModel()
+	 * @generated
+	 * @ordered
+	 */
+	protected NamedElement model;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveInstanceTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_INSTANCE_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveInstanceKind getExpected() {
+		return expected;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setExpected(PrimitiveInstanceKind newExpected) {
+		PrimitiveInstanceKind oldExpected = expected;
+		expected = newExpected == null ? EXPECTED_EDEFAULT : newExpected;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.PRIMITIVE_INSTANCE_TYPE__EXPECTED, oldExpected, expected));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement getModel() {
+		if (model != null && model.eIsProxy()) {
+			InternalEObject oldModel = (InternalEObject)model;
+			model = (NamedElement)eResolveProxy(oldModel);
+			if (model != oldModel) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DatatypePackage.PRIMITIVE_INSTANCE_TYPE__MODEL, oldModel, model));
+			}
+		}
+		return model;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement basicGetModel() {
+		return model;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setModel(NamedElement newModel) {
+		NamedElement oldModel = model;
+		model = newModel;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.PRIMITIVE_INSTANCE_TYPE__MODEL, oldModel, model));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE__EXPECTED:
+				return getExpected();
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE__MODEL:
+				if (resolve) return getModel();
+				return basicGetModel();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE__EXPECTED:
+				setExpected((PrimitiveInstanceKind)newValue);
+				return;
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE__MODEL:
+				setModel((NamedElement)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE__EXPECTED:
+				setExpected(EXPECTED_EDEFAULT);
+				return;
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE__MODEL:
+				setModel((NamedElement)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE__EXPECTED:
+				return expected != EXPECTED_EDEFAULT;
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE__MODEL:
+				return model != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (expected: ");
+		result.append(expected);
+		result.append(')');
+		return result.toString();
+	}
+
+} //PrimitiveInstanceTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveIntegerTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveIntegerTypeImpl.java
new file mode 100644
index 0000000..7349f51
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveIntegerTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Integer Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class PrimitiveIntegerTypeImpl extends PrimitiveNumberTypeImpl implements PrimitiveIntegerType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveIntegerTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_INTEGER_TYPE;
+	}
+
+} //PrimitiveIntegerTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveNumberTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveNumberTypeImpl.java
new file mode 100644
index 0000000..c9c0c3a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveNumberTypeImpl.java
@@ -0,0 +1,227 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Number Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveNumberTypeImpl#getSign <em>Sign</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveNumberTypeImpl#getSize <em>Size</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class PrimitiveNumberTypeImpl extends PrimitiveTypeImpl implements PrimitiveNumberType {
+	/**
+	 * The default value of the '{@link #getSign() <em>Sign</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSign()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final PrimitiveNumberSign SIGN_EDEFAULT = PrimitiveNumberSign.ANY;
+
+	/**
+	 * The cached value of the '{@link #getSign() <em>Sign</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSign()
+	 * @generated
+	 * @ordered
+	 */
+	protected PrimitiveNumberSign sign = SIGN_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getSize() <em>Size</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSize()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int SIZE_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getSize() <em>Size</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSize()
+	 * @generated
+	 * @ordered
+	 */
+	protected int size = SIZE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveNumberTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_NUMBER_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveNumberSign getSign() {
+		return sign;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSign(PrimitiveNumberSign newSign) {
+		PrimitiveNumberSign oldSign = sign;
+		sign = newSign == null ? SIGN_EDEFAULT : newSign;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIGN, oldSign, sign));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getSize() {
+		return size;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSize(int newSize) {
+		int oldSize = size;
+		size = newSize;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIZE, oldSize, size));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIGN:
+				return getSign();
+			case DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIZE:
+				return getSize();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIGN:
+				setSign((PrimitiveNumberSign)newValue);
+				return;
+			case DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIZE:
+				setSize((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIGN:
+				setSign(SIGN_EDEFAULT);
+				return;
+			case DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIZE:
+				setSize(SIZE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIGN:
+				return sign != SIGN_EDEFAULT;
+			case DatatypePackage.PRIMITIVE_NUMBER_TYPE__SIZE:
+				return size != SIZE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (sign: ");
+		result.append(sign);
+		result.append(", size: ");
+		result.append(size);
+		result.append(')');
+		return result.toString();
+	}
+
+} //PrimitiveNumberTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveRationalTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveRationalTypeImpl.java
new file mode 100644
index 0000000..db51f83
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveRationalTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Rational Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class PrimitiveRationalTypeImpl extends PrimitiveNumberTypeImpl implements PrimitiveRationalType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveRationalTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_RATIONAL_TYPE;
+	}
+
+} //PrimitiveRationalTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveRealTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveRealTypeImpl.java
new file mode 100644
index 0000000..9f4a05d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveRealTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Real Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class PrimitiveRealTypeImpl extends PrimitiveNumberTypeImpl implements PrimitiveRealType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveRealTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_REAL_TYPE;
+	}
+
+} //PrimitiveRealTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveStringTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveStringTypeImpl.java
new file mode 100644
index 0000000..a92ddb8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveStringTypeImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive String Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveStringTypeImpl#getSize <em>Size</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class PrimitiveStringTypeImpl extends PrimitiveTypeImpl implements PrimitiveStringType {
+	/**
+	 * The default value of the '{@link #getSize() <em>Size</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSize()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int SIZE_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getSize() <em>Size</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSize()
+	 * @generated
+	 * @ordered
+	 */
+	protected int size = SIZE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveStringTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_STRING_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getSize() {
+		return size;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSize(int newSize) {
+		int oldSize = size;
+		size = newSize;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.PRIMITIVE_STRING_TYPE__SIZE, oldSize, size));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_STRING_TYPE__SIZE:
+				return getSize();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_STRING_TYPE__SIZE:
+				setSize((Integer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_STRING_TYPE__SIZE:
+				setSize(SIZE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_STRING_TYPE__SIZE:
+				return size != SIZE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (size: ");
+		result.append(size);
+		result.append(')');
+		return result.toString();
+	}
+
+} //PrimitiveStringTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveTimeTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveTimeTypeImpl.java
new file mode 100644
index 0000000..0585020
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveTimeTypeImpl.java
@@ -0,0 +1,253 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Time Type</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTimeTypeImpl#isClock <em>Clock</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.datatype.impl.PrimitiveTimeTypeImpl#getSupport <em>Support</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class PrimitiveTimeTypeImpl extends PrimitiveNumberTypeImpl implements PrimitiveTimeType {
+	/**
+	 * The default value of the '{@link #isClock() <em>Clock</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isClock()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean CLOCK_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isClock() <em>Clock</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isClock()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean clock = CLOCK_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getSupport() <em>Support</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSupport()
+	 * @generated
+	 * @ordered
+	 */
+	protected PrimitiveNumberType support;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveTimeTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_TIME_TYPE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isClock() {
+		return clock;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setClock(boolean newClock) {
+		boolean oldClock = clock;
+		clock = newClock;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.PRIMITIVE_TIME_TYPE__CLOCK, oldClock, clock));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PrimitiveNumberType getSupport() {
+		return support;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetSupport(PrimitiveNumberType newSupport, NotificationChain msgs) {
+		PrimitiveNumberType oldSupport = support;
+		support = newSupport;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DatatypePackage.PRIMITIVE_TIME_TYPE__SUPPORT, oldSupport, newSupport);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSupport(PrimitiveNumberType newSupport) {
+		if (newSupport != support) {
+			NotificationChain msgs = null;
+			if (support != null)
+				msgs = ((InternalEObject)support).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.PRIMITIVE_TIME_TYPE__SUPPORT, null, msgs);
+			if (newSupport != null)
+				msgs = ((InternalEObject)newSupport).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DatatypePackage.PRIMITIVE_TIME_TYPE__SUPPORT, null, msgs);
+			msgs = basicSetSupport(newSupport, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DatatypePackage.PRIMITIVE_TIME_TYPE__SUPPORT, newSupport, newSupport));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_TIME_TYPE__SUPPORT:
+				return basicSetSupport(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_TIME_TYPE__CLOCK:
+				return isClock();
+			case DatatypePackage.PRIMITIVE_TIME_TYPE__SUPPORT:
+				return getSupport();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_TIME_TYPE__CLOCK:
+				setClock((Boolean)newValue);
+				return;
+			case DatatypePackage.PRIMITIVE_TIME_TYPE__SUPPORT:
+				setSupport((PrimitiveNumberType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_TIME_TYPE__CLOCK:
+				setClock(CLOCK_EDEFAULT);
+				return;
+			case DatatypePackage.PRIMITIVE_TIME_TYPE__SUPPORT:
+				setSupport((PrimitiveNumberType)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DatatypePackage.PRIMITIVE_TIME_TYPE__CLOCK:
+				return clock != CLOCK_EDEFAULT;
+			case DatatypePackage.PRIMITIVE_TIME_TYPE__SUPPORT:
+				return support != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (clock: ");
+		result.append(clock);
+		result.append(')');
+		return result.toString();
+	}
+
+} //PrimitiveTimeTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveTypeImpl.java
new file mode 100644
index 0000000..e45940c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/PrimitiveTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveType;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Primitive Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public abstract class PrimitiveTypeImpl extends DataTypeImpl implements PrimitiveType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PrimitiveTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.PRIMITIVE_TYPE;
+	}
+
+} //PrimitiveTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/StructureTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/StructureTypeImpl.java
new file mode 100644
index 0000000..588713b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/StructureTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.StructureType;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Structure Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class StructureTypeImpl extends DataStructuredTypeImpl implements StructureType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StructureTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.STRUCTURE_TYPE;
+	}
+
+} //StructureTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/UnionTypeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/UnionTypeImpl.java
new file mode 100644
index 0000000..b4c7a13
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/impl/UnionTypeImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.UnionType;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Union Type</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class UnionTypeImpl extends DataStructuredTypeImpl implements UnionType {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UnionTypeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DatatypePackage.Literals.UNION_TYPE;
+	}
+
+} //UnionTypeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/util/DatatypeAdapterFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/util/DatatypeAdapterFactory.java
new file mode 100644
index 0000000..07396ab
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/util/DatatypeAdapterFactory.java
@@ -0,0 +1,585 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.util;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+import org.eclipse.efm.ecore.formalml.common.Type;
+
+import org.eclipse.efm.ecore.formalml.datatype.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage
+ * @generated
+ */
+public class DatatypeAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static DatatypePackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DatatypeAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = DatatypePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DatatypeSwitch<Adapter> modelSwitch =
+		new DatatypeSwitch<Adapter>() {
+			@Override
+			public Adapter caseDataType(DataType object) {
+				return createDataTypeAdapter();
+			}
+			@Override
+			public Adapter caseDataTypeReference(DataTypeReference object) {
+				return createDataTypeReferenceAdapter();
+			}
+			@Override
+			public Adapter caseEnumerationLiteral(EnumerationLiteral object) {
+				return createEnumerationLiteralAdapter();
+			}
+			@Override
+			public Adapter caseEnumerationType(EnumerationType object) {
+				return createEnumerationTypeAdapter();
+			}
+			@Override
+			public Adapter caseDataStructuredType(DataStructuredType object) {
+				return createDataStructuredTypeAdapter();
+			}
+			@Override
+			public Adapter caseStructureType(StructureType object) {
+				return createStructureTypeAdapter();
+			}
+			@Override
+			public Adapter caseUnionType(UnionType object) {
+				return createUnionTypeAdapter();
+			}
+			@Override
+			public Adapter caseChoiceType(ChoiceType object) {
+				return createChoiceTypeAdapter();
+			}
+			@Override
+			public Adapter caseDataSupportedType(DataSupportedType object) {
+				return createDataSupportedTypeAdapter();
+			}
+			@Override
+			public Adapter caseIntervalType(IntervalType object) {
+				return createIntervalTypeAdapter();
+			}
+			@Override
+			public Adapter caseCollectionType(CollectionType object) {
+				return createCollectionTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveType(PrimitiveType object) {
+				return createPrimitiveTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveBooleanType(PrimitiveBooleanType object) {
+				return createPrimitiveBooleanTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveNumberType(PrimitiveNumberType object) {
+				return createPrimitiveNumberTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveIntegerType(PrimitiveIntegerType object) {
+				return createPrimitiveIntegerTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveRationalType(PrimitiveRationalType object) {
+				return createPrimitiveRationalTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveFloatType(PrimitiveFloatType object) {
+				return createPrimitiveFloatTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveRealType(PrimitiveRealType object) {
+				return createPrimitiveRealTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveTimeType(PrimitiveTimeType object) {
+				return createPrimitiveTimeTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveCharacterType(PrimitiveCharacterType object) {
+				return createPrimitiveCharacterTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveStringType(PrimitiveStringType object) {
+				return createPrimitiveStringTypeAdapter();
+			}
+			@Override
+			public Adapter casePrimitiveInstanceType(PrimitiveInstanceType object) {
+				return createPrimitiveInstanceTypeAdapter();
+			}
+			@Override
+			public Adapter caseAbstractElement(AbstractElement object) {
+				return createAbstractElementAdapter();
+			}
+			@Override
+			public Adapter caseNamedElement(NamedElement object) {
+				return createNamedElementAdapter();
+			}
+			@Override
+			public Adapter caseType(Type object) {
+				return createTypeAdapter();
+			}
+			@Override
+			public Adapter caseClassifierDefinition(ClassifierDefinition object) {
+				return createClassifierDefinitionAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.DataType <em>Data Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataType
+	 * @generated
+	 */
+	public Adapter createDataTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.DataTypeReference <em>Data Type Reference</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataTypeReference
+	 * @generated
+	 */
+	public Adapter createDataTypeReferenceAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral <em>Enumeration Literal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral
+	 * @generated
+	 */
+	public Adapter createEnumerationLiteralAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.EnumerationType <em>Enumeration Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.EnumerationType
+	 * @generated
+	 */
+	public Adapter createEnumerationTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.DataStructuredType <em>Data Structured Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataStructuredType
+	 * @generated
+	 */
+	public Adapter createDataStructuredTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.StructureType <em>Structure Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.StructureType
+	 * @generated
+	 */
+	public Adapter createStructureTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.UnionType <em>Union Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.UnionType
+	 * @generated
+	 */
+	public Adapter createUnionTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.ChoiceType <em>Choice Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.ChoiceType
+	 * @generated
+	 */
+	public Adapter createChoiceTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.DataSupportedType <em>Data Supported Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.DataSupportedType
+	 * @generated
+	 */
+	public Adapter createDataSupportedTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.IntervalType <em>Interval Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.IntervalType
+	 * @generated
+	 */
+	public Adapter createIntervalTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.CollectionType <em>Collection Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.CollectionType
+	 * @generated
+	 */
+	public Adapter createCollectionTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveType <em>Primitive Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveType
+	 * @generated
+	 */
+	public Adapter createPrimitiveTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType <em>Primitive Boolean Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType
+	 * @generated
+	 */
+	public Adapter createPrimitiveBooleanTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType <em>Primitive Number Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType
+	 * @generated
+	 */
+	public Adapter createPrimitiveNumberTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType <em>Primitive Integer Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType
+	 * @generated
+	 */
+	public Adapter createPrimitiveIntegerTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType <em>Primitive Rational Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType
+	 * @generated
+	 */
+	public Adapter createPrimitiveRationalTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType <em>Primitive Float Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType
+	 * @generated
+	 */
+	public Adapter createPrimitiveFloatTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType <em>Primitive Real Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType
+	 * @generated
+	 */
+	public Adapter createPrimitiveRealTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType <em>Primitive Time Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType
+	 * @generated
+	 */
+	public Adapter createPrimitiveTimeTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType <em>Primitive Character Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType
+	 * @generated
+	 */
+	public Adapter createPrimitiveCharacterTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType <em>Primitive String Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType
+	 * @generated
+	 */
+	public Adapter createPrimitiveStringTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType <em>Primitive Instance Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType
+	 * @generated
+	 */
+	public Adapter createPrimitiveInstanceTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.AbstractElement <em>Abstract Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.AbstractElement
+	 * @generated
+	 */
+	public Adapter createAbstractElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.NamedElement <em>Named Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.NamedElement
+	 * @generated
+	 */
+	public Adapter createNamedElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.Type <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.Type
+	 * @generated
+	 */
+	public Adapter createTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.ClassifierDefinition <em>Classifier Definition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.ClassifierDefinition
+	 * @generated
+	 */
+	public Adapter createClassifierDefinitionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //DatatypeAdapterFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/util/DatatypeSwitch.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/util/DatatypeSwitch.java
new file mode 100644
index 0000000..852227f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/util/DatatypeSwitch.java
@@ -0,0 +1,752 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.datatype.util;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+import org.eclipse.efm.ecore.formalml.common.Type;
+
+import org.eclipse.efm.ecore.formalml.datatype.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.datatype.DatatypePackage
+ * @generated
+ */
+public class DatatypeSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static DatatypePackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DatatypeSwitch() {
+		if (modelPackage == null) {
+			modelPackage = DatatypePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case DatatypePackage.DATA_TYPE: {
+				DataType dataType = (DataType)theEObject;
+				T result = caseDataType(dataType);
+				if (result == null) result = caseClassifierDefinition(dataType);
+				if (result == null) result = caseType(dataType);
+				if (result == null) result = caseNamedElement(dataType);
+				if (result == null) result = caseAbstractElement(dataType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.DATA_TYPE_REFERENCE: {
+				DataTypeReference dataTypeReference = (DataTypeReference)theEObject;
+				T result = caseDataTypeReference(dataTypeReference);
+				if (result == null) result = caseDataType(dataTypeReference);
+				if (result == null) result = caseClassifierDefinition(dataTypeReference);
+				if (result == null) result = caseType(dataTypeReference);
+				if (result == null) result = caseNamedElement(dataTypeReference);
+				if (result == null) result = caseAbstractElement(dataTypeReference);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.ENUMERATION_LITERAL: {
+				EnumerationLiteral enumerationLiteral = (EnumerationLiteral)theEObject;
+				T result = caseEnumerationLiteral(enumerationLiteral);
+				if (result == null) result = caseNamedElement(enumerationLiteral);
+				if (result == null) result = caseAbstractElement(enumerationLiteral);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.ENUMERATION_TYPE: {
+				EnumerationType enumerationType = (EnumerationType)theEObject;
+				T result = caseEnumerationType(enumerationType);
+				if (result == null) result = caseDataType(enumerationType);
+				if (result == null) result = caseClassifierDefinition(enumerationType);
+				if (result == null) result = caseType(enumerationType);
+				if (result == null) result = caseNamedElement(enumerationType);
+				if (result == null) result = caseAbstractElement(enumerationType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.DATA_STRUCTURED_TYPE: {
+				DataStructuredType dataStructuredType = (DataStructuredType)theEObject;
+				T result = caseDataStructuredType(dataStructuredType);
+				if (result == null) result = caseDataType(dataStructuredType);
+				if (result == null) result = caseClassifierDefinition(dataStructuredType);
+				if (result == null) result = caseType(dataStructuredType);
+				if (result == null) result = caseNamedElement(dataStructuredType);
+				if (result == null) result = caseAbstractElement(dataStructuredType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.STRUCTURE_TYPE: {
+				StructureType structureType = (StructureType)theEObject;
+				T result = caseStructureType(structureType);
+				if (result == null) result = caseDataStructuredType(structureType);
+				if (result == null) result = caseDataType(structureType);
+				if (result == null) result = caseClassifierDefinition(structureType);
+				if (result == null) result = caseType(structureType);
+				if (result == null) result = caseNamedElement(structureType);
+				if (result == null) result = caseAbstractElement(structureType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.UNION_TYPE: {
+				UnionType unionType = (UnionType)theEObject;
+				T result = caseUnionType(unionType);
+				if (result == null) result = caseDataStructuredType(unionType);
+				if (result == null) result = caseDataType(unionType);
+				if (result == null) result = caseClassifierDefinition(unionType);
+				if (result == null) result = caseType(unionType);
+				if (result == null) result = caseNamedElement(unionType);
+				if (result == null) result = caseAbstractElement(unionType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.CHOICE_TYPE: {
+				ChoiceType choiceType = (ChoiceType)theEObject;
+				T result = caseChoiceType(choiceType);
+				if (result == null) result = caseDataStructuredType(choiceType);
+				if (result == null) result = caseDataType(choiceType);
+				if (result == null) result = caseClassifierDefinition(choiceType);
+				if (result == null) result = caseType(choiceType);
+				if (result == null) result = caseNamedElement(choiceType);
+				if (result == null) result = caseAbstractElement(choiceType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.DATA_SUPPORTED_TYPE: {
+				DataSupportedType dataSupportedType = (DataSupportedType)theEObject;
+				T result = caseDataSupportedType(dataSupportedType);
+				if (result == null) result = caseDataType(dataSupportedType);
+				if (result == null) result = caseClassifierDefinition(dataSupportedType);
+				if (result == null) result = caseType(dataSupportedType);
+				if (result == null) result = caseNamedElement(dataSupportedType);
+				if (result == null) result = caseAbstractElement(dataSupportedType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.INTERVAL_TYPE: {
+				IntervalType intervalType = (IntervalType)theEObject;
+				T result = caseIntervalType(intervalType);
+				if (result == null) result = caseDataSupportedType(intervalType);
+				if (result == null) result = caseDataType(intervalType);
+				if (result == null) result = caseClassifierDefinition(intervalType);
+				if (result == null) result = caseType(intervalType);
+				if (result == null) result = caseNamedElement(intervalType);
+				if (result == null) result = caseAbstractElement(intervalType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.COLLECTION_TYPE: {
+				CollectionType collectionType = (CollectionType)theEObject;
+				T result = caseCollectionType(collectionType);
+				if (result == null) result = caseDataSupportedType(collectionType);
+				if (result == null) result = caseDataType(collectionType);
+				if (result == null) result = caseClassifierDefinition(collectionType);
+				if (result == null) result = caseType(collectionType);
+				if (result == null) result = caseNamedElement(collectionType);
+				if (result == null) result = caseAbstractElement(collectionType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_TYPE: {
+				PrimitiveType primitiveType = (PrimitiveType)theEObject;
+				T result = casePrimitiveType(primitiveType);
+				if (result == null) result = caseDataType(primitiveType);
+				if (result == null) result = caseClassifierDefinition(primitiveType);
+				if (result == null) result = caseType(primitiveType);
+				if (result == null) result = caseNamedElement(primitiveType);
+				if (result == null) result = caseAbstractElement(primitiveType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_BOOLEAN_TYPE: {
+				PrimitiveBooleanType primitiveBooleanType = (PrimitiveBooleanType)theEObject;
+				T result = casePrimitiveBooleanType(primitiveBooleanType);
+				if (result == null) result = casePrimitiveType(primitiveBooleanType);
+				if (result == null) result = caseDataType(primitiveBooleanType);
+				if (result == null) result = caseClassifierDefinition(primitiveBooleanType);
+				if (result == null) result = caseType(primitiveBooleanType);
+				if (result == null) result = caseNamedElement(primitiveBooleanType);
+				if (result == null) result = caseAbstractElement(primitiveBooleanType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_NUMBER_TYPE: {
+				PrimitiveNumberType primitiveNumberType = (PrimitiveNumberType)theEObject;
+				T result = casePrimitiveNumberType(primitiveNumberType);
+				if (result == null) result = casePrimitiveType(primitiveNumberType);
+				if (result == null) result = caseDataType(primitiveNumberType);
+				if (result == null) result = caseClassifierDefinition(primitiveNumberType);
+				if (result == null) result = caseType(primitiveNumberType);
+				if (result == null) result = caseNamedElement(primitiveNumberType);
+				if (result == null) result = caseAbstractElement(primitiveNumberType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_INTEGER_TYPE: {
+				PrimitiveIntegerType primitiveIntegerType = (PrimitiveIntegerType)theEObject;
+				T result = casePrimitiveIntegerType(primitiveIntegerType);
+				if (result == null) result = casePrimitiveNumberType(primitiveIntegerType);
+				if (result == null) result = casePrimitiveType(primitiveIntegerType);
+				if (result == null) result = caseDataType(primitiveIntegerType);
+				if (result == null) result = caseClassifierDefinition(primitiveIntegerType);
+				if (result == null) result = caseType(primitiveIntegerType);
+				if (result == null) result = caseNamedElement(primitiveIntegerType);
+				if (result == null) result = caseAbstractElement(primitiveIntegerType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_RATIONAL_TYPE: {
+				PrimitiveRationalType primitiveRationalType = (PrimitiveRationalType)theEObject;
+				T result = casePrimitiveRationalType(primitiveRationalType);
+				if (result == null) result = casePrimitiveNumberType(primitiveRationalType);
+				if (result == null) result = casePrimitiveType(primitiveRationalType);
+				if (result == null) result = caseDataType(primitiveRationalType);
+				if (result == null) result = caseClassifierDefinition(primitiveRationalType);
+				if (result == null) result = caseType(primitiveRationalType);
+				if (result == null) result = caseNamedElement(primitiveRationalType);
+				if (result == null) result = caseAbstractElement(primitiveRationalType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_FLOAT_TYPE: {
+				PrimitiveFloatType primitiveFloatType = (PrimitiveFloatType)theEObject;
+				T result = casePrimitiveFloatType(primitiveFloatType);
+				if (result == null) result = casePrimitiveNumberType(primitiveFloatType);
+				if (result == null) result = casePrimitiveType(primitiveFloatType);
+				if (result == null) result = caseDataType(primitiveFloatType);
+				if (result == null) result = caseClassifierDefinition(primitiveFloatType);
+				if (result == null) result = caseType(primitiveFloatType);
+				if (result == null) result = caseNamedElement(primitiveFloatType);
+				if (result == null) result = caseAbstractElement(primitiveFloatType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_REAL_TYPE: {
+				PrimitiveRealType primitiveRealType = (PrimitiveRealType)theEObject;
+				T result = casePrimitiveRealType(primitiveRealType);
+				if (result == null) result = casePrimitiveNumberType(primitiveRealType);
+				if (result == null) result = casePrimitiveType(primitiveRealType);
+				if (result == null) result = caseDataType(primitiveRealType);
+				if (result == null) result = caseClassifierDefinition(primitiveRealType);
+				if (result == null) result = caseType(primitiveRealType);
+				if (result == null) result = caseNamedElement(primitiveRealType);
+				if (result == null) result = caseAbstractElement(primitiveRealType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_TIME_TYPE: {
+				PrimitiveTimeType primitiveTimeType = (PrimitiveTimeType)theEObject;
+				T result = casePrimitiveTimeType(primitiveTimeType);
+				if (result == null) result = casePrimitiveNumberType(primitiveTimeType);
+				if (result == null) result = casePrimitiveType(primitiveTimeType);
+				if (result == null) result = caseDataType(primitiveTimeType);
+				if (result == null) result = caseClassifierDefinition(primitiveTimeType);
+				if (result == null) result = caseType(primitiveTimeType);
+				if (result == null) result = caseNamedElement(primitiveTimeType);
+				if (result == null) result = caseAbstractElement(primitiveTimeType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_CHARACTER_TYPE: {
+				PrimitiveCharacterType primitiveCharacterType = (PrimitiveCharacterType)theEObject;
+				T result = casePrimitiveCharacterType(primitiveCharacterType);
+				if (result == null) result = casePrimitiveType(primitiveCharacterType);
+				if (result == null) result = caseDataType(primitiveCharacterType);
+				if (result == null) result = caseClassifierDefinition(primitiveCharacterType);
+				if (result == null) result = caseType(primitiveCharacterType);
+				if (result == null) result = caseNamedElement(primitiveCharacterType);
+				if (result == null) result = caseAbstractElement(primitiveCharacterType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_STRING_TYPE: {
+				PrimitiveStringType primitiveStringType = (PrimitiveStringType)theEObject;
+				T result = casePrimitiveStringType(primitiveStringType);
+				if (result == null) result = casePrimitiveType(primitiveStringType);
+				if (result == null) result = caseDataType(primitiveStringType);
+				if (result == null) result = caseClassifierDefinition(primitiveStringType);
+				if (result == null) result = caseType(primitiveStringType);
+				if (result == null) result = caseNamedElement(primitiveStringType);
+				if (result == null) result = caseAbstractElement(primitiveStringType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE: {
+				PrimitiveInstanceType primitiveInstanceType = (PrimitiveInstanceType)theEObject;
+				T result = casePrimitiveInstanceType(primitiveInstanceType);
+				if (result == null) result = casePrimitiveType(primitiveInstanceType);
+				if (result == null) result = caseDataType(primitiveInstanceType);
+				if (result == null) result = caseClassifierDefinition(primitiveInstanceType);
+				if (result == null) result = caseType(primitiveInstanceType);
+				if (result == null) result = caseNamedElement(primitiveInstanceType);
+				if (result == null) result = caseAbstractElement(primitiveInstanceType);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataType(DataType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Type Reference</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Type Reference</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataTypeReference(DataTypeReference object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Enumeration Literal</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Enumeration Literal</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseEnumerationLiteral(EnumerationLiteral object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Enumeration Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Enumeration Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseEnumerationType(EnumerationType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Structured Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Structured Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataStructuredType(DataStructuredType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Structure Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Structure Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStructureType(StructureType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Union Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Union Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseUnionType(UnionType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Choice Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Choice Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseChoiceType(ChoiceType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Supported Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Supported Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataSupportedType(DataSupportedType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Interval Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Interval Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseIntervalType(IntervalType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Collection Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Collection Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseCollectionType(CollectionType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveType(PrimitiveType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Boolean Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Boolean Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveBooleanType(PrimitiveBooleanType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Number Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Number Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveNumberType(PrimitiveNumberType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Integer Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Integer Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveIntegerType(PrimitiveIntegerType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Rational Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Rational Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveRationalType(PrimitiveRationalType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Float Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Float Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveFloatType(PrimitiveFloatType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Real Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Real Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveRealType(PrimitiveRealType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Time Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Time Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveTimeType(PrimitiveTimeType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Character Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Character Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveCharacterType(PrimitiveCharacterType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive String Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive String Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveStringType(PrimitiveStringType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Primitive Instance Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Primitive Instance Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePrimitiveInstanceType(PrimitiveInstanceType object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAbstractElement(AbstractElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Named Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Named Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseNamedElement(NamedElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseType(Type object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Classifier Definition</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Classifier Definition</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseClassifierDefinition(ClassifierDefinition object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //DatatypeSwitch
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/ChoiceTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/ChoiceTypeValidator.java
new file mode 100644
index 0000000..279a9c2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/ChoiceTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.ChoiceType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ChoiceTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/CollectionTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/CollectionTypeValidator.java
new file mode 100644
index 0000000..949bd10
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/CollectionTypeValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.CollectionKind;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.CollectionType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface CollectionTypeValidator {
+	boolean validate();
+
+	boolean validateContainer(CollectionKind value);
+	boolean validateSize(int value);
+	boolean validateUnbounded(boolean value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataStructuredTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataStructuredTypeValidator.java
new file mode 100644
index 0000000..bbbd5ea
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataStructuredTypeValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.DataStructuredType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface DataStructuredTypeValidator {
+	boolean validate();
+
+	boolean validateProperty(EList<PropertyDefinition> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataSupportedTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataSupportedTypeValidator.java
new file mode 100644
index 0000000..97b188a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataSupportedTypeValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.DataSupportedType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface DataSupportedTypeValidator {
+	boolean validate();
+
+	boolean validateSupport(DataType value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataTypeReferenceValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataTypeReferenceValidator.java
new file mode 100644
index 0000000..53a8f89
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataTypeReferenceValidator.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.DataTypeReference}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface DataTypeReferenceValidator {
+	boolean validate();
+
+	boolean validateTyperef(DataType value);
+	boolean validateSupport(DataType value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataTypeValidator.java
new file mode 100644
index 0000000..b2f4faa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/DataTypeValidator.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveTypeKind;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.DataType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface DataTypeValidator {
+	boolean validate();
+
+	boolean validateKind(PrimitiveTypeKind value);
+	boolean validateTypedef(boolean value);
+	boolean validateMultiplicity(Expression value);
+	boolean validateDefaultValue(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/EnumerationLiteralValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/EnumerationLiteralValidator.java
new file mode 100644
index 0000000..bea759d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/EnumerationLiteralValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.LiteralExpression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface EnumerationLiteralValidator {
+	boolean validate();
+
+	boolean validateValue(LiteralExpression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/EnumerationTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/EnumerationTypeValidator.java
new file mode 100644
index 0000000..bb1085b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/EnumerationTypeValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.EnumerationType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface EnumerationTypeValidator {
+	boolean validate();
+
+	boolean validateLiteral(EList<EnumerationLiteral> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/IntervalTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/IntervalTypeValidator.java
new file mode 100644
index 0000000..4c85c77
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/IntervalTypeValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.IntervalType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface IntervalTypeValidator {
+	boolean validate();
+
+	boolean validateLopen(boolean value);
+	boolean validateRopen(boolean value);
+	boolean validateInfimum(Expression value);
+	boolean validateSupremum(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveBooleanTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveBooleanTypeValidator.java
new file mode 100644
index 0000000..fa28cfa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveBooleanTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveBooleanTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveCharacterTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveCharacterTypeValidator.java
new file mode 100644
index 0000000..cbd87e4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveCharacterTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveCharacterTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveFloatTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveFloatTypeValidator.java
new file mode 100644
index 0000000..e7007f0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveFloatTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveFloatTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveInstanceTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveInstanceTypeValidator.java
new file mode 100644
index 0000000..01bcf74
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveInstanceTypeValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveInstanceTypeValidator {
+	boolean validate();
+
+	boolean validateExpected(PrimitiveInstanceKind value);
+	boolean validateModel(NamedElement value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveIntegerTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveIntegerTypeValidator.java
new file mode 100644
index 0000000..7d5777f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveIntegerTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveIntegerTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveNumberTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveNumberTypeValidator.java
new file mode 100644
index 0000000..57b2f64
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveNumberTypeValidator.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberSign;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveNumberTypeValidator {
+	boolean validate();
+
+	boolean validateSign(PrimitiveNumberSign value);
+	boolean validateSize(int value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveRationalTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveRationalTypeValidator.java
new file mode 100644
index 0000000..6b2f325
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveRationalTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveRationalTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveRealTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveRealTypeValidator.java
new file mode 100644
index 0000000..210a747
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveRealTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveRealTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveStringTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveStringTypeValidator.java
new file mode 100644
index 0000000..4f96345
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveStringTypeValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveStringTypeValidator {
+	boolean validate();
+
+	boolean validateSize(int value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveTimeTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveTimeTypeValidator.java
new file mode 100644
index 0000000..2824606
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveTimeTypeValidator.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveNumberType;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveTimeTypeValidator {
+	boolean validate();
+
+	boolean validateClock(boolean value);
+	boolean validateSupport(PrimitiveNumberType value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveTypeValidator.java
new file mode 100644
index 0000000..c3ac8c5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/PrimitiveTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.PrimitiveType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PrimitiveTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/StructureTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/StructureTypeValidator.java
new file mode 100644
index 0000000..7d02d39
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/StructureTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.StructureType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface StructureTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/UnionTypeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/UnionTypeValidator.java
new file mode 100644
index 0000000..1118c85
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/datatype/validation/UnionTypeValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.datatype.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.datatype.UnionType}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface UnionTypeValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ArithmeticAssociativeExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ArithmeticAssociativeExpression.java
new file mode 100644
index 0000000..ebfde6a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ArithmeticAssociativeExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Arithmetic Associative Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getArithmeticAssociativeExpression()
+ * @model
+ * @generated
+ */
+public interface ArithmeticAssociativeExpression extends AssociativeExpression {
+} // ArithmeticAssociativeExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ArithmeticUnaryExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ArithmeticUnaryExpression.java
new file mode 100644
index 0000000..967eeb4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ArithmeticUnaryExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Arithmetic Unary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getArithmeticUnaryExpression()
+ * @model
+ * @generated
+ */
+public interface ArithmeticUnaryExpression extends UnaryExpression {
+} // ArithmeticUnaryExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/AssignmentExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/AssignmentExpression.java
new file mode 100644
index 0000000..19648be
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/AssignmentExpression.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Assignment Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getLeftHandSide <em>Left Hand Side</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getRigthHandSide <em>Rigth Hand Side</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getAssignmentExpression()
+ * @model
+ * @generated
+ */
+public interface AssignmentExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operator</em>' attribute.
+	 * @see #setOperator(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getAssignmentExpression_Operator()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getOperator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getOperator <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operator</em>' attribute.
+	 * @see #getOperator()
+	 * @generated
+	 */
+	void setOperator(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Hand Side</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Hand Side</em>' containment reference.
+	 * @see #setLeftHandSide(LeftHandSideExpression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getAssignmentExpression_LeftHandSide()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	LeftHandSideExpression getLeftHandSide();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getLeftHandSide <em>Left Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Left Hand Side</em>' containment reference.
+	 * @see #getLeftHandSide()
+	 * @generated
+	 */
+	void setLeftHandSide(LeftHandSideExpression value);
+
+	/**
+	 * Returns the value of the '<em><b>Rigth Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Rigth Hand Side</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Rigth Hand Side</em>' containment reference.
+	 * @see #setRigthHandSide(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getAssignmentExpression_RigthHandSide()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getRigthHandSide();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getRigthHandSide <em>Rigth Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Rigth Hand Side</em>' containment reference.
+	 * @see #getRigthHandSide()
+	 * @generated
+	 */
+	void setRigthHandSide(Expression value);
+
+} // AssignmentExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/AssociativeExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/AssociativeExpression.java
new file mode 100644
index 0000000..4e273f5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/AssociativeExpression.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Associative Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.AssociativeExpression#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.AssociativeExpression#getOperand <em>Operand</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getAssociativeExpression()
+ * @model
+ * @generated
+ */
+public interface AssociativeExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operator</em>' attribute.
+	 * @see #setOperator(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getAssociativeExpression_Operator()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getOperator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.AssociativeExpression#getOperator <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operator</em>' attribute.
+	 * @see #getOperator()
+	 * @generated
+	 */
+	void setOperator(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Operand</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operand</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operand</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getAssociativeExpression_Operand()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getOperand();
+
+} // AssociativeExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/BinaryExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/BinaryExpression.java
new file mode 100644
index 0000000..528b912
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/BinaryExpression.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Binary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getLeftOperand <em>Left Operand</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getRigthOperand <em>Rigth Operand</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getBinaryExpression()
+ * @model
+ * @generated
+ */
+public interface BinaryExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operator</em>' attribute.
+	 * @see #setOperator(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getBinaryExpression_Operator()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getOperator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getOperator <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operator</em>' attribute.
+	 * @see #getOperator()
+	 * @generated
+	 */
+	void setOperator(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Left Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Operand</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Operand</em>' containment reference.
+	 * @see #setLeftOperand(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getBinaryExpression_LeftOperand()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getLeftOperand();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getLeftOperand <em>Left Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Left Operand</em>' containment reference.
+	 * @see #getLeftOperand()
+	 * @generated
+	 */
+	void setLeftOperand(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Rigth Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Rigth Operand</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Rigth Operand</em>' containment reference.
+	 * @see #setRigthOperand(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getBinaryExpression_RigthOperand()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getRigthOperand();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getRigthOperand <em>Rigth Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Rigth Operand</em>' containment reference.
+	 * @see #getRigthOperand()
+	 * @generated
+	 */
+	void setRigthOperand(Expression value);
+
+} // BinaryExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/BitwiseAssociativeExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/BitwiseAssociativeExpression.java
new file mode 100644
index 0000000..8ed112d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/BitwiseAssociativeExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Bitwise Associative Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getBitwiseAssociativeExpression()
+ * @model
+ * @generated
+ */
+public interface BitwiseAssociativeExpression extends AssociativeExpression {
+} // BitwiseAssociativeExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/BitwiseUnaryExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/BitwiseUnaryExpression.java
new file mode 100644
index 0000000..b87e479
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/BitwiseUnaryExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Bitwise Unary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getBitwiseUnaryExpression()
+ * @model
+ * @generated
+ */
+public interface BitwiseUnaryExpression extends UnaryExpression {
+} // BitwiseUnaryExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/CastExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/CastExpression.java
new file mode 100644
index 0000000..9613843
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/CastExpression.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Cast Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.CastExpression#getDatatype <em>Datatype</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getCastExpression()
+ * @model
+ * @generated
+ */
+public interface CastExpression extends UnaryExpression {
+	/**
+	 * Returns the value of the '<em><b>Datatype</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Datatype</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Datatype</em>' reference.
+	 * @see #setDatatype(DataType)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getCastExpression_Datatype()
+	 * @model
+	 * @generated
+	 */
+	DataType getDatatype();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.CastExpression#getDatatype <em>Datatype</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Datatype</em>' reference.
+	 * @see #getDatatype()
+	 * @generated
+	 */
+	void setDatatype(DataType value);
+
+} // CastExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ConditionalTestExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ConditionalTestExpression.java
new file mode 100644
index 0000000..706e4ec
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ConditionalTestExpression.java
@@ -0,0 +1,140 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Conditional Test Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getCondition <em>Condition</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getThenOperand <em>Then Operand</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getElseOperand <em>Else Operand</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getConditionalTestExpression()
+ * @model
+ * @generated
+ */
+public interface ConditionalTestExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operator</em>' attribute.
+	 * @see #setOperator(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getConditionalTestExpression_Operator()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getOperator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getOperator <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operator</em>' attribute.
+	 * @see #getOperator()
+	 * @generated
+	 */
+	void setOperator(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Condition</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Condition</em>' containment reference.
+	 * @see #setCondition(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getConditionalTestExpression_Condition()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getCondition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getCondition <em>Condition</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Condition</em>' containment reference.
+	 * @see #getCondition()
+	 * @generated
+	 */
+	void setCondition(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Then Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Then Operand</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Then Operand</em>' containment reference.
+	 * @see #setThenOperand(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getConditionalTestExpression_ThenOperand()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getThenOperand();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getThenOperand <em>Then Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Then Operand</em>' containment reference.
+	 * @see #getThenOperand()
+	 * @generated
+	 */
+	void setThenOperand(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Else Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Else Operand</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Else Operand</em>' containment reference.
+	 * @see #setElseOperand(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getConditionalTestExpression_ElseOperand()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getElseOperand();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getElseOperand <em>Else Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Else Operand</em>' containment reference.
+	 * @see #getElseOperand()
+	 * @generated
+	 */
+	void setElseOperand(Expression value);
+
+} // ConditionalTestExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/EqualityBinaryExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/EqualityBinaryExpression.java
new file mode 100644
index 0000000..19f8f65
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/EqualityBinaryExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Equality Binary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getEqualityBinaryExpression()
+ * @model
+ * @generated
+ */
+public interface EqualityBinaryExpression extends BinaryExpression {
+} // EqualityBinaryExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/Expression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/Expression.java
new file mode 100644
index 0000000..681d2eb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/Expression.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getExpression()
+ * @model abstract="true"
+ * @generated
+ */
+public interface Expression extends AbstractElement {
+} // Expression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsBuffer.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsBuffer.java
new file mode 100644
index 0000000..1d2f535
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsBuffer.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>As Buffer</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer#getBuffer <em>Buffer</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getExpressionAsBuffer()
+ * @model
+ * @generated
+ */
+public interface ExpressionAsBuffer extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Buffer</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Buffer</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Buffer</em>' containment reference.
+	 * @see #setBuffer(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getExpressionAsBuffer_Buffer()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getBuffer();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer#getBuffer <em>Buffer</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Buffer</em>' containment reference.
+	 * @see #getBuffer()
+	 * @generated
+	 */
+	void setBuffer(Expression value);
+
+} // ExpressionAsBuffer
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsChannel.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsChannel.java
new file mode 100644
index 0000000..893916b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsChannel.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>As Channel</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel#getChannel <em>Channel</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getExpressionAsChannel()
+ * @model
+ * @generated
+ */
+public interface ExpressionAsChannel extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Channel</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Channel</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Channel</em>' containment reference.
+	 * @see #setChannel(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getExpressionAsChannel_Channel()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getChannel();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel#getChannel <em>Channel</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Channel</em>' containment reference.
+	 * @see #getChannel()
+	 * @generated
+	 */
+	void setChannel(Expression value);
+
+} // ExpressionAsChannel
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsMachine.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsMachine.java
new file mode 100644
index 0000000..97d0027
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsMachine.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>As Machine</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine#getMachine <em>Machine</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getExpressionAsMachine()
+ * @model
+ * @generated
+ */
+public interface ExpressionAsMachine extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Machine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Machine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Machine</em>' containment reference.
+	 * @see #setMachine(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getExpressionAsMachine_Machine()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getMachine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine#getMachine <em>Machine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Machine</em>' containment reference.
+	 * @see #getMachine()
+	 * @generated
+	 */
+	void setMachine(Expression value);
+
+} // ExpressionAsMachine
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsPort.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsPort.java
new file mode 100644
index 0000000..91d16ae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionAsPort.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>As Port</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort#getPort <em>Port</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getExpressionAsPort()
+ * @model
+ * @generated
+ */
+public interface ExpressionAsPort extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Port</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Port</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Port</em>' containment reference.
+	 * @see #setPort(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getExpressionAsPort_Port()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getPort();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort#getPort <em>Port</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Port</em>' containment reference.
+	 * @see #getPort()
+	 * @generated
+	 */
+	void setPort(Expression value);
+
+} // ExpressionAsPort
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionFactory.java
new file mode 100644
index 0000000..938f6e2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionFactory.java
@@ -0,0 +1,511 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage
+ * @generated
+ */
+public interface ExpressionFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	ExpressionFactory eINSTANCE = org.eclipse.efm.ecore.formalml.expression.impl.ExpressionFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Value Printable Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Value Printable Expression</em>'.
+	 * @generated
+	 */
+	ValuePrintableExpression createValuePrintableExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Expression</em>'.
+	 * @generated
+	 */
+	LiteralExpression createLiteralExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Boolean Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Boolean Expression</em>'.
+	 * @generated
+	 */
+	LiteralBooleanExpression createLiteralBooleanExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Integer Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Integer Expression</em>'.
+	 * @generated
+	 */
+	LiteralIntegerExpression createLiteralIntegerExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Rational Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Rational Expression</em>'.
+	 * @generated
+	 */
+	LiteralRationalExpression createLiteralRationalExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Float Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Float Expression</em>'.
+	 * @generated
+	 */
+	LiteralFloatExpression createLiteralFloatExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Real Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Real Expression</em>'.
+	 * @generated
+	 */
+	LiteralRealExpression createLiteralRealExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Character Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Character Expression</em>'.
+	 * @generated
+	 */
+	LiteralCharacterExpression createLiteralCharacterExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal String Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal String Expression</em>'.
+	 * @generated
+	 */
+	LiteralStringExpression createLiteralStringExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Collection Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Collection Expression</em>'.
+	 * @generated
+	 */
+	LiteralCollectionExpression createLiteralCollectionExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Null Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Null Expression</em>'.
+	 * @generated
+	 */
+	LiteralNullExpression createLiteralNullExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Reference Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Reference Expression</em>'.
+	 * @generated
+	 */
+	LiteralReferenceExpression createLiteralReferenceExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Reference Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Reference Element</em>'.
+	 * @generated
+	 */
+	LiteralReferenceElement createLiteralReferenceElement();
+
+	/**
+	 * Returns a new object of class '<em>Literal This Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal This Expression</em>'.
+	 * @generated
+	 */
+	LiteralThisExpression createLiteralThisExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Self Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Self Expression</em>'.
+	 * @generated
+	 */
+	LiteralSelfExpression createLiteralSelfExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Parent Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Parent Expression</em>'.
+	 * @generated
+	 */
+	LiteralParentExpression createLiteralParentExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Super Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Super Expression</em>'.
+	 * @generated
+	 */
+	LiteralSuperExpression createLiteralSuperExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal System Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal System Expression</em>'.
+	 * @generated
+	 */
+	LiteralSystemExpression createLiteralSystemExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Env Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Env Expression</em>'.
+	 * @generated
+	 */
+	LiteralEnvExpression createLiteralEnvExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Time Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Time Expression</em>'.
+	 * @generated
+	 */
+	LiteralTimeExpression createLiteralTimeExpression();
+
+	/**
+	 * Returns a new object of class '<em>Literal Time Delta Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Literal Time Delta Expression</em>'.
+	 * @generated
+	 */
+	LiteralTimeDeltaExpression createLiteralTimeDeltaExpression();
+
+	/**
+	 * Returns a new object of class '<em>Left Hand Side Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Left Hand Side Expression</em>'.
+	 * @generated
+	 */
+	LeftHandSideExpression createLeftHandSideExpression();
+
+	/**
+	 * Returns a new object of class '<em>Increment Or Decrement Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Increment Or Decrement Expression</em>'.
+	 * @generated
+	 */
+	IncrementOrDecrementExpression createIncrementOrDecrementExpression();
+
+	/**
+	 * Returns a new object of class '<em>Increment Or Decrement Prefix Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Increment Or Decrement Prefix Expression</em>'.
+	 * @generated
+	 */
+	IncrementOrDecrementPrefixExpression createIncrementOrDecrementPrefixExpression();
+
+	/**
+	 * Returns a new object of class '<em>Increment Or Decrement Postfix Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Increment Or Decrement Postfix Expression</em>'.
+	 * @generated
+	 */
+	IncrementOrDecrementPostfixExpression createIncrementOrDecrementPostfixExpression();
+
+	/**
+	 * Returns a new object of class '<em>Assignment Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Assignment Expression</em>'.
+	 * @generated
+	 */
+	AssignmentExpression createAssignmentExpression();
+
+	/**
+	 * Returns a new object of class '<em>Newfresh Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Newfresh Expression</em>'.
+	 * @generated
+	 */
+	NewfreshExpression createNewfreshExpression();
+
+	/**
+	 * Returns a new object of class '<em>Unary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Unary Expression</em>'.
+	 * @generated
+	 */
+	UnaryExpression createUnaryExpression();
+
+	/**
+	 * Returns a new object of class '<em>Bitwise Unary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Bitwise Unary Expression</em>'.
+	 * @generated
+	 */
+	BitwiseUnaryExpression createBitwiseUnaryExpression();
+
+	/**
+	 * Returns a new object of class '<em>Logical Unary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Logical Unary Expression</em>'.
+	 * @generated
+	 */
+	LogicalUnaryExpression createLogicalUnaryExpression();
+
+	/**
+	 * Returns a new object of class '<em>Cast Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Cast Expression</em>'.
+	 * @generated
+	 */
+	CastExpression createCastExpression();
+
+	/**
+	 * Returns a new object of class '<em>Arithmetic Unary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Arithmetic Unary Expression</em>'.
+	 * @generated
+	 */
+	ArithmeticUnaryExpression createArithmeticUnaryExpression();
+
+	/**
+	 * Returns a new object of class '<em>Binary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Binary Expression</em>'.
+	 * @generated
+	 */
+	BinaryExpression createBinaryExpression();
+
+	/**
+	 * Returns a new object of class '<em>Equality Binary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Equality Binary Expression</em>'.
+	 * @generated
+	 */
+	EqualityBinaryExpression createEqualityBinaryExpression();
+
+	/**
+	 * Returns a new object of class '<em>Relational Binary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Relational Binary Expression</em>'.
+	 * @generated
+	 */
+	RelationalBinaryExpression createRelationalBinaryExpression();
+
+	/**
+	 * Returns a new object of class '<em>Relational Ternary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Relational Ternary Expression</em>'.
+	 * @generated
+	 */
+	RelationalTernaryExpression createRelationalTernaryExpression();
+
+	/**
+	 * Returns a new object of class '<em>Conditional Test Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Conditional Test Expression</em>'.
+	 * @generated
+	 */
+	ConditionalTestExpression createConditionalTestExpression();
+
+	/**
+	 * Returns a new object of class '<em>Associative Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Associative Expression</em>'.
+	 * @generated
+	 */
+	AssociativeExpression createAssociativeExpression();
+
+	/**
+	 * Returns a new object of class '<em>Arithmetic Associative Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Arithmetic Associative Expression</em>'.
+	 * @generated
+	 */
+	ArithmeticAssociativeExpression createArithmeticAssociativeExpression();
+
+	/**
+	 * Returns a new object of class '<em>Bitwise Associative Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Bitwise Associative Expression</em>'.
+	 * @generated
+	 */
+	BitwiseAssociativeExpression createBitwiseAssociativeExpression();
+
+	/**
+	 * Returns a new object of class '<em>Logical Associative Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Logical Associative Expression</em>'.
+	 * @generated
+	 */
+	LogicalAssociativeExpression createLogicalAssociativeExpression();
+
+	/**
+	 * Returns a new object of class '<em>Invoke Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Invoke Expression</em>'.
+	 * @generated
+	 */
+	InvokeExpression createInvokeExpression();
+
+	/**
+	 * Returns a new object of class '<em>Named Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Named Expression</em>'.
+	 * @generated
+	 */
+	NamedExpression createNamedExpression();
+
+	/**
+	 * Returns a new object of class '<em>Mix Tuple Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Mix Tuple Expression</em>'.
+	 * @generated
+	 */
+	MixTupleExpression createMixTupleExpression();
+
+	/**
+	 * Returns a new object of class '<em>Named Tuple Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Named Tuple Expression</em>'.
+	 * @generated
+	 */
+	NamedTupleExpression createNamedTupleExpression();
+
+	/**
+	 * Returns a new object of class '<em>Positional Tuple Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Positional Tuple Expression</em>'.
+	 * @generated
+	 */
+	PositionalTupleExpression createPositionalTupleExpression();
+
+	/**
+	 * Returns a new object of class '<em>Value Element Specification</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Value Element Specification</em>'.
+	 * @generated
+	 */
+	ValueElementSpecification createValueElementSpecification();
+
+	/**
+	 * Returns a new object of class '<em>Instantiation Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Instantiation Expression</em>'.
+	 * @generated
+	 */
+	InstantiationExpression createInstantiationExpression();
+
+	/**
+	 * Returns a new object of class '<em>As Buffer</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>As Buffer</em>'.
+	 * @generated
+	 */
+	ExpressionAsBuffer createExpressionAsBuffer();
+
+	/**
+	 * Returns a new object of class '<em>As Channel</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>As Channel</em>'.
+	 * @generated
+	 */
+	ExpressionAsChannel createExpressionAsChannel();
+
+	/**
+	 * Returns a new object of class '<em>As Machine</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>As Machine</em>'.
+	 * @generated
+	 */
+	ExpressionAsMachine createExpressionAsMachine();
+
+	/**
+	 * Returns a new object of class '<em>As Port</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>As Port</em>'.
+	 * @generated
+	 */
+	ExpressionAsPort createExpressionAsPort();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	ExpressionPackage getExpressionPackage();
+
+} //ExpressionFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionPackage.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionPackage.java
new file mode 100644
index 0000000..2783d20
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ExpressionPackage.java
@@ -0,0 +1,4780 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface ExpressionPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "expression";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efm/FormalML/Expression";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "Expression";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	ExpressionPackage eINSTANCE = org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueExpressionPrettyPrinterImpl <em>Value Expression Pretty Printer</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ValueExpressionPrettyPrinterImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValueExpressionPrettyPrinter()
+	 * @generated
+	 */
+	int VALUE_EXPRESSION_PRETTY_PRINTER = 0;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_EXPRESSION_PRETTY_PRINTER__SYMBOL = 0;
+
+	/**
+	 * The feature id for the '<em><b>Fix</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_EXPRESSION_PRETTY_PRINTER__FIX = 1;
+
+	/**
+	 * The feature id for the '<em><b>Specific</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_EXPRESSION_PRETTY_PRINTER__SPECIFIC = 2;
+
+	/**
+	 * The number of structural features of the '<em>Value Expression Pretty Printer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_EXPRESSION_PRETTY_PRINTER_FEATURE_COUNT = 3;
+
+	/**
+	 * The number of operations of the '<em>Value Expression Pretty Printer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_EXPRESSION_PRETTY_PRINTER_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionImpl <em>Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpression()
+	 * @generated
+	 */
+	int EXPRESSION = 2;
+
+	/**
+	 * The number of structural features of the '<em>Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_FEATURE_COUNT = CommonPackage.ABSTRACT_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_OPERATION_COUNT = CommonPackage.ABSTRACT_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ValuePrintableExpressionImpl <em>Value Printable Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ValuePrintableExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValuePrintableExpression()
+	 * @generated
+	 */
+	int VALUE_PRINTABLE_EXPRESSION = 1;
+
+	/**
+	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_PRINTABLE_EXPRESSION__SYMBOL = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Printer</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_PRINTABLE_EXPRESSION__PRINTER = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_PRINTABLE_EXPRESSION__OPERAND = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Value Printable Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_PRINTABLE_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Value Printable Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_PRINTABLE_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralExpressionImpl <em>Literal Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralExpression()
+	 * @generated
+	 */
+	int LITERAL_EXPRESSION = 3;
+
+	/**
+	 * The number of structural features of the '<em>Literal Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralBooleanExpressionImpl <em>Literal Boolean Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralBooleanExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralBooleanExpression()
+	 * @generated
+	 */
+	int LITERAL_BOOLEAN_EXPRESSION = 4;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_BOOLEAN_EXPRESSION__VALUE = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Boolean Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_BOOLEAN_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Boolean Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_BOOLEAN_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralIntegerExpressionImpl <em>Literal Integer Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralIntegerExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralIntegerExpression()
+	 * @generated
+	 */
+	int LITERAL_INTEGER_EXPRESSION = 5;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_INTEGER_EXPRESSION__VALUE = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Integer Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_INTEGER_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Integer Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_INTEGER_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralRationalExpressionImpl <em>Literal Rational Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralRationalExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralRationalExpression()
+	 * @generated
+	 */
+	int LITERAL_RATIONAL_EXPRESSION = 6;
+
+	/**
+	 * The feature id for the '<em><b>Numerator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_RATIONAL_EXPRESSION__NUMERATOR = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Denominator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_RATIONAL_EXPRESSION__DENOMINATOR = LITERAL_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Literal Rational Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_RATIONAL_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Literal Rational Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_RATIONAL_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralFloatExpressionImpl <em>Literal Float Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralFloatExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralFloatExpression()
+	 * @generated
+	 */
+	int LITERAL_FLOAT_EXPRESSION = 7;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_FLOAT_EXPRESSION__VALUE = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Float Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_FLOAT_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Float Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_FLOAT_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralRealExpressionImpl <em>Literal Real Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralRealExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralRealExpression()
+	 * @generated
+	 */
+	int LITERAL_REAL_EXPRESSION = 8;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REAL_EXPRESSION__VALUE = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Real Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REAL_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Real Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REAL_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralCharacterExpressionImpl <em>Literal Character Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralCharacterExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralCharacterExpression()
+	 * @generated
+	 */
+	int LITERAL_CHARACTER_EXPRESSION = 9;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_CHARACTER_EXPRESSION__VALUE = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Character Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_CHARACTER_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Character Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_CHARACTER_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralStringExpressionImpl <em>Literal String Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralStringExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralStringExpression()
+	 * @generated
+	 */
+	int LITERAL_STRING_EXPRESSION = 10;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_STRING_EXPRESSION__VALUE = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal String Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_STRING_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal String Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_STRING_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralCollectionExpressionImpl <em>Literal Collection Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralCollectionExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralCollectionExpression()
+	 * @generated
+	 */
+	int LITERAL_COLLECTION_EXPRESSION = 11;
+
+	/**
+	 * The feature id for the '<em><b>Datatype</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_COLLECTION_EXPRESSION__DATATYPE = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_COLLECTION_EXPRESSION__VALUE = LITERAL_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Literal Collection Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_COLLECTION_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Literal Collection Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_COLLECTION_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralNullExpressionImpl <em>Literal Null Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralNullExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralNullExpression()
+	 * @generated
+	 */
+	int LITERAL_NULL_EXPRESSION = 12;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_NULL_EXPRESSION__TYPE = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Literal Null Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_NULL_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Literal Null Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_NULL_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceExpressionImpl <em>Literal Reference Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralReferenceExpression()
+	 * @generated
+	 */
+	int LITERAL_REFERENCE_EXPRESSION = 13;
+
+	/**
+	 * The number of structural features of the '<em>Literal Reference Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT = LITERAL_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Reference Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT = LITERAL_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceElementImpl <em>Literal Reference Element</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceElementImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralReferenceElement()
+	 * @generated
+	 */
+	int LITERAL_REFERENCE_ELEMENT = 14;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_ELEMENT__KIND = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_ELEMENT__VALUE = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Arg</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_ELEMENT__ARG = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Literal Reference Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_ELEMENT_FEATURE_COUNT = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Literal Reference Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_REFERENCE_ELEMENT_OPERATION_COUNT = LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralThisExpressionImpl <em>Literal This Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralThisExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralThisExpression()
+	 * @generated
+	 */
+	int LITERAL_THIS_EXPRESSION = 15;
+
+	/**
+	 * The number of structural features of the '<em>Literal This Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_THIS_EXPRESSION_FEATURE_COUNT = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal This Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_THIS_EXPRESSION_OPERATION_COUNT = LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralSelfExpressionImpl <em>Literal Self Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralSelfExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralSelfExpression()
+	 * @generated
+	 */
+	int LITERAL_SELF_EXPRESSION = 16;
+
+	/**
+	 * The number of structural features of the '<em>Literal Self Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SELF_EXPRESSION_FEATURE_COUNT = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Self Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SELF_EXPRESSION_OPERATION_COUNT = LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralParentExpressionImpl <em>Literal Parent Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralParentExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralParentExpression()
+	 * @generated
+	 */
+	int LITERAL_PARENT_EXPRESSION = 17;
+
+	/**
+	 * The number of structural features of the '<em>Literal Parent Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_PARENT_EXPRESSION_FEATURE_COUNT = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Parent Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_PARENT_EXPRESSION_OPERATION_COUNT = LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralSuperExpressionImpl <em>Literal Super Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralSuperExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralSuperExpression()
+	 * @generated
+	 */
+	int LITERAL_SUPER_EXPRESSION = 18;
+
+	/**
+	 * The number of structural features of the '<em>Literal Super Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SUPER_EXPRESSION_FEATURE_COUNT = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Super Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SUPER_EXPRESSION_OPERATION_COUNT = LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralSystemExpressionImpl <em>Literal System Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralSystemExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralSystemExpression()
+	 * @generated
+	 */
+	int LITERAL_SYSTEM_EXPRESSION = 19;
+
+	/**
+	 * The number of structural features of the '<em>Literal System Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SYSTEM_EXPRESSION_FEATURE_COUNT = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal System Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_SYSTEM_EXPRESSION_OPERATION_COUNT = LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralEnvExpressionImpl <em>Literal Env Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralEnvExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralEnvExpression()
+	 * @generated
+	 */
+	int LITERAL_ENV_EXPRESSION = 20;
+
+	/**
+	 * The number of structural features of the '<em>Literal Env Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_ENV_EXPRESSION_FEATURE_COUNT = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Env Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_ENV_EXPRESSION_OPERATION_COUNT = LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralTimeExpressionImpl <em>Literal Time Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralTimeExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralTimeExpression()
+	 * @generated
+	 */
+	int LITERAL_TIME_EXPRESSION = 21;
+
+	/**
+	 * The number of structural features of the '<em>Literal Time Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_EXPRESSION_FEATURE_COUNT = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Time Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_EXPRESSION_OPERATION_COUNT = LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralTimeDeltaExpressionImpl <em>Literal Time Delta Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralTimeDeltaExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralTimeDeltaExpression()
+	 * @generated
+	 */
+	int LITERAL_TIME_DELTA_EXPRESSION = 22;
+
+	/**
+	 * The number of structural features of the '<em>Literal Time Delta Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_DELTA_EXPRESSION_FEATURE_COUNT = LITERAL_REFERENCE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Literal Time Delta Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_TIME_DELTA_EXPRESSION_OPERATION_COUNT = LITERAL_REFERENCE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LeftHandSideExpressionImpl <em>Left Hand Side Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LeftHandSideExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLeftHandSideExpression()
+	 * @generated
+	 */
+	int LEFT_HAND_SIDE_EXPRESSION = 23;
+
+	/**
+	 * The feature id for the '<em><b>Lvalue</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LEFT_HAND_SIDE_EXPRESSION__LVALUE = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Left Hand Side Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LEFT_HAND_SIDE_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Left Hand Side Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LEFT_HAND_SIDE_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementExpressionImpl <em>Increment Or Decrement Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getIncrementOrDecrementExpression()
+	 * @generated
+	 */
+	int INCREMENT_OR_DECREMENT_EXPRESSION = 24;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Increment Or Decrement Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Increment Or Decrement Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementPrefixExpressionImpl <em>Increment Or Decrement Prefix Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementPrefixExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getIncrementOrDecrementPrefixExpression()
+	 * @generated
+	 */
+	int INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION = 25;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION__OPERATOR = INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION__LEFT_HAND_SIDE = INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE;
+
+	/**
+	 * The number of structural features of the '<em>Increment Or Decrement Prefix Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION_FEATURE_COUNT = INCREMENT_OR_DECREMENT_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Increment Or Decrement Prefix Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION_OPERATION_COUNT = INCREMENT_OR_DECREMENT_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementPostfixExpressionImpl <em>Increment Or Decrement Postfix Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementPostfixExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getIncrementOrDecrementPostfixExpression()
+	 * @generated
+	 */
+	int INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION = 26;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION__OPERATOR = INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION__LEFT_HAND_SIDE = INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE;
+
+	/**
+	 * The number of structural features of the '<em>Increment Or Decrement Postfix Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION_FEATURE_COUNT = INCREMENT_OR_DECREMENT_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Increment Or Decrement Postfix Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION_OPERATION_COUNT = INCREMENT_OR_DECREMENT_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.AssignmentExpressionImpl <em>Assignment Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.AssignmentExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getAssignmentExpression()
+	 * @generated
+	 */
+	int ASSIGNMENT_EXPRESSION = 27;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_EXPRESSION__OPERATOR = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Rigth Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Assignment Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Assignment Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.NewfreshExpressionImpl <em>Newfresh Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.NewfreshExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getNewfreshExpression()
+	 * @generated
+	 */
+	int NEWFRESH_EXPRESSION = 28;
+
+	/**
+	 * The feature id for the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NEWFRESH_EXPRESSION__LEFT_HAND_SIDE = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Newfresh Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NEWFRESH_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Newfresh Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NEWFRESH_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.UnaryExpressionImpl <em>Unary Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.UnaryExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getUnaryExpression()
+	 * @generated
+	 */
+	int UNARY_EXPRESSION = 29;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNARY_EXPRESSION__OPERATOR = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNARY_EXPRESSION__OPERAND = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Unary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNARY_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Unary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNARY_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.BitwiseUnaryExpressionImpl <em>Bitwise Unary Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.BitwiseUnaryExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getBitwiseUnaryExpression()
+	 * @generated
+	 */
+	int BITWISE_UNARY_EXPRESSION = 30;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BITWISE_UNARY_EXPRESSION__OPERATOR = UNARY_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BITWISE_UNARY_EXPRESSION__OPERAND = UNARY_EXPRESSION__OPERAND;
+
+	/**
+	 * The number of structural features of the '<em>Bitwise Unary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BITWISE_UNARY_EXPRESSION_FEATURE_COUNT = UNARY_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Bitwise Unary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BITWISE_UNARY_EXPRESSION_OPERATION_COUNT = UNARY_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LogicalUnaryExpressionImpl <em>Logical Unary Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LogicalUnaryExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLogicalUnaryExpression()
+	 * @generated
+	 */
+	int LOGICAL_UNARY_EXPRESSION = 31;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOGICAL_UNARY_EXPRESSION__OPERATOR = UNARY_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOGICAL_UNARY_EXPRESSION__OPERAND = UNARY_EXPRESSION__OPERAND;
+
+	/**
+	 * The number of structural features of the '<em>Logical Unary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOGICAL_UNARY_EXPRESSION_FEATURE_COUNT = UNARY_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Logical Unary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOGICAL_UNARY_EXPRESSION_OPERATION_COUNT = UNARY_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.CastExpressionImpl <em>Cast Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.CastExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getCastExpression()
+	 * @generated
+	 */
+	int CAST_EXPRESSION = 32;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_EXPRESSION__OPERATOR = UNARY_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_EXPRESSION__OPERAND = UNARY_EXPRESSION__OPERAND;
+
+	/**
+	 * The feature id for the '<em><b>Datatype</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_EXPRESSION__DATATYPE = UNARY_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Cast Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_EXPRESSION_FEATURE_COUNT = UNARY_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Cast Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_EXPRESSION_OPERATION_COUNT = UNARY_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ArithmeticUnaryExpressionImpl <em>Arithmetic Unary Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ArithmeticUnaryExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getArithmeticUnaryExpression()
+	 * @generated
+	 */
+	int ARITHMETIC_UNARY_EXPRESSION = 33;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_UNARY_EXPRESSION__OPERATOR = UNARY_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_UNARY_EXPRESSION__OPERAND = UNARY_EXPRESSION__OPERAND;
+
+	/**
+	 * The number of structural features of the '<em>Arithmetic Unary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_UNARY_EXPRESSION_FEATURE_COUNT = UNARY_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Arithmetic Unary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_UNARY_EXPRESSION_OPERATION_COUNT = UNARY_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.BinaryExpressionImpl <em>Binary Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.BinaryExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getBinaryExpression()
+	 * @generated
+	 */
+	int BINARY_EXPRESSION = 34;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINARY_EXPRESSION__OPERATOR = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Left Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINARY_EXPRESSION__LEFT_OPERAND = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Rigth Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINARY_EXPRESSION__RIGTH_OPERAND = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Binary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINARY_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Binary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINARY_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.EqualityBinaryExpressionImpl <em>Equality Binary Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.EqualityBinaryExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getEqualityBinaryExpression()
+	 * @generated
+	 */
+	int EQUALITY_BINARY_EXPRESSION = 35;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EQUALITY_BINARY_EXPRESSION__OPERATOR = BINARY_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Left Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EQUALITY_BINARY_EXPRESSION__LEFT_OPERAND = BINARY_EXPRESSION__LEFT_OPERAND;
+
+	/**
+	 * The feature id for the '<em><b>Rigth Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EQUALITY_BINARY_EXPRESSION__RIGTH_OPERAND = BINARY_EXPRESSION__RIGTH_OPERAND;
+
+	/**
+	 * The number of structural features of the '<em>Equality Binary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EQUALITY_BINARY_EXPRESSION_FEATURE_COUNT = BINARY_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Equality Binary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EQUALITY_BINARY_EXPRESSION_OPERATION_COUNT = BINARY_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.RelationalBinaryExpressionImpl <em>Relational Binary Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.RelationalBinaryExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getRelationalBinaryExpression()
+	 * @generated
+	 */
+	int RELATIONAL_BINARY_EXPRESSION = 36;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_BINARY_EXPRESSION__OPERATOR = BINARY_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Left Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_BINARY_EXPRESSION__LEFT_OPERAND = BINARY_EXPRESSION__LEFT_OPERAND;
+
+	/**
+	 * The feature id for the '<em><b>Rigth Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_BINARY_EXPRESSION__RIGTH_OPERAND = BINARY_EXPRESSION__RIGTH_OPERAND;
+
+	/**
+	 * The number of structural features of the '<em>Relational Binary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_BINARY_EXPRESSION_FEATURE_COUNT = BINARY_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Relational Binary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_BINARY_EXPRESSION_OPERATION_COUNT = BINARY_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.RelationalTernaryExpressionImpl <em>Relational Ternary Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.RelationalTernaryExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getRelationalTernaryExpression()
+	 * @generated
+	 */
+	int RELATIONAL_TERNARY_EXPRESSION = 37;
+
+	/**
+	 * The feature id for the '<em><b>Left Relation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Rigth Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Rigth Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Relational Ternary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_TERNARY_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Relational Ternary Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RELATIONAL_TERNARY_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ConditionalTestExpressionImpl <em>Conditional Test Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ConditionalTestExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getConditionalTestExpression()
+	 * @generated
+	 */
+	int CONDITIONAL_TEST_EXPRESSION = 38;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_TEST_EXPRESSION__OPERATOR = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_TEST_EXPRESSION__CONDITION = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Then Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Else Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND = EXPRESSION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Conditional Test Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_TEST_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Conditional Test Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_TEST_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.AssociativeExpressionImpl <em>Associative Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.AssociativeExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getAssociativeExpression()
+	 * @generated
+	 */
+	int ASSOCIATIVE_EXPRESSION = 39;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSOCIATIVE_EXPRESSION__OPERATOR = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSOCIATIVE_EXPRESSION__OPERAND = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Associative Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSOCIATIVE_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Associative Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSOCIATIVE_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ArithmeticAssociativeExpressionImpl <em>Arithmetic Associative Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ArithmeticAssociativeExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getArithmeticAssociativeExpression()
+	 * @generated
+	 */
+	int ARITHMETIC_ASSOCIATIVE_EXPRESSION = 40;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_ASSOCIATIVE_EXPRESSION__OPERATOR = ASSOCIATIVE_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_ASSOCIATIVE_EXPRESSION__OPERAND = ASSOCIATIVE_EXPRESSION__OPERAND;
+
+	/**
+	 * The number of structural features of the '<em>Arithmetic Associative Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_ASSOCIATIVE_EXPRESSION_FEATURE_COUNT = ASSOCIATIVE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Arithmetic Associative Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_ASSOCIATIVE_EXPRESSION_OPERATION_COUNT = ASSOCIATIVE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.BitwiseAssociativeExpressionImpl <em>Bitwise Associative Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.BitwiseAssociativeExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getBitwiseAssociativeExpression()
+	 * @generated
+	 */
+	int BITWISE_ASSOCIATIVE_EXPRESSION = 41;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BITWISE_ASSOCIATIVE_EXPRESSION__OPERATOR = ASSOCIATIVE_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BITWISE_ASSOCIATIVE_EXPRESSION__OPERAND = ASSOCIATIVE_EXPRESSION__OPERAND;
+
+	/**
+	 * The number of structural features of the '<em>Bitwise Associative Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BITWISE_ASSOCIATIVE_EXPRESSION_FEATURE_COUNT = ASSOCIATIVE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Bitwise Associative Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BITWISE_ASSOCIATIVE_EXPRESSION_OPERATION_COUNT = ASSOCIATIVE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LogicalAssociativeExpressionImpl <em>Logical Associative Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.LogicalAssociativeExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLogicalAssociativeExpression()
+	 * @generated
+	 */
+	int LOGICAL_ASSOCIATIVE_EXPRESSION = 42;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOGICAL_ASSOCIATIVE_EXPRESSION__OPERATOR = ASSOCIATIVE_EXPRESSION__OPERATOR;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOGICAL_ASSOCIATIVE_EXPRESSION__OPERAND = ASSOCIATIVE_EXPRESSION__OPERAND;
+
+	/**
+	 * The number of structural features of the '<em>Logical Associative Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOGICAL_ASSOCIATIVE_EXPRESSION_FEATURE_COUNT = ASSOCIATIVE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Logical Associative Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOGICAL_ASSOCIATIVE_EXPRESSION_OPERATION_COUNT = ASSOCIATIVE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.InvokeExpressionImpl <em>Invoke Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.InvokeExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getInvokeExpression()
+	 * @generated
+	 */
+	int INVOKE_EXPRESSION = 43;
+
+	/**
+	 * The feature id for the '<em><b>Call Procedure</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_EXPRESSION__CALL_PROCEDURE = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Invoke</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_EXPRESSION__INVOKE = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Args</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_EXPRESSION__ARGS = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Rets</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_EXPRESSION__RETS = EXPRESSION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Invoke Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Invoke Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.NamedExpressionImpl <em>Named Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.NamedExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getNamedExpression()
+	 * @generated
+	 */
+	int NAMED_EXPRESSION = 44;
+
+	/**
+	 * The feature id for the '<em><b>Target</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_EXPRESSION__TARGET = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_EXPRESSION__NAME = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Expression</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_EXPRESSION__EXPRESSION = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Named Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Named Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.TupleExpressionImpl <em>Tuple Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.TupleExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getTupleExpression()
+	 * @generated
+	 */
+	int TUPLE_EXPRESSION = 45;
+
+	/**
+	 * The number of structural features of the '<em>Tuple Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TUPLE_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Tuple Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TUPLE_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.MixTupleExpressionImpl <em>Mix Tuple Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.MixTupleExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getMixTupleExpression()
+	 * @generated
+	 */
+	int MIX_TUPLE_EXPRESSION = 46;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MIX_TUPLE_EXPRESSION__VALUE = TUPLE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Mix Tuple Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MIX_TUPLE_EXPRESSION_FEATURE_COUNT = TUPLE_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Mix Tuple Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MIX_TUPLE_EXPRESSION_OPERATION_COUNT = TUPLE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.NamedTupleExpressionImpl <em>Named Tuple Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.NamedTupleExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getNamedTupleExpression()
+	 * @generated
+	 */
+	int NAMED_TUPLE_EXPRESSION = 47;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_TUPLE_EXPRESSION__VALUE = TUPLE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Named Tuple Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_TUPLE_EXPRESSION_FEATURE_COUNT = TUPLE_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Named Tuple Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAMED_TUPLE_EXPRESSION_OPERATION_COUNT = TUPLE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.PositionalTupleExpressionImpl <em>Positional Tuple Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.PositionalTupleExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getPositionalTupleExpression()
+	 * @generated
+	 */
+	int POSITIONAL_TUPLE_EXPRESSION = 48;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int POSITIONAL_TUPLE_EXPRESSION__VALUE = TUPLE_EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Positional Tuple Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int POSITIONAL_TUPLE_EXPRESSION_FEATURE_COUNT = TUPLE_EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Positional Tuple Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int POSITIONAL_TUPLE_EXPRESSION_OPERATION_COUNT = TUPLE_EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueElementSpecificationImpl <em>Value Element Specification</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ValueElementSpecificationImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValueElementSpecification()
+	 * @generated
+	 */
+	int VALUE_ELEMENT_SPECIFICATION = 49;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_ELEMENT_SPECIFICATION__KIND = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Expected</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_ELEMENT_SPECIFICATION__EXPECTED = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Target</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_ELEMENT_SPECIFICATION__TARGET = EXPRESSION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Element</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_ELEMENT_SPECIFICATION__ELEMENT = EXPRESSION_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Arg</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_ELEMENT_SPECIFICATION__ARG = EXPRESSION_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of structural features of the '<em>Value Element Specification</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_ELEMENT_SPECIFICATION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 5;
+
+	/**
+	 * The number of operations of the '<em>Value Element Specification</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALUE_ELEMENT_SPECIFICATION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.InstantiationExpressionImpl <em>Instantiation Expression</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.InstantiationExpressionImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getInstantiationExpression()
+	 * @generated
+	 */
+	int INSTANTIATION_EXPRESSION = 50;
+
+	/**
+	 * The feature id for the '<em><b>Instance</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANTIATION_EXPRESSION__INSTANCE = EXPRESSION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Instantiation Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANTIATION_EXPRESSION_FEATURE_COUNT = EXPRESSION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Instantiation Expression</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANTIATION_EXPRESSION_OPERATION_COUNT = EXPRESSION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsBufferImpl <em>As Buffer</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsBufferImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpressionAsBuffer()
+	 * @generated
+	 */
+	int EXPRESSION_AS_BUFFER = 51;
+
+	/**
+	 * The feature id for the '<em><b>Buffer</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_BUFFER__BUFFER = 0;
+
+	/**
+	 * The number of structural features of the '<em>As Buffer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_BUFFER_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>As Buffer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_BUFFER_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsChannelImpl <em>As Channel</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsChannelImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpressionAsChannel()
+	 * @generated
+	 */
+	int EXPRESSION_AS_CHANNEL = 52;
+
+	/**
+	 * The feature id for the '<em><b>Channel</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_CHANNEL__CHANNEL = 0;
+
+	/**
+	 * The number of structural features of the '<em>As Channel</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_CHANNEL_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>As Channel</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_CHANNEL_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsMachineImpl <em>As Machine</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsMachineImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpressionAsMachine()
+	 * @generated
+	 */
+	int EXPRESSION_AS_MACHINE = 53;
+
+	/**
+	 * The feature id for the '<em><b>Machine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_MACHINE__MACHINE = 0;
+
+	/**
+	 * The number of structural features of the '<em>As Machine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_MACHINE_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>As Machine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_MACHINE_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsPortImpl <em>As Port</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsPortImpl
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpressionAsPort()
+	 * @generated
+	 */
+	int EXPRESSION_AS_PORT = 54;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_PORT__PORT = 0;
+
+	/**
+	 * The number of structural features of the '<em>As Port</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_PORT_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>As Port</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_AS_PORT_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX <em>PRINTER FIX</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getPRINTER_FIX()
+	 * @generated
+	 */
+	int PRINTER_FIX = 55;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind <em>Value Element Specification Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValueElementSpecificationKind()
+	 * @generated
+	 */
+	int VALUE_ELEMENT_SPECIFICATION_KIND = 56;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme <em>Value Element Specification Scheme</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme
+	 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValueElementSpecificationScheme()
+	 * @generated
+	 */
+	int VALUE_ELEMENT_SPECIFICATION_SCHEME = 57;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter <em>Value Expression Pretty Printer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Value Expression Pretty Printer</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter
+	 * @generated
+	 */
+	EClass getValueExpressionPrettyPrinter();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getSymbol <em>Symbol</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Symbol</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getSymbol()
+	 * @see #getValueExpressionPrettyPrinter()
+	 * @generated
+	 */
+	EAttribute getValueExpressionPrettyPrinter_Symbol();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getFix <em>Fix</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Fix</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getFix()
+	 * @see #getValueExpressionPrettyPrinter()
+	 * @generated
+	 */
+	EAttribute getValueExpressionPrettyPrinter_Fix();
+
+	/**
+	 * Returns the meta object for the attribute list '{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getSpecific <em>Specific</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute list '<em>Specific</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getSpecific()
+	 * @see #getValueExpressionPrettyPrinter()
+	 * @generated
+	 */
+	EAttribute getValueExpressionPrettyPrinter_Specific();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression <em>Value Printable Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Value Printable Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression
+	 * @generated
+	 */
+	EClass getValuePrintableExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getSymbol <em>Symbol</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Symbol</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getSymbol()
+	 * @see #getValuePrintableExpression()
+	 * @generated
+	 */
+	EAttribute getValuePrintableExpression_Symbol();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getPrinter <em>Printer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Printer</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getPrinter()
+	 * @see #getValuePrintableExpression()
+	 * @generated
+	 */
+	EReference getValuePrintableExpression_Printer();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getOperand <em>Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Operand</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getOperand()
+	 * @see #getValuePrintableExpression()
+	 * @generated
+	 */
+	EReference getValuePrintableExpression_Operand();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.Expression <em>Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.Expression
+	 * @generated
+	 */
+	EClass getExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralExpression <em>Literal Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralExpression
+	 * @generated
+	 */
+	EClass getLiteralExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression <em>Literal Boolean Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Boolean Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression
+	 * @generated
+	 */
+	EClass getLiteralBooleanExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression#isValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression#isValue()
+	 * @see #getLiteralBooleanExpression()
+	 * @generated
+	 */
+	EAttribute getLiteralBooleanExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression <em>Literal Integer Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Integer Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression
+	 * @generated
+	 */
+	EClass getLiteralIntegerExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression#getValue()
+	 * @see #getLiteralIntegerExpression()
+	 * @generated
+	 */
+	EAttribute getLiteralIntegerExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression <em>Literal Rational Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Rational Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression
+	 * @generated
+	 */
+	EClass getLiteralRationalExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression#getNumerator <em>Numerator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Numerator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression#getNumerator()
+	 * @see #getLiteralRationalExpression()
+	 * @generated
+	 */
+	EAttribute getLiteralRationalExpression_Numerator();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression#getDenominator <em>Denominator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Denominator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression#getDenominator()
+	 * @see #getLiteralRationalExpression()
+	 * @generated
+	 */
+	EAttribute getLiteralRationalExpression_Denominator();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression <em>Literal Float Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Float Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression
+	 * @generated
+	 */
+	EClass getLiteralFloatExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression#getValue()
+	 * @see #getLiteralFloatExpression()
+	 * @generated
+	 */
+	EAttribute getLiteralFloatExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression <em>Literal Real Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Real Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression
+	 * @generated
+	 */
+	EClass getLiteralRealExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression#getValue()
+	 * @see #getLiteralRealExpression()
+	 * @generated
+	 */
+	EAttribute getLiteralRealExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression <em>Literal Character Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Character Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression
+	 * @generated
+	 */
+	EClass getLiteralCharacterExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression#getValue()
+	 * @see #getLiteralCharacterExpression()
+	 * @generated
+	 */
+	EAttribute getLiteralCharacterExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression <em>Literal String Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal String Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression
+	 * @generated
+	 */
+	EClass getLiteralStringExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression#getValue()
+	 * @see #getLiteralStringExpression()
+	 * @generated
+	 */
+	EAttribute getLiteralStringExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression <em>Literal Collection Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Collection Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression
+	 * @generated
+	 */
+	EClass getLiteralCollectionExpression();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression#getDatatype <em>Datatype</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Datatype</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression#getDatatype()
+	 * @see #getLiteralCollectionExpression()
+	 * @generated
+	 */
+	EReference getLiteralCollectionExpression_Datatype();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression#getValue()
+	 * @see #getLiteralCollectionExpression()
+	 * @generated
+	 */
+	EReference getLiteralCollectionExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression <em>Literal Null Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Null Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression
+	 * @generated
+	 */
+	EClass getLiteralNullExpression();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression#getType <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Type</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression#getType()
+	 * @see #getLiteralNullExpression()
+	 * @generated
+	 */
+	EReference getLiteralNullExpression_Type();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceExpression <em>Literal Reference Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Reference Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralReferenceExpression
+	 * @generated
+	 */
+	EClass getLiteralReferenceExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement <em>Literal Reference Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Reference Element</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement
+	 * @generated
+	 */
+	EClass getLiteralReferenceElement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getKind <em>Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getKind()
+	 * @see #getLiteralReferenceElement()
+	 * @generated
+	 */
+	EAttribute getLiteralReferenceElement_Kind();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getValue()
+	 * @see #getLiteralReferenceElement()
+	 * @generated
+	 */
+	EReference getLiteralReferenceElement_Value();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getArg <em>Arg</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Arg</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getArg()
+	 * @see #getLiteralReferenceElement()
+	 * @generated
+	 */
+	EReference getLiteralReferenceElement_Arg();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression <em>Literal This Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal This Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression
+	 * @generated
+	 */
+	EClass getLiteralThisExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression <em>Literal Self Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Self Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression
+	 * @generated
+	 */
+	EClass getLiteralSelfExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression <em>Literal Parent Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Parent Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression
+	 * @generated
+	 */
+	EClass getLiteralParentExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression <em>Literal Super Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Super Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression
+	 * @generated
+	 */
+	EClass getLiteralSuperExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression <em>Literal System Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal System Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression
+	 * @generated
+	 */
+	EClass getLiteralSystemExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression <em>Literal Env Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Env Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression
+	 * @generated
+	 */
+	EClass getLiteralEnvExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralTimeExpression <em>Literal Time Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Time Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralTimeExpression
+	 * @generated
+	 */
+	EClass getLiteralTimeExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralTimeDeltaExpression <em>Literal Time Delta Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Literal Time Delta Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralTimeDeltaExpression
+	 * @generated
+	 */
+	EClass getLiteralTimeDeltaExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression <em>Left Hand Side Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Left Hand Side Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression
+	 * @generated
+	 */
+	EClass getLeftHandSideExpression();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression#getLvalue <em>Lvalue</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Lvalue</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression#getLvalue()
+	 * @see #getLeftHandSideExpression()
+	 * @generated
+	 */
+	EReference getLeftHandSideExpression_Lvalue();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression <em>Increment Or Decrement Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Increment Or Decrement Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression
+	 * @generated
+	 */
+	EClass getIncrementOrDecrementExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression#getOperator <em>Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression#getOperator()
+	 * @see #getIncrementOrDecrementExpression()
+	 * @generated
+	 */
+	EAttribute getIncrementOrDecrementExpression_Operator();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression#getLeftHandSide <em>Left Hand Side</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Left Hand Side</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression#getLeftHandSide()
+	 * @see #getIncrementOrDecrementExpression()
+	 * @generated
+	 */
+	EReference getIncrementOrDecrementExpression_LeftHandSide();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPrefixExpression <em>Increment Or Decrement Prefix Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Increment Or Decrement Prefix Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPrefixExpression
+	 * @generated
+	 */
+	EClass getIncrementOrDecrementPrefixExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPostfixExpression <em>Increment Or Decrement Postfix Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Increment Or Decrement Postfix Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPostfixExpression
+	 * @generated
+	 */
+	EClass getIncrementOrDecrementPostfixExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression <em>Assignment Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Assignment Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.AssignmentExpression
+	 * @generated
+	 */
+	EClass getAssignmentExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getOperator <em>Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getOperator()
+	 * @see #getAssignmentExpression()
+	 * @generated
+	 */
+	EAttribute getAssignmentExpression_Operator();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getLeftHandSide <em>Left Hand Side</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Left Hand Side</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getLeftHandSide()
+	 * @see #getAssignmentExpression()
+	 * @generated
+	 */
+	EReference getAssignmentExpression_LeftHandSide();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getRigthHandSide <em>Rigth Hand Side</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Rigth Hand Side</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.AssignmentExpression#getRigthHandSide()
+	 * @see #getAssignmentExpression()
+	 * @generated
+	 */
+	EReference getAssignmentExpression_RigthHandSide();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.NewfreshExpression <em>Newfresh Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Newfresh Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NewfreshExpression
+	 * @generated
+	 */
+	EClass getNewfreshExpression();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.NewfreshExpression#getLeftHandSide <em>Left Hand Side</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Left Hand Side</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NewfreshExpression#getLeftHandSide()
+	 * @see #getNewfreshExpression()
+	 * @generated
+	 */
+	EReference getNewfreshExpression_LeftHandSide();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.UnaryExpression <em>Unary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Unary Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.UnaryExpression
+	 * @generated
+	 */
+	EClass getUnaryExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.UnaryExpression#getOperator <em>Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.UnaryExpression#getOperator()
+	 * @see #getUnaryExpression()
+	 * @generated
+	 */
+	EAttribute getUnaryExpression_Operator();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.UnaryExpression#getOperand <em>Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Operand</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.UnaryExpression#getOperand()
+	 * @see #getUnaryExpression()
+	 * @generated
+	 */
+	EReference getUnaryExpression_Operand();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.BitwiseUnaryExpression <em>Bitwise Unary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Bitwise Unary Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.BitwiseUnaryExpression
+	 * @generated
+	 */
+	EClass getBitwiseUnaryExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression <em>Logical Unary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Logical Unary Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression
+	 * @generated
+	 */
+	EClass getLogicalUnaryExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.CastExpression <em>Cast Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Cast Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.CastExpression
+	 * @generated
+	 */
+	EClass getCastExpression();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.expression.CastExpression#getDatatype <em>Datatype</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Datatype</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.CastExpression#getDatatype()
+	 * @see #getCastExpression()
+	 * @generated
+	 */
+	EReference getCastExpression_Datatype();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression <em>Arithmetic Unary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Arithmetic Unary Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression
+	 * @generated
+	 */
+	EClass getArithmeticUnaryExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression <em>Binary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Binary Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.BinaryExpression
+	 * @generated
+	 */
+	EClass getBinaryExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getOperator <em>Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getOperator()
+	 * @see #getBinaryExpression()
+	 * @generated
+	 */
+	EAttribute getBinaryExpression_Operator();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getLeftOperand <em>Left Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Left Operand</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getLeftOperand()
+	 * @see #getBinaryExpression()
+	 * @generated
+	 */
+	EReference getBinaryExpression_LeftOperand();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getRigthOperand <em>Rigth Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Rigth Operand</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.BinaryExpression#getRigthOperand()
+	 * @see #getBinaryExpression()
+	 * @generated
+	 */
+	EReference getBinaryExpression_RigthOperand();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.EqualityBinaryExpression <em>Equality Binary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Equality Binary Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.EqualityBinaryExpression
+	 * @generated
+	 */
+	EClass getEqualityBinaryExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression <em>Relational Binary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Relational Binary Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression
+	 * @generated
+	 */
+	EClass getRelationalBinaryExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression <em>Relational Ternary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Relational Ternary Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression
+	 * @generated
+	 */
+	EClass getRelationalTernaryExpression();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getLeftRelation <em>Left Relation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Left Relation</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getLeftRelation()
+	 * @see #getRelationalTernaryExpression()
+	 * @generated
+	 */
+	EReference getRelationalTernaryExpression_LeftRelation();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getRigthOperator <em>Rigth Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Rigth Operator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getRigthOperator()
+	 * @see #getRelationalTernaryExpression()
+	 * @generated
+	 */
+	EAttribute getRelationalTernaryExpression_RigthOperator();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getRigthOperand <em>Rigth Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Rigth Operand</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getRigthOperand()
+	 * @see #getRelationalTernaryExpression()
+	 * @generated
+	 */
+	EReference getRelationalTernaryExpression_RigthOperand();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression <em>Conditional Test Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Conditional Test Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression
+	 * @generated
+	 */
+	EClass getConditionalTestExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getOperator <em>Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getOperator()
+	 * @see #getConditionalTestExpression()
+	 * @generated
+	 */
+	EAttribute getConditionalTestExpression_Operator();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getCondition <em>Condition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Condition</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getCondition()
+	 * @see #getConditionalTestExpression()
+	 * @generated
+	 */
+	EReference getConditionalTestExpression_Condition();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getThenOperand <em>Then Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Then Operand</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getThenOperand()
+	 * @see #getConditionalTestExpression()
+	 * @generated
+	 */
+	EReference getConditionalTestExpression_ThenOperand();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getElseOperand <em>Else Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Else Operand</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression#getElseOperand()
+	 * @see #getConditionalTestExpression()
+	 * @generated
+	 */
+	EReference getConditionalTestExpression_ElseOperand();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.AssociativeExpression <em>Associative Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Associative Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.AssociativeExpression
+	 * @generated
+	 */
+	EClass getAssociativeExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.AssociativeExpression#getOperator <em>Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.AssociativeExpression#getOperator()
+	 * @see #getAssociativeExpression()
+	 * @generated
+	 */
+	EAttribute getAssociativeExpression_Operator();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.expression.AssociativeExpression#getOperand <em>Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Operand</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.AssociativeExpression#getOperand()
+	 * @see #getAssociativeExpression()
+	 * @generated
+	 */
+	EReference getAssociativeExpression_Operand();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression <em>Arithmetic Associative Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Arithmetic Associative Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression
+	 * @generated
+	 */
+	EClass getArithmeticAssociativeExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.BitwiseAssociativeExpression <em>Bitwise Associative Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Bitwise Associative Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.BitwiseAssociativeExpression
+	 * @generated
+	 */
+	EClass getBitwiseAssociativeExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression <em>Logical Associative Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Logical Associative Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression
+	 * @generated
+	 */
+	EClass getLogicalAssociativeExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression <em>Invoke Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Invoke Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.InvokeExpression
+	 * @generated
+	 */
+	EClass getInvokeExpression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#isCallProcedure <em>Call Procedure</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Call Procedure</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.InvokeExpression#isCallProcedure()
+	 * @see #getInvokeExpression()
+	 * @generated
+	 */
+	EAttribute getInvokeExpression_CallProcedure();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getInvoke <em>Invoke</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Invoke</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getInvoke()
+	 * @see #getInvokeExpression()
+	 * @generated
+	 */
+	EReference getInvokeExpression_Invoke();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getArgs <em>Args</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Args</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getArgs()
+	 * @see #getInvokeExpression()
+	 * @generated
+	 */
+	EReference getInvokeExpression_Args();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getRets <em>Rets</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Rets</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getRets()
+	 * @see #getInvokeExpression()
+	 * @generated
+	 */
+	EReference getInvokeExpression_Rets();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression <em>Named Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Named Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NamedExpression
+	 * @generated
+	 */
+	EClass getNamedExpression();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression#getTarget <em>Target</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Target</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NamedExpression#getTarget()
+	 * @see #getNamedExpression()
+	 * @generated
+	 */
+	EReference getNamedExpression_Target();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NamedExpression#getName()
+	 * @see #getNamedExpression()
+	 * @generated
+	 */
+	EAttribute getNamedExpression_Name();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression#getExpression <em>Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NamedExpression#getExpression()
+	 * @see #getNamedExpression()
+	 * @generated
+	 */
+	EReference getNamedExpression_Expression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.TupleExpression <em>Tuple Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Tuple Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.TupleExpression
+	 * @generated
+	 */
+	EClass getTupleExpression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.MixTupleExpression <em>Mix Tuple Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Mix Tuple Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.MixTupleExpression
+	 * @generated
+	 */
+	EClass getMixTupleExpression();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.expression.MixTupleExpression#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.MixTupleExpression#getValue()
+	 * @see #getMixTupleExpression()
+	 * @generated
+	 */
+	EReference getMixTupleExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression <em>Named Tuple Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Named Tuple Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression
+	 * @generated
+	 */
+	EClass getNamedTupleExpression();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression#getValue()
+	 * @see #getNamedTupleExpression()
+	 * @generated
+	 */
+	EReference getNamedTupleExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression <em>Positional Tuple Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Positional Tuple Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression
+	 * @generated
+	 */
+	EClass getPositionalTupleExpression();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression#getValue()
+	 * @see #getPositionalTupleExpression()
+	 * @generated
+	 */
+	EReference getPositionalTupleExpression_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification <em>Value Element Specification</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Value Element Specification</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification
+	 * @generated
+	 */
+	EClass getValueElementSpecification();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getKind <em>Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getKind()
+	 * @see #getValueElementSpecification()
+	 * @generated
+	 */
+	EAttribute getValueElementSpecification_Kind();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getExpected <em>Expected</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Expected</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getExpected()
+	 * @see #getValueElementSpecification()
+	 * @generated
+	 */
+	EAttribute getValueElementSpecification_Expected();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getTarget <em>Target</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Target</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getTarget()
+	 * @see #getValueElementSpecification()
+	 * @generated
+	 */
+	EReference getValueElementSpecification_Target();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getElement <em>Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Element</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getElement()
+	 * @see #getValueElementSpecification()
+	 * @generated
+	 */
+	EReference getValueElementSpecification_Element();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getArg <em>Arg</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Arg</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getArg()
+	 * @see #getValueElementSpecification()
+	 * @generated
+	 */
+	EReference getValueElementSpecification_Arg();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.InstantiationExpression <em>Instantiation Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Instantiation Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.InstantiationExpression
+	 * @generated
+	 */
+	EClass getInstantiationExpression();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.InstantiationExpression#getInstance <em>Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Instance</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.InstantiationExpression#getInstance()
+	 * @see #getInstantiationExpression()
+	 * @generated
+	 */
+	EReference getInstantiationExpression_Instance();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer <em>As Buffer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>As Buffer</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer
+	 * @generated
+	 */
+	EClass getExpressionAsBuffer();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer#getBuffer <em>Buffer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Buffer</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer#getBuffer()
+	 * @see #getExpressionAsBuffer()
+	 * @generated
+	 */
+	EReference getExpressionAsBuffer_Buffer();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel <em>As Channel</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>As Channel</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel
+	 * @generated
+	 */
+	EClass getExpressionAsChannel();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel#getChannel <em>Channel</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Channel</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel#getChannel()
+	 * @see #getExpressionAsChannel()
+	 * @generated
+	 */
+	EReference getExpressionAsChannel_Channel();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine <em>As Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>As Machine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine
+	 * @generated
+	 */
+	EClass getExpressionAsMachine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine#getMachine <em>Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Machine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine#getMachine()
+	 * @see #getExpressionAsMachine()
+	 * @generated
+	 */
+	EReference getExpressionAsMachine_Machine();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort <em>As Port</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>As Port</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort
+	 * @generated
+	 */
+	EClass getExpressionAsPort();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort#getPort <em>Port</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Port</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort#getPort()
+	 * @see #getExpressionAsPort()
+	 * @generated
+	 */
+	EReference getExpressionAsPort_Port();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX <em>PRINTER FIX</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>PRINTER FIX</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX
+	 * @generated
+	 */
+	EEnum getPRINTER_FIX();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind <em>Value Element Specification Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Value Element Specification Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind
+	 * @generated
+	 */
+	EEnum getValueElementSpecificationKind();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme <em>Value Element Specification Scheme</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Value Element Specification Scheme</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme
+	 * @generated
+	 */
+	EEnum getValueElementSpecificationScheme();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	ExpressionFactory getExpressionFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueExpressionPrettyPrinterImpl <em>Value Expression Pretty Printer</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ValueExpressionPrettyPrinterImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValueExpressionPrettyPrinter()
+		 * @generated
+		 */
+		EClass VALUE_EXPRESSION_PRETTY_PRINTER = eINSTANCE.getValueExpressionPrettyPrinter();
+
+		/**
+		 * The meta object literal for the '<em><b>Symbol</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VALUE_EXPRESSION_PRETTY_PRINTER__SYMBOL = eINSTANCE.getValueExpressionPrettyPrinter_Symbol();
+
+		/**
+		 * The meta object literal for the '<em><b>Fix</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VALUE_EXPRESSION_PRETTY_PRINTER__FIX = eINSTANCE.getValueExpressionPrettyPrinter_Fix();
+
+		/**
+		 * The meta object literal for the '<em><b>Specific</b></em>' attribute list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VALUE_EXPRESSION_PRETTY_PRINTER__SPECIFIC = eINSTANCE.getValueExpressionPrettyPrinter_Specific();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ValuePrintableExpressionImpl <em>Value Printable Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ValuePrintableExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValuePrintableExpression()
+		 * @generated
+		 */
+		EClass VALUE_PRINTABLE_EXPRESSION = eINSTANCE.getValuePrintableExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Symbol</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VALUE_PRINTABLE_EXPRESSION__SYMBOL = eINSTANCE.getValuePrintableExpression_Symbol();
+
+		/**
+		 * The meta object literal for the '<em><b>Printer</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VALUE_PRINTABLE_EXPRESSION__PRINTER = eINSTANCE.getValuePrintableExpression_Printer();
+
+		/**
+		 * The meta object literal for the '<em><b>Operand</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VALUE_PRINTABLE_EXPRESSION__OPERAND = eINSTANCE.getValuePrintableExpression_Operand();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionImpl <em>Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpression()
+		 * @generated
+		 */
+		EClass EXPRESSION = eINSTANCE.getExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralExpressionImpl <em>Literal Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralExpression()
+		 * @generated
+		 */
+		EClass LITERAL_EXPRESSION = eINSTANCE.getLiteralExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralBooleanExpressionImpl <em>Literal Boolean Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralBooleanExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralBooleanExpression()
+		 * @generated
+		 */
+		EClass LITERAL_BOOLEAN_EXPRESSION = eINSTANCE.getLiteralBooleanExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_BOOLEAN_EXPRESSION__VALUE = eINSTANCE.getLiteralBooleanExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralIntegerExpressionImpl <em>Literal Integer Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralIntegerExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralIntegerExpression()
+		 * @generated
+		 */
+		EClass LITERAL_INTEGER_EXPRESSION = eINSTANCE.getLiteralIntegerExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_INTEGER_EXPRESSION__VALUE = eINSTANCE.getLiteralIntegerExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralRationalExpressionImpl <em>Literal Rational Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralRationalExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralRationalExpression()
+		 * @generated
+		 */
+		EClass LITERAL_RATIONAL_EXPRESSION = eINSTANCE.getLiteralRationalExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Numerator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_RATIONAL_EXPRESSION__NUMERATOR = eINSTANCE.getLiteralRationalExpression_Numerator();
+
+		/**
+		 * The meta object literal for the '<em><b>Denominator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_RATIONAL_EXPRESSION__DENOMINATOR = eINSTANCE.getLiteralRationalExpression_Denominator();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralFloatExpressionImpl <em>Literal Float Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralFloatExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralFloatExpression()
+		 * @generated
+		 */
+		EClass LITERAL_FLOAT_EXPRESSION = eINSTANCE.getLiteralFloatExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_FLOAT_EXPRESSION__VALUE = eINSTANCE.getLiteralFloatExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralRealExpressionImpl <em>Literal Real Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralRealExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralRealExpression()
+		 * @generated
+		 */
+		EClass LITERAL_REAL_EXPRESSION = eINSTANCE.getLiteralRealExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_REAL_EXPRESSION__VALUE = eINSTANCE.getLiteralRealExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralCharacterExpressionImpl <em>Literal Character Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralCharacterExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralCharacterExpression()
+		 * @generated
+		 */
+		EClass LITERAL_CHARACTER_EXPRESSION = eINSTANCE.getLiteralCharacterExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_CHARACTER_EXPRESSION__VALUE = eINSTANCE.getLiteralCharacterExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralStringExpressionImpl <em>Literal String Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralStringExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralStringExpression()
+		 * @generated
+		 */
+		EClass LITERAL_STRING_EXPRESSION = eINSTANCE.getLiteralStringExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_STRING_EXPRESSION__VALUE = eINSTANCE.getLiteralStringExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralCollectionExpressionImpl <em>Literal Collection Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralCollectionExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralCollectionExpression()
+		 * @generated
+		 */
+		EClass LITERAL_COLLECTION_EXPRESSION = eINSTANCE.getLiteralCollectionExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Datatype</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference LITERAL_COLLECTION_EXPRESSION__DATATYPE = eINSTANCE.getLiteralCollectionExpression_Datatype();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference LITERAL_COLLECTION_EXPRESSION__VALUE = eINSTANCE.getLiteralCollectionExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralNullExpressionImpl <em>Literal Null Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralNullExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralNullExpression()
+		 * @generated
+		 */
+		EClass LITERAL_NULL_EXPRESSION = eINSTANCE.getLiteralNullExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Type</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference LITERAL_NULL_EXPRESSION__TYPE = eINSTANCE.getLiteralNullExpression_Type();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceExpressionImpl <em>Literal Reference Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralReferenceExpression()
+		 * @generated
+		 */
+		EClass LITERAL_REFERENCE_EXPRESSION = eINSTANCE.getLiteralReferenceExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceElementImpl <em>Literal Reference Element</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceElementImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralReferenceElement()
+		 * @generated
+		 */
+		EClass LITERAL_REFERENCE_ELEMENT = eINSTANCE.getLiteralReferenceElement();
+
+		/**
+		 * The meta object literal for the '<em><b>Kind</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute LITERAL_REFERENCE_ELEMENT__KIND = eINSTANCE.getLiteralReferenceElement_Kind();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference LITERAL_REFERENCE_ELEMENT__VALUE = eINSTANCE.getLiteralReferenceElement_Value();
+
+		/**
+		 * The meta object literal for the '<em><b>Arg</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference LITERAL_REFERENCE_ELEMENT__ARG = eINSTANCE.getLiteralReferenceElement_Arg();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralThisExpressionImpl <em>Literal This Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralThisExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralThisExpression()
+		 * @generated
+		 */
+		EClass LITERAL_THIS_EXPRESSION = eINSTANCE.getLiteralThisExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralSelfExpressionImpl <em>Literal Self Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralSelfExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralSelfExpression()
+		 * @generated
+		 */
+		EClass LITERAL_SELF_EXPRESSION = eINSTANCE.getLiteralSelfExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralParentExpressionImpl <em>Literal Parent Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralParentExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralParentExpression()
+		 * @generated
+		 */
+		EClass LITERAL_PARENT_EXPRESSION = eINSTANCE.getLiteralParentExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralSuperExpressionImpl <em>Literal Super Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralSuperExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralSuperExpression()
+		 * @generated
+		 */
+		EClass LITERAL_SUPER_EXPRESSION = eINSTANCE.getLiteralSuperExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralSystemExpressionImpl <em>Literal System Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralSystemExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralSystemExpression()
+		 * @generated
+		 */
+		EClass LITERAL_SYSTEM_EXPRESSION = eINSTANCE.getLiteralSystemExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralEnvExpressionImpl <em>Literal Env Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralEnvExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralEnvExpression()
+		 * @generated
+		 */
+		EClass LITERAL_ENV_EXPRESSION = eINSTANCE.getLiteralEnvExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralTimeExpressionImpl <em>Literal Time Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralTimeExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralTimeExpression()
+		 * @generated
+		 */
+		EClass LITERAL_TIME_EXPRESSION = eINSTANCE.getLiteralTimeExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralTimeDeltaExpressionImpl <em>Literal Time Delta Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LiteralTimeDeltaExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLiteralTimeDeltaExpression()
+		 * @generated
+		 */
+		EClass LITERAL_TIME_DELTA_EXPRESSION = eINSTANCE.getLiteralTimeDeltaExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LeftHandSideExpressionImpl <em>Left Hand Side Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LeftHandSideExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLeftHandSideExpression()
+		 * @generated
+		 */
+		EClass LEFT_HAND_SIDE_EXPRESSION = eINSTANCE.getLeftHandSideExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Lvalue</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference LEFT_HAND_SIDE_EXPRESSION__LVALUE = eINSTANCE.getLeftHandSideExpression_Lvalue();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementExpressionImpl <em>Increment Or Decrement Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getIncrementOrDecrementExpression()
+		 * @generated
+		 */
+		EClass INCREMENT_OR_DECREMENT_EXPRESSION = eINSTANCE.getIncrementOrDecrementExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR = eINSTANCE.getIncrementOrDecrementExpression_Operator();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Hand Side</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE = eINSTANCE.getIncrementOrDecrementExpression_LeftHandSide();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementPrefixExpressionImpl <em>Increment Or Decrement Prefix Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementPrefixExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getIncrementOrDecrementPrefixExpression()
+		 * @generated
+		 */
+		EClass INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION = eINSTANCE.getIncrementOrDecrementPrefixExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementPostfixExpressionImpl <em>Increment Or Decrement Postfix Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementPostfixExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getIncrementOrDecrementPostfixExpression()
+		 * @generated
+		 */
+		EClass INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION = eINSTANCE.getIncrementOrDecrementPostfixExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.AssignmentExpressionImpl <em>Assignment Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.AssignmentExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getAssignmentExpression()
+		 * @generated
+		 */
+		EClass ASSIGNMENT_EXPRESSION = eINSTANCE.getAssignmentExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute ASSIGNMENT_EXPRESSION__OPERATOR = eINSTANCE.getAssignmentExpression_Operator();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Hand Side</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE = eINSTANCE.getAssignmentExpression_LeftHandSide();
+
+		/**
+		 * The meta object literal for the '<em><b>Rigth Hand Side</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE = eINSTANCE.getAssignmentExpression_RigthHandSide();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.NewfreshExpressionImpl <em>Newfresh Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.NewfreshExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getNewfreshExpression()
+		 * @generated
+		 */
+		EClass NEWFRESH_EXPRESSION = eINSTANCE.getNewfreshExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Hand Side</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference NEWFRESH_EXPRESSION__LEFT_HAND_SIDE = eINSTANCE.getNewfreshExpression_LeftHandSide();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.UnaryExpressionImpl <em>Unary Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.UnaryExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getUnaryExpression()
+		 * @generated
+		 */
+		EClass UNARY_EXPRESSION = eINSTANCE.getUnaryExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute UNARY_EXPRESSION__OPERATOR = eINSTANCE.getUnaryExpression_Operator();
+
+		/**
+		 * The meta object literal for the '<em><b>Operand</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference UNARY_EXPRESSION__OPERAND = eINSTANCE.getUnaryExpression_Operand();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.BitwiseUnaryExpressionImpl <em>Bitwise Unary Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.BitwiseUnaryExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getBitwiseUnaryExpression()
+		 * @generated
+		 */
+		EClass BITWISE_UNARY_EXPRESSION = eINSTANCE.getBitwiseUnaryExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LogicalUnaryExpressionImpl <em>Logical Unary Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LogicalUnaryExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLogicalUnaryExpression()
+		 * @generated
+		 */
+		EClass LOGICAL_UNARY_EXPRESSION = eINSTANCE.getLogicalUnaryExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.CastExpressionImpl <em>Cast Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.CastExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getCastExpression()
+		 * @generated
+		 */
+		EClass CAST_EXPRESSION = eINSTANCE.getCastExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Datatype</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CAST_EXPRESSION__DATATYPE = eINSTANCE.getCastExpression_Datatype();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ArithmeticUnaryExpressionImpl <em>Arithmetic Unary Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ArithmeticUnaryExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getArithmeticUnaryExpression()
+		 * @generated
+		 */
+		EClass ARITHMETIC_UNARY_EXPRESSION = eINSTANCE.getArithmeticUnaryExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.BinaryExpressionImpl <em>Binary Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.BinaryExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getBinaryExpression()
+		 * @generated
+		 */
+		EClass BINARY_EXPRESSION = eINSTANCE.getBinaryExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute BINARY_EXPRESSION__OPERATOR = eINSTANCE.getBinaryExpression_Operator();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Operand</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BINARY_EXPRESSION__LEFT_OPERAND = eINSTANCE.getBinaryExpression_LeftOperand();
+
+		/**
+		 * The meta object literal for the '<em><b>Rigth Operand</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BINARY_EXPRESSION__RIGTH_OPERAND = eINSTANCE.getBinaryExpression_RigthOperand();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.EqualityBinaryExpressionImpl <em>Equality Binary Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.EqualityBinaryExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getEqualityBinaryExpression()
+		 * @generated
+		 */
+		EClass EQUALITY_BINARY_EXPRESSION = eINSTANCE.getEqualityBinaryExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.RelationalBinaryExpressionImpl <em>Relational Binary Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.RelationalBinaryExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getRelationalBinaryExpression()
+		 * @generated
+		 */
+		EClass RELATIONAL_BINARY_EXPRESSION = eINSTANCE.getRelationalBinaryExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.RelationalTernaryExpressionImpl <em>Relational Ternary Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.RelationalTernaryExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getRelationalTernaryExpression()
+		 * @generated
+		 */
+		EClass RELATIONAL_TERNARY_EXPRESSION = eINSTANCE.getRelationalTernaryExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Relation</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION = eINSTANCE.getRelationalTernaryExpression_LeftRelation();
+
+		/**
+		 * The meta object literal for the '<em><b>Rigth Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR = eINSTANCE.getRelationalTernaryExpression_RigthOperator();
+
+		/**
+		 * The meta object literal for the '<em><b>Rigth Operand</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND = eINSTANCE.getRelationalTernaryExpression_RigthOperand();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ConditionalTestExpressionImpl <em>Conditional Test Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ConditionalTestExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getConditionalTestExpression()
+		 * @generated
+		 */
+		EClass CONDITIONAL_TEST_EXPRESSION = eINSTANCE.getConditionalTestExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CONDITIONAL_TEST_EXPRESSION__OPERATOR = eINSTANCE.getConditionalTestExpression_Operator();
+
+		/**
+		 * The meta object literal for the '<em><b>Condition</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CONDITIONAL_TEST_EXPRESSION__CONDITION = eINSTANCE.getConditionalTestExpression_Condition();
+
+		/**
+		 * The meta object literal for the '<em><b>Then Operand</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND = eINSTANCE.getConditionalTestExpression_ThenOperand();
+
+		/**
+		 * The meta object literal for the '<em><b>Else Operand</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND = eINSTANCE.getConditionalTestExpression_ElseOperand();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.AssociativeExpressionImpl <em>Associative Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.AssociativeExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getAssociativeExpression()
+		 * @generated
+		 */
+		EClass ASSOCIATIVE_EXPRESSION = eINSTANCE.getAssociativeExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute ASSOCIATIVE_EXPRESSION__OPERATOR = eINSTANCE.getAssociativeExpression_Operator();
+
+		/**
+		 * The meta object literal for the '<em><b>Operand</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ASSOCIATIVE_EXPRESSION__OPERAND = eINSTANCE.getAssociativeExpression_Operand();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ArithmeticAssociativeExpressionImpl <em>Arithmetic Associative Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ArithmeticAssociativeExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getArithmeticAssociativeExpression()
+		 * @generated
+		 */
+		EClass ARITHMETIC_ASSOCIATIVE_EXPRESSION = eINSTANCE.getArithmeticAssociativeExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.BitwiseAssociativeExpressionImpl <em>Bitwise Associative Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.BitwiseAssociativeExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getBitwiseAssociativeExpression()
+		 * @generated
+		 */
+		EClass BITWISE_ASSOCIATIVE_EXPRESSION = eINSTANCE.getBitwiseAssociativeExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.LogicalAssociativeExpressionImpl <em>Logical Associative Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.LogicalAssociativeExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getLogicalAssociativeExpression()
+		 * @generated
+		 */
+		EClass LOGICAL_ASSOCIATIVE_EXPRESSION = eINSTANCE.getLogicalAssociativeExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.InvokeExpressionImpl <em>Invoke Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.InvokeExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getInvokeExpression()
+		 * @generated
+		 */
+		EClass INVOKE_EXPRESSION = eINSTANCE.getInvokeExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Call Procedure</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute INVOKE_EXPRESSION__CALL_PROCEDURE = eINSTANCE.getInvokeExpression_CallProcedure();
+
+		/**
+		 * The meta object literal for the '<em><b>Invoke</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INVOKE_EXPRESSION__INVOKE = eINSTANCE.getInvokeExpression_Invoke();
+
+		/**
+		 * The meta object literal for the '<em><b>Args</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INVOKE_EXPRESSION__ARGS = eINSTANCE.getInvokeExpression_Args();
+
+		/**
+		 * The meta object literal for the '<em><b>Rets</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INVOKE_EXPRESSION__RETS = eINSTANCE.getInvokeExpression_Rets();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.NamedExpressionImpl <em>Named Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.NamedExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getNamedExpression()
+		 * @generated
+		 */
+		EClass NAMED_EXPRESSION = eINSTANCE.getNamedExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Target</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference NAMED_EXPRESSION__TARGET = eINSTANCE.getNamedExpression_Target();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute NAMED_EXPRESSION__NAME = eINSTANCE.getNamedExpression_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Expression</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference NAMED_EXPRESSION__EXPRESSION = eINSTANCE.getNamedExpression_Expression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.TupleExpressionImpl <em>Tuple Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.TupleExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getTupleExpression()
+		 * @generated
+		 */
+		EClass TUPLE_EXPRESSION = eINSTANCE.getTupleExpression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.MixTupleExpressionImpl <em>Mix Tuple Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.MixTupleExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getMixTupleExpression()
+		 * @generated
+		 */
+		EClass MIX_TUPLE_EXPRESSION = eINSTANCE.getMixTupleExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MIX_TUPLE_EXPRESSION__VALUE = eINSTANCE.getMixTupleExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.NamedTupleExpressionImpl <em>Named Tuple Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.NamedTupleExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getNamedTupleExpression()
+		 * @generated
+		 */
+		EClass NAMED_TUPLE_EXPRESSION = eINSTANCE.getNamedTupleExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference NAMED_TUPLE_EXPRESSION__VALUE = eINSTANCE.getNamedTupleExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.PositionalTupleExpressionImpl <em>Positional Tuple Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.PositionalTupleExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getPositionalTupleExpression()
+		 * @generated
+		 */
+		EClass POSITIONAL_TUPLE_EXPRESSION = eINSTANCE.getPositionalTupleExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference POSITIONAL_TUPLE_EXPRESSION__VALUE = eINSTANCE.getPositionalTupleExpression_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueElementSpecificationImpl <em>Value Element Specification</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ValueElementSpecificationImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValueElementSpecification()
+		 * @generated
+		 */
+		EClass VALUE_ELEMENT_SPECIFICATION = eINSTANCE.getValueElementSpecification();
+
+		/**
+		 * The meta object literal for the '<em><b>Kind</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VALUE_ELEMENT_SPECIFICATION__KIND = eINSTANCE.getValueElementSpecification_Kind();
+
+		/**
+		 * The meta object literal for the '<em><b>Expected</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VALUE_ELEMENT_SPECIFICATION__EXPECTED = eINSTANCE.getValueElementSpecification_Expected();
+
+		/**
+		 * The meta object literal for the '<em><b>Target</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VALUE_ELEMENT_SPECIFICATION__TARGET = eINSTANCE.getValueElementSpecification_Target();
+
+		/**
+		 * The meta object literal for the '<em><b>Element</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VALUE_ELEMENT_SPECIFICATION__ELEMENT = eINSTANCE.getValueElementSpecification_Element();
+
+		/**
+		 * The meta object literal for the '<em><b>Arg</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VALUE_ELEMENT_SPECIFICATION__ARG = eINSTANCE.getValueElementSpecification_Arg();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.InstantiationExpressionImpl <em>Instantiation Expression</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.InstantiationExpressionImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getInstantiationExpression()
+		 * @generated
+		 */
+		EClass INSTANTIATION_EXPRESSION = eINSTANCE.getInstantiationExpression();
+
+		/**
+		 * The meta object literal for the '<em><b>Instance</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INSTANTIATION_EXPRESSION__INSTANCE = eINSTANCE.getInstantiationExpression_Instance();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsBufferImpl <em>As Buffer</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsBufferImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpressionAsBuffer()
+		 * @generated
+		 */
+		EClass EXPRESSION_AS_BUFFER = eINSTANCE.getExpressionAsBuffer();
+
+		/**
+		 * The meta object literal for the '<em><b>Buffer</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXPRESSION_AS_BUFFER__BUFFER = eINSTANCE.getExpressionAsBuffer_Buffer();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsChannelImpl <em>As Channel</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsChannelImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpressionAsChannel()
+		 * @generated
+		 */
+		EClass EXPRESSION_AS_CHANNEL = eINSTANCE.getExpressionAsChannel();
+
+		/**
+		 * The meta object literal for the '<em><b>Channel</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXPRESSION_AS_CHANNEL__CHANNEL = eINSTANCE.getExpressionAsChannel_Channel();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsMachineImpl <em>As Machine</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsMachineImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpressionAsMachine()
+		 * @generated
+		 */
+		EClass EXPRESSION_AS_MACHINE = eINSTANCE.getExpressionAsMachine();
+
+		/**
+		 * The meta object literal for the '<em><b>Machine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXPRESSION_AS_MACHINE__MACHINE = eINSTANCE.getExpressionAsMachine_Machine();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsPortImpl <em>As Port</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsPortImpl
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getExpressionAsPort()
+		 * @generated
+		 */
+		EClass EXPRESSION_AS_PORT = eINSTANCE.getExpressionAsPort();
+
+		/**
+		 * The meta object literal for the '<em><b>Port</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXPRESSION_AS_PORT__PORT = eINSTANCE.getExpressionAsPort_Port();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX <em>PRINTER FIX</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getPRINTER_FIX()
+		 * @generated
+		 */
+		EEnum PRINTER_FIX = eINSTANCE.getPRINTER_FIX();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind <em>Value Element Specification Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValueElementSpecificationKind()
+		 * @generated
+		 */
+		EEnum VALUE_ELEMENT_SPECIFICATION_KIND = eINSTANCE.getValueElementSpecificationKind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme <em>Value Element Specification Scheme</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme
+		 * @see org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl#getValueElementSpecificationScheme()
+		 * @generated
+		 */
+		EEnum VALUE_ELEMENT_SPECIFICATION_SCHEME = eINSTANCE.getValueElementSpecificationScheme();
+
+	}
+
+} //ExpressionPackage
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/IncrementOrDecrementExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/IncrementOrDecrementExpression.java
new file mode 100644
index 0000000..0fa1df1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/IncrementOrDecrementExpression.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Increment Or Decrement Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression#getLeftHandSide <em>Left Hand Side</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getIncrementOrDecrementExpression()
+ * @model
+ * @generated
+ */
+public interface IncrementOrDecrementExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operator</em>' attribute.
+	 * @see #setOperator(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getIncrementOrDecrementExpression_Operator()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getOperator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression#getOperator <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operator</em>' attribute.
+	 * @see #getOperator()
+	 * @generated
+	 */
+	void setOperator(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Hand Side</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Hand Side</em>' containment reference.
+	 * @see #setLeftHandSide(LeftHandSideExpression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getIncrementOrDecrementExpression_LeftHandSide()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	LeftHandSideExpression getLeftHandSide();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression#getLeftHandSide <em>Left Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Left Hand Side</em>' containment reference.
+	 * @see #getLeftHandSide()
+	 * @generated
+	 */
+	void setLeftHandSide(LeftHandSideExpression value);
+
+} // IncrementOrDecrementExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/IncrementOrDecrementPostfixExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/IncrementOrDecrementPostfixExpression.java
new file mode 100644
index 0000000..2eb2cbe
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/IncrementOrDecrementPostfixExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Increment Or Decrement Postfix Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getIncrementOrDecrementPostfixExpression()
+ * @model
+ * @generated
+ */
+public interface IncrementOrDecrementPostfixExpression extends IncrementOrDecrementExpression {
+} // IncrementOrDecrementPostfixExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/IncrementOrDecrementPrefixExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/IncrementOrDecrementPrefixExpression.java
new file mode 100644
index 0000000..7bcdcad
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/IncrementOrDecrementPrefixExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Increment Or Decrement Prefix Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getIncrementOrDecrementPrefixExpression()
+ * @model
+ * @generated
+ */
+public interface IncrementOrDecrementPrefixExpression extends IncrementOrDecrementExpression {
+} // IncrementOrDecrementPrefixExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/InstantiationExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/InstantiationExpression.java
new file mode 100644
index 0000000..f544065
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/InstantiationExpression.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Instantiation Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.InstantiationExpression#getInstance <em>Instance</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getInstantiationExpression()
+ * @model
+ * @generated
+ */
+public interface InstantiationExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Instance</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Instance</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Instance</em>' containment reference.
+	 * @see #setInstance(InstanceMachine)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getInstantiationExpression_Instance()
+	 * @model containment="true"
+	 * @generated
+	 */
+	InstanceMachine getInstance();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.InstantiationExpression#getInstance <em>Instance</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Instance</em>' containment reference.
+	 * @see #getInstance()
+	 * @generated
+	 */
+	void setInstance(InstanceMachine value);
+
+} // InstantiationExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/InvokeExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/InvokeExpression.java
new file mode 100644
index 0000000..df01e8a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/InvokeExpression.java
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Invoke Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#isCallProcedure <em>Call Procedure</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getInvoke <em>Invoke</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getArgs <em>Args</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getRets <em>Rets</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getInvokeExpression()
+ * @model
+ * @generated
+ */
+public interface InvokeExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Call Procedure</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Call Procedure</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Call Procedure</em>' attribute.
+	 * @see #setCallProcedure(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getInvokeExpression_CallProcedure()
+	 * @model default="false"
+	 * @generated
+	 */
+	boolean isCallProcedure();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#isCallProcedure <em>Call Procedure</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Call Procedure</em>' attribute.
+	 * @see #isCallProcedure()
+	 * @generated
+	 */
+	void setCallProcedure(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Invoke</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Invoke</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Invoke</em>' containment reference.
+	 * @see #setInvoke(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getInvokeExpression_Invoke()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getInvoke();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression#getInvoke <em>Invoke</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Invoke</em>' containment reference.
+	 * @see #getInvoke()
+	 * @generated
+	 */
+	void setInvoke(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Args</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Args</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Args</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getInvokeExpression_Args()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getArgs();
+
+	/**
+	 * Returns the value of the '<em><b>Rets</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Rets</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Rets</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getInvokeExpression_Rets()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getRets();
+
+} // InvokeExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LeftHandSideExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LeftHandSideExpression.java
new file mode 100644
index 0000000..bf9f72e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LeftHandSideExpression.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Left Hand Side Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression#getLvalue <em>Lvalue</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLeftHandSideExpression()
+ * @model
+ * @generated
+ */
+public interface LeftHandSideExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Lvalue</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Lvalue</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Lvalue</em>' containment reference.
+	 * @see #setLvalue(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLeftHandSideExpression_Lvalue()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getLvalue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression#getLvalue <em>Lvalue</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Lvalue</em>' containment reference.
+	 * @see #getLvalue()
+	 * @generated
+	 */
+	void setLvalue(Expression value);
+
+} // LeftHandSideExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralBooleanExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralBooleanExpression.java
new file mode 100644
index 0000000..c8822e6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralBooleanExpression.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Boolean Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression#isValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralBooleanExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralBooleanExpression extends LiteralExpression {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralBooleanExpression_Value()
+	 * @model
+	 * @generated
+	 */
+	boolean isValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression#isValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #isValue()
+	 * @generated
+	 */
+	void setValue(boolean value);
+
+} // LiteralBooleanExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralCharacterExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralCharacterExpression.java
new file mode 100644
index 0000000..8f1bc5f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralCharacterExpression.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Character Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralCharacterExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralCharacterExpression extends LiteralExpression {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * The default value is <code>"\'\\0\'"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(char)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralCharacterExpression_Value()
+	 * @model default="\'\\0\'"
+	 * @generated
+	 */
+	char getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(char value);
+
+} // LiteralCharacterExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralCollectionExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralCollectionExpression.java
new file mode 100644
index 0000000..a2c0692
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralCollectionExpression.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Collection Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression#getDatatype <em>Datatype</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralCollectionExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralCollectionExpression extends LiteralExpression {
+	/**
+	 * Returns the value of the '<em><b>Datatype</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Datatype</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Datatype</em>' containment reference.
+	 * @see #setDatatype(DataType)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralCollectionExpression_Datatype()
+	 * @model containment="true"
+	 * @generated
+	 */
+	DataType getDatatype();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression#getDatatype <em>Datatype</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Datatype</em>' containment reference.
+	 * @see #getDatatype()
+	 * @generated
+	 */
+	void setDatatype(DataType value);
+
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralCollectionExpression_Value()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getValue();
+
+} // LiteralCollectionExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralEnvExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralEnvExpression.java
new file mode 100644
index 0000000..a38b9f7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralEnvExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Env Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralEnvExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralEnvExpression extends LiteralReferenceExpression {
+} // LiteralEnvExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralExpression.java
new file mode 100644
index 0000000..b3f9634
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralExpression extends Expression {
+} // LiteralExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralFloatExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralFloatExpression.java
new file mode 100644
index 0000000..f331b6b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralFloatExpression.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Float Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralFloatExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralFloatExpression extends LiteralExpression {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(double)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralFloatExpression_Value()
+	 * @model
+	 * @generated
+	 */
+	double getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(double value);
+
+} // LiteralFloatExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralIntegerExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralIntegerExpression.java
new file mode 100644
index 0000000..d47ec87
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralIntegerExpression.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Integer Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralIntegerExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralIntegerExpression extends LiteralExpression {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * The default value is <code>"0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(long)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralIntegerExpression_Value()
+	 * @model default="0"
+	 * @generated
+	 */
+	long getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(long value);
+
+} // LiteralIntegerExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralNullExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralNullExpression.java
new file mode 100644
index 0000000..355a537
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralNullExpression.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.efm.ecore.formalml.common.Type;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Null Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralNullExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralNullExpression extends LiteralExpression {
+	/**
+	 * Returns the value of the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Type</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Type</em>' containment reference.
+	 * @see #setType(Type)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralNullExpression_Type()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Type getType();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression#getType <em>Type</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Type</em>' containment reference.
+	 * @see #getType()
+	 * @generated
+	 */
+	void setType(Type value);
+
+} // LiteralNullExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralParentExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralParentExpression.java
new file mode 100644
index 0000000..0c06f9a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralParentExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Parent Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralParentExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralParentExpression extends LiteralReferenceExpression {
+} // LiteralParentExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralRationalExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralRationalExpression.java
new file mode 100644
index 0000000..9f317f0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralRationalExpression.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Rational Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression#getNumerator <em>Numerator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression#getDenominator <em>Denominator</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralRationalExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralRationalExpression extends LiteralExpression {
+	/**
+	 * Returns the value of the '<em><b>Numerator</b></em>' attribute.
+	 * The default value is <code>"0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Numerator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Numerator</em>' attribute.
+	 * @see #setNumerator(long)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralRationalExpression_Numerator()
+	 * @model default="0" required="true"
+	 * @generated
+	 */
+	long getNumerator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression#getNumerator <em>Numerator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Numerator</em>' attribute.
+	 * @see #getNumerator()
+	 * @generated
+	 */
+	void setNumerator(long value);
+
+	/**
+	 * Returns the value of the '<em><b>Denominator</b></em>' attribute.
+	 * The default value is <code>"1"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Denominator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Denominator</em>' attribute.
+	 * @see #setDenominator(long)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralRationalExpression_Denominator()
+	 * @model default="1" required="true"
+	 * @generated
+	 */
+	long getDenominator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression#getDenominator <em>Denominator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Denominator</em>' attribute.
+	 * @see #getDenominator()
+	 * @generated
+	 */
+	void setDenominator(long value);
+
+} // LiteralRationalExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralRealExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralRealExpression.java
new file mode 100644
index 0000000..3e2d3eb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralRealExpression.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Real Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralRealExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralRealExpression extends LiteralExpression {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(double)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralRealExpression_Value()
+	 * @model
+	 * @generated
+	 */
+	double getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(double value);
+
+} // LiteralRealExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralReferenceElement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralReferenceElement.java
new file mode 100644
index 0000000..c8471c8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralReferenceElement.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Reference Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getArg <em>Arg</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralReferenceElement()
+ * @model
+ * @generated
+ */
+public interface LiteralReferenceElement extends LiteralReferenceExpression {
+	/**
+	 * Returns the value of the '<em><b>Kind</b></em>' attribute.
+	 * The default value is <code>"field"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Kind</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind
+	 * @see #setKind(ValueElementSpecificationKind)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralReferenceElement_Kind()
+	 * @model default="field" required="true"
+	 * @generated
+	 */
+	ValueElementSpecificationKind getKind();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getKind <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind
+	 * @see #getKind()
+	 * @generated
+	 */
+	void setKind(ValueElementSpecificationKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' reference.
+	 * @see #setValue(NamedElement)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralReferenceElement_Value()
+	 * @model
+	 * @generated
+	 */
+	NamedElement getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getValue <em>Value</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' reference.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(NamedElement value);
+
+	/**
+	 * Returns the value of the '<em><b>Arg</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Arg</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Arg</em>' containment reference.
+	 * @see #setArg(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralReferenceElement_Arg()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getArg();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement#getArg <em>Arg</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Arg</em>' containment reference.
+	 * @see #getArg()
+	 * @generated
+	 */
+	void setArg(Expression value);
+
+} // LiteralReferenceElement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralReferenceExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralReferenceExpression.java
new file mode 100644
index 0000000..fcdb6c6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralReferenceExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Reference Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralReferenceExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralReferenceExpression extends LiteralExpression {
+} // LiteralReferenceExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralSelfExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralSelfExpression.java
new file mode 100644
index 0000000..6352fed
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralSelfExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Self Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralSelfExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralSelfExpression extends LiteralReferenceExpression {
+} // LiteralSelfExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralStringExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralStringExpression.java
new file mode 100644
index 0000000..aeba3a1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralStringExpression.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal String Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralStringExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralStringExpression extends LiteralExpression {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralStringExpression_Value()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(String value);
+
+} // LiteralStringExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralSuperExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralSuperExpression.java
new file mode 100644
index 0000000..5e1ea04
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralSuperExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Super Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralSuperExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralSuperExpression extends LiteralReferenceExpression {
+} // LiteralSuperExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralSystemExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralSystemExpression.java
new file mode 100644
index 0000000..7841145
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralSystemExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal System Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralSystemExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralSystemExpression extends LiteralReferenceExpression {
+} // LiteralSystemExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralThisExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralThisExpression.java
new file mode 100644
index 0000000..dc66512
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralThisExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal This Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralThisExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralThisExpression extends LiteralReferenceExpression {
+} // LiteralThisExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralTimeDeltaExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralTimeDeltaExpression.java
new file mode 100644
index 0000000..54bbbf7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralTimeDeltaExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Time Delta Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralTimeDeltaExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralTimeDeltaExpression extends LiteralReferenceExpression {
+} // LiteralTimeDeltaExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralTimeExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralTimeExpression.java
new file mode 100644
index 0000000..880a7e4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LiteralTimeExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Literal Time Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLiteralTimeExpression()
+ * @model
+ * @generated
+ */
+public interface LiteralTimeExpression extends LiteralReferenceExpression {
+} // LiteralTimeExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LogicalAssociativeExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LogicalAssociativeExpression.java
new file mode 100644
index 0000000..ae08622
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LogicalAssociativeExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Logical Associative Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLogicalAssociativeExpression()
+ * @model
+ * @generated
+ */
+public interface LogicalAssociativeExpression extends AssociativeExpression {
+} // LogicalAssociativeExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LogicalUnaryExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LogicalUnaryExpression.java
new file mode 100644
index 0000000..8a26a5d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/LogicalUnaryExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Logical Unary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getLogicalUnaryExpression()
+ * @model
+ * @generated
+ */
+public interface LogicalUnaryExpression extends UnaryExpression {
+} // LogicalUnaryExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/MixTupleExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/MixTupleExpression.java
new file mode 100644
index 0000000..9f0d1b0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/MixTupleExpression.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Mix Tuple Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.MixTupleExpression#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getMixTupleExpression()
+ * @model
+ * @generated
+ */
+public interface MixTupleExpression extends TupleExpression {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getMixTupleExpression_Value()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getValue();
+
+} // MixTupleExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/NamedExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/NamedExpression.java
new file mode 100644
index 0000000..4ae133a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/NamedExpression.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Named Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression#getTarget <em>Target</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression#getExpression <em>Expression</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getNamedExpression()
+ * @model
+ * @generated
+ */
+public interface NamedExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Target</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Target</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Target</em>' reference.
+	 * @see #setTarget(NamedElement)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getNamedExpression_Target()
+	 * @model
+	 * @generated
+	 */
+	NamedElement getTarget();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression#getTarget <em>Target</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Target</em>' reference.
+	 * @see #getTarget()
+	 * @generated
+	 */
+	void setTarget(NamedElement value);
+
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getNamedExpression_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Expression</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Expression</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Expression</em>' containment reference.
+	 * @see #setExpression(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getNamedExpression_Expression()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getExpression();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression#getExpression <em>Expression</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Expression</em>' containment reference.
+	 * @see #getExpression()
+	 * @generated
+	 */
+	void setExpression(Expression value);
+
+} // NamedExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/NamedTupleExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/NamedTupleExpression.java
new file mode 100644
index 0000000..50d4be9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/NamedTupleExpression.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Named Tuple Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getNamedTupleExpression()
+ * @model
+ * @generated
+ */
+public interface NamedTupleExpression extends TupleExpression {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.NamedExpression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getNamedTupleExpression_Value()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<NamedExpression> getValue();
+
+} // NamedTupleExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/NewfreshExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/NewfreshExpression.java
new file mode 100644
index 0000000..bca768d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/NewfreshExpression.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Newfresh Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.NewfreshExpression#getLeftHandSide <em>Left Hand Side</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getNewfreshExpression()
+ * @model
+ * @generated
+ */
+public interface NewfreshExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Hand Side</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Hand Side</em>' containment reference.
+	 * @see #setLeftHandSide(LeftHandSideExpression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getNewfreshExpression_LeftHandSide()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	LeftHandSideExpression getLeftHandSide();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.NewfreshExpression#getLeftHandSide <em>Left Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Left Hand Side</em>' containment reference.
+	 * @see #getLeftHandSide()
+	 * @generated
+	 */
+	void setLeftHandSide(LeftHandSideExpression value);
+
+} // NewfreshExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/PRINTER_FIX.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/PRINTER_FIX.java
new file mode 100644
index 0000000..5dae82d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/PRINTER_FIX.java
@@ -0,0 +1,305 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>PRINTER FIX</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getPRINTER_FIX()
+ * @model
+ * @generated
+ */
+public enum PRINTER_FIX implements Enumerator {
+	/**
+	 * The '<em><b>Infix</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INFIX_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INFIX(0, "infix", "infix"),
+
+	/**
+	 * The '<em><b>Prefix</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PREFIX_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PREFIX(1, "prefix", "prefix"),
+
+	/**
+	 * The '<em><b>Suffix</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SUFFIX_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SUFFIX(2, "suffix", "suffix"),
+
+	/**
+	 * The '<em><b>Functional</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FUNCTIONAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	FUNCTIONAL(3, "functional", "functional"),
+
+	/**
+	 * The '<em><b>Specific</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SPECIFIC_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SPECIFIC(4, "specific", "specific");
+
+	/**
+	 * The '<em><b>Infix</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Infix</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INFIX
+	 * @model name="infix"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INFIX_VALUE = 0;
+
+	/**
+	 * The '<em><b>Prefix</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Prefix</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PREFIX
+	 * @model name="prefix"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PREFIX_VALUE = 1;
+
+	/**
+	 * The '<em><b>Suffix</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Suffix</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SUFFIX
+	 * @model name="suffix"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SUFFIX_VALUE = 2;
+
+	/**
+	 * The '<em><b>Functional</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Functional</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #FUNCTIONAL
+	 * @model name="functional"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int FUNCTIONAL_VALUE = 3;
+
+	/**
+	 * The '<em><b>Specific</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Specific</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SPECIFIC
+	 * @model name="specific"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SPECIFIC_VALUE = 4;
+
+	/**
+	 * An array of all the '<em><b>PRINTER FIX</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final PRINTER_FIX[] VALUES_ARRAY =
+		new PRINTER_FIX[] {
+			INFIX,
+			PREFIX,
+			SUFFIX,
+			FUNCTIONAL,
+			SPECIFIC,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>PRINTER FIX</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<PRINTER_FIX> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>PRINTER FIX</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PRINTER_FIX get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PRINTER_FIX result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>PRINTER FIX</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PRINTER_FIX getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PRINTER_FIX result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>PRINTER FIX</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PRINTER_FIX get(int value) {
+		switch (value) {
+			case INFIX_VALUE: return INFIX;
+			case PREFIX_VALUE: return PREFIX;
+			case SUFFIX_VALUE: return SUFFIX;
+			case FUNCTIONAL_VALUE: return FUNCTIONAL;
+			case SPECIFIC_VALUE: return SPECIFIC;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private PRINTER_FIX(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //PRINTER_FIX
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/PositionalTupleExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/PositionalTupleExpression.java
new file mode 100644
index 0000000..3968b16
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/PositionalTupleExpression.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Positional Tuple Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getPositionalTupleExpression()
+ * @model
+ * @generated
+ */
+public interface PositionalTupleExpression extends TupleExpression {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getPositionalTupleExpression_Value()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getValue();
+
+} // PositionalTupleExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/RelationalBinaryExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/RelationalBinaryExpression.java
new file mode 100644
index 0000000..fe8527a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/RelationalBinaryExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Relational Binary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getRelationalBinaryExpression()
+ * @model
+ * @generated
+ */
+public interface RelationalBinaryExpression extends BinaryExpression {
+} // RelationalBinaryExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/RelationalTernaryExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/RelationalTernaryExpression.java
new file mode 100644
index 0000000..337e4ff
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/RelationalTernaryExpression.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Relational Ternary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getLeftRelation <em>Left Relation</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getRigthOperator <em>Rigth Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getRigthOperand <em>Rigth Operand</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getRelationalTernaryExpression()
+ * @model
+ * @generated
+ */
+public interface RelationalTernaryExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Left Relation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Relation</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Relation</em>' containment reference.
+	 * @see #setLeftRelation(RelationalBinaryExpression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getRelationalTernaryExpression_LeftRelation()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	RelationalBinaryExpression getLeftRelation();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getLeftRelation <em>Left Relation</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Left Relation</em>' containment reference.
+	 * @see #getLeftRelation()
+	 * @generated
+	 */
+	void setLeftRelation(RelationalBinaryExpression value);
+
+	/**
+	 * Returns the value of the '<em><b>Rigth Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Rigth Operator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Rigth Operator</em>' attribute.
+	 * @see #setRigthOperator(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getRelationalTernaryExpression_RigthOperator()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getRigthOperator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getRigthOperator <em>Rigth Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Rigth Operator</em>' attribute.
+	 * @see #getRigthOperator()
+	 * @generated
+	 */
+	void setRigthOperator(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Rigth Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Rigth Operand</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Rigth Operand</em>' containment reference.
+	 * @see #setRigthOperand(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getRelationalTernaryExpression_RigthOperand()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getRigthOperand();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression#getRigthOperand <em>Rigth Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Rigth Operand</em>' containment reference.
+	 * @see #getRigthOperand()
+	 * @generated
+	 */
+	void setRigthOperand(Expression value);
+
+} // RelationalTernaryExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/TupleExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/TupleExpression.java
new file mode 100644
index 0000000..0b9b981
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/TupleExpression.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Tuple Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getTupleExpression()
+ * @model abstract="true"
+ * @generated
+ */
+public interface TupleExpression extends Expression {
+} // TupleExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/UnaryExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/UnaryExpression.java
new file mode 100644
index 0000000..deb90d4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/UnaryExpression.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Unary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.UnaryExpression#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.UnaryExpression#getOperand <em>Operand</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getUnaryExpression()
+ * @model
+ * @generated
+ */
+public interface UnaryExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operator</em>' attribute.
+	 * @see #setOperator(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getUnaryExpression_Operator()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getOperator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.UnaryExpression#getOperator <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operator</em>' attribute.
+	 * @see #getOperator()
+	 * @generated
+	 */
+	void setOperator(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operand</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operand</em>' containment reference.
+	 * @see #setOperand(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getUnaryExpression_Operand()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getOperand();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.UnaryExpression#getOperand <em>Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operand</em>' containment reference.
+	 * @see #getOperand()
+	 * @generated
+	 */
+	void setOperand(Expression value);
+
+} // UnaryExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueElementSpecification.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueElementSpecification.java
new file mode 100644
index 0000000..62694e0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueElementSpecification.java
@@ -0,0 +1,176 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Value Element Specification</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getExpected <em>Expected</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getTarget <em>Target</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getElement <em>Element</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getArg <em>Arg</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueElementSpecification()
+ * @model
+ * @generated
+ */
+public interface ValueElementSpecification extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Kind</b></em>' attribute.
+	 * The default value is <code>"field"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Kind</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind
+	 * @see #setKind(ValueElementSpecificationKind)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueElementSpecification_Kind()
+	 * @model default="field" required="true"
+	 * @generated
+	 */
+	ValueElementSpecificationKind getKind();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getKind <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind
+	 * @see #getKind()
+	 * @generated
+	 */
+	void setKind(ValueElementSpecificationKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Expected</b></em>' attribute.
+	 * The default value is <code>"any"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Expected</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Expected</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme
+	 * @see #setExpected(ValueElementSpecificationScheme)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueElementSpecification_Expected()
+	 * @model default="any" required="true"
+	 * @generated
+	 */
+	ValueElementSpecificationScheme getExpected();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getExpected <em>Expected</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Expected</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme
+	 * @see #getExpected()
+	 * @generated
+	 */
+	void setExpected(ValueElementSpecificationScheme value);
+
+	/**
+	 * Returns the value of the '<em><b>Target</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Target</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Target</em>' containment reference.
+	 * @see #setTarget(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueElementSpecification_Target()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getTarget();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getTarget <em>Target</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Target</em>' containment reference.
+	 * @see #getTarget()
+	 * @generated
+	 */
+	void setTarget(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Element</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Element</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Element</em>' reference.
+	 * @see #setElement(NamedElement)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueElementSpecification_Element()
+	 * @model
+	 * @generated
+	 */
+	NamedElement getElement();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getElement <em>Element</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Element</em>' reference.
+	 * @see #getElement()
+	 * @generated
+	 */
+	void setElement(NamedElement value);
+
+	/**
+	 * Returns the value of the '<em><b>Arg</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Arg</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Arg</em>' containment reference.
+	 * @see #setArg(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueElementSpecification_Arg()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getArg();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification#getArg <em>Arg</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Arg</em>' containment reference.
+	 * @see #getArg()
+	 * @generated
+	 */
+	void setArg(Expression value);
+
+} // ValueElementSpecification
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueElementSpecificationKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueElementSpecificationKind.java
new file mode 100644
index 0000000..7add21f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueElementSpecificationKind.java
@@ -0,0 +1,251 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Value Element Specification Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueElementSpecificationKind()
+ * @model
+ * @generated
+ */
+public enum ValueElementSpecificationKind implements Enumerator {
+	/**
+	 * The '<em><b>Field</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FIELD_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	FIELD(0, "field", "field"),
+
+	/**
+	 * The '<em><b>Index</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INDEX_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INDEX(1, "index", "index"),
+
+	/**
+	 * The '<em><b>Parameter</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PARAMETER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PARAMETER(2, "parameter", "parameter");
+
+	/**
+	 * The '<em><b>Field</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Field</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #FIELD
+	 * @model name="field"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int FIELD_VALUE = 0;
+
+	/**
+	 * The '<em><b>Index</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Index</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INDEX
+	 * @model name="index"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INDEX_VALUE = 1;
+
+	/**
+	 * The '<em><b>Parameter</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Parameter</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PARAMETER
+	 * @model name="parameter"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PARAMETER_VALUE = 2;
+
+	/**
+	 * An array of all the '<em><b>Value Element Specification Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final ValueElementSpecificationKind[] VALUES_ARRAY =
+		new ValueElementSpecificationKind[] {
+			FIELD,
+			INDEX,
+			PARAMETER,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Value Element Specification Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<ValueElementSpecificationKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Value Element Specification Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ValueElementSpecificationKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ValueElementSpecificationKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Value Element Specification Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ValueElementSpecificationKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ValueElementSpecificationKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Value Element Specification Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ValueElementSpecificationKind get(int value) {
+		switch (value) {
+			case FIELD_VALUE: return FIELD;
+			case INDEX_VALUE: return INDEX;
+			case PARAMETER_VALUE: return PARAMETER;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ValueElementSpecificationKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //ValueElementSpecificationKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueElementSpecificationScheme.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueElementSpecificationScheme.java
new file mode 100644
index 0000000..b9ccf14
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueElementSpecificationScheme.java
@@ -0,0 +1,548 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Value Element Specification Scheme</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueElementSpecificationScheme()
+ * @model
+ * @generated
+ */
+public enum ValueElementSpecificationScheme implements Enumerator {
+	/**
+	 * The '<em><b>Any</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ANY_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ANY(0, "any", "any"),
+
+	/**
+	 * The '<em><b>Variable</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #VARIABLE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	VARIABLE(1, "variable", "variable"),
+
+	/**
+	 * The '<em><b>Message</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MESSAGE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MESSAGE(2, "message", "message"),
+
+	/**
+	 * The '<em><b>Signal</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SIGNAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SIGNAL(3, "signal", "signal"),
+
+	/**
+	 * The '<em><b>Buffer</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BUFFER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BUFFER(4, "buffer", "buffer"),
+
+	/**
+	 * The '<em><b>Channel</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CHANNEL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	CHANNEL(5, "channel", "channel"),
+
+	/**
+	 * The '<em><b>Port</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PORT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PORT(6, "port", "port"),
+
+	/**
+	 * The '<em><b>Com point</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #COM_POINT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	COM_POINT(7, "com_point", "com_point"),
+
+	/**
+	 * The '<em><b>Instance</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INSTANCE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INSTANCE(8, "instance", "instance"),
+
+	/**
+	 * The '<em><b>Machine</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MACHINE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MACHINE(9, "machine", "machine"),
+
+	/**
+	 * The '<em><b>Model</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MODEL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MODEL(10, "model", "model"),
+
+	/**
+	 * The '<em><b>Procedure</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PROCEDURE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PROCEDURE(11, "procedure", "procedure"),
+
+	/**
+	 * The '<em><b>Routine</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ROUTINE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ROUTINE(12, "routine", "routine"),
+
+	/**
+	 * The '<em><b>Vertex</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #VERTEX_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	VERTEX(13, "vertex", "vertex");
+
+	/**
+	 * The '<em><b>Any</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Any</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ANY
+	 * @model name="any"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ANY_VALUE = 0;
+
+	/**
+	 * The '<em><b>Variable</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Variable</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #VARIABLE
+	 * @model name="variable"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int VARIABLE_VALUE = 1;
+
+	/**
+	 * The '<em><b>Message</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Message</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MESSAGE
+	 * @model name="message"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MESSAGE_VALUE = 2;
+
+	/**
+	 * The '<em><b>Signal</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Signal</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SIGNAL
+	 * @model name="signal"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SIGNAL_VALUE = 3;
+
+	/**
+	 * The '<em><b>Buffer</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Buffer</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BUFFER
+	 * @model name="buffer"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BUFFER_VALUE = 4;
+
+	/**
+	 * The '<em><b>Channel</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Channel</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #CHANNEL
+	 * @model name="channel"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int CHANNEL_VALUE = 5;
+
+	/**
+	 * The '<em><b>Port</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Port</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PORT
+	 * @model name="port"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PORT_VALUE = 6;
+
+	/**
+	 * The '<em><b>Com point</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Com point</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #COM_POINT
+	 * @model name="com_point"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int COM_POINT_VALUE = 7;
+
+	/**
+	 * The '<em><b>Instance</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Instance</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INSTANCE
+	 * @model name="instance"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INSTANCE_VALUE = 8;
+
+	/**
+	 * The '<em><b>Machine</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Machine</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MACHINE
+	 * @model name="machine"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MACHINE_VALUE = 9;
+
+	/**
+	 * The '<em><b>Model</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Model</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MODEL
+	 * @model name="model"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MODEL_VALUE = 10;
+
+	/**
+	 * The '<em><b>Procedure</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Procedure</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PROCEDURE
+	 * @model name="procedure"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PROCEDURE_VALUE = 11;
+
+	/**
+	 * The '<em><b>Routine</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Routine</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ROUTINE
+	 * @model name="routine"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ROUTINE_VALUE = 12;
+
+	/**
+	 * The '<em><b>Vertex</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Vertex</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #VERTEX
+	 * @model name="vertex"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int VERTEX_VALUE = 13;
+
+	/**
+	 * An array of all the '<em><b>Value Element Specification Scheme</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final ValueElementSpecificationScheme[] VALUES_ARRAY =
+		new ValueElementSpecificationScheme[] {
+			ANY,
+			VARIABLE,
+			MESSAGE,
+			SIGNAL,
+			BUFFER,
+			CHANNEL,
+			PORT,
+			COM_POINT,
+			INSTANCE,
+			MACHINE,
+			MODEL,
+			PROCEDURE,
+			ROUTINE,
+			VERTEX,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Value Element Specification Scheme</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<ValueElementSpecificationScheme> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Value Element Specification Scheme</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ValueElementSpecificationScheme get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ValueElementSpecificationScheme result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Value Element Specification Scheme</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ValueElementSpecificationScheme getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ValueElementSpecificationScheme result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Value Element Specification Scheme</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ValueElementSpecificationScheme get(int value) {
+		switch (value) {
+			case ANY_VALUE: return ANY;
+			case VARIABLE_VALUE: return VARIABLE;
+			case MESSAGE_VALUE: return MESSAGE;
+			case SIGNAL_VALUE: return SIGNAL;
+			case BUFFER_VALUE: return BUFFER;
+			case CHANNEL_VALUE: return CHANNEL;
+			case PORT_VALUE: return PORT;
+			case COM_POINT_VALUE: return COM_POINT;
+			case INSTANCE_VALUE: return INSTANCE;
+			case MACHINE_VALUE: return MACHINE;
+			case MODEL_VALUE: return MODEL;
+			case PROCEDURE_VALUE: return PROCEDURE;
+			case ROUTINE_VALUE: return ROUTINE;
+			case VERTEX_VALUE: return VERTEX;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ValueElementSpecificationScheme(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //ValueElementSpecificationScheme
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueExpressionPrettyPrinter.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueExpressionPrettyPrinter.java
new file mode 100644
index 0000000..3392f4c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValueExpressionPrettyPrinter.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Value Expression Pretty Printer</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getSymbol <em>Symbol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getFix <em>Fix</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getSpecific <em>Specific</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueExpressionPrettyPrinter()
+ * @model abstract="true"
+ * @generated
+ */
+public interface ValueExpressionPrettyPrinter extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Symbol</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Symbol</em>' attribute.
+	 * @see #setSymbol(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueExpressionPrettyPrinter_Symbol()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getSymbol();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getSymbol <em>Symbol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Symbol</em>' attribute.
+	 * @see #getSymbol()
+	 * @generated
+	 */
+	void setSymbol(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Fix</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Fix</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Fix</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX
+	 * @see #setFix(PRINTER_FIX)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueExpressionPrettyPrinter_Fix()
+	 * @model required="true"
+	 * @generated
+	 */
+	PRINTER_FIX getFix();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter#getFix <em>Fix</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Fix</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX
+	 * @see #getFix()
+	 * @generated
+	 */
+	void setFix(PRINTER_FIX value);
+
+	/**
+	 * Returns the value of the '<em><b>Specific</b></em>' attribute list.
+	 * The list contents are of type {@link java.lang.String}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Specific</em>' attribute list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Specific</em>' attribute list.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValueExpressionPrettyPrinter_Specific()
+	 * @model
+	 * @generated
+	 */
+	EList<String> getSpecific();
+
+} // ValueExpressionPrettyPrinter
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValuePrintableExpression.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValuePrintableExpression.java
new file mode 100644
index 0000000..a8ea275
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/ValuePrintableExpression.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Value Printable Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getSymbol <em>Symbol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getPrinter <em>Printer</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getOperand <em>Operand</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValuePrintableExpression()
+ * @model
+ * @generated
+ */
+public interface ValuePrintableExpression extends Expression {
+	/**
+	 * Returns the value of the '<em><b>Symbol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Symbol</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Symbol</em>' attribute.
+	 * @see #setSymbol(String)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValuePrintableExpression_Symbol()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getSymbol();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getSymbol <em>Symbol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Symbol</em>' attribute.
+	 * @see #getSymbol()
+	 * @generated
+	 */
+	void setSymbol(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Printer</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Printer</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Printer</em>' containment reference.
+	 * @see #setPrinter(ValueExpressionPrettyPrinter)
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValuePrintableExpression_Printer()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ValueExpressionPrettyPrinter getPrinter();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression#getPrinter <em>Printer</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Printer</em>' containment reference.
+	 * @see #getPrinter()
+	 * @generated
+	 */
+	void setPrinter(ValueExpressionPrettyPrinter value);
+
+	/**
+	 * Returns the value of the '<em><b>Operand</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operand</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operand</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#getValuePrintableExpression_Operand()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getOperand();
+
+} // ValuePrintableExpression
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ArithmeticAssociativeExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ArithmeticAssociativeExpressionImpl.java
new file mode 100644
index 0000000..ab6f6c3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ArithmeticAssociativeExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Arithmetic Associative Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class ArithmeticAssociativeExpressionImpl extends AssociativeExpressionImpl implements ArithmeticAssociativeExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ArithmeticAssociativeExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.ARITHMETIC_ASSOCIATIVE_EXPRESSION;
+	}
+
+} //ArithmeticAssociativeExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ArithmeticUnaryExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ArithmeticUnaryExpressionImpl.java
new file mode 100644
index 0000000..42da7c6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ArithmeticUnaryExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Arithmetic Unary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class ArithmeticUnaryExpressionImpl extends UnaryExpressionImpl implements ArithmeticUnaryExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ArithmeticUnaryExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.ARITHMETIC_UNARY_EXPRESSION;
+	}
+
+} //ArithmeticUnaryExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/AssignmentExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/AssignmentExpressionImpl.java
new file mode 100644
index 0000000..ae6a58f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/AssignmentExpressionImpl.java
@@ -0,0 +1,320 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.AssignmentExpression;
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Assignment Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.AssignmentExpressionImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.AssignmentExpressionImpl#getLeftHandSide <em>Left Hand Side</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.AssignmentExpressionImpl#getRigthHandSide <em>Rigth Hand Side</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class AssignmentExpressionImpl extends ExpressionImpl implements AssignmentExpression {
+	/**
+	 * The default value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OPERATOR_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected String operator = OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getLeftHandSide() <em>Left Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLeftHandSide()
+	 * @generated
+	 * @ordered
+	 */
+	protected LeftHandSideExpression leftHandSide;
+
+	/**
+	 * The cached value of the '{@link #getRigthHandSide() <em>Rigth Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRigthHandSide()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression rigthHandSide;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected AssignmentExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.ASSIGNMENT_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOperator() {
+		return operator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator(String newOperator) {
+		String oldOperator = operator;
+		operator = newOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.ASSIGNMENT_EXPRESSION__OPERATOR, oldOperator, operator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LeftHandSideExpression getLeftHandSide() {
+		return leftHandSide;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLeftHandSide(LeftHandSideExpression newLeftHandSide, NotificationChain msgs) {
+		LeftHandSideExpression oldLeftHandSide = leftHandSide;
+		leftHandSide = newLeftHandSide;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE, oldLeftHandSide, newLeftHandSide);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLeftHandSide(LeftHandSideExpression newLeftHandSide) {
+		if (newLeftHandSide != leftHandSide) {
+			NotificationChain msgs = null;
+			if (leftHandSide != null)
+				msgs = ((InternalEObject)leftHandSide).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE, null, msgs);
+			if (newLeftHandSide != null)
+				msgs = ((InternalEObject)newLeftHandSide).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE, null, msgs);
+			msgs = basicSetLeftHandSide(newLeftHandSide, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE, newLeftHandSide, newLeftHandSide));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getRigthHandSide() {
+		return rigthHandSide;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetRigthHandSide(Expression newRigthHandSide, NotificationChain msgs) {
+		Expression oldRigthHandSide = rigthHandSide;
+		rigthHandSide = newRigthHandSide;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE, oldRigthHandSide, newRigthHandSide);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRigthHandSide(Expression newRigthHandSide) {
+		if (newRigthHandSide != rigthHandSide) {
+			NotificationChain msgs = null;
+			if (rigthHandSide != null)
+				msgs = ((InternalEObject)rigthHandSide).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE, null, msgs);
+			if (newRigthHandSide != null)
+				msgs = ((InternalEObject)newRigthHandSide).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE, null, msgs);
+			msgs = basicSetRigthHandSide(newRigthHandSide, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE, newRigthHandSide, newRigthHandSide));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE:
+				return basicSetLeftHandSide(null, msgs);
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE:
+				return basicSetRigthHandSide(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__OPERATOR:
+				return getOperator();
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE:
+				return getLeftHandSide();
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE:
+				return getRigthHandSide();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__OPERATOR:
+				setOperator((String)newValue);
+				return;
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE:
+				setLeftHandSide((LeftHandSideExpression)newValue);
+				return;
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE:
+				setRigthHandSide((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__OPERATOR:
+				setOperator(OPERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE:
+				setLeftHandSide((LeftHandSideExpression)null);
+				return;
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE:
+				setRigthHandSide((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__OPERATOR:
+				return OPERATOR_EDEFAULT == null ? operator != null : !OPERATOR_EDEFAULT.equals(operator);
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE:
+				return leftHandSide != null;
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE:
+				return rigthHandSide != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (operator: ");
+		result.append(operator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //AssignmentExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/AssociativeExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/AssociativeExpressionImpl.java
new file mode 100644
index 0000000..a5872b5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/AssociativeExpressionImpl.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.AssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Associative Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.AssociativeExpressionImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.AssociativeExpressionImpl#getOperand <em>Operand</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class AssociativeExpressionImpl extends ExpressionImpl implements AssociativeExpression {
+	/**
+	 * The default value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OPERATOR_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected String operator = OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getOperand() <em>Operand</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> operand;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected AssociativeExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.ASSOCIATIVE_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOperator() {
+		return operator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator(String newOperator) {
+		String oldOperator = operator;
+		operator = newOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERATOR, oldOperator, operator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getOperand() {
+		if (operand == null) {
+			operand = new EObjectContainmentEList<Expression>(Expression.class, this, ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERAND);
+		}
+		return operand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERAND:
+				return ((InternalEList<?>)getOperand()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERATOR:
+				return getOperator();
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERAND:
+				return getOperand();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERATOR:
+				setOperator((String)newValue);
+				return;
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERAND:
+				getOperand().clear();
+				getOperand().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERATOR:
+				setOperator(OPERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERAND:
+				getOperand().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERATOR:
+				return OPERATOR_EDEFAULT == null ? operator != null : !OPERATOR_EDEFAULT.equals(operator);
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION__OPERAND:
+				return operand != null && !operand.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (operator: ");
+		result.append(operator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //AssociativeExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/BinaryExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/BinaryExpressionImpl.java
new file mode 100644
index 0000000..09fd03d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/BinaryExpressionImpl.java
@@ -0,0 +1,319 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.BinaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Binary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.BinaryExpressionImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.BinaryExpressionImpl#getLeftOperand <em>Left Operand</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.BinaryExpressionImpl#getRigthOperand <em>Rigth Operand</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class BinaryExpressionImpl extends ExpressionImpl implements BinaryExpression {
+	/**
+	 * The default value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OPERATOR_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected String operator = OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getLeftOperand() <em>Left Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLeftOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression leftOperand;
+
+	/**
+	 * The cached value of the '{@link #getRigthOperand() <em>Rigth Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRigthOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression rigthOperand;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BinaryExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.BINARY_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOperator() {
+		return operator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator(String newOperator) {
+		String oldOperator = operator;
+		operator = newOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.BINARY_EXPRESSION__OPERATOR, oldOperator, operator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getLeftOperand() {
+		return leftOperand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLeftOperand(Expression newLeftOperand, NotificationChain msgs) {
+		Expression oldLeftOperand = leftOperand;
+		leftOperand = newLeftOperand;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.BINARY_EXPRESSION__LEFT_OPERAND, oldLeftOperand, newLeftOperand);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLeftOperand(Expression newLeftOperand) {
+		if (newLeftOperand != leftOperand) {
+			NotificationChain msgs = null;
+			if (leftOperand != null)
+				msgs = ((InternalEObject)leftOperand).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.BINARY_EXPRESSION__LEFT_OPERAND, null, msgs);
+			if (newLeftOperand != null)
+				msgs = ((InternalEObject)newLeftOperand).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.BINARY_EXPRESSION__LEFT_OPERAND, null, msgs);
+			msgs = basicSetLeftOperand(newLeftOperand, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.BINARY_EXPRESSION__LEFT_OPERAND, newLeftOperand, newLeftOperand));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getRigthOperand() {
+		return rigthOperand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetRigthOperand(Expression newRigthOperand, NotificationChain msgs) {
+		Expression oldRigthOperand = rigthOperand;
+		rigthOperand = newRigthOperand;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.BINARY_EXPRESSION__RIGTH_OPERAND, oldRigthOperand, newRigthOperand);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRigthOperand(Expression newRigthOperand) {
+		if (newRigthOperand != rigthOperand) {
+			NotificationChain msgs = null;
+			if (rigthOperand != null)
+				msgs = ((InternalEObject)rigthOperand).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.BINARY_EXPRESSION__RIGTH_OPERAND, null, msgs);
+			if (newRigthOperand != null)
+				msgs = ((InternalEObject)newRigthOperand).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.BINARY_EXPRESSION__RIGTH_OPERAND, null, msgs);
+			msgs = basicSetRigthOperand(newRigthOperand, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.BINARY_EXPRESSION__RIGTH_OPERAND, newRigthOperand, newRigthOperand));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.BINARY_EXPRESSION__LEFT_OPERAND:
+				return basicSetLeftOperand(null, msgs);
+			case ExpressionPackage.BINARY_EXPRESSION__RIGTH_OPERAND:
+				return basicSetRigthOperand(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.BINARY_EXPRESSION__OPERATOR:
+				return getOperator();
+			case ExpressionPackage.BINARY_EXPRESSION__LEFT_OPERAND:
+				return getLeftOperand();
+			case ExpressionPackage.BINARY_EXPRESSION__RIGTH_OPERAND:
+				return getRigthOperand();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.BINARY_EXPRESSION__OPERATOR:
+				setOperator((String)newValue);
+				return;
+			case ExpressionPackage.BINARY_EXPRESSION__LEFT_OPERAND:
+				setLeftOperand((Expression)newValue);
+				return;
+			case ExpressionPackage.BINARY_EXPRESSION__RIGTH_OPERAND:
+				setRigthOperand((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.BINARY_EXPRESSION__OPERATOR:
+				setOperator(OPERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.BINARY_EXPRESSION__LEFT_OPERAND:
+				setLeftOperand((Expression)null);
+				return;
+			case ExpressionPackage.BINARY_EXPRESSION__RIGTH_OPERAND:
+				setRigthOperand((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.BINARY_EXPRESSION__OPERATOR:
+				return OPERATOR_EDEFAULT == null ? operator != null : !OPERATOR_EDEFAULT.equals(operator);
+			case ExpressionPackage.BINARY_EXPRESSION__LEFT_OPERAND:
+				return leftOperand != null;
+			case ExpressionPackage.BINARY_EXPRESSION__RIGTH_OPERAND:
+				return rigthOperand != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (operator: ");
+		result.append(operator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //BinaryExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/BitwiseAssociativeExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/BitwiseAssociativeExpressionImpl.java
new file mode 100644
index 0000000..dfe3a02
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/BitwiseAssociativeExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.BitwiseAssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Bitwise Associative Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class BitwiseAssociativeExpressionImpl extends AssociativeExpressionImpl implements BitwiseAssociativeExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BitwiseAssociativeExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.BITWISE_ASSOCIATIVE_EXPRESSION;
+	}
+
+} //BitwiseAssociativeExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/BitwiseUnaryExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/BitwiseUnaryExpressionImpl.java
new file mode 100644
index 0000000..d216ee3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/BitwiseUnaryExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.BitwiseUnaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Bitwise Unary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class BitwiseUnaryExpressionImpl extends UnaryExpressionImpl implements BitwiseUnaryExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BitwiseUnaryExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.BITWISE_UNARY_EXPRESSION;
+	}
+
+} //BitwiseUnaryExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/CastExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/CastExpressionImpl.java
new file mode 100644
index 0000000..278ef36
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/CastExpressionImpl.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+import org.eclipse.efm.ecore.formalml.expression.CastExpression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Cast Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.CastExpressionImpl#getDatatype <em>Datatype</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class CastExpressionImpl extends UnaryExpressionImpl implements CastExpression {
+	/**
+	 * The cached value of the '{@link #getDatatype() <em>Datatype</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDatatype()
+	 * @generated
+	 * @ordered
+	 */
+	protected DataType datatype;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected CastExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.CAST_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataType getDatatype() {
+		if (datatype != null && datatype.eIsProxy()) {
+			InternalEObject oldDatatype = (InternalEObject)datatype;
+			datatype = (DataType)eResolveProxy(oldDatatype);
+			if (datatype != oldDatatype) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ExpressionPackage.CAST_EXPRESSION__DATATYPE, oldDatatype, datatype));
+			}
+		}
+		return datatype;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataType basicGetDatatype() {
+		return datatype;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDatatype(DataType newDatatype) {
+		DataType oldDatatype = datatype;
+		datatype = newDatatype;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.CAST_EXPRESSION__DATATYPE, oldDatatype, datatype));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.CAST_EXPRESSION__DATATYPE:
+				if (resolve) return getDatatype();
+				return basicGetDatatype();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.CAST_EXPRESSION__DATATYPE:
+				setDatatype((DataType)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.CAST_EXPRESSION__DATATYPE:
+				setDatatype((DataType)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.CAST_EXPRESSION__DATATYPE:
+				return datatype != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //CastExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ConditionalTestExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ConditionalTestExpressionImpl.java
new file mode 100644
index 0000000..feaaa1c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ConditionalTestExpressionImpl.java
@@ -0,0 +1,385 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression;
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Conditional Test Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ConditionalTestExpressionImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ConditionalTestExpressionImpl#getCondition <em>Condition</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ConditionalTestExpressionImpl#getThenOperand <em>Then Operand</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ConditionalTestExpressionImpl#getElseOperand <em>Else Operand</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ConditionalTestExpressionImpl extends ExpressionImpl implements ConditionalTestExpression {
+	/**
+	 * The default value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OPERATOR_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected String operator = OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getCondition() <em>Condition</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCondition()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression condition;
+
+	/**
+	 * The cached value of the '{@link #getThenOperand() <em>Then Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getThenOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression thenOperand;
+
+	/**
+	 * The cached value of the '{@link #getElseOperand() <em>Else Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getElseOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression elseOperand;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ConditionalTestExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.CONDITIONAL_TEST_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOperator() {
+		return operator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator(String newOperator) {
+		String oldOperator = operator;
+		operator = newOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__OPERATOR, oldOperator, operator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getCondition() {
+		return condition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetCondition(Expression newCondition, NotificationChain msgs) {
+		Expression oldCondition = condition;
+		condition = newCondition;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__CONDITION, oldCondition, newCondition);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCondition(Expression newCondition) {
+		if (newCondition != condition) {
+			NotificationChain msgs = null;
+			if (condition != null)
+				msgs = ((InternalEObject)condition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__CONDITION, null, msgs);
+			if (newCondition != null)
+				msgs = ((InternalEObject)newCondition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__CONDITION, null, msgs);
+			msgs = basicSetCondition(newCondition, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__CONDITION, newCondition, newCondition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getThenOperand() {
+		return thenOperand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetThenOperand(Expression newThenOperand, NotificationChain msgs) {
+		Expression oldThenOperand = thenOperand;
+		thenOperand = newThenOperand;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND, oldThenOperand, newThenOperand);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setThenOperand(Expression newThenOperand) {
+		if (newThenOperand != thenOperand) {
+			NotificationChain msgs = null;
+			if (thenOperand != null)
+				msgs = ((InternalEObject)thenOperand).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND, null, msgs);
+			if (newThenOperand != null)
+				msgs = ((InternalEObject)newThenOperand).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND, null, msgs);
+			msgs = basicSetThenOperand(newThenOperand, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND, newThenOperand, newThenOperand));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getElseOperand() {
+		return elseOperand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetElseOperand(Expression newElseOperand, NotificationChain msgs) {
+		Expression oldElseOperand = elseOperand;
+		elseOperand = newElseOperand;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND, oldElseOperand, newElseOperand);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setElseOperand(Expression newElseOperand) {
+		if (newElseOperand != elseOperand) {
+			NotificationChain msgs = null;
+			if (elseOperand != null)
+				msgs = ((InternalEObject)elseOperand).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND, null, msgs);
+			if (newElseOperand != null)
+				msgs = ((InternalEObject)newElseOperand).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND, null, msgs);
+			msgs = basicSetElseOperand(newElseOperand, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND, newElseOperand, newElseOperand));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__CONDITION:
+				return basicSetCondition(null, msgs);
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND:
+				return basicSetThenOperand(null, msgs);
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND:
+				return basicSetElseOperand(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__OPERATOR:
+				return getOperator();
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__CONDITION:
+				return getCondition();
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND:
+				return getThenOperand();
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND:
+				return getElseOperand();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__OPERATOR:
+				setOperator((String)newValue);
+				return;
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__CONDITION:
+				setCondition((Expression)newValue);
+				return;
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND:
+				setThenOperand((Expression)newValue);
+				return;
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND:
+				setElseOperand((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__OPERATOR:
+				setOperator(OPERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__CONDITION:
+				setCondition((Expression)null);
+				return;
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND:
+				setThenOperand((Expression)null);
+				return;
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND:
+				setElseOperand((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__OPERATOR:
+				return OPERATOR_EDEFAULT == null ? operator != null : !OPERATOR_EDEFAULT.equals(operator);
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__CONDITION:
+				return condition != null;
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND:
+				return thenOperand != null;
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND:
+				return elseOperand != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (operator: ");
+		result.append(operator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ConditionalTestExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/EqualityBinaryExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/EqualityBinaryExpressionImpl.java
new file mode 100644
index 0000000..aec74a5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/EqualityBinaryExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.EqualityBinaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Equality Binary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class EqualityBinaryExpressionImpl extends BinaryExpressionImpl implements EqualityBinaryExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EqualityBinaryExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.EQUALITY_BINARY_EXPRESSION;
+	}
+
+} //EqualityBinaryExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsBufferImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsBufferImpl.java
new file mode 100644
index 0000000..bf078aa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsBufferImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>As Buffer</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsBufferImpl#getBuffer <em>Buffer</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ExpressionAsBufferImpl extends MinimalEObjectImpl.Container implements ExpressionAsBuffer {
+	/**
+	 * The cached value of the '{@link #getBuffer() <em>Buffer</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBuffer()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression buffer;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExpressionAsBufferImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.EXPRESSION_AS_BUFFER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getBuffer() {
+		return buffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetBuffer(Expression newBuffer, NotificationChain msgs) {
+		Expression oldBuffer = buffer;
+		buffer = newBuffer;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.EXPRESSION_AS_BUFFER__BUFFER, oldBuffer, newBuffer);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBuffer(Expression newBuffer) {
+		if (newBuffer != buffer) {
+			NotificationChain msgs = null;
+			if (buffer != null)
+				msgs = ((InternalEObject)buffer).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.EXPRESSION_AS_BUFFER__BUFFER, null, msgs);
+			if (newBuffer != null)
+				msgs = ((InternalEObject)newBuffer).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.EXPRESSION_AS_BUFFER__BUFFER, null, msgs);
+			msgs = basicSetBuffer(newBuffer, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.EXPRESSION_AS_BUFFER__BUFFER, newBuffer, newBuffer));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_BUFFER__BUFFER:
+				return basicSetBuffer(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_BUFFER__BUFFER:
+				return getBuffer();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_BUFFER__BUFFER:
+				setBuffer((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_BUFFER__BUFFER:
+				setBuffer((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_BUFFER__BUFFER:
+				return buffer != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ExpressionAsBufferImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsChannelImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsChannelImpl.java
new file mode 100644
index 0000000..9b286d4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsChannelImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>As Channel</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsChannelImpl#getChannel <em>Channel</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ExpressionAsChannelImpl extends MinimalEObjectImpl.Container implements ExpressionAsChannel {
+	/**
+	 * The cached value of the '{@link #getChannel() <em>Channel</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getChannel()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression channel;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExpressionAsChannelImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.EXPRESSION_AS_CHANNEL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getChannel() {
+		return channel;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetChannel(Expression newChannel, NotificationChain msgs) {
+		Expression oldChannel = channel;
+		channel = newChannel;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.EXPRESSION_AS_CHANNEL__CHANNEL, oldChannel, newChannel);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setChannel(Expression newChannel) {
+		if (newChannel != channel) {
+			NotificationChain msgs = null;
+			if (channel != null)
+				msgs = ((InternalEObject)channel).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.EXPRESSION_AS_CHANNEL__CHANNEL, null, msgs);
+			if (newChannel != null)
+				msgs = ((InternalEObject)newChannel).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.EXPRESSION_AS_CHANNEL__CHANNEL, null, msgs);
+			msgs = basicSetChannel(newChannel, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.EXPRESSION_AS_CHANNEL__CHANNEL, newChannel, newChannel));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_CHANNEL__CHANNEL:
+				return basicSetChannel(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_CHANNEL__CHANNEL:
+				return getChannel();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_CHANNEL__CHANNEL:
+				setChannel((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_CHANNEL__CHANNEL:
+				setChannel((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_CHANNEL__CHANNEL:
+				return channel != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ExpressionAsChannelImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsMachineImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsMachineImpl.java
new file mode 100644
index 0000000..46582f4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsMachineImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>As Machine</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsMachineImpl#getMachine <em>Machine</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ExpressionAsMachineImpl extends MinimalEObjectImpl.Container implements ExpressionAsMachine {
+	/**
+	 * The cached value of the '{@link #getMachine() <em>Machine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMachine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression machine;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExpressionAsMachineImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.EXPRESSION_AS_MACHINE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getMachine() {
+		return machine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMachine(Expression newMachine, NotificationChain msgs) {
+		Expression oldMachine = machine;
+		machine = newMachine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.EXPRESSION_AS_MACHINE__MACHINE, oldMachine, newMachine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMachine(Expression newMachine) {
+		if (newMachine != machine) {
+			NotificationChain msgs = null;
+			if (machine != null)
+				msgs = ((InternalEObject)machine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.EXPRESSION_AS_MACHINE__MACHINE, null, msgs);
+			if (newMachine != null)
+				msgs = ((InternalEObject)newMachine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.EXPRESSION_AS_MACHINE__MACHINE, null, msgs);
+			msgs = basicSetMachine(newMachine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.EXPRESSION_AS_MACHINE__MACHINE, newMachine, newMachine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_MACHINE__MACHINE:
+				return basicSetMachine(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_MACHINE__MACHINE:
+				return getMachine();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_MACHINE__MACHINE:
+				setMachine((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_MACHINE__MACHINE:
+				setMachine((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_MACHINE__MACHINE:
+				return machine != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ExpressionAsMachineImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsPortImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsPortImpl.java
new file mode 100644
index 0000000..a65b0ca
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionAsPortImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>As Port</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ExpressionAsPortImpl#getPort <em>Port</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ExpressionAsPortImpl extends MinimalEObjectImpl.Container implements ExpressionAsPort {
+	/**
+	 * The cached value of the '{@link #getPort() <em>Port</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPort()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression port;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExpressionAsPortImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.EXPRESSION_AS_PORT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getPort() {
+		return port;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetPort(Expression newPort, NotificationChain msgs) {
+		Expression oldPort = port;
+		port = newPort;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.EXPRESSION_AS_PORT__PORT, oldPort, newPort);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPort(Expression newPort) {
+		if (newPort != port) {
+			NotificationChain msgs = null;
+			if (port != null)
+				msgs = ((InternalEObject)port).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.EXPRESSION_AS_PORT__PORT, null, msgs);
+			if (newPort != null)
+				msgs = ((InternalEObject)newPort).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.EXPRESSION_AS_PORT__PORT, null, msgs);
+			msgs = basicSetPort(newPort, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.EXPRESSION_AS_PORT__PORT, newPort, newPort));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_PORT__PORT:
+				return basicSetPort(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_PORT__PORT:
+				return getPort();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_PORT__PORT:
+				setPort((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_PORT__PORT:
+				setPort((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.EXPRESSION_AS_PORT__PORT:
+				return port != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ExpressionAsPortImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionFactoryImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionFactoryImpl.java
new file mode 100644
index 0000000..d4f7672
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionFactoryImpl.java
@@ -0,0 +1,765 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ExpressionFactoryImpl extends EFactoryImpl implements ExpressionFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static ExpressionFactory init() {
+		try {
+			ExpressionFactory theExpressionFactory = (ExpressionFactory)EPackage.Registry.INSTANCE.getEFactory(ExpressionPackage.eNS_URI);
+			if (theExpressionFactory != null) {
+				return theExpressionFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new ExpressionFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION: return createValuePrintableExpression();
+			case ExpressionPackage.LITERAL_EXPRESSION: return createLiteralExpression();
+			case ExpressionPackage.LITERAL_BOOLEAN_EXPRESSION: return createLiteralBooleanExpression();
+			case ExpressionPackage.LITERAL_INTEGER_EXPRESSION: return createLiteralIntegerExpression();
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION: return createLiteralRationalExpression();
+			case ExpressionPackage.LITERAL_FLOAT_EXPRESSION: return createLiteralFloatExpression();
+			case ExpressionPackage.LITERAL_REAL_EXPRESSION: return createLiteralRealExpression();
+			case ExpressionPackage.LITERAL_CHARACTER_EXPRESSION: return createLiteralCharacterExpression();
+			case ExpressionPackage.LITERAL_STRING_EXPRESSION: return createLiteralStringExpression();
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION: return createLiteralCollectionExpression();
+			case ExpressionPackage.LITERAL_NULL_EXPRESSION: return createLiteralNullExpression();
+			case ExpressionPackage.LITERAL_REFERENCE_EXPRESSION: return createLiteralReferenceExpression();
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT: return createLiteralReferenceElement();
+			case ExpressionPackage.LITERAL_THIS_EXPRESSION: return createLiteralThisExpression();
+			case ExpressionPackage.LITERAL_SELF_EXPRESSION: return createLiteralSelfExpression();
+			case ExpressionPackage.LITERAL_PARENT_EXPRESSION: return createLiteralParentExpression();
+			case ExpressionPackage.LITERAL_SUPER_EXPRESSION: return createLiteralSuperExpression();
+			case ExpressionPackage.LITERAL_SYSTEM_EXPRESSION: return createLiteralSystemExpression();
+			case ExpressionPackage.LITERAL_ENV_EXPRESSION: return createLiteralEnvExpression();
+			case ExpressionPackage.LITERAL_TIME_EXPRESSION: return createLiteralTimeExpression();
+			case ExpressionPackage.LITERAL_TIME_DELTA_EXPRESSION: return createLiteralTimeDeltaExpression();
+			case ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION: return createLeftHandSideExpression();
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION: return createIncrementOrDecrementExpression();
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION: return createIncrementOrDecrementPrefixExpression();
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION: return createIncrementOrDecrementPostfixExpression();
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION: return createAssignmentExpression();
+			case ExpressionPackage.NEWFRESH_EXPRESSION: return createNewfreshExpression();
+			case ExpressionPackage.UNARY_EXPRESSION: return createUnaryExpression();
+			case ExpressionPackage.BITWISE_UNARY_EXPRESSION: return createBitwiseUnaryExpression();
+			case ExpressionPackage.LOGICAL_UNARY_EXPRESSION: return createLogicalUnaryExpression();
+			case ExpressionPackage.CAST_EXPRESSION: return createCastExpression();
+			case ExpressionPackage.ARITHMETIC_UNARY_EXPRESSION: return createArithmeticUnaryExpression();
+			case ExpressionPackage.BINARY_EXPRESSION: return createBinaryExpression();
+			case ExpressionPackage.EQUALITY_BINARY_EXPRESSION: return createEqualityBinaryExpression();
+			case ExpressionPackage.RELATIONAL_BINARY_EXPRESSION: return createRelationalBinaryExpression();
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION: return createRelationalTernaryExpression();
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION: return createConditionalTestExpression();
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION: return createAssociativeExpression();
+			case ExpressionPackage.ARITHMETIC_ASSOCIATIVE_EXPRESSION: return createArithmeticAssociativeExpression();
+			case ExpressionPackage.BITWISE_ASSOCIATIVE_EXPRESSION: return createBitwiseAssociativeExpression();
+			case ExpressionPackage.LOGICAL_ASSOCIATIVE_EXPRESSION: return createLogicalAssociativeExpression();
+			case ExpressionPackage.INVOKE_EXPRESSION: return createInvokeExpression();
+			case ExpressionPackage.NAMED_EXPRESSION: return createNamedExpression();
+			case ExpressionPackage.MIX_TUPLE_EXPRESSION: return createMixTupleExpression();
+			case ExpressionPackage.NAMED_TUPLE_EXPRESSION: return createNamedTupleExpression();
+			case ExpressionPackage.POSITIONAL_TUPLE_EXPRESSION: return createPositionalTupleExpression();
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION: return createValueElementSpecification();
+			case ExpressionPackage.INSTANTIATION_EXPRESSION: return createInstantiationExpression();
+			case ExpressionPackage.EXPRESSION_AS_BUFFER: return createExpressionAsBuffer();
+			case ExpressionPackage.EXPRESSION_AS_CHANNEL: return createExpressionAsChannel();
+			case ExpressionPackage.EXPRESSION_AS_MACHINE: return createExpressionAsMachine();
+			case ExpressionPackage.EXPRESSION_AS_PORT: return createExpressionAsPort();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case ExpressionPackage.PRINTER_FIX:
+				return createPRINTER_FIXFromString(eDataType, initialValue);
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION_KIND:
+				return createValueElementSpecificationKindFromString(eDataType, initialValue);
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION_SCHEME:
+				return createValueElementSpecificationSchemeFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case ExpressionPackage.PRINTER_FIX:
+				return convertPRINTER_FIXToString(eDataType, instanceValue);
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION_KIND:
+				return convertValueElementSpecificationKindToString(eDataType, instanceValue);
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION_SCHEME:
+				return convertValueElementSpecificationSchemeToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValuePrintableExpression createValuePrintableExpression() {
+		ValuePrintableExpressionImpl valuePrintableExpression = new ValuePrintableExpressionImpl();
+		return valuePrintableExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralExpression createLiteralExpression() {
+		LiteralExpressionImpl literalExpression = new LiteralExpressionImpl();
+		return literalExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralBooleanExpression createLiteralBooleanExpression() {
+		LiteralBooleanExpressionImpl literalBooleanExpression = new LiteralBooleanExpressionImpl();
+		return literalBooleanExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralIntegerExpression createLiteralIntegerExpression() {
+		LiteralIntegerExpressionImpl literalIntegerExpression = new LiteralIntegerExpressionImpl();
+		return literalIntegerExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralRationalExpression createLiteralRationalExpression() {
+		LiteralRationalExpressionImpl literalRationalExpression = new LiteralRationalExpressionImpl();
+		return literalRationalExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralFloatExpression createLiteralFloatExpression() {
+		LiteralFloatExpressionImpl literalFloatExpression = new LiteralFloatExpressionImpl();
+		return literalFloatExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralRealExpression createLiteralRealExpression() {
+		LiteralRealExpressionImpl literalRealExpression = new LiteralRealExpressionImpl();
+		return literalRealExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralCharacterExpression createLiteralCharacterExpression() {
+		LiteralCharacterExpressionImpl literalCharacterExpression = new LiteralCharacterExpressionImpl();
+		return literalCharacterExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralStringExpression createLiteralStringExpression() {
+		LiteralStringExpressionImpl literalStringExpression = new LiteralStringExpressionImpl();
+		return literalStringExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralCollectionExpression createLiteralCollectionExpression() {
+		LiteralCollectionExpressionImpl literalCollectionExpression = new LiteralCollectionExpressionImpl();
+		return literalCollectionExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralNullExpression createLiteralNullExpression() {
+		LiteralNullExpressionImpl literalNullExpression = new LiteralNullExpressionImpl();
+		return literalNullExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralReferenceExpression createLiteralReferenceExpression() {
+		LiteralReferenceExpressionImpl literalReferenceExpression = new LiteralReferenceExpressionImpl();
+		return literalReferenceExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralReferenceElement createLiteralReferenceElement() {
+		LiteralReferenceElementImpl literalReferenceElement = new LiteralReferenceElementImpl();
+		return literalReferenceElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralThisExpression createLiteralThisExpression() {
+		LiteralThisExpressionImpl literalThisExpression = new LiteralThisExpressionImpl();
+		return literalThisExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralSelfExpression createLiteralSelfExpression() {
+		LiteralSelfExpressionImpl literalSelfExpression = new LiteralSelfExpressionImpl();
+		return literalSelfExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralParentExpression createLiteralParentExpression() {
+		LiteralParentExpressionImpl literalParentExpression = new LiteralParentExpressionImpl();
+		return literalParentExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralSuperExpression createLiteralSuperExpression() {
+		LiteralSuperExpressionImpl literalSuperExpression = new LiteralSuperExpressionImpl();
+		return literalSuperExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralSystemExpression createLiteralSystemExpression() {
+		LiteralSystemExpressionImpl literalSystemExpression = new LiteralSystemExpressionImpl();
+		return literalSystemExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralEnvExpression createLiteralEnvExpression() {
+		LiteralEnvExpressionImpl literalEnvExpression = new LiteralEnvExpressionImpl();
+		return literalEnvExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralTimeExpression createLiteralTimeExpression() {
+		LiteralTimeExpressionImpl literalTimeExpression = new LiteralTimeExpressionImpl();
+		return literalTimeExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LiteralTimeDeltaExpression createLiteralTimeDeltaExpression() {
+		LiteralTimeDeltaExpressionImpl literalTimeDeltaExpression = new LiteralTimeDeltaExpressionImpl();
+		return literalTimeDeltaExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LeftHandSideExpression createLeftHandSideExpression() {
+		LeftHandSideExpressionImpl leftHandSideExpression = new LeftHandSideExpressionImpl();
+		return leftHandSideExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IncrementOrDecrementExpression createIncrementOrDecrementExpression() {
+		IncrementOrDecrementExpressionImpl incrementOrDecrementExpression = new IncrementOrDecrementExpressionImpl();
+		return incrementOrDecrementExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IncrementOrDecrementPrefixExpression createIncrementOrDecrementPrefixExpression() {
+		IncrementOrDecrementPrefixExpressionImpl incrementOrDecrementPrefixExpression = new IncrementOrDecrementPrefixExpressionImpl();
+		return incrementOrDecrementPrefixExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IncrementOrDecrementPostfixExpression createIncrementOrDecrementPostfixExpression() {
+		IncrementOrDecrementPostfixExpressionImpl incrementOrDecrementPostfixExpression = new IncrementOrDecrementPostfixExpressionImpl();
+		return incrementOrDecrementPostfixExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AssignmentExpression createAssignmentExpression() {
+		AssignmentExpressionImpl assignmentExpression = new AssignmentExpressionImpl();
+		return assignmentExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NewfreshExpression createNewfreshExpression() {
+		NewfreshExpressionImpl newfreshExpression = new NewfreshExpressionImpl();
+		return newfreshExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public UnaryExpression createUnaryExpression() {
+		UnaryExpressionImpl unaryExpression = new UnaryExpressionImpl();
+		return unaryExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BitwiseUnaryExpression createBitwiseUnaryExpression() {
+		BitwiseUnaryExpressionImpl bitwiseUnaryExpression = new BitwiseUnaryExpressionImpl();
+		return bitwiseUnaryExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LogicalUnaryExpression createLogicalUnaryExpression() {
+		LogicalUnaryExpressionImpl logicalUnaryExpression = new LogicalUnaryExpressionImpl();
+		return logicalUnaryExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CastExpression createCastExpression() {
+		CastExpressionImpl castExpression = new CastExpressionImpl();
+		return castExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ArithmeticUnaryExpression createArithmeticUnaryExpression() {
+		ArithmeticUnaryExpressionImpl arithmeticUnaryExpression = new ArithmeticUnaryExpressionImpl();
+		return arithmeticUnaryExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BinaryExpression createBinaryExpression() {
+		BinaryExpressionImpl binaryExpression = new BinaryExpressionImpl();
+		return binaryExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EqualityBinaryExpression createEqualityBinaryExpression() {
+		EqualityBinaryExpressionImpl equalityBinaryExpression = new EqualityBinaryExpressionImpl();
+		return equalityBinaryExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public RelationalBinaryExpression createRelationalBinaryExpression() {
+		RelationalBinaryExpressionImpl relationalBinaryExpression = new RelationalBinaryExpressionImpl();
+		return relationalBinaryExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public RelationalTernaryExpression createRelationalTernaryExpression() {
+		RelationalTernaryExpressionImpl relationalTernaryExpression = new RelationalTernaryExpressionImpl();
+		return relationalTernaryExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConditionalTestExpression createConditionalTestExpression() {
+		ConditionalTestExpressionImpl conditionalTestExpression = new ConditionalTestExpressionImpl();
+		return conditionalTestExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AssociativeExpression createAssociativeExpression() {
+		AssociativeExpressionImpl associativeExpression = new AssociativeExpressionImpl();
+		return associativeExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ArithmeticAssociativeExpression createArithmeticAssociativeExpression() {
+		ArithmeticAssociativeExpressionImpl arithmeticAssociativeExpression = new ArithmeticAssociativeExpressionImpl();
+		return arithmeticAssociativeExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BitwiseAssociativeExpression createBitwiseAssociativeExpression() {
+		BitwiseAssociativeExpressionImpl bitwiseAssociativeExpression = new BitwiseAssociativeExpressionImpl();
+		return bitwiseAssociativeExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LogicalAssociativeExpression createLogicalAssociativeExpression() {
+		LogicalAssociativeExpressionImpl logicalAssociativeExpression = new LogicalAssociativeExpressionImpl();
+		return logicalAssociativeExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InvokeExpression createInvokeExpression() {
+		InvokeExpressionImpl invokeExpression = new InvokeExpressionImpl();
+		return invokeExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedExpression createNamedExpression() {
+		NamedExpressionImpl namedExpression = new NamedExpressionImpl();
+		return namedExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MixTupleExpression createMixTupleExpression() {
+		MixTupleExpressionImpl mixTupleExpression = new MixTupleExpressionImpl();
+		return mixTupleExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedTupleExpression createNamedTupleExpression() {
+		NamedTupleExpressionImpl namedTupleExpression = new NamedTupleExpressionImpl();
+		return namedTupleExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PositionalTupleExpression createPositionalTupleExpression() {
+		PositionalTupleExpressionImpl positionalTupleExpression = new PositionalTupleExpressionImpl();
+		return positionalTupleExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValueElementSpecification createValueElementSpecification() {
+		ValueElementSpecificationImpl valueElementSpecification = new ValueElementSpecificationImpl();
+		return valueElementSpecification;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InstantiationExpression createInstantiationExpression() {
+		InstantiationExpressionImpl instantiationExpression = new InstantiationExpressionImpl();
+		return instantiationExpression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionAsBuffer createExpressionAsBuffer() {
+		ExpressionAsBufferImpl expressionAsBuffer = new ExpressionAsBufferImpl();
+		return expressionAsBuffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionAsChannel createExpressionAsChannel() {
+		ExpressionAsChannelImpl expressionAsChannel = new ExpressionAsChannelImpl();
+		return expressionAsChannel;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionAsMachine createExpressionAsMachine() {
+		ExpressionAsMachineImpl expressionAsMachine = new ExpressionAsMachineImpl();
+		return expressionAsMachine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionAsPort createExpressionAsPort() {
+		ExpressionAsPortImpl expressionAsPort = new ExpressionAsPortImpl();
+		return expressionAsPort;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PRINTER_FIX createPRINTER_FIXFromString(EDataType eDataType, String initialValue) {
+		PRINTER_FIX result = PRINTER_FIX.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertPRINTER_FIXToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValueElementSpecificationKind createValueElementSpecificationKindFromString(EDataType eDataType, String initialValue) {
+		ValueElementSpecificationKind result = ValueElementSpecificationKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertValueElementSpecificationKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValueElementSpecificationScheme createValueElementSpecificationSchemeFromString(EDataType eDataType, String initialValue) {
+		ValueElementSpecificationScheme result = ValueElementSpecificationScheme.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertValueElementSpecificationSchemeToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionPackage getExpressionPackage() {
+		return (ExpressionPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static ExpressionPackage getPackage() {
+		return ExpressionPackage.eINSTANCE;
+	}
+
+} //ExpressionFactoryImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionImpl.java
new file mode 100644
index 0000000..1dc48ab
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionImpl.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.common.impl.AbstractElementImpl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public abstract class ExpressionImpl extends AbstractElementImpl implements Expression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.EXPRESSION;
+	}
+
+} //ExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionPackageImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionPackageImpl.java
new file mode 100644
index 0000000..8c11eda
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ExpressionPackageImpl.java
@@ -0,0 +1,2174 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.AssignmentExpression;
+import org.eclipse.efm.ecore.formalml.expression.AssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.BinaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.BitwiseAssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.BitwiseUnaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.CastExpression;
+import org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression;
+import org.eclipse.efm.ecore.formalml.expression.EqualityBinaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionFactory;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression;
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPostfixExpression;
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPrefixExpression;
+import org.eclipse.efm.ecore.formalml.expression.InstantiationExpression;
+import org.eclipse.efm.ecore.formalml.expression.InvokeExpression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement;
+import org.eclipse.efm.ecore.formalml.expression.LiteralReferenceExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralTimeDeltaExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralTimeExpression;
+import org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.MixTupleExpression;
+import org.eclipse.efm.ecore.formalml.expression.NamedExpression;
+import org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression;
+import org.eclipse.efm.ecore.formalml.expression.NewfreshExpression;
+import org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression;
+import org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression;
+import org.eclipse.efm.ecore.formalml.expression.UnaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme;
+import org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter;
+import org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression;
+
+import org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ExpressionPackageImpl extends EPackageImpl implements ExpressionPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass valueExpressionPrettyPrinterEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass valuePrintableExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass expressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalBooleanExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalIntegerExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalRationalExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalFloatExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalRealExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalCharacterExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalStringExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalCollectionExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalNullExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalReferenceExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalReferenceElementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalThisExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalSelfExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalParentExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalSuperExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalSystemExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalEnvExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalTimeExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass literalTimeDeltaExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass leftHandSideExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass incrementOrDecrementExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass incrementOrDecrementPrefixExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass incrementOrDecrementPostfixExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass assignmentExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass newfreshExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass unaryExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass bitwiseUnaryExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass logicalUnaryExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass castExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass arithmeticUnaryExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass binaryExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass equalityBinaryExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass relationalBinaryExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass relationalTernaryExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass conditionalTestExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass associativeExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass arithmeticAssociativeExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass bitwiseAssociativeExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass logicalAssociativeExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass invokeExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass namedExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass tupleExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass mixTupleExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass namedTupleExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass positionalTupleExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass valueElementSpecificationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass instantiationExpressionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass expressionAsBufferEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass expressionAsChannelEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass expressionAsMachineEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass expressionAsPortEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum printeR_FIXEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum valueElementSpecificationKindEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum valueElementSpecificationSchemeEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private ExpressionPackageImpl() {
+		super(eNS_URI, ExpressionFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link ExpressionPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static ExpressionPackage init() {
+		if (isInited) return (ExpressionPackage)EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI);
+
+		// Obtain or create and register package
+		ExpressionPackageImpl theExpressionPackage = (ExpressionPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ExpressionPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new ExpressionPackageImpl());
+
+		isInited = true;
+
+		// Obtain or create and register interdependencies
+		FormalmlPackageImpl theFormalmlPackage = (FormalmlPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) instanceof FormalmlPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) : FormalmlPackage.eINSTANCE);
+		CommonPackageImpl theCommonPackage = (CommonPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) instanceof CommonPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) : CommonPackage.eINSTANCE);
+		InfrastructurePackageImpl theInfrastructurePackage = (InfrastructurePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) instanceof InfrastructurePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) : InfrastructurePackage.eINSTANCE);
+		DatatypePackageImpl theDatatypePackage = (DatatypePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) instanceof DatatypePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) : DatatypePackage.eINSTANCE);
+		StatementPackageImpl theStatementPackage = (StatementPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) instanceof StatementPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) : StatementPackage.eINSTANCE);
+		StatemachinePackageImpl theStatemachinePackage = (StatemachinePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) instanceof StatemachinePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) : StatemachinePackage.eINSTANCE);
+
+		// Create package meta-data objects
+		theExpressionPackage.createPackageContents();
+		theFormalmlPackage.createPackageContents();
+		theCommonPackage.createPackageContents();
+		theInfrastructurePackage.createPackageContents();
+		theDatatypePackage.createPackageContents();
+		theStatementPackage.createPackageContents();
+		theStatemachinePackage.createPackageContents();
+
+		// Initialize created meta-data
+		theExpressionPackage.initializePackageContents();
+		theFormalmlPackage.initializePackageContents();
+		theCommonPackage.initializePackageContents();
+		theInfrastructurePackage.initializePackageContents();
+		theDatatypePackage.initializePackageContents();
+		theStatementPackage.initializePackageContents();
+		theStatemachinePackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theExpressionPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(ExpressionPackage.eNS_URI, theExpressionPackage);
+		return theExpressionPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getValueExpressionPrettyPrinter() {
+		return valueExpressionPrettyPrinterEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getValueExpressionPrettyPrinter_Symbol() {
+		return (EAttribute)valueExpressionPrettyPrinterEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getValueExpressionPrettyPrinter_Fix() {
+		return (EAttribute)valueExpressionPrettyPrinterEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getValueExpressionPrettyPrinter_Specific() {
+		return (EAttribute)valueExpressionPrettyPrinterEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getValuePrintableExpression() {
+		return valuePrintableExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getValuePrintableExpression_Symbol() {
+		return (EAttribute)valuePrintableExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getValuePrintableExpression_Printer() {
+		return (EReference)valuePrintableExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getValuePrintableExpression_Operand() {
+		return (EReference)valuePrintableExpressionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getExpression() {
+		return expressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralExpression() {
+		return literalExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralBooleanExpression() {
+		return literalBooleanExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralBooleanExpression_Value() {
+		return (EAttribute)literalBooleanExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralIntegerExpression() {
+		return literalIntegerExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralIntegerExpression_Value() {
+		return (EAttribute)literalIntegerExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralRationalExpression() {
+		return literalRationalExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralRationalExpression_Numerator() {
+		return (EAttribute)literalRationalExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralRationalExpression_Denominator() {
+		return (EAttribute)literalRationalExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralFloatExpression() {
+		return literalFloatExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralFloatExpression_Value() {
+		return (EAttribute)literalFloatExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralRealExpression() {
+		return literalRealExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralRealExpression_Value() {
+		return (EAttribute)literalRealExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralCharacterExpression() {
+		return literalCharacterExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralCharacterExpression_Value() {
+		return (EAttribute)literalCharacterExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralStringExpression() {
+		return literalStringExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralStringExpression_Value() {
+		return (EAttribute)literalStringExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralCollectionExpression() {
+		return literalCollectionExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getLiteralCollectionExpression_Datatype() {
+		return (EReference)literalCollectionExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getLiteralCollectionExpression_Value() {
+		return (EReference)literalCollectionExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralNullExpression() {
+		return literalNullExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getLiteralNullExpression_Type() {
+		return (EReference)literalNullExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralReferenceExpression() {
+		return literalReferenceExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralReferenceElement() {
+		return literalReferenceElementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getLiteralReferenceElement_Kind() {
+		return (EAttribute)literalReferenceElementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getLiteralReferenceElement_Value() {
+		return (EReference)literalReferenceElementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getLiteralReferenceElement_Arg() {
+		return (EReference)literalReferenceElementEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralThisExpression() {
+		return literalThisExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralSelfExpression() {
+		return literalSelfExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralParentExpression() {
+		return literalParentExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralSuperExpression() {
+		return literalSuperExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralSystemExpression() {
+		return literalSystemExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralEnvExpression() {
+		return literalEnvExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralTimeExpression() {
+		return literalTimeExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLiteralTimeDeltaExpression() {
+		return literalTimeDeltaExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLeftHandSideExpression() {
+		return leftHandSideExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getLeftHandSideExpression_Lvalue() {
+		return (EReference)leftHandSideExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getIncrementOrDecrementExpression() {
+		return incrementOrDecrementExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getIncrementOrDecrementExpression_Operator() {
+		return (EAttribute)incrementOrDecrementExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getIncrementOrDecrementExpression_LeftHandSide() {
+		return (EReference)incrementOrDecrementExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getIncrementOrDecrementPrefixExpression() {
+		return incrementOrDecrementPrefixExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getIncrementOrDecrementPostfixExpression() {
+		return incrementOrDecrementPostfixExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getAssignmentExpression() {
+		return assignmentExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getAssignmentExpression_Operator() {
+		return (EAttribute)assignmentExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAssignmentExpression_LeftHandSide() {
+		return (EReference)assignmentExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAssignmentExpression_RigthHandSide() {
+		return (EReference)assignmentExpressionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getNewfreshExpression() {
+		return newfreshExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getNewfreshExpression_LeftHandSide() {
+		return (EReference)newfreshExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getUnaryExpression() {
+		return unaryExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getUnaryExpression_Operator() {
+		return (EAttribute)unaryExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getUnaryExpression_Operand() {
+		return (EReference)unaryExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBitwiseUnaryExpression() {
+		return bitwiseUnaryExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLogicalUnaryExpression() {
+		return logicalUnaryExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getCastExpression() {
+		return castExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getCastExpression_Datatype() {
+		return (EReference)castExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getArithmeticUnaryExpression() {
+		return arithmeticUnaryExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBinaryExpression() {
+		return binaryExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getBinaryExpression_Operator() {
+		return (EAttribute)binaryExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBinaryExpression_LeftOperand() {
+		return (EReference)binaryExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBinaryExpression_RigthOperand() {
+		return (EReference)binaryExpressionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getEqualityBinaryExpression() {
+		return equalityBinaryExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getRelationalBinaryExpression() {
+		return relationalBinaryExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getRelationalTernaryExpression() {
+		return relationalTernaryExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRelationalTernaryExpression_LeftRelation() {
+		return (EReference)relationalTernaryExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getRelationalTernaryExpression_RigthOperator() {
+		return (EAttribute)relationalTernaryExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRelationalTernaryExpression_RigthOperand() {
+		return (EReference)relationalTernaryExpressionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getConditionalTestExpression() {
+		return conditionalTestExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getConditionalTestExpression_Operator() {
+		return (EAttribute)conditionalTestExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getConditionalTestExpression_Condition() {
+		return (EReference)conditionalTestExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getConditionalTestExpression_ThenOperand() {
+		return (EReference)conditionalTestExpressionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getConditionalTestExpression_ElseOperand() {
+		return (EReference)conditionalTestExpressionEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getAssociativeExpression() {
+		return associativeExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getAssociativeExpression_Operator() {
+		return (EAttribute)associativeExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAssociativeExpression_Operand() {
+		return (EReference)associativeExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getArithmeticAssociativeExpression() {
+		return arithmeticAssociativeExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBitwiseAssociativeExpression() {
+		return bitwiseAssociativeExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getLogicalAssociativeExpression() {
+		return logicalAssociativeExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getInvokeExpression() {
+		return invokeExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getInvokeExpression_CallProcedure() {
+		return (EAttribute)invokeExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInvokeExpression_Invoke() {
+		return (EReference)invokeExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInvokeExpression_Args() {
+		return (EReference)invokeExpressionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInvokeExpression_Rets() {
+		return (EReference)invokeExpressionEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getNamedExpression() {
+		return namedExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getNamedExpression_Target() {
+		return (EReference)namedExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getNamedExpression_Name() {
+		return (EAttribute)namedExpressionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getNamedExpression_Expression() {
+		return (EReference)namedExpressionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getTupleExpression() {
+		return tupleExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getMixTupleExpression() {
+		return mixTupleExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMixTupleExpression_Value() {
+		return (EReference)mixTupleExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getNamedTupleExpression() {
+		return namedTupleExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getNamedTupleExpression_Value() {
+		return (EReference)namedTupleExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPositionalTupleExpression() {
+		return positionalTupleExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPositionalTupleExpression_Value() {
+		return (EReference)positionalTupleExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getValueElementSpecification() {
+		return valueElementSpecificationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getValueElementSpecification_Kind() {
+		return (EAttribute)valueElementSpecificationEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getValueElementSpecification_Expected() {
+		return (EAttribute)valueElementSpecificationEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getValueElementSpecification_Target() {
+		return (EReference)valueElementSpecificationEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getValueElementSpecification_Element() {
+		return (EReference)valueElementSpecificationEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getValueElementSpecification_Arg() {
+		return (EReference)valueElementSpecificationEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getInstantiationExpression() {
+		return instantiationExpressionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInstantiationExpression_Instance() {
+		return (EReference)instantiationExpressionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getExpressionAsBuffer() {
+		return expressionAsBufferEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExpressionAsBuffer_Buffer() {
+		return (EReference)expressionAsBufferEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getExpressionAsChannel() {
+		return expressionAsChannelEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExpressionAsChannel_Channel() {
+		return (EReference)expressionAsChannelEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getExpressionAsMachine() {
+		return expressionAsMachineEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExpressionAsMachine_Machine() {
+		return (EReference)expressionAsMachineEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getExpressionAsPort() {
+		return expressionAsPortEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExpressionAsPort_Port() {
+		return (EReference)expressionAsPortEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getPRINTER_FIX() {
+		return printeR_FIXEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getValueElementSpecificationKind() {
+		return valueElementSpecificationKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getValueElementSpecificationScheme() {
+		return valueElementSpecificationSchemeEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionFactory getExpressionFactory() {
+		return (ExpressionFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		valueExpressionPrettyPrinterEClass = createEClass(VALUE_EXPRESSION_PRETTY_PRINTER);
+		createEAttribute(valueExpressionPrettyPrinterEClass, VALUE_EXPRESSION_PRETTY_PRINTER__SYMBOL);
+		createEAttribute(valueExpressionPrettyPrinterEClass, VALUE_EXPRESSION_PRETTY_PRINTER__FIX);
+		createEAttribute(valueExpressionPrettyPrinterEClass, VALUE_EXPRESSION_PRETTY_PRINTER__SPECIFIC);
+
+		valuePrintableExpressionEClass = createEClass(VALUE_PRINTABLE_EXPRESSION);
+		createEAttribute(valuePrintableExpressionEClass, VALUE_PRINTABLE_EXPRESSION__SYMBOL);
+		createEReference(valuePrintableExpressionEClass, VALUE_PRINTABLE_EXPRESSION__PRINTER);
+		createEReference(valuePrintableExpressionEClass, VALUE_PRINTABLE_EXPRESSION__OPERAND);
+
+		expressionEClass = createEClass(EXPRESSION);
+
+		literalExpressionEClass = createEClass(LITERAL_EXPRESSION);
+
+		literalBooleanExpressionEClass = createEClass(LITERAL_BOOLEAN_EXPRESSION);
+		createEAttribute(literalBooleanExpressionEClass, LITERAL_BOOLEAN_EXPRESSION__VALUE);
+
+		literalIntegerExpressionEClass = createEClass(LITERAL_INTEGER_EXPRESSION);
+		createEAttribute(literalIntegerExpressionEClass, LITERAL_INTEGER_EXPRESSION__VALUE);
+
+		literalRationalExpressionEClass = createEClass(LITERAL_RATIONAL_EXPRESSION);
+		createEAttribute(literalRationalExpressionEClass, LITERAL_RATIONAL_EXPRESSION__NUMERATOR);
+		createEAttribute(literalRationalExpressionEClass, LITERAL_RATIONAL_EXPRESSION__DENOMINATOR);
+
+		literalFloatExpressionEClass = createEClass(LITERAL_FLOAT_EXPRESSION);
+		createEAttribute(literalFloatExpressionEClass, LITERAL_FLOAT_EXPRESSION__VALUE);
+
+		literalRealExpressionEClass = createEClass(LITERAL_REAL_EXPRESSION);
+		createEAttribute(literalRealExpressionEClass, LITERAL_REAL_EXPRESSION__VALUE);
+
+		literalCharacterExpressionEClass = createEClass(LITERAL_CHARACTER_EXPRESSION);
+		createEAttribute(literalCharacterExpressionEClass, LITERAL_CHARACTER_EXPRESSION__VALUE);
+
+		literalStringExpressionEClass = createEClass(LITERAL_STRING_EXPRESSION);
+		createEAttribute(literalStringExpressionEClass, LITERAL_STRING_EXPRESSION__VALUE);
+
+		literalCollectionExpressionEClass = createEClass(LITERAL_COLLECTION_EXPRESSION);
+		createEReference(literalCollectionExpressionEClass, LITERAL_COLLECTION_EXPRESSION__DATATYPE);
+		createEReference(literalCollectionExpressionEClass, LITERAL_COLLECTION_EXPRESSION__VALUE);
+
+		literalNullExpressionEClass = createEClass(LITERAL_NULL_EXPRESSION);
+		createEReference(literalNullExpressionEClass, LITERAL_NULL_EXPRESSION__TYPE);
+
+		literalReferenceExpressionEClass = createEClass(LITERAL_REFERENCE_EXPRESSION);
+
+		literalReferenceElementEClass = createEClass(LITERAL_REFERENCE_ELEMENT);
+		createEAttribute(literalReferenceElementEClass, LITERAL_REFERENCE_ELEMENT__KIND);
+		createEReference(literalReferenceElementEClass, LITERAL_REFERENCE_ELEMENT__VALUE);
+		createEReference(literalReferenceElementEClass, LITERAL_REFERENCE_ELEMENT__ARG);
+
+		literalThisExpressionEClass = createEClass(LITERAL_THIS_EXPRESSION);
+
+		literalSelfExpressionEClass = createEClass(LITERAL_SELF_EXPRESSION);
+
+		literalParentExpressionEClass = createEClass(LITERAL_PARENT_EXPRESSION);
+
+		literalSuperExpressionEClass = createEClass(LITERAL_SUPER_EXPRESSION);
+
+		literalSystemExpressionEClass = createEClass(LITERAL_SYSTEM_EXPRESSION);
+
+		literalEnvExpressionEClass = createEClass(LITERAL_ENV_EXPRESSION);
+
+		literalTimeExpressionEClass = createEClass(LITERAL_TIME_EXPRESSION);
+
+		literalTimeDeltaExpressionEClass = createEClass(LITERAL_TIME_DELTA_EXPRESSION);
+
+		leftHandSideExpressionEClass = createEClass(LEFT_HAND_SIDE_EXPRESSION);
+		createEReference(leftHandSideExpressionEClass, LEFT_HAND_SIDE_EXPRESSION__LVALUE);
+
+		incrementOrDecrementExpressionEClass = createEClass(INCREMENT_OR_DECREMENT_EXPRESSION);
+		createEAttribute(incrementOrDecrementExpressionEClass, INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR);
+		createEReference(incrementOrDecrementExpressionEClass, INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE);
+
+		incrementOrDecrementPrefixExpressionEClass = createEClass(INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION);
+
+		incrementOrDecrementPostfixExpressionEClass = createEClass(INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION);
+
+		assignmentExpressionEClass = createEClass(ASSIGNMENT_EXPRESSION);
+		createEAttribute(assignmentExpressionEClass, ASSIGNMENT_EXPRESSION__OPERATOR);
+		createEReference(assignmentExpressionEClass, ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE);
+		createEReference(assignmentExpressionEClass, ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE);
+
+		newfreshExpressionEClass = createEClass(NEWFRESH_EXPRESSION);
+		createEReference(newfreshExpressionEClass, NEWFRESH_EXPRESSION__LEFT_HAND_SIDE);
+
+		unaryExpressionEClass = createEClass(UNARY_EXPRESSION);
+		createEAttribute(unaryExpressionEClass, UNARY_EXPRESSION__OPERATOR);
+		createEReference(unaryExpressionEClass, UNARY_EXPRESSION__OPERAND);
+
+		bitwiseUnaryExpressionEClass = createEClass(BITWISE_UNARY_EXPRESSION);
+
+		logicalUnaryExpressionEClass = createEClass(LOGICAL_UNARY_EXPRESSION);
+
+		castExpressionEClass = createEClass(CAST_EXPRESSION);
+		createEReference(castExpressionEClass, CAST_EXPRESSION__DATATYPE);
+
+		arithmeticUnaryExpressionEClass = createEClass(ARITHMETIC_UNARY_EXPRESSION);
+
+		binaryExpressionEClass = createEClass(BINARY_EXPRESSION);
+		createEAttribute(binaryExpressionEClass, BINARY_EXPRESSION__OPERATOR);
+		createEReference(binaryExpressionEClass, BINARY_EXPRESSION__LEFT_OPERAND);
+		createEReference(binaryExpressionEClass, BINARY_EXPRESSION__RIGTH_OPERAND);
+
+		equalityBinaryExpressionEClass = createEClass(EQUALITY_BINARY_EXPRESSION);
+
+		relationalBinaryExpressionEClass = createEClass(RELATIONAL_BINARY_EXPRESSION);
+
+		relationalTernaryExpressionEClass = createEClass(RELATIONAL_TERNARY_EXPRESSION);
+		createEReference(relationalTernaryExpressionEClass, RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION);
+		createEAttribute(relationalTernaryExpressionEClass, RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR);
+		createEReference(relationalTernaryExpressionEClass, RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND);
+
+		conditionalTestExpressionEClass = createEClass(CONDITIONAL_TEST_EXPRESSION);
+		createEAttribute(conditionalTestExpressionEClass, CONDITIONAL_TEST_EXPRESSION__OPERATOR);
+		createEReference(conditionalTestExpressionEClass, CONDITIONAL_TEST_EXPRESSION__CONDITION);
+		createEReference(conditionalTestExpressionEClass, CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND);
+		createEReference(conditionalTestExpressionEClass, CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND);
+
+		associativeExpressionEClass = createEClass(ASSOCIATIVE_EXPRESSION);
+		createEAttribute(associativeExpressionEClass, ASSOCIATIVE_EXPRESSION__OPERATOR);
+		createEReference(associativeExpressionEClass, ASSOCIATIVE_EXPRESSION__OPERAND);
+
+		arithmeticAssociativeExpressionEClass = createEClass(ARITHMETIC_ASSOCIATIVE_EXPRESSION);
+
+		bitwiseAssociativeExpressionEClass = createEClass(BITWISE_ASSOCIATIVE_EXPRESSION);
+
+		logicalAssociativeExpressionEClass = createEClass(LOGICAL_ASSOCIATIVE_EXPRESSION);
+
+		invokeExpressionEClass = createEClass(INVOKE_EXPRESSION);
+		createEAttribute(invokeExpressionEClass, INVOKE_EXPRESSION__CALL_PROCEDURE);
+		createEReference(invokeExpressionEClass, INVOKE_EXPRESSION__INVOKE);
+		createEReference(invokeExpressionEClass, INVOKE_EXPRESSION__ARGS);
+		createEReference(invokeExpressionEClass, INVOKE_EXPRESSION__RETS);
+
+		namedExpressionEClass = createEClass(NAMED_EXPRESSION);
+		createEReference(namedExpressionEClass, NAMED_EXPRESSION__TARGET);
+		createEAttribute(namedExpressionEClass, NAMED_EXPRESSION__NAME);
+		createEReference(namedExpressionEClass, NAMED_EXPRESSION__EXPRESSION);
+
+		tupleExpressionEClass = createEClass(TUPLE_EXPRESSION);
+
+		mixTupleExpressionEClass = createEClass(MIX_TUPLE_EXPRESSION);
+		createEReference(mixTupleExpressionEClass, MIX_TUPLE_EXPRESSION__VALUE);
+
+		namedTupleExpressionEClass = createEClass(NAMED_TUPLE_EXPRESSION);
+		createEReference(namedTupleExpressionEClass, NAMED_TUPLE_EXPRESSION__VALUE);
+
+		positionalTupleExpressionEClass = createEClass(POSITIONAL_TUPLE_EXPRESSION);
+		createEReference(positionalTupleExpressionEClass, POSITIONAL_TUPLE_EXPRESSION__VALUE);
+
+		valueElementSpecificationEClass = createEClass(VALUE_ELEMENT_SPECIFICATION);
+		createEAttribute(valueElementSpecificationEClass, VALUE_ELEMENT_SPECIFICATION__KIND);
+		createEAttribute(valueElementSpecificationEClass, VALUE_ELEMENT_SPECIFICATION__EXPECTED);
+		createEReference(valueElementSpecificationEClass, VALUE_ELEMENT_SPECIFICATION__TARGET);
+		createEReference(valueElementSpecificationEClass, VALUE_ELEMENT_SPECIFICATION__ELEMENT);
+		createEReference(valueElementSpecificationEClass, VALUE_ELEMENT_SPECIFICATION__ARG);
+
+		instantiationExpressionEClass = createEClass(INSTANTIATION_EXPRESSION);
+		createEReference(instantiationExpressionEClass, INSTANTIATION_EXPRESSION__INSTANCE);
+
+		expressionAsBufferEClass = createEClass(EXPRESSION_AS_BUFFER);
+		createEReference(expressionAsBufferEClass, EXPRESSION_AS_BUFFER__BUFFER);
+
+		expressionAsChannelEClass = createEClass(EXPRESSION_AS_CHANNEL);
+		createEReference(expressionAsChannelEClass, EXPRESSION_AS_CHANNEL__CHANNEL);
+
+		expressionAsMachineEClass = createEClass(EXPRESSION_AS_MACHINE);
+		createEReference(expressionAsMachineEClass, EXPRESSION_AS_MACHINE__MACHINE);
+
+		expressionAsPortEClass = createEClass(EXPRESSION_AS_PORT);
+		createEReference(expressionAsPortEClass, EXPRESSION_AS_PORT__PORT);
+
+		// Create enums
+		printeR_FIXEEnum = createEEnum(PRINTER_FIX);
+		valueElementSpecificationKindEEnum = createEEnum(VALUE_ELEMENT_SPECIFICATION_KIND);
+		valueElementSpecificationSchemeEEnum = createEEnum(VALUE_ELEMENT_SPECIFICATION_SCHEME);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		CommonPackage theCommonPackage = (CommonPackage)EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI);
+		DatatypePackage theDatatypePackage = (DatatypePackage)EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI);
+		InfrastructurePackage theInfrastructurePackage = (InfrastructurePackage)EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		valuePrintableExpressionEClass.getESuperTypes().add(this.getExpression());
+		expressionEClass.getESuperTypes().add(theCommonPackage.getAbstractElement());
+		literalExpressionEClass.getESuperTypes().add(this.getExpression());
+		literalBooleanExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalIntegerExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalRationalExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalFloatExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalRealExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalCharacterExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalStringExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalCollectionExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalNullExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalReferenceExpressionEClass.getESuperTypes().add(this.getLiteralExpression());
+		literalReferenceElementEClass.getESuperTypes().add(this.getLiteralReferenceExpression());
+		literalThisExpressionEClass.getESuperTypes().add(this.getLiteralReferenceExpression());
+		literalSelfExpressionEClass.getESuperTypes().add(this.getLiteralReferenceExpression());
+		literalParentExpressionEClass.getESuperTypes().add(this.getLiteralReferenceExpression());
+		literalSuperExpressionEClass.getESuperTypes().add(this.getLiteralReferenceExpression());
+		literalSystemExpressionEClass.getESuperTypes().add(this.getLiteralReferenceExpression());
+		literalEnvExpressionEClass.getESuperTypes().add(this.getLiteralReferenceExpression());
+		literalTimeExpressionEClass.getESuperTypes().add(this.getLiteralReferenceExpression());
+		literalTimeDeltaExpressionEClass.getESuperTypes().add(this.getLiteralReferenceExpression());
+		leftHandSideExpressionEClass.getESuperTypes().add(this.getExpression());
+		incrementOrDecrementExpressionEClass.getESuperTypes().add(this.getExpression());
+		incrementOrDecrementPrefixExpressionEClass.getESuperTypes().add(this.getIncrementOrDecrementExpression());
+		incrementOrDecrementPostfixExpressionEClass.getESuperTypes().add(this.getIncrementOrDecrementExpression());
+		assignmentExpressionEClass.getESuperTypes().add(this.getExpression());
+		newfreshExpressionEClass.getESuperTypes().add(this.getExpression());
+		unaryExpressionEClass.getESuperTypes().add(this.getExpression());
+		bitwiseUnaryExpressionEClass.getESuperTypes().add(this.getUnaryExpression());
+		logicalUnaryExpressionEClass.getESuperTypes().add(this.getUnaryExpression());
+		castExpressionEClass.getESuperTypes().add(this.getUnaryExpression());
+		arithmeticUnaryExpressionEClass.getESuperTypes().add(this.getUnaryExpression());
+		binaryExpressionEClass.getESuperTypes().add(this.getExpression());
+		equalityBinaryExpressionEClass.getESuperTypes().add(this.getBinaryExpression());
+		relationalBinaryExpressionEClass.getESuperTypes().add(this.getBinaryExpression());
+		relationalTernaryExpressionEClass.getESuperTypes().add(this.getExpression());
+		conditionalTestExpressionEClass.getESuperTypes().add(this.getExpression());
+		associativeExpressionEClass.getESuperTypes().add(this.getExpression());
+		arithmeticAssociativeExpressionEClass.getESuperTypes().add(this.getAssociativeExpression());
+		bitwiseAssociativeExpressionEClass.getESuperTypes().add(this.getAssociativeExpression());
+		logicalAssociativeExpressionEClass.getESuperTypes().add(this.getAssociativeExpression());
+		invokeExpressionEClass.getESuperTypes().add(this.getExpression());
+		namedExpressionEClass.getESuperTypes().add(this.getExpression());
+		tupleExpressionEClass.getESuperTypes().add(this.getExpression());
+		mixTupleExpressionEClass.getESuperTypes().add(this.getTupleExpression());
+		namedTupleExpressionEClass.getESuperTypes().add(this.getTupleExpression());
+		positionalTupleExpressionEClass.getESuperTypes().add(this.getTupleExpression());
+		valueElementSpecificationEClass.getESuperTypes().add(this.getExpression());
+		instantiationExpressionEClass.getESuperTypes().add(this.getExpression());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(valueExpressionPrettyPrinterEClass, ValueExpressionPrettyPrinter.class, "ValueExpressionPrettyPrinter", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getValueExpressionPrettyPrinter_Symbol(), ecorePackage.getEString(), "symbol", null, 1, 1, ValueExpressionPrettyPrinter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getValueExpressionPrettyPrinter_Fix(), this.getPRINTER_FIX(), "fix", null, 1, 1, ValueExpressionPrettyPrinter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getValueExpressionPrettyPrinter_Specific(), ecorePackage.getEString(), "specific", null, 0, -1, ValueExpressionPrettyPrinter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(valuePrintableExpressionEClass, ValuePrintableExpression.class, "ValuePrintableExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getValuePrintableExpression_Symbol(), ecorePackage.getEString(), "symbol", null, 1, 1, ValuePrintableExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getValuePrintableExpression_Printer(), this.getValueExpressionPrettyPrinter(), null, "printer", null, 0, 1, ValuePrintableExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getValuePrintableExpression_Operand(), this.getExpression(), null, "operand", null, 0, -1, ValuePrintableExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(expressionEClass, Expression.class, "Expression", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalExpressionEClass, LiteralExpression.class, "LiteralExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalBooleanExpressionEClass, LiteralBooleanExpression.class, "LiteralBooleanExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralBooleanExpression_Value(), ecorePackage.getEBoolean(), "value", null, 0, 1, LiteralBooleanExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalIntegerExpressionEClass, LiteralIntegerExpression.class, "LiteralIntegerExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralIntegerExpression_Value(), ecorePackage.getELong(), "value", "0", 0, 1, LiteralIntegerExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalRationalExpressionEClass, LiteralRationalExpression.class, "LiteralRationalExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralRationalExpression_Numerator(), ecorePackage.getELong(), "numerator", "0", 1, 1, LiteralRationalExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getLiteralRationalExpression_Denominator(), ecorePackage.getELong(), "denominator", "1", 1, 1, LiteralRationalExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalFloatExpressionEClass, LiteralFloatExpression.class, "LiteralFloatExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralFloatExpression_Value(), ecorePackage.getEDouble(), "value", null, 0, 1, LiteralFloatExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalRealExpressionEClass, LiteralRealExpression.class, "LiteralRealExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralRealExpression_Value(), ecorePackage.getEDouble(), "value", null, 0, 1, LiteralRealExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalCharacterExpressionEClass, LiteralCharacterExpression.class, "LiteralCharacterExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralCharacterExpression_Value(), ecorePackage.getEChar(), "value", "\'\\0\'", 0, 1, LiteralCharacterExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalStringExpressionEClass, LiteralStringExpression.class, "LiteralStringExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralStringExpression_Value(), ecorePackage.getEString(), "value", null, 1, 1, LiteralStringExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalCollectionExpressionEClass, LiteralCollectionExpression.class, "LiteralCollectionExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getLiteralCollectionExpression_Datatype(), theDatatypePackage.getDataType(), null, "datatype", null, 0, 1, LiteralCollectionExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getLiteralCollectionExpression_Value(), this.getExpression(), null, "value", null, 0, -1, LiteralCollectionExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalNullExpressionEClass, LiteralNullExpression.class, "LiteralNullExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getLiteralNullExpression_Type(), theCommonPackage.getType(), null, "type", null, 0, 1, LiteralNullExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalReferenceExpressionEClass, LiteralReferenceExpression.class, "LiteralReferenceExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalReferenceElementEClass, LiteralReferenceElement.class, "LiteralReferenceElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getLiteralReferenceElement_Kind(), this.getValueElementSpecificationKind(), "kind", "field", 1, 1, LiteralReferenceElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getLiteralReferenceElement_Value(), theCommonPackage.getNamedElement(), null, "value", null, 0, 1, LiteralReferenceElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getLiteralReferenceElement_Arg(), this.getExpression(), null, "arg", null, 0, 1, LiteralReferenceElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(literalThisExpressionEClass, LiteralThisExpression.class, "LiteralThisExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalSelfExpressionEClass, LiteralSelfExpression.class, "LiteralSelfExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalParentExpressionEClass, LiteralParentExpression.class, "LiteralParentExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalSuperExpressionEClass, LiteralSuperExpression.class, "LiteralSuperExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalSystemExpressionEClass, LiteralSystemExpression.class, "LiteralSystemExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalEnvExpressionEClass, LiteralEnvExpression.class, "LiteralEnvExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalTimeExpressionEClass, LiteralTimeExpression.class, "LiteralTimeExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(literalTimeDeltaExpressionEClass, LiteralTimeDeltaExpression.class, "LiteralTimeDeltaExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(leftHandSideExpressionEClass, LeftHandSideExpression.class, "LeftHandSideExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getLeftHandSideExpression_Lvalue(), this.getExpression(), null, "lvalue", null, 0, 1, LeftHandSideExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(incrementOrDecrementExpressionEClass, IncrementOrDecrementExpression.class, "IncrementOrDecrementExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getIncrementOrDecrementExpression_Operator(), ecorePackage.getEString(), "operator", null, 1, 1, IncrementOrDecrementExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getIncrementOrDecrementExpression_LeftHandSide(), this.getLeftHandSideExpression(), null, "leftHandSide", null, 1, 1, IncrementOrDecrementExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(incrementOrDecrementPrefixExpressionEClass, IncrementOrDecrementPrefixExpression.class, "IncrementOrDecrementPrefixExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(incrementOrDecrementPostfixExpressionEClass, IncrementOrDecrementPostfixExpression.class, "IncrementOrDecrementPostfixExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(assignmentExpressionEClass, AssignmentExpression.class, "AssignmentExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getAssignmentExpression_Operator(), ecorePackage.getEString(), "operator", null, 1, 1, AssignmentExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getAssignmentExpression_LeftHandSide(), this.getLeftHandSideExpression(), null, "leftHandSide", null, 1, 1, AssignmentExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getAssignmentExpression_RigthHandSide(), this.getExpression(), null, "rigthHandSide", null, 1, 1, AssignmentExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(newfreshExpressionEClass, NewfreshExpression.class, "NewfreshExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getNewfreshExpression_LeftHandSide(), this.getLeftHandSideExpression(), null, "leftHandSide", null, 1, 1, NewfreshExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(unaryExpressionEClass, UnaryExpression.class, "UnaryExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getUnaryExpression_Operator(), ecorePackage.getEString(), "operator", null, 1, 1, UnaryExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getUnaryExpression_Operand(), this.getExpression(), null, "operand", null, 1, 1, UnaryExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(bitwiseUnaryExpressionEClass, BitwiseUnaryExpression.class, "BitwiseUnaryExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(logicalUnaryExpressionEClass, LogicalUnaryExpression.class, "LogicalUnaryExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(castExpressionEClass, CastExpression.class, "CastExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getCastExpression_Datatype(), theDatatypePackage.getDataType(), null, "datatype", null, 0, 1, CastExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(arithmeticUnaryExpressionEClass, ArithmeticUnaryExpression.class, "ArithmeticUnaryExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(binaryExpressionEClass, BinaryExpression.class, "BinaryExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getBinaryExpression_Operator(), ecorePackage.getEString(), "operator", null, 1, 1, BinaryExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getBinaryExpression_LeftOperand(), this.getExpression(), null, "leftOperand", null, 1, 1, BinaryExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getBinaryExpression_RigthOperand(), this.getExpression(), null, "rigthOperand", null, 1, 1, BinaryExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(equalityBinaryExpressionEClass, EqualityBinaryExpression.class, "EqualityBinaryExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(relationalBinaryExpressionEClass, RelationalBinaryExpression.class, "RelationalBinaryExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(relationalTernaryExpressionEClass, RelationalTernaryExpression.class, "RelationalTernaryExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getRelationalTernaryExpression_LeftRelation(), this.getRelationalBinaryExpression(), null, "leftRelation", null, 1, 1, RelationalTernaryExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getRelationalTernaryExpression_RigthOperator(), ecorePackage.getEString(), "rigthOperator", null, 1, 1, RelationalTernaryExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getRelationalTernaryExpression_RigthOperand(), this.getExpression(), null, "rigthOperand", null, 1, 1, RelationalTernaryExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(conditionalTestExpressionEClass, ConditionalTestExpression.class, "ConditionalTestExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getConditionalTestExpression_Operator(), ecorePackage.getEString(), "operator", null, 1, 1, ConditionalTestExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getConditionalTestExpression_Condition(), this.getExpression(), null, "condition", null, 1, 1, ConditionalTestExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getConditionalTestExpression_ThenOperand(), this.getExpression(), null, "thenOperand", null, 1, 1, ConditionalTestExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getConditionalTestExpression_ElseOperand(), this.getExpression(), null, "elseOperand", null, 1, 1, ConditionalTestExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(associativeExpressionEClass, AssociativeExpression.class, "AssociativeExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getAssociativeExpression_Operator(), ecorePackage.getEString(), "operator", null, 1, 1, AssociativeExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getAssociativeExpression_Operand(), this.getExpression(), null, "operand", null, 0, -1, AssociativeExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(arithmeticAssociativeExpressionEClass, ArithmeticAssociativeExpression.class, "ArithmeticAssociativeExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(bitwiseAssociativeExpressionEClass, BitwiseAssociativeExpression.class, "BitwiseAssociativeExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(logicalAssociativeExpressionEClass, LogicalAssociativeExpression.class, "LogicalAssociativeExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(invokeExpressionEClass, InvokeExpression.class, "InvokeExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getInvokeExpression_CallProcedure(), ecorePackage.getEBoolean(), "callProcedure", "false", 0, 1, InvokeExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInvokeExpression_Invoke(), this.getExpression(), null, "invoke", null, 0, 1, InvokeExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInvokeExpression_Args(), this.getExpression(), null, "args", null, 0, -1, InvokeExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInvokeExpression_Rets(), this.getExpression(), null, "rets", null, 0, -1, InvokeExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(namedExpressionEClass, NamedExpression.class, "NamedExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getNamedExpression_Target(), theCommonPackage.getNamedElement(), null, "target", null, 0, 1, NamedExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getNamedExpression_Name(), ecorePackage.getEString(), "name", null, 0, 1, NamedExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getNamedExpression_Expression(), this.getExpression(), null, "expression", null, 0, 1, NamedExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(tupleExpressionEClass, TupleExpression.class, "TupleExpression", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(mixTupleExpressionEClass, MixTupleExpression.class, "MixTupleExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getMixTupleExpression_Value(), this.getExpression(), null, "value", null, 0, -1, MixTupleExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(namedTupleExpressionEClass, NamedTupleExpression.class, "NamedTupleExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getNamedTupleExpression_Value(), this.getNamedExpression(), null, "value", null, 0, -1, NamedTupleExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(positionalTupleExpressionEClass, PositionalTupleExpression.class, "PositionalTupleExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getPositionalTupleExpression_Value(), this.getExpression(), null, "value", null, 0, -1, PositionalTupleExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(valueElementSpecificationEClass, ValueElementSpecification.class, "ValueElementSpecification", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getValueElementSpecification_Kind(), this.getValueElementSpecificationKind(), "kind", "field", 1, 1, ValueElementSpecification.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getValueElementSpecification_Expected(), this.getValueElementSpecificationScheme(), "expected", "any", 1, 1, ValueElementSpecification.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getValueElementSpecification_Target(), this.getExpression(), null, "target", null, 0, 1, ValueElementSpecification.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getValueElementSpecification_Element(), theCommonPackage.getNamedElement(), null, "element", null, 0, 1, ValueElementSpecification.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getValueElementSpecification_Arg(), this.getExpression(), null, "arg", null, 0, 1, ValueElementSpecification.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(instantiationExpressionEClass, InstantiationExpression.class, "InstantiationExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getInstantiationExpression_Instance(), theInfrastructurePackage.getInstanceMachine(), null, "instance", null, 0, 1, InstantiationExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(expressionAsBufferEClass, ExpressionAsBuffer.class, "ExpressionAsBuffer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getExpressionAsBuffer_Buffer(), this.getExpression(), null, "buffer", null, 1, 1, ExpressionAsBuffer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(expressionAsChannelEClass, ExpressionAsChannel.class, "ExpressionAsChannel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getExpressionAsChannel_Channel(), this.getExpression(), null, "channel", null, 1, 1, ExpressionAsChannel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(expressionAsMachineEClass, ExpressionAsMachine.class, "ExpressionAsMachine", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getExpressionAsMachine_Machine(), this.getExpression(), null, "machine", null, 1, 1, ExpressionAsMachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(expressionAsPortEClass, ExpressionAsPort.class, "ExpressionAsPort", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getExpressionAsPort_Port(), this.getExpression(), null, "port", null, 1, 1, ExpressionAsPort.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Initialize enums and add enum literals
+		initEEnum(printeR_FIXEEnum, org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX.class, "PRINTER_FIX");
+		addEEnumLiteral(printeR_FIXEEnum, org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX.INFIX);
+		addEEnumLiteral(printeR_FIXEEnum, org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX.PREFIX);
+		addEEnumLiteral(printeR_FIXEEnum, org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX.SUFFIX);
+		addEEnumLiteral(printeR_FIXEEnum, org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX.FUNCTIONAL);
+		addEEnumLiteral(printeR_FIXEEnum, org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX.SPECIFIC);
+
+		initEEnum(valueElementSpecificationKindEEnum, ValueElementSpecificationKind.class, "ValueElementSpecificationKind");
+		addEEnumLiteral(valueElementSpecificationKindEEnum, ValueElementSpecificationKind.FIELD);
+		addEEnumLiteral(valueElementSpecificationKindEEnum, ValueElementSpecificationKind.INDEX);
+		addEEnumLiteral(valueElementSpecificationKindEEnum, ValueElementSpecificationKind.PARAMETER);
+
+		initEEnum(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.class, "ValueElementSpecificationScheme");
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.ANY);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.VARIABLE);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.MESSAGE);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.SIGNAL);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.BUFFER);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.CHANNEL);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.PORT);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.COM_POINT);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.INSTANCE);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.MACHINE);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.MODEL);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.PROCEDURE);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.ROUTINE);
+		addEEnumLiteral(valueElementSpecificationSchemeEEnum, ValueElementSpecificationScheme.VERTEX);
+	}
+
+} //ExpressionPackageImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/IncrementOrDecrementExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/IncrementOrDecrementExpressionImpl.java
new file mode 100644
index 0000000..a0ce3b2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/IncrementOrDecrementExpressionImpl.java
@@ -0,0 +1,253 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Increment Or Decrement Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementExpressionImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.IncrementOrDecrementExpressionImpl#getLeftHandSide <em>Left Hand Side</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class IncrementOrDecrementExpressionImpl extends ExpressionImpl implements IncrementOrDecrementExpression {
+	/**
+	 * The default value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OPERATOR_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected String operator = OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getLeftHandSide() <em>Left Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLeftHandSide()
+	 * @generated
+	 * @ordered
+	 */
+	protected LeftHandSideExpression leftHandSide;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IncrementOrDecrementExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOperator() {
+		return operator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator(String newOperator) {
+		String oldOperator = operator;
+		operator = newOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR, oldOperator, operator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LeftHandSideExpression getLeftHandSide() {
+		return leftHandSide;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLeftHandSide(LeftHandSideExpression newLeftHandSide, NotificationChain msgs) {
+		LeftHandSideExpression oldLeftHandSide = leftHandSide;
+		leftHandSide = newLeftHandSide;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE, oldLeftHandSide, newLeftHandSide);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLeftHandSide(LeftHandSideExpression newLeftHandSide) {
+		if (newLeftHandSide != leftHandSide) {
+			NotificationChain msgs = null;
+			if (leftHandSide != null)
+				msgs = ((InternalEObject)leftHandSide).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE, null, msgs);
+			if (newLeftHandSide != null)
+				msgs = ((InternalEObject)newLeftHandSide).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE, null, msgs);
+			msgs = basicSetLeftHandSide(newLeftHandSide, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE, newLeftHandSide, newLeftHandSide));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE:
+				return basicSetLeftHandSide(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR:
+				return getOperator();
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE:
+				return getLeftHandSide();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR:
+				setOperator((String)newValue);
+				return;
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE:
+				setLeftHandSide((LeftHandSideExpression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR:
+				setOperator(OPERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE:
+				setLeftHandSide((LeftHandSideExpression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR:
+				return OPERATOR_EDEFAULT == null ? operator != null : !OPERATOR_EDEFAULT.equals(operator);
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE:
+				return leftHandSide != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (operator: ");
+		result.append(operator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //IncrementOrDecrementExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/IncrementOrDecrementPostfixExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/IncrementOrDecrementPostfixExpressionImpl.java
new file mode 100644
index 0000000..d1404b6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/IncrementOrDecrementPostfixExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPostfixExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Increment Or Decrement Postfix Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class IncrementOrDecrementPostfixExpressionImpl extends IncrementOrDecrementExpressionImpl implements IncrementOrDecrementPostfixExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IncrementOrDecrementPostfixExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION;
+	}
+
+} //IncrementOrDecrementPostfixExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/IncrementOrDecrementPrefixExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/IncrementOrDecrementPrefixExpressionImpl.java
new file mode 100644
index 0000000..783294d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/IncrementOrDecrementPrefixExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPrefixExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Increment Or Decrement Prefix Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class IncrementOrDecrementPrefixExpressionImpl extends IncrementOrDecrementExpressionImpl implements IncrementOrDecrementPrefixExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IncrementOrDecrementPrefixExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION;
+	}
+
+} //IncrementOrDecrementPrefixExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/InstantiationExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/InstantiationExpressionImpl.java
new file mode 100644
index 0000000..1064ee8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/InstantiationExpressionImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.InstantiationExpression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Instantiation Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.InstantiationExpressionImpl#getInstance <em>Instance</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class InstantiationExpressionImpl extends ExpressionImpl implements InstantiationExpression {
+	/**
+	 * The cached value of the '{@link #getInstance() <em>Instance</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInstance()
+	 * @generated
+	 * @ordered
+	 */
+	protected InstanceMachine instance;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InstantiationExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.INSTANTIATION_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InstanceMachine getInstance() {
+		return instance;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetInstance(InstanceMachine newInstance, NotificationChain msgs) {
+		InstanceMachine oldInstance = instance;
+		instance = newInstance;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.INSTANTIATION_EXPRESSION__INSTANCE, oldInstance, newInstance);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInstance(InstanceMachine newInstance) {
+		if (newInstance != instance) {
+			NotificationChain msgs = null;
+			if (instance != null)
+				msgs = ((InternalEObject)instance).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.INSTANTIATION_EXPRESSION__INSTANCE, null, msgs);
+			if (newInstance != null)
+				msgs = ((InternalEObject)newInstance).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.INSTANTIATION_EXPRESSION__INSTANCE, null, msgs);
+			msgs = basicSetInstance(newInstance, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.INSTANTIATION_EXPRESSION__INSTANCE, newInstance, newInstance));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.INSTANTIATION_EXPRESSION__INSTANCE:
+				return basicSetInstance(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.INSTANTIATION_EXPRESSION__INSTANCE:
+				return getInstance();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.INSTANTIATION_EXPRESSION__INSTANCE:
+				setInstance((InstanceMachine)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.INSTANTIATION_EXPRESSION__INSTANCE:
+				setInstance((InstanceMachine)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.INSTANTIATION_EXPRESSION__INSTANCE:
+				return instance != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //InstantiationExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/InvokeExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/InvokeExpressionImpl.java
new file mode 100644
index 0000000..f1dde94
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/InvokeExpressionImpl.java
@@ -0,0 +1,333 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.InvokeExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Invoke Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.InvokeExpressionImpl#isCallProcedure <em>Call Procedure</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.InvokeExpressionImpl#getInvoke <em>Invoke</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.InvokeExpressionImpl#getArgs <em>Args</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.InvokeExpressionImpl#getRets <em>Rets</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class InvokeExpressionImpl extends ExpressionImpl implements InvokeExpression {
+	/**
+	 * The default value of the '{@link #isCallProcedure() <em>Call Procedure</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isCallProcedure()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean CALL_PROCEDURE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isCallProcedure() <em>Call Procedure</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isCallProcedure()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean callProcedure = CALL_PROCEDURE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getInvoke() <em>Invoke</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInvoke()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression invoke;
+
+	/**
+	 * The cached value of the '{@link #getArgs() <em>Args</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getArgs()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> args;
+
+	/**
+	 * The cached value of the '{@link #getRets() <em>Rets</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRets()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> rets;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InvokeExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.INVOKE_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isCallProcedure() {
+		return callProcedure;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCallProcedure(boolean newCallProcedure) {
+		boolean oldCallProcedure = callProcedure;
+		callProcedure = newCallProcedure;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.INVOKE_EXPRESSION__CALL_PROCEDURE, oldCallProcedure, callProcedure));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getInvoke() {
+		return invoke;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetInvoke(Expression newInvoke, NotificationChain msgs) {
+		Expression oldInvoke = invoke;
+		invoke = newInvoke;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.INVOKE_EXPRESSION__INVOKE, oldInvoke, newInvoke);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInvoke(Expression newInvoke) {
+		if (newInvoke != invoke) {
+			NotificationChain msgs = null;
+			if (invoke != null)
+				msgs = ((InternalEObject)invoke).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.INVOKE_EXPRESSION__INVOKE, null, msgs);
+			if (newInvoke != null)
+				msgs = ((InternalEObject)newInvoke).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.INVOKE_EXPRESSION__INVOKE, null, msgs);
+			msgs = basicSetInvoke(newInvoke, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.INVOKE_EXPRESSION__INVOKE, newInvoke, newInvoke));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getArgs() {
+		if (args == null) {
+			args = new EObjectContainmentEList<Expression>(Expression.class, this, ExpressionPackage.INVOKE_EXPRESSION__ARGS);
+		}
+		return args;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getRets() {
+		if (rets == null) {
+			rets = new EObjectContainmentEList<Expression>(Expression.class, this, ExpressionPackage.INVOKE_EXPRESSION__RETS);
+		}
+		return rets;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.INVOKE_EXPRESSION__INVOKE:
+				return basicSetInvoke(null, msgs);
+			case ExpressionPackage.INVOKE_EXPRESSION__ARGS:
+				return ((InternalEList<?>)getArgs()).basicRemove(otherEnd, msgs);
+			case ExpressionPackage.INVOKE_EXPRESSION__RETS:
+				return ((InternalEList<?>)getRets()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.INVOKE_EXPRESSION__CALL_PROCEDURE:
+				return isCallProcedure();
+			case ExpressionPackage.INVOKE_EXPRESSION__INVOKE:
+				return getInvoke();
+			case ExpressionPackage.INVOKE_EXPRESSION__ARGS:
+				return getArgs();
+			case ExpressionPackage.INVOKE_EXPRESSION__RETS:
+				return getRets();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.INVOKE_EXPRESSION__CALL_PROCEDURE:
+				setCallProcedure((Boolean)newValue);
+				return;
+			case ExpressionPackage.INVOKE_EXPRESSION__INVOKE:
+				setInvoke((Expression)newValue);
+				return;
+			case ExpressionPackage.INVOKE_EXPRESSION__ARGS:
+				getArgs().clear();
+				getArgs().addAll((Collection<? extends Expression>)newValue);
+				return;
+			case ExpressionPackage.INVOKE_EXPRESSION__RETS:
+				getRets().clear();
+				getRets().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.INVOKE_EXPRESSION__CALL_PROCEDURE:
+				setCallProcedure(CALL_PROCEDURE_EDEFAULT);
+				return;
+			case ExpressionPackage.INVOKE_EXPRESSION__INVOKE:
+				setInvoke((Expression)null);
+				return;
+			case ExpressionPackage.INVOKE_EXPRESSION__ARGS:
+				getArgs().clear();
+				return;
+			case ExpressionPackage.INVOKE_EXPRESSION__RETS:
+				getRets().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.INVOKE_EXPRESSION__CALL_PROCEDURE:
+				return callProcedure != CALL_PROCEDURE_EDEFAULT;
+			case ExpressionPackage.INVOKE_EXPRESSION__INVOKE:
+				return invoke != null;
+			case ExpressionPackage.INVOKE_EXPRESSION__ARGS:
+				return args != null && !args.isEmpty();
+			case ExpressionPackage.INVOKE_EXPRESSION__RETS:
+				return rets != null && !rets.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (callProcedure: ");
+		result.append(callProcedure);
+		result.append(')');
+		return result.toString();
+	}
+
+} //InvokeExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LeftHandSideExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LeftHandSideExpressionImpl.java
new file mode 100644
index 0000000..88f3f6f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LeftHandSideExpressionImpl.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Left Hand Side Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LeftHandSideExpressionImpl#getLvalue <em>Lvalue</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LeftHandSideExpressionImpl extends ExpressionImpl implements LeftHandSideExpression {
+	/**
+	 * The cached value of the '{@link #getLvalue() <em>Lvalue</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLvalue()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression lvalue;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LeftHandSideExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LEFT_HAND_SIDE_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getLvalue() {
+		return lvalue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLvalue(Expression newLvalue, NotificationChain msgs) {
+		Expression oldLvalue = lvalue;
+		lvalue = newLvalue;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION__LVALUE, oldLvalue, newLvalue);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLvalue(Expression newLvalue) {
+		if (newLvalue != lvalue) {
+			NotificationChain msgs = null;
+			if (lvalue != null)
+				msgs = ((InternalEObject)lvalue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION__LVALUE, null, msgs);
+			if (newLvalue != null)
+				msgs = ((InternalEObject)newLvalue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION__LVALUE, null, msgs);
+			msgs = basicSetLvalue(newLvalue, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION__LVALUE, newLvalue, newLvalue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION__LVALUE:
+				return basicSetLvalue(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION__LVALUE:
+				return getLvalue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION__LVALUE:
+				setLvalue((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION__LVALUE:
+				setLvalue((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION__LVALUE:
+				return lvalue != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //LeftHandSideExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralBooleanExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralBooleanExpressionImpl.java
new file mode 100644
index 0000000..0053807
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralBooleanExpressionImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Boolean Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralBooleanExpressionImpl#isValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralBooleanExpressionImpl extends LiteralExpressionImpl implements LiteralBooleanExpression {
+	/**
+	 * The default value of the '{@link #isValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean VALUE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralBooleanExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_BOOLEAN_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(boolean newValue) {
+		boolean oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_BOOLEAN_EXPRESSION__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_BOOLEAN_EXPRESSION__VALUE:
+				return isValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_BOOLEAN_EXPRESSION__VALUE:
+				setValue((Boolean)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_BOOLEAN_EXPRESSION__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_BOOLEAN_EXPRESSION__VALUE:
+				return value != VALUE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralBooleanExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralCharacterExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralCharacterExpressionImpl.java
new file mode 100644
index 0000000..1a571cb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralCharacterExpressionImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Character Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralCharacterExpressionImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralCharacterExpressionImpl extends LiteralExpressionImpl implements LiteralCharacterExpression {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final char VALUE_EDEFAULT = '\'';
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected char value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralCharacterExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_CHARACTER_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public char getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(char newValue) {
+		char oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_CHARACTER_EXPRESSION__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_CHARACTER_EXPRESSION__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_CHARACTER_EXPRESSION__VALUE:
+				setValue((Character)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_CHARACTER_EXPRESSION__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_CHARACTER_EXPRESSION__VALUE:
+				return value != VALUE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralCharacterExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralCollectionExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralCollectionExpressionImpl.java
new file mode 100644
index 0000000..d7a99c1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralCollectionExpressionImpl.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Collection Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralCollectionExpressionImpl#getDatatype <em>Datatype</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralCollectionExpressionImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralCollectionExpressionImpl extends LiteralExpressionImpl implements LiteralCollectionExpression {
+	/**
+	 * The cached value of the '{@link #getDatatype() <em>Datatype</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDatatype()
+	 * @generated
+	 * @ordered
+	 */
+	protected DataType datatype;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralCollectionExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_COLLECTION_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataType getDatatype() {
+		return datatype;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetDatatype(DataType newDatatype, NotificationChain msgs) {
+		DataType oldDatatype = datatype;
+		datatype = newDatatype;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__DATATYPE, oldDatatype, newDatatype);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDatatype(DataType newDatatype) {
+		if (newDatatype != datatype) {
+			NotificationChain msgs = null;
+			if (datatype != null)
+				msgs = ((InternalEObject)datatype).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__DATATYPE, null, msgs);
+			if (newDatatype != null)
+				msgs = ((InternalEObject)newDatatype).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__DATATYPE, null, msgs);
+			msgs = basicSetDatatype(newDatatype, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__DATATYPE, newDatatype, newDatatype));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getValue() {
+		if (value == null) {
+			value = new EObjectContainmentEList<Expression>(Expression.class, this, ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__VALUE);
+		}
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__DATATYPE:
+				return basicSetDatatype(null, msgs);
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__VALUE:
+				return ((InternalEList<?>)getValue()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__DATATYPE:
+				return getDatatype();
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__DATATYPE:
+				setDatatype((DataType)newValue);
+				return;
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__VALUE:
+				getValue().clear();
+				getValue().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__DATATYPE:
+				setDatatype((DataType)null);
+				return;
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__VALUE:
+				getValue().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__DATATYPE:
+				return datatype != null;
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION__VALUE:
+				return value != null && !value.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //LiteralCollectionExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralEnvExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralEnvExpressionImpl.java
new file mode 100644
index 0000000..81a6ef7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralEnvExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Env Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralEnvExpressionImpl extends LiteralReferenceExpressionImpl implements LiteralEnvExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralEnvExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_ENV_EXPRESSION;
+	}
+
+} //LiteralEnvExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralExpressionImpl.java
new file mode 100644
index 0000000..5394bce
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralExpressionImpl extends ExpressionImpl implements LiteralExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_EXPRESSION;
+	}
+
+} //LiteralExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralFloatExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralFloatExpressionImpl.java
new file mode 100644
index 0000000..7a00b7c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralFloatExpressionImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Float Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralFloatExpressionImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralFloatExpressionImpl extends LiteralExpressionImpl implements LiteralFloatExpression {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double VALUE_EDEFAULT = 0.0;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected double value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralFloatExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_FLOAT_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(double newValue) {
+		double oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_FLOAT_EXPRESSION__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_FLOAT_EXPRESSION__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_FLOAT_EXPRESSION__VALUE:
+				setValue((Double)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_FLOAT_EXPRESSION__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_FLOAT_EXPRESSION__VALUE:
+				return value != VALUE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralFloatExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralIntegerExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralIntegerExpressionImpl.java
new file mode 100644
index 0000000..01cfe1a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralIntegerExpressionImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Integer Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralIntegerExpressionImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralIntegerExpressionImpl extends LiteralExpressionImpl implements LiteralIntegerExpression {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final long VALUE_EDEFAULT = 0L;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected long value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralIntegerExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_INTEGER_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public long getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(long newValue) {
+		long oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_INTEGER_EXPRESSION__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_INTEGER_EXPRESSION__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_INTEGER_EXPRESSION__VALUE:
+				setValue((Long)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_INTEGER_EXPRESSION__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_INTEGER_EXPRESSION__VALUE:
+				return value != VALUE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralIntegerExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralNullExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralNullExpressionImpl.java
new file mode 100644
index 0000000..d92e321
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralNullExpressionImpl.java
@@ -0,0 +1,184 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.common.Type;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Null Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralNullExpressionImpl#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralNullExpressionImpl extends LiteralExpressionImpl implements LiteralNullExpression {
+	/**
+	 * The cached value of the '{@link #getType() <em>Type</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getType()
+	 * @generated
+	 * @ordered
+	 */
+	protected Type type;
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralNullExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_NULL_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Type getType() {
+		return type;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetType(Type newType, NotificationChain msgs) {
+		Type oldType = type;
+		type = newType;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_NULL_EXPRESSION__TYPE, oldType, newType);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setType(Type newType) {
+		if (newType != type) {
+			NotificationChain msgs = null;
+			if (type != null)
+				msgs = ((InternalEObject)type).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.LITERAL_NULL_EXPRESSION__TYPE, null, msgs);
+			if (newType != null)
+				msgs = ((InternalEObject)newType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.LITERAL_NULL_EXPRESSION__TYPE, null, msgs);
+			msgs = basicSetType(newType, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_NULL_EXPRESSION__TYPE, newType, newType));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_NULL_EXPRESSION__TYPE:
+				return basicSetType(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_NULL_EXPRESSION__TYPE:
+				return getType();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_NULL_EXPRESSION__TYPE:
+				setType((Type)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_NULL_EXPRESSION__TYPE:
+				setType((Type)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_NULL_EXPRESSION__TYPE:
+				return type != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //LiteralNullExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralParentExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralParentExpressionImpl.java
new file mode 100644
index 0000000..a0987a1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralParentExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Parent Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralParentExpressionImpl extends LiteralReferenceExpressionImpl implements LiteralParentExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralParentExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_PARENT_EXPRESSION;
+	}
+
+} //LiteralParentExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralRationalExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralRationalExpressionImpl.java
new file mode 100644
index 0000000..f5c76c2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralRationalExpressionImpl.java
@@ -0,0 +1,226 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Rational Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralRationalExpressionImpl#getNumerator <em>Numerator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralRationalExpressionImpl#getDenominator <em>Denominator</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralRationalExpressionImpl extends LiteralExpressionImpl implements LiteralRationalExpression {
+	/**
+	 * The default value of the '{@link #getNumerator() <em>Numerator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNumerator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final long NUMERATOR_EDEFAULT = 0L;
+
+	/**
+	 * The cached value of the '{@link #getNumerator() <em>Numerator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNumerator()
+	 * @generated
+	 * @ordered
+	 */
+	protected long numerator = NUMERATOR_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getDenominator() <em>Denominator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDenominator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final long DENOMINATOR_EDEFAULT = 1L;
+
+	/**
+	 * The cached value of the '{@link #getDenominator() <em>Denominator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDenominator()
+	 * @generated
+	 * @ordered
+	 */
+	protected long denominator = DENOMINATOR_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralRationalExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_RATIONAL_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public long getNumerator() {
+		return numerator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setNumerator(long newNumerator) {
+		long oldNumerator = numerator;
+		numerator = newNumerator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__NUMERATOR, oldNumerator, numerator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public long getDenominator() {
+		return denominator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDenominator(long newDenominator) {
+		long oldDenominator = denominator;
+		denominator = newDenominator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__DENOMINATOR, oldDenominator, denominator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__NUMERATOR:
+				return getNumerator();
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__DENOMINATOR:
+				return getDenominator();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__NUMERATOR:
+				setNumerator((Long)newValue);
+				return;
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__DENOMINATOR:
+				setDenominator((Long)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__NUMERATOR:
+				setNumerator(NUMERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__DENOMINATOR:
+				setDenominator(DENOMINATOR_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__NUMERATOR:
+				return numerator != NUMERATOR_EDEFAULT;
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION__DENOMINATOR:
+				return denominator != DENOMINATOR_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (numerator: ");
+		result.append(numerator);
+		result.append(", denominator: ");
+		result.append(denominator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralRationalExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralRealExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralRealExpressionImpl.java
new file mode 100644
index 0000000..b744a77
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralRealExpressionImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Real Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralRealExpressionImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralRealExpressionImpl extends LiteralExpressionImpl implements LiteralRealExpression {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double VALUE_EDEFAULT = 0.0;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected double value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralRealExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_REAL_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(double newValue) {
+		double oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_REAL_EXPRESSION__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REAL_EXPRESSION__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REAL_EXPRESSION__VALUE:
+				setValue((Double)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REAL_EXPRESSION__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REAL_EXPRESSION__VALUE:
+				return value != VALUE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralRealExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralReferenceElementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralReferenceElementImpl.java
new file mode 100644
index 0000000..42b91ec
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralReferenceElementImpl.java
@@ -0,0 +1,316 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Reference Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceElementImpl#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceElementImpl#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralReferenceElementImpl#getArg <em>Arg</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralReferenceElementImpl extends LiteralReferenceExpressionImpl implements LiteralReferenceElement {
+	/**
+	 * The default value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ValueElementSpecificationKind KIND_EDEFAULT = ValueElementSpecificationKind.FIELD;
+
+	/**
+	 * The cached value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected ValueElementSpecificationKind kind = KIND_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected NamedElement value;
+
+	/**
+	 * The cached value of the '{@link #getArg() <em>Arg</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getArg()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression arg;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralReferenceElementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_REFERENCE_ELEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValueElementSpecificationKind getKind() {
+		return kind;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKind(ValueElementSpecificationKind newKind) {
+		ValueElementSpecificationKind oldKind = kind;
+		kind = newKind == null ? KIND_EDEFAULT : newKind;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_REFERENCE_ELEMENT__KIND, oldKind, kind));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement getValue() {
+		if (value != null && value.eIsProxy()) {
+			InternalEObject oldValue = (InternalEObject)value;
+			value = (NamedElement)eResolveProxy(oldValue);
+			if (value != oldValue) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ExpressionPackage.LITERAL_REFERENCE_ELEMENT__VALUE, oldValue, value));
+			}
+		}
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement basicGetValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(NamedElement newValue) {
+		NamedElement oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_REFERENCE_ELEMENT__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getArg() {
+		return arg;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetArg(Expression newArg, NotificationChain msgs) {
+		Expression oldArg = arg;
+		arg = newArg;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_REFERENCE_ELEMENT__ARG, oldArg, newArg);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setArg(Expression newArg) {
+		if (newArg != arg) {
+			NotificationChain msgs = null;
+			if (arg != null)
+				msgs = ((InternalEObject)arg).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.LITERAL_REFERENCE_ELEMENT__ARG, null, msgs);
+			if (newArg != null)
+				msgs = ((InternalEObject)newArg).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.LITERAL_REFERENCE_ELEMENT__ARG, null, msgs);
+			msgs = basicSetArg(newArg, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_REFERENCE_ELEMENT__ARG, newArg, newArg));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__ARG:
+				return basicSetArg(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__KIND:
+				return getKind();
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__VALUE:
+				if (resolve) return getValue();
+				return basicGetValue();
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__ARG:
+				return getArg();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__KIND:
+				setKind((ValueElementSpecificationKind)newValue);
+				return;
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__VALUE:
+				setValue((NamedElement)newValue);
+				return;
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__ARG:
+				setArg((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__KIND:
+				setKind(KIND_EDEFAULT);
+				return;
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__VALUE:
+				setValue((NamedElement)null);
+				return;
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__ARG:
+				setArg((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__KIND:
+				return kind != KIND_EDEFAULT;
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__VALUE:
+				return value != null;
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT__ARG:
+				return arg != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (kind: ");
+		result.append(kind);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralReferenceElementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralReferenceExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralReferenceExpressionImpl.java
new file mode 100644
index 0000000..b094291
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralReferenceExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralReferenceExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Reference Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralReferenceExpressionImpl extends LiteralExpressionImpl implements LiteralReferenceExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralReferenceExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_REFERENCE_EXPRESSION;
+	}
+
+} //LiteralReferenceExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralSelfExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralSelfExpressionImpl.java
new file mode 100644
index 0000000..00c9e71
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralSelfExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Self Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralSelfExpressionImpl extends LiteralReferenceExpressionImpl implements LiteralSelfExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralSelfExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_SELF_EXPRESSION;
+	}
+
+} //LiteralSelfExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralStringExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralStringExpressionImpl.java
new file mode 100644
index 0000000..2455bf4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralStringExpressionImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal String Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.LiteralStringExpressionImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LiteralStringExpressionImpl extends LiteralExpressionImpl implements LiteralStringExpression {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected String value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralStringExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_STRING_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(String newValue) {
+		String oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.LITERAL_STRING_EXPRESSION__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_STRING_EXPRESSION__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_STRING_EXPRESSION__VALUE:
+				setValue((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_STRING_EXPRESSION__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.LITERAL_STRING_EXPRESSION__VALUE:
+				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //LiteralStringExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralSuperExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralSuperExpressionImpl.java
new file mode 100644
index 0000000..f462ac0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralSuperExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Super Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralSuperExpressionImpl extends LiteralReferenceExpressionImpl implements LiteralSuperExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralSuperExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_SUPER_EXPRESSION;
+	}
+
+} //LiteralSuperExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralSystemExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralSystemExpressionImpl.java
new file mode 100644
index 0000000..7c3a266
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralSystemExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal System Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralSystemExpressionImpl extends LiteralReferenceExpressionImpl implements LiteralSystemExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralSystemExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_SYSTEM_EXPRESSION;
+	}
+
+} //LiteralSystemExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralThisExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralThisExpressionImpl.java
new file mode 100644
index 0000000..6ddebff
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralThisExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal This Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralThisExpressionImpl extends LiteralReferenceExpressionImpl implements LiteralThisExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralThisExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_THIS_EXPRESSION;
+	}
+
+} //LiteralThisExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralTimeDeltaExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralTimeDeltaExpressionImpl.java
new file mode 100644
index 0000000..2ce5b65
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralTimeDeltaExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralTimeDeltaExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Time Delta Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralTimeDeltaExpressionImpl extends LiteralReferenceExpressionImpl implements LiteralTimeDeltaExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralTimeDeltaExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_TIME_DELTA_EXPRESSION;
+	}
+
+} //LiteralTimeDeltaExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralTimeExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralTimeExpressionImpl.java
new file mode 100644
index 0000000..c8af801
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LiteralTimeExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LiteralTimeExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Literal Time Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LiteralTimeExpressionImpl extends LiteralReferenceExpressionImpl implements LiteralTimeExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LiteralTimeExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LITERAL_TIME_EXPRESSION;
+	}
+
+} //LiteralTimeExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LogicalAssociativeExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LogicalAssociativeExpressionImpl.java
new file mode 100644
index 0000000..8023cf3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LogicalAssociativeExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Logical Associative Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LogicalAssociativeExpressionImpl extends AssociativeExpressionImpl implements LogicalAssociativeExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LogicalAssociativeExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LOGICAL_ASSOCIATIVE_EXPRESSION;
+	}
+
+} //LogicalAssociativeExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LogicalUnaryExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LogicalUnaryExpressionImpl.java
new file mode 100644
index 0000000..68db1db
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/LogicalUnaryExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Logical Unary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class LogicalUnaryExpressionImpl extends UnaryExpressionImpl implements LogicalUnaryExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected LogicalUnaryExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.LOGICAL_UNARY_EXPRESSION;
+	}
+
+} //LogicalUnaryExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/MixTupleExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/MixTupleExpressionImpl.java
new file mode 100644
index 0000000..6905f0e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/MixTupleExpressionImpl.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.MixTupleExpression;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Mix Tuple Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.MixTupleExpressionImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class MixTupleExpressionImpl extends TupleExpressionImpl implements MixTupleExpression {
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected MixTupleExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.MIX_TUPLE_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getValue() {
+		if (value == null) {
+			value = new EObjectContainmentEList<Expression>(Expression.class, this, ExpressionPackage.MIX_TUPLE_EXPRESSION__VALUE);
+		}
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.MIX_TUPLE_EXPRESSION__VALUE:
+				return ((InternalEList<?>)getValue()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.MIX_TUPLE_EXPRESSION__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.MIX_TUPLE_EXPRESSION__VALUE:
+				getValue().clear();
+				getValue().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.MIX_TUPLE_EXPRESSION__VALUE:
+				getValue().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.MIX_TUPLE_EXPRESSION__VALUE:
+				return value != null && !value.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //MixTupleExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/NamedExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/NamedExpressionImpl.java
new file mode 100644
index 0000000..42bd262
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/NamedExpressionImpl.java
@@ -0,0 +1,315 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.NamedExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Named Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.NamedExpressionImpl#getTarget <em>Target</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.NamedExpressionImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.NamedExpressionImpl#getExpression <em>Expression</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class NamedExpressionImpl extends ExpressionImpl implements NamedExpression {
+	/**
+	 * The cached value of the '{@link #getTarget() <em>Target</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTarget()
+	 * @generated
+	 * @ordered
+	 */
+	protected NamedElement target;
+
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getExpression() <em>Expression</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExpression()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression expression;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected NamedExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.NAMED_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement getTarget() {
+		if (target != null && target.eIsProxy()) {
+			InternalEObject oldTarget = (InternalEObject)target;
+			target = (NamedElement)eResolveProxy(oldTarget);
+			if (target != oldTarget) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ExpressionPackage.NAMED_EXPRESSION__TARGET, oldTarget, target));
+			}
+		}
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement basicGetTarget() {
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTarget(NamedElement newTarget) {
+		NamedElement oldTarget = target;
+		target = newTarget;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.NAMED_EXPRESSION__TARGET, oldTarget, target));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.NAMED_EXPRESSION__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getExpression() {
+		return expression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetExpression(Expression newExpression, NotificationChain msgs) {
+		Expression oldExpression = expression;
+		expression = newExpression;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.NAMED_EXPRESSION__EXPRESSION, oldExpression, newExpression);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setExpression(Expression newExpression) {
+		if (newExpression != expression) {
+			NotificationChain msgs = null;
+			if (expression != null)
+				msgs = ((InternalEObject)expression).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.NAMED_EXPRESSION__EXPRESSION, null, msgs);
+			if (newExpression != null)
+				msgs = ((InternalEObject)newExpression).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.NAMED_EXPRESSION__EXPRESSION, null, msgs);
+			msgs = basicSetExpression(newExpression, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.NAMED_EXPRESSION__EXPRESSION, newExpression, newExpression));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_EXPRESSION__EXPRESSION:
+				return basicSetExpression(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_EXPRESSION__TARGET:
+				if (resolve) return getTarget();
+				return basicGetTarget();
+			case ExpressionPackage.NAMED_EXPRESSION__NAME:
+				return getName();
+			case ExpressionPackage.NAMED_EXPRESSION__EXPRESSION:
+				return getExpression();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_EXPRESSION__TARGET:
+				setTarget((NamedElement)newValue);
+				return;
+			case ExpressionPackage.NAMED_EXPRESSION__NAME:
+				setName((String)newValue);
+				return;
+			case ExpressionPackage.NAMED_EXPRESSION__EXPRESSION:
+				setExpression((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_EXPRESSION__TARGET:
+				setTarget((NamedElement)null);
+				return;
+			case ExpressionPackage.NAMED_EXPRESSION__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case ExpressionPackage.NAMED_EXPRESSION__EXPRESSION:
+				setExpression((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_EXPRESSION__TARGET:
+				return target != null;
+			case ExpressionPackage.NAMED_EXPRESSION__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case ExpressionPackage.NAMED_EXPRESSION__EXPRESSION:
+				return expression != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(')');
+		return result.toString();
+	}
+
+} //NamedExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/NamedTupleExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/NamedTupleExpressionImpl.java
new file mode 100644
index 0000000..bab666d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/NamedTupleExpressionImpl.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.NamedExpression;
+import org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Named Tuple Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.NamedTupleExpressionImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class NamedTupleExpressionImpl extends TupleExpressionImpl implements NamedTupleExpression {
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<NamedExpression> value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected NamedTupleExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.NAMED_TUPLE_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<NamedExpression> getValue() {
+		if (value == null) {
+			value = new EObjectContainmentEList<NamedExpression>(NamedExpression.class, this, ExpressionPackage.NAMED_TUPLE_EXPRESSION__VALUE);
+		}
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_TUPLE_EXPRESSION__VALUE:
+				return ((InternalEList<?>)getValue()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_TUPLE_EXPRESSION__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_TUPLE_EXPRESSION__VALUE:
+				getValue().clear();
+				getValue().addAll((Collection<? extends NamedExpression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_TUPLE_EXPRESSION__VALUE:
+				getValue().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.NAMED_TUPLE_EXPRESSION__VALUE:
+				return value != null && !value.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //NamedTupleExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/NewfreshExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/NewfreshExpressionImpl.java
new file mode 100644
index 0000000..f447ef2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/NewfreshExpressionImpl.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+import org.eclipse.efm.ecore.formalml.expression.NewfreshExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Newfresh Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.NewfreshExpressionImpl#getLeftHandSide <em>Left Hand Side</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class NewfreshExpressionImpl extends ExpressionImpl implements NewfreshExpression {
+	/**
+	 * The cached value of the '{@link #getLeftHandSide() <em>Left Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLeftHandSide()
+	 * @generated
+	 * @ordered
+	 */
+	protected LeftHandSideExpression leftHandSide;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected NewfreshExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.NEWFRESH_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LeftHandSideExpression getLeftHandSide() {
+		return leftHandSide;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLeftHandSide(LeftHandSideExpression newLeftHandSide, NotificationChain msgs) {
+		LeftHandSideExpression oldLeftHandSide = leftHandSide;
+		leftHandSide = newLeftHandSide;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.NEWFRESH_EXPRESSION__LEFT_HAND_SIDE, oldLeftHandSide, newLeftHandSide);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLeftHandSide(LeftHandSideExpression newLeftHandSide) {
+		if (newLeftHandSide != leftHandSide) {
+			NotificationChain msgs = null;
+			if (leftHandSide != null)
+				msgs = ((InternalEObject)leftHandSide).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.NEWFRESH_EXPRESSION__LEFT_HAND_SIDE, null, msgs);
+			if (newLeftHandSide != null)
+				msgs = ((InternalEObject)newLeftHandSide).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.NEWFRESH_EXPRESSION__LEFT_HAND_SIDE, null, msgs);
+			msgs = basicSetLeftHandSide(newLeftHandSide, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.NEWFRESH_EXPRESSION__LEFT_HAND_SIDE, newLeftHandSide, newLeftHandSide));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.NEWFRESH_EXPRESSION__LEFT_HAND_SIDE:
+				return basicSetLeftHandSide(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.NEWFRESH_EXPRESSION__LEFT_HAND_SIDE:
+				return getLeftHandSide();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.NEWFRESH_EXPRESSION__LEFT_HAND_SIDE:
+				setLeftHandSide((LeftHandSideExpression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.NEWFRESH_EXPRESSION__LEFT_HAND_SIDE:
+				setLeftHandSide((LeftHandSideExpression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.NEWFRESH_EXPRESSION__LEFT_HAND_SIDE:
+				return leftHandSide != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //NewfreshExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/PositionalTupleExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/PositionalTupleExpressionImpl.java
new file mode 100644
index 0000000..b97beed
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/PositionalTupleExpressionImpl.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Positional Tuple Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.PositionalTupleExpressionImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class PositionalTupleExpressionImpl extends TupleExpressionImpl implements PositionalTupleExpression {
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PositionalTupleExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.POSITIONAL_TUPLE_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getValue() {
+		if (value == null) {
+			value = new EObjectContainmentEList<Expression>(Expression.class, this, ExpressionPackage.POSITIONAL_TUPLE_EXPRESSION__VALUE);
+		}
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.POSITIONAL_TUPLE_EXPRESSION__VALUE:
+				return ((InternalEList<?>)getValue()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.POSITIONAL_TUPLE_EXPRESSION__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.POSITIONAL_TUPLE_EXPRESSION__VALUE:
+				getValue().clear();
+				getValue().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.POSITIONAL_TUPLE_EXPRESSION__VALUE:
+				getValue().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.POSITIONAL_TUPLE_EXPRESSION__VALUE:
+				return value != null && !value.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //PositionalTupleExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/RelationalBinaryExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/RelationalBinaryExpressionImpl.java
new file mode 100644
index 0000000..b71d040
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/RelationalBinaryExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Relational Binary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class RelationalBinaryExpressionImpl extends BinaryExpressionImpl implements RelationalBinaryExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RelationalBinaryExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.RELATIONAL_BINARY_EXPRESSION;
+	}
+
+} //RelationalBinaryExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/RelationalTernaryExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/RelationalTernaryExpressionImpl.java
new file mode 100644
index 0000000..bbd62e3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/RelationalTernaryExpressionImpl.java
@@ -0,0 +1,320 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Relational Ternary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.RelationalTernaryExpressionImpl#getLeftRelation <em>Left Relation</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.RelationalTernaryExpressionImpl#getRigthOperator <em>Rigth Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.RelationalTernaryExpressionImpl#getRigthOperand <em>Rigth Operand</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class RelationalTernaryExpressionImpl extends ExpressionImpl implements RelationalTernaryExpression {
+	/**
+	 * The cached value of the '{@link #getLeftRelation() <em>Left Relation</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLeftRelation()
+	 * @generated
+	 * @ordered
+	 */
+	protected RelationalBinaryExpression leftRelation;
+
+	/**
+	 * The default value of the '{@link #getRigthOperator() <em>Rigth Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRigthOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String RIGTH_OPERATOR_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getRigthOperator() <em>Rigth Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRigthOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected String rigthOperator = RIGTH_OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getRigthOperand() <em>Rigth Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRigthOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression rigthOperand;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RelationalTernaryExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.RELATIONAL_TERNARY_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public RelationalBinaryExpression getLeftRelation() {
+		return leftRelation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLeftRelation(RelationalBinaryExpression newLeftRelation, NotificationChain msgs) {
+		RelationalBinaryExpression oldLeftRelation = leftRelation;
+		leftRelation = newLeftRelation;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION, oldLeftRelation, newLeftRelation);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLeftRelation(RelationalBinaryExpression newLeftRelation) {
+		if (newLeftRelation != leftRelation) {
+			NotificationChain msgs = null;
+			if (leftRelation != null)
+				msgs = ((InternalEObject)leftRelation).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION, null, msgs);
+			if (newLeftRelation != null)
+				msgs = ((InternalEObject)newLeftRelation).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION, null, msgs);
+			msgs = basicSetLeftRelation(newLeftRelation, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION, newLeftRelation, newLeftRelation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getRigthOperator() {
+		return rigthOperator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRigthOperator(String newRigthOperator) {
+		String oldRigthOperator = rigthOperator;
+		rigthOperator = newRigthOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR, oldRigthOperator, rigthOperator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getRigthOperand() {
+		return rigthOperand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetRigthOperand(Expression newRigthOperand, NotificationChain msgs) {
+		Expression oldRigthOperand = rigthOperand;
+		rigthOperand = newRigthOperand;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND, oldRigthOperand, newRigthOperand);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRigthOperand(Expression newRigthOperand) {
+		if (newRigthOperand != rigthOperand) {
+			NotificationChain msgs = null;
+			if (rigthOperand != null)
+				msgs = ((InternalEObject)rigthOperand).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND, null, msgs);
+			if (newRigthOperand != null)
+				msgs = ((InternalEObject)newRigthOperand).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND, null, msgs);
+			msgs = basicSetRigthOperand(newRigthOperand, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND, newRigthOperand, newRigthOperand));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION:
+				return basicSetLeftRelation(null, msgs);
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND:
+				return basicSetRigthOperand(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION:
+				return getLeftRelation();
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR:
+				return getRigthOperator();
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND:
+				return getRigthOperand();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION:
+				setLeftRelation((RelationalBinaryExpression)newValue);
+				return;
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR:
+				setRigthOperator((String)newValue);
+				return;
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND:
+				setRigthOperand((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION:
+				setLeftRelation((RelationalBinaryExpression)null);
+				return;
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR:
+				setRigthOperator(RIGTH_OPERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND:
+				setRigthOperand((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION:
+				return leftRelation != null;
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR:
+				return RIGTH_OPERATOR_EDEFAULT == null ? rigthOperator != null : !RIGTH_OPERATOR_EDEFAULT.equals(rigthOperator);
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND:
+				return rigthOperand != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (rigthOperator: ");
+		result.append(rigthOperator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //RelationalTernaryExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/TupleExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/TupleExpressionImpl.java
new file mode 100644
index 0000000..c063430
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/TupleExpressionImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Tuple Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public abstract class TupleExpressionImpl extends ExpressionImpl implements TupleExpression {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TupleExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.TUPLE_EXPRESSION;
+	}
+
+} //TupleExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/UnaryExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/UnaryExpressionImpl.java
new file mode 100644
index 0000000..278aed3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/UnaryExpressionImpl.java
@@ -0,0 +1,253 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.UnaryExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Unary Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.UnaryExpressionImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.UnaryExpressionImpl#getOperand <em>Operand</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class UnaryExpressionImpl extends ExpressionImpl implements UnaryExpression {
+	/**
+	 * The default value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OPERATOR_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected String operator = OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getOperand() <em>Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression operand;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected UnaryExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.UNARY_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOperator() {
+		return operator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator(String newOperator) {
+		String oldOperator = operator;
+		operator = newOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.UNARY_EXPRESSION__OPERATOR, oldOperator, operator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getOperand() {
+		return operand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetOperand(Expression newOperand, NotificationChain msgs) {
+		Expression oldOperand = operand;
+		operand = newOperand;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.UNARY_EXPRESSION__OPERAND, oldOperand, newOperand);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperand(Expression newOperand) {
+		if (newOperand != operand) {
+			NotificationChain msgs = null;
+			if (operand != null)
+				msgs = ((InternalEObject)operand).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.UNARY_EXPRESSION__OPERAND, null, msgs);
+			if (newOperand != null)
+				msgs = ((InternalEObject)newOperand).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.UNARY_EXPRESSION__OPERAND, null, msgs);
+			msgs = basicSetOperand(newOperand, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.UNARY_EXPRESSION__OPERAND, newOperand, newOperand));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.UNARY_EXPRESSION__OPERAND:
+				return basicSetOperand(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.UNARY_EXPRESSION__OPERATOR:
+				return getOperator();
+			case ExpressionPackage.UNARY_EXPRESSION__OPERAND:
+				return getOperand();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.UNARY_EXPRESSION__OPERATOR:
+				setOperator((String)newValue);
+				return;
+			case ExpressionPackage.UNARY_EXPRESSION__OPERAND:
+				setOperand((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.UNARY_EXPRESSION__OPERATOR:
+				setOperator(OPERATOR_EDEFAULT);
+				return;
+			case ExpressionPackage.UNARY_EXPRESSION__OPERAND:
+				setOperand((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.UNARY_EXPRESSION__OPERATOR:
+				return OPERATOR_EDEFAULT == null ? operator != null : !OPERATOR_EDEFAULT.equals(operator);
+			case ExpressionPackage.UNARY_EXPRESSION__OPERAND:
+				return operand != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (operator: ");
+		result.append(operator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //UnaryExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ValueElementSpecificationImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ValueElementSpecificationImpl.java
new file mode 100644
index 0000000..2db949e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ValueElementSpecificationImpl.java
@@ -0,0 +1,437 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Value Element Specification</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueElementSpecificationImpl#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueElementSpecificationImpl#getExpected <em>Expected</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueElementSpecificationImpl#getTarget <em>Target</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueElementSpecificationImpl#getElement <em>Element</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueElementSpecificationImpl#getArg <em>Arg</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ValueElementSpecificationImpl extends ExpressionImpl implements ValueElementSpecification {
+	/**
+	 * The default value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ValueElementSpecificationKind KIND_EDEFAULT = ValueElementSpecificationKind.FIELD;
+
+	/**
+	 * The cached value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected ValueElementSpecificationKind kind = KIND_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getExpected() <em>Expected</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExpected()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ValueElementSpecificationScheme EXPECTED_EDEFAULT = ValueElementSpecificationScheme.ANY;
+
+	/**
+	 * The cached value of the '{@link #getExpected() <em>Expected</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExpected()
+	 * @generated
+	 * @ordered
+	 */
+	protected ValueElementSpecificationScheme expected = EXPECTED_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getTarget() <em>Target</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTarget()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression target;
+
+	/**
+	 * The cached value of the '{@link #getElement() <em>Element</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getElement()
+	 * @generated
+	 * @ordered
+	 */
+	protected NamedElement element;
+
+	/**
+	 * The cached value of the '{@link #getArg() <em>Arg</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getArg()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression arg;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ValueElementSpecificationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.VALUE_ELEMENT_SPECIFICATION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValueElementSpecificationKind getKind() {
+		return kind;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKind(ValueElementSpecificationKind newKind) {
+		ValueElementSpecificationKind oldKind = kind;
+		kind = newKind == null ? KIND_EDEFAULT : newKind;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__KIND, oldKind, kind));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValueElementSpecificationScheme getExpected() {
+		return expected;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setExpected(ValueElementSpecificationScheme newExpected) {
+		ValueElementSpecificationScheme oldExpected = expected;
+		expected = newExpected == null ? EXPECTED_EDEFAULT : newExpected;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__EXPECTED, oldExpected, expected));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getTarget() {
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetTarget(Expression newTarget, NotificationChain msgs) {
+		Expression oldTarget = target;
+		target = newTarget;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__TARGET, oldTarget, newTarget);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTarget(Expression newTarget) {
+		if (newTarget != target) {
+			NotificationChain msgs = null;
+			if (target != null)
+				msgs = ((InternalEObject)target).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__TARGET, null, msgs);
+			if (newTarget != null)
+				msgs = ((InternalEObject)newTarget).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__TARGET, null, msgs);
+			msgs = basicSetTarget(newTarget, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__TARGET, newTarget, newTarget));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement getElement() {
+		if (element != null && element.eIsProxy()) {
+			InternalEObject oldElement = (InternalEObject)element;
+			element = (NamedElement)eResolveProxy(oldElement);
+			if (element != oldElement) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ELEMENT, oldElement, element));
+			}
+		}
+		return element;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement basicGetElement() {
+		return element;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setElement(NamedElement newElement) {
+		NamedElement oldElement = element;
+		element = newElement;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ELEMENT, oldElement, element));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getArg() {
+		return arg;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetArg(Expression newArg, NotificationChain msgs) {
+		Expression oldArg = arg;
+		arg = newArg;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ARG, oldArg, newArg);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setArg(Expression newArg) {
+		if (newArg != arg) {
+			NotificationChain msgs = null;
+			if (arg != null)
+				msgs = ((InternalEObject)arg).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ARG, null, msgs);
+			if (newArg != null)
+				msgs = ((InternalEObject)newArg).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ARG, null, msgs);
+			msgs = basicSetArg(newArg, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ARG, newArg, newArg));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__TARGET:
+				return basicSetTarget(null, msgs);
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ARG:
+				return basicSetArg(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__KIND:
+				return getKind();
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__EXPECTED:
+				return getExpected();
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__TARGET:
+				return getTarget();
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ELEMENT:
+				if (resolve) return getElement();
+				return basicGetElement();
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ARG:
+				return getArg();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__KIND:
+				setKind((ValueElementSpecificationKind)newValue);
+				return;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__EXPECTED:
+				setExpected((ValueElementSpecificationScheme)newValue);
+				return;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__TARGET:
+				setTarget((Expression)newValue);
+				return;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ELEMENT:
+				setElement((NamedElement)newValue);
+				return;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ARG:
+				setArg((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__KIND:
+				setKind(KIND_EDEFAULT);
+				return;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__EXPECTED:
+				setExpected(EXPECTED_EDEFAULT);
+				return;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__TARGET:
+				setTarget((Expression)null);
+				return;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ELEMENT:
+				setElement((NamedElement)null);
+				return;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ARG:
+				setArg((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__KIND:
+				return kind != KIND_EDEFAULT;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__EXPECTED:
+				return expected != EXPECTED_EDEFAULT;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__TARGET:
+				return target != null;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ELEMENT:
+				return element != null;
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION__ARG:
+				return arg != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (kind: ");
+		result.append(kind);
+		result.append(", expected: ");
+		result.append(expected);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ValueElementSpecificationImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ValueExpressionPrettyPrinterImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ValueExpressionPrettyPrinterImpl.java
new file mode 100644
index 0000000..b36bff4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ValueExpressionPrettyPrinterImpl.java
@@ -0,0 +1,271 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX;
+import org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Value Expression Pretty Printer</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueExpressionPrettyPrinterImpl#getSymbol <em>Symbol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueExpressionPrettyPrinterImpl#getFix <em>Fix</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValueExpressionPrettyPrinterImpl#getSpecific <em>Specific</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class ValueExpressionPrettyPrinterImpl extends MinimalEObjectImpl.Container implements ValueExpressionPrettyPrinter {
+	/**
+	 * The default value of the '{@link #getSymbol() <em>Symbol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSymbol()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String SYMBOL_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getSymbol() <em>Symbol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSymbol()
+	 * @generated
+	 * @ordered
+	 */
+	protected String symbol = SYMBOL_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getFix() <em>Fix</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFix()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final PRINTER_FIX FIX_EDEFAULT = PRINTER_FIX.INFIX;
+
+	/**
+	 * The cached value of the '{@link #getFix() <em>Fix</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFix()
+	 * @generated
+	 * @ordered
+	 */
+	protected PRINTER_FIX fix = FIX_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getSpecific() <em>Specific</em>}' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSpecific()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<String> specific;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ValueExpressionPrettyPrinterImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.VALUE_EXPRESSION_PRETTY_PRINTER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getSymbol() {
+		return symbol;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSymbol(String newSymbol) {
+		String oldSymbol = symbol;
+		symbol = newSymbol;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SYMBOL, oldSymbol, symbol));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PRINTER_FIX getFix() {
+		return fix;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFix(PRINTER_FIX newFix) {
+		PRINTER_FIX oldFix = fix;
+		fix = newFix == null ? FIX_EDEFAULT : newFix;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__FIX, oldFix, fix));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<String> getSpecific() {
+		if (specific == null) {
+			specific = new EDataTypeUniqueEList<String>(String.class, this, ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SPECIFIC);
+		}
+		return specific;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SYMBOL:
+				return getSymbol();
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__FIX:
+				return getFix();
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SPECIFIC:
+				return getSpecific();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SYMBOL:
+				setSymbol((String)newValue);
+				return;
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__FIX:
+				setFix((PRINTER_FIX)newValue);
+				return;
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SPECIFIC:
+				getSpecific().clear();
+				getSpecific().addAll((Collection<? extends String>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SYMBOL:
+				setSymbol(SYMBOL_EDEFAULT);
+				return;
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__FIX:
+				setFix(FIX_EDEFAULT);
+				return;
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SPECIFIC:
+				getSpecific().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SYMBOL:
+				return SYMBOL_EDEFAULT == null ? symbol != null : !SYMBOL_EDEFAULT.equals(symbol);
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__FIX:
+				return fix != FIX_EDEFAULT;
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER__SPECIFIC:
+				return specific != null && !specific.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (symbol: ");
+		result.append(symbol);
+		result.append(", fix: ");
+		result.append(fix);
+		result.append(", specific: ");
+		result.append(specific);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ValueExpressionPrettyPrinterImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ValuePrintableExpressionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ValuePrintableExpressionImpl.java
new file mode 100644
index 0000000..2468fb2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/impl/ValuePrintableExpressionImpl.java
@@ -0,0 +1,298 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter;
+import org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Value Printable Expression</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValuePrintableExpressionImpl#getSymbol <em>Symbol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValuePrintableExpressionImpl#getPrinter <em>Printer</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.expression.impl.ValuePrintableExpressionImpl#getOperand <em>Operand</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ValuePrintableExpressionImpl extends ExpressionImpl implements ValuePrintableExpression {
+	/**
+	 * The default value of the '{@link #getSymbol() <em>Symbol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSymbol()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String SYMBOL_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getSymbol() <em>Symbol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSymbol()
+	 * @generated
+	 * @ordered
+	 */
+	protected String symbol = SYMBOL_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getPrinter() <em>Printer</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPrinter()
+	 * @generated
+	 * @ordered
+	 */
+	protected ValueExpressionPrettyPrinter printer;
+
+	/**
+	 * The cached value of the '{@link #getOperand() <em>Operand</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> operand;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ValuePrintableExpressionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ExpressionPackage.Literals.VALUE_PRINTABLE_EXPRESSION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getSymbol() {
+		return symbol;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSymbol(String newSymbol) {
+		String oldSymbol = symbol;
+		symbol = newSymbol;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__SYMBOL, oldSymbol, symbol));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValueExpressionPrettyPrinter getPrinter() {
+		return printer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetPrinter(ValueExpressionPrettyPrinter newPrinter, NotificationChain msgs) {
+		ValueExpressionPrettyPrinter oldPrinter = printer;
+		printer = newPrinter;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__PRINTER, oldPrinter, newPrinter);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPrinter(ValueExpressionPrettyPrinter newPrinter) {
+		if (newPrinter != printer) {
+			NotificationChain msgs = null;
+			if (printer != null)
+				msgs = ((InternalEObject)printer).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__PRINTER, null, msgs);
+			if (newPrinter != null)
+				msgs = ((InternalEObject)newPrinter).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__PRINTER, null, msgs);
+			msgs = basicSetPrinter(newPrinter, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__PRINTER, newPrinter, newPrinter));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getOperand() {
+		if (operand == null) {
+			operand = new EObjectContainmentEList<Expression>(Expression.class, this, ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__OPERAND);
+		}
+		return operand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__PRINTER:
+				return basicSetPrinter(null, msgs);
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__OPERAND:
+				return ((InternalEList<?>)getOperand()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__SYMBOL:
+				return getSymbol();
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__PRINTER:
+				return getPrinter();
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__OPERAND:
+				return getOperand();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__SYMBOL:
+				setSymbol((String)newValue);
+				return;
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__PRINTER:
+				setPrinter((ValueExpressionPrettyPrinter)newValue);
+				return;
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__OPERAND:
+				getOperand().clear();
+				getOperand().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__SYMBOL:
+				setSymbol(SYMBOL_EDEFAULT);
+				return;
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__PRINTER:
+				setPrinter((ValueExpressionPrettyPrinter)null);
+				return;
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__OPERAND:
+				getOperand().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__SYMBOL:
+				return SYMBOL_EDEFAULT == null ? symbol != null : !SYMBOL_EDEFAULT.equals(symbol);
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__PRINTER:
+				return printer != null;
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION__OPERAND:
+				return operand != null && !operand.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (symbol: ");
+		result.append(symbol);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ValuePrintableExpressionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/util/ExpressionAdapterFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/util/ExpressionAdapterFactory.java
new file mode 100644
index 0000000..3bceef4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/util/ExpressionAdapterFactory.java
@@ -0,0 +1,1122 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.util;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+
+import org.eclipse.efm.ecore.formalml.expression.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage
+ * @generated
+ */
+public class ExpressionAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static ExpressionPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = ExpressionPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExpressionSwitch<Adapter> modelSwitch =
+		new ExpressionSwitch<Adapter>() {
+			@Override
+			public Adapter caseValueExpressionPrettyPrinter(ValueExpressionPrettyPrinter object) {
+				return createValueExpressionPrettyPrinterAdapter();
+			}
+			@Override
+			public Adapter caseValuePrintableExpression(ValuePrintableExpression object) {
+				return createValuePrintableExpressionAdapter();
+			}
+			@Override
+			public Adapter caseExpression(Expression object) {
+				return createExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralExpression(LiteralExpression object) {
+				return createLiteralExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralBooleanExpression(LiteralBooleanExpression object) {
+				return createLiteralBooleanExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralIntegerExpression(LiteralIntegerExpression object) {
+				return createLiteralIntegerExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralRationalExpression(LiteralRationalExpression object) {
+				return createLiteralRationalExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralFloatExpression(LiteralFloatExpression object) {
+				return createLiteralFloatExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralRealExpression(LiteralRealExpression object) {
+				return createLiteralRealExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralCharacterExpression(LiteralCharacterExpression object) {
+				return createLiteralCharacterExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralStringExpression(LiteralStringExpression object) {
+				return createLiteralStringExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralCollectionExpression(LiteralCollectionExpression object) {
+				return createLiteralCollectionExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralNullExpression(LiteralNullExpression object) {
+				return createLiteralNullExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralReferenceExpression(LiteralReferenceExpression object) {
+				return createLiteralReferenceExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralReferenceElement(LiteralReferenceElement object) {
+				return createLiteralReferenceElementAdapter();
+			}
+			@Override
+			public Adapter caseLiteralThisExpression(LiteralThisExpression object) {
+				return createLiteralThisExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralSelfExpression(LiteralSelfExpression object) {
+				return createLiteralSelfExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralParentExpression(LiteralParentExpression object) {
+				return createLiteralParentExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralSuperExpression(LiteralSuperExpression object) {
+				return createLiteralSuperExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralSystemExpression(LiteralSystemExpression object) {
+				return createLiteralSystemExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralEnvExpression(LiteralEnvExpression object) {
+				return createLiteralEnvExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralTimeExpression(LiteralTimeExpression object) {
+				return createLiteralTimeExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLiteralTimeDeltaExpression(LiteralTimeDeltaExpression object) {
+				return createLiteralTimeDeltaExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLeftHandSideExpression(LeftHandSideExpression object) {
+				return createLeftHandSideExpressionAdapter();
+			}
+			@Override
+			public Adapter caseIncrementOrDecrementExpression(IncrementOrDecrementExpression object) {
+				return createIncrementOrDecrementExpressionAdapter();
+			}
+			@Override
+			public Adapter caseIncrementOrDecrementPrefixExpression(IncrementOrDecrementPrefixExpression object) {
+				return createIncrementOrDecrementPrefixExpressionAdapter();
+			}
+			@Override
+			public Adapter caseIncrementOrDecrementPostfixExpression(IncrementOrDecrementPostfixExpression object) {
+				return createIncrementOrDecrementPostfixExpressionAdapter();
+			}
+			@Override
+			public Adapter caseAssignmentExpression(AssignmentExpression object) {
+				return createAssignmentExpressionAdapter();
+			}
+			@Override
+			public Adapter caseNewfreshExpression(NewfreshExpression object) {
+				return createNewfreshExpressionAdapter();
+			}
+			@Override
+			public Adapter caseUnaryExpression(UnaryExpression object) {
+				return createUnaryExpressionAdapter();
+			}
+			@Override
+			public Adapter caseBitwiseUnaryExpression(BitwiseUnaryExpression object) {
+				return createBitwiseUnaryExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLogicalUnaryExpression(LogicalUnaryExpression object) {
+				return createLogicalUnaryExpressionAdapter();
+			}
+			@Override
+			public Adapter caseCastExpression(CastExpression object) {
+				return createCastExpressionAdapter();
+			}
+			@Override
+			public Adapter caseArithmeticUnaryExpression(ArithmeticUnaryExpression object) {
+				return createArithmeticUnaryExpressionAdapter();
+			}
+			@Override
+			public Adapter caseBinaryExpression(BinaryExpression object) {
+				return createBinaryExpressionAdapter();
+			}
+			@Override
+			public Adapter caseEqualityBinaryExpression(EqualityBinaryExpression object) {
+				return createEqualityBinaryExpressionAdapter();
+			}
+			@Override
+			public Adapter caseRelationalBinaryExpression(RelationalBinaryExpression object) {
+				return createRelationalBinaryExpressionAdapter();
+			}
+			@Override
+			public Adapter caseRelationalTernaryExpression(RelationalTernaryExpression object) {
+				return createRelationalTernaryExpressionAdapter();
+			}
+			@Override
+			public Adapter caseConditionalTestExpression(ConditionalTestExpression object) {
+				return createConditionalTestExpressionAdapter();
+			}
+			@Override
+			public Adapter caseAssociativeExpression(AssociativeExpression object) {
+				return createAssociativeExpressionAdapter();
+			}
+			@Override
+			public Adapter caseArithmeticAssociativeExpression(ArithmeticAssociativeExpression object) {
+				return createArithmeticAssociativeExpressionAdapter();
+			}
+			@Override
+			public Adapter caseBitwiseAssociativeExpression(BitwiseAssociativeExpression object) {
+				return createBitwiseAssociativeExpressionAdapter();
+			}
+			@Override
+			public Adapter caseLogicalAssociativeExpression(LogicalAssociativeExpression object) {
+				return createLogicalAssociativeExpressionAdapter();
+			}
+			@Override
+			public Adapter caseInvokeExpression(InvokeExpression object) {
+				return createInvokeExpressionAdapter();
+			}
+			@Override
+			public Adapter caseNamedExpression(NamedExpression object) {
+				return createNamedExpressionAdapter();
+			}
+			@Override
+			public Adapter caseTupleExpression(TupleExpression object) {
+				return createTupleExpressionAdapter();
+			}
+			@Override
+			public Adapter caseMixTupleExpression(MixTupleExpression object) {
+				return createMixTupleExpressionAdapter();
+			}
+			@Override
+			public Adapter caseNamedTupleExpression(NamedTupleExpression object) {
+				return createNamedTupleExpressionAdapter();
+			}
+			@Override
+			public Adapter casePositionalTupleExpression(PositionalTupleExpression object) {
+				return createPositionalTupleExpressionAdapter();
+			}
+			@Override
+			public Adapter caseValueElementSpecification(ValueElementSpecification object) {
+				return createValueElementSpecificationAdapter();
+			}
+			@Override
+			public Adapter caseInstantiationExpression(InstantiationExpression object) {
+				return createInstantiationExpressionAdapter();
+			}
+			@Override
+			public Adapter caseExpressionAsBuffer(ExpressionAsBuffer object) {
+				return createExpressionAsBufferAdapter();
+			}
+			@Override
+			public Adapter caseExpressionAsChannel(ExpressionAsChannel object) {
+				return createExpressionAsChannelAdapter();
+			}
+			@Override
+			public Adapter caseExpressionAsMachine(ExpressionAsMachine object) {
+				return createExpressionAsMachineAdapter();
+			}
+			@Override
+			public Adapter caseExpressionAsPort(ExpressionAsPort object) {
+				return createExpressionAsPortAdapter();
+			}
+			@Override
+			public Adapter caseAbstractElement(AbstractElement object) {
+				return createAbstractElementAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter <em>Value Expression Pretty Printer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter
+	 * @generated
+	 */
+	public Adapter createValueExpressionPrettyPrinterAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression <em>Value Printable Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression
+	 * @generated
+	 */
+	public Adapter createValuePrintableExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.Expression <em>Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.Expression
+	 * @generated
+	 */
+	public Adapter createExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralExpression <em>Literal Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralExpression
+	 * @generated
+	 */
+	public Adapter createLiteralExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression <em>Literal Boolean Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression
+	 * @generated
+	 */
+	public Adapter createLiteralBooleanExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression <em>Literal Integer Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression
+	 * @generated
+	 */
+	public Adapter createLiteralIntegerExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression <em>Literal Rational Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression
+	 * @generated
+	 */
+	public Adapter createLiteralRationalExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression <em>Literal Float Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression
+	 * @generated
+	 */
+	public Adapter createLiteralFloatExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression <em>Literal Real Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression
+	 * @generated
+	 */
+	public Adapter createLiteralRealExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression <em>Literal Character Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression
+	 * @generated
+	 */
+	public Adapter createLiteralCharacterExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression <em>Literal String Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression
+	 * @generated
+	 */
+	public Adapter createLiteralStringExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression <em>Literal Collection Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression
+	 * @generated
+	 */
+	public Adapter createLiteralCollectionExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression <em>Literal Null Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression
+	 * @generated
+	 */
+	public Adapter createLiteralNullExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceExpression <em>Literal Reference Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralReferenceExpression
+	 * @generated
+	 */
+	public Adapter createLiteralReferenceExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement <em>Literal Reference Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement
+	 * @generated
+	 */
+	public Adapter createLiteralReferenceElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression <em>Literal This Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression
+	 * @generated
+	 */
+	public Adapter createLiteralThisExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression <em>Literal Self Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression
+	 * @generated
+	 */
+	public Adapter createLiteralSelfExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression <em>Literal Parent Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression
+	 * @generated
+	 */
+	public Adapter createLiteralParentExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression <em>Literal Super Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression
+	 * @generated
+	 */
+	public Adapter createLiteralSuperExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression <em>Literal System Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression
+	 * @generated
+	 */
+	public Adapter createLiteralSystemExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression <em>Literal Env Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression
+	 * @generated
+	 */
+	public Adapter createLiteralEnvExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralTimeExpression <em>Literal Time Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralTimeExpression
+	 * @generated
+	 */
+	public Adapter createLiteralTimeExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LiteralTimeDeltaExpression <em>Literal Time Delta Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LiteralTimeDeltaExpression
+	 * @generated
+	 */
+	public Adapter createLiteralTimeDeltaExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression <em>Left Hand Side Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression
+	 * @generated
+	 */
+	public Adapter createLeftHandSideExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression <em>Increment Or Decrement Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression
+	 * @generated
+	 */
+	public Adapter createIncrementOrDecrementExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPrefixExpression <em>Increment Or Decrement Prefix Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPrefixExpression
+	 * @generated
+	 */
+	public Adapter createIncrementOrDecrementPrefixExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPostfixExpression <em>Increment Or Decrement Postfix Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPostfixExpression
+	 * @generated
+	 */
+	public Adapter createIncrementOrDecrementPostfixExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression <em>Assignment Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.AssignmentExpression
+	 * @generated
+	 */
+	public Adapter createAssignmentExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.NewfreshExpression <em>Newfresh Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NewfreshExpression
+	 * @generated
+	 */
+	public Adapter createNewfreshExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.UnaryExpression <em>Unary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.UnaryExpression
+	 * @generated
+	 */
+	public Adapter createUnaryExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.BitwiseUnaryExpression <em>Bitwise Unary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.BitwiseUnaryExpression
+	 * @generated
+	 */
+	public Adapter createBitwiseUnaryExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression <em>Logical Unary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression
+	 * @generated
+	 */
+	public Adapter createLogicalUnaryExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.CastExpression <em>Cast Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.CastExpression
+	 * @generated
+	 */
+	public Adapter createCastExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression <em>Arithmetic Unary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression
+	 * @generated
+	 */
+	public Adapter createArithmeticUnaryExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression <em>Binary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.BinaryExpression
+	 * @generated
+	 */
+	public Adapter createBinaryExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.EqualityBinaryExpression <em>Equality Binary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.EqualityBinaryExpression
+	 * @generated
+	 */
+	public Adapter createEqualityBinaryExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression <em>Relational Binary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression
+	 * @generated
+	 */
+	public Adapter createRelationalBinaryExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression <em>Relational Ternary Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression
+	 * @generated
+	 */
+	public Adapter createRelationalTernaryExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression <em>Conditional Test Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression
+	 * @generated
+	 */
+	public Adapter createConditionalTestExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.AssociativeExpression <em>Associative Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.AssociativeExpression
+	 * @generated
+	 */
+	public Adapter createAssociativeExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression <em>Arithmetic Associative Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression
+	 * @generated
+	 */
+	public Adapter createArithmeticAssociativeExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.BitwiseAssociativeExpression <em>Bitwise Associative Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.BitwiseAssociativeExpression
+	 * @generated
+	 */
+	public Adapter createBitwiseAssociativeExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression <em>Logical Associative Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression
+	 * @generated
+	 */
+	public Adapter createLogicalAssociativeExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression <em>Invoke Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.InvokeExpression
+	 * @generated
+	 */
+	public Adapter createInvokeExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.NamedExpression <em>Named Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NamedExpression
+	 * @generated
+	 */
+	public Adapter createNamedExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.TupleExpression <em>Tuple Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.TupleExpression
+	 * @generated
+	 */
+	public Adapter createTupleExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.MixTupleExpression <em>Mix Tuple Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.MixTupleExpression
+	 * @generated
+	 */
+	public Adapter createMixTupleExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression <em>Named Tuple Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression
+	 * @generated
+	 */
+	public Adapter createNamedTupleExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression <em>Positional Tuple Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression
+	 * @generated
+	 */
+	public Adapter createPositionalTupleExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification <em>Value Element Specification</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification
+	 * @generated
+	 */
+	public Adapter createValueElementSpecificationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.InstantiationExpression <em>Instantiation Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.InstantiationExpression
+	 * @generated
+	 */
+	public Adapter createInstantiationExpressionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer <em>As Buffer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer
+	 * @generated
+	 */
+	public Adapter createExpressionAsBufferAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel <em>As Channel</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel
+	 * @generated
+	 */
+	public Adapter createExpressionAsChannelAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine <em>As Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine
+	 * @generated
+	 */
+	public Adapter createExpressionAsMachineAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort <em>As Port</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort
+	 * @generated
+	 */
+	public Adapter createExpressionAsPortAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.AbstractElement <em>Abstract Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.AbstractElement
+	 * @generated
+	 */
+	public Adapter createAbstractElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //ExpressionAdapterFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/util/ExpressionSwitch.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/util/ExpressionSwitch.java
new file mode 100644
index 0000000..199d497
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/util/ExpressionSwitch.java
@@ -0,0 +1,1412 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.expression.util;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+
+import org.eclipse.efm.ecore.formalml.expression.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.expression.ExpressionPackage
+ * @generated
+ */
+public class ExpressionSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static ExpressionPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionSwitch() {
+		if (modelPackage == null) {
+			modelPackage = ExpressionPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case ExpressionPackage.VALUE_EXPRESSION_PRETTY_PRINTER: {
+				ValueExpressionPrettyPrinter valueExpressionPrettyPrinter = (ValueExpressionPrettyPrinter)theEObject;
+				T result = caseValueExpressionPrettyPrinter(valueExpressionPrettyPrinter);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.VALUE_PRINTABLE_EXPRESSION: {
+				ValuePrintableExpression valuePrintableExpression = (ValuePrintableExpression)theEObject;
+				T result = caseValuePrintableExpression(valuePrintableExpression);
+				if (result == null) result = caseExpression(valuePrintableExpression);
+				if (result == null) result = caseAbstractElement(valuePrintableExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.EXPRESSION: {
+				Expression expression = (Expression)theEObject;
+				T result = caseExpression(expression);
+				if (result == null) result = caseAbstractElement(expression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_EXPRESSION: {
+				LiteralExpression literalExpression = (LiteralExpression)theEObject;
+				T result = caseLiteralExpression(literalExpression);
+				if (result == null) result = caseExpression(literalExpression);
+				if (result == null) result = caseAbstractElement(literalExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_BOOLEAN_EXPRESSION: {
+				LiteralBooleanExpression literalBooleanExpression = (LiteralBooleanExpression)theEObject;
+				T result = caseLiteralBooleanExpression(literalBooleanExpression);
+				if (result == null) result = caseLiteralExpression(literalBooleanExpression);
+				if (result == null) result = caseExpression(literalBooleanExpression);
+				if (result == null) result = caseAbstractElement(literalBooleanExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_INTEGER_EXPRESSION: {
+				LiteralIntegerExpression literalIntegerExpression = (LiteralIntegerExpression)theEObject;
+				T result = caseLiteralIntegerExpression(literalIntegerExpression);
+				if (result == null) result = caseLiteralExpression(literalIntegerExpression);
+				if (result == null) result = caseExpression(literalIntegerExpression);
+				if (result == null) result = caseAbstractElement(literalIntegerExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION: {
+				LiteralRationalExpression literalRationalExpression = (LiteralRationalExpression)theEObject;
+				T result = caseLiteralRationalExpression(literalRationalExpression);
+				if (result == null) result = caseLiteralExpression(literalRationalExpression);
+				if (result == null) result = caseExpression(literalRationalExpression);
+				if (result == null) result = caseAbstractElement(literalRationalExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_FLOAT_EXPRESSION: {
+				LiteralFloatExpression literalFloatExpression = (LiteralFloatExpression)theEObject;
+				T result = caseLiteralFloatExpression(literalFloatExpression);
+				if (result == null) result = caseLiteralExpression(literalFloatExpression);
+				if (result == null) result = caseExpression(literalFloatExpression);
+				if (result == null) result = caseAbstractElement(literalFloatExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_REAL_EXPRESSION: {
+				LiteralRealExpression literalRealExpression = (LiteralRealExpression)theEObject;
+				T result = caseLiteralRealExpression(literalRealExpression);
+				if (result == null) result = caseLiteralExpression(literalRealExpression);
+				if (result == null) result = caseExpression(literalRealExpression);
+				if (result == null) result = caseAbstractElement(literalRealExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_CHARACTER_EXPRESSION: {
+				LiteralCharacterExpression literalCharacterExpression = (LiteralCharacterExpression)theEObject;
+				T result = caseLiteralCharacterExpression(literalCharacterExpression);
+				if (result == null) result = caseLiteralExpression(literalCharacterExpression);
+				if (result == null) result = caseExpression(literalCharacterExpression);
+				if (result == null) result = caseAbstractElement(literalCharacterExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_STRING_EXPRESSION: {
+				LiteralStringExpression literalStringExpression = (LiteralStringExpression)theEObject;
+				T result = caseLiteralStringExpression(literalStringExpression);
+				if (result == null) result = caseLiteralExpression(literalStringExpression);
+				if (result == null) result = caseExpression(literalStringExpression);
+				if (result == null) result = caseAbstractElement(literalStringExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION: {
+				LiteralCollectionExpression literalCollectionExpression = (LiteralCollectionExpression)theEObject;
+				T result = caseLiteralCollectionExpression(literalCollectionExpression);
+				if (result == null) result = caseLiteralExpression(literalCollectionExpression);
+				if (result == null) result = caseExpression(literalCollectionExpression);
+				if (result == null) result = caseAbstractElement(literalCollectionExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_NULL_EXPRESSION: {
+				LiteralNullExpression literalNullExpression = (LiteralNullExpression)theEObject;
+				T result = caseLiteralNullExpression(literalNullExpression);
+				if (result == null) result = caseLiteralExpression(literalNullExpression);
+				if (result == null) result = caseExpression(literalNullExpression);
+				if (result == null) result = caseAbstractElement(literalNullExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_REFERENCE_EXPRESSION: {
+				LiteralReferenceExpression literalReferenceExpression = (LiteralReferenceExpression)theEObject;
+				T result = caseLiteralReferenceExpression(literalReferenceExpression);
+				if (result == null) result = caseLiteralExpression(literalReferenceExpression);
+				if (result == null) result = caseExpression(literalReferenceExpression);
+				if (result == null) result = caseAbstractElement(literalReferenceExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT: {
+				LiteralReferenceElement literalReferenceElement = (LiteralReferenceElement)theEObject;
+				T result = caseLiteralReferenceElement(literalReferenceElement);
+				if (result == null) result = caseLiteralReferenceExpression(literalReferenceElement);
+				if (result == null) result = caseLiteralExpression(literalReferenceElement);
+				if (result == null) result = caseExpression(literalReferenceElement);
+				if (result == null) result = caseAbstractElement(literalReferenceElement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_THIS_EXPRESSION: {
+				LiteralThisExpression literalThisExpression = (LiteralThisExpression)theEObject;
+				T result = caseLiteralThisExpression(literalThisExpression);
+				if (result == null) result = caseLiteralReferenceExpression(literalThisExpression);
+				if (result == null) result = caseLiteralExpression(literalThisExpression);
+				if (result == null) result = caseExpression(literalThisExpression);
+				if (result == null) result = caseAbstractElement(literalThisExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_SELF_EXPRESSION: {
+				LiteralSelfExpression literalSelfExpression = (LiteralSelfExpression)theEObject;
+				T result = caseLiteralSelfExpression(literalSelfExpression);
+				if (result == null) result = caseLiteralReferenceExpression(literalSelfExpression);
+				if (result == null) result = caseLiteralExpression(literalSelfExpression);
+				if (result == null) result = caseExpression(literalSelfExpression);
+				if (result == null) result = caseAbstractElement(literalSelfExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_PARENT_EXPRESSION: {
+				LiteralParentExpression literalParentExpression = (LiteralParentExpression)theEObject;
+				T result = caseLiteralParentExpression(literalParentExpression);
+				if (result == null) result = caseLiteralReferenceExpression(literalParentExpression);
+				if (result == null) result = caseLiteralExpression(literalParentExpression);
+				if (result == null) result = caseExpression(literalParentExpression);
+				if (result == null) result = caseAbstractElement(literalParentExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_SUPER_EXPRESSION: {
+				LiteralSuperExpression literalSuperExpression = (LiteralSuperExpression)theEObject;
+				T result = caseLiteralSuperExpression(literalSuperExpression);
+				if (result == null) result = caseLiteralReferenceExpression(literalSuperExpression);
+				if (result == null) result = caseLiteralExpression(literalSuperExpression);
+				if (result == null) result = caseExpression(literalSuperExpression);
+				if (result == null) result = caseAbstractElement(literalSuperExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_SYSTEM_EXPRESSION: {
+				LiteralSystemExpression literalSystemExpression = (LiteralSystemExpression)theEObject;
+				T result = caseLiteralSystemExpression(literalSystemExpression);
+				if (result == null) result = caseLiteralReferenceExpression(literalSystemExpression);
+				if (result == null) result = caseLiteralExpression(literalSystemExpression);
+				if (result == null) result = caseExpression(literalSystemExpression);
+				if (result == null) result = caseAbstractElement(literalSystemExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_ENV_EXPRESSION: {
+				LiteralEnvExpression literalEnvExpression = (LiteralEnvExpression)theEObject;
+				T result = caseLiteralEnvExpression(literalEnvExpression);
+				if (result == null) result = caseLiteralReferenceExpression(literalEnvExpression);
+				if (result == null) result = caseLiteralExpression(literalEnvExpression);
+				if (result == null) result = caseExpression(literalEnvExpression);
+				if (result == null) result = caseAbstractElement(literalEnvExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_TIME_EXPRESSION: {
+				LiteralTimeExpression literalTimeExpression = (LiteralTimeExpression)theEObject;
+				T result = caseLiteralTimeExpression(literalTimeExpression);
+				if (result == null) result = caseLiteralReferenceExpression(literalTimeExpression);
+				if (result == null) result = caseLiteralExpression(literalTimeExpression);
+				if (result == null) result = caseExpression(literalTimeExpression);
+				if (result == null) result = caseAbstractElement(literalTimeExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LITERAL_TIME_DELTA_EXPRESSION: {
+				LiteralTimeDeltaExpression literalTimeDeltaExpression = (LiteralTimeDeltaExpression)theEObject;
+				T result = caseLiteralTimeDeltaExpression(literalTimeDeltaExpression);
+				if (result == null) result = caseLiteralReferenceExpression(literalTimeDeltaExpression);
+				if (result == null) result = caseLiteralExpression(literalTimeDeltaExpression);
+				if (result == null) result = caseExpression(literalTimeDeltaExpression);
+				if (result == null) result = caseAbstractElement(literalTimeDeltaExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION: {
+				LeftHandSideExpression leftHandSideExpression = (LeftHandSideExpression)theEObject;
+				T result = caseLeftHandSideExpression(leftHandSideExpression);
+				if (result == null) result = caseExpression(leftHandSideExpression);
+				if (result == null) result = caseAbstractElement(leftHandSideExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_EXPRESSION: {
+				IncrementOrDecrementExpression incrementOrDecrementExpression = (IncrementOrDecrementExpression)theEObject;
+				T result = caseIncrementOrDecrementExpression(incrementOrDecrementExpression);
+				if (result == null) result = caseExpression(incrementOrDecrementExpression);
+				if (result == null) result = caseAbstractElement(incrementOrDecrementExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION: {
+				IncrementOrDecrementPrefixExpression incrementOrDecrementPrefixExpression = (IncrementOrDecrementPrefixExpression)theEObject;
+				T result = caseIncrementOrDecrementPrefixExpression(incrementOrDecrementPrefixExpression);
+				if (result == null) result = caseIncrementOrDecrementExpression(incrementOrDecrementPrefixExpression);
+				if (result == null) result = caseExpression(incrementOrDecrementPrefixExpression);
+				if (result == null) result = caseAbstractElement(incrementOrDecrementPrefixExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION: {
+				IncrementOrDecrementPostfixExpression incrementOrDecrementPostfixExpression = (IncrementOrDecrementPostfixExpression)theEObject;
+				T result = caseIncrementOrDecrementPostfixExpression(incrementOrDecrementPostfixExpression);
+				if (result == null) result = caseIncrementOrDecrementExpression(incrementOrDecrementPostfixExpression);
+				if (result == null) result = caseExpression(incrementOrDecrementPostfixExpression);
+				if (result == null) result = caseAbstractElement(incrementOrDecrementPostfixExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION: {
+				AssignmentExpression assignmentExpression = (AssignmentExpression)theEObject;
+				T result = caseAssignmentExpression(assignmentExpression);
+				if (result == null) result = caseExpression(assignmentExpression);
+				if (result == null) result = caseAbstractElement(assignmentExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.NEWFRESH_EXPRESSION: {
+				NewfreshExpression newfreshExpression = (NewfreshExpression)theEObject;
+				T result = caseNewfreshExpression(newfreshExpression);
+				if (result == null) result = caseExpression(newfreshExpression);
+				if (result == null) result = caseAbstractElement(newfreshExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.UNARY_EXPRESSION: {
+				UnaryExpression unaryExpression = (UnaryExpression)theEObject;
+				T result = caseUnaryExpression(unaryExpression);
+				if (result == null) result = caseExpression(unaryExpression);
+				if (result == null) result = caseAbstractElement(unaryExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.BITWISE_UNARY_EXPRESSION: {
+				BitwiseUnaryExpression bitwiseUnaryExpression = (BitwiseUnaryExpression)theEObject;
+				T result = caseBitwiseUnaryExpression(bitwiseUnaryExpression);
+				if (result == null) result = caseUnaryExpression(bitwiseUnaryExpression);
+				if (result == null) result = caseExpression(bitwiseUnaryExpression);
+				if (result == null) result = caseAbstractElement(bitwiseUnaryExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LOGICAL_UNARY_EXPRESSION: {
+				LogicalUnaryExpression logicalUnaryExpression = (LogicalUnaryExpression)theEObject;
+				T result = caseLogicalUnaryExpression(logicalUnaryExpression);
+				if (result == null) result = caseUnaryExpression(logicalUnaryExpression);
+				if (result == null) result = caseExpression(logicalUnaryExpression);
+				if (result == null) result = caseAbstractElement(logicalUnaryExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.CAST_EXPRESSION: {
+				CastExpression castExpression = (CastExpression)theEObject;
+				T result = caseCastExpression(castExpression);
+				if (result == null) result = caseUnaryExpression(castExpression);
+				if (result == null) result = caseExpression(castExpression);
+				if (result == null) result = caseAbstractElement(castExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.ARITHMETIC_UNARY_EXPRESSION: {
+				ArithmeticUnaryExpression arithmeticUnaryExpression = (ArithmeticUnaryExpression)theEObject;
+				T result = caseArithmeticUnaryExpression(arithmeticUnaryExpression);
+				if (result == null) result = caseUnaryExpression(arithmeticUnaryExpression);
+				if (result == null) result = caseExpression(arithmeticUnaryExpression);
+				if (result == null) result = caseAbstractElement(arithmeticUnaryExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.BINARY_EXPRESSION: {
+				BinaryExpression binaryExpression = (BinaryExpression)theEObject;
+				T result = caseBinaryExpression(binaryExpression);
+				if (result == null) result = caseExpression(binaryExpression);
+				if (result == null) result = caseAbstractElement(binaryExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.EQUALITY_BINARY_EXPRESSION: {
+				EqualityBinaryExpression equalityBinaryExpression = (EqualityBinaryExpression)theEObject;
+				T result = caseEqualityBinaryExpression(equalityBinaryExpression);
+				if (result == null) result = caseBinaryExpression(equalityBinaryExpression);
+				if (result == null) result = caseExpression(equalityBinaryExpression);
+				if (result == null) result = caseAbstractElement(equalityBinaryExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.RELATIONAL_BINARY_EXPRESSION: {
+				RelationalBinaryExpression relationalBinaryExpression = (RelationalBinaryExpression)theEObject;
+				T result = caseRelationalBinaryExpression(relationalBinaryExpression);
+				if (result == null) result = caseBinaryExpression(relationalBinaryExpression);
+				if (result == null) result = caseExpression(relationalBinaryExpression);
+				if (result == null) result = caseAbstractElement(relationalBinaryExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION: {
+				RelationalTernaryExpression relationalTernaryExpression = (RelationalTernaryExpression)theEObject;
+				T result = caseRelationalTernaryExpression(relationalTernaryExpression);
+				if (result == null) result = caseExpression(relationalTernaryExpression);
+				if (result == null) result = caseAbstractElement(relationalTernaryExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION: {
+				ConditionalTestExpression conditionalTestExpression = (ConditionalTestExpression)theEObject;
+				T result = caseConditionalTestExpression(conditionalTestExpression);
+				if (result == null) result = caseExpression(conditionalTestExpression);
+				if (result == null) result = caseAbstractElement(conditionalTestExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.ASSOCIATIVE_EXPRESSION: {
+				AssociativeExpression associativeExpression = (AssociativeExpression)theEObject;
+				T result = caseAssociativeExpression(associativeExpression);
+				if (result == null) result = caseExpression(associativeExpression);
+				if (result == null) result = caseAbstractElement(associativeExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.ARITHMETIC_ASSOCIATIVE_EXPRESSION: {
+				ArithmeticAssociativeExpression arithmeticAssociativeExpression = (ArithmeticAssociativeExpression)theEObject;
+				T result = caseArithmeticAssociativeExpression(arithmeticAssociativeExpression);
+				if (result == null) result = caseAssociativeExpression(arithmeticAssociativeExpression);
+				if (result == null) result = caseExpression(arithmeticAssociativeExpression);
+				if (result == null) result = caseAbstractElement(arithmeticAssociativeExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.BITWISE_ASSOCIATIVE_EXPRESSION: {
+				BitwiseAssociativeExpression bitwiseAssociativeExpression = (BitwiseAssociativeExpression)theEObject;
+				T result = caseBitwiseAssociativeExpression(bitwiseAssociativeExpression);
+				if (result == null) result = caseAssociativeExpression(bitwiseAssociativeExpression);
+				if (result == null) result = caseExpression(bitwiseAssociativeExpression);
+				if (result == null) result = caseAbstractElement(bitwiseAssociativeExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.LOGICAL_ASSOCIATIVE_EXPRESSION: {
+				LogicalAssociativeExpression logicalAssociativeExpression = (LogicalAssociativeExpression)theEObject;
+				T result = caseLogicalAssociativeExpression(logicalAssociativeExpression);
+				if (result == null) result = caseAssociativeExpression(logicalAssociativeExpression);
+				if (result == null) result = caseExpression(logicalAssociativeExpression);
+				if (result == null) result = caseAbstractElement(logicalAssociativeExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.INVOKE_EXPRESSION: {
+				InvokeExpression invokeExpression = (InvokeExpression)theEObject;
+				T result = caseInvokeExpression(invokeExpression);
+				if (result == null) result = caseExpression(invokeExpression);
+				if (result == null) result = caseAbstractElement(invokeExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.NAMED_EXPRESSION: {
+				NamedExpression namedExpression = (NamedExpression)theEObject;
+				T result = caseNamedExpression(namedExpression);
+				if (result == null) result = caseExpression(namedExpression);
+				if (result == null) result = caseAbstractElement(namedExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.TUPLE_EXPRESSION: {
+				TupleExpression tupleExpression = (TupleExpression)theEObject;
+				T result = caseTupleExpression(tupleExpression);
+				if (result == null) result = caseExpression(tupleExpression);
+				if (result == null) result = caseAbstractElement(tupleExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.MIX_TUPLE_EXPRESSION: {
+				MixTupleExpression mixTupleExpression = (MixTupleExpression)theEObject;
+				T result = caseMixTupleExpression(mixTupleExpression);
+				if (result == null) result = caseTupleExpression(mixTupleExpression);
+				if (result == null) result = caseExpression(mixTupleExpression);
+				if (result == null) result = caseAbstractElement(mixTupleExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.NAMED_TUPLE_EXPRESSION: {
+				NamedTupleExpression namedTupleExpression = (NamedTupleExpression)theEObject;
+				T result = caseNamedTupleExpression(namedTupleExpression);
+				if (result == null) result = caseTupleExpression(namedTupleExpression);
+				if (result == null) result = caseExpression(namedTupleExpression);
+				if (result == null) result = caseAbstractElement(namedTupleExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.POSITIONAL_TUPLE_EXPRESSION: {
+				PositionalTupleExpression positionalTupleExpression = (PositionalTupleExpression)theEObject;
+				T result = casePositionalTupleExpression(positionalTupleExpression);
+				if (result == null) result = caseTupleExpression(positionalTupleExpression);
+				if (result == null) result = caseExpression(positionalTupleExpression);
+				if (result == null) result = caseAbstractElement(positionalTupleExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION: {
+				ValueElementSpecification valueElementSpecification = (ValueElementSpecification)theEObject;
+				T result = caseValueElementSpecification(valueElementSpecification);
+				if (result == null) result = caseExpression(valueElementSpecification);
+				if (result == null) result = caseAbstractElement(valueElementSpecification);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.INSTANTIATION_EXPRESSION: {
+				InstantiationExpression instantiationExpression = (InstantiationExpression)theEObject;
+				T result = caseInstantiationExpression(instantiationExpression);
+				if (result == null) result = caseExpression(instantiationExpression);
+				if (result == null) result = caseAbstractElement(instantiationExpression);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.EXPRESSION_AS_BUFFER: {
+				ExpressionAsBuffer expressionAsBuffer = (ExpressionAsBuffer)theEObject;
+				T result = caseExpressionAsBuffer(expressionAsBuffer);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.EXPRESSION_AS_CHANNEL: {
+				ExpressionAsChannel expressionAsChannel = (ExpressionAsChannel)theEObject;
+				T result = caseExpressionAsChannel(expressionAsChannel);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.EXPRESSION_AS_MACHINE: {
+				ExpressionAsMachine expressionAsMachine = (ExpressionAsMachine)theEObject;
+				T result = caseExpressionAsMachine(expressionAsMachine);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ExpressionPackage.EXPRESSION_AS_PORT: {
+				ExpressionAsPort expressionAsPort = (ExpressionAsPort)theEObject;
+				T result = caseExpressionAsPort(expressionAsPort);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Value Expression Pretty Printer</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Value Expression Pretty Printer</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseValueExpressionPrettyPrinter(ValueExpressionPrettyPrinter object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Value Printable Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Value Printable Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseValuePrintableExpression(ValuePrintableExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseExpression(Expression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralExpression(LiteralExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Boolean Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Boolean Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralBooleanExpression(LiteralBooleanExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Integer Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Integer Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralIntegerExpression(LiteralIntegerExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Rational Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Rational Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralRationalExpression(LiteralRationalExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Float Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Float Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralFloatExpression(LiteralFloatExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Real Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Real Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralRealExpression(LiteralRealExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Character Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Character Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralCharacterExpression(LiteralCharacterExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal String Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal String Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralStringExpression(LiteralStringExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Collection Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Collection Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralCollectionExpression(LiteralCollectionExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Null Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Null Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralNullExpression(LiteralNullExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Reference Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Reference Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralReferenceExpression(LiteralReferenceExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Reference Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Reference Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralReferenceElement(LiteralReferenceElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal This Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal This Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralThisExpression(LiteralThisExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Self Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Self Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralSelfExpression(LiteralSelfExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Parent Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Parent Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralParentExpression(LiteralParentExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Super Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Super Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralSuperExpression(LiteralSuperExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal System Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal System Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralSystemExpression(LiteralSystemExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Env Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Env Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralEnvExpression(LiteralEnvExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Time Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Time Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralTimeExpression(LiteralTimeExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Literal Time Delta Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Literal Time Delta Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLiteralTimeDeltaExpression(LiteralTimeDeltaExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Left Hand Side Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Left Hand Side Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLeftHandSideExpression(LeftHandSideExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Increment Or Decrement Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Increment Or Decrement Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseIncrementOrDecrementExpression(IncrementOrDecrementExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Increment Or Decrement Prefix Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Increment Or Decrement Prefix Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseIncrementOrDecrementPrefixExpression(IncrementOrDecrementPrefixExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Increment Or Decrement Postfix Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Increment Or Decrement Postfix Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseIncrementOrDecrementPostfixExpression(IncrementOrDecrementPostfixExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Assignment Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Assignment Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAssignmentExpression(AssignmentExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Newfresh Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Newfresh Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseNewfreshExpression(NewfreshExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Unary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Unary Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseUnaryExpression(UnaryExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Bitwise Unary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Bitwise Unary Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseBitwiseUnaryExpression(BitwiseUnaryExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Logical Unary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Logical Unary Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLogicalUnaryExpression(LogicalUnaryExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Cast Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Cast Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseCastExpression(CastExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Arithmetic Unary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Arithmetic Unary Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseArithmeticUnaryExpression(ArithmeticUnaryExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Binary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Binary Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseBinaryExpression(BinaryExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Equality Binary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Equality Binary Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseEqualityBinaryExpression(EqualityBinaryExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Relational Binary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Relational Binary Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseRelationalBinaryExpression(RelationalBinaryExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Relational Ternary Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Relational Ternary Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseRelationalTernaryExpression(RelationalTernaryExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Conditional Test Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Conditional Test Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseConditionalTestExpression(ConditionalTestExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Associative Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Associative Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAssociativeExpression(AssociativeExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Arithmetic Associative Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Arithmetic Associative Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseArithmeticAssociativeExpression(ArithmeticAssociativeExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Bitwise Associative Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Bitwise Associative Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseBitwiseAssociativeExpression(BitwiseAssociativeExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Logical Associative Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Logical Associative Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseLogicalAssociativeExpression(LogicalAssociativeExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Invoke Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Invoke Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseInvokeExpression(InvokeExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Named Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Named Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseNamedExpression(NamedExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Tuple Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Tuple Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseTupleExpression(TupleExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Mix Tuple Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Mix Tuple Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseMixTupleExpression(MixTupleExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Named Tuple Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Named Tuple Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseNamedTupleExpression(NamedTupleExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Positional Tuple Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Positional Tuple Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePositionalTupleExpression(PositionalTupleExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Value Element Specification</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Value Element Specification</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseValueElementSpecification(ValueElementSpecification object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Instantiation Expression</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Instantiation Expression</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseInstantiationExpression(InstantiationExpression object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>As Buffer</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>As Buffer</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseExpressionAsBuffer(ExpressionAsBuffer object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>As Channel</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>As Channel</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseExpressionAsChannel(ExpressionAsChannel object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>As Machine</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>As Machine</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseExpressionAsMachine(ExpressionAsMachine object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>As Port</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>As Port</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseExpressionAsPort(ExpressionAsPort object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAbstractElement(AbstractElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //ExpressionSwitch
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ArithmeticAssociativeExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ArithmeticAssociativeExpressionValidator.java
new file mode 100644
index 0000000..35a1958
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ArithmeticAssociativeExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ArithmeticAssociativeExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ArithmeticUnaryExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ArithmeticUnaryExpressionValidator.java
new file mode 100644
index 0000000..a7989ee
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ArithmeticUnaryExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ArithmeticUnaryExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/AssignmentExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/AssignmentExpressionValidator.java
new file mode 100644
index 0000000..3633320
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/AssignmentExpressionValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.AssignmentExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface AssignmentExpressionValidator {
+	boolean validate();
+
+	boolean validateOperator(String value);
+	boolean validateLeftHandSide(LeftHandSideExpression value);
+	boolean validateRigthHandSide(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/AssociativeExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/AssociativeExpressionValidator.java
new file mode 100644
index 0000000..dbef922
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/AssociativeExpressionValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.AssociativeExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface AssociativeExpressionValidator {
+	boolean validate();
+
+	boolean validateOperator(String value);
+	boolean validateOperand(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/BinaryExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/BinaryExpressionValidator.java
new file mode 100644
index 0000000..b1de0e5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/BinaryExpressionValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.BinaryExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface BinaryExpressionValidator {
+	boolean validate();
+
+	boolean validateOperator(String value);
+	boolean validateLeftOperand(Expression value);
+	boolean validateRigthOperand(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/BitwiseAssociativeExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/BitwiseAssociativeExpressionValidator.java
new file mode 100644
index 0000000..779bd0e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/BitwiseAssociativeExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.BitwiseAssociativeExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface BitwiseAssociativeExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/BitwiseUnaryExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/BitwiseUnaryExpressionValidator.java
new file mode 100644
index 0000000..3c9cffc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/BitwiseUnaryExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.BitwiseUnaryExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface BitwiseUnaryExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/CastExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/CastExpressionValidator.java
new file mode 100644
index 0000000..6c771ce
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/CastExpressionValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.CastExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface CastExpressionValidator {
+	boolean validate();
+
+	boolean validateDatatype(DataType value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ConditionalTestExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ConditionalTestExpressionValidator.java
new file mode 100644
index 0000000..538d0d8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ConditionalTestExpressionValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ConditionalTestExpressionValidator {
+	boolean validate();
+
+	boolean validateOperator(String value);
+	boolean validateCondition(Expression value);
+	boolean validateThenOperand(Expression value);
+	boolean validateElseOperand(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/EqualityBinaryExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/EqualityBinaryExpressionValidator.java
new file mode 100644
index 0000000..7f3f6b5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/EqualityBinaryExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.EqualityBinaryExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface EqualityBinaryExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsBufferValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsBufferValidator.java
new file mode 100644
index 0000000..7e376cc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsBufferValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsBuffer}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ExpressionAsBufferValidator {
+	boolean validate();
+
+	boolean validateBuffer(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsChannelValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsChannelValidator.java
new file mode 100644
index 0000000..cda98c8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsChannelValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsChannel}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ExpressionAsChannelValidator {
+	boolean validate();
+
+	boolean validateChannel(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsMachineValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsMachineValidator.java
new file mode 100644
index 0000000..46044a6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsMachineValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ExpressionAsMachineValidator {
+	boolean validate();
+
+	boolean validateMachine(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsPortValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsPortValidator.java
new file mode 100644
index 0000000..80aa86e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionAsPortValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ExpressionAsPortValidator {
+	boolean validate();
+
+	boolean validatePort(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionValidator.java
new file mode 100644
index 0000000..3f4c9c7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/IncrementOrDecrementExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/IncrementOrDecrementExpressionValidator.java
new file mode 100644
index 0000000..2551c5f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/IncrementOrDecrementExpressionValidator.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface IncrementOrDecrementExpressionValidator {
+	boolean validate();
+
+	boolean validateOperator(String value);
+	boolean validateLeftHandSide(LeftHandSideExpression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/IncrementOrDecrementPostfixExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/IncrementOrDecrementPostfixExpressionValidator.java
new file mode 100644
index 0000000..bbd774f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/IncrementOrDecrementPostfixExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPostfixExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface IncrementOrDecrementPostfixExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/IncrementOrDecrementPrefixExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/IncrementOrDecrementPrefixExpressionValidator.java
new file mode 100644
index 0000000..97296c9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/IncrementOrDecrementPrefixExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPrefixExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface IncrementOrDecrementPrefixExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/InstantiationExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/InstantiationExpressionValidator.java
new file mode 100644
index 0000000..e87bcba
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/InstantiationExpressionValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.InstantiationExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface InstantiationExpressionValidator {
+	boolean validate();
+
+	boolean validateInstance(InstanceMachine value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/InvokeExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/InvokeExpressionValidator.java
new file mode 100644
index 0000000..ce685f1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/InvokeExpressionValidator.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.InvokeExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface InvokeExpressionValidator {
+	boolean validate();
+
+	boolean validateCallProcedure(boolean value);
+	boolean validateInvoke(Expression value);
+	boolean validateArgs(EList<Expression> value);
+	boolean validateRets(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LeftHandSideExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LeftHandSideExpressionValidator.java
new file mode 100644
index 0000000..95ab366
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LeftHandSideExpressionValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LeftHandSideExpressionValidator {
+	boolean validate();
+
+	boolean validateLvalue(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralBooleanExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralBooleanExpressionValidator.java
new file mode 100644
index 0000000..974ad8c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralBooleanExpressionValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralBooleanExpressionValidator {
+	boolean validate();
+
+	boolean validateValue(boolean value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralCharacterExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralCharacterExpressionValidator.java
new file mode 100644
index 0000000..f6568fb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralCharacterExpressionValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralCharacterExpressionValidator {
+	boolean validate();
+
+	boolean validateValue(char value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralCollectionExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralCollectionExpressionValidator.java
new file mode 100644
index 0000000..6861552
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralCollectionExpressionValidator.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralCollectionExpressionValidator {
+	boolean validate();
+
+	boolean validateDatatype(DataType value);
+	boolean validateValue(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralEnvExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralEnvExpressionValidator.java
new file mode 100644
index 0000000..460d6d8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralEnvExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralEnvExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralExpressionValidator.java
new file mode 100644
index 0000000..a5910b3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralFloatExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralFloatExpressionValidator.java
new file mode 100644
index 0000000..16cda36
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralFloatExpressionValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralFloatExpressionValidator {
+	boolean validate();
+
+	boolean validateValue(double value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralIntegerExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralIntegerExpressionValidator.java
new file mode 100644
index 0000000..8247ee7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralIntegerExpressionValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralIntegerExpressionValidator {
+	boolean validate();
+
+	boolean validateValue(long value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralNullExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralNullExpressionValidator.java
new file mode 100644
index 0000000..4266b71
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralNullExpressionValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralNullExpressionValidator {
+	boolean validate();
+
+	boolean validateDatatype(DataType value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralParentExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralParentExpressionValidator.java
new file mode 100644
index 0000000..55b62c6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralParentExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralParentExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralRationalExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralRationalExpressionValidator.java
new file mode 100644
index 0000000..2b38b45
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralRationalExpressionValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralRationalExpressionValidator {
+	boolean validate();
+
+	boolean validateNumerator(long value);
+	boolean validateDenominator(long value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralRealExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralRealExpressionValidator.java
new file mode 100644
index 0000000..e9ea282
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralRealExpressionValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralRealExpressionValidator {
+	boolean validate();
+
+	boolean validateValue(double value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralReferenceElementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralReferenceElementValidator.java
new file mode 100644
index 0000000..645efc5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralReferenceElementValidator.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralReferenceElementValidator {
+	boolean validate();
+
+	boolean validateKind(ValueElementSpecificationKind value);
+	boolean validateValue(NamedElement value);
+	boolean validateArg(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralReferenceExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralReferenceExpressionValidator.java
new file mode 100644
index 0000000..501f1c3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralReferenceExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralReferenceExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralReferenceExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralSelfExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralSelfExpressionValidator.java
new file mode 100644
index 0000000..17f479a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralSelfExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralSelfExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralStringExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralStringExpressionValidator.java
new file mode 100644
index 0000000..9c3fd99
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralStringExpressionValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralStringExpressionValidator {
+	boolean validate();
+
+	boolean validateValue(String value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralSuperExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralSuperExpressionValidator.java
new file mode 100644
index 0000000..87774a6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralSuperExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralSuperExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralSystemExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralSystemExpressionValidator.java
new file mode 100644
index 0000000..ea91477
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralSystemExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralSystemExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralThisExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralThisExpressionValidator.java
new file mode 100644
index 0000000..41853c7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralThisExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralThisExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralTimeDeltaExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralTimeDeltaExpressionValidator.java
new file mode 100644
index 0000000..5df5b94
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralTimeDeltaExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralTimeDeltaExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralTimeDeltaExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralTimeExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralTimeExpressionValidator.java
new file mode 100644
index 0000000..015ad2b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LiteralTimeExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LiteralTimeExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LiteralTimeExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LogicalAssociativeExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LogicalAssociativeExpressionValidator.java
new file mode 100644
index 0000000..0b7e614
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LogicalAssociativeExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LogicalAssociativeExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LogicalUnaryExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LogicalUnaryExpressionValidator.java
new file mode 100644
index 0000000..5b897f8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/LogicalUnaryExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LogicalUnaryExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/MixTupleExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/MixTupleExpressionValidator.java
new file mode 100644
index 0000000..f585b57
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/MixTupleExpressionValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.MixTupleExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface MixTupleExpressionValidator {
+	boolean validate();
+
+	boolean validateValue(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/NamedExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/NamedExpressionValidator.java
new file mode 100644
index 0000000..d50b997
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/NamedExpressionValidator.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.NamedExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface NamedExpressionValidator {
+	boolean validate();
+
+	boolean validateTarget(NamedElement value);
+	boolean validateName(String value);
+	boolean validateExpression(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/NamedTupleExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/NamedTupleExpressionValidator.java
new file mode 100644
index 0000000..d5ccf5d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/NamedTupleExpressionValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.NamedExpression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.NamedTupleExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface NamedTupleExpressionValidator {
+	boolean validate();
+
+	boolean validateValue(EList<NamedExpression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/NewfreshExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/NewfreshExpressionValidator.java
new file mode 100644
index 0000000..44e2ba8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/NewfreshExpressionValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.NewfreshExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface NewfreshExpressionValidator {
+	boolean validate();
+
+	boolean validateLeftHandSide(LeftHandSideExpression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/PositionalTupleExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/PositionalTupleExpressionValidator.java
new file mode 100644
index 0000000..696b4fb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/PositionalTupleExpressionValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PositionalTupleExpressionValidator {
+	boolean validate();
+
+	boolean validateValue(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/RelationalBinaryExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/RelationalBinaryExpressionValidator.java
new file mode 100644
index 0000000..f65d4ef
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/RelationalBinaryExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface RelationalBinaryExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/RelationalTernaryExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/RelationalTernaryExpressionValidator.java
new file mode 100644
index 0000000..6807106
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/RelationalTernaryExpressionValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface RelationalTernaryExpressionValidator {
+	boolean validate();
+
+	boolean validateLeftRelation(RelationalBinaryExpression value);
+	boolean validateRigthOperator(String value);
+	boolean validateRigthOperand(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/TupleExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/TupleExpressionValidator.java
new file mode 100644
index 0000000..9c6da8b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/TupleExpressionValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.TupleExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TupleExpressionValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/UnaryExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/UnaryExpressionValidator.java
new file mode 100644
index 0000000..09e0677
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/UnaryExpressionValidator.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.UnaryExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface UnaryExpressionValidator {
+	boolean validate();
+
+	boolean validateOperator(String value);
+	boolean validateOperand(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ValueElementSpecificationValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ValueElementSpecificationValidator.java
new file mode 100644
index 0000000..ea404fa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ValueElementSpecificationValidator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ValueElementSpecificationValidator {
+	boolean validate();
+
+	boolean validateKind(ValueElementSpecificationKind value);
+	boolean validateExpected(ValueElementSpecificationScheme value);
+	boolean validateTarget(Expression value);
+	boolean validateElement(NamedElement value);
+	boolean validateArg(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ValueExpressionPrettyPrinterValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ValueExpressionPrettyPrinterValidator.java
new file mode 100644
index 0000000..f33f4dd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ValueExpressionPrettyPrinterValidator.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.PRINTER_FIX;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ValueExpressionPrettyPrinterValidator {
+	boolean validate();
+
+	boolean validateSymbol(String value);
+	boolean validateFix(PRINTER_FIX value);
+	boolean validateSpecific(EList<String> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ValuePrintableExpressionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ValuePrintableExpressionValidator.java
new file mode 100644
index 0000000..f510d18
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/expression/validation/ValuePrintableExpressionValidator.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.expression.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.ValueExpressionPrettyPrinter;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.expression.ValuePrintableExpression}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ValuePrintableExpressionValidator {
+	boolean validate();
+
+	boolean validateSymbol(String value);
+	boolean validatePrinter(ValueExpressionPrettyPrinter value);
+	boolean validateOperand(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/FormalmlFactoryImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/FormalmlFactoryImpl.java
new file mode 100644
index 0000000..b469832
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/FormalmlFactoryImpl.java
@@ -0,0 +1,189 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.impl;
+
+import org.eclipse.efm.ecore.formalml.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class FormalmlFactoryImpl extends EFactoryImpl implements FormalmlFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static FormalmlFactory init() {
+		try {
+			FormalmlFactory theFormalmlFactory = (FormalmlFactory)EPackage.Registry.INSTANCE.getEFactory(FormalmlPackage.eNS_URI);
+			if (theFormalmlFactory != null) {
+				return theFormalmlFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new FormalmlFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FormalmlFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case FormalmlPackage.XLIA_MODEL: return createXliaModel();
+			case FormalmlPackage.XLIA_NAMED_ELEMENT: return createXliaNamedElement();
+			case FormalmlPackage.XLIA_OBJECT: return createXliaObject();
+			case FormalmlPackage.XLIA_ATTRIBUTE: return createXliaAttribute();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case FormalmlPackage.XLIA_MODEL_KIND:
+				return createXliaModelKindFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case FormalmlPackage.XLIA_MODEL_KIND:
+				return convertXliaModelKindToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public XliaModel createXliaModel() {
+		XliaModelImpl xliaModel = new XliaModelImpl();
+		return xliaModel;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public XliaNamedElement createXliaNamedElement() {
+		XliaNamedElementImpl xliaNamedElement = new XliaNamedElementImpl();
+		return xliaNamedElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public XliaObject createXliaObject() {
+		XliaObjectImpl xliaObject = new XliaObjectImpl();
+		return xliaObject;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public XliaAttribute createXliaAttribute() {
+		XliaAttributeImpl xliaAttribute = new XliaAttributeImpl();
+		return xliaAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public XliaModelKind createXliaModelKindFromString(EDataType eDataType, String initialValue) {
+		XliaModelKind result = XliaModelKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertXliaModelKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FormalmlPackage getFormalmlPackage() {
+		return (FormalmlPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static FormalmlPackage getPackage() {
+		return FormalmlPackage.eINSTANCE;
+	}
+
+} //FormalmlFactoryImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/FormalmlPackageImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/FormalmlPackageImpl.java
new file mode 100644
index 0000000..5b54ade
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/FormalmlPackageImpl.java
@@ -0,0 +1,414 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlFactory;
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+import org.eclipse.efm.ecore.formalml.XliaAttribute;
+import org.eclipse.efm.ecore.formalml.XliaModel;
+import org.eclipse.efm.ecore.formalml.XliaModelKind;
+import org.eclipse.efm.ecore.formalml.XliaNamedElement;
+import org.eclipse.efm.ecore.formalml.XliaObject;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class FormalmlPackageImpl extends EPackageImpl implements FormalmlPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass xliaModelEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass xliaNamedElementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass xliaObjectEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass xliaAttributeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum xliaModelKindEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.efm.ecore.formalml.FormalmlPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private FormalmlPackageImpl() {
+		super(eNS_URI, FormalmlFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link FormalmlPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static FormalmlPackage init() {
+		if (isInited) return (FormalmlPackage)EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI);
+
+		// Obtain or create and register package
+		FormalmlPackageImpl theFormalmlPackage = (FormalmlPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof FormalmlPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new FormalmlPackageImpl());
+
+		isInited = true;
+
+		// Obtain or create and register interdependencies
+		CommonPackageImpl theCommonPackage = (CommonPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) instanceof CommonPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) : CommonPackage.eINSTANCE);
+		InfrastructurePackageImpl theInfrastructurePackage = (InfrastructurePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) instanceof InfrastructurePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) : InfrastructurePackage.eINSTANCE);
+		DatatypePackageImpl theDatatypePackage = (DatatypePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) instanceof DatatypePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) : DatatypePackage.eINSTANCE);
+		ExpressionPackageImpl theExpressionPackage = (ExpressionPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) instanceof ExpressionPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) : ExpressionPackage.eINSTANCE);
+		StatementPackageImpl theStatementPackage = (StatementPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) instanceof StatementPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) : StatementPackage.eINSTANCE);
+		StatemachinePackageImpl theStatemachinePackage = (StatemachinePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) instanceof StatemachinePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) : StatemachinePackage.eINSTANCE);
+
+		// Create package meta-data objects
+		theFormalmlPackage.createPackageContents();
+		theCommonPackage.createPackageContents();
+		theInfrastructurePackage.createPackageContents();
+		theDatatypePackage.createPackageContents();
+		theExpressionPackage.createPackageContents();
+		theStatementPackage.createPackageContents();
+		theStatemachinePackage.createPackageContents();
+
+		// Initialize created meta-data
+		theFormalmlPackage.initializePackageContents();
+		theCommonPackage.initializePackageContents();
+		theInfrastructurePackage.initializePackageContents();
+		theDatatypePackage.initializePackageContents();
+		theExpressionPackage.initializePackageContents();
+		theStatementPackage.initializePackageContents();
+		theStatemachinePackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theFormalmlPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(FormalmlPackage.eNS_URI, theFormalmlPackage);
+		return theFormalmlPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getXliaModel() {
+		return xliaModelEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getXliaModel_Prolog() {
+		return (EReference)xliaModelEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getXliaModel_System() {
+		return (EReference)xliaModelEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getXliaNamedElement() {
+		return xliaNamedElementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getXliaNamedElement_Name() {
+		return (EAttribute)xliaNamedElementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getXliaObject() {
+		return xliaObjectEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getXliaObject_Value() {
+		return (EReference)xliaObjectEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getXliaObject_Elements() {
+		return (EReference)xliaObjectEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getXliaAttribute() {
+		return xliaAttributeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getXliaAttribute_Value() {
+		return (EReference)xliaAttributeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getXliaModelKind() {
+		return xliaModelKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FormalmlFactory getFormalmlFactory() {
+		return (FormalmlFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		xliaModelEClass = createEClass(XLIA_MODEL);
+		createEReference(xliaModelEClass, XLIA_MODEL__PROLOG);
+		createEReference(xliaModelEClass, XLIA_MODEL__SYSTEM);
+
+		xliaNamedElementEClass = createEClass(XLIA_NAMED_ELEMENT);
+		createEAttribute(xliaNamedElementEClass, XLIA_NAMED_ELEMENT__NAME);
+
+		xliaObjectEClass = createEClass(XLIA_OBJECT);
+		createEReference(xliaObjectEClass, XLIA_OBJECT__VALUE);
+		createEReference(xliaObjectEClass, XLIA_OBJECT__ELEMENTS);
+
+		xliaAttributeEClass = createEClass(XLIA_ATTRIBUTE);
+		createEReference(xliaAttributeEClass, XLIA_ATTRIBUTE__VALUE);
+
+		// Create enums
+		xliaModelKindEEnum = createEEnum(XLIA_MODEL_KIND);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		CommonPackage theCommonPackage = (CommonPackage)EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI);
+		InfrastructurePackage theInfrastructurePackage = (InfrastructurePackage)EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI);
+		DatatypePackage theDatatypePackage = (DatatypePackage)EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI);
+		ExpressionPackage theExpressionPackage = (ExpressionPackage)EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI);
+		StatementPackage theStatementPackage = (StatementPackage)EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI);
+		StatemachinePackage theStatemachinePackage = (StatemachinePackage)EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI);
+
+		// Add subpackages
+		getESubpackages().add(theCommonPackage);
+		getESubpackages().add(theInfrastructurePackage);
+		getESubpackages().add(theDatatypePackage);
+		getESubpackages().add(theExpressionPackage);
+		getESubpackages().add(theStatementPackage);
+		getESubpackages().add(theStatemachinePackage);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		xliaObjectEClass.getESuperTypes().add(this.getXliaNamedElement());
+		xliaAttributeEClass.getESuperTypes().add(this.getXliaNamedElement());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(xliaModelEClass, XliaModel.class, "XliaModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getXliaModel_Prolog(), this.getXliaObject(), null, "prolog", null, 1, 1, XliaModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getXliaModel_System(), theInfrastructurePackage.getSystem(), null, "system", null, 1, 1, XliaModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(xliaNamedElementEClass, XliaNamedElement.class, "XliaNamedElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getXliaNamedElement_Name(), ecorePackage.getEString(), "name", "1.0", 0, 1, XliaNamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(xliaObjectEClass, XliaObject.class, "XliaObject", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getXliaObject_Value(), theExpressionPackage.getExpression(), null, "value", null, 1, 1, XliaObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getXliaObject_Elements(), this.getXliaNamedElement(), null, "elements", null, 0, -1, XliaObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(xliaAttributeEClass, XliaAttribute.class, "XliaAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getXliaAttribute_Value(), theExpressionPackage.getExpression(), null, "value", null, 0, 1, XliaAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Initialize enums and add enum literals
+		initEEnum(xliaModelKindEEnum, XliaModelKind.class, "XliaModelKind");
+		addEEnumLiteral(xliaModelKindEEnum, XliaModelKind.SYSTEM);
+		addEEnumLiteral(xliaModelKindEEnum, XliaModelKind.PACKAGE);
+
+		// Create resource
+		createResource(eNS_URI);
+
+		// Create annotations
+		// http://www.eclipse.org/OCL/Import
+		createImportAnnotations();
+	}
+
+	/**
+	 * Initializes the annotations for <b>http://www.eclipse.org/OCL/Import</b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void createImportAnnotations() {
+		String source = "http://www.eclipse.org/OCL/Import";	
+		addAnnotation
+		  (this, 
+		   source, 
+		   new String[] {
+			 "ecore", "http://www.eclipse.org/emf/2002/Ecore"
+		   });
+	}
+
+} //FormalmlPackageImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaAttributeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaAttributeImpl.java
new file mode 100644
index 0000000..d30b0fb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaAttributeImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+import org.eclipse.efm.ecore.formalml.XliaAttribute;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Xlia Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.impl.XliaAttributeImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class XliaAttributeImpl extends XliaNamedElementImpl implements XliaAttribute {
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected XliaAttributeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return FormalmlPackage.Literals.XLIA_ATTRIBUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetValue(Expression newValue, NotificationChain msgs) {
+		Expression oldValue = value;
+		value = newValue;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FormalmlPackage.XLIA_ATTRIBUTE__VALUE, oldValue, newValue);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(Expression newValue) {
+		if (newValue != value) {
+			NotificationChain msgs = null;
+			if (value != null)
+				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FormalmlPackage.XLIA_ATTRIBUTE__VALUE, null, msgs);
+			if (newValue != null)
+				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FormalmlPackage.XLIA_ATTRIBUTE__VALUE, null, msgs);
+			msgs = basicSetValue(newValue, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, FormalmlPackage.XLIA_ATTRIBUTE__VALUE, newValue, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_ATTRIBUTE__VALUE:
+				return basicSetValue(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_ATTRIBUTE__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_ATTRIBUTE__VALUE:
+				setValue((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_ATTRIBUTE__VALUE:
+				setValue((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_ATTRIBUTE__VALUE:
+				return value != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //XliaAttributeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaModelImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaModelImpl.java
new file mode 100644
index 0000000..5a71701
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaModelImpl.java
@@ -0,0 +1,252 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+import org.eclipse.efm.ecore.formalml.XliaModel;
+import org.eclipse.efm.ecore.formalml.XliaObject;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Xlia Model</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.impl.XliaModelImpl#getProlog <em>Prolog</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.impl.XliaModelImpl#getSystem <em>System</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class XliaModelImpl extends MinimalEObjectImpl.Container implements XliaModel {
+	/**
+	 * The cached value of the '{@link #getProlog() <em>Prolog</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProlog()
+	 * @generated
+	 * @ordered
+	 */
+	protected XliaObject prolog;
+
+	/**
+	 * The cached value of the '{@link #getSystem() <em>System</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSystem()
+	 * @generated
+	 * @ordered
+	 */
+	protected org.eclipse.efm.ecore.formalml.infrastructure.System system;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected XliaModelImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return FormalmlPackage.Literals.XLIA_MODEL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public XliaObject getProlog() {
+		return prolog;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetProlog(XliaObject newProlog, NotificationChain msgs) {
+		XliaObject oldProlog = prolog;
+		prolog = newProlog;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FormalmlPackage.XLIA_MODEL__PROLOG, oldProlog, newProlog);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setProlog(XliaObject newProlog) {
+		if (newProlog != prolog) {
+			NotificationChain msgs = null;
+			if (prolog != null)
+				msgs = ((InternalEObject)prolog).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FormalmlPackage.XLIA_MODEL__PROLOG, null, msgs);
+			if (newProlog != null)
+				msgs = ((InternalEObject)newProlog).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FormalmlPackage.XLIA_MODEL__PROLOG, null, msgs);
+			msgs = basicSetProlog(newProlog, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, FormalmlPackage.XLIA_MODEL__PROLOG, newProlog, newProlog));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.efm.ecore.formalml.infrastructure.System getSystem() {
+		return system;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetSystem(org.eclipse.efm.ecore.formalml.infrastructure.System newSystem, NotificationChain msgs) {
+		org.eclipse.efm.ecore.formalml.infrastructure.System oldSystem = system;
+		system = newSystem;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FormalmlPackage.XLIA_MODEL__SYSTEM, oldSystem, newSystem);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSystem(org.eclipse.efm.ecore.formalml.infrastructure.System newSystem) {
+		if (newSystem != system) {
+			NotificationChain msgs = null;
+			if (system != null)
+				msgs = ((InternalEObject)system).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FormalmlPackage.XLIA_MODEL__SYSTEM, null, msgs);
+			if (newSystem != null)
+				msgs = ((InternalEObject)newSystem).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FormalmlPackage.XLIA_MODEL__SYSTEM, null, msgs);
+			msgs = basicSetSystem(newSystem, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, FormalmlPackage.XLIA_MODEL__SYSTEM, newSystem, newSystem));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_MODEL__PROLOG:
+				return basicSetProlog(null, msgs);
+			case FormalmlPackage.XLIA_MODEL__SYSTEM:
+				return basicSetSystem(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_MODEL__PROLOG:
+				return getProlog();
+			case FormalmlPackage.XLIA_MODEL__SYSTEM:
+				return getSystem();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_MODEL__PROLOG:
+				setProlog((XliaObject)newValue);
+				return;
+			case FormalmlPackage.XLIA_MODEL__SYSTEM:
+				setSystem((org.eclipse.efm.ecore.formalml.infrastructure.System)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_MODEL__PROLOG:
+				setProlog((XliaObject)null);
+				return;
+			case FormalmlPackage.XLIA_MODEL__SYSTEM:
+				setSystem((org.eclipse.efm.ecore.formalml.infrastructure.System)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_MODEL__PROLOG:
+				return prolog != null;
+			case FormalmlPackage.XLIA_MODEL__SYSTEM:
+				return system != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //XliaModelImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaNamedElementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaNamedElementImpl.java
new file mode 100644
index 0000000..a85f9f4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaNamedElementImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+import org.eclipse.efm.ecore.formalml.XliaNamedElement;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Xlia Named Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.impl.XliaNamedElementImpl#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class XliaNamedElementImpl extends MinimalEObjectImpl.Container implements XliaNamedElement {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = "1.0";
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected XliaNamedElementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return FormalmlPackage.Literals.XLIA_NAMED_ELEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, FormalmlPackage.XLIA_NAMED_ELEMENT__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_NAMED_ELEMENT__NAME:
+				return getName();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_NAMED_ELEMENT__NAME:
+				setName((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_NAMED_ELEMENT__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_NAMED_ELEMENT__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: ");
+		result.append(name);
+		result.append(')');
+		return result.toString();
+	}
+
+} //XliaNamedElementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaObjectImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaObjectImpl.java
new file mode 100644
index 0000000..1ca6643
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/impl/XliaObjectImpl.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+import org.eclipse.efm.ecore.formalml.XliaNamedElement;
+import org.eclipse.efm.ecore.formalml.XliaObject;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Xlia Object</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.impl.XliaObjectImpl#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.impl.XliaObjectImpl#getElements <em>Elements</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class XliaObjectImpl extends XliaNamedElementImpl implements XliaObject {
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression value;
+
+	/**
+	 * The cached value of the '{@link #getElements() <em>Elements</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getElements()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<XliaNamedElement> elements;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected XliaObjectImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return FormalmlPackage.Literals.XLIA_OBJECT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetValue(Expression newValue, NotificationChain msgs) {
+		Expression oldValue = value;
+		value = newValue;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FormalmlPackage.XLIA_OBJECT__VALUE, oldValue, newValue);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(Expression newValue) {
+		if (newValue != value) {
+			NotificationChain msgs = null;
+			if (value != null)
+				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FormalmlPackage.XLIA_OBJECT__VALUE, null, msgs);
+			if (newValue != null)
+				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FormalmlPackage.XLIA_OBJECT__VALUE, null, msgs);
+			msgs = basicSetValue(newValue, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, FormalmlPackage.XLIA_OBJECT__VALUE, newValue, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<XliaNamedElement> getElements() {
+		if (elements == null) {
+			elements = new EObjectContainmentEList<XliaNamedElement>(XliaNamedElement.class, this, FormalmlPackage.XLIA_OBJECT__ELEMENTS);
+		}
+		return elements;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_OBJECT__VALUE:
+				return basicSetValue(null, msgs);
+			case FormalmlPackage.XLIA_OBJECT__ELEMENTS:
+				return ((InternalEList<?>)getElements()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_OBJECT__VALUE:
+				return getValue();
+			case FormalmlPackage.XLIA_OBJECT__ELEMENTS:
+				return getElements();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_OBJECT__VALUE:
+				setValue((Expression)newValue);
+				return;
+			case FormalmlPackage.XLIA_OBJECT__ELEMENTS:
+				getElements().clear();
+				getElements().addAll((Collection<? extends XliaNamedElement>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_OBJECT__VALUE:
+				setValue((Expression)null);
+				return;
+			case FormalmlPackage.XLIA_OBJECT__ELEMENTS:
+				getElements().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case FormalmlPackage.XLIA_OBJECT__VALUE:
+				return value != null;
+			case FormalmlPackage.XLIA_OBJECT__ELEMENTS:
+				return elements != null && !elements.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //XliaObjectImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Behavior.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Behavior.java
new file mode 100644
index 0000000..4ab8af8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Behavior.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Behavior</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getParameter <em>Parameter</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getComputation <em>Computation</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getExecution <em>Execution</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getInteraction <em>Interaction</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getBehavior()
+ * @model
+ * @generated
+ */
+public interface Behavior extends Machine {
+	/**
+	 * Returns the value of the '<em><b>Parameter</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Parameter</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Parameter</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getBehavior_Parameter()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Parameter> getParameter();
+
+	/**
+	 * Returns the value of the '<em><b>Computation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Computation</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Computation</em>' containment reference.
+	 * @see #setComputation(ModelOfComputation)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getBehavior_Computation()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ModelOfComputation getComputation();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getComputation <em>Computation</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Computation</em>' containment reference.
+	 * @see #getComputation()
+	 * @generated
+	 */
+	void setComputation(ModelOfComputation value);
+
+	/**
+	 * Returns the value of the '<em><b>Execution</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Execution</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Execution</em>' containment reference.
+	 * @see #setExecution(ModelOfExecution)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getBehavior_Execution()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ModelOfExecution getExecution();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getExecution <em>Execution</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Execution</em>' containment reference.
+	 * @see #getExecution()
+	 * @generated
+	 */
+	void setExecution(ModelOfExecution value);
+
+	/**
+	 * Returns the value of the '<em><b>Interaction</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Interaction</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Interaction</em>' containment reference.
+	 * @see #setInteraction(ModelOfInteraction)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getBehavior_Interaction()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ModelOfInteraction getInteraction();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getInteraction <em>Interaction</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Interaction</em>' containment reference.
+	 * @see #getInteraction()
+	 * @generated
+	 */
+	void setInteraction(ModelOfInteraction value);
+
+} // Behavior
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Buffer.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Buffer.java
new file mode 100644
index 0000000..1a2c1de
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Buffer.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Buffer</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getBuffer()
+ * @model
+ * @generated
+ */
+public interface Buffer extends PropertyDefinition, ComProtocol {
+} // Buffer
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Channel.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Channel.java
new file mode 100644
index 0000000..0f951a2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Channel.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Channel</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getMachine <em>Machine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getPort <em>Port</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getSignal <em>Signal</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getChannel()
+ * @model
+ * @generated
+ */
+public interface Channel extends PropertyDefinition {
+	/**
+	 * Returns the value of the '<em><b>Direction</b></em>' attribute.
+	 * The default value is <code>"inout"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Direction</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @see #setDirection(ChannelDirection)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getChannel_Direction()
+	 * @model default="inout"
+	 * @generated
+	 */
+	ChannelDirection getDirection();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getDirection <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @see #getDirection()
+	 * @generated
+	 */
+	void setDirection(ChannelDirection value);
+
+	/**
+	 * Returns the value of the '<em><b>Machine</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Machine</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Machine</em>' reference.
+	 * @see #setMachine(Machine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getChannel_Machine()
+	 * @model
+	 * @generated
+	 */
+	Machine getMachine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getMachine <em>Machine</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Machine</em>' reference.
+	 * @see #getMachine()
+	 * @generated
+	 */
+	void setMachine(Machine value);
+
+	/**
+	 * Returns the value of the '<em><b>Port</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Port}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Port</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Port</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getChannel_Port()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Port> getPort();
+
+	/**
+	 * Returns the value of the '<em><b>Signal</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Signal}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Signal</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Signal</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getChannel_Signal()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Signal> getSignal();
+
+} // Channel
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ChannelDirection.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ChannelDirection.java
new file mode 100644
index 0000000..fd7b3d1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ChannelDirection.java
@@ -0,0 +1,251 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Channel Direction</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getChannelDirection()
+ * @model
+ * @generated
+ */
+public enum ChannelDirection implements Enumerator {
+	/**
+	 * The '<em><b>Input</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INPUT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INPUT(0, "input", "input"),
+
+	/**
+	 * The '<em><b>Inout</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INOUT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INOUT(1, "inout", "inout"),
+
+	/**
+	 * The '<em><b>Output</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #OUTPUT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	OUTPUT(2, "output", "output");
+
+	/**
+	 * The '<em><b>Input</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Input</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INPUT
+	 * @model name="input"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INPUT_VALUE = 0;
+
+	/**
+	 * The '<em><b>Inout</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Inout</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INOUT
+	 * @model name="inout"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INOUT_VALUE = 1;
+
+	/**
+	 * The '<em><b>Output</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Output</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #OUTPUT
+	 * @model name="output"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int OUTPUT_VALUE = 2;
+
+	/**
+	 * An array of all the '<em><b>Channel Direction</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final ChannelDirection[] VALUES_ARRAY =
+		new ChannelDirection[] {
+			INPUT,
+			INOUT,
+			OUTPUT,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Channel Direction</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<ChannelDirection> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Channel Direction</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ChannelDirection get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ChannelDirection result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Channel Direction</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ChannelDirection getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ChannelDirection result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Channel Direction</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ChannelDirection get(int value) {
+		switch (value) {
+			case INPUT_VALUE: return INPUT;
+			case INOUT_VALUE: return INOUT;
+			case OUTPUT_VALUE: return OUTPUT;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ChannelDirection(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //ChannelDirection
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComCastKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComCastKind.java
new file mode 100644
index 0000000..2fd3bcb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComCastKind.java
@@ -0,0 +1,305 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Com Cast Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComCastKind()
+ * @model
+ * @generated
+ */
+public enum ComCastKind implements Enumerator {
+	/**
+	 * The '<em><b>None</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #NONE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	NONE(0, "none", "none"),
+
+	/**
+	 * The '<em><b>Unicast</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #UNICAST_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	UNICAST(1, "unicast", "unicast"),
+
+	/**
+	 * The '<em><b>Anycast</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ANYCAST_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ANYCAST(2, "anycast", "anycast"),
+
+	/**
+	 * The '<em><b>Multicast</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MULTICAST_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MULTICAST(3, "multicast", "multicast"),
+
+	/**
+	 * The '<em><b>Broadcast</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BROADCAST_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BROADCAST(4, "broadcast", "broadcast");
+
+	/**
+	 * The '<em><b>None</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>None</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #NONE
+	 * @model name="none"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int NONE_VALUE = 0;
+
+	/**
+	 * The '<em><b>Unicast</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Unicast</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #UNICAST
+	 * @model name="unicast"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int UNICAST_VALUE = 1;
+
+	/**
+	 * The '<em><b>Anycast</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Anycast</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ANYCAST
+	 * @model name="anycast"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ANYCAST_VALUE = 2;
+
+	/**
+	 * The '<em><b>Multicast</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Multicast</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MULTICAST
+	 * @model name="multicast"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MULTICAST_VALUE = 3;
+
+	/**
+	 * The '<em><b>Broadcast</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Broadcast</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BROADCAST
+	 * @model name="broadcast"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BROADCAST_VALUE = 4;
+
+	/**
+	 * An array of all the '<em><b>Com Cast Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final ComCastKind[] VALUES_ARRAY =
+		new ComCastKind[] {
+			NONE,
+			UNICAST,
+			ANYCAST,
+			MULTICAST,
+			BROADCAST,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Com Cast Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<ComCastKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Com Cast Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ComCastKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ComCastKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Com Cast Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ComCastKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ComCastKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Com Cast Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ComCastKind get(int value) {
+		switch (value) {
+			case NONE_VALUE: return NONE;
+			case UNICAST_VALUE: return UNICAST;
+			case ANYCAST_VALUE: return ANYCAST;
+			case MULTICAST_VALUE: return MULTICAST;
+			case BROADCAST_VALUE: return BROADCAST;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ComCastKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //ComCastKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComPoint.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComPoint.java
new file mode 100644
index 0000000..f582183
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComPoint.java
@@ -0,0 +1,139 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Com Point</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getProtocol <em>Protocol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getPoint <em>Point</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getPoints <em>Points</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComPoint()
+ * @model
+ * @generated
+ */
+public interface ComPoint extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Direction</b></em>' attribute.
+	 * The default value is <code>"inout"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Direction</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @see #setDirection(ChannelDirection)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComPoint_Direction()
+	 * @model default="inout"
+	 * @generated
+	 */
+	ChannelDirection getDirection();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getDirection <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @see #getDirection()
+	 * @generated
+	 */
+	void setDirection(ChannelDirection value);
+
+	/**
+	 * Returns the value of the '<em><b>Protocol</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Protocol</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Protocol</em>' containment reference.
+	 * @see #setProtocol(ComProtocol)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComPoint_Protocol()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ComProtocol getProtocol();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getProtocol <em>Protocol</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Protocol</em>' containment reference.
+	 * @see #getProtocol()
+	 * @generated
+	 */
+	void setProtocol(ComProtocol value);
+
+	/**
+	 * Returns the value of the '<em><b>Point</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Point</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Point</em>' containment reference.
+	 * @see #setPoint(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComPoint_Point()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getPoint();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getPoint <em>Point</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Point</em>' containment reference.
+	 * @see #getPoint()
+	 * @generated
+	 */
+	void setPoint(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Points</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Points</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Points</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComPoint_Points()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getPoints();
+
+} // ComPoint
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComProtocol.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComProtocol.java
new file mode 100644
index 0000000..8358836
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComProtocol.java
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.datatype.CollectionType;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Com Protocol</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getProtocol <em>Protocol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getCast <em>Cast</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getInner_buffer <em>Inner buffer</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getRef_buffer <em>Ref buffer</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComProtocol()
+ * @model
+ * @generated
+ */
+public interface ComProtocol extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Protocol</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Protocol</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Protocol</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind
+	 * @see #setProtocol(ComProtocolKind)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComProtocol_Protocol()
+	 * @model
+	 * @generated
+	 */
+	ComProtocolKind getProtocol();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getProtocol <em>Protocol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Protocol</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind
+	 * @see #getProtocol()
+	 * @generated
+	 */
+	void setProtocol(ComProtocolKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Cast</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Cast</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Cast</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind
+	 * @see #setCast(ComCastKind)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComProtocol_Cast()
+	 * @model
+	 * @generated
+	 */
+	ComCastKind getCast();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getCast <em>Cast</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Cast</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind
+	 * @see #getCast()
+	 * @generated
+	 */
+	void setCast(ComCastKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Inner buffer</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Inner buffer</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Inner buffer</em>' containment reference.
+	 * @see #setInner_buffer(CollectionType)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComProtocol_Inner_buffer()
+	 * @model containment="true"
+	 * @generated
+	 */
+	CollectionType getInner_buffer();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getInner_buffer <em>Inner buffer</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Inner buffer</em>' containment reference.
+	 * @see #getInner_buffer()
+	 * @generated
+	 */
+	void setInner_buffer(CollectionType value);
+
+	/**
+	 * Returns the value of the '<em><b>Ref buffer</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Ref buffer</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Ref buffer</em>' reference.
+	 * @see #setRef_buffer(Buffer)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComProtocol_Ref_buffer()
+	 * @model
+	 * @generated
+	 */
+	Buffer getRef_buffer();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getRef_buffer <em>Ref buffer</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Ref buffer</em>' reference.
+	 * @see #getRef_buffer()
+	 * @generated
+	 */
+	void setRef_buffer(Buffer value);
+
+} // ComProtocol
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComProtocolKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComProtocolKind.java
new file mode 100644
index 0000000..615e45e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ComProtocolKind.java
@@ -0,0 +1,305 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Com Protocol Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getComProtocolKind()
+ * @model
+ * @generated
+ */
+public enum ComProtocolKind implements Enumerator {
+	/**
+	 * The '<em><b>None</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #NONE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	NONE(0, "none", "none"),
+
+	/**
+	 * The '<em><b>Env</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ENV_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ENV(1, "env", "env"),
+
+	/**
+	 * The '<em><b>Buffer</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BUFFER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BUFFER(2, "buffer", "buffer"),
+
+	/**
+	 * The '<em><b>Rdv</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RDV_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RDV(3, "rdv", "rdv"),
+
+	/**
+	 * The '<em><b>Multi rdv</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MULTI_RDV_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MULTI_RDV(4, "multi_rdv", "multi_rdv");
+
+	/**
+	 * The '<em><b>None</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>None</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #NONE
+	 * @model name="none"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int NONE_VALUE = 0;
+
+	/**
+	 * The '<em><b>Env</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Env</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ENV
+	 * @model name="env"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ENV_VALUE = 1;
+
+	/**
+	 * The '<em><b>Buffer</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Buffer</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BUFFER
+	 * @model name="buffer"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BUFFER_VALUE = 2;
+
+	/**
+	 * The '<em><b>Rdv</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Rdv</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RDV
+	 * @model name="rdv"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RDV_VALUE = 3;
+
+	/**
+	 * The '<em><b>Multi rdv</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Multi rdv</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MULTI_RDV
+	 * @model name="multi_rdv"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MULTI_RDV_VALUE = 4;
+
+	/**
+	 * An array of all the '<em><b>Com Protocol Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final ComProtocolKind[] VALUES_ARRAY =
+		new ComProtocolKind[] {
+			NONE,
+			ENV,
+			BUFFER,
+			RDV,
+			MULTI_RDV,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Com Protocol Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<ComProtocolKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Com Protocol Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ComProtocolKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ComProtocolKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Com Protocol Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ComProtocolKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ComProtocolKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Com Protocol Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ComProtocolKind get(int value) {
+		switch (value) {
+			case NONE_VALUE: return NONE;
+			case ENV_VALUE: return ENV;
+			case BUFFER_VALUE: return BUFFER;
+			case RDV_VALUE: return RDV;
+			case MULTI_RDV_VALUE: return MULTI_RDV;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ComProtocolKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //ComProtocolKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Connection.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Connection.java
new file mode 100644
index 0000000..f7ee2e9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Connection.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Connection</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection#getProtocol <em>Protocol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection#getCast <em>Cast</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection#getComPoints <em>Com Points</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getConnection()
+ * @model
+ * @generated
+ */
+public interface Connection extends NamedElement {
+	/**
+	 * Returns the value of the '<em><b>Protocol</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Protocol</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Protocol</em>' containment reference.
+	 * @see #setProtocol(ComProtocol)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getConnection_Protocol()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ComProtocol getProtocol();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection#getProtocol <em>Protocol</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Protocol</em>' containment reference.
+	 * @see #getProtocol()
+	 * @generated
+	 */
+	void setProtocol(ComProtocol value);
+
+	/**
+	 * Returns the value of the '<em><b>Cast</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Cast</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Cast</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind
+	 * @see #setCast(ComCastKind)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getConnection_Cast()
+	 * @model
+	 * @generated
+	 */
+	ComCastKind getCast();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection#getCast <em>Cast</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Cast</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind
+	 * @see #getCast()
+	 * @generated
+	 */
+	void setCast(ComCastKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Com Points</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Com Points</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Com Points</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getConnection_ComPoints()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	EList<ComPoint> getComPoints();
+
+} // Connection
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/DesignKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/DesignKind.java
new file mode 100644
index 0000000..e1101a8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/DesignKind.java
@@ -0,0 +1,251 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Design Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getDesignKind()
+ * @model
+ * @generated
+ */
+public enum DesignKind implements Enumerator {
+	/**
+	 * The '<em><b>Model</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MODEL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MODEL(0, "model", "model"),
+
+	/**
+	 * The '<em><b>Instance</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INSTANCE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INSTANCE(1, "instance", "instance"),
+
+	/**
+	 * The '<em><b>Prototype</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PROTOTYPE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PROTOTYPE(2, "prototype", "prototype");
+
+	/**
+	 * The '<em><b>Model</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Model</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MODEL
+	 * @model name="model"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MODEL_VALUE = 0;
+
+	/**
+	 * The '<em><b>Instance</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Instance</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INSTANCE
+	 * @model name="instance"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INSTANCE_VALUE = 1;
+
+	/**
+	 * The '<em><b>Prototype</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Prototype</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PROTOTYPE
+	 * @model name="prototype"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PROTOTYPE_VALUE = 2;
+
+	/**
+	 * An array of all the '<em><b>Design Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final DesignKind[] VALUES_ARRAY =
+		new DesignKind[] {
+			MODEL,
+			INSTANCE,
+			PROTOTYPE,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Design Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<DesignKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Design Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static DesignKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			DesignKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Design Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static DesignKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			DesignKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Design Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static DesignKind get(int value) {
+		switch (value) {
+			case MODEL_VALUE: return MODEL;
+			case INSTANCE_VALUE: return INSTANCE;
+			case PROTOTYPE_VALUE: return PROTOTYPE;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private DesignKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //DesignKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/InfrastructureFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/InfrastructureFactory.java
new file mode 100644
index 0000000..5504e32
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/InfrastructureFactory.java
@@ -0,0 +1,250 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage
+ * @generated
+ */
+public interface InfrastructureFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	InfrastructureFactory eINSTANCE = org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructureFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Machine</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Machine</em>'.
+	 * @generated
+	 */
+	Machine createMachine();
+
+	/**
+	 * Returns a new object of class '<em>System</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>System</em>'.
+	 * @generated
+	 */
+	System createSystem();
+
+	/**
+	 * Returns a new object of class '<em>Modifier</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Modifier</em>'.
+	 * @generated
+	 */
+	Modifier createModifier();
+
+	/**
+	 * Returns a new object of class '<em>Property Definition</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Property Definition</em>'.
+	 * @generated
+	 */
+	PropertyDefinition createPropertyDefinition();
+
+	/**
+	 * Returns a new object of class '<em>Variable</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Variable</em>'.
+	 * @generated
+	 */
+	Variable createVariable();
+
+	/**
+	 * Returns a new object of class '<em>Buffer</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Buffer</em>'.
+	 * @generated
+	 */
+	Buffer createBuffer();
+
+	/**
+	 * Returns a new object of class '<em>Port</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Port</em>'.
+	 * @generated
+	 */
+	Port createPort();
+
+	/**
+	 * Returns a new object of class '<em>Channel</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Channel</em>'.
+	 * @generated
+	 */
+	Channel createChannel();
+
+	/**
+	 * Returns a new object of class '<em>Signal</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Signal</em>'.
+	 * @generated
+	 */
+	Signal createSignal();
+
+	/**
+	 * Returns a new object of class '<em>Procedure</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Procedure</em>'.
+	 * @generated
+	 */
+	Procedure createProcedure();
+
+	/**
+	 * Returns a new object of class '<em>Routine</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Routine</em>'.
+	 * @generated
+	 */
+	Routine createRoutine();
+
+	/**
+	 * Returns a new object of class '<em>Instance Machine</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Instance Machine</em>'.
+	 * @generated
+	 */
+	InstanceMachine createInstanceMachine();
+
+	/**
+	 * Returns a new object of class '<em>Slot Property</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Slot Property</em>'.
+	 * @generated
+	 */
+	SlotProperty createSlotProperty();
+
+	/**
+	 * Returns a new object of class '<em>Parameter</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Parameter</em>'.
+	 * @generated
+	 */
+	Parameter createParameter();
+
+	/**
+	 * Returns a new object of class '<em>Parameter Set</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Parameter Set</em>'.
+	 * @generated
+	 */
+	ParameterSet createParameterSet();
+
+	/**
+	 * Returns a new object of class '<em>Behavior</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Behavior</em>'.
+	 * @generated
+	 */
+	Behavior createBehavior();
+
+	/**
+	 * Returns a new object of class '<em>Model Of Computation</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Model Of Computation</em>'.
+	 * @generated
+	 */
+	ModelOfComputation createModelOfComputation();
+
+	/**
+	 * Returns a new object of class '<em>Model Of Execution</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Model Of Execution</em>'.
+	 * @generated
+	 */
+	ModelOfExecution createModelOfExecution();
+
+	/**
+	 * Returns a new object of class '<em>Model Of Interaction</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Model Of Interaction</em>'.
+	 * @generated
+	 */
+	ModelOfInteraction createModelOfInteraction();
+
+	/**
+	 * Returns a new object of class '<em>Com Protocol</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Com Protocol</em>'.
+	 * @generated
+	 */
+	ComProtocol createComProtocol();
+
+	/**
+	 * Returns a new object of class '<em>Route</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Route</em>'.
+	 * @generated
+	 */
+	Route createRoute();
+
+	/**
+	 * Returns a new object of class '<em>Connection</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Connection</em>'.
+	 * @generated
+	 */
+	Connection createConnection();
+
+	/**
+	 * Returns a new object of class '<em>Com Point</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Com Point</em>'.
+	 * @generated
+	 */
+	ComPoint createComPoint();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	InfrastructurePackage getInfrastructurePackage();
+
+} //InfrastructureFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/InfrastructurePackage.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/InfrastructurePackage.java
new file mode 100644
index 0000000..2e32c14
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/InfrastructurePackage.java
@@ -0,0 +1,4605 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructureFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface InfrastructurePackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "infrastructure";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efm/FormalML/Infrastructure";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "Infrastructure";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	InfrastructurePackage eINSTANCE = org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl <em>Machine</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getMachine()
+	 * @generated
+	 */
+	int MACHINE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__NAME = CommonPackage.CLASSIFIER_DEFINITION__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__UNRESTRICTED_NAME = CommonPackage.CLASSIFIER_DEFINITION__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__QUALIFIED_NAME = CommonPackage.CLASSIFIER_DEFINITION__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__VISIBILITY = CommonPackage.CLASSIFIER_DEFINITION__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Input enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__INPUT_ENABLED = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Timed</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__TIMED = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Design</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__DESIGN = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Machine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__MACHINE = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__TYPEDEF = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__PROPERTY = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 5;
+
+	/**
+	 * The feature id for the '<em><b>Channel</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__CHANNEL = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 6;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__PORT = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 7;
+
+	/**
+	 * The feature id for the '<em><b>Signal</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__SIGNAL = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 8;
+
+	/**
+	 * The feature id for the '<em><b>Buffer</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__BUFFER = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 9;
+
+	/**
+	 * The feature id for the '<em><b>Routine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__ROUTINE = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 10;
+
+	/**
+	 * The feature id for the '<em><b>Procedure</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__PROCEDURE = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 11;
+
+	/**
+	 * The feature id for the '<em><b>Instance</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__INSTANCE = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 12;
+
+	/**
+	 * The feature id for the '<em><b>Behavior</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__BEHAVIOR = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 13;
+
+	/**
+	 * The feature id for the '<em><b>Main</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE__MAIN = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 14;
+
+	/**
+	 * The number of structural features of the '<em>Machine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE_FEATURE_COUNT = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 15;
+
+	/**
+	 * The number of operations of the '<em>Machine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MACHINE_OPERATION_COUNT = CommonPackage.CLASSIFIER_DEFINITION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SystemImpl <em>System</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.SystemImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getSystem()
+	 * @generated
+	 */
+	int SYSTEM = 1;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__NAME = MACHINE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__UNRESTRICTED_NAME = MACHINE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__QUALIFIED_NAME = MACHINE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__VISIBILITY = MACHINE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Input enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__INPUT_ENABLED = MACHINE__INPUT_ENABLED;
+
+	/**
+	 * The feature id for the '<em><b>Timed</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__TIMED = MACHINE__TIMED;
+
+	/**
+	 * The feature id for the '<em><b>Design</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__DESIGN = MACHINE__DESIGN;
+
+	/**
+	 * The feature id for the '<em><b>Machine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__MACHINE = MACHINE__MACHINE;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__TYPEDEF = MACHINE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__PROPERTY = MACHINE__PROPERTY;
+
+	/**
+	 * The feature id for the '<em><b>Channel</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__CHANNEL = MACHINE__CHANNEL;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__PORT = MACHINE__PORT;
+
+	/**
+	 * The feature id for the '<em><b>Signal</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__SIGNAL = MACHINE__SIGNAL;
+
+	/**
+	 * The feature id for the '<em><b>Buffer</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__BUFFER = MACHINE__BUFFER;
+
+	/**
+	 * The feature id for the '<em><b>Routine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__ROUTINE = MACHINE__ROUTINE;
+
+	/**
+	 * The feature id for the '<em><b>Procedure</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__PROCEDURE = MACHINE__PROCEDURE;
+
+	/**
+	 * The feature id for the '<em><b>Instance</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__INSTANCE = MACHINE__INSTANCE;
+
+	/**
+	 * The feature id for the '<em><b>Behavior</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__BEHAVIOR = MACHINE__BEHAVIOR;
+
+	/**
+	 * The feature id for the '<em><b>Main</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM__MAIN = MACHINE__MAIN;
+
+	/**
+	 * The number of structural features of the '<em>System</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM_FEATURE_COUNT = MACHINE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>System</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SYSTEM_OPERATION_COUNT = MACHINE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModifierImpl <em>Modifier</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ModifierImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getModifier()
+	 * @generated
+	 */
+	int MODIFIER = 2;
+
+	/**
+	 * The feature id for the '<em><b>Static</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIER__STATIC = 0;
+
+	/**
+	 * The feature id for the '<em><b>Final</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIER__FINAL = 1;
+
+	/**
+	 * The feature id for the '<em><b>Reference</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIER__REFERENCE = 2;
+
+	/**
+	 * The feature id for the '<em><b>Volatile</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIER__VOLATILE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Transient</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIER__TRANSIENT = 4;
+
+	/**
+	 * The number of structural features of the '<em>Modifier</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIER_FEATURE_COUNT = 5;
+
+	/**
+	 * The number of operations of the '<em>Modifier</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODIFIER_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.PropertyDefinitionImpl <em>Property Definition</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.PropertyDefinitionImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getPropertyDefinition()
+	 * @generated
+	 */
+	int PROPERTY_DEFINITION = 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_DEFINITION__NAME = CommonPackage.TYPED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_DEFINITION__UNRESTRICTED_NAME = CommonPackage.TYPED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_DEFINITION__QUALIFIED_NAME = CommonPackage.TYPED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_DEFINITION__VISIBILITY = CommonPackage.TYPED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_DEFINITION__TYPE = CommonPackage.TYPED_ELEMENT__TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Modifier</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_DEFINITION__MODIFIER = CommonPackage.TYPED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_DEFINITION__DEFAULT_VALUE = CommonPackage.TYPED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Property Definition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_DEFINITION_FEATURE_COUNT = CommonPackage.TYPED_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Property Definition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_DEFINITION_OPERATION_COUNT = CommonPackage.TYPED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.VariableImpl <em>Variable</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.VariableImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getVariable()
+	 * @generated
+	 */
+	int VARIABLE = 4;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__NAME = PROPERTY_DEFINITION__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__UNRESTRICTED_NAME = PROPERTY_DEFINITION__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__QUALIFIED_NAME = PROPERTY_DEFINITION__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__VISIBILITY = PROPERTY_DEFINITION__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__TYPE = PROPERTY_DEFINITION__TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Modifier</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__MODIFIER = PROPERTY_DEFINITION__MODIFIER;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__DEFAULT_VALUE = PROPERTY_DEFINITION__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Const</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__CONST = PROPERTY_DEFINITION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Macro</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__MACRO = PROPERTY_DEFINITION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>On Write Action</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE__ON_WRITE_ACTION = PROPERTY_DEFINITION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Variable</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_FEATURE_COUNT = PROPERTY_DEFINITION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Variable</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_OPERATION_COUNT = PROPERTY_DEFINITION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BufferImpl <em>Buffer</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.BufferImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getBuffer()
+	 * @generated
+	 */
+	int BUFFER = 5;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__NAME = PROPERTY_DEFINITION__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__UNRESTRICTED_NAME = PROPERTY_DEFINITION__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__QUALIFIED_NAME = PROPERTY_DEFINITION__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__VISIBILITY = PROPERTY_DEFINITION__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__TYPE = PROPERTY_DEFINITION__TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Modifier</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__MODIFIER = PROPERTY_DEFINITION__MODIFIER;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__DEFAULT_VALUE = PROPERTY_DEFINITION__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Protocol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__PROTOCOL = PROPERTY_DEFINITION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Cast</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__CAST = PROPERTY_DEFINITION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Inner buffer</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__INNER_BUFFER = PROPERTY_DEFINITION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Ref buffer</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER__REF_BUFFER = PROPERTY_DEFINITION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Buffer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER_FEATURE_COUNT = PROPERTY_DEFINITION_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Buffer</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BUFFER_OPERATION_COUNT = PROPERTY_DEFINITION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.PortImpl <em>Port</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.PortImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getPort()
+	 * @generated
+	 */
+	int PORT = 6;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__NAME = PROPERTY_DEFINITION__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__UNRESTRICTED_NAME = PROPERTY_DEFINITION__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__QUALIFIED_NAME = PROPERTY_DEFINITION__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__VISIBILITY = PROPERTY_DEFINITION__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__TYPE = PROPERTY_DEFINITION__TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Modifier</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__MODIFIER = PROPERTY_DEFINITION__MODIFIER;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__DEFAULT_VALUE = PROPERTY_DEFINITION__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Direction</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__DIRECTION = PROPERTY_DEFINITION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Signal</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__SIGNAL = PROPERTY_DEFINITION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Parameter</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT__PARAMETER = PROPERTY_DEFINITION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Port</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT_FEATURE_COUNT = PROPERTY_DEFINITION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Port</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PORT_OPERATION_COUNT = PROPERTY_DEFINITION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ChannelImpl <em>Channel</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ChannelImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getChannel()
+	 * @generated
+	 */
+	int CHANNEL = 7;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__NAME = PROPERTY_DEFINITION__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__UNRESTRICTED_NAME = PROPERTY_DEFINITION__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__QUALIFIED_NAME = PROPERTY_DEFINITION__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__VISIBILITY = PROPERTY_DEFINITION__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__TYPE = PROPERTY_DEFINITION__TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Modifier</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__MODIFIER = PROPERTY_DEFINITION__MODIFIER;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__DEFAULT_VALUE = PROPERTY_DEFINITION__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Direction</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__DIRECTION = PROPERTY_DEFINITION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Machine</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__MACHINE = PROPERTY_DEFINITION_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__PORT = PROPERTY_DEFINITION_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Signal</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL__SIGNAL = PROPERTY_DEFINITION_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Channel</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL_FEATURE_COUNT = PROPERTY_DEFINITION_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Channel</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL_OPERATION_COUNT = PROPERTY_DEFINITION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SignalImpl <em>Signal</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.SignalImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getSignal()
+	 * @generated
+	 */
+	int SIGNAL = 8;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIGNAL__NAME = CommonPackage.CLASSIFIER_DEFINITION__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIGNAL__UNRESTRICTED_NAME = CommonPackage.CLASSIFIER_DEFINITION__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIGNAL__QUALIFIED_NAME = CommonPackage.CLASSIFIER_DEFINITION__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIGNAL__VISIBILITY = CommonPackage.CLASSIFIER_DEFINITION__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Direction</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIGNAL__DIRECTION = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Parameter</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIGNAL__PARAMETER = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Signal</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIGNAL_FEATURE_COUNT = CommonPackage.CLASSIFIER_DEFINITION_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Signal</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIGNAL_OPERATION_COUNT = CommonPackage.CLASSIFIER_DEFINITION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BehaviorImpl <em>Behavior</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.BehaviorImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getBehavior()
+	 * @generated
+	 */
+	int BEHAVIOR = 15;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__NAME = MACHINE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__UNRESTRICTED_NAME = MACHINE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__QUALIFIED_NAME = MACHINE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__VISIBILITY = MACHINE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Input enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__INPUT_ENABLED = MACHINE__INPUT_ENABLED;
+
+	/**
+	 * The feature id for the '<em><b>Timed</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__TIMED = MACHINE__TIMED;
+
+	/**
+	 * The feature id for the '<em><b>Design</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__DESIGN = MACHINE__DESIGN;
+
+	/**
+	 * The feature id for the '<em><b>Machine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__MACHINE = MACHINE__MACHINE;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__TYPEDEF = MACHINE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__PROPERTY = MACHINE__PROPERTY;
+
+	/**
+	 * The feature id for the '<em><b>Channel</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__CHANNEL = MACHINE__CHANNEL;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__PORT = MACHINE__PORT;
+
+	/**
+	 * The feature id for the '<em><b>Signal</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__SIGNAL = MACHINE__SIGNAL;
+
+	/**
+	 * The feature id for the '<em><b>Buffer</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__BUFFER = MACHINE__BUFFER;
+
+	/**
+	 * The feature id for the '<em><b>Routine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__ROUTINE = MACHINE__ROUTINE;
+
+	/**
+	 * The feature id for the '<em><b>Procedure</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__PROCEDURE = MACHINE__PROCEDURE;
+
+	/**
+	 * The feature id for the '<em><b>Instance</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__INSTANCE = MACHINE__INSTANCE;
+
+	/**
+	 * The feature id for the '<em><b>Behavior</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__BEHAVIOR = MACHINE__BEHAVIOR;
+
+	/**
+	 * The feature id for the '<em><b>Main</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__MAIN = MACHINE__MAIN;
+
+	/**
+	 * The feature id for the '<em><b>Parameter</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__PARAMETER = MACHINE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Computation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__COMPUTATION = MACHINE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Execution</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__EXECUTION = MACHINE_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Interaction</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR__INTERACTION = MACHINE_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Behavior</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR_FEATURE_COUNT = MACHINE_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Behavior</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BEHAVIOR_OPERATION_COUNT = MACHINE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ProcedureImpl <em>Procedure</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ProcedureImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getProcedure()
+	 * @generated
+	 */
+	int PROCEDURE = 9;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__NAME = StatemachinePackage.STATEMACHINE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__UNRESTRICTED_NAME = StatemachinePackage.STATEMACHINE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__QUALIFIED_NAME = StatemachinePackage.STATEMACHINE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__VISIBILITY = StatemachinePackage.STATEMACHINE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Input enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__INPUT_ENABLED = StatemachinePackage.STATEMACHINE__INPUT_ENABLED;
+
+	/**
+	 * The feature id for the '<em><b>Timed</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__TIMED = StatemachinePackage.STATEMACHINE__TIMED;
+
+	/**
+	 * The feature id for the '<em><b>Design</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__DESIGN = StatemachinePackage.STATEMACHINE__DESIGN;
+
+	/**
+	 * The feature id for the '<em><b>Machine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__MACHINE = StatemachinePackage.STATEMACHINE__MACHINE;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__TYPEDEF = StatemachinePackage.STATEMACHINE__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__PROPERTY = StatemachinePackage.STATEMACHINE__PROPERTY;
+
+	/**
+	 * The feature id for the '<em><b>Channel</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__CHANNEL = StatemachinePackage.STATEMACHINE__CHANNEL;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__PORT = StatemachinePackage.STATEMACHINE__PORT;
+
+	/**
+	 * The feature id for the '<em><b>Signal</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__SIGNAL = StatemachinePackage.STATEMACHINE__SIGNAL;
+
+	/**
+	 * The feature id for the '<em><b>Buffer</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__BUFFER = StatemachinePackage.STATEMACHINE__BUFFER;
+
+	/**
+	 * The feature id for the '<em><b>Routine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__ROUTINE = StatemachinePackage.STATEMACHINE__ROUTINE;
+
+	/**
+	 * The feature id for the '<em><b>Procedure</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__PROCEDURE = StatemachinePackage.STATEMACHINE__PROCEDURE;
+
+	/**
+	 * The feature id for the '<em><b>Instance</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__INSTANCE = StatemachinePackage.STATEMACHINE__INSTANCE;
+
+	/**
+	 * The feature id for the '<em><b>Behavior</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__BEHAVIOR = StatemachinePackage.STATEMACHINE__BEHAVIOR;
+
+	/**
+	 * The feature id for the '<em><b>Main</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__MAIN = StatemachinePackage.STATEMACHINE__MAIN;
+
+	/**
+	 * The feature id for the '<em><b>Parameter</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__PARAMETER = StatemachinePackage.STATEMACHINE__PARAMETER;
+
+	/**
+	 * The feature id for the '<em><b>Computation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__COMPUTATION = StatemachinePackage.STATEMACHINE__COMPUTATION;
+
+	/**
+	 * The feature id for the '<em><b>Execution</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__EXECUTION = StatemachinePackage.STATEMACHINE__EXECUTION;
+
+	/**
+	 * The feature id for the '<em><b>Interaction</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__INTERACTION = StatemachinePackage.STATEMACHINE__INTERACTION;
+
+	/**
+	 * The feature id for the '<em><b>Region</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE__REGION = StatemachinePackage.STATEMACHINE__REGION;
+
+	/**
+	 * The number of structural features of the '<em>Procedure</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE_FEATURE_COUNT = StatemachinePackage.STATEMACHINE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Procedure</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROCEDURE_OPERATION_COUNT = StatemachinePackage.STATEMACHINE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RoutineImpl <em>Routine</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.RoutineImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getRoutine()
+	 * @generated
+	 */
+	int ROUTINE = 10;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE__NAME = CommonPackage.NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE__UNRESTRICTED_NAME = CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE__QUALIFIED_NAME = CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE__VISIBILITY = CommonPackage.NAMED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Parameter</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE__PARAMETER = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Body Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE__BODY_BLOCK = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Domain</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE__DOMAIN = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Codomain</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE__CODOMAIN = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Routine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE_FEATURE_COUNT = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Routine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTINE_OPERATION_COUNT = CommonPackage.NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.InstanceMachineImpl <em>Instance Machine</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InstanceMachineImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getInstanceMachine()
+	 * @generated
+	 */
+	int INSTANCE_MACHINE = 11;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE__NAME = CommonPackage.TYPED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE__UNRESTRICTED_NAME = CommonPackage.TYPED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE__QUALIFIED_NAME = CommonPackage.TYPED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE__VISIBILITY = CommonPackage.TYPED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE__TYPE = CommonPackage.TYPED_ELEMENT__TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Modifier</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE__MODIFIER = CommonPackage.TYPED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Model</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE__MODEL = CommonPackage.TYPED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Arg</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE__ARG = CommonPackage.TYPED_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Slot</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE__SLOT = CommonPackage.TYPED_ELEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Instance Machine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE_FEATURE_COUNT = CommonPackage.TYPED_ELEMENT_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Instance Machine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INSTANCE_MACHINE_OPERATION_COUNT = CommonPackage.TYPED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SlotPropertyImpl <em>Slot Property</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.SlotPropertyImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getSlotProperty()
+	 * @generated
+	 */
+	int SLOT_PROPERTY = 12;
+
+	/**
+	 * The feature id for the '<em><b>Xlia Property</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SLOT_PROPERTY__XLIA_PROPERTY = 0;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SLOT_PROPERTY__VALUE = 1;
+
+	/**
+	 * The number of structural features of the '<em>Slot Property</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SLOT_PROPERTY_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Slot Property</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SLOT_PROPERTY_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterImpl <em>Parameter</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getParameter()
+	 * @generated
+	 */
+	int PARAMETER = 13;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER__NAME = PROPERTY_DEFINITION__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER__UNRESTRICTED_NAME = PROPERTY_DEFINITION__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER__QUALIFIED_NAME = PROPERTY_DEFINITION__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER__VISIBILITY = PROPERTY_DEFINITION__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Type</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER__TYPE = PROPERTY_DEFINITION__TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Modifier</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER__MODIFIER = PROPERTY_DEFINITION__MODIFIER;
+
+	/**
+	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER__DEFAULT_VALUE = PROPERTY_DEFINITION__DEFAULT_VALUE;
+
+	/**
+	 * The feature id for the '<em><b>Direction</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER__DIRECTION = PROPERTY_DEFINITION_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Parameter</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER_FEATURE_COUNT = PROPERTY_DEFINITION_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Parameter</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER_OPERATION_COUNT = PROPERTY_DEFINITION_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterSetImpl <em>Parameter Set</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterSetImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getParameterSet()
+	 * @generated
+	 */
+	int PARAMETER_SET = 14;
+
+	/**
+	 * The feature id for the '<em><b>Parameter</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER_SET__PARAMETER = 0;
+
+	/**
+	 * The number of structural features of the '<em>Parameter Set</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER_SET_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Parameter Set</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER_SET_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfComputationImpl <em>Model Of Computation</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfComputationImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getModelOfComputation()
+	 * @generated
+	 */
+	int MODEL_OF_COMPUTATION = 16;
+
+	/**
+	 * The number of structural features of the '<em>Model Of Computation</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_COMPUTATION_FEATURE_COUNT = 0;
+
+	/**
+	 * The number of operations of the '<em>Model Of Computation</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_COMPUTATION_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl <em>Model Of Execution</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getModelOfExecution()
+	 * @generated
+	 */
+	int MODEL_OF_EXECUTION = 17;
+
+	/**
+	 * The feature id for the '<em><b>Init Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION__INIT_ROUTINE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Final Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION__FINAL_ROUTINE = 1;
+
+	/**
+	 * The feature id for the '<em><b>Enable Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION__ENABLE_ROUTINE = 2;
+
+	/**
+	 * The feature id for the '<em><b>Disable Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION__DISABLE_ROUTINE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Concurrency Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE = 4;
+
+	/**
+	 * The feature id for the '<em><b>Schedule Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION__SCHEDULE_ROUTINE = 5;
+
+	/**
+	 * The feature id for the '<em><b>Irun Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION__IRUN_ROUTINE = 6;
+
+	/**
+	 * The feature id for the '<em><b>Run Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION__RUN_ROUTINE = 7;
+
+	/**
+	 * The feature id for the '<em><b>Routine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION__ROUTINE = 8;
+
+	/**
+	 * The number of structural features of the '<em>Model Of Execution</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION_FEATURE_COUNT = 9;
+
+	/**
+	 * The number of operations of the '<em>Model Of Execution</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_EXECUTION_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfInteractionImpl <em>Model Of Interaction</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfInteractionImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getModelOfInteraction()
+	 * @generated
+	 */
+	int MODEL_OF_INTERACTION = 18;
+
+	/**
+	 * The feature id for the '<em><b>Routes</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_INTERACTION__ROUTES = 0;
+
+	/**
+	 * The feature id for the '<em><b>Connections</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_INTERACTION__CONNECTIONS = 1;
+
+	/**
+	 * The number of structural features of the '<em>Model Of Interaction</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_INTERACTION_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Model Of Interaction</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_OF_INTERACTION_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComProtocolImpl <em>Com Protocol</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ComProtocolImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getComProtocol()
+	 * @generated
+	 */
+	int COM_PROTOCOL = 19;
+
+	/**
+	 * The feature id for the '<em><b>Protocol</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_PROTOCOL__PROTOCOL = 0;
+
+	/**
+	 * The feature id for the '<em><b>Cast</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_PROTOCOL__CAST = 1;
+
+	/**
+	 * The feature id for the '<em><b>Inner buffer</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_PROTOCOL__INNER_BUFFER = 2;
+
+	/**
+	 * The feature id for the '<em><b>Ref buffer</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_PROTOCOL__REF_BUFFER = 3;
+
+	/**
+	 * The number of structural features of the '<em>Com Protocol</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_PROTOCOL_FEATURE_COUNT = 4;
+
+	/**
+	 * The number of operations of the '<em>Com Protocol</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_PROTOCOL_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RouteImpl <em>Route</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.RouteImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getRoute()
+	 * @generated
+	 */
+	int ROUTE = 20;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTE__NAME = CommonPackage.NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTE__UNRESTRICTED_NAME = CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTE__QUALIFIED_NAME = CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTE__VISIBILITY = CommonPackage.NAMED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Signals</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTE__SIGNALS = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Protocol</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTE__PROTOCOL = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Route</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTE_FEATURE_COUNT = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Route</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ROUTE_OPERATION_COUNT = CommonPackage.NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ConnectionImpl <em>Connection</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ConnectionImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getConnection()
+	 * @generated
+	 */
+	int CONNECTION = 21;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONNECTION__NAME = CommonPackage.NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONNECTION__UNRESTRICTED_NAME = CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONNECTION__QUALIFIED_NAME = CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONNECTION__VISIBILITY = CommonPackage.NAMED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Protocol</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONNECTION__PROTOCOL = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Cast</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONNECTION__CAST = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Com Points</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONNECTION__COM_POINTS = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Connection</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONNECTION_FEATURE_COUNT = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Connection</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONNECTION_OPERATION_COUNT = CommonPackage.NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComPointImpl <em>Com Point</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ComPointImpl
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getComPoint()
+	 * @generated
+	 */
+	int COM_POINT = 22;
+
+	/**
+	 * The feature id for the '<em><b>Direction</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_POINT__DIRECTION = 0;
+
+	/**
+	 * The feature id for the '<em><b>Protocol</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_POINT__PROTOCOL = 1;
+
+	/**
+	 * The feature id for the '<em><b>Point</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_POINT__POINT = 2;
+
+	/**
+	 * The feature id for the '<em><b>Points</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_POINT__POINTS = 3;
+
+	/**
+	 * The number of structural features of the '<em>Com Point</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_POINT_FEATURE_COUNT = 4;
+
+	/**
+	 * The number of operations of the '<em>Com Point</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COM_POINT_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.DesignKind <em>Design Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.DesignKind
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getDesignKind()
+	 * @generated
+	 */
+	int DESIGN_KIND = 23;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection <em>Channel Direction</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getChannelDirection()
+	 * @generated
+	 */
+	int CHANNEL_DIRECTION = 24;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind <em>Parameter Direction Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getParameterDirectionKind()
+	 * @generated
+	 */
+	int PARAMETER_DIRECTION_KIND = 25;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind <em>Com Protocol Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getComProtocolKind()
+	 * @generated
+	 */
+	int COM_PROTOCOL_KIND = 26;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind <em>Com Cast Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getComCastKind()
+	 * @generated
+	 */
+	int COM_CAST_KIND = 27;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine <em>Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Machine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine
+	 * @generated
+	 */
+	EClass getMachine();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#isInput_enabled <em>Input enabled</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Input enabled</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#isInput_enabled()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EAttribute getMachine_Input_enabled();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#isTimed <em>Timed</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Timed</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#isTimed()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EAttribute getMachine_Timed();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getDesign <em>Design</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Design</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getDesign()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EAttribute getMachine_Design();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getMachine <em>Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Machine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getMachine()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Machine();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getTypedef <em>Typedef</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Typedef</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getTypedef()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Typedef();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getProperty <em>Property</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Property</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getProperty()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Property();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getChannel <em>Channel</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Channel</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getChannel()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Channel();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getPort <em>Port</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Port</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getPort()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Port();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getSignal <em>Signal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Signal</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getSignal()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Signal();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getBuffer <em>Buffer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Buffer</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getBuffer()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Buffer();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getRoutine <em>Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getRoutine()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Routine();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getProcedure <em>Procedure</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Procedure</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getProcedure()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Procedure();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getInstance <em>Instance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Instance</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getInstance()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Instance();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getBehavior <em>Behavior</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Behavior</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getBehavior()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Behavior();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getMain <em>Main</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Main</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine#getMain()
+	 * @see #getMachine()
+	 * @generated
+	 */
+	EReference getMachine_Main();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.System <em>System</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>System</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.System
+	 * @generated
+	 */
+	EClass getSystem();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier <em>Modifier</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Modifier</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Modifier
+	 * @generated
+	 */
+	EClass getModifier();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isStatic <em>Static</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Static</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isStatic()
+	 * @see #getModifier()
+	 * @generated
+	 */
+	EAttribute getModifier_Static();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isFinal <em>Final</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Final</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isFinal()
+	 * @see #getModifier()
+	 * @generated
+	 */
+	EAttribute getModifier_Final();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isReference <em>Reference</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Reference</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isReference()
+	 * @see #getModifier()
+	 * @generated
+	 */
+	EAttribute getModifier_Reference();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isVolatile <em>Volatile</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Volatile</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isVolatile()
+	 * @see #getModifier()
+	 * @generated
+	 */
+	EAttribute getModifier_Volatile();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isTransient <em>Transient</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Transient</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isTransient()
+	 * @see #getModifier()
+	 * @generated
+	 */
+	EAttribute getModifier_Transient();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition <em>Property Definition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Property Definition</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition
+	 * @generated
+	 */
+	EClass getPropertyDefinition();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition#getModifier <em>Modifier</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Modifier</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition#getModifier()
+	 * @see #getPropertyDefinition()
+	 * @generated
+	 */
+	EReference getPropertyDefinition_Modifier();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition#getDefaultValue <em>Default Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Default Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition#getDefaultValue()
+	 * @see #getPropertyDefinition()
+	 * @generated
+	 */
+	EReference getPropertyDefinition_DefaultValue();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable <em>Variable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Variable</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Variable
+	 * @generated
+	 */
+	EClass getVariable();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable#isConst <em>Const</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Const</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Variable#isConst()
+	 * @see #getVariable()
+	 * @generated
+	 */
+	EAttribute getVariable_Const();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable#isMacro <em>Macro</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Macro</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Variable#isMacro()
+	 * @see #getVariable()
+	 * @generated
+	 */
+	EAttribute getVariable_Macro();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable#getOnWriteAction <em>On Write Action</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>On Write Action</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Variable#getOnWriteAction()
+	 * @see #getVariable()
+	 * @generated
+	 */
+	EReference getVariable_OnWriteAction();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Buffer <em>Buffer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Buffer</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Buffer
+	 * @generated
+	 */
+	EClass getBuffer();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Port <em>Port</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Port</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Port
+	 * @generated
+	 */
+	EClass getPort();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Port#getDirection <em>Direction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Direction</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Port#getDirection()
+	 * @see #getPort()
+	 * @generated
+	 */
+	EAttribute getPort_Direction();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Port#getSignal <em>Signal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Signal</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Port#getSignal()
+	 * @see #getPort()
+	 * @generated
+	 */
+	EReference getPort_Signal();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Port#getParameter <em>Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Parameter</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Port#getParameter()
+	 * @see #getPort()
+	 * @generated
+	 */
+	EReference getPort_Parameter();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel <em>Channel</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Channel</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Channel
+	 * @generated
+	 */
+	EClass getChannel();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getDirection <em>Direction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Direction</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Channel#getDirection()
+	 * @see #getChannel()
+	 * @generated
+	 */
+	EAttribute getChannel_Direction();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getMachine <em>Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Machine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Channel#getMachine()
+	 * @see #getChannel()
+	 * @generated
+	 */
+	EReference getChannel_Machine();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getPort <em>Port</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Port</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Channel#getPort()
+	 * @see #getChannel()
+	 * @generated
+	 */
+	EReference getChannel_Port();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel#getSignal <em>Signal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Signal</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Channel#getSignal()
+	 * @see #getChannel()
+	 * @generated
+	 */
+	EReference getChannel_Signal();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Signal <em>Signal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Signal</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Signal
+	 * @generated
+	 */
+	EClass getSignal();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Signal#getDirection <em>Direction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Direction</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Signal#getDirection()
+	 * @see #getSignal()
+	 * @generated
+	 */
+	EAttribute getSignal_Direction();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Signal#getParameter <em>Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Parameter</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Signal#getParameter()
+	 * @see #getSignal()
+	 * @generated
+	 */
+	EReference getSignal_Parameter();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Procedure <em>Procedure</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Procedure</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Procedure
+	 * @generated
+	 */
+	EClass getProcedure();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine <em>Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Routine
+	 * @generated
+	 */
+	EClass getRoutine();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getParameter <em>Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Parameter</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Routine#getParameter()
+	 * @see #getRoutine()
+	 * @generated
+	 */
+	EReference getRoutine_Parameter();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getBodyBlock <em>Body Block</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Body Block</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Routine#getBodyBlock()
+	 * @see #getRoutine()
+	 * @generated
+	 */
+	EReference getRoutine_BodyBlock();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getDomain <em>Domain</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Domain</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Routine#getDomain()
+	 * @see #getRoutine()
+	 * @generated
+	 */
+	EReference getRoutine_Domain();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getCodomain <em>Codomain</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Codomain</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Routine#getCodomain()
+	 * @see #getRoutine()
+	 * @generated
+	 */
+	EReference getRoutine_Codomain();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine <em>Instance Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Instance Machine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine
+	 * @generated
+	 */
+	EClass getInstanceMachine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getModifier <em>Modifier</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Modifier</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getModifier()
+	 * @see #getInstanceMachine()
+	 * @generated
+	 */
+	EReference getInstanceMachine_Modifier();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getModel <em>Model</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Model</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getModel()
+	 * @see #getInstanceMachine()
+	 * @generated
+	 */
+	EReference getInstanceMachine_Model();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getArg <em>Arg</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Arg</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getArg()
+	 * @see #getInstanceMachine()
+	 * @generated
+	 */
+	EReference getInstanceMachine_Arg();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getSlot <em>Slot</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Slot</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getSlot()
+	 * @see #getInstanceMachine()
+	 * @generated
+	 */
+	EReference getInstanceMachine_Slot();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty <em>Slot Property</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Slot Property</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty
+	 * @generated
+	 */
+	EClass getSlotProperty();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty#getXliaProperty <em>Xlia Property</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Xlia Property</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty#getXliaProperty()
+	 * @see #getSlotProperty()
+	 * @generated
+	 */
+	EReference getSlotProperty_XliaProperty();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty#getValue()
+	 * @see #getSlotProperty()
+	 * @generated
+	 */
+	EReference getSlotProperty_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter <em>Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Parameter</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Parameter
+	 * @generated
+	 */
+	EClass getParameter();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter#getDirection <em>Direction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Direction</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Parameter#getDirection()
+	 * @see #getParameter()
+	 * @generated
+	 */
+	EAttribute getParameter_Direction();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet <em>Parameter Set</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Parameter Set</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet
+	 * @generated
+	 */
+	EClass getParameterSet();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet#getParameter <em>Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Parameter</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet#getParameter()
+	 * @see #getParameterSet()
+	 * @generated
+	 */
+	EReference getParameterSet_Parameter();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior <em>Behavior</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Behavior</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Behavior
+	 * @generated
+	 */
+	EClass getBehavior();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getParameter <em>Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Parameter</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getParameter()
+	 * @see #getBehavior()
+	 * @generated
+	 */
+	EReference getBehavior_Parameter();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getComputation <em>Computation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Computation</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getComputation()
+	 * @see #getBehavior()
+	 * @generated
+	 */
+	EReference getBehavior_Computation();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getExecution <em>Execution</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Execution</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getExecution()
+	 * @see #getBehavior()
+	 * @generated
+	 */
+	EReference getBehavior_Execution();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getInteraction <em>Interaction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Interaction</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Behavior#getInteraction()
+	 * @see #getBehavior()
+	 * @generated
+	 */
+	EReference getBehavior_Interaction();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation <em>Model Of Computation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Model Of Computation</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation
+	 * @generated
+	 */
+	EClass getModelOfComputation();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution <em>Model Of Execution</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Model Of Execution</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution
+	 * @generated
+	 */
+	EClass getModelOfExecution();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getInitRoutine <em>Init Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Init Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getInitRoutine()
+	 * @see #getModelOfExecution()
+	 * @generated
+	 */
+	EReference getModelOfExecution_InitRoutine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getFinalRoutine <em>Final Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Final Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getFinalRoutine()
+	 * @see #getModelOfExecution()
+	 * @generated
+	 */
+	EReference getModelOfExecution_FinalRoutine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getEnableRoutine <em>Enable Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Enable Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getEnableRoutine()
+	 * @see #getModelOfExecution()
+	 * @generated
+	 */
+	EReference getModelOfExecution_EnableRoutine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getDisableRoutine <em>Disable Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Disable Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getDisableRoutine()
+	 * @see #getModelOfExecution()
+	 * @generated
+	 */
+	EReference getModelOfExecution_DisableRoutine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getConcurrencyRoutine <em>Concurrency Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Concurrency Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getConcurrencyRoutine()
+	 * @see #getModelOfExecution()
+	 * @generated
+	 */
+	EReference getModelOfExecution_ConcurrencyRoutine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getScheduleRoutine <em>Schedule Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Schedule Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getScheduleRoutine()
+	 * @see #getModelOfExecution()
+	 * @generated
+	 */
+	EReference getModelOfExecution_ScheduleRoutine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getIrunRoutine <em>Irun Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Irun Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getIrunRoutine()
+	 * @see #getModelOfExecution()
+	 * @generated
+	 */
+	EReference getModelOfExecution_IrunRoutine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getRunRoutine <em>Run Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Run Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getRunRoutine()
+	 * @see #getModelOfExecution()
+	 * @generated
+	 */
+	EReference getModelOfExecution_RunRoutine();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getRoutine <em>Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getRoutine()
+	 * @see #getModelOfExecution()
+	 * @generated
+	 */
+	EReference getModelOfExecution_Routine();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction <em>Model Of Interaction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Model Of Interaction</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction
+	 * @generated
+	 */
+	EClass getModelOfInteraction();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction#getRoutes <em>Routes</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Routes</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction#getRoutes()
+	 * @see #getModelOfInteraction()
+	 * @generated
+	 */
+	EReference getModelOfInteraction_Routes();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction#getConnections <em>Connections</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Connections</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction#getConnections()
+	 * @see #getModelOfInteraction()
+	 * @generated
+	 */
+	EReference getModelOfInteraction_Connections();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol <em>Com Protocol</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Com Protocol</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol
+	 * @generated
+	 */
+	EClass getComProtocol();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getProtocol <em>Protocol</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Protocol</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getProtocol()
+	 * @see #getComProtocol()
+	 * @generated
+	 */
+	EAttribute getComProtocol_Protocol();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getCast <em>Cast</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Cast</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getCast()
+	 * @see #getComProtocol()
+	 * @generated
+	 */
+	EAttribute getComProtocol_Cast();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getInner_buffer <em>Inner buffer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Inner buffer</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getInner_buffer()
+	 * @see #getComProtocol()
+	 * @generated
+	 */
+	EReference getComProtocol_Inner_buffer();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getRef_buffer <em>Ref buffer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Ref buffer</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol#getRef_buffer()
+	 * @see #getComProtocol()
+	 * @generated
+	 */
+	EReference getComProtocol_Ref_buffer();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Route <em>Route</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Route</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Route
+	 * @generated
+	 */
+	EClass getRoute();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Route#getSignals <em>Signals</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Signals</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Route#getSignals()
+	 * @see #getRoute()
+	 * @generated
+	 */
+	EReference getRoute_Signals();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Route#getProtocol <em>Protocol</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Protocol</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Route#getProtocol()
+	 * @see #getRoute()
+	 * @generated
+	 */
+	EReference getRoute_Protocol();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection <em>Connection</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Connection</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Connection
+	 * @generated
+	 */
+	EClass getConnection();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection#getProtocol <em>Protocol</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Protocol</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Connection#getProtocol()
+	 * @see #getConnection()
+	 * @generated
+	 */
+	EReference getConnection_Protocol();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection#getCast <em>Cast</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Cast</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Connection#getCast()
+	 * @see #getConnection()
+	 * @generated
+	 */
+	EAttribute getConnection_Cast();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection#getComPoints <em>Com Points</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Com Points</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Connection#getComPoints()
+	 * @see #getConnection()
+	 * @generated
+	 */
+	EReference getConnection_ComPoints();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint <em>Com Point</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Com Point</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComPoint
+	 * @generated
+	 */
+	EClass getComPoint();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getDirection <em>Direction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Direction</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getDirection()
+	 * @see #getComPoint()
+	 * @generated
+	 */
+	EAttribute getComPoint_Direction();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getProtocol <em>Protocol</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Protocol</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getProtocol()
+	 * @see #getComPoint()
+	 * @generated
+	 */
+	EReference getComPoint_Protocol();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getPoint <em>Point</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Point</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getPoint()
+	 * @see #getComPoint()
+	 * @generated
+	 */
+	EReference getComPoint_Point();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getPoints <em>Points</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Points</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComPoint#getPoints()
+	 * @see #getComPoint()
+	 * @generated
+	 */
+	EReference getComPoint_Points();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.infrastructure.DesignKind <em>Design Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Design Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.DesignKind
+	 * @generated
+	 */
+	EEnum getDesignKind();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection <em>Channel Direction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Channel Direction</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @generated
+	 */
+	EEnum getChannelDirection();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind <em>Parameter Direction Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Parameter Direction Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind
+	 * @generated
+	 */
+	EEnum getParameterDirectionKind();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind <em>Com Protocol Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Com Protocol Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind
+	 * @generated
+	 */
+	EEnum getComProtocolKind();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind <em>Com Cast Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Com Cast Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind
+	 * @generated
+	 */
+	EEnum getComCastKind();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	InfrastructureFactory getInfrastructureFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl <em>Machine</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getMachine()
+		 * @generated
+		 */
+		EClass MACHINE = eINSTANCE.getMachine();
+
+		/**
+		 * The meta object literal for the '<em><b>Input enabled</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MACHINE__INPUT_ENABLED = eINSTANCE.getMachine_Input_enabled();
+
+		/**
+		 * The meta object literal for the '<em><b>Timed</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MACHINE__TIMED = eINSTANCE.getMachine_Timed();
+
+		/**
+		 * The meta object literal for the '<em><b>Design</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MACHINE__DESIGN = eINSTANCE.getMachine_Design();
+
+		/**
+		 * The meta object literal for the '<em><b>Machine</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__MACHINE = eINSTANCE.getMachine_Machine();
+
+		/**
+		 * The meta object literal for the '<em><b>Typedef</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__TYPEDEF = eINSTANCE.getMachine_Typedef();
+
+		/**
+		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__PROPERTY = eINSTANCE.getMachine_Property();
+
+		/**
+		 * The meta object literal for the '<em><b>Channel</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__CHANNEL = eINSTANCE.getMachine_Channel();
+
+		/**
+		 * The meta object literal for the '<em><b>Port</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__PORT = eINSTANCE.getMachine_Port();
+
+		/**
+		 * The meta object literal for the '<em><b>Signal</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__SIGNAL = eINSTANCE.getMachine_Signal();
+
+		/**
+		 * The meta object literal for the '<em><b>Buffer</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__BUFFER = eINSTANCE.getMachine_Buffer();
+
+		/**
+		 * The meta object literal for the '<em><b>Routine</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__ROUTINE = eINSTANCE.getMachine_Routine();
+
+		/**
+		 * The meta object literal for the '<em><b>Procedure</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__PROCEDURE = eINSTANCE.getMachine_Procedure();
+
+		/**
+		 * The meta object literal for the '<em><b>Instance</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__INSTANCE = eINSTANCE.getMachine_Instance();
+
+		/**
+		 * The meta object literal for the '<em><b>Behavior</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__BEHAVIOR = eINSTANCE.getMachine_Behavior();
+
+		/**
+		 * The meta object literal for the '<em><b>Main</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MACHINE__MAIN = eINSTANCE.getMachine_Main();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SystemImpl <em>System</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.SystemImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getSystem()
+		 * @generated
+		 */
+		EClass SYSTEM = eINSTANCE.getSystem();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModifierImpl <em>Modifier</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ModifierImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getModifier()
+		 * @generated
+		 */
+		EClass MODIFIER = eINSTANCE.getModifier();
+
+		/**
+		 * The meta object literal for the '<em><b>Static</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIER__STATIC = eINSTANCE.getModifier_Static();
+
+		/**
+		 * The meta object literal for the '<em><b>Final</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIER__FINAL = eINSTANCE.getModifier_Final();
+
+		/**
+		 * The meta object literal for the '<em><b>Reference</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIER__REFERENCE = eINSTANCE.getModifier_Reference();
+
+		/**
+		 * The meta object literal for the '<em><b>Volatile</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIER__VOLATILE = eINSTANCE.getModifier_Volatile();
+
+		/**
+		 * The meta object literal for the '<em><b>Transient</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MODIFIER__TRANSIENT = eINSTANCE.getModifier_Transient();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.PropertyDefinitionImpl <em>Property Definition</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.PropertyDefinitionImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getPropertyDefinition()
+		 * @generated
+		 */
+		EClass PROPERTY_DEFINITION = eINSTANCE.getPropertyDefinition();
+
+		/**
+		 * The meta object literal for the '<em><b>Modifier</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROPERTY_DEFINITION__MODIFIER = eINSTANCE.getPropertyDefinition_Modifier();
+
+		/**
+		 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PROPERTY_DEFINITION__DEFAULT_VALUE = eINSTANCE.getPropertyDefinition_DefaultValue();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.VariableImpl <em>Variable</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.VariableImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getVariable()
+		 * @generated
+		 */
+		EClass VARIABLE = eINSTANCE.getVariable();
+
+		/**
+		 * The meta object literal for the '<em><b>Const</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VARIABLE__CONST = eINSTANCE.getVariable_Const();
+
+		/**
+		 * The meta object literal for the '<em><b>Macro</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VARIABLE__MACRO = eINSTANCE.getVariable_Macro();
+
+		/**
+		 * The meta object literal for the '<em><b>On Write Action</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VARIABLE__ON_WRITE_ACTION = eINSTANCE.getVariable_OnWriteAction();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BufferImpl <em>Buffer</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.BufferImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getBuffer()
+		 * @generated
+		 */
+		EClass BUFFER = eINSTANCE.getBuffer();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.PortImpl <em>Port</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.PortImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getPort()
+		 * @generated
+		 */
+		EClass PORT = eINSTANCE.getPort();
+
+		/**
+		 * The meta object literal for the '<em><b>Direction</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute PORT__DIRECTION = eINSTANCE.getPort_Direction();
+
+		/**
+		 * The meta object literal for the '<em><b>Signal</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PORT__SIGNAL = eINSTANCE.getPort_Signal();
+
+		/**
+		 * The meta object literal for the '<em><b>Parameter</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PORT__PARAMETER = eINSTANCE.getPort_Parameter();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ChannelImpl <em>Channel</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ChannelImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getChannel()
+		 * @generated
+		 */
+		EClass CHANNEL = eINSTANCE.getChannel();
+
+		/**
+		 * The meta object literal for the '<em><b>Direction</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CHANNEL__DIRECTION = eINSTANCE.getChannel_Direction();
+
+		/**
+		 * The meta object literal for the '<em><b>Machine</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CHANNEL__MACHINE = eINSTANCE.getChannel_Machine();
+
+		/**
+		 * The meta object literal for the '<em><b>Port</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CHANNEL__PORT = eINSTANCE.getChannel_Port();
+
+		/**
+		 * The meta object literal for the '<em><b>Signal</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CHANNEL__SIGNAL = eINSTANCE.getChannel_Signal();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SignalImpl <em>Signal</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.SignalImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getSignal()
+		 * @generated
+		 */
+		EClass SIGNAL = eINSTANCE.getSignal();
+
+		/**
+		 * The meta object literal for the '<em><b>Direction</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute SIGNAL__DIRECTION = eINSTANCE.getSignal_Direction();
+
+		/**
+		 * The meta object literal for the '<em><b>Parameter</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference SIGNAL__PARAMETER = eINSTANCE.getSignal_Parameter();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ProcedureImpl <em>Procedure</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ProcedureImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getProcedure()
+		 * @generated
+		 */
+		EClass PROCEDURE = eINSTANCE.getProcedure();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RoutineImpl <em>Routine</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.RoutineImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getRoutine()
+		 * @generated
+		 */
+		EClass ROUTINE = eINSTANCE.getRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Parameter</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ROUTINE__PARAMETER = eINSTANCE.getRoutine_Parameter();
+
+		/**
+		 * The meta object literal for the '<em><b>Body Block</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ROUTINE__BODY_BLOCK = eINSTANCE.getRoutine_BodyBlock();
+
+		/**
+		 * The meta object literal for the '<em><b>Domain</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ROUTINE__DOMAIN = eINSTANCE.getRoutine_Domain();
+
+		/**
+		 * The meta object literal for the '<em><b>Codomain</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ROUTINE__CODOMAIN = eINSTANCE.getRoutine_Codomain();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.InstanceMachineImpl <em>Instance Machine</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InstanceMachineImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getInstanceMachine()
+		 * @generated
+		 */
+		EClass INSTANCE_MACHINE = eINSTANCE.getInstanceMachine();
+
+		/**
+		 * The meta object literal for the '<em><b>Modifier</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INSTANCE_MACHINE__MODIFIER = eINSTANCE.getInstanceMachine_Modifier();
+
+		/**
+		 * The meta object literal for the '<em><b>Model</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INSTANCE_MACHINE__MODEL = eINSTANCE.getInstanceMachine_Model();
+
+		/**
+		 * The meta object literal for the '<em><b>Arg</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INSTANCE_MACHINE__ARG = eINSTANCE.getInstanceMachine_Arg();
+
+		/**
+		 * The meta object literal for the '<em><b>Slot</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INSTANCE_MACHINE__SLOT = eINSTANCE.getInstanceMachine_Slot();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SlotPropertyImpl <em>Slot Property</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.SlotPropertyImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getSlotProperty()
+		 * @generated
+		 */
+		EClass SLOT_PROPERTY = eINSTANCE.getSlotProperty();
+
+		/**
+		 * The meta object literal for the '<em><b>Xlia Property</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference SLOT_PROPERTY__XLIA_PROPERTY = eINSTANCE.getSlotProperty_XliaProperty();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference SLOT_PROPERTY__VALUE = eINSTANCE.getSlotProperty_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterImpl <em>Parameter</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getParameter()
+		 * @generated
+		 */
+		EClass PARAMETER = eINSTANCE.getParameter();
+
+		/**
+		 * The meta object literal for the '<em><b>Direction</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute PARAMETER__DIRECTION = eINSTANCE.getParameter_Direction();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterSetImpl <em>Parameter Set</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterSetImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getParameterSet()
+		 * @generated
+		 */
+		EClass PARAMETER_SET = eINSTANCE.getParameterSet();
+
+		/**
+		 * The meta object literal for the '<em><b>Parameter</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PARAMETER_SET__PARAMETER = eINSTANCE.getParameterSet_Parameter();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BehaviorImpl <em>Behavior</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.BehaviorImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getBehavior()
+		 * @generated
+		 */
+		EClass BEHAVIOR = eINSTANCE.getBehavior();
+
+		/**
+		 * The meta object literal for the '<em><b>Parameter</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BEHAVIOR__PARAMETER = eINSTANCE.getBehavior_Parameter();
+
+		/**
+		 * The meta object literal for the '<em><b>Computation</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BEHAVIOR__COMPUTATION = eINSTANCE.getBehavior_Computation();
+
+		/**
+		 * The meta object literal for the '<em><b>Execution</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BEHAVIOR__EXECUTION = eINSTANCE.getBehavior_Execution();
+
+		/**
+		 * The meta object literal for the '<em><b>Interaction</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BEHAVIOR__INTERACTION = eINSTANCE.getBehavior_Interaction();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfComputationImpl <em>Model Of Computation</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfComputationImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getModelOfComputation()
+		 * @generated
+		 */
+		EClass MODEL_OF_COMPUTATION = eINSTANCE.getModelOfComputation();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl <em>Model Of Execution</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getModelOfExecution()
+		 * @generated
+		 */
+		EClass MODEL_OF_EXECUTION = eINSTANCE.getModelOfExecution();
+
+		/**
+		 * The meta object literal for the '<em><b>Init Routine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_EXECUTION__INIT_ROUTINE = eINSTANCE.getModelOfExecution_InitRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Final Routine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_EXECUTION__FINAL_ROUTINE = eINSTANCE.getModelOfExecution_FinalRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Enable Routine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_EXECUTION__ENABLE_ROUTINE = eINSTANCE.getModelOfExecution_EnableRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Disable Routine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_EXECUTION__DISABLE_ROUTINE = eINSTANCE.getModelOfExecution_DisableRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Concurrency Routine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE = eINSTANCE.getModelOfExecution_ConcurrencyRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Schedule Routine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_EXECUTION__SCHEDULE_ROUTINE = eINSTANCE.getModelOfExecution_ScheduleRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Irun Routine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_EXECUTION__IRUN_ROUTINE = eINSTANCE.getModelOfExecution_IrunRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Run Routine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_EXECUTION__RUN_ROUTINE = eINSTANCE.getModelOfExecution_RunRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Routine</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_EXECUTION__ROUTINE = eINSTANCE.getModelOfExecution_Routine();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfInteractionImpl <em>Model Of Interaction</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfInteractionImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getModelOfInteraction()
+		 * @generated
+		 */
+		EClass MODEL_OF_INTERACTION = eINSTANCE.getModelOfInteraction();
+
+		/**
+		 * The meta object literal for the '<em><b>Routes</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_INTERACTION__ROUTES = eINSTANCE.getModelOfInteraction_Routes();
+
+		/**
+		 * The meta object literal for the '<em><b>Connections</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MODEL_OF_INTERACTION__CONNECTIONS = eINSTANCE.getModelOfInteraction_Connections();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComProtocolImpl <em>Com Protocol</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ComProtocolImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getComProtocol()
+		 * @generated
+		 */
+		EClass COM_PROTOCOL = eINSTANCE.getComProtocol();
+
+		/**
+		 * The meta object literal for the '<em><b>Protocol</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute COM_PROTOCOL__PROTOCOL = eINSTANCE.getComProtocol_Protocol();
+
+		/**
+		 * The meta object literal for the '<em><b>Cast</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute COM_PROTOCOL__CAST = eINSTANCE.getComProtocol_Cast();
+
+		/**
+		 * The meta object literal for the '<em><b>Inner buffer</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference COM_PROTOCOL__INNER_BUFFER = eINSTANCE.getComProtocol_Inner_buffer();
+
+		/**
+		 * The meta object literal for the '<em><b>Ref buffer</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference COM_PROTOCOL__REF_BUFFER = eINSTANCE.getComProtocol_Ref_buffer();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RouteImpl <em>Route</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.RouteImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getRoute()
+		 * @generated
+		 */
+		EClass ROUTE = eINSTANCE.getRoute();
+
+		/**
+		 * The meta object literal for the '<em><b>Signals</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ROUTE__SIGNALS = eINSTANCE.getRoute_Signals();
+
+		/**
+		 * The meta object literal for the '<em><b>Protocol</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ROUTE__PROTOCOL = eINSTANCE.getRoute_Protocol();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ConnectionImpl <em>Connection</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ConnectionImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getConnection()
+		 * @generated
+		 */
+		EClass CONNECTION = eINSTANCE.getConnection();
+
+		/**
+		 * The meta object literal for the '<em><b>Protocol</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CONNECTION__PROTOCOL = eINSTANCE.getConnection_Protocol();
+
+		/**
+		 * The meta object literal for the '<em><b>Cast</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CONNECTION__CAST = eINSTANCE.getConnection_Cast();
+
+		/**
+		 * The meta object literal for the '<em><b>Com Points</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CONNECTION__COM_POINTS = eINSTANCE.getConnection_ComPoints();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComPointImpl <em>Com Point</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.ComPointImpl
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getComPoint()
+		 * @generated
+		 */
+		EClass COM_POINT = eINSTANCE.getComPoint();
+
+		/**
+		 * The meta object literal for the '<em><b>Direction</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute COM_POINT__DIRECTION = eINSTANCE.getComPoint_Direction();
+
+		/**
+		 * The meta object literal for the '<em><b>Protocol</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference COM_POINT__PROTOCOL = eINSTANCE.getComPoint_Protocol();
+
+		/**
+		 * The meta object literal for the '<em><b>Point</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference COM_POINT__POINT = eINSTANCE.getComPoint_Point();
+
+		/**
+		 * The meta object literal for the '<em><b>Points</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference COM_POINT__POINTS = eINSTANCE.getComPoint_Points();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.DesignKind <em>Design Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.DesignKind
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getDesignKind()
+		 * @generated
+		 */
+		EEnum DESIGN_KIND = eINSTANCE.getDesignKind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection <em>Channel Direction</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getChannelDirection()
+		 * @generated
+		 */
+		EEnum CHANNEL_DIRECTION = eINSTANCE.getChannelDirection();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind <em>Parameter Direction Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getParameterDirectionKind()
+		 * @generated
+		 */
+		EEnum PARAMETER_DIRECTION_KIND = eINSTANCE.getParameterDirectionKind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind <em>Com Protocol Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getComProtocolKind()
+		 * @generated
+		 */
+		EEnum COM_PROTOCOL_KIND = eINSTANCE.getComProtocolKind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind <em>Com Cast Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind
+		 * @see org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl#getComCastKind()
+		 * @generated
+		 */
+		EEnum COM_CAST_KIND = eINSTANCE.getComCastKind();
+
+	}
+
+} //InfrastructurePackage
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/InstanceMachine.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/InstanceMachine.java
new file mode 100644
index 0000000..8711f0f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/InstanceMachine.java
@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.common.TypedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.MixTupleExpression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Instance Machine</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getModifier <em>Modifier</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getModel <em>Model</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getArg <em>Arg</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getSlot <em>Slot</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getInstanceMachine()
+ * @model
+ * @generated
+ */
+public interface InstanceMachine extends TypedElement {
+	/**
+	 * Returns the value of the '<em><b>Modifier</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Modifier</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Modifier</em>' containment reference.
+	 * @see #setModifier(Modifier)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getInstanceMachine_Modifier()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Modifier getModifier();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getModifier <em>Modifier</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Modifier</em>' containment reference.
+	 * @see #getModifier()
+	 * @generated
+	 */
+	void setModifier(Modifier value);
+
+	/**
+	 * Returns the value of the '<em><b>Model</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Model</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Model</em>' reference.
+	 * @see #setModel(Machine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getInstanceMachine_Model()
+	 * @model
+	 * @generated
+	 */
+	Machine getModel();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getModel <em>Model</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Model</em>' reference.
+	 * @see #getModel()
+	 * @generated
+	 */
+	void setModel(Machine value);
+
+	/**
+	 * Returns the value of the '<em><b>Arg</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Arg</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Arg</em>' containment reference.
+	 * @see #setArg(MixTupleExpression)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getInstanceMachine_Arg()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MixTupleExpression getArg();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine#getArg <em>Arg</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Arg</em>' containment reference.
+	 * @see #getArg()
+	 * @generated
+	 */
+	void setArg(MixTupleExpression value);
+
+	/**
+	 * Returns the value of the '<em><b>Slot</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Slot</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Slot</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getInstanceMachine_Slot()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<SlotProperty> getSlot();
+
+} // InstanceMachine
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Machine.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Machine.java
new file mode 100644
index 0000000..79067e9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Machine.java
@@ -0,0 +1,338 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Machine</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#isInput_enabled <em>Input enabled</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#isTimed <em>Timed</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getDesign <em>Design</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getMachine <em>Machine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getTypedef <em>Typedef</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getProperty <em>Property</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getChannel <em>Channel</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getPort <em>Port</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getSignal <em>Signal</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getBuffer <em>Buffer</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getRoutine <em>Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getProcedure <em>Procedure</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getInstance <em>Instance</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getBehavior <em>Behavior</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getMain <em>Main</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine()
+ * @model
+ * @generated
+ */
+public interface Machine extends ClassifierDefinition {
+	/**
+	 * Returns the value of the '<em><b>Input enabled</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Input enabled</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Input enabled</em>' attribute.
+	 * @see #setInput_enabled(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Input_enabled()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isInput_enabled();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#isInput_enabled <em>Input enabled</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Input enabled</em>' attribute.
+	 * @see #isInput_enabled()
+	 * @generated
+	 */
+	void setInput_enabled(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Timed</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Timed</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Timed</em>' attribute.
+	 * @see #setTimed(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Timed()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isTimed();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#isTimed <em>Timed</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Timed</em>' attribute.
+	 * @see #isTimed()
+	 * @generated
+	 */
+	void setTimed(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Design</b></em>' attribute.
+	 * The default value is <code>"prototype"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.infrastructure.DesignKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Design</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Design</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.DesignKind
+	 * @see #setDesign(DesignKind)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Design()
+	 * @model default="prototype" required="true"
+	 * @generated
+	 */
+	DesignKind getDesign();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getDesign <em>Design</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Design</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.DesignKind
+	 * @see #getDesign()
+	 * @generated
+	 */
+	void setDesign(DesignKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Machine</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Machine}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Machine</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Machine</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Machine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Machine> getMachine();
+
+	/**
+	 * Returns the value of the '<em><b>Typedef</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.datatype.DataType}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Typedef</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Typedef</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Typedef()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<DataType> getTypedef();
+
+	/**
+	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Property</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Property()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<PropertyDefinition> getProperty();
+
+	/**
+	 * Returns the value of the '<em><b>Channel</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Channel}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Channel</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Channel</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Channel()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Channel> getChannel();
+
+	/**
+	 * Returns the value of the '<em><b>Port</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Port}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Port</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Port</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Port()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Port> getPort();
+
+	/**
+	 * Returns the value of the '<em><b>Signal</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Signal}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Signal</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Signal</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Signal()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Signal> getSignal();
+
+	/**
+	 * Returns the value of the '<em><b>Buffer</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Buffer}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Buffer</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Buffer</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Buffer()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Buffer> getBuffer();
+
+	/**
+	 * Returns the value of the '<em><b>Routine</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Routine}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Routine</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Routine</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Routine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Routine> getRoutine();
+
+	/**
+	 * Returns the value of the '<em><b>Procedure</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Procedure}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Procedure</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Procedure</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Procedure()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Procedure> getProcedure();
+
+	/**
+	 * Returns the value of the '<em><b>Instance</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Instance</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Instance</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Instance()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<InstanceMachine> getInstance();
+
+	/**
+	 * Returns the value of the '<em><b>Behavior</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Behavior</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Behavior</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Behavior()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Behavior> getBehavior();
+
+	/**
+	 * Returns the value of the '<em><b>Main</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Main</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Main</em>' containment reference.
+	 * @see #setMain(Behavior)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getMachine_Main()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Behavior getMain();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine#getMain <em>Main</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Main</em>' containment reference.
+	 * @see #getMain()
+	 * @generated
+	 */
+	void setMain(Behavior value);
+
+} // Machine
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ModelOfComputation.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ModelOfComputation.java
new file mode 100644
index 0000000..71be850
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ModelOfComputation.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Model Of Computation</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfComputation()
+ * @model
+ * @generated
+ */
+public interface ModelOfComputation extends EObject {
+} // ModelOfComputation
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ModelOfExecution.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ModelOfExecution.java
new file mode 100644
index 0000000..655889b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ModelOfExecution.java
@@ -0,0 +1,268 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Model Of Execution</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getInitRoutine <em>Init Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getFinalRoutine <em>Final Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getEnableRoutine <em>Enable Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getDisableRoutine <em>Disable Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getConcurrencyRoutine <em>Concurrency Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getScheduleRoutine <em>Schedule Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getIrunRoutine <em>Irun Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getRunRoutine <em>Run Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getRoutine <em>Routine</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution()
+ * @model
+ * @generated
+ */
+public interface ModelOfExecution extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Init Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Init Routine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Init Routine</em>' containment reference.
+	 * @see #setInitRoutine(Routine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution_InitRoutine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Routine getInitRoutine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getInitRoutine <em>Init Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Init Routine</em>' containment reference.
+	 * @see #getInitRoutine()
+	 * @generated
+	 */
+	void setInitRoutine(Routine value);
+
+	/**
+	 * Returns the value of the '<em><b>Final Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Final Routine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Final Routine</em>' containment reference.
+	 * @see #setFinalRoutine(Routine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution_FinalRoutine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Routine getFinalRoutine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getFinalRoutine <em>Final Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Final Routine</em>' containment reference.
+	 * @see #getFinalRoutine()
+	 * @generated
+	 */
+	void setFinalRoutine(Routine value);
+
+	/**
+	 * Returns the value of the '<em><b>Enable Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Enable Routine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Enable Routine</em>' containment reference.
+	 * @see #setEnableRoutine(Routine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution_EnableRoutine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Routine getEnableRoutine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getEnableRoutine <em>Enable Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Enable Routine</em>' containment reference.
+	 * @see #getEnableRoutine()
+	 * @generated
+	 */
+	void setEnableRoutine(Routine value);
+
+	/**
+	 * Returns the value of the '<em><b>Disable Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Disable Routine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Disable Routine</em>' containment reference.
+	 * @see #setDisableRoutine(Routine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution_DisableRoutine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Routine getDisableRoutine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getDisableRoutine <em>Disable Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Disable Routine</em>' containment reference.
+	 * @see #getDisableRoutine()
+	 * @generated
+	 */
+	void setDisableRoutine(Routine value);
+
+	/**
+	 * Returns the value of the '<em><b>Concurrency Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Concurrency Routine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Concurrency Routine</em>' containment reference.
+	 * @see #setConcurrencyRoutine(Routine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution_ConcurrencyRoutine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Routine getConcurrencyRoutine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getConcurrencyRoutine <em>Concurrency Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Concurrency Routine</em>' containment reference.
+	 * @see #getConcurrencyRoutine()
+	 * @generated
+	 */
+	void setConcurrencyRoutine(Routine value);
+
+	/**
+	 * Returns the value of the '<em><b>Schedule Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Schedule Routine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Schedule Routine</em>' containment reference.
+	 * @see #setScheduleRoutine(Routine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution_ScheduleRoutine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Routine getScheduleRoutine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getScheduleRoutine <em>Schedule Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Schedule Routine</em>' containment reference.
+	 * @see #getScheduleRoutine()
+	 * @generated
+	 */
+	void setScheduleRoutine(Routine value);
+
+	/**
+	 * Returns the value of the '<em><b>Irun Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Irun Routine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Irun Routine</em>' containment reference.
+	 * @see #setIrunRoutine(Routine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution_IrunRoutine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Routine getIrunRoutine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getIrunRoutine <em>Irun Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Irun Routine</em>' containment reference.
+	 * @see #getIrunRoutine()
+	 * @generated
+	 */
+	void setIrunRoutine(Routine value);
+
+	/**
+	 * Returns the value of the '<em><b>Run Routine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Run Routine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Run Routine</em>' containment reference.
+	 * @see #setRunRoutine(Routine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution_RunRoutine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Routine getRunRoutine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution#getRunRoutine <em>Run Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Run Routine</em>' containment reference.
+	 * @see #getRunRoutine()
+	 * @generated
+	 */
+	void setRunRoutine(Routine value);
+
+	/**
+	 * Returns the value of the '<em><b>Routine</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Routine}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Routine</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Routine</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfExecution_Routine()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Routine> getRoutine();
+
+} // ModelOfExecution
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ModelOfInteraction.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ModelOfInteraction.java
new file mode 100644
index 0000000..bbe86a8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ModelOfInteraction.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Model Of Interaction</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction#getRoutes <em>Routes</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction#getConnections <em>Connections</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfInteraction()
+ * @model
+ * @generated
+ */
+public interface ModelOfInteraction extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Routes</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Route}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Routes</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Routes</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfInteraction_Routes()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Route> getRoutes();
+
+	/**
+	 * Returns the value of the '<em><b>Connections</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Connection}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Connections</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Connections</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModelOfInteraction_Connections()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Connection> getConnections();
+
+} // ModelOfInteraction
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Modifier.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Modifier.java
new file mode 100644
index 0000000..be3689a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Modifier.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Modifier</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isStatic <em>Static</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isFinal <em>Final</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isReference <em>Reference</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isVolatile <em>Volatile</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isTransient <em>Transient</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModifier()
+ * @model
+ * @generated
+ */
+public interface Modifier extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Static</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Static</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Static</em>' attribute.
+	 * @see #setStatic(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModifier_Static()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isStatic();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isStatic <em>Static</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Static</em>' attribute.
+	 * @see #isStatic()
+	 * @generated
+	 */
+	void setStatic(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Final</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Final</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Final</em>' attribute.
+	 * @see #setFinal(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModifier_Final()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isFinal();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isFinal <em>Final</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Final</em>' attribute.
+	 * @see #isFinal()
+	 * @generated
+	 */
+	void setFinal(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Reference</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Reference</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Reference</em>' attribute.
+	 * @see #setReference(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModifier_Reference()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isReference();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isReference <em>Reference</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Reference</em>' attribute.
+	 * @see #isReference()
+	 * @generated
+	 */
+	void setReference(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Volatile</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Volatile</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Volatile</em>' attribute.
+	 * @see #setVolatile(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModifier_Volatile()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isVolatile();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isVolatile <em>Volatile</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Volatile</em>' attribute.
+	 * @see #isVolatile()
+	 * @generated
+	 */
+	void setVolatile(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Transient</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Transient</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Transient</em>' attribute.
+	 * @see #setTransient(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getModifier_Transient()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isTransient();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier#isTransient <em>Transient</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Transient</em>' attribute.
+	 * @see #isTransient()
+	 * @generated
+	 */
+	void setTransient(boolean value);
+
+} // Modifier
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Parameter.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Parameter.java
new file mode 100644
index 0000000..1d0aceb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Parameter.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Parameter</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter#getDirection <em>Direction</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getParameter()
+ * @model
+ * @generated
+ */
+public interface Parameter extends PropertyDefinition {
+	/**
+	 * Returns the value of the '<em><b>Direction</b></em>' attribute.
+	 * The default value is <code>"in"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Direction</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind
+	 * @see #setDirection(ParameterDirectionKind)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getParameter_Direction()
+	 * @model default="in" required="true"
+	 * @generated
+	 */
+	ParameterDirectionKind getDirection();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter#getDirection <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind
+	 * @see #getDirection()
+	 * @generated
+	 */
+	void setDirection(ParameterDirectionKind value);
+
+} // Parameter
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ParameterDirectionKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ParameterDirectionKind.java
new file mode 100644
index 0000000..6b99b28
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ParameterDirectionKind.java
@@ -0,0 +1,278 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Parameter Direction Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getParameterDirectionKind()
+ * @model
+ * @generated
+ */
+public enum ParameterDirectionKind implements Enumerator {
+	/**
+	 * The '<em><b>In</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	IN(0, "in", "in"),
+
+	/**
+	 * The '<em><b>Inout</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INOUT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INOUT(1, "inout", "inout"),
+
+	/**
+	 * The '<em><b>Out</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #OUT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	OUT(2, "out", "out"),
+
+	/**
+	 * The '<em><b>Return</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RETURN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RETURN(3, "return", "return");
+
+	/**
+	 * The '<em><b>In</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>In</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #IN
+	 * @model name="in"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int IN_VALUE = 0;
+
+	/**
+	 * The '<em><b>Inout</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Inout</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INOUT
+	 * @model name="inout"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INOUT_VALUE = 1;
+
+	/**
+	 * The '<em><b>Out</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Out</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #OUT
+	 * @model name="out"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int OUT_VALUE = 2;
+
+	/**
+	 * The '<em><b>Return</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Return</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RETURN
+	 * @model name="return"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RETURN_VALUE = 3;
+
+	/**
+	 * An array of all the '<em><b>Parameter Direction Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final ParameterDirectionKind[] VALUES_ARRAY =
+		new ParameterDirectionKind[] {
+			IN,
+			INOUT,
+			OUT,
+			RETURN,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Parameter Direction Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<ParameterDirectionKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Parameter Direction Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ParameterDirectionKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ParameterDirectionKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Parameter Direction Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ParameterDirectionKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ParameterDirectionKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Parameter Direction Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ParameterDirectionKind get(int value) {
+		switch (value) {
+			case IN_VALUE: return IN;
+			case INOUT_VALUE: return INOUT;
+			case OUT_VALUE: return OUT;
+			case RETURN_VALUE: return RETURN;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ParameterDirectionKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //ParameterDirectionKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ParameterSet.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ParameterSet.java
new file mode 100644
index 0000000..4c06ec6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/ParameterSet.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Parameter Set</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet#getParameter <em>Parameter</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getParameterSet()
+ * @model
+ * @generated
+ */
+public interface ParameterSet extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Parameter</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Parameter</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Parameter</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getParameterSet_Parameter()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Parameter> getParameter();
+
+} // ParameterSet
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Port.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Port.java
new file mode 100644
index 0000000..5818243
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Port.java
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Port</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Port#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Port#getSignal <em>Signal</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Port#getParameter <em>Parameter</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getPort()
+ * @model
+ * @generated
+ */
+public interface Port extends PropertyDefinition {
+	/**
+	 * Returns the value of the '<em><b>Direction</b></em>' attribute.
+	 * The default value is <code>"inout"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Direction</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @see #setDirection(ChannelDirection)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getPort_Direction()
+	 * @model default="inout"
+	 * @generated
+	 */
+	ChannelDirection getDirection();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Port#getDirection <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @see #getDirection()
+	 * @generated
+	 */
+	void setDirection(ChannelDirection value);
+
+	/**
+	 * Returns the value of the '<em><b>Signal</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Signal}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Signal</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Signal</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getPort_Signal()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Signal> getSignal();
+
+	/**
+	 * Returns the value of the '<em><b>Parameter</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Parameter</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Parameter</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getPort_Parameter()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Parameter> getParameter();
+
+} // Port
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Procedure.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Procedure.java
new file mode 100644
index 0000000..86000e3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Procedure.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Procedure</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getProcedure()
+ * @model
+ * @generated
+ */
+public interface Procedure extends Statemachine {
+} // Procedure
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/PropertyDefinition.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/PropertyDefinition.java
new file mode 100644
index 0000000..c432f05
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/PropertyDefinition.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.common.TypedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Property Definition</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition#getModifier <em>Modifier</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition#getDefaultValue <em>Default Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getPropertyDefinition()
+ * @model
+ * @generated
+ */
+public interface PropertyDefinition extends TypedElement {
+	/**
+	 * Returns the value of the '<em><b>Modifier</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Modifier</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Modifier</em>' containment reference.
+	 * @see #setModifier(Modifier)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getPropertyDefinition_Modifier()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Modifier getModifier();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition#getModifier <em>Modifier</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Modifier</em>' containment reference.
+	 * @see #getModifier()
+	 * @generated
+	 */
+	void setModifier(Modifier value);
+
+	/**
+	 * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Default Value</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Default Value</em>' containment reference.
+	 * @see #setDefaultValue(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getPropertyDefinition_DefaultValue()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getDefaultValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition#getDefaultValue <em>Default Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Default Value</em>' containment reference.
+	 * @see #getDefaultValue()
+	 * @generated
+	 */
+	void setDefaultValue(Expression value);
+
+} // PropertyDefinition
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Route.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Route.java
new file mode 100644
index 0000000..f0405fa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Route.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Route</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Route#getSignals <em>Signals</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Route#getProtocol <em>Protocol</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getRoute()
+ * @model
+ * @generated
+ */
+public interface Route extends NamedElement {
+	/**
+	 * Returns the value of the '<em><b>Signals</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Signal}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Signals</em>' reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Signals</em>' reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getRoute_Signals()
+	 * @model
+	 * @generated
+	 */
+	EList<Signal> getSignals();
+
+	/**
+	 * Returns the value of the '<em><b>Protocol</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Protocol</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Protocol</em>' containment reference.
+	 * @see #setProtocol(ComProtocol)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getRoute_Protocol()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ComProtocol getProtocol();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Route#getProtocol <em>Protocol</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Protocol</em>' containment reference.
+	 * @see #getProtocol()
+	 * @generated
+	 */
+	void setProtocol(ComProtocol value);
+
+} // Route
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Routine.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Routine.java
new file mode 100644
index 0000000..0df045c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Routine.java
@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Routine</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getParameter <em>Parameter</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getBodyBlock <em>Body Block</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getDomain <em>Domain</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getCodomain <em>Codomain</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getRoutine()
+ * @model
+ * @generated
+ */
+public interface Routine extends NamedElement {
+	/**
+	 * Returns the value of the '<em><b>Parameter</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Parameter</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Parameter</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getRoutine_Parameter()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Parameter> getParameter();
+
+	/**
+	 * Returns the value of the '<em><b>Body Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Body Block</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Body Block</em>' containment reference.
+	 * @see #setBodyBlock(BlockStatement)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getRoutine_BodyBlock()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	BlockStatement getBodyBlock();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getBodyBlock <em>Body Block</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Body Block</em>' containment reference.
+	 * @see #getBodyBlock()
+	 * @generated
+	 */
+	void setBodyBlock(BlockStatement value);
+
+	/**
+	 * Returns the value of the '<em><b>Domain</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Domain</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Domain</em>' containment reference.
+	 * @see #setDomain(ParameterSet)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getRoutine_Domain()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ParameterSet getDomain();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getDomain <em>Domain</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Domain</em>' containment reference.
+	 * @see #getDomain()
+	 * @generated
+	 */
+	void setDomain(ParameterSet value);
+
+	/**
+	 * Returns the value of the '<em><b>Codomain</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Codomain</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Codomain</em>' containment reference.
+	 * @see #setCodomain(ParameterSet)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getRoutine_Codomain()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ParameterSet getCodomain();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine#getCodomain <em>Codomain</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Codomain</em>' containment reference.
+	 * @see #getCodomain()
+	 * @generated
+	 */
+	void setCodomain(ParameterSet value);
+
+} // Routine
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Signal.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Signal.java
new file mode 100644
index 0000000..96ea1b5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Signal.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Signal</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Signal#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Signal#getParameter <em>Parameter</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getSignal()
+ * @model
+ * @generated
+ */
+public interface Signal extends ClassifierDefinition {
+	/**
+	 * Returns the value of the '<em><b>Direction</b></em>' attribute.
+	 * The default value is <code>"inout"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Direction</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @see #setDirection(ChannelDirection)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getSignal_Direction()
+	 * @model default="inout"
+	 * @generated
+	 */
+	ChannelDirection getDirection();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Signal#getDirection <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Direction</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+	 * @see #getDirection()
+	 * @generated
+	 */
+	void setDirection(ChannelDirection value);
+
+	/**
+	 * Returns the value of the '<em><b>Parameter</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Parameter</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Parameter</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getSignal_Parameter()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Parameter> getParameter();
+
+} // Signal
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/SlotProperty.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/SlotProperty.java
new file mode 100644
index 0000000..2e720e5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/SlotProperty.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Slot Property</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty#getXliaProperty <em>Xlia Property</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getSlotProperty()
+ * @model
+ * @generated
+ */
+public interface SlotProperty extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Xlia Property</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Xlia Property</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Xlia Property</em>' reference.
+	 * @see #setXliaProperty(PropertyDefinition)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getSlotProperty_XliaProperty()
+	 * @model
+	 * @generated
+	 */
+	PropertyDefinition getXliaProperty();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty#getXliaProperty <em>Xlia Property</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Xlia Property</em>' reference.
+	 * @see #getXliaProperty()
+	 * @generated
+	 */
+	void setXliaProperty(PropertyDefinition value);
+
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' containment reference.
+	 * @see #setValue(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getSlotProperty_Value()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty#getValue <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' containment reference.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(Expression value);
+
+} // SlotProperty
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/System.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/System.java
new file mode 100644
index 0000000..1ed9343
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/System.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>System</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getSystem()
+ * @model
+ * @generated
+ */
+public interface System extends Machine {
+} // System
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Variable.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Variable.java
new file mode 100644
index 0000000..f1d5f00
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/Variable.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Variable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable#isConst <em>Const</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable#isMacro <em>Macro</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable#getOnWriteAction <em>On Write Action</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getVariable()
+ * @model
+ * @generated
+ */
+public interface Variable extends PropertyDefinition {
+	/**
+	 * Returns the value of the '<em><b>Const</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Const</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Const</em>' attribute.
+	 * @see #setConst(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getVariable_Const()
+	 * @model required="true"
+	 * @generated
+	 */
+	boolean isConst();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable#isConst <em>Const</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Const</em>' attribute.
+	 * @see #isConst()
+	 * @generated
+	 */
+	void setConst(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Macro</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Macro</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Macro</em>' attribute.
+	 * @see #setMacro(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getVariable_Macro()
+	 * @model required="true"
+	 * @generated
+	 */
+	boolean isMacro();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable#isMacro <em>Macro</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Macro</em>' attribute.
+	 * @see #isMacro()
+	 * @generated
+	 */
+	void setMacro(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>On Write Action</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>On Write Action</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>On Write Action</em>' containment reference.
+	 * @see #setOnWriteAction(Routine)
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#getVariable_OnWriteAction()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Routine getOnWriteAction();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable#getOnWriteAction <em>On Write Action</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>On Write Action</em>' containment reference.
+	 * @see #getOnWriteAction()
+	 * @generated
+	 */
+	void setOnWriteAction(Routine value);
+
+} // Variable
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/BehaviorImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/BehaviorImpl.java
new file mode 100644
index 0000000..0f954b7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/BehaviorImpl.java
@@ -0,0 +1,364 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Behavior</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BehaviorImpl#getParameter <em>Parameter</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BehaviorImpl#getComputation <em>Computation</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BehaviorImpl#getExecution <em>Execution</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BehaviorImpl#getInteraction <em>Interaction</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class BehaviorImpl extends MachineImpl implements Behavior {
+	/**
+	 * The cached value of the '{@link #getParameter() <em>Parameter</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getParameter()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Parameter> parameter;
+
+	/**
+	 * The cached value of the '{@link #getComputation() <em>Computation</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getComputation()
+	 * @generated
+	 * @ordered
+	 */
+	protected ModelOfComputation computation;
+
+	/**
+	 * The cached value of the '{@link #getExecution() <em>Execution</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExecution()
+	 * @generated
+	 * @ordered
+	 */
+	protected ModelOfExecution execution;
+
+	/**
+	 * The cached value of the '{@link #getInteraction() <em>Interaction</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInteraction()
+	 * @generated
+	 * @ordered
+	 */
+	protected ModelOfInteraction interaction;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BehaviorImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.BEHAVIOR;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Parameter> getParameter() {
+		if (parameter == null) {
+			parameter = new EObjectContainmentEList<Parameter>(Parameter.class, this, InfrastructurePackage.BEHAVIOR__PARAMETER);
+		}
+		return parameter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ModelOfComputation getComputation() {
+		return computation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetComputation(ModelOfComputation newComputation, NotificationChain msgs) {
+		ModelOfComputation oldComputation = computation;
+		computation = newComputation;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BEHAVIOR__COMPUTATION, oldComputation, newComputation);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setComputation(ModelOfComputation newComputation) {
+		if (newComputation != computation) {
+			NotificationChain msgs = null;
+			if (computation != null)
+				msgs = ((InternalEObject)computation).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.BEHAVIOR__COMPUTATION, null, msgs);
+			if (newComputation != null)
+				msgs = ((InternalEObject)newComputation).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.BEHAVIOR__COMPUTATION, null, msgs);
+			msgs = basicSetComputation(newComputation, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BEHAVIOR__COMPUTATION, newComputation, newComputation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ModelOfExecution getExecution() {
+		return execution;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetExecution(ModelOfExecution newExecution, NotificationChain msgs) {
+		ModelOfExecution oldExecution = execution;
+		execution = newExecution;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BEHAVIOR__EXECUTION, oldExecution, newExecution);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setExecution(ModelOfExecution newExecution) {
+		if (newExecution != execution) {
+			NotificationChain msgs = null;
+			if (execution != null)
+				msgs = ((InternalEObject)execution).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.BEHAVIOR__EXECUTION, null, msgs);
+			if (newExecution != null)
+				msgs = ((InternalEObject)newExecution).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.BEHAVIOR__EXECUTION, null, msgs);
+			msgs = basicSetExecution(newExecution, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BEHAVIOR__EXECUTION, newExecution, newExecution));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ModelOfInteraction getInteraction() {
+		return interaction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetInteraction(ModelOfInteraction newInteraction, NotificationChain msgs) {
+		ModelOfInteraction oldInteraction = interaction;
+		interaction = newInteraction;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BEHAVIOR__INTERACTION, oldInteraction, newInteraction);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInteraction(ModelOfInteraction newInteraction) {
+		if (newInteraction != interaction) {
+			NotificationChain msgs = null;
+			if (interaction != null)
+				msgs = ((InternalEObject)interaction).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.BEHAVIOR__INTERACTION, null, msgs);
+			if (newInteraction != null)
+				msgs = ((InternalEObject)newInteraction).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.BEHAVIOR__INTERACTION, null, msgs);
+			msgs = basicSetInteraction(newInteraction, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BEHAVIOR__INTERACTION, newInteraction, newInteraction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.BEHAVIOR__PARAMETER:
+				return ((InternalEList<?>)getParameter()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.BEHAVIOR__COMPUTATION:
+				return basicSetComputation(null, msgs);
+			case InfrastructurePackage.BEHAVIOR__EXECUTION:
+				return basicSetExecution(null, msgs);
+			case InfrastructurePackage.BEHAVIOR__INTERACTION:
+				return basicSetInteraction(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.BEHAVIOR__PARAMETER:
+				return getParameter();
+			case InfrastructurePackage.BEHAVIOR__COMPUTATION:
+				return getComputation();
+			case InfrastructurePackage.BEHAVIOR__EXECUTION:
+				return getExecution();
+			case InfrastructurePackage.BEHAVIOR__INTERACTION:
+				return getInteraction();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.BEHAVIOR__PARAMETER:
+				getParameter().clear();
+				getParameter().addAll((Collection<? extends Parameter>)newValue);
+				return;
+			case InfrastructurePackage.BEHAVIOR__COMPUTATION:
+				setComputation((ModelOfComputation)newValue);
+				return;
+			case InfrastructurePackage.BEHAVIOR__EXECUTION:
+				setExecution((ModelOfExecution)newValue);
+				return;
+			case InfrastructurePackage.BEHAVIOR__INTERACTION:
+				setInteraction((ModelOfInteraction)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.BEHAVIOR__PARAMETER:
+				getParameter().clear();
+				return;
+			case InfrastructurePackage.BEHAVIOR__COMPUTATION:
+				setComputation((ModelOfComputation)null);
+				return;
+			case InfrastructurePackage.BEHAVIOR__EXECUTION:
+				setExecution((ModelOfExecution)null);
+				return;
+			case InfrastructurePackage.BEHAVIOR__INTERACTION:
+				setInteraction((ModelOfInteraction)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.BEHAVIOR__PARAMETER:
+				return parameter != null && !parameter.isEmpty();
+			case InfrastructurePackage.BEHAVIOR__COMPUTATION:
+				return computation != null;
+			case InfrastructurePackage.BEHAVIOR__EXECUTION:
+				return execution != null;
+			case InfrastructurePackage.BEHAVIOR__INTERACTION:
+				return interaction != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //BehaviorImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/BufferImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/BufferImpl.java
new file mode 100644
index 0000000..7c2ec31
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/BufferImpl.java
@@ -0,0 +1,409 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.CollectionType;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Buffer</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BufferImpl#getProtocol <em>Protocol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BufferImpl#getCast <em>Cast</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BufferImpl#getInner_buffer <em>Inner buffer</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.BufferImpl#getRef_buffer <em>Ref buffer</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class BufferImpl extends PropertyDefinitionImpl implements Buffer {
+	/**
+	 * The default value of the '{@link #getProtocol() <em>Protocol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProtocol()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ComProtocolKind PROTOCOL_EDEFAULT = ComProtocolKind.NONE;
+
+	/**
+	 * The cached value of the '{@link #getProtocol() <em>Protocol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProtocol()
+	 * @generated
+	 * @ordered
+	 */
+	protected ComProtocolKind protocol = PROTOCOL_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getCast() <em>Cast</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCast()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ComCastKind CAST_EDEFAULT = ComCastKind.NONE;
+
+	/**
+	 * The cached value of the '{@link #getCast() <em>Cast</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCast()
+	 * @generated
+	 * @ordered
+	 */
+	protected ComCastKind cast = CAST_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getInner_buffer() <em>Inner buffer</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInner_buffer()
+	 * @generated
+	 * @ordered
+	 */
+	protected CollectionType inner_buffer;
+
+	/**
+	 * The cached value of the '{@link #getRef_buffer() <em>Ref buffer</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRef_buffer()
+	 * @generated
+	 * @ordered
+	 */
+	protected Buffer ref_buffer;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BufferImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.BUFFER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComProtocolKind getProtocol() {
+		return protocol;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setProtocol(ComProtocolKind newProtocol) {
+		ComProtocolKind oldProtocol = protocol;
+		protocol = newProtocol == null ? PROTOCOL_EDEFAULT : newProtocol;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BUFFER__PROTOCOL, oldProtocol, protocol));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComCastKind getCast() {
+		return cast;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCast(ComCastKind newCast) {
+		ComCastKind oldCast = cast;
+		cast = newCast == null ? CAST_EDEFAULT : newCast;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BUFFER__CAST, oldCast, cast));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CollectionType getInner_buffer() {
+		return inner_buffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetInner_buffer(CollectionType newInner_buffer, NotificationChain msgs) {
+		CollectionType oldInner_buffer = inner_buffer;
+		inner_buffer = newInner_buffer;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BUFFER__INNER_BUFFER, oldInner_buffer, newInner_buffer);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInner_buffer(CollectionType newInner_buffer) {
+		if (newInner_buffer != inner_buffer) {
+			NotificationChain msgs = null;
+			if (inner_buffer != null)
+				msgs = ((InternalEObject)inner_buffer).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.BUFFER__INNER_BUFFER, null, msgs);
+			if (newInner_buffer != null)
+				msgs = ((InternalEObject)newInner_buffer).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.BUFFER__INNER_BUFFER, null, msgs);
+			msgs = basicSetInner_buffer(newInner_buffer, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BUFFER__INNER_BUFFER, newInner_buffer, newInner_buffer));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Buffer getRef_buffer() {
+		if (ref_buffer != null && ref_buffer.eIsProxy()) {
+			InternalEObject oldRef_buffer = (InternalEObject)ref_buffer;
+			ref_buffer = (Buffer)eResolveProxy(oldRef_buffer);
+			if (ref_buffer != oldRef_buffer) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, InfrastructurePackage.BUFFER__REF_BUFFER, oldRef_buffer, ref_buffer));
+			}
+		}
+		return ref_buffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Buffer basicGetRef_buffer() {
+		return ref_buffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRef_buffer(Buffer newRef_buffer) {
+		Buffer oldRef_buffer = ref_buffer;
+		ref_buffer = newRef_buffer;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.BUFFER__REF_BUFFER, oldRef_buffer, ref_buffer));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.BUFFER__INNER_BUFFER:
+				return basicSetInner_buffer(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.BUFFER__PROTOCOL:
+				return getProtocol();
+			case InfrastructurePackage.BUFFER__CAST:
+				return getCast();
+			case InfrastructurePackage.BUFFER__INNER_BUFFER:
+				return getInner_buffer();
+			case InfrastructurePackage.BUFFER__REF_BUFFER:
+				if (resolve) return getRef_buffer();
+				return basicGetRef_buffer();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.BUFFER__PROTOCOL:
+				setProtocol((ComProtocolKind)newValue);
+				return;
+			case InfrastructurePackage.BUFFER__CAST:
+				setCast((ComCastKind)newValue);
+				return;
+			case InfrastructurePackage.BUFFER__INNER_BUFFER:
+				setInner_buffer((CollectionType)newValue);
+				return;
+			case InfrastructurePackage.BUFFER__REF_BUFFER:
+				setRef_buffer((Buffer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.BUFFER__PROTOCOL:
+				setProtocol(PROTOCOL_EDEFAULT);
+				return;
+			case InfrastructurePackage.BUFFER__CAST:
+				setCast(CAST_EDEFAULT);
+				return;
+			case InfrastructurePackage.BUFFER__INNER_BUFFER:
+				setInner_buffer((CollectionType)null);
+				return;
+			case InfrastructurePackage.BUFFER__REF_BUFFER:
+				setRef_buffer((Buffer)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.BUFFER__PROTOCOL:
+				return protocol != PROTOCOL_EDEFAULT;
+			case InfrastructurePackage.BUFFER__CAST:
+				return cast != CAST_EDEFAULT;
+			case InfrastructurePackage.BUFFER__INNER_BUFFER:
+				return inner_buffer != null;
+			case InfrastructurePackage.BUFFER__REF_BUFFER:
+				return ref_buffer != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+		if (baseClass == ComProtocol.class) {
+			switch (derivedFeatureID) {
+				case InfrastructurePackage.BUFFER__PROTOCOL: return InfrastructurePackage.COM_PROTOCOL__PROTOCOL;
+				case InfrastructurePackage.BUFFER__CAST: return InfrastructurePackage.COM_PROTOCOL__CAST;
+				case InfrastructurePackage.BUFFER__INNER_BUFFER: return InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER;
+				case InfrastructurePackage.BUFFER__REF_BUFFER: return InfrastructurePackage.COM_PROTOCOL__REF_BUFFER;
+				default: return -1;
+			}
+		}
+		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+		if (baseClass == ComProtocol.class) {
+			switch (baseFeatureID) {
+				case InfrastructurePackage.COM_PROTOCOL__PROTOCOL: return InfrastructurePackage.BUFFER__PROTOCOL;
+				case InfrastructurePackage.COM_PROTOCOL__CAST: return InfrastructurePackage.BUFFER__CAST;
+				case InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER: return InfrastructurePackage.BUFFER__INNER_BUFFER;
+				case InfrastructurePackage.COM_PROTOCOL__REF_BUFFER: return InfrastructurePackage.BUFFER__REF_BUFFER;
+				default: return -1;
+			}
+		}
+		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (protocol: ");
+		result.append(protocol);
+		result.append(", cast: ");
+		result.append(cast);
+		result.append(')');
+		return result.toString();
+	}
+
+} //BufferImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ChannelImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ChannelImpl.java
new file mode 100644
index 0000000..41e4f16
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ChannelImpl.java
@@ -0,0 +1,330 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Channel</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ChannelImpl#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ChannelImpl#getMachine <em>Machine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ChannelImpl#getPort <em>Port</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ChannelImpl#getSignal <em>Signal</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ChannelImpl extends PropertyDefinitionImpl implements Channel {
+	/**
+	 * The default value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ChannelDirection DIRECTION_EDEFAULT = ChannelDirection.INOUT;
+
+	/**
+	 * The cached value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected ChannelDirection direction = DIRECTION_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getMachine() <em>Machine</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMachine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Machine machine;
+
+	/**
+	 * The cached value of the '{@link #getPort() <em>Port</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPort()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Port> port;
+
+	/**
+	 * The cached value of the '{@link #getSignal() <em>Signal</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSignal()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Signal> signal;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ChannelImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.CHANNEL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ChannelDirection getDirection() {
+		return direction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDirection(ChannelDirection newDirection) {
+		ChannelDirection oldDirection = direction;
+		direction = newDirection == null ? DIRECTION_EDEFAULT : newDirection;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.CHANNEL__DIRECTION, oldDirection, direction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Machine getMachine() {
+		if (machine != null && machine.eIsProxy()) {
+			InternalEObject oldMachine = (InternalEObject)machine;
+			machine = (Machine)eResolveProxy(oldMachine);
+			if (machine != oldMachine) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, InfrastructurePackage.CHANNEL__MACHINE, oldMachine, machine));
+			}
+		}
+		return machine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Machine basicGetMachine() {
+		return machine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMachine(Machine newMachine) {
+		Machine oldMachine = machine;
+		machine = newMachine;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.CHANNEL__MACHINE, oldMachine, machine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Port> getPort() {
+		if (port == null) {
+			port = new EObjectContainmentEList<Port>(Port.class, this, InfrastructurePackage.CHANNEL__PORT);
+		}
+		return port;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Signal> getSignal() {
+		if (signal == null) {
+			signal = new EObjectContainmentEList<Signal>(Signal.class, this, InfrastructurePackage.CHANNEL__SIGNAL);
+		}
+		return signal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.CHANNEL__PORT:
+				return ((InternalEList<?>)getPort()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.CHANNEL__SIGNAL:
+				return ((InternalEList<?>)getSignal()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.CHANNEL__DIRECTION:
+				return getDirection();
+			case InfrastructurePackage.CHANNEL__MACHINE:
+				if (resolve) return getMachine();
+				return basicGetMachine();
+			case InfrastructurePackage.CHANNEL__PORT:
+				return getPort();
+			case InfrastructurePackage.CHANNEL__SIGNAL:
+				return getSignal();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.CHANNEL__DIRECTION:
+				setDirection((ChannelDirection)newValue);
+				return;
+			case InfrastructurePackage.CHANNEL__MACHINE:
+				setMachine((Machine)newValue);
+				return;
+			case InfrastructurePackage.CHANNEL__PORT:
+				getPort().clear();
+				getPort().addAll((Collection<? extends Port>)newValue);
+				return;
+			case InfrastructurePackage.CHANNEL__SIGNAL:
+				getSignal().clear();
+				getSignal().addAll((Collection<? extends Signal>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.CHANNEL__DIRECTION:
+				setDirection(DIRECTION_EDEFAULT);
+				return;
+			case InfrastructurePackage.CHANNEL__MACHINE:
+				setMachine((Machine)null);
+				return;
+			case InfrastructurePackage.CHANNEL__PORT:
+				getPort().clear();
+				return;
+			case InfrastructurePackage.CHANNEL__SIGNAL:
+				getSignal().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.CHANNEL__DIRECTION:
+				return direction != DIRECTION_EDEFAULT;
+			case InfrastructurePackage.CHANNEL__MACHINE:
+				return machine != null;
+			case InfrastructurePackage.CHANNEL__PORT:
+				return port != null && !port.isEmpty();
+			case InfrastructurePackage.CHANNEL__SIGNAL:
+				return signal != null && !signal.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (direction: ");
+		result.append(direction);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ChannelImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ComPointImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ComPointImpl.java
new file mode 100644
index 0000000..6c7a19b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ComPointImpl.java
@@ -0,0 +1,367 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Com Point</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComPointImpl#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComPointImpl#getProtocol <em>Protocol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComPointImpl#getPoint <em>Point</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComPointImpl#getPoints <em>Points</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ComPointImpl extends MinimalEObjectImpl.Container implements ComPoint {
+	/**
+	 * The default value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ChannelDirection DIRECTION_EDEFAULT = ChannelDirection.INOUT;
+
+	/**
+	 * The cached value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected ChannelDirection direction = DIRECTION_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getProtocol() <em>Protocol</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProtocol()
+	 * @generated
+	 * @ordered
+	 */
+	protected ComProtocol protocol;
+
+	/**
+	 * The cached value of the '{@link #getPoint() <em>Point</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPoint()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression point;
+
+	/**
+	 * The cached value of the '{@link #getPoints() <em>Points</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPoints()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> points;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ComPointImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.COM_POINT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ChannelDirection getDirection() {
+		return direction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDirection(ChannelDirection newDirection) {
+		ChannelDirection oldDirection = direction;
+		direction = newDirection == null ? DIRECTION_EDEFAULT : newDirection;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_POINT__DIRECTION, oldDirection, direction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComProtocol getProtocol() {
+		return protocol;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetProtocol(ComProtocol newProtocol, NotificationChain msgs) {
+		ComProtocol oldProtocol = protocol;
+		protocol = newProtocol;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_POINT__PROTOCOL, oldProtocol, newProtocol);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setProtocol(ComProtocol newProtocol) {
+		if (newProtocol != protocol) {
+			NotificationChain msgs = null;
+			if (protocol != null)
+				msgs = ((InternalEObject)protocol).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.COM_POINT__PROTOCOL, null, msgs);
+			if (newProtocol != null)
+				msgs = ((InternalEObject)newProtocol).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.COM_POINT__PROTOCOL, null, msgs);
+			msgs = basicSetProtocol(newProtocol, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_POINT__PROTOCOL, newProtocol, newProtocol));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getPoint() {
+		return point;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetPoint(Expression newPoint, NotificationChain msgs) {
+		Expression oldPoint = point;
+		point = newPoint;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_POINT__POINT, oldPoint, newPoint);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPoint(Expression newPoint) {
+		if (newPoint != point) {
+			NotificationChain msgs = null;
+			if (point != null)
+				msgs = ((InternalEObject)point).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.COM_POINT__POINT, null, msgs);
+			if (newPoint != null)
+				msgs = ((InternalEObject)newPoint).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.COM_POINT__POINT, null, msgs);
+			msgs = basicSetPoint(newPoint, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_POINT__POINT, newPoint, newPoint));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getPoints() {
+		if (points == null) {
+			points = new EObjectContainmentEList<Expression>(Expression.class, this, InfrastructurePackage.COM_POINT__POINTS);
+		}
+		return points;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_POINT__PROTOCOL:
+				return basicSetProtocol(null, msgs);
+			case InfrastructurePackage.COM_POINT__POINT:
+				return basicSetPoint(null, msgs);
+			case InfrastructurePackage.COM_POINT__POINTS:
+				return ((InternalEList<?>)getPoints()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_POINT__DIRECTION:
+				return getDirection();
+			case InfrastructurePackage.COM_POINT__PROTOCOL:
+				return getProtocol();
+			case InfrastructurePackage.COM_POINT__POINT:
+				return getPoint();
+			case InfrastructurePackage.COM_POINT__POINTS:
+				return getPoints();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_POINT__DIRECTION:
+				setDirection((ChannelDirection)newValue);
+				return;
+			case InfrastructurePackage.COM_POINT__PROTOCOL:
+				setProtocol((ComProtocol)newValue);
+				return;
+			case InfrastructurePackage.COM_POINT__POINT:
+				setPoint((Expression)newValue);
+				return;
+			case InfrastructurePackage.COM_POINT__POINTS:
+				getPoints().clear();
+				getPoints().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_POINT__DIRECTION:
+				setDirection(DIRECTION_EDEFAULT);
+				return;
+			case InfrastructurePackage.COM_POINT__PROTOCOL:
+				setProtocol((ComProtocol)null);
+				return;
+			case InfrastructurePackage.COM_POINT__POINT:
+				setPoint((Expression)null);
+				return;
+			case InfrastructurePackage.COM_POINT__POINTS:
+				getPoints().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_POINT__DIRECTION:
+				return direction != DIRECTION_EDEFAULT;
+			case InfrastructurePackage.COM_POINT__PROTOCOL:
+				return protocol != null;
+			case InfrastructurePackage.COM_POINT__POINT:
+				return point != null;
+			case InfrastructurePackage.COM_POINT__POINTS:
+				return points != null && !points.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (direction: ");
+		result.append(direction);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ComPointImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ComProtocolImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ComProtocolImpl.java
new file mode 100644
index 0000000..5567536
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ComProtocolImpl.java
@@ -0,0 +1,372 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.datatype.CollectionType;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Com Protocol</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComProtocolImpl#getProtocol <em>Protocol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComProtocolImpl#getCast <em>Cast</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComProtocolImpl#getInner_buffer <em>Inner buffer</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ComProtocolImpl#getRef_buffer <em>Ref buffer</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ComProtocolImpl extends MinimalEObjectImpl.Container implements ComProtocol {
+	/**
+	 * The default value of the '{@link #getProtocol() <em>Protocol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProtocol()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ComProtocolKind PROTOCOL_EDEFAULT = ComProtocolKind.NONE;
+
+	/**
+	 * The cached value of the '{@link #getProtocol() <em>Protocol</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProtocol()
+	 * @generated
+	 * @ordered
+	 */
+	protected ComProtocolKind protocol = PROTOCOL_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getCast() <em>Cast</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCast()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ComCastKind CAST_EDEFAULT = ComCastKind.NONE;
+
+	/**
+	 * The cached value of the '{@link #getCast() <em>Cast</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCast()
+	 * @generated
+	 * @ordered
+	 */
+	protected ComCastKind cast = CAST_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getInner_buffer() <em>Inner buffer</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInner_buffer()
+	 * @generated
+	 * @ordered
+	 */
+	protected CollectionType inner_buffer;
+
+	/**
+	 * The cached value of the '{@link #getRef_buffer() <em>Ref buffer</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRef_buffer()
+	 * @generated
+	 * @ordered
+	 */
+	protected Buffer ref_buffer;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ComProtocolImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.COM_PROTOCOL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComProtocolKind getProtocol() {
+		return protocol;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setProtocol(ComProtocolKind newProtocol) {
+		ComProtocolKind oldProtocol = protocol;
+		protocol = newProtocol == null ? PROTOCOL_EDEFAULT : newProtocol;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_PROTOCOL__PROTOCOL, oldProtocol, protocol));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComCastKind getCast() {
+		return cast;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCast(ComCastKind newCast) {
+		ComCastKind oldCast = cast;
+		cast = newCast == null ? CAST_EDEFAULT : newCast;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_PROTOCOL__CAST, oldCast, cast));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CollectionType getInner_buffer() {
+		return inner_buffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetInner_buffer(CollectionType newInner_buffer, NotificationChain msgs) {
+		CollectionType oldInner_buffer = inner_buffer;
+		inner_buffer = newInner_buffer;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER, oldInner_buffer, newInner_buffer);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInner_buffer(CollectionType newInner_buffer) {
+		if (newInner_buffer != inner_buffer) {
+			NotificationChain msgs = null;
+			if (inner_buffer != null)
+				msgs = ((InternalEObject)inner_buffer).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER, null, msgs);
+			if (newInner_buffer != null)
+				msgs = ((InternalEObject)newInner_buffer).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER, null, msgs);
+			msgs = basicSetInner_buffer(newInner_buffer, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER, newInner_buffer, newInner_buffer));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Buffer getRef_buffer() {
+		if (ref_buffer != null && ref_buffer.eIsProxy()) {
+			InternalEObject oldRef_buffer = (InternalEObject)ref_buffer;
+			ref_buffer = (Buffer)eResolveProxy(oldRef_buffer);
+			if (ref_buffer != oldRef_buffer) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, InfrastructurePackage.COM_PROTOCOL__REF_BUFFER, oldRef_buffer, ref_buffer));
+			}
+		}
+		return ref_buffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Buffer basicGetRef_buffer() {
+		return ref_buffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRef_buffer(Buffer newRef_buffer) {
+		Buffer oldRef_buffer = ref_buffer;
+		ref_buffer = newRef_buffer;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.COM_PROTOCOL__REF_BUFFER, oldRef_buffer, ref_buffer));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER:
+				return basicSetInner_buffer(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_PROTOCOL__PROTOCOL:
+				return getProtocol();
+			case InfrastructurePackage.COM_PROTOCOL__CAST:
+				return getCast();
+			case InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER:
+				return getInner_buffer();
+			case InfrastructurePackage.COM_PROTOCOL__REF_BUFFER:
+				if (resolve) return getRef_buffer();
+				return basicGetRef_buffer();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_PROTOCOL__PROTOCOL:
+				setProtocol((ComProtocolKind)newValue);
+				return;
+			case InfrastructurePackage.COM_PROTOCOL__CAST:
+				setCast((ComCastKind)newValue);
+				return;
+			case InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER:
+				setInner_buffer((CollectionType)newValue);
+				return;
+			case InfrastructurePackage.COM_PROTOCOL__REF_BUFFER:
+				setRef_buffer((Buffer)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_PROTOCOL__PROTOCOL:
+				setProtocol(PROTOCOL_EDEFAULT);
+				return;
+			case InfrastructurePackage.COM_PROTOCOL__CAST:
+				setCast(CAST_EDEFAULT);
+				return;
+			case InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER:
+				setInner_buffer((CollectionType)null);
+				return;
+			case InfrastructurePackage.COM_PROTOCOL__REF_BUFFER:
+				setRef_buffer((Buffer)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.COM_PROTOCOL__PROTOCOL:
+				return protocol != PROTOCOL_EDEFAULT;
+			case InfrastructurePackage.COM_PROTOCOL__CAST:
+				return cast != CAST_EDEFAULT;
+			case InfrastructurePackage.COM_PROTOCOL__INNER_BUFFER:
+				return inner_buffer != null;
+			case InfrastructurePackage.COM_PROTOCOL__REF_BUFFER:
+				return ref_buffer != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (protocol: ");
+		result.append(protocol);
+		result.append(", cast: ");
+		result.append(cast);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ComProtocolImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ConnectionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ConnectionImpl.java
new file mode 100644
index 0000000..08d02b1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ConnectionImpl.java
@@ -0,0 +1,301 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.Connection;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Connection</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ConnectionImpl#getProtocol <em>Protocol</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ConnectionImpl#getCast <em>Cast</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ConnectionImpl#getComPoints <em>Com Points</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ConnectionImpl extends NamedElementImpl implements Connection {
+	/**
+	 * The cached value of the '{@link #getProtocol() <em>Protocol</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProtocol()
+	 * @generated
+	 * @ordered
+	 */
+	protected ComProtocol protocol;
+
+	/**
+	 * The default value of the '{@link #getCast() <em>Cast</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCast()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ComCastKind CAST_EDEFAULT = ComCastKind.NONE;
+
+	/**
+	 * The cached value of the '{@link #getCast() <em>Cast</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCast()
+	 * @generated
+	 * @ordered
+	 */
+	protected ComCastKind cast = CAST_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getComPoints() <em>Com Points</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getComPoints()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<ComPoint> comPoints;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ConnectionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.CONNECTION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComProtocol getProtocol() {
+		return protocol;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetProtocol(ComProtocol newProtocol, NotificationChain msgs) {
+		ComProtocol oldProtocol = protocol;
+		protocol = newProtocol;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.CONNECTION__PROTOCOL, oldProtocol, newProtocol);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setProtocol(ComProtocol newProtocol) {
+		if (newProtocol != protocol) {
+			NotificationChain msgs = null;
+			if (protocol != null)
+				msgs = ((InternalEObject)protocol).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.CONNECTION__PROTOCOL, null, msgs);
+			if (newProtocol != null)
+				msgs = ((InternalEObject)newProtocol).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.CONNECTION__PROTOCOL, null, msgs);
+			msgs = basicSetProtocol(newProtocol, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.CONNECTION__PROTOCOL, newProtocol, newProtocol));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComCastKind getCast() {
+		return cast;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCast(ComCastKind newCast) {
+		ComCastKind oldCast = cast;
+		cast = newCast == null ? CAST_EDEFAULT : newCast;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.CONNECTION__CAST, oldCast, cast));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<ComPoint> getComPoints() {
+		if (comPoints == null) {
+			comPoints = new EObjectContainmentEList<ComPoint>(ComPoint.class, this, InfrastructurePackage.CONNECTION__COM_POINTS);
+		}
+		return comPoints;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.CONNECTION__PROTOCOL:
+				return basicSetProtocol(null, msgs);
+			case InfrastructurePackage.CONNECTION__COM_POINTS:
+				return ((InternalEList<?>)getComPoints()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.CONNECTION__PROTOCOL:
+				return getProtocol();
+			case InfrastructurePackage.CONNECTION__CAST:
+				return getCast();
+			case InfrastructurePackage.CONNECTION__COM_POINTS:
+				return getComPoints();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.CONNECTION__PROTOCOL:
+				setProtocol((ComProtocol)newValue);
+				return;
+			case InfrastructurePackage.CONNECTION__CAST:
+				setCast((ComCastKind)newValue);
+				return;
+			case InfrastructurePackage.CONNECTION__COM_POINTS:
+				getComPoints().clear();
+				getComPoints().addAll((Collection<? extends ComPoint>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.CONNECTION__PROTOCOL:
+				setProtocol((ComProtocol)null);
+				return;
+			case InfrastructurePackage.CONNECTION__CAST:
+				setCast(CAST_EDEFAULT);
+				return;
+			case InfrastructurePackage.CONNECTION__COM_POINTS:
+				getComPoints().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.CONNECTION__PROTOCOL:
+				return protocol != null;
+			case InfrastructurePackage.CONNECTION__CAST:
+				return cast != CAST_EDEFAULT;
+			case InfrastructurePackage.CONNECTION__COM_POINTS:
+				return comPoints != null && !comPoints.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (cast: ");
+		result.append(cast);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ConnectionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/InfrastructureFactoryImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/InfrastructureFactoryImpl.java
new file mode 100644
index 0000000..f33c2ce
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/InfrastructureFactoryImpl.java
@@ -0,0 +1,522 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.Connection;
+import org.eclipse.efm.ecore.formalml.infrastructure.DesignKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructureFactory;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction;
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Procedure;
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+import org.eclipse.efm.ecore.formalml.infrastructure.Route;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty;
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class InfrastructureFactoryImpl extends EFactoryImpl implements InfrastructureFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static InfrastructureFactory init() {
+		try {
+			InfrastructureFactory theInfrastructureFactory = (InfrastructureFactory)EPackage.Registry.INSTANCE.getEFactory(InfrastructurePackage.eNS_URI);
+			if (theInfrastructureFactory != null) {
+				return theInfrastructureFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new InfrastructureFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InfrastructureFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case InfrastructurePackage.MACHINE: return createMachine();
+			case InfrastructurePackage.SYSTEM: return createSystem();
+			case InfrastructurePackage.MODIFIER: return createModifier();
+			case InfrastructurePackage.PROPERTY_DEFINITION: return createPropertyDefinition();
+			case InfrastructurePackage.VARIABLE: return createVariable();
+			case InfrastructurePackage.BUFFER: return createBuffer();
+			case InfrastructurePackage.PORT: return createPort();
+			case InfrastructurePackage.CHANNEL: return createChannel();
+			case InfrastructurePackage.SIGNAL: return createSignal();
+			case InfrastructurePackage.PROCEDURE: return createProcedure();
+			case InfrastructurePackage.ROUTINE: return createRoutine();
+			case InfrastructurePackage.INSTANCE_MACHINE: return createInstanceMachine();
+			case InfrastructurePackage.SLOT_PROPERTY: return createSlotProperty();
+			case InfrastructurePackage.PARAMETER: return createParameter();
+			case InfrastructurePackage.PARAMETER_SET: return createParameterSet();
+			case InfrastructurePackage.BEHAVIOR: return createBehavior();
+			case InfrastructurePackage.MODEL_OF_COMPUTATION: return createModelOfComputation();
+			case InfrastructurePackage.MODEL_OF_EXECUTION: return createModelOfExecution();
+			case InfrastructurePackage.MODEL_OF_INTERACTION: return createModelOfInteraction();
+			case InfrastructurePackage.COM_PROTOCOL: return createComProtocol();
+			case InfrastructurePackage.ROUTE: return createRoute();
+			case InfrastructurePackage.CONNECTION: return createConnection();
+			case InfrastructurePackage.COM_POINT: return createComPoint();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case InfrastructurePackage.DESIGN_KIND:
+				return createDesignKindFromString(eDataType, initialValue);
+			case InfrastructurePackage.CHANNEL_DIRECTION:
+				return createChannelDirectionFromString(eDataType, initialValue);
+			case InfrastructurePackage.PARAMETER_DIRECTION_KIND:
+				return createParameterDirectionKindFromString(eDataType, initialValue);
+			case InfrastructurePackage.COM_PROTOCOL_KIND:
+				return createComProtocolKindFromString(eDataType, initialValue);
+			case InfrastructurePackage.COM_CAST_KIND:
+				return createComCastKindFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case InfrastructurePackage.DESIGN_KIND:
+				return convertDesignKindToString(eDataType, instanceValue);
+			case InfrastructurePackage.CHANNEL_DIRECTION:
+				return convertChannelDirectionToString(eDataType, instanceValue);
+			case InfrastructurePackage.PARAMETER_DIRECTION_KIND:
+				return convertParameterDirectionKindToString(eDataType, instanceValue);
+			case InfrastructurePackage.COM_PROTOCOL_KIND:
+				return convertComProtocolKindToString(eDataType, instanceValue);
+			case InfrastructurePackage.COM_CAST_KIND:
+				return convertComCastKindToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Machine createMachine() {
+		MachineImpl machine = new MachineImpl();
+		return machine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public org.eclipse.efm.ecore.formalml.infrastructure.System createSystem() {
+		SystemImpl system = new SystemImpl();
+		return system;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Modifier createModifier() {
+		ModifierImpl modifier = new ModifierImpl();
+		return modifier;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PropertyDefinition createPropertyDefinition() {
+		PropertyDefinitionImpl propertyDefinition = new PropertyDefinitionImpl();
+		return propertyDefinition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Variable createVariable() {
+		VariableImpl variable = new VariableImpl();
+		return variable;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Buffer createBuffer() {
+		BufferImpl buffer = new BufferImpl();
+		return buffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Port createPort() {
+		PortImpl port = new PortImpl();
+		return port;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Channel createChannel() {
+		ChannelImpl channel = new ChannelImpl();
+		return channel;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Signal createSignal() {
+		SignalImpl signal = new SignalImpl();
+		return signal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Procedure createProcedure() {
+		ProcedureImpl procedure = new ProcedureImpl();
+		return procedure;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine createRoutine() {
+		RoutineImpl routine = new RoutineImpl();
+		return routine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InstanceMachine createInstanceMachine() {
+		InstanceMachineImpl instanceMachine = new InstanceMachineImpl();
+		return instanceMachine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SlotProperty createSlotProperty() {
+		SlotPropertyImpl slotProperty = new SlotPropertyImpl();
+		return slotProperty;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Parameter createParameter() {
+		ParameterImpl parameter = new ParameterImpl();
+		return parameter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ParameterSet createParameterSet() {
+		ParameterSetImpl parameterSet = new ParameterSetImpl();
+		return parameterSet;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Behavior createBehavior() {
+		BehaviorImpl behavior = new BehaviorImpl();
+		return behavior;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ModelOfComputation createModelOfComputation() {
+		ModelOfComputationImpl modelOfComputation = new ModelOfComputationImpl();
+		return modelOfComputation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ModelOfExecution createModelOfExecution() {
+		ModelOfExecutionImpl modelOfExecution = new ModelOfExecutionImpl();
+		return modelOfExecution;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ModelOfInteraction createModelOfInteraction() {
+		ModelOfInteractionImpl modelOfInteraction = new ModelOfInteractionImpl();
+		return modelOfInteraction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComProtocol createComProtocol() {
+		ComProtocolImpl comProtocol = new ComProtocolImpl();
+		return comProtocol;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Route createRoute() {
+		RouteImpl route = new RouteImpl();
+		return route;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Connection createConnection() {
+		ConnectionImpl connection = new ConnectionImpl();
+		return connection;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComPoint createComPoint() {
+		ComPointImpl comPoint = new ComPointImpl();
+		return comPoint;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DesignKind createDesignKindFromString(EDataType eDataType, String initialValue) {
+		DesignKind result = DesignKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertDesignKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ChannelDirection createChannelDirectionFromString(EDataType eDataType, String initialValue) {
+		ChannelDirection result = ChannelDirection.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertChannelDirectionToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ParameterDirectionKind createParameterDirectionKindFromString(EDataType eDataType, String initialValue) {
+		ParameterDirectionKind result = ParameterDirectionKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertParameterDirectionKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComProtocolKind createComProtocolKindFromString(EDataType eDataType, String initialValue) {
+		ComProtocolKind result = ComProtocolKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertComProtocolKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComCastKind createComCastKindFromString(EDataType eDataType, String initialValue) {
+		ComCastKind result = ComCastKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertComCastKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InfrastructurePackage getInfrastructurePackage() {
+		return (InfrastructurePackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static InfrastructurePackage getPackage() {
+		return InfrastructurePackage.eINSTANCE;
+	}
+
+} //InfrastructureFactoryImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/InfrastructurePackageImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/InfrastructurePackageImpl.java
new file mode 100644
index 0000000..32edc5e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/InfrastructurePackageImpl.java
@@ -0,0 +1,1640 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.Connection;
+import org.eclipse.efm.ecore.formalml.infrastructure.DesignKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructureFactory;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction;
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Procedure;
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+import org.eclipse.efm.ecore.formalml.infrastructure.Route;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty;
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class InfrastructurePackageImpl extends EPackageImpl implements InfrastructurePackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass machineEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass systemEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass modifierEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass propertyDefinitionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass variableEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass bufferEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass portEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass channelEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass signalEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass procedureEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass routineEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass instanceMachineEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass slotPropertyEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass parameterEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass parameterSetEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass behaviorEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass modelOfComputationEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass modelOfExecutionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass modelOfInteractionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass comProtocolEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass routeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass connectionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass comPointEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum designKindEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum channelDirectionEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum parameterDirectionKindEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum comProtocolKindEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum comCastKindEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private InfrastructurePackageImpl() {
+		super(eNS_URI, InfrastructureFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link InfrastructurePackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static InfrastructurePackage init() {
+		if (isInited) return (InfrastructurePackage)EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI);
+
+		// Obtain or create and register package
+		InfrastructurePackageImpl theInfrastructurePackage = (InfrastructurePackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof InfrastructurePackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new InfrastructurePackageImpl());
+
+		isInited = true;
+
+		// Obtain or create and register interdependencies
+		FormalmlPackageImpl theFormalmlPackage = (FormalmlPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) instanceof FormalmlPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) : FormalmlPackage.eINSTANCE);
+		CommonPackageImpl theCommonPackage = (CommonPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) instanceof CommonPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) : CommonPackage.eINSTANCE);
+		DatatypePackageImpl theDatatypePackage = (DatatypePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) instanceof DatatypePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) : DatatypePackage.eINSTANCE);
+		ExpressionPackageImpl theExpressionPackage = (ExpressionPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) instanceof ExpressionPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) : ExpressionPackage.eINSTANCE);
+		StatementPackageImpl theStatementPackage = (StatementPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) instanceof StatementPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) : StatementPackage.eINSTANCE);
+		StatemachinePackageImpl theStatemachinePackage = (StatemachinePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) instanceof StatemachinePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) : StatemachinePackage.eINSTANCE);
+
+		// Create package meta-data objects
+		theInfrastructurePackage.createPackageContents();
+		theFormalmlPackage.createPackageContents();
+		theCommonPackage.createPackageContents();
+		theDatatypePackage.createPackageContents();
+		theExpressionPackage.createPackageContents();
+		theStatementPackage.createPackageContents();
+		theStatemachinePackage.createPackageContents();
+
+		// Initialize created meta-data
+		theInfrastructurePackage.initializePackageContents();
+		theFormalmlPackage.initializePackageContents();
+		theCommonPackage.initializePackageContents();
+		theDatatypePackage.initializePackageContents();
+		theExpressionPackage.initializePackageContents();
+		theStatementPackage.initializePackageContents();
+		theStatemachinePackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theInfrastructurePackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(InfrastructurePackage.eNS_URI, theInfrastructurePackage);
+		return theInfrastructurePackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getMachine() {
+		return machineEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getMachine_Input_enabled() {
+		return (EAttribute)machineEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getMachine_Timed() {
+		return (EAttribute)machineEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getMachine_Design() {
+		return (EAttribute)machineEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Machine() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Typedef() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Property() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Channel() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(6);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Port() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(7);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Signal() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(8);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Buffer() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(9);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Routine() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(10);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Procedure() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(11);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Instance() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(12);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Behavior() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(13);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMachine_Main() {
+		return (EReference)machineEClass.getEStructuralFeatures().get(14);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSystem() {
+		return systemEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getModifier() {
+		return modifierEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getModifier_Static() {
+		return (EAttribute)modifierEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getModifier_Final() {
+		return (EAttribute)modifierEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getModifier_Reference() {
+		return (EAttribute)modifierEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getModifier_Volatile() {
+		return (EAttribute)modifierEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getModifier_Transient() {
+		return (EAttribute)modifierEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPropertyDefinition() {
+		return propertyDefinitionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPropertyDefinition_Modifier() {
+		return (EReference)propertyDefinitionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPropertyDefinition_DefaultValue() {
+		return (EReference)propertyDefinitionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getVariable() {
+		return variableEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVariable_Const() {
+		return (EAttribute)variableEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVariable_Macro() {
+		return (EAttribute)variableEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVariable_OnWriteAction() {
+		return (EReference)variableEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBuffer() {
+		return bufferEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPort() {
+		return portEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getPort_Direction() {
+		return (EAttribute)portEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPort_Signal() {
+		return (EReference)portEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPort_Parameter() {
+		return (EReference)portEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getChannel() {
+		return channelEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getChannel_Direction() {
+		return (EAttribute)channelEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getChannel_Machine() {
+		return (EReference)channelEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getChannel_Port() {
+		return (EReference)channelEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getChannel_Signal() {
+		return (EReference)channelEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSignal() {
+		return signalEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getSignal_Direction() {
+		return (EAttribute)signalEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getSignal_Parameter() {
+		return (EReference)signalEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getProcedure() {
+		return procedureEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getRoutine() {
+		return routineEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRoutine_Parameter() {
+		return (EReference)routineEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRoutine_BodyBlock() {
+		return (EReference)routineEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRoutine_Domain() {
+		return (EReference)routineEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRoutine_Codomain() {
+		return (EReference)routineEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getInstanceMachine() {
+		return instanceMachineEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInstanceMachine_Modifier() {
+		return (EReference)instanceMachineEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInstanceMachine_Model() {
+		return (EReference)instanceMachineEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInstanceMachine_Arg() {
+		return (EReference)instanceMachineEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInstanceMachine_Slot() {
+		return (EReference)instanceMachineEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSlotProperty() {
+		return slotPropertyEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getSlotProperty_XliaProperty() {
+		return (EReference)slotPropertyEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getSlotProperty_Value() {
+		return (EReference)slotPropertyEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getParameter() {
+		return parameterEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getParameter_Direction() {
+		return (EAttribute)parameterEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getParameterSet() {
+		return parameterSetEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getParameterSet_Parameter() {
+		return (EReference)parameterSetEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBehavior() {
+		return behaviorEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBehavior_Parameter() {
+		return (EReference)behaviorEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBehavior_Computation() {
+		return (EReference)behaviorEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBehavior_Execution() {
+		return (EReference)behaviorEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBehavior_Interaction() {
+		return (EReference)behaviorEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getModelOfComputation() {
+		return modelOfComputationEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getModelOfExecution() {
+		return modelOfExecutionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfExecution_InitRoutine() {
+		return (EReference)modelOfExecutionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfExecution_FinalRoutine() {
+		return (EReference)modelOfExecutionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfExecution_EnableRoutine() {
+		return (EReference)modelOfExecutionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfExecution_DisableRoutine() {
+		return (EReference)modelOfExecutionEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfExecution_ConcurrencyRoutine() {
+		return (EReference)modelOfExecutionEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfExecution_ScheduleRoutine() {
+		return (EReference)modelOfExecutionEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfExecution_IrunRoutine() {
+		return (EReference)modelOfExecutionEClass.getEStructuralFeatures().get(6);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfExecution_RunRoutine() {
+		return (EReference)modelOfExecutionEClass.getEStructuralFeatures().get(7);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfExecution_Routine() {
+		return (EReference)modelOfExecutionEClass.getEStructuralFeatures().get(8);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getModelOfInteraction() {
+		return modelOfInteractionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfInteraction_Routes() {
+		return (EReference)modelOfInteractionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getModelOfInteraction_Connections() {
+		return (EReference)modelOfInteractionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getComProtocol() {
+		return comProtocolEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getComProtocol_Protocol() {
+		return (EAttribute)comProtocolEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getComProtocol_Cast() {
+		return (EAttribute)comProtocolEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getComProtocol_Inner_buffer() {
+		return (EReference)comProtocolEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getComProtocol_Ref_buffer() {
+		return (EReference)comProtocolEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getRoute() {
+		return routeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRoute_Signals() {
+		return (EReference)routeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRoute_Protocol() {
+		return (EReference)routeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getConnection() {
+		return connectionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getConnection_Protocol() {
+		return (EReference)connectionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getConnection_Cast() {
+		return (EAttribute)connectionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getConnection_ComPoints() {
+		return (EReference)connectionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getComPoint() {
+		return comPointEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getComPoint_Direction() {
+		return (EAttribute)comPointEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getComPoint_Protocol() {
+		return (EReference)comPointEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getComPoint_Point() {
+		return (EReference)comPointEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getComPoint_Points() {
+		return (EReference)comPointEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getDesignKind() {
+		return designKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getChannelDirection() {
+		return channelDirectionEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getParameterDirectionKind() {
+		return parameterDirectionKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getComProtocolKind() {
+		return comProtocolKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getComCastKind() {
+		return comCastKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InfrastructureFactory getInfrastructureFactory() {
+		return (InfrastructureFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		machineEClass = createEClass(MACHINE);
+		createEAttribute(machineEClass, MACHINE__INPUT_ENABLED);
+		createEAttribute(machineEClass, MACHINE__TIMED);
+		createEAttribute(machineEClass, MACHINE__DESIGN);
+		createEReference(machineEClass, MACHINE__MACHINE);
+		createEReference(machineEClass, MACHINE__TYPEDEF);
+		createEReference(machineEClass, MACHINE__PROPERTY);
+		createEReference(machineEClass, MACHINE__CHANNEL);
+		createEReference(machineEClass, MACHINE__PORT);
+		createEReference(machineEClass, MACHINE__SIGNAL);
+		createEReference(machineEClass, MACHINE__BUFFER);
+		createEReference(machineEClass, MACHINE__ROUTINE);
+		createEReference(machineEClass, MACHINE__PROCEDURE);
+		createEReference(machineEClass, MACHINE__INSTANCE);
+		createEReference(machineEClass, MACHINE__BEHAVIOR);
+		createEReference(machineEClass, MACHINE__MAIN);
+
+		systemEClass = createEClass(SYSTEM);
+
+		modifierEClass = createEClass(MODIFIER);
+		createEAttribute(modifierEClass, MODIFIER__STATIC);
+		createEAttribute(modifierEClass, MODIFIER__FINAL);
+		createEAttribute(modifierEClass, MODIFIER__REFERENCE);
+		createEAttribute(modifierEClass, MODIFIER__VOLATILE);
+		createEAttribute(modifierEClass, MODIFIER__TRANSIENT);
+
+		propertyDefinitionEClass = createEClass(PROPERTY_DEFINITION);
+		createEReference(propertyDefinitionEClass, PROPERTY_DEFINITION__MODIFIER);
+		createEReference(propertyDefinitionEClass, PROPERTY_DEFINITION__DEFAULT_VALUE);
+
+		variableEClass = createEClass(VARIABLE);
+		createEAttribute(variableEClass, VARIABLE__CONST);
+		createEAttribute(variableEClass, VARIABLE__MACRO);
+		createEReference(variableEClass, VARIABLE__ON_WRITE_ACTION);
+
+		bufferEClass = createEClass(BUFFER);
+
+		portEClass = createEClass(PORT);
+		createEAttribute(portEClass, PORT__DIRECTION);
+		createEReference(portEClass, PORT__SIGNAL);
+		createEReference(portEClass, PORT__PARAMETER);
+
+		channelEClass = createEClass(CHANNEL);
+		createEAttribute(channelEClass, CHANNEL__DIRECTION);
+		createEReference(channelEClass, CHANNEL__MACHINE);
+		createEReference(channelEClass, CHANNEL__PORT);
+		createEReference(channelEClass, CHANNEL__SIGNAL);
+
+		signalEClass = createEClass(SIGNAL);
+		createEAttribute(signalEClass, SIGNAL__DIRECTION);
+		createEReference(signalEClass, SIGNAL__PARAMETER);
+
+		procedureEClass = createEClass(PROCEDURE);
+
+		routineEClass = createEClass(ROUTINE);
+		createEReference(routineEClass, ROUTINE__PARAMETER);
+		createEReference(routineEClass, ROUTINE__BODY_BLOCK);
+		createEReference(routineEClass, ROUTINE__DOMAIN);
+		createEReference(routineEClass, ROUTINE__CODOMAIN);
+
+		instanceMachineEClass = createEClass(INSTANCE_MACHINE);
+		createEReference(instanceMachineEClass, INSTANCE_MACHINE__MODIFIER);
+		createEReference(instanceMachineEClass, INSTANCE_MACHINE__MODEL);
+		createEReference(instanceMachineEClass, INSTANCE_MACHINE__ARG);
+		createEReference(instanceMachineEClass, INSTANCE_MACHINE__SLOT);
+
+		slotPropertyEClass = createEClass(SLOT_PROPERTY);
+		createEReference(slotPropertyEClass, SLOT_PROPERTY__XLIA_PROPERTY);
+		createEReference(slotPropertyEClass, SLOT_PROPERTY__VALUE);
+
+		parameterEClass = createEClass(PARAMETER);
+		createEAttribute(parameterEClass, PARAMETER__DIRECTION);
+
+		parameterSetEClass = createEClass(PARAMETER_SET);
+		createEReference(parameterSetEClass, PARAMETER_SET__PARAMETER);
+
+		behaviorEClass = createEClass(BEHAVIOR);
+		createEReference(behaviorEClass, BEHAVIOR__PARAMETER);
+		createEReference(behaviorEClass, BEHAVIOR__COMPUTATION);
+		createEReference(behaviorEClass, BEHAVIOR__EXECUTION);
+		createEReference(behaviorEClass, BEHAVIOR__INTERACTION);
+
+		modelOfComputationEClass = createEClass(MODEL_OF_COMPUTATION);
+
+		modelOfExecutionEClass = createEClass(MODEL_OF_EXECUTION);
+		createEReference(modelOfExecutionEClass, MODEL_OF_EXECUTION__INIT_ROUTINE);
+		createEReference(modelOfExecutionEClass, MODEL_OF_EXECUTION__FINAL_ROUTINE);
+		createEReference(modelOfExecutionEClass, MODEL_OF_EXECUTION__ENABLE_ROUTINE);
+		createEReference(modelOfExecutionEClass, MODEL_OF_EXECUTION__DISABLE_ROUTINE);
+		createEReference(modelOfExecutionEClass, MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE);
+		createEReference(modelOfExecutionEClass, MODEL_OF_EXECUTION__SCHEDULE_ROUTINE);
+		createEReference(modelOfExecutionEClass, MODEL_OF_EXECUTION__IRUN_ROUTINE);
+		createEReference(modelOfExecutionEClass, MODEL_OF_EXECUTION__RUN_ROUTINE);
+		createEReference(modelOfExecutionEClass, MODEL_OF_EXECUTION__ROUTINE);
+
+		modelOfInteractionEClass = createEClass(MODEL_OF_INTERACTION);
+		createEReference(modelOfInteractionEClass, MODEL_OF_INTERACTION__ROUTES);
+		createEReference(modelOfInteractionEClass, MODEL_OF_INTERACTION__CONNECTIONS);
+
+		comProtocolEClass = createEClass(COM_PROTOCOL);
+		createEAttribute(comProtocolEClass, COM_PROTOCOL__PROTOCOL);
+		createEAttribute(comProtocolEClass, COM_PROTOCOL__CAST);
+		createEReference(comProtocolEClass, COM_PROTOCOL__INNER_BUFFER);
+		createEReference(comProtocolEClass, COM_PROTOCOL__REF_BUFFER);
+
+		routeEClass = createEClass(ROUTE);
+		createEReference(routeEClass, ROUTE__SIGNALS);
+		createEReference(routeEClass, ROUTE__PROTOCOL);
+
+		connectionEClass = createEClass(CONNECTION);
+		createEReference(connectionEClass, CONNECTION__PROTOCOL);
+		createEAttribute(connectionEClass, CONNECTION__CAST);
+		createEReference(connectionEClass, CONNECTION__COM_POINTS);
+
+		comPointEClass = createEClass(COM_POINT);
+		createEAttribute(comPointEClass, COM_POINT__DIRECTION);
+		createEReference(comPointEClass, COM_POINT__PROTOCOL);
+		createEReference(comPointEClass, COM_POINT__POINT);
+		createEReference(comPointEClass, COM_POINT__POINTS);
+
+		// Create enums
+		designKindEEnum = createEEnum(DESIGN_KIND);
+		channelDirectionEEnum = createEEnum(CHANNEL_DIRECTION);
+		parameterDirectionKindEEnum = createEEnum(PARAMETER_DIRECTION_KIND);
+		comProtocolKindEEnum = createEEnum(COM_PROTOCOL_KIND);
+		comCastKindEEnum = createEEnum(COM_CAST_KIND);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		CommonPackage theCommonPackage = (CommonPackage)EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI);
+		DatatypePackage theDatatypePackage = (DatatypePackage)EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI);
+		ExpressionPackage theExpressionPackage = (ExpressionPackage)EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI);
+		StatemachinePackage theStatemachinePackage = (StatemachinePackage)EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI);
+		StatementPackage theStatementPackage = (StatementPackage)EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		machineEClass.getESuperTypes().add(theCommonPackage.getClassifierDefinition());
+		systemEClass.getESuperTypes().add(this.getMachine());
+		propertyDefinitionEClass.getESuperTypes().add(theCommonPackage.getTypedElement());
+		variableEClass.getESuperTypes().add(this.getPropertyDefinition());
+		bufferEClass.getESuperTypes().add(this.getPropertyDefinition());
+		bufferEClass.getESuperTypes().add(this.getComProtocol());
+		portEClass.getESuperTypes().add(this.getPropertyDefinition());
+		channelEClass.getESuperTypes().add(this.getPropertyDefinition());
+		signalEClass.getESuperTypes().add(theCommonPackage.getClassifierDefinition());
+		procedureEClass.getESuperTypes().add(theStatemachinePackage.getStatemachine());
+		routineEClass.getESuperTypes().add(theCommonPackage.getNamedElement());
+		instanceMachineEClass.getESuperTypes().add(theCommonPackage.getTypedElement());
+		parameterEClass.getESuperTypes().add(this.getPropertyDefinition());
+		behaviorEClass.getESuperTypes().add(this.getMachine());
+		routeEClass.getESuperTypes().add(theCommonPackage.getNamedElement());
+		connectionEClass.getESuperTypes().add(theCommonPackage.getNamedElement());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(machineEClass, Machine.class, "Machine", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getMachine_Input_enabled(), ecorePackage.getEBoolean(), "input_enabled", "false", 1, 1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getMachine_Timed(), ecorePackage.getEBoolean(), "timed", "false", 1, 1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getMachine_Design(), this.getDesignKind(), "design", "prototype", 1, 1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Machine(), this.getMachine(), null, "machine", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Typedef(), theDatatypePackage.getDataType(), null, "typedef", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Property(), this.getPropertyDefinition(), null, "property", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Channel(), this.getChannel(), null, "channel", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Port(), this.getPort(), null, "port", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Signal(), this.getSignal(), null, "signal", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Buffer(), this.getBuffer(), null, "buffer", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Routine(), this.getRoutine(), null, "routine", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Procedure(), this.getProcedure(), null, "procedure", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Instance(), this.getInstanceMachine(), null, "instance", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Behavior(), this.getBehavior(), null, "behavior", null, 0, -1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMachine_Main(), this.getBehavior(), null, "main", null, 0, 1, Machine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(systemEClass, org.eclipse.efm.ecore.formalml.infrastructure.System.class, "System", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(modifierEClass, Modifier.class, "Modifier", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getModifier_Static(), ecorePackage.getEBoolean(), "static", "false", 1, 1, Modifier.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getModifier_Final(), ecorePackage.getEBoolean(), "final", "false", 1, 1, Modifier.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getModifier_Reference(), ecorePackage.getEBoolean(), "reference", "false", 1, 1, Modifier.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getModifier_Volatile(), ecorePackage.getEBoolean(), "volatile", "false", 1, 1, Modifier.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getModifier_Transient(), ecorePackage.getEBoolean(), "transient", "false", 1, 1, Modifier.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(propertyDefinitionEClass, PropertyDefinition.class, "PropertyDefinition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getPropertyDefinition_Modifier(), this.getModifier(), null, "modifier", null, 0, 1, PropertyDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPropertyDefinition_DefaultValue(), theExpressionPackage.getExpression(), null, "defaultValue", null, 0, 1, PropertyDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(variableEClass, Variable.class, "Variable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getVariable_Const(), ecorePackage.getEBoolean(), "const", null, 1, 1, Variable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVariable_Macro(), ecorePackage.getEBoolean(), "macro", null, 1, 1, Variable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVariable_OnWriteAction(), this.getRoutine(), null, "onWriteAction", null, 0, 1, Variable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(bufferEClass, Buffer.class, "Buffer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(portEClass, Port.class, "Port", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getPort_Direction(), this.getChannelDirection(), "direction", "inout", 0, 1, Port.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPort_Signal(), this.getSignal(), null, "signal", null, 0, -1, Port.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPort_Parameter(), this.getParameter(), null, "parameter", null, 0, -1, Port.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(channelEClass, Channel.class, "Channel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getChannel_Direction(), this.getChannelDirection(), "direction", "inout", 0, 1, Channel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getChannel_Machine(), this.getMachine(), null, "machine", null, 0, 1, Channel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getChannel_Port(), this.getPort(), null, "port", null, 0, -1, Channel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getChannel_Signal(), this.getSignal(), null, "signal", null, 0, -1, Channel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(signalEClass, Signal.class, "Signal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getSignal_Direction(), this.getChannelDirection(), "direction", "inout", 0, 1, Signal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getSignal_Parameter(), this.getParameter(), null, "parameter", null, 0, -1, Signal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(procedureEClass, Procedure.class, "Procedure", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(routineEClass, Routine.class, "Routine", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getRoutine_Parameter(), this.getParameter(), null, "parameter", null, 0, -1, Routine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getRoutine_BodyBlock(), theStatementPackage.getBlockStatement(), null, "bodyBlock", null, 1, 1, Routine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getRoutine_Domain(), this.getParameterSet(), null, "domain", null, 0, 1, Routine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getRoutine_Codomain(), this.getParameterSet(), null, "codomain", null, 0, 1, Routine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(instanceMachineEClass, InstanceMachine.class, "InstanceMachine", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getInstanceMachine_Modifier(), this.getModifier(), null, "modifier", null, 0, 1, InstanceMachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInstanceMachine_Model(), this.getMachine(), null, "model", null, 0, 1, InstanceMachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInstanceMachine_Arg(), theExpressionPackage.getMixTupleExpression(), null, "arg", null, 0, 1, InstanceMachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInstanceMachine_Slot(), this.getSlotProperty(), null, "slot", null, 0, -1, InstanceMachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(slotPropertyEClass, SlotProperty.class, "SlotProperty", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getSlotProperty_XliaProperty(), this.getPropertyDefinition(), null, "xliaProperty", null, 0, 1, SlotProperty.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getSlotProperty_Value(), theExpressionPackage.getExpression(), null, "value", null, 0, 1, SlotProperty.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(parameterEClass, Parameter.class, "Parameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getParameter_Direction(), this.getParameterDirectionKind(), "direction", "in", 1, 1, Parameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(parameterSetEClass, ParameterSet.class, "ParameterSet", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getParameterSet_Parameter(), this.getParameter(), null, "parameter", null, 0, -1, ParameterSet.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(behaviorEClass, Behavior.class, "Behavior", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getBehavior_Parameter(), this.getParameter(), null, "parameter", null, 0, -1, Behavior.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getBehavior_Computation(), this.getModelOfComputation(), null, "computation", null, 0, 1, Behavior.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getBehavior_Execution(), this.getModelOfExecution(), null, "execution", null, 0, 1, Behavior.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getBehavior_Interaction(), this.getModelOfInteraction(), null, "interaction", null, 0, 1, Behavior.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(modelOfComputationEClass, ModelOfComputation.class, "ModelOfComputation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(modelOfExecutionEClass, ModelOfExecution.class, "ModelOfExecution", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getModelOfExecution_InitRoutine(), this.getRoutine(), null, "initRoutine", null, 0, 1, ModelOfExecution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getModelOfExecution_FinalRoutine(), this.getRoutine(), null, "finalRoutine", null, 0, 1, ModelOfExecution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getModelOfExecution_EnableRoutine(), this.getRoutine(), null, "enableRoutine", null, 0, 1, ModelOfExecution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getModelOfExecution_DisableRoutine(), this.getRoutine(), null, "disableRoutine", null, 0, 1, ModelOfExecution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getModelOfExecution_ConcurrencyRoutine(), this.getRoutine(), null, "concurrencyRoutine", null, 0, 1, ModelOfExecution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getModelOfExecution_ScheduleRoutine(), this.getRoutine(), null, "scheduleRoutine", null, 0, 1, ModelOfExecution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getModelOfExecution_IrunRoutine(), this.getRoutine(), null, "irunRoutine", null, 0, 1, ModelOfExecution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getModelOfExecution_RunRoutine(), this.getRoutine(), null, "runRoutine", null, 0, 1, ModelOfExecution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getModelOfExecution_Routine(), this.getRoutine(), null, "routine", null, 0, -1, ModelOfExecution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(modelOfInteractionEClass, ModelOfInteraction.class, "ModelOfInteraction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getModelOfInteraction_Routes(), this.getRoute(), null, "routes", null, 0, -1, ModelOfInteraction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getModelOfInteraction_Connections(), this.getConnection(), null, "connections", null, 0, -1, ModelOfInteraction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(comProtocolEClass, ComProtocol.class, "ComProtocol", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getComProtocol_Protocol(), this.getComProtocolKind(), "protocol", null, 0, 1, ComProtocol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getComProtocol_Cast(), this.getComCastKind(), "cast", null, 0, 1, ComProtocol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getComProtocol_Inner_buffer(), theDatatypePackage.getCollectionType(), null, "inner_buffer", null, 0, 1, ComProtocol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getComProtocol_Ref_buffer(), this.getBuffer(), null, "ref_buffer", null, 0, 1, ComProtocol.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(routeEClass, Route.class, "Route", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getRoute_Signals(), this.getSignal(), null, "signals", null, 0, -1, Route.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getRoute_Protocol(), this.getComProtocol(), null, "protocol", null, 0, 1, Route.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(connectionEClass, Connection.class, "Connection", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getConnection_Protocol(), this.getComProtocol(), null, "protocol", null, 0, 1, Connection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getConnection_Cast(), this.getComCastKind(), "cast", null, 0, 1, Connection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getConnection_ComPoints(), this.getComPoint(), null, "comPoints", null, 1, -1, Connection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(comPointEClass, ComPoint.class, "ComPoint", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getComPoint_Direction(), this.getChannelDirection(), "direction", "inout", 0, 1, ComPoint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getComPoint_Protocol(), this.getComProtocol(), null, "protocol", null, 0, 1, ComPoint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getComPoint_Point(), theExpressionPackage.getExpression(), null, "point", null, 0, 1, ComPoint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getComPoint_Points(), theExpressionPackage.getExpression(), null, "points", null, 0, -1, ComPoint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Initialize enums and add enum literals
+		initEEnum(designKindEEnum, DesignKind.class, "DesignKind");
+		addEEnumLiteral(designKindEEnum, DesignKind.MODEL);
+		addEEnumLiteral(designKindEEnum, DesignKind.INSTANCE);
+		addEEnumLiteral(designKindEEnum, DesignKind.PROTOTYPE);
+
+		initEEnum(channelDirectionEEnum, ChannelDirection.class, "ChannelDirection");
+		addEEnumLiteral(channelDirectionEEnum, ChannelDirection.INPUT);
+		addEEnumLiteral(channelDirectionEEnum, ChannelDirection.INOUT);
+		addEEnumLiteral(channelDirectionEEnum, ChannelDirection.OUTPUT);
+
+		initEEnum(parameterDirectionKindEEnum, ParameterDirectionKind.class, "ParameterDirectionKind");
+		addEEnumLiteral(parameterDirectionKindEEnum, ParameterDirectionKind.IN);
+		addEEnumLiteral(parameterDirectionKindEEnum, ParameterDirectionKind.INOUT);
+		addEEnumLiteral(parameterDirectionKindEEnum, ParameterDirectionKind.OUT);
+		addEEnumLiteral(parameterDirectionKindEEnum, ParameterDirectionKind.RETURN);
+
+		initEEnum(comProtocolKindEEnum, ComProtocolKind.class, "ComProtocolKind");
+		addEEnumLiteral(comProtocolKindEEnum, ComProtocolKind.NONE);
+		addEEnumLiteral(comProtocolKindEEnum, ComProtocolKind.ENV);
+		addEEnumLiteral(comProtocolKindEEnum, ComProtocolKind.BUFFER);
+		addEEnumLiteral(comProtocolKindEEnum, ComProtocolKind.RDV);
+		addEEnumLiteral(comProtocolKindEEnum, ComProtocolKind.MULTI_RDV);
+
+		initEEnum(comCastKindEEnum, ComCastKind.class, "ComCastKind");
+		addEEnumLiteral(comCastKindEEnum, ComCastKind.NONE);
+		addEEnumLiteral(comCastKindEEnum, ComCastKind.UNICAST);
+		addEEnumLiteral(comCastKindEEnum, ComCastKind.ANYCAST);
+		addEEnumLiteral(comCastKindEEnum, ComCastKind.MULTICAST);
+		addEEnumLiteral(comCastKindEEnum, ComCastKind.BROADCAST);
+	}
+
+} //InfrastructurePackageImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/InstanceMachineImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/InstanceMachineImpl.java
new file mode 100644
index 0000000..3796bcf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/InstanceMachineImpl.java
@@ -0,0 +1,361 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.impl.TypedElementImpl;
+
+import org.eclipse.efm.ecore.formalml.expression.MixTupleExpression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Instance Machine</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.InstanceMachineImpl#getModifier <em>Modifier</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.InstanceMachineImpl#getModel <em>Model</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.InstanceMachineImpl#getArg <em>Arg</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.InstanceMachineImpl#getSlot <em>Slot</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class InstanceMachineImpl extends TypedElementImpl implements InstanceMachine {
+	/**
+	 * The cached value of the '{@link #getModifier() <em>Modifier</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getModifier()
+	 * @generated
+	 * @ordered
+	 */
+	protected Modifier modifier;
+
+	/**
+	 * The cached value of the '{@link #getModel() <em>Model</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getModel()
+	 * @generated
+	 * @ordered
+	 */
+	protected Machine model;
+
+	/**
+	 * The cached value of the '{@link #getArg() <em>Arg</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getArg()
+	 * @generated
+	 * @ordered
+	 */
+	protected MixTupleExpression arg;
+
+	/**
+	 * The cached value of the '{@link #getSlot() <em>Slot</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSlot()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<SlotProperty> slot;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InstanceMachineImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.INSTANCE_MACHINE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Modifier getModifier() {
+		return modifier;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetModifier(Modifier newModifier, NotificationChain msgs) {
+		Modifier oldModifier = modifier;
+		modifier = newModifier;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.INSTANCE_MACHINE__MODIFIER, oldModifier, newModifier);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setModifier(Modifier newModifier) {
+		if (newModifier != modifier) {
+			NotificationChain msgs = null;
+			if (modifier != null)
+				msgs = ((InternalEObject)modifier).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.INSTANCE_MACHINE__MODIFIER, null, msgs);
+			if (newModifier != null)
+				msgs = ((InternalEObject)newModifier).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.INSTANCE_MACHINE__MODIFIER, null, msgs);
+			msgs = basicSetModifier(newModifier, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.INSTANCE_MACHINE__MODIFIER, newModifier, newModifier));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Machine getModel() {
+		if (model != null && model.eIsProxy()) {
+			InternalEObject oldModel = (InternalEObject)model;
+			model = (Machine)eResolveProxy(oldModel);
+			if (model != oldModel) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, InfrastructurePackage.INSTANCE_MACHINE__MODEL, oldModel, model));
+			}
+		}
+		return model;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Machine basicGetModel() {
+		return model;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setModel(Machine newModel) {
+		Machine oldModel = model;
+		model = newModel;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.INSTANCE_MACHINE__MODEL, oldModel, model));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MixTupleExpression getArg() {
+		return arg;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetArg(MixTupleExpression newArg, NotificationChain msgs) {
+		MixTupleExpression oldArg = arg;
+		arg = newArg;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.INSTANCE_MACHINE__ARG, oldArg, newArg);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setArg(MixTupleExpression newArg) {
+		if (newArg != arg) {
+			NotificationChain msgs = null;
+			if (arg != null)
+				msgs = ((InternalEObject)arg).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.INSTANCE_MACHINE__ARG, null, msgs);
+			if (newArg != null)
+				msgs = ((InternalEObject)newArg).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.INSTANCE_MACHINE__ARG, null, msgs);
+			msgs = basicSetArg(newArg, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.INSTANCE_MACHINE__ARG, newArg, newArg));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<SlotProperty> getSlot() {
+		if (slot == null) {
+			slot = new EObjectContainmentEList<SlotProperty>(SlotProperty.class, this, InfrastructurePackage.INSTANCE_MACHINE__SLOT);
+		}
+		return slot;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.INSTANCE_MACHINE__MODIFIER:
+				return basicSetModifier(null, msgs);
+			case InfrastructurePackage.INSTANCE_MACHINE__ARG:
+				return basicSetArg(null, msgs);
+			case InfrastructurePackage.INSTANCE_MACHINE__SLOT:
+				return ((InternalEList<?>)getSlot()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.INSTANCE_MACHINE__MODIFIER:
+				return getModifier();
+			case InfrastructurePackage.INSTANCE_MACHINE__MODEL:
+				if (resolve) return getModel();
+				return basicGetModel();
+			case InfrastructurePackage.INSTANCE_MACHINE__ARG:
+				return getArg();
+			case InfrastructurePackage.INSTANCE_MACHINE__SLOT:
+				return getSlot();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.INSTANCE_MACHINE__MODIFIER:
+				setModifier((Modifier)newValue);
+				return;
+			case InfrastructurePackage.INSTANCE_MACHINE__MODEL:
+				setModel((Machine)newValue);
+				return;
+			case InfrastructurePackage.INSTANCE_MACHINE__ARG:
+				setArg((MixTupleExpression)newValue);
+				return;
+			case InfrastructurePackage.INSTANCE_MACHINE__SLOT:
+				getSlot().clear();
+				getSlot().addAll((Collection<? extends SlotProperty>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.INSTANCE_MACHINE__MODIFIER:
+				setModifier((Modifier)null);
+				return;
+			case InfrastructurePackage.INSTANCE_MACHINE__MODEL:
+				setModel((Machine)null);
+				return;
+			case InfrastructurePackage.INSTANCE_MACHINE__ARG:
+				setArg((MixTupleExpression)null);
+				return;
+			case InfrastructurePackage.INSTANCE_MACHINE__SLOT:
+				getSlot().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.INSTANCE_MACHINE__MODIFIER:
+				return modifier != null;
+			case InfrastructurePackage.INSTANCE_MACHINE__MODEL:
+				return model != null;
+			case InfrastructurePackage.INSTANCE_MACHINE__ARG:
+				return arg != null;
+			case InfrastructurePackage.INSTANCE_MACHINE__SLOT:
+				return slot != null && !slot.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //InstanceMachineImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/MachineImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/MachineImpl.java
new file mode 100644
index 0000000..a58b7f3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/MachineImpl.java
@@ -0,0 +1,778 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.impl.ClassifierDefinitionImpl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+import org.eclipse.efm.ecore.formalml.infrastructure.DesignKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Procedure;
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Machine</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#isInput_enabled <em>Input enabled</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#isTimed <em>Timed</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getDesign <em>Design</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getMachine <em>Machine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getTypedef <em>Typedef</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getProperty <em>Property</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getChannel <em>Channel</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getPort <em>Port</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getSignal <em>Signal</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getBuffer <em>Buffer</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getRoutine <em>Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getProcedure <em>Procedure</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getInstance <em>Instance</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getBehavior <em>Behavior</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.MachineImpl#getMain <em>Main</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class MachineImpl extends ClassifierDefinitionImpl implements Machine {
+	/**
+	 * The default value of the '{@link #isInput_enabled() <em>Input enabled</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isInput_enabled()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean INPUT_ENABLED_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isInput_enabled() <em>Input enabled</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isInput_enabled()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean input_enabled = INPUT_ENABLED_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isTimed() <em>Timed</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTimed()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean TIMED_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isTimed() <em>Timed</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTimed()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean timed = TIMED_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getDesign() <em>Design</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDesign()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final DesignKind DESIGN_EDEFAULT = DesignKind.PROTOTYPE;
+
+	/**
+	 * The cached value of the '{@link #getDesign() <em>Design</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDesign()
+	 * @generated
+	 * @ordered
+	 */
+	protected DesignKind design = DESIGN_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getMachine() <em>Machine</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMachine()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Machine> machine;
+
+	/**
+	 * The cached value of the '{@link #getTypedef() <em>Typedef</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTypedef()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<DataType> typedef;
+
+	/**
+	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProperty()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<PropertyDefinition> property;
+
+	/**
+	 * The cached value of the '{@link #getChannel() <em>Channel</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getChannel()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Channel> channel;
+
+	/**
+	 * The cached value of the '{@link #getPort() <em>Port</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPort()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Port> port;
+
+	/**
+	 * The cached value of the '{@link #getSignal() <em>Signal</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSignal()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Signal> signal;
+
+	/**
+	 * The cached value of the '{@link #getBuffer() <em>Buffer</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBuffer()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Buffer> buffer;
+
+	/**
+	 * The cached value of the '{@link #getRoutine() <em>Routine</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Routine> routine;
+
+	/**
+	 * The cached value of the '{@link #getProcedure() <em>Procedure</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProcedure()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Procedure> procedure;
+
+	/**
+	 * The cached value of the '{@link #getInstance() <em>Instance</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInstance()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<InstanceMachine> instance;
+
+	/**
+	 * The cached value of the '{@link #getBehavior() <em>Behavior</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBehavior()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Behavior> behavior;
+
+	/**
+	 * The cached value of the '{@link #getMain() <em>Main</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMain()
+	 * @generated
+	 * @ordered
+	 */
+	protected Behavior main;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected MachineImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.MACHINE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isInput_enabled() {
+		return input_enabled;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInput_enabled(boolean newInput_enabled) {
+		boolean oldInput_enabled = input_enabled;
+		input_enabled = newInput_enabled;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MACHINE__INPUT_ENABLED, oldInput_enabled, input_enabled));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isTimed() {
+		return timed;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTimed(boolean newTimed) {
+		boolean oldTimed = timed;
+		timed = newTimed;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MACHINE__TIMED, oldTimed, timed));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DesignKind getDesign() {
+		return design;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDesign(DesignKind newDesign) {
+		DesignKind oldDesign = design;
+		design = newDesign == null ? DESIGN_EDEFAULT : newDesign;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MACHINE__DESIGN, oldDesign, design));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Machine> getMachine() {
+		if (machine == null) {
+			machine = new EObjectContainmentEList<Machine>(Machine.class, this, InfrastructurePackage.MACHINE__MACHINE);
+		}
+		return machine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<DataType> getTypedef() {
+		if (typedef == null) {
+			typedef = new EObjectContainmentEList<DataType>(DataType.class, this, InfrastructurePackage.MACHINE__TYPEDEF);
+		}
+		return typedef;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<PropertyDefinition> getProperty() {
+		if (property == null) {
+			property = new EObjectContainmentEList<PropertyDefinition>(PropertyDefinition.class, this, InfrastructurePackage.MACHINE__PROPERTY);
+		}
+		return property;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Channel> getChannel() {
+		if (channel == null) {
+			channel = new EObjectContainmentEList<Channel>(Channel.class, this, InfrastructurePackage.MACHINE__CHANNEL);
+		}
+		return channel;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Port> getPort() {
+		if (port == null) {
+			port = new EObjectContainmentEList<Port>(Port.class, this, InfrastructurePackage.MACHINE__PORT);
+		}
+		return port;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Signal> getSignal() {
+		if (signal == null) {
+			signal = new EObjectContainmentEList<Signal>(Signal.class, this, InfrastructurePackage.MACHINE__SIGNAL);
+		}
+		return signal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Buffer> getBuffer() {
+		if (buffer == null) {
+			buffer = new EObjectContainmentEList<Buffer>(Buffer.class, this, InfrastructurePackage.MACHINE__BUFFER);
+		}
+		return buffer;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Routine> getRoutine() {
+		if (routine == null) {
+			routine = new EObjectContainmentEList<Routine>(Routine.class, this, InfrastructurePackage.MACHINE__ROUTINE);
+		}
+		return routine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Procedure> getProcedure() {
+		if (procedure == null) {
+			procedure = new EObjectContainmentEList<Procedure>(Procedure.class, this, InfrastructurePackage.MACHINE__PROCEDURE);
+		}
+		return procedure;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<InstanceMachine> getInstance() {
+		if (instance == null) {
+			instance = new EObjectContainmentEList<InstanceMachine>(InstanceMachine.class, this, InfrastructurePackage.MACHINE__INSTANCE);
+		}
+		return instance;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Behavior> getBehavior() {
+		if (behavior == null) {
+			behavior = new EObjectContainmentEList<Behavior>(Behavior.class, this, InfrastructurePackage.MACHINE__BEHAVIOR);
+		}
+		return behavior;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Behavior getMain() {
+		return main;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMain(Behavior newMain, NotificationChain msgs) {
+		Behavior oldMain = main;
+		main = newMain;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MACHINE__MAIN, oldMain, newMain);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMain(Behavior newMain) {
+		if (newMain != main) {
+			NotificationChain msgs = null;
+			if (main != null)
+				msgs = ((InternalEObject)main).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MACHINE__MAIN, null, msgs);
+			if (newMain != null)
+				msgs = ((InternalEObject)newMain).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MACHINE__MAIN, null, msgs);
+			msgs = basicSetMain(newMain, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MACHINE__MAIN, newMain, newMain));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.MACHINE__MACHINE:
+				return ((InternalEList<?>)getMachine()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__TYPEDEF:
+				return ((InternalEList<?>)getTypedef()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__PROPERTY:
+				return ((InternalEList<?>)getProperty()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__CHANNEL:
+				return ((InternalEList<?>)getChannel()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__PORT:
+				return ((InternalEList<?>)getPort()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__SIGNAL:
+				return ((InternalEList<?>)getSignal()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__BUFFER:
+				return ((InternalEList<?>)getBuffer()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__ROUTINE:
+				return ((InternalEList<?>)getRoutine()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__PROCEDURE:
+				return ((InternalEList<?>)getProcedure()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__INSTANCE:
+				return ((InternalEList<?>)getInstance()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__BEHAVIOR:
+				return ((InternalEList<?>)getBehavior()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MACHINE__MAIN:
+				return basicSetMain(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.MACHINE__INPUT_ENABLED:
+				return isInput_enabled();
+			case InfrastructurePackage.MACHINE__TIMED:
+				return isTimed();
+			case InfrastructurePackage.MACHINE__DESIGN:
+				return getDesign();
+			case InfrastructurePackage.MACHINE__MACHINE:
+				return getMachine();
+			case InfrastructurePackage.MACHINE__TYPEDEF:
+				return getTypedef();
+			case InfrastructurePackage.MACHINE__PROPERTY:
+				return getProperty();
+			case InfrastructurePackage.MACHINE__CHANNEL:
+				return getChannel();
+			case InfrastructurePackage.MACHINE__PORT:
+				return getPort();
+			case InfrastructurePackage.MACHINE__SIGNAL:
+				return getSignal();
+			case InfrastructurePackage.MACHINE__BUFFER:
+				return getBuffer();
+			case InfrastructurePackage.MACHINE__ROUTINE:
+				return getRoutine();
+			case InfrastructurePackage.MACHINE__PROCEDURE:
+				return getProcedure();
+			case InfrastructurePackage.MACHINE__INSTANCE:
+				return getInstance();
+			case InfrastructurePackage.MACHINE__BEHAVIOR:
+				return getBehavior();
+			case InfrastructurePackage.MACHINE__MAIN:
+				return getMain();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.MACHINE__INPUT_ENABLED:
+				setInput_enabled((Boolean)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__TIMED:
+				setTimed((Boolean)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__DESIGN:
+				setDesign((DesignKind)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__MACHINE:
+				getMachine().clear();
+				getMachine().addAll((Collection<? extends Machine>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__TYPEDEF:
+				getTypedef().clear();
+				getTypedef().addAll((Collection<? extends DataType>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__PROPERTY:
+				getProperty().clear();
+				getProperty().addAll((Collection<? extends PropertyDefinition>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__CHANNEL:
+				getChannel().clear();
+				getChannel().addAll((Collection<? extends Channel>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__PORT:
+				getPort().clear();
+				getPort().addAll((Collection<? extends Port>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__SIGNAL:
+				getSignal().clear();
+				getSignal().addAll((Collection<? extends Signal>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__BUFFER:
+				getBuffer().clear();
+				getBuffer().addAll((Collection<? extends Buffer>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__ROUTINE:
+				getRoutine().clear();
+				getRoutine().addAll((Collection<? extends Routine>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__PROCEDURE:
+				getProcedure().clear();
+				getProcedure().addAll((Collection<? extends Procedure>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__INSTANCE:
+				getInstance().clear();
+				getInstance().addAll((Collection<? extends InstanceMachine>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__BEHAVIOR:
+				getBehavior().clear();
+				getBehavior().addAll((Collection<? extends Behavior>)newValue);
+				return;
+			case InfrastructurePackage.MACHINE__MAIN:
+				setMain((Behavior)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.MACHINE__INPUT_ENABLED:
+				setInput_enabled(INPUT_ENABLED_EDEFAULT);
+				return;
+			case InfrastructurePackage.MACHINE__TIMED:
+				setTimed(TIMED_EDEFAULT);
+				return;
+			case InfrastructurePackage.MACHINE__DESIGN:
+				setDesign(DESIGN_EDEFAULT);
+				return;
+			case InfrastructurePackage.MACHINE__MACHINE:
+				getMachine().clear();
+				return;
+			case InfrastructurePackage.MACHINE__TYPEDEF:
+				getTypedef().clear();
+				return;
+			case InfrastructurePackage.MACHINE__PROPERTY:
+				getProperty().clear();
+				return;
+			case InfrastructurePackage.MACHINE__CHANNEL:
+				getChannel().clear();
+				return;
+			case InfrastructurePackage.MACHINE__PORT:
+				getPort().clear();
+				return;
+			case InfrastructurePackage.MACHINE__SIGNAL:
+				getSignal().clear();
+				return;
+			case InfrastructurePackage.MACHINE__BUFFER:
+				getBuffer().clear();
+				return;
+			case InfrastructurePackage.MACHINE__ROUTINE:
+				getRoutine().clear();
+				return;
+			case InfrastructurePackage.MACHINE__PROCEDURE:
+				getProcedure().clear();
+				return;
+			case InfrastructurePackage.MACHINE__INSTANCE:
+				getInstance().clear();
+				return;
+			case InfrastructurePackage.MACHINE__BEHAVIOR:
+				getBehavior().clear();
+				return;
+			case InfrastructurePackage.MACHINE__MAIN:
+				setMain((Behavior)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.MACHINE__INPUT_ENABLED:
+				return input_enabled != INPUT_ENABLED_EDEFAULT;
+			case InfrastructurePackage.MACHINE__TIMED:
+				return timed != TIMED_EDEFAULT;
+			case InfrastructurePackage.MACHINE__DESIGN:
+				return design != DESIGN_EDEFAULT;
+			case InfrastructurePackage.MACHINE__MACHINE:
+				return machine != null && !machine.isEmpty();
+			case InfrastructurePackage.MACHINE__TYPEDEF:
+				return typedef != null && !typedef.isEmpty();
+			case InfrastructurePackage.MACHINE__PROPERTY:
+				return property != null && !property.isEmpty();
+			case InfrastructurePackage.MACHINE__CHANNEL:
+				return channel != null && !channel.isEmpty();
+			case InfrastructurePackage.MACHINE__PORT:
+				return port != null && !port.isEmpty();
+			case InfrastructurePackage.MACHINE__SIGNAL:
+				return signal != null && !signal.isEmpty();
+			case InfrastructurePackage.MACHINE__BUFFER:
+				return buffer != null && !buffer.isEmpty();
+			case InfrastructurePackage.MACHINE__ROUTINE:
+				return routine != null && !routine.isEmpty();
+			case InfrastructurePackage.MACHINE__PROCEDURE:
+				return procedure != null && !procedure.isEmpty();
+			case InfrastructurePackage.MACHINE__INSTANCE:
+				return instance != null && !instance.isEmpty();
+			case InfrastructurePackage.MACHINE__BEHAVIOR:
+				return behavior != null && !behavior.isEmpty();
+			case InfrastructurePackage.MACHINE__MAIN:
+				return main != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (input_enabled: ");
+		result.append(input_enabled);
+		result.append(", timed: ");
+		result.append(timed);
+		result.append(", design: ");
+		result.append(design);
+		result.append(')');
+		return result.toString();
+	}
+
+} //MachineImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModelOfComputationImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModelOfComputationImpl.java
new file mode 100644
index 0000000..cc6c3ae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModelOfComputationImpl.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Model Of Computation</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class ModelOfComputationImpl extends MinimalEObjectImpl.Container implements ModelOfComputation {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ModelOfComputationImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.MODEL_OF_COMPUTATION;
+	}
+
+} //ModelOfComputationImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModelOfExecutionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModelOfExecutionImpl.java
new file mode 100644
index 0000000..39a7e3f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModelOfExecutionImpl.java
@@ -0,0 +1,692 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Model Of Execution</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl#getInitRoutine <em>Init Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl#getFinalRoutine <em>Final Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl#getEnableRoutine <em>Enable Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl#getDisableRoutine <em>Disable Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl#getConcurrencyRoutine <em>Concurrency Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl#getScheduleRoutine <em>Schedule Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl#getIrunRoutine <em>Irun Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl#getRunRoutine <em>Run Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfExecutionImpl#getRoutine <em>Routine</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ModelOfExecutionImpl extends MinimalEObjectImpl.Container implements ModelOfExecution {
+	/**
+	 * The cached value of the '{@link #getInitRoutine() <em>Init Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInitRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Routine initRoutine;
+
+	/**
+	 * The cached value of the '{@link #getFinalRoutine() <em>Final Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFinalRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Routine finalRoutine;
+
+	/**
+	 * The cached value of the '{@link #getEnableRoutine() <em>Enable Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEnableRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Routine enableRoutine;
+
+	/**
+	 * The cached value of the '{@link #getDisableRoutine() <em>Disable Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDisableRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Routine disableRoutine;
+
+	/**
+	 * The cached value of the '{@link #getConcurrencyRoutine() <em>Concurrency Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getConcurrencyRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Routine concurrencyRoutine;
+
+	/**
+	 * The cached value of the '{@link #getScheduleRoutine() <em>Schedule Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getScheduleRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Routine scheduleRoutine;
+
+	/**
+	 * The cached value of the '{@link #getIrunRoutine() <em>Irun Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getIrunRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Routine irunRoutine;
+
+	/**
+	 * The cached value of the '{@link #getRunRoutine() <em>Run Routine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRunRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Routine runRoutine;
+
+	/**
+	 * The cached value of the '{@link #getRoutine() <em>Routine</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Routine> routine;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ModelOfExecutionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.MODEL_OF_EXECUTION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine getInitRoutine() {
+		return initRoutine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetInitRoutine(Routine newInitRoutine, NotificationChain msgs) {
+		Routine oldInitRoutine = initRoutine;
+		initRoutine = newInitRoutine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__INIT_ROUTINE, oldInitRoutine, newInitRoutine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInitRoutine(Routine newInitRoutine) {
+		if (newInitRoutine != initRoutine) {
+			NotificationChain msgs = null;
+			if (initRoutine != null)
+				msgs = ((InternalEObject)initRoutine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__INIT_ROUTINE, null, msgs);
+			if (newInitRoutine != null)
+				msgs = ((InternalEObject)newInitRoutine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__INIT_ROUTINE, null, msgs);
+			msgs = basicSetInitRoutine(newInitRoutine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__INIT_ROUTINE, newInitRoutine, newInitRoutine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine getFinalRoutine() {
+		return finalRoutine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetFinalRoutine(Routine newFinalRoutine, NotificationChain msgs) {
+		Routine oldFinalRoutine = finalRoutine;
+		finalRoutine = newFinalRoutine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__FINAL_ROUTINE, oldFinalRoutine, newFinalRoutine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFinalRoutine(Routine newFinalRoutine) {
+		if (newFinalRoutine != finalRoutine) {
+			NotificationChain msgs = null;
+			if (finalRoutine != null)
+				msgs = ((InternalEObject)finalRoutine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__FINAL_ROUTINE, null, msgs);
+			if (newFinalRoutine != null)
+				msgs = ((InternalEObject)newFinalRoutine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__FINAL_ROUTINE, null, msgs);
+			msgs = basicSetFinalRoutine(newFinalRoutine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__FINAL_ROUTINE, newFinalRoutine, newFinalRoutine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine getEnableRoutine() {
+		return enableRoutine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetEnableRoutine(Routine newEnableRoutine, NotificationChain msgs) {
+		Routine oldEnableRoutine = enableRoutine;
+		enableRoutine = newEnableRoutine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__ENABLE_ROUTINE, oldEnableRoutine, newEnableRoutine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEnableRoutine(Routine newEnableRoutine) {
+		if (newEnableRoutine != enableRoutine) {
+			NotificationChain msgs = null;
+			if (enableRoutine != null)
+				msgs = ((InternalEObject)enableRoutine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__ENABLE_ROUTINE, null, msgs);
+			if (newEnableRoutine != null)
+				msgs = ((InternalEObject)newEnableRoutine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__ENABLE_ROUTINE, null, msgs);
+			msgs = basicSetEnableRoutine(newEnableRoutine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__ENABLE_ROUTINE, newEnableRoutine, newEnableRoutine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine getDisableRoutine() {
+		return disableRoutine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetDisableRoutine(Routine newDisableRoutine, NotificationChain msgs) {
+		Routine oldDisableRoutine = disableRoutine;
+		disableRoutine = newDisableRoutine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__DISABLE_ROUTINE, oldDisableRoutine, newDisableRoutine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDisableRoutine(Routine newDisableRoutine) {
+		if (newDisableRoutine != disableRoutine) {
+			NotificationChain msgs = null;
+			if (disableRoutine != null)
+				msgs = ((InternalEObject)disableRoutine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__DISABLE_ROUTINE, null, msgs);
+			if (newDisableRoutine != null)
+				msgs = ((InternalEObject)newDisableRoutine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__DISABLE_ROUTINE, null, msgs);
+			msgs = basicSetDisableRoutine(newDisableRoutine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__DISABLE_ROUTINE, newDisableRoutine, newDisableRoutine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine getConcurrencyRoutine() {
+		return concurrencyRoutine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetConcurrencyRoutine(Routine newConcurrencyRoutine, NotificationChain msgs) {
+		Routine oldConcurrencyRoutine = concurrencyRoutine;
+		concurrencyRoutine = newConcurrencyRoutine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE, oldConcurrencyRoutine, newConcurrencyRoutine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setConcurrencyRoutine(Routine newConcurrencyRoutine) {
+		if (newConcurrencyRoutine != concurrencyRoutine) {
+			NotificationChain msgs = null;
+			if (concurrencyRoutine != null)
+				msgs = ((InternalEObject)concurrencyRoutine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE, null, msgs);
+			if (newConcurrencyRoutine != null)
+				msgs = ((InternalEObject)newConcurrencyRoutine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE, null, msgs);
+			msgs = basicSetConcurrencyRoutine(newConcurrencyRoutine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE, newConcurrencyRoutine, newConcurrencyRoutine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine getScheduleRoutine() {
+		return scheduleRoutine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetScheduleRoutine(Routine newScheduleRoutine, NotificationChain msgs) {
+		Routine oldScheduleRoutine = scheduleRoutine;
+		scheduleRoutine = newScheduleRoutine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__SCHEDULE_ROUTINE, oldScheduleRoutine, newScheduleRoutine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setScheduleRoutine(Routine newScheduleRoutine) {
+		if (newScheduleRoutine != scheduleRoutine) {
+			NotificationChain msgs = null;
+			if (scheduleRoutine != null)
+				msgs = ((InternalEObject)scheduleRoutine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__SCHEDULE_ROUTINE, null, msgs);
+			if (newScheduleRoutine != null)
+				msgs = ((InternalEObject)newScheduleRoutine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__SCHEDULE_ROUTINE, null, msgs);
+			msgs = basicSetScheduleRoutine(newScheduleRoutine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__SCHEDULE_ROUTINE, newScheduleRoutine, newScheduleRoutine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine getIrunRoutine() {
+		return irunRoutine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetIrunRoutine(Routine newIrunRoutine, NotificationChain msgs) {
+		Routine oldIrunRoutine = irunRoutine;
+		irunRoutine = newIrunRoutine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__IRUN_ROUTINE, oldIrunRoutine, newIrunRoutine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setIrunRoutine(Routine newIrunRoutine) {
+		if (newIrunRoutine != irunRoutine) {
+			NotificationChain msgs = null;
+			if (irunRoutine != null)
+				msgs = ((InternalEObject)irunRoutine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__IRUN_ROUTINE, null, msgs);
+			if (newIrunRoutine != null)
+				msgs = ((InternalEObject)newIrunRoutine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__IRUN_ROUTINE, null, msgs);
+			msgs = basicSetIrunRoutine(newIrunRoutine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__IRUN_ROUTINE, newIrunRoutine, newIrunRoutine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine getRunRoutine() {
+		return runRoutine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetRunRoutine(Routine newRunRoutine, NotificationChain msgs) {
+		Routine oldRunRoutine = runRoutine;
+		runRoutine = newRunRoutine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__RUN_ROUTINE, oldRunRoutine, newRunRoutine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRunRoutine(Routine newRunRoutine) {
+		if (newRunRoutine != runRoutine) {
+			NotificationChain msgs = null;
+			if (runRoutine != null)
+				msgs = ((InternalEObject)runRoutine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__RUN_ROUTINE, null, msgs);
+			if (newRunRoutine != null)
+				msgs = ((InternalEObject)newRunRoutine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.MODEL_OF_EXECUTION__RUN_ROUTINE, null, msgs);
+			msgs = basicSetRunRoutine(newRunRoutine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODEL_OF_EXECUTION__RUN_ROUTINE, newRunRoutine, newRunRoutine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Routine> getRoutine() {
+		if (routine == null) {
+			routine = new EObjectContainmentEList<Routine>(Routine.class, this, InfrastructurePackage.MODEL_OF_EXECUTION__ROUTINE);
+		}
+		return routine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_EXECUTION__INIT_ROUTINE:
+				return basicSetInitRoutine(null, msgs);
+			case InfrastructurePackage.MODEL_OF_EXECUTION__FINAL_ROUTINE:
+				return basicSetFinalRoutine(null, msgs);
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ENABLE_ROUTINE:
+				return basicSetEnableRoutine(null, msgs);
+			case InfrastructurePackage.MODEL_OF_EXECUTION__DISABLE_ROUTINE:
+				return basicSetDisableRoutine(null, msgs);
+			case InfrastructurePackage.MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE:
+				return basicSetConcurrencyRoutine(null, msgs);
+			case InfrastructurePackage.MODEL_OF_EXECUTION__SCHEDULE_ROUTINE:
+				return basicSetScheduleRoutine(null, msgs);
+			case InfrastructurePackage.MODEL_OF_EXECUTION__IRUN_ROUTINE:
+				return basicSetIrunRoutine(null, msgs);
+			case InfrastructurePackage.MODEL_OF_EXECUTION__RUN_ROUTINE:
+				return basicSetRunRoutine(null, msgs);
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ROUTINE:
+				return ((InternalEList<?>)getRoutine()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_EXECUTION__INIT_ROUTINE:
+				return getInitRoutine();
+			case InfrastructurePackage.MODEL_OF_EXECUTION__FINAL_ROUTINE:
+				return getFinalRoutine();
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ENABLE_ROUTINE:
+				return getEnableRoutine();
+			case InfrastructurePackage.MODEL_OF_EXECUTION__DISABLE_ROUTINE:
+				return getDisableRoutine();
+			case InfrastructurePackage.MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE:
+				return getConcurrencyRoutine();
+			case InfrastructurePackage.MODEL_OF_EXECUTION__SCHEDULE_ROUTINE:
+				return getScheduleRoutine();
+			case InfrastructurePackage.MODEL_OF_EXECUTION__IRUN_ROUTINE:
+				return getIrunRoutine();
+			case InfrastructurePackage.MODEL_OF_EXECUTION__RUN_ROUTINE:
+				return getRunRoutine();
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ROUTINE:
+				return getRoutine();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_EXECUTION__INIT_ROUTINE:
+				setInitRoutine((Routine)newValue);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__FINAL_ROUTINE:
+				setFinalRoutine((Routine)newValue);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ENABLE_ROUTINE:
+				setEnableRoutine((Routine)newValue);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__DISABLE_ROUTINE:
+				setDisableRoutine((Routine)newValue);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE:
+				setConcurrencyRoutine((Routine)newValue);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__SCHEDULE_ROUTINE:
+				setScheduleRoutine((Routine)newValue);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__IRUN_ROUTINE:
+				setIrunRoutine((Routine)newValue);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__RUN_ROUTINE:
+				setRunRoutine((Routine)newValue);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ROUTINE:
+				getRoutine().clear();
+				getRoutine().addAll((Collection<? extends Routine>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_EXECUTION__INIT_ROUTINE:
+				setInitRoutine((Routine)null);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__FINAL_ROUTINE:
+				setFinalRoutine((Routine)null);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ENABLE_ROUTINE:
+				setEnableRoutine((Routine)null);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__DISABLE_ROUTINE:
+				setDisableRoutine((Routine)null);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE:
+				setConcurrencyRoutine((Routine)null);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__SCHEDULE_ROUTINE:
+				setScheduleRoutine((Routine)null);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__IRUN_ROUTINE:
+				setIrunRoutine((Routine)null);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__RUN_ROUTINE:
+				setRunRoutine((Routine)null);
+				return;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ROUTINE:
+				getRoutine().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_EXECUTION__INIT_ROUTINE:
+				return initRoutine != null;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__FINAL_ROUTINE:
+				return finalRoutine != null;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ENABLE_ROUTINE:
+				return enableRoutine != null;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__DISABLE_ROUTINE:
+				return disableRoutine != null;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__CONCURRENCY_ROUTINE:
+				return concurrencyRoutine != null;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__SCHEDULE_ROUTINE:
+				return scheduleRoutine != null;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__IRUN_ROUTINE:
+				return irunRoutine != null;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__RUN_ROUTINE:
+				return runRoutine != null;
+			case InfrastructurePackage.MODEL_OF_EXECUTION__ROUTINE:
+				return routine != null && !routine.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ModelOfExecutionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModelOfInteractionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModelOfInteractionImpl.java
new file mode 100644
index 0000000..eafba08
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModelOfInteractionImpl.java
@@ -0,0 +1,199 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Connection;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction;
+import org.eclipse.efm.ecore.formalml.infrastructure.Route;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Model Of Interaction</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfInteractionImpl#getRoutes <em>Routes</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModelOfInteractionImpl#getConnections <em>Connections</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ModelOfInteractionImpl extends MinimalEObjectImpl.Container implements ModelOfInteraction {
+	/**
+	 * The cached value of the '{@link #getRoutes() <em>Routes</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRoutes()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Route> routes;
+
+	/**
+	 * The cached value of the '{@link #getConnections() <em>Connections</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getConnections()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Connection> connections;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ModelOfInteractionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.MODEL_OF_INTERACTION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Route> getRoutes() {
+		if (routes == null) {
+			routes = new EObjectContainmentEList<Route>(Route.class, this, InfrastructurePackage.MODEL_OF_INTERACTION__ROUTES);
+		}
+		return routes;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Connection> getConnections() {
+		if (connections == null) {
+			connections = new EObjectContainmentEList<Connection>(Connection.class, this, InfrastructurePackage.MODEL_OF_INTERACTION__CONNECTIONS);
+		}
+		return connections;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_INTERACTION__ROUTES:
+				return ((InternalEList<?>)getRoutes()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.MODEL_OF_INTERACTION__CONNECTIONS:
+				return ((InternalEList<?>)getConnections()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_INTERACTION__ROUTES:
+				return getRoutes();
+			case InfrastructurePackage.MODEL_OF_INTERACTION__CONNECTIONS:
+				return getConnections();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_INTERACTION__ROUTES:
+				getRoutes().clear();
+				getRoutes().addAll((Collection<? extends Route>)newValue);
+				return;
+			case InfrastructurePackage.MODEL_OF_INTERACTION__CONNECTIONS:
+				getConnections().clear();
+				getConnections().addAll((Collection<? extends Connection>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_INTERACTION__ROUTES:
+				getRoutes().clear();
+				return;
+			case InfrastructurePackage.MODEL_OF_INTERACTION__CONNECTIONS:
+				getConnections().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.MODEL_OF_INTERACTION__ROUTES:
+				return routes != null && !routes.isEmpty();
+			case InfrastructurePackage.MODEL_OF_INTERACTION__CONNECTIONS:
+				return connections != null && !connections.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ModelOfInteractionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModifierImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModifierImpl.java
new file mode 100644
index 0000000..94e35b0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ModifierImpl.java
@@ -0,0 +1,389 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Modifier</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModifierImpl#isStatic <em>Static</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModifierImpl#isFinal <em>Final</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModifierImpl#isReference <em>Reference</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModifierImpl#isVolatile <em>Volatile</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ModifierImpl#isTransient <em>Transient</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ModifierImpl extends MinimalEObjectImpl.Container implements Modifier {
+	/**
+	 * The default value of the '{@link #isStatic() <em>Static</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isStatic()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean STATIC_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isStatic() <em>Static</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isStatic()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean static_ = STATIC_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isFinal() <em>Final</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isFinal()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean FINAL_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isFinal() <em>Final</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isFinal()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean final_ = FINAL_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isReference() <em>Reference</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isReference()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean REFERENCE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isReference() <em>Reference</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isReference()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean reference = REFERENCE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isVolatile() <em>Volatile</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isVolatile()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean VOLATILE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isVolatile() <em>Volatile</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isVolatile()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean volatile_ = VOLATILE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isTransient() <em>Transient</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTransient()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean TRANSIENT_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isTransient() <em>Transient</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTransient()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean transient_ = TRANSIENT_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ModifierImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.MODIFIER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isStatic() {
+		return static_;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setStatic(boolean newStatic) {
+		boolean oldStatic = static_;
+		static_ = newStatic;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODIFIER__STATIC, oldStatic, static_));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isFinal() {
+		return final_;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFinal(boolean newFinal) {
+		boolean oldFinal = final_;
+		final_ = newFinal;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODIFIER__FINAL, oldFinal, final_));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isReference() {
+		return reference;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setReference(boolean newReference) {
+		boolean oldReference = reference;
+		reference = newReference;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODIFIER__REFERENCE, oldReference, reference));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isVolatile() {
+		return volatile_;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setVolatile(boolean newVolatile) {
+		boolean oldVolatile = volatile_;
+		volatile_ = newVolatile;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODIFIER__VOLATILE, oldVolatile, volatile_));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isTransient() {
+		return transient_;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTransient(boolean newTransient) {
+		boolean oldTransient = transient_;
+		transient_ = newTransient;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.MODIFIER__TRANSIENT, oldTransient, transient_));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.MODIFIER__STATIC:
+				return isStatic();
+			case InfrastructurePackage.MODIFIER__FINAL:
+				return isFinal();
+			case InfrastructurePackage.MODIFIER__REFERENCE:
+				return isReference();
+			case InfrastructurePackage.MODIFIER__VOLATILE:
+				return isVolatile();
+			case InfrastructurePackage.MODIFIER__TRANSIENT:
+				return isTransient();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.MODIFIER__STATIC:
+				setStatic((Boolean)newValue);
+				return;
+			case InfrastructurePackage.MODIFIER__FINAL:
+				setFinal((Boolean)newValue);
+				return;
+			case InfrastructurePackage.MODIFIER__REFERENCE:
+				setReference((Boolean)newValue);
+				return;
+			case InfrastructurePackage.MODIFIER__VOLATILE:
+				setVolatile((Boolean)newValue);
+				return;
+			case InfrastructurePackage.MODIFIER__TRANSIENT:
+				setTransient((Boolean)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.MODIFIER__STATIC:
+				setStatic(STATIC_EDEFAULT);
+				return;
+			case InfrastructurePackage.MODIFIER__FINAL:
+				setFinal(FINAL_EDEFAULT);
+				return;
+			case InfrastructurePackage.MODIFIER__REFERENCE:
+				setReference(REFERENCE_EDEFAULT);
+				return;
+			case InfrastructurePackage.MODIFIER__VOLATILE:
+				setVolatile(VOLATILE_EDEFAULT);
+				return;
+			case InfrastructurePackage.MODIFIER__TRANSIENT:
+				setTransient(TRANSIENT_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.MODIFIER__STATIC:
+				return static_ != STATIC_EDEFAULT;
+			case InfrastructurePackage.MODIFIER__FINAL:
+				return final_ != FINAL_EDEFAULT;
+			case InfrastructurePackage.MODIFIER__REFERENCE:
+				return reference != REFERENCE_EDEFAULT;
+			case InfrastructurePackage.MODIFIER__VOLATILE:
+				return volatile_ != VOLATILE_EDEFAULT;
+			case InfrastructurePackage.MODIFIER__TRANSIENT:
+				return transient_ != TRANSIENT_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (static: ");
+		result.append(static_);
+		result.append(", final: ");
+		result.append(final_);
+		result.append(", reference: ");
+		result.append(reference);
+		result.append(", volatile: ");
+		result.append(volatile_);
+		result.append(", transient: ");
+		result.append(transient_);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ModifierImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ParameterImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ParameterImpl.java
new file mode 100644
index 0000000..20cd06c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ParameterImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Parameter</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterImpl#getDirection <em>Direction</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ParameterImpl extends PropertyDefinitionImpl implements Parameter {
+	/**
+	 * The default value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ParameterDirectionKind DIRECTION_EDEFAULT = ParameterDirectionKind.IN;
+
+	/**
+	 * The cached value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected ParameterDirectionKind direction = DIRECTION_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ParameterImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.PARAMETER;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ParameterDirectionKind getDirection() {
+		return direction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDirection(ParameterDirectionKind newDirection) {
+		ParameterDirectionKind oldDirection = direction;
+		direction = newDirection == null ? DIRECTION_EDEFAULT : newDirection;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.PARAMETER__DIRECTION, oldDirection, direction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.PARAMETER__DIRECTION:
+				return getDirection();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.PARAMETER__DIRECTION:
+				setDirection((ParameterDirectionKind)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.PARAMETER__DIRECTION:
+				setDirection(DIRECTION_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.PARAMETER__DIRECTION:
+				return direction != DIRECTION_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (direction: ");
+		result.append(direction);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ParameterImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ParameterSetImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ParameterSetImpl.java
new file mode 100644
index 0000000..0abdd11
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ParameterSetImpl.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Parameter Set</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.ParameterSetImpl#getParameter <em>Parameter</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ParameterSetImpl extends MinimalEObjectImpl.Container implements ParameterSet {
+	/**
+	 * The cached value of the '{@link #getParameter() <em>Parameter</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getParameter()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Parameter> parameter;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ParameterSetImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.PARAMETER_SET;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Parameter> getParameter() {
+		if (parameter == null) {
+			parameter = new EObjectContainmentEList<Parameter>(Parameter.class, this, InfrastructurePackage.PARAMETER_SET__PARAMETER);
+		}
+		return parameter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.PARAMETER_SET__PARAMETER:
+				return ((InternalEList<?>)getParameter()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.PARAMETER_SET__PARAMETER:
+				return getParameter();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.PARAMETER_SET__PARAMETER:
+				getParameter().clear();
+				getParameter().addAll((Collection<? extends Parameter>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.PARAMETER_SET__PARAMETER:
+				getParameter().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.PARAMETER_SET__PARAMETER:
+				return parameter != null && !parameter.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ParameterSetImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/PortImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/PortImpl.java
new file mode 100644
index 0000000..34258f1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/PortImpl.java
@@ -0,0 +1,269 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Port</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.PortImpl#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.PortImpl#getSignal <em>Signal</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.PortImpl#getParameter <em>Parameter</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class PortImpl extends PropertyDefinitionImpl implements Port {
+	/**
+	 * The default value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ChannelDirection DIRECTION_EDEFAULT = ChannelDirection.INOUT;
+
+	/**
+	 * The cached value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected ChannelDirection direction = DIRECTION_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getSignal() <em>Signal</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSignal()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Signal> signal;
+
+	/**
+	 * The cached value of the '{@link #getParameter() <em>Parameter</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getParameter()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Parameter> parameter;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PortImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.PORT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ChannelDirection getDirection() {
+		return direction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDirection(ChannelDirection newDirection) {
+		ChannelDirection oldDirection = direction;
+		direction = newDirection == null ? DIRECTION_EDEFAULT : newDirection;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.PORT__DIRECTION, oldDirection, direction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Signal> getSignal() {
+		if (signal == null) {
+			signal = new EObjectContainmentEList<Signal>(Signal.class, this, InfrastructurePackage.PORT__SIGNAL);
+		}
+		return signal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Parameter> getParameter() {
+		if (parameter == null) {
+			parameter = new EObjectContainmentEList<Parameter>(Parameter.class, this, InfrastructurePackage.PORT__PARAMETER);
+		}
+		return parameter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.PORT__SIGNAL:
+				return ((InternalEList<?>)getSignal()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.PORT__PARAMETER:
+				return ((InternalEList<?>)getParameter()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.PORT__DIRECTION:
+				return getDirection();
+			case InfrastructurePackage.PORT__SIGNAL:
+				return getSignal();
+			case InfrastructurePackage.PORT__PARAMETER:
+				return getParameter();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.PORT__DIRECTION:
+				setDirection((ChannelDirection)newValue);
+				return;
+			case InfrastructurePackage.PORT__SIGNAL:
+				getSignal().clear();
+				getSignal().addAll((Collection<? extends Signal>)newValue);
+				return;
+			case InfrastructurePackage.PORT__PARAMETER:
+				getParameter().clear();
+				getParameter().addAll((Collection<? extends Parameter>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.PORT__DIRECTION:
+				setDirection(DIRECTION_EDEFAULT);
+				return;
+			case InfrastructurePackage.PORT__SIGNAL:
+				getSignal().clear();
+				return;
+			case InfrastructurePackage.PORT__PARAMETER:
+				getParameter().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.PORT__DIRECTION:
+				return direction != DIRECTION_EDEFAULT;
+			case InfrastructurePackage.PORT__SIGNAL:
+				return signal != null && !signal.isEmpty();
+			case InfrastructurePackage.PORT__PARAMETER:
+				return parameter != null && !parameter.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (direction: ");
+		result.append(direction);
+		result.append(')');
+		return result.toString();
+	}
+
+} //PortImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ProcedureImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ProcedureImpl.java
new file mode 100644
index 0000000..c9ad711
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/ProcedureImpl.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Procedure;
+
+import org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachineImpl;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Procedure</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class ProcedureImpl extends StatemachineImpl implements Procedure {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ProcedureImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.PROCEDURE;
+	}
+
+} //ProcedureImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/PropertyDefinitionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/PropertyDefinitionImpl.java
new file mode 100644
index 0000000..4ac2a0f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/PropertyDefinitionImpl.java
@@ -0,0 +1,255 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.common.impl.TypedElementImpl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Property Definition</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.PropertyDefinitionImpl#getModifier <em>Modifier</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.PropertyDefinitionImpl#getDefaultValue <em>Default Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class PropertyDefinitionImpl extends TypedElementImpl implements PropertyDefinition {
+	/**
+	 * The cached value of the '{@link #getModifier() <em>Modifier</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getModifier()
+	 * @generated
+	 * @ordered
+	 */
+	protected Modifier modifier;
+
+	/**
+	 * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDefaultValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression defaultValue;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PropertyDefinitionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.PROPERTY_DEFINITION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Modifier getModifier() {
+		return modifier;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetModifier(Modifier newModifier, NotificationChain msgs) {
+		Modifier oldModifier = modifier;
+		modifier = newModifier;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.PROPERTY_DEFINITION__MODIFIER, oldModifier, newModifier);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setModifier(Modifier newModifier) {
+		if (newModifier != modifier) {
+			NotificationChain msgs = null;
+			if (modifier != null)
+				msgs = ((InternalEObject)modifier).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.PROPERTY_DEFINITION__MODIFIER, null, msgs);
+			if (newModifier != null)
+				msgs = ((InternalEObject)newModifier).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.PROPERTY_DEFINITION__MODIFIER, null, msgs);
+			msgs = basicSetModifier(newModifier, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.PROPERTY_DEFINITION__MODIFIER, newModifier, newModifier));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getDefaultValue() {
+		return defaultValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetDefaultValue(Expression newDefaultValue, NotificationChain msgs) {
+		Expression oldDefaultValue = defaultValue;
+		defaultValue = newDefaultValue;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.PROPERTY_DEFINITION__DEFAULT_VALUE, oldDefaultValue, newDefaultValue);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDefaultValue(Expression newDefaultValue) {
+		if (newDefaultValue != defaultValue) {
+			NotificationChain msgs = null;
+			if (defaultValue != null)
+				msgs = ((InternalEObject)defaultValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.PROPERTY_DEFINITION__DEFAULT_VALUE, null, msgs);
+			if (newDefaultValue != null)
+				msgs = ((InternalEObject)newDefaultValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.PROPERTY_DEFINITION__DEFAULT_VALUE, null, msgs);
+			msgs = basicSetDefaultValue(newDefaultValue, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.PROPERTY_DEFINITION__DEFAULT_VALUE, newDefaultValue, newDefaultValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.PROPERTY_DEFINITION__MODIFIER:
+				return basicSetModifier(null, msgs);
+			case InfrastructurePackage.PROPERTY_DEFINITION__DEFAULT_VALUE:
+				return basicSetDefaultValue(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.PROPERTY_DEFINITION__MODIFIER:
+				return getModifier();
+			case InfrastructurePackage.PROPERTY_DEFINITION__DEFAULT_VALUE:
+				return getDefaultValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.PROPERTY_DEFINITION__MODIFIER:
+				setModifier((Modifier)newValue);
+				return;
+			case InfrastructurePackage.PROPERTY_DEFINITION__DEFAULT_VALUE:
+				setDefaultValue((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.PROPERTY_DEFINITION__MODIFIER:
+				setModifier((Modifier)null);
+				return;
+			case InfrastructurePackage.PROPERTY_DEFINITION__DEFAULT_VALUE:
+				setDefaultValue((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.PROPERTY_DEFINITION__MODIFIER:
+				return modifier != null;
+			case InfrastructurePackage.PROPERTY_DEFINITION__DEFAULT_VALUE:
+				return defaultValue != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //PropertyDefinitionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/RouteImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/RouteImpl.java
new file mode 100644
index 0000000..20edf11
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/RouteImpl.java
@@ -0,0 +1,229 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Route;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Route</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RouteImpl#getSignals <em>Signals</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RouteImpl#getProtocol <em>Protocol</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class RouteImpl extends NamedElementImpl implements Route {
+	/**
+	 * The cached value of the '{@link #getSignals() <em>Signals</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSignals()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Signal> signals;
+
+	/**
+	 * The cached value of the '{@link #getProtocol() <em>Protocol</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProtocol()
+	 * @generated
+	 * @ordered
+	 */
+	protected ComProtocol protocol;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RouteImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.ROUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Signal> getSignals() {
+		if (signals == null) {
+			signals = new EObjectResolvingEList<Signal>(Signal.class, this, InfrastructurePackage.ROUTE__SIGNALS);
+		}
+		return signals;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ComProtocol getProtocol() {
+		return protocol;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetProtocol(ComProtocol newProtocol, NotificationChain msgs) {
+		ComProtocol oldProtocol = protocol;
+		protocol = newProtocol;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.ROUTE__PROTOCOL, oldProtocol, newProtocol);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setProtocol(ComProtocol newProtocol) {
+		if (newProtocol != protocol) {
+			NotificationChain msgs = null;
+			if (protocol != null)
+				msgs = ((InternalEObject)protocol).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.ROUTE__PROTOCOL, null, msgs);
+			if (newProtocol != null)
+				msgs = ((InternalEObject)newProtocol).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.ROUTE__PROTOCOL, null, msgs);
+			msgs = basicSetProtocol(newProtocol, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.ROUTE__PROTOCOL, newProtocol, newProtocol));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTE__PROTOCOL:
+				return basicSetProtocol(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTE__SIGNALS:
+				return getSignals();
+			case InfrastructurePackage.ROUTE__PROTOCOL:
+				return getProtocol();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTE__SIGNALS:
+				getSignals().clear();
+				getSignals().addAll((Collection<? extends Signal>)newValue);
+				return;
+			case InfrastructurePackage.ROUTE__PROTOCOL:
+				setProtocol((ComProtocol)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTE__SIGNALS:
+				getSignals().clear();
+				return;
+			case InfrastructurePackage.ROUTE__PROTOCOL:
+				setProtocol((ComProtocol)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTE__SIGNALS:
+				return signals != null && !signals.isEmpty();
+			case InfrastructurePackage.ROUTE__PROTOCOL:
+				return protocol != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //RouteImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/RoutineImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/RoutineImpl.java
new file mode 100644
index 0000000..f328a4a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/RoutineImpl.java
@@ -0,0 +1,366 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Routine</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RoutineImpl#getParameter <em>Parameter</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RoutineImpl#getBodyBlock <em>Body Block</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RoutineImpl#getDomain <em>Domain</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.RoutineImpl#getCodomain <em>Codomain</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class RoutineImpl extends NamedElementImpl implements Routine {
+	/**
+	 * The cached value of the '{@link #getParameter() <em>Parameter</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getParameter()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Parameter> parameter;
+
+	/**
+	 * The cached value of the '{@link #getBodyBlock() <em>Body Block</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBodyBlock()
+	 * @generated
+	 * @ordered
+	 */
+	protected BlockStatement bodyBlock;
+
+	/**
+	 * The cached value of the '{@link #getDomain() <em>Domain</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDomain()
+	 * @generated
+	 * @ordered
+	 */
+	protected ParameterSet domain;
+
+	/**
+	 * The cached value of the '{@link #getCodomain() <em>Codomain</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCodomain()
+	 * @generated
+	 * @ordered
+	 */
+	protected ParameterSet codomain;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RoutineImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.ROUTINE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Parameter> getParameter() {
+		if (parameter == null) {
+			parameter = new EObjectContainmentEList<Parameter>(Parameter.class, this, InfrastructurePackage.ROUTINE__PARAMETER);
+		}
+		return parameter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BlockStatement getBodyBlock() {
+		return bodyBlock;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetBodyBlock(BlockStatement newBodyBlock, NotificationChain msgs) {
+		BlockStatement oldBodyBlock = bodyBlock;
+		bodyBlock = newBodyBlock;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.ROUTINE__BODY_BLOCK, oldBodyBlock, newBodyBlock);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBodyBlock(BlockStatement newBodyBlock) {
+		if (newBodyBlock != bodyBlock) {
+			NotificationChain msgs = null;
+			if (bodyBlock != null)
+				msgs = ((InternalEObject)bodyBlock).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.ROUTINE__BODY_BLOCK, null, msgs);
+			if (newBodyBlock != null)
+				msgs = ((InternalEObject)newBodyBlock).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.ROUTINE__BODY_BLOCK, null, msgs);
+			msgs = basicSetBodyBlock(newBodyBlock, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.ROUTINE__BODY_BLOCK, newBodyBlock, newBodyBlock));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ParameterSet getDomain() {
+		return domain;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetDomain(ParameterSet newDomain, NotificationChain msgs) {
+		ParameterSet oldDomain = domain;
+		domain = newDomain;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.ROUTINE__DOMAIN, oldDomain, newDomain);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDomain(ParameterSet newDomain) {
+		if (newDomain != domain) {
+			NotificationChain msgs = null;
+			if (domain != null)
+				msgs = ((InternalEObject)domain).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.ROUTINE__DOMAIN, null, msgs);
+			if (newDomain != null)
+				msgs = ((InternalEObject)newDomain).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.ROUTINE__DOMAIN, null, msgs);
+			msgs = basicSetDomain(newDomain, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.ROUTINE__DOMAIN, newDomain, newDomain));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ParameterSet getCodomain() {
+		return codomain;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetCodomain(ParameterSet newCodomain, NotificationChain msgs) {
+		ParameterSet oldCodomain = codomain;
+		codomain = newCodomain;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.ROUTINE__CODOMAIN, oldCodomain, newCodomain);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCodomain(ParameterSet newCodomain) {
+		if (newCodomain != codomain) {
+			NotificationChain msgs = null;
+			if (codomain != null)
+				msgs = ((InternalEObject)codomain).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.ROUTINE__CODOMAIN, null, msgs);
+			if (newCodomain != null)
+				msgs = ((InternalEObject)newCodomain).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.ROUTINE__CODOMAIN, null, msgs);
+			msgs = basicSetCodomain(newCodomain, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.ROUTINE__CODOMAIN, newCodomain, newCodomain));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTINE__PARAMETER:
+				return ((InternalEList<?>)getParameter()).basicRemove(otherEnd, msgs);
+			case InfrastructurePackage.ROUTINE__BODY_BLOCK:
+				return basicSetBodyBlock(null, msgs);
+			case InfrastructurePackage.ROUTINE__DOMAIN:
+				return basicSetDomain(null, msgs);
+			case InfrastructurePackage.ROUTINE__CODOMAIN:
+				return basicSetCodomain(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTINE__PARAMETER:
+				return getParameter();
+			case InfrastructurePackage.ROUTINE__BODY_BLOCK:
+				return getBodyBlock();
+			case InfrastructurePackage.ROUTINE__DOMAIN:
+				return getDomain();
+			case InfrastructurePackage.ROUTINE__CODOMAIN:
+				return getCodomain();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTINE__PARAMETER:
+				getParameter().clear();
+				getParameter().addAll((Collection<? extends Parameter>)newValue);
+				return;
+			case InfrastructurePackage.ROUTINE__BODY_BLOCK:
+				setBodyBlock((BlockStatement)newValue);
+				return;
+			case InfrastructurePackage.ROUTINE__DOMAIN:
+				setDomain((ParameterSet)newValue);
+				return;
+			case InfrastructurePackage.ROUTINE__CODOMAIN:
+				setCodomain((ParameterSet)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTINE__PARAMETER:
+				getParameter().clear();
+				return;
+			case InfrastructurePackage.ROUTINE__BODY_BLOCK:
+				setBodyBlock((BlockStatement)null);
+				return;
+			case InfrastructurePackage.ROUTINE__DOMAIN:
+				setDomain((ParameterSet)null);
+				return;
+			case InfrastructurePackage.ROUTINE__CODOMAIN:
+				setCodomain((ParameterSet)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.ROUTINE__PARAMETER:
+				return parameter != null && !parameter.isEmpty();
+			case InfrastructurePackage.ROUTINE__BODY_BLOCK:
+				return bodyBlock != null;
+			case InfrastructurePackage.ROUTINE__DOMAIN:
+				return domain != null;
+			case InfrastructurePackage.ROUTINE__CODOMAIN:
+				return codomain != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //RoutineImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/SignalImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/SignalImpl.java
new file mode 100644
index 0000000..52431c5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/SignalImpl.java
@@ -0,0 +1,234 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.impl.ClassifierDefinitionImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Signal</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SignalImpl#getDirection <em>Direction</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SignalImpl#getParameter <em>Parameter</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class SignalImpl extends ClassifierDefinitionImpl implements Signal {
+	/**
+	 * The default value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ChannelDirection DIRECTION_EDEFAULT = ChannelDirection.INOUT;
+
+	/**
+	 * The cached value of the '{@link #getDirection() <em>Direction</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDirection()
+	 * @generated
+	 * @ordered
+	 */
+	protected ChannelDirection direction = DIRECTION_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getParameter() <em>Parameter</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getParameter()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Parameter> parameter;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SignalImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.SIGNAL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ChannelDirection getDirection() {
+		return direction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDirection(ChannelDirection newDirection) {
+		ChannelDirection oldDirection = direction;
+		direction = newDirection == null ? DIRECTION_EDEFAULT : newDirection;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.SIGNAL__DIRECTION, oldDirection, direction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Parameter> getParameter() {
+		if (parameter == null) {
+			parameter = new EObjectContainmentEList<Parameter>(Parameter.class, this, InfrastructurePackage.SIGNAL__PARAMETER);
+		}
+		return parameter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.SIGNAL__PARAMETER:
+				return ((InternalEList<?>)getParameter()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.SIGNAL__DIRECTION:
+				return getDirection();
+			case InfrastructurePackage.SIGNAL__PARAMETER:
+				return getParameter();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.SIGNAL__DIRECTION:
+				setDirection((ChannelDirection)newValue);
+				return;
+			case InfrastructurePackage.SIGNAL__PARAMETER:
+				getParameter().clear();
+				getParameter().addAll((Collection<? extends Parameter>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.SIGNAL__DIRECTION:
+				setDirection(DIRECTION_EDEFAULT);
+				return;
+			case InfrastructurePackage.SIGNAL__PARAMETER:
+				getParameter().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.SIGNAL__DIRECTION:
+				return direction != DIRECTION_EDEFAULT;
+			case InfrastructurePackage.SIGNAL__PARAMETER:
+				return parameter != null && !parameter.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (direction: ");
+		result.append(direction);
+		result.append(')');
+		return result.toString();
+	}
+
+} //SignalImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/SlotPropertyImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/SlotPropertyImpl.java
new file mode 100644
index 0000000..001e20e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/SlotPropertyImpl.java
@@ -0,0 +1,248 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Slot Property</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SlotPropertyImpl#getXliaProperty <em>Xlia Property</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.SlotPropertyImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class SlotPropertyImpl extends MinimalEObjectImpl.Container implements SlotProperty {
+	/**
+	 * The cached value of the '{@link #getXliaProperty() <em>Xlia Property</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getXliaProperty()
+	 * @generated
+	 * @ordered
+	 */
+	protected PropertyDefinition xliaProperty;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SlotPropertyImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.SLOT_PROPERTY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PropertyDefinition getXliaProperty() {
+		if (xliaProperty != null && xliaProperty.eIsProxy()) {
+			InternalEObject oldXliaProperty = (InternalEObject)xliaProperty;
+			xliaProperty = (PropertyDefinition)eResolveProxy(oldXliaProperty);
+			if (xliaProperty != oldXliaProperty) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, InfrastructurePackage.SLOT_PROPERTY__XLIA_PROPERTY, oldXliaProperty, xliaProperty));
+			}
+		}
+		return xliaProperty;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PropertyDefinition basicGetXliaProperty() {
+		return xliaProperty;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setXliaProperty(PropertyDefinition newXliaProperty) {
+		PropertyDefinition oldXliaProperty = xliaProperty;
+		xliaProperty = newXliaProperty;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.SLOT_PROPERTY__XLIA_PROPERTY, oldXliaProperty, xliaProperty));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetValue(Expression newValue, NotificationChain msgs) {
+		Expression oldValue = value;
+		value = newValue;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.SLOT_PROPERTY__VALUE, oldValue, newValue);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(Expression newValue) {
+		if (newValue != value) {
+			NotificationChain msgs = null;
+			if (value != null)
+				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.SLOT_PROPERTY__VALUE, null, msgs);
+			if (newValue != null)
+				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.SLOT_PROPERTY__VALUE, null, msgs);
+			msgs = basicSetValue(newValue, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.SLOT_PROPERTY__VALUE, newValue, newValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.SLOT_PROPERTY__VALUE:
+				return basicSetValue(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.SLOT_PROPERTY__XLIA_PROPERTY:
+				if (resolve) return getXliaProperty();
+				return basicGetXliaProperty();
+			case InfrastructurePackage.SLOT_PROPERTY__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.SLOT_PROPERTY__XLIA_PROPERTY:
+				setXliaProperty((PropertyDefinition)newValue);
+				return;
+			case InfrastructurePackage.SLOT_PROPERTY__VALUE:
+				setValue((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.SLOT_PROPERTY__XLIA_PROPERTY:
+				setXliaProperty((PropertyDefinition)null);
+				return;
+			case InfrastructurePackage.SLOT_PROPERTY__VALUE:
+				setValue((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.SLOT_PROPERTY__XLIA_PROPERTY:
+				return xliaProperty != null;
+			case InfrastructurePackage.SLOT_PROPERTY__VALUE:
+				return value != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //SlotPropertyImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/SystemImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/SystemImpl.java
new file mode 100644
index 0000000..face51b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/SystemImpl.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>System</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class SystemImpl extends MachineImpl implements org.eclipse.efm.ecore.formalml.infrastructure.System {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected SystemImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.SYSTEM;
+	}
+
+} //SystemImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/VariableImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/VariableImpl.java
new file mode 100644
index 0000000..027c823
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/impl/VariableImpl.java
@@ -0,0 +1,307 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.impl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Variable</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.VariableImpl#isConst <em>Const</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.VariableImpl#isMacro <em>Macro</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.infrastructure.impl.VariableImpl#getOnWriteAction <em>On Write Action</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class VariableImpl extends PropertyDefinitionImpl implements Variable {
+	/**
+	 * The default value of the '{@link #isConst() <em>Const</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isConst()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean CONST_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isConst() <em>Const</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isConst()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean const_ = CONST_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isMacro() <em>Macro</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isMacro()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean MACRO_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isMacro() <em>Macro</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isMacro()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean macro = MACRO_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getOnWriteAction() <em>On Write Action</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOnWriteAction()
+	 * @generated
+	 * @ordered
+	 */
+	protected Routine onWriteAction;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VariableImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return InfrastructurePackage.Literals.VARIABLE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isConst() {
+		return const_;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setConst(boolean newConst) {
+		boolean oldConst = const_;
+		const_ = newConst;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.VARIABLE__CONST, oldConst, const_));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isMacro() {
+		return macro;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMacro(boolean newMacro) {
+		boolean oldMacro = macro;
+		macro = newMacro;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.VARIABLE__MACRO, oldMacro, macro));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Routine getOnWriteAction() {
+		return onWriteAction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetOnWriteAction(Routine newOnWriteAction, NotificationChain msgs) {
+		Routine oldOnWriteAction = onWriteAction;
+		onWriteAction = newOnWriteAction;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, InfrastructurePackage.VARIABLE__ON_WRITE_ACTION, oldOnWriteAction, newOnWriteAction);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOnWriteAction(Routine newOnWriteAction) {
+		if (newOnWriteAction != onWriteAction) {
+			NotificationChain msgs = null;
+			if (onWriteAction != null)
+				msgs = ((InternalEObject)onWriteAction).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.VARIABLE__ON_WRITE_ACTION, null, msgs);
+			if (newOnWriteAction != null)
+				msgs = ((InternalEObject)newOnWriteAction).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - InfrastructurePackage.VARIABLE__ON_WRITE_ACTION, null, msgs);
+			msgs = basicSetOnWriteAction(newOnWriteAction, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, InfrastructurePackage.VARIABLE__ON_WRITE_ACTION, newOnWriteAction, newOnWriteAction));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case InfrastructurePackage.VARIABLE__ON_WRITE_ACTION:
+				return basicSetOnWriteAction(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case InfrastructurePackage.VARIABLE__CONST:
+				return isConst();
+			case InfrastructurePackage.VARIABLE__MACRO:
+				return isMacro();
+			case InfrastructurePackage.VARIABLE__ON_WRITE_ACTION:
+				return getOnWriteAction();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case InfrastructurePackage.VARIABLE__CONST:
+				setConst((Boolean)newValue);
+				return;
+			case InfrastructurePackage.VARIABLE__MACRO:
+				setMacro((Boolean)newValue);
+				return;
+			case InfrastructurePackage.VARIABLE__ON_WRITE_ACTION:
+				setOnWriteAction((Routine)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.VARIABLE__CONST:
+				setConst(CONST_EDEFAULT);
+				return;
+			case InfrastructurePackage.VARIABLE__MACRO:
+				setMacro(MACRO_EDEFAULT);
+				return;
+			case InfrastructurePackage.VARIABLE__ON_WRITE_ACTION:
+				setOnWriteAction((Routine)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case InfrastructurePackage.VARIABLE__CONST:
+				return const_ != CONST_EDEFAULT;
+			case InfrastructurePackage.VARIABLE__MACRO:
+				return macro != MACRO_EDEFAULT;
+			case InfrastructurePackage.VARIABLE__ON_WRITE_ACTION:
+				return onWriteAction != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (const: ");
+		result.append(const_);
+		result.append(", macro: ");
+		result.append(macro);
+		result.append(')');
+		return result.toString();
+	}
+
+} //VariableImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/util/InfrastructureAdapterFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/util/InfrastructureAdapterFactory.java
new file mode 100644
index 0000000..9917232
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/util/InfrastructureAdapterFactory.java
@@ -0,0 +1,664 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.util;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+import org.eclipse.efm.ecore.formalml.common.Type;
+import org.eclipse.efm.ecore.formalml.common.TypedElement;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.Connection;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction;
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Procedure;
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+import org.eclipse.efm.ecore.formalml.infrastructure.Route;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty;
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage
+ * @generated
+ */
+public class InfrastructureAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static InfrastructurePackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InfrastructureAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = InfrastructurePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InfrastructureSwitch<Adapter> modelSwitch =
+		new InfrastructureSwitch<Adapter>() {
+			@Override
+			public Adapter caseMachine(Machine object) {
+				return createMachineAdapter();
+			}
+			@Override
+			public Adapter caseSystem(org.eclipse.efm.ecore.formalml.infrastructure.System object) {
+				return createSystemAdapter();
+			}
+			@Override
+			public Adapter caseModifier(Modifier object) {
+				return createModifierAdapter();
+			}
+			@Override
+			public Adapter casePropertyDefinition(PropertyDefinition object) {
+				return createPropertyDefinitionAdapter();
+			}
+			@Override
+			public Adapter caseVariable(Variable object) {
+				return createVariableAdapter();
+			}
+			@Override
+			public Adapter caseBuffer(Buffer object) {
+				return createBufferAdapter();
+			}
+			@Override
+			public Adapter casePort(Port object) {
+				return createPortAdapter();
+			}
+			@Override
+			public Adapter caseChannel(Channel object) {
+				return createChannelAdapter();
+			}
+			@Override
+			public Adapter caseSignal(Signal object) {
+				return createSignalAdapter();
+			}
+			@Override
+			public Adapter caseProcedure(Procedure object) {
+				return createProcedureAdapter();
+			}
+			@Override
+			public Adapter caseRoutine(Routine object) {
+				return createRoutineAdapter();
+			}
+			@Override
+			public Adapter caseInstanceMachine(InstanceMachine object) {
+				return createInstanceMachineAdapter();
+			}
+			@Override
+			public Adapter caseSlotProperty(SlotProperty object) {
+				return createSlotPropertyAdapter();
+			}
+			@Override
+			public Adapter caseParameter(Parameter object) {
+				return createParameterAdapter();
+			}
+			@Override
+			public Adapter caseParameterSet(ParameterSet object) {
+				return createParameterSetAdapter();
+			}
+			@Override
+			public Adapter caseBehavior(Behavior object) {
+				return createBehaviorAdapter();
+			}
+			@Override
+			public Adapter caseModelOfComputation(ModelOfComputation object) {
+				return createModelOfComputationAdapter();
+			}
+			@Override
+			public Adapter caseModelOfExecution(ModelOfExecution object) {
+				return createModelOfExecutionAdapter();
+			}
+			@Override
+			public Adapter caseModelOfInteraction(ModelOfInteraction object) {
+				return createModelOfInteractionAdapter();
+			}
+			@Override
+			public Adapter caseComProtocol(ComProtocol object) {
+				return createComProtocolAdapter();
+			}
+			@Override
+			public Adapter caseRoute(Route object) {
+				return createRouteAdapter();
+			}
+			@Override
+			public Adapter caseConnection(Connection object) {
+				return createConnectionAdapter();
+			}
+			@Override
+			public Adapter caseComPoint(ComPoint object) {
+				return createComPointAdapter();
+			}
+			@Override
+			public Adapter caseAbstractElement(AbstractElement object) {
+				return createAbstractElementAdapter();
+			}
+			@Override
+			public Adapter caseNamedElement(NamedElement object) {
+				return createNamedElementAdapter();
+			}
+			@Override
+			public Adapter caseType(Type object) {
+				return createTypeAdapter();
+			}
+			@Override
+			public Adapter caseClassifierDefinition(ClassifierDefinition object) {
+				return createClassifierDefinitionAdapter();
+			}
+			@Override
+			public Adapter caseTypedElement(TypedElement object) {
+				return createTypedElementAdapter();
+			}
+			@Override
+			public Adapter caseStatemachine(Statemachine object) {
+				return createStatemachineAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine <em>Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine
+	 * @generated
+	 */
+	public Adapter createMachineAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.System <em>System</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.System
+	 * @generated
+	 */
+	public Adapter createSystemAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier <em>Modifier</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Modifier
+	 * @generated
+	 */
+	public Adapter createModifierAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition <em>Property Definition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition
+	 * @generated
+	 */
+	public Adapter createPropertyDefinitionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Variable <em>Variable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Variable
+	 * @generated
+	 */
+	public Adapter createVariableAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Buffer <em>Buffer</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Buffer
+	 * @generated
+	 */
+	public Adapter createBufferAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Port <em>Port</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Port
+	 * @generated
+	 */
+	public Adapter createPortAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Channel <em>Channel</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Channel
+	 * @generated
+	 */
+	public Adapter createChannelAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Signal <em>Signal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Signal
+	 * @generated
+	 */
+	public Adapter createSignalAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Procedure <em>Procedure</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Procedure
+	 * @generated
+	 */
+	public Adapter createProcedureAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Routine <em>Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Routine
+	 * @generated
+	 */
+	public Adapter createRoutineAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine <em>Instance Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine
+	 * @generated
+	 */
+	public Adapter createInstanceMachineAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty <em>Slot Property</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty
+	 * @generated
+	 */
+	public Adapter createSlotPropertyAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter <em>Parameter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Parameter
+	 * @generated
+	 */
+	public Adapter createParameterAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet <em>Parameter Set</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet
+	 * @generated
+	 */
+	public Adapter createParameterSetAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior <em>Behavior</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Behavior
+	 * @generated
+	 */
+	public Adapter createBehaviorAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation <em>Model Of Computation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation
+	 * @generated
+	 */
+	public Adapter createModelOfComputationAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution <em>Model Of Execution</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution
+	 * @generated
+	 */
+	public Adapter createModelOfExecutionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction <em>Model Of Interaction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction
+	 * @generated
+	 */
+	public Adapter createModelOfInteractionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol <em>Com Protocol</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol
+	 * @generated
+	 */
+	public Adapter createComProtocolAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Route <em>Route</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Route
+	 * @generated
+	 */
+	public Adapter createRouteAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Connection <em>Connection</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Connection
+	 * @generated
+	 */
+	public Adapter createConnectionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint <em>Com Point</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.ComPoint
+	 * @generated
+	 */
+	public Adapter createComPointAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.AbstractElement <em>Abstract Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.AbstractElement
+	 * @generated
+	 */
+	public Adapter createAbstractElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.NamedElement <em>Named Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.NamedElement
+	 * @generated
+	 */
+	public Adapter createNamedElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.Type <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.Type
+	 * @generated
+	 */
+	public Adapter createTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.ClassifierDefinition <em>Classifier Definition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.ClassifierDefinition
+	 * @generated
+	 */
+	public Adapter createClassifierDefinitionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.TypedElement <em>Typed Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.TypedElement
+	 * @generated
+	 */
+	public Adapter createTypedElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.Statemachine <em>Statemachine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Statemachine
+	 * @generated
+	 */
+	public Adapter createStatemachineAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //InfrastructureAdapterFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/util/InfrastructureSwitch.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/util/InfrastructureSwitch.java
new file mode 100644
index 0000000..f608fe2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/util/InfrastructureSwitch.java
@@ -0,0 +1,760 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.util;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+import org.eclipse.efm.ecore.formalml.common.Type;
+import org.eclipse.efm.ecore.formalml.common.TypedElement;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.Connection;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction;
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Procedure;
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+import org.eclipse.efm.ecore.formalml.infrastructure.Route;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty;
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage
+ * @generated
+ */
+public class InfrastructureSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static InfrastructurePackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InfrastructureSwitch() {
+		if (modelPackage == null) {
+			modelPackage = InfrastructurePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case InfrastructurePackage.MACHINE: {
+				Machine machine = (Machine)theEObject;
+				T result = caseMachine(machine);
+				if (result == null) result = caseClassifierDefinition(machine);
+				if (result == null) result = caseType(machine);
+				if (result == null) result = caseNamedElement(machine);
+				if (result == null) result = caseAbstractElement(machine);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.SYSTEM: {
+				org.eclipse.efm.ecore.formalml.infrastructure.System system = (org.eclipse.efm.ecore.formalml.infrastructure.System)theEObject;
+				T result = caseSystem(system);
+				if (result == null) result = caseMachine(system);
+				if (result == null) result = caseClassifierDefinition(system);
+				if (result == null) result = caseType(system);
+				if (result == null) result = caseNamedElement(system);
+				if (result == null) result = caseAbstractElement(system);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.MODIFIER: {
+				Modifier modifier = (Modifier)theEObject;
+				T result = caseModifier(modifier);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.PROPERTY_DEFINITION: {
+				PropertyDefinition propertyDefinition = (PropertyDefinition)theEObject;
+				T result = casePropertyDefinition(propertyDefinition);
+				if (result == null) result = caseTypedElement(propertyDefinition);
+				if (result == null) result = caseNamedElement(propertyDefinition);
+				if (result == null) result = caseAbstractElement(propertyDefinition);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.VARIABLE: {
+				Variable variable = (Variable)theEObject;
+				T result = caseVariable(variable);
+				if (result == null) result = casePropertyDefinition(variable);
+				if (result == null) result = caseTypedElement(variable);
+				if (result == null) result = caseNamedElement(variable);
+				if (result == null) result = caseAbstractElement(variable);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.BUFFER: {
+				Buffer buffer = (Buffer)theEObject;
+				T result = caseBuffer(buffer);
+				if (result == null) result = casePropertyDefinition(buffer);
+				if (result == null) result = caseComProtocol(buffer);
+				if (result == null) result = caseTypedElement(buffer);
+				if (result == null) result = caseNamedElement(buffer);
+				if (result == null) result = caseAbstractElement(buffer);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.PORT: {
+				Port port = (Port)theEObject;
+				T result = casePort(port);
+				if (result == null) result = casePropertyDefinition(port);
+				if (result == null) result = caseTypedElement(port);
+				if (result == null) result = caseNamedElement(port);
+				if (result == null) result = caseAbstractElement(port);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.CHANNEL: {
+				Channel channel = (Channel)theEObject;
+				T result = caseChannel(channel);
+				if (result == null) result = casePropertyDefinition(channel);
+				if (result == null) result = caseTypedElement(channel);
+				if (result == null) result = caseNamedElement(channel);
+				if (result == null) result = caseAbstractElement(channel);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.SIGNAL: {
+				Signal signal = (Signal)theEObject;
+				T result = caseSignal(signal);
+				if (result == null) result = caseClassifierDefinition(signal);
+				if (result == null) result = caseType(signal);
+				if (result == null) result = caseNamedElement(signal);
+				if (result == null) result = caseAbstractElement(signal);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.PROCEDURE: {
+				Procedure procedure = (Procedure)theEObject;
+				T result = caseProcedure(procedure);
+				if (result == null) result = caseStatemachine(procedure);
+				if (result == null) result = caseBehavior(procedure);
+				if (result == null) result = caseMachine(procedure);
+				if (result == null) result = caseClassifierDefinition(procedure);
+				if (result == null) result = caseType(procedure);
+				if (result == null) result = caseNamedElement(procedure);
+				if (result == null) result = caseAbstractElement(procedure);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.ROUTINE: {
+				Routine routine = (Routine)theEObject;
+				T result = caseRoutine(routine);
+				if (result == null) result = caseNamedElement(routine);
+				if (result == null) result = caseAbstractElement(routine);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.INSTANCE_MACHINE: {
+				InstanceMachine instanceMachine = (InstanceMachine)theEObject;
+				T result = caseInstanceMachine(instanceMachine);
+				if (result == null) result = caseTypedElement(instanceMachine);
+				if (result == null) result = caseNamedElement(instanceMachine);
+				if (result == null) result = caseAbstractElement(instanceMachine);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.SLOT_PROPERTY: {
+				SlotProperty slotProperty = (SlotProperty)theEObject;
+				T result = caseSlotProperty(slotProperty);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.PARAMETER: {
+				Parameter parameter = (Parameter)theEObject;
+				T result = caseParameter(parameter);
+				if (result == null) result = casePropertyDefinition(parameter);
+				if (result == null) result = caseTypedElement(parameter);
+				if (result == null) result = caseNamedElement(parameter);
+				if (result == null) result = caseAbstractElement(parameter);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.PARAMETER_SET: {
+				ParameterSet parameterSet = (ParameterSet)theEObject;
+				T result = caseParameterSet(parameterSet);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.BEHAVIOR: {
+				Behavior behavior = (Behavior)theEObject;
+				T result = caseBehavior(behavior);
+				if (result == null) result = caseMachine(behavior);
+				if (result == null) result = caseClassifierDefinition(behavior);
+				if (result == null) result = caseType(behavior);
+				if (result == null) result = caseNamedElement(behavior);
+				if (result == null) result = caseAbstractElement(behavior);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.MODEL_OF_COMPUTATION: {
+				ModelOfComputation modelOfComputation = (ModelOfComputation)theEObject;
+				T result = caseModelOfComputation(modelOfComputation);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.MODEL_OF_EXECUTION: {
+				ModelOfExecution modelOfExecution = (ModelOfExecution)theEObject;
+				T result = caseModelOfExecution(modelOfExecution);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.MODEL_OF_INTERACTION: {
+				ModelOfInteraction modelOfInteraction = (ModelOfInteraction)theEObject;
+				T result = caseModelOfInteraction(modelOfInteraction);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.COM_PROTOCOL: {
+				ComProtocol comProtocol = (ComProtocol)theEObject;
+				T result = caseComProtocol(comProtocol);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.ROUTE: {
+				Route route = (Route)theEObject;
+				T result = caseRoute(route);
+				if (result == null) result = caseNamedElement(route);
+				if (result == null) result = caseAbstractElement(route);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.CONNECTION: {
+				Connection connection = (Connection)theEObject;
+				T result = caseConnection(connection);
+				if (result == null) result = caseNamedElement(connection);
+				if (result == null) result = caseAbstractElement(connection);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case InfrastructurePackage.COM_POINT: {
+				ComPoint comPoint = (ComPoint)theEObject;
+				T result = caseComPoint(comPoint);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Machine</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Machine</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseMachine(Machine object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>System</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>System</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseSystem(org.eclipse.efm.ecore.formalml.infrastructure.System object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Modifier</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Modifier</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseModifier(Modifier object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Property Definition</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Property Definition</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePropertyDefinition(PropertyDefinition object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Variable</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Variable</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVariable(Variable object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Buffer</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Buffer</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseBuffer(Buffer object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Port</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Port</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePort(Port object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Channel</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Channel</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseChannel(Channel object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Signal</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Signal</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseSignal(Signal object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Procedure</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Procedure</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseProcedure(Procedure object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Routine</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Routine</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseRoutine(Routine object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Instance Machine</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Instance Machine</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseInstanceMachine(InstanceMachine object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Slot Property</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Slot Property</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseSlotProperty(SlotProperty object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Parameter</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Parameter</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseParameter(Parameter object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Parameter Set</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Parameter Set</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseParameterSet(ParameterSet object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Behavior</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Behavior</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseBehavior(Behavior object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Model Of Computation</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Model Of Computation</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseModelOfComputation(ModelOfComputation object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Model Of Execution</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Model Of Execution</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseModelOfExecution(ModelOfExecution object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Model Of Interaction</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Model Of Interaction</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseModelOfInteraction(ModelOfInteraction object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Com Protocol</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Com Protocol</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseComProtocol(ComProtocol object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Route</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Route</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseRoute(Route object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Connection</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Connection</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseConnection(Connection object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Com Point</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Com Point</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseComPoint(ComPoint object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAbstractElement(AbstractElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Named Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Named Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseNamedElement(NamedElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseType(Type object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Classifier Definition</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Classifier Definition</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseClassifierDefinition(ClassifierDefinition object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Typed Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Typed Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseTypedElement(TypedElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachine(Statemachine object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //InfrastructureSwitch
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/BehaviorValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/BehaviorValidator.java
new file mode 100644
index 0000000..5260a0c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/BehaviorValidator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface BehaviorValidator {
+	boolean validate();
+
+	boolean validateParameter(EList<Parameter> value);
+	boolean validateComputation(ModelOfComputation value);
+	boolean validateExecution(ModelOfExecution value);
+	boolean validateInteraction(ModelOfInteraction value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/BufferValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/BufferValidator.java
new file mode 100644
index 0000000..6121b95
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/BufferValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Buffer}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface BufferValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ChannelValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ChannelValidator.java
new file mode 100644
index 0000000..11a6eb4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ChannelValidator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Channel}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ChannelValidator {
+	boolean validate();
+
+	boolean validateDirection(ChannelDirection value);
+	boolean validateMachine(Machine value);
+	boolean validatePort(EList<Port> value);
+	boolean validateSignal(EList<Signal> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ComPointValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ComPointValidator.java
new file mode 100644
index 0000000..218668c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ComPointValidator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.ComPoint}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ComPointValidator {
+	boolean validate();
+
+	boolean validateDirection(ChannelDirection value);
+	boolean validateProtocol(ComProtocol value);
+	boolean validatePoint(Expression value);
+	boolean validatePoints(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ComProtocolValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ComProtocolValidator.java
new file mode 100644
index 0000000..2f115f0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ComProtocolValidator.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.CollectionType;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocolKind;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ComProtocolValidator {
+	boolean validate();
+
+	boolean validateProtocol(ComProtocolKind value);
+	boolean validateCast(ComCastKind value);
+	boolean validateInner_buffer(CollectionType value);
+	boolean validateRef_buffer(Buffer value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ConnectionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ConnectionValidator.java
new file mode 100644
index 0000000..1e0f248
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ConnectionValidator.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Connection}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ConnectionValidator {
+	boolean validate();
+
+	boolean validateProtocol(ComProtocol value);
+	boolean validateCast(ComCastKind value);
+	boolean validateComPoints(EList<ComPoint> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/InstanceMachineValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/InstanceMachineValidator.java
new file mode 100644
index 0000000..00f8070
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/InstanceMachineValidator.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.MixTupleExpression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface InstanceMachineValidator {
+	boolean validate();
+
+	boolean validateModifier(Modifier value);
+	boolean validateModel(Machine value);
+	boolean validateArg(MixTupleExpression value);
+	boolean validateSlot(EList<SlotProperty> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/MachineValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/MachineValidator.java
new file mode 100644
index 0000000..95416e8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/MachineValidator.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.datatype.DataType;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+import org.eclipse.efm.ecore.formalml.infrastructure.DesignKind;
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Procedure;
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Machine}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface MachineValidator {
+	boolean validate();
+
+	boolean validateInput_enabled(boolean value);
+	boolean validateTimed(boolean value);
+	boolean validateDesign(DesignKind value);
+	boolean validateMachine(EList<Machine> value);
+	boolean validateTypedef(EList<DataType> value);
+	boolean validateProperty(EList<PropertyDefinition> value);
+	boolean validateChannel(EList<Channel> value);
+	boolean validatePort(EList<Port> value);
+	boolean validateSignal(EList<Signal> value);
+	boolean validateBuffer(EList<Buffer> value);
+	boolean validateRoutine(EList<Routine> value);
+	boolean validateProcedure(EList<Procedure> value);
+	boolean validateInstance(EList<InstanceMachine> value);
+	boolean validateBehavior(EList<Behavior> value);
+	boolean validateMain(Behavior value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModelOfComputationValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModelOfComputationValidator.java
new file mode 100644
index 0000000..24a1d83
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModelOfComputationValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ModelOfComputationValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModelOfExecutionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModelOfExecutionValidator.java
new file mode 100644
index 0000000..7ffe806
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModelOfExecutionValidator.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ModelOfExecutionValidator {
+	boolean validate();
+
+	boolean validateInitRoutine(Routine value);
+	boolean validateFinalRoutine(Routine value);
+	boolean validateEnableRoutine(Routine value);
+	boolean validateDisableRoutine(Routine value);
+	boolean validateConcurrencyRoutine(Routine value);
+	boolean validateScheduleRoutine(Routine value);
+	boolean validateIrunRoutine(Routine value);
+	boolean validateRunRoutine(Routine value);
+	boolean validateRoutine(EList<Routine> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModelOfInteractionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModelOfInteractionValidator.java
new file mode 100644
index 0000000..fab9e3e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModelOfInteractionValidator.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Connection;
+import org.eclipse.efm.ecore.formalml.infrastructure.Route;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ModelOfInteractionValidator {
+	boolean validate();
+
+	boolean validateRoutes(EList<Route> value);
+	boolean validateConnections(EList<Connection> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModifierValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModifierValidator.java
new file mode 100644
index 0000000..a3ea7bb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ModifierValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Modifier}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ModifierValidator {
+	boolean validate();
+
+	boolean validateStatic(boolean value);
+	boolean validateFinal(boolean value);
+	boolean validateReference(boolean value);
+	boolean validateVolatile(boolean value);
+	boolean validateTransient(boolean value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ParameterSetValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ParameterSetValidator.java
new file mode 100644
index 0000000..7e70d65
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ParameterSetValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ParameterSetValidator {
+	boolean validate();
+
+	boolean validateParameter(EList<Parameter> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ParameterValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ParameterValidator.java
new file mode 100644
index 0000000..563f94c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ParameterValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterDirectionKind;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Parameter}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ParameterValidator {
+	boolean validate();
+
+	boolean validateDirection(ParameterDirectionKind value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/PortValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/PortValidator.java
new file mode 100644
index 0000000..2ed6dcb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/PortValidator.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Port}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PortValidator {
+	boolean validate();
+
+	boolean validateDirection(ChannelDirection value);
+	boolean validateSignal(EList<Signal> value);
+	boolean validateParameter(EList<Parameter> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ProcedureValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ProcedureValidator.java
new file mode 100644
index 0000000..5077c91
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/ProcedureValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Procedure}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ProcedureValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/PropertyDefinitionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/PropertyDefinitionValidator.java
new file mode 100644
index 0000000..99f3be3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/PropertyDefinitionValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PropertyDefinitionValidator {
+	boolean validate();
+
+	boolean validateModifier(Modifier value);
+	boolean validateDefaultValue(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/RouteValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/RouteValidator.java
new file mode 100644
index 0000000..93a4f2d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/RouteValidator.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Route}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface RouteValidator {
+	boolean validate();
+
+	boolean validateSignals(EList<Signal> value);
+	boolean validateProtocol(ComProtocol value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/RoutineValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/RoutineValidator.java
new file mode 100644
index 0000000..b639fee
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/RoutineValidator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet;
+
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Routine}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface RoutineValidator {
+	boolean validate();
+
+	boolean validateParameter(EList<Parameter> value);
+	boolean validateBodyBlock(BlockStatement value);
+	boolean validateDomain(ParameterSet value);
+	boolean validateCodomain(ParameterSet value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/SignalValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/SignalValidator.java
new file mode 100644
index 0000000..aa98538
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/SignalValidator.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Signal}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface SignalValidator {
+	boolean validate();
+
+	boolean validateDirection(ChannelDirection value);
+	boolean validateParameter(EList<Parameter> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/SlotPropertyValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/SlotPropertyValidator.java
new file mode 100644
index 0000000..a374ede
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/SlotPropertyValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface SlotPropertyValidator {
+	boolean validate();
+
+	boolean validateXliaProperty(PropertyDefinition value);
+	boolean validateValue(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/SystemValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/SystemValidator.java
new file mode 100644
index 0000000..27c76d5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/SystemValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.System}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface SystemValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/VariableValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/VariableValidator.java
new file mode 100644
index 0000000..9ef98f4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/infrastructure/validation/VariableValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.infrastructure.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.infrastructure.Variable}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface VariableValidator {
+	boolean validate();
+
+	boolean validateConst(boolean value);
+	boolean validateMacro(boolean value);
+	boolean validateOnWriteAction(Routine value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/FinalState.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/FinalState.java
new file mode 100644
index 0000000..7b67afa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/FinalState.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Final State</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getFinalState()
+ * @model
+ * @generated
+ */
+public interface FinalState extends State {
+} // FinalState
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Pseudostate.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Pseudostate.java
new file mode 100644
index 0000000..435a633
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Pseudostate.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Pseudostate</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Pseudostate#getKind <em>Kind</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getPseudostate()
+ * @model
+ * @generated
+ */
+public interface Pseudostate extends Vertex {
+	/**
+	 * Returns the value of the '<em><b>Kind</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Kind</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind
+	 * @see #setKind(PseudostateKind)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getPseudostate_Kind()
+	 * @model
+	 * @generated
+	 */
+	PseudostateKind getKind();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.Pseudostate#getKind <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind
+	 * @see #getKind()
+	 * @generated
+	 */
+	void setKind(PseudostateKind value);
+
+} // Pseudostate
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/PseudostateKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/PseudostateKind.java
new file mode 100644
index 0000000..a38ebbf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/PseudostateKind.java
@@ -0,0 +1,467 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Pseudostate Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getPseudostateKind()
+ * @model
+ * @generated
+ */
+public enum PseudostateKind implements Enumerator {
+	/**
+	 * The '<em><b>Initial</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INITIAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INITIAL(0, "initial", "initial"),
+
+	/**
+	 * The '<em><b>Deep History</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DEEP_HISTORY_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DEEP_HISTORY(1, "deepHistory", "deepHistory"),
+
+	/**
+	 * The '<em><b>Shallow History</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SHALLOW_HISTORY_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SHALLOW_HISTORY(2, "shallowHistory", "shallowHistory"),
+
+	/**
+	 * The '<em><b>Join</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #JOIN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	JOIN(3, "join", "join"),
+
+	/**
+	 * The '<em><b>Fork</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FORK_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	FORK(4, "fork", "fork"),
+
+	/**
+	 * The '<em><b>Junction</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #JUNCTION_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	JUNCTION(5, "junction", "junction"),
+
+	/**
+	 * The '<em><b>Choice</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CHOICE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	CHOICE(6, "choice", "choice"),
+
+	/**
+	 * The '<em><b>Entry Point</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ENTRY_POINT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ENTRY_POINT(7, "entryPoint", "entryPoint"),
+
+	/**
+	 * The '<em><b>Exit Point</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #EXIT_POINT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	EXIT_POINT(8, "exitPoint", "exitPoint"),
+
+	/**
+	 * The '<em><b>Terminate</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #TERMINATE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	TERMINATE(9, "terminate", "terminate"),
+
+	/**
+	 * The '<em><b>Return</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RETURN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RETURN(10, "return", "return");
+
+	/**
+	 * The '<em><b>Initial</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Initial</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INITIAL
+	 * @model name="initial"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INITIAL_VALUE = 0;
+
+	/**
+	 * The '<em><b>Deep History</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Deep History</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DEEP_HISTORY
+	 * @model name="deepHistory"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DEEP_HISTORY_VALUE = 1;
+
+	/**
+	 * The '<em><b>Shallow History</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Shallow History</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SHALLOW_HISTORY
+	 * @model name="shallowHistory"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SHALLOW_HISTORY_VALUE = 2;
+
+	/**
+	 * The '<em><b>Join</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Join</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #JOIN
+	 * @model name="join"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int JOIN_VALUE = 3;
+
+	/**
+	 * The '<em><b>Fork</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Fork</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #FORK
+	 * @model name="fork"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int FORK_VALUE = 4;
+
+	/**
+	 * The '<em><b>Junction</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Junction</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #JUNCTION
+	 * @model name="junction"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int JUNCTION_VALUE = 5;
+
+	/**
+	 * The '<em><b>Choice</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Choice</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #CHOICE
+	 * @model name="choice"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int CHOICE_VALUE = 6;
+
+	/**
+	 * The '<em><b>Entry Point</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Entry Point</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ENTRY_POINT
+	 * @model name="entryPoint"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ENTRY_POINT_VALUE = 7;
+
+	/**
+	 * The '<em><b>Exit Point</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Exit Point</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #EXIT_POINT
+	 * @model name="exitPoint"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int EXIT_POINT_VALUE = 8;
+
+	/**
+	 * The '<em><b>Terminate</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Terminate</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #TERMINATE
+	 * @model name="terminate"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int TERMINATE_VALUE = 9;
+
+	/**
+	 * The '<em><b>Return</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Return</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RETURN
+	 * @model name="return"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RETURN_VALUE = 10;
+
+	/**
+	 * An array of all the '<em><b>Pseudostate Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final PseudostateKind[] VALUES_ARRAY =
+		new PseudostateKind[] {
+			INITIAL,
+			DEEP_HISTORY,
+			SHALLOW_HISTORY,
+			JOIN,
+			FORK,
+			JUNCTION,
+			CHOICE,
+			ENTRY_POINT,
+			EXIT_POINT,
+			TERMINATE,
+			RETURN,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Pseudostate Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<PseudostateKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Pseudostate Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PseudostateKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PseudostateKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Pseudostate Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PseudostateKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			PseudostateKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Pseudostate Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static PseudostateKind get(int value) {
+		switch (value) {
+			case INITIAL_VALUE: return INITIAL;
+			case DEEP_HISTORY_VALUE: return DEEP_HISTORY;
+			case SHALLOW_HISTORY_VALUE: return SHALLOW_HISTORY;
+			case JOIN_VALUE: return JOIN;
+			case FORK_VALUE: return FORK;
+			case JUNCTION_VALUE: return JUNCTION;
+			case CHOICE_VALUE: return CHOICE;
+			case ENTRY_POINT_VALUE: return ENTRY_POINT;
+			case EXIT_POINT_VALUE: return EXIT_POINT;
+			case TERMINATE_VALUE: return TERMINATE;
+			case RETURN_VALUE: return RETURN;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private PseudostateKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //PseudostateKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Region.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Region.java
new file mode 100644
index 0000000..b2f0865
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Region.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Region</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Region#getVertex <em>Vertex</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getRegion()
+ * @model
+ * @generated
+ */
+public interface Region extends NamedElement {
+	/**
+	 * Returns the value of the '<em><b>Vertex</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.statemachine.Vertex}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Vertex</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Vertex</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getRegion_Vertex()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Vertex> getVertex();
+
+} // Region
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/StartState.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/StartState.java
new file mode 100644
index 0000000..1f97070
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/StartState.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Start State</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getStartState()
+ * @model
+ * @generated
+ */
+public interface StartState extends State {
+} // StartState
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/State.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/State.java
new file mode 100644
index 0000000..e25ba8a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/State.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>State</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.State#isSimple <em>Simple</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.State#isComposite <em>Composite</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.State#isOrthogonal <em>Orthogonal</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.State#getRegion <em>Region</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getState()
+ * @model
+ * @generated
+ */
+public interface State extends Vertex {
+	/**
+	 * Returns the value of the '<em><b>Simple</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Simple</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Simple</em>' attribute.
+	 * @see #setSimple(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getState_Simple()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isSimple();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.State#isSimple <em>Simple</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Simple</em>' attribute.
+	 * @see #isSimple()
+	 * @generated
+	 */
+	void setSimple(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Composite</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Composite</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Composite</em>' attribute.
+	 * @see #setComposite(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getState_Composite()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isComposite();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.State#isComposite <em>Composite</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Composite</em>' attribute.
+	 * @see #isComposite()
+	 * @generated
+	 */
+	void setComposite(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Orthogonal</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Orthogonal</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Orthogonal</em>' attribute.
+	 * @see #setOrthogonal(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getState_Orthogonal()
+	 * @model default="false" required="true"
+	 * @generated
+	 */
+	boolean isOrthogonal();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.State#isOrthogonal <em>Orthogonal</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Orthogonal</em>' attribute.
+	 * @see #isOrthogonal()
+	 * @generated
+	 */
+	void setOrthogonal(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Region</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.statemachine.Region}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Region</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Region</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getState_Region()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Region> getRegion();
+
+} // State
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Statemachine.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Statemachine.java
new file mode 100644
index 0000000..3637734
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Statemachine.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statemachine</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Statemachine#getRegion <em>Region</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getStatemachine()
+ * @model
+ * @generated
+ */
+public interface Statemachine extends Behavior {
+	/**
+	 * Returns the value of the '<em><b>Region</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.statemachine.Region}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Region</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Region</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getStatemachine_Region()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Region> getRegion();
+
+} // Statemachine
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/StatemachineFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/StatemachineFactory.java
new file mode 100644
index 0000000..1f9ff6c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/StatemachineFactory.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage
+ * @generated
+ */
+public interface StatemachineFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	StatemachineFactory eINSTANCE = org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachineFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Statemachine</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Statemachine</em>'.
+	 * @generated
+	 */
+	Statemachine createStatemachine();
+
+	/**
+	 * Returns a new object of class '<em>Region</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Region</em>'.
+	 * @generated
+	 */
+	Region createRegion();
+
+	/**
+	 * Returns a new object of class '<em>Vertex</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Vertex</em>'.
+	 * @generated
+	 */
+	Vertex createVertex();
+
+	/**
+	 * Returns a new object of class '<em>Pseudostate</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Pseudostate</em>'.
+	 * @generated
+	 */
+	Pseudostate createPseudostate();
+
+	/**
+	 * Returns a new object of class '<em>State</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>State</em>'.
+	 * @generated
+	 */
+	State createState();
+
+	/**
+	 * Returns a new object of class '<em>Final State</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Final State</em>'.
+	 * @generated
+	 */
+	FinalState createFinalState();
+
+	/**
+	 * Returns a new object of class '<em>Start State</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Start State</em>'.
+	 * @generated
+	 */
+	StartState createStartState();
+
+	/**
+	 * Returns a new object of class '<em>Transition</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Transition</em>'.
+	 * @generated
+	 */
+	Transition createTransition();
+
+	/**
+	 * Returns a new object of class '<em>Transition Moe</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Transition Moe</em>'.
+	 * @generated
+	 */
+	TransitionMoe createTransitionMoe();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	StatemachinePackage getStatemachinePackage();
+
+} //StatemachineFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/StatemachinePackage.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/StatemachinePackage.java
new file mode 100644
index 0000000..34e4743
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/StatemachinePackage.java
@@ -0,0 +1,1783 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachineFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface StatemachinePackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "statemachine";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efm/FormalML/Statemachine";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "Statemachine";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	StatemachinePackage eINSTANCE = org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachineImpl <em>Statemachine</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachineImpl
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getStatemachine()
+	 * @generated
+	 */
+	int STATEMACHINE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__NAME = InfrastructurePackage.BEHAVIOR__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__UNRESTRICTED_NAME = InfrastructurePackage.BEHAVIOR__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__QUALIFIED_NAME = InfrastructurePackage.BEHAVIOR__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__VISIBILITY = InfrastructurePackage.BEHAVIOR__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Input enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__INPUT_ENABLED = InfrastructurePackage.BEHAVIOR__INPUT_ENABLED;
+
+	/**
+	 * The feature id for the '<em><b>Timed</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__TIMED = InfrastructurePackage.BEHAVIOR__TIMED;
+
+	/**
+	 * The feature id for the '<em><b>Design</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__DESIGN = InfrastructurePackage.BEHAVIOR__DESIGN;
+
+	/**
+	 * The feature id for the '<em><b>Machine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__MACHINE = InfrastructurePackage.BEHAVIOR__MACHINE;
+
+	/**
+	 * The feature id for the '<em><b>Typedef</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__TYPEDEF = InfrastructurePackage.BEHAVIOR__TYPEDEF;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__PROPERTY = InfrastructurePackage.BEHAVIOR__PROPERTY;
+
+	/**
+	 * The feature id for the '<em><b>Channel</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__CHANNEL = InfrastructurePackage.BEHAVIOR__CHANNEL;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__PORT = InfrastructurePackage.BEHAVIOR__PORT;
+
+	/**
+	 * The feature id for the '<em><b>Signal</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__SIGNAL = InfrastructurePackage.BEHAVIOR__SIGNAL;
+
+	/**
+	 * The feature id for the '<em><b>Buffer</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__BUFFER = InfrastructurePackage.BEHAVIOR__BUFFER;
+
+	/**
+	 * The feature id for the '<em><b>Routine</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__ROUTINE = InfrastructurePackage.BEHAVIOR__ROUTINE;
+
+	/**
+	 * The feature id for the '<em><b>Procedure</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__PROCEDURE = InfrastructurePackage.BEHAVIOR__PROCEDURE;
+
+	/**
+	 * The feature id for the '<em><b>Instance</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__INSTANCE = InfrastructurePackage.BEHAVIOR__INSTANCE;
+
+	/**
+	 * The feature id for the '<em><b>Behavior</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__BEHAVIOR = InfrastructurePackage.BEHAVIOR__BEHAVIOR;
+
+	/**
+	 * The feature id for the '<em><b>Main</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__MAIN = InfrastructurePackage.BEHAVIOR__MAIN;
+
+	/**
+	 * The feature id for the '<em><b>Parameter</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__PARAMETER = InfrastructurePackage.BEHAVIOR__PARAMETER;
+
+	/**
+	 * The feature id for the '<em><b>Computation</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__COMPUTATION = InfrastructurePackage.BEHAVIOR__COMPUTATION;
+
+	/**
+	 * The feature id for the '<em><b>Execution</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__EXECUTION = InfrastructurePackage.BEHAVIOR__EXECUTION;
+
+	/**
+	 * The feature id for the '<em><b>Interaction</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__INTERACTION = InfrastructurePackage.BEHAVIOR__INTERACTION;
+
+	/**
+	 * The feature id for the '<em><b>Region</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE__REGION = InfrastructurePackage.BEHAVIOR_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Statemachine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_FEATURE_COUNT = InfrastructurePackage.BEHAVIOR_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Statemachine</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMACHINE_OPERATION_COUNT = InfrastructurePackage.BEHAVIOR_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.RegionImpl <em>Region</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.RegionImpl
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getRegion()
+	 * @generated
+	 */
+	int REGION = 1;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REGION__NAME = CommonPackage.NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REGION__UNRESTRICTED_NAME = CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REGION__QUALIFIED_NAME = CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REGION__VISIBILITY = CommonPackage.NAMED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Vertex</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REGION__VERTEX = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Region</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REGION_FEATURE_COUNT = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Region</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REGION_OPERATION_COUNT = CommonPackage.NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.VertexImpl <em>Vertex</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.VertexImpl
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getVertex()
+	 * @generated
+	 */
+	int VERTEX = 2;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VERTEX__NAME = CommonPackage.NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VERTEX__UNRESTRICTED_NAME = CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VERTEX__QUALIFIED_NAME = CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VERTEX__VISIBILITY = CommonPackage.NAMED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Transition</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VERTEX__TRANSITION = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Moe</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VERTEX__MOE = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Vertex</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VERTEX_FEATURE_COUNT = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Vertex</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VERTEX_OPERATION_COUNT = CommonPackage.NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.PseudostateImpl <em>Pseudostate</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.PseudostateImpl
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getPseudostate()
+	 * @generated
+	 */
+	int PSEUDOSTATE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PSEUDOSTATE__NAME = VERTEX__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PSEUDOSTATE__UNRESTRICTED_NAME = VERTEX__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PSEUDOSTATE__QUALIFIED_NAME = VERTEX__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PSEUDOSTATE__VISIBILITY = VERTEX__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Transition</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PSEUDOSTATE__TRANSITION = VERTEX__TRANSITION;
+
+	/**
+	 * The feature id for the '<em><b>Moe</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PSEUDOSTATE__MOE = VERTEX__MOE;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PSEUDOSTATE__KIND = VERTEX_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Pseudostate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PSEUDOSTATE_FEATURE_COUNT = VERTEX_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Pseudostate</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PSEUDOSTATE_OPERATION_COUNT = VERTEX_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StateImpl <em>State</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StateImpl
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getState()
+	 * @generated
+	 */
+	int STATE = 4;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__NAME = VERTEX__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__UNRESTRICTED_NAME = VERTEX__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__QUALIFIED_NAME = VERTEX__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__VISIBILITY = VERTEX__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Transition</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__TRANSITION = VERTEX__TRANSITION;
+
+	/**
+	 * The feature id for the '<em><b>Moe</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__MOE = VERTEX__MOE;
+
+	/**
+	 * The feature id for the '<em><b>Simple</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__SIMPLE = VERTEX_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Composite</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__COMPOSITE = VERTEX_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Orthogonal</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__ORTHOGONAL = VERTEX_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Region</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE__REGION = VERTEX_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>State</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE_FEATURE_COUNT = VERTEX_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>State</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATE_OPERATION_COUNT = VERTEX_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.FinalStateImpl <em>Final State</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.FinalStateImpl
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getFinalState()
+	 * @generated
+	 */
+	int FINAL_STATE = 5;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__NAME = STATE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__UNRESTRICTED_NAME = STATE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__QUALIFIED_NAME = STATE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__VISIBILITY = STATE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Transition</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__TRANSITION = STATE__TRANSITION;
+
+	/**
+	 * The feature id for the '<em><b>Moe</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__MOE = STATE__MOE;
+
+	/**
+	 * The feature id for the '<em><b>Simple</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__SIMPLE = STATE__SIMPLE;
+
+	/**
+	 * The feature id for the '<em><b>Composite</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__COMPOSITE = STATE__COMPOSITE;
+
+	/**
+	 * The feature id for the '<em><b>Orthogonal</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__ORTHOGONAL = STATE__ORTHOGONAL;
+
+	/**
+	 * The feature id for the '<em><b>Region</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE__REGION = STATE__REGION;
+
+	/**
+	 * The number of structural features of the '<em>Final State</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE_FEATURE_COUNT = STATE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Final State</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FINAL_STATE_OPERATION_COUNT = STATE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StartStateImpl <em>Start State</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StartStateImpl
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getStartState()
+	 * @generated
+	 */
+	int START_STATE = 6;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__NAME = STATE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__UNRESTRICTED_NAME = STATE__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__QUALIFIED_NAME = STATE__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__VISIBILITY = STATE__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Transition</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__TRANSITION = STATE__TRANSITION;
+
+	/**
+	 * The feature id for the '<em><b>Moe</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__MOE = STATE__MOE;
+
+	/**
+	 * The feature id for the '<em><b>Simple</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__SIMPLE = STATE__SIMPLE;
+
+	/**
+	 * The feature id for the '<em><b>Composite</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__COMPOSITE = STATE__COMPOSITE;
+
+	/**
+	 * The feature id for the '<em><b>Orthogonal</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__ORTHOGONAL = STATE__ORTHOGONAL;
+
+	/**
+	 * The feature id for the '<em><b>Region</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE__REGION = STATE__REGION;
+
+	/**
+	 * The number of structural features of the '<em>Start State</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE_FEATURE_COUNT = STATE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Start State</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int START_STATE_OPERATION_COUNT = STATE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl <em>Transition</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getTransition()
+	 * @generated
+	 */
+	int TRANSITION = 7;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__NAME = CommonPackage.NAMED_ELEMENT__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Unrestricted Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__UNRESTRICTED_NAME = CommonPackage.NAMED_ELEMENT__UNRESTRICTED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Qualified Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__QUALIFIED_NAME = CommonPackage.NAMED_ELEMENT__QUALIFIED_NAME;
+
+	/**
+	 * The feature id for the '<em><b>Visibility</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__VISIBILITY = CommonPackage.NAMED_ELEMENT__VISIBILITY;
+
+	/**
+	 * The feature id for the '<em><b>Transient</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__TRANSIENT = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Moe</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__MOE = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Target</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__TARGET = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Behavior</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__BEHAVIOR = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Trigger</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__TRIGGER = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Guard</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__GUARD = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 5;
+
+	/**
+	 * The feature id for the '<em><b>Tguard</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__TGUARD = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 6;
+
+	/**
+	 * The feature id for the '<em><b>Effect</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION__EFFECT = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 7;
+
+	/**
+	 * The number of structural features of the '<em>Transition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION_FEATURE_COUNT = CommonPackage.NAMED_ELEMENT_FEATURE_COUNT + 8;
+
+	/**
+	 * The number of operations of the '<em>Transition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION_OPERATION_COUNT = CommonPackage.NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionMoeImpl <em>Transition Moe</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionMoeImpl
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getTransitionMoe()
+	 * @generated
+	 */
+	int TRANSITION_MOE = 8;
+
+	/**
+	 * The feature id for the '<em><b>Moc</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION_MOE__MOC = 0;
+
+	/**
+	 * The feature id for the '<em><b>Is Else</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION_MOE__IS_ELSE = 1;
+
+	/**
+	 * The feature id for the '<em><b>Prior</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION_MOE__PRIOR = 2;
+
+	/**
+	 * The feature id for the '<em><b>Proba</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION_MOE__PROBA = 3;
+
+	/**
+	 * The number of structural features of the '<em>Transition Moe</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION_MOE_FEATURE_COUNT = 4;
+
+	/**
+	 * The number of operations of the '<em>Transition Moe</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRANSITION_MOE_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind <em>Pseudostate Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getPseudostateKind()
+	 * @generated
+	 */
+	int PSEUDOSTATE_KIND = 9;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc <em>Transition Moc</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getTransitionMoc()
+	 * @generated
+	 */
+	int TRANSITION_MOC = 10;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statemachine.Statemachine <em>Statemachine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statemachine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Statemachine
+	 * @generated
+	 */
+	EClass getStatemachine();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statemachine.Statemachine#getRegion <em>Region</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Region</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Statemachine#getRegion()
+	 * @see #getStatemachine()
+	 * @generated
+	 */
+	EReference getStatemachine_Region();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statemachine.Region <em>Region</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Region</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Region
+	 * @generated
+	 */
+	EClass getRegion();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statemachine.Region#getVertex <em>Vertex</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Vertex</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Region#getVertex()
+	 * @see #getRegion()
+	 * @generated
+	 */
+	EReference getRegion_Vertex();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statemachine.Vertex <em>Vertex</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Vertex</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Vertex
+	 * @generated
+	 */
+	EClass getVertex();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statemachine.Vertex#getTransition <em>Transition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Transition</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Vertex#getTransition()
+	 * @see #getVertex()
+	 * @generated
+	 */
+	EReference getVertex_Transition();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statemachine.Vertex#getMoe <em>Moe</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Moe</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Vertex#getMoe()
+	 * @see #getVertex()
+	 * @generated
+	 */
+	EReference getVertex_Moe();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statemachine.Pseudostate <em>Pseudostate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Pseudostate</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Pseudostate
+	 * @generated
+	 */
+	EClass getPseudostate();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statemachine.Pseudostate#getKind <em>Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Pseudostate#getKind()
+	 * @see #getPseudostate()
+	 * @generated
+	 */
+	EAttribute getPseudostate_Kind();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statemachine.State <em>State</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>State</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.State
+	 * @generated
+	 */
+	EClass getState();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statemachine.State#isSimple <em>Simple</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Simple</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.State#isSimple()
+	 * @see #getState()
+	 * @generated
+	 */
+	EAttribute getState_Simple();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statemachine.State#isComposite <em>Composite</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Composite</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.State#isComposite()
+	 * @see #getState()
+	 * @generated
+	 */
+	EAttribute getState_Composite();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statemachine.State#isOrthogonal <em>Orthogonal</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Orthogonal</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.State#isOrthogonal()
+	 * @see #getState()
+	 * @generated
+	 */
+	EAttribute getState_Orthogonal();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statemachine.State#getRegion <em>Region</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Region</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.State#getRegion()
+	 * @see #getState()
+	 * @generated
+	 */
+	EReference getState_Region();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statemachine.FinalState <em>Final State</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Final State</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.FinalState
+	 * @generated
+	 */
+	EClass getFinalState();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statemachine.StartState <em>Start State</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Start State</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StartState
+	 * @generated
+	 */
+	EClass getStartState();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition <em>Transition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Transition</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition
+	 * @generated
+	 */
+	EClass getTransition();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#isTransient <em>Transient</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Transient</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition#isTransient()
+	 * @see #getTransition()
+	 * @generated
+	 */
+	EAttribute getTransition_Transient();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getMoe <em>Moe</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Moe</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition#getMoe()
+	 * @see #getTransition()
+	 * @generated
+	 */
+	EReference getTransition_Moe();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getTarget <em>Target</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Target</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition#getTarget()
+	 * @see #getTransition()
+	 * @generated
+	 */
+	EReference getTransition_Target();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getBehavior <em>Behavior</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Behavior</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition#getBehavior()
+	 * @see #getTransition()
+	 * @generated
+	 */
+	EReference getTransition_Behavior();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getTrigger <em>Trigger</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Trigger</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition#getTrigger()
+	 * @see #getTransition()
+	 * @generated
+	 */
+	EReference getTransition_Trigger();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getGuard <em>Guard</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Guard</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition#getGuard()
+	 * @see #getTransition()
+	 * @generated
+	 */
+	EReference getTransition_Guard();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getTguard <em>Tguard</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Tguard</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition#getTguard()
+	 * @see #getTransition()
+	 * @generated
+	 */
+	EReference getTransition_Tguard();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getEffect <em>Effect</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Effect</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition#getEffect()
+	 * @see #getTransition()
+	 * @generated
+	 */
+	EReference getTransition_Effect();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe <em>Transition Moe</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Transition Moe</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe
+	 * @generated
+	 */
+	EClass getTransitionMoe();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getMoc <em>Moc</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Moc</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getMoc()
+	 * @see #getTransitionMoe()
+	 * @generated
+	 */
+	EAttribute getTransitionMoe_Moc();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#isIsElse <em>Is Else</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Is Else</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#isIsElse()
+	 * @see #getTransitionMoe()
+	 * @generated
+	 */
+	EAttribute getTransitionMoe_IsElse();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getPrior <em>Prior</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Prior</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getPrior()
+	 * @see #getTransitionMoe()
+	 * @generated
+	 */
+	EAttribute getTransitionMoe_Prior();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getProba <em>Proba</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Proba</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getProba()
+	 * @see #getTransitionMoe()
+	 * @generated
+	 */
+	EAttribute getTransitionMoe_Proba();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind <em>Pseudostate Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Pseudostate Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind
+	 * @generated
+	 */
+	EEnum getPseudostateKind();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc <em>Transition Moc</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Transition Moc</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc
+	 * @generated
+	 */
+	EEnum getTransitionMoc();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	StatemachineFactory getStatemachineFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachineImpl <em>Statemachine</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachineImpl
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getStatemachine()
+		 * @generated
+		 */
+		EClass STATEMACHINE = eINSTANCE.getStatemachine();
+
+		/**
+		 * The meta object literal for the '<em><b>Region</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATEMACHINE__REGION = eINSTANCE.getStatemachine_Region();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.RegionImpl <em>Region</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.RegionImpl
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getRegion()
+		 * @generated
+		 */
+		EClass REGION = eINSTANCE.getRegion();
+
+		/**
+		 * The meta object literal for the '<em><b>Vertex</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference REGION__VERTEX = eINSTANCE.getRegion_Vertex();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.VertexImpl <em>Vertex</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.VertexImpl
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getVertex()
+		 * @generated
+		 */
+		EClass VERTEX = eINSTANCE.getVertex();
+
+		/**
+		 * The meta object literal for the '<em><b>Transition</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VERTEX__TRANSITION = eINSTANCE.getVertex_Transition();
+
+		/**
+		 * The meta object literal for the '<em><b>Moe</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VERTEX__MOE = eINSTANCE.getVertex_Moe();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.PseudostateImpl <em>Pseudostate</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.PseudostateImpl
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getPseudostate()
+		 * @generated
+		 */
+		EClass PSEUDOSTATE = eINSTANCE.getPseudostate();
+
+		/**
+		 * The meta object literal for the '<em><b>Kind</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute PSEUDOSTATE__KIND = eINSTANCE.getPseudostate_Kind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StateImpl <em>State</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StateImpl
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getState()
+		 * @generated
+		 */
+		EClass STATE = eINSTANCE.getState();
+
+		/**
+		 * The meta object literal for the '<em><b>Simple</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATE__SIMPLE = eINSTANCE.getState_Simple();
+
+		/**
+		 * The meta object literal for the '<em><b>Composite</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATE__COMPOSITE = eINSTANCE.getState_Composite();
+
+		/**
+		 * The meta object literal for the '<em><b>Orthogonal</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute STATE__ORTHOGONAL = eINSTANCE.getState_Orthogonal();
+
+		/**
+		 * The meta object literal for the '<em><b>Region</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference STATE__REGION = eINSTANCE.getState_Region();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.FinalStateImpl <em>Final State</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.FinalStateImpl
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getFinalState()
+		 * @generated
+		 */
+		EClass FINAL_STATE = eINSTANCE.getFinalState();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StartStateImpl <em>Start State</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StartStateImpl
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getStartState()
+		 * @generated
+		 */
+		EClass START_STATE = eINSTANCE.getStartState();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl <em>Transition</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getTransition()
+		 * @generated
+		 */
+		EClass TRANSITION = eINSTANCE.getTransition();
+
+		/**
+		 * The meta object literal for the '<em><b>Transient</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TRANSITION__TRANSIENT = eINSTANCE.getTransition_Transient();
+
+		/**
+		 * The meta object literal for the '<em><b>Moe</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TRANSITION__MOE = eINSTANCE.getTransition_Moe();
+
+		/**
+		 * The meta object literal for the '<em><b>Target</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TRANSITION__TARGET = eINSTANCE.getTransition_Target();
+
+		/**
+		 * The meta object literal for the '<em><b>Behavior</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TRANSITION__BEHAVIOR = eINSTANCE.getTransition_Behavior();
+
+		/**
+		 * The meta object literal for the '<em><b>Trigger</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TRANSITION__TRIGGER = eINSTANCE.getTransition_Trigger();
+
+		/**
+		 * The meta object literal for the '<em><b>Guard</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TRANSITION__GUARD = eINSTANCE.getTransition_Guard();
+
+		/**
+		 * The meta object literal for the '<em><b>Tguard</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TRANSITION__TGUARD = eINSTANCE.getTransition_Tguard();
+
+		/**
+		 * The meta object literal for the '<em><b>Effect</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference TRANSITION__EFFECT = eINSTANCE.getTransition_Effect();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionMoeImpl <em>Transition Moe</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionMoeImpl
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getTransitionMoe()
+		 * @generated
+		 */
+		EClass TRANSITION_MOE = eINSTANCE.getTransitionMoe();
+
+		/**
+		 * The meta object literal for the '<em><b>Moc</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TRANSITION_MOE__MOC = eINSTANCE.getTransitionMoe_Moc();
+
+		/**
+		 * The meta object literal for the '<em><b>Is Else</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TRANSITION_MOE__IS_ELSE = eINSTANCE.getTransitionMoe_IsElse();
+
+		/**
+		 * The meta object literal for the '<em><b>Prior</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TRANSITION_MOE__PRIOR = eINSTANCE.getTransitionMoe_Prior();
+
+		/**
+		 * The meta object literal for the '<em><b>Proba</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TRANSITION_MOE__PROBA = eINSTANCE.getTransitionMoe_Proba();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind <em>Pseudostate Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getPseudostateKind()
+		 * @generated
+		 */
+		EEnum PSEUDOSTATE_KIND = eINSTANCE.getPseudostateKind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc <em>Transition Moc</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc
+		 * @see org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl#getTransitionMoc()
+		 * @generated
+		 */
+		EEnum TRANSITION_MOC = eINSTANCE.getTransitionMoc();
+
+	}
+
+} //StatemachinePackage
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Transition.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Transition.java
new file mode 100644
index 0000000..48c2dbb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Transition.java
@@ -0,0 +1,247 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.InputComStatement;
+import org.eclipse.efm.ecore.formalml.statement.Statement;
+import org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Transition</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#isTransient <em>Transient</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getMoe <em>Moe</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getTarget <em>Target</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getBehavior <em>Behavior</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getTrigger <em>Trigger</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getGuard <em>Guard</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getTguard <em>Tguard</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getEffect <em>Effect</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransition()
+ * @model
+ * @generated
+ */
+public interface Transition extends NamedElement {
+	/**
+	 * Returns the value of the '<em><b>Transient</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Transient</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Transient</em>' attribute.
+	 * @see #setTransient(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransition_Transient()
+	 * @model
+	 * @generated
+	 */
+	boolean isTransient();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#isTransient <em>Transient</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Transient</em>' attribute.
+	 * @see #isTransient()
+	 * @generated
+	 */
+	void setTransient(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Moe</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Moe</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Moe</em>' containment reference.
+	 * @see #setMoe(TransitionMoe)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransition_Moe()
+	 * @model containment="true"
+	 * @generated
+	 */
+	TransitionMoe getMoe();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getMoe <em>Moe</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Moe</em>' containment reference.
+	 * @see #getMoe()
+	 * @generated
+	 */
+	void setMoe(TransitionMoe value);
+
+	/**
+	 * Returns the value of the '<em><b>Target</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Target</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Target</em>' reference.
+	 * @see #setTarget(NamedElement)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransition_Target()
+	 * @model
+	 * @generated
+	 */
+	NamedElement getTarget();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getTarget <em>Target</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Target</em>' reference.
+	 * @see #getTarget()
+	 * @generated
+	 */
+	void setTarget(NamedElement value);
+
+	/**
+	 * Returns the value of the '<em><b>Behavior</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Behavior</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Behavior</em>' containment reference.
+	 * @see #setBehavior(BlockStatement)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransition_Behavior()
+	 * @model containment="true"
+	 * @generated
+	 */
+	BlockStatement getBehavior();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getBehavior <em>Behavior</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Behavior</em>' containment reference.
+	 * @see #getBehavior()
+	 * @generated
+	 */
+	void setBehavior(BlockStatement value);
+
+	/**
+	 * Returns the value of the '<em><b>Trigger</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.statement.InputComStatement}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Trigger</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Trigger</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransition_Trigger()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<InputComStatement> getTrigger();
+
+	/**
+	 * Returns the value of the '<em><b>Guard</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Guard</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Guard</em>' containment reference.
+	 * @see #setGuard(AbstractGuardStatement)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransition_Guard()
+	 * @model containment="true"
+	 * @generated
+	 */
+	AbstractGuardStatement getGuard();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getGuard <em>Guard</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Guard</em>' containment reference.
+	 * @see #getGuard()
+	 * @generated
+	 */
+	void setGuard(AbstractGuardStatement value);
+
+	/**
+	 * Returns the value of the '<em><b>Tguard</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Tguard</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Tguard</em>' containment reference.
+	 * @see #setTguard(TimedGuardStatement)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransition_Tguard()
+	 * @model containment="true"
+	 * @generated
+	 */
+	TimedGuardStatement getTguard();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getTguard <em>Tguard</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Tguard</em>' containment reference.
+	 * @see #getTguard()
+	 * @generated
+	 */
+	void setTguard(TimedGuardStatement value);
+
+	/**
+	 * Returns the value of the '<em><b>Effect</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Effect</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Effect</em>' containment reference.
+	 * @see #setEffect(Statement)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransition_Effect()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Statement getEffect();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition#getEffect <em>Effect</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Effect</em>' containment reference.
+	 * @see #getEffect()
+	 * @generated
+	 */
+	void setEffect(Statement value);
+
+} // Transition
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/TransitionMoc.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/TransitionMoc.java
new file mode 100644
index 0000000..30df1cc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/TransitionMoc.java
@@ -0,0 +1,251 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Transition Moc</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransitionMoc()
+ * @model
+ * @generated
+ */
+public enum TransitionMoc implements Enumerator {
+	/**
+	 * The '<em><b>Simple</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SIMPLE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SIMPLE(0, "simple", "simple"),
+
+	/**
+	 * The '<em><b>Abort</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ABORT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ABORT(1, "abort", "abort"),
+
+	/**
+	 * The '<em><b>Final</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FINAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	FINAL(2, "final", "final");
+
+	/**
+	 * The '<em><b>Simple</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Simple</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SIMPLE
+	 * @model name="simple"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SIMPLE_VALUE = 0;
+
+	/**
+	 * The '<em><b>Abort</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Abort</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ABORT
+	 * @model name="abort"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ABORT_VALUE = 1;
+
+	/**
+	 * The '<em><b>Final</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Final</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #FINAL
+	 * @model name="final"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int FINAL_VALUE = 2;
+
+	/**
+	 * An array of all the '<em><b>Transition Moc</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final TransitionMoc[] VALUES_ARRAY =
+		new TransitionMoc[] {
+			SIMPLE,
+			ABORT,
+			FINAL,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Transition Moc</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<TransitionMoc> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Transition Moc</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static TransitionMoc get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			TransitionMoc result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Transition Moc</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static TransitionMoc getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			TransitionMoc result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Transition Moc</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static TransitionMoc get(int value) {
+		switch (value) {
+			case SIMPLE_VALUE: return SIMPLE;
+			case ABORT_VALUE: return ABORT;
+			case FINAL_VALUE: return FINAL;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private TransitionMoc(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //TransitionMoc
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/TransitionMoe.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/TransitionMoe.java
new file mode 100644
index 0000000..5cd168e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/TransitionMoe.java
@@ -0,0 +1,148 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Transition Moe</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getMoc <em>Moc</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#isIsElse <em>Is Else</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getPrior <em>Prior</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getProba <em>Proba</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransitionMoe()
+ * @model
+ * @generated
+ */
+public interface TransitionMoe extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Moc</b></em>' attribute.
+	 * The default value is <code>"simple"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Moc</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Moc</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc
+	 * @see #setMoc(TransitionMoc)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransitionMoe_Moc()
+	 * @model default="simple"
+	 * @generated
+	 */
+	TransitionMoc getMoc();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getMoc <em>Moc</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Moc</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc
+	 * @see #getMoc()
+	 * @generated
+	 */
+	void setMoc(TransitionMoc value);
+
+	/**
+	 * Returns the value of the '<em><b>Is Else</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Is Else</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Is Else</em>' attribute.
+	 * @see #setIsElse(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransitionMoe_IsElse()
+	 * @model default="false"
+	 * @generated
+	 */
+	boolean isIsElse();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#isIsElse <em>Is Else</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Is Else</em>' attribute.
+	 * @see #isIsElse()
+	 * @generated
+	 */
+	void setIsElse(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Prior</b></em>' attribute.
+	 * The default value is <code>"0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Prior</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Prior</em>' attribute.
+	 * @see #setPrior(int)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransitionMoe_Prior()
+	 * @model default="0"
+	 * @generated
+	 */
+	int getPrior();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getPrior <em>Prior</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Prior</em>' attribute.
+	 * @see #getPrior()
+	 * @generated
+	 */
+	void setPrior(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Proba</b></em>' attribute.
+	 * The default value is <code>"1.0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Proba</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Proba</em>' attribute.
+	 * @see #setProba(float)
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getTransitionMoe_Proba()
+	 * @model default="1.0"
+	 * @generated
+	 */
+	float getProba();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe#getProba <em>Proba</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Proba</em>' attribute.
+	 * @see #getProba()
+	 * @generated
+	 */
+	void setProba(float value);
+
+} // TransitionMoe
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Vertex.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Vertex.java
new file mode 100644
index 0000000..f78736e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/Vertex.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Vertex</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Vertex#getTransition <em>Transition</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.Vertex#getMoe <em>Moe</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getVertex()
+ * @model
+ * @generated
+ */
+public interface Vertex extends NamedElement {
+	/**
+	 * Returns the value of the '<em><b>Transition</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.statemachine.Transition}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Transition</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Transition</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getVertex_Transition()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Transition> getTransition();
+
+	/**
+	 * Returns the value of the '<em><b>Moe</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Routine}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Moe</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Moe</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#getVertex_Moe()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Routine> getMoe();
+
+} // Vertex
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/FinalStateImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/FinalStateImpl.java
new file mode 100644
index 0000000..3bb3049
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/FinalStateImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.FinalState;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Final State</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class FinalStateImpl extends StateImpl implements FinalState {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FinalStateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachinePackage.Literals.FINAL_STATE;
+	}
+
+} //FinalStateImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/PseudostateImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/PseudostateImpl.java
new file mode 100644
index 0000000..60d0d34
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/PseudostateImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Pseudostate;
+import org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Pseudostate</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.PseudostateImpl#getKind <em>Kind</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class PseudostateImpl extends VertexImpl implements Pseudostate {
+	/**
+	 * The default value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final PseudostateKind KIND_EDEFAULT = PseudostateKind.INITIAL;
+
+	/**
+	 * The cached value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected PseudostateKind kind = KIND_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PseudostateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachinePackage.Literals.PSEUDOSTATE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PseudostateKind getKind() {
+		return kind;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKind(PseudostateKind newKind) {
+		PseudostateKind oldKind = kind;
+		kind = newKind == null ? KIND_EDEFAULT : newKind;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.PSEUDOSTATE__KIND, oldKind, kind));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachinePackage.PSEUDOSTATE__KIND:
+				return getKind();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachinePackage.PSEUDOSTATE__KIND:
+				setKind((PseudostateKind)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.PSEUDOSTATE__KIND:
+				setKind(KIND_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.PSEUDOSTATE__KIND:
+				return kind != KIND_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (kind: ");
+		result.append(kind);
+		result.append(')');
+		return result.toString();
+	}
+
+} //PseudostateImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/RegionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/RegionImpl.java
new file mode 100644
index 0000000..789d697
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/RegionImpl.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Region;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+import org.eclipse.efm.ecore.formalml.statemachine.Vertex;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Region</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.RegionImpl#getVertex <em>Vertex</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class RegionImpl extends NamedElementImpl implements Region {
+	/**
+	 * The cached value of the '{@link #getVertex() <em>Vertex</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getVertex()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Vertex> vertex;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RegionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachinePackage.Literals.REGION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Vertex> getVertex() {
+		if (vertex == null) {
+			vertex = new EObjectContainmentEList<Vertex>(Vertex.class, this, StatemachinePackage.REGION__VERTEX);
+		}
+		return vertex;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachinePackage.REGION__VERTEX:
+				return ((InternalEList<?>)getVertex()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachinePackage.REGION__VERTEX:
+				return getVertex();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachinePackage.REGION__VERTEX:
+				getVertex().clear();
+				getVertex().addAll((Collection<? extends Vertex>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.REGION__VERTEX:
+				getVertex().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.REGION__VERTEX:
+				return vertex != null && !vertex.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //RegionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StartStateImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StartStateImpl.java
new file mode 100644
index 0000000..89cdb40
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StartStateImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StartState;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Start State</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class StartStateImpl extends StateImpl implements StartState {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StartStateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachinePackage.Literals.START_STATE;
+	}
+
+} //StartStateImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StateImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StateImpl.java
new file mode 100644
index 0000000..c115443
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StateImpl.java
@@ -0,0 +1,338 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import java.util.Collection;
+import org.eclipse.efm.ecore.formalml.statemachine.Region;
+import org.eclipse.efm.ecore.formalml.statemachine.State;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>State</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StateImpl#isSimple <em>Simple</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StateImpl#isComposite <em>Composite</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StateImpl#isOrthogonal <em>Orthogonal</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StateImpl#getRegion <em>Region</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class StateImpl extends VertexImpl implements State {
+	/**
+	 * The default value of the '{@link #isSimple() <em>Simple</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSimple()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean SIMPLE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isSimple() <em>Simple</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isSimple()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean simple = SIMPLE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isComposite() <em>Composite</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isComposite()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean COMPOSITE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isComposite() <em>Composite</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isComposite()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean composite = COMPOSITE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isOrthogonal() <em>Orthogonal</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isOrthogonal()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean ORTHOGONAL_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isOrthogonal() <em>Orthogonal</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isOrthogonal()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean orthogonal = ORTHOGONAL_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getRegion() <em>Region</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRegion()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Region> region;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StateImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachinePackage.Literals.STATE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isSimple() {
+		return simple;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSimple(boolean newSimple) {
+		boolean oldSimple = simple;
+		simple = newSimple;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.STATE__SIMPLE, oldSimple, simple));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isComposite() {
+		return composite;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setComposite(boolean newComposite) {
+		boolean oldComposite = composite;
+		composite = newComposite;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.STATE__COMPOSITE, oldComposite, composite));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isOrthogonal() {
+		return orthogonal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOrthogonal(boolean newOrthogonal) {
+		boolean oldOrthogonal = orthogonal;
+		orthogonal = newOrthogonal;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.STATE__ORTHOGONAL, oldOrthogonal, orthogonal));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Region> getRegion() {
+		if (region == null) {
+			region = new EObjectContainmentEList<Region>(Region.class, this, StatemachinePackage.STATE__REGION);
+		}
+		return region;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachinePackage.STATE__REGION:
+				return ((InternalEList<?>)getRegion()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachinePackage.STATE__SIMPLE:
+				return isSimple();
+			case StatemachinePackage.STATE__COMPOSITE:
+				return isComposite();
+			case StatemachinePackage.STATE__ORTHOGONAL:
+				return isOrthogonal();
+			case StatemachinePackage.STATE__REGION:
+				return getRegion();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachinePackage.STATE__SIMPLE:
+				setSimple((Boolean)newValue);
+				return;
+			case StatemachinePackage.STATE__COMPOSITE:
+				setComposite((Boolean)newValue);
+				return;
+			case StatemachinePackage.STATE__ORTHOGONAL:
+				setOrthogonal((Boolean)newValue);
+				return;
+			case StatemachinePackage.STATE__REGION:
+				getRegion().clear();
+				getRegion().addAll((Collection<? extends Region>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.STATE__SIMPLE:
+				setSimple(SIMPLE_EDEFAULT);
+				return;
+			case StatemachinePackage.STATE__COMPOSITE:
+				setComposite(COMPOSITE_EDEFAULT);
+				return;
+			case StatemachinePackage.STATE__ORTHOGONAL:
+				setOrthogonal(ORTHOGONAL_EDEFAULT);
+				return;
+			case StatemachinePackage.STATE__REGION:
+				getRegion().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.STATE__SIMPLE:
+				return simple != SIMPLE_EDEFAULT;
+			case StatemachinePackage.STATE__COMPOSITE:
+				return composite != COMPOSITE_EDEFAULT;
+			case StatemachinePackage.STATE__ORTHOGONAL:
+				return orthogonal != ORTHOGONAL_EDEFAULT;
+			case StatemachinePackage.STATE__REGION:
+				return region != null && !region.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (simple: ");
+		result.append(simple);
+		result.append(", composite: ");
+		result.append(composite);
+		result.append(", orthogonal: ");
+		result.append(orthogonal);
+		result.append(')');
+		return result.toString();
+	}
+
+} //StateImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StatemachineFactoryImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StatemachineFactoryImpl.java
new file mode 100644
index 0000000..db0edfb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StatemachineFactoryImpl.java
@@ -0,0 +1,268 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StatemachineFactoryImpl extends EFactoryImpl implements StatemachineFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatemachineFactory init() {
+		try {
+			StatemachineFactory theStatemachineFactory = (StatemachineFactory)EPackage.Registry.INSTANCE.getEFactory(StatemachinePackage.eNS_URI);
+			if (theStatemachineFactory != null) {
+				return theStatemachineFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new StatemachineFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case StatemachinePackage.STATEMACHINE: return createStatemachine();
+			case StatemachinePackage.REGION: return createRegion();
+			case StatemachinePackage.VERTEX: return createVertex();
+			case StatemachinePackage.PSEUDOSTATE: return createPseudostate();
+			case StatemachinePackage.STATE: return createState();
+			case StatemachinePackage.FINAL_STATE: return createFinalState();
+			case StatemachinePackage.START_STATE: return createStartState();
+			case StatemachinePackage.TRANSITION: return createTransition();
+			case StatemachinePackage.TRANSITION_MOE: return createTransitionMoe();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case StatemachinePackage.PSEUDOSTATE_KIND:
+				return createPseudostateKindFromString(eDataType, initialValue);
+			case StatemachinePackage.TRANSITION_MOC:
+				return createTransitionMocFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case StatemachinePackage.PSEUDOSTATE_KIND:
+				return convertPseudostateKindToString(eDataType, instanceValue);
+			case StatemachinePackage.TRANSITION_MOC:
+				return convertTransitionMocToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Statemachine createStatemachine() {
+		StatemachineImpl statemachine = new StatemachineImpl();
+		return statemachine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Region createRegion() {
+		RegionImpl region = new RegionImpl();
+		return region;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Vertex createVertex() {
+		VertexImpl vertex = new VertexImpl();
+		return vertex;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Pseudostate createPseudostate() {
+		PseudostateImpl pseudostate = new PseudostateImpl();
+		return pseudostate;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public State createState() {
+		StateImpl state = new StateImpl();
+		return state;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FinalState createFinalState() {
+		FinalStateImpl finalState = new FinalStateImpl();
+		return finalState;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StartState createStartState() {
+		StartStateImpl startState = new StartStateImpl();
+		return startState;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Transition createTransition() {
+		TransitionImpl transition = new TransitionImpl();
+		return transition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TransitionMoe createTransitionMoe() {
+		TransitionMoeImpl transitionMoe = new TransitionMoeImpl();
+		return transitionMoe;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PseudostateKind createPseudostateKindFromString(EDataType eDataType, String initialValue) {
+		PseudostateKind result = PseudostateKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertPseudostateKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TransitionMoc createTransitionMocFromString(EDataType eDataType, String initialValue) {
+		TransitionMoc result = TransitionMoc.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertTransitionMocToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachinePackage getStatemachinePackage() {
+		return (StatemachinePackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static StatemachinePackage getPackage() {
+		return StatemachinePackage.eINSTANCE;
+	}
+
+} //StatemachineFactoryImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StatemachineImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StatemachineImpl.java
new file mode 100644
index 0000000..749eb08
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StatemachineImpl.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.impl.BehaviorImpl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Region;
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statemachine</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachineImpl#getRegion <em>Region</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class StatemachineImpl extends BehaviorImpl implements Statemachine {
+	/**
+	 * The cached value of the '{@link #getRegion() <em>Region</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRegion()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Region> region;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachinePackage.Literals.STATEMACHINE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Region> getRegion() {
+		if (region == null) {
+			region = new EObjectContainmentEList<Region>(Region.class, this, StatemachinePackage.STATEMACHINE__REGION);
+		}
+		return region;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachinePackage.STATEMACHINE__REGION:
+				return ((InternalEList<?>)getRegion()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachinePackage.STATEMACHINE__REGION:
+				return getRegion();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachinePackage.STATEMACHINE__REGION:
+				getRegion().clear();
+				getRegion().addAll((Collection<? extends Region>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.STATEMACHINE__REGION:
+				getRegion().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.STATEMACHINE__REGION:
+				return region != null && !region.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //StatemachineImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StatemachinePackageImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StatemachinePackageImpl.java
new file mode 100644
index 0000000..ae8e6e4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/StatemachinePackageImpl.java
@@ -0,0 +1,688 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.FinalState;
+import org.eclipse.efm.ecore.formalml.statemachine.Pseudostate;
+import org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind;
+import org.eclipse.efm.ecore.formalml.statemachine.Region;
+import org.eclipse.efm.ecore.formalml.statemachine.StartState;
+import org.eclipse.efm.ecore.formalml.statemachine.State;
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachineFactory;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+import org.eclipse.efm.ecore.formalml.statemachine.Transition;
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc;
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe;
+import org.eclipse.efm.ecore.formalml.statemachine.Vertex;
+
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StatemachinePackageImpl extends EPackageImpl implements StatemachinePackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statemachineEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass regionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass vertexEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass pseudostateEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass stateEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass finalStateEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass startStateEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass transitionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass transitionMoeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum pseudostateKindEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum transitionMocEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private StatemachinePackageImpl() {
+		super(eNS_URI, StatemachineFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link StatemachinePackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static StatemachinePackage init() {
+		if (isInited) return (StatemachinePackage)EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI);
+
+		// Obtain or create and register package
+		StatemachinePackageImpl theStatemachinePackage = (StatemachinePackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof StatemachinePackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new StatemachinePackageImpl());
+
+		isInited = true;
+
+		// Obtain or create and register interdependencies
+		FormalmlPackageImpl theFormalmlPackage = (FormalmlPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) instanceof FormalmlPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) : FormalmlPackage.eINSTANCE);
+		CommonPackageImpl theCommonPackage = (CommonPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) instanceof CommonPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) : CommonPackage.eINSTANCE);
+		InfrastructurePackageImpl theInfrastructurePackage = (InfrastructurePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) instanceof InfrastructurePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) : InfrastructurePackage.eINSTANCE);
+		DatatypePackageImpl theDatatypePackage = (DatatypePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) instanceof DatatypePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) : DatatypePackage.eINSTANCE);
+		ExpressionPackageImpl theExpressionPackage = (ExpressionPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) instanceof ExpressionPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) : ExpressionPackage.eINSTANCE);
+		StatementPackageImpl theStatementPackage = (StatementPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) instanceof StatementPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI) : StatementPackage.eINSTANCE);
+
+		// Create package meta-data objects
+		theStatemachinePackage.createPackageContents();
+		theFormalmlPackage.createPackageContents();
+		theCommonPackage.createPackageContents();
+		theInfrastructurePackage.createPackageContents();
+		theDatatypePackage.createPackageContents();
+		theExpressionPackage.createPackageContents();
+		theStatementPackage.createPackageContents();
+
+		// Initialize created meta-data
+		theStatemachinePackage.initializePackageContents();
+		theFormalmlPackage.initializePackageContents();
+		theCommonPackage.initializePackageContents();
+		theInfrastructurePackage.initializePackageContents();
+		theDatatypePackage.initializePackageContents();
+		theExpressionPackage.initializePackageContents();
+		theStatementPackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theStatemachinePackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(StatemachinePackage.eNS_URI, theStatemachinePackage);
+		return theStatemachinePackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatemachine() {
+		return statemachineEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getStatemachine_Region() {
+		return (EReference)statemachineEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getRegion() {
+		return regionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getRegion_Vertex() {
+		return (EReference)regionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getVertex() {
+		return vertexEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVertex_Transition() {
+		return (EReference)vertexEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVertex_Moe() {
+		return (EReference)vertexEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPseudostate() {
+		return pseudostateEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getPseudostate_Kind() {
+		return (EAttribute)pseudostateEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getState() {
+		return stateEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getState_Simple() {
+		return (EAttribute)stateEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getState_Composite() {
+		return (EAttribute)stateEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getState_Orthogonal() {
+		return (EAttribute)stateEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getState_Region() {
+		return (EReference)stateEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getFinalState() {
+		return finalStateEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStartState() {
+		return startStateEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getTransition() {
+		return transitionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getTransition_Transient() {
+		return (EAttribute)transitionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTransition_Moe() {
+		return (EReference)transitionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTransition_Target() {
+		return (EReference)transitionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTransition_Behavior() {
+		return (EReference)transitionEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTransition_Trigger() {
+		return (EReference)transitionEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTransition_Guard() {
+		return (EReference)transitionEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTransition_Tguard() {
+		return (EReference)transitionEClass.getEStructuralFeatures().get(6);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getTransition_Effect() {
+		return (EReference)transitionEClass.getEStructuralFeatures().get(7);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getTransitionMoe() {
+		return transitionMoeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getTransitionMoe_Moc() {
+		return (EAttribute)transitionMoeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getTransitionMoe_IsElse() {
+		return (EAttribute)transitionMoeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getTransitionMoe_Prior() {
+		return (EAttribute)transitionMoeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getTransitionMoe_Proba() {
+		return (EAttribute)transitionMoeEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getPseudostateKind() {
+		return pseudostateKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getTransitionMoc() {
+		return transitionMocEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineFactory getStatemachineFactory() {
+		return (StatemachineFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		statemachineEClass = createEClass(STATEMACHINE);
+		createEReference(statemachineEClass, STATEMACHINE__REGION);
+
+		regionEClass = createEClass(REGION);
+		createEReference(regionEClass, REGION__VERTEX);
+
+		vertexEClass = createEClass(VERTEX);
+		createEReference(vertexEClass, VERTEX__TRANSITION);
+		createEReference(vertexEClass, VERTEX__MOE);
+
+		pseudostateEClass = createEClass(PSEUDOSTATE);
+		createEAttribute(pseudostateEClass, PSEUDOSTATE__KIND);
+
+		stateEClass = createEClass(STATE);
+		createEAttribute(stateEClass, STATE__SIMPLE);
+		createEAttribute(stateEClass, STATE__COMPOSITE);
+		createEAttribute(stateEClass, STATE__ORTHOGONAL);
+		createEReference(stateEClass, STATE__REGION);
+
+		finalStateEClass = createEClass(FINAL_STATE);
+
+		startStateEClass = createEClass(START_STATE);
+
+		transitionEClass = createEClass(TRANSITION);
+		createEAttribute(transitionEClass, TRANSITION__TRANSIENT);
+		createEReference(transitionEClass, TRANSITION__MOE);
+		createEReference(transitionEClass, TRANSITION__TARGET);
+		createEReference(transitionEClass, TRANSITION__BEHAVIOR);
+		createEReference(transitionEClass, TRANSITION__TRIGGER);
+		createEReference(transitionEClass, TRANSITION__GUARD);
+		createEReference(transitionEClass, TRANSITION__TGUARD);
+		createEReference(transitionEClass, TRANSITION__EFFECT);
+
+		transitionMoeEClass = createEClass(TRANSITION_MOE);
+		createEAttribute(transitionMoeEClass, TRANSITION_MOE__MOC);
+		createEAttribute(transitionMoeEClass, TRANSITION_MOE__IS_ELSE);
+		createEAttribute(transitionMoeEClass, TRANSITION_MOE__PRIOR);
+		createEAttribute(transitionMoeEClass, TRANSITION_MOE__PROBA);
+
+		// Create enums
+		pseudostateKindEEnum = createEEnum(PSEUDOSTATE_KIND);
+		transitionMocEEnum = createEEnum(TRANSITION_MOC);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		InfrastructurePackage theInfrastructurePackage = (InfrastructurePackage)EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI);
+		CommonPackage theCommonPackage = (CommonPackage)EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI);
+		StatementPackage theStatementPackage = (StatementPackage)EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		statemachineEClass.getESuperTypes().add(theInfrastructurePackage.getBehavior());
+		regionEClass.getESuperTypes().add(theCommonPackage.getNamedElement());
+		vertexEClass.getESuperTypes().add(theCommonPackage.getNamedElement());
+		pseudostateEClass.getESuperTypes().add(this.getVertex());
+		stateEClass.getESuperTypes().add(this.getVertex());
+		finalStateEClass.getESuperTypes().add(this.getState());
+		startStateEClass.getESuperTypes().add(this.getState());
+		transitionEClass.getESuperTypes().add(theCommonPackage.getNamedElement());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(statemachineEClass, Statemachine.class, "Statemachine", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getStatemachine_Region(), this.getRegion(), null, "region", null, 0, -1, Statemachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(regionEClass, Region.class, "Region", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getRegion_Vertex(), this.getVertex(), null, "vertex", null, 0, -1, Region.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(vertexEClass, Vertex.class, "Vertex", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getVertex_Transition(), this.getTransition(), null, "transition", null, 0, -1, Vertex.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVertex_Moe(), theInfrastructurePackage.getRoutine(), null, "moe", null, 0, -1, Vertex.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(pseudostateEClass, Pseudostate.class, "Pseudostate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getPseudostate_Kind(), this.getPseudostateKind(), "kind", null, 0, 1, Pseudostate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(stateEClass, State.class, "State", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getState_Simple(), ecorePackage.getEBoolean(), "simple", "false", 1, 1, State.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getState_Composite(), ecorePackage.getEBoolean(), "composite", "false", 1, 1, State.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getState_Orthogonal(), ecorePackage.getEBoolean(), "orthogonal", "false", 1, 1, State.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getState_Region(), this.getRegion(), null, "region", null, 0, -1, State.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(finalStateEClass, FinalState.class, "FinalState", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(startStateEClass, StartState.class, "StartState", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(transitionEClass, Transition.class, "Transition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getTransition_Transient(), ecorePackage.getEBoolean(), "transient", null, 0, 1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getTransition_Moe(), this.getTransitionMoe(), null, "moe", null, 0, 1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getTransition_Target(), theCommonPackage.getNamedElement(), null, "target", null, 0, 1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getTransition_Behavior(), theStatementPackage.getBlockStatement(), null, "behavior", null, 0, 1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getTransition_Trigger(), theStatementPackage.getInputComStatement(), null, "trigger", null, 0, -1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getTransition_Guard(), theStatementPackage.getAbstractGuardStatement(), null, "guard", null, 0, 1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getTransition_Tguard(), theStatementPackage.getTimedGuardStatement(), null, "tguard", null, 0, 1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getTransition_Effect(), theStatementPackage.getStatement(), null, "effect", null, 0, 1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(transitionMoeEClass, TransitionMoe.class, "TransitionMoe", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getTransitionMoe_Moc(), this.getTransitionMoc(), "moc", "simple", 0, 1, TransitionMoe.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getTransitionMoe_IsElse(), ecorePackage.getEBoolean(), "isElse", "false", 0, 1, TransitionMoe.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getTransitionMoe_Prior(), ecorePackage.getEInt(), "prior", "0", 0, 1, TransitionMoe.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getTransitionMoe_Proba(), ecorePackage.getEFloat(), "proba", "1.0", 0, 1, TransitionMoe.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Initialize enums and add enum literals
+		initEEnum(pseudostateKindEEnum, PseudostateKind.class, "PseudostateKind");
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.INITIAL);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.DEEP_HISTORY);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.SHALLOW_HISTORY);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.JOIN);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.FORK);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.JUNCTION);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.CHOICE);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.ENTRY_POINT);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.EXIT_POINT);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.TERMINATE);
+		addEEnumLiteral(pseudostateKindEEnum, PseudostateKind.RETURN);
+
+		initEEnum(transitionMocEEnum, TransitionMoc.class, "TransitionMoc");
+		addEEnumLiteral(transitionMocEEnum, TransitionMoc.SIMPLE);
+		addEEnumLiteral(transitionMocEEnum, TransitionMoc.ABORT);
+		addEEnumLiteral(transitionMocEEnum, TransitionMoc.FINAL);
+	}
+
+} //StatemachinePackageImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/TransitionImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/TransitionImpl.java
new file mode 100644
index 0000000..09c42ff
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/TransitionImpl.java
@@ -0,0 +1,631 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+import org.eclipse.efm.ecore.formalml.statemachine.Transition;
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe;
+
+import org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.InputComStatement;
+import org.eclipse.efm.ecore.formalml.statement.Statement;
+import org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Transition</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl#isTransient <em>Transient</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl#getMoe <em>Moe</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl#getTarget <em>Target</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl#getBehavior <em>Behavior</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl#getTrigger <em>Trigger</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl#getGuard <em>Guard</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl#getTguard <em>Tguard</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionImpl#getEffect <em>Effect</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TransitionImpl extends NamedElementImpl implements Transition {
+	/**
+	 * The default value of the '{@link #isTransient() <em>Transient</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTransient()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean TRANSIENT_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isTransient() <em>Transient</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTransient()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean transient_ = TRANSIENT_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getMoe() <em>Moe</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMoe()
+	 * @generated
+	 * @ordered
+	 */
+	protected TransitionMoe moe;
+
+	/**
+	 * The cached value of the '{@link #getTarget() <em>Target</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTarget()
+	 * @generated
+	 * @ordered
+	 */
+	protected NamedElement target;
+
+	/**
+	 * The cached value of the '{@link #getBehavior() <em>Behavior</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBehavior()
+	 * @generated
+	 * @ordered
+	 */
+	protected BlockStatement behavior;
+
+	/**
+	 * The cached value of the '{@link #getTrigger() <em>Trigger</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTrigger()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<InputComStatement> trigger;
+
+	/**
+	 * The cached value of the '{@link #getGuard() <em>Guard</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getGuard()
+	 * @generated
+	 * @ordered
+	 */
+	protected AbstractGuardStatement guard;
+
+	/**
+	 * The cached value of the '{@link #getTguard() <em>Tguard</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTguard()
+	 * @generated
+	 * @ordered
+	 */
+	protected TimedGuardStatement tguard;
+
+	/**
+	 * The cached value of the '{@link #getEffect() <em>Effect</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEffect()
+	 * @generated
+	 * @ordered
+	 */
+	protected Statement effect;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TransitionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachinePackage.Literals.TRANSITION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isTransient() {
+		return transient_;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTransient(boolean newTransient) {
+		boolean oldTransient = transient_;
+		transient_ = newTransient;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__TRANSIENT, oldTransient, transient_));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TransitionMoe getMoe() {
+		return moe;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMoe(TransitionMoe newMoe, NotificationChain msgs) {
+		TransitionMoe oldMoe = moe;
+		moe = newMoe;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__MOE, oldMoe, newMoe);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMoe(TransitionMoe newMoe) {
+		if (newMoe != moe) {
+			NotificationChain msgs = null;
+			if (moe != null)
+				msgs = ((InternalEObject)moe).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__MOE, null, msgs);
+			if (newMoe != null)
+				msgs = ((InternalEObject)newMoe).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__MOE, null, msgs);
+			msgs = basicSetMoe(newMoe, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__MOE, newMoe, newMoe));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement getTarget() {
+		if (target != null && target.eIsProxy()) {
+			InternalEObject oldTarget = (InternalEObject)target;
+			target = (NamedElement)eResolveProxy(oldTarget);
+			if (target != oldTarget) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatemachinePackage.TRANSITION__TARGET, oldTarget, target));
+			}
+		}
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement basicGetTarget() {
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTarget(NamedElement newTarget) {
+		NamedElement oldTarget = target;
+		target = newTarget;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__TARGET, oldTarget, target));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BlockStatement getBehavior() {
+		return behavior;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetBehavior(BlockStatement newBehavior, NotificationChain msgs) {
+		BlockStatement oldBehavior = behavior;
+		behavior = newBehavior;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__BEHAVIOR, oldBehavior, newBehavior);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBehavior(BlockStatement newBehavior) {
+		if (newBehavior != behavior) {
+			NotificationChain msgs = null;
+			if (behavior != null)
+				msgs = ((InternalEObject)behavior).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__BEHAVIOR, null, msgs);
+			if (newBehavior != null)
+				msgs = ((InternalEObject)newBehavior).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__BEHAVIOR, null, msgs);
+			msgs = basicSetBehavior(newBehavior, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__BEHAVIOR, newBehavior, newBehavior));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<InputComStatement> getTrigger() {
+		if (trigger == null) {
+			trigger = new EObjectContainmentEList<InputComStatement>(InputComStatement.class, this, StatemachinePackage.TRANSITION__TRIGGER);
+		}
+		return trigger;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AbstractGuardStatement getGuard() {
+		return guard;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetGuard(AbstractGuardStatement newGuard, NotificationChain msgs) {
+		AbstractGuardStatement oldGuard = guard;
+		guard = newGuard;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__GUARD, oldGuard, newGuard);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setGuard(AbstractGuardStatement newGuard) {
+		if (newGuard != guard) {
+			NotificationChain msgs = null;
+			if (guard != null)
+				msgs = ((InternalEObject)guard).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__GUARD, null, msgs);
+			if (newGuard != null)
+				msgs = ((InternalEObject)newGuard).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__GUARD, null, msgs);
+			msgs = basicSetGuard(newGuard, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__GUARD, newGuard, newGuard));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TimedGuardStatement getTguard() {
+		return tguard;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetTguard(TimedGuardStatement newTguard, NotificationChain msgs) {
+		TimedGuardStatement oldTguard = tguard;
+		tguard = newTguard;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__TGUARD, oldTguard, newTguard);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTguard(TimedGuardStatement newTguard) {
+		if (newTguard != tguard) {
+			NotificationChain msgs = null;
+			if (tguard != null)
+				msgs = ((InternalEObject)tguard).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__TGUARD, null, msgs);
+			if (newTguard != null)
+				msgs = ((InternalEObject)newTguard).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__TGUARD, null, msgs);
+			msgs = basicSetTguard(newTguard, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__TGUARD, newTguard, newTguard));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Statement getEffect() {
+		return effect;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetEffect(Statement newEffect, NotificationChain msgs) {
+		Statement oldEffect = effect;
+		effect = newEffect;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__EFFECT, oldEffect, newEffect);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEffect(Statement newEffect) {
+		if (newEffect != effect) {
+			NotificationChain msgs = null;
+			if (effect != null)
+				msgs = ((InternalEObject)effect).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__EFFECT, null, msgs);
+			if (newEffect != null)
+				msgs = ((InternalEObject)newEffect).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatemachinePackage.TRANSITION__EFFECT, null, msgs);
+			msgs = basicSetEffect(newEffect, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION__EFFECT, newEffect, newEffect));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachinePackage.TRANSITION__MOE:
+				return basicSetMoe(null, msgs);
+			case StatemachinePackage.TRANSITION__BEHAVIOR:
+				return basicSetBehavior(null, msgs);
+			case StatemachinePackage.TRANSITION__TRIGGER:
+				return ((InternalEList<?>)getTrigger()).basicRemove(otherEnd, msgs);
+			case StatemachinePackage.TRANSITION__GUARD:
+				return basicSetGuard(null, msgs);
+			case StatemachinePackage.TRANSITION__TGUARD:
+				return basicSetTguard(null, msgs);
+			case StatemachinePackage.TRANSITION__EFFECT:
+				return basicSetEffect(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachinePackage.TRANSITION__TRANSIENT:
+				return isTransient();
+			case StatemachinePackage.TRANSITION__MOE:
+				return getMoe();
+			case StatemachinePackage.TRANSITION__TARGET:
+				if (resolve) return getTarget();
+				return basicGetTarget();
+			case StatemachinePackage.TRANSITION__BEHAVIOR:
+				return getBehavior();
+			case StatemachinePackage.TRANSITION__TRIGGER:
+				return getTrigger();
+			case StatemachinePackage.TRANSITION__GUARD:
+				return getGuard();
+			case StatemachinePackage.TRANSITION__TGUARD:
+				return getTguard();
+			case StatemachinePackage.TRANSITION__EFFECT:
+				return getEffect();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachinePackage.TRANSITION__TRANSIENT:
+				setTransient((Boolean)newValue);
+				return;
+			case StatemachinePackage.TRANSITION__MOE:
+				setMoe((TransitionMoe)newValue);
+				return;
+			case StatemachinePackage.TRANSITION__TARGET:
+				setTarget((NamedElement)newValue);
+				return;
+			case StatemachinePackage.TRANSITION__BEHAVIOR:
+				setBehavior((BlockStatement)newValue);
+				return;
+			case StatemachinePackage.TRANSITION__TRIGGER:
+				getTrigger().clear();
+				getTrigger().addAll((Collection<? extends InputComStatement>)newValue);
+				return;
+			case StatemachinePackage.TRANSITION__GUARD:
+				setGuard((AbstractGuardStatement)newValue);
+				return;
+			case StatemachinePackage.TRANSITION__TGUARD:
+				setTguard((TimedGuardStatement)newValue);
+				return;
+			case StatemachinePackage.TRANSITION__EFFECT:
+				setEffect((Statement)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.TRANSITION__TRANSIENT:
+				setTransient(TRANSIENT_EDEFAULT);
+				return;
+			case StatemachinePackage.TRANSITION__MOE:
+				setMoe((TransitionMoe)null);
+				return;
+			case StatemachinePackage.TRANSITION__TARGET:
+				setTarget((NamedElement)null);
+				return;
+			case StatemachinePackage.TRANSITION__BEHAVIOR:
+				setBehavior((BlockStatement)null);
+				return;
+			case StatemachinePackage.TRANSITION__TRIGGER:
+				getTrigger().clear();
+				return;
+			case StatemachinePackage.TRANSITION__GUARD:
+				setGuard((AbstractGuardStatement)null);
+				return;
+			case StatemachinePackage.TRANSITION__TGUARD:
+				setTguard((TimedGuardStatement)null);
+				return;
+			case StatemachinePackage.TRANSITION__EFFECT:
+				setEffect((Statement)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.TRANSITION__TRANSIENT:
+				return transient_ != TRANSIENT_EDEFAULT;
+			case StatemachinePackage.TRANSITION__MOE:
+				return moe != null;
+			case StatemachinePackage.TRANSITION__TARGET:
+				return target != null;
+			case StatemachinePackage.TRANSITION__BEHAVIOR:
+				return behavior != null;
+			case StatemachinePackage.TRANSITION__TRIGGER:
+				return trigger != null && !trigger.isEmpty();
+			case StatemachinePackage.TRANSITION__GUARD:
+				return guard != null;
+			case StatemachinePackage.TRANSITION__TGUARD:
+				return tguard != null;
+			case StatemachinePackage.TRANSITION__EFFECT:
+				return effect != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (transient: ");
+		result.append(transient_);
+		result.append(')');
+		return result.toString();
+	}
+
+} //TransitionImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/TransitionMoeImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/TransitionMoeImpl.java
new file mode 100644
index 0000000..4c57909
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/TransitionMoeImpl.java
@@ -0,0 +1,336 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc;
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Transition Moe</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionMoeImpl#getMoc <em>Moc</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionMoeImpl#isIsElse <em>Is Else</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionMoeImpl#getPrior <em>Prior</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.TransitionMoeImpl#getProba <em>Proba</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TransitionMoeImpl extends MinimalEObjectImpl.Container implements TransitionMoe {
+	/**
+	 * The default value of the '{@link #getMoc() <em>Moc</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMoc()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final TransitionMoc MOC_EDEFAULT = TransitionMoc.SIMPLE;
+
+	/**
+	 * The cached value of the '{@link #getMoc() <em>Moc</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMoc()
+	 * @generated
+	 * @ordered
+	 */
+	protected TransitionMoc moc = MOC_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isIsElse() <em>Is Else</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isIsElse()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean IS_ELSE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isIsElse() <em>Is Else</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isIsElse()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean isElse = IS_ELSE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getPrior() <em>Prior</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPrior()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int PRIOR_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getPrior() <em>Prior</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPrior()
+	 * @generated
+	 * @ordered
+	 */
+	protected int prior = PRIOR_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getProba() <em>Proba</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProba()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final float PROBA_EDEFAULT = 1.0F;
+
+	/**
+	 * The cached value of the '{@link #getProba() <em>Proba</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProba()
+	 * @generated
+	 * @ordered
+	 */
+	protected float proba = PROBA_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TransitionMoeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachinePackage.Literals.TRANSITION_MOE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TransitionMoc getMoc() {
+		return moc;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMoc(TransitionMoc newMoc) {
+		TransitionMoc oldMoc = moc;
+		moc = newMoc == null ? MOC_EDEFAULT : newMoc;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION_MOE__MOC, oldMoc, moc));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isIsElse() {
+		return isElse;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setIsElse(boolean newIsElse) {
+		boolean oldIsElse = isElse;
+		isElse = newIsElse;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION_MOE__IS_ELSE, oldIsElse, isElse));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getPrior() {
+		return prior;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPrior(int newPrior) {
+		int oldPrior = prior;
+		prior = newPrior;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION_MOE__PRIOR, oldPrior, prior));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public float getProba() {
+		return proba;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setProba(float newProba) {
+		float oldProba = proba;
+		proba = newProba;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatemachinePackage.TRANSITION_MOE__PROBA, oldProba, proba));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachinePackage.TRANSITION_MOE__MOC:
+				return getMoc();
+			case StatemachinePackage.TRANSITION_MOE__IS_ELSE:
+				return isIsElse();
+			case StatemachinePackage.TRANSITION_MOE__PRIOR:
+				return getPrior();
+			case StatemachinePackage.TRANSITION_MOE__PROBA:
+				return getProba();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachinePackage.TRANSITION_MOE__MOC:
+				setMoc((TransitionMoc)newValue);
+				return;
+			case StatemachinePackage.TRANSITION_MOE__IS_ELSE:
+				setIsElse((Boolean)newValue);
+				return;
+			case StatemachinePackage.TRANSITION_MOE__PRIOR:
+				setPrior((Integer)newValue);
+				return;
+			case StatemachinePackage.TRANSITION_MOE__PROBA:
+				setProba((Float)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.TRANSITION_MOE__MOC:
+				setMoc(MOC_EDEFAULT);
+				return;
+			case StatemachinePackage.TRANSITION_MOE__IS_ELSE:
+				setIsElse(IS_ELSE_EDEFAULT);
+				return;
+			case StatemachinePackage.TRANSITION_MOE__PRIOR:
+				setPrior(PRIOR_EDEFAULT);
+				return;
+			case StatemachinePackage.TRANSITION_MOE__PROBA:
+				setProba(PROBA_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.TRANSITION_MOE__MOC:
+				return moc != MOC_EDEFAULT;
+			case StatemachinePackage.TRANSITION_MOE__IS_ELSE:
+				return isElse != IS_ELSE_EDEFAULT;
+			case StatemachinePackage.TRANSITION_MOE__PRIOR:
+				return prior != PRIOR_EDEFAULT;
+			case StatemachinePackage.TRANSITION_MOE__PROBA:
+				return proba != PROBA_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (moc: ");
+		result.append(moc);
+		result.append(", isElse: ");
+		result.append(isElse);
+		result.append(", prior: ");
+		result.append(prior);
+		result.append(", proba: ");
+		result.append(proba);
+		result.append(')');
+		return result.toString();
+	}
+
+} //TransitionMoeImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/VertexImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/VertexImpl.java
new file mode 100644
index 0000000..71b75e6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/impl/VertexImpl.java
@@ -0,0 +1,199 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.impl.NamedElementImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+import org.eclipse.efm.ecore.formalml.statemachine.Transition;
+import org.eclipse.efm.ecore.formalml.statemachine.Vertex;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Vertex</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.VertexImpl#getTransition <em>Transition</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statemachine.impl.VertexImpl#getMoe <em>Moe</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class VertexImpl extends NamedElementImpl implements Vertex {
+	/**
+	 * The cached value of the '{@link #getTransition() <em>Transition</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTransition()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Transition> transition;
+
+	/**
+	 * The cached value of the '{@link #getMoe() <em>Moe</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMoe()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Routine> moe;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VertexImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatemachinePackage.Literals.VERTEX;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Transition> getTransition() {
+		if (transition == null) {
+			transition = new EObjectContainmentEList<Transition>(Transition.class, this, StatemachinePackage.VERTEX__TRANSITION);
+		}
+		return transition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Routine> getMoe() {
+		if (moe == null) {
+			moe = new EObjectContainmentEList<Routine>(Routine.class, this, StatemachinePackage.VERTEX__MOE);
+		}
+		return moe;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatemachinePackage.VERTEX__TRANSITION:
+				return ((InternalEList<?>)getTransition()).basicRemove(otherEnd, msgs);
+			case StatemachinePackage.VERTEX__MOE:
+				return ((InternalEList<?>)getMoe()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatemachinePackage.VERTEX__TRANSITION:
+				return getTransition();
+			case StatemachinePackage.VERTEX__MOE:
+				return getMoe();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatemachinePackage.VERTEX__TRANSITION:
+				getTransition().clear();
+				getTransition().addAll((Collection<? extends Transition>)newValue);
+				return;
+			case StatemachinePackage.VERTEX__MOE:
+				getMoe().clear();
+				getMoe().addAll((Collection<? extends Routine>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.VERTEX__TRANSITION:
+				getTransition().clear();
+				return;
+			case StatemachinePackage.VERTEX__MOE:
+				getMoe().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatemachinePackage.VERTEX__TRANSITION:
+				return transition != null && !transition.isEmpty();
+			case StatemachinePackage.VERTEX__MOE:
+				return moe != null && !moe.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //VertexImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/util/StatemachineAdapterFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/util/StatemachineAdapterFactory.java
new file mode 100644
index 0000000..eeaf811
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/util/StatemachineAdapterFactory.java
@@ -0,0 +1,390 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.util;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+import org.eclipse.efm.ecore.formalml.common.Type;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+
+import org.eclipse.efm.ecore.formalml.statemachine.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage
+ * @generated
+ */
+public class StatemachineAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static StatemachinePackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = StatemachinePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatemachineSwitch<Adapter> modelSwitch =
+		new StatemachineSwitch<Adapter>() {
+			@Override
+			public Adapter caseStatemachine(Statemachine object) {
+				return createStatemachineAdapter();
+			}
+			@Override
+			public Adapter caseRegion(Region object) {
+				return createRegionAdapter();
+			}
+			@Override
+			public Adapter caseVertex(Vertex object) {
+				return createVertexAdapter();
+			}
+			@Override
+			public Adapter casePseudostate(Pseudostate object) {
+				return createPseudostateAdapter();
+			}
+			@Override
+			public Adapter caseState(State object) {
+				return createStateAdapter();
+			}
+			@Override
+			public Adapter caseFinalState(FinalState object) {
+				return createFinalStateAdapter();
+			}
+			@Override
+			public Adapter caseStartState(StartState object) {
+				return createStartStateAdapter();
+			}
+			@Override
+			public Adapter caseTransition(Transition object) {
+				return createTransitionAdapter();
+			}
+			@Override
+			public Adapter caseTransitionMoe(TransitionMoe object) {
+				return createTransitionMoeAdapter();
+			}
+			@Override
+			public Adapter caseAbstractElement(AbstractElement object) {
+				return createAbstractElementAdapter();
+			}
+			@Override
+			public Adapter caseNamedElement(NamedElement object) {
+				return createNamedElementAdapter();
+			}
+			@Override
+			public Adapter caseType(Type object) {
+				return createTypeAdapter();
+			}
+			@Override
+			public Adapter caseClassifierDefinition(ClassifierDefinition object) {
+				return createClassifierDefinitionAdapter();
+			}
+			@Override
+			public Adapter caseMachine(Machine object) {
+				return createMachineAdapter();
+			}
+			@Override
+			public Adapter caseBehavior(Behavior object) {
+				return createBehaviorAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.Statemachine <em>Statemachine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Statemachine
+	 * @generated
+	 */
+	public Adapter createStatemachineAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.Region <em>Region</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Region
+	 * @generated
+	 */
+	public Adapter createRegionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.Vertex <em>Vertex</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Vertex
+	 * @generated
+	 */
+	public Adapter createVertexAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.Pseudostate <em>Pseudostate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Pseudostate
+	 * @generated
+	 */
+	public Adapter createPseudostateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.State <em>State</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.State
+	 * @generated
+	 */
+	public Adapter createStateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.FinalState <em>Final State</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.FinalState
+	 * @generated
+	 */
+	public Adapter createFinalStateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.StartState <em>Start State</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.StartState
+	 * @generated
+	 */
+	public Adapter createStartStateAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.Transition <em>Transition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.Transition
+	 * @generated
+	 */
+	public Adapter createTransitionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe <em>Transition Moe</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe
+	 * @generated
+	 */
+	public Adapter createTransitionMoeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.AbstractElement <em>Abstract Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.AbstractElement
+	 * @generated
+	 */
+	public Adapter createAbstractElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.NamedElement <em>Named Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.NamedElement
+	 * @generated
+	 */
+	public Adapter createNamedElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.Type <em>Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.Type
+	 * @generated
+	 */
+	public Adapter createTypeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.common.ClassifierDefinition <em>Classifier Definition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.common.ClassifierDefinition
+	 * @generated
+	 */
+	public Adapter createClassifierDefinitionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Machine <em>Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Machine
+	 * @generated
+	 */
+	public Adapter createMachineAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.infrastructure.Behavior <em>Behavior</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.infrastructure.Behavior
+	 * @generated
+	 */
+	public Adapter createBehaviorAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //StatemachineAdapterFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/util/StatemachineSwitch.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/util/StatemachineSwitch.java
new file mode 100644
index 0000000..d68a135
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/util/StatemachineSwitch.java
@@ -0,0 +1,412 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.util;
+
+import org.eclipse.efm.ecore.formalml.common.AbstractElement;
+import org.eclipse.efm.ecore.formalml.common.ClassifierDefinition;
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+import org.eclipse.efm.ecore.formalml.common.Type;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+
+import org.eclipse.efm.ecore.formalml.statemachine.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage
+ * @generated
+ */
+public class StatemachineSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static StatemachinePackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatemachineSwitch() {
+		if (modelPackage == null) {
+			modelPackage = StatemachinePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case StatemachinePackage.STATEMACHINE: {
+				Statemachine statemachine = (Statemachine)theEObject;
+				T result = caseStatemachine(statemachine);
+				if (result == null) result = caseBehavior(statemachine);
+				if (result == null) result = caseMachine(statemachine);
+				if (result == null) result = caseClassifierDefinition(statemachine);
+				if (result == null) result = caseType(statemachine);
+				if (result == null) result = caseNamedElement(statemachine);
+				if (result == null) result = caseAbstractElement(statemachine);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachinePackage.REGION: {
+				Region region = (Region)theEObject;
+				T result = caseRegion(region);
+				if (result == null) result = caseNamedElement(region);
+				if (result == null) result = caseAbstractElement(region);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachinePackage.VERTEX: {
+				Vertex vertex = (Vertex)theEObject;
+				T result = caseVertex(vertex);
+				if (result == null) result = caseNamedElement(vertex);
+				if (result == null) result = caseAbstractElement(vertex);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachinePackage.PSEUDOSTATE: {
+				Pseudostate pseudostate = (Pseudostate)theEObject;
+				T result = casePseudostate(pseudostate);
+				if (result == null) result = caseVertex(pseudostate);
+				if (result == null) result = caseNamedElement(pseudostate);
+				if (result == null) result = caseAbstractElement(pseudostate);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachinePackage.STATE: {
+				State state = (State)theEObject;
+				T result = caseState(state);
+				if (result == null) result = caseVertex(state);
+				if (result == null) result = caseNamedElement(state);
+				if (result == null) result = caseAbstractElement(state);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachinePackage.FINAL_STATE: {
+				FinalState finalState = (FinalState)theEObject;
+				T result = caseFinalState(finalState);
+				if (result == null) result = caseState(finalState);
+				if (result == null) result = caseVertex(finalState);
+				if (result == null) result = caseNamedElement(finalState);
+				if (result == null) result = caseAbstractElement(finalState);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachinePackage.START_STATE: {
+				StartState startState = (StartState)theEObject;
+				T result = caseStartState(startState);
+				if (result == null) result = caseState(startState);
+				if (result == null) result = caseVertex(startState);
+				if (result == null) result = caseNamedElement(startState);
+				if (result == null) result = caseAbstractElement(startState);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachinePackage.TRANSITION: {
+				Transition transition = (Transition)theEObject;
+				T result = caseTransition(transition);
+				if (result == null) result = caseNamedElement(transition);
+				if (result == null) result = caseAbstractElement(transition);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatemachinePackage.TRANSITION_MOE: {
+				TransitionMoe transitionMoe = (TransitionMoe)theEObject;
+				T result = caseTransitionMoe(transitionMoe);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statemachine</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statemachine</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatemachine(Statemachine object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Region</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Region</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseRegion(Region object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Vertex</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Vertex</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVertex(Vertex object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Pseudostate</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Pseudostate</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePseudostate(Pseudostate object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>State</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>State</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseState(State object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Final State</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Final State</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFinalState(FinalState object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Start State</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Start State</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStartState(StartState object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Transition</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Transition</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseTransition(Transition object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Transition Moe</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Transition Moe</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseTransitionMoe(TransitionMoe object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Abstract Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAbstractElement(AbstractElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Named Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Named Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseNamedElement(NamedElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Type</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseType(Type object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Classifier Definition</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Classifier Definition</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseClassifierDefinition(ClassifierDefinition object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Machine</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Machine</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseMachine(Machine object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Behavior</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Behavior</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseBehavior(Behavior object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //StatemachineSwitch
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/FinalStateValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/FinalStateValidator.java
new file mode 100644
index 0000000..bf585ae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/FinalStateValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statemachine.FinalState}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface FinalStateValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/PseudostateValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/PseudostateValidator.java
new file mode 100644
index 0000000..1ca396f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/PseudostateValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.validation;
+
+import org.eclipse.efm.ecore.formalml.statemachine.PseudostateKind;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statemachine.Pseudostate}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface PseudostateValidator {
+	boolean validate();
+
+	boolean validateKind(PseudostateKind value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/RegionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/RegionValidator.java
new file mode 100644
index 0000000..295e3dc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/RegionValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.validation;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Vertex;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statemachine.Region}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface RegionValidator {
+	boolean validate();
+
+	boolean validateVertex(EList<Vertex> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/StartStateValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/StartStateValidator.java
new file mode 100644
index 0000000..8dfb475
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/StartStateValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statemachine.StartState}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface StartStateValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/StateValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/StateValidator.java
new file mode 100644
index 0000000..d723956
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/StateValidator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.validation;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Region;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statemachine.State}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface StateValidator {
+	boolean validate();
+
+	boolean validateSimple(boolean value);
+	boolean validateComposite(boolean value);
+	boolean validateOrthogonal(boolean value);
+	boolean validateRegion(EList<Region> value);
+	boolean validateMoe(EList<Routine> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/StatemachineValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/StatemachineValidator.java
new file mode 100644
index 0000000..3b7fe4b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/StatemachineValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.validation;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Region;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statemachine.Statemachine}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface StatemachineValidator {
+	boolean validate();
+
+	boolean validateRegion(EList<Region> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/TransitionMoeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/TransitionMoeValidator.java
new file mode 100644
index 0000000..ff51577
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/TransitionMoeValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.validation;
+
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TransitionMoeValidator {
+	boolean validate();
+
+	boolean validateMoc(TransitionMoc value);
+	boolean validateIsElse(boolean value);
+	boolean validatePrior(int value);
+	boolean validateProba(float value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/TransitionValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/TransitionValidator.java
new file mode 100644
index 0000000..8e7347d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/TransitionValidator.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.validation;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe;
+
+import org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.InputComStatement;
+import org.eclipse.efm.ecore.formalml.statement.Statement;
+import org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statemachine.Transition}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TransitionValidator {
+	boolean validate();
+
+	boolean validateTransient(boolean value);
+	boolean validateMoe(TransitionMoe value);
+	boolean validateTarget(NamedElement value);
+	boolean validateBehavior(BlockStatement value);
+	boolean validateTrigger(EList<InputComStatement> value);
+	boolean validateGuard(AbstractGuardStatement value);
+	boolean validateTguard(TimedGuardStatement value);
+	boolean validateEffect(Statement value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/VertexValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/VertexValidator.java
new file mode 100644
index 0000000..01bc437
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statemachine/validation/VertexValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statemachine.validation;
+
+import org.eclipse.efm.ecore.formalml.statemachine.Transition;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statemachine.Vertex}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface VertexValidator {
+	boolean validate();
+
+	boolean validateTransition(EList<Transition> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AbstractComStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AbstractComStatement.java
new file mode 100644
index 0000000..4dd9882
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AbstractComStatement.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Abstract Com Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getPort <em>Port</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getRoute <em>Route</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getTarget <em>Target</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAbstractComStatement()
+ * @model abstract="true"
+ * @generated
+ */
+public interface AbstractComStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Port</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Port</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Port</em>' reference.
+	 * @see #setPort(NamedElement)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAbstractComStatement_Port()
+	 * @model
+	 * @generated
+	 */
+	NamedElement getPort();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getPort <em>Port</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Port</em>' reference.
+	 * @see #getPort()
+	 * @generated
+	 */
+	void setPort(NamedElement value);
+
+	/**
+	 * Returns the value of the '<em><b>Route</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Route</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Route</em>' reference.
+	 * @see #setRoute(Channel)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAbstractComStatement_Route()
+	 * @model resolveProxies="false"
+	 * @generated
+	 */
+	Channel getRoute();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getRoute <em>Route</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Route</em>' reference.
+	 * @see #getRoute()
+	 * @generated
+	 */
+	void setRoute(Channel value);
+
+	/**
+	 * Returns the value of the '<em><b>Target</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Target</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Target</em>' containment reference.
+	 * @see #setTarget(ExpressionAsMachine)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAbstractComStatement_Target()
+	 * @model containment="true"
+	 * @generated
+	 */
+	ExpressionAsMachine getTarget();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getTarget <em>Target</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Target</em>' containment reference.
+	 * @see #getTarget()
+	 * @generated
+	 */
+	void setTarget(ExpressionAsMachine value);
+
+} // AbstractComStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AbstractGuardStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AbstractGuardStatement.java
new file mode 100644
index 0000000..b1a1436
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AbstractGuardStatement.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Abstract Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement#getCondition <em>Condition</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAbstractGuardStatement()
+ * @model abstract="true"
+ * @generated
+ */
+public interface AbstractGuardStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Condition</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Condition</em>' containment reference.
+	 * @see #setCondition(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAbstractGuardStatement_Condition()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getCondition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement#getCondition <em>Condition</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Condition</em>' containment reference.
+	 * @see #getCondition()
+	 * @generated
+	 */
+	void setCondition(Expression value);
+
+} // AbstractGuardStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ActivityStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ActivityStatement.java
new file mode 100644
index 0000000..8f7d4b0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ActivityStatement.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Activity Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getOp <em>Op</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getMachine <em>Machine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getTuple <em>Tuple</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getActivityStatement()
+ * @model
+ * @generated
+ */
+public interface ActivityStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Op</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Op</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Op</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind
+	 * @see #setOp(ActivityStatementKind)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getActivityStatement_Op()
+	 * @model required="true"
+	 * @generated
+	 */
+	ActivityStatementKind getOp();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getOp <em>Op</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Op</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind
+	 * @see #getOp()
+	 * @generated
+	 */
+	void setOp(ActivityStatementKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Machine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Machine</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Machine</em>' containment reference.
+	 * @see #setMachine(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getActivityStatement_Machine()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getMachine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getMachine <em>Machine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Machine</em>' containment reference.
+	 * @see #getMachine()
+	 * @generated
+	 */
+	void setMachine(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Tuple</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Tuple</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Tuple</em>' containment reference.
+	 * @see #setTuple(TupleExpression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getActivityStatement_Tuple()
+	 * @model containment="true"
+	 * @generated
+	 */
+	TupleExpression getTuple();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getTuple <em>Tuple</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Tuple</em>' containment reference.
+	 * @see #getTuple()
+	 * @generated
+	 */
+	void setTuple(TupleExpression value);
+
+} // ActivityStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ActivityStatementKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ActivityStatementKind.java
new file mode 100644
index 0000000..267fe1d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ActivityStatementKind.java
@@ -0,0 +1,602 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Activity Statement Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getActivityStatementKind()
+ * @model
+ * @generated
+ */
+public enum ActivityStatementKind implements Enumerator {
+	/**
+	 * The '<em><b>Init</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INIT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INIT(0, "init", "init"),
+
+	/**
+	 * The '<em><b>Final</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #FINAL_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	FINAL(1, "final", "final"),
+
+	/**
+	 * The '<em><b>Destroy</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DESTROY_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DESTROY(2, "destroy", "destroy"),
+
+	/**
+	 * The '<em><b>Start</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #START_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	START(3, "start", "start"),
+
+	/**
+	 * The '<em><b>Stop</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #STOP_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	STOP(4, "stop", "stop"),
+
+	/**
+	 * The '<em><b>Restart</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RESTART_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RESTART(5, "restart", "restart"),
+
+	/**
+	 * The '<em><b>Suspend</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SUSPEND_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SUSPEND(6, "suspend", "suspend"),
+
+	/**
+	 * The '<em><b>Resume</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RESUME_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RESUME(7, "resume", "resume"),
+
+	/**
+	 * The '<em><b>Wait</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #WAIT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	WAIT(8, "wait", "wait"),
+
+	/**
+	 * The '<em><b>Abort</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ABORT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ABORT(9, "abort", "abort"),
+
+	/**
+	 * The '<em><b>Disable</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DISABLE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DISABLE(10, "disable", "disable"),
+
+	/**
+	 * The '<em><b>Enable</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ENABLE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ENABLE(11, "enable", "enable"),
+
+	/**
+	 * The '<em><b>Irun</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IRUN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	IRUN(12, "irun", "irun"),
+
+	/**
+	 * The '<em><b>Run</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RUN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RUN(13, "run", "run"),
+
+	/**
+	 * The '<em><b>Rtc</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RTC_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RTC(14, "rtc", "rtc"),
+
+	/**
+	 * The '<em><b>Schedule</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #SCHEDULE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	SCHEDULE(15, "schedule", "schedule");
+
+	/**
+	 * The '<em><b>Init</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Init</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INIT
+	 * @model name="init"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INIT_VALUE = 0;
+
+	/**
+	 * The '<em><b>Final</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Final</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #FINAL
+	 * @model name="final"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int FINAL_VALUE = 1;
+
+	/**
+	 * The '<em><b>Destroy</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Destroy</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DESTROY
+	 * @model name="destroy"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DESTROY_VALUE = 2;
+
+	/**
+	 * The '<em><b>Start</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Start</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #START
+	 * @model name="start"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int START_VALUE = 3;
+
+	/**
+	 * The '<em><b>Stop</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Stop</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #STOP
+	 * @model name="stop"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int STOP_VALUE = 4;
+
+	/**
+	 * The '<em><b>Restart</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Restart</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RESTART
+	 * @model name="restart"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RESTART_VALUE = 5;
+
+	/**
+	 * The '<em><b>Suspend</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Suspend</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SUSPEND
+	 * @model name="suspend"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SUSPEND_VALUE = 6;
+
+	/**
+	 * The '<em><b>Resume</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Resume</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RESUME
+	 * @model name="resume"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RESUME_VALUE = 7;
+
+	/**
+	 * The '<em><b>Wait</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Wait</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #WAIT
+	 * @model name="wait"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int WAIT_VALUE = 8;
+
+	/**
+	 * The '<em><b>Abort</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Abort</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ABORT
+	 * @model name="abort"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ABORT_VALUE = 9;
+
+	/**
+	 * The '<em><b>Disable</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Disable</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DISABLE
+	 * @model name="disable"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DISABLE_VALUE = 10;
+
+	/**
+	 * The '<em><b>Enable</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Enable</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ENABLE
+	 * @model name="enable"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ENABLE_VALUE = 11;
+
+	/**
+	 * The '<em><b>Irun</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Irun</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #IRUN
+	 * @model name="irun"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int IRUN_VALUE = 12;
+
+	/**
+	 * The '<em><b>Run</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Run</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RUN
+	 * @model name="run"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RUN_VALUE = 13;
+
+	/**
+	 * The '<em><b>Rtc</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Rtc</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RTC
+	 * @model name="rtc"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RTC_VALUE = 14;
+
+	/**
+	 * The '<em><b>Schedule</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Schedule</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #SCHEDULE
+	 * @model name="schedule"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int SCHEDULE_VALUE = 15;
+
+	/**
+	 * An array of all the '<em><b>Activity Statement Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final ActivityStatementKind[] VALUES_ARRAY =
+		new ActivityStatementKind[] {
+			INIT,
+			FINAL,
+			DESTROY,
+			START,
+			STOP,
+			RESTART,
+			SUSPEND,
+			RESUME,
+			WAIT,
+			ABORT,
+			DISABLE,
+			ENABLE,
+			IRUN,
+			RUN,
+			RTC,
+			SCHEDULE,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Activity Statement Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<ActivityStatementKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Activity Statement Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ActivityStatementKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ActivityStatementKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Activity Statement Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ActivityStatementKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ActivityStatementKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Activity Statement Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ActivityStatementKind get(int value) {
+		switch (value) {
+			case INIT_VALUE: return INIT;
+			case FINAL_VALUE: return FINAL;
+			case DESTROY_VALUE: return DESTROY;
+			case START_VALUE: return START;
+			case STOP_VALUE: return STOP;
+			case RESTART_VALUE: return RESTART;
+			case SUSPEND_VALUE: return SUSPEND;
+			case RESUME_VALUE: return RESUME;
+			case WAIT_VALUE: return WAIT;
+			case ABORT_VALUE: return ABORT;
+			case DISABLE_VALUE: return DISABLE;
+			case ENABLE_VALUE: return ENABLE;
+			case IRUN_VALUE: return IRUN;
+			case RUN_VALUE: return RUN;
+			case RTC_VALUE: return RTC;
+			case SCHEDULE_VALUE: return SCHEDULE;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ActivityStatementKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //ActivityStatementKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AssignmentStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AssignmentStatement.java
new file mode 100644
index 0000000..8409cf1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AssignmentStatement.java
@@ -0,0 +1,143 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.AssignmentExpression;
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Assignment Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getExpression <em>Expression</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getLeftHandSide <em>Left Hand Side</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getRigthHandSide <em>Rigth Hand Side</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAssignmentStatement()
+ * @model
+ * @generated
+ */
+public interface AssignmentStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Expression</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Expression</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Expression</em>' containment reference.
+	 * @see #setExpression(AssignmentExpression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAssignmentStatement_Expression()
+	 * @model containment="true"
+	 * @generated
+	 */
+	AssignmentExpression getExpression();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getExpression <em>Expression</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Expression</em>' containment reference.
+	 * @see #getExpression()
+	 * @generated
+	 */
+	void setExpression(AssignmentExpression value);
+
+	/**
+	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Operator</em>' attribute.
+	 * @see #setOperator(String)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAssignmentStatement_Operator()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getOperator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getOperator <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Operator</em>' attribute.
+	 * @see #getOperator()
+	 * @generated
+	 */
+	void setOperator(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Hand Side</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Hand Side</em>' containment reference.
+	 * @see #setLeftHandSide(LeftHandSideExpression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAssignmentStatement_LeftHandSide()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	LeftHandSideExpression getLeftHandSide();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getLeftHandSide <em>Left Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Left Hand Side</em>' containment reference.
+	 * @see #getLeftHandSide()
+	 * @generated
+	 */
+	void setLeftHandSide(LeftHandSideExpression value);
+
+	/**
+	 * Returns the value of the '<em><b>Rigth Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Rigth Hand Side</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Rigth Hand Side</em>' containment reference.
+	 * @see #setRigthHandSide(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAssignmentStatement_RigthHandSide()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getRigthHandSide();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getRigthHandSide <em>Rigth Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Rigth Hand Side</em>' containment reference.
+	 * @see #getRigthHandSide()
+	 * @generated
+	 */
+	void setRigthHandSide(Expression value);
+
+} // AssignmentStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AssignmentStatementkind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AssignmentStatementkind.java
new file mode 100644
index 0000000..f02a5f7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/AssignmentStatementkind.java
@@ -0,0 +1,1061 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Assignment Statementkind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getAssignmentStatementkind()
+ * @model
+ * @generated
+ */
+public enum AssignmentStatementkind implements Enumerator {
+	/**
+	 * The '<em><b>Assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ASSIGN(0, "assign", "assign"),
+
+	/**
+	 * The '<em><b>Assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ASSIGN_AFTER(1, "assign_after", "assign_after"),
+
+	/**
+	 * The '<em><b>Assign ref</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ASSIGN_REF_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ASSIGN_REF(2, "assign_ref", "assign_ref"),
+
+	/**
+	 * The '<em><b>Assign macro</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ASSIGN_MACRO_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ASSIGN_MACRO(3, "assign_macro", "assign_macro"),
+
+	/**
+	 * The '<em><b>Plus assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PLUS_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PLUS_ASSIGN(4, "plus_assign", "plus_assign"),
+
+	/**
+	 * The '<em><b>Plus assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #PLUS_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	PLUS_ASSIGN_AFTER(5, "plus_assign_after", "plus_assign_after"),
+
+	/**
+	 * The '<em><b>Minus assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MINUS_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MINUS_ASSIGN(6, "minus_assign", "minus_assign"),
+
+	/**
+	 * The '<em><b>Minus assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MINUS_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MINUS_ASSIGN_AFTER(7, "minus_assign_after", "minus_assign_after"),
+
+	/**
+	 * The '<em><b>Star assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #STAR_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	STAR_ASSIGN(8, "star_assign", "star_assign"),
+
+	/**
+	 * The '<em><b>Star assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #STAR_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	STAR_ASSIGN_AFTER(9, "star_assign_after", "star_assign_after"),
+
+	/**
+	 * The '<em><b>Div assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DIV_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DIV_ASSIGN_AFTER(10, "div_assign_after", "div_assign_after"),
+
+	/**
+	 * The '<em><b>Div assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DIV_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DIV_ASSIGN(11, "div_assign", "div_assign"),
+
+	/**
+	 * The '<em><b>Mod assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MOD_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MOD_ASSIGN_AFTER(12, "mod_assign_after", "mod_assign_after"),
+
+	/**
+	 * The '<em><b>Mod assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #MOD_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	MOD_ASSIGN(13, "mod_assign", "mod_assign"),
+
+	/**
+	 * The '<em><b>Land assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LAND_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	LAND_ASSIGN_AFTER(14, "land_assign_after", "land_assign_after"),
+
+	/**
+	 * The '<em><b>Land assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LAND_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	LAND_ASSIGN(15, "land_assign", "land_assign"),
+
+	/**
+	 * The '<em><b>Lor assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LOR_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	LOR_ASSIGN_AFTER(16, "lor_assign_after", "lor_assign_after"),
+
+	/**
+	 * The '<em><b>Lor assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LOR_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	LOR_ASSIGN(17, "lor_assign", "lor_assign"),
+
+	/**
+	 * The '<em><b>Band assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BAND_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BAND_ASSIGN_AFTER(18, "band_assign_after", "band_assign_after"),
+
+	/**
+	 * The '<em><b>Band assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BAND_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BAND_ASSIGN(19, "band_assign", "band_assign"),
+
+	/**
+	 * The '<em><b>Bor assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BOR_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BOR_ASSIGN_AFTER(20, "bor_assign_after", "bor_assign_after"),
+
+	/**
+	 * The '<em><b>Bor assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BOR_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BOR_ASSIGN(21, "bor_assign", "bor_assign"),
+
+	/**
+	 * The '<em><b>Bxor assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BXOR_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BXOR_ASSIGN_AFTER(22, "bxor_assign_after", "bxor_assign_after"),
+
+	/**
+	 * The '<em><b>Bxor assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BXOR_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BXOR_ASSIGN(23, "bxor_assign", "bxor_assign"),
+
+	/**
+	 * The '<em><b>Lshift assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LSHIFT_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	LSHIFT_ASSIGN_AFTER(24, "lshift_assign_after", "lshift_assign_after"),
+
+	/**
+	 * The '<em><b>Lshift assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #LSHIFT_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	LSHIFT_ASSIGN(25, "lshift_assign", "lshift_assign"),
+
+	/**
+	 * The '<em><b>Rshift assign after</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RSHIFT_ASSIGN_AFTER_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RSHIFT_ASSIGN_AFTER(26, "rshift_assign_after", "rshift_assign_after"),
+
+	/**
+	 * The '<em><b>Rshift assign</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RSHIFT_ASSIGN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RSHIFT_ASSIGN(27, "rshift_assign", "rshift_assign"),
+
+	/**
+	 * The '<em><b>Op push</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #OP_PUSH_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	OP_PUSH(28, "op_push", "op_push"),
+
+	/**
+	 * The '<em><b>Op assign top</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #OP_ASSIGN_TOP_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	OP_ASSIGN_TOP(29, "op_assign_top", "op_assign_top"),
+
+	/**
+	 * The '<em><b>Op pop</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #OP_POP_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	OP_POP(30, "op_pop", "op_pop"),
+
+	/**
+	 * The '<em><b>Incr</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INCR_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INCR(31, "incr", "incr"),
+
+	/**
+	 * The '<em><b>Decr</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #DECR_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	DECR(32, "decr", "decr");
+
+	/**
+	 * The '<em><b>Assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ASSIGN
+	 * @model name="assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ASSIGN_VALUE = 0;
+
+	/**
+	 * The '<em><b>Assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ASSIGN_AFTER
+	 * @model name="assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ASSIGN_AFTER_VALUE = 1;
+
+	/**
+	 * The '<em><b>Assign ref</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Assign ref</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ASSIGN_REF
+	 * @model name="assign_ref"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ASSIGN_REF_VALUE = 2;
+
+	/**
+	 * The '<em><b>Assign macro</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Assign macro</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ASSIGN_MACRO
+	 * @model name="assign_macro"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ASSIGN_MACRO_VALUE = 3;
+
+	/**
+	 * The '<em><b>Plus assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Plus assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PLUS_ASSIGN
+	 * @model name="plus_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PLUS_ASSIGN_VALUE = 4;
+
+	/**
+	 * The '<em><b>Plus assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Plus assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #PLUS_ASSIGN_AFTER
+	 * @model name="plus_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int PLUS_ASSIGN_AFTER_VALUE = 5;
+
+	/**
+	 * The '<em><b>Minus assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Minus assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MINUS_ASSIGN
+	 * @model name="minus_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MINUS_ASSIGN_VALUE = 6;
+
+	/**
+	 * The '<em><b>Minus assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Minus assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MINUS_ASSIGN_AFTER
+	 * @model name="minus_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MINUS_ASSIGN_AFTER_VALUE = 7;
+
+	/**
+	 * The '<em><b>Star assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Star assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #STAR_ASSIGN
+	 * @model name="star_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int STAR_ASSIGN_VALUE = 8;
+
+	/**
+	 * The '<em><b>Star assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Star assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #STAR_ASSIGN_AFTER
+	 * @model name="star_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int STAR_ASSIGN_AFTER_VALUE = 9;
+
+	/**
+	 * The '<em><b>Div assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Div assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DIV_ASSIGN_AFTER
+	 * @model name="div_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DIV_ASSIGN_AFTER_VALUE = 10;
+
+	/**
+	 * The '<em><b>Div assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Div assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DIV_ASSIGN
+	 * @model name="div_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DIV_ASSIGN_VALUE = 11;
+
+	/**
+	 * The '<em><b>Mod assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Mod assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MOD_ASSIGN_AFTER
+	 * @model name="mod_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MOD_ASSIGN_AFTER_VALUE = 12;
+
+	/**
+	 * The '<em><b>Mod assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Mod assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #MOD_ASSIGN
+	 * @model name="mod_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int MOD_ASSIGN_VALUE = 13;
+
+	/**
+	 * The '<em><b>Land assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Land assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #LAND_ASSIGN_AFTER
+	 * @model name="land_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int LAND_ASSIGN_AFTER_VALUE = 14;
+
+	/**
+	 * The '<em><b>Land assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Land assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #LAND_ASSIGN
+	 * @model name="land_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int LAND_ASSIGN_VALUE = 15;
+
+	/**
+	 * The '<em><b>Lor assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Lor assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #LOR_ASSIGN_AFTER
+	 * @model name="lor_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int LOR_ASSIGN_AFTER_VALUE = 16;
+
+	/**
+	 * The '<em><b>Lor assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Lor assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #LOR_ASSIGN
+	 * @model name="lor_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int LOR_ASSIGN_VALUE = 17;
+
+	/**
+	 * The '<em><b>Band assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Band assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BAND_ASSIGN_AFTER
+	 * @model name="band_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BAND_ASSIGN_AFTER_VALUE = 18;
+
+	/**
+	 * The '<em><b>Band assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Band assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BAND_ASSIGN
+	 * @model name="band_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BAND_ASSIGN_VALUE = 19;
+
+	/**
+	 * The '<em><b>Bor assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Bor assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BOR_ASSIGN_AFTER
+	 * @model name="bor_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BOR_ASSIGN_AFTER_VALUE = 20;
+
+	/**
+	 * The '<em><b>Bor assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Bor assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BOR_ASSIGN
+	 * @model name="bor_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BOR_ASSIGN_VALUE = 21;
+
+	/**
+	 * The '<em><b>Bxor assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Bxor assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BXOR_ASSIGN_AFTER
+	 * @model name="bxor_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BXOR_ASSIGN_AFTER_VALUE = 22;
+
+	/**
+	 * The '<em><b>Bxor assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Bxor assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BXOR_ASSIGN
+	 * @model name="bxor_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BXOR_ASSIGN_VALUE = 23;
+
+	/**
+	 * The '<em><b>Lshift assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Lshift assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #LSHIFT_ASSIGN_AFTER
+	 * @model name="lshift_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int LSHIFT_ASSIGN_AFTER_VALUE = 24;
+
+	/**
+	 * The '<em><b>Lshift assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Lshift assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #LSHIFT_ASSIGN
+	 * @model name="lshift_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int LSHIFT_ASSIGN_VALUE = 25;
+
+	/**
+	 * The '<em><b>Rshift assign after</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Rshift assign after</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RSHIFT_ASSIGN_AFTER
+	 * @model name="rshift_assign_after"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RSHIFT_ASSIGN_AFTER_VALUE = 26;
+
+	/**
+	 * The '<em><b>Rshift assign</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Rshift assign</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RSHIFT_ASSIGN
+	 * @model name="rshift_assign"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RSHIFT_ASSIGN_VALUE = 27;
+
+	/**
+	 * The '<em><b>Op push</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Op push</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #OP_PUSH
+	 * @model name="op_push"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int OP_PUSH_VALUE = 28;
+
+	/**
+	 * The '<em><b>Op assign top</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Op assign top</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #OP_ASSIGN_TOP
+	 * @model name="op_assign_top"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int OP_ASSIGN_TOP_VALUE = 29;
+
+	/**
+	 * The '<em><b>Op pop</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Op pop</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #OP_POP
+	 * @model name="op_pop"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int OP_POP_VALUE = 30;
+
+	/**
+	 * The '<em><b>Incr</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Incr</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INCR
+	 * @model name="incr"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INCR_VALUE = 31;
+
+	/**
+	 * The '<em><b>Decr</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Decr</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #DECR
+	 * @model name="decr"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int DECR_VALUE = 32;
+
+	/**
+	 * An array of all the '<em><b>Assignment Statementkind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final AssignmentStatementkind[] VALUES_ARRAY =
+		new AssignmentStatementkind[] {
+			ASSIGN,
+			ASSIGN_AFTER,
+			ASSIGN_REF,
+			ASSIGN_MACRO,
+			PLUS_ASSIGN,
+			PLUS_ASSIGN_AFTER,
+			MINUS_ASSIGN,
+			MINUS_ASSIGN_AFTER,
+			STAR_ASSIGN,
+			STAR_ASSIGN_AFTER,
+			DIV_ASSIGN_AFTER,
+			DIV_ASSIGN,
+			MOD_ASSIGN_AFTER,
+			MOD_ASSIGN,
+			LAND_ASSIGN_AFTER,
+			LAND_ASSIGN,
+			LOR_ASSIGN_AFTER,
+			LOR_ASSIGN,
+			BAND_ASSIGN_AFTER,
+			BAND_ASSIGN,
+			BOR_ASSIGN_AFTER,
+			BOR_ASSIGN,
+			BXOR_ASSIGN_AFTER,
+			BXOR_ASSIGN,
+			LSHIFT_ASSIGN_AFTER,
+			LSHIFT_ASSIGN,
+			RSHIFT_ASSIGN_AFTER,
+			RSHIFT_ASSIGN,
+			OP_PUSH,
+			OP_ASSIGN_TOP,
+			OP_POP,
+			INCR,
+			DECR,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Assignment Statementkind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<AssignmentStatementkind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Assignment Statementkind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static AssignmentStatementkind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			AssignmentStatementkind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Assignment Statementkind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static AssignmentStatementkind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			AssignmentStatementkind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Assignment Statementkind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static AssignmentStatementkind get(int value) {
+		switch (value) {
+			case ASSIGN_VALUE: return ASSIGN;
+			case ASSIGN_AFTER_VALUE: return ASSIGN_AFTER;
+			case ASSIGN_REF_VALUE: return ASSIGN_REF;
+			case ASSIGN_MACRO_VALUE: return ASSIGN_MACRO;
+			case PLUS_ASSIGN_VALUE: return PLUS_ASSIGN;
+			case PLUS_ASSIGN_AFTER_VALUE: return PLUS_ASSIGN_AFTER;
+			case MINUS_ASSIGN_VALUE: return MINUS_ASSIGN;
+			case MINUS_ASSIGN_AFTER_VALUE: return MINUS_ASSIGN_AFTER;
+			case STAR_ASSIGN_VALUE: return STAR_ASSIGN;
+			case STAR_ASSIGN_AFTER_VALUE: return STAR_ASSIGN_AFTER;
+			case DIV_ASSIGN_AFTER_VALUE: return DIV_ASSIGN_AFTER;
+			case DIV_ASSIGN_VALUE: return DIV_ASSIGN;
+			case MOD_ASSIGN_AFTER_VALUE: return MOD_ASSIGN_AFTER;
+			case MOD_ASSIGN_VALUE: return MOD_ASSIGN;
+			case LAND_ASSIGN_AFTER_VALUE: return LAND_ASSIGN_AFTER;
+			case LAND_ASSIGN_VALUE: return LAND_ASSIGN;
+			case LOR_ASSIGN_AFTER_VALUE: return LOR_ASSIGN_AFTER;
+			case LOR_ASSIGN_VALUE: return LOR_ASSIGN;
+			case BAND_ASSIGN_AFTER_VALUE: return BAND_ASSIGN_AFTER;
+			case BAND_ASSIGN_VALUE: return BAND_ASSIGN;
+			case BOR_ASSIGN_AFTER_VALUE: return BOR_ASSIGN_AFTER;
+			case BOR_ASSIGN_VALUE: return BOR_ASSIGN;
+			case BXOR_ASSIGN_AFTER_VALUE: return BXOR_ASSIGN_AFTER;
+			case BXOR_ASSIGN_VALUE: return BXOR_ASSIGN;
+			case LSHIFT_ASSIGN_AFTER_VALUE: return LSHIFT_ASSIGN_AFTER;
+			case LSHIFT_ASSIGN_VALUE: return LSHIFT_ASSIGN;
+			case RSHIFT_ASSIGN_AFTER_VALUE: return RSHIFT_ASSIGN_AFTER;
+			case RSHIFT_ASSIGN_VALUE: return RSHIFT_ASSIGN;
+			case OP_PUSH_VALUE: return OP_PUSH;
+			case OP_ASSIGN_TOP_VALUE: return OP_ASSIGN_TOP;
+			case OP_POP_VALUE: return OP_POP;
+			case INCR_VALUE: return INCR;
+			case DECR_VALUE: return DECR;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private AssignmentStatementkind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //AssignmentStatementkind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/BlockStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/BlockStatement.java
new file mode 100644
index 0000000..27d95fd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/BlockStatement.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Block Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.BlockStatement#getOp <em>Op</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.BlockStatement#getStatement <em>Statement</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getBlockStatement()
+ * @model
+ * @generated
+ */
+public interface BlockStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Op</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Op</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Op</em>' attribute.
+	 * @see #setOp(String)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getBlockStatement_Op()
+	 * @model
+	 * @generated
+	 */
+	String getOp();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.BlockStatement#getOp <em>Op</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Op</em>' attribute.
+	 * @see #getOp()
+	 * @generated
+	 */
+	void setOp(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Statement</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.statement.Statement}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Statement</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Statement</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getBlockStatement_Statement()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Statement> getStatement();
+
+} // BlockStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/CheckSatGuardStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/CheckSatGuardStatement.java
new file mode 100644
index 0000000..523ecf2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/CheckSatGuardStatement.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Check Sat Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement#getSolver <em>Solver</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getCheckSatGuardStatement()
+ * @model
+ * @generated
+ */
+public interface CheckSatGuardStatement extends AbstractGuardStatement {
+	/**
+	 * Returns the value of the '<em><b>Solver</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Solver</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Solver</em>' attribute.
+	 * @see #setSolver(String)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getCheckSatGuardStatement_Solver()
+	 * @model
+	 * @generated
+	 */
+	String getSolver();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement#getSolver <em>Solver</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Solver</em>' attribute.
+	 * @see #getSolver()
+	 * @generated
+	 */
+	void setSolver(String value);
+
+} // CheckSatGuardStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ConditionalBlockStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ConditionalBlockStatement.java
new file mode 100644
index 0000000..965f48c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ConditionalBlockStatement.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Conditional Block Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement#getCondition <em>Condition</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement#getBodyBlock <em>Body Block</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getConditionalBlockStatement()
+ * @model
+ * @generated
+ */
+public interface ConditionalBlockStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Condition</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Condition</em>' containment reference.
+	 * @see #setCondition(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getConditionalBlockStatement_Condition()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getCondition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement#getCondition <em>Condition</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Condition</em>' containment reference.
+	 * @see #getCondition()
+	 * @generated
+	 */
+	void setCondition(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Body Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Body Block</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Body Block</em>' containment reference.
+	 * @see #setBodyBlock(BlockStatement)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getConditionalBlockStatement_BodyBlock()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	BlockStatement getBodyBlock();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement#getBodyBlock <em>Body Block</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Body Block</em>' containment reference.
+	 * @see #getBodyBlock()
+	 * @generated
+	 */
+	void setBodyBlock(BlockStatement value);
+
+} // ConditionalBlockStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/DoWhileStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/DoWhileStatement.java
new file mode 100644
index 0000000..d66b6a1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/DoWhileStatement.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Do While Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getDoWhileStatement()
+ * @model
+ * @generated
+ */
+public interface DoWhileStatement extends ConditionalBlockStatement {
+} // DoWhileStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/EventGuardStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/EventGuardStatement.java
new file mode 100644
index 0000000..000204d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/EventGuardStatement.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Event Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getEventGuardStatement()
+ * @model
+ * @generated
+ */
+public interface EventGuardStatement extends AbstractGuardStatement {
+} // EventGuardStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ExpressionStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ExpressionStatement.java
new file mode 100644
index 0000000..74b0ea7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ExpressionStatement.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Expression Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ExpressionStatement#getExpression <em>Expression</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getExpressionStatement()
+ * @model
+ * @generated
+ */
+public interface ExpressionStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Expression</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Expression</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Expression</em>' containment reference.
+	 * @see #setExpression(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getExpressionStatement_Expression()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getExpression();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ExpressionStatement#getExpression <em>Expression</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Expression</em>' containment reference.
+	 * @see #getExpression()
+	 * @generated
+	 */
+	void setExpression(Expression value);
+
+} // ExpressionStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ForEachStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ForEachStatement.java
new file mode 100644
index 0000000..ef41004
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ForEachStatement.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>For Each Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ForEachStatement#getIterator <em>Iterator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ForEachStatement#getEnumeration <em>Enumeration</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getForEachStatement()
+ * @model
+ * @generated
+ */
+public interface ForEachStatement extends ConditionalBlockStatement {
+	/**
+	 * Returns the value of the '<em><b>Iterator</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Iterator</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Iterator</em>' containment reference.
+	 * @see #setIterator(LeftHandSideExpression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getForEachStatement_Iterator()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	LeftHandSideExpression getIterator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ForEachStatement#getIterator <em>Iterator</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Iterator</em>' containment reference.
+	 * @see #getIterator()
+	 * @generated
+	 */
+	void setIterator(LeftHandSideExpression value);
+
+	/**
+	 * Returns the value of the '<em><b>Enumeration</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Enumeration</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Enumeration</em>' containment reference.
+	 * @see #setEnumeration(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getForEachStatement_Enumeration()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getEnumeration();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ForEachStatement#getEnumeration <em>Enumeration</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Enumeration</em>' containment reference.
+	 * @see #getEnumeration()
+	 * @generated
+	 */
+	void setEnumeration(Expression value);
+
+} // ForEachStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ForStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ForStatement.java
new file mode 100644
index 0000000..737daaf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/ForStatement.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>For Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ForStatement#getInit <em>Init</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.ForStatement#getIterate <em>Iterate</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getForStatement()
+ * @model
+ * @generated
+ */
+public interface ForStatement extends ConditionalBlockStatement {
+	/**
+	 * Returns the value of the '<em><b>Init</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Init</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Init</em>' containment reference.
+	 * @see #setInit(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getForStatement_Init()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getInit();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ForStatement#getInit <em>Init</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Init</em>' containment reference.
+	 * @see #getInit()
+	 * @generated
+	 */
+	void setInit(Expression value);
+
+	/**
+	 * Returns the value of the '<em><b>Iterate</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Iterate</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Iterate</em>' containment reference.
+	 * @see #setIterate(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getForStatement_Iterate()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getIterate();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.ForStatement#getIterate <em>Iterate</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Iterate</em>' containment reference.
+	 * @see #getIterate()
+	 * @generated
+	 */
+	void setIterate(Expression value);
+
+} // ForStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/GuardStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/GuardStatement.java
new file mode 100644
index 0000000..9ae15a7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/GuardStatement.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getGuardStatement()
+ * @model
+ * @generated
+ */
+public interface GuardStatement extends AbstractGuardStatement {
+} // GuardStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/IfStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/IfStatement.java
new file mode 100644
index 0000000..bca524c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/IfStatement.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>If Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.IfStatement#getElseifStatement <em>Elseif Statement</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.IfStatement#getElseBlock <em>Else Block</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getIfStatement()
+ * @model
+ * @generated
+ */
+public interface IfStatement extends ConditionalBlockStatement {
+	/**
+	 * Returns the value of the '<em><b>Elseif Statement</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Elseif Statement</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Elseif Statement</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getIfStatement_ElseifStatement()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<ConditionalBlockStatement> getElseifStatement();
+
+	/**
+	 * Returns the value of the '<em><b>Else Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Else Block</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Else Block</em>' containment reference.
+	 * @see #setElseBlock(BlockStatement)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getIfStatement_ElseBlock()
+	 * @model containment="true"
+	 * @generated
+	 */
+	BlockStatement getElseBlock();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.IfStatement#getElseBlock <em>Else Block</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Else Block</em>' containment reference.
+	 * @see #getElseBlock()
+	 * @generated
+	 */
+	void setElseBlock(BlockStatement value);
+
+} // IfStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InputComStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InputComStatement.java
new file mode 100644
index 0000000..17227cc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InputComStatement.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Input Com Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.InputComStatement#getLeftValue <em>Left Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInputComStatement()
+ * @model
+ * @generated
+ */
+public interface InputComStatement extends AbstractComStatement {
+	/**
+	 * Returns the value of the '<em><b>Left Value</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Value</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Value</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInputComStatement_LeftValue()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getLeftValue();
+
+} // InputComStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InterruptStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InterruptStatement.java
new file mode 100644
index 0000000..121a212
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InterruptStatement.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Interrupt Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatement#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatement#getExpr <em>Expr</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInterruptStatement()
+ * @model
+ * @generated
+ */
+public interface InterruptStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Kind</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Kind</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind
+	 * @see #setKind(InterruptStatementKind)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInterruptStatement_Kind()
+	 * @model
+	 * @generated
+	 */
+	InterruptStatementKind getKind();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatement#getKind <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Kind</em>' attribute.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind
+	 * @see #getKind()
+	 * @generated
+	 */
+	void setKind(InterruptStatementKind value);
+
+	/**
+	 * Returns the value of the '<em><b>Expr</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Expr</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Expr</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInterruptStatement_Expr()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getExpr();
+
+} // InterruptStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InterruptStatementKind.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InterruptStatementKind.java
new file mode 100644
index 0000000..5b839f8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InterruptStatementKind.java
@@ -0,0 +1,278 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Interrupt Statement Kind</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInterruptStatementKind()
+ * @model
+ * @generated
+ */
+public enum InterruptStatementKind implements Enumerator {
+	/**
+	 * The '<em><b>Break</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #BREAK_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	BREAK(0, "break", "break"),
+
+	/**
+	 * The '<em><b>Continue</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #CONTINUE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	CONTINUE(1, "continue", "continue"),
+
+	/**
+	 * The '<em><b>Return</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #RETURN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	RETURN(2, "return", "return"),
+
+	/**
+	 * The '<em><b>Exit</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #EXIT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	EXIT(3, "exit", "exit");
+
+	/**
+	 * The '<em><b>Break</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Break</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #BREAK
+	 * @model name="break"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int BREAK_VALUE = 0;
+
+	/**
+	 * The '<em><b>Continue</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Continue</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #CONTINUE
+	 * @model name="continue"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int CONTINUE_VALUE = 1;
+
+	/**
+	 * The '<em><b>Return</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Return</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #RETURN
+	 * @model name="return"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int RETURN_VALUE = 2;
+
+	/**
+	 * The '<em><b>Exit</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Exit</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #EXIT
+	 * @model name="exit"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int EXIT_VALUE = 3;
+
+	/**
+	 * An array of all the '<em><b>Interrupt Statement Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final InterruptStatementKind[] VALUES_ARRAY =
+		new InterruptStatementKind[] {
+			BREAK,
+			CONTINUE,
+			RETURN,
+			EXIT,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Interrupt Statement Kind</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<InterruptStatementKind> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Interrupt Statement Kind</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static InterruptStatementKind get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			InterruptStatementKind result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Interrupt Statement Kind</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static InterruptStatementKind getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			InterruptStatementKind result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Interrupt Statement Kind</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static InterruptStatementKind get(int value) {
+		switch (value) {
+			case BREAK_VALUE: return BREAK;
+			case CONTINUE_VALUE: return CONTINUE;
+			case RETURN_VALUE: return RETURN;
+			case EXIT_VALUE: return EXIT;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private InterruptStatementKind(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //InterruptStatementKind
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InvokeStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InvokeStatement.java
new file mode 100644
index 0000000..e3a3a72
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/InvokeStatement.java
@@ -0,0 +1,194 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Invoke Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#isCallProcedure <em>Call Procedure</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#isExecRoutine <em>Exec Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getInvokable <em>Invokable</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getArgs <em>Args</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getRets <em>Rets</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getExpression <em>Expression</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInvokeStatement()
+ * @model
+ * @generated
+ */
+public interface InvokeStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Call Procedure</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Call Procedure</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Call Procedure</em>' attribute.
+	 * @see #setCallProcedure(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInvokeStatement_CallProcedure()
+	 * @model default="false"
+	 * @generated
+	 */
+	boolean isCallProcedure();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#isCallProcedure <em>Call Procedure</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Call Procedure</em>' attribute.
+	 * @see #isCallProcedure()
+	 * @generated
+	 */
+	void setCallProcedure(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Exec Routine</b></em>' attribute.
+	 * The default value is <code>"false"</code>.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Exec Routine</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Exec Routine</em>' attribute.
+	 * @see #setExecRoutine(boolean)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInvokeStatement_ExecRoutine()
+	 * @model default="false"
+	 * @generated
+	 */
+	boolean isExecRoutine();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#isExecRoutine <em>Exec Routine</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Exec Routine</em>' attribute.
+	 * @see #isExecRoutine()
+	 * @generated
+	 */
+	void setExecRoutine(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Invokable</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Invokable</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Invokable</em>' reference.
+	 * @see #setInvokable(NamedElement)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInvokeStatement_Invokable()
+	 * @model
+	 * @generated
+	 */
+	NamedElement getInvokable();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getInvokable <em>Invokable</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Invokable</em>' reference.
+	 * @see #getInvokable()
+	 * @generated
+	 */
+	void setInvokable(NamedElement value);
+
+	/**
+	 * Returns the value of the '<em><b>Args</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Args</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Args</em>' containment reference.
+	 * @see #setArgs(TupleExpression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInvokeStatement_Args()
+	 * @model containment="true"
+	 * @generated
+	 */
+	TupleExpression getArgs();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getArgs <em>Args</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Args</em>' containment reference.
+	 * @see #getArgs()
+	 * @generated
+	 */
+	void setArgs(TupleExpression value);
+
+	/**
+	 * Returns the value of the '<em><b>Rets</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.infrastructure.Variable}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Rets</em>' reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Rets</em>' reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInvokeStatement_Rets()
+	 * @model
+	 * @generated
+	 */
+	EList<Variable> getRets();
+
+	/**
+	 * Returns the value of the '<em><b>Expression</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Expression</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Expression</em>' containment reference.
+	 * @see #setExpression(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getInvokeStatement_Expression()
+	 * @model containment="true"
+	 * @generated
+	 */
+	Expression getExpression();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getExpression <em>Expression</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Expression</em>' containment reference.
+	 * @see #getExpression()
+	 * @generated
+	 */
+	void setExpression(Expression value);
+
+} // InvokeStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/NewfreshStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/NewfreshStatement.java
new file mode 100644
index 0000000..9decea1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/NewfreshStatement.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Newfresh Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.NewfreshStatement#getLeftValue <em>Left Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getNewfreshStatement()
+ * @model
+ * @generated
+ */
+public interface NewfreshStatement extends Statement {
+	/**
+	 * Returns the value of the '<em><b>Left Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Value</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Value</em>' containment reference.
+	 * @see #setLeftValue(Expression)
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getNewfreshStatement_LeftValue()
+	 * @model containment="true" required="true"
+	 * @generated
+	 */
+	Expression getLeftValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.efm.ecore.formalml.statement.NewfreshStatement#getLeftValue <em>Left Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Left Value</em>' containment reference.
+	 * @see #getLeftValue()
+	 * @generated
+	 */
+	void setLeftValue(Expression value);
+
+} // NewfreshStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/OutputComStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/OutputComStatement.java
new file mode 100644
index 0000000..3ef9c13
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/OutputComStatement.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Output Com Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.OutputComStatement#getRigthValue <em>Rigth Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getOutputComStatement()
+ * @model
+ * @generated
+ */
+public interface OutputComStatement extends AbstractComStatement {
+	/**
+	 * Returns the value of the '<em><b>Rigth Value</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.efm.ecore.formalml.expression.Expression}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Rigth Value</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Rigth Value</em>' containment reference list.
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getOutputComStatement_RigthValue()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<Expression> getRigthValue();
+
+} // OutputComStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/Statement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/Statement.java
new file mode 100644
index 0000000..7a9af33
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/Statement.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getStatement()
+ * @model abstract="true"
+ * @generated
+ */
+public interface Statement extends EObject {
+} // Statement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/StatementFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/StatementFactory.java
new file mode 100644
index 0000000..5073a67
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/StatementFactory.java
@@ -0,0 +1,214 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage
+ * @generated
+ */
+public interface StatementFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	StatementFactory eINSTANCE = org.eclipse.efm.ecore.formalml.statement.impl.StatementFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Block Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Block Statement</em>'.
+	 * @generated
+	 */
+	BlockStatement createBlockStatement();
+
+	/**
+	 * Returns a new object of class '<em>Expression Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Expression Statement</em>'.
+	 * @generated
+	 */
+	ExpressionStatement createExpressionStatement();
+
+	/**
+	 * Returns a new object of class '<em>Assignment Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Assignment Statement</em>'.
+	 * @generated
+	 */
+	AssignmentStatement createAssignmentStatement();
+
+	/**
+	 * Returns a new object of class '<em>Newfresh Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Newfresh Statement</em>'.
+	 * @generated
+	 */
+	NewfreshStatement createNewfreshStatement();
+
+	/**
+	 * Returns a new object of class '<em>Guard Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Guard Statement</em>'.
+	 * @generated
+	 */
+	GuardStatement createGuardStatement();
+
+	/**
+	 * Returns a new object of class '<em>Timed Guard Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Timed Guard Statement</em>'.
+	 * @generated
+	 */
+	TimedGuardStatement createTimedGuardStatement();
+
+	/**
+	 * Returns a new object of class '<em>Event Guard Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Event Guard Statement</em>'.
+	 * @generated
+	 */
+	EventGuardStatement createEventGuardStatement();
+
+	/**
+	 * Returns a new object of class '<em>Check Sat Guard Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Check Sat Guard Statement</em>'.
+	 * @generated
+	 */
+	CheckSatGuardStatement createCheckSatGuardStatement();
+
+	/**
+	 * Returns a new object of class '<em>Input Com Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Input Com Statement</em>'.
+	 * @generated
+	 */
+	InputComStatement createInputComStatement();
+
+	/**
+	 * Returns a new object of class '<em>Output Com Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Output Com Statement</em>'.
+	 * @generated
+	 */
+	OutputComStatement createOutputComStatement();
+
+	/**
+	 * Returns a new object of class '<em>Conditional Block Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Conditional Block Statement</em>'.
+	 * @generated
+	 */
+	ConditionalBlockStatement createConditionalBlockStatement();
+
+	/**
+	 * Returns a new object of class '<em>If Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>If Statement</em>'.
+	 * @generated
+	 */
+	IfStatement createIfStatement();
+
+	/**
+	 * Returns a new object of class '<em>While Do Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>While Do Statement</em>'.
+	 * @generated
+	 */
+	WhileDoStatement createWhileDoStatement();
+
+	/**
+	 * Returns a new object of class '<em>Do While Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Do While Statement</em>'.
+	 * @generated
+	 */
+	DoWhileStatement createDoWhileStatement();
+
+	/**
+	 * Returns a new object of class '<em>For Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>For Statement</em>'.
+	 * @generated
+	 */
+	ForStatement createForStatement();
+
+	/**
+	 * Returns a new object of class '<em>For Each Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>For Each Statement</em>'.
+	 * @generated
+	 */
+	ForEachStatement createForEachStatement();
+
+	/**
+	 * Returns a new object of class '<em>Interrupt Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Interrupt Statement</em>'.
+	 * @generated
+	 */
+	InterruptStatement createInterruptStatement();
+
+	/**
+	 * Returns a new object of class '<em>Activity Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Activity Statement</em>'.
+	 * @generated
+	 */
+	ActivityStatement createActivityStatement();
+
+	/**
+	 * Returns a new object of class '<em>Invoke Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Invoke Statement</em>'.
+	 * @generated
+	 */
+	InvokeStatement createInvokeStatement();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	StatementPackage getStatementPackage();
+
+} //StatementFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/StatementPackage.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/StatementPackage.java
new file mode 100644
index 0000000..95c6353
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/StatementPackage.java
@@ -0,0 +1,2374 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface StatementPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "statement";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efm/FormalML/Statement";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "Statement";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	StatementPackage eINSTANCE = org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.StatementImpl <em>Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getStatement()
+	 * @generated
+	 */
+	int STATEMENT = 0;
+
+	/**
+	 * The number of structural features of the '<em>Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMENT_FEATURE_COUNT = 0;
+
+	/**
+	 * The number of operations of the '<em>Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STATEMENT_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.BlockStatementImpl <em>Block Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.BlockStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getBlockStatement()
+	 * @generated
+	 */
+	int BLOCK_STATEMENT = 1;
+
+	/**
+	 * The feature id for the '<em><b>Op</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCK_STATEMENT__OP = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Statement</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCK_STATEMENT__STATEMENT = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Block Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCK_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Block Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCK_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ExpressionStatementImpl <em>Expression Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.ExpressionStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getExpressionStatement()
+	 * @generated
+	 */
+	int EXPRESSION_STATEMENT = 2;
+
+	/**
+	 * The feature id for the '<em><b>Expression</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_STATEMENT__EXPRESSION = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Expression Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Expression Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXPRESSION_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.AssignmentStatementImpl <em>Assignment Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.AssignmentStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getAssignmentStatement()
+	 * @generated
+	 */
+	int ASSIGNMENT_STATEMENT = 3;
+
+	/**
+	 * The feature id for the '<em><b>Expression</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_STATEMENT__EXPRESSION = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_STATEMENT__OPERATOR = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Left Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE = STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Rigth Hand Side</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE = STATEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Assignment Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Assignment Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSIGNMENT_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.NewfreshStatementImpl <em>Newfresh Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.NewfreshStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getNewfreshStatement()
+	 * @generated
+	 */
+	int NEWFRESH_STATEMENT = 4;
+
+	/**
+	 * The feature id for the '<em><b>Left Value</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NEWFRESH_STATEMENT__LEFT_VALUE = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Newfresh Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NEWFRESH_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Newfresh Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NEWFRESH_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.AbstractGuardStatementImpl <em>Abstract Guard Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.AbstractGuardStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getAbstractGuardStatement()
+	 * @generated
+	 */
+	int ABSTRACT_GUARD_STATEMENT = 5;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_GUARD_STATEMENT__CONDITION = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Abstract Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_GUARD_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Abstract Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_GUARD_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.GuardStatementImpl <em>Guard Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.GuardStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getGuardStatement()
+	 * @generated
+	 */
+	int GUARD_STATEMENT = 6;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int GUARD_STATEMENT__CONDITION = ABSTRACT_GUARD_STATEMENT__CONDITION;
+
+	/**
+	 * The number of structural features of the '<em>Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int GUARD_STATEMENT_FEATURE_COUNT = ABSTRACT_GUARD_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int GUARD_STATEMENT_OPERATION_COUNT = ABSTRACT_GUARD_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.TimedGuardStatementImpl <em>Timed Guard Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.TimedGuardStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getTimedGuardStatement()
+	 * @generated
+	 */
+	int TIMED_GUARD_STATEMENT = 7;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TIMED_GUARD_STATEMENT__CONDITION = ABSTRACT_GUARD_STATEMENT__CONDITION;
+
+	/**
+	 * The number of structural features of the '<em>Timed Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TIMED_GUARD_STATEMENT_FEATURE_COUNT = ABSTRACT_GUARD_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Timed Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TIMED_GUARD_STATEMENT_OPERATION_COUNT = ABSTRACT_GUARD_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.EventGuardStatementImpl <em>Event Guard Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.EventGuardStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getEventGuardStatement()
+	 * @generated
+	 */
+	int EVENT_GUARD_STATEMENT = 8;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EVENT_GUARD_STATEMENT__CONDITION = ABSTRACT_GUARD_STATEMENT__CONDITION;
+
+	/**
+	 * The number of structural features of the '<em>Event Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EVENT_GUARD_STATEMENT_FEATURE_COUNT = ABSTRACT_GUARD_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Event Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EVENT_GUARD_STATEMENT_OPERATION_COUNT = ABSTRACT_GUARD_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.CheckSatGuardStatementImpl <em>Check Sat Guard Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.CheckSatGuardStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getCheckSatGuardStatement()
+	 * @generated
+	 */
+	int CHECK_SAT_GUARD_STATEMENT = 9;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHECK_SAT_GUARD_STATEMENT__CONDITION = ABSTRACT_GUARD_STATEMENT__CONDITION;
+
+	/**
+	 * The feature id for the '<em><b>Solver</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHECK_SAT_GUARD_STATEMENT__SOLVER = ABSTRACT_GUARD_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Check Sat Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHECK_SAT_GUARD_STATEMENT_FEATURE_COUNT = ABSTRACT_GUARD_STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Check Sat Guard Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHECK_SAT_GUARD_STATEMENT_OPERATION_COUNT = ABSTRACT_GUARD_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.AbstractComStatementImpl <em>Abstract Com Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.AbstractComStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getAbstractComStatement()
+	 * @generated
+	 */
+	int ABSTRACT_COM_STATEMENT = 10;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_COM_STATEMENT__PORT = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Route</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_COM_STATEMENT__ROUTE = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Target</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_COM_STATEMENT__TARGET = STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Abstract Com Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_COM_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Abstract Com Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_COM_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.InputComStatementImpl <em>Input Com Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.InputComStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getInputComStatement()
+	 * @generated
+	 */
+	int INPUT_COM_STATEMENT = 11;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INPUT_COM_STATEMENT__PORT = ABSTRACT_COM_STATEMENT__PORT;
+
+	/**
+	 * The feature id for the '<em><b>Route</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INPUT_COM_STATEMENT__ROUTE = ABSTRACT_COM_STATEMENT__ROUTE;
+
+	/**
+	 * The feature id for the '<em><b>Target</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INPUT_COM_STATEMENT__TARGET = ABSTRACT_COM_STATEMENT__TARGET;
+
+	/**
+	 * The feature id for the '<em><b>Left Value</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INPUT_COM_STATEMENT__LEFT_VALUE = ABSTRACT_COM_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Input Com Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INPUT_COM_STATEMENT_FEATURE_COUNT = ABSTRACT_COM_STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Input Com Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INPUT_COM_STATEMENT_OPERATION_COUNT = ABSTRACT_COM_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.OutputComStatementImpl <em>Output Com Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.OutputComStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getOutputComStatement()
+	 * @generated
+	 */
+	int OUTPUT_COM_STATEMENT = 12;
+
+	/**
+	 * The feature id for the '<em><b>Port</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OUTPUT_COM_STATEMENT__PORT = ABSTRACT_COM_STATEMENT__PORT;
+
+	/**
+	 * The feature id for the '<em><b>Route</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OUTPUT_COM_STATEMENT__ROUTE = ABSTRACT_COM_STATEMENT__ROUTE;
+
+	/**
+	 * The feature id for the '<em><b>Target</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OUTPUT_COM_STATEMENT__TARGET = ABSTRACT_COM_STATEMENT__TARGET;
+
+	/**
+	 * The feature id for the '<em><b>Rigth Value</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OUTPUT_COM_STATEMENT__RIGTH_VALUE = ABSTRACT_COM_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Output Com Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OUTPUT_COM_STATEMENT_FEATURE_COUNT = ABSTRACT_COM_STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of operations of the '<em>Output Com Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OUTPUT_COM_STATEMENT_OPERATION_COUNT = ABSTRACT_COM_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ConditionalBlockStatementImpl <em>Conditional Block Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.ConditionalBlockStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getConditionalBlockStatement()
+	 * @generated
+	 */
+	int CONDITIONAL_BLOCK_STATEMENT = 13;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_BLOCK_STATEMENT__CONDITION = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Body Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Conditional Block Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Conditional Block Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONDITIONAL_BLOCK_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.IfStatementImpl <em>If Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.IfStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getIfStatement()
+	 * @generated
+	 */
+	int IF_STATEMENT = 14;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IF_STATEMENT__CONDITION = CONDITIONAL_BLOCK_STATEMENT__CONDITION;
+
+	/**
+	 * The feature id for the '<em><b>Body Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IF_STATEMENT__BODY_BLOCK = CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK;
+
+	/**
+	 * The feature id for the '<em><b>Elseif Statement</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IF_STATEMENT__ELSEIF_STATEMENT = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Else Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IF_STATEMENT__ELSE_BLOCK = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>If Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IF_STATEMENT_FEATURE_COUNT = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>If Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IF_STATEMENT_OPERATION_COUNT = CONDITIONAL_BLOCK_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.WhileDoStatementImpl <em>While Do Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.WhileDoStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getWhileDoStatement()
+	 * @generated
+	 */
+	int WHILE_DO_STATEMENT = 15;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WHILE_DO_STATEMENT__CONDITION = CONDITIONAL_BLOCK_STATEMENT__CONDITION;
+
+	/**
+	 * The feature id for the '<em><b>Body Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WHILE_DO_STATEMENT__BODY_BLOCK = CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK;
+
+	/**
+	 * The number of structural features of the '<em>While Do Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WHILE_DO_STATEMENT_FEATURE_COUNT = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>While Do Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int WHILE_DO_STATEMENT_OPERATION_COUNT = CONDITIONAL_BLOCK_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.DoWhileStatementImpl <em>Do While Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.DoWhileStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getDoWhileStatement()
+	 * @generated
+	 */
+	int DO_WHILE_STATEMENT = 16;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DO_WHILE_STATEMENT__CONDITION = CONDITIONAL_BLOCK_STATEMENT__CONDITION;
+
+	/**
+	 * The feature id for the '<em><b>Body Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DO_WHILE_STATEMENT__BODY_BLOCK = CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK;
+
+	/**
+	 * The number of structural features of the '<em>Do While Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DO_WHILE_STATEMENT_FEATURE_COUNT = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Do While Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DO_WHILE_STATEMENT_OPERATION_COUNT = CONDITIONAL_BLOCK_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ForStatementImpl <em>For Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.ForStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getForStatement()
+	 * @generated
+	 */
+	int FOR_STATEMENT = 17;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_STATEMENT__CONDITION = CONDITIONAL_BLOCK_STATEMENT__CONDITION;
+
+	/**
+	 * The feature id for the '<em><b>Body Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_STATEMENT__BODY_BLOCK = CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK;
+
+	/**
+	 * The feature id for the '<em><b>Init</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_STATEMENT__INIT = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Iterate</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_STATEMENT__ITERATE = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>For Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_STATEMENT_FEATURE_COUNT = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>For Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_STATEMENT_OPERATION_COUNT = CONDITIONAL_BLOCK_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ForEachStatementImpl <em>For Each Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.ForEachStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getForEachStatement()
+	 * @generated
+	 */
+	int FOR_EACH_STATEMENT = 18;
+
+	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_EACH_STATEMENT__CONDITION = CONDITIONAL_BLOCK_STATEMENT__CONDITION;
+
+	/**
+	 * The feature id for the '<em><b>Body Block</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_EACH_STATEMENT__BODY_BLOCK = CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK;
+
+	/**
+	 * The feature id for the '<em><b>Iterator</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_EACH_STATEMENT__ITERATOR = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Enumeration</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_EACH_STATEMENT__ENUMERATION = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>For Each Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_EACH_STATEMENT_FEATURE_COUNT = CONDITIONAL_BLOCK_STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>For Each Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FOR_EACH_STATEMENT_OPERATION_COUNT = CONDITIONAL_BLOCK_STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.InterruptStatementImpl <em>Interrupt Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.InterruptStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getInterruptStatement()
+	 * @generated
+	 */
+	int INTERRUPT_STATEMENT = 19;
+
+	/**
+	 * The feature id for the '<em><b>Kind</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERRUPT_STATEMENT__KIND = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Expr</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERRUPT_STATEMENT__EXPR = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Interrupt Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERRUPT_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of operations of the '<em>Interrupt Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTERRUPT_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ActivityStatementImpl <em>Activity Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.ActivityStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getActivityStatement()
+	 * @generated
+	 */
+	int ACTIVITY_STATEMENT = 20;
+
+	/**
+	 * The feature id for the '<em><b>Op</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ACTIVITY_STATEMENT__OP = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Machine</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ACTIVITY_STATEMENT__MACHINE = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Tuple</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ACTIVITY_STATEMENT__TUPLE = STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Activity Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ACTIVITY_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of operations of the '<em>Activity Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ACTIVITY_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl <em>Invoke Statement</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getInvokeStatement()
+	 * @generated
+	 */
+	int INVOKE_STATEMENT = 21;
+
+	/**
+	 * The feature id for the '<em><b>Call Procedure</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_STATEMENT__CALL_PROCEDURE = STATEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Exec Routine</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_STATEMENT__EXEC_ROUTINE = STATEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Invokable</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_STATEMENT__INVOKABLE = STATEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Args</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_STATEMENT__ARGS = STATEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Rets</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_STATEMENT__RETS = STATEMENT_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Expression</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_STATEMENT__EXPRESSION = STATEMENT_FEATURE_COUNT + 5;
+
+	/**
+	 * The number of structural features of the '<em>Invoke Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_STATEMENT_FEATURE_COUNT = STATEMENT_FEATURE_COUNT + 6;
+
+	/**
+	 * The number of operations of the '<em>Invoke Statement</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVOKE_STATEMENT_OPERATION_COUNT = STATEMENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind <em>Interrupt Statement Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getInterruptStatementKind()
+	 * @generated
+	 */
+	int INTERRUPT_STATEMENT_KIND = 22;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind <em>Activity Statement Kind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getActivityStatementKind()
+	 * @generated
+	 */
+	int ACTIVITY_STATEMENT_KIND = 23;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatementkind <em>Assignment Statementkind</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.efm.ecore.formalml.statement.AssignmentStatementkind
+	 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getAssignmentStatementkind()
+	 * @generated
+	 */
+	int ASSIGNMENT_STATEMENTKIND = 24;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.Statement <em>Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.Statement
+	 * @generated
+	 */
+	EClass getStatement();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.BlockStatement <em>Block Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Block Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.BlockStatement
+	 * @generated
+	 */
+	EClass getBlockStatement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statement.BlockStatement#getOp <em>Op</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Op</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.BlockStatement#getOp()
+	 * @see #getBlockStatement()
+	 * @generated
+	 */
+	EAttribute getBlockStatement_Op();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statement.BlockStatement#getStatement <em>Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.BlockStatement#getStatement()
+	 * @see #getBlockStatement()
+	 * @generated
+	 */
+	EReference getBlockStatement_Statement();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.ExpressionStatement <em>Expression Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Expression Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ExpressionStatement
+	 * @generated
+	 */
+	EClass getExpressionStatement();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.ExpressionStatement#getExpression <em>Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ExpressionStatement#getExpression()
+	 * @see #getExpressionStatement()
+	 * @generated
+	 */
+	EReference getExpressionStatement_Expression();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement <em>Assignment Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Assignment Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AssignmentStatement
+	 * @generated
+	 */
+	EClass getAssignmentStatement();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getExpression <em>Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getExpression()
+	 * @see #getAssignmentStatement()
+	 * @generated
+	 */
+	EReference getAssignmentStatement_Expression();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getOperator <em>Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getOperator()
+	 * @see #getAssignmentStatement()
+	 * @generated
+	 */
+	EAttribute getAssignmentStatement_Operator();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getLeftHandSide <em>Left Hand Side</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Left Hand Side</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getLeftHandSide()
+	 * @see #getAssignmentStatement()
+	 * @generated
+	 */
+	EReference getAssignmentStatement_LeftHandSide();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getRigthHandSide <em>Rigth Hand Side</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Rigth Hand Side</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AssignmentStatement#getRigthHandSide()
+	 * @see #getAssignmentStatement()
+	 * @generated
+	 */
+	EReference getAssignmentStatement_RigthHandSide();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.NewfreshStatement <em>Newfresh Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Newfresh Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.NewfreshStatement
+	 * @generated
+	 */
+	EClass getNewfreshStatement();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.NewfreshStatement#getLeftValue <em>Left Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Left Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.NewfreshStatement#getLeftValue()
+	 * @see #getNewfreshStatement()
+	 * @generated
+	 */
+	EReference getNewfreshStatement_LeftValue();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement <em>Abstract Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Abstract Guard Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement
+	 * @generated
+	 */
+	EClass getAbstractGuardStatement();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement#getCondition <em>Condition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Condition</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement#getCondition()
+	 * @see #getAbstractGuardStatement()
+	 * @generated
+	 */
+	EReference getAbstractGuardStatement_Condition();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.GuardStatement <em>Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Guard Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.GuardStatement
+	 * @generated
+	 */
+	EClass getGuardStatement();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement <em>Timed Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Timed Guard Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement
+	 * @generated
+	 */
+	EClass getTimedGuardStatement();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.EventGuardStatement <em>Event Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Event Guard Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.EventGuardStatement
+	 * @generated
+	 */
+	EClass getEventGuardStatement();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement <em>Check Sat Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Check Sat Guard Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement
+	 * @generated
+	 */
+	EClass getCheckSatGuardStatement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement#getSolver <em>Solver</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Solver</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement#getSolver()
+	 * @see #getCheckSatGuardStatement()
+	 * @generated
+	 */
+	EAttribute getCheckSatGuardStatement_Solver();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement <em>Abstract Com Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Abstract Com Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AbstractComStatement
+	 * @generated
+	 */
+	EClass getAbstractComStatement();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getPort <em>Port</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Port</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getPort()
+	 * @see #getAbstractComStatement()
+	 * @generated
+	 */
+	EReference getAbstractComStatement_Port();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getRoute <em>Route</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Route</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getRoute()
+	 * @see #getAbstractComStatement()
+	 * @generated
+	 */
+	EReference getAbstractComStatement_Route();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getTarget <em>Target</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Target</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AbstractComStatement#getTarget()
+	 * @see #getAbstractComStatement()
+	 * @generated
+	 */
+	EReference getAbstractComStatement_Target();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.InputComStatement <em>Input Com Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Input Com Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InputComStatement
+	 * @generated
+	 */
+	EClass getInputComStatement();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statement.InputComStatement#getLeftValue <em>Left Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Left Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InputComStatement#getLeftValue()
+	 * @see #getInputComStatement()
+	 * @generated
+	 */
+	EReference getInputComStatement_LeftValue();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.OutputComStatement <em>Output Com Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Output Com Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.OutputComStatement
+	 * @generated
+	 */
+	EClass getOutputComStatement();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statement.OutputComStatement#getRigthValue <em>Rigth Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Rigth Value</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.OutputComStatement#getRigthValue()
+	 * @see #getOutputComStatement()
+	 * @generated
+	 */
+	EReference getOutputComStatement_RigthValue();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement <em>Conditional Block Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Conditional Block Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement
+	 * @generated
+	 */
+	EClass getConditionalBlockStatement();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement#getCondition <em>Condition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Condition</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement#getCondition()
+	 * @see #getConditionalBlockStatement()
+	 * @generated
+	 */
+	EReference getConditionalBlockStatement_Condition();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement#getBodyBlock <em>Body Block</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Body Block</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement#getBodyBlock()
+	 * @see #getConditionalBlockStatement()
+	 * @generated
+	 */
+	EReference getConditionalBlockStatement_BodyBlock();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.IfStatement <em>If Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>If Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.IfStatement
+	 * @generated
+	 */
+	EClass getIfStatement();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statement.IfStatement#getElseifStatement <em>Elseif Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Elseif Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.IfStatement#getElseifStatement()
+	 * @see #getIfStatement()
+	 * @generated
+	 */
+	EReference getIfStatement_ElseifStatement();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.IfStatement#getElseBlock <em>Else Block</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Else Block</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.IfStatement#getElseBlock()
+	 * @see #getIfStatement()
+	 * @generated
+	 */
+	EReference getIfStatement_ElseBlock();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.WhileDoStatement <em>While Do Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>While Do Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.WhileDoStatement
+	 * @generated
+	 */
+	EClass getWhileDoStatement();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.DoWhileStatement <em>Do While Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Do While Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.DoWhileStatement
+	 * @generated
+	 */
+	EClass getDoWhileStatement();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.ForStatement <em>For Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>For Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ForStatement
+	 * @generated
+	 */
+	EClass getForStatement();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.ForStatement#getInit <em>Init</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Init</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ForStatement#getInit()
+	 * @see #getForStatement()
+	 * @generated
+	 */
+	EReference getForStatement_Init();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.ForStatement#getIterate <em>Iterate</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Iterate</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ForStatement#getIterate()
+	 * @see #getForStatement()
+	 * @generated
+	 */
+	EReference getForStatement_Iterate();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.ForEachStatement <em>For Each Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>For Each Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ForEachStatement
+	 * @generated
+	 */
+	EClass getForEachStatement();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.ForEachStatement#getIterator <em>Iterator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Iterator</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ForEachStatement#getIterator()
+	 * @see #getForEachStatement()
+	 * @generated
+	 */
+	EReference getForEachStatement_Iterator();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.ForEachStatement#getEnumeration <em>Enumeration</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Enumeration</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ForEachStatement#getEnumeration()
+	 * @see #getForEachStatement()
+	 * @generated
+	 */
+	EReference getForEachStatement_Enumeration();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatement <em>Interrupt Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Interrupt Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InterruptStatement
+	 * @generated
+	 */
+	EClass getInterruptStatement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatement#getKind <em>Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InterruptStatement#getKind()
+	 * @see #getInterruptStatement()
+	 * @generated
+	 */
+	EAttribute getInterruptStatement_Kind();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatement#getExpr <em>Expr</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Expr</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InterruptStatement#getExpr()
+	 * @see #getInterruptStatement()
+	 * @generated
+	 */
+	EReference getInterruptStatement_Expr();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement <em>Activity Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Activity Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatement
+	 * @generated
+	 */
+	EClass getActivityStatement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getOp <em>Op</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Op</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getOp()
+	 * @see #getActivityStatement()
+	 * @generated
+	 */
+	EAttribute getActivityStatement_Op();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getMachine <em>Machine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Machine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getMachine()
+	 * @see #getActivityStatement()
+	 * @generated
+	 */
+	EReference getActivityStatement_Machine();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getTuple <em>Tuple</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Tuple</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatement#getTuple()
+	 * @see #getActivityStatement()
+	 * @generated
+	 */
+	EReference getActivityStatement_Tuple();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement <em>Invoke Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Invoke Statement</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InvokeStatement
+	 * @generated
+	 */
+	EClass getInvokeStatement();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#isCallProcedure <em>Call Procedure</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Call Procedure</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InvokeStatement#isCallProcedure()
+	 * @see #getInvokeStatement()
+	 * @generated
+	 */
+	EAttribute getInvokeStatement_CallProcedure();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#isExecRoutine <em>Exec Routine</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Exec Routine</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InvokeStatement#isExecRoutine()
+	 * @see #getInvokeStatement()
+	 * @generated
+	 */
+	EAttribute getInvokeStatement_ExecRoutine();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getInvokable <em>Invokable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Invokable</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getInvokable()
+	 * @see #getInvokeStatement()
+	 * @generated
+	 */
+	EReference getInvokeStatement_Invokable();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getArgs <em>Args</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Args</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getArgs()
+	 * @see #getInvokeStatement()
+	 * @generated
+	 */
+	EReference getInvokeStatement_Args();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getRets <em>Rets</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Rets</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getRets()
+	 * @see #getInvokeStatement()
+	 * @generated
+	 */
+	EReference getInvokeStatement_Rets();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getExpression <em>Expression</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Expression</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InvokeStatement#getExpression()
+	 * @see #getInvokeStatement()
+	 * @generated
+	 */
+	EReference getInvokeStatement_Expression();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind <em>Interrupt Statement Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Interrupt Statement Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind
+	 * @generated
+	 */
+	EEnum getInterruptStatementKind();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind <em>Activity Statement Kind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Activity Statement Kind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind
+	 * @generated
+	 */
+	EEnum getActivityStatementKind();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatementkind <em>Assignment Statementkind</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Assignment Statementkind</em>'.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AssignmentStatementkind
+	 * @generated
+	 */
+	EEnum getAssignmentStatementkind();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	StatementFactory getStatementFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.StatementImpl <em>Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getStatement()
+		 * @generated
+		 */
+		EClass STATEMENT = eINSTANCE.getStatement();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.BlockStatementImpl <em>Block Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.BlockStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getBlockStatement()
+		 * @generated
+		 */
+		EClass BLOCK_STATEMENT = eINSTANCE.getBlockStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Op</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute BLOCK_STATEMENT__OP = eINSTANCE.getBlockStatement_Op();
+
+		/**
+		 * The meta object literal for the '<em><b>Statement</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BLOCK_STATEMENT__STATEMENT = eINSTANCE.getBlockStatement_Statement();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ExpressionStatementImpl <em>Expression Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.ExpressionStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getExpressionStatement()
+		 * @generated
+		 */
+		EClass EXPRESSION_STATEMENT = eINSTANCE.getExpressionStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Expression</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXPRESSION_STATEMENT__EXPRESSION = eINSTANCE.getExpressionStatement_Expression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.AssignmentStatementImpl <em>Assignment Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.AssignmentStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getAssignmentStatement()
+		 * @generated
+		 */
+		EClass ASSIGNMENT_STATEMENT = eINSTANCE.getAssignmentStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Expression</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ASSIGNMENT_STATEMENT__EXPRESSION = eINSTANCE.getAssignmentStatement_Expression();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute ASSIGNMENT_STATEMENT__OPERATOR = eINSTANCE.getAssignmentStatement_Operator();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Hand Side</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE = eINSTANCE.getAssignmentStatement_LeftHandSide();
+
+		/**
+		 * The meta object literal for the '<em><b>Rigth Hand Side</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE = eINSTANCE.getAssignmentStatement_RigthHandSide();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.NewfreshStatementImpl <em>Newfresh Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.NewfreshStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getNewfreshStatement()
+		 * @generated
+		 */
+		EClass NEWFRESH_STATEMENT = eINSTANCE.getNewfreshStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Value</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference NEWFRESH_STATEMENT__LEFT_VALUE = eINSTANCE.getNewfreshStatement_LeftValue();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.AbstractGuardStatementImpl <em>Abstract Guard Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.AbstractGuardStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getAbstractGuardStatement()
+		 * @generated
+		 */
+		EClass ABSTRACT_GUARD_STATEMENT = eINSTANCE.getAbstractGuardStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Condition</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ABSTRACT_GUARD_STATEMENT__CONDITION = eINSTANCE.getAbstractGuardStatement_Condition();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.GuardStatementImpl <em>Guard Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.GuardStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getGuardStatement()
+		 * @generated
+		 */
+		EClass GUARD_STATEMENT = eINSTANCE.getGuardStatement();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.TimedGuardStatementImpl <em>Timed Guard Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.TimedGuardStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getTimedGuardStatement()
+		 * @generated
+		 */
+		EClass TIMED_GUARD_STATEMENT = eINSTANCE.getTimedGuardStatement();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.EventGuardStatementImpl <em>Event Guard Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.EventGuardStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getEventGuardStatement()
+		 * @generated
+		 */
+		EClass EVENT_GUARD_STATEMENT = eINSTANCE.getEventGuardStatement();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.CheckSatGuardStatementImpl <em>Check Sat Guard Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.CheckSatGuardStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getCheckSatGuardStatement()
+		 * @generated
+		 */
+		EClass CHECK_SAT_GUARD_STATEMENT = eINSTANCE.getCheckSatGuardStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Solver</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CHECK_SAT_GUARD_STATEMENT__SOLVER = eINSTANCE.getCheckSatGuardStatement_Solver();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.AbstractComStatementImpl <em>Abstract Com Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.AbstractComStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getAbstractComStatement()
+		 * @generated
+		 */
+		EClass ABSTRACT_COM_STATEMENT = eINSTANCE.getAbstractComStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Port</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ABSTRACT_COM_STATEMENT__PORT = eINSTANCE.getAbstractComStatement_Port();
+
+		/**
+		 * The meta object literal for the '<em><b>Route</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ABSTRACT_COM_STATEMENT__ROUTE = eINSTANCE.getAbstractComStatement_Route();
+
+		/**
+		 * The meta object literal for the '<em><b>Target</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ABSTRACT_COM_STATEMENT__TARGET = eINSTANCE.getAbstractComStatement_Target();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.InputComStatementImpl <em>Input Com Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.InputComStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getInputComStatement()
+		 * @generated
+		 */
+		EClass INPUT_COM_STATEMENT = eINSTANCE.getInputComStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Value</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INPUT_COM_STATEMENT__LEFT_VALUE = eINSTANCE.getInputComStatement_LeftValue();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.OutputComStatementImpl <em>Output Com Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.OutputComStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getOutputComStatement()
+		 * @generated
+		 */
+		EClass OUTPUT_COM_STATEMENT = eINSTANCE.getOutputComStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Rigth Value</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference OUTPUT_COM_STATEMENT__RIGTH_VALUE = eINSTANCE.getOutputComStatement_RigthValue();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ConditionalBlockStatementImpl <em>Conditional Block Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.ConditionalBlockStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getConditionalBlockStatement()
+		 * @generated
+		 */
+		EClass CONDITIONAL_BLOCK_STATEMENT = eINSTANCE.getConditionalBlockStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Condition</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CONDITIONAL_BLOCK_STATEMENT__CONDITION = eINSTANCE.getConditionalBlockStatement_Condition();
+
+		/**
+		 * The meta object literal for the '<em><b>Body Block</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK = eINSTANCE.getConditionalBlockStatement_BodyBlock();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.IfStatementImpl <em>If Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.IfStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getIfStatement()
+		 * @generated
+		 */
+		EClass IF_STATEMENT = eINSTANCE.getIfStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Elseif Statement</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference IF_STATEMENT__ELSEIF_STATEMENT = eINSTANCE.getIfStatement_ElseifStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Else Block</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference IF_STATEMENT__ELSE_BLOCK = eINSTANCE.getIfStatement_ElseBlock();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.WhileDoStatementImpl <em>While Do Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.WhileDoStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getWhileDoStatement()
+		 * @generated
+		 */
+		EClass WHILE_DO_STATEMENT = eINSTANCE.getWhileDoStatement();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.DoWhileStatementImpl <em>Do While Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.DoWhileStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getDoWhileStatement()
+		 * @generated
+		 */
+		EClass DO_WHILE_STATEMENT = eINSTANCE.getDoWhileStatement();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ForStatementImpl <em>For Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.ForStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getForStatement()
+		 * @generated
+		 */
+		EClass FOR_STATEMENT = eINSTANCE.getForStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Init</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FOR_STATEMENT__INIT = eINSTANCE.getForStatement_Init();
+
+		/**
+		 * The meta object literal for the '<em><b>Iterate</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FOR_STATEMENT__ITERATE = eINSTANCE.getForStatement_Iterate();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ForEachStatementImpl <em>For Each Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.ForEachStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getForEachStatement()
+		 * @generated
+		 */
+		EClass FOR_EACH_STATEMENT = eINSTANCE.getForEachStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Iterator</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FOR_EACH_STATEMENT__ITERATOR = eINSTANCE.getForEachStatement_Iterator();
+
+		/**
+		 * The meta object literal for the '<em><b>Enumeration</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FOR_EACH_STATEMENT__ENUMERATION = eINSTANCE.getForEachStatement_Enumeration();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.InterruptStatementImpl <em>Interrupt Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.InterruptStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getInterruptStatement()
+		 * @generated
+		 */
+		EClass INTERRUPT_STATEMENT = eINSTANCE.getInterruptStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Kind</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute INTERRUPT_STATEMENT__KIND = eINSTANCE.getInterruptStatement_Kind();
+
+		/**
+		 * The meta object literal for the '<em><b>Expr</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INTERRUPT_STATEMENT__EXPR = eINSTANCE.getInterruptStatement_Expr();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.ActivityStatementImpl <em>Activity Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.ActivityStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getActivityStatement()
+		 * @generated
+		 */
+		EClass ACTIVITY_STATEMENT = eINSTANCE.getActivityStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Op</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute ACTIVITY_STATEMENT__OP = eINSTANCE.getActivityStatement_Op();
+
+		/**
+		 * The meta object literal for the '<em><b>Machine</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ACTIVITY_STATEMENT__MACHINE = eINSTANCE.getActivityStatement_Machine();
+
+		/**
+		 * The meta object literal for the '<em><b>Tuple</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference ACTIVITY_STATEMENT__TUPLE = eINSTANCE.getActivityStatement_Tuple();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl <em>Invoke Statement</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getInvokeStatement()
+		 * @generated
+		 */
+		EClass INVOKE_STATEMENT = eINSTANCE.getInvokeStatement();
+
+		/**
+		 * The meta object literal for the '<em><b>Call Procedure</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute INVOKE_STATEMENT__CALL_PROCEDURE = eINSTANCE.getInvokeStatement_CallProcedure();
+
+		/**
+		 * The meta object literal for the '<em><b>Exec Routine</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute INVOKE_STATEMENT__EXEC_ROUTINE = eINSTANCE.getInvokeStatement_ExecRoutine();
+
+		/**
+		 * The meta object literal for the '<em><b>Invokable</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INVOKE_STATEMENT__INVOKABLE = eINSTANCE.getInvokeStatement_Invokable();
+
+		/**
+		 * The meta object literal for the '<em><b>Args</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INVOKE_STATEMENT__ARGS = eINSTANCE.getInvokeStatement_Args();
+
+		/**
+		 * The meta object literal for the '<em><b>Rets</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INVOKE_STATEMENT__RETS = eINSTANCE.getInvokeStatement_Rets();
+
+		/**
+		 * The meta object literal for the '<em><b>Expression</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference INVOKE_STATEMENT__EXPRESSION = eINSTANCE.getInvokeStatement_Expression();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind <em>Interrupt Statement Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getInterruptStatementKind()
+		 * @generated
+		 */
+		EEnum INTERRUPT_STATEMENT_KIND = eINSTANCE.getInterruptStatementKind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind <em>Activity Statement Kind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getActivityStatementKind()
+		 * @generated
+		 */
+		EEnum ACTIVITY_STATEMENT_KIND = eINSTANCE.getActivityStatementKind();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatementkind <em>Assignment Statementkind</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.efm.ecore.formalml.statement.AssignmentStatementkind
+		 * @see org.eclipse.efm.ecore.formalml.statement.impl.StatementPackageImpl#getAssignmentStatementkind()
+		 * @generated
+		 */
+		EEnum ASSIGNMENT_STATEMENTKIND = eINSTANCE.getAssignmentStatementkind();
+
+	}
+
+} //StatementPackage
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/TimedGuardStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/TimedGuardStatement.java
new file mode 100644
index 0000000..75d4544
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/TimedGuardStatement.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Timed Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getTimedGuardStatement()
+ * @model
+ * @generated
+ */
+public interface TimedGuardStatement extends AbstractGuardStatement {
+} // TimedGuardStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/WhileDoStatement.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/WhileDoStatement.java
new file mode 100644
index 0000000..7652013
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/WhileDoStatement.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>While Do Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#getWhileDoStatement()
+ * @model
+ * @generated
+ */
+public interface WhileDoStatement extends ConditionalBlockStatement {
+} // WhileDoStatement
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/AbstractComStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/AbstractComStatementImpl.java
new file mode 100644
index 0000000..2606894
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/AbstractComStatementImpl.java
@@ -0,0 +1,292 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+
+import org.eclipse.efm.ecore.formalml.statement.AbstractComStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Abstract Com Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.AbstractComStatementImpl#getPort <em>Port</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.AbstractComStatementImpl#getRoute <em>Route</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.AbstractComStatementImpl#getTarget <em>Target</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class AbstractComStatementImpl extends StatementImpl implements AbstractComStatement {
+	/**
+	 * The cached value of the '{@link #getPort() <em>Port</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPort()
+	 * @generated
+	 * @ordered
+	 */
+	protected NamedElement port;
+
+	/**
+	 * The cached value of the '{@link #getRoute() <em>Route</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRoute()
+	 * @generated
+	 * @ordered
+	 */
+	protected Channel route;
+
+	/**
+	 * The cached value of the '{@link #getTarget() <em>Target</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTarget()
+	 * @generated
+	 * @ordered
+	 */
+	protected ExpressionAsMachine target;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected AbstractComStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.ABSTRACT_COM_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement getPort() {
+		if (port != null && port.eIsProxy()) {
+			InternalEObject oldPort = (InternalEObject)port;
+			port = (NamedElement)eResolveProxy(oldPort);
+			if (port != oldPort) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatementPackage.ABSTRACT_COM_STATEMENT__PORT, oldPort, port));
+			}
+		}
+		return port;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement basicGetPort() {
+		return port;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPort(NamedElement newPort) {
+		NamedElement oldPort = port;
+		port = newPort;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ABSTRACT_COM_STATEMENT__PORT, oldPort, port));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Channel getRoute() {
+		return route;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRoute(Channel newRoute) {
+		Channel oldRoute = route;
+		route = newRoute;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ABSTRACT_COM_STATEMENT__ROUTE, oldRoute, route));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionAsMachine getTarget() {
+		return target;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetTarget(ExpressionAsMachine newTarget, NotificationChain msgs) {
+		ExpressionAsMachine oldTarget = target;
+		target = newTarget;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.ABSTRACT_COM_STATEMENT__TARGET, oldTarget, newTarget);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTarget(ExpressionAsMachine newTarget) {
+		if (newTarget != target) {
+			NotificationChain msgs = null;
+			if (target != null)
+				msgs = ((InternalEObject)target).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ABSTRACT_COM_STATEMENT__TARGET, null, msgs);
+			if (newTarget != null)
+				msgs = ((InternalEObject)newTarget).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ABSTRACT_COM_STATEMENT__TARGET, null, msgs);
+			msgs = basicSetTarget(newTarget, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ABSTRACT_COM_STATEMENT__TARGET, newTarget, newTarget));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_COM_STATEMENT__TARGET:
+				return basicSetTarget(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_COM_STATEMENT__PORT:
+				if (resolve) return getPort();
+				return basicGetPort();
+			case StatementPackage.ABSTRACT_COM_STATEMENT__ROUTE:
+				return getRoute();
+			case StatementPackage.ABSTRACT_COM_STATEMENT__TARGET:
+				return getTarget();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_COM_STATEMENT__PORT:
+				setPort((NamedElement)newValue);
+				return;
+			case StatementPackage.ABSTRACT_COM_STATEMENT__ROUTE:
+				setRoute((Channel)newValue);
+				return;
+			case StatementPackage.ABSTRACT_COM_STATEMENT__TARGET:
+				setTarget((ExpressionAsMachine)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_COM_STATEMENT__PORT:
+				setPort((NamedElement)null);
+				return;
+			case StatementPackage.ABSTRACT_COM_STATEMENT__ROUTE:
+				setRoute((Channel)null);
+				return;
+			case StatementPackage.ABSTRACT_COM_STATEMENT__TARGET:
+				setTarget((ExpressionAsMachine)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_COM_STATEMENT__PORT:
+				return port != null;
+			case StatementPackage.ABSTRACT_COM_STATEMENT__ROUTE:
+				return route != null;
+			case StatementPackage.ABSTRACT_COM_STATEMENT__TARGET:
+				return target != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //AbstractComStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/AbstractGuardStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/AbstractGuardStatementImpl.java
new file mode 100644
index 0000000..a155712
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/AbstractGuardStatementImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Abstract Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.AbstractGuardStatementImpl#getCondition <em>Condition</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class AbstractGuardStatementImpl extends StatementImpl implements AbstractGuardStatement {
+	/**
+	 * The cached value of the '{@link #getCondition() <em>Condition</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCondition()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression condition;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected AbstractGuardStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.ABSTRACT_GUARD_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getCondition() {
+		return condition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetCondition(Expression newCondition, NotificationChain msgs) {
+		Expression oldCondition = condition;
+		condition = newCondition;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.ABSTRACT_GUARD_STATEMENT__CONDITION, oldCondition, newCondition);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCondition(Expression newCondition) {
+		if (newCondition != condition) {
+			NotificationChain msgs = null;
+			if (condition != null)
+				msgs = ((InternalEObject)condition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ABSTRACT_GUARD_STATEMENT__CONDITION, null, msgs);
+			if (newCondition != null)
+				msgs = ((InternalEObject)newCondition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ABSTRACT_GUARD_STATEMENT__CONDITION, null, msgs);
+			msgs = basicSetCondition(newCondition, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ABSTRACT_GUARD_STATEMENT__CONDITION, newCondition, newCondition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_GUARD_STATEMENT__CONDITION:
+				return basicSetCondition(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_GUARD_STATEMENT__CONDITION:
+				return getCondition();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_GUARD_STATEMENT__CONDITION:
+				setCondition((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_GUARD_STATEMENT__CONDITION:
+				setCondition((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.ABSTRACT_GUARD_STATEMENT__CONDITION:
+				return condition != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //AbstractGuardStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ActivityStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ActivityStatementImpl.java
new file mode 100644
index 0000000..b391751
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ActivityStatementImpl.java
@@ -0,0 +1,322 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression;
+
+import org.eclipse.efm.ecore.formalml.statement.ActivityStatement;
+import org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Activity Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ActivityStatementImpl#getOp <em>Op</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ActivityStatementImpl#getMachine <em>Machine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ActivityStatementImpl#getTuple <em>Tuple</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ActivityStatementImpl extends StatementImpl implements ActivityStatement {
+	/**
+	 * The default value of the '{@link #getOp() <em>Op</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOp()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ActivityStatementKind OP_EDEFAULT = ActivityStatementKind.INIT;
+
+	/**
+	 * The cached value of the '{@link #getOp() <em>Op</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOp()
+	 * @generated
+	 * @ordered
+	 */
+	protected ActivityStatementKind op = OP_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getMachine() <em>Machine</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMachine()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression machine;
+
+	/**
+	 * The cached value of the '{@link #getTuple() <em>Tuple</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTuple()
+	 * @generated
+	 * @ordered
+	 */
+	protected TupleExpression tuple;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ActivityStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.ACTIVITY_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ActivityStatementKind getOp() {
+		return op;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOp(ActivityStatementKind newOp) {
+		ActivityStatementKind oldOp = op;
+		op = newOp == null ? OP_EDEFAULT : newOp;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ACTIVITY_STATEMENT__OP, oldOp, op));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getMachine() {
+		return machine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMachine(Expression newMachine, NotificationChain msgs) {
+		Expression oldMachine = machine;
+		machine = newMachine;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.ACTIVITY_STATEMENT__MACHINE, oldMachine, newMachine);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMachine(Expression newMachine) {
+		if (newMachine != machine) {
+			NotificationChain msgs = null;
+			if (machine != null)
+				msgs = ((InternalEObject)machine).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ACTIVITY_STATEMENT__MACHINE, null, msgs);
+			if (newMachine != null)
+				msgs = ((InternalEObject)newMachine).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ACTIVITY_STATEMENT__MACHINE, null, msgs);
+			msgs = basicSetMachine(newMachine, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ACTIVITY_STATEMENT__MACHINE, newMachine, newMachine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TupleExpression getTuple() {
+		return tuple;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetTuple(TupleExpression newTuple, NotificationChain msgs) {
+		TupleExpression oldTuple = tuple;
+		tuple = newTuple;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.ACTIVITY_STATEMENT__TUPLE, oldTuple, newTuple);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTuple(TupleExpression newTuple) {
+		if (newTuple != tuple) {
+			NotificationChain msgs = null;
+			if (tuple != null)
+				msgs = ((InternalEObject)tuple).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ACTIVITY_STATEMENT__TUPLE, null, msgs);
+			if (newTuple != null)
+				msgs = ((InternalEObject)newTuple).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ACTIVITY_STATEMENT__TUPLE, null, msgs);
+			msgs = basicSetTuple(newTuple, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ACTIVITY_STATEMENT__TUPLE, newTuple, newTuple));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.ACTIVITY_STATEMENT__MACHINE:
+				return basicSetMachine(null, msgs);
+			case StatementPackage.ACTIVITY_STATEMENT__TUPLE:
+				return basicSetTuple(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.ACTIVITY_STATEMENT__OP:
+				return getOp();
+			case StatementPackage.ACTIVITY_STATEMENT__MACHINE:
+				return getMachine();
+			case StatementPackage.ACTIVITY_STATEMENT__TUPLE:
+				return getTuple();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.ACTIVITY_STATEMENT__OP:
+				setOp((ActivityStatementKind)newValue);
+				return;
+			case StatementPackage.ACTIVITY_STATEMENT__MACHINE:
+				setMachine((Expression)newValue);
+				return;
+			case StatementPackage.ACTIVITY_STATEMENT__TUPLE:
+				setTuple((TupleExpression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.ACTIVITY_STATEMENT__OP:
+				setOp(OP_EDEFAULT);
+				return;
+			case StatementPackage.ACTIVITY_STATEMENT__MACHINE:
+				setMachine((Expression)null);
+				return;
+			case StatementPackage.ACTIVITY_STATEMENT__TUPLE:
+				setTuple((TupleExpression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.ACTIVITY_STATEMENT__OP:
+				return op != OP_EDEFAULT;
+			case StatementPackage.ACTIVITY_STATEMENT__MACHINE:
+				return machine != null;
+			case StatementPackage.ACTIVITY_STATEMENT__TUPLE:
+				return tuple != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (op: ");
+		result.append(op);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ActivityStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/AssignmentStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/AssignmentStatementImpl.java
new file mode 100644
index 0000000..4b37cf4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/AssignmentStatementImpl.java
@@ -0,0 +1,388 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.AssignmentExpression;
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+import org.eclipse.efm.ecore.formalml.statement.AssignmentStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Assignment Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.AssignmentStatementImpl#getExpression <em>Expression</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.AssignmentStatementImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.AssignmentStatementImpl#getLeftHandSide <em>Left Hand Side</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.AssignmentStatementImpl#getRigthHandSide <em>Rigth Hand Side</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class AssignmentStatementImpl extends StatementImpl implements AssignmentStatement {
+	/**
+	 * The cached value of the '{@link #getExpression() <em>Expression</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExpression()
+	 * @generated
+	 * @ordered
+	 */
+	protected AssignmentExpression expression;
+
+	/**
+	 * The default value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OPERATOR_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected String operator = OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getLeftHandSide() <em>Left Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLeftHandSide()
+	 * @generated
+	 * @ordered
+	 */
+	protected LeftHandSideExpression leftHandSide;
+
+	/**
+	 * The cached value of the '{@link #getRigthHandSide() <em>Rigth Hand Side</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRigthHandSide()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression rigthHandSide;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected AssignmentStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.ASSIGNMENT_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AssignmentExpression getExpression() {
+		return expression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetExpression(AssignmentExpression newExpression, NotificationChain msgs) {
+		AssignmentExpression oldExpression = expression;
+		expression = newExpression;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.ASSIGNMENT_STATEMENT__EXPRESSION, oldExpression, newExpression);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setExpression(AssignmentExpression newExpression) {
+		if (newExpression != expression) {
+			NotificationChain msgs = null;
+			if (expression != null)
+				msgs = ((InternalEObject)expression).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ASSIGNMENT_STATEMENT__EXPRESSION, null, msgs);
+			if (newExpression != null)
+				msgs = ((InternalEObject)newExpression).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ASSIGNMENT_STATEMENT__EXPRESSION, null, msgs);
+			msgs = basicSetExpression(newExpression, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ASSIGNMENT_STATEMENT__EXPRESSION, newExpression, newExpression));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOperator() {
+		return operator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator(String newOperator) {
+		String oldOperator = operator;
+		operator = newOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ASSIGNMENT_STATEMENT__OPERATOR, oldOperator, operator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LeftHandSideExpression getLeftHandSide() {
+		return leftHandSide;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLeftHandSide(LeftHandSideExpression newLeftHandSide, NotificationChain msgs) {
+		LeftHandSideExpression oldLeftHandSide = leftHandSide;
+		leftHandSide = newLeftHandSide;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE, oldLeftHandSide, newLeftHandSide);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLeftHandSide(LeftHandSideExpression newLeftHandSide) {
+		if (newLeftHandSide != leftHandSide) {
+			NotificationChain msgs = null;
+			if (leftHandSide != null)
+				msgs = ((InternalEObject)leftHandSide).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE, null, msgs);
+			if (newLeftHandSide != null)
+				msgs = ((InternalEObject)newLeftHandSide).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE, null, msgs);
+			msgs = basicSetLeftHandSide(newLeftHandSide, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE, newLeftHandSide, newLeftHandSide));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getRigthHandSide() {
+		return rigthHandSide;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetRigthHandSide(Expression newRigthHandSide, NotificationChain msgs) {
+		Expression oldRigthHandSide = rigthHandSide;
+		rigthHandSide = newRigthHandSide;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE, oldRigthHandSide, newRigthHandSide);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRigthHandSide(Expression newRigthHandSide) {
+		if (newRigthHandSide != rigthHandSide) {
+			NotificationChain msgs = null;
+			if (rigthHandSide != null)
+				msgs = ((InternalEObject)rigthHandSide).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE, null, msgs);
+			if (newRigthHandSide != null)
+				msgs = ((InternalEObject)newRigthHandSide).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE, null, msgs);
+			msgs = basicSetRigthHandSide(newRigthHandSide, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE, newRigthHandSide, newRigthHandSide));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.ASSIGNMENT_STATEMENT__EXPRESSION:
+				return basicSetExpression(null, msgs);
+			case StatementPackage.ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE:
+				return basicSetLeftHandSide(null, msgs);
+			case StatementPackage.ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE:
+				return basicSetRigthHandSide(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.ASSIGNMENT_STATEMENT__EXPRESSION:
+				return getExpression();
+			case StatementPackage.ASSIGNMENT_STATEMENT__OPERATOR:
+				return getOperator();
+			case StatementPackage.ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE:
+				return getLeftHandSide();
+			case StatementPackage.ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE:
+				return getRigthHandSide();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.ASSIGNMENT_STATEMENT__EXPRESSION:
+				setExpression((AssignmentExpression)newValue);
+				return;
+			case StatementPackage.ASSIGNMENT_STATEMENT__OPERATOR:
+				setOperator((String)newValue);
+				return;
+			case StatementPackage.ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE:
+				setLeftHandSide((LeftHandSideExpression)newValue);
+				return;
+			case StatementPackage.ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE:
+				setRigthHandSide((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.ASSIGNMENT_STATEMENT__EXPRESSION:
+				setExpression((AssignmentExpression)null);
+				return;
+			case StatementPackage.ASSIGNMENT_STATEMENT__OPERATOR:
+				setOperator(OPERATOR_EDEFAULT);
+				return;
+			case StatementPackage.ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE:
+				setLeftHandSide((LeftHandSideExpression)null);
+				return;
+			case StatementPackage.ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE:
+				setRigthHandSide((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.ASSIGNMENT_STATEMENT__EXPRESSION:
+				return expression != null;
+			case StatementPackage.ASSIGNMENT_STATEMENT__OPERATOR:
+				return OPERATOR_EDEFAULT == null ? operator != null : !OPERATOR_EDEFAULT.equals(operator);
+			case StatementPackage.ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE:
+				return leftHandSide != null;
+			case StatementPackage.ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE:
+				return rigthHandSide != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (operator: ");
+		result.append(operator);
+		result.append(')');
+		return result.toString();
+	}
+
+} //AssignmentStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/BlockStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/BlockStatementImpl.java
new file mode 100644
index 0000000..5d4bb3a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/BlockStatementImpl.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.Statement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Block Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.BlockStatementImpl#getOp <em>Op</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.BlockStatementImpl#getStatement <em>Statement</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class BlockStatementImpl extends StatementImpl implements BlockStatement {
+	/**
+	 * The default value of the '{@link #getOp() <em>Op</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOp()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String OP_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getOp() <em>Op</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOp()
+	 * @generated
+	 * @ordered
+	 */
+	protected String op = OP_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getStatement() <em>Statement</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStatement()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Statement> statement;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BlockStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.BLOCK_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getOp() {
+		return op;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOp(String newOp) {
+		String oldOp = op;
+		op = newOp;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.BLOCK_STATEMENT__OP, oldOp, op));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Statement> getStatement() {
+		if (statement == null) {
+			statement = new EObjectContainmentEList<Statement>(Statement.class, this, StatementPackage.BLOCK_STATEMENT__STATEMENT);
+		}
+		return statement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.BLOCK_STATEMENT__STATEMENT:
+				return ((InternalEList<?>)getStatement()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.BLOCK_STATEMENT__OP:
+				return getOp();
+			case StatementPackage.BLOCK_STATEMENT__STATEMENT:
+				return getStatement();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.BLOCK_STATEMENT__OP:
+				setOp((String)newValue);
+				return;
+			case StatementPackage.BLOCK_STATEMENT__STATEMENT:
+				getStatement().clear();
+				getStatement().addAll((Collection<? extends Statement>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.BLOCK_STATEMENT__OP:
+				setOp(OP_EDEFAULT);
+				return;
+			case StatementPackage.BLOCK_STATEMENT__STATEMENT:
+				getStatement().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.BLOCK_STATEMENT__OP:
+				return OP_EDEFAULT == null ? op != null : !OP_EDEFAULT.equals(op);
+			case StatementPackage.BLOCK_STATEMENT__STATEMENT:
+				return statement != null && !statement.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (op: ");
+		result.append(op);
+		result.append(')');
+		return result.toString();
+	}
+
+} //BlockStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/CheckSatGuardStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/CheckSatGuardStatementImpl.java
new file mode 100644
index 0000000..ae8a97f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/CheckSatGuardStatementImpl.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Check Sat Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.CheckSatGuardStatementImpl#getSolver <em>Solver</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class CheckSatGuardStatementImpl extends AbstractGuardStatementImpl implements CheckSatGuardStatement {
+	/**
+	 * The default value of the '{@link #getSolver() <em>Solver</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSolver()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String SOLVER_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getSolver() <em>Solver</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSolver()
+	 * @generated
+	 * @ordered
+	 */
+	protected String solver = SOLVER_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected CheckSatGuardStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.CHECK_SAT_GUARD_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getSolver() {
+		return solver;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSolver(String newSolver) {
+		String oldSolver = solver;
+		solver = newSolver;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.CHECK_SAT_GUARD_STATEMENT__SOLVER, oldSolver, solver));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.CHECK_SAT_GUARD_STATEMENT__SOLVER:
+				return getSolver();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.CHECK_SAT_GUARD_STATEMENT__SOLVER:
+				setSolver((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.CHECK_SAT_GUARD_STATEMENT__SOLVER:
+				setSolver(SOLVER_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.CHECK_SAT_GUARD_STATEMENT__SOLVER:
+				return SOLVER_EDEFAULT == null ? solver != null : !SOLVER_EDEFAULT.equals(solver);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (solver: ");
+		result.append(solver);
+		result.append(')');
+		return result.toString();
+	}
+
+} //CheckSatGuardStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ConditionalBlockStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ConditionalBlockStatementImpl.java
new file mode 100644
index 0000000..969ac44
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ConditionalBlockStatementImpl.java
@@ -0,0 +1,253 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Conditional Block Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ConditionalBlockStatementImpl#getCondition <em>Condition</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ConditionalBlockStatementImpl#getBodyBlock <em>Body Block</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ConditionalBlockStatementImpl extends StatementImpl implements ConditionalBlockStatement {
+	/**
+	 * The cached value of the '{@link #getCondition() <em>Condition</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCondition()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression condition;
+
+	/**
+	 * The cached value of the '{@link #getBodyBlock() <em>Body Block</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBodyBlock()
+	 * @generated
+	 * @ordered
+	 */
+	protected BlockStatement bodyBlock;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ConditionalBlockStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getCondition() {
+		return condition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetCondition(Expression newCondition, NotificationChain msgs) {
+		Expression oldCondition = condition;
+		condition = newCondition;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.CONDITIONAL_BLOCK_STATEMENT__CONDITION, oldCondition, newCondition);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCondition(Expression newCondition) {
+		if (newCondition != condition) {
+			NotificationChain msgs = null;
+			if (condition != null)
+				msgs = ((InternalEObject)condition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.CONDITIONAL_BLOCK_STATEMENT__CONDITION, null, msgs);
+			if (newCondition != null)
+				msgs = ((InternalEObject)newCondition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.CONDITIONAL_BLOCK_STATEMENT__CONDITION, null, msgs);
+			msgs = basicSetCondition(newCondition, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.CONDITIONAL_BLOCK_STATEMENT__CONDITION, newCondition, newCondition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BlockStatement getBodyBlock() {
+		return bodyBlock;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetBodyBlock(BlockStatement newBodyBlock, NotificationChain msgs) {
+		BlockStatement oldBodyBlock = bodyBlock;
+		bodyBlock = newBodyBlock;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK, oldBodyBlock, newBodyBlock);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBodyBlock(BlockStatement newBodyBlock) {
+		if (newBodyBlock != bodyBlock) {
+			NotificationChain msgs = null;
+			if (bodyBlock != null)
+				msgs = ((InternalEObject)bodyBlock).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK, null, msgs);
+			if (newBodyBlock != null)
+				msgs = ((InternalEObject)newBodyBlock).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK, null, msgs);
+			msgs = basicSetBodyBlock(newBodyBlock, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK, newBodyBlock, newBodyBlock));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__CONDITION:
+				return basicSetCondition(null, msgs);
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK:
+				return basicSetBodyBlock(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__CONDITION:
+				return getCondition();
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK:
+				return getBodyBlock();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__CONDITION:
+				setCondition((Expression)newValue);
+				return;
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK:
+				setBodyBlock((BlockStatement)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__CONDITION:
+				setCondition((Expression)null);
+				return;
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK:
+				setBodyBlock((BlockStatement)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__CONDITION:
+				return condition != null;
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK:
+				return bodyBlock != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ConditionalBlockStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/DoWhileStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/DoWhileStatementImpl.java
new file mode 100644
index 0000000..fa48927
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/DoWhileStatementImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.statement.DoWhileStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Do While Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class DoWhileStatementImpl extends ConditionalBlockStatementImpl implements DoWhileStatement {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DoWhileStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.DO_WHILE_STATEMENT;
+	}
+
+} //DoWhileStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/EventGuardStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/EventGuardStatementImpl.java
new file mode 100644
index 0000000..644d7e1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/EventGuardStatementImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.statement.EventGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Event Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class EventGuardStatementImpl extends AbstractGuardStatementImpl implements EventGuardStatement {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected EventGuardStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.EVENT_GUARD_STATEMENT;
+	}
+
+} //EventGuardStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ExpressionStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ExpressionStatementImpl.java
new file mode 100644
index 0000000..3313772
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ExpressionStatementImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.ExpressionStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Expression Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ExpressionStatementImpl#getExpression <em>Expression</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ExpressionStatementImpl extends StatementImpl implements ExpressionStatement {
+	/**
+	 * The cached value of the '{@link #getExpression() <em>Expression</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExpression()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression expression;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExpressionStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.EXPRESSION_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getExpression() {
+		return expression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetExpression(Expression newExpression, NotificationChain msgs) {
+		Expression oldExpression = expression;
+		expression = newExpression;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.EXPRESSION_STATEMENT__EXPRESSION, oldExpression, newExpression);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setExpression(Expression newExpression) {
+		if (newExpression != expression) {
+			NotificationChain msgs = null;
+			if (expression != null)
+				msgs = ((InternalEObject)expression).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.EXPRESSION_STATEMENT__EXPRESSION, null, msgs);
+			if (newExpression != null)
+				msgs = ((InternalEObject)newExpression).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.EXPRESSION_STATEMENT__EXPRESSION, null, msgs);
+			msgs = basicSetExpression(newExpression, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.EXPRESSION_STATEMENT__EXPRESSION, newExpression, newExpression));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.EXPRESSION_STATEMENT__EXPRESSION:
+				return basicSetExpression(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.EXPRESSION_STATEMENT__EXPRESSION:
+				return getExpression();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.EXPRESSION_STATEMENT__EXPRESSION:
+				setExpression((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.EXPRESSION_STATEMENT__EXPRESSION:
+				setExpression((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.EXPRESSION_STATEMENT__EXPRESSION:
+				return expression != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ExpressionStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ForEachStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ForEachStatementImpl.java
new file mode 100644
index 0000000..3019953
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ForEachStatementImpl.java
@@ -0,0 +1,253 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+import org.eclipse.efm.ecore.formalml.statement.ForEachStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>For Each Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ForEachStatementImpl#getIterator <em>Iterator</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ForEachStatementImpl#getEnumeration <em>Enumeration</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ForEachStatementImpl extends ConditionalBlockStatementImpl implements ForEachStatement {
+	/**
+	 * The cached value of the '{@link #getIterator() <em>Iterator</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getIterator()
+	 * @generated
+	 * @ordered
+	 */
+	protected LeftHandSideExpression iterator;
+
+	/**
+	 * The cached value of the '{@link #getEnumeration() <em>Enumeration</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEnumeration()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression enumeration;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ForEachStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.FOR_EACH_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LeftHandSideExpression getIterator() {
+		return iterator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetIterator(LeftHandSideExpression newIterator, NotificationChain msgs) {
+		LeftHandSideExpression oldIterator = iterator;
+		iterator = newIterator;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.FOR_EACH_STATEMENT__ITERATOR, oldIterator, newIterator);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setIterator(LeftHandSideExpression newIterator) {
+		if (newIterator != iterator) {
+			NotificationChain msgs = null;
+			if (iterator != null)
+				msgs = ((InternalEObject)iterator).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.FOR_EACH_STATEMENT__ITERATOR, null, msgs);
+			if (newIterator != null)
+				msgs = ((InternalEObject)newIterator).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.FOR_EACH_STATEMENT__ITERATOR, null, msgs);
+			msgs = basicSetIterator(newIterator, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.FOR_EACH_STATEMENT__ITERATOR, newIterator, newIterator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getEnumeration() {
+		return enumeration;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetEnumeration(Expression newEnumeration, NotificationChain msgs) {
+		Expression oldEnumeration = enumeration;
+		enumeration = newEnumeration;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.FOR_EACH_STATEMENT__ENUMERATION, oldEnumeration, newEnumeration);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEnumeration(Expression newEnumeration) {
+		if (newEnumeration != enumeration) {
+			NotificationChain msgs = null;
+			if (enumeration != null)
+				msgs = ((InternalEObject)enumeration).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.FOR_EACH_STATEMENT__ENUMERATION, null, msgs);
+			if (newEnumeration != null)
+				msgs = ((InternalEObject)newEnumeration).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.FOR_EACH_STATEMENT__ENUMERATION, null, msgs);
+			msgs = basicSetEnumeration(newEnumeration, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.FOR_EACH_STATEMENT__ENUMERATION, newEnumeration, newEnumeration));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.FOR_EACH_STATEMENT__ITERATOR:
+				return basicSetIterator(null, msgs);
+			case StatementPackage.FOR_EACH_STATEMENT__ENUMERATION:
+				return basicSetEnumeration(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.FOR_EACH_STATEMENT__ITERATOR:
+				return getIterator();
+			case StatementPackage.FOR_EACH_STATEMENT__ENUMERATION:
+				return getEnumeration();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.FOR_EACH_STATEMENT__ITERATOR:
+				setIterator((LeftHandSideExpression)newValue);
+				return;
+			case StatementPackage.FOR_EACH_STATEMENT__ENUMERATION:
+				setEnumeration((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.FOR_EACH_STATEMENT__ITERATOR:
+				setIterator((LeftHandSideExpression)null);
+				return;
+			case StatementPackage.FOR_EACH_STATEMENT__ENUMERATION:
+				setEnumeration((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.FOR_EACH_STATEMENT__ITERATOR:
+				return iterator != null;
+			case StatementPackage.FOR_EACH_STATEMENT__ENUMERATION:
+				return enumeration != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ForEachStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ForStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ForStatementImpl.java
new file mode 100644
index 0000000..c2893d2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/ForStatementImpl.java
@@ -0,0 +1,252 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.ForStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>For Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ForStatementImpl#getInit <em>Init</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.ForStatementImpl#getIterate <em>Iterate</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ForStatementImpl extends ConditionalBlockStatementImpl implements ForStatement {
+	/**
+	 * The cached value of the '{@link #getInit() <em>Init</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInit()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression init;
+
+	/**
+	 * The cached value of the '{@link #getIterate() <em>Iterate</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getIterate()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression iterate;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ForStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.FOR_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getInit() {
+		return init;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetInit(Expression newInit, NotificationChain msgs) {
+		Expression oldInit = init;
+		init = newInit;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.FOR_STATEMENT__INIT, oldInit, newInit);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInit(Expression newInit) {
+		if (newInit != init) {
+			NotificationChain msgs = null;
+			if (init != null)
+				msgs = ((InternalEObject)init).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.FOR_STATEMENT__INIT, null, msgs);
+			if (newInit != null)
+				msgs = ((InternalEObject)newInit).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.FOR_STATEMENT__INIT, null, msgs);
+			msgs = basicSetInit(newInit, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.FOR_STATEMENT__INIT, newInit, newInit));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getIterate() {
+		return iterate;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetIterate(Expression newIterate, NotificationChain msgs) {
+		Expression oldIterate = iterate;
+		iterate = newIterate;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.FOR_STATEMENT__ITERATE, oldIterate, newIterate);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setIterate(Expression newIterate) {
+		if (newIterate != iterate) {
+			NotificationChain msgs = null;
+			if (iterate != null)
+				msgs = ((InternalEObject)iterate).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.FOR_STATEMENT__ITERATE, null, msgs);
+			if (newIterate != null)
+				msgs = ((InternalEObject)newIterate).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.FOR_STATEMENT__ITERATE, null, msgs);
+			msgs = basicSetIterate(newIterate, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.FOR_STATEMENT__ITERATE, newIterate, newIterate));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.FOR_STATEMENT__INIT:
+				return basicSetInit(null, msgs);
+			case StatementPackage.FOR_STATEMENT__ITERATE:
+				return basicSetIterate(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.FOR_STATEMENT__INIT:
+				return getInit();
+			case StatementPackage.FOR_STATEMENT__ITERATE:
+				return getIterate();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.FOR_STATEMENT__INIT:
+				setInit((Expression)newValue);
+				return;
+			case StatementPackage.FOR_STATEMENT__ITERATE:
+				setIterate((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.FOR_STATEMENT__INIT:
+				setInit((Expression)null);
+				return;
+			case StatementPackage.FOR_STATEMENT__ITERATE:
+				setIterate((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.FOR_STATEMENT__INIT:
+				return init != null;
+			case StatementPackage.FOR_STATEMENT__ITERATE:
+				return iterate != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ForStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/GuardStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/GuardStatementImpl.java
new file mode 100644
index 0000000..1d425dc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/GuardStatementImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.statement.GuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class GuardStatementImpl extends AbstractGuardStatementImpl implements GuardStatement {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected GuardStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.GUARD_STATEMENT;
+	}
+
+} //GuardStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/IfStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/IfStatementImpl.java
new file mode 100644
index 0000000..0e87b7d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/IfStatementImpl.java
@@ -0,0 +1,230 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.IfStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>If Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.IfStatementImpl#getElseifStatement <em>Elseif Statement</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.IfStatementImpl#getElseBlock <em>Else Block</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class IfStatementImpl extends ConditionalBlockStatementImpl implements IfStatement {
+	/**
+	 * The cached value of the '{@link #getElseifStatement() <em>Elseif Statement</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getElseifStatement()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<ConditionalBlockStatement> elseifStatement;
+
+	/**
+	 * The cached value of the '{@link #getElseBlock() <em>Else Block</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getElseBlock()
+	 * @generated
+	 * @ordered
+	 */
+	protected BlockStatement elseBlock;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IfStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.IF_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<ConditionalBlockStatement> getElseifStatement() {
+		if (elseifStatement == null) {
+			elseifStatement = new EObjectContainmentEList<ConditionalBlockStatement>(ConditionalBlockStatement.class, this, StatementPackage.IF_STATEMENT__ELSEIF_STATEMENT);
+		}
+		return elseifStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BlockStatement getElseBlock() {
+		return elseBlock;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetElseBlock(BlockStatement newElseBlock, NotificationChain msgs) {
+		BlockStatement oldElseBlock = elseBlock;
+		elseBlock = newElseBlock;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.IF_STATEMENT__ELSE_BLOCK, oldElseBlock, newElseBlock);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setElseBlock(BlockStatement newElseBlock) {
+		if (newElseBlock != elseBlock) {
+			NotificationChain msgs = null;
+			if (elseBlock != null)
+				msgs = ((InternalEObject)elseBlock).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.IF_STATEMENT__ELSE_BLOCK, null, msgs);
+			if (newElseBlock != null)
+				msgs = ((InternalEObject)newElseBlock).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.IF_STATEMENT__ELSE_BLOCK, null, msgs);
+			msgs = basicSetElseBlock(newElseBlock, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.IF_STATEMENT__ELSE_BLOCK, newElseBlock, newElseBlock));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.IF_STATEMENT__ELSEIF_STATEMENT:
+				return ((InternalEList<?>)getElseifStatement()).basicRemove(otherEnd, msgs);
+			case StatementPackage.IF_STATEMENT__ELSE_BLOCK:
+				return basicSetElseBlock(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.IF_STATEMENT__ELSEIF_STATEMENT:
+				return getElseifStatement();
+			case StatementPackage.IF_STATEMENT__ELSE_BLOCK:
+				return getElseBlock();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.IF_STATEMENT__ELSEIF_STATEMENT:
+				getElseifStatement().clear();
+				getElseifStatement().addAll((Collection<? extends ConditionalBlockStatement>)newValue);
+				return;
+			case StatementPackage.IF_STATEMENT__ELSE_BLOCK:
+				setElseBlock((BlockStatement)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.IF_STATEMENT__ELSEIF_STATEMENT:
+				getElseifStatement().clear();
+				return;
+			case StatementPackage.IF_STATEMENT__ELSE_BLOCK:
+				setElseBlock((BlockStatement)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.IF_STATEMENT__ELSEIF_STATEMENT:
+				return elseifStatement != null && !elseifStatement.isEmpty();
+			case StatementPackage.IF_STATEMENT__ELSE_BLOCK:
+				return elseBlock != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //IfStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/InputComStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/InputComStatementImpl.java
new file mode 100644
index 0000000..59779ff
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/InputComStatementImpl.java
@@ -0,0 +1,161 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.InputComStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Input Com Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.InputComStatementImpl#getLeftValue <em>Left Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class InputComStatementImpl extends AbstractComStatementImpl implements InputComStatement {
+	/**
+	 * The cached value of the '{@link #getLeftValue() <em>Left Value</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLeftValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> leftValue;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InputComStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.INPUT_COM_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getLeftValue() {
+		if (leftValue == null) {
+			leftValue = new EObjectContainmentEList<Expression>(Expression.class, this, StatementPackage.INPUT_COM_STATEMENT__LEFT_VALUE);
+		}
+		return leftValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.INPUT_COM_STATEMENT__LEFT_VALUE:
+				return ((InternalEList<?>)getLeftValue()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.INPUT_COM_STATEMENT__LEFT_VALUE:
+				return getLeftValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.INPUT_COM_STATEMENT__LEFT_VALUE:
+				getLeftValue().clear();
+				getLeftValue().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.INPUT_COM_STATEMENT__LEFT_VALUE:
+				getLeftValue().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.INPUT_COM_STATEMENT__LEFT_VALUE:
+				return leftValue != null && !leftValue.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //InputComStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/InterruptStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/InterruptStatementImpl.java
new file mode 100644
index 0000000..0368086
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/InterruptStatementImpl.java
@@ -0,0 +1,233 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.InterruptStatement;
+import org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Interrupt Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.InterruptStatementImpl#getKind <em>Kind</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.InterruptStatementImpl#getExpr <em>Expr</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class InterruptStatementImpl extends StatementImpl implements InterruptStatement {
+	/**
+	 * The default value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final InterruptStatementKind KIND_EDEFAULT = InterruptStatementKind.BREAK;
+
+	/**
+	 * The cached value of the '{@link #getKind() <em>Kind</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getKind()
+	 * @generated
+	 * @ordered
+	 */
+	protected InterruptStatementKind kind = KIND_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getExpr() <em>Expr</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExpr()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> expr;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InterruptStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.INTERRUPT_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InterruptStatementKind getKind() {
+		return kind;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setKind(InterruptStatementKind newKind) {
+		InterruptStatementKind oldKind = kind;
+		kind = newKind == null ? KIND_EDEFAULT : newKind;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.INTERRUPT_STATEMENT__KIND, oldKind, kind));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getExpr() {
+		if (expr == null) {
+			expr = new EObjectContainmentEList<Expression>(Expression.class, this, StatementPackage.INTERRUPT_STATEMENT__EXPR);
+		}
+		return expr;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.INTERRUPT_STATEMENT__EXPR:
+				return ((InternalEList<?>)getExpr()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.INTERRUPT_STATEMENT__KIND:
+				return getKind();
+			case StatementPackage.INTERRUPT_STATEMENT__EXPR:
+				return getExpr();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.INTERRUPT_STATEMENT__KIND:
+				setKind((InterruptStatementKind)newValue);
+				return;
+			case StatementPackage.INTERRUPT_STATEMENT__EXPR:
+				getExpr().clear();
+				getExpr().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.INTERRUPT_STATEMENT__KIND:
+				setKind(KIND_EDEFAULT);
+				return;
+			case StatementPackage.INTERRUPT_STATEMENT__EXPR:
+				getExpr().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.INTERRUPT_STATEMENT__KIND:
+				return kind != KIND_EDEFAULT;
+			case StatementPackage.INTERRUPT_STATEMENT__EXPR:
+				return expr != null && !expr.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (kind: ");
+		result.append(kind);
+		result.append(')');
+		return result.toString();
+	}
+
+} //InterruptStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/InvokeStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/InvokeStatementImpl.java
new file mode 100644
index 0000000..9fccfe5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/InvokeStatementImpl.java
@@ -0,0 +1,480 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
+
+import org.eclipse.efm.ecore.formalml.statement.InvokeStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Invoke Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl#isCallProcedure <em>Call Procedure</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl#isExecRoutine <em>Exec Routine</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl#getInvokable <em>Invokable</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl#getArgs <em>Args</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl#getRets <em>Rets</em>}</li>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.InvokeStatementImpl#getExpression <em>Expression</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class InvokeStatementImpl extends StatementImpl implements InvokeStatement {
+	/**
+	 * The default value of the '{@link #isCallProcedure() <em>Call Procedure</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isCallProcedure()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean CALL_PROCEDURE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isCallProcedure() <em>Call Procedure</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isCallProcedure()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean callProcedure = CALL_PROCEDURE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isExecRoutine() <em>Exec Routine</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isExecRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean EXEC_ROUTINE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isExecRoutine() <em>Exec Routine</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isExecRoutine()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean execRoutine = EXEC_ROUTINE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getInvokable() <em>Invokable</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getInvokable()
+	 * @generated
+	 * @ordered
+	 */
+	protected NamedElement invokable;
+
+	/**
+	 * The cached value of the '{@link #getArgs() <em>Args</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getArgs()
+	 * @generated
+	 * @ordered
+	 */
+	protected TupleExpression args;
+
+	/**
+	 * The cached value of the '{@link #getRets() <em>Rets</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRets()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Variable> rets;
+
+	/**
+	 * The cached value of the '{@link #getExpression() <em>Expression</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getExpression()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression expression;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected InvokeStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.INVOKE_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isCallProcedure() {
+		return callProcedure;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCallProcedure(boolean newCallProcedure) {
+		boolean oldCallProcedure = callProcedure;
+		callProcedure = newCallProcedure;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.INVOKE_STATEMENT__CALL_PROCEDURE, oldCallProcedure, callProcedure));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isExecRoutine() {
+		return execRoutine;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setExecRoutine(boolean newExecRoutine) {
+		boolean oldExecRoutine = execRoutine;
+		execRoutine = newExecRoutine;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.INVOKE_STATEMENT__EXEC_ROUTINE, oldExecRoutine, execRoutine));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement getInvokable() {
+		if (invokable != null && invokable.eIsProxy()) {
+			InternalEObject oldInvokable = (InternalEObject)invokable;
+			invokable = (NamedElement)eResolveProxy(oldInvokable);
+			if (invokable != oldInvokable) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, StatementPackage.INVOKE_STATEMENT__INVOKABLE, oldInvokable, invokable));
+			}
+		}
+		return invokable;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NamedElement basicGetInvokable() {
+		return invokable;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setInvokable(NamedElement newInvokable) {
+		NamedElement oldInvokable = invokable;
+		invokable = newInvokable;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.INVOKE_STATEMENT__INVOKABLE, oldInvokable, invokable));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TupleExpression getArgs() {
+		return args;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetArgs(TupleExpression newArgs, NotificationChain msgs) {
+		TupleExpression oldArgs = args;
+		args = newArgs;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.INVOKE_STATEMENT__ARGS, oldArgs, newArgs);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setArgs(TupleExpression newArgs) {
+		if (newArgs != args) {
+			NotificationChain msgs = null;
+			if (args != null)
+				msgs = ((InternalEObject)args).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.INVOKE_STATEMENT__ARGS, null, msgs);
+			if (newArgs != null)
+				msgs = ((InternalEObject)newArgs).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.INVOKE_STATEMENT__ARGS, null, msgs);
+			msgs = basicSetArgs(newArgs, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.INVOKE_STATEMENT__ARGS, newArgs, newArgs));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Variable> getRets() {
+		if (rets == null) {
+			rets = new EObjectResolvingEList<Variable>(Variable.class, this, StatementPackage.INVOKE_STATEMENT__RETS);
+		}
+		return rets;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getExpression() {
+		return expression;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetExpression(Expression newExpression, NotificationChain msgs) {
+		Expression oldExpression = expression;
+		expression = newExpression;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.INVOKE_STATEMENT__EXPRESSION, oldExpression, newExpression);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setExpression(Expression newExpression) {
+		if (newExpression != expression) {
+			NotificationChain msgs = null;
+			if (expression != null)
+				msgs = ((InternalEObject)expression).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.INVOKE_STATEMENT__EXPRESSION, null, msgs);
+			if (newExpression != null)
+				msgs = ((InternalEObject)newExpression).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.INVOKE_STATEMENT__EXPRESSION, null, msgs);
+			msgs = basicSetExpression(newExpression, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.INVOKE_STATEMENT__EXPRESSION, newExpression, newExpression));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.INVOKE_STATEMENT__ARGS:
+				return basicSetArgs(null, msgs);
+			case StatementPackage.INVOKE_STATEMENT__EXPRESSION:
+				return basicSetExpression(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.INVOKE_STATEMENT__CALL_PROCEDURE:
+				return isCallProcedure();
+			case StatementPackage.INVOKE_STATEMENT__EXEC_ROUTINE:
+				return isExecRoutine();
+			case StatementPackage.INVOKE_STATEMENT__INVOKABLE:
+				if (resolve) return getInvokable();
+				return basicGetInvokable();
+			case StatementPackage.INVOKE_STATEMENT__ARGS:
+				return getArgs();
+			case StatementPackage.INVOKE_STATEMENT__RETS:
+				return getRets();
+			case StatementPackage.INVOKE_STATEMENT__EXPRESSION:
+				return getExpression();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.INVOKE_STATEMENT__CALL_PROCEDURE:
+				setCallProcedure((Boolean)newValue);
+				return;
+			case StatementPackage.INVOKE_STATEMENT__EXEC_ROUTINE:
+				setExecRoutine((Boolean)newValue);
+				return;
+			case StatementPackage.INVOKE_STATEMENT__INVOKABLE:
+				setInvokable((NamedElement)newValue);
+				return;
+			case StatementPackage.INVOKE_STATEMENT__ARGS:
+				setArgs((TupleExpression)newValue);
+				return;
+			case StatementPackage.INVOKE_STATEMENT__RETS:
+				getRets().clear();
+				getRets().addAll((Collection<? extends Variable>)newValue);
+				return;
+			case StatementPackage.INVOKE_STATEMENT__EXPRESSION:
+				setExpression((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.INVOKE_STATEMENT__CALL_PROCEDURE:
+				setCallProcedure(CALL_PROCEDURE_EDEFAULT);
+				return;
+			case StatementPackage.INVOKE_STATEMENT__EXEC_ROUTINE:
+				setExecRoutine(EXEC_ROUTINE_EDEFAULT);
+				return;
+			case StatementPackage.INVOKE_STATEMENT__INVOKABLE:
+				setInvokable((NamedElement)null);
+				return;
+			case StatementPackage.INVOKE_STATEMENT__ARGS:
+				setArgs((TupleExpression)null);
+				return;
+			case StatementPackage.INVOKE_STATEMENT__RETS:
+				getRets().clear();
+				return;
+			case StatementPackage.INVOKE_STATEMENT__EXPRESSION:
+				setExpression((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.INVOKE_STATEMENT__CALL_PROCEDURE:
+				return callProcedure != CALL_PROCEDURE_EDEFAULT;
+			case StatementPackage.INVOKE_STATEMENT__EXEC_ROUTINE:
+				return execRoutine != EXEC_ROUTINE_EDEFAULT;
+			case StatementPackage.INVOKE_STATEMENT__INVOKABLE:
+				return invokable != null;
+			case StatementPackage.INVOKE_STATEMENT__ARGS:
+				return args != null;
+			case StatementPackage.INVOKE_STATEMENT__RETS:
+				return rets != null && !rets.isEmpty();
+			case StatementPackage.INVOKE_STATEMENT__EXPRESSION:
+				return expression != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (callProcedure: ");
+		result.append(callProcedure);
+		result.append(", execRoutine: ");
+		result.append(execRoutine);
+		result.append(')');
+		return result.toString();
+	}
+
+} //InvokeStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/NewfreshStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/NewfreshStatementImpl.java
new file mode 100644
index 0000000..c460645
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/NewfreshStatementImpl.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.NewfreshStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Newfresh Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.NewfreshStatementImpl#getLeftValue <em>Left Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class NewfreshStatementImpl extends StatementImpl implements NewfreshStatement {
+	/**
+	 * The cached value of the '{@link #getLeftValue() <em>Left Value</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLeftValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected Expression leftValue;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected NewfreshStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.NEWFRESH_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Expression getLeftValue() {
+		return leftValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetLeftValue(Expression newLeftValue, NotificationChain msgs) {
+		Expression oldLeftValue = leftValue;
+		leftValue = newLeftValue;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, StatementPackage.NEWFRESH_STATEMENT__LEFT_VALUE, oldLeftValue, newLeftValue);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLeftValue(Expression newLeftValue) {
+		if (newLeftValue != leftValue) {
+			NotificationChain msgs = null;
+			if (leftValue != null)
+				msgs = ((InternalEObject)leftValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - StatementPackage.NEWFRESH_STATEMENT__LEFT_VALUE, null, msgs);
+			if (newLeftValue != null)
+				msgs = ((InternalEObject)newLeftValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - StatementPackage.NEWFRESH_STATEMENT__LEFT_VALUE, null, msgs);
+			msgs = basicSetLeftValue(newLeftValue, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, StatementPackage.NEWFRESH_STATEMENT__LEFT_VALUE, newLeftValue, newLeftValue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.NEWFRESH_STATEMENT__LEFT_VALUE:
+				return basicSetLeftValue(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.NEWFRESH_STATEMENT__LEFT_VALUE:
+				return getLeftValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.NEWFRESH_STATEMENT__LEFT_VALUE:
+				setLeftValue((Expression)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.NEWFRESH_STATEMENT__LEFT_VALUE:
+				setLeftValue((Expression)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.NEWFRESH_STATEMENT__LEFT_VALUE:
+				return leftValue != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //NewfreshStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/OutputComStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/OutputComStatementImpl.java
new file mode 100644
index 0000000..a5fb4a4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/OutputComStatementImpl.java
@@ -0,0 +1,161 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import java.util.Collection;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.OutputComStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Output Com Statement</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.efm.ecore.formalml.statement.impl.OutputComStatementImpl#getRigthValue <em>Rigth Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class OutputComStatementImpl extends AbstractComStatementImpl implements OutputComStatement {
+	/**
+	 * The cached value of the '{@link #getRigthValue() <em>Rigth Value</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRigthValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<Expression> rigthValue;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected OutputComStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.OUTPUT_COM_STATEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<Expression> getRigthValue() {
+		if (rigthValue == null) {
+			rigthValue = new EObjectContainmentEList<Expression>(Expression.class, this, StatementPackage.OUTPUT_COM_STATEMENT__RIGTH_VALUE);
+		}
+		return rigthValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case StatementPackage.OUTPUT_COM_STATEMENT__RIGTH_VALUE:
+				return ((InternalEList<?>)getRigthValue()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case StatementPackage.OUTPUT_COM_STATEMENT__RIGTH_VALUE:
+				return getRigthValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case StatementPackage.OUTPUT_COM_STATEMENT__RIGTH_VALUE:
+				getRigthValue().clear();
+				getRigthValue().addAll((Collection<? extends Expression>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case StatementPackage.OUTPUT_COM_STATEMENT__RIGTH_VALUE:
+				getRigthValue().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case StatementPackage.OUTPUT_COM_STATEMENT__RIGTH_VALUE:
+				return rigthValue != null && !rigthValue.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //OutputComStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/StatementFactoryImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/StatementFactoryImpl.java
new file mode 100644
index 0000000..2da9ee9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/StatementFactoryImpl.java
@@ -0,0 +1,402 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.statement.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StatementFactoryImpl extends EFactoryImpl implements StatementFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static StatementFactory init() {
+		try {
+			StatementFactory theStatementFactory = (StatementFactory)EPackage.Registry.INSTANCE.getEFactory(StatementPackage.eNS_URI);
+			if (theStatementFactory != null) {
+				return theStatementFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new StatementFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatementFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case StatementPackage.BLOCK_STATEMENT: return createBlockStatement();
+			case StatementPackage.EXPRESSION_STATEMENT: return createExpressionStatement();
+			case StatementPackage.ASSIGNMENT_STATEMENT: return createAssignmentStatement();
+			case StatementPackage.NEWFRESH_STATEMENT: return createNewfreshStatement();
+			case StatementPackage.GUARD_STATEMENT: return createGuardStatement();
+			case StatementPackage.TIMED_GUARD_STATEMENT: return createTimedGuardStatement();
+			case StatementPackage.EVENT_GUARD_STATEMENT: return createEventGuardStatement();
+			case StatementPackage.CHECK_SAT_GUARD_STATEMENT: return createCheckSatGuardStatement();
+			case StatementPackage.INPUT_COM_STATEMENT: return createInputComStatement();
+			case StatementPackage.OUTPUT_COM_STATEMENT: return createOutputComStatement();
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT: return createConditionalBlockStatement();
+			case StatementPackage.IF_STATEMENT: return createIfStatement();
+			case StatementPackage.WHILE_DO_STATEMENT: return createWhileDoStatement();
+			case StatementPackage.DO_WHILE_STATEMENT: return createDoWhileStatement();
+			case StatementPackage.FOR_STATEMENT: return createForStatement();
+			case StatementPackage.FOR_EACH_STATEMENT: return createForEachStatement();
+			case StatementPackage.INTERRUPT_STATEMENT: return createInterruptStatement();
+			case StatementPackage.ACTIVITY_STATEMENT: return createActivityStatement();
+			case StatementPackage.INVOKE_STATEMENT: return createInvokeStatement();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case StatementPackage.INTERRUPT_STATEMENT_KIND:
+				return createInterruptStatementKindFromString(eDataType, initialValue);
+			case StatementPackage.ACTIVITY_STATEMENT_KIND:
+				return createActivityStatementKindFromString(eDataType, initialValue);
+			case StatementPackage.ASSIGNMENT_STATEMENTKIND:
+				return createAssignmentStatementkindFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case StatementPackage.INTERRUPT_STATEMENT_KIND:
+				return convertInterruptStatementKindToString(eDataType, instanceValue);
+			case StatementPackage.ACTIVITY_STATEMENT_KIND:
+				return convertActivityStatementKindToString(eDataType, instanceValue);
+			case StatementPackage.ASSIGNMENT_STATEMENTKIND:
+				return convertAssignmentStatementkindToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BlockStatement createBlockStatement() {
+		BlockStatementImpl blockStatement = new BlockStatementImpl();
+		return blockStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ExpressionStatement createExpressionStatement() {
+		ExpressionStatementImpl expressionStatement = new ExpressionStatementImpl();
+		return expressionStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AssignmentStatement createAssignmentStatement() {
+		AssignmentStatementImpl assignmentStatement = new AssignmentStatementImpl();
+		return assignmentStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NewfreshStatement createNewfreshStatement() {
+		NewfreshStatementImpl newfreshStatement = new NewfreshStatementImpl();
+		return newfreshStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public GuardStatement createGuardStatement() {
+		GuardStatementImpl guardStatement = new GuardStatementImpl();
+		return guardStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public TimedGuardStatement createTimedGuardStatement() {
+		TimedGuardStatementImpl timedGuardStatement = new TimedGuardStatementImpl();
+		return timedGuardStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EventGuardStatement createEventGuardStatement() {
+		EventGuardStatementImpl eventGuardStatement = new EventGuardStatementImpl();
+		return eventGuardStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public CheckSatGuardStatement createCheckSatGuardStatement() {
+		CheckSatGuardStatementImpl checkSatGuardStatement = new CheckSatGuardStatementImpl();
+		return checkSatGuardStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InputComStatement createInputComStatement() {
+		InputComStatementImpl inputComStatement = new InputComStatementImpl();
+		return inputComStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public OutputComStatement createOutputComStatement() {
+		OutputComStatementImpl outputComStatement = new OutputComStatementImpl();
+		return outputComStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ConditionalBlockStatement createConditionalBlockStatement() {
+		ConditionalBlockStatementImpl conditionalBlockStatement = new ConditionalBlockStatementImpl();
+		return conditionalBlockStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public IfStatement createIfStatement() {
+		IfStatementImpl ifStatement = new IfStatementImpl();
+		return ifStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public WhileDoStatement createWhileDoStatement() {
+		WhileDoStatementImpl whileDoStatement = new WhileDoStatementImpl();
+		return whileDoStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DoWhileStatement createDoWhileStatement() {
+		DoWhileStatementImpl doWhileStatement = new DoWhileStatementImpl();
+		return doWhileStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ForStatement createForStatement() {
+		ForStatementImpl forStatement = new ForStatementImpl();
+		return forStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ForEachStatement createForEachStatement() {
+		ForEachStatementImpl forEachStatement = new ForEachStatementImpl();
+		return forEachStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InterruptStatement createInterruptStatement() {
+		InterruptStatementImpl interruptStatement = new InterruptStatementImpl();
+		return interruptStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ActivityStatement createActivityStatement() {
+		ActivityStatementImpl activityStatement = new ActivityStatementImpl();
+		return activityStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InvokeStatement createInvokeStatement() {
+		InvokeStatementImpl invokeStatement = new InvokeStatementImpl();
+		return invokeStatement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public InterruptStatementKind createInterruptStatementKindFromString(EDataType eDataType, String initialValue) {
+		InterruptStatementKind result = InterruptStatementKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertInterruptStatementKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ActivityStatementKind createActivityStatementKindFromString(EDataType eDataType, String initialValue) {
+		ActivityStatementKind result = ActivityStatementKind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertActivityStatementKindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AssignmentStatementkind createAssignmentStatementkindFromString(EDataType eDataType, String initialValue) {
+		AssignmentStatementkind result = AssignmentStatementkind.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertAssignmentStatementkindToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatementPackage getStatementPackage() {
+		return (StatementPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static StatementPackage getPackage() {
+		return StatementPackage.eINSTANCE;
+	}
+
+} //StatementFactoryImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/StatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/StatementImpl.java
new file mode 100644
index 0000000..4fef5f6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/StatementImpl.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.statement.Statement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public abstract class StatementImpl extends MinimalEObjectImpl.Container implements Statement {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.STATEMENT;
+	}
+
+} //StatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/StatementPackageImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/StatementPackageImpl.java
new file mode 100644
index 0000000..b42359d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/StatementPackageImpl.java
@@ -0,0 +1,1176 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+
+import org.eclipse.efm.ecore.formalml.common.impl.CommonPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+
+import org.eclipse.efm.ecore.formalml.datatype.impl.DatatypePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+
+import org.eclipse.efm.ecore.formalml.expression.impl.ExpressionPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.impl.FormalmlPackageImpl;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.impl.InfrastructurePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+
+import org.eclipse.efm.ecore.formalml.statemachine.impl.StatemachinePackageImpl;
+
+import org.eclipse.efm.ecore.formalml.statement.AbstractComStatement;
+import org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.ActivityStatement;
+import org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind;
+import org.eclipse.efm.ecore.formalml.statement.AssignmentStatement;
+import org.eclipse.efm.ecore.formalml.statement.AssignmentStatementkind;
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.DoWhileStatement;
+import org.eclipse.efm.ecore.formalml.statement.EventGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.ExpressionStatement;
+import org.eclipse.efm.ecore.formalml.statement.ForEachStatement;
+import org.eclipse.efm.ecore.formalml.statement.ForStatement;
+import org.eclipse.efm.ecore.formalml.statement.GuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.IfStatement;
+import org.eclipse.efm.ecore.formalml.statement.InputComStatement;
+import org.eclipse.efm.ecore.formalml.statement.InterruptStatement;
+import org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind;
+import org.eclipse.efm.ecore.formalml.statement.InvokeStatement;
+import org.eclipse.efm.ecore.formalml.statement.NewfreshStatement;
+import org.eclipse.efm.ecore.formalml.statement.OutputComStatement;
+import org.eclipse.efm.ecore.formalml.statement.Statement;
+import org.eclipse.efm.ecore.formalml.statement.StatementFactory;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+import org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.WhileDoStatement;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StatementPackageImpl extends EPackageImpl implements StatementPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass statementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass blockStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass expressionStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass assignmentStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass newfreshStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass abstractGuardStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass guardStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass timedGuardStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass eventGuardStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass checkSatGuardStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass abstractComStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass inputComStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass outputComStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass conditionalBlockStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass ifStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass whileDoStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass doWhileStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass forStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass forEachStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass interruptStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass activityStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass invokeStatementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum interruptStatementKindEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum activityStatementKindEEnum = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum assignmentStatementkindEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private StatementPackageImpl() {
+		super(eNS_URI, StatementFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link StatementPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static StatementPackage init() {
+		if (isInited) return (StatementPackage)EPackage.Registry.INSTANCE.getEPackage(StatementPackage.eNS_URI);
+
+		// Obtain or create and register package
+		StatementPackageImpl theStatementPackage = (StatementPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof StatementPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new StatementPackageImpl());
+
+		isInited = true;
+
+		// Obtain or create and register interdependencies
+		FormalmlPackageImpl theFormalmlPackage = (FormalmlPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) instanceof FormalmlPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(FormalmlPackage.eNS_URI) : FormalmlPackage.eINSTANCE);
+		CommonPackageImpl theCommonPackage = (CommonPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) instanceof CommonPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI) : CommonPackage.eINSTANCE);
+		InfrastructurePackageImpl theInfrastructurePackage = (InfrastructurePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) instanceof InfrastructurePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI) : InfrastructurePackage.eINSTANCE);
+		DatatypePackageImpl theDatatypePackage = (DatatypePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) instanceof DatatypePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(DatatypePackage.eNS_URI) : DatatypePackage.eINSTANCE);
+		ExpressionPackageImpl theExpressionPackage = (ExpressionPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) instanceof ExpressionPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI) : ExpressionPackage.eINSTANCE);
+		StatemachinePackageImpl theStatemachinePackage = (StatemachinePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) instanceof StatemachinePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(StatemachinePackage.eNS_URI) : StatemachinePackage.eINSTANCE);
+
+		// Create package meta-data objects
+		theStatementPackage.createPackageContents();
+		theFormalmlPackage.createPackageContents();
+		theCommonPackage.createPackageContents();
+		theInfrastructurePackage.createPackageContents();
+		theDatatypePackage.createPackageContents();
+		theExpressionPackage.createPackageContents();
+		theStatemachinePackage.createPackageContents();
+
+		// Initialize created meta-data
+		theStatementPackage.initializePackageContents();
+		theFormalmlPackage.initializePackageContents();
+		theCommonPackage.initializePackageContents();
+		theInfrastructurePackage.initializePackageContents();
+		theDatatypePackage.initializePackageContents();
+		theExpressionPackage.initializePackageContents();
+		theStatemachinePackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theStatementPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(StatementPackage.eNS_URI, theStatementPackage);
+		return theStatementPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getStatement() {
+		return statementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBlockStatement() {
+		return blockStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getBlockStatement_Op() {
+		return (EAttribute)blockStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBlockStatement_Statement() {
+		return (EReference)blockStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getExpressionStatement() {
+		return expressionStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExpressionStatement_Expression() {
+		return (EReference)expressionStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getAssignmentStatement() {
+		return assignmentStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAssignmentStatement_Expression() {
+		return (EReference)assignmentStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getAssignmentStatement_Operator() {
+		return (EAttribute)assignmentStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAssignmentStatement_LeftHandSide() {
+		return (EReference)assignmentStatementEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAssignmentStatement_RigthHandSide() {
+		return (EReference)assignmentStatementEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getNewfreshStatement() {
+		return newfreshStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getNewfreshStatement_LeftValue() {
+		return (EReference)newfreshStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getAbstractGuardStatement() {
+		return abstractGuardStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAbstractGuardStatement_Condition() {
+		return (EReference)abstractGuardStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getGuardStatement() {
+		return guardStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getTimedGuardStatement() {
+		return timedGuardStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getEventGuardStatement() {
+		return eventGuardStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getCheckSatGuardStatement() {
+		return checkSatGuardStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getCheckSatGuardStatement_Solver() {
+		return (EAttribute)checkSatGuardStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getAbstractComStatement() {
+		return abstractComStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAbstractComStatement_Port() {
+		return (EReference)abstractComStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAbstractComStatement_Route() {
+		return (EReference)abstractComStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getAbstractComStatement_Target() {
+		return (EReference)abstractComStatementEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getInputComStatement() {
+		return inputComStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInputComStatement_LeftValue() {
+		return (EReference)inputComStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getOutputComStatement() {
+		return outputComStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getOutputComStatement_RigthValue() {
+		return (EReference)outputComStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getConditionalBlockStatement() {
+		return conditionalBlockStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getConditionalBlockStatement_Condition() {
+		return (EReference)conditionalBlockStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getConditionalBlockStatement_BodyBlock() {
+		return (EReference)conditionalBlockStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getIfStatement() {
+		return ifStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getIfStatement_ElseifStatement() {
+		return (EReference)ifStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getIfStatement_ElseBlock() {
+		return (EReference)ifStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getWhileDoStatement() {
+		return whileDoStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDoWhileStatement() {
+		return doWhileStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getForStatement() {
+		return forStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getForStatement_Init() {
+		return (EReference)forStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getForStatement_Iterate() {
+		return (EReference)forStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getForEachStatement() {
+		return forEachStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getForEachStatement_Iterator() {
+		return (EReference)forEachStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getForEachStatement_Enumeration() {
+		return (EReference)forEachStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getInterruptStatement() {
+		return interruptStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getInterruptStatement_Kind() {
+		return (EAttribute)interruptStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInterruptStatement_Expr() {
+		return (EReference)interruptStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getActivityStatement() {
+		return activityStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getActivityStatement_Op() {
+		return (EAttribute)activityStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getActivityStatement_Machine() {
+		return (EReference)activityStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getActivityStatement_Tuple() {
+		return (EReference)activityStatementEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getInvokeStatement() {
+		return invokeStatementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getInvokeStatement_CallProcedure() {
+		return (EAttribute)invokeStatementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getInvokeStatement_ExecRoutine() {
+		return (EAttribute)invokeStatementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInvokeStatement_Invokable() {
+		return (EReference)invokeStatementEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInvokeStatement_Args() {
+		return (EReference)invokeStatementEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInvokeStatement_Rets() {
+		return (EReference)invokeStatementEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getInvokeStatement_Expression() {
+		return (EReference)invokeStatementEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getInterruptStatementKind() {
+		return interruptStatementKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getActivityStatementKind() {
+		return activityStatementKindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getAssignmentStatementkind() {
+		return assignmentStatementkindEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatementFactory getStatementFactory() {
+		return (StatementFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		statementEClass = createEClass(STATEMENT);
+
+		blockStatementEClass = createEClass(BLOCK_STATEMENT);
+		createEAttribute(blockStatementEClass, BLOCK_STATEMENT__OP);
+		createEReference(blockStatementEClass, BLOCK_STATEMENT__STATEMENT);
+
+		expressionStatementEClass = createEClass(EXPRESSION_STATEMENT);
+		createEReference(expressionStatementEClass, EXPRESSION_STATEMENT__EXPRESSION);
+
+		assignmentStatementEClass = createEClass(ASSIGNMENT_STATEMENT);
+		createEReference(assignmentStatementEClass, ASSIGNMENT_STATEMENT__EXPRESSION);
+		createEAttribute(assignmentStatementEClass, ASSIGNMENT_STATEMENT__OPERATOR);
+		createEReference(assignmentStatementEClass, ASSIGNMENT_STATEMENT__LEFT_HAND_SIDE);
+		createEReference(assignmentStatementEClass, ASSIGNMENT_STATEMENT__RIGTH_HAND_SIDE);
+
+		newfreshStatementEClass = createEClass(NEWFRESH_STATEMENT);
+		createEReference(newfreshStatementEClass, NEWFRESH_STATEMENT__LEFT_VALUE);
+
+		abstractGuardStatementEClass = createEClass(ABSTRACT_GUARD_STATEMENT);
+		createEReference(abstractGuardStatementEClass, ABSTRACT_GUARD_STATEMENT__CONDITION);
+
+		guardStatementEClass = createEClass(GUARD_STATEMENT);
+
+		timedGuardStatementEClass = createEClass(TIMED_GUARD_STATEMENT);
+
+		eventGuardStatementEClass = createEClass(EVENT_GUARD_STATEMENT);
+
+		checkSatGuardStatementEClass = createEClass(CHECK_SAT_GUARD_STATEMENT);
+		createEAttribute(checkSatGuardStatementEClass, CHECK_SAT_GUARD_STATEMENT__SOLVER);
+
+		abstractComStatementEClass = createEClass(ABSTRACT_COM_STATEMENT);
+		createEReference(abstractComStatementEClass, ABSTRACT_COM_STATEMENT__PORT);
+		createEReference(abstractComStatementEClass, ABSTRACT_COM_STATEMENT__ROUTE);
+		createEReference(abstractComStatementEClass, ABSTRACT_COM_STATEMENT__TARGET);
+
+		inputComStatementEClass = createEClass(INPUT_COM_STATEMENT);
+		createEReference(inputComStatementEClass, INPUT_COM_STATEMENT__LEFT_VALUE);
+
+		outputComStatementEClass = createEClass(OUTPUT_COM_STATEMENT);
+		createEReference(outputComStatementEClass, OUTPUT_COM_STATEMENT__RIGTH_VALUE);
+
+		conditionalBlockStatementEClass = createEClass(CONDITIONAL_BLOCK_STATEMENT);
+		createEReference(conditionalBlockStatementEClass, CONDITIONAL_BLOCK_STATEMENT__CONDITION);
+		createEReference(conditionalBlockStatementEClass, CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK);
+
+		ifStatementEClass = createEClass(IF_STATEMENT);
+		createEReference(ifStatementEClass, IF_STATEMENT__ELSEIF_STATEMENT);
+		createEReference(ifStatementEClass, IF_STATEMENT__ELSE_BLOCK);
+
+		whileDoStatementEClass = createEClass(WHILE_DO_STATEMENT);
+
+		doWhileStatementEClass = createEClass(DO_WHILE_STATEMENT);
+
+		forStatementEClass = createEClass(FOR_STATEMENT);
+		createEReference(forStatementEClass, FOR_STATEMENT__INIT);
+		createEReference(forStatementEClass, FOR_STATEMENT__ITERATE);
+
+		forEachStatementEClass = createEClass(FOR_EACH_STATEMENT);
+		createEReference(forEachStatementEClass, FOR_EACH_STATEMENT__ITERATOR);
+		createEReference(forEachStatementEClass, FOR_EACH_STATEMENT__ENUMERATION);
+
+		interruptStatementEClass = createEClass(INTERRUPT_STATEMENT);
+		createEAttribute(interruptStatementEClass, INTERRUPT_STATEMENT__KIND);
+		createEReference(interruptStatementEClass, INTERRUPT_STATEMENT__EXPR);
+
+		activityStatementEClass = createEClass(ACTIVITY_STATEMENT);
+		createEAttribute(activityStatementEClass, ACTIVITY_STATEMENT__OP);
+		createEReference(activityStatementEClass, ACTIVITY_STATEMENT__MACHINE);
+		createEReference(activityStatementEClass, ACTIVITY_STATEMENT__TUPLE);
+
+		invokeStatementEClass = createEClass(INVOKE_STATEMENT);
+		createEAttribute(invokeStatementEClass, INVOKE_STATEMENT__CALL_PROCEDURE);
+		createEAttribute(invokeStatementEClass, INVOKE_STATEMENT__EXEC_ROUTINE);
+		createEReference(invokeStatementEClass, INVOKE_STATEMENT__INVOKABLE);
+		createEReference(invokeStatementEClass, INVOKE_STATEMENT__ARGS);
+		createEReference(invokeStatementEClass, INVOKE_STATEMENT__RETS);
+		createEReference(invokeStatementEClass, INVOKE_STATEMENT__EXPRESSION);
+
+		// Create enums
+		interruptStatementKindEEnum = createEEnum(INTERRUPT_STATEMENT_KIND);
+		activityStatementKindEEnum = createEEnum(ACTIVITY_STATEMENT_KIND);
+		assignmentStatementkindEEnum = createEEnum(ASSIGNMENT_STATEMENTKIND);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		ExpressionPackage theExpressionPackage = (ExpressionPackage)EPackage.Registry.INSTANCE.getEPackage(ExpressionPackage.eNS_URI);
+		CommonPackage theCommonPackage = (CommonPackage)EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI);
+		InfrastructurePackage theInfrastructurePackage = (InfrastructurePackage)EPackage.Registry.INSTANCE.getEPackage(InfrastructurePackage.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		blockStatementEClass.getESuperTypes().add(this.getStatement());
+		expressionStatementEClass.getESuperTypes().add(this.getStatement());
+		assignmentStatementEClass.getESuperTypes().add(this.getStatement());
+		newfreshStatementEClass.getESuperTypes().add(this.getStatement());
+		abstractGuardStatementEClass.getESuperTypes().add(this.getStatement());
+		guardStatementEClass.getESuperTypes().add(this.getAbstractGuardStatement());
+		timedGuardStatementEClass.getESuperTypes().add(this.getAbstractGuardStatement());
+		eventGuardStatementEClass.getESuperTypes().add(this.getAbstractGuardStatement());
+		checkSatGuardStatementEClass.getESuperTypes().add(this.getAbstractGuardStatement());
+		abstractComStatementEClass.getESuperTypes().add(this.getStatement());
+		inputComStatementEClass.getESuperTypes().add(this.getAbstractComStatement());
+		outputComStatementEClass.getESuperTypes().add(this.getAbstractComStatement());
+		conditionalBlockStatementEClass.getESuperTypes().add(this.getStatement());
+		ifStatementEClass.getESuperTypes().add(this.getConditionalBlockStatement());
+		whileDoStatementEClass.getESuperTypes().add(this.getConditionalBlockStatement());
+		doWhileStatementEClass.getESuperTypes().add(this.getConditionalBlockStatement());
+		forStatementEClass.getESuperTypes().add(this.getConditionalBlockStatement());
+		forEachStatementEClass.getESuperTypes().add(this.getConditionalBlockStatement());
+		interruptStatementEClass.getESuperTypes().add(this.getStatement());
+		activityStatementEClass.getESuperTypes().add(this.getStatement());
+		invokeStatementEClass.getESuperTypes().add(this.getStatement());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(statementEClass, Statement.class, "Statement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(blockStatementEClass, BlockStatement.class, "BlockStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getBlockStatement_Op(), ecorePackage.getEString(), "op", null, 0, 1, BlockStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getBlockStatement_Statement(), this.getStatement(), null, "statement", null, 0, -1, BlockStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(expressionStatementEClass, ExpressionStatement.class, "ExpressionStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getExpressionStatement_Expression(), theExpressionPackage.getExpression(), null, "expression", null, 0, 1, ExpressionStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(assignmentStatementEClass, AssignmentStatement.class, "AssignmentStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getAssignmentStatement_Expression(), theExpressionPackage.getAssignmentExpression(), null, "expression", null, 0, 1, AssignmentStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getAssignmentStatement_Operator(), ecorePackage.getEString(), "operator", null, 1, 1, AssignmentStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getAssignmentStatement_LeftHandSide(), theExpressionPackage.getLeftHandSideExpression(), null, "leftHandSide", null, 1, 1, AssignmentStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getAssignmentStatement_RigthHandSide(), theExpressionPackage.getExpression(), null, "rigthHandSide", null, 1, 1, AssignmentStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(newfreshStatementEClass, NewfreshStatement.class, "NewfreshStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getNewfreshStatement_LeftValue(), theExpressionPackage.getExpression(), null, "leftValue", null, 1, 1, NewfreshStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(abstractGuardStatementEClass, AbstractGuardStatement.class, "AbstractGuardStatement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getAbstractGuardStatement_Condition(), theExpressionPackage.getExpression(), null, "condition", null, 1, 1, AbstractGuardStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(guardStatementEClass, GuardStatement.class, "GuardStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(timedGuardStatementEClass, TimedGuardStatement.class, "TimedGuardStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(eventGuardStatementEClass, EventGuardStatement.class, "EventGuardStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(checkSatGuardStatementEClass, CheckSatGuardStatement.class, "CheckSatGuardStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getCheckSatGuardStatement_Solver(), ecorePackage.getEString(), "solver", null, 0, 1, CheckSatGuardStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(abstractComStatementEClass, AbstractComStatement.class, "AbstractComStatement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getAbstractComStatement_Port(), theCommonPackage.getNamedElement(), null, "port", null, 0, 1, AbstractComStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getAbstractComStatement_Route(), theInfrastructurePackage.getChannel(), null, "route", null, 0, 1, AbstractComStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getAbstractComStatement_Target(), theExpressionPackage.getExpressionAsMachine(), null, "target", null, 0, 1, AbstractComStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(inputComStatementEClass, InputComStatement.class, "InputComStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getInputComStatement_LeftValue(), theExpressionPackage.getExpression(), null, "leftValue", null, 0, -1, InputComStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(outputComStatementEClass, OutputComStatement.class, "OutputComStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getOutputComStatement_RigthValue(), theExpressionPackage.getExpression(), null, "rigthValue", null, 0, -1, OutputComStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(conditionalBlockStatementEClass, ConditionalBlockStatement.class, "ConditionalBlockStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getConditionalBlockStatement_Condition(), theExpressionPackage.getExpression(), null, "condition", null, 1, 1, ConditionalBlockStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getConditionalBlockStatement_BodyBlock(), this.getBlockStatement(), null, "bodyBlock", null, 1, 1, ConditionalBlockStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(ifStatementEClass, IfStatement.class, "IfStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getIfStatement_ElseifStatement(), this.getConditionalBlockStatement(), null, "elseifStatement", null, 0, -1, IfStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getIfStatement_ElseBlock(), this.getBlockStatement(), null, "elseBlock", null, 0, 1, IfStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(whileDoStatementEClass, WhileDoStatement.class, "WhileDoStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(doWhileStatementEClass, DoWhileStatement.class, "DoWhileStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(forStatementEClass, ForStatement.class, "ForStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getForStatement_Init(), theExpressionPackage.getExpression(), null, "init", null, 0, 1, ForStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getForStatement_Iterate(), theExpressionPackage.getExpression(), null, "iterate", null, 0, 1, ForStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(forEachStatementEClass, ForEachStatement.class, "ForEachStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getForEachStatement_Iterator(), theExpressionPackage.getLeftHandSideExpression(), null, "iterator", null, 1, 1, ForEachStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getForEachStatement_Enumeration(), theExpressionPackage.getExpression(), null, "enumeration", null, 1, 1, ForEachStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(interruptStatementEClass, InterruptStatement.class, "InterruptStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getInterruptStatement_Kind(), this.getInterruptStatementKind(), "kind", null, 0, 1, InterruptStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInterruptStatement_Expr(), theExpressionPackage.getExpression(), null, "expr", null, 0, -1, InterruptStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(activityStatementEClass, ActivityStatement.class, "ActivityStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getActivityStatement_Op(), this.getActivityStatementKind(), "op", null, 1, 1, ActivityStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getActivityStatement_Machine(), theExpressionPackage.getExpression(), null, "machine", null, 1, 1, ActivityStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getActivityStatement_Tuple(), theExpressionPackage.getTupleExpression(), null, "tuple", null, 0, 1, ActivityStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(invokeStatementEClass, InvokeStatement.class, "InvokeStatement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getInvokeStatement_CallProcedure(), ecorePackage.getEBoolean(), "callProcedure", "false", 0, 1, InvokeStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getInvokeStatement_ExecRoutine(), ecorePackage.getEBoolean(), "execRoutine", "false", 0, 1, InvokeStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInvokeStatement_Invokable(), theCommonPackage.getNamedElement(), null, "invokable", null, 0, 1, InvokeStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInvokeStatement_Args(), theExpressionPackage.getTupleExpression(), null, "args", null, 0, 1, InvokeStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInvokeStatement_Rets(), theInfrastructurePackage.getVariable(), null, "rets", null, 0, -1, InvokeStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getInvokeStatement_Expression(), theExpressionPackage.getExpression(), null, "expression", null, 0, 1, InvokeStatement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Initialize enums and add enum literals
+		initEEnum(interruptStatementKindEEnum, InterruptStatementKind.class, "InterruptStatementKind");
+		addEEnumLiteral(interruptStatementKindEEnum, InterruptStatementKind.BREAK);
+		addEEnumLiteral(interruptStatementKindEEnum, InterruptStatementKind.CONTINUE);
+		addEEnumLiteral(interruptStatementKindEEnum, InterruptStatementKind.RETURN);
+		addEEnumLiteral(interruptStatementKindEEnum, InterruptStatementKind.EXIT);
+
+		initEEnum(activityStatementKindEEnum, ActivityStatementKind.class, "ActivityStatementKind");
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.INIT);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.FINAL);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.DESTROY);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.START);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.STOP);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.RESTART);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.SUSPEND);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.RESUME);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.WAIT);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.ABORT);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.DISABLE);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.ENABLE);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.IRUN);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.RUN);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.RTC);
+		addEEnumLiteral(activityStatementKindEEnum, ActivityStatementKind.SCHEDULE);
+
+		initEEnum(assignmentStatementkindEEnum, AssignmentStatementkind.class, "AssignmentStatementkind");
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.ASSIGN_REF);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.ASSIGN_MACRO);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.PLUS_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.PLUS_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.MINUS_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.MINUS_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.STAR_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.STAR_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.DIV_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.DIV_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.MOD_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.MOD_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.LAND_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.LAND_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.LOR_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.LOR_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.BAND_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.BAND_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.BOR_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.BOR_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.BXOR_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.BXOR_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.LSHIFT_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.LSHIFT_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.RSHIFT_ASSIGN_AFTER);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.RSHIFT_ASSIGN);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.OP_PUSH);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.OP_ASSIGN_TOP);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.OP_POP);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.INCR);
+		addEEnumLiteral(assignmentStatementkindEEnum, AssignmentStatementkind.DECR);
+	}
+
+} //StatementPackageImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/TimedGuardStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/TimedGuardStatementImpl.java
new file mode 100644
index 0000000..bbaeb45
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/TimedGuardStatementImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+import org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Timed Guard Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class TimedGuardStatementImpl extends AbstractGuardStatementImpl implements TimedGuardStatement {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected TimedGuardStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.TIMED_GUARD_STATEMENT;
+	}
+
+} //TimedGuardStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/WhileDoStatementImpl.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/WhileDoStatementImpl.java
new file mode 100644
index 0000000..ea34d82
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/impl/WhileDoStatementImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.impl;
+
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+import org.eclipse.efm.ecore.formalml.statement.WhileDoStatement;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>While Do Statement</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class WhileDoStatementImpl extends ConditionalBlockStatementImpl implements WhileDoStatement {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected WhileDoStatementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return StatementPackage.Literals.WHILE_DO_STATEMENT;
+	}
+
+} //WhileDoStatementImpl
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/util/StatementAdapterFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/util/StatementAdapterFactory.java
new file mode 100644
index 0000000..10c228d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/util/StatementAdapterFactory.java
@@ -0,0 +1,508 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.util;
+
+import org.eclipse.efm.ecore.formalml.statement.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage
+ * @generated
+ */
+public class StatementAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static StatementPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatementAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = StatementPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected StatementSwitch<Adapter> modelSwitch =
+		new StatementSwitch<Adapter>() {
+			@Override
+			public Adapter caseStatement(Statement object) {
+				return createStatementAdapter();
+			}
+			@Override
+			public Adapter caseBlockStatement(BlockStatement object) {
+				return createBlockStatementAdapter();
+			}
+			@Override
+			public Adapter caseExpressionStatement(ExpressionStatement object) {
+				return createExpressionStatementAdapter();
+			}
+			@Override
+			public Adapter caseAssignmentStatement(AssignmentStatement object) {
+				return createAssignmentStatementAdapter();
+			}
+			@Override
+			public Adapter caseNewfreshStatement(NewfreshStatement object) {
+				return createNewfreshStatementAdapter();
+			}
+			@Override
+			public Adapter caseAbstractGuardStatement(AbstractGuardStatement object) {
+				return createAbstractGuardStatementAdapter();
+			}
+			@Override
+			public Adapter caseGuardStatement(GuardStatement object) {
+				return createGuardStatementAdapter();
+			}
+			@Override
+			public Adapter caseTimedGuardStatement(TimedGuardStatement object) {
+				return createTimedGuardStatementAdapter();
+			}
+			@Override
+			public Adapter caseEventGuardStatement(EventGuardStatement object) {
+				return createEventGuardStatementAdapter();
+			}
+			@Override
+			public Adapter caseCheckSatGuardStatement(CheckSatGuardStatement object) {
+				return createCheckSatGuardStatementAdapter();
+			}
+			@Override
+			public Adapter caseAbstractComStatement(AbstractComStatement object) {
+				return createAbstractComStatementAdapter();
+			}
+			@Override
+			public Adapter caseInputComStatement(InputComStatement object) {
+				return createInputComStatementAdapter();
+			}
+			@Override
+			public Adapter caseOutputComStatement(OutputComStatement object) {
+				return createOutputComStatementAdapter();
+			}
+			@Override
+			public Adapter caseConditionalBlockStatement(ConditionalBlockStatement object) {
+				return createConditionalBlockStatementAdapter();
+			}
+			@Override
+			public Adapter caseIfStatement(IfStatement object) {
+				return createIfStatementAdapter();
+			}
+			@Override
+			public Adapter caseWhileDoStatement(WhileDoStatement object) {
+				return createWhileDoStatementAdapter();
+			}
+			@Override
+			public Adapter caseDoWhileStatement(DoWhileStatement object) {
+				return createDoWhileStatementAdapter();
+			}
+			@Override
+			public Adapter caseForStatement(ForStatement object) {
+				return createForStatementAdapter();
+			}
+			@Override
+			public Adapter caseForEachStatement(ForEachStatement object) {
+				return createForEachStatementAdapter();
+			}
+			@Override
+			public Adapter caseInterruptStatement(InterruptStatement object) {
+				return createInterruptStatementAdapter();
+			}
+			@Override
+			public Adapter caseActivityStatement(ActivityStatement object) {
+				return createActivityStatementAdapter();
+			}
+			@Override
+			public Adapter caseInvokeStatement(InvokeStatement object) {
+				return createInvokeStatementAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.Statement <em>Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.Statement
+	 * @generated
+	 */
+	public Adapter createStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.BlockStatement <em>Block Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.BlockStatement
+	 * @generated
+	 */
+	public Adapter createBlockStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.ExpressionStatement <em>Expression Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ExpressionStatement
+	 * @generated
+	 */
+	public Adapter createExpressionStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement <em>Assignment Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AssignmentStatement
+	 * @generated
+	 */
+	public Adapter createAssignmentStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.NewfreshStatement <em>Newfresh Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.NewfreshStatement
+	 * @generated
+	 */
+	public Adapter createNewfreshStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement <em>Abstract Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement
+	 * @generated
+	 */
+	public Adapter createAbstractGuardStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.GuardStatement <em>Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.GuardStatement
+	 * @generated
+	 */
+	public Adapter createGuardStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement <em>Timed Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement
+	 * @generated
+	 */
+	public Adapter createTimedGuardStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.EventGuardStatement <em>Event Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.EventGuardStatement
+	 * @generated
+	 */
+	public Adapter createEventGuardStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement <em>Check Sat Guard Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement
+	 * @generated
+	 */
+	public Adapter createCheckSatGuardStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement <em>Abstract Com Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.AbstractComStatement
+	 * @generated
+	 */
+	public Adapter createAbstractComStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.InputComStatement <em>Input Com Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InputComStatement
+	 * @generated
+	 */
+	public Adapter createInputComStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.OutputComStatement <em>Output Com Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.OutputComStatement
+	 * @generated
+	 */
+	public Adapter createOutputComStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement <em>Conditional Block Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement
+	 * @generated
+	 */
+	public Adapter createConditionalBlockStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.IfStatement <em>If Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.IfStatement
+	 * @generated
+	 */
+	public Adapter createIfStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.WhileDoStatement <em>While Do Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.WhileDoStatement
+	 * @generated
+	 */
+	public Adapter createWhileDoStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.DoWhileStatement <em>Do While Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.DoWhileStatement
+	 * @generated
+	 */
+	public Adapter createDoWhileStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.ForStatement <em>For Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ForStatement
+	 * @generated
+	 */
+	public Adapter createForStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.ForEachStatement <em>For Each Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ForEachStatement
+	 * @generated
+	 */
+	public Adapter createForEachStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.InterruptStatement <em>Interrupt Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InterruptStatement
+	 * @generated
+	 */
+	public Adapter createInterruptStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement <em>Activity Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.ActivityStatement
+	 * @generated
+	 */
+	public Adapter createActivityStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement <em>Invoke Statement</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.statement.InvokeStatement
+	 * @generated
+	 */
+	public Adapter createInvokeStatementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //StatementAdapterFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/util/StatementSwitch.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/util/StatementSwitch.java
new file mode 100644
index 0000000..87a135a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/util/StatementSwitch.java
@@ -0,0 +1,593 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.statement.util;
+
+import org.eclipse.efm.ecore.formalml.statement.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.statement.StatementPackage
+ * @generated
+ */
+public class StatementSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static StatementPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public StatementSwitch() {
+		if (modelPackage == null) {
+			modelPackage = StatementPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case StatementPackage.STATEMENT: {
+				Statement statement = (Statement)theEObject;
+				T result = caseStatement(statement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.BLOCK_STATEMENT: {
+				BlockStatement blockStatement = (BlockStatement)theEObject;
+				T result = caseBlockStatement(blockStatement);
+				if (result == null) result = caseStatement(blockStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.EXPRESSION_STATEMENT: {
+				ExpressionStatement expressionStatement = (ExpressionStatement)theEObject;
+				T result = caseExpressionStatement(expressionStatement);
+				if (result == null) result = caseStatement(expressionStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.ASSIGNMENT_STATEMENT: {
+				AssignmentStatement assignmentStatement = (AssignmentStatement)theEObject;
+				T result = caseAssignmentStatement(assignmentStatement);
+				if (result == null) result = caseStatement(assignmentStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.NEWFRESH_STATEMENT: {
+				NewfreshStatement newfreshStatement = (NewfreshStatement)theEObject;
+				T result = caseNewfreshStatement(newfreshStatement);
+				if (result == null) result = caseStatement(newfreshStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.ABSTRACT_GUARD_STATEMENT: {
+				AbstractGuardStatement abstractGuardStatement = (AbstractGuardStatement)theEObject;
+				T result = caseAbstractGuardStatement(abstractGuardStatement);
+				if (result == null) result = caseStatement(abstractGuardStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.GUARD_STATEMENT: {
+				GuardStatement guardStatement = (GuardStatement)theEObject;
+				T result = caseGuardStatement(guardStatement);
+				if (result == null) result = caseAbstractGuardStatement(guardStatement);
+				if (result == null) result = caseStatement(guardStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.TIMED_GUARD_STATEMENT: {
+				TimedGuardStatement timedGuardStatement = (TimedGuardStatement)theEObject;
+				T result = caseTimedGuardStatement(timedGuardStatement);
+				if (result == null) result = caseAbstractGuardStatement(timedGuardStatement);
+				if (result == null) result = caseStatement(timedGuardStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.EVENT_GUARD_STATEMENT: {
+				EventGuardStatement eventGuardStatement = (EventGuardStatement)theEObject;
+				T result = caseEventGuardStatement(eventGuardStatement);
+				if (result == null) result = caseAbstractGuardStatement(eventGuardStatement);
+				if (result == null) result = caseStatement(eventGuardStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.CHECK_SAT_GUARD_STATEMENT: {
+				CheckSatGuardStatement checkSatGuardStatement = (CheckSatGuardStatement)theEObject;
+				T result = caseCheckSatGuardStatement(checkSatGuardStatement);
+				if (result == null) result = caseAbstractGuardStatement(checkSatGuardStatement);
+				if (result == null) result = caseStatement(checkSatGuardStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.ABSTRACT_COM_STATEMENT: {
+				AbstractComStatement abstractComStatement = (AbstractComStatement)theEObject;
+				T result = caseAbstractComStatement(abstractComStatement);
+				if (result == null) result = caseStatement(abstractComStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.INPUT_COM_STATEMENT: {
+				InputComStatement inputComStatement = (InputComStatement)theEObject;
+				T result = caseInputComStatement(inputComStatement);
+				if (result == null) result = caseAbstractComStatement(inputComStatement);
+				if (result == null) result = caseStatement(inputComStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.OUTPUT_COM_STATEMENT: {
+				OutputComStatement outputComStatement = (OutputComStatement)theEObject;
+				T result = caseOutputComStatement(outputComStatement);
+				if (result == null) result = caseAbstractComStatement(outputComStatement);
+				if (result == null) result = caseStatement(outputComStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT: {
+				ConditionalBlockStatement conditionalBlockStatement = (ConditionalBlockStatement)theEObject;
+				T result = caseConditionalBlockStatement(conditionalBlockStatement);
+				if (result == null) result = caseStatement(conditionalBlockStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.IF_STATEMENT: {
+				IfStatement ifStatement = (IfStatement)theEObject;
+				T result = caseIfStatement(ifStatement);
+				if (result == null) result = caseConditionalBlockStatement(ifStatement);
+				if (result == null) result = caseStatement(ifStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.WHILE_DO_STATEMENT: {
+				WhileDoStatement whileDoStatement = (WhileDoStatement)theEObject;
+				T result = caseWhileDoStatement(whileDoStatement);
+				if (result == null) result = caseConditionalBlockStatement(whileDoStatement);
+				if (result == null) result = caseStatement(whileDoStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.DO_WHILE_STATEMENT: {
+				DoWhileStatement doWhileStatement = (DoWhileStatement)theEObject;
+				T result = caseDoWhileStatement(doWhileStatement);
+				if (result == null) result = caseConditionalBlockStatement(doWhileStatement);
+				if (result == null) result = caseStatement(doWhileStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.FOR_STATEMENT: {
+				ForStatement forStatement = (ForStatement)theEObject;
+				T result = caseForStatement(forStatement);
+				if (result == null) result = caseConditionalBlockStatement(forStatement);
+				if (result == null) result = caseStatement(forStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.FOR_EACH_STATEMENT: {
+				ForEachStatement forEachStatement = (ForEachStatement)theEObject;
+				T result = caseForEachStatement(forEachStatement);
+				if (result == null) result = caseConditionalBlockStatement(forEachStatement);
+				if (result == null) result = caseStatement(forEachStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.INTERRUPT_STATEMENT: {
+				InterruptStatement interruptStatement = (InterruptStatement)theEObject;
+				T result = caseInterruptStatement(interruptStatement);
+				if (result == null) result = caseStatement(interruptStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.ACTIVITY_STATEMENT: {
+				ActivityStatement activityStatement = (ActivityStatement)theEObject;
+				T result = caseActivityStatement(activityStatement);
+				if (result == null) result = caseStatement(activityStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case StatementPackage.INVOKE_STATEMENT: {
+				InvokeStatement invokeStatement = (InvokeStatement)theEObject;
+				T result = caseInvokeStatement(invokeStatement);
+				if (result == null) result = caseStatement(invokeStatement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseStatement(Statement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Block Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Block Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseBlockStatement(BlockStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Expression Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Expression Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseExpressionStatement(ExpressionStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Assignment Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Assignment Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAssignmentStatement(AssignmentStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Newfresh Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Newfresh Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseNewfreshStatement(NewfreshStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Abstract Guard Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Abstract Guard Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAbstractGuardStatement(AbstractGuardStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Guard Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Guard Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseGuardStatement(GuardStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Timed Guard Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Timed Guard Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseTimedGuardStatement(TimedGuardStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Event Guard Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Event Guard Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseEventGuardStatement(EventGuardStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Check Sat Guard Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Check Sat Guard Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseCheckSatGuardStatement(CheckSatGuardStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Abstract Com Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Abstract Com Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseAbstractComStatement(AbstractComStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Input Com Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Input Com Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseInputComStatement(InputComStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Output Com Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Output Com Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseOutputComStatement(OutputComStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Conditional Block Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Conditional Block Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseConditionalBlockStatement(ConditionalBlockStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>If Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>If Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseIfStatement(IfStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>While Do Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>While Do Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseWhileDoStatement(WhileDoStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Do While Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Do While Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDoWhileStatement(DoWhileStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>For Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>For Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseForStatement(ForStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>For Each Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>For Each Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseForEachStatement(ForEachStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Interrupt Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Interrupt Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseInterruptStatement(InterruptStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Activity Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Activity Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseActivityStatement(ActivityStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Invoke Statement</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Invoke Statement</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseInvokeStatement(InvokeStatement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //StatementSwitch
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/AbstractComStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/AbstractComStatementValidator.java
new file mode 100644
index 0000000..009b64a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/AbstractComStatementValidator.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.AbstractComStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface AbstractComStatementValidator {
+	boolean validate();
+
+	boolean validatePort(NamedElement value);
+	boolean validateRoute(Channel value);
+	boolean validateTarget(ExpressionAsMachine value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/AbstractGuardStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/AbstractGuardStatementValidator.java
new file mode 100644
index 0000000..33fb42a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/AbstractGuardStatementValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface AbstractGuardStatementValidator {
+	boolean validate();
+
+	boolean validateCondition(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ActivityStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ActivityStatementValidator.java
new file mode 100644
index 0000000..5b69318
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ActivityStatementValidator.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression;
+
+import org.eclipse.efm.ecore.formalml.statement.ActivityStatementKind;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.ActivityStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ActivityStatementValidator {
+	boolean validate();
+
+	boolean validateOp(ActivityStatementKind value);
+	boolean validateMachine(Expression value);
+	boolean validateTuple(TupleExpression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/AssignmentStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/AssignmentStatementValidator.java
new file mode 100644
index 0000000..11b6b2d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/AssignmentStatementValidator.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.AssignmentExpression;
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.AssignmentStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface AssignmentStatementValidator {
+	boolean validate();
+
+	boolean validateExpression(AssignmentExpression value);
+	boolean validateOperator(String value);
+	boolean validateLeftHandSide(LeftHandSideExpression value);
+	boolean validateRigthHandSide(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/BlockStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/BlockStatementValidator.java
new file mode 100644
index 0000000..f77ec8e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/BlockStatementValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.statement.Statement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.BlockStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface BlockStatementValidator {
+	boolean validate();
+
+	boolean validateOp(String value);
+	boolean validateStatement(EList<Statement> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/CheckSatGuardStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/CheckSatGuardStatementValidator.java
new file mode 100644
index 0000000..0a80005
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/CheckSatGuardStatementValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface CheckSatGuardStatementValidator {
+	boolean validate();
+
+	boolean validateSolver(String value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ConditionalBlockStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ConditionalBlockStatementValidator.java
new file mode 100644
index 0000000..c3f8a40
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ConditionalBlockStatementValidator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ConditionalBlockStatementValidator {
+	boolean validate();
+
+	boolean validateCondition(Expression value);
+	boolean validateBodyBlock(BlockStatement value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/DoWhileStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/DoWhileStatementValidator.java
new file mode 100644
index 0000000..b3064af
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/DoWhileStatementValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.DoWhileStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface DoWhileStatementValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/EventGuardStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/EventGuardStatementValidator.java
new file mode 100644
index 0000000..5896274
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/EventGuardStatementValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.EventGuardStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface EventGuardStatementValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ExpressionStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ExpressionStatementValidator.java
new file mode 100644
index 0000000..5596139
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ExpressionStatementValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.ExpressionStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ExpressionStatementValidator {
+	boolean validate();
+
+	boolean validateExpression(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ForEachStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ForEachStatementValidator.java
new file mode 100644
index 0000000..c1a1df2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ForEachStatementValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.ForEachStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ForEachStatementValidator {
+	boolean validate();
+
+	boolean validateIterator(LeftHandSideExpression value);
+	boolean validateEnumeration(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ForStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ForStatementValidator.java
new file mode 100644
index 0000000..a35da87
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/ForStatementValidator.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.ForStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ForStatementValidator {
+	boolean validate();
+
+	boolean validateInit(Expression value);
+	boolean validateIterate(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/GuardStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/GuardStatementValidator.java
new file mode 100644
index 0000000..42ed91f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/GuardStatementValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.GuardStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface GuardStatementValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/IfStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/IfStatementValidator.java
new file mode 100644
index 0000000..5a61de1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/IfStatementValidator.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.IfStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface IfStatementValidator {
+	boolean validate();
+
+	boolean validateElseifStatement(EList<ConditionalBlockStatement> value);
+	boolean validateElseBlock(BlockStatement value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/InputComStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/InputComStatementValidator.java
new file mode 100644
index 0000000..c18d465
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/InputComStatementValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.InputComStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface InputComStatementValidator {
+	boolean validate();
+
+	boolean validateLeftValue(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/InterruptStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/InterruptStatementValidator.java
new file mode 100644
index 0000000..74ac64c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/InterruptStatementValidator.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.efm.ecore.formalml.statement.InterruptStatementKind;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.InterruptStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface InterruptStatementValidator {
+	boolean validate();
+
+	boolean validateKind(InterruptStatementKind value);
+	boolean validateExpr(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/InvokeStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/InvokeStatementValidator.java
new file mode 100644
index 0000000..cb6b87b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/InvokeStatementValidator.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression;
+
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.InvokeStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface InvokeStatementValidator {
+	boolean validate();
+
+	boolean validateCallProcedure(boolean value);
+	boolean validateExecRoutine(boolean value);
+	boolean validateInvokable(NamedElement value);
+	boolean validateArgs(TupleExpression value);
+	boolean validateRets(EList<Variable> value);
+	boolean validateExpression(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/NewfreshStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/NewfreshStatementValidator.java
new file mode 100644
index 0000000..c1e01b6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/NewfreshStatementValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.NewfreshStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface NewfreshStatementValidator {
+	boolean validate();
+
+	boolean validateLeftValue(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/OutputComStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/OutputComStatementValidator.java
new file mode 100644
index 0000000..7fb5e9a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/OutputComStatementValidator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.OutputComStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface OutputComStatementValidator {
+	boolean validate();
+
+	boolean validateRigthValue(EList<Expression> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/StatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/StatementValidator.java
new file mode 100644
index 0000000..7536a75
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/StatementValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.Statement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface StatementValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/TimedGuardStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/TimedGuardStatementValidator.java
new file mode 100644
index 0000000..9747554
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/TimedGuardStatementValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TimedGuardStatementValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/WhileDoStatementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/WhileDoStatementValidator.java
new file mode 100644
index 0000000..a6daea3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/statement/validation/WhileDoStatementValidator.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.statement.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.statement.WhileDoStatement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface WhileDoStatementValidator {
+	boolean validate();
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/util/FormalmlAdapterFactory.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/util/FormalmlAdapterFactory.java
new file mode 100644
index 0000000..2ff204e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/util/FormalmlAdapterFactory.java
@@ -0,0 +1,184 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.util;
+
+import org.eclipse.efm.ecore.formalml.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.FormalmlPackage
+ * @generated
+ */
+public class FormalmlAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static FormalmlPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FormalmlAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = FormalmlPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FormalmlSwitch<Adapter> modelSwitch =
+		new FormalmlSwitch<Adapter>() {
+			@Override
+			public Adapter caseXliaModel(XliaModel object) {
+				return createXliaModelAdapter();
+			}
+			@Override
+			public Adapter caseXliaNamedElement(XliaNamedElement object) {
+				return createXliaNamedElementAdapter();
+			}
+			@Override
+			public Adapter caseXliaObject(XliaObject object) {
+				return createXliaObjectAdapter();
+			}
+			@Override
+			public Adapter caseXliaAttribute(XliaAttribute object) {
+				return createXliaAttributeAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.XliaModel <em>Xlia Model</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.XliaModel
+	 * @generated
+	 */
+	public Adapter createXliaModelAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.XliaNamedElement <em>Xlia Named Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.XliaNamedElement
+	 * @generated
+	 */
+	public Adapter createXliaNamedElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.XliaObject <em>Xlia Object</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.XliaObject
+	 * @generated
+	 */
+	public Adapter createXliaObjectAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.efm.ecore.formalml.XliaAttribute <em>Xlia Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.efm.ecore.formalml.XliaAttribute
+	 * @generated
+	 */
+	public Adapter createXliaAttributeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //FormalmlAdapterFactory
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/util/FormalmlSwitch.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/util/FormalmlSwitch.java
new file mode 100644
index 0000000..83a9314
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/util/FormalmlSwitch.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2016 CEA LIST.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *  - Initial API and Implementation
+ */
+package org.eclipse.efm.ecore.formalml.util;
+
+import org.eclipse.efm.ecore.formalml.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.efm.ecore.formalml.FormalmlPackage
+ * @generated
+ */
+public class FormalmlSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static FormalmlPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FormalmlSwitch() {
+		if (modelPackage == null) {
+			modelPackage = FormalmlPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case FormalmlPackage.XLIA_MODEL: {
+				XliaModel xliaModel = (XliaModel)theEObject;
+				T result = caseXliaModel(xliaModel);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case FormalmlPackage.XLIA_NAMED_ELEMENT: {
+				XliaNamedElement xliaNamedElement = (XliaNamedElement)theEObject;
+				T result = caseXliaNamedElement(xliaNamedElement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case FormalmlPackage.XLIA_OBJECT: {
+				XliaObject xliaObject = (XliaObject)theEObject;
+				T result = caseXliaObject(xliaObject);
+				if (result == null) result = caseXliaNamedElement(xliaObject);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case FormalmlPackage.XLIA_ATTRIBUTE: {
+				XliaAttribute xliaAttribute = (XliaAttribute)theEObject;
+				T result = caseXliaAttribute(xliaAttribute);
+				if (result == null) result = caseXliaNamedElement(xliaAttribute);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Xlia Model</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Xlia Model</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseXliaModel(XliaModel object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Xlia Named Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Xlia Named Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseXliaNamedElement(XliaNamedElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Xlia Object</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Xlia Object</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseXliaObject(XliaObject object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Xlia Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Xlia Attribute</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseXliaAttribute(XliaAttribute object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //FormalmlSwitch
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaAttributeValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaAttributeValidator.java
new file mode 100644
index 0000000..e44c09f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaAttributeValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.validation;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.XliaAttribute}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface XliaAttributeValidator {
+	boolean validate();
+
+	boolean validateValue(Expression value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaModelValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaModelValidator.java
new file mode 100644
index 0000000..1c2b812
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaModelValidator.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.validation;
+
+import org.eclipse.efm.ecore.formalml.XliaObject;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.XliaModel}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface XliaModelValidator {
+	boolean validate();
+
+	boolean validateProlog(XliaObject value);
+	boolean validateSystem(org.eclipse.efm.ecore.formalml.infrastructure.System value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaNamedElementValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaNamedElementValidator.java
new file mode 100644
index 0000000..7a904a6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaNamedElementValidator.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.validation;
+
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.XliaNamedElement}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface XliaNamedElementValidator {
+	boolean validate();
+
+	boolean validateName(String value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaObjectValidator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaObjectValidator.java
new file mode 100644
index 0000000..daf0708
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src-gen/org/eclipse/efm/ecore/formalml/validation/XliaObjectValidator.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package org.eclipse.efm.ecore.formalml.validation;
+
+import org.eclipse.efm.ecore.formalml.XliaNamedElement;
+
+import org.eclipse.efm.ecore.formalml.expression.Expression;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link org.eclipse.efm.ecore.formalml.XliaObject}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface XliaObjectValidator {
+	boolean validate();
+
+	boolean validateValue(Expression value);
+	boolean validateElements(EList<XliaNamedElement> value);
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.ecore/src/org/eclipse/efm/formalml/ecore/Activator.java b/editor/xlia/org.eclipse.efm.formalml.ecore/src/org/eclipse/efm/formalml/ecore/Activator.java
new file mode 100644
index 0000000..4434002
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.ecore/src/org/eclipse/efm/formalml/ecore/Activator.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+package org.eclipse.efm.formalml.ecore;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.efm.formalml.ecore"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.classpath b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.project b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.project
new file mode 100644
index 0000000..4b48905
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.formalml.xtext.ide</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.settings/org.eclipse.core.resources.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.settings/org.eclipse.jdt.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.settings/org.eclipse.m2e.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/META-INF/MANIFEST.MF b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..703188c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.formalml.xtext.ide; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.formalml.xtext,
+ org.eclipse.efm.formalml.ecore,
+ org.eclipse.xtext.ide,
+ org.eclipse.xtext.xbase.ide
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.formalml.xtext.ide.contentassist.antlr,
+ org.eclipse.efm.formalml.xtext.ide.contentassist.antlr.internal
+
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/README.md b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/README.md
new file mode 100644
index 0000000..6c073d6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/README.md
@@ -0,0 +1,3 @@
+# EFM, Formal Modeling Language, FormalML, Xtext based Editor IDE
+
+Model Ecore for Xtext Editor
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/about.html b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/build.properties b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/build.properties
new file mode 100644
index 0000000..db8fe81
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/pom.xml b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/pom.xml
new file mode 100644
index 0000000..f4d297d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.xlia</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.formalml.xtext.ide</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.formalml.xtext.ide</name>
+	<description>This plug-in contains the xLIA's Xtext based editor IDE.</description>
+
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/FormalMLParser.java b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/FormalMLParser.java
new file mode 100644
index 0000000..b64b14f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/FormalMLParser.java
@@ -0,0 +1,1853 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ide.contentassist.antlr;
+
+import com.google.inject.Inject;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.antlr.runtime.RecognitionException;
+import org.eclipse.efm.formalml.xtext.ide.contentassist.antlr.internal.InternalFormalMLParser;
+import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+
+public class FormalMLParser extends AbstractContentAssistParser {
+
+	@Inject
+	private FormalMLGrammarAccess grammarAccess;
+
+	private Map<AbstractElement, String> nameMappings;
+
+	@Override
+	protected InternalFormalMLParser createParser() {
+		InternalFormalMLParser result = new InternalFormalMLParser(null);
+		result.setGrammarAccess(grammarAccess);
+		return result;
+	}
+
+	@Override
+	protected String getRuleName(AbstractElement element) {
+		if (nameMappings == null) {
+			nameMappings = new HashMap<AbstractElement, String>() {
+				private static final long serialVersionUID = 1L;
+				{
+					put(grammarAccess.getXliaPrologObjectAccess().getNameAlternatives_0_0(), "rule__XliaPrologObject__NameAlternatives_0_0");
+					put(grammarAccess.getXliaPrologAttributeAccess().getNameAlternatives_0_0(), "rule__XliaPrologAttribute__NameAlternatives_0_0");
+					put(grammarAccess.getXliaPrologAttributeAccess().getValueAlternatives_1_1_0(), "rule__XliaPrologAttribute__ValueAlternatives_1_1_0");
+					put(grammarAccess.getXliaNamedElementAccess().getAlternatives(), "rule__XliaNamedElement__Alternatives");
+					put(grammarAccess.getEBooleanAccess().getAlternatives(), "rule__EBoolean__Alternatives");
+					put(grammarAccess.getReservedWordAccess().getAlternatives(), "rule__ReservedWord__Alternatives");
+					put(grammarAccess.getESUfidAccess().getAlternatives_1_0(), "rule__ESUfid__Alternatives_1_0");
+					put(grammarAccess.getSystemAccess().getAlternatives_0_1(), "rule__System__Alternatives_0_1");
+					put(grammarAccess.getSystemAccess().getAlternatives_2_2(), "rule__System__Alternatives_2_2");
+					put(grammarAccess.getSystemAccess().getAlternatives_6(), "rule__System__Alternatives_6");
+					put(grammarAccess.getSystemAccess().getAlternatives_7(), "rule__System__Alternatives_7");
+					put(grammarAccess.getSystemAccess().getAlternatives_7_0_1(), "rule__System__Alternatives_7_0_1");
+					put(grammarAccess.getSystemAccess().getAlternatives_7_1_1(), "rule__System__Alternatives_7_1_1");
+					put(grammarAccess.getSystemAccess().getAlternatives_7_2_1(), "rule__System__Alternatives_7_2_1");
+					put(grammarAccess.getSystemAccess().getAlternatives_7_3_1(), "rule__System__Alternatives_7_3_1");
+					put(grammarAccess.getSystemAccess().getAlternatives_8(), "rule__System__Alternatives_8");
+					put(grammarAccess.getSystemAccess().getAlternatives_8_0(), "rule__System__Alternatives_8_0");
+					put(grammarAccess.getSystemAccess().getAlternatives_8_0_0_0(), "rule__System__Alternatives_8_0_0_0");
+					put(grammarAccess.getSystemAccess().getAlternatives_8_1(), "rule__System__Alternatives_8_1");
+					put(grammarAccess.getSystemAccess().getAlternatives_9(), "rule__System__Alternatives_9");
+					put(grammarAccess.getSystemAccess().getAlternatives_9_0_0(), "rule__System__Alternatives_9_0_0");
+					put(grammarAccess.getSystemAccess().getAlternatives_9_0_1(), "rule__System__Alternatives_9_0_1");
+					put(grammarAccess.getSystemAccess().getAlternatives_10(), "rule__System__Alternatives_10");
+					put(grammarAccess.getAnyMachineBlockAccess().getAlternatives(), "rule__AnyMachineBlock__Alternatives");
+					put(grammarAccess.getInstanceMachineAccess().getAlternatives_1(), "rule__InstanceMachine__Alternatives_1");
+					put(grammarAccess.getInstanceMachineAccess().getAlternatives_8(), "rule__InstanceMachine__Alternatives_8");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_0_1(), "rule__MachineBlock__Alternatives_0_1");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_2_2(), "rule__MachineBlock__Alternatives_2_2");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_6(), "rule__MachineBlock__Alternatives_6");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_7(), "rule__MachineBlock__Alternatives_7");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_7_0_1(), "rule__MachineBlock__Alternatives_7_0_1");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_7_1_1(), "rule__MachineBlock__Alternatives_7_1_1");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_7_2_1(), "rule__MachineBlock__Alternatives_7_2_1");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_7_3_1(), "rule__MachineBlock__Alternatives_7_3_1");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_8(), "rule__MachineBlock__Alternatives_8");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_8_0(), "rule__MachineBlock__Alternatives_8_0");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_8_0_0_0(), "rule__MachineBlock__Alternatives_8_0_0_0");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_8_1(), "rule__MachineBlock__Alternatives_8_1");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_9(), "rule__MachineBlock__Alternatives_9");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_0(), "rule__MachineBlock__Alternatives_9_0_0");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_1(), "rule__MachineBlock__Alternatives_9_0_1");
+					put(grammarAccess.getMachineBlockAccess().getAlternatives_10(), "rule__MachineBlock__Alternatives_10");
+					put(grammarAccess.getProcedureAccess().getAlternatives_2_2(), "rule__Procedure__Alternatives_2_2");
+					put(grammarAccess.getProcedureAccess().getAlternatives_5_1_1(), "rule__Procedure__Alternatives_5_1_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_7(), "rule__Procedure__Alternatives_7");
+					put(grammarAccess.getProcedureAccess().getAlternatives_7_0_1(), "rule__Procedure__Alternatives_7_0_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_0_1(), "rule__Procedure__Alternatives_7_0_1_0_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_1_1(), "rule__Procedure__Alternatives_7_0_1_1_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_2_1(), "rule__Procedure__Alternatives_7_0_1_2_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_3_1(), "rule__Procedure__Alternatives_7_0_1_3_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_7_1(), "rule__Procedure__Alternatives_7_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_8(), "rule__Procedure__Alternatives_8");
+					put(grammarAccess.getProcedureAccess().getAlternatives_8_0_1(), "rule__Procedure__Alternatives_8_0_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_8_1_1(), "rule__Procedure__Alternatives_8_1_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_8_2_1(), "rule__Procedure__Alternatives_8_2_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_8_3_1(), "rule__Procedure__Alternatives_8_3_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_9(), "rule__Procedure__Alternatives_9");
+					put(grammarAccess.getProcedureAccess().getAlternatives_9_0_1(), "rule__Procedure__Alternatives_9_0_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_9_1_1(), "rule__Procedure__Alternatives_9_1_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_9_2_1(), "rule__Procedure__Alternatives_9_2_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_9_3_1(), "rule__Procedure__Alternatives_9_3_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_10(), "rule__Procedure__Alternatives_10");
+					put(grammarAccess.getProcedureAccess().getAlternatives_10_0(), "rule__Procedure__Alternatives_10_0");
+					put(grammarAccess.getProcedureAccess().getAlternatives_10_0_0_0(), "rule__Procedure__Alternatives_10_0_0_0");
+					put(grammarAccess.getProcedureAccess().getAlternatives_10_1(), "rule__Procedure__Alternatives_10_1");
+					put(grammarAccess.getProcedureAccess().getAlternatives_11(), "rule__Procedure__Alternatives_11");
+					put(grammarAccess.getMoeBehaviorAccess().getAlternatives_1_1(), "rule__MoeBehavior__Alternatives_1_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_1_1(), "rule__Statemachine__Alternatives_1_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_3_2(), "rule__Statemachine__Alternatives_3_2");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_7(), "rule__Statemachine__Alternatives_7");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1(), "rule__Statemachine__Alternatives_7_0_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_0_1(), "rule__Statemachine__Alternatives_7_0_1_0_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_1_1(), "rule__Statemachine__Alternatives_7_0_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_2_1(), "rule__Statemachine__Alternatives_7_0_1_2_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_3_1(), "rule__Statemachine__Alternatives_7_0_1_3_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_7_1(), "rule__Statemachine__Alternatives_7_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_8(), "rule__Statemachine__Alternatives_8");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_8_0_1(), "rule__Statemachine__Alternatives_8_0_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_8_1_1(), "rule__Statemachine__Alternatives_8_1_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_8_2_1(), "rule__Statemachine__Alternatives_8_2_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_8_3_1(), "rule__Statemachine__Alternatives_8_3_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_9(), "rule__Statemachine__Alternatives_9");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_9_0_1(), "rule__Statemachine__Alternatives_9_0_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_9_1_1(), "rule__Statemachine__Alternatives_9_1_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_9_2_1(), "rule__Statemachine__Alternatives_9_2_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_9_3_1(), "rule__Statemachine__Alternatives_9_3_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_10(), "rule__Statemachine__Alternatives_10");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_10_0(), "rule__Statemachine__Alternatives_10_0");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_10_0_0_0(), "rule__Statemachine__Alternatives_10_0_0_0");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_10_1(), "rule__Statemachine__Alternatives_10_1");
+					put(grammarAccess.getStatemachineAccess().getAlternatives_11(), "rule__Statemachine__Alternatives_11");
+					put(grammarAccess.getStatemachineRegionAccess().getAlternatives_1(), "rule__StatemachineRegion__Alternatives_1");
+					put(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_0(), "rule__StatemachineRegion__Alternatives_1_0");
+					put(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_1_0(), "rule__StatemachineRegion__Alternatives_1_1_0");
+					put(grammarAccess.getStatemachineRegionAccess().getAlternatives_2(), "rule__StatemachineRegion__Alternatives_2");
+					put(grammarAccess.getStatemachineRegionLiteAccess().getAlternatives(), "rule__StatemachineRegionLite__Alternatives");
+					put(grammarAccess.getStateAccess().getAlternatives(), "rule__State__Alternatives");
+					put(grammarAccess.getCompositeStateAccess().getAlternatives_4(), "rule__CompositeState__Alternatives_4");
+					put(grammarAccess.getCompositeStateAccess().getAlternatives_8(), "rule__CompositeState__Alternatives_8");
+					put(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1(), "rule__CompositeState__Alternatives_8_0_1");
+					put(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_0(), "rule__CompositeState__Alternatives_8_0_1_0");
+					put(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_1_1(), "rule__CompositeState__Alternatives_8_0_1_1_1");
+					put(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAlternatives_1_0(), "rule__MoeCompositeStateRoutines__NameAlternatives_1_0");
+					put(grammarAccess.getSimpleStateAccess().getAlternatives_5(), "rule__SimpleState__Alternatives_5");
+					put(grammarAccess.getSimpleStateAccess().getAlternatives_5_0_1(), "rule__SimpleState__Alternatives_5_0_1");
+					put(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAlternatives_1_0(), "rule__MoeSimpleStateRoutines__NameAlternatives_1_0");
+					put(grammarAccess.getStartStateAccess().getAlternatives_1(), "rule__StartState__Alternatives_1");
+					put(grammarAccess.getStartStateAccess().getAlternatives_3(), "rule__StartState__Alternatives_3");
+					put(grammarAccess.getStartStateAccess().getAlternatives_3_0_1(), "rule__StartState__Alternatives_3_0_1");
+					put(grammarAccess.getMoeStartStateRoutinesAccess().getNameAlternatives_1_0(), "rule__MoeStartStateRoutines__NameAlternatives_1_0");
+					put(grammarAccess.getFinalStateAccess().getAlternatives_1(), "rule__FinalState__Alternatives_1");
+					put(grammarAccess.getFinalStateAccess().getAlternatives_3(), "rule__FinalState__Alternatives_3");
+					put(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAlternatives_1_0(), "rule__MoeFinalStateRoutines__NameAlternatives_1_0");
+					put(grammarAccess.getPseudostateAccess().getAlternatives(), "rule__Pseudostate__Alternatives");
+					put(grammarAccess.getOtherPseudostateAccess().getAlternatives_1(), "rule__OtherPseudostate__Alternatives_1");
+					put(grammarAccess.getOtherPseudostateAccess().getAlternatives_8(), "rule__OtherPseudostate__Alternatives_8");
+					put(grammarAccess.getPseudostateInitialAccess().getAlternatives_1(), "rule__PseudostateInitial__Alternatives_1");
+					put(grammarAccess.getPseudostateInitialAccess().getAlternatives_1_0_0(), "rule__PseudostateInitial__Alternatives_1_0_0");
+					put(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_0_5_0(), "rule__PseudostateInitial__NameAlternatives_1_0_5_0");
+					put(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_1_0(), "rule__PseudostateInitial__NameAlternatives_1_1_0");
+					put(grammarAccess.getPseudostateInitialAccess().getAlternatives_3(), "rule__PseudostateInitial__Alternatives_3");
+					put(grammarAccess.getEndingPseudostateAccess().getAlternatives_1(), "rule__EndingPseudostate__Alternatives_1");
+					put(grammarAccess.getEndingPseudostateAccess().getAlternatives_8(), "rule__EndingPseudostate__Alternatives_8");
+					put(grammarAccess.getMoeRoutineAccess().getAlternatives_2_1(), "rule__MoeRoutine__Alternatives_2_1");
+					put(grammarAccess.getRoutineAccess().getAlternatives_6_1(), "rule__Routine__Alternatives_6_1");
+					put(grammarAccess.getModelOfInteractionAccess().getAlternatives_2(), "rule__ModelOfInteraction__Alternatives_2");
+					put(grammarAccess.getRouteAccess().getAlternatives_7(), "rule__Route__Alternatives_7");
+					put(grammarAccess.getComRouteProtocolAccess().getAlternatives(), "rule__ComRouteProtocol__Alternatives");
+					put(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1(), "rule__ComRouteProtocol__Alternatives_1_1");
+					put(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_0_1(), "rule__ComRouteProtocol__Alternatives_1_1_0_1");
+					put(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_1_1(), "rule__ComRouteProtocol__Alternatives_1_1_1_1");
+					put(grammarAccess.getComProtocolAccess().getAlternatives(), "rule__ComProtocol__Alternatives");
+					put(grammarAccess.getComProtocolAccess().getAlternatives_2_1(), "rule__ComProtocol__Alternatives_2_1");
+					put(grammarAccess.getComProtocolAccess().getAlternatives_2_1_0_1(), "rule__ComProtocol__Alternatives_2_1_0_1");
+					put(grammarAccess.getComProtocolAccess().getAlternatives_2_1_1_1(), "rule__ComProtocol__Alternatives_2_1_1_1");
+					put(grammarAccess.getComPointAccess().getAlternatives_3(), "rule__ComPoint__Alternatives_3");
+					put(grammarAccess.getComPointProtocolAccess().getAlternatives(), "rule__ComPointProtocol__Alternatives");
+					put(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1(), "rule__ComPointProtocol__Alternatives_0_1");
+					put(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_0_1(), "rule__ComPointProtocol__Alternatives_0_1_0_1");
+					put(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_1_1(), "rule__ComPointProtocol__Alternatives_0_1_1_1");
+					put(grammarAccess.getComElementAccess().getAlternatives(), "rule__ComElement__Alternatives");
+					put(grammarAccess.getComElementAccess().getKindAlternatives_0_1_1_0(), "rule__ComElement__KindAlternatives_0_1_1_0");
+					put(grammarAccess.getComElementAccess().getKindAlternatives_1_2_0(), "rule__ComElement__KindAlternatives_1_2_0");
+					put(grammarAccess.getTypeDefinitionAccess().getAlternatives(), "rule__TypeDefinition__Alternatives");
+					put(grammarAccess.getTypeDefinitionImplAccess().getAlternatives(), "rule__TypeDefinitionImpl__Alternatives");
+					put(grammarAccess.getDataTypeMultiplicityAccess().getAlternatives(), "rule__DataTypeMultiplicity__Alternatives");
+					put(grammarAccess.getDataTypeReferenceAccess().getAlternatives(), "rule__DataTypeReference__Alternatives");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getAlternatives_5(), "rule__OtherDataTypeDefinition__Alternatives_5");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getAlternatives_3(), "rule__OtherDataTypeDefinitionImpl__Alternatives_3");
+					put(grammarAccess.getDataTypeAccess().getAlternatives(), "rule__DataType__Alternatives");
+					put(grammarAccess.getSimpleDataTypeAccess().getAlternatives(), "rule__SimpleDataType__Alternatives");
+					put(grammarAccess.getStructuredDataTypeAccess().getAlternatives(), "rule__StructuredDataType__Alternatives");
+					put(grammarAccess.getPrimitiveTypeAccess().getAlternatives(), "rule__PrimitiveType__Alternatives");
+					put(grammarAccess.getPrimitiveNumberTypeAccess().getAlternatives(), "rule__PrimitiveNumberType__Alternatives");
+					put(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_2(), "rule__PrimitiveIntegerType__Alternatives_2");
+					put(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_3(), "rule__PrimitiveIntegerType__Alternatives_3");
+					put(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_2(), "rule__PrimitiveRationalType__Alternatives_2");
+					put(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_3(), "rule__PrimitiveRationalType__Alternatives_3");
+					put(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_2(), "rule__PrimitiveFloatType__Alternatives_2");
+					put(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_3(), "rule__PrimitiveFloatType__Alternatives_3");
+					put(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_2(), "rule__PrimitiveRealType__Alternatives_2");
+					put(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_3(), "rule__PrimitiveRealType__Alternatives_3");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives(), "rule__PrimitiveTimeType__Alternatives");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_0_2(), "rule__PrimitiveTimeType__Alternatives_0_2");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_1_2(), "rule__PrimitiveTimeType__Alternatives_1_2");
+					put(grammarAccess.getPrimitiveTimeNumberTypeAccess().getAlternatives(), "rule__PrimitiveTimeNumberType__Alternatives");
+					put(grammarAccess.getOtherPrimitiveTypeAccess().getAlternatives(), "rule__OtherPrimitiveType__Alternatives");
+					put(grammarAccess.getPrimitiveBooleanTypeAccess().getAlternatives_1(), "rule__PrimitiveBooleanType__Alternatives_1");
+					put(grammarAccess.getPrimitiveStringTypeAccess().getAlternatives_2(), "rule__PrimitiveStringType__Alternatives_2");
+					put(grammarAccess.getIntervalTypeAccess().getAlternatives_4(), "rule__IntervalType__Alternatives_4");
+					put(grammarAccess.getIntervalTypeAccess().getAlternatives_8(), "rule__IntervalType__Alternatives_8");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_8(), "rule__IntervalTypeDefinition__Alternatives_8");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_12(), "rule__IntervalTypeDefinition__Alternatives_12");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_6(), "rule__IntervalTypeDefinitionImpl__Alternatives_6");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_10(), "rule__IntervalTypeDefinitionImpl__Alternatives_10");
+					put(grammarAccess.getCollectionTypeAccess().getAlternatives_4_1(), "rule__CollectionType__Alternatives_4_1");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getAlternatives_8_1(), "rule__CollectionTypeDefinition__Alternatives_8_1");
+					put(grammarAccess.getCollectionTypeDefinitionImplAccess().getAlternatives_6_1(), "rule__CollectionTypeDefinitionImpl__Alternatives_6_1");
+					put(grammarAccess.getVariableAccess().getAlternatives_1(), "rule__Variable__Alternatives_1");
+					put(grammarAccess.getVariableAccess().getAlternatives_1_2_0(), "rule__Variable__Alternatives_1_2_0");
+					put(grammarAccess.getVariableAccess().getAlternatives_1_3_1(), "rule__Variable__Alternatives_1_3_1");
+					put(grammarAccess.getVariableAccess().getAlternatives_6(), "rule__Variable__Alternatives_6");
+					put(grammarAccess.getVariableImplAccess().getAlternatives_0_0(), "rule__VariableImpl__Alternatives_0_0");
+					put(grammarAccess.getVariableImplAccess().getAlternatives_5(), "rule__VariableImpl__Alternatives_5");
+					put(grammarAccess.getVariablePublicAccess().getAlternatives_1_0(), "rule__VariablePublic__Alternatives_1_0");
+					put(grammarAccess.getVariablePublicAccess().getAlternatives_7(), "rule__VariablePublic__Alternatives_7");
+					put(grammarAccess.getVariableProtectedAccess().getAlternatives_1_0(), "rule__VariableProtected__Alternatives_1_0");
+					put(grammarAccess.getVariableProtectedAccess().getAlternatives_7(), "rule__VariableProtected__Alternatives_7");
+					put(grammarAccess.getVariablePrivateAccess().getAlternatives_1_0(), "rule__VariablePrivate__Alternatives_1_0");
+					put(grammarAccess.getVariablePrivateAccess().getAlternatives_7(), "rule__VariablePrivate__Alternatives_7");
+					put(grammarAccess.getBlockParameterSetAccess().getAlternatives_1(), "rule__BlockParameterSet__Alternatives_1");
+					put(grammarAccess.getBlockParameterSetAccess().getAlternatives_1_0_1(), "rule__BlockParameterSet__Alternatives_1_0_1");
+					put(grammarAccess.getBlockParameterSetAccess().getAlternatives_1_1_1(), "rule__BlockParameterSet__Alternatives_1_1_1");
+					put(grammarAccess.getBlockParameterSetAccess().getAlternatives_1_2_1(), "rule__BlockParameterSet__Alternatives_1_2_1");
+					put(grammarAccess.getBlockParameterSetAccess().getAlternatives_1_3_1(), "rule__BlockParameterSet__Alternatives_1_3_1");
+					put(grammarAccess.getBufferContainerTypeAccess().getAlternatives_2_1(), "rule__BufferContainerType__Alternatives_2_1");
+					put(grammarAccess.getTransitionAccess().getAlternatives_5(), "rule__Transition__Alternatives_5");
+					put(grammarAccess.getTransitionAccess().getAlternatives_5_0_1(), "rule__Transition__Alternatives_5_0_1");
+					put(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_1(), "rule__Transition__Alternatives_5_0_1_0_1");
+					put(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_2(), "rule__Transition__Alternatives_5_0_1_0_2");
+					put(grammarAccess.getTransitionAccess().getAlternatives_5_1_2(), "rule__Transition__Alternatives_5_1_2");
+					put(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1(), "rule__Transition__Alternatives_5_1_2_0_1");
+					put(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_1(), "rule__Transition__Alternatives_5_1_2_0_1_0_1");
+					put(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_2(), "rule__Transition__Alternatives_5_1_2_0_1_0_2");
+					put(grammarAccess.getTransitionMoeAccess().getAlternatives_1(), "rule__TransitionMoe__Alternatives_1");
+					put(grammarAccess.getTransitionMoeAccess().getAlternatives_1_0_1(), "rule__TransitionMoe__Alternatives_1_0_1");
+					put(grammarAccess.getTransitionGuardAccess().getAlternatives(), "rule__TransitionGuard__Alternatives");
+					put(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1(), "rule__TransitionGuard__Alternatives_1_1");
+					put(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1_0_1(), "rule__TransitionGuard__Alternatives_1_1_0_1");
+					put(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAlternatives_1_0(), "rule__TransitionGuardExpression__OperatorAlternatives_1_0");
+					put(grammarAccess.getTransitionTimedGuardAccess().getAlternatives(), "rule__TransitionTimedGuard__Alternatives");
+					put(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1(), "rule__TransitionTimedGuard__Alternatives_1_1");
+					put(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1_0_1(), "rule__TransitionTimedGuard__Alternatives_1_1_0_1");
+					put(grammarAccess.getTransitionEffectStatementAccess().getAlternatives(), "rule__TransitionEffectStatement__Alternatives");
+					put(grammarAccess.getStatementAccess().getAlternatives(), "rule__Statement__Alternatives");
+					put(grammarAccess.getBlockStatementSchedulerAccess().getAlternatives(), "rule__BlockStatementScheduler__Alternatives");
+					put(grammarAccess.getExpressionStatementAccess().getAlternatives(), "rule__ExpressionStatement__Alternatives");
+					put(grammarAccess.getInputComStatementAccess().getAlternatives_3_1_0(), "rule__InputComStatement__Alternatives_3_1_0");
+					put(grammarAccess.getOutputComStatementAccess().getAlternatives_3_1_0(), "rule__OutputComStatement__Alternatives_3_1_0");
+					put(grammarAccess.getElseIfStatementAccess().getAlternatives_0(), "rule__ElseIfStatement__Alternatives_0");
+					put(grammarAccess.getForStatementAccess().getAlternatives(), "rule__ForStatement__Alternatives");
+					put(grammarAccess.getForAssignmentExpressionAccess().getAlternatives(), "rule__ForAssignmentExpression__Alternatives");
+					put(grammarAccess.getForEachStatementAccess().getAlternatives(), "rule__ForEachStatement__Alternatives");
+					put(grammarAccess.getInterruptStatementAccess().getAlternatives_1(), "rule__InterruptStatement__Alternatives_1");
+					put(grammarAccess.getInvokeStatementAccess().getAlternatives(), "rule__InvokeStatement__Alternatives");
+					put(grammarAccess.getInvokeStatementAccess().getAlternatives_1_4_1(), "rule__InvokeStatement__Alternatives_1_4_1");
+					put(grammarAccess.getInvokeStatementAccess().getAlternatives_2_5_1(), "rule__InvokeStatement__Alternatives_2_5_1");
+					put(grammarAccess.getInvokeStatementAccess().getAlternatives_3_3_1(), "rule__InvokeStatement__Alternatives_3_3_1");
+					put(grammarAccess.getExpressionAccess().getAlternatives(), "rule__Expression__Alternatives");
+					put(grammarAccess.getAssignmentOperatorAccess().getAlternatives(), "rule__AssignmentOperator__Alternatives");
+					put(grammarAccess.getLeftHandSideExpressionAccess().getAlternatives_1(), "rule__LeftHandSideExpression__Alternatives_1");
+					put(grammarAccess.getLogicalOrExpressionAccess().getOperatorAlternatives_1_1_0(), "rule__LogicalOrExpression__OperatorAlternatives_1_1_0");
+					put(grammarAccess.getLogicalOrExpressionAccess().getAlternatives_1_3_0(), "rule__LogicalOrExpression__Alternatives_1_3_0");
+					put(grammarAccess.getLogicalAndExpressionAccess().getOperatorAlternatives_1_1_0(), "rule__LogicalAndExpression__OperatorAlternatives_1_1_0");
+					put(grammarAccess.getLogicalAndExpressionAccess().getAlternatives_1_3_0(), "rule__LogicalAndExpression__Alternatives_1_3_0");
+					put(grammarAccess.getEqualityOperatorAccess().getAlternatives(), "rule__EqualityOperator__Alternatives");
+					put(grammarAccess.getRelationalOperatorAccess().getAlternatives(), "rule__RelationalOperator__Alternatives");
+					put(grammarAccess.getAdditiveExpressionAccess().getAlternatives_1(), "rule__AdditiveExpression__Alternatives_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1(), "rule__MultiplicativeExpression__Alternatives_1");
+					put(grammarAccess.getUnaryExpressionAccess().getAlternatives(), "rule__UnaryExpression__Alternatives");
+					put(grammarAccess.getAffixOperatorAccess().getAlternatives(), "rule__AffixOperator__Alternatives");
+					put(grammarAccess.getNewfreshExpressionAccess().getAlternatives(), "rule__NewfreshExpression__Alternatives");
+					put(grammarAccess.getArithmeticUnaryOperatorAccess().getAlternatives(), "rule__ArithmeticUnaryOperator__Alternatives");
+					put(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAlternatives_0_0(), "rule__LogicalUnaryExpression__OperatorAlternatives_0_0");
+					put(grammarAccess.getPrimaryExpressionAccess().getAlternatives_1_3(), "rule__PrimaryExpression__Alternatives_1_3");
+					put(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_3(), "rule__PrimaryExpression__Alternatives_2_3");
+					put(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_4_3(), "rule__PrimaryExpression__Alternatives_2_4_3");
+					put(grammarAccess.getBaseExpressionAccess().getAlternatives(), "rule__BaseExpression__Alternatives");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getAlternatives_3(), "rule__DynamicInstanceSpecification__Alternatives_3");
+					put(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_1_0(), "rule__MixTupleExpressionList__ValueAlternatives_1_0");
+					put(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_2_1_0(), "rule__MixTupleExpressionList__ValueAlternatives_2_1_0");
+					put(grammarAccess.getNamedExpressionAccess().getAlternatives_1(), "rule__NamedExpression__Alternatives_1");
+					put(grammarAccess.getLiteralExpressionAccess().getAlternatives(), "rule__LiteralExpression__Alternatives");
+					put(grammarAccess.getLiteralReferenceableExpressionAccess().getAlternatives(), "rule__LiteralReferenceableExpression__Alternatives");
+					put(grammarAccess.getLiteralTerminalExpressionAccess().getAlternatives(), "rule__LiteralTerminalExpression__Alternatives");
+					put(grammarAccess.getLiteralNullExpressionAccess().getAlternatives(), "rule__LiteralNullExpression__Alternatives");
+					put(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_0_1(), "rule__LiteralNullExpression__Alternatives_0_1");
+					put(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_1_1(), "rule__LiteralNullExpression__Alternatives_1_1");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_0(), "rule__LiteralCollectionExpression__Alternatives_3_0");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_1_1(), "rule__LiteralCollectionExpression__Alternatives_3_1_1");
+					put(grammarAccess.getLiteralReferenceExpressionAccess().getAlternatives(), "rule__LiteralReferenceExpression__Alternatives");
+					put(grammarAccess.getLiteralReferenceElementAccess().getAlternatives_2(), "rule__LiteralReferenceElement__Alternatives_2");
+					put(grammarAccess.getLiteralReferenceVariableContextAccess().getAlternatives(), "rule__LiteralReferenceVariableContext__Alternatives");
+					put(grammarAccess.getLiteralReferenceMachineContextAccess().getAlternatives(), "rule__LiteralReferenceMachineContext__Alternatives");
+					put(grammarAccess.getLiteralEnvExpressionAccess().getAlternatives_1(), "rule__LiteralEnvExpression__Alternatives_1");
+					put(grammarAccess.getLiteralPureReferenceExpressionAccess().getAlternatives(), "rule__LiteralPureReferenceExpression__Alternatives");
+					put(grammarAccess.getVisibilityKindAccess().getAlternatives(), "rule__VisibilityKind__Alternatives");
+					put(grammarAccess.getDesignKindAccess().getAlternatives(), "rule__DesignKind__Alternatives");
+					put(grammarAccess.getPseudostateKindAccess().getAlternatives(), "rule__PseudostateKind__Alternatives");
+					put(grammarAccess.getEndingPseudostateKindAccess().getAlternatives(), "rule__EndingPseudostateKind__Alternatives");
+					put(grammarAccess.getComProtocolKindAccess().getAlternatives(), "rule__ComProtocolKind__Alternatives");
+					put(grammarAccess.getComEnvRdvProtocolKindAccess().getAlternatives(), "rule__ComEnvRdvProtocolKind__Alternatives");
+					put(grammarAccess.getComCastKingAccess().getAlternatives(), "rule__ComCastKing__Alternatives");
+					put(grammarAccess.getPrimitiveNumberSignAccess().getAlternatives(), "rule__PrimitiveNumberSign__Alternatives");
+					put(grammarAccess.getPrimitiveInstanceKindAccess().getAlternatives(), "rule__PrimitiveInstanceKind__Alternatives");
+					put(grammarAccess.getCollectionKindAccess().getAlternatives(), "rule__CollectionKind__Alternatives");
+					put(grammarAccess.getParameterDirectionKindAccess().getAlternatives(), "rule__ParameterDirectionKind__Alternatives");
+					put(grammarAccess.getBlockParameterDirectionKindAccess().getAlternatives(), "rule__BlockParameterDirectionKind__Alternatives");
+					put(grammarAccess.getBufferContainerKindAccess().getAlternatives(), "rule__BufferContainerKind__Alternatives");
+					put(grammarAccess.getChannelDirectionAccess().getAlternatives(), "rule__ChannelDirection__Alternatives");
+					put(grammarAccess.getTransitionMocAccess().getAlternatives(), "rule__TransitionMoc__Alternatives");
+					put(grammarAccess.getInterruptStatementKindAccess().getAlternatives(), "rule__InterruptStatementKind__Alternatives");
+					put(grammarAccess.getOPERATOR_ACTIVITYAccess().getAlternatives(), "rule__OPERATOR_ACTIVITY__Alternatives");
+					put(grammarAccess.getXliaAccess().getGroup(), "rule__Xlia__Group__0");
+					put(grammarAccess.getXliaPrologObjectAccess().getGroup(), "rule__XliaPrologObject__Group__0");
+					put(grammarAccess.getXliaPrologAttributeAccess().getGroup(), "rule__XliaPrologAttribute__Group__0");
+					put(grammarAccess.getXliaPrologAttributeAccess().getGroup_1(), "rule__XliaPrologAttribute__Group_1__0");
+					put(grammarAccess.getXliaOptionObjectAccess().getGroup(), "rule__XliaOptionObject__Group__0");
+					put(grammarAccess.getXliaObjectAccess().getGroup(), "rule__XliaObject__Group__0");
+					put(grammarAccess.getXliaAttributeAccess().getGroup(), "rule__XliaAttribute__Group__0");
+					put(grammarAccess.getEIntAccess().getGroup(), "rule__EInt__Group__0");
+					put(grammarAccess.getEIntegerAccess().getGroup(), "rule__EInteger__Group__0");
+					put(grammarAccess.getEFloatAccess().getGroup(), "rule__EFloat__Group__0");
+					put(grammarAccess.getEDoubleAccess().getGroup(), "rule__EDouble__Group__0");
+					put(grammarAccess.getESUfidAccess().getGroup(), "rule__ESUfid__Group__0");
+					put(grammarAccess.getESUfidAccess().getGroup_1(), "rule__ESUfid__Group_1__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup(), "rule__QualifiedName__Group__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup_1(), "rule__QualifiedName__Group_1__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup_2(), "rule__QualifiedName__Group_2__0");
+					put(grammarAccess.getPotentiallyAmbiguousQualifiedNameAccess().getGroup(), "rule__PotentiallyAmbiguousQualifiedName__Group__0");
+					put(grammarAccess.getPotentiallyAmbiguousQualifiedNameAccess().getGroup_1(), "rule__PotentiallyAmbiguousQualifiedName__Group_1__0");
+					put(grammarAccess.getPotentiallyAmbiguousQualifiedNameAccess().getGroup_2(), "rule__PotentiallyAmbiguousQualifiedName__Group_2__0");
+					put(grammarAccess.getPotentiallyAmbiguousQualifiedNameAccess().getGroup_2_2(), "rule__PotentiallyAmbiguousQualifiedName__Group_2_2__0");
+					put(grammarAccess.getColonQualifiedNameAccess().getGroup(), "rule__ColonQualifiedName__Group__0");
+					put(grammarAccess.getColonQualifiedNameAccess().getGroup_1(), "rule__ColonQualifiedName__Group_1__0");
+					put(grammarAccess.getDotQualifiedNameAccess().getGroup(), "rule__DotQualifiedName__Group__0");
+					put(grammarAccess.getDotQualifiedNameAccess().getGroup_1(), "rule__DotQualifiedName__Group_1__0");
+					put(grammarAccess.getSystemAccess().getGroup(), "rule__System__Group__0");
+					put(grammarAccess.getSystemAccess().getGroup_2(), "rule__System__Group_2__0");
+					put(grammarAccess.getSystemAccess().getGroup_7_0(), "rule__System__Group_7_0__0");
+					put(grammarAccess.getSystemAccess().getGroup_7_1(), "rule__System__Group_7_1__0");
+					put(grammarAccess.getSystemAccess().getGroup_7_2(), "rule__System__Group_7_2__0");
+					put(grammarAccess.getSystemAccess().getGroup_7_3(), "rule__System__Group_7_3__0");
+					put(grammarAccess.getSystemAccess().getGroup_8_0_0(), "rule__System__Group_8_0_0__0");
+					put(grammarAccess.getSystemAccess().getGroup_8_0_1(), "rule__System__Group_8_0_1__0");
+					put(grammarAccess.getSystemAccess().getGroup_9_0(), "rule__System__Group_9_0__0");
+					put(grammarAccess.getSystemAccess().getGroup_9_1(), "rule__System__Group_9_1__0");
+					put(grammarAccess.getSystemAccess().getGroup_9_2(), "rule__System__Group_9_2__0");
+					put(grammarAccess.getSystemAccess().getGroup_9_3(), "rule__System__Group_9_3__0");
+					put(grammarAccess.getSystemAccess().getGroup_10_0(), "rule__System__Group_10_0__0");
+					put(grammarAccess.getSystemAccess().getGroup_10_1(), "rule__System__Group_10_1__0");
+					put(grammarAccess.getInstanceMachineAccess().getGroup(), "rule__InstanceMachine__Group__0");
+					put(grammarAccess.getInstanceMachineAccess().getGroup_8_0(), "rule__InstanceMachine__Group_8_0__0");
+					put(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0(), "rule__InstanceMachine__Group_8_0_0__0");
+					put(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1(), "rule__InstanceMachine__Group_8_0_0_1__0");
+					put(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1_1(), "rule__InstanceMachine__Group_8_0_0_1_1__0");
+					put(grammarAccess.getInstanceMachineAccess().getGroup_8_1(), "rule__InstanceMachine__Group_8_1__0");
+					put(grammarAccess.getInstanceMachineAccess().getGroup_8_1_1(), "rule__InstanceMachine__Group_8_1_1__0");
+					put(grammarAccess.getSlotParameterAccess().getGroup(), "rule__SlotParameter__Group__0");
+					put(grammarAccess.getSlotPropertyAccess().getGroup(), "rule__SlotProperty__Group__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup(), "rule__MachineBlock__Group__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_2(), "rule__MachineBlock__Group_2__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_7_0(), "rule__MachineBlock__Group_7_0__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_7_1(), "rule__MachineBlock__Group_7_1__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_7_2(), "rule__MachineBlock__Group_7_2__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_7_3(), "rule__MachineBlock__Group_7_3__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_8_0_0(), "rule__MachineBlock__Group_8_0_0__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_8_0_1(), "rule__MachineBlock__Group_8_0_1__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_9_0(), "rule__MachineBlock__Group_9_0__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_9_1(), "rule__MachineBlock__Group_9_1__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_9_2(), "rule__MachineBlock__Group_9_2__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_9_3(), "rule__MachineBlock__Group_9_3__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_10_0(), "rule__MachineBlock__Group_10_0__0");
+					put(grammarAccess.getMachineBlockAccess().getGroup_10_1(), "rule__MachineBlock__Group_10_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup(), "rule__Procedure__Group__0");
+					put(grammarAccess.getProcedureAccess().getGroup_2(), "rule__Procedure__Group_2__0");
+					put(grammarAccess.getProcedureAccess().getGroup_5(), "rule__Procedure__Group_5__0");
+					put(grammarAccess.getProcedureAccess().getGroup_5_0(), "rule__Procedure__Group_5_0__0");
+					put(grammarAccess.getProcedureAccess().getGroup_5_0_1(), "rule__Procedure__Group_5_0_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_5_0_1_1(), "rule__Procedure__Group_5_0_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_5_1(), "rule__Procedure__Group_5_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_5_1_1_1(), "rule__Procedure__Group_5_1_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_5_1_1_1_2(), "rule__Procedure__Group_5_1_1_1_2__0");
+					put(grammarAccess.getProcedureAccess().getGroup_7_0(), "rule__Procedure__Group_7_0__0");
+					put(grammarAccess.getProcedureAccess().getGroup_7_0_1_0(), "rule__Procedure__Group_7_0_1_0__0");
+					put(grammarAccess.getProcedureAccess().getGroup_7_0_1_0_1_1(), "rule__Procedure__Group_7_0_1_0_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_7_0_1_1(), "rule__Procedure__Group_7_0_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_7_0_1_1_1_1(), "rule__Procedure__Group_7_0_1_1_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_7_0_1_2(), "rule__Procedure__Group_7_0_1_2__0");
+					put(grammarAccess.getProcedureAccess().getGroup_7_0_1_2_1_1(), "rule__Procedure__Group_7_0_1_2_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_7_0_1_3(), "rule__Procedure__Group_7_0_1_3__0");
+					put(grammarAccess.getProcedureAccess().getGroup_7_0_1_3_1_1(), "rule__Procedure__Group_7_0_1_3_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_8_0(), "rule__Procedure__Group_8_0__0");
+					put(grammarAccess.getProcedureAccess().getGroup_8_0_1_1(), "rule__Procedure__Group_8_0_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_8_1(), "rule__Procedure__Group_8_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_8_1_1_1(), "rule__Procedure__Group_8_1_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_8_2(), "rule__Procedure__Group_8_2__0");
+					put(grammarAccess.getProcedureAccess().getGroup_8_2_1_1(), "rule__Procedure__Group_8_2_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_8_3(), "rule__Procedure__Group_8_3__0");
+					put(grammarAccess.getProcedureAccess().getGroup_8_3_1_1(), "rule__Procedure__Group_8_3_1_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_9_0(), "rule__Procedure__Group_9_0__0");
+					put(grammarAccess.getProcedureAccess().getGroup_9_1(), "rule__Procedure__Group_9_1__0");
+					put(grammarAccess.getProcedureAccess().getGroup_9_2(), "rule__Procedure__Group_9_2__0");
+					put(grammarAccess.getProcedureAccess().getGroup_9_3(), "rule__Procedure__Group_9_3__0");
+					put(grammarAccess.getProcedureAccess().getGroup_10_0_0(), "rule__Procedure__Group_10_0_0__0");
+					put(grammarAccess.getProcedureAccess().getGroup_10_0_1(), "rule__Procedure__Group_10_0_1__0");
+					put(grammarAccess.getProcedureExecutionAccess().getGroup(), "rule__ProcedureExecution__Group__0");
+					put(grammarAccess.getProcedureExecutionAccess().getGroup_2_0(), "rule__ProcedureExecution__Group_2_0__0");
+					put(grammarAccess.getProcedureExecutionAccess().getGroup_2_1(), "rule__ProcedureExecution__Group_2_1__0");
+					put(grammarAccess.getMoeBehaviorAccess().getGroup(), "rule__MoeBehavior__Group__0");
+					put(grammarAccess.getMoeBehaviorAccess().getGroup_1(), "rule__MoeBehavior__Group_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup(), "rule__Statemachine__Group__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_3(), "rule__Statemachine__Group_3__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_7_0(), "rule__Statemachine__Group_7_0__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0(), "rule__Statemachine__Group_7_0_1_0__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0_1_1(), "rule__Statemachine__Group_7_0_1_0_1_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1(), "rule__Statemachine__Group_7_0_1_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1_1_1(), "rule__Statemachine__Group_7_0_1_1_1_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2(), "rule__Statemachine__Group_7_0_1_2__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2_1_1(), "rule__Statemachine__Group_7_0_1_2_1_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3(), "rule__Statemachine__Group_7_0_1_3__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3_1_1(), "rule__Statemachine__Group_7_0_1_3_1_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8_0(), "rule__Statemachine__Group_8_0__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8_0_1_1(), "rule__Statemachine__Group_8_0_1_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8_1(), "rule__Statemachine__Group_8_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8_1_1_1(), "rule__Statemachine__Group_8_1_1_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8_2(), "rule__Statemachine__Group_8_2__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8_2_1_1(), "rule__Statemachine__Group_8_2_1_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8_3(), "rule__Statemachine__Group_8_3__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_8_3_1_1(), "rule__Statemachine__Group_8_3_1_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_9_0(), "rule__Statemachine__Group_9_0__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_9_1(), "rule__Statemachine__Group_9_1__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_9_2(), "rule__Statemachine__Group_9_2__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_9_3(), "rule__Statemachine__Group_9_3__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_10_0_0(), "rule__Statemachine__Group_10_0_0__0");
+					put(grammarAccess.getStatemachineAccess().getGroup_10_0_1(), "rule__Statemachine__Group_10_0_1__0");
+					put(grammarAccess.getStatemachineRegionAccess().getGroup(), "rule__StatemachineRegion__Group__0");
+					put(grammarAccess.getStatemachineRegionAccess().getGroup_1_1(), "rule__StatemachineRegion__Group_1_1__0");
+					put(grammarAccess.getCompositeStateAccess().getGroup(), "rule__CompositeState__Group__0");
+					put(grammarAccess.getCompositeStateAccess().getGroup_8_0(), "rule__CompositeState__Group_8_0__0");
+					put(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_1(), "rule__CompositeState__Group_8_0_1_0_1__0");
+					put(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_2(), "rule__CompositeState__Group_8_0_1_0_2__0");
+					put(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_1(), "rule__CompositeState__Group_8_0_1_1__0");
+					put(grammarAccess.getMoeCompositeStateRoutinesAccess().getGroup(), "rule__MoeCompositeStateRoutines__Group__0");
+					put(grammarAccess.getSimpleStateAccess().getGroup(), "rule__SimpleState__Group__0");
+					put(grammarAccess.getSimpleStateAccess().getGroup_2(), "rule__SimpleState__Group_2__0");
+					put(grammarAccess.getSimpleStateAccess().getGroup_5_0(), "rule__SimpleState__Group_5_0__0");
+					put(grammarAccess.getMoeSimpleStateRoutinesAccess().getGroup(), "rule__MoeSimpleStateRoutines__Group__0");
+					put(grammarAccess.getStartStateAccess().getGroup(), "rule__StartState__Group__0");
+					put(grammarAccess.getStartStateAccess().getGroup_1_0(), "rule__StartState__Group_1_0__0");
+					put(grammarAccess.getStartStateAccess().getGroup_3_0(), "rule__StartState__Group_3_0__0");
+					put(grammarAccess.getMoeStartStateRoutinesAccess().getGroup(), "rule__MoeStartStateRoutines__Group__0");
+					put(grammarAccess.getFinalStateAccess().getGroup(), "rule__FinalState__Group__0");
+					put(grammarAccess.getFinalStateAccess().getGroup_1_0(), "rule__FinalState__Group_1_0__0");
+					put(grammarAccess.getFinalStateAccess().getGroup_3_0(), "rule__FinalState__Group_3_0__0");
+					put(grammarAccess.getMoeFinalStateRoutinesAccess().getGroup(), "rule__MoeFinalStateRoutines__Group__0");
+					put(grammarAccess.getOtherPseudostateAccess().getGroup(), "rule__OtherPseudostate__Group__0");
+					put(grammarAccess.getOtherPseudostateAccess().getGroup_8_0(), "rule__OtherPseudostate__Group_8_0__0");
+					put(grammarAccess.getPseudostateInitialAccess().getGroup(), "rule__PseudostateInitial__Group__0");
+					put(grammarAccess.getPseudostateInitialAccess().getGroup_1_0(), "rule__PseudostateInitial__Group_1_0__0");
+					put(grammarAccess.getPseudostateInitialAccess().getGroup_3_0(), "rule__PseudostateInitial__Group_3_0__0");
+					put(grammarAccess.getEndingPseudostateAccess().getGroup(), "rule__EndingPseudostate__Group__0");
+					put(grammarAccess.getEndingPseudostateAccess().getGroup_8_0(), "rule__EndingPseudostate__Group_8_0__0");
+					put(grammarAccess.getModelOfExecutionAccess().getGroup(), "rule__ModelOfExecution__Group__0");
+					put(grammarAccess.getModelOfExecutionAccess().getGroup_3_0(), "rule__ModelOfExecution__Group_3_0__0");
+					put(grammarAccess.getModelOfExecutionAccess().getGroup_3_1(), "rule__ModelOfExecution__Group_3_1__0");
+					put(grammarAccess.getModelOfExecutionAccess().getGroup_3_2(), "rule__ModelOfExecution__Group_3_2__0");
+					put(grammarAccess.getModelOfExecutionAccess().getGroup_3_3(), "rule__ModelOfExecution__Group_3_3__0");
+					put(grammarAccess.getModelOfExecutionAccess().getGroup_3_4(), "rule__ModelOfExecution__Group_3_4__0");
+					put(grammarAccess.getModelOfExecutionAccess().getGroup_3_5(), "rule__ModelOfExecution__Group_3_5__0");
+					put(grammarAccess.getModelOfExecutionAccess().getGroup_3_6(), "rule__ModelOfExecution__Group_3_6__0");
+					put(grammarAccess.getModelOfExecutionAccess().getGroup_3_7(), "rule__ModelOfExecution__Group_3_7__0");
+					put(grammarAccess.getMoeRoutineAccess().getGroup(), "rule__MoeRoutine__Group__0");
+					put(grammarAccess.getMoeRoutineAccess().getGroup_1(), "rule__MoeRoutine__Group_1__0");
+					put(grammarAccess.getMoeRoutineAccess().getGroup_2(), "rule__MoeRoutine__Group_2__0");
+					put(grammarAccess.getMoeRoutineAccess().getGroup_2_1_0(), "rule__MoeRoutine__Group_2_1_0__0");
+					put(grammarAccess.getRoutineAccess().getGroup(), "rule__Routine__Group__0");
+					put(grammarAccess.getRoutineAccess().getGroup_5(), "rule__Routine__Group_5__0");
+					put(grammarAccess.getRoutineAccess().getGroup_6(), "rule__Routine__Group_6__0");
+					put(grammarAccess.getRoutineAccess().getGroup_6_1_0(), "rule__Routine__Group_6_1_0__0");
+					put(grammarAccess.getModelOfInteractionAccess().getGroup(), "rule__ModelOfInteraction__Group__0");
+					put(grammarAccess.getRouteAccess().getGroup(), "rule__Route__Group__0");
+					put(grammarAccess.getRouteAccess().getGroup_5(), "rule__Route__Group_5__0");
+					put(grammarAccess.getRouteAccess().getGroup_7_1(), "rule__Route__Group_7_1__0");
+					put(grammarAccess.getRouteAccess().getGroup_7_1_1(), "rule__Route__Group_7_1_1__0");
+					put(grammarAccess.getComRouteProtocolAccess().getGroup_1(), "rule__ComRouteProtocol__Group_1__0");
+					put(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_0(), "rule__ComRouteProtocol__Group_1_1_0__0");
+					put(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_1(), "rule__ComRouteProtocol__Group_1_1_1__0");
+					put(grammarAccess.getConnectionAccess().getGroup(), "rule__Connection__Group__0");
+					put(grammarAccess.getConnectionAccess().getGroup_4(), "rule__Connection__Group_4__0");
+					put(grammarAccess.getComProtocolAccess().getGroup_1(), "rule__ComProtocol__Group_1__0");
+					put(grammarAccess.getComProtocolAccess().getGroup_1_1(), "rule__ComProtocol__Group_1_1__0");
+					put(grammarAccess.getComProtocolAccess().getGroup_2(), "rule__ComProtocol__Group_2__0");
+					put(grammarAccess.getComProtocolAccess().getGroup_2_1_0(), "rule__ComProtocol__Group_2_1_0__0");
+					put(grammarAccess.getComProtocolAccess().getGroup_2_1_1(), "rule__ComProtocol__Group_2_1_1__0");
+					put(grammarAccess.getComPointAccess().getGroup(), "rule__ComPoint__Group__0");
+					put(grammarAccess.getComPointAccess().getGroup_2(), "rule__ComPoint__Group_2__0");
+					put(grammarAccess.getComPointAccess().getGroup_3_0(), "rule__ComPoint__Group_3_0__0");
+					put(grammarAccess.getComPointAccess().getGroup_3_1(), "rule__ComPoint__Group_3_1__0");
+					put(grammarAccess.getComPointProtocolAccess().getGroup_0(), "rule__ComPointProtocol__Group_0__0");
+					put(grammarAccess.getComPointProtocolAccess().getGroup_0_1_0(), "rule__ComPointProtocol__Group_0_1_0__0");
+					put(grammarAccess.getComPointProtocolAccess().getGroup_0_1_1(), "rule__ComPointProtocol__Group_0_1_1__0");
+					put(grammarAccess.getComElementAccess().getGroup_0(), "rule__ComElement__Group_0__0");
+					put(grammarAccess.getComElementAccess().getGroup_0_1(), "rule__ComElement__Group_0_1__0");
+					put(grammarAccess.getComElementAccess().getGroup_1(), "rule__ComElement__Group_1__0");
+					put(grammarAccess.getDataTypeReferenceAccess().getGroup_0(), "rule__DataTypeReference__Group_0__0");
+					put(grammarAccess.getDataTypeReferenceAccess().getGroup_0_1(), "rule__DataTypeReference__Group_0_1__0");
+					put(grammarAccess.getDataTypeReferenceAccess().getGroup_1(), "rule__DataTypeReference__Group_1__0");
+					put(grammarAccess.getDataTypeReferenceAccess().getGroup_1_2(), "rule__DataTypeReference__Group_1_2__0");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup(), "rule__OtherDataTypeDefinition__Group__0");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0(), "rule__OtherDataTypeDefinition__Group_5_0__0");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0_1(), "rule__OtherDataTypeDefinition__Group_5_0_1__0");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1(), "rule__OtherDataTypeDefinition__Group_5_1__0");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1_1(), "rule__OtherDataTypeDefinition__Group_5_1_1__0");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup(), "rule__OtherDataTypeDefinitionImpl__Group__0");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0(), "rule__OtherDataTypeDefinitionImpl__Group_3_0__0");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0_1(), "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1(), "rule__OtherDataTypeDefinitionImpl__Group_3_1__0");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1_1(), "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0");
+					put(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup(), "rule__PrimitiveIntegerType__Group__0");
+					put(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_0(), "rule__PrimitiveIntegerType__Group_3_0__0");
+					put(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_1(), "rule__PrimitiveIntegerType__Group_3_1__0");
+					put(grammarAccess.getPrimitiveRationalTypeAccess().getGroup(), "rule__PrimitiveRationalType__Group__0");
+					put(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_0(), "rule__PrimitiveRationalType__Group_3_0__0");
+					put(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_1(), "rule__PrimitiveRationalType__Group_3_1__0");
+					put(grammarAccess.getPrimitiveFloatTypeAccess().getGroup(), "rule__PrimitiveFloatType__Group__0");
+					put(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_0(), "rule__PrimitiveFloatType__Group_3_0__0");
+					put(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_1(), "rule__PrimitiveFloatType__Group_3_1__0");
+					put(grammarAccess.getPrimitiveRealTypeAccess().getGroup(), "rule__PrimitiveRealType__Group__0");
+					put(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_0(), "rule__PrimitiveRealType__Group_3_0__0");
+					put(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_1(), "rule__PrimitiveRealType__Group_3_1__0");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0(), "rule__PrimitiveTimeType__Group_0__0");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0_2_0(), "rule__PrimitiveTimeType__Group_0_2_0__0");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1(), "rule__PrimitiveTimeType__Group_1__0");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1_2_0(), "rule__PrimitiveTimeType__Group_1_2_0__0");
+					put(grammarAccess.getPrimitiveBooleanTypeAccess().getGroup(), "rule__PrimitiveBooleanType__Group__0");
+					put(grammarAccess.getPrimitiveCharacterTypeAccess().getGroup(), "rule__PrimitiveCharacterType__Group__0");
+					put(grammarAccess.getPrimitiveStringTypeAccess().getGroup(), "rule__PrimitiveStringType__Group__0");
+					put(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_0(), "rule__PrimitiveStringType__Group_2_0__0");
+					put(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_1(), "rule__PrimitiveStringType__Group_2_1__0");
+					put(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup(), "rule__PrimitiveInstanceType__Group__0");
+					put(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup_2(), "rule__PrimitiveInstanceType__Group_2__0");
+					put(grammarAccess.getIntervalTypeAccess().getGroup(), "rule__IntervalType__Group__0");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getGroup(), "rule__IntervalTypeDefinition__Group__0");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getGroup(), "rule__IntervalTypeDefinitionImpl__Group__0");
+					put(grammarAccess.getCollectionTypeAccess().getGroup(), "rule__CollectionType__Group__0");
+					put(grammarAccess.getCollectionTypeAccess().getGroup_4(), "rule__CollectionType__Group_4__0");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getGroup(), "rule__CollectionTypeDefinition__Group__0");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getGroup_8(), "rule__CollectionTypeDefinition__Group_8__0");
+					put(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup(), "rule__CollectionTypeDefinitionImpl__Group__0");
+					put(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup_6(), "rule__CollectionTypeDefinitionImpl__Group_6__0");
+					put(grammarAccess.getEnumerationTypeAccess().getGroup(), "rule__EnumerationType__Group__0");
+					put(grammarAccess.getEnumerationTypeAccess().getGroup_4(), "rule__EnumerationType__Group_4__0");
+					put(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup(), "rule__EnumerationTypeDefinition__Group__0");
+					put(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup_8(), "rule__EnumerationTypeDefinition__Group_8__0");
+					put(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup(), "rule__EnumerationTypeDefinitionImpl__Group__0");
+					put(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup_6(), "rule__EnumerationTypeDefinitionImpl__Group_6__0");
+					put(grammarAccess.getEnumerationLiteralAccess().getGroup(), "rule__EnumerationLiteral__Group__0");
+					put(grammarAccess.getEnumerationLiteralAccess().getGroup_2(), "rule__EnumerationLiteral__Group_2__0");
+					put(grammarAccess.getStructureTypeAccess().getGroup(), "rule__StructureType__Group__0");
+					put(grammarAccess.getStructureTypeDefinitionAccess().getGroup(), "rule__StructureTypeDefinition__Group__0");
+					put(grammarAccess.getStructureTypeDefinitionImplAccess().getGroup(), "rule__StructureTypeDefinitionImpl__Group__0");
+					put(grammarAccess.getUnionTypeAccess().getGroup(), "rule__UnionType__Group__0");
+					put(grammarAccess.getUnionTypeDefinitionAccess().getGroup(), "rule__UnionTypeDefinition__Group__0");
+					put(grammarAccess.getUnionTypeDefinitionImplAccess().getGroup(), "rule__UnionTypeDefinitionImpl__Group__0");
+					put(grammarAccess.getChoiceTypeAccess().getGroup(), "rule__ChoiceType__Group__0");
+					put(grammarAccess.getChoiceTypeDefinitionAccess().getGroup(), "rule__ChoiceTypeDefinition__Group__0");
+					put(grammarAccess.getChoiceTypeDefinitionImplAccess().getGroup(), "rule__ChoiceTypeDefinitionImpl__Group__0");
+					put(grammarAccess.getModifierAccess().getGroup(), "rule__Modifier__Group__0");
+					put(grammarAccess.getVariableAccess().getGroup(), "rule__Variable__Group__0");
+					put(grammarAccess.getVariableAccess().getGroup_1_2(), "rule__Variable__Group_1_2__0");
+					put(grammarAccess.getVariableAccess().getGroup_1_3(), "rule__Variable__Group_1_3__0");
+					put(grammarAccess.getVariableAccess().getGroup_5(), "rule__Variable__Group_5__0");
+					put(grammarAccess.getVariableAccess().getGroup_6_0(), "rule__Variable__Group_6_0__0");
+					put(grammarAccess.getVariableImplAccess().getGroup(), "rule__VariableImpl__Group__0");
+					put(grammarAccess.getVariableImplAccess().getGroup_4(), "rule__VariableImpl__Group_4__0");
+					put(grammarAccess.getVariableImplAccess().getGroup_5_0(), "rule__VariableImpl__Group_5_0__0");
+					put(grammarAccess.getOnWriteRoutineAccess().getGroup(), "rule__OnWriteRoutine__Group__0");
+					put(grammarAccess.getOnWriteRoutineAccess().getGroup_2(), "rule__OnWriteRoutine__Group_2__0");
+					put(grammarAccess.getVariableRoutineParameterAccess().getGroup(), "rule__VariableRoutineParameter__Group__0");
+					put(grammarAccess.getVariableRoutineParameterAccess().getGroup_2(), "rule__VariableRoutineParameter__Group_2__0");
+					put(grammarAccess.getVariablePublicAccess().getGroup(), "rule__VariablePublic__Group__0");
+					put(grammarAccess.getVariablePublicAccess().getGroup_6(), "rule__VariablePublic__Group_6__0");
+					put(grammarAccess.getVariablePublicAccess().getGroup_7_0(), "rule__VariablePublic__Group_7_0__0");
+					put(grammarAccess.getVariableProtectedAccess().getGroup(), "rule__VariableProtected__Group__0");
+					put(grammarAccess.getVariableProtectedAccess().getGroup_6(), "rule__VariableProtected__Group_6__0");
+					put(grammarAccess.getVariableProtectedAccess().getGroup_7_0(), "rule__VariableProtected__Group_7_0__0");
+					put(grammarAccess.getVariablePrivateAccess().getGroup(), "rule__VariablePrivate__Group__0");
+					put(grammarAccess.getVariablePrivateAccess().getGroup_6(), "rule__VariablePrivate__Group_6__0");
+					put(grammarAccess.getVariablePrivateAccess().getGroup_7_0(), "rule__VariablePrivate__Group_7_0__0");
+					put(grammarAccess.getFunctionalParameterSetAccess().getGroup(), "rule__FunctionalParameterSet__Group__0");
+					put(grammarAccess.getFunctionalParameterSetAccess().getGroup_2(), "rule__FunctionalParameterSet__Group_2__0");
+					put(grammarAccess.getFunctionalParameterAccess().getGroup(), "rule__FunctionalParameter__Group__0");
+					put(grammarAccess.getFunctionalParameterAccess().getGroup_4(), "rule__FunctionalParameter__Group_4__0");
+					put(grammarAccess.getFormalParameterSetAccess().getGroup(), "rule__FormalParameterSet__Group__0");
+					put(grammarAccess.getFormalParameterSetAccess().getGroup_2(), "rule__FormalParameterSet__Group_2__0");
+					put(grammarAccess.getFormalParameterAccess().getGroup(), "rule__FormalParameter__Group__0");
+					put(grammarAccess.getFormalParameterAccess().getGroup_4(), "rule__FormalParameter__Group_4__0");
+					put(grammarAccess.getBlockParameterSetAccess().getGroup(), "rule__BlockParameterSet__Group__0");
+					put(grammarAccess.getBlockParameterSetAccess().getGroup_1_0(), "rule__BlockParameterSet__Group_1_0__0");
+					put(grammarAccess.getBlockParameterSetAccess().getGroup_1_0_1_1(), "rule__BlockParameterSet__Group_1_0_1_1__0");
+					put(grammarAccess.getBlockParameterSetAccess().getGroup_1_1(), "rule__BlockParameterSet__Group_1_1__0");
+					put(grammarAccess.getBlockParameterSetAccess().getGroup_1_1_1_1(), "rule__BlockParameterSet__Group_1_1_1_1__0");
+					put(grammarAccess.getBlockParameterSetAccess().getGroup_1_2(), "rule__BlockParameterSet__Group_1_2__0");
+					put(grammarAccess.getBlockParameterSetAccess().getGroup_1_2_1_1(), "rule__BlockParameterSet__Group_1_2_1_1__0");
+					put(grammarAccess.getBlockParameterSetAccess().getGroup_1_3(), "rule__BlockParameterSet__Group_1_3__0");
+					put(grammarAccess.getBlockParameterSetAccess().getGroup_1_3_1_1(), "rule__BlockParameterSet__Group_1_3_1_1__0");
+					put(grammarAccess.getParameterInputAccess().getGroup(), "rule__ParameterInput__Group__0");
+					put(grammarAccess.getParameterInputAccess().getGroup_4(), "rule__ParameterInput__Group_4__0");
+					put(grammarAccess.getParameterInoutAccess().getGroup(), "rule__ParameterInout__Group__0");
+					put(grammarAccess.getParameterInoutAccess().getGroup_4(), "rule__ParameterInout__Group_4__0");
+					put(grammarAccess.getParameterOutputAccess().getGroup(), "rule__ParameterOutput__Group__0");
+					put(grammarAccess.getParameterOutputAccess().getGroup_4(), "rule__ParameterOutput__Group_4__0");
+					put(grammarAccess.getParameterReturnAccess().getGroup(), "rule__ParameterReturn__Group__0");
+					put(grammarAccess.getParameterReturnAccess().getGroup_4(), "rule__ParameterReturn__Group_4__0");
+					put(grammarAccess.getParameterDeclarationAccess().getGroup(), "rule__ParameterDeclaration__Group__0");
+					put(grammarAccess.getParameterDeclarationAccess().getGroup_5(), "rule__ParameterDeclaration__Group_5__0");
+					put(grammarAccess.getBufferContainerTypeAccess().getGroup(), "rule__BufferContainerType__Group__0");
+					put(grammarAccess.getBufferContainerTypeAccess().getGroup_2(), "rule__BufferContainerType__Group_2__0");
+					put(grammarAccess.getBufferAccess().getGroup(), "rule__Buffer__Group__0");
+					put(grammarAccess.getBufferImplAccess().getGroup(), "rule__BufferImpl__Group__0");
+					put(grammarAccess.getBufferPublicAccess().getGroup(), "rule__BufferPublic__Group__0");
+					put(grammarAccess.getBufferProtectedAccess().getGroup(), "rule__BufferProtected__Group__0");
+					put(grammarAccess.getBufferPrivateAccess().getGroup(), "rule__BufferPrivate__Group__0");
+					put(grammarAccess.getPortAccess().getGroup(), "rule__Port__Group__0");
+					put(grammarAccess.getPortAccess().getGroup_5(), "rule__Port__Group_5__0");
+					put(grammarAccess.getPortAccess().getGroup_5_2(), "rule__Port__Group_5_2__0");
+					put(grammarAccess.getPortImplAccess().getGroup(), "rule__PortImpl__Group__0");
+					put(grammarAccess.getPortImplAccess().getGroup_3(), "rule__PortImpl__Group_3__0");
+					put(grammarAccess.getPortImplAccess().getGroup_3_2(), "rule__PortImpl__Group_3_2__0");
+					put(grammarAccess.getPortPublicAccess().getGroup(), "rule__PortPublic__Group__0");
+					put(grammarAccess.getPortPublicAccess().getGroup_4(), "rule__PortPublic__Group_4__0");
+					put(grammarAccess.getPortPublicAccess().getGroup_4_2(), "rule__PortPublic__Group_4_2__0");
+					put(grammarAccess.getPortProtectedAccess().getGroup(), "rule__PortProtected__Group__0");
+					put(grammarAccess.getPortProtectedAccess().getGroup_4(), "rule__PortProtected__Group_4__0");
+					put(grammarAccess.getPortProtectedAccess().getGroup_4_2(), "rule__PortProtected__Group_4_2__0");
+					put(grammarAccess.getPortPrivateAccess().getGroup(), "rule__PortPrivate__Group__0");
+					put(grammarAccess.getPortPrivateAccess().getGroup_4(), "rule__PortPrivate__Group_4__0");
+					put(grammarAccess.getPortPrivateAccess().getGroup_4_2(), "rule__PortPrivate__Group_4_2__0");
+					put(grammarAccess.getSignalAccess().getGroup(), "rule__Signal__Group__0");
+					put(grammarAccess.getSignalAccess().getGroup_5(), "rule__Signal__Group_5__0");
+					put(grammarAccess.getSignalAccess().getGroup_5_2(), "rule__Signal__Group_5_2__0");
+					put(grammarAccess.getSignalImplAccess().getGroup(), "rule__SignalImpl__Group__0");
+					put(grammarAccess.getSignalImplAccess().getGroup_3(), "rule__SignalImpl__Group_3__0");
+					put(grammarAccess.getSignalImplAccess().getGroup_3_2(), "rule__SignalImpl__Group_3_2__0");
+					put(grammarAccess.getSignalPublicAccess().getGroup(), "rule__SignalPublic__Group__0");
+					put(grammarAccess.getSignalPublicAccess().getGroup_4(), "rule__SignalPublic__Group_4__0");
+					put(grammarAccess.getSignalPublicAccess().getGroup_4_2(), "rule__SignalPublic__Group_4_2__0");
+					put(grammarAccess.getSignalProtectedAccess().getGroup(), "rule__SignalProtected__Group__0");
+					put(grammarAccess.getSignalProtectedAccess().getGroup_4(), "rule__SignalProtected__Group_4__0");
+					put(grammarAccess.getSignalProtectedAccess().getGroup_4_2(), "rule__SignalProtected__Group_4_2__0");
+					put(grammarAccess.getSignalPrivateAccess().getGroup(), "rule__SignalPrivate__Group__0");
+					put(grammarAccess.getSignalPrivateAccess().getGroup_4(), "rule__SignalPrivate__Group_4__0");
+					put(grammarAccess.getSignalPrivateAccess().getGroup_4_2(), "rule__SignalPrivate__Group_4_2__0");
+					put(grammarAccess.getChannelAccess().getGroup(), "rule__Channel__Group__0");
+					put(grammarAccess.getChannelAccess().getGroup_5(), "rule__Channel__Group_5__0");
+					put(grammarAccess.getSignalReferenceAccess().getGroup(), "rule__SignalReference__Group__0");
+					put(grammarAccess.getChannelPublicAccess().getGroup(), "rule__ChannelPublic__Group__0");
+					put(grammarAccess.getChannelPublicAccess().getGroup_4(), "rule__ChannelPublic__Group_4__0");
+					put(grammarAccess.getChannelProtectedAccess().getGroup(), "rule__ChannelProtected__Group__0");
+					put(grammarAccess.getChannelProtectedAccess().getGroup_4(), "rule__ChannelProtected__Group_4__0");
+					put(grammarAccess.getChannelPrivateAccess().getGroup(), "rule__ChannelPrivate__Group__0");
+					put(grammarAccess.getChannelPrivateAccess().getGroup_4(), "rule__ChannelPrivate__Group_4__0");
+					put(grammarAccess.getTransitionAccess().getGroup(), "rule__Transition__Group__0");
+					put(grammarAccess.getTransitionAccess().getGroup_4(), "rule__Transition__Group_4__0");
+					put(grammarAccess.getTransitionAccess().getGroup_5_0(), "rule__Transition__Group_5_0__0");
+					put(grammarAccess.getTransitionAccess().getGroup_5_0_1_0(), "rule__Transition__Group_5_0_1_0__0");
+					put(grammarAccess.getTransitionAccess().getGroup_5_0_1_0_0(), "rule__Transition__Group_5_0_1_0_0__0");
+					put(grammarAccess.getTransitionAccess().getGroup_5_0_3(), "rule__Transition__Group_5_0_3__0");
+					put(grammarAccess.getTransitionAccess().getGroup_5_1(), "rule__Transition__Group_5_1__0");
+					put(grammarAccess.getTransitionAccess().getGroup_5_1_2_0(), "rule__Transition__Group_5_1_2_0__0");
+					put(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0(), "rule__Transition__Group_5_1_2_0_1_0__0");
+					put(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0_0(), "rule__Transition__Group_5_1_2_0_1_0_0__0");
+					put(grammarAccess.getTransitionMoeAccess().getGroup(), "rule__TransitionMoe__Group__0");
+					put(grammarAccess.getTransitionMoeAccess().getGroup_1_0(), "rule__TransitionMoe__Group_1_0__0");
+					put(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0(), "rule__TransitionMoe__Group_1_0_1_0__0");
+					put(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0_1(), "rule__TransitionMoe__Group_1_0_1_0_1__0");
+					put(grammarAccess.getTransitionMoeAccess().getGroup_1_0_2(), "rule__TransitionMoe__Group_1_0_2__0");
+					put(grammarAccess.getTransitionMoeAccess().getGroup_1_1(), "rule__TransitionMoe__Group_1_1__0");
+					put(grammarAccess.getTransitionBehaviorAccess().getGroup(), "rule__TransitionBehavior__Group__0");
+					put(grammarAccess.getTransitionGuardAccess().getGroup_0(), "rule__TransitionGuard__Group_0__0");
+					put(grammarAccess.getTransitionGuardAccess().getGroup_1(), "rule__TransitionGuard__Group_1__0");
+					put(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0(), "rule__TransitionGuard__Group_1_1_0__0");
+					put(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0_1_0(), "rule__TransitionGuard__Group_1_1_0_1_0__0");
+					put(grammarAccess.getTransitionGuardExpressionAccess().getGroup(), "rule__TransitionGuardExpression__Group__0");
+					put(grammarAccess.getTransitionTimedGuardAccess().getGroup_0(), "rule__TransitionTimedGuard__Group_0__0");
+					put(grammarAccess.getTransitionTimedGuardAccess().getGroup_1(), "rule__TransitionTimedGuard__Group_1__0");
+					put(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0(), "rule__TransitionTimedGuard__Group_1_1_0__0");
+					put(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0_1_0(), "rule__TransitionTimedGuard__Group_1_1_0_1_0__0");
+					put(grammarAccess.getTransitionEffectAccess().getGroup(), "rule__TransitionEffect__Group__0");
+					put(grammarAccess.getTransitionEffectAccess().getGroup_1(), "rule__TransitionEffect__Group_1__0");
+					put(grammarAccess.getBlockStatementAccess().getGroup(), "rule__BlockStatement__Group__0");
+					put(grammarAccess.getExpressionStatementAccess().getGroup_0(), "rule__ExpressionStatement__Group_0__0");
+					put(grammarAccess.getExpressionStatementAccess().getGroup_1(), "rule__ExpressionStatement__Group_1__0");
+					put(grammarAccess.getExpressionStatementAccess().getGroup_2(), "rule__ExpressionStatement__Group_2__0");
+					put(grammarAccess.getExpressionStatementAccess().getGroup_3(), "rule__ExpressionStatement__Group_3__0");
+					put(grammarAccess.getGuardStatementAccess().getGroup(), "rule__GuardStatement__Group__0");
+					put(grammarAccess.getTimedGuardStatementAccess().getGroup(), "rule__TimedGuardStatement__Group__0");
+					put(grammarAccess.getEventGuardStatementAccess().getGroup(), "rule__EventGuardStatement__Group__0");
+					put(grammarAccess.getCheckSatGuardStatementAccess().getGroup(), "rule__CheckSatGuardStatement__Group__0");
+					put(grammarAccess.getInputComStatementAccess().getGroup(), "rule__InputComStatement__Group__0");
+					put(grammarAccess.getInputComStatementAccess().getGroup_2(), "rule__InputComStatement__Group_2__0");
+					put(grammarAccess.getInputComStatementAccess().getGroup_2_2(), "rule__InputComStatement__Group_2_2__0");
+					put(grammarAccess.getInputComStatementAccess().getGroup_3_0(), "rule__InputComStatement__Group_3_0__0");
+					put(grammarAccess.getInputComStatementAccess().getGroup_3_1(), "rule__InputComStatement__Group_3_1__0");
+					put(grammarAccess.getOutputComStatementAccess().getGroup(), "rule__OutputComStatement__Group__0");
+					put(grammarAccess.getOutputComStatementAccess().getGroup_2(), "rule__OutputComStatement__Group_2__0");
+					put(grammarAccess.getOutputComStatementAccess().getGroup_2_2(), "rule__OutputComStatement__Group_2_2__0");
+					put(grammarAccess.getOutputComStatementAccess().getGroup_3_0(), "rule__OutputComStatement__Group_3_0__0");
+					put(grammarAccess.getOutputComStatementAccess().getGroup_3_1(), "rule__OutputComStatement__Group_3_1__0");
+					put(grammarAccess.getIfStatementAccess().getGroup(), "rule__IfStatement__Group__0");
+					put(grammarAccess.getIfStatementAccess().getGroup_4(), "rule__IfStatement__Group_4__0");
+					put(grammarAccess.getElseIfStatementAccess().getGroup(), "rule__ElseIfStatement__Group__0");
+					put(grammarAccess.getElseIfStatementAccess().getGroup_0_1(), "rule__ElseIfStatement__Group_0_1__0");
+					put(grammarAccess.getWhileDoStatementAccess().getGroup(), "rule__WhileDoStatement__Group__0");
+					put(grammarAccess.getDoWhileStatementAccess().getGroup(), "rule__DoWhileStatement__Group__0");
+					put(grammarAccess.getForStatementAccess().getGroup_0(), "rule__ForStatement__Group_0__0");
+					put(grammarAccess.getForStatementAccess().getGroup_1(), "rule__ForStatement__Group_1__0");
+					put(grammarAccess.getForEachStatementAccess().getGroup_0(), "rule__ForEachStatement__Group_0__0");
+					put(grammarAccess.getForEachStatementAccess().getGroup_1(), "rule__ForEachStatement__Group_1__0");
+					put(grammarAccess.getInterruptStatementAccess().getGroup(), "rule__InterruptStatement__Group__0");
+					put(grammarAccess.getInterruptStatementAccess().getGroup_1_1(), "rule__InterruptStatement__Group_1_1__0");
+					put(grammarAccess.getInterruptStatementAccess().getGroup_1_1_2(), "rule__InterruptStatement__Group_1_1_2__0");
+					put(grammarAccess.getActivityStatementAccess().getGroup(), "rule__ActivityStatement__Group__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_0(), "rule__InvokeStatement__Group_0__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_1(), "rule__InvokeStatement__Group_1__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_1_4(), "rule__InvokeStatement__Group_1_4__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0(), "rule__InvokeStatement__Group_1_4_1_0__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0_1(), "rule__InvokeStatement__Group_1_4_1_0_1__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1(), "rule__InvokeStatement__Group_1_4_1_1__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1_2(), "rule__InvokeStatement__Group_1_4_1_1_2__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_2(), "rule__InvokeStatement__Group_2__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_2_5(), "rule__InvokeStatement__Group_2_5__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0(), "rule__InvokeStatement__Group_2_5_1_0__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0_1(), "rule__InvokeStatement__Group_2_5_1_0_1__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1(), "rule__InvokeStatement__Group_2_5_1_1__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1_2(), "rule__InvokeStatement__Group_2_5_1_1_2__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_3(), "rule__InvokeStatement__Group_3__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_3_3(), "rule__InvokeStatement__Group_3_3__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0(), "rule__InvokeStatement__Group_3_3_1_0__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0_1(), "rule__InvokeStatement__Group_3_3_1_0_1__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1(), "rule__InvokeStatement__Group_3_3_1_1__0");
+					put(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1_2(), "rule__InvokeStatement__Group_3_3_1_1_2__0");
+					put(grammarAccess.getAssignmentExpressionAccess().getGroup(), "rule__AssignmentExpression__Group__0");
+					put(grammarAccess.getLeftHandSideExpressionAccess().getGroup(), "rule__LeftHandSideExpression__Group__0");
+					put(grammarAccess.getLeftHandSideExpressionAccess().getGroup_1_1(), "rule__LeftHandSideExpression__Group_1_1__0");
+					put(grammarAccess.getConditionalTestExpressionAccess().getGroup(), "rule__ConditionalTestExpression__Group__0");
+					put(grammarAccess.getConditionalTestExpressionAccess().getGroup_1(), "rule__ConditionalTestExpression__Group_1__0");
+					put(grammarAccess.getLogicalOrExpressionAccess().getGroup(), "rule__LogicalOrExpression__Group__0");
+					put(grammarAccess.getLogicalOrExpressionAccess().getGroup_1(), "rule__LogicalOrExpression__Group_1__0");
+					put(grammarAccess.getLogicalOrExpressionAccess().getGroup_1_3(), "rule__LogicalOrExpression__Group_1_3__0");
+					put(grammarAccess.getLogicalAndExpressionAccess().getGroup(), "rule__LogicalAndExpression__Group__0");
+					put(grammarAccess.getLogicalAndExpressionAccess().getGroup_1(), "rule__LogicalAndExpression__Group_1__0");
+					put(grammarAccess.getLogicalAndExpressionAccess().getGroup_1_3(), "rule__LogicalAndExpression__Group_1_3__0");
+					put(grammarAccess.getBitwiseOrExpressionAccess().getGroup(), "rule__BitwiseOrExpression__Group__0");
+					put(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1(), "rule__BitwiseOrExpression__Group_1__0");
+					put(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1_3(), "rule__BitwiseOrExpression__Group_1_3__0");
+					put(grammarAccess.getBitwiseXorExpressionAccess().getGroup(), "rule__BitwiseXorExpression__Group__0");
+					put(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1(), "rule__BitwiseXorExpression__Group_1__0");
+					put(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1_3(), "rule__BitwiseXorExpression__Group_1_3__0");
+					put(grammarAccess.getBitwiseAndExpressionAccess().getGroup(), "rule__BitwiseAndExpression__Group__0");
+					put(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1(), "rule__BitwiseAndExpression__Group_1__0");
+					put(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1_3(), "rule__BitwiseAndExpression__Group_1_3__0");
+					put(grammarAccess.getEqualityExpressionAccess().getGroup(), "rule__EqualityExpression__Group__0");
+					put(grammarAccess.getEqualityExpressionAccess().getGroup_1(), "rule__EqualityExpression__Group_1__0");
+					put(grammarAccess.getRelationalExpressionAccess().getGroup(), "rule__RelationalExpression__Group__0");
+					put(grammarAccess.getRelationalExpressionAccess().getGroup_1(), "rule__RelationalExpression__Group_1__0");
+					put(grammarAccess.getRelationalExpressionAccess().getGroup_1_3(), "rule__RelationalExpression__Group_1_3__0");
+					put(grammarAccess.getAdditiveExpressionAccess().getGroup(), "rule__AdditiveExpression__Group__0");
+					put(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0(), "rule__AdditiveExpression__Group_1_0__0");
+					put(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0_3(), "rule__AdditiveExpression__Group_1_0_3__0");
+					put(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1(), "rule__AdditiveExpression__Group_1_1__0");
+					put(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1_3(), "rule__AdditiveExpression__Group_1_1_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup(), "rule__MultiplicativeExpression__Group__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0(), "rule__MultiplicativeExpression__Group_1_0__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3(), "rule__MultiplicativeExpression__Group_1_0_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1(), "rule__MultiplicativeExpression__Group_1_1__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3(), "rule__MultiplicativeExpression__Group_1_1_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2(), "rule__MultiplicativeExpression__Group_1_2__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3(), "rule__MultiplicativeExpression__Group_1_2_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3(), "rule__MultiplicativeExpression__Group_1_3__0");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3(), "rule__MultiplicativeExpression__Group_1_3_3__0");
+					put(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getGroup(), "rule__IncrementOrDecrementPostfixExpression__Group__0");
+					put(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getGroup(), "rule__IncrementOrDecrementPrefixExpression__Group__0");
+					put(grammarAccess.getNewfreshExpressionAccess().getGroup_0(), "rule__NewfreshExpression__Group_0__0");
+					put(grammarAccess.getNewfreshExpressionAccess().getGroup_1(), "rule__NewfreshExpression__Group_1__0");
+					put(grammarAccess.getCastExpressionAccess().getGroup(), "rule__CastExpression__Group__0");
+					put(grammarAccess.getArithmeticUnaryExpressionAccess().getGroup(), "rule__ArithmeticUnaryExpression__Group__0");
+					put(grammarAccess.getLogicalUnaryExpressionAccess().getGroup(), "rule__LogicalUnaryExpression__Group__0");
+					put(grammarAccess.getBitwiseUnaryExpressionAccess().getGroup(), "rule__BitwiseUnaryExpression__Group__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup(), "rule__PrimaryExpression__Group__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_1(), "rule__PrimaryExpression__Group_1__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_0(), "rule__PrimaryExpression__Group_1_3_0__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_1(), "rule__PrimaryExpression__Group_1_3_1__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_2(), "rule__PrimaryExpression__Group_2__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_0(), "rule__PrimaryExpression__Group_2_3_0__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_1(), "rule__PrimaryExpression__Group_2_3_1__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4(), "rule__PrimaryExpression__Group_2_4__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_0(), "rule__PrimaryExpression__Group_2_4_3_0__0");
+					put(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_1(), "rule__PrimaryExpression__Group_2_4_3_1__0");
+					put(grammarAccess.getBaseExpressionAccess().getGroup_1(), "rule__BaseExpression__Group_1__0");
+					put(grammarAccess.getInvokeExpressionAccess().getGroup(), "rule__InvokeExpression__Group__0");
+					put(grammarAccess.getInvokeExpressionDeprecatedAccess().getGroup(), "rule__InvokeExpressionDeprecated__Group__0");
+					put(grammarAccess.getInstantiationExpressionAccess().getGroup(), "rule__InstantiationExpression__Group__0");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup(), "rule__DynamicInstanceSpecification__Group__0");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0(), "rule__DynamicInstanceSpecification__Group_3_0__0");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1(), "rule__DynamicInstanceSpecification__Group_3_0_1__0");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1_1(), "rule__DynamicInstanceSpecification__Group_3_0_1_1__0");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1(), "rule__DynamicInstanceSpecification__Group_3_1__0");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1_1(), "rule__DynamicInstanceSpecification__Group_3_1_1__0");
+					put(grammarAccess.getTupleParameterExpressionAccess().getGroup(), "rule__TupleParameterExpression__Group__0");
+					put(grammarAccess.getMixTupleExpressionListAccess().getGroup(), "rule__MixTupleExpressionList__Group__0");
+					put(grammarAccess.getMixTupleExpressionListAccess().getGroup_2(), "rule__MixTupleExpressionList__Group_2__0");
+					put(grammarAccess.getPositionalTupleExpressionListAccess().getGroup(), "rule__PositionalTupleExpressionList__Group__0");
+					put(grammarAccess.getPositionalTupleExpressionListAccess().getGroup_1(), "rule__PositionalTupleExpressionList__Group_1__0");
+					put(grammarAccess.getNamedExpressionAccess().getGroup(), "rule__NamedExpression__Group__0");
+					put(grammarAccess.getLiteralBooleanExpressionAccess().getGroup(), "rule__LiteralBooleanExpression__Group__0");
+					put(grammarAccess.getLiteralIntegerExpressionAccess().getGroup(), "rule__LiteralIntegerExpression__Group__0");
+					put(grammarAccess.getLiteralRationalExpressionAccess().getGroup(), "rule__LiteralRationalExpression__Group__0");
+					put(grammarAccess.getLiteralFloatExpressionAccess().getGroup(), "rule__LiteralFloatExpression__Group__0");
+					put(grammarAccess.getLiteralCharacterExpressionAccess().getGroup(), "rule__LiteralCharacterExpression__Group__0");
+					put(grammarAccess.getLiteralStringExpressionAccess().getGroup(), "rule__LiteralStringExpression__Group__0");
+					put(grammarAccess.getLiteralNullExpressionAccess().getGroup_0(), "rule__LiteralNullExpression__Group_0__0");
+					put(grammarAccess.getLiteralNullExpressionAccess().getGroup_1(), "rule__LiteralNullExpression__Group_1__0");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getGroup(), "rule__LiteralCollectionExpression__Group__0");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_1(), "rule__LiteralCollectionExpression__Group_1__0");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3(), "rule__LiteralCollectionExpression__Group_3__0");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3_1(), "rule__LiteralCollectionExpression__Group_3_1__0");
+					put(grammarAccess.getLiteralReferenceElementAccess().getGroup(), "rule__LiteralReferenceElement__Group__0");
+					put(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_0(), "rule__LiteralReferenceElement__Group_2_0__0");
+					put(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_1(), "rule__LiteralReferenceElement__Group_2_1__0");
+					put(grammarAccess.getLiteralPureReferenceElementAccess().getGroup(), "rule__LiteralPureReferenceElement__Group__0");
+					put(grammarAccess.getLiteralTimeExpressionAccess().getGroup(), "rule__LiteralTimeExpression__Group__0");
+					put(grammarAccess.getLiteralTimeDeltaExpressionAccess().getGroup(), "rule__LiteralTimeDeltaExpression__Group__0");
+					put(grammarAccess.getLiteralThisExpressionAccess().getGroup(), "rule__LiteralThisExpression__Group__0");
+					put(grammarAccess.getLiteralSelfExpressionAccess().getGroup(), "rule__LiteralSelfExpression__Group__0");
+					put(grammarAccess.getLiteralParentExpressionAccess().getGroup(), "rule__LiteralParentExpression__Group__0");
+					put(grammarAccess.getLiteralSuperExpressionAccess().getGroup(), "rule__LiteralSuperExpression__Group__0");
+					put(grammarAccess.getLiteralSystemExpressionAccess().getGroup(), "rule__LiteralSystemExpression__Group__0");
+					put(grammarAccess.getLiteralEnvExpressionAccess().getGroup(), "rule__LiteralEnvExpression__Group__0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getGroup(), "rule__ValueSelectionExpression__Group__0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getGroup_1(), "rule__ValueSelectionExpression__Group_1__0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getGroup_1_3(), "rule__ValueSelectionExpression__Group_1_3__0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getGroup_2(), "rule__ValueSelectionExpression__Group_2__0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_3(), "rule__ValueSelectionExpression__Group_2_3__0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4(), "rule__ValueSelectionExpression__Group_2_4__0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4_3(), "rule__ValueSelectionExpression__Group_2_4_3__0");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup(), "rule__ValuePureNamedMachineExpression__Group__0");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_1(), "rule__ValuePureNamedMachineExpression__Group_1__0");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2(), "rule__ValuePureNamedMachineExpression__Group_2__0");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2_3(), "rule__ValuePureNamedMachineExpression__Group_2_3__0");
+					put(grammarAccess.getXliaAccess().getPrologAssignment_0(), "rule__Xlia__PrologAssignment_0");
+					put(grammarAccess.getXliaAccess().getSystemAssignment_1(), "rule__Xlia__SystemAssignment_1");
+					put(grammarAccess.getXliaPrologObjectAccess().getNameAssignment_0(), "rule__XliaPrologObject__NameAssignment_0");
+					put(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_2(), "rule__XliaPrologObject__ElementsAssignment_2");
+					put(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_4(), "rule__XliaPrologObject__ElementsAssignment_4");
+					put(grammarAccess.getXliaPrologAttributeAccess().getNameAssignment_0(), "rule__XliaPrologAttribute__NameAssignment_0");
+					put(grammarAccess.getXliaPrologAttributeAccess().getValueAssignment_1_1(), "rule__XliaPrologAttribute__ValueAssignment_1_1");
+					put(grammarAccess.getXliaOptionObjectAccess().getNameAssignment_0(), "rule__XliaOptionObject__NameAssignment_0");
+					put(grammarAccess.getXliaOptionObjectAccess().getElementsAssignment_2(), "rule__XliaOptionObject__ElementsAssignment_2");
+					put(grammarAccess.getXliaObjectAccess().getNameAssignment_0(), "rule__XliaObject__NameAssignment_0");
+					put(grammarAccess.getXliaObjectAccess().getElementsAssignment_2(), "rule__XliaObject__ElementsAssignment_2");
+					put(grammarAccess.getXliaAttributeAccess().getNameAssignment_0(), "rule__XliaAttribute__NameAssignment_0");
+					put(grammarAccess.getXliaAttributeAccess().getValueAssignment_2(), "rule__XliaAttribute__ValueAssignment_2");
+					put(grammarAccess.getQualifiedNameAccess().getNameBindingAssignment_1_1(), "rule__QualifiedName__NameBindingAssignment_1_1");
+					put(grammarAccess.getQualifiedNameAccess().getNameBindingAssignment_2_1(), "rule__QualifiedName__NameBindingAssignment_2_1");
+					put(grammarAccess.getPotentiallyAmbiguousQualifiedNameAccess().getNameBindingAssignment_1_1(), "rule__PotentiallyAmbiguousQualifiedName__NameBindingAssignment_1_1");
+					put(grammarAccess.getPotentiallyAmbiguousQualifiedNameAccess().getIsAmbiguousAssignment_2_0(), "rule__PotentiallyAmbiguousQualifiedName__IsAmbiguousAssignment_2_0");
+					put(grammarAccess.getPotentiallyAmbiguousQualifiedNameAccess().getNameBindingAssignment_2_1(), "rule__PotentiallyAmbiguousQualifiedName__NameBindingAssignment_2_1");
+					put(grammarAccess.getPotentiallyAmbiguousQualifiedNameAccess().getNameBindingAssignment_2_2_1(), "rule__PotentiallyAmbiguousQualifiedName__NameBindingAssignment_2_2_1");
+					put(grammarAccess.getColonQualifiedNameAccess().getNameBindingAssignment_1_1(), "rule__ColonQualifiedName__NameBindingAssignment_1_1");
+					put(grammarAccess.getDotQualifiedNameAccess().getNameBindingAssignment_1_1(), "rule__DotQualifiedName__NameBindingAssignment_1_1");
+					put(grammarAccess.getUnqualifiedNameAccess().getNameBindingAssignment(), "rule__UnqualifiedName__NameBindingAssignment");
+					put(grammarAccess.getSystemAccess().getVisibilityAssignment_0_0(), "rule__System__VisibilityAssignment_0_0");
+					put(grammarAccess.getSystemAccess().getTimedAssignment_0_1_0(), "rule__System__TimedAssignment_0_1_0");
+					put(grammarAccess.getSystemAccess().getInput_enabledAssignment_0_1_1(), "rule__System__Input_enabledAssignment_0_1_1");
+					put(grammarAccess.getSystemAccess().getNameAssignment_3(), "rule__System__NameAssignment_3");
+					put(grammarAccess.getSystemAccess().getUnrestrictedNameAssignment_4(), "rule__System__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getSystemAccess().getPortAssignment_6_0(), "rule__System__PortAssignment_6_0");
+					put(grammarAccess.getSystemAccess().getSignalAssignment_6_1(), "rule__System__SignalAssignment_6_1");
+					put(grammarAccess.getSystemAccess().getBufferAssignment_6_2(), "rule__System__BufferAssignment_6_2");
+					put(grammarAccess.getSystemAccess().getChannelAssignment_6_3(), "rule__System__ChannelAssignment_6_3");
+					put(grammarAccess.getSystemAccess().getTypedefAssignment_6_4(), "rule__System__TypedefAssignment_6_4");
+					put(grammarAccess.getSystemAccess().getPropertyAssignment_6_5(), "rule__System__PropertyAssignment_6_5");
+					put(grammarAccess.getSystemAccess().getPortAssignment_7_0_1_0(), "rule__System__PortAssignment_7_0_1_0");
+					put(grammarAccess.getSystemAccess().getSignalAssignment_7_0_1_1(), "rule__System__SignalAssignment_7_0_1_1");
+					put(grammarAccess.getSystemAccess().getBufferAssignment_7_0_1_2(), "rule__System__BufferAssignment_7_0_1_2");
+					put(grammarAccess.getSystemAccess().getChannelAssignment_7_0_1_3(), "rule__System__ChannelAssignment_7_0_1_3");
+					put(grammarAccess.getSystemAccess().getTypedefAssignment_7_0_1_4(), "rule__System__TypedefAssignment_7_0_1_4");
+					put(grammarAccess.getSystemAccess().getPropertyAssignment_7_0_1_5(), "rule__System__PropertyAssignment_7_0_1_5");
+					put(grammarAccess.getSystemAccess().getPortAssignment_7_1_1_0(), "rule__System__PortAssignment_7_1_1_0");
+					put(grammarAccess.getSystemAccess().getSignalAssignment_7_1_1_1(), "rule__System__SignalAssignment_7_1_1_1");
+					put(grammarAccess.getSystemAccess().getBufferAssignment_7_1_1_2(), "rule__System__BufferAssignment_7_1_1_2");
+					put(grammarAccess.getSystemAccess().getChannelAssignment_7_1_1_3(), "rule__System__ChannelAssignment_7_1_1_3");
+					put(grammarAccess.getSystemAccess().getTypedefAssignment_7_1_1_4(), "rule__System__TypedefAssignment_7_1_1_4");
+					put(grammarAccess.getSystemAccess().getPropertyAssignment_7_1_1_5(), "rule__System__PropertyAssignment_7_1_1_5");
+					put(grammarAccess.getSystemAccess().getPortAssignment_7_2_1_0(), "rule__System__PortAssignment_7_2_1_0");
+					put(grammarAccess.getSystemAccess().getSignalAssignment_7_2_1_1(), "rule__System__SignalAssignment_7_2_1_1");
+					put(grammarAccess.getSystemAccess().getBufferAssignment_7_2_1_2(), "rule__System__BufferAssignment_7_2_1_2");
+					put(grammarAccess.getSystemAccess().getChannelAssignment_7_2_1_3(), "rule__System__ChannelAssignment_7_2_1_3");
+					put(grammarAccess.getSystemAccess().getTypedefAssignment_7_2_1_4(), "rule__System__TypedefAssignment_7_2_1_4");
+					put(grammarAccess.getSystemAccess().getPropertyAssignment_7_2_1_5(), "rule__System__PropertyAssignment_7_2_1_5");
+					put(grammarAccess.getSystemAccess().getPortAssignment_7_3_1_0(), "rule__System__PortAssignment_7_3_1_0");
+					put(grammarAccess.getSystemAccess().getSignalAssignment_7_3_1_1(), "rule__System__SignalAssignment_7_3_1_1");
+					put(grammarAccess.getSystemAccess().getBufferAssignment_7_3_1_2(), "rule__System__BufferAssignment_7_3_1_2");
+					put(grammarAccess.getSystemAccess().getChannelAssignment_7_3_1_3(), "rule__System__ChannelAssignment_7_3_1_3");
+					put(grammarAccess.getSystemAccess().getTypedefAssignment_7_3_1_4(), "rule__System__TypedefAssignment_7_3_1_4");
+					put(grammarAccess.getSystemAccess().getPropertyAssignment_7_3_1_5(), "rule__System__PropertyAssignment_7_3_1_5");
+					put(grammarAccess.getSystemAccess().getRoutineAssignment_8_0_0_1(), "rule__System__RoutineAssignment_8_0_0_1");
+					put(grammarAccess.getSystemAccess().getProcedureAssignment_8_0_1_1(), "rule__System__ProcedureAssignment_8_0_1_1");
+					put(grammarAccess.getSystemAccess().getRoutineAssignment_8_1_0(), "rule__System__RoutineAssignment_8_1_0");
+					put(grammarAccess.getSystemAccess().getProcedureAssignment_8_1_1(), "rule__System__ProcedureAssignment_8_1_1");
+					put(grammarAccess.getSystemAccess().getMachineAssignment_9_0_1_0(), "rule__System__MachineAssignment_9_0_1_0");
+					put(grammarAccess.getSystemAccess().getInstanceAssignment_9_0_1_1(), "rule__System__InstanceAssignment_9_0_1_1");
+					put(grammarAccess.getSystemAccess().getMachineAssignment_9_1_1(), "rule__System__MachineAssignment_9_1_1");
+					put(grammarAccess.getSystemAccess().getMachineAssignment_9_2_1(), "rule__System__MachineAssignment_9_2_1");
+					put(grammarAccess.getSystemAccess().getInstanceAssignment_9_3_1(), "rule__System__InstanceAssignment_9_3_1");
+					put(grammarAccess.getSystemAccess().getBehaviorAssignment_10_0_1(), "rule__System__BehaviorAssignment_10_0_1");
+					put(grammarAccess.getSystemAccess().getBehaviorAssignment_10_1_1(), "rule__System__BehaviorAssignment_10_1_1");
+					put(grammarAccess.getSystemAccess().getMainAssignment_11(), "rule__System__MainAssignment_11");
+					put(grammarAccess.getInstanceMachineAccess().getModelAssignment_4(), "rule__InstanceMachine__ModelAssignment_4");
+					put(grammarAccess.getInstanceMachineAccess().getNameAssignment_6(), "rule__InstanceMachine__NameAssignment_6");
+					put(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameAssignment_7(), "rule__InstanceMachine__UnrestrictedNameAssignment_7");
+					put(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_0(), "rule__InstanceMachine__SlotAssignment_8_0_0_1_0");
+					put(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_1_1(), "rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1");
+					put(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_1_1_0(), "rule__InstanceMachine__SlotAssignment_8_1_1_0");
+					put(grammarAccess.getSlotParameterAccess().getXliaPropertyAssignment_0(), "rule__SlotParameter__XliaPropertyAssignment_0");
+					put(grammarAccess.getSlotParameterAccess().getValueAssignment_2(), "rule__SlotParameter__ValueAssignment_2");
+					put(grammarAccess.getSlotPropertyAccess().getXliaPropertyAssignment_0(), "rule__SlotProperty__XliaPropertyAssignment_0");
+					put(grammarAccess.getSlotPropertyAccess().getValueAssignment_2(), "rule__SlotProperty__ValueAssignment_2");
+					put(grammarAccess.getMachineBlockAccess().getVisibilityAssignment_0_0(), "rule__MachineBlock__VisibilityAssignment_0_0");
+					put(grammarAccess.getMachineBlockAccess().getTimedAssignment_0_1_0(), "rule__MachineBlock__TimedAssignment_0_1_0");
+					put(grammarAccess.getMachineBlockAccess().getInput_enabledAssignment_0_1_1(), "rule__MachineBlock__Input_enabledAssignment_0_1_1");
+					put(grammarAccess.getMachineBlockAccess().getDesignAssignment_0_2(), "rule__MachineBlock__DesignAssignment_0_2");
+					put(grammarAccess.getMachineBlockAccess().getNameAssignment_3(), "rule__MachineBlock__NameAssignment_3");
+					put(grammarAccess.getMachineBlockAccess().getUnrestrictedNameAssignment_4(), "rule__MachineBlock__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getMachineBlockAccess().getPortAssignment_6_0(), "rule__MachineBlock__PortAssignment_6_0");
+					put(grammarAccess.getMachineBlockAccess().getSignalAssignment_6_1(), "rule__MachineBlock__SignalAssignment_6_1");
+					put(grammarAccess.getMachineBlockAccess().getBufferAssignment_6_2(), "rule__MachineBlock__BufferAssignment_6_2");
+					put(grammarAccess.getMachineBlockAccess().getChannelAssignment_6_3(), "rule__MachineBlock__ChannelAssignment_6_3");
+					put(grammarAccess.getMachineBlockAccess().getTypedefAssignment_6_4(), "rule__MachineBlock__TypedefAssignment_6_4");
+					put(grammarAccess.getMachineBlockAccess().getPropertyAssignment_6_5(), "rule__MachineBlock__PropertyAssignment_6_5");
+					put(grammarAccess.getMachineBlockAccess().getPortAssignment_7_0_1_0(), "rule__MachineBlock__PortAssignment_7_0_1_0");
+					put(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_0_1_1(), "rule__MachineBlock__SignalAssignment_7_0_1_1");
+					put(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_0_1_2(), "rule__MachineBlock__BufferAssignment_7_0_1_2");
+					put(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_0_1_3(), "rule__MachineBlock__ChannelAssignment_7_0_1_3");
+					put(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_0_1_4(), "rule__MachineBlock__TypedefAssignment_7_0_1_4");
+					put(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_0_1_5(), "rule__MachineBlock__PropertyAssignment_7_0_1_5");
+					put(grammarAccess.getMachineBlockAccess().getPortAssignment_7_1_1_0(), "rule__MachineBlock__PortAssignment_7_1_1_0");
+					put(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_1_1_1(), "rule__MachineBlock__SignalAssignment_7_1_1_1");
+					put(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_1_1_2(), "rule__MachineBlock__BufferAssignment_7_1_1_2");
+					put(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_1_1_3(), "rule__MachineBlock__ChannelAssignment_7_1_1_3");
+					put(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_1_1_4(), "rule__MachineBlock__TypedefAssignment_7_1_1_4");
+					put(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_1_1_5(), "rule__MachineBlock__PropertyAssignment_7_1_1_5");
+					put(grammarAccess.getMachineBlockAccess().getPortAssignment_7_2_1_0(), "rule__MachineBlock__PortAssignment_7_2_1_0");
+					put(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_2_1_1(), "rule__MachineBlock__SignalAssignment_7_2_1_1");
+					put(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_2_1_2(), "rule__MachineBlock__BufferAssignment_7_2_1_2");
+					put(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_2_1_3(), "rule__MachineBlock__ChannelAssignment_7_2_1_3");
+					put(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_2_1_4(), "rule__MachineBlock__TypedefAssignment_7_2_1_4");
+					put(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_2_1_5(), "rule__MachineBlock__PropertyAssignment_7_2_1_5");
+					put(grammarAccess.getMachineBlockAccess().getPortAssignment_7_3_1_0(), "rule__MachineBlock__PortAssignment_7_3_1_0");
+					put(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_3_1_1(), "rule__MachineBlock__SignalAssignment_7_3_1_1");
+					put(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_3_1_2(), "rule__MachineBlock__BufferAssignment_7_3_1_2");
+					put(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_3_1_3(), "rule__MachineBlock__ChannelAssignment_7_3_1_3");
+					put(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_3_1_4(), "rule__MachineBlock__TypedefAssignment_7_3_1_4");
+					put(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_3_1_5(), "rule__MachineBlock__PropertyAssignment_7_3_1_5");
+					put(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_0_0_1(), "rule__MachineBlock__RoutineAssignment_8_0_0_1");
+					put(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_0_1_1(), "rule__MachineBlock__ProcedureAssignment_8_0_1_1");
+					put(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_1_0(), "rule__MachineBlock__RoutineAssignment_8_1_0");
+					put(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_1_1(), "rule__MachineBlock__ProcedureAssignment_8_1_1");
+					put(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_0_1_0(), "rule__MachineBlock__MachineAssignment_9_0_1_0");
+					put(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_0_1_1(), "rule__MachineBlock__InstanceAssignment_9_0_1_1");
+					put(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_1_1(), "rule__MachineBlock__MachineAssignment_9_1_1");
+					put(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_2_1(), "rule__MachineBlock__MachineAssignment_9_2_1");
+					put(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_3_1(), "rule__MachineBlock__InstanceAssignment_9_3_1");
+					put(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_0_1(), "rule__MachineBlock__BehaviorAssignment_10_0_1");
+					put(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_1_1(), "rule__MachineBlock__BehaviorAssignment_10_1_1");
+					put(grammarAccess.getMachineBlockAccess().getMainAssignment_11(), "rule__MachineBlock__MainAssignment_11");
+					put(grammarAccess.getProcedureAccess().getVisibilityAssignment_0(), "rule__Procedure__VisibilityAssignment_0");
+					put(grammarAccess.getProcedureAccess().getNameAssignment_3(), "rule__Procedure__NameAssignment_3");
+					put(grammarAccess.getProcedureAccess().getUnrestrictedNameAssignment_4(), "rule__Procedure__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_0(), "rule__Procedure__ParameterAssignment_5_0_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_1_1(), "rule__Procedure__ParameterAssignment_5_0_1_1_1");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_0(), "rule__Procedure__ParameterAssignment_5_1_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_1(), "rule__Procedure__ParameterAssignment_5_1_1_1_1");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_2_1(), "rule__Procedure__ParameterAssignment_5_1_1_1_2_1");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_0(), "rule__Procedure__ParameterAssignment_7_0_1_0_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_1_1(), "rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_0(), "rule__Procedure__ParameterAssignment_7_0_1_1_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_1_1(), "rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_0(), "rule__Procedure__ParameterAssignment_7_0_1_2_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_1_1(), "rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_0(), "rule__Procedure__ParameterAssignment_7_0_1_3_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_1_1(), "rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1");
+					put(grammarAccess.getProcedureAccess().getPortAssignment_7_1_0(), "rule__Procedure__PortAssignment_7_1_0");
+					put(grammarAccess.getProcedureAccess().getSignalAssignment_7_1_1(), "rule__Procedure__SignalAssignment_7_1_1");
+					put(grammarAccess.getProcedureAccess().getBufferAssignment_7_1_2(), "rule__Procedure__BufferAssignment_7_1_2");
+					put(grammarAccess.getProcedureAccess().getChannelAssignment_7_1_3(), "rule__Procedure__ChannelAssignment_7_1_3");
+					put(grammarAccess.getProcedureAccess().getTypedefAssignment_7_1_4(), "rule__Procedure__TypedefAssignment_7_1_4");
+					put(grammarAccess.getProcedureAccess().getPropertyAssignment_7_1_5(), "rule__Procedure__PropertyAssignment_7_1_5");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_0(), "rule__Procedure__ParameterAssignment_8_0_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_1_1(), "rule__Procedure__ParameterAssignment_8_0_1_1_1");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_0(), "rule__Procedure__ParameterAssignment_8_1_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_1_1(), "rule__Procedure__ParameterAssignment_8_1_1_1_1");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_0(), "rule__Procedure__ParameterAssignment_8_2_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_1_1(), "rule__Procedure__ParameterAssignment_8_2_1_1_1");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_0(), "rule__Procedure__ParameterAssignment_8_3_1_0");
+					put(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_1_1(), "rule__Procedure__ParameterAssignment_8_3_1_1_1");
+					put(grammarAccess.getProcedureAccess().getPortAssignment_9_0_1_0(), "rule__Procedure__PortAssignment_9_0_1_0");
+					put(grammarAccess.getProcedureAccess().getSignalAssignment_9_0_1_1(), "rule__Procedure__SignalAssignment_9_0_1_1");
+					put(grammarAccess.getProcedureAccess().getBufferAssignment_9_0_1_2(), "rule__Procedure__BufferAssignment_9_0_1_2");
+					put(grammarAccess.getProcedureAccess().getChannelAssignment_9_0_1_3(), "rule__Procedure__ChannelAssignment_9_0_1_3");
+					put(grammarAccess.getProcedureAccess().getTypedefAssignment_9_0_1_4(), "rule__Procedure__TypedefAssignment_9_0_1_4");
+					put(grammarAccess.getProcedureAccess().getPropertyAssignment_9_0_1_5(), "rule__Procedure__PropertyAssignment_9_0_1_5");
+					put(grammarAccess.getProcedureAccess().getPortAssignment_9_1_1_0(), "rule__Procedure__PortAssignment_9_1_1_0");
+					put(grammarAccess.getProcedureAccess().getSignalAssignment_9_1_1_1(), "rule__Procedure__SignalAssignment_9_1_1_1");
+					put(grammarAccess.getProcedureAccess().getBufferAssignment_9_1_1_2(), "rule__Procedure__BufferAssignment_9_1_1_2");
+					put(grammarAccess.getProcedureAccess().getChannelAssignment_9_1_1_3(), "rule__Procedure__ChannelAssignment_9_1_1_3");
+					put(grammarAccess.getProcedureAccess().getTypedefAssignment_9_1_1_4(), "rule__Procedure__TypedefAssignment_9_1_1_4");
+					put(grammarAccess.getProcedureAccess().getPropertyAssignment_9_1_1_5(), "rule__Procedure__PropertyAssignment_9_1_1_5");
+					put(grammarAccess.getProcedureAccess().getPortAssignment_9_2_1_0(), "rule__Procedure__PortAssignment_9_2_1_0");
+					put(grammarAccess.getProcedureAccess().getSignalAssignment_9_2_1_1(), "rule__Procedure__SignalAssignment_9_2_1_1");
+					put(grammarAccess.getProcedureAccess().getBufferAssignment_9_2_1_2(), "rule__Procedure__BufferAssignment_9_2_1_2");
+					put(grammarAccess.getProcedureAccess().getChannelAssignment_9_2_1_3(), "rule__Procedure__ChannelAssignment_9_2_1_3");
+					put(grammarAccess.getProcedureAccess().getTypedefAssignment_9_2_1_4(), "rule__Procedure__TypedefAssignment_9_2_1_4");
+					put(grammarAccess.getProcedureAccess().getPropertyAssignment_9_2_1_5(), "rule__Procedure__PropertyAssignment_9_2_1_5");
+					put(grammarAccess.getProcedureAccess().getPortAssignment_9_3_1_0(), "rule__Procedure__PortAssignment_9_3_1_0");
+					put(grammarAccess.getProcedureAccess().getSignalAssignment_9_3_1_1(), "rule__Procedure__SignalAssignment_9_3_1_1");
+					put(grammarAccess.getProcedureAccess().getBufferAssignment_9_3_1_2(), "rule__Procedure__BufferAssignment_9_3_1_2");
+					put(grammarAccess.getProcedureAccess().getChannelAssignment_9_3_1_3(), "rule__Procedure__ChannelAssignment_9_3_1_3");
+					put(grammarAccess.getProcedureAccess().getTypedefAssignment_9_3_1_4(), "rule__Procedure__TypedefAssignment_9_3_1_4");
+					put(grammarAccess.getProcedureAccess().getPropertyAssignment_9_3_1_5(), "rule__Procedure__PropertyAssignment_9_3_1_5");
+					put(grammarAccess.getProcedureAccess().getRoutineAssignment_10_0_0_1(), "rule__Procedure__RoutineAssignment_10_0_0_1");
+					put(grammarAccess.getProcedureAccess().getProcedureAssignment_10_0_1_1(), "rule__Procedure__ProcedureAssignment_10_0_1_1");
+					put(grammarAccess.getProcedureAccess().getRoutineAssignment_10_1_0(), "rule__Procedure__RoutineAssignment_10_1_0");
+					put(grammarAccess.getProcedureAccess().getProcedureAssignment_10_1_1(), "rule__Procedure__ProcedureAssignment_10_1_1");
+					put(grammarAccess.getProcedureAccess().getRegionAssignment_11_0(), "rule__Procedure__RegionAssignment_11_0");
+					put(grammarAccess.getProcedureAccess().getRegionAssignment_11_1(), "rule__Procedure__RegionAssignment_11_1");
+					put(grammarAccess.getProcedureAccess().getExecutionAssignment_12(), "rule__Procedure__ExecutionAssignment_12");
+					put(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineAssignment_2_0_1(), "rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1");
+					put(grammarAccess.getProcedureExecutionAccess().getRunRoutineAssignment_2_1_1(), "rule__ProcedureExecution__RunRoutineAssignment_2_1_1");
+					put(grammarAccess.getMoeBehaviorAccess().getPortAssignment_1_1_0(), "rule__MoeBehavior__PortAssignment_1_1_0");
+					put(grammarAccess.getMoeBehaviorAccess().getSignalAssignment_1_1_1(), "rule__MoeBehavior__SignalAssignment_1_1_1");
+					put(grammarAccess.getMoeBehaviorAccess().getBufferAssignment_1_1_2(), "rule__MoeBehavior__BufferAssignment_1_1_2");
+					put(grammarAccess.getMoeBehaviorAccess().getChannelAssignment_1_1_3(), "rule__MoeBehavior__ChannelAssignment_1_1_3");
+					put(grammarAccess.getMoeBehaviorAccess().getTypedefAssignment_1_1_4(), "rule__MoeBehavior__TypedefAssignment_1_1_4");
+					put(grammarAccess.getMoeBehaviorAccess().getPropertyAssignment_1_1_5(), "rule__MoeBehavior__PropertyAssignment_1_1_5");
+					put(grammarAccess.getMoeBehaviorAccess().getExecutionAssignment_2_0(), "rule__MoeBehavior__ExecutionAssignment_2_0");
+					put(grammarAccess.getMoeBehaviorAccess().getInteractionAssignment_2_1(), "rule__MoeBehavior__InteractionAssignment_2_1");
+					put(grammarAccess.getStatemachineAccess().getVisibilityAssignment_1_0(), "rule__Statemachine__VisibilityAssignment_1_0");
+					put(grammarAccess.getStatemachineAccess().getTimedAssignment_1_1_0(), "rule__Statemachine__TimedAssignment_1_1_0");
+					put(grammarAccess.getStatemachineAccess().getInput_enabledAssignment_1_1_1(), "rule__Statemachine__Input_enabledAssignment_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getDesignAssignment_1_2(), "rule__Statemachine__DesignAssignment_1_2");
+					put(grammarAccess.getStatemachineAccess().getNameAssignment_4(), "rule__Statemachine__NameAssignment_4");
+					put(grammarAccess.getStatemachineAccess().getUnrestrictedNameAssignment_5(), "rule__Statemachine__UnrestrictedNameAssignment_5");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_0(), "rule__Statemachine__ParameterAssignment_7_0_1_0_1_0");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_1_1(), "rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_0(), "rule__Statemachine__ParameterAssignment_7_0_1_1_1_0");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_1_1(), "rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_0(), "rule__Statemachine__ParameterAssignment_7_0_1_2_1_0");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_1_1(), "rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_0(), "rule__Statemachine__ParameterAssignment_7_0_1_3_1_0");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_1_1(), "rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getPortAssignment_7_1_0(), "rule__Statemachine__PortAssignment_7_1_0");
+					put(grammarAccess.getStatemachineAccess().getSignalAssignment_7_1_1(), "rule__Statemachine__SignalAssignment_7_1_1");
+					put(grammarAccess.getStatemachineAccess().getBufferAssignment_7_1_2(), "rule__Statemachine__BufferAssignment_7_1_2");
+					put(grammarAccess.getStatemachineAccess().getChannelAssignment_7_1_3(), "rule__Statemachine__ChannelAssignment_7_1_3");
+					put(grammarAccess.getStatemachineAccess().getTypedefAssignment_7_1_4(), "rule__Statemachine__TypedefAssignment_7_1_4");
+					put(grammarAccess.getStatemachineAccess().getPropertyAssignment_7_1_5(), "rule__Statemachine__PropertyAssignment_7_1_5");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_0(), "rule__Statemachine__ParameterAssignment_8_0_1_0");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_1_1(), "rule__Statemachine__ParameterAssignment_8_0_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_0(), "rule__Statemachine__ParameterAssignment_8_1_1_0");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_1_1(), "rule__Statemachine__ParameterAssignment_8_1_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_0(), "rule__Statemachine__ParameterAssignment_8_2_1_0");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_1_1(), "rule__Statemachine__ParameterAssignment_8_2_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_0(), "rule__Statemachine__ParameterAssignment_8_3_1_0");
+					put(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_1_1(), "rule__Statemachine__ParameterAssignment_8_3_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getPortAssignment_9_0_1_0(), "rule__Statemachine__PortAssignment_9_0_1_0");
+					put(grammarAccess.getStatemachineAccess().getSignalAssignment_9_0_1_1(), "rule__Statemachine__SignalAssignment_9_0_1_1");
+					put(grammarAccess.getStatemachineAccess().getBufferAssignment_9_0_1_2(), "rule__Statemachine__BufferAssignment_9_0_1_2");
+					put(grammarAccess.getStatemachineAccess().getChannelAssignment_9_0_1_3(), "rule__Statemachine__ChannelAssignment_9_0_1_3");
+					put(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_0_1_4(), "rule__Statemachine__TypedefAssignment_9_0_1_4");
+					put(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_0_1_5(), "rule__Statemachine__PropertyAssignment_9_0_1_5");
+					put(grammarAccess.getStatemachineAccess().getPortAssignment_9_1_1_0(), "rule__Statemachine__PortAssignment_9_1_1_0");
+					put(grammarAccess.getStatemachineAccess().getSignalAssignment_9_1_1_1(), "rule__Statemachine__SignalAssignment_9_1_1_1");
+					put(grammarAccess.getStatemachineAccess().getBufferAssignment_9_1_1_2(), "rule__Statemachine__BufferAssignment_9_1_1_2");
+					put(grammarAccess.getStatemachineAccess().getChannelAssignment_9_1_1_3(), "rule__Statemachine__ChannelAssignment_9_1_1_3");
+					put(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_1_1_4(), "rule__Statemachine__TypedefAssignment_9_1_1_4");
+					put(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_1_1_5(), "rule__Statemachine__PropertyAssignment_9_1_1_5");
+					put(grammarAccess.getStatemachineAccess().getPortAssignment_9_2_1_0(), "rule__Statemachine__PortAssignment_9_2_1_0");
+					put(grammarAccess.getStatemachineAccess().getSignalAssignment_9_2_1_1(), "rule__Statemachine__SignalAssignment_9_2_1_1");
+					put(grammarAccess.getStatemachineAccess().getBufferAssignment_9_2_1_2(), "rule__Statemachine__BufferAssignment_9_2_1_2");
+					put(grammarAccess.getStatemachineAccess().getChannelAssignment_9_2_1_3(), "rule__Statemachine__ChannelAssignment_9_2_1_3");
+					put(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_2_1_4(), "rule__Statemachine__TypedefAssignment_9_2_1_4");
+					put(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_2_1_5(), "rule__Statemachine__PropertyAssignment_9_2_1_5");
+					put(grammarAccess.getStatemachineAccess().getPortAssignment_9_3_1_0(), "rule__Statemachine__PortAssignment_9_3_1_0");
+					put(grammarAccess.getStatemachineAccess().getSignalAssignment_9_3_1_1(), "rule__Statemachine__SignalAssignment_9_3_1_1");
+					put(grammarAccess.getStatemachineAccess().getBufferAssignment_9_3_1_2(), "rule__Statemachine__BufferAssignment_9_3_1_2");
+					put(grammarAccess.getStatemachineAccess().getChannelAssignment_9_3_1_3(), "rule__Statemachine__ChannelAssignment_9_3_1_3");
+					put(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_3_1_4(), "rule__Statemachine__TypedefAssignment_9_3_1_4");
+					put(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_3_1_5(), "rule__Statemachine__PropertyAssignment_9_3_1_5");
+					put(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_0_0_1(), "rule__Statemachine__RoutineAssignment_10_0_0_1");
+					put(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_0_1_1(), "rule__Statemachine__ProcedureAssignment_10_0_1_1");
+					put(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_1_0(), "rule__Statemachine__RoutineAssignment_10_1_0");
+					put(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_1_1(), "rule__Statemachine__ProcedureAssignment_10_1_1");
+					put(grammarAccess.getStatemachineAccess().getRegionAssignment_11_0(), "rule__Statemachine__RegionAssignment_11_0");
+					put(grammarAccess.getStatemachineAccess().getRegionAssignment_11_1(), "rule__Statemachine__RegionAssignment_11_1");
+					put(grammarAccess.getStatemachineAccess().getExecutionAssignment_12_0(), "rule__Statemachine__ExecutionAssignment_12_0");
+					put(grammarAccess.getStatemachineAccess().getInteractionAssignment_12_1(), "rule__Statemachine__InteractionAssignment_12_1");
+					put(grammarAccess.getStatemachineRegionAccess().getNameAssignment_1_1_1(), "rule__StatemachineRegion__NameAssignment_1_1_1");
+					put(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameAssignment_1_1_2(), "rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2");
+					put(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_0(), "rule__StatemachineRegion__VertexAssignment_2_0");
+					put(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_1(), "rule__StatemachineRegion__VertexAssignment_2_1");
+					put(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_0(), "rule__StatemachineRegionLite__VertexAssignment_0");
+					put(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_1(), "rule__StatemachineRegionLite__VertexAssignment_1");
+					put(grammarAccess.getCompositeStateAccess().getCompositeAssignment_1(), "rule__CompositeState__CompositeAssignment_1");
+					put(grammarAccess.getCompositeStateAccess().getOrthogonalAssignment_4_1(), "rule__CompositeState__OrthogonalAssignment_4_1");
+					put(grammarAccess.getCompositeStateAccess().getNameAssignment_6(), "rule__CompositeState__NameAssignment_6");
+					put(grammarAccess.getCompositeStateAccess().getUnrestrictedNameAssignment_7(), "rule__CompositeState__UnrestrictedNameAssignment_7");
+					put(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_0_0(), "rule__CompositeState__RegionAssignment_8_0_1_0_0");
+					put(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_0_1_1(), "rule__CompositeState__MoeAssignment_8_0_1_0_1_1");
+					put(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_0_2_1(), "rule__CompositeState__TransitionAssignment_8_0_1_0_2_1");
+					put(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_1_0(), "rule__CompositeState__RegionAssignment_8_0_1_1_0");
+					put(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_1_1_0(), "rule__CompositeState__TransitionAssignment_8_0_1_1_1_0");
+					put(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_1_1_1(), "rule__CompositeState__MoeAssignment_8_0_1_1_1_1");
+					put(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAssignment_1(), "rule__MoeCompositeStateRoutines__NameAssignment_1");
+					put(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockAssignment_2(), "rule__MoeCompositeStateRoutines__BodyBlockAssignment_2");
+					put(grammarAccess.getSimpleStateAccess().getSimpleAssignment_1(), "rule__SimpleState__SimpleAssignment_1");
+					put(grammarAccess.getSimpleStateAccess().getNameAssignment_3(), "rule__SimpleState__NameAssignment_3");
+					put(grammarAccess.getSimpleStateAccess().getUnrestrictedNameAssignment_4(), "rule__SimpleState__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getSimpleStateAccess().getTransitionAssignment_5_0_1_0(), "rule__SimpleState__TransitionAssignment_5_0_1_0");
+					put(grammarAccess.getSimpleStateAccess().getMoeAssignment_5_0_1_1(), "rule__SimpleState__MoeAssignment_5_0_1_1");
+					put(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAssignment_1(), "rule__MoeSimpleStateRoutines__NameAssignment_1");
+					put(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockAssignment_2(), "rule__MoeSimpleStateRoutines__BodyBlockAssignment_2");
+					put(grammarAccess.getStartStateAccess().getSimpleAssignment_1_0_0(), "rule__StartState__SimpleAssignment_1_0_0");
+					put(grammarAccess.getStartStateAccess().getNameAssignment_1_0_5(), "rule__StartState__NameAssignment_1_0_5");
+					put(grammarAccess.getStartStateAccess().getSimpleAssignment_1_1(), "rule__StartState__SimpleAssignment_1_1");
+					put(grammarAccess.getStartStateAccess().getUnrestrictedNameAssignment_2(), "rule__StartState__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getStartStateAccess().getTransitionAssignment_3_0_1_0(), "rule__StartState__TransitionAssignment_3_0_1_0");
+					put(grammarAccess.getStartStateAccess().getMoeAssignment_3_0_1_1(), "rule__StartState__MoeAssignment_3_0_1_1");
+					put(grammarAccess.getMoeStartStateRoutinesAccess().getNameAssignment_1(), "rule__MoeStartStateRoutines__NameAssignment_1");
+					put(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockAssignment_2(), "rule__MoeStartStateRoutines__BodyBlockAssignment_2");
+					put(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_0_0(), "rule__FinalState__SimpleAssignment_1_0_0");
+					put(grammarAccess.getFinalStateAccess().getNameAssignment_1_0_5(), "rule__FinalState__NameAssignment_1_0_5");
+					put(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_1(), "rule__FinalState__SimpleAssignment_1_1");
+					put(grammarAccess.getFinalStateAccess().getUnrestrictedNameAssignment_2(), "rule__FinalState__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getFinalStateAccess().getMoeAssignment_3_0_1(), "rule__FinalState__MoeAssignment_3_0_1");
+					put(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAssignment_1(), "rule__MoeFinalStateRoutines__NameAssignment_1");
+					put(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockAssignment_2(), "rule__MoeFinalStateRoutines__BodyBlockAssignment_2");
+					put(grammarAccess.getOtherPseudostateAccess().getKindAssignment_4(), "rule__OtherPseudostate__KindAssignment_4");
+					put(grammarAccess.getOtherPseudostateAccess().getNameAssignment_6(), "rule__OtherPseudostate__NameAssignment_6");
+					put(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameAssignment_7(), "rule__OtherPseudostate__UnrestrictedNameAssignment_7");
+					put(grammarAccess.getOtherPseudostateAccess().getTransitionAssignment_8_0_1(), "rule__OtherPseudostate__TransitionAssignment_8_0_1");
+					put(grammarAccess.getPseudostateInitialAccess().getKindAssignment_1_0_3(), "rule__PseudostateInitial__KindAssignment_1_0_3");
+					put(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_0_5(), "rule__PseudostateInitial__NameAssignment_1_0_5");
+					put(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_1(), "rule__PseudostateInitial__NameAssignment_1_1");
+					put(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameAssignment_2(), "rule__PseudostateInitial__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getPseudostateInitialAccess().getTransitionAssignment_3_0_1(), "rule__PseudostateInitial__TransitionAssignment_3_0_1");
+					put(grammarAccess.getEndingPseudostateAccess().getKindAssignment_4(), "rule__EndingPseudostate__KindAssignment_4");
+					put(grammarAccess.getEndingPseudostateAccess().getNameAssignment_6(), "rule__EndingPseudostate__NameAssignment_6");
+					put(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameAssignment_7(), "rule__EndingPseudostate__UnrestrictedNameAssignment_7");
+					put(grammarAccess.getEndingPseudostateAccess().getMoeAssignment_8_0_1(), "rule__EndingPseudostate__MoeAssignment_8_0_1");
+					put(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_2(), "rule__ModelOfExecution__RoutineAssignment_2");
+					put(grammarAccess.getModelOfExecutionAccess().getInitRoutineAssignment_3_0_1(), "rule__ModelOfExecution__InitRoutineAssignment_3_0_1");
+					put(grammarAccess.getModelOfExecutionAccess().getFinalRoutineAssignment_3_1_1(), "rule__ModelOfExecution__FinalRoutineAssignment_3_1_1");
+					put(grammarAccess.getModelOfExecutionAccess().getEnableRoutineAssignment_3_2_1(), "rule__ModelOfExecution__EnableRoutineAssignment_3_2_1");
+					put(grammarAccess.getModelOfExecutionAccess().getDisableRoutineAssignment_3_3_1(), "rule__ModelOfExecution__DisableRoutineAssignment_3_3_1");
+					put(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineAssignment_3_4_1(), "rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1");
+					put(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineAssignment_3_5_1(), "rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1");
+					put(grammarAccess.getModelOfExecutionAccess().getIrunRoutineAssignment_3_6_1(), "rule__ModelOfExecution__IrunRoutineAssignment_3_6_1");
+					put(grammarAccess.getModelOfExecutionAccess().getRunRoutineAssignment_3_7_1(), "rule__ModelOfExecution__RunRoutineAssignment_3_7_1");
+					put(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_4(), "rule__ModelOfExecution__RoutineAssignment_4");
+					put(grammarAccess.getMoeRoutineAccess().getDomainAssignment_1_1(), "rule__MoeRoutine__DomainAssignment_1_1");
+					put(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_0_1(), "rule__MoeRoutine__CodomainAssignment_2_1_0_1");
+					put(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_1(), "rule__MoeRoutine__CodomainAssignment_2_1_1");
+					put(grammarAccess.getMoeRoutineAccess().getBodyBlockAssignment_3(), "rule__MoeRoutine__BodyBlockAssignment_3");
+					put(grammarAccess.getRoutineAccess().getVisibilityAssignment_0(), "rule__Routine__VisibilityAssignment_0");
+					put(grammarAccess.getRoutineAccess().getNameAssignment_3(), "rule__Routine__NameAssignment_3");
+					put(grammarAccess.getRoutineAccess().getUnrestrictedNameAssignment_4(), "rule__Routine__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getRoutineAccess().getDomainAssignment_5_1(), "rule__Routine__DomainAssignment_5_1");
+					put(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_0_1(), "rule__Routine__CodomainAssignment_6_1_0_1");
+					put(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_1(), "rule__Routine__CodomainAssignment_6_1_1");
+					put(grammarAccess.getRoutineAccess().getBodyBlockAssignment_7(), "rule__Routine__BodyBlockAssignment_7");
+					put(grammarAccess.getModelOfInteractionAccess().getRoutesAssignment_2_0(), "rule__ModelOfInteraction__RoutesAssignment_2_0");
+					put(grammarAccess.getModelOfInteractionAccess().getConnectionsAssignment_2_1(), "rule__ModelOfInteraction__ConnectionsAssignment_2_1");
+					put(grammarAccess.getRouteAccess().getProtocolAssignment_3(), "rule__Route__ProtocolAssignment_3");
+					put(grammarAccess.getRouteAccess().getNameAssignment_5_0(), "rule__Route__NameAssignment_5_0");
+					put(grammarAccess.getRouteAccess().getUnrestrictedNameAssignment_5_1(), "rule__Route__UnrestrictedNameAssignment_5_1");
+					put(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_0(), "rule__Route__SignalsAssignment_7_1_0");
+					put(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_1_1(), "rule__Route__SignalsAssignment_7_1_1_1");
+					put(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_0(), "rule__ComRouteProtocol__ProtocolAssignment_0");
+					put(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_1_0(), "rule__ComRouteProtocol__ProtocolAssignment_1_0");
+					put(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_0_1_0(), "rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0");
+					put(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_0_1_1(), "rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1");
+					put(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_1_1_0(), "rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0");
+					put(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_1_1_1(), "rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1");
+					put(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_2(), "rule__ComRouteProtocol__Inner_bufferAssignment_2");
+					put(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_3(), "rule__ComRouteProtocol__Ref_bufferAssignment_3");
+					put(grammarAccess.getConnectionAccess().getProtocolAssignment_2(), "rule__Connection__ProtocolAssignment_2");
+					put(grammarAccess.getConnectionAccess().getNameAssignment_4_0(), "rule__Connection__NameAssignment_4_0");
+					put(grammarAccess.getConnectionAccess().getUnrestrictedNameAssignment_4_1(), "rule__Connection__UnrestrictedNameAssignment_4_1");
+					put(grammarAccess.getConnectionAccess().getComPointsAssignment_6(), "rule__Connection__ComPointsAssignment_6");
+					put(grammarAccess.getComProtocolAccess().getProtocolAssignment_0(), "rule__ComProtocol__ProtocolAssignment_0");
+					put(grammarAccess.getComProtocolAccess().getProtocolAssignment_1_0(), "rule__ComProtocol__ProtocolAssignment_1_0");
+					put(grammarAccess.getComProtocolAccess().getCastAssignment_1_1_1(), "rule__ComProtocol__CastAssignment_1_1_1");
+					put(grammarAccess.getComProtocolAccess().getProtocolAssignment_2_0(), "rule__ComProtocol__ProtocolAssignment_2_0");
+					put(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_0_1_0(), "rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0");
+					put(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_0_1_1(), "rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1");
+					put(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_1_1_0(), "rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0");
+					put(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_1_1_1(), "rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1");
+					put(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_3(), "rule__ComProtocol__Inner_bufferAssignment_3");
+					put(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_4(), "rule__ComProtocol__Ref_bufferAssignment_4");
+					put(grammarAccess.getComProtocolAccess().getCastAssignment_5(), "rule__ComProtocol__CastAssignment_5");
+					put(grammarAccess.getComPointAccess().getDirectionAssignment_1(), "rule__ComPoint__DirectionAssignment_1");
+					put(grammarAccess.getComPointAccess().getProtocolAssignment_2_1(), "rule__ComPoint__ProtocolAssignment_2_1");
+					put(grammarAccess.getComPointAccess().getPointAssignment_3_0_0(), "rule__ComPoint__PointAssignment_3_0_0");
+					put(grammarAccess.getComPointAccess().getPointsAssignment_3_1_1(), "rule__ComPoint__PointsAssignment_3_1_1");
+					put(grammarAccess.getComPointProtocolAccess().getProtocolAssignment_0_0(), "rule__ComPointProtocol__ProtocolAssignment_0_0");
+					put(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_0_1_0(), "rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0");
+					put(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_0_1_1(), "rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1");
+					put(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_1_1_0(), "rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0");
+					put(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_1_1_1(), "rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1");
+					put(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_1(), "rule__ComPointProtocol__Inner_bufferAssignment_1");
+					put(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_2(), "rule__ComPointProtocol__Ref_bufferAssignment_2");
+					put(grammarAccess.getComElementAccess().getKindAssignment_0_1_1(), "rule__ComElement__KindAssignment_0_1_1");
+					put(grammarAccess.getComElementAccess().getElementAssignment_0_1_2(), "rule__ComElement__ElementAssignment_0_1_2");
+					put(grammarAccess.getComElementAccess().getTargetAssignment_1_1(), "rule__ComElement__TargetAssignment_1_1");
+					put(grammarAccess.getComElementAccess().getKindAssignment_1_2(), "rule__ComElement__KindAssignment_1_2");
+					put(grammarAccess.getComElementAccess().getElementAssignment_1_3(), "rule__ComElement__ElementAssignment_1_3");
+					put(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_0_1_2(), "rule__DataTypeReference__MultiplicityAssignment_0_1_2");
+					put(grammarAccess.getDataTypeReferenceAccess().getTyperefAssignment_1_1(), "rule__DataTypeReference__TyperefAssignment_1_1");
+					put(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_1_2_1(), "rule__DataTypeReference__MultiplicityAssignment_1_2_1");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityAssignment_1(), "rule__OtherDataTypeDefinition__VisibilityAssignment_1");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getNameAssignment_3(), "rule__OtherDataTypeDefinition__NameAssignment_3");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameAssignment_4(), "rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportAssignment_5_0_0(), "rule__OtherDataTypeDefinition__SupportAssignment_5_0_0");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_0_1_1(), "rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefAssignment_5_1_0(), "rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_1_1_1(), "rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1");
+					put(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefAssignment_6(), "rule__OtherDataTypeDefinition__TypedefAssignment_6");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameAssignment_1(), "rule__OtherDataTypeDefinitionImpl__NameAssignment_1");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2(), "rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportAssignment_3_0_0(), "rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_0_1_1(), "rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefAssignment_3_1_0(), "rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_1_1_1(), "rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1");
+					put(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefAssignment_4(), "rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4");
+					put(grammarAccess.getPrimitiveIntegerTypeAccess().getSignAssignment_1(), "rule__PrimitiveIntegerType__SignAssignment_1");
+					put(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_0_1(), "rule__PrimitiveIntegerType__SizeAssignment_3_0_1");
+					put(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_1_2(), "rule__PrimitiveIntegerType__SizeAssignment_3_1_2");
+					put(grammarAccess.getPrimitiveRationalTypeAccess().getSignAssignment_1(), "rule__PrimitiveRationalType__SignAssignment_1");
+					put(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_0_1(), "rule__PrimitiveRationalType__SizeAssignment_3_0_1");
+					put(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_1_2(), "rule__PrimitiveRationalType__SizeAssignment_3_1_2");
+					put(grammarAccess.getPrimitiveFloatTypeAccess().getSignAssignment_1(), "rule__PrimitiveFloatType__SignAssignment_1");
+					put(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_0_1(), "rule__PrimitiveFloatType__SizeAssignment_3_0_1");
+					put(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_1_2(), "rule__PrimitiveFloatType__SizeAssignment_3_1_2");
+					put(grammarAccess.getPrimitiveRealTypeAccess().getSignAssignment_1(), "rule__PrimitiveRealType__SignAssignment_1");
+					put(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_0_1(), "rule__PrimitiveRealType__SizeAssignment_3_0_1");
+					put(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_1_2(), "rule__PrimitiveRealType__SizeAssignment_3_1_2");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_0_1(), "rule__PrimitiveTimeType__SupportAssignment_0_2_0_1");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_1(), "rule__PrimitiveTimeType__SupportAssignment_0_2_1");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getClockAssignment_1_1(), "rule__PrimitiveTimeType__ClockAssignment_1_1");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_0_1(), "rule__PrimitiveTimeType__SupportAssignment_1_2_0_1");
+					put(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_1(), "rule__PrimitiveTimeType__SupportAssignment_1_2_1");
+					put(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_0_1(), "rule__PrimitiveStringType__SizeAssignment_2_0_1");
+					put(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_1_2(), "rule__PrimitiveStringType__SizeAssignment_2_1_2");
+					put(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedAssignment_1(), "rule__PrimitiveInstanceType__ExpectedAssignment_1");
+					put(grammarAccess.getPrimitiveInstanceTypeAccess().getModelAssignment_2_1(), "rule__PrimitiveInstanceType__ModelAssignment_2_1");
+					put(grammarAccess.getIntervalTypeAccess().getSupportAssignment_3(), "rule__IntervalType__SupportAssignment_3");
+					put(grammarAccess.getIntervalTypeAccess().getLopenAssignment_4_0(), "rule__IntervalType__LopenAssignment_4_0");
+					put(grammarAccess.getIntervalTypeAccess().getInfimumAssignment_5(), "rule__IntervalType__InfimumAssignment_5");
+					put(grammarAccess.getIntervalTypeAccess().getSupremumAssignment_7(), "rule__IntervalType__SupremumAssignment_7");
+					put(grammarAccess.getIntervalTypeAccess().getRopenAssignment_8_1(), "rule__IntervalType__RopenAssignment_8_1");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityAssignment_1(), "rule__IntervalTypeDefinition__VisibilityAssignment_1");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getNameAssignment_3(), "rule__IntervalTypeDefinition__NameAssignment_3");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameAssignment_4(), "rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getSupportAssignment_7(), "rule__IntervalTypeDefinition__SupportAssignment_7");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getLopenAssignment_8_0(), "rule__IntervalTypeDefinition__LopenAssignment_8_0");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumAssignment_9(), "rule__IntervalTypeDefinition__InfimumAssignment_9");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumAssignment_11(), "rule__IntervalTypeDefinition__SupremumAssignment_11");
+					put(grammarAccess.getIntervalTypeDefinitionAccess().getRopenAssignment_12_1(), "rule__IntervalTypeDefinition__RopenAssignment_12_1");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameAssignment_1(), "rule__IntervalTypeDefinitionImpl__NameAssignment_1");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2(), "rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportAssignment_5(), "rule__IntervalTypeDefinitionImpl__SupportAssignment_5");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenAssignment_6_0(), "rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumAssignment_7(), "rule__IntervalTypeDefinitionImpl__InfimumAssignment_7");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumAssignment_9(), "rule__IntervalTypeDefinitionImpl__SupremumAssignment_9");
+					put(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenAssignment_10_1(), "rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1");
+					put(grammarAccess.getCollectionTypeAccess().getContainerAssignment_1(), "rule__CollectionType__ContainerAssignment_1");
+					put(grammarAccess.getCollectionTypeAccess().getSupportAssignment_3(), "rule__CollectionType__SupportAssignment_3");
+					put(grammarAccess.getCollectionTypeAccess().getSizeAssignment_4_1_0(), "rule__CollectionType__SizeAssignment_4_1_0");
+					put(grammarAccess.getCollectionTypeAccess().getUnboundedAssignment_4_1_1(), "rule__CollectionType__UnboundedAssignment_4_1_1");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityAssignment_1(), "rule__CollectionTypeDefinition__VisibilityAssignment_1");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getNameAssignment_3(), "rule__CollectionTypeDefinition__NameAssignment_3");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameAssignment_4(), "rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getContainerAssignment_5(), "rule__CollectionTypeDefinition__ContainerAssignment_5");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getSupportAssignment_7(), "rule__CollectionTypeDefinition__SupportAssignment_7");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getSizeAssignment_8_1_0(), "rule__CollectionTypeDefinition__SizeAssignment_8_1_0");
+					put(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAssignment_8_1_1(), "rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1");
+					put(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameAssignment_1(), "rule__CollectionTypeDefinitionImpl__NameAssignment_1");
+					put(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2(), "rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerAssignment_3(), "rule__CollectionTypeDefinitionImpl__ContainerAssignment_3");
+					put(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportAssignment_5(), "rule__CollectionTypeDefinitionImpl__SupportAssignment_5");
+					put(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeAssignment_6_1_0(), "rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0");
+					put(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAssignment_6_1_1(), "rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1");
+					put(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_3(), "rule__EnumerationType__LiteralAssignment_3");
+					put(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_4_1(), "rule__EnumerationType__LiteralAssignment_4_1");
+					put(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityAssignment_1(), "rule__EnumerationTypeDefinition__VisibilityAssignment_1");
+					put(grammarAccess.getEnumerationTypeDefinitionAccess().getNameAssignment_3(), "rule__EnumerationTypeDefinition__NameAssignment_3");
+					put(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameAssignment_4(), "rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefAssignment_5(), "rule__EnumerationTypeDefinition__TypedefAssignment_5");
+					put(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_7(), "rule__EnumerationTypeDefinition__LiteralAssignment_7");
+					put(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_8_1(), "rule__EnumerationTypeDefinition__LiteralAssignment_8_1");
+					put(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameAssignment_1(), "rule__EnumerationTypeDefinitionImpl__NameAssignment_1");
+					put(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2(), "rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefAssignment_3(), "rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3");
+					put(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_5(), "rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5");
+					put(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_6_1(), "rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1");
+					put(grammarAccess.getEnumerationLiteralAccess().getNameAssignment_0(), "rule__EnumerationLiteral__NameAssignment_0");
+					put(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameAssignment_1(), "rule__EnumerationLiteral__UnrestrictedNameAssignment_1");
+					put(grammarAccess.getEnumerationLiteralAccess().getValueAssignment_2_1(), "rule__EnumerationLiteral__ValueAssignment_2_1");
+					put(grammarAccess.getStructureTypeAccess().getPropertyAssignment_3(), "rule__StructureType__PropertyAssignment_3");
+					put(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityAssignment_1(), "rule__StructureTypeDefinition__VisibilityAssignment_1");
+					put(grammarAccess.getStructureTypeDefinitionAccess().getNameAssignment_3(), "rule__StructureTypeDefinition__NameAssignment_3");
+					put(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameAssignment_4(), "rule__StructureTypeDefinition__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getStructureTypeDefinitionAccess().getTypedefAssignment_5(), "rule__StructureTypeDefinition__TypedefAssignment_5");
+					put(grammarAccess.getStructureTypeDefinitionAccess().getPropertyAssignment_7(), "rule__StructureTypeDefinition__PropertyAssignment_7");
+					put(grammarAccess.getStructureTypeDefinitionImplAccess().getNameAssignment_1(), "rule__StructureTypeDefinitionImpl__NameAssignment_1");
+					put(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2(), "rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefAssignment_3(), "rule__StructureTypeDefinitionImpl__TypedefAssignment_3");
+					put(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyAssignment_5(), "rule__StructureTypeDefinitionImpl__PropertyAssignment_5");
+					put(grammarAccess.getUnionTypeAccess().getPropertyAssignment_3(), "rule__UnionType__PropertyAssignment_3");
+					put(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityAssignment_1(), "rule__UnionTypeDefinition__VisibilityAssignment_1");
+					put(grammarAccess.getUnionTypeDefinitionAccess().getNameAssignment_3(), "rule__UnionTypeDefinition__NameAssignment_3");
+					put(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameAssignment_4(), "rule__UnionTypeDefinition__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getUnionTypeDefinitionAccess().getTypedefAssignment_5(), "rule__UnionTypeDefinition__TypedefAssignment_5");
+					put(grammarAccess.getUnionTypeDefinitionAccess().getPropertyAssignment_7(), "rule__UnionTypeDefinition__PropertyAssignment_7");
+					put(grammarAccess.getUnionTypeDefinitionImplAccess().getNameAssignment_1(), "rule__UnionTypeDefinitionImpl__NameAssignment_1");
+					put(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2(), "rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefAssignment_3(), "rule__UnionTypeDefinitionImpl__TypedefAssignment_3");
+					put(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyAssignment_5(), "rule__UnionTypeDefinitionImpl__PropertyAssignment_5");
+					put(grammarAccess.getChoiceTypeAccess().getPropertyAssignment_3(), "rule__ChoiceType__PropertyAssignment_3");
+					put(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityAssignment_1(), "rule__ChoiceTypeDefinition__VisibilityAssignment_1");
+					put(grammarAccess.getChoiceTypeDefinitionAccess().getNameAssignment_3(), "rule__ChoiceTypeDefinition__NameAssignment_3");
+					put(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameAssignment_4(), "rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefAssignment_5(), "rule__ChoiceTypeDefinition__TypedefAssignment_5");
+					put(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyAssignment_7(), "rule__ChoiceTypeDefinition__PropertyAssignment_7");
+					put(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameAssignment_1(), "rule__ChoiceTypeDefinitionImpl__NameAssignment_1");
+					put(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2(), "rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefAssignment_3(), "rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3");
+					put(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyAssignment_5(), "rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5");
+					put(grammarAccess.getModifierAccess().getStaticAssignment_1_0(), "rule__Modifier__StaticAssignment_1_0");
+					put(grammarAccess.getModifierAccess().getFinalAssignment_1_1(), "rule__Modifier__FinalAssignment_1_1");
+					put(grammarAccess.getModifierAccess().getReferenceAssignment_1_2(), "rule__Modifier__ReferenceAssignment_1_2");
+					put(grammarAccess.getModifierAccess().getVolatileAssignment_1_3(), "rule__Modifier__VolatileAssignment_1_3");
+					put(grammarAccess.getModifierAccess().getTransientAssignment_1_4(), "rule__Modifier__TransientAssignment_1_4");
+					put(grammarAccess.getVariableAccess().getVisibilityAssignment_0_0(), "rule__Variable__VisibilityAssignment_0_0");
+					put(grammarAccess.getVariableAccess().getModifierAssignment_0_1(), "rule__Variable__ModifierAssignment_0_1");
+					put(grammarAccess.getVariableAccess().getConstAssignment_1_1(), "rule__Variable__ConstAssignment_1_1");
+					put(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_0(), "rule__Variable__ConstAssignment_1_2_0_0");
+					put(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_1(), "rule__Variable__ConstAssignment_1_2_0_1");
+					put(grammarAccess.getVariableAccess().getMacroAssignment_1_2_1(), "rule__Variable__MacroAssignment_1_2_1");
+					put(grammarAccess.getVariableAccess().getMacroAssignment_1_3_0(), "rule__Variable__MacroAssignment_1_3_0");
+					put(grammarAccess.getVariableAccess().getConstAssignment_1_3_1_1(), "rule__Variable__ConstAssignment_1_3_1_1");
+					put(grammarAccess.getVariableAccess().getTypeAssignment_2(), "rule__Variable__TypeAssignment_2");
+					put(grammarAccess.getVariableAccess().getNameAssignment_3(), "rule__Variable__NameAssignment_3");
+					put(grammarAccess.getVariableAccess().getUnrestrictedNameAssignment_4(), "rule__Variable__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getVariableAccess().getDefaultValueAssignment_5_1(), "rule__Variable__DefaultValueAssignment_5_1");
+					put(grammarAccess.getVariableAccess().getOnWriteActionAssignment_6_0_1(), "rule__Variable__OnWriteActionAssignment_6_0_1");
+					put(grammarAccess.getVariableImplAccess().getConstAssignment_0_0_0(), "rule__VariableImpl__ConstAssignment_0_0_0");
+					put(grammarAccess.getVariableImplAccess().getConstAssignment_0_0_1(), "rule__VariableImpl__ConstAssignment_0_0_1");
+					put(grammarAccess.getVariableImplAccess().getMacroAssignment_0_1(), "rule__VariableImpl__MacroAssignment_0_1");
+					put(grammarAccess.getVariableImplAccess().getTypeAssignment_1(), "rule__VariableImpl__TypeAssignment_1");
+					put(grammarAccess.getVariableImplAccess().getNameAssignment_2(), "rule__VariableImpl__NameAssignment_2");
+					put(grammarAccess.getVariableImplAccess().getUnrestrictedNameAssignment_3(), "rule__VariableImpl__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getVariableImplAccess().getDefaultValueAssignment_4_1(), "rule__VariableImpl__DefaultValueAssignment_4_1");
+					put(grammarAccess.getVariableImplAccess().getOnWriteActionAssignment_5_0_1(), "rule__VariableImpl__OnWriteActionAssignment_5_0_1");
+					put(grammarAccess.getOnWriteRoutineAccess().getParameterAssignment_2_1(), "rule__OnWriteRoutine__ParameterAssignment_2_1");
+					put(grammarAccess.getOnWriteRoutineAccess().getBodyBlockAssignment_3(), "rule__OnWriteRoutine__BodyBlockAssignment_3");
+					put(grammarAccess.getVariableRoutineParameterAccess().getTypeAssignment_0(), "rule__VariableRoutineParameter__TypeAssignment_0");
+					put(grammarAccess.getVariableRoutineParameterAccess().getNameAssignment_1(), "rule__VariableRoutineParameter__NameAssignment_1");
+					put(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueAssignment_2_1(), "rule__VariableRoutineParameter__DefaultValueAssignment_2_1");
+					put(grammarAccess.getVariablePublicAccess().getModifierAssignment_0(), "rule__VariablePublic__ModifierAssignment_0");
+					put(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_0(), "rule__VariablePublic__ConstAssignment_1_0_0");
+					put(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_1(), "rule__VariablePublic__ConstAssignment_1_0_1");
+					put(grammarAccess.getVariablePublicAccess().getMacroAssignment_1_1(), "rule__VariablePublic__MacroAssignment_1_1");
+					put(grammarAccess.getVariablePublicAccess().getVisibilityAssignment_2(), "rule__VariablePublic__VisibilityAssignment_2");
+					put(grammarAccess.getVariablePublicAccess().getTypeAssignment_3(), "rule__VariablePublic__TypeAssignment_3");
+					put(grammarAccess.getVariablePublicAccess().getNameAssignment_4(), "rule__VariablePublic__NameAssignment_4");
+					put(grammarAccess.getVariablePublicAccess().getUnrestrictedNameAssignment_5(), "rule__VariablePublic__UnrestrictedNameAssignment_5");
+					put(grammarAccess.getVariablePublicAccess().getDefaultValueAssignment_6_1(), "rule__VariablePublic__DefaultValueAssignment_6_1");
+					put(grammarAccess.getVariablePublicAccess().getOnWriteActionAssignment_7_0_1(), "rule__VariablePublic__OnWriteActionAssignment_7_0_1");
+					put(grammarAccess.getVariableProtectedAccess().getModifierAssignment_0(), "rule__VariableProtected__ModifierAssignment_0");
+					put(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_0(), "rule__VariableProtected__ConstAssignment_1_0_0");
+					put(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_1(), "rule__VariableProtected__ConstAssignment_1_0_1");
+					put(grammarAccess.getVariableProtectedAccess().getMacroAssignment_1_1(), "rule__VariableProtected__MacroAssignment_1_1");
+					put(grammarAccess.getVariableProtectedAccess().getVisibilityAssignment_2(), "rule__VariableProtected__VisibilityAssignment_2");
+					put(grammarAccess.getVariableProtectedAccess().getTypeAssignment_3(), "rule__VariableProtected__TypeAssignment_3");
+					put(grammarAccess.getVariableProtectedAccess().getNameAssignment_4(), "rule__VariableProtected__NameAssignment_4");
+					put(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameAssignment_5(), "rule__VariableProtected__UnrestrictedNameAssignment_5");
+					put(grammarAccess.getVariableProtectedAccess().getDefaultValueAssignment_6_1(), "rule__VariableProtected__DefaultValueAssignment_6_1");
+					put(grammarAccess.getVariableProtectedAccess().getOnWriteActionAssignment_7_0_1(), "rule__VariableProtected__OnWriteActionAssignment_7_0_1");
+					put(grammarAccess.getVariablePrivateAccess().getModifierAssignment_0(), "rule__VariablePrivate__ModifierAssignment_0");
+					put(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_0(), "rule__VariablePrivate__ConstAssignment_1_0_0");
+					put(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_1(), "rule__VariablePrivate__ConstAssignment_1_0_1");
+					put(grammarAccess.getVariablePrivateAccess().getMacroAssignment_1_1(), "rule__VariablePrivate__MacroAssignment_1_1");
+					put(grammarAccess.getVariablePrivateAccess().getVisibilityAssignment_2(), "rule__VariablePrivate__VisibilityAssignment_2");
+					put(grammarAccess.getVariablePrivateAccess().getTypeAssignment_3(), "rule__VariablePrivate__TypeAssignment_3");
+					put(grammarAccess.getVariablePrivateAccess().getNameAssignment_4(), "rule__VariablePrivate__NameAssignment_4");
+					put(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameAssignment_5(), "rule__VariablePrivate__UnrestrictedNameAssignment_5");
+					put(grammarAccess.getVariablePrivateAccess().getDefaultValueAssignment_6_1(), "rule__VariablePrivate__DefaultValueAssignment_6_1");
+					put(grammarAccess.getVariablePrivateAccess().getOnWriteActionAssignment_7_0_1(), "rule__VariablePrivate__OnWriteActionAssignment_7_0_1");
+					put(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_1(), "rule__FunctionalParameterSet__ParameterAssignment_1");
+					put(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_2_1(), "rule__FunctionalParameterSet__ParameterAssignment_2_1");
+					put(grammarAccess.getFunctionalParameterAccess().getDirectionAssignment_1(), "rule__FunctionalParameter__DirectionAssignment_1");
+					put(grammarAccess.getFunctionalParameterAccess().getTypeAssignment_2(), "rule__FunctionalParameter__TypeAssignment_2");
+					put(grammarAccess.getFunctionalParameterAccess().getNameAssignment_3(), "rule__FunctionalParameter__NameAssignment_3");
+					put(grammarAccess.getFunctionalParameterAccess().getDefaultValueAssignment_4_1(), "rule__FunctionalParameter__DefaultValueAssignment_4_1");
+					put(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_1(), "rule__FormalParameterSet__ParameterAssignment_1");
+					put(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_2_1(), "rule__FormalParameterSet__ParameterAssignment_2_1");
+					put(grammarAccess.getFormalParameterAccess().getDirectionAssignment_1(), "rule__FormalParameter__DirectionAssignment_1");
+					put(grammarAccess.getFormalParameterAccess().getTypeAssignment_2(), "rule__FormalParameter__TypeAssignment_2");
+					put(grammarAccess.getFormalParameterAccess().getNameAssignment_3(), "rule__FormalParameter__NameAssignment_3");
+					put(grammarAccess.getFormalParameterAccess().getDefaultValueAssignment_4_1(), "rule__FormalParameter__DefaultValueAssignment_4_1");
+					put(grammarAccess.getBlockParameterSetAccess().getParameterAssignment_1_0_1_0(), "rule__BlockParameterSet__ParameterAssignment_1_0_1_0");
+					put(grammarAccess.getBlockParameterSetAccess().getParameterAssignment_1_0_1_1_1(), "rule__BlockParameterSet__ParameterAssignment_1_0_1_1_1");
+					put(grammarAccess.getBlockParameterSetAccess().getParameterAssignment_1_1_1_0(), "rule__BlockParameterSet__ParameterAssignment_1_1_1_0");
+					put(grammarAccess.getBlockParameterSetAccess().getParameterAssignment_1_1_1_1_1(), "rule__BlockParameterSet__ParameterAssignment_1_1_1_1_1");
+					put(grammarAccess.getBlockParameterSetAccess().getParameterAssignment_1_2_1_0(), "rule__BlockParameterSet__ParameterAssignment_1_2_1_0");
+					put(grammarAccess.getBlockParameterSetAccess().getParameterAssignment_1_2_1_1_1(), "rule__BlockParameterSet__ParameterAssignment_1_2_1_1_1");
+					put(grammarAccess.getBlockParameterSetAccess().getParameterAssignment_1_3_1_0(), "rule__BlockParameterSet__ParameterAssignment_1_3_1_0");
+					put(grammarAccess.getBlockParameterSetAccess().getParameterAssignment_1_3_1_1_1(), "rule__BlockParameterSet__ParameterAssignment_1_3_1_1_1");
+					put(grammarAccess.getParameterInputAccess().getDirectionAssignment_0(), "rule__ParameterInput__DirectionAssignment_0");
+					put(grammarAccess.getParameterInputAccess().getTypeAssignment_1(), "rule__ParameterInput__TypeAssignment_1");
+					put(grammarAccess.getParameterInputAccess().getNameAssignment_2(), "rule__ParameterInput__NameAssignment_2");
+					put(grammarAccess.getParameterInputAccess().getUnrestrictedNameAssignment_3(), "rule__ParameterInput__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getParameterInputAccess().getDefaultValueAssignment_4_1(), "rule__ParameterInput__DefaultValueAssignment_4_1");
+					put(grammarAccess.getParameterInoutAccess().getDirectionAssignment_0(), "rule__ParameterInout__DirectionAssignment_0");
+					put(grammarAccess.getParameterInoutAccess().getTypeAssignment_1(), "rule__ParameterInout__TypeAssignment_1");
+					put(grammarAccess.getParameterInoutAccess().getNameAssignment_2(), "rule__ParameterInout__NameAssignment_2");
+					put(grammarAccess.getParameterInoutAccess().getUnrestrictedNameAssignment_3(), "rule__ParameterInout__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getParameterInoutAccess().getDefaultValueAssignment_4_1(), "rule__ParameterInout__DefaultValueAssignment_4_1");
+					put(grammarAccess.getParameterOutputAccess().getDirectionAssignment_0(), "rule__ParameterOutput__DirectionAssignment_0");
+					put(grammarAccess.getParameterOutputAccess().getTypeAssignment_1(), "rule__ParameterOutput__TypeAssignment_1");
+					put(grammarAccess.getParameterOutputAccess().getNameAssignment_2(), "rule__ParameterOutput__NameAssignment_2");
+					put(grammarAccess.getParameterOutputAccess().getUnrestrictedNameAssignment_3(), "rule__ParameterOutput__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getParameterOutputAccess().getDefaultValueAssignment_4_1(), "rule__ParameterOutput__DefaultValueAssignment_4_1");
+					put(grammarAccess.getParameterReturnAccess().getDirectionAssignment_0(), "rule__ParameterReturn__DirectionAssignment_0");
+					put(grammarAccess.getParameterReturnAccess().getTypeAssignment_1(), "rule__ParameterReturn__TypeAssignment_1");
+					put(grammarAccess.getParameterReturnAccess().getNameAssignment_2(), "rule__ParameterReturn__NameAssignment_2");
+					put(grammarAccess.getParameterReturnAccess().getUnrestrictedNameAssignment_3(), "rule__ParameterReturn__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getParameterReturnAccess().getDefaultValueAssignment_4_1(), "rule__ParameterReturn__DefaultValueAssignment_4_1");
+					put(grammarAccess.getParameterDeclarationAccess().getDirectionAssignment_1(), "rule__ParameterDeclaration__DirectionAssignment_1");
+					put(grammarAccess.getParameterDeclarationAccess().getTypeAssignment_2(), "rule__ParameterDeclaration__TypeAssignment_2");
+					put(grammarAccess.getParameterDeclarationAccess().getNameAssignment_3(), "rule__ParameterDeclaration__NameAssignment_3");
+					put(grammarAccess.getParameterDeclarationAccess().getUnrestrictedNameAssignment_4(), "rule__ParameterDeclaration__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getParameterDeclarationAccess().getDefaultValueAssignment_5_1(), "rule__ParameterDeclaration__DefaultValueAssignment_5_1");
+					put(grammarAccess.getBufferContainerTypeAccess().getContainerAssignment_1(), "rule__BufferContainerType__ContainerAssignment_1");
+					put(grammarAccess.getBufferContainerTypeAccess().getSizeAssignment_2_1_0(), "rule__BufferContainerType__SizeAssignment_2_1_0");
+					put(grammarAccess.getBufferContainerTypeAccess().getUnboundedAssignment_2_1_1(), "rule__BufferContainerType__UnboundedAssignment_2_1_1");
+					put(grammarAccess.getBufferAccess().getVisibilityAssignment_0_0(), "rule__Buffer__VisibilityAssignment_0_0");
+					put(grammarAccess.getBufferAccess().getModifierAssignment_0_1(), "rule__Buffer__ModifierAssignment_0_1");
+					put(grammarAccess.getBufferAccess().getTypeAssignment_2(), "rule__Buffer__TypeAssignment_2");
+					put(grammarAccess.getBufferAccess().getNameAssignment_3(), "rule__Buffer__NameAssignment_3");
+					put(grammarAccess.getBufferAccess().getUnrestrictedNameAssignment_4(), "rule__Buffer__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getBufferImplAccess().getTypeAssignment_0(), "rule__BufferImpl__TypeAssignment_0");
+					put(grammarAccess.getBufferImplAccess().getNameAssignment_1(), "rule__BufferImpl__NameAssignment_1");
+					put(grammarAccess.getBufferImplAccess().getUnrestrictedNameAssignment_2(), "rule__BufferImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getBufferPublicAccess().getModifierAssignment_0(), "rule__BufferPublic__ModifierAssignment_0");
+					put(grammarAccess.getBufferPublicAccess().getVisibilityAssignment_1(), "rule__BufferPublic__VisibilityAssignment_1");
+					put(grammarAccess.getBufferPublicAccess().getTypeAssignment_2(), "rule__BufferPublic__TypeAssignment_2");
+					put(grammarAccess.getBufferPublicAccess().getNameAssignment_3(), "rule__BufferPublic__NameAssignment_3");
+					put(grammarAccess.getBufferPublicAccess().getUnrestrictedNameAssignment_4(), "rule__BufferPublic__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getBufferProtectedAccess().getModifierAssignment_0(), "rule__BufferProtected__ModifierAssignment_0");
+					put(grammarAccess.getBufferProtectedAccess().getVisibilityAssignment_1(), "rule__BufferProtected__VisibilityAssignment_1");
+					put(grammarAccess.getBufferProtectedAccess().getTypeAssignment_2(), "rule__BufferProtected__TypeAssignment_2");
+					put(grammarAccess.getBufferProtectedAccess().getNameAssignment_3(), "rule__BufferProtected__NameAssignment_3");
+					put(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameAssignment_4(), "rule__BufferProtected__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getBufferPrivateAccess().getModifierAssignment_0(), "rule__BufferPrivate__ModifierAssignment_0");
+					put(grammarAccess.getBufferPrivateAccess().getVisibilityAssignment_1(), "rule__BufferPrivate__VisibilityAssignment_1");
+					put(grammarAccess.getBufferPrivateAccess().getTypeAssignment_2(), "rule__BufferPrivate__TypeAssignment_2");
+					put(grammarAccess.getBufferPrivateAccess().getNameAssignment_3(), "rule__BufferPrivate__NameAssignment_3");
+					put(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameAssignment_4(), "rule__BufferPrivate__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getPortAccess().getVisibilityAssignment_0(), "rule__Port__VisibilityAssignment_0");
+					put(grammarAccess.getPortAccess().getDirectionAssignment_2(), "rule__Port__DirectionAssignment_2");
+					put(grammarAccess.getPortAccess().getNameAssignment_3(), "rule__Port__NameAssignment_3");
+					put(grammarAccess.getPortAccess().getUnrestrictedNameAssignment_4(), "rule__Port__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getPortAccess().getParameterAssignment_5_1(), "rule__Port__ParameterAssignment_5_1");
+					put(grammarAccess.getPortAccess().getParameterAssignment_5_2_1(), "rule__Port__ParameterAssignment_5_2_1");
+					put(grammarAccess.getPortImplAccess().getDirectionAssignment_0(), "rule__PortImpl__DirectionAssignment_0");
+					put(grammarAccess.getPortImplAccess().getNameAssignment_1(), "rule__PortImpl__NameAssignment_1");
+					put(grammarAccess.getPortImplAccess().getUnrestrictedNameAssignment_2(), "rule__PortImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getPortImplAccess().getParameterAssignment_3_1(), "rule__PortImpl__ParameterAssignment_3_1");
+					put(grammarAccess.getPortImplAccess().getParameterAssignment_3_2_1(), "rule__PortImpl__ParameterAssignment_3_2_1");
+					put(grammarAccess.getPortPublicAccess().getVisibilityAssignment_0(), "rule__PortPublic__VisibilityAssignment_0");
+					put(grammarAccess.getPortPublicAccess().getDirectionAssignment_1(), "rule__PortPublic__DirectionAssignment_1");
+					put(grammarAccess.getPortPublicAccess().getNameAssignment_2(), "rule__PortPublic__NameAssignment_2");
+					put(grammarAccess.getPortPublicAccess().getUnrestrictedNameAssignment_3(), "rule__PortPublic__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getPortPublicAccess().getParameterAssignment_4_1(), "rule__PortPublic__ParameterAssignment_4_1");
+					put(grammarAccess.getPortPublicAccess().getParameterAssignment_4_2_1(), "rule__PortPublic__ParameterAssignment_4_2_1");
+					put(grammarAccess.getPortProtectedAccess().getVisibilityAssignment_0(), "rule__PortProtected__VisibilityAssignment_0");
+					put(grammarAccess.getPortProtectedAccess().getDirectionAssignment_1(), "rule__PortProtected__DirectionAssignment_1");
+					put(grammarAccess.getPortProtectedAccess().getNameAssignment_2(), "rule__PortProtected__NameAssignment_2");
+					put(grammarAccess.getPortProtectedAccess().getUnrestrictedNameAssignment_3(), "rule__PortProtected__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_1(), "rule__PortProtected__ParameterAssignment_4_1");
+					put(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_2_1(), "rule__PortProtected__ParameterAssignment_4_2_1");
+					put(grammarAccess.getPortPrivateAccess().getVisibilityAssignment_0(), "rule__PortPrivate__VisibilityAssignment_0");
+					put(grammarAccess.getPortPrivateAccess().getDirectionAssignment_1(), "rule__PortPrivate__DirectionAssignment_1");
+					put(grammarAccess.getPortPrivateAccess().getNameAssignment_2(), "rule__PortPrivate__NameAssignment_2");
+					put(grammarAccess.getPortPrivateAccess().getUnrestrictedNameAssignment_3(), "rule__PortPrivate__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_1(), "rule__PortPrivate__ParameterAssignment_4_1");
+					put(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_2_1(), "rule__PortPrivate__ParameterAssignment_4_2_1");
+					put(grammarAccess.getSignalAccess().getVisibilityAssignment_0(), "rule__Signal__VisibilityAssignment_0");
+					put(grammarAccess.getSignalAccess().getDirectionAssignment_2(), "rule__Signal__DirectionAssignment_2");
+					put(grammarAccess.getSignalAccess().getNameAssignment_3(), "rule__Signal__NameAssignment_3");
+					put(grammarAccess.getSignalAccess().getUnrestrictedNameAssignment_4(), "rule__Signal__UnrestrictedNameAssignment_4");
+					put(grammarAccess.getSignalAccess().getParameterAssignment_5_1(), "rule__Signal__ParameterAssignment_5_1");
+					put(grammarAccess.getSignalAccess().getParameterAssignment_5_2_1(), "rule__Signal__ParameterAssignment_5_2_1");
+					put(grammarAccess.getSignalImplAccess().getDirectionAssignment_0(), "rule__SignalImpl__DirectionAssignment_0");
+					put(grammarAccess.getSignalImplAccess().getNameAssignment_1(), "rule__SignalImpl__NameAssignment_1");
+					put(grammarAccess.getSignalImplAccess().getUnrestrictedNameAssignment_2(), "rule__SignalImpl__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getSignalImplAccess().getParameterAssignment_3_1(), "rule__SignalImpl__ParameterAssignment_3_1");
+					put(grammarAccess.getSignalImplAccess().getParameterAssignment_3_2_1(), "rule__SignalImpl__ParameterAssignment_3_2_1");
+					put(grammarAccess.getSignalPublicAccess().getVisibilityAssignment_0(), "rule__SignalPublic__VisibilityAssignment_0");
+					put(grammarAccess.getSignalPublicAccess().getDirectionAssignment_1(), "rule__SignalPublic__DirectionAssignment_1");
+					put(grammarAccess.getSignalPublicAccess().getNameAssignment_2(), "rule__SignalPublic__NameAssignment_2");
+					put(grammarAccess.getSignalPublicAccess().getUnrestrictedNameAssignment_3(), "rule__SignalPublic__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_1(), "rule__SignalPublic__ParameterAssignment_4_1");
+					put(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_2_1(), "rule__SignalPublic__ParameterAssignment_4_2_1");
+					put(grammarAccess.getSignalProtectedAccess().getVisibilityAssignment_0(), "rule__SignalProtected__VisibilityAssignment_0");
+					put(grammarAccess.getSignalProtectedAccess().getDirectionAssignment_1(), "rule__SignalProtected__DirectionAssignment_1");
+					put(grammarAccess.getSignalProtectedAccess().getNameAssignment_2(), "rule__SignalProtected__NameAssignment_2");
+					put(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameAssignment_3(), "rule__SignalProtected__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_1(), "rule__SignalProtected__ParameterAssignment_4_1");
+					put(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_2_1(), "rule__SignalProtected__ParameterAssignment_4_2_1");
+					put(grammarAccess.getSignalPrivateAccess().getVisibilityAssignment_0(), "rule__SignalPrivate__VisibilityAssignment_0");
+					put(grammarAccess.getSignalPrivateAccess().getDirectionAssignment_1(), "rule__SignalPrivate__DirectionAssignment_1");
+					put(grammarAccess.getSignalPrivateAccess().getNameAssignment_2(), "rule__SignalPrivate__NameAssignment_2");
+					put(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameAssignment_3(), "rule__SignalPrivate__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_1(), "rule__SignalPrivate__ParameterAssignment_4_1");
+					put(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_2_1(), "rule__SignalPrivate__ParameterAssignment_4_2_1");
+					put(grammarAccess.getChannelAccess().getVisibilityAssignment_0(), "rule__Channel__VisibilityAssignment_0");
+					put(grammarAccess.getChannelAccess().getNameAssignment_2(), "rule__Channel__NameAssignment_2");
+					put(grammarAccess.getChannelAccess().getUnrestrictedNameAssignment_3(), "rule__Channel__UnrestrictedNameAssignment_3");
+					put(grammarAccess.getChannelAccess().getSignalAssignment_5_0(), "rule__Channel__SignalAssignment_5_0");
+					put(grammarAccess.getSignalReferenceAccess().getDirectionAssignment_0(), "rule__SignalReference__DirectionAssignment_0");
+					put(grammarAccess.getSignalReferenceAccess().getNameAssignment_1(), "rule__SignalReference__NameAssignment_1");
+					put(grammarAccess.getChannelPublicAccess().getVisibilityAssignment_0(), "rule__ChannelPublic__VisibilityAssignment_0");
+					put(grammarAccess.getChannelPublicAccess().getNameAssignment_1(), "rule__ChannelPublic__NameAssignment_1");
+					put(grammarAccess.getChannelPublicAccess().getUnrestrictedNameAssignment_2(), "rule__ChannelPublic__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getChannelPublicAccess().getSignalAssignment_4_0(), "rule__ChannelPublic__SignalAssignment_4_0");
+					put(grammarAccess.getChannelProtectedAccess().getVisibilityAssignment_0(), "rule__ChannelProtected__VisibilityAssignment_0");
+					put(grammarAccess.getChannelProtectedAccess().getNameAssignment_1(), "rule__ChannelProtected__NameAssignment_1");
+					put(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameAssignment_2(), "rule__ChannelProtected__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getChannelProtectedAccess().getSignalAssignment_4_0(), "rule__ChannelProtected__SignalAssignment_4_0");
+					put(grammarAccess.getChannelPrivateAccess().getVisibilityAssignment_0(), "rule__ChannelPrivate__VisibilityAssignment_0");
+					put(grammarAccess.getChannelPrivateAccess().getNameAssignment_1(), "rule__ChannelPrivate__NameAssignment_1");
+					put(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameAssignment_2(), "rule__ChannelPrivate__UnrestrictedNameAssignment_2");
+					put(grammarAccess.getChannelPrivateAccess().getSignalAssignment_4_0(), "rule__ChannelPrivate__SignalAssignment_4_0");
+					put(grammarAccess.getTransitionAccess().getTransientAssignment_1(), "rule__Transition__TransientAssignment_1");
+					put(grammarAccess.getTransitionAccess().getMoeAssignment_3(), "rule__Transition__MoeAssignment_3");
+					put(grammarAccess.getTransitionAccess().getNameAssignment_4_0(), "rule__Transition__NameAssignment_4_0");
+					put(grammarAccess.getTransitionAccess().getUnrestrictedNameAssignment_4_1(), "rule__Transition__UnrestrictedNameAssignment_4_1");
+					put(grammarAccess.getTransitionAccess().getTriggerAssignment_5_0_1_0_0_1(), "rule__Transition__TriggerAssignment_5_0_1_0_0_1");
+					put(grammarAccess.getTransitionAccess().getGuardAssignment_5_0_1_0_1_0(), "rule__Transition__GuardAssignment_5_0_1_0_1_0");
+					put(grammarAccess.getTransitionAccess().getTguardAssignment_5_0_1_0_2_0(), "rule__Transition__TguardAssignment_5_0_1_0_2_0");
+					put(grammarAccess.getTransitionAccess().getEffectAssignment_5_0_1_0_4(), "rule__Transition__EffectAssignment_5_0_1_0_4");
+					put(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_0_1_1(), "rule__Transition__BehaviorAssignment_5_0_1_1");
+					put(grammarAccess.getTransitionAccess().getTargetAssignment_5_0_3_1(), "rule__Transition__TargetAssignment_5_0_3_1");
+					put(grammarAccess.getTransitionAccess().getTargetAssignment_5_1_1(), "rule__Transition__TargetAssignment_5_1_1");
+					put(grammarAccess.getTransitionAccess().getTriggerAssignment_5_1_2_0_1_0_0_1(), "rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1");
+					put(grammarAccess.getTransitionAccess().getGuardAssignment_5_1_2_0_1_0_1_0(), "rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0");
+					put(grammarAccess.getTransitionAccess().getTguardAssignment_5_1_2_0_1_0_2_0(), "rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0");
+					put(grammarAccess.getTransitionAccess().getEffectAssignment_5_1_2_0_1_0_4(), "rule__Transition__EffectAssignment_5_1_2_0_1_0_4");
+					put(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_1_2_0_1_1(), "rule__Transition__BehaviorAssignment_5_1_2_0_1_1");
+					put(grammarAccess.getTransitionMoeAccess().getMocAssignment_1_0_1_0_0(), "rule__TransitionMoe__MocAssignment_1_0_1_0_0");
+					put(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_0_1_1(), "rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1");
+					put(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_1(), "rule__TransitionMoe__IsElseAssignment_1_0_1_1");
+					put(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_0_2_2(), "rule__TransitionMoe__PriorAssignment_1_0_2_2");
+					put(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_1_1(), "rule__TransitionMoe__PriorAssignment_1_1_1");
+					put(grammarAccess.getTransitionBehaviorAccess().getOpAssignment_1(), "rule__TransitionBehavior__OpAssignment_1");
+					put(grammarAccess.getTransitionBehaviorAccess().getStatementAssignment_2(), "rule__TransitionBehavior__StatementAssignment_2");
+					put(grammarAccess.getTransitionGuardAccess().getConditionAssignment_0_2(), "rule__TransitionGuard__ConditionAssignment_0_2");
+					put(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_0_1(), "rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1");
+					put(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_1(), "rule__TransitionGuard__ConditionAssignment_1_1_0_1_1");
+					put(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAssignment_1(), "rule__TransitionGuardExpression__OperatorAssignment_1");
+					put(grammarAccess.getTransitionGuardExpressionAccess().getOperandAssignment_3(), "rule__TransitionGuardExpression__OperandAssignment_3");
+					put(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_0_2(), "rule__TransitionTimedGuard__ConditionAssignment_0_2");
+					put(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_0_1(), "rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1");
+					put(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_1(), "rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1");
+					put(grammarAccess.getTransitionEffectAccess().getStatementAssignment_1_1(), "rule__TransitionEffect__StatementAssignment_1_1");
+					put(grammarAccess.getBlockStatementAccess().getOpAssignment_2(), "rule__BlockStatement__OpAssignment_2");
+					put(grammarAccess.getBlockStatementAccess().getStatementAssignment_3(), "rule__BlockStatement__StatementAssignment_3");
+					put(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_0_0(), "rule__ExpressionStatement__ExpressionAssignment_0_0");
+					put(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_1_0(), "rule__ExpressionStatement__ExpressionAssignment_1_0");
+					put(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_2_0(), "rule__ExpressionStatement__ExpressionAssignment_2_0");
+					put(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_3_0(), "rule__ExpressionStatement__ExpressionAssignment_3_0");
+					put(grammarAccess.getGuardStatementAccess().getConditionAssignment_1(), "rule__GuardStatement__ConditionAssignment_1");
+					put(grammarAccess.getTimedGuardStatementAccess().getConditionAssignment_1(), "rule__TimedGuardStatement__ConditionAssignment_1");
+					put(grammarAccess.getEventGuardStatementAccess().getConditionAssignment_1(), "rule__EventGuardStatement__ConditionAssignment_1");
+					put(grammarAccess.getCheckSatGuardStatementAccess().getSolverAssignment_2(), "rule__CheckSatGuardStatement__SolverAssignment_2");
+					put(grammarAccess.getCheckSatGuardStatementAccess().getConditionAssignment_4(), "rule__CheckSatGuardStatement__ConditionAssignment_4");
+					put(grammarAccess.getInputComStatementAccess().getPortAssignment_1(), "rule__InputComStatement__PortAssignment_1");
+					put(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_1(), "rule__InputComStatement__LeftValueAssignment_2_1");
+					put(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_2_1(), "rule__InputComStatement__LeftValueAssignment_2_2_1");
+					put(grammarAccess.getInputComStatementAccess().getTargetAssignment_3_0_1(), "rule__InputComStatement__TargetAssignment_3_0_1");
+					put(grammarAccess.getInputComStatementAccess().getRouteAssignment_3_1_1(), "rule__InputComStatement__RouteAssignment_3_1_1");
+					put(grammarAccess.getOutputComStatementAccess().getPortAssignment_1(), "rule__OutputComStatement__PortAssignment_1");
+					put(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_1(), "rule__OutputComStatement__RigthValueAssignment_2_1");
+					put(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_2_1(), "rule__OutputComStatement__RigthValueAssignment_2_2_1");
+					put(grammarAccess.getOutputComStatementAccess().getTargetAssignment_3_0_1(), "rule__OutputComStatement__TargetAssignment_3_0_1");
+					put(grammarAccess.getOutputComStatementAccess().getRouteAssignment_3_1_1(), "rule__OutputComStatement__RouteAssignment_3_1_1");
+					put(grammarAccess.getExpressionAsMachineAccess().getMachineAssignment(), "rule__ExpressionAsMachine__MachineAssignment");
+					put(grammarAccess.getIfStatementAccess().getConditionAssignment_1(), "rule__IfStatement__ConditionAssignment_1");
+					put(grammarAccess.getIfStatementAccess().getBodyBlockAssignment_2(), "rule__IfStatement__BodyBlockAssignment_2");
+					put(grammarAccess.getIfStatementAccess().getElseifStatementAssignment_3(), "rule__IfStatement__ElseifStatementAssignment_3");
+					put(grammarAccess.getIfStatementAccess().getElseBlockAssignment_4_1(), "rule__IfStatement__ElseBlockAssignment_4_1");
+					put(grammarAccess.getElseIfStatementAccess().getConditionAssignment_1(), "rule__ElseIfStatement__ConditionAssignment_1");
+					put(grammarAccess.getElseIfStatementAccess().getBodyBlockAssignment_2(), "rule__ElseIfStatement__BodyBlockAssignment_2");
+					put(grammarAccess.getWhileDoStatementAccess().getConditionAssignment_1(), "rule__WhileDoStatement__ConditionAssignment_1");
+					put(grammarAccess.getWhileDoStatementAccess().getBodyBlockAssignment_2(), "rule__WhileDoStatement__BodyBlockAssignment_2");
+					put(grammarAccess.getDoWhileStatementAccess().getBodyBlockAssignment_1(), "rule__DoWhileStatement__BodyBlockAssignment_1");
+					put(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_3(), "rule__DoWhileStatement__ConditionAssignment_3");
+					put(grammarAccess.getForStatementAccess().getInitAssignment_0_1(), "rule__ForStatement__InitAssignment_0_1");
+					put(grammarAccess.getForStatementAccess().getConditionAssignment_0_3(), "rule__ForStatement__ConditionAssignment_0_3");
+					put(grammarAccess.getForStatementAccess().getIterateAssignment_0_5(), "rule__ForStatement__IterateAssignment_0_5");
+					put(grammarAccess.getForStatementAccess().getBodyBlockAssignment_0_6(), "rule__ForStatement__BodyBlockAssignment_0_6");
+					put(grammarAccess.getForStatementAccess().getInitAssignment_1_2(), "rule__ForStatement__InitAssignment_1_2");
+					put(grammarAccess.getForStatementAccess().getConditionAssignment_1_4(), "rule__ForStatement__ConditionAssignment_1_4");
+					put(grammarAccess.getForStatementAccess().getIterateAssignment_1_6(), "rule__ForStatement__IterateAssignment_1_6");
+					put(grammarAccess.getForStatementAccess().getBodyBlockAssignment_1_8(), "rule__ForStatement__BodyBlockAssignment_1_8");
+					put(grammarAccess.getForEachStatementAccess().getIteratorAssignment_0_1(), "rule__ForEachStatement__IteratorAssignment_0_1");
+					put(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_0_3(), "rule__ForEachStatement__EnumerationAssignment_0_3");
+					put(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_0_4(), "rule__ForEachStatement__BodyBlockAssignment_0_4");
+					put(grammarAccess.getForEachStatementAccess().getIteratorAssignment_1_2(), "rule__ForEachStatement__IteratorAssignment_1_2");
+					put(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_1_4(), "rule__ForEachStatement__EnumerationAssignment_1_4");
+					put(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_1_6(), "rule__ForEachStatement__BodyBlockAssignment_1_6");
+					put(grammarAccess.getInterruptStatementAccess().getKindAssignment_0(), "rule__InterruptStatement__KindAssignment_0");
+					put(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_0(), "rule__InterruptStatement__ExprAssignment_1_0");
+					put(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_1(), "rule__InterruptStatement__ExprAssignment_1_1_1");
+					put(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_2_1(), "rule__InterruptStatement__ExprAssignment_1_1_2_1");
+					put(grammarAccess.getActivityStatementAccess().getOpAssignment_1(), "rule__ActivityStatement__OpAssignment_1");
+					put(grammarAccess.getActivityStatementAccess().getMachineAssignment_2(), "rule__ActivityStatement__MachineAssignment_2");
+					put(grammarAccess.getActivityStatementAccess().getTupleAssignment_3(), "rule__ActivityStatement__TupleAssignment_3");
+					put(grammarAccess.getInvokeStatementAccess().getExpressionAssignment_0_0(), "rule__InvokeStatement__ExpressionAssignment_0_0");
+					put(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_1_0(), "rule__InvokeStatement__InvokableAssignment_1_0");
+					put(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_1_1(), "rule__InvokeStatement__ExecRoutineAssignment_1_1");
+					put(grammarAccess.getInvokeStatementAccess().getArgsAssignment_1_2(), "rule__InvokeStatement__ArgsAssignment_1_2");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_0(), "rule__InvokeStatement__RetsAssignment_1_4_1_0_0");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_1_1(), "rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_1(), "rule__InvokeStatement__RetsAssignment_1_4_1_1_1");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_2_1(), "rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1");
+					put(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_2_0(), "rule__InvokeStatement__ExecRoutineAssignment_2_0");
+					put(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_2_1(), "rule__InvokeStatement__InvokableAssignment_2_1");
+					put(grammarAccess.getInvokeStatementAccess().getArgsAssignment_2_3(), "rule__InvokeStatement__ArgsAssignment_2_3");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_0(), "rule__InvokeStatement__RetsAssignment_2_5_1_0_0");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_1_1(), "rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_1(), "rule__InvokeStatement__RetsAssignment_2_5_1_1_1");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_2_1(), "rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1");
+					put(grammarAccess.getInvokeStatementAccess().getCallProcedureAssignment_3_0(), "rule__InvokeStatement__CallProcedureAssignment_3_0");
+					put(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_3_1(), "rule__InvokeStatement__InvokableAssignment_3_1");
+					put(grammarAccess.getInvokeStatementAccess().getArgsAssignment_3_2(), "rule__InvokeStatement__ArgsAssignment_3_2");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_0(), "rule__InvokeStatement__RetsAssignment_3_3_1_0_0");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_1_1(), "rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_1(), "rule__InvokeStatement__RetsAssignment_3_3_1_1_1");
+					put(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_2_1(), "rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1");
+					put(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideAssignment_0(), "rule__AssignmentExpression__LeftHandSideAssignment_0");
+					put(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignment_1(), "rule__AssignmentExpression__OperatorAssignment_1");
+					put(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideAssignment_2(), "rule__AssignmentExpression__RigthHandSideAssignment_2");
+					put(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_0(), "rule__LeftHandSideExpression__LvalueAssignment_1_0");
+					put(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_1_1(), "rule__LeftHandSideExpression__LvalueAssignment_1_1_1");
+					put(grammarAccess.getConditionalTestExpressionAccess().getOperatorAssignment_1_1(), "rule__ConditionalTestExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getConditionalTestExpressionAccess().getThenOperandAssignment_1_2(), "rule__ConditionalTestExpression__ThenOperandAssignment_1_2");
+					put(grammarAccess.getConditionalTestExpressionAccess().getElseOperandAssignment_1_4(), "rule__ConditionalTestExpression__ElseOperandAssignment_1_4");
+					put(grammarAccess.getLogicalOrExpressionAccess().getOperatorAssignment_1_1(), "rule__LogicalOrExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_2(), "rule__LogicalOrExpression__OperandAssignment_1_2");
+					put(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_3_1(), "rule__LogicalOrExpression__OperandAssignment_1_3_1");
+					put(grammarAccess.getLogicalAndExpressionAccess().getOperatorAssignment_1_1(), "rule__LogicalAndExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_2(), "rule__LogicalAndExpression__OperandAssignment_1_2");
+					put(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_3_1(), "rule__LogicalAndExpression__OperandAssignment_1_3_1");
+					put(grammarAccess.getBitwiseOrExpressionAccess().getOperatorAssignment_1_1(), "rule__BitwiseOrExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_2(), "rule__BitwiseOrExpression__OperandAssignment_1_2");
+					put(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_3_1(), "rule__BitwiseOrExpression__OperandAssignment_1_3_1");
+					put(grammarAccess.getBitwiseXorExpressionAccess().getOperatorAssignment_1_1(), "rule__BitwiseXorExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_2(), "rule__BitwiseXorExpression__OperandAssignment_1_2");
+					put(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_3_1(), "rule__BitwiseXorExpression__OperandAssignment_1_3_1");
+					put(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAssignment_1_1(), "rule__BitwiseAndExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_2(), "rule__BitwiseAndExpression__OperandAssignment_1_2");
+					put(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_3_1(), "rule__BitwiseAndExpression__OperandAssignment_1_3_1");
+					put(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1(), "rule__EqualityExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getEqualityExpressionAccess().getRigthOperandAssignment_1_2(), "rule__EqualityExpression__RigthOperandAssignment_1_2");
+					put(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1(), "rule__RelationalExpression__OperatorAssignment_1_1");
+					put(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_2(), "rule__RelationalExpression__RigthOperandAssignment_1_2");
+					put(grammarAccess.getRelationalExpressionAccess().getRigthOperatorAssignment_1_3_1(), "rule__RelationalExpression__RigthOperatorAssignment_1_3_1");
+					put(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_3_2(), "rule__RelationalExpression__RigthOperandAssignment_1_3_2");
+					put(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_0_1(), "rule__AdditiveExpression__OperatorAssignment_1_0_1");
+					put(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_2(), "rule__AdditiveExpression__OperandAssignment_1_0_2");
+					put(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_3_1(), "rule__AdditiveExpression__OperandAssignment_1_0_3_1");
+					put(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1_1(), "rule__AdditiveExpression__OperatorAssignment_1_1_1");
+					put(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_2(), "rule__AdditiveExpression__OperandAssignment_1_1_2");
+					put(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_3_1(), "rule__AdditiveExpression__OperandAssignment_1_1_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1(), "rule__MultiplicativeExpression__OperatorAssignment_1_0_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2(), "rule__MultiplicativeExpression__OperandAssignment_1_0_2");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1(), "rule__MultiplicativeExpression__OperandAssignment_1_0_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1(), "rule__MultiplicativeExpression__OperatorAssignment_1_1_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2(), "rule__MultiplicativeExpression__OperandAssignment_1_1_2");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1(), "rule__MultiplicativeExpression__OperandAssignment_1_1_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1(), "rule__MultiplicativeExpression__OperatorAssignment_1_2_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2(), "rule__MultiplicativeExpression__OperandAssignment_1_2_2");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1(), "rule__MultiplicativeExpression__OperandAssignment_1_2_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1(), "rule__MultiplicativeExpression__OperatorAssignment_1_3_1");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2(), "rule__MultiplicativeExpression__OperandAssignment_1_3_2");
+					put(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1(), "rule__MultiplicativeExpression__OperandAssignment_1_3_3_1");
+					put(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideAssignment_0(), "rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0");
+					put(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAssignment_1(), "rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1");
+					put(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAssignment_0(), "rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0");
+					put(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideAssignment_1(), "rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1");
+					put(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_0_1(), "rule__NewfreshExpression__LeftHandSideAssignment_0_1");
+					put(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_1_1(), "rule__NewfreshExpression__LeftHandSideAssignment_1_1");
+					put(grammarAccess.getCastExpressionAccess().getDatatypeAssignment_2(), "rule__CastExpression__DatatypeAssignment_2");
+					put(grammarAccess.getCastExpressionAccess().getOperandAssignment_5(), "rule__CastExpression__OperandAssignment_5");
+					put(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorAssignment_0(), "rule__ArithmeticUnaryExpression__OperatorAssignment_0");
+					put(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandAssignment_1(), "rule__ArithmeticUnaryExpression__OperandAssignment_1");
+					put(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAssignment_0(), "rule__LogicalUnaryExpression__OperatorAssignment_0");
+					put(grammarAccess.getLogicalUnaryExpressionAccess().getOperandAssignment_1(), "rule__LogicalUnaryExpression__OperandAssignment_1");
+					put(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorAssignment_0(), "rule__BitwiseUnaryExpression__OperatorAssignment_0");
+					put(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandAssignment_1(), "rule__BitwiseUnaryExpression__OperandAssignment_1");
+					put(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_1_2(), "rule__PrimaryExpression__ElementAssignment_1_2");
+					put(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_0_0(), "rule__PrimaryExpression__KindAssignment_1_3_0_0");
+					put(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_0_1(), "rule__PrimaryExpression__ArgAssignment_1_3_0_1");
+					put(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_1_0(), "rule__PrimaryExpression__KindAssignment_1_3_1_0");
+					put(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_1_1(), "rule__PrimaryExpression__ArgAssignment_1_3_1_1");
+					put(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_2(), "rule__PrimaryExpression__ElementAssignment_2_2");
+					put(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_0_0(), "rule__PrimaryExpression__KindAssignment_2_3_0_0");
+					put(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_0_1(), "rule__PrimaryExpression__ArgAssignment_2_3_0_1");
+					put(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_1_0(), "rule__PrimaryExpression__KindAssignment_2_3_1_0");
+					put(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_1_1(), "rule__PrimaryExpression__ArgAssignment_2_3_1_1");
+					put(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_4_2(), "rule__PrimaryExpression__ElementAssignment_2_4_2");
+					put(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_0_0(), "rule__PrimaryExpression__KindAssignment_2_4_3_0_0");
+					put(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_0_1(), "rule__PrimaryExpression__ArgAssignment_2_4_3_0_1");
+					put(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_1_0(), "rule__PrimaryExpression__KindAssignment_2_4_3_1_0");
+					put(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_1_1(), "rule__PrimaryExpression__ArgAssignment_2_4_3_1_1");
+					put(grammarAccess.getInvokeExpressionAccess().getInvokeAssignment_1(), "rule__InvokeExpression__InvokeAssignment_1");
+					put(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_2(), "rule__InvokeExpressionDeprecated__ArgsAssignment_2");
+					put(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeAssignment_3(), "rule__InvokeExpressionDeprecated__InvokeAssignment_3");
+					put(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_4(), "rule__InvokeExpressionDeprecated__ArgsAssignment_4");
+					put(grammarAccess.getInstantiationExpressionAccess().getInstanceAssignment_1(), "rule__InstantiationExpression__InstanceAssignment_1");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getModelAssignment_2(), "rule__DynamicInstanceSpecification__ModelAssignment_2");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_0(), "rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_1_1(), "rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1");
+					put(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_1_1_0(), "rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0");
+					put(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_1(), "rule__MixTupleExpressionList__ValueAssignment_1");
+					put(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_2_1(), "rule__MixTupleExpressionList__ValueAssignment_2_1");
+					put(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_0(), "rule__PositionalTupleExpressionList__ValueAssignment_0");
+					put(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_1_1(), "rule__PositionalTupleExpressionList__ValueAssignment_1_1");
+					put(grammarAccess.getNamedExpressionAccess().getNameAssignment_0(), "rule__NamedExpression__NameAssignment_0");
+					put(grammarAccess.getNamedExpressionAccess().getExpressionAssignment_2(), "rule__NamedExpression__ExpressionAssignment_2");
+					put(grammarAccess.getLiteralBooleanExpressionAccess().getValueAssignment_1(), "rule__LiteralBooleanExpression__ValueAssignment_1");
+					put(grammarAccess.getLiteralIntegerExpressionAccess().getValueAssignment_1(), "rule__LiteralIntegerExpression__ValueAssignment_1");
+					put(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorAssignment_1(), "rule__LiteralRationalExpression__NumeratorAssignment_1");
+					put(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorAssignment_3(), "rule__LiteralRationalExpression__DenominatorAssignment_3");
+					put(grammarAccess.getLiteralFloatExpressionAccess().getValueAssignment_1(), "rule__LiteralFloatExpression__ValueAssignment_1");
+					put(grammarAccess.getLiteralCharacterExpressionAccess().getValueAssignment_1(), "rule__LiteralCharacterExpression__ValueAssignment_1");
+					put(grammarAccess.getLiteralStringExpressionAccess().getValueAssignment_1(), "rule__LiteralStringExpression__ValueAssignment_1");
+					put(grammarAccess.getLiteralNullExpressionAccess().getTypeAssignment_1_2(), "rule__LiteralNullExpression__TypeAssignment_1_2");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeAssignment_1_1(), "rule__LiteralCollectionExpression__DatatypeAssignment_1_1");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_0(), "rule__LiteralCollectionExpression__ValueAssignment_3_0_0");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_1(), "rule__LiteralCollectionExpression__ValueAssignment_3_0_1");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_0(), "rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0");
+					put(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_1(), "rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1");
+					put(grammarAccess.getLiteralReferenceElementAccess().getValueAssignment_1(), "rule__LiteralReferenceElement__ValueAssignment_1");
+					put(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_0_0(), "rule__LiteralReferenceElement__KindAssignment_2_0_0");
+					put(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_0_1(), "rule__LiteralReferenceElement__ArgAssignment_2_0_1");
+					put(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_1_0(), "rule__LiteralReferenceElement__KindAssignment_2_1_0");
+					put(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_1_1(), "rule__LiteralReferenceElement__ArgAssignment_2_1_1");
+					put(grammarAccess.getLiteralPureReferenceElementAccess().getValueAssignment_1(), "rule__LiteralPureReferenceElement__ValueAssignment_1");
+					put(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_1_2(), "rule__ValueSelectionExpression__ElementAssignment_1_2");
+					put(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_1_3_0(), "rule__ValueSelectionExpression__KindAssignment_1_3_0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_1_3_1(), "rule__ValueSelectionExpression__ArgAssignment_1_3_1");
+					put(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_2(), "rule__ValueSelectionExpression__ElementAssignment_2_2");
+					put(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_3_0(), "rule__ValueSelectionExpression__KindAssignment_2_3_0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_3_1(), "rule__ValueSelectionExpression__ArgAssignment_2_3_1");
+					put(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_4_2(), "rule__ValueSelectionExpression__ElementAssignment_2_4_2");
+					put(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_4_3_0(), "rule__ValueSelectionExpression__KindAssignment_2_4_3_0");
+					put(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_4_3_1(), "rule__ValueSelectionExpression__ArgAssignment_2_4_3_1");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_1_1(), "rule__ValuePureNamedMachineExpression__KindAssignment_1_1");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_1_2(), "rule__ValuePureNamedMachineExpression__ElementAssignment_1_2");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_1(), "rule__ValuePureNamedMachineExpression__KindAssignment_2_1");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_2(), "rule__ValuePureNamedMachineExpression__ElementAssignment_2_2");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_3_1(), "rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1");
+					put(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_3_2(), "rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2");
+					put(grammarAccess.getSystemAccess().getUnorderedGroup_0(), "rule__System__UnorderedGroup_0");
+					put(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), "rule__MachineBlock__UnorderedGroup_0");
+					put(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), "rule__ProcedureExecution__UnorderedGroup_2");
+					put(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), "rule__MoeBehavior__UnorderedGroup_2");
+					put(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), "rule__Statemachine__UnorderedGroup_1");
+					put(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), "rule__Statemachine__UnorderedGroup_12");
+					put(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), "rule__ModelOfExecution__UnorderedGroup_3");
+					put(grammarAccess.getModifierAccess().getUnorderedGroup_1(), "rule__Modifier__UnorderedGroup_1");
+					put(grammarAccess.getVariableAccess().getUnorderedGroup_0(), "rule__Variable__UnorderedGroup_0");
+					put(grammarAccess.getVariableImplAccess().getUnorderedGroup_0(), "rule__VariableImpl__UnorderedGroup_0");
+					put(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), "rule__VariablePublic__UnorderedGroup_1");
+					put(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), "rule__VariableProtected__UnorderedGroup_1");
+					put(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), "rule__VariablePrivate__UnorderedGroup_1");
+					put(grammarAccess.getBufferAccess().getUnorderedGroup_0(), "rule__Buffer__UnorderedGroup_0");
+					put(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), "rule__InputComStatement__UnorderedGroup_3");
+					put(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), "rule__OutputComStatement__UnorderedGroup_3");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		try {
+			InternalFormalMLParser typedParser = (InternalFormalMLParser) parser;
+			typedParser.entryRuleXlia();
+			return typedParser.getFollowElements();
+		} catch(RecognitionException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
+
+	@Override
+	protected String[] getInitialHiddenTokens() {
+		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
+	}
+
+	public FormalMLGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(FormalMLGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/PartialFormalMLContentAssistParser.java b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/PartialFormalMLContentAssistParser.java
new file mode 100644
index 0000000..122ba04
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/PartialFormalMLContentAssistParser.java
@@ -0,0 +1,43 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ide.contentassist.antlr;
+
+import java.util.Collection;
+import java.util.Collections;
+import org.eclipse.xtext.AbstractRule;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.util.PolymorphicDispatcher;
+
+public class PartialFormalMLContentAssistParser extends FormalMLParser implements IPartialEditingContentAssistParser {
+
+	private AbstractRule rule;
+
+	@Override
+	public void initializeFor(AbstractRule rule) {
+		this.rule = rule;
+	}
+
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		if (rule == null || rule.eIsProxy())
+			return Collections.emptyList();
+		String methodName = "entryRule" + rule.getName();
+		PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
+			new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
+		dispatcher.invoke();
+		return parser.getFollowElements();
+	}
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalML.g b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalML.g
new file mode 100644
index 0000000..ded8735
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalML.g
@@ -0,0 +1,75309 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+grammar InternalFormalML;
+
+options {
+	superClass=AbstractInternalContentAssistParser;
+	backtrack=true;
+}
+
+@lexer::header {
+package org.eclipse.efm.formalml.xtext.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+}
+
+@parser::header {
+package org.eclipse.efm.formalml.xtext.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;
+
+}
+@parser::members {
+	private FormalMLGrammarAccess grammarAccess;
+
+	public void setGrammarAccess(FormalMLGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+
+	@Override
+	protected Grammar getGrammar() {
+		return grammarAccess.getGrammar();
+	}
+
+	@Override
+	protected String getValueForTokenName(String tokenName) {
+		return tokenName;
+	}
+}
+
+// Entry rule entryRuleXlia
+entryRuleXlia
+:
+{ before(grammarAccess.getXliaRule()); }
+	 ruleXlia
+{ after(grammarAccess.getXliaRule()); } 
+	 EOF 
+;
+
+// Rule Xlia
+ruleXlia 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXliaAccess().getGroup()); }
+		(rule__Xlia__Group__0)
+		{ after(grammarAccess.getXliaAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXliaPrologObject
+entryRuleXliaPrologObject
+:
+{ before(grammarAccess.getXliaPrologObjectRule()); }
+	 ruleXliaPrologObject
+{ after(grammarAccess.getXliaPrologObjectRule()); } 
+	 EOF 
+;
+
+// Rule XliaPrologObject
+ruleXliaPrologObject 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXliaPrologObjectAccess().getGroup()); }
+		(rule__XliaPrologObject__Group__0)
+		{ after(grammarAccess.getXliaPrologObjectAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXliaPrologAttribute
+entryRuleXliaPrologAttribute
+:
+{ before(grammarAccess.getXliaPrologAttributeRule()); }
+	 ruleXliaPrologAttribute
+{ after(grammarAccess.getXliaPrologAttributeRule()); } 
+	 EOF 
+;
+
+// Rule XliaPrologAttribute
+ruleXliaPrologAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXliaPrologAttributeAccess().getGroup()); }
+		(rule__XliaPrologAttribute__Group__0)
+		{ after(grammarAccess.getXliaPrologAttributeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXliaOptionObject
+entryRuleXliaOptionObject
+:
+{ before(grammarAccess.getXliaOptionObjectRule()); }
+	 ruleXliaOptionObject
+{ after(grammarAccess.getXliaOptionObjectRule()); } 
+	 EOF 
+;
+
+// Rule XliaOptionObject
+ruleXliaOptionObject 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXliaOptionObjectAccess().getGroup()); }
+		(rule__XliaOptionObject__Group__0)
+		{ after(grammarAccess.getXliaOptionObjectAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXliaNamedElement
+entryRuleXliaNamedElement
+:
+{ before(grammarAccess.getXliaNamedElementRule()); }
+	 ruleXliaNamedElement
+{ after(grammarAccess.getXliaNamedElementRule()); } 
+	 EOF 
+;
+
+// Rule XliaNamedElement
+ruleXliaNamedElement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXliaNamedElementAccess().getAlternatives()); }
+		(rule__XliaNamedElement__Alternatives)
+		{ after(grammarAccess.getXliaNamedElementAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXliaObject
+entryRuleXliaObject
+:
+{ before(grammarAccess.getXliaObjectRule()); }
+	 ruleXliaObject
+{ after(grammarAccess.getXliaObjectRule()); } 
+	 EOF 
+;
+
+// Rule XliaObject
+ruleXliaObject 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXliaObjectAccess().getGroup()); }
+		(rule__XliaObject__Group__0)
+		{ after(grammarAccess.getXliaObjectAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleXliaAttribute
+entryRuleXliaAttribute
+:
+{ before(grammarAccess.getXliaAttributeRule()); }
+	 ruleXliaAttribute
+{ after(grammarAccess.getXliaAttributeRule()); } 
+	 EOF 
+;
+
+// Rule XliaAttribute
+ruleXliaAttribute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getXliaAttributeAccess().getGroup()); }
+		(rule__XliaAttribute__Group__0)
+		{ after(grammarAccess.getXliaAttributeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEBoolean
+entryRuleEBoolean
+:
+{ before(grammarAccess.getEBooleanRule()); }
+	 ruleEBoolean
+{ after(grammarAccess.getEBooleanRule()); } 
+	 EOF 
+;
+
+// Rule EBoolean
+ruleEBoolean 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEBooleanAccess().getAlternatives()); }
+		(rule__EBoolean__Alternatives)
+		{ after(grammarAccess.getEBooleanAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEInt
+entryRuleEInt
+:
+{ before(grammarAccess.getEIntRule()); }
+	 ruleEInt
+{ after(grammarAccess.getEIntRule()); } 
+	 EOF 
+;
+
+// Rule EInt
+ruleEInt 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEIntAccess().getGroup()); }
+		(rule__EInt__Group__0)
+		{ after(grammarAccess.getEIntAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEInteger
+entryRuleEInteger
+:
+{ before(grammarAccess.getEIntegerRule()); }
+	 ruleEInteger
+{ after(grammarAccess.getEIntegerRule()); } 
+	 EOF 
+;
+
+// Rule EInteger
+ruleEInteger 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEIntegerAccess().getGroup()); }
+		(rule__EInteger__Group__0)
+		{ after(grammarAccess.getEIntegerAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEDouble
+entryRuleEDouble
+:
+{ before(grammarAccess.getEDoubleRule()); }
+	 ruleEDouble
+{ after(grammarAccess.getEDoubleRule()); } 
+	 EOF 
+;
+
+// Rule EDouble
+ruleEDouble 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEDoubleAccess().getGroup()); }
+		(rule__EDouble__Group__0)
+		{ after(grammarAccess.getEDoubleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleECharacter
+entryRuleECharacter
+:
+{ before(grammarAccess.getECharacterRule()); }
+	 ruleECharacter
+{ after(grammarAccess.getECharacterRule()); } 
+	 EOF 
+;
+
+// Rule ECharacter
+ruleECharacter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getECharacterAccess().getCHARACTERTerminalRuleCall()); }
+		RULE_CHARACTER
+		{ after(grammarAccess.getECharacterAccess().getCHARACTERTerminalRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEString
+entryRuleEString
+:
+{ before(grammarAccess.getEStringRule()); }
+	 ruleEString
+{ after(grammarAccess.getEStringRule()); } 
+	 EOF 
+;
+
+// Rule EString
+ruleEString 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall()); }
+		RULE_STRING
+		{ after(grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleESIdentifier
+entryRuleESIdentifier
+:
+{ before(grammarAccess.getESIdentifierRule()); }
+	 ruleESIdentifier
+{ after(grammarAccess.getESIdentifierRule()); } 
+	 EOF 
+;
+
+// Rule ESIdentifier
+ruleESIdentifier 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getESIdentifierAccess().getXLIA_IDTerminalRuleCall()); }
+		RULE_XLIA_ID
+		{ after(grammarAccess.getESIdentifierAccess().getXLIA_IDTerminalRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleESUfid
+entryRuleESUfid
+:
+{ before(grammarAccess.getESUfidRule()); }
+	 ruleESUfid
+{ after(grammarAccess.getESUfidRule()); } 
+	 EOF 
+;
+
+// Rule ESUfid
+ruleESUfid 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getESUfidAccess().getGroup()); }
+		(rule__ESUfid__Group__0)
+		{ after(grammarAccess.getESUfidAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleUnrestrictedName
+entryRuleUnrestrictedName
+:
+{ before(grammarAccess.getUnrestrictedNameRule()); }
+	 ruleUnrestrictedName
+{ after(grammarAccess.getUnrestrictedNameRule()); } 
+	 EOF 
+;
+
+// Rule UnrestrictedName
+ruleUnrestrictedName 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getUnrestrictedNameAccess().getSTRINGTerminalRuleCall()); }
+		RULE_STRING
+		{ after(grammarAccess.getUnrestrictedNameAccess().getSTRINGTerminalRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleUnqualifiedName
+entryRuleUnqualifiedName
+:
+{ before(grammarAccess.getUnqualifiedNameRule()); }
+	 ruleUnqualifiedName
+{ after(grammarAccess.getUnqualifiedNameRule()); } 
+	 EOF 
+;
+
+// Rule UnqualifiedName
+ruleUnqualifiedName 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getUnqualifiedNameAccess().getNameBindingAssignment()); }
+		(rule__UnqualifiedName__NameBindingAssignment)
+		{ after(grammarAccess.getUnqualifiedNameAccess().getNameBindingAssignment()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleNameBinding
+entryRuleNameBinding
+:
+{ before(grammarAccess.getNameBindingRule()); }
+	 ruleNameBinding
+{ after(grammarAccess.getNameBindingRule()); } 
+	 EOF 
+;
+
+// Rule NameBinding
+ruleNameBinding 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getNameBindingAccess().getXLIA_IDTerminalRuleCall()); }
+		RULE_XLIA_ID
+		{ after(grammarAccess.getNameBindingAccess().getXLIA_IDTerminalRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSystem
+entryRuleSystem
+:
+{ before(grammarAccess.getSystemRule()); }
+	 ruleSystem
+{ after(grammarAccess.getSystemRule()); } 
+	 EOF 
+;
+
+// Rule System
+ruleSystem 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup()); }
+		(rule__System__Group__0)
+		{ after(grammarAccess.getSystemAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleAnyMachineBlock
+entryRuleAnyMachineBlock
+:
+{ before(grammarAccess.getAnyMachineBlockRule()); }
+	 ruleAnyMachineBlock
+{ after(grammarAccess.getAnyMachineBlockRule()); } 
+	 EOF 
+;
+
+// Rule AnyMachineBlock
+ruleAnyMachineBlock 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getAnyMachineBlockAccess().getAlternatives()); }
+		(rule__AnyMachineBlock__Alternatives)
+		{ after(grammarAccess.getAnyMachineBlockAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleInstanceMachine
+entryRuleInstanceMachine
+:
+{ before(grammarAccess.getInstanceMachineRule()); }
+	 ruleInstanceMachine
+{ after(grammarAccess.getInstanceMachineRule()); } 
+	 EOF 
+;
+
+// Rule InstanceMachine
+ruleInstanceMachine 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getGroup()); }
+		(rule__InstanceMachine__Group__0)
+		{ after(grammarAccess.getInstanceMachineAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSlotParameter
+entryRuleSlotParameter
+:
+{ before(grammarAccess.getSlotParameterRule()); }
+	 ruleSlotParameter
+{ after(grammarAccess.getSlotParameterRule()); } 
+	 EOF 
+;
+
+// Rule SlotParameter
+ruleSlotParameter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSlotParameterAccess().getGroup()); }
+		(rule__SlotParameter__Group__0)
+		{ after(grammarAccess.getSlotParameterAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSlotProperty
+entryRuleSlotProperty
+:
+{ before(grammarAccess.getSlotPropertyRule()); }
+	 ruleSlotProperty
+{ after(grammarAccess.getSlotPropertyRule()); } 
+	 EOF 
+;
+
+// Rule SlotProperty
+ruleSlotProperty 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSlotPropertyAccess().getGroup()); }
+		(rule__SlotProperty__Group__0)
+		{ after(grammarAccess.getSlotPropertyAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleMachineBlock
+entryRuleMachineBlock
+:
+{ before(grammarAccess.getMachineBlockRule()); }
+	 ruleMachineBlock
+{ after(grammarAccess.getMachineBlockRule()); } 
+	 EOF 
+;
+
+// Rule MachineBlock
+ruleMachineBlock 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup()); }
+		(rule__MachineBlock__Group__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleProcedure
+entryRuleProcedure
+:
+{ before(grammarAccess.getProcedureRule()); }
+	 ruleProcedure
+{ after(grammarAccess.getProcedureRule()); } 
+	 EOF 
+;
+
+// Rule Procedure
+ruleProcedure 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup()); }
+		(rule__Procedure__Group__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleProcedureExecution
+entryRuleProcedureExecution
+:
+{ before(grammarAccess.getProcedureExecutionRule()); }
+	 ruleProcedureExecution
+{ after(grammarAccess.getProcedureExecutionRule()); } 
+	 EOF 
+;
+
+// Rule ProcedureExecution
+ruleProcedureExecution 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getProcedureExecutionAccess().getGroup()); }
+		(rule__ProcedureExecution__Group__0)
+		{ after(grammarAccess.getProcedureExecutionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBehavior
+entryRuleBehavior
+:
+{ before(grammarAccess.getBehaviorRule()); }
+	 ruleBehavior
+{ after(grammarAccess.getBehaviorRule()); } 
+	 EOF 
+;
+
+// Rule Behavior
+ruleBehavior 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBehaviorAccess().getStatemachineParserRuleCall()); }
+		ruleStatemachine
+		{ after(grammarAccess.getBehaviorAccess().getStatemachineParserRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleMoeBehavior
+entryRuleMoeBehavior
+:
+{ before(grammarAccess.getMoeBehaviorRule()); }
+	 ruleMoeBehavior
+{ after(grammarAccess.getMoeBehaviorRule()); } 
+	 EOF 
+;
+
+// Rule MoeBehavior
+ruleMoeBehavior 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getGroup()); }
+		(rule__MoeBehavior__Group__0)
+		{ after(grammarAccess.getMoeBehaviorAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStatemachine
+entryRuleStatemachine
+:
+{ before(grammarAccess.getStatemachineRule()); }
+	 ruleStatemachine
+{ after(grammarAccess.getStatemachineRule()); } 
+	 EOF 
+;
+
+// Rule Statemachine
+ruleStatemachine 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup()); }
+		(rule__Statemachine__Group__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStatemachineRegion
+entryRuleStatemachineRegion
+:
+{ before(grammarAccess.getStatemachineRegionRule()); }
+	 ruleStatemachineRegion
+{ after(grammarAccess.getStatemachineRegionRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineRegion
+ruleStatemachineRegion 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getGroup()); }
+		(rule__StatemachineRegion__Group__0)
+		{ after(grammarAccess.getStatemachineRegionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStatemachineRegionLite
+entryRuleStatemachineRegionLite
+:
+{ before(grammarAccess.getStatemachineRegionLiteRule()); }
+	 ruleStatemachineRegionLite
+{ after(grammarAccess.getStatemachineRegionLiteRule()); } 
+	 EOF 
+;
+
+// Rule StatemachineRegionLite
+ruleStatemachineRegionLite 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		(
+			{ before(grammarAccess.getStatemachineRegionLiteAccess().getAlternatives()); }
+			(rule__StatemachineRegionLite__Alternatives)
+			{ after(grammarAccess.getStatemachineRegionLiteAccess().getAlternatives()); }
+		)
+		(
+			{ before(grammarAccess.getStatemachineRegionLiteAccess().getAlternatives()); }
+			(rule__StatemachineRegionLite__Alternatives)*
+			{ after(grammarAccess.getStatemachineRegionLiteAccess().getAlternatives()); }
+		)
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleState
+entryRuleState
+:
+{ before(grammarAccess.getStateRule()); }
+	 ruleState
+{ after(grammarAccess.getStateRule()); } 
+	 EOF 
+;
+
+// Rule State
+ruleState 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStateAccess().getAlternatives()); }
+		(rule__State__Alternatives)
+		{ after(grammarAccess.getStateAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleCompositeState
+entryRuleCompositeState
+:
+{ before(grammarAccess.getCompositeStateRule()); }
+	 ruleCompositeState
+{ after(grammarAccess.getCompositeStateRule()); } 
+	 EOF 
+;
+
+// Rule CompositeState
+ruleCompositeState 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getGroup()); }
+		(rule__CompositeState__Group__0)
+		{ after(grammarAccess.getCompositeStateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulemoeCompositeStateRoutines
+entryRulemoeCompositeStateRoutines
+:
+{ before(grammarAccess.getMoeCompositeStateRoutinesRule()); }
+	 rulemoeCompositeStateRoutines
+{ after(grammarAccess.getMoeCompositeStateRoutinesRule()); } 
+	 EOF 
+;
+
+// Rule moeCompositeStateRoutines
+rulemoeCompositeStateRoutines 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getGroup()); }
+		(rule__MoeCompositeStateRoutines__Group__0)
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSimpleState
+entryRuleSimpleState
+:
+{ before(grammarAccess.getSimpleStateRule()); }
+	 ruleSimpleState
+{ after(grammarAccess.getSimpleStateRule()); } 
+	 EOF 
+;
+
+// Rule SimpleState
+ruleSimpleState 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getGroup()); }
+		(rule__SimpleState__Group__0)
+		{ after(grammarAccess.getSimpleStateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulemoeSimpleStateRoutines
+entryRulemoeSimpleStateRoutines
+:
+{ before(grammarAccess.getMoeSimpleStateRoutinesRule()); }
+	 rulemoeSimpleStateRoutines
+{ after(grammarAccess.getMoeSimpleStateRoutinesRule()); } 
+	 EOF 
+;
+
+// Rule moeSimpleStateRoutines
+rulemoeSimpleStateRoutines 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMoeSimpleStateRoutinesAccess().getGroup()); }
+		(rule__MoeSimpleStateRoutines__Group__0)
+		{ after(grammarAccess.getMoeSimpleStateRoutinesAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStartState
+entryRuleStartState
+:
+{ before(grammarAccess.getStartStateRule()); }
+	 ruleStartState
+{ after(grammarAccess.getStartStateRule()); } 
+	 EOF 
+;
+
+// Rule StartState
+ruleStartState 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStartStateAccess().getGroup()); }
+		(rule__StartState__Group__0)
+		{ after(grammarAccess.getStartStateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulemoeStartStateRoutines
+entryRulemoeStartStateRoutines
+:
+{ before(grammarAccess.getMoeStartStateRoutinesRule()); }
+	 rulemoeStartStateRoutines
+{ after(grammarAccess.getMoeStartStateRoutinesRule()); } 
+	 EOF 
+;
+
+// Rule moeStartStateRoutines
+rulemoeStartStateRoutines 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMoeStartStateRoutinesAccess().getGroup()); }
+		(rule__MoeStartStateRoutines__Group__0)
+		{ after(grammarAccess.getMoeStartStateRoutinesAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleFinalState
+entryRuleFinalState
+:
+{ before(grammarAccess.getFinalStateRule()); }
+	 ruleFinalState
+{ after(grammarAccess.getFinalStateRule()); } 
+	 EOF 
+;
+
+// Rule FinalState
+ruleFinalState 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getFinalStateAccess().getGroup()); }
+		(rule__FinalState__Group__0)
+		{ after(grammarAccess.getFinalStateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulemoeFinalStateRoutines
+entryRulemoeFinalStateRoutines
+:
+{ before(grammarAccess.getMoeFinalStateRoutinesRule()); }
+	 rulemoeFinalStateRoutines
+{ after(grammarAccess.getMoeFinalStateRoutinesRule()); } 
+	 EOF 
+;
+
+// Rule moeFinalStateRoutines
+rulemoeFinalStateRoutines 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMoeFinalStateRoutinesAccess().getGroup()); }
+		(rule__MoeFinalStateRoutines__Group__0)
+		{ after(grammarAccess.getMoeFinalStateRoutinesAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePseudostate
+entryRulePseudostate
+:
+{ before(grammarAccess.getPseudostateRule()); }
+	 rulePseudostate
+{ after(grammarAccess.getPseudostateRule()); } 
+	 EOF 
+;
+
+// Rule Pseudostate
+rulePseudostate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPseudostateAccess().getAlternatives()); }
+		(rule__Pseudostate__Alternatives)
+		{ after(grammarAccess.getPseudostateAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOtherPseudostate
+entryRuleOtherPseudostate
+:
+{ before(grammarAccess.getOtherPseudostateRule()); }
+	 ruleOtherPseudostate
+{ after(grammarAccess.getOtherPseudostateRule()); } 
+	 EOF 
+;
+
+// Rule OtherPseudostate
+ruleOtherPseudostate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOtherPseudostateAccess().getGroup()); }
+		(rule__OtherPseudostate__Group__0)
+		{ after(grammarAccess.getOtherPseudostateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePseudostateInitial
+entryRulePseudostateInitial
+:
+{ before(grammarAccess.getPseudostateInitialRule()); }
+	 rulePseudostateInitial
+{ after(grammarAccess.getPseudostateInitialRule()); } 
+	 EOF 
+;
+
+// Rule PseudostateInitial
+rulePseudostateInitial 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getGroup()); }
+		(rule__PseudostateInitial__Group__0)
+		{ after(grammarAccess.getPseudostateInitialAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEndingPseudostate
+entryRuleEndingPseudostate
+:
+{ before(grammarAccess.getEndingPseudostateRule()); }
+	 ruleEndingPseudostate
+{ after(grammarAccess.getEndingPseudostateRule()); } 
+	 EOF 
+;
+
+// Rule EndingPseudostate
+ruleEndingPseudostate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEndingPseudostateAccess().getGroup()); }
+		(rule__EndingPseudostate__Group__0)
+		{ after(grammarAccess.getEndingPseudostateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleModelOfExecution
+entryRuleModelOfExecution
+:
+{ before(grammarAccess.getModelOfExecutionRule()); }
+	 ruleModelOfExecution
+{ after(grammarAccess.getModelOfExecutionRule()); } 
+	 EOF 
+;
+
+// Rule ModelOfExecution
+ruleModelOfExecution 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getGroup()); }
+		(rule__ModelOfExecution__Group__0)
+		{ after(grammarAccess.getModelOfExecutionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulemoeRoutine
+entryRulemoeRoutine
+:
+{ before(grammarAccess.getMoeRoutineRule()); }
+	 rulemoeRoutine
+{ after(grammarAccess.getMoeRoutineRule()); } 
+	 EOF 
+;
+
+// Rule moeRoutine
+rulemoeRoutine 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMoeRoutineAccess().getGroup()); }
+		(rule__MoeRoutine__Group__0)
+		{ after(grammarAccess.getMoeRoutineAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleRoutine
+entryRuleRoutine
+:
+{ before(grammarAccess.getRoutineRule()); }
+	 ruleRoutine
+{ after(grammarAccess.getRoutineRule()); } 
+	 EOF 
+;
+
+// Rule Routine
+ruleRoutine 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getRoutineAccess().getGroup()); }
+		(rule__Routine__Group__0)
+		{ after(grammarAccess.getRoutineAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleModelOfInteraction
+entryRuleModelOfInteraction
+:
+{ before(grammarAccess.getModelOfInteractionRule()); }
+	 ruleModelOfInteraction
+{ after(grammarAccess.getModelOfInteractionRule()); } 
+	 EOF 
+;
+
+// Rule ModelOfInteraction
+ruleModelOfInteraction 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getModelOfInteractionAccess().getGroup()); }
+		(rule__ModelOfInteraction__Group__0)
+		{ after(grammarAccess.getModelOfInteractionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleRoute
+entryRuleRoute
+:
+{ before(grammarAccess.getRouteRule()); }
+	 ruleRoute
+{ after(grammarAccess.getRouteRule()); } 
+	 EOF 
+;
+
+// Rule Route
+ruleRoute 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getRouteAccess().getGroup()); }
+		(rule__Route__Group__0)
+		{ after(grammarAccess.getRouteAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleComRouteProtocol
+entryRuleComRouteProtocol
+:
+{ before(grammarAccess.getComRouteProtocolRule()); }
+	 ruleComRouteProtocol
+{ after(grammarAccess.getComRouteProtocolRule()); } 
+	 EOF 
+;
+
+// Rule ComRouteProtocol
+ruleComRouteProtocol 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getAlternatives()); }
+		(rule__ComRouteProtocol__Alternatives)
+		{ after(grammarAccess.getComRouteProtocolAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleConnection
+entryRuleConnection
+:
+{ before(grammarAccess.getConnectionRule()); }
+	 ruleConnection
+{ after(grammarAccess.getConnectionRule()); } 
+	 EOF 
+;
+
+// Rule Connection
+ruleConnection 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getConnectionAccess().getGroup()); }
+		(rule__Connection__Group__0)
+		{ after(grammarAccess.getConnectionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleComProtocol
+entryRuleComProtocol
+:
+{ before(grammarAccess.getComProtocolRule()); }
+	 ruleComProtocol
+{ after(grammarAccess.getComProtocolRule()); } 
+	 EOF 
+;
+
+// Rule ComProtocol
+ruleComProtocol 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getAlternatives()); }
+		(rule__ComProtocol__Alternatives)
+		{ after(grammarAccess.getComProtocolAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleComPoint
+entryRuleComPoint
+:
+{ before(grammarAccess.getComPointRule()); }
+	 ruleComPoint
+{ after(grammarAccess.getComPointRule()); } 
+	 EOF 
+;
+
+// Rule ComPoint
+ruleComPoint 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getComPointAccess().getGroup()); }
+		(rule__ComPoint__Group__0)
+		{ after(grammarAccess.getComPointAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleComPointProtocol
+entryRuleComPointProtocol
+:
+{ before(grammarAccess.getComPointProtocolRule()); }
+	 ruleComPointProtocol
+{ after(grammarAccess.getComPointProtocolRule()); } 
+	 EOF 
+;
+
+// Rule ComPointProtocol
+ruleComPointProtocol 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getAlternatives()); }
+		(rule__ComPointProtocol__Alternatives)
+		{ after(grammarAccess.getComPointProtocolAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleComElement
+entryRuleComElement
+:
+{ before(grammarAccess.getComElementRule()); }
+	 ruleComElement
+{ after(grammarAccess.getComElementRule()); } 
+	 EOF 
+;
+
+// Rule ComElement
+ruleComElement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getComElementAccess().getAlternatives()); }
+		(rule__ComElement__Alternatives)
+		{ after(grammarAccess.getComElementAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTypeDefinition
+entryRuleTypeDefinition
+:
+{ before(grammarAccess.getTypeDefinitionRule()); }
+	 ruleTypeDefinition
+{ after(grammarAccess.getTypeDefinitionRule()); } 
+	 EOF 
+;
+
+// Rule TypeDefinition
+ruleTypeDefinition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTypeDefinitionAccess().getAlternatives()); }
+		(rule__TypeDefinition__Alternatives)
+		{ after(grammarAccess.getTypeDefinitionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDataTypeMultiplicity
+entryRuleDataTypeMultiplicity
+:
+{ before(grammarAccess.getDataTypeMultiplicityRule()); }
+	 ruleDataTypeMultiplicity
+{ after(grammarAccess.getDataTypeMultiplicityRule()); } 
+	 EOF 
+;
+
+// Rule DataTypeMultiplicity
+ruleDataTypeMultiplicity 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDataTypeMultiplicityAccess().getAlternatives()); }
+		(rule__DataTypeMultiplicity__Alternatives)
+		{ after(grammarAccess.getDataTypeMultiplicityAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDataTypeReference
+entryRuleDataTypeReference
+:
+{ before(grammarAccess.getDataTypeReferenceRule()); }
+	 ruleDataTypeReference
+{ after(grammarAccess.getDataTypeReferenceRule()); } 
+	 EOF 
+;
+
+// Rule DataTypeReference
+ruleDataTypeReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDataTypeReferenceAccess().getAlternatives()); }
+		(rule__DataTypeReference__Alternatives)
+		{ after(grammarAccess.getDataTypeReferenceAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOtherDataTypeDefinition
+entryRuleOtherDataTypeDefinition
+:
+{ before(grammarAccess.getOtherDataTypeDefinitionRule()); }
+	 ruleOtherDataTypeDefinition
+{ after(grammarAccess.getOtherDataTypeDefinitionRule()); } 
+	 EOF 
+;
+
+// Rule OtherDataTypeDefinition
+ruleOtherDataTypeDefinition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup()); }
+		(rule__OtherDataTypeDefinition__Group__0)
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOtherDataTypeDefinitionImpl
+entryRuleOtherDataTypeDefinitionImpl
+:
+{ before(grammarAccess.getOtherDataTypeDefinitionImplRule()); }
+	 ruleOtherDataTypeDefinitionImpl
+{ after(grammarAccess.getOtherDataTypeDefinitionImplRule()); } 
+	 EOF 
+;
+
+// Rule OtherDataTypeDefinitionImpl
+ruleOtherDataTypeDefinitionImpl 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup()); }
+		(rule__OtherDataTypeDefinitionImpl__Group__0)
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDataType
+entryRuleDataType
+:
+{ before(grammarAccess.getDataTypeRule()); }
+	 ruleDataType
+{ after(grammarAccess.getDataTypeRule()); } 
+	 EOF 
+;
+
+// Rule DataType
+ruleDataType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDataTypeAccess().getAlternatives()); }
+		(rule__DataType__Alternatives)
+		{ after(grammarAccess.getDataTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSimpleDataType
+entryRuleSimpleDataType
+:
+{ before(grammarAccess.getSimpleDataTypeRule()); }
+	 ruleSimpleDataType
+{ after(grammarAccess.getSimpleDataTypeRule()); } 
+	 EOF 
+;
+
+// Rule SimpleDataType
+ruleSimpleDataType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSimpleDataTypeAccess().getAlternatives()); }
+		(rule__SimpleDataType__Alternatives)
+		{ after(grammarAccess.getSimpleDataTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStructuredDataType
+entryRuleStructuredDataType
+:
+{ before(grammarAccess.getStructuredDataTypeRule()); }
+	 ruleStructuredDataType
+{ after(grammarAccess.getStructuredDataTypeRule()); } 
+	 EOF 
+;
+
+// Rule StructuredDataType
+ruleStructuredDataType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStructuredDataTypeAccess().getAlternatives()); }
+		(rule__StructuredDataType__Alternatives)
+		{ after(grammarAccess.getStructuredDataTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveType
+entryRulePrimitiveType
+:
+{ before(grammarAccess.getPrimitiveTypeRule()); }
+	 rulePrimitiveType
+{ after(grammarAccess.getPrimitiveTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveType
+rulePrimitiveType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveTypeAccess().getAlternatives()); }
+		(rule__PrimitiveType__Alternatives)
+		{ after(grammarAccess.getPrimitiveTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveNumberType
+entryRulePrimitiveNumberType
+:
+{ before(grammarAccess.getPrimitiveNumberTypeRule()); }
+	 rulePrimitiveNumberType
+{ after(grammarAccess.getPrimitiveNumberTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveNumberType
+rulePrimitiveNumberType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveNumberTypeAccess().getAlternatives()); }
+		(rule__PrimitiveNumberType__Alternatives)
+		{ after(grammarAccess.getPrimitiveNumberTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveIntegerType
+entryRulePrimitiveIntegerType
+:
+{ before(grammarAccess.getPrimitiveIntegerTypeRule()); }
+	 rulePrimitiveIntegerType
+{ after(grammarAccess.getPrimitiveIntegerTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveIntegerType
+rulePrimitiveIntegerType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup()); }
+		(rule__PrimitiveIntegerType__Group__0)
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveRationalType
+entryRulePrimitiveRationalType
+:
+{ before(grammarAccess.getPrimitiveRationalTypeRule()); }
+	 rulePrimitiveRationalType
+{ after(grammarAccess.getPrimitiveRationalTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveRationalType
+rulePrimitiveRationalType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getGroup()); }
+		(rule__PrimitiveRationalType__Group__0)
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveFloatType
+entryRulePrimitiveFloatType
+:
+{ before(grammarAccess.getPrimitiveFloatTypeRule()); }
+	 rulePrimitiveFloatType
+{ after(grammarAccess.getPrimitiveFloatTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveFloatType
+rulePrimitiveFloatType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getGroup()); }
+		(rule__PrimitiveFloatType__Group__0)
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveRealType
+entryRulePrimitiveRealType
+:
+{ before(grammarAccess.getPrimitiveRealTypeRule()); }
+	 rulePrimitiveRealType
+{ after(grammarAccess.getPrimitiveRealTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveRealType
+rulePrimitiveRealType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveRealTypeAccess().getGroup()); }
+		(rule__PrimitiveRealType__Group__0)
+		{ after(grammarAccess.getPrimitiveRealTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveTimeType
+entryRulePrimitiveTimeType
+:
+{ before(grammarAccess.getPrimitiveTimeTypeRule()); }
+	 rulePrimitiveTimeType
+{ after(grammarAccess.getPrimitiveTimeTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveTimeType
+rulePrimitiveTimeType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives()); }
+		(rule__PrimitiveTimeType__Alternatives)
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveTimeNumberType
+entryRulePrimitiveTimeNumberType
+:
+{ before(grammarAccess.getPrimitiveTimeNumberTypeRule()); }
+	 rulePrimitiveTimeNumberType
+{ after(grammarAccess.getPrimitiveTimeNumberTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveTimeNumberType
+rulePrimitiveTimeNumberType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getAlternatives()); }
+		(rule__PrimitiveTimeNumberType__Alternatives)
+		{ after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOtherPrimitiveType
+entryRuleOtherPrimitiveType
+:
+{ before(grammarAccess.getOtherPrimitiveTypeRule()); }
+	 ruleOtherPrimitiveType
+{ after(grammarAccess.getOtherPrimitiveTypeRule()); } 
+	 EOF 
+;
+
+// Rule OtherPrimitiveType
+ruleOtherPrimitiveType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOtherPrimitiveTypeAccess().getAlternatives()); }
+		(rule__OtherPrimitiveType__Alternatives)
+		{ after(grammarAccess.getOtherPrimitiveTypeAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveBooleanType
+entryRulePrimitiveBooleanType
+:
+{ before(grammarAccess.getPrimitiveBooleanTypeRule()); }
+	 rulePrimitiveBooleanType
+{ after(grammarAccess.getPrimitiveBooleanTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveBooleanType
+rulePrimitiveBooleanType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveBooleanTypeAccess().getGroup()); }
+		(rule__PrimitiveBooleanType__Group__0)
+		{ after(grammarAccess.getPrimitiveBooleanTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveCharacterType
+entryRulePrimitiveCharacterType
+:
+{ before(grammarAccess.getPrimitiveCharacterTypeRule()); }
+	 rulePrimitiveCharacterType
+{ after(grammarAccess.getPrimitiveCharacterTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveCharacterType
+rulePrimitiveCharacterType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveCharacterTypeAccess().getGroup()); }
+		(rule__PrimitiveCharacterType__Group__0)
+		{ after(grammarAccess.getPrimitiveCharacterTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveStringType
+entryRulePrimitiveStringType
+:
+{ before(grammarAccess.getPrimitiveStringTypeRule()); }
+	 rulePrimitiveStringType
+{ after(grammarAccess.getPrimitiveStringTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveStringType
+rulePrimitiveStringType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveStringTypeAccess().getGroup()); }
+		(rule__PrimitiveStringType__Group__0)
+		{ after(grammarAccess.getPrimitiveStringTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimitiveInstanceType
+entryRulePrimitiveInstanceType
+:
+{ before(grammarAccess.getPrimitiveInstanceTypeRule()); }
+	 rulePrimitiveInstanceType
+{ after(grammarAccess.getPrimitiveInstanceTypeRule()); } 
+	 EOF 
+;
+
+// Rule PrimitiveInstanceType
+rulePrimitiveInstanceType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup()); }
+		(rule__PrimitiveInstanceType__Group__0)
+		{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIntervalType
+entryRuleIntervalType
+:
+{ before(grammarAccess.getIntervalTypeRule()); }
+	 ruleIntervalType
+{ after(grammarAccess.getIntervalTypeRule()); } 
+	 EOF 
+;
+
+// Rule IntervalType
+ruleIntervalType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getGroup()); }
+		(rule__IntervalType__Group__0)
+		{ after(grammarAccess.getIntervalTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIntervalTypeDefinition
+entryRuleIntervalTypeDefinition
+:
+{ before(grammarAccess.getIntervalTypeDefinitionRule()); }
+	 ruleIntervalTypeDefinition
+{ after(grammarAccess.getIntervalTypeDefinitionRule()); } 
+	 EOF 
+;
+
+// Rule IntervalTypeDefinition
+ruleIntervalTypeDefinition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getGroup()); }
+		(rule__IntervalTypeDefinition__Group__0)
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIntervalTypeDefinitionImpl
+entryRuleIntervalTypeDefinitionImpl
+:
+{ before(grammarAccess.getIntervalTypeDefinitionImplRule()); }
+	 ruleIntervalTypeDefinitionImpl
+{ after(grammarAccess.getIntervalTypeDefinitionImplRule()); } 
+	 EOF 
+;
+
+// Rule IntervalTypeDefinitionImpl
+ruleIntervalTypeDefinitionImpl 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getGroup()); }
+		(rule__IntervalTypeDefinitionImpl__Group__0)
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleCollectionType
+entryRuleCollectionType
+:
+{ before(grammarAccess.getCollectionTypeRule()); }
+	 ruleCollectionType
+{ after(grammarAccess.getCollectionTypeRule()); } 
+	 EOF 
+;
+
+// Rule CollectionType
+ruleCollectionType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getCollectionTypeAccess().getGroup()); }
+		(rule__CollectionType__Group__0)
+		{ after(grammarAccess.getCollectionTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleCollectionTypeDefinition
+entryRuleCollectionTypeDefinition
+:
+{ before(grammarAccess.getCollectionTypeDefinitionRule()); }
+	 ruleCollectionTypeDefinition
+{ after(grammarAccess.getCollectionTypeDefinitionRule()); } 
+	 EOF 
+;
+
+// Rule CollectionTypeDefinition
+ruleCollectionTypeDefinition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getGroup()); }
+		(rule__CollectionTypeDefinition__Group__0)
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleCollectionTypeDefinitionImpl
+entryRuleCollectionTypeDefinitionImpl
+:
+{ before(grammarAccess.getCollectionTypeDefinitionImplRule()); }
+	 ruleCollectionTypeDefinitionImpl
+{ after(grammarAccess.getCollectionTypeDefinitionImplRule()); } 
+	 EOF 
+;
+
+// Rule CollectionTypeDefinitionImpl
+ruleCollectionTypeDefinitionImpl 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup()); }
+		(rule__CollectionTypeDefinitionImpl__Group__0)
+		{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEnumerationType
+entryRuleEnumerationType
+:
+{ before(grammarAccess.getEnumerationTypeRule()); }
+	 ruleEnumerationType
+{ after(grammarAccess.getEnumerationTypeRule()); } 
+	 EOF 
+;
+
+// Rule EnumerationType
+ruleEnumerationType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEnumerationTypeAccess().getGroup()); }
+		(rule__EnumerationType__Group__0)
+		{ after(grammarAccess.getEnumerationTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEnumerationTypeDefinition
+entryRuleEnumerationTypeDefinition
+:
+{ before(grammarAccess.getEnumerationTypeDefinitionRule()); }
+	 ruleEnumerationTypeDefinition
+{ after(grammarAccess.getEnumerationTypeDefinitionRule()); } 
+	 EOF 
+;
+
+// Rule EnumerationTypeDefinition
+ruleEnumerationTypeDefinition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup()); }
+		(rule__EnumerationTypeDefinition__Group__0)
+		{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEnumerationTypeDefinitionImpl
+entryRuleEnumerationTypeDefinitionImpl
+:
+{ before(grammarAccess.getEnumerationTypeDefinitionImplRule()); }
+	 ruleEnumerationTypeDefinitionImpl
+{ after(grammarAccess.getEnumerationTypeDefinitionImplRule()); } 
+	 EOF 
+;
+
+// Rule EnumerationTypeDefinitionImpl
+ruleEnumerationTypeDefinitionImpl 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup()); }
+		(rule__EnumerationTypeDefinitionImpl__Group__0)
+		{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEnumerationLiteral
+entryRuleEnumerationLiteral
+:
+{ before(grammarAccess.getEnumerationLiteralRule()); }
+	 ruleEnumerationLiteral
+{ after(grammarAccess.getEnumerationLiteralRule()); } 
+	 EOF 
+;
+
+// Rule EnumerationLiteral
+ruleEnumerationLiteral 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEnumerationLiteralAccess().getGroup()); }
+		(rule__EnumerationLiteral__Group__0)
+		{ after(grammarAccess.getEnumerationLiteralAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStructureType
+entryRuleStructureType
+:
+{ before(grammarAccess.getStructureTypeRule()); }
+	 ruleStructureType
+{ after(grammarAccess.getStructureTypeRule()); } 
+	 EOF 
+;
+
+// Rule StructureType
+ruleStructureType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStructureTypeAccess().getGroup()); }
+		(rule__StructureType__Group__0)
+		{ after(grammarAccess.getStructureTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStructureTypeDefinition
+entryRuleStructureTypeDefinition
+:
+{ before(grammarAccess.getStructureTypeDefinitionRule()); }
+	 ruleStructureTypeDefinition
+{ after(grammarAccess.getStructureTypeDefinitionRule()); } 
+	 EOF 
+;
+
+// Rule StructureTypeDefinition
+ruleStructureTypeDefinition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionAccess().getGroup()); }
+		(rule__StructureTypeDefinition__Group__0)
+		{ after(grammarAccess.getStructureTypeDefinitionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStructureTypeDefinitionImpl
+entryRuleStructureTypeDefinitionImpl
+:
+{ before(grammarAccess.getStructureTypeDefinitionImplRule()); }
+	 ruleStructureTypeDefinitionImpl
+{ after(grammarAccess.getStructureTypeDefinitionImplRule()); } 
+	 EOF 
+;
+
+// Rule StructureTypeDefinitionImpl
+ruleStructureTypeDefinitionImpl 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getGroup()); }
+		(rule__StructureTypeDefinitionImpl__Group__0)
+		{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleUnionType
+entryRuleUnionType
+:
+{ before(grammarAccess.getUnionTypeRule()); }
+	 ruleUnionType
+{ after(grammarAccess.getUnionTypeRule()); } 
+	 EOF 
+;
+
+// Rule UnionType
+ruleUnionType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getUnionTypeAccess().getGroup()); }
+		(rule__UnionType__Group__0)
+		{ after(grammarAccess.getUnionTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleUnionTypeDefinition
+entryRuleUnionTypeDefinition
+:
+{ before(grammarAccess.getUnionTypeDefinitionRule()); }
+	 ruleUnionTypeDefinition
+{ after(grammarAccess.getUnionTypeDefinitionRule()); } 
+	 EOF 
+;
+
+// Rule UnionTypeDefinition
+ruleUnionTypeDefinition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionAccess().getGroup()); }
+		(rule__UnionTypeDefinition__Group__0)
+		{ after(grammarAccess.getUnionTypeDefinitionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleUnionTypeDefinitionImpl
+entryRuleUnionTypeDefinitionImpl
+:
+{ before(grammarAccess.getUnionTypeDefinitionImplRule()); }
+	 ruleUnionTypeDefinitionImpl
+{ after(grammarAccess.getUnionTypeDefinitionImplRule()); } 
+	 EOF 
+;
+
+// Rule UnionTypeDefinitionImpl
+ruleUnionTypeDefinitionImpl 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getGroup()); }
+		(rule__UnionTypeDefinitionImpl__Group__0)
+		{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleChoiceType
+entryRuleChoiceType
+:
+{ before(grammarAccess.getChoiceTypeRule()); }
+	 ruleChoiceType
+{ after(grammarAccess.getChoiceTypeRule()); } 
+	 EOF 
+;
+
+// Rule ChoiceType
+ruleChoiceType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getChoiceTypeAccess().getGroup()); }
+		(rule__ChoiceType__Group__0)
+		{ after(grammarAccess.getChoiceTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleChoiceTypeDefinition
+entryRuleChoiceTypeDefinition
+:
+{ before(grammarAccess.getChoiceTypeDefinitionRule()); }
+	 ruleChoiceTypeDefinition
+{ after(grammarAccess.getChoiceTypeDefinitionRule()); } 
+	 EOF 
+;
+
+// Rule ChoiceTypeDefinition
+ruleChoiceTypeDefinition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionAccess().getGroup()); }
+		(rule__ChoiceTypeDefinition__Group__0)
+		{ after(grammarAccess.getChoiceTypeDefinitionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleChoiceTypeDefinitionImpl
+entryRuleChoiceTypeDefinitionImpl
+:
+{ before(grammarAccess.getChoiceTypeDefinitionImplRule()); }
+	 ruleChoiceTypeDefinitionImpl
+{ after(grammarAccess.getChoiceTypeDefinitionImplRule()); } 
+	 EOF 
+;
+
+// Rule ChoiceTypeDefinitionImpl
+ruleChoiceTypeDefinitionImpl 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getGroup()); }
+		(rule__ChoiceTypeDefinitionImpl__Group__0)
+		{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleModifier
+entryRuleModifier
+:
+{ before(grammarAccess.getModifierRule()); }
+	 ruleModifier
+{ after(grammarAccess.getModifierRule()); } 
+	 EOF 
+;
+
+// Rule Modifier
+ruleModifier 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getModifierAccess().getGroup()); }
+		(rule__Modifier__Group__0)
+		{ after(grammarAccess.getModifierAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleVariable
+entryRuleVariable
+:
+{ before(grammarAccess.getVariableRule()); }
+	 ruleVariable
+{ after(grammarAccess.getVariableRule()); } 
+	 EOF 
+;
+
+// Rule Variable
+ruleVariable 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getVariableAccess().getGroup()); }
+		(rule__Variable__Group__0)
+		{ after(grammarAccess.getVariableAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOnWriteRoutine
+entryRuleOnWriteRoutine
+:
+{ before(grammarAccess.getOnWriteRoutineRule()); }
+	 ruleOnWriteRoutine
+{ after(grammarAccess.getOnWriteRoutineRule()); } 
+	 EOF 
+;
+
+// Rule OnWriteRoutine
+ruleOnWriteRoutine 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOnWriteRoutineAccess().getGroup()); }
+		(rule__OnWriteRoutine__Group__0)
+		{ after(grammarAccess.getOnWriteRoutineAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleVariableRoutineParameter
+entryRuleVariableRoutineParameter
+:
+{ before(grammarAccess.getVariableRoutineParameterRule()); }
+	 ruleVariableRoutineParameter
+{ after(grammarAccess.getVariableRoutineParameterRule()); } 
+	 EOF 
+;
+
+// Rule VariableRoutineParameter
+ruleVariableRoutineParameter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getVariableRoutineParameterAccess().getGroup()); }
+		(rule__VariableRoutineParameter__Group__0)
+		{ after(grammarAccess.getVariableRoutineParameterAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleVariablePublic
+entryRuleVariablePublic
+:
+{ before(grammarAccess.getVariablePublicRule()); }
+	 ruleVariablePublic
+{ after(grammarAccess.getVariablePublicRule()); } 
+	 EOF 
+;
+
+// Rule VariablePublic
+ruleVariablePublic 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getGroup()); }
+		(rule__VariablePublic__Group__0)
+		{ after(grammarAccess.getVariablePublicAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleVariableProtected
+entryRuleVariableProtected
+:
+{ before(grammarAccess.getVariableProtectedRule()); }
+	 ruleVariableProtected
+{ after(grammarAccess.getVariableProtectedRule()); } 
+	 EOF 
+;
+
+// Rule VariableProtected
+ruleVariableProtected 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getGroup()); }
+		(rule__VariableProtected__Group__0)
+		{ after(grammarAccess.getVariableProtectedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleVariablePrivate
+entryRuleVariablePrivate
+:
+{ before(grammarAccess.getVariablePrivateRule()); }
+	 ruleVariablePrivate
+{ after(grammarAccess.getVariablePrivateRule()); } 
+	 EOF 
+;
+
+// Rule VariablePrivate
+ruleVariablePrivate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getGroup()); }
+		(rule__VariablePrivate__Group__0)
+		{ after(grammarAccess.getVariablePrivateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleFunctionalParameterSet
+entryRuleFunctionalParameterSet
+:
+{ before(grammarAccess.getFunctionalParameterSetRule()); }
+	 ruleFunctionalParameterSet
+{ after(grammarAccess.getFunctionalParameterSetRule()); } 
+	 EOF 
+;
+
+// Rule FunctionalParameterSet
+ruleFunctionalParameterSet 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getFunctionalParameterSetAccess().getGroup()); }
+		(rule__FunctionalParameterSet__Group__0)
+		{ after(grammarAccess.getFunctionalParameterSetAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleFunctionalParameter
+entryRuleFunctionalParameter
+:
+{ before(grammarAccess.getFunctionalParameterRule()); }
+	 ruleFunctionalParameter
+{ after(grammarAccess.getFunctionalParameterRule()); } 
+	 EOF 
+;
+
+// Rule FunctionalParameter
+ruleFunctionalParameter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getFunctionalParameterAccess().getGroup()); }
+		(rule__FunctionalParameter__Group__0)
+		{ after(grammarAccess.getFunctionalParameterAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleFormalParameterSet
+entryRuleFormalParameterSet
+:
+{ before(grammarAccess.getFormalParameterSetRule()); }
+	 ruleFormalParameterSet
+{ after(grammarAccess.getFormalParameterSetRule()); } 
+	 EOF 
+;
+
+// Rule FormalParameterSet
+ruleFormalParameterSet 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getFormalParameterSetAccess().getGroup()); }
+		(rule__FormalParameterSet__Group__0)
+		{ after(grammarAccess.getFormalParameterSetAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleFormalParameter
+entryRuleFormalParameter
+:
+{ before(grammarAccess.getFormalParameterRule()); }
+	 ruleFormalParameter
+{ after(grammarAccess.getFormalParameterRule()); } 
+	 EOF 
+;
+
+// Rule FormalParameter
+ruleFormalParameter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getFormalParameterAccess().getGroup()); }
+		(rule__FormalParameter__Group__0)
+		{ after(grammarAccess.getFormalParameterAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleParameterInput
+entryRuleParameterInput
+:
+{ before(grammarAccess.getParameterInputRule()); }
+	 ruleParameterInput
+{ after(grammarAccess.getParameterInputRule()); } 
+	 EOF 
+;
+
+// Rule ParameterInput
+ruleParameterInput 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getParameterInputAccess().getGroup()); }
+		(rule__ParameterInput__Group__0)
+		{ after(grammarAccess.getParameterInputAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleParameterInout
+entryRuleParameterInout
+:
+{ before(grammarAccess.getParameterInoutRule()); }
+	 ruleParameterInout
+{ after(grammarAccess.getParameterInoutRule()); } 
+	 EOF 
+;
+
+// Rule ParameterInout
+ruleParameterInout 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getParameterInoutAccess().getGroup()); }
+		(rule__ParameterInout__Group__0)
+		{ after(grammarAccess.getParameterInoutAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleParameterOutput
+entryRuleParameterOutput
+:
+{ before(grammarAccess.getParameterOutputRule()); }
+	 ruleParameterOutput
+{ after(grammarAccess.getParameterOutputRule()); } 
+	 EOF 
+;
+
+// Rule ParameterOutput
+ruleParameterOutput 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getParameterOutputAccess().getGroup()); }
+		(rule__ParameterOutput__Group__0)
+		{ after(grammarAccess.getParameterOutputAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleParameterReturn
+entryRuleParameterReturn
+:
+{ before(grammarAccess.getParameterReturnRule()); }
+	 ruleParameterReturn
+{ after(grammarAccess.getParameterReturnRule()); } 
+	 EOF 
+;
+
+// Rule ParameterReturn
+ruleParameterReturn 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getParameterReturnAccess().getGroup()); }
+		(rule__ParameterReturn__Group__0)
+		{ after(grammarAccess.getParameterReturnAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBufferContainerType
+entryRuleBufferContainerType
+:
+{ before(grammarAccess.getBufferContainerTypeRule()); }
+	 ruleBufferContainerType
+{ after(grammarAccess.getBufferContainerTypeRule()); } 
+	 EOF 
+;
+
+// Rule BufferContainerType
+ruleBufferContainerType 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBufferContainerTypeAccess().getGroup()); }
+		(rule__BufferContainerType__Group__0)
+		{ after(grammarAccess.getBufferContainerTypeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBuffer
+entryRuleBuffer
+:
+{ before(grammarAccess.getBufferRule()); }
+	 ruleBuffer
+{ after(grammarAccess.getBufferRule()); } 
+	 EOF 
+;
+
+// Rule Buffer
+ruleBuffer 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBufferAccess().getGroup()); }
+		(rule__Buffer__Group__0)
+		{ after(grammarAccess.getBufferAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBufferPublic
+entryRuleBufferPublic
+:
+{ before(grammarAccess.getBufferPublicRule()); }
+	 ruleBufferPublic
+{ after(grammarAccess.getBufferPublicRule()); } 
+	 EOF 
+;
+
+// Rule BufferPublic
+ruleBufferPublic 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBufferPublicAccess().getGroup()); }
+		(rule__BufferPublic__Group__0)
+		{ after(grammarAccess.getBufferPublicAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBufferProtected
+entryRuleBufferProtected
+:
+{ before(grammarAccess.getBufferProtectedRule()); }
+	 ruleBufferProtected
+{ after(grammarAccess.getBufferProtectedRule()); } 
+	 EOF 
+;
+
+// Rule BufferProtected
+ruleBufferProtected 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBufferProtectedAccess().getGroup()); }
+		(rule__BufferProtected__Group__0)
+		{ after(grammarAccess.getBufferProtectedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBufferPrivate
+entryRuleBufferPrivate
+:
+{ before(grammarAccess.getBufferPrivateRule()); }
+	 ruleBufferPrivate
+{ after(grammarAccess.getBufferPrivateRule()); } 
+	 EOF 
+;
+
+// Rule BufferPrivate
+ruleBufferPrivate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBufferPrivateAccess().getGroup()); }
+		(rule__BufferPrivate__Group__0)
+		{ after(grammarAccess.getBufferPrivateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePort
+entryRulePort
+:
+{ before(grammarAccess.getPortRule()); }
+	 rulePort
+{ after(grammarAccess.getPortRule()); } 
+	 EOF 
+;
+
+// Rule Port
+rulePort 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPortAccess().getGroup()); }
+		(rule__Port__Group__0)
+		{ after(grammarAccess.getPortAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePortPublic
+entryRulePortPublic
+:
+{ before(grammarAccess.getPortPublicRule()); }
+	 rulePortPublic
+{ after(grammarAccess.getPortPublicRule()); } 
+	 EOF 
+;
+
+// Rule PortPublic
+rulePortPublic 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPortPublicAccess().getGroup()); }
+		(rule__PortPublic__Group__0)
+		{ after(grammarAccess.getPortPublicAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePortProtected
+entryRulePortProtected
+:
+{ before(grammarAccess.getPortProtectedRule()); }
+	 rulePortProtected
+{ after(grammarAccess.getPortProtectedRule()); } 
+	 EOF 
+;
+
+// Rule PortProtected
+rulePortProtected 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPortProtectedAccess().getGroup()); }
+		(rule__PortProtected__Group__0)
+		{ after(grammarAccess.getPortProtectedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePortPrivate
+entryRulePortPrivate
+:
+{ before(grammarAccess.getPortPrivateRule()); }
+	 rulePortPrivate
+{ after(grammarAccess.getPortPrivateRule()); } 
+	 EOF 
+;
+
+// Rule PortPrivate
+rulePortPrivate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPortPrivateAccess().getGroup()); }
+		(rule__PortPrivate__Group__0)
+		{ after(grammarAccess.getPortPrivateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSignal
+entryRuleSignal
+:
+{ before(grammarAccess.getSignalRule()); }
+	 ruleSignal
+{ after(grammarAccess.getSignalRule()); } 
+	 EOF 
+;
+
+// Rule Signal
+ruleSignal 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSignalAccess().getGroup()); }
+		(rule__Signal__Group__0)
+		{ after(grammarAccess.getSignalAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSignalPublic
+entryRuleSignalPublic
+:
+{ before(grammarAccess.getSignalPublicRule()); }
+	 ruleSignalPublic
+{ after(grammarAccess.getSignalPublicRule()); } 
+	 EOF 
+;
+
+// Rule SignalPublic
+ruleSignalPublic 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSignalPublicAccess().getGroup()); }
+		(rule__SignalPublic__Group__0)
+		{ after(grammarAccess.getSignalPublicAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSignalProtected
+entryRuleSignalProtected
+:
+{ before(grammarAccess.getSignalProtectedRule()); }
+	 ruleSignalProtected
+{ after(grammarAccess.getSignalProtectedRule()); } 
+	 EOF 
+;
+
+// Rule SignalProtected
+ruleSignalProtected 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSignalProtectedAccess().getGroup()); }
+		(rule__SignalProtected__Group__0)
+		{ after(grammarAccess.getSignalProtectedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSignalPrivate
+entryRuleSignalPrivate
+:
+{ before(grammarAccess.getSignalPrivateRule()); }
+	 ruleSignalPrivate
+{ after(grammarAccess.getSignalPrivateRule()); } 
+	 EOF 
+;
+
+// Rule SignalPrivate
+ruleSignalPrivate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSignalPrivateAccess().getGroup()); }
+		(rule__SignalPrivate__Group__0)
+		{ after(grammarAccess.getSignalPrivateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleChannel
+entryRuleChannel
+:
+{ before(grammarAccess.getChannelRule()); }
+	 ruleChannel
+{ after(grammarAccess.getChannelRule()); } 
+	 EOF 
+;
+
+// Rule Channel
+ruleChannel 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getChannelAccess().getGroup()); }
+		(rule__Channel__Group__0)
+		{ after(grammarAccess.getChannelAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleSignalReference
+entryRuleSignalReference
+:
+{ before(grammarAccess.getSignalReferenceRule()); }
+	 ruleSignalReference
+{ after(grammarAccess.getSignalReferenceRule()); } 
+	 EOF 
+;
+
+// Rule SignalReference
+ruleSignalReference 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSignalReferenceAccess().getGroup()); }
+		(rule__SignalReference__Group__0)
+		{ after(grammarAccess.getSignalReferenceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleChannelPublic
+entryRuleChannelPublic
+:
+{ before(grammarAccess.getChannelPublicRule()); }
+	 ruleChannelPublic
+{ after(grammarAccess.getChannelPublicRule()); } 
+	 EOF 
+;
+
+// Rule ChannelPublic
+ruleChannelPublic 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getChannelPublicAccess().getGroup()); }
+		(rule__ChannelPublic__Group__0)
+		{ after(grammarAccess.getChannelPublicAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleChannelProtected
+entryRuleChannelProtected
+:
+{ before(grammarAccess.getChannelProtectedRule()); }
+	 ruleChannelProtected
+{ after(grammarAccess.getChannelProtectedRule()); } 
+	 EOF 
+;
+
+// Rule ChannelProtected
+ruleChannelProtected 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getChannelProtectedAccess().getGroup()); }
+		(rule__ChannelProtected__Group__0)
+		{ after(grammarAccess.getChannelProtectedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleChannelPrivate
+entryRuleChannelPrivate
+:
+{ before(grammarAccess.getChannelPrivateRule()); }
+	 ruleChannelPrivate
+{ after(grammarAccess.getChannelPrivateRule()); } 
+	 EOF 
+;
+
+// Rule ChannelPrivate
+ruleChannelPrivate 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getChannelPrivateAccess().getGroup()); }
+		(rule__ChannelPrivate__Group__0)
+		{ after(grammarAccess.getChannelPrivateAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTransition
+entryRuleTransition
+:
+{ before(grammarAccess.getTransitionRule()); }
+	 ruleTransition
+{ after(grammarAccess.getTransitionRule()); } 
+	 EOF 
+;
+
+// Rule Transition
+ruleTransition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionAccess().getGroup()); }
+		(rule__Transition__Group__0)
+		{ after(grammarAccess.getTransitionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTransitionMoe
+entryRuleTransitionMoe
+:
+{ before(grammarAccess.getTransitionMoeRule()); }
+	 ruleTransitionMoe
+{ after(grammarAccess.getTransitionMoeRule()); } 
+	 EOF 
+;
+
+// Rule TransitionMoe
+ruleTransitionMoe 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getGroup()); }
+		(rule__TransitionMoe__Group__0)
+		{ after(grammarAccess.getTransitionMoeAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTransitionBehavior
+entryRuleTransitionBehavior
+:
+{ before(grammarAccess.getTransitionBehaviorRule()); }
+	 ruleTransitionBehavior
+{ after(grammarAccess.getTransitionBehaviorRule()); } 
+	 EOF 
+;
+
+// Rule TransitionBehavior
+ruleTransitionBehavior 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionBehaviorAccess().getGroup()); }
+		(rule__TransitionBehavior__Group__0)
+		{ after(grammarAccess.getTransitionBehaviorAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTransitionTrigger
+entryRuleTransitionTrigger
+:
+{ before(grammarAccess.getTransitionTriggerRule()); }
+	 ruleTransitionTrigger
+{ after(grammarAccess.getTransitionTriggerRule()); } 
+	 EOF 
+;
+
+// Rule TransitionTrigger
+ruleTransitionTrigger 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionTriggerAccess().getInputComStatementParserRuleCall()); }
+		ruleInputComStatement
+		{ after(grammarAccess.getTransitionTriggerAccess().getInputComStatementParserRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTransitionGuard
+entryRuleTransitionGuard
+:
+{ before(grammarAccess.getTransitionGuardRule()); }
+	 ruleTransitionGuard
+{ after(grammarAccess.getTransitionGuardRule()); } 
+	 EOF 
+;
+
+// Rule TransitionGuard
+ruleTransitionGuard 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getAlternatives()); }
+		(rule__TransitionGuard__Alternatives)
+		{ after(grammarAccess.getTransitionGuardAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTransitionGuardExpression
+entryRuleTransitionGuardExpression
+:
+{ before(grammarAccess.getTransitionGuardExpressionRule()); }
+	 ruleTransitionGuardExpression
+{ after(grammarAccess.getTransitionGuardExpressionRule()); } 
+	 EOF 
+;
+
+// Rule TransitionGuardExpression
+ruleTransitionGuardExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionGuardExpressionAccess().getGroup()); }
+		(rule__TransitionGuardExpression__Group__0)
+		{ after(grammarAccess.getTransitionGuardExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTransitionTimedGuard
+entryRuleTransitionTimedGuard
+:
+{ before(grammarAccess.getTransitionTimedGuardRule()); }
+	 ruleTransitionTimedGuard
+{ after(grammarAccess.getTransitionTimedGuardRule()); } 
+	 EOF 
+;
+
+// Rule TransitionTimedGuard
+ruleTransitionTimedGuard 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getAlternatives()); }
+		(rule__TransitionTimedGuard__Alternatives)
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTransitionEffect
+entryRuleTransitionEffect
+:
+{ before(grammarAccess.getTransitionEffectRule()); }
+	 ruleTransitionEffect
+{ after(grammarAccess.getTransitionEffectRule()); } 
+	 EOF 
+;
+
+// Rule TransitionEffect
+ruleTransitionEffect 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionEffectAccess().getGroup()); }
+		(rule__TransitionEffect__Group__0)
+		{ after(grammarAccess.getTransitionEffectAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTransitionEffectStatement
+entryRuleTransitionEffectStatement
+:
+{ before(grammarAccess.getTransitionEffectStatementRule()); }
+	 ruleTransitionEffectStatement
+{ after(grammarAccess.getTransitionEffectStatementRule()); } 
+	 EOF 
+;
+
+// Rule TransitionEffectStatement
+ruleTransitionEffectStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getAlternatives()); }
+		(rule__TransitionEffectStatement__Alternatives)
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStatement
+entryRuleStatement
+:
+{ before(grammarAccess.getStatementRule()); }
+	 ruleStatement
+{ after(grammarAccess.getStatementRule()); } 
+	 EOF 
+;
+
+// Rule Statement
+ruleStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStatementAccess().getAlternatives()); }
+		(rule__Statement__Alternatives)
+		{ after(grammarAccess.getStatementAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBlockStatement
+entryRuleBlockStatement
+:
+{ before(grammarAccess.getBlockStatementRule()); }
+	 ruleBlockStatement
+{ after(grammarAccess.getBlockStatementRule()); } 
+	 EOF 
+;
+
+// Rule BlockStatement
+ruleBlockStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBlockStatementAccess().getGroup()); }
+		(rule__BlockStatement__Group__0)
+		{ after(grammarAccess.getBlockStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBlockStatementScheduler
+entryRuleBlockStatementScheduler
+:
+{ before(grammarAccess.getBlockStatementSchedulerRule()); }
+	 ruleBlockStatementScheduler
+{ after(grammarAccess.getBlockStatementSchedulerRule()); } 
+	 EOF 
+;
+
+// Rule BlockStatementScheduler
+ruleBlockStatementScheduler 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getAlternatives()); }
+		(rule__BlockStatementScheduler__Alternatives)
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleExpressionStatement
+entryRuleExpressionStatement
+:
+{ before(grammarAccess.getExpressionStatementRule()); }
+	 ruleExpressionStatement
+{ after(grammarAccess.getExpressionStatementRule()); } 
+	 EOF 
+;
+
+// Rule ExpressionStatement
+ruleExpressionStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getExpressionStatementAccess().getAlternatives()); }
+		(rule__ExpressionStatement__Alternatives)
+		{ after(grammarAccess.getExpressionStatementAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleGuardStatement
+entryRuleGuardStatement
+:
+{ before(grammarAccess.getGuardStatementRule()); }
+	 ruleGuardStatement
+{ after(grammarAccess.getGuardStatementRule()); } 
+	 EOF 
+;
+
+// Rule GuardStatement
+ruleGuardStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getGuardStatementAccess().getGroup()); }
+		(rule__GuardStatement__Group__0)
+		{ after(grammarAccess.getGuardStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTimedGuardStatement
+entryRuleTimedGuardStatement
+:
+{ before(grammarAccess.getTimedGuardStatementRule()); }
+	 ruleTimedGuardStatement
+{ after(grammarAccess.getTimedGuardStatementRule()); } 
+	 EOF 
+;
+
+// Rule TimedGuardStatement
+ruleTimedGuardStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTimedGuardStatementAccess().getGroup()); }
+		(rule__TimedGuardStatement__Group__0)
+		{ after(grammarAccess.getTimedGuardStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEventGuardStatement
+entryRuleEventGuardStatement
+:
+{ before(grammarAccess.getEventGuardStatementRule()); }
+	 ruleEventGuardStatement
+{ after(grammarAccess.getEventGuardStatementRule()); } 
+	 EOF 
+;
+
+// Rule EventGuardStatement
+ruleEventGuardStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEventGuardStatementAccess().getGroup()); }
+		(rule__EventGuardStatement__Group__0)
+		{ after(grammarAccess.getEventGuardStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleCheckSatGuardStatement
+entryRuleCheckSatGuardStatement
+:
+{ before(grammarAccess.getCheckSatGuardStatementRule()); }
+	 ruleCheckSatGuardStatement
+{ after(grammarAccess.getCheckSatGuardStatementRule()); } 
+	 EOF 
+;
+
+// Rule CheckSatGuardStatement
+ruleCheckSatGuardStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getCheckSatGuardStatementAccess().getGroup()); }
+		(rule__CheckSatGuardStatement__Group__0)
+		{ after(grammarAccess.getCheckSatGuardStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleInputComStatement
+entryRuleInputComStatement
+:
+{ before(grammarAccess.getInputComStatementRule()); }
+	 ruleInputComStatement
+{ after(grammarAccess.getInputComStatementRule()); } 
+	 EOF 
+;
+
+// Rule InputComStatement
+ruleInputComStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getInputComStatementAccess().getGroup()); }
+		(rule__InputComStatement__Group__0)
+		{ after(grammarAccess.getInputComStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleOutputComStatement
+entryRuleOutputComStatement
+:
+{ before(grammarAccess.getOutputComStatementRule()); }
+	 ruleOutputComStatement
+{ after(grammarAccess.getOutputComStatementRule()); } 
+	 EOF 
+;
+
+// Rule OutputComStatement
+ruleOutputComStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getOutputComStatementAccess().getGroup()); }
+		(rule__OutputComStatement__Group__0)
+		{ after(grammarAccess.getOutputComStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleExpressionAsMachine
+entryRuleExpressionAsMachine
+:
+{ before(grammarAccess.getExpressionAsMachineRule()); }
+	 ruleExpressionAsMachine
+{ after(grammarAccess.getExpressionAsMachineRule()); } 
+	 EOF 
+;
+
+// Rule ExpressionAsMachine
+ruleExpressionAsMachine 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getExpressionAsMachineAccess().getMachineAssignment()); }
+		(rule__ExpressionAsMachine__MachineAssignment)
+		{ after(grammarAccess.getExpressionAsMachineAccess().getMachineAssignment()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIfStatement
+entryRuleIfStatement
+:
+{ before(grammarAccess.getIfStatementRule()); }
+	 ruleIfStatement
+{ after(grammarAccess.getIfStatementRule()); } 
+	 EOF 
+;
+
+// Rule IfStatement
+ruleIfStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIfStatementAccess().getGroup()); }
+		(rule__IfStatement__Group__0)
+		{ after(grammarAccess.getIfStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleElseIfStatement
+entryRuleElseIfStatement
+:
+{ before(grammarAccess.getElseIfStatementRule()); }
+	 ruleElseIfStatement
+{ after(grammarAccess.getElseIfStatementRule()); } 
+	 EOF 
+;
+
+// Rule ElseIfStatement
+ruleElseIfStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getElseIfStatementAccess().getGroup()); }
+		(rule__ElseIfStatement__Group__0)
+		{ after(grammarAccess.getElseIfStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleWhileDoStatement
+entryRuleWhileDoStatement
+:
+{ before(grammarAccess.getWhileDoStatementRule()); }
+	 ruleWhileDoStatement
+{ after(grammarAccess.getWhileDoStatementRule()); } 
+	 EOF 
+;
+
+// Rule WhileDoStatement
+ruleWhileDoStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getWhileDoStatementAccess().getGroup()); }
+		(rule__WhileDoStatement__Group__0)
+		{ after(grammarAccess.getWhileDoStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDoWhileStatement
+entryRuleDoWhileStatement
+:
+{ before(grammarAccess.getDoWhileStatementRule()); }
+	 ruleDoWhileStatement
+{ after(grammarAccess.getDoWhileStatementRule()); } 
+	 EOF 
+;
+
+// Rule DoWhileStatement
+ruleDoWhileStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDoWhileStatementAccess().getGroup()); }
+		(rule__DoWhileStatement__Group__0)
+		{ after(grammarAccess.getDoWhileStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleForStatement
+entryRuleForStatement
+:
+{ before(grammarAccess.getForStatementRule()); }
+	 ruleForStatement
+{ after(grammarAccess.getForStatementRule()); } 
+	 EOF 
+;
+
+// Rule ForStatement
+ruleForStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getForStatementAccess().getAlternatives()); }
+		(rule__ForStatement__Alternatives)
+		{ after(grammarAccess.getForStatementAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleForAssignmentExpression
+entryRuleForAssignmentExpression
+:
+{ before(grammarAccess.getForAssignmentExpressionRule()); }
+	 ruleForAssignmentExpression
+{ after(grammarAccess.getForAssignmentExpressionRule()); } 
+	 EOF 
+;
+
+// Rule ForAssignmentExpression
+ruleForAssignmentExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getForAssignmentExpressionAccess().getAlternatives()); }
+		(rule__ForAssignmentExpression__Alternatives)
+		{ after(grammarAccess.getForAssignmentExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleForEachStatement
+entryRuleForEachStatement
+:
+{ before(grammarAccess.getForEachStatementRule()); }
+	 ruleForEachStatement
+{ after(grammarAccess.getForEachStatementRule()); } 
+	 EOF 
+;
+
+// Rule ForEachStatement
+ruleForEachStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getForEachStatementAccess().getAlternatives()); }
+		(rule__ForEachStatement__Alternatives)
+		{ after(grammarAccess.getForEachStatementAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleInterruptStatement
+entryRuleInterruptStatement
+:
+{ before(grammarAccess.getInterruptStatementRule()); }
+	 ruleInterruptStatement
+{ after(grammarAccess.getInterruptStatementRule()); } 
+	 EOF 
+;
+
+// Rule InterruptStatement
+ruleInterruptStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getInterruptStatementAccess().getGroup()); }
+		(rule__InterruptStatement__Group__0)
+		{ after(grammarAccess.getInterruptStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleActivityStatement
+entryRuleActivityStatement
+:
+{ before(grammarAccess.getActivityStatementRule()); }
+	 ruleActivityStatement
+{ after(grammarAccess.getActivityStatementRule()); } 
+	 EOF 
+;
+
+// Rule ActivityStatement
+ruleActivityStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getActivityStatementAccess().getGroup()); }
+		(rule__ActivityStatement__Group__0)
+		{ after(grammarAccess.getActivityStatementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleInvokeStatement
+entryRuleInvokeStatement
+:
+{ before(grammarAccess.getInvokeStatementRule()); }
+	 ruleInvokeStatement
+{ after(grammarAccess.getInvokeStatementRule()); } 
+	 EOF 
+;
+
+// Rule InvokeStatement
+ruleInvokeStatement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getAlternatives()); }
+		(rule__InvokeStatement__Alternatives)
+		{ after(grammarAccess.getInvokeStatementAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleExpression
+entryRuleExpression
+:
+{ before(grammarAccess.getExpressionRule()); }
+	 ruleExpression
+{ after(grammarAccess.getExpressionRule()); } 
+	 EOF 
+;
+
+// Rule Expression
+ruleExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getExpressionAccess().getAlternatives()); }
+		(rule__Expression__Alternatives)
+		{ after(grammarAccess.getExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleAssignmentExpression
+entryRuleAssignmentExpression
+:
+{ before(grammarAccess.getAssignmentExpressionRule()); }
+	 ruleAssignmentExpression
+{ after(grammarAccess.getAssignmentExpressionRule()); } 
+	 EOF 
+;
+
+// Rule AssignmentExpression
+ruleAssignmentExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getAssignmentExpressionAccess().getGroup()); }
+		(rule__AssignmentExpression__Group__0)
+		{ after(grammarAccess.getAssignmentExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleAssignmentOperator
+entryRuleAssignmentOperator
+:
+{ before(grammarAccess.getAssignmentOperatorRule()); }
+	 ruleAssignmentOperator
+{ after(grammarAccess.getAssignmentOperatorRule()); } 
+	 EOF 
+;
+
+// Rule AssignmentOperator
+ruleAssignmentOperator 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getAlternatives()); }
+		(rule__AssignmentOperator__Alternatives)
+		{ after(grammarAccess.getAssignmentOperatorAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLeftHandSideExpression
+entryRuleLeftHandSideExpression
+:
+{ before(grammarAccess.getLeftHandSideExpressionRule()); }
+	 ruleLeftHandSideExpression
+{ after(grammarAccess.getLeftHandSideExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LeftHandSideExpression
+ruleLeftHandSideExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLeftHandSideExpressionAccess().getGroup()); }
+		(rule__LeftHandSideExpression__Group__0)
+		{ after(grammarAccess.getLeftHandSideExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleConditionalTestExpression
+entryRuleConditionalTestExpression
+:
+{ before(grammarAccess.getConditionalTestExpressionRule()); }
+	 ruleConditionalTestExpression
+{ after(grammarAccess.getConditionalTestExpressionRule()); } 
+	 EOF 
+;
+
+// Rule ConditionalTestExpression
+ruleConditionalTestExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getConditionalTestExpressionAccess().getGroup()); }
+		(rule__ConditionalTestExpression__Group__0)
+		{ after(grammarAccess.getConditionalTestExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLogicalOrExpression
+entryRuleLogicalOrExpression
+:
+{ before(grammarAccess.getLogicalOrExpressionRule()); }
+	 ruleLogicalOrExpression
+{ after(grammarAccess.getLogicalOrExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LogicalOrExpression
+ruleLogicalOrExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLogicalOrExpressionAccess().getGroup()); }
+		(rule__LogicalOrExpression__Group__0)
+		{ after(grammarAccess.getLogicalOrExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLogicalAndExpression
+entryRuleLogicalAndExpression
+:
+{ before(grammarAccess.getLogicalAndExpressionRule()); }
+	 ruleLogicalAndExpression
+{ after(grammarAccess.getLogicalAndExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LogicalAndExpression
+ruleLogicalAndExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLogicalAndExpressionAccess().getGroup()); }
+		(rule__LogicalAndExpression__Group__0)
+		{ after(grammarAccess.getLogicalAndExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBitwiseOrExpression
+entryRuleBitwiseOrExpression
+:
+{ before(grammarAccess.getBitwiseOrExpressionRule()); }
+	 ruleBitwiseOrExpression
+{ after(grammarAccess.getBitwiseOrExpressionRule()); } 
+	 EOF 
+;
+
+// Rule BitwiseOrExpression
+ruleBitwiseOrExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBitwiseOrExpressionAccess().getGroup()); }
+		(rule__BitwiseOrExpression__Group__0)
+		{ after(grammarAccess.getBitwiseOrExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBitwiseXorExpression
+entryRuleBitwiseXorExpression
+:
+{ before(grammarAccess.getBitwiseXorExpressionRule()); }
+	 ruleBitwiseXorExpression
+{ after(grammarAccess.getBitwiseXorExpressionRule()); } 
+	 EOF 
+;
+
+// Rule BitwiseXorExpression
+ruleBitwiseXorExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBitwiseXorExpressionAccess().getGroup()); }
+		(rule__BitwiseXorExpression__Group__0)
+		{ after(grammarAccess.getBitwiseXorExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBitwiseAndExpression
+entryRuleBitwiseAndExpression
+:
+{ before(grammarAccess.getBitwiseAndExpressionRule()); }
+	 ruleBitwiseAndExpression
+{ after(grammarAccess.getBitwiseAndExpressionRule()); } 
+	 EOF 
+;
+
+// Rule BitwiseAndExpression
+ruleBitwiseAndExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBitwiseAndExpressionAccess().getGroup()); }
+		(rule__BitwiseAndExpression__Group__0)
+		{ after(grammarAccess.getBitwiseAndExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEqualityExpression
+entryRuleEqualityExpression
+:
+{ before(grammarAccess.getEqualityExpressionRule()); }
+	 ruleEqualityExpression
+{ after(grammarAccess.getEqualityExpressionRule()); } 
+	 EOF 
+;
+
+// Rule EqualityExpression
+ruleEqualityExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getGroup()); }
+		(rule__EqualityExpression__Group__0)
+		{ after(grammarAccess.getEqualityExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEqualityOperator
+entryRuleEqualityOperator
+:
+{ before(grammarAccess.getEqualityOperatorRule()); }
+	 ruleEqualityOperator
+{ after(grammarAccess.getEqualityOperatorRule()); } 
+	 EOF 
+;
+
+// Rule EqualityOperator
+ruleEqualityOperator 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEqualityOperatorAccess().getAlternatives()); }
+		(rule__EqualityOperator__Alternatives)
+		{ after(grammarAccess.getEqualityOperatorAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleRelationalExpression
+entryRuleRelationalExpression
+:
+{ before(grammarAccess.getRelationalExpressionRule()); }
+	 ruleRelationalExpression
+{ after(grammarAccess.getRelationalExpressionRule()); } 
+	 EOF 
+;
+
+// Rule RelationalExpression
+ruleRelationalExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getGroup()); }
+		(rule__RelationalExpression__Group__0)
+		{ after(grammarAccess.getRelationalExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleRelationalOperator
+entryRuleRelationalOperator
+:
+{ before(grammarAccess.getRelationalOperatorRule()); }
+	 ruleRelationalOperator
+{ after(grammarAccess.getRelationalOperatorRule()); } 
+	 EOF 
+;
+
+// Rule RelationalOperator
+ruleRelationalOperator 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getRelationalOperatorAccess().getAlternatives()); }
+		(rule__RelationalOperator__Alternatives)
+		{ after(grammarAccess.getRelationalOperatorAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleAdditiveExpression
+entryRuleAdditiveExpression
+:
+{ before(grammarAccess.getAdditiveExpressionRule()); }
+	 ruleAdditiveExpression
+{ after(grammarAccess.getAdditiveExpressionRule()); } 
+	 EOF 
+;
+
+// Rule AdditiveExpression
+ruleAdditiveExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getGroup()); }
+		(rule__AdditiveExpression__Group__0)
+		{ after(grammarAccess.getAdditiveExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleMultiplicativeExpression
+entryRuleMultiplicativeExpression
+:
+{ before(grammarAccess.getMultiplicativeExpressionRule()); }
+	 ruleMultiplicativeExpression
+{ after(grammarAccess.getMultiplicativeExpressionRule()); } 
+	 EOF 
+;
+
+// Rule MultiplicativeExpression
+ruleMultiplicativeExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup()); }
+		(rule__MultiplicativeExpression__Group__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleUnaryExpression
+entryRuleUnaryExpression
+:
+{ before(grammarAccess.getUnaryExpressionRule()); }
+	 ruleUnaryExpression
+{ after(grammarAccess.getUnaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule UnaryExpression
+ruleUnaryExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getAlternatives()); }
+		(rule__UnaryExpression__Alternatives)
+		{ after(grammarAccess.getUnaryExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePostfixUnaryExpression
+entryRulePostfixUnaryExpression
+:
+{ before(grammarAccess.getPostfixUnaryExpressionRule()); }
+	 rulePostfixUnaryExpression
+{ after(grammarAccess.getPostfixUnaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule PostfixUnaryExpression
+rulePostfixUnaryExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPostfixUnaryExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall()); }
+		ruleIncrementOrDecrementPostfixExpression
+		{ after(grammarAccess.getPostfixUnaryExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIncrementOrDecrementPostfixExpression
+entryRuleIncrementOrDecrementPostfixExpression
+:
+{ before(grammarAccess.getIncrementOrDecrementPostfixExpressionRule()); }
+	 ruleIncrementOrDecrementPostfixExpression
+{ after(grammarAccess.getIncrementOrDecrementPostfixExpressionRule()); } 
+	 EOF 
+;
+
+// Rule IncrementOrDecrementPostfixExpression
+ruleIncrementOrDecrementPostfixExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getGroup()); }
+		(rule__IncrementOrDecrementPostfixExpression__Group__0)
+		{ after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrefixUnaryExpression
+entryRulePrefixUnaryExpression
+:
+{ before(grammarAccess.getPrefixUnaryExpressionRule()); }
+	 rulePrefixUnaryExpression
+{ after(grammarAccess.getPrefixUnaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule PrefixUnaryExpression
+rulePrefixUnaryExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrefixUnaryExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall()); }
+		ruleIncrementOrDecrementPrefixExpression
+		{ after(grammarAccess.getPrefixUnaryExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleIncrementOrDecrementPrefixExpression
+entryRuleIncrementOrDecrementPrefixExpression
+:
+{ before(grammarAccess.getIncrementOrDecrementPrefixExpressionRule()); }
+	 ruleIncrementOrDecrementPrefixExpression
+{ after(grammarAccess.getIncrementOrDecrementPrefixExpressionRule()); } 
+	 EOF 
+;
+
+// Rule IncrementOrDecrementPrefixExpression
+ruleIncrementOrDecrementPrefixExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getGroup()); }
+		(rule__IncrementOrDecrementPrefixExpression__Group__0)
+		{ after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleAffixOperator
+entryRuleAffixOperator
+:
+{ before(grammarAccess.getAffixOperatorRule()); }
+	 ruleAffixOperator
+{ after(grammarAccess.getAffixOperatorRule()); } 
+	 EOF 
+;
+
+// Rule AffixOperator
+ruleAffixOperator 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getAffixOperatorAccess().getAlternatives()); }
+		(rule__AffixOperator__Alternatives)
+		{ after(grammarAccess.getAffixOperatorAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleNewfreshExpression
+entryRuleNewfreshExpression
+:
+{ before(grammarAccess.getNewfreshExpressionRule()); }
+	 ruleNewfreshExpression
+{ after(grammarAccess.getNewfreshExpressionRule()); } 
+	 EOF 
+;
+
+// Rule NewfreshExpression
+ruleNewfreshExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getNewfreshExpressionAccess().getAlternatives()); }
+		(rule__NewfreshExpression__Alternatives)
+		{ after(grammarAccess.getNewfreshExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleCastExpression
+entryRuleCastExpression
+:
+{ before(grammarAccess.getCastExpressionRule()); }
+	 ruleCastExpression
+{ after(grammarAccess.getCastExpressionRule()); } 
+	 EOF 
+;
+
+// Rule CastExpression
+ruleCastExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getCastExpressionAccess().getGroup()); }
+		(rule__CastExpression__Group__0)
+		{ after(grammarAccess.getCastExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleArithmeticUnaryExpression
+entryRuleArithmeticUnaryExpression
+:
+{ before(grammarAccess.getArithmeticUnaryExpressionRule()); }
+	 ruleArithmeticUnaryExpression
+{ after(grammarAccess.getArithmeticUnaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule ArithmeticUnaryExpression
+ruleArithmeticUnaryExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getArithmeticUnaryExpressionAccess().getGroup()); }
+		(rule__ArithmeticUnaryExpression__Group__0)
+		{ after(grammarAccess.getArithmeticUnaryExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleArithmeticUnaryOperator
+entryRuleArithmeticUnaryOperator
+:
+{ before(grammarAccess.getArithmeticUnaryOperatorRule()); }
+	 ruleArithmeticUnaryOperator
+{ after(grammarAccess.getArithmeticUnaryOperatorRule()); } 
+	 EOF 
+;
+
+// Rule ArithmeticUnaryOperator
+ruleArithmeticUnaryOperator 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getArithmeticUnaryOperatorAccess().getAlternatives()); }
+		(rule__ArithmeticUnaryOperator__Alternatives)
+		{ after(grammarAccess.getArithmeticUnaryOperatorAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLogicalUnaryExpression
+entryRuleLogicalUnaryExpression
+:
+{ before(grammarAccess.getLogicalUnaryExpressionRule()); }
+	 ruleLogicalUnaryExpression
+{ after(grammarAccess.getLogicalUnaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LogicalUnaryExpression
+ruleLogicalUnaryExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLogicalUnaryExpressionAccess().getGroup()); }
+		(rule__LogicalUnaryExpression__Group__0)
+		{ after(grammarAccess.getLogicalUnaryExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBitwiseUnaryExpression
+entryRuleBitwiseUnaryExpression
+:
+{ before(grammarAccess.getBitwiseUnaryExpressionRule()); }
+	 ruleBitwiseUnaryExpression
+{ after(grammarAccess.getBitwiseUnaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule BitwiseUnaryExpression
+ruleBitwiseUnaryExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBitwiseUnaryExpressionAccess().getGroup()); }
+		(rule__BitwiseUnaryExpression__Group__0)
+		{ after(grammarAccess.getBitwiseUnaryExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePrimaryExpression
+entryRulePrimaryExpression
+:
+{ before(grammarAccess.getPrimaryExpressionRule()); }
+	 rulePrimaryExpression
+{ after(grammarAccess.getPrimaryExpressionRule()); } 
+	 EOF 
+;
+
+// Rule PrimaryExpression
+rulePrimaryExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup()); }
+		(rule__PrimaryExpression__Group__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleBaseExpression
+entryRuleBaseExpression
+:
+{ before(grammarAccess.getBaseExpressionRule()); }
+	 ruleBaseExpression
+{ after(grammarAccess.getBaseExpressionRule()); } 
+	 EOF 
+;
+
+// Rule BaseExpression
+ruleBaseExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getBaseExpressionAccess().getAlternatives()); }
+		(rule__BaseExpression__Alternatives)
+		{ after(grammarAccess.getBaseExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleInvokeExpressionDeprecated
+entryRuleInvokeExpressionDeprecated
+:
+{ before(grammarAccess.getInvokeExpressionDeprecatedRule()); }
+	 ruleInvokeExpressionDeprecated
+{ after(grammarAccess.getInvokeExpressionDeprecatedRule()); } 
+	 EOF 
+;
+
+// Rule InvokeExpressionDeprecated
+ruleInvokeExpressionDeprecated 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getGroup()); }
+		(rule__InvokeExpressionDeprecated__Group__0)
+		{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleInstantiationExpression
+entryRuleInstantiationExpression
+:
+{ before(grammarAccess.getInstantiationExpressionRule()); }
+	 ruleInstantiationExpression
+{ after(grammarAccess.getInstantiationExpressionRule()); } 
+	 EOF 
+;
+
+// Rule InstantiationExpression
+ruleInstantiationExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getInstantiationExpressionAccess().getGroup()); }
+		(rule__InstantiationExpression__Group__0)
+		{ after(grammarAccess.getInstantiationExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDynamicInstanceSpecification
+entryRuleDynamicInstanceSpecification
+:
+{ before(grammarAccess.getDynamicInstanceSpecificationRule()); }
+	 ruleDynamicInstanceSpecification
+{ after(grammarAccess.getDynamicInstanceSpecificationRule()); } 
+	 EOF 
+;
+
+// Rule DynamicInstanceSpecification
+ruleDynamicInstanceSpecification 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup()); }
+		(rule__DynamicInstanceSpecification__Group__0)
+		{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleTupleParameterExpression
+entryRuleTupleParameterExpression
+:
+{ before(grammarAccess.getTupleParameterExpressionRule()); }
+	 ruleTupleParameterExpression
+{ after(grammarAccess.getTupleParameterExpressionRule()); } 
+	 EOF 
+;
+
+// Rule TupleParameterExpression
+ruleTupleParameterExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getTupleParameterExpressionAccess().getGroup()); }
+		(rule__TupleParameterExpression__Group__0)
+		{ after(grammarAccess.getTupleParameterExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleMixTupleExpressionList
+entryRuleMixTupleExpressionList
+:
+{ before(grammarAccess.getMixTupleExpressionListRule()); }
+	 ruleMixTupleExpressionList
+{ after(grammarAccess.getMixTupleExpressionListRule()); } 
+	 EOF 
+;
+
+// Rule MixTupleExpressionList
+ruleMixTupleExpressionList 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getMixTupleExpressionListAccess().getGroup()); }
+		(rule__MixTupleExpressionList__Group__0)
+		{ after(grammarAccess.getMixTupleExpressionListAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePositionalTupleExpressionList
+entryRulePositionalTupleExpressionList
+:
+{ before(grammarAccess.getPositionalTupleExpressionListRule()); }
+	 rulePositionalTupleExpressionList
+{ after(grammarAccess.getPositionalTupleExpressionListRule()); } 
+	 EOF 
+;
+
+// Rule PositionalTupleExpressionList
+rulePositionalTupleExpressionList 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPositionalTupleExpressionListAccess().getGroup()); }
+		(rule__PositionalTupleExpressionList__Group__0)
+		{ after(grammarAccess.getPositionalTupleExpressionListAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleNamedExpression
+entryRuleNamedExpression
+:
+{ before(grammarAccess.getNamedExpressionRule()); }
+	 ruleNamedExpression
+{ after(grammarAccess.getNamedExpressionRule()); } 
+	 EOF 
+;
+
+// Rule NamedExpression
+ruleNamedExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getNamedExpressionAccess().getGroup()); }
+		(rule__NamedExpression__Group__0)
+		{ after(grammarAccess.getNamedExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralReferenceableExpression
+entryRuleLiteralReferenceableExpression
+:
+{ before(grammarAccess.getLiteralReferenceableExpressionRule()); }
+	 ruleLiteralReferenceableExpression
+{ after(grammarAccess.getLiteralReferenceableExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralReferenceableExpression
+ruleLiteralReferenceableExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralReferenceableExpressionAccess().getAlternatives()); }
+		(rule__LiteralReferenceableExpression__Alternatives)
+		{ after(grammarAccess.getLiteralReferenceableExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralTerminalExpression
+entryRuleLiteralTerminalExpression
+:
+{ before(grammarAccess.getLiteralTerminalExpressionRule()); }
+	 ruleLiteralTerminalExpression
+{ after(grammarAccess.getLiteralTerminalExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralTerminalExpression
+ruleLiteralTerminalExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralTerminalExpressionAccess().getAlternatives()); }
+		(rule__LiteralTerminalExpression__Alternatives)
+		{ after(grammarAccess.getLiteralTerminalExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralBooleanExpression
+entryRuleLiteralBooleanExpression
+:
+{ before(grammarAccess.getLiteralBooleanExpressionRule()); }
+	 ruleLiteralBooleanExpression
+{ after(grammarAccess.getLiteralBooleanExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralBooleanExpression
+ruleLiteralBooleanExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralBooleanExpressionAccess().getGroup()); }
+		(rule__LiteralBooleanExpression__Group__0)
+		{ after(grammarAccess.getLiteralBooleanExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralIntegerExpression
+entryRuleLiteralIntegerExpression
+:
+{ before(grammarAccess.getLiteralIntegerExpressionRule()); }
+	 ruleLiteralIntegerExpression
+{ after(grammarAccess.getLiteralIntegerExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralIntegerExpression
+ruleLiteralIntegerExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralIntegerExpressionAccess().getGroup()); }
+		(rule__LiteralIntegerExpression__Group__0)
+		{ after(grammarAccess.getLiteralIntegerExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralRationalExpression
+entryRuleLiteralRationalExpression
+:
+{ before(grammarAccess.getLiteralRationalExpressionRule()); }
+	 ruleLiteralRationalExpression
+{ after(grammarAccess.getLiteralRationalExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralRationalExpression
+ruleLiteralRationalExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralRationalExpressionAccess().getGroup()); }
+		(rule__LiteralRationalExpression__Group__0)
+		{ after(grammarAccess.getLiteralRationalExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralFloatExpression
+entryRuleLiteralFloatExpression
+:
+{ before(grammarAccess.getLiteralFloatExpressionRule()); }
+	 ruleLiteralFloatExpression
+{ after(grammarAccess.getLiteralFloatExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralFloatExpression
+ruleLiteralFloatExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralFloatExpressionAccess().getGroup()); }
+		(rule__LiteralFloatExpression__Group__0)
+		{ after(grammarAccess.getLiteralFloatExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralCharacterExpression
+entryRuleLiteralCharacterExpression
+:
+{ before(grammarAccess.getLiteralCharacterExpressionRule()); }
+	 ruleLiteralCharacterExpression
+{ after(grammarAccess.getLiteralCharacterExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralCharacterExpression
+ruleLiteralCharacterExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralCharacterExpressionAccess().getGroup()); }
+		(rule__LiteralCharacterExpression__Group__0)
+		{ after(grammarAccess.getLiteralCharacterExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralStringExpression
+entryRuleLiteralStringExpression
+:
+{ before(grammarAccess.getLiteralStringExpressionRule()); }
+	 ruleLiteralStringExpression
+{ after(grammarAccess.getLiteralStringExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralStringExpression
+ruleLiteralStringExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralStringExpressionAccess().getGroup()); }
+		(rule__LiteralStringExpression__Group__0)
+		{ after(grammarAccess.getLiteralStringExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralNullExpression
+entryRuleLiteralNullExpression
+:
+{ before(grammarAccess.getLiteralNullExpressionRule()); }
+	 ruleLiteralNullExpression
+{ after(grammarAccess.getLiteralNullExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralNullExpression
+ruleLiteralNullExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralNullExpressionAccess().getAlternatives()); }
+		(rule__LiteralNullExpression__Alternatives)
+		{ after(grammarAccess.getLiteralNullExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralCollectionExpression
+entryRuleLiteralCollectionExpression
+:
+{ before(grammarAccess.getLiteralCollectionExpressionRule()); }
+	 ruleLiteralCollectionExpression
+{ after(grammarAccess.getLiteralCollectionExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralCollectionExpression
+ruleLiteralCollectionExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getGroup()); }
+		(rule__LiteralCollectionExpression__Group__0)
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralReferenceExpression
+entryRuleLiteralReferenceExpression
+:
+{ before(grammarAccess.getLiteralReferenceExpressionRule()); }
+	 ruleLiteralReferenceExpression
+{ after(grammarAccess.getLiteralReferenceExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralReferenceExpression
+ruleLiteralReferenceExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralReferenceExpressionAccess().getAlternatives()); }
+		(rule__LiteralReferenceExpression__Alternatives)
+		{ after(grammarAccess.getLiteralReferenceExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralReferenceElement
+entryRuleLiteralReferenceElement
+:
+{ before(grammarAccess.getLiteralReferenceElementRule()); }
+	 ruleLiteralReferenceElement
+{ after(grammarAccess.getLiteralReferenceElementRule()); } 
+	 EOF 
+;
+
+// Rule LiteralReferenceElement
+ruleLiteralReferenceElement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralReferenceElementAccess().getGroup()); }
+		(rule__LiteralReferenceElement__Group__0)
+		{ after(grammarAccess.getLiteralReferenceElementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralPureReferenceElement
+entryRuleLiteralPureReferenceElement
+:
+{ before(grammarAccess.getLiteralPureReferenceElementRule()); }
+	 ruleLiteralPureReferenceElement
+{ after(grammarAccess.getLiteralPureReferenceElementRule()); } 
+	 EOF 
+;
+
+// Rule LiteralPureReferenceElement
+ruleLiteralPureReferenceElement 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralPureReferenceElementAccess().getGroup()); }
+		(rule__LiteralPureReferenceElement__Group__0)
+		{ after(grammarAccess.getLiteralPureReferenceElementAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralReferenceVariableContext
+entryRuleLiteralReferenceVariableContext
+:
+{ before(grammarAccess.getLiteralReferenceVariableContextRule()); }
+	 ruleLiteralReferenceVariableContext
+{ after(grammarAccess.getLiteralReferenceVariableContextRule()); } 
+	 EOF 
+;
+
+// Rule LiteralReferenceVariableContext
+ruleLiteralReferenceVariableContext 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralReferenceVariableContextAccess().getAlternatives()); }
+		(rule__LiteralReferenceVariableContext__Alternatives)
+		{ after(grammarAccess.getLiteralReferenceVariableContextAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralTimeExpression
+entryRuleLiteralTimeExpression
+:
+{ before(grammarAccess.getLiteralTimeExpressionRule()); }
+	 ruleLiteralTimeExpression
+{ after(grammarAccess.getLiteralTimeExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralTimeExpression
+ruleLiteralTimeExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralTimeExpressionAccess().getGroup()); }
+		(rule__LiteralTimeExpression__Group__0)
+		{ after(grammarAccess.getLiteralTimeExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralTimeDeltaExpression
+entryRuleLiteralTimeDeltaExpression
+:
+{ before(grammarAccess.getLiteralTimeDeltaExpressionRule()); }
+	 ruleLiteralTimeDeltaExpression
+{ after(grammarAccess.getLiteralTimeDeltaExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralTimeDeltaExpression
+ruleLiteralTimeDeltaExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralTimeDeltaExpressionAccess().getGroup()); }
+		(rule__LiteralTimeDeltaExpression__Group__0)
+		{ after(grammarAccess.getLiteralTimeDeltaExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralReferenceMachineContext
+entryRuleLiteralReferenceMachineContext
+:
+{ before(grammarAccess.getLiteralReferenceMachineContextRule()); }
+	 ruleLiteralReferenceMachineContext
+{ after(grammarAccess.getLiteralReferenceMachineContextRule()); } 
+	 EOF 
+;
+
+// Rule LiteralReferenceMachineContext
+ruleLiteralReferenceMachineContext 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralReferenceMachineContextAccess().getAlternatives()); }
+		(rule__LiteralReferenceMachineContext__Alternatives)
+		{ after(grammarAccess.getLiteralReferenceMachineContextAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralThisExpression
+entryRuleLiteralThisExpression
+:
+{ before(grammarAccess.getLiteralThisExpressionRule()); }
+	 ruleLiteralThisExpression
+{ after(grammarAccess.getLiteralThisExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralThisExpression
+ruleLiteralThisExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralThisExpressionAccess().getGroup()); }
+		(rule__LiteralThisExpression__Group__0)
+		{ after(grammarAccess.getLiteralThisExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralSelfExpression
+entryRuleLiteralSelfExpression
+:
+{ before(grammarAccess.getLiteralSelfExpressionRule()); }
+	 ruleLiteralSelfExpression
+{ after(grammarAccess.getLiteralSelfExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralSelfExpression
+ruleLiteralSelfExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralSelfExpressionAccess().getGroup()); }
+		(rule__LiteralSelfExpression__Group__0)
+		{ after(grammarAccess.getLiteralSelfExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralParentExpression
+entryRuleLiteralParentExpression
+:
+{ before(grammarAccess.getLiteralParentExpressionRule()); }
+	 ruleLiteralParentExpression
+{ after(grammarAccess.getLiteralParentExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralParentExpression
+ruleLiteralParentExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralParentExpressionAccess().getGroup()); }
+		(rule__LiteralParentExpression__Group__0)
+		{ after(grammarAccess.getLiteralParentExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralSuperExpression
+entryRuleLiteralSuperExpression
+:
+{ before(grammarAccess.getLiteralSuperExpressionRule()); }
+	 ruleLiteralSuperExpression
+{ after(grammarAccess.getLiteralSuperExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralSuperExpression
+ruleLiteralSuperExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralSuperExpressionAccess().getGroup()); }
+		(rule__LiteralSuperExpression__Group__0)
+		{ after(grammarAccess.getLiteralSuperExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralSystemExpression
+entryRuleLiteralSystemExpression
+:
+{ before(grammarAccess.getLiteralSystemExpressionRule()); }
+	 ruleLiteralSystemExpression
+{ after(grammarAccess.getLiteralSystemExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralSystemExpression
+ruleLiteralSystemExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralSystemExpressionAccess().getGroup()); }
+		(rule__LiteralSystemExpression__Group__0)
+		{ after(grammarAccess.getLiteralSystemExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralEnvExpression
+entryRuleLiteralEnvExpression
+:
+{ before(grammarAccess.getLiteralEnvExpressionRule()); }
+	 ruleLiteralEnvExpression
+{ after(grammarAccess.getLiteralEnvExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralEnvExpression
+ruleLiteralEnvExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralEnvExpressionAccess().getGroup()); }
+		(rule__LiteralEnvExpression__Group__0)
+		{ after(grammarAccess.getLiteralEnvExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLiteralPureReferenceExpression
+entryRuleLiteralPureReferenceExpression
+:
+{ before(grammarAccess.getLiteralPureReferenceExpressionRule()); }
+	 ruleLiteralPureReferenceExpression
+{ after(grammarAccess.getLiteralPureReferenceExpressionRule()); } 
+	 EOF 
+;
+
+// Rule LiteralPureReferenceExpression
+ruleLiteralPureReferenceExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLiteralPureReferenceExpressionAccess().getAlternatives()); }
+		(rule__LiteralPureReferenceExpression__Alternatives)
+		{ after(grammarAccess.getLiteralPureReferenceExpressionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleValueSelectionExpression
+entryRuleValueSelectionExpression
+:
+{ before(grammarAccess.getValueSelectionExpressionRule()); }
+	 ruleValueSelectionExpression
+{ after(grammarAccess.getValueSelectionExpressionRule()); } 
+	 EOF 
+;
+
+// Rule ValueSelectionExpression
+ruleValueSelectionExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getGroup()); }
+		(rule__ValueSelectionExpression__Group__0)
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleValuePureNamedMachineExpression
+entryRuleValuePureNamedMachineExpression
+:
+{ before(grammarAccess.getValuePureNamedMachineExpressionRule()); }
+	 ruleValuePureNamedMachineExpression
+{ after(grammarAccess.getValuePureNamedMachineExpressionRule()); } 
+	 EOF 
+;
+
+// Rule ValuePureNamedMachineExpression
+ruleValuePureNamedMachineExpression 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup()); }
+		(rule__ValuePureNamedMachineExpression__Group__0)
+		{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule VisibilityKind
+ruleVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVisibilityKindAccess().getAlternatives()); }
+		(rule__VisibilityKind__Alternatives)
+		{ after(grammarAccess.getVisibilityKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule DesignKind
+ruleDesignKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDesignKindAccess().getAlternatives()); }
+		(rule__DesignKind__Alternatives)
+		{ after(grammarAccess.getDesignKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PseudostateKind
+rulePseudostateKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateKindAccess().getAlternatives()); }
+		(rule__PseudostateKind__Alternatives)
+		{ after(grammarAccess.getPseudostateKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PseudostateInitialKind
+rulePseudostateInitialKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration()); }
+		('initial')
+		{ after(grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule EndingPseudostateKind
+ruleEndingPseudostateKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEndingPseudostateKindAccess().getAlternatives()); }
+		(rule__EndingPseudostateKind__Alternatives)
+		{ after(grammarAccess.getEndingPseudostateKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ComProtocolKind
+ruleComProtocolKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolKindAccess().getAlternatives()); }
+		(rule__ComProtocolKind__Alternatives)
+		{ after(grammarAccess.getComProtocolKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ComEnvRdvProtocolKind
+ruleComEnvRdvProtocolKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComEnvRdvProtocolKindAccess().getAlternatives()); }
+		(rule__ComEnvRdvProtocolKind__Alternatives)
+		{ after(grammarAccess.getComEnvRdvProtocolKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ComMultiRdvProtocolKind
+ruleComMultiRdvProtocolKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration()); }
+		('multi_rdv')
+		{ after(grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule BufferProtocolKind
+ruleBufferProtocolKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration()); }
+		('buffer')
+		{ after(grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ComCastKing
+ruleComCastKing
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComCastKingAccess().getAlternatives()); }
+		(rule__ComCastKing__Alternatives)
+		{ after(grammarAccess.getComCastKingAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PrimitiveNumberSign
+rulePrimitiveNumberSign
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveNumberSignAccess().getAlternatives()); }
+		(rule__PrimitiveNumberSign__Alternatives)
+		{ after(grammarAccess.getPrimitiveNumberSignAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PrimitiveInstanceKind
+rulePrimitiveInstanceKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveInstanceKindAccess().getAlternatives()); }
+		(rule__PrimitiveInstanceKind__Alternatives)
+		{ after(grammarAccess.getPrimitiveInstanceKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule CollectionKind
+ruleCollectionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionKindAccess().getAlternatives()); }
+		(rule__CollectionKind__Alternatives)
+		{ after(grammarAccess.getCollectionKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PublicVariableVisibilityKind
+rulePublicVariableVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPublicVariableVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+		('var')
+		{ after(grammarAccess.getPublicVariableVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ProtectedVariableVisibilityKind
+ruleProtectedVariableVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProtectedVariableVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+		('var')
+		{ after(grammarAccess.getProtectedVariableVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PrivateVariableVisibilityKind
+rulePrivateVariableVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrivateVariableVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+		('var')
+		{ after(grammarAccess.getPrivateVariableVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ParameterDirectionKind
+ruleParameterDirectionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterDirectionKindAccess().getAlternatives()); }
+		(rule__ParameterDirectionKind__Alternatives)
+		{ after(grammarAccess.getParameterDirectionKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule BlockParameterDirectionKind
+ruleBlockParameterDirectionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBlockParameterDirectionKindAccess().getAlternatives()); }
+		(rule__BlockParameterDirectionKind__Alternatives)
+		{ after(grammarAccess.getBlockParameterDirectionKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ParameterInputDirectionKind
+ruleParameterInputDirectionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInputDirectionKindAccess().getInEnumLiteralDeclaration()); }
+		('var')
+		{ after(grammarAccess.getParameterInputDirectionKindAccess().getInEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ParameterInoutDirectionKind
+ruleParameterInoutDirectionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInoutDirectionKindAccess().getInoutEnumLiteralDeclaration()); }
+		('var')
+		{ after(grammarAccess.getParameterInoutDirectionKindAccess().getInoutEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ParameterOutputDirectionKind
+ruleParameterOutputDirectionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterOutputDirectionKindAccess().getOutEnumLiteralDeclaration()); }
+		('var')
+		{ after(grammarAccess.getParameterOutputDirectionKindAccess().getOutEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ParameterReturnDirectionKind
+ruleParameterReturnDirectionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterReturnDirectionKindAccess().getReturnEnumLiteralDeclaration()); }
+		('var')
+		{ after(grammarAccess.getParameterReturnDirectionKindAccess().getReturnEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule BufferContainerKind
+ruleBufferContainerKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferContainerKindAccess().getAlternatives()); }
+		(rule__BufferContainerKind__Alternatives)
+		{ after(grammarAccess.getBufferContainerKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PublicBufferVisibilityKind
+rulePublicBufferVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPublicBufferVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+		('buffer')
+		{ after(grammarAccess.getPublicBufferVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ProtectedBufferVisibilityKind
+ruleProtectedBufferVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProtectedBufferVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+		('buffer')
+		{ after(grammarAccess.getProtectedBufferVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PrivateBufferVisibilityKind
+rulePrivateBufferVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrivateBufferVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+		('buffer')
+		{ after(grammarAccess.getPrivateBufferVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PublicPortVisibilityKind
+rulePublicPortVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPublicPortVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+		('port')
+		{ after(grammarAccess.getPublicPortVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ProtectedPortVisibilityKind
+ruleProtectedPortVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProtectedPortVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+		('port')
+		{ after(grammarAccess.getProtectedPortVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PrivatePortVisibilityKind
+rulePrivatePortVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrivatePortVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+		('port')
+		{ after(grammarAccess.getPrivatePortVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PublicSignalVisibilityKind
+rulePublicSignalVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPublicSignalVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+		('signal')
+		{ after(grammarAccess.getPublicSignalVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ProtectedSignalVisibilityKind
+ruleProtectedSignalVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProtectedSignalVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+		('signal')
+		{ after(grammarAccess.getProtectedSignalVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PrivateSignalVisibilityKind
+rulePrivateSignalVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrivateSignalVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+		('signal')
+		{ after(grammarAccess.getPrivateSignalVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ChannelDirection
+ruleChannelDirection
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelDirectionAccess().getAlternatives()); }
+		(rule__ChannelDirection__Alternatives)
+		{ after(grammarAccess.getChannelDirectionAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PublicChannelVisibilityKind
+rulePublicChannelVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPublicChannelVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+		('channel')
+		{ after(grammarAccess.getPublicChannelVisibilityKindAccess().getPublicEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ProtectedChannelVisibilityKind
+ruleProtectedChannelVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProtectedChannelVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+		('channel')
+		{ after(grammarAccess.getProtectedChannelVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule PrivateChannelVisibilityKind
+rulePrivateChannelVisibilityKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrivateChannelVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+		('channel')
+		{ after(grammarAccess.getPrivateChannelVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule TransitionMoc
+ruleTransitionMoc
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionMocAccess().getAlternatives()); }
+		(rule__TransitionMoc__Alternatives)
+		{ after(grammarAccess.getTransitionMocAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule InterruptStatementKind
+ruleInterruptStatementKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInterruptStatementKindAccess().getAlternatives()); }
+		(rule__InterruptStatementKind__Alternatives)
+		{ after(grammarAccess.getInterruptStatementKindAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule OPERATOR_ACTIVITY
+ruleOPERATOR_ACTIVITY
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getAlternatives()); }
+		(rule__OPERATOR_ACTIVITY__Alternatives)
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ValueDotFieldExpressionKind
+ruleValueDotFieldExpressionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration()); }
+		('.')
+		{ after(grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ValueArrowFieldExpressionKind
+ruleValueArrowFieldExpressionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration()); }
+		('->')
+		{ after(grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ValueIndexExpressionKind
+ruleValueIndexExpressionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration()); }
+		('[')
+		{ after(grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Rule ValueParameterExpressionKind
+ruleValueParameterExpressionKind
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration()); }
+		('(')
+		{ after(grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__NameAlternatives_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaPrologObjectAccess().getNameFormalMLKeyword_0_0_0()); }
+		'@FormalML'
+		{ after(grammarAccess.getXliaPrologObjectAccess().getNameFormalMLKeyword_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXliaPrologObjectAccess().getNameXliaKeyword_0_0_1()); }
+		'@xlia'
+		{ after(grammarAccess.getXliaPrologObjectAccess().getNameXliaKeyword_0_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXliaPrologObjectAccess().getNameXfspKeyword_0_0_2()); }
+		'@xfsp'
+		{ after(grammarAccess.getXliaPrologObjectAccess().getNameXfspKeyword_0_0_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__NameAlternatives_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaPrologAttributeAccess().getNameSystemKeyword_0_0_0()); }
+		'system'
+		{ after(grammarAccess.getXliaPrologAttributeAccess().getNameSystemKeyword_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXliaPrologAttributeAccess().getNamePackageKeyword_0_0_1()); }
+		'package'
+		{ after(grammarAccess.getXliaPrologAttributeAccess().getNamePackageKeyword_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__ValueAlternatives_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralFloatExpressionParserRuleCall_1_1_0_0()); }
+		ruleLiteralFloatExpression
+		{ after(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralFloatExpressionParserRuleCall_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralStringExpressionParserRuleCall_1_1_0_1()); }
+		ruleLiteralStringExpression
+		{ after(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralStringExpressionParserRuleCall_1_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaNamedElement__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaNamedElementAccess().getXliaObjectParserRuleCall_0()); }
+		ruleXliaObject
+		{ after(grammarAccess.getXliaNamedElementAccess().getXliaObjectParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getXliaNamedElementAccess().getXliaAttributeParserRuleCall_1()); }
+		ruleXliaAttribute
+		{ after(grammarAccess.getXliaNamedElementAccess().getXliaAttributeParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EBoolean__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEBooleanAccess().getTrueKeyword_0()); }
+		'true'
+		{ after(grammarAccess.getEBooleanAccess().getTrueKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEBooleanAccess().getFalseKeyword_1()); }
+		'false'
+		{ after(grammarAccess.getEBooleanAccess().getFalseKeyword_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ESUfid__Alternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getESUfidAccess().getFullStopKeyword_1_0_0()); }
+		'.'
+		{ after(grammarAccess.getESUfidAccess().getFullStopKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getESUfidAccess().getColonKeyword_1_0_1()); }
+		':'
+		{ after(grammarAccess.getESUfidAccess().getColonKeyword_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getESUfidAccess().getColonColonKeyword_1_0_2()); }
+		'::'
+		{ after(grammarAccess.getESUfidAccess().getColonColonKeyword_1_0_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getTimedAssignment_0_1_0()); }
+		(rule__System__TimedAssignment_0_1_0)
+		{ after(grammarAccess.getSystemAccess().getTimedAssignment_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getInput_enabledAssignment_0_1_1()); }
+		(rule__System__Input_enabledAssignment_0_1_1)
+		{ after(grammarAccess.getSystemAccess().getInput_enabledAssignment_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getAndKeyword_2_2_0()); }
+		'and'
+		{ after(grammarAccess.getSystemAccess().getAndKeyword_2_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getOrKeyword_2_2_1()); }
+		'or'
+		{ after(grammarAccess.getSystemAccess().getOrKeyword_2_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortAssignment_6_0()); }
+		(rule__System__PortAssignment_6_0)
+		{ after(grammarAccess.getSystemAccess().getPortAssignment_6_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalAssignment_6_1()); }
+		(rule__System__SignalAssignment_6_1)
+		{ after(grammarAccess.getSystemAccess().getSignalAssignment_6_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferAssignment_6_2()); }
+		(rule__System__BufferAssignment_6_2)
+		{ after(grammarAccess.getSystemAccess().getBufferAssignment_6_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelAssignment_6_3()); }
+		(rule__System__ChannelAssignment_6_3)
+		{ after(grammarAccess.getSystemAccess().getChannelAssignment_6_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefAssignment_6_4()); }
+		(rule__System__TypedefAssignment_6_4)
+		{ after(grammarAccess.getSystemAccess().getTypedefAssignment_6_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyAssignment_6_5()); }
+		(rule__System__PropertyAssignment_6_5)
+		{ after(grammarAccess.getSystemAccess().getPropertyAssignment_6_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_7_0()); }
+		(rule__System__Group_7_0__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_7_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_7_1()); }
+		(rule__System__Group_7_1__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_7_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_7_2()); }
+		(rule__System__Group_7_2__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_7_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_7_3()); }
+		(rule__System__Group_7_3__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_7_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_7_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortAssignment_7_0_1_0()); }
+		(rule__System__PortAssignment_7_0_1_0)
+		{ after(grammarAccess.getSystemAccess().getPortAssignment_7_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalAssignment_7_0_1_1()); }
+		(rule__System__SignalAssignment_7_0_1_1)
+		{ after(grammarAccess.getSystemAccess().getSignalAssignment_7_0_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferAssignment_7_0_1_2()); }
+		(rule__System__BufferAssignment_7_0_1_2)
+		{ after(grammarAccess.getSystemAccess().getBufferAssignment_7_0_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelAssignment_7_0_1_3()); }
+		(rule__System__ChannelAssignment_7_0_1_3)
+		{ after(grammarAccess.getSystemAccess().getChannelAssignment_7_0_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefAssignment_7_0_1_4()); }
+		(rule__System__TypedefAssignment_7_0_1_4)
+		{ after(grammarAccess.getSystemAccess().getTypedefAssignment_7_0_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyAssignment_7_0_1_5()); }
+		(rule__System__PropertyAssignment_7_0_1_5)
+		{ after(grammarAccess.getSystemAccess().getPropertyAssignment_7_0_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_7_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortAssignment_7_1_1_0()); }
+		(rule__System__PortAssignment_7_1_1_0)
+		{ after(grammarAccess.getSystemAccess().getPortAssignment_7_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalAssignment_7_1_1_1()); }
+		(rule__System__SignalAssignment_7_1_1_1)
+		{ after(grammarAccess.getSystemAccess().getSignalAssignment_7_1_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferAssignment_7_1_1_2()); }
+		(rule__System__BufferAssignment_7_1_1_2)
+		{ after(grammarAccess.getSystemAccess().getBufferAssignment_7_1_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelAssignment_7_1_1_3()); }
+		(rule__System__ChannelAssignment_7_1_1_3)
+		{ after(grammarAccess.getSystemAccess().getChannelAssignment_7_1_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefAssignment_7_1_1_4()); }
+		(rule__System__TypedefAssignment_7_1_1_4)
+		{ after(grammarAccess.getSystemAccess().getTypedefAssignment_7_1_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyAssignment_7_1_1_5()); }
+		(rule__System__PropertyAssignment_7_1_1_5)
+		{ after(grammarAccess.getSystemAccess().getPropertyAssignment_7_1_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_7_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortAssignment_7_2_1_0()); }
+		(rule__System__PortAssignment_7_2_1_0)
+		{ after(grammarAccess.getSystemAccess().getPortAssignment_7_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalAssignment_7_2_1_1()); }
+		(rule__System__SignalAssignment_7_2_1_1)
+		{ after(grammarAccess.getSystemAccess().getSignalAssignment_7_2_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferAssignment_7_2_1_2()); }
+		(rule__System__BufferAssignment_7_2_1_2)
+		{ after(grammarAccess.getSystemAccess().getBufferAssignment_7_2_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelAssignment_7_2_1_3()); }
+		(rule__System__ChannelAssignment_7_2_1_3)
+		{ after(grammarAccess.getSystemAccess().getChannelAssignment_7_2_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefAssignment_7_2_1_4()); }
+		(rule__System__TypedefAssignment_7_2_1_4)
+		{ after(grammarAccess.getSystemAccess().getTypedefAssignment_7_2_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyAssignment_7_2_1_5()); }
+		(rule__System__PropertyAssignment_7_2_1_5)
+		{ after(grammarAccess.getSystemAccess().getPropertyAssignment_7_2_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_7_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortAssignment_7_3_1_0()); }
+		(rule__System__PortAssignment_7_3_1_0)
+		{ after(grammarAccess.getSystemAccess().getPortAssignment_7_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalAssignment_7_3_1_1()); }
+		(rule__System__SignalAssignment_7_3_1_1)
+		{ after(grammarAccess.getSystemAccess().getSignalAssignment_7_3_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferAssignment_7_3_1_2()); }
+		(rule__System__BufferAssignment_7_3_1_2)
+		{ after(grammarAccess.getSystemAccess().getBufferAssignment_7_3_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelAssignment_7_3_1_3()); }
+		(rule__System__ChannelAssignment_7_3_1_3)
+		{ after(grammarAccess.getSystemAccess().getChannelAssignment_7_3_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefAssignment_7_3_1_4()); }
+		(rule__System__TypedefAssignment_7_3_1_4)
+		{ after(grammarAccess.getSystemAccess().getTypedefAssignment_7_3_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyAssignment_7_3_1_5()); }
+		(rule__System__PropertyAssignment_7_3_1_5)
+		{ after(grammarAccess.getSystemAccess().getPropertyAssignment_7_3_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getAlternatives_8_0()); }
+		(rule__System__Alternatives_8_0)*
+		{ after(grammarAccess.getSystemAccess().getAlternatives_8_0()); }
+	)
+	|
+	(
+		(
+			{ before(grammarAccess.getSystemAccess().getAlternatives_8_1()); }
+			(rule__System__Alternatives_8_1)
+			{ after(grammarAccess.getSystemAccess().getAlternatives_8_1()); }
+		)
+		(
+			{ before(grammarAccess.getSystemAccess().getAlternatives_8_1()); }
+			(rule__System__Alternatives_8_1)*
+			{ after(grammarAccess.getSystemAccess().getAlternatives_8_1()); }
+		)
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_8_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_8_0_0()); }
+		(rule__System__Group_8_0_0__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_8_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_8_0_1()); }
+		(rule__System__Group_8_0_1__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_8_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_8_0_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getRoutineKeyword_8_0_0_0_0()); }
+		'@routine:'
+		{ after(grammarAccess.getSystemAccess().getRoutineKeyword_8_0_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getMacroKeyword_8_0_0_0_1()); }
+		'@macro:'
+		{ after(grammarAccess.getSystemAccess().getMacroKeyword_8_0_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_8_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getRoutineAssignment_8_1_0()); }
+		(rule__System__RoutineAssignment_8_1_0)
+		{ after(grammarAccess.getSystemAccess().getRoutineAssignment_8_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getProcedureAssignment_8_1_1()); }
+		(rule__System__ProcedureAssignment_8_1_1)
+		{ after(grammarAccess.getSystemAccess().getProcedureAssignment_8_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_9_0()); }
+		(rule__System__Group_9_0__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_9_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_9_1()); }
+		(rule__System__Group_9_1__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_9_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_9_2()); }
+		(rule__System__Group_9_2__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_9_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_9_3()); }
+		(rule__System__Group_9_3__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_9_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_9_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getCompositeKeyword_9_0_0_0()); }
+		'@composite:'
+		{ after(grammarAccess.getSystemAccess().getCompositeKeyword_9_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getMachineKeyword_9_0_0_1()); }
+		'@machine:'
+		{ after(grammarAccess.getSystemAccess().getMachineKeyword_9_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_9_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getMachineAssignment_9_0_1_0()); }
+		(rule__System__MachineAssignment_9_0_1_0)
+		{ after(grammarAccess.getSystemAccess().getMachineAssignment_9_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getInstanceAssignment_9_0_1_1()); }
+		(rule__System__InstanceAssignment_9_0_1_1)
+		{ after(grammarAccess.getSystemAccess().getInstanceAssignment_9_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Alternatives_10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_10_0()); }
+		(rule__System__Group_10_0__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_10_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSystemAccess().getGroup_10_1()); }
+		(rule__System__Group_10_1__0)
+		{ after(grammarAccess.getSystemAccess().getGroup_10_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AnyMachineBlock__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAnyMachineBlockAccess().getMachineBlockParserRuleCall_0()); }
+		ruleMachineBlock
+		{ after(grammarAccess.getAnyMachineBlockAccess().getMachineBlockParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAnyMachineBlockAccess().getStatemachineParserRuleCall_1()); }
+		ruleStatemachine
+		{ after(grammarAccess.getAnyMachineBlockAccess().getStatemachineParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getMachineKeyword_1_0()); }
+		'machine'
+		{ after(grammarAccess.getInstanceMachineAccess().getMachineKeyword_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getStatemachineKeyword_1_1()); }
+		'statemachine'
+		{ after(grammarAccess.getInstanceMachineAccess().getStatemachineKeyword_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getGroup_8_0()); }
+		(rule__InstanceMachine__Group_8_0__0)
+		{ after(grammarAccess.getInstanceMachineAccess().getGroup_8_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getGroup_8_1()); }
+		(rule__InstanceMachine__Group_8_1__0)
+		{ after(grammarAccess.getInstanceMachineAccess().getGroup_8_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTimedAssignment_0_1_0()); }
+		(rule__MachineBlock__TimedAssignment_0_1_0)
+		{ after(grammarAccess.getMachineBlockAccess().getTimedAssignment_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getInput_enabledAssignment_0_1_1()); }
+		(rule__MachineBlock__Input_enabledAssignment_0_1_1)
+		{ after(grammarAccess.getMachineBlockAccess().getInput_enabledAssignment_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getAndKeyword_2_2_0()); }
+		'and'
+		{ after(grammarAccess.getMachineBlockAccess().getAndKeyword_2_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getOrKeyword_2_2_1()); }
+		'or'
+		{ after(grammarAccess.getMachineBlockAccess().getOrKeyword_2_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortAssignment_6_0()); }
+		(rule__MachineBlock__PortAssignment_6_0)
+		{ after(grammarAccess.getMachineBlockAccess().getPortAssignment_6_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalAssignment_6_1()); }
+		(rule__MachineBlock__SignalAssignment_6_1)
+		{ after(grammarAccess.getMachineBlockAccess().getSignalAssignment_6_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferAssignment_6_2()); }
+		(rule__MachineBlock__BufferAssignment_6_2)
+		{ after(grammarAccess.getMachineBlockAccess().getBufferAssignment_6_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelAssignment_6_3()); }
+		(rule__MachineBlock__ChannelAssignment_6_3)
+		{ after(grammarAccess.getMachineBlockAccess().getChannelAssignment_6_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_6_4()); }
+		(rule__MachineBlock__TypedefAssignment_6_4)
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_6_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_6_5()); }
+		(rule__MachineBlock__PropertyAssignment_6_5)
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_6_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_7_0()); }
+		(rule__MachineBlock__Group_7_0__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_7_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_7_1()); }
+		(rule__MachineBlock__Group_7_1__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_7_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_7_2()); }
+		(rule__MachineBlock__Group_7_2__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_7_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_7_3()); }
+		(rule__MachineBlock__Group_7_3__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_7_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_7_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortAssignment_7_0_1_0()); }
+		(rule__MachineBlock__PortAssignment_7_0_1_0)
+		{ after(grammarAccess.getMachineBlockAccess().getPortAssignment_7_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_0_1_1()); }
+		(rule__MachineBlock__SignalAssignment_7_0_1_1)
+		{ after(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_0_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_0_1_2()); }
+		(rule__MachineBlock__BufferAssignment_7_0_1_2)
+		{ after(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_0_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_0_1_3()); }
+		(rule__MachineBlock__ChannelAssignment_7_0_1_3)
+		{ after(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_0_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_0_1_4()); }
+		(rule__MachineBlock__TypedefAssignment_7_0_1_4)
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_0_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_0_1_5()); }
+		(rule__MachineBlock__PropertyAssignment_7_0_1_5)
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_0_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_7_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortAssignment_7_1_1_0()); }
+		(rule__MachineBlock__PortAssignment_7_1_1_0)
+		{ after(grammarAccess.getMachineBlockAccess().getPortAssignment_7_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_1_1_1()); }
+		(rule__MachineBlock__SignalAssignment_7_1_1_1)
+		{ after(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_1_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_1_1_2()); }
+		(rule__MachineBlock__BufferAssignment_7_1_1_2)
+		{ after(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_1_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_1_1_3()); }
+		(rule__MachineBlock__ChannelAssignment_7_1_1_3)
+		{ after(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_1_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_1_1_4()); }
+		(rule__MachineBlock__TypedefAssignment_7_1_1_4)
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_1_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_1_1_5()); }
+		(rule__MachineBlock__PropertyAssignment_7_1_1_5)
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_1_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_7_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortAssignment_7_2_1_0()); }
+		(rule__MachineBlock__PortAssignment_7_2_1_0)
+		{ after(grammarAccess.getMachineBlockAccess().getPortAssignment_7_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_2_1_1()); }
+		(rule__MachineBlock__SignalAssignment_7_2_1_1)
+		{ after(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_2_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_2_1_2()); }
+		(rule__MachineBlock__BufferAssignment_7_2_1_2)
+		{ after(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_2_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_2_1_3()); }
+		(rule__MachineBlock__ChannelAssignment_7_2_1_3)
+		{ after(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_2_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_2_1_4()); }
+		(rule__MachineBlock__TypedefAssignment_7_2_1_4)
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_2_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_2_1_5()); }
+		(rule__MachineBlock__PropertyAssignment_7_2_1_5)
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_2_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_7_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortAssignment_7_3_1_0()); }
+		(rule__MachineBlock__PortAssignment_7_3_1_0)
+		{ after(grammarAccess.getMachineBlockAccess().getPortAssignment_7_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_3_1_1()); }
+		(rule__MachineBlock__SignalAssignment_7_3_1_1)
+		{ after(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_3_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_3_1_2()); }
+		(rule__MachineBlock__BufferAssignment_7_3_1_2)
+		{ after(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_3_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_3_1_3()); }
+		(rule__MachineBlock__ChannelAssignment_7_3_1_3)
+		{ after(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_3_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_3_1_4()); }
+		(rule__MachineBlock__TypedefAssignment_7_3_1_4)
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_3_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_3_1_5()); }
+		(rule__MachineBlock__PropertyAssignment_7_3_1_5)
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_3_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getAlternatives_8_0()); }
+		(rule__MachineBlock__Alternatives_8_0)*
+		{ after(grammarAccess.getMachineBlockAccess().getAlternatives_8_0()); }
+	)
+	|
+	(
+		(
+			{ before(grammarAccess.getMachineBlockAccess().getAlternatives_8_1()); }
+			(rule__MachineBlock__Alternatives_8_1)
+			{ after(grammarAccess.getMachineBlockAccess().getAlternatives_8_1()); }
+		)
+		(
+			{ before(grammarAccess.getMachineBlockAccess().getAlternatives_8_1()); }
+			(rule__MachineBlock__Alternatives_8_1)*
+			{ after(grammarAccess.getMachineBlockAccess().getAlternatives_8_1()); }
+		)
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_8_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_8_0_0()); }
+		(rule__MachineBlock__Group_8_0_0__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_8_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_8_0_1()); }
+		(rule__MachineBlock__Group_8_0_1__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_8_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_8_0_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getRoutineKeyword_8_0_0_0_0()); }
+		'@routine:'
+		{ after(grammarAccess.getMachineBlockAccess().getRoutineKeyword_8_0_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getMacroKeyword_8_0_0_0_1()); }
+		'@macro:'
+		{ after(grammarAccess.getMachineBlockAccess().getMacroKeyword_8_0_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_8_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_1_0()); }
+		(rule__MachineBlock__RoutineAssignment_8_1_0)
+		{ after(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_1_1()); }
+		(rule__MachineBlock__ProcedureAssignment_8_1_1)
+		{ after(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_9_0()); }
+		(rule__MachineBlock__Group_9_0__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_9_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_9_1()); }
+		(rule__MachineBlock__Group_9_1__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_9_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_9_2()); }
+		(rule__MachineBlock__Group_9_2__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_9_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_9_3()); }
+		(rule__MachineBlock__Group_9_3__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_9_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_9_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0()); }
+		'@composite:'
+		{ after(grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1()); }
+		'@machine:'
+		{ after(grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_9_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_0_1_0()); }
+		(rule__MachineBlock__MachineAssignment_9_0_1_0)
+		{ after(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_0_1_1()); }
+		(rule__MachineBlock__InstanceAssignment_9_0_1_1)
+		{ after(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Alternatives_10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_10_0()); }
+		(rule__MachineBlock__Group_10_0__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_10_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getGroup_10_1()); }
+		(rule__MachineBlock__Group_10_1__0)
+		{ after(grammarAccess.getMachineBlockAccess().getGroup_10_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getAndKeyword_2_2_0()); }
+		'and'
+		{ after(grammarAccess.getProcedureAccess().getAndKeyword_2_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getOrKeyword_2_2_1()); }
+		'or'
+		{ after(grammarAccess.getProcedureAccess().getOrKeyword_2_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_5_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_0()); }
+		(rule__Procedure__ParameterAssignment_5_1_1_0)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_5_1_1_1()); }
+		(rule__Procedure__Group_5_1_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_5_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_7_0()); }
+		(rule__Procedure__Group_7_0__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_7_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getAlternatives_7_1()); }
+		(rule__Procedure__Alternatives_7_1)*
+		{ after(grammarAccess.getProcedureAccess().getAlternatives_7_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_7_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_7_0_1_0()); }
+		(rule__Procedure__Group_7_0_1_0__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_7_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_7_0_1_1()); }
+		(rule__Procedure__Group_7_0_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_7_0_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_7_0_1_2()); }
+		(rule__Procedure__Group_7_0_1_2__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_7_0_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_7_0_1_3()); }
+		(rule__Procedure__Group_7_0_1_3__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_7_0_1_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_7_0_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_0()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_0_1_0)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_7_0_1_0_1_1()); }
+		(rule__Procedure__Group_7_0_1_0_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_7_0_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_7_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_0()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_1_1_0)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_7_0_1_1_1_1()); }
+		(rule__Procedure__Group_7_0_1_1_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_7_0_1_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_7_0_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_0()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_2_1_0)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_7_0_1_2_1_1()); }
+		(rule__Procedure__Group_7_0_1_2_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_7_0_1_2_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_7_0_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_0()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_3_1_0)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_7_0_1_3_1_1()); }
+		(rule__Procedure__Group_7_0_1_3_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_7_0_1_3_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_7_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortAssignment_7_1_0()); }
+		(rule__Procedure__PortAssignment_7_1_0)
+		{ after(grammarAccess.getProcedureAccess().getPortAssignment_7_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalAssignment_7_1_1()); }
+		(rule__Procedure__SignalAssignment_7_1_1)
+		{ after(grammarAccess.getProcedureAccess().getSignalAssignment_7_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferAssignment_7_1_2()); }
+		(rule__Procedure__BufferAssignment_7_1_2)
+		{ after(grammarAccess.getProcedureAccess().getBufferAssignment_7_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelAssignment_7_1_3()); }
+		(rule__Procedure__ChannelAssignment_7_1_3)
+		{ after(grammarAccess.getProcedureAccess().getChannelAssignment_7_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefAssignment_7_1_4()); }
+		(rule__Procedure__TypedefAssignment_7_1_4)
+		{ after(grammarAccess.getProcedureAccess().getTypedefAssignment_7_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyAssignment_7_1_5()); }
+		(rule__Procedure__PropertyAssignment_7_1_5)
+		{ after(grammarAccess.getProcedureAccess().getPropertyAssignment_7_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_8_0()); }
+		(rule__Procedure__Group_8_0__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_8_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_8_1()); }
+		(rule__Procedure__Group_8_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_8_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_8_2()); }
+		(rule__Procedure__Group_8_2__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_8_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_8_3()); }
+		(rule__Procedure__Group_8_3__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_8_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_8_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_0()); }
+		(rule__Procedure__ParameterAssignment_8_0_1_0)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_8_0_1_1()); }
+		(rule__Procedure__Group_8_0_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_8_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_8_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_0()); }
+		(rule__Procedure__ParameterAssignment_8_1_1_0)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_8_1_1_1()); }
+		(rule__Procedure__Group_8_1_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_8_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_8_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_0()); }
+		(rule__Procedure__ParameterAssignment_8_2_1_0)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_8_2_1_1()); }
+		(rule__Procedure__Group_8_2_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_8_2_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_8_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_0()); }
+		(rule__Procedure__ParameterAssignment_8_3_1_0)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_8_3_1_1()); }
+		(rule__Procedure__Group_8_3_1_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_8_3_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_9_0()); }
+		(rule__Procedure__Group_9_0__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_9_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_9_1()); }
+		(rule__Procedure__Group_9_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_9_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_9_2()); }
+		(rule__Procedure__Group_9_2__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_9_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_9_3()); }
+		(rule__Procedure__Group_9_3__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_9_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_9_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortAssignment_9_0_1_0()); }
+		(rule__Procedure__PortAssignment_9_0_1_0)
+		{ after(grammarAccess.getProcedureAccess().getPortAssignment_9_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalAssignment_9_0_1_1()); }
+		(rule__Procedure__SignalAssignment_9_0_1_1)
+		{ after(grammarAccess.getProcedureAccess().getSignalAssignment_9_0_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferAssignment_9_0_1_2()); }
+		(rule__Procedure__BufferAssignment_9_0_1_2)
+		{ after(grammarAccess.getProcedureAccess().getBufferAssignment_9_0_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelAssignment_9_0_1_3()); }
+		(rule__Procedure__ChannelAssignment_9_0_1_3)
+		{ after(grammarAccess.getProcedureAccess().getChannelAssignment_9_0_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefAssignment_9_0_1_4()); }
+		(rule__Procedure__TypedefAssignment_9_0_1_4)
+		{ after(grammarAccess.getProcedureAccess().getTypedefAssignment_9_0_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyAssignment_9_0_1_5()); }
+		(rule__Procedure__PropertyAssignment_9_0_1_5)
+		{ after(grammarAccess.getProcedureAccess().getPropertyAssignment_9_0_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_9_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortAssignment_9_1_1_0()); }
+		(rule__Procedure__PortAssignment_9_1_1_0)
+		{ after(grammarAccess.getProcedureAccess().getPortAssignment_9_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalAssignment_9_1_1_1()); }
+		(rule__Procedure__SignalAssignment_9_1_1_1)
+		{ after(grammarAccess.getProcedureAccess().getSignalAssignment_9_1_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferAssignment_9_1_1_2()); }
+		(rule__Procedure__BufferAssignment_9_1_1_2)
+		{ after(grammarAccess.getProcedureAccess().getBufferAssignment_9_1_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelAssignment_9_1_1_3()); }
+		(rule__Procedure__ChannelAssignment_9_1_1_3)
+		{ after(grammarAccess.getProcedureAccess().getChannelAssignment_9_1_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefAssignment_9_1_1_4()); }
+		(rule__Procedure__TypedefAssignment_9_1_1_4)
+		{ after(grammarAccess.getProcedureAccess().getTypedefAssignment_9_1_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyAssignment_9_1_1_5()); }
+		(rule__Procedure__PropertyAssignment_9_1_1_5)
+		{ after(grammarAccess.getProcedureAccess().getPropertyAssignment_9_1_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_9_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortAssignment_9_2_1_0()); }
+		(rule__Procedure__PortAssignment_9_2_1_0)
+		{ after(grammarAccess.getProcedureAccess().getPortAssignment_9_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalAssignment_9_2_1_1()); }
+		(rule__Procedure__SignalAssignment_9_2_1_1)
+		{ after(grammarAccess.getProcedureAccess().getSignalAssignment_9_2_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferAssignment_9_2_1_2()); }
+		(rule__Procedure__BufferAssignment_9_2_1_2)
+		{ after(grammarAccess.getProcedureAccess().getBufferAssignment_9_2_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelAssignment_9_2_1_3()); }
+		(rule__Procedure__ChannelAssignment_9_2_1_3)
+		{ after(grammarAccess.getProcedureAccess().getChannelAssignment_9_2_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefAssignment_9_2_1_4()); }
+		(rule__Procedure__TypedefAssignment_9_2_1_4)
+		{ after(grammarAccess.getProcedureAccess().getTypedefAssignment_9_2_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyAssignment_9_2_1_5()); }
+		(rule__Procedure__PropertyAssignment_9_2_1_5)
+		{ after(grammarAccess.getProcedureAccess().getPropertyAssignment_9_2_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_9_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortAssignment_9_3_1_0()); }
+		(rule__Procedure__PortAssignment_9_3_1_0)
+		{ after(grammarAccess.getProcedureAccess().getPortAssignment_9_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalAssignment_9_3_1_1()); }
+		(rule__Procedure__SignalAssignment_9_3_1_1)
+		{ after(grammarAccess.getProcedureAccess().getSignalAssignment_9_3_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferAssignment_9_3_1_2()); }
+		(rule__Procedure__BufferAssignment_9_3_1_2)
+		{ after(grammarAccess.getProcedureAccess().getBufferAssignment_9_3_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelAssignment_9_3_1_3()); }
+		(rule__Procedure__ChannelAssignment_9_3_1_3)
+		{ after(grammarAccess.getProcedureAccess().getChannelAssignment_9_3_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefAssignment_9_3_1_4()); }
+		(rule__Procedure__TypedefAssignment_9_3_1_4)
+		{ after(grammarAccess.getProcedureAccess().getTypedefAssignment_9_3_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyAssignment_9_3_1_5()); }
+		(rule__Procedure__PropertyAssignment_9_3_1_5)
+		{ after(grammarAccess.getProcedureAccess().getPropertyAssignment_9_3_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getAlternatives_10_0()); }
+		(rule__Procedure__Alternatives_10_0)*
+		{ after(grammarAccess.getProcedureAccess().getAlternatives_10_0()); }
+	)
+	|
+	(
+		(
+			{ before(grammarAccess.getProcedureAccess().getAlternatives_10_1()); }
+			(rule__Procedure__Alternatives_10_1)
+			{ after(grammarAccess.getProcedureAccess().getAlternatives_10_1()); }
+		)
+		(
+			{ before(grammarAccess.getProcedureAccess().getAlternatives_10_1()); }
+			(rule__Procedure__Alternatives_10_1)*
+			{ after(grammarAccess.getProcedureAccess().getAlternatives_10_1()); }
+		)
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_10_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_10_0_0()); }
+		(rule__Procedure__Group_10_0_0__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_10_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getGroup_10_0_1()); }
+		(rule__Procedure__Group_10_0_1__0)
+		{ after(grammarAccess.getProcedureAccess().getGroup_10_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_10_0_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getRoutineKeyword_10_0_0_0_0()); }
+		'@routine:'
+		{ after(grammarAccess.getProcedureAccess().getRoutineKeyword_10_0_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getMacroKeyword_10_0_0_0_1()); }
+		'@macro:'
+		{ after(grammarAccess.getProcedureAccess().getMacroKeyword_10_0_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_10_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getRoutineAssignment_10_1_0()); }
+		(rule__Procedure__RoutineAssignment_10_1_0)
+		{ after(grammarAccess.getProcedureAccess().getRoutineAssignment_10_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getProcedureAssignment_10_1_1()); }
+		(rule__Procedure__ProcedureAssignment_10_1_1)
+		{ after(grammarAccess.getProcedureAccess().getProcedureAssignment_10_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Alternatives_11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		(
+			{ before(grammarAccess.getProcedureAccess().getRegionAssignment_11_0()); }
+			(rule__Procedure__RegionAssignment_11_0)
+			{ after(grammarAccess.getProcedureAccess().getRegionAssignment_11_0()); }
+		)
+		(
+			{ before(grammarAccess.getProcedureAccess().getRegionAssignment_11_0()); }
+			(rule__Procedure__RegionAssignment_11_0)*
+			{ after(grammarAccess.getProcedureAccess().getRegionAssignment_11_0()); }
+		)
+	)
+	|
+	(
+		{ before(grammarAccess.getProcedureAccess().getRegionAssignment_11_1()); }
+		(rule__Procedure__RegionAssignment_11_1)
+		{ after(grammarAccess.getProcedureAccess().getRegionAssignment_11_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__Alternatives_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getPortAssignment_1_1_0()); }
+		(rule__MoeBehavior__PortAssignment_1_1_0)
+		{ after(grammarAccess.getMoeBehaviorAccess().getPortAssignment_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getSignalAssignment_1_1_1()); }
+		(rule__MoeBehavior__SignalAssignment_1_1_1)
+		{ after(grammarAccess.getMoeBehaviorAccess().getSignalAssignment_1_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getBufferAssignment_1_1_2()); }
+		(rule__MoeBehavior__BufferAssignment_1_1_2)
+		{ after(grammarAccess.getMoeBehaviorAccess().getBufferAssignment_1_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getChannelAssignment_1_1_3()); }
+		(rule__MoeBehavior__ChannelAssignment_1_1_3)
+		{ after(grammarAccess.getMoeBehaviorAccess().getChannelAssignment_1_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getTypedefAssignment_1_1_4()); }
+		(rule__MoeBehavior__TypedefAssignment_1_1_4)
+		{ after(grammarAccess.getMoeBehaviorAccess().getTypedefAssignment_1_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getPropertyAssignment_1_1_5()); }
+		(rule__MoeBehavior__PropertyAssignment_1_1_5)
+		{ after(grammarAccess.getMoeBehaviorAccess().getPropertyAssignment_1_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTimedAssignment_1_1_0()); }
+		(rule__Statemachine__TimedAssignment_1_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getTimedAssignment_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getInput_enabledAssignment_1_1_1()); }
+		(rule__Statemachine__Input_enabledAssignment_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getInput_enabledAssignment_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_3_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getOrKeyword_3_2_0()); }
+		'or'
+		{ after(grammarAccess.getStatemachineAccess().getOrKeyword_3_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getAndKeyword_3_2_1()); }
+		'and'
+		{ after(grammarAccess.getStatemachineAccess().getAndKeyword_3_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_7_0()); }
+		(rule__Statemachine__Group_7_0__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_7_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getAlternatives_7_1()); }
+		(rule__Statemachine__Alternatives_7_1)*
+		{ after(grammarAccess.getStatemachineAccess().getAlternatives_7_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_7_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0()); }
+		(rule__Statemachine__Group_7_0_1_0__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1()); }
+		(rule__Statemachine__Group_7_0_1_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2()); }
+		(rule__Statemachine__Group_7_0_1_2__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3()); }
+		(rule__Statemachine__Group_7_0_1_3__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_7_0_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_0()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_0_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0_1_1()); }
+		(rule__Statemachine__Group_7_0_1_0_1_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_7_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_0()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_1_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1_1_1()); }
+		(rule__Statemachine__Group_7_0_1_1_1_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_7_0_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_0()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_2_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2_1_1()); }
+		(rule__Statemachine__Group_7_0_1_2_1_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_7_0_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_0()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_3_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3_1_1()); }
+		(rule__Statemachine__Group_7_0_1_3_1_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_7_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortAssignment_7_1_0()); }
+		(rule__Statemachine__PortAssignment_7_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getPortAssignment_7_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalAssignment_7_1_1()); }
+		(rule__Statemachine__SignalAssignment_7_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getSignalAssignment_7_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferAssignment_7_1_2()); }
+		(rule__Statemachine__BufferAssignment_7_1_2)
+		{ after(grammarAccess.getStatemachineAccess().getBufferAssignment_7_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelAssignment_7_1_3()); }
+		(rule__Statemachine__ChannelAssignment_7_1_3)
+		{ after(grammarAccess.getStatemachineAccess().getChannelAssignment_7_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefAssignment_7_1_4()); }
+		(rule__Statemachine__TypedefAssignment_7_1_4)
+		{ after(grammarAccess.getStatemachineAccess().getTypedefAssignment_7_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyAssignment_7_1_5()); }
+		(rule__Statemachine__PropertyAssignment_7_1_5)
+		{ after(grammarAccess.getStatemachineAccess().getPropertyAssignment_7_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_8_0()); }
+		(rule__Statemachine__Group_8_0__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_8_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_8_1()); }
+		(rule__Statemachine__Group_8_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_8_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_8_2()); }
+		(rule__Statemachine__Group_8_2__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_8_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_8_3()); }
+		(rule__Statemachine__Group_8_3__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_8_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_8_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_0()); }
+		(rule__Statemachine__ParameterAssignment_8_0_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_8_0_1_1()); }
+		(rule__Statemachine__Group_8_0_1_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_8_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_8_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_0()); }
+		(rule__Statemachine__ParameterAssignment_8_1_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_8_1_1_1()); }
+		(rule__Statemachine__Group_8_1_1_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_8_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_8_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_0()); }
+		(rule__Statemachine__ParameterAssignment_8_2_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_8_2_1_1()); }
+		(rule__Statemachine__Group_8_2_1_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_8_2_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_8_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_0()); }
+		(rule__Statemachine__ParameterAssignment_8_3_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_8_3_1_1()); }
+		(rule__Statemachine__Group_8_3_1_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_8_3_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_9_0()); }
+		(rule__Statemachine__Group_9_0__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_9_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_9_1()); }
+		(rule__Statemachine__Group_9_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_9_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_9_2()); }
+		(rule__Statemachine__Group_9_2__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_9_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_9_3()); }
+		(rule__Statemachine__Group_9_3__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_9_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_9_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortAssignment_9_0_1_0()); }
+		(rule__Statemachine__PortAssignment_9_0_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getPortAssignment_9_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalAssignment_9_0_1_1()); }
+		(rule__Statemachine__SignalAssignment_9_0_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getSignalAssignment_9_0_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferAssignment_9_0_1_2()); }
+		(rule__Statemachine__BufferAssignment_9_0_1_2)
+		{ after(grammarAccess.getStatemachineAccess().getBufferAssignment_9_0_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelAssignment_9_0_1_3()); }
+		(rule__Statemachine__ChannelAssignment_9_0_1_3)
+		{ after(grammarAccess.getStatemachineAccess().getChannelAssignment_9_0_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_0_1_4()); }
+		(rule__Statemachine__TypedefAssignment_9_0_1_4)
+		{ after(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_0_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_0_1_5()); }
+		(rule__Statemachine__PropertyAssignment_9_0_1_5)
+		{ after(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_0_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_9_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortAssignment_9_1_1_0()); }
+		(rule__Statemachine__PortAssignment_9_1_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getPortAssignment_9_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalAssignment_9_1_1_1()); }
+		(rule__Statemachine__SignalAssignment_9_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getSignalAssignment_9_1_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferAssignment_9_1_1_2()); }
+		(rule__Statemachine__BufferAssignment_9_1_1_2)
+		{ after(grammarAccess.getStatemachineAccess().getBufferAssignment_9_1_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelAssignment_9_1_1_3()); }
+		(rule__Statemachine__ChannelAssignment_9_1_1_3)
+		{ after(grammarAccess.getStatemachineAccess().getChannelAssignment_9_1_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_1_1_4()); }
+		(rule__Statemachine__TypedefAssignment_9_1_1_4)
+		{ after(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_1_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_1_1_5()); }
+		(rule__Statemachine__PropertyAssignment_9_1_1_5)
+		{ after(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_1_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_9_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortAssignment_9_2_1_0()); }
+		(rule__Statemachine__PortAssignment_9_2_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getPortAssignment_9_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalAssignment_9_2_1_1()); }
+		(rule__Statemachine__SignalAssignment_9_2_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getSignalAssignment_9_2_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferAssignment_9_2_1_2()); }
+		(rule__Statemachine__BufferAssignment_9_2_1_2)
+		{ after(grammarAccess.getStatemachineAccess().getBufferAssignment_9_2_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelAssignment_9_2_1_3()); }
+		(rule__Statemachine__ChannelAssignment_9_2_1_3)
+		{ after(grammarAccess.getStatemachineAccess().getChannelAssignment_9_2_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_2_1_4()); }
+		(rule__Statemachine__TypedefAssignment_9_2_1_4)
+		{ after(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_2_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_2_1_5()); }
+		(rule__Statemachine__PropertyAssignment_9_2_1_5)
+		{ after(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_2_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_9_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortAssignment_9_3_1_0()); }
+		(rule__Statemachine__PortAssignment_9_3_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getPortAssignment_9_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalAssignment_9_3_1_1()); }
+		(rule__Statemachine__SignalAssignment_9_3_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getSignalAssignment_9_3_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferAssignment_9_3_1_2()); }
+		(rule__Statemachine__BufferAssignment_9_3_1_2)
+		{ after(grammarAccess.getStatemachineAccess().getBufferAssignment_9_3_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelAssignment_9_3_1_3()); }
+		(rule__Statemachine__ChannelAssignment_9_3_1_3)
+		{ after(grammarAccess.getStatemachineAccess().getChannelAssignment_9_3_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_3_1_4()); }
+		(rule__Statemachine__TypedefAssignment_9_3_1_4)
+		{ after(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_3_1_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_3_1_5()); }
+		(rule__Statemachine__PropertyAssignment_9_3_1_5)
+		{ after(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_3_1_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getAlternatives_10_0()); }
+		(rule__Statemachine__Alternatives_10_0)*
+		{ after(grammarAccess.getStatemachineAccess().getAlternatives_10_0()); }
+	)
+	|
+	(
+		(
+			{ before(grammarAccess.getStatemachineAccess().getAlternatives_10_1()); }
+			(rule__Statemachine__Alternatives_10_1)
+			{ after(grammarAccess.getStatemachineAccess().getAlternatives_10_1()); }
+		)
+		(
+			{ before(grammarAccess.getStatemachineAccess().getAlternatives_10_1()); }
+			(rule__Statemachine__Alternatives_10_1)*
+			{ after(grammarAccess.getStatemachineAccess().getAlternatives_10_1()); }
+		)
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_10_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_10_0_0()); }
+		(rule__Statemachine__Group_10_0_0__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_10_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getGroup_10_0_1()); }
+		(rule__Statemachine__Group_10_0_1__0)
+		{ after(grammarAccess.getStatemachineAccess().getGroup_10_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_10_0_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getRoutineKeyword_10_0_0_0_0()); }
+		'@routine:'
+		{ after(grammarAccess.getStatemachineAccess().getRoutineKeyword_10_0_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getMacroKeyword_10_0_0_0_1()); }
+		'@macro:'
+		{ after(grammarAccess.getStatemachineAccess().getMacroKeyword_10_0_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_10_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_1_0()); }
+		(rule__Statemachine__RoutineAssignment_10_1_0)
+		{ after(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_1_1()); }
+		(rule__Statemachine__ProcedureAssignment_10_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Alternatives_11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		(
+			{ before(grammarAccess.getStatemachineAccess().getRegionAssignment_11_0()); }
+			(rule__Statemachine__RegionAssignment_11_0)
+			{ after(grammarAccess.getStatemachineAccess().getRegionAssignment_11_0()); }
+		)
+		(
+			{ before(grammarAccess.getStatemachineAccess().getRegionAssignment_11_0()); }
+			(rule__Statemachine__RegionAssignment_11_0)*
+			{ after(grammarAccess.getStatemachineAccess().getRegionAssignment_11_0()); }
+		)
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineAccess().getRegionAssignment_11_1()); }
+		(rule__Statemachine__RegionAssignment_11_1)
+		{ after(grammarAccess.getStatemachineAccess().getRegionAssignment_11_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_0()); }
+		(rule__StatemachineRegion__Alternatives_1_0)
+		{ after(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getGroup_1_1()); }
+		(rule__StatemachineRegion__Group_1_1__0)
+		{ after(grammarAccess.getStatemachineRegionAccess().getGroup_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Alternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_0_0()); }
+		'@region:'
+		{ after(grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_0_1()); }
+		'@statemachine:'
+		{ after(grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Alternatives_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_1_0_0()); }
+		'@region<'
+		{ after(grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_1_0_1()); }
+		'@statemachine<'
+		{ after(grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_0()); }
+		(rule__StatemachineRegion__VertexAssignment_2_0)
+		{ after(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_1()); }
+		(rule__StatemachineRegion__VertexAssignment_2_1)
+		{ after(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegionLite__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_0()); }
+		(rule__StatemachineRegionLite__VertexAssignment_0)
+		{ after(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_1()); }
+		(rule__StatemachineRegionLite__VertexAssignment_1)
+		{ after(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__State__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStateAccess().getCompositeStateParserRuleCall_0()); }
+		ruleCompositeState
+		{ after(grammarAccess.getStateAccess().getCompositeStateParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStateAccess().getStartStateParserRuleCall_1()); }
+		ruleStartState
+		{ after(grammarAccess.getStateAccess().getStartStateParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStateAccess().getSimpleStateParserRuleCall_2()); }
+		ruleSimpleState
+		{ after(grammarAccess.getStateAccess().getSimpleStateParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStateAccess().getFinalStateParserRuleCall_3()); }
+		ruleFinalState
+		{ after(grammarAccess.getStateAccess().getFinalStateParserRuleCall_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Alternatives_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getOrKeyword_4_0()); }
+		'or'
+		{ after(grammarAccess.getCompositeStateAccess().getOrKeyword_4_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getOrthogonalAssignment_4_1()); }
+		(rule__CompositeState__OrthogonalAssignment_4_1)
+		{ after(grammarAccess.getCompositeStateAccess().getOrthogonalAssignment_4_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getGroup_8_0()); }
+		(rule__CompositeState__Group_8_0__0)
+		{ after(grammarAccess.getCompositeStateAccess().getGroup_8_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getSemicolonKeyword_8_1()); }
+		';'
+		{ after(grammarAccess.getCompositeStateAccess().getSemicolonKeyword_8_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Alternatives_8_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		(
+			{ before(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_0()); }
+			(rule__CompositeState__Alternatives_8_0_1_0)
+			{ after(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_0()); }
+		)
+		(
+			{ before(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_0()); }
+			(rule__CompositeState__Alternatives_8_0_1_0)*
+			{ after(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_0()); }
+		)
+	)
+	|
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_1()); }
+		(rule__CompositeState__Group_8_0_1_1__0)
+		{ after(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Alternatives_8_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_0_0()); }
+		(rule__CompositeState__RegionAssignment_8_0_1_0_0)
+		{ after(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_1()); }
+		(rule__CompositeState__Group_8_0_1_0_1__0)
+		{ after(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_2()); }
+		(rule__CompositeState__Group_8_0_1_0_2__0)
+		{ after(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Alternatives_8_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_1_1_0()); }
+		(rule__CompositeState__TransitionAssignment_8_0_1_1_1_0)
+		{ after(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_1_1_1()); }
+		(rule__CompositeState__MoeAssignment_8_0_1_1_1_1)
+		{ after(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeCompositeStateRoutines__NameAlternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameInitKeyword_1_0_0()); }
+		'@init'
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameInitKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameFinalKeyword_1_0_1()); }
+		'@final'
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameFinalKeyword_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameEnableKeyword_1_0_2()); }
+		'@enable'
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameEnableKeyword_1_0_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameDisableKeyword_1_0_3()); }
+		'@disable'
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameDisableKeyword_1_0_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameConcurrencyKeyword_1_0_4()); }
+		'@concurrency'
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameConcurrencyKeyword_1_0_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameScheduleKeyword_1_0_5()); }
+		'@schedule'
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameScheduleKeyword_1_0_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameIrunKeyword_1_0_6()); }
+		'@irun'
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameIrunKeyword_1_0_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameRunKeyword_1_0_7()); }
+		'@run'
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameRunKeyword_1_0_7()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Alternatives_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getGroup_5_0()); }
+		(rule__SimpleState__Group_5_0__0)
+		{ after(grammarAccess.getSimpleStateAccess().getGroup_5_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getSemicolonKeyword_5_1()); }
+		';'
+		{ after(grammarAccess.getSimpleStateAccess().getSemicolonKeyword_5_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Alternatives_5_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getTransitionAssignment_5_0_1_0()); }
+		(rule__SimpleState__TransitionAssignment_5_0_1_0)
+		{ after(grammarAccess.getSimpleStateAccess().getTransitionAssignment_5_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getMoeAssignment_5_0_1_1()); }
+		(rule__SimpleState__MoeAssignment_5_0_1_1)
+		{ after(grammarAccess.getSimpleStateAccess().getMoeAssignment_5_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeSimpleStateRoutines__NameAlternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameEnableKeyword_1_0_0()); }
+		'@enable'
+		{ after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameEnableKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameDisableKeyword_1_0_1()); }
+		'@disable'
+		{ after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameDisableKeyword_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameIrunKeyword_1_0_2()); }
+		'@irun'
+		{ after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameIrunKeyword_1_0_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStartStateAccess().getGroup_1_0()); }
+		(rule__StartState__Group_1_0__0)
+		{ after(grammarAccess.getStartStateAccess().getGroup_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStartStateAccess().getSimpleAssignment_1_1()); }
+		(rule__StartState__SimpleAssignment_1_1)
+		{ after(grammarAccess.getStartStateAccess().getSimpleAssignment_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStartStateAccess().getGroup_3_0()); }
+		(rule__StartState__Group_3_0__0)
+		{ after(grammarAccess.getStartStateAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStartStateAccess().getSemicolonKeyword_3_1()); }
+		';'
+		{ after(grammarAccess.getStartStateAccess().getSemicolonKeyword_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Alternatives_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStartStateAccess().getTransitionAssignment_3_0_1_0()); }
+		(rule__StartState__TransitionAssignment_3_0_1_0)
+		{ after(grammarAccess.getStartStateAccess().getTransitionAssignment_3_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStartStateAccess().getMoeAssignment_3_0_1_1()); }
+		(rule__StartState__MoeAssignment_3_0_1_1)
+		{ after(grammarAccess.getStartStateAccess().getMoeAssignment_3_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeStartStateRoutines__NameAlternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeStartStateRoutinesAccess().getNameInitKeyword_1_0_0()); }
+		'@init'
+		{ after(grammarAccess.getMoeStartStateRoutinesAccess().getNameInitKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeStartStateRoutinesAccess().getNameEnableKeyword_1_0_1()); }
+		'@enable'
+		{ after(grammarAccess.getMoeStartStateRoutinesAccess().getNameEnableKeyword_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeStartStateRoutinesAccess().getNameDisableKeyword_1_0_2()); }
+		'@disable'
+		{ after(grammarAccess.getMoeStartStateRoutinesAccess().getNameDisableKeyword_1_0_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeStartStateRoutinesAccess().getNameIrunKeyword_1_0_3()); }
+		'@irun'
+		{ after(grammarAccess.getMoeStartStateRoutinesAccess().getNameIrunKeyword_1_0_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFinalStateAccess().getGroup_1_0()); }
+		(rule__FinalState__Group_1_0__0)
+		{ after(grammarAccess.getFinalStateAccess().getGroup_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_1()); }
+		(rule__FinalState__SimpleAssignment_1_1)
+		{ after(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFinalStateAccess().getGroup_3_0()); }
+		(rule__FinalState__Group_3_0__0)
+		{ after(grammarAccess.getFinalStateAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getFinalStateAccess().getSemicolonKeyword_3_1()); }
+		';'
+		{ after(grammarAccess.getFinalStateAccess().getSemicolonKeyword_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeFinalStateRoutines__NameAlternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeFinalStateRoutinesAccess().getNameEnableKeyword_1_0_0()); }
+		'@enable'
+		{ after(grammarAccess.getMoeFinalStateRoutinesAccess().getNameEnableKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeFinalStateRoutinesAccess().getNameFinalKeyword_1_0_1()); }
+		'@final'
+		{ after(grammarAccess.getMoeFinalStateRoutinesAccess().getNameFinalKeyword_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Pseudostate__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateAccess().getPseudostateInitialParserRuleCall_0()); }
+		rulePseudostateInitial
+		{ after(grammarAccess.getPseudostateAccess().getPseudostateInitialParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateAccess().getEndingPseudostateParserRuleCall_1()); }
+		ruleEndingPseudostate
+		{ after(grammarAccess.getPseudostateAccess().getEndingPseudostateParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateAccess().getOtherPseudostateParserRuleCall_2()); }
+		ruleOtherPseudostate
+		{ after(grammarAccess.getPseudostateAccess().getOtherPseudostateParserRuleCall_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherPseudostateAccess().getStateKeyword_1_0()); }
+		'state'
+		{ after(grammarAccess.getOtherPseudostateAccess().getStateKeyword_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOtherPseudostateAccess().getPseudostateKeyword_1_1()); }
+		'pseudostate'
+		{ after(grammarAccess.getOtherPseudostateAccess().getPseudostateKeyword_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherPseudostateAccess().getGroup_8_0()); }
+		(rule__OtherPseudostate__Group_8_0__0)
+		{ after(grammarAccess.getOtherPseudostateAccess().getGroup_8_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOtherPseudostateAccess().getSemicolonKeyword_8_1()); }
+		';'
+		{ after(grammarAccess.getOtherPseudostateAccess().getSemicolonKeyword_8_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getGroup_1_0()); }
+		(rule__PseudostateInitial__Group_1_0__0)
+		{ after(grammarAccess.getPseudostateInitialAccess().getGroup_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_1()); }
+		(rule__PseudostateInitial__NameAssignment_1_1)
+		{ after(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Alternatives_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getStateKeyword_1_0_0_0()); }
+		'state'
+		{ after(grammarAccess.getPseudostateInitialAccess().getStateKeyword_1_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getPseudostateKeyword_1_0_0_1()); }
+		'pseudostate'
+		{ after(grammarAccess.getPseudostateInitialAccess().getPseudostateKeyword_1_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__NameAlternatives_1_0_5_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getNameESIdentifierParserRuleCall_1_0_5_0_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getPseudostateInitialAccess().getNameESIdentifierParserRuleCall_1_0_5_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_0_5_0_1()); }
+		'#initial'
+		{ after(grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_0_5_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_0_5_0_2()); }
+		'#init'
+		{ after(grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_0_5_0_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__NameAlternatives_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_1_0_0()); }
+		'#initial'
+		{ after(grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_1_0_1()); }
+		'#init'
+		{ after(grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getGroup_3_0()); }
+		(rule__PseudostateInitial__Group_3_0__0)
+		{ after(grammarAccess.getPseudostateInitialAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getSemicolonKeyword_3_1()); }
+		';'
+		{ after(grammarAccess.getPseudostateInitialAccess().getSemicolonKeyword_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEndingPseudostateAccess().getStateKeyword_1_0()); }
+		'state'
+		{ after(grammarAccess.getEndingPseudostateAccess().getStateKeyword_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEndingPseudostateAccess().getPseudostateKeyword_1_1()); }
+		'pseudostate'
+		{ after(grammarAccess.getEndingPseudostateAccess().getPseudostateKeyword_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEndingPseudostateAccess().getGroup_8_0()); }
+		(rule__EndingPseudostate__Group_8_0__0)
+		{ after(grammarAccess.getEndingPseudostateAccess().getGroup_8_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEndingPseudostateAccess().getSemicolonKeyword_8_1()); }
+		';'
+		{ after(grammarAccess.getEndingPseudostateAccess().getSemicolonKeyword_8_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Alternatives_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeRoutineAccess().getGroup_2_1_0()); }
+		(rule__MoeRoutine__Group_2_1_0__0)
+		{ after(grammarAccess.getMoeRoutineAccess().getGroup_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_1()); }
+		(rule__MoeRoutine__CodomainAssignment_2_1_1)
+		{ after(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Alternatives_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRoutineAccess().getGroup_6_1_0()); }
+		(rule__Routine__Group_6_1_0__0)
+		{ after(grammarAccess.getRoutineAccess().getGroup_6_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_1()); }
+		(rule__Routine__CodomainAssignment_6_1_1)
+		{ after(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfInteraction__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfInteractionAccess().getRoutesAssignment_2_0()); }
+		(rule__ModelOfInteraction__RoutesAssignment_2_0)
+		{ after(grammarAccess.getModelOfInteractionAccess().getRoutesAssignment_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getModelOfInteractionAccess().getConnectionsAssignment_2_1()); }
+		(rule__ModelOfInteraction__ConnectionsAssignment_2_1)
+		{ after(grammarAccess.getModelOfInteractionAccess().getConnectionsAssignment_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Alternatives_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRouteAccess().getAsteriskKeyword_7_0()); }
+		'*'
+		{ after(grammarAccess.getRouteAccess().getAsteriskKeyword_7_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getRouteAccess().getGroup_7_1()); }
+		(rule__Route__Group_7_1__0)
+		{ after(grammarAccess.getRouteAccess().getGroup_7_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_0()); }
+		(rule__ComRouteProtocol__ProtocolAssignment_0)
+		{ after(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getGroup_1()); }
+		(rule__ComRouteProtocol__Group_1__0)
+		{ after(grammarAccess.getComRouteProtocolAccess().getGroup_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_2()); }
+		(rule__ComRouteProtocol__Inner_bufferAssignment_2)
+		{ after(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_3()); }
+		(rule__ComRouteProtocol__Ref_bufferAssignment_3)
+		{ after(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Alternatives_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_0()); }
+		(rule__ComRouteProtocol__Group_1_1_0__0)
+		{ after(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_1()); }
+		(rule__ComRouteProtocol__Group_1_1_1__0)
+		{ after(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Alternatives_1_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_0_1_0()); }
+		(rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0)
+		{ after(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_0_1_1()); }
+		(rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1)
+		{ after(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Alternatives_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_1_1_0()); }
+		(rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0)
+		{ after(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_1_1_1()); }
+		(rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1)
+		{ after(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getProtocolAssignment_0()); }
+		(rule__ComProtocol__ProtocolAssignment_0)
+		{ after(grammarAccess.getComProtocolAccess().getProtocolAssignment_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolAccess().getGroup_1()); }
+		(rule__ComProtocol__Group_1__0)
+		{ after(grammarAccess.getComProtocolAccess().getGroup_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolAccess().getGroup_2()); }
+		(rule__ComProtocol__Group_2__0)
+		{ after(grammarAccess.getComProtocolAccess().getGroup_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_3()); }
+		(rule__ComProtocol__Inner_bufferAssignment_3)
+		{ after(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_4()); }
+		(rule__ComProtocol__Ref_bufferAssignment_4)
+		{ after(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolAccess().getCastAssignment_5()); }
+		(rule__ComProtocol__CastAssignment_5)
+		{ after(grammarAccess.getComProtocolAccess().getCastAssignment_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Alternatives_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getGroup_2_1_0()); }
+		(rule__ComProtocol__Group_2_1_0__0)
+		{ after(grammarAccess.getComProtocolAccess().getGroup_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolAccess().getGroup_2_1_1()); }
+		(rule__ComProtocol__Group_2_1_1__0)
+		{ after(grammarAccess.getComProtocolAccess().getGroup_2_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Alternatives_2_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_0_1_0()); }
+		(rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0)
+		{ after(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_0_1_1()); }
+		(rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1)
+		{ after(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Alternatives_2_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_1_1_0()); }
+		(rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0)
+		{ after(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_1_1_1()); }
+		(rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1)
+		{ after(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointAccess().getGroup_3_0()); }
+		(rule__ComPoint__Group_3_0__0)
+		{ after(grammarAccess.getComPointAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComPointAccess().getGroup_3_1()); }
+		(rule__ComPoint__Group_3_1__0)
+		{ after(grammarAccess.getComPointAccess().getGroup_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getGroup_0()); }
+		(rule__ComPointProtocol__Group_0__0)
+		{ after(grammarAccess.getComPointProtocolAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_1()); }
+		(rule__ComPointProtocol__Inner_bufferAssignment_1)
+		{ after(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_2()); }
+		(rule__ComPointProtocol__Ref_bufferAssignment_2)
+		{ after(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Alternatives_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getGroup_0_1_0()); }
+		(rule__ComPointProtocol__Group_0_1_0__0)
+		{ after(grammarAccess.getComPointProtocolAccess().getGroup_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getGroup_0_1_1()); }
+		(rule__ComPointProtocol__Group_0_1_1__0)
+		{ after(grammarAccess.getComPointProtocolAccess().getGroup_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Alternatives_0_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_0_1_0()); }
+		(rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0)
+		{ after(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_0_1_1()); }
+		(rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1)
+		{ after(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Alternatives_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_1_1_0()); }
+		(rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0)
+		{ after(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_1_1_1()); }
+		(rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1)
+		{ after(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComElementAccess().getGroup_0()); }
+		(rule__ComElement__Group_0__0)
+		{ after(grammarAccess.getComElementAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComElementAccess().getGroup_1()); }
+		(rule__ComElement__Group_1__0)
+		{ after(grammarAccess.getComElementAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__KindAlternatives_0_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_0_1_1_0_0()); }
+		ruleValueDotFieldExpressionKind
+		{ after(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_0_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_0_1_1_0_1()); }
+		ruleValueArrowFieldExpressionKind
+		{ after(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_0_1_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__KindAlternatives_1_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_2_0_0()); }
+		ruleValueDotFieldExpressionKind
+		{ after(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_2_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_1_2_0_1()); }
+		ruleValueArrowFieldExpressionKind
+		{ after(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_1_2_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TypeDefinition__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTypeDefinitionAccess().getEnumerationTypeDefinitionParserRuleCall_0()); }
+		ruleEnumerationTypeDefinition
+		{ after(grammarAccess.getTypeDefinitionAccess().getEnumerationTypeDefinitionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTypeDefinitionAccess().getStructureTypeDefinitionParserRuleCall_1()); }
+		ruleStructureTypeDefinition
+		{ after(grammarAccess.getTypeDefinitionAccess().getStructureTypeDefinitionParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTypeDefinitionAccess().getUnionTypeDefinitionParserRuleCall_2()); }
+		ruleUnionTypeDefinition
+		{ after(grammarAccess.getTypeDefinitionAccess().getUnionTypeDefinitionParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTypeDefinitionAccess().getChoiceTypeDefinitionParserRuleCall_3()); }
+		ruleChoiceTypeDefinition
+		{ after(grammarAccess.getTypeDefinitionAccess().getChoiceTypeDefinitionParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTypeDefinitionAccess().getIntervalTypeDefinitionParserRuleCall_4()); }
+		ruleIntervalTypeDefinition
+		{ after(grammarAccess.getTypeDefinitionAccess().getIntervalTypeDefinitionParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTypeDefinitionAccess().getCollectionTypeDefinitionParserRuleCall_5()); }
+		ruleCollectionTypeDefinition
+		{ after(grammarAccess.getTypeDefinitionAccess().getCollectionTypeDefinitionParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTypeDefinitionAccess().getOtherDataTypeDefinitionParserRuleCall_6()); }
+		ruleOtherDataTypeDefinition
+		{ after(grammarAccess.getTypeDefinitionAccess().getOtherDataTypeDefinitionParserRuleCall_6()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeMultiplicity__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataTypeMultiplicityAccess().getLiteralIntegerExpressionParserRuleCall_0()); }
+		ruleLiteralIntegerExpression
+		{ after(grammarAccess.getDataTypeMultiplicityAccess().getLiteralIntegerExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataTypeMultiplicityAccess().getLiteralReferenceElementParserRuleCall_1()); }
+		ruleLiteralReferenceElement
+		{ after(grammarAccess.getDataTypeMultiplicityAccess().getLiteralReferenceElementParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataTypeReferenceAccess().getGroup_0()); }
+		(rule__DataTypeReference__Group_0__0)
+		{ after(grammarAccess.getDataTypeReferenceAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataTypeReferenceAccess().getGroup_1()); }
+		(rule__DataTypeReference__Group_1__0)
+		{ after(grammarAccess.getDataTypeReferenceAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Alternatives_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0()); }
+		(rule__OtherDataTypeDefinition__Group_5_0__0)
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1()); }
+		(rule__OtherDataTypeDefinition__Group_5_1__0)
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0()); }
+		(rule__OtherDataTypeDefinitionImpl__Group_3_0__0)
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1()); }
+		(rule__OtherDataTypeDefinitionImpl__Group_3_1__0)
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataTypeAccess().getDataTypeReferenceParserRuleCall_0()); }
+		ruleDataTypeReference
+		{ after(grammarAccess.getDataTypeAccess().getDataTypeReferenceParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataTypeAccess().getStructuredDataTypeParserRuleCall_1()); }
+		ruleStructuredDataType
+		{ after(grammarAccess.getDataTypeAccess().getStructuredDataTypeParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleDataType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSimpleDataTypeAccess().getPrimitiveTypeParserRuleCall_0()); }
+		rulePrimitiveType
+		{ after(grammarAccess.getSimpleDataTypeAccess().getPrimitiveTypeParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSimpleDataTypeAccess().getIntervalTypeParserRuleCall_1()); }
+		ruleIntervalType
+		{ after(grammarAccess.getSimpleDataTypeAccess().getIntervalTypeParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getSimpleDataTypeAccess().getCollectionTypeParserRuleCall_2()); }
+		ruleCollectionType
+		{ after(grammarAccess.getSimpleDataTypeAccess().getCollectionTypeParserRuleCall_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructuredDataType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructuredDataTypeAccess().getEnumerationTypeParserRuleCall_0()); }
+		ruleEnumerationType
+		{ after(grammarAccess.getStructuredDataTypeAccess().getEnumerationTypeParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStructuredDataTypeAccess().getStructureTypeParserRuleCall_1()); }
+		ruleStructureType
+		{ after(grammarAccess.getStructuredDataTypeAccess().getStructureTypeParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStructuredDataTypeAccess().getUnionTypeParserRuleCall_2()); }
+		ruleUnionType
+		{ after(grammarAccess.getStructuredDataTypeAccess().getUnionTypeParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStructuredDataTypeAccess().getChoiceTypeParserRuleCall_3()); }
+		ruleChoiceType
+		{ after(grammarAccess.getStructuredDataTypeAccess().getChoiceTypeParserRuleCall_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTypeAccess().getPrimitiveNumberTypeParserRuleCall_0()); }
+		rulePrimitiveNumberType
+		{ after(grammarAccess.getPrimitiveTypeAccess().getPrimitiveNumberTypeParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveTypeAccess().getOtherPrimitiveTypeParserRuleCall_1()); }
+		ruleOtherPrimitiveType
+		{ after(grammarAccess.getPrimitiveTypeAccess().getOtherPrimitiveTypeParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveNumberType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0()); }
+		rulePrimitiveIntegerType
+		{ after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1()); }
+		rulePrimitiveRationalType
+		{ after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2()); }
+		rulePrimitiveFloatType
+		{ after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3()); }
+		rulePrimitiveRealType
+		{ after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveTimeTypeParserRuleCall_4()); }
+		rulePrimitiveTimeType
+		{ after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveTimeTypeParserRuleCall_4()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getIntegerKeyword_2_0()); }
+		'integer'
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getIntegerKeyword_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getUintegerKeyword_2_1()); }
+		'uinteger'
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getUintegerKeyword_2_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getIntKeyword_2_2()); }
+		'int'
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getIntKeyword_2_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getUintKeyword_2_3()); }
+		'uint'
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getUintKeyword_2_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_0()); }
+		(rule__PrimitiveIntegerType__Group_3_0__0)
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_1()); }
+		(rule__PrimitiveIntegerType__Group_3_1__0)
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getRationalKeyword_2_0()); }
+		'rational'
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getRationalKeyword_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getUrationalKeyword_2_1()); }
+		'urational'
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getUrationalKeyword_2_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getRatKeyword_2_2()); }
+		'rat'
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getRatKeyword_2_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getUratKeyword_2_3()); }
+		'urat'
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getUratKeyword_2_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_0()); }
+		(rule__PrimitiveRationalType__Group_3_0__0)
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_1()); }
+		(rule__PrimitiveRationalType__Group_3_1__0)
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getFloatKeyword_2_0()); }
+		'float'
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getFloatKeyword_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getUfloatKeyword_2_1()); }
+		'ufloat'
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getUfloatKeyword_2_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getDoubleKeyword_2_2()); }
+		'double'
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getDoubleKeyword_2_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getUdoubleKeyword_2_3()); }
+		'udouble'
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getUdoubleKeyword_2_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_0()); }
+		(rule__PrimitiveFloatType__Group_3_0__0)
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_1()); }
+		(rule__PrimitiveFloatType__Group_3_1__0)
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRealTypeAccess().getRealKeyword_2_0()); }
+		'real'
+		{ after(grammarAccess.getPrimitiveRealTypeAccess().getRealKeyword_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveRealTypeAccess().getUrealKeyword_2_1()); }
+		'ureal'
+		{ after(grammarAccess.getPrimitiveRealTypeAccess().getUrealKeyword_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_0()); }
+		(rule__PrimitiveRealType__Group_3_0__0)
+		{ after(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_1()); }
+		(rule__PrimitiveRealType__Group_3_1__0)
+		{ after(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0()); }
+		(rule__PrimitiveTimeType__Group_0__0)
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1()); }
+		(rule__PrimitiveTimeType__Group_1__0)
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Alternatives_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0_2_0()); }
+		(rule__PrimitiveTimeType__Group_0_2_0__0)
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_1()); }
+		(rule__PrimitiveTimeType__SupportAssignment_0_2_1)
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Alternatives_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1_2_0()); }
+		(rule__PrimitiveTimeType__Group_1_2_0__0)
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_1()); }
+		(rule__PrimitiveTimeType__SupportAssignment_1_2_1)
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeNumberType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0()); }
+		rulePrimitiveIntegerType
+		{ after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1()); }
+		rulePrimitiveRationalType
+		{ after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2()); }
+		rulePrimitiveFloatType
+		{ after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3()); }
+		rulePrimitiveRealType
+		{ after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPrimitiveType__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveBooleanTypeParserRuleCall_0()); }
+		rulePrimitiveBooleanType
+		{ after(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveBooleanTypeParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveCharacterTypeParserRuleCall_1()); }
+		rulePrimitiveCharacterType
+		{ after(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveCharacterTypeParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveStringTypeParserRuleCall_2()); }
+		rulePrimitiveStringType
+		{ after(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveStringTypeParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveInstanceTypeParserRuleCall_3()); }
+		rulePrimitiveInstanceType
+		{ after(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveInstanceTypeParserRuleCall_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveBooleanType__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveBooleanTypeAccess().getBooleanKeyword_1_0()); }
+		'boolean'
+		{ after(grammarAccess.getPrimitiveBooleanTypeAccess().getBooleanKeyword_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveBooleanTypeAccess().getBoolKeyword_1_1()); }
+		'bool'
+		{ after(grammarAccess.getPrimitiveBooleanTypeAccess().getBoolKeyword_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_0()); }
+		(rule__PrimitiveStringType__Group_2_0__0)
+		{ after(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_1()); }
+		(rule__PrimitiveStringType__Group_2_1__0)
+		{ after(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Alternatives_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getLopenAssignment_4_0()); }
+		(rule__IntervalType__LopenAssignment_4_0)
+		{ after(grammarAccess.getIntervalTypeAccess().getLopenAssignment_4_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getLeftSquareBracketKeyword_4_1()); }
+		'['
+		{ after(grammarAccess.getIntervalTypeAccess().getLeftSquareBracketKeyword_4_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getRightSquareBracketKeyword_8_0()); }
+		']'
+		{ after(grammarAccess.getIntervalTypeAccess().getRightSquareBracketKeyword_8_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getRopenAssignment_8_1()); }
+		(rule__IntervalType__RopenAssignment_8_1)
+		{ after(grammarAccess.getIntervalTypeAccess().getRopenAssignment_8_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Alternatives_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getLopenAssignment_8_0()); }
+		(rule__IntervalTypeDefinition__LopenAssignment_8_0)
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getLopenAssignment_8_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getLeftSquareBracketKeyword_8_1()); }
+		'['
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getLeftSquareBracketKeyword_8_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Alternatives_12
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getRightSquareBracketKeyword_12_0()); }
+		']'
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getRightSquareBracketKeyword_12_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getRopenAssignment_12_1()); }
+		(rule__IntervalTypeDefinition__RopenAssignment_12_1)
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getRopenAssignment_12_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Alternatives_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenAssignment_6_0()); }
+		(rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0)
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenAssignment_6_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLeftSquareBracketKeyword_6_1()); }
+		'['
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLeftSquareBracketKeyword_6_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Alternatives_10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getRightSquareBracketKeyword_10_0()); }
+		']'
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getRightSquareBracketKeyword_10_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenAssignment_10_1()); }
+		(rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1)
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenAssignment_10_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Alternatives_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeAccess().getSizeAssignment_4_1_0()); }
+		(rule__CollectionType__SizeAssignment_4_1_0)
+		{ after(grammarAccess.getCollectionTypeAccess().getSizeAssignment_4_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCollectionTypeAccess().getUnboundedAssignment_4_1_1()); }
+		(rule__CollectionType__UnboundedAssignment_4_1_1)
+		{ after(grammarAccess.getCollectionTypeAccess().getUnboundedAssignment_4_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Alternatives_8_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getSizeAssignment_8_1_0()); }
+		(rule__CollectionTypeDefinition__SizeAssignment_8_1_0)
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getSizeAssignment_8_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAssignment_8_1_1()); }
+		(rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1)
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAssignment_8_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Alternatives_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeAssignment_6_1_0()); }
+		(rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0)
+		{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeAssignment_6_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAssignment_6_1_1()); }
+		(rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1)
+		{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAssignment_6_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getVarKeyword_1_0()); }
+		'var'
+		{ after(grammarAccess.getVariableAccess().getVarKeyword_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariableAccess().getConstAssignment_1_1()); }
+		(rule__Variable__ConstAssignment_1_1)
+		{ after(grammarAccess.getVariableAccess().getConstAssignment_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariableAccess().getGroup_1_2()); }
+		(rule__Variable__Group_1_2__0)
+		{ after(grammarAccess.getVariableAccess().getGroup_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariableAccess().getGroup_1_3()); }
+		(rule__Variable__Group_1_3__0)
+		{ after(grammarAccess.getVariableAccess().getGroup_1_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Alternatives_1_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_0()); }
+		(rule__Variable__ConstAssignment_1_2_0_0)
+		{ after(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_1()); }
+		(rule__Variable__ConstAssignment_1_2_0_1)
+		{ after(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Alternatives_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getVarKeyword_1_3_1_0()); }
+		'var'
+		{ after(grammarAccess.getVariableAccess().getVarKeyword_1_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariableAccess().getConstAssignment_1_3_1_1()); }
+		(rule__Variable__ConstAssignment_1_3_1_1)
+		{ after(grammarAccess.getVariableAccess().getConstAssignment_1_3_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Alternatives_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getGroup_6_0()); }
+		(rule__Variable__Group_6_0__0)
+		{ after(grammarAccess.getVariableAccess().getGroup_6_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariableAccess().getSemicolonKeyword_6_1()); }
+		';'
+		{ after(grammarAccess.getVariableAccess().getSemicolonKeyword_6_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Alternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_0()); }
+		(rule__VariablePublic__ConstAssignment_1_0_0)
+		{ after(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_1()); }
+		(rule__VariablePublic__ConstAssignment_1_0_1)
+		{ after(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Alternatives_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getGroup_7_0()); }
+		(rule__VariablePublic__Group_7_0__0)
+		{ after(grammarAccess.getVariablePublicAccess().getGroup_7_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getSemicolonKeyword_7_1()); }
+		';'
+		{ after(grammarAccess.getVariablePublicAccess().getSemicolonKeyword_7_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Alternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_0()); }
+		(rule__VariableProtected__ConstAssignment_1_0_0)
+		{ after(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_1()); }
+		(rule__VariableProtected__ConstAssignment_1_0_1)
+		{ after(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Alternatives_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getGroup_7_0()); }
+		(rule__VariableProtected__Group_7_0__0)
+		{ after(grammarAccess.getVariableProtectedAccess().getGroup_7_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getSemicolonKeyword_7_1()); }
+		';'
+		{ after(grammarAccess.getVariableProtectedAccess().getSemicolonKeyword_7_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Alternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_0()); }
+		(rule__VariablePrivate__ConstAssignment_1_0_0)
+		{ after(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_1()); }
+		(rule__VariablePrivate__ConstAssignment_1_0_1)
+		{ after(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Alternatives_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getGroup_7_0()); }
+		(rule__VariablePrivate__Group_7_0__0)
+		{ after(grammarAccess.getVariablePrivateAccess().getGroup_7_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getSemicolonKeyword_7_1()); }
+		';'
+		{ after(grammarAccess.getVariablePrivateAccess().getSemicolonKeyword_7_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Alternatives_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferContainerTypeAccess().getSizeAssignment_2_1_0()); }
+		(rule__BufferContainerType__SizeAssignment_2_1_0)
+		{ after(grammarAccess.getBufferContainerTypeAccess().getSizeAssignment_2_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBufferContainerTypeAccess().getUnboundedAssignment_2_1_1()); }
+		(rule__BufferContainerType__UnboundedAssignment_2_1_1)
+		{ after(grammarAccess.getBufferContainerTypeAccess().getUnboundedAssignment_2_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Alternatives_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getGroup_5_0()); }
+		(rule__Transition__Group_5_0__0)
+		{ after(grammarAccess.getTransitionAccess().getGroup_5_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionAccess().getGroup_5_1()); }
+		(rule__Transition__Group_5_1__0)
+		{ after(grammarAccess.getTransitionAccess().getGroup_5_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Alternatives_5_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getGroup_5_0_1_0()); }
+		(rule__Transition__Group_5_0_1_0__0)
+		{ after(grammarAccess.getTransitionAccess().getGroup_5_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_0_1_1()); }
+		(rule__Transition__BehaviorAssignment_5_0_1_1)
+		{ after(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Alternatives_5_0_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getGuardAssignment_5_0_1_0_1_0()); }
+		(rule__Transition__GuardAssignment_5_0_1_0_1_0)
+		{ after(grammarAccess.getTransitionAccess().getGuardAssignment_5_0_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionAccess().getGuardKeyword_5_0_1_0_1_1()); }
+		'@guard:'
+		{ after(grammarAccess.getTransitionAccess().getGuardKeyword_5_0_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Alternatives_5_0_1_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getTguardAssignment_5_0_1_0_2_0()); }
+		(rule__Transition__TguardAssignment_5_0_1_0_2_0)
+		{ after(grammarAccess.getTransitionAccess().getTguardAssignment_5_0_1_0_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionAccess().getTguardKeyword_5_0_1_0_2_1()); }
+		'@tguard:'
+		{ after(grammarAccess.getTransitionAccess().getTguardKeyword_5_0_1_0_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Alternatives_5_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getGroup_5_1_2_0()); }
+		(rule__Transition__Group_5_1_2_0__0)
+		{ after(grammarAccess.getTransitionAccess().getGroup_5_1_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionAccess().getSemicolonKeyword_5_1_2_1()); }
+		';'
+		{ after(grammarAccess.getTransitionAccess().getSemicolonKeyword_5_1_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Alternatives_5_1_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0()); }
+		(rule__Transition__Group_5_1_2_0_1_0__0)
+		{ after(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_1_2_0_1_1()); }
+		(rule__Transition__BehaviorAssignment_5_1_2_0_1_1)
+		{ after(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_1_2_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Alternatives_5_1_2_0_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getGuardAssignment_5_1_2_0_1_0_1_0()); }
+		(rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0)
+		{ after(grammarAccess.getTransitionAccess().getGuardAssignment_5_1_2_0_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionAccess().getGuardKeyword_5_1_2_0_1_0_1_1()); }
+		'@guard:'
+		{ after(grammarAccess.getTransitionAccess().getGuardKeyword_5_1_2_0_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Alternatives_5_1_2_0_1_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getTguardAssignment_5_1_2_0_1_0_2_0()); }
+		(rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0)
+		{ after(grammarAccess.getTransitionAccess().getTguardAssignment_5_1_2_0_1_0_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionAccess().getTguardKeyword_5_1_2_0_1_0_2_1()); }
+		'@tguard:'
+		{ after(grammarAccess.getTransitionAccess().getTguardKeyword_5_1_2_0_1_0_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getGroup_1_0()); }
+		(rule__TransitionMoe__Group_1_0__0)
+		{ after(grammarAccess.getTransitionMoeAccess().getGroup_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getGroup_1_1()); }
+		(rule__TransitionMoe__Group_1_1__0)
+		{ after(grammarAccess.getTransitionMoeAccess().getGroup_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Alternatives_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0()); }
+		(rule__TransitionMoe__Group_1_0_1_0__0)
+		{ after(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_1()); }
+		(rule__TransitionMoe__IsElseAssignment_1_0_1_1)
+		{ after(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getGroup_0()); }
+		(rule__TransitionGuard__Group_0__0)
+		{ after(grammarAccess.getTransitionGuardAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getGroup_1()); }
+		(rule__TransitionGuard__Group_1__0)
+		{ after(grammarAccess.getTransitionGuardAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Alternatives_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0()); }
+		(rule__TransitionGuard__Group_1_1_0__0)
+		{ after(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getGuardStatementParserRuleCall_1_1_1()); }
+		ruleGuardStatement
+		{ after(grammarAccess.getTransitionGuardAccess().getGuardStatementParserRuleCall_1_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getEventGuardStatementParserRuleCall_1_1_2()); }
+		ruleEventGuardStatement
+		{ after(grammarAccess.getTransitionGuardAccess().getEventGuardStatementParserRuleCall_1_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getCheckSatGuardStatementParserRuleCall_1_1_3()); }
+		ruleCheckSatGuardStatement
+		{ after(grammarAccess.getTransitionGuardAccess().getCheckSatGuardStatementParserRuleCall_1_1_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Alternatives_1_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0_1_0()); }
+		(rule__TransitionGuard__Group_1_1_0_1_0__0)
+		{ after(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_1()); }
+		(rule__TransitionGuard__ConditionAssignment_1_1_0_1_1)
+		{ after(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__OperatorAlternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_0_0()); }
+		'&&'
+		{ after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAndKeyword_1_0_1()); }
+		'and'
+		{ after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAndKeyword_1_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_0_2()); }
+		'||'
+		{ after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_0_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorOrKeyword_1_0_3()); }
+		'or'
+		{ after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorOrKeyword_1_0_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getGroup_0()); }
+		(rule__TransitionTimedGuard__Group_0__0)
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getGroup_1()); }
+		(rule__TransitionTimedGuard__Group_1__0)
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Alternatives_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0()); }
+		(rule__TransitionTimedGuard__Group_1_1_0__0)
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementParserRuleCall_1_1_1()); }
+		ruleTimedGuardStatement
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementParserRuleCall_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Alternatives_1_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0_1_0()); }
+		(rule__TransitionTimedGuard__Group_1_1_0_1_0__0)
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_1()); }
+		(rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1)
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionEffectStatement__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getExpressionStatementParserRuleCall_0()); }
+		ruleExpressionStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getExpressionStatementParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getOutputComStatementParserRuleCall_1()); }
+		ruleOutputComStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getOutputComStatementParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getIfStatementParserRuleCall_2()); }
+		ruleIfStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getIfStatementParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getWhileDoStatementParserRuleCall_3()); }
+		ruleWhileDoStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getWhileDoStatementParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getDoWhileStatementParserRuleCall_4()); }
+		ruleDoWhileStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getDoWhileStatementParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getForStatementParserRuleCall_5()); }
+		ruleForStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getForStatementParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getForEachStatementParserRuleCall_6()); }
+		ruleForEachStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getForEachStatementParserRuleCall_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getInterruptStatementParserRuleCall_7()); }
+		ruleInterruptStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getInterruptStatementParserRuleCall_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getActivityStatementParserRuleCall_8()); }
+		ruleActivityStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getActivityStatementParserRuleCall_8()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionEffectStatementAccess().getInvokeStatementParserRuleCall_9()); }
+		ruleInvokeStatement
+		{ after(grammarAccess.getTransitionEffectStatementAccess().getInvokeStatementParserRuleCall_9()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statement__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatementAccess().getBlockStatementParserRuleCall_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getStatementAccess().getBlockStatementParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getExpressionStatementParserRuleCall_1()); }
+		ruleExpressionStatement
+		{ after(grammarAccess.getStatementAccess().getExpressionStatementParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getGuardStatementParserRuleCall_2()); }
+		ruleGuardStatement
+		{ after(grammarAccess.getStatementAccess().getGuardStatementParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getTimedGuardStatementParserRuleCall_3()); }
+		ruleTimedGuardStatement
+		{ after(grammarAccess.getStatementAccess().getTimedGuardStatementParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getEventGuardStatementParserRuleCall_4()); }
+		ruleEventGuardStatement
+		{ after(grammarAccess.getStatementAccess().getEventGuardStatementParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getCheckSatGuardStatementParserRuleCall_5()); }
+		ruleCheckSatGuardStatement
+		{ after(grammarAccess.getStatementAccess().getCheckSatGuardStatementParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getInputComStatementParserRuleCall_6()); }
+		ruleInputComStatement
+		{ after(grammarAccess.getStatementAccess().getInputComStatementParserRuleCall_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getOutputComStatementParserRuleCall_7()); }
+		ruleOutputComStatement
+		{ after(grammarAccess.getStatementAccess().getOutputComStatementParserRuleCall_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getIfStatementParserRuleCall_8()); }
+		ruleIfStatement
+		{ after(grammarAccess.getStatementAccess().getIfStatementParserRuleCall_8()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getWhileDoStatementParserRuleCall_9()); }
+		ruleWhileDoStatement
+		{ after(grammarAccess.getStatementAccess().getWhileDoStatementParserRuleCall_9()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getDoWhileStatementParserRuleCall_10()); }
+		ruleDoWhileStatement
+		{ after(grammarAccess.getStatementAccess().getDoWhileStatementParserRuleCall_10()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getForStatementParserRuleCall_11()); }
+		ruleForStatement
+		{ after(grammarAccess.getStatementAccess().getForStatementParserRuleCall_11()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getForEachStatementParserRuleCall_12()); }
+		ruleForEachStatement
+		{ after(grammarAccess.getStatementAccess().getForEachStatementParserRuleCall_12()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getInterruptStatementParserRuleCall_13()); }
+		ruleInterruptStatement
+		{ after(grammarAccess.getStatementAccess().getInterruptStatementParserRuleCall_13()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getActivityStatementParserRuleCall_14()); }
+		ruleActivityStatement
+		{ after(grammarAccess.getStatementAccess().getActivityStatementParserRuleCall_14()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStatementAccess().getInvokeStatementParserRuleCall_15()); }
+		ruleInvokeStatement
+		{ after(grammarAccess.getStatementAccess().getInvokeStatementParserRuleCall_15()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatementScheduler__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonVerticalLineKeyword_0()); }
+		'|;|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonVerticalLineKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSectionSignVerticalLineKeyword_1()); }
+		'|\u00A7|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSectionSignVerticalLineKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonSemicolonVerticalLineKeyword_2()); }
+		'|;;|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonSemicolonVerticalLineKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineFullStopVerticalLineKeyword_3()); }
+		'|.|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineFullStopVerticalLineKeyword_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusSemicolonVerticalLineKeyword_4()); }
+		'|/;|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusSemicolonVerticalLineKeyword_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getIKeyword_5()); }
+		'|i|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getIKeyword_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineCommaVerticalLineKeyword_6()); }
+		'|,|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineCommaVerticalLineKeyword_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getAKeyword_7()); }
+		'|a|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getAKeyword_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getAndKeyword_8()); }
+		'|and|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getAndKeyword_8()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getOrKeyword_9()); }
+		'|or|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getOrKeyword_9()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getAndThenKeyword_10()); }
+		'|and#then|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getAndThenKeyword_10()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getOrElseKeyword_11()); }
+		'|or#else|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getOrElseKeyword_11()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getIndetKeyword_12()); }
+		'|indet|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getIndetKeyword_12()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusReverseSolidusVerticalLineKeyword_13()); }
+		'|/\\|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusReverseSolidusVerticalLineKeyword_13()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getForkKeyword_14()); }
+		'|fork|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getForkKeyword_14()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockStatementSchedulerAccess().getJoinKeyword_15()); }
+		'|join|'
+		{ after(grammarAccess.getBlockStatementSchedulerAccess().getJoinKeyword_15()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getExpressionStatementAccess().getGroup_0()); }
+		(rule__ExpressionStatement__Group_0__0)
+		{ after(grammarAccess.getExpressionStatementAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getExpressionStatementAccess().getGroup_1()); }
+		(rule__ExpressionStatement__Group_1__0)
+		{ after(grammarAccess.getExpressionStatementAccess().getGroup_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getExpressionStatementAccess().getGroup_2()); }
+		(rule__ExpressionStatement__Group_2__0)
+		{ after(grammarAccess.getExpressionStatementAccess().getGroup_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getExpressionStatementAccess().getGroup_3()); }
+		(rule__ExpressionStatement__Group_3__0)
+		{ after(grammarAccess.getExpressionStatementAccess().getGroup_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Alternatives_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInputComStatementAccess().getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0()); }
+		'<=='
+		{ after(grammarAccess.getInputComStatementAccess().getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInputComStatementAccess().getViaKeyword_3_1_0_1()); }
+		'via'
+		{ after(grammarAccess.getInputComStatementAccess().getViaKeyword_3_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Alternatives_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOutputComStatementAccess().getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0()); }
+		'==>'
+		{ after(grammarAccess.getOutputComStatementAccess().getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOutputComStatementAccess().getViaKeyword_3_1_0_1()); }
+		'via'
+		{ after(grammarAccess.getOutputComStatementAccess().getViaKeyword_3_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__Alternatives_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getElseIfStatementAccess().getElseifKeyword_0_0()); }
+		'elseif'
+		{ after(grammarAccess.getElseIfStatementAccess().getElseifKeyword_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getElseIfStatementAccess().getGroup_0_1()); }
+		(rule__ElseIfStatement__Group_0_1__0)
+		{ after(grammarAccess.getElseIfStatementAccess().getGroup_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForStatementAccess().getGroup_0()); }
+		(rule__ForStatement__Group_0__0)
+		{ after(grammarAccess.getForStatementAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getForStatementAccess().getGroup_1()); }
+		(rule__ForStatement__Group_1__0)
+		{ after(grammarAccess.getForStatementAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForAssignmentExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForAssignmentExpressionAccess().getAssignmentExpressionParserRuleCall_0()); }
+		ruleAssignmentExpression
+		{ after(grammarAccess.getForAssignmentExpressionAccess().getAssignmentExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall_1()); }
+		ruleIncrementOrDecrementPrefixExpression
+		{ after(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall_2()); }
+		ruleIncrementOrDecrementPostfixExpression
+		{ after(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForEachStatementAccess().getGroup_0()); }
+		(rule__ForEachStatement__Group_0__0)
+		{ after(grammarAccess.getForEachStatementAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getForEachStatementAccess().getGroup_1()); }
+		(rule__ForEachStatement__Group_1__0)
+		{ after(grammarAccess.getForEachStatementAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_0()); }
+		(rule__InterruptStatement__ExprAssignment_1_0)
+		{ after(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInterruptStatementAccess().getGroup_1_1()); }
+		(rule__InterruptStatement__Group_1_1__0)
+		{ after(grammarAccess.getInterruptStatementAccess().getGroup_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_0()); }
+		(rule__InvokeStatement__Group_0__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_1()); }
+		(rule__InvokeStatement__Group_1__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_2()); }
+		(rule__InvokeStatement__Group_2__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_3()); }
+		(rule__InvokeStatement__Group_3__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Alternatives_1_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0()); }
+		(rule__InvokeStatement__Group_1_4_1_0__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1()); }
+		(rule__InvokeStatement__Group_1_4_1_1__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Alternatives_2_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0()); }
+		(rule__InvokeStatement__Group_2_5_1_0__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1()); }
+		(rule__InvokeStatement__Group_2_5_1_1__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Alternatives_3_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0()); }
+		(rule__InvokeStatement__Group_3_3_1_0__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1()); }
+		(rule__InvokeStatement__Group_3_3_1_1__0)
+		{ after(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Expression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getExpressionAccess().getAssignmentExpressionParserRuleCall_0()); }
+		ruleAssignmentExpression
+		{ after(grammarAccess.getExpressionAccess().getAssignmentExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getExpressionAccess().getConditionalTestExpressionParserRuleCall_1()); }
+		ruleConditionalTestExpression
+		{ after(grammarAccess.getExpressionAccess().getConditionalTestExpressionParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AssignmentOperator__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getEqualsSignKeyword_0()); }
+		'='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getEqualsSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getColonEqualsSignKeyword_1()); }
+		':='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getColonEqualsSignKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getColonColonEqualsSignKeyword_2()); }
+		'::='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getColonColonEqualsSignKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getPlusSignEqualsSignKeyword_3()); }
+		'+='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getPlusSignEqualsSignKeyword_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getHyphenMinusEqualsSignKeyword_4()); }
+		'-='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getHyphenMinusEqualsSignKeyword_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getAsteriskEqualsSignKeyword_5()); }
+		'*='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getAsteriskEqualsSignKeyword_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getSolidusEqualsSignKeyword_6()); }
+		'/='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getSolidusEqualsSignKeyword_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getPercentSignEqualsSignKeyword_7()); }
+		'%='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getPercentSignEqualsSignKeyword_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getAmpersandAmpersandEqualsSignKeyword_8()); }
+		'&&='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getAmpersandAmpersandEqualsSignKeyword_8()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getVerticalLineVerticalLineEqualsSignKeyword_9()); }
+		'||='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getVerticalLineVerticalLineEqualsSignKeyword_9()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getAmpersandEqualsSignKeyword_10()); }
+		'&='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getAmpersandEqualsSignKeyword_10()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getVerticalLineEqualsSignKeyword_11()); }
+		'|='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getVerticalLineEqualsSignKeyword_11()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignKeyword_12()); }
+		'^='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignKeyword_12()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getLessThanSignLessThanSignEqualsSignKeyword_13()); }
+		'<<='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getLessThanSignLessThanSignEqualsSignKeyword_13()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignEqualsSignKeyword_14()); }
+		'>>='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignEqualsSignKeyword_14()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15()); }
+		'>>>='
+		{ after(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getLessThanSignEqualsSignLessThanSignKeyword_16()); }
+		'<=<'
+		{ after(grammarAccess.getAssignmentOperatorAccess().getLessThanSignEqualsSignLessThanSignKeyword_16()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignLessThanSignKeyword_17()); }
+		'^=<'
+		{ after(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignLessThanSignKeyword_17()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignGreaterThanSignKeyword_18()); }
+		'^=>'
+		{ after(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignGreaterThanSignKeyword_18()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignEqualsSignGreaterThanSignKeyword_19()); }
+		'>=>'
+		{ after(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignEqualsSignGreaterThanSignKeyword_19()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_0()); }
+		(rule__LeftHandSideExpression__LvalueAssignment_1_0)
+		{ after(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLeftHandSideExpressionAccess().getGroup_1_1()); }
+		(rule__LeftHandSideExpression__Group_1_1__0)
+		{ after(grammarAccess.getLeftHandSideExpressionAccess().getGroup_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__OperatorAlternatives_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0()); }
+		'||'
+		{ after(grammarAccess.getLogicalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLogicalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1()); }
+		'or'
+		{ after(grammarAccess.getLogicalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Alternatives_1_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()); }
+		'||'
+		{ after(grammarAccess.getLogicalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLogicalOrExpressionAccess().getOrKeyword_1_3_0_1()); }
+		'or'
+		{ after(grammarAccess.getLogicalOrExpressionAccess().getOrKeyword_1_3_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__OperatorAlternatives_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0()); }
+		'&&'
+		{ after(grammarAccess.getLogicalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLogicalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1()); }
+		'and'
+		{ after(grammarAccess.getLogicalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Alternatives_1_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()); }
+		'&&'
+		{ after(grammarAccess.getLogicalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLogicalAndExpressionAccess().getAndKeyword_1_3_0_1()); }
+		'and'
+		{ after(grammarAccess.getLogicalAndExpressionAccess().getAndKeyword_1_3_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityOperator__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignKeyword_0()); }
+		'=='
+		{ after(grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEqualityOperatorAccess().getExclamationMarkEqualsSignKeyword_1()); }
+		'!='
+		{ after(grammarAccess.getEqualityOperatorAccess().getExclamationMarkEqualsSignKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
+		'==='
+		{ after(grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEqualityOperatorAccess().getEqualsSignExclamationMarkEqualsSignKeyword_3()); }
+		'=!='
+		{ after(grammarAccess.getEqualityOperatorAccess().getEqualsSignExclamationMarkEqualsSignKeyword_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEqualityOperatorAccess().getEqualsSignSolidusEqualsSignKeyword_4()); }
+		'=/='
+		{ after(grammarAccess.getEqualityOperatorAccess().getEqualsSignSolidusEqualsSignKeyword_4()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalOperator__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRelationalOperatorAccess().getLessThanSignKeyword_0()); }
+		'<'
+		{ after(grammarAccess.getRelationalOperatorAccess().getLessThanSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getRelationalOperatorAccess().getGreaterThanSignKeyword_1()); }
+		'>'
+		{ after(grammarAccess.getRelationalOperatorAccess().getGreaterThanSignKeyword_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getRelationalOperatorAccess().getLessThanSignEqualsSignKeyword_2()); }
+		'<='
+		{ after(grammarAccess.getRelationalOperatorAccess().getLessThanSignEqualsSignKeyword_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getRelationalOperatorAccess().getGreaterThanSignEqualsSignKeyword_3()); }
+		'>='
+		{ after(grammarAccess.getRelationalOperatorAccess().getGreaterThanSignEqualsSignKeyword_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0()); }
+		(rule__AdditiveExpression__Group_1_0__0)
+		{ after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1()); }
+		(rule__AdditiveExpression__Group_1_1__0)
+		{ after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0()); }
+		(rule__MultiplicativeExpression__Group_1_0__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1()); }
+		(rule__MultiplicativeExpression__Group_1_1__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2()); }
+		(rule__MultiplicativeExpression__Group_1_2__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3()); }
+		(rule__MultiplicativeExpression__Group_1_3__0)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnaryExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getLiteralTerminalExpressionParserRuleCall_0()); }
+		ruleLiteralTerminalExpression
+		{ after(grammarAccess.getUnaryExpressionAccess().getLiteralTerminalExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getArithmeticUnaryExpressionParserRuleCall_1()); }
+		ruleArithmeticUnaryExpression
+		{ after(grammarAccess.getUnaryExpressionAccess().getArithmeticUnaryExpressionParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getLogicalUnaryExpressionParserRuleCall_2()); }
+		ruleLogicalUnaryExpression
+		{ after(grammarAccess.getUnaryExpressionAccess().getLogicalUnaryExpressionParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getBitwiseUnaryExpressionParserRuleCall_3()); }
+		ruleBitwiseUnaryExpression
+		{ after(grammarAccess.getUnaryExpressionAccess().getBitwiseUnaryExpressionParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getNewfreshExpressionParserRuleCall_4()); }
+		ruleNewfreshExpression
+		{ after(grammarAccess.getUnaryExpressionAccess().getNewfreshExpressionParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getCastExpressionParserRuleCall_5()); }
+		ruleCastExpression
+		{ after(grammarAccess.getUnaryExpressionAccess().getCastExpressionParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getPrefixUnaryExpressionParserRuleCall_6()); }
+		rulePrefixUnaryExpression
+		{ after(grammarAccess.getUnaryExpressionAccess().getPrefixUnaryExpressionParserRuleCall_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getPostfixUnaryExpressionParserRuleCall_7()); }
+		rulePostfixUnaryExpression
+		{ after(grammarAccess.getUnaryExpressionAccess().getPostfixUnaryExpressionParserRuleCall_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getUnaryExpressionAccess().getPrimaryExpressionParserRuleCall_8()); }
+		rulePrimaryExpression
+		{ after(grammarAccess.getUnaryExpressionAccess().getPrimaryExpressionParserRuleCall_8()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AffixOperator__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAffixOperatorAccess().getPlusSignPlusSignKeyword_0()); }
+		'++'
+		{ after(grammarAccess.getAffixOperatorAccess().getPlusSignPlusSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getAffixOperatorAccess().getHyphenMinusHyphenMinusKeyword_1()); }
+		'--'
+		{ after(grammarAccess.getAffixOperatorAccess().getHyphenMinusHyphenMinusKeyword_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNewfreshExpressionAccess().getGroup_0()); }
+		(rule__NewfreshExpression__Group_0__0)
+		{ after(grammarAccess.getNewfreshExpressionAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getNewfreshExpressionAccess().getGroup_1()); }
+		(rule__NewfreshExpression__Group_1__0)
+		{ after(grammarAccess.getNewfreshExpressionAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArithmeticUnaryOperator__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getArithmeticUnaryOperatorAccess().getPlusSignKeyword_0()); }
+		'+'
+		{ after(grammarAccess.getArithmeticUnaryOperatorAccess().getPlusSignKeyword_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getArithmeticUnaryOperatorAccess().getHyphenMinusKeyword_1()); }
+		'-'
+		{ after(grammarAccess.getArithmeticUnaryOperatorAccess().getHyphenMinusKeyword_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalUnaryExpression__OperatorAlternatives_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorExclamationMarkKeyword_0_0_0()); }
+		'!'
+		{ after(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorExclamationMarkKeyword_0_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorNotKeyword_0_0_1()); }
+		'not'
+		{ after(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorNotKeyword_0_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Alternatives_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_0()); }
+		(rule__PrimaryExpression__Group_1_3_0__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_1()); }
+		(rule__PrimaryExpression__Group_1_3_1__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Alternatives_2_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_0()); }
+		(rule__PrimaryExpression__Group_2_3_0__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_1()); }
+		(rule__PrimaryExpression__Group_2_3_1__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Alternatives_2_4_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_0()); }
+		(rule__PrimaryExpression__Group_2_4_3_0__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_1()); }
+		(rule__PrimaryExpression__Group_2_4_3_1__0)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BaseExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBaseExpressionAccess().getLiteralReferenceableExpressionParserRuleCall_0()); }
+		ruleLiteralReferenceableExpression
+		{ after(grammarAccess.getBaseExpressionAccess().getLiteralReferenceableExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBaseExpressionAccess().getGroup_1()); }
+		(rule__BaseExpression__Group_1__0)
+		{ after(grammarAccess.getBaseExpressionAccess().getGroup_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBaseExpressionAccess().getInvokeExpressionDeprecatedParserRuleCall_2()); }
+		ruleInvokeExpressionDeprecated
+		{ after(grammarAccess.getBaseExpressionAccess().getInvokeExpressionDeprecatedParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBaseExpressionAccess().getInstantiationExpressionParserRuleCall_3()); }
+		ruleInstantiationExpression
+		{ after(grammarAccess.getBaseExpressionAccess().getInstantiationExpressionParserRuleCall_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Alternatives_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0()); }
+		(rule__DynamicInstanceSpecification__Group_3_0__0)
+		{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1()); }
+		(rule__DynamicInstanceSpecification__Group_3_1__0)
+		{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__ValueAlternatives_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_1_0_0()); }
+		ruleExpression
+		{ after(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_1_0_1()); }
+		ruleNamedExpression
+		{ after(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__ValueAlternatives_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_2_1_0_0()); }
+		ruleExpression
+		{ after(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_2_1_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_2_1_0_1()); }
+		ruleNamedExpression
+		{ after(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_2_1_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NamedExpression__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNamedExpressionAccess().getColonKeyword_1_0()); }
+		':'
+		{ after(grammarAccess.getNamedExpressionAccess().getColonKeyword_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getNamedExpressionAccess().getEqualsSignGreaterThanSignKeyword_1_1()); }
+		'=>'
+		{ after(grammarAccess.getNamedExpressionAccess().getEqualsSignGreaterThanSignKeyword_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getNamedExpressionAccess().getLessThanSignHyphenMinusKeyword_1_2()); }
+		'<-'
+		{ after(grammarAccess.getNamedExpressionAccess().getLessThanSignHyphenMinusKeyword_1_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceableExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralCollectionExpressionParserRuleCall_0()); }
+		ruleLiteralCollectionExpression
+		{ after(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralCollectionExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralReferenceExpressionParserRuleCall_1()); }
+		ruleLiteralReferenceExpression
+		{ after(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralReferenceExpressionParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTerminalExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralBooleanExpressionParserRuleCall_0()); }
+		ruleLiteralBooleanExpression
+		{ after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralBooleanExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralIntegerExpressionParserRuleCall_1()); }
+		ruleLiteralIntegerExpression
+		{ after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralIntegerExpressionParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralRationalExpressionParserRuleCall_2()); }
+		ruleLiteralRationalExpression
+		{ after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralRationalExpressionParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralFloatExpressionParserRuleCall_3()); }
+		ruleLiteralFloatExpression
+		{ after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralFloatExpressionParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralCharacterExpressionParserRuleCall_4()); }
+		ruleLiteralCharacterExpression
+		{ after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralCharacterExpressionParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralStringExpressionParserRuleCall_5()); }
+		ruleLiteralStringExpression
+		{ after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralStringExpressionParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralNullExpressionParserRuleCall_6()); }
+		ruleLiteralNullExpression
+		{ after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralNullExpressionParserRuleCall_6()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralNullExpressionAccess().getGroup_0()); }
+		(rule__LiteralNullExpression__Group_0__0)
+		{ after(grammarAccess.getLiteralNullExpressionAccess().getGroup_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralNullExpressionAccess().getGroup_1()); }
+		(rule__LiteralNullExpression__Group_1__0)
+		{ after(grammarAccess.getLiteralNullExpressionAccess().getGroup_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Alternatives_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_0()); }
+		'null'
+		{ after(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_1()); }
+		'$null'
+		{ after(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Alternatives_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_0()); }
+		'null<'
+		{ after(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_1()); }
+		'$null<'
+		{ after(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Alternatives_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_0()); }
+		(rule__LiteralCollectionExpression__ValueAssignment_3_0_0)
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_1()); }
+		(rule__LiteralCollectionExpression__ValueAssignment_3_0_1)
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Alternatives_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_0()); }
+		(rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0)
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_1()); }
+		(rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1)
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceElementParserRuleCall_0()); }
+		ruleLiteralReferenceElement
+		{ after(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceElementParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceVariableContextParserRuleCall_1()); }
+		ruleLiteralReferenceVariableContext
+		{ after(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceVariableContextParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_2()); }
+		ruleLiteralReferenceMachineContext
+		{ after(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralEnvExpressionParserRuleCall_3()); }
+		ruleLiteralEnvExpression
+		{ after(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralEnvExpressionParserRuleCall_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Alternatives_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_0()); }
+		(rule__LiteralReferenceElement__Group_2_0__0)
+		{ after(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_1()); }
+		(rule__LiteralReferenceElement__Group_2_1__0)
+		{ after(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceVariableContext__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeExpressionParserRuleCall_0()); }
+		ruleLiteralTimeExpression
+		{ after(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeDeltaExpressionParserRuleCall_1()); }
+		ruleLiteralTimeDeltaExpression
+		{ after(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeDeltaExpressionParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceMachineContext__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralThisExpressionParserRuleCall_0()); }
+		ruleLiteralThisExpression
+		{ after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralThisExpressionParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSelfExpressionParserRuleCall_1()); }
+		ruleLiteralSelfExpression
+		{ after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSelfExpressionParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralParentExpressionParserRuleCall_2()); }
+		ruleLiteralParentExpression
+		{ after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralParentExpressionParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSuperExpressionParserRuleCall_3()); }
+		ruleLiteralSuperExpression
+		{ after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSuperExpressionParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSystemExpressionParserRuleCall_4()); }
+		ruleLiteralSystemExpression
+		{ after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSystemExpressionParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralEnvExpressionParserRuleCall_5()); }
+		ruleLiteralEnvExpression
+		{ after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralEnvExpressionParserRuleCall_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralEnvExpression__Alternatives_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_0()); }
+		'$env'
+		{ after(grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_1()); }
+		'env'
+		{ after(grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralPureReferenceExpression__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralPureReferenceElementParserRuleCall_0()); }
+		ruleLiteralPureReferenceElement
+		{ after(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralPureReferenceElementParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_1()); }
+		ruleLiteralReferenceMachineContext
+		{ after(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VisibilityKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0()); }
+		('public')
+		{ after(grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1()); }
+		('private')
+		{ after(grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2()); }
+		('protected')
+		{ after(grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3()); }
+		('package')
+		{ after(grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DesignKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0()); }
+		('model')
+		{ after(grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1()); }
+		('prototype')
+		{ after(grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0()); }
+		('junction')
+		{ after(grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1()); }
+		('choice')
+		{ after(grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_2()); }
+		('entryPoint')
+		{ after(grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_3()); }
+		('exitPoint')
+		{ after(grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4()); }
+		('fork')
+		{ after(grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5()); }
+		('join')
+		{ after(grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6()); }
+		('dhistory')
+		{ after(grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7()); }
+		('shistory')
+		{ after(grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostateKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEndingPseudostateKindAccess().getTerminateEnumLiteralDeclaration_0()); }
+		('terminal')
+		{ after(grammarAccess.getEndingPseudostateKindAccess().getTerminateEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1()); }
+		('return')
+		{ after(grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocolKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0()); }
+		('env')
+		{ after(grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1()); }
+		('rdv')
+		{ after(grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2()); }
+		('multi_rdv')
+		{ after(grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComEnvRdvProtocolKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0()); }
+		('env')
+		{ after(grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1()); }
+		('rdv')
+		{ after(grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComCastKing__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0()); }
+		('unicast')
+		{ after(grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1()); }
+		('anycast')
+		{ after(grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2()); }
+		('multicast')
+		{ after(grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3()); }
+		('broadcast')
+		{ after(grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveNumberSign__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0()); }
+		('+')
+		{ after(grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1()); }
+		('++')
+		{ after(grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2()); }
+		('-')
+		{ after(grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3()); }
+		('--')
+		{ after(grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0()); }
+		('buffer')
+		{ after(grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1()); }
+		('message')
+		{ after(grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2()); }
+		('port')
+		{ after(grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3()); }
+		('signal')
+		{ after(grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4()); }
+		('machine')
+		{ after(grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5()); }
+		('vertex')
+		{ after(grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0()); }
+		('vector')
+		{ after(grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1()); }
+		('rvector')
+		{ after(grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2()); }
+		('list')
+		{ after(grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3()); }
+		('set')
+		{ after(grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4()); }
+		('bag')
+		{ after(grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5()); }
+		('fifo')
+		{ after(grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6()); }
+		('lifo')
+		{ after(grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterDirectionKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0()); }
+		('in')
+		{ after(grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1()); }
+		('inout')
+		{ after(grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2()); }
+		('out')
+		{ after(grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3()); }
+		('return')
+		{ after(grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockParameterDirectionKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBlockParameterDirectionKindAccess().getInEnumLiteralDeclaration_0()); }
+		('input')
+		{ after(grammarAccess.getBlockParameterDirectionKindAccess().getInEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1()); }
+		('inout')
+		{ after(grammarAccess.getBlockParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2()); }
+		('output')
+		{ after(grammarAccess.getBlockParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBlockParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3()); }
+		('return')
+		{ after(grammarAccess.getBlockParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0()); }
+		('set')
+		{ after(grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1()); }
+		('bag')
+		{ after(grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2()); }
+		('fifo')
+		{ after(grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3()); }
+		('lifo')
+		{ after(grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelDirection__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0()); }
+		('input')
+		{ after(grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1()); }
+		('inout')
+		{ after(grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2()); }
+		('output')
+		{ after(grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoc__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0()); }
+		('simple')
+		{ after(grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1()); }
+		('abort')
+		{ after(grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2()); }
+		('final')
+		{ after(grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatementKind__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0()); }
+		('break')
+		{ after(grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1()); }
+		('continue')
+		{ after(grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2()); }
+		('return')
+		{ after(grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3()); }
+		('exit')
+		{ after(grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OPERATOR_ACTIVITY__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0()); }
+		('init')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1()); }
+		('final')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_2()); }
+		('destroy')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_3()); }
+		('start')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_4()); }
+		('stop')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_5()); }
+		('restart')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_6()); }
+		('suspend')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_7()); }
+		('resume')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_8()); }
+		('wait')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_8()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_9()); }
+		('disable')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_9()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_10()); }
+		('enable')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_10()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_11()); }
+		('abort')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_11()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_12()); }
+		('schedule')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_12()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_13()); }
+		('irun')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_13()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_14()); }
+		('run')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_14()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_15()); }
+		('rtc')
+		{ after(grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_15()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Xlia__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Xlia__Group__0__Impl
+	rule__Xlia__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Xlia__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaAccess().getPrologAssignment_0()); }
+	(rule__Xlia__PrologAssignment_0)
+	{ after(grammarAccess.getXliaAccess().getPrologAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Xlia__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Xlia__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Xlia__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaAccess().getSystemAssignment_1()); }
+	(rule__Xlia__SystemAssignment_1)
+	{ after(grammarAccess.getXliaAccess().getSystemAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XliaPrologObject__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaPrologObject__Group__0__Impl
+	rule__XliaPrologObject__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaPrologObjectAccess().getNameAssignment_0()); }
+	(rule__XliaPrologObject__NameAssignment_0)
+	{ after(grammarAccess.getXliaPrologObjectAccess().getNameAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaPrologObject__Group__1__Impl
+	rule__XliaPrologObject__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaPrologObjectAccess().getLessThanSignKeyword_1()); }
+	'<'
+	{ after(grammarAccess.getXliaPrologObjectAccess().getLessThanSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaPrologObject__Group__2__Impl
+	rule__XliaPrologObject__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_2()); }
+	(rule__XliaPrologObject__ElementsAssignment_2)
+	{ after(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaPrologObject__Group__3__Impl
+	rule__XliaPrologObject__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaPrologObjectAccess().getGreaterThanSignColonKeyword_3()); }
+	'>:'
+	{ after(grammarAccess.getXliaPrologObjectAccess().getGreaterThanSignColonKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaPrologObject__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_4()); }
+	(rule__XliaPrologObject__ElementsAssignment_4)?
+	{ after(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XliaPrologAttribute__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaPrologAttribute__Group__0__Impl
+	rule__XliaPrologAttribute__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaPrologAttributeAccess().getNameAssignment_0()); }
+	(rule__XliaPrologAttribute__NameAssignment_0)
+	{ after(grammarAccess.getXliaPrologAttributeAccess().getNameAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaPrologAttribute__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaPrologAttributeAccess().getGroup_1()); }
+	(rule__XliaPrologAttribute__Group_1__0)?
+	{ after(grammarAccess.getXliaPrologAttributeAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XliaPrologAttribute__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaPrologAttribute__Group_1__0__Impl
+	rule__XliaPrologAttribute__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaPrologAttributeAccess().getCommaKeyword_1_0()); }
+	','
+	{ after(grammarAccess.getXliaPrologAttributeAccess().getCommaKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaPrologAttribute__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaPrologAttributeAccess().getValueAssignment_1_1()); }
+	(rule__XliaPrologAttribute__ValueAssignment_1_1)
+	{ after(grammarAccess.getXliaPrologAttributeAccess().getValueAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XliaOptionObject__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaOptionObject__Group__0__Impl
+	rule__XliaOptionObject__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaOptionObject__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaOptionObjectAccess().getNameAssignment_0()); }
+	(rule__XliaOptionObject__NameAssignment_0)
+	{ after(grammarAccess.getXliaOptionObjectAccess().getNameAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaOptionObject__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaOptionObject__Group__1__Impl
+	rule__XliaOptionObject__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaOptionObject__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaOptionObjectAccess().getLeftCurlyBracketKeyword_1()); }
+	'{'
+	{ after(grammarAccess.getXliaOptionObjectAccess().getLeftCurlyBracketKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaOptionObject__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaOptionObject__Group__2__Impl
+	rule__XliaOptionObject__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaOptionObject__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaOptionObjectAccess().getElementsAssignment_2()); }
+	(rule__XliaOptionObject__ElementsAssignment_2)*
+	{ after(grammarAccess.getXliaOptionObjectAccess().getElementsAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaOptionObject__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaOptionObject__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaOptionObject__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaOptionObjectAccess().getRightCurlyBracketKeyword_3()); }
+	'}'
+	{ after(grammarAccess.getXliaOptionObjectAccess().getRightCurlyBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XliaObject__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaObject__Group__0__Impl
+	rule__XliaObject__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaObject__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaObjectAccess().getNameAssignment_0()); }
+	(rule__XliaObject__NameAssignment_0)
+	{ after(grammarAccess.getXliaObjectAccess().getNameAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaObject__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaObject__Group__1__Impl
+	rule__XliaObject__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaObject__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaObjectAccess().getLeftCurlyBracketKeyword_1()); }
+	'{'
+	{ after(grammarAccess.getXliaObjectAccess().getLeftCurlyBracketKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaObject__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaObject__Group__2__Impl
+	rule__XliaObject__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaObject__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaObjectAccess().getElementsAssignment_2()); }
+	(rule__XliaObject__ElementsAssignment_2)*
+	{ after(grammarAccess.getXliaObjectAccess().getElementsAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaObject__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaObject__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaObject__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaObjectAccess().getRightCurlyBracketKeyword_3()); }
+	'}'
+	{ after(grammarAccess.getXliaObjectAccess().getRightCurlyBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XliaAttribute__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaAttribute__Group__0__Impl
+	rule__XliaAttribute__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaAttribute__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaAttributeAccess().getNameAssignment_0()); }
+	(rule__XliaAttribute__NameAssignment_0)
+	{ after(grammarAccess.getXliaAttributeAccess().getNameAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaAttribute__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaAttribute__Group__1__Impl
+	rule__XliaAttribute__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaAttribute__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaAttributeAccess().getEqualsSignKeyword_1()); }
+	'='
+	{ after(grammarAccess.getXliaAttributeAccess().getEqualsSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaAttribute__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaAttribute__Group__2__Impl
+	rule__XliaAttribute__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaAttribute__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaAttributeAccess().getValueAssignment_2()); }
+	(rule__XliaAttribute__ValueAssignment_2)
+	{ after(grammarAccess.getXliaAttributeAccess().getValueAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaAttribute__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XliaAttribute__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaAttribute__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXliaAttributeAccess().getSemicolonKeyword_3()); }
+	';'
+	{ after(grammarAccess.getXliaAttributeAccess().getSemicolonKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EInt__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EInt__Group__0__Impl
+	rule__EInt__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EInt__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEIntAccess().getHyphenMinusKeyword_0()); }
+	('-')?
+	{ after(grammarAccess.getEIntAccess().getHyphenMinusKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EInt__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EInt__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EInt__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEIntAccess().getINTTerminalRuleCall_1()); }
+	RULE_INT
+	{ after(grammarAccess.getEIntAccess().getINTTerminalRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EInteger__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EInteger__Group__0__Impl
+	rule__EInteger__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EInteger__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEIntegerAccess().getHyphenMinusKeyword_0()); }
+	('-')?
+	{ after(grammarAccess.getEIntegerAccess().getHyphenMinusKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EInteger__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EInteger__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EInteger__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEIntegerAccess().getINTTerminalRuleCall_1()); }
+	RULE_INT
+	{ after(grammarAccess.getEIntegerAccess().getINTTerminalRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EDouble__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EDouble__Group__0__Impl
+	rule__EDouble__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0()); }
+	('-')?
+	{ after(grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EDouble__Group__1__Impl
+	rule__EDouble__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1()); }
+	(RULE_INT)?
+	{ after(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EDouble__Group__2__Impl
+	rule__EDouble__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEDoubleAccess().getFullStopKeyword_2()); }
+	'.'
+	{ after(grammarAccess.getEDoubleAccess().getFullStopKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EDouble__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EDouble__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3()); }
+	RULE_INT
+	{ after(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ESUfid__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ESUfid__Group__0__Impl
+	rule__ESUfid__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ESUfid__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_0()); }
+	RULE_XLIA_ID
+	{ after(grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ESUfid__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ESUfid__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ESUfid__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getESUfidAccess().getGroup_1()); }
+	(rule__ESUfid__Group_1__0)*
+	{ after(grammarAccess.getESUfidAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ESUfid__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ESUfid__Group_1__0__Impl
+	rule__ESUfid__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ESUfid__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getESUfidAccess().getAlternatives_1_0()); }
+	(rule__ESUfid__Alternatives_1_0)
+	{ after(grammarAccess.getESUfidAccess().getAlternatives_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ESUfid__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ESUfid__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ESUfid__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_1_1()); }
+	RULE_XLIA_ID
+	{ after(grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__0__Impl
+	rule__System__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getUnorderedGroup_0()); }
+	(rule__System__UnorderedGroup_0)
+	{ after(grammarAccess.getSystemAccess().getUnorderedGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__1__Impl
+	rule__System__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getSystemKeyword_1()); }
+	'system'
+	{ after(grammarAccess.getSystemAccess().getSystemKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__2__Impl
+	rule__System__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getGroup_2()); }
+	(rule__System__Group_2__0)?
+	{ after(grammarAccess.getSystemAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__3__Impl
+	rule__System__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getNameAssignment_3()); }
+	(rule__System__NameAssignment_3)
+	{ after(grammarAccess.getSystemAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__4__Impl
+	rule__System__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__System__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getSystemAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__5__Impl
+	rule__System__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getLeftCurlyBracketKeyword_5()); }
+	'{'
+	{ after(grammarAccess.getSystemAccess().getLeftCurlyBracketKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__6__Impl
+	rule__System__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_6()); }
+	(rule__System__Alternatives_6)*
+	{ after(grammarAccess.getSystemAccess().getAlternatives_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__7__Impl
+	rule__System__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_7()); }
+	(rule__System__Alternatives_7)*
+	{ after(grammarAccess.getSystemAccess().getAlternatives_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__8__Impl
+	rule__System__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_8()); }
+	(rule__System__Alternatives_8)
+	{ after(grammarAccess.getSystemAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__9__Impl
+	rule__System__Group__10
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_9()); }
+	(rule__System__Alternatives_9)*
+	{ after(grammarAccess.getSystemAccess().getAlternatives_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__10__Impl
+	rule__System__Group__11
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__10__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_10()); }
+	(rule__System__Alternatives_10)*
+	{ after(grammarAccess.getSystemAccess().getAlternatives_10()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__11__Impl
+	rule__System__Group__12
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__11__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getMainAssignment_11()); }
+	(rule__System__MainAssignment_11)
+	{ after(grammarAccess.getSystemAccess().getMainAssignment_11()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__12
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group__12__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group__12__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getRightCurlyBracketKeyword_12()); }
+	'}'
+	{ after(grammarAccess.getSystemAccess().getRightCurlyBracketKeyword_12()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_2__0__Impl
+	rule__System__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getLessThanSignKeyword_2_0()); }
+	'<'
+	{ after(grammarAccess.getSystemAccess().getLessThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_2__1__Impl
+	rule__System__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getMocKeyword_2_1()); }
+	('moc:')?
+	{ after(grammarAccess.getSystemAccess().getMocKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_2__2__Impl
+	rule__System__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_2_2()); }
+	(rule__System__Alternatives_2_2)
+	{ after(grammarAccess.getSystemAccess().getAlternatives_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getGreaterThanSignKeyword_2_3()); }
+	'>'
+	{ after(grammarAccess.getSystemAccess().getGreaterThanSignKeyword_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_7_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_7_0__0__Impl
+	rule__System__Group_7_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()); }
+	'@property:'
+	{ after(grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_7_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_7_0_1()); }
+	(rule__System__Alternatives_7_0_1)*
+	{ after(grammarAccess.getSystemAccess().getAlternatives_7_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_7_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_7_1__0__Impl
+	rule__System__Group_7_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getPublicKeyword_7_1_0()); }
+	'@public:'
+	{ after(grammarAccess.getSystemAccess().getPublicKeyword_7_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_7_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_7_1_1()); }
+	(rule__System__Alternatives_7_1_1)*
+	{ after(grammarAccess.getSystemAccess().getAlternatives_7_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_7_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_7_2__0__Impl
+	rule__System__Group_7_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()); }
+	'@protected:'
+	{ after(grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_7_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_7_2_1()); }
+	(rule__System__Alternatives_7_2_1)*
+	{ after(grammarAccess.getSystemAccess().getAlternatives_7_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_7_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_7_3__0__Impl
+	rule__System__Group_7_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()); }
+	'@private:'
+	{ after(grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_7_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_7_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_7_3_1()); }
+	(rule__System__Alternatives_7_3_1)*
+	{ after(grammarAccess.getSystemAccess().getAlternatives_7_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_8_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_8_0_0__0__Impl
+	rule__System__Group_8_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_8_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_8_0_0_0()); }
+	(rule__System__Alternatives_8_0_0_0)
+	{ after(grammarAccess.getSystemAccess().getAlternatives_8_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_8_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_8_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_8_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getSystemAccess().getRoutineAssignment_8_0_0_1()); }
+		(rule__System__RoutineAssignment_8_0_0_1)
+		{ after(grammarAccess.getSystemAccess().getRoutineAssignment_8_0_0_1()); }
+	)
+	(
+		{ before(grammarAccess.getSystemAccess().getRoutineAssignment_8_0_0_1()); }
+		(rule__System__RoutineAssignment_8_0_0_1)*
+		{ after(grammarAccess.getSystemAccess().getRoutineAssignment_8_0_0_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_8_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_8_0_1__0__Impl
+	rule__System__Group_8_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_8_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getProcedureKeyword_8_0_1_0()); }
+	'@procedure:'
+	{ after(grammarAccess.getSystemAccess().getProcedureKeyword_8_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_8_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_8_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_8_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getSystemAccess().getProcedureAssignment_8_0_1_1()); }
+		(rule__System__ProcedureAssignment_8_0_1_1)
+		{ after(grammarAccess.getSystemAccess().getProcedureAssignment_8_0_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getSystemAccess().getProcedureAssignment_8_0_1_1()); }
+		(rule__System__ProcedureAssignment_8_0_1_1)*
+		{ after(grammarAccess.getSystemAccess().getProcedureAssignment_8_0_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_9_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_9_0__0__Impl
+	rule__System__Group_9_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getAlternatives_9_0_0()); }
+	(rule__System__Alternatives_9_0_0)
+	{ after(grammarAccess.getSystemAccess().getAlternatives_9_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_9_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getSystemAccess().getAlternatives_9_0_1()); }
+		(rule__System__Alternatives_9_0_1)
+		{ after(grammarAccess.getSystemAccess().getAlternatives_9_0_1()); }
+	)
+	(
+		{ before(grammarAccess.getSystemAccess().getAlternatives_9_0_1()); }
+		(rule__System__Alternatives_9_0_1)*
+		{ after(grammarAccess.getSystemAccess().getAlternatives_9_0_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_9_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_9_1__0__Impl
+	rule__System__Group_9_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getModelKeyword_9_1_0()); }
+	'@model:'
+	{ after(grammarAccess.getSystemAccess().getModelKeyword_9_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_9_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getMachineAssignment_9_1_1()); }
+	(rule__System__MachineAssignment_9_1_1)*
+	{ after(grammarAccess.getSystemAccess().getMachineAssignment_9_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_9_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_9_2__0__Impl
+	rule__System__Group_9_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0()); }
+	'@prototype:'
+	{ after(grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_9_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getMachineAssignment_9_2_1()); }
+	(rule__System__MachineAssignment_9_2_1)*
+	{ after(grammarAccess.getSystemAccess().getMachineAssignment_9_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_9_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_9_3__0__Impl
+	rule__System__Group_9_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()); }
+	'@instance:'
+	{ after(grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_9_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_9_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getInstanceAssignment_9_3_1()); }
+	(rule__System__InstanceAssignment_9_3_1)*
+	{ after(grammarAccess.getSystemAccess().getInstanceAssignment_9_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_10_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_10_0__0__Impl
+	rule__System__Group_10_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_10_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getBehaviorKeyword_10_0_0()); }
+	'@behavior:'
+	{ after(grammarAccess.getSystemAccess().getBehaviorKeyword_10_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_10_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_10_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_10_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getSystemAccess().getBehaviorAssignment_10_0_1()); }
+		(rule__System__BehaviorAssignment_10_0_1)
+		{ after(grammarAccess.getSystemAccess().getBehaviorAssignment_10_0_1()); }
+	)
+	(
+		{ before(grammarAccess.getSystemAccess().getBehaviorAssignment_10_0_1()); }
+		(rule__System__BehaviorAssignment_10_0_1)*
+		{ after(grammarAccess.getSystemAccess().getBehaviorAssignment_10_0_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__Group_10_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_10_1__0__Impl
+	rule__System__Group_10_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_10_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSystemAccess().getStatemachineKeyword_10_1_0()); }
+	'@statemachine:'
+	{ after(grammarAccess.getSystemAccess().getStatemachineKeyword_10_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_10_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__Group_10_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Group_10_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getSystemAccess().getBehaviorAssignment_10_1_1()); }
+		(rule__System__BehaviorAssignment_10_1_1)
+		{ after(grammarAccess.getSystemAccess().getBehaviorAssignment_10_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getSystemAccess().getBehaviorAssignment_10_1_1()); }
+		(rule__System__BehaviorAssignment_10_1_1)*
+		{ after(grammarAccess.getSystemAccess().getBehaviorAssignment_10_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InstanceMachine__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group__0__Impl
+	rule__InstanceMachine__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getInstanceKeyword_0()); }
+	'instance'
+	{ after(grammarAccess.getInstanceMachineAccess().getInstanceKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group__1__Impl
+	rule__InstanceMachine__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getAlternatives_1()); }
+	(rule__InstanceMachine__Alternatives_1)?
+	{ after(grammarAccess.getInstanceMachineAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group__2__Impl
+	rule__InstanceMachine__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getLessThanSignKeyword_2()); }
+	'<'
+	{ after(grammarAccess.getInstanceMachineAccess().getLessThanSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group__3__Impl
+	rule__InstanceMachine__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getModelKeyword_3()); }
+	('model:')?
+	{ after(grammarAccess.getInstanceMachineAccess().getModelKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group__4__Impl
+	rule__InstanceMachine__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getModelAssignment_4()); }
+	(rule__InstanceMachine__ModelAssignment_4)
+	{ after(grammarAccess.getInstanceMachineAccess().getModelAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group__5__Impl
+	rule__InstanceMachine__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getGreaterThanSignKeyword_5()); }
+	'>'
+	{ after(grammarAccess.getInstanceMachineAccess().getGreaterThanSignKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group__6__Impl
+	rule__InstanceMachine__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getNameAssignment_6()); }
+	(rule__InstanceMachine__NameAssignment_6)
+	{ after(grammarAccess.getInstanceMachineAccess().getNameAssignment_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group__7__Impl
+	rule__InstanceMachine__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameAssignment_7()); }
+	(rule__InstanceMachine__UnrestrictedNameAssignment_7)?
+	{ after(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getAlternatives_8()); }
+	(rule__InstanceMachine__Alternatives_8)
+	{ after(grammarAccess.getInstanceMachineAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InstanceMachine__Group_8_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_0__0__Impl
+	rule__InstanceMachine__Group_8_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0()); }
+	(rule__InstanceMachine__Group_8_0_0__0)?
+	{ after(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_0_1()); }
+	';'
+	{ after(grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InstanceMachine__Group_8_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_0_0__0__Impl
+	rule__InstanceMachine__Group_8_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getLeftParenthesisKeyword_8_0_0_0()); }
+	'('
+	{ after(grammarAccess.getInstanceMachineAccess().getLeftParenthesisKeyword_8_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_0_0__1__Impl
+	rule__InstanceMachine__Group_8_0_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1()); }
+	(rule__InstanceMachine__Group_8_0_0_1__0)?
+	{ after(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_0_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getRightParenthesisKeyword_8_0_0_2()); }
+	')'
+	{ after(grammarAccess.getInstanceMachineAccess().getRightParenthesisKeyword_8_0_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InstanceMachine__Group_8_0_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_0_0_1__0__Impl
+	rule__InstanceMachine__Group_8_0_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_0()); }
+	(rule__InstanceMachine__SlotAssignment_8_0_0_1_0)
+	{ after(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_0_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1_1()); }
+	(rule__InstanceMachine__Group_8_0_0_1_1__0)*
+	{ after(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InstanceMachine__Group_8_0_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_0_0_1_1__0__Impl
+	rule__InstanceMachine__Group_8_0_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getCommaKeyword_8_0_0_1_1_0()); }
+	','
+	{ after(grammarAccess.getInstanceMachineAccess().getCommaKeyword_8_0_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_0_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_0_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_1_1()); }
+	(rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1)
+	{ after(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InstanceMachine__Group_8_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_1__0__Impl
+	rule__InstanceMachine__Group_8_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getLeftCurlyBracketKeyword_8_1_0()); }
+	'{'
+	{ after(grammarAccess.getInstanceMachineAccess().getLeftCurlyBracketKeyword_8_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_1__1__Impl
+	rule__InstanceMachine__Group_8_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getGroup_8_1_1()); }
+	(rule__InstanceMachine__Group_8_1_1__0)*
+	{ after(grammarAccess.getInstanceMachineAccess().getGroup_8_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getRightCurlyBracketKeyword_8_1_2()); }
+	'}'
+	{ after(grammarAccess.getInstanceMachineAccess().getRightCurlyBracketKeyword_8_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InstanceMachine__Group_8_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_1_1__0__Impl
+	rule__InstanceMachine__Group_8_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_1_1_0()); }
+	(rule__InstanceMachine__SlotAssignment_8_1_1_0)
+	{ after(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstanceMachine__Group_8_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__Group_8_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_1_1_1()); }
+	';'
+	{ after(grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SlotParameter__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SlotParameter__Group__0__Impl
+	rule__SlotParameter__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotParameter__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSlotParameterAccess().getXliaPropertyAssignment_0()); }
+	(rule__SlotParameter__XliaPropertyAssignment_0)
+	{ after(grammarAccess.getSlotParameterAccess().getXliaPropertyAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotParameter__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SlotParameter__Group__1__Impl
+	rule__SlotParameter__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotParameter__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSlotParameterAccess().getColonKeyword_1()); }
+	':'
+	{ after(grammarAccess.getSlotParameterAccess().getColonKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotParameter__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SlotParameter__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotParameter__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSlotParameterAccess().getValueAssignment_2()); }
+	(rule__SlotParameter__ValueAssignment_2)
+	{ after(grammarAccess.getSlotParameterAccess().getValueAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SlotProperty__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SlotProperty__Group__0__Impl
+	rule__SlotProperty__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotProperty__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSlotPropertyAccess().getXliaPropertyAssignment_0()); }
+	(rule__SlotProperty__XliaPropertyAssignment_0)
+	{ after(grammarAccess.getSlotPropertyAccess().getXliaPropertyAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotProperty__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SlotProperty__Group__1__Impl
+	rule__SlotProperty__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotProperty__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSlotPropertyAccess().getEqualsSignKeyword_1()); }
+	'='
+	{ after(grammarAccess.getSlotPropertyAccess().getEqualsSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotProperty__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SlotProperty__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotProperty__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSlotPropertyAccess().getValueAssignment_2()); }
+	(rule__SlotProperty__ValueAssignment_2)
+	{ after(grammarAccess.getSlotPropertyAccess().getValueAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__0__Impl
+	rule__MachineBlock__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()); }
+	(rule__MachineBlock__UnorderedGroup_0)
+	{ after(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__1__Impl
+	rule__MachineBlock__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getMachineKeyword_1()); }
+	'machine'
+	{ after(grammarAccess.getMachineBlockAccess().getMachineKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__2__Impl
+	rule__MachineBlock__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getGroup_2()); }
+	(rule__MachineBlock__Group_2__0)?
+	{ after(grammarAccess.getMachineBlockAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__3__Impl
+	rule__MachineBlock__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getNameAssignment_3()); }
+	(rule__MachineBlock__NameAssignment_3)
+	{ after(grammarAccess.getMachineBlockAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__4__Impl
+	rule__MachineBlock__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__MachineBlock__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getMachineBlockAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__5__Impl
+	rule__MachineBlock__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getLeftCurlyBracketKeyword_5()); }
+	'{'
+	{ after(grammarAccess.getMachineBlockAccess().getLeftCurlyBracketKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__6__Impl
+	rule__MachineBlock__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_6()); }
+	(rule__MachineBlock__Alternatives_6)*
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__7__Impl
+	rule__MachineBlock__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_7()); }
+	(rule__MachineBlock__Alternatives_7)*
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__8__Impl
+	rule__MachineBlock__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_8()); }
+	(rule__MachineBlock__Alternatives_8)
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__9__Impl
+	rule__MachineBlock__Group__10
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_9()); }
+	(rule__MachineBlock__Alternatives_9)*
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__10__Impl
+	rule__MachineBlock__Group__11
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__10__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_10()); }
+	(rule__MachineBlock__Alternatives_10)*
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_10()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__11__Impl
+	rule__MachineBlock__Group__12
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__11__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getMainAssignment_11()); }
+	(rule__MachineBlock__MainAssignment_11)
+	{ after(grammarAccess.getMachineBlockAccess().getMainAssignment_11()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__12
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group__12__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group__12__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getRightCurlyBracketKeyword_12()); }
+	'}'
+	{ after(grammarAccess.getMachineBlockAccess().getRightCurlyBracketKeyword_12()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_2__0__Impl
+	rule__MachineBlock__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getLessThanSignKeyword_2_0()); }
+	'<'
+	{ after(grammarAccess.getMachineBlockAccess().getLessThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_2__1__Impl
+	rule__MachineBlock__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getMocKeyword_2_1()); }
+	('moc:')?
+	{ after(grammarAccess.getMachineBlockAccess().getMocKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_2__2__Impl
+	rule__MachineBlock__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_2_2()); }
+	(rule__MachineBlock__Alternatives_2_2)
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getGreaterThanSignKeyword_2_3()); }
+	'>'
+	{ after(grammarAccess.getMachineBlockAccess().getGreaterThanSignKeyword_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_7_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_7_0__0__Impl
+	rule__MachineBlock__Group_7_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()); }
+	'@property:'
+	{ after(grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_7_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_7_0_1()); }
+	(rule__MachineBlock__Alternatives_7_0_1)*
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_7_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_7_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_7_1__0__Impl
+	rule__MachineBlock__Group_7_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0()); }
+	'@public:'
+	{ after(grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_7_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_7_1_1()); }
+	(rule__MachineBlock__Alternatives_7_1_1)*
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_7_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_7_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_7_2__0__Impl
+	rule__MachineBlock__Group_7_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()); }
+	'@protected:'
+	{ after(grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_7_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_7_2_1()); }
+	(rule__MachineBlock__Alternatives_7_2_1)*
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_7_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_7_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_7_3__0__Impl
+	rule__MachineBlock__Group_7_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()); }
+	'@private:'
+	{ after(grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_7_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_7_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_7_3_1()); }
+	(rule__MachineBlock__Alternatives_7_3_1)*
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_7_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_8_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_8_0_0__0__Impl
+	rule__MachineBlock__Group_8_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_8_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_8_0_0_0()); }
+	(rule__MachineBlock__Alternatives_8_0_0_0)
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_8_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_8_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_8_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_8_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_0_0_1()); }
+		(rule__MachineBlock__RoutineAssignment_8_0_0_1)
+		{ after(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_0_0_1()); }
+	)
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_0_0_1()); }
+		(rule__MachineBlock__RoutineAssignment_8_0_0_1)*
+		{ after(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_0_0_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_8_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_8_0_1__0__Impl
+	rule__MachineBlock__Group_8_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_8_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getProcedureKeyword_8_0_1_0()); }
+	'@procedure:'
+	{ after(grammarAccess.getMachineBlockAccess().getProcedureKeyword_8_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_8_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_8_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_8_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_0_1_1()); }
+		(rule__MachineBlock__ProcedureAssignment_8_0_1_1)
+		{ after(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_0_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_0_1_1()); }
+		(rule__MachineBlock__ProcedureAssignment_8_0_1_1)*
+		{ after(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_0_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_9_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_9_0__0__Impl
+	rule__MachineBlock__Group_9_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_0()); }
+	(rule__MachineBlock__Alternatives_9_0_0)
+	{ after(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_9_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_1()); }
+		(rule__MachineBlock__Alternatives_9_0_1)
+		{ after(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_1()); }
+	)
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_1()); }
+		(rule__MachineBlock__Alternatives_9_0_1)*
+		{ after(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_9_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_9_1__0__Impl
+	rule__MachineBlock__Group_9_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()); }
+	'@model:'
+	{ after(grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_9_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_1_1()); }
+	(rule__MachineBlock__MachineAssignment_9_1_1)*
+	{ after(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_9_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_9_2__0__Impl
+	rule__MachineBlock__Group_9_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0()); }
+	'@prototype:'
+	{ after(grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_9_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_2_1()); }
+	(rule__MachineBlock__MachineAssignment_9_2_1)*
+	{ after(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_9_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_9_3__0__Impl
+	rule__MachineBlock__Group_9_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()); }
+	'@instance:'
+	{ after(grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_9_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_9_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_3_1()); }
+	(rule__MachineBlock__InstanceAssignment_9_3_1)*
+	{ after(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_10_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_10_0__0__Impl
+	rule__MachineBlock__Group_10_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_10_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getBehaviorKeyword_10_0_0()); }
+	'@behavior:'
+	{ after(grammarAccess.getMachineBlockAccess().getBehaviorKeyword_10_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_10_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_10_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_10_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_0_1()); }
+		(rule__MachineBlock__BehaviorAssignment_10_0_1)
+		{ after(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_0_1()); }
+	)
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_0_1()); }
+		(rule__MachineBlock__BehaviorAssignment_10_0_1)*
+		{ after(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_0_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__Group_10_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_10_1__0__Impl
+	rule__MachineBlock__Group_10_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_10_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMachineBlockAccess().getStatemachineKeyword_10_1_0()); }
+	'@statemachine:'
+	{ after(grammarAccess.getMachineBlockAccess().getStatemachineKeyword_10_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_10_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__Group_10_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Group_10_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_1_1()); }
+		(rule__MachineBlock__BehaviorAssignment_10_1_1)
+		{ after(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_1_1()); }
+		(rule__MachineBlock__BehaviorAssignment_10_1_1)*
+		{ after(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__0__Impl
+	rule__Procedure__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getVisibilityAssignment_0()); }
+	(rule__Procedure__VisibilityAssignment_0)?
+	{ after(grammarAccess.getProcedureAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__1__Impl
+	rule__Procedure__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getProcedureKeyword_1()); }
+	'procedure'
+	{ after(grammarAccess.getProcedureAccess().getProcedureKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__2__Impl
+	rule__Procedure__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getGroup_2()); }
+	(rule__Procedure__Group_2__0)?
+	{ after(grammarAccess.getProcedureAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__3__Impl
+	rule__Procedure__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getNameAssignment_3()); }
+	(rule__Procedure__NameAssignment_3)
+	{ after(grammarAccess.getProcedureAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__4__Impl
+	rule__Procedure__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__Procedure__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getProcedureAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__5__Impl
+	rule__Procedure__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getGroup_5()); }
+	(rule__Procedure__Group_5__0)?
+	{ after(grammarAccess.getProcedureAccess().getGroup_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__6__Impl
+	rule__Procedure__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_6()); }
+	'{'
+	{ after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__7__Impl
+	rule__Procedure__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_7()); }
+	(rule__Procedure__Alternatives_7)
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__8__Impl
+	rule__Procedure__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_8()); }
+	(rule__Procedure__Alternatives_8)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__9__Impl
+	rule__Procedure__Group__10
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_9()); }
+	(rule__Procedure__Alternatives_9)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__10__Impl
+	rule__Procedure__Group__11
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__10__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_10()); }
+	(rule__Procedure__Alternatives_10)
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_10()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__11__Impl
+	rule__Procedure__Group__12
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__11__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_11()); }
+	(rule__Procedure__Alternatives_11)?
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_11()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__12
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__12__Impl
+	rule__Procedure__Group__13
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__12__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getExecutionAssignment_12()); }
+	(rule__Procedure__ExecutionAssignment_12)?
+	{ after(grammarAccess.getProcedureAccess().getExecutionAssignment_12()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__13
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group__13__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group__13__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_13()); }
+	'}'
+	{ after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_13()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_2__0__Impl
+	rule__Procedure__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLessThanSignKeyword_2_0()); }
+	'<'
+	{ after(grammarAccess.getProcedureAccess().getLessThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_2__1__Impl
+	rule__Procedure__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getMocKeyword_2_1()); }
+	('moc:')?
+	{ after(grammarAccess.getProcedureAccess().getMocKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_2__2__Impl
+	rule__Procedure__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_2_2()); }
+	(rule__Procedure__Alternatives_2_2)
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getGreaterThanSignKeyword_2_3()); }
+	'>'
+	{ after(grammarAccess.getProcedureAccess().getGreaterThanSignKeyword_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5__0__Impl
+	rule__Procedure__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getGroup_5_0()); }
+	(rule__Procedure__Group_5_0__0)?
+	{ after(grammarAccess.getProcedureAccess().getGroup_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getGroup_5_1()); }
+	(rule__Procedure__Group_5_1__0)?
+	{ after(grammarAccess.getProcedureAccess().getGroup_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_5_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_0__0__Impl
+	rule__Procedure__Group_5_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_0_0()); }
+	'('
+	{ after(grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_0__1__Impl
+	rule__Procedure__Group_5_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getGroup_5_0_1()); }
+	(rule__Procedure__Group_5_0_1__0)?
+	{ after(grammarAccess.getProcedureAccess().getGroup_5_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_0_2()); }
+	')'
+	{ after(grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_5_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_0_1__0__Impl
+	rule__Procedure__Group_5_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_0()); }
+	(rule__Procedure__ParameterAssignment_5_0_1_0)
+	{ after(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getGroup_5_0_1_1()); }
+	(rule__Procedure__Group_5_0_1_1__0)*
+	{ after(grammarAccess.getProcedureAccess().getGroup_5_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_5_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_0_1_1__0__Impl
+	rule__Procedure__Group_5_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getCommaKeyword_5_0_1_1_0()); }
+	','
+	{ after(grammarAccess.getProcedureAccess().getCommaKeyword_5_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_1_1()); }
+	(rule__Procedure__ParameterAssignment_5_0_1_1_1)
+	{ after(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_5_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_1__0__Impl
+	rule__Procedure__Group_5_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0()); }
+	'-->'
+	{ after(grammarAccess.getProcedureAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_5_1_1()); }
+	(rule__Procedure__Alternatives_5_1_1)
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_5_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_5_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_1_1_1__0__Impl
+	rule__Procedure__Group_5_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_1_1_1_0()); }
+	'('
+	{ after(grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_1_1_1__1__Impl
+	rule__Procedure__Group_5_1_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_1()); }
+	(rule__Procedure__ParameterAssignment_5_1_1_1_1)
+	{ after(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_1_1_1__2__Impl
+	rule__Procedure__Group_5_1_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getGroup_5_1_1_1_2()); }
+	(rule__Procedure__Group_5_1_1_1_2__0)*
+	{ after(grammarAccess.getProcedureAccess().getGroup_5_1_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_1_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_1_1_1_3()); }
+	')'
+	{ after(grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_1_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_5_1_1_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_1_1_1_2__0__Impl
+	rule__Procedure__Group_5_1_1_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getCommaKeyword_5_1_1_1_2_0()); }
+	','
+	{ after(grammarAccess.getProcedureAccess().getCommaKeyword_5_1_1_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_5_1_1_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_5_1_1_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_2_1()); }
+	(rule__Procedure__ParameterAssignment_5_1_1_1_2_1)
+	{ after(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_7_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0__0__Impl
+	rule__Procedure__Group_7_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getParameterKeyword_7_0_0()); }
+	'@parameter:'
+	{ after(grammarAccess.getProcedureAccess().getParameterKeyword_7_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1()); }
+	(rule__Procedure__Alternatives_7_0_1)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_7_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_0__0__Impl
+	rule__Procedure__Group_7_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getInputKeyword_7_0_1_0_0()); }
+	'input'
+	{ after(grammarAccess.getProcedureAccess().getInputKeyword_7_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_0_1()); }
+	(rule__Procedure__Alternatives_7_0_1_0_1)
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_7_0_1_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_0_1_1__0__Impl
+	rule__Procedure__Group_7_0_1_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_0_1_1__1__Impl
+	rule__Procedure__Group_7_0_1_0_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1)*
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_0_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_0_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_0_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_7_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_1__0__Impl
+	rule__Procedure__Group_7_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getInoutKeyword_7_0_1_1_0()); }
+	'inout'
+	{ after(grammarAccess.getProcedureAccess().getInoutKeyword_7_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_1_1()); }
+	(rule__Procedure__Alternatives_7_0_1_1_1)
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_7_0_1_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_1_1_1__0__Impl
+	rule__Procedure__Group_7_0_1_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_1_1_1__1__Impl
+	rule__Procedure__Group_7_0_1_1_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1)*
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_1_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_1_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_1_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_7_0_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_2__0__Impl
+	rule__Procedure__Group_7_0_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getOutputKeyword_7_0_1_2_0()); }
+	'output'
+	{ after(grammarAccess.getProcedureAccess().getOutputKeyword_7_0_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_2_1()); }
+	(rule__Procedure__Alternatives_7_0_1_2_1)
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_7_0_1_2_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_2_1_1__0__Impl
+	rule__Procedure__Group_7_0_1_2_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_2_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_2_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_2_1_1__1__Impl
+	rule__Procedure__Group_7_0_1_2_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_2_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1)*
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_2_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_2_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_2_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_7_0_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_3__0__Impl
+	rule__Procedure__Group_7_0_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getReturnKeyword_7_0_1_3_0()); }
+	'return'
+	{ after(grammarAccess.getProcedureAccess().getReturnKeyword_7_0_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_3_1()); }
+	(rule__Procedure__Alternatives_7_0_1_3_1)
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_7_0_1_3_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_3_1_1__0__Impl
+	rule__Procedure__Group_7_0_1_3_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_3_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_3_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_3_1_1__1__Impl
+	rule__Procedure__Group_7_0_1_3_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_3_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1)*
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_3_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_7_0_1_3_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_7_0_1_3_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_8_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_0__0__Impl
+	rule__Procedure__Group_8_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()); }
+	'@input:'
+	{ after(grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_8_0_1()); }
+	(rule__Procedure__Alternatives_8_0_1)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_8_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_8_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_0_1_1__0__Impl
+	rule__Procedure__Group_8_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_0_1_1__1__Impl
+	rule__Procedure__Group_8_0_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_8_0_1_1_1)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_8_0_1_1_1)*
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_0_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_0_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_0_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_0_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_0_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_8_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_1__0__Impl
+	rule__Procedure__Group_8_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()); }
+	'@inout:'
+	{ after(grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_8_1_1()); }
+	(rule__Procedure__Alternatives_8_1_1)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_8_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_8_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_1_1_1__0__Impl
+	rule__Procedure__Group_8_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_1_1_1__1__Impl
+	rule__Procedure__Group_8_1_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_8_1_1_1_1)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_8_1_1_1_1)*
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_1_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_1_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_1_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_1_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_1_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_8_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_2__0__Impl
+	rule__Procedure__Group_8_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()); }
+	'@output:'
+	{ after(grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_8_2_1()); }
+	(rule__Procedure__Alternatives_8_2_1)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_8_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_8_2_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_2_1_1__0__Impl
+	rule__Procedure__Group_8_2_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_2_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_2_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_2_1_1__1__Impl
+	rule__Procedure__Group_8_2_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_2_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_8_2_1_1_1)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_8_2_1_1_1)*
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_2_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_2_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_2_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_2_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_2_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_8_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_3__0__Impl
+	rule__Procedure__Group_8_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0()); }
+	'@return:'
+	{ after(grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_8_3_1()); }
+	(rule__Procedure__Alternatives_8_3_1)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_8_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_8_3_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_3_1_1__0__Impl
+	rule__Procedure__Group_8_3_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_3_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_3_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_3_1_1__1__Impl
+	rule__Procedure__Group_8_3_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_3_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_8_3_1_1_1)
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_1_1()); }
+		(rule__Procedure__ParameterAssignment_8_3_1_1_1)*
+		{ after(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_3_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_8_3_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_8_3_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_3_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_3_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_9_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_9_0__0__Impl
+	rule__Procedure__Group_9_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()); }
+	'@property:'
+	{ after(grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_9_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_9_0_1()); }
+	(rule__Procedure__Alternatives_9_0_1)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_9_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_9_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_9_1__0__Impl
+	rule__Procedure__Group_9_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0()); }
+	'@public:'
+	{ after(grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_9_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_9_1_1()); }
+	(rule__Procedure__Alternatives_9_1_1)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_9_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_9_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_9_2__0__Impl
+	rule__Procedure__Group_9_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()); }
+	'@protected:'
+	{ after(grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_9_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_9_2_1()); }
+	(rule__Procedure__Alternatives_9_2_1)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_9_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_9_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_9_3__0__Impl
+	rule__Procedure__Group_9_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()); }
+	'@private:'
+	{ after(grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_9_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_9_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_9_3_1()); }
+	(rule__Procedure__Alternatives_9_3_1)*
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_9_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_10_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_10_0_0__0__Impl
+	rule__Procedure__Group_10_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_10_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getAlternatives_10_0_0_0()); }
+	(rule__Procedure__Alternatives_10_0_0_0)
+	{ after(grammarAccess.getProcedureAccess().getAlternatives_10_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_10_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_10_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_10_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getRoutineAssignment_10_0_0_1()); }
+		(rule__Procedure__RoutineAssignment_10_0_0_1)
+		{ after(grammarAccess.getProcedureAccess().getRoutineAssignment_10_0_0_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getRoutineAssignment_10_0_0_1()); }
+		(rule__Procedure__RoutineAssignment_10_0_0_1)*
+		{ after(grammarAccess.getProcedureAccess().getRoutineAssignment_10_0_0_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Procedure__Group_10_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_10_0_1__0__Impl
+	rule__Procedure__Group_10_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_10_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureAccess().getProcedureKeyword_10_0_1_0()); }
+	'@procedure:'
+	{ after(grammarAccess.getProcedureAccess().getProcedureKeyword_10_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_10_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Procedure__Group_10_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__Group_10_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getProcedureAccess().getProcedureAssignment_10_0_1_1()); }
+		(rule__Procedure__ProcedureAssignment_10_0_1_1)
+		{ after(grammarAccess.getProcedureAccess().getProcedureAssignment_10_0_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getProcedureAccess().getProcedureAssignment_10_0_1_1()); }
+		(rule__Procedure__ProcedureAssignment_10_0_1_1)*
+		{ after(grammarAccess.getProcedureAccess().getProcedureAssignment_10_0_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ProcedureExecution__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ProcedureExecution__Group__0__Impl
+	rule__ProcedureExecution__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureExecutionAccess().getModelOfExecutionAction_0()); }
+	()
+	{ after(grammarAccess.getProcedureExecutionAccess().getModelOfExecutionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ProcedureExecution__Group__1__Impl
+	rule__ProcedureExecution__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureExecutionAccess().getMoeKeyword_1()); }
+	('@moe:')?
+	{ after(grammarAccess.getProcedureExecutionAccess().getMoeKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ProcedureExecution__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()); }
+	(rule__ProcedureExecution__UnorderedGroup_2)
+	{ after(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ProcedureExecution__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ProcedureExecution__Group_2_0__0__Impl
+	rule__ProcedureExecution__Group_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureExecutionAccess().getScheduleKeyword_2_0_0()); }
+	'@schedule'
+	{ after(grammarAccess.getProcedureExecutionAccess().getScheduleKeyword_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ProcedureExecution__Group_2_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineAssignment_2_0_1()); }
+	(rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1)
+	{ after(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineAssignment_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ProcedureExecution__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ProcedureExecution__Group_2_1__0__Impl
+	rule__ProcedureExecution__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureExecutionAccess().getRunKeyword_2_1_0()); }
+	'@run'
+	{ after(grammarAccess.getProcedureExecutionAccess().getRunKeyword_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ProcedureExecution__Group_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getProcedureExecutionAccess().getRunRoutineAssignment_2_1_1()); }
+	(rule__ProcedureExecution__RunRoutineAssignment_2_1_1)
+	{ after(grammarAccess.getProcedureExecutionAccess().getRunRoutineAssignment_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeBehavior__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeBehavior__Group__0__Impl
+	rule__MoeBehavior__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeBehaviorAccess().getBehaviorAction_0()); }
+	()
+	{ after(grammarAccess.getMoeBehaviorAccess().getBehaviorAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeBehavior__Group__1__Impl
+	rule__MoeBehavior__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeBehaviorAccess().getGroup_1()); }
+	(rule__MoeBehavior__Group_1__0)?
+	{ after(grammarAccess.getMoeBehaviorAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeBehavior__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()); }
+	(rule__MoeBehavior__UnorderedGroup_2)
+	{ after(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeBehavior__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeBehavior__Group_1__0__Impl
+	rule__MoeBehavior__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeBehaviorAccess().getLocalKeyword_1_0()); }
+	'@local:'
+	{ after(grammarAccess.getMoeBehaviorAccess().getLocalKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeBehavior__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeBehaviorAccess().getAlternatives_1_1()); }
+	(rule__MoeBehavior__Alternatives_1_1)*
+	{ after(grammarAccess.getMoeBehaviorAccess().getAlternatives_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__0__Impl
+	rule__Statemachine__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getStatemachineAction_0()); }
+	()
+	{ after(grammarAccess.getStatemachineAccess().getStatemachineAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__1__Impl
+	rule__Statemachine__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getUnorderedGroup_1()); }
+	(rule__Statemachine__UnorderedGroup_1)
+	{ after(grammarAccess.getStatemachineAccess().getUnorderedGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__2__Impl
+	rule__Statemachine__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getStatemachineKeyword_2()); }
+	'statemachine'
+	{ after(grammarAccess.getStatemachineAccess().getStatemachineKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__3__Impl
+	rule__Statemachine__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getGroup_3()); }
+	(rule__Statemachine__Group_3__0)?
+	{ after(grammarAccess.getStatemachineAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__4__Impl
+	rule__Statemachine__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getNameAssignment_4()); }
+	(rule__Statemachine__NameAssignment_4)
+	{ after(grammarAccess.getStatemachineAccess().getNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__5__Impl
+	rule__Statemachine__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getUnrestrictedNameAssignment_5()); }
+	(rule__Statemachine__UnrestrictedNameAssignment_5)?
+	{ after(grammarAccess.getStatemachineAccess().getUnrestrictedNameAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__6__Impl
+	rule__Statemachine__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_6()); }
+	'{'
+	{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__7__Impl
+	rule__Statemachine__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_7()); }
+	(rule__Statemachine__Alternatives_7)
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__8__Impl
+	rule__Statemachine__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_8()); }
+	(rule__Statemachine__Alternatives_8)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__9__Impl
+	rule__Statemachine__Group__10
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_9()); }
+	(rule__Statemachine__Alternatives_9)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__10__Impl
+	rule__Statemachine__Group__11
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__10__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_10()); }
+	(rule__Statemachine__Alternatives_10)
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_10()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__11__Impl
+	rule__Statemachine__Group__12
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__11__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_11()); }
+	(rule__Statemachine__Alternatives_11)
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_11()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__12
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__12__Impl
+	rule__Statemachine__Group__13
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__12__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getUnorderedGroup_12()); }
+	(rule__Statemachine__UnorderedGroup_12)
+	{ after(grammarAccess.getStatemachineAccess().getUnorderedGroup_12()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__13
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group__13__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group__13__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_13()); }
+	'}'
+	{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_13()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_3__0__Impl
+	rule__Statemachine__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLessThanSignKeyword_3_0()); }
+	'<'
+	{ after(grammarAccess.getStatemachineAccess().getLessThanSignKeyword_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_3__1__Impl
+	rule__Statemachine__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getMocKeyword_3_1()); }
+	('moc:')?
+	{ after(grammarAccess.getStatemachineAccess().getMocKeyword_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_3__2__Impl
+	rule__Statemachine__Group_3__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_3_2()); }
+	(rule__Statemachine__Alternatives_3_2)
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_3__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_3__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_3__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getGreaterThanSignKeyword_3_3()); }
+	'>'
+	{ after(grammarAccess.getStatemachineAccess().getGreaterThanSignKeyword_3_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_7_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0__0__Impl
+	rule__Statemachine__Group_7_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getParameterKeyword_7_0_0()); }
+	'@parameter:'
+	{ after(grammarAccess.getStatemachineAccess().getParameterKeyword_7_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1()); }
+	(rule__Statemachine__Alternatives_7_0_1)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_7_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_0__0__Impl
+	rule__Statemachine__Group_7_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getInputKeyword_7_0_1_0_0()); }
+	'input'
+	{ after(grammarAccess.getStatemachineAccess().getInputKeyword_7_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_0_1()); }
+	(rule__Statemachine__Alternatives_7_0_1_0_1)
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_7_0_1_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_0_1_1__0__Impl
+	rule__Statemachine__Group_7_0_1_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_0_1_1__1__Impl
+	rule__Statemachine__Group_7_0_1_0_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1)*
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_0_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_0_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_0_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_7_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_1__0__Impl
+	rule__Statemachine__Group_7_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getInoutKeyword_7_0_1_1_0()); }
+	'inout'
+	{ after(grammarAccess.getStatemachineAccess().getInoutKeyword_7_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_1_1()); }
+	(rule__Statemachine__Alternatives_7_0_1_1_1)
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_7_0_1_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_1_1_1__0__Impl
+	rule__Statemachine__Group_7_0_1_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_1_1_1__1__Impl
+	rule__Statemachine__Group_7_0_1_1_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1)*
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_1_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_1_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_1_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_7_0_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_2__0__Impl
+	rule__Statemachine__Group_7_0_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getOutputKeyword_7_0_1_2_0()); }
+	'output'
+	{ after(grammarAccess.getStatemachineAccess().getOutputKeyword_7_0_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_2_1()); }
+	(rule__Statemachine__Alternatives_7_0_1_2_1)
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_7_0_1_2_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_2_1_1__0__Impl
+	rule__Statemachine__Group_7_0_1_2_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_2_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_2_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_2_1_1__1__Impl
+	rule__Statemachine__Group_7_0_1_2_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_2_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1)*
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_2_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_2_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_2_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_7_0_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_3__0__Impl
+	rule__Statemachine__Group_7_0_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getReturnKeyword_7_0_1_3_0()); }
+	'return'
+	{ after(grammarAccess.getStatemachineAccess().getReturnKeyword_7_0_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_3_1()); }
+	(rule__Statemachine__Alternatives_7_0_1_3_1)
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_7_0_1_3_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_3_1_1__0__Impl
+	rule__Statemachine__Group_7_0_1_3_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_3_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_3_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_3_1_1__1__Impl
+	rule__Statemachine__Group_7_0_1_3_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_3_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1)*
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_3_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_7_0_1_3_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_7_0_1_3_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_0__0__Impl
+	rule__Statemachine__Group_8_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()); }
+	'@input:'
+	{ after(grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_8_0_1()); }
+	(rule__Statemachine__Alternatives_8_0_1)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_8_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_0_1_1__0__Impl
+	rule__Statemachine__Group_8_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_0_1_1__1__Impl
+	rule__Statemachine__Group_8_0_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_8_0_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_8_0_1_1_1)*
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_0_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_0_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_0_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_0_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_0_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_1__0__Impl
+	rule__Statemachine__Group_8_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()); }
+	'@inout:'
+	{ after(grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_8_1_1()); }
+	(rule__Statemachine__Alternatives_8_1_1)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_8_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_1_1_1__0__Impl
+	rule__Statemachine__Group_8_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_1_1_1__1__Impl
+	rule__Statemachine__Group_8_1_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_8_1_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_8_1_1_1_1)*
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_1_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_1_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_2__0__Impl
+	rule__Statemachine__Group_8_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()); }
+	'@output:'
+	{ after(grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_8_2_1()); }
+	(rule__Statemachine__Alternatives_8_2_1)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_8_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_2_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_2_1_1__0__Impl
+	rule__Statemachine__Group_8_2_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_2_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_2_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_2_1_1__1__Impl
+	rule__Statemachine__Group_8_2_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_2_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_8_2_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_8_2_1_1_1)*
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_2_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_2_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_2_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_2_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_2_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_3__0__Impl
+	rule__Statemachine__Group_8_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0()); }
+	'@return:'
+	{ after(grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_8_3_1()); }
+	(rule__Statemachine__Alternatives_8_3_1)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_8_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_8_3_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_3_1_1__0__Impl
+	rule__Statemachine__Group_8_3_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_3_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()); }
+	'{'
+	{ after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_3_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_3_1_1__1__Impl
+	rule__Statemachine__Group_8_3_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_3_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_8_3_1_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_1_1()); }
+		(rule__Statemachine__ParameterAssignment_8_3_1_1_1)*
+		{ after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_3_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_8_3_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_8_3_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_3_1_1_2()); }
+	'}'
+	{ after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_3_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_9_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_9_0__0__Impl
+	rule__Statemachine__Group_9_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()); }
+	'@property:'
+	{ after(grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_9_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_9_0_1()); }
+	(rule__Statemachine__Alternatives_9_0_1)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_9_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_9_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_9_1__0__Impl
+	rule__Statemachine__Group_9_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0()); }
+	'@public:'
+	{ after(grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_9_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_9_1_1()); }
+	(rule__Statemachine__Alternatives_9_1_1)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_9_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_9_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_9_2__0__Impl
+	rule__Statemachine__Group_9_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()); }
+	'@protected:'
+	{ after(grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_9_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_9_2_1()); }
+	(rule__Statemachine__Alternatives_9_2_1)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_9_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_9_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_9_3__0__Impl
+	rule__Statemachine__Group_9_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()); }
+	'@private:'
+	{ after(grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_9_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_9_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_9_3_1()); }
+	(rule__Statemachine__Alternatives_9_3_1)*
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_9_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_10_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_10_0_0__0__Impl
+	rule__Statemachine__Group_10_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getAlternatives_10_0_0_0()); }
+	(rule__Statemachine__Alternatives_10_0_0_0)
+	{ after(grammarAccess.getStatemachineAccess().getAlternatives_10_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_10_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_0_0_1()); }
+		(rule__Statemachine__RoutineAssignment_10_0_0_1)
+		{ after(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_0_0_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_0_0_1()); }
+		(rule__Statemachine__RoutineAssignment_10_0_0_1)*
+		{ after(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_0_0_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__Group_10_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_10_0_1__0__Impl
+	rule__Statemachine__Group_10_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineAccess().getProcedureKeyword_10_0_1_0()); }
+	'@procedure:'
+	{ after(grammarAccess.getStatemachineAccess().getProcedureKeyword_10_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__Group_10_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Group_10_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_0_1_1()); }
+		(rule__Statemachine__ProcedureAssignment_10_0_1_1)
+		{ after(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_0_1_1()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_0_1_1()); }
+		(rule__Statemachine__ProcedureAssignment_10_0_1_1)*
+		{ after(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_0_1_1()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineRegion__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StatemachineRegion__Group__0__Impl
+	rule__StatemachineRegion__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineRegionAccess().getRegionAction_0()); }
+	()
+	{ after(grammarAccess.getStatemachineRegionAccess().getRegionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StatemachineRegion__Group__1__Impl
+	rule__StatemachineRegion__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineRegionAccess().getAlternatives_1()); }
+	(rule__StatemachineRegion__Alternatives_1)
+	{ after(grammarAccess.getStatemachineRegionAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StatemachineRegion__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getAlternatives_2()); }
+		(rule__StatemachineRegion__Alternatives_2)
+		{ after(grammarAccess.getStatemachineRegionAccess().getAlternatives_2()); }
+	)
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getAlternatives_2()); }
+		(rule__StatemachineRegion__Alternatives_2)*
+		{ after(grammarAccess.getStatemachineRegionAccess().getAlternatives_2()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StatemachineRegion__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StatemachineRegion__Group_1_1__0__Impl
+	rule__StatemachineRegion__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_1_0()); }
+	(rule__StatemachineRegion__Alternatives_1_1_0)
+	{ after(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StatemachineRegion__Group_1_1__1__Impl
+	rule__StatemachineRegion__Group_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineRegionAccess().getNameAssignment_1_1_1()); }
+	(rule__StatemachineRegion__NameAssignment_1_1_1)
+	{ after(grammarAccess.getStatemachineRegionAccess().getNameAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StatemachineRegion__Group_1_1__2__Impl
+	rule__StatemachineRegion__Group_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameAssignment_1_1_2()); }
+	(rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2)?
+	{ after(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameAssignment_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StatemachineRegion__Group_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__Group_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStatemachineRegionAccess().getGreaterThanSignColonKeyword_1_1_3()); }
+	'>:'
+	{ after(grammarAccess.getStatemachineRegionAccess().getGreaterThanSignColonKeyword_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CompositeState__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group__0__Impl
+	rule__CompositeState__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getStateAction_0()); }
+	()
+	{ after(grammarAccess.getCompositeStateAccess().getStateAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group__1__Impl
+	rule__CompositeState__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getCompositeAssignment_1()); }
+	(rule__CompositeState__CompositeAssignment_1)
+	{ after(grammarAccess.getCompositeStateAccess().getCompositeAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group__2__Impl
+	rule__CompositeState__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getLessThanSignKeyword_2()); }
+	'<'
+	{ after(grammarAccess.getCompositeStateAccess().getLessThanSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group__3__Impl
+	rule__CompositeState__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getMocKeyword_3()); }
+	('moc:')?
+	{ after(grammarAccess.getCompositeStateAccess().getMocKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group__4__Impl
+	rule__CompositeState__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getAlternatives_4()); }
+	(rule__CompositeState__Alternatives_4)
+	{ after(grammarAccess.getCompositeStateAccess().getAlternatives_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group__5__Impl
+	rule__CompositeState__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getGreaterThanSignKeyword_5()); }
+	'>'
+	{ after(grammarAccess.getCompositeStateAccess().getGreaterThanSignKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group__6__Impl
+	rule__CompositeState__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getNameAssignment_6()); }
+	(rule__CompositeState__NameAssignment_6)
+	{ after(grammarAccess.getCompositeStateAccess().getNameAssignment_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group__7__Impl
+	rule__CompositeState__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getUnrestrictedNameAssignment_7()); }
+	(rule__CompositeState__UnrestrictedNameAssignment_7)?
+	{ after(grammarAccess.getCompositeStateAccess().getUnrestrictedNameAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getAlternatives_8()); }
+	(rule__CompositeState__Alternatives_8)
+	{ after(grammarAccess.getCompositeStateAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CompositeState__Group_8_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group_8_0__0__Impl
+	rule__CompositeState__Group_8_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getLeftCurlyBracketKeyword_8_0_0()); }
+	'{'
+	{ after(grammarAccess.getCompositeStateAccess().getLeftCurlyBracketKeyword_8_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group_8_0__1__Impl
+	rule__CompositeState__Group_8_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1()); }
+	(rule__CompositeState__Alternatives_8_0_1)
+	{ after(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group_8_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getRightCurlyBracketKeyword_8_0_2()); }
+	'}'
+	{ after(grammarAccess.getCompositeStateAccess().getRightCurlyBracketKeyword_8_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CompositeState__Group_8_0_1_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group_8_0_1_0_1__0__Impl
+	rule__CompositeState__Group_8_0_1_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0_1_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()); }
+	'@moe:'
+	{ after(grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0_1_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group_8_0_1_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0_1_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_0_1_1()); }
+	(rule__CompositeState__MoeAssignment_8_0_1_0_1_1)*
+	{ after(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CompositeState__Group_8_0_1_0_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group_8_0_1_0_2__0__Impl
+	rule__CompositeState__Group_8_0_1_0_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0_1_0_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0()); }
+	'@transition:'
+	{ after(grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0_1_0_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group_8_0_1_0_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0_1_0_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_0_2_1()); }
+	(rule__CompositeState__TransitionAssignment_8_0_1_0_2_1)*
+	{ after(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_0_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CompositeState__Group_8_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group_8_0_1_1__0__Impl
+	rule__CompositeState__Group_8_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_1_0()); }
+	(rule__CompositeState__RegionAssignment_8_0_1_1_0)
+	{ after(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CompositeState__Group_8_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__Group_8_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_1_1()); }
+	(rule__CompositeState__Alternatives_8_0_1_1_1)*
+	{ after(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeCompositeStateRoutines__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeCompositeStateRoutines__Group__0__Impl
+	rule__MoeCompositeStateRoutines__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeCompositeStateRoutines__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getRoutineAction_0()); }
+	()
+	{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getRoutineAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeCompositeStateRoutines__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeCompositeStateRoutines__Group__1__Impl
+	rule__MoeCompositeStateRoutines__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeCompositeStateRoutines__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAssignment_1()); }
+	(rule__MoeCompositeStateRoutines__NameAssignment_1)
+	{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeCompositeStateRoutines__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeCompositeStateRoutines__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeCompositeStateRoutines__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockAssignment_2()); }
+	(rule__MoeCompositeStateRoutines__BodyBlockAssignment_2)
+	{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SimpleState__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group__0__Impl
+	rule__SimpleState__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getStateAction_0()); }
+	()
+	{ after(grammarAccess.getSimpleStateAccess().getStateAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group__1__Impl
+	rule__SimpleState__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getSimpleAssignment_1()); }
+	(rule__SimpleState__SimpleAssignment_1)
+	{ after(grammarAccess.getSimpleStateAccess().getSimpleAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group__2__Impl
+	rule__SimpleState__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getGroup_2()); }
+	(rule__SimpleState__Group_2__0)?
+	{ after(grammarAccess.getSimpleStateAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group__3__Impl
+	rule__SimpleState__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getNameAssignment_3()); }
+	(rule__SimpleState__NameAssignment_3)
+	{ after(grammarAccess.getSimpleStateAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group__4__Impl
+	rule__SimpleState__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__SimpleState__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getSimpleStateAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getAlternatives_5()); }
+	(rule__SimpleState__Alternatives_5)
+	{ after(grammarAccess.getSimpleStateAccess().getAlternatives_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SimpleState__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group_2__0__Impl
+	rule__SimpleState__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getLessThanSignKeyword_2_0()); }
+	'<'
+	{ after(grammarAccess.getSimpleStateAccess().getLessThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group_2__1__Impl
+	rule__SimpleState__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getMocKeyword_2_1()); }
+	('moc:')?
+	{ after(grammarAccess.getSimpleStateAccess().getMocKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group_2__2__Impl
+	rule__SimpleState__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getSimpleKeyword_2_2()); }
+	'simple'
+	{ after(grammarAccess.getSimpleStateAccess().getSimpleKeyword_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getGreaterThanSignKeyword_2_3()); }
+	'>'
+	{ after(grammarAccess.getSimpleStateAccess().getGreaterThanSignKeyword_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SimpleState__Group_5_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group_5_0__0__Impl
+	rule__SimpleState__Group_5_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_5_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getLeftCurlyBracketKeyword_5_0_0()); }
+	'{'
+	{ after(grammarAccess.getSimpleStateAccess().getLeftCurlyBracketKeyword_5_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_5_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group_5_0__1__Impl
+	rule__SimpleState__Group_5_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_5_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getAlternatives_5_0_1()); }
+	(rule__SimpleState__Alternatives_5_0_1)*
+	{ after(grammarAccess.getSimpleStateAccess().getAlternatives_5_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_5_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SimpleState__Group_5_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__Group_5_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSimpleStateAccess().getRightCurlyBracketKeyword_5_0_2()); }
+	'}'
+	{ after(grammarAccess.getSimpleStateAccess().getRightCurlyBracketKeyword_5_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeSimpleStateRoutines__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeSimpleStateRoutines__Group__0__Impl
+	rule__MoeSimpleStateRoutines__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeSimpleStateRoutines__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeSimpleStateRoutinesAccess().getRoutineAction_0()); }
+	()
+	{ after(grammarAccess.getMoeSimpleStateRoutinesAccess().getRoutineAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeSimpleStateRoutines__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeSimpleStateRoutines__Group__1__Impl
+	rule__MoeSimpleStateRoutines__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeSimpleStateRoutines__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAssignment_1()); }
+	(rule__MoeSimpleStateRoutines__NameAssignment_1)
+	{ after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeSimpleStateRoutines__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeSimpleStateRoutines__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeSimpleStateRoutines__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockAssignment_2()); }
+	(rule__MoeSimpleStateRoutines__BodyBlockAssignment_2)
+	{ after(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StartState__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group__0__Impl
+	rule__StartState__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getStartStateAction_0()); }
+	()
+	{ after(grammarAccess.getStartStateAccess().getStartStateAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group__1__Impl
+	rule__StartState__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getAlternatives_1()); }
+	(rule__StartState__Alternatives_1)
+	{ after(grammarAccess.getStartStateAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group__2__Impl
+	rule__StartState__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__StartState__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getStartStateAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getAlternatives_3()); }
+	(rule__StartState__Alternatives_3)
+	{ after(grammarAccess.getStartStateAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StartState__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group_1_0__0__Impl
+	rule__StartState__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getSimpleAssignment_1_0_0()); }
+	(rule__StartState__SimpleAssignment_1_0_0)
+	{ after(grammarAccess.getStartStateAccess().getSimpleAssignment_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group_1_0__1__Impl
+	rule__StartState__Group_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getLessThanSignKeyword_1_0_1()); }
+	'<'
+	{ after(grammarAccess.getStartStateAccess().getLessThanSignKeyword_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group_1_0__2__Impl
+	rule__StartState__Group_1_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getMocKeyword_1_0_2()); }
+	('moc:')?
+	{ after(grammarAccess.getStartStateAccess().getMocKeyword_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group_1_0__3__Impl
+	rule__StartState__Group_1_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getStartKeyword_1_0_3()); }
+	'start'
+	{ after(grammarAccess.getStartStateAccess().getStartKeyword_1_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group_1_0__4__Impl
+	rule__StartState__Group_1_0__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getGreaterThanSignKeyword_1_0_4()); }
+	'>'
+	{ after(grammarAccess.getStartStateAccess().getGreaterThanSignKeyword_1_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group_1_0__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_1_0__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getNameAssignment_1_0_5()); }
+	(rule__StartState__NameAssignment_1_0_5)
+	{ after(grammarAccess.getStartStateAccess().getNameAssignment_1_0_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StartState__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group_3_0__0__Impl
+	rule__StartState__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getLeftCurlyBracketKeyword_3_0_0()); }
+	'{'
+	{ after(grammarAccess.getStartStateAccess().getLeftCurlyBracketKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group_3_0__1__Impl
+	rule__StartState__Group_3_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getAlternatives_3_0_1()); }
+	(rule__StartState__Alternatives_3_0_1)*
+	{ after(grammarAccess.getStartStateAccess().getAlternatives_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_3_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StartState__Group_3_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__Group_3_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStartStateAccess().getRightCurlyBracketKeyword_3_0_2()); }
+	'}'
+	{ after(grammarAccess.getStartStateAccess().getRightCurlyBracketKeyword_3_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeStartStateRoutines__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeStartStateRoutines__Group__0__Impl
+	rule__MoeStartStateRoutines__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeStartStateRoutines__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeStartStateRoutinesAccess().getRoutineAction_0()); }
+	()
+	{ after(grammarAccess.getMoeStartStateRoutinesAccess().getRoutineAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeStartStateRoutines__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeStartStateRoutines__Group__1__Impl
+	rule__MoeStartStateRoutines__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeStartStateRoutines__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeStartStateRoutinesAccess().getNameAssignment_1()); }
+	(rule__MoeStartStateRoutines__NameAssignment_1)
+	{ after(grammarAccess.getMoeStartStateRoutinesAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeStartStateRoutines__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeStartStateRoutines__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeStartStateRoutines__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockAssignment_2()); }
+	(rule__MoeStartStateRoutines__BodyBlockAssignment_2)
+	{ after(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FinalState__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group__0__Impl
+	rule__FinalState__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getFinalStateAction_0()); }
+	()
+	{ after(grammarAccess.getFinalStateAccess().getFinalStateAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group__1__Impl
+	rule__FinalState__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getAlternatives_1()); }
+	(rule__FinalState__Alternatives_1)
+	{ after(grammarAccess.getFinalStateAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group__2__Impl
+	rule__FinalState__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__FinalState__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getFinalStateAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getAlternatives_3()); }
+	(rule__FinalState__Alternatives_3)
+	{ after(grammarAccess.getFinalStateAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FinalState__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group_1_0__0__Impl
+	rule__FinalState__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_0_0()); }
+	(rule__FinalState__SimpleAssignment_1_0_0)
+	{ after(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group_1_0__1__Impl
+	rule__FinalState__Group_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getLessThanSignKeyword_1_0_1()); }
+	'<'
+	{ after(grammarAccess.getFinalStateAccess().getLessThanSignKeyword_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group_1_0__2__Impl
+	rule__FinalState__Group_1_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getMocKeyword_1_0_2()); }
+	('moc:')?
+	{ after(grammarAccess.getFinalStateAccess().getMocKeyword_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group_1_0__3__Impl
+	rule__FinalState__Group_1_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getFinalKeyword_1_0_3()); }
+	'final'
+	{ after(grammarAccess.getFinalStateAccess().getFinalKeyword_1_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group_1_0__4__Impl
+	rule__FinalState__Group_1_0__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getGreaterThanSignKeyword_1_0_4()); }
+	'>'
+	{ after(grammarAccess.getFinalStateAccess().getGreaterThanSignKeyword_1_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group_1_0__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_1_0__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getNameAssignment_1_0_5()); }
+	(rule__FinalState__NameAssignment_1_0_5)
+	{ after(grammarAccess.getFinalStateAccess().getNameAssignment_1_0_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FinalState__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group_3_0__0__Impl
+	rule__FinalState__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getLeftCurlyBracketKeyword_3_0_0()); }
+	'{'
+	{ after(grammarAccess.getFinalStateAccess().getLeftCurlyBracketKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group_3_0__1__Impl
+	rule__FinalState__Group_3_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getMoeAssignment_3_0_1()); }
+	(rule__FinalState__MoeAssignment_3_0_1)*
+	{ after(grammarAccess.getFinalStateAccess().getMoeAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_3_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FinalState__Group_3_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__Group_3_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFinalStateAccess().getRightCurlyBracketKeyword_3_0_2()); }
+	'}'
+	{ after(grammarAccess.getFinalStateAccess().getRightCurlyBracketKeyword_3_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeFinalStateRoutines__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeFinalStateRoutines__Group__0__Impl
+	rule__MoeFinalStateRoutines__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeFinalStateRoutines__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeFinalStateRoutinesAccess().getRoutineAction_0()); }
+	()
+	{ after(grammarAccess.getMoeFinalStateRoutinesAccess().getRoutineAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeFinalStateRoutines__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeFinalStateRoutines__Group__1__Impl
+	rule__MoeFinalStateRoutines__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeFinalStateRoutines__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAssignment_1()); }
+	(rule__MoeFinalStateRoutines__NameAssignment_1)
+	{ after(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeFinalStateRoutines__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeFinalStateRoutines__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeFinalStateRoutines__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockAssignment_2()); }
+	(rule__MoeFinalStateRoutines__BodyBlockAssignment_2)
+	{ after(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherPseudostate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group__0__Impl
+	rule__OtherPseudostate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getPseudostateAction_0()); }
+	()
+	{ after(grammarAccess.getOtherPseudostateAccess().getPseudostateAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group__1__Impl
+	rule__OtherPseudostate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getAlternatives_1()); }
+	(rule__OtherPseudostate__Alternatives_1)
+	{ after(grammarAccess.getOtherPseudostateAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group__2__Impl
+	rule__OtherPseudostate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getLessThanSignKeyword_2()); }
+	'<'
+	{ after(grammarAccess.getOtherPseudostateAccess().getLessThanSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group__3__Impl
+	rule__OtherPseudostate__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getMocKeyword_3()); }
+	('moc:')?
+	{ after(grammarAccess.getOtherPseudostateAccess().getMocKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group__4__Impl
+	rule__OtherPseudostate__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getKindAssignment_4()); }
+	(rule__OtherPseudostate__KindAssignment_4)
+	{ after(grammarAccess.getOtherPseudostateAccess().getKindAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group__5__Impl
+	rule__OtherPseudostate__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getGreaterThanSignKeyword_5()); }
+	'>'
+	{ after(grammarAccess.getOtherPseudostateAccess().getGreaterThanSignKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group__6__Impl
+	rule__OtherPseudostate__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getNameAssignment_6()); }
+	(rule__OtherPseudostate__NameAssignment_6)
+	{ after(grammarAccess.getOtherPseudostateAccess().getNameAssignment_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group__7__Impl
+	rule__OtherPseudostate__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameAssignment_7()); }
+	(rule__OtherPseudostate__UnrestrictedNameAssignment_7)?
+	{ after(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getAlternatives_8()); }
+	(rule__OtherPseudostate__Alternatives_8)
+	{ after(grammarAccess.getOtherPseudostateAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherPseudostate__Group_8_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group_8_0__0__Impl
+	rule__OtherPseudostate__Group_8_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group_8_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()); }
+	'{'
+	{ after(grammarAccess.getOtherPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group_8_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group_8_0__1__Impl
+	rule__OtherPseudostate__Group_8_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group_8_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getTransitionAssignment_8_0_1()); }
+	(rule__OtherPseudostate__TransitionAssignment_8_0_1)*
+	{ after(grammarAccess.getOtherPseudostateAccess().getTransitionAssignment_8_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group_8_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherPseudostate__Group_8_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__Group_8_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherPseudostateAccess().getRightCurlyBracketKeyword_8_0_2()); }
+	'}'
+	{ after(grammarAccess.getOtherPseudostateAccess().getRightCurlyBracketKeyword_8_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PseudostateInitial__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group__0__Impl
+	rule__PseudostateInitial__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getPseudostateAction_0()); }
+	()
+	{ after(grammarAccess.getPseudostateInitialAccess().getPseudostateAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group__1__Impl
+	rule__PseudostateInitial__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getAlternatives_1()); }
+	(rule__PseudostateInitial__Alternatives_1)
+	{ after(grammarAccess.getPseudostateInitialAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group__2__Impl
+	rule__PseudostateInitial__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__PseudostateInitial__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getAlternatives_3()); }
+	(rule__PseudostateInitial__Alternatives_3)
+	{ after(grammarAccess.getPseudostateInitialAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PseudostateInitial__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group_1_0__0__Impl
+	rule__PseudostateInitial__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getAlternatives_1_0_0()); }
+	(rule__PseudostateInitial__Alternatives_1_0_0)
+	{ after(grammarAccess.getPseudostateInitialAccess().getAlternatives_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group_1_0__1__Impl
+	rule__PseudostateInitial__Group_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getLessThanSignKeyword_1_0_1()); }
+	'<'
+	{ after(grammarAccess.getPseudostateInitialAccess().getLessThanSignKeyword_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group_1_0__2__Impl
+	rule__PseudostateInitial__Group_1_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getMocKeyword_1_0_2()); }
+	('moc:')?
+	{ after(grammarAccess.getPseudostateInitialAccess().getMocKeyword_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group_1_0__3__Impl
+	rule__PseudostateInitial__Group_1_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getKindAssignment_1_0_3()); }
+	(rule__PseudostateInitial__KindAssignment_1_0_3)
+	{ after(grammarAccess.getPseudostateInitialAccess().getKindAssignment_1_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group_1_0__4__Impl
+	rule__PseudostateInitial__Group_1_0__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getGreaterThanSignKeyword_1_0_4()); }
+	'>'
+	{ after(grammarAccess.getPseudostateInitialAccess().getGreaterThanSignKeyword_1_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group_1_0__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_1_0__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_0_5()); }
+	(rule__PseudostateInitial__NameAssignment_1_0_5)
+	{ after(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_0_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PseudostateInitial__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group_3_0__0__Impl
+	rule__PseudostateInitial__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getLeftCurlyBracketKeyword_3_0_0()); }
+	'{'
+	{ after(grammarAccess.getPseudostateInitialAccess().getLeftCurlyBracketKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group_3_0__1__Impl
+	rule__PseudostateInitial__Group_3_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getTransitionAssignment_3_0_1()); }
+	(rule__PseudostateInitial__TransitionAssignment_3_0_1)*
+	{ after(grammarAccess.getPseudostateInitialAccess().getTransitionAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_3_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PseudostateInitial__Group_3_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__Group_3_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPseudostateInitialAccess().getRightCurlyBracketKeyword_3_0_2()); }
+	'}'
+	{ after(grammarAccess.getPseudostateInitialAccess().getRightCurlyBracketKeyword_3_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EndingPseudostate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group__0__Impl
+	rule__EndingPseudostate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getPseudostateAction_0()); }
+	()
+	{ after(grammarAccess.getEndingPseudostateAccess().getPseudostateAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group__1__Impl
+	rule__EndingPseudostate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getAlternatives_1()); }
+	(rule__EndingPseudostate__Alternatives_1)
+	{ after(grammarAccess.getEndingPseudostateAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group__2__Impl
+	rule__EndingPseudostate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getLessThanSignKeyword_2()); }
+	'<'
+	{ after(grammarAccess.getEndingPseudostateAccess().getLessThanSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group__3__Impl
+	rule__EndingPseudostate__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getMocKeyword_3()); }
+	('moc:')?
+	{ after(grammarAccess.getEndingPseudostateAccess().getMocKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group__4__Impl
+	rule__EndingPseudostate__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getKindAssignment_4()); }
+	(rule__EndingPseudostate__KindAssignment_4)
+	{ after(grammarAccess.getEndingPseudostateAccess().getKindAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group__5__Impl
+	rule__EndingPseudostate__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getGreaterThanSignKeyword_5()); }
+	'>'
+	{ after(grammarAccess.getEndingPseudostateAccess().getGreaterThanSignKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group__6__Impl
+	rule__EndingPseudostate__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getNameAssignment_6()); }
+	(rule__EndingPseudostate__NameAssignment_6)
+	{ after(grammarAccess.getEndingPseudostateAccess().getNameAssignment_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group__7__Impl
+	rule__EndingPseudostate__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameAssignment_7()); }
+	(rule__EndingPseudostate__UnrestrictedNameAssignment_7)?
+	{ after(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getAlternatives_8()); }
+	(rule__EndingPseudostate__Alternatives_8)
+	{ after(grammarAccess.getEndingPseudostateAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EndingPseudostate__Group_8_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group_8_0__0__Impl
+	rule__EndingPseudostate__Group_8_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group_8_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()); }
+	'{'
+	{ after(grammarAccess.getEndingPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group_8_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group_8_0__1__Impl
+	rule__EndingPseudostate__Group_8_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group_8_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getMoeAssignment_8_0_1()); }
+	(rule__EndingPseudostate__MoeAssignment_8_0_1)*
+	{ after(grammarAccess.getEndingPseudostateAccess().getMoeAssignment_8_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group_8_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EndingPseudostate__Group_8_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__Group_8_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEndingPseudostateAccess().getRightCurlyBracketKeyword_8_0_2()); }
+	'}'
+	{ after(grammarAccess.getEndingPseudostateAccess().getRightCurlyBracketKeyword_8_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group__0__Impl
+	rule__ModelOfExecution__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getModelOfExecutionAction_0()); }
+	()
+	{ after(grammarAccess.getModelOfExecutionAccess().getModelOfExecutionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group__1__Impl
+	rule__ModelOfExecution__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getMoeKeyword_1()); }
+	'@moe:'
+	{ after(grammarAccess.getModelOfExecutionAccess().getMoeKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group__2__Impl
+	rule__ModelOfExecution__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_2()); }
+	(rule__ModelOfExecution__RoutineAssignment_2)*
+	{ after(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group__3__Impl
+	rule__ModelOfExecution__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()); }
+	(rule__ModelOfExecution__UnorderedGroup_3)
+	{ after(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_4()); }
+	(rule__ModelOfExecution__RoutineAssignment_4)*
+	{ after(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_0__0__Impl
+	rule__ModelOfExecution__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getInitKeyword_3_0_0()); }
+	'@init'
+	{ after(grammarAccess.getModelOfExecutionAccess().getInitKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getInitRoutineAssignment_3_0_1()); }
+	(rule__ModelOfExecution__InitRoutineAssignment_3_0_1)
+	{ after(grammarAccess.getModelOfExecutionAccess().getInitRoutineAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_1__0__Impl
+	rule__ModelOfExecution__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getFinalKeyword_3_1_0()); }
+	'@final'
+	{ after(grammarAccess.getModelOfExecutionAccess().getFinalKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getFinalRoutineAssignment_3_1_1()); }
+	(rule__ModelOfExecution__FinalRoutineAssignment_3_1_1)
+	{ after(grammarAccess.getModelOfExecutionAccess().getFinalRoutineAssignment_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__Group_3_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_2__0__Impl
+	rule__ModelOfExecution__Group_3_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getEnableKeyword_3_2_0()); }
+	'@enable'
+	{ after(grammarAccess.getModelOfExecutionAccess().getEnableKeyword_3_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getEnableRoutineAssignment_3_2_1()); }
+	(rule__ModelOfExecution__EnableRoutineAssignment_3_2_1)
+	{ after(grammarAccess.getModelOfExecutionAccess().getEnableRoutineAssignment_3_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__Group_3_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_3__0__Impl
+	rule__ModelOfExecution__Group_3_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getDisableKeyword_3_3_0()); }
+	'@disable'
+	{ after(grammarAccess.getModelOfExecutionAccess().getDisableKeyword_3_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getDisableRoutineAssignment_3_3_1()); }
+	(rule__ModelOfExecution__DisableRoutineAssignment_3_3_1)
+	{ after(grammarAccess.getModelOfExecutionAccess().getDisableRoutineAssignment_3_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__Group_3_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_4__0__Impl
+	rule__ModelOfExecution__Group_3_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getConcurrencyKeyword_3_4_0()); }
+	'@concurrency'
+	{ after(grammarAccess.getModelOfExecutionAccess().getConcurrencyKeyword_3_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineAssignment_3_4_1()); }
+	(rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1)
+	{ after(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineAssignment_3_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__Group_3_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_5__0__Impl
+	rule__ModelOfExecution__Group_3_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getScheduleKeyword_3_5_0()); }
+	'@schedule'
+	{ after(grammarAccess.getModelOfExecutionAccess().getScheduleKeyword_3_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_5__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineAssignment_3_5_1()); }
+	(rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1)
+	{ after(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineAssignment_3_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__Group_3_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_6__0__Impl
+	rule__ModelOfExecution__Group_3_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getIrunKeyword_3_6_0()); }
+	'@irun'
+	{ after(grammarAccess.getModelOfExecutionAccess().getIrunKeyword_3_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getIrunRoutineAssignment_3_6_1()); }
+	(rule__ModelOfExecution__IrunRoutineAssignment_3_6_1)
+	{ after(grammarAccess.getModelOfExecutionAccess().getIrunRoutineAssignment_3_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__Group_3_7__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_7__0__Impl
+	rule__ModelOfExecution__Group_3_7__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_7__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getRunKeyword_3_7_0()); }
+	'@run'
+	{ after(grammarAccess.getModelOfExecutionAccess().getRunKeyword_3_7_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_7__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__Group_3_7__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__Group_3_7__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfExecutionAccess().getRunRoutineAssignment_3_7_1()); }
+	(rule__ModelOfExecution__RunRoutineAssignment_3_7_1)
+	{ after(grammarAccess.getModelOfExecutionAccess().getRunRoutineAssignment_3_7_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeRoutine__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group__0__Impl
+	rule__MoeRoutine__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getRoutineAction_0()); }
+	()
+	{ after(grammarAccess.getMoeRoutineAccess().getRoutineAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group__1__Impl
+	rule__MoeRoutine__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getGroup_1()); }
+	(rule__MoeRoutine__Group_1__0)?
+	{ after(grammarAccess.getMoeRoutineAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group__2__Impl
+	rule__MoeRoutine__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getGroup_2()); }
+	(rule__MoeRoutine__Group_2__0)?
+	{ after(grammarAccess.getMoeRoutineAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getBodyBlockAssignment_3()); }
+	(rule__MoeRoutine__BodyBlockAssignment_3)
+	{ after(grammarAccess.getMoeRoutineAccess().getBodyBlockAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeRoutine__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group_1__0__Impl
+	rule__MoeRoutine__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_1_0()); }
+	'('
+	{ after(grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group_1__1__Impl
+	rule__MoeRoutine__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getDomainAssignment_1_1()); }
+	(rule__MoeRoutine__DomainAssignment_1_1)?
+	{ after(grammarAccess.getMoeRoutineAccess().getDomainAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_1_2()); }
+	')'
+	{ after(grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeRoutine__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group_2__0__Impl
+	rule__MoeRoutine__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getHyphenMinusGreaterThanSignKeyword_2_0()); }
+	'->'
+	{ after(grammarAccess.getMoeRoutineAccess().getHyphenMinusGreaterThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getAlternatives_2_1()); }
+	(rule__MoeRoutine__Alternatives_2_1)
+	{ after(grammarAccess.getMoeRoutineAccess().getAlternatives_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeRoutine__Group_2_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group_2_1_0__0__Impl
+	rule__MoeRoutine__Group_2_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_2_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_2_1_0_0()); }
+	'('
+	{ after(grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_2_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_2_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group_2_1_0__1__Impl
+	rule__MoeRoutine__Group_2_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_2_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_0_1()); }
+	(rule__MoeRoutine__CodomainAssignment_2_1_0_1)
+	{ after(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_2_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeRoutine__Group_2_1_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__Group_2_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_2_1_0_2()); }
+	')'
+	{ after(grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_2_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Routine__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group__0__Impl
+	rule__Routine__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getVisibilityAssignment_0()); }
+	(rule__Routine__VisibilityAssignment_0)?
+	{ after(grammarAccess.getRoutineAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group__1__Impl
+	rule__Routine__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getMacroKeyword_1()); }
+	('macro')?
+	{ after(grammarAccess.getRoutineAccess().getMacroKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group__2__Impl
+	rule__Routine__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getRoutineKeyword_2()); }
+	'routine'
+	{ after(grammarAccess.getRoutineAccess().getRoutineKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group__3__Impl
+	rule__Routine__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getNameAssignment_3()); }
+	(rule__Routine__NameAssignment_3)
+	{ after(grammarAccess.getRoutineAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group__4__Impl
+	rule__Routine__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__Routine__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getRoutineAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group__5__Impl
+	rule__Routine__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getGroup_5()); }
+	(rule__Routine__Group_5__0)?
+	{ after(grammarAccess.getRoutineAccess().getGroup_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group__6__Impl
+	rule__Routine__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getGroup_6()); }
+	(rule__Routine__Group_6__0)?
+	{ after(grammarAccess.getRoutineAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group__7__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getBodyBlockAssignment_7()); }
+	(rule__Routine__BodyBlockAssignment_7)
+	{ after(grammarAccess.getRoutineAccess().getBodyBlockAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Routine__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group_5__0__Impl
+	rule__Routine__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_5_0()); }
+	'('
+	{ after(grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group_5__1__Impl
+	rule__Routine__Group_5__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getDomainAssignment_5_1()); }
+	(rule__Routine__DomainAssignment_5_1)?
+	{ after(grammarAccess.getRoutineAccess().getDomainAssignment_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_5__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group_5__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_5__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getRightParenthesisKeyword_5_2()); }
+	')'
+	{ after(grammarAccess.getRoutineAccess().getRightParenthesisKeyword_5_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Routine__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group_6__0__Impl
+	rule__Routine__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0()); }
+	'-->'
+	{ after(grammarAccess.getRoutineAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getAlternatives_6_1()); }
+	(rule__Routine__Alternatives_6_1)
+	{ after(grammarAccess.getRoutineAccess().getAlternatives_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Routine__Group_6_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group_6_1_0__0__Impl
+	rule__Routine__Group_6_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_6_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_6_1_0_0()); }
+	'('
+	{ after(grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_6_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_6_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group_6_1_0__1__Impl
+	rule__Routine__Group_6_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_6_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_0_1()); }
+	(rule__Routine__CodomainAssignment_6_1_0_1)
+	{ after(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_6_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Routine__Group_6_1_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__Group_6_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRoutineAccess().getRightParenthesisKeyword_6_1_0_2()); }
+	')'
+	{ after(grammarAccess.getRoutineAccess().getRightParenthesisKeyword_6_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfInteraction__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfInteraction__Group__0__Impl
+	rule__ModelOfInteraction__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfInteraction__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfInteractionAccess().getModelOfInteractionAction_0()); }
+	()
+	{ after(grammarAccess.getModelOfInteractionAccess().getModelOfInteractionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfInteraction__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfInteraction__Group__1__Impl
+	rule__ModelOfInteraction__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfInteraction__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfInteractionAccess().getComKeyword_1()); }
+	'@com:'
+	{ after(grammarAccess.getModelOfInteractionAccess().getComKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfInteraction__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfInteraction__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfInteraction__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModelOfInteractionAccess().getAlternatives_2()); }
+	(rule__ModelOfInteraction__Alternatives_2)*
+	{ after(grammarAccess.getModelOfInteractionAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Route__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__0__Impl
+	rule__Route__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getRouteAction_0()); }
+	()
+	{ after(grammarAccess.getRouteAccess().getRouteAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__1__Impl
+	rule__Route__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getRouteKeyword_1()); }
+	'route'
+	{ after(grammarAccess.getRouteAccess().getRouteKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__2__Impl
+	rule__Route__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getLessThanSignKeyword_2()); }
+	'<'
+	{ after(grammarAccess.getRouteAccess().getLessThanSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__3__Impl
+	rule__Route__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getProtocolAssignment_3()); }
+	(rule__Route__ProtocolAssignment_3)
+	{ after(grammarAccess.getRouteAccess().getProtocolAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__4__Impl
+	rule__Route__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getGreaterThanSignKeyword_4()); }
+	'>'
+	{ after(grammarAccess.getRouteAccess().getGreaterThanSignKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__5__Impl
+	rule__Route__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getGroup_5()); }
+	(rule__Route__Group_5__0)?
+	{ after(grammarAccess.getRouteAccess().getGroup_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__6__Impl
+	rule__Route__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getLeftSquareBracketKeyword_6()); }
+	'['
+	{ after(grammarAccess.getRouteAccess().getLeftSquareBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__7__Impl
+	rule__Route__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getAlternatives_7()); }
+	(rule__Route__Alternatives_7)
+	{ after(grammarAccess.getRouteAccess().getAlternatives_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__8__Impl
+	rule__Route__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getRightSquareBracketKeyword_8()); }
+	']'
+	{ after(grammarAccess.getRouteAccess().getRightSquareBracketKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group__9__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getSemicolonKeyword_9()); }
+	';'
+	{ after(grammarAccess.getRouteAccess().getSemicolonKeyword_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Route__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group_5__0__Impl
+	rule__Route__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getNameAssignment_5_0()); }
+	(rule__Route__NameAssignment_5_0)
+	{ after(grammarAccess.getRouteAccess().getNameAssignment_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group_5__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getUnrestrictedNameAssignment_5_1()); }
+	(rule__Route__UnrestrictedNameAssignment_5_1)?
+	{ after(grammarAccess.getRouteAccess().getUnrestrictedNameAssignment_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Route__Group_7_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group_7_1__0__Impl
+	rule__Route__Group_7_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group_7_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_0()); }
+	(rule__Route__SignalsAssignment_7_1_0)
+	{ after(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group_7_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group_7_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group_7_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getGroup_7_1_1()); }
+	(rule__Route__Group_7_1_1__0)*
+	{ after(grammarAccess.getRouteAccess().getGroup_7_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Route__Group_7_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group_7_1_1__0__Impl
+	rule__Route__Group_7_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group_7_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getCommaKeyword_7_1_1_0()); }
+	','
+	{ after(grammarAccess.getRouteAccess().getCommaKeyword_7_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group_7_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Route__Group_7_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__Group_7_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_1_1()); }
+	(rule__Route__SignalsAssignment_7_1_1_1)
+	{ after(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComRouteProtocol__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComRouteProtocol__Group_1__0__Impl
+	rule__ComRouteProtocol__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_1_0()); }
+	(rule__ComRouteProtocol__ProtocolAssignment_1_0)
+	{ after(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComRouteProtocol__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1()); }
+	(rule__ComRouteProtocol__Alternatives_1_1)?
+	{ after(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComRouteProtocol__Group_1_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComRouteProtocol__Group_1_1_0__0__Impl
+	rule__ComRouteProtocol__Group_1_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComRouteProtocolAccess().getColonKeyword_1_1_0_0()); }
+	':'
+	{ after(grammarAccess.getComRouteProtocolAccess().getColonKeyword_1_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComRouteProtocol__Group_1_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_0_1()); }
+	(rule__ComRouteProtocol__Alternatives_1_1_0_1)
+	{ after(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComRouteProtocol__Group_1_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComRouteProtocol__Group_1_1_1__0__Impl
+	rule__ComRouteProtocol__Group_1_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComRouteProtocolAccess().getLessThanSignKeyword_1_1_1_0()); }
+	'<'
+	{ after(grammarAccess.getComRouteProtocolAccess().getLessThanSignKeyword_1_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComRouteProtocol__Group_1_1_1__1__Impl
+	rule__ComRouteProtocol__Group_1_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_1_1()); }
+	(rule__ComRouteProtocol__Alternatives_1_1_1_1)
+	{ after(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComRouteProtocol__Group_1_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Group_1_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComRouteProtocolAccess().getGreaterThanSignKeyword_1_1_1_2()); }
+	'>'
+	{ after(grammarAccess.getComRouteProtocolAccess().getGreaterThanSignKeyword_1_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Connection__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group__0__Impl
+	rule__Connection__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConnectionAccess().getConnectKeyword_0()); }
+	'connect'
+	{ after(grammarAccess.getConnectionAccess().getConnectKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group__1__Impl
+	rule__Connection__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConnectionAccess().getLessThanSignKeyword_1()); }
+	'<'
+	{ after(grammarAccess.getConnectionAccess().getLessThanSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group__2__Impl
+	rule__Connection__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConnectionAccess().getProtocolAssignment_2()); }
+	(rule__Connection__ProtocolAssignment_2)
+	{ after(grammarAccess.getConnectionAccess().getProtocolAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group__3__Impl
+	rule__Connection__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConnectionAccess().getGreaterThanSignKeyword_3()); }
+	'>'
+	{ after(grammarAccess.getConnectionAccess().getGreaterThanSignKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group__4__Impl
+	rule__Connection__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConnectionAccess().getGroup_4()); }
+	(rule__Connection__Group_4__0)?
+	{ after(grammarAccess.getConnectionAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group__5__Impl
+	rule__Connection__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConnectionAccess().getLeftCurlyBracketKeyword_5()); }
+	'{'
+	{ after(grammarAccess.getConnectionAccess().getLeftCurlyBracketKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group__6__Impl
+	rule__Connection__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getConnectionAccess().getComPointsAssignment_6()); }
+		(rule__Connection__ComPointsAssignment_6)
+		{ after(grammarAccess.getConnectionAccess().getComPointsAssignment_6()); }
+	)
+	(
+		{ before(grammarAccess.getConnectionAccess().getComPointsAssignment_6()); }
+		(rule__Connection__ComPointsAssignment_6)*
+		{ after(grammarAccess.getConnectionAccess().getComPointsAssignment_6()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group__7__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConnectionAccess().getRightCurlyBracketKeyword_7()); }
+	'}'
+	{ after(grammarAccess.getConnectionAccess().getRightCurlyBracketKeyword_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Connection__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group_4__0__Impl
+	rule__Connection__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConnectionAccess().getNameAssignment_4_0()); }
+	(rule__Connection__NameAssignment_4_0)
+	{ after(grammarAccess.getConnectionAccess().getNameAssignment_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Connection__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConnectionAccess().getUnrestrictedNameAssignment_4_1()); }
+	(rule__Connection__UnrestrictedNameAssignment_4_1)?
+	{ after(grammarAccess.getConnectionAccess().getUnrestrictedNameAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComProtocol__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_1__0__Impl
+	rule__ComProtocol__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getProtocolAssignment_1_0()); }
+	(rule__ComProtocol__ProtocolAssignment_1_0)
+	{ after(grammarAccess.getComProtocolAccess().getProtocolAssignment_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getGroup_1_1()); }
+	(rule__ComProtocol__Group_1_1__0)?
+	{ after(grammarAccess.getComProtocolAccess().getGroup_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComProtocol__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_1_1__0__Impl
+	rule__ComProtocol__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getLessThanSignKeyword_1_1_0()); }
+	'<'
+	{ after(grammarAccess.getComProtocolAccess().getLessThanSignKeyword_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_1_1__1__Impl
+	rule__ComProtocol__Group_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getCastAssignment_1_1_1()); }
+	(rule__ComProtocol__CastAssignment_1_1_1)
+	{ after(grammarAccess.getComProtocolAccess().getCastAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_1_1_2()); }
+	'>'
+	{ after(grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComProtocol__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_2__0__Impl
+	rule__ComProtocol__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getProtocolAssignment_2_0()); }
+	(rule__ComProtocol__ProtocolAssignment_2_0)
+	{ after(grammarAccess.getComProtocolAccess().getProtocolAssignment_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getAlternatives_2_1()); }
+	(rule__ComProtocol__Alternatives_2_1)?
+	{ after(grammarAccess.getComProtocolAccess().getAlternatives_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComProtocol__Group_2_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_2_1_0__0__Impl
+	rule__ComProtocol__Group_2_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getColonKeyword_2_1_0_0()); }
+	':'
+	{ after(grammarAccess.getComProtocolAccess().getColonKeyword_2_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_2_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getAlternatives_2_1_0_1()); }
+	(rule__ComProtocol__Alternatives_2_1_0_1)
+	{ after(grammarAccess.getComProtocolAccess().getAlternatives_2_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComProtocol__Group_2_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_2_1_1__0__Impl
+	rule__ComProtocol__Group_2_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getLessThanSignKeyword_2_1_1_0()); }
+	'<'
+	{ after(grammarAccess.getComProtocolAccess().getLessThanSignKeyword_2_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_2_1_1__1__Impl
+	rule__ComProtocol__Group_2_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getAlternatives_2_1_1_1()); }
+	(rule__ComProtocol__Alternatives_2_1_1_1)
+	{ after(grammarAccess.getComProtocolAccess().getAlternatives_2_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComProtocol__Group_2_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Group_2_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_2_1_1_2()); }
+	'>'
+	{ after(grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_2_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComPoint__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group__0__Impl
+	rule__ComPoint__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getComPointAction_0()); }
+	()
+	{ after(grammarAccess.getComPointAccess().getComPointAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group__1__Impl
+	rule__ComPoint__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getDirectionAssignment_1()); }
+	(rule__ComPoint__DirectionAssignment_1)
+	{ after(grammarAccess.getComPointAccess().getDirectionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group__2__Impl
+	rule__ComPoint__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getGroup_2()); }
+	(rule__ComPoint__Group_2__0)?
+	{ after(grammarAccess.getComPointAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getAlternatives_3()); }
+	(rule__ComPoint__Alternatives_3)
+	{ after(grammarAccess.getComPointAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComPoint__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group_2__0__Impl
+	rule__ComPoint__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getLessThanSignKeyword_2_0()); }
+	'<'
+	{ after(grammarAccess.getComPointAccess().getLessThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group_2__1__Impl
+	rule__ComPoint__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getProtocolAssignment_2_1()); }
+	(rule__ComPoint__ProtocolAssignment_2_1)
+	{ after(grammarAccess.getComPointAccess().getProtocolAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getGreaterThanSignKeyword_2_2()); }
+	'>'
+	{ after(grammarAccess.getComPointAccess().getGreaterThanSignKeyword_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComPoint__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group_3_0__0__Impl
+	rule__ComPoint__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getPointAssignment_3_0_0()); }
+	(rule__ComPoint__PointAssignment_3_0_0)
+	{ after(grammarAccess.getComPointAccess().getPointAssignment_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getSemicolonKeyword_3_0_1()); }
+	';'
+	{ after(grammarAccess.getComPointAccess().getSemicolonKeyword_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComPoint__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group_3_1__0__Impl
+	rule__ComPoint__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getLeftCurlyBracketKeyword_3_1_0()); }
+	'{'
+	{ after(grammarAccess.getComPointAccess().getLeftCurlyBracketKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group_3_1__1__Impl
+	rule__ComPoint__Group_3_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getPointsAssignment_3_1_1()); }
+	(rule__ComPoint__PointsAssignment_3_1_1)
+	{ after(grammarAccess.getComPointAccess().getPointsAssignment_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_3_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPoint__Group_3_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__Group_3_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointAccess().getRightCurlyBracketKeyword_3_1_2()); }
+	'}'
+	{ after(grammarAccess.getComPointAccess().getRightCurlyBracketKeyword_3_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComPointProtocol__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPointProtocol__Group_0__0__Impl
+	rule__ComPointProtocol__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointProtocolAccess().getProtocolAssignment_0_0()); }
+	(rule__ComPointProtocol__ProtocolAssignment_0_0)
+	{ after(grammarAccess.getComPointProtocolAccess().getProtocolAssignment_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPointProtocol__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1()); }
+	(rule__ComPointProtocol__Alternatives_0_1)?
+	{ after(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComPointProtocol__Group_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPointProtocol__Group_0_1_0__0__Impl
+	rule__ComPointProtocol__Group_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointProtocolAccess().getColonKeyword_0_1_0_0()); }
+	':'
+	{ after(grammarAccess.getComPointProtocolAccess().getColonKeyword_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPointProtocol__Group_0_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_0_1()); }
+	(rule__ComPointProtocol__Alternatives_0_1_0_1)
+	{ after(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComPointProtocol__Group_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPointProtocol__Group_0_1_1__0__Impl
+	rule__ComPointProtocol__Group_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointProtocolAccess().getLessThanSignKeyword_0_1_1_0()); }
+	'<'
+	{ after(grammarAccess.getComPointProtocolAccess().getLessThanSignKeyword_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPointProtocol__Group_0_1_1__1__Impl
+	rule__ComPointProtocol__Group_0_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_1_1()); }
+	(rule__ComPointProtocol__Alternatives_0_1_1_1)
+	{ after(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComPointProtocol__Group_0_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Group_0_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComPointProtocolAccess().getGreaterThanSignKeyword_0_1_1_2()); }
+	'>'
+	{ after(grammarAccess.getComPointProtocolAccess().getGreaterThanSignKeyword_0_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComElement__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComElement__Group_0__0__Impl
+	rule__ComElement__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComElementAccess().getLiteralPureReferenceElementParserRuleCall_0_0()); }
+	ruleLiteralPureReferenceElement
+	{ after(grammarAccess.getComElementAccess().getLiteralPureReferenceElementParserRuleCall_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComElement__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComElementAccess().getGroup_0_1()); }
+	(rule__ComElement__Group_0_1__0)?
+	{ after(grammarAccess.getComElementAccess().getGroup_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComElement__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComElement__Group_0_1__0__Impl
+	rule__ComElement__Group_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComElementAccess().getValueElementSpecificationTargetAction_0_1_0()); }
+	()
+	{ after(grammarAccess.getComElementAccess().getValueElementSpecificationTargetAction_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComElement__Group_0_1__1__Impl
+	rule__ComElement__Group_0_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComElementAccess().getKindAssignment_0_1_1()); }
+	(rule__ComElement__KindAssignment_0_1_1)
+	{ after(grammarAccess.getComElementAccess().getKindAssignment_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_0_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComElement__Group_0_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_0_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComElementAccess().getElementAssignment_0_1_2()); }
+	(rule__ComElement__ElementAssignment_0_1_2)
+	{ after(grammarAccess.getComElementAccess().getElementAssignment_0_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ComElement__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComElement__Group_1__0__Impl
+	rule__ComElement__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComElementAccess().getValueElementSpecificationAction_1_0()); }
+	()
+	{ after(grammarAccess.getComElementAccess().getValueElementSpecificationAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComElement__Group_1__1__Impl
+	rule__ComElement__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComElementAccess().getTargetAssignment_1_1()); }
+	(rule__ComElement__TargetAssignment_1_1)
+	{ after(grammarAccess.getComElementAccess().getTargetAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComElement__Group_1__2__Impl
+	rule__ComElement__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComElementAccess().getKindAssignment_1_2()); }
+	(rule__ComElement__KindAssignment_1_2)
+	{ after(grammarAccess.getComElementAccess().getKindAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ComElement__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getComElementAccess().getElementAssignment_1_3()); }
+	(rule__ComElement__ElementAssignment_1_3)
+	{ after(grammarAccess.getComElementAccess().getElementAssignment_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataTypeReference__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_0__0__Impl
+	rule__DataTypeReference__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getSimpleDataTypeParserRuleCall_0_0()); }
+	ruleSimpleDataType
+	{ after(grammarAccess.getDataTypeReferenceAccess().getSimpleDataTypeParserRuleCall_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getGroup_0_1()); }
+	(rule__DataTypeReference__Group_0_1__0)?
+	{ after(grammarAccess.getDataTypeReferenceAccess().getGroup_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataTypeReference__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_0_1__0__Impl
+	rule__DataTypeReference__Group_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0()); }
+	()
+	{ after(grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_0_1__1__Impl
+	rule__DataTypeReference__Group_0_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_0_1_1()); }
+	'['
+	{ after(grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_0_1__2__Impl
+	rule__DataTypeReference__Group_0_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_0_1_2()); }
+	(rule__DataTypeReference__MultiplicityAssignment_0_1_2)
+	{ after(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_0_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_0_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_0_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_0_1_3()); }
+	']'
+	{ after(grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_0_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataTypeReference__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_1__0__Impl
+	rule__DataTypeReference__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceAction_1_0()); }
+	()
+	{ after(grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_1__1__Impl
+	rule__DataTypeReference__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getTyperefAssignment_1_1()); }
+	(rule__DataTypeReference__TyperefAssignment_1_1)
+	{ after(grammarAccess.getDataTypeReferenceAccess().getTyperefAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getGroup_1_2()); }
+	(rule__DataTypeReference__Group_1_2__0)?
+	{ after(grammarAccess.getDataTypeReferenceAccess().getGroup_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataTypeReference__Group_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_1_2__0__Impl
+	rule__DataTypeReference__Group_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_1_2_0()); }
+	'['
+	{ after(grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_1_2__1__Impl
+	rule__DataTypeReference__Group_1_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_1_2_1()); }
+	(rule__DataTypeReference__MultiplicityAssignment_1_2_1)
+	{ after(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataTypeReference__Group_1_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__Group_1_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_1_2_2()); }
+	']'
+	{ after(grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_1_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinition__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group__0__Impl
+	rule__OtherDataTypeDefinition__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getDataTypeReferenceAction_0()); }
+	()
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getDataTypeReferenceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group__1__Impl
+	rule__OtherDataTypeDefinition__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityAssignment_1()); }
+	(rule__OtherDataTypeDefinition__VisibilityAssignment_1)?
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group__2__Impl
+	rule__OtherDataTypeDefinition__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getTypeKeyword_2()); }
+	'type'
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getTypeKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group__3__Impl
+	rule__OtherDataTypeDefinition__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getNameAssignment_3()); }
+	(rule__OtherDataTypeDefinition__NameAssignment_3)
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group__4__Impl
+	rule__OtherDataTypeDefinition__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group__5__Impl
+	rule__OtherDataTypeDefinition__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getAlternatives_5()); }
+	(rule__OtherDataTypeDefinition__Alternatives_5)
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getAlternatives_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefAssignment_6()); }
+	(rule__OtherDataTypeDefinition__TypedefAssignment_6)
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefAssignment_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinition__Group_5_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_0__0__Impl
+	rule__OtherDataTypeDefinition__Group_5_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportAssignment_5_0_0()); }
+	(rule__OtherDataTypeDefinition__SupportAssignment_5_0_0)
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportAssignment_5_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0_1()); }
+	(rule__OtherDataTypeDefinition__Group_5_0_1__0)?
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinition__Group_5_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl
+	rule__OtherDataTypeDefinition__Group_5_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_0_1_0()); }
+	'['
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl
+	rule__OtherDataTypeDefinition__Group_5_0_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_0_1_1()); }
+	(rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1)
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_0_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_0_1_2()); }
+	']'
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_0_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinition__Group_5_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_1__0__Impl
+	rule__OtherDataTypeDefinition__Group_5_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefAssignment_5_1_0()); }
+	(rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0)
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefAssignment_5_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1_1()); }
+	(rule__OtherDataTypeDefinition__Group_5_1_1__0)?
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinition__Group_5_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl
+	rule__OtherDataTypeDefinition__Group_5_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_1_1_0()); }
+	'['
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl
+	rule__OtherDataTypeDefinition__Group_5_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_1_1_1()); }
+	(rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1)
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_1_1_2()); }
+	']'
+	{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinitionImpl__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group__0__Impl
+	rule__OtherDataTypeDefinitionImpl__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getDataTypeReferenceAction_0()); }
+	()
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getDataTypeReferenceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group__1__Impl
+	rule__OtherDataTypeDefinitionImpl__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameAssignment_1()); }
+	(rule__OtherDataTypeDefinitionImpl__NameAssignment_1)
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group__2__Impl
+	rule__OtherDataTypeDefinitionImpl__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group__3__Impl
+	rule__OtherDataTypeDefinitionImpl__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getAlternatives_3()); }
+	(rule__OtherDataTypeDefinitionImpl__Alternatives_3)
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefAssignment_4()); }
+	(rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4)
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl
+	rule__OtherDataTypeDefinitionImpl__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportAssignment_3_0_0()); }
+	(rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0)
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportAssignment_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0_1()); }
+	(rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0)?
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl
+	rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_0_1_0()); }
+	'['
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl
+	rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_0_1_1()); }
+	(rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1)
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_0_1_2()); }
+	']'
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_0_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl
+	rule__OtherDataTypeDefinitionImpl__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefAssignment_3_1_0()); }
+	(rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0)
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefAssignment_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1_1()); }
+	(rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0)?
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl
+	rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_1_1_0()); }
+	'['
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl
+	rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_1_1_1()); }
+	(rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1)
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_1_1_2()); }
+	']'
+	{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveIntegerType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group__0__Impl
+	rule__PrimitiveIntegerType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getPrimitiveIntegerTypeAction_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getPrimitiveIntegerTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group__1__Impl
+	rule__PrimitiveIntegerType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getSignAssignment_1()); }
+	(rule__PrimitiveIntegerType__SignAssignment_1)?
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getSignAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group__2__Impl
+	rule__PrimitiveIntegerType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_2()); }
+	(rule__PrimitiveIntegerType__Alternatives_2)
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_3()); }
+	(rule__PrimitiveIntegerType__Alternatives_3)?
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveIntegerType__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group_3_0__0__Impl
+	rule__PrimitiveIntegerType__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getColonKeyword_3_0_0()); }
+	':'
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getColonKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_0_1()); }
+	(rule__PrimitiveIntegerType__SizeAssignment_3_0_1)
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveIntegerType__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group_3_1__0__Impl
+	rule__PrimitiveIntegerType__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getLessThanSignKeyword_3_1_0()); }
+	'<'
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getLessThanSignKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group_3_1__1__Impl
+	rule__PrimitiveIntegerType__Group_3_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeKeyword_3_1_1()); }
+	('size:')?
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeKeyword_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group_3_1__2__Impl
+	rule__PrimitiveIntegerType__Group_3_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_1_2()); }
+	(rule__PrimitiveIntegerType__SizeAssignment_3_1_2)
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveIntegerType__Group_3_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__Group_3_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getGreaterThanSignKeyword_3_1_3()); }
+	'>'
+	{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getGreaterThanSignKeyword_3_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveRationalType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group__0__Impl
+	rule__PrimitiveRationalType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getPrimitiveRationalTypeAction_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getPrimitiveRationalTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group__1__Impl
+	rule__PrimitiveRationalType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getSignAssignment_1()); }
+	(rule__PrimitiveRationalType__SignAssignment_1)?
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getSignAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group__2__Impl
+	rule__PrimitiveRationalType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_2()); }
+	(rule__PrimitiveRationalType__Alternatives_2)
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_3()); }
+	(rule__PrimitiveRationalType__Alternatives_3)?
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveRationalType__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group_3_0__0__Impl
+	rule__PrimitiveRationalType__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getColonKeyword_3_0_0()); }
+	':'
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getColonKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_0_1()); }
+	(rule__PrimitiveRationalType__SizeAssignment_3_0_1)
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveRationalType__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group_3_1__0__Impl
+	rule__PrimitiveRationalType__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getLessThanSignKeyword_3_1_0()); }
+	'<'
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getLessThanSignKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group_3_1__1__Impl
+	rule__PrimitiveRationalType__Group_3_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeKeyword_3_1_1()); }
+	('size:')?
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeKeyword_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group_3_1__2__Impl
+	rule__PrimitiveRationalType__Group_3_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_1_2()); }
+	(rule__PrimitiveRationalType__SizeAssignment_3_1_2)
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRationalType__Group_3_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__Group_3_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRationalTypeAccess().getGreaterThanSignKeyword_3_1_3()); }
+	'>'
+	{ after(grammarAccess.getPrimitiveRationalTypeAccess().getGreaterThanSignKeyword_3_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveFloatType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group__0__Impl
+	rule__PrimitiveFloatType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getPrimitiveFloatTypeAction_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getPrimitiveFloatTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group__1__Impl
+	rule__PrimitiveFloatType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getSignAssignment_1()); }
+	(rule__PrimitiveFloatType__SignAssignment_1)?
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getSignAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group__2__Impl
+	rule__PrimitiveFloatType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_2()); }
+	(rule__PrimitiveFloatType__Alternatives_2)
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_3()); }
+	(rule__PrimitiveFloatType__Alternatives_3)?
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveFloatType__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group_3_0__0__Impl
+	rule__PrimitiveFloatType__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getColonKeyword_3_0_0()); }
+	':'
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getColonKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_0_1()); }
+	(rule__PrimitiveFloatType__SizeAssignment_3_0_1)
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveFloatType__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group_3_1__0__Impl
+	rule__PrimitiveFloatType__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getLessThanSignKeyword_3_1_0()); }
+	'<'
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getLessThanSignKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group_3_1__1__Impl
+	rule__PrimitiveFloatType__Group_3_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeKeyword_3_1_1()); }
+	('size:')?
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeKeyword_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group_3_1__2__Impl
+	rule__PrimitiveFloatType__Group_3_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_1_2()); }
+	(rule__PrimitiveFloatType__SizeAssignment_3_1_2)
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveFloatType__Group_3_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__Group_3_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveFloatTypeAccess().getGreaterThanSignKeyword_3_1_3()); }
+	'>'
+	{ after(grammarAccess.getPrimitiveFloatTypeAccess().getGreaterThanSignKeyword_3_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveRealType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group__0__Impl
+	rule__PrimitiveRealType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getPrimitiveRealTypeAction_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getPrimitiveRealTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group__1__Impl
+	rule__PrimitiveRealType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getSignAssignment_1()); }
+	(rule__PrimitiveRealType__SignAssignment_1)?
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getSignAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group__2__Impl
+	rule__PrimitiveRealType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_2()); }
+	(rule__PrimitiveRealType__Alternatives_2)
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_3()); }
+	(rule__PrimitiveRealType__Alternatives_3)?
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveRealType__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group_3_0__0__Impl
+	rule__PrimitiveRealType__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getColonKeyword_3_0_0()); }
+	':'
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getColonKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_0_1()); }
+	(rule__PrimitiveRealType__SizeAssignment_3_0_1)
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveRealType__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group_3_1__0__Impl
+	rule__PrimitiveRealType__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getLessThanSignKeyword_3_1_0()); }
+	'<'
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getLessThanSignKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group_3_1__1__Impl
+	rule__PrimitiveRealType__Group_3_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getSizeKeyword_3_1_1()); }
+	('size:')?
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getSizeKeyword_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group_3_1__2__Impl
+	rule__PrimitiveRealType__Group_3_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_1_2()); }
+	(rule__PrimitiveRealType__SizeAssignment_3_1_2)
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveRealType__Group_3_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__Group_3_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveRealTypeAccess().getGreaterThanSignKeyword_3_1_3()); }
+	'>'
+	{ after(grammarAccess.getPrimitiveRealTypeAccess().getGreaterThanSignKeyword_3_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveTimeType__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_0__0__Impl
+	rule__PrimitiveTimeType__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_0_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_0__1__Impl
+	rule__PrimitiveTimeType__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getTimeKeyword_0_1()); }
+	'time'
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getTimeKeyword_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_0_2()); }
+	(rule__PrimitiveTimeType__Alternatives_0_2)?
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveTimeType__Group_0_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_0_2_0__0__Impl
+	rule__PrimitiveTimeType__Group_0_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_0_2_0_0()); }
+	'<'
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_0_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_0_2_0__1__Impl
+	rule__PrimitiveTimeType__Group_0_2_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_0_1()); }
+	(rule__PrimitiveTimeType__SupportAssignment_0_2_0_1)
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0_2_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_0_2_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_0_2_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_0_2_0_2()); }
+	'>'
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_0_2_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveTimeType__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_1__0__Impl
+	rule__PrimitiveTimeType__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_1_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_1__1__Impl
+	rule__PrimitiveTimeType__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getClockAssignment_1_1()); }
+	(rule__PrimitiveTimeType__ClockAssignment_1_1)
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getClockAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_1_2()); }
+	(rule__PrimitiveTimeType__Alternatives_1_2)?
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveTimeType__Group_1_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_1_2_0__0__Impl
+	rule__PrimitiveTimeType__Group_1_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_1_2_0_0()); }
+	'<'
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_1_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_1_2_0__1__Impl
+	rule__PrimitiveTimeType__Group_1_2_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_0_1()); }
+	(rule__PrimitiveTimeType__SupportAssignment_1_2_0_1)
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1_2_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveTimeType__Group_1_2_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__Group_1_2_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_1_2_0_2()); }
+	'>'
+	{ after(grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_1_2_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveBooleanType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveBooleanType__Group__0__Impl
+	rule__PrimitiveBooleanType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveBooleanType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveBooleanTypeAccess().getPrimitiveBooleanTypeAction_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveBooleanTypeAccess().getPrimitiveBooleanTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveBooleanType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveBooleanType__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveBooleanType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveBooleanTypeAccess().getAlternatives_1()); }
+	(rule__PrimitiveBooleanType__Alternatives_1)
+	{ after(grammarAccess.getPrimitiveBooleanTypeAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveCharacterType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveCharacterType__Group__0__Impl
+	rule__PrimitiveCharacterType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveCharacterType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveCharacterTypeAccess().getPrimitiveCharacterTypeAction_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveCharacterTypeAccess().getPrimitiveCharacterTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveCharacterType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveCharacterType__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveCharacterType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveCharacterTypeAccess().getCharKeyword_1()); }
+	'char'
+	{ after(grammarAccess.getPrimitiveCharacterTypeAccess().getCharKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveStringType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveStringType__Group__0__Impl
+	rule__PrimitiveStringType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveStringTypeAccess().getPrimitiveStringTypeAction_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveStringTypeAccess().getPrimitiveStringTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveStringType__Group__1__Impl
+	rule__PrimitiveStringType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveStringTypeAccess().getStringKeyword_1()); }
+	'string'
+	{ after(grammarAccess.getPrimitiveStringTypeAccess().getStringKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveStringType__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveStringTypeAccess().getAlternatives_2()); }
+	(rule__PrimitiveStringType__Alternatives_2)?
+	{ after(grammarAccess.getPrimitiveStringTypeAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveStringType__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveStringType__Group_2_0__0__Impl
+	rule__PrimitiveStringType__Group_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveStringTypeAccess().getColonKeyword_2_0_0()); }
+	':'
+	{ after(grammarAccess.getPrimitiveStringTypeAccess().getColonKeyword_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveStringType__Group_2_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_0_1()); }
+	(rule__PrimitiveStringType__SizeAssignment_2_0_1)
+	{ after(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveStringType__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveStringType__Group_2_1__0__Impl
+	rule__PrimitiveStringType__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveStringTypeAccess().getLessThanSignKeyword_2_1_0()); }
+	'<'
+	{ after(grammarAccess.getPrimitiveStringTypeAccess().getLessThanSignKeyword_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveStringType__Group_2_1__1__Impl
+	rule__PrimitiveStringType__Group_2_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveStringTypeAccess().getSizeKeyword_2_1_1()); }
+	('size:')?
+	{ after(grammarAccess.getPrimitiveStringTypeAccess().getSizeKeyword_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveStringType__Group_2_1__2__Impl
+	rule__PrimitiveStringType__Group_2_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_1_2()); }
+	(rule__PrimitiveStringType__SizeAssignment_2_1_2)
+	{ after(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveStringType__Group_2_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__Group_2_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveStringTypeAccess().getGreaterThanSignKeyword_2_1_3()); }
+	'>'
+	{ after(grammarAccess.getPrimitiveStringTypeAccess().getGreaterThanSignKeyword_2_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveInstanceType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveInstanceType__Group__0__Impl
+	rule__PrimitiveInstanceType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getPrimitiveInstanceTypeAction_0()); }
+	()
+	{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getPrimitiveInstanceTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveInstanceType__Group__1__Impl
+	rule__PrimitiveInstanceType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedAssignment_1()); }
+	(rule__PrimitiveInstanceType__ExpectedAssignment_1)
+	{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveInstanceType__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup_2()); }
+	(rule__PrimitiveInstanceType__Group_2__0)?
+	{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimitiveInstanceType__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveInstanceType__Group_2__0__Impl
+	rule__PrimitiveInstanceType__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getLessThanSignKeyword_2_0()); }
+	'<'
+	{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getLessThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveInstanceType__Group_2__1__Impl
+	rule__PrimitiveInstanceType__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getModelAssignment_2_1()); }
+	(rule__PrimitiveInstanceType__ModelAssignment_2_1)
+	{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getModelAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimitiveInstanceType__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getGreaterThanSignKeyword_2_2()); }
+	'>'
+	{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getGreaterThanSignKeyword_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__IntervalType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__0__Impl
+	rule__IntervalType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getIntervalTypeAction_0()); }
+	()
+	{ after(grammarAccess.getIntervalTypeAccess().getIntervalTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__1__Impl
+	rule__IntervalType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getIntervalKeyword_1()); }
+	'interval'
+	{ after(grammarAccess.getIntervalTypeAccess().getIntervalKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__2__Impl
+	rule__IntervalType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getLessThanSignKeyword_2()); }
+	'<'
+	{ after(grammarAccess.getIntervalTypeAccess().getLessThanSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__3__Impl
+	rule__IntervalType__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getSupportAssignment_3()); }
+	(rule__IntervalType__SupportAssignment_3)
+	{ after(grammarAccess.getIntervalTypeAccess().getSupportAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__4__Impl
+	rule__IntervalType__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getAlternatives_4()); }
+	(rule__IntervalType__Alternatives_4)
+	{ after(grammarAccess.getIntervalTypeAccess().getAlternatives_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__5__Impl
+	rule__IntervalType__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getInfimumAssignment_5()); }
+	(rule__IntervalType__InfimumAssignment_5)
+	{ after(grammarAccess.getIntervalTypeAccess().getInfimumAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__6__Impl
+	rule__IntervalType__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getCommaKeyword_6()); }
+	','
+	{ after(grammarAccess.getIntervalTypeAccess().getCommaKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__7__Impl
+	rule__IntervalType__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getSupremumAssignment_7()); }
+	(rule__IntervalType__SupremumAssignment_7)
+	{ after(grammarAccess.getIntervalTypeAccess().getSupremumAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__8__Impl
+	rule__IntervalType__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getAlternatives_8()); }
+	(rule__IntervalType__Alternatives_8)
+	{ after(grammarAccess.getIntervalTypeAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalType__Group__9__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeAccess().getGreaterThanSignKeyword_9()); }
+	'>'
+	{ after(grammarAccess.getIntervalTypeAccess().getGreaterThanSignKeyword_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__IntervalTypeDefinition__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__0__Impl
+	rule__IntervalTypeDefinition__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getIntervalTypeAction_0()); }
+	()
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getIntervalTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__1__Impl
+	rule__IntervalTypeDefinition__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityAssignment_1()); }
+	(rule__IntervalTypeDefinition__VisibilityAssignment_1)?
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__2__Impl
+	rule__IntervalTypeDefinition__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getTypeKeyword_2()); }
+	'type'
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getTypeKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__3__Impl
+	rule__IntervalTypeDefinition__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getNameAssignment_3()); }
+	(rule__IntervalTypeDefinition__NameAssignment_3)
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__4__Impl
+	rule__IntervalTypeDefinition__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__5__Impl
+	rule__IntervalTypeDefinition__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getIntervalKeyword_5()); }
+	'interval'
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getIntervalKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__6__Impl
+	rule__IntervalTypeDefinition__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getLessThanSignKeyword_6()); }
+	'<'
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getLessThanSignKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__7__Impl
+	rule__IntervalTypeDefinition__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getSupportAssignment_7()); }
+	(rule__IntervalTypeDefinition__SupportAssignment_7)
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getSupportAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__8__Impl
+	rule__IntervalTypeDefinition__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_8()); }
+	(rule__IntervalTypeDefinition__Alternatives_8)
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__9__Impl
+	rule__IntervalTypeDefinition__Group__10
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumAssignment_9()); }
+	(rule__IntervalTypeDefinition__InfimumAssignment_9)
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumAssignment_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__10__Impl
+	rule__IntervalTypeDefinition__Group__11
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__10__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getCommaKeyword_10()); }
+	','
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getCommaKeyword_10()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__11__Impl
+	rule__IntervalTypeDefinition__Group__12
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__11__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumAssignment_11()); }
+	(rule__IntervalTypeDefinition__SupremumAssignment_11)
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumAssignment_11()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__12
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__12__Impl
+	rule__IntervalTypeDefinition__Group__13
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__12__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_12()); }
+	(rule__IntervalTypeDefinition__Alternatives_12)
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_12()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__13
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__13__Impl
+	rule__IntervalTypeDefinition__Group__14
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__13__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getGreaterThanSignKeyword_13()); }
+	'>'
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getGreaterThanSignKeyword_13()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__14
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinition__Group__14__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__Group__14__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionAccess().getSemicolonKeyword_14()); }
+	';'
+	{ after(grammarAccess.getIntervalTypeDefinitionAccess().getSemicolonKeyword_14()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__IntervalTypeDefinitionImpl__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__0__Impl
+	rule__IntervalTypeDefinitionImpl__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalTypeAction_0()); }
+	()
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__1__Impl
+	rule__IntervalTypeDefinitionImpl__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameAssignment_1()); }
+	(rule__IntervalTypeDefinitionImpl__NameAssignment_1)
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__2__Impl
+	rule__IntervalTypeDefinitionImpl__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__3__Impl
+	rule__IntervalTypeDefinitionImpl__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalKeyword_3()); }
+	'interval'
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__4__Impl
+	rule__IntervalTypeDefinitionImpl__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLessThanSignKeyword_4()); }
+	'<'
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLessThanSignKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__5__Impl
+	rule__IntervalTypeDefinitionImpl__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportAssignment_5()); }
+	(rule__IntervalTypeDefinitionImpl__SupportAssignment_5)
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__6__Impl
+	rule__IntervalTypeDefinitionImpl__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_6()); }
+	(rule__IntervalTypeDefinitionImpl__Alternatives_6)
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__7__Impl
+	rule__IntervalTypeDefinitionImpl__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumAssignment_7()); }
+	(rule__IntervalTypeDefinitionImpl__InfimumAssignment_7)
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__8__Impl
+	rule__IntervalTypeDefinitionImpl__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getCommaKeyword_8()); }
+	','
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getCommaKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__9__Impl
+	rule__IntervalTypeDefinitionImpl__Group__10
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumAssignment_9()); }
+	(rule__IntervalTypeDefinitionImpl__SupremumAssignment_9)
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumAssignment_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__10__Impl
+	rule__IntervalTypeDefinitionImpl__Group__11
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__10__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_10()); }
+	(rule__IntervalTypeDefinitionImpl__Alternatives_10)
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_10()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__11__Impl
+	rule__IntervalTypeDefinitionImpl__Group__12
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__11__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getGreaterThanSignKeyword_11()); }
+	'>'
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getGreaterThanSignKeyword_11()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__12
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IntervalTypeDefinitionImpl__Group__12__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__Group__12__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSemicolonKeyword_12()); }
+	';'
+	{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSemicolonKeyword_12()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CollectionType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionType__Group__0__Impl
+	rule__CollectionType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeAccess().getCollectionTypeAction_0()); }
+	()
+	{ after(grammarAccess.getCollectionTypeAccess().getCollectionTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionType__Group__1__Impl
+	rule__CollectionType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeAccess().getContainerAssignment_1()); }
+	(rule__CollectionType__ContainerAssignment_1)
+	{ after(grammarAccess.getCollectionTypeAccess().getContainerAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionType__Group__2__Impl
+	rule__CollectionType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeAccess().getLessThanSignKeyword_2()); }
+	'<'
+	{ after(grammarAccess.getCollectionTypeAccess().getLessThanSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionType__Group__3__Impl
+	rule__CollectionType__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeAccess().getSupportAssignment_3()); }
+	(rule__CollectionType__SupportAssignment_3)
+	{ after(grammarAccess.getCollectionTypeAccess().getSupportAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionType__Group__4__Impl
+	rule__CollectionType__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeAccess().getGroup_4()); }
+	(rule__CollectionType__Group_4__0)?
+	{ after(grammarAccess.getCollectionTypeAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionType__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeAccess().getGreaterThanSignKeyword_5()); }
+	'>'
+	{ after(grammarAccess.getCollectionTypeAccess().getGreaterThanSignKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CollectionType__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionType__Group_4__0__Impl
+	rule__CollectionType__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeAccess().getCommaKeyword_4_0()); }
+	','
+	{ after(grammarAccess.getCollectionTypeAccess().getCommaKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionType__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeAccess().getAlternatives_4_1()); }
+	(rule__CollectionType__Alternatives_4_1)
+	{ after(grammarAccess.getCollectionTypeAccess().getAlternatives_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CollectionTypeDefinition__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__0__Impl
+	rule__CollectionTypeDefinition__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getCollectionTypeAction_0()); }
+	()
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getCollectionTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__1__Impl
+	rule__CollectionTypeDefinition__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityAssignment_1()); }
+	(rule__CollectionTypeDefinition__VisibilityAssignment_1)?
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__2__Impl
+	rule__CollectionTypeDefinition__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getTypeKeyword_2()); }
+	'type'
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getTypeKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__3__Impl
+	rule__CollectionTypeDefinition__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getNameAssignment_3()); }
+	(rule__CollectionTypeDefinition__NameAssignment_3)
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__4__Impl
+	rule__CollectionTypeDefinition__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__5__Impl
+	rule__CollectionTypeDefinition__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getContainerAssignment_5()); }
+	(rule__CollectionTypeDefinition__ContainerAssignment_5)
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getContainerAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__6__Impl
+	rule__CollectionTypeDefinition__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getLessThanSignKeyword_6()); }
+	'<'
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getLessThanSignKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__7__Impl
+	rule__CollectionTypeDefinition__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getSupportAssignment_7()); }
+	(rule__CollectionTypeDefinition__SupportAssignment_7)
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getSupportAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__8__Impl
+	rule__CollectionTypeDefinition__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getGroup_8()); }
+	(rule__CollectionTypeDefinition__Group_8__0)?
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getGroup_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__9__Impl
+	rule__CollectionTypeDefinition__Group__10
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getGreaterThanSignKeyword_9()); }
+	'>'
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getGreaterThanSignKeyword_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group__10__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group__10__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getSemicolonKeyword_10()); }
+	';'
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getSemicolonKeyword_10()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CollectionTypeDefinition__Group_8__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group_8__0__Impl
+	rule__CollectionTypeDefinition__Group_8__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group_8__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getCommaKeyword_8_0()); }
+	','
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getCommaKeyword_8_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group_8__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinition__Group_8__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__Group_8__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionAccess().getAlternatives_8_1()); }
+	(rule__CollectionTypeDefinition__Alternatives_8_1)
+	{ after(grammarAccess.getCollectionTypeDefinitionAccess().getAlternatives_8_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CollectionTypeDefinitionImpl__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group__0__Impl
+	rule__CollectionTypeDefinitionImpl__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getCollectionTypeAction_0()); }
+	()
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getCollectionTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group__1__Impl
+	rule__CollectionTypeDefinitionImpl__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameAssignment_1()); }
+	(rule__CollectionTypeDefinitionImpl__NameAssignment_1)
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group__2__Impl
+	rule__CollectionTypeDefinitionImpl__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group__3__Impl
+	rule__CollectionTypeDefinitionImpl__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerAssignment_3()); }
+	(rule__CollectionTypeDefinitionImpl__ContainerAssignment_3)
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group__4__Impl
+	rule__CollectionTypeDefinitionImpl__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getLessThanSignKeyword_4()); }
+	'<'
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getLessThanSignKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group__5__Impl
+	rule__CollectionTypeDefinitionImpl__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportAssignment_5()); }
+	(rule__CollectionTypeDefinitionImpl__SupportAssignment_5)
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group__6__Impl
+	rule__CollectionTypeDefinitionImpl__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup_6()); }
+	(rule__CollectionTypeDefinitionImpl__Group_6__0)?
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group__7__Impl
+	rule__CollectionTypeDefinitionImpl__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getGreaterThanSignKeyword_7()); }
+	'>'
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getGreaterThanSignKeyword_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSemicolonKeyword_8()); }
+	';'
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSemicolonKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CollectionTypeDefinitionImpl__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group_6__0__Impl
+	rule__CollectionTypeDefinitionImpl__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getCommaKeyword_6_0()); }
+	','
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getCommaKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CollectionTypeDefinitionImpl__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getAlternatives_6_1()); }
+	(rule__CollectionTypeDefinitionImpl__Alternatives_6_1)
+	{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getAlternatives_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EnumerationType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationType__Group__0__Impl
+	rule__EnumerationType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeAccess().getEnumerationTypeAction_0()); }
+	()
+	{ after(grammarAccess.getEnumerationTypeAccess().getEnumerationTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationType__Group__1__Impl
+	rule__EnumerationType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeAccess().getEnumKeyword_1()); }
+	'enum'
+	{ after(grammarAccess.getEnumerationTypeAccess().getEnumKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationType__Group__2__Impl
+	rule__EnumerationType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getEnumerationTypeAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationType__Group__3__Impl
+	rule__EnumerationType__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_3()); }
+	(rule__EnumerationType__LiteralAssignment_3)
+	{ after(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationType__Group__4__Impl
+	rule__EnumerationType__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeAccess().getGroup_4()); }
+	(rule__EnumerationType__Group_4__0)*
+	{ after(grammarAccess.getEnumerationTypeAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationType__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeAccess().getRightCurlyBracketKeyword_5()); }
+	'}'
+	{ after(grammarAccess.getEnumerationTypeAccess().getRightCurlyBracketKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EnumerationType__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationType__Group_4__0__Impl
+	rule__EnumerationType__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeAccess().getCommaKeyword_4_0()); }
+	','
+	{ after(grammarAccess.getEnumerationTypeAccess().getCommaKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationType__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_4_1()); }
+	(rule__EnumerationType__LiteralAssignment_4_1)
+	{ after(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EnumerationTypeDefinition__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__0__Impl
+	rule__EnumerationTypeDefinition__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getEnumerationTypeAction_0()); }
+	()
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getEnumerationTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__1__Impl
+	rule__EnumerationTypeDefinition__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityAssignment_1()); }
+	(rule__EnumerationTypeDefinition__VisibilityAssignment_1)?
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__2__Impl
+	rule__EnumerationTypeDefinition__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getTypeKeyword_2()); }
+	'type'
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getTypeKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__3__Impl
+	rule__EnumerationTypeDefinition__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getNameAssignment_3()); }
+	(rule__EnumerationTypeDefinition__NameAssignment_3)
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__4__Impl
+	rule__EnumerationTypeDefinition__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__5__Impl
+	rule__EnumerationTypeDefinition__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefAssignment_5()); }
+	(rule__EnumerationTypeDefinition__TypedefAssignment_5)
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__6__Impl
+	rule__EnumerationTypeDefinition__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); }
+	'{'
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__7__Impl
+	rule__EnumerationTypeDefinition__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_7()); }
+	(rule__EnumerationTypeDefinition__LiteralAssignment_7)
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__8__Impl
+	rule__EnumerationTypeDefinition__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup_8()); }
+	(rule__EnumerationTypeDefinition__Group_8__0)*
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group__9__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getRightCurlyBracketKeyword_9()); }
+	'}'
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getRightCurlyBracketKeyword_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EnumerationTypeDefinition__Group_8__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group_8__0__Impl
+	rule__EnumerationTypeDefinition__Group_8__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group_8__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getCommaKeyword_8_0()); }
+	','
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getCommaKeyword_8_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group_8__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinition__Group_8__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__Group_8__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_8_1()); }
+	(rule__EnumerationTypeDefinition__LiteralAssignment_8_1)
+	{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_8_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EnumerationTypeDefinitionImpl__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group__0__Impl
+	rule__EnumerationTypeDefinitionImpl__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getEnumerationTypeAction_0()); }
+	()
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getEnumerationTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group__1__Impl
+	rule__EnumerationTypeDefinitionImpl__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameAssignment_1()); }
+	(rule__EnumerationTypeDefinitionImpl__NameAssignment_1)
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group__2__Impl
+	rule__EnumerationTypeDefinitionImpl__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group__3__Impl
+	rule__EnumerationTypeDefinitionImpl__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefAssignment_3()); }
+	(rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3)
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group__4__Impl
+	rule__EnumerationTypeDefinitionImpl__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); }
+	'{'
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group__5__Impl
+	rule__EnumerationTypeDefinitionImpl__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_5()); }
+	(rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5)
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group__6__Impl
+	rule__EnumerationTypeDefinitionImpl__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup_6()); }
+	(rule__EnumerationTypeDefinitionImpl__Group_6__0)*
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group__7__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getRightCurlyBracketKeyword_7()); }
+	'}'
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getRightCurlyBracketKeyword_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EnumerationTypeDefinitionImpl__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl
+	rule__EnumerationTypeDefinitionImpl__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getCommaKeyword_6_0()); }
+	','
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getCommaKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_6_1()); }
+	(rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1)
+	{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EnumerationLiteral__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationLiteral__Group__0__Impl
+	rule__EnumerationLiteral__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationLiteralAccess().getNameAssignment_0()); }
+	(rule__EnumerationLiteral__NameAssignment_0)
+	{ after(grammarAccess.getEnumerationLiteralAccess().getNameAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationLiteral__Group__1__Impl
+	rule__EnumerationLiteral__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameAssignment_1()); }
+	(rule__EnumerationLiteral__UnrestrictedNameAssignment_1)?
+	{ after(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationLiteral__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationLiteralAccess().getGroup_2()); }
+	(rule__EnumerationLiteral__Group_2__0)?
+	{ after(grammarAccess.getEnumerationLiteralAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EnumerationLiteral__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationLiteral__Group_2__0__Impl
+	rule__EnumerationLiteral__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationLiteralAccess().getEqualsSignKeyword_2_0()); }
+	'='
+	{ after(grammarAccess.getEnumerationLiteralAccess().getEqualsSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EnumerationLiteral__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEnumerationLiteralAccess().getValueAssignment_2_1()); }
+	(rule__EnumerationLiteral__ValueAssignment_2_1)
+	{ after(grammarAccess.getEnumerationLiteralAccess().getValueAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StructureType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureType__Group__0__Impl
+	rule__StructureType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeAccess().getStructureTypeAction_0()); }
+	()
+	{ after(grammarAccess.getStructureTypeAccess().getStructureTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureType__Group__1__Impl
+	rule__StructureType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeAccess().getStructKeyword_1()); }
+	'struct'
+	{ after(grammarAccess.getStructureTypeAccess().getStructKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureType__Group__2__Impl
+	rule__StructureType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getStructureTypeAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureType__Group__3__Impl
+	rule__StructureType__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStructureTypeAccess().getPropertyAssignment_3()); }
+		(rule__StructureType__PropertyAssignment_3)
+		{ after(grammarAccess.getStructureTypeAccess().getPropertyAssignment_3()); }
+	)
+	(
+		{ before(grammarAccess.getStructureTypeAccess().getPropertyAssignment_3()); }
+		(rule__StructureType__PropertyAssignment_3)*
+		{ after(grammarAccess.getStructureTypeAccess().getPropertyAssignment_3()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureType__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getStructureTypeAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StructureTypeDefinition__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinition__Group__0__Impl
+	rule__StructureTypeDefinition__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionAccess().getStructureTypeAction_0()); }
+	()
+	{ after(grammarAccess.getStructureTypeDefinitionAccess().getStructureTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinition__Group__1__Impl
+	rule__StructureTypeDefinition__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityAssignment_1()); }
+	(rule__StructureTypeDefinition__VisibilityAssignment_1)?
+	{ after(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinition__Group__2__Impl
+	rule__StructureTypeDefinition__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionAccess().getTypeKeyword_2()); }
+	'type'
+	{ after(grammarAccess.getStructureTypeDefinitionAccess().getTypeKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinition__Group__3__Impl
+	rule__StructureTypeDefinition__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionAccess().getNameAssignment_3()); }
+	(rule__StructureTypeDefinition__NameAssignment_3)
+	{ after(grammarAccess.getStructureTypeDefinitionAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinition__Group__4__Impl
+	rule__StructureTypeDefinition__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__StructureTypeDefinition__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinition__Group__5__Impl
+	rule__StructureTypeDefinition__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionAccess().getTypedefAssignment_5()); }
+	(rule__StructureTypeDefinition__TypedefAssignment_5)
+	{ after(grammarAccess.getStructureTypeDefinitionAccess().getTypedefAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinition__Group__6__Impl
+	rule__StructureTypeDefinition__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); }
+	'{'
+	{ after(grammarAccess.getStructureTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinition__Group__7__Impl
+	rule__StructureTypeDefinition__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionAccess().getPropertyAssignment_7()); }
+		(rule__StructureTypeDefinition__PropertyAssignment_7)
+		{ after(grammarAccess.getStructureTypeDefinitionAccess().getPropertyAssignment_7()); }
+	)
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionAccess().getPropertyAssignment_7()); }
+		(rule__StructureTypeDefinition__PropertyAssignment_7)*
+		{ after(grammarAccess.getStructureTypeDefinitionAccess().getPropertyAssignment_7()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinition__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); }
+	'}'
+	{ after(grammarAccess.getStructureTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StructureTypeDefinitionImpl__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinitionImpl__Group__0__Impl
+	rule__StructureTypeDefinitionImpl__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getStructureTypeAction_0()); }
+	()
+	{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getStructureTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinitionImpl__Group__1__Impl
+	rule__StructureTypeDefinitionImpl__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getNameAssignment_1()); }
+	(rule__StructureTypeDefinitionImpl__NameAssignment_1)
+	{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinitionImpl__Group__2__Impl
+	rule__StructureTypeDefinitionImpl__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinitionImpl__Group__3__Impl
+	rule__StructureTypeDefinitionImpl__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefAssignment_3()); }
+	(rule__StructureTypeDefinitionImpl__TypedefAssignment_3)
+	{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinitionImpl__Group__4__Impl
+	rule__StructureTypeDefinitionImpl__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); }
+	'{'
+	{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinitionImpl__Group__5__Impl
+	rule__StructureTypeDefinitionImpl__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+		(rule__StructureTypeDefinitionImpl__PropertyAssignment_5)
+		{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+	)
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+		(rule__StructureTypeDefinitionImpl__PropertyAssignment_5)*
+		{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StructureTypeDefinitionImpl__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); }
+	'}'
+	{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__UnionType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionType__Group__0__Impl
+	rule__UnionType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeAccess().getUnionTypeAction_0()); }
+	()
+	{ after(grammarAccess.getUnionTypeAccess().getUnionTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionType__Group__1__Impl
+	rule__UnionType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeAccess().getUnionKeyword_1()); }
+	'union'
+	{ after(grammarAccess.getUnionTypeAccess().getUnionKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionType__Group__2__Impl
+	rule__UnionType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getUnionTypeAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionType__Group__3__Impl
+	rule__UnionType__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getUnionTypeAccess().getPropertyAssignment_3()); }
+		(rule__UnionType__PropertyAssignment_3)
+		{ after(grammarAccess.getUnionTypeAccess().getPropertyAssignment_3()); }
+	)
+	(
+		{ before(grammarAccess.getUnionTypeAccess().getPropertyAssignment_3()); }
+		(rule__UnionType__PropertyAssignment_3)*
+		{ after(grammarAccess.getUnionTypeAccess().getPropertyAssignment_3()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionType__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getUnionTypeAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__UnionTypeDefinition__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinition__Group__0__Impl
+	rule__UnionTypeDefinition__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionAccess().getUnionTypeAction_0()); }
+	()
+	{ after(grammarAccess.getUnionTypeDefinitionAccess().getUnionTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinition__Group__1__Impl
+	rule__UnionTypeDefinition__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityAssignment_1()); }
+	(rule__UnionTypeDefinition__VisibilityAssignment_1)?
+	{ after(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinition__Group__2__Impl
+	rule__UnionTypeDefinition__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionAccess().getTypeKeyword_2()); }
+	'type'
+	{ after(grammarAccess.getUnionTypeDefinitionAccess().getTypeKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinition__Group__3__Impl
+	rule__UnionTypeDefinition__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionAccess().getNameAssignment_3()); }
+	(rule__UnionTypeDefinition__NameAssignment_3)
+	{ after(grammarAccess.getUnionTypeDefinitionAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinition__Group__4__Impl
+	rule__UnionTypeDefinition__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__UnionTypeDefinition__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinition__Group__5__Impl
+	rule__UnionTypeDefinition__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionAccess().getTypedefAssignment_5()); }
+	(rule__UnionTypeDefinition__TypedefAssignment_5)
+	{ after(grammarAccess.getUnionTypeDefinitionAccess().getTypedefAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinition__Group__6__Impl
+	rule__UnionTypeDefinition__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); }
+	'{'
+	{ after(grammarAccess.getUnionTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinition__Group__7__Impl
+	rule__UnionTypeDefinition__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionAccess().getPropertyAssignment_7()); }
+		(rule__UnionTypeDefinition__PropertyAssignment_7)
+		{ after(grammarAccess.getUnionTypeDefinitionAccess().getPropertyAssignment_7()); }
+	)
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionAccess().getPropertyAssignment_7()); }
+		(rule__UnionTypeDefinition__PropertyAssignment_7)*
+		{ after(grammarAccess.getUnionTypeDefinitionAccess().getPropertyAssignment_7()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinition__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); }
+	'}'
+	{ after(grammarAccess.getUnionTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__UnionTypeDefinitionImpl__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinitionImpl__Group__0__Impl
+	rule__UnionTypeDefinitionImpl__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getUnionTypeAction_0()); }
+	()
+	{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getUnionTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinitionImpl__Group__1__Impl
+	rule__UnionTypeDefinitionImpl__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getNameAssignment_1()); }
+	(rule__UnionTypeDefinitionImpl__NameAssignment_1)
+	{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinitionImpl__Group__2__Impl
+	rule__UnionTypeDefinitionImpl__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinitionImpl__Group__3__Impl
+	rule__UnionTypeDefinitionImpl__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefAssignment_3()); }
+	(rule__UnionTypeDefinitionImpl__TypedefAssignment_3)
+	{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinitionImpl__Group__4__Impl
+	rule__UnionTypeDefinitionImpl__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); }
+	'{'
+	{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinitionImpl__Group__5__Impl
+	rule__UnionTypeDefinitionImpl__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+		(rule__UnionTypeDefinitionImpl__PropertyAssignment_5)
+		{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+	)
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+		(rule__UnionTypeDefinitionImpl__PropertyAssignment_5)*
+		{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__UnionTypeDefinitionImpl__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); }
+	'}'
+	{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ChoiceType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceType__Group__0__Impl
+	rule__ChoiceType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeAccess().getChoiceTypeAction_0()); }
+	()
+	{ after(grammarAccess.getChoiceTypeAccess().getChoiceTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceType__Group__1__Impl
+	rule__ChoiceType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeAccess().getChoiceKeyword_1()); }
+	'choice'
+	{ after(grammarAccess.getChoiceTypeAccess().getChoiceKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceType__Group__2__Impl
+	rule__ChoiceType__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getChoiceTypeAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceType__Group__3__Impl
+	rule__ChoiceType__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getChoiceTypeAccess().getPropertyAssignment_3()); }
+		(rule__ChoiceType__PropertyAssignment_3)
+		{ after(grammarAccess.getChoiceTypeAccess().getPropertyAssignment_3()); }
+	)
+	(
+		{ before(grammarAccess.getChoiceTypeAccess().getPropertyAssignment_3()); }
+		(rule__ChoiceType__PropertyAssignment_3)*
+		{ after(grammarAccess.getChoiceTypeAccess().getPropertyAssignment_3()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceType__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getChoiceTypeAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ChoiceTypeDefinition__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinition__Group__0__Impl
+	rule__ChoiceTypeDefinition__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionAccess().getChoiceTypeAction_0()); }
+	()
+	{ after(grammarAccess.getChoiceTypeDefinitionAccess().getChoiceTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinition__Group__1__Impl
+	rule__ChoiceTypeDefinition__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityAssignment_1()); }
+	(rule__ChoiceTypeDefinition__VisibilityAssignment_1)?
+	{ after(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinition__Group__2__Impl
+	rule__ChoiceTypeDefinition__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionAccess().getTypeKeyword_2()); }
+	'type'
+	{ after(grammarAccess.getChoiceTypeDefinitionAccess().getTypeKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinition__Group__3__Impl
+	rule__ChoiceTypeDefinition__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionAccess().getNameAssignment_3()); }
+	(rule__ChoiceTypeDefinition__NameAssignment_3)
+	{ after(grammarAccess.getChoiceTypeDefinitionAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinition__Group__4__Impl
+	rule__ChoiceTypeDefinition__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinition__Group__5__Impl
+	rule__ChoiceTypeDefinition__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefAssignment_5()); }
+	(rule__ChoiceTypeDefinition__TypedefAssignment_5)
+	{ after(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinition__Group__6__Impl
+	rule__ChoiceTypeDefinition__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); }
+	'{'
+	{ after(grammarAccess.getChoiceTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinition__Group__7__Impl
+	rule__ChoiceTypeDefinition__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyAssignment_7()); }
+		(rule__ChoiceTypeDefinition__PropertyAssignment_7)
+		{ after(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyAssignment_7()); }
+	)
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyAssignment_7()); }
+		(rule__ChoiceTypeDefinition__PropertyAssignment_7)*
+		{ after(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyAssignment_7()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinition__Group__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); }
+	'}'
+	{ after(grammarAccess.getChoiceTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ChoiceTypeDefinitionImpl__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinitionImpl__Group__0__Impl
+	rule__ChoiceTypeDefinitionImpl__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getChoiceTypeAction_0()); }
+	()
+	{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getChoiceTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinitionImpl__Group__1__Impl
+	rule__ChoiceTypeDefinitionImpl__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameAssignment_1()); }
+	(rule__ChoiceTypeDefinitionImpl__NameAssignment_1)
+	{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinitionImpl__Group__2__Impl
+	rule__ChoiceTypeDefinitionImpl__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinitionImpl__Group__3__Impl
+	rule__ChoiceTypeDefinitionImpl__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefAssignment_3()); }
+	(rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3)
+	{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinitionImpl__Group__4__Impl
+	rule__ChoiceTypeDefinitionImpl__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); }
+	'{'
+	{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinitionImpl__Group__5__Impl
+	rule__ChoiceTypeDefinitionImpl__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+		(rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5)
+		{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+	)
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+		(rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5)*
+		{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyAssignment_5()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChoiceTypeDefinitionImpl__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); }
+	'}'
+	{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Modifier__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Modifier__Group__0__Impl
+	rule__Modifier__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModifierAccess().getModifierAction_0()); }
+	()
+	{ after(grammarAccess.getModifierAccess().getModifierAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Modifier__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getModifierAccess().getUnorderedGroup_1()); }
+	(rule__Modifier__UnorderedGroup_1)
+	{ after(grammarAccess.getModifierAccess().getUnorderedGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Variable__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group__0__Impl
+	rule__Variable__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getUnorderedGroup_0()); }
+	(rule__Variable__UnorderedGroup_0)
+	{ after(grammarAccess.getVariableAccess().getUnorderedGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group__1__Impl
+	rule__Variable__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getAlternatives_1()); }
+	(rule__Variable__Alternatives_1)
+	{ after(grammarAccess.getVariableAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group__2__Impl
+	rule__Variable__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getTypeAssignment_2()); }
+	(rule__Variable__TypeAssignment_2)
+	{ after(grammarAccess.getVariableAccess().getTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group__3__Impl
+	rule__Variable__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getNameAssignment_3()); }
+	(rule__Variable__NameAssignment_3)
+	{ after(grammarAccess.getVariableAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group__4__Impl
+	rule__Variable__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__Variable__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getVariableAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group__5__Impl
+	rule__Variable__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getGroup_5()); }
+	(rule__Variable__Group_5__0)?
+	{ after(grammarAccess.getVariableAccess().getGroup_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getAlternatives_6()); }
+	(rule__Variable__Alternatives_6)
+	{ after(grammarAccess.getVariableAccess().getAlternatives_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Variable__Group_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_1_2__0__Impl
+	rule__Variable__Group_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getAlternatives_1_2_0()); }
+	(rule__Variable__Alternatives_1_2_0)
+	{ after(grammarAccess.getVariableAccess().getAlternatives_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_1_2__1__Impl
+	rule__Variable__Group_1_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getMacroAssignment_1_2_1()); }
+	(rule__Variable__MacroAssignment_1_2_1)?
+	{ after(grammarAccess.getVariableAccess().getMacroAssignment_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_1_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_1_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_1_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getVarKeyword_1_2_2()); }
+	('var')?
+	{ after(grammarAccess.getVariableAccess().getVarKeyword_1_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Variable__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_1_3__0__Impl
+	rule__Variable__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getMacroAssignment_1_3_0()); }
+	(rule__Variable__MacroAssignment_1_3_0)
+	{ after(grammarAccess.getVariableAccess().getMacroAssignment_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getAlternatives_1_3_1()); }
+	(rule__Variable__Alternatives_1_3_1)?
+	{ after(grammarAccess.getVariableAccess().getAlternatives_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Variable__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_5__0__Impl
+	rule__Variable__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getEqualsSignKeyword_5_0()); }
+	'='
+	{ after(grammarAccess.getVariableAccess().getEqualsSignKeyword_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_5__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getDefaultValueAssignment_5_1()); }
+	(rule__Variable__DefaultValueAssignment_5_1)
+	{ after(grammarAccess.getVariableAccess().getDefaultValueAssignment_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Variable__Group_6_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_6_0__0__Impl
+	rule__Variable__Group_6_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_6_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getLeftCurlyBracketKeyword_6_0_0()); }
+	'{'
+	{ after(grammarAccess.getVariableAccess().getLeftCurlyBracketKeyword_6_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_6_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_6_0__1__Impl
+	rule__Variable__Group_6_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_6_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getOnWriteActionAssignment_6_0_1()); }
+	(rule__Variable__OnWriteActionAssignment_6_0_1)
+	{ after(grammarAccess.getVariableAccess().getOnWriteActionAssignment_6_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_6_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__Group_6_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__Group_6_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableAccess().getRightCurlyBracketKeyword_6_0_2()); }
+	'}'
+	{ after(grammarAccess.getVariableAccess().getRightCurlyBracketKeyword_6_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OnWriteRoutine__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OnWriteRoutine__Group__0__Impl
+	rule__OnWriteRoutine__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOnWriteRoutineAccess().getRoutineAction_0()); }
+	()
+	{ after(grammarAccess.getOnWriteRoutineAccess().getRoutineAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OnWriteRoutine__Group__1__Impl
+	rule__OnWriteRoutine__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOnWriteRoutineAccess().getOn_writeKeyword_1()); }
+	'@on_write'
+	{ after(grammarAccess.getOnWriteRoutineAccess().getOn_writeKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OnWriteRoutine__Group__2__Impl
+	rule__OnWriteRoutine__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOnWriteRoutineAccess().getGroup_2()); }
+	(rule__OnWriteRoutine__Group_2__0)?
+	{ after(grammarAccess.getOnWriteRoutineAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OnWriteRoutine__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOnWriteRoutineAccess().getBodyBlockAssignment_3()); }
+	(rule__OnWriteRoutine__BodyBlockAssignment_3)
+	{ after(grammarAccess.getOnWriteRoutineAccess().getBodyBlockAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OnWriteRoutine__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OnWriteRoutine__Group_2__0__Impl
+	rule__OnWriteRoutine__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOnWriteRoutineAccess().getLeftParenthesisKeyword_2_0()); }
+	'('
+	{ after(grammarAccess.getOnWriteRoutineAccess().getLeftParenthesisKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OnWriteRoutine__Group_2__1__Impl
+	rule__OnWriteRoutine__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOnWriteRoutineAccess().getParameterAssignment_2_1()); }
+	(rule__OnWriteRoutine__ParameterAssignment_2_1)
+	{ after(grammarAccess.getOnWriteRoutineAccess().getParameterAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OnWriteRoutine__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOnWriteRoutineAccess().getRightParenthesisKeyword_2_2()); }
+	')'
+	{ after(grammarAccess.getOnWriteRoutineAccess().getRightParenthesisKeyword_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariableRoutineParameter__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableRoutineParameter__Group__0__Impl
+	rule__VariableRoutineParameter__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableRoutineParameterAccess().getTypeAssignment_0()); }
+	(rule__VariableRoutineParameter__TypeAssignment_0)?
+	{ after(grammarAccess.getVariableRoutineParameterAccess().getTypeAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableRoutineParameter__Group__1__Impl
+	rule__VariableRoutineParameter__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableRoutineParameterAccess().getNameAssignment_1()); }
+	(rule__VariableRoutineParameter__NameAssignment_1)
+	{ after(grammarAccess.getVariableRoutineParameterAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableRoutineParameter__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableRoutineParameterAccess().getGroup_2()); }
+	(rule__VariableRoutineParameter__Group_2__0)?
+	{ after(grammarAccess.getVariableRoutineParameterAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariableRoutineParameter__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableRoutineParameter__Group_2__0__Impl
+	rule__VariableRoutineParameter__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableRoutineParameterAccess().getEqualsSignKeyword_2_0()); }
+	'='
+	{ after(grammarAccess.getVariableRoutineParameterAccess().getEqualsSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableRoutineParameter__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueAssignment_2_1()); }
+	(rule__VariableRoutineParameter__DefaultValueAssignment_2_1)
+	{ after(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariablePublic__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group__0__Impl
+	rule__VariablePublic__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getModifierAssignment_0()); }
+	(rule__VariablePublic__ModifierAssignment_0)?
+	{ after(grammarAccess.getVariablePublicAccess().getModifierAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group__1__Impl
+	rule__VariablePublic__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1()); }
+	(rule__VariablePublic__UnorderedGroup_1)?
+	{ after(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group__2__Impl
+	rule__VariablePublic__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getVisibilityAssignment_2()); }
+	(rule__VariablePublic__VisibilityAssignment_2)
+	{ after(grammarAccess.getVariablePublicAccess().getVisibilityAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group__3__Impl
+	rule__VariablePublic__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getTypeAssignment_3()); }
+	(rule__VariablePublic__TypeAssignment_3)
+	{ after(grammarAccess.getVariablePublicAccess().getTypeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group__4__Impl
+	rule__VariablePublic__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getNameAssignment_4()); }
+	(rule__VariablePublic__NameAssignment_4)
+	{ after(grammarAccess.getVariablePublicAccess().getNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group__5__Impl
+	rule__VariablePublic__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getUnrestrictedNameAssignment_5()); }
+	(rule__VariablePublic__UnrestrictedNameAssignment_5)?
+	{ after(grammarAccess.getVariablePublicAccess().getUnrestrictedNameAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group__6__Impl
+	rule__VariablePublic__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getGroup_6()); }
+	(rule__VariablePublic__Group_6__0)?
+	{ after(grammarAccess.getVariablePublicAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group__7__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getAlternatives_7()); }
+	(rule__VariablePublic__Alternatives_7)
+	{ after(grammarAccess.getVariablePublicAccess().getAlternatives_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariablePublic__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group_6__0__Impl
+	rule__VariablePublic__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getEqualsSignKeyword_6_0()); }
+	'='
+	{ after(grammarAccess.getVariablePublicAccess().getEqualsSignKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getDefaultValueAssignment_6_1()); }
+	(rule__VariablePublic__DefaultValueAssignment_6_1)
+	{ after(grammarAccess.getVariablePublicAccess().getDefaultValueAssignment_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariablePublic__Group_7_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group_7_0__0__Impl
+	rule__VariablePublic__Group_7_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group_7_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getLeftCurlyBracketKeyword_7_0_0()); }
+	'{'
+	{ after(grammarAccess.getVariablePublicAccess().getLeftCurlyBracketKeyword_7_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group_7_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group_7_0__1__Impl
+	rule__VariablePublic__Group_7_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group_7_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getOnWriteActionAssignment_7_0_1()); }
+	(rule__VariablePublic__OnWriteActionAssignment_7_0_1)
+	{ after(grammarAccess.getVariablePublicAccess().getOnWriteActionAssignment_7_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group_7_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__Group_7_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__Group_7_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePublicAccess().getRightCurlyBracketKeyword_7_0_2()); }
+	'}'
+	{ after(grammarAccess.getVariablePublicAccess().getRightCurlyBracketKeyword_7_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariableProtected__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group__0__Impl
+	rule__VariableProtected__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getModifierAssignment_0()); }
+	(rule__VariableProtected__ModifierAssignment_0)?
+	{ after(grammarAccess.getVariableProtectedAccess().getModifierAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group__1__Impl
+	rule__VariableProtected__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1()); }
+	(rule__VariableProtected__UnorderedGroup_1)?
+	{ after(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group__2__Impl
+	rule__VariableProtected__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getVisibilityAssignment_2()); }
+	(rule__VariableProtected__VisibilityAssignment_2)
+	{ after(grammarAccess.getVariableProtectedAccess().getVisibilityAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group__3__Impl
+	rule__VariableProtected__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getTypeAssignment_3()); }
+	(rule__VariableProtected__TypeAssignment_3)
+	{ after(grammarAccess.getVariableProtectedAccess().getTypeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group__4__Impl
+	rule__VariableProtected__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getNameAssignment_4()); }
+	(rule__VariableProtected__NameAssignment_4)
+	{ after(grammarAccess.getVariableProtectedAccess().getNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group__5__Impl
+	rule__VariableProtected__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameAssignment_5()); }
+	(rule__VariableProtected__UnrestrictedNameAssignment_5)?
+	{ after(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group__6__Impl
+	rule__VariableProtected__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getGroup_6()); }
+	(rule__VariableProtected__Group_6__0)?
+	{ after(grammarAccess.getVariableProtectedAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group__7__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getAlternatives_7()); }
+	(rule__VariableProtected__Alternatives_7)
+	{ after(grammarAccess.getVariableProtectedAccess().getAlternatives_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariableProtected__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group_6__0__Impl
+	rule__VariableProtected__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getEqualsSignKeyword_6_0()); }
+	'='
+	{ after(grammarAccess.getVariableProtectedAccess().getEqualsSignKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getDefaultValueAssignment_6_1()); }
+	(rule__VariableProtected__DefaultValueAssignment_6_1)
+	{ after(grammarAccess.getVariableProtectedAccess().getDefaultValueAssignment_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariableProtected__Group_7_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group_7_0__0__Impl
+	rule__VariableProtected__Group_7_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group_7_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getLeftCurlyBracketKeyword_7_0_0()); }
+	'{'
+	{ after(grammarAccess.getVariableProtectedAccess().getLeftCurlyBracketKeyword_7_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group_7_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group_7_0__1__Impl
+	rule__VariableProtected__Group_7_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group_7_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getOnWriteActionAssignment_7_0_1()); }
+	(rule__VariableProtected__OnWriteActionAssignment_7_0_1)
+	{ after(grammarAccess.getVariableProtectedAccess().getOnWriteActionAssignment_7_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group_7_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__Group_7_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__Group_7_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariableProtectedAccess().getRightCurlyBracketKeyword_7_0_2()); }
+	'}'
+	{ after(grammarAccess.getVariableProtectedAccess().getRightCurlyBracketKeyword_7_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariablePrivate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group__0__Impl
+	rule__VariablePrivate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getModifierAssignment_0()); }
+	(rule__VariablePrivate__ModifierAssignment_0)?
+	{ after(grammarAccess.getVariablePrivateAccess().getModifierAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group__1__Impl
+	rule__VariablePrivate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1()); }
+	(rule__VariablePrivate__UnorderedGroup_1)?
+	{ after(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group__2__Impl
+	rule__VariablePrivate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getVisibilityAssignment_2()); }
+	(rule__VariablePrivate__VisibilityAssignment_2)
+	{ after(grammarAccess.getVariablePrivateAccess().getVisibilityAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group__3__Impl
+	rule__VariablePrivate__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getTypeAssignment_3()); }
+	(rule__VariablePrivate__TypeAssignment_3)
+	{ after(grammarAccess.getVariablePrivateAccess().getTypeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group__4__Impl
+	rule__VariablePrivate__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getNameAssignment_4()); }
+	(rule__VariablePrivate__NameAssignment_4)
+	{ after(grammarAccess.getVariablePrivateAccess().getNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group__5__Impl
+	rule__VariablePrivate__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameAssignment_5()); }
+	(rule__VariablePrivate__UnrestrictedNameAssignment_5)?
+	{ after(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group__6__Impl
+	rule__VariablePrivate__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getGroup_6()); }
+	(rule__VariablePrivate__Group_6__0)?
+	{ after(grammarAccess.getVariablePrivateAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group__7__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getAlternatives_7()); }
+	(rule__VariablePrivate__Alternatives_7)
+	{ after(grammarAccess.getVariablePrivateAccess().getAlternatives_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariablePrivate__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group_6__0__Impl
+	rule__VariablePrivate__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getEqualsSignKeyword_6_0()); }
+	'='
+	{ after(grammarAccess.getVariablePrivateAccess().getEqualsSignKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group_6__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getDefaultValueAssignment_6_1()); }
+	(rule__VariablePrivate__DefaultValueAssignment_6_1)
+	{ after(grammarAccess.getVariablePrivateAccess().getDefaultValueAssignment_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariablePrivate__Group_7_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group_7_0__0__Impl
+	rule__VariablePrivate__Group_7_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group_7_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getLeftCurlyBracketKeyword_7_0_0()); }
+	'{'
+	{ after(grammarAccess.getVariablePrivateAccess().getLeftCurlyBracketKeyword_7_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group_7_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group_7_0__1__Impl
+	rule__VariablePrivate__Group_7_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group_7_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getOnWriteActionAssignment_7_0_1()); }
+	(rule__VariablePrivate__OnWriteActionAssignment_7_0_1)
+	{ after(grammarAccess.getVariablePrivateAccess().getOnWriteActionAssignment_7_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group_7_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__Group_7_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__Group_7_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getVariablePrivateAccess().getRightCurlyBracketKeyword_7_0_2()); }
+	'}'
+	{ after(grammarAccess.getVariablePrivateAccess().getRightCurlyBracketKeyword_7_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FunctionalParameterSet__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameterSet__Group__0__Impl
+	rule__FunctionalParameterSet__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterSetAccess().getParameterSetAction_0()); }
+	()
+	{ after(grammarAccess.getFunctionalParameterSetAccess().getParameterSetAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameterSet__Group__1__Impl
+	rule__FunctionalParameterSet__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_1()); }
+	(rule__FunctionalParameterSet__ParameterAssignment_1)
+	{ after(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameterSet__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterSetAccess().getGroup_2()); }
+	(rule__FunctionalParameterSet__Group_2__0)*
+	{ after(grammarAccess.getFunctionalParameterSetAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FunctionalParameterSet__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameterSet__Group_2__0__Impl
+	rule__FunctionalParameterSet__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterSetAccess().getCommaKeyword_2_0()); }
+	','
+	{ after(grammarAccess.getFunctionalParameterSetAccess().getCommaKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameterSet__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_2_1()); }
+	(rule__FunctionalParameterSet__ParameterAssignment_2_1)
+	{ after(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FunctionalParameter__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameter__Group__0__Impl
+	rule__FunctionalParameter__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterAccess().getParameterAction_0()); }
+	()
+	{ after(grammarAccess.getFunctionalParameterAccess().getParameterAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameter__Group__1__Impl
+	rule__FunctionalParameter__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterAccess().getDirectionAssignment_1()); }
+	(rule__FunctionalParameter__DirectionAssignment_1)?
+	{ after(grammarAccess.getFunctionalParameterAccess().getDirectionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameter__Group__2__Impl
+	rule__FunctionalParameter__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterAccess().getTypeAssignment_2()); }
+	(rule__FunctionalParameter__TypeAssignment_2)
+	{ after(grammarAccess.getFunctionalParameterAccess().getTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameter__Group__3__Impl
+	rule__FunctionalParameter__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterAccess().getNameAssignment_3()); }
+	(rule__FunctionalParameter__NameAssignment_3)
+	{ after(grammarAccess.getFunctionalParameterAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameter__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterAccess().getGroup_4()); }
+	(rule__FunctionalParameter__Group_4__0)?
+	{ after(grammarAccess.getFunctionalParameterAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FunctionalParameter__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameter__Group_4__0__Impl
+	rule__FunctionalParameter__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterAccess().getEqualsSignKeyword_4_0()); }
+	'='
+	{ after(grammarAccess.getFunctionalParameterAccess().getEqualsSignKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FunctionalParameter__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFunctionalParameterAccess().getDefaultValueAssignment_4_1()); }
+	(rule__FunctionalParameter__DefaultValueAssignment_4_1)
+	{ after(grammarAccess.getFunctionalParameterAccess().getDefaultValueAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FormalParameterSet__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameterSet__Group__0__Impl
+	rule__FormalParameterSet__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterSetAccess().getParameterSetAction_0()); }
+	()
+	{ after(grammarAccess.getFormalParameterSetAccess().getParameterSetAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameterSet__Group__1__Impl
+	rule__FormalParameterSet__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_1()); }
+	(rule__FormalParameterSet__ParameterAssignment_1)
+	{ after(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameterSet__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterSetAccess().getGroup_2()); }
+	(rule__FormalParameterSet__Group_2__0)*
+	{ after(grammarAccess.getFormalParameterSetAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FormalParameterSet__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameterSet__Group_2__0__Impl
+	rule__FormalParameterSet__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterSetAccess().getCommaKeyword_2_0()); }
+	','
+	{ after(grammarAccess.getFormalParameterSetAccess().getCommaKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameterSet__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_2_1()); }
+	(rule__FormalParameterSet__ParameterAssignment_2_1)
+	{ after(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FormalParameter__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameter__Group__0__Impl
+	rule__FormalParameter__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterAccess().getParameterAction_0()); }
+	()
+	{ after(grammarAccess.getFormalParameterAccess().getParameterAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameter__Group__1__Impl
+	rule__FormalParameter__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterAccess().getDirectionAssignment_1()); }
+	(rule__FormalParameter__DirectionAssignment_1)?
+	{ after(grammarAccess.getFormalParameterAccess().getDirectionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameter__Group__2__Impl
+	rule__FormalParameter__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterAccess().getTypeAssignment_2()); }
+	(rule__FormalParameter__TypeAssignment_2)
+	{ after(grammarAccess.getFormalParameterAccess().getTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameter__Group__3__Impl
+	rule__FormalParameter__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterAccess().getNameAssignment_3()); }
+	(rule__FormalParameter__NameAssignment_3)?
+	{ after(grammarAccess.getFormalParameterAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameter__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterAccess().getGroup_4()); }
+	(rule__FormalParameter__Group_4__0)?
+	{ after(grammarAccess.getFormalParameterAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__FormalParameter__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameter__Group_4__0__Impl
+	rule__FormalParameter__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterAccess().getEqualsSignKeyword_4_0()); }
+	'='
+	{ after(grammarAccess.getFormalParameterAccess().getEqualsSignKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__FormalParameter__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getFormalParameterAccess().getDefaultValueAssignment_4_1()); }
+	(rule__FormalParameter__DefaultValueAssignment_4_1)
+	{ after(grammarAccess.getFormalParameterAccess().getDefaultValueAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ParameterInput__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInput__Group__0__Impl
+	rule__ParameterInput__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInputAccess().getDirectionAssignment_0()); }
+	(rule__ParameterInput__DirectionAssignment_0)
+	{ after(grammarAccess.getParameterInputAccess().getDirectionAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInput__Group__1__Impl
+	rule__ParameterInput__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInputAccess().getTypeAssignment_1()); }
+	(rule__ParameterInput__TypeAssignment_1)
+	{ after(grammarAccess.getParameterInputAccess().getTypeAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInput__Group__2__Impl
+	rule__ParameterInput__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInputAccess().getNameAssignment_2()); }
+	(rule__ParameterInput__NameAssignment_2)
+	{ after(grammarAccess.getParameterInputAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInput__Group__3__Impl
+	rule__ParameterInput__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInputAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__ParameterInput__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getParameterInputAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInput__Group__4__Impl
+	rule__ParameterInput__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInputAccess().getGroup_4()); }
+	(rule__ParameterInput__Group_4__0)?
+	{ after(grammarAccess.getParameterInputAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInput__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInputAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getParameterInputAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ParameterInput__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInput__Group_4__0__Impl
+	rule__ParameterInput__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInputAccess().getEqualsSignKeyword_4_0()); }
+	'='
+	{ after(grammarAccess.getParameterInputAccess().getEqualsSignKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInput__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInputAccess().getDefaultValueAssignment_4_1()); }
+	(rule__ParameterInput__DefaultValueAssignment_4_1)
+	{ after(grammarAccess.getParameterInputAccess().getDefaultValueAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ParameterInout__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInout__Group__0__Impl
+	rule__ParameterInout__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInoutAccess().getDirectionAssignment_0()); }
+	(rule__ParameterInout__DirectionAssignment_0)
+	{ after(grammarAccess.getParameterInoutAccess().getDirectionAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInout__Group__1__Impl
+	rule__ParameterInout__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInoutAccess().getTypeAssignment_1()); }
+	(rule__ParameterInout__TypeAssignment_1)
+	{ after(grammarAccess.getParameterInoutAccess().getTypeAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInout__Group__2__Impl
+	rule__ParameterInout__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInoutAccess().getNameAssignment_2()); }
+	(rule__ParameterInout__NameAssignment_2)
+	{ after(grammarAccess.getParameterInoutAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInout__Group__3__Impl
+	rule__ParameterInout__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInoutAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__ParameterInout__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getParameterInoutAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInout__Group__4__Impl
+	rule__ParameterInout__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInoutAccess().getGroup_4()); }
+	(rule__ParameterInout__Group_4__0)?
+	{ after(grammarAccess.getParameterInoutAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInout__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInoutAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getParameterInoutAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ParameterInout__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInout__Group_4__0__Impl
+	rule__ParameterInout__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInoutAccess().getEqualsSignKeyword_4_0()); }
+	'='
+	{ after(grammarAccess.getParameterInoutAccess().getEqualsSignKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterInout__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterInoutAccess().getDefaultValueAssignment_4_1()); }
+	(rule__ParameterInout__DefaultValueAssignment_4_1)
+	{ after(grammarAccess.getParameterInoutAccess().getDefaultValueAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ParameterOutput__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterOutput__Group__0__Impl
+	rule__ParameterOutput__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterOutputAccess().getDirectionAssignment_0()); }
+	(rule__ParameterOutput__DirectionAssignment_0)
+	{ after(grammarAccess.getParameterOutputAccess().getDirectionAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterOutput__Group__1__Impl
+	rule__ParameterOutput__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterOutputAccess().getTypeAssignment_1()); }
+	(rule__ParameterOutput__TypeAssignment_1)
+	{ after(grammarAccess.getParameterOutputAccess().getTypeAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterOutput__Group__2__Impl
+	rule__ParameterOutput__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterOutputAccess().getNameAssignment_2()); }
+	(rule__ParameterOutput__NameAssignment_2)
+	{ after(grammarAccess.getParameterOutputAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterOutput__Group__3__Impl
+	rule__ParameterOutput__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterOutputAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__ParameterOutput__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getParameterOutputAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterOutput__Group__4__Impl
+	rule__ParameterOutput__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterOutputAccess().getGroup_4()); }
+	(rule__ParameterOutput__Group_4__0)?
+	{ after(grammarAccess.getParameterOutputAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterOutput__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterOutputAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getParameterOutputAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ParameterOutput__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterOutput__Group_4__0__Impl
+	rule__ParameterOutput__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterOutputAccess().getEqualsSignKeyword_4_0()); }
+	'='
+	{ after(grammarAccess.getParameterOutputAccess().getEqualsSignKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterOutput__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterOutputAccess().getDefaultValueAssignment_4_1()); }
+	(rule__ParameterOutput__DefaultValueAssignment_4_1)
+	{ after(grammarAccess.getParameterOutputAccess().getDefaultValueAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ParameterReturn__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterReturn__Group__0__Impl
+	rule__ParameterReturn__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterReturnAccess().getDirectionAssignment_0()); }
+	(rule__ParameterReturn__DirectionAssignment_0)
+	{ after(grammarAccess.getParameterReturnAccess().getDirectionAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterReturn__Group__1__Impl
+	rule__ParameterReturn__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterReturnAccess().getTypeAssignment_1()); }
+	(rule__ParameterReturn__TypeAssignment_1)
+	{ after(grammarAccess.getParameterReturnAccess().getTypeAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterReturn__Group__2__Impl
+	rule__ParameterReturn__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterReturnAccess().getNameAssignment_2()); }
+	(rule__ParameterReturn__NameAssignment_2)
+	{ after(grammarAccess.getParameterReturnAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterReturn__Group__3__Impl
+	rule__ParameterReturn__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterReturnAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__ParameterReturn__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getParameterReturnAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterReturn__Group__4__Impl
+	rule__ParameterReturn__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterReturnAccess().getGroup_4()); }
+	(rule__ParameterReturn__Group_4__0)?
+	{ after(grammarAccess.getParameterReturnAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterReturn__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterReturnAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getParameterReturnAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ParameterReturn__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterReturn__Group_4__0__Impl
+	rule__ParameterReturn__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterReturnAccess().getEqualsSignKeyword_4_0()); }
+	'='
+	{ after(grammarAccess.getParameterReturnAccess().getEqualsSignKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ParameterReturn__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getParameterReturnAccess().getDefaultValueAssignment_4_1()); }
+	(rule__ParameterReturn__DefaultValueAssignment_4_1)
+	{ after(grammarAccess.getParameterReturnAccess().getDefaultValueAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BufferContainerType__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferContainerType__Group__0__Impl
+	rule__BufferContainerType__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferContainerTypeAccess().getCollectionTypeAction_0()); }
+	()
+	{ after(grammarAccess.getBufferContainerTypeAccess().getCollectionTypeAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferContainerType__Group__1__Impl
+	rule__BufferContainerType__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferContainerTypeAccess().getContainerAssignment_1()); }
+	(rule__BufferContainerType__ContainerAssignment_1)
+	{ after(grammarAccess.getBufferContainerTypeAccess().getContainerAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferContainerType__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferContainerTypeAccess().getGroup_2()); }
+	(rule__BufferContainerType__Group_2__0)?
+	{ after(grammarAccess.getBufferContainerTypeAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BufferContainerType__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferContainerType__Group_2__0__Impl
+	rule__BufferContainerType__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferContainerTypeAccess().getLessThanSignKeyword_2_0()); }
+	'<'
+	{ after(grammarAccess.getBufferContainerTypeAccess().getLessThanSignKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferContainerType__Group_2__1__Impl
+	rule__BufferContainerType__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferContainerTypeAccess().getAlternatives_2_1()); }
+	(rule__BufferContainerType__Alternatives_2_1)?
+	{ after(grammarAccess.getBufferContainerTypeAccess().getAlternatives_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferContainerType__Group_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferContainerTypeAccess().getGreaterThanSignKeyword_2_2()); }
+	'>'
+	{ after(grammarAccess.getBufferContainerTypeAccess().getGreaterThanSignKeyword_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Buffer__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Buffer__Group__0__Impl
+	rule__Buffer__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferAccess().getUnorderedGroup_0()); }
+	(rule__Buffer__UnorderedGroup_0)
+	{ after(grammarAccess.getBufferAccess().getUnorderedGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Buffer__Group__1__Impl
+	rule__Buffer__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferAccess().getBufferKeyword_1()); }
+	'buffer'
+	{ after(grammarAccess.getBufferAccess().getBufferKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Buffer__Group__2__Impl
+	rule__Buffer__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferAccess().getTypeAssignment_2()); }
+	(rule__Buffer__TypeAssignment_2)
+	{ after(grammarAccess.getBufferAccess().getTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Buffer__Group__3__Impl
+	rule__Buffer__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferAccess().getNameAssignment_3()); }
+	(rule__Buffer__NameAssignment_3)
+	{ after(grammarAccess.getBufferAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Buffer__Group__4__Impl
+	rule__Buffer__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__Buffer__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getBufferAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Buffer__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getBufferAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BufferPublic__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPublic__Group__0__Impl
+	rule__BufferPublic__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPublicAccess().getModifierAssignment_0()); }
+	(rule__BufferPublic__ModifierAssignment_0)?
+	{ after(grammarAccess.getBufferPublicAccess().getModifierAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPublic__Group__1__Impl
+	rule__BufferPublic__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPublicAccess().getVisibilityAssignment_1()); }
+	(rule__BufferPublic__VisibilityAssignment_1)
+	{ after(grammarAccess.getBufferPublicAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPublic__Group__2__Impl
+	rule__BufferPublic__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPublicAccess().getTypeAssignment_2()); }
+	(rule__BufferPublic__TypeAssignment_2)
+	{ after(grammarAccess.getBufferPublicAccess().getTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPublic__Group__3__Impl
+	rule__BufferPublic__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPublicAccess().getNameAssignment_3()); }
+	(rule__BufferPublic__NameAssignment_3)
+	{ after(grammarAccess.getBufferPublicAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPublic__Group__4__Impl
+	rule__BufferPublic__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPublicAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__BufferPublic__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getBufferPublicAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPublic__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPublicAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getBufferPublicAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BufferProtected__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferProtected__Group__0__Impl
+	rule__BufferProtected__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferProtectedAccess().getModifierAssignment_0()); }
+	(rule__BufferProtected__ModifierAssignment_0)?
+	{ after(grammarAccess.getBufferProtectedAccess().getModifierAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferProtected__Group__1__Impl
+	rule__BufferProtected__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferProtectedAccess().getVisibilityAssignment_1()); }
+	(rule__BufferProtected__VisibilityAssignment_1)
+	{ after(grammarAccess.getBufferProtectedAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferProtected__Group__2__Impl
+	rule__BufferProtected__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferProtectedAccess().getTypeAssignment_2()); }
+	(rule__BufferProtected__TypeAssignment_2)
+	{ after(grammarAccess.getBufferProtectedAccess().getTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferProtected__Group__3__Impl
+	rule__BufferProtected__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferProtectedAccess().getNameAssignment_3()); }
+	(rule__BufferProtected__NameAssignment_3)
+	{ after(grammarAccess.getBufferProtectedAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferProtected__Group__4__Impl
+	rule__BufferProtected__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__BufferProtected__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferProtected__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferProtectedAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getBufferProtectedAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BufferPrivate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPrivate__Group__0__Impl
+	rule__BufferPrivate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPrivateAccess().getModifierAssignment_0()); }
+	(rule__BufferPrivate__ModifierAssignment_0)?
+	{ after(grammarAccess.getBufferPrivateAccess().getModifierAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPrivate__Group__1__Impl
+	rule__BufferPrivate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPrivateAccess().getVisibilityAssignment_1()); }
+	(rule__BufferPrivate__VisibilityAssignment_1)
+	{ after(grammarAccess.getBufferPrivateAccess().getVisibilityAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPrivate__Group__2__Impl
+	rule__BufferPrivate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPrivateAccess().getTypeAssignment_2()); }
+	(rule__BufferPrivate__TypeAssignment_2)
+	{ after(grammarAccess.getBufferPrivateAccess().getTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPrivate__Group__3__Impl
+	rule__BufferPrivate__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPrivateAccess().getNameAssignment_3()); }
+	(rule__BufferPrivate__NameAssignment_3)
+	{ after(grammarAccess.getBufferPrivateAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPrivate__Group__4__Impl
+	rule__BufferPrivate__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__BufferPrivate__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BufferPrivate__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBufferPrivateAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getBufferPrivateAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Port__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group__0__Impl
+	rule__Port__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getVisibilityAssignment_0()); }
+	(rule__Port__VisibilityAssignment_0)?
+	{ after(grammarAccess.getPortAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group__1__Impl
+	rule__Port__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getPortKeyword_1()); }
+	'port'
+	{ after(grammarAccess.getPortAccess().getPortKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group__2__Impl
+	rule__Port__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getDirectionAssignment_2()); }
+	(rule__Port__DirectionAssignment_2)?
+	{ after(grammarAccess.getPortAccess().getDirectionAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group__3__Impl
+	rule__Port__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getNameAssignment_3()); }
+	(rule__Port__NameAssignment_3)
+	{ after(grammarAccess.getPortAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group__4__Impl
+	rule__Port__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__Port__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getPortAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group__5__Impl
+	rule__Port__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getGroup_5()); }
+	(rule__Port__Group_5__0)?
+	{ after(grammarAccess.getPortAccess().getGroup_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getSemicolonKeyword_6()); }
+	';'
+	{ after(grammarAccess.getPortAccess().getSemicolonKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Port__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group_5__0__Impl
+	rule__Port__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getLeftParenthesisKeyword_5_0()); }
+	'('
+	{ after(grammarAccess.getPortAccess().getLeftParenthesisKeyword_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group_5__1__Impl
+	rule__Port__Group_5__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getParameterAssignment_5_1()); }
+	(rule__Port__ParameterAssignment_5_1)
+	{ after(grammarAccess.getPortAccess().getParameterAssignment_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group_5__2__Impl
+	rule__Port__Group_5__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getGroup_5_2()); }
+	(rule__Port__Group_5_2__0)*
+	{ after(grammarAccess.getPortAccess().getGroup_5_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group_5__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getRightParenthesisKeyword_5_3()); }
+	')'
+	{ after(grammarAccess.getPortAccess().getRightParenthesisKeyword_5_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Port__Group_5_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group_5_2__0__Impl
+	rule__Port__Group_5_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getCommaKeyword_5_2_0()); }
+	','
+	{ after(grammarAccess.getPortAccess().getCommaKeyword_5_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Port__Group_5_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__Group_5_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortAccess().getParameterAssignment_5_2_1()); }
+	(rule__Port__ParameterAssignment_5_2_1)
+	{ after(grammarAccess.getPortAccess().getParameterAssignment_5_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PortPublic__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group__0__Impl
+	rule__PortPublic__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getVisibilityAssignment_0()); }
+	(rule__PortPublic__VisibilityAssignment_0)
+	{ after(grammarAccess.getPortPublicAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group__1__Impl
+	rule__PortPublic__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getDirectionAssignment_1()); }
+	(rule__PortPublic__DirectionAssignment_1)?
+	{ after(grammarAccess.getPortPublicAccess().getDirectionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group__2__Impl
+	rule__PortPublic__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getNameAssignment_2()); }
+	(rule__PortPublic__NameAssignment_2)
+	{ after(grammarAccess.getPortPublicAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group__3__Impl
+	rule__PortPublic__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__PortPublic__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getPortPublicAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group__4__Impl
+	rule__PortPublic__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getGroup_4()); }
+	(rule__PortPublic__Group_4__0)?
+	{ after(grammarAccess.getPortPublicAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getPortPublicAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PortPublic__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group_4__0__Impl
+	rule__PortPublic__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getLeftParenthesisKeyword_4_0()); }
+	'('
+	{ after(grammarAccess.getPortPublicAccess().getLeftParenthesisKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group_4__1__Impl
+	rule__PortPublic__Group_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getParameterAssignment_4_1()); }
+	(rule__PortPublic__ParameterAssignment_4_1)
+	{ after(grammarAccess.getPortPublicAccess().getParameterAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group_4__2__Impl
+	rule__PortPublic__Group_4__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getGroup_4_2()); }
+	(rule__PortPublic__Group_4_2__0)*
+	{ after(grammarAccess.getPortPublicAccess().getGroup_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group_4__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getRightParenthesisKeyword_4_3()); }
+	')'
+	{ after(grammarAccess.getPortPublicAccess().getRightParenthesisKeyword_4_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PortPublic__Group_4_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group_4_2__0__Impl
+	rule__PortPublic__Group_4_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getCommaKeyword_4_2_0()); }
+	','
+	{ after(grammarAccess.getPortPublicAccess().getCommaKeyword_4_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPublic__Group_4_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__Group_4_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPublicAccess().getParameterAssignment_4_2_1()); }
+	(rule__PortPublic__ParameterAssignment_4_2_1)
+	{ after(grammarAccess.getPortPublicAccess().getParameterAssignment_4_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PortProtected__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group__0__Impl
+	rule__PortProtected__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getVisibilityAssignment_0()); }
+	(rule__PortProtected__VisibilityAssignment_0)
+	{ after(grammarAccess.getPortProtectedAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group__1__Impl
+	rule__PortProtected__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getDirectionAssignment_1()); }
+	(rule__PortProtected__DirectionAssignment_1)?
+	{ after(grammarAccess.getPortProtectedAccess().getDirectionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group__2__Impl
+	rule__PortProtected__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getNameAssignment_2()); }
+	(rule__PortProtected__NameAssignment_2)
+	{ after(grammarAccess.getPortProtectedAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group__3__Impl
+	rule__PortProtected__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__PortProtected__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getPortProtectedAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group__4__Impl
+	rule__PortProtected__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getGroup_4()); }
+	(rule__PortProtected__Group_4__0)?
+	{ after(grammarAccess.getPortProtectedAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getPortProtectedAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PortProtected__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group_4__0__Impl
+	rule__PortProtected__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getLeftParenthesisKeyword_4_0()); }
+	'('
+	{ after(grammarAccess.getPortProtectedAccess().getLeftParenthesisKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group_4__1__Impl
+	rule__PortProtected__Group_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_1()); }
+	(rule__PortProtected__ParameterAssignment_4_1)
+	{ after(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group_4__2__Impl
+	rule__PortProtected__Group_4__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getGroup_4_2()); }
+	(rule__PortProtected__Group_4_2__0)*
+	{ after(grammarAccess.getPortProtectedAccess().getGroup_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group_4__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getRightParenthesisKeyword_4_3()); }
+	')'
+	{ after(grammarAccess.getPortProtectedAccess().getRightParenthesisKeyword_4_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PortProtected__Group_4_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group_4_2__0__Impl
+	rule__PortProtected__Group_4_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getCommaKeyword_4_2_0()); }
+	','
+	{ after(grammarAccess.getPortProtectedAccess().getCommaKeyword_4_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortProtected__Group_4_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__Group_4_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_2_1()); }
+	(rule__PortProtected__ParameterAssignment_4_2_1)
+	{ after(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PortPrivate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group__0__Impl
+	rule__PortPrivate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getVisibilityAssignment_0()); }
+	(rule__PortPrivate__VisibilityAssignment_0)
+	{ after(grammarAccess.getPortPrivateAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group__1__Impl
+	rule__PortPrivate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getDirectionAssignment_1()); }
+	(rule__PortPrivate__DirectionAssignment_1)?
+	{ after(grammarAccess.getPortPrivateAccess().getDirectionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group__2__Impl
+	rule__PortPrivate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getNameAssignment_2()); }
+	(rule__PortPrivate__NameAssignment_2)
+	{ after(grammarAccess.getPortPrivateAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group__3__Impl
+	rule__PortPrivate__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__PortPrivate__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getPortPrivateAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group__4__Impl
+	rule__PortPrivate__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getGroup_4()); }
+	(rule__PortPrivate__Group_4__0)?
+	{ after(grammarAccess.getPortPrivateAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getPortPrivateAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PortPrivate__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group_4__0__Impl
+	rule__PortPrivate__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getLeftParenthesisKeyword_4_0()); }
+	'('
+	{ after(grammarAccess.getPortPrivateAccess().getLeftParenthesisKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group_4__1__Impl
+	rule__PortPrivate__Group_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_1()); }
+	(rule__PortPrivate__ParameterAssignment_4_1)
+	{ after(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group_4__2__Impl
+	rule__PortPrivate__Group_4__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getGroup_4_2()); }
+	(rule__PortPrivate__Group_4_2__0)*
+	{ after(grammarAccess.getPortPrivateAccess().getGroup_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group_4__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getRightParenthesisKeyword_4_3()); }
+	')'
+	{ after(grammarAccess.getPortPrivateAccess().getRightParenthesisKeyword_4_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PortPrivate__Group_4_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group_4_2__0__Impl
+	rule__PortPrivate__Group_4_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getCommaKeyword_4_2_0()); }
+	','
+	{ after(grammarAccess.getPortPrivateAccess().getCommaKeyword_4_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PortPrivate__Group_4_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__Group_4_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_2_1()); }
+	(rule__PortPrivate__ParameterAssignment_4_2_1)
+	{ after(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Signal__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group__0__Impl
+	rule__Signal__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getVisibilityAssignment_0()); }
+	(rule__Signal__VisibilityAssignment_0)?
+	{ after(grammarAccess.getSignalAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group__1__Impl
+	rule__Signal__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getSignalKeyword_1()); }
+	'signal'
+	{ after(grammarAccess.getSignalAccess().getSignalKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group__2__Impl
+	rule__Signal__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getDirectionAssignment_2()); }
+	(rule__Signal__DirectionAssignment_2)?
+	{ after(grammarAccess.getSignalAccess().getDirectionAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group__3__Impl
+	rule__Signal__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getNameAssignment_3()); }
+	(rule__Signal__NameAssignment_3)
+	{ after(grammarAccess.getSignalAccess().getNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group__4__Impl
+	rule__Signal__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getUnrestrictedNameAssignment_4()); }
+	(rule__Signal__UnrestrictedNameAssignment_4)?
+	{ after(grammarAccess.getSignalAccess().getUnrestrictedNameAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group__5__Impl
+	rule__Signal__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getGroup_5()); }
+	(rule__Signal__Group_5__0)?
+	{ after(grammarAccess.getSignalAccess().getGroup_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getSemicolonKeyword_6()); }
+	';'
+	{ after(grammarAccess.getSignalAccess().getSemicolonKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Signal__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group_5__0__Impl
+	rule__Signal__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getLeftParenthesisKeyword_5_0()); }
+	'('
+	{ after(grammarAccess.getSignalAccess().getLeftParenthesisKeyword_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group_5__1__Impl
+	rule__Signal__Group_5__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getParameterAssignment_5_1()); }
+	(rule__Signal__ParameterAssignment_5_1)
+	{ after(grammarAccess.getSignalAccess().getParameterAssignment_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group_5__2__Impl
+	rule__Signal__Group_5__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getGroup_5_2()); }
+	(rule__Signal__Group_5_2__0)*
+	{ after(grammarAccess.getSignalAccess().getGroup_5_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group_5__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getRightParenthesisKeyword_5_3()); }
+	')'
+	{ after(grammarAccess.getSignalAccess().getRightParenthesisKeyword_5_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Signal__Group_5_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group_5_2__0__Impl
+	rule__Signal__Group_5_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getCommaKeyword_5_2_0()); }
+	','
+	{ after(grammarAccess.getSignalAccess().getCommaKeyword_5_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Signal__Group_5_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__Group_5_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalAccess().getParameterAssignment_5_2_1()); }
+	(rule__Signal__ParameterAssignment_5_2_1)
+	{ after(grammarAccess.getSignalAccess().getParameterAssignment_5_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalPublic__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group__0__Impl
+	rule__SignalPublic__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getVisibilityAssignment_0()); }
+	(rule__SignalPublic__VisibilityAssignment_0)
+	{ after(grammarAccess.getSignalPublicAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group__1__Impl
+	rule__SignalPublic__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getDirectionAssignment_1()); }
+	(rule__SignalPublic__DirectionAssignment_1)?
+	{ after(grammarAccess.getSignalPublicAccess().getDirectionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group__2__Impl
+	rule__SignalPublic__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getNameAssignment_2()); }
+	(rule__SignalPublic__NameAssignment_2)
+	{ after(grammarAccess.getSignalPublicAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group__3__Impl
+	rule__SignalPublic__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__SignalPublic__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getSignalPublicAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group__4__Impl
+	rule__SignalPublic__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getGroup_4()); }
+	(rule__SignalPublic__Group_4__0)?
+	{ after(grammarAccess.getSignalPublicAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getSignalPublicAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalPublic__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group_4__0__Impl
+	rule__SignalPublic__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getLeftParenthesisKeyword_4_0()); }
+	'('
+	{ after(grammarAccess.getSignalPublicAccess().getLeftParenthesisKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group_4__1__Impl
+	rule__SignalPublic__Group_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_1()); }
+	(rule__SignalPublic__ParameterAssignment_4_1)
+	{ after(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group_4__2__Impl
+	rule__SignalPublic__Group_4__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getGroup_4_2()); }
+	(rule__SignalPublic__Group_4_2__0)*
+	{ after(grammarAccess.getSignalPublicAccess().getGroup_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group_4__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getRightParenthesisKeyword_4_3()); }
+	')'
+	{ after(grammarAccess.getSignalPublicAccess().getRightParenthesisKeyword_4_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalPublic__Group_4_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group_4_2__0__Impl
+	rule__SignalPublic__Group_4_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getCommaKeyword_4_2_0()); }
+	','
+	{ after(grammarAccess.getSignalPublicAccess().getCommaKeyword_4_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPublic__Group_4_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__Group_4_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_2_1()); }
+	(rule__SignalPublic__ParameterAssignment_4_2_1)
+	{ after(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalProtected__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group__0__Impl
+	rule__SignalProtected__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getVisibilityAssignment_0()); }
+	(rule__SignalProtected__VisibilityAssignment_0)
+	{ after(grammarAccess.getSignalProtectedAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group__1__Impl
+	rule__SignalProtected__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getDirectionAssignment_1()); }
+	(rule__SignalProtected__DirectionAssignment_1)?
+	{ after(grammarAccess.getSignalProtectedAccess().getDirectionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group__2__Impl
+	rule__SignalProtected__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getNameAssignment_2()); }
+	(rule__SignalProtected__NameAssignment_2)
+	{ after(grammarAccess.getSignalProtectedAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group__3__Impl
+	rule__SignalProtected__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__SignalProtected__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group__4__Impl
+	rule__SignalProtected__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getGroup_4()); }
+	(rule__SignalProtected__Group_4__0)?
+	{ after(grammarAccess.getSignalProtectedAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getSignalProtectedAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalProtected__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group_4__0__Impl
+	rule__SignalProtected__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getLeftParenthesisKeyword_4_0()); }
+	'('
+	{ after(grammarAccess.getSignalProtectedAccess().getLeftParenthesisKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group_4__1__Impl
+	rule__SignalProtected__Group_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_1()); }
+	(rule__SignalProtected__ParameterAssignment_4_1)
+	{ after(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group_4__2__Impl
+	rule__SignalProtected__Group_4__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getGroup_4_2()); }
+	(rule__SignalProtected__Group_4_2__0)*
+	{ after(grammarAccess.getSignalProtectedAccess().getGroup_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group_4__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getRightParenthesisKeyword_4_3()); }
+	')'
+	{ after(grammarAccess.getSignalProtectedAccess().getRightParenthesisKeyword_4_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalProtected__Group_4_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group_4_2__0__Impl
+	rule__SignalProtected__Group_4_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getCommaKeyword_4_2_0()); }
+	','
+	{ after(grammarAccess.getSignalProtectedAccess().getCommaKeyword_4_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalProtected__Group_4_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__Group_4_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_2_1()); }
+	(rule__SignalProtected__ParameterAssignment_4_2_1)
+	{ after(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalPrivate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group__0__Impl
+	rule__SignalPrivate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getVisibilityAssignment_0()); }
+	(rule__SignalPrivate__VisibilityAssignment_0)
+	{ after(grammarAccess.getSignalPrivateAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group__1__Impl
+	rule__SignalPrivate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getDirectionAssignment_1()); }
+	(rule__SignalPrivate__DirectionAssignment_1)?
+	{ after(grammarAccess.getSignalPrivateAccess().getDirectionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group__2__Impl
+	rule__SignalPrivate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getNameAssignment_2()); }
+	(rule__SignalPrivate__NameAssignment_2)
+	{ after(grammarAccess.getSignalPrivateAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group__3__Impl
+	rule__SignalPrivate__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__SignalPrivate__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group__4__Impl
+	rule__SignalPrivate__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getGroup_4()); }
+	(rule__SignalPrivate__Group_4__0)?
+	{ after(grammarAccess.getSignalPrivateAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getSignalPrivateAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalPrivate__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group_4__0__Impl
+	rule__SignalPrivate__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getLeftParenthesisKeyword_4_0()); }
+	'('
+	{ after(grammarAccess.getSignalPrivateAccess().getLeftParenthesisKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group_4__1__Impl
+	rule__SignalPrivate__Group_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_1()); }
+	(rule__SignalPrivate__ParameterAssignment_4_1)
+	{ after(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group_4__2__Impl
+	rule__SignalPrivate__Group_4__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getGroup_4_2()); }
+	(rule__SignalPrivate__Group_4_2__0)*
+	{ after(grammarAccess.getSignalPrivateAccess().getGroup_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group_4__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getRightParenthesisKeyword_4_3()); }
+	')'
+	{ after(grammarAccess.getSignalPrivateAccess().getRightParenthesisKeyword_4_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalPrivate__Group_4_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group_4_2__0__Impl
+	rule__SignalPrivate__Group_4_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getCommaKeyword_4_2_0()); }
+	','
+	{ after(grammarAccess.getSignalPrivateAccess().getCommaKeyword_4_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalPrivate__Group_4_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__Group_4_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_2_1()); }
+	(rule__SignalPrivate__ParameterAssignment_4_2_1)
+	{ after(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Channel__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Channel__Group__0__Impl
+	rule__Channel__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelAccess().getVisibilityAssignment_0()); }
+	(rule__Channel__VisibilityAssignment_0)?
+	{ after(grammarAccess.getChannelAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Channel__Group__1__Impl
+	rule__Channel__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelAccess().getChannelKeyword_1()); }
+	'channel'
+	{ after(grammarAccess.getChannelAccess().getChannelKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Channel__Group__2__Impl
+	rule__Channel__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelAccess().getNameAssignment_2()); }
+	(rule__Channel__NameAssignment_2)
+	{ after(grammarAccess.getChannelAccess().getNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Channel__Group__3__Impl
+	rule__Channel__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelAccess().getUnrestrictedNameAssignment_3()); }
+	(rule__Channel__UnrestrictedNameAssignment_3)?
+	{ after(grammarAccess.getChannelAccess().getUnrestrictedNameAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Channel__Group__4__Impl
+	rule__Channel__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelAccess().getLeftCurlyBracketKeyword_4()); }
+	'{'
+	{ after(grammarAccess.getChannelAccess().getLeftCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Channel__Group__5__Impl
+	rule__Channel__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getChannelAccess().getGroup_5()); }
+		(rule__Channel__Group_5__0)
+		{ after(grammarAccess.getChannelAccess().getGroup_5()); }
+	)
+	(
+		{ before(grammarAccess.getChannelAccess().getGroup_5()); }
+		(rule__Channel__Group_5__0)*
+		{ after(grammarAccess.getChannelAccess().getGroup_5()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Channel__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelAccess().getRightCurlyBracketKeyword_6()); }
+	'}'
+	{ after(grammarAccess.getChannelAccess().getRightCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Channel__Group_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Channel__Group_5__0__Impl
+	rule__Channel__Group_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelAccess().getSignalAssignment_5_0()); }
+	(rule__Channel__SignalAssignment_5_0)
+	{ after(grammarAccess.getChannelAccess().getSignalAssignment_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Channel__Group_5__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__Group_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelAccess().getSemicolonKeyword_5_1()); }
+	';'
+	{ after(grammarAccess.getChannelAccess().getSemicolonKeyword_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__SignalReference__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalReference__Group__0__Impl
+	rule__SignalReference__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalReference__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalReferenceAccess().getDirectionAssignment_0()); }
+	(rule__SignalReference__DirectionAssignment_0)?
+	{ after(grammarAccess.getSignalReferenceAccess().getDirectionAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalReference__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__SignalReference__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalReference__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSignalReferenceAccess().getNameAssignment_1()); }
+	(rule__SignalReference__NameAssignment_1)
+	{ after(grammarAccess.getSignalReferenceAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ChannelPublic__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPublic__Group__0__Impl
+	rule__ChannelPublic__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPublicAccess().getVisibilityAssignment_0()); }
+	(rule__ChannelPublic__VisibilityAssignment_0)
+	{ after(grammarAccess.getChannelPublicAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPublic__Group__1__Impl
+	rule__ChannelPublic__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPublicAccess().getNameAssignment_1()); }
+	(rule__ChannelPublic__NameAssignment_1)
+	{ after(grammarAccess.getChannelPublicAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPublic__Group__2__Impl
+	rule__ChannelPublic__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPublicAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__ChannelPublic__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getChannelPublicAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPublic__Group__3__Impl
+	rule__ChannelPublic__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPublicAccess().getLeftCurlyBracketKeyword_3()); }
+	'{'
+	{ after(grammarAccess.getChannelPublicAccess().getLeftCurlyBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPublic__Group__4__Impl
+	rule__ChannelPublic__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getChannelPublicAccess().getGroup_4()); }
+		(rule__ChannelPublic__Group_4__0)
+		{ after(grammarAccess.getChannelPublicAccess().getGroup_4()); }
+	)
+	(
+		{ before(grammarAccess.getChannelPublicAccess().getGroup_4()); }
+		(rule__ChannelPublic__Group_4__0)*
+		{ after(grammarAccess.getChannelPublicAccess().getGroup_4()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPublic__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPublicAccess().getRightCurlyBracketKeyword_5()); }
+	'}'
+	{ after(grammarAccess.getChannelPublicAccess().getRightCurlyBracketKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ChannelPublic__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPublic__Group_4__0__Impl
+	rule__ChannelPublic__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPublicAccess().getSignalAssignment_4_0()); }
+	(rule__ChannelPublic__SignalAssignment_4_0)
+	{ after(grammarAccess.getChannelPublicAccess().getSignalAssignment_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPublic__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPublicAccess().getSemicolonKeyword_4_1()); }
+	';'
+	{ after(grammarAccess.getChannelPublicAccess().getSemicolonKeyword_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ChannelProtected__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelProtected__Group__0__Impl
+	rule__ChannelProtected__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelProtectedAccess().getVisibilityAssignment_0()); }
+	(rule__ChannelProtected__VisibilityAssignment_0)
+	{ after(grammarAccess.getChannelProtectedAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelProtected__Group__1__Impl
+	rule__ChannelProtected__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelProtectedAccess().getNameAssignment_1()); }
+	(rule__ChannelProtected__NameAssignment_1)
+	{ after(grammarAccess.getChannelProtectedAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelProtected__Group__2__Impl
+	rule__ChannelProtected__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__ChannelProtected__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelProtected__Group__3__Impl
+	rule__ChannelProtected__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelProtectedAccess().getLeftCurlyBracketKeyword_3()); }
+	'{'
+	{ after(grammarAccess.getChannelProtectedAccess().getLeftCurlyBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelProtected__Group__4__Impl
+	rule__ChannelProtected__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getChannelProtectedAccess().getGroup_4()); }
+		(rule__ChannelProtected__Group_4__0)
+		{ after(grammarAccess.getChannelProtectedAccess().getGroup_4()); }
+	)
+	(
+		{ before(grammarAccess.getChannelProtectedAccess().getGroup_4()); }
+		(rule__ChannelProtected__Group_4__0)*
+		{ after(grammarAccess.getChannelProtectedAccess().getGroup_4()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelProtected__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelProtectedAccess().getRightCurlyBracketKeyword_5()); }
+	'}'
+	{ after(grammarAccess.getChannelProtectedAccess().getRightCurlyBracketKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ChannelProtected__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelProtected__Group_4__0__Impl
+	rule__ChannelProtected__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelProtectedAccess().getSignalAssignment_4_0()); }
+	(rule__ChannelProtected__SignalAssignment_4_0)
+	{ after(grammarAccess.getChannelProtectedAccess().getSignalAssignment_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelProtected__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelProtectedAccess().getSemicolonKeyword_4_1()); }
+	';'
+	{ after(grammarAccess.getChannelProtectedAccess().getSemicolonKeyword_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ChannelPrivate__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPrivate__Group__0__Impl
+	rule__ChannelPrivate__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPrivateAccess().getVisibilityAssignment_0()); }
+	(rule__ChannelPrivate__VisibilityAssignment_0)
+	{ after(grammarAccess.getChannelPrivateAccess().getVisibilityAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPrivate__Group__1__Impl
+	rule__ChannelPrivate__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPrivateAccess().getNameAssignment_1()); }
+	(rule__ChannelPrivate__NameAssignment_1)
+	{ after(grammarAccess.getChannelPrivateAccess().getNameAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPrivate__Group__2__Impl
+	rule__ChannelPrivate__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameAssignment_2()); }
+	(rule__ChannelPrivate__UnrestrictedNameAssignment_2)?
+	{ after(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPrivate__Group__3__Impl
+	rule__ChannelPrivate__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPrivateAccess().getLeftCurlyBracketKeyword_3()); }
+	'{'
+	{ after(grammarAccess.getChannelPrivateAccess().getLeftCurlyBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPrivate__Group__4__Impl
+	rule__ChannelPrivate__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getChannelPrivateAccess().getGroup_4()); }
+		(rule__ChannelPrivate__Group_4__0)
+		{ after(grammarAccess.getChannelPrivateAccess().getGroup_4()); }
+	)
+	(
+		{ before(grammarAccess.getChannelPrivateAccess().getGroup_4()); }
+		(rule__ChannelPrivate__Group_4__0)*
+		{ after(grammarAccess.getChannelPrivateAccess().getGroup_4()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPrivate__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPrivateAccess().getRightCurlyBracketKeyword_5()); }
+	'}'
+	{ after(grammarAccess.getChannelPrivateAccess().getRightCurlyBracketKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ChannelPrivate__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPrivate__Group_4__0__Impl
+	rule__ChannelPrivate__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPrivateAccess().getSignalAssignment_4_0()); }
+	(rule__ChannelPrivate__SignalAssignment_4_0)
+	{ after(grammarAccess.getChannelPrivateAccess().getSignalAssignment_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ChannelPrivate__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getChannelPrivateAccess().getSemicolonKeyword_4_1()); }
+	';'
+	{ after(grammarAccess.getChannelPrivateAccess().getSemicolonKeyword_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group__0__Impl
+	rule__Transition__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getTransitionAction_0()); }
+	()
+	{ after(grammarAccess.getTransitionAccess().getTransitionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group__1__Impl
+	rule__Transition__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getTransientAssignment_1()); }
+	(rule__Transition__TransientAssignment_1)?
+	{ after(grammarAccess.getTransitionAccess().getTransientAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group__2__Impl
+	rule__Transition__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getTransitionKeyword_2()); }
+	'transition'
+	{ after(grammarAccess.getTransitionAccess().getTransitionKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group__3__Impl
+	rule__Transition__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getMoeAssignment_3()); }
+	(rule__Transition__MoeAssignment_3)?
+	{ after(grammarAccess.getTransitionAccess().getMoeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group__4__Impl
+	rule__Transition__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getGroup_4()); }
+	(rule__Transition__Group_4__0)?
+	{ after(grammarAccess.getTransitionAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getAlternatives_5()); }
+	(rule__Transition__Alternatives_5)
+	{ after(grammarAccess.getTransitionAccess().getAlternatives_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_4__0__Impl
+	rule__Transition__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getNameAssignment_4_0()); }
+	(rule__Transition__NameAssignment_4_0)
+	{ after(grammarAccess.getTransitionAccess().getNameAssignment_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getUnrestrictedNameAssignment_4_1()); }
+	(rule__Transition__UnrestrictedNameAssignment_4_1)?
+	{ after(grammarAccess.getTransitionAccess().getUnrestrictedNameAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group_5_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0__0__Impl
+	rule__Transition__Group_5_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_0_0()); }
+	'{'
+	{ after(grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0__1__Impl
+	rule__Transition__Group_5_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getAlternatives_5_0_1()); }
+	(rule__Transition__Alternatives_5_0_1)?
+	{ after(grammarAccess.getTransitionAccess().getAlternatives_5_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0__2__Impl
+	rule__Transition__Group_5_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_0_2()); }
+	'}'
+	{ after(grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getGroup_5_0_3()); }
+	(rule__Transition__Group_5_0_3__0)?
+	{ after(grammarAccess.getTransitionAccess().getGroup_5_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group_5_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_1_0__0__Impl
+	rule__Transition__Group_5_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getGroup_5_0_1_0_0()); }
+	(rule__Transition__Group_5_0_1_0_0__0)?
+	{ after(grammarAccess.getTransitionAccess().getGroup_5_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_1_0__1__Impl
+	rule__Transition__Group_5_0_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_1()); }
+	(rule__Transition__Alternatives_5_0_1_0_1)?
+	{ after(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_1_0__2__Impl
+	rule__Transition__Group_5_0_1_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_2()); }
+	(rule__Transition__Alternatives_5_0_1_0_2)?
+	{ after(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_1_0__3__Impl
+	rule__Transition__Group_5_0_1_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getEffectKeyword_5_0_1_0_3()); }
+	'@effect:'
+	{ after(grammarAccess.getTransitionAccess().getEffectKeyword_5_0_1_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_1_0__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getEffectAssignment_5_0_1_0_4()); }
+	(rule__Transition__EffectAssignment_5_0_1_0_4)?
+	{ after(grammarAccess.getTransitionAccess().getEffectAssignment_5_0_1_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group_5_0_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_1_0_0__0__Impl
+	rule__Transition__Group_5_0_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getTriggerKeyword_5_0_1_0_0_0()); }
+	'@trigger:'
+	{ after(grammarAccess.getTransitionAccess().getTriggerKeyword_5_0_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getTriggerAssignment_5_0_1_0_0_1()); }
+	(rule__Transition__TriggerAssignment_5_0_1_0_0_1)*
+	{ after(grammarAccess.getTransitionAccess().getTriggerAssignment_5_0_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group_5_0_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_3__0__Impl
+	rule__Transition__Group_5_0_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_0_3_0()); }
+	'-->'
+	{ after(grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_0_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_3__1__Impl
+	rule__Transition__Group_5_0_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getTargetAssignment_5_0_3_1()); }
+	(rule__Transition__TargetAssignment_5_0_3_1)
+	{ after(grammarAccess.getTransitionAccess().getTargetAssignment_5_0_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_0_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_0_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getSemicolonKeyword_5_0_3_2()); }
+	';'
+	{ after(grammarAccess.getTransitionAccess().getSemicolonKeyword_5_0_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group_5_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1__0__Impl
+	rule__Transition__Group_5_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0()); }
+	'-->'
+	{ after(grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1__1__Impl
+	rule__Transition__Group_5_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getTargetAssignment_5_1_1()); }
+	(rule__Transition__TargetAssignment_5_1_1)
+	{ after(grammarAccess.getTransitionAccess().getTargetAssignment_5_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getAlternatives_5_1_2()); }
+	(rule__Transition__Alternatives_5_1_2)
+	{ after(grammarAccess.getTransitionAccess().getAlternatives_5_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group_5_1_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0__0__Impl
+	rule__Transition__Group_5_1_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_1_2_0_0()); }
+	'{'
+	{ after(grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_1_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0__1__Impl
+	rule__Transition__Group_5_1_2_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1()); }
+	(rule__Transition__Alternatives_5_1_2_0_1)?
+	{ after(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_1_2_0_2()); }
+	'}'
+	{ after(grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_1_2_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group_5_1_2_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0_1_0__0__Impl
+	rule__Transition__Group_5_1_2_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0_0()); }
+	(rule__Transition__Group_5_1_2_0_1_0_0__0)?
+	{ after(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0_1_0__1__Impl
+	rule__Transition__Group_5_1_2_0_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_1()); }
+	(rule__Transition__Alternatives_5_1_2_0_1_0_1)?
+	{ after(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0_1_0__2__Impl
+	rule__Transition__Group_5_1_2_0_1_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_2()); }
+	(rule__Transition__Alternatives_5_1_2_0_1_0_2)?
+	{ after(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0_1_0__3__Impl
+	rule__Transition__Group_5_1_2_0_1_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getEffectKeyword_5_1_2_0_1_0_3()); }
+	'@effect:'
+	{ after(grammarAccess.getTransitionAccess().getEffectKeyword_5_1_2_0_1_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0_1_0__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getEffectAssignment_5_1_2_0_1_0_4()); }
+	(rule__Transition__EffectAssignment_5_1_2_0_1_0_4)?
+	{ after(grammarAccess.getTransitionAccess().getEffectAssignment_5_1_2_0_1_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Transition__Group_5_1_2_0_1_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0_1_0_0__0__Impl
+	rule__Transition__Group_5_1_2_0_1_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getTriggerKeyword_5_1_2_0_1_0_0_0()); }
+	'@trigger:'
+	{ after(grammarAccess.getTransitionAccess().getTriggerKeyword_5_1_2_0_1_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Transition__Group_5_1_2_0_1_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__Group_5_1_2_0_1_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionAccess().getTriggerAssignment_5_1_2_0_1_0_0_1()); }
+	(rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1)*
+	{ after(grammarAccess.getTransitionAccess().getTriggerAssignment_5_1_2_0_1_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionMoe__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group__0__Impl
+	rule__TransitionMoe__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getLessThanSignKeyword_0()); }
+	'<'
+	{ after(grammarAccess.getTransitionMoeAccess().getLessThanSignKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group__1__Impl
+	rule__TransitionMoe__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getAlternatives_1()); }
+	(rule__TransitionMoe__Alternatives_1)
+	{ after(grammarAccess.getTransitionMoeAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getGreaterThanSignKeyword_2()); }
+	'>'
+	{ after(grammarAccess.getTransitionMoeAccess().getGreaterThanSignKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionMoe__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0__0__Impl
+	rule__TransitionMoe__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getMocKeyword_1_0_0()); }
+	('moc:')?
+	{ after(grammarAccess.getTransitionMoeAccess().getMocKeyword_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0__1__Impl
+	rule__TransitionMoe__Group_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getAlternatives_1_0_1()); }
+	(rule__TransitionMoe__Alternatives_1_0_1)
+	{ after(grammarAccess.getTransitionMoeAccess().getAlternatives_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getGroup_1_0_2()); }
+	(rule__TransitionMoe__Group_1_0_2__0)?
+	{ after(grammarAccess.getTransitionMoeAccess().getGroup_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionMoe__Group_1_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0_1_0__0__Impl
+	rule__TransitionMoe__Group_1_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getMocAssignment_1_0_1_0_0()); }
+	(rule__TransitionMoe__MocAssignment_1_0_1_0_0)
+	{ after(grammarAccess.getTransitionMoeAccess().getMocAssignment_1_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0_1()); }
+	(rule__TransitionMoe__Group_1_0_1_0_1__0)?
+	{ after(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionMoe__Group_1_0_1_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0_1_0_1__0__Impl
+	rule__TransitionMoe__Group_1_0_1_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_1_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getAmpersandKeyword_1_0_1_0_1_0()); }
+	'&'
+	{ after(grammarAccess.getTransitionMoeAccess().getAmpersandKeyword_1_0_1_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_1_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0_1_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_1_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_0_1_1()); }
+	(rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1)
+	{ after(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionMoe__Group_1_0_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0_2__0__Impl
+	rule__TransitionMoe__Group_1_0_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getCommaKeyword_1_0_2_0()); }
+	','
+	{ after(grammarAccess.getTransitionMoeAccess().getCommaKeyword_1_0_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0_2__1__Impl
+	rule__TransitionMoe__Group_1_0_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_0_2_1()); }
+	('prior:')?
+	{ after(grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_0_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_0_2__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_0_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_0_2_2()); }
+	(rule__TransitionMoe__PriorAssignment_1_0_2_2)
+	{ after(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_0_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionMoe__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_1__0__Impl
+	rule__TransitionMoe__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_1_0()); }
+	('prior:')?
+	{ after(grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionMoe__Group_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_1_1()); }
+	(rule__TransitionMoe__PriorAssignment_1_1_1)
+	{ after(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionBehavior__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionBehavior__Group__0__Impl
+	rule__TransitionBehavior__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionBehavior__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionBehaviorAccess().getBlockStatementAction_0()); }
+	()
+	{ after(grammarAccess.getTransitionBehaviorAccess().getBlockStatementAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionBehavior__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionBehavior__Group__1__Impl
+	rule__TransitionBehavior__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionBehavior__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionBehaviorAccess().getOpAssignment_1()); }
+	(rule__TransitionBehavior__OpAssignment_1)?
+	{ after(grammarAccess.getTransitionBehaviorAccess().getOpAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionBehavior__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionBehavior__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionBehavior__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionBehaviorAccess().getStatementAssignment_2()); }
+	(rule__TransitionBehavior__StatementAssignment_2)*
+	{ after(grammarAccess.getTransitionBehaviorAccess().getStatementAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionGuard__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_0__0__Impl
+	rule__TransitionGuard__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getGuardStatementAction_0_0()); }
+	()
+	{ after(grammarAccess.getTransitionGuardAccess().getGuardStatementAction_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_0__1__Impl
+	rule__TransitionGuard__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getGuardKeyword_0_1()); }
+	'@guard<'
+	{ after(grammarAccess.getTransitionGuardAccess().getGuardKeyword_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getConditionAssignment_0_2()); }
+	(rule__TransitionGuard__ConditionAssignment_0_2)
+	{ after(grammarAccess.getTransitionGuardAccess().getConditionAssignment_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionGuard__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_1__0__Impl
+	rule__TransitionGuard__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getGuardKeyword_1_0()); }
+	'@guard:'
+	{ after(grammarAccess.getTransitionGuardAccess().getGuardKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1()); }
+	(rule__TransitionGuard__Alternatives_1_1)
+	{ after(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionGuard__Group_1_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_1_1_0__0__Impl
+	rule__TransitionGuard__Group_1_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getGuardStatementAction_1_1_0_0()); }
+	()
+	{ after(grammarAccess.getTransitionGuardAccess().getGuardStatementAction_1_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_1_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1_0_1()); }
+	(rule__TransitionGuard__Alternatives_1_1_0_1)
+	{ after(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionGuard__Group_1_1_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_1_1_0_1_0__0__Impl
+	rule__TransitionGuard__Group_1_1_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1_1_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getLeftSquareBracketKeyword_1_1_0_1_0_0()); }
+	'['
+	{ after(grammarAccess.getTransitionGuardAccess().getLeftSquareBracketKeyword_1_1_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1_1_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_1_1_0_1_0__1__Impl
+	rule__TransitionGuard__Group_1_1_0_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1_1_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_0_1()); }
+	(rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1)
+	{ after(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1_1_0_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuard__Group_1_1_0_1_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__Group_1_1_0_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardAccess().getRightSquareBracketKeyword_1_1_0_1_0_2()); }
+	']'
+	{ after(grammarAccess.getTransitionGuardAccess().getRightSquareBracketKeyword_1_1_0_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionGuardExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuardExpression__Group__0__Impl
+	rule__TransitionGuardExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardExpressionAccess().getLogicalAssociativeExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getTransitionGuardExpressionAccess().getLogicalAssociativeExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuardExpression__Group__1__Impl
+	rule__TransitionGuardExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAssignment_1()); }
+	(rule__TransitionGuardExpression__OperatorAssignment_1)
+	{ after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuardExpression__Group__2__Impl
+	rule__TransitionGuardExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionGuardExpressionAccess().getGreaterThanSignColonKeyword_2()); }
+	'>:'
+	{ after(grammarAccess.getTransitionGuardExpressionAccess().getGreaterThanSignColonKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionGuardExpression__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	(
+		{ before(grammarAccess.getTransitionGuardExpressionAccess().getOperandAssignment_3()); }
+		(rule__TransitionGuardExpression__OperandAssignment_3)
+		{ after(grammarAccess.getTransitionGuardExpressionAccess().getOperandAssignment_3()); }
+	)
+	(
+		{ before(grammarAccess.getTransitionGuardExpressionAccess().getOperandAssignment_3()); }
+		(rule__TransitionGuardExpression__OperandAssignment_3)*
+		{ after(grammarAccess.getTransitionGuardExpressionAccess().getOperandAssignment_3()); }
+	)
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionTimedGuard__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_0__0__Impl
+	rule__TransitionTimedGuard__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_0_0()); }
+	()
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_0__1__Impl
+	rule__TransitionTimedGuard__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_0_1()); }
+	'@tguard<'
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_0_2()); }
+	(rule__TransitionTimedGuard__ConditionAssignment_0_2)
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionTimedGuard__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_1__0__Impl
+	rule__TransitionTimedGuard__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_1_0()); }
+	'@tguard:'
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1()); }
+	(rule__TransitionTimedGuard__Alternatives_1_1)
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionTimedGuard__Group_1_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_1_1_0__0__Impl
+	rule__TransitionTimedGuard__Group_1_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_1_1_0_0()); }
+	()
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_1_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_1_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1_0_1()); }
+	(rule__TransitionTimedGuard__Alternatives_1_1_0_1)
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionTimedGuard__Group_1_1_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl
+	rule__TransitionTimedGuard__Group_1_1_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getLeftCurlyBracketKeyword_1_1_0_1_0_0()); }
+	'{'
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getLeftCurlyBracketKeyword_1_1_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1_1_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl
+	rule__TransitionTimedGuard__Group_1_1_0_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_0_1()); }
+	(rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1)
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1_1_0_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionTimedGuardAccess().getRightCurlyBracketKeyword_1_1_0_1_0_2()); }
+	'}'
+	{ after(grammarAccess.getTransitionTimedGuardAccess().getRightCurlyBracketKeyword_1_1_0_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionEffect__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionEffect__Group__0__Impl
+	rule__TransitionEffect__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionEffect__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionEffectAccess().getTransitionEffectStatementParserRuleCall_0()); }
+	ruleTransitionEffectStatement
+	{ after(grammarAccess.getTransitionEffectAccess().getTransitionEffectStatementParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionEffect__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionEffect__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionEffect__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionEffectAccess().getGroup_1()); }
+	(rule__TransitionEffect__Group_1__0)*
+	{ after(grammarAccess.getTransitionEffectAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TransitionEffect__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionEffect__Group_1__0__Impl
+	rule__TransitionEffect__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionEffect__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionEffectAccess().getBlockStatementStatementAction_1_0()); }
+	()
+	{ after(grammarAccess.getTransitionEffectAccess().getBlockStatementStatementAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionEffect__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TransitionEffect__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionEffect__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTransitionEffectAccess().getStatementAssignment_1_1()); }
+	(rule__TransitionEffect__StatementAssignment_1_1)
+	{ after(grammarAccess.getTransitionEffectAccess().getStatementAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BlockStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BlockStatement__Group__0__Impl
+	rule__BlockStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBlockStatementAccess().getBlockStatementAction_0()); }
+	()
+	{ after(grammarAccess.getBlockStatementAccess().getBlockStatementAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BlockStatement__Group__1__Impl
+	rule__BlockStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBlockStatementAccess().getLeftCurlyBracketKeyword_1()); }
+	'{'
+	{ after(grammarAccess.getBlockStatementAccess().getLeftCurlyBracketKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BlockStatement__Group__2__Impl
+	rule__BlockStatement__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBlockStatementAccess().getOpAssignment_2()); }
+	(rule__BlockStatement__OpAssignment_2)?
+	{ after(grammarAccess.getBlockStatementAccess().getOpAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BlockStatement__Group__3__Impl
+	rule__BlockStatement__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBlockStatementAccess().getStatementAssignment_3()); }
+	(rule__BlockStatement__StatementAssignment_3)*
+	{ after(grammarAccess.getBlockStatementAccess().getStatementAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BlockStatement__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBlockStatementAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getBlockStatementAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExpressionStatement__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ExpressionStatement__Group_0__0__Impl
+	rule__ExpressionStatement__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_0_0()); }
+	(rule__ExpressionStatement__ExpressionAssignment_0_0)
+	{ after(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ExpressionStatement__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_0_1()); }
+	';'
+	{ after(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExpressionStatement__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ExpressionStatement__Group_1__0__Impl
+	rule__ExpressionStatement__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_1_0()); }
+	(rule__ExpressionStatement__ExpressionAssignment_1_0)
+	{ after(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ExpressionStatement__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_1_1()); }
+	';'
+	{ after(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExpressionStatement__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ExpressionStatement__Group_2__0__Impl
+	rule__ExpressionStatement__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_2_0()); }
+	(rule__ExpressionStatement__ExpressionAssignment_2_0)
+	{ after(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ExpressionStatement__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_2_1()); }
+	';'
+	{ after(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ExpressionStatement__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ExpressionStatement__Group_3__0__Impl
+	rule__ExpressionStatement__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_3_0()); }
+	(rule__ExpressionStatement__ExpressionAssignment_3_0)
+	{ after(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ExpressionStatement__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_3_1()); }
+	';'
+	{ after(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__GuardStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GuardStatement__Group__0__Impl
+	rule__GuardStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGuardStatementAccess().getGuardKeyword_0()); }
+	'guard'
+	{ after(grammarAccess.getGuardStatementAccess().getGuardKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GuardStatement__Group__1__Impl
+	rule__GuardStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGuardStatementAccess().getConditionAssignment_1()); }
+	(rule__GuardStatement__ConditionAssignment_1)
+	{ after(grammarAccess.getGuardStatementAccess().getConditionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GuardStatement__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGuardStatementAccess().getSemicolonKeyword_2()); }
+	';'
+	{ after(grammarAccess.getGuardStatementAccess().getSemicolonKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TimedGuardStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TimedGuardStatement__Group__0__Impl
+	rule__TimedGuardStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TimedGuardStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTimedGuardStatementAccess().getTguardKeyword_0()); }
+	'tguard'
+	{ after(grammarAccess.getTimedGuardStatementAccess().getTguardKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TimedGuardStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TimedGuardStatement__Group__1__Impl
+	rule__TimedGuardStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TimedGuardStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTimedGuardStatementAccess().getConditionAssignment_1()); }
+	(rule__TimedGuardStatement__ConditionAssignment_1)
+	{ after(grammarAccess.getTimedGuardStatementAccess().getConditionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TimedGuardStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TimedGuardStatement__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TimedGuardStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTimedGuardStatementAccess().getSemicolonKeyword_2()); }
+	';'
+	{ after(grammarAccess.getTimedGuardStatementAccess().getSemicolonKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EventGuardStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EventGuardStatement__Group__0__Impl
+	rule__EventGuardStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EventGuardStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEventGuardStatementAccess().getEventKeyword_0()); }
+	'event'
+	{ after(grammarAccess.getEventGuardStatementAccess().getEventKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EventGuardStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EventGuardStatement__Group__1__Impl
+	rule__EventGuardStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EventGuardStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEventGuardStatementAccess().getConditionAssignment_1()); }
+	(rule__EventGuardStatement__ConditionAssignment_1)
+	{ after(grammarAccess.getEventGuardStatementAccess().getConditionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EventGuardStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EventGuardStatement__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EventGuardStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEventGuardStatementAccess().getSemicolonKeyword_2()); }
+	';'
+	{ after(grammarAccess.getEventGuardStatementAccess().getSemicolonKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CheckSatGuardStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CheckSatGuardStatement__Group__0__Impl
+	rule__CheckSatGuardStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCheckSatGuardStatementAccess().getChecksatKeyword_0()); }
+	'checksat'
+	{ after(grammarAccess.getCheckSatGuardStatementAccess().getChecksatKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CheckSatGuardStatement__Group__1__Impl
+	rule__CheckSatGuardStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCheckSatGuardStatementAccess().getLessThanSignKeyword_1()); }
+	'<'
+	{ after(grammarAccess.getCheckSatGuardStatementAccess().getLessThanSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CheckSatGuardStatement__Group__2__Impl
+	rule__CheckSatGuardStatement__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCheckSatGuardStatementAccess().getSolverAssignment_2()); }
+	(rule__CheckSatGuardStatement__SolverAssignment_2)
+	{ after(grammarAccess.getCheckSatGuardStatementAccess().getSolverAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CheckSatGuardStatement__Group__3__Impl
+	rule__CheckSatGuardStatement__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCheckSatGuardStatementAccess().getGreaterThanSignKeyword_3()); }
+	'>'
+	{ after(grammarAccess.getCheckSatGuardStatementAccess().getGreaterThanSignKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CheckSatGuardStatement__Group__4__Impl
+	rule__CheckSatGuardStatement__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCheckSatGuardStatementAccess().getConditionAssignment_4()); }
+	(rule__CheckSatGuardStatement__ConditionAssignment_4)
+	{ after(grammarAccess.getCheckSatGuardStatementAccess().getConditionAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CheckSatGuardStatement__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCheckSatGuardStatementAccess().getSemicolonKeyword_5()); }
+	';'
+	{ after(grammarAccess.getCheckSatGuardStatementAccess().getSemicolonKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InputComStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group__0__Impl
+	rule__InputComStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getInputKeyword_0()); }
+	'input'
+	{ after(grammarAccess.getInputComStatementAccess().getInputKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group__1__Impl
+	rule__InputComStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getPortAssignment_1()); }
+	(rule__InputComStatement__PortAssignment_1)
+	{ after(grammarAccess.getInputComStatementAccess().getPortAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group__2__Impl
+	rule__InputComStatement__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getGroup_2()); }
+	(rule__InputComStatement__Group_2__0)?
+	{ after(grammarAccess.getInputComStatementAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group__3__Impl
+	rule__InputComStatement__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()); }
+	(rule__InputComStatement__UnorderedGroup_3)
+	{ after(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getSemicolonKeyword_4()); }
+	';'
+	{ after(grammarAccess.getInputComStatementAccess().getSemicolonKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InputComStatement__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_2__0__Impl
+	rule__InputComStatement__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getLeftParenthesisKeyword_2_0()); }
+	'('
+	{ after(grammarAccess.getInputComStatementAccess().getLeftParenthesisKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_2__1__Impl
+	rule__InputComStatement__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_1()); }
+	(rule__InputComStatement__LeftValueAssignment_2_1)
+	{ after(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_2__2__Impl
+	rule__InputComStatement__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getGroup_2_2()); }
+	(rule__InputComStatement__Group_2_2__0)*
+	{ after(grammarAccess.getInputComStatementAccess().getGroup_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getRightParenthesisKeyword_2_3()); }
+	')'
+	{ after(grammarAccess.getInputComStatementAccess().getRightParenthesisKeyword_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InputComStatement__Group_2_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_2_2__0__Impl
+	rule__InputComStatement__Group_2_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getCommaKeyword_2_2_0()); }
+	','
+	{ after(grammarAccess.getInputComStatementAccess().getCommaKeyword_2_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_2_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_2_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_2_1()); }
+	(rule__InputComStatement__LeftValueAssignment_2_2_1)
+	{ after(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InputComStatement__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_3_0__0__Impl
+	rule__InputComStatement__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0()); }
+	'<--'
+	{ after(grammarAccess.getInputComStatementAccess().getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getTargetAssignment_3_0_1()); }
+	(rule__InputComStatement__TargetAssignment_3_0_1)
+	{ after(grammarAccess.getInputComStatementAccess().getTargetAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InputComStatement__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_3_1__0__Impl
+	rule__InputComStatement__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getAlternatives_3_1_0()); }
+	(rule__InputComStatement__Alternatives_3_1_0)
+	{ after(grammarAccess.getInputComStatementAccess().getAlternatives_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputComStatementAccess().getRouteAssignment_3_1_1()); }
+	(rule__InputComStatement__RouteAssignment_3_1_1)
+	{ after(grammarAccess.getInputComStatementAccess().getRouteAssignment_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OutputComStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group__0__Impl
+	rule__OutputComStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getOutputKeyword_0()); }
+	'output'
+	{ after(grammarAccess.getOutputComStatementAccess().getOutputKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group__1__Impl
+	rule__OutputComStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getPortAssignment_1()); }
+	(rule__OutputComStatement__PortAssignment_1)
+	{ after(grammarAccess.getOutputComStatementAccess().getPortAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group__2__Impl
+	rule__OutputComStatement__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getGroup_2()); }
+	(rule__OutputComStatement__Group_2__0)?
+	{ after(grammarAccess.getOutputComStatementAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group__3__Impl
+	rule__OutputComStatement__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()); }
+	(rule__OutputComStatement__UnorderedGroup_3)
+	{ after(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getSemicolonKeyword_4()); }
+	';'
+	{ after(grammarAccess.getOutputComStatementAccess().getSemicolonKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OutputComStatement__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_2__0__Impl
+	rule__OutputComStatement__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getLeftParenthesisKeyword_2_0()); }
+	'('
+	{ after(grammarAccess.getOutputComStatementAccess().getLeftParenthesisKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_2__1__Impl
+	rule__OutputComStatement__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_1()); }
+	(rule__OutputComStatement__RigthValueAssignment_2_1)
+	{ after(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_2__2__Impl
+	rule__OutputComStatement__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getGroup_2_2()); }
+	(rule__OutputComStatement__Group_2_2__0)*
+	{ after(grammarAccess.getOutputComStatementAccess().getGroup_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getRightParenthesisKeyword_2_3()); }
+	')'
+	{ after(grammarAccess.getOutputComStatementAccess().getRightParenthesisKeyword_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OutputComStatement__Group_2_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_2_2__0__Impl
+	rule__OutputComStatement__Group_2_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getCommaKeyword_2_2_0()); }
+	','
+	{ after(grammarAccess.getOutputComStatementAccess().getCommaKeyword_2_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_2_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_2_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_2_1()); }
+	(rule__OutputComStatement__RigthValueAssignment_2_2_1)
+	{ after(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OutputComStatement__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_3_0__0__Impl
+	rule__OutputComStatement__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0()); }
+	'-->'
+	{ after(grammarAccess.getOutputComStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getTargetAssignment_3_0_1()); }
+	(rule__OutputComStatement__TargetAssignment_3_0_1)
+	{ after(grammarAccess.getOutputComStatementAccess().getTargetAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OutputComStatement__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_3_1__0__Impl
+	rule__OutputComStatement__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getAlternatives_3_1_0()); }
+	(rule__OutputComStatement__Alternatives_3_1_0)
+	{ after(grammarAccess.getOutputComStatementAccess().getAlternatives_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getOutputComStatementAccess().getRouteAssignment_3_1_1()); }
+	(rule__OutputComStatement__RouteAssignment_3_1_1)
+	{ after(grammarAccess.getOutputComStatementAccess().getRouteAssignment_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__IfStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IfStatement__Group__0__Impl
+	rule__IfStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIfStatementAccess().getIfKeyword_0()); }
+	'if'
+	{ after(grammarAccess.getIfStatementAccess().getIfKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IfStatement__Group__1__Impl
+	rule__IfStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIfStatementAccess().getConditionAssignment_1()); }
+	(rule__IfStatement__ConditionAssignment_1)
+	{ after(grammarAccess.getIfStatementAccess().getConditionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IfStatement__Group__2__Impl
+	rule__IfStatement__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIfStatementAccess().getBodyBlockAssignment_2()); }
+	(rule__IfStatement__BodyBlockAssignment_2)
+	{ after(grammarAccess.getIfStatementAccess().getBodyBlockAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IfStatement__Group__3__Impl
+	rule__IfStatement__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIfStatementAccess().getElseifStatementAssignment_3()); }
+	(rule__IfStatement__ElseifStatementAssignment_3)*
+	{ after(grammarAccess.getIfStatementAccess().getElseifStatementAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IfStatement__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIfStatementAccess().getGroup_4()); }
+	(rule__IfStatement__Group_4__0)?
+	{ after(grammarAccess.getIfStatementAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__IfStatement__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IfStatement__Group_4__0__Impl
+	rule__IfStatement__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIfStatementAccess().getElseKeyword_4_0()); }
+	'else'
+	{ after(grammarAccess.getIfStatementAccess().getElseKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IfStatement__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIfStatementAccess().getElseBlockAssignment_4_1()); }
+	(rule__IfStatement__ElseBlockAssignment_4_1)
+	{ after(grammarAccess.getIfStatementAccess().getElseBlockAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ElseIfStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ElseIfStatement__Group__0__Impl
+	rule__ElseIfStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getElseIfStatementAccess().getAlternatives_0()); }
+	(rule__ElseIfStatement__Alternatives_0)
+	{ after(grammarAccess.getElseIfStatementAccess().getAlternatives_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ElseIfStatement__Group__1__Impl
+	rule__ElseIfStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getElseIfStatementAccess().getConditionAssignment_1()); }
+	(rule__ElseIfStatement__ConditionAssignment_1)
+	{ after(grammarAccess.getElseIfStatementAccess().getConditionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ElseIfStatement__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getElseIfStatementAccess().getBodyBlockAssignment_2()); }
+	(rule__ElseIfStatement__BodyBlockAssignment_2)
+	{ after(grammarAccess.getElseIfStatementAccess().getBodyBlockAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ElseIfStatement__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ElseIfStatement__Group_0_1__0__Impl
+	rule__ElseIfStatement__Group_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getElseIfStatementAccess().getElseKeyword_0_1_0()); }
+	'else'
+	{ after(grammarAccess.getElseIfStatementAccess().getElseKeyword_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__Group_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ElseIfStatement__Group_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__Group_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getElseIfStatementAccess().getIfKeyword_0_1_1()); }
+	'if'
+	{ after(grammarAccess.getElseIfStatementAccess().getIfKeyword_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__WhileDoStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__WhileDoStatement__Group__0__Impl
+	rule__WhileDoStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__WhileDoStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWhileDoStatementAccess().getWhileKeyword_0()); }
+	'while'
+	{ after(grammarAccess.getWhileDoStatementAccess().getWhileKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__WhileDoStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__WhileDoStatement__Group__1__Impl
+	rule__WhileDoStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__WhileDoStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWhileDoStatementAccess().getConditionAssignment_1()); }
+	(rule__WhileDoStatement__ConditionAssignment_1)
+	{ after(grammarAccess.getWhileDoStatementAccess().getConditionAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__WhileDoStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__WhileDoStatement__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__WhileDoStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getWhileDoStatementAccess().getBodyBlockAssignment_2()); }
+	(rule__WhileDoStatement__BodyBlockAssignment_2)
+	{ after(grammarAccess.getWhileDoStatementAccess().getBodyBlockAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DoWhileStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DoWhileStatement__Group__0__Impl
+	rule__DoWhileStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDoWhileStatementAccess().getDoKeyword_0()); }
+	'do'
+	{ after(grammarAccess.getDoWhileStatementAccess().getDoKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DoWhileStatement__Group__1__Impl
+	rule__DoWhileStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDoWhileStatementAccess().getBodyBlockAssignment_1()); }
+	(rule__DoWhileStatement__BodyBlockAssignment_1)
+	{ after(grammarAccess.getDoWhileStatementAccess().getBodyBlockAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DoWhileStatement__Group__2__Impl
+	rule__DoWhileStatement__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2()); }
+	'while'
+	{ after(grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DoWhileStatement__Group__3__Impl
+	rule__DoWhileStatement__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_3()); }
+	(rule__DoWhileStatement__ConditionAssignment_3)
+	{ after(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DoWhileStatement__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_4()); }
+	';'
+	{ after(grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ForStatement__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_0__0__Impl
+	rule__ForStatement__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getForKeyword_0_0()); }
+	'for'
+	{ after(grammarAccess.getForStatementAccess().getForKeyword_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_0__1__Impl
+	rule__ForStatement__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getInitAssignment_0_1()); }
+	(rule__ForStatement__InitAssignment_0_1)?
+	{ after(grammarAccess.getForStatementAccess().getInitAssignment_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_0__2__Impl
+	rule__ForStatement__Group_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getSemicolonKeyword_0_2()); }
+	';'
+	{ after(grammarAccess.getForStatementAccess().getSemicolonKeyword_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_0__3__Impl
+	rule__ForStatement__Group_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getConditionAssignment_0_3()); }
+	(rule__ForStatement__ConditionAssignment_0_3)
+	{ after(grammarAccess.getForStatementAccess().getConditionAssignment_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_0__4__Impl
+	rule__ForStatement__Group_0__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getSemicolonKeyword_0_4()); }
+	';'
+	{ after(grammarAccess.getForStatementAccess().getSemicolonKeyword_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_0__5__Impl
+	rule__ForStatement__Group_0__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getIterateAssignment_0_5()); }
+	(rule__ForStatement__IterateAssignment_0_5)?
+	{ after(grammarAccess.getForStatementAccess().getIterateAssignment_0_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_0__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_0__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getBodyBlockAssignment_0_6()); }
+	(rule__ForStatement__BodyBlockAssignment_0_6)
+	{ after(grammarAccess.getForStatementAccess().getBodyBlockAssignment_0_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ForStatement__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_1__0__Impl
+	rule__ForStatement__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getForKeyword_1_0()); }
+	'for'
+	{ after(grammarAccess.getForStatementAccess().getForKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_1__1__Impl
+	rule__ForStatement__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getLeftParenthesisKeyword_1_1()); }
+	'('
+	{ after(grammarAccess.getForStatementAccess().getLeftParenthesisKeyword_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_1__2__Impl
+	rule__ForStatement__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getInitAssignment_1_2()); }
+	(rule__ForStatement__InitAssignment_1_2)?
+	{ after(grammarAccess.getForStatementAccess().getInitAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_1__3__Impl
+	rule__ForStatement__Group_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getSemicolonKeyword_1_3()); }
+	';'
+	{ after(grammarAccess.getForStatementAccess().getSemicolonKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_1__4__Impl
+	rule__ForStatement__Group_1__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getConditionAssignment_1_4()); }
+	(rule__ForStatement__ConditionAssignment_1_4)
+	{ after(grammarAccess.getForStatementAccess().getConditionAssignment_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_1__5__Impl
+	rule__ForStatement__Group_1__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getSemicolonKeyword_1_5()); }
+	';'
+	{ after(grammarAccess.getForStatementAccess().getSemicolonKeyword_1_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_1__6__Impl
+	rule__ForStatement__Group_1__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getIterateAssignment_1_6()); }
+	(rule__ForStatement__IterateAssignment_1_6)?
+	{ after(grammarAccess.getForStatementAccess().getIterateAssignment_1_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_1__7__Impl
+	rule__ForStatement__Group_1__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getRightParenthesisKeyword_1_7()); }
+	')'
+	{ after(grammarAccess.getForStatementAccess().getRightParenthesisKeyword_1_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForStatement__Group_1__8__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__Group_1__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForStatementAccess().getBodyBlockAssignment_1_8()); }
+	(rule__ForStatement__BodyBlockAssignment_1_8)
+	{ after(grammarAccess.getForStatementAccess().getBodyBlockAssignment_1_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ForEachStatement__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_0__0__Impl
+	rule__ForEachStatement__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getForKeyword_0_0()); }
+	'for'
+	{ after(grammarAccess.getForEachStatementAccess().getForKeyword_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_0__1__Impl
+	rule__ForEachStatement__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getIteratorAssignment_0_1()); }
+	(rule__ForEachStatement__IteratorAssignment_0_1)
+	{ after(grammarAccess.getForEachStatementAccess().getIteratorAssignment_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_0__2__Impl
+	rule__ForEachStatement__Group_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getColonKeyword_0_2()); }
+	':'
+	{ after(grammarAccess.getForEachStatementAccess().getColonKeyword_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_0__3__Impl
+	rule__ForEachStatement__Group_0__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_0_3()); }
+	(rule__ForEachStatement__EnumerationAssignment_0_3)
+	{ after(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_0__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_0__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_0__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_0_4()); }
+	(rule__ForEachStatement__BodyBlockAssignment_0_4)
+	{ after(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_0_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ForEachStatement__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_1__0__Impl
+	rule__ForEachStatement__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getForKeyword_1_0()); }
+	'for'
+	{ after(grammarAccess.getForEachStatementAccess().getForKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_1__1__Impl
+	rule__ForEachStatement__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getLeftParenthesisKeyword_1_1()); }
+	'('
+	{ after(grammarAccess.getForEachStatementAccess().getLeftParenthesisKeyword_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_1__2__Impl
+	rule__ForEachStatement__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getIteratorAssignment_1_2()); }
+	(rule__ForEachStatement__IteratorAssignment_1_2)
+	{ after(grammarAccess.getForEachStatementAccess().getIteratorAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_1__3__Impl
+	rule__ForEachStatement__Group_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getColonKeyword_1_3()); }
+	':'
+	{ after(grammarAccess.getForEachStatementAccess().getColonKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_1__4__Impl
+	rule__ForEachStatement__Group_1__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_1_4()); }
+	(rule__ForEachStatement__EnumerationAssignment_1_4)
+	{ after(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_1__5__Impl
+	rule__ForEachStatement__Group_1__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getRightParenthesisKeyword_1_5()); }
+	')'
+	{ after(grammarAccess.getForEachStatementAccess().getRightParenthesisKeyword_1_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ForEachStatement__Group_1__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__Group_1__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_1_6()); }
+	(rule__ForEachStatement__BodyBlockAssignment_1_6)
+	{ after(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_1_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InterruptStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InterruptStatement__Group__0__Impl
+	rule__InterruptStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInterruptStatementAccess().getKindAssignment_0()); }
+	(rule__InterruptStatement__KindAssignment_0)
+	{ after(grammarAccess.getInterruptStatementAccess().getKindAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InterruptStatement__Group__1__Impl
+	rule__InterruptStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInterruptStatementAccess().getAlternatives_1()); }
+	(rule__InterruptStatement__Alternatives_1)?
+	{ after(grammarAccess.getInterruptStatementAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InterruptStatement__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInterruptStatementAccess().getSemicolonKeyword_2()); }
+	';'
+	{ after(grammarAccess.getInterruptStatementAccess().getSemicolonKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InterruptStatement__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InterruptStatement__Group_1_1__0__Impl
+	rule__InterruptStatement__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInterruptStatementAccess().getLeftParenthesisKeyword_1_1_0()); }
+	'('
+	{ after(grammarAccess.getInterruptStatementAccess().getLeftParenthesisKeyword_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InterruptStatement__Group_1_1__1__Impl
+	rule__InterruptStatement__Group_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_1()); }
+	(rule__InterruptStatement__ExprAssignment_1_1_1)
+	{ after(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InterruptStatement__Group_1_1__2__Impl
+	rule__InterruptStatement__Group_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInterruptStatementAccess().getGroup_1_1_2()); }
+	(rule__InterruptStatement__Group_1_1_2__0)*
+	{ after(grammarAccess.getInterruptStatementAccess().getGroup_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InterruptStatement__Group_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInterruptStatementAccess().getRightParenthesisKeyword_1_1_3()); }
+	')'
+	{ after(grammarAccess.getInterruptStatementAccess().getRightParenthesisKeyword_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InterruptStatement__Group_1_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InterruptStatement__Group_1_1_2__0__Impl
+	rule__InterruptStatement__Group_1_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInterruptStatementAccess().getCommaKeyword_1_1_2_0()); }
+	','
+	{ after(grammarAccess.getInterruptStatementAccess().getCommaKeyword_1_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InterruptStatement__Group_1_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__Group_1_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_2_1()); }
+	(rule__InterruptStatement__ExprAssignment_1_1_2_1)
+	{ after(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ActivityStatement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ActivityStatement__Group__0__Impl
+	rule__ActivityStatement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getActivityStatementAccess().getActivityStatementAction_0()); }
+	()
+	{ after(grammarAccess.getActivityStatementAccess().getActivityStatementAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ActivityStatement__Group__1__Impl
+	rule__ActivityStatement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getActivityStatementAccess().getOpAssignment_1()); }
+	(rule__ActivityStatement__OpAssignment_1)
+	{ after(grammarAccess.getActivityStatementAccess().getOpAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ActivityStatement__Group__2__Impl
+	rule__ActivityStatement__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getActivityStatementAccess().getMachineAssignment_2()); }
+	(rule__ActivityStatement__MachineAssignment_2)
+	{ after(grammarAccess.getActivityStatementAccess().getMachineAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ActivityStatement__Group__3__Impl
+	rule__ActivityStatement__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getActivityStatementAccess().getTupleAssignment_3()); }
+	(rule__ActivityStatement__TupleAssignment_3)?
+	{ after(grammarAccess.getActivityStatementAccess().getTupleAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ActivityStatement__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getActivityStatementAccess().getSemicolonKeyword_4()); }
+	';'
+	{ after(grammarAccess.getActivityStatementAccess().getSemicolonKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_0__0__Impl
+	rule__InvokeStatement__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getExpressionAssignment_0_0()); }
+	(rule__InvokeStatement__ExpressionAssignment_0_0)
+	{ after(grammarAccess.getInvokeStatementAccess().getExpressionAssignment_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_0_1()); }
+	';'
+	{ after(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1__0__Impl
+	rule__InvokeStatement__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_1_0()); }
+	(rule__InvokeStatement__InvokableAssignment_1_0)
+	{ after(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1__1__Impl
+	rule__InvokeStatement__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_1_1()); }
+	(rule__InvokeStatement__ExecRoutineAssignment_1_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1__2__Impl
+	rule__InvokeStatement__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getArgsAssignment_1_2()); }
+	(rule__InvokeStatement__ArgsAssignment_1_2)?
+	{ after(grammarAccess.getInvokeStatementAccess().getArgsAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1__3__Impl
+	rule__InvokeStatement__Group_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_3()); }
+	')'
+	{ after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1__4__Impl
+	rule__InvokeStatement__Group_1__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getGroup_1_4()); }
+	(rule__InvokeStatement__Group_1_4__0)?
+	{ after(grammarAccess.getInvokeStatementAccess().getGroup_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_1_5()); }
+	';'
+	{ after(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_1_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_1_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4__0__Impl
+	rule__InvokeStatement__Group_1_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0()); }
+	'-->'
+	{ after(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getAlternatives_1_4_1()); }
+	(rule__InvokeStatement__Alternatives_1_4_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getAlternatives_1_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_1_4_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_0__0__Impl
+	rule__InvokeStatement__Group_1_4_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_0()); }
+	(rule__InvokeStatement__RetsAssignment_1_4_1_0_0)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0_1()); }
+	(rule__InvokeStatement__Group_1_4_1_0_1__0)*
+	{ after(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_1_4_1_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_0_1__0__Impl
+	rule__InvokeStatement__Group_1_4_1_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_0_1_0()); }
+	','
+	{ after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_1_1()); }
+	(rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_1_4_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_1__0__Impl
+	rule__InvokeStatement__Group_1_4_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_1_4_1_1_0()); }
+	'('
+	{ after(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_1_4_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_1__1__Impl
+	rule__InvokeStatement__Group_1_4_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_1()); }
+	(rule__InvokeStatement__RetsAssignment_1_4_1_1_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_1__2__Impl
+	rule__InvokeStatement__Group_1_4_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1_2()); }
+	(rule__InvokeStatement__Group_1_4_1_1_2__0)*
+	{ after(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_4_1_1_3()); }
+	')'
+	{ after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_4_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_1_4_1_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_1_2__0__Impl
+	rule__InvokeStatement__Group_1_4_1_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_1_2_0()); }
+	','
+	{ after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_1_4_1_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_1_4_1_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_2_1()); }
+	(rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2__0__Impl
+	rule__InvokeStatement__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_2_0()); }
+	(rule__InvokeStatement__ExecRoutineAssignment_2_0)
+	{ after(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2__1__Impl
+	rule__InvokeStatement__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_2_1()); }
+	(rule__InvokeStatement__InvokableAssignment_2_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2__2__Impl
+	rule__InvokeStatement__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_2()); }
+	'('
+	{ after(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2__3__Impl
+	rule__InvokeStatement__Group_2__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getArgsAssignment_2_3()); }
+	(rule__InvokeStatement__ArgsAssignment_2_3)?
+	{ after(grammarAccess.getInvokeStatementAccess().getArgsAssignment_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2__4__Impl
+	rule__InvokeStatement__Group_2__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_4()); }
+	')'
+	{ after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2__5__Impl
+	rule__InvokeStatement__Group_2__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getGroup_2_5()); }
+	(rule__InvokeStatement__Group_2_5__0)?
+	{ after(grammarAccess.getInvokeStatementAccess().getGroup_2_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_2_6()); }
+	';'
+	{ after(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_2_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_2_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5__0__Impl
+	rule__InvokeStatement__Group_2_5__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0()); }
+	'-->'
+	{ after(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getAlternatives_2_5_1()); }
+	(rule__InvokeStatement__Alternatives_2_5_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getAlternatives_2_5_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_2_5_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_0__0__Impl
+	rule__InvokeStatement__Group_2_5_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_0()); }
+	(rule__InvokeStatement__RetsAssignment_2_5_1_0_0)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0_1()); }
+	(rule__InvokeStatement__Group_2_5_1_0_1__0)*
+	{ after(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_2_5_1_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_0_1__0__Impl
+	rule__InvokeStatement__Group_2_5_1_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_0_1_0()); }
+	','
+	{ after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_1_1()); }
+	(rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_2_5_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_1__0__Impl
+	rule__InvokeStatement__Group_2_5_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_5_1_1_0()); }
+	'('
+	{ after(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_5_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_1__1__Impl
+	rule__InvokeStatement__Group_2_5_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_1()); }
+	(rule__InvokeStatement__RetsAssignment_2_5_1_1_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_1__2__Impl
+	rule__InvokeStatement__Group_2_5_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1_2()); }
+	(rule__InvokeStatement__Group_2_5_1_1_2__0)*
+	{ after(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_5_1_1_3()); }
+	')'
+	{ after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_5_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_2_5_1_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_1_2__0__Impl
+	rule__InvokeStatement__Group_2_5_1_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_1_2_0()); }
+	','
+	{ after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_2_5_1_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_2_5_1_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_2_1()); }
+	(rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3__0__Impl
+	rule__InvokeStatement__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getCallProcedureAssignment_3_0()); }
+	(rule__InvokeStatement__CallProcedureAssignment_3_0)
+	{ after(grammarAccess.getInvokeStatementAccess().getCallProcedureAssignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3__1__Impl
+	rule__InvokeStatement__Group_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_3_1()); }
+	(rule__InvokeStatement__InvokableAssignment_3_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3__2__Impl
+	rule__InvokeStatement__Group_3__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getArgsAssignment_3_2()); }
+	(rule__InvokeStatement__ArgsAssignment_3_2)?
+	{ after(grammarAccess.getInvokeStatementAccess().getArgsAssignment_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3__3__Impl
+	rule__InvokeStatement__Group_3__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getGroup_3_3()); }
+	(rule__InvokeStatement__Group_3_3__0)?
+	{ after(grammarAccess.getInvokeStatementAccess().getGroup_3_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_3_4()); }
+	';'
+	{ after(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_3_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_3_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3__0__Impl
+	rule__InvokeStatement__Group_3_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0()); }
+	'-->'
+	{ after(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getAlternatives_3_3_1()); }
+	(rule__InvokeStatement__Alternatives_3_3_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getAlternatives_3_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_3_3_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_0__0__Impl
+	rule__InvokeStatement__Group_3_3_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_0()); }
+	(rule__InvokeStatement__RetsAssignment_3_3_1_0_0)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0_1()); }
+	(rule__InvokeStatement__Group_3_3_1_0_1__0)*
+	{ after(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_3_3_1_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_0_1__0__Impl
+	rule__InvokeStatement__Group_3_3_1_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_0_1_0()); }
+	','
+	{ after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_1_1()); }
+	(rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_3_3_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_1__0__Impl
+	rule__InvokeStatement__Group_3_3_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_3_3_1_1_0()); }
+	'('
+	{ after(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_3_3_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_1__1__Impl
+	rule__InvokeStatement__Group_3_3_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_1()); }
+	(rule__InvokeStatement__RetsAssignment_3_3_1_1_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_1__2__Impl
+	rule__InvokeStatement__Group_3_3_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1_2()); }
+	(rule__InvokeStatement__Group_3_3_1_1_2__0)*
+	{ after(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_3_3_1_1_3()); }
+	')'
+	{ after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_3_3_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeStatement__Group_3_3_1_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_1_2__0__Impl
+	rule__InvokeStatement__Group_3_3_1_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_1_2_0()); }
+	','
+	{ after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeStatement__Group_3_3_1_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__Group_3_3_1_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_2_1()); }
+	(rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1)
+	{ after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__AssignmentExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AssignmentExpression__Group__0__Impl
+	rule__AssignmentExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AssignmentExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideAssignment_0()); }
+	(rule__AssignmentExpression__LeftHandSideAssignment_0)
+	{ after(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AssignmentExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AssignmentExpression__Group__1__Impl
+	rule__AssignmentExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AssignmentExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignment_1()); }
+	(rule__AssignmentExpression__OperatorAssignment_1)
+	{ after(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AssignmentExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AssignmentExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AssignmentExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideAssignment_2()); }
+	(rule__AssignmentExpression__RigthHandSideAssignment_2)
+	{ after(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LeftHandSideExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LeftHandSideExpression__Group__0__Impl
+	rule__LeftHandSideExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLeftHandSideExpressionAccess().getLeftHandSideExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLeftHandSideExpressionAccess().getLeftHandSideExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LeftHandSideExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLeftHandSideExpressionAccess().getAlternatives_1()); }
+	(rule__LeftHandSideExpression__Alternatives_1)
+	{ after(grammarAccess.getLeftHandSideExpressionAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LeftHandSideExpression__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LeftHandSideExpression__Group_1_1__0__Impl
+	rule__LeftHandSideExpression__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLeftHandSideExpressionAccess().getLeftParenthesisKeyword_1_1_0()); }
+	'('
+	{ after(grammarAccess.getLeftHandSideExpressionAccess().getLeftParenthesisKeyword_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LeftHandSideExpression__Group_1_1__1__Impl
+	rule__LeftHandSideExpression__Group_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_1_1()); }
+	(rule__LeftHandSideExpression__LvalueAssignment_1_1_1)
+	{ after(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__Group_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LeftHandSideExpression__Group_1_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__Group_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLeftHandSideExpressionAccess().getRightParenthesisKeyword_1_1_2()); }
+	')'
+	{ after(grammarAccess.getLeftHandSideExpressionAccess().getRightParenthesisKeyword_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalTestExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalTestExpression__Group__0__Impl
+	rule__ConditionalTestExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalTestExpressionAccess().getLogicalOrExpressionParserRuleCall_0()); }
+	ruleLogicalOrExpression
+	{ after(grammarAccess.getConditionalTestExpressionAccess().getLogicalOrExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalTestExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalTestExpressionAccess().getGroup_1()); }
+	(rule__ConditionalTestExpression__Group_1__0)?
+	{ after(grammarAccess.getConditionalTestExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ConditionalTestExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalTestExpression__Group_1__0__Impl
+	rule__ConditionalTestExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0()); }
+	()
+	{ after(grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalTestExpression__Group_1__1__Impl
+	rule__ConditionalTestExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalTestExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__ConditionalTestExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getConditionalTestExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalTestExpression__Group_1__2__Impl
+	rule__ConditionalTestExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalTestExpressionAccess().getThenOperandAssignment_1_2()); }
+	(rule__ConditionalTestExpression__ThenOperandAssignment_1_2)
+	{ after(grammarAccess.getConditionalTestExpressionAccess().getThenOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalTestExpression__Group_1__3__Impl
+	rule__ConditionalTestExpression__Group_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalTestExpressionAccess().getColonKeyword_1_3()); }
+	':'
+	{ after(grammarAccess.getConditionalTestExpressionAccess().getColonKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ConditionalTestExpression__Group_1__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__Group_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getConditionalTestExpressionAccess().getElseOperandAssignment_1_4()); }
+	(rule__ConditionalTestExpression__ElseOperandAssignment_1_4)
+	{ after(grammarAccess.getConditionalTestExpressionAccess().getElseOperandAssignment_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LogicalOrExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalOrExpression__Group__0__Impl
+	rule__LogicalOrExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalOrExpressionAccess().getLogicalAndExpressionParserRuleCall_0()); }
+	ruleLogicalAndExpression
+	{ after(grammarAccess.getLogicalOrExpressionAccess().getLogicalAndExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalOrExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalOrExpressionAccess().getGroup_1()); }
+	(rule__LogicalOrExpression__Group_1__0)?
+	{ after(grammarAccess.getLogicalOrExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LogicalOrExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalOrExpression__Group_1__0__Impl
+	rule__LogicalOrExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalOrExpression__Group_1__1__Impl
+	rule__LogicalOrExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalOrExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__LogicalOrExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getLogicalOrExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalOrExpression__Group_1__2__Impl
+	rule__LogicalOrExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__LogicalOrExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalOrExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalOrExpressionAccess().getGroup_1_3()); }
+	(rule__LogicalOrExpression__Group_1_3__0)*
+	{ after(grammarAccess.getLogicalOrExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LogicalOrExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalOrExpression__Group_1_3__0__Impl
+	rule__LogicalOrExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalOrExpressionAccess().getAlternatives_1_3_0()); }
+	(rule__LogicalOrExpression__Alternatives_1_3_0)
+	{ after(grammarAccess.getLogicalOrExpressionAccess().getAlternatives_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalOrExpression__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_3_1()); }
+	(rule__LogicalOrExpression__OperandAssignment_1_3_1)
+	{ after(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LogicalAndExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalAndExpression__Group__0__Impl
+	rule__LogicalAndExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalAndExpressionAccess().getBitwiseOrExpressionParserRuleCall_0()); }
+	ruleBitwiseOrExpression
+	{ after(grammarAccess.getLogicalAndExpressionAccess().getBitwiseOrExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalAndExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalAndExpressionAccess().getGroup_1()); }
+	(rule__LogicalAndExpression__Group_1__0)?
+	{ after(grammarAccess.getLogicalAndExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LogicalAndExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalAndExpression__Group_1__0__Impl
+	rule__LogicalAndExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalAndExpression__Group_1__1__Impl
+	rule__LogicalAndExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalAndExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__LogicalAndExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getLogicalAndExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalAndExpression__Group_1__2__Impl
+	rule__LogicalAndExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__LogicalAndExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalAndExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalAndExpressionAccess().getGroup_1_3()); }
+	(rule__LogicalAndExpression__Group_1_3__0)*
+	{ after(grammarAccess.getLogicalAndExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LogicalAndExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalAndExpression__Group_1_3__0__Impl
+	rule__LogicalAndExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalAndExpressionAccess().getAlternatives_1_3_0()); }
+	(rule__LogicalAndExpression__Alternatives_1_3_0)
+	{ after(grammarAccess.getLogicalAndExpressionAccess().getAlternatives_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalAndExpression__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_3_1()); }
+	(rule__LogicalAndExpression__OperandAssignment_1_3_1)
+	{ after(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseOrExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseOrExpression__Group__0__Impl
+	rule__BitwiseOrExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseXorExpressionParserRuleCall_0()); }
+	ruleBitwiseXorExpression
+	{ after(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseXorExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseOrExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1()); }
+	(rule__BitwiseOrExpression__Group_1__0)?
+	{ after(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseOrExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseOrExpression__Group_1__0__Impl
+	rule__BitwiseOrExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseOrExpression__Group_1__1__Impl
+	rule__BitwiseOrExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseOrExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__BitwiseOrExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getBitwiseOrExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseOrExpression__Group_1__2__Impl
+	rule__BitwiseOrExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__BitwiseOrExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseOrExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1_3()); }
+	(rule__BitwiseOrExpression__Group_1_3__0)*
+	{ after(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseOrExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseOrExpression__Group_1_3__0__Impl
+	rule__BitwiseOrExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseOrExpressionAccess().getVerticalLineKeyword_1_3_0()); }
+	'|'
+	{ after(grammarAccess.getBitwiseOrExpressionAccess().getVerticalLineKeyword_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseOrExpression__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_3_1()); }
+	(rule__BitwiseOrExpression__OperandAssignment_1_3_1)
+	{ after(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseXorExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseXorExpression__Group__0__Impl
+	rule__BitwiseXorExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAndExpressionParserRuleCall_0()); }
+	ruleBitwiseAndExpression
+	{ after(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAndExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseXorExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1()); }
+	(rule__BitwiseXorExpression__Group_1__0)?
+	{ after(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseXorExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseXorExpression__Group_1__0__Impl
+	rule__BitwiseXorExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseXorExpression__Group_1__1__Impl
+	rule__BitwiseXorExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseXorExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__BitwiseXorExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getBitwiseXorExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseXorExpression__Group_1__2__Impl
+	rule__BitwiseXorExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__BitwiseXorExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseXorExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1_3()); }
+	(rule__BitwiseXorExpression__Group_1_3__0)*
+	{ after(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseXorExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseXorExpression__Group_1_3__0__Impl
+	rule__BitwiseXorExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseXorExpressionAccess().getCircumflexAccentKeyword_1_3_0()); }
+	'^'
+	{ after(grammarAccess.getBitwiseXorExpressionAccess().getCircumflexAccentKeyword_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseXorExpression__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_3_1()); }
+	(rule__BitwiseXorExpression__OperandAssignment_1_3_1)
+	{ after(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseAndExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseAndExpression__Group__0__Impl
+	rule__BitwiseAndExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseAndExpressionAccess().getEqualityExpressionParserRuleCall_0()); }
+	ruleEqualityExpression
+	{ after(grammarAccess.getBitwiseAndExpressionAccess().getEqualityExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseAndExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1()); }
+	(rule__BitwiseAndExpression__Group_1__0)?
+	{ after(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseAndExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseAndExpression__Group_1__0__Impl
+	rule__BitwiseAndExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseAndExpression__Group_1__1__Impl
+	rule__BitwiseAndExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__BitwiseAndExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseAndExpression__Group_1__2__Impl
+	rule__BitwiseAndExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_2()); }
+	(rule__BitwiseAndExpression__OperandAssignment_1_2)
+	{ after(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseAndExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1_3()); }
+	(rule__BitwiseAndExpression__Group_1_3__0)*
+	{ after(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseAndExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseAndExpression__Group_1_3__0__Impl
+	rule__BitwiseAndExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseAndExpressionAccess().getAmpersandKeyword_1_3_0()); }
+	'&'
+	{ after(grammarAccess.getBitwiseAndExpressionAccess().getAmpersandKeyword_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseAndExpression__Group_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_3_1()); }
+	(rule__BitwiseAndExpression__OperandAssignment_1_3_1)
+	{ after(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EqualityExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group__0__Impl
+	rule__EqualityExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0()); }
+	ruleRelationalExpression
+	{ after(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getGroup_1()); }
+	(rule__EqualityExpression__Group_1__0)?
+	{ after(grammarAccess.getEqualityExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EqualityExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group_1__0__Impl
+	rule__EqualityExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group_1__1__Impl
+	rule__EqualityExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__EqualityExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EqualityExpression__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEqualityExpressionAccess().getRigthOperandAssignment_1_2()); }
+	(rule__EqualityExpression__RigthOperandAssignment_1_2)
+	{ after(grammarAccess.getEqualityExpressionAccess().getRigthOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RelationalExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group__0__Impl
+	rule__RelationalExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0()); }
+	ruleAdditiveExpression
+	{ after(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getGroup_1()); }
+	(rule__RelationalExpression__Group_1__0)?
+	{ after(grammarAccess.getRelationalExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RelationalExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1__0__Impl
+	rule__RelationalExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0()); }
+	()
+	{ after(grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1__1__Impl
+	rule__RelationalExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1()); }
+	(rule__RelationalExpression__OperatorAssignment_1_1)
+	{ after(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1__2__Impl
+	rule__RelationalExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_2()); }
+	(rule__RelationalExpression__RigthOperandAssignment_1_2)
+	{ after(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getGroup_1_3()); }
+	(rule__RelationalExpression__Group_1_3__0)?
+	{ after(grammarAccess.getRelationalExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__RelationalExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1_3__0__Impl
+	rule__RelationalExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getRelationalTernaryExpressionLeftRelationAction_1_3_0()); }
+	()
+	{ after(grammarAccess.getRelationalExpressionAccess().getRelationalTernaryExpressionLeftRelationAction_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1_3__1__Impl
+	rule__RelationalExpression__Group_1_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getRigthOperatorAssignment_1_3_1()); }
+	(rule__RelationalExpression__RigthOperatorAssignment_1_3_1)
+	{ after(grammarAccess.getRelationalExpressionAccess().getRigthOperatorAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__RelationalExpression__Group_1_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__Group_1_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_3_2()); }
+	(rule__RelationalExpression__RigthOperandAssignment_1_3_2)
+	{ after(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__AdditiveExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group__0__Impl
+	rule__AdditiveExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0()); }
+	ruleMultiplicativeExpression
+	{ after(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getAlternatives_1()); }
+	(rule__AdditiveExpression__Alternatives_1)*
+	{ after(grammarAccess.getAdditiveExpressionAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__AdditiveExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_0__0__Impl
+	rule__AdditiveExpression__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()); }
+	()
+	{ after(grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_0__1__Impl
+	rule__AdditiveExpression__Group_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_0_1()); }
+	(rule__AdditiveExpression__OperatorAssignment_1_0_1)
+	{ after(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_0__2__Impl
+	rule__AdditiveExpression__Group_1_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_2()); }
+	(rule__AdditiveExpression__OperandAssignment_1_0_2)
+	{ after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0_3()); }
+	(rule__AdditiveExpression__Group_1_0_3__0)*
+	{ after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__AdditiveExpression__Group_1_0_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_0_3__0__Impl
+	rule__AdditiveExpression__Group_1_0_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_0_3_0()); }
+	'+'
+	{ after(grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_0_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_0_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_0_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_3_1()); }
+	(rule__AdditiveExpression__OperandAssignment_1_0_3_1)
+	{ after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__AdditiveExpression__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_1__0__Impl
+	rule__AdditiveExpression__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()); }
+	()
+	{ after(grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_1__1__Impl
+	rule__AdditiveExpression__Group_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1_1()); }
+	(rule__AdditiveExpression__OperatorAssignment_1_1_1)
+	{ after(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_1__2__Impl
+	rule__AdditiveExpression__Group_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_2()); }
+	(rule__AdditiveExpression__OperandAssignment_1_1_2)
+	{ after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1_3()); }
+	(rule__AdditiveExpression__Group_1_1_3__0)*
+	{ after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__AdditiveExpression__Group_1_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_1_3__0__Impl
+	rule__AdditiveExpression__Group_1_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getHyphenMinusKeyword_1_1_3_0()); }
+	'-'
+	{ after(grammarAccess.getAdditiveExpressionAccess().getHyphenMinusKeyword_1_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__AdditiveExpression__Group_1_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__Group_1_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_3_1()); }
+	(rule__AdditiveExpression__OperandAssignment_1_1_3_1)
+	{ after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group__0__Impl
+	rule__MultiplicativeExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getUnaryExpressionParserRuleCall_0()); }
+	ruleUnaryExpression
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getUnaryExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1()); }
+	(rule__MultiplicativeExpression__Alternatives_1)*
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0__0__Impl
+	rule__MultiplicativeExpression__Group_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()); }
+	()
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0__1__Impl
+	rule__MultiplicativeExpression__Group_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1()); }
+	(rule__MultiplicativeExpression__OperatorAssignment_1_0_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0__2__Impl
+	rule__MultiplicativeExpression__Group_1_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_0_2)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3()); }
+	(rule__MultiplicativeExpression__Group_1_0_3__0)*
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_0_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_0_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0()); }
+	'*'
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_0_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_0_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_0_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1__0__Impl
+	rule__MultiplicativeExpression__Group_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()); }
+	()
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1__1__Impl
+	rule__MultiplicativeExpression__Group_1_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1()); }
+	(rule__MultiplicativeExpression__OperatorAssignment_1_1_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1__2__Impl
+	rule__MultiplicativeExpression__Group_1_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_1_2)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3()); }
+	(rule__MultiplicativeExpression__Group_1_1_3__0)*
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0()); }
+	'**'
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_1_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_1_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2__0__Impl
+	rule__MultiplicativeExpression__Group_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0()); }
+	()
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2__1__Impl
+	rule__MultiplicativeExpression__Group_1_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1()); }
+	(rule__MultiplicativeExpression__OperatorAssignment_1_2_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2__2__Impl
+	rule__MultiplicativeExpression__Group_1_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_2_2)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3()); }
+	(rule__MultiplicativeExpression__Group_1_2_3__0)*
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_2_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_2_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0()); }
+	'/'
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_2_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_2_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_2_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0()); }
+	()
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3__1__Impl
+	rule__MultiplicativeExpression__Group_1_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1()); }
+	(rule__MultiplicativeExpression__OperatorAssignment_1_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3__2__Impl
+	rule__MultiplicativeExpression__Group_1_3__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_3_2)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3()); }
+	(rule__MultiplicativeExpression__Group_1_3_3__0)*
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MultiplicativeExpression__Group_1_3_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3_3__0__Impl
+	rule__MultiplicativeExpression__Group_1_3_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0()); }
+	'%'
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MultiplicativeExpression__Group_1_3_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__Group_1_3_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1()); }
+	(rule__MultiplicativeExpression__OperandAssignment_1_3_3_1)
+	{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__IncrementOrDecrementPostfixExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IncrementOrDecrementPostfixExpression__Group__0__Impl
+	rule__IncrementOrDecrementPostfixExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPostfixExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideAssignment_0()); }
+	(rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0)
+	{ after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPostfixExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IncrementOrDecrementPostfixExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPostfixExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAssignment_1()); }
+	(rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1)
+	{ after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__IncrementOrDecrementPrefixExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IncrementOrDecrementPrefixExpression__Group__0__Impl
+	rule__IncrementOrDecrementPrefixExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPrefixExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAssignment_0()); }
+	(rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0)
+	{ after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPrefixExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__IncrementOrDecrementPrefixExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPrefixExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideAssignment_1()); }
+	(rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1)
+	{ after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__NewfreshExpression__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NewfreshExpression__Group_0__0__Impl
+	rule__NewfreshExpression__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_0_0()); }
+	'newfresh'
+	{ after(grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NewfreshExpression__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_0_1()); }
+	(rule__NewfreshExpression__LeftHandSideAssignment_0_1)
+	{ after(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__NewfreshExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NewfreshExpression__Group_1__0__Impl
+	rule__NewfreshExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNewfreshExpressionAccess().getLeftParenthesisColonKeyword_1_0()); }
+	'(:'
+	{ after(grammarAccess.getNewfreshExpressionAccess().getLeftParenthesisColonKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NewfreshExpression__Group_1__1__Impl
+	rule__NewfreshExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_1_1()); }
+	(rule__NewfreshExpression__LeftHandSideAssignment_1_1)
+	{ after(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NewfreshExpression__Group_1__2__Impl
+	rule__NewfreshExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_1_2()); }
+	'newfresh'
+	{ after(grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NewfreshExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNewfreshExpressionAccess().getRightParenthesisKeyword_1_3()); }
+	')'
+	{ after(grammarAccess.getNewfreshExpressionAccess().getRightParenthesisKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__CastExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CastExpression__Group__0__Impl
+	rule__CastExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCastExpressionAccess().getCtorKeyword_0()); }
+	'ctor'
+	{ after(grammarAccess.getCastExpressionAccess().getCtorKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CastExpression__Group__1__Impl
+	rule__CastExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCastExpressionAccess().getLessThanSignKeyword_1()); }
+	'<'
+	{ after(grammarAccess.getCastExpressionAccess().getLessThanSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CastExpression__Group__2__Impl
+	rule__CastExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCastExpressionAccess().getDatatypeAssignment_2()); }
+	(rule__CastExpression__DatatypeAssignment_2)
+	{ after(grammarAccess.getCastExpressionAccess().getDatatypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CastExpression__Group__3__Impl
+	rule__CastExpression__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCastExpressionAccess().getGreaterThanSignKeyword_3()); }
+	'>'
+	{ after(grammarAccess.getCastExpressionAccess().getGreaterThanSignKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CastExpression__Group__4__Impl
+	rule__CastExpression__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCastExpressionAccess().getLeftParenthesisKeyword_4()); }
+	'('
+	{ after(grammarAccess.getCastExpressionAccess().getLeftParenthesisKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CastExpression__Group__5__Impl
+	rule__CastExpression__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCastExpressionAccess().getOperandAssignment_5()); }
+	(rule__CastExpression__OperandAssignment_5)
+	{ after(grammarAccess.getCastExpressionAccess().getOperandAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__CastExpression__Group__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getCastExpressionAccess().getRightParenthesisKeyword_6()); }
+	')'
+	{ after(grammarAccess.getCastExpressionAccess().getRightParenthesisKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ArithmeticUnaryExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ArithmeticUnaryExpression__Group__0__Impl
+	rule__ArithmeticUnaryExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArithmeticUnaryExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorAssignment_0()); }
+	(rule__ArithmeticUnaryExpression__OperatorAssignment_0)
+	{ after(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArithmeticUnaryExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ArithmeticUnaryExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArithmeticUnaryExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandAssignment_1()); }
+	(rule__ArithmeticUnaryExpression__OperandAssignment_1)
+	{ after(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LogicalUnaryExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalUnaryExpression__Group__0__Impl
+	rule__LogicalUnaryExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalUnaryExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAssignment_0()); }
+	(rule__LogicalUnaryExpression__OperatorAssignment_0)
+	{ after(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalUnaryExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LogicalUnaryExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalUnaryExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLogicalUnaryExpressionAccess().getOperandAssignment_1()); }
+	(rule__LogicalUnaryExpression__OperandAssignment_1)
+	{ after(grammarAccess.getLogicalUnaryExpressionAccess().getOperandAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BitwiseUnaryExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseUnaryExpression__Group__0__Impl
+	rule__BitwiseUnaryExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseUnaryExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorAssignment_0()); }
+	(rule__BitwiseUnaryExpression__OperatorAssignment_0)
+	{ after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseUnaryExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BitwiseUnaryExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseUnaryExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandAssignment_1()); }
+	(rule__BitwiseUnaryExpression__OperandAssignment_1)
+	{ after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group__0__Impl
+	rule__PrimaryExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getBaseExpressionParserRuleCall_0()); }
+	ruleBaseExpression
+	{ after(grammarAccess.getPrimaryExpressionAccess().getBaseExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group__1__Impl
+	rule__PrimaryExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_1()); }
+	(rule__PrimaryExpression__Group_1__0)*
+	{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_2()); }
+	(rule__PrimaryExpression__Group_2__0)?
+	{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1__0__Impl
+	rule__PrimaryExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0()); }
+	()
+	{ after(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1__1__Impl
+	rule__PrimaryExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_1_1()); }
+	'.'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1__2__Impl
+	rule__PrimaryExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_1_2()); }
+	(rule__PrimaryExpression__ElementAssignment_1_2)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getAlternatives_1_3()); }
+	(rule__PrimaryExpression__Alternatives_1_3)?
+	{ after(grammarAccess.getPrimaryExpressionAccess().getAlternatives_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_1_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1_3_0__0__Impl
+	rule__PrimaryExpression__Group_1_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_0_0()); }
+	(rule__PrimaryExpression__KindAssignment_1_3_0_0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1_3_0__1__Impl
+	rule__PrimaryExpression__Group_1_3_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_0_1()); }
+	(rule__PrimaryExpression__ArgAssignment_1_3_0_1)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1_3_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_1_3_0_2()); }
+	']'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_1_3_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_1_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1_3_1__0__Impl
+	rule__PrimaryExpression__Group_1_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_1_0()); }
+	(rule__PrimaryExpression__KindAssignment_1_3_1_0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1_3_1__1__Impl
+	rule__PrimaryExpression__Group_1_3_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_1_1()); }
+	(rule__PrimaryExpression__ArgAssignment_1_3_1_1)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_1_3_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_1_3_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_1_3_1_2()); }
+	')'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_1_3_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2__0__Impl
+	rule__PrimaryExpression__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0()); }
+	()
+	{ after(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2__1__Impl
+	rule__PrimaryExpression__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1()); }
+	'->'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2__2__Impl
+	rule__PrimaryExpression__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_2()); }
+	(rule__PrimaryExpression__ElementAssignment_2_2)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2__3__Impl
+	rule__PrimaryExpression__Group_2__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_3()); }
+	(rule__PrimaryExpression__Alternatives_2_3)?
+	{ after(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4()); }
+	(rule__PrimaryExpression__Group_2_4__0)*
+	{ after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_2_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_3_0__0__Impl
+	rule__PrimaryExpression__Group_2_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_0_0()); }
+	(rule__PrimaryExpression__KindAssignment_2_3_0_0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_3_0__1__Impl
+	rule__PrimaryExpression__Group_2_3_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_0_1()); }
+	(rule__PrimaryExpression__ArgAssignment_2_3_0_1)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_3_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_3_0_2()); }
+	']'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_3_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_2_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_3_1__0__Impl
+	rule__PrimaryExpression__Group_2_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_1_0()); }
+	(rule__PrimaryExpression__KindAssignment_2_3_1_0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_3_1__1__Impl
+	rule__PrimaryExpression__Group_2_3_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_1_1()); }
+	(rule__PrimaryExpression__ArgAssignment_2_3_1_1)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_3_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_3_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_3_1_2()); }
+	')'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_3_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_2_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4__0__Impl
+	rule__PrimaryExpression__Group_2_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()); }
+	()
+	{ after(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4__1__Impl
+	rule__PrimaryExpression__Group_2_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_2_4_1()); }
+	'.'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_2_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4__2__Impl
+	rule__PrimaryExpression__Group_2_4__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_4_2()); }
+	(rule__PrimaryExpression__ElementAssignment_2_4_2)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_4_3()); }
+	(rule__PrimaryExpression__Alternatives_2_4_3)?
+	{ after(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_4_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_2_4_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4_3_0__0__Impl
+	rule__PrimaryExpression__Group_2_4_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_0_0()); }
+	(rule__PrimaryExpression__KindAssignment_2_4_3_0_0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4_3_0__1__Impl
+	rule__PrimaryExpression__Group_2_4_3_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_0_1()); }
+	(rule__PrimaryExpression__ArgAssignment_2_4_3_0_1)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4_3_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_4_3_0_2()); }
+	']'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_4_3_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PrimaryExpression__Group_2_4_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4_3_1__0__Impl
+	rule__PrimaryExpression__Group_2_4_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_1_0()); }
+	(rule__PrimaryExpression__KindAssignment_2_4_3_1_0)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4_3_1__1__Impl
+	rule__PrimaryExpression__Group_2_4_3_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_1_1()); }
+	(rule__PrimaryExpression__ArgAssignment_2_4_3_1_1)
+	{ after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PrimaryExpression__Group_2_4_3_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__Group_2_4_3_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_4_3_1_2()); }
+	')'
+	{ after(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_4_3_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__BaseExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BaseExpression__Group_1__0__Impl
+	rule__BaseExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BaseExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBaseExpressionAccess().getLeftParenthesisKeyword_1_0()); }
+	'('
+	{ after(grammarAccess.getBaseExpressionAccess().getLeftParenthesisKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BaseExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BaseExpression__Group_1__1__Impl
+	rule__BaseExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BaseExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBaseExpressionAccess().getExpressionParserRuleCall_1_1()); }
+	ruleExpression
+	{ after(grammarAccess.getBaseExpressionAccess().getExpressionParserRuleCall_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BaseExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__BaseExpression__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BaseExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getBaseExpressionAccess().getRightParenthesisKeyword_1_2()); }
+	')'
+	{ after(grammarAccess.getBaseExpressionAccess().getRightParenthesisKeyword_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InvokeExpressionDeprecated__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeExpressionDeprecated__Group__0__Impl
+	rule__InvokeExpressionDeprecated__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeExpressionDeprecated__Group__1__Impl
+	rule__InvokeExpressionDeprecated__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getLeftParenthesisColonKeyword_1()); }
+	'(:'
+	{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getLeftParenthesisColonKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeExpressionDeprecated__Group__2__Impl
+	rule__InvokeExpressionDeprecated__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_2()); }
+	(rule__InvokeExpressionDeprecated__ArgsAssignment_2)
+	{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeExpressionDeprecated__Group__3__Impl
+	rule__InvokeExpressionDeprecated__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeAssignment_3()); }
+	(rule__InvokeExpressionDeprecated__InvokeAssignment_3)
+	{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeExpressionDeprecated__Group__4__Impl
+	rule__InvokeExpressionDeprecated__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_4()); }
+	(rule__InvokeExpressionDeprecated__ArgsAssignment_4)*
+	{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InvokeExpressionDeprecated__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getRightParenthesisKeyword_5()); }
+	')'
+	{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getRightParenthesisKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InstantiationExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstantiationExpression__Group__0__Impl
+	rule__InstantiationExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstantiationExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstantiationExpressionAccess().getInstantiationExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getInstantiationExpressionAccess().getInstantiationExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstantiationExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstantiationExpression__Group__1__Impl
+	rule__InstantiationExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstantiationExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstantiationExpressionAccess().getInstanceAssignment_1()); }
+	(rule__InstantiationExpression__InstanceAssignment_1)
+	{ after(grammarAccess.getInstantiationExpressionAccess().getInstanceAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstantiationExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InstantiationExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstantiationExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInstantiationExpressionAccess().getSemicolonKeyword_2()); }
+	';'
+	{ after(grammarAccess.getInstantiationExpressionAccess().getSemicolonKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DynamicInstanceSpecification__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group__0__Impl
+	rule__DynamicInstanceSpecification__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getInstanceMachineAction_0()); }
+	()
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getInstanceMachineAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group__1__Impl
+	rule__DynamicInstanceSpecification__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getNewKeyword_1()); }
+	'new'
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getNewKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group__2__Impl
+	rule__DynamicInstanceSpecification__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getModelAssignment_2()); }
+	(rule__DynamicInstanceSpecification__ModelAssignment_2)
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getModelAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getAlternatives_3()); }
+	(rule__DynamicInstanceSpecification__Alternatives_3)?
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getAlternatives_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DynamicInstanceSpecification__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_0__0__Impl
+	rule__DynamicInstanceSpecification__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getLeftParenthesisKeyword_3_0_0()); }
+	'('
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getLeftParenthesisKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_0__1__Impl
+	rule__DynamicInstanceSpecification__Group_3_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1()); }
+	(rule__DynamicInstanceSpecification__Group_3_0_1__0)?
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getRightParenthesisKeyword_3_0_2()); }
+	')'
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getRightParenthesisKeyword_3_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DynamicInstanceSpecification__Group_3_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl
+	rule__DynamicInstanceSpecification__Group_3_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_0()); }
+	(rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0)
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1_1()); }
+	(rule__DynamicInstanceSpecification__Group_3_0_1_1__0)*
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DynamicInstanceSpecification__Group_3_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl
+	rule__DynamicInstanceSpecification__Group_3_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getCommaKeyword_3_0_1_1_0()); }
+	','
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getCommaKeyword_3_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_1_1()); }
+	(rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1)
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DynamicInstanceSpecification__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_1__0__Impl
+	rule__DynamicInstanceSpecification__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getLeftCurlyBracketKeyword_3_1_0()); }
+	'{'
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getLeftCurlyBracketKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_1__1__Impl
+	rule__DynamicInstanceSpecification__Group_3_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1_1()); }
+	(rule__DynamicInstanceSpecification__Group_3_1_1__0)*
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getRightCurlyBracketKeyword_3_1_2()); }
+	'}'
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getRightCurlyBracketKeyword_3_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DynamicInstanceSpecification__Group_3_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl
+	rule__DynamicInstanceSpecification__Group_3_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_1_1_0()); }
+	(rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0)
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getSemicolonKeyword_3_1_1_1()); }
+	';'
+	{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getSemicolonKeyword_3_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__TupleParameterExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TupleParameterExpression__Group__0__Impl
+	rule__TupleParameterExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TupleParameterExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTupleParameterExpressionAccess().getLeftParenthesisKeyword_0()); }
+	'('
+	{ after(grammarAccess.getTupleParameterExpressionAccess().getLeftParenthesisKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TupleParameterExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TupleParameterExpression__Group__1__Impl
+	rule__TupleParameterExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TupleParameterExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTupleParameterExpressionAccess().getMixTupleExpressionListParserRuleCall_1()); }
+	ruleMixTupleExpressionList
+	{ after(grammarAccess.getTupleParameterExpressionAccess().getMixTupleExpressionListParserRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TupleParameterExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__TupleParameterExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TupleParameterExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getTupleParameterExpressionAccess().getRightParenthesisKeyword_2()); }
+	')'
+	{ after(grammarAccess.getTupleParameterExpressionAccess().getRightParenthesisKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MixTupleExpressionList__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MixTupleExpressionList__Group__0__Impl
+	rule__MixTupleExpressionList__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMixTupleExpressionListAccess().getMixTupleExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getMixTupleExpressionListAccess().getMixTupleExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MixTupleExpressionList__Group__1__Impl
+	rule__MixTupleExpressionList__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_1()); }
+	(rule__MixTupleExpressionList__ValueAssignment_1)
+	{ after(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MixTupleExpressionList__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMixTupleExpressionListAccess().getGroup_2()); }
+	(rule__MixTupleExpressionList__Group_2__0)*
+	{ after(grammarAccess.getMixTupleExpressionListAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MixTupleExpressionList__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MixTupleExpressionList__Group_2__0__Impl
+	rule__MixTupleExpressionList__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMixTupleExpressionListAccess().getCommaKeyword_2_0()); }
+	','
+	{ after(grammarAccess.getMixTupleExpressionListAccess().getCommaKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MixTupleExpressionList__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_2_1()); }
+	(rule__MixTupleExpressionList__ValueAssignment_2_1)
+	{ after(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PositionalTupleExpressionList__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PositionalTupleExpressionList__Group__0__Impl
+	rule__PositionalTupleExpressionList__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PositionalTupleExpressionList__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_0()); }
+	(rule__PositionalTupleExpressionList__ValueAssignment_0)
+	{ after(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PositionalTupleExpressionList__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PositionalTupleExpressionList__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PositionalTupleExpressionList__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPositionalTupleExpressionListAccess().getGroup_1()); }
+	(rule__PositionalTupleExpressionList__Group_1__0)*
+	{ after(grammarAccess.getPositionalTupleExpressionListAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PositionalTupleExpressionList__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PositionalTupleExpressionList__Group_1__0__Impl
+	rule__PositionalTupleExpressionList__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PositionalTupleExpressionList__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPositionalTupleExpressionListAccess().getCommaKeyword_1_0()); }
+	','
+	{ after(grammarAccess.getPositionalTupleExpressionListAccess().getCommaKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PositionalTupleExpressionList__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PositionalTupleExpressionList__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PositionalTupleExpressionList__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_1_1()); }
+	(rule__PositionalTupleExpressionList__ValueAssignment_1_1)
+	{ after(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__NamedExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NamedExpression__Group__0__Impl
+	rule__NamedExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NamedExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNamedExpressionAccess().getNameAssignment_0()); }
+	(rule__NamedExpression__NameAssignment_0)
+	{ after(grammarAccess.getNamedExpressionAccess().getNameAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NamedExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NamedExpression__Group__1__Impl
+	rule__NamedExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NamedExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNamedExpressionAccess().getAlternatives_1()); }
+	(rule__NamedExpression__Alternatives_1)
+	{ after(grammarAccess.getNamedExpressionAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NamedExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NamedExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NamedExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNamedExpressionAccess().getExpressionAssignment_2()); }
+	(rule__NamedExpression__ExpressionAssignment_2)
+	{ after(grammarAccess.getNamedExpressionAccess().getExpressionAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralBooleanExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralBooleanExpression__Group__0__Impl
+	rule__LiteralBooleanExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralBooleanExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralBooleanExpressionAccess().getLiteralBooleanExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralBooleanExpressionAccess().getLiteralBooleanExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralBooleanExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralBooleanExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralBooleanExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralBooleanExpressionAccess().getValueAssignment_1()); }
+	(rule__LiteralBooleanExpression__ValueAssignment_1)
+	{ after(grammarAccess.getLiteralBooleanExpressionAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralIntegerExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralIntegerExpression__Group__0__Impl
+	rule__LiteralIntegerExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralIntegerExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralIntegerExpressionAccess().getLiteralIntegerExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralIntegerExpressionAccess().getLiteralIntegerExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralIntegerExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralIntegerExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralIntegerExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralIntegerExpressionAccess().getValueAssignment_1()); }
+	(rule__LiteralIntegerExpression__ValueAssignment_1)
+	{ after(grammarAccess.getLiteralIntegerExpressionAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralRationalExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralRationalExpression__Group__0__Impl
+	rule__LiteralRationalExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralRationalExpressionAccess().getLiteralRationalExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralRationalExpressionAccess().getLiteralRationalExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralRationalExpression__Group__1__Impl
+	rule__LiteralRationalExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorAssignment_1()); }
+	(rule__LiteralRationalExpression__NumeratorAssignment_1)
+	{ after(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralRationalExpression__Group__2__Impl
+	rule__LiteralRationalExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralRationalExpressionAccess().getSolidusKeyword_2()); }
+	'/'
+	{ after(grammarAccess.getLiteralRationalExpressionAccess().getSolidusKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralRationalExpression__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorAssignment_3()); }
+	(rule__LiteralRationalExpression__DenominatorAssignment_3)
+	{ after(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralFloatExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralFloatExpression__Group__0__Impl
+	rule__LiteralFloatExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralFloatExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralFloatExpressionAccess().getLiteralFloatExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralFloatExpressionAccess().getLiteralFloatExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralFloatExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralFloatExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralFloatExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralFloatExpressionAccess().getValueAssignment_1()); }
+	(rule__LiteralFloatExpression__ValueAssignment_1)
+	{ after(grammarAccess.getLiteralFloatExpressionAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralCharacterExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCharacterExpression__Group__0__Impl
+	rule__LiteralCharacterExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCharacterExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCharacterExpressionAccess().getLiteralCharacterExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralCharacterExpressionAccess().getLiteralCharacterExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCharacterExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCharacterExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCharacterExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCharacterExpressionAccess().getValueAssignment_1()); }
+	(rule__LiteralCharacterExpression__ValueAssignment_1)
+	{ after(grammarAccess.getLiteralCharacterExpressionAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralStringExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralStringExpression__Group__0__Impl
+	rule__LiteralStringExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralStringExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralStringExpressionAccess().getLiteralStringExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralStringExpressionAccess().getLiteralStringExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralStringExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralStringExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralStringExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralStringExpressionAccess().getValueAssignment_1()); }
+	(rule__LiteralStringExpression__ValueAssignment_1)
+	{ after(grammarAccess.getLiteralStringExpressionAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralNullExpression__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullExpression__Group_0__0__Impl
+	rule__LiteralNullExpression__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_0_0()); }
+	()
+	{ after(grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullExpression__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_0_1()); }
+	(rule__LiteralNullExpression__Alternatives_0_1)
+	{ after(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralNullExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullExpression__Group_1__0__Impl
+	rule__LiteralNullExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_1_0()); }
+	()
+	{ after(grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullExpression__Group_1__1__Impl
+	rule__LiteralNullExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_1_1()); }
+	(rule__LiteralNullExpression__Alternatives_1_1)
+	{ after(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullExpression__Group_1__2__Impl
+	rule__LiteralNullExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullExpressionAccess().getTypeAssignment_1_2()); }
+	(rule__LiteralNullExpression__TypeAssignment_1_2)
+	{ after(grammarAccess.getLiteralNullExpressionAccess().getTypeAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralNullExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralNullExpressionAccess().getGreaterThanSignKeyword_1_3()); }
+	'>'
+	{ after(grammarAccess.getLiteralNullExpressionAccess().getGreaterThanSignKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralCollectionExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group__0__Impl
+	rule__LiteralCollectionExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getLiteralCollectionExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getLiteralCollectionExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group__1__Impl
+	rule__LiteralCollectionExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_1()); }
+	(rule__LiteralCollectionExpression__Group_1__0)?
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group__2__Impl
+	rule__LiteralCollectionExpression__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getLeftCurlyBracketKeyword_2()); }
+	'{'
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getLeftCurlyBracketKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group__3__Impl
+	rule__LiteralCollectionExpression__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3()); }
+	(rule__LiteralCollectionExpression__Group_3__0)?
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getRightCurlyBracketKeyword_4()); }
+	'}'
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getRightCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralCollectionExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group_1__0__Impl
+	rule__LiteralCollectionExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getLessThanSignKeyword_1_0()); }
+	'<'
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getLessThanSignKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group_1__1__Impl
+	rule__LiteralCollectionExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeAssignment_1_1()); }
+	(rule__LiteralCollectionExpression__DatatypeAssignment_1_1)
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getGreaterThanSignKeyword_1_2()); }
+	'>'
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getGreaterThanSignKeyword_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralCollectionExpression__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group_3__0__Impl
+	rule__LiteralCollectionExpression__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_0()); }
+	(rule__LiteralCollectionExpression__Alternatives_3_0)
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3_1()); }
+	(rule__LiteralCollectionExpression__Group_3_1__0)*
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralCollectionExpression__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group_3_1__0__Impl
+	rule__LiteralCollectionExpression__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getCommaKeyword_3_1_0()); }
+	','
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getCommaKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralCollectionExpression__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_1_1()); }
+	(rule__LiteralCollectionExpression__Alternatives_3_1_1)
+	{ after(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralReferenceElement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralReferenceElement__Group__0__Impl
+	rule__LiteralReferenceElement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralReferenceElementAccess().getLiteralReferenceElementAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralReferenceElementAccess().getLiteralReferenceElementAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralReferenceElement__Group__1__Impl
+	rule__LiteralReferenceElement__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralReferenceElementAccess().getValueAssignment_1()); }
+	(rule__LiteralReferenceElement__ValueAssignment_1)
+	{ after(grammarAccess.getLiteralReferenceElementAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralReferenceElement__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralReferenceElementAccess().getAlternatives_2()); }
+	(rule__LiteralReferenceElement__Alternatives_2)?
+	{ after(grammarAccess.getLiteralReferenceElementAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralReferenceElement__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralReferenceElement__Group_2_0__0__Impl
+	rule__LiteralReferenceElement__Group_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_0_0()); }
+	(rule__LiteralReferenceElement__KindAssignment_2_0_0)
+	{ after(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralReferenceElement__Group_2_0__1__Impl
+	rule__LiteralReferenceElement__Group_2_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_0_1()); }
+	(rule__LiteralReferenceElement__ArgAssignment_2_0_1)
+	{ after(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralReferenceElement__Group_2_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralReferenceElementAccess().getRightSquareBracketKeyword_2_0_2()); }
+	']'
+	{ after(grammarAccess.getLiteralReferenceElementAccess().getRightSquareBracketKeyword_2_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralReferenceElement__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralReferenceElement__Group_2_1__0__Impl
+	rule__LiteralReferenceElement__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_1_0()); }
+	(rule__LiteralReferenceElement__KindAssignment_2_1_0)
+	{ after(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralReferenceElement__Group_2_1__1__Impl
+	rule__LiteralReferenceElement__Group_2_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_1_1()); }
+	(rule__LiteralReferenceElement__ArgAssignment_2_1_1)
+	{ after(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralReferenceElement__Group_2_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__Group_2_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralReferenceElementAccess().getRightParenthesisKeyword_2_1_2()); }
+	')'
+	{ after(grammarAccess.getLiteralReferenceElementAccess().getRightParenthesisKeyword_2_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralPureReferenceElement__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralPureReferenceElement__Group__0__Impl
+	rule__LiteralPureReferenceElement__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralPureReferenceElement__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralPureReferenceElementAccess().getLiteralReferenceElementAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralPureReferenceElementAccess().getLiteralReferenceElementAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralPureReferenceElement__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralPureReferenceElement__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralPureReferenceElement__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralPureReferenceElementAccess().getValueAssignment_1()); }
+	(rule__LiteralPureReferenceElement__ValueAssignment_1)
+	{ after(grammarAccess.getLiteralPureReferenceElementAccess().getValueAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralTimeExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralTimeExpression__Group__0__Impl
+	rule__LiteralTimeExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralTimeExpressionAccess().getLiteralTimeExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralTimeExpressionAccess().getLiteralTimeExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralTimeExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralTimeExpressionAccess().getTimeKeyword_1()); }
+	'$time'
+	{ after(grammarAccess.getLiteralTimeExpressionAccess().getTimeKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralTimeDeltaExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralTimeDeltaExpression__Group__0__Impl
+	rule__LiteralTimeDeltaExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeDeltaExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralTimeDeltaExpressionAccess().getLiteralTimeDeltaExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralTimeDeltaExpressionAccess().getLiteralTimeDeltaExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeDeltaExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralTimeDeltaExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralTimeDeltaExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralTimeDeltaExpressionAccess().getDeltaKeyword_1()); }
+	'$delta'
+	{ after(grammarAccess.getLiteralTimeDeltaExpressionAccess().getDeltaKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralThisExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralThisExpression__Group__0__Impl
+	rule__LiteralThisExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralThisExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralThisExpressionAccess().getLiteralThisExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralThisExpressionAccess().getLiteralThisExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralThisExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralThisExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralThisExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralThisExpressionAccess().getThisKeyword_1()); }
+	'$this'
+	{ after(grammarAccess.getLiteralThisExpressionAccess().getThisKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralSelfExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSelfExpression__Group__0__Impl
+	rule__LiteralSelfExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSelfExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSelfExpressionAccess().getLiteralSelfExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralSelfExpressionAccess().getLiteralSelfExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSelfExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSelfExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSelfExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSelfExpressionAccess().getSelfKeyword_1()); }
+	'$self'
+	{ after(grammarAccess.getLiteralSelfExpressionAccess().getSelfKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralParentExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralParentExpression__Group__0__Impl
+	rule__LiteralParentExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralParentExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralParentExpressionAccess().getLiteralParentExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralParentExpressionAccess().getLiteralParentExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralParentExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralParentExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralParentExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralParentExpressionAccess().getParentKeyword_1()); }
+	'$parent'
+	{ after(grammarAccess.getLiteralParentExpressionAccess().getParentKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralSuperExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSuperExpression__Group__0__Impl
+	rule__LiteralSuperExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSuperExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSuperExpressionAccess().getLiteralSuperExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralSuperExpressionAccess().getLiteralSuperExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSuperExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSuperExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSuperExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSuperExpressionAccess().getSuperKeyword_1()); }
+	'$super'
+	{ after(grammarAccess.getLiteralSuperExpressionAccess().getSuperKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralSystemExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSystemExpression__Group__0__Impl
+	rule__LiteralSystemExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSystemExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSystemExpressionAccess().getLiteralSystemExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralSystemExpressionAccess().getLiteralSystemExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSystemExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralSystemExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralSystemExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralSystemExpressionAccess().getSystemKeyword_1()); }
+	'$system'
+	{ after(grammarAccess.getLiteralSystemExpressionAccess().getSystemKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LiteralEnvExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralEnvExpression__Group__0__Impl
+	rule__LiteralEnvExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralEnvExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralEnvExpressionAccess().getLiteralEnvExpressionAction_0()); }
+	()
+	{ after(grammarAccess.getLiteralEnvExpressionAccess().getLiteralEnvExpressionAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralEnvExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LiteralEnvExpression__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralEnvExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLiteralEnvExpressionAccess().getAlternatives_1()); }
+	(rule__LiteralEnvExpression__Alternatives_1)
+	{ after(grammarAccess.getLiteralEnvExpressionAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValueSelectionExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group__0__Impl
+	rule__ValueSelectionExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getLiteralReferenceExpressionParserRuleCall_0()); }
+	ruleLiteralReferenceExpression
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getLiteralReferenceExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group__1__Impl
+	rule__ValueSelectionExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getGroup_1()); }
+	(rule__ValueSelectionExpression__Group_1__0)*
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getGroup_2()); }
+	(rule__ValueSelectionExpression__Group_2__0)?
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValueSelectionExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_1__0__Impl
+	rule__ValueSelectionExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_1_0()); }
+	()
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_1__1__Impl
+	rule__ValueSelectionExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_1_1()); }
+	'.'
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_1__2__Impl
+	rule__ValueSelectionExpression__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_1_2()); }
+	(rule__ValueSelectionExpression__ElementAssignment_1_2)
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getGroup_1_3()); }
+	(rule__ValueSelectionExpression__Group_1_3__0)?
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getGroup_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValueSelectionExpression__Group_1_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_1_3__0__Impl
+	rule__ValueSelectionExpression__Group_1_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_1_3_0()); }
+	(rule__ValueSelectionExpression__KindAssignment_1_3_0)
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_1_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_1_3__1__Impl
+	rule__ValueSelectionExpression__Group_1_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_1_3_1()); }
+	(rule__ValueSelectionExpression__ArgAssignment_1_3_1)
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_1_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_1_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_1_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_1_3_2()); }
+	']'
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_1_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValueSelectionExpression__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2__0__Impl
+	rule__ValueSelectionExpression__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_0()); }
+	()
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2__1__Impl
+	rule__ValueSelectionExpression__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1()); }
+	'->'
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2__2__Impl
+	rule__ValueSelectionExpression__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_2()); }
+	(rule__ValueSelectionExpression__ElementAssignment_2_2)
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2__3__Impl
+	rule__ValueSelectionExpression__Group_2__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_3()); }
+	(rule__ValueSelectionExpression__Group_2_3__0)?
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4()); }
+	(rule__ValueSelectionExpression__Group_2_4__0)*
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValueSelectionExpression__Group_2_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_3__0__Impl
+	rule__ValueSelectionExpression__Group_2_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_3_0()); }
+	(rule__ValueSelectionExpression__KindAssignment_2_3_0)
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_3__1__Impl
+	rule__ValueSelectionExpression__Group_2_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_3_1()); }
+	(rule__ValueSelectionExpression__ArgAssignment_2_3_1)
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_3_2()); }
+	']'
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValueSelectionExpression__Group_2_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_4__0__Impl
+	rule__ValueSelectionExpression__Group_2_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()); }
+	()
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_4__1__Impl
+	rule__ValueSelectionExpression__Group_2_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_2_4_1()); }
+	'.'
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_2_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_4__2__Impl
+	rule__ValueSelectionExpression__Group_2_4__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_4_2()); }
+	(rule__ValueSelectionExpression__ElementAssignment_2_4_2)
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_4__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4_3()); }
+	(rule__ValueSelectionExpression__Group_2_4_3__0)?
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValueSelectionExpression__Group_2_4_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_4_3__0__Impl
+	rule__ValueSelectionExpression__Group_2_4_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_4_3_0()); }
+	(rule__ValueSelectionExpression__KindAssignment_2_4_3_0)
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_4_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_4_3__1__Impl
+	rule__ValueSelectionExpression__Group_2_4_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_4_3_1()); }
+	(rule__ValueSelectionExpression__ArgAssignment_2_4_3_1)
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_4_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValueSelectionExpression__Group_2_4_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__Group_2_4_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_4_3_2()); }
+	']'
+	{ after(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_4_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValuePureNamedMachineExpression__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group__0__Impl
+	rule__ValuePureNamedMachineExpression__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getLiteralPureReferenceExpressionParserRuleCall_0()); }
+	ruleLiteralPureReferenceExpression
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getLiteralPureReferenceExpressionParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group__1__Impl
+	rule__ValuePureNamedMachineExpression__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_1()); }
+	(rule__ValuePureNamedMachineExpression__Group_1__0)*
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2()); }
+	(rule__ValuePureNamedMachineExpression__Group_2__0)?
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValuePureNamedMachineExpression__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_1__0__Impl
+	rule__ValuePureNamedMachineExpression__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_1_0()); }
+	()
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_1__1__Impl
+	rule__ValuePureNamedMachineExpression__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_1_1()); }
+	(rule__ValuePureNamedMachineExpression__KindAssignment_1_1)
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_1__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_1_2()); }
+	(rule__ValuePureNamedMachineExpression__ElementAssignment_1_2)
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValuePureNamedMachineExpression__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_2__0__Impl
+	rule__ValuePureNamedMachineExpression__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_0()); }
+	()
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_2__1__Impl
+	rule__ValuePureNamedMachineExpression__Group_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_1()); }
+	(rule__ValuePureNamedMachineExpression__KindAssignment_2_1)
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_2__2__Impl
+	rule__ValuePureNamedMachineExpression__Group_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_2()); }
+	(rule__ValuePureNamedMachineExpression__ElementAssignment_2_2)
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2_3()); }
+	(rule__ValuePureNamedMachineExpression__Group_2_3__0)*
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ValuePureNamedMachineExpression__Group_2_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl
+	rule__ValuePureNamedMachineExpression__Group_2_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_3_0()); }
+	()
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl
+	rule__ValuePureNamedMachineExpression__Group_2_3__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_3_1()); }
+	(rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1)
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_3_2()); }
+	(rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2)
+	{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_3_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__System__UnorderedGroup_0
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+	}
+:
+	rule__System__UnorderedGroup_0__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+	restoreStackSize(stackSize);
+}
+
+rule__System__UnorderedGroup_0__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getSystemAccess().getVisibilityAssignment_0_0()); }
+					(rule__System__VisibilityAssignment_0_0)
+					{ after(grammarAccess.getSystemAccess().getVisibilityAssignment_0_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getSystemAccess().getAlternatives_0_1()); }
+					(rule__System__Alternatives_0_1)
+					{ after(grammarAccess.getSystemAccess().getAlternatives_0_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+	restoreStackSize(stackSize);
+}
+
+rule__System__UnorderedGroup_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__UnorderedGroup_0__Impl
+	rule__System__UnorderedGroup_0__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__UnorderedGroup_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__System__UnorderedGroup_0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MachineBlock__UnorderedGroup_0
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+	}
+:
+	rule__MachineBlock__UnorderedGroup_0__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__UnorderedGroup_0__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getMachineBlockAccess().getVisibilityAssignment_0_0()); }
+					(rule__MachineBlock__VisibilityAssignment_0_0)
+					{ after(grammarAccess.getMachineBlockAccess().getVisibilityAssignment_0_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getMachineBlockAccess().getAlternatives_0_1()); }
+					(rule__MachineBlock__Alternatives_0_1)
+					{ after(grammarAccess.getMachineBlockAccess().getAlternatives_0_1()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getMachineBlockAccess().getDesignAssignment_0_2()); }
+					(rule__MachineBlock__DesignAssignment_0_2)
+					{ after(grammarAccess.getMachineBlockAccess().getDesignAssignment_0_2()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__UnorderedGroup_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__UnorderedGroup_0__Impl
+	rule__MachineBlock__UnorderedGroup_0__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__UnorderedGroup_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__UnorderedGroup_0__Impl
+	rule__MachineBlock__UnorderedGroup_0__2?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__UnorderedGroup_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MachineBlock__UnorderedGroup_0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ProcedureExecution__UnorderedGroup_2
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+	}
+:
+	rule__ProcedureExecution__UnorderedGroup_2__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__UnorderedGroup_2__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getProcedureExecutionAccess().getGroup_2_0()); }
+					(rule__ProcedureExecution__Group_2_0__0)
+					{ after(grammarAccess.getProcedureExecutionAccess().getGroup_2_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getProcedureExecutionAccess().getGroup_2_1()); }
+					(rule__ProcedureExecution__Group_2_1__0)
+					{ after(grammarAccess.getProcedureExecutionAccess().getGroup_2_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__UnorderedGroup_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ProcedureExecution__UnorderedGroup_2__Impl
+	rule__ProcedureExecution__UnorderedGroup_2__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__UnorderedGroup_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ProcedureExecution__UnorderedGroup_2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__MoeBehavior__UnorderedGroup_2
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+	}
+:
+	rule__MoeBehavior__UnorderedGroup_2__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__UnorderedGroup_2__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getMoeBehaviorAccess().getExecutionAssignment_2_0()); }
+					(rule__MoeBehavior__ExecutionAssignment_2_0)
+					{ after(grammarAccess.getMoeBehaviorAccess().getExecutionAssignment_2_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getMoeBehaviorAccess().getInteractionAssignment_2_1()); }
+					(rule__MoeBehavior__InteractionAssignment_2_1)
+					{ after(grammarAccess.getMoeBehaviorAccess().getInteractionAssignment_2_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__UnorderedGroup_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeBehavior__UnorderedGroup_2__Impl
+	rule__MoeBehavior__UnorderedGroup_2__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__UnorderedGroup_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__MoeBehavior__UnorderedGroup_2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__UnorderedGroup_1
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+	}
+:
+	rule__Statemachine__UnorderedGroup_1__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__UnorderedGroup_1__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getStatemachineAccess().getVisibilityAssignment_1_0()); }
+					(rule__Statemachine__VisibilityAssignment_1_0)
+					{ after(grammarAccess.getStatemachineAccess().getVisibilityAssignment_1_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getStatemachineAccess().getAlternatives_1_1()); }
+					(rule__Statemachine__Alternatives_1_1)
+					{ after(grammarAccess.getStatemachineAccess().getAlternatives_1_1()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getStatemachineAccess().getDesignAssignment_1_2()); }
+					(rule__Statemachine__DesignAssignment_1_2)
+					{ after(grammarAccess.getStatemachineAccess().getDesignAssignment_1_2()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__UnorderedGroup_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__UnorderedGroup_1__Impl
+	rule__Statemachine__UnorderedGroup_1__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__UnorderedGroup_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__UnorderedGroup_1__Impl
+	rule__Statemachine__UnorderedGroup_1__2?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__UnorderedGroup_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__UnorderedGroup_1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Statemachine__UnorderedGroup_12
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+	}
+:
+	rule__Statemachine__UnorderedGroup_12__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__UnorderedGroup_12__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getStatemachineAccess().getExecutionAssignment_12_0()); }
+					(rule__Statemachine__ExecutionAssignment_12_0)
+					{ after(grammarAccess.getStatemachineAccess().getExecutionAssignment_12_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getStatemachineAccess().getInteractionAssignment_12_1()); }
+					(rule__Statemachine__InteractionAssignment_12_1)
+					{ after(grammarAccess.getStatemachineAccess().getInteractionAssignment_12_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__UnorderedGroup_12__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__UnorderedGroup_12__Impl
+	rule__Statemachine__UnorderedGroup_12__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__UnorderedGroup_12__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Statemachine__UnorderedGroup_12__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ModelOfExecution__UnorderedGroup_3
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+	}
+:
+	rule__ModelOfExecution__UnorderedGroup_3__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__UnorderedGroup_3__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModelOfExecutionAccess().getGroup_3_0()); }
+					(rule__ModelOfExecution__Group_3_0__0)
+					{ after(grammarAccess.getModelOfExecutionAccess().getGroup_3_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModelOfExecutionAccess().getGroup_3_1()); }
+					(rule__ModelOfExecution__Group_3_1__0)
+					{ after(grammarAccess.getModelOfExecutionAccess().getGroup_3_1()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModelOfExecutionAccess().getGroup_3_2()); }
+					(rule__ModelOfExecution__Group_3_2__0)
+					{ after(grammarAccess.getModelOfExecutionAccess().getGroup_3_2()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModelOfExecutionAccess().getGroup_3_3()); }
+					(rule__ModelOfExecution__Group_3_3__0)
+					{ after(grammarAccess.getModelOfExecutionAccess().getGroup_3_3()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModelOfExecutionAccess().getGroup_3_4()); }
+					(rule__ModelOfExecution__Group_3_4__0)
+					{ after(grammarAccess.getModelOfExecutionAccess().getGroup_3_4()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModelOfExecutionAccess().getGroup_3_5()); }
+					(rule__ModelOfExecution__Group_3_5__0)
+					{ after(grammarAccess.getModelOfExecutionAccess().getGroup_3_5()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModelOfExecutionAccess().getGroup_3_6()); }
+					(rule__ModelOfExecution__Group_3_6__0)
+					{ after(grammarAccess.getModelOfExecutionAccess().getGroup_3_6()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModelOfExecutionAccess().getGroup_3_7()); }
+					(rule__ModelOfExecution__Group_3_7__0)
+					{ after(grammarAccess.getModelOfExecutionAccess().getGroup_3_7()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__UnorderedGroup_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__UnorderedGroup_3__Impl
+	rule__ModelOfExecution__UnorderedGroup_3__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__UnorderedGroup_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__UnorderedGroup_3__Impl
+	rule__ModelOfExecution__UnorderedGroup_3__2?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__UnorderedGroup_3__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__UnorderedGroup_3__Impl
+	rule__ModelOfExecution__UnorderedGroup_3__3?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__UnorderedGroup_3__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__UnorderedGroup_3__Impl
+	rule__ModelOfExecution__UnorderedGroup_3__4?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__UnorderedGroup_3__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__UnorderedGroup_3__Impl
+	rule__ModelOfExecution__UnorderedGroup_3__5?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__UnorderedGroup_3__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__UnorderedGroup_3__Impl
+	rule__ModelOfExecution__UnorderedGroup_3__6?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__UnorderedGroup_3__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__UnorderedGroup_3__Impl
+	rule__ModelOfExecution__UnorderedGroup_3__7?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__UnorderedGroup_3__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ModelOfExecution__UnorderedGroup_3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Modifier__UnorderedGroup_1
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+	}
+:
+	rule__Modifier__UnorderedGroup_1__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__UnorderedGroup_1__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModifierAccess().getStaticAssignment_1_0()); }
+					(rule__Modifier__StaticAssignment_1_0)
+					{ after(grammarAccess.getModifierAccess().getStaticAssignment_1_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModifierAccess().getFinalAssignment_1_1()); }
+					(rule__Modifier__FinalAssignment_1_1)
+					{ after(grammarAccess.getModifierAccess().getFinalAssignment_1_1()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModifierAccess().getReferenceAssignment_1_2()); }
+					(rule__Modifier__ReferenceAssignment_1_2)
+					{ after(grammarAccess.getModifierAccess().getReferenceAssignment_1_2()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModifierAccess().getVolatileAssignment_1_3()); }
+					(rule__Modifier__VolatileAssignment_1_3)
+					{ after(grammarAccess.getModifierAccess().getVolatileAssignment_1_3()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getModifierAccess().getTransientAssignment_1_4()); }
+					(rule__Modifier__TransientAssignment_1_4)
+					{ after(grammarAccess.getModifierAccess().getTransientAssignment_1_4()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__UnorderedGroup_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Modifier__UnorderedGroup_1__Impl
+	rule__Modifier__UnorderedGroup_1__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__UnorderedGroup_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Modifier__UnorderedGroup_1__Impl
+	rule__Modifier__UnorderedGroup_1__2?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__UnorderedGroup_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Modifier__UnorderedGroup_1__Impl
+	rule__Modifier__UnorderedGroup_1__3?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__UnorderedGroup_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Modifier__UnorderedGroup_1__Impl
+	rule__Modifier__UnorderedGroup_1__4?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__UnorderedGroup_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Modifier__UnorderedGroup_1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Variable__UnorderedGroup_0
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+	}
+:
+	rule__Variable__UnorderedGroup_0__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__UnorderedGroup_0__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getVariableAccess().getVisibilityAssignment_0_0()); }
+					(rule__Variable__VisibilityAssignment_0_0)
+					{ after(grammarAccess.getVariableAccess().getVisibilityAssignment_0_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getVariableAccess().getModifierAssignment_0_1()); }
+					(rule__Variable__ModifierAssignment_0_1)
+					{ after(grammarAccess.getVariableAccess().getModifierAssignment_0_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__UnorderedGroup_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__UnorderedGroup_0__Impl
+	rule__Variable__UnorderedGroup_0__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__UnorderedGroup_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Variable__UnorderedGroup_0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariablePublic__UnorderedGroup_1
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+	}
+:
+	rule__VariablePublic__UnorderedGroup_1__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__UnorderedGroup_1__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getVariablePublicAccess().getAlternatives_1_0()); }
+					(rule__VariablePublic__Alternatives_1_0)
+					{ after(grammarAccess.getVariablePublicAccess().getAlternatives_1_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getVariablePublicAccess().getMacroAssignment_1_1()); }
+					(rule__VariablePublic__MacroAssignment_1_1)
+					{ after(grammarAccess.getVariablePublicAccess().getMacroAssignment_1_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__UnorderedGroup_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__UnorderedGroup_1__Impl
+	rule__VariablePublic__UnorderedGroup_1__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__UnorderedGroup_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePublic__UnorderedGroup_1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariableProtected__UnorderedGroup_1
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+	}
+:
+	rule__VariableProtected__UnorderedGroup_1__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__UnorderedGroup_1__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getVariableProtectedAccess().getAlternatives_1_0()); }
+					(rule__VariableProtected__Alternatives_1_0)
+					{ after(grammarAccess.getVariableProtectedAccess().getAlternatives_1_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getVariableProtectedAccess().getMacroAssignment_1_1()); }
+					(rule__VariableProtected__MacroAssignment_1_1)
+					{ after(grammarAccess.getVariableProtectedAccess().getMacroAssignment_1_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__UnorderedGroup_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__UnorderedGroup_1__Impl
+	rule__VariableProtected__UnorderedGroup_1__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__UnorderedGroup_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariableProtected__UnorderedGroup_1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__VariablePrivate__UnorderedGroup_1
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+	}
+:
+	rule__VariablePrivate__UnorderedGroup_1__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__UnorderedGroup_1__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getVariablePrivateAccess().getAlternatives_1_0()); }
+					(rule__VariablePrivate__Alternatives_1_0)
+					{ after(grammarAccess.getVariablePrivateAccess().getAlternatives_1_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getVariablePrivateAccess().getMacroAssignment_1_1()); }
+					(rule__VariablePrivate__MacroAssignment_1_1)
+					{ after(grammarAccess.getVariablePrivateAccess().getMacroAssignment_1_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__UnorderedGroup_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__UnorderedGroup_1__Impl
+	rule__VariablePrivate__UnorderedGroup_1__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__UnorderedGroup_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__VariablePrivate__UnorderedGroup_1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Buffer__UnorderedGroup_0
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+	}
+:
+	rule__Buffer__UnorderedGroup_0__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__UnorderedGroup_0__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getBufferAccess().getVisibilityAssignment_0_0()); }
+					(rule__Buffer__VisibilityAssignment_0_0)
+					{ after(grammarAccess.getBufferAccess().getVisibilityAssignment_0_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getBufferAccess().getModifierAssignment_0_1()); }
+					(rule__Buffer__ModifierAssignment_0_1)
+					{ after(grammarAccess.getBufferAccess().getModifierAssignment_0_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__UnorderedGroup_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Buffer__UnorderedGroup_0__Impl
+	rule__Buffer__UnorderedGroup_0__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__UnorderedGroup_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Buffer__UnorderedGroup_0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__InputComStatement__UnorderedGroup_3
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+	}
+:
+	rule__InputComStatement__UnorderedGroup_3__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__UnorderedGroup_3__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getInputComStatementAccess().getGroup_3_0()); }
+					(rule__InputComStatement__Group_3_0__0)
+					{ after(grammarAccess.getInputComStatementAccess().getGroup_3_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getInputComStatementAccess().getGroup_3_1()); }
+					(rule__InputComStatement__Group_3_1__0)
+					{ after(grammarAccess.getInputComStatementAccess().getGroup_3_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__UnorderedGroup_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__UnorderedGroup_3__Impl
+	rule__InputComStatement__UnorderedGroup_3__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__UnorderedGroup_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__InputComStatement__UnorderedGroup_3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__OutputComStatement__UnorderedGroup_3
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+	}
+:
+	rule__OutputComStatement__UnorderedGroup_3__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__UnorderedGroup_3__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getOutputComStatementAccess().getGroup_3_0()); }
+					(rule__OutputComStatement__Group_3_0__0)
+					{ after(grammarAccess.getOutputComStatementAccess().getGroup_3_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getOutputComStatementAccess().getGroup_3_1()); }
+					(rule__OutputComStatement__Group_3_1__0)
+					{ after(grammarAccess.getOutputComStatementAccess().getGroup_3_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__UnorderedGroup_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__UnorderedGroup_3__Impl
+	rule__OutputComStatement__UnorderedGroup_3__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__UnorderedGroup_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__OutputComStatement__UnorderedGroup_3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Xlia__PrologAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaAccess().getPrologXliaPrologObjectParserRuleCall_0_0()); }
+		ruleXliaPrologObject
+		{ after(grammarAccess.getXliaAccess().getPrologXliaPrologObjectParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Xlia__SystemAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaAccess().getSystemSystemParserRuleCall_1_0()); }
+		ruleSystem
+		{ after(grammarAccess.getXliaAccess().getSystemSystemParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__NameAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaPrologObjectAccess().getNameAlternatives_0_0()); }
+		(rule__XliaPrologObject__NameAlternatives_0_0)
+		{ after(grammarAccess.getXliaPrologObjectAccess().getNameAlternatives_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__ElementsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaPrologObjectAccess().getElementsXliaPrologAttributeParserRuleCall_2_0()); }
+		ruleXliaPrologAttribute
+		{ after(grammarAccess.getXliaPrologObjectAccess().getElementsXliaPrologAttributeParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologObject__ElementsAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaPrologObjectAccess().getElementsXliaOptionObjectParserRuleCall_4_0()); }
+		ruleXliaOptionObject
+		{ after(grammarAccess.getXliaPrologObjectAccess().getElementsXliaOptionObjectParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__NameAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaPrologAttributeAccess().getNameAlternatives_0_0()); }
+		(rule__XliaPrologAttribute__NameAlternatives_0_0)
+		{ after(grammarAccess.getXliaPrologAttributeAccess().getNameAlternatives_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaPrologAttribute__ValueAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaPrologAttributeAccess().getValueAlternatives_1_1_0()); }
+		(rule__XliaPrologAttribute__ValueAlternatives_1_1_0)
+		{ after(grammarAccess.getXliaPrologAttributeAccess().getValueAlternatives_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaOptionObject__NameAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0()); }
+		(
+			{ before(grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0()); }
+			'@option'
+			{ after(grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0()); }
+		)
+		{ after(grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaOptionObject__ElementsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaOptionObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0()); }
+		ruleXliaNamedElement
+		{ after(grammarAccess.getXliaOptionObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaObject__NameAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaObjectAccess().getNameXLIA_IDTerminalRuleCall_0_0()); }
+		RULE_XLIA_ID
+		{ after(grammarAccess.getXliaObjectAccess().getNameXLIA_IDTerminalRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaObject__ElementsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0()); }
+		ruleXliaNamedElement
+		{ after(grammarAccess.getXliaObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaAttribute__NameAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaAttributeAccess().getNameXLIA_IDTerminalRuleCall_0_0()); }
+		RULE_XLIA_ID
+		{ after(grammarAccess.getXliaAttributeAccess().getNameXLIA_IDTerminalRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XliaAttribute__ValueAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXliaAttributeAccess().getValueExpressionParserRuleCall_2_0()); }
+		ruleExpression
+		{ after(grammarAccess.getXliaAttributeAccess().getValueExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnqualifiedName__NameBindingAssignment
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnqualifiedNameAccess().getNameBindingNameBindingParserRuleCall_0()); }
+		ruleNameBinding
+		{ after(grammarAccess.getUnqualifiedNameAccess().getNameBindingNameBindingParserRuleCall_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__VisibilityAssignment_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getSystemAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__TimedAssignment_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0()); }
+		(
+			{ before(grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0()); }
+			'timed'
+			{ after(grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0()); }
+		)
+		{ after(grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__Input_enabledAssignment_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); }
+			'input_enabled'
+			{ after(grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); }
+		)
+		{ after(grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getSystemAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getSystemAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PortAssignment_6_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortPortParserRuleCall_6_0_0()); }
+		rulePort
+		{ after(grammarAccess.getSystemAccess().getPortPortParserRuleCall_6_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__SignalAssignment_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_6_1_0()); }
+		ruleSignal
+		{ after(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__BufferAssignment_6_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_6_2_0()); }
+		ruleBuffer
+		{ after(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_6_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__ChannelAssignment_6_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_6_3_0()); }
+		ruleChannel
+		{ after(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_6_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__TypedefAssignment_6_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PropertyAssignment_6_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_6_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_6_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PortAssignment_7_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortPortParserRuleCall_7_0_1_0_0()); }
+		rulePort
+		{ after(grammarAccess.getSystemAccess().getPortPortParserRuleCall_7_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__SignalAssignment_7_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_7_0_1_1_0()); }
+		ruleSignal
+		{ after(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_7_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__BufferAssignment_7_0_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_7_0_1_2_0()); }
+		ruleBuffer
+		{ after(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_7_0_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__ChannelAssignment_7_0_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_7_0_1_3_0()); }
+		ruleChannel
+		{ after(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_7_0_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__TypedefAssignment_7_0_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PropertyAssignment_7_0_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_7_0_1_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_7_0_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PortAssignment_7_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortPortPublicParserRuleCall_7_1_1_0_0()); }
+		rulePortPublic
+		{ after(grammarAccess.getSystemAccess().getPortPortPublicParserRuleCall_7_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__SignalAssignment_7_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0()); }
+		ruleSignalPublic
+		{ after(grammarAccess.getSystemAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__BufferAssignment_7_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0()); }
+		ruleBufferPublic
+		{ after(grammarAccess.getSystemAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__ChannelAssignment_7_1_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0()); }
+		ruleChannelPublic
+		{ after(grammarAccess.getSystemAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__TypedefAssignment_7_1_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PropertyAssignment_7_1_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0()); }
+		ruleVariablePublic
+		{ after(grammarAccess.getSystemAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PortAssignment_7_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0()); }
+		rulePortProtected
+		{ after(grammarAccess.getSystemAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__SignalAssignment_7_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0()); }
+		ruleSignalProtected
+		{ after(grammarAccess.getSystemAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__BufferAssignment_7_2_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0()); }
+		ruleBufferProtected
+		{ after(grammarAccess.getSystemAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__ChannelAssignment_7_2_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0()); }
+		ruleChannelProtected
+		{ after(grammarAccess.getSystemAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__TypedefAssignment_7_2_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PropertyAssignment_7_2_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0()); }
+		ruleVariableProtected
+		{ after(grammarAccess.getSystemAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PortAssignment_7_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0()); }
+		rulePortPrivate
+		{ after(grammarAccess.getSystemAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__SignalAssignment_7_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0()); }
+		ruleSignalPrivate
+		{ after(grammarAccess.getSystemAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__BufferAssignment_7_3_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0()); }
+		ruleBufferPrivate
+		{ after(grammarAccess.getSystemAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__ChannelAssignment_7_3_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0()); }
+		ruleChannelPrivate
+		{ after(grammarAccess.getSystemAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__TypedefAssignment_7_3_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__PropertyAssignment_7_3_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0()); }
+		ruleVariablePrivate
+		{ after(grammarAccess.getSystemAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__RoutineAssignment_8_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__ProcedureAssignment_8_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0()); }
+		ruleProcedure
+		{ after(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__RoutineAssignment_8_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_1_0_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__ProcedureAssignment_8_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_1_1_0()); }
+		ruleProcedure
+		{ after(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__MachineAssignment_9_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0()); }
+		ruleAnyMachineBlock
+		{ after(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__InstanceAssignment_9_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0()); }
+		ruleInstanceMachine
+		{ after(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__MachineAssignment_9_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0()); }
+		ruleAnyMachineBlock
+		{ after(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__MachineAssignment_9_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0()); }
+		ruleAnyMachineBlock
+		{ after(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__InstanceAssignment_9_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0()); }
+		ruleInstanceMachine
+		{ after(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__BehaviorAssignment_10_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0()); }
+		ruleBehavior
+		{ after(grammarAccess.getSystemAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__BehaviorAssignment_10_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0()); }
+		ruleStatemachine
+		{ after(grammarAccess.getSystemAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__System__MainAssignment_11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSystemAccess().getMainMoeBehaviorParserRuleCall_11_0()); }
+		ruleMoeBehavior
+		{ after(grammarAccess.getSystemAccess().getMainMoeBehaviorParserRuleCall_11_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__ModelAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getModelMachineCrossReference_4_0()); }
+		(
+			{ before(grammarAccess.getInstanceMachineAccess().getModelMachineESUfidParserRuleCall_4_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getInstanceMachineAccess().getModelMachineESUfidParserRuleCall_4_0_1()); }
+		)
+		{ after(grammarAccess.getInstanceMachineAccess().getModelMachineCrossReference_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__NameAssignment_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getNameESIdentifierParserRuleCall_6_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getInstanceMachineAccess().getNameESIdentifierParserRuleCall_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__UnrestrictedNameAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__SlotAssignment_8_0_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_0_0()); }
+		ruleSlotParameter
+		{ after(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_1_1_0()); }
+		ruleSlotParameter
+		{ after(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstanceMachine__SlotAssignment_8_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInstanceMachineAccess().getSlotSlotPropertyParserRuleCall_8_1_1_0_0()); }
+		ruleSlotProperty
+		{ after(grammarAccess.getInstanceMachineAccess().getSlotSlotPropertyParserRuleCall_8_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotParameter__XliaPropertyAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0()); }
+		(
+			{ before(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1()); }
+		)
+		{ after(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotParameter__ValueAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSlotParameterAccess().getValueExpressionParserRuleCall_2_0()); }
+		ruleExpression
+		{ after(grammarAccess.getSlotParameterAccess().getValueExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotProperty__XliaPropertyAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0()); }
+		(
+			{ before(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1()); }
+		)
+		{ after(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SlotProperty__ValueAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSlotPropertyAccess().getValueExpressionParserRuleCall_2_0()); }
+		ruleExpression
+		{ after(grammarAccess.getSlotPropertyAccess().getValueExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__VisibilityAssignment_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getMachineBlockAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__TimedAssignment_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0()); }
+		(
+			{ before(grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0()); }
+			'timed'
+			{ after(grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0()); }
+		)
+		{ after(grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__Input_enabledAssignment_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); }
+			'input_enabled'
+			{ after(grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); }
+		)
+		{ after(grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__DesignAssignment_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getDesignDesignKindEnumRuleCall_0_2_0()); }
+		ruleDesignKind
+		{ after(grammarAccess.getMachineBlockAccess().getDesignDesignKindEnumRuleCall_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getMachineBlockAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getMachineBlockAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PortAssignment_6_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_6_0_0()); }
+		rulePort
+		{ after(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_6_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__SignalAssignment_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_6_1_0()); }
+		ruleSignal
+		{ after(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__BufferAssignment_6_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_6_2_0()); }
+		ruleBuffer
+		{ after(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_6_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__ChannelAssignment_6_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_6_3_0()); }
+		ruleChannel
+		{ after(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_6_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__TypedefAssignment_6_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PropertyAssignment_6_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_6_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_6_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PortAssignment_7_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_7_0_1_0_0()); }
+		rulePort
+		{ after(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_7_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__SignalAssignment_7_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_7_0_1_1_0()); }
+		ruleSignal
+		{ after(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_7_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__BufferAssignment_7_0_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_7_0_1_2_0()); }
+		ruleBuffer
+		{ after(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_7_0_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__ChannelAssignment_7_0_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_7_0_1_3_0()); }
+		ruleChannel
+		{ after(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_7_0_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__TypedefAssignment_7_0_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PropertyAssignment_7_0_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_7_0_1_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_7_0_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PortAssignment_7_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortPortPublicParserRuleCall_7_1_1_0_0()); }
+		rulePortPublic
+		{ after(grammarAccess.getMachineBlockAccess().getPortPortPublicParserRuleCall_7_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__SignalAssignment_7_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0()); }
+		ruleSignalPublic
+		{ after(grammarAccess.getMachineBlockAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__BufferAssignment_7_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0()); }
+		ruleBufferPublic
+		{ after(grammarAccess.getMachineBlockAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__ChannelAssignment_7_1_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0()); }
+		ruleChannelPublic
+		{ after(grammarAccess.getMachineBlockAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__TypedefAssignment_7_1_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PropertyAssignment_7_1_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0()); }
+		ruleVariablePublic
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PortAssignment_7_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0()); }
+		rulePortProtected
+		{ after(grammarAccess.getMachineBlockAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__SignalAssignment_7_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0()); }
+		ruleSignalProtected
+		{ after(grammarAccess.getMachineBlockAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__BufferAssignment_7_2_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0()); }
+		ruleBufferProtected
+		{ after(grammarAccess.getMachineBlockAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__ChannelAssignment_7_2_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0()); }
+		ruleChannelProtected
+		{ after(grammarAccess.getMachineBlockAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__TypedefAssignment_7_2_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PropertyAssignment_7_2_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0()); }
+		ruleVariableProtected
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PortAssignment_7_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0()); }
+		rulePortPrivate
+		{ after(grammarAccess.getMachineBlockAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__SignalAssignment_7_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0()); }
+		ruleSignalPrivate
+		{ after(grammarAccess.getMachineBlockAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__BufferAssignment_7_3_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0()); }
+		ruleBufferPrivate
+		{ after(grammarAccess.getMachineBlockAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__ChannelAssignment_7_3_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0()); }
+		ruleChannelPrivate
+		{ after(grammarAccess.getMachineBlockAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__TypedefAssignment_7_3_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__PropertyAssignment_7_3_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0()); }
+		ruleVariablePrivate
+		{ after(grammarAccess.getMachineBlockAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__RoutineAssignment_8_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__ProcedureAssignment_8_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0()); }
+		ruleProcedure
+		{ after(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__RoutineAssignment_8_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_1_0_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__ProcedureAssignment_8_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_1_1_0()); }
+		ruleProcedure
+		{ after(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__MachineAssignment_9_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0()); }
+		ruleAnyMachineBlock
+		{ after(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__InstanceAssignment_9_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0()); }
+		ruleInstanceMachine
+		{ after(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__MachineAssignment_9_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0()); }
+		ruleAnyMachineBlock
+		{ after(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__MachineAssignment_9_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0()); }
+		ruleAnyMachineBlock
+		{ after(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__InstanceAssignment_9_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0()); }
+		ruleInstanceMachine
+		{ after(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__BehaviorAssignment_10_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0()); }
+		ruleBehavior
+		{ after(grammarAccess.getMachineBlockAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__BehaviorAssignment_10_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0()); }
+		ruleStatemachine
+		{ after(grammarAccess.getMachineBlockAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MachineBlock__MainAssignment_11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMachineBlockAccess().getMainMoeBehaviorParserRuleCall_11_0()); }
+		ruleMoeBehavior
+		{ after(grammarAccess.getMachineBlockAccess().getMainMoeBehaviorParserRuleCall_11_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getProcedureAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getProcedureAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getProcedureAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_5_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_0_0()); }
+		ruleFunctionalParameter
+		{ after(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_5_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0()); }
+		ruleFunctionalParameter
+		{ after(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_5_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_0_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_5_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_5_1_1_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_7_0_1_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0()); }
+		ruleParameterInput
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0()); }
+		ruleParameterInput
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_7_0_1_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0()); }
+		ruleParameterInout
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0()); }
+		ruleParameterInout
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_7_0_1_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0()); }
+		ruleParameterOutput
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0()); }
+		ruleParameterOutput
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_7_0_1_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0()); }
+		ruleParameterReturn
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0()); }
+		ruleParameterReturn
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PortAssignment_7_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_7_1_0_0()); }
+		rulePort
+		{ after(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_7_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__SignalAssignment_7_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_7_1_1_0()); }
+		ruleSignal
+		{ after(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_7_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__BufferAssignment_7_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_7_1_2_0()); }
+		ruleBuffer
+		{ after(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_7_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ChannelAssignment_7_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_7_1_3_0()); }
+		ruleChannel
+		{ after(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_7_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__TypedefAssignment_7_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PropertyAssignment_7_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_7_1_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_7_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_8_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0()); }
+		ruleParameterInput
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_8_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0()); }
+		ruleParameterInput
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_8_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0()); }
+		ruleParameterInout
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_8_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0()); }
+		ruleParameterInout
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_8_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0()); }
+		ruleParameterOutput
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_8_2_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0()); }
+		ruleParameterOutput
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_8_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0()); }
+		ruleParameterReturn
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ParameterAssignment_8_3_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0()); }
+		ruleParameterReturn
+		{ after(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PortAssignment_9_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_9_0_1_0_0()); }
+		rulePort
+		{ after(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_9_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__SignalAssignment_9_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_9_0_1_1_0()); }
+		ruleSignal
+		{ after(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_9_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__BufferAssignment_9_0_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_9_0_1_2_0()); }
+		ruleBuffer
+		{ after(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_9_0_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ChannelAssignment_9_0_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_9_0_1_3_0()); }
+		ruleChannel
+		{ after(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_9_0_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__TypedefAssignment_9_0_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PropertyAssignment_9_0_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_9_0_1_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_9_0_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PortAssignment_9_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortPortPublicParserRuleCall_9_1_1_0_0()); }
+		rulePortPublic
+		{ after(grammarAccess.getProcedureAccess().getPortPortPublicParserRuleCall_9_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__SignalAssignment_9_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0()); }
+		ruleSignalPublic
+		{ after(grammarAccess.getProcedureAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__BufferAssignment_9_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0()); }
+		ruleBufferPublic
+		{ after(grammarAccess.getProcedureAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ChannelAssignment_9_1_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0()); }
+		ruleChannelPublic
+		{ after(grammarAccess.getProcedureAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__TypedefAssignment_9_1_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PropertyAssignment_9_1_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0()); }
+		ruleVariablePublic
+		{ after(grammarAccess.getProcedureAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PortAssignment_9_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0()); }
+		rulePortProtected
+		{ after(grammarAccess.getProcedureAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__SignalAssignment_9_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0()); }
+		ruleSignalProtected
+		{ after(grammarAccess.getProcedureAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__BufferAssignment_9_2_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0()); }
+		ruleBufferProtected
+		{ after(grammarAccess.getProcedureAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ChannelAssignment_9_2_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0()); }
+		ruleChannelProtected
+		{ after(grammarAccess.getProcedureAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__TypedefAssignment_9_2_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PropertyAssignment_9_2_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0()); }
+		ruleVariableProtected
+		{ after(grammarAccess.getProcedureAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PortAssignment_9_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0()); }
+		rulePortPrivate
+		{ after(grammarAccess.getProcedureAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__SignalAssignment_9_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0()); }
+		ruleSignalPrivate
+		{ after(grammarAccess.getProcedureAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__BufferAssignment_9_3_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0()); }
+		ruleBufferPrivate
+		{ after(grammarAccess.getProcedureAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ChannelAssignment_9_3_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0()); }
+		ruleChannelPrivate
+		{ after(grammarAccess.getProcedureAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__TypedefAssignment_9_3_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__PropertyAssignment_9_3_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0()); }
+		ruleVariablePrivate
+		{ after(grammarAccess.getProcedureAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__RoutineAssignment_10_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ProcedureAssignment_10_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0()); }
+		ruleProcedure
+		{ after(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__RoutineAssignment_10_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_1_0_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ProcedureAssignment_10_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_1_1_0()); }
+		ruleProcedure
+		{ after(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__RegionAssignment_11_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getRegionStatemachineRegionParserRuleCall_11_0_0()); }
+		ruleStatemachineRegion
+		{ after(grammarAccess.getProcedureAccess().getRegionStatemachineRegionParserRuleCall_11_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__RegionAssignment_11_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0()); }
+		ruleStatemachineRegionLite
+		{ after(grammarAccess.getProcedureAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Procedure__ExecutionAssignment_12
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureAccess().getExecutionProcedureExecutionParserRuleCall_12_0()); }
+		ruleProcedureExecution
+		{ after(grammarAccess.getProcedureAccess().getExecutionProcedureExecutionParserRuleCall_12_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ProcedureExecution__RunRoutineAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getProcedureExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_2_1_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getProcedureExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__PortAssignment_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getPortPortPrivateParserRuleCall_1_1_0_0()); }
+		rulePortPrivate
+		{ after(grammarAccess.getMoeBehaviorAccess().getPortPortPrivateParserRuleCall_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__SignalAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getSignalSignalPrivateParserRuleCall_1_1_1_0()); }
+		ruleSignalPrivate
+		{ after(grammarAccess.getMoeBehaviorAccess().getSignalSignalPrivateParserRuleCall_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__BufferAssignment_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getBufferBufferPrivateParserRuleCall_1_1_2_0()); }
+		ruleBufferPrivate
+		{ after(grammarAccess.getMoeBehaviorAccess().getBufferBufferPrivateParserRuleCall_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__ChannelAssignment_1_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getChannelChannelPrivateParserRuleCall_1_1_3_0()); }
+		ruleChannelPrivate
+		{ after(grammarAccess.getMoeBehaviorAccess().getChannelChannelPrivateParserRuleCall_1_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__TypedefAssignment_1_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getTypedefTypeDefinitionParserRuleCall_1_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getMoeBehaviorAccess().getTypedefTypeDefinitionParserRuleCall_1_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__PropertyAssignment_1_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getPropertyVariablePrivateParserRuleCall_1_1_5_0()); }
+		ruleVariablePrivate
+		{ after(grammarAccess.getMoeBehaviorAccess().getPropertyVariablePrivateParserRuleCall_1_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__ExecutionAssignment_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getExecutionModelOfExecutionParserRuleCall_2_0_0()); }
+		ruleModelOfExecution
+		{ after(grammarAccess.getMoeBehaviorAccess().getExecutionModelOfExecutionParserRuleCall_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeBehavior__InteractionAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeBehaviorAccess().getInteractionModelOfInteractionParserRuleCall_2_1_0()); }
+		ruleModelOfInteraction
+		{ after(grammarAccess.getMoeBehaviorAccess().getInteractionModelOfInteractionParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__VisibilityAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getStatemachineAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__TimedAssignment_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0()); }
+		(
+			{ before(grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0()); }
+			'timed'
+			{ after(grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0()); }
+		)
+		{ after(grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__Input_enabledAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0()); }
+			'input_enabled'
+			{ after(grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0()); }
+		)
+		{ after(grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__DesignAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getDesignDesignKindEnumRuleCall_1_2_0()); }
+		ruleDesignKind
+		{ after(grammarAccess.getStatemachineAccess().getDesignDesignKindEnumRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__NameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getNameESIdentifierParserRuleCall_4_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getStatemachineAccess().getNameESIdentifierParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__UnrestrictedNameAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getStatemachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_7_0_1_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0()); }
+		ruleParameterInput
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0()); }
+		ruleParameterInput
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_7_0_1_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0()); }
+		ruleParameterInout
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0()); }
+		ruleParameterInout
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_7_0_1_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0()); }
+		ruleParameterOutput
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0()); }
+		ruleParameterOutput
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_7_0_1_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0()); }
+		ruleParameterReturn
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0()); }
+		ruleParameterReturn
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PortAssignment_7_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_7_1_0_0()); }
+		rulePort
+		{ after(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_7_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__SignalAssignment_7_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_7_1_1_0()); }
+		ruleSignal
+		{ after(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_7_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__BufferAssignment_7_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_7_1_2_0()); }
+		ruleBuffer
+		{ after(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_7_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ChannelAssignment_7_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_7_1_3_0()); }
+		ruleChannel
+		{ after(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_7_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__TypedefAssignment_7_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PropertyAssignment_7_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_7_1_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_7_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_8_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0()); }
+		ruleParameterInput
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_8_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0()); }
+		ruleParameterInput
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_8_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0()); }
+		ruleParameterInout
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_8_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0()); }
+		ruleParameterInout
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_8_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0()); }
+		ruleParameterOutput
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_8_2_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0()); }
+		ruleParameterOutput
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_8_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0()); }
+		ruleParameterReturn
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ParameterAssignment_8_3_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0()); }
+		ruleParameterReturn
+		{ after(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PortAssignment_9_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_9_0_1_0_0()); }
+		rulePort
+		{ after(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_9_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__SignalAssignment_9_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_9_0_1_1_0()); }
+		ruleSignal
+		{ after(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_9_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__BufferAssignment_9_0_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_9_0_1_2_0()); }
+		ruleBuffer
+		{ after(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_9_0_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ChannelAssignment_9_0_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_9_0_1_3_0()); }
+		ruleChannel
+		{ after(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_9_0_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__TypedefAssignment_9_0_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PropertyAssignment_9_0_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_9_0_1_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_9_0_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PortAssignment_9_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortPortPublicParserRuleCall_9_1_1_0_0()); }
+		rulePortPublic
+		{ after(grammarAccess.getStatemachineAccess().getPortPortPublicParserRuleCall_9_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__SignalAssignment_9_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0()); }
+		ruleSignalPublic
+		{ after(grammarAccess.getStatemachineAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__BufferAssignment_9_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0()); }
+		ruleBufferPublic
+		{ after(grammarAccess.getStatemachineAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ChannelAssignment_9_1_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0()); }
+		ruleChannelPublic
+		{ after(grammarAccess.getStatemachineAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__TypedefAssignment_9_1_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PropertyAssignment_9_1_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0()); }
+		ruleVariablePublic
+		{ after(grammarAccess.getStatemachineAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PortAssignment_9_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0()); }
+		rulePortProtected
+		{ after(grammarAccess.getStatemachineAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__SignalAssignment_9_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0()); }
+		ruleSignalProtected
+		{ after(grammarAccess.getStatemachineAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__BufferAssignment_9_2_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0()); }
+		ruleBufferProtected
+		{ after(grammarAccess.getStatemachineAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ChannelAssignment_9_2_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0()); }
+		ruleChannelProtected
+		{ after(grammarAccess.getStatemachineAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__TypedefAssignment_9_2_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PropertyAssignment_9_2_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0()); }
+		ruleVariableProtected
+		{ after(grammarAccess.getStatemachineAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PortAssignment_9_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0()); }
+		rulePortPrivate
+		{ after(grammarAccess.getStatemachineAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__SignalAssignment_9_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0()); }
+		ruleSignalPrivate
+		{ after(grammarAccess.getStatemachineAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__BufferAssignment_9_3_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0()); }
+		ruleBufferPrivate
+		{ after(grammarAccess.getStatemachineAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ChannelAssignment_9_3_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0()); }
+		ruleChannelPrivate
+		{ after(grammarAccess.getStatemachineAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__TypedefAssignment_9_3_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0()); }
+		ruleTypeDefinition
+		{ after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__PropertyAssignment_9_3_1_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0()); }
+		ruleVariablePrivate
+		{ after(grammarAccess.getStatemachineAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__RoutineAssignment_10_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ProcedureAssignment_10_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0()); }
+		ruleProcedure
+		{ after(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__RoutineAssignment_10_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_1_0_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ProcedureAssignment_10_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_1_1_0()); }
+		ruleProcedure
+		{ after(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__RegionAssignment_11_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionParserRuleCall_11_0_0()); }
+		ruleStatemachineRegion
+		{ after(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionParserRuleCall_11_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__RegionAssignment_11_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0()); }
+		ruleStatemachineRegionLite
+		{ after(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__ExecutionAssignment_12_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getExecutionModelOfExecutionParserRuleCall_12_0_0()); }
+		ruleModelOfExecution
+		{ after(grammarAccess.getStatemachineAccess().getExecutionModelOfExecutionParserRuleCall_12_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Statemachine__InteractionAssignment_12_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineAccess().getInteractionModelOfInteractionParserRuleCall_12_1_0()); }
+		ruleModelOfInteraction
+		{ after(grammarAccess.getStatemachineAccess().getInteractionModelOfInteractionParserRuleCall_12_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__NameAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getNameESIdentifierParserRuleCall_1_1_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getStatemachineRegionAccess().getNameESIdentifierParserRuleCall_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_1_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__VertexAssignment_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getVertexStateParserRuleCall_2_0_0()); }
+		ruleState
+		{ after(grammarAccess.getStatemachineRegionAccess().getVertexStateParserRuleCall_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegion__VertexAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionAccess().getVertexPseudostateParserRuleCall_2_1_0()); }
+		rulePseudostate
+		{ after(grammarAccess.getStatemachineRegionAccess().getVertexPseudostateParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegionLite__VertexAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionLiteAccess().getVertexStateParserRuleCall_0_0()); }
+		ruleState
+		{ after(grammarAccess.getStatemachineRegionLiteAccess().getVertexStateParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StatemachineRegionLite__VertexAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStatemachineRegionLiteAccess().getVertexPseudostateParserRuleCall_1_0()); }
+		rulePseudostate
+		{ after(grammarAccess.getStatemachineRegionLiteAccess().getVertexPseudostateParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__CompositeAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0()); }
+			'state'
+			{ after(grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__OrthogonalAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0()); }
+		(
+			{ before(grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0()); }
+			'and'
+			{ after(grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0()); }
+		)
+		{ after(grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__NameAssignment_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getNameESIdentifierParserRuleCall_6_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getCompositeStateAccess().getNameESIdentifierParserRuleCall_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__UnrestrictedNameAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getCompositeStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__RegionAssignment_8_0_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0()); }
+		ruleStatemachineRegion
+		{ after(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__MoeAssignment_8_0_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0()); }
+		rulemoeCompositeStateRoutines
+		{ after(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__TransitionAssignment_8_0_1_0_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_0_2_1_0()); }
+		ruleTransition
+		{ after(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_0_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__RegionAssignment_8_0_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0()); }
+		ruleStatemachineRegionLite
+		{ after(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__TransitionAssignment_8_0_1_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_1_1_0_0()); }
+		ruleTransition
+		{ after(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CompositeState__MoeAssignment_8_0_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_1_0()); }
+		rulemoeCompositeStateRoutines
+		{ after(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeCompositeStateRoutines__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAlternatives_1_0()); }
+		(rule__MoeCompositeStateRoutines__NameAlternatives_1_0)
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAlternatives_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeCompositeStateRoutines__BodyBlockAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__SimpleAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0()); }
+			'state'
+			{ after(grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getSimpleStateAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getSimpleStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__TransitionAssignment_5_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getTransitionTransitionParserRuleCall_5_0_1_0_0()); }
+		ruleTransition
+		{ after(grammarAccess.getSimpleStateAccess().getTransitionTransitionParserRuleCall_5_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SimpleState__MoeAssignment_5_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSimpleStateAccess().getMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0()); }
+		rulemoeSimpleStateRoutines
+		{ after(grammarAccess.getSimpleStateAccess().getMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeSimpleStateRoutines__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAlternatives_1_0()); }
+		(rule__MoeSimpleStateRoutines__NameAlternatives_1_0)
+		{ after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAlternatives_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeSimpleStateRoutines__BodyBlockAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__SimpleAssignment_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0()); }
+		(
+			{ before(grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0()); }
+			'state'
+			{ after(grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0()); }
+		)
+		{ after(grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__NameAssignment_1_0_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStartStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getStartStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__SimpleAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0()); }
+			'#start'
+			{ after(grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStartStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getStartStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__TransitionAssignment_3_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStartStateAccess().getTransitionTransitionParserRuleCall_3_0_1_0_0()); }
+		ruleTransition
+		{ after(grammarAccess.getStartStateAccess().getTransitionTransitionParserRuleCall_3_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StartState__MoeAssignment_3_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStartStateAccess().getMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0()); }
+		rulemoeStartStateRoutines
+		{ after(grammarAccess.getStartStateAccess().getMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeStartStateRoutines__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeStartStateRoutinesAccess().getNameAlternatives_1_0()); }
+		(rule__MoeStartStateRoutines__NameAlternatives_1_0)
+		{ after(grammarAccess.getMoeStartStateRoutinesAccess().getNameAlternatives_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeStartStateRoutines__BodyBlockAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__SimpleAssignment_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0()); }
+		(
+			{ before(grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0()); }
+			'state'
+			{ after(grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0()); }
+		)
+		{ after(grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__NameAssignment_1_0_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFinalStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getFinalStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__SimpleAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0()); }
+			'#final'
+			{ after(grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFinalStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getFinalStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FinalState__MoeAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFinalStateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_0()); }
+		rulemoeFinalStateRoutines
+		{ after(grammarAccess.getFinalStateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeFinalStateRoutines__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAlternatives_1_0()); }
+		(rule__MoeFinalStateRoutines__NameAlternatives_1_0)
+		{ after(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAlternatives_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeFinalStateRoutines__BodyBlockAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__KindAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherPseudostateAccess().getKindPseudostateKindEnumRuleCall_4_0()); }
+		rulePseudostateKind
+		{ after(grammarAccess.getOtherPseudostateAccess().getKindPseudostateKindEnumRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__NameAssignment_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherPseudostateAccess().getNameESIdentifierParserRuleCall_6_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getOtherPseudostateAccess().getNameESIdentifierParserRuleCall_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__UnrestrictedNameAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherPseudostate__TransitionAssignment_8_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherPseudostateAccess().getTransitionTransitionParserRuleCall_8_0_1_0()); }
+		ruleTransition
+		{ after(grammarAccess.getOtherPseudostateAccess().getTransitionTransitionParserRuleCall_8_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__KindAssignment_1_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getKindPseudostateInitialKindEnumRuleCall_1_0_3_0()); }
+		rulePseudostateInitialKind
+		{ after(grammarAccess.getPseudostateInitialAccess().getKindPseudostateInitialKindEnumRuleCall_1_0_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__NameAssignment_1_0_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_0_5_0()); }
+		(rule__PseudostateInitial__NameAlternatives_1_0_5_0)
+		{ after(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_0_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__NameAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_1_0()); }
+		(rule__PseudostateInitial__NameAlternatives_1_1_0)
+		{ after(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PseudostateInitial__TransitionAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPseudostateInitialAccess().getTransitionTransitionParserRuleCall_3_0_1_0()); }
+		ruleTransition
+		{ after(grammarAccess.getPseudostateInitialAccess().getTransitionTransitionParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__KindAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEndingPseudostateAccess().getKindEndingPseudostateKindEnumRuleCall_4_0()); }
+		ruleEndingPseudostateKind
+		{ after(grammarAccess.getEndingPseudostateAccess().getKindEndingPseudostateKindEnumRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__NameAssignment_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEndingPseudostateAccess().getNameESIdentifierParserRuleCall_6_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getEndingPseudostateAccess().getNameESIdentifierParserRuleCall_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__UnrestrictedNameAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EndingPseudostate__MoeAssignment_8_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEndingPseudostateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_0()); }
+		rulemoeFinalStateRoutines
+		{ after(grammarAccess.getEndingPseudostateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__RoutineAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_2_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__InitRoutineAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getInitRoutineMoeRoutineParserRuleCall_3_0_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getInitRoutineMoeRoutineParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__FinalRoutineAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getFinalRoutineMoeRoutineParserRuleCall_3_1_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getFinalRoutineMoeRoutineParserRuleCall_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__EnableRoutineAssignment_3_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getEnableRoutineMoeRoutineParserRuleCall_3_2_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getEnableRoutineMoeRoutineParserRuleCall_3_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__DisableRoutineAssignment_3_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getDisableRoutineMoeRoutineParserRuleCall_3_3_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getDisableRoutineMoeRoutineParserRuleCall_3_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__IrunRoutineAssignment_3_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getIrunRoutineMoeRoutineParserRuleCall_3_6_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getIrunRoutineMoeRoutineParserRuleCall_3_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__RunRoutineAssignment_3_7_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_3_7_1_0()); }
+		rulemoeRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_3_7_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfExecution__RoutineAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_4_0()); }
+		ruleRoutine
+		{ after(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__DomainAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_1_1_0()); }
+		ruleFunctionalParameterSet
+		{ after(grammarAccess.getMoeRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__CodomainAssignment_2_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_0_1_0()); }
+		ruleFunctionalParameterSet
+		{ after(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__CodomainAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_1_0()); }
+		ruleFunctionalParameterSet
+		{ after(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MoeRoutine__BodyBlockAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMoeRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getMoeRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRoutineAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getRoutineAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRoutineAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getRoutineAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRoutineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getRoutineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__DomainAssignment_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_5_1_0()); }
+		ruleFunctionalParameterSet
+		{ after(grammarAccess.getRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_5_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__CodomainAssignment_6_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_6_1_0_1_0()); }
+		ruleFunctionalParameterSet
+		{ after(grammarAccess.getRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_6_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__CodomainAssignment_6_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRoutineAccess().getCodomainFormalParameterSetParserRuleCall_6_1_1_0()); }
+		ruleFormalParameterSet
+		{ after(grammarAccess.getRoutineAccess().getCodomainFormalParameterSetParserRuleCall_6_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Routine__BodyBlockAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRoutineAccess().getBodyBlockBlockStatementParserRuleCall_7_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getRoutineAccess().getBodyBlockBlockStatementParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfInteraction__RoutesAssignment_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfInteractionAccess().getRoutesRouteParserRuleCall_2_0_0()); }
+		ruleRoute
+		{ after(grammarAccess.getModelOfInteractionAccess().getRoutesRouteParserRuleCall_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ModelOfInteraction__ConnectionsAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModelOfInteractionAccess().getConnectionsConnectionParserRuleCall_2_1_0()); }
+		ruleConnection
+		{ after(grammarAccess.getModelOfInteractionAccess().getConnectionsConnectionParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__ProtocolAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRouteAccess().getProtocolComRouteProtocolParserRuleCall_3_0()); }
+		ruleComRouteProtocol
+		{ after(grammarAccess.getRouteAccess().getProtocolComRouteProtocolParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__NameAssignment_5_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRouteAccess().getNameESIdentifierParserRuleCall_5_0_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getRouteAccess().getNameESIdentifierParserRuleCall_5_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__UnrestrictedNameAssignment_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRouteAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getRouteAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__SignalsAssignment_7_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_0_0()); }
+		(
+			{ before(grammarAccess.getRouteAccess().getSignalsSignalESUfidParserRuleCall_7_1_0_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getRouteAccess().getSignalsSignalESUfidParserRuleCall_7_1_0_0_1()); }
+		)
+		{ after(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Route__SignalsAssignment_7_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getRouteAccess().getSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getRouteAccess().getSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__ProtocolAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getProtocolComProtocolKindEnumRuleCall_0_0()); }
+		ruleComProtocolKind
+		{ after(grammarAccess.getComRouteProtocolAccess().getProtocolComProtocolKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__ProtocolAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_1_0_0()); }
+		ruleBufferProtocolKind
+		{ after(grammarAccess.getComRouteProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_1_1_0_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_1_1_0_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_1_1_1_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_1_1_1_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Inner_bufferAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComRouteProtocol__Ref_bufferAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_3_0()); }
+		(
+			{ before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_3_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_3_0_1()); }
+		)
+		{ after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__ProtocolAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConnectionAccess().getProtocolComProtocolParserRuleCall_2_0()); }
+		ruleComProtocol
+		{ after(grammarAccess.getConnectionAccess().getProtocolComProtocolParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__NameAssignment_4_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConnectionAccess().getNameESIdentifierParserRuleCall_4_0_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getConnectionAccess().getNameESIdentifierParserRuleCall_4_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__UnrestrictedNameAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConnectionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getConnectionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Connection__ComPointsAssignment_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConnectionAccess().getComPointsComPointParserRuleCall_6_0()); }
+		ruleComPoint
+		{ after(grammarAccess.getConnectionAccess().getComPointsComPointParserRuleCall_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__ProtocolAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getProtocolComEnvRdvProtocolKindEnumRuleCall_0_0()); }
+		ruleComEnvRdvProtocolKind
+		{ after(grammarAccess.getComProtocolAccess().getProtocolComEnvRdvProtocolKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__ProtocolAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0()); }
+		ruleComMultiRdvProtocolKind
+		{ after(grammarAccess.getComProtocolAccess().getProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__CastAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_1_1_1_0()); }
+		ruleComCastKing
+		{ after(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__ProtocolAssignment_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_2_0_0()); }
+		ruleBufferProtocolKind
+		{ after(grammarAccess.getComProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_1_0_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_1_0_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_1_1_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_1_1_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Inner_bufferAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_3_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__Ref_bufferAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_4_0()); }
+		(
+			{ before(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_4_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_4_0_1()); }
+		)
+		{ after(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComProtocol__CastAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_5_0()); }
+		ruleComCastKing
+		{ after(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__DirectionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getComPointAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__ProtocolAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointAccess().getProtocolComPointProtocolParserRuleCall_2_1_0()); }
+		ruleComPointProtocol
+		{ after(grammarAccess.getComPointAccess().getProtocolComPointProtocolParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__PointAssignment_3_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointAccess().getPointComElementParserRuleCall_3_0_0_0()); }
+		ruleComElement
+		{ after(grammarAccess.getComPointAccess().getPointComElementParserRuleCall_3_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPoint__PointsAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointAccess().getPointsComElementParserRuleCall_3_1_1_0()); }
+		ruleComElement
+		{ after(grammarAccess.getComPointAccess().getPointsComElementParserRuleCall_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__ProtocolAssignment_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_0_0_0()); }
+		ruleBufferProtocolKind
+		{ after(grammarAccess.getComPointProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_0_1_0_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_0_1_0_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_0_1_1_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_0_1_1_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Inner_bufferAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComPointProtocol__Ref_bufferAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__KindAssignment_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComElementAccess().getKindAlternatives_0_1_1_0()); }
+		(rule__ComElement__KindAlternatives_0_1_1_0)
+		{ after(grammarAccess.getComElementAccess().getKindAlternatives_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__ElementAssignment_0_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_0_1_2_0()); }
+		(
+			{ before(grammarAccess.getComElementAccess().getElementNamedElementESIdentifierParserRuleCall_0_1_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getComElementAccess().getElementNamedElementESIdentifierParserRuleCall_0_1_2_0_1()); }
+		)
+		{ after(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_0_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__TargetAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComElementAccess().getTargetLiteralReferenceMachineContextParserRuleCall_1_1_0()); }
+		ruleLiteralReferenceMachineContext
+		{ after(grammarAccess.getComElementAccess().getTargetLiteralReferenceMachineContextParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__KindAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComElementAccess().getKindAlternatives_1_2_0()); }
+		(rule__ComElement__KindAlternatives_1_2_0)
+		{ after(grammarAccess.getComElementAccess().getKindAlternatives_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ComElement__ElementAssignment_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_1_3_0()); }
+		(
+			{ before(grammarAccess.getComElementAccess().getElementNamedElementESIdentifierParserRuleCall_1_3_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getComElementAccess().getElementNamedElementESIdentifierParserRuleCall_1_3_0_1()); }
+		)
+		{ after(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__MultiplicityAssignment_0_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0()); }
+		ruleDataTypeMultiplicity
+		{ after(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__TyperefAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeCrossReference_1_1_0()); }
+		(
+			{ before(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeESUfidParserRuleCall_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeESUfidParserRuleCall_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeCrossReference_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataTypeReference__MultiplicityAssignment_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0()); }
+		ruleDataTypeMultiplicity
+		{ after(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__SupportAssignment_5_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportPrimitiveTypeParserRuleCall_5_0_0_0()); }
+		rulePrimitiveType
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportPrimitiveTypeParserRuleCall_5_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0()); }
+		ruleDataTypeMultiplicity
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeCrossReference_5_1_0_0()); }
+		(
+			{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1()); }
+		)
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeCrossReference_5_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0()); }
+		ruleDataTypeMultiplicity
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinition__TypedefAssignment_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0()); }
+		(
+			{ before(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0()); }
+			';'
+			{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0()); }
+		)
+		{ after(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportPrimitiveTypeParserRuleCall_3_0_0_0()); }
+		rulePrimitiveType
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportPrimitiveTypeParserRuleCall_3_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_0_1_1_0()); }
+		ruleDataTypeMultiplicity
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeCrossReference_3_1_0_0()); }
+		(
+			{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeESUfidParserRuleCall_3_1_0_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeESUfidParserRuleCall_3_1_0_0_1()); }
+		)
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeCrossReference_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_1_1_1_0()); }
+		ruleDataTypeMultiplicity
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0()); }
+		(
+			{ before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0()); }
+			';'
+			{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0()); }
+		)
+		{ after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__SignAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); }
+		rulePrimitiveNumberSign
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__SizeAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveIntegerType__SizeAssignment_3_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__SignAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); }
+		rulePrimitiveNumberSign
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__SizeAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRationalType__SizeAssignment_3_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__SignAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); }
+		rulePrimitiveNumberSign
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__SizeAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveFloatType__SizeAssignment_3_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__SignAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRealTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); }
+		rulePrimitiveNumberSign
+		{ after(grammarAccess.getPrimitiveRealTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__SizeAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveRealType__SizeAssignment_3_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__SupportAssignment_0_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0()); }
+		rulePrimitiveTimeNumberType
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__SupportAssignment_0_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0()); }
+		rulePrimitiveTimeNumberType
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__ClockAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0()); }
+			'clock'
+			{ after(grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__SupportAssignment_1_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0()); }
+		rulePrimitiveTimeNumberType
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveTimeType__SupportAssignment_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0()); }
+		rulePrimitiveTimeNumberType
+		{ after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__SizeAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_0_1_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveStringType__SizeAssignment_2_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_1_2_0()); }
+		ruleEInt
+		{ after(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__ExpectedAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedPrimitiveInstanceKindEnumRuleCall_1_0()); }
+		rulePrimitiveInstanceKind
+		{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedPrimitiveInstanceKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimitiveInstanceType__ModelAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementCrossReference_2_1_0()); }
+		(
+			{ before(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementESIdentifierParserRuleCall_2_1_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementESIdentifierParserRuleCall_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementCrossReference_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__SupportAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getSupportPrimitiveNumberTypeParserRuleCall_3_0()); }
+		rulePrimitiveNumberType
+		{ after(grammarAccess.getIntervalTypeAccess().getSupportPrimitiveNumberTypeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__LopenAssignment_4_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0()); }
+		(
+			{ before(grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0()); }
+			']'
+			{ after(grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0()); }
+		)
+		{ after(grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__InfimumAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getInfimumExpressionParserRuleCall_5_0()); }
+		ruleExpression
+		{ after(grammarAccess.getIntervalTypeAccess().getInfimumExpressionParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__SupremumAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getSupremumExpressionParserRuleCall_7_0()); }
+		ruleExpression
+		{ after(grammarAccess.getIntervalTypeAccess().getSupremumExpressionParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalType__RopenAssignment_8_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0()); }
+		(
+			{ before(grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0()); }
+			'['
+			{ after(grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0()); }
+		)
+		{ after(grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__SupportAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getSupportPrimitiveNumberTypeParserRuleCall_7_0()); }
+		rulePrimitiveNumberType
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getSupportPrimitiveNumberTypeParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__LopenAssignment_8_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0()); }
+		(
+			{ before(grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0()); }
+			']'
+			{ after(grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0()); }
+		)
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__InfimumAssignment_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumExpressionParserRuleCall_9_0()); }
+		ruleExpression
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumExpressionParserRuleCall_9_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__SupremumAssignment_11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumExpressionParserRuleCall_11_0()); }
+		ruleExpression
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumExpressionParserRuleCall_11_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinition__RopenAssignment_12_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0()); }
+		(
+			{ before(grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0()); }
+			'['
+			{ after(grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0()); }
+		)
+		{ after(grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__SupportAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportPrimitiveNumberTypeParserRuleCall_5_0()); }
+		rulePrimitiveNumberType
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportPrimitiveNumberTypeParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0()); }
+		(
+			{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0()); }
+			']'
+			{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0()); }
+		)
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__InfimumAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumExpressionParserRuleCall_7_0()); }
+		ruleExpression
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumExpressionParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__SupremumAssignment_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumExpressionParserRuleCall_9_0()); }
+		ruleExpression
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumExpressionParserRuleCall_9_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0()); }
+		(
+			{ before(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0()); }
+			'['
+			{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0()); }
+		)
+		{ after(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__ContainerAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeAccess().getContainerCollectionKindEnumRuleCall_1_0()); }
+		ruleCollectionKind
+		{ after(grammarAccess.getCollectionTypeAccess().getContainerCollectionKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__SupportAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeAccess().getSupportDataTypeParserRuleCall_3_0()); }
+		ruleDataType
+		{ after(grammarAccess.getCollectionTypeAccess().getSupportDataTypeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__SizeAssignment_4_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeAccess().getSizeEIntParserRuleCall_4_1_0_0()); }
+		ruleEInt
+		{ after(grammarAccess.getCollectionTypeAccess().getSizeEIntParserRuleCall_4_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionType__UnboundedAssignment_4_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0()); }
+		(
+			{ before(grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0()); }
+			'*'
+			{ after(grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0()); }
+		)
+		{ after(grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__ContainerAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getContainerCollectionKindEnumRuleCall_5_0()); }
+		ruleCollectionKind
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getContainerCollectionKindEnumRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__SupportAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getSupportDataTypeParserRuleCall_7_0()); }
+		ruleDataType
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getSupportDataTypeParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__SizeAssignment_8_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getSizeEIntParserRuleCall_8_1_0_0()); }
+		ruleEInt
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getSizeEIntParserRuleCall_8_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0()); }
+		(
+			{ before(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0()); }
+			'*'
+			{ after(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0()); }
+		)
+		{ after(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__ContainerAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerCollectionKindEnumRuleCall_3_0()); }
+		ruleCollectionKind
+		{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerCollectionKindEnumRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__SupportAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportDataTypeParserRuleCall_5_0()); }
+		ruleDataType
+		{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportDataTypeParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeEIntParserRuleCall_6_1_0_0()); }
+		ruleEInt
+		{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeEIntParserRuleCall_6_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0()); }
+		(
+			{ before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0()); }
+			'*'
+			{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0()); }
+		)
+		{ after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__LiteralAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_3_0()); }
+		ruleEnumerationLiteral
+		{ after(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationType__LiteralAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_4_1_0()); }
+		ruleEnumerationLiteral
+		{ after(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__TypedefAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0()); }
+		(
+			{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0()); }
+			'enum'
+			{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0()); }
+		)
+		{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__LiteralAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_7_0()); }
+		ruleEnumerationLiteral
+		{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinition__LiteralAssignment_8_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_8_1_0()); }
+		ruleEnumerationLiteral
+		{ after(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_8_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0()); }
+		(
+			{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0()); }
+			'enum'
+			{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0()); }
+		)
+		{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_5_0()); }
+		ruleEnumerationLiteral
+		{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_6_1_0()); }
+		ruleEnumerationLiteral
+		{ after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__NameAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationLiteralAccess().getNameESIdentifierParserRuleCall_0_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getEnumerationLiteralAccess().getNameESIdentifierParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__UnrestrictedNameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EnumerationLiteral__ValueAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEnumerationLiteralAccess().getValueLiteralTerminalExpressionParserRuleCall_2_1_0()); }
+		ruleLiteralTerminalExpression
+		{ after(grammarAccess.getEnumerationLiteralAccess().getValueLiteralTerminalExpressionParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureType__PropertyAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeAccess().getPropertyVariableParserRuleCall_3_0()); }
+		ruleVariable
+		{ after(grammarAccess.getStructureTypeAccess().getPropertyVariableParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getStructureTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__TypedefAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0()); }
+		(
+			{ before(grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0()); }
+			'struct'
+			{ after(grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0()); }
+		)
+		{ after(grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinition__PropertyAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); }
+		ruleVariable
+		{ after(grammarAccess.getStructureTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__TypedefAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0()); }
+		(
+			{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0()); }
+			'struct'
+			{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0()); }
+		)
+		{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StructureTypeDefinitionImpl__PropertyAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionType__PropertyAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeAccess().getPropertyVariableParserRuleCall_3_0()); }
+		ruleVariable
+		{ after(grammarAccess.getUnionTypeAccess().getPropertyVariableParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getUnionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__TypedefAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0()); }
+		(
+			{ before(grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0()); }
+			'union'
+			{ after(grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0()); }
+		)
+		{ after(grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinition__PropertyAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); }
+		ruleVariable
+		{ after(grammarAccess.getUnionTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__TypedefAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0()); }
+		(
+			{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0()); }
+			'union'
+			{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0()); }
+		)
+		{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__UnionTypeDefinitionImpl__PropertyAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceType__PropertyAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeAccess().getPropertyVariableParserRuleCall_3_0()); }
+		ruleVariable
+		{ after(grammarAccess.getChoiceTypeAccess().getPropertyVariableParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getChoiceTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__TypedefAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0()); }
+		(
+			{ before(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0()); }
+			'choice'
+			{ after(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0()); }
+		)
+		{ after(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinition__PropertyAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); }
+		ruleVariable
+		{ after(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0()); }
+		(
+			{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0()); }
+			'choice'
+			{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0()); }
+		)
+		{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); }
+		ruleVariable
+		{ after(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__StaticAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0()); }
+		(
+			{ before(grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0()); }
+			'static'
+			{ after(grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0()); }
+		)
+		{ after(grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__FinalAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0()); }
+			'final'
+			{ after(grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__ReferenceAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0()); }
+		(
+			{ before(grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0()); }
+			'reference'
+			{ after(grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0()); }
+		)
+		{ after(grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__VolatileAssignment_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0()); }
+		(
+			{ before(grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0()); }
+			'volatile'
+			{ after(grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0()); }
+		)
+		{ after(grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Modifier__TransientAssignment_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0()); }
+		(
+			{ before(grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0()); }
+			'transient'
+			{ after(grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0()); }
+		)
+		{ after(grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__VisibilityAssignment_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getVariableAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__ModifierAssignment_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getModifierModifierParserRuleCall_0_1_0()); }
+		ruleModifier
+		{ after(grammarAccess.getVariableAccess().getModifierModifierParserRuleCall_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__ConstAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getConstValKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getVariableAccess().getConstValKeyword_1_1_0()); }
+			'val'
+			{ after(grammarAccess.getVariableAccess().getConstValKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getVariableAccess().getConstValKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__ConstAssignment_1_2_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0()); }
+		(
+			{ before(grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0()); }
+			'const'
+			{ after(grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0()); }
+		)
+		{ after(grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__ConstAssignment_1_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0()); }
+		(
+			{ before(grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0()); }
+			'final'
+			{ after(grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0()); }
+		)
+		{ after(grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__MacroAssignment_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0()); }
+		(
+			{ before(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0()); }
+			'macro'
+			{ after(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0()); }
+		)
+		{ after(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__MacroAssignment_1_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0()); }
+		(
+			{ before(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0()); }
+			'macro'
+			{ after(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0()); }
+		)
+		{ after(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__ConstAssignment_1_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0()); }
+		(
+			{ before(grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0()); }
+			'val'
+			{ after(grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0()); }
+		)
+		{ after(grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__TypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getTypeDataTypeParserRuleCall_2_0()); }
+		ruleDataType
+		{ after(grammarAccess.getVariableAccess().getTypeDataTypeParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getVariableAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getVariableAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__DefaultValueAssignment_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getDefaultValueExpressionParserRuleCall_5_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getVariableAccess().getDefaultValueExpressionParserRuleCall_5_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Variable__OnWriteActionAssignment_6_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableAccess().getOnWriteActionOnWriteRoutineParserRuleCall_6_0_1_0()); }
+		ruleOnWriteRoutine
+		{ after(grammarAccess.getVariableAccess().getOnWriteActionOnWriteRoutineParserRuleCall_6_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__ParameterAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOnWriteRoutineAccess().getParameterVariableRoutineParameterParserRuleCall_2_1_0()); }
+		ruleVariableRoutineParameter
+		{ after(grammarAccess.getOnWriteRoutineAccess().getParameterVariableRoutineParameterParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OnWriteRoutine__BodyBlockAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOnWriteRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getOnWriteRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__TypeAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableRoutineParameterAccess().getTypeDataTypeParserRuleCall_0_0()); }
+		ruleDataType
+		{ after(grammarAccess.getVariableRoutineParameterAccess().getTypeDataTypeParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableRoutineParameterAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getVariableRoutineParameterAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableRoutineParameter__DefaultValueAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueExpressionParserRuleCall_2_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueExpressionParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__ModifierAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getModifierModifierParserRuleCall_0_0()); }
+		ruleModifier
+		{ after(grammarAccess.getVariablePublicAccess().getModifierModifierParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__ConstAssignment_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0()); }
+		(
+			{ before(grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0()); }
+			'const'
+			{ after(grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0()); }
+		)
+		{ after(grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__ConstAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0()); }
+		(
+			{ before(grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0()); }
+			'final'
+			{ after(grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0()); }
+		)
+		{ after(grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__MacroAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0()); }
+			'macro'
+			{ after(grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__VisibilityAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getVisibilityPublicVariableVisibilityKindEnumRuleCall_2_0()); }
+		rulePublicVariableVisibilityKind
+		{ after(grammarAccess.getVariablePublicAccess().getVisibilityPublicVariableVisibilityKindEnumRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__TypeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getTypeDataTypeParserRuleCall_3_0()); }
+		ruleDataType
+		{ after(grammarAccess.getVariablePublicAccess().getTypeDataTypeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__NameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getNameESIdentifierParserRuleCall_4_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getVariablePublicAccess().getNameESIdentifierParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__UnrestrictedNameAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getVariablePublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__DefaultValueAssignment_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getVariablePublicAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePublic__OnWriteActionAssignment_7_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePublicAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); }
+		ruleOnWriteRoutine
+		{ after(grammarAccess.getVariablePublicAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__ModifierAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getModifierModifierParserRuleCall_0_0()); }
+		ruleModifier
+		{ after(grammarAccess.getVariableProtectedAccess().getModifierModifierParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__ConstAssignment_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0()); }
+		(
+			{ before(grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0()); }
+			'const'
+			{ after(grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0()); }
+		)
+		{ after(grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__ConstAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0()); }
+		(
+			{ before(grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0()); }
+			'final'
+			{ after(grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0()); }
+		)
+		{ after(grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__MacroAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0()); }
+			'macro'
+			{ after(grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__VisibilityAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getVisibilityProtectedVariableVisibilityKindEnumRuleCall_2_0()); }
+		ruleProtectedVariableVisibilityKind
+		{ after(grammarAccess.getVariableProtectedAccess().getVisibilityProtectedVariableVisibilityKindEnumRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__TypeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getTypeDataTypeParserRuleCall_3_0()); }
+		ruleDataType
+		{ after(grammarAccess.getVariableProtectedAccess().getTypeDataTypeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__NameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getNameESIdentifierParserRuleCall_4_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getVariableProtectedAccess().getNameESIdentifierParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__UnrestrictedNameAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__DefaultValueAssignment_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getVariableProtectedAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariableProtected__OnWriteActionAssignment_7_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariableProtectedAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); }
+		ruleOnWriteRoutine
+		{ after(grammarAccess.getVariableProtectedAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__ModifierAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getModifierModifierParserRuleCall_0_0()); }
+		ruleModifier
+		{ after(grammarAccess.getVariablePrivateAccess().getModifierModifierParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__ConstAssignment_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0()); }
+		(
+			{ before(grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0()); }
+			'const'
+			{ after(grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0()); }
+		)
+		{ after(grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__ConstAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0()); }
+		(
+			{ before(grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0()); }
+			'final'
+			{ after(grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0()); }
+		)
+		{ after(grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__MacroAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0()); }
+			'macro'
+			{ after(grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__VisibilityAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getVisibilityPrivateVariableVisibilityKindEnumRuleCall_2_0()); }
+		rulePrivateVariableVisibilityKind
+		{ after(grammarAccess.getVariablePrivateAccess().getVisibilityPrivateVariableVisibilityKindEnumRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__TypeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getTypeDataTypeParserRuleCall_3_0()); }
+		ruleDataType
+		{ after(grammarAccess.getVariablePrivateAccess().getTypeDataTypeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__NameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getNameESIdentifierParserRuleCall_4_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getVariablePrivateAccess().getNameESIdentifierParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__UnrestrictedNameAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__DefaultValueAssignment_6_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getVariablePrivateAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__VariablePrivate__OnWriteActionAssignment_7_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getVariablePrivateAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); }
+		ruleOnWriteRoutine
+		{ after(grammarAccess.getVariablePrivateAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__ParameterAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_1_0()); }
+		ruleFunctionalParameter
+		{ after(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameterSet__ParameterAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_2_1_0()); }
+		ruleFunctionalParameter
+		{ after(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__DirectionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFunctionalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0()); }
+		ruleParameterDirectionKind
+		{ after(grammarAccess.getFunctionalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__TypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFunctionalParameterAccess().getTypeDataTypeParserRuleCall_2_0()); }
+		ruleDataType
+		{ after(grammarAccess.getFunctionalParameterAccess().getTypeDataTypeParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFunctionalParameterAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getFunctionalParameterAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FunctionalParameter__DefaultValueAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFunctionalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getFunctionalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__ParameterAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameterSet__ParameterAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__DirectionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFormalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0()); }
+		ruleParameterDirectionKind
+		{ after(grammarAccess.getFormalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__TypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFormalParameterAccess().getTypeDataTypeParserRuleCall_2_0()); }
+		ruleDataType
+		{ after(grammarAccess.getFormalParameterAccess().getTypeDataTypeParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFormalParameterAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getFormalParameterAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__FormalParameter__DefaultValueAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getFormalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getFormalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__DirectionAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInputAccess().getDirectionParameterInputDirectionKindEnumRuleCall_0_0()); }
+		ruleParameterInputDirectionKind
+		{ after(grammarAccess.getParameterInputAccess().getDirectionParameterInputDirectionKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__TypeAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInputAccess().getTypeDataTypeParserRuleCall_1_0()); }
+		ruleDataType
+		{ after(grammarAccess.getParameterInputAccess().getTypeDataTypeParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInputAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getParameterInputAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getParameterInputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInput__DefaultValueAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInputAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getParameterInputAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__DirectionAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInoutAccess().getDirectionParameterInoutDirectionKindEnumRuleCall_0_0()); }
+		ruleParameterInoutDirectionKind
+		{ after(grammarAccess.getParameterInoutAccess().getDirectionParameterInoutDirectionKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__TypeAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInoutAccess().getTypeDataTypeParserRuleCall_1_0()); }
+		ruleDataType
+		{ after(grammarAccess.getParameterInoutAccess().getTypeDataTypeParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInoutAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getParameterInoutAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInoutAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getParameterInoutAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterInout__DefaultValueAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterInoutAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getParameterInoutAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__DirectionAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterOutputAccess().getDirectionParameterOutputDirectionKindEnumRuleCall_0_0()); }
+		ruleParameterOutputDirectionKind
+		{ after(grammarAccess.getParameterOutputAccess().getDirectionParameterOutputDirectionKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__TypeAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterOutputAccess().getTypeDataTypeParserRuleCall_1_0()); }
+		ruleDataType
+		{ after(grammarAccess.getParameterOutputAccess().getTypeDataTypeParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterOutputAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getParameterOutputAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterOutputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getParameterOutputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterOutput__DefaultValueAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterOutputAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getParameterOutputAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__DirectionAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterReturnAccess().getDirectionParameterReturnDirectionKindEnumRuleCall_0_0()); }
+		ruleParameterReturnDirectionKind
+		{ after(grammarAccess.getParameterReturnAccess().getDirectionParameterReturnDirectionKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__TypeAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterReturnAccess().getTypeDataTypeParserRuleCall_1_0()); }
+		ruleDataType
+		{ after(grammarAccess.getParameterReturnAccess().getTypeDataTypeParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterReturnAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getParameterReturnAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterReturnAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getParameterReturnAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ParameterReturn__DefaultValueAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getParameterReturnAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getParameterReturnAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__ContainerAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferContainerTypeAccess().getContainerBufferContainerKindEnumRuleCall_1_0()); }
+		ruleBufferContainerKind
+		{ after(grammarAccess.getBufferContainerTypeAccess().getContainerBufferContainerKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__SizeAssignment_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferContainerTypeAccess().getSizeEIntParserRuleCall_2_1_0_0()); }
+		ruleEInt
+		{ after(grammarAccess.getBufferContainerTypeAccess().getSizeEIntParserRuleCall_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferContainerType__UnboundedAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0()); }
+		(
+			{ before(grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0()); }
+			'*'
+			{ after(grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0()); }
+		)
+		{ after(grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__VisibilityAssignment_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getBufferAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__ModifierAssignment_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferAccess().getModifierModifierParserRuleCall_0_1_0()); }
+		ruleModifier
+		{ after(grammarAccess.getBufferAccess().getModifierModifierParserRuleCall_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__TypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getBufferAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getBufferAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Buffer__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getBufferAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__ModifierAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPublicAccess().getModifierModifierParserRuleCall_0_0()); }
+		ruleModifier
+		{ after(grammarAccess.getBufferPublicAccess().getModifierModifierParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPublicAccess().getVisibilityPublicBufferVisibilityKindEnumRuleCall_1_0()); }
+		rulePublicBufferVisibilityKind
+		{ after(grammarAccess.getBufferPublicAccess().getVisibilityPublicBufferVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__TypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPublicAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getBufferPublicAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPublicAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getBufferPublicAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPublic__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getBufferPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__ModifierAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferProtectedAccess().getModifierModifierParserRuleCall_0_0()); }
+		ruleModifier
+		{ after(grammarAccess.getBufferProtectedAccess().getModifierModifierParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferProtectedAccess().getVisibilityProtectedBufferVisibilityKindEnumRuleCall_1_0()); }
+		ruleProtectedBufferVisibilityKind
+		{ after(grammarAccess.getBufferProtectedAccess().getVisibilityProtectedBufferVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__TypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferProtectedAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getBufferProtectedAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferProtectedAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getBufferProtectedAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferProtected__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__ModifierAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPrivateAccess().getModifierModifierParserRuleCall_0_0()); }
+		ruleModifier
+		{ after(grammarAccess.getBufferPrivateAccess().getModifierModifierParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__VisibilityAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPrivateAccess().getVisibilityPrivateBufferVisibilityKindEnumRuleCall_1_0()); }
+		rulePrivateBufferVisibilityKind
+		{ after(grammarAccess.getBufferPrivateAccess().getVisibilityPrivateBufferVisibilityKindEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__TypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPrivateAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); }
+		ruleBufferContainerType
+		{ after(grammarAccess.getBufferPrivateAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPrivateAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getBufferPrivateAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BufferPrivate__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getPortAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__DirectionAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortAccess().getDirectionChannelDirectionEnumRuleCall_2_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getPortAccess().getDirectionChannelDirectionEnumRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getPortAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getPortAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__ParameterAssignment_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Port__ParameterAssignment_5_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPublicAccess().getVisibilityPublicPortVisibilityKindEnumRuleCall_0_0()); }
+		rulePublicPortVisibilityKind
+		{ after(grammarAccess.getPortPublicAccess().getVisibilityPublicPortVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__DirectionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getPortPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPublicAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getPortPublicAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getPortPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__ParameterAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPublic__ParameterAssignment_4_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortProtectedAccess().getVisibilityProtectedPortVisibilityKindEnumRuleCall_0_0()); }
+		ruleProtectedPortVisibilityKind
+		{ after(grammarAccess.getPortProtectedAccess().getVisibilityProtectedPortVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__DirectionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getPortProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortProtectedAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getPortProtectedAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getPortProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__ParameterAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortProtected__ParameterAssignment_4_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPrivateAccess().getVisibilityPrivatePortVisibilityKindEnumRuleCall_0_0()); }
+		rulePrivatePortVisibilityKind
+		{ after(grammarAccess.getPortPrivateAccess().getVisibilityPrivatePortVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__DirectionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getPortPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPrivateAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getPortPrivateAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getPortPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__ParameterAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PortPrivate__ParameterAssignment_4_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getSignalAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__DirectionAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalAccess().getDirectionChannelDirectionEnumRuleCall_2_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getSignalAccess().getDirectionChannelDirectionEnumRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__NameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalAccess().getNameESIdentifierParserRuleCall_3_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getSignalAccess().getNameESIdentifierParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__UnrestrictedNameAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getSignalAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__ParameterAssignment_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Signal__ParameterAssignment_5_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPublicAccess().getVisibilityPublicSignalVisibilityKindEnumRuleCall_0_0()); }
+		rulePublicSignalVisibilityKind
+		{ after(grammarAccess.getSignalPublicAccess().getVisibilityPublicSignalVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__DirectionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getSignalPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPublicAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getSignalPublicAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getSignalPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__ParameterAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPublic__ParameterAssignment_4_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalProtectedAccess().getVisibilityProtectedSignalVisibilityKindEnumRuleCall_0_0()); }
+		ruleProtectedSignalVisibilityKind
+		{ after(grammarAccess.getSignalProtectedAccess().getVisibilityProtectedSignalVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__DirectionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getSignalProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalProtectedAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getSignalProtectedAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__ParameterAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalProtected__ParameterAssignment_4_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPrivateAccess().getVisibilityPrivateSignalVisibilityKindEnumRuleCall_0_0()); }
+		rulePrivateSignalVisibilityKind
+		{ after(grammarAccess.getSignalPrivateAccess().getVisibilityPrivateSignalVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__DirectionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getSignalPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPrivateAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getSignalPrivateAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__ParameterAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalPrivate__ParameterAssignment_4_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+		ruleFormalParameter
+		{ after(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+		ruleVisibilityKind
+		{ after(grammarAccess.getChannelAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__NameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelAccess().getNameESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getChannelAccess().getNameESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__UnrestrictedNameAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getChannelAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Channel__SignalAssignment_5_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelAccess().getSignalSignalReferenceParserRuleCall_5_0_0()); }
+		ruleSignalReference
+		{ after(grammarAccess.getChannelAccess().getSignalSignalReferenceParserRuleCall_5_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalReference__DirectionAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalReferenceAccess().getDirectionChannelDirectionEnumRuleCall_0_0()); }
+		ruleChannelDirection
+		{ after(grammarAccess.getSignalReferenceAccess().getDirectionChannelDirectionEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__SignalReference__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSignalReferenceAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getSignalReferenceAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelPublicAccess().getVisibilityPublicChannelVisibilityKindEnumRuleCall_0_0()); }
+		rulePublicChannelVisibilityKind
+		{ after(grammarAccess.getChannelPublicAccess().getVisibilityPublicChannelVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelPublicAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getChannelPublicAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getChannelPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPublic__SignalAssignment_4_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelPublicAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); }
+		ruleSignalReference
+		{ after(grammarAccess.getChannelPublicAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelProtectedAccess().getVisibilityProtectedChannelVisibilityKindEnumRuleCall_0_0()); }
+		ruleProtectedChannelVisibilityKind
+		{ after(grammarAccess.getChannelProtectedAccess().getVisibilityProtectedChannelVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelProtectedAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getChannelProtectedAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelProtected__SignalAssignment_4_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelProtectedAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); }
+		ruleSignalReference
+		{ after(grammarAccess.getChannelProtectedAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__VisibilityAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelPrivateAccess().getVisibilityPrivateChannelVisibilityKindEnumRuleCall_0_0()); }
+		rulePrivateChannelVisibilityKind
+		{ after(grammarAccess.getChannelPrivateAccess().getVisibilityPrivateChannelVisibilityKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__NameAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelPrivateAccess().getNameESIdentifierParserRuleCall_1_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getChannelPrivateAccess().getNameESIdentifierParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__UnrestrictedNameAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ChannelPrivate__SignalAssignment_4_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getChannelPrivateAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); }
+		ruleSignalReference
+		{ after(grammarAccess.getChannelPrivateAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__TransientAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0()); }
+		(
+			{ before(grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0()); }
+			'transient'
+			{ after(grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0()); }
+		)
+		{ after(grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__MoeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getMoeTransitionMoeParserRuleCall_3_0()); }
+		ruleTransitionMoe
+		{ after(grammarAccess.getTransitionAccess().getMoeTransitionMoeParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__NameAssignment_4_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getNameESIdentifierParserRuleCall_4_0_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getTransitionAccess().getNameESIdentifierParserRuleCall_4_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__UnrestrictedNameAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0()); }
+		ruleUnrestrictedName
+		{ after(grammarAccess.getTransitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__TriggerAssignment_5_0_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_0_1_0_0_1_0()); }
+		ruleTransitionTrigger
+		{ after(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_0_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__GuardAssignment_5_0_1_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_0_1_0_1_0_0()); }
+		ruleTransitionGuard
+		{ after(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_0_1_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__TguardAssignment_5_0_1_0_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_0_1_0_2_0_0()); }
+		ruleTransitionTimedGuard
+		{ after(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_0_1_0_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__EffectAssignment_5_0_1_0_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_0_1_0_4_0()); }
+		ruleTransitionEffect
+		{ after(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_0_1_0_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__BehaviorAssignment_5_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0()); }
+		ruleTransitionBehavior
+		{ after(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__TargetAssignment_5_0_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_0_3_1_0()); }
+		(
+			{ before(grammarAccess.getTransitionAccess().getTargetNamedElementESUfidParserRuleCall_5_0_3_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getTransitionAccess().getTargetNamedElementESUfidParserRuleCall_5_0_3_1_0_1()); }
+		)
+		{ after(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_0_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__TargetAssignment_5_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_1_1_0()); }
+		(
+			{ before(grammarAccess.getTransitionAccess().getTargetNamedElementESUfidParserRuleCall_5_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getTransitionAccess().getTargetNamedElementESUfidParserRuleCall_5_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_1_2_0_1_0_0_1_0()); }
+		ruleTransitionTrigger
+		{ after(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_1_2_0_1_0_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_1_2_0_1_0_1_0_0()); }
+		ruleTransitionGuard
+		{ after(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_1_2_0_1_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_1_2_0_1_0_2_0_0()); }
+		ruleTransitionTimedGuard
+		{ after(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_1_2_0_1_0_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__EffectAssignment_5_1_2_0_1_0_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_1_2_0_1_0_4_0()); }
+		ruleTransitionEffect
+		{ after(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_1_2_0_1_0_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Transition__BehaviorAssignment_5_1_2_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0()); }
+		ruleTransitionBehavior
+		{ after(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__MocAssignment_1_0_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getMocTransitionMocEnumRuleCall_1_0_1_0_0_0()); }
+		ruleTransitionMoc
+		{ after(grammarAccess.getTransitionMoeAccess().getMocTransitionMocEnumRuleCall_1_0_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0()); }
+			'else'
+			{ after(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0()); }
+		)
+		{ after(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__IsElseAssignment_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0()); }
+			'else'
+			{ after(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0()); }
+		)
+		{ after(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__PriorAssignment_1_0_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_0_2_2_0()); }
+		ruleEInt
+		{ after(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_0_2_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionMoe__PriorAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_1_1_0()); }
+		ruleEInt
+		{ after(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionBehavior__OpAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionBehaviorAccess().getOpBlockStatementSchedulerParserRuleCall_1_0()); }
+		ruleBlockStatementScheduler
+		{ after(grammarAccess.getTransitionBehaviorAccess().getOpBlockStatementSchedulerParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionBehavior__StatementAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionBehaviorAccess().getStatementStatementParserRuleCall_2_0()); }
+		ruleStatement
+		{ after(grammarAccess.getTransitionBehaviorAccess().getStatementStatementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__ConditionAssignment_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0()); }
+		ruleTransitionGuardExpression
+		{ after(grammarAccess.getTransitionGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuard__ConditionAssignment_1_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__OperatorAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAlternatives_1_0()); }
+		(rule__TransitionGuardExpression__OperatorAlternatives_1_0)
+		{ after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAlternatives_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionGuardExpression__OperandAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionGuardExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_3_0()); }
+		ruleBitwiseOrExpression
+		{ after(grammarAccess.getTransitionGuardExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__ConditionAssignment_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0()); }
+		ruleTransitionGuardExpression
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TransitionEffect__StatementAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTransitionEffectAccess().getStatementTransitionEffectStatementParserRuleCall_1_1_0()); }
+		ruleTransitionEffectStatement
+		{ after(grammarAccess.getTransitionEffectAccess().getStatementTransitionEffectStatementParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__OpAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBlockStatementAccess().getOpBlockStatementSchedulerParserRuleCall_2_0()); }
+		ruleBlockStatementScheduler
+		{ after(grammarAccess.getBlockStatementAccess().getOpBlockStatementSchedulerParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BlockStatement__StatementAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBlockStatementAccess().getStatementStatementParserRuleCall_3_0()); }
+		ruleStatement
+		{ after(grammarAccess.getBlockStatementAccess().getStatementStatementParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__ExpressionAssignment_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getExpressionStatementAccess().getExpressionAssignmentExpressionParserRuleCall_0_0_0()); }
+		ruleAssignmentExpression
+		{ after(grammarAccess.getExpressionStatementAccess().getExpressionAssignmentExpressionParserRuleCall_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__ExpressionAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getExpressionStatementAccess().getExpressionNewfreshExpressionParserRuleCall_1_0_0()); }
+		ruleNewfreshExpression
+		{ after(grammarAccess.getExpressionStatementAccess().getExpressionNewfreshExpressionParserRuleCall_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__ExpressionAssignment_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0()); }
+		ruleIncrementOrDecrementPrefixExpression
+		{ after(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionStatement__ExpressionAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0()); }
+		ruleIncrementOrDecrementPostfixExpression
+		{ after(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GuardStatement__ConditionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__TimedGuardStatement__ConditionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getTimedGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getTimedGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EventGuardStatement__ConditionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEventGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getEventGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__SolverAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCheckSatGuardStatementAccess().getSolverESIdentifierParserRuleCall_2_0()); }
+		ruleESIdentifier
+		{ after(grammarAccess.getCheckSatGuardStatementAccess().getSolverESIdentifierParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CheckSatGuardStatement__ConditionAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCheckSatGuardStatementAccess().getConditionExpressionParserRuleCall_4_0()); }
+		ruleExpression
+		{ after(grammarAccess.getCheckSatGuardStatementAccess().getConditionExpressionParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__PortAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInputComStatementAccess().getPortNamedElementCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getInputComStatementAccess().getPortNamedElementESUfidParserRuleCall_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getInputComStatementAccess().getPortNamedElementESUfidParserRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getInputComStatementAccess().getPortNamedElementCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__LeftValueAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__LeftValueAssignment_2_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_2_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__TargetAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0()); }
+		ruleExpressionAsMachine
+		{ after(grammarAccess.getInputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InputComStatement__RouteAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInputComStatementAccess().getRouteChannelCrossReference_3_1_1_0()); }
+		(
+			{ before(grammarAccess.getInputComStatementAccess().getRouteChannelESUfidParserRuleCall_3_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getInputComStatementAccess().getRouteChannelESUfidParserRuleCall_3_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getInputComStatementAccess().getRouteChannelCrossReference_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__PortAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOutputComStatementAccess().getPortNamedElementCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getOutputComStatementAccess().getPortNamedElementESUfidParserRuleCall_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getOutputComStatementAccess().getPortNamedElementESUfidParserRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getOutputComStatementAccess().getPortNamedElementCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__RigthValueAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__RigthValueAssignment_2_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_2_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__TargetAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOutputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0()); }
+		ruleExpressionAsMachine
+		{ after(grammarAccess.getOutputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__OutputComStatement__RouteAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getOutputComStatementAccess().getRouteChannelCrossReference_3_1_1_0()); }
+		(
+			{ before(grammarAccess.getOutputComStatementAccess().getRouteChannelESUfidParserRuleCall_3_1_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getOutputComStatementAccess().getRouteChannelESUfidParserRuleCall_3_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getOutputComStatementAccess().getRouteChannelCrossReference_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ExpressionAsMachine__MachineAssignment
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getExpressionAsMachineAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_0()); }
+		ruleValuePureNamedMachineExpression
+		{ after(grammarAccess.getExpressionAsMachineAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__ConditionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIfStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getIfStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__BodyBlockAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__ElseifStatementAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIfStatementAccess().getElseifStatementElseIfStatementParserRuleCall_3_0()); }
+		ruleElseIfStatement
+		{ after(grammarAccess.getIfStatementAccess().getElseifStatementElseIfStatementParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IfStatement__ElseBlockAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIfStatementAccess().getElseBlockBlockStatementParserRuleCall_4_1_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getIfStatementAccess().getElseBlockBlockStatementParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__ConditionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getElseIfStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getElseIfStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ElseIfStatement__BodyBlockAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getElseIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getElseIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__WhileDoStatement__ConditionAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWhileDoStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getWhileDoStatementAccess().getConditionExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__WhileDoStatement__BodyBlockAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getWhileDoStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getWhileDoStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__BodyBlockAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDoWhileStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getDoWhileStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DoWhileStatement__ConditionAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0()); }
+		ruleExpression
+		{ after(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__InitAssignment_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_0_1_0()); }
+		ruleForAssignmentExpression
+		{ after(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__ConditionAssignment_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_0_3_0()); }
+		ruleExpression
+		{ after(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_0_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__IterateAssignment_0_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_0_5_0()); }
+		ruleForAssignmentExpression
+		{ after(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_0_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__BodyBlockAssignment_0_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_6_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__InitAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_1_2_0()); }
+		ruleForAssignmentExpression
+		{ after(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__ConditionAssignment_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_1_4_0()); }
+		ruleExpression
+		{ after(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__IterateAssignment_1_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_1_6_0()); }
+		ruleForAssignmentExpression
+		{ after(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_1_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForStatement__BodyBlockAssignment_1_8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_8_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_8_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__IteratorAssignment_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_0_1_0()); }
+		ruleLeftHandSideExpression
+		{ after(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__EnumerationAssignment_0_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_0_3_0()); }
+		ruleExpression
+		{ after(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_0_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__BodyBlockAssignment_0_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_4_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__IteratorAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_1_2_0()); }
+		ruleLeftHandSideExpression
+		{ after(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__EnumerationAssignment_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_1_4_0()); }
+		ruleExpression
+		{ after(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ForEachStatement__BodyBlockAssignment_1_6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_6_0()); }
+		ruleBlockStatement
+		{ after(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_6_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__KindAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInterruptStatementAccess().getKindInterruptStatementKindEnumRuleCall_0_0()); }
+		ruleInterruptStatementKind
+		{ after(grammarAccess.getInterruptStatementAccess().getKindInterruptStatementKindEnumRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__ExprAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_0_0()); }
+		ruleExpression
+		{ after(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__ExprAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InterruptStatement__ExprAssignment_1_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_2_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__OpAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getActivityStatementAccess().getOpOPERATOR_ACTIVITYEnumRuleCall_1_0()); }
+		ruleOPERATOR_ACTIVITY
+		{ after(grammarAccess.getActivityStatementAccess().getOpOPERATOR_ACTIVITYEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__MachineAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getActivityStatementAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_2_0()); }
+		ruleValuePureNamedMachineExpression
+		{ after(grammarAccess.getActivityStatementAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ActivityStatement__TupleAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getActivityStatementAccess().getTupleTupleParameterExpressionParserRuleCall_3_0()); }
+		ruleTupleParameterExpression
+		{ after(grammarAccess.getActivityStatementAccess().getTupleTupleParameterExpressionParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__ExpressionAssignment_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0()); }
+		ruleInvokeExpressionDeprecated
+		{ after(grammarAccess.getInvokeStatementAccess().getExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__InvokableAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_1_0_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_1_0_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_1_0_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__ExecRoutineAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0()); }
+			'('
+			{ after(grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__ArgsAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_1_2_0()); }
+		ruleMixTupleExpressionList
+		{ after(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_1_4_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_0_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_1_4_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_2_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__ExecRoutineAssignment_2_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0()); }
+			'exec'
+			{ after(grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__InvokableAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_2_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_2_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__ArgsAssignment_2_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_2_3_0()); }
+		ruleMixTupleExpressionList
+		{ after(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_2_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_2_5_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_0_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_2_5_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_2_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__CallProcedureAssignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0()); }
+			'call'
+			{ after(grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__InvokableAssignment_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_3_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_3_1_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_3_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__ArgsAssignment_3_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_3_2_0()); }
+		ruleMixTupleExpressionList
+		{ after(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_3_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_3_3_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_0_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_1_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_3_3_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_2_1_0()); }
+		(
+			{ before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1()); }
+		)
+		{ after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AssignmentExpression__LeftHandSideAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0()); }
+		ruleLeftHandSideExpression
+		{ after(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AssignmentExpression__OperatorAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignmentOperatorParserRuleCall_1_0()); }
+		ruleAssignmentOperator
+		{ after(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignmentOperatorParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AssignmentExpression__RigthHandSideAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideExpressionParserRuleCall_2_0()); }
+		ruleExpression
+		{ after(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__LvalueAssignment_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_0_0()); }
+		ruleValueSelectionExpression
+		{ after(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LeftHandSideExpression__LvalueAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_1_1_0()); }
+		ruleValueSelectionExpression
+		{ after(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); }
+			'?'
+			{ after(grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__ThenOperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalTestExpressionAccess().getThenOperandExpressionParserRuleCall_1_2_0()); }
+		ruleExpression
+		{ after(grammarAccess.getConditionalTestExpressionAccess().getThenOperandExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ConditionalTestExpression__ElseOperandAssignment_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getConditionalTestExpressionAccess().getElseOperandExpressionParserRuleCall_1_4_0()); }
+		ruleExpression
+		{ after(grammarAccess.getConditionalTestExpressionAccess().getElseOperandExpressionParserRuleCall_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalOrExpressionAccess().getOperatorAlternatives_1_1_0()); }
+		(rule__LogicalOrExpression__OperatorAlternatives_1_1_0)
+		{ after(grammarAccess.getLogicalOrExpressionAccess().getOperatorAlternatives_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_2_0()); }
+		ruleLogicalAndExpression
+		{ after(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalOrExpression__OperandAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_3_1_0()); }
+		ruleLogicalAndExpression
+		{ after(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalAndExpressionAccess().getOperatorAlternatives_1_1_0()); }
+		(rule__LogicalAndExpression__OperatorAlternatives_1_1_0)
+		{ after(grammarAccess.getLogicalAndExpressionAccess().getOperatorAlternatives_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_2_0()); }
+		ruleBitwiseOrExpression
+		{ after(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalAndExpression__OperandAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_3_1_0()); }
+		ruleBitwiseOrExpression
+		{ after(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0()); }
+			'|'
+			{ after(grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_2_0()); }
+		ruleBitwiseXorExpression
+		{ after(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseOrExpression__OperandAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_3_1_0()); }
+		ruleBitwiseXorExpression
+		{ after(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0()); }
+			'^'
+			{ after(grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_2_0()); }
+		ruleBitwiseAndExpression
+		{ after(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseXorExpression__OperandAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_3_1_0()); }
+		ruleBitwiseAndExpression
+		{ after(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0()); }
+		(
+			{ before(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0()); }
+			'&'
+			{ after(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0()); }
+		)
+		{ after(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__OperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0()); }
+		ruleEqualityExpression
+		{ after(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseAndExpression__OperandAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0()); }
+		ruleEqualityExpression
+		{ after(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualityOperatorParserRuleCall_1_1_0()); }
+		ruleEqualityOperator
+		{ after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualityOperatorParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EqualityExpression__RigthOperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEqualityExpressionAccess().getRigthOperandRelationalExpressionParserRuleCall_1_2_0()); }
+		ruleRelationalExpression
+		{ after(grammarAccess.getEqualityExpressionAccess().getRigthOperandRelationalExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__OperatorAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorParserRuleCall_1_1_0()); }
+		ruleRelationalOperator
+		{ after(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__RigthOperandAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_2_0()); }
+		ruleAdditiveExpression
+		{ after(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__RigthOperatorAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0()); }
+		ruleRelationalOperator
+		{ after(grammarAccess.getRelationalExpressionAccess().getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__RelationalExpression__RigthOperandAssignment_1_3_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0()); }
+		ruleAdditiveExpression
+		{ after(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__OperatorAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0()); }
+		(
+			{ before(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0()); }
+			'+'
+			{ after(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0()); }
+		)
+		{ after(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__OperandAssignment_1_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0()); }
+		ruleMultiplicativeExpression
+		{ after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__OperandAssignment_1_0_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0()); }
+		ruleMultiplicativeExpression
+		{ after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__OperatorAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0()); }
+			'-'
+			{ after(grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0()); }
+		)
+		{ after(grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__OperandAssignment_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0()); }
+		ruleMultiplicativeExpression
+		{ after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__AdditiveExpression__OperandAssignment_1_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0()); }
+		ruleMultiplicativeExpression
+		{ after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperatorAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); }
+		(
+			{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); }
+			'*'
+			{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); }
+		)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_2_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_0_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_3_1_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperatorAssignment_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); }
+		(
+			{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); }
+			'**'
+			{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); }
+		)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_2_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_3_1_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperatorAssignment_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); }
+		(
+			{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); }
+			'/'
+			{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); }
+		)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_2_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_2_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_3_1_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperatorAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); }
+		(
+			{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); }
+			'%'
+			{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); }
+		)
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_3_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_2_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MultiplicativeExpression__OperandAssignment_1_3_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_3_1_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0()); }
+		ruleLeftHandSideExpression
+		{ after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAffixOperatorParserRuleCall_1_0()); }
+		ruleAffixOperator
+		{ after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAffixOperatorParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAffixOperatorParserRuleCall_0_0()); }
+		ruleAffixOperator
+		{ after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAffixOperatorParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0()); }
+		ruleLeftHandSideExpression
+		{ after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__LeftHandSideAssignment_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0()); }
+		ruleLeftHandSideExpression
+		{ after(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NewfreshExpression__LeftHandSideAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0()); }
+		ruleLeftHandSideExpression
+		{ after(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__DatatypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeESUfidParserRuleCall_2_0_1()); }
+			ruleESUfid
+			{ after(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeESUfidParserRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__CastExpression__OperandAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getCastExpressionAccess().getOperandExpressionParserRuleCall_5_0()); }
+		ruleExpression
+		{ after(grammarAccess.getCastExpressionAccess().getOperandExpressionParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArithmeticUnaryExpression__OperatorAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorArithmeticUnaryOperatorParserRuleCall_0_0()); }
+		ruleArithmeticUnaryOperator
+		{ after(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorArithmeticUnaryOperatorParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArithmeticUnaryExpression__OperandAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalUnaryExpression__OperatorAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAlternatives_0_0()); }
+		(rule__LogicalUnaryExpression__OperatorAlternatives_0_0)
+		{ after(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAlternatives_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LogicalUnaryExpression__OperandAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLogicalUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getLogicalUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseUnaryExpression__OperatorAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0()); }
+		(
+			{ before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0()); }
+			'~'
+			{ after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0()); }
+		)
+		{ after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__BitwiseUnaryExpression__OperandAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); }
+		ruleUnaryExpression
+		{ after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__ElementAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_1_2_0()); }
+		(
+			{ before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); }
+		)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__KindAssignment_1_3_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0()); }
+		ruleValueIndexExpressionKind
+		{ after(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__ArgAssignment_1_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0()); }
+		rulePositionalTupleExpressionList
+		{ after(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__KindAssignment_1_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0()); }
+		ruleValueParameterExpressionKind
+		{ after(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__ArgAssignment_1_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0()); }
+		ruleMixTupleExpressionList
+		{ after(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__ElementAssignment_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_2_0()); }
+		(
+			{ before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); }
+		)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__KindAssignment_2_3_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0()); }
+		ruleValueIndexExpressionKind
+		{ after(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__ArgAssignment_2_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0()); }
+		rulePositionalTupleExpressionList
+		{ after(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__KindAssignment_2_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0()); }
+		ruleValueParameterExpressionKind
+		{ after(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__ArgAssignment_2_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0()); }
+		ruleMixTupleExpressionList
+		{ after(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__ElementAssignment_2_4_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_4_2_0()); }
+		(
+			{ before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1()); }
+		)
+		{ after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_4_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__KindAssignment_2_4_3_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0()); }
+		ruleValueIndexExpressionKind
+		{ after(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__ArgAssignment_2_4_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0()); }
+		rulePositionalTupleExpressionList
+		{ after(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__KindAssignment_2_4_3_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0()); }
+		ruleValueParameterExpressionKind
+		{ after(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PrimaryExpression__ArgAssignment_2_4_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0()); }
+		ruleMixTupleExpressionList
+		{ after(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__ArgsAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_2_0()); }
+		ruleExpression
+		{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__InvokeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeLiteralReferenceElementParserRuleCall_3_0()); }
+		ruleLiteralReferenceElement
+		{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeLiteralReferenceElementParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InvokeExpressionDeprecated__ArgsAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_4_0()); }
+		ruleExpression
+		{ after(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__InstantiationExpression__InstanceAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInstantiationExpressionAccess().getInstanceDynamicInstanceSpecificationParserRuleCall_1_0()); }
+		ruleDynamicInstanceSpecification
+		{ after(grammarAccess.getInstantiationExpressionAccess().getInstanceDynamicInstanceSpecificationParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__ModelAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineESIdentifierParserRuleCall_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineESIdentifierParserRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_0_0()); }
+		ruleSlotParameter
+		{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_1_1_0()); }
+		ruleSlotParameter
+		{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotPropertyParserRuleCall_3_1_1_0_0()); }
+		ruleSlotProperty
+		{ after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotPropertyParserRuleCall_3_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_1_0()); }
+		(rule__MixTupleExpressionList__ValueAlternatives_1_0)
+		{ after(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__MixTupleExpressionList__ValueAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_2_1_0()); }
+		(rule__MixTupleExpressionList__ValueAlternatives_2_1_0)
+		{ after(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PositionalTupleExpressionList__ValueAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_0_0()); }
+		ruleExpression
+		{ after(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PositionalTupleExpressionList__ValueAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_1_1_0()); }
+		ruleExpression
+		{ after(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NamedExpression__NameAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNamedExpressionAccess().getNameXLIA_IDTerminalRuleCall_0_0()); }
+		RULE_XLIA_ID
+		{ after(grammarAccess.getNamedExpressionAccess().getNameXLIA_IDTerminalRuleCall_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NamedExpression__ExpressionAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNamedExpressionAccess().getExpressionExpressionParserRuleCall_2_0()); }
+		ruleExpression
+		{ after(grammarAccess.getNamedExpressionAccess().getExpressionExpressionParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralBooleanExpression__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralBooleanExpressionAccess().getValueEBooleanParserRuleCall_1_0()); }
+		ruleEBoolean
+		{ after(grammarAccess.getLiteralBooleanExpressionAccess().getValueEBooleanParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralIntegerExpression__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralIntegerExpressionAccess().getValueEIntegerParserRuleCall_1_0()); }
+		ruleEInteger
+		{ after(grammarAccess.getLiteralIntegerExpressionAccess().getValueEIntegerParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalExpression__NumeratorAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorEIntegerParserRuleCall_1_0()); }
+		ruleEInteger
+		{ after(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorEIntegerParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralRationalExpression__DenominatorAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorEIntegerParserRuleCall_3_0()); }
+		ruleEInteger
+		{ after(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorEIntegerParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralFloatExpression__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralFloatExpressionAccess().getValueEDoubleParserRuleCall_1_0()); }
+		ruleEDouble
+		{ after(grammarAccess.getLiteralFloatExpressionAccess().getValueEDoubleParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCharacterExpression__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralCharacterExpressionAccess().getValueECharacterParserRuleCall_1_0()); }
+		ruleECharacter
+		{ after(grammarAccess.getLiteralCharacterExpressionAccess().getValueECharacterParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralStringExpression__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralStringExpressionAccess().getValueEStringParserRuleCall_1_0()); }
+		ruleEString
+		{ after(grammarAccess.getLiteralStringExpressionAccess().getValueEStringParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralNullExpression__TypeAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralNullExpressionAccess().getTypeDataTypeParserRuleCall_1_2_0()); }
+		ruleDataType
+		{ after(grammarAccess.getLiteralNullExpressionAccess().getTypeDataTypeParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__DatatypeAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeDataTypeParserRuleCall_1_1_0()); }
+		ruleDataType
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeDataTypeParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__ValueAssignment_3_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_0_0_0()); }
+		ruleExpression
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__ValueAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_0_1_0()); }
+		ruleNamedExpression
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_1_1_0_0()); }
+		ruleExpression
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_1_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_1_1_1_0()); }
+		ruleNamedExpression
+		{ after(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementESIdentifierParserRuleCall_1_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementESIdentifierParserRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__KindAssignment_2_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceElementAccess().getKindValueIndexExpressionKindEnumRuleCall_2_0_0_0()); }
+		ruleValueIndexExpressionKind
+		{ after(grammarAccess.getLiteralReferenceElementAccess().getKindValueIndexExpressionKindEnumRuleCall_2_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__ArgAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceElementAccess().getArgPositionalTupleExpressionListParserRuleCall_2_0_1_0()); }
+		rulePositionalTupleExpressionList
+		{ after(grammarAccess.getLiteralReferenceElementAccess().getArgPositionalTupleExpressionListParserRuleCall_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__KindAssignment_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceElementAccess().getKindValueParameterExpressionKindEnumRuleCall_2_1_0_0()); }
+		ruleValueParameterExpressionKind
+		{ after(grammarAccess.getLiteralReferenceElementAccess().getKindValueParameterExpressionKindEnumRuleCall_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralReferenceElement__ArgAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralReferenceElementAccess().getArgMixTupleExpressionListParserRuleCall_2_1_1_0()); }
+		ruleMixTupleExpressionList
+		{ after(grammarAccess.getLiteralReferenceElementAccess().getArgMixTupleExpressionListParserRuleCall_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LiteralPureReferenceElement__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementESIdentifierParserRuleCall_1_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementESIdentifierParserRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__ElementAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_1_2_0()); }
+		(
+			{ before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); }
+		)
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__KindAssignment_1_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0()); }
+		ruleValueIndexExpressionKind
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__ArgAssignment_1_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_1_0()); }
+		rulePositionalTupleExpressionList
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__ElementAssignment_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_2_0()); }
+		(
+			{ before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); }
+		)
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__KindAssignment_2_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0()); }
+		ruleValueIndexExpressionKind
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__ArgAssignment_2_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_1_0()); }
+		rulePositionalTupleExpressionList
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__ElementAssignment_2_4_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_4_2_0()); }
+		(
+			{ before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1()); }
+		)
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_4_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__KindAssignment_2_4_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0()); }
+		ruleValueIndexExpressionKind
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValueSelectionExpression__ArgAssignment_2_4_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0()); }
+		rulePositionalTupleExpressionList
+		{ after(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__KindAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0()); }
+		ruleValueDotFieldExpressionKind
+		{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__ElementAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_1_2_0()); }
+		(
+			{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); }
+		)
+		{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__KindAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_2_1_0()); }
+		ruleValueArrowFieldExpressionKind
+		{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__ElementAssignment_2_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_2_0()); }
+		(
+			{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); }
+		)
+		{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_2_3_1_0()); }
+		ruleValueDotFieldExpressionKind
+		{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_2_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_3_2_0()); }
+		(
+			{ before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_3_2_0_1()); }
+			ruleESIdentifier
+			{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_3_2_0_1()); }
+		)
+		{ after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_3_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+RULE_INT : ('0'..'9')+;
+
+RULE_CHARACTER : '\'' . '\'';
+
+RULE_XLIA_ID : ('a'..'z'|'A'..'Z'|'_'|'#') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'#')*;
+
+RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalML.tokens b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalML.tokens
new file mode 100644
index 0000000..10a0661
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalML.tokens
@@ -0,0 +1,559 @@
+'!'=133
+'!='=121
+'#final'=276
+'#init'=57
+'#initial'=56
+'#start'=275
+'$delta'=266
+'$env'=141
+'$null'=138
+'$null<'=140
+'$parent'=269
+'$self'=268
+'$super'=270
+'$system'=271
+'$this'=267
+'$time'=265
+'%'=260
+'%='=107
+'&&'=78
+'&&='=108
+'&'=242
+'&='=110
+'('=23
+'(:'=262
+')'=213
+'*'=58
+'**'=258
+'*='=105
+'+'=131
+'++'=129
+'+='=103
+','=198
+'-'=132
+'--'=130
+'-->'=215
+'-='=104
+'->'=21
+'.'=20
+'/'=259
+'/='=106
+':'=31
+'::'=32
+'::='=102
+':='=101
+';'=45
+'<'=125
+'<-'=136
+'<--'=250
+'<<='=113
+'<='=127
+'<=<'=116
+'<=='=96
+'=!='=123
+'='=100
+'=/='=124
+'=='=120
+'==='=122
+'==>'=98
+'=>'=135
+'>'=126
+'>:'=197
+'>='=128
+'>=>'=119
+'>>='=114
+'>>>='=115
+'?'=286
+'@FormalML'=24
+'@behavior:'=210
+'@com:'=226
+'@composite:'=37
+'@concurrency'=50
+'@disable'=49
+'@effect:'=240
+'@enable'=48
+'@final'=47
+'@guard:'=76
+'@guard<'=244
+'@init'=46
+'@inout:'=218
+'@input:'=217
+'@instance:'=209
+'@irun'=52
+'@local:'=222
+'@machine:'=38
+'@macro:'=36
+'@model:'=207
+'@moe:'=221
+'@on_write'=238
+'@option'=272
+'@output:'=219
+'@parameter:'=216
+'@private:'=205
+'@procedure:'=206
+'@property:'=202
+'@protected:'=204
+'@prototype:'=208
+'@public:'=203
+'@region:'=41
+'@region<'=43
+'@return:'=220
+'@routine:'=35
+'@run'=53
+'@schedule'=51
+'@statemachine:'=42
+'@statemachine<'=44
+'@tguard:'=77
+'@tguard<'=245
+'@transition:'=223
+'@trigger:'=241
+'@xfsp'=26
+'@xlia'=25
+'['=22
+']'=75
+'^'=257
+'^='=112
+'^=<'=117
+'^=>'=118
+'abort'=178
+'and'=33
+'anycast'=160
+'bag'=169
+'bool'=74
+'boolean'=73
+'break'=180
+'broadcast'=162
+'buffer'=15
+'call'=285
+'channel'=19
+'char'=232
+'checksat'=249
+'choice'=149
+'clock'=277
+'connect'=228
+'const'=283
+'continue'=181
+'ctor'=263
+'destroy'=184
+'dhistory'=154
+'disable'=191
+'do'=254
+'double'=69
+'else'=252
+'elseif'=99
+'enable'=192
+'entryPoint'=150
+'enum'=235
+'env'=142
+'event'=248
+'exec'=284
+'exit'=182
+'exitPoint'=151
+'false'=30
+'fifo'=170
+'final'=179
+'float'=67
+'for'=255
+'fork'=152
+'guard'=246
+'if'=251
+'in'=172
+'init'=183
+'initial'=13
+'inout'=173
+'input'=175
+'input_enabled'=274
+'instance'=211
+'int'=61
+'integer'=59
+'interval'=234
+'irun'=194
+'join'=153
+'junction'=148
+'lifo'=171
+'list'=167
+'machine'=39
+'macro'=224
+'message'=163
+'moc:'=201
+'model'=146
+'model:'=212
+'multi_rdv'=14
+'multicast'=161
+'new'=264
+'newfresh'=261
+'not'=134
+'null'=137
+'null<'=139
+'or'=34
+'out'=174
+'output'=176
+'package'=28
+'port'=17
+'prior:'=243
+'private'=144
+'procedure'=214
+'protected'=145
+'prototype'=147
+'pseudostate'=55
+'public'=143
+'rat'=65
+'rational'=63
+'rdv'=158
+'real'=71
+'reference'=279
+'restart'=187
+'resume'=189
+'return'=157
+'route'=227
+'routine'=225
+'rtc'=196
+'run'=195
+'rvector'=166
+'schedule'=193
+'set'=168
+'shistory'=155
+'signal'=18
+'simple'=177
+'size:'=230
+'start'=185
+'state'=54
+'statemachine'=40
+'static'=278
+'stop'=186
+'string'=233
+'struct'=236
+'suspend'=188
+'system'=27
+'terminal'=156
+'tguard'=247
+'time'=231
+'timed'=273
+'transient'=281
+'transition'=239
+'true'=29
+'type'=229
+'udouble'=70
+'ufloat'=68
+'uint'=62
+'uinteger'=60
+'unicast'=159
+'union'=237
+'urat'=66
+'urational'=64
+'ureal'=72
+'val'=282
+'var'=16
+'vector'=165
+'vertex'=164
+'via'=97
+'volatile'=280
+'wait'=190
+'while'=253
+'{'=199
+'|'=256
+'|,|'=86
+'|.|'=83
+'|/;|'=84
+'|/\\|'=93
+'|;;|'=82
+'|;|'=80
+'|='=111
+'|\u00A7|'=81
+'|and#then|'=90
+'|and|'=88
+'|a|'=87
+'|fork|'=94
+'|indet|'=92
+'|i|'=85
+'|join|'=95
+'|or#else|'=91
+'|or|'=89
+'||'=79
+'||='=109
+'}'=200
+'~'=287
+RULE_ANY_OTHER=12
+RULE_CHARACTER=4
+RULE_ID=8
+RULE_INT=7
+RULE_ML_COMMENT=9
+RULE_SL_COMMENT=10
+RULE_STRING=5
+RULE_WS=11
+RULE_XLIA_ID=6
+T__100=100
+T__101=101
+T__102=102
+T__103=103
+T__104=104
+T__105=105
+T__106=106
+T__107=107
+T__108=108
+T__109=109
+T__110=110
+T__111=111
+T__112=112
+T__113=113
+T__114=114
+T__115=115
+T__116=116
+T__117=117
+T__118=118
+T__119=119
+T__120=120
+T__121=121
+T__122=122
+T__123=123
+T__124=124
+T__125=125
+T__126=126
+T__127=127
+T__128=128
+T__129=129
+T__130=130
+T__131=131
+T__132=132
+T__133=133
+T__134=134
+T__135=135
+T__136=136
+T__137=137
+T__138=138
+T__139=139
+T__13=13
+T__140=140
+T__141=141
+T__142=142
+T__143=143
+T__144=144
+T__145=145
+T__146=146
+T__147=147
+T__148=148
+T__149=149
+T__14=14
+T__150=150
+T__151=151
+T__152=152
+T__153=153
+T__154=154
+T__155=155
+T__156=156
+T__157=157
+T__158=158
+T__159=159
+T__15=15
+T__160=160
+T__161=161
+T__162=162
+T__163=163
+T__164=164
+T__165=165
+T__166=166
+T__167=167
+T__168=168
+T__169=169
+T__16=16
+T__170=170
+T__171=171
+T__172=172
+T__173=173
+T__174=174
+T__175=175
+T__176=176
+T__177=177
+T__178=178
+T__179=179
+T__17=17
+T__180=180
+T__181=181
+T__182=182
+T__183=183
+T__184=184
+T__185=185
+T__186=186
+T__187=187
+T__188=188
+T__189=189
+T__18=18
+T__190=190
+T__191=191
+T__192=192
+T__193=193
+T__194=194
+T__195=195
+T__196=196
+T__197=197
+T__198=198
+T__199=199
+T__19=19
+T__200=200
+T__201=201
+T__202=202
+T__203=203
+T__204=204
+T__205=205
+T__206=206
+T__207=207
+T__208=208
+T__209=209
+T__20=20
+T__210=210
+T__211=211
+T__212=212
+T__213=213
+T__214=214
+T__215=215
+T__216=216
+T__217=217
+T__218=218
+T__219=219
+T__21=21
+T__220=220
+T__221=221
+T__222=222
+T__223=223
+T__224=224
+T__225=225
+T__226=226
+T__227=227
+T__228=228
+T__229=229
+T__22=22
+T__230=230
+T__231=231
+T__232=232
+T__233=233
+T__234=234
+T__235=235
+T__236=236
+T__237=237
+T__238=238
+T__239=239
+T__23=23
+T__240=240
+T__241=241
+T__242=242
+T__243=243
+T__244=244
+T__245=245
+T__246=246
+T__247=247
+T__248=248
+T__249=249
+T__24=24
+T__250=250
+T__251=251
+T__252=252
+T__253=253
+T__254=254
+T__255=255
+T__256=256
+T__257=257
+T__258=258
+T__259=259
+T__25=25
+T__260=260
+T__261=261
+T__262=262
+T__263=263
+T__264=264
+T__265=265
+T__266=266
+T__267=267
+T__268=268
+T__269=269
+T__26=26
+T__270=270
+T__271=271
+T__272=272
+T__273=273
+T__274=274
+T__275=275
+T__276=276
+T__277=277
+T__278=278
+T__279=279
+T__27=27
+T__280=280
+T__281=281
+T__282=282
+T__283=283
+T__284=284
+T__285=285
+T__286=286
+T__287=287
+T__28=28
+T__29=29
+T__30=30
+T__31=31
+T__32=32
+T__33=33
+T__34=34
+T__35=35
+T__36=36
+T__37=37
+T__38=38
+T__39=39
+T__40=40
+T__41=41
+T__42=42
+T__43=43
+T__44=44
+T__45=45
+T__46=46
+T__47=47
+T__48=48
+T__49=49
+T__50=50
+T__51=51
+T__52=52
+T__53=53
+T__54=54
+T__55=55
+T__56=56
+T__57=57
+T__58=58
+T__59=59
+T__60=60
+T__61=61
+T__62=62
+T__63=63
+T__64=64
+T__65=65
+T__66=66
+T__67=67
+T__68=68
+T__69=69
+T__70=70
+T__71=71
+T__72=72
+T__73=73
+T__74=74
+T__75=75
+T__76=76
+T__77=77
+T__78=78
+T__79=79
+T__80=80
+T__81=81
+T__82=82
+T__83=83
+T__84=84
+T__85=85
+T__86=86
+T__87=87
+T__88=88
+T__89=89
+T__90=90
+T__91=91
+T__92=92
+T__93=93
+T__94=94
+T__95=95
+T__96=96
+T__97=97
+T__98=98
+T__99=99
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalMLLexer.java b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalMLLexer.java
new file mode 100644
index 0000000..d0d8e30
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalMLLexer.java
@@ -0,0 +1,9830 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+package org.eclipse.efm.formalml.xtext.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalFormalMLLexer extends Lexer {
+    public static final int T__144=144;
+    public static final int T__265=265;
+    public static final int T__143=143;
+    public static final int T__264=264;
+    public static final int T__146=146;
+    public static final int T__267=267;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__266=266;
+    public static final int T__140=140;
+    public static final int T__261=261;
+    public static final int T__260=260;
+    public static final int T__142=142;
+    public static final int T__263=263;
+    public static final int T__141=141;
+    public static final int T__262=262;
+    public static final int RULE_CHARACTER=4;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__258=258;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__257=257;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__259=259;
+    public static final int T__133=133;
+    public static final int T__254=254;
+    public static final int T__132=132;
+    public static final int T__253=253;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__256=256;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int T__255=255;
+    public static final int T__250=250;
+    public static final int RULE_ID=8;
+    public static final int T__131=131;
+    public static final int T__252=252;
+    public static final int T__130=130;
+    public static final int T__251=251;
+    public static final int RULE_INT=7;
+    public static final int T__66=66;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__247=247;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__246=246;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__249=249;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__248=248;
+    public static final int T__166=166;
+    public static final int T__287=287;
+    public static final int T__165=165;
+    public static final int T__286=286;
+    public static final int T__168=168;
+    public static final int T__167=167;
+    public static final int T__162=162;
+    public static final int T__283=283;
+    public static final int T__161=161;
+    public static final int T__282=282;
+    public static final int T__164=164;
+    public static final int T__285=285;
+    public static final int T__163=163;
+    public static final int T__284=284;
+    public static final int T__160=160;
+    public static final int T__281=281;
+    public static final int T__280=280;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__159=159;
+    public static final int T__30=30;
+    public static final int T__158=158;
+    public static final int T__279=279;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__276=276;
+    public static final int T__154=154;
+    public static final int T__275=275;
+    public static final int T__157=157;
+    public static final int T__278=278;
+    public static final int T__156=156;
+    public static final int T__277=277;
+    public static final int T__151=151;
+    public static final int T__272=272;
+    public static final int T__150=150;
+    public static final int T__271=271;
+    public static final int T__153=153;
+    public static final int T__274=274;
+    public static final int T__152=152;
+    public static final int T__273=273;
+    public static final int T__270=270;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int RULE_XLIA_ID=6;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__269=269;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__268=268;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__100=100;
+    public static final int T__221=221;
+    public static final int T__220=220;
+    public static final int T__102=102;
+    public static final int T__223=223;
+    public static final int T__101=101;
+    public static final int T__222=222;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__218=218;
+    public static final int T__217=217;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__219=219;
+    public static final int T__214=214;
+    public static final int T__213=213;
+    public static final int T__216=216;
+    public static final int T__215=215;
+    public static final int T__210=210;
+    public static final int T__212=212;
+    public static final int T__211=211;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__207=207;
+    public static final int T__23=23;
+    public static final int T__206=206;
+    public static final int T__24=24;
+    public static final int T__209=209;
+    public static final int T__25=25;
+    public static final int T__208=208;
+    public static final int T__203=203;
+    public static final int T__202=202;
+    public static final int T__20=20;
+    public static final int T__205=205;
+    public static final int T__21=21;
+    public static final int T__204=204;
+    public static final int T__122=122;
+    public static final int T__243=243;
+    public static final int T__121=121;
+    public static final int T__242=242;
+    public static final int T__124=124;
+    public static final int T__245=245;
+    public static final int T__123=123;
+    public static final int T__244=244;
+    public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__119=119;
+    public static final int T__118=118;
+    public static final int T__239=239;
+    public static final int T__115=115;
+    public static final int T__236=236;
+    public static final int EOF=-1;
+    public static final int T__114=114;
+    public static final int T__235=235;
+    public static final int T__117=117;
+    public static final int T__238=238;
+    public static final int T__116=116;
+    public static final int T__237=237;
+    public static final int T__111=111;
+    public static final int T__232=232;
+    public static final int T__110=110;
+    public static final int T__231=231;
+    public static final int T__113=113;
+    public static final int T__234=234;
+    public static final int T__112=112;
+    public static final int T__233=233;
+    public static final int T__230=230;
+    public static final int T__108=108;
+    public static final int T__229=229;
+    public static final int T__107=107;
+    public static final int T__228=228;
+    public static final int T__109=109;
+    public static final int T__104=104;
+    public static final int T__225=225;
+    public static final int T__103=103;
+    public static final int T__224=224;
+    public static final int T__106=106;
+    public static final int T__227=227;
+    public static final int T__105=105;
+    public static final int T__226=226;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__201=201;
+    public static final int T__200=200;
+    public static final int T__91=91;
+    public static final int T__188=188;
+    public static final int T__92=92;
+    public static final int T__187=187;
+    public static final int T__93=93;
+    public static final int T__94=94;
+    public static final int T__189=189;
+    public static final int T__184=184;
+    public static final int T__183=183;
+    public static final int T__186=186;
+    public static final int T__90=90;
+    public static final int T__185=185;
+    public static final int T__180=180;
+    public static final int T__182=182;
+    public static final int T__181=181;
+    public static final int T__99=99;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
+    public static final int T__169=169;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=5;
+    public static final int T__77=77;
+    public static final int T__78=78;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__74=74;
+    public static final int T__75=75;
+    public static final int T__76=76;
+    public static final int T__80=80;
+    public static final int T__199=199;
+    public static final int T__81=81;
+    public static final int T__198=198;
+    public static final int T__82=82;
+    public static final int T__83=83;
+    public static final int T__195=195;
+    public static final int T__194=194;
+    public static final int RULE_WS=11;
+    public static final int T__197=197;
+    public static final int T__196=196;
+    public static final int T__191=191;
+    public static final int T__190=190;
+    public static final int T__193=193;
+    public static final int T__192=192;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__89=89;
+    public static final int T__84=84;
+    public static final int T__85=85;
+    public static final int T__86=86;
+    public static final int T__87=87;
+
+    // delegates
+    // delegators
+
+    public InternalFormalMLLexer() {;} 
+    public InternalFormalMLLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalFormalMLLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "InternalFormalML.g"; }
+
+    // $ANTLR start "T__13"
+    public final void mT__13() throws RecognitionException {
+        try {
+            int _type = T__13;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:11:7: ( 'initial' )
+            // InternalFormalML.g:11:9: 'initial'
+            {
+            match("initial"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__13"
+
+    // $ANTLR start "T__14"
+    public final void mT__14() throws RecognitionException {
+        try {
+            int _type = T__14;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:12:7: ( 'multi_rdv' )
+            // InternalFormalML.g:12:9: 'multi_rdv'
+            {
+            match("multi_rdv"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__14"
+
+    // $ANTLR start "T__15"
+    public final void mT__15() throws RecognitionException {
+        try {
+            int _type = T__15;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:13:7: ( 'buffer' )
+            // InternalFormalML.g:13:9: 'buffer'
+            {
+            match("buffer"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__15"
+
+    // $ANTLR start "T__16"
+    public final void mT__16() throws RecognitionException {
+        try {
+            int _type = T__16;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:14:7: ( 'var' )
+            // InternalFormalML.g:14:9: 'var'
+            {
+            match("var"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__16"
+
+    // $ANTLR start "T__17"
+    public final void mT__17() throws RecognitionException {
+        try {
+            int _type = T__17;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:15:7: ( 'port' )
+            // InternalFormalML.g:15:9: 'port'
+            {
+            match("port"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__17"
+
+    // $ANTLR start "T__18"
+    public final void mT__18() throws RecognitionException {
+        try {
+            int _type = T__18;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:16:7: ( 'signal' )
+            // InternalFormalML.g:16:9: 'signal'
+            {
+            match("signal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__18"
+
+    // $ANTLR start "T__19"
+    public final void mT__19() throws RecognitionException {
+        try {
+            int _type = T__19;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:17:7: ( 'channel' )
+            // InternalFormalML.g:17:9: 'channel'
+            {
+            match("channel"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__19"
+
+    // $ANTLR start "T__20"
+    public final void mT__20() throws RecognitionException {
+        try {
+            int _type = T__20;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:18:7: ( '.' )
+            // InternalFormalML.g:18:9: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__20"
+
+    // $ANTLR start "T__21"
+    public final void mT__21() throws RecognitionException {
+        try {
+            int _type = T__21;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:19:7: ( '->' )
+            // InternalFormalML.g:19:9: '->'
+            {
+            match("->"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__21"
+
+    // $ANTLR start "T__22"
+    public final void mT__22() throws RecognitionException {
+        try {
+            int _type = T__22;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:20:7: ( '[' )
+            // InternalFormalML.g:20:9: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__22"
+
+    // $ANTLR start "T__23"
+    public final void mT__23() throws RecognitionException {
+        try {
+            int _type = T__23;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:21:7: ( '(' )
+            // InternalFormalML.g:21:9: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__23"
+
+    // $ANTLR start "T__24"
+    public final void mT__24() throws RecognitionException {
+        try {
+            int _type = T__24;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:22:7: ( '@FormalML' )
+            // InternalFormalML.g:22:9: '@FormalML'
+            {
+            match("@FormalML"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__24"
+
+    // $ANTLR start "T__25"
+    public final void mT__25() throws RecognitionException {
+        try {
+            int _type = T__25;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:23:7: ( '@xlia' )
+            // InternalFormalML.g:23:9: '@xlia'
+            {
+            match("@xlia"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__25"
+
+    // $ANTLR start "T__26"
+    public final void mT__26() throws RecognitionException {
+        try {
+            int _type = T__26;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:24:7: ( '@xfsp' )
+            // InternalFormalML.g:24:9: '@xfsp'
+            {
+            match("@xfsp"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__26"
+
+    // $ANTLR start "T__27"
+    public final void mT__27() throws RecognitionException {
+        try {
+            int _type = T__27;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:25:7: ( 'system' )
+            // InternalFormalML.g:25:9: 'system'
+            {
+            match("system"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__27"
+
+    // $ANTLR start "T__28"
+    public final void mT__28() throws RecognitionException {
+        try {
+            int _type = T__28;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:26:7: ( 'package' )
+            // InternalFormalML.g:26:9: 'package'
+            {
+            match("package"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__28"
+
+    // $ANTLR start "T__29"
+    public final void mT__29() throws RecognitionException {
+        try {
+            int _type = T__29;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:27:7: ( 'true' )
+            // InternalFormalML.g:27:9: 'true'
+            {
+            match("true"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__29"
+
+    // $ANTLR start "T__30"
+    public final void mT__30() throws RecognitionException {
+        try {
+            int _type = T__30;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:28:7: ( 'false' )
+            // InternalFormalML.g:28:9: 'false'
+            {
+            match("false"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__30"
+
+    // $ANTLR start "T__31"
+    public final void mT__31() throws RecognitionException {
+        try {
+            int _type = T__31;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:29:7: ( ':' )
+            // InternalFormalML.g:29:9: ':'
+            {
+            match(':'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__31"
+
+    // $ANTLR start "T__32"
+    public final void mT__32() throws RecognitionException {
+        try {
+            int _type = T__32;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30:7: ( '::' )
+            // InternalFormalML.g:30:9: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__32"
+
+    // $ANTLR start "T__33"
+    public final void mT__33() throws RecognitionException {
+        try {
+            int _type = T__33;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:31:7: ( 'and' )
+            // InternalFormalML.g:31:9: 'and'
+            {
+            match("and"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__33"
+
+    // $ANTLR start "T__34"
+    public final void mT__34() throws RecognitionException {
+        try {
+            int _type = T__34;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:32:7: ( 'or' )
+            // InternalFormalML.g:32:9: 'or'
+            {
+            match("or"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__34"
+
+    // $ANTLR start "T__35"
+    public final void mT__35() throws RecognitionException {
+        try {
+            int _type = T__35;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:33:7: ( '@routine:' )
+            // InternalFormalML.g:33:9: '@routine:'
+            {
+            match("@routine:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__35"
+
+    // $ANTLR start "T__36"
+    public final void mT__36() throws RecognitionException {
+        try {
+            int _type = T__36;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:34:7: ( '@macro:' )
+            // InternalFormalML.g:34:9: '@macro:'
+            {
+            match("@macro:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__36"
+
+    // $ANTLR start "T__37"
+    public final void mT__37() throws RecognitionException {
+        try {
+            int _type = T__37;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:35:7: ( '@composite:' )
+            // InternalFormalML.g:35:9: '@composite:'
+            {
+            match("@composite:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__37"
+
+    // $ANTLR start "T__38"
+    public final void mT__38() throws RecognitionException {
+        try {
+            int _type = T__38;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:36:7: ( '@machine:' )
+            // InternalFormalML.g:36:9: '@machine:'
+            {
+            match("@machine:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__38"
+
+    // $ANTLR start "T__39"
+    public final void mT__39() throws RecognitionException {
+        try {
+            int _type = T__39;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:37:7: ( 'machine' )
+            // InternalFormalML.g:37:9: 'machine'
+            {
+            match("machine"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__39"
+
+    // $ANTLR start "T__40"
+    public final void mT__40() throws RecognitionException {
+        try {
+            int _type = T__40;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:38:7: ( 'statemachine' )
+            // InternalFormalML.g:38:9: 'statemachine'
+            {
+            match("statemachine"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__40"
+
+    // $ANTLR start "T__41"
+    public final void mT__41() throws RecognitionException {
+        try {
+            int _type = T__41;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:39:7: ( '@region:' )
+            // InternalFormalML.g:39:9: '@region:'
+            {
+            match("@region:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__41"
+
+    // $ANTLR start "T__42"
+    public final void mT__42() throws RecognitionException {
+        try {
+            int _type = T__42;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:40:7: ( '@statemachine:' )
+            // InternalFormalML.g:40:9: '@statemachine:'
+            {
+            match("@statemachine:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__42"
+
+    // $ANTLR start "T__43"
+    public final void mT__43() throws RecognitionException {
+        try {
+            int _type = T__43;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:41:7: ( '@region<' )
+            // InternalFormalML.g:41:9: '@region<'
+            {
+            match("@region<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__43"
+
+    // $ANTLR start "T__44"
+    public final void mT__44() throws RecognitionException {
+        try {
+            int _type = T__44;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:42:7: ( '@statemachine<' )
+            // InternalFormalML.g:42:9: '@statemachine<'
+            {
+            match("@statemachine<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__44"
+
+    // $ANTLR start "T__45"
+    public final void mT__45() throws RecognitionException {
+        try {
+            int _type = T__45;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:43:7: ( ';' )
+            // InternalFormalML.g:43:9: ';'
+            {
+            match(';'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__45"
+
+    // $ANTLR start "T__46"
+    public final void mT__46() throws RecognitionException {
+        try {
+            int _type = T__46;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:44:7: ( '@init' )
+            // InternalFormalML.g:44:9: '@init'
+            {
+            match("@init"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__46"
+
+    // $ANTLR start "T__47"
+    public final void mT__47() throws RecognitionException {
+        try {
+            int _type = T__47;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:45:7: ( '@final' )
+            // InternalFormalML.g:45:9: '@final'
+            {
+            match("@final"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__47"
+
+    // $ANTLR start "T__48"
+    public final void mT__48() throws RecognitionException {
+        try {
+            int _type = T__48;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:46:7: ( '@enable' )
+            // InternalFormalML.g:46:9: '@enable'
+            {
+            match("@enable"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__48"
+
+    // $ANTLR start "T__49"
+    public final void mT__49() throws RecognitionException {
+        try {
+            int _type = T__49;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:47:7: ( '@disable' )
+            // InternalFormalML.g:47:9: '@disable'
+            {
+            match("@disable"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__49"
+
+    // $ANTLR start "T__50"
+    public final void mT__50() throws RecognitionException {
+        try {
+            int _type = T__50;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:48:7: ( '@concurrency' )
+            // InternalFormalML.g:48:9: '@concurrency'
+            {
+            match("@concurrency"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__50"
+
+    // $ANTLR start "T__51"
+    public final void mT__51() throws RecognitionException {
+        try {
+            int _type = T__51;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:49:7: ( '@schedule' )
+            // InternalFormalML.g:49:9: '@schedule'
+            {
+            match("@schedule"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__51"
+
+    // $ANTLR start "T__52"
+    public final void mT__52() throws RecognitionException {
+        try {
+            int _type = T__52;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:50:7: ( '@irun' )
+            // InternalFormalML.g:50:9: '@irun'
+            {
+            match("@irun"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__52"
+
+    // $ANTLR start "T__53"
+    public final void mT__53() throws RecognitionException {
+        try {
+            int _type = T__53;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:51:7: ( '@run' )
+            // InternalFormalML.g:51:9: '@run'
+            {
+            match("@run"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__53"
+
+    // $ANTLR start "T__54"
+    public final void mT__54() throws RecognitionException {
+        try {
+            int _type = T__54;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:52:7: ( 'state' )
+            // InternalFormalML.g:52:9: 'state'
+            {
+            match("state"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__54"
+
+    // $ANTLR start "T__55"
+    public final void mT__55() throws RecognitionException {
+        try {
+            int _type = T__55;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:53:7: ( 'pseudostate' )
+            // InternalFormalML.g:53:9: 'pseudostate'
+            {
+            match("pseudostate"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__55"
+
+    // $ANTLR start "T__56"
+    public final void mT__56() throws RecognitionException {
+        try {
+            int _type = T__56;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:54:7: ( '#initial' )
+            // InternalFormalML.g:54:9: '#initial'
+            {
+            match("#initial"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__56"
+
+    // $ANTLR start "T__57"
+    public final void mT__57() throws RecognitionException {
+        try {
+            int _type = T__57;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:55:7: ( '#init' )
+            // InternalFormalML.g:55:9: '#init'
+            {
+            match("#init"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__57"
+
+    // $ANTLR start "T__58"
+    public final void mT__58() throws RecognitionException {
+        try {
+            int _type = T__58;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:56:7: ( '*' )
+            // InternalFormalML.g:56:9: '*'
+            {
+            match('*'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__58"
+
+    // $ANTLR start "T__59"
+    public final void mT__59() throws RecognitionException {
+        try {
+            int _type = T__59;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:57:7: ( 'integer' )
+            // InternalFormalML.g:57:9: 'integer'
+            {
+            match("integer"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__59"
+
+    // $ANTLR start "T__60"
+    public final void mT__60() throws RecognitionException {
+        try {
+            int _type = T__60;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:58:7: ( 'uinteger' )
+            // InternalFormalML.g:58:9: 'uinteger'
+            {
+            match("uinteger"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__60"
+
+    // $ANTLR start "T__61"
+    public final void mT__61() throws RecognitionException {
+        try {
+            int _type = T__61;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:59:7: ( 'int' )
+            // InternalFormalML.g:59:9: 'int'
+            {
+            match("int"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__61"
+
+    // $ANTLR start "T__62"
+    public final void mT__62() throws RecognitionException {
+        try {
+            int _type = T__62;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:60:7: ( 'uint' )
+            // InternalFormalML.g:60:9: 'uint'
+            {
+            match("uint"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__62"
+
+    // $ANTLR start "T__63"
+    public final void mT__63() throws RecognitionException {
+        try {
+            int _type = T__63;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:61:7: ( 'rational' )
+            // InternalFormalML.g:61:9: 'rational'
+            {
+            match("rational"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__63"
+
+    // $ANTLR start "T__64"
+    public final void mT__64() throws RecognitionException {
+        try {
+            int _type = T__64;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:62:7: ( 'urational' )
+            // InternalFormalML.g:62:9: 'urational'
+            {
+            match("urational"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__64"
+
+    // $ANTLR start "T__65"
+    public final void mT__65() throws RecognitionException {
+        try {
+            int _type = T__65;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:63:7: ( 'rat' )
+            // InternalFormalML.g:63:9: 'rat'
+            {
+            match("rat"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__65"
+
+    // $ANTLR start "T__66"
+    public final void mT__66() throws RecognitionException {
+        try {
+            int _type = T__66;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:64:7: ( 'urat' )
+            // InternalFormalML.g:64:9: 'urat'
+            {
+            match("urat"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__66"
+
+    // $ANTLR start "T__67"
+    public final void mT__67() throws RecognitionException {
+        try {
+            int _type = T__67;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:65:7: ( 'float' )
+            // InternalFormalML.g:65:9: 'float'
+            {
+            match("float"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__67"
+
+    // $ANTLR start "T__68"
+    public final void mT__68() throws RecognitionException {
+        try {
+            int _type = T__68;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:66:7: ( 'ufloat' )
+            // InternalFormalML.g:66:9: 'ufloat'
+            {
+            match("ufloat"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__68"
+
+    // $ANTLR start "T__69"
+    public final void mT__69() throws RecognitionException {
+        try {
+            int _type = T__69;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:67:7: ( 'double' )
+            // InternalFormalML.g:67:9: 'double'
+            {
+            match("double"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__69"
+
+    // $ANTLR start "T__70"
+    public final void mT__70() throws RecognitionException {
+        try {
+            int _type = T__70;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:68:7: ( 'udouble' )
+            // InternalFormalML.g:68:9: 'udouble'
+            {
+            match("udouble"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__70"
+
+    // $ANTLR start "T__71"
+    public final void mT__71() throws RecognitionException {
+        try {
+            int _type = T__71;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:69:7: ( 'real' )
+            // InternalFormalML.g:69:9: 'real'
+            {
+            match("real"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__71"
+
+    // $ANTLR start "T__72"
+    public final void mT__72() throws RecognitionException {
+        try {
+            int _type = T__72;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:70:7: ( 'ureal' )
+            // InternalFormalML.g:70:9: 'ureal'
+            {
+            match("ureal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__72"
+
+    // $ANTLR start "T__73"
+    public final void mT__73() throws RecognitionException {
+        try {
+            int _type = T__73;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:71:7: ( 'boolean' )
+            // InternalFormalML.g:71:9: 'boolean'
+            {
+            match("boolean"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__73"
+
+    // $ANTLR start "T__74"
+    public final void mT__74() throws RecognitionException {
+        try {
+            int _type = T__74;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:72:7: ( 'bool' )
+            // InternalFormalML.g:72:9: 'bool'
+            {
+            match("bool"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__74"
+
+    // $ANTLR start "T__75"
+    public final void mT__75() throws RecognitionException {
+        try {
+            int _type = T__75;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:73:7: ( ']' )
+            // InternalFormalML.g:73:9: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__75"
+
+    // $ANTLR start "T__76"
+    public final void mT__76() throws RecognitionException {
+        try {
+            int _type = T__76;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:74:7: ( '@guard:' )
+            // InternalFormalML.g:74:9: '@guard:'
+            {
+            match("@guard:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__76"
+
+    // $ANTLR start "T__77"
+    public final void mT__77() throws RecognitionException {
+        try {
+            int _type = T__77;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75:7: ( '@tguard:' )
+            // InternalFormalML.g:75:9: '@tguard:'
+            {
+            match("@tguard:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__77"
+
+    // $ANTLR start "T__78"
+    public final void mT__78() throws RecognitionException {
+        try {
+            int _type = T__78;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:76:7: ( '&&' )
+            // InternalFormalML.g:76:9: '&&'
+            {
+            match("&&"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__78"
+
+    // $ANTLR start "T__79"
+    public final void mT__79() throws RecognitionException {
+        try {
+            int _type = T__79;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:77:7: ( '||' )
+            // InternalFormalML.g:77:9: '||'
+            {
+            match("||"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__79"
+
+    // $ANTLR start "T__80"
+    public final void mT__80() throws RecognitionException {
+        try {
+            int _type = T__80;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:78:7: ( '|;|' )
+            // InternalFormalML.g:78:9: '|;|'
+            {
+            match("|;|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__80"
+
+    // $ANTLR start "T__81"
+    public final void mT__81() throws RecognitionException {
+        try {
+            int _type = T__81;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:79:7: ( '|\\u00A7|' )
+            // InternalFormalML.g:79:9: '|\\u00A7|'
+            {
+            match("|\u00A7|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__81"
+
+    // $ANTLR start "T__82"
+    public final void mT__82() throws RecognitionException {
+        try {
+            int _type = T__82;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:80:7: ( '|;;|' )
+            // InternalFormalML.g:80:9: '|;;|'
+            {
+            match("|;;|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__82"
+
+    // $ANTLR start "T__83"
+    public final void mT__83() throws RecognitionException {
+        try {
+            int _type = T__83;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:81:7: ( '|.|' )
+            // InternalFormalML.g:81:9: '|.|'
+            {
+            match("|.|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__83"
+
+    // $ANTLR start "T__84"
+    public final void mT__84() throws RecognitionException {
+        try {
+            int _type = T__84;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:82:7: ( '|/;|' )
+            // InternalFormalML.g:82:9: '|/;|'
+            {
+            match("|/;|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__84"
+
+    // $ANTLR start "T__85"
+    public final void mT__85() throws RecognitionException {
+        try {
+            int _type = T__85;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:83:7: ( '|i|' )
+            // InternalFormalML.g:83:9: '|i|'
+            {
+            match("|i|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__85"
+
+    // $ANTLR start "T__86"
+    public final void mT__86() throws RecognitionException {
+        try {
+            int _type = T__86;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:84:7: ( '|,|' )
+            // InternalFormalML.g:84:9: '|,|'
+            {
+            match("|,|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__86"
+
+    // $ANTLR start "T__87"
+    public final void mT__87() throws RecognitionException {
+        try {
+            int _type = T__87;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:85:7: ( '|a|' )
+            // InternalFormalML.g:85:9: '|a|'
+            {
+            match("|a|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__87"
+
+    // $ANTLR start "T__88"
+    public final void mT__88() throws RecognitionException {
+        try {
+            int _type = T__88;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:86:7: ( '|and|' )
+            // InternalFormalML.g:86:9: '|and|'
+            {
+            match("|and|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__88"
+
+    // $ANTLR start "T__89"
+    public final void mT__89() throws RecognitionException {
+        try {
+            int _type = T__89;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:87:7: ( '|or|' )
+            // InternalFormalML.g:87:9: '|or|'
+            {
+            match("|or|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__89"
+
+    // $ANTLR start "T__90"
+    public final void mT__90() throws RecognitionException {
+        try {
+            int _type = T__90;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:88:7: ( '|and#then|' )
+            // InternalFormalML.g:88:9: '|and#then|'
+            {
+            match("|and#then|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__90"
+
+    // $ANTLR start "T__91"
+    public final void mT__91() throws RecognitionException {
+        try {
+            int _type = T__91;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:89:7: ( '|or#else|' )
+            // InternalFormalML.g:89:9: '|or#else|'
+            {
+            match("|or#else|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__91"
+
+    // $ANTLR start "T__92"
+    public final void mT__92() throws RecognitionException {
+        try {
+            int _type = T__92;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:90:7: ( '|indet|' )
+            // InternalFormalML.g:90:9: '|indet|'
+            {
+            match("|indet|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__92"
+
+    // $ANTLR start "T__93"
+    public final void mT__93() throws RecognitionException {
+        try {
+            int _type = T__93;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:91:7: ( '|/\\\\|' )
+            // InternalFormalML.g:91:9: '|/\\\\|'
+            {
+            match("|/\\|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__93"
+
+    // $ANTLR start "T__94"
+    public final void mT__94() throws RecognitionException {
+        try {
+            int _type = T__94;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:92:7: ( '|fork|' )
+            // InternalFormalML.g:92:9: '|fork|'
+            {
+            match("|fork|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__94"
+
+    // $ANTLR start "T__95"
+    public final void mT__95() throws RecognitionException {
+        try {
+            int _type = T__95;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:93:7: ( '|join|' )
+            // InternalFormalML.g:93:9: '|join|'
+            {
+            match("|join|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__95"
+
+    // $ANTLR start "T__96"
+    public final void mT__96() throws RecognitionException {
+        try {
+            int _type = T__96;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:94:7: ( '<==' )
+            // InternalFormalML.g:94:9: '<=='
+            {
+            match("<=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__96"
+
+    // $ANTLR start "T__97"
+    public final void mT__97() throws RecognitionException {
+        try {
+            int _type = T__97;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:95:7: ( 'via' )
+            // InternalFormalML.g:95:9: 'via'
+            {
+            match("via"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__97"
+
+    // $ANTLR start "T__98"
+    public final void mT__98() throws RecognitionException {
+        try {
+            int _type = T__98;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:96:7: ( '==>' )
+            // InternalFormalML.g:96:9: '==>'
+            {
+            match("==>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__98"
+
+    // $ANTLR start "T__99"
+    public final void mT__99() throws RecognitionException {
+        try {
+            int _type = T__99;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:97:7: ( 'elseif' )
+            // InternalFormalML.g:97:9: 'elseif'
+            {
+            match("elseif"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__99"
+
+    // $ANTLR start "T__100"
+    public final void mT__100() throws RecognitionException {
+        try {
+            int _type = T__100;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:98:8: ( '=' )
+            // InternalFormalML.g:98:10: '='
+            {
+            match('='); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__100"
+
+    // $ANTLR start "T__101"
+    public final void mT__101() throws RecognitionException {
+        try {
+            int _type = T__101;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:99:8: ( ':=' )
+            // InternalFormalML.g:99:10: ':='
+            {
+            match(":="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__101"
+
+    // $ANTLR start "T__102"
+    public final void mT__102() throws RecognitionException {
+        try {
+            int _type = T__102;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:100:8: ( '::=' )
+            // InternalFormalML.g:100:10: '::='
+            {
+            match("::="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__102"
+
+    // $ANTLR start "T__103"
+    public final void mT__103() throws RecognitionException {
+        try {
+            int _type = T__103;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:101:8: ( '+=' )
+            // InternalFormalML.g:101:10: '+='
+            {
+            match("+="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__103"
+
+    // $ANTLR start "T__104"
+    public final void mT__104() throws RecognitionException {
+        try {
+            int _type = T__104;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:102:8: ( '-=' )
+            // InternalFormalML.g:102:10: '-='
+            {
+            match("-="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__104"
+
+    // $ANTLR start "T__105"
+    public final void mT__105() throws RecognitionException {
+        try {
+            int _type = T__105;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:103:8: ( '*=' )
+            // InternalFormalML.g:103:10: '*='
+            {
+            match("*="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__105"
+
+    // $ANTLR start "T__106"
+    public final void mT__106() throws RecognitionException {
+        try {
+            int _type = T__106;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:104:8: ( '/=' )
+            // InternalFormalML.g:104:10: '/='
+            {
+            match("/="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__106"
+
+    // $ANTLR start "T__107"
+    public final void mT__107() throws RecognitionException {
+        try {
+            int _type = T__107;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:105:8: ( '%=' )
+            // InternalFormalML.g:105:10: '%='
+            {
+            match("%="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__107"
+
+    // $ANTLR start "T__108"
+    public final void mT__108() throws RecognitionException {
+        try {
+            int _type = T__108;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:106:8: ( '&&=' )
+            // InternalFormalML.g:106:10: '&&='
+            {
+            match("&&="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__108"
+
+    // $ANTLR start "T__109"
+    public final void mT__109() throws RecognitionException {
+        try {
+            int _type = T__109;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:107:8: ( '||=' )
+            // InternalFormalML.g:107:10: '||='
+            {
+            match("||="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__109"
+
+    // $ANTLR start "T__110"
+    public final void mT__110() throws RecognitionException {
+        try {
+            int _type = T__110;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:108:8: ( '&=' )
+            // InternalFormalML.g:108:10: '&='
+            {
+            match("&="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__110"
+
+    // $ANTLR start "T__111"
+    public final void mT__111() throws RecognitionException {
+        try {
+            int _type = T__111;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:109:8: ( '|=' )
+            // InternalFormalML.g:109:10: '|='
+            {
+            match("|="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__111"
+
+    // $ANTLR start "T__112"
+    public final void mT__112() throws RecognitionException {
+        try {
+            int _type = T__112;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:110:8: ( '^=' )
+            // InternalFormalML.g:110:10: '^='
+            {
+            match("^="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__112"
+
+    // $ANTLR start "T__113"
+    public final void mT__113() throws RecognitionException {
+        try {
+            int _type = T__113;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:111:8: ( '<<=' )
+            // InternalFormalML.g:111:10: '<<='
+            {
+            match("<<="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__113"
+
+    // $ANTLR start "T__114"
+    public final void mT__114() throws RecognitionException {
+        try {
+            int _type = T__114;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:112:8: ( '>>=' )
+            // InternalFormalML.g:112:10: '>>='
+            {
+            match(">>="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__114"
+
+    // $ANTLR start "T__115"
+    public final void mT__115() throws RecognitionException {
+        try {
+            int _type = T__115;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:113:8: ( '>>>=' )
+            // InternalFormalML.g:113:10: '>>>='
+            {
+            match(">>>="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__115"
+
+    // $ANTLR start "T__116"
+    public final void mT__116() throws RecognitionException {
+        try {
+            int _type = T__116;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:114:8: ( '<=<' )
+            // InternalFormalML.g:114:10: '<=<'
+            {
+            match("<=<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__116"
+
+    // $ANTLR start "T__117"
+    public final void mT__117() throws RecognitionException {
+        try {
+            int _type = T__117;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:115:8: ( '^=<' )
+            // InternalFormalML.g:115:10: '^=<'
+            {
+            match("^=<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__117"
+
+    // $ANTLR start "T__118"
+    public final void mT__118() throws RecognitionException {
+        try {
+            int _type = T__118;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:116:8: ( '^=>' )
+            // InternalFormalML.g:116:10: '^=>'
+            {
+            match("^=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__118"
+
+    // $ANTLR start "T__119"
+    public final void mT__119() throws RecognitionException {
+        try {
+            int _type = T__119;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:117:8: ( '>=>' )
+            // InternalFormalML.g:117:10: '>=>'
+            {
+            match(">=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__119"
+
+    // $ANTLR start "T__120"
+    public final void mT__120() throws RecognitionException {
+        try {
+            int _type = T__120;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:118:8: ( '==' )
+            // InternalFormalML.g:118:10: '=='
+            {
+            match("=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__120"
+
+    // $ANTLR start "T__121"
+    public final void mT__121() throws RecognitionException {
+        try {
+            int _type = T__121;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:119:8: ( '!=' )
+            // InternalFormalML.g:119:10: '!='
+            {
+            match("!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__121"
+
+    // $ANTLR start "T__122"
+    public final void mT__122() throws RecognitionException {
+        try {
+            int _type = T__122;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:120:8: ( '===' )
+            // InternalFormalML.g:120:10: '==='
+            {
+            match("==="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__122"
+
+    // $ANTLR start "T__123"
+    public final void mT__123() throws RecognitionException {
+        try {
+            int _type = T__123;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:121:8: ( '=!=' )
+            // InternalFormalML.g:121:10: '=!='
+            {
+            match("=!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__123"
+
+    // $ANTLR start "T__124"
+    public final void mT__124() throws RecognitionException {
+        try {
+            int _type = T__124;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:122:8: ( '=/=' )
+            // InternalFormalML.g:122:10: '=/='
+            {
+            match("=/="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__124"
+
+    // $ANTLR start "T__125"
+    public final void mT__125() throws RecognitionException {
+        try {
+            int _type = T__125;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:123:8: ( '<' )
+            // InternalFormalML.g:123:10: '<'
+            {
+            match('<'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__125"
+
+    // $ANTLR start "T__126"
+    public final void mT__126() throws RecognitionException {
+        try {
+            int _type = T__126;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:124:8: ( '>' )
+            // InternalFormalML.g:124:10: '>'
+            {
+            match('>'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__126"
+
+    // $ANTLR start "T__127"
+    public final void mT__127() throws RecognitionException {
+        try {
+            int _type = T__127;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:125:8: ( '<=' )
+            // InternalFormalML.g:125:10: '<='
+            {
+            match("<="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__127"
+
+    // $ANTLR start "T__128"
+    public final void mT__128() throws RecognitionException {
+        try {
+            int _type = T__128;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:126:8: ( '>=' )
+            // InternalFormalML.g:126:10: '>='
+            {
+            match(">="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__128"
+
+    // $ANTLR start "T__129"
+    public final void mT__129() throws RecognitionException {
+        try {
+            int _type = T__129;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:127:8: ( '++' )
+            // InternalFormalML.g:127:10: '++'
+            {
+            match("++"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__129"
+
+    // $ANTLR start "T__130"
+    public final void mT__130() throws RecognitionException {
+        try {
+            int _type = T__130;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:128:8: ( '--' )
+            // InternalFormalML.g:128:10: '--'
+            {
+            match("--"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__130"
+
+    // $ANTLR start "T__131"
+    public final void mT__131() throws RecognitionException {
+        try {
+            int _type = T__131;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:129:8: ( '+' )
+            // InternalFormalML.g:129:10: '+'
+            {
+            match('+'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__131"
+
+    // $ANTLR start "T__132"
+    public final void mT__132() throws RecognitionException {
+        try {
+            int _type = T__132;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:130:8: ( '-' )
+            // InternalFormalML.g:130:10: '-'
+            {
+            match('-'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__132"
+
+    // $ANTLR start "T__133"
+    public final void mT__133() throws RecognitionException {
+        try {
+            int _type = T__133;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:131:8: ( '!' )
+            // InternalFormalML.g:131:10: '!'
+            {
+            match('!'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__133"
+
+    // $ANTLR start "T__134"
+    public final void mT__134() throws RecognitionException {
+        try {
+            int _type = T__134;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:132:8: ( 'not' )
+            // InternalFormalML.g:132:10: 'not'
+            {
+            match("not"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__134"
+
+    // $ANTLR start "T__135"
+    public final void mT__135() throws RecognitionException {
+        try {
+            int _type = T__135;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:133:8: ( '=>' )
+            // InternalFormalML.g:133:10: '=>'
+            {
+            match("=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__135"
+
+    // $ANTLR start "T__136"
+    public final void mT__136() throws RecognitionException {
+        try {
+            int _type = T__136;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:134:8: ( '<-' )
+            // InternalFormalML.g:134:10: '<-'
+            {
+            match("<-"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__136"
+
+    // $ANTLR start "T__137"
+    public final void mT__137() throws RecognitionException {
+        try {
+            int _type = T__137;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:135:8: ( 'null' )
+            // InternalFormalML.g:135:10: 'null'
+            {
+            match("null"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__137"
+
+    // $ANTLR start "T__138"
+    public final void mT__138() throws RecognitionException {
+        try {
+            int _type = T__138;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:136:8: ( '$null' )
+            // InternalFormalML.g:136:10: '$null'
+            {
+            match("$null"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__138"
+
+    // $ANTLR start "T__139"
+    public final void mT__139() throws RecognitionException {
+        try {
+            int _type = T__139;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:137:8: ( 'null<' )
+            // InternalFormalML.g:137:10: 'null<'
+            {
+            match("null<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__139"
+
+    // $ANTLR start "T__140"
+    public final void mT__140() throws RecognitionException {
+        try {
+            int _type = T__140;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:138:8: ( '$null<' )
+            // InternalFormalML.g:138:10: '$null<'
+            {
+            match("$null<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__140"
+
+    // $ANTLR start "T__141"
+    public final void mT__141() throws RecognitionException {
+        try {
+            int _type = T__141;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:139:8: ( '$env' )
+            // InternalFormalML.g:139:10: '$env'
+            {
+            match("$env"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__141"
+
+    // $ANTLR start "T__142"
+    public final void mT__142() throws RecognitionException {
+        try {
+            int _type = T__142;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:140:8: ( 'env' )
+            // InternalFormalML.g:140:10: 'env'
+            {
+            match("env"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__142"
+
+    // $ANTLR start "T__143"
+    public final void mT__143() throws RecognitionException {
+        try {
+            int _type = T__143;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:141:8: ( 'public' )
+            // InternalFormalML.g:141:10: 'public'
+            {
+            match("public"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__143"
+
+    // $ANTLR start "T__144"
+    public final void mT__144() throws RecognitionException {
+        try {
+            int _type = T__144;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:142:8: ( 'private' )
+            // InternalFormalML.g:142:10: 'private'
+            {
+            match("private"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__144"
+
+    // $ANTLR start "T__145"
+    public final void mT__145() throws RecognitionException {
+        try {
+            int _type = T__145;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:143:8: ( 'protected' )
+            // InternalFormalML.g:143:10: 'protected'
+            {
+            match("protected"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__145"
+
+    // $ANTLR start "T__146"
+    public final void mT__146() throws RecognitionException {
+        try {
+            int _type = T__146;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:144:8: ( 'model' )
+            // InternalFormalML.g:144:10: 'model'
+            {
+            match("model"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__146"
+
+    // $ANTLR start "T__147"
+    public final void mT__147() throws RecognitionException {
+        try {
+            int _type = T__147;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:145:8: ( 'prototype' )
+            // InternalFormalML.g:145:10: 'prototype'
+            {
+            match("prototype"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__147"
+
+    // $ANTLR start "T__148"
+    public final void mT__148() throws RecognitionException {
+        try {
+            int _type = T__148;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:146:8: ( 'junction' )
+            // InternalFormalML.g:146:10: 'junction'
+            {
+            match("junction"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__148"
+
+    // $ANTLR start "T__149"
+    public final void mT__149() throws RecognitionException {
+        try {
+            int _type = T__149;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:147:8: ( 'choice' )
+            // InternalFormalML.g:147:10: 'choice'
+            {
+            match("choice"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__149"
+
+    // $ANTLR start "T__150"
+    public final void mT__150() throws RecognitionException {
+        try {
+            int _type = T__150;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:148:8: ( 'entryPoint' )
+            // InternalFormalML.g:148:10: 'entryPoint'
+            {
+            match("entryPoint"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__150"
+
+    // $ANTLR start "T__151"
+    public final void mT__151() throws RecognitionException {
+        try {
+            int _type = T__151;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:149:8: ( 'exitPoint' )
+            // InternalFormalML.g:149:10: 'exitPoint'
+            {
+            match("exitPoint"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__151"
+
+    // $ANTLR start "T__152"
+    public final void mT__152() throws RecognitionException {
+        try {
+            int _type = T__152;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:150:8: ( 'fork' )
+            // InternalFormalML.g:150:10: 'fork'
+            {
+            match("fork"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__152"
+
+    // $ANTLR start "T__153"
+    public final void mT__153() throws RecognitionException {
+        try {
+            int _type = T__153;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:151:8: ( 'join' )
+            // InternalFormalML.g:151:10: 'join'
+            {
+            match("join"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__153"
+
+    // $ANTLR start "T__154"
+    public final void mT__154() throws RecognitionException {
+        try {
+            int _type = T__154;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:152:8: ( 'dhistory' )
+            // InternalFormalML.g:152:10: 'dhistory'
+            {
+            match("dhistory"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__154"
+
+    // $ANTLR start "T__155"
+    public final void mT__155() throws RecognitionException {
+        try {
+            int _type = T__155;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:153:8: ( 'shistory' )
+            // InternalFormalML.g:153:10: 'shistory'
+            {
+            match("shistory"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__155"
+
+    // $ANTLR start "T__156"
+    public final void mT__156() throws RecognitionException {
+        try {
+            int _type = T__156;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:154:8: ( 'terminal' )
+            // InternalFormalML.g:154:10: 'terminal'
+            {
+            match("terminal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__156"
+
+    // $ANTLR start "T__157"
+    public final void mT__157() throws RecognitionException {
+        try {
+            int _type = T__157;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:155:8: ( 'return' )
+            // InternalFormalML.g:155:10: 'return'
+            {
+            match("return"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__157"
+
+    // $ANTLR start "T__158"
+    public final void mT__158() throws RecognitionException {
+        try {
+            int _type = T__158;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:156:8: ( 'rdv' )
+            // InternalFormalML.g:156:10: 'rdv'
+            {
+            match("rdv"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__158"
+
+    // $ANTLR start "T__159"
+    public final void mT__159() throws RecognitionException {
+        try {
+            int _type = T__159;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:157:8: ( 'unicast' )
+            // InternalFormalML.g:157:10: 'unicast'
+            {
+            match("unicast"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__159"
+
+    // $ANTLR start "T__160"
+    public final void mT__160() throws RecognitionException {
+        try {
+            int _type = T__160;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:158:8: ( 'anycast' )
+            // InternalFormalML.g:158:10: 'anycast'
+            {
+            match("anycast"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__160"
+
+    // $ANTLR start "T__161"
+    public final void mT__161() throws RecognitionException {
+        try {
+            int _type = T__161;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:159:8: ( 'multicast' )
+            // InternalFormalML.g:159:10: 'multicast'
+            {
+            match("multicast"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__161"
+
+    // $ANTLR start "T__162"
+    public final void mT__162() throws RecognitionException {
+        try {
+            int _type = T__162;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:160:8: ( 'broadcast' )
+            // InternalFormalML.g:160:10: 'broadcast'
+            {
+            match("broadcast"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__162"
+
+    // $ANTLR start "T__163"
+    public final void mT__163() throws RecognitionException {
+        try {
+            int _type = T__163;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:161:8: ( 'message' )
+            // InternalFormalML.g:161:10: 'message'
+            {
+            match("message"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__163"
+
+    // $ANTLR start "T__164"
+    public final void mT__164() throws RecognitionException {
+        try {
+            int _type = T__164;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:162:8: ( 'vertex' )
+            // InternalFormalML.g:162:10: 'vertex'
+            {
+            match("vertex"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__164"
+
+    // $ANTLR start "T__165"
+    public final void mT__165() throws RecognitionException {
+        try {
+            int _type = T__165;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:163:8: ( 'vector' )
+            // InternalFormalML.g:163:10: 'vector'
+            {
+            match("vector"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__165"
+
+    // $ANTLR start "T__166"
+    public final void mT__166() throws RecognitionException {
+        try {
+            int _type = T__166;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:164:8: ( 'rvector' )
+            // InternalFormalML.g:164:10: 'rvector'
+            {
+            match("rvector"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__166"
+
+    // $ANTLR start "T__167"
+    public final void mT__167() throws RecognitionException {
+        try {
+            int _type = T__167;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:165:8: ( 'list' )
+            // InternalFormalML.g:165:10: 'list'
+            {
+            match("list"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__167"
+
+    // $ANTLR start "T__168"
+    public final void mT__168() throws RecognitionException {
+        try {
+            int _type = T__168;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:166:8: ( 'set' )
+            // InternalFormalML.g:166:10: 'set'
+            {
+            match("set"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__168"
+
+    // $ANTLR start "T__169"
+    public final void mT__169() throws RecognitionException {
+        try {
+            int _type = T__169;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:167:8: ( 'bag' )
+            // InternalFormalML.g:167:10: 'bag'
+            {
+            match("bag"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__169"
+
+    // $ANTLR start "T__170"
+    public final void mT__170() throws RecognitionException {
+        try {
+            int _type = T__170;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:168:8: ( 'fifo' )
+            // InternalFormalML.g:168:10: 'fifo'
+            {
+            match("fifo"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__170"
+
+    // $ANTLR start "T__171"
+    public final void mT__171() throws RecognitionException {
+        try {
+            int _type = T__171;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:169:8: ( 'lifo' )
+            // InternalFormalML.g:169:10: 'lifo'
+            {
+            match("lifo"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__171"
+
+    // $ANTLR start "T__172"
+    public final void mT__172() throws RecognitionException {
+        try {
+            int _type = T__172;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:170:8: ( 'in' )
+            // InternalFormalML.g:170:10: 'in'
+            {
+            match("in"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__172"
+
+    // $ANTLR start "T__173"
+    public final void mT__173() throws RecognitionException {
+        try {
+            int _type = T__173;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:171:8: ( 'inout' )
+            // InternalFormalML.g:171:10: 'inout'
+            {
+            match("inout"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__173"
+
+    // $ANTLR start "T__174"
+    public final void mT__174() throws RecognitionException {
+        try {
+            int _type = T__174;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:172:8: ( 'out' )
+            // InternalFormalML.g:172:10: 'out'
+            {
+            match("out"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__174"
+
+    // $ANTLR start "T__175"
+    public final void mT__175() throws RecognitionException {
+        try {
+            int _type = T__175;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:173:8: ( 'input' )
+            // InternalFormalML.g:173:10: 'input'
+            {
+            match("input"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__175"
+
+    // $ANTLR start "T__176"
+    public final void mT__176() throws RecognitionException {
+        try {
+            int _type = T__176;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:174:8: ( 'output' )
+            // InternalFormalML.g:174:10: 'output'
+            {
+            match("output"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__176"
+
+    // $ANTLR start "T__177"
+    public final void mT__177() throws RecognitionException {
+        try {
+            int _type = T__177;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:175:8: ( 'simple' )
+            // InternalFormalML.g:175:10: 'simple'
+            {
+            match("simple"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__177"
+
+    // $ANTLR start "T__178"
+    public final void mT__178() throws RecognitionException {
+        try {
+            int _type = T__178;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:176:8: ( 'abort' )
+            // InternalFormalML.g:176:10: 'abort'
+            {
+            match("abort"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__178"
+
+    // $ANTLR start "T__179"
+    public final void mT__179() throws RecognitionException {
+        try {
+            int _type = T__179;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:177:8: ( 'final' )
+            // InternalFormalML.g:177:10: 'final'
+            {
+            match("final"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__179"
+
+    // $ANTLR start "T__180"
+    public final void mT__180() throws RecognitionException {
+        try {
+            int _type = T__180;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:178:8: ( 'break' )
+            // InternalFormalML.g:178:10: 'break'
+            {
+            match("break"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__180"
+
+    // $ANTLR start "T__181"
+    public final void mT__181() throws RecognitionException {
+        try {
+            int _type = T__181;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:179:8: ( 'continue' )
+            // InternalFormalML.g:179:10: 'continue'
+            {
+            match("continue"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__181"
+
+    // $ANTLR start "T__182"
+    public final void mT__182() throws RecognitionException {
+        try {
+            int _type = T__182;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:180:8: ( 'exit' )
+            // InternalFormalML.g:180:10: 'exit'
+            {
+            match("exit"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__182"
+
+    // $ANTLR start "T__183"
+    public final void mT__183() throws RecognitionException {
+        try {
+            int _type = T__183;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:181:8: ( 'init' )
+            // InternalFormalML.g:181:10: 'init'
+            {
+            match("init"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__183"
+
+    // $ANTLR start "T__184"
+    public final void mT__184() throws RecognitionException {
+        try {
+            int _type = T__184;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:182:8: ( 'destroy' )
+            // InternalFormalML.g:182:10: 'destroy'
+            {
+            match("destroy"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__184"
+
+    // $ANTLR start "T__185"
+    public final void mT__185() throws RecognitionException {
+        try {
+            int _type = T__185;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:183:8: ( 'start' )
+            // InternalFormalML.g:183:10: 'start'
+            {
+            match("start"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__185"
+
+    // $ANTLR start "T__186"
+    public final void mT__186() throws RecognitionException {
+        try {
+            int _type = T__186;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:184:8: ( 'stop' )
+            // InternalFormalML.g:184:10: 'stop'
+            {
+            match("stop"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__186"
+
+    // $ANTLR start "T__187"
+    public final void mT__187() throws RecognitionException {
+        try {
+            int _type = T__187;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:185:8: ( 'restart' )
+            // InternalFormalML.g:185:10: 'restart'
+            {
+            match("restart"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__187"
+
+    // $ANTLR start "T__188"
+    public final void mT__188() throws RecognitionException {
+        try {
+            int _type = T__188;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:186:8: ( 'suspend' )
+            // InternalFormalML.g:186:10: 'suspend'
+            {
+            match("suspend"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__188"
+
+    // $ANTLR start "T__189"
+    public final void mT__189() throws RecognitionException {
+        try {
+            int _type = T__189;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:187:8: ( 'resume' )
+            // InternalFormalML.g:187:10: 'resume'
+            {
+            match("resume"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__189"
+
+    // $ANTLR start "T__190"
+    public final void mT__190() throws RecognitionException {
+        try {
+            int _type = T__190;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:188:8: ( 'wait' )
+            // InternalFormalML.g:188:10: 'wait'
+            {
+            match("wait"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__190"
+
+    // $ANTLR start "T__191"
+    public final void mT__191() throws RecognitionException {
+        try {
+            int _type = T__191;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:189:8: ( 'disable' )
+            // InternalFormalML.g:189:10: 'disable'
+            {
+            match("disable"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__191"
+
+    // $ANTLR start "T__192"
+    public final void mT__192() throws RecognitionException {
+        try {
+            int _type = T__192;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:190:8: ( 'enable' )
+            // InternalFormalML.g:190:10: 'enable'
+            {
+            match("enable"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__192"
+
+    // $ANTLR start "T__193"
+    public final void mT__193() throws RecognitionException {
+        try {
+            int _type = T__193;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:191:8: ( 'schedule' )
+            // InternalFormalML.g:191:10: 'schedule'
+            {
+            match("schedule"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__193"
+
+    // $ANTLR start "T__194"
+    public final void mT__194() throws RecognitionException {
+        try {
+            int _type = T__194;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:192:8: ( 'irun' )
+            // InternalFormalML.g:192:10: 'irun'
+            {
+            match("irun"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__194"
+
+    // $ANTLR start "T__195"
+    public final void mT__195() throws RecognitionException {
+        try {
+            int _type = T__195;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:193:8: ( 'run' )
+            // InternalFormalML.g:193:10: 'run'
+            {
+            match("run"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__195"
+
+    // $ANTLR start "T__196"
+    public final void mT__196() throws RecognitionException {
+        try {
+            int _type = T__196;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:194:8: ( 'rtc' )
+            // InternalFormalML.g:194:10: 'rtc'
+            {
+            match("rtc"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__196"
+
+    // $ANTLR start "T__197"
+    public final void mT__197() throws RecognitionException {
+        try {
+            int _type = T__197;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:195:8: ( '>:' )
+            // InternalFormalML.g:195:10: '>:'
+            {
+            match(">:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__197"
+
+    // $ANTLR start "T__198"
+    public final void mT__198() throws RecognitionException {
+        try {
+            int _type = T__198;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:196:8: ( ',' )
+            // InternalFormalML.g:196:10: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__198"
+
+    // $ANTLR start "T__199"
+    public final void mT__199() throws RecognitionException {
+        try {
+            int _type = T__199;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:197:8: ( '{' )
+            // InternalFormalML.g:197:10: '{'
+            {
+            match('{'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__199"
+
+    // $ANTLR start "T__200"
+    public final void mT__200() throws RecognitionException {
+        try {
+            int _type = T__200;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:198:8: ( '}' )
+            // InternalFormalML.g:198:10: '}'
+            {
+            match('}'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__200"
+
+    // $ANTLR start "T__201"
+    public final void mT__201() throws RecognitionException {
+        try {
+            int _type = T__201;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:199:8: ( 'moc:' )
+            // InternalFormalML.g:199:10: 'moc:'
+            {
+            match("moc:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__201"
+
+    // $ANTLR start "T__202"
+    public final void mT__202() throws RecognitionException {
+        try {
+            int _type = T__202;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:200:8: ( '@property:' )
+            // InternalFormalML.g:200:10: '@property:'
+            {
+            match("@property:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__202"
+
+    // $ANTLR start "T__203"
+    public final void mT__203() throws RecognitionException {
+        try {
+            int _type = T__203;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:201:8: ( '@public:' )
+            // InternalFormalML.g:201:10: '@public:'
+            {
+            match("@public:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__203"
+
+    // $ANTLR start "T__204"
+    public final void mT__204() throws RecognitionException {
+        try {
+            int _type = T__204;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:202:8: ( '@protected:' )
+            // InternalFormalML.g:202:10: '@protected:'
+            {
+            match("@protected:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__204"
+
+    // $ANTLR start "T__205"
+    public final void mT__205() throws RecognitionException {
+        try {
+            int _type = T__205;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:203:8: ( '@private:' )
+            // InternalFormalML.g:203:10: '@private:'
+            {
+            match("@private:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__205"
+
+    // $ANTLR start "T__206"
+    public final void mT__206() throws RecognitionException {
+        try {
+            int _type = T__206;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:204:8: ( '@procedure:' )
+            // InternalFormalML.g:204:10: '@procedure:'
+            {
+            match("@procedure:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__206"
+
+    // $ANTLR start "T__207"
+    public final void mT__207() throws RecognitionException {
+        try {
+            int _type = T__207;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:205:8: ( '@model:' )
+            // InternalFormalML.g:205:10: '@model:'
+            {
+            match("@model:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__207"
+
+    // $ANTLR start "T__208"
+    public final void mT__208() throws RecognitionException {
+        try {
+            int _type = T__208;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:206:8: ( '@prototype:' )
+            // InternalFormalML.g:206:10: '@prototype:'
+            {
+            match("@prototype:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__208"
+
+    // $ANTLR start "T__209"
+    public final void mT__209() throws RecognitionException {
+        try {
+            int _type = T__209;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:207:8: ( '@instance:' )
+            // InternalFormalML.g:207:10: '@instance:'
+            {
+            match("@instance:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__209"
+
+    // $ANTLR start "T__210"
+    public final void mT__210() throws RecognitionException {
+        try {
+            int _type = T__210;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:208:8: ( '@behavior:' )
+            // InternalFormalML.g:208:10: '@behavior:'
+            {
+            match("@behavior:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__210"
+
+    // $ANTLR start "T__211"
+    public final void mT__211() throws RecognitionException {
+        try {
+            int _type = T__211;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:209:8: ( 'instance' )
+            // InternalFormalML.g:209:10: 'instance'
+            {
+            match("instance"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__211"
+
+    // $ANTLR start "T__212"
+    public final void mT__212() throws RecognitionException {
+        try {
+            int _type = T__212;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:210:8: ( 'model:' )
+            // InternalFormalML.g:210:10: 'model:'
+            {
+            match("model:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__212"
+
+    // $ANTLR start "T__213"
+    public final void mT__213() throws RecognitionException {
+        try {
+            int _type = T__213;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:211:8: ( ')' )
+            // InternalFormalML.g:211:10: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__213"
+
+    // $ANTLR start "T__214"
+    public final void mT__214() throws RecognitionException {
+        try {
+            int _type = T__214;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:212:8: ( 'procedure' )
+            // InternalFormalML.g:212:10: 'procedure'
+            {
+            match("procedure"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__214"
+
+    // $ANTLR start "T__215"
+    public final void mT__215() throws RecognitionException {
+        try {
+            int _type = T__215;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:213:8: ( '-->' )
+            // InternalFormalML.g:213:10: '-->'
+            {
+            match("-->"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__215"
+
+    // $ANTLR start "T__216"
+    public final void mT__216() throws RecognitionException {
+        try {
+            int _type = T__216;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:214:8: ( '@parameter:' )
+            // InternalFormalML.g:214:10: '@parameter:'
+            {
+            match("@parameter:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__216"
+
+    // $ANTLR start "T__217"
+    public final void mT__217() throws RecognitionException {
+        try {
+            int _type = T__217;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:215:8: ( '@input:' )
+            // InternalFormalML.g:215:10: '@input:'
+            {
+            match("@input:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__217"
+
+    // $ANTLR start "T__218"
+    public final void mT__218() throws RecognitionException {
+        try {
+            int _type = T__218;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:216:8: ( '@inout:' )
+            // InternalFormalML.g:216:10: '@inout:'
+            {
+            match("@inout:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__218"
+
+    // $ANTLR start "T__219"
+    public final void mT__219() throws RecognitionException {
+        try {
+            int _type = T__219;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:217:8: ( '@output:' )
+            // InternalFormalML.g:217:10: '@output:'
+            {
+            match("@output:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__219"
+
+    // $ANTLR start "T__220"
+    public final void mT__220() throws RecognitionException {
+        try {
+            int _type = T__220;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:218:8: ( '@return:' )
+            // InternalFormalML.g:218:10: '@return:'
+            {
+            match("@return:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__220"
+
+    // $ANTLR start "T__221"
+    public final void mT__221() throws RecognitionException {
+        try {
+            int _type = T__221;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:219:8: ( '@moe:' )
+            // InternalFormalML.g:219:10: '@moe:'
+            {
+            match("@moe:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__221"
+
+    // $ANTLR start "T__222"
+    public final void mT__222() throws RecognitionException {
+        try {
+            int _type = T__222;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:220:8: ( '@local:' )
+            // InternalFormalML.g:220:10: '@local:'
+            {
+            match("@local:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__222"
+
+    // $ANTLR start "T__223"
+    public final void mT__223() throws RecognitionException {
+        try {
+            int _type = T__223;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:221:8: ( '@transition:' )
+            // InternalFormalML.g:221:10: '@transition:'
+            {
+            match("@transition:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__223"
+
+    // $ANTLR start "T__224"
+    public final void mT__224() throws RecognitionException {
+        try {
+            int _type = T__224;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:222:8: ( 'macro' )
+            // InternalFormalML.g:222:10: 'macro'
+            {
+            match("macro"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__224"
+
+    // $ANTLR start "T__225"
+    public final void mT__225() throws RecognitionException {
+        try {
+            int _type = T__225;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:223:8: ( 'routine' )
+            // InternalFormalML.g:223:10: 'routine'
+            {
+            match("routine"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__225"
+
+    // $ANTLR start "T__226"
+    public final void mT__226() throws RecognitionException {
+        try {
+            int _type = T__226;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:224:8: ( '@com:' )
+            // InternalFormalML.g:224:10: '@com:'
+            {
+            match("@com:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__226"
+
+    // $ANTLR start "T__227"
+    public final void mT__227() throws RecognitionException {
+        try {
+            int _type = T__227;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:225:8: ( 'route' )
+            // InternalFormalML.g:225:10: 'route'
+            {
+            match("route"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__227"
+
+    // $ANTLR start "T__228"
+    public final void mT__228() throws RecognitionException {
+        try {
+            int _type = T__228;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:226:8: ( 'connect' )
+            // InternalFormalML.g:226:10: 'connect'
+            {
+            match("connect"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__228"
+
+    // $ANTLR start "T__229"
+    public final void mT__229() throws RecognitionException {
+        try {
+            int _type = T__229;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:227:8: ( 'type' )
+            // InternalFormalML.g:227:10: 'type'
+            {
+            match("type"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__229"
+
+    // $ANTLR start "T__230"
+    public final void mT__230() throws RecognitionException {
+        try {
+            int _type = T__230;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:228:8: ( 'size:' )
+            // InternalFormalML.g:228:10: 'size:'
+            {
+            match("size:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__230"
+
+    // $ANTLR start "T__231"
+    public final void mT__231() throws RecognitionException {
+        try {
+            int _type = T__231;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:229:8: ( 'time' )
+            // InternalFormalML.g:229:10: 'time'
+            {
+            match("time"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__231"
+
+    // $ANTLR start "T__232"
+    public final void mT__232() throws RecognitionException {
+        try {
+            int _type = T__232;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:230:8: ( 'char' )
+            // InternalFormalML.g:230:10: 'char'
+            {
+            match("char"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__232"
+
+    // $ANTLR start "T__233"
+    public final void mT__233() throws RecognitionException {
+        try {
+            int _type = T__233;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:231:8: ( 'string' )
+            // InternalFormalML.g:231:10: 'string'
+            {
+            match("string"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__233"
+
+    // $ANTLR start "T__234"
+    public final void mT__234() throws RecognitionException {
+        try {
+            int _type = T__234;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:232:8: ( 'interval' )
+            // InternalFormalML.g:232:10: 'interval'
+            {
+            match("interval"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__234"
+
+    // $ANTLR start "T__235"
+    public final void mT__235() throws RecognitionException {
+        try {
+            int _type = T__235;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:233:8: ( 'enum' )
+            // InternalFormalML.g:233:10: 'enum'
+            {
+            match("enum"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__235"
+
+    // $ANTLR start "T__236"
+    public final void mT__236() throws RecognitionException {
+        try {
+            int _type = T__236;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:234:8: ( 'struct' )
+            // InternalFormalML.g:234:10: 'struct'
+            {
+            match("struct"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__236"
+
+    // $ANTLR start "T__237"
+    public final void mT__237() throws RecognitionException {
+        try {
+            int _type = T__237;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:235:8: ( 'union' )
+            // InternalFormalML.g:235:10: 'union'
+            {
+            match("union"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__237"
+
+    // $ANTLR start "T__238"
+    public final void mT__238() throws RecognitionException {
+        try {
+            int _type = T__238;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:236:8: ( '@on_write' )
+            // InternalFormalML.g:236:10: '@on_write'
+            {
+            match("@on_write"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__238"
+
+    // $ANTLR start "T__239"
+    public final void mT__239() throws RecognitionException {
+        try {
+            int _type = T__239;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:237:8: ( 'transition' )
+            // InternalFormalML.g:237:10: 'transition'
+            {
+            match("transition"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__239"
+
+    // $ANTLR start "T__240"
+    public final void mT__240() throws RecognitionException {
+        try {
+            int _type = T__240;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:238:8: ( '@effect:' )
+            // InternalFormalML.g:238:10: '@effect:'
+            {
+            match("@effect:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__240"
+
+    // $ANTLR start "T__241"
+    public final void mT__241() throws RecognitionException {
+        try {
+            int _type = T__241;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:239:8: ( '@trigger:' )
+            // InternalFormalML.g:239:10: '@trigger:'
+            {
+            match("@trigger:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__241"
+
+    // $ANTLR start "T__242"
+    public final void mT__242() throws RecognitionException {
+        try {
+            int _type = T__242;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:240:8: ( '&' )
+            // InternalFormalML.g:240:10: '&'
+            {
+            match('&'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__242"
+
+    // $ANTLR start "T__243"
+    public final void mT__243() throws RecognitionException {
+        try {
+            int _type = T__243;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:241:8: ( 'prior:' )
+            // InternalFormalML.g:241:10: 'prior:'
+            {
+            match("prior:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__243"
+
+    // $ANTLR start "T__244"
+    public final void mT__244() throws RecognitionException {
+        try {
+            int _type = T__244;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:242:8: ( '@guard<' )
+            // InternalFormalML.g:242:10: '@guard<'
+            {
+            match("@guard<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__244"
+
+    // $ANTLR start "T__245"
+    public final void mT__245() throws RecognitionException {
+        try {
+            int _type = T__245;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:243:8: ( '@tguard<' )
+            // InternalFormalML.g:243:10: '@tguard<'
+            {
+            match("@tguard<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__245"
+
+    // $ANTLR start "T__246"
+    public final void mT__246() throws RecognitionException {
+        try {
+            int _type = T__246;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:244:8: ( 'guard' )
+            // InternalFormalML.g:244:10: 'guard'
+            {
+            match("guard"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__246"
+
+    // $ANTLR start "T__247"
+    public final void mT__247() throws RecognitionException {
+        try {
+            int _type = T__247;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:245:8: ( 'tguard' )
+            // InternalFormalML.g:245:10: 'tguard'
+            {
+            match("tguard"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__247"
+
+    // $ANTLR start "T__248"
+    public final void mT__248() throws RecognitionException {
+        try {
+            int _type = T__248;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:246:8: ( 'event' )
+            // InternalFormalML.g:246:10: 'event'
+            {
+            match("event"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__248"
+
+    // $ANTLR start "T__249"
+    public final void mT__249() throws RecognitionException {
+        try {
+            int _type = T__249;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:247:8: ( 'checksat' )
+            // InternalFormalML.g:247:10: 'checksat'
+            {
+            match("checksat"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__249"
+
+    // $ANTLR start "T__250"
+    public final void mT__250() throws RecognitionException {
+        try {
+            int _type = T__250;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:248:8: ( '<--' )
+            // InternalFormalML.g:248:10: '<--'
+            {
+            match("<--"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__250"
+
+    // $ANTLR start "T__251"
+    public final void mT__251() throws RecognitionException {
+        try {
+            int _type = T__251;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:249:8: ( 'if' )
+            // InternalFormalML.g:249:10: 'if'
+            {
+            match("if"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__251"
+
+    // $ANTLR start "T__252"
+    public final void mT__252() throws RecognitionException {
+        try {
+            int _type = T__252;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:250:8: ( 'else' )
+            // InternalFormalML.g:250:10: 'else'
+            {
+            match("else"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__252"
+
+    // $ANTLR start "T__253"
+    public final void mT__253() throws RecognitionException {
+        try {
+            int _type = T__253;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:251:8: ( 'while' )
+            // InternalFormalML.g:251:10: 'while'
+            {
+            match("while"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__253"
+
+    // $ANTLR start "T__254"
+    public final void mT__254() throws RecognitionException {
+        try {
+            int _type = T__254;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:252:8: ( 'do' )
+            // InternalFormalML.g:252:10: 'do'
+            {
+            match("do"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__254"
+
+    // $ANTLR start "T__255"
+    public final void mT__255() throws RecognitionException {
+        try {
+            int _type = T__255;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:253:8: ( 'for' )
+            // InternalFormalML.g:253:10: 'for'
+            {
+            match("for"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__255"
+
+    // $ANTLR start "T__256"
+    public final void mT__256() throws RecognitionException {
+        try {
+            int _type = T__256;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:254:8: ( '|' )
+            // InternalFormalML.g:254:10: '|'
+            {
+            match('|'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__256"
+
+    // $ANTLR start "T__257"
+    public final void mT__257() throws RecognitionException {
+        try {
+            int _type = T__257;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:255:8: ( '^' )
+            // InternalFormalML.g:255:10: '^'
+            {
+            match('^'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__257"
+
+    // $ANTLR start "T__258"
+    public final void mT__258() throws RecognitionException {
+        try {
+            int _type = T__258;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:256:8: ( '**' )
+            // InternalFormalML.g:256:10: '**'
+            {
+            match("**"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__258"
+
+    // $ANTLR start "T__259"
+    public final void mT__259() throws RecognitionException {
+        try {
+            int _type = T__259;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:257:8: ( '/' )
+            // InternalFormalML.g:257:10: '/'
+            {
+            match('/'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__259"
+
+    // $ANTLR start "T__260"
+    public final void mT__260() throws RecognitionException {
+        try {
+            int _type = T__260;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:258:8: ( '%' )
+            // InternalFormalML.g:258:10: '%'
+            {
+            match('%'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__260"
+
+    // $ANTLR start "T__261"
+    public final void mT__261() throws RecognitionException {
+        try {
+            int _type = T__261;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:259:8: ( 'newfresh' )
+            // InternalFormalML.g:259:10: 'newfresh'
+            {
+            match("newfresh"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__261"
+
+    // $ANTLR start "T__262"
+    public final void mT__262() throws RecognitionException {
+        try {
+            int _type = T__262;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:260:8: ( '(:' )
+            // InternalFormalML.g:260:10: '(:'
+            {
+            match("(:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__262"
+
+    // $ANTLR start "T__263"
+    public final void mT__263() throws RecognitionException {
+        try {
+            int _type = T__263;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:261:8: ( 'ctor' )
+            // InternalFormalML.g:261:10: 'ctor'
+            {
+            match("ctor"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__263"
+
+    // $ANTLR start "T__264"
+    public final void mT__264() throws RecognitionException {
+        try {
+            int _type = T__264;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:262:8: ( 'new' )
+            // InternalFormalML.g:262:10: 'new'
+            {
+            match("new"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__264"
+
+    // $ANTLR start "T__265"
+    public final void mT__265() throws RecognitionException {
+        try {
+            int _type = T__265;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:263:8: ( '$time' )
+            // InternalFormalML.g:263:10: '$time'
+            {
+            match("$time"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__265"
+
+    // $ANTLR start "T__266"
+    public final void mT__266() throws RecognitionException {
+        try {
+            int _type = T__266;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:264:8: ( '$delta' )
+            // InternalFormalML.g:264:10: '$delta'
+            {
+            match("$delta"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__266"
+
+    // $ANTLR start "T__267"
+    public final void mT__267() throws RecognitionException {
+        try {
+            int _type = T__267;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:265:8: ( '$this' )
+            // InternalFormalML.g:265:10: '$this'
+            {
+            match("$this"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__267"
+
+    // $ANTLR start "T__268"
+    public final void mT__268() throws RecognitionException {
+        try {
+            int _type = T__268;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:266:8: ( '$self' )
+            // InternalFormalML.g:266:10: '$self'
+            {
+            match("$self"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__268"
+
+    // $ANTLR start "T__269"
+    public final void mT__269() throws RecognitionException {
+        try {
+            int _type = T__269;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:267:8: ( '$parent' )
+            // InternalFormalML.g:267:10: '$parent'
+            {
+            match("$parent"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__269"
+
+    // $ANTLR start "T__270"
+    public final void mT__270() throws RecognitionException {
+        try {
+            int _type = T__270;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:268:8: ( '$super' )
+            // InternalFormalML.g:268:10: '$super'
+            {
+            match("$super"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__270"
+
+    // $ANTLR start "T__271"
+    public final void mT__271() throws RecognitionException {
+        try {
+            int _type = T__271;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:269:8: ( '$system' )
+            // InternalFormalML.g:269:10: '$system'
+            {
+            match("$system"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__271"
+
+    // $ANTLR start "T__272"
+    public final void mT__272() throws RecognitionException {
+        try {
+            int _type = T__272;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:270:8: ( '@option' )
+            // InternalFormalML.g:270:10: '@option'
+            {
+            match("@option"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__272"
+
+    // $ANTLR start "T__273"
+    public final void mT__273() throws RecognitionException {
+        try {
+            int _type = T__273;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:271:8: ( 'timed' )
+            // InternalFormalML.g:271:10: 'timed'
+            {
+            match("timed"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__273"
+
+    // $ANTLR start "T__274"
+    public final void mT__274() throws RecognitionException {
+        try {
+            int _type = T__274;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:272:8: ( 'input_enabled' )
+            // InternalFormalML.g:272:10: 'input_enabled'
+            {
+            match("input_enabled"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__274"
+
+    // $ANTLR start "T__275"
+    public final void mT__275() throws RecognitionException {
+        try {
+            int _type = T__275;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:273:8: ( '#start' )
+            // InternalFormalML.g:273:10: '#start'
+            {
+            match("#start"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__275"
+
+    // $ANTLR start "T__276"
+    public final void mT__276() throws RecognitionException {
+        try {
+            int _type = T__276;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:274:8: ( '#final' )
+            // InternalFormalML.g:274:10: '#final'
+            {
+            match("#final"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__276"
+
+    // $ANTLR start "T__277"
+    public final void mT__277() throws RecognitionException {
+        try {
+            int _type = T__277;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:275:8: ( 'clock' )
+            // InternalFormalML.g:275:10: 'clock'
+            {
+            match("clock"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__277"
+
+    // $ANTLR start "T__278"
+    public final void mT__278() throws RecognitionException {
+        try {
+            int _type = T__278;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:276:8: ( 'static' )
+            // InternalFormalML.g:276:10: 'static'
+            {
+            match("static"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__278"
+
+    // $ANTLR start "T__279"
+    public final void mT__279() throws RecognitionException {
+        try {
+            int _type = T__279;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:277:8: ( 'reference' )
+            // InternalFormalML.g:277:10: 'reference'
+            {
+            match("reference"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__279"
+
+    // $ANTLR start "T__280"
+    public final void mT__280() throws RecognitionException {
+        try {
+            int _type = T__280;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:278:8: ( 'volatile' )
+            // InternalFormalML.g:278:10: 'volatile'
+            {
+            match("volatile"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__280"
+
+    // $ANTLR start "T__281"
+    public final void mT__281() throws RecognitionException {
+        try {
+            int _type = T__281;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:279:8: ( 'transient' )
+            // InternalFormalML.g:279:10: 'transient'
+            {
+            match("transient"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__281"
+
+    // $ANTLR start "T__282"
+    public final void mT__282() throws RecognitionException {
+        try {
+            int _type = T__282;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:280:8: ( 'val' )
+            // InternalFormalML.g:280:10: 'val'
+            {
+            match("val"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__282"
+
+    // $ANTLR start "T__283"
+    public final void mT__283() throws RecognitionException {
+        try {
+            int _type = T__283;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:281:8: ( 'const' )
+            // InternalFormalML.g:281:10: 'const'
+            {
+            match("const"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__283"
+
+    // $ANTLR start "T__284"
+    public final void mT__284() throws RecognitionException {
+        try {
+            int _type = T__284;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:282:8: ( 'exec' )
+            // InternalFormalML.g:282:10: 'exec'
+            {
+            match("exec"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__284"
+
+    // $ANTLR start "T__285"
+    public final void mT__285() throws RecognitionException {
+        try {
+            int _type = T__285;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:283:8: ( 'call' )
+            // InternalFormalML.g:283:10: 'call'
+            {
+            match("call"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__285"
+
+    // $ANTLR start "T__286"
+    public final void mT__286() throws RecognitionException {
+        try {
+            int _type = T__286;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:284:8: ( '?' )
+            // InternalFormalML.g:284:10: '?'
+            {
+            match('?'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__286"
+
+    // $ANTLR start "T__287"
+    public final void mT__287() throws RecognitionException {
+        try {
+            int _type = T__287;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:285:8: ( '~' )
+            // InternalFormalML.g:285:10: '~'
+            {
+            match('~'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__287"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75293:10: ( ( '0' .. '9' )+ )
+            // InternalFormalML.g:75293:12: ( '0' .. '9' )+
+            {
+            // InternalFormalML.g:75293:12: ( '0' .. '9' )+
+            int cnt1=0;
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( ((LA1_0>='0' && LA1_0<='9')) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // InternalFormalML.g:75293:13: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt1 >= 1 ) break loop1;
+                        EarlyExitException eee =
+                            new EarlyExitException(1, input);
+                        throw eee;
+                }
+                cnt1++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_CHARACTER"
+    public final void mRULE_CHARACTER() throws RecognitionException {
+        try {
+            int _type = RULE_CHARACTER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75295:16: ( '\\'' . '\\'' )
+            // InternalFormalML.g:75295:18: '\\'' . '\\''
+            {
+            match('\''); 
+            matchAny(); 
+            match('\''); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_CHARACTER"
+
+    // $ANTLR start "RULE_XLIA_ID"
+    public final void mRULE_XLIA_ID() throws RecognitionException {
+        try {
+            int _type = RULE_XLIA_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75297:14: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '#' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )* )
+            // InternalFormalML.g:75297:16: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '#' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )*
+            {
+            if ( input.LA(1)=='#'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalFormalML.g:75297:44: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0=='#'||(LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='Z')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='z')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // InternalFormalML.g:
+            	    {
+            	    if ( input.LA(1)=='#'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_XLIA_ID"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75299:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* )
+            // InternalFormalML.g:75299:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            {
+            // InternalFormalML.g:75299:11: ( '^' )?
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0=='^') ) {
+                alt3=1;
+            }
+            switch (alt3) {
+                case 1 :
+                    // InternalFormalML.g:75299:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalFormalML.g:75299:40: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            loop4:
+            do {
+                int alt4=2;
+                int LA4_0 = input.LA(1);
+
+                if ( ((LA4_0>='0' && LA4_0<='9')||(LA4_0>='A' && LA4_0<='Z')||LA4_0=='_'||(LA4_0>='a' && LA4_0<='z')) ) {
+                    alt4=1;
+                }
+
+
+                switch (alt4) {
+            	case 1 :
+            	    // InternalFormalML.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop4;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75301:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
+            // InternalFormalML.g:75301:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            {
+            // InternalFormalML.g:75301:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0=='\"') ) {
+                alt7=1;
+            }
+            else if ( (LA7_0=='\'') ) {
+                alt7=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalFormalML.g:75301:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+                    {
+                    match('\"'); 
+                    // InternalFormalML.g:75301:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop5:
+                    do {
+                        int alt5=3;
+                        int LA5_0 = input.LA(1);
+
+                        if ( (LA5_0=='\\') ) {
+                            alt5=1;
+                        }
+                        else if ( ((LA5_0>='\u0000' && LA5_0<='!')||(LA5_0>='#' && LA5_0<='[')||(LA5_0>=']' && LA5_0<='\uFFFF')) ) {
+                            alt5=2;
+                        }
+
+
+                        switch (alt5) {
+                    	case 1 :
+                    	    // InternalFormalML.g:75301:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:75301:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop5;
+                        }
+                    } while (true);
+
+                    match('\"'); 
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:75301:48: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+                    {
+                    match('\''); 
+                    // InternalFormalML.g:75301:53: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop6:
+                    do {
+                        int alt6=3;
+                        int LA6_0 = input.LA(1);
+
+                        if ( (LA6_0=='\\') ) {
+                            alt6=1;
+                        }
+                        else if ( ((LA6_0>='\u0000' && LA6_0<='&')||(LA6_0>='(' && LA6_0<='[')||(LA6_0>=']' && LA6_0<='\uFFFF')) ) {
+                            alt6=2;
+                        }
+
+
+                        switch (alt6) {
+                    	case 1 :
+                    	    // InternalFormalML.g:75301:54: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:75301:61: ~ ( ( '\\\\' | '\\'' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop6;
+                        }
+                    } while (true);
+
+                    match('\''); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_STRING"
+
+    // $ANTLR start "RULE_ML_COMMENT"
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75303:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalFormalML.g:75303:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // InternalFormalML.g:75303:24: ( options {greedy=false; } : . )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( (LA8_0=='*') ) {
+                    int LA8_1 = input.LA(2);
+
+                    if ( (LA8_1=='/') ) {
+                        alt8=2;
+                    }
+                    else if ( ((LA8_1>='\u0000' && LA8_1<='.')||(LA8_1>='0' && LA8_1<='\uFFFF')) ) {
+                        alt8=1;
+                    }
+
+
+                }
+                else if ( ((LA8_0>='\u0000' && LA8_0<=')')||(LA8_0>='+' && LA8_0<='\uFFFF')) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // InternalFormalML.g:75303:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ML_COMMENT"
+
+    // $ANTLR start "RULE_SL_COMMENT"
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75305:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalFormalML.g:75305:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // InternalFormalML.g:75305:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop9:
+            do {
+                int alt9=2;
+                int LA9_0 = input.LA(1);
+
+                if ( ((LA9_0>='\u0000' && LA9_0<='\t')||(LA9_0>='\u000B' && LA9_0<='\f')||(LA9_0>='\u000E' && LA9_0<='\uFFFF')) ) {
+                    alt9=1;
+                }
+
+
+                switch (alt9) {
+            	case 1 :
+            	    // InternalFormalML.g:75305:24: ~ ( ( '\\n' | '\\r' ) )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop9;
+                }
+            } while (true);
+
+            // InternalFormalML.g:75305:40: ( ( '\\r' )? '\\n' )?
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0=='\n'||LA11_0=='\r') ) {
+                alt11=1;
+            }
+            switch (alt11) {
+                case 1 :
+                    // InternalFormalML.g:75305:41: ( '\\r' )? '\\n'
+                    {
+                    // InternalFormalML.g:75305:41: ( '\\r' )?
+                    int alt10=2;
+                    int LA10_0 = input.LA(1);
+
+                    if ( (LA10_0=='\r') ) {
+                        alt10=1;
+                    }
+                    switch (alt10) {
+                        case 1 :
+                            // InternalFormalML.g:75305:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_SL_COMMENT"
+
+    // $ANTLR start "RULE_WS"
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75307:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalFormalML.g:75307:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // InternalFormalML.g:75307:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt12=0;
+            loop12:
+            do {
+                int alt12=2;
+                int LA12_0 = input.LA(1);
+
+                if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {
+                    alt12=1;
+                }
+
+
+                switch (alt12) {
+            	case 1 :
+            	    // InternalFormalML.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt12 >= 1 ) break loop12;
+                        EarlyExitException eee =
+                            new EarlyExitException(12, input);
+                        throw eee;
+                }
+                cnt12++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_WS"
+
+    // $ANTLR start "RULE_ANY_OTHER"
+    public final void mRULE_ANY_OTHER() throws RecognitionException {
+        try {
+            int _type = RULE_ANY_OTHER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75309:16: ( . )
+            // InternalFormalML.g:75309:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // InternalFormalML.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | T__237 | T__238 | T__239 | T__240 | T__241 | T__242 | T__243 | T__244 | T__245 | T__246 | T__247 | T__248 | T__249 | T__250 | T__251 | T__252 | T__253 | T__254 | T__255 | T__256 | T__257 | T__258 | T__259 | T__260 | T__261 | T__262 | T__263 | T__264 | T__265 | T__266 | T__267 | T__268 | T__269 | T__270 | T__271 | T__272 | T__273 | T__274 | T__275 | T__276 | T__277 | T__278 | T__279 | T__280 | T__281 | T__282 | T__283 | T__284 | T__285 | T__286 | T__287 | RULE_INT | RULE_CHARACTER | RULE_XLIA_ID | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt13=284;
+        alt13 = dfa13.predict(input);
+        switch (alt13) {
+            case 1 :
+                // InternalFormalML.g:1:10: T__13
+                {
+                mT__13(); 
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:1:16: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 3 :
+                // InternalFormalML.g:1:22: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 4 :
+                // InternalFormalML.g:1:28: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 5 :
+                // InternalFormalML.g:1:34: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 6 :
+                // InternalFormalML.g:1:40: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 7 :
+                // InternalFormalML.g:1:46: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 8 :
+                // InternalFormalML.g:1:52: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 9 :
+                // InternalFormalML.g:1:58: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 10 :
+                // InternalFormalML.g:1:64: T__22
+                {
+                mT__22(); 
+
+                }
+                break;
+            case 11 :
+                // InternalFormalML.g:1:70: T__23
+                {
+                mT__23(); 
+
+                }
+                break;
+            case 12 :
+                // InternalFormalML.g:1:76: T__24
+                {
+                mT__24(); 
+
+                }
+                break;
+            case 13 :
+                // InternalFormalML.g:1:82: T__25
+                {
+                mT__25(); 
+
+                }
+                break;
+            case 14 :
+                // InternalFormalML.g:1:88: T__26
+                {
+                mT__26(); 
+
+                }
+                break;
+            case 15 :
+                // InternalFormalML.g:1:94: T__27
+                {
+                mT__27(); 
+
+                }
+                break;
+            case 16 :
+                // InternalFormalML.g:1:100: T__28
+                {
+                mT__28(); 
+
+                }
+                break;
+            case 17 :
+                // InternalFormalML.g:1:106: T__29
+                {
+                mT__29(); 
+
+                }
+                break;
+            case 18 :
+                // InternalFormalML.g:1:112: T__30
+                {
+                mT__30(); 
+
+                }
+                break;
+            case 19 :
+                // InternalFormalML.g:1:118: T__31
+                {
+                mT__31(); 
+
+                }
+                break;
+            case 20 :
+                // InternalFormalML.g:1:124: T__32
+                {
+                mT__32(); 
+
+                }
+                break;
+            case 21 :
+                // InternalFormalML.g:1:130: T__33
+                {
+                mT__33(); 
+
+                }
+                break;
+            case 22 :
+                // InternalFormalML.g:1:136: T__34
+                {
+                mT__34(); 
+
+                }
+                break;
+            case 23 :
+                // InternalFormalML.g:1:142: T__35
+                {
+                mT__35(); 
+
+                }
+                break;
+            case 24 :
+                // InternalFormalML.g:1:148: T__36
+                {
+                mT__36(); 
+
+                }
+                break;
+            case 25 :
+                // InternalFormalML.g:1:154: T__37
+                {
+                mT__37(); 
+
+                }
+                break;
+            case 26 :
+                // InternalFormalML.g:1:160: T__38
+                {
+                mT__38(); 
+
+                }
+                break;
+            case 27 :
+                // InternalFormalML.g:1:166: T__39
+                {
+                mT__39(); 
+
+                }
+                break;
+            case 28 :
+                // InternalFormalML.g:1:172: T__40
+                {
+                mT__40(); 
+
+                }
+                break;
+            case 29 :
+                // InternalFormalML.g:1:178: T__41
+                {
+                mT__41(); 
+
+                }
+                break;
+            case 30 :
+                // InternalFormalML.g:1:184: T__42
+                {
+                mT__42(); 
+
+                }
+                break;
+            case 31 :
+                // InternalFormalML.g:1:190: T__43
+                {
+                mT__43(); 
+
+                }
+                break;
+            case 32 :
+                // InternalFormalML.g:1:196: T__44
+                {
+                mT__44(); 
+
+                }
+                break;
+            case 33 :
+                // InternalFormalML.g:1:202: T__45
+                {
+                mT__45(); 
+
+                }
+                break;
+            case 34 :
+                // InternalFormalML.g:1:208: T__46
+                {
+                mT__46(); 
+
+                }
+                break;
+            case 35 :
+                // InternalFormalML.g:1:214: T__47
+                {
+                mT__47(); 
+
+                }
+                break;
+            case 36 :
+                // InternalFormalML.g:1:220: T__48
+                {
+                mT__48(); 
+
+                }
+                break;
+            case 37 :
+                // InternalFormalML.g:1:226: T__49
+                {
+                mT__49(); 
+
+                }
+                break;
+            case 38 :
+                // InternalFormalML.g:1:232: T__50
+                {
+                mT__50(); 
+
+                }
+                break;
+            case 39 :
+                // InternalFormalML.g:1:238: T__51
+                {
+                mT__51(); 
+
+                }
+                break;
+            case 40 :
+                // InternalFormalML.g:1:244: T__52
+                {
+                mT__52(); 
+
+                }
+                break;
+            case 41 :
+                // InternalFormalML.g:1:250: T__53
+                {
+                mT__53(); 
+
+                }
+                break;
+            case 42 :
+                // InternalFormalML.g:1:256: T__54
+                {
+                mT__54(); 
+
+                }
+                break;
+            case 43 :
+                // InternalFormalML.g:1:262: T__55
+                {
+                mT__55(); 
+
+                }
+                break;
+            case 44 :
+                // InternalFormalML.g:1:268: T__56
+                {
+                mT__56(); 
+
+                }
+                break;
+            case 45 :
+                // InternalFormalML.g:1:274: T__57
+                {
+                mT__57(); 
+
+                }
+                break;
+            case 46 :
+                // InternalFormalML.g:1:280: T__58
+                {
+                mT__58(); 
+
+                }
+                break;
+            case 47 :
+                // InternalFormalML.g:1:286: T__59
+                {
+                mT__59(); 
+
+                }
+                break;
+            case 48 :
+                // InternalFormalML.g:1:292: T__60
+                {
+                mT__60(); 
+
+                }
+                break;
+            case 49 :
+                // InternalFormalML.g:1:298: T__61
+                {
+                mT__61(); 
+
+                }
+                break;
+            case 50 :
+                // InternalFormalML.g:1:304: T__62
+                {
+                mT__62(); 
+
+                }
+                break;
+            case 51 :
+                // InternalFormalML.g:1:310: T__63
+                {
+                mT__63(); 
+
+                }
+                break;
+            case 52 :
+                // InternalFormalML.g:1:316: T__64
+                {
+                mT__64(); 
+
+                }
+                break;
+            case 53 :
+                // InternalFormalML.g:1:322: T__65
+                {
+                mT__65(); 
+
+                }
+                break;
+            case 54 :
+                // InternalFormalML.g:1:328: T__66
+                {
+                mT__66(); 
+
+                }
+                break;
+            case 55 :
+                // InternalFormalML.g:1:334: T__67
+                {
+                mT__67(); 
+
+                }
+                break;
+            case 56 :
+                // InternalFormalML.g:1:340: T__68
+                {
+                mT__68(); 
+
+                }
+                break;
+            case 57 :
+                // InternalFormalML.g:1:346: T__69
+                {
+                mT__69(); 
+
+                }
+                break;
+            case 58 :
+                // InternalFormalML.g:1:352: T__70
+                {
+                mT__70(); 
+
+                }
+                break;
+            case 59 :
+                // InternalFormalML.g:1:358: T__71
+                {
+                mT__71(); 
+
+                }
+                break;
+            case 60 :
+                // InternalFormalML.g:1:364: T__72
+                {
+                mT__72(); 
+
+                }
+                break;
+            case 61 :
+                // InternalFormalML.g:1:370: T__73
+                {
+                mT__73(); 
+
+                }
+                break;
+            case 62 :
+                // InternalFormalML.g:1:376: T__74
+                {
+                mT__74(); 
+
+                }
+                break;
+            case 63 :
+                // InternalFormalML.g:1:382: T__75
+                {
+                mT__75(); 
+
+                }
+                break;
+            case 64 :
+                // InternalFormalML.g:1:388: T__76
+                {
+                mT__76(); 
+
+                }
+                break;
+            case 65 :
+                // InternalFormalML.g:1:394: T__77
+                {
+                mT__77(); 
+
+                }
+                break;
+            case 66 :
+                // InternalFormalML.g:1:400: T__78
+                {
+                mT__78(); 
+
+                }
+                break;
+            case 67 :
+                // InternalFormalML.g:1:406: T__79
+                {
+                mT__79(); 
+
+                }
+                break;
+            case 68 :
+                // InternalFormalML.g:1:412: T__80
+                {
+                mT__80(); 
+
+                }
+                break;
+            case 69 :
+                // InternalFormalML.g:1:418: T__81
+                {
+                mT__81(); 
+
+                }
+                break;
+            case 70 :
+                // InternalFormalML.g:1:424: T__82
+                {
+                mT__82(); 
+
+                }
+                break;
+            case 71 :
+                // InternalFormalML.g:1:430: T__83
+                {
+                mT__83(); 
+
+                }
+                break;
+            case 72 :
+                // InternalFormalML.g:1:436: T__84
+                {
+                mT__84(); 
+
+                }
+                break;
+            case 73 :
+                // InternalFormalML.g:1:442: T__85
+                {
+                mT__85(); 
+
+                }
+                break;
+            case 74 :
+                // InternalFormalML.g:1:448: T__86
+                {
+                mT__86(); 
+
+                }
+                break;
+            case 75 :
+                // InternalFormalML.g:1:454: T__87
+                {
+                mT__87(); 
+
+                }
+                break;
+            case 76 :
+                // InternalFormalML.g:1:460: T__88
+                {
+                mT__88(); 
+
+                }
+                break;
+            case 77 :
+                // InternalFormalML.g:1:466: T__89
+                {
+                mT__89(); 
+
+                }
+                break;
+            case 78 :
+                // InternalFormalML.g:1:472: T__90
+                {
+                mT__90(); 
+
+                }
+                break;
+            case 79 :
+                // InternalFormalML.g:1:478: T__91
+                {
+                mT__91(); 
+
+                }
+                break;
+            case 80 :
+                // InternalFormalML.g:1:484: T__92
+                {
+                mT__92(); 
+
+                }
+                break;
+            case 81 :
+                // InternalFormalML.g:1:490: T__93
+                {
+                mT__93(); 
+
+                }
+                break;
+            case 82 :
+                // InternalFormalML.g:1:496: T__94
+                {
+                mT__94(); 
+
+                }
+                break;
+            case 83 :
+                // InternalFormalML.g:1:502: T__95
+                {
+                mT__95(); 
+
+                }
+                break;
+            case 84 :
+                // InternalFormalML.g:1:508: T__96
+                {
+                mT__96(); 
+
+                }
+                break;
+            case 85 :
+                // InternalFormalML.g:1:514: T__97
+                {
+                mT__97(); 
+
+                }
+                break;
+            case 86 :
+                // InternalFormalML.g:1:520: T__98
+                {
+                mT__98(); 
+
+                }
+                break;
+            case 87 :
+                // InternalFormalML.g:1:526: T__99
+                {
+                mT__99(); 
+
+                }
+                break;
+            case 88 :
+                // InternalFormalML.g:1:532: T__100
+                {
+                mT__100(); 
+
+                }
+                break;
+            case 89 :
+                // InternalFormalML.g:1:539: T__101
+                {
+                mT__101(); 
+
+                }
+                break;
+            case 90 :
+                // InternalFormalML.g:1:546: T__102
+                {
+                mT__102(); 
+
+                }
+                break;
+            case 91 :
+                // InternalFormalML.g:1:553: T__103
+                {
+                mT__103(); 
+
+                }
+                break;
+            case 92 :
+                // InternalFormalML.g:1:560: T__104
+                {
+                mT__104(); 
+
+                }
+                break;
+            case 93 :
+                // InternalFormalML.g:1:567: T__105
+                {
+                mT__105(); 
+
+                }
+                break;
+            case 94 :
+                // InternalFormalML.g:1:574: T__106
+                {
+                mT__106(); 
+
+                }
+                break;
+            case 95 :
+                // InternalFormalML.g:1:581: T__107
+                {
+                mT__107(); 
+
+                }
+                break;
+            case 96 :
+                // InternalFormalML.g:1:588: T__108
+                {
+                mT__108(); 
+
+                }
+                break;
+            case 97 :
+                // InternalFormalML.g:1:595: T__109
+                {
+                mT__109(); 
+
+                }
+                break;
+            case 98 :
+                // InternalFormalML.g:1:602: T__110
+                {
+                mT__110(); 
+
+                }
+                break;
+            case 99 :
+                // InternalFormalML.g:1:609: T__111
+                {
+                mT__111(); 
+
+                }
+                break;
+            case 100 :
+                // InternalFormalML.g:1:616: T__112
+                {
+                mT__112(); 
+
+                }
+                break;
+            case 101 :
+                // InternalFormalML.g:1:623: T__113
+                {
+                mT__113(); 
+
+                }
+                break;
+            case 102 :
+                // InternalFormalML.g:1:630: T__114
+                {
+                mT__114(); 
+
+                }
+                break;
+            case 103 :
+                // InternalFormalML.g:1:637: T__115
+                {
+                mT__115(); 
+
+                }
+                break;
+            case 104 :
+                // InternalFormalML.g:1:644: T__116
+                {
+                mT__116(); 
+
+                }
+                break;
+            case 105 :
+                // InternalFormalML.g:1:651: T__117
+                {
+                mT__117(); 
+
+                }
+                break;
+            case 106 :
+                // InternalFormalML.g:1:658: T__118
+                {
+                mT__118(); 
+
+                }
+                break;
+            case 107 :
+                // InternalFormalML.g:1:665: T__119
+                {
+                mT__119(); 
+
+                }
+                break;
+            case 108 :
+                // InternalFormalML.g:1:672: T__120
+                {
+                mT__120(); 
+
+                }
+                break;
+            case 109 :
+                // InternalFormalML.g:1:679: T__121
+                {
+                mT__121(); 
+
+                }
+                break;
+            case 110 :
+                // InternalFormalML.g:1:686: T__122
+                {
+                mT__122(); 
+
+                }
+                break;
+            case 111 :
+                // InternalFormalML.g:1:693: T__123
+                {
+                mT__123(); 
+
+                }
+                break;
+            case 112 :
+                // InternalFormalML.g:1:700: T__124
+                {
+                mT__124(); 
+
+                }
+                break;
+            case 113 :
+                // InternalFormalML.g:1:707: T__125
+                {
+                mT__125(); 
+
+                }
+                break;
+            case 114 :
+                // InternalFormalML.g:1:714: T__126
+                {
+                mT__126(); 
+
+                }
+                break;
+            case 115 :
+                // InternalFormalML.g:1:721: T__127
+                {
+                mT__127(); 
+
+                }
+                break;
+            case 116 :
+                // InternalFormalML.g:1:728: T__128
+                {
+                mT__128(); 
+
+                }
+                break;
+            case 117 :
+                // InternalFormalML.g:1:735: T__129
+                {
+                mT__129(); 
+
+                }
+                break;
+            case 118 :
+                // InternalFormalML.g:1:742: T__130
+                {
+                mT__130(); 
+
+                }
+                break;
+            case 119 :
+                // InternalFormalML.g:1:749: T__131
+                {
+                mT__131(); 
+
+                }
+                break;
+            case 120 :
+                // InternalFormalML.g:1:756: T__132
+                {
+                mT__132(); 
+
+                }
+                break;
+            case 121 :
+                // InternalFormalML.g:1:763: T__133
+                {
+                mT__133(); 
+
+                }
+                break;
+            case 122 :
+                // InternalFormalML.g:1:770: T__134
+                {
+                mT__134(); 
+
+                }
+                break;
+            case 123 :
+                // InternalFormalML.g:1:777: T__135
+                {
+                mT__135(); 
+
+                }
+                break;
+            case 124 :
+                // InternalFormalML.g:1:784: T__136
+                {
+                mT__136(); 
+
+                }
+                break;
+            case 125 :
+                // InternalFormalML.g:1:791: T__137
+                {
+                mT__137(); 
+
+                }
+                break;
+            case 126 :
+                // InternalFormalML.g:1:798: T__138
+                {
+                mT__138(); 
+
+                }
+                break;
+            case 127 :
+                // InternalFormalML.g:1:805: T__139
+                {
+                mT__139(); 
+
+                }
+                break;
+            case 128 :
+                // InternalFormalML.g:1:812: T__140
+                {
+                mT__140(); 
+
+                }
+                break;
+            case 129 :
+                // InternalFormalML.g:1:819: T__141
+                {
+                mT__141(); 
+
+                }
+                break;
+            case 130 :
+                // InternalFormalML.g:1:826: T__142
+                {
+                mT__142(); 
+
+                }
+                break;
+            case 131 :
+                // InternalFormalML.g:1:833: T__143
+                {
+                mT__143(); 
+
+                }
+                break;
+            case 132 :
+                // InternalFormalML.g:1:840: T__144
+                {
+                mT__144(); 
+
+                }
+                break;
+            case 133 :
+                // InternalFormalML.g:1:847: T__145
+                {
+                mT__145(); 
+
+                }
+                break;
+            case 134 :
+                // InternalFormalML.g:1:854: T__146
+                {
+                mT__146(); 
+
+                }
+                break;
+            case 135 :
+                // InternalFormalML.g:1:861: T__147
+                {
+                mT__147(); 
+
+                }
+                break;
+            case 136 :
+                // InternalFormalML.g:1:868: T__148
+                {
+                mT__148(); 
+
+                }
+                break;
+            case 137 :
+                // InternalFormalML.g:1:875: T__149
+                {
+                mT__149(); 
+
+                }
+                break;
+            case 138 :
+                // InternalFormalML.g:1:882: T__150
+                {
+                mT__150(); 
+
+                }
+                break;
+            case 139 :
+                // InternalFormalML.g:1:889: T__151
+                {
+                mT__151(); 
+
+                }
+                break;
+            case 140 :
+                // InternalFormalML.g:1:896: T__152
+                {
+                mT__152(); 
+
+                }
+                break;
+            case 141 :
+                // InternalFormalML.g:1:903: T__153
+                {
+                mT__153(); 
+
+                }
+                break;
+            case 142 :
+                // InternalFormalML.g:1:910: T__154
+                {
+                mT__154(); 
+
+                }
+                break;
+            case 143 :
+                // InternalFormalML.g:1:917: T__155
+                {
+                mT__155(); 
+
+                }
+                break;
+            case 144 :
+                // InternalFormalML.g:1:924: T__156
+                {
+                mT__156(); 
+
+                }
+                break;
+            case 145 :
+                // InternalFormalML.g:1:931: T__157
+                {
+                mT__157(); 
+
+                }
+                break;
+            case 146 :
+                // InternalFormalML.g:1:938: T__158
+                {
+                mT__158(); 
+
+                }
+                break;
+            case 147 :
+                // InternalFormalML.g:1:945: T__159
+                {
+                mT__159(); 
+
+                }
+                break;
+            case 148 :
+                // InternalFormalML.g:1:952: T__160
+                {
+                mT__160(); 
+
+                }
+                break;
+            case 149 :
+                // InternalFormalML.g:1:959: T__161
+                {
+                mT__161(); 
+
+                }
+                break;
+            case 150 :
+                // InternalFormalML.g:1:966: T__162
+                {
+                mT__162(); 
+
+                }
+                break;
+            case 151 :
+                // InternalFormalML.g:1:973: T__163
+                {
+                mT__163(); 
+
+                }
+                break;
+            case 152 :
+                // InternalFormalML.g:1:980: T__164
+                {
+                mT__164(); 
+
+                }
+                break;
+            case 153 :
+                // InternalFormalML.g:1:987: T__165
+                {
+                mT__165(); 
+
+                }
+                break;
+            case 154 :
+                // InternalFormalML.g:1:994: T__166
+                {
+                mT__166(); 
+
+                }
+                break;
+            case 155 :
+                // InternalFormalML.g:1:1001: T__167
+                {
+                mT__167(); 
+
+                }
+                break;
+            case 156 :
+                // InternalFormalML.g:1:1008: T__168
+                {
+                mT__168(); 
+
+                }
+                break;
+            case 157 :
+                // InternalFormalML.g:1:1015: T__169
+                {
+                mT__169(); 
+
+                }
+                break;
+            case 158 :
+                // InternalFormalML.g:1:1022: T__170
+                {
+                mT__170(); 
+
+                }
+                break;
+            case 159 :
+                // InternalFormalML.g:1:1029: T__171
+                {
+                mT__171(); 
+
+                }
+                break;
+            case 160 :
+                // InternalFormalML.g:1:1036: T__172
+                {
+                mT__172(); 
+
+                }
+                break;
+            case 161 :
+                // InternalFormalML.g:1:1043: T__173
+                {
+                mT__173(); 
+
+                }
+                break;
+            case 162 :
+                // InternalFormalML.g:1:1050: T__174
+                {
+                mT__174(); 
+
+                }
+                break;
+            case 163 :
+                // InternalFormalML.g:1:1057: T__175
+                {
+                mT__175(); 
+
+                }
+                break;
+            case 164 :
+                // InternalFormalML.g:1:1064: T__176
+                {
+                mT__176(); 
+
+                }
+                break;
+            case 165 :
+                // InternalFormalML.g:1:1071: T__177
+                {
+                mT__177(); 
+
+                }
+                break;
+            case 166 :
+                // InternalFormalML.g:1:1078: T__178
+                {
+                mT__178(); 
+
+                }
+                break;
+            case 167 :
+                // InternalFormalML.g:1:1085: T__179
+                {
+                mT__179(); 
+
+                }
+                break;
+            case 168 :
+                // InternalFormalML.g:1:1092: T__180
+                {
+                mT__180(); 
+
+                }
+                break;
+            case 169 :
+                // InternalFormalML.g:1:1099: T__181
+                {
+                mT__181(); 
+
+                }
+                break;
+            case 170 :
+                // InternalFormalML.g:1:1106: T__182
+                {
+                mT__182(); 
+
+                }
+                break;
+            case 171 :
+                // InternalFormalML.g:1:1113: T__183
+                {
+                mT__183(); 
+
+                }
+                break;
+            case 172 :
+                // InternalFormalML.g:1:1120: T__184
+                {
+                mT__184(); 
+
+                }
+                break;
+            case 173 :
+                // InternalFormalML.g:1:1127: T__185
+                {
+                mT__185(); 
+
+                }
+                break;
+            case 174 :
+                // InternalFormalML.g:1:1134: T__186
+                {
+                mT__186(); 
+
+                }
+                break;
+            case 175 :
+                // InternalFormalML.g:1:1141: T__187
+                {
+                mT__187(); 
+
+                }
+                break;
+            case 176 :
+                // InternalFormalML.g:1:1148: T__188
+                {
+                mT__188(); 
+
+                }
+                break;
+            case 177 :
+                // InternalFormalML.g:1:1155: T__189
+                {
+                mT__189(); 
+
+                }
+                break;
+            case 178 :
+                // InternalFormalML.g:1:1162: T__190
+                {
+                mT__190(); 
+
+                }
+                break;
+            case 179 :
+                // InternalFormalML.g:1:1169: T__191
+                {
+                mT__191(); 
+
+                }
+                break;
+            case 180 :
+                // InternalFormalML.g:1:1176: T__192
+                {
+                mT__192(); 
+
+                }
+                break;
+            case 181 :
+                // InternalFormalML.g:1:1183: T__193
+                {
+                mT__193(); 
+
+                }
+                break;
+            case 182 :
+                // InternalFormalML.g:1:1190: T__194
+                {
+                mT__194(); 
+
+                }
+                break;
+            case 183 :
+                // InternalFormalML.g:1:1197: T__195
+                {
+                mT__195(); 
+
+                }
+                break;
+            case 184 :
+                // InternalFormalML.g:1:1204: T__196
+                {
+                mT__196(); 
+
+                }
+                break;
+            case 185 :
+                // InternalFormalML.g:1:1211: T__197
+                {
+                mT__197(); 
+
+                }
+                break;
+            case 186 :
+                // InternalFormalML.g:1:1218: T__198
+                {
+                mT__198(); 
+
+                }
+                break;
+            case 187 :
+                // InternalFormalML.g:1:1225: T__199
+                {
+                mT__199(); 
+
+                }
+                break;
+            case 188 :
+                // InternalFormalML.g:1:1232: T__200
+                {
+                mT__200(); 
+
+                }
+                break;
+            case 189 :
+                // InternalFormalML.g:1:1239: T__201
+                {
+                mT__201(); 
+
+                }
+                break;
+            case 190 :
+                // InternalFormalML.g:1:1246: T__202
+                {
+                mT__202(); 
+
+                }
+                break;
+            case 191 :
+                // InternalFormalML.g:1:1253: T__203
+                {
+                mT__203(); 
+
+                }
+                break;
+            case 192 :
+                // InternalFormalML.g:1:1260: T__204
+                {
+                mT__204(); 
+
+                }
+                break;
+            case 193 :
+                // InternalFormalML.g:1:1267: T__205
+                {
+                mT__205(); 
+
+                }
+                break;
+            case 194 :
+                // InternalFormalML.g:1:1274: T__206
+                {
+                mT__206(); 
+
+                }
+                break;
+            case 195 :
+                // InternalFormalML.g:1:1281: T__207
+                {
+                mT__207(); 
+
+                }
+                break;
+            case 196 :
+                // InternalFormalML.g:1:1288: T__208
+                {
+                mT__208(); 
+
+                }
+                break;
+            case 197 :
+                // InternalFormalML.g:1:1295: T__209
+                {
+                mT__209(); 
+
+                }
+                break;
+            case 198 :
+                // InternalFormalML.g:1:1302: T__210
+                {
+                mT__210(); 
+
+                }
+                break;
+            case 199 :
+                // InternalFormalML.g:1:1309: T__211
+                {
+                mT__211(); 
+
+                }
+                break;
+            case 200 :
+                // InternalFormalML.g:1:1316: T__212
+                {
+                mT__212(); 
+
+                }
+                break;
+            case 201 :
+                // InternalFormalML.g:1:1323: T__213
+                {
+                mT__213(); 
+
+                }
+                break;
+            case 202 :
+                // InternalFormalML.g:1:1330: T__214
+                {
+                mT__214(); 
+
+                }
+                break;
+            case 203 :
+                // InternalFormalML.g:1:1337: T__215
+                {
+                mT__215(); 
+
+                }
+                break;
+            case 204 :
+                // InternalFormalML.g:1:1344: T__216
+                {
+                mT__216(); 
+
+                }
+                break;
+            case 205 :
+                // InternalFormalML.g:1:1351: T__217
+                {
+                mT__217(); 
+
+                }
+                break;
+            case 206 :
+                // InternalFormalML.g:1:1358: T__218
+                {
+                mT__218(); 
+
+                }
+                break;
+            case 207 :
+                // InternalFormalML.g:1:1365: T__219
+                {
+                mT__219(); 
+
+                }
+                break;
+            case 208 :
+                // InternalFormalML.g:1:1372: T__220
+                {
+                mT__220(); 
+
+                }
+                break;
+            case 209 :
+                // InternalFormalML.g:1:1379: T__221
+                {
+                mT__221(); 
+
+                }
+                break;
+            case 210 :
+                // InternalFormalML.g:1:1386: T__222
+                {
+                mT__222(); 
+
+                }
+                break;
+            case 211 :
+                // InternalFormalML.g:1:1393: T__223
+                {
+                mT__223(); 
+
+                }
+                break;
+            case 212 :
+                // InternalFormalML.g:1:1400: T__224
+                {
+                mT__224(); 
+
+                }
+                break;
+            case 213 :
+                // InternalFormalML.g:1:1407: T__225
+                {
+                mT__225(); 
+
+                }
+                break;
+            case 214 :
+                // InternalFormalML.g:1:1414: T__226
+                {
+                mT__226(); 
+
+                }
+                break;
+            case 215 :
+                // InternalFormalML.g:1:1421: T__227
+                {
+                mT__227(); 
+
+                }
+                break;
+            case 216 :
+                // InternalFormalML.g:1:1428: T__228
+                {
+                mT__228(); 
+
+                }
+                break;
+            case 217 :
+                // InternalFormalML.g:1:1435: T__229
+                {
+                mT__229(); 
+
+                }
+                break;
+            case 218 :
+                // InternalFormalML.g:1:1442: T__230
+                {
+                mT__230(); 
+
+                }
+                break;
+            case 219 :
+                // InternalFormalML.g:1:1449: T__231
+                {
+                mT__231(); 
+
+                }
+                break;
+            case 220 :
+                // InternalFormalML.g:1:1456: T__232
+                {
+                mT__232(); 
+
+                }
+                break;
+            case 221 :
+                // InternalFormalML.g:1:1463: T__233
+                {
+                mT__233(); 
+
+                }
+                break;
+            case 222 :
+                // InternalFormalML.g:1:1470: T__234
+                {
+                mT__234(); 
+
+                }
+                break;
+            case 223 :
+                // InternalFormalML.g:1:1477: T__235
+                {
+                mT__235(); 
+
+                }
+                break;
+            case 224 :
+                // InternalFormalML.g:1:1484: T__236
+                {
+                mT__236(); 
+
+                }
+                break;
+            case 225 :
+                // InternalFormalML.g:1:1491: T__237
+                {
+                mT__237(); 
+
+                }
+                break;
+            case 226 :
+                // InternalFormalML.g:1:1498: T__238
+                {
+                mT__238(); 
+
+                }
+                break;
+            case 227 :
+                // InternalFormalML.g:1:1505: T__239
+                {
+                mT__239(); 
+
+                }
+                break;
+            case 228 :
+                // InternalFormalML.g:1:1512: T__240
+                {
+                mT__240(); 
+
+                }
+                break;
+            case 229 :
+                // InternalFormalML.g:1:1519: T__241
+                {
+                mT__241(); 
+
+                }
+                break;
+            case 230 :
+                // InternalFormalML.g:1:1526: T__242
+                {
+                mT__242(); 
+
+                }
+                break;
+            case 231 :
+                // InternalFormalML.g:1:1533: T__243
+                {
+                mT__243(); 
+
+                }
+                break;
+            case 232 :
+                // InternalFormalML.g:1:1540: T__244
+                {
+                mT__244(); 
+
+                }
+                break;
+            case 233 :
+                // InternalFormalML.g:1:1547: T__245
+                {
+                mT__245(); 
+
+                }
+                break;
+            case 234 :
+                // InternalFormalML.g:1:1554: T__246
+                {
+                mT__246(); 
+
+                }
+                break;
+            case 235 :
+                // InternalFormalML.g:1:1561: T__247
+                {
+                mT__247(); 
+
+                }
+                break;
+            case 236 :
+                // InternalFormalML.g:1:1568: T__248
+                {
+                mT__248(); 
+
+                }
+                break;
+            case 237 :
+                // InternalFormalML.g:1:1575: T__249
+                {
+                mT__249(); 
+
+                }
+                break;
+            case 238 :
+                // InternalFormalML.g:1:1582: T__250
+                {
+                mT__250(); 
+
+                }
+                break;
+            case 239 :
+                // InternalFormalML.g:1:1589: T__251
+                {
+                mT__251(); 
+
+                }
+                break;
+            case 240 :
+                // InternalFormalML.g:1:1596: T__252
+                {
+                mT__252(); 
+
+                }
+                break;
+            case 241 :
+                // InternalFormalML.g:1:1603: T__253
+                {
+                mT__253(); 
+
+                }
+                break;
+            case 242 :
+                // InternalFormalML.g:1:1610: T__254
+                {
+                mT__254(); 
+
+                }
+                break;
+            case 243 :
+                // InternalFormalML.g:1:1617: T__255
+                {
+                mT__255(); 
+
+                }
+                break;
+            case 244 :
+                // InternalFormalML.g:1:1624: T__256
+                {
+                mT__256(); 
+
+                }
+                break;
+            case 245 :
+                // InternalFormalML.g:1:1631: T__257
+                {
+                mT__257(); 
+
+                }
+                break;
+            case 246 :
+                // InternalFormalML.g:1:1638: T__258
+                {
+                mT__258(); 
+
+                }
+                break;
+            case 247 :
+                // InternalFormalML.g:1:1645: T__259
+                {
+                mT__259(); 
+
+                }
+                break;
+            case 248 :
+                // InternalFormalML.g:1:1652: T__260
+                {
+                mT__260(); 
+
+                }
+                break;
+            case 249 :
+                // InternalFormalML.g:1:1659: T__261
+                {
+                mT__261(); 
+
+                }
+                break;
+            case 250 :
+                // InternalFormalML.g:1:1666: T__262
+                {
+                mT__262(); 
+
+                }
+                break;
+            case 251 :
+                // InternalFormalML.g:1:1673: T__263
+                {
+                mT__263(); 
+
+                }
+                break;
+            case 252 :
+                // InternalFormalML.g:1:1680: T__264
+                {
+                mT__264(); 
+
+                }
+                break;
+            case 253 :
+                // InternalFormalML.g:1:1687: T__265
+                {
+                mT__265(); 
+
+                }
+                break;
+            case 254 :
+                // InternalFormalML.g:1:1694: T__266
+                {
+                mT__266(); 
+
+                }
+                break;
+            case 255 :
+                // InternalFormalML.g:1:1701: T__267
+                {
+                mT__267(); 
+
+                }
+                break;
+            case 256 :
+                // InternalFormalML.g:1:1708: T__268
+                {
+                mT__268(); 
+
+                }
+                break;
+            case 257 :
+                // InternalFormalML.g:1:1715: T__269
+                {
+                mT__269(); 
+
+                }
+                break;
+            case 258 :
+                // InternalFormalML.g:1:1722: T__270
+                {
+                mT__270(); 
+
+                }
+                break;
+            case 259 :
+                // InternalFormalML.g:1:1729: T__271
+                {
+                mT__271(); 
+
+                }
+                break;
+            case 260 :
+                // InternalFormalML.g:1:1736: T__272
+                {
+                mT__272(); 
+
+                }
+                break;
+            case 261 :
+                // InternalFormalML.g:1:1743: T__273
+                {
+                mT__273(); 
+
+                }
+                break;
+            case 262 :
+                // InternalFormalML.g:1:1750: T__274
+                {
+                mT__274(); 
+
+                }
+                break;
+            case 263 :
+                // InternalFormalML.g:1:1757: T__275
+                {
+                mT__275(); 
+
+                }
+                break;
+            case 264 :
+                // InternalFormalML.g:1:1764: T__276
+                {
+                mT__276(); 
+
+                }
+                break;
+            case 265 :
+                // InternalFormalML.g:1:1771: T__277
+                {
+                mT__277(); 
+
+                }
+                break;
+            case 266 :
+                // InternalFormalML.g:1:1778: T__278
+                {
+                mT__278(); 
+
+                }
+                break;
+            case 267 :
+                // InternalFormalML.g:1:1785: T__279
+                {
+                mT__279(); 
+
+                }
+                break;
+            case 268 :
+                // InternalFormalML.g:1:1792: T__280
+                {
+                mT__280(); 
+
+                }
+                break;
+            case 269 :
+                // InternalFormalML.g:1:1799: T__281
+                {
+                mT__281(); 
+
+                }
+                break;
+            case 270 :
+                // InternalFormalML.g:1:1806: T__282
+                {
+                mT__282(); 
+
+                }
+                break;
+            case 271 :
+                // InternalFormalML.g:1:1813: T__283
+                {
+                mT__283(); 
+
+                }
+                break;
+            case 272 :
+                // InternalFormalML.g:1:1820: T__284
+                {
+                mT__284(); 
+
+                }
+                break;
+            case 273 :
+                // InternalFormalML.g:1:1827: T__285
+                {
+                mT__285(); 
+
+                }
+                break;
+            case 274 :
+                // InternalFormalML.g:1:1834: T__286
+                {
+                mT__286(); 
+
+                }
+                break;
+            case 275 :
+                // InternalFormalML.g:1:1841: T__287
+                {
+                mT__287(); 
+
+                }
+                break;
+            case 276 :
+                // InternalFormalML.g:1:1848: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 277 :
+                // InternalFormalML.g:1:1857: RULE_CHARACTER
+                {
+                mRULE_CHARACTER(); 
+
+                }
+                break;
+            case 278 :
+                // InternalFormalML.g:1:1872: RULE_XLIA_ID
+                {
+                mRULE_XLIA_ID(); 
+
+                }
+                break;
+            case 279 :
+                // InternalFormalML.g:1:1885: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 280 :
+                // InternalFormalML.g:1:1893: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 281 :
+                // InternalFormalML.g:1:1905: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 282 :
+                // InternalFormalML.g:1:1921: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 283 :
+                // InternalFormalML.g:1:1937: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 284 :
+                // InternalFormalML.g:1:1945: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA13 dfa13 = new DFA13(this);
+    static final String DFA13_eotS =
+        "\1\uffff\7\72\1\uffff\1\134\1\uffff\1\137\1\65\2\72\1\173\2\72\1\uffff\1\72\1\u0086\3\72\1\uffff\1\u009a\1\u00a7\1\u00ab\1\u00b0\1\72\1\u00b7\1\u00bb\1\u00bd\1\u00c0\1\u00c4\1\u00c6\1\72\1\65\3\72\4\uffff\1\72\3\uffff\1\65\1\72\1\65\2\uffff\1\u00e7\1\72\1\u00e9\1\72\1\uffff\35\72\3\uffff\1\u0113\24\uffff\11\72\1\u0137\2\uffff\2\72\1\u013b\1\72\1\uffff\3\72\3\uffff\14\72\1\u0151\3\72\1\uffff\1\u0156\2\uffff\1\u0158\14\uffff\1\u0164\1\uffff\1\u0166\1\uffff\1\u0169\4\uffff\4\72\11\uffff\1\u0174\3\uffff\1\u0178\4\uffff\3\72\6\uffff\5\72\4\uffff\1\72\5\uffff\1\u00e0\2\uffff\1\72\1\u018e\3\72\1\uffff\1\72\1\uffff\11\72\1\u019d\1\u019e\1\u019f\1\u01a0\21\72\1\u01b6\11\72\31\uffff\10\72\1\u01de\2\72\2\uffff\1\u01e1\2\72\1\uffff\1\u01e5\11\72\1\u01f1\4\72\1\u01f7\1\72\1\u01f9\1\u01fa\2\72\1\uffff\3\72\25\uffff\1\72\1\u0204\6\72\7\uffff\1\u020b\1\72\1\u020e\6\uffff\7\72\1\u018b\2\uffff\1\u0218\1\72\1\uffff\3\72\1\u021e\4\72\1\uffff\2\72\1\u0226\2\72\4\uffff\3\72\1\u022c\15\72\1\u023c\3\72\1\uffff\3\72\1\u0243\5\72\1\u0249\1\72\1\u024b\22\uffff\1\u0257\2\72\1\u025a\1\u025c\3\72\1\u0260\1\uffff\1\u0261\1\72\1\uffff\3\72\1\uffff\3\72\1\u026a\1\u026c\6\72\1\uffff\1\u0273\4\72\1\uffff\1\72\2\uffff\5\72\3\uffff\1\u0282\1\uffff\2\72\1\u0285\1\u0287\1\u0288\1\72\1\uffff\1\u028b\1\72\2\uffff\1\72\1\u028f\1\u0290\1\u0291\1\u0292\3\72\1\uffff\2\72\1\u0298\1\u029a\1\72\1\uffff\2\72\1\u029f\1\u02a1\3\72\1\uffff\1\72\1\u02a6\3\72\1\uffff\12\72\1\uffff\1\72\1\u02b6\1\72\1\u02b8\1\uffff\6\72\1\uffff\4\72\1\u02c3\1\uffff\1\u02c4\15\uffff\2\72\1\uffff\1\u02cd\1\uffff\1\72\1\u02cf\1\u02d0\2\uffff\1\u02d1\1\72\1\u02d3\1\72\1\u02d6\3\72\1\uffff\1\72\1\uffff\1\u02db\3\72\1\u02df\1\72\1\uffff\6\72\1\u02e7\4\72\2\uffff\1\72\1\uffff\2\72\1\uffff\1\72\2\uffff\1\u02f0\2\uffff\1\72\1\u02f3\1\72\4\uffff\1\u02f5\1\u02f6\3\72\1\uffff\1\72\1\uffff\4\72\3\uffff\1\72\1\u0300\2\72\1\uffff\1\u0303\1\u0304\3\72\1\u0308\1\72\1\uffff\3\72\1\u030d\1\u030e\1\u030f\1\72\1\uffff\1\u0311\1\uffff\1\u0312\1\u0313\4\72\1\u0318\3\72\10\uffff\2\72\1\uffff\1\u0324\3\uffff\1\72\1\uffff\1\u0326\1\72\1\uffff\1\u0328\1\u0329\2\72\1\uffff\1\u032c\2\72\1\uffff\1\72\1\u0330\1\72\1\u0332\3\72\1\uffff\1\u0336\3\72\1\u033a\1\72\1\u033c\1\72\1\uffff\1\72\2\uffff\1\72\2\uffff\1\u0340\1\u0341\5\72\1\u0347\1\u0348\1\uffff\1\u0349\1\72\2\uffff\1\72\1\u034c\1\72\1\uffff\1\u034e\3\72\3\uffff\1\72\3\uffff\1\72\1\u0354\1\72\1\u0356\1\uffff\2\72\1\u0359\5\uffff\3\72\1\uffff\1\u0362\1\uffff\1\72\2\uffff\2\72\1\uffff\1\u0366\1\u0367\1\72\1\uffff\1\u0369\1\uffff\1\72\1\u036b\1\u036c\1\uffff\1\72\1\u036e\1\u036f\1\uffff\1\72\1\uffff\3\72\2\uffff\1\u0374\1\72\1\u0376\2\72\3\uffff\1\72\1\u037a\1\uffff\1\72\1\uffff\4\72\1\u0380\1\uffff\1\u0381\1\uffff\1\u0382\1\u0383\6\uffff\2\72\1\u0387\1\uffff\1\u0388\1\u0389\1\72\2\uffff\1\u038b\1\uffff\1\72\2\uffff\1\u038d\2\uffff\2\72\1\u0390\1\u0391\1\uffff\1\72\1\uffff\1\u0393\1\u0394\1\u0395\1\uffff\1\72\1\u0397\1\u0398\1\u0399\1\72\5\uffff\1\72\1\u039d\3\uffff\1\u039e\1\uffff\1\u039f\1\uffff\1\72\1\u03a1\2\uffff\1\72\3\uffff\1\72\3\uffff\1\72\1\uffff\1\u03a6\3\uffff\1\u03a7\1\uffff\1\72\1\u03a9\1\72\3\uffff\1\72\1\uffff\1\u03ad\1\uffff\1\u03af\5\uffff";
+    static final String DFA13_eofS =
+        "\u03b2\uffff";
+    static final String DFA13_minS =
+        "\1\0\7\60\1\uffff\1\55\1\uffff\1\72\1\106\2\60\1\72\2\60\1\uffff\1\146\1\52\3\60\1\uffff\1\46\1\54\1\55\1\41\1\60\1\53\1\52\2\75\1\72\1\75\1\60\1\144\3\60\4\uffff\1\60\3\uffff\1\0\1\60\1\0\2\uffff\1\43\1\60\1\43\1\60\1\uffff\35\60\3\uffff\1\76\5\uffff\1\146\1\145\1\141\1\157\1\143\1\156\1\uffff\1\146\1\uffff\1\165\1\147\1\141\1\uffff\1\156\1\uffff\11\60\1\75\2\uffff\2\60\1\43\1\60\1\uffff\1\156\1\164\1\151\3\uffff\14\60\1\43\3\60\1\uffff\1\75\2\uffff\1\75\1\73\2\uffff\1\73\1\156\1\uffff\1\156\1\162\4\uffff\1\74\1\uffff\1\55\1\uffff\1\75\4\uffff\4\60\11\uffff\1\74\2\uffff\1\75\1\76\4\uffff\3\60\1\165\1\uffff\1\150\1\uffff\1\145\1\uffff\5\60\4\uffff\1\60\3\uffff\2\0\1\47\2\uffff\1\60\1\43\3\60\1\uffff\1\60\1\uffff\11\60\4\43\21\60\1\43\11\60\5\uffff\1\147\1\uffff\1\143\1\144\1\155\1\141\1\uffff\1\151\3\uffff\1\141\1\165\1\141\1\151\5\uffff\10\60\1\43\2\60\2\uffff\1\43\2\60\1\uffff\1\43\1\151\1\141\1\156\6\60\1\43\4\60\1\43\1\60\2\43\2\60\1\uffff\3\60\13\uffff\1\144\1\43\10\uffff\1\60\1\43\6\60\7\uffff\1\43\1\60\1\43\1\154\5\uffff\7\60\1\0\2\uffff\1\43\1\60\1\uffff\3\60\1\43\4\60\1\uffff\2\60\1\43\2\60\4\uffff\3\60\1\43\15\60\1\43\3\60\1\uffff\3\60\1\43\5\60\1\43\1\60\1\43\1\151\1\uffff\1\150\2\uffff\1\72\1\uffff\1\164\4\uffff\1\162\1\141\2\uffff\1\143\1\uffff\1\43\2\60\2\43\3\60\1\43\1\uffff\1\43\1\60\1\uffff\3\60\1\uffff\1\164\1\162\1\141\2\43\6\60\1\uffff\1\43\4\60\1\uffff\1\60\2\uffff\5\60\1\43\2\uffff\1\43\1\uffff\2\60\3\43\1\60\1\uffff\1\43\1\60\1\uffff\1\154\1\60\4\43\3\60\1\uffff\2\60\2\43\1\60\1\uffff\2\60\2\43\3\60\1\uffff\1\60\1\43\3\60\1\uffff\12\60\1\uffff\1\60\1\43\1\60\1\43\1\uffff\6\60\1\uffff\4\60\1\43\1\uffff\1\43\1\uffff\1\157\4\uffff\1\145\1\144\1\162\1\uffff\1\145\2\uffff\2\60\1\uffff\1\43\1\uffff\1\60\2\43\2\uffff\1\43\1\60\1\43\1\60\1\43\1\164\1\154\1\60\1\uffff\1\60\1\uffff\1\43\3\60\1\43\1\60\1\uffff\6\60\1\43\4\60\2\uffff\1\60\1\uffff\2\60\1\uffff\1\60\2\uffff\1\43\2\uffff\1\60\1\74\1\60\4\uffff\2\43\3\60\1\uffff\1\60\1\uffff\4\60\3\uffff\1\60\1\43\2\60\1\uffff\2\43\3\60\1\43\1\60\1\uffff\3\60\3\43\1\60\1\uffff\1\43\1\uffff\2\43\4\60\1\43\3\60\2\uffff\1\156\1\155\1\72\1\144\2\uffff\2\60\1\uffff\1\43\3\uffff\1\60\1\uffff\1\43\1\141\1\uffff\2\43\2\60\1\uffff\1\43\2\60\1\uffff\1\60\1\43\1\60\1\43\3\60\1\uffff\1\43\3\60\1\43\1\60\1\43\1\60\1\uffff\1\60\2\uffff\1\60\2\uffff\2\43\5\60\2\43\1\uffff\1\43\1\60\2\uffff\1\60\1\43\1\60\1\uffff\1\43\3\60\3\uffff\1\60\3\uffff\1\60\1\43\1\60\1\43\1\uffff\2\60\1\43\1\72\1\141\2\uffff\1\72\3\60\1\uffff\1\43\1\uffff\1\154\2\uffff\2\60\1\uffff\2\43\1\60\1\uffff\1\43\1\uffff\1\60\2\43\1\uffff\1\60\2\43\1\uffff\1\60\1\uffff\3\60\2\uffff\1\43\1\60\1\43\2\60\3\uffff\1\60\1\43\1\uffff\1\60\1\uffff\4\60\1\43\1\uffff\1\43\1\uffff\2\43\3\uffff\1\143\2\uffff\2\60\1\43\1\uffff\2\43\1\60\2\uffff\1\43\1\uffff\1\60\2\uffff\1\43\2\uffff\2\60\2\43\1\uffff\1\60\1\uffff\3\43\1\uffff\1\60\3\43\1\60\4\uffff\1\150\1\60\1\43\3\uffff\1\43\1\uffff\1\43\1\uffff\1\60\1\43\2\uffff\1\60\3\uffff\1\60\3\uffff\1\60\1\151\1\43\3\uffff\1\43\1\uffff\1\60\1\43\1\60\1\156\2\uffff\1\60\1\uffff\1\43\1\145\1\43\1\uffff\1\72\3\uffff";
+    static final String DFA13_maxS =
+        "\1\uffff\7\172\1\uffff\1\76\1\uffff\1\72\1\170\2\172\1\75\2\172\1\uffff\1\163\1\75\3\172\1\uffff\1\75\1\u00a7\1\75\1\76\1\172\3\75\1\172\1\76\1\75\1\172\1\164\3\172\4\uffff\1\172\3\uffff\1\uffff\1\172\1\uffff\2\uffff\4\172\1\uffff\35\172\3\uffff\1\76\5\uffff\1\154\1\165\2\157\1\164\1\162\1\uffff\1\156\1\uffff\1\165\1\162\1\165\1\uffff\1\165\1\uffff\11\172\1\75\2\uffff\4\172\1\uffff\1\156\1\164\1\151\3\uffff\20\172\1\uffff\1\75\2\uffff\1\75\1\174\2\uffff\1\134\1\174\1\uffff\1\174\1\162\4\uffff\1\75\1\uffff\1\55\1\uffff\1\76\4\uffff\4\172\11\uffff\1\76\2\uffff\2\76\4\uffff\3\172\1\165\1\uffff\1\151\1\uffff\1\171\1\uffff\5\172\4\uffff\1\172\3\uffff\2\uffff\1\47\2\uffff\5\172\1\uffff\1\172\1\uffff\50\172\5\uffff\1\164\1\uffff\1\143\1\145\1\156\1\141\1\uffff\1\163\3\uffff\1\141\1\165\1\151\1\157\5\uffff\13\172\2\uffff\3\172\1\uffff\1\172\1\151\1\141\1\156\21\172\1\uffff\3\172\13\uffff\1\144\1\174\10\uffff\10\172\7\uffff\3\172\1\154\5\uffff\7\172\1\uffff\2\uffff\2\172\1\uffff\10\172\1\uffff\5\172\4\uffff\25\172\1\uffff\14\172\1\151\1\uffff\1\162\2\uffff\1\160\1\uffff\1\164\4\uffff\1\162\1\141\2\uffff\1\164\1\uffff\11\172\1\uffff\2\172\1\uffff\3\172\1\uffff\1\164\1\162\1\141\10\172\1\uffff\5\172\1\uffff\1\172\2\uffff\5\172\1\174\2\uffff\1\172\1\uffff\6\172\1\uffff\2\172\1\uffff\1\154\10\172\1\uffff\5\172\1\uffff\7\172\1\uffff\5\172\1\uffff\12\172\1\uffff\4\172\1\uffff\6\172\1\uffff\5\172\1\uffff\1\172\1\uffff\1\157\4\uffff\1\145\1\144\1\162\1\uffff\1\157\2\uffff\2\172\1\uffff\1\172\1\uffff\3\172\2\uffff\5\172\1\164\1\154\1\172\1\uffff\1\172\1\uffff\6\172\1\uffff\13\172\2\uffff\1\172\1\uffff\2\172\1\uffff\1\172\2\uffff\1\172\2\uffff\1\172\1\74\1\172\4\uffff\5\172\1\uffff\1\172\1\uffff\4\172\3\uffff\4\172\1\uffff\7\172\1\uffff\7\172\1\uffff\1\172\1\uffff\12\172\2\uffff\1\156\1\155\1\74\1\144\2\uffff\2\172\1\uffff\1\172\3\uffff\1\172\1\uffff\1\172\1\141\1\uffff\4\172\1\uffff\3\172\1\uffff\7\172\1\uffff\10\172\1\uffff\1\172\2\uffff\1\172\2\uffff\11\172\1\uffff\2\172\2\uffff\3\172\1\uffff\4\172\3\uffff\1\172\3\uffff\4\172\1\uffff\3\172\1\74\1\141\2\uffff\1\74\3\172\1\uffff\1\172\1\uffff\1\154\2\uffff\2\172\1\uffff\3\172\1\uffff\1\172\1\uffff\3\172\1\uffff\3\172\1\uffff\1\172\1\uffff\3\172\2\uffff\5\172\3\uffff\2\172\1\uffff\1\172\1\uffff\5\172\1\uffff\1\172\1\uffff\2\172\3\uffff\1\143\2\uffff\3\172\1\uffff\3\172\2\uffff\1\172\1\uffff\1\172\2\uffff\1\172\2\uffff\4\172\1\uffff\1\172\1\uffff\3\172\1\uffff\5\172\4\uffff\1\150\2\172\3\uffff\1\172\1\uffff\1\172\1\uffff\2\172\2\uffff\1\172\3\uffff\1\172\3\uffff\1\172\1\151\1\172\3\uffff\1\172\1\uffff\3\172\1\156\2\uffff\1\172\1\uffff\1\172\1\145\1\172\1\uffff\1\74\3\uffff";
+    static final String DFA13_acceptS =
+        "\10\uffff\1\10\1\uffff\1\12\7\uffff\1\41\5\uffff\1\77\20\uffff\1\u00ba\1\u00bb\1\u00bc\1\u00c9\1\uffff\1\u0112\1\u0113\1\u0114\3\uffff\1\u011b\1\u011c\4\uffff\1\u0116\35\uffff\1\10\1\11\1\134\1\uffff\1\170\1\12\1\u00fa\1\13\1\14\6\uffff\1\43\1\uffff\1\45\3\uffff\1\u00c6\1\uffff\1\u00d2\12\uffff\1\131\1\23\4\uffff\1\41\3\uffff\1\135\1\u00f6\1\56\20\uffff\1\77\1\uffff\1\142\1\u00e6\2\uffff\1\105\1\107\2\uffff\1\112\2\uffff\1\122\1\123\1\143\1\u00f4\1\uffff\1\145\1\uffff\1\161\1\uffff\1\157\1\160\1\173\1\130\4\uffff\1\133\1\165\1\167\1\136\1\u0119\1\u011a\1\u00f7\1\137\1\u00f8\1\uffff\1\u0117\1\u00f5\2\uffff\1\u00b9\1\162\1\155\1\171\4\uffff\1\u0081\1\uffff\1\u00fe\1\uffff\1\u0101\5\uffff\1\u00ba\1\u00bb\1\u00bc\1\u00c9\1\uffff\1\u0112\1\u0113\1\u0114\3\uffff\1\u0118\1\u011b\5\uffff\1\u00a0\1\uffff\1\u00ef\50\uffff\1\u00cb\1\166\1\15\1\16\1\27\1\uffff\1\51\4\uffff\1\47\1\uffff\1\50\1\44\1\u00e4\4\uffff\1\u00bf\1\u00cc\1\u00cf\1\u00e2\1\u0104\13\uffff\1\132\1\24\3\uffff\1\26\25\uffff\1\u00f2\3\uffff\1\140\1\102\1\141\1\103\1\104\1\106\1\110\1\121\1\111\1\120\1\113\2\uffff\1\124\1\150\1\163\1\u00ee\1\174\1\126\1\156\1\154\10\uffff\1\151\1\152\1\144\1\146\1\147\1\153\1\164\4\uffff\1\u00fd\1\u00ff\1\u0100\1\u0102\1\u0103\10\uffff\2\u0115\2\uffff\1\61\10\uffff\1\u00bd\5\uffff\1\u009d\1\4\1\u010e\1\125\25\uffff\1\u009c\15\uffff\1\u00d0\1\uffff\1\u00c3\1\u00d1\1\uffff\1\46\1\uffff\1\42\1\u00c5\1\u00cd\1\u00ce\2\uffff\1\u00d3\1\u00e5\1\uffff\1\u00c1\11\uffff\1\u00f3\2\uffff\1\25\3\uffff\1\u00a2\13\uffff\1\65\5\uffff\1\u0092\1\uffff\1\u00b7\1\u00b8\6\uffff\1\115\1\117\1\uffff\1\u0082\6\uffff\1\172\2\uffff\1\u00fc\11\uffff\1\u00ab\5\uffff\1\u00b6\7\uffff\1\76\5\uffff\1\5\12\uffff\1\u00da\4\uffff\1\u00ae\6\uffff\1\u00dc\5\uffff\1\u00fb\1\uffff\1\u0111\1\uffff\1\30\1\32\1\31\1\u00d6\3\uffff\1\u00be\1\uffff\1\u00c2\1\21\2\uffff\1\u00d9\1\uffff\1\u00db\3\uffff\1\u008c\1\u009e\10\uffff\1\62\1\uffff\1\66\6\uffff\1\73\13\uffff\1\114\1\116\1\uffff\1\u00f0\2\uffff\1\u00df\1\uffff\1\u00aa\1\u0110\1\uffff\1\177\1\175\3\uffff\1\u008d\1\u009b\1\u009f\1\u00b2\5\uffff\1\u00a1\1\uffff\1\u00a3\4\uffff\1\u00d4\1\u00c8\1\u0086\4\uffff\1\u00a8\7\uffff\1\u00e7\7\uffff\1\52\1\uffff\1\u00ad\12\uffff\1\u010f\1\u0109\4\uffff\1\u00c0\1\u00c4\2\uffff\1\u0105\1\uffff\1\22\1\67\1\u00a7\1\uffff\1\u00a6\2\uffff\1\55\4\uffff\1\74\3\uffff\1\u00e1\7\uffff\1\u00d7\10\uffff\1\u00ec\1\uffff\1\u0080\1\176\1\uffff\1\u00f1\1\u00ea\11\uffff\1\3\2\uffff\1\u0098\1\u0099\3\uffff\1\u0083\4\uffff\1\6\1\u00a5\1\17\1\uffff\1\u010a\1\u00dd\1\u00e0\4\uffff\1\u0089\5\uffff\1\100\1\u00e8\4\uffff\1\u00eb\1\uffff\1\u00a4\1\uffff\1\u0107\1\u0108\2\uffff\1\70\3\uffff\1\u0091\1\uffff\1\u00b1\3\uffff\1\71\3\uffff\1\127\1\uffff\1\u00b4\3\uffff\1\1\1\57\5\uffff\1\33\1\u0097\1\75\2\uffff\1\20\1\uffff\1\u0084\5\uffff\1\u00b0\1\uffff\1\7\2\uffff\1\u00d8\1\35\1\37\1\uffff\1\101\1\u00e9\3\uffff\1\u0094\3\uffff\1\72\1\u0093\1\uffff\1\u00af\1\uffff\1\u009a\1\u00d5\1\uffff\1\u00ac\1\u00b3\4\uffff\1\u00de\1\uffff\1\u00c7\3\uffff\1\u010c\5\uffff\1\u008f\1\u00b5\1\u00ed\1\u00a9\3\uffff\1\u0090\1\54\1\60\1\uffff\1\63\1\uffff\1\u008e\2\uffff\1\u00f9\1\u0088\1\uffff\1\2\1\u0095\1\u0096\1\uffff\1\u0085\1\u0087\1\u00ca\3\uffff\1\u010d\1\64\1\u010b\1\uffff\1\u008b\4\uffff\1\u00e3\1\u008a\1\uffff\1\53\3\uffff\1\34\1\uffff\1\u0106\1\36\1\40";
+    static final String DFA13_specialS =
+        "\1\3\60\uffff\1\1\1\uffff\1\5\u00a9\uffff\1\4\1\0\u00aa\uffff\1\2\u0228\uffff}>";
+    static final String[] DFA13_transitionS = {
+            "\11\65\2\64\2\65\1\64\22\65\1\64\1\43\1\63\1\23\1\45\1\40\1\31\1\61\1\13\1\54\1\24\1\36\1\51\1\11\1\10\1\37\12\60\1\17\1\22\1\33\1\34\1\42\1\56\1\14\32\62\1\12\1\65\1\30\1\41\1\62\1\65\1\20\1\3\1\7\1\27\1\35\1\16\1\55\1\62\1\1\1\46\1\62\1\47\1\2\1\44\1\21\1\5\1\62\1\26\1\6\1\15\1\25\1\4\1\50\3\62\1\52\1\32\1\53\1\57\uff81\65",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\5\71\1\70\7\71\1\66\3\71\1\67\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\74\3\71\1\76\11\71\1\75\5\71\1\73\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\102\15\71\1\100\2\71\1\101\2\71\1\77\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\103\3\71\1\105\3\71\1\104\5\71\1\106\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\110\15\71\1\107\2\71\1\113\1\111\1\71\1\112\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\122\1\71\1\120\2\71\1\117\1\114\12\71\1\116\1\121\3\71\1\115\1\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\127\6\71\1\123\3\71\1\126\2\71\1\124\4\71\1\125\6\71",
+            "",
+            "\1\133\17\uffff\1\132\1\131",
+            "",
+            "\1\136",
+            "\1\140\33\uffff\1\155\1\144\1\151\1\150\1\147\1\152\1\uffff\1\146\2\uffff\1\157\1\143\1\uffff\1\156\1\154\1\uffff\1\142\1\145\1\153\3\uffff\1\141",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\161\1\71\1\164\1\71\1\163\10\71\1\160\6\71\1\162\1\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\165\7\71\1\170\2\71\1\166\2\71\1\167\13\71",
+            "\1\171\2\uffff\1\172",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\71\1\175\13\71\1\174\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\176\2\71\1\177\5\71",
+            "",
+            "\1\u0083\2\uffff\1\u0081\11\uffff\1\u0082",
+            "\1\u0085\22\uffff\1\u0084",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u008a\1\71\1\u0089\2\71\1\u0087\4\71\1\u008b\3\71\1\u0088\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u008c\2\71\1\u008e\1\u008d\11\71\1\u0092\4\71\1\u0091\1\u0090\1\u008f\4\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0095\2\71\1\u0094\1\u0096\5\71\1\u0093\13\71",
+            "",
+            "\1\u0098\26\uffff\1\u0099",
+            "\1\u00a1\1\uffff\1\u009e\1\u009f\13\uffff\1\u009c\1\uffff\1\u00a6\43\uffff\1\u00a2\4\uffff\1\u00a4\2\uffff\1\u00a0\1\u00a5\4\uffff\1\u00a3\14\uffff\1\u009b\52\uffff\1\u009d",
+            "\1\u00aa\16\uffff\1\u00a9\1\u00a8",
+            "\1\u00ad\15\uffff\1\u00ae\15\uffff\1\u00ac\1\u00af",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u00b1\1\71\1\u00b2\7\71\1\u00b4\1\71\1\u00b3\2\71",
+            "\1\u00b6\21\uffff\1\u00b5",
+            "\1\u00b9\4\uffff\1\u00ba\15\uffff\1\u00b8",
+            "\1\u00bc",
+            "\1\u00be\3\uffff\32\u00bf\4\uffff\1\u00bf\1\uffff\32\u00bf",
+            "\1\u00c3\2\uffff\1\u00c2\1\u00c1",
+            "\1\u00c5",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u00c9\11\71\1\u00c7\5\71\1\u00c8\5\71",
+            "\1\u00cd\1\u00cb\10\uffff\1\u00ca\1\uffff\1\u00cf\2\uffff\1\u00ce\1\u00cc",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u00d1\5\71\1\u00d0\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u00d2\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u00d3\6\71\1\u00d4\22\71",
+            "",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u00d9\5\71",
+            "",
+            "",
+            "",
+            "\47\u00de\1\u00df\64\u00de\1\u00dd\uffa3\u00de",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\0\u00e0",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u00e2\5\71\1\u00e4\1\u00e5\2\71\1\u00e6\1\u00e3\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u00e8\5\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u00ea\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u00eb\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u00ed\1\u00ec\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u00ee\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\5\71\1\u00ef\24\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u00f0\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u00f2\11\71\1\u00f1\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\6\71\1\u00f3\23\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u00f5\5\71\1\u00f4\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u00f6\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u00f8\16\71\1\u00f7\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u00f9\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u00fa\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u00fb\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u00fc\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\71\1\u00fd\30\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u00fe\5\71\1\u00ff\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\6\71\1\u0100\5\71\1\u0101\14\71\1\u0102",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u0103\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0104\15\71\1\u0105\2\71\1\u0106\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0107\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0108\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u0109\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\7\71\1\u010a\22\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u010b\3\71\1\u010d\11\71\1\u010c\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u010e\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u010f\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u0110\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0111\16\71",
+            "",
+            "",
+            "",
+            "\1\u0112",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0115\5\uffff\1\u0114",
+            "\1\u0117\11\uffff\1\u0116\5\uffff\1\u0118",
+            "\1\u0119\15\uffff\1\u011a",
+            "\1\u011b",
+            "\1\u011d\20\uffff\1\u011c",
+            "\1\u011e\3\uffff\1\u011f",
+            "",
+            "\1\u0121\7\uffff\1\u0120",
+            "",
+            "\1\u0122",
+            "\1\u0123\12\uffff\1\u0124",
+            "\1\u0127\20\uffff\1\u0125\2\uffff\1\u0126",
+            "",
+            "\1\u0129\1\uffff\1\u012a\4\uffff\1\u0128",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u012c\23\71\1\u012b\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u012d\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\17\71\1\u012e\12\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\14\71\1\u012f\15\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u0130\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0131\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u0132\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0133\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\5\71\1\u0134\7\71\1\u0135\14\71",
+            "\1\u0136",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u0138\24\71\1\u0139\1\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u013a\13\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u013c\6\71",
+            "",
+            "\1\u013d",
+            "\1\u013e",
+            "\1\u013f",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0140\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0141\3\71\1\u0142\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0143\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u0144\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0145\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0146\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0147\4\71\1\u014a\14\71\1\u0149\1\u0148\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\25\71\1\u014b\4\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u014c\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u014d\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u014e\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u014f\5\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u0150\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0152\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u0153\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u0154\7\71",
+            "",
+            "\1\u0155",
+            "",
+            "",
+            "\1\u0157",
+            "\1\u015a\100\uffff\1\u0159",
+            "",
+            "",
+            "\1\u015b\40\uffff\1\u015c",
+            "\1\u015e\15\uffff\1\u015d",
+            "",
+            "\1\u0160\15\uffff\1\u015f",
+            "\1\u0161",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0163\1\u0162",
+            "",
+            "\1\u0165",
+            "",
+            "\1\u0168\1\u0167",
+            "",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u016a\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u016d\22\71\1\u016c\1\u016e\1\u016b\4\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0170\3\71\1\u016f\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0171\25\71",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0172\1\uffff\1\u0173",
+            "",
+            "",
+            "\1\u0175\1\u0176",
+            "\1\u0177",
+            "",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0179\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u017a\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\26\71\1\u017b\3\71",
+            "\1\u017c",
+            "",
+            "\1\u017e\1\u017d",
+            "",
+            "\1\u017f\17\uffff\1\u0180\3\uffff\1\u0181",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0182\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0183\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\5\71\1\u0185\14\71\1\u0184\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0186\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0187\21\71",
+            "",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0188\31\71",
+            "",
+            "",
+            "",
+            "\47\u00e0\1\u0189\uffd8\u00e0",
+            "\47\u00e0\1\u018a\uffd8\u00e0",
+            "\1\u018b",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u018c\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u018d\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u018f\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u0190\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0191\6\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0192\14\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0193\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\7\71\1\u0194\11\71\1\u0195\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0196\25\71",
+            "\12\71\1\u0197\6\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u0198\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\5\71\1\u0199\24\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u019a\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u019b\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u019c\31\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u01a1\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u01a2\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u01a3\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u01a4\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\12\71\1\u01a5\17\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u01a6\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u01a7\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u01a9\6\71\1\u01a8\4\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u01ab\20\71\1\u01aa\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u01ac\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\17\71\1\u01ad\12\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u01ae\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u01af\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u01b1\1\71\1\u01b0\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\17\71\1\u01b2\12\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u01b3\13\71\1\u01b4\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u01b5\7\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\17\71\1\u01b7\12\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u01b8\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u01b9\3\71\1\u01ba\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u01bb\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u01bc\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u01be\4\71\1\u01bf\1\u01bd\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u01c0\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u01c1\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u01c2\16\71",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u01c3\14\uffff\1\u01c4",
+            "",
+            "\1\u01c5",
+            "\1\u01c6\1\u01c7",
+            "\1\u01c8\1\u01c9",
+            "\1\u01ca",
+            "",
+            "\1\u01cb\5\uffff\1\u01ce\1\u01cd\2\uffff\1\u01cc",
+            "",
+            "",
+            "",
+            "\1\u01cf",
+            "\1\u01d0",
+            "\1\u01d1\7\uffff\1\u01d2",
+            "\1\u01d4\5\uffff\1\u01d3",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u01d5\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u01d6\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\14\71\1\u01d7\15\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u01d8\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u01d9\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u01da\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u01db\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u01dc\31\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\12\71\1\u01dd\17\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u01df\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u01e0\31\71",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u01e2\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u01e3\10\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\17\71\1\u01e4\12\71",
+            "\1\u01e6",
+            "\1\u01e7",
+            "\1\u01e8",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u01e9\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u01ea\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u01eb\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u01ec\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u01ed\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u01ee\13\71\1\u01ef\13\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u01f0\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u01f2\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u01f3\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u01f4\1\u01f5\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u01f6\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u01f8\27\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u01fb\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\71\1\u01fc\30\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u01fd\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u01fe\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u01ff\31\71",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0200",
+            "\1\u0202\130\uffff\1\u0201",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0203\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0205\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\71\1\u0206\30\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\14\71\1\u0207\15\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0208\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u0209\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u020a\14\71",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u020c\16\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\5\71\1\u020d\24\71",
+            "\1\u020f",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u0210\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0211\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0212\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u0213\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0214\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0215\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0216\10\71",
+            "\0\u00e0",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0217\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\6\71\1\u0219\12\71\1\u021a\10\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u021b\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u021c\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u021d\31\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u021f\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0220\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u0221\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0222\16\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0223\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0224\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0225\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u0227\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\12\71\1\u0228\17\71",
+            "",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0229\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u022a\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u022b\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u022d\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u022e\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u022f\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0230\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0231\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0232\11\71\1\u0233\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0234\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0235\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0236\16\71",
+            "\12\71\1\u0237\6\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0238\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0239\3\71\1\u023a\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u023b\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u023d\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u023e\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u023f\6\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0240\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u0241\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0242\14\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u0244\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\12\71\1\u0245\17\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0246\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0247\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0248\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\12\71\1\u024a\17\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\u024c",
+            "",
+            "\1\u024e\11\uffff\1\u024d",
+            "",
+            "",
+            "\1\u0250\65\uffff\1\u024f",
+            "",
+            "\1\u0251",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0252",
+            "\1\u0253",
+            "",
+            "",
+            "\1\u0256\14\uffff\1\u0254\3\uffff\1\u0255",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u0258\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0259\21\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u025b\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u025d\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u025e\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u025f\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0262\16\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0263\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0264\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u0265\5\71",
+            "",
+            "\1\u0266",
+            "\1\u0267",
+            "\1\u0268",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0269\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u026b\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u026d\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u026e\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\71\1\u026f\30\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0270\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0271\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u0272\13\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0274\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0275\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\14\71\1\u0276\15\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0277\10\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0278\6\71",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u027a\3\71\1\u0279\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u027b\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u027c\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u027d\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\71\1\u027e\30\71",
+            "\1\u0280\130\uffff\1\u027f",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0281\21\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\30\71\1\u0283\1\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0284\16\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\17\71\1\u0286\12\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0289\6\71",
+            "",
+            "\1\72\14\uffff\12\71\2\uffff\1\u028a\4\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u028c\10\71",
+            "",
+            "\1\u028d",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u028e\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0293\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u0294\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0295\31\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0296\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\25\71\1\u0297\4\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\u0299\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u029b\14\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\u029c\1\uffff\2\71\1\u029d\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u029e\14\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\1\u02a0\6\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\6\71\1\u02a2\23\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u02a3\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u02a4\31\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u02a5\27\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\27\71\1\u02a7\2\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u02a8\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u02a9\21\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\6\71\1\u02aa\23\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u02ab\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u02ac\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u02ad\6\71",
+            "\12\71\1\u02ae\6\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u02af\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u02b0\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u02b1\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u02b2\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02b3\25\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\14\71\1\u02b4\15\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\14\71\1\u02b5\15\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u02b7\27\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\6\71\1\u02b9\23\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u02ba\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u02bb\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u02bc\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u02bd\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02be\25\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02bf\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u02c0\7\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u02c1\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u02c2\27\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\u02c5",
+            "",
+            "",
+            "",
+            "",
+            "\1\u02c6",
+            "\1\u02c7",
+            "\1\u02c8",
+            "",
+            "\1\u02c9\11\uffff\1\u02ca",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u02cb\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u02cc\14\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u02ce\26\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u02d2\7\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u02d4\6\71",
+            "\1\72\14\uffff\12\72\7\uffff\32\72\4\uffff\1\72\1\uffff\10\72\1\u02d5\21\72",
+            "\1\u02d7",
+            "\1\u02d8",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\6\71\1\u02d9\23\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u02da\13\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u02dc\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u02dd\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u02de\7\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u02e0\14\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u02e1\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u02e2\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02e3\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02e4\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u02e5\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u02e6\14\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02e8\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u02e9\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u02ea\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u02eb\16\71",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\5\71\1\u02ec\24\71",
+            "",
+            "\12\71\7\uffff\17\71\1\u02ed\12\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02ee\25\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u02ef\13\71",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02f1\25\71",
+            "\1\u02f2",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u02f4\21\71",
+            "",
+            "",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u02f7\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u02f8\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u02f9\31\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02fa\25\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u02fb\27\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u02fc\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u02fd\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02fe\25\71",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u02ff\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0301\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0302\31\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0305\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0306\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u0307\7\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0309\25\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u030a\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\30\71\1\u030b\1\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u030c\5\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0310\31\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0314\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u0315\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0316\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0317\16\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0319\31\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\24\71\1\u031a\5\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u031b\6\71",
+            "",
+            "",
+            "\1\u031c",
+            "\1\u031d",
+            "\1\u031e\1\uffff\1\u031f",
+            "\1\u0320",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0322\16\71\1\u0321\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0323\31\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0325\6\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\u0327",
+            "",
+            "\1\72\14\uffff\12\72\7\uffff\32\72\4\uffff\1\72\1\uffff\32\72",
+            "\1\72\14\uffff\12\72\7\uffff\32\72\4\uffff\1\72\1\uffff\32\72",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u032a\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u032b\14\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u032d\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u032e\6\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u032f\31\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0331\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0333\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0334\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0335\25\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0337\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\30\71\1\u0338\1\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0339\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u033b\13\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u033d\21\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u033e\7\71",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u033f\13\71",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0342\16\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0343\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0344\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u0345\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u0346\7\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\22\71\1\u034a\7\71",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u034b\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u034d\6\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u034f\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\17\71\1\u0350\12\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0351\10\71",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u0352\27\71",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\30\71\1\u0353\1\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0355\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0357\6\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u0358\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\u035a\1\uffff\1\u035b",
+            "\1\u035c",
+            "",
+            "",
+            "\1\u035d\1\uffff\1\u035e",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u035f\21\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0360\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0361\16\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\u0363",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\21\71\1\u0364\10\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0365\31\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u0368\16\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\2\71\1\u036a\27\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\30\71\1\u036d\1\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u0370\21\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0371\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\7\71\1\u0372\22\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u0373\14\71",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u0375\31\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\25\71\1\u0377\4\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0378\6\71",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0379\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\u037b\31\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u037c\26\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u037d\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u037e\25\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\7\71\1\u037f\22\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "",
+            "",
+            "\1\u0384",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\16\71\1\u0385\13\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0386\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\72\14\uffff\12\72\7\uffff\32\72\4\uffff\1\72\1\uffff\32\72",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u038a\16\71",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u038c\25\71",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u038e\14\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u038f\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\1\71\1\u0392\30\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u0396\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\10\71\1\u039a\21\71",
+            "",
+            "",
+            "",
+            "",
+            "\1\u039b",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u039c\14\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\23\71\1\u03a0\6\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\13\71\1\u03a2\16\71",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u03a3\25\71",
+            "",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\15\71\1\u03a4\14\71",
+            "\1\u03a5",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u03a8\25\71",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\4\71\1\u03aa\25\71",
+            "\1\u03ab",
+            "",
+            "",
+            "\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\3\71\1\u03ac\26\71",
+            "",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "\1\u03ae",
+            "\1\72\14\uffff\12\71\7\uffff\32\71\4\uffff\1\71\1\uffff\32\71",
+            "",
+            "\1\u03b0\1\uffff\1\u03b1",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA13_eot = DFA.unpackEncodedString(DFA13_eotS);
+    static final short[] DFA13_eof = DFA.unpackEncodedString(DFA13_eofS);
+    static final char[] DFA13_min = DFA.unpackEncodedStringToUnsignedChars(DFA13_minS);
+    static final char[] DFA13_max = DFA.unpackEncodedStringToUnsignedChars(DFA13_maxS);
+    static final short[] DFA13_accept = DFA.unpackEncodedString(DFA13_acceptS);
+    static final short[] DFA13_special = DFA.unpackEncodedString(DFA13_specialS);
+    static final short[][] DFA13_transition;
+
+    static {
+        int numStates = DFA13_transitionS.length;
+        DFA13_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA13_transition[i] = DFA.unpackEncodedString(DFA13_transitionS[i]);
+        }
+    }
+
+    static class DFA13 extends DFA {
+
+        public DFA13(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 13;
+            this.eot = DFA13_eot;
+            this.eof = DFA13_eof;
+            this.min = DFA13_min;
+            this.max = DFA13_max;
+            this.accept = DFA13_accept;
+            this.special = DFA13_special;
+            this.transition = DFA13_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | T__237 | T__238 | T__239 | T__240 | T__241 | T__242 | T__243 | T__244 | T__245 | T__246 | T__247 | T__248 | T__249 | T__250 | T__251 | T__252 | T__253 | T__254 | T__255 | T__256 | T__257 | T__258 | T__259 | T__260 | T__261 | T__262 | T__263 | T__264 | T__265 | T__266 | T__267 | T__268 | T__269 | T__270 | T__271 | T__272 | T__273 | T__274 | T__275 | T__276 | T__277 | T__278 | T__279 | T__280 | T__281 | T__282 | T__283 | T__284 | T__285 | T__286 | T__287 | RULE_INT | RULE_CHARACTER | RULE_XLIA_ID | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            IntStream input = _input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA13_222 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_222=='\'') ) {s = 394;}
+
+                        else if ( ((LA13_222>='\u0000' && LA13_222<='&')||(LA13_222>='(' && LA13_222<='\uFFFF')) ) {s = 224;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA13_49 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_49=='\\') ) {s = 221;}
+
+                        else if ( ((LA13_49>='\u0000' && LA13_49<='&')||(LA13_49>='(' && LA13_49<='[')||(LA13_49>=']' && LA13_49<='\uFFFF')) ) {s = 222;}
+
+                        else if ( (LA13_49=='\'') ) {s = 223;}
+
+                        else s = 53;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA13_393 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA13_393>='\u0000' && LA13_393<='\uFFFF')) ) {s = 224;}
+
+                        else s = 395;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA13_0 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_0=='i') ) {s = 1;}
+
+                        else if ( (LA13_0=='m') ) {s = 2;}
+
+                        else if ( (LA13_0=='b') ) {s = 3;}
+
+                        else if ( (LA13_0=='v') ) {s = 4;}
+
+                        else if ( (LA13_0=='p') ) {s = 5;}
+
+                        else if ( (LA13_0=='s') ) {s = 6;}
+
+                        else if ( (LA13_0=='c') ) {s = 7;}
+
+                        else if ( (LA13_0=='.') ) {s = 8;}
+
+                        else if ( (LA13_0=='-') ) {s = 9;}
+
+                        else if ( (LA13_0=='[') ) {s = 10;}
+
+                        else if ( (LA13_0=='(') ) {s = 11;}
+
+                        else if ( (LA13_0=='@') ) {s = 12;}
+
+                        else if ( (LA13_0=='t') ) {s = 13;}
+
+                        else if ( (LA13_0=='f') ) {s = 14;}
+
+                        else if ( (LA13_0==':') ) {s = 15;}
+
+                        else if ( (LA13_0=='a') ) {s = 16;}
+
+                        else if ( (LA13_0=='o') ) {s = 17;}
+
+                        else if ( (LA13_0==';') ) {s = 18;}
+
+                        else if ( (LA13_0=='#') ) {s = 19;}
+
+                        else if ( (LA13_0=='*') ) {s = 20;}
+
+                        else if ( (LA13_0=='u') ) {s = 21;}
+
+                        else if ( (LA13_0=='r') ) {s = 22;}
+
+                        else if ( (LA13_0=='d') ) {s = 23;}
+
+                        else if ( (LA13_0==']') ) {s = 24;}
+
+                        else if ( (LA13_0=='&') ) {s = 25;}
+
+                        else if ( (LA13_0=='|') ) {s = 26;}
+
+                        else if ( (LA13_0=='<') ) {s = 27;}
+
+                        else if ( (LA13_0=='=') ) {s = 28;}
+
+                        else if ( (LA13_0=='e') ) {s = 29;}
+
+                        else if ( (LA13_0=='+') ) {s = 30;}
+
+                        else if ( (LA13_0=='/') ) {s = 31;}
+
+                        else if ( (LA13_0=='%') ) {s = 32;}
+
+                        else if ( (LA13_0=='^') ) {s = 33;}
+
+                        else if ( (LA13_0=='>') ) {s = 34;}
+
+                        else if ( (LA13_0=='!') ) {s = 35;}
+
+                        else if ( (LA13_0=='n') ) {s = 36;}
+
+                        else if ( (LA13_0=='$') ) {s = 37;}
+
+                        else if ( (LA13_0=='j') ) {s = 38;}
+
+                        else if ( (LA13_0=='l') ) {s = 39;}
+
+                        else if ( (LA13_0=='w') ) {s = 40;}
+
+                        else if ( (LA13_0==',') ) {s = 41;}
+
+                        else if ( (LA13_0=='{') ) {s = 42;}
+
+                        else if ( (LA13_0=='}') ) {s = 43;}
+
+                        else if ( (LA13_0==')') ) {s = 44;}
+
+                        else if ( (LA13_0=='g') ) {s = 45;}
+
+                        else if ( (LA13_0=='?') ) {s = 46;}
+
+                        else if ( (LA13_0=='~') ) {s = 47;}
+
+                        else if ( ((LA13_0>='0' && LA13_0<='9')) ) {s = 48;}
+
+                        else if ( (LA13_0=='\'') ) {s = 49;}
+
+                        else if ( ((LA13_0>='A' && LA13_0<='Z')||LA13_0=='_'||LA13_0=='h'||LA13_0=='k'||LA13_0=='q'||(LA13_0>='x' && LA13_0<='z')) ) {s = 50;}
+
+                        else if ( (LA13_0=='\"') ) {s = 51;}
+
+                        else if ( ((LA13_0>='\t' && LA13_0<='\n')||LA13_0=='\r'||LA13_0==' ') ) {s = 52;}
+
+                        else if ( ((LA13_0>='\u0000' && LA13_0<='\b')||(LA13_0>='\u000B' && LA13_0<='\f')||(LA13_0>='\u000E' && LA13_0<='\u001F')||LA13_0=='\\'||LA13_0=='`'||(LA13_0>='\u007F' && LA13_0<='\uFFFF')) ) {s = 53;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA13_221 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_221=='\'') ) {s = 393;}
+
+                        else if ( ((LA13_221>='\u0000' && LA13_221<='&')||(LA13_221>='(' && LA13_221<='\uFFFF')) ) {s = 224;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA13_51 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA13_51>='\u0000' && LA13_51<='\uFFFF')) ) {s = 224;}
+
+                        else s = 53;
+
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 13, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+}
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalMLParser.java b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalMLParser.java
new file mode 100644
index 0000000..d0a2b83
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src-gen/org/eclipse/efm/formalml/xtext/ide/contentassist/antlr/internal/InternalFormalMLParser.java
@@ -0,0 +1,269171 @@
+package org.eclipse.efm.formalml.xtext.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+@SuppressWarnings("all")
+interface InternalFormalMLParserSignatures {
+     void entryRuleXlia() throws RecognitionException;
+     void ruleXlia() throws RecognitionException;
+     void entryRuleXliaPrologObject() throws RecognitionException;
+     void ruleXliaPrologObject() throws RecognitionException;
+     void entryRuleXliaPrologAttribute() throws RecognitionException;
+     void ruleXliaPrologAttribute() throws RecognitionException;
+     void entryRuleXliaOptionObject() throws RecognitionException;
+     void ruleXliaOptionObject() throws RecognitionException;
+     void entryRuleXliaNamedElement() throws RecognitionException;
+     void ruleXliaNamedElement() throws RecognitionException;
+     void entryRuleXliaObject() throws RecognitionException;
+     void ruleXliaObject() throws RecognitionException;
+     void entryRuleXliaAttribute() throws RecognitionException;
+     void ruleXliaAttribute() throws RecognitionException;
+     void entryRuleEBoolean() throws RecognitionException;
+     void ruleEBoolean() throws RecognitionException;
+     void entryRuleEInt() throws RecognitionException;
+     void ruleEInt() throws RecognitionException;
+     void entryRuleEInteger() throws RecognitionException;
+     void ruleEInteger() throws RecognitionException;
+     void entryRuleEDouble() throws RecognitionException;
+     void ruleEDouble() throws RecognitionException;
+     void entryRuleECharacter() throws RecognitionException;
+     void ruleECharacter() throws RecognitionException;
+     void entryRuleEString() throws RecognitionException;
+     void ruleEString() throws RecognitionException;
+     void entryRuleESIdentifier() throws RecognitionException;
+     void ruleESIdentifier() throws RecognitionException;
+     void entryRuleESUfid() throws RecognitionException;
+     void ruleESUfid() throws RecognitionException;
+     void entryRuleUnrestrictedName() throws RecognitionException;
+     void ruleUnrestrictedName() throws RecognitionException;
+     void entryRuleUnqualifiedName() throws RecognitionException;
+     void ruleUnqualifiedName() throws RecognitionException;
+     void entryRuleNameBinding() throws RecognitionException;
+     void ruleNameBinding() throws RecognitionException;
+     void entryRuleSystem() throws RecognitionException;
+     void ruleSystem() throws RecognitionException;
+     void entryRuleAnyMachineBlock() throws RecognitionException;
+     void ruleAnyMachineBlock() throws RecognitionException;
+     void entryRuleInstanceMachine() throws RecognitionException;
+     void ruleInstanceMachine() throws RecognitionException;
+     void entryRuleSlotParameter() throws RecognitionException;
+     void ruleSlotParameter() throws RecognitionException;
+     void entryRuleSlotProperty() throws RecognitionException;
+     void ruleSlotProperty() throws RecognitionException;
+     void entryRuleMachineBlock() throws RecognitionException;
+     void ruleMachineBlock() throws RecognitionException;
+     void entryRuleProcedure() throws RecognitionException;
+     void ruleProcedure() throws RecognitionException;
+     void entryRuleProcedureExecution() throws RecognitionException;
+     void ruleProcedureExecution() throws RecognitionException;
+     void entryRuleBehavior() throws RecognitionException;
+     void ruleBehavior() throws RecognitionException;
+     void entryRuleMoeBehavior() throws RecognitionException;
+     void ruleMoeBehavior() throws RecognitionException;
+     void entryRuleStatemachine() throws RecognitionException;
+     void ruleStatemachine() throws RecognitionException;
+     void entryRuleStatemachineRegion() throws RecognitionException;
+     void ruleStatemachineRegion() throws RecognitionException;
+     void entryRuleStatemachineRegionLite() throws RecognitionException;
+     void ruleStatemachineRegionLite() throws RecognitionException;
+     void entryRuleState() throws RecognitionException;
+     void ruleState() throws RecognitionException;
+     void entryRuleCompositeState() throws RecognitionException;
+     void ruleCompositeState() throws RecognitionException;
+     void entryRulemoeCompositeStateRoutines() throws RecognitionException;
+     void rulemoeCompositeStateRoutines() throws RecognitionException;
+     void entryRuleSimpleState() throws RecognitionException;
+     void ruleSimpleState() throws RecognitionException;
+     void entryRulemoeSimpleStateRoutines() throws RecognitionException;
+     void rulemoeSimpleStateRoutines() throws RecognitionException;
+     void entryRuleStartState() throws RecognitionException;
+     void ruleStartState() throws RecognitionException;
+     void entryRulemoeStartStateRoutines() throws RecognitionException;
+     void rulemoeStartStateRoutines() throws RecognitionException;
+     void entryRuleFinalState() throws RecognitionException;
+     void ruleFinalState() throws RecognitionException;
+     void entryRulemoeFinalStateRoutines() throws RecognitionException;
+     void rulemoeFinalStateRoutines() throws RecognitionException;
+     void entryRulePseudostate() throws RecognitionException;
+     void rulePseudostate() throws RecognitionException;
+     void entryRuleOtherPseudostate() throws RecognitionException;
+     void ruleOtherPseudostate() throws RecognitionException;
+     void entryRulePseudostateInitial() throws RecognitionException;
+     void rulePseudostateInitial() throws RecognitionException;
+     void entryRuleEndingPseudostate() throws RecognitionException;
+     void ruleEndingPseudostate() throws RecognitionException;
+     void entryRuleModelOfExecution() throws RecognitionException;
+     void ruleModelOfExecution() throws RecognitionException;
+     void entryRulemoeRoutine() throws RecognitionException;
+     void rulemoeRoutine() throws RecognitionException;
+     void entryRuleRoutine() throws RecognitionException;
+     void ruleRoutine() throws RecognitionException;
+     void entryRuleModelOfInteraction() throws RecognitionException;
+     void ruleModelOfInteraction() throws RecognitionException;
+     void entryRuleRoute() throws RecognitionException;
+     void ruleRoute() throws RecognitionException;
+     void entryRuleComRouteProtocol() throws RecognitionException;
+     void ruleComRouteProtocol() throws RecognitionException;
+     void entryRuleConnection() throws RecognitionException;
+     void ruleConnection() throws RecognitionException;
+     void entryRuleComProtocol() throws RecognitionException;
+     void ruleComProtocol() throws RecognitionException;
+     void entryRuleComPoint() throws RecognitionException;
+     void ruleComPoint() throws RecognitionException;
+     void entryRuleComPointProtocol() throws RecognitionException;
+     void ruleComPointProtocol() throws RecognitionException;
+     void entryRuleComElement() throws RecognitionException;
+     void ruleComElement() throws RecognitionException;
+     void entryRuleTypeDefinition() throws RecognitionException;
+     void ruleTypeDefinition() throws RecognitionException;
+     void entryRuleDataTypeMultiplicity() throws RecognitionException;
+     void ruleDataTypeMultiplicity() throws RecognitionException;
+     void entryRuleDataTypeReference() throws RecognitionException;
+     void ruleDataTypeReference() throws RecognitionException;
+     void entryRuleOtherDataTypeDefinition() throws RecognitionException;
+     void ruleOtherDataTypeDefinition() throws RecognitionException;
+     void entryRuleOtherDataTypeDefinitionImpl() throws RecognitionException;
+     void ruleOtherDataTypeDefinitionImpl() throws RecognitionException;
+     void entryRuleDataType() throws RecognitionException;
+     void ruleDataType() throws RecognitionException;
+     void entryRuleSimpleDataType() throws RecognitionException;
+     void ruleSimpleDataType() throws RecognitionException;
+     void entryRuleStructuredDataType() throws RecognitionException;
+     void ruleStructuredDataType() throws RecognitionException;
+     void entryRulePrimitiveType() throws RecognitionException;
+     void rulePrimitiveType() throws RecognitionException;
+     void entryRulePrimitiveNumberType() throws RecognitionException;
+     void rulePrimitiveNumberType() throws RecognitionException;
+     void entryRulePrimitiveIntegerType() throws RecognitionException;
+     void rulePrimitiveIntegerType() throws RecognitionException;
+     void entryRulePrimitiveRationalType() throws RecognitionException;
+     void rulePrimitiveRationalType() throws RecognitionException;
+     void entryRulePrimitiveFloatType() throws RecognitionException;
+     void rulePrimitiveFloatType() throws RecognitionException;
+     void entryRulePrimitiveRealType() throws RecognitionException;
+     void rulePrimitiveRealType() throws RecognitionException;
+     void entryRulePrimitiveTimeType() throws RecognitionException;
+     void rulePrimitiveTimeType() throws RecognitionException;
+     void entryRulePrimitiveTimeNumberType() throws RecognitionException;
+     void rulePrimitiveTimeNumberType() throws RecognitionException;
+     void entryRuleOtherPrimitiveType() throws RecognitionException;
+     void ruleOtherPrimitiveType() throws RecognitionException;
+     void entryRulePrimitiveBooleanType() throws RecognitionException;
+     void rulePrimitiveBooleanType() throws RecognitionException;
+     void entryRulePrimitiveCharacterType() throws RecognitionException;
+     void rulePrimitiveCharacterType() throws RecognitionException;
+     void entryRulePrimitiveStringType() throws RecognitionException;
+     void rulePrimitiveStringType() throws RecognitionException;
+     void entryRulePrimitiveInstanceType() throws RecognitionException;
+     void rulePrimitiveInstanceType() throws RecognitionException;
+     void entryRuleIntervalType() throws RecognitionException;
+     void ruleIntervalType() throws RecognitionException;
+     void entryRuleIntervalTypeDefinition() throws RecognitionException;
+     void ruleIntervalTypeDefinition() throws RecognitionException;
+     void entryRuleIntervalTypeDefinitionImpl() throws RecognitionException;
+     void ruleIntervalTypeDefinitionImpl() throws RecognitionException;
+     void entryRuleCollectionType() throws RecognitionException;
+     void ruleCollectionType() throws RecognitionException;
+     void entryRuleCollectionTypeDefinition() throws RecognitionException;
+     void ruleCollectionTypeDefinition() throws RecognitionException;
+     void entryRuleCollectionTypeDefinitionImpl() throws RecognitionException;
+     void ruleCollectionTypeDefinitionImpl() throws RecognitionException;
+     void entryRuleEnumerationType() throws RecognitionException;
+     void ruleEnumerationType() throws RecognitionException;
+     void entryRuleEnumerationTypeDefinition() throws RecognitionException;
+     void ruleEnumerationTypeDefinition() throws RecognitionException;
+     void entryRuleEnumerationTypeDefinitionImpl() throws RecognitionException;
+     void ruleEnumerationTypeDefinitionImpl() throws RecognitionException;
+     void entryRuleEnumerationLiteral() throws RecognitionException;
+     void ruleEnumerationLiteral() throws RecognitionException;
+     void entryRuleStructureType() throws RecognitionException;
+     void ruleStructureType() throws RecognitionException;
+     void entryRuleStructureTypeDefinition() throws RecognitionException;
+     void ruleStructureTypeDefinition() throws RecognitionException;
+     void entryRuleStructureTypeDefinitionImpl() throws RecognitionException;
+     void ruleStructureTypeDefinitionImpl() throws RecognitionException;
+     void entryRuleUnionType() throws RecognitionException;
+     void ruleUnionType() throws RecognitionException;
+     void entryRuleUnionTypeDefinition() throws RecognitionException;
+     void ruleUnionTypeDefinition() throws RecognitionException;
+     void entryRuleUnionTypeDefinitionImpl() throws RecognitionException;
+     void ruleUnionTypeDefinitionImpl() throws RecognitionException;
+     void entryRuleChoiceType() throws RecognitionException;
+     void ruleChoiceType() throws RecognitionException;
+     void entryRuleChoiceTypeDefinition() throws RecognitionException;
+     void ruleChoiceTypeDefinition() throws RecognitionException;
+     void entryRuleChoiceTypeDefinitionImpl() throws RecognitionException;
+     void ruleChoiceTypeDefinitionImpl() throws RecognitionException;
+     void entryRuleModifier() throws RecognitionException;
+     void ruleModifier() throws RecognitionException;
+     void entryRuleVariable() throws RecognitionException;
+     void ruleVariable() throws RecognitionException;
+     void entryRuleOnWriteRoutine() throws RecognitionException;
+     void ruleOnWriteRoutine() throws RecognitionException;
+     void entryRuleVariableRoutineParameter() throws RecognitionException;
+     void ruleVariableRoutineParameter() throws RecognitionException;
+     void entryRuleVariablePublic() throws RecognitionException;
+     void ruleVariablePublic() throws RecognitionException;
+     void entryRuleVariableProtected() throws RecognitionException;
+     void ruleVariableProtected() throws RecognitionException;
+     void entryRuleVariablePrivate() throws RecognitionException;
+     void ruleVariablePrivate() throws RecognitionException;
+     void entryRuleFunctionalParameterSet() throws RecognitionException;
+     void ruleFunctionalParameterSet() throws RecognitionException;
+     void entryRuleFunctionalParameter() throws RecognitionException;
+     void ruleFunctionalParameter() throws RecognitionException;
+     void entryRuleFormalParameterSet() throws RecognitionException;
+     void ruleFormalParameterSet() throws RecognitionException;
+     void entryRuleFormalParameter() throws RecognitionException;
+     void ruleFormalParameter() throws RecognitionException;
+     void entryRuleParameterInput() throws RecognitionException;
+     void ruleParameterInput() throws RecognitionException;
+     void entryRuleParameterInout() throws RecognitionException;
+     void ruleParameterInout() throws RecognitionException;
+     void entryRuleParameterOutput() throws RecognitionException;
+     void ruleParameterOutput() throws RecognitionException;
+     void entryRuleParameterReturn() throws RecognitionException;
+     void ruleParameterReturn() throws RecognitionException;
+     void entryRuleBufferContainerType() throws RecognitionException;
+     void ruleBufferContainerType() throws RecognitionException;
+     void entryRuleBuffer() throws RecognitionException;
+     void ruleBuffer() throws RecognitionException;
+     void entryRuleBufferPublic() throws RecognitionException;
+     void ruleBufferPublic() throws RecognitionException;
+     void entryRuleBufferProtected() throws RecognitionException;
+     void ruleBufferProtected() throws RecognitionException;
+     void entryRuleBufferPrivate() throws RecognitionException;
+     void ruleBufferPrivate() throws RecognitionException;
+     void entryRulePort() throws RecognitionException;
+     void rulePort() throws RecognitionException;
+     void entryRulePortPublic() throws RecognitionException;
+     void rulePortPublic() throws RecognitionException;
+     void entryRulePortProtected() throws RecognitionException;
+     void rulePortProtected() throws RecognitionException;
+     void entryRulePortPrivate() throws RecognitionException;
+     void rulePortPrivate() throws RecognitionException;
+     void entryRuleSignal() throws RecognitionException;
+     void ruleSignal() throws RecognitionException;
+     void entryRuleSignalPublic() throws RecognitionException;
+     void ruleSignalPublic() throws RecognitionException;
+     void entryRuleSignalProtected() throws RecognitionException;
+     void ruleSignalProtected() throws RecognitionException;
+     void entryRuleSignalPrivate() throws RecognitionException;
+     void ruleSignalPrivate() throws RecognitionException;
+     void entryRuleChannel() throws RecognitionException;
+     void ruleChannel() throws RecognitionException;
+     void entryRuleSignalReference() throws RecognitionException;
+     void ruleSignalReference() throws RecognitionException;
+     void entryRuleChannelPublic() throws RecognitionException;
+     void ruleChannelPublic() throws RecognitionException;
+     void entryRuleChannelProtected() throws RecognitionException;
+     void ruleChannelProtected() throws RecognitionException;
+     void entryRuleChannelPrivate() throws RecognitionException;
+     void ruleChannelPrivate() throws RecognitionException;
+     void entryRuleTransition() throws RecognitionException;
+     void ruleTransition() throws RecognitionException;
+     void entryRuleTransitionMoe() throws RecognitionException;
+     void ruleTransitionMoe() throws RecognitionException;
+     void entryRuleTransitionBehavior() throws RecognitionException;
+     void ruleTransitionBehavior() throws RecognitionException;
+     void entryRuleTransitionTrigger() throws RecognitionException;
+     void ruleTransitionTrigger() throws RecognitionException;
+     void entryRuleTransitionGuard() throws RecognitionException;
+     void ruleTransitionGuard() throws RecognitionException;
+     void entryRuleTransitionGuardExpression() throws RecognitionException;
+     void ruleTransitionGuardExpression() throws RecognitionException;
+     void entryRuleTransitionTimedGuard() throws RecognitionException;
+     void ruleTransitionTimedGuard() throws RecognitionException;
+     void entryRuleTransitionEffect() throws RecognitionException;
+     void ruleTransitionEffect() throws RecognitionException;
+     void entryRuleTransitionEffectStatement() throws RecognitionException;
+     void ruleTransitionEffectStatement() throws RecognitionException;
+     void entryRuleStatement() throws RecognitionException;
+     void ruleStatement() throws RecognitionException;
+     void entryRuleBlockStatement() throws RecognitionException;
+     void ruleBlockStatement() throws RecognitionException;
+     void entryRuleBlockStatementScheduler() throws RecognitionException;
+     void ruleBlockStatementScheduler() throws RecognitionException;
+     void entryRuleExpressionStatement() throws RecognitionException;
+     void ruleExpressionStatement() throws RecognitionException;
+     void entryRuleGuardStatement() throws RecognitionException;
+     void ruleGuardStatement() throws RecognitionException;
+     void entryRuleTimedGuardStatement() throws RecognitionException;
+     void ruleTimedGuardStatement() throws RecognitionException;
+     void entryRuleEventGuardStatement() throws RecognitionException;
+     void ruleEventGuardStatement() throws RecognitionException;
+     void entryRuleCheckSatGuardStatement() throws RecognitionException;
+     void ruleCheckSatGuardStatement() throws RecognitionException;
+     void entryRuleInputComStatement() throws RecognitionException;
+     void ruleInputComStatement() throws RecognitionException;
+     void entryRuleOutputComStatement() throws RecognitionException;
+     void ruleOutputComStatement() throws RecognitionException;
+     void entryRuleExpressionAsMachine() throws RecognitionException;
+     void ruleExpressionAsMachine() throws RecognitionException;
+     void entryRuleIfStatement() throws RecognitionException;
+     void ruleIfStatement() throws RecognitionException;
+     void entryRuleElseIfStatement() throws RecognitionException;
+     void ruleElseIfStatement() throws RecognitionException;
+     void entryRuleWhileDoStatement() throws RecognitionException;
+     void ruleWhileDoStatement() throws RecognitionException;
+     void entryRuleDoWhileStatement() throws RecognitionException;
+     void ruleDoWhileStatement() throws RecognitionException;
+     void entryRuleForStatement() throws RecognitionException;
+     void ruleForStatement() throws RecognitionException;
+     void entryRuleForAssignmentExpression() throws RecognitionException;
+     void ruleForAssignmentExpression() throws RecognitionException;
+     void entryRuleForEachStatement() throws RecognitionException;
+     void ruleForEachStatement() throws RecognitionException;
+     void entryRuleInterruptStatement() throws RecognitionException;
+     void ruleInterruptStatement() throws RecognitionException;
+     void entryRuleActivityStatement() throws RecognitionException;
+     void ruleActivityStatement() throws RecognitionException;
+     void entryRuleInvokeStatement() throws RecognitionException;
+     void ruleInvokeStatement() throws RecognitionException;
+     void entryRuleExpression() throws RecognitionException;
+     void ruleExpression() throws RecognitionException;
+     void entryRuleAssignmentExpression() throws RecognitionException;
+     void ruleAssignmentExpression() throws RecognitionException;
+     void entryRuleAssignmentOperator() throws RecognitionException;
+     void ruleAssignmentOperator() throws RecognitionException;
+     void entryRuleLeftHandSideExpression() throws RecognitionException;
+     void ruleLeftHandSideExpression() throws RecognitionException;
+     void entryRuleConditionalTestExpression() throws RecognitionException;
+     void ruleConditionalTestExpression() throws RecognitionException;
+     void entryRuleLogicalOrExpression() throws RecognitionException;
+     void ruleLogicalOrExpression() throws RecognitionException;
+     void entryRuleLogicalAndExpression() throws RecognitionException;
+     void ruleLogicalAndExpression() throws RecognitionException;
+     void entryRuleBitwiseOrExpression() throws RecognitionException;
+     void ruleBitwiseOrExpression() throws RecognitionException;
+     void entryRuleBitwiseXorExpression() throws RecognitionException;
+     void ruleBitwiseXorExpression() throws RecognitionException;
+     void entryRuleBitwiseAndExpression() throws RecognitionException;
+     void ruleBitwiseAndExpression() throws RecognitionException;
+     void entryRuleEqualityExpression() throws RecognitionException;
+     void ruleEqualityExpression() throws RecognitionException;
+     void entryRuleEqualityOperator() throws RecognitionException;
+     void ruleEqualityOperator() throws RecognitionException;
+     void entryRuleRelationalExpression() throws RecognitionException;
+     void ruleRelationalExpression() throws RecognitionException;
+     void entryRuleRelationalOperator() throws RecognitionException;
+     void ruleRelationalOperator() throws RecognitionException;
+     void entryRuleAdditiveExpression() throws RecognitionException;
+     void ruleAdditiveExpression() throws RecognitionException;
+     void entryRuleMultiplicativeExpression() throws RecognitionException;
+     void ruleMultiplicativeExpression() throws RecognitionException;
+     void entryRuleUnaryExpression() throws RecognitionException;
+     void ruleUnaryExpression() throws RecognitionException;
+     void entryRulePostfixUnaryExpression() throws RecognitionException;
+     void rulePostfixUnaryExpression() throws RecognitionException;
+     void entryRuleIncrementOrDecrementPostfixExpression() throws RecognitionException;
+     void ruleIncrementOrDecrementPostfixExpression() throws RecognitionException;
+     void entryRulePrefixUnaryExpression() throws RecognitionException;
+     void rulePrefixUnaryExpression() throws RecognitionException;
+     void entryRuleIncrementOrDecrementPrefixExpression() throws RecognitionException;
+     void ruleIncrementOrDecrementPrefixExpression() throws RecognitionException;
+     void entryRuleAffixOperator() throws RecognitionException;
+     void ruleAffixOperator() throws RecognitionException;
+     void entryRuleNewfreshExpression() throws RecognitionException;
+     void ruleNewfreshExpression() throws RecognitionException;
+     void entryRuleCastExpression() throws RecognitionException;
+     void ruleCastExpression() throws RecognitionException;
+     void entryRuleArithmeticUnaryExpression() throws RecognitionException;
+     void ruleArithmeticUnaryExpression() throws RecognitionException;
+     void entryRuleArithmeticUnaryOperator() throws RecognitionException;
+     void ruleArithmeticUnaryOperator() throws RecognitionException;
+     void entryRuleLogicalUnaryExpression() throws RecognitionException;
+     void ruleLogicalUnaryExpression() throws RecognitionException;
+     void entryRuleBitwiseUnaryExpression() throws RecognitionException;
+     void ruleBitwiseUnaryExpression() throws RecognitionException;
+     void entryRulePrimaryExpression() throws RecognitionException;
+     void rulePrimaryExpression() throws RecognitionException;
+     void entryRuleBaseExpression() throws RecognitionException;
+     void ruleBaseExpression() throws RecognitionException;
+     void entryRuleInvokeExpressionDeprecated() throws RecognitionException;
+     void ruleInvokeExpressionDeprecated() throws RecognitionException;
+     void entryRuleInstantiationExpression() throws RecognitionException;
+     void ruleInstantiationExpression() throws RecognitionException;
+     void entryRuleDynamicInstanceSpecification() throws RecognitionException;
+     void ruleDynamicInstanceSpecification() throws RecognitionException;
+     void entryRuleTupleParameterExpression() throws RecognitionException;
+     void ruleTupleParameterExpression() throws RecognitionException;
+     void entryRuleMixTupleExpressionList() throws RecognitionException;
+     void ruleMixTupleExpressionList() throws RecognitionException;
+     void entryRulePositionalTupleExpressionList() throws RecognitionException;
+     void rulePositionalTupleExpressionList() throws RecognitionException;
+     void entryRuleNamedExpression() throws RecognitionException;
+     void ruleNamedExpression() throws RecognitionException;
+     void entryRuleLiteralReferenceableExpression() throws RecognitionException;
+     void ruleLiteralReferenceableExpression() throws RecognitionException;
+     void entryRuleLiteralTerminalExpression() throws RecognitionException;
+     void ruleLiteralTerminalExpression() throws RecognitionException;
+     void entryRuleLiteralBooleanExpression() throws RecognitionException;
+     void ruleLiteralBooleanExpression() throws RecognitionException;
+     void entryRuleLiteralIntegerExpression() throws RecognitionException;
+     void ruleLiteralIntegerExpression() throws RecognitionException;
+     void entryRuleLiteralRationalExpression() throws RecognitionException;
+     void ruleLiteralRationalExpression() throws RecognitionException;
+     void entryRuleLiteralFloatExpression() throws RecognitionException;
+     void ruleLiteralFloatExpression() throws RecognitionException;
+     void entryRuleLiteralCharacterExpression() throws RecognitionException;
+     void ruleLiteralCharacterExpression() throws RecognitionException;
+     void entryRuleLiteralStringExpression() throws RecognitionException;
+     void ruleLiteralStringExpression() throws RecognitionException;
+     void entryRuleLiteralNullExpression() throws RecognitionException;
+     void ruleLiteralNullExpression() throws RecognitionException;
+     void entryRuleLiteralCollectionExpression() throws RecognitionException;
+     void ruleLiteralCollectionExpression() throws RecognitionException;
+     void entryRuleLiteralReferenceExpression() throws RecognitionException;
+     void ruleLiteralReferenceExpression() throws RecognitionException;
+     void entryRuleLiteralReferenceElement() throws RecognitionException;
+     void ruleLiteralReferenceElement() throws RecognitionException;
+     void entryRuleLiteralPureReferenceElement() throws RecognitionException;
+     void ruleLiteralPureReferenceElement() throws RecognitionException;
+     void entryRuleLiteralReferenceVariableContext() throws RecognitionException;
+     void ruleLiteralReferenceVariableContext() throws RecognitionException;
+     void entryRuleLiteralTimeExpression() throws RecognitionException;
+     void ruleLiteralTimeExpression() throws RecognitionException;
+     void entryRuleLiteralTimeDeltaExpression() throws RecognitionException;
+     void ruleLiteralTimeDeltaExpression() throws RecognitionException;
+     void entryRuleLiteralReferenceMachineContext() throws RecognitionException;
+     void ruleLiteralReferenceMachineContext() throws RecognitionException;
+     void entryRuleLiteralThisExpression() throws RecognitionException;
+     void ruleLiteralThisExpression() throws RecognitionException;
+     void entryRuleLiteralSelfExpression() throws RecognitionException;
+     void ruleLiteralSelfExpression() throws RecognitionException;
+     void entryRuleLiteralParentExpression() throws RecognitionException;
+     void ruleLiteralParentExpression() throws RecognitionException;
+     void entryRuleLiteralSuperExpression() throws RecognitionException;
+     void ruleLiteralSuperExpression() throws RecognitionException;
+     void entryRuleLiteralSystemExpression() throws RecognitionException;
+     void ruleLiteralSystemExpression() throws RecognitionException;
+     void entryRuleLiteralEnvExpression() throws RecognitionException;
+     void ruleLiteralEnvExpression() throws RecognitionException;
+     void entryRuleLiteralPureReferenceExpression() throws RecognitionException;
+     void ruleLiteralPureReferenceExpression() throws RecognitionException;
+     void entryRuleValueSelectionExpression() throws RecognitionException;
+     void ruleValueSelectionExpression() throws RecognitionException;
+     void entryRuleValuePureNamedMachineExpression() throws RecognitionException;
+     void ruleValuePureNamedMachineExpression() throws RecognitionException;
+     void ruleVisibilityKind() throws RecognitionException;
+     void ruleDesignKind() throws RecognitionException;
+     void rulePseudostateKind() throws RecognitionException;
+     void rulePseudostateInitialKind() throws RecognitionException;
+     void ruleEndingPseudostateKind() throws RecognitionException;
+     void ruleComProtocolKind() throws RecognitionException;
+     void ruleComEnvRdvProtocolKind() throws RecognitionException;
+     void ruleComMultiRdvProtocolKind() throws RecognitionException;
+     void ruleBufferProtocolKind() throws RecognitionException;
+     void ruleComCastKing() throws RecognitionException;
+     void rulePrimitiveNumberSign() throws RecognitionException;
+     void rulePrimitiveInstanceKind() throws RecognitionException;
+     void ruleCollectionKind() throws RecognitionException;
+     void rulePublicVariableVisibilityKind() throws RecognitionException;
+     void ruleProtectedVariableVisibilityKind() throws RecognitionException;
+     void rulePrivateVariableVisibilityKind() throws RecognitionException;
+     void ruleParameterDirectionKind() throws RecognitionException;
+     void ruleBlockParameterDirectionKind() throws RecognitionException;
+     void ruleParameterInputDirectionKind() throws RecognitionException;
+     void ruleParameterInoutDirectionKind() throws RecognitionException;
+     void ruleParameterOutputDirectionKind() throws RecognitionException;
+     void ruleParameterReturnDirectionKind() throws RecognitionException;
+     void ruleBufferContainerKind() throws RecognitionException;
+     void rulePublicBufferVisibilityKind() throws RecognitionException;
+     void ruleProtectedBufferVisibilityKind() throws RecognitionException;
+     void rulePrivateBufferVisibilityKind() throws RecognitionException;
+     void rulePublicPortVisibilityKind() throws RecognitionException;
+     void ruleProtectedPortVisibilityKind() throws RecognitionException;
+     void rulePrivatePortVisibilityKind() throws RecognitionException;
+     void rulePublicSignalVisibilityKind() throws RecognitionException;
+     void ruleProtectedSignalVisibilityKind() throws RecognitionException;
+     void rulePrivateSignalVisibilityKind() throws RecognitionException;
+     void ruleChannelDirection() throws RecognitionException;
+     void rulePublicChannelVisibilityKind() throws RecognitionException;
+     void ruleProtectedChannelVisibilityKind() throws RecognitionException;
+     void rulePrivateChannelVisibilityKind() throws RecognitionException;
+     void ruleTransitionMoc() throws RecognitionException;
+     void ruleInterruptStatementKind() throws RecognitionException;
+     void ruleOPERATOR_ACTIVITY() throws RecognitionException;
+     void ruleValueDotFieldExpressionKind() throws RecognitionException;
+     void ruleValueArrowFieldExpressionKind() throws RecognitionException;
+     void ruleValueIndexExpressionKind() throws RecognitionException;
+     void ruleValueParameterExpressionKind() throws RecognitionException;
+     void rule__XliaPrologObject__NameAlternatives_0_0() throws RecognitionException;
+     void rule__XliaPrologAttribute__NameAlternatives_0_0() throws RecognitionException;
+     void rule__XliaPrologAttribute__ValueAlternatives_1_1_0() throws RecognitionException;
+     void rule__XliaNamedElement__Alternatives() throws RecognitionException;
+     void rule__EBoolean__Alternatives() throws RecognitionException;
+     void rule__ESUfid__Alternatives_1_0() throws RecognitionException;
+     void rule__System__Alternatives_0_1() throws RecognitionException;
+     void rule__System__Alternatives_2_2() throws RecognitionException;
+     void rule__System__Alternatives_6() throws RecognitionException;
+     void rule__System__Alternatives_7() throws RecognitionException;
+     void rule__System__Alternatives_7_0_1() throws RecognitionException;
+     void rule__System__Alternatives_7_1_1() throws RecognitionException;
+     void rule__System__Alternatives_7_2_1() throws RecognitionException;
+     void rule__System__Alternatives_7_3_1() throws RecognitionException;
+     void rule__System__Alternatives_8() throws RecognitionException;
+     void rule__System__Alternatives_8_0() throws RecognitionException;
+     void rule__System__Alternatives_8_0_0_0() throws RecognitionException;
+     void rule__System__Alternatives_8_1() throws RecognitionException;
+     void rule__System__Alternatives_9() throws RecognitionException;
+     void rule__System__Alternatives_9_0_0() throws RecognitionException;
+     void rule__System__Alternatives_9_0_1() throws RecognitionException;
+     void rule__System__Alternatives_10() throws RecognitionException;
+     void rule__AnyMachineBlock__Alternatives() throws RecognitionException;
+     void rule__InstanceMachine__Alternatives_1() throws RecognitionException;
+     void rule__InstanceMachine__Alternatives_8() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_0_1() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_2_2() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_6() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_7() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_7_0_1() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_7_1_1() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_7_2_1() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_7_3_1() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_8() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_8_0() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_8_0_0_0() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_8_1() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_9() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_9_0_0() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_9_0_1() throws RecognitionException;
+     void rule__MachineBlock__Alternatives_10() throws RecognitionException;
+     void rule__Procedure__Alternatives_2_2() throws RecognitionException;
+     void rule__Procedure__Alternatives_5_1_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_7() throws RecognitionException;
+     void rule__Procedure__Alternatives_7_0_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_7_0_1_0_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_7_0_1_1_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_7_0_1_2_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_7_0_1_3_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_7_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_8() throws RecognitionException;
+     void rule__Procedure__Alternatives_8_0_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_8_1_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_8_2_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_8_3_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_9() throws RecognitionException;
+     void rule__Procedure__Alternatives_9_0_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_9_1_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_9_2_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_9_3_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_10() throws RecognitionException;
+     void rule__Procedure__Alternatives_10_0() throws RecognitionException;
+     void rule__Procedure__Alternatives_10_0_0_0() throws RecognitionException;
+     void rule__Procedure__Alternatives_10_1() throws RecognitionException;
+     void rule__Procedure__Alternatives_11() throws RecognitionException;
+     void rule__MoeBehavior__Alternatives_1_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_1_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_3_2() throws RecognitionException;
+     void rule__Statemachine__Alternatives_7() throws RecognitionException;
+     void rule__Statemachine__Alternatives_7_0_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_7_0_1_0_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_7_0_1_1_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_7_0_1_2_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_7_0_1_3_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_7_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_8() throws RecognitionException;
+     void rule__Statemachine__Alternatives_8_0_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_8_1_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_8_2_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_8_3_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_9() throws RecognitionException;
+     void rule__Statemachine__Alternatives_9_0_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_9_1_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_9_2_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_9_3_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_10() throws RecognitionException;
+     void rule__Statemachine__Alternatives_10_0() throws RecognitionException;
+     void rule__Statemachine__Alternatives_10_0_0_0() throws RecognitionException;
+     void rule__Statemachine__Alternatives_10_1() throws RecognitionException;
+     void rule__Statemachine__Alternatives_11() throws RecognitionException;
+     void rule__StatemachineRegion__Alternatives_1() throws RecognitionException;
+     void rule__StatemachineRegion__Alternatives_1_0() throws RecognitionException;
+     void rule__StatemachineRegion__Alternatives_1_1_0() throws RecognitionException;
+     void rule__StatemachineRegion__Alternatives_2() throws RecognitionException;
+     void rule__StatemachineRegionLite__Alternatives() throws RecognitionException;
+     void rule__State__Alternatives() throws RecognitionException;
+     void rule__CompositeState__Alternatives_4() throws RecognitionException;
+     void rule__CompositeState__Alternatives_8() throws RecognitionException;
+     void rule__CompositeState__Alternatives_8_0_1() throws RecognitionException;
+     void rule__CompositeState__Alternatives_8_0_1_0() throws RecognitionException;
+     void rule__CompositeState__Alternatives_8_0_1_1_1() throws RecognitionException;
+     void rule__MoeCompositeStateRoutines__NameAlternatives_1_0() throws RecognitionException;
+     void rule__SimpleState__Alternatives_5() throws RecognitionException;
+     void rule__SimpleState__Alternatives_5_0_1() throws RecognitionException;
+     void rule__MoeSimpleStateRoutines__NameAlternatives_1_0() throws RecognitionException;
+     void rule__StartState__Alternatives_1() throws RecognitionException;
+     void rule__StartState__Alternatives_3() throws RecognitionException;
+     void rule__StartState__Alternatives_3_0_1() throws RecognitionException;
+     void rule__MoeStartStateRoutines__NameAlternatives_1_0() throws RecognitionException;
+     void rule__FinalState__Alternatives_1() throws RecognitionException;
+     void rule__FinalState__Alternatives_3() throws RecognitionException;
+     void rule__MoeFinalStateRoutines__NameAlternatives_1_0() throws RecognitionException;
+     void rule__Pseudostate__Alternatives() throws RecognitionException;
+     void rule__OtherPseudostate__Alternatives_1() throws RecognitionException;
+     void rule__OtherPseudostate__Alternatives_8() throws RecognitionException;
+     void rule__PseudostateInitial__Alternatives_1() throws RecognitionException;
+     void rule__PseudostateInitial__Alternatives_1_0_0() throws RecognitionException;
+     void rule__PseudostateInitial__NameAlternatives_1_0_5_0() throws RecognitionException;
+     void rule__PseudostateInitial__NameAlternatives_1_1_0() throws RecognitionException;
+     void rule__PseudostateInitial__Alternatives_3() throws RecognitionException;
+     void rule__EndingPseudostate__Alternatives_1() throws RecognitionException;
+     void rule__EndingPseudostate__Alternatives_8() throws RecognitionException;
+     void rule__MoeRoutine__Alternatives_2_1() throws RecognitionException;
+     void rule__Routine__Alternatives_6_1() throws RecognitionException;
+     void rule__ModelOfInteraction__Alternatives_2() throws RecognitionException;
+     void rule__Route__Alternatives_7() throws RecognitionException;
+     void rule__ComRouteProtocol__Alternatives() throws RecognitionException;
+     void rule__ComRouteProtocol__Alternatives_1_1() throws RecognitionException;
+     void rule__ComRouteProtocol__Alternatives_1_1_0_1() throws RecognitionException;
+     void rule__ComRouteProtocol__Alternatives_1_1_1_1() throws RecognitionException;
+     void rule__ComProtocol__Alternatives() throws RecognitionException;
+     void rule__ComProtocol__Alternatives_2_1() throws RecognitionException;
+     void rule__ComProtocol__Alternatives_2_1_0_1() throws RecognitionException;
+     void rule__ComProtocol__Alternatives_2_1_1_1() throws RecognitionException;
+     void rule__ComPoint__Alternatives_3() throws RecognitionException;
+     void rule__ComPointProtocol__Alternatives() throws RecognitionException;
+     void rule__ComPointProtocol__Alternatives_0_1() throws RecognitionException;
+     void rule__ComPointProtocol__Alternatives_0_1_0_1() throws RecognitionException;
+     void rule__ComPointProtocol__Alternatives_0_1_1_1() throws RecognitionException;
+     void rule__ComElement__Alternatives() throws RecognitionException;
+     void rule__ComElement__KindAlternatives_0_1_1_0() throws RecognitionException;
+     void rule__ComElement__KindAlternatives_1_2_0() throws RecognitionException;
+     void rule__TypeDefinition__Alternatives() throws RecognitionException;
+     void rule__DataTypeMultiplicity__Alternatives() throws RecognitionException;
+     void rule__DataTypeReference__Alternatives() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Alternatives_5() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Alternatives_3() throws RecognitionException;
+     void rule__DataType__Alternatives() throws RecognitionException;
+     void rule__SimpleDataType__Alternatives() throws RecognitionException;
+     void rule__StructuredDataType__Alternatives() throws RecognitionException;
+     void rule__PrimitiveType__Alternatives() throws RecognitionException;
+     void rule__PrimitiveNumberType__Alternatives() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Alternatives_2() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Alternatives_3() throws RecognitionException;
+     void rule__PrimitiveRationalType__Alternatives_2() throws RecognitionException;
+     void rule__PrimitiveRationalType__Alternatives_3() throws RecognitionException;
+     void rule__PrimitiveFloatType__Alternatives_2() throws RecognitionException;
+     void rule__PrimitiveFloatType__Alternatives_3() throws RecognitionException;
+     void rule__PrimitiveRealType__Alternatives_2() throws RecognitionException;
+     void rule__PrimitiveRealType__Alternatives_3() throws RecognitionException;
+     void rule__PrimitiveTimeType__Alternatives() throws RecognitionException;
+     void rule__PrimitiveTimeType__Alternatives_0_2() throws RecognitionException;
+     void rule__PrimitiveTimeType__Alternatives_1_2() throws RecognitionException;
+     void rule__PrimitiveTimeNumberType__Alternatives() throws RecognitionException;
+     void rule__OtherPrimitiveType__Alternatives() throws RecognitionException;
+     void rule__PrimitiveBooleanType__Alternatives_1() throws RecognitionException;
+     void rule__PrimitiveStringType__Alternatives_2() throws RecognitionException;
+     void rule__IntervalType__Alternatives_4() throws RecognitionException;
+     void rule__IntervalType__Alternatives_8() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Alternatives_8() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Alternatives_12() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Alternatives_6() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Alternatives_10() throws RecognitionException;
+     void rule__CollectionType__Alternatives_4_1() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Alternatives_8_1() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Alternatives_6_1() throws RecognitionException;
+     void rule__Variable__Alternatives_1() throws RecognitionException;
+     void rule__Variable__Alternatives_1_2_0() throws RecognitionException;
+     void rule__Variable__Alternatives_1_3_1() throws RecognitionException;
+     void rule__Variable__Alternatives_6() throws RecognitionException;
+     void rule__VariablePublic__Alternatives_1_0() throws RecognitionException;
+     void rule__VariablePublic__Alternatives_7() throws RecognitionException;
+     void rule__VariableProtected__Alternatives_1_0() throws RecognitionException;
+     void rule__VariableProtected__Alternatives_7() throws RecognitionException;
+     void rule__VariablePrivate__Alternatives_1_0() throws RecognitionException;
+     void rule__VariablePrivate__Alternatives_7() throws RecognitionException;
+     void rule__BufferContainerType__Alternatives_2_1() throws RecognitionException;
+     void rule__Transition__Alternatives_5() throws RecognitionException;
+     void rule__Transition__Alternatives_5_0_1() throws RecognitionException;
+     void rule__Transition__Alternatives_5_0_1_0_1() throws RecognitionException;
+     void rule__Transition__Alternatives_5_0_1_0_2() throws RecognitionException;
+     void rule__Transition__Alternatives_5_1_2() throws RecognitionException;
+     void rule__Transition__Alternatives_5_1_2_0_1() throws RecognitionException;
+     void rule__Transition__Alternatives_5_1_2_0_1_0_1() throws RecognitionException;
+     void rule__Transition__Alternatives_5_1_2_0_1_0_2() throws RecognitionException;
+     void rule__TransitionMoe__Alternatives_1() throws RecognitionException;
+     void rule__TransitionMoe__Alternatives_1_0_1() throws RecognitionException;
+     void rule__TransitionGuard__Alternatives() throws RecognitionException;
+     void rule__TransitionGuard__Alternatives_1_1() throws RecognitionException;
+     void rule__TransitionGuard__Alternatives_1_1_0_1() throws RecognitionException;
+     void rule__TransitionGuardExpression__OperatorAlternatives_1_0() throws RecognitionException;
+     void rule__TransitionTimedGuard__Alternatives() throws RecognitionException;
+     void rule__TransitionTimedGuard__Alternatives_1_1() throws RecognitionException;
+     void rule__TransitionTimedGuard__Alternatives_1_1_0_1() throws RecognitionException;
+     void rule__TransitionEffectStatement__Alternatives() throws RecognitionException;
+     void rule__Statement__Alternatives() throws RecognitionException;
+     void rule__BlockStatementScheduler__Alternatives() throws RecognitionException;
+     void rule__ExpressionStatement__Alternatives() throws RecognitionException;
+     void rule__InputComStatement__Alternatives_3_1_0() throws RecognitionException;
+     void rule__OutputComStatement__Alternatives_3_1_0() throws RecognitionException;
+     void rule__ElseIfStatement__Alternatives_0() throws RecognitionException;
+     void rule__ForStatement__Alternatives() throws RecognitionException;
+     void rule__ForAssignmentExpression__Alternatives() throws RecognitionException;
+     void rule__ForEachStatement__Alternatives() throws RecognitionException;
+     void rule__InterruptStatement__Alternatives_1() throws RecognitionException;
+     void rule__InvokeStatement__Alternatives() throws RecognitionException;
+     void rule__InvokeStatement__Alternatives_1_4_1() throws RecognitionException;
+     void rule__InvokeStatement__Alternatives_2_5_1() throws RecognitionException;
+     void rule__InvokeStatement__Alternatives_3_3_1() throws RecognitionException;
+     void rule__Expression__Alternatives() throws RecognitionException;
+     void rule__AssignmentOperator__Alternatives() throws RecognitionException;
+     void rule__LeftHandSideExpression__Alternatives_1() throws RecognitionException;
+     void rule__LogicalOrExpression__OperatorAlternatives_1_1_0() throws RecognitionException;
+     void rule__LogicalOrExpression__Alternatives_1_3_0() throws RecognitionException;
+     void rule__LogicalAndExpression__OperatorAlternatives_1_1_0() throws RecognitionException;
+     void rule__LogicalAndExpression__Alternatives_1_3_0() throws RecognitionException;
+     void rule__EqualityOperator__Alternatives() throws RecognitionException;
+     void rule__RelationalOperator__Alternatives() throws RecognitionException;
+     void rule__AdditiveExpression__Alternatives_1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Alternatives_1() throws RecognitionException;
+     void rule__UnaryExpression__Alternatives() throws RecognitionException;
+     void rule__AffixOperator__Alternatives() throws RecognitionException;
+     void rule__NewfreshExpression__Alternatives() throws RecognitionException;
+     void rule__ArithmeticUnaryOperator__Alternatives() throws RecognitionException;
+     void rule__LogicalUnaryExpression__OperatorAlternatives_0_0() throws RecognitionException;
+     void rule__PrimaryExpression__Alternatives_1_3() throws RecognitionException;
+     void rule__PrimaryExpression__Alternatives_2_3() throws RecognitionException;
+     void rule__PrimaryExpression__Alternatives_2_4_3() throws RecognitionException;
+     void rule__BaseExpression__Alternatives() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Alternatives_3() throws RecognitionException;
+     void rule__MixTupleExpressionList__ValueAlternatives_1_0() throws RecognitionException;
+     void rule__MixTupleExpressionList__ValueAlternatives_2_1_0() throws RecognitionException;
+     void rule__NamedExpression__Alternatives_1() throws RecognitionException;
+     void rule__LiteralReferenceableExpression__Alternatives() throws RecognitionException;
+     void rule__LiteralTerminalExpression__Alternatives() throws RecognitionException;
+     void rule__LiteralNullExpression__Alternatives() throws RecognitionException;
+     void rule__LiteralNullExpression__Alternatives_0_1() throws RecognitionException;
+     void rule__LiteralNullExpression__Alternatives_1_1() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Alternatives_3_0() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Alternatives_3_1_1() throws RecognitionException;
+     void rule__LiteralReferenceExpression__Alternatives() throws RecognitionException;
+     void rule__LiteralReferenceElement__Alternatives_2() throws RecognitionException;
+     void rule__LiteralReferenceVariableContext__Alternatives() throws RecognitionException;
+     void rule__LiteralReferenceMachineContext__Alternatives() throws RecognitionException;
+     void rule__LiteralEnvExpression__Alternatives_1() throws RecognitionException;
+     void rule__LiteralPureReferenceExpression__Alternatives() throws RecognitionException;
+     void rule__VisibilityKind__Alternatives() throws RecognitionException;
+     void rule__DesignKind__Alternatives() throws RecognitionException;
+     void rule__PseudostateKind__Alternatives() throws RecognitionException;
+     void rule__EndingPseudostateKind__Alternatives() throws RecognitionException;
+     void rule__ComProtocolKind__Alternatives() throws RecognitionException;
+     void rule__ComEnvRdvProtocolKind__Alternatives() throws RecognitionException;
+     void rule__ComCastKing__Alternatives() throws RecognitionException;
+     void rule__PrimitiveNumberSign__Alternatives() throws RecognitionException;
+     void rule__PrimitiveInstanceKind__Alternatives() throws RecognitionException;
+     void rule__CollectionKind__Alternatives() throws RecognitionException;
+     void rule__ParameterDirectionKind__Alternatives() throws RecognitionException;
+     void rule__BlockParameterDirectionKind__Alternatives() throws RecognitionException;
+     void rule__BufferContainerKind__Alternatives() throws RecognitionException;
+     void rule__ChannelDirection__Alternatives() throws RecognitionException;
+     void rule__TransitionMoc__Alternatives() throws RecognitionException;
+     void rule__InterruptStatementKind__Alternatives() throws RecognitionException;
+     void rule__OPERATOR_ACTIVITY__Alternatives() throws RecognitionException;
+     void rule__Xlia__Group__0() throws RecognitionException;
+     void rule__Xlia__Group__0__Impl() throws RecognitionException;
+     void rule__Xlia__Group__1() throws RecognitionException;
+     void rule__Xlia__Group__1__Impl() throws RecognitionException;
+     void rule__XliaPrologObject__Group__0() throws RecognitionException;
+     void rule__XliaPrologObject__Group__0__Impl() throws RecognitionException;
+     void rule__XliaPrologObject__Group__1() throws RecognitionException;
+     void rule__XliaPrologObject__Group__1__Impl() throws RecognitionException;
+     void rule__XliaPrologObject__Group__2() throws RecognitionException;
+     void rule__XliaPrologObject__Group__2__Impl() throws RecognitionException;
+     void rule__XliaPrologObject__Group__3() throws RecognitionException;
+     void rule__XliaPrologObject__Group__3__Impl() throws RecognitionException;
+     void rule__XliaPrologObject__Group__4() throws RecognitionException;
+     void rule__XliaPrologObject__Group__4__Impl() throws RecognitionException;
+     void rule__XliaPrologAttribute__Group__0() throws RecognitionException;
+     void rule__XliaPrologAttribute__Group__0__Impl() throws RecognitionException;
+     void rule__XliaPrologAttribute__Group__1() throws RecognitionException;
+     void rule__XliaPrologAttribute__Group__1__Impl() throws RecognitionException;
+     void rule__XliaPrologAttribute__Group_1__0() throws RecognitionException;
+     void rule__XliaPrologAttribute__Group_1__0__Impl() throws RecognitionException;
+     void rule__XliaPrologAttribute__Group_1__1() throws RecognitionException;
+     void rule__XliaPrologAttribute__Group_1__1__Impl() throws RecognitionException;
+     void rule__XliaOptionObject__Group__0() throws RecognitionException;
+     void rule__XliaOptionObject__Group__0__Impl() throws RecognitionException;
+     void rule__XliaOptionObject__Group__1() throws RecognitionException;
+     void rule__XliaOptionObject__Group__1__Impl() throws RecognitionException;
+     void rule__XliaOptionObject__Group__2() throws RecognitionException;
+     void rule__XliaOptionObject__Group__2__Impl() throws RecognitionException;
+     void rule__XliaOptionObject__Group__3() throws RecognitionException;
+     void rule__XliaOptionObject__Group__3__Impl() throws RecognitionException;
+     void rule__XliaObject__Group__0() throws RecognitionException;
+     void rule__XliaObject__Group__0__Impl() throws RecognitionException;
+     void rule__XliaObject__Group__1() throws RecognitionException;
+     void rule__XliaObject__Group__1__Impl() throws RecognitionException;
+     void rule__XliaObject__Group__2() throws RecognitionException;
+     void rule__XliaObject__Group__2__Impl() throws RecognitionException;
+     void rule__XliaObject__Group__3() throws RecognitionException;
+     void rule__XliaObject__Group__3__Impl() throws RecognitionException;
+     void rule__XliaAttribute__Group__0() throws RecognitionException;
+     void rule__XliaAttribute__Group__0__Impl() throws RecognitionException;
+     void rule__XliaAttribute__Group__1() throws RecognitionException;
+     void rule__XliaAttribute__Group__1__Impl() throws RecognitionException;
+     void rule__XliaAttribute__Group__2() throws RecognitionException;
+     void rule__XliaAttribute__Group__2__Impl() throws RecognitionException;
+     void rule__XliaAttribute__Group__3() throws RecognitionException;
+     void rule__XliaAttribute__Group__3__Impl() throws RecognitionException;
+     void rule__EInt__Group__0() throws RecognitionException;
+     void rule__EInt__Group__0__Impl() throws RecognitionException;
+     void rule__EInt__Group__1() throws RecognitionException;
+     void rule__EInt__Group__1__Impl() throws RecognitionException;
+     void rule__EInteger__Group__0() throws RecognitionException;
+     void rule__EInteger__Group__0__Impl() throws RecognitionException;
+     void rule__EInteger__Group__1() throws RecognitionException;
+     void rule__EInteger__Group__1__Impl() throws RecognitionException;
+     void rule__EDouble__Group__0() throws RecognitionException;
+     void rule__EDouble__Group__0__Impl() throws RecognitionException;
+     void rule__EDouble__Group__1() throws RecognitionException;
+     void rule__EDouble__Group__1__Impl() throws RecognitionException;
+     void rule__EDouble__Group__2() throws RecognitionException;
+     void rule__EDouble__Group__2__Impl() throws RecognitionException;
+     void rule__EDouble__Group__3() throws RecognitionException;
+     void rule__EDouble__Group__3__Impl() throws RecognitionException;
+     void rule__ESUfid__Group__0() throws RecognitionException;
+     void rule__ESUfid__Group__0__Impl() throws RecognitionException;
+     void rule__ESUfid__Group__1() throws RecognitionException;
+     void rule__ESUfid__Group__1__Impl() throws RecognitionException;
+     void rule__ESUfid__Group_1__0() throws RecognitionException;
+     void rule__ESUfid__Group_1__0__Impl() throws RecognitionException;
+     void rule__ESUfid__Group_1__1() throws RecognitionException;
+     void rule__ESUfid__Group_1__1__Impl() throws RecognitionException;
+     void rule__System__Group__0() throws RecognitionException;
+     void rule__System__Group__0__Impl() throws RecognitionException;
+     void rule__System__Group__1() throws RecognitionException;
+     void rule__System__Group__1__Impl() throws RecognitionException;
+     void rule__System__Group__2() throws RecognitionException;
+     void rule__System__Group__2__Impl() throws RecognitionException;
+     void rule__System__Group__3() throws RecognitionException;
+     void rule__System__Group__3__Impl() throws RecognitionException;
+     void rule__System__Group__4() throws RecognitionException;
+     void rule__System__Group__4__Impl() throws RecognitionException;
+     void rule__System__Group__5() throws RecognitionException;
+     void rule__System__Group__5__Impl() throws RecognitionException;
+     void rule__System__Group__6() throws RecognitionException;
+     void rule__System__Group__6__Impl() throws RecognitionException;
+     void rule__System__Group__7() throws RecognitionException;
+     void rule__System__Group__7__Impl() throws RecognitionException;
+     void rule__System__Group__8() throws RecognitionException;
+     void rule__System__Group__8__Impl() throws RecognitionException;
+     void rule__System__Group__9() throws RecognitionException;
+     void rule__System__Group__9__Impl() throws RecognitionException;
+     void rule__System__Group__10() throws RecognitionException;
+     void rule__System__Group__10__Impl() throws RecognitionException;
+     void rule__System__Group__11() throws RecognitionException;
+     void rule__System__Group__11__Impl() throws RecognitionException;
+     void rule__System__Group__12() throws RecognitionException;
+     void rule__System__Group__12__Impl() throws RecognitionException;
+     void rule__System__Group_2__0() throws RecognitionException;
+     void rule__System__Group_2__0__Impl() throws RecognitionException;
+     void rule__System__Group_2__1() throws RecognitionException;
+     void rule__System__Group_2__1__Impl() throws RecognitionException;
+     void rule__System__Group_2__2() throws RecognitionException;
+     void rule__System__Group_2__2__Impl() throws RecognitionException;
+     void rule__System__Group_2__3() throws RecognitionException;
+     void rule__System__Group_2__3__Impl() throws RecognitionException;
+     void rule__System__Group_7_0__0() throws RecognitionException;
+     void rule__System__Group_7_0__0__Impl() throws RecognitionException;
+     void rule__System__Group_7_0__1() throws RecognitionException;
+     void rule__System__Group_7_0__1__Impl() throws RecognitionException;
+     void rule__System__Group_7_1__0() throws RecognitionException;
+     void rule__System__Group_7_1__0__Impl() throws RecognitionException;
+     void rule__System__Group_7_1__1() throws RecognitionException;
+     void rule__System__Group_7_1__1__Impl() throws RecognitionException;
+     void rule__System__Group_7_2__0() throws RecognitionException;
+     void rule__System__Group_7_2__0__Impl() throws RecognitionException;
+     void rule__System__Group_7_2__1() throws RecognitionException;
+     void rule__System__Group_7_2__1__Impl() throws RecognitionException;
+     void rule__System__Group_7_3__0() throws RecognitionException;
+     void rule__System__Group_7_3__0__Impl() throws RecognitionException;
+     void rule__System__Group_7_3__1() throws RecognitionException;
+     void rule__System__Group_7_3__1__Impl() throws RecognitionException;
+     void rule__System__Group_8_0_0__0() throws RecognitionException;
+     void rule__System__Group_8_0_0__0__Impl() throws RecognitionException;
+     void rule__System__Group_8_0_0__1() throws RecognitionException;
+     void rule__System__Group_8_0_0__1__Impl() throws RecognitionException;
+     void rule__System__Group_8_0_1__0() throws RecognitionException;
+     void rule__System__Group_8_0_1__0__Impl() throws RecognitionException;
+     void rule__System__Group_8_0_1__1() throws RecognitionException;
+     void rule__System__Group_8_0_1__1__Impl() throws RecognitionException;
+     void rule__System__Group_9_0__0() throws RecognitionException;
+     void rule__System__Group_9_0__0__Impl() throws RecognitionException;
+     void rule__System__Group_9_0__1() throws RecognitionException;
+     void rule__System__Group_9_0__1__Impl() throws RecognitionException;
+     void rule__System__Group_9_1__0() throws RecognitionException;
+     void rule__System__Group_9_1__0__Impl() throws RecognitionException;
+     void rule__System__Group_9_1__1() throws RecognitionException;
+     void rule__System__Group_9_1__1__Impl() throws RecognitionException;
+     void rule__System__Group_9_2__0() throws RecognitionException;
+     void rule__System__Group_9_2__0__Impl() throws RecognitionException;
+     void rule__System__Group_9_2__1() throws RecognitionException;
+     void rule__System__Group_9_2__1__Impl() throws RecognitionException;
+     void rule__System__Group_9_3__0() throws RecognitionException;
+     void rule__System__Group_9_3__0__Impl() throws RecognitionException;
+     void rule__System__Group_9_3__1() throws RecognitionException;
+     void rule__System__Group_9_3__1__Impl() throws RecognitionException;
+     void rule__System__Group_10_0__0() throws RecognitionException;
+     void rule__System__Group_10_0__0__Impl() throws RecognitionException;
+     void rule__System__Group_10_0__1() throws RecognitionException;
+     void rule__System__Group_10_0__1__Impl() throws RecognitionException;
+     void rule__System__Group_10_1__0() throws RecognitionException;
+     void rule__System__Group_10_1__0__Impl() throws RecognitionException;
+     void rule__System__Group_10_1__1() throws RecognitionException;
+     void rule__System__Group_10_1__1__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group__0() throws RecognitionException;
+     void rule__InstanceMachine__Group__0__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group__1() throws RecognitionException;
+     void rule__InstanceMachine__Group__1__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group__2() throws RecognitionException;
+     void rule__InstanceMachine__Group__2__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group__3() throws RecognitionException;
+     void rule__InstanceMachine__Group__3__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group__4() throws RecognitionException;
+     void rule__InstanceMachine__Group__4__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group__5() throws RecognitionException;
+     void rule__InstanceMachine__Group__5__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group__6() throws RecognitionException;
+     void rule__InstanceMachine__Group__6__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group__7() throws RecognitionException;
+     void rule__InstanceMachine__Group__7__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group__8() throws RecognitionException;
+     void rule__InstanceMachine__Group__8__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0__0() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0__0__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0__1() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0__1__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0__0() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0__0__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0__1() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0__1__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0__2() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0__2__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0_1__0() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0_1__0__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0_1__1() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0_1__1__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0_1_1__0() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0_1_1__0__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0_1_1__1() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_0_0_1_1__1__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1__0() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1__0__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1__1() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1__1__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1__2() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1__2__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1_1__0() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1_1__0__Impl() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1_1__1() throws RecognitionException;
+     void rule__InstanceMachine__Group_8_1_1__1__Impl() throws RecognitionException;
+     void rule__SlotParameter__Group__0() throws RecognitionException;
+     void rule__SlotParameter__Group__0__Impl() throws RecognitionException;
+     void rule__SlotParameter__Group__1() throws RecognitionException;
+     void rule__SlotParameter__Group__1__Impl() throws RecognitionException;
+     void rule__SlotParameter__Group__2() throws RecognitionException;
+     void rule__SlotParameter__Group__2__Impl() throws RecognitionException;
+     void rule__SlotProperty__Group__0() throws RecognitionException;
+     void rule__SlotProperty__Group__0__Impl() throws RecognitionException;
+     void rule__SlotProperty__Group__1() throws RecognitionException;
+     void rule__SlotProperty__Group__1__Impl() throws RecognitionException;
+     void rule__SlotProperty__Group__2() throws RecognitionException;
+     void rule__SlotProperty__Group__2__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__0() throws RecognitionException;
+     void rule__MachineBlock__Group__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__1() throws RecognitionException;
+     void rule__MachineBlock__Group__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__2() throws RecognitionException;
+     void rule__MachineBlock__Group__2__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__3() throws RecognitionException;
+     void rule__MachineBlock__Group__3__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__4() throws RecognitionException;
+     void rule__MachineBlock__Group__4__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__5() throws RecognitionException;
+     void rule__MachineBlock__Group__5__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__6() throws RecognitionException;
+     void rule__MachineBlock__Group__6__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__7() throws RecognitionException;
+     void rule__MachineBlock__Group__7__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__8() throws RecognitionException;
+     void rule__MachineBlock__Group__8__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__9() throws RecognitionException;
+     void rule__MachineBlock__Group__9__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__10() throws RecognitionException;
+     void rule__MachineBlock__Group__10__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__11() throws RecognitionException;
+     void rule__MachineBlock__Group__11__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group__12() throws RecognitionException;
+     void rule__MachineBlock__Group__12__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_2__0() throws RecognitionException;
+     void rule__MachineBlock__Group_2__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_2__1() throws RecognitionException;
+     void rule__MachineBlock__Group_2__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_2__2() throws RecognitionException;
+     void rule__MachineBlock__Group_2__2__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_2__3() throws RecognitionException;
+     void rule__MachineBlock__Group_2__3__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_7_0__0() throws RecognitionException;
+     void rule__MachineBlock__Group_7_0__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_7_0__1() throws RecognitionException;
+     void rule__MachineBlock__Group_7_0__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_7_1__0() throws RecognitionException;
+     void rule__MachineBlock__Group_7_1__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_7_1__1() throws RecognitionException;
+     void rule__MachineBlock__Group_7_1__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_7_2__0() throws RecognitionException;
+     void rule__MachineBlock__Group_7_2__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_7_2__1() throws RecognitionException;
+     void rule__MachineBlock__Group_7_2__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_7_3__0() throws RecognitionException;
+     void rule__MachineBlock__Group_7_3__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_7_3__1() throws RecognitionException;
+     void rule__MachineBlock__Group_7_3__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_8_0_0__0() throws RecognitionException;
+     void rule__MachineBlock__Group_8_0_0__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_8_0_0__1() throws RecognitionException;
+     void rule__MachineBlock__Group_8_0_0__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_8_0_1__0() throws RecognitionException;
+     void rule__MachineBlock__Group_8_0_1__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_8_0_1__1() throws RecognitionException;
+     void rule__MachineBlock__Group_8_0_1__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_9_0__0() throws RecognitionException;
+     void rule__MachineBlock__Group_9_0__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_9_0__1() throws RecognitionException;
+     void rule__MachineBlock__Group_9_0__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_9_1__0() throws RecognitionException;
+     void rule__MachineBlock__Group_9_1__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_9_1__1() throws RecognitionException;
+     void rule__MachineBlock__Group_9_1__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_9_2__0() throws RecognitionException;
+     void rule__MachineBlock__Group_9_2__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_9_2__1() throws RecognitionException;
+     void rule__MachineBlock__Group_9_2__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_9_3__0() throws RecognitionException;
+     void rule__MachineBlock__Group_9_3__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_9_3__1() throws RecognitionException;
+     void rule__MachineBlock__Group_9_3__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_10_0__0() throws RecognitionException;
+     void rule__MachineBlock__Group_10_0__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_10_0__1() throws RecognitionException;
+     void rule__MachineBlock__Group_10_0__1__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_10_1__0() throws RecognitionException;
+     void rule__MachineBlock__Group_10_1__0__Impl() throws RecognitionException;
+     void rule__MachineBlock__Group_10_1__1() throws RecognitionException;
+     void rule__MachineBlock__Group_10_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group__0() throws RecognitionException;
+     void rule__Procedure__Group__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group__1() throws RecognitionException;
+     void rule__Procedure__Group__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group__2() throws RecognitionException;
+     void rule__Procedure__Group__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group__3() throws RecognitionException;
+     void rule__Procedure__Group__3__Impl() throws RecognitionException;
+     void rule__Procedure__Group__4() throws RecognitionException;
+     void rule__Procedure__Group__4__Impl() throws RecognitionException;
+     void rule__Procedure__Group__5() throws RecognitionException;
+     void rule__Procedure__Group__5__Impl() throws RecognitionException;
+     void rule__Procedure__Group__6() throws RecognitionException;
+     void rule__Procedure__Group__6__Impl() throws RecognitionException;
+     void rule__Procedure__Group__7() throws RecognitionException;
+     void rule__Procedure__Group__7__Impl() throws RecognitionException;
+     void rule__Procedure__Group__8() throws RecognitionException;
+     void rule__Procedure__Group__8__Impl() throws RecognitionException;
+     void rule__Procedure__Group__9() throws RecognitionException;
+     void rule__Procedure__Group__9__Impl() throws RecognitionException;
+     void rule__Procedure__Group__10() throws RecognitionException;
+     void rule__Procedure__Group__10__Impl() throws RecognitionException;
+     void rule__Procedure__Group__11() throws RecognitionException;
+     void rule__Procedure__Group__11__Impl() throws RecognitionException;
+     void rule__Procedure__Group__12() throws RecognitionException;
+     void rule__Procedure__Group__12__Impl() throws RecognitionException;
+     void rule__Procedure__Group__13() throws RecognitionException;
+     void rule__Procedure__Group__13__Impl() throws RecognitionException;
+     void rule__Procedure__Group_2__0() throws RecognitionException;
+     void rule__Procedure__Group_2__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_2__1() throws RecognitionException;
+     void rule__Procedure__Group_2__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_2__2() throws RecognitionException;
+     void rule__Procedure__Group_2__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_2__3() throws RecognitionException;
+     void rule__Procedure__Group_2__3__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5__0() throws RecognitionException;
+     void rule__Procedure__Group_5__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5__1() throws RecognitionException;
+     void rule__Procedure__Group_5__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_0__0() throws RecognitionException;
+     void rule__Procedure__Group_5_0__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_0__1() throws RecognitionException;
+     void rule__Procedure__Group_5_0__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_0__2() throws RecognitionException;
+     void rule__Procedure__Group_5_0__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_0_1__0() throws RecognitionException;
+     void rule__Procedure__Group_5_0_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_0_1__1() throws RecognitionException;
+     void rule__Procedure__Group_5_0_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_0_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_5_0_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_0_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_5_0_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_1__0() throws RecognitionException;
+     void rule__Procedure__Group_5_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_1__1() throws RecognitionException;
+     void rule__Procedure__Group_5_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1__2() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1__3() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1__3__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1_2__0() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1_2__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1_2__1() throws RecognitionException;
+     void rule__Procedure__Group_5_1_1_1_2__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0__0() throws RecognitionException;
+     void rule__Procedure__Group_7_0__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0__1() throws RecognitionException;
+     void rule__Procedure__Group_7_0__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0__0() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0__1() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0_1_1__2() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_0_1_1__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1_1_1__2() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_1_1_1__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2__0() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2__1() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2_1_1__2() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_2_1_1__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3__0() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3__1() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3_1_1__2() throws RecognitionException;
+     void rule__Procedure__Group_7_0_1_3_1_1__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_0__0() throws RecognitionException;
+     void rule__Procedure__Group_8_0__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_0__1() throws RecognitionException;
+     void rule__Procedure__Group_8_0__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_0_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_8_0_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_0_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_8_0_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_0_1_1__2() throws RecognitionException;
+     void rule__Procedure__Group_8_0_1_1__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_1__0() throws RecognitionException;
+     void rule__Procedure__Group_8_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_1__1() throws RecognitionException;
+     void rule__Procedure__Group_8_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_1_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_8_1_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_1_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_8_1_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_1_1_1__2() throws RecognitionException;
+     void rule__Procedure__Group_8_1_1_1__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_2__0() throws RecognitionException;
+     void rule__Procedure__Group_8_2__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_2__1() throws RecognitionException;
+     void rule__Procedure__Group_8_2__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_2_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_8_2_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_2_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_8_2_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_2_1_1__2() throws RecognitionException;
+     void rule__Procedure__Group_8_2_1_1__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_3__0() throws RecognitionException;
+     void rule__Procedure__Group_8_3__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_3__1() throws RecognitionException;
+     void rule__Procedure__Group_8_3__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_3_1_1__0() throws RecognitionException;
+     void rule__Procedure__Group_8_3_1_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_3_1_1__1() throws RecognitionException;
+     void rule__Procedure__Group_8_3_1_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_8_3_1_1__2() throws RecognitionException;
+     void rule__Procedure__Group_8_3_1_1__2__Impl() throws RecognitionException;
+     void rule__Procedure__Group_9_0__0() throws RecognitionException;
+     void rule__Procedure__Group_9_0__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_9_0__1() throws RecognitionException;
+     void rule__Procedure__Group_9_0__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_9_1__0() throws RecognitionException;
+     void rule__Procedure__Group_9_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_9_1__1() throws RecognitionException;
+     void rule__Procedure__Group_9_1__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_9_2__0() throws RecognitionException;
+     void rule__Procedure__Group_9_2__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_9_2__1() throws RecognitionException;
+     void rule__Procedure__Group_9_2__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_9_3__0() throws RecognitionException;
+     void rule__Procedure__Group_9_3__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_9_3__1() throws RecognitionException;
+     void rule__Procedure__Group_9_3__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_10_0_0__0() throws RecognitionException;
+     void rule__Procedure__Group_10_0_0__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_10_0_0__1() throws RecognitionException;
+     void rule__Procedure__Group_10_0_0__1__Impl() throws RecognitionException;
+     void rule__Procedure__Group_10_0_1__0() throws RecognitionException;
+     void rule__Procedure__Group_10_0_1__0__Impl() throws RecognitionException;
+     void rule__Procedure__Group_10_0_1__1() throws RecognitionException;
+     void rule__Procedure__Group_10_0_1__1__Impl() throws RecognitionException;
+     void rule__ProcedureExecution__Group__0() throws RecognitionException;
+     void rule__ProcedureExecution__Group__0__Impl() throws RecognitionException;
+     void rule__ProcedureExecution__Group__1() throws RecognitionException;
+     void rule__ProcedureExecution__Group__1__Impl() throws RecognitionException;
+     void rule__ProcedureExecution__Group__2() throws RecognitionException;
+     void rule__ProcedureExecution__Group__2__Impl() throws RecognitionException;
+     void rule__ProcedureExecution__Group_2_0__0() throws RecognitionException;
+     void rule__ProcedureExecution__Group_2_0__0__Impl() throws RecognitionException;
+     void rule__ProcedureExecution__Group_2_0__1() throws RecognitionException;
+     void rule__ProcedureExecution__Group_2_0__1__Impl() throws RecognitionException;
+     void rule__ProcedureExecution__Group_2_1__0() throws RecognitionException;
+     void rule__ProcedureExecution__Group_2_1__0__Impl() throws RecognitionException;
+     void rule__ProcedureExecution__Group_2_1__1() throws RecognitionException;
+     void rule__ProcedureExecution__Group_2_1__1__Impl() throws RecognitionException;
+     void rule__MoeBehavior__Group__0() throws RecognitionException;
+     void rule__MoeBehavior__Group__0__Impl() throws RecognitionException;
+     void rule__MoeBehavior__Group__1() throws RecognitionException;
+     void rule__MoeBehavior__Group__1__Impl() throws RecognitionException;
+     void rule__MoeBehavior__Group__2() throws RecognitionException;
+     void rule__MoeBehavior__Group__2__Impl() throws RecognitionException;
+     void rule__MoeBehavior__Group_1__0() throws RecognitionException;
+     void rule__MoeBehavior__Group_1__0__Impl() throws RecognitionException;
+     void rule__MoeBehavior__Group_1__1() throws RecognitionException;
+     void rule__MoeBehavior__Group_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__0() throws RecognitionException;
+     void rule__Statemachine__Group__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__1() throws RecognitionException;
+     void rule__Statemachine__Group__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__2() throws RecognitionException;
+     void rule__Statemachine__Group__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__3() throws RecognitionException;
+     void rule__Statemachine__Group__3__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__4() throws RecognitionException;
+     void rule__Statemachine__Group__4__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__5() throws RecognitionException;
+     void rule__Statemachine__Group__5__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__6() throws RecognitionException;
+     void rule__Statemachine__Group__6__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__7() throws RecognitionException;
+     void rule__Statemachine__Group__7__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__8() throws RecognitionException;
+     void rule__Statemachine__Group__8__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__9() throws RecognitionException;
+     void rule__Statemachine__Group__9__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__10() throws RecognitionException;
+     void rule__Statemachine__Group__10__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__11() throws RecognitionException;
+     void rule__Statemachine__Group__11__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__12() throws RecognitionException;
+     void rule__Statemachine__Group__12__Impl() throws RecognitionException;
+     void rule__Statemachine__Group__13() throws RecognitionException;
+     void rule__Statemachine__Group__13__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_3__0() throws RecognitionException;
+     void rule__Statemachine__Group_3__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_3__1() throws RecognitionException;
+     void rule__Statemachine__Group_3__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_3__2() throws RecognitionException;
+     void rule__Statemachine__Group_3__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_3__3() throws RecognitionException;
+     void rule__Statemachine__Group_3__3__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0__0() throws RecognitionException;
+     void rule__Statemachine__Group_7_0__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0__1() throws RecognitionException;
+     void rule__Statemachine__Group_7_0__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0__0() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0__1() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0_1_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0_1_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0_1_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0_1_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0_1_1__2() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_0_1_1__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1_1_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1_1_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1_1_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1_1_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1_1_1__2() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_1_1_1__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2__0() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2__1() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2_1_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2_1_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2_1_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2_1_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2_1_1__2() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_2_1_1__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3__0() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3__1() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3_1_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3_1_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3_1_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3_1_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3_1_1__2() throws RecognitionException;
+     void rule__Statemachine__Group_7_0_1_3_1_1__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_0__0() throws RecognitionException;
+     void rule__Statemachine__Group_8_0__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_0__1() throws RecognitionException;
+     void rule__Statemachine__Group_8_0__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_0_1_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_8_0_1_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_0_1_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_8_0_1_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_0_1_1__2() throws RecognitionException;
+     void rule__Statemachine__Group_8_0_1_1__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_8_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_1_1_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_8_1_1_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_1_1_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_8_1_1_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_1_1_1__2() throws RecognitionException;
+     void rule__Statemachine__Group_8_1_1_1__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_2__0() throws RecognitionException;
+     void rule__Statemachine__Group_8_2__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_2__1() throws RecognitionException;
+     void rule__Statemachine__Group_8_2__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_2_1_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_8_2_1_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_2_1_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_8_2_1_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_2_1_1__2() throws RecognitionException;
+     void rule__Statemachine__Group_8_2_1_1__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_3__0() throws RecognitionException;
+     void rule__Statemachine__Group_8_3__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_3__1() throws RecognitionException;
+     void rule__Statemachine__Group_8_3__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_3_1_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_8_3_1_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_3_1_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_8_3_1_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_8_3_1_1__2() throws RecognitionException;
+     void rule__Statemachine__Group_8_3_1_1__2__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9_0__0() throws RecognitionException;
+     void rule__Statemachine__Group_9_0__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9_0__1() throws RecognitionException;
+     void rule__Statemachine__Group_9_0__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_9_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_9_1__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9_2__0() throws RecognitionException;
+     void rule__Statemachine__Group_9_2__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9_2__1() throws RecognitionException;
+     void rule__Statemachine__Group_9_2__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9_3__0() throws RecognitionException;
+     void rule__Statemachine__Group_9_3__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_9_3__1() throws RecognitionException;
+     void rule__Statemachine__Group_9_3__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_10_0_0__0() throws RecognitionException;
+     void rule__Statemachine__Group_10_0_0__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_10_0_0__1() throws RecognitionException;
+     void rule__Statemachine__Group_10_0_0__1__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_10_0_1__0() throws RecognitionException;
+     void rule__Statemachine__Group_10_0_1__0__Impl() throws RecognitionException;
+     void rule__Statemachine__Group_10_0_1__1() throws RecognitionException;
+     void rule__Statemachine__Group_10_0_1__1__Impl() throws RecognitionException;
+     void rule__StatemachineRegion__Group__0() throws RecognitionException;
+     void rule__StatemachineRegion__Group__0__Impl() throws RecognitionException;
+     void rule__StatemachineRegion__Group__1() throws RecognitionException;
+     void rule__StatemachineRegion__Group__1__Impl() throws RecognitionException;
+     void rule__StatemachineRegion__Group__2() throws RecognitionException;
+     void rule__StatemachineRegion__Group__2__Impl() throws RecognitionException;
+     void rule__StatemachineRegion__Group_1_1__0() throws RecognitionException;
+     void rule__StatemachineRegion__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__StatemachineRegion__Group_1_1__1() throws RecognitionException;
+     void rule__StatemachineRegion__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__StatemachineRegion__Group_1_1__2() throws RecognitionException;
+     void rule__StatemachineRegion__Group_1_1__2__Impl() throws RecognitionException;
+     void rule__StatemachineRegion__Group_1_1__3() throws RecognitionException;
+     void rule__StatemachineRegion__Group_1_1__3__Impl() throws RecognitionException;
+     void rule__CompositeState__Group__0() throws RecognitionException;
+     void rule__CompositeState__Group__0__Impl() throws RecognitionException;
+     void rule__CompositeState__Group__1() throws RecognitionException;
+     void rule__CompositeState__Group__1__Impl() throws RecognitionException;
+     void rule__CompositeState__Group__2() throws RecognitionException;
+     void rule__CompositeState__Group__2__Impl() throws RecognitionException;
+     void rule__CompositeState__Group__3() throws RecognitionException;
+     void rule__CompositeState__Group__3__Impl() throws RecognitionException;
+     void rule__CompositeState__Group__4() throws RecognitionException;
+     void rule__CompositeState__Group__4__Impl() throws RecognitionException;
+     void rule__CompositeState__Group__5() throws RecognitionException;
+     void rule__CompositeState__Group__5__Impl() throws RecognitionException;
+     void rule__CompositeState__Group__6() throws RecognitionException;
+     void rule__CompositeState__Group__6__Impl() throws RecognitionException;
+     void rule__CompositeState__Group__7() throws RecognitionException;
+     void rule__CompositeState__Group__7__Impl() throws RecognitionException;
+     void rule__CompositeState__Group__8() throws RecognitionException;
+     void rule__CompositeState__Group__8__Impl() throws RecognitionException;
+     void rule__CompositeState__Group_8_0__0() throws RecognitionException;
+     void rule__CompositeState__Group_8_0__0__Impl() throws RecognitionException;
+     void rule__CompositeState__Group_8_0__1() throws RecognitionException;
+     void rule__CompositeState__Group_8_0__1__Impl() throws RecognitionException;
+     void rule__CompositeState__Group_8_0__2() throws RecognitionException;
+     void rule__CompositeState__Group_8_0__2__Impl() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_0_1__0() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_0_1__0__Impl() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_0_1__1() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_0_1__1__Impl() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_0_2__0() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_0_2__0__Impl() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_0_2__1() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_0_2__1__Impl() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_1__0() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_1__0__Impl() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_1__1() throws RecognitionException;
+     void rule__CompositeState__Group_8_0_1_1__1__Impl() throws RecognitionException;
+     void rule__MoeCompositeStateRoutines__Group__0() throws RecognitionException;
+     void rule__MoeCompositeStateRoutines__Group__0__Impl() throws RecognitionException;
+     void rule__MoeCompositeStateRoutines__Group__1() throws RecognitionException;
+     void rule__MoeCompositeStateRoutines__Group__1__Impl() throws RecognitionException;
+     void rule__MoeCompositeStateRoutines__Group__2() throws RecognitionException;
+     void rule__MoeCompositeStateRoutines__Group__2__Impl() throws RecognitionException;
+     void rule__SimpleState__Group__0() throws RecognitionException;
+     void rule__SimpleState__Group__0__Impl() throws RecognitionException;
+     void rule__SimpleState__Group__1() throws RecognitionException;
+     void rule__SimpleState__Group__1__Impl() throws RecognitionException;
+     void rule__SimpleState__Group__2() throws RecognitionException;
+     void rule__SimpleState__Group__2__Impl() throws RecognitionException;
+     void rule__SimpleState__Group__3() throws RecognitionException;
+     void rule__SimpleState__Group__3__Impl() throws RecognitionException;
+     void rule__SimpleState__Group__4() throws RecognitionException;
+     void rule__SimpleState__Group__4__Impl() throws RecognitionException;
+     void rule__SimpleState__Group__5() throws RecognitionException;
+     void rule__SimpleState__Group__5__Impl() throws RecognitionException;
+     void rule__SimpleState__Group_2__0() throws RecognitionException;
+     void rule__SimpleState__Group_2__0__Impl() throws RecognitionException;
+     void rule__SimpleState__Group_2__1() throws RecognitionException;
+     void rule__SimpleState__Group_2__1__Impl() throws RecognitionException;
+     void rule__SimpleState__Group_2__2() throws RecognitionException;
+     void rule__SimpleState__Group_2__2__Impl() throws RecognitionException;
+     void rule__SimpleState__Group_2__3() throws RecognitionException;
+     void rule__SimpleState__Group_2__3__Impl() throws RecognitionException;
+     void rule__SimpleState__Group_5_0__0() throws RecognitionException;
+     void rule__SimpleState__Group_5_0__0__Impl() throws RecognitionException;
+     void rule__SimpleState__Group_5_0__1() throws RecognitionException;
+     void rule__SimpleState__Group_5_0__1__Impl() throws RecognitionException;
+     void rule__SimpleState__Group_5_0__2() throws RecognitionException;
+     void rule__SimpleState__Group_5_0__2__Impl() throws RecognitionException;
+     void rule__MoeSimpleStateRoutines__Group__0() throws RecognitionException;
+     void rule__MoeSimpleStateRoutines__Group__0__Impl() throws RecognitionException;
+     void rule__MoeSimpleStateRoutines__Group__1() throws RecognitionException;
+     void rule__MoeSimpleStateRoutines__Group__1__Impl() throws RecognitionException;
+     void rule__MoeSimpleStateRoutines__Group__2() throws RecognitionException;
+     void rule__MoeSimpleStateRoutines__Group__2__Impl() throws RecognitionException;
+     void rule__StartState__Group__0() throws RecognitionException;
+     void rule__StartState__Group__0__Impl() throws RecognitionException;
+     void rule__StartState__Group__1() throws RecognitionException;
+     void rule__StartState__Group__1__Impl() throws RecognitionException;
+     void rule__StartState__Group__2() throws RecognitionException;
+     void rule__StartState__Group__2__Impl() throws RecognitionException;
+     void rule__StartState__Group__3() throws RecognitionException;
+     void rule__StartState__Group__3__Impl() throws RecognitionException;
+     void rule__StartState__Group_1_0__0() throws RecognitionException;
+     void rule__StartState__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__StartState__Group_1_0__1() throws RecognitionException;
+     void rule__StartState__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__StartState__Group_1_0__2() throws RecognitionException;
+     void rule__StartState__Group_1_0__2__Impl() throws RecognitionException;
+     void rule__StartState__Group_1_0__3() throws RecognitionException;
+     void rule__StartState__Group_1_0__3__Impl() throws RecognitionException;
+     void rule__StartState__Group_1_0__4() throws RecognitionException;
+     void rule__StartState__Group_1_0__4__Impl() throws RecognitionException;
+     void rule__StartState__Group_1_0__5() throws RecognitionException;
+     void rule__StartState__Group_1_0__5__Impl() throws RecognitionException;
+     void rule__StartState__Group_3_0__0() throws RecognitionException;
+     void rule__StartState__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__StartState__Group_3_0__1() throws RecognitionException;
+     void rule__StartState__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__StartState__Group_3_0__2() throws RecognitionException;
+     void rule__StartState__Group_3_0__2__Impl() throws RecognitionException;
+     void rule__MoeStartStateRoutines__Group__0() throws RecognitionException;
+     void rule__MoeStartStateRoutines__Group__0__Impl() throws RecognitionException;
+     void rule__MoeStartStateRoutines__Group__1() throws RecognitionException;
+     void rule__MoeStartStateRoutines__Group__1__Impl() throws RecognitionException;
+     void rule__MoeStartStateRoutines__Group__2() throws RecognitionException;
+     void rule__MoeStartStateRoutines__Group__2__Impl() throws RecognitionException;
+     void rule__FinalState__Group__0() throws RecognitionException;
+     void rule__FinalState__Group__0__Impl() throws RecognitionException;
+     void rule__FinalState__Group__1() throws RecognitionException;
+     void rule__FinalState__Group__1__Impl() throws RecognitionException;
+     void rule__FinalState__Group__2() throws RecognitionException;
+     void rule__FinalState__Group__2__Impl() throws RecognitionException;
+     void rule__FinalState__Group__3() throws RecognitionException;
+     void rule__FinalState__Group__3__Impl() throws RecognitionException;
+     void rule__FinalState__Group_1_0__0() throws RecognitionException;
+     void rule__FinalState__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__FinalState__Group_1_0__1() throws RecognitionException;
+     void rule__FinalState__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__FinalState__Group_1_0__2() throws RecognitionException;
+     void rule__FinalState__Group_1_0__2__Impl() throws RecognitionException;
+     void rule__FinalState__Group_1_0__3() throws RecognitionException;
+     void rule__FinalState__Group_1_0__3__Impl() throws RecognitionException;
+     void rule__FinalState__Group_1_0__4() throws RecognitionException;
+     void rule__FinalState__Group_1_0__4__Impl() throws RecognitionException;
+     void rule__FinalState__Group_1_0__5() throws RecognitionException;
+     void rule__FinalState__Group_1_0__5__Impl() throws RecognitionException;
+     void rule__FinalState__Group_3_0__0() throws RecognitionException;
+     void rule__FinalState__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__FinalState__Group_3_0__1() throws RecognitionException;
+     void rule__FinalState__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__FinalState__Group_3_0__2() throws RecognitionException;
+     void rule__FinalState__Group_3_0__2__Impl() throws RecognitionException;
+     void rule__MoeFinalStateRoutines__Group__0() throws RecognitionException;
+     void rule__MoeFinalStateRoutines__Group__0__Impl() throws RecognitionException;
+     void rule__MoeFinalStateRoutines__Group__1() throws RecognitionException;
+     void rule__MoeFinalStateRoutines__Group__1__Impl() throws RecognitionException;
+     void rule__MoeFinalStateRoutines__Group__2() throws RecognitionException;
+     void rule__MoeFinalStateRoutines__Group__2__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group__0() throws RecognitionException;
+     void rule__OtherPseudostate__Group__0__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group__1() throws RecognitionException;
+     void rule__OtherPseudostate__Group__1__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group__2() throws RecognitionException;
+     void rule__OtherPseudostate__Group__2__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group__3() throws RecognitionException;
+     void rule__OtherPseudostate__Group__3__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group__4() throws RecognitionException;
+     void rule__OtherPseudostate__Group__4__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group__5() throws RecognitionException;
+     void rule__OtherPseudostate__Group__5__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group__6() throws RecognitionException;
+     void rule__OtherPseudostate__Group__6__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group__7() throws RecognitionException;
+     void rule__OtherPseudostate__Group__7__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group__8() throws RecognitionException;
+     void rule__OtherPseudostate__Group__8__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group_8_0__0() throws RecognitionException;
+     void rule__OtherPseudostate__Group_8_0__0__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group_8_0__1() throws RecognitionException;
+     void rule__OtherPseudostate__Group_8_0__1__Impl() throws RecognitionException;
+     void rule__OtherPseudostate__Group_8_0__2() throws RecognitionException;
+     void rule__OtherPseudostate__Group_8_0__2__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group__0() throws RecognitionException;
+     void rule__PseudostateInitial__Group__0__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group__1() throws RecognitionException;
+     void rule__PseudostateInitial__Group__1__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group__2() throws RecognitionException;
+     void rule__PseudostateInitial__Group__2__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group__3() throws RecognitionException;
+     void rule__PseudostateInitial__Group__3__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__0() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__1() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__2() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__2__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__3() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__3__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__4() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__4__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__5() throws RecognitionException;
+     void rule__PseudostateInitial__Group_1_0__5__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group_3_0__0() throws RecognitionException;
+     void rule__PseudostateInitial__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group_3_0__1() throws RecognitionException;
+     void rule__PseudostateInitial__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__PseudostateInitial__Group_3_0__2() throws RecognitionException;
+     void rule__PseudostateInitial__Group_3_0__2__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group__0() throws RecognitionException;
+     void rule__EndingPseudostate__Group__0__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group__1() throws RecognitionException;
+     void rule__EndingPseudostate__Group__1__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group__2() throws RecognitionException;
+     void rule__EndingPseudostate__Group__2__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group__3() throws RecognitionException;
+     void rule__EndingPseudostate__Group__3__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group__4() throws RecognitionException;
+     void rule__EndingPseudostate__Group__4__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group__5() throws RecognitionException;
+     void rule__EndingPseudostate__Group__5__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group__6() throws RecognitionException;
+     void rule__EndingPseudostate__Group__6__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group__7() throws RecognitionException;
+     void rule__EndingPseudostate__Group__7__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group__8() throws RecognitionException;
+     void rule__EndingPseudostate__Group__8__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group_8_0__0() throws RecognitionException;
+     void rule__EndingPseudostate__Group_8_0__0__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group_8_0__1() throws RecognitionException;
+     void rule__EndingPseudostate__Group_8_0__1__Impl() throws RecognitionException;
+     void rule__EndingPseudostate__Group_8_0__2() throws RecognitionException;
+     void rule__EndingPseudostate__Group_8_0__2__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group__0() throws RecognitionException;
+     void rule__ModelOfExecution__Group__0__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group__1() throws RecognitionException;
+     void rule__ModelOfExecution__Group__1__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group__2() throws RecognitionException;
+     void rule__ModelOfExecution__Group__2__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group__3() throws RecognitionException;
+     void rule__ModelOfExecution__Group__3__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group__4() throws RecognitionException;
+     void rule__ModelOfExecution__Group__4__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_0__0() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_0__1() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_1__0() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_1__1() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_2__0() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_2__0__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_2__1() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_2__1__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_3__0() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_3__0__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_3__1() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_3__1__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_4__0() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_4__0__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_4__1() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_4__1__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_5__0() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_5__0__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_5__1() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_5__1__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_6__0() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_6__0__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_6__1() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_6__1__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_7__0() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_7__0__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_7__1() throws RecognitionException;
+     void rule__ModelOfExecution__Group_3_7__1__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group__0() throws RecognitionException;
+     void rule__MoeRoutine__Group__0__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group__1() throws RecognitionException;
+     void rule__MoeRoutine__Group__1__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group__2() throws RecognitionException;
+     void rule__MoeRoutine__Group__2__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group__3() throws RecognitionException;
+     void rule__MoeRoutine__Group__3__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group_1__0() throws RecognitionException;
+     void rule__MoeRoutine__Group_1__0__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group_1__1() throws RecognitionException;
+     void rule__MoeRoutine__Group_1__1__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group_1__2() throws RecognitionException;
+     void rule__MoeRoutine__Group_1__2__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group_2__0() throws RecognitionException;
+     void rule__MoeRoutine__Group_2__0__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group_2__1() throws RecognitionException;
+     void rule__MoeRoutine__Group_2__1__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group_2_1_0__0() throws RecognitionException;
+     void rule__MoeRoutine__Group_2_1_0__0__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group_2_1_0__1() throws RecognitionException;
+     void rule__MoeRoutine__Group_2_1_0__1__Impl() throws RecognitionException;
+     void rule__MoeRoutine__Group_2_1_0__2() throws RecognitionException;
+     void rule__MoeRoutine__Group_2_1_0__2__Impl() throws RecognitionException;
+     void rule__Routine__Group__0() throws RecognitionException;
+     void rule__Routine__Group__0__Impl() throws RecognitionException;
+     void rule__Routine__Group__1() throws RecognitionException;
+     void rule__Routine__Group__1__Impl() throws RecognitionException;
+     void rule__Routine__Group__2() throws RecognitionException;
+     void rule__Routine__Group__2__Impl() throws RecognitionException;
+     void rule__Routine__Group__3() throws RecognitionException;
+     void rule__Routine__Group__3__Impl() throws RecognitionException;
+     void rule__Routine__Group__4() throws RecognitionException;
+     void rule__Routine__Group__4__Impl() throws RecognitionException;
+     void rule__Routine__Group__5() throws RecognitionException;
+     void rule__Routine__Group__5__Impl() throws RecognitionException;
+     void rule__Routine__Group__6() throws RecognitionException;
+     void rule__Routine__Group__6__Impl() throws RecognitionException;
+     void rule__Routine__Group__7() throws RecognitionException;
+     void rule__Routine__Group__7__Impl() throws RecognitionException;
+     void rule__Routine__Group_5__0() throws RecognitionException;
+     void rule__Routine__Group_5__0__Impl() throws RecognitionException;
+     void rule__Routine__Group_5__1() throws RecognitionException;
+     void rule__Routine__Group_5__1__Impl() throws RecognitionException;
+     void rule__Routine__Group_5__2() throws RecognitionException;
+     void rule__Routine__Group_5__2__Impl() throws RecognitionException;
+     void rule__Routine__Group_6__0() throws RecognitionException;
+     void rule__Routine__Group_6__0__Impl() throws RecognitionException;
+     void rule__Routine__Group_6__1() throws RecognitionException;
+     void rule__Routine__Group_6__1__Impl() throws RecognitionException;
+     void rule__Routine__Group_6_1_0__0() throws RecognitionException;
+     void rule__Routine__Group_6_1_0__0__Impl() throws RecognitionException;
+     void rule__Routine__Group_6_1_0__1() throws RecognitionException;
+     void rule__Routine__Group_6_1_0__1__Impl() throws RecognitionException;
+     void rule__Routine__Group_6_1_0__2() throws RecognitionException;
+     void rule__Routine__Group_6_1_0__2__Impl() throws RecognitionException;
+     void rule__ModelOfInteraction__Group__0() throws RecognitionException;
+     void rule__ModelOfInteraction__Group__0__Impl() throws RecognitionException;
+     void rule__ModelOfInteraction__Group__1() throws RecognitionException;
+     void rule__ModelOfInteraction__Group__1__Impl() throws RecognitionException;
+     void rule__ModelOfInteraction__Group__2() throws RecognitionException;
+     void rule__ModelOfInteraction__Group__2__Impl() throws RecognitionException;
+     void rule__Route__Group__0() throws RecognitionException;
+     void rule__Route__Group__0__Impl() throws RecognitionException;
+     void rule__Route__Group__1() throws RecognitionException;
+     void rule__Route__Group__1__Impl() throws RecognitionException;
+     void rule__Route__Group__2() throws RecognitionException;
+     void rule__Route__Group__2__Impl() throws RecognitionException;
+     void rule__Route__Group__3() throws RecognitionException;
+     void rule__Route__Group__3__Impl() throws RecognitionException;
+     void rule__Route__Group__4() throws RecognitionException;
+     void rule__Route__Group__4__Impl() throws RecognitionException;
+     void rule__Route__Group__5() throws RecognitionException;
+     void rule__Route__Group__5__Impl() throws RecognitionException;
+     void rule__Route__Group__6() throws RecognitionException;
+     void rule__Route__Group__6__Impl() throws RecognitionException;
+     void rule__Route__Group__7() throws RecognitionException;
+     void rule__Route__Group__7__Impl() throws RecognitionException;
+     void rule__Route__Group__8() throws RecognitionException;
+     void rule__Route__Group__8__Impl() throws RecognitionException;
+     void rule__Route__Group__9() throws RecognitionException;
+     void rule__Route__Group__9__Impl() throws RecognitionException;
+     void rule__Route__Group_5__0() throws RecognitionException;
+     void rule__Route__Group_5__0__Impl() throws RecognitionException;
+     void rule__Route__Group_5__1() throws RecognitionException;
+     void rule__Route__Group_5__1__Impl() throws RecognitionException;
+     void rule__Route__Group_7_1__0() throws RecognitionException;
+     void rule__Route__Group_7_1__0__Impl() throws RecognitionException;
+     void rule__Route__Group_7_1__1() throws RecognitionException;
+     void rule__Route__Group_7_1__1__Impl() throws RecognitionException;
+     void rule__Route__Group_7_1_1__0() throws RecognitionException;
+     void rule__Route__Group_7_1_1__0__Impl() throws RecognitionException;
+     void rule__Route__Group_7_1_1__1() throws RecognitionException;
+     void rule__Route__Group_7_1_1__1__Impl() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1__0() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1__0__Impl() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1__1() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1__1__Impl() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_0__0() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_0__0__Impl() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_0__1() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_0__1__Impl() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_1__0() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_1__0__Impl() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_1__1() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_1__1__Impl() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_1__2() throws RecognitionException;
+     void rule__ComRouteProtocol__Group_1_1_1__2__Impl() throws RecognitionException;
+     void rule__Connection__Group__0() throws RecognitionException;
+     void rule__Connection__Group__0__Impl() throws RecognitionException;
+     void rule__Connection__Group__1() throws RecognitionException;
+     void rule__Connection__Group__1__Impl() throws RecognitionException;
+     void rule__Connection__Group__2() throws RecognitionException;
+     void rule__Connection__Group__2__Impl() throws RecognitionException;
+     void rule__Connection__Group__3() throws RecognitionException;
+     void rule__Connection__Group__3__Impl() throws RecognitionException;
+     void rule__Connection__Group__4() throws RecognitionException;
+     void rule__Connection__Group__4__Impl() throws RecognitionException;
+     void rule__Connection__Group__5() throws RecognitionException;
+     void rule__Connection__Group__5__Impl() throws RecognitionException;
+     void rule__Connection__Group__6() throws RecognitionException;
+     void rule__Connection__Group__6__Impl() throws RecognitionException;
+     void rule__Connection__Group__7() throws RecognitionException;
+     void rule__Connection__Group__7__Impl() throws RecognitionException;
+     void rule__Connection__Group_4__0() throws RecognitionException;
+     void rule__Connection__Group_4__0__Impl() throws RecognitionException;
+     void rule__Connection__Group_4__1() throws RecognitionException;
+     void rule__Connection__Group_4__1__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_1__0() throws RecognitionException;
+     void rule__ComProtocol__Group_1__0__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_1__1() throws RecognitionException;
+     void rule__ComProtocol__Group_1__1__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_1_1__0() throws RecognitionException;
+     void rule__ComProtocol__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_1_1__1() throws RecognitionException;
+     void rule__ComProtocol__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_1_1__2() throws RecognitionException;
+     void rule__ComProtocol__Group_1_1__2__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_2__0() throws RecognitionException;
+     void rule__ComProtocol__Group_2__0__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_2__1() throws RecognitionException;
+     void rule__ComProtocol__Group_2__1__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_0__0() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_0__0__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_0__1() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_0__1__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_1__0() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_1__0__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_1__1() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_1__1__Impl() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_1__2() throws RecognitionException;
+     void rule__ComProtocol__Group_2_1_1__2__Impl() throws RecognitionException;
+     void rule__ComPoint__Group__0() throws RecognitionException;
+     void rule__ComPoint__Group__0__Impl() throws RecognitionException;
+     void rule__ComPoint__Group__1() throws RecognitionException;
+     void rule__ComPoint__Group__1__Impl() throws RecognitionException;
+     void rule__ComPoint__Group__2() throws RecognitionException;
+     void rule__ComPoint__Group__2__Impl() throws RecognitionException;
+     void rule__ComPoint__Group__3() throws RecognitionException;
+     void rule__ComPoint__Group__3__Impl() throws RecognitionException;
+     void rule__ComPoint__Group_2__0() throws RecognitionException;
+     void rule__ComPoint__Group_2__0__Impl() throws RecognitionException;
+     void rule__ComPoint__Group_2__1() throws RecognitionException;
+     void rule__ComPoint__Group_2__1__Impl() throws RecognitionException;
+     void rule__ComPoint__Group_2__2() throws RecognitionException;
+     void rule__ComPoint__Group_2__2__Impl() throws RecognitionException;
+     void rule__ComPoint__Group_3_0__0() throws RecognitionException;
+     void rule__ComPoint__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__ComPoint__Group_3_0__1() throws RecognitionException;
+     void rule__ComPoint__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__ComPoint__Group_3_1__0() throws RecognitionException;
+     void rule__ComPoint__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__ComPoint__Group_3_1__1() throws RecognitionException;
+     void rule__ComPoint__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__ComPoint__Group_3_1__2() throws RecognitionException;
+     void rule__ComPoint__Group_3_1__2__Impl() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0__0() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0__0__Impl() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0__1() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0__1__Impl() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_0__0() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_0__0__Impl() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_0__1() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_0__1__Impl() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_1__0() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_1__0__Impl() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_1__1() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_1__1__Impl() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_1__2() throws RecognitionException;
+     void rule__ComPointProtocol__Group_0_1_1__2__Impl() throws RecognitionException;
+     void rule__ComElement__Group_0__0() throws RecognitionException;
+     void rule__ComElement__Group_0__0__Impl() throws RecognitionException;
+     void rule__ComElement__Group_0__1() throws RecognitionException;
+     void rule__ComElement__Group_0__1__Impl() throws RecognitionException;
+     void rule__ComElement__Group_0_1__0() throws RecognitionException;
+     void rule__ComElement__Group_0_1__0__Impl() throws RecognitionException;
+     void rule__ComElement__Group_0_1__1() throws RecognitionException;
+     void rule__ComElement__Group_0_1__1__Impl() throws RecognitionException;
+     void rule__ComElement__Group_0_1__2() throws RecognitionException;
+     void rule__ComElement__Group_0_1__2__Impl() throws RecognitionException;
+     void rule__ComElement__Group_1__0() throws RecognitionException;
+     void rule__ComElement__Group_1__0__Impl() throws RecognitionException;
+     void rule__ComElement__Group_1__1() throws RecognitionException;
+     void rule__ComElement__Group_1__1__Impl() throws RecognitionException;
+     void rule__ComElement__Group_1__2() throws RecognitionException;
+     void rule__ComElement__Group_1__2__Impl() throws RecognitionException;
+     void rule__ComElement__Group_1__3() throws RecognitionException;
+     void rule__ComElement__Group_1__3__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_0__0() throws RecognitionException;
+     void rule__DataTypeReference__Group_0__0__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_0__1() throws RecognitionException;
+     void rule__DataTypeReference__Group_0__1__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_0_1__0() throws RecognitionException;
+     void rule__DataTypeReference__Group_0_1__0__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_0_1__1() throws RecognitionException;
+     void rule__DataTypeReference__Group_0_1__1__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_0_1__2() throws RecognitionException;
+     void rule__DataTypeReference__Group_0_1__2__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_0_1__3() throws RecognitionException;
+     void rule__DataTypeReference__Group_0_1__3__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_1__0() throws RecognitionException;
+     void rule__DataTypeReference__Group_1__0__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_1__1() throws RecognitionException;
+     void rule__DataTypeReference__Group_1__1__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_1__2() throws RecognitionException;
+     void rule__DataTypeReference__Group_1__2__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_1_2__0() throws RecognitionException;
+     void rule__DataTypeReference__Group_1_2__0__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_1_2__1() throws RecognitionException;
+     void rule__DataTypeReference__Group_1_2__1__Impl() throws RecognitionException;
+     void rule__DataTypeReference__Group_1_2__2() throws RecognitionException;
+     void rule__DataTypeReference__Group_1_2__2__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__2() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__2__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__3() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__3__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__4() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__4__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__5() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__5__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__6() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group__6__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0_1__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0_1__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0_1__2() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1_1__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1_1__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1_1__2() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__2() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__2__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__3() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__3__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__4() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group__4__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group__0() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group__0__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group__1() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group__1__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group__2() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group__2__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group__3() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group__3__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_0__0() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_0__1() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_1__0() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_1__1() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_1__2() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_1__2__Impl() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_1__3() throws RecognitionException;
+     void rule__PrimitiveIntegerType__Group_3_1__3__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group__0() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group__0__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group__1() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group__1__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group__2() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group__2__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group__3() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group__3__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_0__0() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_0__1() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_1__0() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_1__1() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_1__2() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_1__2__Impl() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_1__3() throws RecognitionException;
+     void rule__PrimitiveRationalType__Group_3_1__3__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group__0() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group__0__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group__1() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group__1__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group__2() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group__2__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group__3() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group__3__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_0__0() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_0__1() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_1__0() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_1__1() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_1__2() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_1__2__Impl() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_1__3() throws RecognitionException;
+     void rule__PrimitiveFloatType__Group_3_1__3__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group__0() throws RecognitionException;
+     void rule__PrimitiveRealType__Group__0__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group__1() throws RecognitionException;
+     void rule__PrimitiveRealType__Group__1__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group__2() throws RecognitionException;
+     void rule__PrimitiveRealType__Group__2__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group__3() throws RecognitionException;
+     void rule__PrimitiveRealType__Group__3__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_0__0() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_0__1() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_1__0() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_1__1() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_1__2() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_1__2__Impl() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_1__3() throws RecognitionException;
+     void rule__PrimitiveRealType__Group_3_1__3__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0__0() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0__0__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0__1() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0__1__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0__2() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0__2__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0_2_0__0() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0_2_0__0__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0_2_0__1() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0_2_0__1__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0_2_0__2() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_0_2_0__2__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1__0() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1__0__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1__1() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1__1__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1__2() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1__2__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1_2_0__0() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1_2_0__0__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1_2_0__1() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1_2_0__1__Impl() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1_2_0__2() throws RecognitionException;
+     void rule__PrimitiveTimeType__Group_1_2_0__2__Impl() throws RecognitionException;
+     void rule__PrimitiveBooleanType__Group__0() throws RecognitionException;
+     void rule__PrimitiveBooleanType__Group__0__Impl() throws RecognitionException;
+     void rule__PrimitiveBooleanType__Group__1() throws RecognitionException;
+     void rule__PrimitiveBooleanType__Group__1__Impl() throws RecognitionException;
+     void rule__PrimitiveCharacterType__Group__0() throws RecognitionException;
+     void rule__PrimitiveCharacterType__Group__0__Impl() throws RecognitionException;
+     void rule__PrimitiveCharacterType__Group__1() throws RecognitionException;
+     void rule__PrimitiveCharacterType__Group__1__Impl() throws RecognitionException;
+     void rule__PrimitiveStringType__Group__0() throws RecognitionException;
+     void rule__PrimitiveStringType__Group__0__Impl() throws RecognitionException;
+     void rule__PrimitiveStringType__Group__1() throws RecognitionException;
+     void rule__PrimitiveStringType__Group__1__Impl() throws RecognitionException;
+     void rule__PrimitiveStringType__Group__2() throws RecognitionException;
+     void rule__PrimitiveStringType__Group__2__Impl() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_0__0() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_0__0__Impl() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_0__1() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_0__1__Impl() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_1__0() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_1__0__Impl() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_1__1() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_1__1__Impl() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_1__2() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_1__2__Impl() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_1__3() throws RecognitionException;
+     void rule__PrimitiveStringType__Group_2_1__3__Impl() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group__0() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group__0__Impl() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group__1() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group__1__Impl() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group__2() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group__2__Impl() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group_2__0() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group_2__0__Impl() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group_2__1() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group_2__1__Impl() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group_2__2() throws RecognitionException;
+     void rule__PrimitiveInstanceType__Group_2__2__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__0() throws RecognitionException;
+     void rule__IntervalType__Group__0__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__1() throws RecognitionException;
+     void rule__IntervalType__Group__1__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__2() throws RecognitionException;
+     void rule__IntervalType__Group__2__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__3() throws RecognitionException;
+     void rule__IntervalType__Group__3__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__4() throws RecognitionException;
+     void rule__IntervalType__Group__4__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__5() throws RecognitionException;
+     void rule__IntervalType__Group__5__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__6() throws RecognitionException;
+     void rule__IntervalType__Group__6__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__7() throws RecognitionException;
+     void rule__IntervalType__Group__7__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__8() throws RecognitionException;
+     void rule__IntervalType__Group__8__Impl() throws RecognitionException;
+     void rule__IntervalType__Group__9() throws RecognitionException;
+     void rule__IntervalType__Group__9__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__0() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__0__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__1() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__1__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__2() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__2__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__3() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__3__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__4() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__4__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__5() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__5__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__6() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__6__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__7() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__7__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__8() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__8__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__9() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__9__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__10() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__10__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__11() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__11__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__12() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__12__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__13() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__13__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__14() throws RecognitionException;
+     void rule__IntervalTypeDefinition__Group__14__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__0() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__0__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__1() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__1__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__2() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__2__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__3() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__3__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__4() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__4__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__5() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__5__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__6() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__6__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__7() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__7__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__8() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__8__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__9() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__9__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__10() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__10__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__11() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__11__Impl() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__12() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__Group__12__Impl() throws RecognitionException;
+     void rule__CollectionType__Group__0() throws RecognitionException;
+     void rule__CollectionType__Group__0__Impl() throws RecognitionException;
+     void rule__CollectionType__Group__1() throws RecognitionException;
+     void rule__CollectionType__Group__1__Impl() throws RecognitionException;
+     void rule__CollectionType__Group__2() throws RecognitionException;
+     void rule__CollectionType__Group__2__Impl() throws RecognitionException;
+     void rule__CollectionType__Group__3() throws RecognitionException;
+     void rule__CollectionType__Group__3__Impl() throws RecognitionException;
+     void rule__CollectionType__Group__4() throws RecognitionException;
+     void rule__CollectionType__Group__4__Impl() throws RecognitionException;
+     void rule__CollectionType__Group__5() throws RecognitionException;
+     void rule__CollectionType__Group__5__Impl() throws RecognitionException;
+     void rule__CollectionType__Group_4__0() throws RecognitionException;
+     void rule__CollectionType__Group_4__0__Impl() throws RecognitionException;
+     void rule__CollectionType__Group_4__1() throws RecognitionException;
+     void rule__CollectionType__Group_4__1__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__0() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__0__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__1() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__1__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__2() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__2__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__3() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__3__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__4() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__4__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__5() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__5__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__6() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__6__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__7() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__7__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__8() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__8__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__9() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__9__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__10() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group__10__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group_8__0() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group_8__0__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group_8__1() throws RecognitionException;
+     void rule__CollectionTypeDefinition__Group_8__1__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__0() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__0__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__1() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__1__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__2() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__2__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__3() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__3__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__4() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__4__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__5() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__5__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__6() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__6__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__7() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__7__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__8() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group__8__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group_6__0() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group_6__0__Impl() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group_6__1() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__Group_6__1__Impl() throws RecognitionException;
+     void rule__EnumerationType__Group__0() throws RecognitionException;
+     void rule__EnumerationType__Group__0__Impl() throws RecognitionException;
+     void rule__EnumerationType__Group__1() throws RecognitionException;
+     void rule__EnumerationType__Group__1__Impl() throws RecognitionException;
+     void rule__EnumerationType__Group__2() throws RecognitionException;
+     void rule__EnumerationType__Group__2__Impl() throws RecognitionException;
+     void rule__EnumerationType__Group__3() throws RecognitionException;
+     void rule__EnumerationType__Group__3__Impl() throws RecognitionException;
+     void rule__EnumerationType__Group__4() throws RecognitionException;
+     void rule__EnumerationType__Group__4__Impl() throws RecognitionException;
+     void rule__EnumerationType__Group__5() throws RecognitionException;
+     void rule__EnumerationType__Group__5__Impl() throws RecognitionException;
+     void rule__EnumerationType__Group_4__0() throws RecognitionException;
+     void rule__EnumerationType__Group_4__0__Impl() throws RecognitionException;
+     void rule__EnumerationType__Group_4__1() throws RecognitionException;
+     void rule__EnumerationType__Group_4__1__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__0() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__0__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__1() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__1__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__2() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__2__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__3() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__3__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__4() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__4__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__5() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__5__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__6() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__6__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__7() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__7__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__8() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__8__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__9() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group__9__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group_8__0() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group_8__0__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group_8__1() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__Group_8__1__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__0() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__0__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__1() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__1__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__2() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__2__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__3() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__3__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__4() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__4__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__5() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__5__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__6() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__6__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__7() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group__7__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group_6__0() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group_6__1() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl() throws RecognitionException;
+     void rule__EnumerationLiteral__Group__0() throws RecognitionException;
+     void rule__EnumerationLiteral__Group__0__Impl() throws RecognitionException;
+     void rule__EnumerationLiteral__Group__1() throws RecognitionException;
+     void rule__EnumerationLiteral__Group__1__Impl() throws RecognitionException;
+     void rule__EnumerationLiteral__Group__2() throws RecognitionException;
+     void rule__EnumerationLiteral__Group__2__Impl() throws RecognitionException;
+     void rule__EnumerationLiteral__Group_2__0() throws RecognitionException;
+     void rule__EnumerationLiteral__Group_2__0__Impl() throws RecognitionException;
+     void rule__EnumerationLiteral__Group_2__1() throws RecognitionException;
+     void rule__EnumerationLiteral__Group_2__1__Impl() throws RecognitionException;
+     void rule__StructureType__Group__0() throws RecognitionException;
+     void rule__StructureType__Group__0__Impl() throws RecognitionException;
+     void rule__StructureType__Group__1() throws RecognitionException;
+     void rule__StructureType__Group__1__Impl() throws RecognitionException;
+     void rule__StructureType__Group__2() throws RecognitionException;
+     void rule__StructureType__Group__2__Impl() throws RecognitionException;
+     void rule__StructureType__Group__3() throws RecognitionException;
+     void rule__StructureType__Group__3__Impl() throws RecognitionException;
+     void rule__StructureType__Group__4() throws RecognitionException;
+     void rule__StructureType__Group__4__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__0() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__0__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__1() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__1__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__2() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__2__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__3() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__3__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__4() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__4__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__5() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__5__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__6() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__6__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__7() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__7__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__8() throws RecognitionException;
+     void rule__StructureTypeDefinition__Group__8__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__0() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__0__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__1() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__1__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__2() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__2__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__3() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__3__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__4() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__4__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__5() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__5__Impl() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__6() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__Group__6__Impl() throws RecognitionException;
+     void rule__UnionType__Group__0() throws RecognitionException;
+     void rule__UnionType__Group__0__Impl() throws RecognitionException;
+     void rule__UnionType__Group__1() throws RecognitionException;
+     void rule__UnionType__Group__1__Impl() throws RecognitionException;
+     void rule__UnionType__Group__2() throws RecognitionException;
+     void rule__UnionType__Group__2__Impl() throws RecognitionException;
+     void rule__UnionType__Group__3() throws RecognitionException;
+     void rule__UnionType__Group__3__Impl() throws RecognitionException;
+     void rule__UnionType__Group__4() throws RecognitionException;
+     void rule__UnionType__Group__4__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__0() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__0__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__1() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__1__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__2() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__2__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__3() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__3__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__4() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__4__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__5() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__5__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__6() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__6__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__7() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__7__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__8() throws RecognitionException;
+     void rule__UnionTypeDefinition__Group__8__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__0() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__0__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__1() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__1__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__2() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__2__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__3() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__3__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__4() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__4__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__5() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__5__Impl() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__6() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__Group__6__Impl() throws RecognitionException;
+     void rule__ChoiceType__Group__0() throws RecognitionException;
+     void rule__ChoiceType__Group__0__Impl() throws RecognitionException;
+     void rule__ChoiceType__Group__1() throws RecognitionException;
+     void rule__ChoiceType__Group__1__Impl() throws RecognitionException;
+     void rule__ChoiceType__Group__2() throws RecognitionException;
+     void rule__ChoiceType__Group__2__Impl() throws RecognitionException;
+     void rule__ChoiceType__Group__3() throws RecognitionException;
+     void rule__ChoiceType__Group__3__Impl() throws RecognitionException;
+     void rule__ChoiceType__Group__4() throws RecognitionException;
+     void rule__ChoiceType__Group__4__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__0() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__0__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__1() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__1__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__2() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__2__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__3() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__3__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__4() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__4__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__5() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__5__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__6() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__6__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__7() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__7__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__8() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__Group__8__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__0() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__0__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__1() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__1__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__2() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__2__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__3() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__3__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__4() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__4__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__5() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__5__Impl() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__6() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__Group__6__Impl() throws RecognitionException;
+     void rule__Modifier__Group__0() throws RecognitionException;
+     void rule__Modifier__Group__0__Impl() throws RecognitionException;
+     void rule__Modifier__Group__1() throws RecognitionException;
+     void rule__Modifier__Group__1__Impl() throws RecognitionException;
+     void rule__Variable__Group__0() throws RecognitionException;
+     void rule__Variable__Group__0__Impl() throws RecognitionException;
+     void rule__Variable__Group__1() throws RecognitionException;
+     void rule__Variable__Group__1__Impl() throws RecognitionException;
+     void rule__Variable__Group__2() throws RecognitionException;
+     void rule__Variable__Group__2__Impl() throws RecognitionException;
+     void rule__Variable__Group__3() throws RecognitionException;
+     void rule__Variable__Group__3__Impl() throws RecognitionException;
+     void rule__Variable__Group__4() throws RecognitionException;
+     void rule__Variable__Group__4__Impl() throws RecognitionException;
+     void rule__Variable__Group__5() throws RecognitionException;
+     void rule__Variable__Group__5__Impl() throws RecognitionException;
+     void rule__Variable__Group__6() throws RecognitionException;
+     void rule__Variable__Group__6__Impl() throws RecognitionException;
+     void rule__Variable__Group_1_2__0() throws RecognitionException;
+     void rule__Variable__Group_1_2__0__Impl() throws RecognitionException;
+     void rule__Variable__Group_1_2__1() throws RecognitionException;
+     void rule__Variable__Group_1_2__1__Impl() throws RecognitionException;
+     void rule__Variable__Group_1_2__2() throws RecognitionException;
+     void rule__Variable__Group_1_2__2__Impl() throws RecognitionException;
+     void rule__Variable__Group_1_3__0() throws RecognitionException;
+     void rule__Variable__Group_1_3__0__Impl() throws RecognitionException;
+     void rule__Variable__Group_1_3__1() throws RecognitionException;
+     void rule__Variable__Group_1_3__1__Impl() throws RecognitionException;
+     void rule__Variable__Group_5__0() throws RecognitionException;
+     void rule__Variable__Group_5__0__Impl() throws RecognitionException;
+     void rule__Variable__Group_5__1() throws RecognitionException;
+     void rule__Variable__Group_5__1__Impl() throws RecognitionException;
+     void rule__Variable__Group_6_0__0() throws RecognitionException;
+     void rule__Variable__Group_6_0__0__Impl() throws RecognitionException;
+     void rule__Variable__Group_6_0__1() throws RecognitionException;
+     void rule__Variable__Group_6_0__1__Impl() throws RecognitionException;
+     void rule__Variable__Group_6_0__2() throws RecognitionException;
+     void rule__Variable__Group_6_0__2__Impl() throws RecognitionException;
+     void rule__OnWriteRoutine__Group__0() throws RecognitionException;
+     void rule__OnWriteRoutine__Group__0__Impl() throws RecognitionException;
+     void rule__OnWriteRoutine__Group__1() throws RecognitionException;
+     void rule__OnWriteRoutine__Group__1__Impl() throws RecognitionException;
+     void rule__OnWriteRoutine__Group__2() throws RecognitionException;
+     void rule__OnWriteRoutine__Group__2__Impl() throws RecognitionException;
+     void rule__OnWriteRoutine__Group__3() throws RecognitionException;
+     void rule__OnWriteRoutine__Group__3__Impl() throws RecognitionException;
+     void rule__OnWriteRoutine__Group_2__0() throws RecognitionException;
+     void rule__OnWriteRoutine__Group_2__0__Impl() throws RecognitionException;
+     void rule__OnWriteRoutine__Group_2__1() throws RecognitionException;
+     void rule__OnWriteRoutine__Group_2__1__Impl() throws RecognitionException;
+     void rule__OnWriteRoutine__Group_2__2() throws RecognitionException;
+     void rule__OnWriteRoutine__Group_2__2__Impl() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group__0() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group__0__Impl() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group__1() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group__1__Impl() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group__2() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group__2__Impl() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group_2__0() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group_2__0__Impl() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group_2__1() throws RecognitionException;
+     void rule__VariableRoutineParameter__Group_2__1__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group__0() throws RecognitionException;
+     void rule__VariablePublic__Group__0__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group__1() throws RecognitionException;
+     void rule__VariablePublic__Group__1__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group__2() throws RecognitionException;
+     void rule__VariablePublic__Group__2__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group__3() throws RecognitionException;
+     void rule__VariablePublic__Group__3__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group__4() throws RecognitionException;
+     void rule__VariablePublic__Group__4__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group__5() throws RecognitionException;
+     void rule__VariablePublic__Group__5__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group__6() throws RecognitionException;
+     void rule__VariablePublic__Group__6__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group__7() throws RecognitionException;
+     void rule__VariablePublic__Group__7__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group_6__0() throws RecognitionException;
+     void rule__VariablePublic__Group_6__0__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group_6__1() throws RecognitionException;
+     void rule__VariablePublic__Group_6__1__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group_7_0__0() throws RecognitionException;
+     void rule__VariablePublic__Group_7_0__0__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group_7_0__1() throws RecognitionException;
+     void rule__VariablePublic__Group_7_0__1__Impl() throws RecognitionException;
+     void rule__VariablePublic__Group_7_0__2() throws RecognitionException;
+     void rule__VariablePublic__Group_7_0__2__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group__0() throws RecognitionException;
+     void rule__VariableProtected__Group__0__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group__1() throws RecognitionException;
+     void rule__VariableProtected__Group__1__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group__2() throws RecognitionException;
+     void rule__VariableProtected__Group__2__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group__3() throws RecognitionException;
+     void rule__VariableProtected__Group__3__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group__4() throws RecognitionException;
+     void rule__VariableProtected__Group__4__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group__5() throws RecognitionException;
+     void rule__VariableProtected__Group__5__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group__6() throws RecognitionException;
+     void rule__VariableProtected__Group__6__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group__7() throws RecognitionException;
+     void rule__VariableProtected__Group__7__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group_6__0() throws RecognitionException;
+     void rule__VariableProtected__Group_6__0__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group_6__1() throws RecognitionException;
+     void rule__VariableProtected__Group_6__1__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group_7_0__0() throws RecognitionException;
+     void rule__VariableProtected__Group_7_0__0__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group_7_0__1() throws RecognitionException;
+     void rule__VariableProtected__Group_7_0__1__Impl() throws RecognitionException;
+     void rule__VariableProtected__Group_7_0__2() throws RecognitionException;
+     void rule__VariableProtected__Group_7_0__2__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group__0() throws RecognitionException;
+     void rule__VariablePrivate__Group__0__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group__1() throws RecognitionException;
+     void rule__VariablePrivate__Group__1__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group__2() throws RecognitionException;
+     void rule__VariablePrivate__Group__2__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group__3() throws RecognitionException;
+     void rule__VariablePrivate__Group__3__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group__4() throws RecognitionException;
+     void rule__VariablePrivate__Group__4__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group__5() throws RecognitionException;
+     void rule__VariablePrivate__Group__5__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group__6() throws RecognitionException;
+     void rule__VariablePrivate__Group__6__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group__7() throws RecognitionException;
+     void rule__VariablePrivate__Group__7__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group_6__0() throws RecognitionException;
+     void rule__VariablePrivate__Group_6__0__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group_6__1() throws RecognitionException;
+     void rule__VariablePrivate__Group_6__1__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group_7_0__0() throws RecognitionException;
+     void rule__VariablePrivate__Group_7_0__0__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group_7_0__1() throws RecognitionException;
+     void rule__VariablePrivate__Group_7_0__1__Impl() throws RecognitionException;
+     void rule__VariablePrivate__Group_7_0__2() throws RecognitionException;
+     void rule__VariablePrivate__Group_7_0__2__Impl() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group__0() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group__0__Impl() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group__1() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group__1__Impl() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group__2() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group__2__Impl() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group_2__0() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group_2__0__Impl() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group_2__1() throws RecognitionException;
+     void rule__FunctionalParameterSet__Group_2__1__Impl() throws RecognitionException;
+     void rule__FunctionalParameter__Group__0() throws RecognitionException;
+     void rule__FunctionalParameter__Group__0__Impl() throws RecognitionException;
+     void rule__FunctionalParameter__Group__1() throws RecognitionException;
+     void rule__FunctionalParameter__Group__1__Impl() throws RecognitionException;
+     void rule__FunctionalParameter__Group__2() throws RecognitionException;
+     void rule__FunctionalParameter__Group__2__Impl() throws RecognitionException;
+     void rule__FunctionalParameter__Group__3() throws RecognitionException;
+     void rule__FunctionalParameter__Group__3__Impl() throws RecognitionException;
+     void rule__FunctionalParameter__Group__4() throws RecognitionException;
+     void rule__FunctionalParameter__Group__4__Impl() throws RecognitionException;
+     void rule__FunctionalParameter__Group_4__0() throws RecognitionException;
+     void rule__FunctionalParameter__Group_4__0__Impl() throws RecognitionException;
+     void rule__FunctionalParameter__Group_4__1() throws RecognitionException;
+     void rule__FunctionalParameter__Group_4__1__Impl() throws RecognitionException;
+     void rule__FormalParameterSet__Group__0() throws RecognitionException;
+     void rule__FormalParameterSet__Group__0__Impl() throws RecognitionException;
+     void rule__FormalParameterSet__Group__1() throws RecognitionException;
+     void rule__FormalParameterSet__Group__1__Impl() throws RecognitionException;
+     void rule__FormalParameterSet__Group__2() throws RecognitionException;
+     void rule__FormalParameterSet__Group__2__Impl() throws RecognitionException;
+     void rule__FormalParameterSet__Group_2__0() throws RecognitionException;
+     void rule__FormalParameterSet__Group_2__0__Impl() throws RecognitionException;
+     void rule__FormalParameterSet__Group_2__1() throws RecognitionException;
+     void rule__FormalParameterSet__Group_2__1__Impl() throws RecognitionException;
+     void rule__FormalParameter__Group__0() throws RecognitionException;
+     void rule__FormalParameter__Group__0__Impl() throws RecognitionException;
+     void rule__FormalParameter__Group__1() throws RecognitionException;
+     void rule__FormalParameter__Group__1__Impl() throws RecognitionException;
+     void rule__FormalParameter__Group__2() throws RecognitionException;
+     void rule__FormalParameter__Group__2__Impl() throws RecognitionException;
+     void rule__FormalParameter__Group__3() throws RecognitionException;
+     void rule__FormalParameter__Group__3__Impl() throws RecognitionException;
+     void rule__FormalParameter__Group__4() throws RecognitionException;
+     void rule__FormalParameter__Group__4__Impl() throws RecognitionException;
+     void rule__FormalParameter__Group_4__0() throws RecognitionException;
+     void rule__FormalParameter__Group_4__0__Impl() throws RecognitionException;
+     void rule__FormalParameter__Group_4__1() throws RecognitionException;
+     void rule__FormalParameter__Group_4__1__Impl() throws RecognitionException;
+     void rule__ParameterInput__Group__0() throws RecognitionException;
+     void rule__ParameterInput__Group__0__Impl() throws RecognitionException;
+     void rule__ParameterInput__Group__1() throws RecognitionException;
+     void rule__ParameterInput__Group__1__Impl() throws RecognitionException;
+     void rule__ParameterInput__Group__2() throws RecognitionException;
+     void rule__ParameterInput__Group__2__Impl() throws RecognitionException;
+     void rule__ParameterInput__Group__3() throws RecognitionException;
+     void rule__ParameterInput__Group__3__Impl() throws RecognitionException;
+     void rule__ParameterInput__Group__4() throws RecognitionException;
+     void rule__ParameterInput__Group__4__Impl() throws RecognitionException;
+     void rule__ParameterInput__Group__5() throws RecognitionException;
+     void rule__ParameterInput__Group__5__Impl() throws RecognitionException;
+     void rule__ParameterInput__Group_4__0() throws RecognitionException;
+     void rule__ParameterInput__Group_4__0__Impl() throws RecognitionException;
+     void rule__ParameterInput__Group_4__1() throws RecognitionException;
+     void rule__ParameterInput__Group_4__1__Impl() throws RecognitionException;
+     void rule__ParameterInout__Group__0() throws RecognitionException;
+     void rule__ParameterInout__Group__0__Impl() throws RecognitionException;
+     void rule__ParameterInout__Group__1() throws RecognitionException;
+     void rule__ParameterInout__Group__1__Impl() throws RecognitionException;
+     void rule__ParameterInout__Group__2() throws RecognitionException;
+     void rule__ParameterInout__Group__2__Impl() throws RecognitionException;
+     void rule__ParameterInout__Group__3() throws RecognitionException;
+     void rule__ParameterInout__Group__3__Impl() throws RecognitionException;
+     void rule__ParameterInout__Group__4() throws RecognitionException;
+     void rule__ParameterInout__Group__4__Impl() throws RecognitionException;
+     void rule__ParameterInout__Group__5() throws RecognitionException;
+     void rule__ParameterInout__Group__5__Impl() throws RecognitionException;
+     void rule__ParameterInout__Group_4__0() throws RecognitionException;
+     void rule__ParameterInout__Group_4__0__Impl() throws RecognitionException;
+     void rule__ParameterInout__Group_4__1() throws RecognitionException;
+     void rule__ParameterInout__Group_4__1__Impl() throws RecognitionException;
+     void rule__ParameterOutput__Group__0() throws RecognitionException;
+     void rule__ParameterOutput__Group__0__Impl() throws RecognitionException;
+     void rule__ParameterOutput__Group__1() throws RecognitionException;
+     void rule__ParameterOutput__Group__1__Impl() throws RecognitionException;
+     void rule__ParameterOutput__Group__2() throws RecognitionException;
+     void rule__ParameterOutput__Group__2__Impl() throws RecognitionException;
+     void rule__ParameterOutput__Group__3() throws RecognitionException;
+     void rule__ParameterOutput__Group__3__Impl() throws RecognitionException;
+     void rule__ParameterOutput__Group__4() throws RecognitionException;
+     void rule__ParameterOutput__Group__4__Impl() throws RecognitionException;
+     void rule__ParameterOutput__Group__5() throws RecognitionException;
+     void rule__ParameterOutput__Group__5__Impl() throws RecognitionException;
+     void rule__ParameterOutput__Group_4__0() throws RecognitionException;
+     void rule__ParameterOutput__Group_4__0__Impl() throws RecognitionException;
+     void rule__ParameterOutput__Group_4__1() throws RecognitionException;
+     void rule__ParameterOutput__Group_4__1__Impl() throws RecognitionException;
+     void rule__ParameterReturn__Group__0() throws RecognitionException;
+     void rule__ParameterReturn__Group__0__Impl() throws RecognitionException;
+     void rule__ParameterReturn__Group__1() throws RecognitionException;
+     void rule__ParameterReturn__Group__1__Impl() throws RecognitionException;
+     void rule__ParameterReturn__Group__2() throws RecognitionException;
+     void rule__ParameterReturn__Group__2__Impl() throws RecognitionException;
+     void rule__ParameterReturn__Group__3() throws RecognitionException;
+     void rule__ParameterReturn__Group__3__Impl() throws RecognitionException;
+     void rule__ParameterReturn__Group__4() throws RecognitionException;
+     void rule__ParameterReturn__Group__4__Impl() throws RecognitionException;
+     void rule__ParameterReturn__Group__5() throws RecognitionException;
+     void rule__ParameterReturn__Group__5__Impl() throws RecognitionException;
+     void rule__ParameterReturn__Group_4__0() throws RecognitionException;
+     void rule__ParameterReturn__Group_4__0__Impl() throws RecognitionException;
+     void rule__ParameterReturn__Group_4__1() throws RecognitionException;
+     void rule__ParameterReturn__Group_4__1__Impl() throws RecognitionException;
+     void rule__BufferContainerType__Group__0() throws RecognitionException;
+     void rule__BufferContainerType__Group__0__Impl() throws RecognitionException;
+     void rule__BufferContainerType__Group__1() throws RecognitionException;
+     void rule__BufferContainerType__Group__1__Impl() throws RecognitionException;
+     void rule__BufferContainerType__Group__2() throws RecognitionException;
+     void rule__BufferContainerType__Group__2__Impl() throws RecognitionException;
+     void rule__BufferContainerType__Group_2__0() throws RecognitionException;
+     void rule__BufferContainerType__Group_2__0__Impl() throws RecognitionException;
+     void rule__BufferContainerType__Group_2__1() throws RecognitionException;
+     void rule__BufferContainerType__Group_2__1__Impl() throws RecognitionException;
+     void rule__BufferContainerType__Group_2__2() throws RecognitionException;
+     void rule__BufferContainerType__Group_2__2__Impl() throws RecognitionException;
+     void rule__Buffer__Group__0() throws RecognitionException;
+     void rule__Buffer__Group__0__Impl() throws RecognitionException;
+     void rule__Buffer__Group__1() throws RecognitionException;
+     void rule__Buffer__Group__1__Impl() throws RecognitionException;
+     void rule__Buffer__Group__2() throws RecognitionException;
+     void rule__Buffer__Group__2__Impl() throws RecognitionException;
+     void rule__Buffer__Group__3() throws RecognitionException;
+     void rule__Buffer__Group__3__Impl() throws RecognitionException;
+     void rule__Buffer__Group__4() throws RecognitionException;
+     void rule__Buffer__Group__4__Impl() throws RecognitionException;
+     void rule__Buffer__Group__5() throws RecognitionException;
+     void rule__Buffer__Group__5__Impl() throws RecognitionException;
+     void rule__BufferPublic__Group__0() throws RecognitionException;
+     void rule__BufferPublic__Group__0__Impl() throws RecognitionException;
+     void rule__BufferPublic__Group__1() throws RecognitionException;
+     void rule__BufferPublic__Group__1__Impl() throws RecognitionException;
+     void rule__BufferPublic__Group__2() throws RecognitionException;
+     void rule__BufferPublic__Group__2__Impl() throws RecognitionException;
+     void rule__BufferPublic__Group__3() throws RecognitionException;
+     void rule__BufferPublic__Group__3__Impl() throws RecognitionException;
+     void rule__BufferPublic__Group__4() throws RecognitionException;
+     void rule__BufferPublic__Group__4__Impl() throws RecognitionException;
+     void rule__BufferPublic__Group__5() throws RecognitionException;
+     void rule__BufferPublic__Group__5__Impl() throws RecognitionException;
+     void rule__BufferProtected__Group__0() throws RecognitionException;
+     void rule__BufferProtected__Group__0__Impl() throws RecognitionException;
+     void rule__BufferProtected__Group__1() throws RecognitionException;
+     void rule__BufferProtected__Group__1__Impl() throws RecognitionException;
+     void rule__BufferProtected__Group__2() throws RecognitionException;
+     void rule__BufferProtected__Group__2__Impl() throws RecognitionException;
+     void rule__BufferProtected__Group__3() throws RecognitionException;
+     void rule__BufferProtected__Group__3__Impl() throws RecognitionException;
+     void rule__BufferProtected__Group__4() throws RecognitionException;
+     void rule__BufferProtected__Group__4__Impl() throws RecognitionException;
+     void rule__BufferProtected__Group__5() throws RecognitionException;
+     void rule__BufferProtected__Group__5__Impl() throws RecognitionException;
+     void rule__BufferPrivate__Group__0() throws RecognitionException;
+     void rule__BufferPrivate__Group__0__Impl() throws RecognitionException;
+     void rule__BufferPrivate__Group__1() throws RecognitionException;
+     void rule__BufferPrivate__Group__1__Impl() throws RecognitionException;
+     void rule__BufferPrivate__Group__2() throws RecognitionException;
+     void rule__BufferPrivate__Group__2__Impl() throws RecognitionException;
+     void rule__BufferPrivate__Group__3() throws RecognitionException;
+     void rule__BufferPrivate__Group__3__Impl() throws RecognitionException;
+     void rule__BufferPrivate__Group__4() throws RecognitionException;
+     void rule__BufferPrivate__Group__4__Impl() throws RecognitionException;
+     void rule__BufferPrivate__Group__5() throws RecognitionException;
+     void rule__BufferPrivate__Group__5__Impl() throws RecognitionException;
+     void rule__Port__Group__0() throws RecognitionException;
+     void rule__Port__Group__0__Impl() throws RecognitionException;
+     void rule__Port__Group__1() throws RecognitionException;
+     void rule__Port__Group__1__Impl() throws RecognitionException;
+     void rule__Port__Group__2() throws RecognitionException;
+     void rule__Port__Group__2__Impl() throws RecognitionException;
+     void rule__Port__Group__3() throws RecognitionException;
+     void rule__Port__Group__3__Impl() throws RecognitionException;
+     void rule__Port__Group__4() throws RecognitionException;
+     void rule__Port__Group__4__Impl() throws RecognitionException;
+     void rule__Port__Group__5() throws RecognitionException;
+     void rule__Port__Group__5__Impl() throws RecognitionException;
+     void rule__Port__Group__6() throws RecognitionException;
+     void rule__Port__Group__6__Impl() throws RecognitionException;
+     void rule__Port__Group_5__0() throws RecognitionException;
+     void rule__Port__Group_5__0__Impl() throws RecognitionException;
+     void rule__Port__Group_5__1() throws RecognitionException;
+     void rule__Port__Group_5__1__Impl() throws RecognitionException;
+     void rule__Port__Group_5__2() throws RecognitionException;
+     void rule__Port__Group_5__2__Impl() throws RecognitionException;
+     void rule__Port__Group_5__3() throws RecognitionException;
+     void rule__Port__Group_5__3__Impl() throws RecognitionException;
+     void rule__Port__Group_5_2__0() throws RecognitionException;
+     void rule__Port__Group_5_2__0__Impl() throws RecognitionException;
+     void rule__Port__Group_5_2__1() throws RecognitionException;
+     void rule__Port__Group_5_2__1__Impl() throws RecognitionException;
+     void rule__PortPublic__Group__0() throws RecognitionException;
+     void rule__PortPublic__Group__0__Impl() throws RecognitionException;
+     void rule__PortPublic__Group__1() throws RecognitionException;
+     void rule__PortPublic__Group__1__Impl() throws RecognitionException;
+     void rule__PortPublic__Group__2() throws RecognitionException;
+     void rule__PortPublic__Group__2__Impl() throws RecognitionException;
+     void rule__PortPublic__Group__3() throws RecognitionException;
+     void rule__PortPublic__Group__3__Impl() throws RecognitionException;
+     void rule__PortPublic__Group__4() throws RecognitionException;
+     void rule__PortPublic__Group__4__Impl() throws RecognitionException;
+     void rule__PortPublic__Group__5() throws RecognitionException;
+     void rule__PortPublic__Group__5__Impl() throws RecognitionException;
+     void rule__PortPublic__Group_4__0() throws RecognitionException;
+     void rule__PortPublic__Group_4__0__Impl() throws RecognitionException;
+     void rule__PortPublic__Group_4__1() throws RecognitionException;
+     void rule__PortPublic__Group_4__1__Impl() throws RecognitionException;
+     void rule__PortPublic__Group_4__2() throws RecognitionException;
+     void rule__PortPublic__Group_4__2__Impl() throws RecognitionException;
+     void rule__PortPublic__Group_4__3() throws RecognitionException;
+     void rule__PortPublic__Group_4__3__Impl() throws RecognitionException;
+     void rule__PortPublic__Group_4_2__0() throws RecognitionException;
+     void rule__PortPublic__Group_4_2__0__Impl() throws RecognitionException;
+     void rule__PortPublic__Group_4_2__1() throws RecognitionException;
+     void rule__PortPublic__Group_4_2__1__Impl() throws RecognitionException;
+     void rule__PortProtected__Group__0() throws RecognitionException;
+     void rule__PortProtected__Group__0__Impl() throws RecognitionException;
+     void rule__PortProtected__Group__1() throws RecognitionException;
+     void rule__PortProtected__Group__1__Impl() throws RecognitionException;
+     void rule__PortProtected__Group__2() throws RecognitionException;
+     void rule__PortProtected__Group__2__Impl() throws RecognitionException;
+     void rule__PortProtected__Group__3() throws RecognitionException;
+     void rule__PortProtected__Group__3__Impl() throws RecognitionException;
+     void rule__PortProtected__Group__4() throws RecognitionException;
+     void rule__PortProtected__Group__4__Impl() throws RecognitionException;
+     void rule__PortProtected__Group__5() throws RecognitionException;
+     void rule__PortProtected__Group__5__Impl() throws RecognitionException;
+     void rule__PortProtected__Group_4__0() throws RecognitionException;
+     void rule__PortProtected__Group_4__0__Impl() throws RecognitionException;
+     void rule__PortProtected__Group_4__1() throws RecognitionException;
+     void rule__PortProtected__Group_4__1__Impl() throws RecognitionException;
+     void rule__PortProtected__Group_4__2() throws RecognitionException;
+     void rule__PortProtected__Group_4__2__Impl() throws RecognitionException;
+     void rule__PortProtected__Group_4__3() throws RecognitionException;
+     void rule__PortProtected__Group_4__3__Impl() throws RecognitionException;
+     void rule__PortProtected__Group_4_2__0() throws RecognitionException;
+     void rule__PortProtected__Group_4_2__0__Impl() throws RecognitionException;
+     void rule__PortProtected__Group_4_2__1() throws RecognitionException;
+     void rule__PortProtected__Group_4_2__1__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group__0() throws RecognitionException;
+     void rule__PortPrivate__Group__0__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group__1() throws RecognitionException;
+     void rule__PortPrivate__Group__1__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group__2() throws RecognitionException;
+     void rule__PortPrivate__Group__2__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group__3() throws RecognitionException;
+     void rule__PortPrivate__Group__3__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group__4() throws RecognitionException;
+     void rule__PortPrivate__Group__4__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group__5() throws RecognitionException;
+     void rule__PortPrivate__Group__5__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group_4__0() throws RecognitionException;
+     void rule__PortPrivate__Group_4__0__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group_4__1() throws RecognitionException;
+     void rule__PortPrivate__Group_4__1__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group_4__2() throws RecognitionException;
+     void rule__PortPrivate__Group_4__2__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group_4__3() throws RecognitionException;
+     void rule__PortPrivate__Group_4__3__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group_4_2__0() throws RecognitionException;
+     void rule__PortPrivate__Group_4_2__0__Impl() throws RecognitionException;
+     void rule__PortPrivate__Group_4_2__1() throws RecognitionException;
+     void rule__PortPrivate__Group_4_2__1__Impl() throws RecognitionException;
+     void rule__Signal__Group__0() throws RecognitionException;
+     void rule__Signal__Group__0__Impl() throws RecognitionException;
+     void rule__Signal__Group__1() throws RecognitionException;
+     void rule__Signal__Group__1__Impl() throws RecognitionException;
+     void rule__Signal__Group__2() throws RecognitionException;
+     void rule__Signal__Group__2__Impl() throws RecognitionException;
+     void rule__Signal__Group__3() throws RecognitionException;
+     void rule__Signal__Group__3__Impl() throws RecognitionException;
+     void rule__Signal__Group__4() throws RecognitionException;
+     void rule__Signal__Group__4__Impl() throws RecognitionException;
+     void rule__Signal__Group__5() throws RecognitionException;
+     void rule__Signal__Group__5__Impl() throws RecognitionException;
+     void rule__Signal__Group__6() throws RecognitionException;
+     void rule__Signal__Group__6__Impl() throws RecognitionException;
+     void rule__Signal__Group_5__0() throws RecognitionException;
+     void rule__Signal__Group_5__0__Impl() throws RecognitionException;
+     void rule__Signal__Group_5__1() throws RecognitionException;
+     void rule__Signal__Group_5__1__Impl() throws RecognitionException;
+     void rule__Signal__Group_5__2() throws RecognitionException;
+     void rule__Signal__Group_5__2__Impl() throws RecognitionException;
+     void rule__Signal__Group_5__3() throws RecognitionException;
+     void rule__Signal__Group_5__3__Impl() throws RecognitionException;
+     void rule__Signal__Group_5_2__0() throws RecognitionException;
+     void rule__Signal__Group_5_2__0__Impl() throws RecognitionException;
+     void rule__Signal__Group_5_2__1() throws RecognitionException;
+     void rule__Signal__Group_5_2__1__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group__0() throws RecognitionException;
+     void rule__SignalPublic__Group__0__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group__1() throws RecognitionException;
+     void rule__SignalPublic__Group__1__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group__2() throws RecognitionException;
+     void rule__SignalPublic__Group__2__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group__3() throws RecognitionException;
+     void rule__SignalPublic__Group__3__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group__4() throws RecognitionException;
+     void rule__SignalPublic__Group__4__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group__5() throws RecognitionException;
+     void rule__SignalPublic__Group__5__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group_4__0() throws RecognitionException;
+     void rule__SignalPublic__Group_4__0__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group_4__1() throws RecognitionException;
+     void rule__SignalPublic__Group_4__1__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group_4__2() throws RecognitionException;
+     void rule__SignalPublic__Group_4__2__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group_4__3() throws RecognitionException;
+     void rule__SignalPublic__Group_4__3__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group_4_2__0() throws RecognitionException;
+     void rule__SignalPublic__Group_4_2__0__Impl() throws RecognitionException;
+     void rule__SignalPublic__Group_4_2__1() throws RecognitionException;
+     void rule__SignalPublic__Group_4_2__1__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group__0() throws RecognitionException;
+     void rule__SignalProtected__Group__0__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group__1() throws RecognitionException;
+     void rule__SignalProtected__Group__1__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group__2() throws RecognitionException;
+     void rule__SignalProtected__Group__2__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group__3() throws RecognitionException;
+     void rule__SignalProtected__Group__3__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group__4() throws RecognitionException;
+     void rule__SignalProtected__Group__4__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group__5() throws RecognitionException;
+     void rule__SignalProtected__Group__5__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group_4__0() throws RecognitionException;
+     void rule__SignalProtected__Group_4__0__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group_4__1() throws RecognitionException;
+     void rule__SignalProtected__Group_4__1__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group_4__2() throws RecognitionException;
+     void rule__SignalProtected__Group_4__2__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group_4__3() throws RecognitionException;
+     void rule__SignalProtected__Group_4__3__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group_4_2__0() throws RecognitionException;
+     void rule__SignalProtected__Group_4_2__0__Impl() throws RecognitionException;
+     void rule__SignalProtected__Group_4_2__1() throws RecognitionException;
+     void rule__SignalProtected__Group_4_2__1__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group__0() throws RecognitionException;
+     void rule__SignalPrivate__Group__0__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group__1() throws RecognitionException;
+     void rule__SignalPrivate__Group__1__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group__2() throws RecognitionException;
+     void rule__SignalPrivate__Group__2__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group__3() throws RecognitionException;
+     void rule__SignalPrivate__Group__3__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group__4() throws RecognitionException;
+     void rule__SignalPrivate__Group__4__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group__5() throws RecognitionException;
+     void rule__SignalPrivate__Group__5__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group_4__0() throws RecognitionException;
+     void rule__SignalPrivate__Group_4__0__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group_4__1() throws RecognitionException;
+     void rule__SignalPrivate__Group_4__1__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group_4__2() throws RecognitionException;
+     void rule__SignalPrivate__Group_4__2__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group_4__3() throws RecognitionException;
+     void rule__SignalPrivate__Group_4__3__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group_4_2__0() throws RecognitionException;
+     void rule__SignalPrivate__Group_4_2__0__Impl() throws RecognitionException;
+     void rule__SignalPrivate__Group_4_2__1() throws RecognitionException;
+     void rule__SignalPrivate__Group_4_2__1__Impl() throws RecognitionException;
+     void rule__Channel__Group__0() throws RecognitionException;
+     void rule__Channel__Group__0__Impl() throws RecognitionException;
+     void rule__Channel__Group__1() throws RecognitionException;
+     void rule__Channel__Group__1__Impl() throws RecognitionException;
+     void rule__Channel__Group__2() throws RecognitionException;
+     void rule__Channel__Group__2__Impl() throws RecognitionException;
+     void rule__Channel__Group__3() throws RecognitionException;
+     void rule__Channel__Group__3__Impl() throws RecognitionException;
+     void rule__Channel__Group__4() throws RecognitionException;
+     void rule__Channel__Group__4__Impl() throws RecognitionException;
+     void rule__Channel__Group__5() throws RecognitionException;
+     void rule__Channel__Group__5__Impl() throws RecognitionException;
+     void rule__Channel__Group__6() throws RecognitionException;
+     void rule__Channel__Group__6__Impl() throws RecognitionException;
+     void rule__Channel__Group_5__0() throws RecognitionException;
+     void rule__Channel__Group_5__0__Impl() throws RecognitionException;
+     void rule__Channel__Group_5__1() throws RecognitionException;
+     void rule__Channel__Group_5__1__Impl() throws RecognitionException;
+     void rule__SignalReference__Group__0() throws RecognitionException;
+     void rule__SignalReference__Group__0__Impl() throws RecognitionException;
+     void rule__SignalReference__Group__1() throws RecognitionException;
+     void rule__SignalReference__Group__1__Impl() throws RecognitionException;
+     void rule__ChannelPublic__Group__0() throws RecognitionException;
+     void rule__ChannelPublic__Group__0__Impl() throws RecognitionException;
+     void rule__ChannelPublic__Group__1() throws RecognitionException;
+     void rule__ChannelPublic__Group__1__Impl() throws RecognitionException;
+     void rule__ChannelPublic__Group__2() throws RecognitionException;
+     void rule__ChannelPublic__Group__2__Impl() throws RecognitionException;
+     void rule__ChannelPublic__Group__3() throws RecognitionException;
+     void rule__ChannelPublic__Group__3__Impl() throws RecognitionException;
+     void rule__ChannelPublic__Group__4() throws RecognitionException;
+     void rule__ChannelPublic__Group__4__Impl() throws RecognitionException;
+     void rule__ChannelPublic__Group__5() throws RecognitionException;
+     void rule__ChannelPublic__Group__5__Impl() throws RecognitionException;
+     void rule__ChannelPublic__Group_4__0() throws RecognitionException;
+     void rule__ChannelPublic__Group_4__0__Impl() throws RecognitionException;
+     void rule__ChannelPublic__Group_4__1() throws RecognitionException;
+     void rule__ChannelPublic__Group_4__1__Impl() throws RecognitionException;
+     void rule__ChannelProtected__Group__0() throws RecognitionException;
+     void rule__ChannelProtected__Group__0__Impl() throws RecognitionException;
+     void rule__ChannelProtected__Group__1() throws RecognitionException;
+     void rule__ChannelProtected__Group__1__Impl() throws RecognitionException;
+     void rule__ChannelProtected__Group__2() throws RecognitionException;
+     void rule__ChannelProtected__Group__2__Impl() throws RecognitionException;
+     void rule__ChannelProtected__Group__3() throws RecognitionException;
+     void rule__ChannelProtected__Group__3__Impl() throws RecognitionException;
+     void rule__ChannelProtected__Group__4() throws RecognitionException;
+     void rule__ChannelProtected__Group__4__Impl() throws RecognitionException;
+     void rule__ChannelProtected__Group__5() throws RecognitionException;
+     void rule__ChannelProtected__Group__5__Impl() throws RecognitionException;
+     void rule__ChannelProtected__Group_4__0() throws RecognitionException;
+     void rule__ChannelProtected__Group_4__0__Impl() throws RecognitionException;
+     void rule__ChannelProtected__Group_4__1() throws RecognitionException;
+     void rule__ChannelProtected__Group_4__1__Impl() throws RecognitionException;
+     void rule__ChannelPrivate__Group__0() throws RecognitionException;
+     void rule__ChannelPrivate__Group__0__Impl() throws RecognitionException;
+     void rule__ChannelPrivate__Group__1() throws RecognitionException;
+     void rule__ChannelPrivate__Group__1__Impl() throws RecognitionException;
+     void rule__ChannelPrivate__Group__2() throws RecognitionException;
+     void rule__ChannelPrivate__Group__2__Impl() throws RecognitionException;
+     void rule__ChannelPrivate__Group__3() throws RecognitionException;
+     void rule__ChannelPrivate__Group__3__Impl() throws RecognitionException;
+     void rule__ChannelPrivate__Group__4() throws RecognitionException;
+     void rule__ChannelPrivate__Group__4__Impl() throws RecognitionException;
+     void rule__ChannelPrivate__Group__5() throws RecognitionException;
+     void rule__ChannelPrivate__Group__5__Impl() throws RecognitionException;
+     void rule__ChannelPrivate__Group_4__0() throws RecognitionException;
+     void rule__ChannelPrivate__Group_4__0__Impl() throws RecognitionException;
+     void rule__ChannelPrivate__Group_4__1() throws RecognitionException;
+     void rule__ChannelPrivate__Group_4__1__Impl() throws RecognitionException;
+     void rule__Transition__Group__0() throws RecognitionException;
+     void rule__Transition__Group__0__Impl() throws RecognitionException;
+     void rule__Transition__Group__1() throws RecognitionException;
+     void rule__Transition__Group__1__Impl() throws RecognitionException;
+     void rule__Transition__Group__2() throws RecognitionException;
+     void rule__Transition__Group__2__Impl() throws RecognitionException;
+     void rule__Transition__Group__3() throws RecognitionException;
+     void rule__Transition__Group__3__Impl() throws RecognitionException;
+     void rule__Transition__Group__4() throws RecognitionException;
+     void rule__Transition__Group__4__Impl() throws RecognitionException;
+     void rule__Transition__Group__5() throws RecognitionException;
+     void rule__Transition__Group__5__Impl() throws RecognitionException;
+     void rule__Transition__Group_4__0() throws RecognitionException;
+     void rule__Transition__Group_4__0__Impl() throws RecognitionException;
+     void rule__Transition__Group_4__1() throws RecognitionException;
+     void rule__Transition__Group_4__1__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0__0() throws RecognitionException;
+     void rule__Transition__Group_5_0__0__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0__1() throws RecognitionException;
+     void rule__Transition__Group_5_0__1__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0__2() throws RecognitionException;
+     void rule__Transition__Group_5_0__2__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0__3() throws RecognitionException;
+     void rule__Transition__Group_5_0__3__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__0() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__0__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__1() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__1__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__2() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__2__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__3() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__3__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__4() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0__4__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0_0__0() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0_0__0__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0_0__1() throws RecognitionException;
+     void rule__Transition__Group_5_0_1_0_0__1__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_3__0() throws RecognitionException;
+     void rule__Transition__Group_5_0_3__0__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_3__1() throws RecognitionException;
+     void rule__Transition__Group_5_0_3__1__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_0_3__2() throws RecognitionException;
+     void rule__Transition__Group_5_0_3__2__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1__0() throws RecognitionException;
+     void rule__Transition__Group_5_1__0__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1__1() throws RecognitionException;
+     void rule__Transition__Group_5_1__1__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1__2() throws RecognitionException;
+     void rule__Transition__Group_5_1__2__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0__0() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0__0__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0__1() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0__1__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0__2() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0__2__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__0() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__0__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__1() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__1__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__2() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__2__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__3() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__3__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__4() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0__4__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0_0__0() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0_0__0__Impl() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0_0__1() throws RecognitionException;
+     void rule__Transition__Group_5_1_2_0_1_0_0__1__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group__0() throws RecognitionException;
+     void rule__TransitionMoe__Group__0__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group__1() throws RecognitionException;
+     void rule__TransitionMoe__Group__1__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group__2() throws RecognitionException;
+     void rule__TransitionMoe__Group__2__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0__0() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0__1() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0__2() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0__2__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_1_0__0() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_1_0__0__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_1_0__1() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_1_0__1__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_1_0_1__0() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_1_0_1__0__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_1_0_1__1() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_1_0_1__1__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_2__0() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_2__0__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_2__1() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_2__1__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_2__2() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_0_2__2__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_1__0() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_1__1() throws RecognitionException;
+     void rule__TransitionMoe__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__TransitionBehavior__Group__0() throws RecognitionException;
+     void rule__TransitionBehavior__Group__0__Impl() throws RecognitionException;
+     void rule__TransitionBehavior__Group__1() throws RecognitionException;
+     void rule__TransitionBehavior__Group__1__Impl() throws RecognitionException;
+     void rule__TransitionBehavior__Group__2() throws RecognitionException;
+     void rule__TransitionBehavior__Group__2__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_0__0() throws RecognitionException;
+     void rule__TransitionGuard__Group_0__0__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_0__1() throws RecognitionException;
+     void rule__TransitionGuard__Group_0__1__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_0__2() throws RecognitionException;
+     void rule__TransitionGuard__Group_0__2__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_1__0() throws RecognitionException;
+     void rule__TransitionGuard__Group_1__0__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_1__1() throws RecognitionException;
+     void rule__TransitionGuard__Group_1__1__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0__0() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0__0__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0__1() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0__1__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0_1_0__0() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0_1_0__0__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0_1_0__1() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0_1_0__1__Impl() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0_1_0__2() throws RecognitionException;
+     void rule__TransitionGuard__Group_1_1_0_1_0__2__Impl() throws RecognitionException;
+     void rule__TransitionGuardExpression__Group__0() throws RecognitionException;
+     void rule__TransitionGuardExpression__Group__0__Impl() throws RecognitionException;
+     void rule__TransitionGuardExpression__Group__1() throws RecognitionException;
+     void rule__TransitionGuardExpression__Group__1__Impl() throws RecognitionException;
+     void rule__TransitionGuardExpression__Group__2() throws RecognitionException;
+     void rule__TransitionGuardExpression__Group__2__Impl() throws RecognitionException;
+     void rule__TransitionGuardExpression__Group__3() throws RecognitionException;
+     void rule__TransitionGuardExpression__Group__3__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_0__0() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_0__0__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_0__1() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_0__1__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_0__2() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_0__2__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1__0() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1__0__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1__1() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1__1__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0__0() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0__0__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0__1() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0__1__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0_1_0__0() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0_1_0__1() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0_1_0__2() throws RecognitionException;
+     void rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl() throws RecognitionException;
+     void rule__TransitionEffect__Group__0() throws RecognitionException;
+     void rule__TransitionEffect__Group__0__Impl() throws RecognitionException;
+     void rule__TransitionEffect__Group__1() throws RecognitionException;
+     void rule__TransitionEffect__Group__1__Impl() throws RecognitionException;
+     void rule__TransitionEffect__Group_1__0() throws RecognitionException;
+     void rule__TransitionEffect__Group_1__0__Impl() throws RecognitionException;
+     void rule__TransitionEffect__Group_1__1() throws RecognitionException;
+     void rule__TransitionEffect__Group_1__1__Impl() throws RecognitionException;
+     void rule__BlockStatement__Group__0() throws RecognitionException;
+     void rule__BlockStatement__Group__0__Impl() throws RecognitionException;
+     void rule__BlockStatement__Group__1() throws RecognitionException;
+     void rule__BlockStatement__Group__1__Impl() throws RecognitionException;
+     void rule__BlockStatement__Group__2() throws RecognitionException;
+     void rule__BlockStatement__Group__2__Impl() throws RecognitionException;
+     void rule__BlockStatement__Group__3() throws RecognitionException;
+     void rule__BlockStatement__Group__3__Impl() throws RecognitionException;
+     void rule__BlockStatement__Group__4() throws RecognitionException;
+     void rule__BlockStatement__Group__4__Impl() throws RecognitionException;
+     void rule__ExpressionStatement__Group_0__0() throws RecognitionException;
+     void rule__ExpressionStatement__Group_0__0__Impl() throws RecognitionException;
+     void rule__ExpressionStatement__Group_0__1() throws RecognitionException;
+     void rule__ExpressionStatement__Group_0__1__Impl() throws RecognitionException;
+     void rule__ExpressionStatement__Group_1__0() throws RecognitionException;
+     void rule__ExpressionStatement__Group_1__0__Impl() throws RecognitionException;
+     void rule__ExpressionStatement__Group_1__1() throws RecognitionException;
+     void rule__ExpressionStatement__Group_1__1__Impl() throws RecognitionException;
+     void rule__ExpressionStatement__Group_2__0() throws RecognitionException;
+     void rule__ExpressionStatement__Group_2__0__Impl() throws RecognitionException;
+     void rule__ExpressionStatement__Group_2__1() throws RecognitionException;
+     void rule__ExpressionStatement__Group_2__1__Impl() throws RecognitionException;
+     void rule__ExpressionStatement__Group_3__0() throws RecognitionException;
+     void rule__ExpressionStatement__Group_3__0__Impl() throws RecognitionException;
+     void rule__ExpressionStatement__Group_3__1() throws RecognitionException;
+     void rule__ExpressionStatement__Group_3__1__Impl() throws RecognitionException;
+     void rule__GuardStatement__Group__0() throws RecognitionException;
+     void rule__GuardStatement__Group__0__Impl() throws RecognitionException;
+     void rule__GuardStatement__Group__1() throws RecognitionException;
+     void rule__GuardStatement__Group__1__Impl() throws RecognitionException;
+     void rule__GuardStatement__Group__2() throws RecognitionException;
+     void rule__GuardStatement__Group__2__Impl() throws RecognitionException;
+     void rule__TimedGuardStatement__Group__0() throws RecognitionException;
+     void rule__TimedGuardStatement__Group__0__Impl() throws RecognitionException;
+     void rule__TimedGuardStatement__Group__1() throws RecognitionException;
+     void rule__TimedGuardStatement__Group__1__Impl() throws RecognitionException;
+     void rule__TimedGuardStatement__Group__2() throws RecognitionException;
+     void rule__TimedGuardStatement__Group__2__Impl() throws RecognitionException;
+     void rule__EventGuardStatement__Group__0() throws RecognitionException;
+     void rule__EventGuardStatement__Group__0__Impl() throws RecognitionException;
+     void rule__EventGuardStatement__Group__1() throws RecognitionException;
+     void rule__EventGuardStatement__Group__1__Impl() throws RecognitionException;
+     void rule__EventGuardStatement__Group__2() throws RecognitionException;
+     void rule__EventGuardStatement__Group__2__Impl() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__0() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__0__Impl() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__1() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__1__Impl() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__2() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__2__Impl() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__3() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__3__Impl() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__4() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__4__Impl() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__5() throws RecognitionException;
+     void rule__CheckSatGuardStatement__Group__5__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group__0() throws RecognitionException;
+     void rule__InputComStatement__Group__0__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group__1() throws RecognitionException;
+     void rule__InputComStatement__Group__1__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group__2() throws RecognitionException;
+     void rule__InputComStatement__Group__2__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group__3() throws RecognitionException;
+     void rule__InputComStatement__Group__3__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group__4() throws RecognitionException;
+     void rule__InputComStatement__Group__4__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_2__0() throws RecognitionException;
+     void rule__InputComStatement__Group_2__0__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_2__1() throws RecognitionException;
+     void rule__InputComStatement__Group_2__1__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_2__2() throws RecognitionException;
+     void rule__InputComStatement__Group_2__2__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_2__3() throws RecognitionException;
+     void rule__InputComStatement__Group_2__3__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_2_2__0() throws RecognitionException;
+     void rule__InputComStatement__Group_2_2__0__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_2_2__1() throws RecognitionException;
+     void rule__InputComStatement__Group_2_2__1__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_3_0__0() throws RecognitionException;
+     void rule__InputComStatement__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_3_0__1() throws RecognitionException;
+     void rule__InputComStatement__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_3_1__0() throws RecognitionException;
+     void rule__InputComStatement__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__InputComStatement__Group_3_1__1() throws RecognitionException;
+     void rule__InputComStatement__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group__0() throws RecognitionException;
+     void rule__OutputComStatement__Group__0__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group__1() throws RecognitionException;
+     void rule__OutputComStatement__Group__1__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group__2() throws RecognitionException;
+     void rule__OutputComStatement__Group__2__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group__3() throws RecognitionException;
+     void rule__OutputComStatement__Group__3__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group__4() throws RecognitionException;
+     void rule__OutputComStatement__Group__4__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_2__0() throws RecognitionException;
+     void rule__OutputComStatement__Group_2__0__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_2__1() throws RecognitionException;
+     void rule__OutputComStatement__Group_2__1__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_2__2() throws RecognitionException;
+     void rule__OutputComStatement__Group_2__2__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_2__3() throws RecognitionException;
+     void rule__OutputComStatement__Group_2__3__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_2_2__0() throws RecognitionException;
+     void rule__OutputComStatement__Group_2_2__0__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_2_2__1() throws RecognitionException;
+     void rule__OutputComStatement__Group_2_2__1__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_3_0__0() throws RecognitionException;
+     void rule__OutputComStatement__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_3_0__1() throws RecognitionException;
+     void rule__OutputComStatement__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_3_1__0() throws RecognitionException;
+     void rule__OutputComStatement__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__OutputComStatement__Group_3_1__1() throws RecognitionException;
+     void rule__OutputComStatement__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__IfStatement__Group__0() throws RecognitionException;
+     void rule__IfStatement__Group__0__Impl() throws RecognitionException;
+     void rule__IfStatement__Group__1() throws RecognitionException;
+     void rule__IfStatement__Group__1__Impl() throws RecognitionException;
+     void rule__IfStatement__Group__2() throws RecognitionException;
+     void rule__IfStatement__Group__2__Impl() throws RecognitionException;
+     void rule__IfStatement__Group__3() throws RecognitionException;
+     void rule__IfStatement__Group__3__Impl() throws RecognitionException;
+     void rule__IfStatement__Group__4() throws RecognitionException;
+     void rule__IfStatement__Group__4__Impl() throws RecognitionException;
+     void rule__IfStatement__Group_4__0() throws RecognitionException;
+     void rule__IfStatement__Group_4__0__Impl() throws RecognitionException;
+     void rule__IfStatement__Group_4__1() throws RecognitionException;
+     void rule__IfStatement__Group_4__1__Impl() throws RecognitionException;
+     void rule__ElseIfStatement__Group__0() throws RecognitionException;
+     void rule__ElseIfStatement__Group__0__Impl() throws RecognitionException;
+     void rule__ElseIfStatement__Group__1() throws RecognitionException;
+     void rule__ElseIfStatement__Group__1__Impl() throws RecognitionException;
+     void rule__ElseIfStatement__Group__2() throws RecognitionException;
+     void rule__ElseIfStatement__Group__2__Impl() throws RecognitionException;
+     void rule__ElseIfStatement__Group_0_1__0() throws RecognitionException;
+     void rule__ElseIfStatement__Group_0_1__0__Impl() throws RecognitionException;
+     void rule__ElseIfStatement__Group_0_1__1() throws RecognitionException;
+     void rule__ElseIfStatement__Group_0_1__1__Impl() throws RecognitionException;
+     void rule__WhileDoStatement__Group__0() throws RecognitionException;
+     void rule__WhileDoStatement__Group__0__Impl() throws RecognitionException;
+     void rule__WhileDoStatement__Group__1() throws RecognitionException;
+     void rule__WhileDoStatement__Group__1__Impl() throws RecognitionException;
+     void rule__WhileDoStatement__Group__2() throws RecognitionException;
+     void rule__WhileDoStatement__Group__2__Impl() throws RecognitionException;
+     void rule__DoWhileStatement__Group__0() throws RecognitionException;
+     void rule__DoWhileStatement__Group__0__Impl() throws RecognitionException;
+     void rule__DoWhileStatement__Group__1() throws RecognitionException;
+     void rule__DoWhileStatement__Group__1__Impl() throws RecognitionException;
+     void rule__DoWhileStatement__Group__2() throws RecognitionException;
+     void rule__DoWhileStatement__Group__2__Impl() throws RecognitionException;
+     void rule__DoWhileStatement__Group__3() throws RecognitionException;
+     void rule__DoWhileStatement__Group__3__Impl() throws RecognitionException;
+     void rule__DoWhileStatement__Group__4() throws RecognitionException;
+     void rule__DoWhileStatement__Group__4__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_0__0() throws RecognitionException;
+     void rule__ForStatement__Group_0__0__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_0__1() throws RecognitionException;
+     void rule__ForStatement__Group_0__1__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_0__2() throws RecognitionException;
+     void rule__ForStatement__Group_0__2__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_0__3() throws RecognitionException;
+     void rule__ForStatement__Group_0__3__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_0__4() throws RecognitionException;
+     void rule__ForStatement__Group_0__4__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_0__5() throws RecognitionException;
+     void rule__ForStatement__Group_0__5__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_0__6() throws RecognitionException;
+     void rule__ForStatement__Group_0__6__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_1__0() throws RecognitionException;
+     void rule__ForStatement__Group_1__0__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_1__1() throws RecognitionException;
+     void rule__ForStatement__Group_1__1__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_1__2() throws RecognitionException;
+     void rule__ForStatement__Group_1__2__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_1__3() throws RecognitionException;
+     void rule__ForStatement__Group_1__3__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_1__4() throws RecognitionException;
+     void rule__ForStatement__Group_1__4__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_1__5() throws RecognitionException;
+     void rule__ForStatement__Group_1__5__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_1__6() throws RecognitionException;
+     void rule__ForStatement__Group_1__6__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_1__7() throws RecognitionException;
+     void rule__ForStatement__Group_1__7__Impl() throws RecognitionException;
+     void rule__ForStatement__Group_1__8() throws RecognitionException;
+     void rule__ForStatement__Group_1__8__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__0() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__0__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__1() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__1__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__2() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__2__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__3() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__3__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__4() throws RecognitionException;
+     void rule__ForEachStatement__Group_0__4__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__0() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__0__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__1() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__1__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__2() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__2__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__3() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__3__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__4() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__4__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__5() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__5__Impl() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__6() throws RecognitionException;
+     void rule__ForEachStatement__Group_1__6__Impl() throws RecognitionException;
+     void rule__InterruptStatement__Group__0() throws RecognitionException;
+     void rule__InterruptStatement__Group__0__Impl() throws RecognitionException;
+     void rule__InterruptStatement__Group__1() throws RecognitionException;
+     void rule__InterruptStatement__Group__1__Impl() throws RecognitionException;
+     void rule__InterruptStatement__Group__2() throws RecognitionException;
+     void rule__InterruptStatement__Group__2__Impl() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1__0() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1__1() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1__2() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1__2__Impl() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1__3() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1__3__Impl() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1_2__0() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1_2__0__Impl() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1_2__1() throws RecognitionException;
+     void rule__InterruptStatement__Group_1_1_2__1__Impl() throws RecognitionException;
+     void rule__ActivityStatement__Group__0() throws RecognitionException;
+     void rule__ActivityStatement__Group__0__Impl() throws RecognitionException;
+     void rule__ActivityStatement__Group__1() throws RecognitionException;
+     void rule__ActivityStatement__Group__1__Impl() throws RecognitionException;
+     void rule__ActivityStatement__Group__2() throws RecognitionException;
+     void rule__ActivityStatement__Group__2__Impl() throws RecognitionException;
+     void rule__ActivityStatement__Group__3() throws RecognitionException;
+     void rule__ActivityStatement__Group__3__Impl() throws RecognitionException;
+     void rule__ActivityStatement__Group__4() throws RecognitionException;
+     void rule__ActivityStatement__Group__4__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_0__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_0__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_0__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_0__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__2() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__2__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__3() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__3__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__4() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__4__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__5() throws RecognitionException;
+     void rule__InvokeStatement__Group_1__5__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_0__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_0__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_0__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_0__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_0_1__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_0_1__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_0_1__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_0_1__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1__2() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1__2__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1__3() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1__3__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1_2__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1_2__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1_2__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_1_4_1_1_2__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__2() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__2__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__3() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__3__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__4() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__4__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__5() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__5__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__6() throws RecognitionException;
+     void rule__InvokeStatement__Group_2__6__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_0__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_0__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_0__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_0__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_0_1__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_0_1__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_0_1__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_0_1__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1__2() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1__2__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1__3() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1__3__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1_2__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1_2__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1_2__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_2_5_1_1_2__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__2() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__2__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__3() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__3__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__4() throws RecognitionException;
+     void rule__InvokeStatement__Group_3__4__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_0__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_0__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_0__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_0__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_0_1__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_0_1__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_0_1__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_0_1__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1__1__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1__2() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1__2__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1__3() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1__3__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1_2__0() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1_2__0__Impl() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1_2__1() throws RecognitionException;
+     void rule__InvokeStatement__Group_3_3_1_1_2__1__Impl() throws RecognitionException;
+     void rule__AssignmentExpression__Group__0() throws RecognitionException;
+     void rule__AssignmentExpression__Group__0__Impl() throws RecognitionException;
+     void rule__AssignmentExpression__Group__1() throws RecognitionException;
+     void rule__AssignmentExpression__Group__1__Impl() throws RecognitionException;
+     void rule__AssignmentExpression__Group__2() throws RecognitionException;
+     void rule__AssignmentExpression__Group__2__Impl() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group__0() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group__1() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group_1_1__0() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group_1_1__1() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group_1_1__2() throws RecognitionException;
+     void rule__LeftHandSideExpression__Group_1_1__2__Impl() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group__0() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group__0__Impl() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group__1() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group__1__Impl() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__0() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__1() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__2() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__3() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__4() throws RecognitionException;
+     void rule__ConditionalTestExpression__Group_1__4__Impl() throws RecognitionException;
+     void rule__LogicalOrExpression__Group__0() throws RecognitionException;
+     void rule__LogicalOrExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LogicalOrExpression__Group__1() throws RecognitionException;
+     void rule__LogicalOrExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1__0() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1__1() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1__2() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1__3() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1_3__0() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1_3__0__Impl() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1_3__1() throws RecognitionException;
+     void rule__LogicalOrExpression__Group_1_3__1__Impl() throws RecognitionException;
+     void rule__LogicalAndExpression__Group__0() throws RecognitionException;
+     void rule__LogicalAndExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LogicalAndExpression__Group__1() throws RecognitionException;
+     void rule__LogicalAndExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1__0() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1__1() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1__2() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1__3() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1_3__0() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1_3__0__Impl() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1_3__1() throws RecognitionException;
+     void rule__LogicalAndExpression__Group_1_3__1__Impl() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group__0() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group__0__Impl() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group__1() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group__1__Impl() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1__0() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1__1() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1__2() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1__3() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1_3__0() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1_3__0__Impl() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1_3__1() throws RecognitionException;
+     void rule__BitwiseOrExpression__Group_1_3__1__Impl() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group__0() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group__0__Impl() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group__1() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group__1__Impl() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1__0() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1__1() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1__2() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1__3() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1_3__0() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1_3__0__Impl() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1_3__1() throws RecognitionException;
+     void rule__BitwiseXorExpression__Group_1_3__1__Impl() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group__0() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group__0__Impl() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group__1() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group__1__Impl() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1__0() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1__1() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1__2() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1__3() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1_3__0() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1_3__0__Impl() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1_3__1() throws RecognitionException;
+     void rule__BitwiseAndExpression__Group_1_3__1__Impl() throws RecognitionException;
+     void rule__EqualityExpression__Group__0() throws RecognitionException;
+     void rule__EqualityExpression__Group__0__Impl() throws RecognitionException;
+     void rule__EqualityExpression__Group__1() throws RecognitionException;
+     void rule__EqualityExpression__Group__1__Impl() throws RecognitionException;
+     void rule__EqualityExpression__Group_1__0() throws RecognitionException;
+     void rule__EqualityExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__EqualityExpression__Group_1__1() throws RecognitionException;
+     void rule__EqualityExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__EqualityExpression__Group_1__2() throws RecognitionException;
+     void rule__EqualityExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__RelationalExpression__Group__0() throws RecognitionException;
+     void rule__RelationalExpression__Group__0__Impl() throws RecognitionException;
+     void rule__RelationalExpression__Group__1() throws RecognitionException;
+     void rule__RelationalExpression__Group__1__Impl() throws RecognitionException;
+     void rule__RelationalExpression__Group_1__0() throws RecognitionException;
+     void rule__RelationalExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__RelationalExpression__Group_1__1() throws RecognitionException;
+     void rule__RelationalExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__RelationalExpression__Group_1__2() throws RecognitionException;
+     void rule__RelationalExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__RelationalExpression__Group_1__3() throws RecognitionException;
+     void rule__RelationalExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__RelationalExpression__Group_1_3__0() throws RecognitionException;
+     void rule__RelationalExpression__Group_1_3__0__Impl() throws RecognitionException;
+     void rule__RelationalExpression__Group_1_3__1() throws RecognitionException;
+     void rule__RelationalExpression__Group_1_3__1__Impl() throws RecognitionException;
+     void rule__RelationalExpression__Group_1_3__2() throws RecognitionException;
+     void rule__RelationalExpression__Group_1_3__2__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group__0() throws RecognitionException;
+     void rule__AdditiveExpression__Group__0__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group__1() throws RecognitionException;
+     void rule__AdditiveExpression__Group__1__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0__0() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0__1() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0__2() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0__2__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0__3() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0__3__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0_3__0() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0_3__0__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0_3__1() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_0_3__1__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1__0() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1__1() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1__2() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1__2__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1__3() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1__3__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1_3__0() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1_3__0__Impl() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1_3__1() throws RecognitionException;
+     void rule__AdditiveExpression__Group_1_1_3__1__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group__0() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group__0__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group__1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group__1__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0__0() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0__0__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0__1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0__1__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0__2() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0__2__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0__3() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0__3__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0_3__0() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0_3__0__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0_3__1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_0_3__1__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1__0() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1__0__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1__1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1__1__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1__2() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1__2__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1__3() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1__3__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1_3__0() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1_3__0__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1_3__1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_1_3__1__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2__0() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2__0__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2__1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2__1__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2__2() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2__2__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2__3() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2__3__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2_3__0() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2_3__0__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2_3__1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_2_3__1__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3__0() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3__0__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3__1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3__1__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3__2() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3__2__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3__3() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3__3__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3_3__0() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3_3__0__Impl() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3_3__1() throws RecognitionException;
+     void rule__MultiplicativeExpression__Group_1_3_3__1__Impl() throws RecognitionException;
+     void rule__IncrementOrDecrementPostfixExpression__Group__0() throws RecognitionException;
+     void rule__IncrementOrDecrementPostfixExpression__Group__0__Impl() throws RecognitionException;
+     void rule__IncrementOrDecrementPostfixExpression__Group__1() throws RecognitionException;
+     void rule__IncrementOrDecrementPostfixExpression__Group__1__Impl() throws RecognitionException;
+     void rule__IncrementOrDecrementPrefixExpression__Group__0() throws RecognitionException;
+     void rule__IncrementOrDecrementPrefixExpression__Group__0__Impl() throws RecognitionException;
+     void rule__IncrementOrDecrementPrefixExpression__Group__1() throws RecognitionException;
+     void rule__IncrementOrDecrementPrefixExpression__Group__1__Impl() throws RecognitionException;
+     void rule__NewfreshExpression__Group_0__0() throws RecognitionException;
+     void rule__NewfreshExpression__Group_0__0__Impl() throws RecognitionException;
+     void rule__NewfreshExpression__Group_0__1() throws RecognitionException;
+     void rule__NewfreshExpression__Group_0__1__Impl() throws RecognitionException;
+     void rule__NewfreshExpression__Group_1__0() throws RecognitionException;
+     void rule__NewfreshExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__NewfreshExpression__Group_1__1() throws RecognitionException;
+     void rule__NewfreshExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__NewfreshExpression__Group_1__2() throws RecognitionException;
+     void rule__NewfreshExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__NewfreshExpression__Group_1__3() throws RecognitionException;
+     void rule__NewfreshExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__CastExpression__Group__0() throws RecognitionException;
+     void rule__CastExpression__Group__0__Impl() throws RecognitionException;
+     void rule__CastExpression__Group__1() throws RecognitionException;
+     void rule__CastExpression__Group__1__Impl() throws RecognitionException;
+     void rule__CastExpression__Group__2() throws RecognitionException;
+     void rule__CastExpression__Group__2__Impl() throws RecognitionException;
+     void rule__CastExpression__Group__3() throws RecognitionException;
+     void rule__CastExpression__Group__3__Impl() throws RecognitionException;
+     void rule__CastExpression__Group__4() throws RecognitionException;
+     void rule__CastExpression__Group__4__Impl() throws RecognitionException;
+     void rule__CastExpression__Group__5() throws RecognitionException;
+     void rule__CastExpression__Group__5__Impl() throws RecognitionException;
+     void rule__CastExpression__Group__6() throws RecognitionException;
+     void rule__CastExpression__Group__6__Impl() throws RecognitionException;
+     void rule__ArithmeticUnaryExpression__Group__0() throws RecognitionException;
+     void rule__ArithmeticUnaryExpression__Group__0__Impl() throws RecognitionException;
+     void rule__ArithmeticUnaryExpression__Group__1() throws RecognitionException;
+     void rule__ArithmeticUnaryExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LogicalUnaryExpression__Group__0() throws RecognitionException;
+     void rule__LogicalUnaryExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LogicalUnaryExpression__Group__1() throws RecognitionException;
+     void rule__LogicalUnaryExpression__Group__1__Impl() throws RecognitionException;
+     void rule__BitwiseUnaryExpression__Group__0() throws RecognitionException;
+     void rule__BitwiseUnaryExpression__Group__0__Impl() throws RecognitionException;
+     void rule__BitwiseUnaryExpression__Group__1() throws RecognitionException;
+     void rule__BitwiseUnaryExpression__Group__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group__2__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1__3() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_0__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_0__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_0__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_0__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_0__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_0__2__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_1__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_1__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_1__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_1__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_1__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group_1_3_1__2__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__2__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__3() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__3__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__4() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2__4__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_0__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_0__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_0__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_0__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_0__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_0__2__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_1__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_1__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_1__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_1__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_1__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_3_1__2__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4__2__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4__3() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4__3__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_0__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_0__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_0__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_0__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_0__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_0__2__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_1__0() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_1__0__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_1__1() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_1__1__Impl() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_1__2() throws RecognitionException;
+     void rule__PrimaryExpression__Group_2_4_3_1__2__Impl() throws RecognitionException;
+     void rule__BaseExpression__Group_1__0() throws RecognitionException;
+     void rule__BaseExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__BaseExpression__Group_1__1() throws RecognitionException;
+     void rule__BaseExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__BaseExpression__Group_1__2() throws RecognitionException;
+     void rule__BaseExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__0() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__0__Impl() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__1() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__1__Impl() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__2() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__2__Impl() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__3() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__3__Impl() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__4() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__4__Impl() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__5() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__Group__5__Impl() throws RecognitionException;
+     void rule__InstantiationExpression__Group__0() throws RecognitionException;
+     void rule__InstantiationExpression__Group__0__Impl() throws RecognitionException;
+     void rule__InstantiationExpression__Group__1() throws RecognitionException;
+     void rule__InstantiationExpression__Group__1__Impl() throws RecognitionException;
+     void rule__InstantiationExpression__Group__2() throws RecognitionException;
+     void rule__InstantiationExpression__Group__2__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group__0() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group__0__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group__1() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group__1__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group__2() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group__2__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group__3() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group__3__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0__0() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0__0__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0__1() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0__1__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0__2() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0__2__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0_1__0() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0_1__1() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0_1_1__0() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0_1_1__1() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1__0() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1__1() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1__2() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1__2__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1_1__0() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1_1__1() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl() throws RecognitionException;
+     void rule__TupleParameterExpression__Group__0() throws RecognitionException;
+     void rule__TupleParameterExpression__Group__0__Impl() throws RecognitionException;
+     void rule__TupleParameterExpression__Group__1() throws RecognitionException;
+     void rule__TupleParameterExpression__Group__1__Impl() throws RecognitionException;
+     void rule__TupleParameterExpression__Group__2() throws RecognitionException;
+     void rule__TupleParameterExpression__Group__2__Impl() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group__0() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group__0__Impl() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group__1() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group__1__Impl() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group__2() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group__2__Impl() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group_2__0() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group_2__0__Impl() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group_2__1() throws RecognitionException;
+     void rule__MixTupleExpressionList__Group_2__1__Impl() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__Group__0() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__Group__0__Impl() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__Group__1() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__Group__1__Impl() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__Group_1__0() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__Group_1__0__Impl() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__Group_1__1() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__Group_1__1__Impl() throws RecognitionException;
+     void rule__NamedExpression__Group__0() throws RecognitionException;
+     void rule__NamedExpression__Group__0__Impl() throws RecognitionException;
+     void rule__NamedExpression__Group__1() throws RecognitionException;
+     void rule__NamedExpression__Group__1__Impl() throws RecognitionException;
+     void rule__NamedExpression__Group__2() throws RecognitionException;
+     void rule__NamedExpression__Group__2__Impl() throws RecognitionException;
+     void rule__LiteralBooleanExpression__Group__0() throws RecognitionException;
+     void rule__LiteralBooleanExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralBooleanExpression__Group__1() throws RecognitionException;
+     void rule__LiteralBooleanExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralIntegerExpression__Group__0() throws RecognitionException;
+     void rule__LiteralIntegerExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralIntegerExpression__Group__1() throws RecognitionException;
+     void rule__LiteralIntegerExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralRationalExpression__Group__0() throws RecognitionException;
+     void rule__LiteralRationalExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralRationalExpression__Group__1() throws RecognitionException;
+     void rule__LiteralRationalExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralRationalExpression__Group__2() throws RecognitionException;
+     void rule__LiteralRationalExpression__Group__2__Impl() throws RecognitionException;
+     void rule__LiteralRationalExpression__Group__3() throws RecognitionException;
+     void rule__LiteralRationalExpression__Group__3__Impl() throws RecognitionException;
+     void rule__LiteralFloatExpression__Group__0() throws RecognitionException;
+     void rule__LiteralFloatExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralFloatExpression__Group__1() throws RecognitionException;
+     void rule__LiteralFloatExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralCharacterExpression__Group__0() throws RecognitionException;
+     void rule__LiteralCharacterExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralCharacterExpression__Group__1() throws RecognitionException;
+     void rule__LiteralCharacterExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralStringExpression__Group__0() throws RecognitionException;
+     void rule__LiteralStringExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralStringExpression__Group__1() throws RecognitionException;
+     void rule__LiteralStringExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_0__0() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_0__0__Impl() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_0__1() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_0__1__Impl() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_1__0() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_1__1() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_1__2() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_1__3() throws RecognitionException;
+     void rule__LiteralNullExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__0() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__1() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__2() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__2__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__3() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__3__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__4() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group__4__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_1__0() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_1__1() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_1__2() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_3__0() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_3__0__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_3__1() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_3__1__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_3_1__0() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_3_1__0__Impl() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_3_1__1() throws RecognitionException;
+     void rule__LiteralCollectionExpression__Group_3_1__1__Impl() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group__0() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group__1() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group__2() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group__2__Impl() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_0__0() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_0__0__Impl() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_0__1() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_0__1__Impl() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_0__2() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_0__2__Impl() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_1__0() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_1__0__Impl() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_1__1() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_1__1__Impl() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_1__2() throws RecognitionException;
+     void rule__LiteralReferenceElement__Group_2_1__2__Impl() throws RecognitionException;
+     void rule__LiteralPureReferenceElement__Group__0() throws RecognitionException;
+     void rule__LiteralPureReferenceElement__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralPureReferenceElement__Group__1() throws RecognitionException;
+     void rule__LiteralPureReferenceElement__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralTimeExpression__Group__0() throws RecognitionException;
+     void rule__LiteralTimeExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralTimeExpression__Group__1() throws RecognitionException;
+     void rule__LiteralTimeExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralTimeDeltaExpression__Group__0() throws RecognitionException;
+     void rule__LiteralTimeDeltaExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralTimeDeltaExpression__Group__1() throws RecognitionException;
+     void rule__LiteralTimeDeltaExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralThisExpression__Group__0() throws RecognitionException;
+     void rule__LiteralThisExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralThisExpression__Group__1() throws RecognitionException;
+     void rule__LiteralThisExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralSelfExpression__Group__0() throws RecognitionException;
+     void rule__LiteralSelfExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralSelfExpression__Group__1() throws RecognitionException;
+     void rule__LiteralSelfExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralParentExpression__Group__0() throws RecognitionException;
+     void rule__LiteralParentExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralParentExpression__Group__1() throws RecognitionException;
+     void rule__LiteralParentExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralSuperExpression__Group__0() throws RecognitionException;
+     void rule__LiteralSuperExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralSuperExpression__Group__1() throws RecognitionException;
+     void rule__LiteralSuperExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralSystemExpression__Group__0() throws RecognitionException;
+     void rule__LiteralSystemExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralSystemExpression__Group__1() throws RecognitionException;
+     void rule__LiteralSystemExpression__Group__1__Impl() throws RecognitionException;
+     void rule__LiteralEnvExpression__Group__0() throws RecognitionException;
+     void rule__LiteralEnvExpression__Group__0__Impl() throws RecognitionException;
+     void rule__LiteralEnvExpression__Group__1() throws RecognitionException;
+     void rule__LiteralEnvExpression__Group__1__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group__0() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group__0__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group__1() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group__1__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group__2() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group__2__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1__0() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1__1() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1__2() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1__3() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1__3__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1_3__0() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1_3__0__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1_3__1() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1_3__1__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1_3__2() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_1_3__2__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__0() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__0__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__1() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__1__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__2() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__2__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__3() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__3__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__4() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2__4__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_3__0() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_3__0__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_3__1() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_3__1__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_3__2() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_3__2__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4__0() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4__0__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4__1() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4__1__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4__2() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4__2__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4__3() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4__3__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4_3__0() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4_3__0__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4_3__1() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4_3__1__Impl() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4_3__2() throws RecognitionException;
+     void rule__ValueSelectionExpression__Group_2_4_3__2__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group__0() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group__0__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group__1() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group__1__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group__2() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group__2__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_1__0() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_1__0__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_1__1() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_1__1__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_1__2() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_1__2__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2__0() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2__0__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2__1() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2__1__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2__2() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2__2__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2__3() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2__3__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2_3__0() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2_3__1() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2_3__2() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl() throws RecognitionException;
+     void rule__System__UnorderedGroup_0() throws RecognitionException;
+     void rule__System__UnorderedGroup_0__Impl() throws RecognitionException;
+     void rule__System__UnorderedGroup_0__0() throws RecognitionException;
+     void rule__System__UnorderedGroup_0__1() throws RecognitionException;
+     void rule__MachineBlock__UnorderedGroup_0() throws RecognitionException;
+     void rule__MachineBlock__UnorderedGroup_0__Impl() throws RecognitionException;
+     void rule__MachineBlock__UnorderedGroup_0__0() throws RecognitionException;
+     void rule__MachineBlock__UnorderedGroup_0__1() throws RecognitionException;
+     void rule__MachineBlock__UnorderedGroup_0__2() throws RecognitionException;
+     void rule__ProcedureExecution__UnorderedGroup_2() throws RecognitionException;
+     void rule__ProcedureExecution__UnorderedGroup_2__Impl() throws RecognitionException;
+     void rule__ProcedureExecution__UnorderedGroup_2__0() throws RecognitionException;
+     void rule__ProcedureExecution__UnorderedGroup_2__1() throws RecognitionException;
+     void rule__MoeBehavior__UnorderedGroup_2() throws RecognitionException;
+     void rule__MoeBehavior__UnorderedGroup_2__Impl() throws RecognitionException;
+     void rule__MoeBehavior__UnorderedGroup_2__0() throws RecognitionException;
+     void rule__MoeBehavior__UnorderedGroup_2__1() throws RecognitionException;
+     void rule__Statemachine__UnorderedGroup_1() throws RecognitionException;
+     void rule__Statemachine__UnorderedGroup_1__Impl() throws RecognitionException;
+     void rule__Statemachine__UnorderedGroup_1__0() throws RecognitionException;
+     void rule__Statemachine__UnorderedGroup_1__1() throws RecognitionException;
+     void rule__Statemachine__UnorderedGroup_1__2() throws RecognitionException;
+     void rule__Statemachine__UnorderedGroup_12() throws RecognitionException;
+     void rule__Statemachine__UnorderedGroup_12__Impl() throws RecognitionException;
+     void rule__Statemachine__UnorderedGroup_12__0() throws RecognitionException;
+     void rule__Statemachine__UnorderedGroup_12__1() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3__Impl() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3__0() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3__1() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3__2() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3__3() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3__4() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3__5() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3__6() throws RecognitionException;
+     void rule__ModelOfExecution__UnorderedGroup_3__7() throws RecognitionException;
+     void rule__Modifier__UnorderedGroup_1() throws RecognitionException;
+     void rule__Modifier__UnorderedGroup_1__Impl() throws RecognitionException;
+     void rule__Modifier__UnorderedGroup_1__0() throws RecognitionException;
+     void rule__Modifier__UnorderedGroup_1__1() throws RecognitionException;
+     void rule__Modifier__UnorderedGroup_1__2() throws RecognitionException;
+     void rule__Modifier__UnorderedGroup_1__3() throws RecognitionException;
+     void rule__Modifier__UnorderedGroup_1__4() throws RecognitionException;
+     void rule__Variable__UnorderedGroup_0() throws RecognitionException;
+     void rule__Variable__UnorderedGroup_0__Impl() throws RecognitionException;
+     void rule__Variable__UnorderedGroup_0__0() throws RecognitionException;
+     void rule__Variable__UnorderedGroup_0__1() throws RecognitionException;
+     void rule__VariablePublic__UnorderedGroup_1() throws RecognitionException;
+     void rule__VariablePublic__UnorderedGroup_1__Impl() throws RecognitionException;
+     void rule__VariablePublic__UnorderedGroup_1__0() throws RecognitionException;
+     void rule__VariablePublic__UnorderedGroup_1__1() throws RecognitionException;
+     void rule__VariableProtected__UnorderedGroup_1() throws RecognitionException;
+     void rule__VariableProtected__UnorderedGroup_1__Impl() throws RecognitionException;
+     void rule__VariableProtected__UnorderedGroup_1__0() throws RecognitionException;
+     void rule__VariableProtected__UnorderedGroup_1__1() throws RecognitionException;
+     void rule__VariablePrivate__UnorderedGroup_1() throws RecognitionException;
+     void rule__VariablePrivate__UnorderedGroup_1__Impl() throws RecognitionException;
+     void rule__VariablePrivate__UnorderedGroup_1__0() throws RecognitionException;
+     void rule__VariablePrivate__UnorderedGroup_1__1() throws RecognitionException;
+     void rule__Buffer__UnorderedGroup_0() throws RecognitionException;
+     void rule__Buffer__UnorderedGroup_0__Impl() throws RecognitionException;
+     void rule__Buffer__UnorderedGroup_0__0() throws RecognitionException;
+     void rule__Buffer__UnorderedGroup_0__1() throws RecognitionException;
+     void rule__InputComStatement__UnorderedGroup_3() throws RecognitionException;
+     void rule__InputComStatement__UnorderedGroup_3__Impl() throws RecognitionException;
+     void rule__InputComStatement__UnorderedGroup_3__0() throws RecognitionException;
+     void rule__InputComStatement__UnorderedGroup_3__1() throws RecognitionException;
+     void rule__OutputComStatement__UnorderedGroup_3() throws RecognitionException;
+     void rule__OutputComStatement__UnorderedGroup_3__Impl() throws RecognitionException;
+     void rule__OutputComStatement__UnorderedGroup_3__0() throws RecognitionException;
+     void rule__OutputComStatement__UnorderedGroup_3__1() throws RecognitionException;
+     void rule__Xlia__PrologAssignment_0() throws RecognitionException;
+     void rule__Xlia__SystemAssignment_1() throws RecognitionException;
+     void rule__XliaPrologObject__NameAssignment_0() throws RecognitionException;
+     void rule__XliaPrologObject__ElementsAssignment_2() throws RecognitionException;
+     void rule__XliaPrologObject__ElementsAssignment_4() throws RecognitionException;
+     void rule__XliaPrologAttribute__NameAssignment_0() throws RecognitionException;
+     void rule__XliaPrologAttribute__ValueAssignment_1_1() throws RecognitionException;
+     void rule__XliaOptionObject__NameAssignment_0() throws RecognitionException;
+     void rule__XliaOptionObject__ElementsAssignment_2() throws RecognitionException;
+     void rule__XliaObject__NameAssignment_0() throws RecognitionException;
+     void rule__XliaObject__ElementsAssignment_2() throws RecognitionException;
+     void rule__XliaAttribute__NameAssignment_0() throws RecognitionException;
+     void rule__XliaAttribute__ValueAssignment_2() throws RecognitionException;
+     void rule__UnqualifiedName__NameBindingAssignment() throws RecognitionException;
+     void rule__System__VisibilityAssignment_0_0() throws RecognitionException;
+     void rule__System__TimedAssignment_0_1_0() throws RecognitionException;
+     void rule__System__Input_enabledAssignment_0_1_1() throws RecognitionException;
+     void rule__System__NameAssignment_3() throws RecognitionException;
+     void rule__System__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__System__PortAssignment_6_0() throws RecognitionException;
+     void rule__System__SignalAssignment_6_1() throws RecognitionException;
+     void rule__System__BufferAssignment_6_2() throws RecognitionException;
+     void rule__System__ChannelAssignment_6_3() throws RecognitionException;
+     void rule__System__TypedefAssignment_6_4() throws RecognitionException;
+     void rule__System__PropertyAssignment_6_5() throws RecognitionException;
+     void rule__System__PortAssignment_7_0_1_0() throws RecognitionException;
+     void rule__System__SignalAssignment_7_0_1_1() throws RecognitionException;
+     void rule__System__BufferAssignment_7_0_1_2() throws RecognitionException;
+     void rule__System__ChannelAssignment_7_0_1_3() throws RecognitionException;
+     void rule__System__TypedefAssignment_7_0_1_4() throws RecognitionException;
+     void rule__System__PropertyAssignment_7_0_1_5() throws RecognitionException;
+     void rule__System__PortAssignment_7_1_1_0() throws RecognitionException;
+     void rule__System__SignalAssignment_7_1_1_1() throws RecognitionException;
+     void rule__System__BufferAssignment_7_1_1_2() throws RecognitionException;
+     void rule__System__ChannelAssignment_7_1_1_3() throws RecognitionException;
+     void rule__System__TypedefAssignment_7_1_1_4() throws RecognitionException;
+     void rule__System__PropertyAssignment_7_1_1_5() throws RecognitionException;
+     void rule__System__PortAssignment_7_2_1_0() throws RecognitionException;
+     void rule__System__SignalAssignment_7_2_1_1() throws RecognitionException;
+     void rule__System__BufferAssignment_7_2_1_2() throws RecognitionException;
+     void rule__System__ChannelAssignment_7_2_1_3() throws RecognitionException;
+     void rule__System__TypedefAssignment_7_2_1_4() throws RecognitionException;
+     void rule__System__PropertyAssignment_7_2_1_5() throws RecognitionException;
+     void rule__System__PortAssignment_7_3_1_0() throws RecognitionException;
+     void rule__System__SignalAssignment_7_3_1_1() throws RecognitionException;
+     void rule__System__BufferAssignment_7_3_1_2() throws RecognitionException;
+     void rule__System__ChannelAssignment_7_3_1_3() throws RecognitionException;
+     void rule__System__TypedefAssignment_7_3_1_4() throws RecognitionException;
+     void rule__System__PropertyAssignment_7_3_1_5() throws RecognitionException;
+     void rule__System__RoutineAssignment_8_0_0_1() throws RecognitionException;
+     void rule__System__ProcedureAssignment_8_0_1_1() throws RecognitionException;
+     void rule__System__RoutineAssignment_8_1_0() throws RecognitionException;
+     void rule__System__ProcedureAssignment_8_1_1() throws RecognitionException;
+     void rule__System__MachineAssignment_9_0_1_0() throws RecognitionException;
+     void rule__System__InstanceAssignment_9_0_1_1() throws RecognitionException;
+     void rule__System__MachineAssignment_9_1_1() throws RecognitionException;
+     void rule__System__MachineAssignment_9_2_1() throws RecognitionException;
+     void rule__System__InstanceAssignment_9_3_1() throws RecognitionException;
+     void rule__System__BehaviorAssignment_10_0_1() throws RecognitionException;
+     void rule__System__BehaviorAssignment_10_1_1() throws RecognitionException;
+     void rule__System__MainAssignment_11() throws RecognitionException;
+     void rule__InstanceMachine__ModelAssignment_4() throws RecognitionException;
+     void rule__InstanceMachine__NameAssignment_6() throws RecognitionException;
+     void rule__InstanceMachine__UnrestrictedNameAssignment_7() throws RecognitionException;
+     void rule__InstanceMachine__SlotAssignment_8_0_0_1_0() throws RecognitionException;
+     void rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1() throws RecognitionException;
+     void rule__InstanceMachine__SlotAssignment_8_1_1_0() throws RecognitionException;
+     void rule__SlotParameter__XliaPropertyAssignment_0() throws RecognitionException;
+     void rule__SlotParameter__ValueAssignment_2() throws RecognitionException;
+     void rule__SlotProperty__XliaPropertyAssignment_0() throws RecognitionException;
+     void rule__SlotProperty__ValueAssignment_2() throws RecognitionException;
+     void rule__MachineBlock__VisibilityAssignment_0_0() throws RecognitionException;
+     void rule__MachineBlock__TimedAssignment_0_1_0() throws RecognitionException;
+     void rule__MachineBlock__Input_enabledAssignment_0_1_1() throws RecognitionException;
+     void rule__MachineBlock__DesignAssignment_0_2() throws RecognitionException;
+     void rule__MachineBlock__NameAssignment_3() throws RecognitionException;
+     void rule__MachineBlock__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__MachineBlock__PortAssignment_6_0() throws RecognitionException;
+     void rule__MachineBlock__SignalAssignment_6_1() throws RecognitionException;
+     void rule__MachineBlock__BufferAssignment_6_2() throws RecognitionException;
+     void rule__MachineBlock__ChannelAssignment_6_3() throws RecognitionException;
+     void rule__MachineBlock__TypedefAssignment_6_4() throws RecognitionException;
+     void rule__MachineBlock__PropertyAssignment_6_5() throws RecognitionException;
+     void rule__MachineBlock__PortAssignment_7_0_1_0() throws RecognitionException;
+     void rule__MachineBlock__SignalAssignment_7_0_1_1() throws RecognitionException;
+     void rule__MachineBlock__BufferAssignment_7_0_1_2() throws RecognitionException;
+     void rule__MachineBlock__ChannelAssignment_7_0_1_3() throws RecognitionException;
+     void rule__MachineBlock__TypedefAssignment_7_0_1_4() throws RecognitionException;
+     void rule__MachineBlock__PropertyAssignment_7_0_1_5() throws RecognitionException;
+     void rule__MachineBlock__PortAssignment_7_1_1_0() throws RecognitionException;
+     void rule__MachineBlock__SignalAssignment_7_1_1_1() throws RecognitionException;
+     void rule__MachineBlock__BufferAssignment_7_1_1_2() throws RecognitionException;
+     void rule__MachineBlock__ChannelAssignment_7_1_1_3() throws RecognitionException;
+     void rule__MachineBlock__TypedefAssignment_7_1_1_4() throws RecognitionException;
+     void rule__MachineBlock__PropertyAssignment_7_1_1_5() throws RecognitionException;
+     void rule__MachineBlock__PortAssignment_7_2_1_0() throws RecognitionException;
+     void rule__MachineBlock__SignalAssignment_7_2_1_1() throws RecognitionException;
+     void rule__MachineBlock__BufferAssignment_7_2_1_2() throws RecognitionException;
+     void rule__MachineBlock__ChannelAssignment_7_2_1_3() throws RecognitionException;
+     void rule__MachineBlock__TypedefAssignment_7_2_1_4() throws RecognitionException;
+     void rule__MachineBlock__PropertyAssignment_7_2_1_5() throws RecognitionException;
+     void rule__MachineBlock__PortAssignment_7_3_1_0() throws RecognitionException;
+     void rule__MachineBlock__SignalAssignment_7_3_1_1() throws RecognitionException;
+     void rule__MachineBlock__BufferAssignment_7_3_1_2() throws RecognitionException;
+     void rule__MachineBlock__ChannelAssignment_7_3_1_3() throws RecognitionException;
+     void rule__MachineBlock__TypedefAssignment_7_3_1_4() throws RecognitionException;
+     void rule__MachineBlock__PropertyAssignment_7_3_1_5() throws RecognitionException;
+     void rule__MachineBlock__RoutineAssignment_8_0_0_1() throws RecognitionException;
+     void rule__MachineBlock__ProcedureAssignment_8_0_1_1() throws RecognitionException;
+     void rule__MachineBlock__RoutineAssignment_8_1_0() throws RecognitionException;
+     void rule__MachineBlock__ProcedureAssignment_8_1_1() throws RecognitionException;
+     void rule__MachineBlock__MachineAssignment_9_0_1_0() throws RecognitionException;
+     void rule__MachineBlock__InstanceAssignment_9_0_1_1() throws RecognitionException;
+     void rule__MachineBlock__MachineAssignment_9_1_1() throws RecognitionException;
+     void rule__MachineBlock__MachineAssignment_9_2_1() throws RecognitionException;
+     void rule__MachineBlock__InstanceAssignment_9_3_1() throws RecognitionException;
+     void rule__MachineBlock__BehaviorAssignment_10_0_1() throws RecognitionException;
+     void rule__MachineBlock__BehaviorAssignment_10_1_1() throws RecognitionException;
+     void rule__MachineBlock__MainAssignment_11() throws RecognitionException;
+     void rule__Procedure__VisibilityAssignment_0() throws RecognitionException;
+     void rule__Procedure__NameAssignment_3() throws RecognitionException;
+     void rule__Procedure__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_5_0_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_5_0_1_1_1() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_5_1_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_5_1_1_1_1() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_5_1_1_1_2_1() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_7_0_1_0_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_7_0_1_1_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_7_0_1_2_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_7_0_1_3_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1() throws RecognitionException;
+     void rule__Procedure__PortAssignment_7_1_0() throws RecognitionException;
+     void rule__Procedure__SignalAssignment_7_1_1() throws RecognitionException;
+     void rule__Procedure__BufferAssignment_7_1_2() throws RecognitionException;
+     void rule__Procedure__ChannelAssignment_7_1_3() throws RecognitionException;
+     void rule__Procedure__TypedefAssignment_7_1_4() throws RecognitionException;
+     void rule__Procedure__PropertyAssignment_7_1_5() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_8_0_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_8_0_1_1_1() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_8_1_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_8_1_1_1_1() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_8_2_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_8_2_1_1_1() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_8_3_1_0() throws RecognitionException;
+     void rule__Procedure__ParameterAssignment_8_3_1_1_1() throws RecognitionException;
+     void rule__Procedure__PortAssignment_9_0_1_0() throws RecognitionException;
+     void rule__Procedure__SignalAssignment_9_0_1_1() throws RecognitionException;
+     void rule__Procedure__BufferAssignment_9_0_1_2() throws RecognitionException;
+     void rule__Procedure__ChannelAssignment_9_0_1_3() throws RecognitionException;
+     void rule__Procedure__TypedefAssignment_9_0_1_4() throws RecognitionException;
+     void rule__Procedure__PropertyAssignment_9_0_1_5() throws RecognitionException;
+     void rule__Procedure__PortAssignment_9_1_1_0() throws RecognitionException;
+     void rule__Procedure__SignalAssignment_9_1_1_1() throws RecognitionException;
+     void rule__Procedure__BufferAssignment_9_1_1_2() throws RecognitionException;
+     void rule__Procedure__ChannelAssignment_9_1_1_3() throws RecognitionException;
+     void rule__Procedure__TypedefAssignment_9_1_1_4() throws RecognitionException;
+     void rule__Procedure__PropertyAssignment_9_1_1_5() throws RecognitionException;
+     void rule__Procedure__PortAssignment_9_2_1_0() throws RecognitionException;
+     void rule__Procedure__SignalAssignment_9_2_1_1() throws RecognitionException;
+     void rule__Procedure__BufferAssignment_9_2_1_2() throws RecognitionException;
+     void rule__Procedure__ChannelAssignment_9_2_1_3() throws RecognitionException;
+     void rule__Procedure__TypedefAssignment_9_2_1_4() throws RecognitionException;
+     void rule__Procedure__PropertyAssignment_9_2_1_5() throws RecognitionException;
+     void rule__Procedure__PortAssignment_9_3_1_0() throws RecognitionException;
+     void rule__Procedure__SignalAssignment_9_3_1_1() throws RecognitionException;
+     void rule__Procedure__BufferAssignment_9_3_1_2() throws RecognitionException;
+     void rule__Procedure__ChannelAssignment_9_3_1_3() throws RecognitionException;
+     void rule__Procedure__TypedefAssignment_9_3_1_4() throws RecognitionException;
+     void rule__Procedure__PropertyAssignment_9_3_1_5() throws RecognitionException;
+     void rule__Procedure__RoutineAssignment_10_0_0_1() throws RecognitionException;
+     void rule__Procedure__ProcedureAssignment_10_0_1_1() throws RecognitionException;
+     void rule__Procedure__RoutineAssignment_10_1_0() throws RecognitionException;
+     void rule__Procedure__ProcedureAssignment_10_1_1() throws RecognitionException;
+     void rule__Procedure__RegionAssignment_11_0() throws RecognitionException;
+     void rule__Procedure__RegionAssignment_11_1() throws RecognitionException;
+     void rule__Procedure__ExecutionAssignment_12() throws RecognitionException;
+     void rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1() throws RecognitionException;
+     void rule__ProcedureExecution__RunRoutineAssignment_2_1_1() throws RecognitionException;
+     void rule__MoeBehavior__PortAssignment_1_1_0() throws RecognitionException;
+     void rule__MoeBehavior__SignalAssignment_1_1_1() throws RecognitionException;
+     void rule__MoeBehavior__BufferAssignment_1_1_2() throws RecognitionException;
+     void rule__MoeBehavior__ChannelAssignment_1_1_3() throws RecognitionException;
+     void rule__MoeBehavior__TypedefAssignment_1_1_4() throws RecognitionException;
+     void rule__MoeBehavior__PropertyAssignment_1_1_5() throws RecognitionException;
+     void rule__MoeBehavior__ExecutionAssignment_2_0() throws RecognitionException;
+     void rule__MoeBehavior__InteractionAssignment_2_1() throws RecognitionException;
+     void rule__Statemachine__VisibilityAssignment_1_0() throws RecognitionException;
+     void rule__Statemachine__TimedAssignment_1_1_0() throws RecognitionException;
+     void rule__Statemachine__Input_enabledAssignment_1_1_1() throws RecognitionException;
+     void rule__Statemachine__DesignAssignment_1_2() throws RecognitionException;
+     void rule__Statemachine__NameAssignment_4() throws RecognitionException;
+     void rule__Statemachine__UnrestrictedNameAssignment_5() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_7_0_1_0_1_0() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_7_0_1_1_1_0() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_7_0_1_2_1_0() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_7_0_1_3_1_0() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1() throws RecognitionException;
+     void rule__Statemachine__PortAssignment_7_1_0() throws RecognitionException;
+     void rule__Statemachine__SignalAssignment_7_1_1() throws RecognitionException;
+     void rule__Statemachine__BufferAssignment_7_1_2() throws RecognitionException;
+     void rule__Statemachine__ChannelAssignment_7_1_3() throws RecognitionException;
+     void rule__Statemachine__TypedefAssignment_7_1_4() throws RecognitionException;
+     void rule__Statemachine__PropertyAssignment_7_1_5() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_8_0_1_0() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_8_0_1_1_1() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_8_1_1_0() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_8_1_1_1_1() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_8_2_1_0() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_8_2_1_1_1() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_8_3_1_0() throws RecognitionException;
+     void rule__Statemachine__ParameterAssignment_8_3_1_1_1() throws RecognitionException;
+     void rule__Statemachine__PortAssignment_9_0_1_0() throws RecognitionException;
+     void rule__Statemachine__SignalAssignment_9_0_1_1() throws RecognitionException;
+     void rule__Statemachine__BufferAssignment_9_0_1_2() throws RecognitionException;
+     void rule__Statemachine__ChannelAssignment_9_0_1_3() throws RecognitionException;
+     void rule__Statemachine__TypedefAssignment_9_0_1_4() throws RecognitionException;
+     void rule__Statemachine__PropertyAssignment_9_0_1_5() throws RecognitionException;
+     void rule__Statemachine__PortAssignment_9_1_1_0() throws RecognitionException;
+     void rule__Statemachine__SignalAssignment_9_1_1_1() throws RecognitionException;
+     void rule__Statemachine__BufferAssignment_9_1_1_2() throws RecognitionException;
+     void rule__Statemachine__ChannelAssignment_9_1_1_3() throws RecognitionException;
+     void rule__Statemachine__TypedefAssignment_9_1_1_4() throws RecognitionException;
+     void rule__Statemachine__PropertyAssignment_9_1_1_5() throws RecognitionException;
+     void rule__Statemachine__PortAssignment_9_2_1_0() throws RecognitionException;
+     void rule__Statemachine__SignalAssignment_9_2_1_1() throws RecognitionException;
+     void rule__Statemachine__BufferAssignment_9_2_1_2() throws RecognitionException;
+     void rule__Statemachine__ChannelAssignment_9_2_1_3() throws RecognitionException;
+     void rule__Statemachine__TypedefAssignment_9_2_1_4() throws RecognitionException;
+     void rule__Statemachine__PropertyAssignment_9_2_1_5() throws RecognitionException;
+     void rule__Statemachine__PortAssignment_9_3_1_0() throws RecognitionException;
+     void rule__Statemachine__SignalAssignment_9_3_1_1() throws RecognitionException;
+     void rule__Statemachine__BufferAssignment_9_3_1_2() throws RecognitionException;
+     void rule__Statemachine__ChannelAssignment_9_3_1_3() throws RecognitionException;
+     void rule__Statemachine__TypedefAssignment_9_3_1_4() throws RecognitionException;
+     void rule__Statemachine__PropertyAssignment_9_3_1_5() throws RecognitionException;
+     void rule__Statemachine__RoutineAssignment_10_0_0_1() throws RecognitionException;
+     void rule__Statemachine__ProcedureAssignment_10_0_1_1() throws RecognitionException;
+     void rule__Statemachine__RoutineAssignment_10_1_0() throws RecognitionException;
+     void rule__Statemachine__ProcedureAssignment_10_1_1() throws RecognitionException;
+     void rule__Statemachine__RegionAssignment_11_0() throws RecognitionException;
+     void rule__Statemachine__RegionAssignment_11_1() throws RecognitionException;
+     void rule__Statemachine__ExecutionAssignment_12_0() throws RecognitionException;
+     void rule__Statemachine__InteractionAssignment_12_1() throws RecognitionException;
+     void rule__StatemachineRegion__NameAssignment_1_1_1() throws RecognitionException;
+     void rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2() throws RecognitionException;
+     void rule__StatemachineRegion__VertexAssignment_2_0() throws RecognitionException;
+     void rule__StatemachineRegion__VertexAssignment_2_1() throws RecognitionException;
+     void rule__StatemachineRegionLite__VertexAssignment_0() throws RecognitionException;
+     void rule__StatemachineRegionLite__VertexAssignment_1() throws RecognitionException;
+     void rule__CompositeState__CompositeAssignment_1() throws RecognitionException;
+     void rule__CompositeState__OrthogonalAssignment_4_1() throws RecognitionException;
+     void rule__CompositeState__NameAssignment_6() throws RecognitionException;
+     void rule__CompositeState__UnrestrictedNameAssignment_7() throws RecognitionException;
+     void rule__CompositeState__RegionAssignment_8_0_1_0_0() throws RecognitionException;
+     void rule__CompositeState__MoeAssignment_8_0_1_0_1_1() throws RecognitionException;
+     void rule__CompositeState__TransitionAssignment_8_0_1_0_2_1() throws RecognitionException;
+     void rule__CompositeState__RegionAssignment_8_0_1_1_0() throws RecognitionException;
+     void rule__CompositeState__TransitionAssignment_8_0_1_1_1_0() throws RecognitionException;
+     void rule__CompositeState__MoeAssignment_8_0_1_1_1_1() throws RecognitionException;
+     void rule__MoeCompositeStateRoutines__NameAssignment_1() throws RecognitionException;
+     void rule__MoeCompositeStateRoutines__BodyBlockAssignment_2() throws RecognitionException;
+     void rule__SimpleState__SimpleAssignment_1() throws RecognitionException;
+     void rule__SimpleState__NameAssignment_3() throws RecognitionException;
+     void rule__SimpleState__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__SimpleState__TransitionAssignment_5_0_1_0() throws RecognitionException;
+     void rule__SimpleState__MoeAssignment_5_0_1_1() throws RecognitionException;
+     void rule__MoeSimpleStateRoutines__NameAssignment_1() throws RecognitionException;
+     void rule__MoeSimpleStateRoutines__BodyBlockAssignment_2() throws RecognitionException;
+     void rule__StartState__SimpleAssignment_1_0_0() throws RecognitionException;
+     void rule__StartState__NameAssignment_1_0_5() throws RecognitionException;
+     void rule__StartState__SimpleAssignment_1_1() throws RecognitionException;
+     void rule__StartState__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__StartState__TransitionAssignment_3_0_1_0() throws RecognitionException;
+     void rule__StartState__MoeAssignment_3_0_1_1() throws RecognitionException;
+     void rule__MoeStartStateRoutines__NameAssignment_1() throws RecognitionException;
+     void rule__MoeStartStateRoutines__BodyBlockAssignment_2() throws RecognitionException;
+     void rule__FinalState__SimpleAssignment_1_0_0() throws RecognitionException;
+     void rule__FinalState__NameAssignment_1_0_5() throws RecognitionException;
+     void rule__FinalState__SimpleAssignment_1_1() throws RecognitionException;
+     void rule__FinalState__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__FinalState__MoeAssignment_3_0_1() throws RecognitionException;
+     void rule__MoeFinalStateRoutines__NameAssignment_1() throws RecognitionException;
+     void rule__MoeFinalStateRoutines__BodyBlockAssignment_2() throws RecognitionException;
+     void rule__OtherPseudostate__KindAssignment_4() throws RecognitionException;
+     void rule__OtherPseudostate__NameAssignment_6() throws RecognitionException;
+     void rule__OtherPseudostate__UnrestrictedNameAssignment_7() throws RecognitionException;
+     void rule__OtherPseudostate__TransitionAssignment_8_0_1() throws RecognitionException;
+     void rule__PseudostateInitial__KindAssignment_1_0_3() throws RecognitionException;
+     void rule__PseudostateInitial__NameAssignment_1_0_5() throws RecognitionException;
+     void rule__PseudostateInitial__NameAssignment_1_1() throws RecognitionException;
+     void rule__PseudostateInitial__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__PseudostateInitial__TransitionAssignment_3_0_1() throws RecognitionException;
+     void rule__EndingPseudostate__KindAssignment_4() throws RecognitionException;
+     void rule__EndingPseudostate__NameAssignment_6() throws RecognitionException;
+     void rule__EndingPseudostate__UnrestrictedNameAssignment_7() throws RecognitionException;
+     void rule__EndingPseudostate__MoeAssignment_8_0_1() throws RecognitionException;
+     void rule__ModelOfExecution__RoutineAssignment_2() throws RecognitionException;
+     void rule__ModelOfExecution__InitRoutineAssignment_3_0_1() throws RecognitionException;
+     void rule__ModelOfExecution__FinalRoutineAssignment_3_1_1() throws RecognitionException;
+     void rule__ModelOfExecution__EnableRoutineAssignment_3_2_1() throws RecognitionException;
+     void rule__ModelOfExecution__DisableRoutineAssignment_3_3_1() throws RecognitionException;
+     void rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1() throws RecognitionException;
+     void rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1() throws RecognitionException;
+     void rule__ModelOfExecution__IrunRoutineAssignment_3_6_1() throws RecognitionException;
+     void rule__ModelOfExecution__RunRoutineAssignment_3_7_1() throws RecognitionException;
+     void rule__ModelOfExecution__RoutineAssignment_4() throws RecognitionException;
+     void rule__MoeRoutine__DomainAssignment_1_1() throws RecognitionException;
+     void rule__MoeRoutine__CodomainAssignment_2_1_0_1() throws RecognitionException;
+     void rule__MoeRoutine__CodomainAssignment_2_1_1() throws RecognitionException;
+     void rule__MoeRoutine__BodyBlockAssignment_3() throws RecognitionException;
+     void rule__Routine__VisibilityAssignment_0() throws RecognitionException;
+     void rule__Routine__NameAssignment_3() throws RecognitionException;
+     void rule__Routine__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__Routine__DomainAssignment_5_1() throws RecognitionException;
+     void rule__Routine__CodomainAssignment_6_1_0_1() throws RecognitionException;
+     void rule__Routine__CodomainAssignment_6_1_1() throws RecognitionException;
+     void rule__Routine__BodyBlockAssignment_7() throws RecognitionException;
+     void rule__ModelOfInteraction__RoutesAssignment_2_0() throws RecognitionException;
+     void rule__ModelOfInteraction__ConnectionsAssignment_2_1() throws RecognitionException;
+     void rule__Route__ProtocolAssignment_3() throws RecognitionException;
+     void rule__Route__NameAssignment_5_0() throws RecognitionException;
+     void rule__Route__UnrestrictedNameAssignment_5_1() throws RecognitionException;
+     void rule__Route__SignalsAssignment_7_1_0() throws RecognitionException;
+     void rule__Route__SignalsAssignment_7_1_1_1() throws RecognitionException;
+     void rule__ComRouteProtocol__ProtocolAssignment_0() throws RecognitionException;
+     void rule__ComRouteProtocol__ProtocolAssignment_1_0() throws RecognitionException;
+     void rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0() throws RecognitionException;
+     void rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1() throws RecognitionException;
+     void rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0() throws RecognitionException;
+     void rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1() throws RecognitionException;
+     void rule__ComRouteProtocol__Inner_bufferAssignment_2() throws RecognitionException;
+     void rule__ComRouteProtocol__Ref_bufferAssignment_3() throws RecognitionException;
+     void rule__Connection__ProtocolAssignment_2() throws RecognitionException;
+     void rule__Connection__NameAssignment_4_0() throws RecognitionException;
+     void rule__Connection__UnrestrictedNameAssignment_4_1() throws RecognitionException;
+     void rule__Connection__ComPointsAssignment_6() throws RecognitionException;
+     void rule__ComProtocol__ProtocolAssignment_0() throws RecognitionException;
+     void rule__ComProtocol__ProtocolAssignment_1_0() throws RecognitionException;
+     void rule__ComProtocol__CastAssignment_1_1_1() throws RecognitionException;
+     void rule__ComProtocol__ProtocolAssignment_2_0() throws RecognitionException;
+     void rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0() throws RecognitionException;
+     void rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1() throws RecognitionException;
+     void rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0() throws RecognitionException;
+     void rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1() throws RecognitionException;
+     void rule__ComProtocol__Inner_bufferAssignment_3() throws RecognitionException;
+     void rule__ComProtocol__Ref_bufferAssignment_4() throws RecognitionException;
+     void rule__ComProtocol__CastAssignment_5() throws RecognitionException;
+     void rule__ComPoint__DirectionAssignment_1() throws RecognitionException;
+     void rule__ComPoint__ProtocolAssignment_2_1() throws RecognitionException;
+     void rule__ComPoint__PointAssignment_3_0_0() throws RecognitionException;
+     void rule__ComPoint__PointsAssignment_3_1_1() throws RecognitionException;
+     void rule__ComPointProtocol__ProtocolAssignment_0_0() throws RecognitionException;
+     void rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0() throws RecognitionException;
+     void rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1() throws RecognitionException;
+     void rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0() throws RecognitionException;
+     void rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1() throws RecognitionException;
+     void rule__ComPointProtocol__Inner_bufferAssignment_1() throws RecognitionException;
+     void rule__ComPointProtocol__Ref_bufferAssignment_2() throws RecognitionException;
+     void rule__ComElement__KindAssignment_0_1_1() throws RecognitionException;
+     void rule__ComElement__ElementAssignment_0_1_2() throws RecognitionException;
+     void rule__ComElement__TargetAssignment_1_1() throws RecognitionException;
+     void rule__ComElement__KindAssignment_1_2() throws RecognitionException;
+     void rule__ComElement__ElementAssignment_1_3() throws RecognitionException;
+     void rule__DataTypeReference__MultiplicityAssignment_0_1_2() throws RecognitionException;
+     void rule__DataTypeReference__TyperefAssignment_1_1() throws RecognitionException;
+     void rule__DataTypeReference__MultiplicityAssignment_1_2_1() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__VisibilityAssignment_1() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__NameAssignment_3() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__SupportAssignment_5_0_0() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1() throws RecognitionException;
+     void rule__OtherDataTypeDefinition__TypedefAssignment_6() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__NameAssignment_1() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1() throws RecognitionException;
+     void rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4() throws RecognitionException;
+     void rule__PrimitiveIntegerType__SignAssignment_1() throws RecognitionException;
+     void rule__PrimitiveIntegerType__SizeAssignment_3_0_1() throws RecognitionException;
+     void rule__PrimitiveIntegerType__SizeAssignment_3_1_2() throws RecognitionException;
+     void rule__PrimitiveRationalType__SignAssignment_1() throws RecognitionException;
+     void rule__PrimitiveRationalType__SizeAssignment_3_0_1() throws RecognitionException;
+     void rule__PrimitiveRationalType__SizeAssignment_3_1_2() throws RecognitionException;
+     void rule__PrimitiveFloatType__SignAssignment_1() throws RecognitionException;
+     void rule__PrimitiveFloatType__SizeAssignment_3_0_1() throws RecognitionException;
+     void rule__PrimitiveFloatType__SizeAssignment_3_1_2() throws RecognitionException;
+     void rule__PrimitiveRealType__SignAssignment_1() throws RecognitionException;
+     void rule__PrimitiveRealType__SizeAssignment_3_0_1() throws RecognitionException;
+     void rule__PrimitiveRealType__SizeAssignment_3_1_2() throws RecognitionException;
+     void rule__PrimitiveTimeType__SupportAssignment_0_2_0_1() throws RecognitionException;
+     void rule__PrimitiveTimeType__SupportAssignment_0_2_1() throws RecognitionException;
+     void rule__PrimitiveTimeType__ClockAssignment_1_1() throws RecognitionException;
+     void rule__PrimitiveTimeType__SupportAssignment_1_2_0_1() throws RecognitionException;
+     void rule__PrimitiveTimeType__SupportAssignment_1_2_1() throws RecognitionException;
+     void rule__PrimitiveStringType__SizeAssignment_2_0_1() throws RecognitionException;
+     void rule__PrimitiveStringType__SizeAssignment_2_1_2() throws RecognitionException;
+     void rule__PrimitiveInstanceType__ExpectedAssignment_1() throws RecognitionException;
+     void rule__PrimitiveInstanceType__ModelAssignment_2_1() throws RecognitionException;
+     void rule__IntervalType__SupportAssignment_3() throws RecognitionException;
+     void rule__IntervalType__LopenAssignment_4_0() throws RecognitionException;
+     void rule__IntervalType__InfimumAssignment_5() throws RecognitionException;
+     void rule__IntervalType__SupremumAssignment_7() throws RecognitionException;
+     void rule__IntervalType__RopenAssignment_8_1() throws RecognitionException;
+     void rule__IntervalTypeDefinition__VisibilityAssignment_1() throws RecognitionException;
+     void rule__IntervalTypeDefinition__NameAssignment_3() throws RecognitionException;
+     void rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__IntervalTypeDefinition__SupportAssignment_7() throws RecognitionException;
+     void rule__IntervalTypeDefinition__LopenAssignment_8_0() throws RecognitionException;
+     void rule__IntervalTypeDefinition__InfimumAssignment_9() throws RecognitionException;
+     void rule__IntervalTypeDefinition__SupremumAssignment_11() throws RecognitionException;
+     void rule__IntervalTypeDefinition__RopenAssignment_12_1() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__NameAssignment_1() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__SupportAssignment_5() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__InfimumAssignment_7() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__SupremumAssignment_9() throws RecognitionException;
+     void rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1() throws RecognitionException;
+     void rule__CollectionType__ContainerAssignment_1() throws RecognitionException;
+     void rule__CollectionType__SupportAssignment_3() throws RecognitionException;
+     void rule__CollectionType__SizeAssignment_4_1_0() throws RecognitionException;
+     void rule__CollectionType__UnboundedAssignment_4_1_1() throws RecognitionException;
+     void rule__CollectionTypeDefinition__VisibilityAssignment_1() throws RecognitionException;
+     void rule__CollectionTypeDefinition__NameAssignment_3() throws RecognitionException;
+     void rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__CollectionTypeDefinition__ContainerAssignment_5() throws RecognitionException;
+     void rule__CollectionTypeDefinition__SupportAssignment_7() throws RecognitionException;
+     void rule__CollectionTypeDefinition__SizeAssignment_8_1_0() throws RecognitionException;
+     void rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__NameAssignment_1() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__ContainerAssignment_3() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__SupportAssignment_5() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0() throws RecognitionException;
+     void rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1() throws RecognitionException;
+     void rule__EnumerationType__LiteralAssignment_3() throws RecognitionException;
+     void rule__EnumerationType__LiteralAssignment_4_1() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__VisibilityAssignment_1() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__NameAssignment_3() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__TypedefAssignment_5() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__LiteralAssignment_7() throws RecognitionException;
+     void rule__EnumerationTypeDefinition__LiteralAssignment_8_1() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__NameAssignment_1() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5() throws RecognitionException;
+     void rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1() throws RecognitionException;
+     void rule__EnumerationLiteral__NameAssignment_0() throws RecognitionException;
+     void rule__EnumerationLiteral__UnrestrictedNameAssignment_1() throws RecognitionException;
+     void rule__EnumerationLiteral__ValueAssignment_2_1() throws RecognitionException;
+     void rule__StructureType__PropertyAssignment_3() throws RecognitionException;
+     void rule__StructureTypeDefinition__VisibilityAssignment_1() throws RecognitionException;
+     void rule__StructureTypeDefinition__NameAssignment_3() throws RecognitionException;
+     void rule__StructureTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__StructureTypeDefinition__TypedefAssignment_5() throws RecognitionException;
+     void rule__StructureTypeDefinition__PropertyAssignment_7() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__NameAssignment_1() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__TypedefAssignment_3() throws RecognitionException;
+     void rule__StructureTypeDefinitionImpl__PropertyAssignment_5() throws RecognitionException;
+     void rule__UnionType__PropertyAssignment_3() throws RecognitionException;
+     void rule__UnionTypeDefinition__VisibilityAssignment_1() throws RecognitionException;
+     void rule__UnionTypeDefinition__NameAssignment_3() throws RecognitionException;
+     void rule__UnionTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__UnionTypeDefinition__TypedefAssignment_5() throws RecognitionException;
+     void rule__UnionTypeDefinition__PropertyAssignment_7() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__NameAssignment_1() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__TypedefAssignment_3() throws RecognitionException;
+     void rule__UnionTypeDefinitionImpl__PropertyAssignment_5() throws RecognitionException;
+     void rule__ChoiceType__PropertyAssignment_3() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__VisibilityAssignment_1() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__NameAssignment_3() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__TypedefAssignment_5() throws RecognitionException;
+     void rule__ChoiceTypeDefinition__PropertyAssignment_7() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__NameAssignment_1() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3() throws RecognitionException;
+     void rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5() throws RecognitionException;
+     void rule__Modifier__StaticAssignment_1_0() throws RecognitionException;
+     void rule__Modifier__FinalAssignment_1_1() throws RecognitionException;
+     void rule__Modifier__ReferenceAssignment_1_2() throws RecognitionException;
+     void rule__Modifier__VolatileAssignment_1_3() throws RecognitionException;
+     void rule__Modifier__TransientAssignment_1_4() throws RecognitionException;
+     void rule__Variable__VisibilityAssignment_0_0() throws RecognitionException;
+     void rule__Variable__ModifierAssignment_0_1() throws RecognitionException;
+     void rule__Variable__ConstAssignment_1_1() throws RecognitionException;
+     void rule__Variable__ConstAssignment_1_2_0_0() throws RecognitionException;
+     void rule__Variable__ConstAssignment_1_2_0_1() throws RecognitionException;
+     void rule__Variable__MacroAssignment_1_2_1() throws RecognitionException;
+     void rule__Variable__MacroAssignment_1_3_0() throws RecognitionException;
+     void rule__Variable__ConstAssignment_1_3_1_1() throws RecognitionException;
+     void rule__Variable__TypeAssignment_2() throws RecognitionException;
+     void rule__Variable__NameAssignment_3() throws RecognitionException;
+     void rule__Variable__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__Variable__DefaultValueAssignment_5_1() throws RecognitionException;
+     void rule__Variable__OnWriteActionAssignment_6_0_1() throws RecognitionException;
+     void rule__OnWriteRoutine__ParameterAssignment_2_1() throws RecognitionException;
+     void rule__OnWriteRoutine__BodyBlockAssignment_3() throws RecognitionException;
+     void rule__VariableRoutineParameter__TypeAssignment_0() throws RecognitionException;
+     void rule__VariableRoutineParameter__NameAssignment_1() throws RecognitionException;
+     void rule__VariableRoutineParameter__DefaultValueAssignment_2_1() throws RecognitionException;
+     void rule__VariablePublic__ModifierAssignment_0() throws RecognitionException;
+     void rule__VariablePublic__ConstAssignment_1_0_0() throws RecognitionException;
+     void rule__VariablePublic__ConstAssignment_1_0_1() throws RecognitionException;
+     void rule__VariablePublic__MacroAssignment_1_1() throws RecognitionException;
+     void rule__VariablePublic__VisibilityAssignment_2() throws RecognitionException;
+     void rule__VariablePublic__TypeAssignment_3() throws RecognitionException;
+     void rule__VariablePublic__NameAssignment_4() throws RecognitionException;
+     void rule__VariablePublic__UnrestrictedNameAssignment_5() throws RecognitionException;
+     void rule__VariablePublic__DefaultValueAssignment_6_1() throws RecognitionException;
+     void rule__VariablePublic__OnWriteActionAssignment_7_0_1() throws RecognitionException;
+     void rule__VariableProtected__ModifierAssignment_0() throws RecognitionException;
+     void rule__VariableProtected__ConstAssignment_1_0_0() throws RecognitionException;
+     void rule__VariableProtected__ConstAssignment_1_0_1() throws RecognitionException;
+     void rule__VariableProtected__MacroAssignment_1_1() throws RecognitionException;
+     void rule__VariableProtected__VisibilityAssignment_2() throws RecognitionException;
+     void rule__VariableProtected__TypeAssignment_3() throws RecognitionException;
+     void rule__VariableProtected__NameAssignment_4() throws RecognitionException;
+     void rule__VariableProtected__UnrestrictedNameAssignment_5() throws RecognitionException;
+     void rule__VariableProtected__DefaultValueAssignment_6_1() throws RecognitionException;
+     void rule__VariableProtected__OnWriteActionAssignment_7_0_1() throws RecognitionException;
+     void rule__VariablePrivate__ModifierAssignment_0() throws RecognitionException;
+     void rule__VariablePrivate__ConstAssignment_1_0_0() throws RecognitionException;
+     void rule__VariablePrivate__ConstAssignment_1_0_1() throws RecognitionException;
+     void rule__VariablePrivate__MacroAssignment_1_1() throws RecognitionException;
+     void rule__VariablePrivate__VisibilityAssignment_2() throws RecognitionException;
+     void rule__VariablePrivate__TypeAssignment_3() throws RecognitionException;
+     void rule__VariablePrivate__NameAssignment_4() throws RecognitionException;
+     void rule__VariablePrivate__UnrestrictedNameAssignment_5() throws RecognitionException;
+     void rule__VariablePrivate__DefaultValueAssignment_6_1() throws RecognitionException;
+     void rule__VariablePrivate__OnWriteActionAssignment_7_0_1() throws RecognitionException;
+     void rule__FunctionalParameterSet__ParameterAssignment_1() throws RecognitionException;
+     void rule__FunctionalParameterSet__ParameterAssignment_2_1() throws RecognitionException;
+     void rule__FunctionalParameter__DirectionAssignment_1() throws RecognitionException;
+     void rule__FunctionalParameter__TypeAssignment_2() throws RecognitionException;
+     void rule__FunctionalParameter__NameAssignment_3() throws RecognitionException;
+     void rule__FunctionalParameter__DefaultValueAssignment_4_1() throws RecognitionException;
+     void rule__FormalParameterSet__ParameterAssignment_1() throws RecognitionException;
+     void rule__FormalParameterSet__ParameterAssignment_2_1() throws RecognitionException;
+     void rule__FormalParameter__DirectionAssignment_1() throws RecognitionException;
+     void rule__FormalParameter__TypeAssignment_2() throws RecognitionException;
+     void rule__FormalParameter__NameAssignment_3() throws RecognitionException;
+     void rule__FormalParameter__DefaultValueAssignment_4_1() throws RecognitionException;
+     void rule__ParameterInput__DirectionAssignment_0() throws RecognitionException;
+     void rule__ParameterInput__TypeAssignment_1() throws RecognitionException;
+     void rule__ParameterInput__NameAssignment_2() throws RecognitionException;
+     void rule__ParameterInput__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__ParameterInput__DefaultValueAssignment_4_1() throws RecognitionException;
+     void rule__ParameterInout__DirectionAssignment_0() throws RecognitionException;
+     void rule__ParameterInout__TypeAssignment_1() throws RecognitionException;
+     void rule__ParameterInout__NameAssignment_2() throws RecognitionException;
+     void rule__ParameterInout__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__ParameterInout__DefaultValueAssignment_4_1() throws RecognitionException;
+     void rule__ParameterOutput__DirectionAssignment_0() throws RecognitionException;
+     void rule__ParameterOutput__TypeAssignment_1() throws RecognitionException;
+     void rule__ParameterOutput__NameAssignment_2() throws RecognitionException;
+     void rule__ParameterOutput__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__ParameterOutput__DefaultValueAssignment_4_1() throws RecognitionException;
+     void rule__ParameterReturn__DirectionAssignment_0() throws RecognitionException;
+     void rule__ParameterReturn__TypeAssignment_1() throws RecognitionException;
+     void rule__ParameterReturn__NameAssignment_2() throws RecognitionException;
+     void rule__ParameterReturn__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__ParameterReturn__DefaultValueAssignment_4_1() throws RecognitionException;
+     void rule__BufferContainerType__ContainerAssignment_1() throws RecognitionException;
+     void rule__BufferContainerType__SizeAssignment_2_1_0() throws RecognitionException;
+     void rule__BufferContainerType__UnboundedAssignment_2_1_1() throws RecognitionException;
+     void rule__Buffer__VisibilityAssignment_0_0() throws RecognitionException;
+     void rule__Buffer__ModifierAssignment_0_1() throws RecognitionException;
+     void rule__Buffer__TypeAssignment_2() throws RecognitionException;
+     void rule__Buffer__NameAssignment_3() throws RecognitionException;
+     void rule__Buffer__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__BufferPublic__ModifierAssignment_0() throws RecognitionException;
+     void rule__BufferPublic__VisibilityAssignment_1() throws RecognitionException;
+     void rule__BufferPublic__TypeAssignment_2() throws RecognitionException;
+     void rule__BufferPublic__NameAssignment_3() throws RecognitionException;
+     void rule__BufferPublic__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__BufferProtected__ModifierAssignment_0() throws RecognitionException;
+     void rule__BufferProtected__VisibilityAssignment_1() throws RecognitionException;
+     void rule__BufferProtected__TypeAssignment_2() throws RecognitionException;
+     void rule__BufferProtected__NameAssignment_3() throws RecognitionException;
+     void rule__BufferProtected__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__BufferPrivate__ModifierAssignment_0() throws RecognitionException;
+     void rule__BufferPrivate__VisibilityAssignment_1() throws RecognitionException;
+     void rule__BufferPrivate__TypeAssignment_2() throws RecognitionException;
+     void rule__BufferPrivate__NameAssignment_3() throws RecognitionException;
+     void rule__BufferPrivate__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__Port__VisibilityAssignment_0() throws RecognitionException;
+     void rule__Port__DirectionAssignment_2() throws RecognitionException;
+     void rule__Port__NameAssignment_3() throws RecognitionException;
+     void rule__Port__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__Port__ParameterAssignment_5_1() throws RecognitionException;
+     void rule__Port__ParameterAssignment_5_2_1() throws RecognitionException;
+     void rule__PortPublic__VisibilityAssignment_0() throws RecognitionException;
+     void rule__PortPublic__DirectionAssignment_1() throws RecognitionException;
+     void rule__PortPublic__NameAssignment_2() throws RecognitionException;
+     void rule__PortPublic__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__PortPublic__ParameterAssignment_4_1() throws RecognitionException;
+     void rule__PortPublic__ParameterAssignment_4_2_1() throws RecognitionException;
+     void rule__PortProtected__VisibilityAssignment_0() throws RecognitionException;
+     void rule__PortProtected__DirectionAssignment_1() throws RecognitionException;
+     void rule__PortProtected__NameAssignment_2() throws RecognitionException;
+     void rule__PortProtected__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__PortProtected__ParameterAssignment_4_1() throws RecognitionException;
+     void rule__PortProtected__ParameterAssignment_4_2_1() throws RecognitionException;
+     void rule__PortPrivate__VisibilityAssignment_0() throws RecognitionException;
+     void rule__PortPrivate__DirectionAssignment_1() throws RecognitionException;
+     void rule__PortPrivate__NameAssignment_2() throws RecognitionException;
+     void rule__PortPrivate__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__PortPrivate__ParameterAssignment_4_1() throws RecognitionException;
+     void rule__PortPrivate__ParameterAssignment_4_2_1() throws RecognitionException;
+     void rule__Signal__VisibilityAssignment_0() throws RecognitionException;
+     void rule__Signal__DirectionAssignment_2() throws RecognitionException;
+     void rule__Signal__NameAssignment_3() throws RecognitionException;
+     void rule__Signal__UnrestrictedNameAssignment_4() throws RecognitionException;
+     void rule__Signal__ParameterAssignment_5_1() throws RecognitionException;
+     void rule__Signal__ParameterAssignment_5_2_1() throws RecognitionException;
+     void rule__SignalPublic__VisibilityAssignment_0() throws RecognitionException;
+     void rule__SignalPublic__DirectionAssignment_1() throws RecognitionException;
+     void rule__SignalPublic__NameAssignment_2() throws RecognitionException;
+     void rule__SignalPublic__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__SignalPublic__ParameterAssignment_4_1() throws RecognitionException;
+     void rule__SignalPublic__ParameterAssignment_4_2_1() throws RecognitionException;
+     void rule__SignalProtected__VisibilityAssignment_0() throws RecognitionException;
+     void rule__SignalProtected__DirectionAssignment_1() throws RecognitionException;
+     void rule__SignalProtected__NameAssignment_2() throws RecognitionException;
+     void rule__SignalProtected__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__SignalProtected__ParameterAssignment_4_1() throws RecognitionException;
+     void rule__SignalProtected__ParameterAssignment_4_2_1() throws RecognitionException;
+     void rule__SignalPrivate__VisibilityAssignment_0() throws RecognitionException;
+     void rule__SignalPrivate__DirectionAssignment_1() throws RecognitionException;
+     void rule__SignalPrivate__NameAssignment_2() throws RecognitionException;
+     void rule__SignalPrivate__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__SignalPrivate__ParameterAssignment_4_1() throws RecognitionException;
+     void rule__SignalPrivate__ParameterAssignment_4_2_1() throws RecognitionException;
+     void rule__Channel__VisibilityAssignment_0() throws RecognitionException;
+     void rule__Channel__NameAssignment_2() throws RecognitionException;
+     void rule__Channel__UnrestrictedNameAssignment_3() throws RecognitionException;
+     void rule__Channel__SignalAssignment_5_0() throws RecognitionException;
+     void rule__SignalReference__DirectionAssignment_0() throws RecognitionException;
+     void rule__SignalReference__NameAssignment_1() throws RecognitionException;
+     void rule__ChannelPublic__VisibilityAssignment_0() throws RecognitionException;
+     void rule__ChannelPublic__NameAssignment_1() throws RecognitionException;
+     void rule__ChannelPublic__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__ChannelPublic__SignalAssignment_4_0() throws RecognitionException;
+     void rule__ChannelProtected__VisibilityAssignment_0() throws RecognitionException;
+     void rule__ChannelProtected__NameAssignment_1() throws RecognitionException;
+     void rule__ChannelProtected__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__ChannelProtected__SignalAssignment_4_0() throws RecognitionException;
+     void rule__ChannelPrivate__VisibilityAssignment_0() throws RecognitionException;
+     void rule__ChannelPrivate__NameAssignment_1() throws RecognitionException;
+     void rule__ChannelPrivate__UnrestrictedNameAssignment_2() throws RecognitionException;
+     void rule__ChannelPrivate__SignalAssignment_4_0() throws RecognitionException;
+     void rule__Transition__TransientAssignment_1() throws RecognitionException;
+     void rule__Transition__MoeAssignment_3() throws RecognitionException;
+     void rule__Transition__NameAssignment_4_0() throws RecognitionException;
+     void rule__Transition__UnrestrictedNameAssignment_4_1() throws RecognitionException;
+     void rule__Transition__TriggerAssignment_5_0_1_0_0_1() throws RecognitionException;
+     void rule__Transition__GuardAssignment_5_0_1_0_1_0() throws RecognitionException;
+     void rule__Transition__TguardAssignment_5_0_1_0_2_0() throws RecognitionException;
+     void rule__Transition__EffectAssignment_5_0_1_0_4() throws RecognitionException;
+     void rule__Transition__BehaviorAssignment_5_0_1_1() throws RecognitionException;
+     void rule__Transition__TargetAssignment_5_0_3_1() throws RecognitionException;
+     void rule__Transition__TargetAssignment_5_1_1() throws RecognitionException;
+     void rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1() throws RecognitionException;
+     void rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0() throws RecognitionException;
+     void rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0() throws RecognitionException;
+     void rule__Transition__EffectAssignment_5_1_2_0_1_0_4() throws RecognitionException;
+     void rule__Transition__BehaviorAssignment_5_1_2_0_1_1() throws RecognitionException;
+     void rule__TransitionMoe__MocAssignment_1_0_1_0_0() throws RecognitionException;
+     void rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1() throws RecognitionException;
+     void rule__TransitionMoe__IsElseAssignment_1_0_1_1() throws RecognitionException;
+     void rule__TransitionMoe__PriorAssignment_1_0_2_2() throws RecognitionException;
+     void rule__TransitionMoe__PriorAssignment_1_1_1() throws RecognitionException;
+     void rule__TransitionBehavior__OpAssignment_1() throws RecognitionException;
+     void rule__TransitionBehavior__StatementAssignment_2() throws RecognitionException;
+     void rule__TransitionGuard__ConditionAssignment_0_2() throws RecognitionException;
+     void rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1() throws RecognitionException;
+     void rule__TransitionGuard__ConditionAssignment_1_1_0_1_1() throws RecognitionException;
+     void rule__TransitionGuardExpression__OperatorAssignment_1() throws RecognitionException;
+     void rule__TransitionGuardExpression__OperandAssignment_3() throws RecognitionException;
+     void rule__TransitionTimedGuard__ConditionAssignment_0_2() throws RecognitionException;
+     void rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1() throws RecognitionException;
+     void rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1() throws RecognitionException;
+     void rule__TransitionEffect__StatementAssignment_1_1() throws RecognitionException;
+     void rule__BlockStatement__OpAssignment_2() throws RecognitionException;
+     void rule__BlockStatement__StatementAssignment_3() throws RecognitionException;
+     void rule__ExpressionStatement__ExpressionAssignment_0_0() throws RecognitionException;
+     void rule__ExpressionStatement__ExpressionAssignment_1_0() throws RecognitionException;
+     void rule__ExpressionStatement__ExpressionAssignment_2_0() throws RecognitionException;
+     void rule__ExpressionStatement__ExpressionAssignment_3_0() throws RecognitionException;
+     void rule__GuardStatement__ConditionAssignment_1() throws RecognitionException;
+     void rule__TimedGuardStatement__ConditionAssignment_1() throws RecognitionException;
+     void rule__EventGuardStatement__ConditionAssignment_1() throws RecognitionException;
+     void rule__CheckSatGuardStatement__SolverAssignment_2() throws RecognitionException;
+     void rule__CheckSatGuardStatement__ConditionAssignment_4() throws RecognitionException;
+     void rule__InputComStatement__PortAssignment_1() throws RecognitionException;
+     void rule__InputComStatement__LeftValueAssignment_2_1() throws RecognitionException;
+     void rule__InputComStatement__LeftValueAssignment_2_2_1() throws RecognitionException;
+     void rule__InputComStatement__TargetAssignment_3_0_1() throws RecognitionException;
+     void rule__InputComStatement__RouteAssignment_3_1_1() throws RecognitionException;
+     void rule__OutputComStatement__PortAssignment_1() throws RecognitionException;
+     void rule__OutputComStatement__RigthValueAssignment_2_1() throws RecognitionException;
+     void rule__OutputComStatement__RigthValueAssignment_2_2_1() throws RecognitionException;
+     void rule__OutputComStatement__TargetAssignment_3_0_1() throws RecognitionException;
+     void rule__OutputComStatement__RouteAssignment_3_1_1() throws RecognitionException;
+     void rule__ExpressionAsMachine__MachineAssignment() throws RecognitionException;
+     void rule__IfStatement__ConditionAssignment_1() throws RecognitionException;
+     void rule__IfStatement__BodyBlockAssignment_2() throws RecognitionException;
+     void rule__IfStatement__ElseifStatementAssignment_3() throws RecognitionException;
+     void rule__IfStatement__ElseBlockAssignment_4_1() throws RecognitionException;
+     void rule__ElseIfStatement__ConditionAssignment_1() throws RecognitionException;
+     void rule__ElseIfStatement__BodyBlockAssignment_2() throws RecognitionException;
+     void rule__WhileDoStatement__ConditionAssignment_1() throws RecognitionException;
+     void rule__WhileDoStatement__BodyBlockAssignment_2() throws RecognitionException;
+     void rule__DoWhileStatement__BodyBlockAssignment_1() throws RecognitionException;
+     void rule__DoWhileStatement__ConditionAssignment_3() throws RecognitionException;
+     void rule__ForStatement__InitAssignment_0_1() throws RecognitionException;
+     void rule__ForStatement__ConditionAssignment_0_3() throws RecognitionException;
+     void rule__ForStatement__IterateAssignment_0_5() throws RecognitionException;
+     void rule__ForStatement__BodyBlockAssignment_0_6() throws RecognitionException;
+     void rule__ForStatement__InitAssignment_1_2() throws RecognitionException;
+     void rule__ForStatement__ConditionAssignment_1_4() throws RecognitionException;
+     void rule__ForStatement__IterateAssignment_1_6() throws RecognitionException;
+     void rule__ForStatement__BodyBlockAssignment_1_8() throws RecognitionException;
+     void rule__ForEachStatement__IteratorAssignment_0_1() throws RecognitionException;
+     void rule__ForEachStatement__EnumerationAssignment_0_3() throws RecognitionException;
+     void rule__ForEachStatement__BodyBlockAssignment_0_4() throws RecognitionException;
+     void rule__ForEachStatement__IteratorAssignment_1_2() throws RecognitionException;
+     void rule__ForEachStatement__EnumerationAssignment_1_4() throws RecognitionException;
+     void rule__ForEachStatement__BodyBlockAssignment_1_6() throws RecognitionException;
+     void rule__InterruptStatement__KindAssignment_0() throws RecognitionException;
+     void rule__InterruptStatement__ExprAssignment_1_0() throws RecognitionException;
+     void rule__InterruptStatement__ExprAssignment_1_1_1() throws RecognitionException;
+     void rule__InterruptStatement__ExprAssignment_1_1_2_1() throws RecognitionException;
+     void rule__ActivityStatement__OpAssignment_1() throws RecognitionException;
+     void rule__ActivityStatement__MachineAssignment_2() throws RecognitionException;
+     void rule__ActivityStatement__TupleAssignment_3() throws RecognitionException;
+     void rule__InvokeStatement__ExpressionAssignment_0_0() throws RecognitionException;
+     void rule__InvokeStatement__InvokableAssignment_1_0() throws RecognitionException;
+     void rule__InvokeStatement__ExecRoutineAssignment_1_1() throws RecognitionException;
+     void rule__InvokeStatement__ArgsAssignment_1_2() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_1_4_1_0_0() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_1_4_1_1_1() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1() throws RecognitionException;
+     void rule__InvokeStatement__ExecRoutineAssignment_2_0() throws RecognitionException;
+     void rule__InvokeStatement__InvokableAssignment_2_1() throws RecognitionException;
+     void rule__InvokeStatement__ArgsAssignment_2_3() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_2_5_1_0_0() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_2_5_1_1_1() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1() throws RecognitionException;
+     void rule__InvokeStatement__CallProcedureAssignment_3_0() throws RecognitionException;
+     void rule__InvokeStatement__InvokableAssignment_3_1() throws RecognitionException;
+     void rule__InvokeStatement__ArgsAssignment_3_2() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_3_3_1_0_0() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_3_3_1_1_1() throws RecognitionException;
+     void rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1() throws RecognitionException;
+     void rule__AssignmentExpression__LeftHandSideAssignment_0() throws RecognitionException;
+     void rule__AssignmentExpression__OperatorAssignment_1() throws RecognitionException;
+     void rule__AssignmentExpression__RigthHandSideAssignment_2() throws RecognitionException;
+     void rule__LeftHandSideExpression__LvalueAssignment_1_0() throws RecognitionException;
+     void rule__LeftHandSideExpression__LvalueAssignment_1_1_1() throws RecognitionException;
+     void rule__ConditionalTestExpression__OperatorAssignment_1_1() throws RecognitionException;
+     void rule__ConditionalTestExpression__ThenOperandAssignment_1_2() throws RecognitionException;
+     void rule__ConditionalTestExpression__ElseOperandAssignment_1_4() throws RecognitionException;
+     void rule__LogicalOrExpression__OperatorAssignment_1_1() throws RecognitionException;
+     void rule__LogicalOrExpression__OperandAssignment_1_2() throws RecognitionException;
+     void rule__LogicalOrExpression__OperandAssignment_1_3_1() throws RecognitionException;
+     void rule__LogicalAndExpression__OperatorAssignment_1_1() throws RecognitionException;
+     void rule__LogicalAndExpression__OperandAssignment_1_2() throws RecognitionException;
+     void rule__LogicalAndExpression__OperandAssignment_1_3_1() throws RecognitionException;
+     void rule__BitwiseOrExpression__OperatorAssignment_1_1() throws RecognitionException;
+     void rule__BitwiseOrExpression__OperandAssignment_1_2() throws RecognitionException;
+     void rule__BitwiseOrExpression__OperandAssignment_1_3_1() throws RecognitionException;
+     void rule__BitwiseXorExpression__OperatorAssignment_1_1() throws RecognitionException;
+     void rule__BitwiseXorExpression__OperandAssignment_1_2() throws RecognitionException;
+     void rule__BitwiseXorExpression__OperandAssignment_1_3_1() throws RecognitionException;
+     void rule__BitwiseAndExpression__OperatorAssignment_1_1() throws RecognitionException;
+     void rule__BitwiseAndExpression__OperandAssignment_1_2() throws RecognitionException;
+     void rule__BitwiseAndExpression__OperandAssignment_1_3_1() throws RecognitionException;
+     void rule__EqualityExpression__OperatorAssignment_1_1() throws RecognitionException;
+     void rule__EqualityExpression__RigthOperandAssignment_1_2() throws RecognitionException;
+     void rule__RelationalExpression__OperatorAssignment_1_1() throws RecognitionException;
+     void rule__RelationalExpression__RigthOperandAssignment_1_2() throws RecognitionException;
+     void rule__RelationalExpression__RigthOperatorAssignment_1_3_1() throws RecognitionException;
+     void rule__RelationalExpression__RigthOperandAssignment_1_3_2() throws RecognitionException;
+     void rule__AdditiveExpression__OperatorAssignment_1_0_1() throws RecognitionException;
+     void rule__AdditiveExpression__OperandAssignment_1_0_2() throws RecognitionException;
+     void rule__AdditiveExpression__OperandAssignment_1_0_3_1() throws RecognitionException;
+     void rule__AdditiveExpression__OperatorAssignment_1_1_1() throws RecognitionException;
+     void rule__AdditiveExpression__OperandAssignment_1_1_2() throws RecognitionException;
+     void rule__AdditiveExpression__OperandAssignment_1_1_3_1() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperatorAssignment_1_0_1() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperandAssignment_1_0_2() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperandAssignment_1_0_3_1() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperatorAssignment_1_1_1() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperandAssignment_1_1_2() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperandAssignment_1_1_3_1() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperatorAssignment_1_2_1() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperandAssignment_1_2_2() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperandAssignment_1_2_3_1() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperatorAssignment_1_3_1() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperandAssignment_1_3_2() throws RecognitionException;
+     void rule__MultiplicativeExpression__OperandAssignment_1_3_3_1() throws RecognitionException;
+     void rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0() throws RecognitionException;
+     void rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1() throws RecognitionException;
+     void rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0() throws RecognitionException;
+     void rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1() throws RecognitionException;
+     void rule__NewfreshExpression__LeftHandSideAssignment_0_1() throws RecognitionException;
+     void rule__NewfreshExpression__LeftHandSideAssignment_1_1() throws RecognitionException;
+     void rule__CastExpression__DatatypeAssignment_2() throws RecognitionException;
+     void rule__CastExpression__OperandAssignment_5() throws RecognitionException;
+     void rule__ArithmeticUnaryExpression__OperatorAssignment_0() throws RecognitionException;
+     void rule__ArithmeticUnaryExpression__OperandAssignment_1() throws RecognitionException;
+     void rule__LogicalUnaryExpression__OperatorAssignment_0() throws RecognitionException;
+     void rule__LogicalUnaryExpression__OperandAssignment_1() throws RecognitionException;
+     void rule__BitwiseUnaryExpression__OperatorAssignment_0() throws RecognitionException;
+     void rule__BitwiseUnaryExpression__OperandAssignment_1() throws RecognitionException;
+     void rule__PrimaryExpression__ElementAssignment_1_2() throws RecognitionException;
+     void rule__PrimaryExpression__KindAssignment_1_3_0_0() throws RecognitionException;
+     void rule__PrimaryExpression__ArgAssignment_1_3_0_1() throws RecognitionException;
+     void rule__PrimaryExpression__KindAssignment_1_3_1_0() throws RecognitionException;
+     void rule__PrimaryExpression__ArgAssignment_1_3_1_1() throws RecognitionException;
+     void rule__PrimaryExpression__ElementAssignment_2_2() throws RecognitionException;
+     void rule__PrimaryExpression__KindAssignment_2_3_0_0() throws RecognitionException;
+     void rule__PrimaryExpression__ArgAssignment_2_3_0_1() throws RecognitionException;
+     void rule__PrimaryExpression__KindAssignment_2_3_1_0() throws RecognitionException;
+     void rule__PrimaryExpression__ArgAssignment_2_3_1_1() throws RecognitionException;
+     void rule__PrimaryExpression__ElementAssignment_2_4_2() throws RecognitionException;
+     void rule__PrimaryExpression__KindAssignment_2_4_3_0_0() throws RecognitionException;
+     void rule__PrimaryExpression__ArgAssignment_2_4_3_0_1() throws RecognitionException;
+     void rule__PrimaryExpression__KindAssignment_2_4_3_1_0() throws RecognitionException;
+     void rule__PrimaryExpression__ArgAssignment_2_4_3_1_1() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__ArgsAssignment_2() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__InvokeAssignment_3() throws RecognitionException;
+     void rule__InvokeExpressionDeprecated__ArgsAssignment_4() throws RecognitionException;
+     void rule__InstantiationExpression__InstanceAssignment_1() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__ModelAssignment_2() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1() throws RecognitionException;
+     void rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0() throws RecognitionException;
+     void rule__MixTupleExpressionList__ValueAssignment_1() throws RecognitionException;
+     void rule__MixTupleExpressionList__ValueAssignment_2_1() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__ValueAssignment_0() throws RecognitionException;
+     void rule__PositionalTupleExpressionList__ValueAssignment_1_1() throws RecognitionException;
+     void rule__NamedExpression__NameAssignment_0() throws RecognitionException;
+     void rule__NamedExpression__ExpressionAssignment_2() throws RecognitionException;
+     void rule__LiteralBooleanExpression__ValueAssignment_1() throws RecognitionException;
+     void rule__LiteralIntegerExpression__ValueAssignment_1() throws RecognitionException;
+     void rule__LiteralRationalExpression__NumeratorAssignment_1() throws RecognitionException;
+     void rule__LiteralRationalExpression__DenominatorAssignment_3() throws RecognitionException;
+     void rule__LiteralFloatExpression__ValueAssignment_1() throws RecognitionException;
+     void rule__LiteralCharacterExpression__ValueAssignment_1() throws RecognitionException;
+     void rule__LiteralStringExpression__ValueAssignment_1() throws RecognitionException;
+     void rule__LiteralNullExpression__TypeAssignment_1_2() throws RecognitionException;
+     void rule__LiteralCollectionExpression__DatatypeAssignment_1_1() throws RecognitionException;
+     void rule__LiteralCollectionExpression__ValueAssignment_3_0_0() throws RecognitionException;
+     void rule__LiteralCollectionExpression__ValueAssignment_3_0_1() throws RecognitionException;
+     void rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0() throws RecognitionException;
+     void rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1() throws RecognitionException;
+     void rule__LiteralReferenceElement__ValueAssignment_1() throws RecognitionException;
+     void rule__LiteralReferenceElement__KindAssignment_2_0_0() throws RecognitionException;
+     void rule__LiteralReferenceElement__ArgAssignment_2_0_1() throws RecognitionException;
+     void rule__LiteralReferenceElement__KindAssignment_2_1_0() throws RecognitionException;
+     void rule__LiteralReferenceElement__ArgAssignment_2_1_1() throws RecognitionException;
+     void rule__LiteralPureReferenceElement__ValueAssignment_1() throws RecognitionException;
+     void rule__ValueSelectionExpression__ElementAssignment_1_2() throws RecognitionException;
+     void rule__ValueSelectionExpression__KindAssignment_1_3_0() throws RecognitionException;
+     void rule__ValueSelectionExpression__ArgAssignment_1_3_1() throws RecognitionException;
+     void rule__ValueSelectionExpression__ElementAssignment_2_2() throws RecognitionException;
+     void rule__ValueSelectionExpression__KindAssignment_2_3_0() throws RecognitionException;
+     void rule__ValueSelectionExpression__ArgAssignment_2_3_1() throws RecognitionException;
+     void rule__ValueSelectionExpression__ElementAssignment_2_4_2() throws RecognitionException;
+     void rule__ValueSelectionExpression__KindAssignment_2_4_3_0() throws RecognitionException;
+     void rule__ValueSelectionExpression__ArgAssignment_2_4_3_1() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__KindAssignment_1_1() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__ElementAssignment_1_2() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__KindAssignment_2_1() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__ElementAssignment_2_2() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1() throws RecognitionException;
+     void rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2() throws RecognitionException;
+     void synpred372_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred373_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred378_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred379_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred383_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred393_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred394_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred412_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred418_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred419_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred421_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred422_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred429_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred465_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred466_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred469_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred472_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred490_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred492_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred502_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred632_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred636_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred715_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred808_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred809_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred812_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred813_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred816_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred817_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred838_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred840_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred842_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred892_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred899_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred953_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred954_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred955_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred956_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred957_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred959_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred960_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred961_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred962_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred965_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred966_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred968_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred979_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred989_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred990_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred991_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred992_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred993_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred994_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred995_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred996_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred997_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred998_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred999_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1000_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1001_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1002_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1003_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1004_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1005_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1006_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1007_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1008_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1009_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1010_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1011_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1012_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1013_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1014_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1015_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1016_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1017_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1018_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1019_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1020_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1021_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1022_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1023_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1024_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1025_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1026_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1027_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1028_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1029_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1030_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1031_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1032_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1033_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1034_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1035_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1036_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1037_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1038_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1039_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1040_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1041_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1042_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1043_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1044_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1045_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1046_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1047_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1048_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1049_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1050_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1051_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1052_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1053_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1054_InternalFormalML_fragment() throws RecognitionException;   
+     void synpred1055_InternalFormalML_fragment() throws RecognitionException;   
+}
+
+@SuppressWarnings("all")
+abstract class InternalFormalMLParser1 extends AbstractInternalContentAssistParser implements InternalFormalMLParserSignatures {
+
+        InternalFormalMLParser1(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+
+        InternalFormalMLParser1(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+        }
+
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_CHARACTER", "RULE_STRING", "RULE_XLIA_ID", "RULE_INT", "RULE_ID", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'initial'", "'multi_rdv'", "'buffer'", "'var'", "'port'", "'signal'", "'channel'", "'.'", "'->'", "'['", "'('", "'@FormalML'", "'@xlia'", "'@xfsp'", "'system'", "'package'", "'true'", "'false'", "':'", "'::'", "'and'", "'or'", "'@routine:'", "'@macro:'", "'@composite:'", "'@machine:'", "'machine'", "'statemachine'", "'@region:'", "'@statemachine:'", "'@region<'", "'@statemachine<'", "';'", "'@init'", "'@final'", "'@enable'", "'@disable'", "'@concurrency'", "'@schedule'", "'@irun'", "'@run'", "'state'", "'pseudostate'", "'#initial'", "'#init'", "'*'", "'integer'", "'uinteger'", "'int'", "'uint'", "'rational'", "'urational'", "'rat'", "'urat'", "'float'", "'ufloat'", "'double'", "'udouble'", "'real'", "'ureal'", "'boolean'", "'bool'", "']'", "'@guard:'", "'@tguard:'", "'&&'", "'||'", "'|;|'", "'|\\u00A7|'", "'|;;|'", "'|.|'", "'|/;|'", "'|i|'", "'|,|'", "'|a|'", "'|and|'", "'|or|'", "'|and#then|'", "'|or#else|'", "'|indet|'", "'|/\\\\|'", "'|fork|'", "'|join|'", "'<=='", "'via'", "'==>'", "'elseif'", "'='", "':='", "'::='", "'+='", "'-='", "'*='", "'/='", "'%='", "'&&='", "'||='", "'&='", "'|='", "'^='", "'<<='", "'>>='", "'>>>='", "'<=<'", "'^=<'", "'^=>'", "'>=>'", "'=='", "'!='", "'==='", "'=!='", "'=/='", "'<'", "'>'", "'<='", "'>='", "'++'", "'--'", "'+'", "'-'", "'!'", "'not'", "'=>'", "'<-'", "'null'", "'$null'", "'null<'", "'$null<'", "'$env'", "'env'", "'public'", "'private'", "'protected'", "'model'", "'prototype'", "'junction'", "'choice'", "'entryPoint'", "'exitPoint'", "'fork'", "'join'", "'dhistory'", "'shistory'", "'terminal'", "'return'", "'rdv'", "'unicast'", "'anycast'", "'multicast'", "'broadcast'", "'message'", "'vertex'", "'vector'", "'rvector'", "'list'", "'set'", "'bag'", "'fifo'", "'lifo'", "'in'", "'inout'", "'out'", "'input'", "'output'", "'simple'", "'abort'", "'final'", "'break'", "'continue'", "'exit'", "'init'", "'destroy'", "'start'", "'stop'", "'restart'", "'suspend'", "'resume'", "'wait'", "'disable'", "'enable'", "'schedule'", "'irun'", "'run'", "'rtc'", "'>:'", "','", "'{'", "'}'", "'moc:'", "'@property:'", "'@public:'", "'@protected:'", "'@private:'", "'@procedure:'", "'@model:'", "'@prototype:'", "'@instance:'", "'@behavior:'", "'instance'", "'model:'", "')'", "'procedure'", "'-->'", "'@parameter:'", "'@input:'", "'@inout:'", "'@output:'", "'@return:'", "'@moe:'", "'@local:'", "'@transition:'", "'macro'", "'routine'", "'@com:'", "'route'", "'connect'", "'type'", "'size:'", "'time'", "'char'", "'string'", "'interval'", "'enum'", "'struct'", "'union'", "'@on_write'", "'transition'", "'@effect:'", "'@trigger:'", "'&'", "'prior:'", "'@guard<'", "'@tguard<'", "'guard'", "'tguard'", "'event'", "'checksat'", "'<--'", "'if'", "'else'", "'while'", "'do'", "'for'", "'|'", "'^'", "'**'", "'/'", "'%'", "'newfresh'", "'(:'", "'ctor'", "'new'", "'$time'", "'$delta'", "'$this'", "'$self'", "'$parent'", "'$super'", "'$system'", "'@option'", "'timed'", "'input_enabled'", "'#start'", "'#final'", "'clock'", "'static'", "'reference'", "'volatile'", "'transient'", "'val'", "'const'", "'exec'", "'call'", "'?'", "'~'"
+    };
+    public static final int T__144=144;
+    public static final int T__265=265;
+    public static final int T__143=143;
+    public static final int T__264=264;
+    public static final int T__146=146;
+    public static final int T__267=267;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__266=266;
+    public static final int T__140=140;
+    public static final int T__261=261;
+    public static final int T__260=260;
+    public static final int T__142=142;
+    public static final int T__263=263;
+    public static final int T__141=141;
+    public static final int T__262=262;
+    public static final int RULE_CHARACTER=4;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__258=258;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__257=257;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__259=259;
+    public static final int T__133=133;
+    public static final int T__254=254;
+    public static final int T__132=132;
+    public static final int T__253=253;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__256=256;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int T__255=255;
+    public static final int T__250=250;
+    public static final int RULE_ID=8;
+    public static final int T__131=131;
+    public static final int T__252=252;
+    public static final int T__130=130;
+    public static final int T__251=251;
+    public static final int RULE_INT=7;
+    public static final int T__66=66;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__247=247;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__246=246;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__249=249;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__248=248;
+    public static final int T__166=166;
+    public static final int T__287=287;
+    public static final int T__165=165;
+    public static final int T__286=286;
+    public static final int T__168=168;
+    public static final int T__167=167;
+    public static final int T__162=162;
+    public static final int T__283=283;
+    public static final int T__161=161;
+    public static final int T__282=282;
+    public static final int T__164=164;
+    public static final int T__285=285;
+    public static final int T__163=163;
+    public static final int T__284=284;
+    public static final int T__160=160;
+    public static final int T__281=281;
+    public static final int T__280=280;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__159=159;
+    public static final int T__30=30;
+    public static final int T__158=158;
+    public static final int T__279=279;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__276=276;
+    public static final int T__154=154;
+    public static final int T__275=275;
+    public static final int T__157=157;
+    public static final int T__278=278;
+    public static final int T__156=156;
+    public static final int T__277=277;
+    public static final int T__151=151;
+    public static final int T__272=272;
+    public static final int T__150=150;
+    public static final int T__271=271;
+    public static final int T__153=153;
+    public static final int T__274=274;
+    public static final int T__152=152;
+    public static final int T__273=273;
+    public static final int T__270=270;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int RULE_XLIA_ID=6;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__269=269;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__268=268;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__100=100;
+    public static final int T__221=221;
+    public static final int T__220=220;
+    public static final int T__102=102;
+    public static final int T__223=223;
+    public static final int T__101=101;
+    public static final int T__222=222;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__218=218;
+    public static final int T__217=217;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__219=219;
+    public static final int T__214=214;
+    public static final int T__213=213;
+    public static final int T__216=216;
+    public static final int T__215=215;
+    public static final int T__210=210;
+    public static final int T__212=212;
+    public static final int T__211=211;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__207=207;
+    public static final int T__23=23;
+    public static final int T__206=206;
+    public static final int T__24=24;
+    public static final int T__209=209;
+    public static final int T__25=25;
+    public static final int T__208=208;
+    public static final int T__203=203;
+    public static final int T__202=202;
+    public static final int T__20=20;
+    public static final int T__205=205;
+    public static final int T__21=21;
+    public static final int T__204=204;
+    public static final int T__122=122;
+    public static final int T__243=243;
+    public static final int T__121=121;
+    public static final int T__242=242;
+    public static final int T__124=124;
+    public static final int T__245=245;
+    public static final int T__123=123;
+    public static final int T__244=244;
+    public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__119=119;
+    public static final int T__118=118;
+    public static final int T__239=239;
+    public static final int T__115=115;
+    public static final int T__236=236;
+    public static final int EOF=-1;
+    public static final int T__114=114;
+    public static final int T__235=235;
+    public static final int T__117=117;
+    public static final int T__238=238;
+    public static final int T__116=116;
+    public static final int T__237=237;
+    public static final int T__111=111;
+    public static final int T__232=232;
+    public static final int T__110=110;
+    public static final int T__231=231;
+    public static final int T__113=113;
+    public static final int T__234=234;
+    public static final int T__112=112;
+    public static final int T__233=233;
+    public static final int T__230=230;
+    public static final int T__108=108;
+    public static final int T__229=229;
+    public static final int T__107=107;
+    public static final int T__228=228;
+    public static final int T__109=109;
+    public static final int T__104=104;
+    public static final int T__225=225;
+    public static final int T__103=103;
+    public static final int T__224=224;
+    public static final int T__106=106;
+    public static final int T__227=227;
+    public static final int T__105=105;
+    public static final int T__226=226;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__201=201;
+    public static final int T__200=200;
+    public static final int T__91=91;
+    public static final int T__188=188;
+    public static final int T__92=92;
+    public static final int T__187=187;
+    public static final int T__93=93;
+    public static final int T__94=94;
+    public static final int T__189=189;
+    public static final int T__184=184;
+    public static final int T__183=183;
+    public static final int T__186=186;
+    public static final int T__90=90;
+    public static final int T__185=185;
+    public static final int T__180=180;
+    public static final int T__182=182;
+    public static final int T__181=181;
+    public static final int T__99=99;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
+    public static final int T__169=169;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=5;
+    public static final int T__77=77;
+    public static final int T__78=78;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__74=74;
+    public static final int T__75=75;
+    public static final int T__76=76;
+    public static final int T__80=80;
+    public static final int T__199=199;
+    public static final int T__81=81;
+    public static final int T__198=198;
+    public static final int T__82=82;
+    public static final int T__83=83;
+    public static final int T__195=195;
+    public static final int T__194=194;
+    public static final int RULE_WS=11;
+    public static final int T__197=197;
+    public static final int T__196=196;
+    public static final int T__191=191;
+    public static final int T__190=190;
+    public static final int T__193=193;
+    public static final int T__192=192;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__89=89;
+    public static final int T__84=84;
+    public static final int T__85=85;
+    public static final int T__86=86;
+    public static final int T__87=87;
+
+
+    public String[] getTokenNames() { return InternalFormalMLParser.tokenNames; }
+    public String getGrammarFileName() { return "InternalFormalML.g"; }
+
+
+    	protected FormalMLGrammarAccess grammarAccess;
+
+    	public void setGrammarAccess(FormalMLGrammarAccess grammarAccess) {
+    		this.grammarAccess = grammarAccess;
+    	}
+
+    	@Override
+    	protected Grammar getGrammar() {
+    		return grammarAccess.getGrammar();
+    	}
+
+    	@Override
+    	protected String getValueForTokenName(String tokenName) {
+    		return tokenName;
+    	}
+
+
+
+
+    // Delegated rules
+
+    public final boolean synpred1019_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1019_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred961_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred961_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred421_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred421_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1035_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1035_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred472_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred472_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1043_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1043_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred953_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred953_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred996_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred996_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1000_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1000_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1037_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1037_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1051_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1051_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred393_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred393_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred466_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred466_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred379_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred379_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred632_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred632_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred502_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred502_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1029_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1029_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred838_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred838_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1020_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1020_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred492_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred492_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1033_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1033_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1047_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1047_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred992_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred992_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred892_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred892_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1039_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1039_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred998_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred998_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1041_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1041_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1002_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1002_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred490_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred490_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1010_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1010_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred817_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred817_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred809_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred809_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1023_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1023_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred418_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred418_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred957_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred957_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred990_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred990_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1049_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1049_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1015_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1015_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1013_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1013_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred715_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred715_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1021_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1021_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1007_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1007_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1016_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1016_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1012_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1012_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1055_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1055_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1038_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1038_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred842_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred842_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1004_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1004_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1024_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1024_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred429_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred429_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred968_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred968_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1032_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1032_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred999_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred999_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred465_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred465_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred373_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred373_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred965_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred965_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred899_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred899_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1027_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1027_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1040_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1040_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1001_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1001_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred394_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred394_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1052_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1052_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1044_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1044_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1036_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1036_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred422_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred422_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred960_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred960_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred378_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred378_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred979_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred979_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred840_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred840_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1028_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1028_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred962_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred962_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1034_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1034_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred997_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred997_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1042_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1042_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1003_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1003_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred993_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred993_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred954_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred954_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1046_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1046_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1008_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1008_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1054_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1054_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred959_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred959_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred812_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred812_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1026_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1026_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred956_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred956_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred412_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred412_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1018_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1018_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1005_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1005_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred469_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred469_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred995_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred995_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1031_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1031_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1006_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1006_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred966_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred966_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1022_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1022_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1030_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1030_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred372_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred372_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred636_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred636_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred419_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred419_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1025_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1025_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred383_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred383_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred808_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred808_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1050_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1050_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred989_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred989_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred816_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred816_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1009_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1009_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1017_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1017_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred955_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred955_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1011_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1011_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred994_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred994_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred813_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred813_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1045_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1045_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1048_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1048_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred991_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred991_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1053_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1053_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1014_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1014_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+
+
+    protected DFA10 dfa10 = new DFA10(this);
+    protected DFA12 dfa12 = new DFA12(this);
+    protected DFA13 dfa13 = new DFA13(this);
+    protected DFA14 dfa14 = new DFA14(this);
+    protected DFA15 dfa15 = new DFA15(this);
+    protected DFA26 dfa26 = new DFA26(this);
+    protected DFA31 dfa31 = new DFA31(this);
+    protected DFA33 dfa33 = new DFA33(this);
+    protected DFA34 dfa34 = new DFA34(this);
+    protected DFA35 dfa35 = new DFA35(this);
+    protected DFA36 dfa36 = new DFA36(this);
+    protected DFA56 dfa56 = new DFA56(this);
+    protected DFA63 dfa63 = new DFA63(this);
+    protected DFA64 dfa64 = new DFA64(this);
+    protected DFA65 dfa65 = new DFA65(this);
+    protected DFA66 dfa66 = new DFA66(this);
+    protected DFA75 dfa75 = new DFA75(this);
+    protected DFA85 dfa85 = new DFA85(this);
+    protected DFA92 dfa92 = new DFA92(this);
+    protected DFA93 dfa93 = new DFA93(this);
+    protected DFA94 dfa94 = new DFA94(this);
+    protected DFA95 dfa95 = new DFA95(this);
+    protected DFA157 dfa157 = new DFA157(this);
+    protected DFA166 dfa166 = new DFA166(this);
+    protected DFA218 dfa218 = new DFA218(this);
+    protected DFA219 dfa219 = new DFA219(this);
+    protected DFA220 dfa220 = new DFA220(this);
+    protected DFA222 dfa222 = new DFA222(this);
+    protected DFA227 dfa227 = new DFA227(this);
+    protected DFA229 dfa229 = new DFA229(this);
+    protected DFA234 dfa234 = new DFA234(this);
+    protected DFA245 dfa245 = new DFA245(this);
+    protected DFA259 dfa259 = new DFA259(this);
+    protected DFA428 dfa428 = new DFA428(this);
+    protected DFA666 dfa666 = new DFA666(this);
+    protected DFA667 dfa667 = new DFA667(this);
+    protected DFA668 dfa668 = new DFA668(this);
+    protected DFA669 dfa669 = new DFA669(this);
+    protected DFA670 dfa670 = new DFA670(this);
+    protected DFA672 dfa672 = new DFA672(this);
+    protected DFA673 dfa673 = new DFA673(this);
+    protected DFA674 dfa674 = new DFA674(this);
+    protected DFA675 dfa675 = new DFA675(this);
+    protected DFA678 dfa678 = new DFA678(this);
+    protected DFA679 dfa679 = new DFA679(this);
+    protected DFA681 dfa681 = new DFA681(this);
+    protected DFA692 dfa692 = new DFA692(this);
+    protected DFA705 dfa705 = new DFA705(this);
+    protected DFA707 dfa707 = new DFA707(this);
+    protected DFA708 dfa708 = new DFA708(this);
+    protected DFA715 dfa715 = new DFA715(this);
+    protected DFA717 dfa717 = new DFA717(this);
+    protected DFA718 dfa718 = new DFA718(this);
+    protected DFA722 dfa722 = new DFA722(this);
+    protected DFA724 dfa724 = new DFA724(this);
+    protected DFA725 dfa725 = new DFA725(this);
+    protected DFA726 dfa726 = new DFA726(this);
+    protected DFA727 dfa727 = new DFA727(this);
+    protected DFA728 dfa728 = new DFA728(this);
+    protected DFA729 dfa729 = new DFA729(this);
+    protected DFA730 dfa730 = new DFA730(this);
+    protected DFA737 dfa737 = new DFA737(this);
+    protected DFA739 dfa739 = new DFA739(this);
+    protected DFA749 dfa749 = new DFA749(this);
+    protected DFA751 dfa751 = new DFA751(this);
+    static final String dfa_1s = "\126\uffff";
+    static final String dfa_2s = "\5\17\2\uffff\1\17\1\6\3\17\4\uffff\1\6\11\17\1\6\3\17\1\6\1\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\3\17";
+    static final String dfa_3s = "\5\u011b\2\uffff\5\u011b\4\uffff\16\u011b\1\u00ab\67\u011b";
+    static final String dfa_4s = "\5\uffff\1\1\1\2\5\uffff\1\3\1\4\1\5\1\6\106\uffff";
+    static final String dfa_5s = "\126\uffff}>";
+    static final String[] dfa_6s = {
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\10\54\uffff\1\17\4\uffff\1\16\60\uffff\1\7\1\11\1\12\1\13\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "",
+            "",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\32\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "",
+            "",
+            "",
+            "",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\40\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\45\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\17\uffff\1\17\146\uffff\1\17\52\uffff\4\14",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\52\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\57\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\64\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\71\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\103\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\17\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\4\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\110\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\115\54\uffff\1\17\65\uffff\1\114\1\116\1\117\1\120\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\115\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\114\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\115\54\uffff\1\17\65\uffff\1\114\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\115\54\uffff\1\17\65\uffff\1\114\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\115\54\uffff\1\17\65\uffff\1\114\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\122\54\uffff\1\17\65\uffff\1\121\1\123\1\124\1\125\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\122\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\121\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\122\54\uffff\1\17\65\uffff\1\121\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\122\54\uffff\1\17\65\uffff\1\121\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\122\54\uffff\1\17\65\uffff\1\121\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17"
+    };
+
+    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
+    static final char[] dfa_2 = DFA.unpackEncodedStringToUnsignedChars(dfa_2s);
+    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
+    static final short[] dfa_4 = DFA.unpackEncodedString(dfa_4s);
+    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
+    static final short[][] dfa_6 = unpackEncodedStringArray(dfa_6s);
+
+    class DFA10 extends DFA {
+
+        public DFA10(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 10;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "6462:1: rule__System__Alternatives_6 : ( ( ( rule__System__PortAssignment_6_0 ) ) | ( ( rule__System__SignalAssignment_6_1 ) ) | ( ( rule__System__BufferAssignment_6_2 ) ) | ( ( rule__System__ChannelAssignment_6_3 ) ) | ( ( rule__System__TypedefAssignment_6_4 ) ) | ( ( rule__System__PropertyAssignment_6_5 ) ) );";
+        }
+    }
+    static final String dfa_7s = "\5\17\2\uffff\1\17\1\6\3\17\4\uffff\1\6\11\17\1\6\3\17\1\6\1\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\3\17\1\6\4\17\1\6\4\17";
+    static final String[] dfa_8s = {
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\10\54\uffff\1\17\4\uffff\1\16\60\uffff\1\7\1\11\1\12\1\13\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "",
+            "",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\32\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "",
+            "",
+            "",
+            "",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\40\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\45\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\17\uffff\1\17\146\uffff\1\17\52\uffff\4\14",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\52\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\57\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\64\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\71\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\103\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\17\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\4\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\110\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\114\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\121\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17"
+    };
+    static final char[] dfa_7 = DFA.unpackEncodedStringToUnsignedChars(dfa_7s);
+    static final short[][] dfa_8 = unpackEncodedStringArray(dfa_8s);
+
+    class DFA12 extends DFA {
+
+        public DFA12(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 12;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_7;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_8;
+        }
+        public String getDescription() {
+            return "6540:1: rule__System__Alternatives_7_0_1 : ( ( ( rule__System__PortAssignment_7_0_1_0 ) ) | ( ( rule__System__SignalAssignment_7_0_1_1 ) ) | ( ( rule__System__BufferAssignment_7_0_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_0_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_0_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_0_1_5 ) ) );";
+        }
+    }
+    static final String dfa_9s = "\44\uffff";
+    static final String dfa_10s = "\1\17\2\uffff\5\17\4\uffff\30\17";
+    static final String dfa_11s = "\1\u011b\2\uffff\5\u011b\4\uffff\30\u011b";
+    static final String dfa_12s = "\1\uffff\1\1\1\2\5\uffff\1\3\1\4\1\5\1\6\30\uffff";
+    static final String dfa_13s = "\44\uffff}>";
+    static final String[] dfa_14s = {
+            "\1\10\1\13\1\1\1\2\1\11\10\uffff\1\12\162\uffff\3\12\41\uffff\1\4\54\uffff\1\13\4\uffff\1\12\60\uffff\1\3\1\5\1\6\1\7\1\uffff\1\13",
+            "",
+            "",
+            "\1\10\1\13\u00a2\uffff\1\15\54\uffff\1\13\65\uffff\1\14\1\16\1\17\1\20\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\21\54\uffff\1\13\65\uffff\1\14\1\16\1\17\1\20\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\15\54\uffff\1\13\65\uffff\1\14\1\16\1\17\1\20\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\15\54\uffff\1\13\65\uffff\1\14\1\16\1\17\1\20\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\15\54\uffff\1\13\65\uffff\1\14\1\16\1\17\1\20\1\uffff\1\13",
+            "",
+            "",
+            "",
+            "",
+            "\1\10\1\13\u00a2\uffff\1\23\54\uffff\1\13\65\uffff\1\22\1\24\1\25\1\26\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\27\54\uffff\1\13\65\uffff\1\22\1\24\1\25\1\26\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\23\54\uffff\1\13\65\uffff\1\22\1\24\1\25\1\26\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\23\54\uffff\1\13\65\uffff\1\22\1\24\1\25\1\26\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\23\54\uffff\1\13\65\uffff\1\22\1\24\1\25\1\26\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\27\54\uffff\1\13\65\uffff\1\22\1\24\1\25\1\26\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\31\54\uffff\1\13\65\uffff\1\30\1\32\1\33\1\34\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\35\54\uffff\1\13\65\uffff\1\30\1\32\1\33\1\34\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\31\54\uffff\1\13\65\uffff\1\30\1\32\1\33\1\34\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\31\54\uffff\1\13\65\uffff\1\30\1\32\1\33\1\34\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\31\54\uffff\1\13\65\uffff\1\30\1\32\1\33\1\34\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\35\54\uffff\1\13\65\uffff\1\30\1\32\1\33\1\34\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\37\54\uffff\1\13\65\uffff\1\36\1\40\1\41\1\42\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\43\54\uffff\1\13\65\uffff\1\36\1\40\1\41\1\42\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\37\54\uffff\1\13\65\uffff\1\36\1\40\1\41\1\42\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\37\54\uffff\1\13\65\uffff\1\36\1\40\1\41\1\42\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\37\54\uffff\1\13\65\uffff\1\36\1\40\1\41\1\42\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\43\54\uffff\1\13\65\uffff\1\36\1\40\1\41\1\42\1\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\13\54\uffff\1\13\72\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\13\54\uffff\1\13\72\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\13\54\uffff\1\13\72\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\13\54\uffff\1\13\72\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\13\54\uffff\1\13\72\uffff\1\13",
+            "\1\10\1\13\u00a2\uffff\1\13\54\uffff\1\13\72\uffff\1\13"
+    };
+
+    static final short[] dfa_9 = DFA.unpackEncodedString(dfa_9s);
+    static final char[] dfa_10 = DFA.unpackEncodedStringToUnsignedChars(dfa_10s);
+    static final char[] dfa_11 = DFA.unpackEncodedStringToUnsignedChars(dfa_11s);
+    static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
+    static final short[] dfa_13 = DFA.unpackEncodedString(dfa_13s);
+    static final short[][] dfa_14 = unpackEncodedStringArray(dfa_14s);
+
+    class DFA13 extends DFA {
+
+        public DFA13(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 13;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "6585:1: rule__System__Alternatives_7_1_1 : ( ( ( rule__System__PortAssignment_7_1_1_0 ) ) | ( ( rule__System__SignalAssignment_7_1_1_1 ) ) | ( ( rule__System__BufferAssignment_7_1_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_1_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_1_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_1_1_5 ) ) );";
+        }
+    }
+
+    class DFA14 extends DFA {
+
+        public DFA14(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 14;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "6630:1: rule__System__Alternatives_7_2_1 : ( ( ( rule__System__PortAssignment_7_2_1_0 ) ) | ( ( rule__System__SignalAssignment_7_2_1_1 ) ) | ( ( rule__System__BufferAssignment_7_2_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_2_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_2_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_2_1_5 ) ) );";
+        }
+    }
+
+    class DFA15 extends DFA {
+
+        public DFA15(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 15;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "6675:1: rule__System__Alternatives_7_3_1 : ( ( ( rule__System__PortAssignment_7_3_1_0 ) ) | ( ( rule__System__SignalAssignment_7_3_1_1 ) ) | ( ( rule__System__BufferAssignment_7_3_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_3_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_3_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_3_1_5 ) ) );";
+        }
+    }
+    static final String dfa_15s = "\33\uffff";
+    static final String dfa_16s = "\11\34\2\uffff\10\34\10\47";
+    static final String dfa_17s = "\11\u0112\2\uffff\10\u0112\10\50";
+    static final String dfa_18s = "\11\uffff\1\1\1\2\20\uffff";
+    static final String dfa_19s = "\33\uffff}>";
+    static final String[] dfa_20s = {
+            "\1\4\12\uffff\1\11\1\12\146\uffff\1\1\1\2\1\3\1\7\1\10\175\uffff\1\5\1\6",
+            "\1\16\12\uffff\1\11\1\12\146\uffff\1\13\1\14\1\15\1\21\1\22\175\uffff\1\17\1\20",
+            "\1\16\12\uffff\1\11\1\12\146\uffff\1\13\1\14\1\15\1\21\1\22\175\uffff\1\17\1\20",
+            "\1\16\12\uffff\1\11\1\12\146\uffff\1\13\1\14\1\15\1\21\1\22\175\uffff\1\17\1\20",
+            "\1\16\12\uffff\1\11\1\12\146\uffff\1\13\1\14\1\15\1\21\1\22\175\uffff\1\17\1\20",
+            "\1\16\12\uffff\1\11\1\12\146\uffff\1\13\1\14\1\15\1\21\1\22\175\uffff\1\17\1\20",
+            "\1\16\12\uffff\1\11\1\12\146\uffff\1\13\1\14\1\15\1\21\1\22\175\uffff\1\17\1\20",
+            "\1\16\12\uffff\1\11\1\12\146\uffff\1\13\1\14\1\15\1\21\1\22\175\uffff\1\17\1\20",
+            "\1\16\12\uffff\1\11\1\12\146\uffff\1\13\1\14\1\15\1\21\1\22\175\uffff\1\17\1\20",
+            "",
+            "",
+            "\1\26\12\uffff\1\11\1\12\146\uffff\1\23\1\24\1\25\1\31\1\32\175\uffff\1\27\1\30",
+            "\1\26\12\uffff\1\11\1\12\146\uffff\1\23\1\24\1\25\1\31\1\32\175\uffff\1\27\1\30",
+            "\1\26\12\uffff\1\11\1\12\146\uffff\1\23\1\24\1\25\1\31\1\32\175\uffff\1\27\1\30",
+            "\1\26\12\uffff\1\11\1\12\146\uffff\1\23\1\24\1\25\1\31\1\32\175\uffff\1\27\1\30",
+            "\1\26\12\uffff\1\11\1\12\146\uffff\1\23\1\24\1\25\1\31\1\32\175\uffff\1\27\1\30",
+            "\1\26\12\uffff\1\11\1\12\146\uffff\1\23\1\24\1\25\1\31\1\32\175\uffff\1\27\1\30",
+            "\1\26\12\uffff\1\11\1\12\146\uffff\1\23\1\24\1\25\1\31\1\32\175\uffff\1\27\1\30",
+            "\1\26\12\uffff\1\11\1\12\146\uffff\1\23\1\24\1\25\1\31\1\32\175\uffff\1\27\1\30",
+            "\1\11\1\12",
+            "\1\11\1\12",
+            "\1\11\1\12",
+            "\1\11\1\12",
+            "\1\11\1\12",
+            "\1\11\1\12",
+            "\1\11\1\12",
+            "\1\11\1\12"
+    };
+
+    static final short[] dfa_15 = DFA.unpackEncodedString(dfa_15s);
+    static final char[] dfa_16 = DFA.unpackEncodedStringToUnsignedChars(dfa_16s);
+    static final char[] dfa_17 = DFA.unpackEncodedStringToUnsignedChars(dfa_17s);
+    static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
+    static final short[] dfa_19 = DFA.unpackEncodedString(dfa_19s);
+    static final short[][] dfa_20 = unpackEncodedStringArray(dfa_20s);
+
+    class DFA26 extends DFA {
+
+        public DFA26(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 26;
+            this.eot = dfa_15;
+            this.eof = dfa_15;
+            this.min = dfa_16;
+            this.max = dfa_17;
+            this.accept = dfa_18;
+            this.special = dfa_19;
+            this.transition = dfa_20;
+        }
+        public String getDescription() {
+            return "6907:1: rule__AnyMachineBlock__Alternatives : ( ( ruleMachineBlock ) | ( ruleStatemachine ) );";
+        }
+    }
+    static final String dfa_21s = "\5\17\2\uffff\1\17\1\6\3\17\4\uffff\5\17\1\6\4\17\1\6\3\17\1\6\1\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\3\17\1\6\5\17\1\6\3\17\1\6\4\17\1\6\4\17";
+    static final String[] dfa_22s = {
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\10\54\uffff\1\17\4\uffff\1\16\60\uffff\1\7\1\11\1\12\1\13\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "",
+            "",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\32\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "",
+            "",
+            "",
+            "",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\40\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\45\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\17\uffff\1\17\146\uffff\1\17\52\uffff\4\14",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\52\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\57\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\64\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\71\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\102\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\17\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\4\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\110\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\114\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\121\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17"
+    };
+    static final char[] dfa_21 = DFA.unpackEncodedStringToUnsignedChars(dfa_21s);
+    static final short[][] dfa_22 = unpackEncodedStringArray(dfa_22s);
+
+    class DFA31 extends DFA {
+
+        public DFA31(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 31;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_21;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_22;
+        }
+        public String getDescription() {
+            return "7012:1: rule__MachineBlock__Alternatives_6 : ( ( ( rule__MachineBlock__PortAssignment_6_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_6_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_6_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_6_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_6_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_6_5 ) ) );";
+        }
+    }
+    static final String dfa_23s = "\5\17\2\uffff\1\17\1\6\3\17\4\uffff\5\17\1\6\4\17\1\6\3\17\1\6\1\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\3\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17";
+    static final String[] dfa_24s = {
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\10\54\uffff\1\17\4\uffff\1\16\60\uffff\1\7\1\11\1\12\1\13\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "",
+            "",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\32\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "",
+            "",
+            "",
+            "",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\40\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\45\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\17\uffff\1\17\146\uffff\1\17\52\uffff\4\14",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\52\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\57\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\64\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\71\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\102\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\17\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\4\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\107\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\110\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\107\54\uffff\1\17\65\uffff\1\110\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\107\54\uffff\1\17\65\uffff\1\110\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\107\54\uffff\1\17\65\uffff\1\110\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\107\54\uffff\1\17\65\uffff\1\110\1\111\1\112\1\113\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\114\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\121\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17"
+    };
+    static final char[] dfa_23 = DFA.unpackEncodedStringToUnsignedChars(dfa_23s);
+    static final short[][] dfa_24 = unpackEncodedStringArray(dfa_24s);
+
+    class DFA33 extends DFA {
+
+        public DFA33(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 33;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_23;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_24;
+        }
+        public String getDescription() {
+            return "7090:1: rule__MachineBlock__Alternatives_7_0_1 : ( ( ( rule__MachineBlock__PortAssignment_7_0_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_0_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_0_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_0_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_0_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_0_1_5 ) ) );";
+        }
+    }
+
+    class DFA34 extends DFA {
+
+        public DFA34(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 34;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "7135:1: rule__MachineBlock__Alternatives_7_1_1 : ( ( ( rule__MachineBlock__PortAssignment_7_1_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_1_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_1_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_1_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_1_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_1_1_5 ) ) );";
+        }
+    }
+
+    class DFA35 extends DFA {
+
+        public DFA35(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 35;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "7180:1: rule__MachineBlock__Alternatives_7_2_1 : ( ( ( rule__MachineBlock__PortAssignment_7_2_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_2_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_2_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_2_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_2_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_2_1_5 ) ) );";
+        }
+    }
+
+    class DFA36 extends DFA {
+
+        public DFA36(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 36;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "7225:1: rule__MachineBlock__Alternatives_7_3_1 : ( ( ( rule__MachineBlock__PortAssignment_7_3_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_3_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_3_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_3_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_3_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_3_1_5 ) ) );";
+        }
+    }
+    static final String dfa_25s = "\5\17\2\uffff\1\17\1\6\3\17\4\uffff\5\17\1\6\4\17\1\6\3\17\1\6\1\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\3\17";
+    static final String[] dfa_26s = {
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\10\54\uffff\1\17\4\uffff\1\16\60\uffff\1\7\1\11\1\12\1\13\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\25\54\uffff\1\17\4\uffff\1\16\60\uffff\1\24\1\26\1\27\1\30\2\17",
+            "",
+            "",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\32\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "",
+            "",
+            "",
+            "",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\40\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\45\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\17\uffff\1\17\146\uffff\1\17\52\uffff\4\14",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\52\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\57\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\64\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\71\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\23\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\20\1\21\1\22\3\uffff\1\17\15\uffff\11\17\7\uffff\1\103\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\23\162\uffff\1\20\1\21\1\22\41\uffff\1\103\54\uffff\1\17\65\uffff\1\102\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\17\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\4\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\110\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\110\54\uffff\1\17\65\uffff\1\107\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\115\54\uffff\1\17\65\uffff\1\114\1\116\1\117\1\120\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\115\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\114\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\115\54\uffff\1\17\65\uffff\1\114\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\115\54\uffff\1\17\65\uffff\1\114\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\115\54\uffff\1\17\65\uffff\1\114\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\122\54\uffff\1\17\65\uffff\1\121\1\123\1\124\1\125\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\122\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\121\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\122\54\uffff\1\17\65\uffff\1\121\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\122\54\uffff\1\17\65\uffff\1\121\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\122\54\uffff\1\17\65\uffff\1\121\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17"
+    };
+    static final char[] dfa_25 = DFA.unpackEncodedStringToUnsignedChars(dfa_25s);
+    static final short[][] dfa_26 = unpackEncodedStringArray(dfa_26s);
+
+    class DFA56 extends DFA {
+
+        public DFA56(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 56;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_25;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_26;
+        }
+        public String getDescription() {
+            return "7637:1: rule__Procedure__Alternatives_7_1 : ( ( ( rule__Procedure__PortAssignment_7_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_7_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_7_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_7_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_7_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_7_1_5 ) ) );";
+        }
+    }
+    static final String dfa_27s = "\5\17\2\uffff\1\17\1\6\3\17\4\uffff\1\6\11\17\1\6\3\17\1\6\1\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\3\17\1\6\4\17\1\6\4\17\1\6\4\17\1\6\4\17";
+    static final String[] dfa_28s = {
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\10\54\uffff\1\17\4\uffff\1\16\60\uffff\1\7\1\11\1\12\1\13\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "\1\14\1\17\1\5\1\6\1\15\10\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\20\54\uffff\1\17\4\uffff\1\16\60\uffff\1\25\1\26\1\27\1\30\2\17",
+            "",
+            "",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\32\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\32\54\uffff\1\17\65\uffff\1\31\1\33\1\34\1\35\2\17",
+            "",
+            "",
+            "",
+            "",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\40\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\u00a2\uffff\1\40\54\uffff\1\17\65\uffff\1\37\1\41\1\42\1\43\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\45\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\45\54\uffff\1\17\65\uffff\1\44\1\46\1\47\1\50\2\17",
+            "\1\17\17\uffff\1\17\146\uffff\1\17\52\uffff\4\14",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\52\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\u00a2\uffff\1\52\54\uffff\1\17\65\uffff\1\51\1\53\1\54\1\55\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\57\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\57\54\uffff\1\17\65\uffff\1\56\1\60\1\61\1\62\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\64\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\u00a2\uffff\1\64\54\uffff\1\17\65\uffff\1\63\1\65\1\66\1\67\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\71\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\71\54\uffff\1\17\65\uffff\1\70\1\72\1\73\1\74\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\17\10\uffff\1\36\3\17\11\uffff\1\24\12\uffff\1\17\23\uffff\20\17\66\uffff\4\17\12\uffff\1\21\1\22\1\23\3\uffff\1\17\15\uffff\11\17\7\uffff\1\102\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\13\uffff\1\24\162\uffff\1\21\1\22\1\23\41\uffff\1\102\54\uffff\1\17\65\uffff\1\103\1\104\1\105\1\106\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\17\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\4\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\14\1\17\u00a2\uffff\1\17\54\uffff\1\17\71\uffff\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\107\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\110\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\107\54\uffff\1\17\65\uffff\1\110\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\107\54\uffff\1\17\65\uffff\1\110\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\107\54\uffff\1\17\65\uffff\1\110\1\111\1\112\1\113\2\17",
+            "\1\14\1\17\u00a2\uffff\1\107\54\uffff\1\17\65\uffff\1\110\1\111\1\112\1\113\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\114\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\14\1\17\u00a2\uffff\1\114\54\uffff\1\17\65\uffff\1\115\1\116\1\117\1\120\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\121\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\14\1\17\u00a2\uffff\1\121\54\uffff\1\17\65\uffff\1\122\1\123\1\124\1\125\2\17",
+            "\1\17\10\uffff\1\36\3\17\24\uffff\1\17\23\uffff\20\17\66\uffff\4\17\20\uffff\1\17\15\uffff\11\17\7\uffff\1\76\54\uffff\1\17\6\uffff\7\17\47\uffff\1\17\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17",
+            "\1\14\1\17\u00a2\uffff\1\76\54\uffff\1\17\65\uffff\1\75\1\77\1\100\1\101\2\17"
+    };
+    static final char[] dfa_27 = DFA.unpackEncodedStringToUnsignedChars(dfa_27s);
+    static final short[][] dfa_28 = unpackEncodedStringArray(dfa_28s);
+
+    class DFA63 extends DFA {
+
+        public DFA63(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 63;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_27;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_28;
+        }
+        public String getDescription() {
+            return "7832:1: rule__Procedure__Alternatives_9_0_1 : ( ( ( rule__Procedure__PortAssignment_9_0_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_0_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_0_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_0_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_0_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_0_1_5 ) ) );";
+        }
+    }
+
+    class DFA64 extends DFA {
+
+        public DFA64(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 64;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "7877:1: rule__Procedure__Alternatives_9_1_1 : ( ( ( rule__Procedure__PortAssignment_9_1_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_1_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_1_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_1_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_1_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_1_1_5 ) ) );";
+        }
+    }
+
+    class DFA65 extends DFA {
+
+        public DFA65(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 65;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "7922:1: rule__Procedure__Alternatives_9_2_1 : ( ( ( rule__Procedure__PortAssignment_9_2_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_2_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_2_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_2_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_2_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_2_1_5 ) ) );";
+        }
+    }
+
+    class DFA66 extends DFA {
+
+        public DFA66(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 66;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "7967:1: rule__Procedure__Alternatives_9_3_1 : ( ( ( rule__Procedure__PortAssignment_9_3_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_3_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_3_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_3_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_3_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_3_1_5 ) ) );";
+        }
+    }
+
+    class DFA75 extends DFA {
+
+        public DFA75(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 75;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "8131:1: rule__MoeBehavior__Alternatives_1_1 : ( ( ( rule__MoeBehavior__PortAssignment_1_1_0 ) ) | ( ( rule__MoeBehavior__SignalAssignment_1_1_1 ) ) | ( ( rule__MoeBehavior__BufferAssignment_1_1_2 ) ) | ( ( rule__MoeBehavior__ChannelAssignment_1_1_3 ) ) | ( ( rule__MoeBehavior__TypedefAssignment_1_1_4 ) ) | ( ( rule__MoeBehavior__PropertyAssignment_1_1_5 ) ) );";
+        }
+    }
+
+    class DFA85 extends DFA {
+
+        public DFA85(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 85;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "8356:1: rule__Statemachine__Alternatives_7_1 : ( ( ( rule__Statemachine__PortAssignment_7_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_7_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_7_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_7_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_7_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_7_1_5 ) ) );";
+        }
+    }
+
+    class DFA92 extends DFA {
+
+        public DFA92(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 92;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_23;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_24;
+        }
+        public String getDescription() {
+            return "8551:1: rule__Statemachine__Alternatives_9_0_1 : ( ( ( rule__Statemachine__PortAssignment_9_0_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_0_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_0_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_0_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_0_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_0_1_5 ) ) );";
+        }
+    }
+
+    class DFA93 extends DFA {
+
+        public DFA93(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 93;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "8596:1: rule__Statemachine__Alternatives_9_1_1 : ( ( ( rule__Statemachine__PortAssignment_9_1_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_1_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_1_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_1_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_1_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_1_1_5 ) ) );";
+        }
+    }
+
+    class DFA94 extends DFA {
+
+        public DFA94(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 94;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "8641:1: rule__Statemachine__Alternatives_9_2_1 : ( ( ( rule__Statemachine__PortAssignment_9_2_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_2_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_2_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_2_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_2_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_2_1_5 ) ) );";
+        }
+    }
+
+    class DFA95 extends DFA {
+
+        public DFA95(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 95;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_10;
+            this.max = dfa_11;
+            this.accept = dfa_12;
+            this.special = dfa_13;
+            this.transition = dfa_14;
+        }
+        public String getDescription() {
+            return "8686:1: rule__Statemachine__Alternatives_9_3_1 : ( ( ( rule__Statemachine__PortAssignment_9_3_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_3_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_3_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_3_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_3_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_3_1_5 ) ) );";
+        }
+    }
+    static final String dfa_29s = "\17\uffff";
+    static final String dfa_30s = "\1\34\4\u00e5\1\6\1\5\1\6\7\uffff";
+    static final String dfa_31s = "\5\u00e5\1\6\2\u0115\7\uffff";
+    static final String dfa_32s = "\10\uffff\1\7\1\4\1\2\1\5\1\6\1\3\1\1";
+    static final String dfa_33s = "\17\uffff}>";
+    static final String[] dfa_34s = {
+            "\1\4\162\uffff\1\1\1\2\1\3\123\uffff\1\5",
+            "\1\5",
+            "\1\5",
+            "\1\5",
+            "\1\5",
+            "\1\6",
+            "\1\7\1\10\10\uffff\1\10\1\uffff\2\10\24\uffff\1\10\23\uffff\20\10\66\uffff\4\10\20\uffff\1\11\15\uffff\2\10\7\14\73\uffff\3\10\1\13\1\16\1\12\1\15\47\uffff\1\10",
+            "\1\10\10\uffff\1\10\1\uffff\2\10\24\uffff\1\10\23\uffff\20\10\66\uffff\4\10\20\uffff\1\11\15\uffff\2\10\7\14\73\uffff\3\10\1\13\1\16\1\12\1\15\47\uffff\1\10",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_29 = DFA.unpackEncodedString(dfa_29s);
+    static final char[] dfa_30 = DFA.unpackEncodedStringToUnsignedChars(dfa_30s);
+    static final char[] dfa_31 = DFA.unpackEncodedStringToUnsignedChars(dfa_31s);
+    static final short[] dfa_32 = DFA.unpackEncodedString(dfa_32s);
+    static final short[] dfa_33 = DFA.unpackEncodedString(dfa_33s);
+    static final short[][] dfa_34 = unpackEncodedStringArray(dfa_34s);
+
+    class DFA157 extends DFA {
+
+        public DFA157(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 157;
+            this.eot = dfa_29;
+            this.eof = dfa_29;
+            this.min = dfa_30;
+            this.max = dfa_31;
+            this.accept = dfa_32;
+            this.special = dfa_33;
+            this.transition = dfa_34;
+        }
+        public String getDescription() {
+            return "10075:1: rule__TypeDefinition__Alternatives : ( ( ruleEnumerationTypeDefinition ) | ( ruleStructureTypeDefinition ) | ( ruleUnionTypeDefinition ) | ( ruleChoiceTypeDefinition ) | ( ruleIntervalTypeDefinition ) | ( ruleCollectionTypeDefinition ) | ( ruleOtherDataTypeDefinition ) );";
+        }
+    }
+    static final String dfa_35s = "\12\uffff";
+    static final String dfa_36s = "\5\73\5\uffff";
+    static final String dfa_37s = "\1\u0115\4\110\5\uffff";
+    static final String dfa_38s = "\5\uffff\1\1\1\2\1\3\1\4\1\5";
+    static final String dfa_39s = "\12\uffff}>";
+    static final String[] dfa_40s = {
+            "\4\5\4\6\4\7\2\10\70\uffff\1\2\1\4\1\1\1\3\142\uffff\1\11\55\uffff\1\11",
+            "\4\5\4\6\4\7\2\10",
+            "\4\5\4\6\4\7\2\10",
+            "\4\5\4\6\4\7\2\10",
+            "\4\5\4\6\4\7\2\10",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_35 = DFA.unpackEncodedString(dfa_35s);
+    static final char[] dfa_36 = DFA.unpackEncodedStringToUnsignedChars(dfa_36s);
+    static final char[] dfa_37 = DFA.unpackEncodedStringToUnsignedChars(dfa_37s);
+    static final short[] dfa_38 = DFA.unpackEncodedString(dfa_38s);
+    static final short[] dfa_39 = DFA.unpackEncodedString(dfa_39s);
+    static final short[][] dfa_40 = unpackEncodedStringArray(dfa_40s);
+
+    class DFA166 extends DFA {
+
+        public DFA166(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 166;
+            this.eot = dfa_35;
+            this.eof = dfa_35;
+            this.min = dfa_36;
+            this.max = dfa_37;
+            this.accept = dfa_38;
+            this.special = dfa_39;
+            this.transition = dfa_40;
+        }
+        public String getDescription() {
+            return "10312:1: rule__PrimitiveNumberType__Alternatives : ( ( rulePrimitiveIntegerType ) | ( rulePrimitiveRationalType ) | ( rulePrimitiveFloatType ) | ( rulePrimitiveRealType ) | ( rulePrimitiveTimeType ) );";
+        }
+    }
+    static final String dfa_41s = "\1\4\1\0\42\uffff";
+    static final String dfa_42s = "\1\u011f\1\0\42\uffff";
+    static final String dfa_43s = "\2\uffff\1\2\40\uffff\1\1";
+    static final String dfa_44s = "\1\uffff\1\0\42\uffff}>";
+    static final String[] dfa_45s = {
+            "\4\2\14\uffff\1\2\2\uffff\1\2\5\uffff\2\2\136\uffff\1\2\3\uffff\6\2\2\uffff\6\2\70\uffff\1\1\75\uffff\13\2\17\uffff\1\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_41 = DFA.unpackEncodedStringToUnsignedChars(dfa_41s);
+    static final char[] dfa_42 = DFA.unpackEncodedStringToUnsignedChars(dfa_42s);
+    static final short[] dfa_43 = DFA.unpackEncodedString(dfa_43s);
+    static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
+    static final short[][] dfa_45 = unpackEncodedStringArray(dfa_45s);
+
+    class DFA218 extends DFA {
+
+        public DFA218(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 218;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_45;
+        }
+        public String getDescription() {
+            return "11518:1: rule__TransitionTimedGuard__Alternatives_1_1_0_1 : ( ( ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 ) ) | ( ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA218_1 = input.LA(1);
+
+                         
+                        int index218_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred372_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index218_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 218, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_46s = "\55\uffff";
+    static final String dfa_47s = "\1\6\1\0\13\uffff\1\0\6\uffff\1\0\30\uffff";
+    static final String dfa_48s = "\1\u011d\1\0\13\uffff\1\0\6\uffff\1\0\30\uffff";
+    static final String dfa_49s = "\2\uffff\1\1\15\uffff\1\2\1\3\1\4\1\5\1\uffff\1\10\3\uffff\1\11\17\uffff\1\12\1\uffff\1\6\1\7";
+    static final String dfa_50s = "\1\uffff\1\0\13\uffff\1\1\6\uffff\1\2\30\uffff}>";
+    static final String[] dfa_51s = {
+            "\1\1\20\uffff\1\2\151\uffff\2\2\12\uffff\2\2\16\uffff\1\25\22\uffff\1\20\1\uffff\2\31\3\25\16\31\66\uffff\1\21\1\uffff\1\22\1\23\1\24\5\uffff\1\2\1\15\2\uffff\7\2\14\uffff\2\51",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_46 = DFA.unpackEncodedString(dfa_46s);
+    static final char[] dfa_47 = DFA.unpackEncodedStringToUnsignedChars(dfa_47s);
+    static final char[] dfa_48 = DFA.unpackEncodedStringToUnsignedChars(dfa_48s);
+    static final short[] dfa_49 = DFA.unpackEncodedString(dfa_49s);
+    static final short[] dfa_50 = DFA.unpackEncodedString(dfa_50s);
+    static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);
+
+    class DFA219 extends DFA {
+
+        public DFA219(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 219;
+            this.eot = dfa_46;
+            this.eof = dfa_46;
+            this.min = dfa_47;
+            this.max = dfa_48;
+            this.accept = dfa_49;
+            this.special = dfa_50;
+            this.transition = dfa_51;
+        }
+        public String getDescription() {
+            return "11539:1: rule__TransitionEffectStatement__Alternatives : ( ( ruleExpressionStatement ) | ( ruleOutputComStatement ) | ( ruleIfStatement ) | ( ruleWhileDoStatement ) | ( ruleDoWhileStatement ) | ( ruleForStatement ) | ( ruleForEachStatement ) | ( ruleInterruptStatement ) | ( ruleActivityStatement ) | ( ruleInvokeStatement ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA219_1 = input.LA(1);
+
+                         
+                        int index219_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred373_InternalFormalML()) ) {s = 2;}
+
+                        else if ( (true) ) {s = 41;}
+
+                         
+                        input.seek(index219_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA219_13 = input.LA(1);
+
+                         
+                        int index219_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred373_InternalFormalML()) ) {s = 2;}
+
+                        else if ( (true) ) {s = 41;}
+
+                         
+                        input.seek(index219_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA219_20 = input.LA(1);
+
+                         
+                        int index219_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred378_InternalFormalML()) ) {s = 43;}
+
+                        else if ( (synpred379_InternalFormalML()) ) {s = 44;}
+
+                         
+                        input.seek(index219_20);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 219, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_52s = "\63\uffff";
+    static final String dfa_53s = "\1\6\1\uffff\1\0\13\uffff\1\0\13\uffff\1\0\30\uffff";
+    static final String dfa_54s = "\1\u011d\1\uffff\1\0\13\uffff\1\0\13\uffff\1\0\30\uffff";
+    static final String dfa_55s = "\1\uffff\1\1\1\uffff\1\2\15\uffff\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\uffff\1\16\3\uffff\1\17\17\uffff\1\20\1\uffff\1\14\1\15";
+    static final String dfa_56s = "\2\uffff\1\0\13\uffff\1\1\13\uffff\1\2\30\uffff}>";
+    static final String[] dfa_57s = {
+            "\1\2\20\uffff\1\3\151\uffff\2\3\12\uffff\2\3\16\uffff\1\33\21\uffff\1\25\1\26\1\uffff\2\37\3\33\16\37\2\uffff\1\1\56\uffff\1\21\1\22\1\23\1\24\1\uffff\1\27\1\uffff\1\30\1\31\1\32\5\uffff\1\3\1\16\2\uffff\7\3\14\uffff\2\57",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_52 = DFA.unpackEncodedString(dfa_52s);
+    static final char[] dfa_53 = DFA.unpackEncodedStringToUnsignedChars(dfa_53s);
+    static final char[] dfa_54 = DFA.unpackEncodedStringToUnsignedChars(dfa_54s);
+    static final short[] dfa_55 = DFA.unpackEncodedString(dfa_55s);
+    static final short[] dfa_56 = DFA.unpackEncodedString(dfa_56s);
+    static final short[][] dfa_57 = unpackEncodedStringArray(dfa_57s);
+
+    class DFA220 extends DFA {
+
+        public DFA220(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 220;
+            this.eot = dfa_52;
+            this.eof = dfa_52;
+            this.min = dfa_53;
+            this.max = dfa_54;
+            this.accept = dfa_55;
+            this.special = dfa_56;
+            this.transition = dfa_57;
+        }
+        public String getDescription() {
+            return "11608:1: rule__Statement__Alternatives : ( ( ruleBlockStatement ) | ( ruleExpressionStatement ) | ( ruleGuardStatement ) | ( ruleTimedGuardStatement ) | ( ruleEventGuardStatement ) | ( ruleCheckSatGuardStatement ) | ( ruleInputComStatement ) | ( ruleOutputComStatement ) | ( ruleIfStatement ) | ( ruleWhileDoStatement ) | ( ruleDoWhileStatement ) | ( ruleForStatement ) | ( ruleForEachStatement ) | ( ruleInterruptStatement ) | ( ruleActivityStatement ) | ( ruleInvokeStatement ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA220_2 = input.LA(1);
+
+                         
+                        int index220_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred383_InternalFormalML()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 47;}
+
+                         
+                        input.seek(index220_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA220_14 = input.LA(1);
+
+                         
+                        int index220_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred383_InternalFormalML()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 47;}
+
+                         
+                        input.seek(index220_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA220_26 = input.LA(1);
+
+                         
+                        int index220_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred393_InternalFormalML()) ) {s = 49;}
+
+                        else if ( (synpred394_InternalFormalML()) ) {s = 50;}
+
+                         
+                        input.seek(index220_26);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 220, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_58s = "\22\uffff";
+    static final String dfa_59s = "\1\6\13\0\6\uffff";
+    static final String dfa_60s = "\1\u010f\13\0\6\uffff";
+    static final String dfa_61s = "\14\uffff\1\2\1\uffff\1\3\1\uffff\1\1\1\4";
+    static final String dfa_62s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\6\uffff}>";
+    static final String[] dfa_63s = {
+            "\1\1\20\uffff\1\13\151\uffff\2\16\12\uffff\1\11\1\12\166\uffff\2\14\2\uffff\1\2\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_58 = DFA.unpackEncodedString(dfa_58s);
+    static final char[] dfa_59 = DFA.unpackEncodedStringToUnsignedChars(dfa_59s);
+    static final char[] dfa_60 = DFA.unpackEncodedStringToUnsignedChars(dfa_60s);
+    static final short[] dfa_61 = DFA.unpackEncodedString(dfa_61s);
+    static final short[] dfa_62 = DFA.unpackEncodedString(dfa_62s);
+    static final short[][] dfa_63 = unpackEncodedStringArray(dfa_63s);
+
+    class DFA222 extends DFA {
+
+        public DFA222(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 222;
+            this.eot = dfa_58;
+            this.eof = dfa_58;
+            this.min = dfa_59;
+            this.max = dfa_60;
+            this.accept = dfa_61;
+            this.special = dfa_62;
+            this.transition = dfa_63;
+        }
+        public String getDescription() {
+            return "11818:1: rule__ExpressionStatement__Alternatives : ( ( ( rule__ExpressionStatement__Group_0__0 ) ) | ( ( rule__ExpressionStatement__Group_1__0 ) ) | ( ( rule__ExpressionStatement__Group_2__0 ) ) | ( ( rule__ExpressionStatement__Group_3__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA222_1 = input.LA(1);
+
+                         
+                        int index222_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA222_2 = input.LA(1);
+
+                         
+                        int index222_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA222_3 = input.LA(1);
+
+                         
+                        int index222_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA222_4 = input.LA(1);
+
+                         
+                        int index222_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA222_5 = input.LA(1);
+
+                         
+                        int index222_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA222_6 = input.LA(1);
+
+                         
+                        int index222_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA222_7 = input.LA(1);
+
+                         
+                        int index222_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA222_8 = input.LA(1);
+
+                         
+                        int index222_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA222_9 = input.LA(1);
+
+                         
+                        int index222_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA222_10 = input.LA(1);
+
+                         
+                        int index222_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA222_11 = input.LA(1);
+
+                         
+                        int index222_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred412_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index222_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 222, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_64s = "\20\uffff";
+    static final String dfa_65s = "\1\6\13\0\4\uffff";
+    static final String dfa_66s = "\1\u010f\13\0\4\uffff";
+    static final String dfa_67s = "\14\uffff\1\2\1\uffff\1\1\1\3";
+    static final String dfa_68s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\4\uffff}>";
+    static final String[] dfa_69s = {
+            "\1\1\20\uffff\1\13\151\uffff\2\14\12\uffff\1\11\1\12\172\uffff\1\2\1\3\1\4\1\5\1\6\1\7\1\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_64 = DFA.unpackEncodedString(dfa_64s);
+    static final char[] dfa_65 = DFA.unpackEncodedStringToUnsignedChars(dfa_65s);
+    static final char[] dfa_66 = DFA.unpackEncodedStringToUnsignedChars(dfa_66s);
+    static final short[] dfa_67 = DFA.unpackEncodedString(dfa_67s);
+    static final short[] dfa_68 = DFA.unpackEncodedString(dfa_68s);
+    static final short[][] dfa_69 = unpackEncodedStringArray(dfa_69s);
+
+    class DFA227 extends DFA {
+
+        public DFA227(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 227;
+            this.eot = dfa_64;
+            this.eof = dfa_64;
+            this.min = dfa_65;
+            this.max = dfa_66;
+            this.accept = dfa_67;
+            this.special = dfa_68;
+            this.transition = dfa_69;
+        }
+        public String getDescription() {
+            return "11935:1: rule__ForAssignmentExpression__Alternatives : ( ( ruleAssignmentExpression ) | ( ruleIncrementOrDecrementPrefixExpression ) | ( ruleIncrementOrDecrementPostfixExpression ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA227_1 = input.LA(1);
+
+                         
+                        int index227_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA227_2 = input.LA(1);
+
+                         
+                        int index227_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA227_3 = input.LA(1);
+
+                         
+                        int index227_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA227_4 = input.LA(1);
+
+                         
+                        int index227_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA227_5 = input.LA(1);
+
+                         
+                        int index227_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA227_6 = input.LA(1);
+
+                         
+                        int index227_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA227_7 = input.LA(1);
+
+                         
+                        int index227_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA227_8 = input.LA(1);
+
+                         
+                        int index227_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA227_9 = input.LA(1);
+
+                         
+                        int index227_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA227_10 = input.LA(1);
+
+                         
+                        int index227_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA227_11 = input.LA(1);
+
+                         
+                        int index227_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred419_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index227_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 227, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_70s = "\1\4\12\uffff\1\0\30\uffff";
+    static final String dfa_71s = "\1\u011f\12\uffff\1\0\30\uffff";
+    static final String dfa_72s = "\1\uffff\1\1\41\uffff\1\2";
+    static final String dfa_73s = "\13\uffff\1\0\30\uffff}>";
+    static final String[] dfa_74s = {
+            "\4\1\14\uffff\1\1\2\uffff\1\13\5\uffff\2\1\136\uffff\1\1\3\uffff\6\1\2\uffff\6\1\70\uffff\1\1\75\uffff\13\1\17\uffff\1\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_70 = DFA.unpackEncodedStringToUnsignedChars(dfa_70s);
+    static final char[] dfa_71 = DFA.unpackEncodedStringToUnsignedChars(dfa_71s);
+    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
+    static final short[] dfa_73 = DFA.unpackEncodedString(dfa_73s);
+    static final short[][] dfa_74 = unpackEncodedStringArray(dfa_74s);
+
+    class DFA229 extends DFA {
+
+        public DFA229(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 229;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_70;
+            this.max = dfa_71;
+            this.accept = dfa_72;
+            this.special = dfa_73;
+            this.transition = dfa_74;
+        }
+        public String getDescription() {
+            return "11983:1: rule__InterruptStatement__Alternatives_1 : ( ( ( rule__InterruptStatement__ExprAssignment_1_0 ) ) | ( ( rule__InterruptStatement__Group_1_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA229_11 = input.LA(1);
+
+                         
+                        int index229_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred422_InternalFormalML()) ) {s = 1;}
+
+                        else if ( (true) ) {s = 35;}
+
+                         
+                        input.seek(index229_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 229, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_75s = "\1\4\13\0\30\uffff";
+    static final String dfa_76s = "\1\u011f\13\0\30\uffff";
+    static final String dfa_77s = "\14\uffff\1\2\26\uffff\1\1";
+    static final String dfa_78s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\30\uffff}>";
+    static final String[] dfa_79s = {
+            "\2\14\1\1\1\14\14\uffff\1\14\2\uffff\1\13\5\uffff\2\14\136\uffff\1\14\3\uffff\6\14\2\uffff\4\14\1\11\1\12\70\uffff\1\14\75\uffff\4\14\1\2\1\3\1\4\1\5\1\6\1\7\1\10\17\uffff\1\14",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_75 = DFA.unpackEncodedStringToUnsignedChars(dfa_75s);
+    static final char[] dfa_76 = DFA.unpackEncodedStringToUnsignedChars(dfa_76s);
+    static final short[] dfa_77 = DFA.unpackEncodedString(dfa_77s);
+    static final short[] dfa_78 = DFA.unpackEncodedString(dfa_78s);
+    static final short[][] dfa_79 = unpackEncodedStringArray(dfa_79s);
+
+    class DFA234 extends DFA {
+
+        public DFA234(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 234;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_75;
+            this.max = dfa_76;
+            this.accept = dfa_77;
+            this.special = dfa_78;
+            this.transition = dfa_79;
+        }
+        public String getDescription() {
+            return "12100:1: rule__Expression__Alternatives : ( ( ruleAssignmentExpression ) | ( ruleConditionalTestExpression ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA234_1 = input.LA(1);
+
+                         
+                        int index234_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA234_2 = input.LA(1);
+
+                         
+                        int index234_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA234_3 = input.LA(1);
+
+                         
+                        int index234_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA234_4 = input.LA(1);
+
+                         
+                        int index234_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA234_5 = input.LA(1);
+
+                         
+                        int index234_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA234_6 = input.LA(1);
+
+                         
+                        int index234_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA234_7 = input.LA(1);
+
+                         
+                        int index234_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA234_8 = input.LA(1);
+
+                         
+                        int index234_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA234_9 = input.LA(1);
+
+                         
+                        int index234_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA234_10 = input.LA(1);
+
+                         
+                        int index234_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA234_11 = input.LA(1);
+
+                         
+                        int index234_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred429_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index234_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 234, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_80s = "\1\4\2\uffff\1\0\15\uffff\1\0\3\uffff\13\0\4\uffff";
+    static final String dfa_81s = "\1\u011f\2\uffff\1\0\15\uffff\1\0\3\uffff\13\0\4\uffff";
+    static final String dfa_82s = "\1\uffff\1\1\12\uffff\1\2\1\3\1\uffff\1\4\1\5\1\uffff\1\6\1\7\14\uffff\1\11\2\uffff\1\10";
+    static final String dfa_83s = "\3\uffff\1\0\15\uffff\1\1\3\uffff\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\4\uffff}>";
+    static final String[] dfa_84s = {
+            "\2\1\1\25\1\1\14\uffff\1\1\2\uffff\1\37\5\uffff\2\1\136\uffff\1\40\3\uffff\2\23\1\14\1\3\2\15\2\uffff\4\1\1\35\1\36\70\uffff\1\40\75\uffff\1\20\1\21\1\22\1\40\1\26\1\27\1\30\1\31\1\32\1\33\1\34\17\uffff\1\17",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_80 = DFA.unpackEncodedStringToUnsignedChars(dfa_80s);
+    static final char[] dfa_81 = DFA.unpackEncodedStringToUnsignedChars(dfa_81s);
+    static final short[] dfa_82 = DFA.unpackEncodedString(dfa_82s);
+    static final short[] dfa_83 = DFA.unpackEncodedString(dfa_83s);
+    static final short[][] dfa_84 = unpackEncodedStringArray(dfa_84s);
+
+    class DFA245 extends DFA {
+
+        public DFA245(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 245;
+            this.eot = dfa_9;
+            this.eof = dfa_9;
+            this.min = dfa_80;
+            this.max = dfa_81;
+            this.accept = dfa_82;
+            this.special = dfa_83;
+            this.transition = dfa_84;
+        }
+        public String getDescription() {
+            return "12481:1: rule__UnaryExpression__Alternatives : ( ( ruleLiteralTerminalExpression ) | ( ruleArithmeticUnaryExpression ) | ( ruleLogicalUnaryExpression ) | ( ruleBitwiseUnaryExpression ) | ( ruleNewfreshExpression ) | ( ruleCastExpression ) | ( rulePrefixUnaryExpression ) | ( rulePostfixUnaryExpression ) | ( rulePrimaryExpression ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA245_3 = input.LA(1);
+
+                         
+                        int index245_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred465_InternalFormalML()) ) {s = 1;}
+
+                        else if ( (synpred466_InternalFormalML()) ) {s = 12;}
+
+                         
+                        input.seek(index245_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA245_17 = input.LA(1);
+
+                         
+                        int index245_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred469_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA245_21 = input.LA(1);
+
+                         
+                        int index245_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA245_22 = input.LA(1);
+
+                         
+                        int index245_22 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_22);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA245_23 = input.LA(1);
+
+                         
+                        int index245_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_23);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA245_24 = input.LA(1);
+
+                         
+                        int index245_24 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_24);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA245_25 = input.LA(1);
+
+                         
+                        int index245_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA245_26 = input.LA(1);
+
+                         
+                        int index245_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA245_27 = input.LA(1);
+
+                         
+                        int index245_27 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_27);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA245_28 = input.LA(1);
+
+                         
+                        int index245_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_28);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA245_29 = input.LA(1);
+
+                         
+                        int index245_29 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_29);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA245_30 = input.LA(1);
+
+                         
+                        int index245_30 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_30);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA245_31 = input.LA(1);
+
+                         
+                        int index245_31 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred472_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index245_31);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 245, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_85s = "\1\4\1\uffff\1\7\1\u0103\6\uffff";
+    static final String dfa_86s = "\1\u008c\1\uffff\1\24\1\u0103\6\uffff";
+    static final String dfa_87s = "\1\uffff\1\1\2\uffff\1\4\1\5\1\6\1\7\1\3\1\2";
+    static final String dfa_88s = "\3\uffff\1\0\6\uffff}>";
+    static final String[] dfa_89s = {
+            "\1\5\1\6\1\uffff\1\3\14\uffff\1\4\10\uffff\2\1\145\uffff\1\2\4\uffff\4\7",
+            "",
+            "\1\3\14\uffff\1\4",
+            "\1\10",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_85 = DFA.unpackEncodedStringToUnsignedChars(dfa_85s);
+    static final char[] dfa_86 = DFA.unpackEncodedStringToUnsignedChars(dfa_86s);
+    static final short[] dfa_87 = DFA.unpackEncodedString(dfa_87s);
+    static final short[] dfa_88 = DFA.unpackEncodedString(dfa_88s);
+    static final short[][] dfa_89 = unpackEncodedStringArray(dfa_89s);
+
+    class DFA259 extends DFA {
+
+        public DFA259(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 259;
+            this.eot = dfa_35;
+            this.eof = dfa_35;
+            this.min = dfa_85;
+            this.max = dfa_86;
+            this.accept = dfa_87;
+            this.special = dfa_88;
+            this.transition = dfa_89;
+        }
+        public String getDescription() {
+            return "12835:1: rule__LiteralTerminalExpression__Alternatives : ( ( ruleLiteralBooleanExpression ) | ( ruleLiteralIntegerExpression ) | ( ruleLiteralRationalExpression ) | ( ruleLiteralFloatExpression ) | ( ruleLiteralCharacterExpression ) | ( ruleLiteralStringExpression ) | ( ruleLiteralNullExpression ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA259_3 = input.LA(1);
+
+                         
+                        int index259_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA259_3==259) ) {s = 8;}
+
+                        else if ( (synpred490_InternalFormalML()) ) {s = 9;}
+
+                        else if ( (synpred492_InternalFormalML()) ) {s = 4;}
+
+                         
+                        input.seek(index259_3);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 259, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_90s = "\24\uffff";
+    static final String dfa_91s = "\1\1\23\uffff";
+    static final String dfa_92s = "\1\34\10\uffff\6\0\5\uffff";
+    static final String dfa_93s = "\1\u00e2\10\uffff\6\0\5\uffff";
+    static final String dfa_94s = "\1\uffff\1\2\21\uffff\1\1";
+    static final String dfa_95s = "\11\uffff\1\0\1\1\1\2\1\3\1\4\1\5\5\uffff}>";
+    static final String[] dfa_96s = {
+            "\1\14\21\uffff\10\1\131\uffff\1\11\1\12\1\13\66\uffff\1\1\24\uffff\1\1\2\uffff\1\15\1\16\1\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_90 = DFA.unpackEncodedString(dfa_90s);
+    static final short[] dfa_91 = DFA.unpackEncodedString(dfa_91s);
+    static final char[] dfa_92 = DFA.unpackEncodedStringToUnsignedChars(dfa_92s);
+    static final char[] dfa_93 = DFA.unpackEncodedStringToUnsignedChars(dfa_93s);
+    static final short[] dfa_94 = DFA.unpackEncodedString(dfa_94s);
+    static final short[] dfa_95 = DFA.unpackEncodedString(dfa_95s);
+    static final short[][] dfa_96 = unpackEncodedStringArray(dfa_96s);
+
+    class DFA428 extends DFA {
+
+        public DFA428(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 428;
+            this.eot = dfa_90;
+            this.eof = dfa_91;
+            this.min = dfa_92;
+            this.max = dfa_93;
+            this.accept = dfa_94;
+            this.special = dfa_95;
+            this.transition = dfa_96;
+        }
+        public String getDescription() {
+            return "()* loopback of 25740:2: ( rule__ModelOfExecution__RoutineAssignment_2 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA428_9 = input.LA(1);
+
+                         
+                        int index428_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred715_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index428_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA428_10 = input.LA(1);
+
+                         
+                        int index428_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred715_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index428_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA428_11 = input.LA(1);
+
+                         
+                        int index428_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred715_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index428_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA428_12 = input.LA(1);
+
+                         
+                        int index428_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred715_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index428_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA428_13 = input.LA(1);
+
+                         
+                        int index428_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred715_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index428_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA428_14 = input.LA(1);
+
+                         
+                        int index428_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred715_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index428_14);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 428, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_97s = "\77\uffff";
+    static final String dfa_98s = "\1\5\76\uffff";
+    static final String dfa_99s = "\1\4\1\0\75\uffff";
+    static final String dfa_100s = "\1\u011f\1\0\75\uffff";
+    static final String dfa_101s = "\2\uffff\1\1\2\uffff\1\2\71\uffff";
+    static final String dfa_102s = "\1\uffff\1\0\75\uffff}>";
+    static final String[] dfa_103s = {
+            "\4\5\14\uffff\1\5\1\uffff\2\5\5\uffff\3\5\1\uffff\2\5\12\uffff\1\5\35\uffff\1\5\1\uffff\3\5\50\uffff\5\5\1\1\3\2\6\5\2\uffff\6\5\67\uffff\3\5\14\uffff\1\5\1\uffff\1\5\30\uffff\1\5\1\uffff\1\5\2\uffff\1\5\12\uffff\2\5\3\uffff\13\5\16\uffff\2\5",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_97 = DFA.unpackEncodedString(dfa_97s);
+    static final short[] dfa_98 = DFA.unpackEncodedString(dfa_98s);
+    static final char[] dfa_99 = DFA.unpackEncodedStringToUnsignedChars(dfa_99s);
+    static final char[] dfa_100 = DFA.unpackEncodedStringToUnsignedChars(dfa_100s);
+    static final short[] dfa_101 = DFA.unpackEncodedString(dfa_101s);
+    static final short[] dfa_102 = DFA.unpackEncodedString(dfa_102s);
+    static final short[][] dfa_103 = unpackEncodedStringArray(dfa_103s);
+
+    class DFA666 extends DFA {
+
+        public DFA666(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 666;
+            this.eot = dfa_97;
+            this.eof = dfa_98;
+            this.min = dfa_99;
+            this.max = dfa_100;
+            this.accept = dfa_101;
+            this.special = dfa_102;
+            this.transition = dfa_103;
+        }
+        public String getDescription() {
+            return "53195:2: ( rule__RelationalExpression__Group_1__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA666_1 = input.LA(1);
+
+                         
+                        int index666_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred953_InternalFormalML()) ) {s = 2;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index666_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 666, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA667 extends DFA {
+
+        public DFA667(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 667;
+            this.eot = dfa_97;
+            this.eof = dfa_98;
+            this.min = dfa_99;
+            this.max = dfa_100;
+            this.accept = dfa_101;
+            this.special = dfa_102;
+            this.transition = dfa_103;
+        }
+        public String getDescription() {
+            return "53303:2: ( rule__RelationalExpression__Group_1_3__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA667_1 = input.LA(1);
+
+                         
+                        int index667_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred954_InternalFormalML()) ) {s = 2;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index667_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 667, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_104s = "\100\uffff";
+    static final String dfa_105s = "\1\1\77\uffff";
+    static final String dfa_106s = "\1\4\53\uffff\1\0\10\uffff\1\0\12\uffff";
+    static final String dfa_107s = "\1\u011f\53\uffff\1\0\10\uffff\1\0\12\uffff";
+    static final String dfa_108s = "\1\uffff\1\2\75\uffff\1\1";
+    static final String dfa_109s = "\54\uffff\1\0\10\uffff\1\1\12\uffff}>";
+    static final String[] dfa_110s = {
+            "\4\1\14\uffff\1\1\1\uffff\2\1\5\uffff\3\1\1\uffff\2\1\12\uffff\1\1\35\uffff\1\1\1\uffff\3\1\50\uffff\13\1\1\65\1\54\2\1\2\uffff\6\1\67\uffff\3\1\14\uffff\1\1\1\uffff\1\1\30\uffff\1\1\1\uffff\1\1\2\uffff\1\1\12\uffff\2\1\3\uffff\13\1\16\uffff\2\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_104 = DFA.unpackEncodedString(dfa_104s);
+    static final short[] dfa_105 = DFA.unpackEncodedString(dfa_105s);
+    static final char[] dfa_106 = DFA.unpackEncodedStringToUnsignedChars(dfa_106s);
+    static final char[] dfa_107 = DFA.unpackEncodedStringToUnsignedChars(dfa_107s);
+    static final short[] dfa_108 = DFA.unpackEncodedString(dfa_108s);
+    static final short[] dfa_109 = DFA.unpackEncodedString(dfa_109s);
+    static final short[][] dfa_110 = unpackEncodedStringArray(dfa_110s);
+
+    class DFA668 extends DFA {
+
+        public DFA668(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 668;
+            this.eot = dfa_104;
+            this.eof = dfa_105;
+            this.min = dfa_106;
+            this.max = dfa_107;
+            this.accept = dfa_108;
+            this.special = dfa_109;
+            this.transition = dfa_110;
+        }
+        public String getDescription() {
+            return "()* loopback of 53438:2: ( rule__AdditiveExpression__Alternatives_1 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA668_44 = input.LA(1);
+
+                         
+                        int index668_44 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred955_InternalFormalML()) ) {s = 63;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index668_44);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA668_53 = input.LA(1);
+
+                         
+                        int index668_53 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred955_InternalFormalML()) ) {s = 63;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index668_53);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 668, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_111s = "\1\4\64\uffff\1\0\12\uffff";
+    static final String dfa_112s = "\1\u011f\64\uffff\1\0\12\uffff";
+    static final String dfa_113s = "\65\uffff\1\0\12\uffff}>";
+    static final String[] dfa_114s = {
+            "\4\1\14\uffff\1\1\1\uffff\2\1\5\uffff\3\1\1\uffff\2\1\12\uffff\1\1\35\uffff\1\1\1\uffff\3\1\50\uffff\13\1\1\65\3\1\2\uffff\6\1\67\uffff\3\1\14\uffff\1\1\1\uffff\1\1\30\uffff\1\1\1\uffff\1\1\2\uffff\1\1\12\uffff\2\1\3\uffff\13\1\16\uffff\2\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_111 = DFA.unpackEncodedStringToUnsignedChars(dfa_111s);
+    static final char[] dfa_112 = DFA.unpackEncodedStringToUnsignedChars(dfa_112s);
+    static final short[] dfa_113 = DFA.unpackEncodedString(dfa_113s);
+    static final short[][] dfa_114 = unpackEncodedStringArray(dfa_114s);
+
+    class DFA669 extends DFA {
+
+        public DFA669(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 669;
+            this.eot = dfa_104;
+            this.eof = dfa_105;
+            this.min = dfa_111;
+            this.max = dfa_112;
+            this.accept = dfa_108;
+            this.special = dfa_113;
+            this.transition = dfa_114;
+        }
+        public String getDescription() {
+            return "()* loopback of 53546:2: ( rule__AdditiveExpression__Group_1_0_3__0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA669_53 = input.LA(1);
+
+                         
+                        int index669_53 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred956_InternalFormalML()) ) {s = 63;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index669_53);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 669, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_115s = "\1\4\53\uffff\1\0\23\uffff";
+    static final String dfa_116s = "\1\u011f\53\uffff\1\0\23\uffff";
+    static final String dfa_117s = "\54\uffff\1\0\23\uffff}>";
+    static final String[] dfa_118s = {
+            "\4\1\14\uffff\1\1\1\uffff\2\1\5\uffff\3\1\1\uffff\2\1\12\uffff\1\1\35\uffff\1\1\1\uffff\3\1\50\uffff\14\1\1\54\2\1\2\uffff\6\1\67\uffff\3\1\14\uffff\1\1\1\uffff\1\1\30\uffff\1\1\1\uffff\1\1\2\uffff\1\1\12\uffff\2\1\3\uffff\13\1\16\uffff\2\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_115 = DFA.unpackEncodedStringToUnsignedChars(dfa_115s);
+    static final char[] dfa_116 = DFA.unpackEncodedStringToUnsignedChars(dfa_116s);
+    static final short[] dfa_117 = DFA.unpackEncodedString(dfa_117s);
+    static final short[][] dfa_118 = unpackEncodedStringArray(dfa_118s);
+
+    class DFA670 extends DFA {
+
+        public DFA670(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 670;
+            this.eot = dfa_104;
+            this.eof = dfa_105;
+            this.min = dfa_115;
+            this.max = dfa_116;
+            this.accept = dfa_108;
+            this.special = dfa_117;
+            this.transition = dfa_118;
+        }
+        public String getDescription() {
+            return "()* loopback of 53708:2: ( rule__AdditiveExpression__Group_1_1_3__0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA670_44 = input.LA(1);
+
+                         
+                        int index670_44 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred957_InternalFormalML()) ) {s = 63;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index670_44);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 670, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_119s = "\104\uffff";
+    static final String dfa_120s = "\1\1\103\uffff";
+    static final String dfa_121s = "\1\4\76\uffff\1\0\4\uffff";
+    static final String dfa_122s = "\1\u011f\76\uffff\1\0\4\uffff";
+    static final String dfa_123s = "\1\uffff\1\2\101\uffff\1\1";
+    static final String dfa_124s = "\77\uffff\1\0\4\uffff}>";
+    static final String[] dfa_125s = {
+            "\4\1\14\uffff\1\1\1\uffff\2\1\5\uffff\3\1\1\uffff\2\1\12\uffff\1\1\14\uffff\1\77\20\uffff\1\1\1\uffff\3\1\50\uffff\17\1\2\uffff\6\1\67\uffff\3\1\14\uffff\1\1\1\uffff\1\1\30\uffff\1\1\1\uffff\1\1\2\uffff\1\1\12\uffff\20\1\16\uffff\2\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_119 = DFA.unpackEncodedString(dfa_119s);
+    static final short[] dfa_120 = DFA.unpackEncodedString(dfa_120s);
+    static final char[] dfa_121 = DFA.unpackEncodedStringToUnsignedChars(dfa_121s);
+    static final char[] dfa_122 = DFA.unpackEncodedStringToUnsignedChars(dfa_122s);
+    static final short[] dfa_123 = DFA.unpackEncodedString(dfa_123s);
+    static final short[] dfa_124 = DFA.unpackEncodedString(dfa_124s);
+    static final short[][] dfa_125 = unpackEncodedStringArray(dfa_125s);
+
+    class DFA672 extends DFA {
+
+        public DFA672(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 672;
+            this.eot = dfa_119;
+            this.eof = dfa_120;
+            this.min = dfa_121;
+            this.max = dfa_122;
+            this.accept = dfa_123;
+            this.special = dfa_124;
+            this.transition = dfa_125;
+        }
+        public String getDescription() {
+            return "()* loopback of 53924:2: ( rule__MultiplicativeExpression__Group_1_0_3__0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA672_63 = input.LA(1);
+
+                         
+                        int index672_63 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred959_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index672_63);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 672, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_126s = "\1\4\77\uffff\1\0\3\uffff";
+    static final String dfa_127s = "\1\u011f\77\uffff\1\0\3\uffff";
+    static final String dfa_128s = "\100\uffff\1\0\3\uffff}>";
+    static final String[] dfa_129s = {
+            "\4\1\14\uffff\1\1\1\uffff\2\1\5\uffff\3\1\1\uffff\2\1\12\uffff\1\1\14\uffff\1\1\20\uffff\1\1\1\uffff\3\1\50\uffff\17\1\2\uffff\6\1\67\uffff\3\1\14\uffff\1\1\1\uffff\1\1\30\uffff\1\1\1\uffff\1\1\2\uffff\1\1\12\uffff\2\1\1\100\15\1\16\uffff\2\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_126 = DFA.unpackEncodedStringToUnsignedChars(dfa_126s);
+    static final char[] dfa_127 = DFA.unpackEncodedStringToUnsignedChars(dfa_127s);
+    static final short[] dfa_128 = DFA.unpackEncodedString(dfa_128s);
+    static final short[][] dfa_129 = unpackEncodedStringArray(dfa_129s);
+
+    class DFA673 extends DFA {
+
+        public DFA673(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 673;
+            this.eot = dfa_119;
+            this.eof = dfa_120;
+            this.min = dfa_126;
+            this.max = dfa_127;
+            this.accept = dfa_123;
+            this.special = dfa_128;
+            this.transition = dfa_129;
+        }
+        public String getDescription() {
+            return "()* loopback of 54086:2: ( rule__MultiplicativeExpression__Group_1_1_3__0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA673_64 = input.LA(1);
+
+                         
+                        int index673_64 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred960_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index673_64);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 673, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_130s = "\1\4\100\uffff\1\0\2\uffff";
+    static final String dfa_131s = "\1\u011f\100\uffff\1\0\2\uffff";
+    static final String dfa_132s = "\101\uffff\1\0\2\uffff}>";
+    static final String[] dfa_133s = {
+            "\4\1\14\uffff\1\1\1\uffff\2\1\5\uffff\3\1\1\uffff\2\1\12\uffff\1\1\14\uffff\1\1\20\uffff\1\1\1\uffff\3\1\50\uffff\17\1\2\uffff\6\1\67\uffff\3\1\14\uffff\1\1\1\uffff\1\1\30\uffff\1\1\1\uffff\1\1\2\uffff\1\1\12\uffff\3\1\1\101\14\1\16\uffff\2\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            ""
+    };
+    static final char[] dfa_130 = DFA.unpackEncodedStringToUnsignedChars(dfa_130s);
+    static final char[] dfa_131 = DFA.unpackEncodedStringToUnsignedChars(dfa_131s);
+    static final short[] dfa_132 = DFA.unpackEncodedString(dfa_132s);
+    static final short[][] dfa_133 = unpackEncodedStringArray(dfa_133s);
+
+    class DFA674 extends DFA {
+
+        public DFA674(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 674;
+            this.eot = dfa_119;
+            this.eof = dfa_120;
+            this.min = dfa_130;
+            this.max = dfa_131;
+            this.accept = dfa_123;
+            this.special = dfa_132;
+            this.transition = dfa_133;
+        }
+        public String getDescription() {
+            return "()* loopback of 54248:2: ( rule__MultiplicativeExpression__Group_1_2_3__0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA674_65 = input.LA(1);
+
+                         
+                        int index674_65 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred961_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index674_65);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 674, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_134s = "\1\4\101\uffff\1\0\1\uffff";
+    static final String dfa_135s = "\1\u011f\101\uffff\1\0\1\uffff";
+    static final String dfa_136s = "\102\uffff\1\0\1\uffff}>";
+    static final String[] dfa_137s = {
+            "\4\1\14\uffff\1\1\1\uffff\2\1\5\uffff\3\1\1\uffff\2\1\12\uffff\1\1\14\uffff\1\1\20\uffff\1\1\1\uffff\3\1\50\uffff\17\1\2\uffff\6\1\67\uffff\3\1\14\uffff\1\1\1\uffff\1\1\30\uffff\1\1\1\uffff\1\1\2\uffff\1\1\12\uffff\4\1\1\102\13\1\16\uffff\2\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            ""
+    };
+    static final char[] dfa_134 = DFA.unpackEncodedStringToUnsignedChars(dfa_134s);
+    static final char[] dfa_135 = DFA.unpackEncodedStringToUnsignedChars(dfa_135s);
+    static final short[] dfa_136 = DFA.unpackEncodedString(dfa_136s);
+    static final short[][] dfa_137 = unpackEncodedStringArray(dfa_137s);
+
+    class DFA675 extends DFA {
+
+        public DFA675(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 675;
+            this.eot = dfa_119;
+            this.eof = dfa_120;
+            this.min = dfa_134;
+            this.max = dfa_135;
+            this.accept = dfa_123;
+            this.special = dfa_136;
+            this.transition = dfa_137;
+        }
+        public String getDescription() {
+            return "()* loopback of 54410:2: ( rule__MultiplicativeExpression__Group_1_3_3__0 )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA675_66 = input.LA(1);
+
+                         
+                        int index675_66 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred962_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index675_66);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 675, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_138s = "\105\uffff";
+    static final String dfa_139s = "\1\3\104\uffff";
+    static final String dfa_140s = "\1\4\2\0\102\uffff";
+    static final String dfa_141s = "\1\u011f\2\0\102\uffff";
+    static final String dfa_142s = "\3\uffff\1\2\100\uffff\1\1";
+    static final String dfa_143s = "\1\uffff\1\0\1\1\102\uffff}>";
+    static final String[] dfa_144s = {
+            "\4\3\14\uffff\2\3\1\1\1\2\5\uffff\3\3\1\uffff\2\3\12\uffff\1\3\14\uffff\1\3\20\uffff\1\3\1\uffff\3\3\50\uffff\17\3\2\uffff\6\3\67\uffff\3\3\14\uffff\1\3\1\uffff\1\3\30\uffff\1\3\1\uffff\1\3\2\uffff\1\3\12\uffff\20\3\16\uffff\2\3",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_138 = DFA.unpackEncodedString(dfa_138s);
+    static final short[] dfa_139 = DFA.unpackEncodedString(dfa_139s);
+    static final char[] dfa_140 = DFA.unpackEncodedStringToUnsignedChars(dfa_140s);
+    static final char[] dfa_141 = DFA.unpackEncodedStringToUnsignedChars(dfa_141s);
+    static final short[] dfa_142 = DFA.unpackEncodedString(dfa_142s);
+    static final short[] dfa_143 = DFA.unpackEncodedString(dfa_143s);
+    static final short[][] dfa_144 = unpackEncodedStringArray(dfa_144s);
+
+    class DFA678 extends DFA {
+
+        public DFA678(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 678;
+            this.eot = dfa_138;
+            this.eof = dfa_139;
+            this.min = dfa_140;
+            this.max = dfa_141;
+            this.accept = dfa_142;
+            this.special = dfa_143;
+            this.transition = dfa_144;
+        }
+        public String getDescription() {
+            return "55274:2: ( rule__PrimaryExpression__Alternatives_1_3 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA678_1 = input.LA(1);
+
+                         
+                        int index678_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred965_InternalFormalML()) ) {s = 68;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index678_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA678_2 = input.LA(1);
+
+                         
+                        int index678_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred965_InternalFormalML()) ) {s = 68;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index678_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 678, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_145s = "\1\3\103\uffff";
+    static final String dfa_146s = "\1\4\2\0\101\uffff";
+    static final String dfa_147s = "\1\u011f\2\0\101\uffff";
+    static final String dfa_148s = "\3\uffff\1\2\77\uffff\1\1";
+    static final String dfa_149s = "\1\uffff\1\0\1\1\101\uffff}>";
+    static final String[] dfa_150s = {
+            "\4\3\14\uffff\1\3\1\uffff\1\1\1\2\5\uffff\3\3\1\uffff\2\3\12\uffff\1\3\14\uffff\1\3\20\uffff\1\3\1\uffff\3\3\50\uffff\17\3\2\uffff\6\3\67\uffff\3\3\14\uffff\1\3\1\uffff\1\3\30\uffff\1\3\1\uffff\1\3\2\uffff\1\3\12\uffff\20\3\16\uffff\2\3",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[] dfa_145 = DFA.unpackEncodedString(dfa_145s);
+    static final char[] dfa_146 = DFA.unpackEncodedStringToUnsignedChars(dfa_146s);
+    static final char[] dfa_147 = DFA.unpackEncodedStringToUnsignedChars(dfa_147s);
+    static final short[] dfa_148 = DFA.unpackEncodedString(dfa_148s);
+    static final short[] dfa_149 = DFA.unpackEncodedString(dfa_149s);
+    static final short[][] dfa_150 = unpackEncodedStringArray(dfa_150s);
+
+    class DFA679 extends DFA {
+
+        public DFA679(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 679;
+            this.eot = dfa_119;
+            this.eof = dfa_145;
+            this.min = dfa_146;
+            this.max = dfa_147;
+            this.accept = dfa_148;
+            this.special = dfa_149;
+            this.transition = dfa_150;
+        }
+        public String getDescription() {
+            return "55545:2: ( rule__PrimaryExpression__Alternatives_2_3 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA679_1 = input.LA(1);
+
+                         
+                        int index679_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred966_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index679_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA679_2 = input.LA(1);
+
+                         
+                        int index679_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred966_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index679_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 679, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA681 extends DFA {
+
+        public DFA681(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 681;
+            this.eot = dfa_119;
+            this.eof = dfa_145;
+            this.min = dfa_146;
+            this.max = dfa_147;
+            this.accept = dfa_148;
+            this.special = dfa_149;
+            this.transition = dfa_150;
+        }
+        public String getDescription() {
+            return "55841:2: ( rule__PrimaryExpression__Alternatives_2_4_3 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA681_1 = input.LA(1);
+
+                         
+                        int index681_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred968_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index681_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA681_2 = input.LA(1);
+
+                         
+                        int index681_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred968_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index681_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 681, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_151s = "\131\uffff";
+    static final String dfa_152s = "\1\3\130\uffff";
+    static final String dfa_153s = "\1\4\2\0\126\uffff";
+    static final String dfa_154s = "\1\u011f\2\0\126\uffff";
+    static final String dfa_155s = "\3\uffff\1\2\124\uffff\1\1";
+    static final String dfa_156s = "\1\uffff\1\0\1\1\126\uffff}>";
+    static final String[] dfa_157s = {
+            "\4\3\14\uffff\2\3\1\1\1\2\5\uffff\3\3\1\uffff\2\3\12\uffff\1\3\14\uffff\1\3\20\uffff\1\3\1\uffff\3\3\24\uffff\43\3\2\uffff\6\3\67\uffff\3\3\14\uffff\1\3\1\uffff\1\3\30\uffff\1\3\1\uffff\1\3\2\uffff\1\3\12\uffff\20\3\16\uffff\2\3",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_151 = DFA.unpackEncodedString(dfa_151s);
+    static final short[] dfa_152 = DFA.unpackEncodedString(dfa_152s);
+    static final char[] dfa_153 = DFA.unpackEncodedStringToUnsignedChars(dfa_153s);
+    static final char[] dfa_154 = DFA.unpackEncodedStringToUnsignedChars(dfa_154s);
+    static final short[] dfa_155 = DFA.unpackEncodedString(dfa_155s);
+    static final short[] dfa_156 = DFA.unpackEncodedString(dfa_156s);
+    static final short[][] dfa_157 = unpackEncodedStringArray(dfa_157s);
+
+    class DFA692 extends DFA {
+
+        public DFA692(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 692;
+            this.eot = dfa_151;
+            this.eof = dfa_152;
+            this.min = dfa_153;
+            this.max = dfa_154;
+            this.accept = dfa_155;
+            this.special = dfa_156;
+            this.transition = dfa_157;
+        }
+        public String getDescription() {
+            return "58109:2: ( rule__LiteralReferenceElement__Alternatives_2 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA692_1 = input.LA(1);
+
+                         
+                        int index692_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred979_InternalFormalML()) ) {s = 88;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index692_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA692_2 = input.LA(1);
+
+                         
+                        int index692_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred979_InternalFormalML()) ) {s = 88;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index692_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 692, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_158s = "\1\34\11\uffff";
+    static final String dfa_159s = "\1\u0112\11\uffff";
+    static final String dfa_160s = "\1\uffff\10\1\1\2";
+    static final String dfa_161s = "\1\0\11\uffff}>";
+    static final String[] dfa_162s = {
+            "\1\4\12\uffff\1\11\147\uffff\1\1\1\2\1\3\1\7\1\10\175\uffff\1\5\1\6",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_158 = DFA.unpackEncodedStringToUnsignedChars(dfa_158s);
+    static final char[] dfa_159 = DFA.unpackEncodedStringToUnsignedChars(dfa_159s);
+    static final short[] dfa_160 = DFA.unpackEncodedString(dfa_160s);
+    static final short[] dfa_161 = DFA.unpackEncodedString(dfa_161s);
+    static final short[][] dfa_162 = unpackEncodedStringArray(dfa_162s);
+
+    class DFA705 extends DFA {
+
+        public DFA705(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 705;
+            this.eot = dfa_35;
+            this.eof = dfa_35;
+            this.min = dfa_158;
+            this.max = dfa_159;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_162;
+        }
+        public String getDescription() {
+            return "59881:2: ( rule__MachineBlock__UnorderedGroup_0__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA705_0 = input.LA(1);
+
+                         
+                        int index705_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA705_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 1;}
+
+                        else if ( LA705_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 2;}
+
+                        else if ( LA705_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 3;}
+
+                        else if ( LA705_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 4;}
+
+                        else if ( LA705_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {s = 5;}
+
+                        else if ( LA705_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {s = 6;}
+
+                        else if ( LA705_0 == 146 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {s = 7;}
+
+                        else if ( LA705_0 == 147 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {s = 8;}
+
+                        else if ( (LA705_0==39) ) {s = 9;}
+
+                         
+                        input.seek(index705_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 705, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_163s = "\1\11\11\uffff";
+    static final short[] dfa_163 = DFA.unpackEncodedString(dfa_163s);
+
+    class DFA707 extends DFA {
+
+        public DFA707(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 707;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_159;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_162;
+        }
+        public String getDescription() {
+            return "59955:2: ( rule__MachineBlock__UnorderedGroup_0__1 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA707_0 = input.LA(1);
+
+                         
+                        int index707_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA707_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 1;}
+
+                        else if ( LA707_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 2;}
+
+                        else if ( LA707_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 3;}
+
+                        else if ( LA707_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 4;}
+
+                        else if ( LA707_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {s = 5;}
+
+                        else if ( LA707_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {s = 6;}
+
+                        else if ( LA707_0 == 146 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {s = 7;}
+
+                        else if ( LA707_0 == 147 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {s = 8;}
+
+                        else if ( (LA707_0==EOF||LA707_0==39) ) {s = 9;}
+
+                         
+                        input.seek(index707_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 707, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA708 extends DFA {
+
+        public DFA708(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 708;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_159;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_162;
+        }
+        public String getDescription() {
+            return "59967:2: ( rule__MachineBlock__UnorderedGroup_0__2 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA708_0 = input.LA(1);
+
+                         
+                        int index708_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA708_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 1;}
+
+                        else if ( LA708_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 2;}
+
+                        else if ( LA708_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 3;}
+
+                        else if ( LA708_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 4;}
+
+                        else if ( LA708_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {s = 5;}
+
+                        else if ( LA708_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {s = 6;}
+
+                        else if ( LA708_0 == 146 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {s = 7;}
+
+                        else if ( LA708_0 == 147 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {s = 8;}
+
+                        else if ( (LA708_0==EOF||LA708_0==39) ) {s = 9;}
+
+                         
+                        input.seek(index708_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 708, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_164s = {
+            "\1\4\13\uffff\1\11\146\uffff\1\1\1\2\1\3\1\7\1\10\175\uffff\1\5\1\6",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_164 = unpackEncodedStringArray(dfa_164s);
+
+    class DFA715 extends DFA {
+
+        public DFA715(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 715;
+            this.eot = dfa_35;
+            this.eof = dfa_35;
+            this.min = dfa_158;
+            this.max = dfa_159;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_164;
+        }
+        public String getDescription() {
+            return "60157:2: ( rule__Statemachine__UnorderedGroup_1__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA715_0 = input.LA(1);
+
+                         
+                        int index715_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA715_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 1;}
+
+                        else if ( LA715_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 2;}
+
+                        else if ( LA715_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 3;}
+
+                        else if ( LA715_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 4;}
+
+                        else if ( LA715_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {s = 5;}
+
+                        else if ( LA715_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {s = 6;}
+
+                        else if ( LA715_0 == 146 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {s = 7;}
+
+                        else if ( LA715_0 == 147 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {s = 8;}
+
+                        else if ( (LA715_0==40) ) {s = 9;}
+
+                         
+                        input.seek(index715_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 715, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA717 extends DFA {
+
+        public DFA717(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 717;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_159;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_164;
+        }
+        public String getDescription() {
+            return "60231:2: ( rule__Statemachine__UnorderedGroup_1__1 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA717_0 = input.LA(1);
+
+                         
+                        int index717_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA717_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 1;}
+
+                        else if ( LA717_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 2;}
+
+                        else if ( LA717_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 3;}
+
+                        else if ( LA717_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 4;}
+
+                        else if ( LA717_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {s = 5;}
+
+                        else if ( LA717_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {s = 6;}
+
+                        else if ( LA717_0 == 146 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {s = 7;}
+
+                        else if ( LA717_0 == 147 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {s = 8;}
+
+                        else if ( (LA717_0==EOF||LA717_0==40) ) {s = 9;}
+
+                         
+                        input.seek(index717_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 717, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA718 extends DFA {
+
+        public DFA718(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 718;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_159;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_164;
+        }
+        public String getDescription() {
+            return "60243:2: ( rule__Statemachine__UnorderedGroup_1__2 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA718_0 = input.LA(1);
+
+                         
+                        int index718_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA718_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 1;}
+
+                        else if ( LA718_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 2;}
+
+                        else if ( LA718_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 3;}
+
+                        else if ( LA718_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 4;}
+
+                        else if ( LA718_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {s = 5;}
+
+                        else if ( LA718_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {s = 6;}
+
+                        else if ( LA718_0 == 146 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {s = 7;}
+
+                        else if ( LA718_0 == 147 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {s = 8;}
+
+                        else if ( (LA718_0==EOF||LA718_0==40) ) {s = 9;}
+
+                         
+                        input.seek(index718_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 718, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_165s = "\1\u00e2\11\uffff";
+    static final String[] dfa_166s = {
+            "\1\11\21\uffff\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\131\uffff\3\11\66\uffff\1\11\24\uffff\1\11\2\uffff\3\11",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_165 = DFA.unpackEncodedStringToUnsignedChars(dfa_165s);
+    static final short[][] dfa_166 = unpackEncodedStringArray(dfa_166s);
+
+    class DFA722 extends DFA {
+
+        public DFA722(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 722;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_165;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_166;
+        }
+        public String getDescription() {
+            return "60350:2: ( rule__ModelOfExecution__UnorderedGroup_3__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA722_0 = input.LA(1);
+
+                         
+                        int index722_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA722_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {s = 1;}
+
+                        else if ( LA722_0 == 47 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {s = 2;}
+
+                        else if ( LA722_0 == 48 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {s = 3;}
+
+                        else if ( LA722_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {s = 4;}
+
+                        else if ( LA722_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {s = 5;}
+
+                        else if ( LA722_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {s = 6;}
+
+                        else if ( LA722_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {s = 7;}
+
+                        else if ( LA722_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {s = 8;}
+
+                        else if ( (LA722_0==EOF||LA722_0==28||(LA722_0>=143 && LA722_0<=145)||LA722_0==200||LA722_0==221||(LA722_0>=224 && LA722_0<=226)) ) {s = 9;}
+
+                         
+                        input.seek(index722_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 722, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA724 extends DFA {
+
+        public DFA724(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 724;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_165;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_166;
+        }
+        public String getDescription() {
+            return "60499:2: ( rule__ModelOfExecution__UnorderedGroup_3__1 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA724_0 = input.LA(1);
+
+                         
+                        int index724_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA724_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {s = 1;}
+
+                        else if ( LA724_0 == 47 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {s = 2;}
+
+                        else if ( LA724_0 == 48 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {s = 3;}
+
+                        else if ( LA724_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {s = 4;}
+
+                        else if ( LA724_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {s = 5;}
+
+                        else if ( LA724_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {s = 6;}
+
+                        else if ( LA724_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {s = 7;}
+
+                        else if ( LA724_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {s = 8;}
+
+                        else if ( (LA724_0==EOF||LA724_0==28||(LA724_0>=143 && LA724_0<=145)||LA724_0==200||LA724_0==221||(LA724_0>=224 && LA724_0<=226)) ) {s = 9;}
+
+                         
+                        input.seek(index724_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 724, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA725 extends DFA {
+
+        public DFA725(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 725;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_165;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_166;
+        }
+        public String getDescription() {
+            return "60511:2: ( rule__ModelOfExecution__UnorderedGroup_3__2 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA725_0 = input.LA(1);
+
+                         
+                        int index725_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA725_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {s = 1;}
+
+                        else if ( LA725_0 == 47 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {s = 2;}
+
+                        else if ( LA725_0 == 48 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {s = 3;}
+
+                        else if ( LA725_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {s = 4;}
+
+                        else if ( LA725_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {s = 5;}
+
+                        else if ( LA725_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {s = 6;}
+
+                        else if ( LA725_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {s = 7;}
+
+                        else if ( LA725_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {s = 8;}
+
+                        else if ( (LA725_0==EOF||LA725_0==28||(LA725_0>=143 && LA725_0<=145)||LA725_0==200||LA725_0==221||(LA725_0>=224 && LA725_0<=226)) ) {s = 9;}
+
+                         
+                        input.seek(index725_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 725, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA726 extends DFA {
+
+        public DFA726(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 726;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_165;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_166;
+        }
+        public String getDescription() {
+            return "60523:2: ( rule__ModelOfExecution__UnorderedGroup_3__3 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA726_0 = input.LA(1);
+
+                         
+                        int index726_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA726_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {s = 1;}
+
+                        else if ( LA726_0 == 47 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {s = 2;}
+
+                        else if ( LA726_0 == 48 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {s = 3;}
+
+                        else if ( LA726_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {s = 4;}
+
+                        else if ( LA726_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {s = 5;}
+
+                        else if ( LA726_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {s = 6;}
+
+                        else if ( LA726_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {s = 7;}
+
+                        else if ( LA726_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {s = 8;}
+
+                        else if ( (LA726_0==EOF||LA726_0==28||(LA726_0>=143 && LA726_0<=145)||LA726_0==200||LA726_0==221||(LA726_0>=224 && LA726_0<=226)) ) {s = 9;}
+
+                         
+                        input.seek(index726_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 726, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA727 extends DFA {
+
+        public DFA727(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 727;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_165;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_166;
+        }
+        public String getDescription() {
+            return "60535:2: ( rule__ModelOfExecution__UnorderedGroup_3__4 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA727_0 = input.LA(1);
+
+                         
+                        int index727_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA727_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {s = 1;}
+
+                        else if ( LA727_0 == 47 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {s = 2;}
+
+                        else if ( LA727_0 == 48 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {s = 3;}
+
+                        else if ( LA727_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {s = 4;}
+
+                        else if ( LA727_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {s = 5;}
+
+                        else if ( LA727_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {s = 6;}
+
+                        else if ( LA727_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {s = 7;}
+
+                        else if ( LA727_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {s = 8;}
+
+                        else if ( (LA727_0==EOF||LA727_0==28||(LA727_0>=143 && LA727_0<=145)||LA727_0==200||LA727_0==221||(LA727_0>=224 && LA727_0<=226)) ) {s = 9;}
+
+                         
+                        input.seek(index727_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 727, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA728 extends DFA {
+
+        public DFA728(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 728;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_165;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_166;
+        }
+        public String getDescription() {
+            return "60547:2: ( rule__ModelOfExecution__UnorderedGroup_3__5 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA728_0 = input.LA(1);
+
+                         
+                        int index728_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA728_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {s = 1;}
+
+                        else if ( LA728_0 == 47 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {s = 2;}
+
+                        else if ( LA728_0 == 48 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {s = 3;}
+
+                        else if ( LA728_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {s = 4;}
+
+                        else if ( LA728_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {s = 5;}
+
+                        else if ( LA728_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {s = 6;}
+
+                        else if ( LA728_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {s = 7;}
+
+                        else if ( LA728_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {s = 8;}
+
+                        else if ( (LA728_0==EOF||LA728_0==28||(LA728_0>=143 && LA728_0<=145)||LA728_0==200||LA728_0==221||(LA728_0>=224 && LA728_0<=226)) ) {s = 9;}
+
+                         
+                        input.seek(index728_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 728, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA729 extends DFA {
+
+        public DFA729(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 729;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_165;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_166;
+        }
+        public String getDescription() {
+            return "60559:2: ( rule__ModelOfExecution__UnorderedGroup_3__6 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA729_0 = input.LA(1);
+
+                         
+                        int index729_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA729_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {s = 1;}
+
+                        else if ( LA729_0 == 47 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {s = 2;}
+
+                        else if ( LA729_0 == 48 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {s = 3;}
+
+                        else if ( LA729_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {s = 4;}
+
+                        else if ( LA729_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {s = 5;}
+
+                        else if ( LA729_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {s = 6;}
+
+                        else if ( LA729_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {s = 7;}
+
+                        else if ( LA729_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {s = 8;}
+
+                        else if ( (LA729_0==EOF||LA729_0==28||(LA729_0>=143 && LA729_0<=145)||LA729_0==200||LA729_0==221||(LA729_0>=224 && LA729_0<=226)) ) {s = 9;}
+
+                         
+                        input.seek(index729_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 729, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA730 extends DFA {
+
+        public DFA730(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 730;
+            this.eot = dfa_35;
+            this.eof = dfa_163;
+            this.min = dfa_158;
+            this.max = dfa_165;
+            this.accept = dfa_160;
+            this.special = dfa_161;
+            this.transition = dfa_166;
+        }
+        public String getDescription() {
+            return "60571:2: ( rule__ModelOfExecution__UnorderedGroup_3__7 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA730_0 = input.LA(1);
+
+                         
+                        int index730_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA730_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {s = 1;}
+
+                        else if ( LA730_0 == 47 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {s = 2;}
+
+                        else if ( LA730_0 == 48 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {s = 3;}
+
+                        else if ( LA730_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {s = 4;}
+
+                        else if ( LA730_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {s = 5;}
+
+                        else if ( LA730_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {s = 6;}
+
+                        else if ( LA730_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {s = 7;}
+
+                        else if ( LA730_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {s = 8;}
+
+                        else if ( (LA730_0==EOF||LA730_0==28||(LA730_0>=143 && LA730_0<=145)||LA730_0==200||LA730_0==221||(LA730_0>=224 && LA730_0<=226)) ) {s = 9;}
+
+                         
+                        input.seek(index730_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 730, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_167s = "\1\20\5\uffff\1\0\3\uffff\4\0\1\uffff";
+    static final String dfa_168s = "\1\u011b\5\uffff\1\0\3\uffff\4\0\1\uffff";
+    static final String dfa_169s = "\1\uffff\5\1\1\uffff\3\1\4\uffff\1\2";
+    static final String dfa_170s = "\1\3\5\uffff\1\4\3\uffff\1\1\1\5\1\2\1\0\1\uffff}>";
+    static final String[] dfa_171s = {
+            "\1\12\13\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\6\54\uffff\1\15\65\uffff\1\5\1\7\1\10\1\11\1\13\1\14",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+    static final char[] dfa_167 = DFA.unpackEncodedStringToUnsignedChars(dfa_167s);
+    static final char[] dfa_168 = DFA.unpackEncodedStringToUnsignedChars(dfa_168s);
+    static final short[] dfa_169 = DFA.unpackEncodedString(dfa_169s);
+    static final short[] dfa_170 = DFA.unpackEncodedString(dfa_170s);
+    static final short[][] dfa_171 = unpackEncodedStringArray(dfa_171s);
+
+    class DFA737 extends DFA {
+
+        public DFA737(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 737;
+            this.eot = dfa_29;
+            this.eof = dfa_29;
+            this.min = dfa_167;
+            this.max = dfa_168;
+            this.accept = dfa_169;
+            this.special = dfa_170;
+            this.transition = dfa_171;
+        }
+        public String getDescription() {
+            return "60759:2: ( rule__Variable__UnorderedGroup_0__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA737_13 = input.LA(1);
+
+                         
+                        int index737_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1035_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index737_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA737_10 = input.LA(1);
+
+                         
+                        int index737_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1035_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index737_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA737_12 = input.LA(1);
+
+                         
+                        int index737_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1035_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index737_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA737_0 = input.LA(1);
+
+                         
+                        int index737_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA737_0 == 143 && ( getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) || getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) ) {s = 1;}
+
+                        else if ( LA737_0 == 144 && ( getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) || getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) ) {s = 2;}
+
+                        else if ( LA737_0 == 145 && ( getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) || getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) ) {s = 3;}
+
+                        else if ( LA737_0 == 28 && ( getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) || getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) ) {s = 4;}
+
+                        else if ( LA737_0 == 278 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 5;}
+
+                        else if ( (LA737_0==179) ) {s = 6;}
+
+                        else if ( LA737_0 == 279 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 7;}
+
+                        else if ( LA737_0 == 280 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 8;}
+
+                        else if ( LA737_0 == 281 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (LA737_0==16) ) {s = 10;}
+
+                        else if ( (LA737_0==282) ) {s = 11;}
+
+                        else if ( (LA737_0==283) ) {s = 12;}
+
+                        else if ( (LA737_0==224) ) {s = 13;}
+
+                         
+                        input.seek(index737_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA737_6 = input.LA(1);
+
+                         
+                        int index737_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1035_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index737_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA737_11 = input.LA(1);
+
+                         
+                        int index737_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1035_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index737_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 737, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_172s = "\1\16\17\uffff";
+    static final String dfa_173s = "\1\20\5\uffff\1\0\3\uffff\5\0\1\uffff";
+    static final String dfa_174s = "\1\u011b\5\uffff\1\0\3\uffff\5\0\1\uffff";
+    static final String dfa_175s = "\1\uffff\5\1\1\uffff\3\1\5\uffff\1\2";
+    static final String dfa_176s = "\1\4\5\uffff\1\2\3\uffff\1\3\1\6\1\5\1\1\1\0\1\uffff}>";
+    static final String[] dfa_177s = {
+            "\1\12\13\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\6\54\uffff\1\15\65\uffff\1\5\1\7\1\10\1\11\1\13\1\14",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+    static final short[] dfa_172 = DFA.unpackEncodedString(dfa_172s);
+    static final char[] dfa_173 = DFA.unpackEncodedStringToUnsignedChars(dfa_173s);
+    static final char[] dfa_174 = DFA.unpackEncodedStringToUnsignedChars(dfa_174s);
+    static final short[] dfa_175 = DFA.unpackEncodedString(dfa_175s);
+    static final short[] dfa_176 = DFA.unpackEncodedString(dfa_176s);
+    static final short[][] dfa_177 = unpackEncodedStringArray(dfa_177s);
+
+    class DFA739 extends DFA {
+
+        public DFA739(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 739;
+            this.eot = dfa_64;
+            this.eof = dfa_172;
+            this.min = dfa_173;
+            this.max = dfa_174;
+            this.accept = dfa_175;
+            this.special = dfa_176;
+            this.transition = dfa_177;
+        }
+        public String getDescription() {
+            return "60818:2: ( rule__Variable__UnorderedGroup_0__1 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA739_14 = input.LA(1);
+
+                         
+                        int index739_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1037_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index739_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA739_13 = input.LA(1);
+
+                         
+                        int index739_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1037_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index739_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA739_6 = input.LA(1);
+
+                         
+                        int index739_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1037_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index739_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA739_10 = input.LA(1);
+
+                         
+                        int index739_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1037_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index739_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA739_0 = input.LA(1);
+
+                         
+                        int index739_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA739_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {s = 1;}
+
+                        else if ( LA739_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {s = 2;}
+
+                        else if ( LA739_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {s = 3;}
+
+                        else if ( LA739_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {s = 4;}
+
+                        else if ( LA739_0 == 278 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 5;}
+
+                        else if ( (LA739_0==179) ) {s = 6;}
+
+                        else if ( LA739_0 == 279 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 7;}
+
+                        else if ( LA739_0 == 280 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 8;}
+
+                        else if ( LA739_0 == 281 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (LA739_0==16) ) {s = 10;}
+
+                        else if ( (LA739_0==282) ) {s = 11;}
+
+                        else if ( (LA739_0==283) ) {s = 12;}
+
+                        else if ( (LA739_0==224) ) {s = 13;}
+
+                        else if ( (LA739_0==EOF) ) {s = 14;}
+
+                         
+                        input.seek(index739_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA739_12 = input.LA(1);
+
+                         
+                        int index739_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1037_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index739_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA739_11 = input.LA(1);
+
+                         
+                        int index739_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1037_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index739_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 739, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_178s = "\14\uffff";
+    static final String dfa_179s = "\1\17\11\uffff\1\0\1\uffff";
+    static final String dfa_180s = "\1\u0119\11\uffff\1\0\1\uffff";
+    static final String dfa_181s = "\1\uffff\11\1\1\uffff\1\2";
+    static final String dfa_182s = "\1\0\11\uffff\1\1\1\uffff}>";
+    static final String[] dfa_183s = {
+            "\1\12\14\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\6\142\uffff\1\5\1\7\1\10\1\11",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            ""
+    };
+
+    static final short[] dfa_178 = DFA.unpackEncodedString(dfa_178s);
+    static final char[] dfa_179 = DFA.unpackEncodedStringToUnsignedChars(dfa_179s);
+    static final char[] dfa_180 = DFA.unpackEncodedStringToUnsignedChars(dfa_180s);
+    static final short[] dfa_181 = DFA.unpackEncodedString(dfa_181s);
+    static final short[] dfa_182 = DFA.unpackEncodedString(dfa_182s);
+    static final short[][] dfa_183 = unpackEncodedStringArray(dfa_183s);
+
+    class DFA749 extends DFA {
+
+        public DFA749(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 749;
+            this.eot = dfa_178;
+            this.eof = dfa_178;
+            this.min = dfa_179;
+            this.max = dfa_180;
+            this.accept = dfa_181;
+            this.special = dfa_182;
+            this.transition = dfa_183;
+        }
+        public String getDescription() {
+            return "61091:2: ( rule__Buffer__UnorderedGroup_0__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA749_0 = input.LA(1);
+
+                         
+                        int index749_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA749_0 == 143 && ( getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) || getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) ) {s = 1;}
+
+                        else if ( LA749_0 == 144 && ( getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) || getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) ) {s = 2;}
+
+                        else if ( LA749_0 == 145 && ( getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) || getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) ) {s = 3;}
+
+                        else if ( LA749_0 == 28 && ( getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) || getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) ) {s = 4;}
+
+                        else if ( LA749_0 == 278 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 5;}
+
+                        else if ( LA749_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 6;}
+
+                        else if ( LA749_0 == 279 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 7;}
+
+                        else if ( LA749_0 == 280 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 8;}
+
+                        else if ( LA749_0 == 281 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (LA749_0==15) ) {s = 10;}
+
+                         
+                        input.seek(index749_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA749_10 = input.LA(1);
+
+                         
+                        int index749_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1047_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index749_10);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 749, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_184s = "\15\uffff";
+    static final String dfa_185s = "\1\13\14\uffff";
+    static final String dfa_186s = "\1\17\11\uffff\2\0\1\uffff";
+    static final String dfa_187s = "\1\u0119\11\uffff\2\0\1\uffff";
+    static final String dfa_188s = "\1\uffff\11\1\2\uffff\1\2";
+    static final String dfa_189s = "\1\1\11\uffff\1\2\1\0\1\uffff}>";
+    static final String[] dfa_190s = {
+            "\1\12\14\uffff\1\4\162\uffff\1\1\1\2\1\3\41\uffff\1\6\142\uffff\1\5\1\7\1\10\1\11",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            ""
+    };
+
+    static final short[] dfa_184 = DFA.unpackEncodedString(dfa_184s);
+    static final short[] dfa_185 = DFA.unpackEncodedString(dfa_185s);
+    static final char[] dfa_186 = DFA.unpackEncodedStringToUnsignedChars(dfa_186s);
+    static final char[] dfa_187 = DFA.unpackEncodedStringToUnsignedChars(dfa_187s);
+    static final short[] dfa_188 = DFA.unpackEncodedString(dfa_188s);
+    static final short[] dfa_189 = DFA.unpackEncodedString(dfa_189s);
+    static final short[][] dfa_190 = unpackEncodedStringArray(dfa_190s);
+
+    class DFA751 extends DFA {
+
+        public DFA751(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 751;
+            this.eot = dfa_184;
+            this.eof = dfa_185;
+            this.min = dfa_186;
+            this.max = dfa_187;
+            this.accept = dfa_188;
+            this.special = dfa_189;
+            this.transition = dfa_190;
+        }
+        public String getDescription() {
+            return "61150:2: ( rule__Buffer__UnorderedGroup_0__1 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA751_11 = input.LA(1);
+
+                         
+                        int index751_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1049_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index751_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA751_0 = input.LA(1);
+
+                         
+                        int index751_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA751_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {s = 1;}
+
+                        else if ( LA751_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {s = 2;}
+
+                        else if ( LA751_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {s = 3;}
+
+                        else if ( LA751_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {s = 4;}
+
+                        else if ( LA751_0 == 278 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 5;}
+
+                        else if ( LA751_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 6;}
+
+                        else if ( LA751_0 == 279 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 7;}
+
+                        else if ( LA751_0 == 280 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 8;}
+
+                        else if ( LA751_0 == 281 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (LA751_0==15) ) {s = 10;}
+
+                        else if ( (LA751_0==EOF) ) {s = 11;}
+
+                         
+                        input.seek(index751_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA751_10 = input.LA(1);
+
+                         
+                        int index751_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred1049_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index751_10);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 751, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+    
+    protected static class FollowSets000 {
+        public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x03C0000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000180000L});
+        public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000001800000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000004000L});
+        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000010000002L,0x0000000000000000L,0x0000000000038000L,0x0000000300400000L});
+        public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x00000000100E0002L,0x0000000000000000L,0x0008000000038000L,0x0000002000000000L,0x0000000003C00000L});
+        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x00001E0000000002L});
+        public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x00001E0000000002L,0x0000000000000000L,0x0000000000000000L,0x00000000A0000000L});
+        public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x0000000000038000L,0x0000000000000000L,0x0000000000060000L});
+        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L});
+        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000018000000L});
+        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000010000L});
+        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x00000000001000A0L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000000000042L});
+        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000000L});
+        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x00000000609000F0L,0x2000000000000000L,0x0000000000007E7EL,0x0000000000000080L,0x000000008000FFE0L});
+        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000200000000000L});
+        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000000000080L});
+        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000000000080L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000000100080L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000180100000L});
+        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000180100002L});
+        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000000000040L});
+        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000008000000L});
+        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000040L,0x2000000000000000L});
+        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000000000020L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x00000018100E0000L,0x0000000000000000L,0x0008000000038000L,0x0000002300407C00L,0x0000000003C00000L});
+        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000003C00L});
+        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000046000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000460078000L});
+        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000006000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000038000L});
+        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000040000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000040000L});
+        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000600000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000000000L,0x4000000000000000L});
+        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x00000000100E0000L,0x0000000000000000L,0x0008000000038000L,0x0000002000000000L,0x0000000003C00000L});
+        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x00000000100E8000L,0x0000000000000000L,0x0008000000038000L,0x0000002100000000L,0x000000000BC00000L});
+        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x00000000100E8002L,0x0000000000000000L,0x0008000000038000L,0x0000002100000000L,0x000000000BC00000L});
+        public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x0000000000038000L,0x0000000300000000L});
+        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000010000002L,0x0000000000000000L,0x0000000000038000L,0x0000000300000000L});
+        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x0000000000038000L,0x0000000300400000L});
+        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x00000000000F8000L,0x0000000000080000L,0x0000000000060000L});
+        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000010000002L,0x0000000000000000L,0x00000000000F8000L,0x0000000000080000L,0x0000000000060000L});
+        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x00000000000F8000L,0x0000000000000000L,0x0000000000060000L});
+        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000010000002L,0x0000000000000000L,0x00000000000F8000L,0x0000000000000000L,0x0000000000060000L});
+        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000018000000000L,0x2000000000000000L});
+        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000200000800020L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000200000800000L});
+        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000000L,0x0000000000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000080000000L});
+        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000008000000000L});
+        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000800020L,0x0000000000000000L,0x0000000000000000L,0x0000000000800080L});
+        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x00000000100E0000L,0x0000000000000000L,0x0008000000038000L,0x0000002001000000L,0x0000000003C00000L});
+        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000001810000000L,0x0000000000000000L,0x0000000000038000L,0x000000031E407C00L});
+        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x000000001E000000L});
+        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x03E81E0000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000020000100L,0x0000000000180000L});
+        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000800000L,0x0000000000000000L,0x0000000000000000L,0x0000000000800000L});
+        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0xF800008000068040L,0x00000000000007FFL,0x00007FF82020001EL,0x00003F8000300000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0xF800008000068040L,0x00000000000007FFL,0x00007FF82020001EL,0x00003F8000100000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0xF800008000868040L,0x00000000000007FFL,0x00007FF82020001EL,0x00003F8000100000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000200040L});
+        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0001A00020000000L});
+        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0001A00020000000L});
+        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000010000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000010000L});
+        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000010002L});
+        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000010002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0028000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000020000000L});
+        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000A00000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000010000000000L});
+        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x03C01E0000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000180000L});
+        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000420000000L});
+        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x00001E0000000000L});
+        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x03C0000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000180000L});
+        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000000020L,0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0040000000000000L});
+        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000200000000020L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x03C01E0000000000L,0x0000000000000000L,0x0000000000000000L,0x00000000A0000000L,0x0000000000180000L});
+        public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x003FC00000000000L});
+        public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x003FC00000000002L});
+        public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x003FC00000000000L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x003FC00000000002L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0002000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0013000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000800000000100L,0x0000000002000000L});
+        public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0013000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0013000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0040000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0200000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0013400000000000L,0x0000000000000000L,0x0000000000000000L,0x0000800000000100L,0x0000000002000000L});
+        public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0013400000000002L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0013400000000000L,0x0000000000000000L,0x0000000000000000L,0x0000800000000000L,0x0000000002000000L});
+        public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0040000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000180000L});
+        public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0008000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0001800000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+        public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0001800000000002L});
+        public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0001800000000000L});
+        public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x000000000FF00000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000800000000100L,0x0000000002000000L});
+        public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x03C0000000000000L});
+        public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000002000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0300000000000040L});
+        public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x00C0000000000000L});
+        public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000030000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000020000000L});
+        public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x003FC00010000000L,0x0000000000000000L,0x0000000000038000L,0x0000000300000000L});
+        public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000000A00020L,0x0000000000000000L,0x0000000000000000L,0x0000000000800080L});
+        public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000001800000000L});
+        public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000001800000000L});
+        public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000800000000L});
+        public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x000000000000C040L,0x0000000000000000L,0x00000F0040004000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000400040L});
+        public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0400000000000040L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000080000000L,0x2000000000000000L});
+        public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000000L,0x00000F0000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x000000000000C040L,0x0000000000000000L,0x00000F07C0004000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0001A00000000000L});
+        public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0001A00000000000L});
+        public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000000000000040L,0x2000000000000000L,0x0000000000006000L,0x0000000000000080L,0x000000000000F800L});
+        public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000000000008040L,0x0000000000000000L,0x00000F0000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000000L,0x0000000000006000L,0x0000000000000000L,0x000000000000F800L});
+        public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000000300000L});
+        public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000000000400000L});
+        public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x00000000000000C0L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_135 = new BitSet(new long[]{0xF800008000068040L,0x00000000000007FFL,0x00000FF80000001EL,0x0000078000100000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x0000000000038000L,0x0000002000000000L});
+        public static final BitSet FOLLOW_137 = new BitSet(new long[]{0xF800008000068060L,0x00000000000007FFL,0x000000180000001EL,0x0000038000100000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x7800000000000000L,0x0000000000000000L,0x000000000000001EL});
+        public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000000000080L,0x0000000000000000L,0x0000000000000010L,0x0000004000000000L});
+        public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x8000000000000000L,0x0000000000000007L,0x000000000000001EL});
+        public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000078L,0x000000000000001EL});
+        public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000180L,0x000000000000001EL});
+        public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000008000000000L});
+        public static final BitSet FOLLOW_144 = new BitSet(new long[]{0xF800000000000000L,0x20000000000001FFL,0x000000000000001EL});
+        public static final BitSet FOLLOW_145 = new BitSet(new long[]{0xF800000000000000L,0x00000000000001FFL,0x000000000000001EL,0x0000008000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000600L});
+        public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000010000000000L});
+        public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000020000000000L});
+        public static final BitSet FOLLOW_149 = new BitSet(new long[]{0xF800008000068000L,0x00000000000007FFL,0x000000180000001EL,0x0000038000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000040000000000L});
+        public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x0000000000400000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x0000000000000020L,0x0000000000000000L,0x0000000000000000L,0x0000040000000000L});
+        public static final BitSet FOLLOW_153 = new BitSet(new long[]{0xF800008000068000L,0x00000000000007FFL,0x00000FF80000001EL,0x0000078000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0000000000000000L,0x4000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_155 = new BitSet(new long[]{0x0400000000000080L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_156 = new BitSet(new long[]{0xF800008000068020L,0x00000000000007FFL,0x00000FF80000001EL,0x0000078000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_157 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000080000000000L});
+        public static final BitSet FOLLOW_158 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000140L});
+        public static final BitSet FOLLOW_159 = new BitSet(new long[]{0x0000000000000020L,0x0000000000000000L,0x0000000000000000L,0x0000080000000000L});
+        public static final BitSet FOLLOW_160 = new BitSet(new long[]{0x0000000000000020L,0x0000001000000000L});
+        public static final BitSet FOLLOW_161 = new BitSet(new long[]{0x00000000601000B0L,0x0000000000000000L,0x0000000000001E10L});
+        public static final BitSet FOLLOW_162 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000100000000000L});
+        public static final BitSet FOLLOW_163 = new BitSet(new long[]{0x0000000000000020L,0x0000000000000000L,0x0000000000000000L,0x0000100000000000L});
+        public static final BitSet FOLLOW_164 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000200000000000L});
+        public static final BitSet FOLLOW_165 = new BitSet(new long[]{0x0000000000000020L,0x0000000000000000L,0x0000000000000000L,0x0000200000000000L});
+        public static final BitSet FOLLOW_166 = new BitSet(new long[]{0x0000000000000020L,0x0000000000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_167 = new BitSet(new long[]{0x0000000010000000L,0x0000000000000000L,0x0008000000038000L,0x0000000000000000L,0x0000000003C00000L});
+        public static final BitSet FOLLOW_168 = new BitSet(new long[]{0x0000000000010000L,0x0000000000000000L,0x0008000000000000L,0x0000000100000000L,0x000000000C000000L});
+        public static final BitSet FOLLOW_169 = new BitSet(new long[]{0x0000200000000020L,0x0000001000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_170 = new BitSet(new long[]{0x0000000000010000L,0x0000000000000000L,0x0000000000000000L,0x0000000100000000L});
+        public static final BitSet FOLLOW_171 = new BitSet(new long[]{0x0000000000010000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000004000000L});
+        public static final BitSet FOLLOW_172 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000400000000000L});
+        public static final BitSet FOLLOW_173 = new BitSet(new long[]{0x0000000000000040L,0x0000001000000000L});
+        public static final BitSet FOLLOW_174 = new BitSet(new long[]{0x0000200000000020L,0x0000001000000000L});
+        public static final BitSet FOLLOW_175 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x00000F0000000000L});
+        public static final BitSet FOLLOW_176 = new BitSet(new long[]{0x0400000000000080L,0x4000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_177 = new BitSet(new long[]{0x0000000000008000L});
+        public static final BitSet FOLLOW_178 = new BitSet(new long[]{0x0000200000000020L});
+        public static final BitSet FOLLOW_179 = new BitSet(new long[]{0x0000000010008000L,0x0000000000000000L,0x0008000000038000L,0x0000000000000000L,0x0000000003C00000L});
+        public static final BitSet FOLLOW_180 = new BitSet(new long[]{0x0000000010020000L,0x0000000000000000L,0x0000000000038000L});
+        public static final BitSet FOLLOW_181 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000000L,0x0001A00000000000L});
+        public static final BitSet FOLLOW_182 = new BitSet(new long[]{0x0000200000800020L});
+        public static final BitSet FOLLOW_183 = new BitSet(new long[]{0x0000000010040000L,0x0000000000000000L,0x0000000000038000L});
+        public static final BitSet FOLLOW_184 = new BitSet(new long[]{0x0000000010080000L,0x0000000000000000L,0x0000000000038000L});
+        public static final BitSet FOLLOW_185 = new BitSet(new long[]{0x0000000000000042L,0x0000000000000000L,0x0001A00000000000L});
+        public static final BitSet FOLLOW_186 = new BitSet(new long[]{0x0000000000000040L,0x2000000000000000L,0x0000000000000000L,0x0000000000800080L});
+        public static final BitSet FOLLOW_187 = new BitSet(new long[]{0x0000000000A00040L,0x00000000FFFF3000L,0xFFFD800020006006L,0xEBF300000010019FL,0x000000003000FE60L});
+        public static final BitSet FOLLOW_188 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000800000L});
+        public static final BitSet FOLLOW_189 = new BitSet(new long[]{0x0000000000000000L,0x0000000000003000L,0x0000000000000000L,0x0033000000000000L});
+        public static final BitSet FOLLOW_190 = new BitSet(new long[]{0x0000000000A00040L,0x0000000000000000L,0xFFFD800020006006L,0xEBC000000010009FL,0x000000003000FE60L});
+        public static final BitSet FOLLOW_191 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000800000000000L});
+        public static final BitSet FOLLOW_192 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000800000000000L});
+        public static final BitSet FOLLOW_193 = new BitSet(new long[]{0x0000200000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_194 = new BitSet(new long[]{0x0000000000000080L,0x0000000000000000L,0x000E000000000010L,0x1008000000000200L});
+        public static final BitSet FOLLOW_195 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x000E000000000000L,0x1000000000000200L});
+        public static final BitSet FOLLOW_196 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0004000000000000L});
+        public static final BitSet FOLLOW_197 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x1000000000000000L});
+        public static final BitSet FOLLOW_198 = new BitSet(new long[]{0x0000000000000080L,0x0000000000000000L,0x0000000000000010L,0x0008000000000000L});
+        public static final BitSet FOLLOW_199 = new BitSet(new long[]{0x0000000000A00040L,0x00000000FFFF3000L,0xFFFD800020006006L,0xEBF300000010009FL,0x000000003000FE60L});
+        public static final BitSet FOLLOW_200 = new BitSet(new long[]{0x0000000000A00042L,0x0000000000000000L,0xFFFD800020006006L,0xEBC000000010009FL,0x000000003000FE60L});
+        public static final BitSet FOLLOW_201 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0010000000000000L});
+        public static final BitSet FOLLOW_202 = new BitSet(new long[]{0x0000000600000000L,0x000000000000C000L});
+        public static final BitSet FOLLOW_203 = new BitSet(new long[]{0x0000000060D000F0L,0x2000000000000000L,0x0000000000007E7EL,0x0340000000000080L,0x000000008000FFE0L});
+        public static final BitSet FOLLOW_204 = new BitSet(new long[]{0x0000000060D000F0L,0x2000000000000000L,0x0000000000007E7EL,0x0000000000000080L,0x000000008000FFE0L});
+        public static final BitSet FOLLOW_205 = new BitSet(new long[]{0x00000000609000F2L,0x2000000000000000L,0x0000000000007E7EL,0x0000000000000080L,0x000000008000FFE0L});
+        public static final BitSet FOLLOW_206 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0020000000000000L});
+        public static final BitSet FOLLOW_207 = new BitSet(new long[]{0x00000000609000F0L,0x2000000000000000L,0x0000000000007E7EL,0x0080000000000080L,0x000000008000FFE0L});
+        public static final BitSet FOLLOW_208 = new BitSet(new long[]{0x0000000000A00040L,0x00000000FFFF0000L,0xFFFD800020006006L,0xEBC000000010019FL,0x000000003000FE60L});
+        public static final BitSet FOLLOW_209 = new BitSet(new long[]{0x0000000000800000L,0x0000000300000000L,0x0000000000000000L,0x0400000000000000L});
+        public static final BitSet FOLLOW_210 = new BitSet(new long[]{0x0000000000800000L,0x0000000600000000L,0x0000000000000000L,0x0000000000800000L});
+        public static final BitSet FOLLOW_211 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L,0x0000000000000000L,0x1000000000000000L});
+        public static final BitSet FOLLOW_212 = new BitSet(new long[]{0x0000000000000002L,0x0000000800000000L,0x0000000000000000L,0x1000000000000000L});
+        public static final BitSet FOLLOW_213 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0800000000000000L});
+        public static final BitSet FOLLOW_214 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x2000000000000000L});
+        public static final BitSet FOLLOW_215 = new BitSet(new long[]{0x0000200000800040L,0x0000000000000000L,0x0000000000006006L,0x0000000000000000L,0x000000000000FE00L});
+        public static final BitSet FOLLOW_216 = new BitSet(new long[]{0x0000000000A00040L,0x0000000000000000L,0x0000000000006006L,0x0000000000000080L,0x000000000000FE00L});
+        public static final BitSet FOLLOW_217 = new BitSet(new long[]{0x0000000000800000L});
+        public static final BitSet FOLLOW_218 = new BitSet(new long[]{0x0000000000800040L,0x0000000000000000L,0x0000000000006006L,0x0000000000200000L,0x000000000000FE00L});
+        public static final BitSet FOLLOW_219 = new BitSet(new long[]{0x0000000000800040L,0x0000000000000000L,0x0000000000006000L,0x0000000000000000L,0x000000000000FE00L});
+        public static final BitSet FOLLOW_220 = new BitSet(new long[]{0x00002000609000F0L,0x2000000000000000L,0x0000000000007E7EL,0x0000000000000080L,0x000000008000FFE0L});
+        public static final BitSet FOLLOW_221 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0xFF8C000000000000L,0x000000000000001FL});
+        public static final BitSet FOLLOW_222 = new BitSet(new long[]{0x00000000609000F0L,0x2000000000000000L,0x0000000000007E7EL,0x0000000000200080L,0x000000008000FFE0L});
+        public static final BitSet FOLLOW_223 = new BitSet(new long[]{0x0000200000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000800000L});
+        public static final BitSet FOLLOW_224 = new BitSet(new long[]{0x0000000000800100L});
+        public static final BitSet FOLLOW_225 = new BitSet(new long[]{0x0000000000000100L});
+        public static final BitSet FOLLOW_226 = new BitSet(new long[]{0x00002000609000F0L,0x2000000000000000L,0x0000000000007E7EL,0x0000000000800080L,0x000000008000FFE0L});
+        public static final BitSet FOLLOW_227 = new BitSet(new long[]{0x0000000000000000L,0x00FFFFF000000000L});
+        public static final BitSet FOLLOW_228 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000000L,0x0000000000006000L,0x0000000000000000L,0x000000000000FE00L});
+        public static final BitSet FOLLOW_229 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000040000000L});
+        public static final BitSet FOLLOW_230 = new BitSet(new long[]{0x0000000400000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_231 = new BitSet(new long[]{0x0000000400000002L,0x0000000000008000L});
+        public static final BitSet FOLLOW_232 = new BitSet(new long[]{0x0000000200000000L,0x0000000000004000L});
+        public static final BitSet FOLLOW_233 = new BitSet(new long[]{0x0000000200000002L,0x0000000000004000L});
+        public static final BitSet FOLLOW_234 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
+        public static final BitSet FOLLOW_235 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
+        public static final BitSet FOLLOW_236 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
+        public static final BitSet FOLLOW_237 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
+        public static final BitSet FOLLOW_238 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0004000000000000L});
+        public static final BitSet FOLLOW_239 = new BitSet(new long[]{0x0000000000000000L,0x1F00000000000000L});
+        public static final BitSet FOLLOW_240 = new BitSet(new long[]{0x0000000000000000L,0xE000000000000000L,0x0000000000000001L});
+        public static final BitSet FOLLOW_241 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000018L});
+        public static final BitSet FOLLOW_242 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000018L});
+        public static final BitSet FOLLOW_243 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_244 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_245 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_246 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_247 = new BitSet(new long[]{0x0400000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x000000000000001CL});
+        public static final BitSet FOLLOW_248 = new BitSet(new long[]{0x0400000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x000000000000001CL});
+        public static final BitSet FOLLOW_249 = new BitSet(new long[]{0x0400000000000000L});
+        public static final BitSet FOLLOW_250 = new BitSet(new long[]{0x0400000000000002L});
+        public static final BitSet FOLLOW_251 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+        public static final BitSet FOLLOW_252 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+        public static final BitSet FOLLOW_253 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_254 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
+        public static final BitSet FOLLOW_255 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_256 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_257 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000006L});
+        public static final BitSet FOLLOW_258 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+        public static final BitSet FOLLOW_259 = new BitSet(new long[]{0x0000000000100002L});
+        public static final BitSet FOLLOW_260 = new BitSet(new long[]{0x0000000000100000L});
+        public static final BitSet FOLLOW_261 = new BitSet(new long[]{0x0000000000C00000L});
+        public static final BitSet FOLLOW_262 = new BitSet(new long[]{0x0000000000200000L});
+        public static final BitSet FOLLOW_263 = new BitSet(new long[]{0x0000000000D00000L});
+        public static final BitSet FOLLOW_264 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_265 = new BitSet(new long[]{0x0000000000800000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_266 = new BitSet(new long[]{0x0000000080000000L,0x0000000000000000L,0x0000000000000180L});
+        public static final BitSet FOLLOW_267 = new BitSet(new long[]{0x0000000060000000L});
+        public static final BitSet FOLLOW_268 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_269 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000600L});
+        public static final BitSet FOLLOW_270 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_271 = new BitSet(new long[]{0x00000000609000F0L,0x2000000000000000L,0x0000000000007E7EL,0x0000000000000180L,0x000000008000FFE0L});
+        public static final BitSet FOLLOW_272 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_273 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000600L});
+        public static final BitSet FOLLOW_274 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_275 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000001000L});
+        public static final BitSet FOLLOW_276 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000002000L});
+        public static final BitSet FOLLOW_277 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000004000L});
+        public static final BitSet FOLLOW_278 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_279 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000006000L,0x0000000000000000L,0x000000000000F800L});
+        public static final BitSet FOLLOW_280 = new BitSet(new long[]{0x0000000000500000L});
+        public static final BitSet FOLLOW_281 = new BitSet(new long[]{0x0000000010000002L,0x0000000000000000L,0x0000000000038000L,0x0000000000000000L,0x0000000000060000L});
+        public static final BitSet FOLLOW_282 = new BitSet(new long[]{0x0028000000000002L});
+        public static final BitSet FOLLOW_283 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000420000000L});
+        public static final BitSet FOLLOW_284 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0008000000000000L,0x0000000000000000L,0x0000000003C00000L});
+        public static final BitSet FOLLOW_285 = new BitSet(new long[]{0x0000000010000002L,0x0000000000000000L,0x0008000000038000L,0x0000000000000000L,0x0000000003C00000L});
+        public static final BitSet FOLLOW_286 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0008000000000000L,0x0000000100000000L,0x0000000008000000L});
+        public static final BitSet FOLLOW_287 = new BitSet(new long[]{0x0000000000000002L,0x0000000300000000L,0x0000000000000000L,0x0400000000000000L});
+        public static final BitSet FOLLOW_288 = new BitSet(new long[]{0x0000000000000002L,0x0000000600000000L,0x0000000000000000L,0x0000000000800000L});
+    }
+
+
+}
+
+@SuppressWarnings("all")
+abstract class InternalFormalMLParser2 extends InternalFormalMLParser1 {
+
+        InternalFormalMLParser2(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+
+        InternalFormalMLParser2(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+        }
+
+    // $ANTLR start "entryRuleXlia"
+    // InternalFormalML.g:63:1: entryRuleXlia : ruleXlia EOF ;
+    public final void entryRuleXlia() throws RecognitionException {
+        try {
+            // InternalFormalML.g:64:1: ( ruleXlia EOF )
+            // InternalFormalML.g:65:1: ruleXlia EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleXlia();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXlia"
+
+
+    // $ANTLR start "ruleXlia"
+    // InternalFormalML.g:72:1: ruleXlia : ( ( rule__Xlia__Group__0 ) ) ;
+    public final void ruleXlia() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:76:2: ( ( ( rule__Xlia__Group__0 ) ) )
+            // InternalFormalML.g:77:2: ( ( rule__Xlia__Group__0 ) )
+            {
+            // InternalFormalML.g:77:2: ( ( rule__Xlia__Group__0 ) )
+            // InternalFormalML.g:78:3: ( rule__Xlia__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAccess().getGroup()); 
+            }
+            // InternalFormalML.g:79:3: ( rule__Xlia__Group__0 )
+            // InternalFormalML.g:79:4: rule__Xlia__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Xlia__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXlia"
+
+
+    // $ANTLR start "entryRuleXliaPrologObject"
+    // InternalFormalML.g:88:1: entryRuleXliaPrologObject : ruleXliaPrologObject EOF ;
+    public final void entryRuleXliaPrologObject() throws RecognitionException {
+        try {
+            // InternalFormalML.g:89:1: ( ruleXliaPrologObject EOF )
+            // InternalFormalML.g:90:1: ruleXliaPrologObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleXliaPrologObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXliaPrologObject"
+
+
+    // $ANTLR start "ruleXliaPrologObject"
+    // InternalFormalML.g:97:1: ruleXliaPrologObject : ( ( rule__XliaPrologObject__Group__0 ) ) ;
+    public final void ruleXliaPrologObject() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:101:2: ( ( ( rule__XliaPrologObject__Group__0 ) ) )
+            // InternalFormalML.g:102:2: ( ( rule__XliaPrologObject__Group__0 ) )
+            {
+            // InternalFormalML.g:102:2: ( ( rule__XliaPrologObject__Group__0 ) )
+            // InternalFormalML.g:103:3: ( rule__XliaPrologObject__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectAccess().getGroup()); 
+            }
+            // InternalFormalML.g:104:3: ( rule__XliaPrologObject__Group__0 )
+            // InternalFormalML.g:104:4: rule__XliaPrologObject__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologObject__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXliaPrologObject"
+
+
+    // $ANTLR start "entryRuleXliaPrologAttribute"
+    // InternalFormalML.g:113:1: entryRuleXliaPrologAttribute : ruleXliaPrologAttribute EOF ;
+    public final void entryRuleXliaPrologAttribute() throws RecognitionException {
+        try {
+            // InternalFormalML.g:114:1: ( ruleXliaPrologAttribute EOF )
+            // InternalFormalML.g:115:1: ruleXliaPrologAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologAttributeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleXliaPrologAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologAttributeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXliaPrologAttribute"
+
+
+    // $ANTLR start "ruleXliaPrologAttribute"
+    // InternalFormalML.g:122:1: ruleXliaPrologAttribute : ( ( rule__XliaPrologAttribute__Group__0 ) ) ;
+    public final void ruleXliaPrologAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:126:2: ( ( ( rule__XliaPrologAttribute__Group__0 ) ) )
+            // InternalFormalML.g:127:2: ( ( rule__XliaPrologAttribute__Group__0 ) )
+            {
+            // InternalFormalML.g:127:2: ( ( rule__XliaPrologAttribute__Group__0 ) )
+            // InternalFormalML.g:128:3: ( rule__XliaPrologAttribute__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologAttributeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:129:3: ( rule__XliaPrologAttribute__Group__0 )
+            // InternalFormalML.g:129:4: rule__XliaPrologAttribute__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologAttribute__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologAttributeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXliaPrologAttribute"
+
+
+    // $ANTLR start "entryRuleXliaOptionObject"
+    // InternalFormalML.g:138:1: entryRuleXliaOptionObject : ruleXliaOptionObject EOF ;
+    public final void entryRuleXliaOptionObject() throws RecognitionException {
+        try {
+            // InternalFormalML.g:139:1: ( ruleXliaOptionObject EOF )
+            // InternalFormalML.g:140:1: ruleXliaOptionObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaOptionObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleXliaOptionObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaOptionObjectRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXliaOptionObject"
+
+
+    // $ANTLR start "ruleXliaOptionObject"
+    // InternalFormalML.g:147:1: ruleXliaOptionObject : ( ( rule__XliaOptionObject__Group__0 ) ) ;
+    public final void ruleXliaOptionObject() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:151:2: ( ( ( rule__XliaOptionObject__Group__0 ) ) )
+            // InternalFormalML.g:152:2: ( ( rule__XliaOptionObject__Group__0 ) )
+            {
+            // InternalFormalML.g:152:2: ( ( rule__XliaOptionObject__Group__0 ) )
+            // InternalFormalML.g:153:3: ( rule__XliaOptionObject__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaOptionObjectAccess().getGroup()); 
+            }
+            // InternalFormalML.g:154:3: ( rule__XliaOptionObject__Group__0 )
+            // InternalFormalML.g:154:4: rule__XliaOptionObject__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaOptionObject__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaOptionObjectAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXliaOptionObject"
+
+
+    // $ANTLR start "entryRuleXliaNamedElement"
+    // InternalFormalML.g:163:1: entryRuleXliaNamedElement : ruleXliaNamedElement EOF ;
+    public final void entryRuleXliaNamedElement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:164:1: ( ruleXliaNamedElement EOF )
+            // InternalFormalML.g:165:1: ruleXliaNamedElement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaNamedElementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleXliaNamedElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaNamedElementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXliaNamedElement"
+
+
+    // $ANTLR start "ruleXliaNamedElement"
+    // InternalFormalML.g:172:1: ruleXliaNamedElement : ( ( rule__XliaNamedElement__Alternatives ) ) ;
+    public final void ruleXliaNamedElement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:176:2: ( ( ( rule__XliaNamedElement__Alternatives ) ) )
+            // InternalFormalML.g:177:2: ( ( rule__XliaNamedElement__Alternatives ) )
+            {
+            // InternalFormalML.g:177:2: ( ( rule__XliaNamedElement__Alternatives ) )
+            // InternalFormalML.g:178:3: ( rule__XliaNamedElement__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaNamedElementAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:179:3: ( rule__XliaNamedElement__Alternatives )
+            // InternalFormalML.g:179:4: rule__XliaNamedElement__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaNamedElement__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaNamedElementAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXliaNamedElement"
+
+
+    // $ANTLR start "entryRuleXliaObject"
+    // InternalFormalML.g:188:1: entryRuleXliaObject : ruleXliaObject EOF ;
+    public final void entryRuleXliaObject() throws RecognitionException {
+        try {
+            // InternalFormalML.g:189:1: ( ruleXliaObject EOF )
+            // InternalFormalML.g:190:1: ruleXliaObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleXliaObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaObjectRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXliaObject"
+
+
+    // $ANTLR start "ruleXliaObject"
+    // InternalFormalML.g:197:1: ruleXliaObject : ( ( rule__XliaObject__Group__0 ) ) ;
+    public final void ruleXliaObject() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:201:2: ( ( ( rule__XliaObject__Group__0 ) ) )
+            // InternalFormalML.g:202:2: ( ( rule__XliaObject__Group__0 ) )
+            {
+            // InternalFormalML.g:202:2: ( ( rule__XliaObject__Group__0 ) )
+            // InternalFormalML.g:203:3: ( rule__XliaObject__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaObjectAccess().getGroup()); 
+            }
+            // InternalFormalML.g:204:3: ( rule__XliaObject__Group__0 )
+            // InternalFormalML.g:204:4: rule__XliaObject__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaObject__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaObjectAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXliaObject"
+
+
+    // $ANTLR start "entryRuleXliaAttribute"
+    // InternalFormalML.g:213:1: entryRuleXliaAttribute : ruleXliaAttribute EOF ;
+    public final void entryRuleXliaAttribute() throws RecognitionException {
+        try {
+            // InternalFormalML.g:214:1: ( ruleXliaAttribute EOF )
+            // InternalFormalML.g:215:1: ruleXliaAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAttributeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleXliaAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAttributeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXliaAttribute"
+
+
+    // $ANTLR start "ruleXliaAttribute"
+    // InternalFormalML.g:222:1: ruleXliaAttribute : ( ( rule__XliaAttribute__Group__0 ) ) ;
+    public final void ruleXliaAttribute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:226:2: ( ( ( rule__XliaAttribute__Group__0 ) ) )
+            // InternalFormalML.g:227:2: ( ( rule__XliaAttribute__Group__0 ) )
+            {
+            // InternalFormalML.g:227:2: ( ( rule__XliaAttribute__Group__0 ) )
+            // InternalFormalML.g:228:3: ( rule__XliaAttribute__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAttributeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:229:3: ( rule__XliaAttribute__Group__0 )
+            // InternalFormalML.g:229:4: rule__XliaAttribute__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaAttribute__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAttributeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXliaAttribute"
+
+
+    // $ANTLR start "entryRuleEBoolean"
+    // InternalFormalML.g:238:1: entryRuleEBoolean : ruleEBoolean EOF ;
+    public final void entryRuleEBoolean() throws RecognitionException {
+        try {
+            // InternalFormalML.g:239:1: ( ruleEBoolean EOF )
+            // InternalFormalML.g:240:1: ruleEBoolean EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEBooleanRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEBoolean();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEBooleanRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEBoolean"
+
+
+    // $ANTLR start "ruleEBoolean"
+    // InternalFormalML.g:247:1: ruleEBoolean : ( ( rule__EBoolean__Alternatives ) ) ;
+    public final void ruleEBoolean() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:251:2: ( ( ( rule__EBoolean__Alternatives ) ) )
+            // InternalFormalML.g:252:2: ( ( rule__EBoolean__Alternatives ) )
+            {
+            // InternalFormalML.g:252:2: ( ( rule__EBoolean__Alternatives ) )
+            // InternalFormalML.g:253:3: ( rule__EBoolean__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEBooleanAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:254:3: ( rule__EBoolean__Alternatives )
+            // InternalFormalML.g:254:4: rule__EBoolean__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EBoolean__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEBooleanAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEBoolean"
+
+
+    // $ANTLR start "entryRuleEInt"
+    // InternalFormalML.g:263:1: entryRuleEInt : ruleEInt EOF ;
+    public final void entryRuleEInt() throws RecognitionException {
+        try {
+            // InternalFormalML.g:264:1: ( ruleEInt EOF )
+            // InternalFormalML.g:265:1: ruleEInt EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEIntRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEIntRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEInt"
+
+
+    // $ANTLR start "ruleEInt"
+    // InternalFormalML.g:272:1: ruleEInt : ( ( rule__EInt__Group__0 ) ) ;
+    public final void ruleEInt() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:276:2: ( ( ( rule__EInt__Group__0 ) ) )
+            // InternalFormalML.g:277:2: ( ( rule__EInt__Group__0 ) )
+            {
+            // InternalFormalML.g:277:2: ( ( rule__EInt__Group__0 ) )
+            // InternalFormalML.g:278:3: ( rule__EInt__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEIntAccess().getGroup()); 
+            }
+            // InternalFormalML.g:279:3: ( rule__EInt__Group__0 )
+            // InternalFormalML.g:279:4: rule__EInt__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EInt__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEIntAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEInt"
+
+
+    // $ANTLR start "entryRuleEInteger"
+    // InternalFormalML.g:288:1: entryRuleEInteger : ruleEInteger EOF ;
+    public final void entryRuleEInteger() throws RecognitionException {
+        try {
+            // InternalFormalML.g:289:1: ( ruleEInteger EOF )
+            // InternalFormalML.g:290:1: ruleEInteger EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEIntegerRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEInteger();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEIntegerRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEInteger"
+
+
+    // $ANTLR start "ruleEInteger"
+    // InternalFormalML.g:297:1: ruleEInteger : ( ( rule__EInteger__Group__0 ) ) ;
+    public final void ruleEInteger() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:301:2: ( ( ( rule__EInteger__Group__0 ) ) )
+            // InternalFormalML.g:302:2: ( ( rule__EInteger__Group__0 ) )
+            {
+            // InternalFormalML.g:302:2: ( ( rule__EInteger__Group__0 ) )
+            // InternalFormalML.g:303:3: ( rule__EInteger__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEIntegerAccess().getGroup()); 
+            }
+            // InternalFormalML.g:304:3: ( rule__EInteger__Group__0 )
+            // InternalFormalML.g:304:4: rule__EInteger__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EInteger__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEIntegerAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEInteger"
+
+
+    // $ANTLR start "entryRuleEDouble"
+    // InternalFormalML.g:313:1: entryRuleEDouble : ruleEDouble EOF ;
+    public final void entryRuleEDouble() throws RecognitionException {
+        try {
+            // InternalFormalML.g:314:1: ( ruleEDouble EOF )
+            // InternalFormalML.g:315:1: ruleEDouble EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEDouble"
+
+
+    // $ANTLR start "ruleEDouble"
+    // InternalFormalML.g:322:1: ruleEDouble : ( ( rule__EDouble__Group__0 ) ) ;
+    public final void ruleEDouble() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:326:2: ( ( ( rule__EDouble__Group__0 ) ) )
+            // InternalFormalML.g:327:2: ( ( rule__EDouble__Group__0 ) )
+            {
+            // InternalFormalML.g:327:2: ( ( rule__EDouble__Group__0 ) )
+            // InternalFormalML.g:328:3: ( rule__EDouble__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getGroup()); 
+            }
+            // InternalFormalML.g:329:3: ( rule__EDouble__Group__0 )
+            // InternalFormalML.g:329:4: rule__EDouble__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEDouble"
+
+
+    // $ANTLR start "entryRuleECharacter"
+    // InternalFormalML.g:338:1: entryRuleECharacter : ruleECharacter EOF ;
+    public final void entryRuleECharacter() throws RecognitionException {
+        try {
+            // InternalFormalML.g:339:1: ( ruleECharacter EOF )
+            // InternalFormalML.g:340:1: ruleECharacter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getECharacterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleECharacter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getECharacterRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleECharacter"
+
+
+    // $ANTLR start "ruleECharacter"
+    // InternalFormalML.g:347:1: ruleECharacter : ( RULE_CHARACTER ) ;
+    public final void ruleECharacter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:351:2: ( ( RULE_CHARACTER ) )
+            // InternalFormalML.g:352:2: ( RULE_CHARACTER )
+            {
+            // InternalFormalML.g:352:2: ( RULE_CHARACTER )
+            // InternalFormalML.g:353:3: RULE_CHARACTER
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getECharacterAccess().getCHARACTERTerminalRuleCall()); 
+            }
+            match(input,RULE_CHARACTER,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getECharacterAccess().getCHARACTERTerminalRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleECharacter"
+
+
+    // $ANTLR start "entryRuleEString"
+    // InternalFormalML.g:363:1: entryRuleEString : ruleEString EOF ;
+    public final void entryRuleEString() throws RecognitionException {
+        try {
+            // InternalFormalML.g:364:1: ( ruleEString EOF )
+            // InternalFormalML.g:365:1: ruleEString EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEStringRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEStringRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEString"
+
+
+    // $ANTLR start "ruleEString"
+    // InternalFormalML.g:372:1: ruleEString : ( RULE_STRING ) ;
+    public final void ruleEString() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:376:2: ( ( RULE_STRING ) )
+            // InternalFormalML.g:377:2: ( RULE_STRING )
+            {
+            // InternalFormalML.g:377:2: ( RULE_STRING )
+            // InternalFormalML.g:378:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall()); 
+            }
+            match(input,RULE_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEString"
+
+
+    // $ANTLR start "entryRuleESIdentifier"
+    // InternalFormalML.g:388:1: entryRuleESIdentifier : ruleESIdentifier EOF ;
+    public final void entryRuleESIdentifier() throws RecognitionException {
+        try {
+            // InternalFormalML.g:389:1: ( ruleESIdentifier EOF )
+            // InternalFormalML.g:390:1: ruleESIdentifier EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getESIdentifierRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getESIdentifierRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleESIdentifier"
+
+
+    // $ANTLR start "ruleESIdentifier"
+    // InternalFormalML.g:397:1: ruleESIdentifier : ( RULE_XLIA_ID ) ;
+    public final void ruleESIdentifier() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:401:2: ( ( RULE_XLIA_ID ) )
+            // InternalFormalML.g:402:2: ( RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:402:2: ( RULE_XLIA_ID )
+            // InternalFormalML.g:403:3: RULE_XLIA_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getESIdentifierAccess().getXLIA_IDTerminalRuleCall()); 
+            }
+            match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getESIdentifierAccess().getXLIA_IDTerminalRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleESIdentifier"
+
+
+    // $ANTLR start "entryRuleESUfid"
+    // InternalFormalML.g:413:1: entryRuleESUfid : ruleESUfid EOF ;
+    public final void entryRuleESUfid() throws RecognitionException {
+        try {
+            // InternalFormalML.g:414:1: ( ruleESUfid EOF )
+            // InternalFormalML.g:415:1: ruleESUfid EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getESUfidRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getESUfidRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleESUfid"
+
+
+    // $ANTLR start "ruleESUfid"
+    // InternalFormalML.g:422:1: ruleESUfid : ( ( rule__ESUfid__Group__0 ) ) ;
+    public final void ruleESUfid() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:426:2: ( ( ( rule__ESUfid__Group__0 ) ) )
+            // InternalFormalML.g:427:2: ( ( rule__ESUfid__Group__0 ) )
+            {
+            // InternalFormalML.g:427:2: ( ( rule__ESUfid__Group__0 ) )
+            // InternalFormalML.g:428:3: ( rule__ESUfid__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getESUfidAccess().getGroup()); 
+            }
+            // InternalFormalML.g:429:3: ( rule__ESUfid__Group__0 )
+            // InternalFormalML.g:429:4: rule__ESUfid__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ESUfid__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getESUfidAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleESUfid"
+
+
+    // $ANTLR start "entryRuleUnrestrictedName"
+    // InternalFormalML.g:438:1: entryRuleUnrestrictedName : ruleUnrestrictedName EOF ;
+    public final void entryRuleUnrestrictedName() throws RecognitionException {
+        try {
+            // InternalFormalML.g:439:1: ( ruleUnrestrictedName EOF )
+            // InternalFormalML.g:440:1: ruleUnrestrictedName EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnrestrictedNameRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnrestrictedNameRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleUnrestrictedName"
+
+
+    // $ANTLR start "ruleUnrestrictedName"
+    // InternalFormalML.g:447:1: ruleUnrestrictedName : ( RULE_STRING ) ;
+    public final void ruleUnrestrictedName() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:451:2: ( ( RULE_STRING ) )
+            // InternalFormalML.g:452:2: ( RULE_STRING )
+            {
+            // InternalFormalML.g:452:2: ( RULE_STRING )
+            // InternalFormalML.g:453:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnrestrictedNameAccess().getSTRINGTerminalRuleCall()); 
+            }
+            match(input,RULE_STRING,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnrestrictedNameAccess().getSTRINGTerminalRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleUnrestrictedName"
+
+
+    // $ANTLR start "entryRuleUnqualifiedName"
+    // InternalFormalML.g:463:1: entryRuleUnqualifiedName : ruleUnqualifiedName EOF ;
+    public final void entryRuleUnqualifiedName() throws RecognitionException {
+        try {
+            // InternalFormalML.g:464:1: ( ruleUnqualifiedName EOF )
+            // InternalFormalML.g:465:1: ruleUnqualifiedName EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnqualifiedNameRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleUnqualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnqualifiedNameRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleUnqualifiedName"
+
+
+    // $ANTLR start "ruleUnqualifiedName"
+    // InternalFormalML.g:472:1: ruleUnqualifiedName : ( ( rule__UnqualifiedName__NameBindingAssignment ) ) ;
+    public final void ruleUnqualifiedName() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:476:2: ( ( ( rule__UnqualifiedName__NameBindingAssignment ) ) )
+            // InternalFormalML.g:477:2: ( ( rule__UnqualifiedName__NameBindingAssignment ) )
+            {
+            // InternalFormalML.g:477:2: ( ( rule__UnqualifiedName__NameBindingAssignment ) )
+            // InternalFormalML.g:478:3: ( rule__UnqualifiedName__NameBindingAssignment )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnqualifiedNameAccess().getNameBindingAssignment()); 
+            }
+            // InternalFormalML.g:479:3: ( rule__UnqualifiedName__NameBindingAssignment )
+            // InternalFormalML.g:479:4: rule__UnqualifiedName__NameBindingAssignment
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnqualifiedName__NameBindingAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnqualifiedNameAccess().getNameBindingAssignment()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleUnqualifiedName"
+
+
+    // $ANTLR start "entryRuleNameBinding"
+    // InternalFormalML.g:488:1: entryRuleNameBinding : ruleNameBinding EOF ;
+    public final void entryRuleNameBinding() throws RecognitionException {
+        try {
+            // InternalFormalML.g:489:1: ( ruleNameBinding EOF )
+            // InternalFormalML.g:490:1: ruleNameBinding EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNameBindingRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleNameBinding();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNameBindingRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNameBinding"
+
+
+    // $ANTLR start "ruleNameBinding"
+    // InternalFormalML.g:497:1: ruleNameBinding : ( RULE_XLIA_ID ) ;
+    public final void ruleNameBinding() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:501:2: ( ( RULE_XLIA_ID ) )
+            // InternalFormalML.g:502:2: ( RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:502:2: ( RULE_XLIA_ID )
+            // InternalFormalML.g:503:3: RULE_XLIA_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNameBindingAccess().getXLIA_IDTerminalRuleCall()); 
+            }
+            match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNameBindingAccess().getXLIA_IDTerminalRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleNameBinding"
+
+
+    // $ANTLR start "entryRuleSystem"
+    // InternalFormalML.g:513:1: entryRuleSystem : ruleSystem EOF ;
+    public final void entryRuleSystem() throws RecognitionException {
+        try {
+            // InternalFormalML.g:514:1: ( ruleSystem EOF )
+            // InternalFormalML.g:515:1: ruleSystem EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSystem();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSystem"
+
+
+    // $ANTLR start "ruleSystem"
+    // InternalFormalML.g:522:1: ruleSystem : ( ( rule__System__Group__0 ) ) ;
+    public final void ruleSystem() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:526:2: ( ( ( rule__System__Group__0 ) ) )
+            // InternalFormalML.g:527:2: ( ( rule__System__Group__0 ) )
+            {
+            // InternalFormalML.g:527:2: ( ( rule__System__Group__0 ) )
+            // InternalFormalML.g:528:3: ( rule__System__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getGroup()); 
+            }
+            // InternalFormalML.g:529:3: ( rule__System__Group__0 )
+            // InternalFormalML.g:529:4: rule__System__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSystem"
+
+
+    // $ANTLR start "entryRuleAnyMachineBlock"
+    // InternalFormalML.g:538:1: entryRuleAnyMachineBlock : ruleAnyMachineBlock EOF ;
+    public final void entryRuleAnyMachineBlock() throws RecognitionException {
+        try {
+            // InternalFormalML.g:539:1: ( ruleAnyMachineBlock EOF )
+            // InternalFormalML.g:540:1: ruleAnyMachineBlock EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAnyMachineBlockRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleAnyMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAnyMachineBlockRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleAnyMachineBlock"
+
+
+    // $ANTLR start "ruleAnyMachineBlock"
+    // InternalFormalML.g:547:1: ruleAnyMachineBlock : ( ( rule__AnyMachineBlock__Alternatives ) ) ;
+    public final void ruleAnyMachineBlock() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:551:2: ( ( ( rule__AnyMachineBlock__Alternatives ) ) )
+            // InternalFormalML.g:552:2: ( ( rule__AnyMachineBlock__Alternatives ) )
+            {
+            // InternalFormalML.g:552:2: ( ( rule__AnyMachineBlock__Alternatives ) )
+            // InternalFormalML.g:553:3: ( rule__AnyMachineBlock__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAnyMachineBlockAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:554:3: ( rule__AnyMachineBlock__Alternatives )
+            // InternalFormalML.g:554:4: rule__AnyMachineBlock__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AnyMachineBlock__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAnyMachineBlockAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleAnyMachineBlock"
+
+
+    // $ANTLR start "entryRuleInstanceMachine"
+    // InternalFormalML.g:563:1: entryRuleInstanceMachine : ruleInstanceMachine EOF ;
+    public final void entryRuleInstanceMachine() throws RecognitionException {
+        try {
+            // InternalFormalML.g:564:1: ( ruleInstanceMachine EOF )
+            // InternalFormalML.g:565:1: ruleInstanceMachine EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleInstanceMachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleInstanceMachine"
+
+
+    // $ANTLR start "ruleInstanceMachine"
+    // InternalFormalML.g:572:1: ruleInstanceMachine : ( ( rule__InstanceMachine__Group__0 ) ) ;
+    public final void ruleInstanceMachine() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:576:2: ( ( ( rule__InstanceMachine__Group__0 ) ) )
+            // InternalFormalML.g:577:2: ( ( rule__InstanceMachine__Group__0 ) )
+            {
+            // InternalFormalML.g:577:2: ( ( rule__InstanceMachine__Group__0 ) )
+            // InternalFormalML.g:578:3: ( rule__InstanceMachine__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getGroup()); 
+            }
+            // InternalFormalML.g:579:3: ( rule__InstanceMachine__Group__0 )
+            // InternalFormalML.g:579:4: rule__InstanceMachine__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleInstanceMachine"
+
+
+    // $ANTLR start "entryRuleSlotParameter"
+    // InternalFormalML.g:588:1: entryRuleSlotParameter : ruleSlotParameter EOF ;
+    public final void entryRuleSlotParameter() throws RecognitionException {
+        try {
+            // InternalFormalML.g:589:1: ( ruleSlotParameter EOF )
+            // InternalFormalML.g:590:1: ruleSlotParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotParameterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSlotParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotParameterRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSlotParameter"
+
+
+    // $ANTLR start "ruleSlotParameter"
+    // InternalFormalML.g:597:1: ruleSlotParameter : ( ( rule__SlotParameter__Group__0 ) ) ;
+    public final void ruleSlotParameter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:601:2: ( ( ( rule__SlotParameter__Group__0 ) ) )
+            // InternalFormalML.g:602:2: ( ( rule__SlotParameter__Group__0 ) )
+            {
+            // InternalFormalML.g:602:2: ( ( rule__SlotParameter__Group__0 ) )
+            // InternalFormalML.g:603:3: ( rule__SlotParameter__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotParameterAccess().getGroup()); 
+            }
+            // InternalFormalML.g:604:3: ( rule__SlotParameter__Group__0 )
+            // InternalFormalML.g:604:4: rule__SlotParameter__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotParameter__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotParameterAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSlotParameter"
+
+
+    // $ANTLR start "entryRuleSlotProperty"
+    // InternalFormalML.g:613:1: entryRuleSlotProperty : ruleSlotProperty EOF ;
+    public final void entryRuleSlotProperty() throws RecognitionException {
+        try {
+            // InternalFormalML.g:614:1: ( ruleSlotProperty EOF )
+            // InternalFormalML.g:615:1: ruleSlotProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotPropertyRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSlotProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotPropertyRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSlotProperty"
+
+
+    // $ANTLR start "ruleSlotProperty"
+    // InternalFormalML.g:622:1: ruleSlotProperty : ( ( rule__SlotProperty__Group__0 ) ) ;
+    public final void ruleSlotProperty() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:626:2: ( ( ( rule__SlotProperty__Group__0 ) ) )
+            // InternalFormalML.g:627:2: ( ( rule__SlotProperty__Group__0 ) )
+            {
+            // InternalFormalML.g:627:2: ( ( rule__SlotProperty__Group__0 ) )
+            // InternalFormalML.g:628:3: ( rule__SlotProperty__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotPropertyAccess().getGroup()); 
+            }
+            // InternalFormalML.g:629:3: ( rule__SlotProperty__Group__0 )
+            // InternalFormalML.g:629:4: rule__SlotProperty__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotProperty__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotPropertyAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSlotProperty"
+
+
+    // $ANTLR start "entryRuleMachineBlock"
+    // InternalFormalML.g:638:1: entryRuleMachineBlock : ruleMachineBlock EOF ;
+    public final void entryRuleMachineBlock() throws RecognitionException {
+        try {
+            // InternalFormalML.g:639:1: ( ruleMachineBlock EOF )
+            // InternalFormalML.g:640:1: ruleMachineBlock EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleMachineBlock"
+
+
+    // $ANTLR start "ruleMachineBlock"
+    // InternalFormalML.g:647:1: ruleMachineBlock : ( ( rule__MachineBlock__Group__0 ) ) ;
+    public final void ruleMachineBlock() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:651:2: ( ( ( rule__MachineBlock__Group__0 ) ) )
+            // InternalFormalML.g:652:2: ( ( rule__MachineBlock__Group__0 ) )
+            {
+            // InternalFormalML.g:652:2: ( ( rule__MachineBlock__Group__0 ) )
+            // InternalFormalML.g:653:3: ( rule__MachineBlock__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getGroup()); 
+            }
+            // InternalFormalML.g:654:3: ( rule__MachineBlock__Group__0 )
+            // InternalFormalML.g:654:4: rule__MachineBlock__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleMachineBlock"
+
+
+    // $ANTLR start "entryRuleProcedure"
+    // InternalFormalML.g:663:1: entryRuleProcedure : ruleProcedure EOF ;
+    public final void entryRuleProcedure() throws RecognitionException {
+        try {
+            // InternalFormalML.g:664:1: ( ruleProcedure EOF )
+            // InternalFormalML.g:665:1: ruleProcedure EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleProcedure"
+
+
+    // $ANTLR start "ruleProcedure"
+    // InternalFormalML.g:672:1: ruleProcedure : ( ( rule__Procedure__Group__0 ) ) ;
+    public final void ruleProcedure() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:676:2: ( ( ( rule__Procedure__Group__0 ) ) )
+            // InternalFormalML.g:677:2: ( ( rule__Procedure__Group__0 ) )
+            {
+            // InternalFormalML.g:677:2: ( ( rule__Procedure__Group__0 ) )
+            // InternalFormalML.g:678:3: ( rule__Procedure__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getGroup()); 
+            }
+            // InternalFormalML.g:679:3: ( rule__Procedure__Group__0 )
+            // InternalFormalML.g:679:4: rule__Procedure__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProcedure"
+
+
+    // $ANTLR start "entryRuleProcedureExecution"
+    // InternalFormalML.g:688:1: entryRuleProcedureExecution : ruleProcedureExecution EOF ;
+    public final void entryRuleProcedureExecution() throws RecognitionException {
+        try {
+            // InternalFormalML.g:689:1: ( ruleProcedureExecution EOF )
+            // InternalFormalML.g:690:1: ruleProcedureExecution EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleProcedureExecution();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleProcedureExecution"
+
+
+    // $ANTLR start "ruleProcedureExecution"
+    // InternalFormalML.g:697:1: ruleProcedureExecution : ( ( rule__ProcedureExecution__Group__0 ) ) ;
+    public final void ruleProcedureExecution() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:701:2: ( ( ( rule__ProcedureExecution__Group__0 ) ) )
+            // InternalFormalML.g:702:2: ( ( rule__ProcedureExecution__Group__0 ) )
+            {
+            // InternalFormalML.g:702:2: ( ( rule__ProcedureExecution__Group__0 ) )
+            // InternalFormalML.g:703:3: ( rule__ProcedureExecution__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:704:3: ( rule__ProcedureExecution__Group__0 )
+            // InternalFormalML.g:704:4: rule__ProcedureExecution__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProcedureExecution"
+
+
+    // $ANTLR start "entryRuleBehavior"
+    // InternalFormalML.g:713:1: entryRuleBehavior : ruleBehavior EOF ;
+    public final void entryRuleBehavior() throws RecognitionException {
+        try {
+            // InternalFormalML.g:714:1: ( ruleBehavior EOF )
+            // InternalFormalML.g:715:1: ruleBehavior EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBehaviorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBehavior();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBehaviorRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBehavior"
+
+
+    // $ANTLR start "ruleBehavior"
+    // InternalFormalML.g:722:1: ruleBehavior : ( ruleStatemachine ) ;
+    public final void ruleBehavior() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:726:2: ( ( ruleStatemachine ) )
+            // InternalFormalML.g:727:2: ( ruleStatemachine )
+            {
+            // InternalFormalML.g:727:2: ( ruleStatemachine )
+            // InternalFormalML.g:728:3: ruleStatemachine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBehaviorAccess().getStatemachineParserRuleCall()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatemachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBehaviorAccess().getStatemachineParserRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBehavior"
+
+
+    // $ANTLR start "entryRuleMoeBehavior"
+    // InternalFormalML.g:738:1: entryRuleMoeBehavior : ruleMoeBehavior EOF ;
+    public final void entryRuleMoeBehavior() throws RecognitionException {
+        try {
+            // InternalFormalML.g:739:1: ( ruleMoeBehavior EOF )
+            // InternalFormalML.g:740:1: ruleMoeBehavior EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleMoeBehavior();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleMoeBehavior"
+
+
+    // $ANTLR start "ruleMoeBehavior"
+    // InternalFormalML.g:747:1: ruleMoeBehavior : ( ( rule__MoeBehavior__Group__0 ) ) ;
+    public final void ruleMoeBehavior() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:751:2: ( ( ( rule__MoeBehavior__Group__0 ) ) )
+            // InternalFormalML.g:752:2: ( ( rule__MoeBehavior__Group__0 ) )
+            {
+            // InternalFormalML.g:752:2: ( ( rule__MoeBehavior__Group__0 ) )
+            // InternalFormalML.g:753:3: ( rule__MoeBehavior__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getGroup()); 
+            }
+            // InternalFormalML.g:754:3: ( rule__MoeBehavior__Group__0 )
+            // InternalFormalML.g:754:4: rule__MoeBehavior__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeBehavior__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleMoeBehavior"
+
+
+    // $ANTLR start "entryRuleStatemachine"
+    // InternalFormalML.g:763:1: entryRuleStatemachine : ruleStatemachine EOF ;
+    public final void entryRuleStatemachine() throws RecognitionException {
+        try {
+            // InternalFormalML.g:764:1: ( ruleStatemachine EOF )
+            // InternalFormalML.g:765:1: ruleStatemachine EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleStatemachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStatemachine"
+
+
+    // $ANTLR start "ruleStatemachine"
+    // InternalFormalML.g:772:1: ruleStatemachine : ( ( rule__Statemachine__Group__0 ) ) ;
+    public final void ruleStatemachine() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:776:2: ( ( ( rule__Statemachine__Group__0 ) ) )
+            // InternalFormalML.g:777:2: ( ( rule__Statemachine__Group__0 ) )
+            {
+            // InternalFormalML.g:777:2: ( ( rule__Statemachine__Group__0 ) )
+            // InternalFormalML.g:778:3: ( rule__Statemachine__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getGroup()); 
+            }
+            // InternalFormalML.g:779:3: ( rule__Statemachine__Group__0 )
+            // InternalFormalML.g:779:4: rule__Statemachine__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStatemachine"
+
+
+    // $ANTLR start "entryRuleStatemachineRegion"
+    // InternalFormalML.g:788:1: entryRuleStatemachineRegion : ruleStatemachineRegion EOF ;
+    public final void entryRuleStatemachineRegion() throws RecognitionException {
+        try {
+            // InternalFormalML.g:789:1: ( ruleStatemachineRegion EOF )
+            // InternalFormalML.g:790:1: ruleStatemachineRegion EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleStatemachineRegion();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStatemachineRegion"
+
+
+    // $ANTLR start "ruleStatemachineRegion"
+    // InternalFormalML.g:797:1: ruleStatemachineRegion : ( ( rule__StatemachineRegion__Group__0 ) ) ;
+    public final void ruleStatemachineRegion() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:801:2: ( ( ( rule__StatemachineRegion__Group__0 ) ) )
+            // InternalFormalML.g:802:2: ( ( rule__StatemachineRegion__Group__0 ) )
+            {
+            // InternalFormalML.g:802:2: ( ( rule__StatemachineRegion__Group__0 ) )
+            // InternalFormalML.g:803:3: ( rule__StatemachineRegion__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:804:3: ( rule__StatemachineRegion__Group__0 )
+            // InternalFormalML.g:804:4: rule__StatemachineRegion__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStatemachineRegion"
+
+
+    // $ANTLR start "entryRuleStatemachineRegionLite"
+    // InternalFormalML.g:813:1: entryRuleStatemachineRegionLite : ruleStatemachineRegionLite EOF ;
+    public final void entryRuleStatemachineRegionLite() throws RecognitionException {
+        try {
+            // InternalFormalML.g:814:1: ( ruleStatemachineRegionLite EOF )
+            // InternalFormalML.g:815:1: ruleStatemachineRegionLite EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionLiteRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleStatemachineRegionLite();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionLiteRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStatemachineRegionLite"
+
+
+    // $ANTLR start "ruleStatemachineRegionLite"
+    // InternalFormalML.g:822:1: ruleStatemachineRegionLite : ( ( ( rule__StatemachineRegionLite__Alternatives ) ) ( ( rule__StatemachineRegionLite__Alternatives )* ) ) ;
+    public final void ruleStatemachineRegionLite() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:826:2: ( ( ( ( rule__StatemachineRegionLite__Alternatives ) ) ( ( rule__StatemachineRegionLite__Alternatives )* ) ) )
+            // InternalFormalML.g:827:2: ( ( ( rule__StatemachineRegionLite__Alternatives ) ) ( ( rule__StatemachineRegionLite__Alternatives )* ) )
+            {
+            // InternalFormalML.g:827:2: ( ( ( rule__StatemachineRegionLite__Alternatives ) ) ( ( rule__StatemachineRegionLite__Alternatives )* ) )
+            // InternalFormalML.g:828:3: ( ( rule__StatemachineRegionLite__Alternatives ) ) ( ( rule__StatemachineRegionLite__Alternatives )* )
+            {
+            // InternalFormalML.g:828:3: ( ( rule__StatemachineRegionLite__Alternatives ) )
+            // InternalFormalML.g:829:4: ( rule__StatemachineRegionLite__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionLiteAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:830:4: ( rule__StatemachineRegionLite__Alternatives )
+            // InternalFormalML.g:830:5: rule__StatemachineRegionLite__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_3);
+            rule__StatemachineRegionLite__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionLiteAccess().getAlternatives()); 
+            }
+
+            }
+
+            // InternalFormalML.g:833:3: ( ( rule__StatemachineRegionLite__Alternatives )* )
+            // InternalFormalML.g:834:4: ( rule__StatemachineRegionLite__Alternatives )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionLiteAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:835:4: ( rule__StatemachineRegionLite__Alternatives )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( ((LA1_0>=54 && LA1_0<=57)||(LA1_0>=275 && LA1_0<=276)) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // InternalFormalML.g:835:5: rule__StatemachineRegionLite__Alternatives
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_3);
+            	    rule__StatemachineRegionLite__Alternatives();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionLiteAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStatemachineRegionLite"
+
+
+    // $ANTLR start "entryRuleState"
+    // InternalFormalML.g:845:1: entryRuleState : ruleState EOF ;
+    public final void entryRuleState() throws RecognitionException {
+        try {
+            // InternalFormalML.g:846:1: ( ruleState EOF )
+            // InternalFormalML.g:847:1: ruleState EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleState();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleState"
+
+
+    // $ANTLR start "ruleState"
+    // InternalFormalML.g:854:1: ruleState : ( ( rule__State__Alternatives ) ) ;
+    public final void ruleState() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:858:2: ( ( ( rule__State__Alternatives ) ) )
+            // InternalFormalML.g:859:2: ( ( rule__State__Alternatives ) )
+            {
+            // InternalFormalML.g:859:2: ( ( rule__State__Alternatives ) )
+            // InternalFormalML.g:860:3: ( rule__State__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStateAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:861:3: ( rule__State__Alternatives )
+            // InternalFormalML.g:861:4: rule__State__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__State__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStateAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleState"
+
+
+    // $ANTLR start "entryRuleCompositeState"
+    // InternalFormalML.g:870:1: entryRuleCompositeState : ruleCompositeState EOF ;
+    public final void entryRuleCompositeState() throws RecognitionException {
+        try {
+            // InternalFormalML.g:871:1: ( ruleCompositeState EOF )
+            // InternalFormalML.g:872:1: ruleCompositeState EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleCompositeState();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleCompositeState"
+
+
+    // $ANTLR start "ruleCompositeState"
+    // InternalFormalML.g:879:1: ruleCompositeState : ( ( rule__CompositeState__Group__0 ) ) ;
+    public final void ruleCompositeState() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:883:2: ( ( ( rule__CompositeState__Group__0 ) ) )
+            // InternalFormalML.g:884:2: ( ( rule__CompositeState__Group__0 ) )
+            {
+            // InternalFormalML.g:884:2: ( ( rule__CompositeState__Group__0 ) )
+            // InternalFormalML.g:885:3: ( rule__CompositeState__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:886:3: ( rule__CompositeState__Group__0 )
+            // InternalFormalML.g:886:4: rule__CompositeState__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleCompositeState"
+
+
+    // $ANTLR start "entryRulemoeCompositeStateRoutines"
+    // InternalFormalML.g:895:1: entryRulemoeCompositeStateRoutines : rulemoeCompositeStateRoutines EOF ;
+    public final void entryRulemoeCompositeStateRoutines() throws RecognitionException {
+        try {
+            // InternalFormalML.g:896:1: ( rulemoeCompositeStateRoutines EOF )
+            // InternalFormalML.g:897:1: rulemoeCompositeStateRoutines EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeCompositeStateRoutinesRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulemoeCompositeStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeCompositeStateRoutinesRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulemoeCompositeStateRoutines"
+
+
+    // $ANTLR start "rulemoeCompositeStateRoutines"
+    // InternalFormalML.g:904:1: rulemoeCompositeStateRoutines : ( ( rule__MoeCompositeStateRoutines__Group__0 ) ) ;
+    public final void rulemoeCompositeStateRoutines() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:908:2: ( ( ( rule__MoeCompositeStateRoutines__Group__0 ) ) )
+            // InternalFormalML.g:909:2: ( ( rule__MoeCompositeStateRoutines__Group__0 ) )
+            {
+            // InternalFormalML.g:909:2: ( ( rule__MoeCompositeStateRoutines__Group__0 ) )
+            // InternalFormalML.g:910:3: ( rule__MoeCompositeStateRoutines__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeCompositeStateRoutinesAccess().getGroup()); 
+            }
+            // InternalFormalML.g:911:3: ( rule__MoeCompositeStateRoutines__Group__0 )
+            // InternalFormalML.g:911:4: rule__MoeCompositeStateRoutines__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeCompositeStateRoutines__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeCompositeStateRoutinesAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulemoeCompositeStateRoutines"
+
+
+    // $ANTLR start "entryRuleSimpleState"
+    // InternalFormalML.g:920:1: entryRuleSimpleState : ruleSimpleState EOF ;
+    public final void entryRuleSimpleState() throws RecognitionException {
+        try {
+            // InternalFormalML.g:921:1: ( ruleSimpleState EOF )
+            // InternalFormalML.g:922:1: ruleSimpleState EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSimpleState();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSimpleState"
+
+
+    // $ANTLR start "ruleSimpleState"
+    // InternalFormalML.g:929:1: ruleSimpleState : ( ( rule__SimpleState__Group__0 ) ) ;
+    public final void ruleSimpleState() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:933:2: ( ( ( rule__SimpleState__Group__0 ) ) )
+            // InternalFormalML.g:934:2: ( ( rule__SimpleState__Group__0 ) )
+            {
+            // InternalFormalML.g:934:2: ( ( rule__SimpleState__Group__0 ) )
+            // InternalFormalML.g:935:3: ( rule__SimpleState__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:936:3: ( rule__SimpleState__Group__0 )
+            // InternalFormalML.g:936:4: rule__SimpleState__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSimpleState"
+
+
+    // $ANTLR start "entryRulemoeSimpleStateRoutines"
+    // InternalFormalML.g:945:1: entryRulemoeSimpleStateRoutines : rulemoeSimpleStateRoutines EOF ;
+    public final void entryRulemoeSimpleStateRoutines() throws RecognitionException {
+        try {
+            // InternalFormalML.g:946:1: ( rulemoeSimpleStateRoutines EOF )
+            // InternalFormalML.g:947:1: rulemoeSimpleStateRoutines EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeSimpleStateRoutinesRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulemoeSimpleStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeSimpleStateRoutinesRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulemoeSimpleStateRoutines"
+
+
+    // $ANTLR start "rulemoeSimpleStateRoutines"
+    // InternalFormalML.g:954:1: rulemoeSimpleStateRoutines : ( ( rule__MoeSimpleStateRoutines__Group__0 ) ) ;
+    public final void rulemoeSimpleStateRoutines() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:958:2: ( ( ( rule__MoeSimpleStateRoutines__Group__0 ) ) )
+            // InternalFormalML.g:959:2: ( ( rule__MoeSimpleStateRoutines__Group__0 ) )
+            {
+            // InternalFormalML.g:959:2: ( ( rule__MoeSimpleStateRoutines__Group__0 ) )
+            // InternalFormalML.g:960:3: ( rule__MoeSimpleStateRoutines__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeSimpleStateRoutinesAccess().getGroup()); 
+            }
+            // InternalFormalML.g:961:3: ( rule__MoeSimpleStateRoutines__Group__0 )
+            // InternalFormalML.g:961:4: rule__MoeSimpleStateRoutines__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeSimpleStateRoutines__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeSimpleStateRoutinesAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulemoeSimpleStateRoutines"
+
+
+    // $ANTLR start "entryRuleStartState"
+    // InternalFormalML.g:970:1: entryRuleStartState : ruleStartState EOF ;
+    public final void entryRuleStartState() throws RecognitionException {
+        try {
+            // InternalFormalML.g:971:1: ( ruleStartState EOF )
+            // InternalFormalML.g:972:1: ruleStartState EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleStartState();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStartState"
+
+
+    // $ANTLR start "ruleStartState"
+    // InternalFormalML.g:979:1: ruleStartState : ( ( rule__StartState__Group__0 ) ) ;
+    public final void ruleStartState() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:983:2: ( ( ( rule__StartState__Group__0 ) ) )
+            // InternalFormalML.g:984:2: ( ( rule__StartState__Group__0 ) )
+            {
+            // InternalFormalML.g:984:2: ( ( rule__StartState__Group__0 ) )
+            // InternalFormalML.g:985:3: ( rule__StartState__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:986:3: ( rule__StartState__Group__0 )
+            // InternalFormalML.g:986:4: rule__StartState__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStartState"
+
+
+    // $ANTLR start "entryRulemoeStartStateRoutines"
+    // InternalFormalML.g:995:1: entryRulemoeStartStateRoutines : rulemoeStartStateRoutines EOF ;
+    public final void entryRulemoeStartStateRoutines() throws RecognitionException {
+        try {
+            // InternalFormalML.g:996:1: ( rulemoeStartStateRoutines EOF )
+            // InternalFormalML.g:997:1: rulemoeStartStateRoutines EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeStartStateRoutinesRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulemoeStartStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeStartStateRoutinesRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulemoeStartStateRoutines"
+
+
+    // $ANTLR start "rulemoeStartStateRoutines"
+    // InternalFormalML.g:1004:1: rulemoeStartStateRoutines : ( ( rule__MoeStartStateRoutines__Group__0 ) ) ;
+    public final void rulemoeStartStateRoutines() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1008:2: ( ( ( rule__MoeStartStateRoutines__Group__0 ) ) )
+            // InternalFormalML.g:1009:2: ( ( rule__MoeStartStateRoutines__Group__0 ) )
+            {
+            // InternalFormalML.g:1009:2: ( ( rule__MoeStartStateRoutines__Group__0 ) )
+            // InternalFormalML.g:1010:3: ( rule__MoeStartStateRoutines__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeStartStateRoutinesAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1011:3: ( rule__MoeStartStateRoutines__Group__0 )
+            // InternalFormalML.g:1011:4: rule__MoeStartStateRoutines__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeStartStateRoutines__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeStartStateRoutinesAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulemoeStartStateRoutines"
+
+
+    // $ANTLR start "entryRuleFinalState"
+    // InternalFormalML.g:1020:1: entryRuleFinalState : ruleFinalState EOF ;
+    public final void entryRuleFinalState() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1021:1: ( ruleFinalState EOF )
+            // InternalFormalML.g:1022:1: ruleFinalState EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleFinalState();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleFinalState"
+
+
+    // $ANTLR start "ruleFinalState"
+    // InternalFormalML.g:1029:1: ruleFinalState : ( ( rule__FinalState__Group__0 ) ) ;
+    public final void ruleFinalState() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1033:2: ( ( ( rule__FinalState__Group__0 ) ) )
+            // InternalFormalML.g:1034:2: ( ( rule__FinalState__Group__0 ) )
+            {
+            // InternalFormalML.g:1034:2: ( ( rule__FinalState__Group__0 ) )
+            // InternalFormalML.g:1035:3: ( rule__FinalState__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1036:3: ( rule__FinalState__Group__0 )
+            // InternalFormalML.g:1036:4: rule__FinalState__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleFinalState"
+
+
+    // $ANTLR start "entryRulemoeFinalStateRoutines"
+    // InternalFormalML.g:1045:1: entryRulemoeFinalStateRoutines : rulemoeFinalStateRoutines EOF ;
+    public final void entryRulemoeFinalStateRoutines() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1046:1: ( rulemoeFinalStateRoutines EOF )
+            // InternalFormalML.g:1047:1: rulemoeFinalStateRoutines EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeFinalStateRoutinesRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulemoeFinalStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeFinalStateRoutinesRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulemoeFinalStateRoutines"
+
+
+    // $ANTLR start "rulemoeFinalStateRoutines"
+    // InternalFormalML.g:1054:1: rulemoeFinalStateRoutines : ( ( rule__MoeFinalStateRoutines__Group__0 ) ) ;
+    public final void rulemoeFinalStateRoutines() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1058:2: ( ( ( rule__MoeFinalStateRoutines__Group__0 ) ) )
+            // InternalFormalML.g:1059:2: ( ( rule__MoeFinalStateRoutines__Group__0 ) )
+            {
+            // InternalFormalML.g:1059:2: ( ( rule__MoeFinalStateRoutines__Group__0 ) )
+            // InternalFormalML.g:1060:3: ( rule__MoeFinalStateRoutines__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeFinalStateRoutinesAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1061:3: ( rule__MoeFinalStateRoutines__Group__0 )
+            // InternalFormalML.g:1061:4: rule__MoeFinalStateRoutines__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeFinalStateRoutines__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeFinalStateRoutinesAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulemoeFinalStateRoutines"
+
+
+    // $ANTLR start "entryRulePseudostate"
+    // InternalFormalML.g:1070:1: entryRulePseudostate : rulePseudostate EOF ;
+    public final void entryRulePseudostate() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1071:1: ( rulePseudostate EOF )
+            // InternalFormalML.g:1072:1: rulePseudostate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePseudostate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePseudostate"
+
+
+    // $ANTLR start "rulePseudostate"
+    // InternalFormalML.g:1079:1: rulePseudostate : ( ( rule__Pseudostate__Alternatives ) ) ;
+    public final void rulePseudostate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1083:2: ( ( ( rule__Pseudostate__Alternatives ) ) )
+            // InternalFormalML.g:1084:2: ( ( rule__Pseudostate__Alternatives ) )
+            {
+            // InternalFormalML.g:1084:2: ( ( rule__Pseudostate__Alternatives ) )
+            // InternalFormalML.g:1085:3: ( rule__Pseudostate__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1086:3: ( rule__Pseudostate__Alternatives )
+            // InternalFormalML.g:1086:4: rule__Pseudostate__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Pseudostate__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePseudostate"
+
+
+    // $ANTLR start "entryRuleOtherPseudostate"
+    // InternalFormalML.g:1095:1: entryRuleOtherPseudostate : ruleOtherPseudostate EOF ;
+    public final void entryRuleOtherPseudostate() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1096:1: ( ruleOtherPseudostate EOF )
+            // InternalFormalML.g:1097:1: ruleOtherPseudostate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleOtherPseudostate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOtherPseudostate"
+
+
+    // $ANTLR start "ruleOtherPseudostate"
+    // InternalFormalML.g:1104:1: ruleOtherPseudostate : ( ( rule__OtherPseudostate__Group__0 ) ) ;
+    public final void ruleOtherPseudostate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1108:2: ( ( ( rule__OtherPseudostate__Group__0 ) ) )
+            // InternalFormalML.g:1109:2: ( ( rule__OtherPseudostate__Group__0 ) )
+            {
+            // InternalFormalML.g:1109:2: ( ( rule__OtherPseudostate__Group__0 ) )
+            // InternalFormalML.g:1110:3: ( rule__OtherPseudostate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1111:3: ( rule__OtherPseudostate__Group__0 )
+            // InternalFormalML.g:1111:4: rule__OtherPseudostate__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOtherPseudostate"
+
+
+    // $ANTLR start "entryRulePseudostateInitial"
+    // InternalFormalML.g:1120:1: entryRulePseudostateInitial : rulePseudostateInitial EOF ;
+    public final void entryRulePseudostateInitial() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1121:1: ( rulePseudostateInitial EOF )
+            // InternalFormalML.g:1122:1: rulePseudostateInitial EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePseudostateInitial();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePseudostateInitial"
+
+
+    // $ANTLR start "rulePseudostateInitial"
+    // InternalFormalML.g:1129:1: rulePseudostateInitial : ( ( rule__PseudostateInitial__Group__0 ) ) ;
+    public final void rulePseudostateInitial() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1133:2: ( ( ( rule__PseudostateInitial__Group__0 ) ) )
+            // InternalFormalML.g:1134:2: ( ( rule__PseudostateInitial__Group__0 ) )
+            {
+            // InternalFormalML.g:1134:2: ( ( rule__PseudostateInitial__Group__0 ) )
+            // InternalFormalML.g:1135:3: ( rule__PseudostateInitial__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1136:3: ( rule__PseudostateInitial__Group__0 )
+            // InternalFormalML.g:1136:4: rule__PseudostateInitial__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePseudostateInitial"
+
+
+    // $ANTLR start "entryRuleEndingPseudostate"
+    // InternalFormalML.g:1145:1: entryRuleEndingPseudostate : ruleEndingPseudostate EOF ;
+    public final void entryRuleEndingPseudostate() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1146:1: ( ruleEndingPseudostate EOF )
+            // InternalFormalML.g:1147:1: ruleEndingPseudostate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEndingPseudostate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEndingPseudostate"
+
+
+    // $ANTLR start "ruleEndingPseudostate"
+    // InternalFormalML.g:1154:1: ruleEndingPseudostate : ( ( rule__EndingPseudostate__Group__0 ) ) ;
+    public final void ruleEndingPseudostate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1158:2: ( ( ( rule__EndingPseudostate__Group__0 ) ) )
+            // InternalFormalML.g:1159:2: ( ( rule__EndingPseudostate__Group__0 ) )
+            {
+            // InternalFormalML.g:1159:2: ( ( rule__EndingPseudostate__Group__0 ) )
+            // InternalFormalML.g:1160:3: ( rule__EndingPseudostate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1161:3: ( rule__EndingPseudostate__Group__0 )
+            // InternalFormalML.g:1161:4: rule__EndingPseudostate__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEndingPseudostate"
+
+
+    // $ANTLR start "entryRuleModelOfExecution"
+    // InternalFormalML.g:1170:1: entryRuleModelOfExecution : ruleModelOfExecution EOF ;
+    public final void entryRuleModelOfExecution() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1171:1: ( ruleModelOfExecution EOF )
+            // InternalFormalML.g:1172:1: ruleModelOfExecution EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleModelOfExecution();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleModelOfExecution"
+
+
+    // $ANTLR start "ruleModelOfExecution"
+    // InternalFormalML.g:1179:1: ruleModelOfExecution : ( ( rule__ModelOfExecution__Group__0 ) ) ;
+    public final void ruleModelOfExecution() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1183:2: ( ( ( rule__ModelOfExecution__Group__0 ) ) )
+            // InternalFormalML.g:1184:2: ( ( rule__ModelOfExecution__Group__0 ) )
+            {
+            // InternalFormalML.g:1184:2: ( ( rule__ModelOfExecution__Group__0 ) )
+            // InternalFormalML.g:1185:3: ( rule__ModelOfExecution__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1186:3: ( rule__ModelOfExecution__Group__0 )
+            // InternalFormalML.g:1186:4: rule__ModelOfExecution__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleModelOfExecution"
+
+
+    // $ANTLR start "entryRulemoeRoutine"
+    // InternalFormalML.g:1195:1: entryRulemoeRoutine : rulemoeRoutine EOF ;
+    public final void entryRulemoeRoutine() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1196:1: ( rulemoeRoutine EOF )
+            // InternalFormalML.g:1197:1: rulemoeRoutine EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulemoeRoutine"
+
+
+    // $ANTLR start "rulemoeRoutine"
+    // InternalFormalML.g:1204:1: rulemoeRoutine : ( ( rule__MoeRoutine__Group__0 ) ) ;
+    public final void rulemoeRoutine() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1208:2: ( ( ( rule__MoeRoutine__Group__0 ) ) )
+            // InternalFormalML.g:1209:2: ( ( rule__MoeRoutine__Group__0 ) )
+            {
+            // InternalFormalML.g:1209:2: ( ( rule__MoeRoutine__Group__0 ) )
+            // InternalFormalML.g:1210:3: ( rule__MoeRoutine__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1211:3: ( rule__MoeRoutine__Group__0 )
+            // InternalFormalML.g:1211:4: rule__MoeRoutine__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulemoeRoutine"
+
+
+    // $ANTLR start "entryRuleRoutine"
+    // InternalFormalML.g:1220:1: entryRuleRoutine : ruleRoutine EOF ;
+    public final void entryRuleRoutine() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1221:1: ( ruleRoutine EOF )
+            // InternalFormalML.g:1222:1: ruleRoutine EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleRoutine"
+
+
+    // $ANTLR start "ruleRoutine"
+    // InternalFormalML.g:1229:1: ruleRoutine : ( ( rule__Routine__Group__0 ) ) ;
+    public final void ruleRoutine() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1233:2: ( ( ( rule__Routine__Group__0 ) ) )
+            // InternalFormalML.g:1234:2: ( ( rule__Routine__Group__0 ) )
+            {
+            // InternalFormalML.g:1234:2: ( ( rule__Routine__Group__0 ) )
+            // InternalFormalML.g:1235:3: ( rule__Routine__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1236:3: ( rule__Routine__Group__0 )
+            // InternalFormalML.g:1236:4: rule__Routine__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleRoutine"
+
+
+    // $ANTLR start "entryRuleModelOfInteraction"
+    // InternalFormalML.g:1245:1: entryRuleModelOfInteraction : ruleModelOfInteraction EOF ;
+    public final void entryRuleModelOfInteraction() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1246:1: ( ruleModelOfInteraction EOF )
+            // InternalFormalML.g:1247:1: ruleModelOfInteraction EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfInteractionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleModelOfInteraction();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfInteractionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleModelOfInteraction"
+
+
+    // $ANTLR start "ruleModelOfInteraction"
+    // InternalFormalML.g:1254:1: ruleModelOfInteraction : ( ( rule__ModelOfInteraction__Group__0 ) ) ;
+    public final void ruleModelOfInteraction() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1258:2: ( ( ( rule__ModelOfInteraction__Group__0 ) ) )
+            // InternalFormalML.g:1259:2: ( ( rule__ModelOfInteraction__Group__0 ) )
+            {
+            // InternalFormalML.g:1259:2: ( ( rule__ModelOfInteraction__Group__0 ) )
+            // InternalFormalML.g:1260:3: ( rule__ModelOfInteraction__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfInteractionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1261:3: ( rule__ModelOfInteraction__Group__0 )
+            // InternalFormalML.g:1261:4: rule__ModelOfInteraction__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfInteraction__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfInteractionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleModelOfInteraction"
+
+
+    // $ANTLR start "entryRuleRoute"
+    // InternalFormalML.g:1270:1: entryRuleRoute : ruleRoute EOF ;
+    public final void entryRuleRoute() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1271:1: ( ruleRoute EOF )
+            // InternalFormalML.g:1272:1: ruleRoute EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleRoute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleRoute"
+
+
+    // $ANTLR start "ruleRoute"
+    // InternalFormalML.g:1279:1: ruleRoute : ( ( rule__Route__Group__0 ) ) ;
+    public final void ruleRoute() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1283:2: ( ( ( rule__Route__Group__0 ) ) )
+            // InternalFormalML.g:1284:2: ( ( rule__Route__Group__0 ) )
+            {
+            // InternalFormalML.g:1284:2: ( ( rule__Route__Group__0 ) )
+            // InternalFormalML.g:1285:3: ( rule__Route__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1286:3: ( rule__Route__Group__0 )
+            // InternalFormalML.g:1286:4: rule__Route__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleRoute"
+
+
+    // $ANTLR start "entryRuleComRouteProtocol"
+    // InternalFormalML.g:1295:1: entryRuleComRouteProtocol : ruleComRouteProtocol EOF ;
+    public final void entryRuleComRouteProtocol() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1296:1: ( ruleComRouteProtocol EOF )
+            // InternalFormalML.g:1297:1: ruleComRouteProtocol EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleComRouteProtocol();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleComRouteProtocol"
+
+
+    // $ANTLR start "ruleComRouteProtocol"
+    // InternalFormalML.g:1304:1: ruleComRouteProtocol : ( ( rule__ComRouteProtocol__Alternatives ) ) ;
+    public final void ruleComRouteProtocol() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1308:2: ( ( ( rule__ComRouteProtocol__Alternatives ) ) )
+            // InternalFormalML.g:1309:2: ( ( rule__ComRouteProtocol__Alternatives ) )
+            {
+            // InternalFormalML.g:1309:2: ( ( rule__ComRouteProtocol__Alternatives ) )
+            // InternalFormalML.g:1310:3: ( rule__ComRouteProtocol__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1311:3: ( rule__ComRouteProtocol__Alternatives )
+            // InternalFormalML.g:1311:4: rule__ComRouteProtocol__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleComRouteProtocol"
+
+
+    // $ANTLR start "entryRuleConnection"
+    // InternalFormalML.g:1320:1: entryRuleConnection : ruleConnection EOF ;
+    public final void entryRuleConnection() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1321:1: ( ruleConnection EOF )
+            // InternalFormalML.g:1322:1: ruleConnection EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleConnection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleConnection"
+
+
+    // $ANTLR start "ruleConnection"
+    // InternalFormalML.g:1329:1: ruleConnection : ( ( rule__Connection__Group__0 ) ) ;
+    public final void ruleConnection() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1333:2: ( ( ( rule__Connection__Group__0 ) ) )
+            // InternalFormalML.g:1334:2: ( ( rule__Connection__Group__0 ) )
+            {
+            // InternalFormalML.g:1334:2: ( ( rule__Connection__Group__0 ) )
+            // InternalFormalML.g:1335:3: ( rule__Connection__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1336:3: ( rule__Connection__Group__0 )
+            // InternalFormalML.g:1336:4: rule__Connection__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleConnection"
+
+
+    // $ANTLR start "entryRuleComProtocol"
+    // InternalFormalML.g:1345:1: entryRuleComProtocol : ruleComProtocol EOF ;
+    public final void entryRuleComProtocol() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1346:1: ( ruleComProtocol EOF )
+            // InternalFormalML.g:1347:1: ruleComProtocol EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleComProtocol();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleComProtocol"
+
+
+    // $ANTLR start "ruleComProtocol"
+    // InternalFormalML.g:1354:1: ruleComProtocol : ( ( rule__ComProtocol__Alternatives ) ) ;
+    public final void ruleComProtocol() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1358:2: ( ( ( rule__ComProtocol__Alternatives ) ) )
+            // InternalFormalML.g:1359:2: ( ( rule__ComProtocol__Alternatives ) )
+            {
+            // InternalFormalML.g:1359:2: ( ( rule__ComProtocol__Alternatives ) )
+            // InternalFormalML.g:1360:3: ( rule__ComProtocol__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1361:3: ( rule__ComProtocol__Alternatives )
+            // InternalFormalML.g:1361:4: rule__ComProtocol__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleComProtocol"
+
+
+    // $ANTLR start "entryRuleComPoint"
+    // InternalFormalML.g:1370:1: entryRuleComPoint : ruleComPoint EOF ;
+    public final void entryRuleComPoint() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1371:1: ( ruleComPoint EOF )
+            // InternalFormalML.g:1372:1: ruleComPoint EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleComPoint();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleComPoint"
+
+
+    // $ANTLR start "ruleComPoint"
+    // InternalFormalML.g:1379:1: ruleComPoint : ( ( rule__ComPoint__Group__0 ) ) ;
+    public final void ruleComPoint() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1383:2: ( ( ( rule__ComPoint__Group__0 ) ) )
+            // InternalFormalML.g:1384:2: ( ( rule__ComPoint__Group__0 ) )
+            {
+            // InternalFormalML.g:1384:2: ( ( rule__ComPoint__Group__0 ) )
+            // InternalFormalML.g:1385:3: ( rule__ComPoint__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1386:3: ( rule__ComPoint__Group__0 )
+            // InternalFormalML.g:1386:4: rule__ComPoint__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleComPoint"
+
+
+    // $ANTLR start "entryRuleComPointProtocol"
+    // InternalFormalML.g:1395:1: entryRuleComPointProtocol : ruleComPointProtocol EOF ;
+    public final void entryRuleComPointProtocol() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1396:1: ( ruleComPointProtocol EOF )
+            // InternalFormalML.g:1397:1: ruleComPointProtocol EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleComPointProtocol();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleComPointProtocol"
+
+
+    // $ANTLR start "ruleComPointProtocol"
+    // InternalFormalML.g:1404:1: ruleComPointProtocol : ( ( rule__ComPointProtocol__Alternatives ) ) ;
+    public final void ruleComPointProtocol() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1408:2: ( ( ( rule__ComPointProtocol__Alternatives ) ) )
+            // InternalFormalML.g:1409:2: ( ( rule__ComPointProtocol__Alternatives ) )
+            {
+            // InternalFormalML.g:1409:2: ( ( rule__ComPointProtocol__Alternatives ) )
+            // InternalFormalML.g:1410:3: ( rule__ComPointProtocol__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1411:3: ( rule__ComPointProtocol__Alternatives )
+            // InternalFormalML.g:1411:4: rule__ComPointProtocol__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleComPointProtocol"
+
+
+    // $ANTLR start "entryRuleComElement"
+    // InternalFormalML.g:1420:1: entryRuleComElement : ruleComElement EOF ;
+    public final void entryRuleComElement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1421:1: ( ruleComElement EOF )
+            // InternalFormalML.g:1422:1: ruleComElement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleComElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleComElement"
+
+
+    // $ANTLR start "ruleComElement"
+    // InternalFormalML.g:1429:1: ruleComElement : ( ( rule__ComElement__Alternatives ) ) ;
+    public final void ruleComElement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1433:2: ( ( ( rule__ComElement__Alternatives ) ) )
+            // InternalFormalML.g:1434:2: ( ( rule__ComElement__Alternatives ) )
+            {
+            // InternalFormalML.g:1434:2: ( ( rule__ComElement__Alternatives ) )
+            // InternalFormalML.g:1435:3: ( rule__ComElement__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1436:3: ( rule__ComElement__Alternatives )
+            // InternalFormalML.g:1436:4: rule__ComElement__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleComElement"
+
+
+    // $ANTLR start "entryRuleTypeDefinition"
+    // InternalFormalML.g:1445:1: entryRuleTypeDefinition : ruleTypeDefinition EOF ;
+    public final void entryRuleTypeDefinition() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1446:1: ( ruleTypeDefinition EOF )
+            // InternalFormalML.g:1447:1: ruleTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTypeDefinitionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTypeDefinition"
+
+
+    // $ANTLR start "ruleTypeDefinition"
+    // InternalFormalML.g:1454:1: ruleTypeDefinition : ( ( rule__TypeDefinition__Alternatives ) ) ;
+    public final void ruleTypeDefinition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1458:2: ( ( ( rule__TypeDefinition__Alternatives ) ) )
+            // InternalFormalML.g:1459:2: ( ( rule__TypeDefinition__Alternatives ) )
+            {
+            // InternalFormalML.g:1459:2: ( ( rule__TypeDefinition__Alternatives ) )
+            // InternalFormalML.g:1460:3: ( rule__TypeDefinition__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTypeDefinitionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1461:3: ( rule__TypeDefinition__Alternatives )
+            // InternalFormalML.g:1461:4: rule__TypeDefinition__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TypeDefinition__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTypeDefinitionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTypeDefinition"
+
+
+    // $ANTLR start "entryRuleDataTypeMultiplicity"
+    // InternalFormalML.g:1470:1: entryRuleDataTypeMultiplicity : ruleDataTypeMultiplicity EOF ;
+    public final void entryRuleDataTypeMultiplicity() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1471:1: ( ruleDataTypeMultiplicity EOF )
+            // InternalFormalML.g:1472:1: ruleDataTypeMultiplicity EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeMultiplicityRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDataTypeMultiplicity();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeMultiplicityRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDataTypeMultiplicity"
+
+
+    // $ANTLR start "ruleDataTypeMultiplicity"
+    // InternalFormalML.g:1479:1: ruleDataTypeMultiplicity : ( ( rule__DataTypeMultiplicity__Alternatives ) ) ;
+    public final void ruleDataTypeMultiplicity() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1483:2: ( ( ( rule__DataTypeMultiplicity__Alternatives ) ) )
+            // InternalFormalML.g:1484:2: ( ( rule__DataTypeMultiplicity__Alternatives ) )
+            {
+            // InternalFormalML.g:1484:2: ( ( rule__DataTypeMultiplicity__Alternatives ) )
+            // InternalFormalML.g:1485:3: ( rule__DataTypeMultiplicity__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeMultiplicityAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1486:3: ( rule__DataTypeMultiplicity__Alternatives )
+            // InternalFormalML.g:1486:4: rule__DataTypeMultiplicity__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeMultiplicity__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeMultiplicityAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDataTypeMultiplicity"
+
+
+    // $ANTLR start "entryRuleDataTypeReference"
+    // InternalFormalML.g:1495:1: entryRuleDataTypeReference : ruleDataTypeReference EOF ;
+    public final void entryRuleDataTypeReference() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1496:1: ( ruleDataTypeReference EOF )
+            // InternalFormalML.g:1497:1: ruleDataTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDataTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDataTypeReference"
+
+
+    // $ANTLR start "ruleDataTypeReference"
+    // InternalFormalML.g:1504:1: ruleDataTypeReference : ( ( rule__DataTypeReference__Alternatives ) ) ;
+    public final void ruleDataTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1508:2: ( ( ( rule__DataTypeReference__Alternatives ) ) )
+            // InternalFormalML.g:1509:2: ( ( rule__DataTypeReference__Alternatives ) )
+            {
+            // InternalFormalML.g:1509:2: ( ( rule__DataTypeReference__Alternatives ) )
+            // InternalFormalML.g:1510:3: ( rule__DataTypeReference__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1511:3: ( rule__DataTypeReference__Alternatives )
+            // InternalFormalML.g:1511:4: rule__DataTypeReference__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDataTypeReference"
+
+
+    // $ANTLR start "entryRuleOtherDataTypeDefinition"
+    // InternalFormalML.g:1520:1: entryRuleOtherDataTypeDefinition : ruleOtherDataTypeDefinition EOF ;
+    public final void entryRuleOtherDataTypeDefinition() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1521:1: ( ruleOtherDataTypeDefinition EOF )
+            // InternalFormalML.g:1522:1: ruleOtherDataTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleOtherDataTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOtherDataTypeDefinition"
+
+
+    // $ANTLR start "ruleOtherDataTypeDefinition"
+    // InternalFormalML.g:1529:1: ruleOtherDataTypeDefinition : ( ( rule__OtherDataTypeDefinition__Group__0 ) ) ;
+    public final void ruleOtherDataTypeDefinition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1533:2: ( ( ( rule__OtherDataTypeDefinition__Group__0 ) ) )
+            // InternalFormalML.g:1534:2: ( ( rule__OtherDataTypeDefinition__Group__0 ) )
+            {
+            // InternalFormalML.g:1534:2: ( ( rule__OtherDataTypeDefinition__Group__0 ) )
+            // InternalFormalML.g:1535:3: ( rule__OtherDataTypeDefinition__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1536:3: ( rule__OtherDataTypeDefinition__Group__0 )
+            // InternalFormalML.g:1536:4: rule__OtherDataTypeDefinition__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOtherDataTypeDefinition"
+
+
+    // $ANTLR start "entryRuleOtherDataTypeDefinitionImpl"
+    // InternalFormalML.g:1545:1: entryRuleOtherDataTypeDefinitionImpl : ruleOtherDataTypeDefinitionImpl EOF ;
+    public final void entryRuleOtherDataTypeDefinitionImpl() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1546:1: ( ruleOtherDataTypeDefinitionImpl EOF )
+            // InternalFormalML.g:1547:1: ruleOtherDataTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleOtherDataTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOtherDataTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleOtherDataTypeDefinitionImpl"
+    // InternalFormalML.g:1554:1: ruleOtherDataTypeDefinitionImpl : ( ( rule__OtherDataTypeDefinitionImpl__Group__0 ) ) ;
+    public final void ruleOtherDataTypeDefinitionImpl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1558:2: ( ( ( rule__OtherDataTypeDefinitionImpl__Group__0 ) ) )
+            // InternalFormalML.g:1559:2: ( ( rule__OtherDataTypeDefinitionImpl__Group__0 ) )
+            {
+            // InternalFormalML.g:1559:2: ( ( rule__OtherDataTypeDefinitionImpl__Group__0 ) )
+            // InternalFormalML.g:1560:3: ( rule__OtherDataTypeDefinitionImpl__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1561:3: ( rule__OtherDataTypeDefinitionImpl__Group__0 )
+            // InternalFormalML.g:1561:4: rule__OtherDataTypeDefinitionImpl__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOtherDataTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleDataType"
+    // InternalFormalML.g:1570:1: entryRuleDataType : ruleDataType EOF ;
+    public final void entryRuleDataType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1571:1: ( ruleDataType EOF )
+            // InternalFormalML.g:1572:1: ruleDataType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDataType"
+
+
+    // $ANTLR start "ruleDataType"
+    // InternalFormalML.g:1579:1: ruleDataType : ( ( rule__DataType__Alternatives ) ) ;
+    public final void ruleDataType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1583:2: ( ( ( rule__DataType__Alternatives ) ) )
+            // InternalFormalML.g:1584:2: ( ( rule__DataType__Alternatives ) )
+            {
+            // InternalFormalML.g:1584:2: ( ( rule__DataType__Alternatives ) )
+            // InternalFormalML.g:1585:3: ( rule__DataType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1586:3: ( rule__DataType__Alternatives )
+            // InternalFormalML.g:1586:4: rule__DataType__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDataType"
+
+
+    // $ANTLR start "entryRuleSimpleDataType"
+    // InternalFormalML.g:1595:1: entryRuleSimpleDataType : ruleSimpleDataType EOF ;
+    public final void entryRuleSimpleDataType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1596:1: ( ruleSimpleDataType EOF )
+            // InternalFormalML.g:1597:1: ruleSimpleDataType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleDataTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSimpleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleDataTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSimpleDataType"
+
+
+    // $ANTLR start "ruleSimpleDataType"
+    // InternalFormalML.g:1604:1: ruleSimpleDataType : ( ( rule__SimpleDataType__Alternatives ) ) ;
+    public final void ruleSimpleDataType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1608:2: ( ( ( rule__SimpleDataType__Alternatives ) ) )
+            // InternalFormalML.g:1609:2: ( ( rule__SimpleDataType__Alternatives ) )
+            {
+            // InternalFormalML.g:1609:2: ( ( rule__SimpleDataType__Alternatives ) )
+            // InternalFormalML.g:1610:3: ( rule__SimpleDataType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleDataTypeAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1611:3: ( rule__SimpleDataType__Alternatives )
+            // InternalFormalML.g:1611:4: rule__SimpleDataType__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleDataType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleDataTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSimpleDataType"
+
+
+    // $ANTLR start "entryRuleStructuredDataType"
+    // InternalFormalML.g:1620:1: entryRuleStructuredDataType : ruleStructuredDataType EOF ;
+    public final void entryRuleStructuredDataType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1621:1: ( ruleStructuredDataType EOF )
+            // InternalFormalML.g:1622:1: ruleStructuredDataType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructuredDataTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleStructuredDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructuredDataTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStructuredDataType"
+
+
+    // $ANTLR start "ruleStructuredDataType"
+    // InternalFormalML.g:1629:1: ruleStructuredDataType : ( ( rule__StructuredDataType__Alternatives ) ) ;
+    public final void ruleStructuredDataType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1633:2: ( ( ( rule__StructuredDataType__Alternatives ) ) )
+            // InternalFormalML.g:1634:2: ( ( rule__StructuredDataType__Alternatives ) )
+            {
+            // InternalFormalML.g:1634:2: ( ( rule__StructuredDataType__Alternatives ) )
+            // InternalFormalML.g:1635:3: ( rule__StructuredDataType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructuredDataTypeAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1636:3: ( rule__StructuredDataType__Alternatives )
+            // InternalFormalML.g:1636:4: rule__StructuredDataType__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructuredDataType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructuredDataTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStructuredDataType"
+
+
+    // $ANTLR start "entryRulePrimitiveType"
+    // InternalFormalML.g:1645:1: entryRulePrimitiveType : rulePrimitiveType EOF ;
+    public final void entryRulePrimitiveType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1646:1: ( rulePrimitiveType EOF )
+            // InternalFormalML.g:1647:1: rulePrimitiveType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveType"
+
+
+    // $ANTLR start "rulePrimitiveType"
+    // InternalFormalML.g:1654:1: rulePrimitiveType : ( ( rule__PrimitiveType__Alternatives ) ) ;
+    public final void rulePrimitiveType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1658:2: ( ( ( rule__PrimitiveType__Alternatives ) ) )
+            // InternalFormalML.g:1659:2: ( ( rule__PrimitiveType__Alternatives ) )
+            {
+            // InternalFormalML.g:1659:2: ( ( rule__PrimitiveType__Alternatives ) )
+            // InternalFormalML.g:1660:3: ( rule__PrimitiveType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTypeAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1661:3: ( rule__PrimitiveType__Alternatives )
+            // InternalFormalML.g:1661:4: rule__PrimitiveType__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveType"
+
+
+    // $ANTLR start "entryRulePrimitiveNumberType"
+    // InternalFormalML.g:1670:1: entryRulePrimitiveNumberType : rulePrimitiveNumberType EOF ;
+    public final void entryRulePrimitiveNumberType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1671:1: ( rulePrimitiveNumberType EOF )
+            // InternalFormalML.g:1672:1: rulePrimitiveNumberType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveNumberTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveNumberType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveNumberTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveNumberType"
+
+
+    // $ANTLR start "rulePrimitiveNumberType"
+    // InternalFormalML.g:1679:1: rulePrimitiveNumberType : ( ( rule__PrimitiveNumberType__Alternatives ) ) ;
+    public final void rulePrimitiveNumberType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1683:2: ( ( ( rule__PrimitiveNumberType__Alternatives ) ) )
+            // InternalFormalML.g:1684:2: ( ( rule__PrimitiveNumberType__Alternatives ) )
+            {
+            // InternalFormalML.g:1684:2: ( ( rule__PrimitiveNumberType__Alternatives ) )
+            // InternalFormalML.g:1685:3: ( rule__PrimitiveNumberType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveNumberTypeAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1686:3: ( rule__PrimitiveNumberType__Alternatives )
+            // InternalFormalML.g:1686:4: rule__PrimitiveNumberType__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveNumberType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveNumberTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveNumberType"
+
+
+    // $ANTLR start "entryRulePrimitiveIntegerType"
+    // InternalFormalML.g:1695:1: entryRulePrimitiveIntegerType : rulePrimitiveIntegerType EOF ;
+    public final void entryRulePrimitiveIntegerType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1696:1: ( rulePrimitiveIntegerType EOF )
+            // InternalFormalML.g:1697:1: rulePrimitiveIntegerType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveIntegerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveIntegerType"
+
+
+    // $ANTLR start "rulePrimitiveIntegerType"
+    // InternalFormalML.g:1704:1: rulePrimitiveIntegerType : ( ( rule__PrimitiveIntegerType__Group__0 ) ) ;
+    public final void rulePrimitiveIntegerType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1708:2: ( ( ( rule__PrimitiveIntegerType__Group__0 ) ) )
+            // InternalFormalML.g:1709:2: ( ( rule__PrimitiveIntegerType__Group__0 ) )
+            {
+            // InternalFormalML.g:1709:2: ( ( rule__PrimitiveIntegerType__Group__0 ) )
+            // InternalFormalML.g:1710:3: ( rule__PrimitiveIntegerType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1711:3: ( rule__PrimitiveIntegerType__Group__0 )
+            // InternalFormalML.g:1711:4: rule__PrimitiveIntegerType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveIntegerType"
+
+
+    // $ANTLR start "entryRulePrimitiveRationalType"
+    // InternalFormalML.g:1720:1: entryRulePrimitiveRationalType : rulePrimitiveRationalType EOF ;
+    public final void entryRulePrimitiveRationalType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1721:1: ( rulePrimitiveRationalType EOF )
+            // InternalFormalML.g:1722:1: rulePrimitiveRationalType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveRationalType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveRationalType"
+
+
+    // $ANTLR start "rulePrimitiveRationalType"
+    // InternalFormalML.g:1729:1: rulePrimitiveRationalType : ( ( rule__PrimitiveRationalType__Group__0 ) ) ;
+    public final void rulePrimitiveRationalType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1733:2: ( ( ( rule__PrimitiveRationalType__Group__0 ) ) )
+            // InternalFormalML.g:1734:2: ( ( rule__PrimitiveRationalType__Group__0 ) )
+            {
+            // InternalFormalML.g:1734:2: ( ( rule__PrimitiveRationalType__Group__0 ) )
+            // InternalFormalML.g:1735:3: ( rule__PrimitiveRationalType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1736:3: ( rule__PrimitiveRationalType__Group__0 )
+            // InternalFormalML.g:1736:4: rule__PrimitiveRationalType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveRationalType"
+
+
+    // $ANTLR start "entryRulePrimitiveFloatType"
+    // InternalFormalML.g:1745:1: entryRulePrimitiveFloatType : rulePrimitiveFloatType EOF ;
+    public final void entryRulePrimitiveFloatType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1746:1: ( rulePrimitiveFloatType EOF )
+            // InternalFormalML.g:1747:1: rulePrimitiveFloatType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveFloatType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveFloatType"
+
+
+    // $ANTLR start "rulePrimitiveFloatType"
+    // InternalFormalML.g:1754:1: rulePrimitiveFloatType : ( ( rule__PrimitiveFloatType__Group__0 ) ) ;
+    public final void rulePrimitiveFloatType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1758:2: ( ( ( rule__PrimitiveFloatType__Group__0 ) ) )
+            // InternalFormalML.g:1759:2: ( ( rule__PrimitiveFloatType__Group__0 ) )
+            {
+            // InternalFormalML.g:1759:2: ( ( rule__PrimitiveFloatType__Group__0 ) )
+            // InternalFormalML.g:1760:3: ( rule__PrimitiveFloatType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1761:3: ( rule__PrimitiveFloatType__Group__0 )
+            // InternalFormalML.g:1761:4: rule__PrimitiveFloatType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveFloatType"
+
+
+    // $ANTLR start "entryRulePrimitiveRealType"
+    // InternalFormalML.g:1770:1: entryRulePrimitiveRealType : rulePrimitiveRealType EOF ;
+    public final void entryRulePrimitiveRealType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1771:1: ( rulePrimitiveRealType EOF )
+            // InternalFormalML.g:1772:1: rulePrimitiveRealType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveRealType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveRealType"
+
+
+    // $ANTLR start "rulePrimitiveRealType"
+    // InternalFormalML.g:1779:1: rulePrimitiveRealType : ( ( rule__PrimitiveRealType__Group__0 ) ) ;
+    public final void rulePrimitiveRealType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1783:2: ( ( ( rule__PrimitiveRealType__Group__0 ) ) )
+            // InternalFormalML.g:1784:2: ( ( rule__PrimitiveRealType__Group__0 ) )
+            {
+            // InternalFormalML.g:1784:2: ( ( rule__PrimitiveRealType__Group__0 ) )
+            // InternalFormalML.g:1785:3: ( rule__PrimitiveRealType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1786:3: ( rule__PrimitiveRealType__Group__0 )
+            // InternalFormalML.g:1786:4: rule__PrimitiveRealType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveRealType"
+
+
+    // $ANTLR start "entryRulePrimitiveTimeType"
+    // InternalFormalML.g:1795:1: entryRulePrimitiveTimeType : rulePrimitiveTimeType EOF ;
+    public final void entryRulePrimitiveTimeType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1796:1: ( rulePrimitiveTimeType EOF )
+            // InternalFormalML.g:1797:1: rulePrimitiveTimeType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveTimeType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveTimeType"
+
+
+    // $ANTLR start "rulePrimitiveTimeType"
+    // InternalFormalML.g:1804:1: rulePrimitiveTimeType : ( ( rule__PrimitiveTimeType__Alternatives ) ) ;
+    public final void rulePrimitiveTimeType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1808:2: ( ( ( rule__PrimitiveTimeType__Alternatives ) ) )
+            // InternalFormalML.g:1809:2: ( ( rule__PrimitiveTimeType__Alternatives ) )
+            {
+            // InternalFormalML.g:1809:2: ( ( rule__PrimitiveTimeType__Alternatives ) )
+            // InternalFormalML.g:1810:3: ( rule__PrimitiveTimeType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1811:3: ( rule__PrimitiveTimeType__Alternatives )
+            // InternalFormalML.g:1811:4: rule__PrimitiveTimeType__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveTimeType"
+
+
+    // $ANTLR start "entryRulePrimitiveTimeNumberType"
+    // InternalFormalML.g:1820:1: entryRulePrimitiveTimeNumberType : rulePrimitiveTimeNumberType EOF ;
+    public final void entryRulePrimitiveTimeNumberType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1821:1: ( rulePrimitiveTimeNumberType EOF )
+            // InternalFormalML.g:1822:1: rulePrimitiveTimeNumberType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeNumberTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveTimeNumberType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeNumberTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveTimeNumberType"
+
+
+    // $ANTLR start "rulePrimitiveTimeNumberType"
+    // InternalFormalML.g:1829:1: rulePrimitiveTimeNumberType : ( ( rule__PrimitiveTimeNumberType__Alternatives ) ) ;
+    public final void rulePrimitiveTimeNumberType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1833:2: ( ( ( rule__PrimitiveTimeNumberType__Alternatives ) ) )
+            // InternalFormalML.g:1834:2: ( ( rule__PrimitiveTimeNumberType__Alternatives ) )
+            {
+            // InternalFormalML.g:1834:2: ( ( rule__PrimitiveTimeNumberType__Alternatives ) )
+            // InternalFormalML.g:1835:3: ( rule__PrimitiveTimeNumberType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1836:3: ( rule__PrimitiveTimeNumberType__Alternatives )
+            // InternalFormalML.g:1836:4: rule__PrimitiveTimeNumberType__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeNumberType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveTimeNumberType"
+
+
+    // $ANTLR start "entryRuleOtherPrimitiveType"
+    // InternalFormalML.g:1845:1: entryRuleOtherPrimitiveType : ruleOtherPrimitiveType EOF ;
+    public final void entryRuleOtherPrimitiveType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1846:1: ( ruleOtherPrimitiveType EOF )
+            // InternalFormalML.g:1847:1: ruleOtherPrimitiveType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPrimitiveTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleOtherPrimitiveType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPrimitiveTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOtherPrimitiveType"
+
+
+    // $ANTLR start "ruleOtherPrimitiveType"
+    // InternalFormalML.g:1854:1: ruleOtherPrimitiveType : ( ( rule__OtherPrimitiveType__Alternatives ) ) ;
+    public final void ruleOtherPrimitiveType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1858:2: ( ( ( rule__OtherPrimitiveType__Alternatives ) ) )
+            // InternalFormalML.g:1859:2: ( ( rule__OtherPrimitiveType__Alternatives ) )
+            {
+            // InternalFormalML.g:1859:2: ( ( rule__OtherPrimitiveType__Alternatives ) )
+            // InternalFormalML.g:1860:3: ( rule__OtherPrimitiveType__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPrimitiveTypeAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:1861:3: ( rule__OtherPrimitiveType__Alternatives )
+            // InternalFormalML.g:1861:4: rule__OtherPrimitiveType__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPrimitiveType__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPrimitiveTypeAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOtherPrimitiveType"
+
+
+    // $ANTLR start "entryRulePrimitiveBooleanType"
+    // InternalFormalML.g:1870:1: entryRulePrimitiveBooleanType : rulePrimitiveBooleanType EOF ;
+    public final void entryRulePrimitiveBooleanType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1871:1: ( rulePrimitiveBooleanType EOF )
+            // InternalFormalML.g:1872:1: rulePrimitiveBooleanType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveBooleanTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveBooleanType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveBooleanTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveBooleanType"
+
+
+    // $ANTLR start "rulePrimitiveBooleanType"
+    // InternalFormalML.g:1879:1: rulePrimitiveBooleanType : ( ( rule__PrimitiveBooleanType__Group__0 ) ) ;
+    public final void rulePrimitiveBooleanType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1883:2: ( ( ( rule__PrimitiveBooleanType__Group__0 ) ) )
+            // InternalFormalML.g:1884:2: ( ( rule__PrimitiveBooleanType__Group__0 ) )
+            {
+            // InternalFormalML.g:1884:2: ( ( rule__PrimitiveBooleanType__Group__0 ) )
+            // InternalFormalML.g:1885:3: ( rule__PrimitiveBooleanType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveBooleanTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1886:3: ( rule__PrimitiveBooleanType__Group__0 )
+            // InternalFormalML.g:1886:4: rule__PrimitiveBooleanType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveBooleanType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveBooleanTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveBooleanType"
+
+
+    // $ANTLR start "entryRulePrimitiveCharacterType"
+    // InternalFormalML.g:1895:1: entryRulePrimitiveCharacterType : rulePrimitiveCharacterType EOF ;
+    public final void entryRulePrimitiveCharacterType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1896:1: ( rulePrimitiveCharacterType EOF )
+            // InternalFormalML.g:1897:1: rulePrimitiveCharacterType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveCharacterTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveCharacterType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveCharacterTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveCharacterType"
+
+
+    // $ANTLR start "rulePrimitiveCharacterType"
+    // InternalFormalML.g:1904:1: rulePrimitiveCharacterType : ( ( rule__PrimitiveCharacterType__Group__0 ) ) ;
+    public final void rulePrimitiveCharacterType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1908:2: ( ( ( rule__PrimitiveCharacterType__Group__0 ) ) )
+            // InternalFormalML.g:1909:2: ( ( rule__PrimitiveCharacterType__Group__0 ) )
+            {
+            // InternalFormalML.g:1909:2: ( ( rule__PrimitiveCharacterType__Group__0 ) )
+            // InternalFormalML.g:1910:3: ( rule__PrimitiveCharacterType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveCharacterTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1911:3: ( rule__PrimitiveCharacterType__Group__0 )
+            // InternalFormalML.g:1911:4: rule__PrimitiveCharacterType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveCharacterType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveCharacterTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveCharacterType"
+
+
+    // $ANTLR start "entryRulePrimitiveStringType"
+    // InternalFormalML.g:1920:1: entryRulePrimitiveStringType : rulePrimitiveStringType EOF ;
+    public final void entryRulePrimitiveStringType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1921:1: ( rulePrimitiveStringType EOF )
+            // InternalFormalML.g:1922:1: rulePrimitiveStringType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveStringType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveStringType"
+
+
+    // $ANTLR start "rulePrimitiveStringType"
+    // InternalFormalML.g:1929:1: rulePrimitiveStringType : ( ( rule__PrimitiveStringType__Group__0 ) ) ;
+    public final void rulePrimitiveStringType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1933:2: ( ( ( rule__PrimitiveStringType__Group__0 ) ) )
+            // InternalFormalML.g:1934:2: ( ( rule__PrimitiveStringType__Group__0 ) )
+            {
+            // InternalFormalML.g:1934:2: ( ( rule__PrimitiveStringType__Group__0 ) )
+            // InternalFormalML.g:1935:3: ( rule__PrimitiveStringType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1936:3: ( rule__PrimitiveStringType__Group__0 )
+            // InternalFormalML.g:1936:4: rule__PrimitiveStringType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveStringType"
+
+
+    // $ANTLR start "entryRulePrimitiveInstanceType"
+    // InternalFormalML.g:1945:1: entryRulePrimitiveInstanceType : rulePrimitiveInstanceType EOF ;
+    public final void entryRulePrimitiveInstanceType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1946:1: ( rulePrimitiveInstanceType EOF )
+            // InternalFormalML.g:1947:1: rulePrimitiveInstanceType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimitiveInstanceType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimitiveInstanceType"
+
+
+    // $ANTLR start "rulePrimitiveInstanceType"
+    // InternalFormalML.g:1954:1: rulePrimitiveInstanceType : ( ( rule__PrimitiveInstanceType__Group__0 ) ) ;
+    public final void rulePrimitiveInstanceType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1958:2: ( ( ( rule__PrimitiveInstanceType__Group__0 ) ) )
+            // InternalFormalML.g:1959:2: ( ( rule__PrimitiveInstanceType__Group__0 ) )
+            {
+            // InternalFormalML.g:1959:2: ( ( rule__PrimitiveInstanceType__Group__0 ) )
+            // InternalFormalML.g:1960:3: ( rule__PrimitiveInstanceType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1961:3: ( rule__PrimitiveInstanceType__Group__0 )
+            // InternalFormalML.g:1961:4: rule__PrimitiveInstanceType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveInstanceType"
+
+
+    // $ANTLR start "entryRuleIntervalType"
+    // InternalFormalML.g:1970:1: entryRuleIntervalType : ruleIntervalType EOF ;
+    public final void entryRuleIntervalType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1971:1: ( ruleIntervalType EOF )
+            // InternalFormalML.g:1972:1: ruleIntervalType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleIntervalType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIntervalType"
+
+
+    // $ANTLR start "ruleIntervalType"
+    // InternalFormalML.g:1979:1: ruleIntervalType : ( ( rule__IntervalType__Group__0 ) ) ;
+    public final void ruleIntervalType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:1983:2: ( ( ( rule__IntervalType__Group__0 ) ) )
+            // InternalFormalML.g:1984:2: ( ( rule__IntervalType__Group__0 ) )
+            {
+            // InternalFormalML.g:1984:2: ( ( rule__IntervalType__Group__0 ) )
+            // InternalFormalML.g:1985:3: ( rule__IntervalType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:1986:3: ( rule__IntervalType__Group__0 )
+            // InternalFormalML.g:1986:4: rule__IntervalType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIntervalType"
+
+
+    // $ANTLR start "entryRuleIntervalTypeDefinition"
+    // InternalFormalML.g:1995:1: entryRuleIntervalTypeDefinition : ruleIntervalTypeDefinition EOF ;
+    public final void entryRuleIntervalTypeDefinition() throws RecognitionException {
+        try {
+            // InternalFormalML.g:1996:1: ( ruleIntervalTypeDefinition EOF )
+            // InternalFormalML.g:1997:1: ruleIntervalTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleIntervalTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIntervalTypeDefinition"
+
+
+    // $ANTLR start "ruleIntervalTypeDefinition"
+    // InternalFormalML.g:2004:1: ruleIntervalTypeDefinition : ( ( rule__IntervalTypeDefinition__Group__0 ) ) ;
+    public final void ruleIntervalTypeDefinition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2008:2: ( ( ( rule__IntervalTypeDefinition__Group__0 ) ) )
+            // InternalFormalML.g:2009:2: ( ( rule__IntervalTypeDefinition__Group__0 ) )
+            {
+            // InternalFormalML.g:2009:2: ( ( rule__IntervalTypeDefinition__Group__0 ) )
+            // InternalFormalML.g:2010:3: ( rule__IntervalTypeDefinition__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2011:3: ( rule__IntervalTypeDefinition__Group__0 )
+            // InternalFormalML.g:2011:4: rule__IntervalTypeDefinition__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIntervalTypeDefinition"
+
+
+    // $ANTLR start "entryRuleIntervalTypeDefinitionImpl"
+    // InternalFormalML.g:2020:1: entryRuleIntervalTypeDefinitionImpl : ruleIntervalTypeDefinitionImpl EOF ;
+    public final void entryRuleIntervalTypeDefinitionImpl() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2021:1: ( ruleIntervalTypeDefinitionImpl EOF )
+            // InternalFormalML.g:2022:1: ruleIntervalTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleIntervalTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIntervalTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleIntervalTypeDefinitionImpl"
+    // InternalFormalML.g:2029:1: ruleIntervalTypeDefinitionImpl : ( ( rule__IntervalTypeDefinitionImpl__Group__0 ) ) ;
+    public final void ruleIntervalTypeDefinitionImpl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2033:2: ( ( ( rule__IntervalTypeDefinitionImpl__Group__0 ) ) )
+            // InternalFormalML.g:2034:2: ( ( rule__IntervalTypeDefinitionImpl__Group__0 ) )
+            {
+            // InternalFormalML.g:2034:2: ( ( rule__IntervalTypeDefinitionImpl__Group__0 ) )
+            // InternalFormalML.g:2035:3: ( rule__IntervalTypeDefinitionImpl__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2036:3: ( rule__IntervalTypeDefinitionImpl__Group__0 )
+            // InternalFormalML.g:2036:4: rule__IntervalTypeDefinitionImpl__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIntervalTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleCollectionType"
+    // InternalFormalML.g:2045:1: entryRuleCollectionType : ruleCollectionType EOF ;
+    public final void entryRuleCollectionType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2046:1: ( ruleCollectionType EOF )
+            // InternalFormalML.g:2047:1: ruleCollectionType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleCollectionType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleCollectionType"
+
+
+    // $ANTLR start "ruleCollectionType"
+    // InternalFormalML.g:2054:1: ruleCollectionType : ( ( rule__CollectionType__Group__0 ) ) ;
+    public final void ruleCollectionType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2058:2: ( ( ( rule__CollectionType__Group__0 ) ) )
+            // InternalFormalML.g:2059:2: ( ( rule__CollectionType__Group__0 ) )
+            {
+            // InternalFormalML.g:2059:2: ( ( rule__CollectionType__Group__0 ) )
+            // InternalFormalML.g:2060:3: ( rule__CollectionType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2061:3: ( rule__CollectionType__Group__0 )
+            // InternalFormalML.g:2061:4: rule__CollectionType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleCollectionType"
+
+
+    // $ANTLR start "entryRuleCollectionTypeDefinition"
+    // InternalFormalML.g:2070:1: entryRuleCollectionTypeDefinition : ruleCollectionTypeDefinition EOF ;
+    public final void entryRuleCollectionTypeDefinition() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2071:1: ( ruleCollectionTypeDefinition EOF )
+            // InternalFormalML.g:2072:1: ruleCollectionTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleCollectionTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleCollectionTypeDefinition"
+
+
+    // $ANTLR start "ruleCollectionTypeDefinition"
+    // InternalFormalML.g:2079:1: ruleCollectionTypeDefinition : ( ( rule__CollectionTypeDefinition__Group__0 ) ) ;
+    public final void ruleCollectionTypeDefinition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2083:2: ( ( ( rule__CollectionTypeDefinition__Group__0 ) ) )
+            // InternalFormalML.g:2084:2: ( ( rule__CollectionTypeDefinition__Group__0 ) )
+            {
+            // InternalFormalML.g:2084:2: ( ( rule__CollectionTypeDefinition__Group__0 ) )
+            // InternalFormalML.g:2085:3: ( rule__CollectionTypeDefinition__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2086:3: ( rule__CollectionTypeDefinition__Group__0 )
+            // InternalFormalML.g:2086:4: rule__CollectionTypeDefinition__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleCollectionTypeDefinition"
+
+
+    // $ANTLR start "entryRuleCollectionTypeDefinitionImpl"
+    // InternalFormalML.g:2095:1: entryRuleCollectionTypeDefinitionImpl : ruleCollectionTypeDefinitionImpl EOF ;
+    public final void entryRuleCollectionTypeDefinitionImpl() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2096:1: ( ruleCollectionTypeDefinitionImpl EOF )
+            // InternalFormalML.g:2097:1: ruleCollectionTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleCollectionTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleCollectionTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleCollectionTypeDefinitionImpl"
+    // InternalFormalML.g:2104:1: ruleCollectionTypeDefinitionImpl : ( ( rule__CollectionTypeDefinitionImpl__Group__0 ) ) ;
+    public final void ruleCollectionTypeDefinitionImpl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2108:2: ( ( ( rule__CollectionTypeDefinitionImpl__Group__0 ) ) )
+            // InternalFormalML.g:2109:2: ( ( rule__CollectionTypeDefinitionImpl__Group__0 ) )
+            {
+            // InternalFormalML.g:2109:2: ( ( rule__CollectionTypeDefinitionImpl__Group__0 ) )
+            // InternalFormalML.g:2110:3: ( rule__CollectionTypeDefinitionImpl__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2111:3: ( rule__CollectionTypeDefinitionImpl__Group__0 )
+            // InternalFormalML.g:2111:4: rule__CollectionTypeDefinitionImpl__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleCollectionTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleEnumerationType"
+    // InternalFormalML.g:2120:1: entryRuleEnumerationType : ruleEnumerationType EOF ;
+    public final void entryRuleEnumerationType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2121:1: ( ruleEnumerationType EOF )
+            // InternalFormalML.g:2122:1: ruleEnumerationType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEnumerationType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEnumerationType"
+
+
+    // $ANTLR start "ruleEnumerationType"
+    // InternalFormalML.g:2129:1: ruleEnumerationType : ( ( rule__EnumerationType__Group__0 ) ) ;
+    public final void ruleEnumerationType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2133:2: ( ( ( rule__EnumerationType__Group__0 ) ) )
+            // InternalFormalML.g:2134:2: ( ( rule__EnumerationType__Group__0 ) )
+            {
+            // InternalFormalML.g:2134:2: ( ( rule__EnumerationType__Group__0 ) )
+            // InternalFormalML.g:2135:3: ( rule__EnumerationType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2136:3: ( rule__EnumerationType__Group__0 )
+            // InternalFormalML.g:2136:4: rule__EnumerationType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEnumerationType"
+
+
+    // $ANTLR start "entryRuleEnumerationTypeDefinition"
+    // InternalFormalML.g:2145:1: entryRuleEnumerationTypeDefinition : ruleEnumerationTypeDefinition EOF ;
+    public final void entryRuleEnumerationTypeDefinition() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2146:1: ( ruleEnumerationTypeDefinition EOF )
+            // InternalFormalML.g:2147:1: ruleEnumerationTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEnumerationTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEnumerationTypeDefinition"
+
+
+    // $ANTLR start "ruleEnumerationTypeDefinition"
+    // InternalFormalML.g:2154:1: ruleEnumerationTypeDefinition : ( ( rule__EnumerationTypeDefinition__Group__0 ) ) ;
+    public final void ruleEnumerationTypeDefinition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2158:2: ( ( ( rule__EnumerationTypeDefinition__Group__0 ) ) )
+            // InternalFormalML.g:2159:2: ( ( rule__EnumerationTypeDefinition__Group__0 ) )
+            {
+            // InternalFormalML.g:2159:2: ( ( rule__EnumerationTypeDefinition__Group__0 ) )
+            // InternalFormalML.g:2160:3: ( rule__EnumerationTypeDefinition__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2161:3: ( rule__EnumerationTypeDefinition__Group__0 )
+            // InternalFormalML.g:2161:4: rule__EnumerationTypeDefinition__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEnumerationTypeDefinition"
+
+
+    // $ANTLR start "entryRuleEnumerationTypeDefinitionImpl"
+    // InternalFormalML.g:2170:1: entryRuleEnumerationTypeDefinitionImpl : ruleEnumerationTypeDefinitionImpl EOF ;
+    public final void entryRuleEnumerationTypeDefinitionImpl() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2171:1: ( ruleEnumerationTypeDefinitionImpl EOF )
+            // InternalFormalML.g:2172:1: ruleEnumerationTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEnumerationTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEnumerationTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleEnumerationTypeDefinitionImpl"
+    // InternalFormalML.g:2179:1: ruleEnumerationTypeDefinitionImpl : ( ( rule__EnumerationTypeDefinitionImpl__Group__0 ) ) ;
+    public final void ruleEnumerationTypeDefinitionImpl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2183:2: ( ( ( rule__EnumerationTypeDefinitionImpl__Group__0 ) ) )
+            // InternalFormalML.g:2184:2: ( ( rule__EnumerationTypeDefinitionImpl__Group__0 ) )
+            {
+            // InternalFormalML.g:2184:2: ( ( rule__EnumerationTypeDefinitionImpl__Group__0 ) )
+            // InternalFormalML.g:2185:3: ( rule__EnumerationTypeDefinitionImpl__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2186:3: ( rule__EnumerationTypeDefinitionImpl__Group__0 )
+            // InternalFormalML.g:2186:4: rule__EnumerationTypeDefinitionImpl__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEnumerationTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleEnumerationLiteral"
+    // InternalFormalML.g:2195:1: entryRuleEnumerationLiteral : ruleEnumerationLiteral EOF ;
+    public final void entryRuleEnumerationLiteral() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2196:1: ( ruleEnumerationLiteral EOF )
+            // InternalFormalML.g:2197:1: ruleEnumerationLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEnumerationLiteral"
+
+
+    // $ANTLR start "ruleEnumerationLiteral"
+    // InternalFormalML.g:2204:1: ruleEnumerationLiteral : ( ( rule__EnumerationLiteral__Group__0 ) ) ;
+    public final void ruleEnumerationLiteral() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2208:2: ( ( ( rule__EnumerationLiteral__Group__0 ) ) )
+            // InternalFormalML.g:2209:2: ( ( rule__EnumerationLiteral__Group__0 ) )
+            {
+            // InternalFormalML.g:2209:2: ( ( rule__EnumerationLiteral__Group__0 ) )
+            // InternalFormalML.g:2210:3: ( rule__EnumerationLiteral__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2211:3: ( rule__EnumerationLiteral__Group__0 )
+            // InternalFormalML.g:2211:4: rule__EnumerationLiteral__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationLiteral__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEnumerationLiteral"
+
+
+    // $ANTLR start "entryRuleStructureType"
+    // InternalFormalML.g:2220:1: entryRuleStructureType : ruleStructureType EOF ;
+    public final void entryRuleStructureType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2221:1: ( ruleStructureType EOF )
+            // InternalFormalML.g:2222:1: ruleStructureType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleStructureType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStructureType"
+
+
+    // $ANTLR start "ruleStructureType"
+    // InternalFormalML.g:2229:1: ruleStructureType : ( ( rule__StructureType__Group__0 ) ) ;
+    public final void ruleStructureType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2233:2: ( ( ( rule__StructureType__Group__0 ) ) )
+            // InternalFormalML.g:2234:2: ( ( rule__StructureType__Group__0 ) )
+            {
+            // InternalFormalML.g:2234:2: ( ( rule__StructureType__Group__0 ) )
+            // InternalFormalML.g:2235:3: ( rule__StructureType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2236:3: ( rule__StructureType__Group__0 )
+            // InternalFormalML.g:2236:4: rule__StructureType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStructureType"
+
+
+    // $ANTLR start "entryRuleStructureTypeDefinition"
+    // InternalFormalML.g:2245:1: entryRuleStructureTypeDefinition : ruleStructureTypeDefinition EOF ;
+    public final void entryRuleStructureTypeDefinition() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2246:1: ( ruleStructureTypeDefinition EOF )
+            // InternalFormalML.g:2247:1: ruleStructureTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleStructureTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStructureTypeDefinition"
+
+
+    // $ANTLR start "ruleStructureTypeDefinition"
+    // InternalFormalML.g:2254:1: ruleStructureTypeDefinition : ( ( rule__StructureTypeDefinition__Group__0 ) ) ;
+    public final void ruleStructureTypeDefinition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2258:2: ( ( ( rule__StructureTypeDefinition__Group__0 ) ) )
+            // InternalFormalML.g:2259:2: ( ( rule__StructureTypeDefinition__Group__0 ) )
+            {
+            // InternalFormalML.g:2259:2: ( ( rule__StructureTypeDefinition__Group__0 ) )
+            // InternalFormalML.g:2260:3: ( rule__StructureTypeDefinition__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2261:3: ( rule__StructureTypeDefinition__Group__0 )
+            // InternalFormalML.g:2261:4: rule__StructureTypeDefinition__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStructureTypeDefinition"
+
+
+    // $ANTLR start "entryRuleStructureTypeDefinitionImpl"
+    // InternalFormalML.g:2270:1: entryRuleStructureTypeDefinitionImpl : ruleStructureTypeDefinitionImpl EOF ;
+    public final void entryRuleStructureTypeDefinitionImpl() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2271:1: ( ruleStructureTypeDefinitionImpl EOF )
+            // InternalFormalML.g:2272:1: ruleStructureTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleStructureTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStructureTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleStructureTypeDefinitionImpl"
+    // InternalFormalML.g:2279:1: ruleStructureTypeDefinitionImpl : ( ( rule__StructureTypeDefinitionImpl__Group__0 ) ) ;
+    public final void ruleStructureTypeDefinitionImpl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2283:2: ( ( ( rule__StructureTypeDefinitionImpl__Group__0 ) ) )
+            // InternalFormalML.g:2284:2: ( ( rule__StructureTypeDefinitionImpl__Group__0 ) )
+            {
+            // InternalFormalML.g:2284:2: ( ( rule__StructureTypeDefinitionImpl__Group__0 ) )
+            // InternalFormalML.g:2285:3: ( rule__StructureTypeDefinitionImpl__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2286:3: ( rule__StructureTypeDefinitionImpl__Group__0 )
+            // InternalFormalML.g:2286:4: rule__StructureTypeDefinitionImpl__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStructureTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleUnionType"
+    // InternalFormalML.g:2295:1: entryRuleUnionType : ruleUnionType EOF ;
+    public final void entryRuleUnionType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2296:1: ( ruleUnionType EOF )
+            // InternalFormalML.g:2297:1: ruleUnionType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleUnionType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleUnionType"
+
+
+    // $ANTLR start "ruleUnionType"
+    // InternalFormalML.g:2304:1: ruleUnionType : ( ( rule__UnionType__Group__0 ) ) ;
+    public final void ruleUnionType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2308:2: ( ( ( rule__UnionType__Group__0 ) ) )
+            // InternalFormalML.g:2309:2: ( ( rule__UnionType__Group__0 ) )
+            {
+            // InternalFormalML.g:2309:2: ( ( rule__UnionType__Group__0 ) )
+            // InternalFormalML.g:2310:3: ( rule__UnionType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2311:3: ( rule__UnionType__Group__0 )
+            // InternalFormalML.g:2311:4: rule__UnionType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleUnionType"
+
+
+    // $ANTLR start "entryRuleUnionTypeDefinition"
+    // InternalFormalML.g:2320:1: entryRuleUnionTypeDefinition : ruleUnionTypeDefinition EOF ;
+    public final void entryRuleUnionTypeDefinition() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2321:1: ( ruleUnionTypeDefinition EOF )
+            // InternalFormalML.g:2322:1: ruleUnionTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleUnionTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleUnionTypeDefinition"
+
+
+    // $ANTLR start "ruleUnionTypeDefinition"
+    // InternalFormalML.g:2329:1: ruleUnionTypeDefinition : ( ( rule__UnionTypeDefinition__Group__0 ) ) ;
+    public final void ruleUnionTypeDefinition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2333:2: ( ( ( rule__UnionTypeDefinition__Group__0 ) ) )
+            // InternalFormalML.g:2334:2: ( ( rule__UnionTypeDefinition__Group__0 ) )
+            {
+            // InternalFormalML.g:2334:2: ( ( rule__UnionTypeDefinition__Group__0 ) )
+            // InternalFormalML.g:2335:3: ( rule__UnionTypeDefinition__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2336:3: ( rule__UnionTypeDefinition__Group__0 )
+            // InternalFormalML.g:2336:4: rule__UnionTypeDefinition__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleUnionTypeDefinition"
+
+
+    // $ANTLR start "entryRuleUnionTypeDefinitionImpl"
+    // InternalFormalML.g:2345:1: entryRuleUnionTypeDefinitionImpl : ruleUnionTypeDefinitionImpl EOF ;
+    public final void entryRuleUnionTypeDefinitionImpl() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2346:1: ( ruleUnionTypeDefinitionImpl EOF )
+            // InternalFormalML.g:2347:1: ruleUnionTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleUnionTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleUnionTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleUnionTypeDefinitionImpl"
+    // InternalFormalML.g:2354:1: ruleUnionTypeDefinitionImpl : ( ( rule__UnionTypeDefinitionImpl__Group__0 ) ) ;
+    public final void ruleUnionTypeDefinitionImpl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2358:2: ( ( ( rule__UnionTypeDefinitionImpl__Group__0 ) ) )
+            // InternalFormalML.g:2359:2: ( ( rule__UnionTypeDefinitionImpl__Group__0 ) )
+            {
+            // InternalFormalML.g:2359:2: ( ( rule__UnionTypeDefinitionImpl__Group__0 ) )
+            // InternalFormalML.g:2360:3: ( rule__UnionTypeDefinitionImpl__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2361:3: ( rule__UnionTypeDefinitionImpl__Group__0 )
+            // InternalFormalML.g:2361:4: rule__UnionTypeDefinitionImpl__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleUnionTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleChoiceType"
+    // InternalFormalML.g:2370:1: entryRuleChoiceType : ruleChoiceType EOF ;
+    public final void entryRuleChoiceType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2371:1: ( ruleChoiceType EOF )
+            // InternalFormalML.g:2372:1: ruleChoiceType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleChoiceType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleChoiceType"
+
+
+    // $ANTLR start "ruleChoiceType"
+    // InternalFormalML.g:2379:1: ruleChoiceType : ( ( rule__ChoiceType__Group__0 ) ) ;
+    public final void ruleChoiceType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2383:2: ( ( ( rule__ChoiceType__Group__0 ) ) )
+            // InternalFormalML.g:2384:2: ( ( rule__ChoiceType__Group__0 ) )
+            {
+            // InternalFormalML.g:2384:2: ( ( rule__ChoiceType__Group__0 ) )
+            // InternalFormalML.g:2385:3: ( rule__ChoiceType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2386:3: ( rule__ChoiceType__Group__0 )
+            // InternalFormalML.g:2386:4: rule__ChoiceType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleChoiceType"
+
+
+    // $ANTLR start "entryRuleChoiceTypeDefinition"
+    // InternalFormalML.g:2395:1: entryRuleChoiceTypeDefinition : ruleChoiceTypeDefinition EOF ;
+    public final void entryRuleChoiceTypeDefinition() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2396:1: ( ruleChoiceTypeDefinition EOF )
+            // InternalFormalML.g:2397:1: ruleChoiceTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleChoiceTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleChoiceTypeDefinition"
+
+
+    // $ANTLR start "ruleChoiceTypeDefinition"
+    // InternalFormalML.g:2404:1: ruleChoiceTypeDefinition : ( ( rule__ChoiceTypeDefinition__Group__0 ) ) ;
+    public final void ruleChoiceTypeDefinition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2408:2: ( ( ( rule__ChoiceTypeDefinition__Group__0 ) ) )
+            // InternalFormalML.g:2409:2: ( ( rule__ChoiceTypeDefinition__Group__0 ) )
+            {
+            // InternalFormalML.g:2409:2: ( ( rule__ChoiceTypeDefinition__Group__0 ) )
+            // InternalFormalML.g:2410:3: ( rule__ChoiceTypeDefinition__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2411:3: ( rule__ChoiceTypeDefinition__Group__0 )
+            // InternalFormalML.g:2411:4: rule__ChoiceTypeDefinition__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleChoiceTypeDefinition"
+
+
+    // $ANTLR start "entryRuleChoiceTypeDefinitionImpl"
+    // InternalFormalML.g:2420:1: entryRuleChoiceTypeDefinitionImpl : ruleChoiceTypeDefinitionImpl EOF ;
+    public final void entryRuleChoiceTypeDefinitionImpl() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2421:1: ( ruleChoiceTypeDefinitionImpl EOF )
+            // InternalFormalML.g:2422:1: ruleChoiceTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleChoiceTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleChoiceTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleChoiceTypeDefinitionImpl"
+    // InternalFormalML.g:2429:1: ruleChoiceTypeDefinitionImpl : ( ( rule__ChoiceTypeDefinitionImpl__Group__0 ) ) ;
+    public final void ruleChoiceTypeDefinitionImpl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2433:2: ( ( ( rule__ChoiceTypeDefinitionImpl__Group__0 ) ) )
+            // InternalFormalML.g:2434:2: ( ( rule__ChoiceTypeDefinitionImpl__Group__0 ) )
+            {
+            // InternalFormalML.g:2434:2: ( ( rule__ChoiceTypeDefinitionImpl__Group__0 ) )
+            // InternalFormalML.g:2435:3: ( rule__ChoiceTypeDefinitionImpl__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2436:3: ( rule__ChoiceTypeDefinitionImpl__Group__0 )
+            // InternalFormalML.g:2436:4: rule__ChoiceTypeDefinitionImpl__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleChoiceTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleModifier"
+    // InternalFormalML.g:2445:1: entryRuleModifier : ruleModifier EOF ;
+    public final void entryRuleModifier() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2446:1: ( ruleModifier EOF )
+            // InternalFormalML.g:2447:1: ruleModifier EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleModifier"
+
+
+    // $ANTLR start "ruleModifier"
+    // InternalFormalML.g:2454:1: ruleModifier : ( ( rule__Modifier__Group__0 ) ) ;
+    public final void ruleModifier() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2458:2: ( ( ( rule__Modifier__Group__0 ) ) )
+            // InternalFormalML.g:2459:2: ( ( rule__Modifier__Group__0 ) )
+            {
+            // InternalFormalML.g:2459:2: ( ( rule__Modifier__Group__0 ) )
+            // InternalFormalML.g:2460:3: ( rule__Modifier__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2461:3: ( rule__Modifier__Group__0 )
+            // InternalFormalML.g:2461:4: rule__Modifier__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Modifier__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleModifier"
+
+
+    // $ANTLR start "entryRuleVariable"
+    // InternalFormalML.g:2470:1: entryRuleVariable : ruleVariable EOF ;
+    public final void entryRuleVariable() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2471:1: ( ruleVariable EOF )
+            // InternalFormalML.g:2472:1: ruleVariable EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleVariable"
+
+
+    // $ANTLR start "ruleVariable"
+    // InternalFormalML.g:2479:1: ruleVariable : ( ( rule__Variable__Group__0 ) ) ;
+    public final void ruleVariable() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2483:2: ( ( ( rule__Variable__Group__0 ) ) )
+            // InternalFormalML.g:2484:2: ( ( rule__Variable__Group__0 ) )
+            {
+            // InternalFormalML.g:2484:2: ( ( rule__Variable__Group__0 ) )
+            // InternalFormalML.g:2485:3: ( rule__Variable__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2486:3: ( rule__Variable__Group__0 )
+            // InternalFormalML.g:2486:4: rule__Variable__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleVariable"
+
+
+    // $ANTLR start "entryRuleOnWriteRoutine"
+    // InternalFormalML.g:2495:1: entryRuleOnWriteRoutine : ruleOnWriteRoutine EOF ;
+    public final void entryRuleOnWriteRoutine() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2496:1: ( ruleOnWriteRoutine EOF )
+            // InternalFormalML.g:2497:1: ruleOnWriteRoutine EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleOnWriteRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOnWriteRoutine"
+
+
+    // $ANTLR start "ruleOnWriteRoutine"
+    // InternalFormalML.g:2504:1: ruleOnWriteRoutine : ( ( rule__OnWriteRoutine__Group__0 ) ) ;
+    public final void ruleOnWriteRoutine() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2508:2: ( ( ( rule__OnWriteRoutine__Group__0 ) ) )
+            // InternalFormalML.g:2509:2: ( ( rule__OnWriteRoutine__Group__0 ) )
+            {
+            // InternalFormalML.g:2509:2: ( ( rule__OnWriteRoutine__Group__0 ) )
+            // InternalFormalML.g:2510:3: ( rule__OnWriteRoutine__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2511:3: ( rule__OnWriteRoutine__Group__0 )
+            // InternalFormalML.g:2511:4: rule__OnWriteRoutine__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOnWriteRoutine"
+
+
+    // $ANTLR start "entryRuleVariableRoutineParameter"
+    // InternalFormalML.g:2520:1: entryRuleVariableRoutineParameter : ruleVariableRoutineParameter EOF ;
+    public final void entryRuleVariableRoutineParameter() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2521:1: ( ruleVariableRoutineParameter EOF )
+            // InternalFormalML.g:2522:1: ruleVariableRoutineParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleVariableRoutineParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleVariableRoutineParameter"
+
+
+    // $ANTLR start "ruleVariableRoutineParameter"
+    // InternalFormalML.g:2529:1: ruleVariableRoutineParameter : ( ( rule__VariableRoutineParameter__Group__0 ) ) ;
+    public final void ruleVariableRoutineParameter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2533:2: ( ( ( rule__VariableRoutineParameter__Group__0 ) ) )
+            // InternalFormalML.g:2534:2: ( ( rule__VariableRoutineParameter__Group__0 ) )
+            {
+            // InternalFormalML.g:2534:2: ( ( rule__VariableRoutineParameter__Group__0 ) )
+            // InternalFormalML.g:2535:3: ( rule__VariableRoutineParameter__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2536:3: ( rule__VariableRoutineParameter__Group__0 )
+            // InternalFormalML.g:2536:4: rule__VariableRoutineParameter__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableRoutineParameter__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleVariableRoutineParameter"
+
+
+    // $ANTLR start "entryRuleVariablePublic"
+    // InternalFormalML.g:2545:1: entryRuleVariablePublic : ruleVariablePublic EOF ;
+    public final void entryRuleVariablePublic() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2546:1: ( ruleVariablePublic EOF )
+            // InternalFormalML.g:2547:1: ruleVariablePublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleVariablePublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleVariablePublic"
+
+
+    // $ANTLR start "ruleVariablePublic"
+    // InternalFormalML.g:2554:1: ruleVariablePublic : ( ( rule__VariablePublic__Group__0 ) ) ;
+    public final void ruleVariablePublic() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2558:2: ( ( ( rule__VariablePublic__Group__0 ) ) )
+            // InternalFormalML.g:2559:2: ( ( rule__VariablePublic__Group__0 ) )
+            {
+            // InternalFormalML.g:2559:2: ( ( rule__VariablePublic__Group__0 ) )
+            // InternalFormalML.g:2560:3: ( rule__VariablePublic__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2561:3: ( rule__VariablePublic__Group__0 )
+            // InternalFormalML.g:2561:4: rule__VariablePublic__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleVariablePublic"
+
+
+    // $ANTLR start "entryRuleVariableProtected"
+    // InternalFormalML.g:2570:1: entryRuleVariableProtected : ruleVariableProtected EOF ;
+    public final void entryRuleVariableProtected() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2571:1: ( ruleVariableProtected EOF )
+            // InternalFormalML.g:2572:1: ruleVariableProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleVariableProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleVariableProtected"
+
+
+    // $ANTLR start "ruleVariableProtected"
+    // InternalFormalML.g:2579:1: ruleVariableProtected : ( ( rule__VariableProtected__Group__0 ) ) ;
+    public final void ruleVariableProtected() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2583:2: ( ( ( rule__VariableProtected__Group__0 ) ) )
+            // InternalFormalML.g:2584:2: ( ( rule__VariableProtected__Group__0 ) )
+            {
+            // InternalFormalML.g:2584:2: ( ( rule__VariableProtected__Group__0 ) )
+            // InternalFormalML.g:2585:3: ( rule__VariableProtected__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2586:3: ( rule__VariableProtected__Group__0 )
+            // InternalFormalML.g:2586:4: rule__VariableProtected__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleVariableProtected"
+
+
+    // $ANTLR start "entryRuleVariablePrivate"
+    // InternalFormalML.g:2595:1: entryRuleVariablePrivate : ruleVariablePrivate EOF ;
+    public final void entryRuleVariablePrivate() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2596:1: ( ruleVariablePrivate EOF )
+            // InternalFormalML.g:2597:1: ruleVariablePrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleVariablePrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleVariablePrivate"
+
+
+    // $ANTLR start "ruleVariablePrivate"
+    // InternalFormalML.g:2604:1: ruleVariablePrivate : ( ( rule__VariablePrivate__Group__0 ) ) ;
+    public final void ruleVariablePrivate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2608:2: ( ( ( rule__VariablePrivate__Group__0 ) ) )
+            // InternalFormalML.g:2609:2: ( ( rule__VariablePrivate__Group__0 ) )
+            {
+            // InternalFormalML.g:2609:2: ( ( rule__VariablePrivate__Group__0 ) )
+            // InternalFormalML.g:2610:3: ( rule__VariablePrivate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2611:3: ( rule__VariablePrivate__Group__0 )
+            // InternalFormalML.g:2611:4: rule__VariablePrivate__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleVariablePrivate"
+
+
+    // $ANTLR start "entryRuleFunctionalParameterSet"
+    // InternalFormalML.g:2620:1: entryRuleFunctionalParameterSet : ruleFunctionalParameterSet EOF ;
+    public final void entryRuleFunctionalParameterSet() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2621:1: ( ruleFunctionalParameterSet EOF )
+            // InternalFormalML.g:2622:1: ruleFunctionalParameterSet EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterSetRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleFunctionalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterSetRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleFunctionalParameterSet"
+
+
+    // $ANTLR start "ruleFunctionalParameterSet"
+    // InternalFormalML.g:2629:1: ruleFunctionalParameterSet : ( ( rule__FunctionalParameterSet__Group__0 ) ) ;
+    public final void ruleFunctionalParameterSet() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2633:2: ( ( ( rule__FunctionalParameterSet__Group__0 ) ) )
+            // InternalFormalML.g:2634:2: ( ( rule__FunctionalParameterSet__Group__0 ) )
+            {
+            // InternalFormalML.g:2634:2: ( ( rule__FunctionalParameterSet__Group__0 ) )
+            // InternalFormalML.g:2635:3: ( rule__FunctionalParameterSet__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterSetAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2636:3: ( rule__FunctionalParameterSet__Group__0 )
+            // InternalFormalML.g:2636:4: rule__FunctionalParameterSet__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameterSet__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterSetAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleFunctionalParameterSet"
+
+
+    // $ANTLR start "entryRuleFunctionalParameter"
+    // InternalFormalML.g:2645:1: entryRuleFunctionalParameter : ruleFunctionalParameter EOF ;
+    public final void entryRuleFunctionalParameter() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2646:1: ( ruleFunctionalParameter EOF )
+            // InternalFormalML.g:2647:1: ruleFunctionalParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleFunctionalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleFunctionalParameter"
+
+
+    // $ANTLR start "ruleFunctionalParameter"
+    // InternalFormalML.g:2654:1: ruleFunctionalParameter : ( ( rule__FunctionalParameter__Group__0 ) ) ;
+    public final void ruleFunctionalParameter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2658:2: ( ( ( rule__FunctionalParameter__Group__0 ) ) )
+            // InternalFormalML.g:2659:2: ( ( rule__FunctionalParameter__Group__0 ) )
+            {
+            // InternalFormalML.g:2659:2: ( ( rule__FunctionalParameter__Group__0 ) )
+            // InternalFormalML.g:2660:3: ( rule__FunctionalParameter__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2661:3: ( rule__FunctionalParameter__Group__0 )
+            // InternalFormalML.g:2661:4: rule__FunctionalParameter__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleFunctionalParameter"
+
+
+    // $ANTLR start "entryRuleFormalParameterSet"
+    // InternalFormalML.g:2670:1: entryRuleFormalParameterSet : ruleFormalParameterSet EOF ;
+    public final void entryRuleFormalParameterSet() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2671:1: ( ruleFormalParameterSet EOF )
+            // InternalFormalML.g:2672:1: ruleFormalParameterSet EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterSetRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleFormalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterSetRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleFormalParameterSet"
+
+
+    // $ANTLR start "ruleFormalParameterSet"
+    // InternalFormalML.g:2679:1: ruleFormalParameterSet : ( ( rule__FormalParameterSet__Group__0 ) ) ;
+    public final void ruleFormalParameterSet() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2683:2: ( ( ( rule__FormalParameterSet__Group__0 ) ) )
+            // InternalFormalML.g:2684:2: ( ( rule__FormalParameterSet__Group__0 ) )
+            {
+            // InternalFormalML.g:2684:2: ( ( rule__FormalParameterSet__Group__0 ) )
+            // InternalFormalML.g:2685:3: ( rule__FormalParameterSet__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterSetAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2686:3: ( rule__FormalParameterSet__Group__0 )
+            // InternalFormalML.g:2686:4: rule__FormalParameterSet__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameterSet__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterSetAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleFormalParameterSet"
+
+
+    // $ANTLR start "entryRuleFormalParameter"
+    // InternalFormalML.g:2695:1: entryRuleFormalParameter : ruleFormalParameter EOF ;
+    public final void entryRuleFormalParameter() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2696:1: ( ruleFormalParameter EOF )
+            // InternalFormalML.g:2697:1: ruleFormalParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleFormalParameter"
+
+
+    // $ANTLR start "ruleFormalParameter"
+    // InternalFormalML.g:2704:1: ruleFormalParameter : ( ( rule__FormalParameter__Group__0 ) ) ;
+    public final void ruleFormalParameter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2708:2: ( ( ( rule__FormalParameter__Group__0 ) ) )
+            // InternalFormalML.g:2709:2: ( ( rule__FormalParameter__Group__0 ) )
+            {
+            // InternalFormalML.g:2709:2: ( ( rule__FormalParameter__Group__0 ) )
+            // InternalFormalML.g:2710:3: ( rule__FormalParameter__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2711:3: ( rule__FormalParameter__Group__0 )
+            // InternalFormalML.g:2711:4: rule__FormalParameter__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleFormalParameter"
+
+
+    // $ANTLR start "entryRuleParameterInput"
+    // InternalFormalML.g:2720:1: entryRuleParameterInput : ruleParameterInput EOF ;
+    public final void entryRuleParameterInput() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2721:1: ( ruleParameterInput EOF )
+            // InternalFormalML.g:2722:1: ruleParameterInput EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleParameterInput"
+
+
+    // $ANTLR start "ruleParameterInput"
+    // InternalFormalML.g:2729:1: ruleParameterInput : ( ( rule__ParameterInput__Group__0 ) ) ;
+    public final void ruleParameterInput() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2733:2: ( ( ( rule__ParameterInput__Group__0 ) ) )
+            // InternalFormalML.g:2734:2: ( ( rule__ParameterInput__Group__0 ) )
+            {
+            // InternalFormalML.g:2734:2: ( ( rule__ParameterInput__Group__0 ) )
+            // InternalFormalML.g:2735:3: ( rule__ParameterInput__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2736:3: ( rule__ParameterInput__Group__0 )
+            // InternalFormalML.g:2736:4: rule__ParameterInput__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleParameterInput"
+
+
+    // $ANTLR start "entryRuleParameterInout"
+    // InternalFormalML.g:2745:1: entryRuleParameterInout : ruleParameterInout EOF ;
+    public final void entryRuleParameterInout() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2746:1: ( ruleParameterInout EOF )
+            // InternalFormalML.g:2747:1: ruleParameterInout EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleParameterInout"
+
+
+    // $ANTLR start "ruleParameterInout"
+    // InternalFormalML.g:2754:1: ruleParameterInout : ( ( rule__ParameterInout__Group__0 ) ) ;
+    public final void ruleParameterInout() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2758:2: ( ( ( rule__ParameterInout__Group__0 ) ) )
+            // InternalFormalML.g:2759:2: ( ( rule__ParameterInout__Group__0 ) )
+            {
+            // InternalFormalML.g:2759:2: ( ( rule__ParameterInout__Group__0 ) )
+            // InternalFormalML.g:2760:3: ( rule__ParameterInout__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2761:3: ( rule__ParameterInout__Group__0 )
+            // InternalFormalML.g:2761:4: rule__ParameterInout__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleParameterInout"
+
+
+    // $ANTLR start "entryRuleParameterOutput"
+    // InternalFormalML.g:2770:1: entryRuleParameterOutput : ruleParameterOutput EOF ;
+    public final void entryRuleParameterOutput() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2771:1: ( ruleParameterOutput EOF )
+            // InternalFormalML.g:2772:1: ruleParameterOutput EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleParameterOutput"
+
+
+    // $ANTLR start "ruleParameterOutput"
+    // InternalFormalML.g:2779:1: ruleParameterOutput : ( ( rule__ParameterOutput__Group__0 ) ) ;
+    public final void ruleParameterOutput() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2783:2: ( ( ( rule__ParameterOutput__Group__0 ) ) )
+            // InternalFormalML.g:2784:2: ( ( rule__ParameterOutput__Group__0 ) )
+            {
+            // InternalFormalML.g:2784:2: ( ( rule__ParameterOutput__Group__0 ) )
+            // InternalFormalML.g:2785:3: ( rule__ParameterOutput__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2786:3: ( rule__ParameterOutput__Group__0 )
+            // InternalFormalML.g:2786:4: rule__ParameterOutput__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleParameterOutput"
+
+
+    // $ANTLR start "entryRuleParameterReturn"
+    // InternalFormalML.g:2795:1: entryRuleParameterReturn : ruleParameterReturn EOF ;
+    public final void entryRuleParameterReturn() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2796:1: ( ruleParameterReturn EOF )
+            // InternalFormalML.g:2797:1: ruleParameterReturn EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleParameterReturn"
+
+
+    // $ANTLR start "ruleParameterReturn"
+    // InternalFormalML.g:2804:1: ruleParameterReturn : ( ( rule__ParameterReturn__Group__0 ) ) ;
+    public final void ruleParameterReturn() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2808:2: ( ( ( rule__ParameterReturn__Group__0 ) ) )
+            // InternalFormalML.g:2809:2: ( ( rule__ParameterReturn__Group__0 ) )
+            {
+            // InternalFormalML.g:2809:2: ( ( rule__ParameterReturn__Group__0 ) )
+            // InternalFormalML.g:2810:3: ( rule__ParameterReturn__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2811:3: ( rule__ParameterReturn__Group__0 )
+            // InternalFormalML.g:2811:4: rule__ParameterReturn__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleParameterReturn"
+
+
+    // $ANTLR start "entryRuleBufferContainerType"
+    // InternalFormalML.g:2820:1: entryRuleBufferContainerType : ruleBufferContainerType EOF ;
+    public final void entryRuleBufferContainerType() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2821:1: ( ruleBufferContainerType EOF )
+            // InternalFormalML.g:2822:1: ruleBufferContainerType EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBufferContainerType"
+
+
+    // $ANTLR start "ruleBufferContainerType"
+    // InternalFormalML.g:2829:1: ruleBufferContainerType : ( ( rule__BufferContainerType__Group__0 ) ) ;
+    public final void ruleBufferContainerType() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2833:2: ( ( ( rule__BufferContainerType__Group__0 ) ) )
+            // InternalFormalML.g:2834:2: ( ( rule__BufferContainerType__Group__0 ) )
+            {
+            // InternalFormalML.g:2834:2: ( ( rule__BufferContainerType__Group__0 ) )
+            // InternalFormalML.g:2835:3: ( rule__BufferContainerType__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2836:3: ( rule__BufferContainerType__Group__0 )
+            // InternalFormalML.g:2836:4: rule__BufferContainerType__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferContainerType__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBufferContainerType"
+
+
+    // $ANTLR start "entryRuleBuffer"
+    // InternalFormalML.g:2845:1: entryRuleBuffer : ruleBuffer EOF ;
+    public final void entryRuleBuffer() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2846:1: ( ruleBuffer EOF )
+            // InternalFormalML.g:2847:1: ruleBuffer EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBuffer"
+
+
+    // $ANTLR start "ruleBuffer"
+    // InternalFormalML.g:2854:1: ruleBuffer : ( ( rule__Buffer__Group__0 ) ) ;
+    public final void ruleBuffer() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2858:2: ( ( ( rule__Buffer__Group__0 ) ) )
+            // InternalFormalML.g:2859:2: ( ( rule__Buffer__Group__0 ) )
+            {
+            // InternalFormalML.g:2859:2: ( ( rule__Buffer__Group__0 ) )
+            // InternalFormalML.g:2860:3: ( rule__Buffer__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2861:3: ( rule__Buffer__Group__0 )
+            // InternalFormalML.g:2861:4: rule__Buffer__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBuffer"
+
+
+    // $ANTLR start "entryRuleBufferPublic"
+    // InternalFormalML.g:2870:1: entryRuleBufferPublic : ruleBufferPublic EOF ;
+    public final void entryRuleBufferPublic() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2871:1: ( ruleBufferPublic EOF )
+            // InternalFormalML.g:2872:1: ruleBufferPublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBufferPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBufferPublic"
+
+
+    // $ANTLR start "ruleBufferPublic"
+    // InternalFormalML.g:2879:1: ruleBufferPublic : ( ( rule__BufferPublic__Group__0 ) ) ;
+    public final void ruleBufferPublic() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2883:2: ( ( ( rule__BufferPublic__Group__0 ) ) )
+            // InternalFormalML.g:2884:2: ( ( rule__BufferPublic__Group__0 ) )
+            {
+            // InternalFormalML.g:2884:2: ( ( rule__BufferPublic__Group__0 ) )
+            // InternalFormalML.g:2885:3: ( rule__BufferPublic__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2886:3: ( rule__BufferPublic__Group__0 )
+            // InternalFormalML.g:2886:4: rule__BufferPublic__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBufferPublic"
+
+
+    // $ANTLR start "entryRuleBufferProtected"
+    // InternalFormalML.g:2895:1: entryRuleBufferProtected : ruleBufferProtected EOF ;
+    public final void entryRuleBufferProtected() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2896:1: ( ruleBufferProtected EOF )
+            // InternalFormalML.g:2897:1: ruleBufferProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBufferProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBufferProtected"
+
+
+    // $ANTLR start "ruleBufferProtected"
+    // InternalFormalML.g:2904:1: ruleBufferProtected : ( ( rule__BufferProtected__Group__0 ) ) ;
+    public final void ruleBufferProtected() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2908:2: ( ( ( rule__BufferProtected__Group__0 ) ) )
+            // InternalFormalML.g:2909:2: ( ( rule__BufferProtected__Group__0 ) )
+            {
+            // InternalFormalML.g:2909:2: ( ( rule__BufferProtected__Group__0 ) )
+            // InternalFormalML.g:2910:3: ( rule__BufferProtected__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2911:3: ( rule__BufferProtected__Group__0 )
+            // InternalFormalML.g:2911:4: rule__BufferProtected__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBufferProtected"
+
+
+    // $ANTLR start "entryRuleBufferPrivate"
+    // InternalFormalML.g:2920:1: entryRuleBufferPrivate : ruleBufferPrivate EOF ;
+    public final void entryRuleBufferPrivate() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2921:1: ( ruleBufferPrivate EOF )
+            // InternalFormalML.g:2922:1: ruleBufferPrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBufferPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBufferPrivate"
+
+
+    // $ANTLR start "ruleBufferPrivate"
+    // InternalFormalML.g:2929:1: ruleBufferPrivate : ( ( rule__BufferPrivate__Group__0 ) ) ;
+    public final void ruleBufferPrivate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2933:2: ( ( ( rule__BufferPrivate__Group__0 ) ) )
+            // InternalFormalML.g:2934:2: ( ( rule__BufferPrivate__Group__0 ) )
+            {
+            // InternalFormalML.g:2934:2: ( ( rule__BufferPrivate__Group__0 ) )
+            // InternalFormalML.g:2935:3: ( rule__BufferPrivate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2936:3: ( rule__BufferPrivate__Group__0 )
+            // InternalFormalML.g:2936:4: rule__BufferPrivate__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBufferPrivate"
+
+
+    // $ANTLR start "entryRulePort"
+    // InternalFormalML.g:2945:1: entryRulePort : rulePort EOF ;
+    public final void entryRulePort() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2946:1: ( rulePort EOF )
+            // InternalFormalML.g:2947:1: rulePort EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePort();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePort"
+
+
+    // $ANTLR start "rulePort"
+    // InternalFormalML.g:2954:1: rulePort : ( ( rule__Port__Group__0 ) ) ;
+    public final void rulePort() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2958:2: ( ( ( rule__Port__Group__0 ) ) )
+            // InternalFormalML.g:2959:2: ( ( rule__Port__Group__0 ) )
+            {
+            // InternalFormalML.g:2959:2: ( ( rule__Port__Group__0 ) )
+            // InternalFormalML.g:2960:3: ( rule__Port__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2961:3: ( rule__Port__Group__0 )
+            // InternalFormalML.g:2961:4: rule__Port__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePort"
+
+
+    // $ANTLR start "entryRulePortPublic"
+    // InternalFormalML.g:2970:1: entryRulePortPublic : rulePortPublic EOF ;
+    public final void entryRulePortPublic() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2971:1: ( rulePortPublic EOF )
+            // InternalFormalML.g:2972:1: rulePortPublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePortPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePortPublic"
+
+
+    // $ANTLR start "rulePortPublic"
+    // InternalFormalML.g:2979:1: rulePortPublic : ( ( rule__PortPublic__Group__0 ) ) ;
+    public final void rulePortPublic() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:2983:2: ( ( ( rule__PortPublic__Group__0 ) ) )
+            // InternalFormalML.g:2984:2: ( ( rule__PortPublic__Group__0 ) )
+            {
+            // InternalFormalML.g:2984:2: ( ( rule__PortPublic__Group__0 ) )
+            // InternalFormalML.g:2985:3: ( rule__PortPublic__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getGroup()); 
+            }
+            // InternalFormalML.g:2986:3: ( rule__PortPublic__Group__0 )
+            // InternalFormalML.g:2986:4: rule__PortPublic__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePortPublic"
+
+
+    // $ANTLR start "entryRulePortProtected"
+    // InternalFormalML.g:2995:1: entryRulePortProtected : rulePortProtected EOF ;
+    public final void entryRulePortProtected() throws RecognitionException {
+        try {
+            // InternalFormalML.g:2996:1: ( rulePortProtected EOF )
+            // InternalFormalML.g:2997:1: rulePortProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePortProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePortProtected"
+
+
+    // $ANTLR start "rulePortProtected"
+    // InternalFormalML.g:3004:1: rulePortProtected : ( ( rule__PortProtected__Group__0 ) ) ;
+    public final void rulePortProtected() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3008:2: ( ( ( rule__PortProtected__Group__0 ) ) )
+            // InternalFormalML.g:3009:2: ( ( rule__PortProtected__Group__0 ) )
+            {
+            // InternalFormalML.g:3009:2: ( ( rule__PortProtected__Group__0 ) )
+            // InternalFormalML.g:3010:3: ( rule__PortProtected__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3011:3: ( rule__PortProtected__Group__0 )
+            // InternalFormalML.g:3011:4: rule__PortProtected__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePortProtected"
+
+
+    // $ANTLR start "entryRulePortPrivate"
+    // InternalFormalML.g:3020:1: entryRulePortPrivate : rulePortPrivate EOF ;
+    public final void entryRulePortPrivate() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3021:1: ( rulePortPrivate EOF )
+            // InternalFormalML.g:3022:1: rulePortPrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePortPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePortPrivate"
+
+
+    // $ANTLR start "rulePortPrivate"
+    // InternalFormalML.g:3029:1: rulePortPrivate : ( ( rule__PortPrivate__Group__0 ) ) ;
+    public final void rulePortPrivate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3033:2: ( ( ( rule__PortPrivate__Group__0 ) ) )
+            // InternalFormalML.g:3034:2: ( ( rule__PortPrivate__Group__0 ) )
+            {
+            // InternalFormalML.g:3034:2: ( ( rule__PortPrivate__Group__0 ) )
+            // InternalFormalML.g:3035:3: ( rule__PortPrivate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3036:3: ( rule__PortPrivate__Group__0 )
+            // InternalFormalML.g:3036:4: rule__PortPrivate__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePortPrivate"
+
+
+    // $ANTLR start "entryRuleSignal"
+    // InternalFormalML.g:3045:1: entryRuleSignal : ruleSignal EOF ;
+    public final void entryRuleSignal() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3046:1: ( ruleSignal EOF )
+            // InternalFormalML.g:3047:1: ruleSignal EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSignal"
+
+
+    // $ANTLR start "ruleSignal"
+    // InternalFormalML.g:3054:1: ruleSignal : ( ( rule__Signal__Group__0 ) ) ;
+    public final void ruleSignal() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3058:2: ( ( ( rule__Signal__Group__0 ) ) )
+            // InternalFormalML.g:3059:2: ( ( rule__Signal__Group__0 ) )
+            {
+            // InternalFormalML.g:3059:2: ( ( rule__Signal__Group__0 ) )
+            // InternalFormalML.g:3060:3: ( rule__Signal__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3061:3: ( rule__Signal__Group__0 )
+            // InternalFormalML.g:3061:4: rule__Signal__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSignal"
+
+
+    // $ANTLR start "entryRuleSignalPublic"
+    // InternalFormalML.g:3070:1: entryRuleSignalPublic : ruleSignalPublic EOF ;
+    public final void entryRuleSignalPublic() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3071:1: ( ruleSignalPublic EOF )
+            // InternalFormalML.g:3072:1: ruleSignalPublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSignalPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSignalPublic"
+
+
+    // $ANTLR start "ruleSignalPublic"
+    // InternalFormalML.g:3079:1: ruleSignalPublic : ( ( rule__SignalPublic__Group__0 ) ) ;
+    public final void ruleSignalPublic() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3083:2: ( ( ( rule__SignalPublic__Group__0 ) ) )
+            // InternalFormalML.g:3084:2: ( ( rule__SignalPublic__Group__0 ) )
+            {
+            // InternalFormalML.g:3084:2: ( ( rule__SignalPublic__Group__0 ) )
+            // InternalFormalML.g:3085:3: ( rule__SignalPublic__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3086:3: ( rule__SignalPublic__Group__0 )
+            // InternalFormalML.g:3086:4: rule__SignalPublic__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSignalPublic"
+
+
+    // $ANTLR start "entryRuleSignalProtected"
+    // InternalFormalML.g:3095:1: entryRuleSignalProtected : ruleSignalProtected EOF ;
+    public final void entryRuleSignalProtected() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3096:1: ( ruleSignalProtected EOF )
+            // InternalFormalML.g:3097:1: ruleSignalProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSignalProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSignalProtected"
+
+
+    // $ANTLR start "ruleSignalProtected"
+    // InternalFormalML.g:3104:1: ruleSignalProtected : ( ( rule__SignalProtected__Group__0 ) ) ;
+    public final void ruleSignalProtected() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3108:2: ( ( ( rule__SignalProtected__Group__0 ) ) )
+            // InternalFormalML.g:3109:2: ( ( rule__SignalProtected__Group__0 ) )
+            {
+            // InternalFormalML.g:3109:2: ( ( rule__SignalProtected__Group__0 ) )
+            // InternalFormalML.g:3110:3: ( rule__SignalProtected__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3111:3: ( rule__SignalProtected__Group__0 )
+            // InternalFormalML.g:3111:4: rule__SignalProtected__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSignalProtected"
+
+
+    // $ANTLR start "entryRuleSignalPrivate"
+    // InternalFormalML.g:3120:1: entryRuleSignalPrivate : ruleSignalPrivate EOF ;
+    public final void entryRuleSignalPrivate() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3121:1: ( ruleSignalPrivate EOF )
+            // InternalFormalML.g:3122:1: ruleSignalPrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSignalPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSignalPrivate"
+
+
+    // $ANTLR start "ruleSignalPrivate"
+    // InternalFormalML.g:3129:1: ruleSignalPrivate : ( ( rule__SignalPrivate__Group__0 ) ) ;
+    public final void ruleSignalPrivate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3133:2: ( ( ( rule__SignalPrivate__Group__0 ) ) )
+            // InternalFormalML.g:3134:2: ( ( rule__SignalPrivate__Group__0 ) )
+            {
+            // InternalFormalML.g:3134:2: ( ( rule__SignalPrivate__Group__0 ) )
+            // InternalFormalML.g:3135:3: ( rule__SignalPrivate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3136:3: ( rule__SignalPrivate__Group__0 )
+            // InternalFormalML.g:3136:4: rule__SignalPrivate__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSignalPrivate"
+
+
+    // $ANTLR start "entryRuleChannel"
+    // InternalFormalML.g:3145:1: entryRuleChannel : ruleChannel EOF ;
+    public final void entryRuleChannel() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3146:1: ( ruleChannel EOF )
+            // InternalFormalML.g:3147:1: ruleChannel EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleChannel"
+
+
+    // $ANTLR start "ruleChannel"
+    // InternalFormalML.g:3154:1: ruleChannel : ( ( rule__Channel__Group__0 ) ) ;
+    public final void ruleChannel() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3158:2: ( ( ( rule__Channel__Group__0 ) ) )
+            // InternalFormalML.g:3159:2: ( ( rule__Channel__Group__0 ) )
+            {
+            // InternalFormalML.g:3159:2: ( ( rule__Channel__Group__0 ) )
+            // InternalFormalML.g:3160:3: ( rule__Channel__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3161:3: ( rule__Channel__Group__0 )
+            // InternalFormalML.g:3161:4: rule__Channel__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleChannel"
+
+
+    // $ANTLR start "entryRuleSignalReference"
+    // InternalFormalML.g:3170:1: entryRuleSignalReference : ruleSignalReference EOF ;
+    public final void entryRuleSignalReference() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3171:1: ( ruleSignalReference EOF )
+            // InternalFormalML.g:3172:1: ruleSignalReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleSignalReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalReferenceRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSignalReference"
+
+
+    // $ANTLR start "ruleSignalReference"
+    // InternalFormalML.g:3179:1: ruleSignalReference : ( ( rule__SignalReference__Group__0 ) ) ;
+    public final void ruleSignalReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3183:2: ( ( ( rule__SignalReference__Group__0 ) ) )
+            // InternalFormalML.g:3184:2: ( ( rule__SignalReference__Group__0 ) )
+            {
+            // InternalFormalML.g:3184:2: ( ( rule__SignalReference__Group__0 ) )
+            // InternalFormalML.g:3185:3: ( rule__SignalReference__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalReferenceAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3186:3: ( rule__SignalReference__Group__0 )
+            // InternalFormalML.g:3186:4: rule__SignalReference__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalReference__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalReferenceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSignalReference"
+
+
+    // $ANTLR start "entryRuleChannelPublic"
+    // InternalFormalML.g:3195:1: entryRuleChannelPublic : ruleChannelPublic EOF ;
+    public final void entryRuleChannelPublic() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3196:1: ( ruleChannelPublic EOF )
+            // InternalFormalML.g:3197:1: ruleChannelPublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleChannelPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleChannelPublic"
+
+
+    // $ANTLR start "ruleChannelPublic"
+    // InternalFormalML.g:3204:1: ruleChannelPublic : ( ( rule__ChannelPublic__Group__0 ) ) ;
+    public final void ruleChannelPublic() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3208:2: ( ( ( rule__ChannelPublic__Group__0 ) ) )
+            // InternalFormalML.g:3209:2: ( ( rule__ChannelPublic__Group__0 ) )
+            {
+            // InternalFormalML.g:3209:2: ( ( rule__ChannelPublic__Group__0 ) )
+            // InternalFormalML.g:3210:3: ( rule__ChannelPublic__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3211:3: ( rule__ChannelPublic__Group__0 )
+            // InternalFormalML.g:3211:4: rule__ChannelPublic__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleChannelPublic"
+
+
+    // $ANTLR start "entryRuleChannelProtected"
+    // InternalFormalML.g:3220:1: entryRuleChannelProtected : ruleChannelProtected EOF ;
+    public final void entryRuleChannelProtected() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3221:1: ( ruleChannelProtected EOF )
+            // InternalFormalML.g:3222:1: ruleChannelProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleChannelProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleChannelProtected"
+
+
+    // $ANTLR start "ruleChannelProtected"
+    // InternalFormalML.g:3229:1: ruleChannelProtected : ( ( rule__ChannelProtected__Group__0 ) ) ;
+    public final void ruleChannelProtected() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3233:2: ( ( ( rule__ChannelProtected__Group__0 ) ) )
+            // InternalFormalML.g:3234:2: ( ( rule__ChannelProtected__Group__0 ) )
+            {
+            // InternalFormalML.g:3234:2: ( ( rule__ChannelProtected__Group__0 ) )
+            // InternalFormalML.g:3235:3: ( rule__ChannelProtected__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3236:3: ( rule__ChannelProtected__Group__0 )
+            // InternalFormalML.g:3236:4: rule__ChannelProtected__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleChannelProtected"
+
+
+    // $ANTLR start "entryRuleChannelPrivate"
+    // InternalFormalML.g:3245:1: entryRuleChannelPrivate : ruleChannelPrivate EOF ;
+    public final void entryRuleChannelPrivate() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3246:1: ( ruleChannelPrivate EOF )
+            // InternalFormalML.g:3247:1: ruleChannelPrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleChannelPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleChannelPrivate"
+
+
+    // $ANTLR start "ruleChannelPrivate"
+    // InternalFormalML.g:3254:1: ruleChannelPrivate : ( ( rule__ChannelPrivate__Group__0 ) ) ;
+    public final void ruleChannelPrivate() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3258:2: ( ( ( rule__ChannelPrivate__Group__0 ) ) )
+            // InternalFormalML.g:3259:2: ( ( rule__ChannelPrivate__Group__0 ) )
+            {
+            // InternalFormalML.g:3259:2: ( ( rule__ChannelPrivate__Group__0 ) )
+            // InternalFormalML.g:3260:3: ( rule__ChannelPrivate__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3261:3: ( rule__ChannelPrivate__Group__0 )
+            // InternalFormalML.g:3261:4: rule__ChannelPrivate__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleChannelPrivate"
+
+
+    // $ANTLR start "entryRuleTransition"
+    // InternalFormalML.g:3270:1: entryRuleTransition : ruleTransition EOF ;
+    public final void entryRuleTransition() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3271:1: ( ruleTransition EOF )
+            // InternalFormalML.g:3272:1: ruleTransition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTransition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransition"
+
+
+    // $ANTLR start "ruleTransition"
+    // InternalFormalML.g:3279:1: ruleTransition : ( ( rule__Transition__Group__0 ) ) ;
+    public final void ruleTransition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3283:2: ( ( ( rule__Transition__Group__0 ) ) )
+            // InternalFormalML.g:3284:2: ( ( rule__Transition__Group__0 ) )
+            {
+            // InternalFormalML.g:3284:2: ( ( rule__Transition__Group__0 ) )
+            // InternalFormalML.g:3285:3: ( rule__Transition__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3286:3: ( rule__Transition__Group__0 )
+            // InternalFormalML.g:3286:4: rule__Transition__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransition"
+
+
+    // $ANTLR start "entryRuleTransitionMoe"
+    // InternalFormalML.g:3295:1: entryRuleTransitionMoe : ruleTransitionMoe EOF ;
+    public final void entryRuleTransitionMoe() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3296:1: ( ruleTransitionMoe EOF )
+            // InternalFormalML.g:3297:1: ruleTransitionMoe EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTransitionMoe();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransitionMoe"
+
+
+    // $ANTLR start "ruleTransitionMoe"
+    // InternalFormalML.g:3304:1: ruleTransitionMoe : ( ( rule__TransitionMoe__Group__0 ) ) ;
+    public final void ruleTransitionMoe() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3308:2: ( ( ( rule__TransitionMoe__Group__0 ) ) )
+            // InternalFormalML.g:3309:2: ( ( rule__TransitionMoe__Group__0 ) )
+            {
+            // InternalFormalML.g:3309:2: ( ( rule__TransitionMoe__Group__0 ) )
+            // InternalFormalML.g:3310:3: ( rule__TransitionMoe__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3311:3: ( rule__TransitionMoe__Group__0 )
+            // InternalFormalML.g:3311:4: rule__TransitionMoe__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionMoe"
+
+
+    // $ANTLR start "entryRuleTransitionBehavior"
+    // InternalFormalML.g:3320:1: entryRuleTransitionBehavior : ruleTransitionBehavior EOF ;
+    public final void entryRuleTransitionBehavior() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3321:1: ( ruleTransitionBehavior EOF )
+            // InternalFormalML.g:3322:1: ruleTransitionBehavior EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionBehaviorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTransitionBehavior();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionBehaviorRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransitionBehavior"
+
+
+    // $ANTLR start "ruleTransitionBehavior"
+    // InternalFormalML.g:3329:1: ruleTransitionBehavior : ( ( rule__TransitionBehavior__Group__0 ) ) ;
+    public final void ruleTransitionBehavior() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3333:2: ( ( ( rule__TransitionBehavior__Group__0 ) ) )
+            // InternalFormalML.g:3334:2: ( ( rule__TransitionBehavior__Group__0 ) )
+            {
+            // InternalFormalML.g:3334:2: ( ( rule__TransitionBehavior__Group__0 ) )
+            // InternalFormalML.g:3335:3: ( rule__TransitionBehavior__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionBehaviorAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3336:3: ( rule__TransitionBehavior__Group__0 )
+            // InternalFormalML.g:3336:4: rule__TransitionBehavior__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionBehavior__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionBehaviorAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionBehavior"
+
+
+    // $ANTLR start "entryRuleTransitionTrigger"
+    // InternalFormalML.g:3345:1: entryRuleTransitionTrigger : ruleTransitionTrigger EOF ;
+    public final void entryRuleTransitionTrigger() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3346:1: ( ruleTransitionTrigger EOF )
+            // InternalFormalML.g:3347:1: ruleTransitionTrigger EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTriggerRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTransitionTrigger();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTriggerRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransitionTrigger"
+
+
+    // $ANTLR start "ruleTransitionTrigger"
+    // InternalFormalML.g:3354:1: ruleTransitionTrigger : ( ruleInputComStatement ) ;
+    public final void ruleTransitionTrigger() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3358:2: ( ( ruleInputComStatement ) )
+            // InternalFormalML.g:3359:2: ( ruleInputComStatement )
+            {
+            // InternalFormalML.g:3359:2: ( ruleInputComStatement )
+            // InternalFormalML.g:3360:3: ruleInputComStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTriggerAccess().getInputComStatementParserRuleCall()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleInputComStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTriggerAccess().getInputComStatementParserRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionTrigger"
+
+
+    // $ANTLR start "entryRuleTransitionGuard"
+    // InternalFormalML.g:3370:1: entryRuleTransitionGuard : ruleTransitionGuard EOF ;
+    public final void entryRuleTransitionGuard() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3371:1: ( ruleTransitionGuard EOF )
+            // InternalFormalML.g:3372:1: ruleTransitionGuard EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTransitionGuard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransitionGuard"
+
+
+    // $ANTLR start "ruleTransitionGuard"
+    // InternalFormalML.g:3379:1: ruleTransitionGuard : ( ( rule__TransitionGuard__Alternatives ) ) ;
+    public final void ruleTransitionGuard() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3383:2: ( ( ( rule__TransitionGuard__Alternatives ) ) )
+            // InternalFormalML.g:3384:2: ( ( rule__TransitionGuard__Alternatives ) )
+            {
+            // InternalFormalML.g:3384:2: ( ( rule__TransitionGuard__Alternatives ) )
+            // InternalFormalML.g:3385:3: ( rule__TransitionGuard__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:3386:3: ( rule__TransitionGuard__Alternatives )
+            // InternalFormalML.g:3386:4: rule__TransitionGuard__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionGuard"
+
+
+    // $ANTLR start "entryRuleTransitionGuardExpression"
+    // InternalFormalML.g:3395:1: entryRuleTransitionGuardExpression : ruleTransitionGuardExpression EOF ;
+    public final void entryRuleTransitionGuardExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3396:1: ( ruleTransitionGuardExpression EOF )
+            // InternalFormalML.g:3397:1: ruleTransitionGuardExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTransitionGuardExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransitionGuardExpression"
+
+
+    // $ANTLR start "ruleTransitionGuardExpression"
+    // InternalFormalML.g:3404:1: ruleTransitionGuardExpression : ( ( rule__TransitionGuardExpression__Group__0 ) ) ;
+    public final void ruleTransitionGuardExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3408:2: ( ( ( rule__TransitionGuardExpression__Group__0 ) ) )
+            // InternalFormalML.g:3409:2: ( ( rule__TransitionGuardExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:3409:2: ( ( rule__TransitionGuardExpression__Group__0 ) )
+            // InternalFormalML.g:3410:3: ( rule__TransitionGuardExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3411:3: ( rule__TransitionGuardExpression__Group__0 )
+            // InternalFormalML.g:3411:4: rule__TransitionGuardExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuardExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionGuardExpression"
+
+
+    // $ANTLR start "entryRuleTransitionTimedGuard"
+    // InternalFormalML.g:3420:1: entryRuleTransitionTimedGuard : ruleTransitionTimedGuard EOF ;
+    public final void entryRuleTransitionTimedGuard() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3421:1: ( ruleTransitionTimedGuard EOF )
+            // InternalFormalML.g:3422:1: ruleTransitionTimedGuard EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTransitionTimedGuard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransitionTimedGuard"
+
+
+    // $ANTLR start "ruleTransitionTimedGuard"
+    // InternalFormalML.g:3429:1: ruleTransitionTimedGuard : ( ( rule__TransitionTimedGuard__Alternatives ) ) ;
+    public final void ruleTransitionTimedGuard() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3433:2: ( ( ( rule__TransitionTimedGuard__Alternatives ) ) )
+            // InternalFormalML.g:3434:2: ( ( rule__TransitionTimedGuard__Alternatives ) )
+            {
+            // InternalFormalML.g:3434:2: ( ( rule__TransitionTimedGuard__Alternatives ) )
+            // InternalFormalML.g:3435:3: ( rule__TransitionTimedGuard__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:3436:3: ( rule__TransitionTimedGuard__Alternatives )
+            // InternalFormalML.g:3436:4: rule__TransitionTimedGuard__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionTimedGuard"
+
+
+    // $ANTLR start "entryRuleTransitionEffect"
+    // InternalFormalML.g:3445:1: entryRuleTransitionEffect : ruleTransitionEffect EOF ;
+    public final void entryRuleTransitionEffect() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3446:1: ( ruleTransitionEffect EOF )
+            // InternalFormalML.g:3447:1: ruleTransitionEffect EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionEffectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTransitionEffect();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionEffectRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransitionEffect"
+
+
+    // $ANTLR start "ruleTransitionEffect"
+    // InternalFormalML.g:3454:1: ruleTransitionEffect : ( ( rule__TransitionEffect__Group__0 ) ) ;
+    public final void ruleTransitionEffect() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3458:2: ( ( ( rule__TransitionEffect__Group__0 ) ) )
+            // InternalFormalML.g:3459:2: ( ( rule__TransitionEffect__Group__0 ) )
+            {
+            // InternalFormalML.g:3459:2: ( ( rule__TransitionEffect__Group__0 ) )
+            // InternalFormalML.g:3460:3: ( rule__TransitionEffect__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionEffectAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3461:3: ( rule__TransitionEffect__Group__0 )
+            // InternalFormalML.g:3461:4: rule__TransitionEffect__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionEffect__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionEffectAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionEffect"
+
+
+    // $ANTLR start "entryRuleTransitionEffectStatement"
+    // InternalFormalML.g:3470:1: entryRuleTransitionEffectStatement : ruleTransitionEffectStatement EOF ;
+    public final void entryRuleTransitionEffectStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3471:1: ( ruleTransitionEffectStatement EOF )
+            // InternalFormalML.g:3472:1: ruleTransitionEffectStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionEffectStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTransitionEffectStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionEffectStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTransitionEffectStatement"
+
+
+    // $ANTLR start "ruleTransitionEffectStatement"
+    // InternalFormalML.g:3479:1: ruleTransitionEffectStatement : ( ( rule__TransitionEffectStatement__Alternatives ) ) ;
+    public final void ruleTransitionEffectStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3483:2: ( ( ( rule__TransitionEffectStatement__Alternatives ) ) )
+            // InternalFormalML.g:3484:2: ( ( rule__TransitionEffectStatement__Alternatives ) )
+            {
+            // InternalFormalML.g:3484:2: ( ( rule__TransitionEffectStatement__Alternatives ) )
+            // InternalFormalML.g:3485:3: ( rule__TransitionEffectStatement__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionEffectStatementAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:3486:3: ( rule__TransitionEffectStatement__Alternatives )
+            // InternalFormalML.g:3486:4: rule__TransitionEffectStatement__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionEffectStatement__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionEffectStatementAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionEffectStatement"
+
+
+    // $ANTLR start "entryRuleStatement"
+    // InternalFormalML.g:3495:1: entryRuleStatement : ruleStatement EOF ;
+    public final void entryRuleStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3496:1: ( ruleStatement EOF )
+            // InternalFormalML.g:3497:1: ruleStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStatement"
+
+
+    // $ANTLR start "ruleStatement"
+    // InternalFormalML.g:3504:1: ruleStatement : ( ( rule__Statement__Alternatives ) ) ;
+    public final void ruleStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3508:2: ( ( ( rule__Statement__Alternatives ) ) )
+            // InternalFormalML.g:3509:2: ( ( rule__Statement__Alternatives ) )
+            {
+            // InternalFormalML.g:3509:2: ( ( rule__Statement__Alternatives ) )
+            // InternalFormalML.g:3510:3: ( rule__Statement__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatementAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:3511:3: ( rule__Statement__Alternatives )
+            // InternalFormalML.g:3511:4: rule__Statement__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statement__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatementAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStatement"
+
+
+    // $ANTLR start "entryRuleBlockStatement"
+    // InternalFormalML.g:3520:1: entryRuleBlockStatement : ruleBlockStatement EOF ;
+    public final void entryRuleBlockStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3521:1: ( ruleBlockStatement EOF )
+            // InternalFormalML.g:3522:1: ruleBlockStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBlockStatement"
+
+
+    // $ANTLR start "ruleBlockStatement"
+    // InternalFormalML.g:3529:1: ruleBlockStatement : ( ( rule__BlockStatement__Group__0 ) ) ;
+    public final void ruleBlockStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3533:2: ( ( ( rule__BlockStatement__Group__0 ) ) )
+            // InternalFormalML.g:3534:2: ( ( rule__BlockStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3534:2: ( ( rule__BlockStatement__Group__0 ) )
+            // InternalFormalML.g:3535:3: ( rule__BlockStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3536:3: ( rule__BlockStatement__Group__0 )
+            // InternalFormalML.g:3536:4: rule__BlockStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BlockStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBlockStatement"
+
+
+    // $ANTLR start "entryRuleBlockStatementScheduler"
+    // InternalFormalML.g:3545:1: entryRuleBlockStatementScheduler : ruleBlockStatementScheduler EOF ;
+    public final void entryRuleBlockStatementScheduler() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3546:1: ( ruleBlockStatementScheduler EOF )
+            // InternalFormalML.g:3547:1: ruleBlockStatementScheduler EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementSchedulerRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBlockStatementScheduler();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementSchedulerRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBlockStatementScheduler"
+
+
+    // $ANTLR start "ruleBlockStatementScheduler"
+    // InternalFormalML.g:3554:1: ruleBlockStatementScheduler : ( ( rule__BlockStatementScheduler__Alternatives ) ) ;
+    public final void ruleBlockStatementScheduler() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3558:2: ( ( ( rule__BlockStatementScheduler__Alternatives ) ) )
+            // InternalFormalML.g:3559:2: ( ( rule__BlockStatementScheduler__Alternatives ) )
+            {
+            // InternalFormalML.g:3559:2: ( ( rule__BlockStatementScheduler__Alternatives ) )
+            // InternalFormalML.g:3560:3: ( rule__BlockStatementScheduler__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementSchedulerAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:3561:3: ( rule__BlockStatementScheduler__Alternatives )
+            // InternalFormalML.g:3561:4: rule__BlockStatementScheduler__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BlockStatementScheduler__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementSchedulerAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBlockStatementScheduler"
+
+
+    // $ANTLR start "entryRuleExpressionStatement"
+    // InternalFormalML.g:3570:1: entryRuleExpressionStatement : ruleExpressionStatement EOF ;
+    public final void entryRuleExpressionStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3571:1: ( ruleExpressionStatement EOF )
+            // InternalFormalML.g:3572:1: ruleExpressionStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleExpressionStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleExpressionStatement"
+
+
+    // $ANTLR start "ruleExpressionStatement"
+    // InternalFormalML.g:3579:1: ruleExpressionStatement : ( ( rule__ExpressionStatement__Alternatives ) ) ;
+    public final void ruleExpressionStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3583:2: ( ( ( rule__ExpressionStatement__Alternatives ) ) )
+            // InternalFormalML.g:3584:2: ( ( rule__ExpressionStatement__Alternatives ) )
+            {
+            // InternalFormalML.g:3584:2: ( ( rule__ExpressionStatement__Alternatives ) )
+            // InternalFormalML.g:3585:3: ( rule__ExpressionStatement__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:3586:3: ( rule__ExpressionStatement__Alternatives )
+            // InternalFormalML.g:3586:4: rule__ExpressionStatement__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleExpressionStatement"
+
+
+    // $ANTLR start "entryRuleGuardStatement"
+    // InternalFormalML.g:3595:1: entryRuleGuardStatement : ruleGuardStatement EOF ;
+    public final void entryRuleGuardStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3596:1: ( ruleGuardStatement EOF )
+            // InternalFormalML.g:3597:1: ruleGuardStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGuardStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleGuardStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGuardStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleGuardStatement"
+
+
+    // $ANTLR start "ruleGuardStatement"
+    // InternalFormalML.g:3604:1: ruleGuardStatement : ( ( rule__GuardStatement__Group__0 ) ) ;
+    public final void ruleGuardStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3608:2: ( ( ( rule__GuardStatement__Group__0 ) ) )
+            // InternalFormalML.g:3609:2: ( ( rule__GuardStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3609:2: ( ( rule__GuardStatement__Group__0 ) )
+            // InternalFormalML.g:3610:3: ( rule__GuardStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGuardStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3611:3: ( rule__GuardStatement__Group__0 )
+            // InternalFormalML.g:3611:4: rule__GuardStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__GuardStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGuardStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleGuardStatement"
+
+
+    // $ANTLR start "entryRuleTimedGuardStatement"
+    // InternalFormalML.g:3620:1: entryRuleTimedGuardStatement : ruleTimedGuardStatement EOF ;
+    public final void entryRuleTimedGuardStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3621:1: ( ruleTimedGuardStatement EOF )
+            // InternalFormalML.g:3622:1: ruleTimedGuardStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTimedGuardStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTimedGuardStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTimedGuardStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTimedGuardStatement"
+
+
+    // $ANTLR start "ruleTimedGuardStatement"
+    // InternalFormalML.g:3629:1: ruleTimedGuardStatement : ( ( rule__TimedGuardStatement__Group__0 ) ) ;
+    public final void ruleTimedGuardStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3633:2: ( ( ( rule__TimedGuardStatement__Group__0 ) ) )
+            // InternalFormalML.g:3634:2: ( ( rule__TimedGuardStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3634:2: ( ( rule__TimedGuardStatement__Group__0 ) )
+            // InternalFormalML.g:3635:3: ( rule__TimedGuardStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTimedGuardStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3636:3: ( rule__TimedGuardStatement__Group__0 )
+            // InternalFormalML.g:3636:4: rule__TimedGuardStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TimedGuardStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTimedGuardStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTimedGuardStatement"
+
+
+    // $ANTLR start "entryRuleEventGuardStatement"
+    // InternalFormalML.g:3645:1: entryRuleEventGuardStatement : ruleEventGuardStatement EOF ;
+    public final void entryRuleEventGuardStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3646:1: ( ruleEventGuardStatement EOF )
+            // InternalFormalML.g:3647:1: ruleEventGuardStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEventGuardStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEventGuardStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEventGuardStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEventGuardStatement"
+
+
+    // $ANTLR start "ruleEventGuardStatement"
+    // InternalFormalML.g:3654:1: ruleEventGuardStatement : ( ( rule__EventGuardStatement__Group__0 ) ) ;
+    public final void ruleEventGuardStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3658:2: ( ( ( rule__EventGuardStatement__Group__0 ) ) )
+            // InternalFormalML.g:3659:2: ( ( rule__EventGuardStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3659:2: ( ( rule__EventGuardStatement__Group__0 ) )
+            // InternalFormalML.g:3660:3: ( rule__EventGuardStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEventGuardStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3661:3: ( rule__EventGuardStatement__Group__0 )
+            // InternalFormalML.g:3661:4: rule__EventGuardStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EventGuardStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEventGuardStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEventGuardStatement"
+
+
+    // $ANTLR start "entryRuleCheckSatGuardStatement"
+    // InternalFormalML.g:3670:1: entryRuleCheckSatGuardStatement : ruleCheckSatGuardStatement EOF ;
+    public final void entryRuleCheckSatGuardStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3671:1: ( ruleCheckSatGuardStatement EOF )
+            // InternalFormalML.g:3672:1: ruleCheckSatGuardStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleCheckSatGuardStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleCheckSatGuardStatement"
+
+
+    // $ANTLR start "ruleCheckSatGuardStatement"
+    // InternalFormalML.g:3679:1: ruleCheckSatGuardStatement : ( ( rule__CheckSatGuardStatement__Group__0 ) ) ;
+    public final void ruleCheckSatGuardStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3683:2: ( ( ( rule__CheckSatGuardStatement__Group__0 ) ) )
+            // InternalFormalML.g:3684:2: ( ( rule__CheckSatGuardStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3684:2: ( ( rule__CheckSatGuardStatement__Group__0 ) )
+            // InternalFormalML.g:3685:3: ( rule__CheckSatGuardStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3686:3: ( rule__CheckSatGuardStatement__Group__0 )
+            // InternalFormalML.g:3686:4: rule__CheckSatGuardStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CheckSatGuardStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleCheckSatGuardStatement"
+
+
+    // $ANTLR start "entryRuleInputComStatement"
+    // InternalFormalML.g:3695:1: entryRuleInputComStatement : ruleInputComStatement EOF ;
+    public final void entryRuleInputComStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3696:1: ( ruleInputComStatement EOF )
+            // InternalFormalML.g:3697:1: ruleInputComStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleInputComStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleInputComStatement"
+
+
+    // $ANTLR start "ruleInputComStatement"
+    // InternalFormalML.g:3704:1: ruleInputComStatement : ( ( rule__InputComStatement__Group__0 ) ) ;
+    public final void ruleInputComStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3708:2: ( ( ( rule__InputComStatement__Group__0 ) ) )
+            // InternalFormalML.g:3709:2: ( ( rule__InputComStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3709:2: ( ( rule__InputComStatement__Group__0 ) )
+            // InternalFormalML.g:3710:3: ( rule__InputComStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3711:3: ( rule__InputComStatement__Group__0 )
+            // InternalFormalML.g:3711:4: rule__InputComStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleInputComStatement"
+
+
+    // $ANTLR start "entryRuleOutputComStatement"
+    // InternalFormalML.g:3720:1: entryRuleOutputComStatement : ruleOutputComStatement EOF ;
+    public final void entryRuleOutputComStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3721:1: ( ruleOutputComStatement EOF )
+            // InternalFormalML.g:3722:1: ruleOutputComStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleOutputComStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleOutputComStatement"
+
+
+    // $ANTLR start "ruleOutputComStatement"
+    // InternalFormalML.g:3729:1: ruleOutputComStatement : ( ( rule__OutputComStatement__Group__0 ) ) ;
+    public final void ruleOutputComStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3733:2: ( ( ( rule__OutputComStatement__Group__0 ) ) )
+            // InternalFormalML.g:3734:2: ( ( rule__OutputComStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3734:2: ( ( rule__OutputComStatement__Group__0 ) )
+            // InternalFormalML.g:3735:3: ( rule__OutputComStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3736:3: ( rule__OutputComStatement__Group__0 )
+            // InternalFormalML.g:3736:4: rule__OutputComStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOutputComStatement"
+
+
+    // $ANTLR start "entryRuleExpressionAsMachine"
+    // InternalFormalML.g:3745:1: entryRuleExpressionAsMachine : ruleExpressionAsMachine EOF ;
+    public final void entryRuleExpressionAsMachine() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3746:1: ( ruleExpressionAsMachine EOF )
+            // InternalFormalML.g:3747:1: ruleExpressionAsMachine EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionAsMachineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleExpressionAsMachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionAsMachineRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleExpressionAsMachine"
+
+
+    // $ANTLR start "ruleExpressionAsMachine"
+    // InternalFormalML.g:3754:1: ruleExpressionAsMachine : ( ( rule__ExpressionAsMachine__MachineAssignment ) ) ;
+    public final void ruleExpressionAsMachine() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3758:2: ( ( ( rule__ExpressionAsMachine__MachineAssignment ) ) )
+            // InternalFormalML.g:3759:2: ( ( rule__ExpressionAsMachine__MachineAssignment ) )
+            {
+            // InternalFormalML.g:3759:2: ( ( rule__ExpressionAsMachine__MachineAssignment ) )
+            // InternalFormalML.g:3760:3: ( rule__ExpressionAsMachine__MachineAssignment )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionAsMachineAccess().getMachineAssignment()); 
+            }
+            // InternalFormalML.g:3761:3: ( rule__ExpressionAsMachine__MachineAssignment )
+            // InternalFormalML.g:3761:4: rule__ExpressionAsMachine__MachineAssignment
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionAsMachine__MachineAssignment();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionAsMachineAccess().getMachineAssignment()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleExpressionAsMachine"
+
+
+    // $ANTLR start "entryRuleIfStatement"
+    // InternalFormalML.g:3770:1: entryRuleIfStatement : ruleIfStatement EOF ;
+    public final void entryRuleIfStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3771:1: ( ruleIfStatement EOF )
+            // InternalFormalML.g:3772:1: ruleIfStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleIfStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIfStatement"
+
+
+    // $ANTLR start "ruleIfStatement"
+    // InternalFormalML.g:3779:1: ruleIfStatement : ( ( rule__IfStatement__Group__0 ) ) ;
+    public final void ruleIfStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3783:2: ( ( ( rule__IfStatement__Group__0 ) ) )
+            // InternalFormalML.g:3784:2: ( ( rule__IfStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3784:2: ( ( rule__IfStatement__Group__0 ) )
+            // InternalFormalML.g:3785:3: ( rule__IfStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3786:3: ( rule__IfStatement__Group__0 )
+            // InternalFormalML.g:3786:4: rule__IfStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIfStatement"
+
+
+    // $ANTLR start "entryRuleElseIfStatement"
+    // InternalFormalML.g:3795:1: entryRuleElseIfStatement : ruleElseIfStatement EOF ;
+    public final void entryRuleElseIfStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3796:1: ( ruleElseIfStatement EOF )
+            // InternalFormalML.g:3797:1: ruleElseIfStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getElseIfStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleElseIfStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getElseIfStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleElseIfStatement"
+
+
+    // $ANTLR start "ruleElseIfStatement"
+    // InternalFormalML.g:3804:1: ruleElseIfStatement : ( ( rule__ElseIfStatement__Group__0 ) ) ;
+    public final void ruleElseIfStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3808:2: ( ( ( rule__ElseIfStatement__Group__0 ) ) )
+            // InternalFormalML.g:3809:2: ( ( rule__ElseIfStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3809:2: ( ( rule__ElseIfStatement__Group__0 ) )
+            // InternalFormalML.g:3810:3: ( rule__ElseIfStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getElseIfStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3811:3: ( rule__ElseIfStatement__Group__0 )
+            // InternalFormalML.g:3811:4: rule__ElseIfStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ElseIfStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getElseIfStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleElseIfStatement"
+
+
+    // $ANTLR start "entryRuleWhileDoStatement"
+    // InternalFormalML.g:3820:1: entryRuleWhileDoStatement : ruleWhileDoStatement EOF ;
+    public final void entryRuleWhileDoStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3821:1: ( ruleWhileDoStatement EOF )
+            // InternalFormalML.g:3822:1: ruleWhileDoStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWhileDoStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleWhileDoStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWhileDoStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleWhileDoStatement"
+
+
+    // $ANTLR start "ruleWhileDoStatement"
+    // InternalFormalML.g:3829:1: ruleWhileDoStatement : ( ( rule__WhileDoStatement__Group__0 ) ) ;
+    public final void ruleWhileDoStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3833:2: ( ( ( rule__WhileDoStatement__Group__0 ) ) )
+            // InternalFormalML.g:3834:2: ( ( rule__WhileDoStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3834:2: ( ( rule__WhileDoStatement__Group__0 ) )
+            // InternalFormalML.g:3835:3: ( rule__WhileDoStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWhileDoStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3836:3: ( rule__WhileDoStatement__Group__0 )
+            // InternalFormalML.g:3836:4: rule__WhileDoStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__WhileDoStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWhileDoStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleWhileDoStatement"
+
+
+    // $ANTLR start "entryRuleDoWhileStatement"
+    // InternalFormalML.g:3845:1: entryRuleDoWhileStatement : ruleDoWhileStatement EOF ;
+    public final void entryRuleDoWhileStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3846:1: ( ruleDoWhileStatement EOF )
+            // InternalFormalML.g:3847:1: ruleDoWhileStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDoWhileStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDoWhileStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDoWhileStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDoWhileStatement"
+
+
+    // $ANTLR start "ruleDoWhileStatement"
+    // InternalFormalML.g:3854:1: ruleDoWhileStatement : ( ( rule__DoWhileStatement__Group__0 ) ) ;
+    public final void ruleDoWhileStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3858:2: ( ( ( rule__DoWhileStatement__Group__0 ) ) )
+            // InternalFormalML.g:3859:2: ( ( rule__DoWhileStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3859:2: ( ( rule__DoWhileStatement__Group__0 ) )
+            // InternalFormalML.g:3860:3: ( rule__DoWhileStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDoWhileStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3861:3: ( rule__DoWhileStatement__Group__0 )
+            // InternalFormalML.g:3861:4: rule__DoWhileStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DoWhileStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDoWhileStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDoWhileStatement"
+
+
+    // $ANTLR start "entryRuleForStatement"
+    // InternalFormalML.g:3870:1: entryRuleForStatement : ruleForStatement EOF ;
+    public final void entryRuleForStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3871:1: ( ruleForStatement EOF )
+            // InternalFormalML.g:3872:1: ruleForStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleForStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleForStatement"
+
+
+    // $ANTLR start "ruleForStatement"
+    // InternalFormalML.g:3879:1: ruleForStatement : ( ( rule__ForStatement__Alternatives ) ) ;
+    public final void ruleForStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3883:2: ( ( ( rule__ForStatement__Alternatives ) ) )
+            // InternalFormalML.g:3884:2: ( ( rule__ForStatement__Alternatives ) )
+            {
+            // InternalFormalML.g:3884:2: ( ( rule__ForStatement__Alternatives ) )
+            // InternalFormalML.g:3885:3: ( rule__ForStatement__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:3886:3: ( rule__ForStatement__Alternatives )
+            // InternalFormalML.g:3886:4: rule__ForStatement__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleForStatement"
+
+
+    // $ANTLR start "entryRuleForAssignmentExpression"
+    // InternalFormalML.g:3895:1: entryRuleForAssignmentExpression : ruleForAssignmentExpression EOF ;
+    public final void entryRuleForAssignmentExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3896:1: ( ruleForAssignmentExpression EOF )
+            // InternalFormalML.g:3897:1: ruleForAssignmentExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForAssignmentExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleForAssignmentExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForAssignmentExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleForAssignmentExpression"
+
+
+    // $ANTLR start "ruleForAssignmentExpression"
+    // InternalFormalML.g:3904:1: ruleForAssignmentExpression : ( ( rule__ForAssignmentExpression__Alternatives ) ) ;
+    public final void ruleForAssignmentExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3908:2: ( ( ( rule__ForAssignmentExpression__Alternatives ) ) )
+            // InternalFormalML.g:3909:2: ( ( rule__ForAssignmentExpression__Alternatives ) )
+            {
+            // InternalFormalML.g:3909:2: ( ( rule__ForAssignmentExpression__Alternatives ) )
+            // InternalFormalML.g:3910:3: ( rule__ForAssignmentExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForAssignmentExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:3911:3: ( rule__ForAssignmentExpression__Alternatives )
+            // InternalFormalML.g:3911:4: rule__ForAssignmentExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForAssignmentExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForAssignmentExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleForAssignmentExpression"
+
+
+    // $ANTLR start "entryRuleForEachStatement"
+    // InternalFormalML.g:3920:1: entryRuleForEachStatement : ruleForEachStatement EOF ;
+    public final void entryRuleForEachStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3921:1: ( ruleForEachStatement EOF )
+            // InternalFormalML.g:3922:1: ruleForEachStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleForEachStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleForEachStatement"
+
+
+    // $ANTLR start "ruleForEachStatement"
+    // InternalFormalML.g:3929:1: ruleForEachStatement : ( ( rule__ForEachStatement__Alternatives ) ) ;
+    public final void ruleForEachStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3933:2: ( ( ( rule__ForEachStatement__Alternatives ) ) )
+            // InternalFormalML.g:3934:2: ( ( rule__ForEachStatement__Alternatives ) )
+            {
+            // InternalFormalML.g:3934:2: ( ( rule__ForEachStatement__Alternatives ) )
+            // InternalFormalML.g:3935:3: ( rule__ForEachStatement__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:3936:3: ( rule__ForEachStatement__Alternatives )
+            // InternalFormalML.g:3936:4: rule__ForEachStatement__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleForEachStatement"
+
+
+    // $ANTLR start "entryRuleInterruptStatement"
+    // InternalFormalML.g:3945:1: entryRuleInterruptStatement : ruleInterruptStatement EOF ;
+    public final void entryRuleInterruptStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3946:1: ( ruleInterruptStatement EOF )
+            // InternalFormalML.g:3947:1: ruleInterruptStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleInterruptStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleInterruptStatement"
+
+
+    // $ANTLR start "ruleInterruptStatement"
+    // InternalFormalML.g:3954:1: ruleInterruptStatement : ( ( rule__InterruptStatement__Group__0 ) ) ;
+    public final void ruleInterruptStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3958:2: ( ( ( rule__InterruptStatement__Group__0 ) ) )
+            // InternalFormalML.g:3959:2: ( ( rule__InterruptStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3959:2: ( ( rule__InterruptStatement__Group__0 ) )
+            // InternalFormalML.g:3960:3: ( rule__InterruptStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3961:3: ( rule__InterruptStatement__Group__0 )
+            // InternalFormalML.g:3961:4: rule__InterruptStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleInterruptStatement"
+
+
+    // $ANTLR start "entryRuleActivityStatement"
+    // InternalFormalML.g:3970:1: entryRuleActivityStatement : ruleActivityStatement EOF ;
+    public final void entryRuleActivityStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3971:1: ( ruleActivityStatement EOF )
+            // InternalFormalML.g:3972:1: ruleActivityStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleActivityStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleActivityStatement"
+
+
+    // $ANTLR start "ruleActivityStatement"
+    // InternalFormalML.g:3979:1: ruleActivityStatement : ( ( rule__ActivityStatement__Group__0 ) ) ;
+    public final void ruleActivityStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:3983:2: ( ( ( rule__ActivityStatement__Group__0 ) ) )
+            // InternalFormalML.g:3984:2: ( ( rule__ActivityStatement__Group__0 ) )
+            {
+            // InternalFormalML.g:3984:2: ( ( rule__ActivityStatement__Group__0 ) )
+            // InternalFormalML.g:3985:3: ( rule__ActivityStatement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:3986:3: ( rule__ActivityStatement__Group__0 )
+            // InternalFormalML.g:3986:4: rule__ActivityStatement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ActivityStatement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleActivityStatement"
+
+
+    // $ANTLR start "entryRuleInvokeStatement"
+    // InternalFormalML.g:3995:1: entryRuleInvokeStatement : ruleInvokeStatement EOF ;
+    public final void entryRuleInvokeStatement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:3996:1: ( ruleInvokeStatement EOF )
+            // InternalFormalML.g:3997:1: ruleInvokeStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleInvokeStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleInvokeStatement"
+
+
+    // $ANTLR start "ruleInvokeStatement"
+    // InternalFormalML.g:4004:1: ruleInvokeStatement : ( ( rule__InvokeStatement__Alternatives ) ) ;
+    public final void ruleInvokeStatement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4008:2: ( ( ( rule__InvokeStatement__Alternatives ) ) )
+            // InternalFormalML.g:4009:2: ( ( rule__InvokeStatement__Alternatives ) )
+            {
+            // InternalFormalML.g:4009:2: ( ( rule__InvokeStatement__Alternatives ) )
+            // InternalFormalML.g:4010:3: ( rule__InvokeStatement__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4011:3: ( rule__InvokeStatement__Alternatives )
+            // InternalFormalML.g:4011:4: rule__InvokeStatement__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleInvokeStatement"
+
+
+    // $ANTLR start "entryRuleExpression"
+    // InternalFormalML.g:4020:1: entryRuleExpression : ruleExpression EOF ;
+    public final void entryRuleExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4021:1: ( ruleExpression EOF )
+            // InternalFormalML.g:4022:1: ruleExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleExpression"
+
+
+    // $ANTLR start "ruleExpression"
+    // InternalFormalML.g:4029:1: ruleExpression : ( ( rule__Expression__Alternatives ) ) ;
+    public final void ruleExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4033:2: ( ( ( rule__Expression__Alternatives ) ) )
+            // InternalFormalML.g:4034:2: ( ( rule__Expression__Alternatives ) )
+            {
+            // InternalFormalML.g:4034:2: ( ( rule__Expression__Alternatives ) )
+            // InternalFormalML.g:4035:3: ( rule__Expression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4036:3: ( rule__Expression__Alternatives )
+            // InternalFormalML.g:4036:4: rule__Expression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Expression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleExpression"
+
+
+    // $ANTLR start "entryRuleAssignmentExpression"
+    // InternalFormalML.g:4045:1: entryRuleAssignmentExpression : ruleAssignmentExpression EOF ;
+    public final void entryRuleAssignmentExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4046:1: ( ruleAssignmentExpression EOF )
+            // InternalFormalML.g:4047:1: ruleAssignmentExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleAssignmentExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleAssignmentExpression"
+
+
+    // $ANTLR start "ruleAssignmentExpression"
+    // InternalFormalML.g:4054:1: ruleAssignmentExpression : ( ( rule__AssignmentExpression__Group__0 ) ) ;
+    public final void ruleAssignmentExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4058:2: ( ( ( rule__AssignmentExpression__Group__0 ) ) )
+            // InternalFormalML.g:4059:2: ( ( rule__AssignmentExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4059:2: ( ( rule__AssignmentExpression__Group__0 ) )
+            // InternalFormalML.g:4060:3: ( rule__AssignmentExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4061:3: ( rule__AssignmentExpression__Group__0 )
+            // InternalFormalML.g:4061:4: rule__AssignmentExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AssignmentExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleAssignmentExpression"
+
+
+    // $ANTLR start "entryRuleAssignmentOperator"
+    // InternalFormalML.g:4070:1: entryRuleAssignmentOperator : ruleAssignmentOperator EOF ;
+    public final void entryRuleAssignmentOperator() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4071:1: ( ruleAssignmentOperator EOF )
+            // InternalFormalML.g:4072:1: ruleAssignmentOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleAssignmentOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentOperatorRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleAssignmentOperator"
+
+
+    // $ANTLR start "ruleAssignmentOperator"
+    // InternalFormalML.g:4079:1: ruleAssignmentOperator : ( ( rule__AssignmentOperator__Alternatives ) ) ;
+    public final void ruleAssignmentOperator() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4083:2: ( ( ( rule__AssignmentOperator__Alternatives ) ) )
+            // InternalFormalML.g:4084:2: ( ( rule__AssignmentOperator__Alternatives ) )
+            {
+            // InternalFormalML.g:4084:2: ( ( rule__AssignmentOperator__Alternatives ) )
+            // InternalFormalML.g:4085:3: ( rule__AssignmentOperator__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentOperatorAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4086:3: ( rule__AssignmentOperator__Alternatives )
+            // InternalFormalML.g:4086:4: rule__AssignmentOperator__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AssignmentOperator__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentOperatorAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleAssignmentOperator"
+
+
+    // $ANTLR start "entryRuleLeftHandSideExpression"
+    // InternalFormalML.g:4095:1: entryRuleLeftHandSideExpression : ruleLeftHandSideExpression EOF ;
+    public final void entryRuleLeftHandSideExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4096:1: ( ruleLeftHandSideExpression EOF )
+            // InternalFormalML.g:4097:1: ruleLeftHandSideExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLeftHandSideExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLeftHandSideExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLeftHandSideExpression"
+
+
+    // $ANTLR start "ruleLeftHandSideExpression"
+    // InternalFormalML.g:4104:1: ruleLeftHandSideExpression : ( ( rule__LeftHandSideExpression__Group__0 ) ) ;
+    public final void ruleLeftHandSideExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4108:2: ( ( ( rule__LeftHandSideExpression__Group__0 ) ) )
+            // InternalFormalML.g:4109:2: ( ( rule__LeftHandSideExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4109:2: ( ( rule__LeftHandSideExpression__Group__0 ) )
+            // InternalFormalML.g:4110:3: ( rule__LeftHandSideExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLeftHandSideExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4111:3: ( rule__LeftHandSideExpression__Group__0 )
+            // InternalFormalML.g:4111:4: rule__LeftHandSideExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LeftHandSideExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLeftHandSideExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLeftHandSideExpression"
+
+
+    // $ANTLR start "entryRuleConditionalTestExpression"
+    // InternalFormalML.g:4120:1: entryRuleConditionalTestExpression : ruleConditionalTestExpression EOF ;
+    public final void entryRuleConditionalTestExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4121:1: ( ruleConditionalTestExpression EOF )
+            // InternalFormalML.g:4122:1: ruleConditionalTestExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleConditionalTestExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleConditionalTestExpression"
+
+
+    // $ANTLR start "ruleConditionalTestExpression"
+    // InternalFormalML.g:4129:1: ruleConditionalTestExpression : ( ( rule__ConditionalTestExpression__Group__0 ) ) ;
+    public final void ruleConditionalTestExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4133:2: ( ( ( rule__ConditionalTestExpression__Group__0 ) ) )
+            // InternalFormalML.g:4134:2: ( ( rule__ConditionalTestExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4134:2: ( ( rule__ConditionalTestExpression__Group__0 ) )
+            // InternalFormalML.g:4135:3: ( rule__ConditionalTestExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4136:3: ( rule__ConditionalTestExpression__Group__0 )
+            // InternalFormalML.g:4136:4: rule__ConditionalTestExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleConditionalTestExpression"
+
+
+    // $ANTLR start "entryRuleLogicalOrExpression"
+    // InternalFormalML.g:4145:1: entryRuleLogicalOrExpression : ruleLogicalOrExpression EOF ;
+    public final void entryRuleLogicalOrExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4146:1: ( ruleLogicalOrExpression EOF )
+            // InternalFormalML.g:4147:1: ruleLogicalOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLogicalOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLogicalOrExpression"
+
+
+    // $ANTLR start "ruleLogicalOrExpression"
+    // InternalFormalML.g:4154:1: ruleLogicalOrExpression : ( ( rule__LogicalOrExpression__Group__0 ) ) ;
+    public final void ruleLogicalOrExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4158:2: ( ( ( rule__LogicalOrExpression__Group__0 ) ) )
+            // InternalFormalML.g:4159:2: ( ( rule__LogicalOrExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4159:2: ( ( rule__LogicalOrExpression__Group__0 ) )
+            // InternalFormalML.g:4160:3: ( rule__LogicalOrExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4161:3: ( rule__LogicalOrExpression__Group__0 )
+            // InternalFormalML.g:4161:4: rule__LogicalOrExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLogicalOrExpression"
+
+
+    // $ANTLR start "entryRuleLogicalAndExpression"
+    // InternalFormalML.g:4170:1: entryRuleLogicalAndExpression : ruleLogicalAndExpression EOF ;
+    public final void entryRuleLogicalAndExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4171:1: ( ruleLogicalAndExpression EOF )
+            // InternalFormalML.g:4172:1: ruleLogicalAndExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLogicalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLogicalAndExpression"
+
+
+    // $ANTLR start "ruleLogicalAndExpression"
+    // InternalFormalML.g:4179:1: ruleLogicalAndExpression : ( ( rule__LogicalAndExpression__Group__0 ) ) ;
+    public final void ruleLogicalAndExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4183:2: ( ( ( rule__LogicalAndExpression__Group__0 ) ) )
+            // InternalFormalML.g:4184:2: ( ( rule__LogicalAndExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4184:2: ( ( rule__LogicalAndExpression__Group__0 ) )
+            // InternalFormalML.g:4185:3: ( rule__LogicalAndExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4186:3: ( rule__LogicalAndExpression__Group__0 )
+            // InternalFormalML.g:4186:4: rule__LogicalAndExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLogicalAndExpression"
+
+
+    // $ANTLR start "entryRuleBitwiseOrExpression"
+    // InternalFormalML.g:4195:1: entryRuleBitwiseOrExpression : ruleBitwiseOrExpression EOF ;
+    public final void entryRuleBitwiseOrExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4196:1: ( ruleBitwiseOrExpression EOF )
+            // InternalFormalML.g:4197:1: ruleBitwiseOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBitwiseOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBitwiseOrExpression"
+
+
+    // $ANTLR start "ruleBitwiseOrExpression"
+    // InternalFormalML.g:4204:1: ruleBitwiseOrExpression : ( ( rule__BitwiseOrExpression__Group__0 ) ) ;
+    public final void ruleBitwiseOrExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4208:2: ( ( ( rule__BitwiseOrExpression__Group__0 ) ) )
+            // InternalFormalML.g:4209:2: ( ( rule__BitwiseOrExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4209:2: ( ( rule__BitwiseOrExpression__Group__0 ) )
+            // InternalFormalML.g:4210:3: ( rule__BitwiseOrExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4211:3: ( rule__BitwiseOrExpression__Group__0 )
+            // InternalFormalML.g:4211:4: rule__BitwiseOrExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBitwiseOrExpression"
+
+
+    // $ANTLR start "entryRuleBitwiseXorExpression"
+    // InternalFormalML.g:4220:1: entryRuleBitwiseXorExpression : ruleBitwiseXorExpression EOF ;
+    public final void entryRuleBitwiseXorExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4221:1: ( ruleBitwiseXorExpression EOF )
+            // InternalFormalML.g:4222:1: ruleBitwiseXorExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBitwiseXorExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBitwiseXorExpression"
+
+
+    // $ANTLR start "ruleBitwiseXorExpression"
+    // InternalFormalML.g:4229:1: ruleBitwiseXorExpression : ( ( rule__BitwiseXorExpression__Group__0 ) ) ;
+    public final void ruleBitwiseXorExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4233:2: ( ( ( rule__BitwiseXorExpression__Group__0 ) ) )
+            // InternalFormalML.g:4234:2: ( ( rule__BitwiseXorExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4234:2: ( ( rule__BitwiseXorExpression__Group__0 ) )
+            // InternalFormalML.g:4235:3: ( rule__BitwiseXorExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4236:3: ( rule__BitwiseXorExpression__Group__0 )
+            // InternalFormalML.g:4236:4: rule__BitwiseXorExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBitwiseXorExpression"
+
+
+    // $ANTLR start "entryRuleBitwiseAndExpression"
+    // InternalFormalML.g:4245:1: entryRuleBitwiseAndExpression : ruleBitwiseAndExpression EOF ;
+    public final void entryRuleBitwiseAndExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4246:1: ( ruleBitwiseAndExpression EOF )
+            // InternalFormalML.g:4247:1: ruleBitwiseAndExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBitwiseAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBitwiseAndExpression"
+
+
+    // $ANTLR start "ruleBitwiseAndExpression"
+    // InternalFormalML.g:4254:1: ruleBitwiseAndExpression : ( ( rule__BitwiseAndExpression__Group__0 ) ) ;
+    public final void ruleBitwiseAndExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4258:2: ( ( ( rule__BitwiseAndExpression__Group__0 ) ) )
+            // InternalFormalML.g:4259:2: ( ( rule__BitwiseAndExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4259:2: ( ( rule__BitwiseAndExpression__Group__0 ) )
+            // InternalFormalML.g:4260:3: ( rule__BitwiseAndExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4261:3: ( rule__BitwiseAndExpression__Group__0 )
+            // InternalFormalML.g:4261:4: rule__BitwiseAndExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBitwiseAndExpression"
+
+
+    // $ANTLR start "entryRuleEqualityExpression"
+    // InternalFormalML.g:4270:1: entryRuleEqualityExpression : ruleEqualityExpression EOF ;
+    public final void entryRuleEqualityExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4271:1: ( ruleEqualityExpression EOF )
+            // InternalFormalML.g:4272:1: ruleEqualityExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEqualityExpression"
+
+
+    // $ANTLR start "ruleEqualityExpression"
+    // InternalFormalML.g:4279:1: ruleEqualityExpression : ( ( rule__EqualityExpression__Group__0 ) ) ;
+    public final void ruleEqualityExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4283:2: ( ( ( rule__EqualityExpression__Group__0 ) ) )
+            // InternalFormalML.g:4284:2: ( ( rule__EqualityExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4284:2: ( ( rule__EqualityExpression__Group__0 ) )
+            // InternalFormalML.g:4285:3: ( rule__EqualityExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4286:3: ( rule__EqualityExpression__Group__0 )
+            // InternalFormalML.g:4286:4: rule__EqualityExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEqualityExpression"
+
+
+    // $ANTLR start "entryRuleEqualityOperator"
+    // InternalFormalML.g:4295:1: entryRuleEqualityOperator : ruleEqualityOperator EOF ;
+    public final void entryRuleEqualityOperator() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4296:1: ( ruleEqualityOperator EOF )
+            // InternalFormalML.g:4297:1: ruleEqualityOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleEqualityOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityOperatorRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEqualityOperator"
+
+
+    // $ANTLR start "ruleEqualityOperator"
+    // InternalFormalML.g:4304:1: ruleEqualityOperator : ( ( rule__EqualityOperator__Alternatives ) ) ;
+    public final void ruleEqualityOperator() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4308:2: ( ( ( rule__EqualityOperator__Alternatives ) ) )
+            // InternalFormalML.g:4309:2: ( ( rule__EqualityOperator__Alternatives ) )
+            {
+            // InternalFormalML.g:4309:2: ( ( rule__EqualityOperator__Alternatives ) )
+            // InternalFormalML.g:4310:3: ( rule__EqualityOperator__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityOperatorAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4311:3: ( rule__EqualityOperator__Alternatives )
+            // InternalFormalML.g:4311:4: rule__EqualityOperator__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityOperator__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityOperatorAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEqualityOperator"
+
+
+    // $ANTLR start "entryRuleRelationalExpression"
+    // InternalFormalML.g:4320:1: entryRuleRelationalExpression : ruleRelationalExpression EOF ;
+    public final void entryRuleRelationalExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4321:1: ( ruleRelationalExpression EOF )
+            // InternalFormalML.g:4322:1: ruleRelationalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleRelationalExpression"
+
+
+    // $ANTLR start "ruleRelationalExpression"
+    // InternalFormalML.g:4329:1: ruleRelationalExpression : ( ( rule__RelationalExpression__Group__0 ) ) ;
+    public final void ruleRelationalExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4333:2: ( ( ( rule__RelationalExpression__Group__0 ) ) )
+            // InternalFormalML.g:4334:2: ( ( rule__RelationalExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4334:2: ( ( rule__RelationalExpression__Group__0 ) )
+            // InternalFormalML.g:4335:3: ( rule__RelationalExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4336:3: ( rule__RelationalExpression__Group__0 )
+            // InternalFormalML.g:4336:4: rule__RelationalExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleRelationalExpression"
+
+
+    // $ANTLR start "entryRuleRelationalOperator"
+    // InternalFormalML.g:4345:1: entryRuleRelationalOperator : ruleRelationalOperator EOF ;
+    public final void entryRuleRelationalOperator() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4346:1: ( ruleRelationalOperator EOF )
+            // InternalFormalML.g:4347:1: ruleRelationalOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleRelationalOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalOperatorRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleRelationalOperator"
+
+
+    // $ANTLR start "ruleRelationalOperator"
+    // InternalFormalML.g:4354:1: ruleRelationalOperator : ( ( rule__RelationalOperator__Alternatives ) ) ;
+    public final void ruleRelationalOperator() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4358:2: ( ( ( rule__RelationalOperator__Alternatives ) ) )
+            // InternalFormalML.g:4359:2: ( ( rule__RelationalOperator__Alternatives ) )
+            {
+            // InternalFormalML.g:4359:2: ( ( rule__RelationalOperator__Alternatives ) )
+            // InternalFormalML.g:4360:3: ( rule__RelationalOperator__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalOperatorAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4361:3: ( rule__RelationalOperator__Alternatives )
+            // InternalFormalML.g:4361:4: rule__RelationalOperator__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalOperator__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalOperatorAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleRelationalOperator"
+
+
+    // $ANTLR start "entryRuleAdditiveExpression"
+    // InternalFormalML.g:4370:1: entryRuleAdditiveExpression : ruleAdditiveExpression EOF ;
+    public final void entryRuleAdditiveExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4371:1: ( ruleAdditiveExpression EOF )
+            // InternalFormalML.g:4372:1: ruleAdditiveExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleAdditiveExpression"
+
+
+    // $ANTLR start "ruleAdditiveExpression"
+    // InternalFormalML.g:4379:1: ruleAdditiveExpression : ( ( rule__AdditiveExpression__Group__0 ) ) ;
+    public final void ruleAdditiveExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4383:2: ( ( ( rule__AdditiveExpression__Group__0 ) ) )
+            // InternalFormalML.g:4384:2: ( ( rule__AdditiveExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4384:2: ( ( rule__AdditiveExpression__Group__0 ) )
+            // InternalFormalML.g:4385:3: ( rule__AdditiveExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4386:3: ( rule__AdditiveExpression__Group__0 )
+            // InternalFormalML.g:4386:4: rule__AdditiveExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleAdditiveExpression"
+
+
+    // $ANTLR start "entryRuleMultiplicativeExpression"
+    // InternalFormalML.g:4395:1: entryRuleMultiplicativeExpression : ruleMultiplicativeExpression EOF ;
+    public final void entryRuleMultiplicativeExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4396:1: ( ruleMultiplicativeExpression EOF )
+            // InternalFormalML.g:4397:1: ruleMultiplicativeExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleMultiplicativeExpression"
+
+
+    // $ANTLR start "ruleMultiplicativeExpression"
+    // InternalFormalML.g:4404:1: ruleMultiplicativeExpression : ( ( rule__MultiplicativeExpression__Group__0 ) ) ;
+    public final void ruleMultiplicativeExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4408:2: ( ( ( rule__MultiplicativeExpression__Group__0 ) ) )
+            // InternalFormalML.g:4409:2: ( ( rule__MultiplicativeExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4409:2: ( ( rule__MultiplicativeExpression__Group__0 ) )
+            // InternalFormalML.g:4410:3: ( rule__MultiplicativeExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4411:3: ( rule__MultiplicativeExpression__Group__0 )
+            // InternalFormalML.g:4411:4: rule__MultiplicativeExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleMultiplicativeExpression"
+
+
+    // $ANTLR start "entryRuleUnaryExpression"
+    // InternalFormalML.g:4420:1: entryRuleUnaryExpression : ruleUnaryExpression EOF ;
+    public final void entryRuleUnaryExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4421:1: ( ruleUnaryExpression EOF )
+            // InternalFormalML.g:4422:1: ruleUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnaryExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleUnaryExpression"
+
+
+    // $ANTLR start "ruleUnaryExpression"
+    // InternalFormalML.g:4429:1: ruleUnaryExpression : ( ( rule__UnaryExpression__Alternatives ) ) ;
+    public final void ruleUnaryExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4433:2: ( ( ( rule__UnaryExpression__Alternatives ) ) )
+            // InternalFormalML.g:4434:2: ( ( rule__UnaryExpression__Alternatives ) )
+            {
+            // InternalFormalML.g:4434:2: ( ( rule__UnaryExpression__Alternatives ) )
+            // InternalFormalML.g:4435:3: ( rule__UnaryExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnaryExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4436:3: ( rule__UnaryExpression__Alternatives )
+            // InternalFormalML.g:4436:4: rule__UnaryExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnaryExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnaryExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleUnaryExpression"
+
+
+    // $ANTLR start "entryRulePostfixUnaryExpression"
+    // InternalFormalML.g:4445:1: entryRulePostfixUnaryExpression : rulePostfixUnaryExpression EOF ;
+    public final void entryRulePostfixUnaryExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4446:1: ( rulePostfixUnaryExpression EOF )
+            // InternalFormalML.g:4447:1: rulePostfixUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPostfixUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePostfixUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPostfixUnaryExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePostfixUnaryExpression"
+
+
+    // $ANTLR start "rulePostfixUnaryExpression"
+    // InternalFormalML.g:4454:1: rulePostfixUnaryExpression : ( ruleIncrementOrDecrementPostfixExpression ) ;
+    public final void rulePostfixUnaryExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4458:2: ( ( ruleIncrementOrDecrementPostfixExpression ) )
+            // InternalFormalML.g:4459:2: ( ruleIncrementOrDecrementPostfixExpression )
+            {
+            // InternalFormalML.g:4459:2: ( ruleIncrementOrDecrementPostfixExpression )
+            // InternalFormalML.g:4460:3: ruleIncrementOrDecrementPostfixExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPostfixUnaryExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleIncrementOrDecrementPostfixExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPostfixUnaryExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePostfixUnaryExpression"
+
+
+    // $ANTLR start "entryRuleIncrementOrDecrementPostfixExpression"
+    // InternalFormalML.g:4470:1: entryRuleIncrementOrDecrementPostfixExpression : ruleIncrementOrDecrementPostfixExpression EOF ;
+    public final void entryRuleIncrementOrDecrementPostfixExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4471:1: ( ruleIncrementOrDecrementPostfixExpression EOF )
+            // InternalFormalML.g:4472:1: ruleIncrementOrDecrementPostfixExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPostfixExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleIncrementOrDecrementPostfixExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPostfixExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIncrementOrDecrementPostfixExpression"
+
+
+    // $ANTLR start "ruleIncrementOrDecrementPostfixExpression"
+    // InternalFormalML.g:4479:1: ruleIncrementOrDecrementPostfixExpression : ( ( rule__IncrementOrDecrementPostfixExpression__Group__0 ) ) ;
+    public final void ruleIncrementOrDecrementPostfixExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4483:2: ( ( ( rule__IncrementOrDecrementPostfixExpression__Group__0 ) ) )
+            // InternalFormalML.g:4484:2: ( ( rule__IncrementOrDecrementPostfixExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4484:2: ( ( rule__IncrementOrDecrementPostfixExpression__Group__0 ) )
+            // InternalFormalML.g:4485:3: ( rule__IncrementOrDecrementPostfixExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4486:3: ( rule__IncrementOrDecrementPostfixExpression__Group__0 )
+            // InternalFormalML.g:4486:4: rule__IncrementOrDecrementPostfixExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPostfixExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIncrementOrDecrementPostfixExpression"
+
+
+    // $ANTLR start "entryRulePrefixUnaryExpression"
+    // InternalFormalML.g:4495:1: entryRulePrefixUnaryExpression : rulePrefixUnaryExpression EOF ;
+    public final void entryRulePrefixUnaryExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4496:1: ( rulePrefixUnaryExpression EOF )
+            // InternalFormalML.g:4497:1: rulePrefixUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrefixUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrefixUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrefixUnaryExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrefixUnaryExpression"
+
+
+    // $ANTLR start "rulePrefixUnaryExpression"
+    // InternalFormalML.g:4504:1: rulePrefixUnaryExpression : ( ruleIncrementOrDecrementPrefixExpression ) ;
+    public final void rulePrefixUnaryExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4508:2: ( ( ruleIncrementOrDecrementPrefixExpression ) )
+            // InternalFormalML.g:4509:2: ( ruleIncrementOrDecrementPrefixExpression )
+            {
+            // InternalFormalML.g:4509:2: ( ruleIncrementOrDecrementPrefixExpression )
+            // InternalFormalML.g:4510:3: ruleIncrementOrDecrementPrefixExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrefixUnaryExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleIncrementOrDecrementPrefixExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrefixUnaryExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrefixUnaryExpression"
+
+
+    // $ANTLR start "entryRuleIncrementOrDecrementPrefixExpression"
+    // InternalFormalML.g:4520:1: entryRuleIncrementOrDecrementPrefixExpression : ruleIncrementOrDecrementPrefixExpression EOF ;
+    public final void entryRuleIncrementOrDecrementPrefixExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4521:1: ( ruleIncrementOrDecrementPrefixExpression EOF )
+            // InternalFormalML.g:4522:1: ruleIncrementOrDecrementPrefixExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPrefixExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleIncrementOrDecrementPrefixExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPrefixExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleIncrementOrDecrementPrefixExpression"
+
+
+    // $ANTLR start "ruleIncrementOrDecrementPrefixExpression"
+    // InternalFormalML.g:4529:1: ruleIncrementOrDecrementPrefixExpression : ( ( rule__IncrementOrDecrementPrefixExpression__Group__0 ) ) ;
+    public final void ruleIncrementOrDecrementPrefixExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4533:2: ( ( ( rule__IncrementOrDecrementPrefixExpression__Group__0 ) ) )
+            // InternalFormalML.g:4534:2: ( ( rule__IncrementOrDecrementPrefixExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4534:2: ( ( rule__IncrementOrDecrementPrefixExpression__Group__0 ) )
+            // InternalFormalML.g:4535:3: ( rule__IncrementOrDecrementPrefixExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4536:3: ( rule__IncrementOrDecrementPrefixExpression__Group__0 )
+            // InternalFormalML.g:4536:4: rule__IncrementOrDecrementPrefixExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPrefixExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleIncrementOrDecrementPrefixExpression"
+
+
+    // $ANTLR start "entryRuleAffixOperator"
+    // InternalFormalML.g:4545:1: entryRuleAffixOperator : ruleAffixOperator EOF ;
+    public final void entryRuleAffixOperator() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4546:1: ( ruleAffixOperator EOF )
+            // InternalFormalML.g:4547:1: ruleAffixOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAffixOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleAffixOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAffixOperatorRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleAffixOperator"
+
+
+    // $ANTLR start "ruleAffixOperator"
+    // InternalFormalML.g:4554:1: ruleAffixOperator : ( ( rule__AffixOperator__Alternatives ) ) ;
+    public final void ruleAffixOperator() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4558:2: ( ( ( rule__AffixOperator__Alternatives ) ) )
+            // InternalFormalML.g:4559:2: ( ( rule__AffixOperator__Alternatives ) )
+            {
+            // InternalFormalML.g:4559:2: ( ( rule__AffixOperator__Alternatives ) )
+            // InternalFormalML.g:4560:3: ( rule__AffixOperator__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAffixOperatorAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4561:3: ( rule__AffixOperator__Alternatives )
+            // InternalFormalML.g:4561:4: rule__AffixOperator__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AffixOperator__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAffixOperatorAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleAffixOperator"
+
+
+    // $ANTLR start "entryRuleNewfreshExpression"
+    // InternalFormalML.g:4570:1: entryRuleNewfreshExpression : ruleNewfreshExpression EOF ;
+    public final void entryRuleNewfreshExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4571:1: ( ruleNewfreshExpression EOF )
+            // InternalFormalML.g:4572:1: ruleNewfreshExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleNewfreshExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNewfreshExpression"
+
+
+    // $ANTLR start "ruleNewfreshExpression"
+    // InternalFormalML.g:4579:1: ruleNewfreshExpression : ( ( rule__NewfreshExpression__Alternatives ) ) ;
+    public final void ruleNewfreshExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4583:2: ( ( ( rule__NewfreshExpression__Alternatives ) ) )
+            // InternalFormalML.g:4584:2: ( ( rule__NewfreshExpression__Alternatives ) )
+            {
+            // InternalFormalML.g:4584:2: ( ( rule__NewfreshExpression__Alternatives ) )
+            // InternalFormalML.g:4585:3: ( rule__NewfreshExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4586:3: ( rule__NewfreshExpression__Alternatives )
+            // InternalFormalML.g:4586:4: rule__NewfreshExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NewfreshExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleNewfreshExpression"
+
+
+    // $ANTLR start "entryRuleCastExpression"
+    // InternalFormalML.g:4595:1: entryRuleCastExpression : ruleCastExpression EOF ;
+    public final void entryRuleCastExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4596:1: ( ruleCastExpression EOF )
+            // InternalFormalML.g:4597:1: ruleCastExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleCastExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleCastExpression"
+
+
+    // $ANTLR start "ruleCastExpression"
+    // InternalFormalML.g:4604:1: ruleCastExpression : ( ( rule__CastExpression__Group__0 ) ) ;
+    public final void ruleCastExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4608:2: ( ( ( rule__CastExpression__Group__0 ) ) )
+            // InternalFormalML.g:4609:2: ( ( rule__CastExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4609:2: ( ( rule__CastExpression__Group__0 ) )
+            // InternalFormalML.g:4610:3: ( rule__CastExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4611:3: ( rule__CastExpression__Group__0 )
+            // InternalFormalML.g:4611:4: rule__CastExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleCastExpression"
+
+
+    // $ANTLR start "entryRuleArithmeticUnaryExpression"
+    // InternalFormalML.g:4620:1: entryRuleArithmeticUnaryExpression : ruleArithmeticUnaryExpression EOF ;
+    public final void entryRuleArithmeticUnaryExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4621:1: ( ruleArithmeticUnaryExpression EOF )
+            // InternalFormalML.g:4622:1: ruleArithmeticUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArithmeticUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleArithmeticUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArithmeticUnaryExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleArithmeticUnaryExpression"
+
+
+    // $ANTLR start "ruleArithmeticUnaryExpression"
+    // InternalFormalML.g:4629:1: ruleArithmeticUnaryExpression : ( ( rule__ArithmeticUnaryExpression__Group__0 ) ) ;
+    public final void ruleArithmeticUnaryExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4633:2: ( ( ( rule__ArithmeticUnaryExpression__Group__0 ) ) )
+            // InternalFormalML.g:4634:2: ( ( rule__ArithmeticUnaryExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4634:2: ( ( rule__ArithmeticUnaryExpression__Group__0 ) )
+            // InternalFormalML.g:4635:3: ( rule__ArithmeticUnaryExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArithmeticUnaryExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4636:3: ( rule__ArithmeticUnaryExpression__Group__0 )
+            // InternalFormalML.g:4636:4: rule__ArithmeticUnaryExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ArithmeticUnaryExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArithmeticUnaryExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleArithmeticUnaryExpression"
+
+
+    // $ANTLR start "entryRuleArithmeticUnaryOperator"
+    // InternalFormalML.g:4645:1: entryRuleArithmeticUnaryOperator : ruleArithmeticUnaryOperator EOF ;
+    public final void entryRuleArithmeticUnaryOperator() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4646:1: ( ruleArithmeticUnaryOperator EOF )
+            // InternalFormalML.g:4647:1: ruleArithmeticUnaryOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArithmeticUnaryOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleArithmeticUnaryOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArithmeticUnaryOperatorRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleArithmeticUnaryOperator"
+
+
+    // $ANTLR start "ruleArithmeticUnaryOperator"
+    // InternalFormalML.g:4654:1: ruleArithmeticUnaryOperator : ( ( rule__ArithmeticUnaryOperator__Alternatives ) ) ;
+    public final void ruleArithmeticUnaryOperator() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4658:2: ( ( ( rule__ArithmeticUnaryOperator__Alternatives ) ) )
+            // InternalFormalML.g:4659:2: ( ( rule__ArithmeticUnaryOperator__Alternatives ) )
+            {
+            // InternalFormalML.g:4659:2: ( ( rule__ArithmeticUnaryOperator__Alternatives ) )
+            // InternalFormalML.g:4660:3: ( rule__ArithmeticUnaryOperator__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArithmeticUnaryOperatorAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4661:3: ( rule__ArithmeticUnaryOperator__Alternatives )
+            // InternalFormalML.g:4661:4: rule__ArithmeticUnaryOperator__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ArithmeticUnaryOperator__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArithmeticUnaryOperatorAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleArithmeticUnaryOperator"
+
+
+    // $ANTLR start "entryRuleLogicalUnaryExpression"
+    // InternalFormalML.g:4670:1: entryRuleLogicalUnaryExpression : ruleLogicalUnaryExpression EOF ;
+    public final void entryRuleLogicalUnaryExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4671:1: ( ruleLogicalUnaryExpression EOF )
+            // InternalFormalML.g:4672:1: ruleLogicalUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLogicalUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalUnaryExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLogicalUnaryExpression"
+
+
+    // $ANTLR start "ruleLogicalUnaryExpression"
+    // InternalFormalML.g:4679:1: ruleLogicalUnaryExpression : ( ( rule__LogicalUnaryExpression__Group__0 ) ) ;
+    public final void ruleLogicalUnaryExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4683:2: ( ( ( rule__LogicalUnaryExpression__Group__0 ) ) )
+            // InternalFormalML.g:4684:2: ( ( rule__LogicalUnaryExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4684:2: ( ( rule__LogicalUnaryExpression__Group__0 ) )
+            // InternalFormalML.g:4685:3: ( rule__LogicalUnaryExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalUnaryExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4686:3: ( rule__LogicalUnaryExpression__Group__0 )
+            // InternalFormalML.g:4686:4: rule__LogicalUnaryExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalUnaryExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalUnaryExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLogicalUnaryExpression"
+
+
+    // $ANTLR start "entryRuleBitwiseUnaryExpression"
+    // InternalFormalML.g:4695:1: entryRuleBitwiseUnaryExpression : ruleBitwiseUnaryExpression EOF ;
+    public final void entryRuleBitwiseUnaryExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4696:1: ( ruleBitwiseUnaryExpression EOF )
+            // InternalFormalML.g:4697:1: ruleBitwiseUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBitwiseUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseUnaryExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBitwiseUnaryExpression"
+
+
+    // $ANTLR start "ruleBitwiseUnaryExpression"
+    // InternalFormalML.g:4704:1: ruleBitwiseUnaryExpression : ( ( rule__BitwiseUnaryExpression__Group__0 ) ) ;
+    public final void ruleBitwiseUnaryExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4708:2: ( ( ( rule__BitwiseUnaryExpression__Group__0 ) ) )
+            // InternalFormalML.g:4709:2: ( ( rule__BitwiseUnaryExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4709:2: ( ( rule__BitwiseUnaryExpression__Group__0 ) )
+            // InternalFormalML.g:4710:3: ( rule__BitwiseUnaryExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseUnaryExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4711:3: ( rule__BitwiseUnaryExpression__Group__0 )
+            // InternalFormalML.g:4711:4: rule__BitwiseUnaryExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseUnaryExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseUnaryExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBitwiseUnaryExpression"
+
+
+    // $ANTLR start "entryRulePrimaryExpression"
+    // InternalFormalML.g:4720:1: entryRulePrimaryExpression : rulePrimaryExpression EOF ;
+    public final void entryRulePrimaryExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4721:1: ( rulePrimaryExpression EOF )
+            // InternalFormalML.g:4722:1: rulePrimaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePrimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePrimaryExpression"
+
+
+    // $ANTLR start "rulePrimaryExpression"
+    // InternalFormalML.g:4729:1: rulePrimaryExpression : ( ( rule__PrimaryExpression__Group__0 ) ) ;
+    public final void rulePrimaryExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4733:2: ( ( ( rule__PrimaryExpression__Group__0 ) ) )
+            // InternalFormalML.g:4734:2: ( ( rule__PrimaryExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4734:2: ( ( rule__PrimaryExpression__Group__0 ) )
+            // InternalFormalML.g:4735:3: ( rule__PrimaryExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4736:3: ( rule__PrimaryExpression__Group__0 )
+            // InternalFormalML.g:4736:4: rule__PrimaryExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimaryExpression"
+
+
+    // $ANTLR start "entryRuleBaseExpression"
+    // InternalFormalML.g:4745:1: entryRuleBaseExpression : ruleBaseExpression EOF ;
+    public final void entryRuleBaseExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4746:1: ( ruleBaseExpression EOF )
+            // InternalFormalML.g:4747:1: ruleBaseExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBaseExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleBaseExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBaseExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleBaseExpression"
+
+
+    // $ANTLR start "ruleBaseExpression"
+    // InternalFormalML.g:4754:1: ruleBaseExpression : ( ( rule__BaseExpression__Alternatives ) ) ;
+    public final void ruleBaseExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4758:2: ( ( ( rule__BaseExpression__Alternatives ) ) )
+            // InternalFormalML.g:4759:2: ( ( rule__BaseExpression__Alternatives ) )
+            {
+            // InternalFormalML.g:4759:2: ( ( rule__BaseExpression__Alternatives ) )
+            // InternalFormalML.g:4760:3: ( rule__BaseExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBaseExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4761:3: ( rule__BaseExpression__Alternatives )
+            // InternalFormalML.g:4761:4: rule__BaseExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BaseExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBaseExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBaseExpression"
+
+
+    // $ANTLR start "entryRuleInvokeExpressionDeprecated"
+    // InternalFormalML.g:4770:1: entryRuleInvokeExpressionDeprecated : ruleInvokeExpressionDeprecated EOF ;
+    public final void entryRuleInvokeExpressionDeprecated() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4771:1: ( ruleInvokeExpressionDeprecated EOF )
+            // InternalFormalML.g:4772:1: ruleInvokeExpressionDeprecated EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleInvokeExpressionDeprecated();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleInvokeExpressionDeprecated"
+
+
+    // $ANTLR start "ruleInvokeExpressionDeprecated"
+    // InternalFormalML.g:4779:1: ruleInvokeExpressionDeprecated : ( ( rule__InvokeExpressionDeprecated__Group__0 ) ) ;
+    public final void ruleInvokeExpressionDeprecated() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4783:2: ( ( ( rule__InvokeExpressionDeprecated__Group__0 ) ) )
+            // InternalFormalML.g:4784:2: ( ( rule__InvokeExpressionDeprecated__Group__0 ) )
+            {
+            // InternalFormalML.g:4784:2: ( ( rule__InvokeExpressionDeprecated__Group__0 ) )
+            // InternalFormalML.g:4785:3: ( rule__InvokeExpressionDeprecated__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4786:3: ( rule__InvokeExpressionDeprecated__Group__0 )
+            // InternalFormalML.g:4786:4: rule__InvokeExpressionDeprecated__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeExpressionDeprecated__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleInvokeExpressionDeprecated"
+
+
+    // $ANTLR start "entryRuleInstantiationExpression"
+    // InternalFormalML.g:4795:1: entryRuleInstantiationExpression : ruleInstantiationExpression EOF ;
+    public final void entryRuleInstantiationExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4796:1: ( ruleInstantiationExpression EOF )
+            // InternalFormalML.g:4797:1: ruleInstantiationExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstantiationExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleInstantiationExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstantiationExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleInstantiationExpression"
+
+
+    // $ANTLR start "ruleInstantiationExpression"
+    // InternalFormalML.g:4804:1: ruleInstantiationExpression : ( ( rule__InstantiationExpression__Group__0 ) ) ;
+    public final void ruleInstantiationExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4808:2: ( ( ( rule__InstantiationExpression__Group__0 ) ) )
+            // InternalFormalML.g:4809:2: ( ( rule__InstantiationExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4809:2: ( ( rule__InstantiationExpression__Group__0 ) )
+            // InternalFormalML.g:4810:3: ( rule__InstantiationExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstantiationExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4811:3: ( rule__InstantiationExpression__Group__0 )
+            // InternalFormalML.g:4811:4: rule__InstantiationExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstantiationExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstantiationExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleInstantiationExpression"
+
+
+    // $ANTLR start "entryRuleDynamicInstanceSpecification"
+    // InternalFormalML.g:4820:1: entryRuleDynamicInstanceSpecification : ruleDynamicInstanceSpecification EOF ;
+    public final void entryRuleDynamicInstanceSpecification() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4821:1: ( ruleDynamicInstanceSpecification EOF )
+            // InternalFormalML.g:4822:1: ruleDynamicInstanceSpecification EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleDynamicInstanceSpecification();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDynamicInstanceSpecification"
+
+
+    // $ANTLR start "ruleDynamicInstanceSpecification"
+    // InternalFormalML.g:4829:1: ruleDynamicInstanceSpecification : ( ( rule__DynamicInstanceSpecification__Group__0 ) ) ;
+    public final void ruleDynamicInstanceSpecification() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4833:2: ( ( ( rule__DynamicInstanceSpecification__Group__0 ) ) )
+            // InternalFormalML.g:4834:2: ( ( rule__DynamicInstanceSpecification__Group__0 ) )
+            {
+            // InternalFormalML.g:4834:2: ( ( rule__DynamicInstanceSpecification__Group__0 ) )
+            // InternalFormalML.g:4835:3: ( rule__DynamicInstanceSpecification__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4836:3: ( rule__DynamicInstanceSpecification__Group__0 )
+            // InternalFormalML.g:4836:4: rule__DynamicInstanceSpecification__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDynamicInstanceSpecification"
+
+
+    // $ANTLR start "entryRuleTupleParameterExpression"
+    // InternalFormalML.g:4845:1: entryRuleTupleParameterExpression : ruleTupleParameterExpression EOF ;
+    public final void entryRuleTupleParameterExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4846:1: ( ruleTupleParameterExpression EOF )
+            // InternalFormalML.g:4847:1: ruleTupleParameterExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTupleParameterExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleTupleParameterExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTupleParameterExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleTupleParameterExpression"
+
+
+    // $ANTLR start "ruleTupleParameterExpression"
+    // InternalFormalML.g:4854:1: ruleTupleParameterExpression : ( ( rule__TupleParameterExpression__Group__0 ) ) ;
+    public final void ruleTupleParameterExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4858:2: ( ( ( rule__TupleParameterExpression__Group__0 ) ) )
+            // InternalFormalML.g:4859:2: ( ( rule__TupleParameterExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4859:2: ( ( rule__TupleParameterExpression__Group__0 ) )
+            // InternalFormalML.g:4860:3: ( rule__TupleParameterExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTupleParameterExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4861:3: ( rule__TupleParameterExpression__Group__0 )
+            // InternalFormalML.g:4861:4: rule__TupleParameterExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TupleParameterExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTupleParameterExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTupleParameterExpression"
+
+
+    // $ANTLR start "entryRuleMixTupleExpressionList"
+    // InternalFormalML.g:4870:1: entryRuleMixTupleExpressionList : ruleMixTupleExpressionList EOF ;
+    public final void entryRuleMixTupleExpressionList() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4871:1: ( ruleMixTupleExpressionList EOF )
+            // InternalFormalML.g:4872:1: ruleMixTupleExpressionList EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMixTupleExpressionListRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMixTupleExpressionListRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleMixTupleExpressionList"
+
+
+    // $ANTLR start "ruleMixTupleExpressionList"
+    // InternalFormalML.g:4879:1: ruleMixTupleExpressionList : ( ( rule__MixTupleExpressionList__Group__0 ) ) ;
+    public final void ruleMixTupleExpressionList() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4883:2: ( ( ( rule__MixTupleExpressionList__Group__0 ) ) )
+            // InternalFormalML.g:4884:2: ( ( rule__MixTupleExpressionList__Group__0 ) )
+            {
+            // InternalFormalML.g:4884:2: ( ( rule__MixTupleExpressionList__Group__0 ) )
+            // InternalFormalML.g:4885:3: ( rule__MixTupleExpressionList__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMixTupleExpressionListAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4886:3: ( rule__MixTupleExpressionList__Group__0 )
+            // InternalFormalML.g:4886:4: rule__MixTupleExpressionList__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMixTupleExpressionListAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleMixTupleExpressionList"
+
+
+    // $ANTLR start "entryRulePositionalTupleExpressionList"
+    // InternalFormalML.g:4895:1: entryRulePositionalTupleExpressionList : rulePositionalTupleExpressionList EOF ;
+    public final void entryRulePositionalTupleExpressionList() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4896:1: ( rulePositionalTupleExpressionList EOF )
+            // InternalFormalML.g:4897:1: rulePositionalTupleExpressionList EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPositionalTupleExpressionListRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            rulePositionalTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPositionalTupleExpressionListRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePositionalTupleExpressionList"
+
+
+    // $ANTLR start "rulePositionalTupleExpressionList"
+    // InternalFormalML.g:4904:1: rulePositionalTupleExpressionList : ( ( rule__PositionalTupleExpressionList__Group__0 ) ) ;
+    public final void rulePositionalTupleExpressionList() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4908:2: ( ( ( rule__PositionalTupleExpressionList__Group__0 ) ) )
+            // InternalFormalML.g:4909:2: ( ( rule__PositionalTupleExpressionList__Group__0 ) )
+            {
+            // InternalFormalML.g:4909:2: ( ( rule__PositionalTupleExpressionList__Group__0 ) )
+            // InternalFormalML.g:4910:3: ( rule__PositionalTupleExpressionList__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPositionalTupleExpressionListAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4911:3: ( rule__PositionalTupleExpressionList__Group__0 )
+            // InternalFormalML.g:4911:4: rule__PositionalTupleExpressionList__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PositionalTupleExpressionList__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPositionalTupleExpressionListAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePositionalTupleExpressionList"
+
+
+    // $ANTLR start "entryRuleNamedExpression"
+    // InternalFormalML.g:4920:1: entryRuleNamedExpression : ruleNamedExpression EOF ;
+    public final void entryRuleNamedExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4921:1: ( ruleNamedExpression EOF )
+            // InternalFormalML.g:4922:1: ruleNamedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNamedExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleNamedExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNamedExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNamedExpression"
+
+
+    // $ANTLR start "ruleNamedExpression"
+    // InternalFormalML.g:4929:1: ruleNamedExpression : ( ( rule__NamedExpression__Group__0 ) ) ;
+    public final void ruleNamedExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4933:2: ( ( ( rule__NamedExpression__Group__0 ) ) )
+            // InternalFormalML.g:4934:2: ( ( rule__NamedExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:4934:2: ( ( rule__NamedExpression__Group__0 ) )
+            // InternalFormalML.g:4935:3: ( rule__NamedExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNamedExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:4936:3: ( rule__NamedExpression__Group__0 )
+            // InternalFormalML.g:4936:4: rule__NamedExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NamedExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNamedExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleNamedExpression"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceableExpression"
+    // InternalFormalML.g:4945:1: entryRuleLiteralReferenceableExpression : ruleLiteralReferenceableExpression EOF ;
+    public final void entryRuleLiteralReferenceableExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4946:1: ( ruleLiteralReferenceableExpression EOF )
+            // InternalFormalML.g:4947:1: ruleLiteralReferenceableExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceableExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralReferenceableExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceableExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceableExpression"
+
+
+    // $ANTLR start "ruleLiteralReferenceableExpression"
+    // InternalFormalML.g:4954:1: ruleLiteralReferenceableExpression : ( ( rule__LiteralReferenceableExpression__Alternatives ) ) ;
+    public final void ruleLiteralReferenceableExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4958:2: ( ( ( rule__LiteralReferenceableExpression__Alternatives ) ) )
+            // InternalFormalML.g:4959:2: ( ( rule__LiteralReferenceableExpression__Alternatives ) )
+            {
+            // InternalFormalML.g:4959:2: ( ( rule__LiteralReferenceableExpression__Alternatives ) )
+            // InternalFormalML.g:4960:3: ( rule__LiteralReferenceableExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceableExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4961:3: ( rule__LiteralReferenceableExpression__Alternatives )
+            // InternalFormalML.g:4961:4: rule__LiteralReferenceableExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceableExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceableExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralReferenceableExpression"
+
+
+    // $ANTLR start "entryRuleLiteralTerminalExpression"
+    // InternalFormalML.g:4970:1: entryRuleLiteralTerminalExpression : ruleLiteralTerminalExpression EOF ;
+    public final void entryRuleLiteralTerminalExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4971:1: ( ruleLiteralTerminalExpression EOF )
+            // InternalFormalML.g:4972:1: ruleLiteralTerminalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTerminalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralTerminalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTerminalExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralTerminalExpression"
+
+
+    // $ANTLR start "ruleLiteralTerminalExpression"
+    // InternalFormalML.g:4979:1: ruleLiteralTerminalExpression : ( ( rule__LiteralTerminalExpression__Alternatives ) ) ;
+    public final void ruleLiteralTerminalExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:4983:2: ( ( ( rule__LiteralTerminalExpression__Alternatives ) ) )
+            // InternalFormalML.g:4984:2: ( ( rule__LiteralTerminalExpression__Alternatives ) )
+            {
+            // InternalFormalML.g:4984:2: ( ( rule__LiteralTerminalExpression__Alternatives ) )
+            // InternalFormalML.g:4985:3: ( rule__LiteralTerminalExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTerminalExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:4986:3: ( rule__LiteralTerminalExpression__Alternatives )
+            // InternalFormalML.g:4986:4: rule__LiteralTerminalExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTerminalExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTerminalExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralTerminalExpression"
+
+
+    // $ANTLR start "entryRuleLiteralBooleanExpression"
+    // InternalFormalML.g:4995:1: entryRuleLiteralBooleanExpression : ruleLiteralBooleanExpression EOF ;
+    public final void entryRuleLiteralBooleanExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:4996:1: ( ruleLiteralBooleanExpression EOF )
+            // InternalFormalML.g:4997:1: ruleLiteralBooleanExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralBooleanExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralBooleanExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralBooleanExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralBooleanExpression"
+
+
+    // $ANTLR start "ruleLiteralBooleanExpression"
+    // InternalFormalML.g:5004:1: ruleLiteralBooleanExpression : ( ( rule__LiteralBooleanExpression__Group__0 ) ) ;
+    public final void ruleLiteralBooleanExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5008:2: ( ( ( rule__LiteralBooleanExpression__Group__0 ) ) )
+            // InternalFormalML.g:5009:2: ( ( rule__LiteralBooleanExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5009:2: ( ( rule__LiteralBooleanExpression__Group__0 ) )
+            // InternalFormalML.g:5010:3: ( rule__LiteralBooleanExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralBooleanExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5011:3: ( rule__LiteralBooleanExpression__Group__0 )
+            // InternalFormalML.g:5011:4: rule__LiteralBooleanExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralBooleanExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralBooleanExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralBooleanExpression"
+
+
+    // $ANTLR start "entryRuleLiteralIntegerExpression"
+    // InternalFormalML.g:5020:1: entryRuleLiteralIntegerExpression : ruleLiteralIntegerExpression EOF ;
+    public final void entryRuleLiteralIntegerExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5021:1: ( ruleLiteralIntegerExpression EOF )
+            // InternalFormalML.g:5022:1: ruleLiteralIntegerExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralIntegerExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralIntegerExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralIntegerExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralIntegerExpression"
+
+
+    // $ANTLR start "ruleLiteralIntegerExpression"
+    // InternalFormalML.g:5029:1: ruleLiteralIntegerExpression : ( ( rule__LiteralIntegerExpression__Group__0 ) ) ;
+    public final void ruleLiteralIntegerExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5033:2: ( ( ( rule__LiteralIntegerExpression__Group__0 ) ) )
+            // InternalFormalML.g:5034:2: ( ( rule__LiteralIntegerExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5034:2: ( ( rule__LiteralIntegerExpression__Group__0 ) )
+            // InternalFormalML.g:5035:3: ( rule__LiteralIntegerExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralIntegerExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5036:3: ( rule__LiteralIntegerExpression__Group__0 )
+            // InternalFormalML.g:5036:4: rule__LiteralIntegerExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralIntegerExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralIntegerExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralIntegerExpression"
+
+
+    // $ANTLR start "entryRuleLiteralRationalExpression"
+    // InternalFormalML.g:5045:1: entryRuleLiteralRationalExpression : ruleLiteralRationalExpression EOF ;
+    public final void entryRuleLiteralRationalExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5046:1: ( ruleLiteralRationalExpression EOF )
+            // InternalFormalML.g:5047:1: ruleLiteralRationalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralRationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralRationalExpression"
+
+
+    // $ANTLR start "ruleLiteralRationalExpression"
+    // InternalFormalML.g:5054:1: ruleLiteralRationalExpression : ( ( rule__LiteralRationalExpression__Group__0 ) ) ;
+    public final void ruleLiteralRationalExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5058:2: ( ( ( rule__LiteralRationalExpression__Group__0 ) ) )
+            // InternalFormalML.g:5059:2: ( ( rule__LiteralRationalExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5059:2: ( ( rule__LiteralRationalExpression__Group__0 ) )
+            // InternalFormalML.g:5060:3: ( rule__LiteralRationalExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5061:3: ( rule__LiteralRationalExpression__Group__0 )
+            // InternalFormalML.g:5061:4: rule__LiteralRationalExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralRationalExpression"
+
+
+    // $ANTLR start "entryRuleLiteralFloatExpression"
+    // InternalFormalML.g:5070:1: entryRuleLiteralFloatExpression : ruleLiteralFloatExpression EOF ;
+    public final void entryRuleLiteralFloatExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5071:1: ( ruleLiteralFloatExpression EOF )
+            // InternalFormalML.g:5072:1: ruleLiteralFloatExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralFloatExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralFloatExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralFloatExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralFloatExpression"
+
+
+    // $ANTLR start "ruleLiteralFloatExpression"
+    // InternalFormalML.g:5079:1: ruleLiteralFloatExpression : ( ( rule__LiteralFloatExpression__Group__0 ) ) ;
+    public final void ruleLiteralFloatExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5083:2: ( ( ( rule__LiteralFloatExpression__Group__0 ) ) )
+            // InternalFormalML.g:5084:2: ( ( rule__LiteralFloatExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5084:2: ( ( rule__LiteralFloatExpression__Group__0 ) )
+            // InternalFormalML.g:5085:3: ( rule__LiteralFloatExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralFloatExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5086:3: ( rule__LiteralFloatExpression__Group__0 )
+            // InternalFormalML.g:5086:4: rule__LiteralFloatExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralFloatExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralFloatExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralFloatExpression"
+
+
+    // $ANTLR start "entryRuleLiteralCharacterExpression"
+    // InternalFormalML.g:5095:1: entryRuleLiteralCharacterExpression : ruleLiteralCharacterExpression EOF ;
+    public final void entryRuleLiteralCharacterExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5096:1: ( ruleLiteralCharacterExpression EOF )
+            // InternalFormalML.g:5097:1: ruleLiteralCharacterExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCharacterExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralCharacterExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCharacterExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralCharacterExpression"
+
+
+    // $ANTLR start "ruleLiteralCharacterExpression"
+    // InternalFormalML.g:5104:1: ruleLiteralCharacterExpression : ( ( rule__LiteralCharacterExpression__Group__0 ) ) ;
+    public final void ruleLiteralCharacterExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5108:2: ( ( ( rule__LiteralCharacterExpression__Group__0 ) ) )
+            // InternalFormalML.g:5109:2: ( ( rule__LiteralCharacterExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5109:2: ( ( rule__LiteralCharacterExpression__Group__0 ) )
+            // InternalFormalML.g:5110:3: ( rule__LiteralCharacterExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCharacterExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5111:3: ( rule__LiteralCharacterExpression__Group__0 )
+            // InternalFormalML.g:5111:4: rule__LiteralCharacterExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCharacterExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCharacterExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralCharacterExpression"
+
+
+    // $ANTLR start "entryRuleLiteralStringExpression"
+    // InternalFormalML.g:5120:1: entryRuleLiteralStringExpression : ruleLiteralStringExpression EOF ;
+    public final void entryRuleLiteralStringExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5121:1: ( ruleLiteralStringExpression EOF )
+            // InternalFormalML.g:5122:1: ruleLiteralStringExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralStringExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralStringExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralStringExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralStringExpression"
+
+
+    // $ANTLR start "ruleLiteralStringExpression"
+    // InternalFormalML.g:5129:1: ruleLiteralStringExpression : ( ( rule__LiteralStringExpression__Group__0 ) ) ;
+    public final void ruleLiteralStringExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5133:2: ( ( ( rule__LiteralStringExpression__Group__0 ) ) )
+            // InternalFormalML.g:5134:2: ( ( rule__LiteralStringExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5134:2: ( ( rule__LiteralStringExpression__Group__0 ) )
+            // InternalFormalML.g:5135:3: ( rule__LiteralStringExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralStringExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5136:3: ( rule__LiteralStringExpression__Group__0 )
+            // InternalFormalML.g:5136:4: rule__LiteralStringExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralStringExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralStringExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralStringExpression"
+
+
+    // $ANTLR start "entryRuleLiteralNullExpression"
+    // InternalFormalML.g:5145:1: entryRuleLiteralNullExpression : ruleLiteralNullExpression EOF ;
+    public final void entryRuleLiteralNullExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5146:1: ( ruleLiteralNullExpression EOF )
+            // InternalFormalML.g:5147:1: ruleLiteralNullExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralNullExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralNullExpression"
+
+
+    // $ANTLR start "ruleLiteralNullExpression"
+    // InternalFormalML.g:5154:1: ruleLiteralNullExpression : ( ( rule__LiteralNullExpression__Alternatives ) ) ;
+    public final void ruleLiteralNullExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5158:2: ( ( ( rule__LiteralNullExpression__Alternatives ) ) )
+            // InternalFormalML.g:5159:2: ( ( rule__LiteralNullExpression__Alternatives ) )
+            {
+            // InternalFormalML.g:5159:2: ( ( rule__LiteralNullExpression__Alternatives ) )
+            // InternalFormalML.g:5160:3: ( rule__LiteralNullExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5161:3: ( rule__LiteralNullExpression__Alternatives )
+            // InternalFormalML.g:5161:4: rule__LiteralNullExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralNullExpression"
+
+
+    // $ANTLR start "entryRuleLiteralCollectionExpression"
+    // InternalFormalML.g:5170:1: entryRuleLiteralCollectionExpression : ruleLiteralCollectionExpression EOF ;
+    public final void entryRuleLiteralCollectionExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5171:1: ( ruleLiteralCollectionExpression EOF )
+            // InternalFormalML.g:5172:1: ruleLiteralCollectionExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralCollectionExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralCollectionExpression"
+
+
+    // $ANTLR start "ruleLiteralCollectionExpression"
+    // InternalFormalML.g:5179:1: ruleLiteralCollectionExpression : ( ( rule__LiteralCollectionExpression__Group__0 ) ) ;
+    public final void ruleLiteralCollectionExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5183:2: ( ( ( rule__LiteralCollectionExpression__Group__0 ) ) )
+            // InternalFormalML.g:5184:2: ( ( rule__LiteralCollectionExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5184:2: ( ( rule__LiteralCollectionExpression__Group__0 ) )
+            // InternalFormalML.g:5185:3: ( rule__LiteralCollectionExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5186:3: ( rule__LiteralCollectionExpression__Group__0 )
+            // InternalFormalML.g:5186:4: rule__LiteralCollectionExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralCollectionExpression"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceExpression"
+    // InternalFormalML.g:5195:1: entryRuleLiteralReferenceExpression : ruleLiteralReferenceExpression EOF ;
+    public final void entryRuleLiteralReferenceExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5196:1: ( ruleLiteralReferenceExpression EOF )
+            // InternalFormalML.g:5197:1: ruleLiteralReferenceExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralReferenceExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceExpression"
+
+
+    // $ANTLR start "ruleLiteralReferenceExpression"
+    // InternalFormalML.g:5204:1: ruleLiteralReferenceExpression : ( ( rule__LiteralReferenceExpression__Alternatives ) ) ;
+    public final void ruleLiteralReferenceExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5208:2: ( ( ( rule__LiteralReferenceExpression__Alternatives ) ) )
+            // InternalFormalML.g:5209:2: ( ( rule__LiteralReferenceExpression__Alternatives ) )
+            {
+            // InternalFormalML.g:5209:2: ( ( rule__LiteralReferenceExpression__Alternatives ) )
+            // InternalFormalML.g:5210:3: ( rule__LiteralReferenceExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5211:3: ( rule__LiteralReferenceExpression__Alternatives )
+            // InternalFormalML.g:5211:4: rule__LiteralReferenceExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralReferenceExpression"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceElement"
+    // InternalFormalML.g:5220:1: entryRuleLiteralReferenceElement : ruleLiteralReferenceElement EOF ;
+    public final void entryRuleLiteralReferenceElement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5221:1: ( ruleLiteralReferenceElement EOF )
+            // InternalFormalML.g:5222:1: ruleLiteralReferenceElement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralReferenceElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceElement"
+
+
+    // $ANTLR start "ruleLiteralReferenceElement"
+    // InternalFormalML.g:5229:1: ruleLiteralReferenceElement : ( ( rule__LiteralReferenceElement__Group__0 ) ) ;
+    public final void ruleLiteralReferenceElement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5233:2: ( ( ( rule__LiteralReferenceElement__Group__0 ) ) )
+            // InternalFormalML.g:5234:2: ( ( rule__LiteralReferenceElement__Group__0 ) )
+            {
+            // InternalFormalML.g:5234:2: ( ( rule__LiteralReferenceElement__Group__0 ) )
+            // InternalFormalML.g:5235:3: ( rule__LiteralReferenceElement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5236:3: ( rule__LiteralReferenceElement__Group__0 )
+            // InternalFormalML.g:5236:4: rule__LiteralReferenceElement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralReferenceElement"
+
+
+    // $ANTLR start "entryRuleLiteralPureReferenceElement"
+    // InternalFormalML.g:5245:1: entryRuleLiteralPureReferenceElement : ruleLiteralPureReferenceElement EOF ;
+    public final void entryRuleLiteralPureReferenceElement() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5246:1: ( ruleLiteralPureReferenceElement EOF )
+            // InternalFormalML.g:5247:1: ruleLiteralPureReferenceElement EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralPureReferenceElementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralPureReferenceElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralPureReferenceElementRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralPureReferenceElement"
+
+
+    // $ANTLR start "ruleLiteralPureReferenceElement"
+    // InternalFormalML.g:5254:1: ruleLiteralPureReferenceElement : ( ( rule__LiteralPureReferenceElement__Group__0 ) ) ;
+    public final void ruleLiteralPureReferenceElement() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5258:2: ( ( ( rule__LiteralPureReferenceElement__Group__0 ) ) )
+            // InternalFormalML.g:5259:2: ( ( rule__LiteralPureReferenceElement__Group__0 ) )
+            {
+            // InternalFormalML.g:5259:2: ( ( rule__LiteralPureReferenceElement__Group__0 ) )
+            // InternalFormalML.g:5260:3: ( rule__LiteralPureReferenceElement__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralPureReferenceElementAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5261:3: ( rule__LiteralPureReferenceElement__Group__0 )
+            // InternalFormalML.g:5261:4: rule__LiteralPureReferenceElement__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralPureReferenceElement__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralPureReferenceElementAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralPureReferenceElement"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceVariableContext"
+    // InternalFormalML.g:5270:1: entryRuleLiteralReferenceVariableContext : ruleLiteralReferenceVariableContext EOF ;
+    public final void entryRuleLiteralReferenceVariableContext() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5271:1: ( ruleLiteralReferenceVariableContext EOF )
+            // InternalFormalML.g:5272:1: ruleLiteralReferenceVariableContext EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceVariableContextRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralReferenceVariableContext();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceVariableContextRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceVariableContext"
+
+
+    // $ANTLR start "ruleLiteralReferenceVariableContext"
+    // InternalFormalML.g:5279:1: ruleLiteralReferenceVariableContext : ( ( rule__LiteralReferenceVariableContext__Alternatives ) ) ;
+    public final void ruleLiteralReferenceVariableContext() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5283:2: ( ( ( rule__LiteralReferenceVariableContext__Alternatives ) ) )
+            // InternalFormalML.g:5284:2: ( ( rule__LiteralReferenceVariableContext__Alternatives ) )
+            {
+            // InternalFormalML.g:5284:2: ( ( rule__LiteralReferenceVariableContext__Alternatives ) )
+            // InternalFormalML.g:5285:3: ( rule__LiteralReferenceVariableContext__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceVariableContextAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5286:3: ( rule__LiteralReferenceVariableContext__Alternatives )
+            // InternalFormalML.g:5286:4: rule__LiteralReferenceVariableContext__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceVariableContext__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceVariableContextAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralReferenceVariableContext"
+
+
+    // $ANTLR start "entryRuleLiteralTimeExpression"
+    // InternalFormalML.g:5295:1: entryRuleLiteralTimeExpression : ruleLiteralTimeExpression EOF ;
+    public final void entryRuleLiteralTimeExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5296:1: ( ruleLiteralTimeExpression EOF )
+            // InternalFormalML.g:5297:1: ruleLiteralTimeExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralTimeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralTimeExpression"
+
+
+    // $ANTLR start "ruleLiteralTimeExpression"
+    // InternalFormalML.g:5304:1: ruleLiteralTimeExpression : ( ( rule__LiteralTimeExpression__Group__0 ) ) ;
+    public final void ruleLiteralTimeExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5308:2: ( ( ( rule__LiteralTimeExpression__Group__0 ) ) )
+            // InternalFormalML.g:5309:2: ( ( rule__LiteralTimeExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5309:2: ( ( rule__LiteralTimeExpression__Group__0 ) )
+            // InternalFormalML.g:5310:3: ( rule__LiteralTimeExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5311:3: ( rule__LiteralTimeExpression__Group__0 )
+            // InternalFormalML.g:5311:4: rule__LiteralTimeExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralTimeExpression"
+
+
+    // $ANTLR start "entryRuleLiteralTimeDeltaExpression"
+    // InternalFormalML.g:5320:1: entryRuleLiteralTimeDeltaExpression : ruleLiteralTimeDeltaExpression EOF ;
+    public final void entryRuleLiteralTimeDeltaExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5321:1: ( ruleLiteralTimeDeltaExpression EOF )
+            // InternalFormalML.g:5322:1: ruleLiteralTimeDeltaExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralTimeDeltaExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralTimeDeltaExpression"
+
+
+    // $ANTLR start "ruleLiteralTimeDeltaExpression"
+    // InternalFormalML.g:5329:1: ruleLiteralTimeDeltaExpression : ( ( rule__LiteralTimeDeltaExpression__Group__0 ) ) ;
+    public final void ruleLiteralTimeDeltaExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5333:2: ( ( ( rule__LiteralTimeDeltaExpression__Group__0 ) ) )
+            // InternalFormalML.g:5334:2: ( ( rule__LiteralTimeDeltaExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5334:2: ( ( rule__LiteralTimeDeltaExpression__Group__0 ) )
+            // InternalFormalML.g:5335:3: ( rule__LiteralTimeDeltaExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5336:3: ( rule__LiteralTimeDeltaExpression__Group__0 )
+            // InternalFormalML.g:5336:4: rule__LiteralTimeDeltaExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeDeltaExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralTimeDeltaExpression"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceMachineContext"
+    // InternalFormalML.g:5345:1: entryRuleLiteralReferenceMachineContext : ruleLiteralReferenceMachineContext EOF ;
+    public final void entryRuleLiteralReferenceMachineContext() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5346:1: ( ruleLiteralReferenceMachineContext EOF )
+            // InternalFormalML.g:5347:1: ruleLiteralReferenceMachineContext EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceMachineContextRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralReferenceMachineContext();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceMachineContextRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceMachineContext"
+
+
+    // $ANTLR start "ruleLiteralReferenceMachineContext"
+    // InternalFormalML.g:5354:1: ruleLiteralReferenceMachineContext : ( ( rule__LiteralReferenceMachineContext__Alternatives ) ) ;
+    public final void ruleLiteralReferenceMachineContext() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5358:2: ( ( ( rule__LiteralReferenceMachineContext__Alternatives ) ) )
+            // InternalFormalML.g:5359:2: ( ( rule__LiteralReferenceMachineContext__Alternatives ) )
+            {
+            // InternalFormalML.g:5359:2: ( ( rule__LiteralReferenceMachineContext__Alternatives ) )
+            // InternalFormalML.g:5360:3: ( rule__LiteralReferenceMachineContext__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceMachineContextAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5361:3: ( rule__LiteralReferenceMachineContext__Alternatives )
+            // InternalFormalML.g:5361:4: rule__LiteralReferenceMachineContext__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceMachineContext__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceMachineContextAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralReferenceMachineContext"
+
+
+    // $ANTLR start "entryRuleLiteralThisExpression"
+    // InternalFormalML.g:5370:1: entryRuleLiteralThisExpression : ruleLiteralThisExpression EOF ;
+    public final void entryRuleLiteralThisExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5371:1: ( ruleLiteralThisExpression EOF )
+            // InternalFormalML.g:5372:1: ruleLiteralThisExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralThisExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralThisExpression"
+
+
+    // $ANTLR start "ruleLiteralThisExpression"
+    // InternalFormalML.g:5379:1: ruleLiteralThisExpression : ( ( rule__LiteralThisExpression__Group__0 ) ) ;
+    public final void ruleLiteralThisExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5383:2: ( ( ( rule__LiteralThisExpression__Group__0 ) ) )
+            // InternalFormalML.g:5384:2: ( ( rule__LiteralThisExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5384:2: ( ( rule__LiteralThisExpression__Group__0 ) )
+            // InternalFormalML.g:5385:3: ( rule__LiteralThisExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5386:3: ( rule__LiteralThisExpression__Group__0 )
+            // InternalFormalML.g:5386:4: rule__LiteralThisExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralThisExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralThisExpression"
+
+
+    // $ANTLR start "entryRuleLiteralSelfExpression"
+    // InternalFormalML.g:5395:1: entryRuleLiteralSelfExpression : ruleLiteralSelfExpression EOF ;
+    public final void entryRuleLiteralSelfExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5396:1: ( ruleLiteralSelfExpression EOF )
+            // InternalFormalML.g:5397:1: ruleLiteralSelfExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralSelfExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralSelfExpression"
+
+
+    // $ANTLR start "ruleLiteralSelfExpression"
+    // InternalFormalML.g:5404:1: ruleLiteralSelfExpression : ( ( rule__LiteralSelfExpression__Group__0 ) ) ;
+    public final void ruleLiteralSelfExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5408:2: ( ( ( rule__LiteralSelfExpression__Group__0 ) ) )
+            // InternalFormalML.g:5409:2: ( ( rule__LiteralSelfExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5409:2: ( ( rule__LiteralSelfExpression__Group__0 ) )
+            // InternalFormalML.g:5410:3: ( rule__LiteralSelfExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5411:3: ( rule__LiteralSelfExpression__Group__0 )
+            // InternalFormalML.g:5411:4: rule__LiteralSelfExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSelfExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralSelfExpression"
+
+
+    // $ANTLR start "entryRuleLiteralParentExpression"
+    // InternalFormalML.g:5420:1: entryRuleLiteralParentExpression : ruleLiteralParentExpression EOF ;
+    public final void entryRuleLiteralParentExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5421:1: ( ruleLiteralParentExpression EOF )
+            // InternalFormalML.g:5422:1: ruleLiteralParentExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralParentExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralParentExpression"
+
+
+    // $ANTLR start "ruleLiteralParentExpression"
+    // InternalFormalML.g:5429:1: ruleLiteralParentExpression : ( ( rule__LiteralParentExpression__Group__0 ) ) ;
+    public final void ruleLiteralParentExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5433:2: ( ( ( rule__LiteralParentExpression__Group__0 ) ) )
+            // InternalFormalML.g:5434:2: ( ( rule__LiteralParentExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5434:2: ( ( rule__LiteralParentExpression__Group__0 ) )
+            // InternalFormalML.g:5435:3: ( rule__LiteralParentExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5436:3: ( rule__LiteralParentExpression__Group__0 )
+            // InternalFormalML.g:5436:4: rule__LiteralParentExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralParentExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralParentExpression"
+
+
+    // $ANTLR start "entryRuleLiteralSuperExpression"
+    // InternalFormalML.g:5445:1: entryRuleLiteralSuperExpression : ruleLiteralSuperExpression EOF ;
+    public final void entryRuleLiteralSuperExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5446:1: ( ruleLiteralSuperExpression EOF )
+            // InternalFormalML.g:5447:1: ruleLiteralSuperExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralSuperExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralSuperExpression"
+
+
+    // $ANTLR start "ruleLiteralSuperExpression"
+    // InternalFormalML.g:5454:1: ruleLiteralSuperExpression : ( ( rule__LiteralSuperExpression__Group__0 ) ) ;
+    public final void ruleLiteralSuperExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5458:2: ( ( ( rule__LiteralSuperExpression__Group__0 ) ) )
+            // InternalFormalML.g:5459:2: ( ( rule__LiteralSuperExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5459:2: ( ( rule__LiteralSuperExpression__Group__0 ) )
+            // InternalFormalML.g:5460:3: ( rule__LiteralSuperExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5461:3: ( rule__LiteralSuperExpression__Group__0 )
+            // InternalFormalML.g:5461:4: rule__LiteralSuperExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSuperExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralSuperExpression"
+
+
+    // $ANTLR start "entryRuleLiteralSystemExpression"
+    // InternalFormalML.g:5470:1: entryRuleLiteralSystemExpression : ruleLiteralSystemExpression EOF ;
+    public final void entryRuleLiteralSystemExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5471:1: ( ruleLiteralSystemExpression EOF )
+            // InternalFormalML.g:5472:1: ruleLiteralSystemExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralSystemExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralSystemExpression"
+
+
+    // $ANTLR start "ruleLiteralSystemExpression"
+    // InternalFormalML.g:5479:1: ruleLiteralSystemExpression : ( ( rule__LiteralSystemExpression__Group__0 ) ) ;
+    public final void ruleLiteralSystemExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5483:2: ( ( ( rule__LiteralSystemExpression__Group__0 ) ) )
+            // InternalFormalML.g:5484:2: ( ( rule__LiteralSystemExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5484:2: ( ( rule__LiteralSystemExpression__Group__0 ) )
+            // InternalFormalML.g:5485:3: ( rule__LiteralSystemExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5486:3: ( rule__LiteralSystemExpression__Group__0 )
+            // InternalFormalML.g:5486:4: rule__LiteralSystemExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSystemExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralSystemExpression"
+
+
+    // $ANTLR start "entryRuleLiteralEnvExpression"
+    // InternalFormalML.g:5495:1: entryRuleLiteralEnvExpression : ruleLiteralEnvExpression EOF ;
+    public final void entryRuleLiteralEnvExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5496:1: ( ruleLiteralEnvExpression EOF )
+            // InternalFormalML.g:5497:1: ruleLiteralEnvExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralEnvExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralEnvExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralEnvExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralEnvExpression"
+
+
+    // $ANTLR start "ruleLiteralEnvExpression"
+    // InternalFormalML.g:5504:1: ruleLiteralEnvExpression : ( ( rule__LiteralEnvExpression__Group__0 ) ) ;
+    public final void ruleLiteralEnvExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5508:2: ( ( ( rule__LiteralEnvExpression__Group__0 ) ) )
+            // InternalFormalML.g:5509:2: ( ( rule__LiteralEnvExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5509:2: ( ( rule__LiteralEnvExpression__Group__0 ) )
+            // InternalFormalML.g:5510:3: ( rule__LiteralEnvExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralEnvExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5511:3: ( rule__LiteralEnvExpression__Group__0 )
+            // InternalFormalML.g:5511:4: rule__LiteralEnvExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralEnvExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralEnvExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralEnvExpression"
+
+
+    // $ANTLR start "entryRuleLiteralPureReferenceExpression"
+    // InternalFormalML.g:5520:1: entryRuleLiteralPureReferenceExpression : ruleLiteralPureReferenceExpression EOF ;
+    public final void entryRuleLiteralPureReferenceExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5521:1: ( ruleLiteralPureReferenceExpression EOF )
+            // InternalFormalML.g:5522:1: ruleLiteralPureReferenceExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralPureReferenceExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleLiteralPureReferenceExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralPureReferenceExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLiteralPureReferenceExpression"
+
+
+    // $ANTLR start "ruleLiteralPureReferenceExpression"
+    // InternalFormalML.g:5529:1: ruleLiteralPureReferenceExpression : ( ( rule__LiteralPureReferenceExpression__Alternatives ) ) ;
+    public final void ruleLiteralPureReferenceExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5533:2: ( ( ( rule__LiteralPureReferenceExpression__Alternatives ) ) )
+            // InternalFormalML.g:5534:2: ( ( rule__LiteralPureReferenceExpression__Alternatives ) )
+            {
+            // InternalFormalML.g:5534:2: ( ( rule__LiteralPureReferenceExpression__Alternatives ) )
+            // InternalFormalML.g:5535:3: ( rule__LiteralPureReferenceExpression__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralPureReferenceExpressionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5536:3: ( rule__LiteralPureReferenceExpression__Alternatives )
+            // InternalFormalML.g:5536:4: rule__LiteralPureReferenceExpression__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralPureReferenceExpression__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralPureReferenceExpressionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLiteralPureReferenceExpression"
+
+
+    // $ANTLR start "entryRuleValueSelectionExpression"
+    // InternalFormalML.g:5545:1: entryRuleValueSelectionExpression : ruleValueSelectionExpression EOF ;
+    public final void entryRuleValueSelectionExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5546:1: ( ruleValueSelectionExpression EOF )
+            // InternalFormalML.g:5547:1: ruleValueSelectionExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleValueSelectionExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleValueSelectionExpression"
+
+
+    // $ANTLR start "ruleValueSelectionExpression"
+    // InternalFormalML.g:5554:1: ruleValueSelectionExpression : ( ( rule__ValueSelectionExpression__Group__0 ) ) ;
+    public final void ruleValueSelectionExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5558:2: ( ( ( rule__ValueSelectionExpression__Group__0 ) ) )
+            // InternalFormalML.g:5559:2: ( ( rule__ValueSelectionExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5559:2: ( ( rule__ValueSelectionExpression__Group__0 ) )
+            // InternalFormalML.g:5560:3: ( rule__ValueSelectionExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5561:3: ( rule__ValueSelectionExpression__Group__0 )
+            // InternalFormalML.g:5561:4: rule__ValueSelectionExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleValueSelectionExpression"
+
+
+    // $ANTLR start "entryRuleValuePureNamedMachineExpression"
+    // InternalFormalML.g:5570:1: entryRuleValuePureNamedMachineExpression : ruleValuePureNamedMachineExpression EOF ;
+    public final void entryRuleValuePureNamedMachineExpression() throws RecognitionException {
+        try {
+            // InternalFormalML.g:5571:1: ( ruleValuePureNamedMachineExpression EOF )
+            // InternalFormalML.g:5572:1: ruleValuePureNamedMachineExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            ruleValuePureNamedMachineExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionRule()); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleValuePureNamedMachineExpression"
+
+
+    // $ANTLR start "ruleValuePureNamedMachineExpression"
+    // InternalFormalML.g:5579:1: ruleValuePureNamedMachineExpression : ( ( rule__ValuePureNamedMachineExpression__Group__0 ) ) ;
+    public final void ruleValuePureNamedMachineExpression() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5583:2: ( ( ( rule__ValuePureNamedMachineExpression__Group__0 ) ) )
+            // InternalFormalML.g:5584:2: ( ( rule__ValuePureNamedMachineExpression__Group__0 ) )
+            {
+            // InternalFormalML.g:5584:2: ( ( rule__ValuePureNamedMachineExpression__Group__0 ) )
+            // InternalFormalML.g:5585:3: ( rule__ValuePureNamedMachineExpression__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup()); 
+            }
+            // InternalFormalML.g:5586:3: ( rule__ValuePureNamedMachineExpression__Group__0 )
+            // InternalFormalML.g:5586:4: rule__ValuePureNamedMachineExpression__Group__0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleValuePureNamedMachineExpression"
+
+
+    // $ANTLR start "ruleVisibilityKind"
+    // InternalFormalML.g:5595:1: ruleVisibilityKind : ( ( rule__VisibilityKind__Alternatives ) ) ;
+    public final void ruleVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5599:1: ( ( ( rule__VisibilityKind__Alternatives ) ) )
+            // InternalFormalML.g:5600:2: ( ( rule__VisibilityKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5600:2: ( ( rule__VisibilityKind__Alternatives ) )
+            // InternalFormalML.g:5601:3: ( rule__VisibilityKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVisibilityKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5602:3: ( rule__VisibilityKind__Alternatives )
+            // InternalFormalML.g:5602:4: rule__VisibilityKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VisibilityKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVisibilityKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleVisibilityKind"
+
+
+    // $ANTLR start "ruleDesignKind"
+    // InternalFormalML.g:5611:1: ruleDesignKind : ( ( rule__DesignKind__Alternatives ) ) ;
+    public final void ruleDesignKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5615:1: ( ( ( rule__DesignKind__Alternatives ) ) )
+            // InternalFormalML.g:5616:2: ( ( rule__DesignKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5616:2: ( ( rule__DesignKind__Alternatives ) )
+            // InternalFormalML.g:5617:3: ( rule__DesignKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDesignKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5618:3: ( rule__DesignKind__Alternatives )
+            // InternalFormalML.g:5618:4: rule__DesignKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DesignKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDesignKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDesignKind"
+
+
+    // $ANTLR start "rulePseudostateKind"
+    // InternalFormalML.g:5627:1: rulePseudostateKind : ( ( rule__PseudostateKind__Alternatives ) ) ;
+    public final void rulePseudostateKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5631:1: ( ( ( rule__PseudostateKind__Alternatives ) ) )
+            // InternalFormalML.g:5632:2: ( ( rule__PseudostateKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5632:2: ( ( rule__PseudostateKind__Alternatives ) )
+            // InternalFormalML.g:5633:3: ( rule__PseudostateKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5634:3: ( rule__PseudostateKind__Alternatives )
+            // InternalFormalML.g:5634:4: rule__PseudostateKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePseudostateKind"
+
+
+    // $ANTLR start "rulePseudostateInitialKind"
+    // InternalFormalML.g:5643:1: rulePseudostateInitialKind : ( ( 'initial' ) ) ;
+    public final void rulePseudostateInitialKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5647:1: ( ( ( 'initial' ) ) )
+            // InternalFormalML.g:5648:2: ( ( 'initial' ) )
+            {
+            // InternalFormalML.g:5648:2: ( ( 'initial' ) )
+            // InternalFormalML.g:5649:3: ( 'initial' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5650:3: ( 'initial' )
+            // InternalFormalML.g:5650:4: 'initial'
+            {
+            match(input,13,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePseudostateInitialKind"
+
+
+    // $ANTLR start "ruleEndingPseudostateKind"
+    // InternalFormalML.g:5659:1: ruleEndingPseudostateKind : ( ( rule__EndingPseudostateKind__Alternatives ) ) ;
+    public final void ruleEndingPseudostateKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5663:1: ( ( ( rule__EndingPseudostateKind__Alternatives ) ) )
+            // InternalFormalML.g:5664:2: ( ( rule__EndingPseudostateKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5664:2: ( ( rule__EndingPseudostateKind__Alternatives ) )
+            // InternalFormalML.g:5665:3: ( rule__EndingPseudostateKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5666:3: ( rule__EndingPseudostateKind__Alternatives )
+            // InternalFormalML.g:5666:4: rule__EndingPseudostateKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostateKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEndingPseudostateKind"
+
+
+    // $ANTLR start "ruleComProtocolKind"
+    // InternalFormalML.g:5675:1: ruleComProtocolKind : ( ( rule__ComProtocolKind__Alternatives ) ) ;
+    public final void ruleComProtocolKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5679:1: ( ( ( rule__ComProtocolKind__Alternatives ) ) )
+            // InternalFormalML.g:5680:2: ( ( rule__ComProtocolKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5680:2: ( ( rule__ComProtocolKind__Alternatives ) )
+            // InternalFormalML.g:5681:3: ( rule__ComProtocolKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5682:3: ( rule__ComProtocolKind__Alternatives )
+            // InternalFormalML.g:5682:4: rule__ComProtocolKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocolKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleComProtocolKind"
+
+
+    // $ANTLR start "ruleComEnvRdvProtocolKind"
+    // InternalFormalML.g:5691:1: ruleComEnvRdvProtocolKind : ( ( rule__ComEnvRdvProtocolKind__Alternatives ) ) ;
+    public final void ruleComEnvRdvProtocolKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5695:1: ( ( ( rule__ComEnvRdvProtocolKind__Alternatives ) ) )
+            // InternalFormalML.g:5696:2: ( ( rule__ComEnvRdvProtocolKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5696:2: ( ( rule__ComEnvRdvProtocolKind__Alternatives ) )
+            // InternalFormalML.g:5697:3: ( rule__ComEnvRdvProtocolKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComEnvRdvProtocolKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5698:3: ( rule__ComEnvRdvProtocolKind__Alternatives )
+            // InternalFormalML.g:5698:4: rule__ComEnvRdvProtocolKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComEnvRdvProtocolKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComEnvRdvProtocolKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleComEnvRdvProtocolKind"
+
+
+    // $ANTLR start "ruleComMultiRdvProtocolKind"
+    // InternalFormalML.g:5707:1: ruleComMultiRdvProtocolKind : ( ( 'multi_rdv' ) ) ;
+    public final void ruleComMultiRdvProtocolKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5711:1: ( ( ( 'multi_rdv' ) ) )
+            // InternalFormalML.g:5712:2: ( ( 'multi_rdv' ) )
+            {
+            // InternalFormalML.g:5712:2: ( ( 'multi_rdv' ) )
+            // InternalFormalML.g:5713:3: ( 'multi_rdv' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5714:3: ( 'multi_rdv' )
+            // InternalFormalML.g:5714:4: 'multi_rdv'
+            {
+            match(input,14,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleComMultiRdvProtocolKind"
+
+
+    // $ANTLR start "ruleBufferProtocolKind"
+    // InternalFormalML.g:5723:1: ruleBufferProtocolKind : ( ( 'buffer' ) ) ;
+    public final void ruleBufferProtocolKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5727:1: ( ( ( 'buffer' ) ) )
+            // InternalFormalML.g:5728:2: ( ( 'buffer' ) )
+            {
+            // InternalFormalML.g:5728:2: ( ( 'buffer' ) )
+            // InternalFormalML.g:5729:3: ( 'buffer' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5730:3: ( 'buffer' )
+            // InternalFormalML.g:5730:4: 'buffer'
+            {
+            match(input,15,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBufferProtocolKind"
+
+
+    // $ANTLR start "ruleComCastKing"
+    // InternalFormalML.g:5739:1: ruleComCastKing : ( ( rule__ComCastKing__Alternatives ) ) ;
+    public final void ruleComCastKing() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5743:1: ( ( ( rule__ComCastKing__Alternatives ) ) )
+            // InternalFormalML.g:5744:2: ( ( rule__ComCastKing__Alternatives ) )
+            {
+            // InternalFormalML.g:5744:2: ( ( rule__ComCastKing__Alternatives ) )
+            // InternalFormalML.g:5745:3: ( rule__ComCastKing__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComCastKingAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5746:3: ( rule__ComCastKing__Alternatives )
+            // InternalFormalML.g:5746:4: rule__ComCastKing__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComCastKing__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComCastKingAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleComCastKing"
+
+
+    // $ANTLR start "rulePrimitiveNumberSign"
+    // InternalFormalML.g:5755:1: rulePrimitiveNumberSign : ( ( rule__PrimitiveNumberSign__Alternatives ) ) ;
+    public final void rulePrimitiveNumberSign() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5759:1: ( ( ( rule__PrimitiveNumberSign__Alternatives ) ) )
+            // InternalFormalML.g:5760:2: ( ( rule__PrimitiveNumberSign__Alternatives ) )
+            {
+            // InternalFormalML.g:5760:2: ( ( rule__PrimitiveNumberSign__Alternatives ) )
+            // InternalFormalML.g:5761:3: ( rule__PrimitiveNumberSign__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveNumberSignAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5762:3: ( rule__PrimitiveNumberSign__Alternatives )
+            // InternalFormalML.g:5762:4: rule__PrimitiveNumberSign__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveNumberSign__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveNumberSignAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveNumberSign"
+
+
+    // $ANTLR start "rulePrimitiveInstanceKind"
+    // InternalFormalML.g:5771:1: rulePrimitiveInstanceKind : ( ( rule__PrimitiveInstanceKind__Alternatives ) ) ;
+    public final void rulePrimitiveInstanceKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5775:1: ( ( ( rule__PrimitiveInstanceKind__Alternatives ) ) )
+            // InternalFormalML.g:5776:2: ( ( rule__PrimitiveInstanceKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5776:2: ( ( rule__PrimitiveInstanceKind__Alternatives ) )
+            // InternalFormalML.g:5777:3: ( rule__PrimitiveInstanceKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5778:3: ( rule__PrimitiveInstanceKind__Alternatives )
+            // InternalFormalML.g:5778:4: rule__PrimitiveInstanceKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrimitiveInstanceKind"
+
+
+    // $ANTLR start "ruleCollectionKind"
+    // InternalFormalML.g:5787:1: ruleCollectionKind : ( ( rule__CollectionKind__Alternatives ) ) ;
+    public final void ruleCollectionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5791:1: ( ( ( rule__CollectionKind__Alternatives ) ) )
+            // InternalFormalML.g:5792:2: ( ( rule__CollectionKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5792:2: ( ( rule__CollectionKind__Alternatives ) )
+            // InternalFormalML.g:5793:3: ( rule__CollectionKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5794:3: ( rule__CollectionKind__Alternatives )
+            // InternalFormalML.g:5794:4: rule__CollectionKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleCollectionKind"
+
+
+    // $ANTLR start "rulePublicVariableVisibilityKind"
+    // InternalFormalML.g:5803:1: rulePublicVariableVisibilityKind : ( ( 'var' ) ) ;
+    public final void rulePublicVariableVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5807:1: ( ( ( 'var' ) ) )
+            // InternalFormalML.g:5808:2: ( ( 'var' ) )
+            {
+            // InternalFormalML.g:5808:2: ( ( 'var' ) )
+            // InternalFormalML.g:5809:3: ( 'var' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPublicVariableVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5810:3: ( 'var' )
+            // InternalFormalML.g:5810:4: 'var'
+            {
+            match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPublicVariableVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePublicVariableVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedVariableVisibilityKind"
+    // InternalFormalML.g:5819:1: ruleProtectedVariableVisibilityKind : ( ( 'var' ) ) ;
+    public final void ruleProtectedVariableVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5823:1: ( ( ( 'var' ) ) )
+            // InternalFormalML.g:5824:2: ( ( 'var' ) )
+            {
+            // InternalFormalML.g:5824:2: ( ( 'var' ) )
+            // InternalFormalML.g:5825:3: ( 'var' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProtectedVariableVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5826:3: ( 'var' )
+            // InternalFormalML.g:5826:4: 'var'
+            {
+            match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProtectedVariableVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProtectedVariableVisibilityKind"
+
+
+    // $ANTLR start "rulePrivateVariableVisibilityKind"
+    // InternalFormalML.g:5835:1: rulePrivateVariableVisibilityKind : ( ( 'var' ) ) ;
+    public final void rulePrivateVariableVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5839:1: ( ( ( 'var' ) ) )
+            // InternalFormalML.g:5840:2: ( ( 'var' ) )
+            {
+            // InternalFormalML.g:5840:2: ( ( 'var' ) )
+            // InternalFormalML.g:5841:3: ( 'var' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrivateVariableVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5842:3: ( 'var' )
+            // InternalFormalML.g:5842:4: 'var'
+            {
+            match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrivateVariableVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrivateVariableVisibilityKind"
+
+
+    // $ANTLR start "ruleParameterDirectionKind"
+    // InternalFormalML.g:5851:1: ruleParameterDirectionKind : ( ( rule__ParameterDirectionKind__Alternatives ) ) ;
+    public final void ruleParameterDirectionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5855:1: ( ( ( rule__ParameterDirectionKind__Alternatives ) ) )
+            // InternalFormalML.g:5856:2: ( ( rule__ParameterDirectionKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5856:2: ( ( rule__ParameterDirectionKind__Alternatives ) )
+            // InternalFormalML.g:5857:3: ( rule__ParameterDirectionKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterDirectionKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5858:3: ( rule__ParameterDirectionKind__Alternatives )
+            // InternalFormalML.g:5858:4: rule__ParameterDirectionKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterDirectionKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterDirectionKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleParameterDirectionKind"
+
+
+    // $ANTLR start "ruleBlockParameterDirectionKind"
+    // InternalFormalML.g:5867:1: ruleBlockParameterDirectionKind : ( ( rule__BlockParameterDirectionKind__Alternatives ) ) ;
+    public final void ruleBlockParameterDirectionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5871:1: ( ( ( rule__BlockParameterDirectionKind__Alternatives ) ) )
+            // InternalFormalML.g:5872:2: ( ( rule__BlockParameterDirectionKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5872:2: ( ( rule__BlockParameterDirectionKind__Alternatives ) )
+            // InternalFormalML.g:5873:3: ( rule__BlockParameterDirectionKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockParameterDirectionKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5874:3: ( rule__BlockParameterDirectionKind__Alternatives )
+            // InternalFormalML.g:5874:4: rule__BlockParameterDirectionKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BlockParameterDirectionKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockParameterDirectionKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBlockParameterDirectionKind"
+
+
+    // $ANTLR start "ruleParameterInputDirectionKind"
+    // InternalFormalML.g:5883:1: ruleParameterInputDirectionKind : ( ( 'var' ) ) ;
+    public final void ruleParameterInputDirectionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5887:1: ( ( ( 'var' ) ) )
+            // InternalFormalML.g:5888:2: ( ( 'var' ) )
+            {
+            // InternalFormalML.g:5888:2: ( ( 'var' ) )
+            // InternalFormalML.g:5889:3: ( 'var' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputDirectionKindAccess().getInEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5890:3: ( 'var' )
+            // InternalFormalML.g:5890:4: 'var'
+            {
+            match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputDirectionKindAccess().getInEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleParameterInputDirectionKind"
+
+
+    // $ANTLR start "ruleParameterInoutDirectionKind"
+    // InternalFormalML.g:5899:1: ruleParameterInoutDirectionKind : ( ( 'var' ) ) ;
+    public final void ruleParameterInoutDirectionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5903:1: ( ( ( 'var' ) ) )
+            // InternalFormalML.g:5904:2: ( ( 'var' ) )
+            {
+            // InternalFormalML.g:5904:2: ( ( 'var' ) )
+            // InternalFormalML.g:5905:3: ( 'var' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutDirectionKindAccess().getInoutEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5906:3: ( 'var' )
+            // InternalFormalML.g:5906:4: 'var'
+            {
+            match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutDirectionKindAccess().getInoutEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleParameterInoutDirectionKind"
+
+
+    // $ANTLR start "ruleParameterOutputDirectionKind"
+    // InternalFormalML.g:5915:1: ruleParameterOutputDirectionKind : ( ( 'var' ) ) ;
+    public final void ruleParameterOutputDirectionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5919:1: ( ( ( 'var' ) ) )
+            // InternalFormalML.g:5920:2: ( ( 'var' ) )
+            {
+            // InternalFormalML.g:5920:2: ( ( 'var' ) )
+            // InternalFormalML.g:5921:3: ( 'var' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputDirectionKindAccess().getOutEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5922:3: ( 'var' )
+            // InternalFormalML.g:5922:4: 'var'
+            {
+            match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputDirectionKindAccess().getOutEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleParameterOutputDirectionKind"
+
+
+    // $ANTLR start "ruleParameterReturnDirectionKind"
+    // InternalFormalML.g:5931:1: ruleParameterReturnDirectionKind : ( ( 'var' ) ) ;
+    public final void ruleParameterReturnDirectionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5935:1: ( ( ( 'var' ) ) )
+            // InternalFormalML.g:5936:2: ( ( 'var' ) )
+            {
+            // InternalFormalML.g:5936:2: ( ( 'var' ) )
+            // InternalFormalML.g:5937:3: ( 'var' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnDirectionKindAccess().getReturnEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5938:3: ( 'var' )
+            // InternalFormalML.g:5938:4: 'var'
+            {
+            match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnDirectionKindAccess().getReturnEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleParameterReturnDirectionKind"
+
+
+    // $ANTLR start "ruleBufferContainerKind"
+    // InternalFormalML.g:5947:1: ruleBufferContainerKind : ( ( rule__BufferContainerKind__Alternatives ) ) ;
+    public final void ruleBufferContainerKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5951:1: ( ( ( rule__BufferContainerKind__Alternatives ) ) )
+            // InternalFormalML.g:5952:2: ( ( rule__BufferContainerKind__Alternatives ) )
+            {
+            // InternalFormalML.g:5952:2: ( ( rule__BufferContainerKind__Alternatives ) )
+            // InternalFormalML.g:5953:3: ( rule__BufferContainerKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:5954:3: ( rule__BufferContainerKind__Alternatives )
+            // InternalFormalML.g:5954:4: rule__BufferContainerKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferContainerKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleBufferContainerKind"
+
+
+    // $ANTLR start "rulePublicBufferVisibilityKind"
+    // InternalFormalML.g:5963:1: rulePublicBufferVisibilityKind : ( ( 'buffer' ) ) ;
+    public final void rulePublicBufferVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5967:1: ( ( ( 'buffer' ) ) )
+            // InternalFormalML.g:5968:2: ( ( 'buffer' ) )
+            {
+            // InternalFormalML.g:5968:2: ( ( 'buffer' ) )
+            // InternalFormalML.g:5969:3: ( 'buffer' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPublicBufferVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5970:3: ( 'buffer' )
+            // InternalFormalML.g:5970:4: 'buffer'
+            {
+            match(input,15,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPublicBufferVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePublicBufferVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedBufferVisibilityKind"
+    // InternalFormalML.g:5979:1: ruleProtectedBufferVisibilityKind : ( ( 'buffer' ) ) ;
+    public final void ruleProtectedBufferVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5983:1: ( ( ( 'buffer' ) ) )
+            // InternalFormalML.g:5984:2: ( ( 'buffer' ) )
+            {
+            // InternalFormalML.g:5984:2: ( ( 'buffer' ) )
+            // InternalFormalML.g:5985:3: ( 'buffer' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProtectedBufferVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:5986:3: ( 'buffer' )
+            // InternalFormalML.g:5986:4: 'buffer'
+            {
+            match(input,15,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProtectedBufferVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProtectedBufferVisibilityKind"
+
+
+    // $ANTLR start "rulePrivateBufferVisibilityKind"
+    // InternalFormalML.g:5995:1: rulePrivateBufferVisibilityKind : ( ( 'buffer' ) ) ;
+    public final void rulePrivateBufferVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:5999:1: ( ( ( 'buffer' ) ) )
+            // InternalFormalML.g:6000:2: ( ( 'buffer' ) )
+            {
+            // InternalFormalML.g:6000:2: ( ( 'buffer' ) )
+            // InternalFormalML.g:6001:3: ( 'buffer' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrivateBufferVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6002:3: ( 'buffer' )
+            // InternalFormalML.g:6002:4: 'buffer'
+            {
+            match(input,15,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrivateBufferVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrivateBufferVisibilityKind"
+
+
+    // $ANTLR start "rulePublicPortVisibilityKind"
+    // InternalFormalML.g:6011:1: rulePublicPortVisibilityKind : ( ( 'port' ) ) ;
+    public final void rulePublicPortVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6015:1: ( ( ( 'port' ) ) )
+            // InternalFormalML.g:6016:2: ( ( 'port' ) )
+            {
+            // InternalFormalML.g:6016:2: ( ( 'port' ) )
+            // InternalFormalML.g:6017:3: ( 'port' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPublicPortVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6018:3: ( 'port' )
+            // InternalFormalML.g:6018:4: 'port'
+            {
+            match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPublicPortVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePublicPortVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedPortVisibilityKind"
+    // InternalFormalML.g:6027:1: ruleProtectedPortVisibilityKind : ( ( 'port' ) ) ;
+    public final void ruleProtectedPortVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6031:1: ( ( ( 'port' ) ) )
+            // InternalFormalML.g:6032:2: ( ( 'port' ) )
+            {
+            // InternalFormalML.g:6032:2: ( ( 'port' ) )
+            // InternalFormalML.g:6033:3: ( 'port' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProtectedPortVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6034:3: ( 'port' )
+            // InternalFormalML.g:6034:4: 'port'
+            {
+            match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProtectedPortVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProtectedPortVisibilityKind"
+
+
+    // $ANTLR start "rulePrivatePortVisibilityKind"
+    // InternalFormalML.g:6043:1: rulePrivatePortVisibilityKind : ( ( 'port' ) ) ;
+    public final void rulePrivatePortVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6047:1: ( ( ( 'port' ) ) )
+            // InternalFormalML.g:6048:2: ( ( 'port' ) )
+            {
+            // InternalFormalML.g:6048:2: ( ( 'port' ) )
+            // InternalFormalML.g:6049:3: ( 'port' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrivatePortVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6050:3: ( 'port' )
+            // InternalFormalML.g:6050:4: 'port'
+            {
+            match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrivatePortVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrivatePortVisibilityKind"
+
+
+    // $ANTLR start "rulePublicSignalVisibilityKind"
+    // InternalFormalML.g:6059:1: rulePublicSignalVisibilityKind : ( ( 'signal' ) ) ;
+    public final void rulePublicSignalVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6063:1: ( ( ( 'signal' ) ) )
+            // InternalFormalML.g:6064:2: ( ( 'signal' ) )
+            {
+            // InternalFormalML.g:6064:2: ( ( 'signal' ) )
+            // InternalFormalML.g:6065:3: ( 'signal' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPublicSignalVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6066:3: ( 'signal' )
+            // InternalFormalML.g:6066:4: 'signal'
+            {
+            match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPublicSignalVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePublicSignalVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedSignalVisibilityKind"
+    // InternalFormalML.g:6075:1: ruleProtectedSignalVisibilityKind : ( ( 'signal' ) ) ;
+    public final void ruleProtectedSignalVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6079:1: ( ( ( 'signal' ) ) )
+            // InternalFormalML.g:6080:2: ( ( 'signal' ) )
+            {
+            // InternalFormalML.g:6080:2: ( ( 'signal' ) )
+            // InternalFormalML.g:6081:3: ( 'signal' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProtectedSignalVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6082:3: ( 'signal' )
+            // InternalFormalML.g:6082:4: 'signal'
+            {
+            match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProtectedSignalVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProtectedSignalVisibilityKind"
+
+
+    // $ANTLR start "rulePrivateSignalVisibilityKind"
+    // InternalFormalML.g:6091:1: rulePrivateSignalVisibilityKind : ( ( 'signal' ) ) ;
+    public final void rulePrivateSignalVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6095:1: ( ( ( 'signal' ) ) )
+            // InternalFormalML.g:6096:2: ( ( 'signal' ) )
+            {
+            // InternalFormalML.g:6096:2: ( ( 'signal' ) )
+            // InternalFormalML.g:6097:3: ( 'signal' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrivateSignalVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6098:3: ( 'signal' )
+            // InternalFormalML.g:6098:4: 'signal'
+            {
+            match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrivateSignalVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrivateSignalVisibilityKind"
+
+
+    // $ANTLR start "ruleChannelDirection"
+    // InternalFormalML.g:6107:1: ruleChannelDirection : ( ( rule__ChannelDirection__Alternatives ) ) ;
+    public final void ruleChannelDirection() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6111:1: ( ( ( rule__ChannelDirection__Alternatives ) ) )
+            // InternalFormalML.g:6112:2: ( ( rule__ChannelDirection__Alternatives ) )
+            {
+            // InternalFormalML.g:6112:2: ( ( rule__ChannelDirection__Alternatives ) )
+            // InternalFormalML.g:6113:3: ( rule__ChannelDirection__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelDirectionAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:6114:3: ( rule__ChannelDirection__Alternatives )
+            // InternalFormalML.g:6114:4: rule__ChannelDirection__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelDirection__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelDirectionAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleChannelDirection"
+
+
+    // $ANTLR start "rulePublicChannelVisibilityKind"
+    // InternalFormalML.g:6123:1: rulePublicChannelVisibilityKind : ( ( 'channel' ) ) ;
+    public final void rulePublicChannelVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6127:1: ( ( ( 'channel' ) ) )
+            // InternalFormalML.g:6128:2: ( ( 'channel' ) )
+            {
+            // InternalFormalML.g:6128:2: ( ( 'channel' ) )
+            // InternalFormalML.g:6129:3: ( 'channel' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPublicChannelVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6130:3: ( 'channel' )
+            // InternalFormalML.g:6130:4: 'channel'
+            {
+            match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPublicChannelVisibilityKindAccess().getPublicEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePublicChannelVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedChannelVisibilityKind"
+    // InternalFormalML.g:6139:1: ruleProtectedChannelVisibilityKind : ( ( 'channel' ) ) ;
+    public final void ruleProtectedChannelVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6143:1: ( ( ( 'channel' ) ) )
+            // InternalFormalML.g:6144:2: ( ( 'channel' ) )
+            {
+            // InternalFormalML.g:6144:2: ( ( 'channel' ) )
+            // InternalFormalML.g:6145:3: ( 'channel' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProtectedChannelVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6146:3: ( 'channel' )
+            // InternalFormalML.g:6146:4: 'channel'
+            {
+            match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProtectedChannelVisibilityKindAccess().getProtectedEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProtectedChannelVisibilityKind"
+
+
+    // $ANTLR start "rulePrivateChannelVisibilityKind"
+    // InternalFormalML.g:6155:1: rulePrivateChannelVisibilityKind : ( ( 'channel' ) ) ;
+    public final void rulePrivateChannelVisibilityKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6159:1: ( ( ( 'channel' ) ) )
+            // InternalFormalML.g:6160:2: ( ( 'channel' ) )
+            {
+            // InternalFormalML.g:6160:2: ( ( 'channel' ) )
+            // InternalFormalML.g:6161:3: ( 'channel' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrivateChannelVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6162:3: ( 'channel' )
+            // InternalFormalML.g:6162:4: 'channel'
+            {
+            match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrivateChannelVisibilityKindAccess().getPrivateEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePrivateChannelVisibilityKind"
+
+
+    // $ANTLR start "ruleTransitionMoc"
+    // InternalFormalML.g:6171:1: ruleTransitionMoc : ( ( rule__TransitionMoc__Alternatives ) ) ;
+    public final void ruleTransitionMoc() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6175:1: ( ( ( rule__TransitionMoc__Alternatives ) ) )
+            // InternalFormalML.g:6176:2: ( ( rule__TransitionMoc__Alternatives ) )
+            {
+            // InternalFormalML.g:6176:2: ( ( rule__TransitionMoc__Alternatives ) )
+            // InternalFormalML.g:6177:3: ( rule__TransitionMoc__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMocAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:6178:3: ( rule__TransitionMoc__Alternatives )
+            // InternalFormalML.g:6178:4: rule__TransitionMoc__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoc__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMocAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleTransitionMoc"
+
+
+    // $ANTLR start "ruleInterruptStatementKind"
+    // InternalFormalML.g:6187:1: ruleInterruptStatementKind : ( ( rule__InterruptStatementKind__Alternatives ) ) ;
+    public final void ruleInterruptStatementKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6191:1: ( ( ( rule__InterruptStatementKind__Alternatives ) ) )
+            // InternalFormalML.g:6192:2: ( ( rule__InterruptStatementKind__Alternatives ) )
+            {
+            // InternalFormalML.g:6192:2: ( ( rule__InterruptStatementKind__Alternatives ) )
+            // InternalFormalML.g:6193:3: ( rule__InterruptStatementKind__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementKindAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:6194:3: ( rule__InterruptStatementKind__Alternatives )
+            // InternalFormalML.g:6194:4: rule__InterruptStatementKind__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatementKind__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementKindAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleInterruptStatementKind"
+
+
+    // $ANTLR start "ruleOPERATOR_ACTIVITY"
+    // InternalFormalML.g:6203:1: ruleOPERATOR_ACTIVITY : ( ( rule__OPERATOR_ACTIVITY__Alternatives ) ) ;
+    public final void ruleOPERATOR_ACTIVITY() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6207:1: ( ( ( rule__OPERATOR_ACTIVITY__Alternatives ) ) )
+            // InternalFormalML.g:6208:2: ( ( rule__OPERATOR_ACTIVITY__Alternatives ) )
+            {
+            // InternalFormalML.g:6208:2: ( ( rule__OPERATOR_ACTIVITY__Alternatives ) )
+            // InternalFormalML.g:6209:3: ( rule__OPERATOR_ACTIVITY__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOPERATOR_ACTIVITYAccess().getAlternatives()); 
+            }
+            // InternalFormalML.g:6210:3: ( rule__OPERATOR_ACTIVITY__Alternatives )
+            // InternalFormalML.g:6210:4: rule__OPERATOR_ACTIVITY__Alternatives
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OPERATOR_ACTIVITY__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOPERATOR_ACTIVITYAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleOPERATOR_ACTIVITY"
+
+
+    // $ANTLR start "ruleValueDotFieldExpressionKind"
+    // InternalFormalML.g:6219:1: ruleValueDotFieldExpressionKind : ( ( '.' ) ) ;
+    public final void ruleValueDotFieldExpressionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6223:1: ( ( ( '.' ) ) )
+            // InternalFormalML.g:6224:2: ( ( '.' ) )
+            {
+            // InternalFormalML.g:6224:2: ( ( '.' ) )
+            // InternalFormalML.g:6225:3: ( '.' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6226:3: ( '.' )
+            // InternalFormalML.g:6226:4: '.'
+            {
+            match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleValueDotFieldExpressionKind"
+
+
+    // $ANTLR start "ruleValueArrowFieldExpressionKind"
+    // InternalFormalML.g:6235:1: ruleValueArrowFieldExpressionKind : ( ( '->' ) ) ;
+    public final void ruleValueArrowFieldExpressionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6239:1: ( ( ( '->' ) ) )
+            // InternalFormalML.g:6240:2: ( ( '->' ) )
+            {
+            // InternalFormalML.g:6240:2: ( ( '->' ) )
+            // InternalFormalML.g:6241:3: ( '->' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6242:3: ( '->' )
+            // InternalFormalML.g:6242:4: '->'
+            {
+            match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleValueArrowFieldExpressionKind"
+
+
+    // $ANTLR start "ruleValueIndexExpressionKind"
+    // InternalFormalML.g:6251:1: ruleValueIndexExpressionKind : ( ( '[' ) ) ;
+    public final void ruleValueIndexExpressionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6255:1: ( ( ( '[' ) ) )
+            // InternalFormalML.g:6256:2: ( ( '[' ) )
+            {
+            // InternalFormalML.g:6256:2: ( ( '[' ) )
+            // InternalFormalML.g:6257:3: ( '[' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6258:3: ( '[' )
+            // InternalFormalML.g:6258:4: '['
+            {
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleValueIndexExpressionKind"
+
+
+    // $ANTLR start "ruleValueParameterExpressionKind"
+    // InternalFormalML.g:6267:1: ruleValueParameterExpressionKind : ( ( '(' ) ) ;
+    public final void ruleValueParameterExpressionKind() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6271:1: ( ( ( '(' ) ) )
+            // InternalFormalML.g:6272:2: ( ( '(' ) )
+            {
+            // InternalFormalML.g:6272:2: ( ( '(' ) )
+            // InternalFormalML.g:6273:3: ( '(' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration()); 
+            }
+            // InternalFormalML.g:6274:3: ( '(' )
+            // InternalFormalML.g:6274:4: '('
+            {
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleValueParameterExpressionKind"
+
+
+    // $ANTLR start "rule__XliaPrologObject__NameAlternatives_0_0"
+    // InternalFormalML.g:6282:1: rule__XliaPrologObject__NameAlternatives_0_0 : ( ( '@FormalML' ) | ( '@xlia' ) | ( '@xfsp' ) );
+    public final void rule__XliaPrologObject__NameAlternatives_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6286:1: ( ( '@FormalML' ) | ( '@xlia' ) | ( '@xfsp' ) )
+            int alt2=3;
+            switch ( input.LA(1) ) {
+            case 24:
+                {
+                alt2=1;
+                }
+                break;
+            case 25:
+                {
+                alt2=2;
+                }
+                break;
+            case 26:
+                {
+                alt2=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 2, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt2) {
+                case 1 :
+                    // InternalFormalML.g:6287:2: ( '@FormalML' )
+                    {
+                    // InternalFormalML.g:6287:2: ( '@FormalML' )
+                    // InternalFormalML.g:6288:3: '@FormalML'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXliaPrologObjectAccess().getNameFormalMLKeyword_0_0_0()); 
+                    }
+                    match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXliaPrologObjectAccess().getNameFormalMLKeyword_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6293:2: ( '@xlia' )
+                    {
+                    // InternalFormalML.g:6293:2: ( '@xlia' )
+                    // InternalFormalML.g:6294:3: '@xlia'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXliaPrologObjectAccess().getNameXliaKeyword_0_0_1()); 
+                    }
+                    match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXliaPrologObjectAccess().getNameXliaKeyword_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:6299:2: ( '@xfsp' )
+                    {
+                    // InternalFormalML.g:6299:2: ( '@xfsp' )
+                    // InternalFormalML.g:6300:3: '@xfsp'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXliaPrologObjectAccess().getNameXfspKeyword_0_0_2()); 
+                    }
+                    match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXliaPrologObjectAccess().getNameXfspKeyword_0_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__NameAlternatives_0_0"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__NameAlternatives_0_0"
+    // InternalFormalML.g:6309:1: rule__XliaPrologAttribute__NameAlternatives_0_0 : ( ( 'system' ) | ( 'package' ) );
+    public final void rule__XliaPrologAttribute__NameAlternatives_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6313:1: ( ( 'system' ) | ( 'package' ) )
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0==27) ) {
+                alt3=1;
+            }
+            else if ( (LA3_0==28) ) {
+                alt3=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 3, 0, input);
+
+                throw nvae;
+            }
+            switch (alt3) {
+                case 1 :
+                    // InternalFormalML.g:6314:2: ( 'system' )
+                    {
+                    // InternalFormalML.g:6314:2: ( 'system' )
+                    // InternalFormalML.g:6315:3: 'system'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXliaPrologAttributeAccess().getNameSystemKeyword_0_0_0()); 
+                    }
+                    match(input,27,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXliaPrologAttributeAccess().getNameSystemKeyword_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6320:2: ( 'package' )
+                    {
+                    // InternalFormalML.g:6320:2: ( 'package' )
+                    // InternalFormalML.g:6321:3: 'package'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXliaPrologAttributeAccess().getNamePackageKeyword_0_0_1()); 
+                    }
+                    match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXliaPrologAttributeAccess().getNamePackageKeyword_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__NameAlternatives_0_0"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__ValueAlternatives_1_1_0"
+    // InternalFormalML.g:6330:1: rule__XliaPrologAttribute__ValueAlternatives_1_1_0 : ( ( ruleLiteralFloatExpression ) | ( ruleLiteralStringExpression ) );
+    public final void rule__XliaPrologAttribute__ValueAlternatives_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6334:1: ( ( ruleLiteralFloatExpression ) | ( ruleLiteralStringExpression ) )
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0==RULE_INT||LA4_0==20||LA4_0==132) ) {
+                alt4=1;
+            }
+            else if ( (LA4_0==RULE_STRING) ) {
+                alt4=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 4, 0, input);
+
+                throw nvae;
+            }
+            switch (alt4) {
+                case 1 :
+                    // InternalFormalML.g:6335:2: ( ruleLiteralFloatExpression )
+                    {
+                    // InternalFormalML.g:6335:2: ( ruleLiteralFloatExpression )
+                    // InternalFormalML.g:6336:3: ruleLiteralFloatExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralFloatExpressionParserRuleCall_1_1_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralFloatExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralFloatExpressionParserRuleCall_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6341:2: ( ruleLiteralStringExpression )
+                    {
+                    // InternalFormalML.g:6341:2: ( ruleLiteralStringExpression )
+                    // InternalFormalML.g:6342:3: ruleLiteralStringExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralStringExpressionParserRuleCall_1_1_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralStringExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralStringExpressionParserRuleCall_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__ValueAlternatives_1_1_0"
+
+
+    // $ANTLR start "rule__XliaNamedElement__Alternatives"
+    // InternalFormalML.g:6351:1: rule__XliaNamedElement__Alternatives : ( ( ruleXliaObject ) | ( ruleXliaAttribute ) );
+    public final void rule__XliaNamedElement__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6355:1: ( ( ruleXliaObject ) | ( ruleXliaAttribute ) )
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==RULE_XLIA_ID) ) {
+                int LA5_1 = input.LA(2);
+
+                if ( (LA5_1==199) ) {
+                    alt5=1;
+                }
+                else if ( (LA5_1==100) ) {
+                    alt5=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 5, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 5, 0, input);
+
+                throw nvae;
+            }
+            switch (alt5) {
+                case 1 :
+                    // InternalFormalML.g:6356:2: ( ruleXliaObject )
+                    {
+                    // InternalFormalML.g:6356:2: ( ruleXliaObject )
+                    // InternalFormalML.g:6357:3: ruleXliaObject
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXliaNamedElementAccess().getXliaObjectParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleXliaObject();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXliaNamedElementAccess().getXliaObjectParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6362:2: ( ruleXliaAttribute )
+                    {
+                    // InternalFormalML.g:6362:2: ( ruleXliaAttribute )
+                    // InternalFormalML.g:6363:3: ruleXliaAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXliaNamedElementAccess().getXliaAttributeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleXliaAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXliaNamedElementAccess().getXliaAttributeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaNamedElement__Alternatives"
+
+
+    // $ANTLR start "rule__EBoolean__Alternatives"
+    // InternalFormalML.g:6372:1: rule__EBoolean__Alternatives : ( ( 'true' ) | ( 'false' ) );
+    public final void rule__EBoolean__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6376:1: ( ( 'true' ) | ( 'false' ) )
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0==29) ) {
+                alt6=1;
+            }
+            else if ( (LA6_0==30) ) {
+                alt6=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 6, 0, input);
+
+                throw nvae;
+            }
+            switch (alt6) {
+                case 1 :
+                    // InternalFormalML.g:6377:2: ( 'true' )
+                    {
+                    // InternalFormalML.g:6377:2: ( 'true' )
+                    // InternalFormalML.g:6378:3: 'true'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEBooleanAccess().getTrueKeyword_0()); 
+                    }
+                    match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEBooleanAccess().getTrueKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6383:2: ( 'false' )
+                    {
+                    // InternalFormalML.g:6383:2: ( 'false' )
+                    // InternalFormalML.g:6384:3: 'false'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEBooleanAccess().getFalseKeyword_1()); 
+                    }
+                    match(input,30,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEBooleanAccess().getFalseKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EBoolean__Alternatives"
+
+
+    // $ANTLR start "rule__ESUfid__Alternatives_1_0"
+    // InternalFormalML.g:6393:1: rule__ESUfid__Alternatives_1_0 : ( ( '.' ) | ( ':' ) | ( '::' ) );
+    public final void rule__ESUfid__Alternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6397:1: ( ( '.' ) | ( ':' ) | ( '::' ) )
+            int alt7=3;
+            switch ( input.LA(1) ) {
+            case 20:
+                {
+                alt7=1;
+                }
+                break;
+            case 31:
+                {
+                alt7=2;
+                }
+                break;
+            case 32:
+                {
+                alt7=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt7) {
+                case 1 :
+                    // InternalFormalML.g:6398:2: ( '.' )
+                    {
+                    // InternalFormalML.g:6398:2: ( '.' )
+                    // InternalFormalML.g:6399:3: '.'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getESUfidAccess().getFullStopKeyword_1_0_0()); 
+                    }
+                    match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getESUfidAccess().getFullStopKeyword_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6404:2: ( ':' )
+                    {
+                    // InternalFormalML.g:6404:2: ( ':' )
+                    // InternalFormalML.g:6405:3: ':'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getESUfidAccess().getColonKeyword_1_0_1()); 
+                    }
+                    match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getESUfidAccess().getColonKeyword_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:6410:2: ( '::' )
+                    {
+                    // InternalFormalML.g:6410:2: ( '::' )
+                    // InternalFormalML.g:6411:3: '::'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getESUfidAccess().getColonColonKeyword_1_0_2()); 
+                    }
+                    match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getESUfidAccess().getColonColonKeyword_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ESUfid__Alternatives_1_0"
+
+
+    // $ANTLR start "rule__System__Alternatives_0_1"
+    // InternalFormalML.g:6420:1: rule__System__Alternatives_0_1 : ( ( ( rule__System__TimedAssignment_0_1_0 ) ) | ( ( rule__System__Input_enabledAssignment_0_1_1 ) ) );
+    public final void rule__System__Alternatives_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6424:1: ( ( ( rule__System__TimedAssignment_0_1_0 ) ) | ( ( rule__System__Input_enabledAssignment_0_1_1 ) ) )
+            int alt8=2;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0==273) ) {
+                alt8=1;
+            }
+            else if ( (LA8_0==274) ) {
+                alt8=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 8, 0, input);
+
+                throw nvae;
+            }
+            switch (alt8) {
+                case 1 :
+                    // InternalFormalML.g:6425:2: ( ( rule__System__TimedAssignment_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:6425:2: ( ( rule__System__TimedAssignment_0_1_0 ) )
+                    // InternalFormalML.g:6426:3: ( rule__System__TimedAssignment_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getTimedAssignment_0_1_0()); 
+                    }
+                    // InternalFormalML.g:6427:3: ( rule__System__TimedAssignment_0_1_0 )
+                    // InternalFormalML.g:6427:4: rule__System__TimedAssignment_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__TimedAssignment_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getTimedAssignment_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6431:2: ( ( rule__System__Input_enabledAssignment_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:6431:2: ( ( rule__System__Input_enabledAssignment_0_1_1 ) )
+                    // InternalFormalML.g:6432:3: ( rule__System__Input_enabledAssignment_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getInput_enabledAssignment_0_1_1()); 
+                    }
+                    // InternalFormalML.g:6433:3: ( rule__System__Input_enabledAssignment_0_1_1 )
+                    // InternalFormalML.g:6433:4: rule__System__Input_enabledAssignment_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Input_enabledAssignment_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getInput_enabledAssignment_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_0_1"
+
+
+    // $ANTLR start "rule__System__Alternatives_2_2"
+    // InternalFormalML.g:6441:1: rule__System__Alternatives_2_2 : ( ( 'and' ) | ( 'or' ) );
+    public final void rule__System__Alternatives_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6445:1: ( ( 'and' ) | ( 'or' ) )
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==33) ) {
+                alt9=1;
+            }
+            else if ( (LA9_0==34) ) {
+                alt9=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 9, 0, input);
+
+                throw nvae;
+            }
+            switch (alt9) {
+                case 1 :
+                    // InternalFormalML.g:6446:2: ( 'and' )
+                    {
+                    // InternalFormalML.g:6446:2: ( 'and' )
+                    // InternalFormalML.g:6447:3: 'and'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getAndKeyword_2_2_0()); 
+                    }
+                    match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getAndKeyword_2_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6452:2: ( 'or' )
+                    {
+                    // InternalFormalML.g:6452:2: ( 'or' )
+                    // InternalFormalML.g:6453:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getOrKeyword_2_2_1()); 
+                    }
+                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getOrKeyword_2_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_2_2"
+
+
+    // $ANTLR start "rule__System__Alternatives_6"
+    // InternalFormalML.g:6462:1: rule__System__Alternatives_6 : ( ( ( rule__System__PortAssignment_6_0 ) ) | ( ( rule__System__SignalAssignment_6_1 ) ) | ( ( rule__System__BufferAssignment_6_2 ) ) | ( ( rule__System__ChannelAssignment_6_3 ) ) | ( ( rule__System__TypedefAssignment_6_4 ) ) | ( ( rule__System__PropertyAssignment_6_5 ) ) );
+    public final void rule__System__Alternatives_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6466:1: ( ( ( rule__System__PortAssignment_6_0 ) ) | ( ( rule__System__SignalAssignment_6_1 ) ) | ( ( rule__System__BufferAssignment_6_2 ) ) | ( ( rule__System__ChannelAssignment_6_3 ) ) | ( ( rule__System__TypedefAssignment_6_4 ) ) | ( ( rule__System__PropertyAssignment_6_5 ) ) )
+            int alt10=6;
+            alt10 = dfa10.predict(input);
+            switch (alt10) {
+                case 1 :
+                    // InternalFormalML.g:6467:2: ( ( rule__System__PortAssignment_6_0 ) )
+                    {
+                    // InternalFormalML.g:6467:2: ( ( rule__System__PortAssignment_6_0 ) )
+                    // InternalFormalML.g:6468:3: ( rule__System__PortAssignment_6_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPortAssignment_6_0()); 
+                    }
+                    // InternalFormalML.g:6469:3: ( rule__System__PortAssignment_6_0 )
+                    // InternalFormalML.g:6469:4: rule__System__PortAssignment_6_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PortAssignment_6_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPortAssignment_6_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6473:2: ( ( rule__System__SignalAssignment_6_1 ) )
+                    {
+                    // InternalFormalML.g:6473:2: ( ( rule__System__SignalAssignment_6_1 ) )
+                    // InternalFormalML.g:6474:3: ( rule__System__SignalAssignment_6_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getSignalAssignment_6_1()); 
+                    }
+                    // InternalFormalML.g:6475:3: ( rule__System__SignalAssignment_6_1 )
+                    // InternalFormalML.g:6475:4: rule__System__SignalAssignment_6_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__SignalAssignment_6_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getSignalAssignment_6_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:6479:2: ( ( rule__System__BufferAssignment_6_2 ) )
+                    {
+                    // InternalFormalML.g:6479:2: ( ( rule__System__BufferAssignment_6_2 ) )
+                    // InternalFormalML.g:6480:3: ( rule__System__BufferAssignment_6_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getBufferAssignment_6_2()); 
+                    }
+                    // InternalFormalML.g:6481:3: ( rule__System__BufferAssignment_6_2 )
+                    // InternalFormalML.g:6481:4: rule__System__BufferAssignment_6_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__BufferAssignment_6_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getBufferAssignment_6_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:6485:2: ( ( rule__System__ChannelAssignment_6_3 ) )
+                    {
+                    // InternalFormalML.g:6485:2: ( ( rule__System__ChannelAssignment_6_3 ) )
+                    // InternalFormalML.g:6486:3: ( rule__System__ChannelAssignment_6_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getChannelAssignment_6_3()); 
+                    }
+                    // InternalFormalML.g:6487:3: ( rule__System__ChannelAssignment_6_3 )
+                    // InternalFormalML.g:6487:4: rule__System__ChannelAssignment_6_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__ChannelAssignment_6_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getChannelAssignment_6_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:6491:2: ( ( rule__System__TypedefAssignment_6_4 ) )
+                    {
+                    // InternalFormalML.g:6491:2: ( ( rule__System__TypedefAssignment_6_4 ) )
+                    // InternalFormalML.g:6492:3: ( rule__System__TypedefAssignment_6_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getTypedefAssignment_6_4()); 
+                    }
+                    // InternalFormalML.g:6493:3: ( rule__System__TypedefAssignment_6_4 )
+                    // InternalFormalML.g:6493:4: rule__System__TypedefAssignment_6_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__TypedefAssignment_6_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getTypedefAssignment_6_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:6497:2: ( ( rule__System__PropertyAssignment_6_5 ) )
+                    {
+                    // InternalFormalML.g:6497:2: ( ( rule__System__PropertyAssignment_6_5 ) )
+                    // InternalFormalML.g:6498:3: ( rule__System__PropertyAssignment_6_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPropertyAssignment_6_5()); 
+                    }
+                    // InternalFormalML.g:6499:3: ( rule__System__PropertyAssignment_6_5 )
+                    // InternalFormalML.g:6499:4: rule__System__PropertyAssignment_6_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PropertyAssignment_6_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPropertyAssignment_6_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_6"
+
+
+    // $ANTLR start "rule__System__Alternatives_7"
+    // InternalFormalML.g:6507:1: rule__System__Alternatives_7 : ( ( ( rule__System__Group_7_0__0 ) ) | ( ( rule__System__Group_7_1__0 ) ) | ( ( rule__System__Group_7_2__0 ) ) | ( ( rule__System__Group_7_3__0 ) ) );
+    public final void rule__System__Alternatives_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6511:1: ( ( ( rule__System__Group_7_0__0 ) ) | ( ( rule__System__Group_7_1__0 ) ) | ( ( rule__System__Group_7_2__0 ) ) | ( ( rule__System__Group_7_3__0 ) ) )
+            int alt11=4;
+            switch ( input.LA(1) ) {
+            case 202:
+                {
+                alt11=1;
+                }
+                break;
+            case 203:
+                {
+                alt11=2;
+                }
+                break;
+            case 204:
+                {
+                alt11=3;
+                }
+                break;
+            case 205:
+                {
+                alt11=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 11, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt11) {
+                case 1 :
+                    // InternalFormalML.g:6512:2: ( ( rule__System__Group_7_0__0 ) )
+                    {
+                    // InternalFormalML.g:6512:2: ( ( rule__System__Group_7_0__0 ) )
+                    // InternalFormalML.g:6513:3: ( rule__System__Group_7_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_7_0()); 
+                    }
+                    // InternalFormalML.g:6514:3: ( rule__System__Group_7_0__0 )
+                    // InternalFormalML.g:6514:4: rule__System__Group_7_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_7_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_7_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6518:2: ( ( rule__System__Group_7_1__0 ) )
+                    {
+                    // InternalFormalML.g:6518:2: ( ( rule__System__Group_7_1__0 ) )
+                    // InternalFormalML.g:6519:3: ( rule__System__Group_7_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_7_1()); 
+                    }
+                    // InternalFormalML.g:6520:3: ( rule__System__Group_7_1__0 )
+                    // InternalFormalML.g:6520:4: rule__System__Group_7_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_7_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_7_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:6524:2: ( ( rule__System__Group_7_2__0 ) )
+                    {
+                    // InternalFormalML.g:6524:2: ( ( rule__System__Group_7_2__0 ) )
+                    // InternalFormalML.g:6525:3: ( rule__System__Group_7_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_7_2()); 
+                    }
+                    // InternalFormalML.g:6526:3: ( rule__System__Group_7_2__0 )
+                    // InternalFormalML.g:6526:4: rule__System__Group_7_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_7_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_7_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:6530:2: ( ( rule__System__Group_7_3__0 ) )
+                    {
+                    // InternalFormalML.g:6530:2: ( ( rule__System__Group_7_3__0 ) )
+                    // InternalFormalML.g:6531:3: ( rule__System__Group_7_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_7_3()); 
+                    }
+                    // InternalFormalML.g:6532:3: ( rule__System__Group_7_3__0 )
+                    // InternalFormalML.g:6532:4: rule__System__Group_7_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_7_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_7_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_7"
+
+
+    // $ANTLR start "rule__System__Alternatives_7_0_1"
+    // InternalFormalML.g:6540:1: rule__System__Alternatives_7_0_1 : ( ( ( rule__System__PortAssignment_7_0_1_0 ) ) | ( ( rule__System__SignalAssignment_7_0_1_1 ) ) | ( ( rule__System__BufferAssignment_7_0_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_0_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_0_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_0_1_5 ) ) );
+    public final void rule__System__Alternatives_7_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6544:1: ( ( ( rule__System__PortAssignment_7_0_1_0 ) ) | ( ( rule__System__SignalAssignment_7_0_1_1 ) ) | ( ( rule__System__BufferAssignment_7_0_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_0_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_0_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_0_1_5 ) ) )
+            int alt12=6;
+            alt12 = dfa12.predict(input);
+            switch (alt12) {
+                case 1 :
+                    // InternalFormalML.g:6545:2: ( ( rule__System__PortAssignment_7_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:6545:2: ( ( rule__System__PortAssignment_7_0_1_0 ) )
+                    // InternalFormalML.g:6546:3: ( rule__System__PortAssignment_7_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPortAssignment_7_0_1_0()); 
+                    }
+                    // InternalFormalML.g:6547:3: ( rule__System__PortAssignment_7_0_1_0 )
+                    // InternalFormalML.g:6547:4: rule__System__PortAssignment_7_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PortAssignment_7_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPortAssignment_7_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6551:2: ( ( rule__System__SignalAssignment_7_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:6551:2: ( ( rule__System__SignalAssignment_7_0_1_1 ) )
+                    // InternalFormalML.g:6552:3: ( rule__System__SignalAssignment_7_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getSignalAssignment_7_0_1_1()); 
+                    }
+                    // InternalFormalML.g:6553:3: ( rule__System__SignalAssignment_7_0_1_1 )
+                    // InternalFormalML.g:6553:4: rule__System__SignalAssignment_7_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__SignalAssignment_7_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getSignalAssignment_7_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:6557:2: ( ( rule__System__BufferAssignment_7_0_1_2 ) )
+                    {
+                    // InternalFormalML.g:6557:2: ( ( rule__System__BufferAssignment_7_0_1_2 ) )
+                    // InternalFormalML.g:6558:3: ( rule__System__BufferAssignment_7_0_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getBufferAssignment_7_0_1_2()); 
+                    }
+                    // InternalFormalML.g:6559:3: ( rule__System__BufferAssignment_7_0_1_2 )
+                    // InternalFormalML.g:6559:4: rule__System__BufferAssignment_7_0_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__BufferAssignment_7_0_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getBufferAssignment_7_0_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:6563:2: ( ( rule__System__ChannelAssignment_7_0_1_3 ) )
+                    {
+                    // InternalFormalML.g:6563:2: ( ( rule__System__ChannelAssignment_7_0_1_3 ) )
+                    // InternalFormalML.g:6564:3: ( rule__System__ChannelAssignment_7_0_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getChannelAssignment_7_0_1_3()); 
+                    }
+                    // InternalFormalML.g:6565:3: ( rule__System__ChannelAssignment_7_0_1_3 )
+                    // InternalFormalML.g:6565:4: rule__System__ChannelAssignment_7_0_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__ChannelAssignment_7_0_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getChannelAssignment_7_0_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:6569:2: ( ( rule__System__TypedefAssignment_7_0_1_4 ) )
+                    {
+                    // InternalFormalML.g:6569:2: ( ( rule__System__TypedefAssignment_7_0_1_4 ) )
+                    // InternalFormalML.g:6570:3: ( rule__System__TypedefAssignment_7_0_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getTypedefAssignment_7_0_1_4()); 
+                    }
+                    // InternalFormalML.g:6571:3: ( rule__System__TypedefAssignment_7_0_1_4 )
+                    // InternalFormalML.g:6571:4: rule__System__TypedefAssignment_7_0_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__TypedefAssignment_7_0_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getTypedefAssignment_7_0_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:6575:2: ( ( rule__System__PropertyAssignment_7_0_1_5 ) )
+                    {
+                    // InternalFormalML.g:6575:2: ( ( rule__System__PropertyAssignment_7_0_1_5 ) )
+                    // InternalFormalML.g:6576:3: ( rule__System__PropertyAssignment_7_0_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPropertyAssignment_7_0_1_5()); 
+                    }
+                    // InternalFormalML.g:6577:3: ( rule__System__PropertyAssignment_7_0_1_5 )
+                    // InternalFormalML.g:6577:4: rule__System__PropertyAssignment_7_0_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PropertyAssignment_7_0_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPropertyAssignment_7_0_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_7_0_1"
+
+
+    // $ANTLR start "rule__System__Alternatives_7_1_1"
+    // InternalFormalML.g:6585:1: rule__System__Alternatives_7_1_1 : ( ( ( rule__System__PortAssignment_7_1_1_0 ) ) | ( ( rule__System__SignalAssignment_7_1_1_1 ) ) | ( ( rule__System__BufferAssignment_7_1_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_1_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_1_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_1_1_5 ) ) );
+    public final void rule__System__Alternatives_7_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6589:1: ( ( ( rule__System__PortAssignment_7_1_1_0 ) ) | ( ( rule__System__SignalAssignment_7_1_1_1 ) ) | ( ( rule__System__BufferAssignment_7_1_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_1_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_1_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_1_1_5 ) ) )
+            int alt13=6;
+            alt13 = dfa13.predict(input);
+            switch (alt13) {
+                case 1 :
+                    // InternalFormalML.g:6590:2: ( ( rule__System__PortAssignment_7_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:6590:2: ( ( rule__System__PortAssignment_7_1_1_0 ) )
+                    // InternalFormalML.g:6591:3: ( rule__System__PortAssignment_7_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPortAssignment_7_1_1_0()); 
+                    }
+                    // InternalFormalML.g:6592:3: ( rule__System__PortAssignment_7_1_1_0 )
+                    // InternalFormalML.g:6592:4: rule__System__PortAssignment_7_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PortAssignment_7_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPortAssignment_7_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6596:2: ( ( rule__System__SignalAssignment_7_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:6596:2: ( ( rule__System__SignalAssignment_7_1_1_1 ) )
+                    // InternalFormalML.g:6597:3: ( rule__System__SignalAssignment_7_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getSignalAssignment_7_1_1_1()); 
+                    }
+                    // InternalFormalML.g:6598:3: ( rule__System__SignalAssignment_7_1_1_1 )
+                    // InternalFormalML.g:6598:4: rule__System__SignalAssignment_7_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__SignalAssignment_7_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getSignalAssignment_7_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:6602:2: ( ( rule__System__BufferAssignment_7_1_1_2 ) )
+                    {
+                    // InternalFormalML.g:6602:2: ( ( rule__System__BufferAssignment_7_1_1_2 ) )
+                    // InternalFormalML.g:6603:3: ( rule__System__BufferAssignment_7_1_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getBufferAssignment_7_1_1_2()); 
+                    }
+                    // InternalFormalML.g:6604:3: ( rule__System__BufferAssignment_7_1_1_2 )
+                    // InternalFormalML.g:6604:4: rule__System__BufferAssignment_7_1_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__BufferAssignment_7_1_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getBufferAssignment_7_1_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:6608:2: ( ( rule__System__ChannelAssignment_7_1_1_3 ) )
+                    {
+                    // InternalFormalML.g:6608:2: ( ( rule__System__ChannelAssignment_7_1_1_3 ) )
+                    // InternalFormalML.g:6609:3: ( rule__System__ChannelAssignment_7_1_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getChannelAssignment_7_1_1_3()); 
+                    }
+                    // InternalFormalML.g:6610:3: ( rule__System__ChannelAssignment_7_1_1_3 )
+                    // InternalFormalML.g:6610:4: rule__System__ChannelAssignment_7_1_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__ChannelAssignment_7_1_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getChannelAssignment_7_1_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:6614:2: ( ( rule__System__TypedefAssignment_7_1_1_4 ) )
+                    {
+                    // InternalFormalML.g:6614:2: ( ( rule__System__TypedefAssignment_7_1_1_4 ) )
+                    // InternalFormalML.g:6615:3: ( rule__System__TypedefAssignment_7_1_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getTypedefAssignment_7_1_1_4()); 
+                    }
+                    // InternalFormalML.g:6616:3: ( rule__System__TypedefAssignment_7_1_1_4 )
+                    // InternalFormalML.g:6616:4: rule__System__TypedefAssignment_7_1_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__TypedefAssignment_7_1_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getTypedefAssignment_7_1_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:6620:2: ( ( rule__System__PropertyAssignment_7_1_1_5 ) )
+                    {
+                    // InternalFormalML.g:6620:2: ( ( rule__System__PropertyAssignment_7_1_1_5 ) )
+                    // InternalFormalML.g:6621:3: ( rule__System__PropertyAssignment_7_1_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPropertyAssignment_7_1_1_5()); 
+                    }
+                    // InternalFormalML.g:6622:3: ( rule__System__PropertyAssignment_7_1_1_5 )
+                    // InternalFormalML.g:6622:4: rule__System__PropertyAssignment_7_1_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PropertyAssignment_7_1_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPropertyAssignment_7_1_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_7_1_1"
+
+
+    // $ANTLR start "rule__System__Alternatives_7_2_1"
+    // InternalFormalML.g:6630:1: rule__System__Alternatives_7_2_1 : ( ( ( rule__System__PortAssignment_7_2_1_0 ) ) | ( ( rule__System__SignalAssignment_7_2_1_1 ) ) | ( ( rule__System__BufferAssignment_7_2_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_2_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_2_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_2_1_5 ) ) );
+    public final void rule__System__Alternatives_7_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6634:1: ( ( ( rule__System__PortAssignment_7_2_1_0 ) ) | ( ( rule__System__SignalAssignment_7_2_1_1 ) ) | ( ( rule__System__BufferAssignment_7_2_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_2_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_2_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_2_1_5 ) ) )
+            int alt14=6;
+            alt14 = dfa14.predict(input);
+            switch (alt14) {
+                case 1 :
+                    // InternalFormalML.g:6635:2: ( ( rule__System__PortAssignment_7_2_1_0 ) )
+                    {
+                    // InternalFormalML.g:6635:2: ( ( rule__System__PortAssignment_7_2_1_0 ) )
+                    // InternalFormalML.g:6636:3: ( rule__System__PortAssignment_7_2_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPortAssignment_7_2_1_0()); 
+                    }
+                    // InternalFormalML.g:6637:3: ( rule__System__PortAssignment_7_2_1_0 )
+                    // InternalFormalML.g:6637:4: rule__System__PortAssignment_7_2_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PortAssignment_7_2_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPortAssignment_7_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6641:2: ( ( rule__System__SignalAssignment_7_2_1_1 ) )
+                    {
+                    // InternalFormalML.g:6641:2: ( ( rule__System__SignalAssignment_7_2_1_1 ) )
+                    // InternalFormalML.g:6642:3: ( rule__System__SignalAssignment_7_2_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getSignalAssignment_7_2_1_1()); 
+                    }
+                    // InternalFormalML.g:6643:3: ( rule__System__SignalAssignment_7_2_1_1 )
+                    // InternalFormalML.g:6643:4: rule__System__SignalAssignment_7_2_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__SignalAssignment_7_2_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getSignalAssignment_7_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:6647:2: ( ( rule__System__BufferAssignment_7_2_1_2 ) )
+                    {
+                    // InternalFormalML.g:6647:2: ( ( rule__System__BufferAssignment_7_2_1_2 ) )
+                    // InternalFormalML.g:6648:3: ( rule__System__BufferAssignment_7_2_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getBufferAssignment_7_2_1_2()); 
+                    }
+                    // InternalFormalML.g:6649:3: ( rule__System__BufferAssignment_7_2_1_2 )
+                    // InternalFormalML.g:6649:4: rule__System__BufferAssignment_7_2_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__BufferAssignment_7_2_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getBufferAssignment_7_2_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:6653:2: ( ( rule__System__ChannelAssignment_7_2_1_3 ) )
+                    {
+                    // InternalFormalML.g:6653:2: ( ( rule__System__ChannelAssignment_7_2_1_3 ) )
+                    // InternalFormalML.g:6654:3: ( rule__System__ChannelAssignment_7_2_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getChannelAssignment_7_2_1_3()); 
+                    }
+                    // InternalFormalML.g:6655:3: ( rule__System__ChannelAssignment_7_2_1_3 )
+                    // InternalFormalML.g:6655:4: rule__System__ChannelAssignment_7_2_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__ChannelAssignment_7_2_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getChannelAssignment_7_2_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:6659:2: ( ( rule__System__TypedefAssignment_7_2_1_4 ) )
+                    {
+                    // InternalFormalML.g:6659:2: ( ( rule__System__TypedefAssignment_7_2_1_4 ) )
+                    // InternalFormalML.g:6660:3: ( rule__System__TypedefAssignment_7_2_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getTypedefAssignment_7_2_1_4()); 
+                    }
+                    // InternalFormalML.g:6661:3: ( rule__System__TypedefAssignment_7_2_1_4 )
+                    // InternalFormalML.g:6661:4: rule__System__TypedefAssignment_7_2_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__TypedefAssignment_7_2_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getTypedefAssignment_7_2_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:6665:2: ( ( rule__System__PropertyAssignment_7_2_1_5 ) )
+                    {
+                    // InternalFormalML.g:6665:2: ( ( rule__System__PropertyAssignment_7_2_1_5 ) )
+                    // InternalFormalML.g:6666:3: ( rule__System__PropertyAssignment_7_2_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPropertyAssignment_7_2_1_5()); 
+                    }
+                    // InternalFormalML.g:6667:3: ( rule__System__PropertyAssignment_7_2_1_5 )
+                    // InternalFormalML.g:6667:4: rule__System__PropertyAssignment_7_2_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PropertyAssignment_7_2_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPropertyAssignment_7_2_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_7_2_1"
+
+
+    // $ANTLR start "rule__System__Alternatives_7_3_1"
+    // InternalFormalML.g:6675:1: rule__System__Alternatives_7_3_1 : ( ( ( rule__System__PortAssignment_7_3_1_0 ) ) | ( ( rule__System__SignalAssignment_7_3_1_1 ) ) | ( ( rule__System__BufferAssignment_7_3_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_3_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_3_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_3_1_5 ) ) );
+    public final void rule__System__Alternatives_7_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6679:1: ( ( ( rule__System__PortAssignment_7_3_1_0 ) ) | ( ( rule__System__SignalAssignment_7_3_1_1 ) ) | ( ( rule__System__BufferAssignment_7_3_1_2 ) ) | ( ( rule__System__ChannelAssignment_7_3_1_3 ) ) | ( ( rule__System__TypedefAssignment_7_3_1_4 ) ) | ( ( rule__System__PropertyAssignment_7_3_1_5 ) ) )
+            int alt15=6;
+            alt15 = dfa15.predict(input);
+            switch (alt15) {
+                case 1 :
+                    // InternalFormalML.g:6680:2: ( ( rule__System__PortAssignment_7_3_1_0 ) )
+                    {
+                    // InternalFormalML.g:6680:2: ( ( rule__System__PortAssignment_7_3_1_0 ) )
+                    // InternalFormalML.g:6681:3: ( rule__System__PortAssignment_7_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPortAssignment_7_3_1_0()); 
+                    }
+                    // InternalFormalML.g:6682:3: ( rule__System__PortAssignment_7_3_1_0 )
+                    // InternalFormalML.g:6682:4: rule__System__PortAssignment_7_3_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PortAssignment_7_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPortAssignment_7_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6686:2: ( ( rule__System__SignalAssignment_7_3_1_1 ) )
+                    {
+                    // InternalFormalML.g:6686:2: ( ( rule__System__SignalAssignment_7_3_1_1 ) )
+                    // InternalFormalML.g:6687:3: ( rule__System__SignalAssignment_7_3_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getSignalAssignment_7_3_1_1()); 
+                    }
+                    // InternalFormalML.g:6688:3: ( rule__System__SignalAssignment_7_3_1_1 )
+                    // InternalFormalML.g:6688:4: rule__System__SignalAssignment_7_3_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__SignalAssignment_7_3_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getSignalAssignment_7_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:6692:2: ( ( rule__System__BufferAssignment_7_3_1_2 ) )
+                    {
+                    // InternalFormalML.g:6692:2: ( ( rule__System__BufferAssignment_7_3_1_2 ) )
+                    // InternalFormalML.g:6693:3: ( rule__System__BufferAssignment_7_3_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getBufferAssignment_7_3_1_2()); 
+                    }
+                    // InternalFormalML.g:6694:3: ( rule__System__BufferAssignment_7_3_1_2 )
+                    // InternalFormalML.g:6694:4: rule__System__BufferAssignment_7_3_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__BufferAssignment_7_3_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getBufferAssignment_7_3_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:6698:2: ( ( rule__System__ChannelAssignment_7_3_1_3 ) )
+                    {
+                    // InternalFormalML.g:6698:2: ( ( rule__System__ChannelAssignment_7_3_1_3 ) )
+                    // InternalFormalML.g:6699:3: ( rule__System__ChannelAssignment_7_3_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getChannelAssignment_7_3_1_3()); 
+                    }
+                    // InternalFormalML.g:6700:3: ( rule__System__ChannelAssignment_7_3_1_3 )
+                    // InternalFormalML.g:6700:4: rule__System__ChannelAssignment_7_3_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__ChannelAssignment_7_3_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getChannelAssignment_7_3_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:6704:2: ( ( rule__System__TypedefAssignment_7_3_1_4 ) )
+                    {
+                    // InternalFormalML.g:6704:2: ( ( rule__System__TypedefAssignment_7_3_1_4 ) )
+                    // InternalFormalML.g:6705:3: ( rule__System__TypedefAssignment_7_3_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getTypedefAssignment_7_3_1_4()); 
+                    }
+                    // InternalFormalML.g:6706:3: ( rule__System__TypedefAssignment_7_3_1_4 )
+                    // InternalFormalML.g:6706:4: rule__System__TypedefAssignment_7_3_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__TypedefAssignment_7_3_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getTypedefAssignment_7_3_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:6710:2: ( ( rule__System__PropertyAssignment_7_3_1_5 ) )
+                    {
+                    // InternalFormalML.g:6710:2: ( ( rule__System__PropertyAssignment_7_3_1_5 ) )
+                    // InternalFormalML.g:6711:3: ( rule__System__PropertyAssignment_7_3_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getPropertyAssignment_7_3_1_5()); 
+                    }
+                    // InternalFormalML.g:6712:3: ( rule__System__PropertyAssignment_7_3_1_5 )
+                    // InternalFormalML.g:6712:4: rule__System__PropertyAssignment_7_3_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__PropertyAssignment_7_3_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getPropertyAssignment_7_3_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_7_3_1"
+
+
+    // $ANTLR start "rule__System__Alternatives_8"
+    // InternalFormalML.g:6720:1: rule__System__Alternatives_8 : ( ( ( rule__System__Alternatives_8_0 )* ) | ( ( ( rule__System__Alternatives_8_1 ) ) ( ( rule__System__Alternatives_8_1 )* ) ) );
+    public final void rule__System__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6724:1: ( ( ( rule__System__Alternatives_8_0 )* ) | ( ( ( rule__System__Alternatives_8_1 ) ) ( ( rule__System__Alternatives_8_1 )* ) ) )
+            int alt18=2;
+            int LA18_0 = input.LA(1);
+
+            if ( (LA18_0==EOF||(LA18_0>=35 && LA18_0<=38)||LA18_0==42||LA18_0==200||(LA18_0>=206 && LA18_0<=210)||(LA18_0>=221 && LA18_0<=222)||LA18_0==226) ) {
+                alt18=1;
+            }
+            else if ( (LA18_0==28||(LA18_0>=143 && LA18_0<=145)||LA18_0==214||(LA18_0>=224 && LA18_0<=225)) ) {
+                alt18=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 18, 0, input);
+
+                throw nvae;
+            }
+            switch (alt18) {
+                case 1 :
+                    // InternalFormalML.g:6725:2: ( ( rule__System__Alternatives_8_0 )* )
+                    {
+                    // InternalFormalML.g:6725:2: ( ( rule__System__Alternatives_8_0 )* )
+                    // InternalFormalML.g:6726:3: ( rule__System__Alternatives_8_0 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getAlternatives_8_0()); 
+                    }
+                    // InternalFormalML.g:6727:3: ( rule__System__Alternatives_8_0 )*
+                    loop16:
+                    do {
+                        int alt16=2;
+                        int LA16_0 = input.LA(1);
+
+                        if ( ((LA16_0>=35 && LA16_0<=36)||LA16_0==206) ) {
+                            alt16=1;
+                        }
+
+
+                        switch (alt16) {
+                    	case 1 :
+                    	    // InternalFormalML.g:6727:4: rule__System__Alternatives_8_0
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_4);
+                    	    rule__System__Alternatives_8_0();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop16;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getAlternatives_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6731:2: ( ( ( rule__System__Alternatives_8_1 ) ) ( ( rule__System__Alternatives_8_1 )* ) )
+                    {
+                    // InternalFormalML.g:6731:2: ( ( ( rule__System__Alternatives_8_1 ) ) ( ( rule__System__Alternatives_8_1 )* ) )
+                    // InternalFormalML.g:6732:3: ( ( rule__System__Alternatives_8_1 ) ) ( ( rule__System__Alternatives_8_1 )* )
+                    {
+                    // InternalFormalML.g:6732:3: ( ( rule__System__Alternatives_8_1 ) )
+                    // InternalFormalML.g:6733:4: ( rule__System__Alternatives_8_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getAlternatives_8_1()); 
+                    }
+                    // InternalFormalML.g:6734:4: ( rule__System__Alternatives_8_1 )
+                    // InternalFormalML.g:6734:5: rule__System__Alternatives_8_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_5);
+                    rule__System__Alternatives_8_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getAlternatives_8_1()); 
+                    }
+
+                    }
+
+                    // InternalFormalML.g:6737:3: ( ( rule__System__Alternatives_8_1 )* )
+                    // InternalFormalML.g:6738:4: ( rule__System__Alternatives_8_1 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getAlternatives_8_1()); 
+                    }
+                    // InternalFormalML.g:6739:4: ( rule__System__Alternatives_8_1 )*
+                    loop17:
+                    do {
+                        int alt17=2;
+                        int LA17_0 = input.LA(1);
+
+                        if ( (LA17_0==28||(LA17_0>=143 && LA17_0<=145)||LA17_0==214||(LA17_0>=224 && LA17_0<=225)) ) {
+                            alt17=1;
+                        }
+
+
+                        switch (alt17) {
+                    	case 1 :
+                    	    // InternalFormalML.g:6739:5: rule__System__Alternatives_8_1
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_5);
+                    	    rule__System__Alternatives_8_1();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop17;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getAlternatives_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_8"
+
+
+    // $ANTLR start "rule__System__Alternatives_8_0"
+    // InternalFormalML.g:6748:1: rule__System__Alternatives_8_0 : ( ( ( rule__System__Group_8_0_0__0 ) ) | ( ( rule__System__Group_8_0_1__0 ) ) );
+    public final void rule__System__Alternatives_8_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6752:1: ( ( ( rule__System__Group_8_0_0__0 ) ) | ( ( rule__System__Group_8_0_1__0 ) ) )
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( ((LA19_0>=35 && LA19_0<=36)) ) {
+                alt19=1;
+            }
+            else if ( (LA19_0==206) ) {
+                alt19=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 19, 0, input);
+
+                throw nvae;
+            }
+            switch (alt19) {
+                case 1 :
+                    // InternalFormalML.g:6753:2: ( ( rule__System__Group_8_0_0__0 ) )
+                    {
+                    // InternalFormalML.g:6753:2: ( ( rule__System__Group_8_0_0__0 ) )
+                    // InternalFormalML.g:6754:3: ( rule__System__Group_8_0_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_8_0_0()); 
+                    }
+                    // InternalFormalML.g:6755:3: ( rule__System__Group_8_0_0__0 )
+                    // InternalFormalML.g:6755:4: rule__System__Group_8_0_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_8_0_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_8_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6759:2: ( ( rule__System__Group_8_0_1__0 ) )
+                    {
+                    // InternalFormalML.g:6759:2: ( ( rule__System__Group_8_0_1__0 ) )
+                    // InternalFormalML.g:6760:3: ( rule__System__Group_8_0_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_8_0_1()); 
+                    }
+                    // InternalFormalML.g:6761:3: ( rule__System__Group_8_0_1__0 )
+                    // InternalFormalML.g:6761:4: rule__System__Group_8_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_8_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_8_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_8_0"
+
+
+    // $ANTLR start "rule__System__Alternatives_8_0_0_0"
+    // InternalFormalML.g:6769:1: rule__System__Alternatives_8_0_0_0 : ( ( '@routine:' ) | ( '@macro:' ) );
+    public final void rule__System__Alternatives_8_0_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6773:1: ( ( '@routine:' ) | ( '@macro:' ) )
+            int alt20=2;
+            int LA20_0 = input.LA(1);
+
+            if ( (LA20_0==35) ) {
+                alt20=1;
+            }
+            else if ( (LA20_0==36) ) {
+                alt20=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 20, 0, input);
+
+                throw nvae;
+            }
+            switch (alt20) {
+                case 1 :
+                    // InternalFormalML.g:6774:2: ( '@routine:' )
+                    {
+                    // InternalFormalML.g:6774:2: ( '@routine:' )
+                    // InternalFormalML.g:6775:3: '@routine:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getRoutineKeyword_8_0_0_0_0()); 
+                    }
+                    match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getRoutineKeyword_8_0_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6780:2: ( '@macro:' )
+                    {
+                    // InternalFormalML.g:6780:2: ( '@macro:' )
+                    // InternalFormalML.g:6781:3: '@macro:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getMacroKeyword_8_0_0_0_1()); 
+                    }
+                    match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getMacroKeyword_8_0_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_8_0_0_0"
+
+
+    // $ANTLR start "rule__System__Alternatives_8_1"
+    // InternalFormalML.g:6790:1: rule__System__Alternatives_8_1 : ( ( ( rule__System__RoutineAssignment_8_1_0 ) ) | ( ( rule__System__ProcedureAssignment_8_1_1 ) ) );
+    public final void rule__System__Alternatives_8_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6794:1: ( ( ( rule__System__RoutineAssignment_8_1_0 ) ) | ( ( rule__System__ProcedureAssignment_8_1_1 ) ) )
+            int alt21=2;
+            switch ( input.LA(1) ) {
+            case 143:
+                {
+                int LA21_1 = input.LA(2);
+
+                if ( (LA21_1==214) ) {
+                    alt21=2;
+                }
+                else if ( ((LA21_1>=224 && LA21_1<=225)) ) {
+                    alt21=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 21, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 144:
+                {
+                int LA21_2 = input.LA(2);
+
+                if ( ((LA21_2>=224 && LA21_2<=225)) ) {
+                    alt21=1;
+                }
+                else if ( (LA21_2==214) ) {
+                    alt21=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 21, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 145:
+                {
+                int LA21_3 = input.LA(2);
+
+                if ( ((LA21_3>=224 && LA21_3<=225)) ) {
+                    alt21=1;
+                }
+                else if ( (LA21_3==214) ) {
+                    alt21=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 21, 3, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 28:
+                {
+                int LA21_4 = input.LA(2);
+
+                if ( (LA21_4==214) ) {
+                    alt21=2;
+                }
+                else if ( ((LA21_4>=224 && LA21_4<=225)) ) {
+                    alt21=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 21, 4, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 224:
+            case 225:
+                {
+                alt21=1;
+                }
+                break;
+            case 214:
+                {
+                alt21=2;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 21, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt21) {
+                case 1 :
+                    // InternalFormalML.g:6795:2: ( ( rule__System__RoutineAssignment_8_1_0 ) )
+                    {
+                    // InternalFormalML.g:6795:2: ( ( rule__System__RoutineAssignment_8_1_0 ) )
+                    // InternalFormalML.g:6796:3: ( rule__System__RoutineAssignment_8_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getRoutineAssignment_8_1_0()); 
+                    }
+                    // InternalFormalML.g:6797:3: ( rule__System__RoutineAssignment_8_1_0 )
+                    // InternalFormalML.g:6797:4: rule__System__RoutineAssignment_8_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__RoutineAssignment_8_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getRoutineAssignment_8_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6801:2: ( ( rule__System__ProcedureAssignment_8_1_1 ) )
+                    {
+                    // InternalFormalML.g:6801:2: ( ( rule__System__ProcedureAssignment_8_1_1 ) )
+                    // InternalFormalML.g:6802:3: ( rule__System__ProcedureAssignment_8_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getProcedureAssignment_8_1_1()); 
+                    }
+                    // InternalFormalML.g:6803:3: ( rule__System__ProcedureAssignment_8_1_1 )
+                    // InternalFormalML.g:6803:4: rule__System__ProcedureAssignment_8_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__ProcedureAssignment_8_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getProcedureAssignment_8_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_8_1"
+
+
+    // $ANTLR start "rule__System__Alternatives_9"
+    // InternalFormalML.g:6811:1: rule__System__Alternatives_9 : ( ( ( rule__System__Group_9_0__0 ) ) | ( ( rule__System__Group_9_1__0 ) ) | ( ( rule__System__Group_9_2__0 ) ) | ( ( rule__System__Group_9_3__0 ) ) );
+    public final void rule__System__Alternatives_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6815:1: ( ( ( rule__System__Group_9_0__0 ) ) | ( ( rule__System__Group_9_1__0 ) ) | ( ( rule__System__Group_9_2__0 ) ) | ( ( rule__System__Group_9_3__0 ) ) )
+            int alt22=4;
+            switch ( input.LA(1) ) {
+            case 37:
+            case 38:
+                {
+                alt22=1;
+                }
+                break;
+            case 207:
+                {
+                alt22=2;
+                }
+                break;
+            case 208:
+                {
+                alt22=3;
+                }
+                break;
+            case 209:
+                {
+                alt22=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 22, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt22) {
+                case 1 :
+                    // InternalFormalML.g:6816:2: ( ( rule__System__Group_9_0__0 ) )
+                    {
+                    // InternalFormalML.g:6816:2: ( ( rule__System__Group_9_0__0 ) )
+                    // InternalFormalML.g:6817:3: ( rule__System__Group_9_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_9_0()); 
+                    }
+                    // InternalFormalML.g:6818:3: ( rule__System__Group_9_0__0 )
+                    // InternalFormalML.g:6818:4: rule__System__Group_9_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_9_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_9_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6822:2: ( ( rule__System__Group_9_1__0 ) )
+                    {
+                    // InternalFormalML.g:6822:2: ( ( rule__System__Group_9_1__0 ) )
+                    // InternalFormalML.g:6823:3: ( rule__System__Group_9_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_9_1()); 
+                    }
+                    // InternalFormalML.g:6824:3: ( rule__System__Group_9_1__0 )
+                    // InternalFormalML.g:6824:4: rule__System__Group_9_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_9_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_9_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:6828:2: ( ( rule__System__Group_9_2__0 ) )
+                    {
+                    // InternalFormalML.g:6828:2: ( ( rule__System__Group_9_2__0 ) )
+                    // InternalFormalML.g:6829:3: ( rule__System__Group_9_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_9_2()); 
+                    }
+                    // InternalFormalML.g:6830:3: ( rule__System__Group_9_2__0 )
+                    // InternalFormalML.g:6830:4: rule__System__Group_9_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_9_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_9_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:6834:2: ( ( rule__System__Group_9_3__0 ) )
+                    {
+                    // InternalFormalML.g:6834:2: ( ( rule__System__Group_9_3__0 ) )
+                    // InternalFormalML.g:6835:3: ( rule__System__Group_9_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_9_3()); 
+                    }
+                    // InternalFormalML.g:6836:3: ( rule__System__Group_9_3__0 )
+                    // InternalFormalML.g:6836:4: rule__System__Group_9_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_9_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_9_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_9"
+
+
+    // $ANTLR start "rule__System__Alternatives_9_0_0"
+    // InternalFormalML.g:6844:1: rule__System__Alternatives_9_0_0 : ( ( '@composite:' ) | ( '@machine:' ) );
+    public final void rule__System__Alternatives_9_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6848:1: ( ( '@composite:' ) | ( '@machine:' ) )
+            int alt23=2;
+            int LA23_0 = input.LA(1);
+
+            if ( (LA23_0==37) ) {
+                alt23=1;
+            }
+            else if ( (LA23_0==38) ) {
+                alt23=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 23, 0, input);
+
+                throw nvae;
+            }
+            switch (alt23) {
+                case 1 :
+                    // InternalFormalML.g:6849:2: ( '@composite:' )
+                    {
+                    // InternalFormalML.g:6849:2: ( '@composite:' )
+                    // InternalFormalML.g:6850:3: '@composite:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getCompositeKeyword_9_0_0_0()); 
+                    }
+                    match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getCompositeKeyword_9_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6855:2: ( '@machine:' )
+                    {
+                    // InternalFormalML.g:6855:2: ( '@machine:' )
+                    // InternalFormalML.g:6856:3: '@machine:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getMachineKeyword_9_0_0_1()); 
+                    }
+                    match(input,38,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getMachineKeyword_9_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_9_0_0"
+
+
+    // $ANTLR start "rule__System__Alternatives_9_0_1"
+    // InternalFormalML.g:6865:1: rule__System__Alternatives_9_0_1 : ( ( ( rule__System__MachineAssignment_9_0_1_0 ) ) | ( ( rule__System__InstanceAssignment_9_0_1_1 ) ) );
+    public final void rule__System__Alternatives_9_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6869:1: ( ( ( rule__System__MachineAssignment_9_0_1_0 ) ) | ( ( rule__System__InstanceAssignment_9_0_1_1 ) ) )
+            int alt24=2;
+            int LA24_0 = input.LA(1);
+
+            if ( (LA24_0==28||(LA24_0>=39 && LA24_0<=40)||(LA24_0>=143 && LA24_0<=147)||(LA24_0>=273 && LA24_0<=274)) ) {
+                alt24=1;
+            }
+            else if ( (LA24_0==211) ) {
+                alt24=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 24, 0, input);
+
+                throw nvae;
+            }
+            switch (alt24) {
+                case 1 :
+                    // InternalFormalML.g:6870:2: ( ( rule__System__MachineAssignment_9_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:6870:2: ( ( rule__System__MachineAssignment_9_0_1_0 ) )
+                    // InternalFormalML.g:6871:3: ( rule__System__MachineAssignment_9_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getMachineAssignment_9_0_1_0()); 
+                    }
+                    // InternalFormalML.g:6872:3: ( rule__System__MachineAssignment_9_0_1_0 )
+                    // InternalFormalML.g:6872:4: rule__System__MachineAssignment_9_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__MachineAssignment_9_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getMachineAssignment_9_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6876:2: ( ( rule__System__InstanceAssignment_9_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:6876:2: ( ( rule__System__InstanceAssignment_9_0_1_1 ) )
+                    // InternalFormalML.g:6877:3: ( rule__System__InstanceAssignment_9_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getInstanceAssignment_9_0_1_1()); 
+                    }
+                    // InternalFormalML.g:6878:3: ( rule__System__InstanceAssignment_9_0_1_1 )
+                    // InternalFormalML.g:6878:4: rule__System__InstanceAssignment_9_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__InstanceAssignment_9_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getInstanceAssignment_9_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_9_0_1"
+
+
+    // $ANTLR start "rule__System__Alternatives_10"
+    // InternalFormalML.g:6886:1: rule__System__Alternatives_10 : ( ( ( rule__System__Group_10_0__0 ) ) | ( ( rule__System__Group_10_1__0 ) ) );
+    public final void rule__System__Alternatives_10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6890:1: ( ( ( rule__System__Group_10_0__0 ) ) | ( ( rule__System__Group_10_1__0 ) ) )
+            int alt25=2;
+            int LA25_0 = input.LA(1);
+
+            if ( (LA25_0==210) ) {
+                alt25=1;
+            }
+            else if ( (LA25_0==42) ) {
+                alt25=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 25, 0, input);
+
+                throw nvae;
+            }
+            switch (alt25) {
+                case 1 :
+                    // InternalFormalML.g:6891:2: ( ( rule__System__Group_10_0__0 ) )
+                    {
+                    // InternalFormalML.g:6891:2: ( ( rule__System__Group_10_0__0 ) )
+                    // InternalFormalML.g:6892:3: ( rule__System__Group_10_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_10_0()); 
+                    }
+                    // InternalFormalML.g:6893:3: ( rule__System__Group_10_0__0 )
+                    // InternalFormalML.g:6893:4: rule__System__Group_10_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_10_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_10_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6897:2: ( ( rule__System__Group_10_1__0 ) )
+                    {
+                    // InternalFormalML.g:6897:2: ( ( rule__System__Group_10_1__0 ) )
+                    // InternalFormalML.g:6898:3: ( rule__System__Group_10_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getGroup_10_1()); 
+                    }
+                    // InternalFormalML.g:6899:3: ( rule__System__Group_10_1__0 )
+                    // InternalFormalML.g:6899:4: rule__System__Group_10_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_10_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getGroup_10_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Alternatives_10"
+
+
+    // $ANTLR start "rule__AnyMachineBlock__Alternatives"
+    // InternalFormalML.g:6907:1: rule__AnyMachineBlock__Alternatives : ( ( ruleMachineBlock ) | ( ruleStatemachine ) );
+    public final void rule__AnyMachineBlock__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6911:1: ( ( ruleMachineBlock ) | ( ruleStatemachine ) )
+            int alt26=2;
+            alt26 = dfa26.predict(input);
+            switch (alt26) {
+                case 1 :
+                    // InternalFormalML.g:6912:2: ( ruleMachineBlock )
+                    {
+                    // InternalFormalML.g:6912:2: ( ruleMachineBlock )
+                    // InternalFormalML.g:6913:3: ruleMachineBlock
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAnyMachineBlockAccess().getMachineBlockParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleMachineBlock();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAnyMachineBlockAccess().getMachineBlockParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6918:2: ( ruleStatemachine )
+                    {
+                    // InternalFormalML.g:6918:2: ( ruleStatemachine )
+                    // InternalFormalML.g:6919:3: ruleStatemachine
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAnyMachineBlockAccess().getStatemachineParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleStatemachine();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAnyMachineBlockAccess().getStatemachineParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AnyMachineBlock__Alternatives"
+
+
+    // $ANTLR start "rule__InstanceMachine__Alternatives_1"
+    // InternalFormalML.g:6928:1: rule__InstanceMachine__Alternatives_1 : ( ( 'machine' ) | ( 'statemachine' ) );
+    public final void rule__InstanceMachine__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6932:1: ( ( 'machine' ) | ( 'statemachine' ) )
+            int alt27=2;
+            int LA27_0 = input.LA(1);
+
+            if ( (LA27_0==39) ) {
+                alt27=1;
+            }
+            else if ( (LA27_0==40) ) {
+                alt27=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 27, 0, input);
+
+                throw nvae;
+            }
+            switch (alt27) {
+                case 1 :
+                    // InternalFormalML.g:6933:2: ( 'machine' )
+                    {
+                    // InternalFormalML.g:6933:2: ( 'machine' )
+                    // InternalFormalML.g:6934:3: 'machine'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInstanceMachineAccess().getMachineKeyword_1_0()); 
+                    }
+                    match(input,39,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInstanceMachineAccess().getMachineKeyword_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6939:2: ( 'statemachine' )
+                    {
+                    // InternalFormalML.g:6939:2: ( 'statemachine' )
+                    // InternalFormalML.g:6940:3: 'statemachine'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInstanceMachineAccess().getStatemachineKeyword_1_1()); 
+                    }
+                    match(input,40,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInstanceMachineAccess().getStatemachineKeyword_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Alternatives_1"
+
+
+    // $ANTLR start "rule__InstanceMachine__Alternatives_8"
+    // InternalFormalML.g:6949:1: rule__InstanceMachine__Alternatives_8 : ( ( ( rule__InstanceMachine__Group_8_0__0 ) ) | ( ( rule__InstanceMachine__Group_8_1__0 ) ) );
+    public final void rule__InstanceMachine__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6953:1: ( ( ( rule__InstanceMachine__Group_8_0__0 ) ) | ( ( rule__InstanceMachine__Group_8_1__0 ) ) )
+            int alt28=2;
+            int LA28_0 = input.LA(1);
+
+            if ( (LA28_0==23||LA28_0==45) ) {
+                alt28=1;
+            }
+            else if ( (LA28_0==199) ) {
+                alt28=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 28, 0, input);
+
+                throw nvae;
+            }
+            switch (alt28) {
+                case 1 :
+                    // InternalFormalML.g:6954:2: ( ( rule__InstanceMachine__Group_8_0__0 ) )
+                    {
+                    // InternalFormalML.g:6954:2: ( ( rule__InstanceMachine__Group_8_0__0 ) )
+                    // InternalFormalML.g:6955:3: ( rule__InstanceMachine__Group_8_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInstanceMachineAccess().getGroup_8_0()); 
+                    }
+                    // InternalFormalML.g:6956:3: ( rule__InstanceMachine__Group_8_0__0 )
+                    // InternalFormalML.g:6956:4: rule__InstanceMachine__Group_8_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InstanceMachine__Group_8_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInstanceMachineAccess().getGroup_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6960:2: ( ( rule__InstanceMachine__Group_8_1__0 ) )
+                    {
+                    // InternalFormalML.g:6960:2: ( ( rule__InstanceMachine__Group_8_1__0 ) )
+                    // InternalFormalML.g:6961:3: ( rule__InstanceMachine__Group_8_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInstanceMachineAccess().getGroup_8_1()); 
+                    }
+                    // InternalFormalML.g:6962:3: ( rule__InstanceMachine__Group_8_1__0 )
+                    // InternalFormalML.g:6962:4: rule__InstanceMachine__Group_8_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InstanceMachine__Group_8_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInstanceMachineAccess().getGroup_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Alternatives_8"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_0_1"
+    // InternalFormalML.g:6970:1: rule__MachineBlock__Alternatives_0_1 : ( ( ( rule__MachineBlock__TimedAssignment_0_1_0 ) ) | ( ( rule__MachineBlock__Input_enabledAssignment_0_1_1 ) ) );
+    public final void rule__MachineBlock__Alternatives_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6974:1: ( ( ( rule__MachineBlock__TimedAssignment_0_1_0 ) ) | ( ( rule__MachineBlock__Input_enabledAssignment_0_1_1 ) ) )
+            int alt29=2;
+            int LA29_0 = input.LA(1);
+
+            if ( (LA29_0==273) ) {
+                alt29=1;
+            }
+            else if ( (LA29_0==274) ) {
+                alt29=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 29, 0, input);
+
+                throw nvae;
+            }
+            switch (alt29) {
+                case 1 :
+                    // InternalFormalML.g:6975:2: ( ( rule__MachineBlock__TimedAssignment_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:6975:2: ( ( rule__MachineBlock__TimedAssignment_0_1_0 ) )
+                    // InternalFormalML.g:6976:3: ( rule__MachineBlock__TimedAssignment_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getTimedAssignment_0_1_0()); 
+                    }
+                    // InternalFormalML.g:6977:3: ( rule__MachineBlock__TimedAssignment_0_1_0 )
+                    // InternalFormalML.g:6977:4: rule__MachineBlock__TimedAssignment_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__TimedAssignment_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getTimedAssignment_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6981:2: ( ( rule__MachineBlock__Input_enabledAssignment_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:6981:2: ( ( rule__MachineBlock__Input_enabledAssignment_0_1_1 ) )
+                    // InternalFormalML.g:6982:3: ( rule__MachineBlock__Input_enabledAssignment_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getInput_enabledAssignment_0_1_1()); 
+                    }
+                    // InternalFormalML.g:6983:3: ( rule__MachineBlock__Input_enabledAssignment_0_1_1 )
+                    // InternalFormalML.g:6983:4: rule__MachineBlock__Input_enabledAssignment_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Input_enabledAssignment_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getInput_enabledAssignment_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_0_1"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_2_2"
+    // InternalFormalML.g:6991:1: rule__MachineBlock__Alternatives_2_2 : ( ( 'and' ) | ( 'or' ) );
+    public final void rule__MachineBlock__Alternatives_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:6995:1: ( ( 'and' ) | ( 'or' ) )
+            int alt30=2;
+            int LA30_0 = input.LA(1);
+
+            if ( (LA30_0==33) ) {
+                alt30=1;
+            }
+            else if ( (LA30_0==34) ) {
+                alt30=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 30, 0, input);
+
+                throw nvae;
+            }
+            switch (alt30) {
+                case 1 :
+                    // InternalFormalML.g:6996:2: ( 'and' )
+                    {
+                    // InternalFormalML.g:6996:2: ( 'and' )
+                    // InternalFormalML.g:6997:3: 'and'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getAndKeyword_2_2_0()); 
+                    }
+                    match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getAndKeyword_2_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7002:2: ( 'or' )
+                    {
+                    // InternalFormalML.g:7002:2: ( 'or' )
+                    // InternalFormalML.g:7003:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getOrKeyword_2_2_1()); 
+                    }
+                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getOrKeyword_2_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_2_2"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_6"
+    // InternalFormalML.g:7012:1: rule__MachineBlock__Alternatives_6 : ( ( ( rule__MachineBlock__PortAssignment_6_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_6_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_6_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_6_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_6_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_6_5 ) ) );
+    public final void rule__MachineBlock__Alternatives_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7016:1: ( ( ( rule__MachineBlock__PortAssignment_6_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_6_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_6_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_6_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_6_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_6_5 ) ) )
+            int alt31=6;
+            alt31 = dfa31.predict(input);
+            switch (alt31) {
+                case 1 :
+                    // InternalFormalML.g:7017:2: ( ( rule__MachineBlock__PortAssignment_6_0 ) )
+                    {
+                    // InternalFormalML.g:7017:2: ( ( rule__MachineBlock__PortAssignment_6_0 ) )
+                    // InternalFormalML.g:7018:3: ( rule__MachineBlock__PortAssignment_6_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPortAssignment_6_0()); 
+                    }
+                    // InternalFormalML.g:7019:3: ( rule__MachineBlock__PortAssignment_6_0 )
+                    // InternalFormalML.g:7019:4: rule__MachineBlock__PortAssignment_6_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PortAssignment_6_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPortAssignment_6_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7023:2: ( ( rule__MachineBlock__SignalAssignment_6_1 ) )
+                    {
+                    // InternalFormalML.g:7023:2: ( ( rule__MachineBlock__SignalAssignment_6_1 ) )
+                    // InternalFormalML.g:7024:3: ( rule__MachineBlock__SignalAssignment_6_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getSignalAssignment_6_1()); 
+                    }
+                    // InternalFormalML.g:7025:3: ( rule__MachineBlock__SignalAssignment_6_1 )
+                    // InternalFormalML.g:7025:4: rule__MachineBlock__SignalAssignment_6_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__SignalAssignment_6_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getSignalAssignment_6_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7029:2: ( ( rule__MachineBlock__BufferAssignment_6_2 ) )
+                    {
+                    // InternalFormalML.g:7029:2: ( ( rule__MachineBlock__BufferAssignment_6_2 ) )
+                    // InternalFormalML.g:7030:3: ( rule__MachineBlock__BufferAssignment_6_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getBufferAssignment_6_2()); 
+                    }
+                    // InternalFormalML.g:7031:3: ( rule__MachineBlock__BufferAssignment_6_2 )
+                    // InternalFormalML.g:7031:4: rule__MachineBlock__BufferAssignment_6_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__BufferAssignment_6_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getBufferAssignment_6_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7035:2: ( ( rule__MachineBlock__ChannelAssignment_6_3 ) )
+                    {
+                    // InternalFormalML.g:7035:2: ( ( rule__MachineBlock__ChannelAssignment_6_3 ) )
+                    // InternalFormalML.g:7036:3: ( rule__MachineBlock__ChannelAssignment_6_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getChannelAssignment_6_3()); 
+                    }
+                    // InternalFormalML.g:7037:3: ( rule__MachineBlock__ChannelAssignment_6_3 )
+                    // InternalFormalML.g:7037:4: rule__MachineBlock__ChannelAssignment_6_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__ChannelAssignment_6_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getChannelAssignment_6_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7041:2: ( ( rule__MachineBlock__TypedefAssignment_6_4 ) )
+                    {
+                    // InternalFormalML.g:7041:2: ( ( rule__MachineBlock__TypedefAssignment_6_4 ) )
+                    // InternalFormalML.g:7042:3: ( rule__MachineBlock__TypedefAssignment_6_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_6_4()); 
+                    }
+                    // InternalFormalML.g:7043:3: ( rule__MachineBlock__TypedefAssignment_6_4 )
+                    // InternalFormalML.g:7043:4: rule__MachineBlock__TypedefAssignment_6_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__TypedefAssignment_6_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_6_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7047:2: ( ( rule__MachineBlock__PropertyAssignment_6_5 ) )
+                    {
+                    // InternalFormalML.g:7047:2: ( ( rule__MachineBlock__PropertyAssignment_6_5 ) )
+                    // InternalFormalML.g:7048:3: ( rule__MachineBlock__PropertyAssignment_6_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_6_5()); 
+                    }
+                    // InternalFormalML.g:7049:3: ( rule__MachineBlock__PropertyAssignment_6_5 )
+                    // InternalFormalML.g:7049:4: rule__MachineBlock__PropertyAssignment_6_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PropertyAssignment_6_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_6_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_6"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_7"
+    // InternalFormalML.g:7057:1: rule__MachineBlock__Alternatives_7 : ( ( ( rule__MachineBlock__Group_7_0__0 ) ) | ( ( rule__MachineBlock__Group_7_1__0 ) ) | ( ( rule__MachineBlock__Group_7_2__0 ) ) | ( ( rule__MachineBlock__Group_7_3__0 ) ) );
+    public final void rule__MachineBlock__Alternatives_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7061:1: ( ( ( rule__MachineBlock__Group_7_0__0 ) ) | ( ( rule__MachineBlock__Group_7_1__0 ) ) | ( ( rule__MachineBlock__Group_7_2__0 ) ) | ( ( rule__MachineBlock__Group_7_3__0 ) ) )
+            int alt32=4;
+            switch ( input.LA(1) ) {
+            case 202:
+                {
+                alt32=1;
+                }
+                break;
+            case 203:
+                {
+                alt32=2;
+                }
+                break;
+            case 204:
+                {
+                alt32=3;
+                }
+                break;
+            case 205:
+                {
+                alt32=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 32, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt32) {
+                case 1 :
+                    // InternalFormalML.g:7062:2: ( ( rule__MachineBlock__Group_7_0__0 ) )
+                    {
+                    // InternalFormalML.g:7062:2: ( ( rule__MachineBlock__Group_7_0__0 ) )
+                    // InternalFormalML.g:7063:3: ( rule__MachineBlock__Group_7_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_7_0()); 
+                    }
+                    // InternalFormalML.g:7064:3: ( rule__MachineBlock__Group_7_0__0 )
+                    // InternalFormalML.g:7064:4: rule__MachineBlock__Group_7_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_7_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_7_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7068:2: ( ( rule__MachineBlock__Group_7_1__0 ) )
+                    {
+                    // InternalFormalML.g:7068:2: ( ( rule__MachineBlock__Group_7_1__0 ) )
+                    // InternalFormalML.g:7069:3: ( rule__MachineBlock__Group_7_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_7_1()); 
+                    }
+                    // InternalFormalML.g:7070:3: ( rule__MachineBlock__Group_7_1__0 )
+                    // InternalFormalML.g:7070:4: rule__MachineBlock__Group_7_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_7_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_7_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7074:2: ( ( rule__MachineBlock__Group_7_2__0 ) )
+                    {
+                    // InternalFormalML.g:7074:2: ( ( rule__MachineBlock__Group_7_2__0 ) )
+                    // InternalFormalML.g:7075:3: ( rule__MachineBlock__Group_7_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_7_2()); 
+                    }
+                    // InternalFormalML.g:7076:3: ( rule__MachineBlock__Group_7_2__0 )
+                    // InternalFormalML.g:7076:4: rule__MachineBlock__Group_7_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_7_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_7_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7080:2: ( ( rule__MachineBlock__Group_7_3__0 ) )
+                    {
+                    // InternalFormalML.g:7080:2: ( ( rule__MachineBlock__Group_7_3__0 ) )
+                    // InternalFormalML.g:7081:3: ( rule__MachineBlock__Group_7_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_7_3()); 
+                    }
+                    // InternalFormalML.g:7082:3: ( rule__MachineBlock__Group_7_3__0 )
+                    // InternalFormalML.g:7082:4: rule__MachineBlock__Group_7_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_7_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_7_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_7"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_7_0_1"
+    // InternalFormalML.g:7090:1: rule__MachineBlock__Alternatives_7_0_1 : ( ( ( rule__MachineBlock__PortAssignment_7_0_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_0_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_0_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_0_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_0_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_0_1_5 ) ) );
+    public final void rule__MachineBlock__Alternatives_7_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7094:1: ( ( ( rule__MachineBlock__PortAssignment_7_0_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_0_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_0_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_0_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_0_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_0_1_5 ) ) )
+            int alt33=6;
+            alt33 = dfa33.predict(input);
+            switch (alt33) {
+                case 1 :
+                    // InternalFormalML.g:7095:2: ( ( rule__MachineBlock__PortAssignment_7_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:7095:2: ( ( rule__MachineBlock__PortAssignment_7_0_1_0 ) )
+                    // InternalFormalML.g:7096:3: ( rule__MachineBlock__PortAssignment_7_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPortAssignment_7_0_1_0()); 
+                    }
+                    // InternalFormalML.g:7097:3: ( rule__MachineBlock__PortAssignment_7_0_1_0 )
+                    // InternalFormalML.g:7097:4: rule__MachineBlock__PortAssignment_7_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PortAssignment_7_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPortAssignment_7_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7101:2: ( ( rule__MachineBlock__SignalAssignment_7_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:7101:2: ( ( rule__MachineBlock__SignalAssignment_7_0_1_1 ) )
+                    // InternalFormalML.g:7102:3: ( rule__MachineBlock__SignalAssignment_7_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_0_1_1()); 
+                    }
+                    // InternalFormalML.g:7103:3: ( rule__MachineBlock__SignalAssignment_7_0_1_1 )
+                    // InternalFormalML.g:7103:4: rule__MachineBlock__SignalAssignment_7_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__SignalAssignment_7_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7107:2: ( ( rule__MachineBlock__BufferAssignment_7_0_1_2 ) )
+                    {
+                    // InternalFormalML.g:7107:2: ( ( rule__MachineBlock__BufferAssignment_7_0_1_2 ) )
+                    // InternalFormalML.g:7108:3: ( rule__MachineBlock__BufferAssignment_7_0_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_0_1_2()); 
+                    }
+                    // InternalFormalML.g:7109:3: ( rule__MachineBlock__BufferAssignment_7_0_1_2 )
+                    // InternalFormalML.g:7109:4: rule__MachineBlock__BufferAssignment_7_0_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__BufferAssignment_7_0_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_0_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7113:2: ( ( rule__MachineBlock__ChannelAssignment_7_0_1_3 ) )
+                    {
+                    // InternalFormalML.g:7113:2: ( ( rule__MachineBlock__ChannelAssignment_7_0_1_3 ) )
+                    // InternalFormalML.g:7114:3: ( rule__MachineBlock__ChannelAssignment_7_0_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_0_1_3()); 
+                    }
+                    // InternalFormalML.g:7115:3: ( rule__MachineBlock__ChannelAssignment_7_0_1_3 )
+                    // InternalFormalML.g:7115:4: rule__MachineBlock__ChannelAssignment_7_0_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__ChannelAssignment_7_0_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_0_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7119:2: ( ( rule__MachineBlock__TypedefAssignment_7_0_1_4 ) )
+                    {
+                    // InternalFormalML.g:7119:2: ( ( rule__MachineBlock__TypedefAssignment_7_0_1_4 ) )
+                    // InternalFormalML.g:7120:3: ( rule__MachineBlock__TypedefAssignment_7_0_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_0_1_4()); 
+                    }
+                    // InternalFormalML.g:7121:3: ( rule__MachineBlock__TypedefAssignment_7_0_1_4 )
+                    // InternalFormalML.g:7121:4: rule__MachineBlock__TypedefAssignment_7_0_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__TypedefAssignment_7_0_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_0_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7125:2: ( ( rule__MachineBlock__PropertyAssignment_7_0_1_5 ) )
+                    {
+                    // InternalFormalML.g:7125:2: ( ( rule__MachineBlock__PropertyAssignment_7_0_1_5 ) )
+                    // InternalFormalML.g:7126:3: ( rule__MachineBlock__PropertyAssignment_7_0_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_0_1_5()); 
+                    }
+                    // InternalFormalML.g:7127:3: ( rule__MachineBlock__PropertyAssignment_7_0_1_5 )
+                    // InternalFormalML.g:7127:4: rule__MachineBlock__PropertyAssignment_7_0_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PropertyAssignment_7_0_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_0_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_7_0_1"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_7_1_1"
+    // InternalFormalML.g:7135:1: rule__MachineBlock__Alternatives_7_1_1 : ( ( ( rule__MachineBlock__PortAssignment_7_1_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_1_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_1_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_1_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_1_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_1_1_5 ) ) );
+    public final void rule__MachineBlock__Alternatives_7_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7139:1: ( ( ( rule__MachineBlock__PortAssignment_7_1_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_1_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_1_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_1_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_1_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_1_1_5 ) ) )
+            int alt34=6;
+            alt34 = dfa34.predict(input);
+            switch (alt34) {
+                case 1 :
+                    // InternalFormalML.g:7140:2: ( ( rule__MachineBlock__PortAssignment_7_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:7140:2: ( ( rule__MachineBlock__PortAssignment_7_1_1_0 ) )
+                    // InternalFormalML.g:7141:3: ( rule__MachineBlock__PortAssignment_7_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPortAssignment_7_1_1_0()); 
+                    }
+                    // InternalFormalML.g:7142:3: ( rule__MachineBlock__PortAssignment_7_1_1_0 )
+                    // InternalFormalML.g:7142:4: rule__MachineBlock__PortAssignment_7_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PortAssignment_7_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPortAssignment_7_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7146:2: ( ( rule__MachineBlock__SignalAssignment_7_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:7146:2: ( ( rule__MachineBlock__SignalAssignment_7_1_1_1 ) )
+                    // InternalFormalML.g:7147:3: ( rule__MachineBlock__SignalAssignment_7_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_1_1_1()); 
+                    }
+                    // InternalFormalML.g:7148:3: ( rule__MachineBlock__SignalAssignment_7_1_1_1 )
+                    // InternalFormalML.g:7148:4: rule__MachineBlock__SignalAssignment_7_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__SignalAssignment_7_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7152:2: ( ( rule__MachineBlock__BufferAssignment_7_1_1_2 ) )
+                    {
+                    // InternalFormalML.g:7152:2: ( ( rule__MachineBlock__BufferAssignment_7_1_1_2 ) )
+                    // InternalFormalML.g:7153:3: ( rule__MachineBlock__BufferAssignment_7_1_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_1_1_2()); 
+                    }
+                    // InternalFormalML.g:7154:3: ( rule__MachineBlock__BufferAssignment_7_1_1_2 )
+                    // InternalFormalML.g:7154:4: rule__MachineBlock__BufferAssignment_7_1_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__BufferAssignment_7_1_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_1_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7158:2: ( ( rule__MachineBlock__ChannelAssignment_7_1_1_3 ) )
+                    {
+                    // InternalFormalML.g:7158:2: ( ( rule__MachineBlock__ChannelAssignment_7_1_1_3 ) )
+                    // InternalFormalML.g:7159:3: ( rule__MachineBlock__ChannelAssignment_7_1_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_1_1_3()); 
+                    }
+                    // InternalFormalML.g:7160:3: ( rule__MachineBlock__ChannelAssignment_7_1_1_3 )
+                    // InternalFormalML.g:7160:4: rule__MachineBlock__ChannelAssignment_7_1_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__ChannelAssignment_7_1_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_1_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7164:2: ( ( rule__MachineBlock__TypedefAssignment_7_1_1_4 ) )
+                    {
+                    // InternalFormalML.g:7164:2: ( ( rule__MachineBlock__TypedefAssignment_7_1_1_4 ) )
+                    // InternalFormalML.g:7165:3: ( rule__MachineBlock__TypedefAssignment_7_1_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_1_1_4()); 
+                    }
+                    // InternalFormalML.g:7166:3: ( rule__MachineBlock__TypedefAssignment_7_1_1_4 )
+                    // InternalFormalML.g:7166:4: rule__MachineBlock__TypedefAssignment_7_1_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__TypedefAssignment_7_1_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_1_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7170:2: ( ( rule__MachineBlock__PropertyAssignment_7_1_1_5 ) )
+                    {
+                    // InternalFormalML.g:7170:2: ( ( rule__MachineBlock__PropertyAssignment_7_1_1_5 ) )
+                    // InternalFormalML.g:7171:3: ( rule__MachineBlock__PropertyAssignment_7_1_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_1_1_5()); 
+                    }
+                    // InternalFormalML.g:7172:3: ( rule__MachineBlock__PropertyAssignment_7_1_1_5 )
+                    // InternalFormalML.g:7172:4: rule__MachineBlock__PropertyAssignment_7_1_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PropertyAssignment_7_1_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_1_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_7_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_7_2_1"
+    // InternalFormalML.g:7180:1: rule__MachineBlock__Alternatives_7_2_1 : ( ( ( rule__MachineBlock__PortAssignment_7_2_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_2_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_2_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_2_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_2_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_2_1_5 ) ) );
+    public final void rule__MachineBlock__Alternatives_7_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7184:1: ( ( ( rule__MachineBlock__PortAssignment_7_2_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_2_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_2_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_2_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_2_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_2_1_5 ) ) )
+            int alt35=6;
+            alt35 = dfa35.predict(input);
+            switch (alt35) {
+                case 1 :
+                    // InternalFormalML.g:7185:2: ( ( rule__MachineBlock__PortAssignment_7_2_1_0 ) )
+                    {
+                    // InternalFormalML.g:7185:2: ( ( rule__MachineBlock__PortAssignment_7_2_1_0 ) )
+                    // InternalFormalML.g:7186:3: ( rule__MachineBlock__PortAssignment_7_2_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPortAssignment_7_2_1_0()); 
+                    }
+                    // InternalFormalML.g:7187:3: ( rule__MachineBlock__PortAssignment_7_2_1_0 )
+                    // InternalFormalML.g:7187:4: rule__MachineBlock__PortAssignment_7_2_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PortAssignment_7_2_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPortAssignment_7_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7191:2: ( ( rule__MachineBlock__SignalAssignment_7_2_1_1 ) )
+                    {
+                    // InternalFormalML.g:7191:2: ( ( rule__MachineBlock__SignalAssignment_7_2_1_1 ) )
+                    // InternalFormalML.g:7192:3: ( rule__MachineBlock__SignalAssignment_7_2_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_2_1_1()); 
+                    }
+                    // InternalFormalML.g:7193:3: ( rule__MachineBlock__SignalAssignment_7_2_1_1 )
+                    // InternalFormalML.g:7193:4: rule__MachineBlock__SignalAssignment_7_2_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__SignalAssignment_7_2_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7197:2: ( ( rule__MachineBlock__BufferAssignment_7_2_1_2 ) )
+                    {
+                    // InternalFormalML.g:7197:2: ( ( rule__MachineBlock__BufferAssignment_7_2_1_2 ) )
+                    // InternalFormalML.g:7198:3: ( rule__MachineBlock__BufferAssignment_7_2_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_2_1_2()); 
+                    }
+                    // InternalFormalML.g:7199:3: ( rule__MachineBlock__BufferAssignment_7_2_1_2 )
+                    // InternalFormalML.g:7199:4: rule__MachineBlock__BufferAssignment_7_2_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__BufferAssignment_7_2_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_2_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7203:2: ( ( rule__MachineBlock__ChannelAssignment_7_2_1_3 ) )
+                    {
+                    // InternalFormalML.g:7203:2: ( ( rule__MachineBlock__ChannelAssignment_7_2_1_3 ) )
+                    // InternalFormalML.g:7204:3: ( rule__MachineBlock__ChannelAssignment_7_2_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_2_1_3()); 
+                    }
+                    // InternalFormalML.g:7205:3: ( rule__MachineBlock__ChannelAssignment_7_2_1_3 )
+                    // InternalFormalML.g:7205:4: rule__MachineBlock__ChannelAssignment_7_2_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__ChannelAssignment_7_2_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_2_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7209:2: ( ( rule__MachineBlock__TypedefAssignment_7_2_1_4 ) )
+                    {
+                    // InternalFormalML.g:7209:2: ( ( rule__MachineBlock__TypedefAssignment_7_2_1_4 ) )
+                    // InternalFormalML.g:7210:3: ( rule__MachineBlock__TypedefAssignment_7_2_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_2_1_4()); 
+                    }
+                    // InternalFormalML.g:7211:3: ( rule__MachineBlock__TypedefAssignment_7_2_1_4 )
+                    // InternalFormalML.g:7211:4: rule__MachineBlock__TypedefAssignment_7_2_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__TypedefAssignment_7_2_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_2_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7215:2: ( ( rule__MachineBlock__PropertyAssignment_7_2_1_5 ) )
+                    {
+                    // InternalFormalML.g:7215:2: ( ( rule__MachineBlock__PropertyAssignment_7_2_1_5 ) )
+                    // InternalFormalML.g:7216:3: ( rule__MachineBlock__PropertyAssignment_7_2_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_2_1_5()); 
+                    }
+                    // InternalFormalML.g:7217:3: ( rule__MachineBlock__PropertyAssignment_7_2_1_5 )
+                    // InternalFormalML.g:7217:4: rule__MachineBlock__PropertyAssignment_7_2_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PropertyAssignment_7_2_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_2_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_7_2_1"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_7_3_1"
+    // InternalFormalML.g:7225:1: rule__MachineBlock__Alternatives_7_3_1 : ( ( ( rule__MachineBlock__PortAssignment_7_3_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_3_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_3_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_3_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_3_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_3_1_5 ) ) );
+    public final void rule__MachineBlock__Alternatives_7_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7229:1: ( ( ( rule__MachineBlock__PortAssignment_7_3_1_0 ) ) | ( ( rule__MachineBlock__SignalAssignment_7_3_1_1 ) ) | ( ( rule__MachineBlock__BufferAssignment_7_3_1_2 ) ) | ( ( rule__MachineBlock__ChannelAssignment_7_3_1_3 ) ) | ( ( rule__MachineBlock__TypedefAssignment_7_3_1_4 ) ) | ( ( rule__MachineBlock__PropertyAssignment_7_3_1_5 ) ) )
+            int alt36=6;
+            alt36 = dfa36.predict(input);
+            switch (alt36) {
+                case 1 :
+                    // InternalFormalML.g:7230:2: ( ( rule__MachineBlock__PortAssignment_7_3_1_0 ) )
+                    {
+                    // InternalFormalML.g:7230:2: ( ( rule__MachineBlock__PortAssignment_7_3_1_0 ) )
+                    // InternalFormalML.g:7231:3: ( rule__MachineBlock__PortAssignment_7_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPortAssignment_7_3_1_0()); 
+                    }
+                    // InternalFormalML.g:7232:3: ( rule__MachineBlock__PortAssignment_7_3_1_0 )
+                    // InternalFormalML.g:7232:4: rule__MachineBlock__PortAssignment_7_3_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PortAssignment_7_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPortAssignment_7_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7236:2: ( ( rule__MachineBlock__SignalAssignment_7_3_1_1 ) )
+                    {
+                    // InternalFormalML.g:7236:2: ( ( rule__MachineBlock__SignalAssignment_7_3_1_1 ) )
+                    // InternalFormalML.g:7237:3: ( rule__MachineBlock__SignalAssignment_7_3_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_3_1_1()); 
+                    }
+                    // InternalFormalML.g:7238:3: ( rule__MachineBlock__SignalAssignment_7_3_1_1 )
+                    // InternalFormalML.g:7238:4: rule__MachineBlock__SignalAssignment_7_3_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__SignalAssignment_7_3_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getSignalAssignment_7_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7242:2: ( ( rule__MachineBlock__BufferAssignment_7_3_1_2 ) )
+                    {
+                    // InternalFormalML.g:7242:2: ( ( rule__MachineBlock__BufferAssignment_7_3_1_2 ) )
+                    // InternalFormalML.g:7243:3: ( rule__MachineBlock__BufferAssignment_7_3_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_3_1_2()); 
+                    }
+                    // InternalFormalML.g:7244:3: ( rule__MachineBlock__BufferAssignment_7_3_1_2 )
+                    // InternalFormalML.g:7244:4: rule__MachineBlock__BufferAssignment_7_3_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__BufferAssignment_7_3_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getBufferAssignment_7_3_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7248:2: ( ( rule__MachineBlock__ChannelAssignment_7_3_1_3 ) )
+                    {
+                    // InternalFormalML.g:7248:2: ( ( rule__MachineBlock__ChannelAssignment_7_3_1_3 ) )
+                    // InternalFormalML.g:7249:3: ( rule__MachineBlock__ChannelAssignment_7_3_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_3_1_3()); 
+                    }
+                    // InternalFormalML.g:7250:3: ( rule__MachineBlock__ChannelAssignment_7_3_1_3 )
+                    // InternalFormalML.g:7250:4: rule__MachineBlock__ChannelAssignment_7_3_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__ChannelAssignment_7_3_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getChannelAssignment_7_3_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7254:2: ( ( rule__MachineBlock__TypedefAssignment_7_3_1_4 ) )
+                    {
+                    // InternalFormalML.g:7254:2: ( ( rule__MachineBlock__TypedefAssignment_7_3_1_4 ) )
+                    // InternalFormalML.g:7255:3: ( rule__MachineBlock__TypedefAssignment_7_3_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_3_1_4()); 
+                    }
+                    // InternalFormalML.g:7256:3: ( rule__MachineBlock__TypedefAssignment_7_3_1_4 )
+                    // InternalFormalML.g:7256:4: rule__MachineBlock__TypedefAssignment_7_3_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__TypedefAssignment_7_3_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getTypedefAssignment_7_3_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7260:2: ( ( rule__MachineBlock__PropertyAssignment_7_3_1_5 ) )
+                    {
+                    // InternalFormalML.g:7260:2: ( ( rule__MachineBlock__PropertyAssignment_7_3_1_5 ) )
+                    // InternalFormalML.g:7261:3: ( rule__MachineBlock__PropertyAssignment_7_3_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_3_1_5()); 
+                    }
+                    // InternalFormalML.g:7262:3: ( rule__MachineBlock__PropertyAssignment_7_3_1_5 )
+                    // InternalFormalML.g:7262:4: rule__MachineBlock__PropertyAssignment_7_3_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__PropertyAssignment_7_3_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getPropertyAssignment_7_3_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_7_3_1"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_8"
+    // InternalFormalML.g:7270:1: rule__MachineBlock__Alternatives_8 : ( ( ( rule__MachineBlock__Alternatives_8_0 )* ) | ( ( ( rule__MachineBlock__Alternatives_8_1 ) ) ( ( rule__MachineBlock__Alternatives_8_1 )* ) ) );
+    public final void rule__MachineBlock__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7274:1: ( ( ( rule__MachineBlock__Alternatives_8_0 )* ) | ( ( ( rule__MachineBlock__Alternatives_8_1 ) ) ( ( rule__MachineBlock__Alternatives_8_1 )* ) ) )
+            int alt39=2;
+            int LA39_0 = input.LA(1);
+
+            if ( (LA39_0==EOF||(LA39_0>=35 && LA39_0<=38)||LA39_0==42||LA39_0==200||(LA39_0>=206 && LA39_0<=210)||(LA39_0>=221 && LA39_0<=222)||LA39_0==226) ) {
+                alt39=1;
+            }
+            else if ( (LA39_0==28||(LA39_0>=143 && LA39_0<=145)||LA39_0==214||(LA39_0>=224 && LA39_0<=225)) ) {
+                alt39=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 39, 0, input);
+
+                throw nvae;
+            }
+            switch (alt39) {
+                case 1 :
+                    // InternalFormalML.g:7275:2: ( ( rule__MachineBlock__Alternatives_8_0 )* )
+                    {
+                    // InternalFormalML.g:7275:2: ( ( rule__MachineBlock__Alternatives_8_0 )* )
+                    // InternalFormalML.g:7276:3: ( rule__MachineBlock__Alternatives_8_0 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getAlternatives_8_0()); 
+                    }
+                    // InternalFormalML.g:7277:3: ( rule__MachineBlock__Alternatives_8_0 )*
+                    loop37:
+                    do {
+                        int alt37=2;
+                        int LA37_0 = input.LA(1);
+
+                        if ( ((LA37_0>=35 && LA37_0<=36)||LA37_0==206) ) {
+                            alt37=1;
+                        }
+
+
+                        switch (alt37) {
+                    	case 1 :
+                    	    // InternalFormalML.g:7277:4: rule__MachineBlock__Alternatives_8_0
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_4);
+                    	    rule__MachineBlock__Alternatives_8_0();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop37;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getAlternatives_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7281:2: ( ( ( rule__MachineBlock__Alternatives_8_1 ) ) ( ( rule__MachineBlock__Alternatives_8_1 )* ) )
+                    {
+                    // InternalFormalML.g:7281:2: ( ( ( rule__MachineBlock__Alternatives_8_1 ) ) ( ( rule__MachineBlock__Alternatives_8_1 )* ) )
+                    // InternalFormalML.g:7282:3: ( ( rule__MachineBlock__Alternatives_8_1 ) ) ( ( rule__MachineBlock__Alternatives_8_1 )* )
+                    {
+                    // InternalFormalML.g:7282:3: ( ( rule__MachineBlock__Alternatives_8_1 ) )
+                    // InternalFormalML.g:7283:4: ( rule__MachineBlock__Alternatives_8_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getAlternatives_8_1()); 
+                    }
+                    // InternalFormalML.g:7284:4: ( rule__MachineBlock__Alternatives_8_1 )
+                    // InternalFormalML.g:7284:5: rule__MachineBlock__Alternatives_8_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_5);
+                    rule__MachineBlock__Alternatives_8_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getAlternatives_8_1()); 
+                    }
+
+                    }
+
+                    // InternalFormalML.g:7287:3: ( ( rule__MachineBlock__Alternatives_8_1 )* )
+                    // InternalFormalML.g:7288:4: ( rule__MachineBlock__Alternatives_8_1 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getAlternatives_8_1()); 
+                    }
+                    // InternalFormalML.g:7289:4: ( rule__MachineBlock__Alternatives_8_1 )*
+                    loop38:
+                    do {
+                        int alt38=2;
+                        int LA38_0 = input.LA(1);
+
+                        if ( (LA38_0==28||(LA38_0>=143 && LA38_0<=145)||LA38_0==214||(LA38_0>=224 && LA38_0<=225)) ) {
+                            alt38=1;
+                        }
+
+
+                        switch (alt38) {
+                    	case 1 :
+                    	    // InternalFormalML.g:7289:5: rule__MachineBlock__Alternatives_8_1
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_5);
+                    	    rule__MachineBlock__Alternatives_8_1();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop38;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getAlternatives_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_8"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_8_0"
+    // InternalFormalML.g:7298:1: rule__MachineBlock__Alternatives_8_0 : ( ( ( rule__MachineBlock__Group_8_0_0__0 ) ) | ( ( rule__MachineBlock__Group_8_0_1__0 ) ) );
+    public final void rule__MachineBlock__Alternatives_8_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7302:1: ( ( ( rule__MachineBlock__Group_8_0_0__0 ) ) | ( ( rule__MachineBlock__Group_8_0_1__0 ) ) )
+            int alt40=2;
+            int LA40_0 = input.LA(1);
+
+            if ( ((LA40_0>=35 && LA40_0<=36)) ) {
+                alt40=1;
+            }
+            else if ( (LA40_0==206) ) {
+                alt40=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 40, 0, input);
+
+                throw nvae;
+            }
+            switch (alt40) {
+                case 1 :
+                    // InternalFormalML.g:7303:2: ( ( rule__MachineBlock__Group_8_0_0__0 ) )
+                    {
+                    // InternalFormalML.g:7303:2: ( ( rule__MachineBlock__Group_8_0_0__0 ) )
+                    // InternalFormalML.g:7304:3: ( rule__MachineBlock__Group_8_0_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_8_0_0()); 
+                    }
+                    // InternalFormalML.g:7305:3: ( rule__MachineBlock__Group_8_0_0__0 )
+                    // InternalFormalML.g:7305:4: rule__MachineBlock__Group_8_0_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_8_0_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_8_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7309:2: ( ( rule__MachineBlock__Group_8_0_1__0 ) )
+                    {
+                    // InternalFormalML.g:7309:2: ( ( rule__MachineBlock__Group_8_0_1__0 ) )
+                    // InternalFormalML.g:7310:3: ( rule__MachineBlock__Group_8_0_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_8_0_1()); 
+                    }
+                    // InternalFormalML.g:7311:3: ( rule__MachineBlock__Group_8_0_1__0 )
+                    // InternalFormalML.g:7311:4: rule__MachineBlock__Group_8_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_8_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_8_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_8_0"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_8_0_0_0"
+    // InternalFormalML.g:7319:1: rule__MachineBlock__Alternatives_8_0_0_0 : ( ( '@routine:' ) | ( '@macro:' ) );
+    public final void rule__MachineBlock__Alternatives_8_0_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7323:1: ( ( '@routine:' ) | ( '@macro:' ) )
+            int alt41=2;
+            int LA41_0 = input.LA(1);
+
+            if ( (LA41_0==35) ) {
+                alt41=1;
+            }
+            else if ( (LA41_0==36) ) {
+                alt41=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 41, 0, input);
+
+                throw nvae;
+            }
+            switch (alt41) {
+                case 1 :
+                    // InternalFormalML.g:7324:2: ( '@routine:' )
+                    {
+                    // InternalFormalML.g:7324:2: ( '@routine:' )
+                    // InternalFormalML.g:7325:3: '@routine:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getRoutineKeyword_8_0_0_0_0()); 
+                    }
+                    match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getRoutineKeyword_8_0_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7330:2: ( '@macro:' )
+                    {
+                    // InternalFormalML.g:7330:2: ( '@macro:' )
+                    // InternalFormalML.g:7331:3: '@macro:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getMacroKeyword_8_0_0_0_1()); 
+                    }
+                    match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getMacroKeyword_8_0_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_8_0_0_0"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_8_1"
+    // InternalFormalML.g:7340:1: rule__MachineBlock__Alternatives_8_1 : ( ( ( rule__MachineBlock__RoutineAssignment_8_1_0 ) ) | ( ( rule__MachineBlock__ProcedureAssignment_8_1_1 ) ) );
+    public final void rule__MachineBlock__Alternatives_8_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7344:1: ( ( ( rule__MachineBlock__RoutineAssignment_8_1_0 ) ) | ( ( rule__MachineBlock__ProcedureAssignment_8_1_1 ) ) )
+            int alt42=2;
+            switch ( input.LA(1) ) {
+            case 143:
+                {
+                int LA42_1 = input.LA(2);
+
+                if ( ((LA42_1>=224 && LA42_1<=225)) ) {
+                    alt42=1;
+                }
+                else if ( (LA42_1==214) ) {
+                    alt42=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 42, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 144:
+                {
+                int LA42_2 = input.LA(2);
+
+                if ( (LA42_2==214) ) {
+                    alt42=2;
+                }
+                else if ( ((LA42_2>=224 && LA42_2<=225)) ) {
+                    alt42=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 42, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 145:
+                {
+                int LA42_3 = input.LA(2);
+
+                if ( ((LA42_3>=224 && LA42_3<=225)) ) {
+                    alt42=1;
+                }
+                else if ( (LA42_3==214) ) {
+                    alt42=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 42, 3, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 28:
+                {
+                int LA42_4 = input.LA(2);
+
+                if ( (LA42_4==214) ) {
+                    alt42=2;
+                }
+                else if ( ((LA42_4>=224 && LA42_4<=225)) ) {
+                    alt42=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 42, 4, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 224:
+            case 225:
+                {
+                alt42=1;
+                }
+                break;
+            case 214:
+                {
+                alt42=2;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 42, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt42) {
+                case 1 :
+                    // InternalFormalML.g:7345:2: ( ( rule__MachineBlock__RoutineAssignment_8_1_0 ) )
+                    {
+                    // InternalFormalML.g:7345:2: ( ( rule__MachineBlock__RoutineAssignment_8_1_0 ) )
+                    // InternalFormalML.g:7346:3: ( rule__MachineBlock__RoutineAssignment_8_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_1_0()); 
+                    }
+                    // InternalFormalML.g:7347:3: ( rule__MachineBlock__RoutineAssignment_8_1_0 )
+                    // InternalFormalML.g:7347:4: rule__MachineBlock__RoutineAssignment_8_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__RoutineAssignment_8_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7351:2: ( ( rule__MachineBlock__ProcedureAssignment_8_1_1 ) )
+                    {
+                    // InternalFormalML.g:7351:2: ( ( rule__MachineBlock__ProcedureAssignment_8_1_1 ) )
+                    // InternalFormalML.g:7352:3: ( rule__MachineBlock__ProcedureAssignment_8_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_1_1()); 
+                    }
+                    // InternalFormalML.g:7353:3: ( rule__MachineBlock__ProcedureAssignment_8_1_1 )
+                    // InternalFormalML.g:7353:4: rule__MachineBlock__ProcedureAssignment_8_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__ProcedureAssignment_8_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_8_1"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_9"
+    // InternalFormalML.g:7361:1: rule__MachineBlock__Alternatives_9 : ( ( ( rule__MachineBlock__Group_9_0__0 ) ) | ( ( rule__MachineBlock__Group_9_1__0 ) ) | ( ( rule__MachineBlock__Group_9_2__0 ) ) | ( ( rule__MachineBlock__Group_9_3__0 ) ) );
+    public final void rule__MachineBlock__Alternatives_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7365:1: ( ( ( rule__MachineBlock__Group_9_0__0 ) ) | ( ( rule__MachineBlock__Group_9_1__0 ) ) | ( ( rule__MachineBlock__Group_9_2__0 ) ) | ( ( rule__MachineBlock__Group_9_3__0 ) ) )
+            int alt43=4;
+            switch ( input.LA(1) ) {
+            case 37:
+            case 38:
+                {
+                alt43=1;
+                }
+                break;
+            case 207:
+                {
+                alt43=2;
+                }
+                break;
+            case 208:
+                {
+                alt43=3;
+                }
+                break;
+            case 209:
+                {
+                alt43=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 43, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt43) {
+                case 1 :
+                    // InternalFormalML.g:7366:2: ( ( rule__MachineBlock__Group_9_0__0 ) )
+                    {
+                    // InternalFormalML.g:7366:2: ( ( rule__MachineBlock__Group_9_0__0 ) )
+                    // InternalFormalML.g:7367:3: ( rule__MachineBlock__Group_9_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_9_0()); 
+                    }
+                    // InternalFormalML.g:7368:3: ( rule__MachineBlock__Group_9_0__0 )
+                    // InternalFormalML.g:7368:4: rule__MachineBlock__Group_9_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_9_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_9_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7372:2: ( ( rule__MachineBlock__Group_9_1__0 ) )
+                    {
+                    // InternalFormalML.g:7372:2: ( ( rule__MachineBlock__Group_9_1__0 ) )
+                    // InternalFormalML.g:7373:3: ( rule__MachineBlock__Group_9_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_9_1()); 
+                    }
+                    // InternalFormalML.g:7374:3: ( rule__MachineBlock__Group_9_1__0 )
+                    // InternalFormalML.g:7374:4: rule__MachineBlock__Group_9_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_9_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_9_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7378:2: ( ( rule__MachineBlock__Group_9_2__0 ) )
+                    {
+                    // InternalFormalML.g:7378:2: ( ( rule__MachineBlock__Group_9_2__0 ) )
+                    // InternalFormalML.g:7379:3: ( rule__MachineBlock__Group_9_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_9_2()); 
+                    }
+                    // InternalFormalML.g:7380:3: ( rule__MachineBlock__Group_9_2__0 )
+                    // InternalFormalML.g:7380:4: rule__MachineBlock__Group_9_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_9_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_9_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7384:2: ( ( rule__MachineBlock__Group_9_3__0 ) )
+                    {
+                    // InternalFormalML.g:7384:2: ( ( rule__MachineBlock__Group_9_3__0 ) )
+                    // InternalFormalML.g:7385:3: ( rule__MachineBlock__Group_9_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_9_3()); 
+                    }
+                    // InternalFormalML.g:7386:3: ( rule__MachineBlock__Group_9_3__0 )
+                    // InternalFormalML.g:7386:4: rule__MachineBlock__Group_9_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_9_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_9_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_9"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_9_0_0"
+    // InternalFormalML.g:7394:1: rule__MachineBlock__Alternatives_9_0_0 : ( ( '@composite:' ) | ( '@machine:' ) );
+    public final void rule__MachineBlock__Alternatives_9_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7398:1: ( ( '@composite:' ) | ( '@machine:' ) )
+            int alt44=2;
+            int LA44_0 = input.LA(1);
+
+            if ( (LA44_0==37) ) {
+                alt44=1;
+            }
+            else if ( (LA44_0==38) ) {
+                alt44=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 44, 0, input);
+
+                throw nvae;
+            }
+            switch (alt44) {
+                case 1 :
+                    // InternalFormalML.g:7399:2: ( '@composite:' )
+                    {
+                    // InternalFormalML.g:7399:2: ( '@composite:' )
+                    // InternalFormalML.g:7400:3: '@composite:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0()); 
+                    }
+                    match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7405:2: ( '@machine:' )
+                    {
+                    // InternalFormalML.g:7405:2: ( '@machine:' )
+                    // InternalFormalML.g:7406:3: '@machine:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1()); 
+                    }
+                    match(input,38,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_9_0_0"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_9_0_1"
+    // InternalFormalML.g:7415:1: rule__MachineBlock__Alternatives_9_0_1 : ( ( ( rule__MachineBlock__MachineAssignment_9_0_1_0 ) ) | ( ( rule__MachineBlock__InstanceAssignment_9_0_1_1 ) ) );
+    public final void rule__MachineBlock__Alternatives_9_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7419:1: ( ( ( rule__MachineBlock__MachineAssignment_9_0_1_0 ) ) | ( ( rule__MachineBlock__InstanceAssignment_9_0_1_1 ) ) )
+            int alt45=2;
+            int LA45_0 = input.LA(1);
+
+            if ( (LA45_0==28||(LA45_0>=39 && LA45_0<=40)||(LA45_0>=143 && LA45_0<=147)||(LA45_0>=273 && LA45_0<=274)) ) {
+                alt45=1;
+            }
+            else if ( (LA45_0==211) ) {
+                alt45=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 45, 0, input);
+
+                throw nvae;
+            }
+            switch (alt45) {
+                case 1 :
+                    // InternalFormalML.g:7420:2: ( ( rule__MachineBlock__MachineAssignment_9_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:7420:2: ( ( rule__MachineBlock__MachineAssignment_9_0_1_0 ) )
+                    // InternalFormalML.g:7421:3: ( rule__MachineBlock__MachineAssignment_9_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_0_1_0()); 
+                    }
+                    // InternalFormalML.g:7422:3: ( rule__MachineBlock__MachineAssignment_9_0_1_0 )
+                    // InternalFormalML.g:7422:4: rule__MachineBlock__MachineAssignment_9_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__MachineAssignment_9_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7426:2: ( ( rule__MachineBlock__InstanceAssignment_9_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:7426:2: ( ( rule__MachineBlock__InstanceAssignment_9_0_1_1 ) )
+                    // InternalFormalML.g:7427:3: ( rule__MachineBlock__InstanceAssignment_9_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_0_1_1()); 
+                    }
+                    // InternalFormalML.g:7428:3: ( rule__MachineBlock__InstanceAssignment_9_0_1_1 )
+                    // InternalFormalML.g:7428:4: rule__MachineBlock__InstanceAssignment_9_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__InstanceAssignment_9_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_9_0_1"
+
+
+    // $ANTLR start "rule__MachineBlock__Alternatives_10"
+    // InternalFormalML.g:7436:1: rule__MachineBlock__Alternatives_10 : ( ( ( rule__MachineBlock__Group_10_0__0 ) ) | ( ( rule__MachineBlock__Group_10_1__0 ) ) );
+    public final void rule__MachineBlock__Alternatives_10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7440:1: ( ( ( rule__MachineBlock__Group_10_0__0 ) ) | ( ( rule__MachineBlock__Group_10_1__0 ) ) )
+            int alt46=2;
+            int LA46_0 = input.LA(1);
+
+            if ( (LA46_0==210) ) {
+                alt46=1;
+            }
+            else if ( (LA46_0==42) ) {
+                alt46=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 46, 0, input);
+
+                throw nvae;
+            }
+            switch (alt46) {
+                case 1 :
+                    // InternalFormalML.g:7441:2: ( ( rule__MachineBlock__Group_10_0__0 ) )
+                    {
+                    // InternalFormalML.g:7441:2: ( ( rule__MachineBlock__Group_10_0__0 ) )
+                    // InternalFormalML.g:7442:3: ( rule__MachineBlock__Group_10_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_10_0()); 
+                    }
+                    // InternalFormalML.g:7443:3: ( rule__MachineBlock__Group_10_0__0 )
+                    // InternalFormalML.g:7443:4: rule__MachineBlock__Group_10_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_10_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_10_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7447:2: ( ( rule__MachineBlock__Group_10_1__0 ) )
+                    {
+                    // InternalFormalML.g:7447:2: ( ( rule__MachineBlock__Group_10_1__0 ) )
+                    // InternalFormalML.g:7448:3: ( rule__MachineBlock__Group_10_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getGroup_10_1()); 
+                    }
+                    // InternalFormalML.g:7449:3: ( rule__MachineBlock__Group_10_1__0 )
+                    // InternalFormalML.g:7449:4: rule__MachineBlock__Group_10_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_10_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getGroup_10_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Alternatives_10"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_2_2"
+    // InternalFormalML.g:7457:1: rule__Procedure__Alternatives_2_2 : ( ( 'and' ) | ( 'or' ) );
+    public final void rule__Procedure__Alternatives_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7461:1: ( ( 'and' ) | ( 'or' ) )
+            int alt47=2;
+            int LA47_0 = input.LA(1);
+
+            if ( (LA47_0==33) ) {
+                alt47=1;
+            }
+            else if ( (LA47_0==34) ) {
+                alt47=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 47, 0, input);
+
+                throw nvae;
+            }
+            switch (alt47) {
+                case 1 :
+                    // InternalFormalML.g:7462:2: ( 'and' )
+                    {
+                    // InternalFormalML.g:7462:2: ( 'and' )
+                    // InternalFormalML.g:7463:3: 'and'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getAndKeyword_2_2_0()); 
+                    }
+                    match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getAndKeyword_2_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7468:2: ( 'or' )
+                    {
+                    // InternalFormalML.g:7468:2: ( 'or' )
+                    // InternalFormalML.g:7469:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getOrKeyword_2_2_1()); 
+                    }
+                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getOrKeyword_2_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_2_2"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_5_1_1"
+    // InternalFormalML.g:7478:1: rule__Procedure__Alternatives_5_1_1 : ( ( ( rule__Procedure__ParameterAssignment_5_1_1_0 ) ) | ( ( rule__Procedure__Group_5_1_1_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_5_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7482:1: ( ( ( rule__Procedure__ParameterAssignment_5_1_1_0 ) ) | ( ( rule__Procedure__Group_5_1_1_1__0 ) ) )
+            int alt48=2;
+            int LA48_0 = input.LA(1);
+
+            if ( (LA48_0==RULE_XLIA_ID||LA48_0==15||(LA48_0>=17 && LA48_0<=18)||LA48_0==39||(LA48_0>=59 && LA48_0<=74)||(LA48_0>=129 && LA48_0<=132)||LA48_0==149||LA48_0==157||(LA48_0>=163 && LA48_0<=174)||(LA48_0>=231 && LA48_0<=237)||LA48_0==277) ) {
+                alt48=1;
+            }
+            else if ( (LA48_0==23) ) {
+                alt48=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 48, 0, input);
+
+                throw nvae;
+            }
+            switch (alt48) {
+                case 1 :
+                    // InternalFormalML.g:7483:2: ( ( rule__Procedure__ParameterAssignment_5_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:7483:2: ( ( rule__Procedure__ParameterAssignment_5_1_1_0 ) )
+                    // InternalFormalML.g:7484:3: ( rule__Procedure__ParameterAssignment_5_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_0()); 
+                    }
+                    // InternalFormalML.g:7485:3: ( rule__Procedure__ParameterAssignment_5_1_1_0 )
+                    // InternalFormalML.g:7485:4: rule__Procedure__ParameterAssignment_5_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ParameterAssignment_5_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7489:2: ( ( rule__Procedure__Group_5_1_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7489:2: ( ( rule__Procedure__Group_5_1_1_1__0 ) )
+                    // InternalFormalML.g:7490:3: ( rule__Procedure__Group_5_1_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_5_1_1_1()); 
+                    }
+                    // InternalFormalML.g:7491:3: ( rule__Procedure__Group_5_1_1_1__0 )
+                    // InternalFormalML.g:7491:4: rule__Procedure__Group_5_1_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_5_1_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_5_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_5_1_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_7"
+    // InternalFormalML.g:7499:1: rule__Procedure__Alternatives_7 : ( ( ( rule__Procedure__Group_7_0__0 ) ) | ( ( rule__Procedure__Alternatives_7_1 )* ) );
+    public final void rule__Procedure__Alternatives_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7503:1: ( ( ( rule__Procedure__Group_7_0__0 ) ) | ( ( rule__Procedure__Alternatives_7_1 )* ) )
+            int alt50=2;
+            int LA50_0 = input.LA(1);
+
+            if ( (LA50_0==216) ) {
+                alt50=1;
+            }
+            else if ( ((LA50_0>=15 && LA50_0<=19)||LA50_0==28||(LA50_0>=35 && LA50_0<=36)||(LA50_0>=41 && LA50_0<=44)||LA50_0==51||(LA50_0>=53 && LA50_0<=57)||(LA50_0>=143 && LA50_0<=145)||LA50_0==179||LA50_0==200||(LA50_0>=202 && LA50_0<=206)||LA50_0==214||(LA50_0>=217 && LA50_0<=221)||(LA50_0>=224 && LA50_0<=225)||LA50_0==229||(LA50_0>=275 && LA50_0<=276)||(LA50_0>=278 && LA50_0<=283)) ) {
+                alt50=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 50, 0, input);
+
+                throw nvae;
+            }
+            switch (alt50) {
+                case 1 :
+                    // InternalFormalML.g:7504:2: ( ( rule__Procedure__Group_7_0__0 ) )
+                    {
+                    // InternalFormalML.g:7504:2: ( ( rule__Procedure__Group_7_0__0 ) )
+                    // InternalFormalML.g:7505:3: ( rule__Procedure__Group_7_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_7_0()); 
+                    }
+                    // InternalFormalML.g:7506:3: ( rule__Procedure__Group_7_0__0 )
+                    // InternalFormalML.g:7506:4: rule__Procedure__Group_7_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_7_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_7_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7510:2: ( ( rule__Procedure__Alternatives_7_1 )* )
+                    {
+                    // InternalFormalML.g:7510:2: ( ( rule__Procedure__Alternatives_7_1 )* )
+                    // InternalFormalML.g:7511:3: ( rule__Procedure__Alternatives_7_1 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getAlternatives_7_1()); 
+                    }
+                    // InternalFormalML.g:7512:3: ( rule__Procedure__Alternatives_7_1 )*
+                    loop49:
+                    do {
+                        int alt49=2;
+                        switch ( input.LA(1) ) {
+                        case 143:
+                            {
+                            int LA49_2 = input.LA(2);
+
+                            if ( ((LA49_2>=15 && LA49_2<=19)||LA49_2==28||(LA49_2>=143 && LA49_2<=145)||LA49_2==179||LA49_2==229||(LA49_2>=278 && LA49_2<=283)) ) {
+                                alt49=1;
+                            }
+                            else if ( (LA49_2==224) ) {
+                                int LA49_6 = input.LA(3);
+
+                                if ( (LA49_6==RULE_XLIA_ID||(LA49_6>=15 && LA49_6<=18)||LA49_6==39||(LA49_6>=59 && LA49_6<=74)||(LA49_6>=129 && LA49_6<=132)||LA49_6==149||(LA49_6>=163 && LA49_6<=171)||(LA49_6>=231 && LA49_6<=237)||LA49_6==277||LA49_6==282) ) {
+                                    alt49=1;
+                                }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 144:
+                            {
+                            int LA49_3 = input.LA(2);
+
+                            if ( ((LA49_3>=15 && LA49_3<=19)||LA49_3==28||(LA49_3>=143 && LA49_3<=145)||LA49_3==179||LA49_3==229||(LA49_3>=278 && LA49_3<=283)) ) {
+                                alt49=1;
+                            }
+                            else if ( (LA49_3==224) ) {
+                                int LA49_6 = input.LA(3);
+
+                                if ( (LA49_6==RULE_XLIA_ID||(LA49_6>=15 && LA49_6<=18)||LA49_6==39||(LA49_6>=59 && LA49_6<=74)||(LA49_6>=129 && LA49_6<=132)||LA49_6==149||(LA49_6>=163 && LA49_6<=171)||(LA49_6>=231 && LA49_6<=237)||LA49_6==277||LA49_6==282) ) {
+                                    alt49=1;
+                                }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 145:
+                            {
+                            int LA49_4 = input.LA(2);
+
+                            if ( ((LA49_4>=15 && LA49_4<=19)||LA49_4==28||(LA49_4>=143 && LA49_4<=145)||LA49_4==179||LA49_4==229||(LA49_4>=278 && LA49_4<=283)) ) {
+                                alt49=1;
+                            }
+                            else if ( (LA49_4==224) ) {
+                                int LA49_6 = input.LA(3);
+
+                                if ( (LA49_6==RULE_XLIA_ID||(LA49_6>=15 && LA49_6<=18)||LA49_6==39||(LA49_6>=59 && LA49_6<=74)||(LA49_6>=129 && LA49_6<=132)||LA49_6==149||(LA49_6>=163 && LA49_6<=171)||(LA49_6>=231 && LA49_6<=237)||LA49_6==277||LA49_6==282) ) {
+                                    alt49=1;
+                                }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 28:
+                            {
+                            int LA49_5 = input.LA(2);
+
+                            if ( ((LA49_5>=15 && LA49_5<=19)||LA49_5==28||(LA49_5>=143 && LA49_5<=145)||LA49_5==179||LA49_5==229||(LA49_5>=278 && LA49_5<=283)) ) {
+                                alt49=1;
+                            }
+                            else if ( (LA49_5==224) ) {
+                                int LA49_6 = input.LA(3);
+
+                                if ( (LA49_6==RULE_XLIA_ID||(LA49_6>=15 && LA49_6<=18)||LA49_6==39||(LA49_6>=59 && LA49_6<=74)||(LA49_6>=129 && LA49_6<=132)||LA49_6==149||(LA49_6>=163 && LA49_6<=171)||(LA49_6>=231 && LA49_6<=237)||LA49_6==277||LA49_6==282) ) {
+                                    alt49=1;
+                                }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 224:
+                            {
+                            int LA49_6 = input.LA(2);
+
+                            if ( (LA49_6==RULE_XLIA_ID||(LA49_6>=15 && LA49_6<=18)||LA49_6==39||(LA49_6>=59 && LA49_6<=74)||(LA49_6>=129 && LA49_6<=132)||LA49_6==149||(LA49_6>=163 && LA49_6<=171)||(LA49_6>=231 && LA49_6<=237)||LA49_6==277||LA49_6==282) ) {
+                                alt49=1;
+                            }
+
+
+                            }
+                            break;
+                        case 15:
+                        case 16:
+                        case 17:
+                        case 18:
+                        case 19:
+                        case 179:
+                        case 229:
+                        case 278:
+                        case 279:
+                        case 280:
+                        case 281:
+                        case 282:
+                        case 283:
+                            {
+                            alt49=1;
+                            }
+                            break;
+
+                        }
+
+                        switch (alt49) {
+                    	case 1 :
+                    	    // InternalFormalML.g:7512:4: rule__Procedure__Alternatives_7_1
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_6);
+                    	    rule__Procedure__Alternatives_7_1();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop49;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getAlternatives_7_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_7"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_7_0_1"
+    // InternalFormalML.g:7520:1: rule__Procedure__Alternatives_7_0_1 : ( ( ( rule__Procedure__Group_7_0_1_0__0 ) ) | ( ( rule__Procedure__Group_7_0_1_1__0 ) ) | ( ( rule__Procedure__Group_7_0_1_2__0 ) ) | ( ( rule__Procedure__Group_7_0_1_3__0 ) ) );
+    public final void rule__Procedure__Alternatives_7_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7524:1: ( ( ( rule__Procedure__Group_7_0_1_0__0 ) ) | ( ( rule__Procedure__Group_7_0_1_1__0 ) ) | ( ( rule__Procedure__Group_7_0_1_2__0 ) ) | ( ( rule__Procedure__Group_7_0_1_3__0 ) ) )
+            int alt51=4;
+            switch ( input.LA(1) ) {
+            case 175:
+                {
+                alt51=1;
+                }
+                break;
+            case 173:
+                {
+                alt51=2;
+                }
+                break;
+            case 176:
+                {
+                alt51=3;
+                }
+                break;
+            case 157:
+                {
+                alt51=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 51, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt51) {
+                case 1 :
+                    // InternalFormalML.g:7525:2: ( ( rule__Procedure__Group_7_0_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:7525:2: ( ( rule__Procedure__Group_7_0_1_0__0 ) )
+                    // InternalFormalML.g:7526:3: ( rule__Procedure__Group_7_0_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_7_0_1_0()); 
+                    }
+                    // InternalFormalML.g:7527:3: ( rule__Procedure__Group_7_0_1_0__0 )
+                    // InternalFormalML.g:7527:4: rule__Procedure__Group_7_0_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_7_0_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_7_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7531:2: ( ( rule__Procedure__Group_7_0_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7531:2: ( ( rule__Procedure__Group_7_0_1_1__0 ) )
+                    // InternalFormalML.g:7532:3: ( rule__Procedure__Group_7_0_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_7_0_1_1()); 
+                    }
+                    // InternalFormalML.g:7533:3: ( rule__Procedure__Group_7_0_1_1__0 )
+                    // InternalFormalML.g:7533:4: rule__Procedure__Group_7_0_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_7_0_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_7_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7537:2: ( ( rule__Procedure__Group_7_0_1_2__0 ) )
+                    {
+                    // InternalFormalML.g:7537:2: ( ( rule__Procedure__Group_7_0_1_2__0 ) )
+                    // InternalFormalML.g:7538:3: ( rule__Procedure__Group_7_0_1_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_7_0_1_2()); 
+                    }
+                    // InternalFormalML.g:7539:3: ( rule__Procedure__Group_7_0_1_2__0 )
+                    // InternalFormalML.g:7539:4: rule__Procedure__Group_7_0_1_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_7_0_1_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_7_0_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7543:2: ( ( rule__Procedure__Group_7_0_1_3__0 ) )
+                    {
+                    // InternalFormalML.g:7543:2: ( ( rule__Procedure__Group_7_0_1_3__0 ) )
+                    // InternalFormalML.g:7544:3: ( rule__Procedure__Group_7_0_1_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_7_0_1_3()); 
+                    }
+                    // InternalFormalML.g:7545:3: ( rule__Procedure__Group_7_0_1_3__0 )
+                    // InternalFormalML.g:7545:4: rule__Procedure__Group_7_0_1_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_7_0_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_7_0_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_7_0_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_7_0_1_0_1"
+    // InternalFormalML.g:7553:1: rule__Procedure__Alternatives_7_0_1_0_1 : ( ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_0 ) ) | ( ( rule__Procedure__Group_7_0_1_0_1_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_7_0_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7557:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_0 ) ) | ( ( rule__Procedure__Group_7_0_1_0_1_1__0 ) ) )
+            int alt52=2;
+            int LA52_0 = input.LA(1);
+
+            if ( (LA52_0==16) ) {
+                alt52=1;
+            }
+            else if ( (LA52_0==199) ) {
+                alt52=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 52, 0, input);
+
+                throw nvae;
+            }
+            switch (alt52) {
+                case 1 :
+                    // InternalFormalML.g:7558:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:7558:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_0 ) )
+                    // InternalFormalML.g:7559:3: ( rule__Procedure__ParameterAssignment_7_0_1_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:7560:3: ( rule__Procedure__ParameterAssignment_7_0_1_0_1_0 )
+                    // InternalFormalML.g:7560:4: rule__Procedure__ParameterAssignment_7_0_1_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ParameterAssignment_7_0_1_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7564:2: ( ( rule__Procedure__Group_7_0_1_0_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7564:2: ( ( rule__Procedure__Group_7_0_1_0_1_1__0 ) )
+                    // InternalFormalML.g:7565:3: ( rule__Procedure__Group_7_0_1_0_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_7_0_1_0_1_1()); 
+                    }
+                    // InternalFormalML.g:7566:3: ( rule__Procedure__Group_7_0_1_0_1_1__0 )
+                    // InternalFormalML.g:7566:4: rule__Procedure__Group_7_0_1_0_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_7_0_1_0_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_7_0_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_7_0_1_0_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_7_0_1_1_1"
+    // InternalFormalML.g:7574:1: rule__Procedure__Alternatives_7_0_1_1_1 : ( ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_0 ) ) | ( ( rule__Procedure__Group_7_0_1_1_1_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_7_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7578:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_0 ) ) | ( ( rule__Procedure__Group_7_0_1_1_1_1__0 ) ) )
+            int alt53=2;
+            int LA53_0 = input.LA(1);
+
+            if ( (LA53_0==16) ) {
+                alt53=1;
+            }
+            else if ( (LA53_0==199) ) {
+                alt53=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 53, 0, input);
+
+                throw nvae;
+            }
+            switch (alt53) {
+                case 1 :
+                    // InternalFormalML.g:7579:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:7579:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_0 ) )
+                    // InternalFormalML.g:7580:3: ( rule__Procedure__ParameterAssignment_7_0_1_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_0()); 
+                    }
+                    // InternalFormalML.g:7581:3: ( rule__Procedure__ParameterAssignment_7_0_1_1_1_0 )
+                    // InternalFormalML.g:7581:4: rule__Procedure__ParameterAssignment_7_0_1_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ParameterAssignment_7_0_1_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7585:2: ( ( rule__Procedure__Group_7_0_1_1_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7585:2: ( ( rule__Procedure__Group_7_0_1_1_1_1__0 ) )
+                    // InternalFormalML.g:7586:3: ( rule__Procedure__Group_7_0_1_1_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_7_0_1_1_1_1()); 
+                    }
+                    // InternalFormalML.g:7587:3: ( rule__Procedure__Group_7_0_1_1_1_1__0 )
+                    // InternalFormalML.g:7587:4: rule__Procedure__Group_7_0_1_1_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_7_0_1_1_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_7_0_1_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_7_0_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_7_0_1_2_1"
+    // InternalFormalML.g:7595:1: rule__Procedure__Alternatives_7_0_1_2_1 : ( ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_0 ) ) | ( ( rule__Procedure__Group_7_0_1_2_1_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_7_0_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7599:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_0 ) ) | ( ( rule__Procedure__Group_7_0_1_2_1_1__0 ) ) )
+            int alt54=2;
+            int LA54_0 = input.LA(1);
+
+            if ( (LA54_0==16) ) {
+                alt54=1;
+            }
+            else if ( (LA54_0==199) ) {
+                alt54=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 54, 0, input);
+
+                throw nvae;
+            }
+            switch (alt54) {
+                case 1 :
+                    // InternalFormalML.g:7600:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_0 ) )
+                    {
+                    // InternalFormalML.g:7600:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_0 ) )
+                    // InternalFormalML.g:7601:3: ( rule__Procedure__ParameterAssignment_7_0_1_2_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_0()); 
+                    }
+                    // InternalFormalML.g:7602:3: ( rule__Procedure__ParameterAssignment_7_0_1_2_1_0 )
+                    // InternalFormalML.g:7602:4: rule__Procedure__ParameterAssignment_7_0_1_2_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ParameterAssignment_7_0_1_2_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7606:2: ( ( rule__Procedure__Group_7_0_1_2_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7606:2: ( ( rule__Procedure__Group_7_0_1_2_1_1__0 ) )
+                    // InternalFormalML.g:7607:3: ( rule__Procedure__Group_7_0_1_2_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_7_0_1_2_1_1()); 
+                    }
+                    // InternalFormalML.g:7608:3: ( rule__Procedure__Group_7_0_1_2_1_1__0 )
+                    // InternalFormalML.g:7608:4: rule__Procedure__Group_7_0_1_2_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_7_0_1_2_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_7_0_1_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_7_0_1_2_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_7_0_1_3_1"
+    // InternalFormalML.g:7616:1: rule__Procedure__Alternatives_7_0_1_3_1 : ( ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_0 ) ) | ( ( rule__Procedure__Group_7_0_1_3_1_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_7_0_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7620:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_0 ) ) | ( ( rule__Procedure__Group_7_0_1_3_1_1__0 ) ) )
+            int alt55=2;
+            int LA55_0 = input.LA(1);
+
+            if ( (LA55_0==16) ) {
+                alt55=1;
+            }
+            else if ( (LA55_0==199) ) {
+                alt55=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 55, 0, input);
+
+                throw nvae;
+            }
+            switch (alt55) {
+                case 1 :
+                    // InternalFormalML.g:7621:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_0 ) )
+                    {
+                    // InternalFormalML.g:7621:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_0 ) )
+                    // InternalFormalML.g:7622:3: ( rule__Procedure__ParameterAssignment_7_0_1_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_0()); 
+                    }
+                    // InternalFormalML.g:7623:3: ( rule__Procedure__ParameterAssignment_7_0_1_3_1_0 )
+                    // InternalFormalML.g:7623:4: rule__Procedure__ParameterAssignment_7_0_1_3_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ParameterAssignment_7_0_1_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7627:2: ( ( rule__Procedure__Group_7_0_1_3_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7627:2: ( ( rule__Procedure__Group_7_0_1_3_1_1__0 ) )
+                    // InternalFormalML.g:7628:3: ( rule__Procedure__Group_7_0_1_3_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_7_0_1_3_1_1()); 
+                    }
+                    // InternalFormalML.g:7629:3: ( rule__Procedure__Group_7_0_1_3_1_1__0 )
+                    // InternalFormalML.g:7629:4: rule__Procedure__Group_7_0_1_3_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_7_0_1_3_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_7_0_1_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_7_0_1_3_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_7_1"
+    // InternalFormalML.g:7637:1: rule__Procedure__Alternatives_7_1 : ( ( ( rule__Procedure__PortAssignment_7_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_7_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_7_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_7_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_7_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_7_1_5 ) ) );
+    public final void rule__Procedure__Alternatives_7_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7641:1: ( ( ( rule__Procedure__PortAssignment_7_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_7_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_7_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_7_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_7_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_7_1_5 ) ) )
+            int alt56=6;
+            alt56 = dfa56.predict(input);
+            switch (alt56) {
+                case 1 :
+                    // InternalFormalML.g:7642:2: ( ( rule__Procedure__PortAssignment_7_1_0 ) )
+                    {
+                    // InternalFormalML.g:7642:2: ( ( rule__Procedure__PortAssignment_7_1_0 ) )
+                    // InternalFormalML.g:7643:3: ( rule__Procedure__PortAssignment_7_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPortAssignment_7_1_0()); 
+                    }
+                    // InternalFormalML.g:7644:3: ( rule__Procedure__PortAssignment_7_1_0 )
+                    // InternalFormalML.g:7644:4: rule__Procedure__PortAssignment_7_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PortAssignment_7_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPortAssignment_7_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7648:2: ( ( rule__Procedure__SignalAssignment_7_1_1 ) )
+                    {
+                    // InternalFormalML.g:7648:2: ( ( rule__Procedure__SignalAssignment_7_1_1 ) )
+                    // InternalFormalML.g:7649:3: ( rule__Procedure__SignalAssignment_7_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getSignalAssignment_7_1_1()); 
+                    }
+                    // InternalFormalML.g:7650:3: ( rule__Procedure__SignalAssignment_7_1_1 )
+                    // InternalFormalML.g:7650:4: rule__Procedure__SignalAssignment_7_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__SignalAssignment_7_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getSignalAssignment_7_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7654:2: ( ( rule__Procedure__BufferAssignment_7_1_2 ) )
+                    {
+                    // InternalFormalML.g:7654:2: ( ( rule__Procedure__BufferAssignment_7_1_2 ) )
+                    // InternalFormalML.g:7655:3: ( rule__Procedure__BufferAssignment_7_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getBufferAssignment_7_1_2()); 
+                    }
+                    // InternalFormalML.g:7656:3: ( rule__Procedure__BufferAssignment_7_1_2 )
+                    // InternalFormalML.g:7656:4: rule__Procedure__BufferAssignment_7_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__BufferAssignment_7_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getBufferAssignment_7_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7660:2: ( ( rule__Procedure__ChannelAssignment_7_1_3 ) )
+                    {
+                    // InternalFormalML.g:7660:2: ( ( rule__Procedure__ChannelAssignment_7_1_3 ) )
+                    // InternalFormalML.g:7661:3: ( rule__Procedure__ChannelAssignment_7_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getChannelAssignment_7_1_3()); 
+                    }
+                    // InternalFormalML.g:7662:3: ( rule__Procedure__ChannelAssignment_7_1_3 )
+                    // InternalFormalML.g:7662:4: rule__Procedure__ChannelAssignment_7_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ChannelAssignment_7_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getChannelAssignment_7_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7666:2: ( ( rule__Procedure__TypedefAssignment_7_1_4 ) )
+                    {
+                    // InternalFormalML.g:7666:2: ( ( rule__Procedure__TypedefAssignment_7_1_4 ) )
+                    // InternalFormalML.g:7667:3: ( rule__Procedure__TypedefAssignment_7_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getTypedefAssignment_7_1_4()); 
+                    }
+                    // InternalFormalML.g:7668:3: ( rule__Procedure__TypedefAssignment_7_1_4 )
+                    // InternalFormalML.g:7668:4: rule__Procedure__TypedefAssignment_7_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__TypedefAssignment_7_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getTypedefAssignment_7_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7672:2: ( ( rule__Procedure__PropertyAssignment_7_1_5 ) )
+                    {
+                    // InternalFormalML.g:7672:2: ( ( rule__Procedure__PropertyAssignment_7_1_5 ) )
+                    // InternalFormalML.g:7673:3: ( rule__Procedure__PropertyAssignment_7_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPropertyAssignment_7_1_5()); 
+                    }
+                    // InternalFormalML.g:7674:3: ( rule__Procedure__PropertyAssignment_7_1_5 )
+                    // InternalFormalML.g:7674:4: rule__Procedure__PropertyAssignment_7_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PropertyAssignment_7_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPropertyAssignment_7_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_7_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_8"
+    // InternalFormalML.g:7682:1: rule__Procedure__Alternatives_8 : ( ( ( rule__Procedure__Group_8_0__0 ) ) | ( ( rule__Procedure__Group_8_1__0 ) ) | ( ( rule__Procedure__Group_8_2__0 ) ) | ( ( rule__Procedure__Group_8_3__0 ) ) );
+    public final void rule__Procedure__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7686:1: ( ( ( rule__Procedure__Group_8_0__0 ) ) | ( ( rule__Procedure__Group_8_1__0 ) ) | ( ( rule__Procedure__Group_8_2__0 ) ) | ( ( rule__Procedure__Group_8_3__0 ) ) )
+            int alt57=4;
+            switch ( input.LA(1) ) {
+            case 217:
+                {
+                alt57=1;
+                }
+                break;
+            case 218:
+                {
+                alt57=2;
+                }
+                break;
+            case 219:
+                {
+                alt57=3;
+                }
+                break;
+            case 220:
+                {
+                alt57=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 57, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt57) {
+                case 1 :
+                    // InternalFormalML.g:7687:2: ( ( rule__Procedure__Group_8_0__0 ) )
+                    {
+                    // InternalFormalML.g:7687:2: ( ( rule__Procedure__Group_8_0__0 ) )
+                    // InternalFormalML.g:7688:3: ( rule__Procedure__Group_8_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_8_0()); 
+                    }
+                    // InternalFormalML.g:7689:3: ( rule__Procedure__Group_8_0__0 )
+                    // InternalFormalML.g:7689:4: rule__Procedure__Group_8_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_8_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7693:2: ( ( rule__Procedure__Group_8_1__0 ) )
+                    {
+                    // InternalFormalML.g:7693:2: ( ( rule__Procedure__Group_8_1__0 ) )
+                    // InternalFormalML.g:7694:3: ( rule__Procedure__Group_8_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_8_1()); 
+                    }
+                    // InternalFormalML.g:7695:3: ( rule__Procedure__Group_8_1__0 )
+                    // InternalFormalML.g:7695:4: rule__Procedure__Group_8_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_8_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7699:2: ( ( rule__Procedure__Group_8_2__0 ) )
+                    {
+                    // InternalFormalML.g:7699:2: ( ( rule__Procedure__Group_8_2__0 ) )
+                    // InternalFormalML.g:7700:3: ( rule__Procedure__Group_8_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_8_2()); 
+                    }
+                    // InternalFormalML.g:7701:3: ( rule__Procedure__Group_8_2__0 )
+                    // InternalFormalML.g:7701:4: rule__Procedure__Group_8_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_8_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_8_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7705:2: ( ( rule__Procedure__Group_8_3__0 ) )
+                    {
+                    // InternalFormalML.g:7705:2: ( ( rule__Procedure__Group_8_3__0 ) )
+                    // InternalFormalML.g:7706:3: ( rule__Procedure__Group_8_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_8_3()); 
+                    }
+                    // InternalFormalML.g:7707:3: ( rule__Procedure__Group_8_3__0 )
+                    // InternalFormalML.g:7707:4: rule__Procedure__Group_8_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_8_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_8_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_8"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_8_0_1"
+    // InternalFormalML.g:7715:1: rule__Procedure__Alternatives_8_0_1 : ( ( ( rule__Procedure__ParameterAssignment_8_0_1_0 ) ) | ( ( rule__Procedure__Group_8_0_1_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_8_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7719:1: ( ( ( rule__Procedure__ParameterAssignment_8_0_1_0 ) ) | ( ( rule__Procedure__Group_8_0_1_1__0 ) ) )
+            int alt58=2;
+            int LA58_0 = input.LA(1);
+
+            if ( (LA58_0==16) ) {
+                alt58=1;
+            }
+            else if ( (LA58_0==199) ) {
+                alt58=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 58, 0, input);
+
+                throw nvae;
+            }
+            switch (alt58) {
+                case 1 :
+                    // InternalFormalML.g:7720:2: ( ( rule__Procedure__ParameterAssignment_8_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:7720:2: ( ( rule__Procedure__ParameterAssignment_8_0_1_0 ) )
+                    // InternalFormalML.g:7721:3: ( rule__Procedure__ParameterAssignment_8_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_0()); 
+                    }
+                    // InternalFormalML.g:7722:3: ( rule__Procedure__ParameterAssignment_8_0_1_0 )
+                    // InternalFormalML.g:7722:4: rule__Procedure__ParameterAssignment_8_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ParameterAssignment_8_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7726:2: ( ( rule__Procedure__Group_8_0_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7726:2: ( ( rule__Procedure__Group_8_0_1_1__0 ) )
+                    // InternalFormalML.g:7727:3: ( rule__Procedure__Group_8_0_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_8_0_1_1()); 
+                    }
+                    // InternalFormalML.g:7728:3: ( rule__Procedure__Group_8_0_1_1__0 )
+                    // InternalFormalML.g:7728:4: rule__Procedure__Group_8_0_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_8_0_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_8_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_8_0_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_8_1_1"
+    // InternalFormalML.g:7736:1: rule__Procedure__Alternatives_8_1_1 : ( ( ( rule__Procedure__ParameterAssignment_8_1_1_0 ) ) | ( ( rule__Procedure__Group_8_1_1_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_8_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7740:1: ( ( ( rule__Procedure__ParameterAssignment_8_1_1_0 ) ) | ( ( rule__Procedure__Group_8_1_1_1__0 ) ) )
+            int alt59=2;
+            int LA59_0 = input.LA(1);
+
+            if ( (LA59_0==16) ) {
+                alt59=1;
+            }
+            else if ( (LA59_0==199) ) {
+                alt59=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 59, 0, input);
+
+                throw nvae;
+            }
+            switch (alt59) {
+                case 1 :
+                    // InternalFormalML.g:7741:2: ( ( rule__Procedure__ParameterAssignment_8_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:7741:2: ( ( rule__Procedure__ParameterAssignment_8_1_1_0 ) )
+                    // InternalFormalML.g:7742:3: ( rule__Procedure__ParameterAssignment_8_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_0()); 
+                    }
+                    // InternalFormalML.g:7743:3: ( rule__Procedure__ParameterAssignment_8_1_1_0 )
+                    // InternalFormalML.g:7743:4: rule__Procedure__ParameterAssignment_8_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ParameterAssignment_8_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7747:2: ( ( rule__Procedure__Group_8_1_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7747:2: ( ( rule__Procedure__Group_8_1_1_1__0 ) )
+                    // InternalFormalML.g:7748:3: ( rule__Procedure__Group_8_1_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_8_1_1_1()); 
+                    }
+                    // InternalFormalML.g:7749:3: ( rule__Procedure__Group_8_1_1_1__0 )
+                    // InternalFormalML.g:7749:4: rule__Procedure__Group_8_1_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_8_1_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_8_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_8_1_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_8_2_1"
+    // InternalFormalML.g:7757:1: rule__Procedure__Alternatives_8_2_1 : ( ( ( rule__Procedure__ParameterAssignment_8_2_1_0 ) ) | ( ( rule__Procedure__Group_8_2_1_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_8_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7761:1: ( ( ( rule__Procedure__ParameterAssignment_8_2_1_0 ) ) | ( ( rule__Procedure__Group_8_2_1_1__0 ) ) )
+            int alt60=2;
+            int LA60_0 = input.LA(1);
+
+            if ( (LA60_0==16) ) {
+                alt60=1;
+            }
+            else if ( (LA60_0==199) ) {
+                alt60=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 60, 0, input);
+
+                throw nvae;
+            }
+            switch (alt60) {
+                case 1 :
+                    // InternalFormalML.g:7762:2: ( ( rule__Procedure__ParameterAssignment_8_2_1_0 ) )
+                    {
+                    // InternalFormalML.g:7762:2: ( ( rule__Procedure__ParameterAssignment_8_2_1_0 ) )
+                    // InternalFormalML.g:7763:3: ( rule__Procedure__ParameterAssignment_8_2_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_0()); 
+                    }
+                    // InternalFormalML.g:7764:3: ( rule__Procedure__ParameterAssignment_8_2_1_0 )
+                    // InternalFormalML.g:7764:4: rule__Procedure__ParameterAssignment_8_2_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ParameterAssignment_8_2_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7768:2: ( ( rule__Procedure__Group_8_2_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7768:2: ( ( rule__Procedure__Group_8_2_1_1__0 ) )
+                    // InternalFormalML.g:7769:3: ( rule__Procedure__Group_8_2_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_8_2_1_1()); 
+                    }
+                    // InternalFormalML.g:7770:3: ( rule__Procedure__Group_8_2_1_1__0 )
+                    // InternalFormalML.g:7770:4: rule__Procedure__Group_8_2_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_8_2_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_8_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_8_2_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_8_3_1"
+    // InternalFormalML.g:7778:1: rule__Procedure__Alternatives_8_3_1 : ( ( ( rule__Procedure__ParameterAssignment_8_3_1_0 ) ) | ( ( rule__Procedure__Group_8_3_1_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_8_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7782:1: ( ( ( rule__Procedure__ParameterAssignment_8_3_1_0 ) ) | ( ( rule__Procedure__Group_8_3_1_1__0 ) ) )
+            int alt61=2;
+            int LA61_0 = input.LA(1);
+
+            if ( (LA61_0==16) ) {
+                alt61=1;
+            }
+            else if ( (LA61_0==199) ) {
+                alt61=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 61, 0, input);
+
+                throw nvae;
+            }
+            switch (alt61) {
+                case 1 :
+                    // InternalFormalML.g:7783:2: ( ( rule__Procedure__ParameterAssignment_8_3_1_0 ) )
+                    {
+                    // InternalFormalML.g:7783:2: ( ( rule__Procedure__ParameterAssignment_8_3_1_0 ) )
+                    // InternalFormalML.g:7784:3: ( rule__Procedure__ParameterAssignment_8_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_0()); 
+                    }
+                    // InternalFormalML.g:7785:3: ( rule__Procedure__ParameterAssignment_8_3_1_0 )
+                    // InternalFormalML.g:7785:4: rule__Procedure__ParameterAssignment_8_3_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ParameterAssignment_8_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7789:2: ( ( rule__Procedure__Group_8_3_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:7789:2: ( ( rule__Procedure__Group_8_3_1_1__0 ) )
+                    // InternalFormalML.g:7790:3: ( rule__Procedure__Group_8_3_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_8_3_1_1()); 
+                    }
+                    // InternalFormalML.g:7791:3: ( rule__Procedure__Group_8_3_1_1__0 )
+                    // InternalFormalML.g:7791:4: rule__Procedure__Group_8_3_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_8_3_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_8_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_8_3_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_9"
+    // InternalFormalML.g:7799:1: rule__Procedure__Alternatives_9 : ( ( ( rule__Procedure__Group_9_0__0 ) ) | ( ( rule__Procedure__Group_9_1__0 ) ) | ( ( rule__Procedure__Group_9_2__0 ) ) | ( ( rule__Procedure__Group_9_3__0 ) ) );
+    public final void rule__Procedure__Alternatives_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7803:1: ( ( ( rule__Procedure__Group_9_0__0 ) ) | ( ( rule__Procedure__Group_9_1__0 ) ) | ( ( rule__Procedure__Group_9_2__0 ) ) | ( ( rule__Procedure__Group_9_3__0 ) ) )
+            int alt62=4;
+            switch ( input.LA(1) ) {
+            case 202:
+                {
+                alt62=1;
+                }
+                break;
+            case 203:
+                {
+                alt62=2;
+                }
+                break;
+            case 204:
+                {
+                alt62=3;
+                }
+                break;
+            case 205:
+                {
+                alt62=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 62, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt62) {
+                case 1 :
+                    // InternalFormalML.g:7804:2: ( ( rule__Procedure__Group_9_0__0 ) )
+                    {
+                    // InternalFormalML.g:7804:2: ( ( rule__Procedure__Group_9_0__0 ) )
+                    // InternalFormalML.g:7805:3: ( rule__Procedure__Group_9_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_9_0()); 
+                    }
+                    // InternalFormalML.g:7806:3: ( rule__Procedure__Group_9_0__0 )
+                    // InternalFormalML.g:7806:4: rule__Procedure__Group_9_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_9_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_9_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7810:2: ( ( rule__Procedure__Group_9_1__0 ) )
+                    {
+                    // InternalFormalML.g:7810:2: ( ( rule__Procedure__Group_9_1__0 ) )
+                    // InternalFormalML.g:7811:3: ( rule__Procedure__Group_9_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_9_1()); 
+                    }
+                    // InternalFormalML.g:7812:3: ( rule__Procedure__Group_9_1__0 )
+                    // InternalFormalML.g:7812:4: rule__Procedure__Group_9_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_9_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_9_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7816:2: ( ( rule__Procedure__Group_9_2__0 ) )
+                    {
+                    // InternalFormalML.g:7816:2: ( ( rule__Procedure__Group_9_2__0 ) )
+                    // InternalFormalML.g:7817:3: ( rule__Procedure__Group_9_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_9_2()); 
+                    }
+                    // InternalFormalML.g:7818:3: ( rule__Procedure__Group_9_2__0 )
+                    // InternalFormalML.g:7818:4: rule__Procedure__Group_9_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_9_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_9_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7822:2: ( ( rule__Procedure__Group_9_3__0 ) )
+                    {
+                    // InternalFormalML.g:7822:2: ( ( rule__Procedure__Group_9_3__0 ) )
+                    // InternalFormalML.g:7823:3: ( rule__Procedure__Group_9_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_9_3()); 
+                    }
+                    // InternalFormalML.g:7824:3: ( rule__Procedure__Group_9_3__0 )
+                    // InternalFormalML.g:7824:4: rule__Procedure__Group_9_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_9_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_9_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_9"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_9_0_1"
+    // InternalFormalML.g:7832:1: rule__Procedure__Alternatives_9_0_1 : ( ( ( rule__Procedure__PortAssignment_9_0_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_0_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_0_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_0_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_0_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_0_1_5 ) ) );
+    public final void rule__Procedure__Alternatives_9_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7836:1: ( ( ( rule__Procedure__PortAssignment_9_0_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_0_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_0_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_0_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_0_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_0_1_5 ) ) )
+            int alt63=6;
+            alt63 = dfa63.predict(input);
+            switch (alt63) {
+                case 1 :
+                    // InternalFormalML.g:7837:2: ( ( rule__Procedure__PortAssignment_9_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:7837:2: ( ( rule__Procedure__PortAssignment_9_0_1_0 ) )
+                    // InternalFormalML.g:7838:3: ( rule__Procedure__PortAssignment_9_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPortAssignment_9_0_1_0()); 
+                    }
+                    // InternalFormalML.g:7839:3: ( rule__Procedure__PortAssignment_9_0_1_0 )
+                    // InternalFormalML.g:7839:4: rule__Procedure__PortAssignment_9_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PortAssignment_9_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPortAssignment_9_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7843:2: ( ( rule__Procedure__SignalAssignment_9_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:7843:2: ( ( rule__Procedure__SignalAssignment_9_0_1_1 ) )
+                    // InternalFormalML.g:7844:3: ( rule__Procedure__SignalAssignment_9_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getSignalAssignment_9_0_1_1()); 
+                    }
+                    // InternalFormalML.g:7845:3: ( rule__Procedure__SignalAssignment_9_0_1_1 )
+                    // InternalFormalML.g:7845:4: rule__Procedure__SignalAssignment_9_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__SignalAssignment_9_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getSignalAssignment_9_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7849:2: ( ( rule__Procedure__BufferAssignment_9_0_1_2 ) )
+                    {
+                    // InternalFormalML.g:7849:2: ( ( rule__Procedure__BufferAssignment_9_0_1_2 ) )
+                    // InternalFormalML.g:7850:3: ( rule__Procedure__BufferAssignment_9_0_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getBufferAssignment_9_0_1_2()); 
+                    }
+                    // InternalFormalML.g:7851:3: ( rule__Procedure__BufferAssignment_9_0_1_2 )
+                    // InternalFormalML.g:7851:4: rule__Procedure__BufferAssignment_9_0_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__BufferAssignment_9_0_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getBufferAssignment_9_0_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7855:2: ( ( rule__Procedure__ChannelAssignment_9_0_1_3 ) )
+                    {
+                    // InternalFormalML.g:7855:2: ( ( rule__Procedure__ChannelAssignment_9_0_1_3 ) )
+                    // InternalFormalML.g:7856:3: ( rule__Procedure__ChannelAssignment_9_0_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getChannelAssignment_9_0_1_3()); 
+                    }
+                    // InternalFormalML.g:7857:3: ( rule__Procedure__ChannelAssignment_9_0_1_3 )
+                    // InternalFormalML.g:7857:4: rule__Procedure__ChannelAssignment_9_0_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ChannelAssignment_9_0_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getChannelAssignment_9_0_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7861:2: ( ( rule__Procedure__TypedefAssignment_9_0_1_4 ) )
+                    {
+                    // InternalFormalML.g:7861:2: ( ( rule__Procedure__TypedefAssignment_9_0_1_4 ) )
+                    // InternalFormalML.g:7862:3: ( rule__Procedure__TypedefAssignment_9_0_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getTypedefAssignment_9_0_1_4()); 
+                    }
+                    // InternalFormalML.g:7863:3: ( rule__Procedure__TypedefAssignment_9_0_1_4 )
+                    // InternalFormalML.g:7863:4: rule__Procedure__TypedefAssignment_9_0_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__TypedefAssignment_9_0_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getTypedefAssignment_9_0_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7867:2: ( ( rule__Procedure__PropertyAssignment_9_0_1_5 ) )
+                    {
+                    // InternalFormalML.g:7867:2: ( ( rule__Procedure__PropertyAssignment_9_0_1_5 ) )
+                    // InternalFormalML.g:7868:3: ( rule__Procedure__PropertyAssignment_9_0_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPropertyAssignment_9_0_1_5()); 
+                    }
+                    // InternalFormalML.g:7869:3: ( rule__Procedure__PropertyAssignment_9_0_1_5 )
+                    // InternalFormalML.g:7869:4: rule__Procedure__PropertyAssignment_9_0_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PropertyAssignment_9_0_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPropertyAssignment_9_0_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_9_0_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_9_1_1"
+    // InternalFormalML.g:7877:1: rule__Procedure__Alternatives_9_1_1 : ( ( ( rule__Procedure__PortAssignment_9_1_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_1_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_1_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_1_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_1_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_1_1_5 ) ) );
+    public final void rule__Procedure__Alternatives_9_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7881:1: ( ( ( rule__Procedure__PortAssignment_9_1_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_1_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_1_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_1_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_1_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_1_1_5 ) ) )
+            int alt64=6;
+            alt64 = dfa64.predict(input);
+            switch (alt64) {
+                case 1 :
+                    // InternalFormalML.g:7882:2: ( ( rule__Procedure__PortAssignment_9_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:7882:2: ( ( rule__Procedure__PortAssignment_9_1_1_0 ) )
+                    // InternalFormalML.g:7883:3: ( rule__Procedure__PortAssignment_9_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPortAssignment_9_1_1_0()); 
+                    }
+                    // InternalFormalML.g:7884:3: ( rule__Procedure__PortAssignment_9_1_1_0 )
+                    // InternalFormalML.g:7884:4: rule__Procedure__PortAssignment_9_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PortAssignment_9_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPortAssignment_9_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7888:2: ( ( rule__Procedure__SignalAssignment_9_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:7888:2: ( ( rule__Procedure__SignalAssignment_9_1_1_1 ) )
+                    // InternalFormalML.g:7889:3: ( rule__Procedure__SignalAssignment_9_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getSignalAssignment_9_1_1_1()); 
+                    }
+                    // InternalFormalML.g:7890:3: ( rule__Procedure__SignalAssignment_9_1_1_1 )
+                    // InternalFormalML.g:7890:4: rule__Procedure__SignalAssignment_9_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__SignalAssignment_9_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getSignalAssignment_9_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7894:2: ( ( rule__Procedure__BufferAssignment_9_1_1_2 ) )
+                    {
+                    // InternalFormalML.g:7894:2: ( ( rule__Procedure__BufferAssignment_9_1_1_2 ) )
+                    // InternalFormalML.g:7895:3: ( rule__Procedure__BufferAssignment_9_1_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getBufferAssignment_9_1_1_2()); 
+                    }
+                    // InternalFormalML.g:7896:3: ( rule__Procedure__BufferAssignment_9_1_1_2 )
+                    // InternalFormalML.g:7896:4: rule__Procedure__BufferAssignment_9_1_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__BufferAssignment_9_1_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getBufferAssignment_9_1_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7900:2: ( ( rule__Procedure__ChannelAssignment_9_1_1_3 ) )
+                    {
+                    // InternalFormalML.g:7900:2: ( ( rule__Procedure__ChannelAssignment_9_1_1_3 ) )
+                    // InternalFormalML.g:7901:3: ( rule__Procedure__ChannelAssignment_9_1_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getChannelAssignment_9_1_1_3()); 
+                    }
+                    // InternalFormalML.g:7902:3: ( rule__Procedure__ChannelAssignment_9_1_1_3 )
+                    // InternalFormalML.g:7902:4: rule__Procedure__ChannelAssignment_9_1_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ChannelAssignment_9_1_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getChannelAssignment_9_1_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7906:2: ( ( rule__Procedure__TypedefAssignment_9_1_1_4 ) )
+                    {
+                    // InternalFormalML.g:7906:2: ( ( rule__Procedure__TypedefAssignment_9_1_1_4 ) )
+                    // InternalFormalML.g:7907:3: ( rule__Procedure__TypedefAssignment_9_1_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getTypedefAssignment_9_1_1_4()); 
+                    }
+                    // InternalFormalML.g:7908:3: ( rule__Procedure__TypedefAssignment_9_1_1_4 )
+                    // InternalFormalML.g:7908:4: rule__Procedure__TypedefAssignment_9_1_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__TypedefAssignment_9_1_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getTypedefAssignment_9_1_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7912:2: ( ( rule__Procedure__PropertyAssignment_9_1_1_5 ) )
+                    {
+                    // InternalFormalML.g:7912:2: ( ( rule__Procedure__PropertyAssignment_9_1_1_5 ) )
+                    // InternalFormalML.g:7913:3: ( rule__Procedure__PropertyAssignment_9_1_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPropertyAssignment_9_1_1_5()); 
+                    }
+                    // InternalFormalML.g:7914:3: ( rule__Procedure__PropertyAssignment_9_1_1_5 )
+                    // InternalFormalML.g:7914:4: rule__Procedure__PropertyAssignment_9_1_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PropertyAssignment_9_1_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPropertyAssignment_9_1_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_9_1_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_9_2_1"
+    // InternalFormalML.g:7922:1: rule__Procedure__Alternatives_9_2_1 : ( ( ( rule__Procedure__PortAssignment_9_2_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_2_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_2_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_2_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_2_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_2_1_5 ) ) );
+    public final void rule__Procedure__Alternatives_9_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7926:1: ( ( ( rule__Procedure__PortAssignment_9_2_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_2_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_2_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_2_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_2_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_2_1_5 ) ) )
+            int alt65=6;
+            alt65 = dfa65.predict(input);
+            switch (alt65) {
+                case 1 :
+                    // InternalFormalML.g:7927:2: ( ( rule__Procedure__PortAssignment_9_2_1_0 ) )
+                    {
+                    // InternalFormalML.g:7927:2: ( ( rule__Procedure__PortAssignment_9_2_1_0 ) )
+                    // InternalFormalML.g:7928:3: ( rule__Procedure__PortAssignment_9_2_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPortAssignment_9_2_1_0()); 
+                    }
+                    // InternalFormalML.g:7929:3: ( rule__Procedure__PortAssignment_9_2_1_0 )
+                    // InternalFormalML.g:7929:4: rule__Procedure__PortAssignment_9_2_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PortAssignment_9_2_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPortAssignment_9_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7933:2: ( ( rule__Procedure__SignalAssignment_9_2_1_1 ) )
+                    {
+                    // InternalFormalML.g:7933:2: ( ( rule__Procedure__SignalAssignment_9_2_1_1 ) )
+                    // InternalFormalML.g:7934:3: ( rule__Procedure__SignalAssignment_9_2_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getSignalAssignment_9_2_1_1()); 
+                    }
+                    // InternalFormalML.g:7935:3: ( rule__Procedure__SignalAssignment_9_2_1_1 )
+                    // InternalFormalML.g:7935:4: rule__Procedure__SignalAssignment_9_2_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__SignalAssignment_9_2_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getSignalAssignment_9_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7939:2: ( ( rule__Procedure__BufferAssignment_9_2_1_2 ) )
+                    {
+                    // InternalFormalML.g:7939:2: ( ( rule__Procedure__BufferAssignment_9_2_1_2 ) )
+                    // InternalFormalML.g:7940:3: ( rule__Procedure__BufferAssignment_9_2_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getBufferAssignment_9_2_1_2()); 
+                    }
+                    // InternalFormalML.g:7941:3: ( rule__Procedure__BufferAssignment_9_2_1_2 )
+                    // InternalFormalML.g:7941:4: rule__Procedure__BufferAssignment_9_2_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__BufferAssignment_9_2_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getBufferAssignment_9_2_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7945:2: ( ( rule__Procedure__ChannelAssignment_9_2_1_3 ) )
+                    {
+                    // InternalFormalML.g:7945:2: ( ( rule__Procedure__ChannelAssignment_9_2_1_3 ) )
+                    // InternalFormalML.g:7946:3: ( rule__Procedure__ChannelAssignment_9_2_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getChannelAssignment_9_2_1_3()); 
+                    }
+                    // InternalFormalML.g:7947:3: ( rule__Procedure__ChannelAssignment_9_2_1_3 )
+                    // InternalFormalML.g:7947:4: rule__Procedure__ChannelAssignment_9_2_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ChannelAssignment_9_2_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getChannelAssignment_9_2_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7951:2: ( ( rule__Procedure__TypedefAssignment_9_2_1_4 ) )
+                    {
+                    // InternalFormalML.g:7951:2: ( ( rule__Procedure__TypedefAssignment_9_2_1_4 ) )
+                    // InternalFormalML.g:7952:3: ( rule__Procedure__TypedefAssignment_9_2_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getTypedefAssignment_9_2_1_4()); 
+                    }
+                    // InternalFormalML.g:7953:3: ( rule__Procedure__TypedefAssignment_9_2_1_4 )
+                    // InternalFormalML.g:7953:4: rule__Procedure__TypedefAssignment_9_2_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__TypedefAssignment_9_2_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getTypedefAssignment_9_2_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7957:2: ( ( rule__Procedure__PropertyAssignment_9_2_1_5 ) )
+                    {
+                    // InternalFormalML.g:7957:2: ( ( rule__Procedure__PropertyAssignment_9_2_1_5 ) )
+                    // InternalFormalML.g:7958:3: ( rule__Procedure__PropertyAssignment_9_2_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPropertyAssignment_9_2_1_5()); 
+                    }
+                    // InternalFormalML.g:7959:3: ( rule__Procedure__PropertyAssignment_9_2_1_5 )
+                    // InternalFormalML.g:7959:4: rule__Procedure__PropertyAssignment_9_2_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PropertyAssignment_9_2_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPropertyAssignment_9_2_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_9_2_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_9_3_1"
+    // InternalFormalML.g:7967:1: rule__Procedure__Alternatives_9_3_1 : ( ( ( rule__Procedure__PortAssignment_9_3_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_3_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_3_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_3_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_3_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_3_1_5 ) ) );
+    public final void rule__Procedure__Alternatives_9_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:7971:1: ( ( ( rule__Procedure__PortAssignment_9_3_1_0 ) ) | ( ( rule__Procedure__SignalAssignment_9_3_1_1 ) ) | ( ( rule__Procedure__BufferAssignment_9_3_1_2 ) ) | ( ( rule__Procedure__ChannelAssignment_9_3_1_3 ) ) | ( ( rule__Procedure__TypedefAssignment_9_3_1_4 ) ) | ( ( rule__Procedure__PropertyAssignment_9_3_1_5 ) ) )
+            int alt66=6;
+            alt66 = dfa66.predict(input);
+            switch (alt66) {
+                case 1 :
+                    // InternalFormalML.g:7972:2: ( ( rule__Procedure__PortAssignment_9_3_1_0 ) )
+                    {
+                    // InternalFormalML.g:7972:2: ( ( rule__Procedure__PortAssignment_9_3_1_0 ) )
+                    // InternalFormalML.g:7973:3: ( rule__Procedure__PortAssignment_9_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPortAssignment_9_3_1_0()); 
+                    }
+                    // InternalFormalML.g:7974:3: ( rule__Procedure__PortAssignment_9_3_1_0 )
+                    // InternalFormalML.g:7974:4: rule__Procedure__PortAssignment_9_3_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PortAssignment_9_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPortAssignment_9_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7978:2: ( ( rule__Procedure__SignalAssignment_9_3_1_1 ) )
+                    {
+                    // InternalFormalML.g:7978:2: ( ( rule__Procedure__SignalAssignment_9_3_1_1 ) )
+                    // InternalFormalML.g:7979:3: ( rule__Procedure__SignalAssignment_9_3_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getSignalAssignment_9_3_1_1()); 
+                    }
+                    // InternalFormalML.g:7980:3: ( rule__Procedure__SignalAssignment_9_3_1_1 )
+                    // InternalFormalML.g:7980:4: rule__Procedure__SignalAssignment_9_3_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__SignalAssignment_9_3_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getSignalAssignment_9_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7984:2: ( ( rule__Procedure__BufferAssignment_9_3_1_2 ) )
+                    {
+                    // InternalFormalML.g:7984:2: ( ( rule__Procedure__BufferAssignment_9_3_1_2 ) )
+                    // InternalFormalML.g:7985:3: ( rule__Procedure__BufferAssignment_9_3_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getBufferAssignment_9_3_1_2()); 
+                    }
+                    // InternalFormalML.g:7986:3: ( rule__Procedure__BufferAssignment_9_3_1_2 )
+                    // InternalFormalML.g:7986:4: rule__Procedure__BufferAssignment_9_3_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__BufferAssignment_9_3_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getBufferAssignment_9_3_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7990:2: ( ( rule__Procedure__ChannelAssignment_9_3_1_3 ) )
+                    {
+                    // InternalFormalML.g:7990:2: ( ( rule__Procedure__ChannelAssignment_9_3_1_3 ) )
+                    // InternalFormalML.g:7991:3: ( rule__Procedure__ChannelAssignment_9_3_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getChannelAssignment_9_3_1_3()); 
+                    }
+                    // InternalFormalML.g:7992:3: ( rule__Procedure__ChannelAssignment_9_3_1_3 )
+                    // InternalFormalML.g:7992:4: rule__Procedure__ChannelAssignment_9_3_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ChannelAssignment_9_3_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getChannelAssignment_9_3_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7996:2: ( ( rule__Procedure__TypedefAssignment_9_3_1_4 ) )
+                    {
+                    // InternalFormalML.g:7996:2: ( ( rule__Procedure__TypedefAssignment_9_3_1_4 ) )
+                    // InternalFormalML.g:7997:3: ( rule__Procedure__TypedefAssignment_9_3_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getTypedefAssignment_9_3_1_4()); 
+                    }
+                    // InternalFormalML.g:7998:3: ( rule__Procedure__TypedefAssignment_9_3_1_4 )
+                    // InternalFormalML.g:7998:4: rule__Procedure__TypedefAssignment_9_3_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__TypedefAssignment_9_3_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getTypedefAssignment_9_3_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:8002:2: ( ( rule__Procedure__PropertyAssignment_9_3_1_5 ) )
+                    {
+                    // InternalFormalML.g:8002:2: ( ( rule__Procedure__PropertyAssignment_9_3_1_5 ) )
+                    // InternalFormalML.g:8003:3: ( rule__Procedure__PropertyAssignment_9_3_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getPropertyAssignment_9_3_1_5()); 
+                    }
+                    // InternalFormalML.g:8004:3: ( rule__Procedure__PropertyAssignment_9_3_1_5 )
+                    // InternalFormalML.g:8004:4: rule__Procedure__PropertyAssignment_9_3_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__PropertyAssignment_9_3_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getPropertyAssignment_9_3_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_9_3_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_10"
+    // InternalFormalML.g:8012:1: rule__Procedure__Alternatives_10 : ( ( ( rule__Procedure__Alternatives_10_0 )* ) | ( ( ( rule__Procedure__Alternatives_10_1 ) ) ( ( rule__Procedure__Alternatives_10_1 )* ) ) );
+    public final void rule__Procedure__Alternatives_10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8016:1: ( ( ( rule__Procedure__Alternatives_10_0 )* ) | ( ( ( rule__Procedure__Alternatives_10_1 ) ) ( ( rule__Procedure__Alternatives_10_1 )* ) ) )
+            int alt69=2;
+            int LA69_0 = input.LA(1);
+
+            if ( (LA69_0==EOF||(LA69_0>=35 && LA69_0<=36)||(LA69_0>=41 && LA69_0<=44)||LA69_0==51||(LA69_0>=53 && LA69_0<=57)||LA69_0==200||LA69_0==206||LA69_0==221||(LA69_0>=275 && LA69_0<=276)) ) {
+                alt69=1;
+            }
+            else if ( (LA69_0==28||(LA69_0>=143 && LA69_0<=145)||LA69_0==214||(LA69_0>=224 && LA69_0<=225)) ) {
+                alt69=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 69, 0, input);
+
+                throw nvae;
+            }
+            switch (alt69) {
+                case 1 :
+                    // InternalFormalML.g:8017:2: ( ( rule__Procedure__Alternatives_10_0 )* )
+                    {
+                    // InternalFormalML.g:8017:2: ( ( rule__Procedure__Alternatives_10_0 )* )
+                    // InternalFormalML.g:8018:3: ( rule__Procedure__Alternatives_10_0 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getAlternatives_10_0()); 
+                    }
+                    // InternalFormalML.g:8019:3: ( rule__Procedure__Alternatives_10_0 )*
+                    loop67:
+                    do {
+                        int alt67=2;
+                        int LA67_0 = input.LA(1);
+
+                        if ( ((LA67_0>=35 && LA67_0<=36)||LA67_0==206) ) {
+                            alt67=1;
+                        }
+
+
+                        switch (alt67) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8019:4: rule__Procedure__Alternatives_10_0
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_4);
+                    	    rule__Procedure__Alternatives_10_0();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop67;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getAlternatives_10_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8023:2: ( ( ( rule__Procedure__Alternatives_10_1 ) ) ( ( rule__Procedure__Alternatives_10_1 )* ) )
+                    {
+                    // InternalFormalML.g:8023:2: ( ( ( rule__Procedure__Alternatives_10_1 ) ) ( ( rule__Procedure__Alternatives_10_1 )* ) )
+                    // InternalFormalML.g:8024:3: ( ( rule__Procedure__Alternatives_10_1 ) ) ( ( rule__Procedure__Alternatives_10_1 )* )
+                    {
+                    // InternalFormalML.g:8024:3: ( ( rule__Procedure__Alternatives_10_1 ) )
+                    // InternalFormalML.g:8025:4: ( rule__Procedure__Alternatives_10_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getAlternatives_10_1()); 
+                    }
+                    // InternalFormalML.g:8026:4: ( rule__Procedure__Alternatives_10_1 )
+                    // InternalFormalML.g:8026:5: rule__Procedure__Alternatives_10_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_5);
+                    rule__Procedure__Alternatives_10_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getAlternatives_10_1()); 
+                    }
+
+                    }
+
+                    // InternalFormalML.g:8029:3: ( ( rule__Procedure__Alternatives_10_1 )* )
+                    // InternalFormalML.g:8030:4: ( rule__Procedure__Alternatives_10_1 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getAlternatives_10_1()); 
+                    }
+                    // InternalFormalML.g:8031:4: ( rule__Procedure__Alternatives_10_1 )*
+                    loop68:
+                    do {
+                        int alt68=2;
+                        int LA68_0 = input.LA(1);
+
+                        if ( (LA68_0==28||(LA68_0>=143 && LA68_0<=145)||LA68_0==214||(LA68_0>=224 && LA68_0<=225)) ) {
+                            alt68=1;
+                        }
+
+
+                        switch (alt68) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8031:5: rule__Procedure__Alternatives_10_1
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_5);
+                    	    rule__Procedure__Alternatives_10_1();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop68;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getAlternatives_10_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_10"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_10_0"
+    // InternalFormalML.g:8040:1: rule__Procedure__Alternatives_10_0 : ( ( ( rule__Procedure__Group_10_0_0__0 ) ) | ( ( rule__Procedure__Group_10_0_1__0 ) ) );
+    public final void rule__Procedure__Alternatives_10_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8044:1: ( ( ( rule__Procedure__Group_10_0_0__0 ) ) | ( ( rule__Procedure__Group_10_0_1__0 ) ) )
+            int alt70=2;
+            int LA70_0 = input.LA(1);
+
+            if ( ((LA70_0>=35 && LA70_0<=36)) ) {
+                alt70=1;
+            }
+            else if ( (LA70_0==206) ) {
+                alt70=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 70, 0, input);
+
+                throw nvae;
+            }
+            switch (alt70) {
+                case 1 :
+                    // InternalFormalML.g:8045:2: ( ( rule__Procedure__Group_10_0_0__0 ) )
+                    {
+                    // InternalFormalML.g:8045:2: ( ( rule__Procedure__Group_10_0_0__0 ) )
+                    // InternalFormalML.g:8046:3: ( rule__Procedure__Group_10_0_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_10_0_0()); 
+                    }
+                    // InternalFormalML.g:8047:3: ( rule__Procedure__Group_10_0_0__0 )
+                    // InternalFormalML.g:8047:4: rule__Procedure__Group_10_0_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_10_0_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_10_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8051:2: ( ( rule__Procedure__Group_10_0_1__0 ) )
+                    {
+                    // InternalFormalML.g:8051:2: ( ( rule__Procedure__Group_10_0_1__0 ) )
+                    // InternalFormalML.g:8052:3: ( rule__Procedure__Group_10_0_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getGroup_10_0_1()); 
+                    }
+                    // InternalFormalML.g:8053:3: ( rule__Procedure__Group_10_0_1__0 )
+                    // InternalFormalML.g:8053:4: rule__Procedure__Group_10_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_10_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getGroup_10_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_10_0"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_10_0_0_0"
+    // InternalFormalML.g:8061:1: rule__Procedure__Alternatives_10_0_0_0 : ( ( '@routine:' ) | ( '@macro:' ) );
+    public final void rule__Procedure__Alternatives_10_0_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8065:1: ( ( '@routine:' ) | ( '@macro:' ) )
+            int alt71=2;
+            int LA71_0 = input.LA(1);
+
+            if ( (LA71_0==35) ) {
+                alt71=1;
+            }
+            else if ( (LA71_0==36) ) {
+                alt71=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 71, 0, input);
+
+                throw nvae;
+            }
+            switch (alt71) {
+                case 1 :
+                    // InternalFormalML.g:8066:2: ( '@routine:' )
+                    {
+                    // InternalFormalML.g:8066:2: ( '@routine:' )
+                    // InternalFormalML.g:8067:3: '@routine:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getRoutineKeyword_10_0_0_0_0()); 
+                    }
+                    match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getRoutineKeyword_10_0_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8072:2: ( '@macro:' )
+                    {
+                    // InternalFormalML.g:8072:2: ( '@macro:' )
+                    // InternalFormalML.g:8073:3: '@macro:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getMacroKeyword_10_0_0_0_1()); 
+                    }
+                    match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getMacroKeyword_10_0_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_10_0_0_0"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_10_1"
+    // InternalFormalML.g:8082:1: rule__Procedure__Alternatives_10_1 : ( ( ( rule__Procedure__RoutineAssignment_10_1_0 ) ) | ( ( rule__Procedure__ProcedureAssignment_10_1_1 ) ) );
+    public final void rule__Procedure__Alternatives_10_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8086:1: ( ( ( rule__Procedure__RoutineAssignment_10_1_0 ) ) | ( ( rule__Procedure__ProcedureAssignment_10_1_1 ) ) )
+            int alt72=2;
+            switch ( input.LA(1) ) {
+            case 143:
+                {
+                int LA72_1 = input.LA(2);
+
+                if ( ((LA72_1>=224 && LA72_1<=225)) ) {
+                    alt72=1;
+                }
+                else if ( (LA72_1==214) ) {
+                    alt72=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 72, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 144:
+                {
+                int LA72_2 = input.LA(2);
+
+                if ( (LA72_2==214) ) {
+                    alt72=2;
+                }
+                else if ( ((LA72_2>=224 && LA72_2<=225)) ) {
+                    alt72=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 72, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 145:
+                {
+                int LA72_3 = input.LA(2);
+
+                if ( ((LA72_3>=224 && LA72_3<=225)) ) {
+                    alt72=1;
+                }
+                else if ( (LA72_3==214) ) {
+                    alt72=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 72, 3, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 28:
+                {
+                int LA72_4 = input.LA(2);
+
+                if ( (LA72_4==214) ) {
+                    alt72=2;
+                }
+                else if ( ((LA72_4>=224 && LA72_4<=225)) ) {
+                    alt72=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 72, 4, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 224:
+            case 225:
+                {
+                alt72=1;
+                }
+                break;
+            case 214:
+                {
+                alt72=2;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 72, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt72) {
+                case 1 :
+                    // InternalFormalML.g:8087:2: ( ( rule__Procedure__RoutineAssignment_10_1_0 ) )
+                    {
+                    // InternalFormalML.g:8087:2: ( ( rule__Procedure__RoutineAssignment_10_1_0 ) )
+                    // InternalFormalML.g:8088:3: ( rule__Procedure__RoutineAssignment_10_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getRoutineAssignment_10_1_0()); 
+                    }
+                    // InternalFormalML.g:8089:3: ( rule__Procedure__RoutineAssignment_10_1_0 )
+                    // InternalFormalML.g:8089:4: rule__Procedure__RoutineAssignment_10_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__RoutineAssignment_10_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getRoutineAssignment_10_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8093:2: ( ( rule__Procedure__ProcedureAssignment_10_1_1 ) )
+                    {
+                    // InternalFormalML.g:8093:2: ( ( rule__Procedure__ProcedureAssignment_10_1_1 ) )
+                    // InternalFormalML.g:8094:3: ( rule__Procedure__ProcedureAssignment_10_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getProcedureAssignment_10_1_1()); 
+                    }
+                    // InternalFormalML.g:8095:3: ( rule__Procedure__ProcedureAssignment_10_1_1 )
+                    // InternalFormalML.g:8095:4: rule__Procedure__ProcedureAssignment_10_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ProcedureAssignment_10_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getProcedureAssignment_10_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_10_1"
+
+
+    // $ANTLR start "rule__Procedure__Alternatives_11"
+    // InternalFormalML.g:8103:1: rule__Procedure__Alternatives_11 : ( ( ( ( rule__Procedure__RegionAssignment_11_0 ) ) ( ( rule__Procedure__RegionAssignment_11_0 )* ) ) | ( ( rule__Procedure__RegionAssignment_11_1 ) ) );
+    public final void rule__Procedure__Alternatives_11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8107:1: ( ( ( ( rule__Procedure__RegionAssignment_11_0 ) ) ( ( rule__Procedure__RegionAssignment_11_0 )* ) ) | ( ( rule__Procedure__RegionAssignment_11_1 ) ) )
+            int alt74=2;
+            int LA74_0 = input.LA(1);
+
+            if ( ((LA74_0>=41 && LA74_0<=44)) ) {
+                alt74=1;
+            }
+            else if ( ((LA74_0>=54 && LA74_0<=57)||(LA74_0>=275 && LA74_0<=276)) ) {
+                alt74=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 74, 0, input);
+
+                throw nvae;
+            }
+            switch (alt74) {
+                case 1 :
+                    // InternalFormalML.g:8108:2: ( ( ( rule__Procedure__RegionAssignment_11_0 ) ) ( ( rule__Procedure__RegionAssignment_11_0 )* ) )
+                    {
+                    // InternalFormalML.g:8108:2: ( ( ( rule__Procedure__RegionAssignment_11_0 ) ) ( ( rule__Procedure__RegionAssignment_11_0 )* ) )
+                    // InternalFormalML.g:8109:3: ( ( rule__Procedure__RegionAssignment_11_0 ) ) ( ( rule__Procedure__RegionAssignment_11_0 )* )
+                    {
+                    // InternalFormalML.g:8109:3: ( ( rule__Procedure__RegionAssignment_11_0 ) )
+                    // InternalFormalML.g:8110:4: ( rule__Procedure__RegionAssignment_11_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getRegionAssignment_11_0()); 
+                    }
+                    // InternalFormalML.g:8111:4: ( rule__Procedure__RegionAssignment_11_0 )
+                    // InternalFormalML.g:8111:5: rule__Procedure__RegionAssignment_11_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_7);
+                    rule__Procedure__RegionAssignment_11_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getRegionAssignment_11_0()); 
+                    }
+
+                    }
+
+                    // InternalFormalML.g:8114:3: ( ( rule__Procedure__RegionAssignment_11_0 )* )
+                    // InternalFormalML.g:8115:4: ( rule__Procedure__RegionAssignment_11_0 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getRegionAssignment_11_0()); 
+                    }
+                    // InternalFormalML.g:8116:4: ( rule__Procedure__RegionAssignment_11_0 )*
+                    loop73:
+                    do {
+                        int alt73=2;
+                        int LA73_0 = input.LA(1);
+
+                        if ( ((LA73_0>=41 && LA73_0<=44)) ) {
+                            alt73=1;
+                        }
+
+
+                        switch (alt73) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8116:5: rule__Procedure__RegionAssignment_11_0
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_7);
+                    	    rule__Procedure__RegionAssignment_11_0();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop73;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getRegionAssignment_11_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8121:2: ( ( rule__Procedure__RegionAssignment_11_1 ) )
+                    {
+                    // InternalFormalML.g:8121:2: ( ( rule__Procedure__RegionAssignment_11_1 ) )
+                    // InternalFormalML.g:8122:3: ( rule__Procedure__RegionAssignment_11_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureAccess().getRegionAssignment_11_1()); 
+                    }
+                    // InternalFormalML.g:8123:3: ( rule__Procedure__RegionAssignment_11_1 )
+                    // InternalFormalML.g:8123:4: rule__Procedure__RegionAssignment_11_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__RegionAssignment_11_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureAccess().getRegionAssignment_11_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Alternatives_11"
+
+
+    // $ANTLR start "rule__MoeBehavior__Alternatives_1_1"
+    // InternalFormalML.g:8131:1: rule__MoeBehavior__Alternatives_1_1 : ( ( ( rule__MoeBehavior__PortAssignment_1_1_0 ) ) | ( ( rule__MoeBehavior__SignalAssignment_1_1_1 ) ) | ( ( rule__MoeBehavior__BufferAssignment_1_1_2 ) ) | ( ( rule__MoeBehavior__ChannelAssignment_1_1_3 ) ) | ( ( rule__MoeBehavior__TypedefAssignment_1_1_4 ) ) | ( ( rule__MoeBehavior__PropertyAssignment_1_1_5 ) ) );
+    public final void rule__MoeBehavior__Alternatives_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8135:1: ( ( ( rule__MoeBehavior__PortAssignment_1_1_0 ) ) | ( ( rule__MoeBehavior__SignalAssignment_1_1_1 ) ) | ( ( rule__MoeBehavior__BufferAssignment_1_1_2 ) ) | ( ( rule__MoeBehavior__ChannelAssignment_1_1_3 ) ) | ( ( rule__MoeBehavior__TypedefAssignment_1_1_4 ) ) | ( ( rule__MoeBehavior__PropertyAssignment_1_1_5 ) ) )
+            int alt75=6;
+            alt75 = dfa75.predict(input);
+            switch (alt75) {
+                case 1 :
+                    // InternalFormalML.g:8136:2: ( ( rule__MoeBehavior__PortAssignment_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:8136:2: ( ( rule__MoeBehavior__PortAssignment_1_1_0 ) )
+                    // InternalFormalML.g:8137:3: ( rule__MoeBehavior__PortAssignment_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeBehaviorAccess().getPortAssignment_1_1_0()); 
+                    }
+                    // InternalFormalML.g:8138:3: ( rule__MoeBehavior__PortAssignment_1_1_0 )
+                    // InternalFormalML.g:8138:4: rule__MoeBehavior__PortAssignment_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__PortAssignment_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeBehaviorAccess().getPortAssignment_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8142:2: ( ( rule__MoeBehavior__SignalAssignment_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:8142:2: ( ( rule__MoeBehavior__SignalAssignment_1_1_1 ) )
+                    // InternalFormalML.g:8143:3: ( rule__MoeBehavior__SignalAssignment_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeBehaviorAccess().getSignalAssignment_1_1_1()); 
+                    }
+                    // InternalFormalML.g:8144:3: ( rule__MoeBehavior__SignalAssignment_1_1_1 )
+                    // InternalFormalML.g:8144:4: rule__MoeBehavior__SignalAssignment_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__SignalAssignment_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeBehaviorAccess().getSignalAssignment_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8148:2: ( ( rule__MoeBehavior__BufferAssignment_1_1_2 ) )
+                    {
+                    // InternalFormalML.g:8148:2: ( ( rule__MoeBehavior__BufferAssignment_1_1_2 ) )
+                    // InternalFormalML.g:8149:3: ( rule__MoeBehavior__BufferAssignment_1_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeBehaviorAccess().getBufferAssignment_1_1_2()); 
+                    }
+                    // InternalFormalML.g:8150:3: ( rule__MoeBehavior__BufferAssignment_1_1_2 )
+                    // InternalFormalML.g:8150:4: rule__MoeBehavior__BufferAssignment_1_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__BufferAssignment_1_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeBehaviorAccess().getBufferAssignment_1_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8154:2: ( ( rule__MoeBehavior__ChannelAssignment_1_1_3 ) )
+                    {
+                    // InternalFormalML.g:8154:2: ( ( rule__MoeBehavior__ChannelAssignment_1_1_3 ) )
+                    // InternalFormalML.g:8155:3: ( rule__MoeBehavior__ChannelAssignment_1_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeBehaviorAccess().getChannelAssignment_1_1_3()); 
+                    }
+                    // InternalFormalML.g:8156:3: ( rule__MoeBehavior__ChannelAssignment_1_1_3 )
+                    // InternalFormalML.g:8156:4: rule__MoeBehavior__ChannelAssignment_1_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__ChannelAssignment_1_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeBehaviorAccess().getChannelAssignment_1_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:8160:2: ( ( rule__MoeBehavior__TypedefAssignment_1_1_4 ) )
+                    {
+                    // InternalFormalML.g:8160:2: ( ( rule__MoeBehavior__TypedefAssignment_1_1_4 ) )
+                    // InternalFormalML.g:8161:3: ( rule__MoeBehavior__TypedefAssignment_1_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeBehaviorAccess().getTypedefAssignment_1_1_4()); 
+                    }
+                    // InternalFormalML.g:8162:3: ( rule__MoeBehavior__TypedefAssignment_1_1_4 )
+                    // InternalFormalML.g:8162:4: rule__MoeBehavior__TypedefAssignment_1_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__TypedefAssignment_1_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeBehaviorAccess().getTypedefAssignment_1_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:8166:2: ( ( rule__MoeBehavior__PropertyAssignment_1_1_5 ) )
+                    {
+                    // InternalFormalML.g:8166:2: ( ( rule__MoeBehavior__PropertyAssignment_1_1_5 ) )
+                    // InternalFormalML.g:8167:3: ( rule__MoeBehavior__PropertyAssignment_1_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeBehaviorAccess().getPropertyAssignment_1_1_5()); 
+                    }
+                    // InternalFormalML.g:8168:3: ( rule__MoeBehavior__PropertyAssignment_1_1_5 )
+                    // InternalFormalML.g:8168:4: rule__MoeBehavior__PropertyAssignment_1_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__PropertyAssignment_1_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeBehaviorAccess().getPropertyAssignment_1_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Alternatives_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_1_1"
+    // InternalFormalML.g:8176:1: rule__Statemachine__Alternatives_1_1 : ( ( ( rule__Statemachine__TimedAssignment_1_1_0 ) ) | ( ( rule__Statemachine__Input_enabledAssignment_1_1_1 ) ) );
+    public final void rule__Statemachine__Alternatives_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8180:1: ( ( ( rule__Statemachine__TimedAssignment_1_1_0 ) ) | ( ( rule__Statemachine__Input_enabledAssignment_1_1_1 ) ) )
+            int alt76=2;
+            int LA76_0 = input.LA(1);
+
+            if ( (LA76_0==273) ) {
+                alt76=1;
+            }
+            else if ( (LA76_0==274) ) {
+                alt76=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 76, 0, input);
+
+                throw nvae;
+            }
+            switch (alt76) {
+                case 1 :
+                    // InternalFormalML.g:8181:2: ( ( rule__Statemachine__TimedAssignment_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:8181:2: ( ( rule__Statemachine__TimedAssignment_1_1_0 ) )
+                    // InternalFormalML.g:8182:3: ( rule__Statemachine__TimedAssignment_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getTimedAssignment_1_1_0()); 
+                    }
+                    // InternalFormalML.g:8183:3: ( rule__Statemachine__TimedAssignment_1_1_0 )
+                    // InternalFormalML.g:8183:4: rule__Statemachine__TimedAssignment_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__TimedAssignment_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getTimedAssignment_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8187:2: ( ( rule__Statemachine__Input_enabledAssignment_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:8187:2: ( ( rule__Statemachine__Input_enabledAssignment_1_1_1 ) )
+                    // InternalFormalML.g:8188:3: ( rule__Statemachine__Input_enabledAssignment_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getInput_enabledAssignment_1_1_1()); 
+                    }
+                    // InternalFormalML.g:8189:3: ( rule__Statemachine__Input_enabledAssignment_1_1_1 )
+                    // InternalFormalML.g:8189:4: rule__Statemachine__Input_enabledAssignment_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Input_enabledAssignment_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getInput_enabledAssignment_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_3_2"
+    // InternalFormalML.g:8197:1: rule__Statemachine__Alternatives_3_2 : ( ( 'or' ) | ( 'and' ) );
+    public final void rule__Statemachine__Alternatives_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8201:1: ( ( 'or' ) | ( 'and' ) )
+            int alt77=2;
+            int LA77_0 = input.LA(1);
+
+            if ( (LA77_0==34) ) {
+                alt77=1;
+            }
+            else if ( (LA77_0==33) ) {
+                alt77=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 77, 0, input);
+
+                throw nvae;
+            }
+            switch (alt77) {
+                case 1 :
+                    // InternalFormalML.g:8202:2: ( 'or' )
+                    {
+                    // InternalFormalML.g:8202:2: ( 'or' )
+                    // InternalFormalML.g:8203:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getOrKeyword_3_2_0()); 
+                    }
+                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getOrKeyword_3_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8208:2: ( 'and' )
+                    {
+                    // InternalFormalML.g:8208:2: ( 'and' )
+                    // InternalFormalML.g:8209:3: 'and'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getAndKeyword_3_2_1()); 
+                    }
+                    match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getAndKeyword_3_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_3_2"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_7"
+    // InternalFormalML.g:8218:1: rule__Statemachine__Alternatives_7 : ( ( ( rule__Statemachine__Group_7_0__0 ) ) | ( ( rule__Statemachine__Alternatives_7_1 )* ) );
+    public final void rule__Statemachine__Alternatives_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8222:1: ( ( ( rule__Statemachine__Group_7_0__0 ) ) | ( ( rule__Statemachine__Alternatives_7_1 )* ) )
+            int alt79=2;
+            int LA79_0 = input.LA(1);
+
+            if ( (LA79_0==216) ) {
+                alt79=1;
+            }
+            else if ( ((LA79_0>=15 && LA79_0<=19)||LA79_0==28||(LA79_0>=35 && LA79_0<=36)||(LA79_0>=41 && LA79_0<=44)||(LA79_0>=54 && LA79_0<=57)||(LA79_0>=143 && LA79_0<=145)||LA79_0==179||(LA79_0>=202 && LA79_0<=206)||LA79_0==214||(LA79_0>=217 && LA79_0<=220)||(LA79_0>=224 && LA79_0<=225)||LA79_0==229||(LA79_0>=275 && LA79_0<=276)||(LA79_0>=278 && LA79_0<=283)) ) {
+                alt79=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 79, 0, input);
+
+                throw nvae;
+            }
+            switch (alt79) {
+                case 1 :
+                    // InternalFormalML.g:8223:2: ( ( rule__Statemachine__Group_7_0__0 ) )
+                    {
+                    // InternalFormalML.g:8223:2: ( ( rule__Statemachine__Group_7_0__0 ) )
+                    // InternalFormalML.g:8224:3: ( rule__Statemachine__Group_7_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_7_0()); 
+                    }
+                    // InternalFormalML.g:8225:3: ( rule__Statemachine__Group_7_0__0 )
+                    // InternalFormalML.g:8225:4: rule__Statemachine__Group_7_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_7_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_7_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8229:2: ( ( rule__Statemachine__Alternatives_7_1 )* )
+                    {
+                    // InternalFormalML.g:8229:2: ( ( rule__Statemachine__Alternatives_7_1 )* )
+                    // InternalFormalML.g:8230:3: ( rule__Statemachine__Alternatives_7_1 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getAlternatives_7_1()); 
+                    }
+                    // InternalFormalML.g:8231:3: ( rule__Statemachine__Alternatives_7_1 )*
+                    loop78:
+                    do {
+                        int alt78=2;
+                        switch ( input.LA(1) ) {
+                        case 143:
+                            {
+                            int LA78_2 = input.LA(2);
+
+                            if ( ((LA78_2>=15 && LA78_2<=19)||LA78_2==28||(LA78_2>=143 && LA78_2<=145)||LA78_2==179||LA78_2==229||(LA78_2>=278 && LA78_2<=283)) ) {
+                                alt78=1;
+                            }
+                            else if ( (LA78_2==224) ) {
+                                int LA78_6 = input.LA(3);
+
+                                if ( (LA78_6==RULE_XLIA_ID||(LA78_6>=15 && LA78_6<=18)||LA78_6==39||(LA78_6>=59 && LA78_6<=74)||(LA78_6>=129 && LA78_6<=132)||LA78_6==149||(LA78_6>=163 && LA78_6<=171)||(LA78_6>=231 && LA78_6<=237)||LA78_6==277||LA78_6==282) ) {
+                                    alt78=1;
+                                }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 144:
+                            {
+                            int LA78_3 = input.LA(2);
+
+                            if ( ((LA78_3>=15 && LA78_3<=19)||LA78_3==28||(LA78_3>=143 && LA78_3<=145)||LA78_3==179||LA78_3==229||(LA78_3>=278 && LA78_3<=283)) ) {
+                                alt78=1;
+                            }
+                            else if ( (LA78_3==224) ) {
+                                int LA78_6 = input.LA(3);
+
+                                if ( (LA78_6==RULE_XLIA_ID||(LA78_6>=15 && LA78_6<=18)||LA78_6==39||(LA78_6>=59 && LA78_6<=74)||(LA78_6>=129 && LA78_6<=132)||LA78_6==149||(LA78_6>=163 && LA78_6<=171)||(LA78_6>=231 && LA78_6<=237)||LA78_6==277||LA78_6==282) ) {
+                                    alt78=1;
+                                }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 145:
+                            {
+                            int LA78_4 = input.LA(2);
+
+                            if ( ((LA78_4>=15 && LA78_4<=19)||LA78_4==28||(LA78_4>=143 && LA78_4<=145)||LA78_4==179||LA78_4==229||(LA78_4>=278 && LA78_4<=283)) ) {
+                                alt78=1;
+                            }
+                            else if ( (LA78_4==224) ) {
+                                int LA78_6 = input.LA(3);
+
+                                if ( (LA78_6==RULE_XLIA_ID||(LA78_6>=15 && LA78_6<=18)||LA78_6==39||(LA78_6>=59 && LA78_6<=74)||(LA78_6>=129 && LA78_6<=132)||LA78_6==149||(LA78_6>=163 && LA78_6<=171)||(LA78_6>=231 && LA78_6<=237)||LA78_6==277||LA78_6==282) ) {
+                                    alt78=1;
+                                }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 28:
+                            {
+                            int LA78_5 = input.LA(2);
+
+                            if ( ((LA78_5>=15 && LA78_5<=19)||LA78_5==28||(LA78_5>=143 && LA78_5<=145)||LA78_5==179||LA78_5==229||(LA78_5>=278 && LA78_5<=283)) ) {
+                                alt78=1;
+                            }
+                            else if ( (LA78_5==224) ) {
+                                int LA78_6 = input.LA(3);
+
+                                if ( (LA78_6==RULE_XLIA_ID||(LA78_6>=15 && LA78_6<=18)||LA78_6==39||(LA78_6>=59 && LA78_6<=74)||(LA78_6>=129 && LA78_6<=132)||LA78_6==149||(LA78_6>=163 && LA78_6<=171)||(LA78_6>=231 && LA78_6<=237)||LA78_6==277||LA78_6==282) ) {
+                                    alt78=1;
+                                }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 224:
+                            {
+                            int LA78_6 = input.LA(2);
+
+                            if ( (LA78_6==RULE_XLIA_ID||(LA78_6>=15 && LA78_6<=18)||LA78_6==39||(LA78_6>=59 && LA78_6<=74)||(LA78_6>=129 && LA78_6<=132)||LA78_6==149||(LA78_6>=163 && LA78_6<=171)||(LA78_6>=231 && LA78_6<=237)||LA78_6==277||LA78_6==282) ) {
+                                alt78=1;
+                            }
+
+
+                            }
+                            break;
+                        case 15:
+                        case 16:
+                        case 17:
+                        case 18:
+                        case 19:
+                        case 179:
+                        case 229:
+                        case 278:
+                        case 279:
+                        case 280:
+                        case 281:
+                        case 282:
+                        case 283:
+                            {
+                            alt78=1;
+                            }
+                            break;
+
+                        }
+
+                        switch (alt78) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8231:4: rule__Statemachine__Alternatives_7_1
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_6);
+                    	    rule__Statemachine__Alternatives_7_1();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop78;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getAlternatives_7_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_7"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_7_0_1"
+    // InternalFormalML.g:8239:1: rule__Statemachine__Alternatives_7_0_1 : ( ( ( rule__Statemachine__Group_7_0_1_0__0 ) ) | ( ( rule__Statemachine__Group_7_0_1_1__0 ) ) | ( ( rule__Statemachine__Group_7_0_1_2__0 ) ) | ( ( rule__Statemachine__Group_7_0_1_3__0 ) ) );
+    public final void rule__Statemachine__Alternatives_7_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8243:1: ( ( ( rule__Statemachine__Group_7_0_1_0__0 ) ) | ( ( rule__Statemachine__Group_7_0_1_1__0 ) ) | ( ( rule__Statemachine__Group_7_0_1_2__0 ) ) | ( ( rule__Statemachine__Group_7_0_1_3__0 ) ) )
+            int alt80=4;
+            switch ( input.LA(1) ) {
+            case 175:
+                {
+                alt80=1;
+                }
+                break;
+            case 173:
+                {
+                alt80=2;
+                }
+                break;
+            case 176:
+                {
+                alt80=3;
+                }
+                break;
+            case 157:
+                {
+                alt80=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 80, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt80) {
+                case 1 :
+                    // InternalFormalML.g:8244:2: ( ( rule__Statemachine__Group_7_0_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:8244:2: ( ( rule__Statemachine__Group_7_0_1_0__0 ) )
+                    // InternalFormalML.g:8245:3: ( rule__Statemachine__Group_7_0_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0()); 
+                    }
+                    // InternalFormalML.g:8246:3: ( rule__Statemachine__Group_7_0_1_0__0 )
+                    // InternalFormalML.g:8246:4: rule__Statemachine__Group_7_0_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_7_0_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8250:2: ( ( rule__Statemachine__Group_7_0_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8250:2: ( ( rule__Statemachine__Group_7_0_1_1__0 ) )
+                    // InternalFormalML.g:8251:3: ( rule__Statemachine__Group_7_0_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1()); 
+                    }
+                    // InternalFormalML.g:8252:3: ( rule__Statemachine__Group_7_0_1_1__0 )
+                    // InternalFormalML.g:8252:4: rule__Statemachine__Group_7_0_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_7_0_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8256:2: ( ( rule__Statemachine__Group_7_0_1_2__0 ) )
+                    {
+                    // InternalFormalML.g:8256:2: ( ( rule__Statemachine__Group_7_0_1_2__0 ) )
+                    // InternalFormalML.g:8257:3: ( rule__Statemachine__Group_7_0_1_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2()); 
+                    }
+                    // InternalFormalML.g:8258:3: ( rule__Statemachine__Group_7_0_1_2__0 )
+                    // InternalFormalML.g:8258:4: rule__Statemachine__Group_7_0_1_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_7_0_1_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8262:2: ( ( rule__Statemachine__Group_7_0_1_3__0 ) )
+                    {
+                    // InternalFormalML.g:8262:2: ( ( rule__Statemachine__Group_7_0_1_3__0 ) )
+                    // InternalFormalML.g:8263:3: ( rule__Statemachine__Group_7_0_1_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3()); 
+                    }
+                    // InternalFormalML.g:8264:3: ( rule__Statemachine__Group_7_0_1_3__0 )
+                    // InternalFormalML.g:8264:4: rule__Statemachine__Group_7_0_1_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_7_0_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_7_0_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_7_0_1_0_1"
+    // InternalFormalML.g:8272:1: rule__Statemachine__Alternatives_7_0_1_0_1 : ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_0 ) ) | ( ( rule__Statemachine__Group_7_0_1_0_1_1__0 ) ) );
+    public final void rule__Statemachine__Alternatives_7_0_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8276:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_0 ) ) | ( ( rule__Statemachine__Group_7_0_1_0_1_1__0 ) ) )
+            int alt81=2;
+            int LA81_0 = input.LA(1);
+
+            if ( (LA81_0==16) ) {
+                alt81=1;
+            }
+            else if ( (LA81_0==199) ) {
+                alt81=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 81, 0, input);
+
+                throw nvae;
+            }
+            switch (alt81) {
+                case 1 :
+                    // InternalFormalML.g:8277:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:8277:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_0 ) )
+                    // InternalFormalML.g:8278:3: ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:8279:3: ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_0 )
+                    // InternalFormalML.g:8279:4: rule__Statemachine__ParameterAssignment_7_0_1_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ParameterAssignment_7_0_1_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8283:2: ( ( rule__Statemachine__Group_7_0_1_0_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8283:2: ( ( rule__Statemachine__Group_7_0_1_0_1_1__0 ) )
+                    // InternalFormalML.g:8284:3: ( rule__Statemachine__Group_7_0_1_0_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0_1_1()); 
+                    }
+                    // InternalFormalML.g:8285:3: ( rule__Statemachine__Group_7_0_1_0_1_1__0 )
+                    // InternalFormalML.g:8285:4: rule__Statemachine__Group_7_0_1_0_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_7_0_1_0_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_7_0_1_0_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_7_0_1_1_1"
+    // InternalFormalML.g:8293:1: rule__Statemachine__Alternatives_7_0_1_1_1 : ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_0 ) ) | ( ( rule__Statemachine__Group_7_0_1_1_1_1__0 ) ) );
+    public final void rule__Statemachine__Alternatives_7_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8297:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_0 ) ) | ( ( rule__Statemachine__Group_7_0_1_1_1_1__0 ) ) )
+            int alt82=2;
+            int LA82_0 = input.LA(1);
+
+            if ( (LA82_0==16) ) {
+                alt82=1;
+            }
+            else if ( (LA82_0==199) ) {
+                alt82=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 82, 0, input);
+
+                throw nvae;
+            }
+            switch (alt82) {
+                case 1 :
+                    // InternalFormalML.g:8298:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:8298:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_0 ) )
+                    // InternalFormalML.g:8299:3: ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_0()); 
+                    }
+                    // InternalFormalML.g:8300:3: ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_0 )
+                    // InternalFormalML.g:8300:4: rule__Statemachine__ParameterAssignment_7_0_1_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ParameterAssignment_7_0_1_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8304:2: ( ( rule__Statemachine__Group_7_0_1_1_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8304:2: ( ( rule__Statemachine__Group_7_0_1_1_1_1__0 ) )
+                    // InternalFormalML.g:8305:3: ( rule__Statemachine__Group_7_0_1_1_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1_1_1()); 
+                    }
+                    // InternalFormalML.g:8306:3: ( rule__Statemachine__Group_7_0_1_1_1_1__0 )
+                    // InternalFormalML.g:8306:4: rule__Statemachine__Group_7_0_1_1_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_7_0_1_1_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_7_0_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_7_0_1_2_1"
+    // InternalFormalML.g:8314:1: rule__Statemachine__Alternatives_7_0_1_2_1 : ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_0 ) ) | ( ( rule__Statemachine__Group_7_0_1_2_1_1__0 ) ) );
+    public final void rule__Statemachine__Alternatives_7_0_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8318:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_0 ) ) | ( ( rule__Statemachine__Group_7_0_1_2_1_1__0 ) ) )
+            int alt83=2;
+            int LA83_0 = input.LA(1);
+
+            if ( (LA83_0==16) ) {
+                alt83=1;
+            }
+            else if ( (LA83_0==199) ) {
+                alt83=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 83, 0, input);
+
+                throw nvae;
+            }
+            switch (alt83) {
+                case 1 :
+                    // InternalFormalML.g:8319:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_0 ) )
+                    {
+                    // InternalFormalML.g:8319:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_0 ) )
+                    // InternalFormalML.g:8320:3: ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_0()); 
+                    }
+                    // InternalFormalML.g:8321:3: ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_0 )
+                    // InternalFormalML.g:8321:4: rule__Statemachine__ParameterAssignment_7_0_1_2_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ParameterAssignment_7_0_1_2_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8325:2: ( ( rule__Statemachine__Group_7_0_1_2_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8325:2: ( ( rule__Statemachine__Group_7_0_1_2_1_1__0 ) )
+                    // InternalFormalML.g:8326:3: ( rule__Statemachine__Group_7_0_1_2_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2_1_1()); 
+                    }
+                    // InternalFormalML.g:8327:3: ( rule__Statemachine__Group_7_0_1_2_1_1__0 )
+                    // InternalFormalML.g:8327:4: rule__Statemachine__Group_7_0_1_2_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_7_0_1_2_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_7_0_1_2_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_7_0_1_3_1"
+    // InternalFormalML.g:8335:1: rule__Statemachine__Alternatives_7_0_1_3_1 : ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_0 ) ) | ( ( rule__Statemachine__Group_7_0_1_3_1_1__0 ) ) );
+    public final void rule__Statemachine__Alternatives_7_0_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8339:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_0 ) ) | ( ( rule__Statemachine__Group_7_0_1_3_1_1__0 ) ) )
+            int alt84=2;
+            int LA84_0 = input.LA(1);
+
+            if ( (LA84_0==16) ) {
+                alt84=1;
+            }
+            else if ( (LA84_0==199) ) {
+                alt84=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 84, 0, input);
+
+                throw nvae;
+            }
+            switch (alt84) {
+                case 1 :
+                    // InternalFormalML.g:8340:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_0 ) )
+                    {
+                    // InternalFormalML.g:8340:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_0 ) )
+                    // InternalFormalML.g:8341:3: ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_0()); 
+                    }
+                    // InternalFormalML.g:8342:3: ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_0 )
+                    // InternalFormalML.g:8342:4: rule__Statemachine__ParameterAssignment_7_0_1_3_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ParameterAssignment_7_0_1_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8346:2: ( ( rule__Statemachine__Group_7_0_1_3_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8346:2: ( ( rule__Statemachine__Group_7_0_1_3_1_1__0 ) )
+                    // InternalFormalML.g:8347:3: ( rule__Statemachine__Group_7_0_1_3_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3_1_1()); 
+                    }
+                    // InternalFormalML.g:8348:3: ( rule__Statemachine__Group_7_0_1_3_1_1__0 )
+                    // InternalFormalML.g:8348:4: rule__Statemachine__Group_7_0_1_3_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_7_0_1_3_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_7_0_1_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_7_0_1_3_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_7_1"
+    // InternalFormalML.g:8356:1: rule__Statemachine__Alternatives_7_1 : ( ( ( rule__Statemachine__PortAssignment_7_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_7_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_7_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_7_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_7_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_7_1_5 ) ) );
+    public final void rule__Statemachine__Alternatives_7_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8360:1: ( ( ( rule__Statemachine__PortAssignment_7_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_7_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_7_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_7_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_7_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_7_1_5 ) ) )
+            int alt85=6;
+            alt85 = dfa85.predict(input);
+            switch (alt85) {
+                case 1 :
+                    // InternalFormalML.g:8361:2: ( ( rule__Statemachine__PortAssignment_7_1_0 ) )
+                    {
+                    // InternalFormalML.g:8361:2: ( ( rule__Statemachine__PortAssignment_7_1_0 ) )
+                    // InternalFormalML.g:8362:3: ( rule__Statemachine__PortAssignment_7_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPortAssignment_7_1_0()); 
+                    }
+                    // InternalFormalML.g:8363:3: ( rule__Statemachine__PortAssignment_7_1_0 )
+                    // InternalFormalML.g:8363:4: rule__Statemachine__PortAssignment_7_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PortAssignment_7_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPortAssignment_7_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8367:2: ( ( rule__Statemachine__SignalAssignment_7_1_1 ) )
+                    {
+                    // InternalFormalML.g:8367:2: ( ( rule__Statemachine__SignalAssignment_7_1_1 ) )
+                    // InternalFormalML.g:8368:3: ( rule__Statemachine__SignalAssignment_7_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getSignalAssignment_7_1_1()); 
+                    }
+                    // InternalFormalML.g:8369:3: ( rule__Statemachine__SignalAssignment_7_1_1 )
+                    // InternalFormalML.g:8369:4: rule__Statemachine__SignalAssignment_7_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__SignalAssignment_7_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getSignalAssignment_7_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8373:2: ( ( rule__Statemachine__BufferAssignment_7_1_2 ) )
+                    {
+                    // InternalFormalML.g:8373:2: ( ( rule__Statemachine__BufferAssignment_7_1_2 ) )
+                    // InternalFormalML.g:8374:3: ( rule__Statemachine__BufferAssignment_7_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getBufferAssignment_7_1_2()); 
+                    }
+                    // InternalFormalML.g:8375:3: ( rule__Statemachine__BufferAssignment_7_1_2 )
+                    // InternalFormalML.g:8375:4: rule__Statemachine__BufferAssignment_7_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__BufferAssignment_7_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getBufferAssignment_7_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8379:2: ( ( rule__Statemachine__ChannelAssignment_7_1_3 ) )
+                    {
+                    // InternalFormalML.g:8379:2: ( ( rule__Statemachine__ChannelAssignment_7_1_3 ) )
+                    // InternalFormalML.g:8380:3: ( rule__Statemachine__ChannelAssignment_7_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getChannelAssignment_7_1_3()); 
+                    }
+                    // InternalFormalML.g:8381:3: ( rule__Statemachine__ChannelAssignment_7_1_3 )
+                    // InternalFormalML.g:8381:4: rule__Statemachine__ChannelAssignment_7_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ChannelAssignment_7_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getChannelAssignment_7_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:8385:2: ( ( rule__Statemachine__TypedefAssignment_7_1_4 ) )
+                    {
+                    // InternalFormalML.g:8385:2: ( ( rule__Statemachine__TypedefAssignment_7_1_4 ) )
+                    // InternalFormalML.g:8386:3: ( rule__Statemachine__TypedefAssignment_7_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getTypedefAssignment_7_1_4()); 
+                    }
+                    // InternalFormalML.g:8387:3: ( rule__Statemachine__TypedefAssignment_7_1_4 )
+                    // InternalFormalML.g:8387:4: rule__Statemachine__TypedefAssignment_7_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__TypedefAssignment_7_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getTypedefAssignment_7_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:8391:2: ( ( rule__Statemachine__PropertyAssignment_7_1_5 ) )
+                    {
+                    // InternalFormalML.g:8391:2: ( ( rule__Statemachine__PropertyAssignment_7_1_5 ) )
+                    // InternalFormalML.g:8392:3: ( rule__Statemachine__PropertyAssignment_7_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPropertyAssignment_7_1_5()); 
+                    }
+                    // InternalFormalML.g:8393:3: ( rule__Statemachine__PropertyAssignment_7_1_5 )
+                    // InternalFormalML.g:8393:4: rule__Statemachine__PropertyAssignment_7_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PropertyAssignment_7_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPropertyAssignment_7_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_7_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_8"
+    // InternalFormalML.g:8401:1: rule__Statemachine__Alternatives_8 : ( ( ( rule__Statemachine__Group_8_0__0 ) ) | ( ( rule__Statemachine__Group_8_1__0 ) ) | ( ( rule__Statemachine__Group_8_2__0 ) ) | ( ( rule__Statemachine__Group_8_3__0 ) ) );
+    public final void rule__Statemachine__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8405:1: ( ( ( rule__Statemachine__Group_8_0__0 ) ) | ( ( rule__Statemachine__Group_8_1__0 ) ) | ( ( rule__Statemachine__Group_8_2__0 ) ) | ( ( rule__Statemachine__Group_8_3__0 ) ) )
+            int alt86=4;
+            switch ( input.LA(1) ) {
+            case 217:
+                {
+                alt86=1;
+                }
+                break;
+            case 218:
+                {
+                alt86=2;
+                }
+                break;
+            case 219:
+                {
+                alt86=3;
+                }
+                break;
+            case 220:
+                {
+                alt86=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 86, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt86) {
+                case 1 :
+                    // InternalFormalML.g:8406:2: ( ( rule__Statemachine__Group_8_0__0 ) )
+                    {
+                    // InternalFormalML.g:8406:2: ( ( rule__Statemachine__Group_8_0__0 ) )
+                    // InternalFormalML.g:8407:3: ( rule__Statemachine__Group_8_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_8_0()); 
+                    }
+                    // InternalFormalML.g:8408:3: ( rule__Statemachine__Group_8_0__0 )
+                    // InternalFormalML.g:8408:4: rule__Statemachine__Group_8_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_8_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8412:2: ( ( rule__Statemachine__Group_8_1__0 ) )
+                    {
+                    // InternalFormalML.g:8412:2: ( ( rule__Statemachine__Group_8_1__0 ) )
+                    // InternalFormalML.g:8413:3: ( rule__Statemachine__Group_8_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_8_1()); 
+                    }
+                    // InternalFormalML.g:8414:3: ( rule__Statemachine__Group_8_1__0 )
+                    // InternalFormalML.g:8414:4: rule__Statemachine__Group_8_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_8_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8418:2: ( ( rule__Statemachine__Group_8_2__0 ) )
+                    {
+                    // InternalFormalML.g:8418:2: ( ( rule__Statemachine__Group_8_2__0 ) )
+                    // InternalFormalML.g:8419:3: ( rule__Statemachine__Group_8_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_8_2()); 
+                    }
+                    // InternalFormalML.g:8420:3: ( rule__Statemachine__Group_8_2__0 )
+                    // InternalFormalML.g:8420:4: rule__Statemachine__Group_8_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_8_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_8_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8424:2: ( ( rule__Statemachine__Group_8_3__0 ) )
+                    {
+                    // InternalFormalML.g:8424:2: ( ( rule__Statemachine__Group_8_3__0 ) )
+                    // InternalFormalML.g:8425:3: ( rule__Statemachine__Group_8_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_8_3()); 
+                    }
+                    // InternalFormalML.g:8426:3: ( rule__Statemachine__Group_8_3__0 )
+                    // InternalFormalML.g:8426:4: rule__Statemachine__Group_8_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_8_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_8_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_8"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_8_0_1"
+    // InternalFormalML.g:8434:1: rule__Statemachine__Alternatives_8_0_1 : ( ( ( rule__Statemachine__ParameterAssignment_8_0_1_0 ) ) | ( ( rule__Statemachine__Group_8_0_1_1__0 ) ) );
+    public final void rule__Statemachine__Alternatives_8_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8438:1: ( ( ( rule__Statemachine__ParameterAssignment_8_0_1_0 ) ) | ( ( rule__Statemachine__Group_8_0_1_1__0 ) ) )
+            int alt87=2;
+            int LA87_0 = input.LA(1);
+
+            if ( (LA87_0==16) ) {
+                alt87=1;
+            }
+            else if ( (LA87_0==199) ) {
+                alt87=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 87, 0, input);
+
+                throw nvae;
+            }
+            switch (alt87) {
+                case 1 :
+                    // InternalFormalML.g:8439:2: ( ( rule__Statemachine__ParameterAssignment_8_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:8439:2: ( ( rule__Statemachine__ParameterAssignment_8_0_1_0 ) )
+                    // InternalFormalML.g:8440:3: ( rule__Statemachine__ParameterAssignment_8_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_0()); 
+                    }
+                    // InternalFormalML.g:8441:3: ( rule__Statemachine__ParameterAssignment_8_0_1_0 )
+                    // InternalFormalML.g:8441:4: rule__Statemachine__ParameterAssignment_8_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ParameterAssignment_8_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8445:2: ( ( rule__Statemachine__Group_8_0_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8445:2: ( ( rule__Statemachine__Group_8_0_1_1__0 ) )
+                    // InternalFormalML.g:8446:3: ( rule__Statemachine__Group_8_0_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_8_0_1_1()); 
+                    }
+                    // InternalFormalML.g:8447:3: ( rule__Statemachine__Group_8_0_1_1__0 )
+                    // InternalFormalML.g:8447:4: rule__Statemachine__Group_8_0_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_8_0_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_8_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_8_0_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_8_1_1"
+    // InternalFormalML.g:8455:1: rule__Statemachine__Alternatives_8_1_1 : ( ( ( rule__Statemachine__ParameterAssignment_8_1_1_0 ) ) | ( ( rule__Statemachine__Group_8_1_1_1__0 ) ) );
+    public final void rule__Statemachine__Alternatives_8_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8459:1: ( ( ( rule__Statemachine__ParameterAssignment_8_1_1_0 ) ) | ( ( rule__Statemachine__Group_8_1_1_1__0 ) ) )
+            int alt88=2;
+            int LA88_0 = input.LA(1);
+
+            if ( (LA88_0==16) ) {
+                alt88=1;
+            }
+            else if ( (LA88_0==199) ) {
+                alt88=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 88, 0, input);
+
+                throw nvae;
+            }
+            switch (alt88) {
+                case 1 :
+                    // InternalFormalML.g:8460:2: ( ( rule__Statemachine__ParameterAssignment_8_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:8460:2: ( ( rule__Statemachine__ParameterAssignment_8_1_1_0 ) )
+                    // InternalFormalML.g:8461:3: ( rule__Statemachine__ParameterAssignment_8_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_0()); 
+                    }
+                    // InternalFormalML.g:8462:3: ( rule__Statemachine__ParameterAssignment_8_1_1_0 )
+                    // InternalFormalML.g:8462:4: rule__Statemachine__ParameterAssignment_8_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ParameterAssignment_8_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8466:2: ( ( rule__Statemachine__Group_8_1_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8466:2: ( ( rule__Statemachine__Group_8_1_1_1__0 ) )
+                    // InternalFormalML.g:8467:3: ( rule__Statemachine__Group_8_1_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_8_1_1_1()); 
+                    }
+                    // InternalFormalML.g:8468:3: ( rule__Statemachine__Group_8_1_1_1__0 )
+                    // InternalFormalML.g:8468:4: rule__Statemachine__Group_8_1_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_8_1_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_8_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_8_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_8_2_1"
+    // InternalFormalML.g:8476:1: rule__Statemachine__Alternatives_8_2_1 : ( ( ( rule__Statemachine__ParameterAssignment_8_2_1_0 ) ) | ( ( rule__Statemachine__Group_8_2_1_1__0 ) ) );
+    public final void rule__Statemachine__Alternatives_8_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8480:1: ( ( ( rule__Statemachine__ParameterAssignment_8_2_1_0 ) ) | ( ( rule__Statemachine__Group_8_2_1_1__0 ) ) )
+            int alt89=2;
+            int LA89_0 = input.LA(1);
+
+            if ( (LA89_0==16) ) {
+                alt89=1;
+            }
+            else if ( (LA89_0==199) ) {
+                alt89=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 89, 0, input);
+
+                throw nvae;
+            }
+            switch (alt89) {
+                case 1 :
+                    // InternalFormalML.g:8481:2: ( ( rule__Statemachine__ParameterAssignment_8_2_1_0 ) )
+                    {
+                    // InternalFormalML.g:8481:2: ( ( rule__Statemachine__ParameterAssignment_8_2_1_0 ) )
+                    // InternalFormalML.g:8482:3: ( rule__Statemachine__ParameterAssignment_8_2_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_0()); 
+                    }
+                    // InternalFormalML.g:8483:3: ( rule__Statemachine__ParameterAssignment_8_2_1_0 )
+                    // InternalFormalML.g:8483:4: rule__Statemachine__ParameterAssignment_8_2_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ParameterAssignment_8_2_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8487:2: ( ( rule__Statemachine__Group_8_2_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8487:2: ( ( rule__Statemachine__Group_8_2_1_1__0 ) )
+                    // InternalFormalML.g:8488:3: ( rule__Statemachine__Group_8_2_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_8_2_1_1()); 
+                    }
+                    // InternalFormalML.g:8489:3: ( rule__Statemachine__Group_8_2_1_1__0 )
+                    // InternalFormalML.g:8489:4: rule__Statemachine__Group_8_2_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_8_2_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_8_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_8_2_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_8_3_1"
+    // InternalFormalML.g:8497:1: rule__Statemachine__Alternatives_8_3_1 : ( ( ( rule__Statemachine__ParameterAssignment_8_3_1_0 ) ) | ( ( rule__Statemachine__Group_8_3_1_1__0 ) ) );
+    public final void rule__Statemachine__Alternatives_8_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8501:1: ( ( ( rule__Statemachine__ParameterAssignment_8_3_1_0 ) ) | ( ( rule__Statemachine__Group_8_3_1_1__0 ) ) )
+            int alt90=2;
+            int LA90_0 = input.LA(1);
+
+            if ( (LA90_0==16) ) {
+                alt90=1;
+            }
+            else if ( (LA90_0==199) ) {
+                alt90=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 90, 0, input);
+
+                throw nvae;
+            }
+            switch (alt90) {
+                case 1 :
+                    // InternalFormalML.g:8502:2: ( ( rule__Statemachine__ParameterAssignment_8_3_1_0 ) )
+                    {
+                    // InternalFormalML.g:8502:2: ( ( rule__Statemachine__ParameterAssignment_8_3_1_0 ) )
+                    // InternalFormalML.g:8503:3: ( rule__Statemachine__ParameterAssignment_8_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_0()); 
+                    }
+                    // InternalFormalML.g:8504:3: ( rule__Statemachine__ParameterAssignment_8_3_1_0 )
+                    // InternalFormalML.g:8504:4: rule__Statemachine__ParameterAssignment_8_3_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ParameterAssignment_8_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8508:2: ( ( rule__Statemachine__Group_8_3_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8508:2: ( ( rule__Statemachine__Group_8_3_1_1__0 ) )
+                    // InternalFormalML.g:8509:3: ( rule__Statemachine__Group_8_3_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_8_3_1_1()); 
+                    }
+                    // InternalFormalML.g:8510:3: ( rule__Statemachine__Group_8_3_1_1__0 )
+                    // InternalFormalML.g:8510:4: rule__Statemachine__Group_8_3_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_8_3_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_8_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_8_3_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_9"
+    // InternalFormalML.g:8518:1: rule__Statemachine__Alternatives_9 : ( ( ( rule__Statemachine__Group_9_0__0 ) ) | ( ( rule__Statemachine__Group_9_1__0 ) ) | ( ( rule__Statemachine__Group_9_2__0 ) ) | ( ( rule__Statemachine__Group_9_3__0 ) ) );
+    public final void rule__Statemachine__Alternatives_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8522:1: ( ( ( rule__Statemachine__Group_9_0__0 ) ) | ( ( rule__Statemachine__Group_9_1__0 ) ) | ( ( rule__Statemachine__Group_9_2__0 ) ) | ( ( rule__Statemachine__Group_9_3__0 ) ) )
+            int alt91=4;
+            switch ( input.LA(1) ) {
+            case 202:
+                {
+                alt91=1;
+                }
+                break;
+            case 203:
+                {
+                alt91=2;
+                }
+                break;
+            case 204:
+                {
+                alt91=3;
+                }
+                break;
+            case 205:
+                {
+                alt91=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 91, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt91) {
+                case 1 :
+                    // InternalFormalML.g:8523:2: ( ( rule__Statemachine__Group_9_0__0 ) )
+                    {
+                    // InternalFormalML.g:8523:2: ( ( rule__Statemachine__Group_9_0__0 ) )
+                    // InternalFormalML.g:8524:3: ( rule__Statemachine__Group_9_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_9_0()); 
+                    }
+                    // InternalFormalML.g:8525:3: ( rule__Statemachine__Group_9_0__0 )
+                    // InternalFormalML.g:8525:4: rule__Statemachine__Group_9_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_9_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_9_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8529:2: ( ( rule__Statemachine__Group_9_1__0 ) )
+                    {
+                    // InternalFormalML.g:8529:2: ( ( rule__Statemachine__Group_9_1__0 ) )
+                    // InternalFormalML.g:8530:3: ( rule__Statemachine__Group_9_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_9_1()); 
+                    }
+                    // InternalFormalML.g:8531:3: ( rule__Statemachine__Group_9_1__0 )
+                    // InternalFormalML.g:8531:4: rule__Statemachine__Group_9_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_9_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_9_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8535:2: ( ( rule__Statemachine__Group_9_2__0 ) )
+                    {
+                    // InternalFormalML.g:8535:2: ( ( rule__Statemachine__Group_9_2__0 ) )
+                    // InternalFormalML.g:8536:3: ( rule__Statemachine__Group_9_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_9_2()); 
+                    }
+                    // InternalFormalML.g:8537:3: ( rule__Statemachine__Group_9_2__0 )
+                    // InternalFormalML.g:8537:4: rule__Statemachine__Group_9_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_9_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_9_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8541:2: ( ( rule__Statemachine__Group_9_3__0 ) )
+                    {
+                    // InternalFormalML.g:8541:2: ( ( rule__Statemachine__Group_9_3__0 ) )
+                    // InternalFormalML.g:8542:3: ( rule__Statemachine__Group_9_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_9_3()); 
+                    }
+                    // InternalFormalML.g:8543:3: ( rule__Statemachine__Group_9_3__0 )
+                    // InternalFormalML.g:8543:4: rule__Statemachine__Group_9_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_9_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_9_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_9"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_9_0_1"
+    // InternalFormalML.g:8551:1: rule__Statemachine__Alternatives_9_0_1 : ( ( ( rule__Statemachine__PortAssignment_9_0_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_0_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_0_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_0_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_0_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_0_1_5 ) ) );
+    public final void rule__Statemachine__Alternatives_9_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8555:1: ( ( ( rule__Statemachine__PortAssignment_9_0_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_0_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_0_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_0_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_0_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_0_1_5 ) ) )
+            int alt92=6;
+            alt92 = dfa92.predict(input);
+            switch (alt92) {
+                case 1 :
+                    // InternalFormalML.g:8556:2: ( ( rule__Statemachine__PortAssignment_9_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:8556:2: ( ( rule__Statemachine__PortAssignment_9_0_1_0 ) )
+                    // InternalFormalML.g:8557:3: ( rule__Statemachine__PortAssignment_9_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPortAssignment_9_0_1_0()); 
+                    }
+                    // InternalFormalML.g:8558:3: ( rule__Statemachine__PortAssignment_9_0_1_0 )
+                    // InternalFormalML.g:8558:4: rule__Statemachine__PortAssignment_9_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PortAssignment_9_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPortAssignment_9_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8562:2: ( ( rule__Statemachine__SignalAssignment_9_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:8562:2: ( ( rule__Statemachine__SignalAssignment_9_0_1_1 ) )
+                    // InternalFormalML.g:8563:3: ( rule__Statemachine__SignalAssignment_9_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getSignalAssignment_9_0_1_1()); 
+                    }
+                    // InternalFormalML.g:8564:3: ( rule__Statemachine__SignalAssignment_9_0_1_1 )
+                    // InternalFormalML.g:8564:4: rule__Statemachine__SignalAssignment_9_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__SignalAssignment_9_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getSignalAssignment_9_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8568:2: ( ( rule__Statemachine__BufferAssignment_9_0_1_2 ) )
+                    {
+                    // InternalFormalML.g:8568:2: ( ( rule__Statemachine__BufferAssignment_9_0_1_2 ) )
+                    // InternalFormalML.g:8569:3: ( rule__Statemachine__BufferAssignment_9_0_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getBufferAssignment_9_0_1_2()); 
+                    }
+                    // InternalFormalML.g:8570:3: ( rule__Statemachine__BufferAssignment_9_0_1_2 )
+                    // InternalFormalML.g:8570:4: rule__Statemachine__BufferAssignment_9_0_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__BufferAssignment_9_0_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getBufferAssignment_9_0_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8574:2: ( ( rule__Statemachine__ChannelAssignment_9_0_1_3 ) )
+                    {
+                    // InternalFormalML.g:8574:2: ( ( rule__Statemachine__ChannelAssignment_9_0_1_3 ) )
+                    // InternalFormalML.g:8575:3: ( rule__Statemachine__ChannelAssignment_9_0_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getChannelAssignment_9_0_1_3()); 
+                    }
+                    // InternalFormalML.g:8576:3: ( rule__Statemachine__ChannelAssignment_9_0_1_3 )
+                    // InternalFormalML.g:8576:4: rule__Statemachine__ChannelAssignment_9_0_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ChannelAssignment_9_0_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getChannelAssignment_9_0_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:8580:2: ( ( rule__Statemachine__TypedefAssignment_9_0_1_4 ) )
+                    {
+                    // InternalFormalML.g:8580:2: ( ( rule__Statemachine__TypedefAssignment_9_0_1_4 ) )
+                    // InternalFormalML.g:8581:3: ( rule__Statemachine__TypedefAssignment_9_0_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_0_1_4()); 
+                    }
+                    // InternalFormalML.g:8582:3: ( rule__Statemachine__TypedefAssignment_9_0_1_4 )
+                    // InternalFormalML.g:8582:4: rule__Statemachine__TypedefAssignment_9_0_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__TypedefAssignment_9_0_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_0_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:8586:2: ( ( rule__Statemachine__PropertyAssignment_9_0_1_5 ) )
+                    {
+                    // InternalFormalML.g:8586:2: ( ( rule__Statemachine__PropertyAssignment_9_0_1_5 ) )
+                    // InternalFormalML.g:8587:3: ( rule__Statemachine__PropertyAssignment_9_0_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_0_1_5()); 
+                    }
+                    // InternalFormalML.g:8588:3: ( rule__Statemachine__PropertyAssignment_9_0_1_5 )
+                    // InternalFormalML.g:8588:4: rule__Statemachine__PropertyAssignment_9_0_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PropertyAssignment_9_0_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_0_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_9_0_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_9_1_1"
+    // InternalFormalML.g:8596:1: rule__Statemachine__Alternatives_9_1_1 : ( ( ( rule__Statemachine__PortAssignment_9_1_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_1_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_1_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_1_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_1_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_1_1_5 ) ) );
+    public final void rule__Statemachine__Alternatives_9_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8600:1: ( ( ( rule__Statemachine__PortAssignment_9_1_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_1_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_1_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_1_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_1_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_1_1_5 ) ) )
+            int alt93=6;
+            alt93 = dfa93.predict(input);
+            switch (alt93) {
+                case 1 :
+                    // InternalFormalML.g:8601:2: ( ( rule__Statemachine__PortAssignment_9_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:8601:2: ( ( rule__Statemachine__PortAssignment_9_1_1_0 ) )
+                    // InternalFormalML.g:8602:3: ( rule__Statemachine__PortAssignment_9_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPortAssignment_9_1_1_0()); 
+                    }
+                    // InternalFormalML.g:8603:3: ( rule__Statemachine__PortAssignment_9_1_1_0 )
+                    // InternalFormalML.g:8603:4: rule__Statemachine__PortAssignment_9_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PortAssignment_9_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPortAssignment_9_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8607:2: ( ( rule__Statemachine__SignalAssignment_9_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:8607:2: ( ( rule__Statemachine__SignalAssignment_9_1_1_1 ) )
+                    // InternalFormalML.g:8608:3: ( rule__Statemachine__SignalAssignment_9_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getSignalAssignment_9_1_1_1()); 
+                    }
+                    // InternalFormalML.g:8609:3: ( rule__Statemachine__SignalAssignment_9_1_1_1 )
+                    // InternalFormalML.g:8609:4: rule__Statemachine__SignalAssignment_9_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__SignalAssignment_9_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getSignalAssignment_9_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8613:2: ( ( rule__Statemachine__BufferAssignment_9_1_1_2 ) )
+                    {
+                    // InternalFormalML.g:8613:2: ( ( rule__Statemachine__BufferAssignment_9_1_1_2 ) )
+                    // InternalFormalML.g:8614:3: ( rule__Statemachine__BufferAssignment_9_1_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getBufferAssignment_9_1_1_2()); 
+                    }
+                    // InternalFormalML.g:8615:3: ( rule__Statemachine__BufferAssignment_9_1_1_2 )
+                    // InternalFormalML.g:8615:4: rule__Statemachine__BufferAssignment_9_1_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__BufferAssignment_9_1_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getBufferAssignment_9_1_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8619:2: ( ( rule__Statemachine__ChannelAssignment_9_1_1_3 ) )
+                    {
+                    // InternalFormalML.g:8619:2: ( ( rule__Statemachine__ChannelAssignment_9_1_1_3 ) )
+                    // InternalFormalML.g:8620:3: ( rule__Statemachine__ChannelAssignment_9_1_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getChannelAssignment_9_1_1_3()); 
+                    }
+                    // InternalFormalML.g:8621:3: ( rule__Statemachine__ChannelAssignment_9_1_1_3 )
+                    // InternalFormalML.g:8621:4: rule__Statemachine__ChannelAssignment_9_1_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ChannelAssignment_9_1_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getChannelAssignment_9_1_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:8625:2: ( ( rule__Statemachine__TypedefAssignment_9_1_1_4 ) )
+                    {
+                    // InternalFormalML.g:8625:2: ( ( rule__Statemachine__TypedefAssignment_9_1_1_4 ) )
+                    // InternalFormalML.g:8626:3: ( rule__Statemachine__TypedefAssignment_9_1_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_1_1_4()); 
+                    }
+                    // InternalFormalML.g:8627:3: ( rule__Statemachine__TypedefAssignment_9_1_1_4 )
+                    // InternalFormalML.g:8627:4: rule__Statemachine__TypedefAssignment_9_1_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__TypedefAssignment_9_1_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_1_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:8631:2: ( ( rule__Statemachine__PropertyAssignment_9_1_1_5 ) )
+                    {
+                    // InternalFormalML.g:8631:2: ( ( rule__Statemachine__PropertyAssignment_9_1_1_5 ) )
+                    // InternalFormalML.g:8632:3: ( rule__Statemachine__PropertyAssignment_9_1_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_1_1_5()); 
+                    }
+                    // InternalFormalML.g:8633:3: ( rule__Statemachine__PropertyAssignment_9_1_1_5 )
+                    // InternalFormalML.g:8633:4: rule__Statemachine__PropertyAssignment_9_1_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PropertyAssignment_9_1_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_1_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_9_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_9_2_1"
+    // InternalFormalML.g:8641:1: rule__Statemachine__Alternatives_9_2_1 : ( ( ( rule__Statemachine__PortAssignment_9_2_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_2_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_2_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_2_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_2_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_2_1_5 ) ) );
+    public final void rule__Statemachine__Alternatives_9_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8645:1: ( ( ( rule__Statemachine__PortAssignment_9_2_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_2_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_2_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_2_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_2_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_2_1_5 ) ) )
+            int alt94=6;
+            alt94 = dfa94.predict(input);
+            switch (alt94) {
+                case 1 :
+                    // InternalFormalML.g:8646:2: ( ( rule__Statemachine__PortAssignment_9_2_1_0 ) )
+                    {
+                    // InternalFormalML.g:8646:2: ( ( rule__Statemachine__PortAssignment_9_2_1_0 ) )
+                    // InternalFormalML.g:8647:3: ( rule__Statemachine__PortAssignment_9_2_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPortAssignment_9_2_1_0()); 
+                    }
+                    // InternalFormalML.g:8648:3: ( rule__Statemachine__PortAssignment_9_2_1_0 )
+                    // InternalFormalML.g:8648:4: rule__Statemachine__PortAssignment_9_2_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PortAssignment_9_2_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPortAssignment_9_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8652:2: ( ( rule__Statemachine__SignalAssignment_9_2_1_1 ) )
+                    {
+                    // InternalFormalML.g:8652:2: ( ( rule__Statemachine__SignalAssignment_9_2_1_1 ) )
+                    // InternalFormalML.g:8653:3: ( rule__Statemachine__SignalAssignment_9_2_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getSignalAssignment_9_2_1_1()); 
+                    }
+                    // InternalFormalML.g:8654:3: ( rule__Statemachine__SignalAssignment_9_2_1_1 )
+                    // InternalFormalML.g:8654:4: rule__Statemachine__SignalAssignment_9_2_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__SignalAssignment_9_2_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getSignalAssignment_9_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8658:2: ( ( rule__Statemachine__BufferAssignment_9_2_1_2 ) )
+                    {
+                    // InternalFormalML.g:8658:2: ( ( rule__Statemachine__BufferAssignment_9_2_1_2 ) )
+                    // InternalFormalML.g:8659:3: ( rule__Statemachine__BufferAssignment_9_2_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getBufferAssignment_9_2_1_2()); 
+                    }
+                    // InternalFormalML.g:8660:3: ( rule__Statemachine__BufferAssignment_9_2_1_2 )
+                    // InternalFormalML.g:8660:4: rule__Statemachine__BufferAssignment_9_2_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__BufferAssignment_9_2_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getBufferAssignment_9_2_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8664:2: ( ( rule__Statemachine__ChannelAssignment_9_2_1_3 ) )
+                    {
+                    // InternalFormalML.g:8664:2: ( ( rule__Statemachine__ChannelAssignment_9_2_1_3 ) )
+                    // InternalFormalML.g:8665:3: ( rule__Statemachine__ChannelAssignment_9_2_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getChannelAssignment_9_2_1_3()); 
+                    }
+                    // InternalFormalML.g:8666:3: ( rule__Statemachine__ChannelAssignment_9_2_1_3 )
+                    // InternalFormalML.g:8666:4: rule__Statemachine__ChannelAssignment_9_2_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ChannelAssignment_9_2_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getChannelAssignment_9_2_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:8670:2: ( ( rule__Statemachine__TypedefAssignment_9_2_1_4 ) )
+                    {
+                    // InternalFormalML.g:8670:2: ( ( rule__Statemachine__TypedefAssignment_9_2_1_4 ) )
+                    // InternalFormalML.g:8671:3: ( rule__Statemachine__TypedefAssignment_9_2_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_2_1_4()); 
+                    }
+                    // InternalFormalML.g:8672:3: ( rule__Statemachine__TypedefAssignment_9_2_1_4 )
+                    // InternalFormalML.g:8672:4: rule__Statemachine__TypedefAssignment_9_2_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__TypedefAssignment_9_2_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_2_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:8676:2: ( ( rule__Statemachine__PropertyAssignment_9_2_1_5 ) )
+                    {
+                    // InternalFormalML.g:8676:2: ( ( rule__Statemachine__PropertyAssignment_9_2_1_5 ) )
+                    // InternalFormalML.g:8677:3: ( rule__Statemachine__PropertyAssignment_9_2_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_2_1_5()); 
+                    }
+                    // InternalFormalML.g:8678:3: ( rule__Statemachine__PropertyAssignment_9_2_1_5 )
+                    // InternalFormalML.g:8678:4: rule__Statemachine__PropertyAssignment_9_2_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PropertyAssignment_9_2_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_2_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_9_2_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_9_3_1"
+    // InternalFormalML.g:8686:1: rule__Statemachine__Alternatives_9_3_1 : ( ( ( rule__Statemachine__PortAssignment_9_3_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_3_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_3_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_3_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_3_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_3_1_5 ) ) );
+    public final void rule__Statemachine__Alternatives_9_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8690:1: ( ( ( rule__Statemachine__PortAssignment_9_3_1_0 ) ) | ( ( rule__Statemachine__SignalAssignment_9_3_1_1 ) ) | ( ( rule__Statemachine__BufferAssignment_9_3_1_2 ) ) | ( ( rule__Statemachine__ChannelAssignment_9_3_1_3 ) ) | ( ( rule__Statemachine__TypedefAssignment_9_3_1_4 ) ) | ( ( rule__Statemachine__PropertyAssignment_9_3_1_5 ) ) )
+            int alt95=6;
+            alt95 = dfa95.predict(input);
+            switch (alt95) {
+                case 1 :
+                    // InternalFormalML.g:8691:2: ( ( rule__Statemachine__PortAssignment_9_3_1_0 ) )
+                    {
+                    // InternalFormalML.g:8691:2: ( ( rule__Statemachine__PortAssignment_9_3_1_0 ) )
+                    // InternalFormalML.g:8692:3: ( rule__Statemachine__PortAssignment_9_3_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPortAssignment_9_3_1_0()); 
+                    }
+                    // InternalFormalML.g:8693:3: ( rule__Statemachine__PortAssignment_9_3_1_0 )
+                    // InternalFormalML.g:8693:4: rule__Statemachine__PortAssignment_9_3_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PortAssignment_9_3_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPortAssignment_9_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8697:2: ( ( rule__Statemachine__SignalAssignment_9_3_1_1 ) )
+                    {
+                    // InternalFormalML.g:8697:2: ( ( rule__Statemachine__SignalAssignment_9_3_1_1 ) )
+                    // InternalFormalML.g:8698:3: ( rule__Statemachine__SignalAssignment_9_3_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getSignalAssignment_9_3_1_1()); 
+                    }
+                    // InternalFormalML.g:8699:3: ( rule__Statemachine__SignalAssignment_9_3_1_1 )
+                    // InternalFormalML.g:8699:4: rule__Statemachine__SignalAssignment_9_3_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__SignalAssignment_9_3_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getSignalAssignment_9_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8703:2: ( ( rule__Statemachine__BufferAssignment_9_3_1_2 ) )
+                    {
+                    // InternalFormalML.g:8703:2: ( ( rule__Statemachine__BufferAssignment_9_3_1_2 ) )
+                    // InternalFormalML.g:8704:3: ( rule__Statemachine__BufferAssignment_9_3_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getBufferAssignment_9_3_1_2()); 
+                    }
+                    // InternalFormalML.g:8705:3: ( rule__Statemachine__BufferAssignment_9_3_1_2 )
+                    // InternalFormalML.g:8705:4: rule__Statemachine__BufferAssignment_9_3_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__BufferAssignment_9_3_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getBufferAssignment_9_3_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8709:2: ( ( rule__Statemachine__ChannelAssignment_9_3_1_3 ) )
+                    {
+                    // InternalFormalML.g:8709:2: ( ( rule__Statemachine__ChannelAssignment_9_3_1_3 ) )
+                    // InternalFormalML.g:8710:3: ( rule__Statemachine__ChannelAssignment_9_3_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getChannelAssignment_9_3_1_3()); 
+                    }
+                    // InternalFormalML.g:8711:3: ( rule__Statemachine__ChannelAssignment_9_3_1_3 )
+                    // InternalFormalML.g:8711:4: rule__Statemachine__ChannelAssignment_9_3_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ChannelAssignment_9_3_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getChannelAssignment_9_3_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:8715:2: ( ( rule__Statemachine__TypedefAssignment_9_3_1_4 ) )
+                    {
+                    // InternalFormalML.g:8715:2: ( ( rule__Statemachine__TypedefAssignment_9_3_1_4 ) )
+                    // InternalFormalML.g:8716:3: ( rule__Statemachine__TypedefAssignment_9_3_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_3_1_4()); 
+                    }
+                    // InternalFormalML.g:8717:3: ( rule__Statemachine__TypedefAssignment_9_3_1_4 )
+                    // InternalFormalML.g:8717:4: rule__Statemachine__TypedefAssignment_9_3_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__TypedefAssignment_9_3_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getTypedefAssignment_9_3_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:8721:2: ( ( rule__Statemachine__PropertyAssignment_9_3_1_5 ) )
+                    {
+                    // InternalFormalML.g:8721:2: ( ( rule__Statemachine__PropertyAssignment_9_3_1_5 ) )
+                    // InternalFormalML.g:8722:3: ( rule__Statemachine__PropertyAssignment_9_3_1_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_3_1_5()); 
+                    }
+                    // InternalFormalML.g:8723:3: ( rule__Statemachine__PropertyAssignment_9_3_1_5 )
+                    // InternalFormalML.g:8723:4: rule__Statemachine__PropertyAssignment_9_3_1_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__PropertyAssignment_9_3_1_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getPropertyAssignment_9_3_1_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_9_3_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_10"
+    // InternalFormalML.g:8731:1: rule__Statemachine__Alternatives_10 : ( ( ( rule__Statemachine__Alternatives_10_0 )* ) | ( ( ( rule__Statemachine__Alternatives_10_1 ) ) ( ( rule__Statemachine__Alternatives_10_1 )* ) ) );
+    public final void rule__Statemachine__Alternatives_10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8735:1: ( ( ( rule__Statemachine__Alternatives_10_0 )* ) | ( ( ( rule__Statemachine__Alternatives_10_1 ) ) ( ( rule__Statemachine__Alternatives_10_1 )* ) ) )
+            int alt98=2;
+            int LA98_0 = input.LA(1);
+
+            if ( ((LA98_0>=35 && LA98_0<=36)||(LA98_0>=41 && LA98_0<=44)||(LA98_0>=54 && LA98_0<=57)||LA98_0==206||(LA98_0>=275 && LA98_0<=276)) ) {
+                alt98=1;
+            }
+            else if ( (LA98_0==28||(LA98_0>=143 && LA98_0<=145)||LA98_0==214||(LA98_0>=224 && LA98_0<=225)) ) {
+                alt98=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 98, 0, input);
+
+                throw nvae;
+            }
+            switch (alt98) {
+                case 1 :
+                    // InternalFormalML.g:8736:2: ( ( rule__Statemachine__Alternatives_10_0 )* )
+                    {
+                    // InternalFormalML.g:8736:2: ( ( rule__Statemachine__Alternatives_10_0 )* )
+                    // InternalFormalML.g:8737:3: ( rule__Statemachine__Alternatives_10_0 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getAlternatives_10_0()); 
+                    }
+                    // InternalFormalML.g:8738:3: ( rule__Statemachine__Alternatives_10_0 )*
+                    loop96:
+                    do {
+                        int alt96=2;
+                        int LA96_0 = input.LA(1);
+
+                        if ( ((LA96_0>=35 && LA96_0<=36)||LA96_0==206) ) {
+                            alt96=1;
+                        }
+
+
+                        switch (alt96) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8738:4: rule__Statemachine__Alternatives_10_0
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_4);
+                    	    rule__Statemachine__Alternatives_10_0();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop96;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getAlternatives_10_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8742:2: ( ( ( rule__Statemachine__Alternatives_10_1 ) ) ( ( rule__Statemachine__Alternatives_10_1 )* ) )
+                    {
+                    // InternalFormalML.g:8742:2: ( ( ( rule__Statemachine__Alternatives_10_1 ) ) ( ( rule__Statemachine__Alternatives_10_1 )* ) )
+                    // InternalFormalML.g:8743:3: ( ( rule__Statemachine__Alternatives_10_1 ) ) ( ( rule__Statemachine__Alternatives_10_1 )* )
+                    {
+                    // InternalFormalML.g:8743:3: ( ( rule__Statemachine__Alternatives_10_1 ) )
+                    // InternalFormalML.g:8744:4: ( rule__Statemachine__Alternatives_10_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getAlternatives_10_1()); 
+                    }
+                    // InternalFormalML.g:8745:4: ( rule__Statemachine__Alternatives_10_1 )
+                    // InternalFormalML.g:8745:5: rule__Statemachine__Alternatives_10_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_5);
+                    rule__Statemachine__Alternatives_10_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getAlternatives_10_1()); 
+                    }
+
+                    }
+
+                    // InternalFormalML.g:8748:3: ( ( rule__Statemachine__Alternatives_10_1 )* )
+                    // InternalFormalML.g:8749:4: ( rule__Statemachine__Alternatives_10_1 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getAlternatives_10_1()); 
+                    }
+                    // InternalFormalML.g:8750:4: ( rule__Statemachine__Alternatives_10_1 )*
+                    loop97:
+                    do {
+                        int alt97=2;
+                        int LA97_0 = input.LA(1);
+
+                        if ( (LA97_0==28||(LA97_0>=143 && LA97_0<=145)||LA97_0==214||(LA97_0>=224 && LA97_0<=225)) ) {
+                            alt97=1;
+                        }
+
+
+                        switch (alt97) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8750:5: rule__Statemachine__Alternatives_10_1
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_5);
+                    	    rule__Statemachine__Alternatives_10_1();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop97;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getAlternatives_10_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_10"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_10_0"
+    // InternalFormalML.g:8759:1: rule__Statemachine__Alternatives_10_0 : ( ( ( rule__Statemachine__Group_10_0_0__0 ) ) | ( ( rule__Statemachine__Group_10_0_1__0 ) ) );
+    public final void rule__Statemachine__Alternatives_10_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8763:1: ( ( ( rule__Statemachine__Group_10_0_0__0 ) ) | ( ( rule__Statemachine__Group_10_0_1__0 ) ) )
+            int alt99=2;
+            int LA99_0 = input.LA(1);
+
+            if ( ((LA99_0>=35 && LA99_0<=36)) ) {
+                alt99=1;
+            }
+            else if ( (LA99_0==206) ) {
+                alt99=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 99, 0, input);
+
+                throw nvae;
+            }
+            switch (alt99) {
+                case 1 :
+                    // InternalFormalML.g:8764:2: ( ( rule__Statemachine__Group_10_0_0__0 ) )
+                    {
+                    // InternalFormalML.g:8764:2: ( ( rule__Statemachine__Group_10_0_0__0 ) )
+                    // InternalFormalML.g:8765:3: ( rule__Statemachine__Group_10_0_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_10_0_0()); 
+                    }
+                    // InternalFormalML.g:8766:3: ( rule__Statemachine__Group_10_0_0__0 )
+                    // InternalFormalML.g:8766:4: rule__Statemachine__Group_10_0_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_10_0_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_10_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8770:2: ( ( rule__Statemachine__Group_10_0_1__0 ) )
+                    {
+                    // InternalFormalML.g:8770:2: ( ( rule__Statemachine__Group_10_0_1__0 ) )
+                    // InternalFormalML.g:8771:3: ( rule__Statemachine__Group_10_0_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getGroup_10_0_1()); 
+                    }
+                    // InternalFormalML.g:8772:3: ( rule__Statemachine__Group_10_0_1__0 )
+                    // InternalFormalML.g:8772:4: rule__Statemachine__Group_10_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_10_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getGroup_10_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_10_0"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_10_0_0_0"
+    // InternalFormalML.g:8780:1: rule__Statemachine__Alternatives_10_0_0_0 : ( ( '@routine:' ) | ( '@macro:' ) );
+    public final void rule__Statemachine__Alternatives_10_0_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8784:1: ( ( '@routine:' ) | ( '@macro:' ) )
+            int alt100=2;
+            int LA100_0 = input.LA(1);
+
+            if ( (LA100_0==35) ) {
+                alt100=1;
+            }
+            else if ( (LA100_0==36) ) {
+                alt100=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 100, 0, input);
+
+                throw nvae;
+            }
+            switch (alt100) {
+                case 1 :
+                    // InternalFormalML.g:8785:2: ( '@routine:' )
+                    {
+                    // InternalFormalML.g:8785:2: ( '@routine:' )
+                    // InternalFormalML.g:8786:3: '@routine:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getRoutineKeyword_10_0_0_0_0()); 
+                    }
+                    match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getRoutineKeyword_10_0_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8791:2: ( '@macro:' )
+                    {
+                    // InternalFormalML.g:8791:2: ( '@macro:' )
+                    // InternalFormalML.g:8792:3: '@macro:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getMacroKeyword_10_0_0_0_1()); 
+                    }
+                    match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getMacroKeyword_10_0_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_10_0_0_0"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_10_1"
+    // InternalFormalML.g:8801:1: rule__Statemachine__Alternatives_10_1 : ( ( ( rule__Statemachine__RoutineAssignment_10_1_0 ) ) | ( ( rule__Statemachine__ProcedureAssignment_10_1_1 ) ) );
+    public final void rule__Statemachine__Alternatives_10_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8805:1: ( ( ( rule__Statemachine__RoutineAssignment_10_1_0 ) ) | ( ( rule__Statemachine__ProcedureAssignment_10_1_1 ) ) )
+            int alt101=2;
+            switch ( input.LA(1) ) {
+            case 143:
+                {
+                int LA101_1 = input.LA(2);
+
+                if ( ((LA101_1>=224 && LA101_1<=225)) ) {
+                    alt101=1;
+                }
+                else if ( (LA101_1==214) ) {
+                    alt101=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 101, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 144:
+                {
+                int LA101_2 = input.LA(2);
+
+                if ( (LA101_2==214) ) {
+                    alt101=2;
+                }
+                else if ( ((LA101_2>=224 && LA101_2<=225)) ) {
+                    alt101=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 101, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 145:
+                {
+                int LA101_3 = input.LA(2);
+
+                if ( ((LA101_3>=224 && LA101_3<=225)) ) {
+                    alt101=1;
+                }
+                else if ( (LA101_3==214) ) {
+                    alt101=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 101, 3, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 28:
+                {
+                int LA101_4 = input.LA(2);
+
+                if ( (LA101_4==214) ) {
+                    alt101=2;
+                }
+                else if ( ((LA101_4>=224 && LA101_4<=225)) ) {
+                    alt101=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 101, 4, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 224:
+            case 225:
+                {
+                alt101=1;
+                }
+                break;
+            case 214:
+                {
+                alt101=2;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 101, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt101) {
+                case 1 :
+                    // InternalFormalML.g:8806:2: ( ( rule__Statemachine__RoutineAssignment_10_1_0 ) )
+                    {
+                    // InternalFormalML.g:8806:2: ( ( rule__Statemachine__RoutineAssignment_10_1_0 ) )
+                    // InternalFormalML.g:8807:3: ( rule__Statemachine__RoutineAssignment_10_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_1_0()); 
+                    }
+                    // InternalFormalML.g:8808:3: ( rule__Statemachine__RoutineAssignment_10_1_0 )
+                    // InternalFormalML.g:8808:4: rule__Statemachine__RoutineAssignment_10_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__RoutineAssignment_10_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8812:2: ( ( rule__Statemachine__ProcedureAssignment_10_1_1 ) )
+                    {
+                    // InternalFormalML.g:8812:2: ( ( rule__Statemachine__ProcedureAssignment_10_1_1 ) )
+                    // InternalFormalML.g:8813:3: ( rule__Statemachine__ProcedureAssignment_10_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_1_1()); 
+                    }
+                    // InternalFormalML.g:8814:3: ( rule__Statemachine__ProcedureAssignment_10_1_1 )
+                    // InternalFormalML.g:8814:4: rule__Statemachine__ProcedureAssignment_10_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ProcedureAssignment_10_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_10_1"
+
+
+    // $ANTLR start "rule__Statemachine__Alternatives_11"
+    // InternalFormalML.g:8822:1: rule__Statemachine__Alternatives_11 : ( ( ( ( rule__Statemachine__RegionAssignment_11_0 ) ) ( ( rule__Statemachine__RegionAssignment_11_0 )* ) ) | ( ( rule__Statemachine__RegionAssignment_11_1 ) ) );
+    public final void rule__Statemachine__Alternatives_11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8826:1: ( ( ( ( rule__Statemachine__RegionAssignment_11_0 ) ) ( ( rule__Statemachine__RegionAssignment_11_0 )* ) ) | ( ( rule__Statemachine__RegionAssignment_11_1 ) ) )
+            int alt103=2;
+            int LA103_0 = input.LA(1);
+
+            if ( ((LA103_0>=41 && LA103_0<=44)) ) {
+                alt103=1;
+            }
+            else if ( ((LA103_0>=54 && LA103_0<=57)||(LA103_0>=275 && LA103_0<=276)) ) {
+                alt103=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 103, 0, input);
+
+                throw nvae;
+            }
+            switch (alt103) {
+                case 1 :
+                    // InternalFormalML.g:8827:2: ( ( ( rule__Statemachine__RegionAssignment_11_0 ) ) ( ( rule__Statemachine__RegionAssignment_11_0 )* ) )
+                    {
+                    // InternalFormalML.g:8827:2: ( ( ( rule__Statemachine__RegionAssignment_11_0 ) ) ( ( rule__Statemachine__RegionAssignment_11_0 )* ) )
+                    // InternalFormalML.g:8828:3: ( ( rule__Statemachine__RegionAssignment_11_0 ) ) ( ( rule__Statemachine__RegionAssignment_11_0 )* )
+                    {
+                    // InternalFormalML.g:8828:3: ( ( rule__Statemachine__RegionAssignment_11_0 ) )
+                    // InternalFormalML.g:8829:4: ( rule__Statemachine__RegionAssignment_11_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getRegionAssignment_11_0()); 
+                    }
+                    // InternalFormalML.g:8830:4: ( rule__Statemachine__RegionAssignment_11_0 )
+                    // InternalFormalML.g:8830:5: rule__Statemachine__RegionAssignment_11_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_7);
+                    rule__Statemachine__RegionAssignment_11_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getRegionAssignment_11_0()); 
+                    }
+
+                    }
+
+                    // InternalFormalML.g:8833:3: ( ( rule__Statemachine__RegionAssignment_11_0 )* )
+                    // InternalFormalML.g:8834:4: ( rule__Statemachine__RegionAssignment_11_0 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getRegionAssignment_11_0()); 
+                    }
+                    // InternalFormalML.g:8835:4: ( rule__Statemachine__RegionAssignment_11_0 )*
+                    loop102:
+                    do {
+                        int alt102=2;
+                        int LA102_0 = input.LA(1);
+
+                        if ( ((LA102_0>=41 && LA102_0<=44)) ) {
+                            alt102=1;
+                        }
+
+
+                        switch (alt102) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8835:5: rule__Statemachine__RegionAssignment_11_0
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_7);
+                    	    rule__Statemachine__RegionAssignment_11_0();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop102;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getRegionAssignment_11_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8840:2: ( ( rule__Statemachine__RegionAssignment_11_1 ) )
+                    {
+                    // InternalFormalML.g:8840:2: ( ( rule__Statemachine__RegionAssignment_11_1 ) )
+                    // InternalFormalML.g:8841:3: ( rule__Statemachine__RegionAssignment_11_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getRegionAssignment_11_1()); 
+                    }
+                    // InternalFormalML.g:8842:3: ( rule__Statemachine__RegionAssignment_11_1 )
+                    // InternalFormalML.g:8842:4: rule__Statemachine__RegionAssignment_11_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__RegionAssignment_11_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getRegionAssignment_11_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Alternatives_11"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Alternatives_1"
+    // InternalFormalML.g:8850:1: rule__StatemachineRegion__Alternatives_1 : ( ( ( rule__StatemachineRegion__Alternatives_1_0 ) ) | ( ( rule__StatemachineRegion__Group_1_1__0 ) ) );
+    public final void rule__StatemachineRegion__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8854:1: ( ( ( rule__StatemachineRegion__Alternatives_1_0 ) ) | ( ( rule__StatemachineRegion__Group_1_1__0 ) ) )
+            int alt104=2;
+            int LA104_0 = input.LA(1);
+
+            if ( ((LA104_0>=41 && LA104_0<=42)) ) {
+                alt104=1;
+            }
+            else if ( ((LA104_0>=43 && LA104_0<=44)) ) {
+                alt104=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 104, 0, input);
+
+                throw nvae;
+            }
+            switch (alt104) {
+                case 1 :
+                    // InternalFormalML.g:8855:2: ( ( rule__StatemachineRegion__Alternatives_1_0 ) )
+                    {
+                    // InternalFormalML.g:8855:2: ( ( rule__StatemachineRegion__Alternatives_1_0 ) )
+                    // InternalFormalML.g:8856:3: ( rule__StatemachineRegion__Alternatives_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_0()); 
+                    }
+                    // InternalFormalML.g:8857:3: ( rule__StatemachineRegion__Alternatives_1_0 )
+                    // InternalFormalML.g:8857:4: rule__StatemachineRegion__Alternatives_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StatemachineRegion__Alternatives_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8861:2: ( ( rule__StatemachineRegion__Group_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:8861:2: ( ( rule__StatemachineRegion__Group_1_1__0 ) )
+                    // InternalFormalML.g:8862:3: ( rule__StatemachineRegion__Group_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionAccess().getGroup_1_1()); 
+                    }
+                    // InternalFormalML.g:8863:3: ( rule__StatemachineRegion__Group_1_1__0 )
+                    // InternalFormalML.g:8863:4: rule__StatemachineRegion__Group_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StatemachineRegion__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionAccess().getGroup_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Alternatives_1"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Alternatives_1_0"
+    // InternalFormalML.g:8871:1: rule__StatemachineRegion__Alternatives_1_0 : ( ( '@region:' ) | ( '@statemachine:' ) );
+    public final void rule__StatemachineRegion__Alternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8875:1: ( ( '@region:' ) | ( '@statemachine:' ) )
+            int alt105=2;
+            int LA105_0 = input.LA(1);
+
+            if ( (LA105_0==41) ) {
+                alt105=1;
+            }
+            else if ( (LA105_0==42) ) {
+                alt105=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 105, 0, input);
+
+                throw nvae;
+            }
+            switch (alt105) {
+                case 1 :
+                    // InternalFormalML.g:8876:2: ( '@region:' )
+                    {
+                    // InternalFormalML.g:8876:2: ( '@region:' )
+                    // InternalFormalML.g:8877:3: '@region:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_0_0()); 
+                    }
+                    match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8882:2: ( '@statemachine:' )
+                    {
+                    // InternalFormalML.g:8882:2: ( '@statemachine:' )
+                    // InternalFormalML.g:8883:3: '@statemachine:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_0_1()); 
+                    }
+                    match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Alternatives_1_0"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Alternatives_1_1_0"
+    // InternalFormalML.g:8892:1: rule__StatemachineRegion__Alternatives_1_1_0 : ( ( '@region<' ) | ( '@statemachine<' ) );
+    public final void rule__StatemachineRegion__Alternatives_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8896:1: ( ( '@region<' ) | ( '@statemachine<' ) )
+            int alt106=2;
+            int LA106_0 = input.LA(1);
+
+            if ( (LA106_0==43) ) {
+                alt106=1;
+            }
+            else if ( (LA106_0==44) ) {
+                alt106=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 106, 0, input);
+
+                throw nvae;
+            }
+            switch (alt106) {
+                case 1 :
+                    // InternalFormalML.g:8897:2: ( '@region<' )
+                    {
+                    // InternalFormalML.g:8897:2: ( '@region<' )
+                    // InternalFormalML.g:8898:3: '@region<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_1_0_0()); 
+                    }
+                    match(input,43,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8903:2: ( '@statemachine<' )
+                    {
+                    // InternalFormalML.g:8903:2: ( '@statemachine<' )
+                    // InternalFormalML.g:8904:3: '@statemachine<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_1_0_1()); 
+                    }
+                    match(input,44,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Alternatives_1_1_0"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Alternatives_2"
+    // InternalFormalML.g:8913:1: rule__StatemachineRegion__Alternatives_2 : ( ( ( rule__StatemachineRegion__VertexAssignment_2_0 ) ) | ( ( rule__StatemachineRegion__VertexAssignment_2_1 ) ) );
+    public final void rule__StatemachineRegion__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8917:1: ( ( ( rule__StatemachineRegion__VertexAssignment_2_0 ) ) | ( ( rule__StatemachineRegion__VertexAssignment_2_1 ) ) )
+            int alt107=2;
+            switch ( input.LA(1) ) {
+            case 54:
+                {
+                int LA107_1 = input.LA(2);
+
+                if ( (LA107_1==125) ) {
+                    switch ( input.LA(3) ) {
+                    case 201:
+                        {
+                        int LA107_5 = input.LA(4);
+
+                        if ( ((LA107_5>=33 && LA107_5<=34)||LA107_5==177||LA107_5==179||LA107_5==185) ) {
+                            alt107=1;
+                        }
+                        else if ( (LA107_5==13||(LA107_5>=148 && LA107_5<=157)) ) {
+                            alt107=2;
+                        }
+                        else {
+                            if (state.backtracking>0) {state.failed=true; return ;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 107, 5, input);
+
+                            throw nvae;
+                        }
+                        }
+                        break;
+                    case 33:
+                    case 34:
+                    case 177:
+                    case 179:
+                    case 185:
+                        {
+                        alt107=1;
+                        }
+                        break;
+                    case 13:
+                    case 148:
+                    case 149:
+                    case 150:
+                    case 151:
+                    case 152:
+                    case 153:
+                    case 154:
+                    case 155:
+                    case 156:
+                    case 157:
+                        {
+                        alt107=2;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 107, 4, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else if ( (LA107_1==RULE_XLIA_ID) ) {
+                    alt107=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 107, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 275:
+            case 276:
+                {
+                alt107=1;
+                }
+                break;
+            case 55:
+            case 56:
+            case 57:
+                {
+                alt107=2;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 107, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt107) {
+                case 1 :
+                    // InternalFormalML.g:8918:2: ( ( rule__StatemachineRegion__VertexAssignment_2_0 ) )
+                    {
+                    // InternalFormalML.g:8918:2: ( ( rule__StatemachineRegion__VertexAssignment_2_0 ) )
+                    // InternalFormalML.g:8919:3: ( rule__StatemachineRegion__VertexAssignment_2_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_0()); 
+                    }
+                    // InternalFormalML.g:8920:3: ( rule__StatemachineRegion__VertexAssignment_2_0 )
+                    // InternalFormalML.g:8920:4: rule__StatemachineRegion__VertexAssignment_2_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StatemachineRegion__VertexAssignment_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8924:2: ( ( rule__StatemachineRegion__VertexAssignment_2_1 ) )
+                    {
+                    // InternalFormalML.g:8924:2: ( ( rule__StatemachineRegion__VertexAssignment_2_1 ) )
+                    // InternalFormalML.g:8925:3: ( rule__StatemachineRegion__VertexAssignment_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_1()); 
+                    }
+                    // InternalFormalML.g:8926:3: ( rule__StatemachineRegion__VertexAssignment_2_1 )
+                    // InternalFormalML.g:8926:4: rule__StatemachineRegion__VertexAssignment_2_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StatemachineRegion__VertexAssignment_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionAccess().getVertexAssignment_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Alternatives_2"
+
+
+    // $ANTLR start "rule__StatemachineRegionLite__Alternatives"
+    // InternalFormalML.g:8934:1: rule__StatemachineRegionLite__Alternatives : ( ( ( rule__StatemachineRegionLite__VertexAssignment_0 ) ) | ( ( rule__StatemachineRegionLite__VertexAssignment_1 ) ) );
+    public final void rule__StatemachineRegionLite__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8938:1: ( ( ( rule__StatemachineRegionLite__VertexAssignment_0 ) ) | ( ( rule__StatemachineRegionLite__VertexAssignment_1 ) ) )
+            int alt108=2;
+            switch ( input.LA(1) ) {
+            case 54:
+                {
+                int LA108_1 = input.LA(2);
+
+                if ( (LA108_1==125) ) {
+                    switch ( input.LA(3) ) {
+                    case 201:
+                        {
+                        int LA108_5 = input.LA(4);
+
+                        if ( ((LA108_5>=33 && LA108_5<=34)||LA108_5==177||LA108_5==179||LA108_5==185) ) {
+                            alt108=1;
+                        }
+                        else if ( (LA108_5==13||(LA108_5>=148 && LA108_5<=157)) ) {
+                            alt108=2;
+                        }
+                        else {
+                            if (state.backtracking>0) {state.failed=true; return ;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 108, 5, input);
+
+                            throw nvae;
+                        }
+                        }
+                        break;
+                    case 13:
+                    case 148:
+                    case 149:
+                    case 150:
+                    case 151:
+                    case 152:
+                    case 153:
+                    case 154:
+                    case 155:
+                    case 156:
+                    case 157:
+                        {
+                        alt108=2;
+                        }
+                        break;
+                    case 33:
+                    case 34:
+                    case 177:
+                    case 179:
+                    case 185:
+                        {
+                        alt108=1;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 108, 4, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else if ( (LA108_1==RULE_XLIA_ID) ) {
+                    alt108=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 108, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 275:
+            case 276:
+                {
+                alt108=1;
+                }
+                break;
+            case 55:
+            case 56:
+            case 57:
+                {
+                alt108=2;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 108, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt108) {
+                case 1 :
+                    // InternalFormalML.g:8939:2: ( ( rule__StatemachineRegionLite__VertexAssignment_0 ) )
+                    {
+                    // InternalFormalML.g:8939:2: ( ( rule__StatemachineRegionLite__VertexAssignment_0 ) )
+                    // InternalFormalML.g:8940:3: ( rule__StatemachineRegionLite__VertexAssignment_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_0()); 
+                    }
+                    // InternalFormalML.g:8941:3: ( rule__StatemachineRegionLite__VertexAssignment_0 )
+                    // InternalFormalML.g:8941:4: rule__StatemachineRegionLite__VertexAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StatemachineRegionLite__VertexAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8945:2: ( ( rule__StatemachineRegionLite__VertexAssignment_1 ) )
+                    {
+                    // InternalFormalML.g:8945:2: ( ( rule__StatemachineRegionLite__VertexAssignment_1 ) )
+                    // InternalFormalML.g:8946:3: ( rule__StatemachineRegionLite__VertexAssignment_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_1()); 
+                    }
+                    // InternalFormalML.g:8947:3: ( rule__StatemachineRegionLite__VertexAssignment_1 )
+                    // InternalFormalML.g:8947:4: rule__StatemachineRegionLite__VertexAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StatemachineRegionLite__VertexAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineRegionLiteAccess().getVertexAssignment_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegionLite__Alternatives"
+
+
+    // $ANTLR start "rule__State__Alternatives"
+    // InternalFormalML.g:8955:1: rule__State__Alternatives : ( ( ruleCompositeState ) | ( ruleStartState ) | ( ruleSimpleState ) | ( ruleFinalState ) );
+    public final void rule__State__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8959:1: ( ( ruleCompositeState ) | ( ruleStartState ) | ( ruleSimpleState ) | ( ruleFinalState ) )
+            int alt109=4;
+            switch ( input.LA(1) ) {
+            case 54:
+                {
+                int LA109_1 = input.LA(2);
+
+                if ( (LA109_1==125) ) {
+                    switch ( input.LA(3) ) {
+                    case 201:
+                        {
+                        switch ( input.LA(4) ) {
+                        case 185:
+                            {
+                            alt109=2;
+                            }
+                            break;
+                        case 33:
+                        case 34:
+                            {
+                            alt109=1;
+                            }
+                            break;
+                        case 177:
+                            {
+                            alt109=3;
+                            }
+                            break;
+                        case 179:
+                            {
+                            alt109=4;
+                            }
+                            break;
+                        default:
+                            if (state.backtracking>0) {state.failed=true; return ;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 109, 6, input);
+
+                            throw nvae;
+                        }
+
+                        }
+                        break;
+                    case 185:
+                        {
+                        alt109=2;
+                        }
+                        break;
+                    case 179:
+                        {
+                        alt109=4;
+                        }
+                        break;
+                    case 177:
+                        {
+                        alt109=3;
+                        }
+                        break;
+                    case 33:
+                    case 34:
+                        {
+                        alt109=1;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 109, 4, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else if ( (LA109_1==RULE_XLIA_ID) ) {
+                    alt109=3;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 109, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 275:
+                {
+                alt109=2;
+                }
+                break;
+            case 276:
+                {
+                alt109=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 109, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt109) {
+                case 1 :
+                    // InternalFormalML.g:8960:2: ( ruleCompositeState )
+                    {
+                    // InternalFormalML.g:8960:2: ( ruleCompositeState )
+                    // InternalFormalML.g:8961:3: ruleCompositeState
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStateAccess().getCompositeStateParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleCompositeState();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStateAccess().getCompositeStateParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8966:2: ( ruleStartState )
+                    {
+                    // InternalFormalML.g:8966:2: ( ruleStartState )
+                    // InternalFormalML.g:8967:3: ruleStartState
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStateAccess().getStartStateParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleStartState();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStateAccess().getStartStateParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8972:2: ( ruleSimpleState )
+                    {
+                    // InternalFormalML.g:8972:2: ( ruleSimpleState )
+                    // InternalFormalML.g:8973:3: ruleSimpleState
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStateAccess().getSimpleStateParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleSimpleState();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStateAccess().getSimpleStateParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8978:2: ( ruleFinalState )
+                    {
+                    // InternalFormalML.g:8978:2: ( ruleFinalState )
+                    // InternalFormalML.g:8979:3: ruleFinalState
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStateAccess().getFinalStateParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleFinalState();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStateAccess().getFinalStateParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__State__Alternatives"
+
+
+    // $ANTLR start "rule__CompositeState__Alternatives_4"
+    // InternalFormalML.g:8988:1: rule__CompositeState__Alternatives_4 : ( ( 'or' ) | ( ( rule__CompositeState__OrthogonalAssignment_4_1 ) ) );
+    public final void rule__CompositeState__Alternatives_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:8992:1: ( ( 'or' ) | ( ( rule__CompositeState__OrthogonalAssignment_4_1 ) ) )
+            int alt110=2;
+            int LA110_0 = input.LA(1);
+
+            if ( (LA110_0==34) ) {
+                alt110=1;
+            }
+            else if ( (LA110_0==33) ) {
+                alt110=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 110, 0, input);
+
+                throw nvae;
+            }
+            switch (alt110) {
+                case 1 :
+                    // InternalFormalML.g:8993:2: ( 'or' )
+                    {
+                    // InternalFormalML.g:8993:2: ( 'or' )
+                    // InternalFormalML.g:8994:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getOrKeyword_4_0()); 
+                    }
+                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getOrKeyword_4_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8999:2: ( ( rule__CompositeState__OrthogonalAssignment_4_1 ) )
+                    {
+                    // InternalFormalML.g:8999:2: ( ( rule__CompositeState__OrthogonalAssignment_4_1 ) )
+                    // InternalFormalML.g:9000:3: ( rule__CompositeState__OrthogonalAssignment_4_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getOrthogonalAssignment_4_1()); 
+                    }
+                    // InternalFormalML.g:9001:3: ( rule__CompositeState__OrthogonalAssignment_4_1 )
+                    // InternalFormalML.g:9001:4: rule__CompositeState__OrthogonalAssignment_4_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CompositeState__OrthogonalAssignment_4_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getOrthogonalAssignment_4_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Alternatives_4"
+
+
+    // $ANTLR start "rule__CompositeState__Alternatives_8"
+    // InternalFormalML.g:9009:1: rule__CompositeState__Alternatives_8 : ( ( ( rule__CompositeState__Group_8_0__0 ) ) | ( ';' ) );
+    public final void rule__CompositeState__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9013:1: ( ( ( rule__CompositeState__Group_8_0__0 ) ) | ( ';' ) )
+            int alt111=2;
+            int LA111_0 = input.LA(1);
+
+            if ( (LA111_0==199) ) {
+                alt111=1;
+            }
+            else if ( (LA111_0==45) ) {
+                alt111=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 111, 0, input);
+
+                throw nvae;
+            }
+            switch (alt111) {
+                case 1 :
+                    // InternalFormalML.g:9014:2: ( ( rule__CompositeState__Group_8_0__0 ) )
+                    {
+                    // InternalFormalML.g:9014:2: ( ( rule__CompositeState__Group_8_0__0 ) )
+                    // InternalFormalML.g:9015:3: ( rule__CompositeState__Group_8_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getGroup_8_0()); 
+                    }
+                    // InternalFormalML.g:9016:3: ( rule__CompositeState__Group_8_0__0 )
+                    // InternalFormalML.g:9016:4: rule__CompositeState__Group_8_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CompositeState__Group_8_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getGroup_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9020:2: ( ';' )
+                    {
+                    // InternalFormalML.g:9020:2: ( ';' )
+                    // InternalFormalML.g:9021:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getSemicolonKeyword_8_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getSemicolonKeyword_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Alternatives_8"
+
+
+    // $ANTLR start "rule__CompositeState__Alternatives_8_0_1"
+    // InternalFormalML.g:9030:1: rule__CompositeState__Alternatives_8_0_1 : ( ( ( ( rule__CompositeState__Alternatives_8_0_1_0 ) ) ( ( rule__CompositeState__Alternatives_8_0_1_0 )* ) ) | ( ( rule__CompositeState__Group_8_0_1_1__0 ) ) );
+    public final void rule__CompositeState__Alternatives_8_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9034:1: ( ( ( ( rule__CompositeState__Alternatives_8_0_1_0 ) ) ( ( rule__CompositeState__Alternatives_8_0_1_0 )* ) ) | ( ( rule__CompositeState__Group_8_0_1_1__0 ) ) )
+            int alt113=2;
+            int LA113_0 = input.LA(1);
+
+            if ( ((LA113_0>=41 && LA113_0<=44)||LA113_0==221||LA113_0==223) ) {
+                alt113=1;
+            }
+            else if ( ((LA113_0>=54 && LA113_0<=57)||(LA113_0>=275 && LA113_0<=276)) ) {
+                alt113=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 113, 0, input);
+
+                throw nvae;
+            }
+            switch (alt113) {
+                case 1 :
+                    // InternalFormalML.g:9035:2: ( ( ( rule__CompositeState__Alternatives_8_0_1_0 ) ) ( ( rule__CompositeState__Alternatives_8_0_1_0 )* ) )
+                    {
+                    // InternalFormalML.g:9035:2: ( ( ( rule__CompositeState__Alternatives_8_0_1_0 ) ) ( ( rule__CompositeState__Alternatives_8_0_1_0 )* ) )
+                    // InternalFormalML.g:9036:3: ( ( rule__CompositeState__Alternatives_8_0_1_0 ) ) ( ( rule__CompositeState__Alternatives_8_0_1_0 )* )
+                    {
+                    // InternalFormalML.g:9036:3: ( ( rule__CompositeState__Alternatives_8_0_1_0 ) )
+                    // InternalFormalML.g:9037:4: ( rule__CompositeState__Alternatives_8_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_0()); 
+                    }
+                    // InternalFormalML.g:9038:4: ( rule__CompositeState__Alternatives_8_0_1_0 )
+                    // InternalFormalML.g:9038:5: rule__CompositeState__Alternatives_8_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_8);
+                    rule__CompositeState__Alternatives_8_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_0()); 
+                    }
+
+                    }
+
+                    // InternalFormalML.g:9041:3: ( ( rule__CompositeState__Alternatives_8_0_1_0 )* )
+                    // InternalFormalML.g:9042:4: ( rule__CompositeState__Alternatives_8_0_1_0 )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_0()); 
+                    }
+                    // InternalFormalML.g:9043:4: ( rule__CompositeState__Alternatives_8_0_1_0 )*
+                    loop112:
+                    do {
+                        int alt112=2;
+                        int LA112_0 = input.LA(1);
+
+                        if ( ((LA112_0>=41 && LA112_0<=44)||LA112_0==221||LA112_0==223) ) {
+                            alt112=1;
+                        }
+
+
+                        switch (alt112) {
+                    	case 1 :
+                    	    // InternalFormalML.g:9043:5: rule__CompositeState__Alternatives_8_0_1_0
+                    	    {
+                    	    pushFollow(FollowSets000.FOLLOW_8);
+                    	    rule__CompositeState__Alternatives_8_0_1_0();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return ;
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop112;
+                        }
+                    } while (true);
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9048:2: ( ( rule__CompositeState__Group_8_0_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:9048:2: ( ( rule__CompositeState__Group_8_0_1_1__0 ) )
+                    // InternalFormalML.g:9049:3: ( rule__CompositeState__Group_8_0_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_1()); 
+                    }
+                    // InternalFormalML.g:9050:3: ( rule__CompositeState__Group_8_0_1_1__0 )
+                    // InternalFormalML.g:9050:4: rule__CompositeState__Group_8_0_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CompositeState__Group_8_0_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Alternatives_8_0_1"
+
+
+    // $ANTLR start "rule__CompositeState__Alternatives_8_0_1_0"
+    // InternalFormalML.g:9058:1: rule__CompositeState__Alternatives_8_0_1_0 : ( ( ( rule__CompositeState__RegionAssignment_8_0_1_0_0 ) ) | ( ( rule__CompositeState__Group_8_0_1_0_1__0 ) ) | ( ( rule__CompositeState__Group_8_0_1_0_2__0 ) ) );
+    public final void rule__CompositeState__Alternatives_8_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9062:1: ( ( ( rule__CompositeState__RegionAssignment_8_0_1_0_0 ) ) | ( ( rule__CompositeState__Group_8_0_1_0_1__0 ) ) | ( ( rule__CompositeState__Group_8_0_1_0_2__0 ) ) )
+            int alt114=3;
+            switch ( input.LA(1) ) {
+            case 41:
+            case 42:
+            case 43:
+            case 44:
+                {
+                alt114=1;
+                }
+                break;
+            case 221:
+                {
+                alt114=2;
+                }
+                break;
+            case 223:
+                {
+                alt114=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 114, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt114) {
+                case 1 :
+                    // InternalFormalML.g:9063:2: ( ( rule__CompositeState__RegionAssignment_8_0_1_0_0 ) )
+                    {
+                    // InternalFormalML.g:9063:2: ( ( rule__CompositeState__RegionAssignment_8_0_1_0_0 ) )
+                    // InternalFormalML.g:9064:3: ( rule__CompositeState__RegionAssignment_8_0_1_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_0_0()); 
+                    }
+                    // InternalFormalML.g:9065:3: ( rule__CompositeState__RegionAssignment_8_0_1_0_0 )
+                    // InternalFormalML.g:9065:4: rule__CompositeState__RegionAssignment_8_0_1_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CompositeState__RegionAssignment_8_0_1_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9069:2: ( ( rule__CompositeState__Group_8_0_1_0_1__0 ) )
+                    {
+                    // InternalFormalML.g:9069:2: ( ( rule__CompositeState__Group_8_0_1_0_1__0 ) )
+                    // InternalFormalML.g:9070:3: ( rule__CompositeState__Group_8_0_1_0_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_1()); 
+                    }
+                    // InternalFormalML.g:9071:3: ( rule__CompositeState__Group_8_0_1_0_1__0 )
+                    // InternalFormalML.g:9071:4: rule__CompositeState__Group_8_0_1_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CompositeState__Group_8_0_1_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:9075:2: ( ( rule__CompositeState__Group_8_0_1_0_2__0 ) )
+                    {
+                    // InternalFormalML.g:9075:2: ( ( rule__CompositeState__Group_8_0_1_0_2__0 ) )
+                    // InternalFormalML.g:9076:3: ( rule__CompositeState__Group_8_0_1_0_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_2()); 
+                    }
+                    // InternalFormalML.g:9077:3: ( rule__CompositeState__Group_8_0_1_0_2__0 )
+                    // InternalFormalML.g:9077:4: rule__CompositeState__Group_8_0_1_0_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CompositeState__Group_8_0_1_0_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getGroup_8_0_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Alternatives_8_0_1_0"
+
+
+    // $ANTLR start "rule__CompositeState__Alternatives_8_0_1_1_1"
+    // InternalFormalML.g:9085:1: rule__CompositeState__Alternatives_8_0_1_1_1 : ( ( ( rule__CompositeState__TransitionAssignment_8_0_1_1_1_0 ) ) | ( ( rule__CompositeState__MoeAssignment_8_0_1_1_1_1 ) ) );
+    public final void rule__CompositeState__Alternatives_8_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9089:1: ( ( ( rule__CompositeState__TransitionAssignment_8_0_1_1_1_0 ) ) | ( ( rule__CompositeState__MoeAssignment_8_0_1_1_1_1 ) ) )
+            int alt115=2;
+            int LA115_0 = input.LA(1);
+
+            if ( (LA115_0==239||LA115_0==281) ) {
+                alt115=1;
+            }
+            else if ( ((LA115_0>=46 && LA115_0<=53)) ) {
+                alt115=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 115, 0, input);
+
+                throw nvae;
+            }
+            switch (alt115) {
+                case 1 :
+                    // InternalFormalML.g:9090:2: ( ( rule__CompositeState__TransitionAssignment_8_0_1_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:9090:2: ( ( rule__CompositeState__TransitionAssignment_8_0_1_1_1_0 ) )
+                    // InternalFormalML.g:9091:3: ( rule__CompositeState__TransitionAssignment_8_0_1_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_1_1_0()); 
+                    }
+                    // InternalFormalML.g:9092:3: ( rule__CompositeState__TransitionAssignment_8_0_1_1_1_0 )
+                    // InternalFormalML.g:9092:4: rule__CompositeState__TransitionAssignment_8_0_1_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CompositeState__TransitionAssignment_8_0_1_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9096:2: ( ( rule__CompositeState__MoeAssignment_8_0_1_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:9096:2: ( ( rule__CompositeState__MoeAssignment_8_0_1_1_1_1 ) )
+                    // InternalFormalML.g:9097:3: ( rule__CompositeState__MoeAssignment_8_0_1_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_1_1_1()); 
+                    }
+                    // InternalFormalML.g:9098:3: ( rule__CompositeState__MoeAssignment_8_0_1_1_1_1 )
+                    // InternalFormalML.g:9098:4: rule__CompositeState__MoeAssignment_8_0_1_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CompositeState__MoeAssignment_8_0_1_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Alternatives_8_0_1_1_1"
+
+
+    // $ANTLR start "rule__MoeCompositeStateRoutines__NameAlternatives_1_0"
+    // InternalFormalML.g:9106:1: rule__MoeCompositeStateRoutines__NameAlternatives_1_0 : ( ( '@init' ) | ( '@final' ) | ( '@enable' ) | ( '@disable' ) | ( '@concurrency' ) | ( '@schedule' ) | ( '@irun' ) | ( '@run' ) );
+    public final void rule__MoeCompositeStateRoutines__NameAlternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9110:1: ( ( '@init' ) | ( '@final' ) | ( '@enable' ) | ( '@disable' ) | ( '@concurrency' ) | ( '@schedule' ) | ( '@irun' ) | ( '@run' ) )
+            int alt116=8;
+            switch ( input.LA(1) ) {
+            case 46:
+                {
+                alt116=1;
+                }
+                break;
+            case 47:
+                {
+                alt116=2;
+                }
+                break;
+            case 48:
+                {
+                alt116=3;
+                }
+                break;
+            case 49:
+                {
+                alt116=4;
+                }
+                break;
+            case 50:
+                {
+                alt116=5;
+                }
+                break;
+            case 51:
+                {
+                alt116=6;
+                }
+                break;
+            case 52:
+                {
+                alt116=7;
+                }
+                break;
+            case 53:
+                {
+                alt116=8;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 116, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt116) {
+                case 1 :
+                    // InternalFormalML.g:9111:2: ( '@init' )
+                    {
+                    // InternalFormalML.g:9111:2: ( '@init' )
+                    // InternalFormalML.g:9112:3: '@init'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameInitKeyword_1_0_0()); 
+                    }
+                    match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameInitKeyword_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9117:2: ( '@final' )
+                    {
+                    // InternalFormalML.g:9117:2: ( '@final' )
+                    // InternalFormalML.g:9118:3: '@final'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameFinalKeyword_1_0_1()); 
+                    }
+                    match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameFinalKeyword_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:9123:2: ( '@enable' )
+                    {
+                    // InternalFormalML.g:9123:2: ( '@enable' )
+                    // InternalFormalML.g:9124:3: '@enable'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameEnableKeyword_1_0_2()); 
+                    }
+                    match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameEnableKeyword_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:9129:2: ( '@disable' )
+                    {
+                    // InternalFormalML.g:9129:2: ( '@disable' )
+                    // InternalFormalML.g:9130:3: '@disable'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameDisableKeyword_1_0_3()); 
+                    }
+                    match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameDisableKeyword_1_0_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:9135:2: ( '@concurrency' )
+                    {
+                    // InternalFormalML.g:9135:2: ( '@concurrency' )
+                    // InternalFormalML.g:9136:3: '@concurrency'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameConcurrencyKeyword_1_0_4()); 
+                    }
+                    match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameConcurrencyKeyword_1_0_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:9141:2: ( '@schedule' )
+                    {
+                    // InternalFormalML.g:9141:2: ( '@schedule' )
+                    // InternalFormalML.g:9142:3: '@schedule'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameScheduleKeyword_1_0_5()); 
+                    }
+                    match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameScheduleKeyword_1_0_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:9147:2: ( '@irun' )
+                    {
+                    // InternalFormalML.g:9147:2: ( '@irun' )
+                    // InternalFormalML.g:9148:3: '@irun'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameIrunKeyword_1_0_6()); 
+                    }
+                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameIrunKeyword_1_0_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:9153:2: ( '@run' )
+                    {
+                    // InternalFormalML.g:9153:2: ( '@run' )
+                    // InternalFormalML.g:9154:3: '@run'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameRunKeyword_1_0_7()); 
+                    }
+                    match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameRunKeyword_1_0_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeCompositeStateRoutines__NameAlternatives_1_0"
+
+
+    // $ANTLR start "rule__SimpleState__Alternatives_5"
+    // InternalFormalML.g:9163:1: rule__SimpleState__Alternatives_5 : ( ( ( rule__SimpleState__Group_5_0__0 ) ) | ( ';' ) );
+    public final void rule__SimpleState__Alternatives_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9167:1: ( ( ( rule__SimpleState__Group_5_0__0 ) ) | ( ';' ) )
+            int alt117=2;
+            int LA117_0 = input.LA(1);
+
+            if ( (LA117_0==199) ) {
+                alt117=1;
+            }
+            else if ( (LA117_0==45) ) {
+                alt117=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 117, 0, input);
+
+                throw nvae;
+            }
+            switch (alt117) {
+                case 1 :
+                    // InternalFormalML.g:9168:2: ( ( rule__SimpleState__Group_5_0__0 ) )
+                    {
+                    // InternalFormalML.g:9168:2: ( ( rule__SimpleState__Group_5_0__0 ) )
+                    // InternalFormalML.g:9169:3: ( rule__SimpleState__Group_5_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSimpleStateAccess().getGroup_5_0()); 
+                    }
+                    // InternalFormalML.g:9170:3: ( rule__SimpleState__Group_5_0__0 )
+                    // InternalFormalML.g:9170:4: rule__SimpleState__Group_5_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SimpleState__Group_5_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSimpleStateAccess().getGroup_5_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9174:2: ( ';' )
+                    {
+                    // InternalFormalML.g:9174:2: ( ';' )
+                    // InternalFormalML.g:9175:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSimpleStateAccess().getSemicolonKeyword_5_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSimpleStateAccess().getSemicolonKeyword_5_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Alternatives_5"
+
+
+    // $ANTLR start "rule__SimpleState__Alternatives_5_0_1"
+    // InternalFormalML.g:9184:1: rule__SimpleState__Alternatives_5_0_1 : ( ( ( rule__SimpleState__TransitionAssignment_5_0_1_0 ) ) | ( ( rule__SimpleState__MoeAssignment_5_0_1_1 ) ) );
+    public final void rule__SimpleState__Alternatives_5_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9188:1: ( ( ( rule__SimpleState__TransitionAssignment_5_0_1_0 ) ) | ( ( rule__SimpleState__MoeAssignment_5_0_1_1 ) ) )
+            int alt118=2;
+            int LA118_0 = input.LA(1);
+
+            if ( (LA118_0==239||LA118_0==281) ) {
+                alt118=1;
+            }
+            else if ( ((LA118_0>=48 && LA118_0<=49)||LA118_0==52) ) {
+                alt118=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 118, 0, input);
+
+                throw nvae;
+            }
+            switch (alt118) {
+                case 1 :
+                    // InternalFormalML.g:9189:2: ( ( rule__SimpleState__TransitionAssignment_5_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:9189:2: ( ( rule__SimpleState__TransitionAssignment_5_0_1_0 ) )
+                    // InternalFormalML.g:9190:3: ( rule__SimpleState__TransitionAssignment_5_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSimpleStateAccess().getTransitionAssignment_5_0_1_0()); 
+                    }
+                    // InternalFormalML.g:9191:3: ( rule__SimpleState__TransitionAssignment_5_0_1_0 )
+                    // InternalFormalML.g:9191:4: rule__SimpleState__TransitionAssignment_5_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SimpleState__TransitionAssignment_5_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSimpleStateAccess().getTransitionAssignment_5_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9195:2: ( ( rule__SimpleState__MoeAssignment_5_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:9195:2: ( ( rule__SimpleState__MoeAssignment_5_0_1_1 ) )
+                    // InternalFormalML.g:9196:3: ( rule__SimpleState__MoeAssignment_5_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSimpleStateAccess().getMoeAssignment_5_0_1_1()); 
+                    }
+                    // InternalFormalML.g:9197:3: ( rule__SimpleState__MoeAssignment_5_0_1_1 )
+                    // InternalFormalML.g:9197:4: rule__SimpleState__MoeAssignment_5_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SimpleState__MoeAssignment_5_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSimpleStateAccess().getMoeAssignment_5_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Alternatives_5_0_1"
+
+
+    // $ANTLR start "rule__MoeSimpleStateRoutines__NameAlternatives_1_0"
+    // InternalFormalML.g:9205:1: rule__MoeSimpleStateRoutines__NameAlternatives_1_0 : ( ( '@enable' ) | ( '@disable' ) | ( '@irun' ) );
+    public final void rule__MoeSimpleStateRoutines__NameAlternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9209:1: ( ( '@enable' ) | ( '@disable' ) | ( '@irun' ) )
+            int alt119=3;
+            switch ( input.LA(1) ) {
+            case 48:
+                {
+                alt119=1;
+                }
+                break;
+            case 49:
+                {
+                alt119=2;
+                }
+                break;
+            case 52:
+                {
+                alt119=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 119, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt119) {
+                case 1 :
+                    // InternalFormalML.g:9210:2: ( '@enable' )
+                    {
+                    // InternalFormalML.g:9210:2: ( '@enable' )
+                    // InternalFormalML.g:9211:3: '@enable'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameEnableKeyword_1_0_0()); 
+                    }
+                    match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameEnableKeyword_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9216:2: ( '@disable' )
+                    {
+                    // InternalFormalML.g:9216:2: ( '@disable' )
+                    // InternalFormalML.g:9217:3: '@disable'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameDisableKeyword_1_0_1()); 
+                    }
+                    match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameDisableKeyword_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:9222:2: ( '@irun' )
+                    {
+                    // InternalFormalML.g:9222:2: ( '@irun' )
+                    // InternalFormalML.g:9223:3: '@irun'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameIrunKeyword_1_0_2()); 
+                    }
+                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameIrunKeyword_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeSimpleStateRoutines__NameAlternatives_1_0"
+
+
+    // $ANTLR start "rule__StartState__Alternatives_1"
+    // InternalFormalML.g:9232:1: rule__StartState__Alternatives_1 : ( ( ( rule__StartState__Group_1_0__0 ) ) | ( ( rule__StartState__SimpleAssignment_1_1 ) ) );
+    public final void rule__StartState__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9236:1: ( ( ( rule__StartState__Group_1_0__0 ) ) | ( ( rule__StartState__SimpleAssignment_1_1 ) ) )
+            int alt120=2;
+            int LA120_0 = input.LA(1);
+
+            if ( (LA120_0==54) ) {
+                alt120=1;
+            }
+            else if ( (LA120_0==275) ) {
+                alt120=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 120, 0, input);
+
+                throw nvae;
+            }
+            switch (alt120) {
+                case 1 :
+                    // InternalFormalML.g:9237:2: ( ( rule__StartState__Group_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:9237:2: ( ( rule__StartState__Group_1_0__0 ) )
+                    // InternalFormalML.g:9238:3: ( rule__StartState__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStartStateAccess().getGroup_1_0()); 
+                    }
+                    // InternalFormalML.g:9239:3: ( rule__StartState__Group_1_0__0 )
+                    // InternalFormalML.g:9239:4: rule__StartState__Group_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StartState__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStartStateAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9243:2: ( ( rule__StartState__SimpleAssignment_1_1 ) )
+                    {
+                    // InternalFormalML.g:9243:2: ( ( rule__StartState__SimpleAssignment_1_1 ) )
+                    // InternalFormalML.g:9244:3: ( rule__StartState__SimpleAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStartStateAccess().getSimpleAssignment_1_1()); 
+                    }
+                    // InternalFormalML.g:9245:3: ( rule__StartState__SimpleAssignment_1_1 )
+                    // InternalFormalML.g:9245:4: rule__StartState__SimpleAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StartState__SimpleAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStartStateAccess().getSimpleAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Alternatives_1"
+
+
+    // $ANTLR start "rule__StartState__Alternatives_3"
+    // InternalFormalML.g:9253:1: rule__StartState__Alternatives_3 : ( ( ( rule__StartState__Group_3_0__0 ) ) | ( ';' ) );
+    public final void rule__StartState__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9257:1: ( ( ( rule__StartState__Group_3_0__0 ) ) | ( ';' ) )
+            int alt121=2;
+            int LA121_0 = input.LA(1);
+
+            if ( (LA121_0==199) ) {
+                alt121=1;
+            }
+            else if ( (LA121_0==45) ) {
+                alt121=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 121, 0, input);
+
+                throw nvae;
+            }
+            switch (alt121) {
+                case 1 :
+                    // InternalFormalML.g:9258:2: ( ( rule__StartState__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:9258:2: ( ( rule__StartState__Group_3_0__0 ) )
+                    // InternalFormalML.g:9259:3: ( rule__StartState__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStartStateAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:9260:3: ( rule__StartState__Group_3_0__0 )
+                    // InternalFormalML.g:9260:4: rule__StartState__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StartState__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStartStateAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9264:2: ( ';' )
+                    {
+                    // InternalFormalML.g:9264:2: ( ';' )
+                    // InternalFormalML.g:9265:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStartStateAccess().getSemicolonKeyword_3_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStartStateAccess().getSemicolonKeyword_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Alternatives_3"
+
+
+    // $ANTLR start "rule__StartState__Alternatives_3_0_1"
+    // InternalFormalML.g:9274:1: rule__StartState__Alternatives_3_0_1 : ( ( ( rule__StartState__TransitionAssignment_3_0_1_0 ) ) | ( ( rule__StartState__MoeAssignment_3_0_1_1 ) ) );
+    public final void rule__StartState__Alternatives_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9278:1: ( ( ( rule__StartState__TransitionAssignment_3_0_1_0 ) ) | ( ( rule__StartState__MoeAssignment_3_0_1_1 ) ) )
+            int alt122=2;
+            int LA122_0 = input.LA(1);
+
+            if ( (LA122_0==239||LA122_0==281) ) {
+                alt122=1;
+            }
+            else if ( (LA122_0==46||(LA122_0>=48 && LA122_0<=49)||LA122_0==52) ) {
+                alt122=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 122, 0, input);
+
+                throw nvae;
+            }
+            switch (alt122) {
+                case 1 :
+                    // InternalFormalML.g:9279:2: ( ( rule__StartState__TransitionAssignment_3_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:9279:2: ( ( rule__StartState__TransitionAssignment_3_0_1_0 ) )
+                    // InternalFormalML.g:9280:3: ( rule__StartState__TransitionAssignment_3_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStartStateAccess().getTransitionAssignment_3_0_1_0()); 
+                    }
+                    // InternalFormalML.g:9281:3: ( rule__StartState__TransitionAssignment_3_0_1_0 )
+                    // InternalFormalML.g:9281:4: rule__StartState__TransitionAssignment_3_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StartState__TransitionAssignment_3_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStartStateAccess().getTransitionAssignment_3_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9285:2: ( ( rule__StartState__MoeAssignment_3_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:9285:2: ( ( rule__StartState__MoeAssignment_3_0_1_1 ) )
+                    // InternalFormalML.g:9286:3: ( rule__StartState__MoeAssignment_3_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStartStateAccess().getMoeAssignment_3_0_1_1()); 
+                    }
+                    // InternalFormalML.g:9287:3: ( rule__StartState__MoeAssignment_3_0_1_1 )
+                    // InternalFormalML.g:9287:4: rule__StartState__MoeAssignment_3_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StartState__MoeAssignment_3_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStartStateAccess().getMoeAssignment_3_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Alternatives_3_0_1"
+
+
+    // $ANTLR start "rule__MoeStartStateRoutines__NameAlternatives_1_0"
+    // InternalFormalML.g:9295:1: rule__MoeStartStateRoutines__NameAlternatives_1_0 : ( ( '@init' ) | ( '@enable' ) | ( '@disable' ) | ( '@irun' ) );
+    public final void rule__MoeStartStateRoutines__NameAlternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9299:1: ( ( '@init' ) | ( '@enable' ) | ( '@disable' ) | ( '@irun' ) )
+            int alt123=4;
+            switch ( input.LA(1) ) {
+            case 46:
+                {
+                alt123=1;
+                }
+                break;
+            case 48:
+                {
+                alt123=2;
+                }
+                break;
+            case 49:
+                {
+                alt123=3;
+                }
+                break;
+            case 52:
+                {
+                alt123=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 123, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt123) {
+                case 1 :
+                    // InternalFormalML.g:9300:2: ( '@init' )
+                    {
+                    // InternalFormalML.g:9300:2: ( '@init' )
+                    // InternalFormalML.g:9301:3: '@init'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeStartStateRoutinesAccess().getNameInitKeyword_1_0_0()); 
+                    }
+                    match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeStartStateRoutinesAccess().getNameInitKeyword_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9306:2: ( '@enable' )
+                    {
+                    // InternalFormalML.g:9306:2: ( '@enable' )
+                    // InternalFormalML.g:9307:3: '@enable'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeStartStateRoutinesAccess().getNameEnableKeyword_1_0_1()); 
+                    }
+                    match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeStartStateRoutinesAccess().getNameEnableKeyword_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:9312:2: ( '@disable' )
+                    {
+                    // InternalFormalML.g:9312:2: ( '@disable' )
+                    // InternalFormalML.g:9313:3: '@disable'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeStartStateRoutinesAccess().getNameDisableKeyword_1_0_2()); 
+                    }
+                    match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeStartStateRoutinesAccess().getNameDisableKeyword_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:9318:2: ( '@irun' )
+                    {
+                    // InternalFormalML.g:9318:2: ( '@irun' )
+                    // InternalFormalML.g:9319:3: '@irun'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeStartStateRoutinesAccess().getNameIrunKeyword_1_0_3()); 
+                    }
+                    match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeStartStateRoutinesAccess().getNameIrunKeyword_1_0_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeStartStateRoutines__NameAlternatives_1_0"
+
+
+    // $ANTLR start "rule__FinalState__Alternatives_1"
+    // InternalFormalML.g:9328:1: rule__FinalState__Alternatives_1 : ( ( ( rule__FinalState__Group_1_0__0 ) ) | ( ( rule__FinalState__SimpleAssignment_1_1 ) ) );
+    public final void rule__FinalState__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9332:1: ( ( ( rule__FinalState__Group_1_0__0 ) ) | ( ( rule__FinalState__SimpleAssignment_1_1 ) ) )
+            int alt124=2;
+            int LA124_0 = input.LA(1);
+
+            if ( (LA124_0==54) ) {
+                alt124=1;
+            }
+            else if ( (LA124_0==276) ) {
+                alt124=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 124, 0, input);
+
+                throw nvae;
+            }
+            switch (alt124) {
+                case 1 :
+                    // InternalFormalML.g:9333:2: ( ( rule__FinalState__Group_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:9333:2: ( ( rule__FinalState__Group_1_0__0 ) )
+                    // InternalFormalML.g:9334:3: ( rule__FinalState__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getFinalStateAccess().getGroup_1_0()); 
+                    }
+                    // InternalFormalML.g:9335:3: ( rule__FinalState__Group_1_0__0 )
+                    // InternalFormalML.g:9335:4: rule__FinalState__Group_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__FinalState__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getFinalStateAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9339:2: ( ( rule__FinalState__SimpleAssignment_1_1 ) )
+                    {
+                    // InternalFormalML.g:9339:2: ( ( rule__FinalState__SimpleAssignment_1_1 ) )
+                    // InternalFormalML.g:9340:3: ( rule__FinalState__SimpleAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_1()); 
+                    }
+                    // InternalFormalML.g:9341:3: ( rule__FinalState__SimpleAssignment_1_1 )
+                    // InternalFormalML.g:9341:4: rule__FinalState__SimpleAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__FinalState__SimpleAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Alternatives_1"
+
+
+    // $ANTLR start "rule__FinalState__Alternatives_3"
+    // InternalFormalML.g:9349:1: rule__FinalState__Alternatives_3 : ( ( ( rule__FinalState__Group_3_0__0 ) ) | ( ';' ) );
+    public final void rule__FinalState__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9353:1: ( ( ( rule__FinalState__Group_3_0__0 ) ) | ( ';' ) )
+            int alt125=2;
+            int LA125_0 = input.LA(1);
+
+            if ( (LA125_0==199) ) {
+                alt125=1;
+            }
+            else if ( (LA125_0==45) ) {
+                alt125=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 125, 0, input);
+
+                throw nvae;
+            }
+            switch (alt125) {
+                case 1 :
+                    // InternalFormalML.g:9354:2: ( ( rule__FinalState__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:9354:2: ( ( rule__FinalState__Group_3_0__0 ) )
+                    // InternalFormalML.g:9355:3: ( rule__FinalState__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getFinalStateAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:9356:3: ( rule__FinalState__Group_3_0__0 )
+                    // InternalFormalML.g:9356:4: rule__FinalState__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__FinalState__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getFinalStateAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9360:2: ( ';' )
+                    {
+                    // InternalFormalML.g:9360:2: ( ';' )
+                    // InternalFormalML.g:9361:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getFinalStateAccess().getSemicolonKeyword_3_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getFinalStateAccess().getSemicolonKeyword_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Alternatives_3"
+
+
+    // $ANTLR start "rule__MoeFinalStateRoutines__NameAlternatives_1_0"
+    // InternalFormalML.g:9370:1: rule__MoeFinalStateRoutines__NameAlternatives_1_0 : ( ( '@enable' ) | ( '@final' ) );
+    public final void rule__MoeFinalStateRoutines__NameAlternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9374:1: ( ( '@enable' ) | ( '@final' ) )
+            int alt126=2;
+            int LA126_0 = input.LA(1);
+
+            if ( (LA126_0==48) ) {
+                alt126=1;
+            }
+            else if ( (LA126_0==47) ) {
+                alt126=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 126, 0, input);
+
+                throw nvae;
+            }
+            switch (alt126) {
+                case 1 :
+                    // InternalFormalML.g:9375:2: ( '@enable' )
+                    {
+                    // InternalFormalML.g:9375:2: ( '@enable' )
+                    // InternalFormalML.g:9376:3: '@enable'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeFinalStateRoutinesAccess().getNameEnableKeyword_1_0_0()); 
+                    }
+                    match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeFinalStateRoutinesAccess().getNameEnableKeyword_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9381:2: ( '@final' )
+                    {
+                    // InternalFormalML.g:9381:2: ( '@final' )
+                    // InternalFormalML.g:9382:3: '@final'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeFinalStateRoutinesAccess().getNameFinalKeyword_1_0_1()); 
+                    }
+                    match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeFinalStateRoutinesAccess().getNameFinalKeyword_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeFinalStateRoutines__NameAlternatives_1_0"
+
+
+    // $ANTLR start "rule__Pseudostate__Alternatives"
+    // InternalFormalML.g:9391:1: rule__Pseudostate__Alternatives : ( ( rulePseudostateInitial ) | ( ruleEndingPseudostate ) | ( ruleOtherPseudostate ) );
+    public final void rule__Pseudostate__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9395:1: ( ( rulePseudostateInitial ) | ( ruleEndingPseudostate ) | ( ruleOtherPseudostate ) )
+            int alt127=3;
+            switch ( input.LA(1) ) {
+            case 54:
+                {
+                int LA127_1 = input.LA(2);
+
+                if ( (LA127_1==125) ) {
+                    switch ( input.LA(3) ) {
+                    case 201:
+                        {
+                        switch ( input.LA(4) ) {
+                        case 148:
+                        case 149:
+                        case 150:
+                        case 151:
+                        case 152:
+                        case 153:
+                        case 154:
+                        case 155:
+                            {
+                            alt127=3;
+                            }
+                            break;
+                        case 13:
+                            {
+                            alt127=1;
+                            }
+                            break;
+                        case 156:
+                        case 157:
+                            {
+                            alt127=2;
+                            }
+                            break;
+                        default:
+                            if (state.backtracking>0) {state.failed=true; return ;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 127, 5, input);
+
+                            throw nvae;
+                        }
+
+                        }
+                        break;
+                    case 156:
+                    case 157:
+                        {
+                        alt127=2;
+                        }
+                        break;
+                    case 148:
+                    case 149:
+                    case 150:
+                    case 151:
+                    case 152:
+                    case 153:
+                    case 154:
+                    case 155:
+                        {
+                        alt127=3;
+                        }
+                        break;
+                    case 13:
+                        {
+                        alt127=1;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 127, 4, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 127, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 55:
+                {
+                int LA127_2 = input.LA(2);
+
+                if ( (LA127_2==125) ) {
+                    switch ( input.LA(3) ) {
+                    case 201:
+                        {
+                        switch ( input.LA(4) ) {
+                        case 148:
+                        case 149:
+                        case 150:
+                        case 151:
+                        case 152:
+                        case 153:
+                        case 154:
+                        case 155:
+                            {
+                            alt127=3;
+                            }
+                            break;
+                        case 13:
+                            {
+                            alt127=1;
+                            }
+                            break;
+                        case 156:
+                        case 157:
+                            {
+                            alt127=2;
+                            }
+                            break;
+                        default:
+                            if (state.backtracking>0) {state.failed=true; return ;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 127, 5, input);
+
+                            throw nvae;
+                        }
+
+                        }
+                        break;
+                    case 156:
+                    case 157:
+                        {
+                        alt127=2;
+                        }
+                        break;
+                    case 148:
+                    case 149:
+                    case 150:
+                    case 151:
+                    case 152:
+                    case 153:
+                    case 154:
+                    case 155:
+                        {
+                        alt127=3;
+                        }
+                        break;
+                    case 13:
+                        {
+                        alt127=1;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 127, 4, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 127, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 56:
+            case 57:
+                {
+                alt127=1;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 127, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt127) {
+                case 1 :
+                    // InternalFormalML.g:9396:2: ( rulePseudostateInitial )
+                    {
+                    // InternalFormalML.g:9396:2: ( rulePseudostateInitial )
+                    // InternalFormalML.g:9397:3: rulePseudostateInitial
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateAccess().getPseudostateInitialParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePseudostateInitial();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateAccess().getPseudostateInitialParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9402:2: ( ruleEndingPseudostate )
+                    {
+                    // InternalFormalML.g:9402:2: ( ruleEndingPseudostate )
+                    // InternalFormalML.g:9403:3: ruleEndingPseudostate
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateAccess().getEndingPseudostateParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleEndingPseudostate();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateAccess().getEndingPseudostateParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:9408:2: ( ruleOtherPseudostate )
+                    {
+                    // InternalFormalML.g:9408:2: ( ruleOtherPseudostate )
+                    // InternalFormalML.g:9409:3: ruleOtherPseudostate
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateAccess().getOtherPseudostateParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleOtherPseudostate();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateAccess().getOtherPseudostateParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Pseudostate__Alternatives"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Alternatives_1"
+    // InternalFormalML.g:9418:1: rule__OtherPseudostate__Alternatives_1 : ( ( 'state' ) | ( 'pseudostate' ) );
+    public final void rule__OtherPseudostate__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9422:1: ( ( 'state' ) | ( 'pseudostate' ) )
+            int alt128=2;
+            int LA128_0 = input.LA(1);
+
+            if ( (LA128_0==54) ) {
+                alt128=1;
+            }
+            else if ( (LA128_0==55) ) {
+                alt128=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 128, 0, input);
+
+                throw nvae;
+            }
+            switch (alt128) {
+                case 1 :
+                    // InternalFormalML.g:9423:2: ( 'state' )
+                    {
+                    // InternalFormalML.g:9423:2: ( 'state' )
+                    // InternalFormalML.g:9424:3: 'state'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherPseudostateAccess().getStateKeyword_1_0()); 
+                    }
+                    match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherPseudostateAccess().getStateKeyword_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9429:2: ( 'pseudostate' )
+                    {
+                    // InternalFormalML.g:9429:2: ( 'pseudostate' )
+                    // InternalFormalML.g:9430:3: 'pseudostate'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherPseudostateAccess().getPseudostateKeyword_1_1()); 
+                    }
+                    match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherPseudostateAccess().getPseudostateKeyword_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Alternatives_1"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Alternatives_8"
+    // InternalFormalML.g:9439:1: rule__OtherPseudostate__Alternatives_8 : ( ( ( rule__OtherPseudostate__Group_8_0__0 ) ) | ( ';' ) );
+    public final void rule__OtherPseudostate__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9443:1: ( ( ( rule__OtherPseudostate__Group_8_0__0 ) ) | ( ';' ) )
+            int alt129=2;
+            int LA129_0 = input.LA(1);
+
+            if ( (LA129_0==199) ) {
+                alt129=1;
+            }
+            else if ( (LA129_0==45) ) {
+                alt129=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 129, 0, input);
+
+                throw nvae;
+            }
+            switch (alt129) {
+                case 1 :
+                    // InternalFormalML.g:9444:2: ( ( rule__OtherPseudostate__Group_8_0__0 ) )
+                    {
+                    // InternalFormalML.g:9444:2: ( ( rule__OtherPseudostate__Group_8_0__0 ) )
+                    // InternalFormalML.g:9445:3: ( rule__OtherPseudostate__Group_8_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherPseudostateAccess().getGroup_8_0()); 
+                    }
+                    // InternalFormalML.g:9446:3: ( rule__OtherPseudostate__Group_8_0__0 )
+                    // InternalFormalML.g:9446:4: rule__OtherPseudostate__Group_8_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherPseudostate__Group_8_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherPseudostateAccess().getGroup_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9450:2: ( ';' )
+                    {
+                    // InternalFormalML.g:9450:2: ( ';' )
+                    // InternalFormalML.g:9451:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherPseudostateAccess().getSemicolonKeyword_8_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherPseudostateAccess().getSemicolonKeyword_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Alternatives_8"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Alternatives_1"
+    // InternalFormalML.g:9460:1: rule__PseudostateInitial__Alternatives_1 : ( ( ( rule__PseudostateInitial__Group_1_0__0 ) ) | ( ( rule__PseudostateInitial__NameAssignment_1_1 ) ) );
+    public final void rule__PseudostateInitial__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9464:1: ( ( ( rule__PseudostateInitial__Group_1_0__0 ) ) | ( ( rule__PseudostateInitial__NameAssignment_1_1 ) ) )
+            int alt130=2;
+            int LA130_0 = input.LA(1);
+
+            if ( ((LA130_0>=54 && LA130_0<=55)) ) {
+                alt130=1;
+            }
+            else if ( ((LA130_0>=56 && LA130_0<=57)) ) {
+                alt130=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 130, 0, input);
+
+                throw nvae;
+            }
+            switch (alt130) {
+                case 1 :
+                    // InternalFormalML.g:9465:2: ( ( rule__PseudostateInitial__Group_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:9465:2: ( ( rule__PseudostateInitial__Group_1_0__0 ) )
+                    // InternalFormalML.g:9466:3: ( rule__PseudostateInitial__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getGroup_1_0()); 
+                    }
+                    // InternalFormalML.g:9467:3: ( rule__PseudostateInitial__Group_1_0__0 )
+                    // InternalFormalML.g:9467:4: rule__PseudostateInitial__Group_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PseudostateInitial__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9471:2: ( ( rule__PseudostateInitial__NameAssignment_1_1 ) )
+                    {
+                    // InternalFormalML.g:9471:2: ( ( rule__PseudostateInitial__NameAssignment_1_1 ) )
+                    // InternalFormalML.g:9472:3: ( rule__PseudostateInitial__NameAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_1()); 
+                    }
+                    // InternalFormalML.g:9473:3: ( rule__PseudostateInitial__NameAssignment_1_1 )
+                    // InternalFormalML.g:9473:4: rule__PseudostateInitial__NameAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PseudostateInitial__NameAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Alternatives_1"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Alternatives_1_0_0"
+    // InternalFormalML.g:9481:1: rule__PseudostateInitial__Alternatives_1_0_0 : ( ( 'state' ) | ( 'pseudostate' ) );
+    public final void rule__PseudostateInitial__Alternatives_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9485:1: ( ( 'state' ) | ( 'pseudostate' ) )
+            int alt131=2;
+            int LA131_0 = input.LA(1);
+
+            if ( (LA131_0==54) ) {
+                alt131=1;
+            }
+            else if ( (LA131_0==55) ) {
+                alt131=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 131, 0, input);
+
+                throw nvae;
+            }
+            switch (alt131) {
+                case 1 :
+                    // InternalFormalML.g:9486:2: ( 'state' )
+                    {
+                    // InternalFormalML.g:9486:2: ( 'state' )
+                    // InternalFormalML.g:9487:3: 'state'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getStateKeyword_1_0_0_0()); 
+                    }
+                    match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getStateKeyword_1_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9492:2: ( 'pseudostate' )
+                    {
+                    // InternalFormalML.g:9492:2: ( 'pseudostate' )
+                    // InternalFormalML.g:9493:3: 'pseudostate'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getPseudostateKeyword_1_0_0_1()); 
+                    }
+                    match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getPseudostateKeyword_1_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Alternatives_1_0_0"
+
+
+    // $ANTLR start "rule__PseudostateInitial__NameAlternatives_1_0_5_0"
+    // InternalFormalML.g:9502:1: rule__PseudostateInitial__NameAlternatives_1_0_5_0 : ( ( ruleESIdentifier ) | ( '#initial' ) | ( '#init' ) );
+    public final void rule__PseudostateInitial__NameAlternatives_1_0_5_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9506:1: ( ( ruleESIdentifier ) | ( '#initial' ) | ( '#init' ) )
+            int alt132=3;
+            switch ( input.LA(1) ) {
+            case RULE_XLIA_ID:
+                {
+                alt132=1;
+                }
+                break;
+            case 56:
+                {
+                alt132=2;
+                }
+                break;
+            case 57:
+                {
+                alt132=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 132, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt132) {
+                case 1 :
+                    // InternalFormalML.g:9507:2: ( ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:9507:2: ( ruleESIdentifier )
+                    // InternalFormalML.g:9508:3: ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getNameESIdentifierParserRuleCall_1_0_5_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getNameESIdentifierParserRuleCall_1_0_5_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9513:2: ( '#initial' )
+                    {
+                    // InternalFormalML.g:9513:2: ( '#initial' )
+                    // InternalFormalML.g:9514:3: '#initial'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_0_5_0_1()); 
+                    }
+                    match(input,56,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_0_5_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:9519:2: ( '#init' )
+                    {
+                    // InternalFormalML.g:9519:2: ( '#init' )
+                    // InternalFormalML.g:9520:3: '#init'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_0_5_0_2()); 
+                    }
+                    match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_0_5_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__NameAlternatives_1_0_5_0"
+
+
+    // $ANTLR start "rule__PseudostateInitial__NameAlternatives_1_1_0"
+    // InternalFormalML.g:9529:1: rule__PseudostateInitial__NameAlternatives_1_1_0 : ( ( '#initial' ) | ( '#init' ) );
+    public final void rule__PseudostateInitial__NameAlternatives_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9533:1: ( ( '#initial' ) | ( '#init' ) )
+            int alt133=2;
+            int LA133_0 = input.LA(1);
+
+            if ( (LA133_0==56) ) {
+                alt133=1;
+            }
+            else if ( (LA133_0==57) ) {
+                alt133=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 133, 0, input);
+
+                throw nvae;
+            }
+            switch (alt133) {
+                case 1 :
+                    // InternalFormalML.g:9534:2: ( '#initial' )
+                    {
+                    // InternalFormalML.g:9534:2: ( '#initial' )
+                    // InternalFormalML.g:9535:3: '#initial'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_1_0_0()); 
+                    }
+                    match(input,56,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9540:2: ( '#init' )
+                    {
+                    // InternalFormalML.g:9540:2: ( '#init' )
+                    // InternalFormalML.g:9541:3: '#init'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_1_0_1()); 
+                    }
+                    match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__NameAlternatives_1_1_0"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Alternatives_3"
+    // InternalFormalML.g:9550:1: rule__PseudostateInitial__Alternatives_3 : ( ( ( rule__PseudostateInitial__Group_3_0__0 ) ) | ( ';' ) );
+    public final void rule__PseudostateInitial__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9554:1: ( ( ( rule__PseudostateInitial__Group_3_0__0 ) ) | ( ';' ) )
+            int alt134=2;
+            int LA134_0 = input.LA(1);
+
+            if ( (LA134_0==199) ) {
+                alt134=1;
+            }
+            else if ( (LA134_0==45) ) {
+                alt134=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 134, 0, input);
+
+                throw nvae;
+            }
+            switch (alt134) {
+                case 1 :
+                    // InternalFormalML.g:9555:2: ( ( rule__PseudostateInitial__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:9555:2: ( ( rule__PseudostateInitial__Group_3_0__0 ) )
+                    // InternalFormalML.g:9556:3: ( rule__PseudostateInitial__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:9557:3: ( rule__PseudostateInitial__Group_3_0__0 )
+                    // InternalFormalML.g:9557:4: rule__PseudostateInitial__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PseudostateInitial__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9561:2: ( ';' )
+                    {
+                    // InternalFormalML.g:9561:2: ( ';' )
+                    // InternalFormalML.g:9562:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateInitialAccess().getSemicolonKeyword_3_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateInitialAccess().getSemicolonKeyword_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Alternatives_3"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Alternatives_1"
+    // InternalFormalML.g:9571:1: rule__EndingPseudostate__Alternatives_1 : ( ( 'state' ) | ( 'pseudostate' ) );
+    public final void rule__EndingPseudostate__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9575:1: ( ( 'state' ) | ( 'pseudostate' ) )
+            int alt135=2;
+            int LA135_0 = input.LA(1);
+
+            if ( (LA135_0==54) ) {
+                alt135=1;
+            }
+            else if ( (LA135_0==55) ) {
+                alt135=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 135, 0, input);
+
+                throw nvae;
+            }
+            switch (alt135) {
+                case 1 :
+                    // InternalFormalML.g:9576:2: ( 'state' )
+                    {
+                    // InternalFormalML.g:9576:2: ( 'state' )
+                    // InternalFormalML.g:9577:3: 'state'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEndingPseudostateAccess().getStateKeyword_1_0()); 
+                    }
+                    match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEndingPseudostateAccess().getStateKeyword_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9582:2: ( 'pseudostate' )
+                    {
+                    // InternalFormalML.g:9582:2: ( 'pseudostate' )
+                    // InternalFormalML.g:9583:3: 'pseudostate'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEndingPseudostateAccess().getPseudostateKeyword_1_1()); 
+                    }
+                    match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEndingPseudostateAccess().getPseudostateKeyword_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Alternatives_1"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Alternatives_8"
+    // InternalFormalML.g:9592:1: rule__EndingPseudostate__Alternatives_8 : ( ( ( rule__EndingPseudostate__Group_8_0__0 ) ) | ( ';' ) );
+    public final void rule__EndingPseudostate__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9596:1: ( ( ( rule__EndingPseudostate__Group_8_0__0 ) ) | ( ';' ) )
+            int alt136=2;
+            int LA136_0 = input.LA(1);
+
+            if ( (LA136_0==199) ) {
+                alt136=1;
+            }
+            else if ( (LA136_0==45) ) {
+                alt136=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 136, 0, input);
+
+                throw nvae;
+            }
+            switch (alt136) {
+                case 1 :
+                    // InternalFormalML.g:9597:2: ( ( rule__EndingPseudostate__Group_8_0__0 ) )
+                    {
+                    // InternalFormalML.g:9597:2: ( ( rule__EndingPseudostate__Group_8_0__0 ) )
+                    // InternalFormalML.g:9598:3: ( rule__EndingPseudostate__Group_8_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEndingPseudostateAccess().getGroup_8_0()); 
+                    }
+                    // InternalFormalML.g:9599:3: ( rule__EndingPseudostate__Group_8_0__0 )
+                    // InternalFormalML.g:9599:4: rule__EndingPseudostate__Group_8_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__EndingPseudostate__Group_8_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEndingPseudostateAccess().getGroup_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9603:2: ( ';' )
+                    {
+                    // InternalFormalML.g:9603:2: ( ';' )
+                    // InternalFormalML.g:9604:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEndingPseudostateAccess().getSemicolonKeyword_8_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEndingPseudostateAccess().getSemicolonKeyword_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Alternatives_8"
+
+
+    // $ANTLR start "rule__MoeRoutine__Alternatives_2_1"
+    // InternalFormalML.g:9613:1: rule__MoeRoutine__Alternatives_2_1 : ( ( ( rule__MoeRoutine__Group_2_1_0__0 ) ) | ( ( rule__MoeRoutine__CodomainAssignment_2_1_1 ) ) );
+    public final void rule__MoeRoutine__Alternatives_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9617:1: ( ( ( rule__MoeRoutine__Group_2_1_0__0 ) ) | ( ( rule__MoeRoutine__CodomainAssignment_2_1_1 ) ) )
+            int alt137=2;
+            int LA137_0 = input.LA(1);
+
+            if ( (LA137_0==23) ) {
+                alt137=1;
+            }
+            else if ( (LA137_0==RULE_XLIA_ID||LA137_0==15||(LA137_0>=17 && LA137_0<=18)||LA137_0==39||(LA137_0>=59 && LA137_0<=74)||(LA137_0>=129 && LA137_0<=132)||LA137_0==149||LA137_0==157||(LA137_0>=163 && LA137_0<=174)||(LA137_0>=231 && LA137_0<=237)||LA137_0==277) ) {
+                alt137=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 137, 0, input);
+
+                throw nvae;
+            }
+            switch (alt137) {
+                case 1 :
+                    // InternalFormalML.g:9618:2: ( ( rule__MoeRoutine__Group_2_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:9618:2: ( ( rule__MoeRoutine__Group_2_1_0__0 ) )
+                    // InternalFormalML.g:9619:3: ( rule__MoeRoutine__Group_2_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeRoutineAccess().getGroup_2_1_0()); 
+                    }
+                    // InternalFormalML.g:9620:3: ( rule__MoeRoutine__Group_2_1_0__0 )
+                    // InternalFormalML.g:9620:4: rule__MoeRoutine__Group_2_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeRoutine__Group_2_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeRoutineAccess().getGroup_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9624:2: ( ( rule__MoeRoutine__CodomainAssignment_2_1_1 ) )
+                    {
+                    // InternalFormalML.g:9624:2: ( ( rule__MoeRoutine__CodomainAssignment_2_1_1 ) )
+                    // InternalFormalML.g:9625:3: ( rule__MoeRoutine__CodomainAssignment_2_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_1()); 
+                    }
+                    // InternalFormalML.g:9626:3: ( rule__MoeRoutine__CodomainAssignment_2_1_1 )
+                    // InternalFormalML.g:9626:4: rule__MoeRoutine__CodomainAssignment_2_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeRoutine__CodomainAssignment_2_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Alternatives_2_1"
+
+
+    // $ANTLR start "rule__Routine__Alternatives_6_1"
+    // InternalFormalML.g:9634:1: rule__Routine__Alternatives_6_1 : ( ( ( rule__Routine__Group_6_1_0__0 ) ) | ( ( rule__Routine__CodomainAssignment_6_1_1 ) ) );
+    public final void rule__Routine__Alternatives_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9638:1: ( ( ( rule__Routine__Group_6_1_0__0 ) ) | ( ( rule__Routine__CodomainAssignment_6_1_1 ) ) )
+            int alt138=2;
+            int LA138_0 = input.LA(1);
+
+            if ( (LA138_0==23) ) {
+                alt138=1;
+            }
+            else if ( (LA138_0==RULE_XLIA_ID||LA138_0==15||(LA138_0>=17 && LA138_0<=18)||LA138_0==39||(LA138_0>=59 && LA138_0<=74)||(LA138_0>=129 && LA138_0<=132)||LA138_0==149||LA138_0==157||(LA138_0>=163 && LA138_0<=174)||(LA138_0>=231 && LA138_0<=237)||LA138_0==277) ) {
+                alt138=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 138, 0, input);
+
+                throw nvae;
+            }
+            switch (alt138) {
+                case 1 :
+                    // InternalFormalML.g:9639:2: ( ( rule__Routine__Group_6_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:9639:2: ( ( rule__Routine__Group_6_1_0__0 ) )
+                    // InternalFormalML.g:9640:3: ( rule__Routine__Group_6_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRoutineAccess().getGroup_6_1_0()); 
+                    }
+                    // InternalFormalML.g:9641:3: ( rule__Routine__Group_6_1_0__0 )
+                    // InternalFormalML.g:9641:4: rule__Routine__Group_6_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Routine__Group_6_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRoutineAccess().getGroup_6_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9645:2: ( ( rule__Routine__CodomainAssignment_6_1_1 ) )
+                    {
+                    // InternalFormalML.g:9645:2: ( ( rule__Routine__CodomainAssignment_6_1_1 ) )
+                    // InternalFormalML.g:9646:3: ( rule__Routine__CodomainAssignment_6_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_1()); 
+                    }
+                    // InternalFormalML.g:9647:3: ( rule__Routine__CodomainAssignment_6_1_1 )
+                    // InternalFormalML.g:9647:4: rule__Routine__CodomainAssignment_6_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Routine__CodomainAssignment_6_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Alternatives_6_1"
+
+
+    // $ANTLR start "rule__ModelOfInteraction__Alternatives_2"
+    // InternalFormalML.g:9655:1: rule__ModelOfInteraction__Alternatives_2 : ( ( ( rule__ModelOfInteraction__RoutesAssignment_2_0 ) ) | ( ( rule__ModelOfInteraction__ConnectionsAssignment_2_1 ) ) );
+    public final void rule__ModelOfInteraction__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9659:1: ( ( ( rule__ModelOfInteraction__RoutesAssignment_2_0 ) ) | ( ( rule__ModelOfInteraction__ConnectionsAssignment_2_1 ) ) )
+            int alt139=2;
+            int LA139_0 = input.LA(1);
+
+            if ( (LA139_0==227) ) {
+                alt139=1;
+            }
+            else if ( (LA139_0==228) ) {
+                alt139=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 139, 0, input);
+
+                throw nvae;
+            }
+            switch (alt139) {
+                case 1 :
+                    // InternalFormalML.g:9660:2: ( ( rule__ModelOfInteraction__RoutesAssignment_2_0 ) )
+                    {
+                    // InternalFormalML.g:9660:2: ( ( rule__ModelOfInteraction__RoutesAssignment_2_0 ) )
+                    // InternalFormalML.g:9661:3: ( rule__ModelOfInteraction__RoutesAssignment_2_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfInteractionAccess().getRoutesAssignment_2_0()); 
+                    }
+                    // InternalFormalML.g:9662:3: ( rule__ModelOfInteraction__RoutesAssignment_2_0 )
+                    // InternalFormalML.g:9662:4: rule__ModelOfInteraction__RoutesAssignment_2_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfInteraction__RoutesAssignment_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfInteractionAccess().getRoutesAssignment_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9666:2: ( ( rule__ModelOfInteraction__ConnectionsAssignment_2_1 ) )
+                    {
+                    // InternalFormalML.g:9666:2: ( ( rule__ModelOfInteraction__ConnectionsAssignment_2_1 ) )
+                    // InternalFormalML.g:9667:3: ( rule__ModelOfInteraction__ConnectionsAssignment_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfInteractionAccess().getConnectionsAssignment_2_1()); 
+                    }
+                    // InternalFormalML.g:9668:3: ( rule__ModelOfInteraction__ConnectionsAssignment_2_1 )
+                    // InternalFormalML.g:9668:4: rule__ModelOfInteraction__ConnectionsAssignment_2_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfInteraction__ConnectionsAssignment_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfInteractionAccess().getConnectionsAssignment_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfInteraction__Alternatives_2"
+
+
+    // $ANTLR start "rule__Route__Alternatives_7"
+    // InternalFormalML.g:9676:1: rule__Route__Alternatives_7 : ( ( '*' ) | ( ( rule__Route__Group_7_1__0 ) ) );
+    public final void rule__Route__Alternatives_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9680:1: ( ( '*' ) | ( ( rule__Route__Group_7_1__0 ) ) )
+            int alt140=2;
+            int LA140_0 = input.LA(1);
+
+            if ( (LA140_0==58) ) {
+                alt140=1;
+            }
+            else if ( (LA140_0==RULE_XLIA_ID) ) {
+                alt140=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 140, 0, input);
+
+                throw nvae;
+            }
+            switch (alt140) {
+                case 1 :
+                    // InternalFormalML.g:9681:2: ( '*' )
+                    {
+                    // InternalFormalML.g:9681:2: ( '*' )
+                    // InternalFormalML.g:9682:3: '*'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRouteAccess().getAsteriskKeyword_7_0()); 
+                    }
+                    match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRouteAccess().getAsteriskKeyword_7_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9687:2: ( ( rule__Route__Group_7_1__0 ) )
+                    {
+                    // InternalFormalML.g:9687:2: ( ( rule__Route__Group_7_1__0 ) )
+                    // InternalFormalML.g:9688:3: ( rule__Route__Group_7_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRouteAccess().getGroup_7_1()); 
+                    }
+                    // InternalFormalML.g:9689:3: ( rule__Route__Group_7_1__0 )
+                    // InternalFormalML.g:9689:4: rule__Route__Group_7_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Route__Group_7_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRouteAccess().getGroup_7_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Alternatives_7"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Alternatives"
+    // InternalFormalML.g:9697:1: rule__ComRouteProtocol__Alternatives : ( ( ( rule__ComRouteProtocol__ProtocolAssignment_0 ) ) | ( ( rule__ComRouteProtocol__Group_1__0 ) ) | ( ( rule__ComRouteProtocol__Inner_bufferAssignment_2 ) ) | ( ( rule__ComRouteProtocol__Ref_bufferAssignment_3 ) ) );
+    public final void rule__ComRouteProtocol__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9701:1: ( ( ( rule__ComRouteProtocol__ProtocolAssignment_0 ) ) | ( ( rule__ComRouteProtocol__Group_1__0 ) ) | ( ( rule__ComRouteProtocol__Inner_bufferAssignment_2 ) ) | ( ( rule__ComRouteProtocol__Ref_bufferAssignment_3 ) ) )
+            int alt141=4;
+            switch ( input.LA(1) ) {
+            case 14:
+            case 142:
+            case 158:
+                {
+                alt141=1;
+                }
+                break;
+            case 15:
+                {
+                alt141=2;
+                }
+                break;
+            case 168:
+            case 169:
+            case 170:
+            case 171:
+                {
+                alt141=3;
+                }
+                break;
+            case RULE_XLIA_ID:
+                {
+                alt141=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 141, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt141) {
+                case 1 :
+                    // InternalFormalML.g:9702:2: ( ( rule__ComRouteProtocol__ProtocolAssignment_0 ) )
+                    {
+                    // InternalFormalML.g:9702:2: ( ( rule__ComRouteProtocol__ProtocolAssignment_0 ) )
+                    // InternalFormalML.g:9703:3: ( rule__ComRouteProtocol__ProtocolAssignment_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_0()); 
+                    }
+                    // InternalFormalML.g:9704:3: ( rule__ComRouteProtocol__ProtocolAssignment_0 )
+                    // InternalFormalML.g:9704:4: rule__ComRouteProtocol__ProtocolAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__ProtocolAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9708:2: ( ( rule__ComRouteProtocol__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:9708:2: ( ( rule__ComRouteProtocol__Group_1__0 ) )
+                    // InternalFormalML.g:9709:3: ( rule__ComRouteProtocol__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:9710:3: ( rule__ComRouteProtocol__Group_1__0 )
+                    // InternalFormalML.g:9710:4: rule__ComRouteProtocol__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:9714:2: ( ( rule__ComRouteProtocol__Inner_bufferAssignment_2 ) )
+                    {
+                    // InternalFormalML.g:9714:2: ( ( rule__ComRouteProtocol__Inner_bufferAssignment_2 ) )
+                    // InternalFormalML.g:9715:3: ( rule__ComRouteProtocol__Inner_bufferAssignment_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_2()); 
+                    }
+                    // InternalFormalML.g:9716:3: ( rule__ComRouteProtocol__Inner_bufferAssignment_2 )
+                    // InternalFormalML.g:9716:4: rule__ComRouteProtocol__Inner_bufferAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Inner_bufferAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:9720:2: ( ( rule__ComRouteProtocol__Ref_bufferAssignment_3 ) )
+                    {
+                    // InternalFormalML.g:9720:2: ( ( rule__ComRouteProtocol__Ref_bufferAssignment_3 ) )
+                    // InternalFormalML.g:9721:3: ( rule__ComRouteProtocol__Ref_bufferAssignment_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_3()); 
+                    }
+                    // InternalFormalML.g:9722:3: ( rule__ComRouteProtocol__Ref_bufferAssignment_3 )
+                    // InternalFormalML.g:9722:4: rule__ComRouteProtocol__Ref_bufferAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Ref_bufferAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Alternatives"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Alternatives_1_1"
+    // InternalFormalML.g:9730:1: rule__ComRouteProtocol__Alternatives_1_1 : ( ( ( rule__ComRouteProtocol__Group_1_1_0__0 ) ) | ( ( rule__ComRouteProtocol__Group_1_1_1__0 ) ) );
+    public final void rule__ComRouteProtocol__Alternatives_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9734:1: ( ( ( rule__ComRouteProtocol__Group_1_1_0__0 ) ) | ( ( rule__ComRouteProtocol__Group_1_1_1__0 ) ) )
+            int alt142=2;
+            int LA142_0 = input.LA(1);
+
+            if ( (LA142_0==31) ) {
+                alt142=1;
+            }
+            else if ( (LA142_0==125) ) {
+                alt142=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 142, 0, input);
+
+                throw nvae;
+            }
+            switch (alt142) {
+                case 1 :
+                    // InternalFormalML.g:9735:2: ( ( rule__ComRouteProtocol__Group_1_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:9735:2: ( ( rule__ComRouteProtocol__Group_1_1_0__0 ) )
+                    // InternalFormalML.g:9736:3: ( rule__ComRouteProtocol__Group_1_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_0()); 
+                    }
+                    // InternalFormalML.g:9737:3: ( rule__ComRouteProtocol__Group_1_1_0__0 )
+                    // InternalFormalML.g:9737:4: rule__ComRouteProtocol__Group_1_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Group_1_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9741:2: ( ( rule__ComRouteProtocol__Group_1_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:9741:2: ( ( rule__ComRouteProtocol__Group_1_1_1__0 ) )
+                    // InternalFormalML.g:9742:3: ( rule__ComRouteProtocol__Group_1_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_1()); 
+                    }
+                    // InternalFormalML.g:9743:3: ( rule__ComRouteProtocol__Group_1_1_1__0 )
+                    // InternalFormalML.g:9743:4: rule__ComRouteProtocol__Group_1_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Group_1_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getGroup_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Alternatives_1_1"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Alternatives_1_1_0_1"
+    // InternalFormalML.g:9751:1: rule__ComRouteProtocol__Alternatives_1_1_0_1 : ( ( ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0 ) ) | ( ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1 ) ) );
+    public final void rule__ComRouteProtocol__Alternatives_1_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9755:1: ( ( ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0 ) ) | ( ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1 ) ) )
+            int alt143=2;
+            int LA143_0 = input.LA(1);
+
+            if ( ((LA143_0>=168 && LA143_0<=171)) ) {
+                alt143=1;
+            }
+            else if ( (LA143_0==RULE_XLIA_ID) ) {
+                alt143=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 143, 0, input);
+
+                throw nvae;
+            }
+            switch (alt143) {
+                case 1 :
+                    // InternalFormalML.g:9756:2: ( ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:9756:2: ( ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0 ) )
+                    // InternalFormalML.g:9757:3: ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:9758:3: ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0 )
+                    // InternalFormalML.g:9758:4: rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9762:2: ( ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:9762:2: ( ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1 ) )
+                    // InternalFormalML.g:9763:3: ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_0_1_1()); 
+                    }
+                    // InternalFormalML.g:9764:3: ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1 )
+                    // InternalFormalML.g:9764:4: rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Alternatives_1_1_0_1"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Alternatives_1_1_1_1"
+    // InternalFormalML.g:9772:1: rule__ComRouteProtocol__Alternatives_1_1_1_1 : ( ( ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0 ) ) | ( ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1 ) ) );
+    public final void rule__ComRouteProtocol__Alternatives_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9776:1: ( ( ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0 ) ) | ( ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1 ) ) )
+            int alt144=2;
+            int LA144_0 = input.LA(1);
+
+            if ( ((LA144_0>=168 && LA144_0<=171)) ) {
+                alt144=1;
+            }
+            else if ( (LA144_0==RULE_XLIA_ID) ) {
+                alt144=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 144, 0, input);
+
+                throw nvae;
+            }
+            switch (alt144) {
+                case 1 :
+                    // InternalFormalML.g:9777:2: ( ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:9777:2: ( ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0 ) )
+                    // InternalFormalML.g:9778:3: ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_1_1_0()); 
+                    }
+                    // InternalFormalML.g:9779:3: ( rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0 )
+                    // InternalFormalML.g:9779:4: rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getInner_bufferAssignment_1_1_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9783:2: ( ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:9783:2: ( ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1 ) )
+                    // InternalFormalML.g:9784:3: ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_1_1_1()); 
+                    }
+                    // InternalFormalML.g:9785:3: ( rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1 )
+                    // InternalFormalML.g:9785:4: rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComRouteProtocolAccess().getRef_bufferAssignment_1_1_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Alternatives_1_1_1_1"
+
+
+    // $ANTLR start "rule__ComProtocol__Alternatives"
+    // InternalFormalML.g:9793:1: rule__ComProtocol__Alternatives : ( ( ( rule__ComProtocol__ProtocolAssignment_0 ) ) | ( ( rule__ComProtocol__Group_1__0 ) ) | ( ( rule__ComProtocol__Group_2__0 ) ) | ( ( rule__ComProtocol__Inner_bufferAssignment_3 ) ) | ( ( rule__ComProtocol__Ref_bufferAssignment_4 ) ) | ( ( rule__ComProtocol__CastAssignment_5 ) ) );
+    public final void rule__ComProtocol__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9797:1: ( ( ( rule__ComProtocol__ProtocolAssignment_0 ) ) | ( ( rule__ComProtocol__Group_1__0 ) ) | ( ( rule__ComProtocol__Group_2__0 ) ) | ( ( rule__ComProtocol__Inner_bufferAssignment_3 ) ) | ( ( rule__ComProtocol__Ref_bufferAssignment_4 ) ) | ( ( rule__ComProtocol__CastAssignment_5 ) ) )
+            int alt145=6;
+            switch ( input.LA(1) ) {
+            case 142:
+            case 158:
+                {
+                alt145=1;
+                }
+                break;
+            case 14:
+                {
+                alt145=2;
+                }
+                break;
+            case 15:
+                {
+                alt145=3;
+                }
+                break;
+            case 168:
+            case 169:
+            case 170:
+            case 171:
+                {
+                alt145=4;
+                }
+                break;
+            case RULE_XLIA_ID:
+                {
+                alt145=5;
+                }
+                break;
+            case 159:
+            case 160:
+            case 161:
+            case 162:
+                {
+                alt145=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 145, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt145) {
+                case 1 :
+                    // InternalFormalML.g:9798:2: ( ( rule__ComProtocol__ProtocolAssignment_0 ) )
+                    {
+                    // InternalFormalML.g:9798:2: ( ( rule__ComProtocol__ProtocolAssignment_0 ) )
+                    // InternalFormalML.g:9799:3: ( rule__ComProtocol__ProtocolAssignment_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getProtocolAssignment_0()); 
+                    }
+                    // InternalFormalML.g:9800:3: ( rule__ComProtocol__ProtocolAssignment_0 )
+                    // InternalFormalML.g:9800:4: rule__ComProtocol__ProtocolAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__ProtocolAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getProtocolAssignment_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9804:2: ( ( rule__ComProtocol__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:9804:2: ( ( rule__ComProtocol__Group_1__0 ) )
+                    // InternalFormalML.g:9805:3: ( rule__ComProtocol__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:9806:3: ( rule__ComProtocol__Group_1__0 )
+                    // InternalFormalML.g:9806:4: rule__ComProtocol__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:9810:2: ( ( rule__ComProtocol__Group_2__0 ) )
+                    {
+                    // InternalFormalML.g:9810:2: ( ( rule__ComProtocol__Group_2__0 ) )
+                    // InternalFormalML.g:9811:3: ( rule__ComProtocol__Group_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getGroup_2()); 
+                    }
+                    // InternalFormalML.g:9812:3: ( rule__ComProtocol__Group_2__0 )
+                    // InternalFormalML.g:9812:4: rule__ComProtocol__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getGroup_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:9816:2: ( ( rule__ComProtocol__Inner_bufferAssignment_3 ) )
+                    {
+                    // InternalFormalML.g:9816:2: ( ( rule__ComProtocol__Inner_bufferAssignment_3 ) )
+                    // InternalFormalML.g:9817:3: ( rule__ComProtocol__Inner_bufferAssignment_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_3()); 
+                    }
+                    // InternalFormalML.g:9818:3: ( rule__ComProtocol__Inner_bufferAssignment_3 )
+                    // InternalFormalML.g:9818:4: rule__ComProtocol__Inner_bufferAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Inner_bufferAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:9822:2: ( ( rule__ComProtocol__Ref_bufferAssignment_4 ) )
+                    {
+                    // InternalFormalML.g:9822:2: ( ( rule__ComProtocol__Ref_bufferAssignment_4 ) )
+                    // InternalFormalML.g:9823:3: ( rule__ComProtocol__Ref_bufferAssignment_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_4()); 
+                    }
+                    // InternalFormalML.g:9824:3: ( rule__ComProtocol__Ref_bufferAssignment_4 )
+                    // InternalFormalML.g:9824:4: rule__ComProtocol__Ref_bufferAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Ref_bufferAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:9828:2: ( ( rule__ComProtocol__CastAssignment_5 ) )
+                    {
+                    // InternalFormalML.g:9828:2: ( ( rule__ComProtocol__CastAssignment_5 ) )
+                    // InternalFormalML.g:9829:3: ( rule__ComProtocol__CastAssignment_5 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getCastAssignment_5()); 
+                    }
+                    // InternalFormalML.g:9830:3: ( rule__ComProtocol__CastAssignment_5 )
+                    // InternalFormalML.g:9830:4: rule__ComProtocol__CastAssignment_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__CastAssignment_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getCastAssignment_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Alternatives"
+
+
+    // $ANTLR start "rule__ComProtocol__Alternatives_2_1"
+    // InternalFormalML.g:9838:1: rule__ComProtocol__Alternatives_2_1 : ( ( ( rule__ComProtocol__Group_2_1_0__0 ) ) | ( ( rule__ComProtocol__Group_2_1_1__0 ) ) );
+    public final void rule__ComProtocol__Alternatives_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9842:1: ( ( ( rule__ComProtocol__Group_2_1_0__0 ) ) | ( ( rule__ComProtocol__Group_2_1_1__0 ) ) )
+            int alt146=2;
+            int LA146_0 = input.LA(1);
+
+            if ( (LA146_0==31) ) {
+                alt146=1;
+            }
+            else if ( (LA146_0==125) ) {
+                alt146=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 146, 0, input);
+
+                throw nvae;
+            }
+            switch (alt146) {
+                case 1 :
+                    // InternalFormalML.g:9843:2: ( ( rule__ComProtocol__Group_2_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:9843:2: ( ( rule__ComProtocol__Group_2_1_0__0 ) )
+                    // InternalFormalML.g:9844:3: ( rule__ComProtocol__Group_2_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getGroup_2_1_0()); 
+                    }
+                    // InternalFormalML.g:9845:3: ( rule__ComProtocol__Group_2_1_0__0 )
+                    // InternalFormalML.g:9845:4: rule__ComProtocol__Group_2_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Group_2_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getGroup_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9849:2: ( ( rule__ComProtocol__Group_2_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:9849:2: ( ( rule__ComProtocol__Group_2_1_1__0 ) )
+                    // InternalFormalML.g:9850:3: ( rule__ComProtocol__Group_2_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getGroup_2_1_1()); 
+                    }
+                    // InternalFormalML.g:9851:3: ( rule__ComProtocol__Group_2_1_1__0 )
+                    // InternalFormalML.g:9851:4: rule__ComProtocol__Group_2_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Group_2_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getGroup_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Alternatives_2_1"
+
+
+    // $ANTLR start "rule__ComProtocol__Alternatives_2_1_0_1"
+    // InternalFormalML.g:9859:1: rule__ComProtocol__Alternatives_2_1_0_1 : ( ( ( rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0 ) ) | ( ( rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1 ) ) );
+    public final void rule__ComProtocol__Alternatives_2_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9863:1: ( ( ( rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0 ) ) | ( ( rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1 ) ) )
+            int alt147=2;
+            int LA147_0 = input.LA(1);
+
+            if ( ((LA147_0>=168 && LA147_0<=171)) ) {
+                alt147=1;
+            }
+            else if ( (LA147_0==RULE_XLIA_ID) ) {
+                alt147=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 147, 0, input);
+
+                throw nvae;
+            }
+            switch (alt147) {
+                case 1 :
+                    // InternalFormalML.g:9864:2: ( ( rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:9864:2: ( ( rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0 ) )
+                    // InternalFormalML.g:9865:3: ( rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:9866:3: ( rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0 )
+                    // InternalFormalML.g:9866:4: rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9870:2: ( ( rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:9870:2: ( ( rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1 ) )
+                    // InternalFormalML.g:9871:3: ( rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_0_1_1()); 
+                    }
+                    // InternalFormalML.g:9872:3: ( rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1 )
+                    // InternalFormalML.g:9872:4: rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Alternatives_2_1_0_1"
+
+
+    // $ANTLR start "rule__ComProtocol__Alternatives_2_1_1_1"
+    // InternalFormalML.g:9880:1: rule__ComProtocol__Alternatives_2_1_1_1 : ( ( ( rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0 ) ) | ( ( rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1 ) ) );
+    public final void rule__ComProtocol__Alternatives_2_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9884:1: ( ( ( rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0 ) ) | ( ( rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1 ) ) )
+            int alt148=2;
+            int LA148_0 = input.LA(1);
+
+            if ( ((LA148_0>=168 && LA148_0<=171)) ) {
+                alt148=1;
+            }
+            else if ( (LA148_0==RULE_XLIA_ID) ) {
+                alt148=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 148, 0, input);
+
+                throw nvae;
+            }
+            switch (alt148) {
+                case 1 :
+                    // InternalFormalML.g:9885:2: ( ( rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:9885:2: ( ( rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0 ) )
+                    // InternalFormalML.g:9886:3: ( rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_1_1_0()); 
+                    }
+                    // InternalFormalML.g:9887:3: ( rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0 )
+                    // InternalFormalML.g:9887:4: rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getInner_bufferAssignment_2_1_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9891:2: ( ( rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:9891:2: ( ( rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1 ) )
+                    // InternalFormalML.g:9892:3: ( rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_1_1_1()); 
+                    }
+                    // InternalFormalML.g:9893:3: ( rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1 )
+                    // InternalFormalML.g:9893:4: rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolAccess().getRef_bufferAssignment_2_1_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Alternatives_2_1_1_1"
+
+
+    // $ANTLR start "rule__ComPoint__Alternatives_3"
+    // InternalFormalML.g:9901:1: rule__ComPoint__Alternatives_3 : ( ( ( rule__ComPoint__Group_3_0__0 ) ) | ( ( rule__ComPoint__Group_3_1__0 ) ) );
+    public final void rule__ComPoint__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9905:1: ( ( ( rule__ComPoint__Group_3_0__0 ) ) | ( ( rule__ComPoint__Group_3_1__0 ) ) )
+            int alt149=2;
+            int LA149_0 = input.LA(1);
+
+            if ( (LA149_0==RULE_XLIA_ID||(LA149_0>=141 && LA149_0<=142)||(LA149_0>=267 && LA149_0<=271)) ) {
+                alt149=1;
+            }
+            else if ( (LA149_0==199) ) {
+                alt149=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 149, 0, input);
+
+                throw nvae;
+            }
+            switch (alt149) {
+                case 1 :
+                    // InternalFormalML.g:9906:2: ( ( rule__ComPoint__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:9906:2: ( ( rule__ComPoint__Group_3_0__0 ) )
+                    // InternalFormalML.g:9907:3: ( rule__ComPoint__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:9908:3: ( rule__ComPoint__Group_3_0__0 )
+                    // InternalFormalML.g:9908:4: rule__ComPoint__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPoint__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9912:2: ( ( rule__ComPoint__Group_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:9912:2: ( ( rule__ComPoint__Group_3_1__0 ) )
+                    // InternalFormalML.g:9913:3: ( rule__ComPoint__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:9914:3: ( rule__ComPoint__Group_3_1__0 )
+                    // InternalFormalML.g:9914:4: rule__ComPoint__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPoint__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Alternatives_3"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Alternatives"
+    // InternalFormalML.g:9922:1: rule__ComPointProtocol__Alternatives : ( ( ( rule__ComPointProtocol__Group_0__0 ) ) | ( ( rule__ComPointProtocol__Inner_bufferAssignment_1 ) ) | ( ( rule__ComPointProtocol__Ref_bufferAssignment_2 ) ) );
+    public final void rule__ComPointProtocol__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9926:1: ( ( ( rule__ComPointProtocol__Group_0__0 ) ) | ( ( rule__ComPointProtocol__Inner_bufferAssignment_1 ) ) | ( ( rule__ComPointProtocol__Ref_bufferAssignment_2 ) ) )
+            int alt150=3;
+            switch ( input.LA(1) ) {
+            case 15:
+                {
+                alt150=1;
+                }
+                break;
+            case 168:
+            case 169:
+            case 170:
+            case 171:
+                {
+                alt150=2;
+                }
+                break;
+            case RULE_XLIA_ID:
+                {
+                alt150=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 150, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt150) {
+                case 1 :
+                    // InternalFormalML.g:9927:2: ( ( rule__ComPointProtocol__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:9927:2: ( ( rule__ComPointProtocol__Group_0__0 ) )
+                    // InternalFormalML.g:9928:3: ( rule__ComPointProtocol__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointProtocolAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:9929:3: ( rule__ComPointProtocol__Group_0__0 )
+                    // InternalFormalML.g:9929:4: rule__ComPointProtocol__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointProtocolAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9933:2: ( ( rule__ComPointProtocol__Inner_bufferAssignment_1 ) )
+                    {
+                    // InternalFormalML.g:9933:2: ( ( rule__ComPointProtocol__Inner_bufferAssignment_1 ) )
+                    // InternalFormalML.g:9934:3: ( rule__ComPointProtocol__Inner_bufferAssignment_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_1()); 
+                    }
+                    // InternalFormalML.g:9935:3: ( rule__ComPointProtocol__Inner_bufferAssignment_1 )
+                    // InternalFormalML.g:9935:4: rule__ComPointProtocol__Inner_bufferAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Inner_bufferAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:9939:2: ( ( rule__ComPointProtocol__Ref_bufferAssignment_2 ) )
+                    {
+                    // InternalFormalML.g:9939:2: ( ( rule__ComPointProtocol__Ref_bufferAssignment_2 ) )
+                    // InternalFormalML.g:9940:3: ( rule__ComPointProtocol__Ref_bufferAssignment_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_2()); 
+                    }
+                    // InternalFormalML.g:9941:3: ( rule__ComPointProtocol__Ref_bufferAssignment_2 )
+                    // InternalFormalML.g:9941:4: rule__ComPointProtocol__Ref_bufferAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Ref_bufferAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Alternatives"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Alternatives_0_1"
+    // InternalFormalML.g:9949:1: rule__ComPointProtocol__Alternatives_0_1 : ( ( ( rule__ComPointProtocol__Group_0_1_0__0 ) ) | ( ( rule__ComPointProtocol__Group_0_1_1__0 ) ) );
+    public final void rule__ComPointProtocol__Alternatives_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9953:1: ( ( ( rule__ComPointProtocol__Group_0_1_0__0 ) ) | ( ( rule__ComPointProtocol__Group_0_1_1__0 ) ) )
+            int alt151=2;
+            int LA151_0 = input.LA(1);
+
+            if ( (LA151_0==31) ) {
+                alt151=1;
+            }
+            else if ( (LA151_0==125) ) {
+                alt151=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 151, 0, input);
+
+                throw nvae;
+            }
+            switch (alt151) {
+                case 1 :
+                    // InternalFormalML.g:9954:2: ( ( rule__ComPointProtocol__Group_0_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:9954:2: ( ( rule__ComPointProtocol__Group_0_1_0__0 ) )
+                    // InternalFormalML.g:9955:3: ( rule__ComPointProtocol__Group_0_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointProtocolAccess().getGroup_0_1_0()); 
+                    }
+                    // InternalFormalML.g:9956:3: ( rule__ComPointProtocol__Group_0_1_0__0 )
+                    // InternalFormalML.g:9956:4: rule__ComPointProtocol__Group_0_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Group_0_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointProtocolAccess().getGroup_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9960:2: ( ( rule__ComPointProtocol__Group_0_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:9960:2: ( ( rule__ComPointProtocol__Group_0_1_1__0 ) )
+                    // InternalFormalML.g:9961:3: ( rule__ComPointProtocol__Group_0_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointProtocolAccess().getGroup_0_1_1()); 
+                    }
+                    // InternalFormalML.g:9962:3: ( rule__ComPointProtocol__Group_0_1_1__0 )
+                    // InternalFormalML.g:9962:4: rule__ComPointProtocol__Group_0_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Group_0_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointProtocolAccess().getGroup_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Alternatives_0_1"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Alternatives_0_1_0_1"
+    // InternalFormalML.g:9970:1: rule__ComPointProtocol__Alternatives_0_1_0_1 : ( ( ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0 ) ) | ( ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1 ) ) );
+    public final void rule__ComPointProtocol__Alternatives_0_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9974:1: ( ( ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0 ) ) | ( ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1 ) ) )
+            int alt152=2;
+            int LA152_0 = input.LA(1);
+
+            if ( ((LA152_0>=168 && LA152_0<=171)) ) {
+                alt152=1;
+            }
+            else if ( (LA152_0==RULE_XLIA_ID) ) {
+                alt152=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 152, 0, input);
+
+                throw nvae;
+            }
+            switch (alt152) {
+                case 1 :
+                    // InternalFormalML.g:9975:2: ( ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:9975:2: ( ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0 ) )
+                    // InternalFormalML.g:9976:3: ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:9977:3: ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0 )
+                    // InternalFormalML.g:9977:4: rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9981:2: ( ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:9981:2: ( ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1 ) )
+                    // InternalFormalML.g:9982:3: ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_0_1_1()); 
+                    }
+                    // InternalFormalML.g:9983:3: ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1 )
+                    // InternalFormalML.g:9983:4: rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Alternatives_0_1_0_1"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Alternatives_0_1_1_1"
+    // InternalFormalML.g:9991:1: rule__ComPointProtocol__Alternatives_0_1_1_1 : ( ( ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0 ) ) | ( ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1 ) ) );
+    public final void rule__ComPointProtocol__Alternatives_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:9995:1: ( ( ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0 ) ) | ( ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1 ) ) )
+            int alt153=2;
+            int LA153_0 = input.LA(1);
+
+            if ( ((LA153_0>=168 && LA153_0<=171)) ) {
+                alt153=1;
+            }
+            else if ( (LA153_0==RULE_XLIA_ID) ) {
+                alt153=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 153, 0, input);
+
+                throw nvae;
+            }
+            switch (alt153) {
+                case 1 :
+                    // InternalFormalML.g:9996:2: ( ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:9996:2: ( ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0 ) )
+                    // InternalFormalML.g:9997:3: ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_1_1_0()); 
+                    }
+                    // InternalFormalML.g:9998:3: ( rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0 )
+                    // InternalFormalML.g:9998:4: rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointProtocolAccess().getInner_bufferAssignment_0_1_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10002:2: ( ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:10002:2: ( ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1 ) )
+                    // InternalFormalML.g:10003:3: ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_1_1_1()); 
+                    }
+                    // InternalFormalML.g:10004:3: ( rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1 )
+                    // InternalFormalML.g:10004:4: rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComPointProtocolAccess().getRef_bufferAssignment_0_1_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Alternatives_0_1_1_1"
+
+
+    // $ANTLR start "rule__ComElement__Alternatives"
+    // InternalFormalML.g:10012:1: rule__ComElement__Alternatives : ( ( ( rule__ComElement__Group_0__0 ) ) | ( ( rule__ComElement__Group_1__0 ) ) );
+    public final void rule__ComElement__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10016:1: ( ( ( rule__ComElement__Group_0__0 ) ) | ( ( rule__ComElement__Group_1__0 ) ) )
+            int alt154=2;
+            int LA154_0 = input.LA(1);
+
+            if ( (LA154_0==RULE_XLIA_ID) ) {
+                alt154=1;
+            }
+            else if ( ((LA154_0>=141 && LA154_0<=142)||(LA154_0>=267 && LA154_0<=271)) ) {
+                alt154=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 154, 0, input);
+
+                throw nvae;
+            }
+            switch (alt154) {
+                case 1 :
+                    // InternalFormalML.g:10017:2: ( ( rule__ComElement__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:10017:2: ( ( rule__ComElement__Group_0__0 ) )
+                    // InternalFormalML.g:10018:3: ( rule__ComElement__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComElementAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:10019:3: ( rule__ComElement__Group_0__0 )
+                    // InternalFormalML.g:10019:4: rule__ComElement__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComElement__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComElementAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10023:2: ( ( rule__ComElement__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:10023:2: ( ( rule__ComElement__Group_1__0 ) )
+                    // InternalFormalML.g:10024:3: ( rule__ComElement__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComElementAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:10025:3: ( rule__ComElement__Group_1__0 )
+                    // InternalFormalML.g:10025:4: rule__ComElement__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComElement__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComElementAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Alternatives"
+
+
+    // $ANTLR start "rule__ComElement__KindAlternatives_0_1_1_0"
+    // InternalFormalML.g:10033:1: rule__ComElement__KindAlternatives_0_1_1_0 : ( ( ruleValueDotFieldExpressionKind ) | ( ruleValueArrowFieldExpressionKind ) );
+    public final void rule__ComElement__KindAlternatives_0_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10037:1: ( ( ruleValueDotFieldExpressionKind ) | ( ruleValueArrowFieldExpressionKind ) )
+            int alt155=2;
+            int LA155_0 = input.LA(1);
+
+            if ( (LA155_0==20) ) {
+                alt155=1;
+            }
+            else if ( (LA155_0==21) ) {
+                alt155=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 155, 0, input);
+
+                throw nvae;
+            }
+            switch (alt155) {
+                case 1 :
+                    // InternalFormalML.g:10038:2: ( ruleValueDotFieldExpressionKind )
+                    {
+                    // InternalFormalML.g:10038:2: ( ruleValueDotFieldExpressionKind )
+                    // InternalFormalML.g:10039:3: ruleValueDotFieldExpressionKind
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_0_1_1_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleValueDotFieldExpressionKind();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_0_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10044:2: ( ruleValueArrowFieldExpressionKind )
+                    {
+                    // InternalFormalML.g:10044:2: ( ruleValueArrowFieldExpressionKind )
+                    // InternalFormalML.g:10045:3: ruleValueArrowFieldExpressionKind
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_0_1_1_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleValueArrowFieldExpressionKind();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_0_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__KindAlternatives_0_1_1_0"
+
+
+    // $ANTLR start "rule__ComElement__KindAlternatives_1_2_0"
+    // InternalFormalML.g:10054:1: rule__ComElement__KindAlternatives_1_2_0 : ( ( ruleValueDotFieldExpressionKind ) | ( ruleValueArrowFieldExpressionKind ) );
+    public final void rule__ComElement__KindAlternatives_1_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10058:1: ( ( ruleValueDotFieldExpressionKind ) | ( ruleValueArrowFieldExpressionKind ) )
+            int alt156=2;
+            int LA156_0 = input.LA(1);
+
+            if ( (LA156_0==20) ) {
+                alt156=1;
+            }
+            else if ( (LA156_0==21) ) {
+                alt156=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 156, 0, input);
+
+                throw nvae;
+            }
+            switch (alt156) {
+                case 1 :
+                    // InternalFormalML.g:10059:2: ( ruleValueDotFieldExpressionKind )
+                    {
+                    // InternalFormalML.g:10059:2: ( ruleValueDotFieldExpressionKind )
+                    // InternalFormalML.g:10060:3: ruleValueDotFieldExpressionKind
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_2_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleValueDotFieldExpressionKind();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_2_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10065:2: ( ruleValueArrowFieldExpressionKind )
+                    {
+                    // InternalFormalML.g:10065:2: ( ruleValueArrowFieldExpressionKind )
+                    // InternalFormalML.g:10066:3: ruleValueArrowFieldExpressionKind
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_1_2_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleValueArrowFieldExpressionKind();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_1_2_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__KindAlternatives_1_2_0"
+
+
+    // $ANTLR start "rule__TypeDefinition__Alternatives"
+    // InternalFormalML.g:10075:1: rule__TypeDefinition__Alternatives : ( ( ruleEnumerationTypeDefinition ) | ( ruleStructureTypeDefinition ) | ( ruleUnionTypeDefinition ) | ( ruleChoiceTypeDefinition ) | ( ruleIntervalTypeDefinition ) | ( ruleCollectionTypeDefinition ) | ( ruleOtherDataTypeDefinition ) );
+    public final void rule__TypeDefinition__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10079:1: ( ( ruleEnumerationTypeDefinition ) | ( ruleStructureTypeDefinition ) | ( ruleUnionTypeDefinition ) | ( ruleChoiceTypeDefinition ) | ( ruleIntervalTypeDefinition ) | ( ruleCollectionTypeDefinition ) | ( ruleOtherDataTypeDefinition ) )
+            int alt157=7;
+            alt157 = dfa157.predict(input);
+            switch (alt157) {
+                case 1 :
+                    // InternalFormalML.g:10080:2: ( ruleEnumerationTypeDefinition )
+                    {
+                    // InternalFormalML.g:10080:2: ( ruleEnumerationTypeDefinition )
+                    // InternalFormalML.g:10081:3: ruleEnumerationTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTypeDefinitionAccess().getEnumerationTypeDefinitionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleEnumerationTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTypeDefinitionAccess().getEnumerationTypeDefinitionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10086:2: ( ruleStructureTypeDefinition )
+                    {
+                    // InternalFormalML.g:10086:2: ( ruleStructureTypeDefinition )
+                    // InternalFormalML.g:10087:3: ruleStructureTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTypeDefinitionAccess().getStructureTypeDefinitionParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleStructureTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTypeDefinitionAccess().getStructureTypeDefinitionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10092:2: ( ruleUnionTypeDefinition )
+                    {
+                    // InternalFormalML.g:10092:2: ( ruleUnionTypeDefinition )
+                    // InternalFormalML.g:10093:3: ruleUnionTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTypeDefinitionAccess().getUnionTypeDefinitionParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleUnionTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTypeDefinitionAccess().getUnionTypeDefinitionParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10098:2: ( ruleChoiceTypeDefinition )
+                    {
+                    // InternalFormalML.g:10098:2: ( ruleChoiceTypeDefinition )
+                    // InternalFormalML.g:10099:3: ruleChoiceTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTypeDefinitionAccess().getChoiceTypeDefinitionParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleChoiceTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTypeDefinitionAccess().getChoiceTypeDefinitionParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:10104:2: ( ruleIntervalTypeDefinition )
+                    {
+                    // InternalFormalML.g:10104:2: ( ruleIntervalTypeDefinition )
+                    // InternalFormalML.g:10105:3: ruleIntervalTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTypeDefinitionAccess().getIntervalTypeDefinitionParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleIntervalTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTypeDefinitionAccess().getIntervalTypeDefinitionParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:10110:2: ( ruleCollectionTypeDefinition )
+                    {
+                    // InternalFormalML.g:10110:2: ( ruleCollectionTypeDefinition )
+                    // InternalFormalML.g:10111:3: ruleCollectionTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTypeDefinitionAccess().getCollectionTypeDefinitionParserRuleCall_5()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleCollectionTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTypeDefinitionAccess().getCollectionTypeDefinitionParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:10116:2: ( ruleOtherDataTypeDefinition )
+                    {
+                    // InternalFormalML.g:10116:2: ( ruleOtherDataTypeDefinition )
+                    // InternalFormalML.g:10117:3: ruleOtherDataTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTypeDefinitionAccess().getOtherDataTypeDefinitionParserRuleCall_6()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleOtherDataTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTypeDefinitionAccess().getOtherDataTypeDefinitionParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TypeDefinition__Alternatives"
+
+
+    // $ANTLR start "rule__DataTypeMultiplicity__Alternatives"
+    // InternalFormalML.g:10126:1: rule__DataTypeMultiplicity__Alternatives : ( ( ruleLiteralIntegerExpression ) | ( ruleLiteralReferenceElement ) );
+    public final void rule__DataTypeMultiplicity__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10130:1: ( ( ruleLiteralIntegerExpression ) | ( ruleLiteralReferenceElement ) )
+            int alt158=2;
+            int LA158_0 = input.LA(1);
+
+            if ( (LA158_0==RULE_INT||LA158_0==132) ) {
+                alt158=1;
+            }
+            else if ( (LA158_0==RULE_XLIA_ID) ) {
+                alt158=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 158, 0, input);
+
+                throw nvae;
+            }
+            switch (alt158) {
+                case 1 :
+                    // InternalFormalML.g:10131:2: ( ruleLiteralIntegerExpression )
+                    {
+                    // InternalFormalML.g:10131:2: ( ruleLiteralIntegerExpression )
+                    // InternalFormalML.g:10132:3: ruleLiteralIntegerExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataTypeMultiplicityAccess().getLiteralIntegerExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralIntegerExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataTypeMultiplicityAccess().getLiteralIntegerExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10137:2: ( ruleLiteralReferenceElement )
+                    {
+                    // InternalFormalML.g:10137:2: ( ruleLiteralReferenceElement )
+                    // InternalFormalML.g:10138:3: ruleLiteralReferenceElement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataTypeMultiplicityAccess().getLiteralReferenceElementParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralReferenceElement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataTypeMultiplicityAccess().getLiteralReferenceElementParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeMultiplicity__Alternatives"
+
+
+    // $ANTLR start "rule__DataTypeReference__Alternatives"
+    // InternalFormalML.g:10147:1: rule__DataTypeReference__Alternatives : ( ( ( rule__DataTypeReference__Group_0__0 ) ) | ( ( rule__DataTypeReference__Group_1__0 ) ) );
+    public final void rule__DataTypeReference__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10151:1: ( ( ( rule__DataTypeReference__Group_0__0 ) ) | ( ( rule__DataTypeReference__Group_1__0 ) ) )
+            int alt159=2;
+            int LA159_0 = input.LA(1);
+
+            if ( (LA159_0==15||(LA159_0>=17 && LA159_0<=18)||LA159_0==39||(LA159_0>=59 && LA159_0<=74)||(LA159_0>=129 && LA159_0<=132)||(LA159_0>=163 && LA159_0<=171)||(LA159_0>=231 && LA159_0<=234)||LA159_0==277) ) {
+                alt159=1;
+            }
+            else if ( (LA159_0==RULE_XLIA_ID) ) {
+                alt159=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 159, 0, input);
+
+                throw nvae;
+            }
+            switch (alt159) {
+                case 1 :
+                    // InternalFormalML.g:10152:2: ( ( rule__DataTypeReference__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:10152:2: ( ( rule__DataTypeReference__Group_0__0 ) )
+                    // InternalFormalML.g:10153:3: ( rule__DataTypeReference__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataTypeReferenceAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:10154:3: ( rule__DataTypeReference__Group_0__0 )
+                    // InternalFormalML.g:10154:4: rule__DataTypeReference__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DataTypeReference__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataTypeReferenceAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10158:2: ( ( rule__DataTypeReference__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:10158:2: ( ( rule__DataTypeReference__Group_1__0 ) )
+                    // InternalFormalML.g:10159:3: ( rule__DataTypeReference__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataTypeReferenceAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:10160:3: ( rule__DataTypeReference__Group_1__0 )
+                    // InternalFormalML.g:10160:4: rule__DataTypeReference__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DataTypeReference__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataTypeReferenceAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Alternatives"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Alternatives_5"
+    // InternalFormalML.g:10168:1: rule__OtherDataTypeDefinition__Alternatives_5 : ( ( ( rule__OtherDataTypeDefinition__Group_5_0__0 ) ) | ( ( rule__OtherDataTypeDefinition__Group_5_1__0 ) ) );
+    public final void rule__OtherDataTypeDefinition__Alternatives_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10172:1: ( ( ( rule__OtherDataTypeDefinition__Group_5_0__0 ) ) | ( ( rule__OtherDataTypeDefinition__Group_5_1__0 ) ) )
+            int alt160=2;
+            int LA160_0 = input.LA(1);
+
+            if ( (LA160_0==15||(LA160_0>=17 && LA160_0<=18)||LA160_0==39||(LA160_0>=59 && LA160_0<=74)||(LA160_0>=129 && LA160_0<=132)||(LA160_0>=163 && LA160_0<=164)||(LA160_0>=231 && LA160_0<=233)||LA160_0==277) ) {
+                alt160=1;
+            }
+            else if ( (LA160_0==RULE_XLIA_ID) ) {
+                alt160=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 160, 0, input);
+
+                throw nvae;
+            }
+            switch (alt160) {
+                case 1 :
+                    // InternalFormalML.g:10173:2: ( ( rule__OtherDataTypeDefinition__Group_5_0__0 ) )
+                    {
+                    // InternalFormalML.g:10173:2: ( ( rule__OtherDataTypeDefinition__Group_5_0__0 ) )
+                    // InternalFormalML.g:10174:3: ( rule__OtherDataTypeDefinition__Group_5_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0()); 
+                    }
+                    // InternalFormalML.g:10175:3: ( rule__OtherDataTypeDefinition__Group_5_0__0 )
+                    // InternalFormalML.g:10175:4: rule__OtherDataTypeDefinition__Group_5_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinition__Group_5_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10179:2: ( ( rule__OtherDataTypeDefinition__Group_5_1__0 ) )
+                    {
+                    // InternalFormalML.g:10179:2: ( ( rule__OtherDataTypeDefinition__Group_5_1__0 ) )
+                    // InternalFormalML.g:10180:3: ( rule__OtherDataTypeDefinition__Group_5_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1()); 
+                    }
+                    // InternalFormalML.g:10181:3: ( rule__OtherDataTypeDefinition__Group_5_1__0 )
+                    // InternalFormalML.g:10181:4: rule__OtherDataTypeDefinition__Group_5_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinition__Group_5_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Alternatives_5"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Alternatives_3"
+    // InternalFormalML.g:10189:1: rule__OtherDataTypeDefinitionImpl__Alternatives_3 : ( ( ( rule__OtherDataTypeDefinitionImpl__Group_3_0__0 ) ) | ( ( rule__OtherDataTypeDefinitionImpl__Group_3_1__0 ) ) );
+    public final void rule__OtherDataTypeDefinitionImpl__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10193:1: ( ( ( rule__OtherDataTypeDefinitionImpl__Group_3_0__0 ) ) | ( ( rule__OtherDataTypeDefinitionImpl__Group_3_1__0 ) ) )
+            int alt161=2;
+            int LA161_0 = input.LA(1);
+
+            if ( (LA161_0==15||(LA161_0>=17 && LA161_0<=18)||LA161_0==39||(LA161_0>=59 && LA161_0<=74)||(LA161_0>=129 && LA161_0<=132)||(LA161_0>=163 && LA161_0<=164)||(LA161_0>=231 && LA161_0<=233)||LA161_0==277) ) {
+                alt161=1;
+            }
+            else if ( (LA161_0==RULE_XLIA_ID) ) {
+                alt161=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 161, 0, input);
+
+                throw nvae;
+            }
+            switch (alt161) {
+                case 1 :
+                    // InternalFormalML.g:10194:2: ( ( rule__OtherDataTypeDefinitionImpl__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:10194:2: ( ( rule__OtherDataTypeDefinitionImpl__Group_3_0__0 ) )
+                    // InternalFormalML.g:10195:3: ( rule__OtherDataTypeDefinitionImpl__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:10196:3: ( rule__OtherDataTypeDefinitionImpl__Group_3_0__0 )
+                    // InternalFormalML.g:10196:4: rule__OtherDataTypeDefinitionImpl__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinitionImpl__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10200:2: ( ( rule__OtherDataTypeDefinitionImpl__Group_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:10200:2: ( ( rule__OtherDataTypeDefinitionImpl__Group_3_1__0 ) )
+                    // InternalFormalML.g:10201:3: ( rule__OtherDataTypeDefinitionImpl__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:10202:3: ( rule__OtherDataTypeDefinitionImpl__Group_3_1__0 )
+                    // InternalFormalML.g:10202:4: rule__OtherDataTypeDefinitionImpl__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinitionImpl__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Alternatives_3"
+
+
+    // $ANTLR start "rule__DataType__Alternatives"
+    // InternalFormalML.g:10210:1: rule__DataType__Alternatives : ( ( ruleDataTypeReference ) | ( ruleStructuredDataType ) );
+    public final void rule__DataType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10214:1: ( ( ruleDataTypeReference ) | ( ruleStructuredDataType ) )
+            int alt162=2;
+            int LA162_0 = input.LA(1);
+
+            if ( (LA162_0==RULE_XLIA_ID||LA162_0==15||(LA162_0>=17 && LA162_0<=18)||LA162_0==39||(LA162_0>=59 && LA162_0<=74)||(LA162_0>=129 && LA162_0<=132)||(LA162_0>=163 && LA162_0<=171)||(LA162_0>=231 && LA162_0<=234)||LA162_0==277) ) {
+                alt162=1;
+            }
+            else if ( (LA162_0==149||(LA162_0>=235 && LA162_0<=237)) ) {
+                alt162=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 162, 0, input);
+
+                throw nvae;
+            }
+            switch (alt162) {
+                case 1 :
+                    // InternalFormalML.g:10215:2: ( ruleDataTypeReference )
+                    {
+                    // InternalFormalML.g:10215:2: ( ruleDataTypeReference )
+                    // InternalFormalML.g:10216:3: ruleDataTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataTypeAccess().getDataTypeReferenceParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDataTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataTypeAccess().getDataTypeReferenceParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10221:2: ( ruleStructuredDataType )
+                    {
+                    // InternalFormalML.g:10221:2: ( ruleStructuredDataType )
+                    // InternalFormalML.g:10222:3: ruleStructuredDataType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataTypeAccess().getStructuredDataTypeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleStructuredDataType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataTypeAccess().getStructuredDataTypeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataType__Alternatives"
+
+
+    // $ANTLR start "rule__SimpleDataType__Alternatives"
+    // InternalFormalML.g:10231:1: rule__SimpleDataType__Alternatives : ( ( rulePrimitiveType ) | ( ruleIntervalType ) | ( ruleCollectionType ) );
+    public final void rule__SimpleDataType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10235:1: ( ( rulePrimitiveType ) | ( ruleIntervalType ) | ( ruleCollectionType ) )
+            int alt163=3;
+            switch ( input.LA(1) ) {
+            case 15:
+            case 17:
+            case 18:
+            case 39:
+            case 59:
+            case 60:
+            case 61:
+            case 62:
+            case 63:
+            case 64:
+            case 65:
+            case 66:
+            case 67:
+            case 68:
+            case 69:
+            case 70:
+            case 71:
+            case 72:
+            case 73:
+            case 74:
+            case 129:
+            case 130:
+            case 131:
+            case 132:
+            case 163:
+            case 164:
+            case 231:
+            case 232:
+            case 233:
+            case 277:
+                {
+                alt163=1;
+                }
+                break;
+            case 234:
+                {
+                alt163=2;
+                }
+                break;
+            case 165:
+            case 166:
+            case 167:
+            case 168:
+            case 169:
+            case 170:
+            case 171:
+                {
+                alt163=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 163, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt163) {
+                case 1 :
+                    // InternalFormalML.g:10236:2: ( rulePrimitiveType )
+                    {
+                    // InternalFormalML.g:10236:2: ( rulePrimitiveType )
+                    // InternalFormalML.g:10237:3: rulePrimitiveType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSimpleDataTypeAccess().getPrimitiveTypeParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSimpleDataTypeAccess().getPrimitiveTypeParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10242:2: ( ruleIntervalType )
+                    {
+                    // InternalFormalML.g:10242:2: ( ruleIntervalType )
+                    // InternalFormalML.g:10243:3: ruleIntervalType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSimpleDataTypeAccess().getIntervalTypeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleIntervalType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSimpleDataTypeAccess().getIntervalTypeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10248:2: ( ruleCollectionType )
+                    {
+                    // InternalFormalML.g:10248:2: ( ruleCollectionType )
+                    // InternalFormalML.g:10249:3: ruleCollectionType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSimpleDataTypeAccess().getCollectionTypeParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleCollectionType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSimpleDataTypeAccess().getCollectionTypeParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleDataType__Alternatives"
+
+
+    // $ANTLR start "rule__StructuredDataType__Alternatives"
+    // InternalFormalML.g:10258:1: rule__StructuredDataType__Alternatives : ( ( ruleEnumerationType ) | ( ruleStructureType ) | ( ruleUnionType ) | ( ruleChoiceType ) );
+    public final void rule__StructuredDataType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10262:1: ( ( ruleEnumerationType ) | ( ruleStructureType ) | ( ruleUnionType ) | ( ruleChoiceType ) )
+            int alt164=4;
+            switch ( input.LA(1) ) {
+            case 235:
+                {
+                alt164=1;
+                }
+                break;
+            case 236:
+                {
+                alt164=2;
+                }
+                break;
+            case 237:
+                {
+                alt164=3;
+                }
+                break;
+            case 149:
+                {
+                alt164=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 164, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt164) {
+                case 1 :
+                    // InternalFormalML.g:10263:2: ( ruleEnumerationType )
+                    {
+                    // InternalFormalML.g:10263:2: ( ruleEnumerationType )
+                    // InternalFormalML.g:10264:3: ruleEnumerationType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStructuredDataTypeAccess().getEnumerationTypeParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleEnumerationType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStructuredDataTypeAccess().getEnumerationTypeParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10269:2: ( ruleStructureType )
+                    {
+                    // InternalFormalML.g:10269:2: ( ruleStructureType )
+                    // InternalFormalML.g:10270:3: ruleStructureType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStructuredDataTypeAccess().getStructureTypeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleStructureType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStructuredDataTypeAccess().getStructureTypeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10275:2: ( ruleUnionType )
+                    {
+                    // InternalFormalML.g:10275:2: ( ruleUnionType )
+                    // InternalFormalML.g:10276:3: ruleUnionType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStructuredDataTypeAccess().getUnionTypeParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleUnionType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStructuredDataTypeAccess().getUnionTypeParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10281:2: ( ruleChoiceType )
+                    {
+                    // InternalFormalML.g:10281:2: ( ruleChoiceType )
+                    // InternalFormalML.g:10282:3: ruleChoiceType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStructuredDataTypeAccess().getChoiceTypeParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleChoiceType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStructuredDataTypeAccess().getChoiceTypeParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructuredDataType__Alternatives"
+
+
+    // $ANTLR start "rule__PrimitiveType__Alternatives"
+    // InternalFormalML.g:10291:1: rule__PrimitiveType__Alternatives : ( ( rulePrimitiveNumberType ) | ( ruleOtherPrimitiveType ) );
+    public final void rule__PrimitiveType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10295:1: ( ( rulePrimitiveNumberType ) | ( ruleOtherPrimitiveType ) )
+            int alt165=2;
+            int LA165_0 = input.LA(1);
+
+            if ( ((LA165_0>=59 && LA165_0<=72)||(LA165_0>=129 && LA165_0<=132)||LA165_0==231||LA165_0==277) ) {
+                alt165=1;
+            }
+            else if ( (LA165_0==15||(LA165_0>=17 && LA165_0<=18)||LA165_0==39||(LA165_0>=73 && LA165_0<=74)||(LA165_0>=163 && LA165_0<=164)||(LA165_0>=232 && LA165_0<=233)) ) {
+                alt165=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 165, 0, input);
+
+                throw nvae;
+            }
+            switch (alt165) {
+                case 1 :
+                    // InternalFormalML.g:10296:2: ( rulePrimitiveNumberType )
+                    {
+                    // InternalFormalML.g:10296:2: ( rulePrimitiveNumberType )
+                    // InternalFormalML.g:10297:3: rulePrimitiveNumberType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTypeAccess().getPrimitiveNumberTypeParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveNumberType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTypeAccess().getPrimitiveNumberTypeParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10302:2: ( ruleOtherPrimitiveType )
+                    {
+                    // InternalFormalML.g:10302:2: ( ruleOtherPrimitiveType )
+                    // InternalFormalML.g:10303:3: ruleOtherPrimitiveType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTypeAccess().getOtherPrimitiveTypeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleOtherPrimitiveType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTypeAccess().getOtherPrimitiveTypeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveType__Alternatives"
+
+
+    // $ANTLR start "rule__PrimitiveNumberType__Alternatives"
+    // InternalFormalML.g:10312:1: rule__PrimitiveNumberType__Alternatives : ( ( rulePrimitiveIntegerType ) | ( rulePrimitiveRationalType ) | ( rulePrimitiveFloatType ) | ( rulePrimitiveRealType ) | ( rulePrimitiveTimeType ) );
+    public final void rule__PrimitiveNumberType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10316:1: ( ( rulePrimitiveIntegerType ) | ( rulePrimitiveRationalType ) | ( rulePrimitiveFloatType ) | ( rulePrimitiveRealType ) | ( rulePrimitiveTimeType ) )
+            int alt166=5;
+            alt166 = dfa166.predict(input);
+            switch (alt166) {
+                case 1 :
+                    // InternalFormalML.g:10317:2: ( rulePrimitiveIntegerType )
+                    {
+                    // InternalFormalML.g:10317:2: ( rulePrimitiveIntegerType )
+                    // InternalFormalML.g:10318:3: rulePrimitiveIntegerType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveIntegerType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10323:2: ( rulePrimitiveRationalType )
+                    {
+                    // InternalFormalML.g:10323:2: ( rulePrimitiveRationalType )
+                    // InternalFormalML.g:10324:3: rulePrimitiveRationalType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveRationalType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10329:2: ( rulePrimitiveFloatType )
+                    {
+                    // InternalFormalML.g:10329:2: ( rulePrimitiveFloatType )
+                    // InternalFormalML.g:10330:3: rulePrimitiveFloatType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveFloatType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10335:2: ( rulePrimitiveRealType )
+                    {
+                    // InternalFormalML.g:10335:2: ( rulePrimitiveRealType )
+                    // InternalFormalML.g:10336:3: rulePrimitiveRealType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveRealType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:10341:2: ( rulePrimitiveTimeType )
+                    {
+                    // InternalFormalML.g:10341:2: ( rulePrimitiveTimeType )
+                    // InternalFormalML.g:10342:3: rulePrimitiveTimeType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveTimeTypeParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveTimeType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveTimeTypeParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveNumberType__Alternatives"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Alternatives_2"
+    // InternalFormalML.g:10351:1: rule__PrimitiveIntegerType__Alternatives_2 : ( ( 'integer' ) | ( 'uinteger' ) | ( 'int' ) | ( 'uint' ) );
+    public final void rule__PrimitiveIntegerType__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10355:1: ( ( 'integer' ) | ( 'uinteger' ) | ( 'int' ) | ( 'uint' ) )
+            int alt167=4;
+            switch ( input.LA(1) ) {
+            case 59:
+                {
+                alt167=1;
+                }
+                break;
+            case 60:
+                {
+                alt167=2;
+                }
+                break;
+            case 61:
+                {
+                alt167=3;
+                }
+                break;
+            case 62:
+                {
+                alt167=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 167, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt167) {
+                case 1 :
+                    // InternalFormalML.g:10356:2: ( 'integer' )
+                    {
+                    // InternalFormalML.g:10356:2: ( 'integer' )
+                    // InternalFormalML.g:10357:3: 'integer'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveIntegerTypeAccess().getIntegerKeyword_2_0()); 
+                    }
+                    match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveIntegerTypeAccess().getIntegerKeyword_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10362:2: ( 'uinteger' )
+                    {
+                    // InternalFormalML.g:10362:2: ( 'uinteger' )
+                    // InternalFormalML.g:10363:3: 'uinteger'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveIntegerTypeAccess().getUintegerKeyword_2_1()); 
+                    }
+                    match(input,60,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveIntegerTypeAccess().getUintegerKeyword_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10368:2: ( 'int' )
+                    {
+                    // InternalFormalML.g:10368:2: ( 'int' )
+                    // InternalFormalML.g:10369:3: 'int'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveIntegerTypeAccess().getIntKeyword_2_2()); 
+                    }
+                    match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveIntegerTypeAccess().getIntKeyword_2_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10374:2: ( 'uint' )
+                    {
+                    // InternalFormalML.g:10374:2: ( 'uint' )
+                    // InternalFormalML.g:10375:3: 'uint'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveIntegerTypeAccess().getUintKeyword_2_3()); 
+                    }
+                    match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveIntegerTypeAccess().getUintKeyword_2_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Alternatives_2"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Alternatives_3"
+    // InternalFormalML.g:10384:1: rule__PrimitiveIntegerType__Alternatives_3 : ( ( ( rule__PrimitiveIntegerType__Group_3_0__0 ) ) | ( ( rule__PrimitiveIntegerType__Group_3_1__0 ) ) );
+    public final void rule__PrimitiveIntegerType__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10388:1: ( ( ( rule__PrimitiveIntegerType__Group_3_0__0 ) ) | ( ( rule__PrimitiveIntegerType__Group_3_1__0 ) ) )
+            int alt168=2;
+            int LA168_0 = input.LA(1);
+
+            if ( (LA168_0==31) ) {
+                alt168=1;
+            }
+            else if ( (LA168_0==125) ) {
+                alt168=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 168, 0, input);
+
+                throw nvae;
+            }
+            switch (alt168) {
+                case 1 :
+                    // InternalFormalML.g:10389:2: ( ( rule__PrimitiveIntegerType__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:10389:2: ( ( rule__PrimitiveIntegerType__Group_3_0__0 ) )
+                    // InternalFormalML.g:10390:3: ( rule__PrimitiveIntegerType__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:10391:3: ( rule__PrimitiveIntegerType__Group_3_0__0 )
+                    // InternalFormalML.g:10391:4: rule__PrimitiveIntegerType__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveIntegerType__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10395:2: ( ( rule__PrimitiveIntegerType__Group_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:10395:2: ( ( rule__PrimitiveIntegerType__Group_3_1__0 ) )
+                    // InternalFormalML.g:10396:3: ( rule__PrimitiveIntegerType__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:10397:3: ( rule__PrimitiveIntegerType__Group_3_1__0 )
+                    // InternalFormalML.g:10397:4: rule__PrimitiveIntegerType__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveIntegerType__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveIntegerTypeAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Alternatives_3"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Alternatives_2"
+    // InternalFormalML.g:10405:1: rule__PrimitiveRationalType__Alternatives_2 : ( ( 'rational' ) | ( 'urational' ) | ( 'rat' ) | ( 'urat' ) );
+    public final void rule__PrimitiveRationalType__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10409:1: ( ( 'rational' ) | ( 'urational' ) | ( 'rat' ) | ( 'urat' ) )
+            int alt169=4;
+            switch ( input.LA(1) ) {
+            case 63:
+                {
+                alt169=1;
+                }
+                break;
+            case 64:
+                {
+                alt169=2;
+                }
+                break;
+            case 65:
+                {
+                alt169=3;
+                }
+                break;
+            case 66:
+                {
+                alt169=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 169, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt169) {
+                case 1 :
+                    // InternalFormalML.g:10410:2: ( 'rational' )
+                    {
+                    // InternalFormalML.g:10410:2: ( 'rational' )
+                    // InternalFormalML.g:10411:3: 'rational'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRationalTypeAccess().getRationalKeyword_2_0()); 
+                    }
+                    match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRationalTypeAccess().getRationalKeyword_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10416:2: ( 'urational' )
+                    {
+                    // InternalFormalML.g:10416:2: ( 'urational' )
+                    // InternalFormalML.g:10417:3: 'urational'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRationalTypeAccess().getUrationalKeyword_2_1()); 
+                    }
+                    match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRationalTypeAccess().getUrationalKeyword_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10422:2: ( 'rat' )
+                    {
+                    // InternalFormalML.g:10422:2: ( 'rat' )
+                    // InternalFormalML.g:10423:3: 'rat'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRationalTypeAccess().getRatKeyword_2_2()); 
+                    }
+                    match(input,65,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRationalTypeAccess().getRatKeyword_2_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10428:2: ( 'urat' )
+                    {
+                    // InternalFormalML.g:10428:2: ( 'urat' )
+                    // InternalFormalML.g:10429:3: 'urat'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRationalTypeAccess().getUratKeyword_2_3()); 
+                    }
+                    match(input,66,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRationalTypeAccess().getUratKeyword_2_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Alternatives_2"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Alternatives_3"
+    // InternalFormalML.g:10438:1: rule__PrimitiveRationalType__Alternatives_3 : ( ( ( rule__PrimitiveRationalType__Group_3_0__0 ) ) | ( ( rule__PrimitiveRationalType__Group_3_1__0 ) ) );
+    public final void rule__PrimitiveRationalType__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10442:1: ( ( ( rule__PrimitiveRationalType__Group_3_0__0 ) ) | ( ( rule__PrimitiveRationalType__Group_3_1__0 ) ) )
+            int alt170=2;
+            int LA170_0 = input.LA(1);
+
+            if ( (LA170_0==31) ) {
+                alt170=1;
+            }
+            else if ( (LA170_0==125) ) {
+                alt170=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 170, 0, input);
+
+                throw nvae;
+            }
+            switch (alt170) {
+                case 1 :
+                    // InternalFormalML.g:10443:2: ( ( rule__PrimitiveRationalType__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:10443:2: ( ( rule__PrimitiveRationalType__Group_3_0__0 ) )
+                    // InternalFormalML.g:10444:3: ( rule__PrimitiveRationalType__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:10445:3: ( rule__PrimitiveRationalType__Group_3_0__0 )
+                    // InternalFormalML.g:10445:4: rule__PrimitiveRationalType__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveRationalType__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10449:2: ( ( rule__PrimitiveRationalType__Group_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:10449:2: ( ( rule__PrimitiveRationalType__Group_3_1__0 ) )
+                    // InternalFormalML.g:10450:3: ( rule__PrimitiveRationalType__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:10451:3: ( rule__PrimitiveRationalType__Group_3_1__0 )
+                    // InternalFormalML.g:10451:4: rule__PrimitiveRationalType__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveRationalType__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRationalTypeAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Alternatives_3"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Alternatives_2"
+    // InternalFormalML.g:10459:1: rule__PrimitiveFloatType__Alternatives_2 : ( ( 'float' ) | ( 'ufloat' ) | ( 'double' ) | ( 'udouble' ) );
+    public final void rule__PrimitiveFloatType__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10463:1: ( ( 'float' ) | ( 'ufloat' ) | ( 'double' ) | ( 'udouble' ) )
+            int alt171=4;
+            switch ( input.LA(1) ) {
+            case 67:
+                {
+                alt171=1;
+                }
+                break;
+            case 68:
+                {
+                alt171=2;
+                }
+                break;
+            case 69:
+                {
+                alt171=3;
+                }
+                break;
+            case 70:
+                {
+                alt171=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 171, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt171) {
+                case 1 :
+                    // InternalFormalML.g:10464:2: ( 'float' )
+                    {
+                    // InternalFormalML.g:10464:2: ( 'float' )
+                    // InternalFormalML.g:10465:3: 'float'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveFloatTypeAccess().getFloatKeyword_2_0()); 
+                    }
+                    match(input,67,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveFloatTypeAccess().getFloatKeyword_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10470:2: ( 'ufloat' )
+                    {
+                    // InternalFormalML.g:10470:2: ( 'ufloat' )
+                    // InternalFormalML.g:10471:3: 'ufloat'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveFloatTypeAccess().getUfloatKeyword_2_1()); 
+                    }
+                    match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveFloatTypeAccess().getUfloatKeyword_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10476:2: ( 'double' )
+                    {
+                    // InternalFormalML.g:10476:2: ( 'double' )
+                    // InternalFormalML.g:10477:3: 'double'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveFloatTypeAccess().getDoubleKeyword_2_2()); 
+                    }
+                    match(input,69,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveFloatTypeAccess().getDoubleKeyword_2_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10482:2: ( 'udouble' )
+                    {
+                    // InternalFormalML.g:10482:2: ( 'udouble' )
+                    // InternalFormalML.g:10483:3: 'udouble'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveFloatTypeAccess().getUdoubleKeyword_2_3()); 
+                    }
+                    match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveFloatTypeAccess().getUdoubleKeyword_2_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Alternatives_2"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Alternatives_3"
+    // InternalFormalML.g:10492:1: rule__PrimitiveFloatType__Alternatives_3 : ( ( ( rule__PrimitiveFloatType__Group_3_0__0 ) ) | ( ( rule__PrimitiveFloatType__Group_3_1__0 ) ) );
+    public final void rule__PrimitiveFloatType__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10496:1: ( ( ( rule__PrimitiveFloatType__Group_3_0__0 ) ) | ( ( rule__PrimitiveFloatType__Group_3_1__0 ) ) )
+            int alt172=2;
+            int LA172_0 = input.LA(1);
+
+            if ( (LA172_0==31) ) {
+                alt172=1;
+            }
+            else if ( (LA172_0==125) ) {
+                alt172=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 172, 0, input);
+
+                throw nvae;
+            }
+            switch (alt172) {
+                case 1 :
+                    // InternalFormalML.g:10497:2: ( ( rule__PrimitiveFloatType__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:10497:2: ( ( rule__PrimitiveFloatType__Group_3_0__0 ) )
+                    // InternalFormalML.g:10498:3: ( rule__PrimitiveFloatType__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:10499:3: ( rule__PrimitiveFloatType__Group_3_0__0 )
+                    // InternalFormalML.g:10499:4: rule__PrimitiveFloatType__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveFloatType__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10503:2: ( ( rule__PrimitiveFloatType__Group_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:10503:2: ( ( rule__PrimitiveFloatType__Group_3_1__0 ) )
+                    // InternalFormalML.g:10504:3: ( rule__PrimitiveFloatType__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:10505:3: ( rule__PrimitiveFloatType__Group_3_1__0 )
+                    // InternalFormalML.g:10505:4: rule__PrimitiveFloatType__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveFloatType__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveFloatTypeAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Alternatives_3"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Alternatives_2"
+    // InternalFormalML.g:10513:1: rule__PrimitiveRealType__Alternatives_2 : ( ( 'real' ) | ( 'ureal' ) );
+    public final void rule__PrimitiveRealType__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10517:1: ( ( 'real' ) | ( 'ureal' ) )
+            int alt173=2;
+            int LA173_0 = input.LA(1);
+
+            if ( (LA173_0==71) ) {
+                alt173=1;
+            }
+            else if ( (LA173_0==72) ) {
+                alt173=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 173, 0, input);
+
+                throw nvae;
+            }
+            switch (alt173) {
+                case 1 :
+                    // InternalFormalML.g:10518:2: ( 'real' )
+                    {
+                    // InternalFormalML.g:10518:2: ( 'real' )
+                    // InternalFormalML.g:10519:3: 'real'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRealTypeAccess().getRealKeyword_2_0()); 
+                    }
+                    match(input,71,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRealTypeAccess().getRealKeyword_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10524:2: ( 'ureal' )
+                    {
+                    // InternalFormalML.g:10524:2: ( 'ureal' )
+                    // InternalFormalML.g:10525:3: 'ureal'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRealTypeAccess().getUrealKeyword_2_1()); 
+                    }
+                    match(input,72,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRealTypeAccess().getUrealKeyword_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Alternatives_2"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Alternatives_3"
+    // InternalFormalML.g:10534:1: rule__PrimitiveRealType__Alternatives_3 : ( ( ( rule__PrimitiveRealType__Group_3_0__0 ) ) | ( ( rule__PrimitiveRealType__Group_3_1__0 ) ) );
+    public final void rule__PrimitiveRealType__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10538:1: ( ( ( rule__PrimitiveRealType__Group_3_0__0 ) ) | ( ( rule__PrimitiveRealType__Group_3_1__0 ) ) )
+            int alt174=2;
+            int LA174_0 = input.LA(1);
+
+            if ( (LA174_0==31) ) {
+                alt174=1;
+            }
+            else if ( (LA174_0==125) ) {
+                alt174=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 174, 0, input);
+
+                throw nvae;
+            }
+            switch (alt174) {
+                case 1 :
+                    // InternalFormalML.g:10539:2: ( ( rule__PrimitiveRealType__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:10539:2: ( ( rule__PrimitiveRealType__Group_3_0__0 ) )
+                    // InternalFormalML.g:10540:3: ( rule__PrimitiveRealType__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:10541:3: ( rule__PrimitiveRealType__Group_3_0__0 )
+                    // InternalFormalML.g:10541:4: rule__PrimitiveRealType__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveRealType__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10545:2: ( ( rule__PrimitiveRealType__Group_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:10545:2: ( ( rule__PrimitiveRealType__Group_3_1__0 ) )
+                    // InternalFormalML.g:10546:3: ( rule__PrimitiveRealType__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:10547:3: ( rule__PrimitiveRealType__Group_3_1__0 )
+                    // InternalFormalML.g:10547:4: rule__PrimitiveRealType__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveRealType__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveRealTypeAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Alternatives_3"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Alternatives"
+    // InternalFormalML.g:10555:1: rule__PrimitiveTimeType__Alternatives : ( ( ( rule__PrimitiveTimeType__Group_0__0 ) ) | ( ( rule__PrimitiveTimeType__Group_1__0 ) ) );
+    public final void rule__PrimitiveTimeType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10559:1: ( ( ( rule__PrimitiveTimeType__Group_0__0 ) ) | ( ( rule__PrimitiveTimeType__Group_1__0 ) ) )
+            int alt175=2;
+            int LA175_0 = input.LA(1);
+
+            if ( (LA175_0==231) ) {
+                alt175=1;
+            }
+            else if ( (LA175_0==277) ) {
+                alt175=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 175, 0, input);
+
+                throw nvae;
+            }
+            switch (alt175) {
+                case 1 :
+                    // InternalFormalML.g:10560:2: ( ( rule__PrimitiveTimeType__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:10560:2: ( ( rule__PrimitiveTimeType__Group_0__0 ) )
+                    // InternalFormalML.g:10561:3: ( rule__PrimitiveTimeType__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:10562:3: ( rule__PrimitiveTimeType__Group_0__0 )
+                    // InternalFormalML.g:10562:4: rule__PrimitiveTimeType__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveTimeType__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10566:2: ( ( rule__PrimitiveTimeType__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:10566:2: ( ( rule__PrimitiveTimeType__Group_1__0 ) )
+                    // InternalFormalML.g:10567:3: ( rule__PrimitiveTimeType__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:10568:3: ( rule__PrimitiveTimeType__Group_1__0 )
+                    // InternalFormalML.g:10568:4: rule__PrimitiveTimeType__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveTimeType__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Alternatives"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Alternatives_0_2"
+    // InternalFormalML.g:10576:1: rule__PrimitiveTimeType__Alternatives_0_2 : ( ( ( rule__PrimitiveTimeType__Group_0_2_0__0 ) ) | ( ( rule__PrimitiveTimeType__SupportAssignment_0_2_1 ) ) );
+    public final void rule__PrimitiveTimeType__Alternatives_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10580:1: ( ( ( rule__PrimitiveTimeType__Group_0_2_0__0 ) ) | ( ( rule__PrimitiveTimeType__SupportAssignment_0_2_1 ) ) )
+            int alt176=2;
+            int LA176_0 = input.LA(1);
+
+            if ( (LA176_0==125) ) {
+                alt176=1;
+            }
+            else if ( ((LA176_0>=59 && LA176_0<=72)||(LA176_0>=129 && LA176_0<=132)) ) {
+                alt176=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 176, 0, input);
+
+                throw nvae;
+            }
+            switch (alt176) {
+                case 1 :
+                    // InternalFormalML.g:10581:2: ( ( rule__PrimitiveTimeType__Group_0_2_0__0 ) )
+                    {
+                    // InternalFormalML.g:10581:2: ( ( rule__PrimitiveTimeType__Group_0_2_0__0 ) )
+                    // InternalFormalML.g:10582:3: ( rule__PrimitiveTimeType__Group_0_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0_2_0()); 
+                    }
+                    // InternalFormalML.g:10583:3: ( rule__PrimitiveTimeType__Group_0_2_0__0 )
+                    // InternalFormalML.g:10583:4: rule__PrimitiveTimeType__Group_0_2_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveTimeType__Group_0_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_0_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10587:2: ( ( rule__PrimitiveTimeType__SupportAssignment_0_2_1 ) )
+                    {
+                    // InternalFormalML.g:10587:2: ( ( rule__PrimitiveTimeType__SupportAssignment_0_2_1 ) )
+                    // InternalFormalML.g:10588:3: ( rule__PrimitiveTimeType__SupportAssignment_0_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_1()); 
+                    }
+                    // InternalFormalML.g:10589:3: ( rule__PrimitiveTimeType__SupportAssignment_0_2_1 )
+                    // InternalFormalML.g:10589:4: rule__PrimitiveTimeType__SupportAssignment_0_2_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveTimeType__SupportAssignment_0_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Alternatives_0_2"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Alternatives_1_2"
+    // InternalFormalML.g:10597:1: rule__PrimitiveTimeType__Alternatives_1_2 : ( ( ( rule__PrimitiveTimeType__Group_1_2_0__0 ) ) | ( ( rule__PrimitiveTimeType__SupportAssignment_1_2_1 ) ) );
+    public final void rule__PrimitiveTimeType__Alternatives_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10601:1: ( ( ( rule__PrimitiveTimeType__Group_1_2_0__0 ) ) | ( ( rule__PrimitiveTimeType__SupportAssignment_1_2_1 ) ) )
+            int alt177=2;
+            int LA177_0 = input.LA(1);
+
+            if ( (LA177_0==125) ) {
+                alt177=1;
+            }
+            else if ( ((LA177_0>=59 && LA177_0<=72)||(LA177_0>=129 && LA177_0<=132)) ) {
+                alt177=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 177, 0, input);
+
+                throw nvae;
+            }
+            switch (alt177) {
+                case 1 :
+                    // InternalFormalML.g:10602:2: ( ( rule__PrimitiveTimeType__Group_1_2_0__0 ) )
+                    {
+                    // InternalFormalML.g:10602:2: ( ( rule__PrimitiveTimeType__Group_1_2_0__0 ) )
+                    // InternalFormalML.g:10603:3: ( rule__PrimitiveTimeType__Group_1_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1_2_0()); 
+                    }
+                    // InternalFormalML.g:10604:3: ( rule__PrimitiveTimeType__Group_1_2_0__0 )
+                    // InternalFormalML.g:10604:4: rule__PrimitiveTimeType__Group_1_2_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveTimeType__Group_1_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeTypeAccess().getGroup_1_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10608:2: ( ( rule__PrimitiveTimeType__SupportAssignment_1_2_1 ) )
+                    {
+                    // InternalFormalML.g:10608:2: ( ( rule__PrimitiveTimeType__SupportAssignment_1_2_1 ) )
+                    // InternalFormalML.g:10609:3: ( rule__PrimitiveTimeType__SupportAssignment_1_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_1()); 
+                    }
+                    // InternalFormalML.g:10610:3: ( rule__PrimitiveTimeType__SupportAssignment_1_2_1 )
+                    // InternalFormalML.g:10610:4: rule__PrimitiveTimeType__SupportAssignment_1_2_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveTimeType__SupportAssignment_1_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Alternatives_1_2"
+
+
+    // $ANTLR start "rule__PrimitiveTimeNumberType__Alternatives"
+    // InternalFormalML.g:10618:1: rule__PrimitiveTimeNumberType__Alternatives : ( ( rulePrimitiveIntegerType ) | ( rulePrimitiveRationalType ) | ( rulePrimitiveFloatType ) | ( rulePrimitiveRealType ) );
+    public final void rule__PrimitiveTimeNumberType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10622:1: ( ( rulePrimitiveIntegerType ) | ( rulePrimitiveRationalType ) | ( rulePrimitiveFloatType ) | ( rulePrimitiveRealType ) )
+            int alt178=4;
+            switch ( input.LA(1) ) {
+            case 131:
+                {
+                switch ( input.LA(2) ) {
+                case 59:
+                case 60:
+                case 61:
+                case 62:
+                    {
+                    alt178=1;
+                    }
+                    break;
+                case 63:
+                case 64:
+                case 65:
+                case 66:
+                    {
+                    alt178=2;
+                    }
+                    break;
+                case 67:
+                case 68:
+                case 69:
+                case 70:
+                    {
+                    alt178=3;
+                    }
+                    break;
+                case 71:
+                case 72:
+                    {
+                    alt178=4;
+                    }
+                    break;
+                default:
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 178, 1, input);
+
+                    throw nvae;
+                }
+
+                }
+                break;
+            case 129:
+                {
+                switch ( input.LA(2) ) {
+                case 67:
+                case 68:
+                case 69:
+                case 70:
+                    {
+                    alt178=3;
+                    }
+                    break;
+                case 71:
+                case 72:
+                    {
+                    alt178=4;
+                    }
+                    break;
+                case 59:
+                case 60:
+                case 61:
+                case 62:
+                    {
+                    alt178=1;
+                    }
+                    break;
+                case 63:
+                case 64:
+                case 65:
+                case 66:
+                    {
+                    alt178=2;
+                    }
+                    break;
+                default:
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 178, 2, input);
+
+                    throw nvae;
+                }
+
+                }
+                break;
+            case 132:
+                {
+                switch ( input.LA(2) ) {
+                case 71:
+                case 72:
+                    {
+                    alt178=4;
+                    }
+                    break;
+                case 59:
+                case 60:
+                case 61:
+                case 62:
+                    {
+                    alt178=1;
+                    }
+                    break;
+                case 63:
+                case 64:
+                case 65:
+                case 66:
+                    {
+                    alt178=2;
+                    }
+                    break;
+                case 67:
+                case 68:
+                case 69:
+                case 70:
+                    {
+                    alt178=3;
+                    }
+                    break;
+                default:
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 178, 3, input);
+
+                    throw nvae;
+                }
+
+                }
+                break;
+            case 130:
+                {
+                switch ( input.LA(2) ) {
+                case 63:
+                case 64:
+                case 65:
+                case 66:
+                    {
+                    alt178=2;
+                    }
+                    break;
+                case 67:
+                case 68:
+                case 69:
+                case 70:
+                    {
+                    alt178=3;
+                    }
+                    break;
+                case 71:
+                case 72:
+                    {
+                    alt178=4;
+                    }
+                    break;
+                case 59:
+                case 60:
+                case 61:
+                case 62:
+                    {
+                    alt178=1;
+                    }
+                    break;
+                default:
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 178, 4, input);
+
+                    throw nvae;
+                }
+
+                }
+                break;
+            case 59:
+            case 60:
+            case 61:
+            case 62:
+                {
+                alt178=1;
+                }
+                break;
+            case 63:
+            case 64:
+            case 65:
+            case 66:
+                {
+                alt178=2;
+                }
+                break;
+            case 67:
+            case 68:
+            case 69:
+            case 70:
+                {
+                alt178=3;
+                }
+                break;
+            case 71:
+            case 72:
+                {
+                alt178=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 178, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt178) {
+                case 1 :
+                    // InternalFormalML.g:10623:2: ( rulePrimitiveIntegerType )
+                    {
+                    // InternalFormalML.g:10623:2: ( rulePrimitiveIntegerType )
+                    // InternalFormalML.g:10624:3: rulePrimitiveIntegerType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveIntegerType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10629:2: ( rulePrimitiveRationalType )
+                    {
+                    // InternalFormalML.g:10629:2: ( rulePrimitiveRationalType )
+                    // InternalFormalML.g:10630:3: rulePrimitiveRationalType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveRationalType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10635:2: ( rulePrimitiveFloatType )
+                    {
+                    // InternalFormalML.g:10635:2: ( rulePrimitiveFloatType )
+                    // InternalFormalML.g:10636:3: rulePrimitiveFloatType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveFloatType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10641:2: ( rulePrimitiveRealType )
+                    {
+                    // InternalFormalML.g:10641:2: ( rulePrimitiveRealType )
+                    // InternalFormalML.g:10642:3: rulePrimitiveRealType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveRealType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeNumberType__Alternatives"
+
+
+    // $ANTLR start "rule__OtherPrimitiveType__Alternatives"
+    // InternalFormalML.g:10651:1: rule__OtherPrimitiveType__Alternatives : ( ( rulePrimitiveBooleanType ) | ( rulePrimitiveCharacterType ) | ( rulePrimitiveStringType ) | ( rulePrimitiveInstanceType ) );
+    public final void rule__OtherPrimitiveType__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10655:1: ( ( rulePrimitiveBooleanType ) | ( rulePrimitiveCharacterType ) | ( rulePrimitiveStringType ) | ( rulePrimitiveInstanceType ) )
+            int alt179=4;
+            switch ( input.LA(1) ) {
+            case 73:
+            case 74:
+                {
+                alt179=1;
+                }
+                break;
+            case 232:
+                {
+                alt179=2;
+                }
+                break;
+            case 233:
+                {
+                alt179=3;
+                }
+                break;
+            case 15:
+            case 17:
+            case 18:
+            case 39:
+            case 163:
+            case 164:
+                {
+                alt179=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 179, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt179) {
+                case 1 :
+                    // InternalFormalML.g:10656:2: ( rulePrimitiveBooleanType )
+                    {
+                    // InternalFormalML.g:10656:2: ( rulePrimitiveBooleanType )
+                    // InternalFormalML.g:10657:3: rulePrimitiveBooleanType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveBooleanTypeParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveBooleanType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveBooleanTypeParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10662:2: ( rulePrimitiveCharacterType )
+                    {
+                    // InternalFormalML.g:10662:2: ( rulePrimitiveCharacterType )
+                    // InternalFormalML.g:10663:3: rulePrimitiveCharacterType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveCharacterTypeParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveCharacterType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveCharacterTypeParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10668:2: ( rulePrimitiveStringType )
+                    {
+                    // InternalFormalML.g:10668:2: ( rulePrimitiveStringType )
+                    // InternalFormalML.g:10669:3: rulePrimitiveStringType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveStringTypeParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveStringType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveStringTypeParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10674:2: ( rulePrimitiveInstanceType )
+                    {
+                    // InternalFormalML.g:10674:2: ( rulePrimitiveInstanceType )
+                    // InternalFormalML.g:10675:3: rulePrimitiveInstanceType
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveInstanceTypeParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimitiveInstanceType();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveInstanceTypeParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPrimitiveType__Alternatives"
+
+
+    // $ANTLR start "rule__PrimitiveBooleanType__Alternatives_1"
+    // InternalFormalML.g:10684:1: rule__PrimitiveBooleanType__Alternatives_1 : ( ( 'boolean' ) | ( 'bool' ) );
+    public final void rule__PrimitiveBooleanType__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10688:1: ( ( 'boolean' ) | ( 'bool' ) )
+            int alt180=2;
+            int LA180_0 = input.LA(1);
+
+            if ( (LA180_0==73) ) {
+                alt180=1;
+            }
+            else if ( (LA180_0==74) ) {
+                alt180=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 180, 0, input);
+
+                throw nvae;
+            }
+            switch (alt180) {
+                case 1 :
+                    // InternalFormalML.g:10689:2: ( 'boolean' )
+                    {
+                    // InternalFormalML.g:10689:2: ( 'boolean' )
+                    // InternalFormalML.g:10690:3: 'boolean'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveBooleanTypeAccess().getBooleanKeyword_1_0()); 
+                    }
+                    match(input,73,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveBooleanTypeAccess().getBooleanKeyword_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10695:2: ( 'bool' )
+                    {
+                    // InternalFormalML.g:10695:2: ( 'bool' )
+                    // InternalFormalML.g:10696:3: 'bool'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveBooleanTypeAccess().getBoolKeyword_1_1()); 
+                    }
+                    match(input,74,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveBooleanTypeAccess().getBoolKeyword_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveBooleanType__Alternatives_1"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Alternatives_2"
+    // InternalFormalML.g:10705:1: rule__PrimitiveStringType__Alternatives_2 : ( ( ( rule__PrimitiveStringType__Group_2_0__0 ) ) | ( ( rule__PrimitiveStringType__Group_2_1__0 ) ) );
+    public final void rule__PrimitiveStringType__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10709:1: ( ( ( rule__PrimitiveStringType__Group_2_0__0 ) ) | ( ( rule__PrimitiveStringType__Group_2_1__0 ) ) )
+            int alt181=2;
+            int LA181_0 = input.LA(1);
+
+            if ( (LA181_0==31) ) {
+                alt181=1;
+            }
+            else if ( (LA181_0==125) ) {
+                alt181=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 181, 0, input);
+
+                throw nvae;
+            }
+            switch (alt181) {
+                case 1 :
+                    // InternalFormalML.g:10710:2: ( ( rule__PrimitiveStringType__Group_2_0__0 ) )
+                    {
+                    // InternalFormalML.g:10710:2: ( ( rule__PrimitiveStringType__Group_2_0__0 ) )
+                    // InternalFormalML.g:10711:3: ( rule__PrimitiveStringType__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_0()); 
+                    }
+                    // InternalFormalML.g:10712:3: ( rule__PrimitiveStringType__Group_2_0__0 )
+                    // InternalFormalML.g:10712:4: rule__PrimitiveStringType__Group_2_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveStringType__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10716:2: ( ( rule__PrimitiveStringType__Group_2_1__0 ) )
+                    {
+                    // InternalFormalML.g:10716:2: ( ( rule__PrimitiveStringType__Group_2_1__0 ) )
+                    // InternalFormalML.g:10717:3: ( rule__PrimitiveStringType__Group_2_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_1()); 
+                    }
+                    // InternalFormalML.g:10718:3: ( rule__PrimitiveStringType__Group_2_1__0 )
+                    // InternalFormalML.g:10718:4: rule__PrimitiveStringType__Group_2_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveStringType__Group_2_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveStringTypeAccess().getGroup_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Alternatives_2"
+
+
+    // $ANTLR start "rule__IntervalType__Alternatives_4"
+    // InternalFormalML.g:10726:1: rule__IntervalType__Alternatives_4 : ( ( ( rule__IntervalType__LopenAssignment_4_0 ) ) | ( '[' ) );
+    public final void rule__IntervalType__Alternatives_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10730:1: ( ( ( rule__IntervalType__LopenAssignment_4_0 ) ) | ( '[' ) )
+            int alt182=2;
+            int LA182_0 = input.LA(1);
+
+            if ( (LA182_0==75) ) {
+                alt182=1;
+            }
+            else if ( (LA182_0==22) ) {
+                alt182=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 182, 0, input);
+
+                throw nvae;
+            }
+            switch (alt182) {
+                case 1 :
+                    // InternalFormalML.g:10731:2: ( ( rule__IntervalType__LopenAssignment_4_0 ) )
+                    {
+                    // InternalFormalML.g:10731:2: ( ( rule__IntervalType__LopenAssignment_4_0 ) )
+                    // InternalFormalML.g:10732:3: ( rule__IntervalType__LopenAssignment_4_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeAccess().getLopenAssignment_4_0()); 
+                    }
+                    // InternalFormalML.g:10733:3: ( rule__IntervalType__LopenAssignment_4_0 )
+                    // InternalFormalML.g:10733:4: rule__IntervalType__LopenAssignment_4_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IntervalType__LopenAssignment_4_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeAccess().getLopenAssignment_4_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10737:2: ( '[' )
+                    {
+                    // InternalFormalML.g:10737:2: ( '[' )
+                    // InternalFormalML.g:10738:3: '['
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeAccess().getLeftSquareBracketKeyword_4_1()); 
+                    }
+                    match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeAccess().getLeftSquareBracketKeyword_4_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Alternatives_4"
+
+
+    // $ANTLR start "rule__IntervalType__Alternatives_8"
+    // InternalFormalML.g:10747:1: rule__IntervalType__Alternatives_8 : ( ( ']' ) | ( ( rule__IntervalType__RopenAssignment_8_1 ) ) );
+    public final void rule__IntervalType__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10751:1: ( ( ']' ) | ( ( rule__IntervalType__RopenAssignment_8_1 ) ) )
+            int alt183=2;
+            int LA183_0 = input.LA(1);
+
+            if ( (LA183_0==75) ) {
+                alt183=1;
+            }
+            else if ( (LA183_0==22) ) {
+                alt183=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 183, 0, input);
+
+                throw nvae;
+            }
+            switch (alt183) {
+                case 1 :
+                    // InternalFormalML.g:10752:2: ( ']' )
+                    {
+                    // InternalFormalML.g:10752:2: ( ']' )
+                    // InternalFormalML.g:10753:3: ']'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeAccess().getRightSquareBracketKeyword_8_0()); 
+                    }
+                    match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeAccess().getRightSquareBracketKeyword_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10758:2: ( ( rule__IntervalType__RopenAssignment_8_1 ) )
+                    {
+                    // InternalFormalML.g:10758:2: ( ( rule__IntervalType__RopenAssignment_8_1 ) )
+                    // InternalFormalML.g:10759:3: ( rule__IntervalType__RopenAssignment_8_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeAccess().getRopenAssignment_8_1()); 
+                    }
+                    // InternalFormalML.g:10760:3: ( rule__IntervalType__RopenAssignment_8_1 )
+                    // InternalFormalML.g:10760:4: rule__IntervalType__RopenAssignment_8_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IntervalType__RopenAssignment_8_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeAccess().getRopenAssignment_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Alternatives_8"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Alternatives_8"
+    // InternalFormalML.g:10768:1: rule__IntervalTypeDefinition__Alternatives_8 : ( ( ( rule__IntervalTypeDefinition__LopenAssignment_8_0 ) ) | ( '[' ) );
+    public final void rule__IntervalTypeDefinition__Alternatives_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10772:1: ( ( ( rule__IntervalTypeDefinition__LopenAssignment_8_0 ) ) | ( '[' ) )
+            int alt184=2;
+            int LA184_0 = input.LA(1);
+
+            if ( (LA184_0==75) ) {
+                alt184=1;
+            }
+            else if ( (LA184_0==22) ) {
+                alt184=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 184, 0, input);
+
+                throw nvae;
+            }
+            switch (alt184) {
+                case 1 :
+                    // InternalFormalML.g:10773:2: ( ( rule__IntervalTypeDefinition__LopenAssignment_8_0 ) )
+                    {
+                    // InternalFormalML.g:10773:2: ( ( rule__IntervalTypeDefinition__LopenAssignment_8_0 ) )
+                    // InternalFormalML.g:10774:3: ( rule__IntervalTypeDefinition__LopenAssignment_8_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeDefinitionAccess().getLopenAssignment_8_0()); 
+                    }
+                    // InternalFormalML.g:10775:3: ( rule__IntervalTypeDefinition__LopenAssignment_8_0 )
+                    // InternalFormalML.g:10775:4: rule__IntervalTypeDefinition__LopenAssignment_8_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IntervalTypeDefinition__LopenAssignment_8_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeDefinitionAccess().getLopenAssignment_8_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10779:2: ( '[' )
+                    {
+                    // InternalFormalML.g:10779:2: ( '[' )
+                    // InternalFormalML.g:10780:3: '['
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeDefinitionAccess().getLeftSquareBracketKeyword_8_1()); 
+                    }
+                    match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeDefinitionAccess().getLeftSquareBracketKeyword_8_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Alternatives_8"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Alternatives_12"
+    // InternalFormalML.g:10789:1: rule__IntervalTypeDefinition__Alternatives_12 : ( ( ']' ) | ( ( rule__IntervalTypeDefinition__RopenAssignment_12_1 ) ) );
+    public final void rule__IntervalTypeDefinition__Alternatives_12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10793:1: ( ( ']' ) | ( ( rule__IntervalTypeDefinition__RopenAssignment_12_1 ) ) )
+            int alt185=2;
+            int LA185_0 = input.LA(1);
+
+            if ( (LA185_0==75) ) {
+                alt185=1;
+            }
+            else if ( (LA185_0==22) ) {
+                alt185=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 185, 0, input);
+
+                throw nvae;
+            }
+            switch (alt185) {
+                case 1 :
+                    // InternalFormalML.g:10794:2: ( ']' )
+                    {
+                    // InternalFormalML.g:10794:2: ( ']' )
+                    // InternalFormalML.g:10795:3: ']'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeDefinitionAccess().getRightSquareBracketKeyword_12_0()); 
+                    }
+                    match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeDefinitionAccess().getRightSquareBracketKeyword_12_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10800:2: ( ( rule__IntervalTypeDefinition__RopenAssignment_12_1 ) )
+                    {
+                    // InternalFormalML.g:10800:2: ( ( rule__IntervalTypeDefinition__RopenAssignment_12_1 ) )
+                    // InternalFormalML.g:10801:3: ( rule__IntervalTypeDefinition__RopenAssignment_12_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeDefinitionAccess().getRopenAssignment_12_1()); 
+                    }
+                    // InternalFormalML.g:10802:3: ( rule__IntervalTypeDefinition__RopenAssignment_12_1 )
+                    // InternalFormalML.g:10802:4: rule__IntervalTypeDefinition__RopenAssignment_12_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IntervalTypeDefinition__RopenAssignment_12_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeDefinitionAccess().getRopenAssignment_12_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Alternatives_12"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Alternatives_6"
+    // InternalFormalML.g:10810:1: rule__IntervalTypeDefinitionImpl__Alternatives_6 : ( ( ( rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0 ) ) | ( '[' ) );
+    public final void rule__IntervalTypeDefinitionImpl__Alternatives_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10814:1: ( ( ( rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0 ) ) | ( '[' ) )
+            int alt186=2;
+            int LA186_0 = input.LA(1);
+
+            if ( (LA186_0==75) ) {
+                alt186=1;
+            }
+            else if ( (LA186_0==22) ) {
+                alt186=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 186, 0, input);
+
+                throw nvae;
+            }
+            switch (alt186) {
+                case 1 :
+                    // InternalFormalML.g:10815:2: ( ( rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0 ) )
+                    {
+                    // InternalFormalML.g:10815:2: ( ( rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0 ) )
+                    // InternalFormalML.g:10816:3: ( rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenAssignment_6_0()); 
+                    }
+                    // InternalFormalML.g:10817:3: ( rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0 )
+                    // InternalFormalML.g:10817:4: rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenAssignment_6_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10821:2: ( '[' )
+                    {
+                    // InternalFormalML.g:10821:2: ( '[' )
+                    // InternalFormalML.g:10822:3: '['
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLeftSquareBracketKeyword_6_1()); 
+                    }
+                    match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLeftSquareBracketKeyword_6_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Alternatives_6"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Alternatives_10"
+    // InternalFormalML.g:10831:1: rule__IntervalTypeDefinitionImpl__Alternatives_10 : ( ( ']' ) | ( ( rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1 ) ) );
+    public final void rule__IntervalTypeDefinitionImpl__Alternatives_10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10835:1: ( ( ']' ) | ( ( rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1 ) ) )
+            int alt187=2;
+            int LA187_0 = input.LA(1);
+
+            if ( (LA187_0==75) ) {
+                alt187=1;
+            }
+            else if ( (LA187_0==22) ) {
+                alt187=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 187, 0, input);
+
+                throw nvae;
+            }
+            switch (alt187) {
+                case 1 :
+                    // InternalFormalML.g:10836:2: ( ']' )
+                    {
+                    // InternalFormalML.g:10836:2: ( ']' )
+                    // InternalFormalML.g:10837:3: ']'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeDefinitionImplAccess().getRightSquareBracketKeyword_10_0()); 
+                    }
+                    match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeDefinitionImplAccess().getRightSquareBracketKeyword_10_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10842:2: ( ( rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1 ) )
+                    {
+                    // InternalFormalML.g:10842:2: ( ( rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1 ) )
+                    // InternalFormalML.g:10843:3: ( rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenAssignment_10_1()); 
+                    }
+                    // InternalFormalML.g:10844:3: ( rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1 )
+                    // InternalFormalML.g:10844:4: rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenAssignment_10_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Alternatives_10"
+
+
+    // $ANTLR start "rule__CollectionType__Alternatives_4_1"
+    // InternalFormalML.g:10852:1: rule__CollectionType__Alternatives_4_1 : ( ( ( rule__CollectionType__SizeAssignment_4_1_0 ) ) | ( ( rule__CollectionType__UnboundedAssignment_4_1_1 ) ) );
+    public final void rule__CollectionType__Alternatives_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10856:1: ( ( ( rule__CollectionType__SizeAssignment_4_1_0 ) ) | ( ( rule__CollectionType__UnboundedAssignment_4_1_1 ) ) )
+            int alt188=2;
+            int LA188_0 = input.LA(1);
+
+            if ( (LA188_0==RULE_INT||LA188_0==132) ) {
+                alt188=1;
+            }
+            else if ( (LA188_0==58) ) {
+                alt188=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 188, 0, input);
+
+                throw nvae;
+            }
+            switch (alt188) {
+                case 1 :
+                    // InternalFormalML.g:10857:2: ( ( rule__CollectionType__SizeAssignment_4_1_0 ) )
+                    {
+                    // InternalFormalML.g:10857:2: ( ( rule__CollectionType__SizeAssignment_4_1_0 ) )
+                    // InternalFormalML.g:10858:3: ( rule__CollectionType__SizeAssignment_4_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionTypeAccess().getSizeAssignment_4_1_0()); 
+                    }
+                    // InternalFormalML.g:10859:3: ( rule__CollectionType__SizeAssignment_4_1_0 )
+                    // InternalFormalML.g:10859:4: rule__CollectionType__SizeAssignment_4_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionType__SizeAssignment_4_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionTypeAccess().getSizeAssignment_4_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10863:2: ( ( rule__CollectionType__UnboundedAssignment_4_1_1 ) )
+                    {
+                    // InternalFormalML.g:10863:2: ( ( rule__CollectionType__UnboundedAssignment_4_1_1 ) )
+                    // InternalFormalML.g:10864:3: ( rule__CollectionType__UnboundedAssignment_4_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionTypeAccess().getUnboundedAssignment_4_1_1()); 
+                    }
+                    // InternalFormalML.g:10865:3: ( rule__CollectionType__UnboundedAssignment_4_1_1 )
+                    // InternalFormalML.g:10865:4: rule__CollectionType__UnboundedAssignment_4_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionType__UnboundedAssignment_4_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionTypeAccess().getUnboundedAssignment_4_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Alternatives_4_1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Alternatives_8_1"
+    // InternalFormalML.g:10873:1: rule__CollectionTypeDefinition__Alternatives_8_1 : ( ( ( rule__CollectionTypeDefinition__SizeAssignment_8_1_0 ) ) | ( ( rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1 ) ) );
+    public final void rule__CollectionTypeDefinition__Alternatives_8_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10877:1: ( ( ( rule__CollectionTypeDefinition__SizeAssignment_8_1_0 ) ) | ( ( rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1 ) ) )
+            int alt189=2;
+            int LA189_0 = input.LA(1);
+
+            if ( (LA189_0==RULE_INT||LA189_0==132) ) {
+                alt189=1;
+            }
+            else if ( (LA189_0==58) ) {
+                alt189=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 189, 0, input);
+
+                throw nvae;
+            }
+            switch (alt189) {
+                case 1 :
+                    // InternalFormalML.g:10878:2: ( ( rule__CollectionTypeDefinition__SizeAssignment_8_1_0 ) )
+                    {
+                    // InternalFormalML.g:10878:2: ( ( rule__CollectionTypeDefinition__SizeAssignment_8_1_0 ) )
+                    // InternalFormalML.g:10879:3: ( rule__CollectionTypeDefinition__SizeAssignment_8_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionTypeDefinitionAccess().getSizeAssignment_8_1_0()); 
+                    }
+                    // InternalFormalML.g:10880:3: ( rule__CollectionTypeDefinition__SizeAssignment_8_1_0 )
+                    // InternalFormalML.g:10880:4: rule__CollectionTypeDefinition__SizeAssignment_8_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionTypeDefinition__SizeAssignment_8_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionTypeDefinitionAccess().getSizeAssignment_8_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10884:2: ( ( rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1 ) )
+                    {
+                    // InternalFormalML.g:10884:2: ( ( rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1 ) )
+                    // InternalFormalML.g:10885:3: ( rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAssignment_8_1_1()); 
+                    }
+                    // InternalFormalML.g:10886:3: ( rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1 )
+                    // InternalFormalML.g:10886:4: rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAssignment_8_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Alternatives_8_1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Alternatives_6_1"
+    // InternalFormalML.g:10894:1: rule__CollectionTypeDefinitionImpl__Alternatives_6_1 : ( ( ( rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0 ) ) | ( ( rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1 ) ) );
+    public final void rule__CollectionTypeDefinitionImpl__Alternatives_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10898:1: ( ( ( rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0 ) ) | ( ( rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1 ) ) )
+            int alt190=2;
+            int LA190_0 = input.LA(1);
+
+            if ( (LA190_0==RULE_INT||LA190_0==132) ) {
+                alt190=1;
+            }
+            else if ( (LA190_0==58) ) {
+                alt190=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 190, 0, input);
+
+                throw nvae;
+            }
+            switch (alt190) {
+                case 1 :
+                    // InternalFormalML.g:10899:2: ( ( rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0 ) )
+                    {
+                    // InternalFormalML.g:10899:2: ( ( rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0 ) )
+                    // InternalFormalML.g:10900:3: ( rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeAssignment_6_1_0()); 
+                    }
+                    // InternalFormalML.g:10901:3: ( rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0 )
+                    // InternalFormalML.g:10901:4: rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeAssignment_6_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10905:2: ( ( rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1 ) )
+                    {
+                    // InternalFormalML.g:10905:2: ( ( rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1 ) )
+                    // InternalFormalML.g:10906:3: ( rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAssignment_6_1_1()); 
+                    }
+                    // InternalFormalML.g:10907:3: ( rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1 )
+                    // InternalFormalML.g:10907:4: rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAssignment_6_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Alternatives_6_1"
+
+
+    // $ANTLR start "rule__Variable__Alternatives_1"
+    // InternalFormalML.g:10915:1: rule__Variable__Alternatives_1 : ( ( 'var' ) | ( ( rule__Variable__ConstAssignment_1_1 ) ) | ( ( rule__Variable__Group_1_2__0 ) ) | ( ( rule__Variable__Group_1_3__0 ) ) );
+    public final void rule__Variable__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10919:1: ( ( 'var' ) | ( ( rule__Variable__ConstAssignment_1_1 ) ) | ( ( rule__Variable__Group_1_2__0 ) ) | ( ( rule__Variable__Group_1_3__0 ) ) )
+            int alt191=4;
+            switch ( input.LA(1) ) {
+            case 16:
+                {
+                alt191=1;
+                }
+                break;
+            case 282:
+                {
+                alt191=2;
+                }
+                break;
+            case 179:
+            case 283:
+                {
+                alt191=3;
+                }
+                break;
+            case 224:
+                {
+                alt191=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 191, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt191) {
+                case 1 :
+                    // InternalFormalML.g:10920:2: ( 'var' )
+                    {
+                    // InternalFormalML.g:10920:2: ( 'var' )
+                    // InternalFormalML.g:10921:3: 'var'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getVarKeyword_1_0()); 
+                    }
+                    match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getVarKeyword_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10926:2: ( ( rule__Variable__ConstAssignment_1_1 ) )
+                    {
+                    // InternalFormalML.g:10926:2: ( ( rule__Variable__ConstAssignment_1_1 ) )
+                    // InternalFormalML.g:10927:3: ( rule__Variable__ConstAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getConstAssignment_1_1()); 
+                    }
+                    // InternalFormalML.g:10928:3: ( rule__Variable__ConstAssignment_1_1 )
+                    // InternalFormalML.g:10928:4: rule__Variable__ConstAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__ConstAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getConstAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10932:2: ( ( rule__Variable__Group_1_2__0 ) )
+                    {
+                    // InternalFormalML.g:10932:2: ( ( rule__Variable__Group_1_2__0 ) )
+                    // InternalFormalML.g:10933:3: ( rule__Variable__Group_1_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getGroup_1_2()); 
+                    }
+                    // InternalFormalML.g:10934:3: ( rule__Variable__Group_1_2__0 )
+                    // InternalFormalML.g:10934:4: rule__Variable__Group_1_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__Group_1_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getGroup_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10938:2: ( ( rule__Variable__Group_1_3__0 ) )
+                    {
+                    // InternalFormalML.g:10938:2: ( ( rule__Variable__Group_1_3__0 ) )
+                    // InternalFormalML.g:10939:3: ( rule__Variable__Group_1_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getGroup_1_3()); 
+                    }
+                    // InternalFormalML.g:10940:3: ( rule__Variable__Group_1_3__0 )
+                    // InternalFormalML.g:10940:4: rule__Variable__Group_1_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__Group_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getGroup_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Alternatives_1"
+
+
+    // $ANTLR start "rule__Variable__Alternatives_1_2_0"
+    // InternalFormalML.g:10948:1: rule__Variable__Alternatives_1_2_0 : ( ( ( rule__Variable__ConstAssignment_1_2_0_0 ) ) | ( ( rule__Variable__ConstAssignment_1_2_0_1 ) ) );
+    public final void rule__Variable__Alternatives_1_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10952:1: ( ( ( rule__Variable__ConstAssignment_1_2_0_0 ) ) | ( ( rule__Variable__ConstAssignment_1_2_0_1 ) ) )
+            int alt192=2;
+            int LA192_0 = input.LA(1);
+
+            if ( (LA192_0==283) ) {
+                alt192=1;
+            }
+            else if ( (LA192_0==179) ) {
+                alt192=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 192, 0, input);
+
+                throw nvae;
+            }
+            switch (alt192) {
+                case 1 :
+                    // InternalFormalML.g:10953:2: ( ( rule__Variable__ConstAssignment_1_2_0_0 ) )
+                    {
+                    // InternalFormalML.g:10953:2: ( ( rule__Variable__ConstAssignment_1_2_0_0 ) )
+                    // InternalFormalML.g:10954:3: ( rule__Variable__ConstAssignment_1_2_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_0()); 
+                    }
+                    // InternalFormalML.g:10955:3: ( rule__Variable__ConstAssignment_1_2_0_0 )
+                    // InternalFormalML.g:10955:4: rule__Variable__ConstAssignment_1_2_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__ConstAssignment_1_2_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10959:2: ( ( rule__Variable__ConstAssignment_1_2_0_1 ) )
+                    {
+                    // InternalFormalML.g:10959:2: ( ( rule__Variable__ConstAssignment_1_2_0_1 ) )
+                    // InternalFormalML.g:10960:3: ( rule__Variable__ConstAssignment_1_2_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_1()); 
+                    }
+                    // InternalFormalML.g:10961:3: ( rule__Variable__ConstAssignment_1_2_0_1 )
+                    // InternalFormalML.g:10961:4: rule__Variable__ConstAssignment_1_2_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__ConstAssignment_1_2_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getConstAssignment_1_2_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Alternatives_1_2_0"
+
+
+    // $ANTLR start "rule__Variable__Alternatives_1_3_1"
+    // InternalFormalML.g:10969:1: rule__Variable__Alternatives_1_3_1 : ( ( 'var' ) | ( ( rule__Variable__ConstAssignment_1_3_1_1 ) ) );
+    public final void rule__Variable__Alternatives_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10973:1: ( ( 'var' ) | ( ( rule__Variable__ConstAssignment_1_3_1_1 ) ) )
+            int alt193=2;
+            int LA193_0 = input.LA(1);
+
+            if ( (LA193_0==16) ) {
+                alt193=1;
+            }
+            else if ( (LA193_0==282) ) {
+                alt193=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 193, 0, input);
+
+                throw nvae;
+            }
+            switch (alt193) {
+                case 1 :
+                    // InternalFormalML.g:10974:2: ( 'var' )
+                    {
+                    // InternalFormalML.g:10974:2: ( 'var' )
+                    // InternalFormalML.g:10975:3: 'var'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getVarKeyword_1_3_1_0()); 
+                    }
+                    match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getVarKeyword_1_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10980:2: ( ( rule__Variable__ConstAssignment_1_3_1_1 ) )
+                    {
+                    // InternalFormalML.g:10980:2: ( ( rule__Variable__ConstAssignment_1_3_1_1 ) )
+                    // InternalFormalML.g:10981:3: ( rule__Variable__ConstAssignment_1_3_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getConstAssignment_1_3_1_1()); 
+                    }
+                    // InternalFormalML.g:10982:3: ( rule__Variable__ConstAssignment_1_3_1_1 )
+                    // InternalFormalML.g:10982:4: rule__Variable__ConstAssignment_1_3_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__ConstAssignment_1_3_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getConstAssignment_1_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Alternatives_1_3_1"
+
+
+    // $ANTLR start "rule__Variable__Alternatives_6"
+    // InternalFormalML.g:10990:1: rule__Variable__Alternatives_6 : ( ( ( rule__Variable__Group_6_0__0 ) ) | ( ';' ) );
+    public final void rule__Variable__Alternatives_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:10994:1: ( ( ( rule__Variable__Group_6_0__0 ) ) | ( ';' ) )
+            int alt194=2;
+            int LA194_0 = input.LA(1);
+
+            if ( (LA194_0==199) ) {
+                alt194=1;
+            }
+            else if ( (LA194_0==45) ) {
+                alt194=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 194, 0, input);
+
+                throw nvae;
+            }
+            switch (alt194) {
+                case 1 :
+                    // InternalFormalML.g:10995:2: ( ( rule__Variable__Group_6_0__0 ) )
+                    {
+                    // InternalFormalML.g:10995:2: ( ( rule__Variable__Group_6_0__0 ) )
+                    // InternalFormalML.g:10996:3: ( rule__Variable__Group_6_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getGroup_6_0()); 
+                    }
+                    // InternalFormalML.g:10997:3: ( rule__Variable__Group_6_0__0 )
+                    // InternalFormalML.g:10997:4: rule__Variable__Group_6_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__Group_6_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getGroup_6_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11001:2: ( ';' )
+                    {
+                    // InternalFormalML.g:11001:2: ( ';' )
+                    // InternalFormalML.g:11002:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getSemicolonKeyword_6_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getSemicolonKeyword_6_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Alternatives_6"
+
+
+    // $ANTLR start "rule__VariablePublic__Alternatives_1_0"
+    // InternalFormalML.g:11011:1: rule__VariablePublic__Alternatives_1_0 : ( ( ( rule__VariablePublic__ConstAssignment_1_0_0 ) ) | ( ( rule__VariablePublic__ConstAssignment_1_0_1 ) ) );
+    public final void rule__VariablePublic__Alternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11015:1: ( ( ( rule__VariablePublic__ConstAssignment_1_0_0 ) ) | ( ( rule__VariablePublic__ConstAssignment_1_0_1 ) ) )
+            int alt195=2;
+            int LA195_0 = input.LA(1);
+
+            if ( (LA195_0==283) ) {
+                alt195=1;
+            }
+            else if ( (LA195_0==179) ) {
+                alt195=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 195, 0, input);
+
+                throw nvae;
+            }
+            switch (alt195) {
+                case 1 :
+                    // InternalFormalML.g:11016:2: ( ( rule__VariablePublic__ConstAssignment_1_0_0 ) )
+                    {
+                    // InternalFormalML.g:11016:2: ( ( rule__VariablePublic__ConstAssignment_1_0_0 ) )
+                    // InternalFormalML.g:11017:3: ( rule__VariablePublic__ConstAssignment_1_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_0()); 
+                    }
+                    // InternalFormalML.g:11018:3: ( rule__VariablePublic__ConstAssignment_1_0_0 )
+                    // InternalFormalML.g:11018:4: rule__VariablePublic__ConstAssignment_1_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__ConstAssignment_1_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11022:2: ( ( rule__VariablePublic__ConstAssignment_1_0_1 ) )
+                    {
+                    // InternalFormalML.g:11022:2: ( ( rule__VariablePublic__ConstAssignment_1_0_1 ) )
+                    // InternalFormalML.g:11023:3: ( rule__VariablePublic__ConstAssignment_1_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_1()); 
+                    }
+                    // InternalFormalML.g:11024:3: ( rule__VariablePublic__ConstAssignment_1_0_1 )
+                    // InternalFormalML.g:11024:4: rule__VariablePublic__ConstAssignment_1_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__ConstAssignment_1_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePublicAccess().getConstAssignment_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Alternatives_1_0"
+
+
+    // $ANTLR start "rule__VariablePublic__Alternatives_7"
+    // InternalFormalML.g:11032:1: rule__VariablePublic__Alternatives_7 : ( ( ( rule__VariablePublic__Group_7_0__0 ) ) | ( ';' ) );
+    public final void rule__VariablePublic__Alternatives_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11036:1: ( ( ( rule__VariablePublic__Group_7_0__0 ) ) | ( ';' ) )
+            int alt196=2;
+            int LA196_0 = input.LA(1);
+
+            if ( (LA196_0==199) ) {
+                alt196=1;
+            }
+            else if ( (LA196_0==45) ) {
+                alt196=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 196, 0, input);
+
+                throw nvae;
+            }
+            switch (alt196) {
+                case 1 :
+                    // InternalFormalML.g:11037:2: ( ( rule__VariablePublic__Group_7_0__0 ) )
+                    {
+                    // InternalFormalML.g:11037:2: ( ( rule__VariablePublic__Group_7_0__0 ) )
+                    // InternalFormalML.g:11038:3: ( rule__VariablePublic__Group_7_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePublicAccess().getGroup_7_0()); 
+                    }
+                    // InternalFormalML.g:11039:3: ( rule__VariablePublic__Group_7_0__0 )
+                    // InternalFormalML.g:11039:4: rule__VariablePublic__Group_7_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__Group_7_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePublicAccess().getGroup_7_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11043:2: ( ';' )
+                    {
+                    // InternalFormalML.g:11043:2: ( ';' )
+                    // InternalFormalML.g:11044:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePublicAccess().getSemicolonKeyword_7_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePublicAccess().getSemicolonKeyword_7_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Alternatives_7"
+
+
+    // $ANTLR start "rule__VariableProtected__Alternatives_1_0"
+    // InternalFormalML.g:11053:1: rule__VariableProtected__Alternatives_1_0 : ( ( ( rule__VariableProtected__ConstAssignment_1_0_0 ) ) | ( ( rule__VariableProtected__ConstAssignment_1_0_1 ) ) );
+    public final void rule__VariableProtected__Alternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11057:1: ( ( ( rule__VariableProtected__ConstAssignment_1_0_0 ) ) | ( ( rule__VariableProtected__ConstAssignment_1_0_1 ) ) )
+            int alt197=2;
+            int LA197_0 = input.LA(1);
+
+            if ( (LA197_0==283) ) {
+                alt197=1;
+            }
+            else if ( (LA197_0==179) ) {
+                alt197=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 197, 0, input);
+
+                throw nvae;
+            }
+            switch (alt197) {
+                case 1 :
+                    // InternalFormalML.g:11058:2: ( ( rule__VariableProtected__ConstAssignment_1_0_0 ) )
+                    {
+                    // InternalFormalML.g:11058:2: ( ( rule__VariableProtected__ConstAssignment_1_0_0 ) )
+                    // InternalFormalML.g:11059:3: ( rule__VariableProtected__ConstAssignment_1_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_0()); 
+                    }
+                    // InternalFormalML.g:11060:3: ( rule__VariableProtected__ConstAssignment_1_0_0 )
+                    // InternalFormalML.g:11060:4: rule__VariableProtected__ConstAssignment_1_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__ConstAssignment_1_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11064:2: ( ( rule__VariableProtected__ConstAssignment_1_0_1 ) )
+                    {
+                    // InternalFormalML.g:11064:2: ( ( rule__VariableProtected__ConstAssignment_1_0_1 ) )
+                    // InternalFormalML.g:11065:3: ( rule__VariableProtected__ConstAssignment_1_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_1()); 
+                    }
+                    // InternalFormalML.g:11066:3: ( rule__VariableProtected__ConstAssignment_1_0_1 )
+                    // InternalFormalML.g:11066:4: rule__VariableProtected__ConstAssignment_1_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__ConstAssignment_1_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableProtectedAccess().getConstAssignment_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Alternatives_1_0"
+
+
+    // $ANTLR start "rule__VariableProtected__Alternatives_7"
+    // InternalFormalML.g:11074:1: rule__VariableProtected__Alternatives_7 : ( ( ( rule__VariableProtected__Group_7_0__0 ) ) | ( ';' ) );
+    public final void rule__VariableProtected__Alternatives_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11078:1: ( ( ( rule__VariableProtected__Group_7_0__0 ) ) | ( ';' ) )
+            int alt198=2;
+            int LA198_0 = input.LA(1);
+
+            if ( (LA198_0==199) ) {
+                alt198=1;
+            }
+            else if ( (LA198_0==45) ) {
+                alt198=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 198, 0, input);
+
+                throw nvae;
+            }
+            switch (alt198) {
+                case 1 :
+                    // InternalFormalML.g:11079:2: ( ( rule__VariableProtected__Group_7_0__0 ) )
+                    {
+                    // InternalFormalML.g:11079:2: ( ( rule__VariableProtected__Group_7_0__0 ) )
+                    // InternalFormalML.g:11080:3: ( rule__VariableProtected__Group_7_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableProtectedAccess().getGroup_7_0()); 
+                    }
+                    // InternalFormalML.g:11081:3: ( rule__VariableProtected__Group_7_0__0 )
+                    // InternalFormalML.g:11081:4: rule__VariableProtected__Group_7_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__Group_7_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableProtectedAccess().getGroup_7_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11085:2: ( ';' )
+                    {
+                    // InternalFormalML.g:11085:2: ( ';' )
+                    // InternalFormalML.g:11086:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableProtectedAccess().getSemicolonKeyword_7_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableProtectedAccess().getSemicolonKeyword_7_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Alternatives_7"
+
+
+    // $ANTLR start "rule__VariablePrivate__Alternatives_1_0"
+    // InternalFormalML.g:11095:1: rule__VariablePrivate__Alternatives_1_0 : ( ( ( rule__VariablePrivate__ConstAssignment_1_0_0 ) ) | ( ( rule__VariablePrivate__ConstAssignment_1_0_1 ) ) );
+    public final void rule__VariablePrivate__Alternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11099:1: ( ( ( rule__VariablePrivate__ConstAssignment_1_0_0 ) ) | ( ( rule__VariablePrivate__ConstAssignment_1_0_1 ) ) )
+            int alt199=2;
+            int LA199_0 = input.LA(1);
+
+            if ( (LA199_0==283) ) {
+                alt199=1;
+            }
+            else if ( (LA199_0==179) ) {
+                alt199=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 199, 0, input);
+
+                throw nvae;
+            }
+            switch (alt199) {
+                case 1 :
+                    // InternalFormalML.g:11100:2: ( ( rule__VariablePrivate__ConstAssignment_1_0_0 ) )
+                    {
+                    // InternalFormalML.g:11100:2: ( ( rule__VariablePrivate__ConstAssignment_1_0_0 ) )
+                    // InternalFormalML.g:11101:3: ( rule__VariablePrivate__ConstAssignment_1_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_0()); 
+                    }
+                    // InternalFormalML.g:11102:3: ( rule__VariablePrivate__ConstAssignment_1_0_0 )
+                    // InternalFormalML.g:11102:4: rule__VariablePrivate__ConstAssignment_1_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__ConstAssignment_1_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11106:2: ( ( rule__VariablePrivate__ConstAssignment_1_0_1 ) )
+                    {
+                    // InternalFormalML.g:11106:2: ( ( rule__VariablePrivate__ConstAssignment_1_0_1 ) )
+                    // InternalFormalML.g:11107:3: ( rule__VariablePrivate__ConstAssignment_1_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_1()); 
+                    }
+                    // InternalFormalML.g:11108:3: ( rule__VariablePrivate__ConstAssignment_1_0_1 )
+                    // InternalFormalML.g:11108:4: rule__VariablePrivate__ConstAssignment_1_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__ConstAssignment_1_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePrivateAccess().getConstAssignment_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Alternatives_1_0"
+
+
+    // $ANTLR start "rule__VariablePrivate__Alternatives_7"
+    // InternalFormalML.g:11116:1: rule__VariablePrivate__Alternatives_7 : ( ( ( rule__VariablePrivate__Group_7_0__0 ) ) | ( ';' ) );
+    public final void rule__VariablePrivate__Alternatives_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11120:1: ( ( ( rule__VariablePrivate__Group_7_0__0 ) ) | ( ';' ) )
+            int alt200=2;
+            int LA200_0 = input.LA(1);
+
+            if ( (LA200_0==199) ) {
+                alt200=1;
+            }
+            else if ( (LA200_0==45) ) {
+                alt200=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 200, 0, input);
+
+                throw nvae;
+            }
+            switch (alt200) {
+                case 1 :
+                    // InternalFormalML.g:11121:2: ( ( rule__VariablePrivate__Group_7_0__0 ) )
+                    {
+                    // InternalFormalML.g:11121:2: ( ( rule__VariablePrivate__Group_7_0__0 ) )
+                    // InternalFormalML.g:11122:3: ( rule__VariablePrivate__Group_7_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePrivateAccess().getGroup_7_0()); 
+                    }
+                    // InternalFormalML.g:11123:3: ( rule__VariablePrivate__Group_7_0__0 )
+                    // InternalFormalML.g:11123:4: rule__VariablePrivate__Group_7_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__Group_7_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePrivateAccess().getGroup_7_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11127:2: ( ';' )
+                    {
+                    // InternalFormalML.g:11127:2: ( ';' )
+                    // InternalFormalML.g:11128:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePrivateAccess().getSemicolonKeyword_7_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePrivateAccess().getSemicolonKeyword_7_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Alternatives_7"
+
+
+    // $ANTLR start "rule__BufferContainerType__Alternatives_2_1"
+    // InternalFormalML.g:11137:1: rule__BufferContainerType__Alternatives_2_1 : ( ( ( rule__BufferContainerType__SizeAssignment_2_1_0 ) ) | ( ( rule__BufferContainerType__UnboundedAssignment_2_1_1 ) ) );
+    public final void rule__BufferContainerType__Alternatives_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11141:1: ( ( ( rule__BufferContainerType__SizeAssignment_2_1_0 ) ) | ( ( rule__BufferContainerType__UnboundedAssignment_2_1_1 ) ) )
+            int alt201=2;
+            int LA201_0 = input.LA(1);
+
+            if ( (LA201_0==RULE_INT||LA201_0==132) ) {
+                alt201=1;
+            }
+            else if ( (LA201_0==58) ) {
+                alt201=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 201, 0, input);
+
+                throw nvae;
+            }
+            switch (alt201) {
+                case 1 :
+                    // InternalFormalML.g:11142:2: ( ( rule__BufferContainerType__SizeAssignment_2_1_0 ) )
+                    {
+                    // InternalFormalML.g:11142:2: ( ( rule__BufferContainerType__SizeAssignment_2_1_0 ) )
+                    // InternalFormalML.g:11143:3: ( rule__BufferContainerType__SizeAssignment_2_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBufferContainerTypeAccess().getSizeAssignment_2_1_0()); 
+                    }
+                    // InternalFormalML.g:11144:3: ( rule__BufferContainerType__SizeAssignment_2_1_0 )
+                    // InternalFormalML.g:11144:4: rule__BufferContainerType__SizeAssignment_2_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferContainerType__SizeAssignment_2_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBufferContainerTypeAccess().getSizeAssignment_2_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11148:2: ( ( rule__BufferContainerType__UnboundedAssignment_2_1_1 ) )
+                    {
+                    // InternalFormalML.g:11148:2: ( ( rule__BufferContainerType__UnboundedAssignment_2_1_1 ) )
+                    // InternalFormalML.g:11149:3: ( rule__BufferContainerType__UnboundedAssignment_2_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBufferContainerTypeAccess().getUnboundedAssignment_2_1_1()); 
+                    }
+                    // InternalFormalML.g:11150:3: ( rule__BufferContainerType__UnboundedAssignment_2_1_1 )
+                    // InternalFormalML.g:11150:4: rule__BufferContainerType__UnboundedAssignment_2_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferContainerType__UnboundedAssignment_2_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBufferContainerTypeAccess().getUnboundedAssignment_2_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Alternatives_2_1"
+
+
+    // $ANTLR start "rule__Transition__Alternatives_5"
+    // InternalFormalML.g:11158:1: rule__Transition__Alternatives_5 : ( ( ( rule__Transition__Group_5_0__0 ) ) | ( ( rule__Transition__Group_5_1__0 ) ) );
+    public final void rule__Transition__Alternatives_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11162:1: ( ( ( rule__Transition__Group_5_0__0 ) ) | ( ( rule__Transition__Group_5_1__0 ) ) )
+            int alt202=2;
+            int LA202_0 = input.LA(1);
+
+            if ( (LA202_0==199) ) {
+                alt202=1;
+            }
+            else if ( (LA202_0==215) ) {
+                alt202=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 202, 0, input);
+
+                throw nvae;
+            }
+            switch (alt202) {
+                case 1 :
+                    // InternalFormalML.g:11163:2: ( ( rule__Transition__Group_5_0__0 ) )
+                    {
+                    // InternalFormalML.g:11163:2: ( ( rule__Transition__Group_5_0__0 ) )
+                    // InternalFormalML.g:11164:3: ( rule__Transition__Group_5_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getGroup_5_0()); 
+                    }
+                    // InternalFormalML.g:11165:3: ( rule__Transition__Group_5_0__0 )
+                    // InternalFormalML.g:11165:4: rule__Transition__Group_5_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Group_5_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getGroup_5_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11169:2: ( ( rule__Transition__Group_5_1__0 ) )
+                    {
+                    // InternalFormalML.g:11169:2: ( ( rule__Transition__Group_5_1__0 ) )
+                    // InternalFormalML.g:11170:3: ( rule__Transition__Group_5_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getGroup_5_1()); 
+                    }
+                    // InternalFormalML.g:11171:3: ( rule__Transition__Group_5_1__0 )
+                    // InternalFormalML.g:11171:4: rule__Transition__Group_5_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Group_5_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getGroup_5_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Alternatives_5"
+
+
+    // $ANTLR start "rule__Transition__Alternatives_5_0_1"
+    // InternalFormalML.g:11179:1: rule__Transition__Alternatives_5_0_1 : ( ( ( rule__Transition__Group_5_0_1_0__0 ) ) | ( ( rule__Transition__BehaviorAssignment_5_0_1_1 ) ) );
+    public final void rule__Transition__Alternatives_5_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11183:1: ( ( ( rule__Transition__Group_5_0_1_0__0 ) ) | ( ( rule__Transition__BehaviorAssignment_5_0_1_1 ) ) )
+            int alt203=2;
+            int LA203_0 = input.LA(1);
+
+            if ( ((LA203_0>=76 && LA203_0<=77)||(LA203_0>=240 && LA203_0<=241)||(LA203_0>=244 && LA203_0<=245)) ) {
+                alt203=1;
+            }
+            else if ( (LA203_0==EOF||LA203_0==RULE_XLIA_ID||LA203_0==23||(LA203_0>=80 && LA203_0<=95)||(LA203_0>=129 && LA203_0<=130)||(LA203_0>=141 && LA203_0<=142)||LA203_0==157||(LA203_0>=175 && LA203_0<=176)||(LA203_0>=178 && LA203_0<=196)||(LA203_0>=199 && LA203_0<=200)||(LA203_0>=246 && LA203_0<=249)||LA203_0==251||(LA203_0>=253 && LA203_0<=255)||(LA203_0>=261 && LA203_0<=262)||(LA203_0>=265 && LA203_0<=271)||(LA203_0>=284 && LA203_0<=285)) ) {
+                alt203=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 203, 0, input);
+
+                throw nvae;
+            }
+            switch (alt203) {
+                case 1 :
+                    // InternalFormalML.g:11184:2: ( ( rule__Transition__Group_5_0_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:11184:2: ( ( rule__Transition__Group_5_0_1_0__0 ) )
+                    // InternalFormalML.g:11185:3: ( rule__Transition__Group_5_0_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getGroup_5_0_1_0()); 
+                    }
+                    // InternalFormalML.g:11186:3: ( rule__Transition__Group_5_0_1_0__0 )
+                    // InternalFormalML.g:11186:4: rule__Transition__Group_5_0_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Group_5_0_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getGroup_5_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11190:2: ( ( rule__Transition__BehaviorAssignment_5_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:11190:2: ( ( rule__Transition__BehaviorAssignment_5_0_1_1 ) )
+                    // InternalFormalML.g:11191:3: ( rule__Transition__BehaviorAssignment_5_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_0_1_1()); 
+                    }
+                    // InternalFormalML.g:11192:3: ( rule__Transition__BehaviorAssignment_5_0_1_1 )
+                    // InternalFormalML.g:11192:4: rule__Transition__BehaviorAssignment_5_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__BehaviorAssignment_5_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Alternatives_5_0_1"
+
+
+    // $ANTLR start "rule__Transition__Alternatives_5_0_1_0_1"
+    // InternalFormalML.g:11200:1: rule__Transition__Alternatives_5_0_1_0_1 : ( ( ( rule__Transition__GuardAssignment_5_0_1_0_1_0 ) ) | ( '@guard:' ) );
+    public final void rule__Transition__Alternatives_5_0_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11204:1: ( ( ( rule__Transition__GuardAssignment_5_0_1_0_1_0 ) ) | ( '@guard:' ) )
+            int alt204=2;
+            int LA204_0 = input.LA(1);
+
+            if ( (LA204_0==244) ) {
+                alt204=1;
+            }
+            else if ( (LA204_0==76) ) {
+                int LA204_2 = input.LA(2);
+
+                if ( ((LA204_2>=RULE_CHARACTER && LA204_2<=RULE_INT)||LA204_2==20||(LA204_2>=22 && LA204_2<=23)||(LA204_2>=29 && LA204_2<=30)||LA204_2==125||(LA204_2>=129 && LA204_2<=134)||(LA204_2>=137 && LA204_2<=142)||LA204_2==199||LA204_2==246||(LA204_2>=248 && LA204_2<=249)||(LA204_2>=261 && LA204_2<=271)||LA204_2==287) ) {
+                    alt204=1;
+                }
+                else if ( (LA204_2==EOF||LA204_2==77||LA204_2==240||LA204_2==245) ) {
+                    alt204=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 204, 2, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 204, 0, input);
+
+                throw nvae;
+            }
+            switch (alt204) {
+                case 1 :
+                    // InternalFormalML.g:11205:2: ( ( rule__Transition__GuardAssignment_5_0_1_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:11205:2: ( ( rule__Transition__GuardAssignment_5_0_1_0_1_0 ) )
+                    // InternalFormalML.g:11206:3: ( rule__Transition__GuardAssignment_5_0_1_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getGuardAssignment_5_0_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:11207:3: ( rule__Transition__GuardAssignment_5_0_1_0_1_0 )
+                    // InternalFormalML.g:11207:4: rule__Transition__GuardAssignment_5_0_1_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__GuardAssignment_5_0_1_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getGuardAssignment_5_0_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11211:2: ( '@guard:' )
+                    {
+                    // InternalFormalML.g:11211:2: ( '@guard:' )
+                    // InternalFormalML.g:11212:3: '@guard:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getGuardKeyword_5_0_1_0_1_1()); 
+                    }
+                    match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getGuardKeyword_5_0_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Alternatives_5_0_1_0_1"
+
+
+    // $ANTLR start "rule__Transition__Alternatives_5_0_1_0_2"
+    // InternalFormalML.g:11221:1: rule__Transition__Alternatives_5_0_1_0_2 : ( ( ( rule__Transition__TguardAssignment_5_0_1_0_2_0 ) ) | ( '@tguard:' ) );
+    public final void rule__Transition__Alternatives_5_0_1_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11225:1: ( ( ( rule__Transition__TguardAssignment_5_0_1_0_2_0 ) ) | ( '@tguard:' ) )
+            int alt205=2;
+            int LA205_0 = input.LA(1);
+
+            if ( (LA205_0==245) ) {
+                alt205=1;
+            }
+            else if ( (LA205_0==77) ) {
+                int LA205_2 = input.LA(2);
+
+                if ( ((LA205_2>=RULE_CHARACTER && LA205_2<=RULE_INT)||LA205_2==20||LA205_2==23||(LA205_2>=29 && LA205_2<=30)||LA205_2==125||(LA205_2>=129 && LA205_2<=134)||(LA205_2>=137 && LA205_2<=142)||LA205_2==199||LA205_2==247||(LA205_2>=261 && LA205_2<=271)||LA205_2==287) ) {
+                    alt205=1;
+                }
+                else if ( (LA205_2==EOF||LA205_2==240) ) {
+                    alt205=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 205, 2, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 205, 0, input);
+
+                throw nvae;
+            }
+            switch (alt205) {
+                case 1 :
+                    // InternalFormalML.g:11226:2: ( ( rule__Transition__TguardAssignment_5_0_1_0_2_0 ) )
+                    {
+                    // InternalFormalML.g:11226:2: ( ( rule__Transition__TguardAssignment_5_0_1_0_2_0 ) )
+                    // InternalFormalML.g:11227:3: ( rule__Transition__TguardAssignment_5_0_1_0_2_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getTguardAssignment_5_0_1_0_2_0()); 
+                    }
+                    // InternalFormalML.g:11228:3: ( rule__Transition__TguardAssignment_5_0_1_0_2_0 )
+                    // InternalFormalML.g:11228:4: rule__Transition__TguardAssignment_5_0_1_0_2_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__TguardAssignment_5_0_1_0_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getTguardAssignment_5_0_1_0_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11232:2: ( '@tguard:' )
+                    {
+                    // InternalFormalML.g:11232:2: ( '@tguard:' )
+                    // InternalFormalML.g:11233:3: '@tguard:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getTguardKeyword_5_0_1_0_2_1()); 
+                    }
+                    match(input,77,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getTguardKeyword_5_0_1_0_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Alternatives_5_0_1_0_2"
+
+
+    // $ANTLR start "rule__Transition__Alternatives_5_1_2"
+    // InternalFormalML.g:11242:1: rule__Transition__Alternatives_5_1_2 : ( ( ( rule__Transition__Group_5_1_2_0__0 ) ) | ( ';' ) );
+    public final void rule__Transition__Alternatives_5_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11246:1: ( ( ( rule__Transition__Group_5_1_2_0__0 ) ) | ( ';' ) )
+            int alt206=2;
+            int LA206_0 = input.LA(1);
+
+            if ( (LA206_0==199) ) {
+                alt206=1;
+            }
+            else if ( (LA206_0==45) ) {
+                alt206=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 206, 0, input);
+
+                throw nvae;
+            }
+            switch (alt206) {
+                case 1 :
+                    // InternalFormalML.g:11247:2: ( ( rule__Transition__Group_5_1_2_0__0 ) )
+                    {
+                    // InternalFormalML.g:11247:2: ( ( rule__Transition__Group_5_1_2_0__0 ) )
+                    // InternalFormalML.g:11248:3: ( rule__Transition__Group_5_1_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getGroup_5_1_2_0()); 
+                    }
+                    // InternalFormalML.g:11249:3: ( rule__Transition__Group_5_1_2_0__0 )
+                    // InternalFormalML.g:11249:4: rule__Transition__Group_5_1_2_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Group_5_1_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getGroup_5_1_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11253:2: ( ';' )
+                    {
+                    // InternalFormalML.g:11253:2: ( ';' )
+                    // InternalFormalML.g:11254:3: ';'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getSemicolonKeyword_5_1_2_1()); 
+                    }
+                    match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getSemicolonKeyword_5_1_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Alternatives_5_1_2"
+
+
+    // $ANTLR start "rule__Transition__Alternatives_5_1_2_0_1"
+    // InternalFormalML.g:11263:1: rule__Transition__Alternatives_5_1_2_0_1 : ( ( ( rule__Transition__Group_5_1_2_0_1_0__0 ) ) | ( ( rule__Transition__BehaviorAssignment_5_1_2_0_1_1 ) ) );
+    public final void rule__Transition__Alternatives_5_1_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11267:1: ( ( ( rule__Transition__Group_5_1_2_0_1_0__0 ) ) | ( ( rule__Transition__BehaviorAssignment_5_1_2_0_1_1 ) ) )
+            int alt207=2;
+            int LA207_0 = input.LA(1);
+
+            if ( ((LA207_0>=76 && LA207_0<=77)||(LA207_0>=240 && LA207_0<=241)||(LA207_0>=244 && LA207_0<=245)) ) {
+                alt207=1;
+            }
+            else if ( (LA207_0==EOF||LA207_0==RULE_XLIA_ID||LA207_0==23||(LA207_0>=80 && LA207_0<=95)||(LA207_0>=129 && LA207_0<=130)||(LA207_0>=141 && LA207_0<=142)||LA207_0==157||(LA207_0>=175 && LA207_0<=176)||(LA207_0>=178 && LA207_0<=196)||(LA207_0>=199 && LA207_0<=200)||(LA207_0>=246 && LA207_0<=249)||LA207_0==251||(LA207_0>=253 && LA207_0<=255)||(LA207_0>=261 && LA207_0<=262)||(LA207_0>=265 && LA207_0<=271)||(LA207_0>=284 && LA207_0<=285)) ) {
+                alt207=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 207, 0, input);
+
+                throw nvae;
+            }
+            switch (alt207) {
+                case 1 :
+                    // InternalFormalML.g:11268:2: ( ( rule__Transition__Group_5_1_2_0_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:11268:2: ( ( rule__Transition__Group_5_1_2_0_1_0__0 ) )
+                    // InternalFormalML.g:11269:3: ( rule__Transition__Group_5_1_2_0_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0()); 
+                    }
+                    // InternalFormalML.g:11270:3: ( rule__Transition__Group_5_1_2_0_1_0__0 )
+                    // InternalFormalML.g:11270:4: rule__Transition__Group_5_1_2_0_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Group_5_1_2_0_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11274:2: ( ( rule__Transition__BehaviorAssignment_5_1_2_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:11274:2: ( ( rule__Transition__BehaviorAssignment_5_1_2_0_1_1 ) )
+                    // InternalFormalML.g:11275:3: ( rule__Transition__BehaviorAssignment_5_1_2_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_1_2_0_1_1()); 
+                    }
+                    // InternalFormalML.g:11276:3: ( rule__Transition__BehaviorAssignment_5_1_2_0_1_1 )
+                    // InternalFormalML.g:11276:4: rule__Transition__BehaviorAssignment_5_1_2_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__BehaviorAssignment_5_1_2_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getBehaviorAssignment_5_1_2_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Alternatives_5_1_2_0_1"
+
+
+    // $ANTLR start "rule__Transition__Alternatives_5_1_2_0_1_0_1"
+    // InternalFormalML.g:11284:1: rule__Transition__Alternatives_5_1_2_0_1_0_1 : ( ( ( rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0 ) ) | ( '@guard:' ) );
+    public final void rule__Transition__Alternatives_5_1_2_0_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11288:1: ( ( ( rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0 ) ) | ( '@guard:' ) )
+            int alt208=2;
+            int LA208_0 = input.LA(1);
+
+            if ( (LA208_0==244) ) {
+                alt208=1;
+            }
+            else if ( (LA208_0==76) ) {
+                int LA208_2 = input.LA(2);
+
+                if ( (LA208_2==EOF||LA208_2==77||LA208_2==240||LA208_2==245) ) {
+                    alt208=2;
+                }
+                else if ( ((LA208_2>=RULE_CHARACTER && LA208_2<=RULE_INT)||LA208_2==20||(LA208_2>=22 && LA208_2<=23)||(LA208_2>=29 && LA208_2<=30)||LA208_2==125||(LA208_2>=129 && LA208_2<=134)||(LA208_2>=137 && LA208_2<=142)||LA208_2==199||LA208_2==246||(LA208_2>=248 && LA208_2<=249)||(LA208_2>=261 && LA208_2<=271)||LA208_2==287) ) {
+                    alt208=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 208, 2, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 208, 0, input);
+
+                throw nvae;
+            }
+            switch (alt208) {
+                case 1 :
+                    // InternalFormalML.g:11289:2: ( ( rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0 ) )
+                    {
+                    // InternalFormalML.g:11289:2: ( ( rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0 ) )
+                    // InternalFormalML.g:11290:3: ( rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getGuardAssignment_5_1_2_0_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:11291:3: ( rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0 )
+                    // InternalFormalML.g:11291:4: rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getGuardAssignment_5_1_2_0_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11295:2: ( '@guard:' )
+                    {
+                    // InternalFormalML.g:11295:2: ( '@guard:' )
+                    // InternalFormalML.g:11296:3: '@guard:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getGuardKeyword_5_1_2_0_1_0_1_1()); 
+                    }
+                    match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getGuardKeyword_5_1_2_0_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Alternatives_5_1_2_0_1_0_1"
+
+
+    // $ANTLR start "rule__Transition__Alternatives_5_1_2_0_1_0_2"
+    // InternalFormalML.g:11305:1: rule__Transition__Alternatives_5_1_2_0_1_0_2 : ( ( ( rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0 ) ) | ( '@tguard:' ) );
+    public final void rule__Transition__Alternatives_5_1_2_0_1_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11309:1: ( ( ( rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0 ) ) | ( '@tguard:' ) )
+            int alt209=2;
+            int LA209_0 = input.LA(1);
+
+            if ( (LA209_0==245) ) {
+                alt209=1;
+            }
+            else if ( (LA209_0==77) ) {
+                int LA209_2 = input.LA(2);
+
+                if ( ((LA209_2>=RULE_CHARACTER && LA209_2<=RULE_INT)||LA209_2==20||LA209_2==23||(LA209_2>=29 && LA209_2<=30)||LA209_2==125||(LA209_2>=129 && LA209_2<=134)||(LA209_2>=137 && LA209_2<=142)||LA209_2==199||LA209_2==247||(LA209_2>=261 && LA209_2<=271)||LA209_2==287) ) {
+                    alt209=1;
+                }
+                else if ( (LA209_2==EOF||LA209_2==240) ) {
+                    alt209=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 209, 2, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 209, 0, input);
+
+                throw nvae;
+            }
+            switch (alt209) {
+                case 1 :
+                    // InternalFormalML.g:11310:2: ( ( rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0 ) )
+                    {
+                    // InternalFormalML.g:11310:2: ( ( rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0 ) )
+                    // InternalFormalML.g:11311:3: ( rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getTguardAssignment_5_1_2_0_1_0_2_0()); 
+                    }
+                    // InternalFormalML.g:11312:3: ( rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0 )
+                    // InternalFormalML.g:11312:4: rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getTguardAssignment_5_1_2_0_1_0_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11316:2: ( '@tguard:' )
+                    {
+                    // InternalFormalML.g:11316:2: ( '@tguard:' )
+                    // InternalFormalML.g:11317:3: '@tguard:'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionAccess().getTguardKeyword_5_1_2_0_1_0_2_1()); 
+                    }
+                    match(input,77,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionAccess().getTguardKeyword_5_1_2_0_1_0_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Alternatives_5_1_2_0_1_0_2"
+
+
+    // $ANTLR start "rule__TransitionMoe__Alternatives_1"
+    // InternalFormalML.g:11326:1: rule__TransitionMoe__Alternatives_1 : ( ( ( rule__TransitionMoe__Group_1_0__0 ) ) | ( ( rule__TransitionMoe__Group_1_1__0 ) ) );
+    public final void rule__TransitionMoe__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11330:1: ( ( ( rule__TransitionMoe__Group_1_0__0 ) ) | ( ( rule__TransitionMoe__Group_1_1__0 ) ) )
+            int alt210=2;
+            int LA210_0 = input.LA(1);
+
+            if ( ((LA210_0>=177 && LA210_0<=179)||LA210_0==201||LA210_0==252) ) {
+                alt210=1;
+            }
+            else if ( (LA210_0==RULE_INT||LA210_0==132||LA210_0==243) ) {
+                alt210=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 210, 0, input);
+
+                throw nvae;
+            }
+            switch (alt210) {
+                case 1 :
+                    // InternalFormalML.g:11331:2: ( ( rule__TransitionMoe__Group_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:11331:2: ( ( rule__TransitionMoe__Group_1_0__0 ) )
+                    // InternalFormalML.g:11332:3: ( rule__TransitionMoe__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionMoeAccess().getGroup_1_0()); 
+                    }
+                    // InternalFormalML.g:11333:3: ( rule__TransitionMoe__Group_1_0__0 )
+                    // InternalFormalML.g:11333:4: rule__TransitionMoe__Group_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionMoe__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionMoeAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11337:2: ( ( rule__TransitionMoe__Group_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:11337:2: ( ( rule__TransitionMoe__Group_1_1__0 ) )
+                    // InternalFormalML.g:11338:3: ( rule__TransitionMoe__Group_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionMoeAccess().getGroup_1_1()); 
+                    }
+                    // InternalFormalML.g:11339:3: ( rule__TransitionMoe__Group_1_1__0 )
+                    // InternalFormalML.g:11339:4: rule__TransitionMoe__Group_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionMoe__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionMoeAccess().getGroup_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Alternatives_1"
+
+
+    // $ANTLR start "rule__TransitionMoe__Alternatives_1_0_1"
+    // InternalFormalML.g:11347:1: rule__TransitionMoe__Alternatives_1_0_1 : ( ( ( rule__TransitionMoe__Group_1_0_1_0__0 ) ) | ( ( rule__TransitionMoe__IsElseAssignment_1_0_1_1 ) ) );
+    public final void rule__TransitionMoe__Alternatives_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11351:1: ( ( ( rule__TransitionMoe__Group_1_0_1_0__0 ) ) | ( ( rule__TransitionMoe__IsElseAssignment_1_0_1_1 ) ) )
+            int alt211=2;
+            int LA211_0 = input.LA(1);
+
+            if ( ((LA211_0>=177 && LA211_0<=179)) ) {
+                alt211=1;
+            }
+            else if ( (LA211_0==252) ) {
+                alt211=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 211, 0, input);
+
+                throw nvae;
+            }
+            switch (alt211) {
+                case 1 :
+                    // InternalFormalML.g:11352:2: ( ( rule__TransitionMoe__Group_1_0_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:11352:2: ( ( rule__TransitionMoe__Group_1_0_1_0__0 ) )
+                    // InternalFormalML.g:11353:3: ( rule__TransitionMoe__Group_1_0_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:11354:3: ( rule__TransitionMoe__Group_1_0_1_0__0 )
+                    // InternalFormalML.g:11354:4: rule__TransitionMoe__Group_1_0_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionMoe__Group_1_0_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11358:2: ( ( rule__TransitionMoe__IsElseAssignment_1_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:11358:2: ( ( rule__TransitionMoe__IsElseAssignment_1_0_1_1 ) )
+                    // InternalFormalML.g:11359:3: ( rule__TransitionMoe__IsElseAssignment_1_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_1()); 
+                    }
+                    // InternalFormalML.g:11360:3: ( rule__TransitionMoe__IsElseAssignment_1_0_1_1 )
+                    // InternalFormalML.g:11360:4: rule__TransitionMoe__IsElseAssignment_1_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionMoe__IsElseAssignment_1_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Alternatives_1_0_1"
+
+
+    // $ANTLR start "rule__TransitionGuard__Alternatives"
+    // InternalFormalML.g:11368:1: rule__TransitionGuard__Alternatives : ( ( ( rule__TransitionGuard__Group_0__0 ) ) | ( ( rule__TransitionGuard__Group_1__0 ) ) );
+    public final void rule__TransitionGuard__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11372:1: ( ( ( rule__TransitionGuard__Group_0__0 ) ) | ( ( rule__TransitionGuard__Group_1__0 ) ) )
+            int alt212=2;
+            int LA212_0 = input.LA(1);
+
+            if ( (LA212_0==244) ) {
+                alt212=1;
+            }
+            else if ( (LA212_0==76) ) {
+                alt212=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 212, 0, input);
+
+                throw nvae;
+            }
+            switch (alt212) {
+                case 1 :
+                    // InternalFormalML.g:11373:2: ( ( rule__TransitionGuard__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:11373:2: ( ( rule__TransitionGuard__Group_0__0 ) )
+                    // InternalFormalML.g:11374:3: ( rule__TransitionGuard__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:11375:3: ( rule__TransitionGuard__Group_0__0 )
+                    // InternalFormalML.g:11375:4: rule__TransitionGuard__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionGuard__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11379:2: ( ( rule__TransitionGuard__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:11379:2: ( ( rule__TransitionGuard__Group_1__0 ) )
+                    // InternalFormalML.g:11380:3: ( rule__TransitionGuard__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:11381:3: ( rule__TransitionGuard__Group_1__0 )
+                    // InternalFormalML.g:11381:4: rule__TransitionGuard__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionGuard__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Alternatives"
+
+
+    // $ANTLR start "rule__TransitionGuard__Alternatives_1_1"
+    // InternalFormalML.g:11389:1: rule__TransitionGuard__Alternatives_1_1 : ( ( ( rule__TransitionGuard__Group_1_1_0__0 ) ) | ( ruleGuardStatement ) | ( ruleEventGuardStatement ) | ( ruleCheckSatGuardStatement ) );
+    public final void rule__TransitionGuard__Alternatives_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11393:1: ( ( ( rule__TransitionGuard__Group_1_1_0__0 ) ) | ( ruleGuardStatement ) | ( ruleEventGuardStatement ) | ( ruleCheckSatGuardStatement ) )
+            int alt213=4;
+            switch ( input.LA(1) ) {
+            case RULE_CHARACTER:
+            case RULE_STRING:
+            case RULE_XLIA_ID:
+            case RULE_INT:
+            case 20:
+            case 22:
+            case 23:
+            case 29:
+            case 30:
+            case 125:
+            case 129:
+            case 130:
+            case 131:
+            case 132:
+            case 133:
+            case 134:
+            case 137:
+            case 138:
+            case 139:
+            case 140:
+            case 141:
+            case 142:
+            case 199:
+            case 261:
+            case 262:
+            case 263:
+            case 264:
+            case 265:
+            case 266:
+            case 267:
+            case 268:
+            case 269:
+            case 270:
+            case 271:
+            case 287:
+                {
+                alt213=1;
+                }
+                break;
+            case 246:
+                {
+                alt213=2;
+                }
+                break;
+            case 248:
+                {
+                alt213=3;
+                }
+                break;
+            case 249:
+                {
+                alt213=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 213, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt213) {
+                case 1 :
+                    // InternalFormalML.g:11394:2: ( ( rule__TransitionGuard__Group_1_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:11394:2: ( ( rule__TransitionGuard__Group_1_1_0__0 ) )
+                    // InternalFormalML.g:11395:3: ( rule__TransitionGuard__Group_1_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0()); 
+                    }
+                    // InternalFormalML.g:11396:3: ( rule__TransitionGuard__Group_1_1_0__0 )
+                    // InternalFormalML.g:11396:4: rule__TransitionGuard__Group_1_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionGuard__Group_1_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11400:2: ( ruleGuardStatement )
+                    {
+                    // InternalFormalML.g:11400:2: ( ruleGuardStatement )
+                    // InternalFormalML.g:11401:3: ruleGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardAccess().getGuardStatementParserRuleCall_1_1_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardAccess().getGuardStatementParserRuleCall_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11406:2: ( ruleEventGuardStatement )
+                    {
+                    // InternalFormalML.g:11406:2: ( ruleEventGuardStatement )
+                    // InternalFormalML.g:11407:3: ruleEventGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardAccess().getEventGuardStatementParserRuleCall_1_1_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleEventGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardAccess().getEventGuardStatementParserRuleCall_1_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:11412:2: ( ruleCheckSatGuardStatement )
+                    {
+                    // InternalFormalML.g:11412:2: ( ruleCheckSatGuardStatement )
+                    // InternalFormalML.g:11413:3: ruleCheckSatGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardAccess().getCheckSatGuardStatementParserRuleCall_1_1_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleCheckSatGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardAccess().getCheckSatGuardStatementParserRuleCall_1_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Alternatives_1_1"
+
+
+    // $ANTLR start "rule__TransitionGuard__Alternatives_1_1_0_1"
+    // InternalFormalML.g:11422:1: rule__TransitionGuard__Alternatives_1_1_0_1 : ( ( ( rule__TransitionGuard__Group_1_1_0_1_0__0 ) ) | ( ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_1 ) ) );
+    public final void rule__TransitionGuard__Alternatives_1_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11426:1: ( ( ( rule__TransitionGuard__Group_1_1_0_1_0__0 ) ) | ( ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_1 ) ) )
+            int alt214=2;
+            int LA214_0 = input.LA(1);
+
+            if ( (LA214_0==22) ) {
+                alt214=1;
+            }
+            else if ( ((LA214_0>=RULE_CHARACTER && LA214_0<=RULE_INT)||LA214_0==20||LA214_0==23||(LA214_0>=29 && LA214_0<=30)||LA214_0==125||(LA214_0>=129 && LA214_0<=134)||(LA214_0>=137 && LA214_0<=142)||LA214_0==199||(LA214_0>=261 && LA214_0<=271)||LA214_0==287) ) {
+                alt214=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 214, 0, input);
+
+                throw nvae;
+            }
+            switch (alt214) {
+                case 1 :
+                    // InternalFormalML.g:11427:2: ( ( rule__TransitionGuard__Group_1_1_0_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:11427:2: ( ( rule__TransitionGuard__Group_1_1_0_1_0__0 ) )
+                    // InternalFormalML.g:11428:3: ( rule__TransitionGuard__Group_1_1_0_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:11429:3: ( rule__TransitionGuard__Group_1_1_0_1_0__0 )
+                    // InternalFormalML.g:11429:4: rule__TransitionGuard__Group_1_1_0_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionGuard__Group_1_1_0_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardAccess().getGroup_1_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11433:2: ( ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:11433:2: ( ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_1 ) )
+                    // InternalFormalML.g:11434:3: ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_1()); 
+                    }
+                    // InternalFormalML.g:11435:3: ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_1 )
+                    // InternalFormalML.g:11435:4: rule__TransitionGuard__ConditionAssignment_1_1_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionGuard__ConditionAssignment_1_1_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Alternatives_1_1_0_1"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__OperatorAlternatives_1_0"
+    // InternalFormalML.g:11443:1: rule__TransitionGuardExpression__OperatorAlternatives_1_0 : ( ( '&&' ) | ( 'and' ) | ( '||' ) | ( 'or' ) );
+    public final void rule__TransitionGuardExpression__OperatorAlternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11447:1: ( ( '&&' ) | ( 'and' ) | ( '||' ) | ( 'or' ) )
+            int alt215=4;
+            switch ( input.LA(1) ) {
+            case 78:
+                {
+                alt215=1;
+                }
+                break;
+            case 33:
+                {
+                alt215=2;
+                }
+                break;
+            case 79:
+                {
+                alt215=3;
+                }
+                break;
+            case 34:
+                {
+                alt215=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 215, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt215) {
+                case 1 :
+                    // InternalFormalML.g:11448:2: ( '&&' )
+                    {
+                    // InternalFormalML.g:11448:2: ( '&&' )
+                    // InternalFormalML.g:11449:3: '&&'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_0_0()); 
+                    }
+                    match(input,78,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11454:2: ( 'and' )
+                    {
+                    // InternalFormalML.g:11454:2: ( 'and' )
+                    // InternalFormalML.g:11455:3: 'and'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAndKeyword_1_0_1()); 
+                    }
+                    match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAndKeyword_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11460:2: ( '||' )
+                    {
+                    // InternalFormalML.g:11460:2: ( '||' )
+                    // InternalFormalML.g:11461:3: '||'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_0_2()); 
+                    }
+                    match(input,79,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:11466:2: ( 'or' )
+                    {
+                    // InternalFormalML.g:11466:2: ( 'or' )
+                    // InternalFormalML.g:11467:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorOrKeyword_1_0_3()); 
+                    }
+                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorOrKeyword_1_0_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__OperatorAlternatives_1_0"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Alternatives"
+    // InternalFormalML.g:11476:1: rule__TransitionTimedGuard__Alternatives : ( ( ( rule__TransitionTimedGuard__Group_0__0 ) ) | ( ( rule__TransitionTimedGuard__Group_1__0 ) ) );
+    public final void rule__TransitionTimedGuard__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11480:1: ( ( ( rule__TransitionTimedGuard__Group_0__0 ) ) | ( ( rule__TransitionTimedGuard__Group_1__0 ) ) )
+            int alt216=2;
+            int LA216_0 = input.LA(1);
+
+            if ( (LA216_0==245) ) {
+                alt216=1;
+            }
+            else if ( (LA216_0==77) ) {
+                alt216=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 216, 0, input);
+
+                throw nvae;
+            }
+            switch (alt216) {
+                case 1 :
+                    // InternalFormalML.g:11481:2: ( ( rule__TransitionTimedGuard__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:11481:2: ( ( rule__TransitionTimedGuard__Group_0__0 ) )
+                    // InternalFormalML.g:11482:3: ( rule__TransitionTimedGuard__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionTimedGuardAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:11483:3: ( rule__TransitionTimedGuard__Group_0__0 )
+                    // InternalFormalML.g:11483:4: rule__TransitionTimedGuard__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionTimedGuard__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionTimedGuardAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11487:2: ( ( rule__TransitionTimedGuard__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:11487:2: ( ( rule__TransitionTimedGuard__Group_1__0 ) )
+                    // InternalFormalML.g:11488:3: ( rule__TransitionTimedGuard__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionTimedGuardAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:11489:3: ( rule__TransitionTimedGuard__Group_1__0 )
+                    // InternalFormalML.g:11489:4: rule__TransitionTimedGuard__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionTimedGuard__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionTimedGuardAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Alternatives"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Alternatives_1_1"
+    // InternalFormalML.g:11497:1: rule__TransitionTimedGuard__Alternatives_1_1 : ( ( ( rule__TransitionTimedGuard__Group_1_1_0__0 ) ) | ( ruleTimedGuardStatement ) );
+    public final void rule__TransitionTimedGuard__Alternatives_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11501:1: ( ( ( rule__TransitionTimedGuard__Group_1_1_0__0 ) ) | ( ruleTimedGuardStatement ) )
+            int alt217=2;
+            int LA217_0 = input.LA(1);
+
+            if ( ((LA217_0>=RULE_CHARACTER && LA217_0<=RULE_INT)||LA217_0==20||LA217_0==23||(LA217_0>=29 && LA217_0<=30)||LA217_0==125||(LA217_0>=129 && LA217_0<=134)||(LA217_0>=137 && LA217_0<=142)||LA217_0==199||(LA217_0>=261 && LA217_0<=271)||LA217_0==287) ) {
+                alt217=1;
+            }
+            else if ( (LA217_0==247) ) {
+                alt217=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 217, 0, input);
+
+                throw nvae;
+            }
+            switch (alt217) {
+                case 1 :
+                    // InternalFormalML.g:11502:2: ( ( rule__TransitionTimedGuard__Group_1_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:11502:2: ( ( rule__TransitionTimedGuard__Group_1_1_0__0 ) )
+                    // InternalFormalML.g:11503:3: ( rule__TransitionTimedGuard__Group_1_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0()); 
+                    }
+                    // InternalFormalML.g:11504:3: ( rule__TransitionTimedGuard__Group_1_1_0__0 )
+                    // InternalFormalML.g:11504:4: rule__TransitionTimedGuard__Group_1_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionTimedGuard__Group_1_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11508:2: ( ruleTimedGuardStatement )
+                    {
+                    // InternalFormalML.g:11508:2: ( ruleTimedGuardStatement )
+                    // InternalFormalML.g:11509:3: ruleTimedGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementParserRuleCall_1_1_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleTimedGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementParserRuleCall_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Alternatives_1_1"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Alternatives_1_1_0_1"
+    // InternalFormalML.g:11518:1: rule__TransitionTimedGuard__Alternatives_1_1_0_1 : ( ( ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 ) ) | ( ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1 ) ) );
+    public final void rule__TransitionTimedGuard__Alternatives_1_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11522:1: ( ( ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 ) ) | ( ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1 ) ) )
+            int alt218=2;
+            alt218 = dfa218.predict(input);
+            switch (alt218) {
+                case 1 :
+                    // InternalFormalML.g:11523:2: ( ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:11523:2: ( ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 ) )
+                    // InternalFormalML.g:11524:3: ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0_1_0()); 
+                    }
+                    // InternalFormalML.g:11525:3: ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 )
+                    // InternalFormalML.g:11525:4: rule__TransitionTimedGuard__Group_1_1_0_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionTimedGuard__Group_1_1_0_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11529:2: ( ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1 ) )
+                    {
+                    // InternalFormalML.g:11529:2: ( ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1 ) )
+                    // InternalFormalML.g:11530:3: ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_1()); 
+                    }
+                    // InternalFormalML.g:11531:3: ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1 )
+                    // InternalFormalML.g:11531:4: rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Alternatives_1_1_0_1"
+
+
+    // $ANTLR start "rule__TransitionEffectStatement__Alternatives"
+    // InternalFormalML.g:11539:1: rule__TransitionEffectStatement__Alternatives : ( ( ruleExpressionStatement ) | ( ruleOutputComStatement ) | ( ruleIfStatement ) | ( ruleWhileDoStatement ) | ( ruleDoWhileStatement ) | ( ruleForStatement ) | ( ruleForEachStatement ) | ( ruleInterruptStatement ) | ( ruleActivityStatement ) | ( ruleInvokeStatement ) );
+    public final void rule__TransitionEffectStatement__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11543:1: ( ( ruleExpressionStatement ) | ( ruleOutputComStatement ) | ( ruleIfStatement ) | ( ruleWhileDoStatement ) | ( ruleDoWhileStatement ) | ( ruleForStatement ) | ( ruleForEachStatement ) | ( ruleInterruptStatement ) | ( ruleActivityStatement ) | ( ruleInvokeStatement ) )
+            int alt219=10;
+            alt219 = dfa219.predict(input);
+            switch (alt219) {
+                case 1 :
+                    // InternalFormalML.g:11544:2: ( ruleExpressionStatement )
+                    {
+                    // InternalFormalML.g:11544:2: ( ruleExpressionStatement )
+                    // InternalFormalML.g:11545:3: ruleExpressionStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getExpressionStatementParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleExpressionStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getExpressionStatementParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11550:2: ( ruleOutputComStatement )
+                    {
+                    // InternalFormalML.g:11550:2: ( ruleOutputComStatement )
+                    // InternalFormalML.g:11551:3: ruleOutputComStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getOutputComStatementParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleOutputComStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getOutputComStatementParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11556:2: ( ruleIfStatement )
+                    {
+                    // InternalFormalML.g:11556:2: ( ruleIfStatement )
+                    // InternalFormalML.g:11557:3: ruleIfStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getIfStatementParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleIfStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getIfStatementParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:11562:2: ( ruleWhileDoStatement )
+                    {
+                    // InternalFormalML.g:11562:2: ( ruleWhileDoStatement )
+                    // InternalFormalML.g:11563:3: ruleWhileDoStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getWhileDoStatementParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleWhileDoStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getWhileDoStatementParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:11568:2: ( ruleDoWhileStatement )
+                    {
+                    // InternalFormalML.g:11568:2: ( ruleDoWhileStatement )
+                    // InternalFormalML.g:11569:3: ruleDoWhileStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getDoWhileStatementParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDoWhileStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getDoWhileStatementParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:11574:2: ( ruleForStatement )
+                    {
+                    // InternalFormalML.g:11574:2: ( ruleForStatement )
+                    // InternalFormalML.g:11575:3: ruleForStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getForStatementParserRuleCall_5()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleForStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getForStatementParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:11580:2: ( ruleForEachStatement )
+                    {
+                    // InternalFormalML.g:11580:2: ( ruleForEachStatement )
+                    // InternalFormalML.g:11581:3: ruleForEachStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getForEachStatementParserRuleCall_6()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleForEachStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getForEachStatementParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:11586:2: ( ruleInterruptStatement )
+                    {
+                    // InternalFormalML.g:11586:2: ( ruleInterruptStatement )
+                    // InternalFormalML.g:11587:3: ruleInterruptStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getInterruptStatementParserRuleCall_7()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleInterruptStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getInterruptStatementParserRuleCall_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:11592:2: ( ruleActivityStatement )
+                    {
+                    // InternalFormalML.g:11592:2: ( ruleActivityStatement )
+                    // InternalFormalML.g:11593:3: ruleActivityStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getActivityStatementParserRuleCall_8()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleActivityStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getActivityStatementParserRuleCall_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:11598:2: ( ruleInvokeStatement )
+                    {
+                    // InternalFormalML.g:11598:2: ( ruleInvokeStatement )
+                    // InternalFormalML.g:11599:3: ruleInvokeStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionEffectStatementAccess().getInvokeStatementParserRuleCall_9()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleInvokeStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionEffectStatementAccess().getInvokeStatementParserRuleCall_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffectStatement__Alternatives"
+
+
+    // $ANTLR start "rule__Statement__Alternatives"
+    // InternalFormalML.g:11608:1: rule__Statement__Alternatives : ( ( ruleBlockStatement ) | ( ruleExpressionStatement ) | ( ruleGuardStatement ) | ( ruleTimedGuardStatement ) | ( ruleEventGuardStatement ) | ( ruleCheckSatGuardStatement ) | ( ruleInputComStatement ) | ( ruleOutputComStatement ) | ( ruleIfStatement ) | ( ruleWhileDoStatement ) | ( ruleDoWhileStatement ) | ( ruleForStatement ) | ( ruleForEachStatement ) | ( ruleInterruptStatement ) | ( ruleActivityStatement ) | ( ruleInvokeStatement ) );
+    public final void rule__Statement__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11612:1: ( ( ruleBlockStatement ) | ( ruleExpressionStatement ) | ( ruleGuardStatement ) | ( ruleTimedGuardStatement ) | ( ruleEventGuardStatement ) | ( ruleCheckSatGuardStatement ) | ( ruleInputComStatement ) | ( ruleOutputComStatement ) | ( ruleIfStatement ) | ( ruleWhileDoStatement ) | ( ruleDoWhileStatement ) | ( ruleForStatement ) | ( ruleForEachStatement ) | ( ruleInterruptStatement ) | ( ruleActivityStatement ) | ( ruleInvokeStatement ) )
+            int alt220=16;
+            alt220 = dfa220.predict(input);
+            switch (alt220) {
+                case 1 :
+                    // InternalFormalML.g:11613:2: ( ruleBlockStatement )
+                    {
+                    // InternalFormalML.g:11613:2: ( ruleBlockStatement )
+                    // InternalFormalML.g:11614:3: ruleBlockStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getBlockStatementParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleBlockStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getBlockStatementParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11619:2: ( ruleExpressionStatement )
+                    {
+                    // InternalFormalML.g:11619:2: ( ruleExpressionStatement )
+                    // InternalFormalML.g:11620:3: ruleExpressionStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getExpressionStatementParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleExpressionStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getExpressionStatementParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11625:2: ( ruleGuardStatement )
+                    {
+                    // InternalFormalML.g:11625:2: ( ruleGuardStatement )
+                    // InternalFormalML.g:11626:3: ruleGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getGuardStatementParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getGuardStatementParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:11631:2: ( ruleTimedGuardStatement )
+                    {
+                    // InternalFormalML.g:11631:2: ( ruleTimedGuardStatement )
+                    // InternalFormalML.g:11632:3: ruleTimedGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getTimedGuardStatementParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleTimedGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getTimedGuardStatementParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:11637:2: ( ruleEventGuardStatement )
+                    {
+                    // InternalFormalML.g:11637:2: ( ruleEventGuardStatement )
+                    // InternalFormalML.g:11638:3: ruleEventGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getEventGuardStatementParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleEventGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getEventGuardStatementParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:11643:2: ( ruleCheckSatGuardStatement )
+                    {
+                    // InternalFormalML.g:11643:2: ( ruleCheckSatGuardStatement )
+                    // InternalFormalML.g:11644:3: ruleCheckSatGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getCheckSatGuardStatementParserRuleCall_5()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleCheckSatGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getCheckSatGuardStatementParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:11649:2: ( ruleInputComStatement )
+                    {
+                    // InternalFormalML.g:11649:2: ( ruleInputComStatement )
+                    // InternalFormalML.g:11650:3: ruleInputComStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getInputComStatementParserRuleCall_6()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleInputComStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getInputComStatementParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:11655:2: ( ruleOutputComStatement )
+                    {
+                    // InternalFormalML.g:11655:2: ( ruleOutputComStatement )
+                    // InternalFormalML.g:11656:3: ruleOutputComStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getOutputComStatementParserRuleCall_7()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleOutputComStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getOutputComStatementParserRuleCall_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:11661:2: ( ruleIfStatement )
+                    {
+                    // InternalFormalML.g:11661:2: ( ruleIfStatement )
+                    // InternalFormalML.g:11662:3: ruleIfStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getIfStatementParserRuleCall_8()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleIfStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getIfStatementParserRuleCall_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:11667:2: ( ruleWhileDoStatement )
+                    {
+                    // InternalFormalML.g:11667:2: ( ruleWhileDoStatement )
+                    // InternalFormalML.g:11668:3: ruleWhileDoStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getWhileDoStatementParserRuleCall_9()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleWhileDoStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getWhileDoStatementParserRuleCall_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalFormalML.g:11673:2: ( ruleDoWhileStatement )
+                    {
+                    // InternalFormalML.g:11673:2: ( ruleDoWhileStatement )
+                    // InternalFormalML.g:11674:3: ruleDoWhileStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getDoWhileStatementParserRuleCall_10()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleDoWhileStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getDoWhileStatementParserRuleCall_10()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 12 :
+                    // InternalFormalML.g:11679:2: ( ruleForStatement )
+                    {
+                    // InternalFormalML.g:11679:2: ( ruleForStatement )
+                    // InternalFormalML.g:11680:3: ruleForStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getForStatementParserRuleCall_11()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleForStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getForStatementParserRuleCall_11()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 13 :
+                    // InternalFormalML.g:11685:2: ( ruleForEachStatement )
+                    {
+                    // InternalFormalML.g:11685:2: ( ruleForEachStatement )
+                    // InternalFormalML.g:11686:3: ruleForEachStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getForEachStatementParserRuleCall_12()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleForEachStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getForEachStatementParserRuleCall_12()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 14 :
+                    // InternalFormalML.g:11691:2: ( ruleInterruptStatement )
+                    {
+                    // InternalFormalML.g:11691:2: ( ruleInterruptStatement )
+                    // InternalFormalML.g:11692:3: ruleInterruptStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getInterruptStatementParserRuleCall_13()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleInterruptStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getInterruptStatementParserRuleCall_13()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 15 :
+                    // InternalFormalML.g:11697:2: ( ruleActivityStatement )
+                    {
+                    // InternalFormalML.g:11697:2: ( ruleActivityStatement )
+                    // InternalFormalML.g:11698:3: ruleActivityStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getActivityStatementParserRuleCall_14()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleActivityStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getActivityStatementParserRuleCall_14()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 16 :
+                    // InternalFormalML.g:11703:2: ( ruleInvokeStatement )
+                    {
+                    // InternalFormalML.g:11703:2: ( ruleInvokeStatement )
+                    // InternalFormalML.g:11704:3: ruleInvokeStatement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatementAccess().getInvokeStatementParserRuleCall_15()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleInvokeStatement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatementAccess().getInvokeStatementParserRuleCall_15()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statement__Alternatives"
+
+
+    // $ANTLR start "rule__BlockStatementScheduler__Alternatives"
+    // InternalFormalML.g:11713:1: rule__BlockStatementScheduler__Alternatives : ( ( '|;|' ) | ( '|\\u00A7|' ) | ( '|;;|' ) | ( '|.|' ) | ( '|/;|' ) | ( '|i|' ) | ( '|,|' ) | ( '|a|' ) | ( '|and|' ) | ( '|or|' ) | ( '|and#then|' ) | ( '|or#else|' ) | ( '|indet|' ) | ( '|/\\\\|' ) | ( '|fork|' ) | ( '|join|' ) );
+    public final void rule__BlockStatementScheduler__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11717:1: ( ( '|;|' ) | ( '|\\u00A7|' ) | ( '|;;|' ) | ( '|.|' ) | ( '|/;|' ) | ( '|i|' ) | ( '|,|' ) | ( '|a|' ) | ( '|and|' ) | ( '|or|' ) | ( '|and#then|' ) | ( '|or#else|' ) | ( '|indet|' ) | ( '|/\\\\|' ) | ( '|fork|' ) | ( '|join|' ) )
+            int alt221=16;
+            switch ( input.LA(1) ) {
+            case 80:
+                {
+                alt221=1;
+                }
+                break;
+            case 81:
+                {
+                alt221=2;
+                }
+                break;
+            case 82:
+                {
+                alt221=3;
+                }
+                break;
+            case 83:
+                {
+                alt221=4;
+                }
+                break;
+            case 84:
+                {
+                alt221=5;
+                }
+                break;
+            case 85:
+                {
+                alt221=6;
+                }
+                break;
+            case 86:
+                {
+                alt221=7;
+                }
+                break;
+            case 87:
+                {
+                alt221=8;
+                }
+                break;
+            case 88:
+                {
+                alt221=9;
+                }
+                break;
+            case 89:
+                {
+                alt221=10;
+                }
+                break;
+            case 90:
+                {
+                alt221=11;
+                }
+                break;
+            case 91:
+                {
+                alt221=12;
+                }
+                break;
+            case 92:
+                {
+                alt221=13;
+                }
+                break;
+            case 93:
+                {
+                alt221=14;
+                }
+                break;
+            case 94:
+                {
+                alt221=15;
+                }
+                break;
+            case 95:
+                {
+                alt221=16;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 221, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt221) {
+                case 1 :
+                    // InternalFormalML.g:11718:2: ( '|;|' )
+                    {
+                    // InternalFormalML.g:11718:2: ( '|;|' )
+                    // InternalFormalML.g:11719:3: '|;|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonVerticalLineKeyword_0()); 
+                    }
+                    match(input,80,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonVerticalLineKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11724:2: ( '|\\u00A7|' )
+                    {
+                    // InternalFormalML.g:11724:2: ( '|\\u00A7|' )
+                    // InternalFormalML.g:11725:3: '|\\u00A7|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSectionSignVerticalLineKeyword_1()); 
+                    }
+                    match(input,81,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSectionSignVerticalLineKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11730:2: ( '|;;|' )
+                    {
+                    // InternalFormalML.g:11730:2: ( '|;;|' )
+                    // InternalFormalML.g:11731:3: '|;;|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonSemicolonVerticalLineKeyword_2()); 
+                    }
+                    match(input,82,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonSemicolonVerticalLineKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:11736:2: ( '|.|' )
+                    {
+                    // InternalFormalML.g:11736:2: ( '|.|' )
+                    // InternalFormalML.g:11737:3: '|.|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineFullStopVerticalLineKeyword_3()); 
+                    }
+                    match(input,83,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineFullStopVerticalLineKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:11742:2: ( '|/;|' )
+                    {
+                    // InternalFormalML.g:11742:2: ( '|/;|' )
+                    // InternalFormalML.g:11743:3: '|/;|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusSemicolonVerticalLineKeyword_4()); 
+                    }
+                    match(input,84,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusSemicolonVerticalLineKeyword_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:11748:2: ( '|i|' )
+                    {
+                    // InternalFormalML.g:11748:2: ( '|i|' )
+                    // InternalFormalML.g:11749:3: '|i|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getIKeyword_5()); 
+                    }
+                    match(input,85,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getIKeyword_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:11754:2: ( '|,|' )
+                    {
+                    // InternalFormalML.g:11754:2: ( '|,|' )
+                    // InternalFormalML.g:11755:3: '|,|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineCommaVerticalLineKeyword_6()); 
+                    }
+                    match(input,86,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineCommaVerticalLineKeyword_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:11760:2: ( '|a|' )
+                    {
+                    // InternalFormalML.g:11760:2: ( '|a|' )
+                    // InternalFormalML.g:11761:3: '|a|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getAKeyword_7()); 
+                    }
+                    match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getAKeyword_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:11766:2: ( '|and|' )
+                    {
+                    // InternalFormalML.g:11766:2: ( '|and|' )
+                    // InternalFormalML.g:11767:3: '|and|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getAndKeyword_8()); 
+                    }
+                    match(input,88,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getAndKeyword_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:11772:2: ( '|or|' )
+                    {
+                    // InternalFormalML.g:11772:2: ( '|or|' )
+                    // InternalFormalML.g:11773:3: '|or|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getOrKeyword_9()); 
+                    }
+                    match(input,89,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getOrKeyword_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalFormalML.g:11778:2: ( '|and#then|' )
+                    {
+                    // InternalFormalML.g:11778:2: ( '|and#then|' )
+                    // InternalFormalML.g:11779:3: '|and#then|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getAndThenKeyword_10()); 
+                    }
+                    match(input,90,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getAndThenKeyword_10()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 12 :
+                    // InternalFormalML.g:11784:2: ( '|or#else|' )
+                    {
+                    // InternalFormalML.g:11784:2: ( '|or#else|' )
+                    // InternalFormalML.g:11785:3: '|or#else|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getOrElseKeyword_11()); 
+                    }
+                    match(input,91,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getOrElseKeyword_11()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 13 :
+                    // InternalFormalML.g:11790:2: ( '|indet|' )
+                    {
+                    // InternalFormalML.g:11790:2: ( '|indet|' )
+                    // InternalFormalML.g:11791:3: '|indet|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getIndetKeyword_12()); 
+                    }
+                    match(input,92,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getIndetKeyword_12()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 14 :
+                    // InternalFormalML.g:11796:2: ( '|/\\\\|' )
+                    {
+                    // InternalFormalML.g:11796:2: ( '|/\\\\|' )
+                    // InternalFormalML.g:11797:3: '|/\\\\|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusReverseSolidusVerticalLineKeyword_13()); 
+                    }
+                    match(input,93,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusReverseSolidusVerticalLineKeyword_13()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 15 :
+                    // InternalFormalML.g:11802:2: ( '|fork|' )
+                    {
+                    // InternalFormalML.g:11802:2: ( '|fork|' )
+                    // InternalFormalML.g:11803:3: '|fork|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getForkKeyword_14()); 
+                    }
+                    match(input,94,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getForkKeyword_14()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 16 :
+                    // InternalFormalML.g:11808:2: ( '|join|' )
+                    {
+                    // InternalFormalML.g:11808:2: ( '|join|' )
+                    // InternalFormalML.g:11809:3: '|join|'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockStatementSchedulerAccess().getJoinKeyword_15()); 
+                    }
+                    match(input,95,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockStatementSchedulerAccess().getJoinKeyword_15()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatementScheduler__Alternatives"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Alternatives"
+    // InternalFormalML.g:11818:1: rule__ExpressionStatement__Alternatives : ( ( ( rule__ExpressionStatement__Group_0__0 ) ) | ( ( rule__ExpressionStatement__Group_1__0 ) ) | ( ( rule__ExpressionStatement__Group_2__0 ) ) | ( ( rule__ExpressionStatement__Group_3__0 ) ) );
+    public final void rule__ExpressionStatement__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11822:1: ( ( ( rule__ExpressionStatement__Group_0__0 ) ) | ( ( rule__ExpressionStatement__Group_1__0 ) ) | ( ( rule__ExpressionStatement__Group_2__0 ) ) | ( ( rule__ExpressionStatement__Group_3__0 ) ) )
+            int alt222=4;
+            alt222 = dfa222.predict(input);
+            switch (alt222) {
+                case 1 :
+                    // InternalFormalML.g:11823:2: ( ( rule__ExpressionStatement__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:11823:2: ( ( rule__ExpressionStatement__Group_0__0 ) )
+                    // InternalFormalML.g:11824:3: ( rule__ExpressionStatement__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getExpressionStatementAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:11825:3: ( rule__ExpressionStatement__Group_0__0 )
+                    // InternalFormalML.g:11825:4: rule__ExpressionStatement__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ExpressionStatement__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getExpressionStatementAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11829:2: ( ( rule__ExpressionStatement__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:11829:2: ( ( rule__ExpressionStatement__Group_1__0 ) )
+                    // InternalFormalML.g:11830:3: ( rule__ExpressionStatement__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getExpressionStatementAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:11831:3: ( rule__ExpressionStatement__Group_1__0 )
+                    // InternalFormalML.g:11831:4: rule__ExpressionStatement__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ExpressionStatement__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getExpressionStatementAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11835:2: ( ( rule__ExpressionStatement__Group_2__0 ) )
+                    {
+                    // InternalFormalML.g:11835:2: ( ( rule__ExpressionStatement__Group_2__0 ) )
+                    // InternalFormalML.g:11836:3: ( rule__ExpressionStatement__Group_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getExpressionStatementAccess().getGroup_2()); 
+                    }
+                    // InternalFormalML.g:11837:3: ( rule__ExpressionStatement__Group_2__0 )
+                    // InternalFormalML.g:11837:4: rule__ExpressionStatement__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ExpressionStatement__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getExpressionStatementAccess().getGroup_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:11841:2: ( ( rule__ExpressionStatement__Group_3__0 ) )
+                    {
+                    // InternalFormalML.g:11841:2: ( ( rule__ExpressionStatement__Group_3__0 ) )
+                    // InternalFormalML.g:11842:3: ( rule__ExpressionStatement__Group_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getExpressionStatementAccess().getGroup_3()); 
+                    }
+                    // InternalFormalML.g:11843:3: ( rule__ExpressionStatement__Group_3__0 )
+                    // InternalFormalML.g:11843:4: rule__ExpressionStatement__Group_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ExpressionStatement__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getExpressionStatementAccess().getGroup_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Alternatives"
+
+
+    // $ANTLR start "rule__InputComStatement__Alternatives_3_1_0"
+    // InternalFormalML.g:11851:1: rule__InputComStatement__Alternatives_3_1_0 : ( ( '<==' ) | ( 'via' ) );
+    public final void rule__InputComStatement__Alternatives_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11855:1: ( ( '<==' ) | ( 'via' ) )
+            int alt223=2;
+            int LA223_0 = input.LA(1);
+
+            if ( (LA223_0==96) ) {
+                alt223=1;
+            }
+            else if ( (LA223_0==97) ) {
+                alt223=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 223, 0, input);
+
+                throw nvae;
+            }
+            switch (alt223) {
+                case 1 :
+                    // InternalFormalML.g:11856:2: ( '<==' )
+                    {
+                    // InternalFormalML.g:11856:2: ( '<==' )
+                    // InternalFormalML.g:11857:3: '<=='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInputComStatementAccess().getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0()); 
+                    }
+                    match(input,96,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInputComStatementAccess().getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11862:2: ( 'via' )
+                    {
+                    // InternalFormalML.g:11862:2: ( 'via' )
+                    // InternalFormalML.g:11863:3: 'via'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInputComStatementAccess().getViaKeyword_3_1_0_1()); 
+                    }
+                    match(input,97,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInputComStatementAccess().getViaKeyword_3_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Alternatives_3_1_0"
+
+
+    // $ANTLR start "rule__OutputComStatement__Alternatives_3_1_0"
+    // InternalFormalML.g:11872:1: rule__OutputComStatement__Alternatives_3_1_0 : ( ( '==>' ) | ( 'via' ) );
+    public final void rule__OutputComStatement__Alternatives_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11876:1: ( ( '==>' ) | ( 'via' ) )
+            int alt224=2;
+            int LA224_0 = input.LA(1);
+
+            if ( (LA224_0==98) ) {
+                alt224=1;
+            }
+            else if ( (LA224_0==97) ) {
+                alt224=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 224, 0, input);
+
+                throw nvae;
+            }
+            switch (alt224) {
+                case 1 :
+                    // InternalFormalML.g:11877:2: ( '==>' )
+                    {
+                    // InternalFormalML.g:11877:2: ( '==>' )
+                    // InternalFormalML.g:11878:3: '==>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOutputComStatementAccess().getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0()); 
+                    }
+                    match(input,98,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOutputComStatementAccess().getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11883:2: ( 'via' )
+                    {
+                    // InternalFormalML.g:11883:2: ( 'via' )
+                    // InternalFormalML.g:11884:3: 'via'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOutputComStatementAccess().getViaKeyword_3_1_0_1()); 
+                    }
+                    match(input,97,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOutputComStatementAccess().getViaKeyword_3_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Alternatives_3_1_0"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Alternatives_0"
+    // InternalFormalML.g:11893:1: rule__ElseIfStatement__Alternatives_0 : ( ( 'elseif' ) | ( ( rule__ElseIfStatement__Group_0_1__0 ) ) );
+    public final void rule__ElseIfStatement__Alternatives_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11897:1: ( ( 'elseif' ) | ( ( rule__ElseIfStatement__Group_0_1__0 ) ) )
+            int alt225=2;
+            int LA225_0 = input.LA(1);
+
+            if ( (LA225_0==99) ) {
+                alt225=1;
+            }
+            else if ( (LA225_0==252) ) {
+                alt225=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 225, 0, input);
+
+                throw nvae;
+            }
+            switch (alt225) {
+                case 1 :
+                    // InternalFormalML.g:11898:2: ( 'elseif' )
+                    {
+                    // InternalFormalML.g:11898:2: ( 'elseif' )
+                    // InternalFormalML.g:11899:3: 'elseif'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getElseIfStatementAccess().getElseifKeyword_0_0()); 
+                    }
+                    match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getElseIfStatementAccess().getElseifKeyword_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11904:2: ( ( rule__ElseIfStatement__Group_0_1__0 ) )
+                    {
+                    // InternalFormalML.g:11904:2: ( ( rule__ElseIfStatement__Group_0_1__0 ) )
+                    // InternalFormalML.g:11905:3: ( rule__ElseIfStatement__Group_0_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getElseIfStatementAccess().getGroup_0_1()); 
+                    }
+                    // InternalFormalML.g:11906:3: ( rule__ElseIfStatement__Group_0_1__0 )
+                    // InternalFormalML.g:11906:4: rule__ElseIfStatement__Group_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ElseIfStatement__Group_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getElseIfStatementAccess().getGroup_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Alternatives_0"
+
+
+    // $ANTLR start "rule__ForStatement__Alternatives"
+    // InternalFormalML.g:11914:1: rule__ForStatement__Alternatives : ( ( ( rule__ForStatement__Group_0__0 ) ) | ( ( rule__ForStatement__Group_1__0 ) ) );
+    public final void rule__ForStatement__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11918:1: ( ( ( rule__ForStatement__Group_0__0 ) ) | ( ( rule__ForStatement__Group_1__0 ) ) )
+            int alt226=2;
+            int LA226_0 = input.LA(1);
+
+            if ( (LA226_0==255) ) {
+                int LA226_1 = input.LA(2);
+
+                if ( (synpred418_InternalFormalML()) ) {
+                    alt226=1;
+                }
+                else if ( (true) ) {
+                    alt226=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 226, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 226, 0, input);
+
+                throw nvae;
+            }
+            switch (alt226) {
+                case 1 :
+                    // InternalFormalML.g:11919:2: ( ( rule__ForStatement__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:11919:2: ( ( rule__ForStatement__Group_0__0 ) )
+                    // InternalFormalML.g:11920:3: ( rule__ForStatement__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getForStatementAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:11921:3: ( rule__ForStatement__Group_0__0 )
+                    // InternalFormalML.g:11921:4: rule__ForStatement__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ForStatement__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getForStatementAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11925:2: ( ( rule__ForStatement__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:11925:2: ( ( rule__ForStatement__Group_1__0 ) )
+                    // InternalFormalML.g:11926:3: ( rule__ForStatement__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getForStatementAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:11927:3: ( rule__ForStatement__Group_1__0 )
+                    // InternalFormalML.g:11927:4: rule__ForStatement__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ForStatement__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getForStatementAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Alternatives"
+
+
+    // $ANTLR start "rule__ForAssignmentExpression__Alternatives"
+    // InternalFormalML.g:11935:1: rule__ForAssignmentExpression__Alternatives : ( ( ruleAssignmentExpression ) | ( ruleIncrementOrDecrementPrefixExpression ) | ( ruleIncrementOrDecrementPostfixExpression ) );
+    public final void rule__ForAssignmentExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11939:1: ( ( ruleAssignmentExpression ) | ( ruleIncrementOrDecrementPrefixExpression ) | ( ruleIncrementOrDecrementPostfixExpression ) )
+            int alt227=3;
+            alt227 = dfa227.predict(input);
+            switch (alt227) {
+                case 1 :
+                    // InternalFormalML.g:11940:2: ( ruleAssignmentExpression )
+                    {
+                    // InternalFormalML.g:11940:2: ( ruleAssignmentExpression )
+                    // InternalFormalML.g:11941:3: ruleAssignmentExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getForAssignmentExpressionAccess().getAssignmentExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleAssignmentExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getForAssignmentExpressionAccess().getAssignmentExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11946:2: ( ruleIncrementOrDecrementPrefixExpression )
+                    {
+                    // InternalFormalML.g:11946:2: ( ruleIncrementOrDecrementPrefixExpression )
+                    // InternalFormalML.g:11947:3: ruleIncrementOrDecrementPrefixExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleIncrementOrDecrementPrefixExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11952:2: ( ruleIncrementOrDecrementPostfixExpression )
+                    {
+                    // InternalFormalML.g:11952:2: ( ruleIncrementOrDecrementPostfixExpression )
+                    // InternalFormalML.g:11953:3: ruleIncrementOrDecrementPostfixExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleIncrementOrDecrementPostfixExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForAssignmentExpression__Alternatives"
+
+
+    // $ANTLR start "rule__ForEachStatement__Alternatives"
+    // InternalFormalML.g:11962:1: rule__ForEachStatement__Alternatives : ( ( ( rule__ForEachStatement__Group_0__0 ) ) | ( ( rule__ForEachStatement__Group_1__0 ) ) );
+    public final void rule__ForEachStatement__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11966:1: ( ( ( rule__ForEachStatement__Group_0__0 ) ) | ( ( rule__ForEachStatement__Group_1__0 ) ) )
+            int alt228=2;
+            int LA228_0 = input.LA(1);
+
+            if ( (LA228_0==255) ) {
+                int LA228_1 = input.LA(2);
+
+                if ( (synpred421_InternalFormalML()) ) {
+                    alt228=1;
+                }
+                else if ( (true) ) {
+                    alt228=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 228, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 228, 0, input);
+
+                throw nvae;
+            }
+            switch (alt228) {
+                case 1 :
+                    // InternalFormalML.g:11967:2: ( ( rule__ForEachStatement__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:11967:2: ( ( rule__ForEachStatement__Group_0__0 ) )
+                    // InternalFormalML.g:11968:3: ( rule__ForEachStatement__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getForEachStatementAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:11969:3: ( rule__ForEachStatement__Group_0__0 )
+                    // InternalFormalML.g:11969:4: rule__ForEachStatement__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ForEachStatement__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getForEachStatementAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11973:2: ( ( rule__ForEachStatement__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:11973:2: ( ( rule__ForEachStatement__Group_1__0 ) )
+                    // InternalFormalML.g:11974:3: ( rule__ForEachStatement__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getForEachStatementAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:11975:3: ( rule__ForEachStatement__Group_1__0 )
+                    // InternalFormalML.g:11975:4: rule__ForEachStatement__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ForEachStatement__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getForEachStatementAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Alternatives"
+
+
+    // $ANTLR start "rule__InterruptStatement__Alternatives_1"
+    // InternalFormalML.g:11983:1: rule__InterruptStatement__Alternatives_1 : ( ( ( rule__InterruptStatement__ExprAssignment_1_0 ) ) | ( ( rule__InterruptStatement__Group_1_1__0 ) ) );
+    public final void rule__InterruptStatement__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:11987:1: ( ( ( rule__InterruptStatement__ExprAssignment_1_0 ) ) | ( ( rule__InterruptStatement__Group_1_1__0 ) ) )
+            int alt229=2;
+            alt229 = dfa229.predict(input);
+            switch (alt229) {
+                case 1 :
+                    // InternalFormalML.g:11988:2: ( ( rule__InterruptStatement__ExprAssignment_1_0 ) )
+                    {
+                    // InternalFormalML.g:11988:2: ( ( rule__InterruptStatement__ExprAssignment_1_0 ) )
+                    // InternalFormalML.g:11989:3: ( rule__InterruptStatement__ExprAssignment_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_0()); 
+                    }
+                    // InternalFormalML.g:11990:3: ( rule__InterruptStatement__ExprAssignment_1_0 )
+                    // InternalFormalML.g:11990:4: rule__InterruptStatement__ExprAssignment_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InterruptStatement__ExprAssignment_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11994:2: ( ( rule__InterruptStatement__Group_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:11994:2: ( ( rule__InterruptStatement__Group_1_1__0 ) )
+                    // InternalFormalML.g:11995:3: ( rule__InterruptStatement__Group_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInterruptStatementAccess().getGroup_1_1()); 
+                    }
+                    // InternalFormalML.g:11996:3: ( rule__InterruptStatement__Group_1_1__0 )
+                    // InternalFormalML.g:11996:4: rule__InterruptStatement__Group_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InterruptStatement__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInterruptStatementAccess().getGroup_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Alternatives_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Alternatives"
+    // InternalFormalML.g:12004:1: rule__InvokeStatement__Alternatives : ( ( ( rule__InvokeStatement__Group_0__0 ) ) | ( ( rule__InvokeStatement__Group_1__0 ) ) | ( ( rule__InvokeStatement__Group_2__0 ) ) | ( ( rule__InvokeStatement__Group_3__0 ) ) );
+    public final void rule__InvokeStatement__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12008:1: ( ( ( rule__InvokeStatement__Group_0__0 ) ) | ( ( rule__InvokeStatement__Group_1__0 ) ) | ( ( rule__InvokeStatement__Group_2__0 ) ) | ( ( rule__InvokeStatement__Group_3__0 ) ) )
+            int alt230=4;
+            switch ( input.LA(1) ) {
+            case 262:
+                {
+                alt230=1;
+                }
+                break;
+            case RULE_XLIA_ID:
+                {
+                alt230=2;
+                }
+                break;
+            case 284:
+                {
+                alt230=3;
+                }
+                break;
+            case 285:
+                {
+                alt230=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 230, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt230) {
+                case 1 :
+                    // InternalFormalML.g:12009:2: ( ( rule__InvokeStatement__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:12009:2: ( ( rule__InvokeStatement__Group_0__0 ) )
+                    // InternalFormalML.g:12010:3: ( rule__InvokeStatement__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:12011:3: ( rule__InvokeStatement__Group_0__0 )
+                    // InternalFormalML.g:12011:4: rule__InvokeStatement__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12015:2: ( ( rule__InvokeStatement__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:12015:2: ( ( rule__InvokeStatement__Group_1__0 ) )
+                    // InternalFormalML.g:12016:3: ( rule__InvokeStatement__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:12017:3: ( rule__InvokeStatement__Group_1__0 )
+                    // InternalFormalML.g:12017:4: rule__InvokeStatement__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12021:2: ( ( rule__InvokeStatement__Group_2__0 ) )
+                    {
+                    // InternalFormalML.g:12021:2: ( ( rule__InvokeStatement__Group_2__0 ) )
+                    // InternalFormalML.g:12022:3: ( rule__InvokeStatement__Group_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_2()); 
+                    }
+                    // InternalFormalML.g:12023:3: ( rule__InvokeStatement__Group_2__0 )
+                    // InternalFormalML.g:12023:4: rule__InvokeStatement__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12027:2: ( ( rule__InvokeStatement__Group_3__0 ) )
+                    {
+                    // InternalFormalML.g:12027:2: ( ( rule__InvokeStatement__Group_3__0 ) )
+                    // InternalFormalML.g:12028:3: ( rule__InvokeStatement__Group_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_3()); 
+                    }
+                    // InternalFormalML.g:12029:3: ( rule__InvokeStatement__Group_3__0 )
+                    // InternalFormalML.g:12029:4: rule__InvokeStatement__Group_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Alternatives"
+
+
+    // $ANTLR start "rule__InvokeStatement__Alternatives_1_4_1"
+    // InternalFormalML.g:12037:1: rule__InvokeStatement__Alternatives_1_4_1 : ( ( ( rule__InvokeStatement__Group_1_4_1_0__0 ) ) | ( ( rule__InvokeStatement__Group_1_4_1_1__0 ) ) );
+    public final void rule__InvokeStatement__Alternatives_1_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12041:1: ( ( ( rule__InvokeStatement__Group_1_4_1_0__0 ) ) | ( ( rule__InvokeStatement__Group_1_4_1_1__0 ) ) )
+            int alt231=2;
+            int LA231_0 = input.LA(1);
+
+            if ( (LA231_0==RULE_ID) ) {
+                alt231=1;
+            }
+            else if ( (LA231_0==23) ) {
+                alt231=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 231, 0, input);
+
+                throw nvae;
+            }
+            switch (alt231) {
+                case 1 :
+                    // InternalFormalML.g:12042:2: ( ( rule__InvokeStatement__Group_1_4_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:12042:2: ( ( rule__InvokeStatement__Group_1_4_1_0__0 ) )
+                    // InternalFormalML.g:12043:3: ( rule__InvokeStatement__Group_1_4_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0()); 
+                    }
+                    // InternalFormalML.g:12044:3: ( rule__InvokeStatement__Group_1_4_1_0__0 )
+                    // InternalFormalML.g:12044:4: rule__InvokeStatement__Group_1_4_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_1_4_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12048:2: ( ( rule__InvokeStatement__Group_1_4_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:12048:2: ( ( rule__InvokeStatement__Group_1_4_1_1__0 ) )
+                    // InternalFormalML.g:12049:3: ( rule__InvokeStatement__Group_1_4_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1()); 
+                    }
+                    // InternalFormalML.g:12050:3: ( rule__InvokeStatement__Group_1_4_1_1__0 )
+                    // InternalFormalML.g:12050:4: rule__InvokeStatement__Group_1_4_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_1_4_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Alternatives_1_4_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Alternatives_2_5_1"
+    // InternalFormalML.g:12058:1: rule__InvokeStatement__Alternatives_2_5_1 : ( ( ( rule__InvokeStatement__Group_2_5_1_0__0 ) ) | ( ( rule__InvokeStatement__Group_2_5_1_1__0 ) ) );
+    public final void rule__InvokeStatement__Alternatives_2_5_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12062:1: ( ( ( rule__InvokeStatement__Group_2_5_1_0__0 ) ) | ( ( rule__InvokeStatement__Group_2_5_1_1__0 ) ) )
+            int alt232=2;
+            int LA232_0 = input.LA(1);
+
+            if ( (LA232_0==RULE_ID) ) {
+                alt232=1;
+            }
+            else if ( (LA232_0==23) ) {
+                alt232=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 232, 0, input);
+
+                throw nvae;
+            }
+            switch (alt232) {
+                case 1 :
+                    // InternalFormalML.g:12063:2: ( ( rule__InvokeStatement__Group_2_5_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:12063:2: ( ( rule__InvokeStatement__Group_2_5_1_0__0 ) )
+                    // InternalFormalML.g:12064:3: ( rule__InvokeStatement__Group_2_5_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0()); 
+                    }
+                    // InternalFormalML.g:12065:3: ( rule__InvokeStatement__Group_2_5_1_0__0 )
+                    // InternalFormalML.g:12065:4: rule__InvokeStatement__Group_2_5_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_2_5_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12069:2: ( ( rule__InvokeStatement__Group_2_5_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:12069:2: ( ( rule__InvokeStatement__Group_2_5_1_1__0 ) )
+                    // InternalFormalML.g:12070:3: ( rule__InvokeStatement__Group_2_5_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1()); 
+                    }
+                    // InternalFormalML.g:12071:3: ( rule__InvokeStatement__Group_2_5_1_1__0 )
+                    // InternalFormalML.g:12071:4: rule__InvokeStatement__Group_2_5_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_2_5_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Alternatives_2_5_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Alternatives_3_3_1"
+    // InternalFormalML.g:12079:1: rule__InvokeStatement__Alternatives_3_3_1 : ( ( ( rule__InvokeStatement__Group_3_3_1_0__0 ) ) | ( ( rule__InvokeStatement__Group_3_3_1_1__0 ) ) );
+    public final void rule__InvokeStatement__Alternatives_3_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12083:1: ( ( ( rule__InvokeStatement__Group_3_3_1_0__0 ) ) | ( ( rule__InvokeStatement__Group_3_3_1_1__0 ) ) )
+            int alt233=2;
+            int LA233_0 = input.LA(1);
+
+            if ( (LA233_0==RULE_ID) ) {
+                alt233=1;
+            }
+            else if ( (LA233_0==23) ) {
+                alt233=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 233, 0, input);
+
+                throw nvae;
+            }
+            switch (alt233) {
+                case 1 :
+                    // InternalFormalML.g:12084:2: ( ( rule__InvokeStatement__Group_3_3_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:12084:2: ( ( rule__InvokeStatement__Group_3_3_1_0__0 ) )
+                    // InternalFormalML.g:12085:3: ( rule__InvokeStatement__Group_3_3_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0()); 
+                    }
+                    // InternalFormalML.g:12086:3: ( rule__InvokeStatement__Group_3_3_1_0__0 )
+                    // InternalFormalML.g:12086:4: rule__InvokeStatement__Group_3_3_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_3_3_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12090:2: ( ( rule__InvokeStatement__Group_3_3_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:12090:2: ( ( rule__InvokeStatement__Group_3_3_1_1__0 ) )
+                    // InternalFormalML.g:12091:3: ( rule__InvokeStatement__Group_3_3_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1()); 
+                    }
+                    // InternalFormalML.g:12092:3: ( rule__InvokeStatement__Group_3_3_1_1__0 )
+                    // InternalFormalML.g:12092:4: rule__InvokeStatement__Group_3_3_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_3_3_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Alternatives_3_3_1"
+
+
+    // $ANTLR start "rule__Expression__Alternatives"
+    // InternalFormalML.g:12100:1: rule__Expression__Alternatives : ( ( ruleAssignmentExpression ) | ( ruleConditionalTestExpression ) );
+    public final void rule__Expression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12104:1: ( ( ruleAssignmentExpression ) | ( ruleConditionalTestExpression ) )
+            int alt234=2;
+            alt234 = dfa234.predict(input);
+            switch (alt234) {
+                case 1 :
+                    // InternalFormalML.g:12105:2: ( ruleAssignmentExpression )
+                    {
+                    // InternalFormalML.g:12105:2: ( ruleAssignmentExpression )
+                    // InternalFormalML.g:12106:3: ruleAssignmentExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getExpressionAccess().getAssignmentExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleAssignmentExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getExpressionAccess().getAssignmentExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12111:2: ( ruleConditionalTestExpression )
+                    {
+                    // InternalFormalML.g:12111:2: ( ruleConditionalTestExpression )
+                    // InternalFormalML.g:12112:3: ruleConditionalTestExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getExpressionAccess().getConditionalTestExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleConditionalTestExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getExpressionAccess().getConditionalTestExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Expression__Alternatives"
+
+
+    // $ANTLR start "rule__AssignmentOperator__Alternatives"
+    // InternalFormalML.g:12121:1: rule__AssignmentOperator__Alternatives : ( ( '=' ) | ( ':=' ) | ( '::=' ) | ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( '&&=' ) | ( '||=' ) | ( '&=' ) | ( '|=' ) | ( '^=' ) | ( '<<=' ) | ( '>>=' ) | ( '>>>=' ) | ( '<=<' ) | ( '^=<' ) | ( '^=>' ) | ( '>=>' ) );
+    public final void rule__AssignmentOperator__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12125:1: ( ( '=' ) | ( ':=' ) | ( '::=' ) | ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( '&&=' ) | ( '||=' ) | ( '&=' ) | ( '|=' ) | ( '^=' ) | ( '<<=' ) | ( '>>=' ) | ( '>>>=' ) | ( '<=<' ) | ( '^=<' ) | ( '^=>' ) | ( '>=>' ) )
+            int alt235=20;
+            switch ( input.LA(1) ) {
+            case 100:
+                {
+                alt235=1;
+                }
+                break;
+            case 101:
+                {
+                alt235=2;
+                }
+                break;
+            case 102:
+                {
+                alt235=3;
+                }
+                break;
+            case 103:
+                {
+                alt235=4;
+                }
+                break;
+            case 104:
+                {
+                alt235=5;
+                }
+                break;
+            case 105:
+                {
+                alt235=6;
+                }
+                break;
+            case 106:
+                {
+                alt235=7;
+                }
+                break;
+            case 107:
+                {
+                alt235=8;
+                }
+                break;
+            case 108:
+                {
+                alt235=9;
+                }
+                break;
+            case 109:
+                {
+                alt235=10;
+                }
+                break;
+            case 110:
+                {
+                alt235=11;
+                }
+                break;
+            case 111:
+                {
+                alt235=12;
+                }
+                break;
+            case 112:
+                {
+                alt235=13;
+                }
+                break;
+            case 113:
+                {
+                alt235=14;
+                }
+                break;
+            case 114:
+                {
+                alt235=15;
+                }
+                break;
+            case 115:
+                {
+                alt235=16;
+                }
+                break;
+            case 116:
+                {
+                alt235=17;
+                }
+                break;
+            case 117:
+                {
+                alt235=18;
+                }
+                break;
+            case 118:
+                {
+                alt235=19;
+                }
+                break;
+            case 119:
+                {
+                alt235=20;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 235, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt235) {
+                case 1 :
+                    // InternalFormalML.g:12126:2: ( '=' )
+                    {
+                    // InternalFormalML.g:12126:2: ( '=' )
+                    // InternalFormalML.g:12127:3: '='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getEqualsSignKeyword_0()); 
+                    }
+                    match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getEqualsSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12132:2: ( ':=' )
+                    {
+                    // InternalFormalML.g:12132:2: ( ':=' )
+                    // InternalFormalML.g:12133:3: ':='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getColonEqualsSignKeyword_1()); 
+                    }
+                    match(input,101,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getColonEqualsSignKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12138:2: ( '::=' )
+                    {
+                    // InternalFormalML.g:12138:2: ( '::=' )
+                    // InternalFormalML.g:12139:3: '::='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getColonColonEqualsSignKeyword_2()); 
+                    }
+                    match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getColonColonEqualsSignKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12144:2: ( '+=' )
+                    {
+                    // InternalFormalML.g:12144:2: ( '+=' )
+                    // InternalFormalML.g:12145:3: '+='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getPlusSignEqualsSignKeyword_3()); 
+                    }
+                    match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getPlusSignEqualsSignKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:12150:2: ( '-=' )
+                    {
+                    // InternalFormalML.g:12150:2: ( '-=' )
+                    // InternalFormalML.g:12151:3: '-='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getHyphenMinusEqualsSignKeyword_4()); 
+                    }
+                    match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getHyphenMinusEqualsSignKeyword_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:12156:2: ( '*=' )
+                    {
+                    // InternalFormalML.g:12156:2: ( '*=' )
+                    // InternalFormalML.g:12157:3: '*='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getAsteriskEqualsSignKeyword_5()); 
+                    }
+                    match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getAsteriskEqualsSignKeyword_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:12162:2: ( '/=' )
+                    {
+                    // InternalFormalML.g:12162:2: ( '/=' )
+                    // InternalFormalML.g:12163:3: '/='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getSolidusEqualsSignKeyword_6()); 
+                    }
+                    match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getSolidusEqualsSignKeyword_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:12168:2: ( '%=' )
+                    {
+                    // InternalFormalML.g:12168:2: ( '%=' )
+                    // InternalFormalML.g:12169:3: '%='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getPercentSignEqualsSignKeyword_7()); 
+                    }
+                    match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getPercentSignEqualsSignKeyword_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:12174:2: ( '&&=' )
+                    {
+                    // InternalFormalML.g:12174:2: ( '&&=' )
+                    // InternalFormalML.g:12175:3: '&&='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getAmpersandAmpersandEqualsSignKeyword_8()); 
+                    }
+                    match(input,108,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getAmpersandAmpersandEqualsSignKeyword_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:12180:2: ( '||=' )
+                    {
+                    // InternalFormalML.g:12180:2: ( '||=' )
+                    // InternalFormalML.g:12181:3: '||='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getVerticalLineVerticalLineEqualsSignKeyword_9()); 
+                    }
+                    match(input,109,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getVerticalLineVerticalLineEqualsSignKeyword_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalFormalML.g:12186:2: ( '&=' )
+                    {
+                    // InternalFormalML.g:12186:2: ( '&=' )
+                    // InternalFormalML.g:12187:3: '&='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getAmpersandEqualsSignKeyword_10()); 
+                    }
+                    match(input,110,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getAmpersandEqualsSignKeyword_10()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 12 :
+                    // InternalFormalML.g:12192:2: ( '|=' )
+                    {
+                    // InternalFormalML.g:12192:2: ( '|=' )
+                    // InternalFormalML.g:12193:3: '|='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getVerticalLineEqualsSignKeyword_11()); 
+                    }
+                    match(input,111,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getVerticalLineEqualsSignKeyword_11()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 13 :
+                    // InternalFormalML.g:12198:2: ( '^=' )
+                    {
+                    // InternalFormalML.g:12198:2: ( '^=' )
+                    // InternalFormalML.g:12199:3: '^='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignKeyword_12()); 
+                    }
+                    match(input,112,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignKeyword_12()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 14 :
+                    // InternalFormalML.g:12204:2: ( '<<=' )
+                    {
+                    // InternalFormalML.g:12204:2: ( '<<=' )
+                    // InternalFormalML.g:12205:3: '<<='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getLessThanSignLessThanSignEqualsSignKeyword_13()); 
+                    }
+                    match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getLessThanSignLessThanSignEqualsSignKeyword_13()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 15 :
+                    // InternalFormalML.g:12210:2: ( '>>=' )
+                    {
+                    // InternalFormalML.g:12210:2: ( '>>=' )
+                    // InternalFormalML.g:12211:3: '>>='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignEqualsSignKeyword_14()); 
+                    }
+                    match(input,114,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignEqualsSignKeyword_14()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 16 :
+                    // InternalFormalML.g:12216:2: ( '>>>=' )
+                    {
+                    // InternalFormalML.g:12216:2: ( '>>>=' )
+                    // InternalFormalML.g:12217:3: '>>>='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15()); 
+                    }
+                    match(input,115,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 17 :
+                    // InternalFormalML.g:12222:2: ( '<=<' )
+                    {
+                    // InternalFormalML.g:12222:2: ( '<=<' )
+                    // InternalFormalML.g:12223:3: '<=<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getLessThanSignEqualsSignLessThanSignKeyword_16()); 
+                    }
+                    match(input,116,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getLessThanSignEqualsSignLessThanSignKeyword_16()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 18 :
+                    // InternalFormalML.g:12228:2: ( '^=<' )
+                    {
+                    // InternalFormalML.g:12228:2: ( '^=<' )
+                    // InternalFormalML.g:12229:3: '^=<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignLessThanSignKeyword_17()); 
+                    }
+                    match(input,117,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignLessThanSignKeyword_17()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 19 :
+                    // InternalFormalML.g:12234:2: ( '^=>' )
+                    {
+                    // InternalFormalML.g:12234:2: ( '^=>' )
+                    // InternalFormalML.g:12235:3: '^=>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignGreaterThanSignKeyword_18()); 
+                    }
+                    match(input,118,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignGreaterThanSignKeyword_18()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 20 :
+                    // InternalFormalML.g:12240:2: ( '>=>' )
+                    {
+                    // InternalFormalML.g:12240:2: ( '>=>' )
+                    // InternalFormalML.g:12241:3: '>=>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignEqualsSignGreaterThanSignKeyword_19()); 
+                    }
+                    match(input,119,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignEqualsSignGreaterThanSignKeyword_19()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentOperator__Alternatives"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Alternatives_1"
+    // InternalFormalML.g:12250:1: rule__LeftHandSideExpression__Alternatives_1 : ( ( ( rule__LeftHandSideExpression__LvalueAssignment_1_0 ) ) | ( ( rule__LeftHandSideExpression__Group_1_1__0 ) ) );
+    public final void rule__LeftHandSideExpression__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12254:1: ( ( ( rule__LeftHandSideExpression__LvalueAssignment_1_0 ) ) | ( ( rule__LeftHandSideExpression__Group_1_1__0 ) ) )
+            int alt236=2;
+            int LA236_0 = input.LA(1);
+
+            if ( (LA236_0==RULE_XLIA_ID||(LA236_0>=141 && LA236_0<=142)||(LA236_0>=265 && LA236_0<=271)) ) {
+                alt236=1;
+            }
+            else if ( (LA236_0==23) ) {
+                alt236=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 236, 0, input);
+
+                throw nvae;
+            }
+            switch (alt236) {
+                case 1 :
+                    // InternalFormalML.g:12255:2: ( ( rule__LeftHandSideExpression__LvalueAssignment_1_0 ) )
+                    {
+                    // InternalFormalML.g:12255:2: ( ( rule__LeftHandSideExpression__LvalueAssignment_1_0 ) )
+                    // InternalFormalML.g:12256:3: ( rule__LeftHandSideExpression__LvalueAssignment_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_0()); 
+                    }
+                    // InternalFormalML.g:12257:3: ( rule__LeftHandSideExpression__LvalueAssignment_1_0 )
+                    // InternalFormalML.g:12257:4: rule__LeftHandSideExpression__LvalueAssignment_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LeftHandSideExpression__LvalueAssignment_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12261:2: ( ( rule__LeftHandSideExpression__Group_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:12261:2: ( ( rule__LeftHandSideExpression__Group_1_1__0 ) )
+                    // InternalFormalML.g:12262:3: ( rule__LeftHandSideExpression__Group_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLeftHandSideExpressionAccess().getGroup_1_1()); 
+                    }
+                    // InternalFormalML.g:12263:3: ( rule__LeftHandSideExpression__Group_1_1__0 )
+                    // InternalFormalML.g:12263:4: rule__LeftHandSideExpression__Group_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LeftHandSideExpression__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLeftHandSideExpressionAccess().getGroup_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Alternatives_1"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__OperatorAlternatives_1_1_0"
+    // InternalFormalML.g:12271:1: rule__LogicalOrExpression__OperatorAlternatives_1_1_0 : ( ( '||' ) | ( 'or' ) );
+    public final void rule__LogicalOrExpression__OperatorAlternatives_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12275:1: ( ( '||' ) | ( 'or' ) )
+            int alt237=2;
+            int LA237_0 = input.LA(1);
+
+            if ( (LA237_0==79) ) {
+                alt237=1;
+            }
+            else if ( (LA237_0==34) ) {
+                alt237=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 237, 0, input);
+
+                throw nvae;
+            }
+            switch (alt237) {
+                case 1 :
+                    // InternalFormalML.g:12276:2: ( '||' )
+                    {
+                    // InternalFormalML.g:12276:2: ( '||' )
+                    // InternalFormalML.g:12277:3: '||'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0()); 
+                    }
+                    match(input,79,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12282:2: ( 'or' )
+                    {
+                    // InternalFormalML.g:12282:2: ( 'or' )
+                    // InternalFormalML.g:12283:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1()); 
+                    }
+                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__OperatorAlternatives_1_1_0"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Alternatives_1_3_0"
+    // InternalFormalML.g:12292:1: rule__LogicalOrExpression__Alternatives_1_3_0 : ( ( '||' ) | ( 'or' ) );
+    public final void rule__LogicalOrExpression__Alternatives_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12296:1: ( ( '||' ) | ( 'or' ) )
+            int alt238=2;
+            int LA238_0 = input.LA(1);
+
+            if ( (LA238_0==79) ) {
+                alt238=1;
+            }
+            else if ( (LA238_0==34) ) {
+                alt238=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 238, 0, input);
+
+                throw nvae;
+            }
+            switch (alt238) {
+                case 1 :
+                    // InternalFormalML.g:12297:2: ( '||' )
+                    {
+                    // InternalFormalML.g:12297:2: ( '||' )
+                    // InternalFormalML.g:12298:3: '||'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()); 
+                    }
+                    match(input,79,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12303:2: ( 'or' )
+                    {
+                    // InternalFormalML.g:12303:2: ( 'or' )
+                    // InternalFormalML.g:12304:3: 'or'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalOrExpressionAccess().getOrKeyword_1_3_0_1()); 
+                    }
+                    match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalOrExpressionAccess().getOrKeyword_1_3_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Alternatives_1_3_0"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__OperatorAlternatives_1_1_0"
+    // InternalFormalML.g:12313:1: rule__LogicalAndExpression__OperatorAlternatives_1_1_0 : ( ( '&&' ) | ( 'and' ) );
+    public final void rule__LogicalAndExpression__OperatorAlternatives_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12317:1: ( ( '&&' ) | ( 'and' ) )
+            int alt239=2;
+            int LA239_0 = input.LA(1);
+
+            if ( (LA239_0==78) ) {
+                alt239=1;
+            }
+            else if ( (LA239_0==33) ) {
+                alt239=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 239, 0, input);
+
+                throw nvae;
+            }
+            switch (alt239) {
+                case 1 :
+                    // InternalFormalML.g:12318:2: ( '&&' )
+                    {
+                    // InternalFormalML.g:12318:2: ( '&&' )
+                    // InternalFormalML.g:12319:3: '&&'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0()); 
+                    }
+                    match(input,78,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12324:2: ( 'and' )
+                    {
+                    // InternalFormalML.g:12324:2: ( 'and' )
+                    // InternalFormalML.g:12325:3: 'and'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1()); 
+                    }
+                    match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__OperatorAlternatives_1_1_0"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Alternatives_1_3_0"
+    // InternalFormalML.g:12334:1: rule__LogicalAndExpression__Alternatives_1_3_0 : ( ( '&&' ) | ( 'and' ) );
+    public final void rule__LogicalAndExpression__Alternatives_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12338:1: ( ( '&&' ) | ( 'and' ) )
+            int alt240=2;
+            int LA240_0 = input.LA(1);
+
+            if ( (LA240_0==78) ) {
+                alt240=1;
+            }
+            else if ( (LA240_0==33) ) {
+                alt240=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 240, 0, input);
+
+                throw nvae;
+            }
+            switch (alt240) {
+                case 1 :
+                    // InternalFormalML.g:12339:2: ( '&&' )
+                    {
+                    // InternalFormalML.g:12339:2: ( '&&' )
+                    // InternalFormalML.g:12340:3: '&&'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()); 
+                    }
+                    match(input,78,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12345:2: ( 'and' )
+                    {
+                    // InternalFormalML.g:12345:2: ( 'and' )
+                    // InternalFormalML.g:12346:3: 'and'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalAndExpressionAccess().getAndKeyword_1_3_0_1()); 
+                    }
+                    match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalAndExpressionAccess().getAndKeyword_1_3_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Alternatives_1_3_0"
+
+
+    // $ANTLR start "rule__EqualityOperator__Alternatives"
+    // InternalFormalML.g:12355:1: rule__EqualityOperator__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '=!=' ) | ( '=/=' ) );
+    public final void rule__EqualityOperator__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12359:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '=!=' ) | ( '=/=' ) )
+            int alt241=5;
+            switch ( input.LA(1) ) {
+            case 120:
+                {
+                alt241=1;
+                }
+                break;
+            case 121:
+                {
+                alt241=2;
+                }
+                break;
+            case 122:
+                {
+                alt241=3;
+                }
+                break;
+            case 123:
+                {
+                alt241=4;
+                }
+                break;
+            case 124:
+                {
+                alt241=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 241, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt241) {
+                case 1 :
+                    // InternalFormalML.g:12360:2: ( '==' )
+                    {
+                    // InternalFormalML.g:12360:2: ( '==' )
+                    // InternalFormalML.g:12361:3: '=='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignKeyword_0()); 
+                    }
+                    match(input,120,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12366:2: ( '!=' )
+                    {
+                    // InternalFormalML.g:12366:2: ( '!=' )
+                    // InternalFormalML.g:12367:3: '!='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityOperatorAccess().getExclamationMarkEqualsSignKeyword_1()); 
+                    }
+                    match(input,121,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityOperatorAccess().getExclamationMarkEqualsSignKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12372:2: ( '===' )
+                    {
+                    // InternalFormalML.g:12372:2: ( '===' )
+                    // InternalFormalML.g:12373:3: '==='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
+                    }
+                    match(input,122,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12378:2: ( '=!=' )
+                    {
+                    // InternalFormalML.g:12378:2: ( '=!=' )
+                    // InternalFormalML.g:12379:3: '=!='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityOperatorAccess().getEqualsSignExclamationMarkEqualsSignKeyword_3()); 
+                    }
+                    match(input,123,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityOperatorAccess().getEqualsSignExclamationMarkEqualsSignKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:12384:2: ( '=/=' )
+                    {
+                    // InternalFormalML.g:12384:2: ( '=/=' )
+                    // InternalFormalML.g:12385:3: '=/='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEqualityOperatorAccess().getEqualsSignSolidusEqualsSignKeyword_4()); 
+                    }
+                    match(input,124,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEqualityOperatorAccess().getEqualsSignSolidusEqualsSignKeyword_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityOperator__Alternatives"
+
+
+    // $ANTLR start "rule__RelationalOperator__Alternatives"
+    // InternalFormalML.g:12394:1: rule__RelationalOperator__Alternatives : ( ( '<' ) | ( '>' ) | ( '<=' ) | ( '>=' ) );
+    public final void rule__RelationalOperator__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12398:1: ( ( '<' ) | ( '>' ) | ( '<=' ) | ( '>=' ) )
+            int alt242=4;
+            switch ( input.LA(1) ) {
+            case 125:
+                {
+                alt242=1;
+                }
+                break;
+            case 126:
+                {
+                alt242=2;
+                }
+                break;
+            case 127:
+                {
+                alt242=3;
+                }
+                break;
+            case 128:
+                {
+                alt242=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 242, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt242) {
+                case 1 :
+                    // InternalFormalML.g:12399:2: ( '<' )
+                    {
+                    // InternalFormalML.g:12399:2: ( '<' )
+                    // InternalFormalML.g:12400:3: '<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRelationalOperatorAccess().getLessThanSignKeyword_0()); 
+                    }
+                    match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRelationalOperatorAccess().getLessThanSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12405:2: ( '>' )
+                    {
+                    // InternalFormalML.g:12405:2: ( '>' )
+                    // InternalFormalML.g:12406:3: '>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRelationalOperatorAccess().getGreaterThanSignKeyword_1()); 
+                    }
+                    match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRelationalOperatorAccess().getGreaterThanSignKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12411:2: ( '<=' )
+                    {
+                    // InternalFormalML.g:12411:2: ( '<=' )
+                    // InternalFormalML.g:12412:3: '<='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRelationalOperatorAccess().getLessThanSignEqualsSignKeyword_2()); 
+                    }
+                    match(input,127,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRelationalOperatorAccess().getLessThanSignEqualsSignKeyword_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12417:2: ( '>=' )
+                    {
+                    // InternalFormalML.g:12417:2: ( '>=' )
+                    // InternalFormalML.g:12418:3: '>='
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getRelationalOperatorAccess().getGreaterThanSignEqualsSignKeyword_3()); 
+                    }
+                    match(input,128,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getRelationalOperatorAccess().getGreaterThanSignEqualsSignKeyword_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalOperator__Alternatives"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Alternatives_1"
+    // InternalFormalML.g:12427:1: rule__AdditiveExpression__Alternatives_1 : ( ( ( rule__AdditiveExpression__Group_1_0__0 ) ) | ( ( rule__AdditiveExpression__Group_1_1__0 ) ) );
+    public final void rule__AdditiveExpression__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12431:1: ( ( ( rule__AdditiveExpression__Group_1_0__0 ) ) | ( ( rule__AdditiveExpression__Group_1_1__0 ) ) )
+            int alt243=2;
+            int LA243_0 = input.LA(1);
+
+            if ( (LA243_0==131) ) {
+                alt243=1;
+            }
+            else if ( (LA243_0==132) ) {
+                alt243=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 243, 0, input);
+
+                throw nvae;
+            }
+            switch (alt243) {
+                case 1 :
+                    // InternalFormalML.g:12432:2: ( ( rule__AdditiveExpression__Group_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:12432:2: ( ( rule__AdditiveExpression__Group_1_0__0 ) )
+                    // InternalFormalML.g:12433:3: ( rule__AdditiveExpression__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0()); 
+                    }
+                    // InternalFormalML.g:12434:3: ( rule__AdditiveExpression__Group_1_0__0 )
+                    // InternalFormalML.g:12434:4: rule__AdditiveExpression__Group_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__AdditiveExpression__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12438:2: ( ( rule__AdditiveExpression__Group_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:12438:2: ( ( rule__AdditiveExpression__Group_1_1__0 ) )
+                    // InternalFormalML.g:12439:3: ( rule__AdditiveExpression__Group_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1()); 
+                    }
+                    // InternalFormalML.g:12440:3: ( rule__AdditiveExpression__Group_1_1__0 )
+                    // InternalFormalML.g:12440:4: rule__AdditiveExpression__Group_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__AdditiveExpression__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Alternatives_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Alternatives_1"
+    // InternalFormalML.g:12448:1: rule__MultiplicativeExpression__Alternatives_1 : ( ( ( rule__MultiplicativeExpression__Group_1_0__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_1__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_2__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_3__0 ) ) );
+    public final void rule__MultiplicativeExpression__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12452:1: ( ( ( rule__MultiplicativeExpression__Group_1_0__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_1__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_2__0 ) ) | ( ( rule__MultiplicativeExpression__Group_1_3__0 ) ) )
+            int alt244=4;
+            switch ( input.LA(1) ) {
+            case 58:
+                {
+                alt244=1;
+                }
+                break;
+            case 258:
+                {
+                alt244=2;
+                }
+                break;
+            case 259:
+                {
+                alt244=3;
+                }
+                break;
+            case 260:
+                {
+                alt244=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 244, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt244) {
+                case 1 :
+                    // InternalFormalML.g:12453:2: ( ( rule__MultiplicativeExpression__Group_1_0__0 ) )
+                    {
+                    // InternalFormalML.g:12453:2: ( ( rule__MultiplicativeExpression__Group_1_0__0 ) )
+                    // InternalFormalML.g:12454:3: ( rule__MultiplicativeExpression__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0()); 
+                    }
+                    // InternalFormalML.g:12455:3: ( rule__MultiplicativeExpression__Group_1_0__0 )
+                    // InternalFormalML.g:12455:4: rule__MultiplicativeExpression__Group_1_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MultiplicativeExpression__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12459:2: ( ( rule__MultiplicativeExpression__Group_1_1__0 ) )
+                    {
+                    // InternalFormalML.g:12459:2: ( ( rule__MultiplicativeExpression__Group_1_1__0 ) )
+                    // InternalFormalML.g:12460:3: ( rule__MultiplicativeExpression__Group_1_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1()); 
+                    }
+                    // InternalFormalML.g:12461:3: ( rule__MultiplicativeExpression__Group_1_1__0 )
+                    // InternalFormalML.g:12461:4: rule__MultiplicativeExpression__Group_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MultiplicativeExpression__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12465:2: ( ( rule__MultiplicativeExpression__Group_1_2__0 ) )
+                    {
+                    // InternalFormalML.g:12465:2: ( ( rule__MultiplicativeExpression__Group_1_2__0 ) )
+                    // InternalFormalML.g:12466:3: ( rule__MultiplicativeExpression__Group_1_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2()); 
+                    }
+                    // InternalFormalML.g:12467:3: ( rule__MultiplicativeExpression__Group_1_2__0 )
+                    // InternalFormalML.g:12467:4: rule__MultiplicativeExpression__Group_1_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MultiplicativeExpression__Group_1_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12471:2: ( ( rule__MultiplicativeExpression__Group_1_3__0 ) )
+                    {
+                    // InternalFormalML.g:12471:2: ( ( rule__MultiplicativeExpression__Group_1_3__0 ) )
+                    // InternalFormalML.g:12472:3: ( rule__MultiplicativeExpression__Group_1_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3()); 
+                    }
+                    // InternalFormalML.g:12473:3: ( rule__MultiplicativeExpression__Group_1_3__0 )
+                    // InternalFormalML.g:12473:4: rule__MultiplicativeExpression__Group_1_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MultiplicativeExpression__Group_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Alternatives_1"
+
+
+    // $ANTLR start "rule__UnaryExpression__Alternatives"
+    // InternalFormalML.g:12481:1: rule__UnaryExpression__Alternatives : ( ( ruleLiteralTerminalExpression ) | ( ruleArithmeticUnaryExpression ) | ( ruleLogicalUnaryExpression ) | ( ruleBitwiseUnaryExpression ) | ( ruleNewfreshExpression ) | ( ruleCastExpression ) | ( rulePrefixUnaryExpression ) | ( rulePostfixUnaryExpression ) | ( rulePrimaryExpression ) );
+    public final void rule__UnaryExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12485:1: ( ( ruleLiteralTerminalExpression ) | ( ruleArithmeticUnaryExpression ) | ( ruleLogicalUnaryExpression ) | ( ruleBitwiseUnaryExpression ) | ( ruleNewfreshExpression ) | ( ruleCastExpression ) | ( rulePrefixUnaryExpression ) | ( rulePostfixUnaryExpression ) | ( rulePrimaryExpression ) )
+            int alt245=9;
+            alt245 = dfa245.predict(input);
+            switch (alt245) {
+                case 1 :
+                    // InternalFormalML.g:12486:2: ( ruleLiteralTerminalExpression )
+                    {
+                    // InternalFormalML.g:12486:2: ( ruleLiteralTerminalExpression )
+                    // InternalFormalML.g:12487:3: ruleLiteralTerminalExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUnaryExpressionAccess().getLiteralTerminalExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralTerminalExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUnaryExpressionAccess().getLiteralTerminalExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12492:2: ( ruleArithmeticUnaryExpression )
+                    {
+                    // InternalFormalML.g:12492:2: ( ruleArithmeticUnaryExpression )
+                    // InternalFormalML.g:12493:3: ruleArithmeticUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUnaryExpressionAccess().getArithmeticUnaryExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleArithmeticUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUnaryExpressionAccess().getArithmeticUnaryExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12498:2: ( ruleLogicalUnaryExpression )
+                    {
+                    // InternalFormalML.g:12498:2: ( ruleLogicalUnaryExpression )
+                    // InternalFormalML.g:12499:3: ruleLogicalUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUnaryExpressionAccess().getLogicalUnaryExpressionParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLogicalUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUnaryExpressionAccess().getLogicalUnaryExpressionParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12504:2: ( ruleBitwiseUnaryExpression )
+                    {
+                    // InternalFormalML.g:12504:2: ( ruleBitwiseUnaryExpression )
+                    // InternalFormalML.g:12505:3: ruleBitwiseUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUnaryExpressionAccess().getBitwiseUnaryExpressionParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleBitwiseUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUnaryExpressionAccess().getBitwiseUnaryExpressionParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:12510:2: ( ruleNewfreshExpression )
+                    {
+                    // InternalFormalML.g:12510:2: ( ruleNewfreshExpression )
+                    // InternalFormalML.g:12511:3: ruleNewfreshExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUnaryExpressionAccess().getNewfreshExpressionParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleNewfreshExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUnaryExpressionAccess().getNewfreshExpressionParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:12516:2: ( ruleCastExpression )
+                    {
+                    // InternalFormalML.g:12516:2: ( ruleCastExpression )
+                    // InternalFormalML.g:12517:3: ruleCastExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUnaryExpressionAccess().getCastExpressionParserRuleCall_5()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleCastExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUnaryExpressionAccess().getCastExpressionParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:12522:2: ( rulePrefixUnaryExpression )
+                    {
+                    // InternalFormalML.g:12522:2: ( rulePrefixUnaryExpression )
+                    // InternalFormalML.g:12523:3: rulePrefixUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUnaryExpressionAccess().getPrefixUnaryExpressionParserRuleCall_6()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrefixUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUnaryExpressionAccess().getPrefixUnaryExpressionParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:12528:2: ( rulePostfixUnaryExpression )
+                    {
+                    // InternalFormalML.g:12528:2: ( rulePostfixUnaryExpression )
+                    // InternalFormalML.g:12529:3: rulePostfixUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUnaryExpressionAccess().getPostfixUnaryExpressionParserRuleCall_7()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePostfixUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUnaryExpressionAccess().getPostfixUnaryExpressionParserRuleCall_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:12534:2: ( rulePrimaryExpression )
+                    {
+                    // InternalFormalML.g:12534:2: ( rulePrimaryExpression )
+                    // InternalFormalML.g:12535:3: rulePrimaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getUnaryExpressionAccess().getPrimaryExpressionParserRuleCall_8()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rulePrimaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getUnaryExpressionAccess().getPrimaryExpressionParserRuleCall_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnaryExpression__Alternatives"
+
+
+    // $ANTLR start "rule__AffixOperator__Alternatives"
+    // InternalFormalML.g:12544:1: rule__AffixOperator__Alternatives : ( ( '++' ) | ( '--' ) );
+    public final void rule__AffixOperator__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12548:1: ( ( '++' ) | ( '--' ) )
+            int alt246=2;
+            int LA246_0 = input.LA(1);
+
+            if ( (LA246_0==129) ) {
+                alt246=1;
+            }
+            else if ( (LA246_0==130) ) {
+                alt246=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 246, 0, input);
+
+                throw nvae;
+            }
+            switch (alt246) {
+                case 1 :
+                    // InternalFormalML.g:12549:2: ( '++' )
+                    {
+                    // InternalFormalML.g:12549:2: ( '++' )
+                    // InternalFormalML.g:12550:3: '++'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAffixOperatorAccess().getPlusSignPlusSignKeyword_0()); 
+                    }
+                    match(input,129,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAffixOperatorAccess().getPlusSignPlusSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12555:2: ( '--' )
+                    {
+                    // InternalFormalML.g:12555:2: ( '--' )
+                    // InternalFormalML.g:12556:3: '--'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getAffixOperatorAccess().getHyphenMinusHyphenMinusKeyword_1()); 
+                    }
+                    match(input,130,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getAffixOperatorAccess().getHyphenMinusHyphenMinusKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AffixOperator__Alternatives"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Alternatives"
+    // InternalFormalML.g:12565:1: rule__NewfreshExpression__Alternatives : ( ( ( rule__NewfreshExpression__Group_0__0 ) ) | ( ( rule__NewfreshExpression__Group_1__0 ) ) );
+    public final void rule__NewfreshExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12569:1: ( ( ( rule__NewfreshExpression__Group_0__0 ) ) | ( ( rule__NewfreshExpression__Group_1__0 ) ) )
+            int alt247=2;
+            int LA247_0 = input.LA(1);
+
+            if ( (LA247_0==261) ) {
+                alt247=1;
+            }
+            else if ( (LA247_0==262) ) {
+                alt247=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 247, 0, input);
+
+                throw nvae;
+            }
+            switch (alt247) {
+                case 1 :
+                    // InternalFormalML.g:12570:2: ( ( rule__NewfreshExpression__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:12570:2: ( ( rule__NewfreshExpression__Group_0__0 ) )
+                    // InternalFormalML.g:12571:3: ( rule__NewfreshExpression__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNewfreshExpressionAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:12572:3: ( rule__NewfreshExpression__Group_0__0 )
+                    // InternalFormalML.g:12572:4: rule__NewfreshExpression__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__NewfreshExpression__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNewfreshExpressionAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12576:2: ( ( rule__NewfreshExpression__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:12576:2: ( ( rule__NewfreshExpression__Group_1__0 ) )
+                    // InternalFormalML.g:12577:3: ( rule__NewfreshExpression__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNewfreshExpressionAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:12578:3: ( rule__NewfreshExpression__Group_1__0 )
+                    // InternalFormalML.g:12578:4: rule__NewfreshExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__NewfreshExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNewfreshExpressionAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Alternatives"
+
+
+    // $ANTLR start "rule__ArithmeticUnaryOperator__Alternatives"
+    // InternalFormalML.g:12586:1: rule__ArithmeticUnaryOperator__Alternatives : ( ( '+' ) | ( '-' ) );
+    public final void rule__ArithmeticUnaryOperator__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12590:1: ( ( '+' ) | ( '-' ) )
+            int alt248=2;
+            int LA248_0 = input.LA(1);
+
+            if ( (LA248_0==131) ) {
+                alt248=1;
+            }
+            else if ( (LA248_0==132) ) {
+                alt248=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 248, 0, input);
+
+                throw nvae;
+            }
+            switch (alt248) {
+                case 1 :
+                    // InternalFormalML.g:12591:2: ( '+' )
+                    {
+                    // InternalFormalML.g:12591:2: ( '+' )
+                    // InternalFormalML.g:12592:3: '+'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getArithmeticUnaryOperatorAccess().getPlusSignKeyword_0()); 
+                    }
+                    match(input,131,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getArithmeticUnaryOperatorAccess().getPlusSignKeyword_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12597:2: ( '-' )
+                    {
+                    // InternalFormalML.g:12597:2: ( '-' )
+                    // InternalFormalML.g:12598:3: '-'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getArithmeticUnaryOperatorAccess().getHyphenMinusKeyword_1()); 
+                    }
+                    match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getArithmeticUnaryOperatorAccess().getHyphenMinusKeyword_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArithmeticUnaryOperator__Alternatives"
+
+
+    // $ANTLR start "rule__LogicalUnaryExpression__OperatorAlternatives_0_0"
+    // InternalFormalML.g:12607:1: rule__LogicalUnaryExpression__OperatorAlternatives_0_0 : ( ( '!' ) | ( 'not' ) );
+    public final void rule__LogicalUnaryExpression__OperatorAlternatives_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12611:1: ( ( '!' ) | ( 'not' ) )
+            int alt249=2;
+            int LA249_0 = input.LA(1);
+
+            if ( (LA249_0==133) ) {
+                alt249=1;
+            }
+            else if ( (LA249_0==134) ) {
+                alt249=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 249, 0, input);
+
+                throw nvae;
+            }
+            switch (alt249) {
+                case 1 :
+                    // InternalFormalML.g:12612:2: ( '!' )
+                    {
+                    // InternalFormalML.g:12612:2: ( '!' )
+                    // InternalFormalML.g:12613:3: '!'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorExclamationMarkKeyword_0_0_0()); 
+                    }
+                    match(input,133,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorExclamationMarkKeyword_0_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12618:2: ( 'not' )
+                    {
+                    // InternalFormalML.g:12618:2: ( 'not' )
+                    // InternalFormalML.g:12619:3: 'not'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorNotKeyword_0_0_1()); 
+                    }
+                    match(input,134,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorNotKeyword_0_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalUnaryExpression__OperatorAlternatives_0_0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Alternatives_1_3"
+    // InternalFormalML.g:12628:1: rule__PrimaryExpression__Alternatives_1_3 : ( ( ( rule__PrimaryExpression__Group_1_3_0__0 ) ) | ( ( rule__PrimaryExpression__Group_1_3_1__0 ) ) );
+    public final void rule__PrimaryExpression__Alternatives_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12632:1: ( ( ( rule__PrimaryExpression__Group_1_3_0__0 ) ) | ( ( rule__PrimaryExpression__Group_1_3_1__0 ) ) )
+            int alt250=2;
+            int LA250_0 = input.LA(1);
+
+            if ( (LA250_0==22) ) {
+                alt250=1;
+            }
+            else if ( (LA250_0==23) ) {
+                alt250=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 250, 0, input);
+
+                throw nvae;
+            }
+            switch (alt250) {
+                case 1 :
+                    // InternalFormalML.g:12633:2: ( ( rule__PrimaryExpression__Group_1_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:12633:2: ( ( rule__PrimaryExpression__Group_1_3_0__0 ) )
+                    // InternalFormalML.g:12634:3: ( rule__PrimaryExpression__Group_1_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_0()); 
+                    }
+                    // InternalFormalML.g:12635:3: ( rule__PrimaryExpression__Group_1_3_0__0 )
+                    // InternalFormalML.g:12635:4: rule__PrimaryExpression__Group_1_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_1_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12639:2: ( ( rule__PrimaryExpression__Group_1_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:12639:2: ( ( rule__PrimaryExpression__Group_1_3_1__0 ) )
+                    // InternalFormalML.g:12640:3: ( rule__PrimaryExpression__Group_1_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_1()); 
+                    }
+                    // InternalFormalML.g:12641:3: ( rule__PrimaryExpression__Group_1_3_1__0 )
+                    // InternalFormalML.g:12641:4: rule__PrimaryExpression__Group_1_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_1_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_1_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Alternatives_1_3"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Alternatives_2_3"
+    // InternalFormalML.g:12649:1: rule__PrimaryExpression__Alternatives_2_3 : ( ( ( rule__PrimaryExpression__Group_2_3_0__0 ) ) | ( ( rule__PrimaryExpression__Group_2_3_1__0 ) ) );
+    public final void rule__PrimaryExpression__Alternatives_2_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12653:1: ( ( ( rule__PrimaryExpression__Group_2_3_0__0 ) ) | ( ( rule__PrimaryExpression__Group_2_3_1__0 ) ) )
+            int alt251=2;
+            int LA251_0 = input.LA(1);
+
+            if ( (LA251_0==22) ) {
+                alt251=1;
+            }
+            else if ( (LA251_0==23) ) {
+                alt251=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 251, 0, input);
+
+                throw nvae;
+            }
+            switch (alt251) {
+                case 1 :
+                    // InternalFormalML.g:12654:2: ( ( rule__PrimaryExpression__Group_2_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:12654:2: ( ( rule__PrimaryExpression__Group_2_3_0__0 ) )
+                    // InternalFormalML.g:12655:3: ( rule__PrimaryExpression__Group_2_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_0()); 
+                    }
+                    // InternalFormalML.g:12656:3: ( rule__PrimaryExpression__Group_2_3_0__0 )
+                    // InternalFormalML.g:12656:4: rule__PrimaryExpression__Group_2_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_2_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12660:2: ( ( rule__PrimaryExpression__Group_2_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:12660:2: ( ( rule__PrimaryExpression__Group_2_3_1__0 ) )
+                    // InternalFormalML.g:12661:3: ( rule__PrimaryExpression__Group_2_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_1()); 
+                    }
+                    // InternalFormalML.g:12662:3: ( rule__PrimaryExpression__Group_2_3_1__0 )
+                    // InternalFormalML.g:12662:4: rule__PrimaryExpression__Group_2_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_2_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Alternatives_2_3"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Alternatives_2_4_3"
+    // InternalFormalML.g:12670:1: rule__PrimaryExpression__Alternatives_2_4_3 : ( ( ( rule__PrimaryExpression__Group_2_4_3_0__0 ) ) | ( ( rule__PrimaryExpression__Group_2_4_3_1__0 ) ) );
+    public final void rule__PrimaryExpression__Alternatives_2_4_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12674:1: ( ( ( rule__PrimaryExpression__Group_2_4_3_0__0 ) ) | ( ( rule__PrimaryExpression__Group_2_4_3_1__0 ) ) )
+            int alt252=2;
+            int LA252_0 = input.LA(1);
+
+            if ( (LA252_0==22) ) {
+                alt252=1;
+            }
+            else if ( (LA252_0==23) ) {
+                alt252=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 252, 0, input);
+
+                throw nvae;
+            }
+            switch (alt252) {
+                case 1 :
+                    // InternalFormalML.g:12675:2: ( ( rule__PrimaryExpression__Group_2_4_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:12675:2: ( ( rule__PrimaryExpression__Group_2_4_3_0__0 ) )
+                    // InternalFormalML.g:12676:3: ( rule__PrimaryExpression__Group_2_4_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_0()); 
+                    }
+                    // InternalFormalML.g:12677:3: ( rule__PrimaryExpression__Group_2_4_3_0__0 )
+                    // InternalFormalML.g:12677:4: rule__PrimaryExpression__Group_2_4_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_2_4_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12681:2: ( ( rule__PrimaryExpression__Group_2_4_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:12681:2: ( ( rule__PrimaryExpression__Group_2_4_3_1__0 ) )
+                    // InternalFormalML.g:12682:3: ( rule__PrimaryExpression__Group_2_4_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_1()); 
+                    }
+                    // InternalFormalML.g:12683:3: ( rule__PrimaryExpression__Group_2_4_3_1__0 )
+                    // InternalFormalML.g:12683:4: rule__PrimaryExpression__Group_2_4_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_2_4_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Alternatives_2_4_3"
+
+
+    // $ANTLR start "rule__BaseExpression__Alternatives"
+    // InternalFormalML.g:12691:1: rule__BaseExpression__Alternatives : ( ( ruleLiteralReferenceableExpression ) | ( ( rule__BaseExpression__Group_1__0 ) ) | ( ruleInvokeExpressionDeprecated ) | ( ruleInstantiationExpression ) );
+    public final void rule__BaseExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12695:1: ( ( ruleLiteralReferenceableExpression ) | ( ( rule__BaseExpression__Group_1__0 ) ) | ( ruleInvokeExpressionDeprecated ) | ( ruleInstantiationExpression ) )
+            int alt253=4;
+            switch ( input.LA(1) ) {
+            case RULE_XLIA_ID:
+            case 125:
+            case 141:
+            case 142:
+            case 199:
+            case 265:
+            case 266:
+            case 267:
+            case 268:
+            case 269:
+            case 270:
+            case 271:
+                {
+                alt253=1;
+                }
+                break;
+            case 23:
+                {
+                alt253=2;
+                }
+                break;
+            case 262:
+                {
+                alt253=3;
+                }
+                break;
+            case 264:
+                {
+                alt253=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 253, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt253) {
+                case 1 :
+                    // InternalFormalML.g:12696:2: ( ruleLiteralReferenceableExpression )
+                    {
+                    // InternalFormalML.g:12696:2: ( ruleLiteralReferenceableExpression )
+                    // InternalFormalML.g:12697:3: ruleLiteralReferenceableExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBaseExpressionAccess().getLiteralReferenceableExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralReferenceableExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBaseExpressionAccess().getLiteralReferenceableExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12702:2: ( ( rule__BaseExpression__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:12702:2: ( ( rule__BaseExpression__Group_1__0 ) )
+                    // InternalFormalML.g:12703:3: ( rule__BaseExpression__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBaseExpressionAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:12704:3: ( rule__BaseExpression__Group_1__0 )
+                    // InternalFormalML.g:12704:4: rule__BaseExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BaseExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBaseExpressionAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12708:2: ( ruleInvokeExpressionDeprecated )
+                    {
+                    // InternalFormalML.g:12708:2: ( ruleInvokeExpressionDeprecated )
+                    // InternalFormalML.g:12709:3: ruleInvokeExpressionDeprecated
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBaseExpressionAccess().getInvokeExpressionDeprecatedParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleInvokeExpressionDeprecated();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBaseExpressionAccess().getInvokeExpressionDeprecatedParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12714:2: ( ruleInstantiationExpression )
+                    {
+                    // InternalFormalML.g:12714:2: ( ruleInstantiationExpression )
+                    // InternalFormalML.g:12715:3: ruleInstantiationExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBaseExpressionAccess().getInstantiationExpressionParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleInstantiationExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBaseExpressionAccess().getInstantiationExpressionParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BaseExpression__Alternatives"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Alternatives_3"
+    // InternalFormalML.g:12724:1: rule__DynamicInstanceSpecification__Alternatives_3 : ( ( ( rule__DynamicInstanceSpecification__Group_3_0__0 ) ) | ( ( rule__DynamicInstanceSpecification__Group_3_1__0 ) ) );
+    public final void rule__DynamicInstanceSpecification__Alternatives_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12728:1: ( ( ( rule__DynamicInstanceSpecification__Group_3_0__0 ) ) | ( ( rule__DynamicInstanceSpecification__Group_3_1__0 ) ) )
+            int alt254=2;
+            int LA254_0 = input.LA(1);
+
+            if ( (LA254_0==23) ) {
+                alt254=1;
+            }
+            else if ( (LA254_0==199) ) {
+                alt254=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 254, 0, input);
+
+                throw nvae;
+            }
+            switch (alt254) {
+                case 1 :
+                    // InternalFormalML.g:12729:2: ( ( rule__DynamicInstanceSpecification__Group_3_0__0 ) )
+                    {
+                    // InternalFormalML.g:12729:2: ( ( rule__DynamicInstanceSpecification__Group_3_0__0 ) )
+                    // InternalFormalML.g:12730:3: ( rule__DynamicInstanceSpecification__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:12731:3: ( rule__DynamicInstanceSpecification__Group_3_0__0 )
+                    // InternalFormalML.g:12731:4: rule__DynamicInstanceSpecification__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DynamicInstanceSpecification__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12735:2: ( ( rule__DynamicInstanceSpecification__Group_3_1__0 ) )
+                    {
+                    // InternalFormalML.g:12735:2: ( ( rule__DynamicInstanceSpecification__Group_3_1__0 ) )
+                    // InternalFormalML.g:12736:3: ( rule__DynamicInstanceSpecification__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:12737:3: ( rule__DynamicInstanceSpecification__Group_3_1__0 )
+                    // InternalFormalML.g:12737:4: rule__DynamicInstanceSpecification__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DynamicInstanceSpecification__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Alternatives_3"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__ValueAlternatives_1_0"
+    // InternalFormalML.g:12745:1: rule__MixTupleExpressionList__ValueAlternatives_1_0 : ( ( ruleExpression ) | ( ruleNamedExpression ) );
+    public final void rule__MixTupleExpressionList__ValueAlternatives_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12749:1: ( ( ruleExpression ) | ( ruleNamedExpression ) )
+            int alt255=2;
+            int LA255_0 = input.LA(1);
+
+            if ( (LA255_0==RULE_XLIA_ID) ) {
+                int LA255_1 = input.LA(2);
+
+                if ( (LA255_1==EOF||(LA255_1>=20 && LA255_1<=23)||(LA255_1>=33 && LA255_1<=34)||LA255_1==45||LA255_1==58||(LA255_1>=78 && LA255_1<=79)||(LA255_1>=100 && LA255_1<=132)||LA255_1==198||LA255_1==213||LA255_1==215||LA255_1==242||(LA255_1>=256 && LA255_1<=260)||LA255_1==286) ) {
+                    alt255=1;
+                }
+                else if ( (LA255_1==31||(LA255_1>=135 && LA255_1<=136)) ) {
+                    alt255=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 255, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( ((LA255_0>=RULE_CHARACTER && LA255_0<=RULE_STRING)||LA255_0==RULE_INT||LA255_0==20||LA255_0==23||(LA255_0>=29 && LA255_0<=30)||LA255_0==125||(LA255_0>=129 && LA255_0<=134)||(LA255_0>=137 && LA255_0<=142)||LA255_0==199||(LA255_0>=261 && LA255_0<=271)||LA255_0==287) ) {
+                alt255=1;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 255, 0, input);
+
+                throw nvae;
+            }
+            switch (alt255) {
+                case 1 :
+                    // InternalFormalML.g:12750:2: ( ruleExpression )
+                    {
+                    // InternalFormalML.g:12750:2: ( ruleExpression )
+                    // InternalFormalML.g:12751:3: ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_1_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12756:2: ( ruleNamedExpression )
+                    {
+                    // InternalFormalML.g:12756:2: ( ruleNamedExpression )
+                    // InternalFormalML.g:12757:3: ruleNamedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_1_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleNamedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__ValueAlternatives_1_0"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__ValueAlternatives_2_1_0"
+    // InternalFormalML.g:12766:1: rule__MixTupleExpressionList__ValueAlternatives_2_1_0 : ( ( ruleExpression ) | ( ruleNamedExpression ) );
+    public final void rule__MixTupleExpressionList__ValueAlternatives_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12770:1: ( ( ruleExpression ) | ( ruleNamedExpression ) )
+            int alt256=2;
+            int LA256_0 = input.LA(1);
+
+            if ( (LA256_0==RULE_XLIA_ID) ) {
+                int LA256_1 = input.LA(2);
+
+                if ( (LA256_1==EOF||(LA256_1>=20 && LA256_1<=23)||(LA256_1>=33 && LA256_1<=34)||LA256_1==45||LA256_1==58||(LA256_1>=78 && LA256_1<=79)||(LA256_1>=100 && LA256_1<=132)||LA256_1==198||LA256_1==213||LA256_1==215||LA256_1==242||(LA256_1>=256 && LA256_1<=260)||LA256_1==286) ) {
+                    alt256=1;
+                }
+                else if ( (LA256_1==31||(LA256_1>=135 && LA256_1<=136)) ) {
+                    alt256=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 256, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( ((LA256_0>=RULE_CHARACTER && LA256_0<=RULE_STRING)||LA256_0==RULE_INT||LA256_0==20||LA256_0==23||(LA256_0>=29 && LA256_0<=30)||LA256_0==125||(LA256_0>=129 && LA256_0<=134)||(LA256_0>=137 && LA256_0<=142)||LA256_0==199||(LA256_0>=261 && LA256_0<=271)||LA256_0==287) ) {
+                alt256=1;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 256, 0, input);
+
+                throw nvae;
+            }
+            switch (alt256) {
+                case 1 :
+                    // InternalFormalML.g:12771:2: ( ruleExpression )
+                    {
+                    // InternalFormalML.g:12771:2: ( ruleExpression )
+                    // InternalFormalML.g:12772:3: ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_2_1_0_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_2_1_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12777:2: ( ruleNamedExpression )
+                    {
+                    // InternalFormalML.g:12777:2: ( ruleNamedExpression )
+                    // InternalFormalML.g:12778:3: ruleNamedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_2_1_0_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleNamedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_2_1_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__ValueAlternatives_2_1_0"
+
+
+    // $ANTLR start "rule__NamedExpression__Alternatives_1"
+    // InternalFormalML.g:12787:1: rule__NamedExpression__Alternatives_1 : ( ( ':' ) | ( '=>' ) | ( '<-' ) );
+    public final void rule__NamedExpression__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12791:1: ( ( ':' ) | ( '=>' ) | ( '<-' ) )
+            int alt257=3;
+            switch ( input.LA(1) ) {
+            case 31:
+                {
+                alt257=1;
+                }
+                break;
+            case 135:
+                {
+                alt257=2;
+                }
+                break;
+            case 136:
+                {
+                alt257=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 257, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt257) {
+                case 1 :
+                    // InternalFormalML.g:12792:2: ( ':' )
+                    {
+                    // InternalFormalML.g:12792:2: ( ':' )
+                    // InternalFormalML.g:12793:3: ':'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNamedExpressionAccess().getColonKeyword_1_0()); 
+                    }
+                    match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNamedExpressionAccess().getColonKeyword_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12798:2: ( '=>' )
+                    {
+                    // InternalFormalML.g:12798:2: ( '=>' )
+                    // InternalFormalML.g:12799:3: '=>'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNamedExpressionAccess().getEqualsSignGreaterThanSignKeyword_1_1()); 
+                    }
+                    match(input,135,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNamedExpressionAccess().getEqualsSignGreaterThanSignKeyword_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12804:2: ( '<-' )
+                    {
+                    // InternalFormalML.g:12804:2: ( '<-' )
+                    // InternalFormalML.g:12805:3: '<-'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getNamedExpressionAccess().getLessThanSignHyphenMinusKeyword_1_2()); 
+                    }
+                    match(input,136,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getNamedExpressionAccess().getLessThanSignHyphenMinusKeyword_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NamedExpression__Alternatives_1"
+
+
+    // $ANTLR start "rule__LiteralReferenceableExpression__Alternatives"
+    // InternalFormalML.g:12814:1: rule__LiteralReferenceableExpression__Alternatives : ( ( ruleLiteralCollectionExpression ) | ( ruleLiteralReferenceExpression ) );
+    public final void rule__LiteralReferenceableExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12818:1: ( ( ruleLiteralCollectionExpression ) | ( ruleLiteralReferenceExpression ) )
+            int alt258=2;
+            int LA258_0 = input.LA(1);
+
+            if ( (LA258_0==125||LA258_0==199) ) {
+                alt258=1;
+            }
+            else if ( (LA258_0==RULE_XLIA_ID||(LA258_0>=141 && LA258_0<=142)||(LA258_0>=265 && LA258_0<=271)) ) {
+                alt258=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 258, 0, input);
+
+                throw nvae;
+            }
+            switch (alt258) {
+                case 1 :
+                    // InternalFormalML.g:12819:2: ( ruleLiteralCollectionExpression )
+                    {
+                    // InternalFormalML.g:12819:2: ( ruleLiteralCollectionExpression )
+                    // InternalFormalML.g:12820:3: ruleLiteralCollectionExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralCollectionExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralCollectionExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralCollectionExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12825:2: ( ruleLiteralReferenceExpression )
+                    {
+                    // InternalFormalML.g:12825:2: ( ruleLiteralReferenceExpression )
+                    // InternalFormalML.g:12826:3: ruleLiteralReferenceExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralReferenceExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralReferenceExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralReferenceExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceableExpression__Alternatives"
+
+
+    // $ANTLR start "rule__LiteralTerminalExpression__Alternatives"
+    // InternalFormalML.g:12835:1: rule__LiteralTerminalExpression__Alternatives : ( ( ruleLiteralBooleanExpression ) | ( ruleLiteralIntegerExpression ) | ( ruleLiteralRationalExpression ) | ( ruleLiteralFloatExpression ) | ( ruleLiteralCharacterExpression ) | ( ruleLiteralStringExpression ) | ( ruleLiteralNullExpression ) );
+    public final void rule__LiteralTerminalExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12839:1: ( ( ruleLiteralBooleanExpression ) | ( ruleLiteralIntegerExpression ) | ( ruleLiteralRationalExpression ) | ( ruleLiteralFloatExpression ) | ( ruleLiteralCharacterExpression ) | ( ruleLiteralStringExpression ) | ( ruleLiteralNullExpression ) )
+            int alt259=7;
+            alt259 = dfa259.predict(input);
+            switch (alt259) {
+                case 1 :
+                    // InternalFormalML.g:12840:2: ( ruleLiteralBooleanExpression )
+                    {
+                    // InternalFormalML.g:12840:2: ( ruleLiteralBooleanExpression )
+                    // InternalFormalML.g:12841:3: ruleLiteralBooleanExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralBooleanExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralBooleanExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralBooleanExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12846:2: ( ruleLiteralIntegerExpression )
+                    {
+                    // InternalFormalML.g:12846:2: ( ruleLiteralIntegerExpression )
+                    // InternalFormalML.g:12847:3: ruleLiteralIntegerExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralIntegerExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralIntegerExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralIntegerExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12852:2: ( ruleLiteralRationalExpression )
+                    {
+                    // InternalFormalML.g:12852:2: ( ruleLiteralRationalExpression )
+                    // InternalFormalML.g:12853:3: ruleLiteralRationalExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralRationalExpressionParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralRationalExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralRationalExpressionParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12858:2: ( ruleLiteralFloatExpression )
+                    {
+                    // InternalFormalML.g:12858:2: ( ruleLiteralFloatExpression )
+                    // InternalFormalML.g:12859:3: ruleLiteralFloatExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralFloatExpressionParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralFloatExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralFloatExpressionParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:12864:2: ( ruleLiteralCharacterExpression )
+                    {
+                    // InternalFormalML.g:12864:2: ( ruleLiteralCharacterExpression )
+                    // InternalFormalML.g:12865:3: ruleLiteralCharacterExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralCharacterExpressionParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralCharacterExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralCharacterExpressionParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:12870:2: ( ruleLiteralStringExpression )
+                    {
+                    // InternalFormalML.g:12870:2: ( ruleLiteralStringExpression )
+                    // InternalFormalML.g:12871:3: ruleLiteralStringExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralStringExpressionParserRuleCall_5()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralStringExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralStringExpressionParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:12876:2: ( ruleLiteralNullExpression )
+                    {
+                    // InternalFormalML.g:12876:2: ( ruleLiteralNullExpression )
+                    // InternalFormalML.g:12877:3: ruleLiteralNullExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralNullExpressionParserRuleCall_6()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralNullExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralNullExpressionParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTerminalExpression__Alternatives"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Alternatives"
+    // InternalFormalML.g:12886:1: rule__LiteralNullExpression__Alternatives : ( ( ( rule__LiteralNullExpression__Group_0__0 ) ) | ( ( rule__LiteralNullExpression__Group_1__0 ) ) );
+    public final void rule__LiteralNullExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12890:1: ( ( ( rule__LiteralNullExpression__Group_0__0 ) ) | ( ( rule__LiteralNullExpression__Group_1__0 ) ) )
+            int alt260=2;
+            int LA260_0 = input.LA(1);
+
+            if ( ((LA260_0>=137 && LA260_0<=138)) ) {
+                alt260=1;
+            }
+            else if ( ((LA260_0>=139 && LA260_0<=140)) ) {
+                alt260=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 260, 0, input);
+
+                throw nvae;
+            }
+            switch (alt260) {
+                case 1 :
+                    // InternalFormalML.g:12891:2: ( ( rule__LiteralNullExpression__Group_0__0 ) )
+                    {
+                    // InternalFormalML.g:12891:2: ( ( rule__LiteralNullExpression__Group_0__0 ) )
+                    // InternalFormalML.g:12892:3: ( rule__LiteralNullExpression__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralNullExpressionAccess().getGroup_0()); 
+                    }
+                    // InternalFormalML.g:12893:3: ( rule__LiteralNullExpression__Group_0__0 )
+                    // InternalFormalML.g:12893:4: rule__LiteralNullExpression__Group_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralNullExpression__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralNullExpressionAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12897:2: ( ( rule__LiteralNullExpression__Group_1__0 ) )
+                    {
+                    // InternalFormalML.g:12897:2: ( ( rule__LiteralNullExpression__Group_1__0 ) )
+                    // InternalFormalML.g:12898:3: ( rule__LiteralNullExpression__Group_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralNullExpressionAccess().getGroup_1()); 
+                    }
+                    // InternalFormalML.g:12899:3: ( rule__LiteralNullExpression__Group_1__0 )
+                    // InternalFormalML.g:12899:4: rule__LiteralNullExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralNullExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralNullExpressionAccess().getGroup_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Alternatives"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Alternatives_0_1"
+    // InternalFormalML.g:12907:1: rule__LiteralNullExpression__Alternatives_0_1 : ( ( 'null' ) | ( '$null' ) );
+    public final void rule__LiteralNullExpression__Alternatives_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12911:1: ( ( 'null' ) | ( '$null' ) )
+            int alt261=2;
+            int LA261_0 = input.LA(1);
+
+            if ( (LA261_0==137) ) {
+                alt261=1;
+            }
+            else if ( (LA261_0==138) ) {
+                alt261=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 261, 0, input);
+
+                throw nvae;
+            }
+            switch (alt261) {
+                case 1 :
+                    // InternalFormalML.g:12912:2: ( 'null' )
+                    {
+                    // InternalFormalML.g:12912:2: ( 'null' )
+                    // InternalFormalML.g:12913:3: 'null'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_0()); 
+                    }
+                    match(input,137,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12918:2: ( '$null' )
+                    {
+                    // InternalFormalML.g:12918:2: ( '$null' )
+                    // InternalFormalML.g:12919:3: '$null'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_1()); 
+                    }
+                    match(input,138,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Alternatives_0_1"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Alternatives_1_1"
+    // InternalFormalML.g:12928:1: rule__LiteralNullExpression__Alternatives_1_1 : ( ( 'null<' ) | ( '$null<' ) );
+    public final void rule__LiteralNullExpression__Alternatives_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12932:1: ( ( 'null<' ) | ( '$null<' ) )
+            int alt262=2;
+            int LA262_0 = input.LA(1);
+
+            if ( (LA262_0==139) ) {
+                alt262=1;
+            }
+            else if ( (LA262_0==140) ) {
+                alt262=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 262, 0, input);
+
+                throw nvae;
+            }
+            switch (alt262) {
+                case 1 :
+                    // InternalFormalML.g:12933:2: ( 'null<' )
+                    {
+                    // InternalFormalML.g:12933:2: ( 'null<' )
+                    // InternalFormalML.g:12934:3: 'null<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_0()); 
+                    }
+                    match(input,139,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12939:2: ( '$null<' )
+                    {
+                    // InternalFormalML.g:12939:2: ( '$null<' )
+                    // InternalFormalML.g:12940:3: '$null<'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_1()); 
+                    }
+                    match(input,140,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Alternatives_1_1"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Alternatives_3_0"
+    // InternalFormalML.g:12949:1: rule__LiteralCollectionExpression__Alternatives_3_0 : ( ( ( rule__LiteralCollectionExpression__ValueAssignment_3_0_0 ) ) | ( ( rule__LiteralCollectionExpression__ValueAssignment_3_0_1 ) ) );
+    public final void rule__LiteralCollectionExpression__Alternatives_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12953:1: ( ( ( rule__LiteralCollectionExpression__ValueAssignment_3_0_0 ) ) | ( ( rule__LiteralCollectionExpression__ValueAssignment_3_0_1 ) ) )
+            int alt263=2;
+            int LA263_0 = input.LA(1);
+
+            if ( (LA263_0==RULE_XLIA_ID) ) {
+                int LA263_1 = input.LA(2);
+
+                if ( (LA263_1==EOF||(LA263_1>=20 && LA263_1<=23)||(LA263_1>=33 && LA263_1<=34)||LA263_1==58||(LA263_1>=78 && LA263_1<=79)||(LA263_1>=100 && LA263_1<=132)||LA263_1==198||LA263_1==200||LA263_1==242||(LA263_1>=256 && LA263_1<=260)||LA263_1==286) ) {
+                    alt263=1;
+                }
+                else if ( (LA263_1==31||(LA263_1>=135 && LA263_1<=136)) ) {
+                    alt263=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 263, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( ((LA263_0>=RULE_CHARACTER && LA263_0<=RULE_STRING)||LA263_0==RULE_INT||LA263_0==20||LA263_0==23||(LA263_0>=29 && LA263_0<=30)||LA263_0==125||(LA263_0>=129 && LA263_0<=134)||(LA263_0>=137 && LA263_0<=142)||LA263_0==199||(LA263_0>=261 && LA263_0<=271)||LA263_0==287) ) {
+                alt263=1;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 263, 0, input);
+
+                throw nvae;
+            }
+            switch (alt263) {
+                case 1 :
+                    // InternalFormalML.g:12954:2: ( ( rule__LiteralCollectionExpression__ValueAssignment_3_0_0 ) )
+                    {
+                    // InternalFormalML.g:12954:2: ( ( rule__LiteralCollectionExpression__ValueAssignment_3_0_0 ) )
+                    // InternalFormalML.g:12955:3: ( rule__LiteralCollectionExpression__ValueAssignment_3_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_0()); 
+                    }
+                    // InternalFormalML.g:12956:3: ( rule__LiteralCollectionExpression__ValueAssignment_3_0_0 )
+                    // InternalFormalML.g:12956:4: rule__LiteralCollectionExpression__ValueAssignment_3_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralCollectionExpression__ValueAssignment_3_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12960:2: ( ( rule__LiteralCollectionExpression__ValueAssignment_3_0_1 ) )
+                    {
+                    // InternalFormalML.g:12960:2: ( ( rule__LiteralCollectionExpression__ValueAssignment_3_0_1 ) )
+                    // InternalFormalML.g:12961:3: ( rule__LiteralCollectionExpression__ValueAssignment_3_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_1()); 
+                    }
+                    // InternalFormalML.g:12962:3: ( rule__LiteralCollectionExpression__ValueAssignment_3_0_1 )
+                    // InternalFormalML.g:12962:4: rule__LiteralCollectionExpression__ValueAssignment_3_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralCollectionExpression__ValueAssignment_3_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Alternatives_3_0"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Alternatives_3_1_1"
+    // InternalFormalML.g:12970:1: rule__LiteralCollectionExpression__Alternatives_3_1_1 : ( ( ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0 ) ) | ( ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1 ) ) );
+    public final void rule__LiteralCollectionExpression__Alternatives_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12974:1: ( ( ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0 ) ) | ( ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1 ) ) )
+            int alt264=2;
+            int LA264_0 = input.LA(1);
+
+            if ( (LA264_0==RULE_XLIA_ID) ) {
+                int LA264_1 = input.LA(2);
+
+                if ( (LA264_1==EOF||(LA264_1>=20 && LA264_1<=23)||(LA264_1>=33 && LA264_1<=34)||LA264_1==58||(LA264_1>=78 && LA264_1<=79)||(LA264_1>=100 && LA264_1<=132)||LA264_1==198||LA264_1==200||LA264_1==242||(LA264_1>=256 && LA264_1<=260)||LA264_1==286) ) {
+                    alt264=1;
+                }
+                else if ( (LA264_1==31||(LA264_1>=135 && LA264_1<=136)) ) {
+                    alt264=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 264, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( ((LA264_0>=RULE_CHARACTER && LA264_0<=RULE_STRING)||LA264_0==RULE_INT||LA264_0==20||LA264_0==23||(LA264_0>=29 && LA264_0<=30)||LA264_0==125||(LA264_0>=129 && LA264_0<=134)||(LA264_0>=137 && LA264_0<=142)||LA264_0==199||(LA264_0>=261 && LA264_0<=271)||LA264_0==287) ) {
+                alt264=1;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 264, 0, input);
+
+                throw nvae;
+            }
+            switch (alt264) {
+                case 1 :
+                    // InternalFormalML.g:12975:2: ( ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0 ) )
+                    {
+                    // InternalFormalML.g:12975:2: ( ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0 ) )
+                    // InternalFormalML.g:12976:3: ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_0()); 
+                    }
+                    // InternalFormalML.g:12977:3: ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0 )
+                    // InternalFormalML.g:12977:4: rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12981:2: ( ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1 ) )
+                    {
+                    // InternalFormalML.g:12981:2: ( ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1 ) )
+                    // InternalFormalML.g:12982:3: ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_1()); 
+                    }
+                    // InternalFormalML.g:12983:3: ( rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1 )
+                    // InternalFormalML.g:12983:4: rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralCollectionExpressionAccess().getValueAssignment_3_1_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Alternatives_3_1_1"
+
+
+    // $ANTLR start "rule__LiteralReferenceExpression__Alternatives"
+    // InternalFormalML.g:12991:1: rule__LiteralReferenceExpression__Alternatives : ( ( ruleLiteralReferenceElement ) | ( ruleLiteralReferenceVariableContext ) | ( ruleLiteralReferenceMachineContext ) | ( ruleLiteralEnvExpression ) );
+    public final void rule__LiteralReferenceExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:12995:1: ( ( ruleLiteralReferenceElement ) | ( ruleLiteralReferenceVariableContext ) | ( ruleLiteralReferenceMachineContext ) | ( ruleLiteralEnvExpression ) )
+            int alt265=4;
+            switch ( input.LA(1) ) {
+            case RULE_XLIA_ID:
+                {
+                alt265=1;
+                }
+                break;
+            case 265:
+            case 266:
+                {
+                alt265=2;
+                }
+                break;
+            case 267:
+            case 268:
+            case 269:
+            case 270:
+            case 271:
+                {
+                alt265=3;
+                }
+                break;
+            case 141:
+                {
+                int LA265_4 = input.LA(2);
+
+                if ( (synpred502_InternalFormalML()) ) {
+                    alt265=3;
+                }
+                else if ( (true) ) {
+                    alt265=4;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 265, 4, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 142:
+                {
+                int LA265_5 = input.LA(2);
+
+                if ( (synpred502_InternalFormalML()) ) {
+                    alt265=3;
+                }
+                else if ( (true) ) {
+                    alt265=4;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 265, 5, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 265, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt265) {
+                case 1 :
+                    // InternalFormalML.g:12996:2: ( ruleLiteralReferenceElement )
+                    {
+                    // InternalFormalML.g:12996:2: ( ruleLiteralReferenceElement )
+                    // InternalFormalML.g:12997:3: ruleLiteralReferenceElement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceElementParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralReferenceElement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceElementParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13002:2: ( ruleLiteralReferenceVariableContext )
+                    {
+                    // InternalFormalML.g:13002:2: ( ruleLiteralReferenceVariableContext )
+                    // InternalFormalML.g:13003:3: ruleLiteralReferenceVariableContext
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceVariableContextParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralReferenceVariableContext();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceVariableContextParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13008:2: ( ruleLiteralReferenceMachineContext )
+                    {
+                    // InternalFormalML.g:13008:2: ( ruleLiteralReferenceMachineContext )
+                    // InternalFormalML.g:13009:3: ruleLiteralReferenceMachineContext
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralReferenceMachineContext();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13014:2: ( ruleLiteralEnvExpression )
+                    {
+                    // InternalFormalML.g:13014:2: ( ruleLiteralEnvExpression )
+                    // InternalFormalML.g:13015:3: ruleLiteralEnvExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralEnvExpressionParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralEnvExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralEnvExpressionParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceExpression__Alternatives"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Alternatives_2"
+    // InternalFormalML.g:13024:1: rule__LiteralReferenceElement__Alternatives_2 : ( ( ( rule__LiteralReferenceElement__Group_2_0__0 ) ) | ( ( rule__LiteralReferenceElement__Group_2_1__0 ) ) );
+    public final void rule__LiteralReferenceElement__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13028:1: ( ( ( rule__LiteralReferenceElement__Group_2_0__0 ) ) | ( ( rule__LiteralReferenceElement__Group_2_1__0 ) ) )
+            int alt266=2;
+            int LA266_0 = input.LA(1);
+
+            if ( (LA266_0==22) ) {
+                alt266=1;
+            }
+            else if ( (LA266_0==23) ) {
+                alt266=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 266, 0, input);
+
+                throw nvae;
+            }
+            switch (alt266) {
+                case 1 :
+                    // InternalFormalML.g:13029:2: ( ( rule__LiteralReferenceElement__Group_2_0__0 ) )
+                    {
+                    // InternalFormalML.g:13029:2: ( ( rule__LiteralReferenceElement__Group_2_0__0 ) )
+                    // InternalFormalML.g:13030:3: ( rule__LiteralReferenceElement__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_0()); 
+                    }
+                    // InternalFormalML.g:13031:3: ( rule__LiteralReferenceElement__Group_2_0__0 )
+                    // InternalFormalML.g:13031:4: rule__LiteralReferenceElement__Group_2_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralReferenceElement__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13035:2: ( ( rule__LiteralReferenceElement__Group_2_1__0 ) )
+                    {
+                    // InternalFormalML.g:13035:2: ( ( rule__LiteralReferenceElement__Group_2_1__0 ) )
+                    // InternalFormalML.g:13036:3: ( rule__LiteralReferenceElement__Group_2_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_1()); 
+                    }
+                    // InternalFormalML.g:13037:3: ( rule__LiteralReferenceElement__Group_2_1__0 )
+                    // InternalFormalML.g:13037:4: rule__LiteralReferenceElement__Group_2_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralReferenceElement__Group_2_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceElementAccess().getGroup_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Alternatives_2"
+
+
+    // $ANTLR start "rule__LiteralReferenceVariableContext__Alternatives"
+    // InternalFormalML.g:13045:1: rule__LiteralReferenceVariableContext__Alternatives : ( ( ruleLiteralTimeExpression ) | ( ruleLiteralTimeDeltaExpression ) );
+    public final void rule__LiteralReferenceVariableContext__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13049:1: ( ( ruleLiteralTimeExpression ) | ( ruleLiteralTimeDeltaExpression ) )
+            int alt267=2;
+            int LA267_0 = input.LA(1);
+
+            if ( (LA267_0==265) ) {
+                alt267=1;
+            }
+            else if ( (LA267_0==266) ) {
+                alt267=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 267, 0, input);
+
+                throw nvae;
+            }
+            switch (alt267) {
+                case 1 :
+                    // InternalFormalML.g:13050:2: ( ruleLiteralTimeExpression )
+                    {
+                    // InternalFormalML.g:13050:2: ( ruleLiteralTimeExpression )
+                    // InternalFormalML.g:13051:3: ruleLiteralTimeExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralTimeExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13056:2: ( ruleLiteralTimeDeltaExpression )
+                    {
+                    // InternalFormalML.g:13056:2: ( ruleLiteralTimeDeltaExpression )
+                    // InternalFormalML.g:13057:3: ruleLiteralTimeDeltaExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeDeltaExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralTimeDeltaExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeDeltaExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceVariableContext__Alternatives"
+
+
+    // $ANTLR start "rule__LiteralReferenceMachineContext__Alternatives"
+    // InternalFormalML.g:13066:1: rule__LiteralReferenceMachineContext__Alternatives : ( ( ruleLiteralThisExpression ) | ( ruleLiteralSelfExpression ) | ( ruleLiteralParentExpression ) | ( ruleLiteralSuperExpression ) | ( ruleLiteralSystemExpression ) | ( ruleLiteralEnvExpression ) );
+    public final void rule__LiteralReferenceMachineContext__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13070:1: ( ( ruleLiteralThisExpression ) | ( ruleLiteralSelfExpression ) | ( ruleLiteralParentExpression ) | ( ruleLiteralSuperExpression ) | ( ruleLiteralSystemExpression ) | ( ruleLiteralEnvExpression ) )
+            int alt268=6;
+            switch ( input.LA(1) ) {
+            case 267:
+                {
+                alt268=1;
+                }
+                break;
+            case 268:
+                {
+                alt268=2;
+                }
+                break;
+            case 269:
+                {
+                alt268=3;
+                }
+                break;
+            case 270:
+                {
+                alt268=4;
+                }
+                break;
+            case 271:
+                {
+                alt268=5;
+                }
+                break;
+            case 141:
+            case 142:
+                {
+                alt268=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 268, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt268) {
+                case 1 :
+                    // InternalFormalML.g:13071:2: ( ruleLiteralThisExpression )
+                    {
+                    // InternalFormalML.g:13071:2: ( ruleLiteralThisExpression )
+                    // InternalFormalML.g:13072:3: ruleLiteralThisExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralThisExpressionParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralThisExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralThisExpressionParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13077:2: ( ruleLiteralSelfExpression )
+                    {
+                    // InternalFormalML.g:13077:2: ( ruleLiteralSelfExpression )
+                    // InternalFormalML.g:13078:3: ruleLiteralSelfExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSelfExpressionParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralSelfExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSelfExpressionParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13083:2: ( ruleLiteralParentExpression )
+                    {
+                    // InternalFormalML.g:13083:2: ( ruleLiteralParentExpression )
+                    // InternalFormalML.g:13084:3: ruleLiteralParentExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralParentExpressionParserRuleCall_2()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralParentExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralParentExpressionParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13089:2: ( ruleLiteralSuperExpression )
+                    {
+                    // InternalFormalML.g:13089:2: ( ruleLiteralSuperExpression )
+                    // InternalFormalML.g:13090:3: ruleLiteralSuperExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSuperExpressionParserRuleCall_3()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralSuperExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSuperExpressionParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:13095:2: ( ruleLiteralSystemExpression )
+                    {
+                    // InternalFormalML.g:13095:2: ( ruleLiteralSystemExpression )
+                    // InternalFormalML.g:13096:3: ruleLiteralSystemExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSystemExpressionParserRuleCall_4()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralSystemExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSystemExpressionParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:13101:2: ( ruleLiteralEnvExpression )
+                    {
+                    // InternalFormalML.g:13101:2: ( ruleLiteralEnvExpression )
+                    // InternalFormalML.g:13102:3: ruleLiteralEnvExpression
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralEnvExpressionParserRuleCall_5()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralEnvExpression();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralEnvExpressionParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceMachineContext__Alternatives"
+
+
+    // $ANTLR start "rule__LiteralEnvExpression__Alternatives_1"
+    // InternalFormalML.g:13111:1: rule__LiteralEnvExpression__Alternatives_1 : ( ( '$env' ) | ( 'env' ) );
+    public final void rule__LiteralEnvExpression__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13115:1: ( ( '$env' ) | ( 'env' ) )
+            int alt269=2;
+            int LA269_0 = input.LA(1);
+
+            if ( (LA269_0==141) ) {
+                alt269=1;
+            }
+            else if ( (LA269_0==142) ) {
+                alt269=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 269, 0, input);
+
+                throw nvae;
+            }
+            switch (alt269) {
+                case 1 :
+                    // InternalFormalML.g:13116:2: ( '$env' )
+                    {
+                    // InternalFormalML.g:13116:2: ( '$env' )
+                    // InternalFormalML.g:13117:3: '$env'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_0()); 
+                    }
+                    match(input,141,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13122:2: ( 'env' )
+                    {
+                    // InternalFormalML.g:13122:2: ( 'env' )
+                    // InternalFormalML.g:13123:3: 'env'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_1()); 
+                    }
+                    match(input,142,FollowSets000.FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvExpression__Alternatives_1"
+
+
+    // $ANTLR start "rule__LiteralPureReferenceExpression__Alternatives"
+    // InternalFormalML.g:13132:1: rule__LiteralPureReferenceExpression__Alternatives : ( ( ruleLiteralPureReferenceElement ) | ( ruleLiteralReferenceMachineContext ) );
+    public final void rule__LiteralPureReferenceExpression__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13136:1: ( ( ruleLiteralPureReferenceElement ) | ( ruleLiteralReferenceMachineContext ) )
+            int alt270=2;
+            int LA270_0 = input.LA(1);
+
+            if ( (LA270_0==RULE_XLIA_ID) ) {
+                alt270=1;
+            }
+            else if ( ((LA270_0>=141 && LA270_0<=142)||(LA270_0>=267 && LA270_0<=271)) ) {
+                alt270=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 270, 0, input);
+
+                throw nvae;
+            }
+            switch (alt270) {
+                case 1 :
+                    // InternalFormalML.g:13137:2: ( ruleLiteralPureReferenceElement )
+                    {
+                    // InternalFormalML.g:13137:2: ( ruleLiteralPureReferenceElement )
+                    // InternalFormalML.g:13138:3: ruleLiteralPureReferenceElement
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralPureReferenceElementParserRuleCall_0()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralPureReferenceElement();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralPureReferenceElementParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13143:2: ( ruleLiteralReferenceMachineContext )
+                    {
+                    // InternalFormalML.g:13143:2: ( ruleLiteralReferenceMachineContext )
+                    // InternalFormalML.g:13144:3: ruleLiteralReferenceMachineContext
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_1()); 
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleLiteralReferenceMachineContext();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralPureReferenceExpression__Alternatives"
+
+
+    // $ANTLR start "rule__VisibilityKind__Alternatives"
+    // InternalFormalML.g:13153:1: rule__VisibilityKind__Alternatives : ( ( ( 'public' ) ) | ( ( 'private' ) ) | ( ( 'protected' ) ) | ( ( 'package' ) ) );
+    public final void rule__VisibilityKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13157:1: ( ( ( 'public' ) ) | ( ( 'private' ) ) | ( ( 'protected' ) ) | ( ( 'package' ) ) )
+            int alt271=4;
+            switch ( input.LA(1) ) {
+            case 143:
+                {
+                alt271=1;
+                }
+                break;
+            case 144:
+                {
+                alt271=2;
+                }
+                break;
+            case 145:
+                {
+                alt271=3;
+                }
+                break;
+            case 28:
+                {
+                alt271=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 271, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt271) {
+                case 1 :
+                    // InternalFormalML.g:13158:2: ( ( 'public' ) )
+                    {
+                    // InternalFormalML.g:13158:2: ( ( 'public' ) )
+                    // InternalFormalML.g:13159:3: ( 'public' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13160:3: ( 'public' )
+                    // InternalFormalML.g:13160:4: 'public'
+                    {
+                    match(input,143,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13164:2: ( ( 'private' ) )
+                    {
+                    // InternalFormalML.g:13164:2: ( ( 'private' ) )
+                    // InternalFormalML.g:13165:3: ( 'private' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13166:3: ( 'private' )
+                    // InternalFormalML.g:13166:4: 'private'
+                    {
+                    match(input,144,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13170:2: ( ( 'protected' ) )
+                    {
+                    // InternalFormalML.g:13170:2: ( ( 'protected' ) )
+                    // InternalFormalML.g:13171:3: ( 'protected' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13172:3: ( 'protected' )
+                    // InternalFormalML.g:13172:4: 'protected'
+                    {
+                    match(input,145,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13176:2: ( ( 'package' ) )
+                    {
+                    // InternalFormalML.g:13176:2: ( ( 'package' ) )
+                    // InternalFormalML.g:13177:3: ( 'package' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13178:3: ( 'package' )
+                    // InternalFormalML.g:13178:4: 'package'
+                    {
+                    match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VisibilityKind__Alternatives"
+
+
+    // $ANTLR start "rule__DesignKind__Alternatives"
+    // InternalFormalML.g:13186:1: rule__DesignKind__Alternatives : ( ( ( 'model' ) ) | ( ( 'prototype' ) ) );
+    public final void rule__DesignKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13190:1: ( ( ( 'model' ) ) | ( ( 'prototype' ) ) )
+            int alt272=2;
+            int LA272_0 = input.LA(1);
+
+            if ( (LA272_0==146) ) {
+                alt272=1;
+            }
+            else if ( (LA272_0==147) ) {
+                alt272=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 272, 0, input);
+
+                throw nvae;
+            }
+            switch (alt272) {
+                case 1 :
+                    // InternalFormalML.g:13191:2: ( ( 'model' ) )
+                    {
+                    // InternalFormalML.g:13191:2: ( ( 'model' ) )
+                    // InternalFormalML.g:13192:3: ( 'model' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13193:3: ( 'model' )
+                    // InternalFormalML.g:13193:4: 'model'
+                    {
+                    match(input,146,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13197:2: ( ( 'prototype' ) )
+                    {
+                    // InternalFormalML.g:13197:2: ( ( 'prototype' ) )
+                    // InternalFormalML.g:13198:3: ( 'prototype' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13199:3: ( 'prototype' )
+                    // InternalFormalML.g:13199:4: 'prototype'
+                    {
+                    match(input,147,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DesignKind__Alternatives"
+
+
+    // $ANTLR start "rule__PseudostateKind__Alternatives"
+    // InternalFormalML.g:13207:1: rule__PseudostateKind__Alternatives : ( ( ( 'junction' ) ) | ( ( 'choice' ) ) | ( ( 'entryPoint' ) ) | ( ( 'exitPoint' ) ) | ( ( 'fork' ) ) | ( ( 'join' ) ) | ( ( 'dhistory' ) ) | ( ( 'shistory' ) ) );
+    public final void rule__PseudostateKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13211:1: ( ( ( 'junction' ) ) | ( ( 'choice' ) ) | ( ( 'entryPoint' ) ) | ( ( 'exitPoint' ) ) | ( ( 'fork' ) ) | ( ( 'join' ) ) | ( ( 'dhistory' ) ) | ( ( 'shistory' ) ) )
+            int alt273=8;
+            switch ( input.LA(1) ) {
+            case 148:
+                {
+                alt273=1;
+                }
+                break;
+            case 149:
+                {
+                alt273=2;
+                }
+                break;
+            case 150:
+                {
+                alt273=3;
+                }
+                break;
+            case 151:
+                {
+                alt273=4;
+                }
+                break;
+            case 152:
+                {
+                alt273=5;
+                }
+                break;
+            case 153:
+                {
+                alt273=6;
+                }
+                break;
+            case 154:
+                {
+                alt273=7;
+                }
+                break;
+            case 155:
+                {
+                alt273=8;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 273, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt273) {
+                case 1 :
+                    // InternalFormalML.g:13212:2: ( ( 'junction' ) )
+                    {
+                    // InternalFormalML.g:13212:2: ( ( 'junction' ) )
+                    // InternalFormalML.g:13213:3: ( 'junction' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13214:3: ( 'junction' )
+                    // InternalFormalML.g:13214:4: 'junction'
+                    {
+                    match(input,148,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13218:2: ( ( 'choice' ) )
+                    {
+                    // InternalFormalML.g:13218:2: ( ( 'choice' ) )
+                    // InternalFormalML.g:13219:3: ( 'choice' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13220:3: ( 'choice' )
+                    // InternalFormalML.g:13220:4: 'choice'
+                    {
+                    match(input,149,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13224:2: ( ( 'entryPoint' ) )
+                    {
+                    // InternalFormalML.g:13224:2: ( ( 'entryPoint' ) )
+                    // InternalFormalML.g:13225:3: ( 'entryPoint' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13226:3: ( 'entryPoint' )
+                    // InternalFormalML.g:13226:4: 'entryPoint'
+                    {
+                    match(input,150,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13230:2: ( ( 'exitPoint' ) )
+                    {
+                    // InternalFormalML.g:13230:2: ( ( 'exitPoint' ) )
+                    // InternalFormalML.g:13231:3: ( 'exitPoint' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13232:3: ( 'exitPoint' )
+                    // InternalFormalML.g:13232:4: 'exitPoint'
+                    {
+                    match(input,151,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:13236:2: ( ( 'fork' ) )
+                    {
+                    // InternalFormalML.g:13236:2: ( ( 'fork' ) )
+                    // InternalFormalML.g:13237:3: ( 'fork' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4()); 
+                    }
+                    // InternalFormalML.g:13238:3: ( 'fork' )
+                    // InternalFormalML.g:13238:4: 'fork'
+                    {
+                    match(input,152,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:13242:2: ( ( 'join' ) )
+                    {
+                    // InternalFormalML.g:13242:2: ( ( 'join' ) )
+                    // InternalFormalML.g:13243:3: ( 'join' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5()); 
+                    }
+                    // InternalFormalML.g:13244:3: ( 'join' )
+                    // InternalFormalML.g:13244:4: 'join'
+                    {
+                    match(input,153,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:13248:2: ( ( 'dhistory' ) )
+                    {
+                    // InternalFormalML.g:13248:2: ( ( 'dhistory' ) )
+                    // InternalFormalML.g:13249:3: ( 'dhistory' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6()); 
+                    }
+                    // InternalFormalML.g:13250:3: ( 'dhistory' )
+                    // InternalFormalML.g:13250:4: 'dhistory'
+                    {
+                    match(input,154,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:13254:2: ( ( 'shistory' ) )
+                    {
+                    // InternalFormalML.g:13254:2: ( ( 'shistory' ) )
+                    // InternalFormalML.g:13255:3: ( 'shistory' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7()); 
+                    }
+                    // InternalFormalML.g:13256:3: ( 'shistory' )
+                    // InternalFormalML.g:13256:4: 'shistory'
+                    {
+                    match(input,155,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateKind__Alternatives"
+
+
+    // $ANTLR start "rule__EndingPseudostateKind__Alternatives"
+    // InternalFormalML.g:13264:1: rule__EndingPseudostateKind__Alternatives : ( ( ( 'terminal' ) ) | ( ( 'return' ) ) );
+    public final void rule__EndingPseudostateKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13268:1: ( ( ( 'terminal' ) ) | ( ( 'return' ) ) )
+            int alt274=2;
+            int LA274_0 = input.LA(1);
+
+            if ( (LA274_0==156) ) {
+                alt274=1;
+            }
+            else if ( (LA274_0==157) ) {
+                alt274=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 274, 0, input);
+
+                throw nvae;
+            }
+            switch (alt274) {
+                case 1 :
+                    // InternalFormalML.g:13269:2: ( ( 'terminal' ) )
+                    {
+                    // InternalFormalML.g:13269:2: ( ( 'terminal' ) )
+                    // InternalFormalML.g:13270:3: ( 'terminal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEndingPseudostateKindAccess().getTerminateEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13271:3: ( 'terminal' )
+                    // InternalFormalML.g:13271:4: 'terminal'
+                    {
+                    match(input,156,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEndingPseudostateKindAccess().getTerminateEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13275:2: ( ( 'return' ) )
+                    {
+                    // InternalFormalML.g:13275:2: ( ( 'return' ) )
+                    // InternalFormalML.g:13276:3: ( 'return' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13277:3: ( 'return' )
+                    // InternalFormalML.g:13277:4: 'return'
+                    {
+                    match(input,157,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostateKind__Alternatives"
+
+
+    // $ANTLR start "rule__ComProtocolKind__Alternatives"
+    // InternalFormalML.g:13285:1: rule__ComProtocolKind__Alternatives : ( ( ( 'env' ) ) | ( ( 'rdv' ) ) | ( ( 'multi_rdv' ) ) );
+    public final void rule__ComProtocolKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13289:1: ( ( ( 'env' ) ) | ( ( 'rdv' ) ) | ( ( 'multi_rdv' ) ) )
+            int alt275=3;
+            switch ( input.LA(1) ) {
+            case 142:
+                {
+                alt275=1;
+                }
+                break;
+            case 158:
+                {
+                alt275=2;
+                }
+                break;
+            case 14:
+                {
+                alt275=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 275, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt275) {
+                case 1 :
+                    // InternalFormalML.g:13290:2: ( ( 'env' ) )
+                    {
+                    // InternalFormalML.g:13290:2: ( ( 'env' ) )
+                    // InternalFormalML.g:13291:3: ( 'env' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13292:3: ( 'env' )
+                    // InternalFormalML.g:13292:4: 'env'
+                    {
+                    match(input,142,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13296:2: ( ( 'rdv' ) )
+                    {
+                    // InternalFormalML.g:13296:2: ( ( 'rdv' ) )
+                    // InternalFormalML.g:13297:3: ( 'rdv' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13298:3: ( 'rdv' )
+                    // InternalFormalML.g:13298:4: 'rdv'
+                    {
+                    match(input,158,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13302:2: ( ( 'multi_rdv' ) )
+                    {
+                    // InternalFormalML.g:13302:2: ( ( 'multi_rdv' ) )
+                    // InternalFormalML.g:13303:3: ( 'multi_rdv' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13304:3: ( 'multi_rdv' )
+                    // InternalFormalML.g:13304:4: 'multi_rdv'
+                    {
+                    match(input,14,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocolKind__Alternatives"
+
+
+    // $ANTLR start "rule__ComEnvRdvProtocolKind__Alternatives"
+    // InternalFormalML.g:13312:1: rule__ComEnvRdvProtocolKind__Alternatives : ( ( ( 'env' ) ) | ( ( 'rdv' ) ) );
+    public final void rule__ComEnvRdvProtocolKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13316:1: ( ( ( 'env' ) ) | ( ( 'rdv' ) ) )
+            int alt276=2;
+            int LA276_0 = input.LA(1);
+
+            if ( (LA276_0==142) ) {
+                alt276=1;
+            }
+            else if ( (LA276_0==158) ) {
+                alt276=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 276, 0, input);
+
+                throw nvae;
+            }
+            switch (alt276) {
+                case 1 :
+                    // InternalFormalML.g:13317:2: ( ( 'env' ) )
+                    {
+                    // InternalFormalML.g:13317:2: ( ( 'env' ) )
+                    // InternalFormalML.g:13318:3: ( 'env' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13319:3: ( 'env' )
+                    // InternalFormalML.g:13319:4: 'env'
+                    {
+                    match(input,142,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13323:2: ( ( 'rdv' ) )
+                    {
+                    // InternalFormalML.g:13323:2: ( ( 'rdv' ) )
+                    // InternalFormalML.g:13324:3: ( 'rdv' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13325:3: ( 'rdv' )
+                    // InternalFormalML.g:13325:4: 'rdv'
+                    {
+                    match(input,158,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComEnvRdvProtocolKind__Alternatives"
+
+
+    // $ANTLR start "rule__ComCastKing__Alternatives"
+    // InternalFormalML.g:13333:1: rule__ComCastKing__Alternatives : ( ( ( 'unicast' ) ) | ( ( 'anycast' ) ) | ( ( 'multicast' ) ) | ( ( 'broadcast' ) ) );
+    public final void rule__ComCastKing__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13337:1: ( ( ( 'unicast' ) ) | ( ( 'anycast' ) ) | ( ( 'multicast' ) ) | ( ( 'broadcast' ) ) )
+            int alt277=4;
+            switch ( input.LA(1) ) {
+            case 159:
+                {
+                alt277=1;
+                }
+                break;
+            case 160:
+                {
+                alt277=2;
+                }
+                break;
+            case 161:
+                {
+                alt277=3;
+                }
+                break;
+            case 162:
+                {
+                alt277=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 277, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt277) {
+                case 1 :
+                    // InternalFormalML.g:13338:2: ( ( 'unicast' ) )
+                    {
+                    // InternalFormalML.g:13338:2: ( ( 'unicast' ) )
+                    // InternalFormalML.g:13339:3: ( 'unicast' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13340:3: ( 'unicast' )
+                    // InternalFormalML.g:13340:4: 'unicast'
+                    {
+                    match(input,159,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13344:2: ( ( 'anycast' ) )
+                    {
+                    // InternalFormalML.g:13344:2: ( ( 'anycast' ) )
+                    // InternalFormalML.g:13345:3: ( 'anycast' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13346:3: ( 'anycast' )
+                    // InternalFormalML.g:13346:4: 'anycast'
+                    {
+                    match(input,160,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13350:2: ( ( 'multicast' ) )
+                    {
+                    // InternalFormalML.g:13350:2: ( ( 'multicast' ) )
+                    // InternalFormalML.g:13351:3: ( 'multicast' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13352:3: ( 'multicast' )
+                    // InternalFormalML.g:13352:4: 'multicast'
+                    {
+                    match(input,161,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13356:2: ( ( 'broadcast' ) )
+                    {
+                    // InternalFormalML.g:13356:2: ( ( 'broadcast' ) )
+                    // InternalFormalML.g:13357:3: ( 'broadcast' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13358:3: ( 'broadcast' )
+                    // InternalFormalML.g:13358:4: 'broadcast'
+                    {
+                    match(input,162,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComCastKing__Alternatives"
+
+
+    // $ANTLR start "rule__PrimitiveNumberSign__Alternatives"
+    // InternalFormalML.g:13366:1: rule__PrimitiveNumberSign__Alternatives : ( ( ( '+' ) ) | ( ( '++' ) ) | ( ( '-' ) ) | ( ( '--' ) ) );
+    public final void rule__PrimitiveNumberSign__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13370:1: ( ( ( '+' ) ) | ( ( '++' ) ) | ( ( '-' ) ) | ( ( '--' ) ) )
+            int alt278=4;
+            switch ( input.LA(1) ) {
+            case 131:
+                {
+                alt278=1;
+                }
+                break;
+            case 129:
+                {
+                alt278=2;
+                }
+                break;
+            case 132:
+                {
+                alt278=3;
+                }
+                break;
+            case 130:
+                {
+                alt278=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 278, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt278) {
+                case 1 :
+                    // InternalFormalML.g:13371:2: ( ( '+' ) )
+                    {
+                    // InternalFormalML.g:13371:2: ( ( '+' ) )
+                    // InternalFormalML.g:13372:3: ( '+' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13373:3: ( '+' )
+                    // InternalFormalML.g:13373:4: '+'
+                    {
+                    match(input,131,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13377:2: ( ( '++' ) )
+                    {
+                    // InternalFormalML.g:13377:2: ( ( '++' ) )
+                    // InternalFormalML.g:13378:3: ( '++' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13379:3: ( '++' )
+                    // InternalFormalML.g:13379:4: '++'
+                    {
+                    match(input,129,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13383:2: ( ( '-' ) )
+                    {
+                    // InternalFormalML.g:13383:2: ( ( '-' ) )
+                    // InternalFormalML.g:13384:3: ( '-' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13385:3: ( '-' )
+                    // InternalFormalML.g:13385:4: '-'
+                    {
+                    match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13389:2: ( ( '--' ) )
+                    {
+                    // InternalFormalML.g:13389:2: ( ( '--' ) )
+                    // InternalFormalML.g:13390:3: ( '--' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13391:3: ( '--' )
+                    // InternalFormalML.g:13391:4: '--'
+                    {
+                    match(input,130,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveNumberSign__Alternatives"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceKind__Alternatives"
+    // InternalFormalML.g:13399:1: rule__PrimitiveInstanceKind__Alternatives : ( ( ( 'buffer' ) ) | ( ( 'message' ) ) | ( ( 'port' ) ) | ( ( 'signal' ) ) | ( ( 'machine' ) ) | ( ( 'vertex' ) ) );
+    public final void rule__PrimitiveInstanceKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13403:1: ( ( ( 'buffer' ) ) | ( ( 'message' ) ) | ( ( 'port' ) ) | ( ( 'signal' ) ) | ( ( 'machine' ) ) | ( ( 'vertex' ) ) )
+            int alt279=6;
+            switch ( input.LA(1) ) {
+            case 15:
+                {
+                alt279=1;
+                }
+                break;
+            case 163:
+                {
+                alt279=2;
+                }
+                break;
+            case 17:
+                {
+                alt279=3;
+                }
+                break;
+            case 18:
+                {
+                alt279=4;
+                }
+                break;
+            case 39:
+                {
+                alt279=5;
+                }
+                break;
+            case 164:
+                {
+                alt279=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 279, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt279) {
+                case 1 :
+                    // InternalFormalML.g:13404:2: ( ( 'buffer' ) )
+                    {
+                    // InternalFormalML.g:13404:2: ( ( 'buffer' ) )
+                    // InternalFormalML.g:13405:3: ( 'buffer' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13406:3: ( 'buffer' )
+                    // InternalFormalML.g:13406:4: 'buffer'
+                    {
+                    match(input,15,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13410:2: ( ( 'message' ) )
+                    {
+                    // InternalFormalML.g:13410:2: ( ( 'message' ) )
+                    // InternalFormalML.g:13411:3: ( 'message' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13412:3: ( 'message' )
+                    // InternalFormalML.g:13412:4: 'message'
+                    {
+                    match(input,163,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13416:2: ( ( 'port' ) )
+                    {
+                    // InternalFormalML.g:13416:2: ( ( 'port' ) )
+                    // InternalFormalML.g:13417:3: ( 'port' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13418:3: ( 'port' )
+                    // InternalFormalML.g:13418:4: 'port'
+                    {
+                    match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13422:2: ( ( 'signal' ) )
+                    {
+                    // InternalFormalML.g:13422:2: ( ( 'signal' ) )
+                    // InternalFormalML.g:13423:3: ( 'signal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13424:3: ( 'signal' )
+                    // InternalFormalML.g:13424:4: 'signal'
+                    {
+                    match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:13428:2: ( ( 'machine' ) )
+                    {
+                    // InternalFormalML.g:13428:2: ( ( 'machine' ) )
+                    // InternalFormalML.g:13429:3: ( 'machine' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4()); 
+                    }
+                    // InternalFormalML.g:13430:3: ( 'machine' )
+                    // InternalFormalML.g:13430:4: 'machine'
+                    {
+                    match(input,39,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:13434:2: ( ( 'vertex' ) )
+                    {
+                    // InternalFormalML.g:13434:2: ( ( 'vertex' ) )
+                    // InternalFormalML.g:13435:3: ( 'vertex' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5()); 
+                    }
+                    // InternalFormalML.g:13436:3: ( 'vertex' )
+                    // InternalFormalML.g:13436:4: 'vertex'
+                    {
+                    match(input,164,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceKind__Alternatives"
+
+
+    // $ANTLR start "rule__CollectionKind__Alternatives"
+    // InternalFormalML.g:13444:1: rule__CollectionKind__Alternatives : ( ( ( 'vector' ) ) | ( ( 'rvector' ) ) | ( ( 'list' ) ) | ( ( 'set' ) ) | ( ( 'bag' ) ) | ( ( 'fifo' ) ) | ( ( 'lifo' ) ) );
+    public final void rule__CollectionKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13448:1: ( ( ( 'vector' ) ) | ( ( 'rvector' ) ) | ( ( 'list' ) ) | ( ( 'set' ) ) | ( ( 'bag' ) ) | ( ( 'fifo' ) ) | ( ( 'lifo' ) ) )
+            int alt280=7;
+            switch ( input.LA(1) ) {
+            case 165:
+                {
+                alt280=1;
+                }
+                break;
+            case 166:
+                {
+                alt280=2;
+                }
+                break;
+            case 167:
+                {
+                alt280=3;
+                }
+                break;
+            case 168:
+                {
+                alt280=4;
+                }
+                break;
+            case 169:
+                {
+                alt280=5;
+                }
+                break;
+            case 170:
+                {
+                alt280=6;
+                }
+                break;
+            case 171:
+                {
+                alt280=7;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 280, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt280) {
+                case 1 :
+                    // InternalFormalML.g:13449:2: ( ( 'vector' ) )
+                    {
+                    // InternalFormalML.g:13449:2: ( ( 'vector' ) )
+                    // InternalFormalML.g:13450:3: ( 'vector' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13451:3: ( 'vector' )
+                    // InternalFormalML.g:13451:4: 'vector'
+                    {
+                    match(input,165,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13455:2: ( ( 'rvector' ) )
+                    {
+                    // InternalFormalML.g:13455:2: ( ( 'rvector' ) )
+                    // InternalFormalML.g:13456:3: ( 'rvector' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13457:3: ( 'rvector' )
+                    // InternalFormalML.g:13457:4: 'rvector'
+                    {
+                    match(input,166,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13461:2: ( ( 'list' ) )
+                    {
+                    // InternalFormalML.g:13461:2: ( ( 'list' ) )
+                    // InternalFormalML.g:13462:3: ( 'list' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13463:3: ( 'list' )
+                    // InternalFormalML.g:13463:4: 'list'
+                    {
+                    match(input,167,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13467:2: ( ( 'set' ) )
+                    {
+                    // InternalFormalML.g:13467:2: ( ( 'set' ) )
+                    // InternalFormalML.g:13468:3: ( 'set' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13469:3: ( 'set' )
+                    // InternalFormalML.g:13469:4: 'set'
+                    {
+                    match(input,168,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:13473:2: ( ( 'bag' ) )
+                    {
+                    // InternalFormalML.g:13473:2: ( ( 'bag' ) )
+                    // InternalFormalML.g:13474:3: ( 'bag' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4()); 
+                    }
+                    // InternalFormalML.g:13475:3: ( 'bag' )
+                    // InternalFormalML.g:13475:4: 'bag'
+                    {
+                    match(input,169,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:13479:2: ( ( 'fifo' ) )
+                    {
+                    // InternalFormalML.g:13479:2: ( ( 'fifo' ) )
+                    // InternalFormalML.g:13480:3: ( 'fifo' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5()); 
+                    }
+                    // InternalFormalML.g:13481:3: ( 'fifo' )
+                    // InternalFormalML.g:13481:4: 'fifo'
+                    {
+                    match(input,170,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:13485:2: ( ( 'lifo' ) )
+                    {
+                    // InternalFormalML.g:13485:2: ( ( 'lifo' ) )
+                    // InternalFormalML.g:13486:3: ( 'lifo' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6()); 
+                    }
+                    // InternalFormalML.g:13487:3: ( 'lifo' )
+                    // InternalFormalML.g:13487:4: 'lifo'
+                    {
+                    match(input,171,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionKind__Alternatives"
+
+
+    // $ANTLR start "rule__ParameterDirectionKind__Alternatives"
+    // InternalFormalML.g:13495:1: rule__ParameterDirectionKind__Alternatives : ( ( ( 'in' ) ) | ( ( 'inout' ) ) | ( ( 'out' ) ) | ( ( 'return' ) ) );
+    public final void rule__ParameterDirectionKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13499:1: ( ( ( 'in' ) ) | ( ( 'inout' ) ) | ( ( 'out' ) ) | ( ( 'return' ) ) )
+            int alt281=4;
+            switch ( input.LA(1) ) {
+            case 172:
+                {
+                alt281=1;
+                }
+                break;
+            case 173:
+                {
+                alt281=2;
+                }
+                break;
+            case 174:
+                {
+                alt281=3;
+                }
+                break;
+            case 157:
+                {
+                alt281=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 281, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt281) {
+                case 1 :
+                    // InternalFormalML.g:13500:2: ( ( 'in' ) )
+                    {
+                    // InternalFormalML.g:13500:2: ( ( 'in' ) )
+                    // InternalFormalML.g:13501:3: ( 'in' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13502:3: ( 'in' )
+                    // InternalFormalML.g:13502:4: 'in'
+                    {
+                    match(input,172,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13506:2: ( ( 'inout' ) )
+                    {
+                    // InternalFormalML.g:13506:2: ( ( 'inout' ) )
+                    // InternalFormalML.g:13507:3: ( 'inout' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13508:3: ( 'inout' )
+                    // InternalFormalML.g:13508:4: 'inout'
+                    {
+                    match(input,173,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13512:2: ( ( 'out' ) )
+                    {
+                    // InternalFormalML.g:13512:2: ( ( 'out' ) )
+                    // InternalFormalML.g:13513:3: ( 'out' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13514:3: ( 'out' )
+                    // InternalFormalML.g:13514:4: 'out'
+                    {
+                    match(input,174,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13518:2: ( ( 'return' ) )
+                    {
+                    // InternalFormalML.g:13518:2: ( ( 'return' ) )
+                    // InternalFormalML.g:13519:3: ( 'return' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13520:3: ( 'return' )
+                    // InternalFormalML.g:13520:4: 'return'
+                    {
+                    match(input,157,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterDirectionKind__Alternatives"
+
+
+    // $ANTLR start "rule__BlockParameterDirectionKind__Alternatives"
+    // InternalFormalML.g:13528:1: rule__BlockParameterDirectionKind__Alternatives : ( ( ( 'input' ) ) | ( ( 'inout' ) ) | ( ( 'output' ) ) | ( ( 'return' ) ) );
+    public final void rule__BlockParameterDirectionKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13532:1: ( ( ( 'input' ) ) | ( ( 'inout' ) ) | ( ( 'output' ) ) | ( ( 'return' ) ) )
+            int alt282=4;
+            switch ( input.LA(1) ) {
+            case 175:
+                {
+                alt282=1;
+                }
+                break;
+            case 173:
+                {
+                alt282=2;
+                }
+                break;
+            case 176:
+                {
+                alt282=3;
+                }
+                break;
+            case 157:
+                {
+                alt282=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 282, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt282) {
+                case 1 :
+                    // InternalFormalML.g:13533:2: ( ( 'input' ) )
+                    {
+                    // InternalFormalML.g:13533:2: ( ( 'input' ) )
+                    // InternalFormalML.g:13534:3: ( 'input' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockParameterDirectionKindAccess().getInEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13535:3: ( 'input' )
+                    // InternalFormalML.g:13535:4: 'input'
+                    {
+                    match(input,175,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockParameterDirectionKindAccess().getInEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13539:2: ( ( 'inout' ) )
+                    {
+                    // InternalFormalML.g:13539:2: ( ( 'inout' ) )
+                    // InternalFormalML.g:13540:3: ( 'inout' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13541:3: ( 'inout' )
+                    // InternalFormalML.g:13541:4: 'inout'
+                    {
+                    match(input,173,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13545:2: ( ( 'output' ) )
+                    {
+                    // InternalFormalML.g:13545:2: ( ( 'output' ) )
+                    // InternalFormalML.g:13546:3: ( 'output' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13547:3: ( 'output' )
+                    // InternalFormalML.g:13547:4: 'output'
+                    {
+                    match(input,176,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13551:2: ( ( 'return' ) )
+                    {
+                    // InternalFormalML.g:13551:2: ( ( 'return' ) )
+                    // InternalFormalML.g:13552:3: ( 'return' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBlockParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13553:3: ( 'return' )
+                    // InternalFormalML.g:13553:4: 'return'
+                    {
+                    match(input,157,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBlockParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockParameterDirectionKind__Alternatives"
+
+
+    // $ANTLR start "rule__BufferContainerKind__Alternatives"
+    // InternalFormalML.g:13561:1: rule__BufferContainerKind__Alternatives : ( ( ( 'set' ) ) | ( ( 'bag' ) ) | ( ( 'fifo' ) ) | ( ( 'lifo' ) ) );
+    public final void rule__BufferContainerKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13565:1: ( ( ( 'set' ) ) | ( ( 'bag' ) ) | ( ( 'fifo' ) ) | ( ( 'lifo' ) ) )
+            int alt283=4;
+            switch ( input.LA(1) ) {
+            case 168:
+                {
+                alt283=1;
+                }
+                break;
+            case 169:
+                {
+                alt283=2;
+                }
+                break;
+            case 170:
+                {
+                alt283=3;
+                }
+                break;
+            case 171:
+                {
+                alt283=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 283, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt283) {
+                case 1 :
+                    // InternalFormalML.g:13566:2: ( ( 'set' ) )
+                    {
+                    // InternalFormalML.g:13566:2: ( ( 'set' ) )
+                    // InternalFormalML.g:13567:3: ( 'set' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13568:3: ( 'set' )
+                    // InternalFormalML.g:13568:4: 'set'
+                    {
+                    match(input,168,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13572:2: ( ( 'bag' ) )
+                    {
+                    // InternalFormalML.g:13572:2: ( ( 'bag' ) )
+                    // InternalFormalML.g:13573:3: ( 'bag' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13574:3: ( 'bag' )
+                    // InternalFormalML.g:13574:4: 'bag'
+                    {
+                    match(input,169,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13578:2: ( ( 'fifo' ) )
+                    {
+                    // InternalFormalML.g:13578:2: ( ( 'fifo' ) )
+                    // InternalFormalML.g:13579:3: ( 'fifo' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13580:3: ( 'fifo' )
+                    // InternalFormalML.g:13580:4: 'fifo'
+                    {
+                    match(input,170,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13584:2: ( ( 'lifo' ) )
+                    {
+                    // InternalFormalML.g:13584:2: ( ( 'lifo' ) )
+                    // InternalFormalML.g:13585:3: ( 'lifo' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13586:3: ( 'lifo' )
+                    // InternalFormalML.g:13586:4: 'lifo'
+                    {
+                    match(input,171,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerKind__Alternatives"
+
+
+    // $ANTLR start "rule__ChannelDirection__Alternatives"
+    // InternalFormalML.g:13594:1: rule__ChannelDirection__Alternatives : ( ( ( 'input' ) ) | ( ( 'inout' ) ) | ( ( 'output' ) ) );
+    public final void rule__ChannelDirection__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13598:1: ( ( ( 'input' ) ) | ( ( 'inout' ) ) | ( ( 'output' ) ) )
+            int alt284=3;
+            switch ( input.LA(1) ) {
+            case 175:
+                {
+                alt284=1;
+                }
+                break;
+            case 173:
+                {
+                alt284=2;
+                }
+                break;
+            case 176:
+                {
+                alt284=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 284, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt284) {
+                case 1 :
+                    // InternalFormalML.g:13599:2: ( ( 'input' ) )
+                    {
+                    // InternalFormalML.g:13599:2: ( ( 'input' ) )
+                    // InternalFormalML.g:13600:3: ( 'input' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13601:3: ( 'input' )
+                    // InternalFormalML.g:13601:4: 'input'
+                    {
+                    match(input,175,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13605:2: ( ( 'inout' ) )
+                    {
+                    // InternalFormalML.g:13605:2: ( ( 'inout' ) )
+                    // InternalFormalML.g:13606:3: ( 'inout' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13607:3: ( 'inout' )
+                    // InternalFormalML.g:13607:4: 'inout'
+                    {
+                    match(input,173,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13611:2: ( ( 'output' ) )
+                    {
+                    // InternalFormalML.g:13611:2: ( ( 'output' ) )
+                    // InternalFormalML.g:13612:3: ( 'output' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13613:3: ( 'output' )
+                    // InternalFormalML.g:13613:4: 'output'
+                    {
+                    match(input,176,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelDirection__Alternatives"
+
+
+    // $ANTLR start "rule__TransitionMoc__Alternatives"
+    // InternalFormalML.g:13621:1: rule__TransitionMoc__Alternatives : ( ( ( 'simple' ) ) | ( ( 'abort' ) ) | ( ( 'final' ) ) );
+    public final void rule__TransitionMoc__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13625:1: ( ( ( 'simple' ) ) | ( ( 'abort' ) ) | ( ( 'final' ) ) )
+            int alt285=3;
+            switch ( input.LA(1) ) {
+            case 177:
+                {
+                alt285=1;
+                }
+                break;
+            case 178:
+                {
+                alt285=2;
+                }
+                break;
+            case 179:
+                {
+                alt285=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 285, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt285) {
+                case 1 :
+                    // InternalFormalML.g:13626:2: ( ( 'simple' ) )
+                    {
+                    // InternalFormalML.g:13626:2: ( ( 'simple' ) )
+                    // InternalFormalML.g:13627:3: ( 'simple' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13628:3: ( 'simple' )
+                    // InternalFormalML.g:13628:4: 'simple'
+                    {
+                    match(input,177,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13632:2: ( ( 'abort' ) )
+                    {
+                    // InternalFormalML.g:13632:2: ( ( 'abort' ) )
+                    // InternalFormalML.g:13633:3: ( 'abort' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13634:3: ( 'abort' )
+                    // InternalFormalML.g:13634:4: 'abort'
+                    {
+                    match(input,178,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13638:2: ( ( 'final' ) )
+                    {
+                    // InternalFormalML.g:13638:2: ( ( 'final' ) )
+                    // InternalFormalML.g:13639:3: ( 'final' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13640:3: ( 'final' )
+                    // InternalFormalML.g:13640:4: 'final'
+                    {
+                    match(input,179,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoc__Alternatives"
+
+
+    // $ANTLR start "rule__InterruptStatementKind__Alternatives"
+    // InternalFormalML.g:13648:1: rule__InterruptStatementKind__Alternatives : ( ( ( 'break' ) ) | ( ( 'continue' ) ) | ( ( 'return' ) ) | ( ( 'exit' ) ) );
+    public final void rule__InterruptStatementKind__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13652:1: ( ( ( 'break' ) ) | ( ( 'continue' ) ) | ( ( 'return' ) ) | ( ( 'exit' ) ) )
+            int alt286=4;
+            switch ( input.LA(1) ) {
+            case 180:
+                {
+                alt286=1;
+                }
+                break;
+            case 181:
+                {
+                alt286=2;
+                }
+                break;
+            case 157:
+                {
+                alt286=3;
+                }
+                break;
+            case 182:
+                {
+                alt286=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 286, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt286) {
+                case 1 :
+                    // InternalFormalML.g:13653:2: ( ( 'break' ) )
+                    {
+                    // InternalFormalML.g:13653:2: ( ( 'break' ) )
+                    // InternalFormalML.g:13654:3: ( 'break' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13655:3: ( 'break' )
+                    // InternalFormalML.g:13655:4: 'break'
+                    {
+                    match(input,180,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13659:2: ( ( 'continue' ) )
+                    {
+                    // InternalFormalML.g:13659:2: ( ( 'continue' ) )
+                    // InternalFormalML.g:13660:3: ( 'continue' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13661:3: ( 'continue' )
+                    // InternalFormalML.g:13661:4: 'continue'
+                    {
+                    match(input,181,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13665:2: ( ( 'return' ) )
+                    {
+                    // InternalFormalML.g:13665:2: ( ( 'return' ) )
+                    // InternalFormalML.g:13666:3: ( 'return' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13667:3: ( 'return' )
+                    // InternalFormalML.g:13667:4: 'return'
+                    {
+                    match(input,157,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13671:2: ( ( 'exit' ) )
+                    {
+                    // InternalFormalML.g:13671:2: ( ( 'exit' ) )
+                    // InternalFormalML.g:13672:3: ( 'exit' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13673:3: ( 'exit' )
+                    // InternalFormalML.g:13673:4: 'exit'
+                    {
+                    match(input,182,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatementKind__Alternatives"
+
+
+    // $ANTLR start "rule__OPERATOR_ACTIVITY__Alternatives"
+    // InternalFormalML.g:13681:1: rule__OPERATOR_ACTIVITY__Alternatives : ( ( ( 'init' ) ) | ( ( 'final' ) ) | ( ( 'destroy' ) ) | ( ( 'start' ) ) | ( ( 'stop' ) ) | ( ( 'restart' ) ) | ( ( 'suspend' ) ) | ( ( 'resume' ) ) | ( ( 'wait' ) ) | ( ( 'disable' ) ) | ( ( 'enable' ) ) | ( ( 'abort' ) ) | ( ( 'schedule' ) ) | ( ( 'irun' ) ) | ( ( 'run' ) ) | ( ( 'rtc' ) ) );
+    public final void rule__OPERATOR_ACTIVITY__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13685:1: ( ( ( 'init' ) ) | ( ( 'final' ) ) | ( ( 'destroy' ) ) | ( ( 'start' ) ) | ( ( 'stop' ) ) | ( ( 'restart' ) ) | ( ( 'suspend' ) ) | ( ( 'resume' ) ) | ( ( 'wait' ) ) | ( ( 'disable' ) ) | ( ( 'enable' ) ) | ( ( 'abort' ) ) | ( ( 'schedule' ) ) | ( ( 'irun' ) ) | ( ( 'run' ) ) | ( ( 'rtc' ) ) )
+            int alt287=16;
+            switch ( input.LA(1) ) {
+            case 183:
+                {
+                alt287=1;
+                }
+                break;
+            case 179:
+                {
+                alt287=2;
+                }
+                break;
+            case 184:
+                {
+                alt287=3;
+                }
+                break;
+            case 185:
+                {
+                alt287=4;
+                }
+                break;
+            case 186:
+                {
+                alt287=5;
+                }
+                break;
+            case 187:
+                {
+                alt287=6;
+                }
+                break;
+            case 188:
+                {
+                alt287=7;
+                }
+                break;
+            case 189:
+                {
+                alt287=8;
+                }
+                break;
+            case 190:
+                {
+                alt287=9;
+                }
+                break;
+            case 191:
+                {
+                alt287=10;
+                }
+                break;
+            case 192:
+                {
+                alt287=11;
+                }
+                break;
+            case 178:
+                {
+                alt287=12;
+                }
+                break;
+            case 193:
+                {
+                alt287=13;
+                }
+                break;
+            case 194:
+                {
+                alt287=14;
+                }
+                break;
+            case 195:
+                {
+                alt287=15;
+                }
+                break;
+            case 196:
+                {
+                alt287=16;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 287, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt287) {
+                case 1 :
+                    // InternalFormalML.g:13686:2: ( ( 'init' ) )
+                    {
+                    // InternalFormalML.g:13686:2: ( ( 'init' ) )
+                    // InternalFormalML.g:13687:3: ( 'init' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalFormalML.g:13688:3: ( 'init' )
+                    // InternalFormalML.g:13688:4: 'init'
+                    {
+                    match(input,183,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13692:2: ( ( 'final' ) )
+                    {
+                    // InternalFormalML.g:13692:2: ( ( 'final' ) )
+                    // InternalFormalML.g:13693:3: ( 'final' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalFormalML.g:13694:3: ( 'final' )
+                    // InternalFormalML.g:13694:4: 'final'
+                    {
+                    match(input,179,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:13698:2: ( ( 'destroy' ) )
+                    {
+                    // InternalFormalML.g:13698:2: ( ( 'destroy' ) )
+                    // InternalFormalML.g:13699:3: ( 'destroy' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalFormalML.g:13700:3: ( 'destroy' )
+                    // InternalFormalML.g:13700:4: 'destroy'
+                    {
+                    match(input,184,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:13704:2: ( ( 'start' ) )
+                    {
+                    // InternalFormalML.g:13704:2: ( ( 'start' ) )
+                    // InternalFormalML.g:13705:3: ( 'start' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalFormalML.g:13706:3: ( 'start' )
+                    // InternalFormalML.g:13706:4: 'start'
+                    {
+                    match(input,185,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:13710:2: ( ( 'stop' ) )
+                    {
+                    // InternalFormalML.g:13710:2: ( ( 'stop' ) )
+                    // InternalFormalML.g:13711:3: ( 'stop' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_4()); 
+                    }
+                    // InternalFormalML.g:13712:3: ( 'stop' )
+                    // InternalFormalML.g:13712:4: 'stop'
+                    {
+                    match(input,186,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:13716:2: ( ( 'restart' ) )
+                    {
+                    // InternalFormalML.g:13716:2: ( ( 'restart' ) )
+                    // InternalFormalML.g:13717:3: ( 'restart' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_5()); 
+                    }
+                    // InternalFormalML.g:13718:3: ( 'restart' )
+                    // InternalFormalML.g:13718:4: 'restart'
+                    {
+                    match(input,187,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:13722:2: ( ( 'suspend' ) )
+                    {
+                    // InternalFormalML.g:13722:2: ( ( 'suspend' ) )
+                    // InternalFormalML.g:13723:3: ( 'suspend' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_6()); 
+                    }
+                    // InternalFormalML.g:13724:3: ( 'suspend' )
+                    // InternalFormalML.g:13724:4: 'suspend'
+                    {
+                    match(input,188,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:13728:2: ( ( 'resume' ) )
+                    {
+                    // InternalFormalML.g:13728:2: ( ( 'resume' ) )
+                    // InternalFormalML.g:13729:3: ( 'resume' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_7()); 
+                    }
+                    // InternalFormalML.g:13730:3: ( 'resume' )
+                    // InternalFormalML.g:13730:4: 'resume'
+                    {
+                    match(input,189,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:13734:2: ( ( 'wait' ) )
+                    {
+                    // InternalFormalML.g:13734:2: ( ( 'wait' ) )
+                    // InternalFormalML.g:13735:3: ( 'wait' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_8()); 
+                    }
+                    // InternalFormalML.g:13736:3: ( 'wait' )
+                    // InternalFormalML.g:13736:4: 'wait'
+                    {
+                    match(input,190,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:13740:2: ( ( 'disable' ) )
+                    {
+                    // InternalFormalML.g:13740:2: ( ( 'disable' ) )
+                    // InternalFormalML.g:13741:3: ( 'disable' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_9()); 
+                    }
+                    // InternalFormalML.g:13742:3: ( 'disable' )
+                    // InternalFormalML.g:13742:4: 'disable'
+                    {
+                    match(input,191,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalFormalML.g:13746:2: ( ( 'enable' ) )
+                    {
+                    // InternalFormalML.g:13746:2: ( ( 'enable' ) )
+                    // InternalFormalML.g:13747:3: ( 'enable' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_10()); 
+                    }
+                    // InternalFormalML.g:13748:3: ( 'enable' )
+                    // InternalFormalML.g:13748:4: 'enable'
+                    {
+                    match(input,192,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_10()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 12 :
+                    // InternalFormalML.g:13752:2: ( ( 'abort' ) )
+                    {
+                    // InternalFormalML.g:13752:2: ( ( 'abort' ) )
+                    // InternalFormalML.g:13753:3: ( 'abort' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_11()); 
+                    }
+                    // InternalFormalML.g:13754:3: ( 'abort' )
+                    // InternalFormalML.g:13754:4: 'abort'
+                    {
+                    match(input,178,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_11()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 13 :
+                    // InternalFormalML.g:13758:2: ( ( 'schedule' ) )
+                    {
+                    // InternalFormalML.g:13758:2: ( ( 'schedule' ) )
+                    // InternalFormalML.g:13759:3: ( 'schedule' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_12()); 
+                    }
+                    // InternalFormalML.g:13760:3: ( 'schedule' )
+                    // InternalFormalML.g:13760:4: 'schedule'
+                    {
+                    match(input,193,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_12()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 14 :
+                    // InternalFormalML.g:13764:2: ( ( 'irun' ) )
+                    {
+                    // InternalFormalML.g:13764:2: ( ( 'irun' ) )
+                    // InternalFormalML.g:13765:3: ( 'irun' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_13()); 
+                    }
+                    // InternalFormalML.g:13766:3: ( 'irun' )
+                    // InternalFormalML.g:13766:4: 'irun'
+                    {
+                    match(input,194,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_13()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 15 :
+                    // InternalFormalML.g:13770:2: ( ( 'run' ) )
+                    {
+                    // InternalFormalML.g:13770:2: ( ( 'run' ) )
+                    // InternalFormalML.g:13771:3: ( 'run' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_14()); 
+                    }
+                    // InternalFormalML.g:13772:3: ( 'run' )
+                    // InternalFormalML.g:13772:4: 'run'
+                    {
+                    match(input,195,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_14()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 16 :
+                    // InternalFormalML.g:13776:2: ( ( 'rtc' ) )
+                    {
+                    // InternalFormalML.g:13776:2: ( ( 'rtc' ) )
+                    // InternalFormalML.g:13777:3: ( 'rtc' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_15()); 
+                    }
+                    // InternalFormalML.g:13778:3: ( 'rtc' )
+                    // InternalFormalML.g:13778:4: 'rtc'
+                    {
+                    match(input,196,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_15()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OPERATOR_ACTIVITY__Alternatives"
+
+
+    // $ANTLR start "rule__Xlia__Group__0"
+    // InternalFormalML.g:13786:1: rule__Xlia__Group__0 : rule__Xlia__Group__0__Impl rule__Xlia__Group__1 ;
+    public final void rule__Xlia__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13790:1: ( rule__Xlia__Group__0__Impl rule__Xlia__Group__1 )
+            // InternalFormalML.g:13791:2: rule__Xlia__Group__0__Impl rule__Xlia__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_9);
+            rule__Xlia__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Xlia__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Xlia__Group__0"
+
+
+    // $ANTLR start "rule__Xlia__Group__0__Impl"
+    // InternalFormalML.g:13798:1: rule__Xlia__Group__0__Impl : ( ( rule__Xlia__PrologAssignment_0 ) ) ;
+    public final void rule__Xlia__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13802:1: ( ( ( rule__Xlia__PrologAssignment_0 ) ) )
+            // InternalFormalML.g:13803:1: ( ( rule__Xlia__PrologAssignment_0 ) )
+            {
+            // InternalFormalML.g:13803:1: ( ( rule__Xlia__PrologAssignment_0 ) )
+            // InternalFormalML.g:13804:2: ( rule__Xlia__PrologAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAccess().getPrologAssignment_0()); 
+            }
+            // InternalFormalML.g:13805:2: ( rule__Xlia__PrologAssignment_0 )
+            // InternalFormalML.g:13805:3: rule__Xlia__PrologAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Xlia__PrologAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAccess().getPrologAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Xlia__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Xlia__Group__1"
+    // InternalFormalML.g:13813:1: rule__Xlia__Group__1 : rule__Xlia__Group__1__Impl ;
+    public final void rule__Xlia__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13817:1: ( rule__Xlia__Group__1__Impl )
+            // InternalFormalML.g:13818:2: rule__Xlia__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Xlia__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Xlia__Group__1"
+
+
+    // $ANTLR start "rule__Xlia__Group__1__Impl"
+    // InternalFormalML.g:13824:1: rule__Xlia__Group__1__Impl : ( ( rule__Xlia__SystemAssignment_1 ) ) ;
+    public final void rule__Xlia__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13828:1: ( ( ( rule__Xlia__SystemAssignment_1 ) ) )
+            // InternalFormalML.g:13829:1: ( ( rule__Xlia__SystemAssignment_1 ) )
+            {
+            // InternalFormalML.g:13829:1: ( ( rule__Xlia__SystemAssignment_1 ) )
+            // InternalFormalML.g:13830:2: ( rule__Xlia__SystemAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAccess().getSystemAssignment_1()); 
+            }
+            // InternalFormalML.g:13831:2: ( rule__Xlia__SystemAssignment_1 )
+            // InternalFormalML.g:13831:3: rule__Xlia__SystemAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Xlia__SystemAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAccess().getSystemAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Xlia__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__0"
+    // InternalFormalML.g:13840:1: rule__XliaPrologObject__Group__0 : rule__XliaPrologObject__Group__0__Impl rule__XliaPrologObject__Group__1 ;
+    public final void rule__XliaPrologObject__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13844:1: ( rule__XliaPrologObject__Group__0__Impl rule__XliaPrologObject__Group__1 )
+            // InternalFormalML.g:13845:2: rule__XliaPrologObject__Group__0__Impl rule__XliaPrologObject__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__XliaPrologObject__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologObject__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__0"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__0__Impl"
+    // InternalFormalML.g:13852:1: rule__XliaPrologObject__Group__0__Impl : ( ( rule__XliaPrologObject__NameAssignment_0 ) ) ;
+    public final void rule__XliaPrologObject__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13856:1: ( ( ( rule__XliaPrologObject__NameAssignment_0 ) ) )
+            // InternalFormalML.g:13857:1: ( ( rule__XliaPrologObject__NameAssignment_0 ) )
+            {
+            // InternalFormalML.g:13857:1: ( ( rule__XliaPrologObject__NameAssignment_0 ) )
+            // InternalFormalML.g:13858:2: ( rule__XliaPrologObject__NameAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectAccess().getNameAssignment_0()); 
+            }
+            // InternalFormalML.g:13859:2: ( rule__XliaPrologObject__NameAssignment_0 )
+            // InternalFormalML.g:13859:3: rule__XliaPrologObject__NameAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologObject__NameAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectAccess().getNameAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__1"
+    // InternalFormalML.g:13867:1: rule__XliaPrologObject__Group__1 : rule__XliaPrologObject__Group__1__Impl rule__XliaPrologObject__Group__2 ;
+    public final void rule__XliaPrologObject__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13871:1: ( rule__XliaPrologObject__Group__1__Impl rule__XliaPrologObject__Group__2 )
+            // InternalFormalML.g:13872:2: rule__XliaPrologObject__Group__1__Impl rule__XliaPrologObject__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_11);
+            rule__XliaPrologObject__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologObject__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__1"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__1__Impl"
+    // InternalFormalML.g:13879:1: rule__XliaPrologObject__Group__1__Impl : ( '<' ) ;
+    public final void rule__XliaPrologObject__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13883:1: ( ( '<' ) )
+            // InternalFormalML.g:13884:1: ( '<' )
+            {
+            // InternalFormalML.g:13884:1: ( '<' )
+            // InternalFormalML.g:13885:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectAccess().getLessThanSignKeyword_1()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectAccess().getLessThanSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__2"
+    // InternalFormalML.g:13894:1: rule__XliaPrologObject__Group__2 : rule__XliaPrologObject__Group__2__Impl rule__XliaPrologObject__Group__3 ;
+    public final void rule__XliaPrologObject__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13898:1: ( rule__XliaPrologObject__Group__2__Impl rule__XliaPrologObject__Group__3 )
+            // InternalFormalML.g:13899:2: rule__XliaPrologObject__Group__2__Impl rule__XliaPrologObject__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_12);
+            rule__XliaPrologObject__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologObject__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__2"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__2__Impl"
+    // InternalFormalML.g:13906:1: rule__XliaPrologObject__Group__2__Impl : ( ( rule__XliaPrologObject__ElementsAssignment_2 ) ) ;
+    public final void rule__XliaPrologObject__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13910:1: ( ( ( rule__XliaPrologObject__ElementsAssignment_2 ) ) )
+            // InternalFormalML.g:13911:1: ( ( rule__XliaPrologObject__ElementsAssignment_2 ) )
+            {
+            // InternalFormalML.g:13911:1: ( ( rule__XliaPrologObject__ElementsAssignment_2 ) )
+            // InternalFormalML.g:13912:2: ( rule__XliaPrologObject__ElementsAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_2()); 
+            }
+            // InternalFormalML.g:13913:2: ( rule__XliaPrologObject__ElementsAssignment_2 )
+            // InternalFormalML.g:13913:3: rule__XliaPrologObject__ElementsAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologObject__ElementsAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__3"
+    // InternalFormalML.g:13921:1: rule__XliaPrologObject__Group__3 : rule__XliaPrologObject__Group__3__Impl rule__XliaPrologObject__Group__4 ;
+    public final void rule__XliaPrologObject__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13925:1: ( rule__XliaPrologObject__Group__3__Impl rule__XliaPrologObject__Group__4 )
+            // InternalFormalML.g:13926:2: rule__XliaPrologObject__Group__3__Impl rule__XliaPrologObject__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_13);
+            rule__XliaPrologObject__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologObject__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__3"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__3__Impl"
+    // InternalFormalML.g:13933:1: rule__XliaPrologObject__Group__3__Impl : ( '>:' ) ;
+    public final void rule__XliaPrologObject__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13937:1: ( ( '>:' ) )
+            // InternalFormalML.g:13938:1: ( '>:' )
+            {
+            // InternalFormalML.g:13938:1: ( '>:' )
+            // InternalFormalML.g:13939:2: '>:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectAccess().getGreaterThanSignColonKeyword_3()); 
+            }
+            match(input,197,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectAccess().getGreaterThanSignColonKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__4"
+    // InternalFormalML.g:13948:1: rule__XliaPrologObject__Group__4 : rule__XliaPrologObject__Group__4__Impl ;
+    public final void rule__XliaPrologObject__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13952:1: ( rule__XliaPrologObject__Group__4__Impl )
+            // InternalFormalML.g:13953:2: rule__XliaPrologObject__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologObject__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__4"
+
+
+    // $ANTLR start "rule__XliaPrologObject__Group__4__Impl"
+    // InternalFormalML.g:13959:1: rule__XliaPrologObject__Group__4__Impl : ( ( rule__XliaPrologObject__ElementsAssignment_4 )? ) ;
+    public final void rule__XliaPrologObject__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13963:1: ( ( ( rule__XliaPrologObject__ElementsAssignment_4 )? ) )
+            // InternalFormalML.g:13964:1: ( ( rule__XliaPrologObject__ElementsAssignment_4 )? )
+            {
+            // InternalFormalML.g:13964:1: ( ( rule__XliaPrologObject__ElementsAssignment_4 )? )
+            // InternalFormalML.g:13965:2: ( rule__XliaPrologObject__ElementsAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_4()); 
+            }
+            // InternalFormalML.g:13966:2: ( rule__XliaPrologObject__ElementsAssignment_4 )?
+            int alt288=2;
+            int LA288_0 = input.LA(1);
+
+            if ( (LA288_0==272) ) {
+                alt288=1;
+            }
+            switch (alt288) {
+                case 1 :
+                    // InternalFormalML.g:13966:3: rule__XliaPrologObject__ElementsAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__XliaPrologObject__ElementsAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectAccess().getElementsAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__Group__4__Impl"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__Group__0"
+    // InternalFormalML.g:13975:1: rule__XliaPrologAttribute__Group__0 : rule__XliaPrologAttribute__Group__0__Impl rule__XliaPrologAttribute__Group__1 ;
+    public final void rule__XliaPrologAttribute__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13979:1: ( rule__XliaPrologAttribute__Group__0__Impl rule__XliaPrologAttribute__Group__1 )
+            // InternalFormalML.g:13980:2: rule__XliaPrologAttribute__Group__0__Impl rule__XliaPrologAttribute__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__XliaPrologAttribute__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologAttribute__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__Group__0"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__Group__0__Impl"
+    // InternalFormalML.g:13987:1: rule__XliaPrologAttribute__Group__0__Impl : ( ( rule__XliaPrologAttribute__NameAssignment_0 ) ) ;
+    public final void rule__XliaPrologAttribute__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:13991:1: ( ( ( rule__XliaPrologAttribute__NameAssignment_0 ) ) )
+            // InternalFormalML.g:13992:1: ( ( rule__XliaPrologAttribute__NameAssignment_0 ) )
+            {
+            // InternalFormalML.g:13992:1: ( ( rule__XliaPrologAttribute__NameAssignment_0 ) )
+            // InternalFormalML.g:13993:2: ( rule__XliaPrologAttribute__NameAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologAttributeAccess().getNameAssignment_0()); 
+            }
+            // InternalFormalML.g:13994:2: ( rule__XliaPrologAttribute__NameAssignment_0 )
+            // InternalFormalML.g:13994:3: rule__XliaPrologAttribute__NameAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologAttribute__NameAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologAttributeAccess().getNameAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__Group__1"
+    // InternalFormalML.g:14002:1: rule__XliaPrologAttribute__Group__1 : rule__XliaPrologAttribute__Group__1__Impl ;
+    public final void rule__XliaPrologAttribute__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14006:1: ( rule__XliaPrologAttribute__Group__1__Impl )
+            // InternalFormalML.g:14007:2: rule__XliaPrologAttribute__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologAttribute__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__Group__1"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__Group__1__Impl"
+    // InternalFormalML.g:14013:1: rule__XliaPrologAttribute__Group__1__Impl : ( ( rule__XliaPrologAttribute__Group_1__0 )? ) ;
+    public final void rule__XliaPrologAttribute__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14017:1: ( ( ( rule__XliaPrologAttribute__Group_1__0 )? ) )
+            // InternalFormalML.g:14018:1: ( ( rule__XliaPrologAttribute__Group_1__0 )? )
+            {
+            // InternalFormalML.g:14018:1: ( ( rule__XliaPrologAttribute__Group_1__0 )? )
+            // InternalFormalML.g:14019:2: ( rule__XliaPrologAttribute__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologAttributeAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:14020:2: ( rule__XliaPrologAttribute__Group_1__0 )?
+            int alt289=2;
+            int LA289_0 = input.LA(1);
+
+            if ( (LA289_0==198) ) {
+                alt289=1;
+            }
+            switch (alt289) {
+                case 1 :
+                    // InternalFormalML.g:14020:3: rule__XliaPrologAttribute__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__XliaPrologAttribute__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologAttributeAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__Group_1__0"
+    // InternalFormalML.g:14029:1: rule__XliaPrologAttribute__Group_1__0 : rule__XliaPrologAttribute__Group_1__0__Impl rule__XliaPrologAttribute__Group_1__1 ;
+    public final void rule__XliaPrologAttribute__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14033:1: ( rule__XliaPrologAttribute__Group_1__0__Impl rule__XliaPrologAttribute__Group_1__1 )
+            // InternalFormalML.g:14034:2: rule__XliaPrologAttribute__Group_1__0__Impl rule__XliaPrologAttribute__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_15);
+            rule__XliaPrologAttribute__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologAttribute__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__Group_1__0"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__Group_1__0__Impl"
+    // InternalFormalML.g:14041:1: rule__XliaPrologAttribute__Group_1__0__Impl : ( ',' ) ;
+    public final void rule__XliaPrologAttribute__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14045:1: ( ( ',' ) )
+            // InternalFormalML.g:14046:1: ( ',' )
+            {
+            // InternalFormalML.g:14046:1: ( ',' )
+            // InternalFormalML.g:14047:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologAttributeAccess().getCommaKeyword_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologAttributeAccess().getCommaKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__Group_1__1"
+    // InternalFormalML.g:14056:1: rule__XliaPrologAttribute__Group_1__1 : rule__XliaPrologAttribute__Group_1__1__Impl ;
+    public final void rule__XliaPrologAttribute__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14060:1: ( rule__XliaPrologAttribute__Group_1__1__Impl )
+            // InternalFormalML.g:14061:2: rule__XliaPrologAttribute__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologAttribute__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__Group_1__1"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__Group_1__1__Impl"
+    // InternalFormalML.g:14067:1: rule__XliaPrologAttribute__Group_1__1__Impl : ( ( rule__XliaPrologAttribute__ValueAssignment_1_1 ) ) ;
+    public final void rule__XliaPrologAttribute__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14071:1: ( ( ( rule__XliaPrologAttribute__ValueAssignment_1_1 ) ) )
+            // InternalFormalML.g:14072:1: ( ( rule__XliaPrologAttribute__ValueAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:14072:1: ( ( rule__XliaPrologAttribute__ValueAssignment_1_1 ) )
+            // InternalFormalML.g:14073:2: ( rule__XliaPrologAttribute__ValueAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologAttributeAccess().getValueAssignment_1_1()); 
+            }
+            // InternalFormalML.g:14074:2: ( rule__XliaPrologAttribute__ValueAssignment_1_1 )
+            // InternalFormalML.g:14074:3: rule__XliaPrologAttribute__ValueAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologAttribute__ValueAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologAttributeAccess().getValueAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__XliaOptionObject__Group__0"
+    // InternalFormalML.g:14083:1: rule__XliaOptionObject__Group__0 : rule__XliaOptionObject__Group__0__Impl rule__XliaOptionObject__Group__1 ;
+    public final void rule__XliaOptionObject__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14087:1: ( rule__XliaOptionObject__Group__0__Impl rule__XliaOptionObject__Group__1 )
+            // InternalFormalML.g:14088:2: rule__XliaOptionObject__Group__0__Impl rule__XliaOptionObject__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__XliaOptionObject__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaOptionObject__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__Group__0"
+
+
+    // $ANTLR start "rule__XliaOptionObject__Group__0__Impl"
+    // InternalFormalML.g:14095:1: rule__XliaOptionObject__Group__0__Impl : ( ( rule__XliaOptionObject__NameAssignment_0 ) ) ;
+    public final void rule__XliaOptionObject__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14099:1: ( ( ( rule__XliaOptionObject__NameAssignment_0 ) ) )
+            // InternalFormalML.g:14100:1: ( ( rule__XliaOptionObject__NameAssignment_0 ) )
+            {
+            // InternalFormalML.g:14100:1: ( ( rule__XliaOptionObject__NameAssignment_0 ) )
+            // InternalFormalML.g:14101:2: ( rule__XliaOptionObject__NameAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaOptionObjectAccess().getNameAssignment_0()); 
+            }
+            // InternalFormalML.g:14102:2: ( rule__XliaOptionObject__NameAssignment_0 )
+            // InternalFormalML.g:14102:3: rule__XliaOptionObject__NameAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaOptionObject__NameAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaOptionObjectAccess().getNameAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XliaOptionObject__Group__1"
+    // InternalFormalML.g:14110:1: rule__XliaOptionObject__Group__1 : rule__XliaOptionObject__Group__1__Impl rule__XliaOptionObject__Group__2 ;
+    public final void rule__XliaOptionObject__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14114:1: ( rule__XliaOptionObject__Group__1__Impl rule__XliaOptionObject__Group__2 )
+            // InternalFormalML.g:14115:2: rule__XliaOptionObject__Group__1__Impl rule__XliaOptionObject__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__XliaOptionObject__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaOptionObject__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__Group__1"
+
+
+    // $ANTLR start "rule__XliaOptionObject__Group__1__Impl"
+    // InternalFormalML.g:14122:1: rule__XliaOptionObject__Group__1__Impl : ( '{' ) ;
+    public final void rule__XliaOptionObject__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14126:1: ( ( '{' ) )
+            // InternalFormalML.g:14127:1: ( '{' )
+            {
+            // InternalFormalML.g:14127:1: ( '{' )
+            // InternalFormalML.g:14128:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaOptionObjectAccess().getLeftCurlyBracketKeyword_1()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaOptionObjectAccess().getLeftCurlyBracketKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XliaOptionObject__Group__2"
+    // InternalFormalML.g:14137:1: rule__XliaOptionObject__Group__2 : rule__XliaOptionObject__Group__2__Impl rule__XliaOptionObject__Group__3 ;
+    public final void rule__XliaOptionObject__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14141:1: ( rule__XliaOptionObject__Group__2__Impl rule__XliaOptionObject__Group__3 )
+            // InternalFormalML.g:14142:2: rule__XliaOptionObject__Group__2__Impl rule__XliaOptionObject__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__XliaOptionObject__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaOptionObject__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__Group__2"
+
+
+    // $ANTLR start "rule__XliaOptionObject__Group__2__Impl"
+    // InternalFormalML.g:14149:1: rule__XliaOptionObject__Group__2__Impl : ( ( rule__XliaOptionObject__ElementsAssignment_2 )* ) ;
+    public final void rule__XliaOptionObject__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14153:1: ( ( ( rule__XliaOptionObject__ElementsAssignment_2 )* ) )
+            // InternalFormalML.g:14154:1: ( ( rule__XliaOptionObject__ElementsAssignment_2 )* )
+            {
+            // InternalFormalML.g:14154:1: ( ( rule__XliaOptionObject__ElementsAssignment_2 )* )
+            // InternalFormalML.g:14155:2: ( rule__XliaOptionObject__ElementsAssignment_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaOptionObjectAccess().getElementsAssignment_2()); 
+            }
+            // InternalFormalML.g:14156:2: ( rule__XliaOptionObject__ElementsAssignment_2 )*
+            loop290:
+            do {
+                int alt290=2;
+                int LA290_0 = input.LA(1);
+
+                if ( (LA290_0==RULE_XLIA_ID) ) {
+                    alt290=1;
+                }
+
+
+                switch (alt290) {
+            	case 1 :
+            	    // InternalFormalML.g:14156:3: rule__XliaOptionObject__ElementsAssignment_2
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_18);
+            	    rule__XliaOptionObject__ElementsAssignment_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop290;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaOptionObjectAccess().getElementsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XliaOptionObject__Group__3"
+    // InternalFormalML.g:14164:1: rule__XliaOptionObject__Group__3 : rule__XliaOptionObject__Group__3__Impl ;
+    public final void rule__XliaOptionObject__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14168:1: ( rule__XliaOptionObject__Group__3__Impl )
+            // InternalFormalML.g:14169:2: rule__XliaOptionObject__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaOptionObject__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__Group__3"
+
+
+    // $ANTLR start "rule__XliaOptionObject__Group__3__Impl"
+    // InternalFormalML.g:14175:1: rule__XliaOptionObject__Group__3__Impl : ( '}' ) ;
+    public final void rule__XliaOptionObject__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14179:1: ( ( '}' ) )
+            // InternalFormalML.g:14180:1: ( '}' )
+            {
+            // InternalFormalML.g:14180:1: ( '}' )
+            // InternalFormalML.g:14181:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaOptionObjectAccess().getRightCurlyBracketKeyword_3()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaOptionObjectAccess().getRightCurlyBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XliaObject__Group__0"
+    // InternalFormalML.g:14191:1: rule__XliaObject__Group__0 : rule__XliaObject__Group__0__Impl rule__XliaObject__Group__1 ;
+    public final void rule__XliaObject__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14195:1: ( rule__XliaObject__Group__0__Impl rule__XliaObject__Group__1 )
+            // InternalFormalML.g:14196:2: rule__XliaObject__Group__0__Impl rule__XliaObject__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__XliaObject__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaObject__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__Group__0"
+
+
+    // $ANTLR start "rule__XliaObject__Group__0__Impl"
+    // InternalFormalML.g:14203:1: rule__XliaObject__Group__0__Impl : ( ( rule__XliaObject__NameAssignment_0 ) ) ;
+    public final void rule__XliaObject__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14207:1: ( ( ( rule__XliaObject__NameAssignment_0 ) ) )
+            // InternalFormalML.g:14208:1: ( ( rule__XliaObject__NameAssignment_0 ) )
+            {
+            // InternalFormalML.g:14208:1: ( ( rule__XliaObject__NameAssignment_0 ) )
+            // InternalFormalML.g:14209:2: ( rule__XliaObject__NameAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaObjectAccess().getNameAssignment_0()); 
+            }
+            // InternalFormalML.g:14210:2: ( rule__XliaObject__NameAssignment_0 )
+            // InternalFormalML.g:14210:3: rule__XliaObject__NameAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaObject__NameAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaObjectAccess().getNameAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XliaObject__Group__1"
+    // InternalFormalML.g:14218:1: rule__XliaObject__Group__1 : rule__XliaObject__Group__1__Impl rule__XliaObject__Group__2 ;
+    public final void rule__XliaObject__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14222:1: ( rule__XliaObject__Group__1__Impl rule__XliaObject__Group__2 )
+            // InternalFormalML.g:14223:2: rule__XliaObject__Group__1__Impl rule__XliaObject__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__XliaObject__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaObject__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__Group__1"
+
+
+    // $ANTLR start "rule__XliaObject__Group__1__Impl"
+    // InternalFormalML.g:14230:1: rule__XliaObject__Group__1__Impl : ( '{' ) ;
+    public final void rule__XliaObject__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14234:1: ( ( '{' ) )
+            // InternalFormalML.g:14235:1: ( '{' )
+            {
+            // InternalFormalML.g:14235:1: ( '{' )
+            // InternalFormalML.g:14236:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaObjectAccess().getLeftCurlyBracketKeyword_1()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaObjectAccess().getLeftCurlyBracketKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XliaObject__Group__2"
+    // InternalFormalML.g:14245:1: rule__XliaObject__Group__2 : rule__XliaObject__Group__2__Impl rule__XliaObject__Group__3 ;
+    public final void rule__XliaObject__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14249:1: ( rule__XliaObject__Group__2__Impl rule__XliaObject__Group__3 )
+            // InternalFormalML.g:14250:2: rule__XliaObject__Group__2__Impl rule__XliaObject__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__XliaObject__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaObject__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__Group__2"
+
+
+    // $ANTLR start "rule__XliaObject__Group__2__Impl"
+    // InternalFormalML.g:14257:1: rule__XliaObject__Group__2__Impl : ( ( rule__XliaObject__ElementsAssignment_2 )* ) ;
+    public final void rule__XliaObject__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14261:1: ( ( ( rule__XliaObject__ElementsAssignment_2 )* ) )
+            // InternalFormalML.g:14262:1: ( ( rule__XliaObject__ElementsAssignment_2 )* )
+            {
+            // InternalFormalML.g:14262:1: ( ( rule__XliaObject__ElementsAssignment_2 )* )
+            // InternalFormalML.g:14263:2: ( rule__XliaObject__ElementsAssignment_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaObjectAccess().getElementsAssignment_2()); 
+            }
+            // InternalFormalML.g:14264:2: ( rule__XliaObject__ElementsAssignment_2 )*
+            loop291:
+            do {
+                int alt291=2;
+                int LA291_0 = input.LA(1);
+
+                if ( (LA291_0==RULE_XLIA_ID) ) {
+                    alt291=1;
+                }
+
+
+                switch (alt291) {
+            	case 1 :
+            	    // InternalFormalML.g:14264:3: rule__XliaObject__ElementsAssignment_2
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_18);
+            	    rule__XliaObject__ElementsAssignment_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop291;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaObjectAccess().getElementsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XliaObject__Group__3"
+    // InternalFormalML.g:14272:1: rule__XliaObject__Group__3 : rule__XliaObject__Group__3__Impl ;
+    public final void rule__XliaObject__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14276:1: ( rule__XliaObject__Group__3__Impl )
+            // InternalFormalML.g:14277:2: rule__XliaObject__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaObject__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__Group__3"
+
+
+    // $ANTLR start "rule__XliaObject__Group__3__Impl"
+    // InternalFormalML.g:14283:1: rule__XliaObject__Group__3__Impl : ( '}' ) ;
+    public final void rule__XliaObject__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14287:1: ( ( '}' ) )
+            // InternalFormalML.g:14288:1: ( '}' )
+            {
+            // InternalFormalML.g:14288:1: ( '}' )
+            // InternalFormalML.g:14289:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaObjectAccess().getRightCurlyBracketKeyword_3()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaObjectAccess().getRightCurlyBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__Group__3__Impl"
+
+
+    // $ANTLR start "rule__XliaAttribute__Group__0"
+    // InternalFormalML.g:14299:1: rule__XliaAttribute__Group__0 : rule__XliaAttribute__Group__0__Impl rule__XliaAttribute__Group__1 ;
+    public final void rule__XliaAttribute__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14303:1: ( rule__XliaAttribute__Group__0__Impl rule__XliaAttribute__Group__1 )
+            // InternalFormalML.g:14304:2: rule__XliaAttribute__Group__0__Impl rule__XliaAttribute__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_19);
+            rule__XliaAttribute__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaAttribute__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__Group__0"
+
+
+    // $ANTLR start "rule__XliaAttribute__Group__0__Impl"
+    // InternalFormalML.g:14311:1: rule__XliaAttribute__Group__0__Impl : ( ( rule__XliaAttribute__NameAssignment_0 ) ) ;
+    public final void rule__XliaAttribute__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14315:1: ( ( ( rule__XliaAttribute__NameAssignment_0 ) ) )
+            // InternalFormalML.g:14316:1: ( ( rule__XliaAttribute__NameAssignment_0 ) )
+            {
+            // InternalFormalML.g:14316:1: ( ( rule__XliaAttribute__NameAssignment_0 ) )
+            // InternalFormalML.g:14317:2: ( rule__XliaAttribute__NameAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAttributeAccess().getNameAssignment_0()); 
+            }
+            // InternalFormalML.g:14318:2: ( rule__XliaAttribute__NameAssignment_0 )
+            // InternalFormalML.g:14318:3: rule__XliaAttribute__NameAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaAttribute__NameAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAttributeAccess().getNameAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XliaAttribute__Group__1"
+    // InternalFormalML.g:14326:1: rule__XliaAttribute__Group__1 : rule__XliaAttribute__Group__1__Impl rule__XliaAttribute__Group__2 ;
+    public final void rule__XliaAttribute__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14330:1: ( rule__XliaAttribute__Group__1__Impl rule__XliaAttribute__Group__2 )
+            // InternalFormalML.g:14331:2: rule__XliaAttribute__Group__1__Impl rule__XliaAttribute__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__XliaAttribute__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaAttribute__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__Group__1"
+
+
+    // $ANTLR start "rule__XliaAttribute__Group__1__Impl"
+    // InternalFormalML.g:14338:1: rule__XliaAttribute__Group__1__Impl : ( '=' ) ;
+    public final void rule__XliaAttribute__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14342:1: ( ( '=' ) )
+            // InternalFormalML.g:14343:1: ( '=' )
+            {
+            // InternalFormalML.g:14343:1: ( '=' )
+            // InternalFormalML.g:14344:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAttributeAccess().getEqualsSignKeyword_1()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAttributeAccess().getEqualsSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XliaAttribute__Group__2"
+    // InternalFormalML.g:14353:1: rule__XliaAttribute__Group__2 : rule__XliaAttribute__Group__2__Impl rule__XliaAttribute__Group__3 ;
+    public final void rule__XliaAttribute__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14357:1: ( rule__XliaAttribute__Group__2__Impl rule__XliaAttribute__Group__3 )
+            // InternalFormalML.g:14358:2: rule__XliaAttribute__Group__2__Impl rule__XliaAttribute__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__XliaAttribute__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaAttribute__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__Group__2"
+
+
+    // $ANTLR start "rule__XliaAttribute__Group__2__Impl"
+    // InternalFormalML.g:14365:1: rule__XliaAttribute__Group__2__Impl : ( ( rule__XliaAttribute__ValueAssignment_2 ) ) ;
+    public final void rule__XliaAttribute__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14369:1: ( ( ( rule__XliaAttribute__ValueAssignment_2 ) ) )
+            // InternalFormalML.g:14370:1: ( ( rule__XliaAttribute__ValueAssignment_2 ) )
+            {
+            // InternalFormalML.g:14370:1: ( ( rule__XliaAttribute__ValueAssignment_2 ) )
+            // InternalFormalML.g:14371:2: ( rule__XliaAttribute__ValueAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAttributeAccess().getValueAssignment_2()); 
+            }
+            // InternalFormalML.g:14372:2: ( rule__XliaAttribute__ValueAssignment_2 )
+            // InternalFormalML.g:14372:3: rule__XliaAttribute__ValueAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaAttribute__ValueAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAttributeAccess().getValueAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XliaAttribute__Group__3"
+    // InternalFormalML.g:14380:1: rule__XliaAttribute__Group__3 : rule__XliaAttribute__Group__3__Impl ;
+    public final void rule__XliaAttribute__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14384:1: ( rule__XliaAttribute__Group__3__Impl )
+            // InternalFormalML.g:14385:2: rule__XliaAttribute__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaAttribute__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__Group__3"
+
+
+    // $ANTLR start "rule__XliaAttribute__Group__3__Impl"
+    // InternalFormalML.g:14391:1: rule__XliaAttribute__Group__3__Impl : ( ';' ) ;
+    public final void rule__XliaAttribute__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14395:1: ( ( ';' ) )
+            // InternalFormalML.g:14396:1: ( ';' )
+            {
+            // InternalFormalML.g:14396:1: ( ';' )
+            // InternalFormalML.g:14397:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAttributeAccess().getSemicolonKeyword_3()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAttributeAccess().getSemicolonKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EInt__Group__0"
+    // InternalFormalML.g:14407:1: rule__EInt__Group__0 : rule__EInt__Group__0__Impl rule__EInt__Group__1 ;
+    public final void rule__EInt__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14411:1: ( rule__EInt__Group__0__Impl rule__EInt__Group__1 )
+            // InternalFormalML.g:14412:2: rule__EInt__Group__0__Impl rule__EInt__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_22);
+            rule__EInt__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EInt__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EInt__Group__0"
+
+
+    // $ANTLR start "rule__EInt__Group__0__Impl"
+    // InternalFormalML.g:14419:1: rule__EInt__Group__0__Impl : ( ( '-' )? ) ;
+    public final void rule__EInt__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14423:1: ( ( ( '-' )? ) )
+            // InternalFormalML.g:14424:1: ( ( '-' )? )
+            {
+            // InternalFormalML.g:14424:1: ( ( '-' )? )
+            // InternalFormalML.g:14425:2: ( '-' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEIntAccess().getHyphenMinusKeyword_0()); 
+            }
+            // InternalFormalML.g:14426:2: ( '-' )?
+            int alt292=2;
+            int LA292_0 = input.LA(1);
+
+            if ( (LA292_0==132) ) {
+                alt292=1;
+            }
+            switch (alt292) {
+                case 1 :
+                    // InternalFormalML.g:14426:3: '-'
+                    {
+                    match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEIntAccess().getHyphenMinusKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EInt__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EInt__Group__1"
+    // InternalFormalML.g:14434:1: rule__EInt__Group__1 : rule__EInt__Group__1__Impl ;
+    public final void rule__EInt__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14438:1: ( rule__EInt__Group__1__Impl )
+            // InternalFormalML.g:14439:2: rule__EInt__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EInt__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EInt__Group__1"
+
+
+    // $ANTLR start "rule__EInt__Group__1__Impl"
+    // InternalFormalML.g:14445:1: rule__EInt__Group__1__Impl : ( RULE_INT ) ;
+    public final void rule__EInt__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14449:1: ( ( RULE_INT ) )
+            // InternalFormalML.g:14450:1: ( RULE_INT )
+            {
+            // InternalFormalML.g:14450:1: ( RULE_INT )
+            // InternalFormalML.g:14451:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEIntAccess().getINTTerminalRuleCall_1()); 
+            }
+            match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEIntAccess().getINTTerminalRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EInt__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EInteger__Group__0"
+    // InternalFormalML.g:14461:1: rule__EInteger__Group__0 : rule__EInteger__Group__0__Impl rule__EInteger__Group__1 ;
+    public final void rule__EInteger__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14465:1: ( rule__EInteger__Group__0__Impl rule__EInteger__Group__1 )
+            // InternalFormalML.g:14466:2: rule__EInteger__Group__0__Impl rule__EInteger__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__EInteger__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EInteger__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EInteger__Group__0"
+
+
+    // $ANTLR start "rule__EInteger__Group__0__Impl"
+    // InternalFormalML.g:14473:1: rule__EInteger__Group__0__Impl : ( ( '-' )? ) ;
+    public final void rule__EInteger__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14477:1: ( ( ( '-' )? ) )
+            // InternalFormalML.g:14478:1: ( ( '-' )? )
+            {
+            // InternalFormalML.g:14478:1: ( ( '-' )? )
+            // InternalFormalML.g:14479:2: ( '-' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEIntegerAccess().getHyphenMinusKeyword_0()); 
+            }
+            // InternalFormalML.g:14480:2: ( '-' )?
+            int alt293=2;
+            int LA293_0 = input.LA(1);
+
+            if ( (LA293_0==132) ) {
+                alt293=1;
+            }
+            switch (alt293) {
+                case 1 :
+                    // InternalFormalML.g:14480:3: '-'
+                    {
+                    match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEIntegerAccess().getHyphenMinusKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EInteger__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EInteger__Group__1"
+    // InternalFormalML.g:14488:1: rule__EInteger__Group__1 : rule__EInteger__Group__1__Impl ;
+    public final void rule__EInteger__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14492:1: ( rule__EInteger__Group__1__Impl )
+            // InternalFormalML.g:14493:2: rule__EInteger__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EInteger__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EInteger__Group__1"
+
+
+    // $ANTLR start "rule__EInteger__Group__1__Impl"
+    // InternalFormalML.g:14499:1: rule__EInteger__Group__1__Impl : ( RULE_INT ) ;
+    public final void rule__EInteger__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14503:1: ( ( RULE_INT ) )
+            // InternalFormalML.g:14504:1: ( RULE_INT )
+            {
+            // InternalFormalML.g:14504:1: ( RULE_INT )
+            // InternalFormalML.g:14505:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEIntegerAccess().getINTTerminalRuleCall_1()); 
+            }
+            match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEIntegerAccess().getINTTerminalRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EInteger__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EDouble__Group__0"
+    // InternalFormalML.g:14515:1: rule__EDouble__Group__0 : rule__EDouble__Group__0__Impl rule__EDouble__Group__1 ;
+    public final void rule__EDouble__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14519:1: ( rule__EDouble__Group__0__Impl rule__EDouble__Group__1 )
+            // InternalFormalML.g:14520:2: rule__EDouble__Group__0__Impl rule__EDouble__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_24);
+            rule__EDouble__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__0"
+
+
+    // $ANTLR start "rule__EDouble__Group__0__Impl"
+    // InternalFormalML.g:14527:1: rule__EDouble__Group__0__Impl : ( ( '-' )? ) ;
+    public final void rule__EDouble__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14531:1: ( ( ( '-' )? ) )
+            // InternalFormalML.g:14532:1: ( ( '-' )? )
+            {
+            // InternalFormalML.g:14532:1: ( ( '-' )? )
+            // InternalFormalML.g:14533:2: ( '-' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0()); 
+            }
+            // InternalFormalML.g:14534:2: ( '-' )?
+            int alt294=2;
+            int LA294_0 = input.LA(1);
+
+            if ( (LA294_0==132) ) {
+                alt294=1;
+            }
+            switch (alt294) {
+                case 1 :
+                    // InternalFormalML.g:14534:3: '-'
+                    {
+                    match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EDouble__Group__1"
+    // InternalFormalML.g:14542:1: rule__EDouble__Group__1 : rule__EDouble__Group__1__Impl rule__EDouble__Group__2 ;
+    public final void rule__EDouble__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14546:1: ( rule__EDouble__Group__1__Impl rule__EDouble__Group__2 )
+            // InternalFormalML.g:14547:2: rule__EDouble__Group__1__Impl rule__EDouble__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_24);
+            rule__EDouble__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__1"
+
+
+    // $ANTLR start "rule__EDouble__Group__1__Impl"
+    // InternalFormalML.g:14554:1: rule__EDouble__Group__1__Impl : ( ( RULE_INT )? ) ;
+    public final void rule__EDouble__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14558:1: ( ( ( RULE_INT )? ) )
+            // InternalFormalML.g:14559:1: ( ( RULE_INT )? )
+            {
+            // InternalFormalML.g:14559:1: ( ( RULE_INT )? )
+            // InternalFormalML.g:14560:2: ( RULE_INT )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1()); 
+            }
+            // InternalFormalML.g:14561:2: ( RULE_INT )?
+            int alt295=2;
+            int LA295_0 = input.LA(1);
+
+            if ( (LA295_0==RULE_INT) ) {
+                alt295=1;
+            }
+            switch (alt295) {
+                case 1 :
+                    // InternalFormalML.g:14561:3: RULE_INT
+                    {
+                    match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EDouble__Group__2"
+    // InternalFormalML.g:14569:1: rule__EDouble__Group__2 : rule__EDouble__Group__2__Impl rule__EDouble__Group__3 ;
+    public final void rule__EDouble__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14573:1: ( rule__EDouble__Group__2__Impl rule__EDouble__Group__3 )
+            // InternalFormalML.g:14574:2: rule__EDouble__Group__2__Impl rule__EDouble__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_22);
+            rule__EDouble__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__2"
+
+
+    // $ANTLR start "rule__EDouble__Group__2__Impl"
+    // InternalFormalML.g:14581:1: rule__EDouble__Group__2__Impl : ( '.' ) ;
+    public final void rule__EDouble__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14585:1: ( ( '.' ) )
+            // InternalFormalML.g:14586:1: ( '.' )
+            {
+            // InternalFormalML.g:14586:1: ( '.' )
+            // InternalFormalML.g:14587:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getFullStopKeyword_2()); 
+            }
+            match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getFullStopKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EDouble__Group__3"
+    // InternalFormalML.g:14596:1: rule__EDouble__Group__3 : rule__EDouble__Group__3__Impl ;
+    public final void rule__EDouble__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14600:1: ( rule__EDouble__Group__3__Impl )
+            // InternalFormalML.g:14601:2: rule__EDouble__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EDouble__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__3"
+
+
+    // $ANTLR start "rule__EDouble__Group__3__Impl"
+    // InternalFormalML.g:14607:1: rule__EDouble__Group__3__Impl : ( RULE_INT ) ;
+    public final void rule__EDouble__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14611:1: ( ( RULE_INT ) )
+            // InternalFormalML.g:14612:1: ( RULE_INT )
+            {
+            // InternalFormalML.g:14612:1: ( RULE_INT )
+            // InternalFormalML.g:14613:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3()); 
+            }
+            match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EDouble__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ESUfid__Group__0"
+    // InternalFormalML.g:14623:1: rule__ESUfid__Group__0 : rule__ESUfid__Group__0__Impl rule__ESUfid__Group__1 ;
+    public final void rule__ESUfid__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14627:1: ( rule__ESUfid__Group__0__Impl rule__ESUfid__Group__1 )
+            // InternalFormalML.g:14628:2: rule__ESUfid__Group__0__Impl rule__ESUfid__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_25);
+            rule__ESUfid__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ESUfid__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ESUfid__Group__0"
+
+
+    // $ANTLR start "rule__ESUfid__Group__0__Impl"
+    // InternalFormalML.g:14635:1: rule__ESUfid__Group__0__Impl : ( RULE_XLIA_ID ) ;
+    public final void rule__ESUfid__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14639:1: ( ( RULE_XLIA_ID ) )
+            // InternalFormalML.g:14640:1: ( RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:14640:1: ( RULE_XLIA_ID )
+            // InternalFormalML.g:14641:2: RULE_XLIA_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_0()); 
+            }
+            match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ESUfid__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ESUfid__Group__1"
+    // InternalFormalML.g:14650:1: rule__ESUfid__Group__1 : rule__ESUfid__Group__1__Impl ;
+    public final void rule__ESUfid__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14654:1: ( rule__ESUfid__Group__1__Impl )
+            // InternalFormalML.g:14655:2: rule__ESUfid__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ESUfid__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ESUfid__Group__1"
+
+
+    // $ANTLR start "rule__ESUfid__Group__1__Impl"
+    // InternalFormalML.g:14661:1: rule__ESUfid__Group__1__Impl : ( ( rule__ESUfid__Group_1__0 )* ) ;
+    public final void rule__ESUfid__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14665:1: ( ( ( rule__ESUfid__Group_1__0 )* ) )
+            // InternalFormalML.g:14666:1: ( ( rule__ESUfid__Group_1__0 )* )
+            {
+            // InternalFormalML.g:14666:1: ( ( rule__ESUfid__Group_1__0 )* )
+            // InternalFormalML.g:14667:2: ( rule__ESUfid__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getESUfidAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:14668:2: ( rule__ESUfid__Group_1__0 )*
+            loop296:
+            do {
+                int alt296=2;
+                int LA296_0 = input.LA(1);
+
+                if ( (LA296_0==20) ) {
+                    int LA296_2 = input.LA(2);
+
+                    if ( (LA296_2==RULE_XLIA_ID) ) {
+                        alt296=1;
+                    }
+
+
+                }
+                else if ( ((LA296_0>=31 && LA296_0<=32)) ) {
+                    alt296=1;
+                }
+
+
+                switch (alt296) {
+            	case 1 :
+            	    // InternalFormalML.g:14668:3: rule__ESUfid__Group_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_26);
+            	    rule__ESUfid__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop296;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getESUfidAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ESUfid__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ESUfid__Group_1__0"
+    // InternalFormalML.g:14677:1: rule__ESUfid__Group_1__0 : rule__ESUfid__Group_1__0__Impl rule__ESUfid__Group_1__1 ;
+    public final void rule__ESUfid__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14681:1: ( rule__ESUfid__Group_1__0__Impl rule__ESUfid__Group_1__1 )
+            // InternalFormalML.g:14682:2: rule__ESUfid__Group_1__0__Impl rule__ESUfid__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ESUfid__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ESUfid__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ESUfid__Group_1__0"
+
+
+    // $ANTLR start "rule__ESUfid__Group_1__0__Impl"
+    // InternalFormalML.g:14689:1: rule__ESUfid__Group_1__0__Impl : ( ( rule__ESUfid__Alternatives_1_0 ) ) ;
+    public final void rule__ESUfid__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14693:1: ( ( ( rule__ESUfid__Alternatives_1_0 ) ) )
+            // InternalFormalML.g:14694:1: ( ( rule__ESUfid__Alternatives_1_0 ) )
+            {
+            // InternalFormalML.g:14694:1: ( ( rule__ESUfid__Alternatives_1_0 ) )
+            // InternalFormalML.g:14695:2: ( rule__ESUfid__Alternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getESUfidAccess().getAlternatives_1_0()); 
+            }
+            // InternalFormalML.g:14696:2: ( rule__ESUfid__Alternatives_1_0 )
+            // InternalFormalML.g:14696:3: rule__ESUfid__Alternatives_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ESUfid__Alternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getESUfidAccess().getAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ESUfid__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ESUfid__Group_1__1"
+    // InternalFormalML.g:14704:1: rule__ESUfid__Group_1__1 : rule__ESUfid__Group_1__1__Impl ;
+    public final void rule__ESUfid__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14708:1: ( rule__ESUfid__Group_1__1__Impl )
+            // InternalFormalML.g:14709:2: rule__ESUfid__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ESUfid__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ESUfid__Group_1__1"
+
+
+    // $ANTLR start "rule__ESUfid__Group_1__1__Impl"
+    // InternalFormalML.g:14715:1: rule__ESUfid__Group_1__1__Impl : ( RULE_XLIA_ID ) ;
+    public final void rule__ESUfid__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14719:1: ( ( RULE_XLIA_ID ) )
+            // InternalFormalML.g:14720:1: ( RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:14720:1: ( RULE_XLIA_ID )
+            // InternalFormalML.g:14721:2: RULE_XLIA_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_1_1()); 
+            }
+            match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ESUfid__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group__0"
+    // InternalFormalML.g:14731:1: rule__System__Group__0 : rule__System__Group__0__Impl rule__System__Group__1 ;
+    public final void rule__System__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14735:1: ( rule__System__Group__0__Impl rule__System__Group__1 )
+            // InternalFormalML.g:14736:2: rule__System__Group__0__Impl rule__System__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_28);
+            rule__System__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__0"
+
+
+    // $ANTLR start "rule__System__Group__0__Impl"
+    // InternalFormalML.g:14743:1: rule__System__Group__0__Impl : ( ( rule__System__UnorderedGroup_0 ) ) ;
+    public final void rule__System__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14747:1: ( ( ( rule__System__UnorderedGroup_0 ) ) )
+            // InternalFormalML.g:14748:1: ( ( rule__System__UnorderedGroup_0 ) )
+            {
+            // InternalFormalML.g:14748:1: ( ( rule__System__UnorderedGroup_0 ) )
+            // InternalFormalML.g:14749:2: ( rule__System__UnorderedGroup_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getUnorderedGroup_0()); 
+            }
+            // InternalFormalML.g:14750:2: ( rule__System__UnorderedGroup_0 )
+            // InternalFormalML.g:14750:3: rule__System__UnorderedGroup_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__UnorderedGroup_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getUnorderedGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group__1"
+    // InternalFormalML.g:14758:1: rule__System__Group__1 : rule__System__Group__1__Impl rule__System__Group__2 ;
+    public final void rule__System__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14762:1: ( rule__System__Group__1__Impl rule__System__Group__2 )
+            // InternalFormalML.g:14763:2: rule__System__Group__1__Impl rule__System__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__System__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__1"
+
+
+    // $ANTLR start "rule__System__Group__1__Impl"
+    // InternalFormalML.g:14770:1: rule__System__Group__1__Impl : ( 'system' ) ;
+    public final void rule__System__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14774:1: ( ( 'system' ) )
+            // InternalFormalML.g:14775:1: ( 'system' )
+            {
+            // InternalFormalML.g:14775:1: ( 'system' )
+            // InternalFormalML.g:14776:2: 'system'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getSystemKeyword_1()); 
+            }
+            match(input,27,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getSystemKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group__2"
+    // InternalFormalML.g:14785:1: rule__System__Group__2 : rule__System__Group__2__Impl rule__System__Group__3 ;
+    public final void rule__System__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14789:1: ( rule__System__Group__2__Impl rule__System__Group__3 )
+            // InternalFormalML.g:14790:2: rule__System__Group__2__Impl rule__System__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__System__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__2"
+
+
+    // $ANTLR start "rule__System__Group__2__Impl"
+    // InternalFormalML.g:14797:1: rule__System__Group__2__Impl : ( ( rule__System__Group_2__0 )? ) ;
+    public final void rule__System__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14801:1: ( ( ( rule__System__Group_2__0 )? ) )
+            // InternalFormalML.g:14802:1: ( ( rule__System__Group_2__0 )? )
+            {
+            // InternalFormalML.g:14802:1: ( ( rule__System__Group_2__0 )? )
+            // InternalFormalML.g:14803:2: ( rule__System__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:14804:2: ( rule__System__Group_2__0 )?
+            int alt297=2;
+            int LA297_0 = input.LA(1);
+
+            if ( (LA297_0==125) ) {
+                alt297=1;
+            }
+            switch (alt297) {
+                case 1 :
+                    // InternalFormalML.g:14804:3: rule__System__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__2__Impl"
+
+
+    // $ANTLR start "rule__System__Group__3"
+    // InternalFormalML.g:14812:1: rule__System__Group__3 : rule__System__Group__3__Impl rule__System__Group__4 ;
+    public final void rule__System__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14816:1: ( rule__System__Group__3__Impl rule__System__Group__4 )
+            // InternalFormalML.g:14817:2: rule__System__Group__3__Impl rule__System__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__System__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__3"
+
+
+    // $ANTLR start "rule__System__Group__3__Impl"
+    // InternalFormalML.g:14824:1: rule__System__Group__3__Impl : ( ( rule__System__NameAssignment_3 ) ) ;
+    public final void rule__System__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14828:1: ( ( ( rule__System__NameAssignment_3 ) ) )
+            // InternalFormalML.g:14829:1: ( ( rule__System__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:14829:1: ( ( rule__System__NameAssignment_3 ) )
+            // InternalFormalML.g:14830:2: ( rule__System__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:14831:2: ( rule__System__NameAssignment_3 )
+            // InternalFormalML.g:14831:3: rule__System__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__3__Impl"
+
+
+    // $ANTLR start "rule__System__Group__4"
+    // InternalFormalML.g:14839:1: rule__System__Group__4 : rule__System__Group__4__Impl rule__System__Group__5 ;
+    public final void rule__System__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14843:1: ( rule__System__Group__4__Impl rule__System__Group__5 )
+            // InternalFormalML.g:14844:2: rule__System__Group__4__Impl rule__System__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__System__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__4"
+
+
+    // $ANTLR start "rule__System__Group__4__Impl"
+    // InternalFormalML.g:14851:1: rule__System__Group__4__Impl : ( ( rule__System__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__System__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14855:1: ( ( ( rule__System__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:14856:1: ( ( rule__System__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:14856:1: ( ( rule__System__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:14857:2: ( rule__System__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:14858:2: ( rule__System__UnrestrictedNameAssignment_4 )?
+            int alt298=2;
+            int LA298_0 = input.LA(1);
+
+            if ( (LA298_0==RULE_STRING) ) {
+                alt298=1;
+            }
+            switch (alt298) {
+                case 1 :
+                    // InternalFormalML.g:14858:3: rule__System__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__4__Impl"
+
+
+    // $ANTLR start "rule__System__Group__5"
+    // InternalFormalML.g:14866:1: rule__System__Group__5 : rule__System__Group__5__Impl rule__System__Group__6 ;
+    public final void rule__System__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14870:1: ( rule__System__Group__5__Impl rule__System__Group__6 )
+            // InternalFormalML.g:14871:2: rule__System__Group__5__Impl rule__System__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_31);
+            rule__System__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__5"
+
+
+    // $ANTLR start "rule__System__Group__5__Impl"
+    // InternalFormalML.g:14878:1: rule__System__Group__5__Impl : ( '{' ) ;
+    public final void rule__System__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14882:1: ( ( '{' ) )
+            // InternalFormalML.g:14883:1: ( '{' )
+            {
+            // InternalFormalML.g:14883:1: ( '{' )
+            // InternalFormalML.g:14884:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getLeftCurlyBracketKeyword_5()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getLeftCurlyBracketKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__5__Impl"
+
+
+    // $ANTLR start "rule__System__Group__6"
+    // InternalFormalML.g:14893:1: rule__System__Group__6 : rule__System__Group__6__Impl rule__System__Group__7 ;
+    public final void rule__System__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14897:1: ( rule__System__Group__6__Impl rule__System__Group__7 )
+            // InternalFormalML.g:14898:2: rule__System__Group__6__Impl rule__System__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_31);
+            rule__System__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__6"
+
+
+    // $ANTLR start "rule__System__Group__6__Impl"
+    // InternalFormalML.g:14905:1: rule__System__Group__6__Impl : ( ( rule__System__Alternatives_6 )* ) ;
+    public final void rule__System__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14909:1: ( ( ( rule__System__Alternatives_6 )* ) )
+            // InternalFormalML.g:14910:1: ( ( rule__System__Alternatives_6 )* )
+            {
+            // InternalFormalML.g:14910:1: ( ( rule__System__Alternatives_6 )* )
+            // InternalFormalML.g:14911:2: ( rule__System__Alternatives_6 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_6()); 
+            }
+            // InternalFormalML.g:14912:2: ( rule__System__Alternatives_6 )*
+            loop299:
+            do {
+                int alt299=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA299_2 = input.LA(2);
+
+                    if ( (LA299_2==224) ) {
+                        int LA299_6 = input.LA(3);
+
+                        if ( (LA299_6==RULE_XLIA_ID||(LA299_6>=15 && LA299_6<=18)||LA299_6==39||(LA299_6>=59 && LA299_6<=74)||(LA299_6>=129 && LA299_6<=132)||LA299_6==149||(LA299_6>=163 && LA299_6<=171)||(LA299_6>=231 && LA299_6<=237)||LA299_6==277||LA299_6==282) ) {
+                            alt299=1;
+                        }
+
+
+                    }
+                    else if ( ((LA299_2>=15 && LA299_2<=19)||LA299_2==28||(LA299_2>=143 && LA299_2<=145)||LA299_2==179||LA299_2==229||(LA299_2>=278 && LA299_2<=283)) ) {
+                        alt299=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA299_3 = input.LA(2);
+
+                    if ( ((LA299_3>=15 && LA299_3<=19)||LA299_3==28||(LA299_3>=143 && LA299_3<=145)||LA299_3==179||LA299_3==229||(LA299_3>=278 && LA299_3<=283)) ) {
+                        alt299=1;
+                    }
+                    else if ( (LA299_3==224) ) {
+                        int LA299_6 = input.LA(3);
+
+                        if ( (LA299_6==RULE_XLIA_ID||(LA299_6>=15 && LA299_6<=18)||LA299_6==39||(LA299_6>=59 && LA299_6<=74)||(LA299_6>=129 && LA299_6<=132)||LA299_6==149||(LA299_6>=163 && LA299_6<=171)||(LA299_6>=231 && LA299_6<=237)||LA299_6==277||LA299_6==282) ) {
+                            alt299=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA299_4 = input.LA(2);
+
+                    if ( ((LA299_4>=15 && LA299_4<=19)||LA299_4==28||(LA299_4>=143 && LA299_4<=145)||LA299_4==179||LA299_4==229||(LA299_4>=278 && LA299_4<=283)) ) {
+                        alt299=1;
+                    }
+                    else if ( (LA299_4==224) ) {
+                        int LA299_6 = input.LA(3);
+
+                        if ( (LA299_6==RULE_XLIA_ID||(LA299_6>=15 && LA299_6<=18)||LA299_6==39||(LA299_6>=59 && LA299_6<=74)||(LA299_6>=129 && LA299_6<=132)||LA299_6==149||(LA299_6>=163 && LA299_6<=171)||(LA299_6>=231 && LA299_6<=237)||LA299_6==277||LA299_6==282) ) {
+                            alt299=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA299_5 = input.LA(2);
+
+                    if ( ((LA299_5>=15 && LA299_5<=19)||LA299_5==28||(LA299_5>=143 && LA299_5<=145)||LA299_5==179||LA299_5==229||(LA299_5>=278 && LA299_5<=283)) ) {
+                        alt299=1;
+                    }
+                    else if ( (LA299_5==224) ) {
+                        int LA299_6 = input.LA(3);
+
+                        if ( (LA299_6==RULE_XLIA_ID||(LA299_6>=15 && LA299_6<=18)||LA299_6==39||(LA299_6>=59 && LA299_6<=74)||(LA299_6>=129 && LA299_6<=132)||LA299_6==149||(LA299_6>=163 && LA299_6<=171)||(LA299_6>=231 && LA299_6<=237)||LA299_6==277||LA299_6==282) ) {
+                            alt299=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA299_6 = input.LA(2);
+
+                    if ( (LA299_6==RULE_XLIA_ID||(LA299_6>=15 && LA299_6<=18)||LA299_6==39||(LA299_6>=59 && LA299_6<=74)||(LA299_6>=129 && LA299_6<=132)||LA299_6==149||(LA299_6>=163 && LA299_6<=171)||(LA299_6>=231 && LA299_6<=237)||LA299_6==277||LA299_6==282) ) {
+                        alt299=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 282:
+                case 283:
+                    {
+                    alt299=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt299) {
+            	case 1 :
+            	    // InternalFormalML.g:14912:3: rule__System__Alternatives_6
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__System__Alternatives_6();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop299;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__6__Impl"
+
+
+    // $ANTLR start "rule__System__Group__7"
+    // InternalFormalML.g:14920:1: rule__System__Group__7 : rule__System__Group__7__Impl rule__System__Group__8 ;
+    public final void rule__System__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14924:1: ( rule__System__Group__7__Impl rule__System__Group__8 )
+            // InternalFormalML.g:14925:2: rule__System__Group__7__Impl rule__System__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_31);
+            rule__System__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__7"
+
+
+    // $ANTLR start "rule__System__Group__7__Impl"
+    // InternalFormalML.g:14932:1: rule__System__Group__7__Impl : ( ( rule__System__Alternatives_7 )* ) ;
+    public final void rule__System__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14936:1: ( ( ( rule__System__Alternatives_7 )* ) )
+            // InternalFormalML.g:14937:1: ( ( rule__System__Alternatives_7 )* )
+            {
+            // InternalFormalML.g:14937:1: ( ( rule__System__Alternatives_7 )* )
+            // InternalFormalML.g:14938:2: ( rule__System__Alternatives_7 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_7()); 
+            }
+            // InternalFormalML.g:14939:2: ( rule__System__Alternatives_7 )*
+            loop300:
+            do {
+                int alt300=2;
+                int LA300_0 = input.LA(1);
+
+                if ( ((LA300_0>=202 && LA300_0<=205)) ) {
+                    alt300=1;
+                }
+
+
+                switch (alt300) {
+            	case 1 :
+            	    // InternalFormalML.g:14939:3: rule__System__Alternatives_7
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_32);
+            	    rule__System__Alternatives_7();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop300;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__7__Impl"
+
+
+    // $ANTLR start "rule__System__Group__8"
+    // InternalFormalML.g:14947:1: rule__System__Group__8 : rule__System__Group__8__Impl rule__System__Group__9 ;
+    public final void rule__System__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14951:1: ( rule__System__Group__8__Impl rule__System__Group__9 )
+            // InternalFormalML.g:14952:2: rule__System__Group__8__Impl rule__System__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__System__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__8"
+
+
+    // $ANTLR start "rule__System__Group__8__Impl"
+    // InternalFormalML.g:14959:1: rule__System__Group__8__Impl : ( ( rule__System__Alternatives_8 ) ) ;
+    public final void rule__System__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14963:1: ( ( ( rule__System__Alternatives_8 ) ) )
+            // InternalFormalML.g:14964:1: ( ( rule__System__Alternatives_8 ) )
+            {
+            // InternalFormalML.g:14964:1: ( ( rule__System__Alternatives_8 ) )
+            // InternalFormalML.g:14965:2: ( rule__System__Alternatives_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:14966:2: ( rule__System__Alternatives_8 )
+            // InternalFormalML.g:14966:3: rule__System__Alternatives_8
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Alternatives_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__8__Impl"
+
+
+    // $ANTLR start "rule__System__Group__9"
+    // InternalFormalML.g:14974:1: rule__System__Group__9 : rule__System__Group__9__Impl rule__System__Group__10 ;
+    public final void rule__System__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14978:1: ( rule__System__Group__9__Impl rule__System__Group__10 )
+            // InternalFormalML.g:14979:2: rule__System__Group__9__Impl rule__System__Group__10
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__System__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__9"
+
+
+    // $ANTLR start "rule__System__Group__9__Impl"
+    // InternalFormalML.g:14986:1: rule__System__Group__9__Impl : ( ( rule__System__Alternatives_9 )* ) ;
+    public final void rule__System__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:14990:1: ( ( ( rule__System__Alternatives_9 )* ) )
+            // InternalFormalML.g:14991:1: ( ( rule__System__Alternatives_9 )* )
+            {
+            // InternalFormalML.g:14991:1: ( ( rule__System__Alternatives_9 )* )
+            // InternalFormalML.g:14992:2: ( rule__System__Alternatives_9 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_9()); 
+            }
+            // InternalFormalML.g:14993:2: ( rule__System__Alternatives_9 )*
+            loop301:
+            do {
+                int alt301=2;
+                int LA301_0 = input.LA(1);
+
+                if ( ((LA301_0>=37 && LA301_0<=38)||(LA301_0>=207 && LA301_0<=209)) ) {
+                    alt301=1;
+                }
+
+
+                switch (alt301) {
+            	case 1 :
+            	    // InternalFormalML.g:14993:3: rule__System__Alternatives_9
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_34);
+            	    rule__System__Alternatives_9();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop301;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__9__Impl"
+
+
+    // $ANTLR start "rule__System__Group__10"
+    // InternalFormalML.g:15001:1: rule__System__Group__10 : rule__System__Group__10__Impl rule__System__Group__11 ;
+    public final void rule__System__Group__10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15005:1: ( rule__System__Group__10__Impl rule__System__Group__11 )
+            // InternalFormalML.g:15006:2: rule__System__Group__10__Impl rule__System__Group__11
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__System__Group__10__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__10"
+
+
+    // $ANTLR start "rule__System__Group__10__Impl"
+    // InternalFormalML.g:15013:1: rule__System__Group__10__Impl : ( ( rule__System__Alternatives_10 )* ) ;
+    public final void rule__System__Group__10__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15017:1: ( ( ( rule__System__Alternatives_10 )* ) )
+            // InternalFormalML.g:15018:1: ( ( rule__System__Alternatives_10 )* )
+            {
+            // InternalFormalML.g:15018:1: ( ( rule__System__Alternatives_10 )* )
+            // InternalFormalML.g:15019:2: ( rule__System__Alternatives_10 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_10()); 
+            }
+            // InternalFormalML.g:15020:2: ( rule__System__Alternatives_10 )*
+            loop302:
+            do {
+                int alt302=2;
+                int LA302_0 = input.LA(1);
+
+                if ( (LA302_0==42||LA302_0==210) ) {
+                    alt302=1;
+                }
+
+
+                switch (alt302) {
+            	case 1 :
+            	    // InternalFormalML.g:15020:3: rule__System__Alternatives_10
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_35);
+            	    rule__System__Alternatives_10();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop302;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_10()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__10__Impl"
+
+
+    // $ANTLR start "rule__System__Group__11"
+    // InternalFormalML.g:15028:1: rule__System__Group__11 : rule__System__Group__11__Impl rule__System__Group__12 ;
+    public final void rule__System__Group__11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15032:1: ( rule__System__Group__11__Impl rule__System__Group__12 )
+            // InternalFormalML.g:15033:2: rule__System__Group__11__Impl rule__System__Group__12
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__System__Group__11__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__12();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__11"
+
+
+    // $ANTLR start "rule__System__Group__11__Impl"
+    // InternalFormalML.g:15040:1: rule__System__Group__11__Impl : ( ( rule__System__MainAssignment_11 ) ) ;
+    public final void rule__System__Group__11__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15044:1: ( ( ( rule__System__MainAssignment_11 ) ) )
+            // InternalFormalML.g:15045:1: ( ( rule__System__MainAssignment_11 ) )
+            {
+            // InternalFormalML.g:15045:1: ( ( rule__System__MainAssignment_11 ) )
+            // InternalFormalML.g:15046:2: ( rule__System__MainAssignment_11 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getMainAssignment_11()); 
+            }
+            // InternalFormalML.g:15047:2: ( rule__System__MainAssignment_11 )
+            // InternalFormalML.g:15047:3: rule__System__MainAssignment_11
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__MainAssignment_11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getMainAssignment_11()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__11__Impl"
+
+
+    // $ANTLR start "rule__System__Group__12"
+    // InternalFormalML.g:15055:1: rule__System__Group__12 : rule__System__Group__12__Impl ;
+    public final void rule__System__Group__12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15059:1: ( rule__System__Group__12__Impl )
+            // InternalFormalML.g:15060:2: rule__System__Group__12__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group__12__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__12"
+
+
+    // $ANTLR start "rule__System__Group__12__Impl"
+    // InternalFormalML.g:15066:1: rule__System__Group__12__Impl : ( '}' ) ;
+    public final void rule__System__Group__12__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15070:1: ( ( '}' ) )
+            // InternalFormalML.g:15071:1: ( '}' )
+            {
+            // InternalFormalML.g:15071:1: ( '}' )
+            // InternalFormalML.g:15072:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getRightCurlyBracketKeyword_12()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getRightCurlyBracketKeyword_12()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group__12__Impl"
+
+
+    // $ANTLR start "rule__System__Group_2__0"
+    // InternalFormalML.g:15082:1: rule__System__Group_2__0 : rule__System__Group_2__0__Impl rule__System__Group_2__1 ;
+    public final void rule__System__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15086:1: ( rule__System__Group_2__0__Impl rule__System__Group_2__1 )
+            // InternalFormalML.g:15087:2: rule__System__Group_2__0__Impl rule__System__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__System__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_2__0"
+
+
+    // $ANTLR start "rule__System__Group_2__0__Impl"
+    // InternalFormalML.g:15094:1: rule__System__Group_2__0__Impl : ( '<' ) ;
+    public final void rule__System__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15098:1: ( ( '<' ) )
+            // InternalFormalML.g:15099:1: ( '<' )
+            {
+            // InternalFormalML.g:15099:1: ( '<' )
+            // InternalFormalML.g:15100:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getLessThanSignKeyword_2_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getLessThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_2__1"
+    // InternalFormalML.g:15109:1: rule__System__Group_2__1 : rule__System__Group_2__1__Impl rule__System__Group_2__2 ;
+    public final void rule__System__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15113:1: ( rule__System__Group_2__1__Impl rule__System__Group_2__2 )
+            // InternalFormalML.g:15114:2: rule__System__Group_2__1__Impl rule__System__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__System__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_2__1"
+
+
+    // $ANTLR start "rule__System__Group_2__1__Impl"
+    // InternalFormalML.g:15121:1: rule__System__Group_2__1__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__System__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15125:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:15126:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:15126:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:15127:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getMocKeyword_2_1()); 
+            }
+            // InternalFormalML.g:15128:2: ( 'moc:' )?
+            int alt303=2;
+            int LA303_0 = input.LA(1);
+
+            if ( (LA303_0==201) ) {
+                alt303=1;
+            }
+            switch (alt303) {
+                case 1 :
+                    // InternalFormalML.g:15128:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getMocKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_2__2"
+    // InternalFormalML.g:15136:1: rule__System__Group_2__2 : rule__System__Group_2__2__Impl rule__System__Group_2__3 ;
+    public final void rule__System__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15140:1: ( rule__System__Group_2__2__Impl rule__System__Group_2__3 )
+            // InternalFormalML.g:15141:2: rule__System__Group_2__2__Impl rule__System__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__System__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_2__2"
+
+
+    // $ANTLR start "rule__System__Group_2__2__Impl"
+    // InternalFormalML.g:15148:1: rule__System__Group_2__2__Impl : ( ( rule__System__Alternatives_2_2 ) ) ;
+    public final void rule__System__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15152:1: ( ( ( rule__System__Alternatives_2_2 ) ) )
+            // InternalFormalML.g:15153:1: ( ( rule__System__Alternatives_2_2 ) )
+            {
+            // InternalFormalML.g:15153:1: ( ( rule__System__Alternatives_2_2 ) )
+            // InternalFormalML.g:15154:2: ( rule__System__Alternatives_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_2_2()); 
+            }
+            // InternalFormalML.g:15155:2: ( rule__System__Alternatives_2_2 )
+            // InternalFormalML.g:15155:3: rule__System__Alternatives_2_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Alternatives_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__System__Group_2__3"
+    // InternalFormalML.g:15163:1: rule__System__Group_2__3 : rule__System__Group_2__3__Impl ;
+    public final void rule__System__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15167:1: ( rule__System__Group_2__3__Impl )
+            // InternalFormalML.g:15168:2: rule__System__Group_2__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_2__3"
+
+
+    // $ANTLR start "rule__System__Group_2__3__Impl"
+    // InternalFormalML.g:15174:1: rule__System__Group_2__3__Impl : ( '>' ) ;
+    public final void rule__System__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15178:1: ( ( '>' ) )
+            // InternalFormalML.g:15179:1: ( '>' )
+            {
+            // InternalFormalML.g:15179:1: ( '>' )
+            // InternalFormalML.g:15180:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getGreaterThanSignKeyword_2_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getGreaterThanSignKeyword_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__System__Group_7_0__0"
+    // InternalFormalML.g:15190:1: rule__System__Group_7_0__0 : rule__System__Group_7_0__0__Impl rule__System__Group_7_0__1 ;
+    public final void rule__System__Group_7_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15194:1: ( rule__System__Group_7_0__0__Impl rule__System__Group_7_0__1 )
+            // InternalFormalML.g:15195:2: rule__System__Group_7_0__0__Impl rule__System__Group_7_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__System__Group_7_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_7_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_0__0"
+
+
+    // $ANTLR start "rule__System__Group_7_0__0__Impl"
+    // InternalFormalML.g:15202:1: rule__System__Group_7_0__0__Impl : ( '@property:' ) ;
+    public final void rule__System__Group_7_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15206:1: ( ( '@property:' ) )
+            // InternalFormalML.g:15207:1: ( '@property:' )
+            {
+            // InternalFormalML.g:15207:1: ( '@property:' )
+            // InternalFormalML.g:15208:2: '@property:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()); 
+            }
+            match(input,202,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_0__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_7_0__1"
+    // InternalFormalML.g:15217:1: rule__System__Group_7_0__1 : rule__System__Group_7_0__1__Impl ;
+    public final void rule__System__Group_7_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15221:1: ( rule__System__Group_7_0__1__Impl )
+            // InternalFormalML.g:15222:2: rule__System__Group_7_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_7_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_0__1"
+
+
+    // $ANTLR start "rule__System__Group_7_0__1__Impl"
+    // InternalFormalML.g:15228:1: rule__System__Group_7_0__1__Impl : ( ( rule__System__Alternatives_7_0_1 )* ) ;
+    public final void rule__System__Group_7_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15232:1: ( ( ( rule__System__Alternatives_7_0_1 )* ) )
+            // InternalFormalML.g:15233:1: ( ( rule__System__Alternatives_7_0_1 )* )
+            {
+            // InternalFormalML.g:15233:1: ( ( rule__System__Alternatives_7_0_1 )* )
+            // InternalFormalML.g:15234:2: ( rule__System__Alternatives_7_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_7_0_1()); 
+            }
+            // InternalFormalML.g:15235:2: ( rule__System__Alternatives_7_0_1 )*
+            loop304:
+            do {
+                int alt304=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA304_2 = input.LA(2);
+
+                    if ( ((LA304_2>=15 && LA304_2<=19)||LA304_2==28||(LA304_2>=143 && LA304_2<=145)||LA304_2==179||LA304_2==229||(LA304_2>=278 && LA304_2<=283)) ) {
+                        alt304=1;
+                    }
+                    else if ( (LA304_2==224) ) {
+                        int LA304_6 = input.LA(3);
+
+                        if ( (LA304_6==RULE_XLIA_ID||(LA304_6>=15 && LA304_6<=18)||LA304_6==39||(LA304_6>=59 && LA304_6<=74)||(LA304_6>=129 && LA304_6<=132)||LA304_6==149||(LA304_6>=163 && LA304_6<=171)||(LA304_6>=231 && LA304_6<=237)||LA304_6==277||LA304_6==282) ) {
+                            alt304=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA304_3 = input.LA(2);
+
+                    if ( ((LA304_3>=15 && LA304_3<=19)||LA304_3==28||(LA304_3>=143 && LA304_3<=145)||LA304_3==179||LA304_3==229||(LA304_3>=278 && LA304_3<=283)) ) {
+                        alt304=1;
+                    }
+                    else if ( (LA304_3==224) ) {
+                        int LA304_6 = input.LA(3);
+
+                        if ( (LA304_6==RULE_XLIA_ID||(LA304_6>=15 && LA304_6<=18)||LA304_6==39||(LA304_6>=59 && LA304_6<=74)||(LA304_6>=129 && LA304_6<=132)||LA304_6==149||(LA304_6>=163 && LA304_6<=171)||(LA304_6>=231 && LA304_6<=237)||LA304_6==277||LA304_6==282) ) {
+                            alt304=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA304_4 = input.LA(2);
+
+                    if ( ((LA304_4>=15 && LA304_4<=19)||LA304_4==28||(LA304_4>=143 && LA304_4<=145)||LA304_4==179||LA304_4==229||(LA304_4>=278 && LA304_4<=283)) ) {
+                        alt304=1;
+                    }
+                    else if ( (LA304_4==224) ) {
+                        int LA304_6 = input.LA(3);
+
+                        if ( (LA304_6==RULE_XLIA_ID||(LA304_6>=15 && LA304_6<=18)||LA304_6==39||(LA304_6>=59 && LA304_6<=74)||(LA304_6>=129 && LA304_6<=132)||LA304_6==149||(LA304_6>=163 && LA304_6<=171)||(LA304_6>=231 && LA304_6<=237)||LA304_6==277||LA304_6==282) ) {
+                            alt304=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA304_5 = input.LA(2);
+
+                    if ( ((LA304_5>=15 && LA304_5<=19)||LA304_5==28||(LA304_5>=143 && LA304_5<=145)||LA304_5==179||LA304_5==229||(LA304_5>=278 && LA304_5<=283)) ) {
+                        alt304=1;
+                    }
+                    else if ( (LA304_5==224) ) {
+                        int LA304_6 = input.LA(3);
+
+                        if ( (LA304_6==RULE_XLIA_ID||(LA304_6>=15 && LA304_6<=18)||LA304_6==39||(LA304_6>=59 && LA304_6<=74)||(LA304_6>=129 && LA304_6<=132)||LA304_6==149||(LA304_6>=163 && LA304_6<=171)||(LA304_6>=231 && LA304_6<=237)||LA304_6==277||LA304_6==282) ) {
+                            alt304=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA304_6 = input.LA(2);
+
+                    if ( (LA304_6==RULE_XLIA_ID||(LA304_6>=15 && LA304_6<=18)||LA304_6==39||(LA304_6>=59 && LA304_6<=74)||(LA304_6>=129 && LA304_6<=132)||LA304_6==149||(LA304_6>=163 && LA304_6<=171)||(LA304_6>=231 && LA304_6<=237)||LA304_6==277||LA304_6==282) ) {
+                        alt304=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 282:
+                case 283:
+                    {
+                    alt304=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt304) {
+            	case 1 :
+            	    // InternalFormalML.g:15235:3: rule__System__Alternatives_7_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__System__Alternatives_7_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop304;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_7_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_0__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_7_1__0"
+    // InternalFormalML.g:15244:1: rule__System__Group_7_1__0 : rule__System__Group_7_1__0__Impl rule__System__Group_7_1__1 ;
+    public final void rule__System__Group_7_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15248:1: ( rule__System__Group_7_1__0__Impl rule__System__Group_7_1__1 )
+            // InternalFormalML.g:15249:2: rule__System__Group_7_1__0__Impl rule__System__Group_7_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__System__Group_7_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_7_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_1__0"
+
+
+    // $ANTLR start "rule__System__Group_7_1__0__Impl"
+    // InternalFormalML.g:15256:1: rule__System__Group_7_1__0__Impl : ( '@public:' ) ;
+    public final void rule__System__Group_7_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15260:1: ( ( '@public:' ) )
+            // InternalFormalML.g:15261:1: ( '@public:' )
+            {
+            // InternalFormalML.g:15261:1: ( '@public:' )
+            // InternalFormalML.g:15262:2: '@public:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPublicKeyword_7_1_0()); 
+            }
+            match(input,203,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPublicKeyword_7_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_1__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_7_1__1"
+    // InternalFormalML.g:15271:1: rule__System__Group_7_1__1 : rule__System__Group_7_1__1__Impl ;
+    public final void rule__System__Group_7_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15275:1: ( rule__System__Group_7_1__1__Impl )
+            // InternalFormalML.g:15276:2: rule__System__Group_7_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_7_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_1__1"
+
+
+    // $ANTLR start "rule__System__Group_7_1__1__Impl"
+    // InternalFormalML.g:15282:1: rule__System__Group_7_1__1__Impl : ( ( rule__System__Alternatives_7_1_1 )* ) ;
+    public final void rule__System__Group_7_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15286:1: ( ( ( rule__System__Alternatives_7_1_1 )* ) )
+            // InternalFormalML.g:15287:1: ( ( rule__System__Alternatives_7_1_1 )* )
+            {
+            // InternalFormalML.g:15287:1: ( ( rule__System__Alternatives_7_1_1 )* )
+            // InternalFormalML.g:15288:2: ( rule__System__Alternatives_7_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_7_1_1()); 
+            }
+            // InternalFormalML.g:15289:2: ( rule__System__Alternatives_7_1_1 )*
+            loop305:
+            do {
+                int alt305=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA305_2 = input.LA(2);
+
+                    if ( (LA305_2==229) ) {
+                        alt305=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA305_3 = input.LA(2);
+
+                    if ( (LA305_3==229) ) {
+                        alt305=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA305_4 = input.LA(2);
+
+                    if ( (LA305_4==229) ) {
+                        alt305=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA305_5 = input.LA(2);
+
+                    if ( (LA305_5==229) ) {
+                        alt305=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA305_6 = input.LA(2);
+
+                    if ( (LA305_6==16||LA305_6==179||LA305_6==224||LA305_6==283) ) {
+                        alt305=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt305=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt305) {
+            	case 1 :
+            	    // InternalFormalML.g:15289:3: rule__System__Alternatives_7_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__System__Alternatives_7_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop305;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_7_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_1__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_7_2__0"
+    // InternalFormalML.g:15298:1: rule__System__Group_7_2__0 : rule__System__Group_7_2__0__Impl rule__System__Group_7_2__1 ;
+    public final void rule__System__Group_7_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15302:1: ( rule__System__Group_7_2__0__Impl rule__System__Group_7_2__1 )
+            // InternalFormalML.g:15303:2: rule__System__Group_7_2__0__Impl rule__System__Group_7_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__System__Group_7_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_7_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_2__0"
+
+
+    // $ANTLR start "rule__System__Group_7_2__0__Impl"
+    // InternalFormalML.g:15310:1: rule__System__Group_7_2__0__Impl : ( '@protected:' ) ;
+    public final void rule__System__Group_7_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15314:1: ( ( '@protected:' ) )
+            // InternalFormalML.g:15315:1: ( '@protected:' )
+            {
+            // InternalFormalML.g:15315:1: ( '@protected:' )
+            // InternalFormalML.g:15316:2: '@protected:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()); 
+            }
+            match(input,204,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_2__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_7_2__1"
+    // InternalFormalML.g:15325:1: rule__System__Group_7_2__1 : rule__System__Group_7_2__1__Impl ;
+    public final void rule__System__Group_7_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15329:1: ( rule__System__Group_7_2__1__Impl )
+            // InternalFormalML.g:15330:2: rule__System__Group_7_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_7_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_2__1"
+
+
+    // $ANTLR start "rule__System__Group_7_2__1__Impl"
+    // InternalFormalML.g:15336:1: rule__System__Group_7_2__1__Impl : ( ( rule__System__Alternatives_7_2_1 )* ) ;
+    public final void rule__System__Group_7_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15340:1: ( ( ( rule__System__Alternatives_7_2_1 )* ) )
+            // InternalFormalML.g:15341:1: ( ( rule__System__Alternatives_7_2_1 )* )
+            {
+            // InternalFormalML.g:15341:1: ( ( rule__System__Alternatives_7_2_1 )* )
+            // InternalFormalML.g:15342:2: ( rule__System__Alternatives_7_2_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_7_2_1()); 
+            }
+            // InternalFormalML.g:15343:2: ( rule__System__Alternatives_7_2_1 )*
+            loop306:
+            do {
+                int alt306=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA306_2 = input.LA(2);
+
+                    if ( (LA306_2==229) ) {
+                        alt306=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA306_3 = input.LA(2);
+
+                    if ( (LA306_3==229) ) {
+                        alt306=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA306_4 = input.LA(2);
+
+                    if ( (LA306_4==229) ) {
+                        alt306=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA306_5 = input.LA(2);
+
+                    if ( (LA306_5==229) ) {
+                        alt306=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA306_6 = input.LA(2);
+
+                    if ( (LA306_6==16||LA306_6==179||LA306_6==224||LA306_6==283) ) {
+                        alt306=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt306=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt306) {
+            	case 1 :
+            	    // InternalFormalML.g:15343:3: rule__System__Alternatives_7_2_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__System__Alternatives_7_2_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop306;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_7_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_2__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_7_3__0"
+    // InternalFormalML.g:15352:1: rule__System__Group_7_3__0 : rule__System__Group_7_3__0__Impl rule__System__Group_7_3__1 ;
+    public final void rule__System__Group_7_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15356:1: ( rule__System__Group_7_3__0__Impl rule__System__Group_7_3__1 )
+            // InternalFormalML.g:15357:2: rule__System__Group_7_3__0__Impl rule__System__Group_7_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__System__Group_7_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_7_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_3__0"
+
+
+    // $ANTLR start "rule__System__Group_7_3__0__Impl"
+    // InternalFormalML.g:15364:1: rule__System__Group_7_3__0__Impl : ( '@private:' ) ;
+    public final void rule__System__Group_7_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15368:1: ( ( '@private:' ) )
+            // InternalFormalML.g:15369:1: ( '@private:' )
+            {
+            // InternalFormalML.g:15369:1: ( '@private:' )
+            // InternalFormalML.g:15370:2: '@private:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()); 
+            }
+            match(input,205,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_3__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_7_3__1"
+    // InternalFormalML.g:15379:1: rule__System__Group_7_3__1 : rule__System__Group_7_3__1__Impl ;
+    public final void rule__System__Group_7_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15383:1: ( rule__System__Group_7_3__1__Impl )
+            // InternalFormalML.g:15384:2: rule__System__Group_7_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_7_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_3__1"
+
+
+    // $ANTLR start "rule__System__Group_7_3__1__Impl"
+    // InternalFormalML.g:15390:1: rule__System__Group_7_3__1__Impl : ( ( rule__System__Alternatives_7_3_1 )* ) ;
+    public final void rule__System__Group_7_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15394:1: ( ( ( rule__System__Alternatives_7_3_1 )* ) )
+            // InternalFormalML.g:15395:1: ( ( rule__System__Alternatives_7_3_1 )* )
+            {
+            // InternalFormalML.g:15395:1: ( ( rule__System__Alternatives_7_3_1 )* )
+            // InternalFormalML.g:15396:2: ( rule__System__Alternatives_7_3_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_7_3_1()); 
+            }
+            // InternalFormalML.g:15397:2: ( rule__System__Alternatives_7_3_1 )*
+            loop307:
+            do {
+                int alt307=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA307_2 = input.LA(2);
+
+                    if ( (LA307_2==229) ) {
+                        alt307=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA307_3 = input.LA(2);
+
+                    if ( (LA307_3==229) ) {
+                        alt307=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA307_4 = input.LA(2);
+
+                    if ( (LA307_4==229) ) {
+                        alt307=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA307_5 = input.LA(2);
+
+                    if ( (LA307_5==229) ) {
+                        alt307=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA307_6 = input.LA(2);
+
+                    if ( (LA307_6==16||LA307_6==179||LA307_6==224||LA307_6==283) ) {
+                        alt307=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt307=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt307) {
+            	case 1 :
+            	    // InternalFormalML.g:15397:3: rule__System__Alternatives_7_3_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__System__Alternatives_7_3_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop307;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_7_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_7_3__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_8_0_0__0"
+    // InternalFormalML.g:15406:1: rule__System__Group_8_0_0__0 : rule__System__Group_8_0_0__0__Impl rule__System__Group_8_0_0__1 ;
+    public final void rule__System__Group_8_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15410:1: ( rule__System__Group_8_0_0__0__Impl rule__System__Group_8_0_0__1 )
+            // InternalFormalML.g:15411:2: rule__System__Group_8_0_0__0__Impl rule__System__Group_8_0_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_42);
+            rule__System__Group_8_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_8_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_8_0_0__0"
+
+
+    // $ANTLR start "rule__System__Group_8_0_0__0__Impl"
+    // InternalFormalML.g:15418:1: rule__System__Group_8_0_0__0__Impl : ( ( rule__System__Alternatives_8_0_0_0 ) ) ;
+    public final void rule__System__Group_8_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15422:1: ( ( ( rule__System__Alternatives_8_0_0_0 ) ) )
+            // InternalFormalML.g:15423:1: ( ( rule__System__Alternatives_8_0_0_0 ) )
+            {
+            // InternalFormalML.g:15423:1: ( ( rule__System__Alternatives_8_0_0_0 ) )
+            // InternalFormalML.g:15424:2: ( rule__System__Alternatives_8_0_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_8_0_0_0()); 
+            }
+            // InternalFormalML.g:15425:2: ( rule__System__Alternatives_8_0_0_0 )
+            // InternalFormalML.g:15425:3: rule__System__Alternatives_8_0_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Alternatives_8_0_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_8_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_8_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_8_0_0__1"
+    // InternalFormalML.g:15433:1: rule__System__Group_8_0_0__1 : rule__System__Group_8_0_0__1__Impl ;
+    public final void rule__System__Group_8_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15437:1: ( rule__System__Group_8_0_0__1__Impl )
+            // InternalFormalML.g:15438:2: rule__System__Group_8_0_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_8_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_8_0_0__1"
+
+
+    // $ANTLR start "rule__System__Group_8_0_0__1__Impl"
+    // InternalFormalML.g:15444:1: rule__System__Group_8_0_0__1__Impl : ( ( ( rule__System__RoutineAssignment_8_0_0_1 ) ) ( ( rule__System__RoutineAssignment_8_0_0_1 )* ) ) ;
+    public final void rule__System__Group_8_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15448:1: ( ( ( ( rule__System__RoutineAssignment_8_0_0_1 ) ) ( ( rule__System__RoutineAssignment_8_0_0_1 )* ) ) )
+            // InternalFormalML.g:15449:1: ( ( ( rule__System__RoutineAssignment_8_0_0_1 ) ) ( ( rule__System__RoutineAssignment_8_0_0_1 )* ) )
+            {
+            // InternalFormalML.g:15449:1: ( ( ( rule__System__RoutineAssignment_8_0_0_1 ) ) ( ( rule__System__RoutineAssignment_8_0_0_1 )* ) )
+            // InternalFormalML.g:15450:2: ( ( rule__System__RoutineAssignment_8_0_0_1 ) ) ( ( rule__System__RoutineAssignment_8_0_0_1 )* )
+            {
+            // InternalFormalML.g:15450:2: ( ( rule__System__RoutineAssignment_8_0_0_1 ) )
+            // InternalFormalML.g:15451:3: ( rule__System__RoutineAssignment_8_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getRoutineAssignment_8_0_0_1()); 
+            }
+            // InternalFormalML.g:15452:3: ( rule__System__RoutineAssignment_8_0_0_1 )
+            // InternalFormalML.g:15452:4: rule__System__RoutineAssignment_8_0_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_43);
+            rule__System__RoutineAssignment_8_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getRoutineAssignment_8_0_0_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:15455:2: ( ( rule__System__RoutineAssignment_8_0_0_1 )* )
+            // InternalFormalML.g:15456:3: ( rule__System__RoutineAssignment_8_0_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getRoutineAssignment_8_0_0_1()); 
+            }
+            // InternalFormalML.g:15457:3: ( rule__System__RoutineAssignment_8_0_0_1 )*
+            loop308:
+            do {
+                int alt308=2;
+                int LA308_0 = input.LA(1);
+
+                if ( (LA308_0==28||(LA308_0>=143 && LA308_0<=145)||(LA308_0>=224 && LA308_0<=225)) ) {
+                    alt308=1;
+                }
+
+
+                switch (alt308) {
+            	case 1 :
+            	    // InternalFormalML.g:15457:4: rule__System__RoutineAssignment_8_0_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_43);
+            	    rule__System__RoutineAssignment_8_0_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop308;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getRoutineAssignment_8_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_8_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_8_0_1__0"
+    // InternalFormalML.g:15467:1: rule__System__Group_8_0_1__0 : rule__System__Group_8_0_1__0__Impl rule__System__Group_8_0_1__1 ;
+    public final void rule__System__Group_8_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15471:1: ( rule__System__Group_8_0_1__0__Impl rule__System__Group_8_0_1__1 )
+            // InternalFormalML.g:15472:2: rule__System__Group_8_0_1__0__Impl rule__System__Group_8_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_44);
+            rule__System__Group_8_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_8_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_8_0_1__0"
+
+
+    // $ANTLR start "rule__System__Group_8_0_1__0__Impl"
+    // InternalFormalML.g:15479:1: rule__System__Group_8_0_1__0__Impl : ( '@procedure:' ) ;
+    public final void rule__System__Group_8_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15483:1: ( ( '@procedure:' ) )
+            // InternalFormalML.g:15484:1: ( '@procedure:' )
+            {
+            // InternalFormalML.g:15484:1: ( '@procedure:' )
+            // InternalFormalML.g:15485:2: '@procedure:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getProcedureKeyword_8_0_1_0()); 
+            }
+            match(input,206,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getProcedureKeyword_8_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_8_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_8_0_1__1"
+    // InternalFormalML.g:15494:1: rule__System__Group_8_0_1__1 : rule__System__Group_8_0_1__1__Impl ;
+    public final void rule__System__Group_8_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15498:1: ( rule__System__Group_8_0_1__1__Impl )
+            // InternalFormalML.g:15499:2: rule__System__Group_8_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_8_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_8_0_1__1"
+
+
+    // $ANTLR start "rule__System__Group_8_0_1__1__Impl"
+    // InternalFormalML.g:15505:1: rule__System__Group_8_0_1__1__Impl : ( ( ( rule__System__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__System__ProcedureAssignment_8_0_1_1 )* ) ) ;
+    public final void rule__System__Group_8_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15509:1: ( ( ( ( rule__System__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__System__ProcedureAssignment_8_0_1_1 )* ) ) )
+            // InternalFormalML.g:15510:1: ( ( ( rule__System__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__System__ProcedureAssignment_8_0_1_1 )* ) )
+            {
+            // InternalFormalML.g:15510:1: ( ( ( rule__System__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__System__ProcedureAssignment_8_0_1_1 )* ) )
+            // InternalFormalML.g:15511:2: ( ( rule__System__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__System__ProcedureAssignment_8_0_1_1 )* )
+            {
+            // InternalFormalML.g:15511:2: ( ( rule__System__ProcedureAssignment_8_0_1_1 ) )
+            // InternalFormalML.g:15512:3: ( rule__System__ProcedureAssignment_8_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getProcedureAssignment_8_0_1_1()); 
+            }
+            // InternalFormalML.g:15513:3: ( rule__System__ProcedureAssignment_8_0_1_1 )
+            // InternalFormalML.g:15513:4: rule__System__ProcedureAssignment_8_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__System__ProcedureAssignment_8_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getProcedureAssignment_8_0_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:15516:2: ( ( rule__System__ProcedureAssignment_8_0_1_1 )* )
+            // InternalFormalML.g:15517:3: ( rule__System__ProcedureAssignment_8_0_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getProcedureAssignment_8_0_1_1()); 
+            }
+            // InternalFormalML.g:15518:3: ( rule__System__ProcedureAssignment_8_0_1_1 )*
+            loop309:
+            do {
+                int alt309=2;
+                int LA309_0 = input.LA(1);
+
+                if ( (LA309_0==28||(LA309_0>=143 && LA309_0<=145)||LA309_0==214) ) {
+                    alt309=1;
+                }
+
+
+                switch (alt309) {
+            	case 1 :
+            	    // InternalFormalML.g:15518:4: rule__System__ProcedureAssignment_8_0_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_5);
+            	    rule__System__ProcedureAssignment_8_0_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop309;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getProcedureAssignment_8_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_8_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_9_0__0"
+    // InternalFormalML.g:15528:1: rule__System__Group_9_0__0 : rule__System__Group_9_0__0__Impl rule__System__Group_9_0__1 ;
+    public final void rule__System__Group_9_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15532:1: ( rule__System__Group_9_0__0__Impl rule__System__Group_9_0__1 )
+            // InternalFormalML.g:15533:2: rule__System__Group_9_0__0__Impl rule__System__Group_9_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_45);
+            rule__System__Group_9_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_9_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_0__0"
+
+
+    // $ANTLR start "rule__System__Group_9_0__0__Impl"
+    // InternalFormalML.g:15540:1: rule__System__Group_9_0__0__Impl : ( ( rule__System__Alternatives_9_0_0 ) ) ;
+    public final void rule__System__Group_9_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15544:1: ( ( ( rule__System__Alternatives_9_0_0 ) ) )
+            // InternalFormalML.g:15545:1: ( ( rule__System__Alternatives_9_0_0 ) )
+            {
+            // InternalFormalML.g:15545:1: ( ( rule__System__Alternatives_9_0_0 ) )
+            // InternalFormalML.g:15546:2: ( rule__System__Alternatives_9_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_9_0_0()); 
+            }
+            // InternalFormalML.g:15547:2: ( rule__System__Alternatives_9_0_0 )
+            // InternalFormalML.g:15547:3: rule__System__Alternatives_9_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Alternatives_9_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_9_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_0__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_9_0__1"
+    // InternalFormalML.g:15555:1: rule__System__Group_9_0__1 : rule__System__Group_9_0__1__Impl ;
+    public final void rule__System__Group_9_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15559:1: ( rule__System__Group_9_0__1__Impl )
+            // InternalFormalML.g:15560:2: rule__System__Group_9_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_9_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_0__1"
+
+
+    // $ANTLR start "rule__System__Group_9_0__1__Impl"
+    // InternalFormalML.g:15566:1: rule__System__Group_9_0__1__Impl : ( ( ( rule__System__Alternatives_9_0_1 ) ) ( ( rule__System__Alternatives_9_0_1 )* ) ) ;
+    public final void rule__System__Group_9_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15570:1: ( ( ( ( rule__System__Alternatives_9_0_1 ) ) ( ( rule__System__Alternatives_9_0_1 )* ) ) )
+            // InternalFormalML.g:15571:1: ( ( ( rule__System__Alternatives_9_0_1 ) ) ( ( rule__System__Alternatives_9_0_1 )* ) )
+            {
+            // InternalFormalML.g:15571:1: ( ( ( rule__System__Alternatives_9_0_1 ) ) ( ( rule__System__Alternatives_9_0_1 )* ) )
+            // InternalFormalML.g:15572:2: ( ( rule__System__Alternatives_9_0_1 ) ) ( ( rule__System__Alternatives_9_0_1 )* )
+            {
+            // InternalFormalML.g:15572:2: ( ( rule__System__Alternatives_9_0_1 ) )
+            // InternalFormalML.g:15573:3: ( rule__System__Alternatives_9_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_9_0_1()); 
+            }
+            // InternalFormalML.g:15574:3: ( rule__System__Alternatives_9_0_1 )
+            // InternalFormalML.g:15574:4: rule__System__Alternatives_9_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_46);
+            rule__System__Alternatives_9_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_9_0_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:15577:2: ( ( rule__System__Alternatives_9_0_1 )* )
+            // InternalFormalML.g:15578:3: ( rule__System__Alternatives_9_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getAlternatives_9_0_1()); 
+            }
+            // InternalFormalML.g:15579:3: ( rule__System__Alternatives_9_0_1 )*
+            loop310:
+            do {
+                int alt310=2;
+                int LA310_0 = input.LA(1);
+
+                if ( (LA310_0==28||(LA310_0>=39 && LA310_0<=40)||(LA310_0>=143 && LA310_0<=147)||LA310_0==211||(LA310_0>=273 && LA310_0<=274)) ) {
+                    alt310=1;
+                }
+
+
+                switch (alt310) {
+            	case 1 :
+            	    // InternalFormalML.g:15579:4: rule__System__Alternatives_9_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_46);
+            	    rule__System__Alternatives_9_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop310;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getAlternatives_9_0_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_0__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_9_1__0"
+    // InternalFormalML.g:15589:1: rule__System__Group_9_1__0 : rule__System__Group_9_1__0__Impl rule__System__Group_9_1__1 ;
+    public final void rule__System__Group_9_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15593:1: ( rule__System__Group_9_1__0__Impl rule__System__Group_9_1__1 )
+            // InternalFormalML.g:15594:2: rule__System__Group_9_1__0__Impl rule__System__Group_9_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__System__Group_9_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_9_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_1__0"
+
+
+    // $ANTLR start "rule__System__Group_9_1__0__Impl"
+    // InternalFormalML.g:15601:1: rule__System__Group_9_1__0__Impl : ( '@model:' ) ;
+    public final void rule__System__Group_9_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15605:1: ( ( '@model:' ) )
+            // InternalFormalML.g:15606:1: ( '@model:' )
+            {
+            // InternalFormalML.g:15606:1: ( '@model:' )
+            // InternalFormalML.g:15607:2: '@model:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getModelKeyword_9_1_0()); 
+            }
+            match(input,207,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getModelKeyword_9_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_1__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_9_1__1"
+    // InternalFormalML.g:15616:1: rule__System__Group_9_1__1 : rule__System__Group_9_1__1__Impl ;
+    public final void rule__System__Group_9_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15620:1: ( rule__System__Group_9_1__1__Impl )
+            // InternalFormalML.g:15621:2: rule__System__Group_9_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_9_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_1__1"
+
+
+    // $ANTLR start "rule__System__Group_9_1__1__Impl"
+    // InternalFormalML.g:15627:1: rule__System__Group_9_1__1__Impl : ( ( rule__System__MachineAssignment_9_1_1 )* ) ;
+    public final void rule__System__Group_9_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15631:1: ( ( ( rule__System__MachineAssignment_9_1_1 )* ) )
+            // InternalFormalML.g:15632:1: ( ( rule__System__MachineAssignment_9_1_1 )* )
+            {
+            // InternalFormalML.g:15632:1: ( ( rule__System__MachineAssignment_9_1_1 )* )
+            // InternalFormalML.g:15633:2: ( rule__System__MachineAssignment_9_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getMachineAssignment_9_1_1()); 
+            }
+            // InternalFormalML.g:15634:2: ( rule__System__MachineAssignment_9_1_1 )*
+            loop311:
+            do {
+                int alt311=2;
+                int LA311_0 = input.LA(1);
+
+                if ( (LA311_0==28||(LA311_0>=39 && LA311_0<=40)||(LA311_0>=143 && LA311_0<=147)||(LA311_0>=273 && LA311_0<=274)) ) {
+                    alt311=1;
+                }
+
+
+                switch (alt311) {
+            	case 1 :
+            	    // InternalFormalML.g:15634:3: rule__System__MachineAssignment_9_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_48);
+            	    rule__System__MachineAssignment_9_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop311;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getMachineAssignment_9_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_1__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_9_2__0"
+    // InternalFormalML.g:15643:1: rule__System__Group_9_2__0 : rule__System__Group_9_2__0__Impl rule__System__Group_9_2__1 ;
+    public final void rule__System__Group_9_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15647:1: ( rule__System__Group_9_2__0__Impl rule__System__Group_9_2__1 )
+            // InternalFormalML.g:15648:2: rule__System__Group_9_2__0__Impl rule__System__Group_9_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__System__Group_9_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_9_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_2__0"
+
+
+    // $ANTLR start "rule__System__Group_9_2__0__Impl"
+    // InternalFormalML.g:15655:1: rule__System__Group_9_2__0__Impl : ( '@prototype:' ) ;
+    public final void rule__System__Group_9_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15659:1: ( ( '@prototype:' ) )
+            // InternalFormalML.g:15660:1: ( '@prototype:' )
+            {
+            // InternalFormalML.g:15660:1: ( '@prototype:' )
+            // InternalFormalML.g:15661:2: '@prototype:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0()); 
+            }
+            match(input,208,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_2__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_9_2__1"
+    // InternalFormalML.g:15670:1: rule__System__Group_9_2__1 : rule__System__Group_9_2__1__Impl ;
+    public final void rule__System__Group_9_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15674:1: ( rule__System__Group_9_2__1__Impl )
+            // InternalFormalML.g:15675:2: rule__System__Group_9_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_9_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_2__1"
+
+
+    // $ANTLR start "rule__System__Group_9_2__1__Impl"
+    // InternalFormalML.g:15681:1: rule__System__Group_9_2__1__Impl : ( ( rule__System__MachineAssignment_9_2_1 )* ) ;
+    public final void rule__System__Group_9_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15685:1: ( ( ( rule__System__MachineAssignment_9_2_1 )* ) )
+            // InternalFormalML.g:15686:1: ( ( rule__System__MachineAssignment_9_2_1 )* )
+            {
+            // InternalFormalML.g:15686:1: ( ( rule__System__MachineAssignment_9_2_1 )* )
+            // InternalFormalML.g:15687:2: ( rule__System__MachineAssignment_9_2_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getMachineAssignment_9_2_1()); 
+            }
+            // InternalFormalML.g:15688:2: ( rule__System__MachineAssignment_9_2_1 )*
+            loop312:
+            do {
+                int alt312=2;
+                int LA312_0 = input.LA(1);
+
+                if ( (LA312_0==28||(LA312_0>=39 && LA312_0<=40)||(LA312_0>=143 && LA312_0<=147)||(LA312_0>=273 && LA312_0<=274)) ) {
+                    alt312=1;
+                }
+
+
+                switch (alt312) {
+            	case 1 :
+            	    // InternalFormalML.g:15688:3: rule__System__MachineAssignment_9_2_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_48);
+            	    rule__System__MachineAssignment_9_2_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop312;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getMachineAssignment_9_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_2__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_9_3__0"
+    // InternalFormalML.g:15697:1: rule__System__Group_9_3__0 : rule__System__Group_9_3__0__Impl rule__System__Group_9_3__1 ;
+    public final void rule__System__Group_9_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15701:1: ( rule__System__Group_9_3__0__Impl rule__System__Group_9_3__1 )
+            // InternalFormalML.g:15702:2: rule__System__Group_9_3__0__Impl rule__System__Group_9_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_45);
+            rule__System__Group_9_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_9_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_3__0"
+
+
+    // $ANTLR start "rule__System__Group_9_3__0__Impl"
+    // InternalFormalML.g:15709:1: rule__System__Group_9_3__0__Impl : ( '@instance:' ) ;
+    public final void rule__System__Group_9_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15713:1: ( ( '@instance:' ) )
+            // InternalFormalML.g:15714:1: ( '@instance:' )
+            {
+            // InternalFormalML.g:15714:1: ( '@instance:' )
+            // InternalFormalML.g:15715:2: '@instance:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()); 
+            }
+            match(input,209,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_3__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_9_3__1"
+    // InternalFormalML.g:15724:1: rule__System__Group_9_3__1 : rule__System__Group_9_3__1__Impl ;
+    public final void rule__System__Group_9_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15728:1: ( rule__System__Group_9_3__1__Impl )
+            // InternalFormalML.g:15729:2: rule__System__Group_9_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_9_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_3__1"
+
+
+    // $ANTLR start "rule__System__Group_9_3__1__Impl"
+    // InternalFormalML.g:15735:1: rule__System__Group_9_3__1__Impl : ( ( rule__System__InstanceAssignment_9_3_1 )* ) ;
+    public final void rule__System__Group_9_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15739:1: ( ( ( rule__System__InstanceAssignment_9_3_1 )* ) )
+            // InternalFormalML.g:15740:1: ( ( rule__System__InstanceAssignment_9_3_1 )* )
+            {
+            // InternalFormalML.g:15740:1: ( ( rule__System__InstanceAssignment_9_3_1 )* )
+            // InternalFormalML.g:15741:2: ( rule__System__InstanceAssignment_9_3_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getInstanceAssignment_9_3_1()); 
+            }
+            // InternalFormalML.g:15742:2: ( rule__System__InstanceAssignment_9_3_1 )*
+            loop313:
+            do {
+                int alt313=2;
+                int LA313_0 = input.LA(1);
+
+                if ( (LA313_0==211) ) {
+                    alt313=1;
+                }
+
+
+                switch (alt313) {
+            	case 1 :
+            	    // InternalFormalML.g:15742:3: rule__System__InstanceAssignment_9_3_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_46);
+            	    rule__System__InstanceAssignment_9_3_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop313;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getInstanceAssignment_9_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_9_3__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_10_0__0"
+    // InternalFormalML.g:15751:1: rule__System__Group_10_0__0 : rule__System__Group_10_0__0__Impl rule__System__Group_10_0__1 ;
+    public final void rule__System__Group_10_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15755:1: ( rule__System__Group_10_0__0__Impl rule__System__Group_10_0__1 )
+            // InternalFormalML.g:15756:2: rule__System__Group_10_0__0__Impl rule__System__Group_10_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__System__Group_10_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_10_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_10_0__0"
+
+
+    // $ANTLR start "rule__System__Group_10_0__0__Impl"
+    // InternalFormalML.g:15763:1: rule__System__Group_10_0__0__Impl : ( '@behavior:' ) ;
+    public final void rule__System__Group_10_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15767:1: ( ( '@behavior:' ) )
+            // InternalFormalML.g:15768:1: ( '@behavior:' )
+            {
+            // InternalFormalML.g:15768:1: ( '@behavior:' )
+            // InternalFormalML.g:15769:2: '@behavior:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBehaviorKeyword_10_0_0()); 
+            }
+            match(input,210,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBehaviorKeyword_10_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_10_0__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_10_0__1"
+    // InternalFormalML.g:15778:1: rule__System__Group_10_0__1 : rule__System__Group_10_0__1__Impl ;
+    public final void rule__System__Group_10_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15782:1: ( rule__System__Group_10_0__1__Impl )
+            // InternalFormalML.g:15783:2: rule__System__Group_10_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_10_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_10_0__1"
+
+
+    // $ANTLR start "rule__System__Group_10_0__1__Impl"
+    // InternalFormalML.g:15789:1: rule__System__Group_10_0__1__Impl : ( ( ( rule__System__BehaviorAssignment_10_0_1 ) ) ( ( rule__System__BehaviorAssignment_10_0_1 )* ) ) ;
+    public final void rule__System__Group_10_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15793:1: ( ( ( ( rule__System__BehaviorAssignment_10_0_1 ) ) ( ( rule__System__BehaviorAssignment_10_0_1 )* ) ) )
+            // InternalFormalML.g:15794:1: ( ( ( rule__System__BehaviorAssignment_10_0_1 ) ) ( ( rule__System__BehaviorAssignment_10_0_1 )* ) )
+            {
+            // InternalFormalML.g:15794:1: ( ( ( rule__System__BehaviorAssignment_10_0_1 ) ) ( ( rule__System__BehaviorAssignment_10_0_1 )* ) )
+            // InternalFormalML.g:15795:2: ( ( rule__System__BehaviorAssignment_10_0_1 ) ) ( ( rule__System__BehaviorAssignment_10_0_1 )* )
+            {
+            // InternalFormalML.g:15795:2: ( ( rule__System__BehaviorAssignment_10_0_1 ) )
+            // InternalFormalML.g:15796:3: ( rule__System__BehaviorAssignment_10_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBehaviorAssignment_10_0_1()); 
+            }
+            // InternalFormalML.g:15797:3: ( rule__System__BehaviorAssignment_10_0_1 )
+            // InternalFormalML.g:15797:4: rule__System__BehaviorAssignment_10_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_48);
+            rule__System__BehaviorAssignment_10_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBehaviorAssignment_10_0_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:15800:2: ( ( rule__System__BehaviorAssignment_10_0_1 )* )
+            // InternalFormalML.g:15801:3: ( rule__System__BehaviorAssignment_10_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBehaviorAssignment_10_0_1()); 
+            }
+            // InternalFormalML.g:15802:3: ( rule__System__BehaviorAssignment_10_0_1 )*
+            loop314:
+            do {
+                int alt314=2;
+                int LA314_0 = input.LA(1);
+
+                if ( (LA314_0==28||LA314_0==40||(LA314_0>=143 && LA314_0<=147)||(LA314_0>=273 && LA314_0<=274)) ) {
+                    alt314=1;
+                }
+
+
+                switch (alt314) {
+            	case 1 :
+            	    // InternalFormalML.g:15802:4: rule__System__BehaviorAssignment_10_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_48);
+            	    rule__System__BehaviorAssignment_10_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop314;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBehaviorAssignment_10_0_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_10_0__1__Impl"
+
+
+    // $ANTLR start "rule__System__Group_10_1__0"
+    // InternalFormalML.g:15812:1: rule__System__Group_10_1__0 : rule__System__Group_10_1__0__Impl rule__System__Group_10_1__1 ;
+    public final void rule__System__Group_10_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15816:1: ( rule__System__Group_10_1__0__Impl rule__System__Group_10_1__1 )
+            // InternalFormalML.g:15817:2: rule__System__Group_10_1__0__Impl rule__System__Group_10_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__System__Group_10_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_10_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_10_1__0"
+
+
+    // $ANTLR start "rule__System__Group_10_1__0__Impl"
+    // InternalFormalML.g:15824:1: rule__System__Group_10_1__0__Impl : ( '@statemachine:' ) ;
+    public final void rule__System__Group_10_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15828:1: ( ( '@statemachine:' ) )
+            // InternalFormalML.g:15829:1: ( '@statemachine:' )
+            {
+            // InternalFormalML.g:15829:1: ( '@statemachine:' )
+            // InternalFormalML.g:15830:2: '@statemachine:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getStatemachineKeyword_10_1_0()); 
+            }
+            match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getStatemachineKeyword_10_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_10_1__0__Impl"
+
+
+    // $ANTLR start "rule__System__Group_10_1__1"
+    // InternalFormalML.g:15839:1: rule__System__Group_10_1__1 : rule__System__Group_10_1__1__Impl ;
+    public final void rule__System__Group_10_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15843:1: ( rule__System__Group_10_1__1__Impl )
+            // InternalFormalML.g:15844:2: rule__System__Group_10_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__Group_10_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_10_1__1"
+
+
+    // $ANTLR start "rule__System__Group_10_1__1__Impl"
+    // InternalFormalML.g:15850:1: rule__System__Group_10_1__1__Impl : ( ( ( rule__System__BehaviorAssignment_10_1_1 ) ) ( ( rule__System__BehaviorAssignment_10_1_1 )* ) ) ;
+    public final void rule__System__Group_10_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15854:1: ( ( ( ( rule__System__BehaviorAssignment_10_1_1 ) ) ( ( rule__System__BehaviorAssignment_10_1_1 )* ) ) )
+            // InternalFormalML.g:15855:1: ( ( ( rule__System__BehaviorAssignment_10_1_1 ) ) ( ( rule__System__BehaviorAssignment_10_1_1 )* ) )
+            {
+            // InternalFormalML.g:15855:1: ( ( ( rule__System__BehaviorAssignment_10_1_1 ) ) ( ( rule__System__BehaviorAssignment_10_1_1 )* ) )
+            // InternalFormalML.g:15856:2: ( ( rule__System__BehaviorAssignment_10_1_1 ) ) ( ( rule__System__BehaviorAssignment_10_1_1 )* )
+            {
+            // InternalFormalML.g:15856:2: ( ( rule__System__BehaviorAssignment_10_1_1 ) )
+            // InternalFormalML.g:15857:3: ( rule__System__BehaviorAssignment_10_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBehaviorAssignment_10_1_1()); 
+            }
+            // InternalFormalML.g:15858:3: ( rule__System__BehaviorAssignment_10_1_1 )
+            // InternalFormalML.g:15858:4: rule__System__BehaviorAssignment_10_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_48);
+            rule__System__BehaviorAssignment_10_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBehaviorAssignment_10_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:15861:2: ( ( rule__System__BehaviorAssignment_10_1_1 )* )
+            // InternalFormalML.g:15862:3: ( rule__System__BehaviorAssignment_10_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBehaviorAssignment_10_1_1()); 
+            }
+            // InternalFormalML.g:15863:3: ( rule__System__BehaviorAssignment_10_1_1 )*
+            loop315:
+            do {
+                int alt315=2;
+                int LA315_0 = input.LA(1);
+
+                if ( (LA315_0==28||LA315_0==40||(LA315_0>=143 && LA315_0<=147)||(LA315_0>=273 && LA315_0<=274)) ) {
+                    alt315=1;
+                }
+
+
+                switch (alt315) {
+            	case 1 :
+            	    // InternalFormalML.g:15863:4: rule__System__BehaviorAssignment_10_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_48);
+            	    rule__System__BehaviorAssignment_10_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop315;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBehaviorAssignment_10_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Group_10_1__1__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__0"
+    // InternalFormalML.g:15873:1: rule__InstanceMachine__Group__0 : rule__InstanceMachine__Group__0__Impl rule__InstanceMachine__Group__1 ;
+    public final void rule__InstanceMachine__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15877:1: ( rule__InstanceMachine__Group__0__Impl rule__InstanceMachine__Group__1 )
+            // InternalFormalML.g:15878:2: rule__InstanceMachine__Group__0__Impl rule__InstanceMachine__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_49);
+            rule__InstanceMachine__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__0"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__0__Impl"
+    // InternalFormalML.g:15885:1: rule__InstanceMachine__Group__0__Impl : ( 'instance' ) ;
+    public final void rule__InstanceMachine__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15889:1: ( ( 'instance' ) )
+            // InternalFormalML.g:15890:1: ( 'instance' )
+            {
+            // InternalFormalML.g:15890:1: ( 'instance' )
+            // InternalFormalML.g:15891:2: 'instance'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getInstanceKeyword_0()); 
+            }
+            match(input,211,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getInstanceKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__0__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__1"
+    // InternalFormalML.g:15900:1: rule__InstanceMachine__Group__1 : rule__InstanceMachine__Group__1__Impl rule__InstanceMachine__Group__2 ;
+    public final void rule__InstanceMachine__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15904:1: ( rule__InstanceMachine__Group__1__Impl rule__InstanceMachine__Group__2 )
+            // InternalFormalML.g:15905:2: rule__InstanceMachine__Group__1__Impl rule__InstanceMachine__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_49);
+            rule__InstanceMachine__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__1"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__1__Impl"
+    // InternalFormalML.g:15912:1: rule__InstanceMachine__Group__1__Impl : ( ( rule__InstanceMachine__Alternatives_1 )? ) ;
+    public final void rule__InstanceMachine__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15916:1: ( ( ( rule__InstanceMachine__Alternatives_1 )? ) )
+            // InternalFormalML.g:15917:1: ( ( rule__InstanceMachine__Alternatives_1 )? )
+            {
+            // InternalFormalML.g:15917:1: ( ( rule__InstanceMachine__Alternatives_1 )? )
+            // InternalFormalML.g:15918:2: ( rule__InstanceMachine__Alternatives_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:15919:2: ( rule__InstanceMachine__Alternatives_1 )?
+            int alt316=2;
+            int LA316_0 = input.LA(1);
+
+            if ( ((LA316_0>=39 && LA316_0<=40)) ) {
+                alt316=1;
+            }
+            switch (alt316) {
+                case 1 :
+                    // InternalFormalML.g:15919:3: rule__InstanceMachine__Alternatives_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InstanceMachine__Alternatives_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__1__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__2"
+    // InternalFormalML.g:15927:1: rule__InstanceMachine__Group__2 : rule__InstanceMachine__Group__2__Impl rule__InstanceMachine__Group__3 ;
+    public final void rule__InstanceMachine__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15931:1: ( rule__InstanceMachine__Group__2__Impl rule__InstanceMachine__Group__3 )
+            // InternalFormalML.g:15932:2: rule__InstanceMachine__Group__2__Impl rule__InstanceMachine__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__InstanceMachine__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__2"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__2__Impl"
+    // InternalFormalML.g:15939:1: rule__InstanceMachine__Group__2__Impl : ( '<' ) ;
+    public final void rule__InstanceMachine__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15943:1: ( ( '<' ) )
+            // InternalFormalML.g:15944:1: ( '<' )
+            {
+            // InternalFormalML.g:15944:1: ( '<' )
+            // InternalFormalML.g:15945:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getLessThanSignKeyword_2()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getLessThanSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__2__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__3"
+    // InternalFormalML.g:15954:1: rule__InstanceMachine__Group__3 : rule__InstanceMachine__Group__3__Impl rule__InstanceMachine__Group__4 ;
+    public final void rule__InstanceMachine__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15958:1: ( rule__InstanceMachine__Group__3__Impl rule__InstanceMachine__Group__4 )
+            // InternalFormalML.g:15959:2: rule__InstanceMachine__Group__3__Impl rule__InstanceMachine__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__InstanceMachine__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__3"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__3__Impl"
+    // InternalFormalML.g:15966:1: rule__InstanceMachine__Group__3__Impl : ( ( 'model:' )? ) ;
+    public final void rule__InstanceMachine__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15970:1: ( ( ( 'model:' )? ) )
+            // InternalFormalML.g:15971:1: ( ( 'model:' )? )
+            {
+            // InternalFormalML.g:15971:1: ( ( 'model:' )? )
+            // InternalFormalML.g:15972:2: ( 'model:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getModelKeyword_3()); 
+            }
+            // InternalFormalML.g:15973:2: ( 'model:' )?
+            int alt317=2;
+            int LA317_0 = input.LA(1);
+
+            if ( (LA317_0==212) ) {
+                alt317=1;
+            }
+            switch (alt317) {
+                case 1 :
+                    // InternalFormalML.g:15973:3: 'model:'
+                    {
+                    match(input,212,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getModelKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__3__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__4"
+    // InternalFormalML.g:15981:1: rule__InstanceMachine__Group__4 : rule__InstanceMachine__Group__4__Impl rule__InstanceMachine__Group__5 ;
+    public final void rule__InstanceMachine__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15985:1: ( rule__InstanceMachine__Group__4__Impl rule__InstanceMachine__Group__5 )
+            // InternalFormalML.g:15986:2: rule__InstanceMachine__Group__4__Impl rule__InstanceMachine__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__InstanceMachine__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__4"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__4__Impl"
+    // InternalFormalML.g:15993:1: rule__InstanceMachine__Group__4__Impl : ( ( rule__InstanceMachine__ModelAssignment_4 ) ) ;
+    public final void rule__InstanceMachine__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:15997:1: ( ( ( rule__InstanceMachine__ModelAssignment_4 ) ) )
+            // InternalFormalML.g:15998:1: ( ( rule__InstanceMachine__ModelAssignment_4 ) )
+            {
+            // InternalFormalML.g:15998:1: ( ( rule__InstanceMachine__ModelAssignment_4 ) )
+            // InternalFormalML.g:15999:2: ( rule__InstanceMachine__ModelAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getModelAssignment_4()); 
+            }
+            // InternalFormalML.g:16000:2: ( rule__InstanceMachine__ModelAssignment_4 )
+            // InternalFormalML.g:16000:3: rule__InstanceMachine__ModelAssignment_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__ModelAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getModelAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__4__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__5"
+    // InternalFormalML.g:16008:1: rule__InstanceMachine__Group__5 : rule__InstanceMachine__Group__5__Impl rule__InstanceMachine__Group__6 ;
+    public final void rule__InstanceMachine__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16012:1: ( rule__InstanceMachine__Group__5__Impl rule__InstanceMachine__Group__6 )
+            // InternalFormalML.g:16013:2: rule__InstanceMachine__Group__5__Impl rule__InstanceMachine__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__InstanceMachine__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__5"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__5__Impl"
+    // InternalFormalML.g:16020:1: rule__InstanceMachine__Group__5__Impl : ( '>' ) ;
+    public final void rule__InstanceMachine__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16024:1: ( ( '>' ) )
+            // InternalFormalML.g:16025:1: ( '>' )
+            {
+            // InternalFormalML.g:16025:1: ( '>' )
+            // InternalFormalML.g:16026:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getGreaterThanSignKeyword_5()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getGreaterThanSignKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__5__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__6"
+    // InternalFormalML.g:16035:1: rule__InstanceMachine__Group__6 : rule__InstanceMachine__Group__6__Impl rule__InstanceMachine__Group__7 ;
+    public final void rule__InstanceMachine__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16039:1: ( rule__InstanceMachine__Group__6__Impl rule__InstanceMachine__Group__7 )
+            // InternalFormalML.g:16040:2: rule__InstanceMachine__Group__6__Impl rule__InstanceMachine__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_51);
+            rule__InstanceMachine__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__6"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__6__Impl"
+    // InternalFormalML.g:16047:1: rule__InstanceMachine__Group__6__Impl : ( ( rule__InstanceMachine__NameAssignment_6 ) ) ;
+    public final void rule__InstanceMachine__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16051:1: ( ( ( rule__InstanceMachine__NameAssignment_6 ) ) )
+            // InternalFormalML.g:16052:1: ( ( rule__InstanceMachine__NameAssignment_6 ) )
+            {
+            // InternalFormalML.g:16052:1: ( ( rule__InstanceMachine__NameAssignment_6 ) )
+            // InternalFormalML.g:16053:2: ( rule__InstanceMachine__NameAssignment_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getNameAssignment_6()); 
+            }
+            // InternalFormalML.g:16054:2: ( rule__InstanceMachine__NameAssignment_6 )
+            // InternalFormalML.g:16054:3: rule__InstanceMachine__NameAssignment_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__NameAssignment_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getNameAssignment_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__6__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__7"
+    // InternalFormalML.g:16062:1: rule__InstanceMachine__Group__7 : rule__InstanceMachine__Group__7__Impl rule__InstanceMachine__Group__8 ;
+    public final void rule__InstanceMachine__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16066:1: ( rule__InstanceMachine__Group__7__Impl rule__InstanceMachine__Group__8 )
+            // InternalFormalML.g:16067:2: rule__InstanceMachine__Group__7__Impl rule__InstanceMachine__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_51);
+            rule__InstanceMachine__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__7"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__7__Impl"
+    // InternalFormalML.g:16074:1: rule__InstanceMachine__Group__7__Impl : ( ( rule__InstanceMachine__UnrestrictedNameAssignment_7 )? ) ;
+    public final void rule__InstanceMachine__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16078:1: ( ( ( rule__InstanceMachine__UnrestrictedNameAssignment_7 )? ) )
+            // InternalFormalML.g:16079:1: ( ( rule__InstanceMachine__UnrestrictedNameAssignment_7 )? )
+            {
+            // InternalFormalML.g:16079:1: ( ( rule__InstanceMachine__UnrestrictedNameAssignment_7 )? )
+            // InternalFormalML.g:16080:2: ( rule__InstanceMachine__UnrestrictedNameAssignment_7 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameAssignment_7()); 
+            }
+            // InternalFormalML.g:16081:2: ( rule__InstanceMachine__UnrestrictedNameAssignment_7 )?
+            int alt318=2;
+            int LA318_0 = input.LA(1);
+
+            if ( (LA318_0==RULE_STRING) ) {
+                alt318=1;
+            }
+            switch (alt318) {
+                case 1 :
+                    // InternalFormalML.g:16081:3: rule__InstanceMachine__UnrestrictedNameAssignment_7
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InstanceMachine__UnrestrictedNameAssignment_7();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__7__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__8"
+    // InternalFormalML.g:16089:1: rule__InstanceMachine__Group__8 : rule__InstanceMachine__Group__8__Impl ;
+    public final void rule__InstanceMachine__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16093:1: ( rule__InstanceMachine__Group__8__Impl )
+            // InternalFormalML.g:16094:2: rule__InstanceMachine__Group__8__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__8"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group__8__Impl"
+    // InternalFormalML.g:16100:1: rule__InstanceMachine__Group__8__Impl : ( ( rule__InstanceMachine__Alternatives_8 ) ) ;
+    public final void rule__InstanceMachine__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16104:1: ( ( ( rule__InstanceMachine__Alternatives_8 ) ) )
+            // InternalFormalML.g:16105:1: ( ( rule__InstanceMachine__Alternatives_8 ) )
+            {
+            // InternalFormalML.g:16105:1: ( ( rule__InstanceMachine__Alternatives_8 ) )
+            // InternalFormalML.g:16106:2: ( rule__InstanceMachine__Alternatives_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:16107:2: ( rule__InstanceMachine__Alternatives_8 )
+            // InternalFormalML.g:16107:3: rule__InstanceMachine__Alternatives_8
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Alternatives_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group__8__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0__0"
+    // InternalFormalML.g:16116:1: rule__InstanceMachine__Group_8_0__0 : rule__InstanceMachine__Group_8_0__0__Impl rule__InstanceMachine__Group_8_0__1 ;
+    public final void rule__InstanceMachine__Group_8_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16120:1: ( rule__InstanceMachine__Group_8_0__0__Impl rule__InstanceMachine__Group_8_0__1 )
+            // InternalFormalML.g:16121:2: rule__InstanceMachine__Group_8_0__0__Impl rule__InstanceMachine__Group_8_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_52);
+            rule__InstanceMachine__Group_8_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0__0"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0__0__Impl"
+    // InternalFormalML.g:16128:1: rule__InstanceMachine__Group_8_0__0__Impl : ( ( rule__InstanceMachine__Group_8_0_0__0 )? ) ;
+    public final void rule__InstanceMachine__Group_8_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16132:1: ( ( ( rule__InstanceMachine__Group_8_0_0__0 )? ) )
+            // InternalFormalML.g:16133:1: ( ( rule__InstanceMachine__Group_8_0_0__0 )? )
+            {
+            // InternalFormalML.g:16133:1: ( ( rule__InstanceMachine__Group_8_0_0__0 )? )
+            // InternalFormalML.g:16134:2: ( rule__InstanceMachine__Group_8_0_0__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0()); 
+            }
+            // InternalFormalML.g:16135:2: ( rule__InstanceMachine__Group_8_0_0__0 )?
+            int alt319=2;
+            int LA319_0 = input.LA(1);
+
+            if ( (LA319_0==23) ) {
+                alt319=1;
+            }
+            switch (alt319) {
+                case 1 :
+                    // InternalFormalML.g:16135:3: rule__InstanceMachine__Group_8_0_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InstanceMachine__Group_8_0_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0__0__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0__1"
+    // InternalFormalML.g:16143:1: rule__InstanceMachine__Group_8_0__1 : rule__InstanceMachine__Group_8_0__1__Impl ;
+    public final void rule__InstanceMachine__Group_8_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16147:1: ( rule__InstanceMachine__Group_8_0__1__Impl )
+            // InternalFormalML.g:16148:2: rule__InstanceMachine__Group_8_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0__1"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0__1__Impl"
+    // InternalFormalML.g:16154:1: rule__InstanceMachine__Group_8_0__1__Impl : ( ';' ) ;
+    public final void rule__InstanceMachine__Group_8_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16158:1: ( ( ';' ) )
+            // InternalFormalML.g:16159:1: ( ';' )
+            {
+            // InternalFormalML.g:16159:1: ( ';' )
+            // InternalFormalML.g:16160:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_0_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0__1__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0__0"
+    // InternalFormalML.g:16170:1: rule__InstanceMachine__Group_8_0_0__0 : rule__InstanceMachine__Group_8_0_0__0__Impl rule__InstanceMachine__Group_8_0_0__1 ;
+    public final void rule__InstanceMachine__Group_8_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16174:1: ( rule__InstanceMachine__Group_8_0_0__0__Impl rule__InstanceMachine__Group_8_0_0__1 )
+            // InternalFormalML.g:16175:2: rule__InstanceMachine__Group_8_0_0__0__Impl rule__InstanceMachine__Group_8_0_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_53);
+            rule__InstanceMachine__Group_8_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0__0"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0__0__Impl"
+    // InternalFormalML.g:16182:1: rule__InstanceMachine__Group_8_0_0__0__Impl : ( '(' ) ;
+    public final void rule__InstanceMachine__Group_8_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16186:1: ( ( '(' ) )
+            // InternalFormalML.g:16187:1: ( '(' )
+            {
+            // InternalFormalML.g:16187:1: ( '(' )
+            // InternalFormalML.g:16188:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getLeftParenthesisKeyword_8_0_0_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getLeftParenthesisKeyword_8_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0__1"
+    // InternalFormalML.g:16197:1: rule__InstanceMachine__Group_8_0_0__1 : rule__InstanceMachine__Group_8_0_0__1__Impl rule__InstanceMachine__Group_8_0_0__2 ;
+    public final void rule__InstanceMachine__Group_8_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16201:1: ( rule__InstanceMachine__Group_8_0_0__1__Impl rule__InstanceMachine__Group_8_0_0__2 )
+            // InternalFormalML.g:16202:2: rule__InstanceMachine__Group_8_0_0__1__Impl rule__InstanceMachine__Group_8_0_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_53);
+            rule__InstanceMachine__Group_8_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_0_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0__1"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0__1__Impl"
+    // InternalFormalML.g:16209:1: rule__InstanceMachine__Group_8_0_0__1__Impl : ( ( rule__InstanceMachine__Group_8_0_0_1__0 )? ) ;
+    public final void rule__InstanceMachine__Group_8_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16213:1: ( ( ( rule__InstanceMachine__Group_8_0_0_1__0 )? ) )
+            // InternalFormalML.g:16214:1: ( ( rule__InstanceMachine__Group_8_0_0_1__0 )? )
+            {
+            // InternalFormalML.g:16214:1: ( ( rule__InstanceMachine__Group_8_0_0_1__0 )? )
+            // InternalFormalML.g:16215:2: ( rule__InstanceMachine__Group_8_0_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1()); 
+            }
+            // InternalFormalML.g:16216:2: ( rule__InstanceMachine__Group_8_0_0_1__0 )?
+            int alt320=2;
+            int LA320_0 = input.LA(1);
+
+            if ( (LA320_0==RULE_XLIA_ID) ) {
+                alt320=1;
+            }
+            switch (alt320) {
+                case 1 :
+                    // InternalFormalML.g:16216:3: rule__InstanceMachine__Group_8_0_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InstanceMachine__Group_8_0_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0__2"
+    // InternalFormalML.g:16224:1: rule__InstanceMachine__Group_8_0_0__2 : rule__InstanceMachine__Group_8_0_0__2__Impl ;
+    public final void rule__InstanceMachine__Group_8_0_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16228:1: ( rule__InstanceMachine__Group_8_0_0__2__Impl )
+            // InternalFormalML.g:16229:2: rule__InstanceMachine__Group_8_0_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_0_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0__2"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0__2__Impl"
+    // InternalFormalML.g:16235:1: rule__InstanceMachine__Group_8_0_0__2__Impl : ( ')' ) ;
+    public final void rule__InstanceMachine__Group_8_0_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16239:1: ( ( ')' ) )
+            // InternalFormalML.g:16240:1: ( ')' )
+            {
+            // InternalFormalML.g:16240:1: ( ')' )
+            // InternalFormalML.g:16241:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getRightParenthesisKeyword_8_0_0_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getRightParenthesisKeyword_8_0_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0__2__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0_1__0"
+    // InternalFormalML.g:16251:1: rule__InstanceMachine__Group_8_0_0_1__0 : rule__InstanceMachine__Group_8_0_0_1__0__Impl rule__InstanceMachine__Group_8_0_0_1__1 ;
+    public final void rule__InstanceMachine__Group_8_0_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16255:1: ( rule__InstanceMachine__Group_8_0_0_1__0__Impl rule__InstanceMachine__Group_8_0_0_1__1 )
+            // InternalFormalML.g:16256:2: rule__InstanceMachine__Group_8_0_0_1__0__Impl rule__InstanceMachine__Group_8_0_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__InstanceMachine__Group_8_0_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_0_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0_1__0"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0_1__0__Impl"
+    // InternalFormalML.g:16263:1: rule__InstanceMachine__Group_8_0_0_1__0__Impl : ( ( rule__InstanceMachine__SlotAssignment_8_0_0_1_0 ) ) ;
+    public final void rule__InstanceMachine__Group_8_0_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16267:1: ( ( ( rule__InstanceMachine__SlotAssignment_8_0_0_1_0 ) ) )
+            // InternalFormalML.g:16268:1: ( ( rule__InstanceMachine__SlotAssignment_8_0_0_1_0 ) )
+            {
+            // InternalFormalML.g:16268:1: ( ( rule__InstanceMachine__SlotAssignment_8_0_0_1_0 ) )
+            // InternalFormalML.g:16269:2: ( rule__InstanceMachine__SlotAssignment_8_0_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_0()); 
+            }
+            // InternalFormalML.g:16270:2: ( rule__InstanceMachine__SlotAssignment_8_0_0_1_0 )
+            // InternalFormalML.g:16270:3: rule__InstanceMachine__SlotAssignment_8_0_0_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__SlotAssignment_8_0_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0_1__1"
+    // InternalFormalML.g:16278:1: rule__InstanceMachine__Group_8_0_0_1__1 : rule__InstanceMachine__Group_8_0_0_1__1__Impl ;
+    public final void rule__InstanceMachine__Group_8_0_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16282:1: ( rule__InstanceMachine__Group_8_0_0_1__1__Impl )
+            // InternalFormalML.g:16283:2: rule__InstanceMachine__Group_8_0_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_0_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0_1__1"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0_1__1__Impl"
+    // InternalFormalML.g:16289:1: rule__InstanceMachine__Group_8_0_0_1__1__Impl : ( ( rule__InstanceMachine__Group_8_0_0_1_1__0 )* ) ;
+    public final void rule__InstanceMachine__Group_8_0_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16293:1: ( ( ( rule__InstanceMachine__Group_8_0_0_1_1__0 )* ) )
+            // InternalFormalML.g:16294:1: ( ( rule__InstanceMachine__Group_8_0_0_1_1__0 )* )
+            {
+            // InternalFormalML.g:16294:1: ( ( rule__InstanceMachine__Group_8_0_0_1_1__0 )* )
+            // InternalFormalML.g:16295:2: ( rule__InstanceMachine__Group_8_0_0_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1_1()); 
+            }
+            // InternalFormalML.g:16296:2: ( rule__InstanceMachine__Group_8_0_0_1_1__0 )*
+            loop321:
+            do {
+                int alt321=2;
+                int LA321_0 = input.LA(1);
+
+                if ( (LA321_0==198) ) {
+                    alt321=1;
+                }
+
+
+                switch (alt321) {
+            	case 1 :
+            	    // InternalFormalML.g:16296:3: rule__InstanceMachine__Group_8_0_0_1_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__InstanceMachine__Group_8_0_0_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop321;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getGroup_8_0_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0_1_1__0"
+    // InternalFormalML.g:16305:1: rule__InstanceMachine__Group_8_0_0_1_1__0 : rule__InstanceMachine__Group_8_0_0_1_1__0__Impl rule__InstanceMachine__Group_8_0_0_1_1__1 ;
+    public final void rule__InstanceMachine__Group_8_0_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16309:1: ( rule__InstanceMachine__Group_8_0_0_1_1__0__Impl rule__InstanceMachine__Group_8_0_0_1_1__1 )
+            // InternalFormalML.g:16310:2: rule__InstanceMachine__Group_8_0_0_1_1__0__Impl rule__InstanceMachine__Group_8_0_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__InstanceMachine__Group_8_0_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_0_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0_1_1__0"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0_1_1__0__Impl"
+    // InternalFormalML.g:16317:1: rule__InstanceMachine__Group_8_0_0_1_1__0__Impl : ( ',' ) ;
+    public final void rule__InstanceMachine__Group_8_0_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16321:1: ( ( ',' ) )
+            // InternalFormalML.g:16322:1: ( ',' )
+            {
+            // InternalFormalML.g:16322:1: ( ',' )
+            // InternalFormalML.g:16323:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getCommaKeyword_8_0_0_1_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getCommaKeyword_8_0_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0_1_1__1"
+    // InternalFormalML.g:16332:1: rule__InstanceMachine__Group_8_0_0_1_1__1 : rule__InstanceMachine__Group_8_0_0_1_1__1__Impl ;
+    public final void rule__InstanceMachine__Group_8_0_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16336:1: ( rule__InstanceMachine__Group_8_0_0_1_1__1__Impl )
+            // InternalFormalML.g:16337:2: rule__InstanceMachine__Group_8_0_0_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_0_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0_1_1__1"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_0_0_1_1__1__Impl"
+    // InternalFormalML.g:16343:1: rule__InstanceMachine__Group_8_0_0_1_1__1__Impl : ( ( rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1 ) ) ;
+    public final void rule__InstanceMachine__Group_8_0_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16347:1: ( ( ( rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1 ) ) )
+            // InternalFormalML.g:16348:1: ( ( rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1 ) )
+            {
+            // InternalFormalML.g:16348:1: ( ( rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1 ) )
+            // InternalFormalML.g:16349:2: ( rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_1_1()); 
+            }
+            // InternalFormalML.g:16350:2: ( rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1 )
+            // InternalFormalML.g:16350:3: rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_0_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_0_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1__0"
+    // InternalFormalML.g:16359:1: rule__InstanceMachine__Group_8_1__0 : rule__InstanceMachine__Group_8_1__0__Impl rule__InstanceMachine__Group_8_1__1 ;
+    public final void rule__InstanceMachine__Group_8_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16363:1: ( rule__InstanceMachine__Group_8_1__0__Impl rule__InstanceMachine__Group_8_1__1 )
+            // InternalFormalML.g:16364:2: rule__InstanceMachine__Group_8_1__0__Impl rule__InstanceMachine__Group_8_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__InstanceMachine__Group_8_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1__0"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1__0__Impl"
+    // InternalFormalML.g:16371:1: rule__InstanceMachine__Group_8_1__0__Impl : ( '{' ) ;
+    public final void rule__InstanceMachine__Group_8_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16375:1: ( ( '{' ) )
+            // InternalFormalML.g:16376:1: ( '{' )
+            {
+            // InternalFormalML.g:16376:1: ( '{' )
+            // InternalFormalML.g:16377:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getLeftCurlyBracketKeyword_8_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getLeftCurlyBracketKeyword_8_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1__0__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1__1"
+    // InternalFormalML.g:16386:1: rule__InstanceMachine__Group_8_1__1 : rule__InstanceMachine__Group_8_1__1__Impl rule__InstanceMachine__Group_8_1__2 ;
+    public final void rule__InstanceMachine__Group_8_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16390:1: ( rule__InstanceMachine__Group_8_1__1__Impl rule__InstanceMachine__Group_8_1__2 )
+            // InternalFormalML.g:16391:2: rule__InstanceMachine__Group_8_1__1__Impl rule__InstanceMachine__Group_8_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__InstanceMachine__Group_8_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1__1"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1__1__Impl"
+    // InternalFormalML.g:16398:1: rule__InstanceMachine__Group_8_1__1__Impl : ( ( rule__InstanceMachine__Group_8_1_1__0 )* ) ;
+    public final void rule__InstanceMachine__Group_8_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16402:1: ( ( ( rule__InstanceMachine__Group_8_1_1__0 )* ) )
+            // InternalFormalML.g:16403:1: ( ( rule__InstanceMachine__Group_8_1_1__0 )* )
+            {
+            // InternalFormalML.g:16403:1: ( ( rule__InstanceMachine__Group_8_1_1__0 )* )
+            // InternalFormalML.g:16404:2: ( rule__InstanceMachine__Group_8_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getGroup_8_1_1()); 
+            }
+            // InternalFormalML.g:16405:2: ( rule__InstanceMachine__Group_8_1_1__0 )*
+            loop322:
+            do {
+                int alt322=2;
+                int LA322_0 = input.LA(1);
+
+                if ( (LA322_0==RULE_XLIA_ID) ) {
+                    alt322=1;
+                }
+
+
+                switch (alt322) {
+            	case 1 :
+            	    // InternalFormalML.g:16405:3: rule__InstanceMachine__Group_8_1_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_18);
+            	    rule__InstanceMachine__Group_8_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop322;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getGroup_8_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1__1__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1__2"
+    // InternalFormalML.g:16413:1: rule__InstanceMachine__Group_8_1__2 : rule__InstanceMachine__Group_8_1__2__Impl ;
+    public final void rule__InstanceMachine__Group_8_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16417:1: ( rule__InstanceMachine__Group_8_1__2__Impl )
+            // InternalFormalML.g:16418:2: rule__InstanceMachine__Group_8_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1__2"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1__2__Impl"
+    // InternalFormalML.g:16424:1: rule__InstanceMachine__Group_8_1__2__Impl : ( '}' ) ;
+    public final void rule__InstanceMachine__Group_8_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16428:1: ( ( '}' ) )
+            // InternalFormalML.g:16429:1: ( '}' )
+            {
+            // InternalFormalML.g:16429:1: ( '}' )
+            // InternalFormalML.g:16430:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getRightCurlyBracketKeyword_8_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getRightCurlyBracketKeyword_8_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1__2__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1_1__0"
+    // InternalFormalML.g:16440:1: rule__InstanceMachine__Group_8_1_1__0 : rule__InstanceMachine__Group_8_1_1__0__Impl rule__InstanceMachine__Group_8_1_1__1 ;
+    public final void rule__InstanceMachine__Group_8_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16444:1: ( rule__InstanceMachine__Group_8_1_1__0__Impl rule__InstanceMachine__Group_8_1_1__1 )
+            // InternalFormalML.g:16445:2: rule__InstanceMachine__Group_8_1_1__0__Impl rule__InstanceMachine__Group_8_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__InstanceMachine__Group_8_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1_1__0"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1_1__0__Impl"
+    // InternalFormalML.g:16452:1: rule__InstanceMachine__Group_8_1_1__0__Impl : ( ( rule__InstanceMachine__SlotAssignment_8_1_1_0 ) ) ;
+    public final void rule__InstanceMachine__Group_8_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16456:1: ( ( ( rule__InstanceMachine__SlotAssignment_8_1_1_0 ) ) )
+            // InternalFormalML.g:16457:1: ( ( rule__InstanceMachine__SlotAssignment_8_1_1_0 ) )
+            {
+            // InternalFormalML.g:16457:1: ( ( rule__InstanceMachine__SlotAssignment_8_1_1_0 ) )
+            // InternalFormalML.g:16458:2: ( rule__InstanceMachine__SlotAssignment_8_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_1_1_0()); 
+            }
+            // InternalFormalML.g:16459:2: ( rule__InstanceMachine__SlotAssignment_8_1_1_0 )
+            // InternalFormalML.g:16459:3: rule__InstanceMachine__SlotAssignment_8_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__SlotAssignment_8_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getSlotAssignment_8_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1_1__1"
+    // InternalFormalML.g:16467:1: rule__InstanceMachine__Group_8_1_1__1 : rule__InstanceMachine__Group_8_1_1__1__Impl ;
+    public final void rule__InstanceMachine__Group_8_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16471:1: ( rule__InstanceMachine__Group_8_1_1__1__Impl )
+            // InternalFormalML.g:16472:2: rule__InstanceMachine__Group_8_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstanceMachine__Group_8_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1_1__1"
+
+
+    // $ANTLR start "rule__InstanceMachine__Group_8_1_1__1__Impl"
+    // InternalFormalML.g:16478:1: rule__InstanceMachine__Group_8_1_1__1__Impl : ( ';' ) ;
+    public final void rule__InstanceMachine__Group_8_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16482:1: ( ( ';' ) )
+            // InternalFormalML.g:16483:1: ( ';' )
+            {
+            // InternalFormalML.g:16483:1: ( ';' )
+            // InternalFormalML.g:16484:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_1_1_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__Group_8_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__SlotParameter__Group__0"
+    // InternalFormalML.g:16494:1: rule__SlotParameter__Group__0 : rule__SlotParameter__Group__0__Impl rule__SlotParameter__Group__1 ;
+    public final void rule__SlotParameter__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16498:1: ( rule__SlotParameter__Group__0__Impl rule__SlotParameter__Group__1 )
+            // InternalFormalML.g:16499:2: rule__SlotParameter__Group__0__Impl rule__SlotParameter__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_55);
+            rule__SlotParameter__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotParameter__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotParameter__Group__0"
+
+
+    // $ANTLR start "rule__SlotParameter__Group__0__Impl"
+    // InternalFormalML.g:16506:1: rule__SlotParameter__Group__0__Impl : ( ( rule__SlotParameter__XliaPropertyAssignment_0 ) ) ;
+    public final void rule__SlotParameter__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16510:1: ( ( ( rule__SlotParameter__XliaPropertyAssignment_0 ) ) )
+            // InternalFormalML.g:16511:1: ( ( rule__SlotParameter__XliaPropertyAssignment_0 ) )
+            {
+            // InternalFormalML.g:16511:1: ( ( rule__SlotParameter__XliaPropertyAssignment_0 ) )
+            // InternalFormalML.g:16512:2: ( rule__SlotParameter__XliaPropertyAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotParameterAccess().getXliaPropertyAssignment_0()); 
+            }
+            // InternalFormalML.g:16513:2: ( rule__SlotParameter__XliaPropertyAssignment_0 )
+            // InternalFormalML.g:16513:3: rule__SlotParameter__XliaPropertyAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotParameter__XliaPropertyAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotParameterAccess().getXliaPropertyAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotParameter__Group__0__Impl"
+
+
+    // $ANTLR start "rule__SlotParameter__Group__1"
+    // InternalFormalML.g:16521:1: rule__SlotParameter__Group__1 : rule__SlotParameter__Group__1__Impl rule__SlotParameter__Group__2 ;
+    public final void rule__SlotParameter__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16525:1: ( rule__SlotParameter__Group__1__Impl rule__SlotParameter__Group__2 )
+            // InternalFormalML.g:16526:2: rule__SlotParameter__Group__1__Impl rule__SlotParameter__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__SlotParameter__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotParameter__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotParameter__Group__1"
+
+
+    // $ANTLR start "rule__SlotParameter__Group__1__Impl"
+    // InternalFormalML.g:16533:1: rule__SlotParameter__Group__1__Impl : ( ':' ) ;
+    public final void rule__SlotParameter__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16537:1: ( ( ':' ) )
+            // InternalFormalML.g:16538:1: ( ':' )
+            {
+            // InternalFormalML.g:16538:1: ( ':' )
+            // InternalFormalML.g:16539:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotParameterAccess().getColonKeyword_1()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotParameterAccess().getColonKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotParameter__Group__1__Impl"
+
+
+    // $ANTLR start "rule__SlotParameter__Group__2"
+    // InternalFormalML.g:16548:1: rule__SlotParameter__Group__2 : rule__SlotParameter__Group__2__Impl ;
+    public final void rule__SlotParameter__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16552:1: ( rule__SlotParameter__Group__2__Impl )
+            // InternalFormalML.g:16553:2: rule__SlotParameter__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotParameter__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotParameter__Group__2"
+
+
+    // $ANTLR start "rule__SlotParameter__Group__2__Impl"
+    // InternalFormalML.g:16559:1: rule__SlotParameter__Group__2__Impl : ( ( rule__SlotParameter__ValueAssignment_2 ) ) ;
+    public final void rule__SlotParameter__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16563:1: ( ( ( rule__SlotParameter__ValueAssignment_2 ) ) )
+            // InternalFormalML.g:16564:1: ( ( rule__SlotParameter__ValueAssignment_2 ) )
+            {
+            // InternalFormalML.g:16564:1: ( ( rule__SlotParameter__ValueAssignment_2 ) )
+            // InternalFormalML.g:16565:2: ( rule__SlotParameter__ValueAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotParameterAccess().getValueAssignment_2()); 
+            }
+            // InternalFormalML.g:16566:2: ( rule__SlotParameter__ValueAssignment_2 )
+            // InternalFormalML.g:16566:3: rule__SlotParameter__ValueAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotParameter__ValueAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotParameterAccess().getValueAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotParameter__Group__2__Impl"
+
+
+    // $ANTLR start "rule__SlotProperty__Group__0"
+    // InternalFormalML.g:16575:1: rule__SlotProperty__Group__0 : rule__SlotProperty__Group__0__Impl rule__SlotProperty__Group__1 ;
+    public final void rule__SlotProperty__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16579:1: ( rule__SlotProperty__Group__0__Impl rule__SlotProperty__Group__1 )
+            // InternalFormalML.g:16580:2: rule__SlotProperty__Group__0__Impl rule__SlotProperty__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_19);
+            rule__SlotProperty__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotProperty__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotProperty__Group__0"
+
+
+    // $ANTLR start "rule__SlotProperty__Group__0__Impl"
+    // InternalFormalML.g:16587:1: rule__SlotProperty__Group__0__Impl : ( ( rule__SlotProperty__XliaPropertyAssignment_0 ) ) ;
+    public final void rule__SlotProperty__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16591:1: ( ( ( rule__SlotProperty__XliaPropertyAssignment_0 ) ) )
+            // InternalFormalML.g:16592:1: ( ( rule__SlotProperty__XliaPropertyAssignment_0 ) )
+            {
+            // InternalFormalML.g:16592:1: ( ( rule__SlotProperty__XliaPropertyAssignment_0 ) )
+            // InternalFormalML.g:16593:2: ( rule__SlotProperty__XliaPropertyAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotPropertyAccess().getXliaPropertyAssignment_0()); 
+            }
+            // InternalFormalML.g:16594:2: ( rule__SlotProperty__XliaPropertyAssignment_0 )
+            // InternalFormalML.g:16594:3: rule__SlotProperty__XliaPropertyAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotProperty__XliaPropertyAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotPropertyAccess().getXliaPropertyAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotProperty__Group__0__Impl"
+
+
+    // $ANTLR start "rule__SlotProperty__Group__1"
+    // InternalFormalML.g:16602:1: rule__SlotProperty__Group__1 : rule__SlotProperty__Group__1__Impl rule__SlotProperty__Group__2 ;
+    public final void rule__SlotProperty__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16606:1: ( rule__SlotProperty__Group__1__Impl rule__SlotProperty__Group__2 )
+            // InternalFormalML.g:16607:2: rule__SlotProperty__Group__1__Impl rule__SlotProperty__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__SlotProperty__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotProperty__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotProperty__Group__1"
+
+
+    // $ANTLR start "rule__SlotProperty__Group__1__Impl"
+    // InternalFormalML.g:16614:1: rule__SlotProperty__Group__1__Impl : ( '=' ) ;
+    public final void rule__SlotProperty__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16618:1: ( ( '=' ) )
+            // InternalFormalML.g:16619:1: ( '=' )
+            {
+            // InternalFormalML.g:16619:1: ( '=' )
+            // InternalFormalML.g:16620:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotPropertyAccess().getEqualsSignKeyword_1()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotPropertyAccess().getEqualsSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotProperty__Group__1__Impl"
+
+
+    // $ANTLR start "rule__SlotProperty__Group__2"
+    // InternalFormalML.g:16629:1: rule__SlotProperty__Group__2 : rule__SlotProperty__Group__2__Impl ;
+    public final void rule__SlotProperty__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16633:1: ( rule__SlotProperty__Group__2__Impl )
+            // InternalFormalML.g:16634:2: rule__SlotProperty__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotProperty__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotProperty__Group__2"
+
+
+    // $ANTLR start "rule__SlotProperty__Group__2__Impl"
+    // InternalFormalML.g:16640:1: rule__SlotProperty__Group__2__Impl : ( ( rule__SlotProperty__ValueAssignment_2 ) ) ;
+    public final void rule__SlotProperty__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16644:1: ( ( ( rule__SlotProperty__ValueAssignment_2 ) ) )
+            // InternalFormalML.g:16645:1: ( ( rule__SlotProperty__ValueAssignment_2 ) )
+            {
+            // InternalFormalML.g:16645:1: ( ( rule__SlotProperty__ValueAssignment_2 ) )
+            // InternalFormalML.g:16646:2: ( rule__SlotProperty__ValueAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotPropertyAccess().getValueAssignment_2()); 
+            }
+            // InternalFormalML.g:16647:2: ( rule__SlotProperty__ValueAssignment_2 )
+            // InternalFormalML.g:16647:3: rule__SlotProperty__ValueAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SlotProperty__ValueAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotPropertyAccess().getValueAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotProperty__Group__2__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__0"
+    // InternalFormalML.g:16656:1: rule__MachineBlock__Group__0 : rule__MachineBlock__Group__0__Impl rule__MachineBlock__Group__1 ;
+    public final void rule__MachineBlock__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16660:1: ( rule__MachineBlock__Group__0__Impl rule__MachineBlock__Group__1 )
+            // InternalFormalML.g:16661:2: rule__MachineBlock__Group__0__Impl rule__MachineBlock__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_56);
+            rule__MachineBlock__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__0__Impl"
+    // InternalFormalML.g:16668:1: rule__MachineBlock__Group__0__Impl : ( ( rule__MachineBlock__UnorderedGroup_0 ) ) ;
+    public final void rule__MachineBlock__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16672:1: ( ( ( rule__MachineBlock__UnorderedGroup_0 ) ) )
+            // InternalFormalML.g:16673:1: ( ( rule__MachineBlock__UnorderedGroup_0 ) )
+            {
+            // InternalFormalML.g:16673:1: ( ( rule__MachineBlock__UnorderedGroup_0 ) )
+            // InternalFormalML.g:16674:2: ( rule__MachineBlock__UnorderedGroup_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()); 
+            }
+            // InternalFormalML.g:16675:2: ( rule__MachineBlock__UnorderedGroup_0 )
+            // InternalFormalML.g:16675:3: rule__MachineBlock__UnorderedGroup_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__UnorderedGroup_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__1"
+    // InternalFormalML.g:16683:1: rule__MachineBlock__Group__1 : rule__MachineBlock__Group__1__Impl rule__MachineBlock__Group__2 ;
+    public final void rule__MachineBlock__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16687:1: ( rule__MachineBlock__Group__1__Impl rule__MachineBlock__Group__2 )
+            // InternalFormalML.g:16688:2: rule__MachineBlock__Group__1__Impl rule__MachineBlock__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__MachineBlock__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__1__Impl"
+    // InternalFormalML.g:16695:1: rule__MachineBlock__Group__1__Impl : ( 'machine' ) ;
+    public final void rule__MachineBlock__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16699:1: ( ( 'machine' ) )
+            // InternalFormalML.g:16700:1: ( 'machine' )
+            {
+            // InternalFormalML.g:16700:1: ( 'machine' )
+            // InternalFormalML.g:16701:2: 'machine'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getMachineKeyword_1()); 
+            }
+            match(input,39,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getMachineKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__2"
+    // InternalFormalML.g:16710:1: rule__MachineBlock__Group__2 : rule__MachineBlock__Group__2__Impl rule__MachineBlock__Group__3 ;
+    public final void rule__MachineBlock__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16714:1: ( rule__MachineBlock__Group__2__Impl rule__MachineBlock__Group__3 )
+            // InternalFormalML.g:16715:2: rule__MachineBlock__Group__2__Impl rule__MachineBlock__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__MachineBlock__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__2"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__2__Impl"
+    // InternalFormalML.g:16722:1: rule__MachineBlock__Group__2__Impl : ( ( rule__MachineBlock__Group_2__0 )? ) ;
+    public final void rule__MachineBlock__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16726:1: ( ( ( rule__MachineBlock__Group_2__0 )? ) )
+            // InternalFormalML.g:16727:1: ( ( rule__MachineBlock__Group_2__0 )? )
+            {
+            // InternalFormalML.g:16727:1: ( ( rule__MachineBlock__Group_2__0 )? )
+            // InternalFormalML.g:16728:2: ( rule__MachineBlock__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:16729:2: ( rule__MachineBlock__Group_2__0 )?
+            int alt323=2;
+            int LA323_0 = input.LA(1);
+
+            if ( (LA323_0==125) ) {
+                alt323=1;
+            }
+            switch (alt323) {
+                case 1 :
+                    // InternalFormalML.g:16729:3: rule__MachineBlock__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__2__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__3"
+    // InternalFormalML.g:16737:1: rule__MachineBlock__Group__3 : rule__MachineBlock__Group__3__Impl rule__MachineBlock__Group__4 ;
+    public final void rule__MachineBlock__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16741:1: ( rule__MachineBlock__Group__3__Impl rule__MachineBlock__Group__4 )
+            // InternalFormalML.g:16742:2: rule__MachineBlock__Group__3__Impl rule__MachineBlock__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__MachineBlock__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__3"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__3__Impl"
+    // InternalFormalML.g:16749:1: rule__MachineBlock__Group__3__Impl : ( ( rule__MachineBlock__NameAssignment_3 ) ) ;
+    public final void rule__MachineBlock__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16753:1: ( ( ( rule__MachineBlock__NameAssignment_3 ) ) )
+            // InternalFormalML.g:16754:1: ( ( rule__MachineBlock__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:16754:1: ( ( rule__MachineBlock__NameAssignment_3 ) )
+            // InternalFormalML.g:16755:2: ( rule__MachineBlock__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:16756:2: ( rule__MachineBlock__NameAssignment_3 )
+            // InternalFormalML.g:16756:3: rule__MachineBlock__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__3__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__4"
+    // InternalFormalML.g:16764:1: rule__MachineBlock__Group__4 : rule__MachineBlock__Group__4__Impl rule__MachineBlock__Group__5 ;
+    public final void rule__MachineBlock__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16768:1: ( rule__MachineBlock__Group__4__Impl rule__MachineBlock__Group__5 )
+            // InternalFormalML.g:16769:2: rule__MachineBlock__Group__4__Impl rule__MachineBlock__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__MachineBlock__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__4"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__4__Impl"
+    // InternalFormalML.g:16776:1: rule__MachineBlock__Group__4__Impl : ( ( rule__MachineBlock__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__MachineBlock__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16780:1: ( ( ( rule__MachineBlock__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:16781:1: ( ( rule__MachineBlock__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:16781:1: ( ( rule__MachineBlock__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:16782:2: ( rule__MachineBlock__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:16783:2: ( rule__MachineBlock__UnrestrictedNameAssignment_4 )?
+            int alt324=2;
+            int LA324_0 = input.LA(1);
+
+            if ( (LA324_0==RULE_STRING) ) {
+                alt324=1;
+            }
+            switch (alt324) {
+                case 1 :
+                    // InternalFormalML.g:16783:3: rule__MachineBlock__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__4__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__5"
+    // InternalFormalML.g:16791:1: rule__MachineBlock__Group__5 : rule__MachineBlock__Group__5__Impl rule__MachineBlock__Group__6 ;
+    public final void rule__MachineBlock__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16795:1: ( rule__MachineBlock__Group__5__Impl rule__MachineBlock__Group__6 )
+            // InternalFormalML.g:16796:2: rule__MachineBlock__Group__5__Impl rule__MachineBlock__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_31);
+            rule__MachineBlock__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__5"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__5__Impl"
+    // InternalFormalML.g:16803:1: rule__MachineBlock__Group__5__Impl : ( '{' ) ;
+    public final void rule__MachineBlock__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16807:1: ( ( '{' ) )
+            // InternalFormalML.g:16808:1: ( '{' )
+            {
+            // InternalFormalML.g:16808:1: ( '{' )
+            // InternalFormalML.g:16809:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getLeftCurlyBracketKeyword_5()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getLeftCurlyBracketKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__5__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__6"
+    // InternalFormalML.g:16818:1: rule__MachineBlock__Group__6 : rule__MachineBlock__Group__6__Impl rule__MachineBlock__Group__7 ;
+    public final void rule__MachineBlock__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16822:1: ( rule__MachineBlock__Group__6__Impl rule__MachineBlock__Group__7 )
+            // InternalFormalML.g:16823:2: rule__MachineBlock__Group__6__Impl rule__MachineBlock__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_31);
+            rule__MachineBlock__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__6"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__6__Impl"
+    // InternalFormalML.g:16830:1: rule__MachineBlock__Group__6__Impl : ( ( rule__MachineBlock__Alternatives_6 )* ) ;
+    public final void rule__MachineBlock__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16834:1: ( ( ( rule__MachineBlock__Alternatives_6 )* ) )
+            // InternalFormalML.g:16835:1: ( ( rule__MachineBlock__Alternatives_6 )* )
+            {
+            // InternalFormalML.g:16835:1: ( ( rule__MachineBlock__Alternatives_6 )* )
+            // InternalFormalML.g:16836:2: ( rule__MachineBlock__Alternatives_6 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_6()); 
+            }
+            // InternalFormalML.g:16837:2: ( rule__MachineBlock__Alternatives_6 )*
+            loop325:
+            do {
+                int alt325=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA325_2 = input.LA(2);
+
+                    if ( ((LA325_2>=15 && LA325_2<=19)||LA325_2==28||(LA325_2>=143 && LA325_2<=145)||LA325_2==179||LA325_2==229||(LA325_2>=278 && LA325_2<=283)) ) {
+                        alt325=1;
+                    }
+                    else if ( (LA325_2==224) ) {
+                        int LA325_6 = input.LA(3);
+
+                        if ( (LA325_6==RULE_XLIA_ID||(LA325_6>=15 && LA325_6<=18)||LA325_6==39||(LA325_6>=59 && LA325_6<=74)||(LA325_6>=129 && LA325_6<=132)||LA325_6==149||(LA325_6>=163 && LA325_6<=171)||(LA325_6>=231 && LA325_6<=237)||LA325_6==277||LA325_6==282) ) {
+                            alt325=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA325_3 = input.LA(2);
+
+                    if ( ((LA325_3>=15 && LA325_3<=19)||LA325_3==28||(LA325_3>=143 && LA325_3<=145)||LA325_3==179||LA325_3==229||(LA325_3>=278 && LA325_3<=283)) ) {
+                        alt325=1;
+                    }
+                    else if ( (LA325_3==224) ) {
+                        int LA325_6 = input.LA(3);
+
+                        if ( (LA325_6==RULE_XLIA_ID||(LA325_6>=15 && LA325_6<=18)||LA325_6==39||(LA325_6>=59 && LA325_6<=74)||(LA325_6>=129 && LA325_6<=132)||LA325_6==149||(LA325_6>=163 && LA325_6<=171)||(LA325_6>=231 && LA325_6<=237)||LA325_6==277||LA325_6==282) ) {
+                            alt325=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA325_4 = input.LA(2);
+
+                    if ( ((LA325_4>=15 && LA325_4<=19)||LA325_4==28||(LA325_4>=143 && LA325_4<=145)||LA325_4==179||LA325_4==229||(LA325_4>=278 && LA325_4<=283)) ) {
+                        alt325=1;
+                    }
+                    else if ( (LA325_4==224) ) {
+                        int LA325_6 = input.LA(3);
+
+                        if ( (LA325_6==RULE_XLIA_ID||(LA325_6>=15 && LA325_6<=18)||LA325_6==39||(LA325_6>=59 && LA325_6<=74)||(LA325_6>=129 && LA325_6<=132)||LA325_6==149||(LA325_6>=163 && LA325_6<=171)||(LA325_6>=231 && LA325_6<=237)||LA325_6==277||LA325_6==282) ) {
+                            alt325=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA325_5 = input.LA(2);
+
+                    if ( ((LA325_5>=15 && LA325_5<=19)||LA325_5==28||(LA325_5>=143 && LA325_5<=145)||LA325_5==179||LA325_5==229||(LA325_5>=278 && LA325_5<=283)) ) {
+                        alt325=1;
+                    }
+                    else if ( (LA325_5==224) ) {
+                        int LA325_6 = input.LA(3);
+
+                        if ( (LA325_6==RULE_XLIA_ID||(LA325_6>=15 && LA325_6<=18)||LA325_6==39||(LA325_6>=59 && LA325_6<=74)||(LA325_6>=129 && LA325_6<=132)||LA325_6==149||(LA325_6>=163 && LA325_6<=171)||(LA325_6>=231 && LA325_6<=237)||LA325_6==277||LA325_6==282) ) {
+                            alt325=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA325_6 = input.LA(2);
+
+                    if ( (LA325_6==RULE_XLIA_ID||(LA325_6>=15 && LA325_6<=18)||LA325_6==39||(LA325_6>=59 && LA325_6<=74)||(LA325_6>=129 && LA325_6<=132)||LA325_6==149||(LA325_6>=163 && LA325_6<=171)||(LA325_6>=231 && LA325_6<=237)||LA325_6==277||LA325_6==282) ) {
+                        alt325=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 282:
+                case 283:
+                    {
+                    alt325=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt325) {
+            	case 1 :
+            	    // InternalFormalML.g:16837:3: rule__MachineBlock__Alternatives_6
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__MachineBlock__Alternatives_6();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop325;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__6__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__7"
+    // InternalFormalML.g:16845:1: rule__MachineBlock__Group__7 : rule__MachineBlock__Group__7__Impl rule__MachineBlock__Group__8 ;
+    public final void rule__MachineBlock__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16849:1: ( rule__MachineBlock__Group__7__Impl rule__MachineBlock__Group__8 )
+            // InternalFormalML.g:16850:2: rule__MachineBlock__Group__7__Impl rule__MachineBlock__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_31);
+            rule__MachineBlock__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__7"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__7__Impl"
+    // InternalFormalML.g:16857:1: rule__MachineBlock__Group__7__Impl : ( ( rule__MachineBlock__Alternatives_7 )* ) ;
+    public final void rule__MachineBlock__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16861:1: ( ( ( rule__MachineBlock__Alternatives_7 )* ) )
+            // InternalFormalML.g:16862:1: ( ( rule__MachineBlock__Alternatives_7 )* )
+            {
+            // InternalFormalML.g:16862:1: ( ( rule__MachineBlock__Alternatives_7 )* )
+            // InternalFormalML.g:16863:2: ( rule__MachineBlock__Alternatives_7 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_7()); 
+            }
+            // InternalFormalML.g:16864:2: ( rule__MachineBlock__Alternatives_7 )*
+            loop326:
+            do {
+                int alt326=2;
+                int LA326_0 = input.LA(1);
+
+                if ( ((LA326_0>=202 && LA326_0<=205)) ) {
+                    alt326=1;
+                }
+
+
+                switch (alt326) {
+            	case 1 :
+            	    // InternalFormalML.g:16864:3: rule__MachineBlock__Alternatives_7
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_32);
+            	    rule__MachineBlock__Alternatives_7();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop326;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__7__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__8"
+    // InternalFormalML.g:16872:1: rule__MachineBlock__Group__8 : rule__MachineBlock__Group__8__Impl rule__MachineBlock__Group__9 ;
+    public final void rule__MachineBlock__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16876:1: ( rule__MachineBlock__Group__8__Impl rule__MachineBlock__Group__9 )
+            // InternalFormalML.g:16877:2: rule__MachineBlock__Group__8__Impl rule__MachineBlock__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__MachineBlock__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__8"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__8__Impl"
+    // InternalFormalML.g:16884:1: rule__MachineBlock__Group__8__Impl : ( ( rule__MachineBlock__Alternatives_8 ) ) ;
+    public final void rule__MachineBlock__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16888:1: ( ( ( rule__MachineBlock__Alternatives_8 ) ) )
+            // InternalFormalML.g:16889:1: ( ( rule__MachineBlock__Alternatives_8 ) )
+            {
+            // InternalFormalML.g:16889:1: ( ( rule__MachineBlock__Alternatives_8 ) )
+            // InternalFormalML.g:16890:2: ( rule__MachineBlock__Alternatives_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:16891:2: ( rule__MachineBlock__Alternatives_8 )
+            // InternalFormalML.g:16891:3: rule__MachineBlock__Alternatives_8
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Alternatives_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__8__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__9"
+    // InternalFormalML.g:16899:1: rule__MachineBlock__Group__9 : rule__MachineBlock__Group__9__Impl rule__MachineBlock__Group__10 ;
+    public final void rule__MachineBlock__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16903:1: ( rule__MachineBlock__Group__9__Impl rule__MachineBlock__Group__10 )
+            // InternalFormalML.g:16904:2: rule__MachineBlock__Group__9__Impl rule__MachineBlock__Group__10
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__MachineBlock__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__9"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__9__Impl"
+    // InternalFormalML.g:16911:1: rule__MachineBlock__Group__9__Impl : ( ( rule__MachineBlock__Alternatives_9 )* ) ;
+    public final void rule__MachineBlock__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16915:1: ( ( ( rule__MachineBlock__Alternatives_9 )* ) )
+            // InternalFormalML.g:16916:1: ( ( rule__MachineBlock__Alternatives_9 )* )
+            {
+            // InternalFormalML.g:16916:1: ( ( rule__MachineBlock__Alternatives_9 )* )
+            // InternalFormalML.g:16917:2: ( rule__MachineBlock__Alternatives_9 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_9()); 
+            }
+            // InternalFormalML.g:16918:2: ( rule__MachineBlock__Alternatives_9 )*
+            loop327:
+            do {
+                int alt327=2;
+                int LA327_0 = input.LA(1);
+
+                if ( ((LA327_0>=37 && LA327_0<=38)||(LA327_0>=207 && LA327_0<=209)) ) {
+                    alt327=1;
+                }
+
+
+                switch (alt327) {
+            	case 1 :
+            	    // InternalFormalML.g:16918:3: rule__MachineBlock__Alternatives_9
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_34);
+            	    rule__MachineBlock__Alternatives_9();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop327;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__9__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__10"
+    // InternalFormalML.g:16926:1: rule__MachineBlock__Group__10 : rule__MachineBlock__Group__10__Impl rule__MachineBlock__Group__11 ;
+    public final void rule__MachineBlock__Group__10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16930:1: ( rule__MachineBlock__Group__10__Impl rule__MachineBlock__Group__11 )
+            // InternalFormalML.g:16931:2: rule__MachineBlock__Group__10__Impl rule__MachineBlock__Group__11
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__MachineBlock__Group__10__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__10"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__10__Impl"
+    // InternalFormalML.g:16938:1: rule__MachineBlock__Group__10__Impl : ( ( rule__MachineBlock__Alternatives_10 )* ) ;
+    public final void rule__MachineBlock__Group__10__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16942:1: ( ( ( rule__MachineBlock__Alternatives_10 )* ) )
+            // InternalFormalML.g:16943:1: ( ( rule__MachineBlock__Alternatives_10 )* )
+            {
+            // InternalFormalML.g:16943:1: ( ( rule__MachineBlock__Alternatives_10 )* )
+            // InternalFormalML.g:16944:2: ( rule__MachineBlock__Alternatives_10 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_10()); 
+            }
+            // InternalFormalML.g:16945:2: ( rule__MachineBlock__Alternatives_10 )*
+            loop328:
+            do {
+                int alt328=2;
+                int LA328_0 = input.LA(1);
+
+                if ( (LA328_0==42||LA328_0==210) ) {
+                    alt328=1;
+                }
+
+
+                switch (alt328) {
+            	case 1 :
+            	    // InternalFormalML.g:16945:3: rule__MachineBlock__Alternatives_10
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_35);
+            	    rule__MachineBlock__Alternatives_10();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop328;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_10()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__10__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__11"
+    // InternalFormalML.g:16953:1: rule__MachineBlock__Group__11 : rule__MachineBlock__Group__11__Impl rule__MachineBlock__Group__12 ;
+    public final void rule__MachineBlock__Group__11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16957:1: ( rule__MachineBlock__Group__11__Impl rule__MachineBlock__Group__12 )
+            // InternalFormalML.g:16958:2: rule__MachineBlock__Group__11__Impl rule__MachineBlock__Group__12
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__MachineBlock__Group__11__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__12();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__11"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__11__Impl"
+    // InternalFormalML.g:16965:1: rule__MachineBlock__Group__11__Impl : ( ( rule__MachineBlock__MainAssignment_11 ) ) ;
+    public final void rule__MachineBlock__Group__11__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16969:1: ( ( ( rule__MachineBlock__MainAssignment_11 ) ) )
+            // InternalFormalML.g:16970:1: ( ( rule__MachineBlock__MainAssignment_11 ) )
+            {
+            // InternalFormalML.g:16970:1: ( ( rule__MachineBlock__MainAssignment_11 ) )
+            // InternalFormalML.g:16971:2: ( rule__MachineBlock__MainAssignment_11 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getMainAssignment_11()); 
+            }
+            // InternalFormalML.g:16972:2: ( rule__MachineBlock__MainAssignment_11 )
+            // InternalFormalML.g:16972:3: rule__MachineBlock__MainAssignment_11
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__MainAssignment_11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getMainAssignment_11()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__11__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__12"
+    // InternalFormalML.g:16980:1: rule__MachineBlock__Group__12 : rule__MachineBlock__Group__12__Impl ;
+    public final void rule__MachineBlock__Group__12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16984:1: ( rule__MachineBlock__Group__12__Impl )
+            // InternalFormalML.g:16985:2: rule__MachineBlock__Group__12__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group__12__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__12"
+
+
+    // $ANTLR start "rule__MachineBlock__Group__12__Impl"
+    // InternalFormalML.g:16991:1: rule__MachineBlock__Group__12__Impl : ( '}' ) ;
+    public final void rule__MachineBlock__Group__12__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:16995:1: ( ( '}' ) )
+            // InternalFormalML.g:16996:1: ( '}' )
+            {
+            // InternalFormalML.g:16996:1: ( '}' )
+            // InternalFormalML.g:16997:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getRightCurlyBracketKeyword_12()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getRightCurlyBracketKeyword_12()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group__12__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_2__0"
+    // InternalFormalML.g:17007:1: rule__MachineBlock__Group_2__0 : rule__MachineBlock__Group_2__0__Impl rule__MachineBlock__Group_2__1 ;
+    public final void rule__MachineBlock__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17011:1: ( rule__MachineBlock__Group_2__0__Impl rule__MachineBlock__Group_2__1 )
+            // InternalFormalML.g:17012:2: rule__MachineBlock__Group_2__0__Impl rule__MachineBlock__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__MachineBlock__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_2__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_2__0__Impl"
+    // InternalFormalML.g:17019:1: rule__MachineBlock__Group_2__0__Impl : ( '<' ) ;
+    public final void rule__MachineBlock__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17023:1: ( ( '<' ) )
+            // InternalFormalML.g:17024:1: ( '<' )
+            {
+            // InternalFormalML.g:17024:1: ( '<' )
+            // InternalFormalML.g:17025:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getLessThanSignKeyword_2_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getLessThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_2__1"
+    // InternalFormalML.g:17034:1: rule__MachineBlock__Group_2__1 : rule__MachineBlock__Group_2__1__Impl rule__MachineBlock__Group_2__2 ;
+    public final void rule__MachineBlock__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17038:1: ( rule__MachineBlock__Group_2__1__Impl rule__MachineBlock__Group_2__2 )
+            // InternalFormalML.g:17039:2: rule__MachineBlock__Group_2__1__Impl rule__MachineBlock__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__MachineBlock__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_2__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_2__1__Impl"
+    // InternalFormalML.g:17046:1: rule__MachineBlock__Group_2__1__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__MachineBlock__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17050:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:17051:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:17051:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:17052:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getMocKeyword_2_1()); 
+            }
+            // InternalFormalML.g:17053:2: ( 'moc:' )?
+            int alt329=2;
+            int LA329_0 = input.LA(1);
+
+            if ( (LA329_0==201) ) {
+                alt329=1;
+            }
+            switch (alt329) {
+                case 1 :
+                    // InternalFormalML.g:17053:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getMocKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_2__2"
+    // InternalFormalML.g:17061:1: rule__MachineBlock__Group_2__2 : rule__MachineBlock__Group_2__2__Impl rule__MachineBlock__Group_2__3 ;
+    public final void rule__MachineBlock__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17065:1: ( rule__MachineBlock__Group_2__2__Impl rule__MachineBlock__Group_2__3 )
+            // InternalFormalML.g:17066:2: rule__MachineBlock__Group_2__2__Impl rule__MachineBlock__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__MachineBlock__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_2__2"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_2__2__Impl"
+    // InternalFormalML.g:17073:1: rule__MachineBlock__Group_2__2__Impl : ( ( rule__MachineBlock__Alternatives_2_2 ) ) ;
+    public final void rule__MachineBlock__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17077:1: ( ( ( rule__MachineBlock__Alternatives_2_2 ) ) )
+            // InternalFormalML.g:17078:1: ( ( rule__MachineBlock__Alternatives_2_2 ) )
+            {
+            // InternalFormalML.g:17078:1: ( ( rule__MachineBlock__Alternatives_2_2 ) )
+            // InternalFormalML.g:17079:2: ( rule__MachineBlock__Alternatives_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_2_2()); 
+            }
+            // InternalFormalML.g:17080:2: ( rule__MachineBlock__Alternatives_2_2 )
+            // InternalFormalML.g:17080:3: rule__MachineBlock__Alternatives_2_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Alternatives_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_2__3"
+    // InternalFormalML.g:17088:1: rule__MachineBlock__Group_2__3 : rule__MachineBlock__Group_2__3__Impl ;
+    public final void rule__MachineBlock__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17092:1: ( rule__MachineBlock__Group_2__3__Impl )
+            // InternalFormalML.g:17093:2: rule__MachineBlock__Group_2__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_2__3"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_2__3__Impl"
+    // InternalFormalML.g:17099:1: rule__MachineBlock__Group_2__3__Impl : ( '>' ) ;
+    public final void rule__MachineBlock__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17103:1: ( ( '>' ) )
+            // InternalFormalML.g:17104:1: ( '>' )
+            {
+            // InternalFormalML.g:17104:1: ( '>' )
+            // InternalFormalML.g:17105:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getGreaterThanSignKeyword_2_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getGreaterThanSignKeyword_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_0__0"
+    // InternalFormalML.g:17115:1: rule__MachineBlock__Group_7_0__0 : rule__MachineBlock__Group_7_0__0__Impl rule__MachineBlock__Group_7_0__1 ;
+    public final void rule__MachineBlock__Group_7_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17119:1: ( rule__MachineBlock__Group_7_0__0__Impl rule__MachineBlock__Group_7_0__1 )
+            // InternalFormalML.g:17120:2: rule__MachineBlock__Group_7_0__0__Impl rule__MachineBlock__Group_7_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__MachineBlock__Group_7_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_7_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_0__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_0__0__Impl"
+    // InternalFormalML.g:17127:1: rule__MachineBlock__Group_7_0__0__Impl : ( '@property:' ) ;
+    public final void rule__MachineBlock__Group_7_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17131:1: ( ( '@property:' ) )
+            // InternalFormalML.g:17132:1: ( '@property:' )
+            {
+            // InternalFormalML.g:17132:1: ( '@property:' )
+            // InternalFormalML.g:17133:2: '@property:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()); 
+            }
+            match(input,202,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_0__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_0__1"
+    // InternalFormalML.g:17142:1: rule__MachineBlock__Group_7_0__1 : rule__MachineBlock__Group_7_0__1__Impl ;
+    public final void rule__MachineBlock__Group_7_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17146:1: ( rule__MachineBlock__Group_7_0__1__Impl )
+            // InternalFormalML.g:17147:2: rule__MachineBlock__Group_7_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_7_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_0__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_0__1__Impl"
+    // InternalFormalML.g:17153:1: rule__MachineBlock__Group_7_0__1__Impl : ( ( rule__MachineBlock__Alternatives_7_0_1 )* ) ;
+    public final void rule__MachineBlock__Group_7_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17157:1: ( ( ( rule__MachineBlock__Alternatives_7_0_1 )* ) )
+            // InternalFormalML.g:17158:1: ( ( rule__MachineBlock__Alternatives_7_0_1 )* )
+            {
+            // InternalFormalML.g:17158:1: ( ( rule__MachineBlock__Alternatives_7_0_1 )* )
+            // InternalFormalML.g:17159:2: ( rule__MachineBlock__Alternatives_7_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_7_0_1()); 
+            }
+            // InternalFormalML.g:17160:2: ( rule__MachineBlock__Alternatives_7_0_1 )*
+            loop330:
+            do {
+                int alt330=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA330_2 = input.LA(2);
+
+                    if ( ((LA330_2>=15 && LA330_2<=19)||LA330_2==28||(LA330_2>=143 && LA330_2<=145)||LA330_2==179||LA330_2==229||(LA330_2>=278 && LA330_2<=283)) ) {
+                        alt330=1;
+                    }
+                    else if ( (LA330_2==224) ) {
+                        int LA330_6 = input.LA(3);
+
+                        if ( (LA330_6==RULE_XLIA_ID||(LA330_6>=15 && LA330_6<=18)||LA330_6==39||(LA330_6>=59 && LA330_6<=74)||(LA330_6>=129 && LA330_6<=132)||LA330_6==149||(LA330_6>=163 && LA330_6<=171)||(LA330_6>=231 && LA330_6<=237)||LA330_6==277||LA330_6==282) ) {
+                            alt330=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA330_3 = input.LA(2);
+
+                    if ( ((LA330_3>=15 && LA330_3<=19)||LA330_3==28||(LA330_3>=143 && LA330_3<=145)||LA330_3==179||LA330_3==229||(LA330_3>=278 && LA330_3<=283)) ) {
+                        alt330=1;
+                    }
+                    else if ( (LA330_3==224) ) {
+                        int LA330_6 = input.LA(3);
+
+                        if ( (LA330_6==RULE_XLIA_ID||(LA330_6>=15 && LA330_6<=18)||LA330_6==39||(LA330_6>=59 && LA330_6<=74)||(LA330_6>=129 && LA330_6<=132)||LA330_6==149||(LA330_6>=163 && LA330_6<=171)||(LA330_6>=231 && LA330_6<=237)||LA330_6==277||LA330_6==282) ) {
+                            alt330=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA330_4 = input.LA(2);
+
+                    if ( ((LA330_4>=15 && LA330_4<=19)||LA330_4==28||(LA330_4>=143 && LA330_4<=145)||LA330_4==179||LA330_4==229||(LA330_4>=278 && LA330_4<=283)) ) {
+                        alt330=1;
+                    }
+                    else if ( (LA330_4==224) ) {
+                        int LA330_6 = input.LA(3);
+
+                        if ( (LA330_6==RULE_XLIA_ID||(LA330_6>=15 && LA330_6<=18)||LA330_6==39||(LA330_6>=59 && LA330_6<=74)||(LA330_6>=129 && LA330_6<=132)||LA330_6==149||(LA330_6>=163 && LA330_6<=171)||(LA330_6>=231 && LA330_6<=237)||LA330_6==277||LA330_6==282) ) {
+                            alt330=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA330_5 = input.LA(2);
+
+                    if ( ((LA330_5>=15 && LA330_5<=19)||LA330_5==28||(LA330_5>=143 && LA330_5<=145)||LA330_5==179||LA330_5==229||(LA330_5>=278 && LA330_5<=283)) ) {
+                        alt330=1;
+                    }
+                    else if ( (LA330_5==224) ) {
+                        int LA330_6 = input.LA(3);
+
+                        if ( (LA330_6==RULE_XLIA_ID||(LA330_6>=15 && LA330_6<=18)||LA330_6==39||(LA330_6>=59 && LA330_6<=74)||(LA330_6>=129 && LA330_6<=132)||LA330_6==149||(LA330_6>=163 && LA330_6<=171)||(LA330_6>=231 && LA330_6<=237)||LA330_6==277||LA330_6==282) ) {
+                            alt330=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA330_6 = input.LA(2);
+
+                    if ( (LA330_6==RULE_XLIA_ID||(LA330_6>=15 && LA330_6<=18)||LA330_6==39||(LA330_6>=59 && LA330_6<=74)||(LA330_6>=129 && LA330_6<=132)||LA330_6==149||(LA330_6>=163 && LA330_6<=171)||(LA330_6>=231 && LA330_6<=237)||LA330_6==277||LA330_6==282) ) {
+                        alt330=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 282:
+                case 283:
+                    {
+                    alt330=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt330) {
+            	case 1 :
+            	    // InternalFormalML.g:17160:3: rule__MachineBlock__Alternatives_7_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__MachineBlock__Alternatives_7_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop330;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_7_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_0__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_1__0"
+    // InternalFormalML.g:17169:1: rule__MachineBlock__Group_7_1__0 : rule__MachineBlock__Group_7_1__0__Impl rule__MachineBlock__Group_7_1__1 ;
+    public final void rule__MachineBlock__Group_7_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17173:1: ( rule__MachineBlock__Group_7_1__0__Impl rule__MachineBlock__Group_7_1__1 )
+            // InternalFormalML.g:17174:2: rule__MachineBlock__Group_7_1__0__Impl rule__MachineBlock__Group_7_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__MachineBlock__Group_7_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_7_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_1__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_1__0__Impl"
+    // InternalFormalML.g:17181:1: rule__MachineBlock__Group_7_1__0__Impl : ( '@public:' ) ;
+    public final void rule__MachineBlock__Group_7_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17185:1: ( ( '@public:' ) )
+            // InternalFormalML.g:17186:1: ( '@public:' )
+            {
+            // InternalFormalML.g:17186:1: ( '@public:' )
+            // InternalFormalML.g:17187:2: '@public:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0()); 
+            }
+            match(input,203,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_1__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_1__1"
+    // InternalFormalML.g:17196:1: rule__MachineBlock__Group_7_1__1 : rule__MachineBlock__Group_7_1__1__Impl ;
+    public final void rule__MachineBlock__Group_7_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17200:1: ( rule__MachineBlock__Group_7_1__1__Impl )
+            // InternalFormalML.g:17201:2: rule__MachineBlock__Group_7_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_7_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_1__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_1__1__Impl"
+    // InternalFormalML.g:17207:1: rule__MachineBlock__Group_7_1__1__Impl : ( ( rule__MachineBlock__Alternatives_7_1_1 )* ) ;
+    public final void rule__MachineBlock__Group_7_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17211:1: ( ( ( rule__MachineBlock__Alternatives_7_1_1 )* ) )
+            // InternalFormalML.g:17212:1: ( ( rule__MachineBlock__Alternatives_7_1_1 )* )
+            {
+            // InternalFormalML.g:17212:1: ( ( rule__MachineBlock__Alternatives_7_1_1 )* )
+            // InternalFormalML.g:17213:2: ( rule__MachineBlock__Alternatives_7_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_7_1_1()); 
+            }
+            // InternalFormalML.g:17214:2: ( rule__MachineBlock__Alternatives_7_1_1 )*
+            loop331:
+            do {
+                int alt331=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA331_2 = input.LA(2);
+
+                    if ( (LA331_2==229) ) {
+                        alt331=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA331_3 = input.LA(2);
+
+                    if ( (LA331_3==229) ) {
+                        alt331=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA331_4 = input.LA(2);
+
+                    if ( (LA331_4==229) ) {
+                        alt331=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA331_5 = input.LA(2);
+
+                    if ( (LA331_5==229) ) {
+                        alt331=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA331_6 = input.LA(2);
+
+                    if ( (LA331_6==16||LA331_6==179||LA331_6==224||LA331_6==283) ) {
+                        alt331=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt331=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt331) {
+            	case 1 :
+            	    // InternalFormalML.g:17214:3: rule__MachineBlock__Alternatives_7_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__MachineBlock__Alternatives_7_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop331;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_7_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_1__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_2__0"
+    // InternalFormalML.g:17223:1: rule__MachineBlock__Group_7_2__0 : rule__MachineBlock__Group_7_2__0__Impl rule__MachineBlock__Group_7_2__1 ;
+    public final void rule__MachineBlock__Group_7_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17227:1: ( rule__MachineBlock__Group_7_2__0__Impl rule__MachineBlock__Group_7_2__1 )
+            // InternalFormalML.g:17228:2: rule__MachineBlock__Group_7_2__0__Impl rule__MachineBlock__Group_7_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__MachineBlock__Group_7_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_7_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_2__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_2__0__Impl"
+    // InternalFormalML.g:17235:1: rule__MachineBlock__Group_7_2__0__Impl : ( '@protected:' ) ;
+    public final void rule__MachineBlock__Group_7_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17239:1: ( ( '@protected:' ) )
+            // InternalFormalML.g:17240:1: ( '@protected:' )
+            {
+            // InternalFormalML.g:17240:1: ( '@protected:' )
+            // InternalFormalML.g:17241:2: '@protected:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()); 
+            }
+            match(input,204,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_2__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_2__1"
+    // InternalFormalML.g:17250:1: rule__MachineBlock__Group_7_2__1 : rule__MachineBlock__Group_7_2__1__Impl ;
+    public final void rule__MachineBlock__Group_7_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17254:1: ( rule__MachineBlock__Group_7_2__1__Impl )
+            // InternalFormalML.g:17255:2: rule__MachineBlock__Group_7_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_7_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_2__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_2__1__Impl"
+    // InternalFormalML.g:17261:1: rule__MachineBlock__Group_7_2__1__Impl : ( ( rule__MachineBlock__Alternatives_7_2_1 )* ) ;
+    public final void rule__MachineBlock__Group_7_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17265:1: ( ( ( rule__MachineBlock__Alternatives_7_2_1 )* ) )
+            // InternalFormalML.g:17266:1: ( ( rule__MachineBlock__Alternatives_7_2_1 )* )
+            {
+            // InternalFormalML.g:17266:1: ( ( rule__MachineBlock__Alternatives_7_2_1 )* )
+            // InternalFormalML.g:17267:2: ( rule__MachineBlock__Alternatives_7_2_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_7_2_1()); 
+            }
+            // InternalFormalML.g:17268:2: ( rule__MachineBlock__Alternatives_7_2_1 )*
+            loop332:
+            do {
+                int alt332=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA332_2 = input.LA(2);
+
+                    if ( (LA332_2==229) ) {
+                        alt332=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA332_3 = input.LA(2);
+
+                    if ( (LA332_3==229) ) {
+                        alt332=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA332_4 = input.LA(2);
+
+                    if ( (LA332_4==229) ) {
+                        alt332=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA332_5 = input.LA(2);
+
+                    if ( (LA332_5==229) ) {
+                        alt332=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA332_6 = input.LA(2);
+
+                    if ( (LA332_6==16||LA332_6==179||LA332_6==224||LA332_6==283) ) {
+                        alt332=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt332=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt332) {
+            	case 1 :
+            	    // InternalFormalML.g:17268:3: rule__MachineBlock__Alternatives_7_2_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__MachineBlock__Alternatives_7_2_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop332;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_7_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_2__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_3__0"
+    // InternalFormalML.g:17277:1: rule__MachineBlock__Group_7_3__0 : rule__MachineBlock__Group_7_3__0__Impl rule__MachineBlock__Group_7_3__1 ;
+    public final void rule__MachineBlock__Group_7_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17281:1: ( rule__MachineBlock__Group_7_3__0__Impl rule__MachineBlock__Group_7_3__1 )
+            // InternalFormalML.g:17282:2: rule__MachineBlock__Group_7_3__0__Impl rule__MachineBlock__Group_7_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__MachineBlock__Group_7_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_7_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_3__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_3__0__Impl"
+    // InternalFormalML.g:17289:1: rule__MachineBlock__Group_7_3__0__Impl : ( '@private:' ) ;
+    public final void rule__MachineBlock__Group_7_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17293:1: ( ( '@private:' ) )
+            // InternalFormalML.g:17294:1: ( '@private:' )
+            {
+            // InternalFormalML.g:17294:1: ( '@private:' )
+            // InternalFormalML.g:17295:2: '@private:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()); 
+            }
+            match(input,205,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_3__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_3__1"
+    // InternalFormalML.g:17304:1: rule__MachineBlock__Group_7_3__1 : rule__MachineBlock__Group_7_3__1__Impl ;
+    public final void rule__MachineBlock__Group_7_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17308:1: ( rule__MachineBlock__Group_7_3__1__Impl )
+            // InternalFormalML.g:17309:2: rule__MachineBlock__Group_7_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_7_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_3__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_7_3__1__Impl"
+    // InternalFormalML.g:17315:1: rule__MachineBlock__Group_7_3__1__Impl : ( ( rule__MachineBlock__Alternatives_7_3_1 )* ) ;
+    public final void rule__MachineBlock__Group_7_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17319:1: ( ( ( rule__MachineBlock__Alternatives_7_3_1 )* ) )
+            // InternalFormalML.g:17320:1: ( ( rule__MachineBlock__Alternatives_7_3_1 )* )
+            {
+            // InternalFormalML.g:17320:1: ( ( rule__MachineBlock__Alternatives_7_3_1 )* )
+            // InternalFormalML.g:17321:2: ( rule__MachineBlock__Alternatives_7_3_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_7_3_1()); 
+            }
+            // InternalFormalML.g:17322:2: ( rule__MachineBlock__Alternatives_7_3_1 )*
+            loop333:
+            do {
+                int alt333=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA333_2 = input.LA(2);
+
+                    if ( (LA333_2==229) ) {
+                        alt333=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA333_3 = input.LA(2);
+
+                    if ( (LA333_3==229) ) {
+                        alt333=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA333_4 = input.LA(2);
+
+                    if ( (LA333_4==229) ) {
+                        alt333=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA333_5 = input.LA(2);
+
+                    if ( (LA333_5==229) ) {
+                        alt333=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA333_6 = input.LA(2);
+
+                    if ( (LA333_6==16||LA333_6==179||LA333_6==224||LA333_6==283) ) {
+                        alt333=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt333=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt333) {
+            	case 1 :
+            	    // InternalFormalML.g:17322:3: rule__MachineBlock__Alternatives_7_3_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__MachineBlock__Alternatives_7_3_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop333;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_7_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_7_3__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_8_0_0__0"
+    // InternalFormalML.g:17331:1: rule__MachineBlock__Group_8_0_0__0 : rule__MachineBlock__Group_8_0_0__0__Impl rule__MachineBlock__Group_8_0_0__1 ;
+    public final void rule__MachineBlock__Group_8_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17335:1: ( rule__MachineBlock__Group_8_0_0__0__Impl rule__MachineBlock__Group_8_0_0__1 )
+            // InternalFormalML.g:17336:2: rule__MachineBlock__Group_8_0_0__0__Impl rule__MachineBlock__Group_8_0_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_42);
+            rule__MachineBlock__Group_8_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_8_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_8_0_0__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_8_0_0__0__Impl"
+    // InternalFormalML.g:17343:1: rule__MachineBlock__Group_8_0_0__0__Impl : ( ( rule__MachineBlock__Alternatives_8_0_0_0 ) ) ;
+    public final void rule__MachineBlock__Group_8_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17347:1: ( ( ( rule__MachineBlock__Alternatives_8_0_0_0 ) ) )
+            // InternalFormalML.g:17348:1: ( ( rule__MachineBlock__Alternatives_8_0_0_0 ) )
+            {
+            // InternalFormalML.g:17348:1: ( ( rule__MachineBlock__Alternatives_8_0_0_0 ) )
+            // InternalFormalML.g:17349:2: ( rule__MachineBlock__Alternatives_8_0_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_8_0_0_0()); 
+            }
+            // InternalFormalML.g:17350:2: ( rule__MachineBlock__Alternatives_8_0_0_0 )
+            // InternalFormalML.g:17350:3: rule__MachineBlock__Alternatives_8_0_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Alternatives_8_0_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_8_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_8_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_8_0_0__1"
+    // InternalFormalML.g:17358:1: rule__MachineBlock__Group_8_0_0__1 : rule__MachineBlock__Group_8_0_0__1__Impl ;
+    public final void rule__MachineBlock__Group_8_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17362:1: ( rule__MachineBlock__Group_8_0_0__1__Impl )
+            // InternalFormalML.g:17363:2: rule__MachineBlock__Group_8_0_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_8_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_8_0_0__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_8_0_0__1__Impl"
+    // InternalFormalML.g:17369:1: rule__MachineBlock__Group_8_0_0__1__Impl : ( ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 ) ) ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )* ) ) ;
+    public final void rule__MachineBlock__Group_8_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17373:1: ( ( ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 ) ) ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )* ) ) )
+            // InternalFormalML.g:17374:1: ( ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 ) ) ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )* ) )
+            {
+            // InternalFormalML.g:17374:1: ( ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 ) ) ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )* ) )
+            // InternalFormalML.g:17375:2: ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 ) ) ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )* )
+            {
+            // InternalFormalML.g:17375:2: ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 ) )
+            // InternalFormalML.g:17376:3: ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_0_0_1()); 
+            }
+            // InternalFormalML.g:17377:3: ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )
+            // InternalFormalML.g:17377:4: rule__MachineBlock__RoutineAssignment_8_0_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_43);
+            rule__MachineBlock__RoutineAssignment_8_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_0_0_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:17380:2: ( ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )* )
+            // InternalFormalML.g:17381:3: ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_0_0_1()); 
+            }
+            // InternalFormalML.g:17382:3: ( rule__MachineBlock__RoutineAssignment_8_0_0_1 )*
+            loop334:
+            do {
+                int alt334=2;
+                int LA334_0 = input.LA(1);
+
+                if ( (LA334_0==28||(LA334_0>=143 && LA334_0<=145)||(LA334_0>=224 && LA334_0<=225)) ) {
+                    alt334=1;
+                }
+
+
+                switch (alt334) {
+            	case 1 :
+            	    // InternalFormalML.g:17382:4: rule__MachineBlock__RoutineAssignment_8_0_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_43);
+            	    rule__MachineBlock__RoutineAssignment_8_0_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop334;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getRoutineAssignment_8_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_8_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_8_0_1__0"
+    // InternalFormalML.g:17392:1: rule__MachineBlock__Group_8_0_1__0 : rule__MachineBlock__Group_8_0_1__0__Impl rule__MachineBlock__Group_8_0_1__1 ;
+    public final void rule__MachineBlock__Group_8_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17396:1: ( rule__MachineBlock__Group_8_0_1__0__Impl rule__MachineBlock__Group_8_0_1__1 )
+            // InternalFormalML.g:17397:2: rule__MachineBlock__Group_8_0_1__0__Impl rule__MachineBlock__Group_8_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_44);
+            rule__MachineBlock__Group_8_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_8_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_8_0_1__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_8_0_1__0__Impl"
+    // InternalFormalML.g:17404:1: rule__MachineBlock__Group_8_0_1__0__Impl : ( '@procedure:' ) ;
+    public final void rule__MachineBlock__Group_8_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17408:1: ( ( '@procedure:' ) )
+            // InternalFormalML.g:17409:1: ( '@procedure:' )
+            {
+            // InternalFormalML.g:17409:1: ( '@procedure:' )
+            // InternalFormalML.g:17410:2: '@procedure:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getProcedureKeyword_8_0_1_0()); 
+            }
+            match(input,206,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getProcedureKeyword_8_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_8_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_8_0_1__1"
+    // InternalFormalML.g:17419:1: rule__MachineBlock__Group_8_0_1__1 : rule__MachineBlock__Group_8_0_1__1__Impl ;
+    public final void rule__MachineBlock__Group_8_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17423:1: ( rule__MachineBlock__Group_8_0_1__1__Impl )
+            // InternalFormalML.g:17424:2: rule__MachineBlock__Group_8_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_8_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_8_0_1__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_8_0_1__1__Impl"
+    // InternalFormalML.g:17430:1: rule__MachineBlock__Group_8_0_1__1__Impl : ( ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )* ) ) ;
+    public final void rule__MachineBlock__Group_8_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17434:1: ( ( ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )* ) ) )
+            // InternalFormalML.g:17435:1: ( ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )* ) )
+            {
+            // InternalFormalML.g:17435:1: ( ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )* ) )
+            // InternalFormalML.g:17436:2: ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 ) ) ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )* )
+            {
+            // InternalFormalML.g:17436:2: ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 ) )
+            // InternalFormalML.g:17437:3: ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_0_1_1()); 
+            }
+            // InternalFormalML.g:17438:3: ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )
+            // InternalFormalML.g:17438:4: rule__MachineBlock__ProcedureAssignment_8_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__MachineBlock__ProcedureAssignment_8_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_0_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:17441:2: ( ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )* )
+            // InternalFormalML.g:17442:3: ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_0_1_1()); 
+            }
+            // InternalFormalML.g:17443:3: ( rule__MachineBlock__ProcedureAssignment_8_0_1_1 )*
+            loop335:
+            do {
+                int alt335=2;
+                int LA335_0 = input.LA(1);
+
+                if ( (LA335_0==28||(LA335_0>=143 && LA335_0<=145)||LA335_0==214) ) {
+                    alt335=1;
+                }
+
+
+                switch (alt335) {
+            	case 1 :
+            	    // InternalFormalML.g:17443:4: rule__MachineBlock__ProcedureAssignment_8_0_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_5);
+            	    rule__MachineBlock__ProcedureAssignment_8_0_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop335;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getProcedureAssignment_8_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_8_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_0__0"
+    // InternalFormalML.g:17453:1: rule__MachineBlock__Group_9_0__0 : rule__MachineBlock__Group_9_0__0__Impl rule__MachineBlock__Group_9_0__1 ;
+    public final void rule__MachineBlock__Group_9_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17457:1: ( rule__MachineBlock__Group_9_0__0__Impl rule__MachineBlock__Group_9_0__1 )
+            // InternalFormalML.g:17458:2: rule__MachineBlock__Group_9_0__0__Impl rule__MachineBlock__Group_9_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_45);
+            rule__MachineBlock__Group_9_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_9_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_0__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_0__0__Impl"
+    // InternalFormalML.g:17465:1: rule__MachineBlock__Group_9_0__0__Impl : ( ( rule__MachineBlock__Alternatives_9_0_0 ) ) ;
+    public final void rule__MachineBlock__Group_9_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17469:1: ( ( ( rule__MachineBlock__Alternatives_9_0_0 ) ) )
+            // InternalFormalML.g:17470:1: ( ( rule__MachineBlock__Alternatives_9_0_0 ) )
+            {
+            // InternalFormalML.g:17470:1: ( ( rule__MachineBlock__Alternatives_9_0_0 ) )
+            // InternalFormalML.g:17471:2: ( rule__MachineBlock__Alternatives_9_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_0()); 
+            }
+            // InternalFormalML.g:17472:2: ( rule__MachineBlock__Alternatives_9_0_0 )
+            // InternalFormalML.g:17472:3: rule__MachineBlock__Alternatives_9_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Alternatives_9_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_0__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_0__1"
+    // InternalFormalML.g:17480:1: rule__MachineBlock__Group_9_0__1 : rule__MachineBlock__Group_9_0__1__Impl ;
+    public final void rule__MachineBlock__Group_9_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17484:1: ( rule__MachineBlock__Group_9_0__1__Impl )
+            // InternalFormalML.g:17485:2: rule__MachineBlock__Group_9_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_9_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_0__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_0__1__Impl"
+    // InternalFormalML.g:17491:1: rule__MachineBlock__Group_9_0__1__Impl : ( ( ( rule__MachineBlock__Alternatives_9_0_1 ) ) ( ( rule__MachineBlock__Alternatives_9_0_1 )* ) ) ;
+    public final void rule__MachineBlock__Group_9_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17495:1: ( ( ( ( rule__MachineBlock__Alternatives_9_0_1 ) ) ( ( rule__MachineBlock__Alternatives_9_0_1 )* ) ) )
+            // InternalFormalML.g:17496:1: ( ( ( rule__MachineBlock__Alternatives_9_0_1 ) ) ( ( rule__MachineBlock__Alternatives_9_0_1 )* ) )
+            {
+            // InternalFormalML.g:17496:1: ( ( ( rule__MachineBlock__Alternatives_9_0_1 ) ) ( ( rule__MachineBlock__Alternatives_9_0_1 )* ) )
+            // InternalFormalML.g:17497:2: ( ( rule__MachineBlock__Alternatives_9_0_1 ) ) ( ( rule__MachineBlock__Alternatives_9_0_1 )* )
+            {
+            // InternalFormalML.g:17497:2: ( ( rule__MachineBlock__Alternatives_9_0_1 ) )
+            // InternalFormalML.g:17498:3: ( rule__MachineBlock__Alternatives_9_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_1()); 
+            }
+            // InternalFormalML.g:17499:3: ( rule__MachineBlock__Alternatives_9_0_1 )
+            // InternalFormalML.g:17499:4: rule__MachineBlock__Alternatives_9_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_46);
+            rule__MachineBlock__Alternatives_9_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:17502:2: ( ( rule__MachineBlock__Alternatives_9_0_1 )* )
+            // InternalFormalML.g:17503:3: ( rule__MachineBlock__Alternatives_9_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_1()); 
+            }
+            // InternalFormalML.g:17504:3: ( rule__MachineBlock__Alternatives_9_0_1 )*
+            loop336:
+            do {
+                int alt336=2;
+                int LA336_0 = input.LA(1);
+
+                if ( (LA336_0==28||(LA336_0>=39 && LA336_0<=40)||(LA336_0>=143 && LA336_0<=147)||LA336_0==211||(LA336_0>=273 && LA336_0<=274)) ) {
+                    alt336=1;
+                }
+
+
+                switch (alt336) {
+            	case 1 :
+            	    // InternalFormalML.g:17504:4: rule__MachineBlock__Alternatives_9_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_46);
+            	    rule__MachineBlock__Alternatives_9_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop336;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getAlternatives_9_0_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_0__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_1__0"
+    // InternalFormalML.g:17514:1: rule__MachineBlock__Group_9_1__0 : rule__MachineBlock__Group_9_1__0__Impl rule__MachineBlock__Group_9_1__1 ;
+    public final void rule__MachineBlock__Group_9_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17518:1: ( rule__MachineBlock__Group_9_1__0__Impl rule__MachineBlock__Group_9_1__1 )
+            // InternalFormalML.g:17519:2: rule__MachineBlock__Group_9_1__0__Impl rule__MachineBlock__Group_9_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__MachineBlock__Group_9_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_9_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_1__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_1__0__Impl"
+    // InternalFormalML.g:17526:1: rule__MachineBlock__Group_9_1__0__Impl : ( '@model:' ) ;
+    public final void rule__MachineBlock__Group_9_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17530:1: ( ( '@model:' ) )
+            // InternalFormalML.g:17531:1: ( '@model:' )
+            {
+            // InternalFormalML.g:17531:1: ( '@model:' )
+            // InternalFormalML.g:17532:2: '@model:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()); 
+            }
+            match(input,207,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_1__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_1__1"
+    // InternalFormalML.g:17541:1: rule__MachineBlock__Group_9_1__1 : rule__MachineBlock__Group_9_1__1__Impl ;
+    public final void rule__MachineBlock__Group_9_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17545:1: ( rule__MachineBlock__Group_9_1__1__Impl )
+            // InternalFormalML.g:17546:2: rule__MachineBlock__Group_9_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_9_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_1__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_1__1__Impl"
+    // InternalFormalML.g:17552:1: rule__MachineBlock__Group_9_1__1__Impl : ( ( rule__MachineBlock__MachineAssignment_9_1_1 )* ) ;
+    public final void rule__MachineBlock__Group_9_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17556:1: ( ( ( rule__MachineBlock__MachineAssignment_9_1_1 )* ) )
+            // InternalFormalML.g:17557:1: ( ( rule__MachineBlock__MachineAssignment_9_1_1 )* )
+            {
+            // InternalFormalML.g:17557:1: ( ( rule__MachineBlock__MachineAssignment_9_1_1 )* )
+            // InternalFormalML.g:17558:2: ( rule__MachineBlock__MachineAssignment_9_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_1_1()); 
+            }
+            // InternalFormalML.g:17559:2: ( rule__MachineBlock__MachineAssignment_9_1_1 )*
+            loop337:
+            do {
+                int alt337=2;
+                int LA337_0 = input.LA(1);
+
+                if ( (LA337_0==28||(LA337_0>=39 && LA337_0<=40)||(LA337_0>=143 && LA337_0<=147)||(LA337_0>=273 && LA337_0<=274)) ) {
+                    alt337=1;
+                }
+
+
+                switch (alt337) {
+            	case 1 :
+            	    // InternalFormalML.g:17559:3: rule__MachineBlock__MachineAssignment_9_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_48);
+            	    rule__MachineBlock__MachineAssignment_9_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop337;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_1__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_2__0"
+    // InternalFormalML.g:17568:1: rule__MachineBlock__Group_9_2__0 : rule__MachineBlock__Group_9_2__0__Impl rule__MachineBlock__Group_9_2__1 ;
+    public final void rule__MachineBlock__Group_9_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17572:1: ( rule__MachineBlock__Group_9_2__0__Impl rule__MachineBlock__Group_9_2__1 )
+            // InternalFormalML.g:17573:2: rule__MachineBlock__Group_9_2__0__Impl rule__MachineBlock__Group_9_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__MachineBlock__Group_9_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_9_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_2__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_2__0__Impl"
+    // InternalFormalML.g:17580:1: rule__MachineBlock__Group_9_2__0__Impl : ( '@prototype:' ) ;
+    public final void rule__MachineBlock__Group_9_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17584:1: ( ( '@prototype:' ) )
+            // InternalFormalML.g:17585:1: ( '@prototype:' )
+            {
+            // InternalFormalML.g:17585:1: ( '@prototype:' )
+            // InternalFormalML.g:17586:2: '@prototype:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0()); 
+            }
+            match(input,208,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_2__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_2__1"
+    // InternalFormalML.g:17595:1: rule__MachineBlock__Group_9_2__1 : rule__MachineBlock__Group_9_2__1__Impl ;
+    public final void rule__MachineBlock__Group_9_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17599:1: ( rule__MachineBlock__Group_9_2__1__Impl )
+            // InternalFormalML.g:17600:2: rule__MachineBlock__Group_9_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_9_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_2__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_2__1__Impl"
+    // InternalFormalML.g:17606:1: rule__MachineBlock__Group_9_2__1__Impl : ( ( rule__MachineBlock__MachineAssignment_9_2_1 )* ) ;
+    public final void rule__MachineBlock__Group_9_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17610:1: ( ( ( rule__MachineBlock__MachineAssignment_9_2_1 )* ) )
+            // InternalFormalML.g:17611:1: ( ( rule__MachineBlock__MachineAssignment_9_2_1 )* )
+            {
+            // InternalFormalML.g:17611:1: ( ( rule__MachineBlock__MachineAssignment_9_2_1 )* )
+            // InternalFormalML.g:17612:2: ( rule__MachineBlock__MachineAssignment_9_2_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_2_1()); 
+            }
+            // InternalFormalML.g:17613:2: ( rule__MachineBlock__MachineAssignment_9_2_1 )*
+            loop338:
+            do {
+                int alt338=2;
+                int LA338_0 = input.LA(1);
+
+                if ( (LA338_0==28||(LA338_0>=39 && LA338_0<=40)||(LA338_0>=143 && LA338_0<=147)||(LA338_0>=273 && LA338_0<=274)) ) {
+                    alt338=1;
+                }
+
+
+                switch (alt338) {
+            	case 1 :
+            	    // InternalFormalML.g:17613:3: rule__MachineBlock__MachineAssignment_9_2_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_48);
+            	    rule__MachineBlock__MachineAssignment_9_2_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop338;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getMachineAssignment_9_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_2__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_3__0"
+    // InternalFormalML.g:17622:1: rule__MachineBlock__Group_9_3__0 : rule__MachineBlock__Group_9_3__0__Impl rule__MachineBlock__Group_9_3__1 ;
+    public final void rule__MachineBlock__Group_9_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17626:1: ( rule__MachineBlock__Group_9_3__0__Impl rule__MachineBlock__Group_9_3__1 )
+            // InternalFormalML.g:17627:2: rule__MachineBlock__Group_9_3__0__Impl rule__MachineBlock__Group_9_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_45);
+            rule__MachineBlock__Group_9_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_9_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_3__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_3__0__Impl"
+    // InternalFormalML.g:17634:1: rule__MachineBlock__Group_9_3__0__Impl : ( '@instance:' ) ;
+    public final void rule__MachineBlock__Group_9_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17638:1: ( ( '@instance:' ) )
+            // InternalFormalML.g:17639:1: ( '@instance:' )
+            {
+            // InternalFormalML.g:17639:1: ( '@instance:' )
+            // InternalFormalML.g:17640:2: '@instance:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()); 
+            }
+            match(input,209,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_3__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_3__1"
+    // InternalFormalML.g:17649:1: rule__MachineBlock__Group_9_3__1 : rule__MachineBlock__Group_9_3__1__Impl ;
+    public final void rule__MachineBlock__Group_9_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17653:1: ( rule__MachineBlock__Group_9_3__1__Impl )
+            // InternalFormalML.g:17654:2: rule__MachineBlock__Group_9_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_9_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_3__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_9_3__1__Impl"
+    // InternalFormalML.g:17660:1: rule__MachineBlock__Group_9_3__1__Impl : ( ( rule__MachineBlock__InstanceAssignment_9_3_1 )* ) ;
+    public final void rule__MachineBlock__Group_9_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17664:1: ( ( ( rule__MachineBlock__InstanceAssignment_9_3_1 )* ) )
+            // InternalFormalML.g:17665:1: ( ( rule__MachineBlock__InstanceAssignment_9_3_1 )* )
+            {
+            // InternalFormalML.g:17665:1: ( ( rule__MachineBlock__InstanceAssignment_9_3_1 )* )
+            // InternalFormalML.g:17666:2: ( rule__MachineBlock__InstanceAssignment_9_3_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_3_1()); 
+            }
+            // InternalFormalML.g:17667:2: ( rule__MachineBlock__InstanceAssignment_9_3_1 )*
+            loop339:
+            do {
+                int alt339=2;
+                int LA339_0 = input.LA(1);
+
+                if ( (LA339_0==211) ) {
+                    alt339=1;
+                }
+
+
+                switch (alt339) {
+            	case 1 :
+            	    // InternalFormalML.g:17667:3: rule__MachineBlock__InstanceAssignment_9_3_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_46);
+            	    rule__MachineBlock__InstanceAssignment_9_3_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop339;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getInstanceAssignment_9_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_9_3__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_10_0__0"
+    // InternalFormalML.g:17676:1: rule__MachineBlock__Group_10_0__0 : rule__MachineBlock__Group_10_0__0__Impl rule__MachineBlock__Group_10_0__1 ;
+    public final void rule__MachineBlock__Group_10_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17680:1: ( rule__MachineBlock__Group_10_0__0__Impl rule__MachineBlock__Group_10_0__1 )
+            // InternalFormalML.g:17681:2: rule__MachineBlock__Group_10_0__0__Impl rule__MachineBlock__Group_10_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__MachineBlock__Group_10_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_10_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_10_0__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_10_0__0__Impl"
+    // InternalFormalML.g:17688:1: rule__MachineBlock__Group_10_0__0__Impl : ( '@behavior:' ) ;
+    public final void rule__MachineBlock__Group_10_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17692:1: ( ( '@behavior:' ) )
+            // InternalFormalML.g:17693:1: ( '@behavior:' )
+            {
+            // InternalFormalML.g:17693:1: ( '@behavior:' )
+            // InternalFormalML.g:17694:2: '@behavior:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBehaviorKeyword_10_0_0()); 
+            }
+            match(input,210,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBehaviorKeyword_10_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_10_0__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_10_0__1"
+    // InternalFormalML.g:17703:1: rule__MachineBlock__Group_10_0__1 : rule__MachineBlock__Group_10_0__1__Impl ;
+    public final void rule__MachineBlock__Group_10_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17707:1: ( rule__MachineBlock__Group_10_0__1__Impl )
+            // InternalFormalML.g:17708:2: rule__MachineBlock__Group_10_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_10_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_10_0__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_10_0__1__Impl"
+    // InternalFormalML.g:17714:1: rule__MachineBlock__Group_10_0__1__Impl : ( ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 )* ) ) ;
+    public final void rule__MachineBlock__Group_10_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17718:1: ( ( ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 )* ) ) )
+            // InternalFormalML.g:17719:1: ( ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 )* ) )
+            {
+            // InternalFormalML.g:17719:1: ( ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 )* ) )
+            // InternalFormalML.g:17720:2: ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 )* )
+            {
+            // InternalFormalML.g:17720:2: ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 ) )
+            // InternalFormalML.g:17721:3: ( rule__MachineBlock__BehaviorAssignment_10_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_0_1()); 
+            }
+            // InternalFormalML.g:17722:3: ( rule__MachineBlock__BehaviorAssignment_10_0_1 )
+            // InternalFormalML.g:17722:4: rule__MachineBlock__BehaviorAssignment_10_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_48);
+            rule__MachineBlock__BehaviorAssignment_10_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_0_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:17725:2: ( ( rule__MachineBlock__BehaviorAssignment_10_0_1 )* )
+            // InternalFormalML.g:17726:3: ( rule__MachineBlock__BehaviorAssignment_10_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_0_1()); 
+            }
+            // InternalFormalML.g:17727:3: ( rule__MachineBlock__BehaviorAssignment_10_0_1 )*
+            loop340:
+            do {
+                int alt340=2;
+                int LA340_0 = input.LA(1);
+
+                if ( (LA340_0==28||LA340_0==40||(LA340_0>=143 && LA340_0<=147)||(LA340_0>=273 && LA340_0<=274)) ) {
+                    alt340=1;
+                }
+
+
+                switch (alt340) {
+            	case 1 :
+            	    // InternalFormalML.g:17727:4: rule__MachineBlock__BehaviorAssignment_10_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_48);
+            	    rule__MachineBlock__BehaviorAssignment_10_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop340;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_0_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_10_0__1__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_10_1__0"
+    // InternalFormalML.g:17737:1: rule__MachineBlock__Group_10_1__0 : rule__MachineBlock__Group_10_1__0__Impl rule__MachineBlock__Group_10_1__1 ;
+    public final void rule__MachineBlock__Group_10_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17741:1: ( rule__MachineBlock__Group_10_1__0__Impl rule__MachineBlock__Group_10_1__1 )
+            // InternalFormalML.g:17742:2: rule__MachineBlock__Group_10_1__0__Impl rule__MachineBlock__Group_10_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__MachineBlock__Group_10_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_10_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_10_1__0"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_10_1__0__Impl"
+    // InternalFormalML.g:17749:1: rule__MachineBlock__Group_10_1__0__Impl : ( '@statemachine:' ) ;
+    public final void rule__MachineBlock__Group_10_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17753:1: ( ( '@statemachine:' ) )
+            // InternalFormalML.g:17754:1: ( '@statemachine:' )
+            {
+            // InternalFormalML.g:17754:1: ( '@statemachine:' )
+            // InternalFormalML.g:17755:2: '@statemachine:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getStatemachineKeyword_10_1_0()); 
+            }
+            match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getStatemachineKeyword_10_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_10_1__0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_10_1__1"
+    // InternalFormalML.g:17764:1: rule__MachineBlock__Group_10_1__1 : rule__MachineBlock__Group_10_1__1__Impl ;
+    public final void rule__MachineBlock__Group_10_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17768:1: ( rule__MachineBlock__Group_10_1__1__Impl )
+            // InternalFormalML.g:17769:2: rule__MachineBlock__Group_10_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__Group_10_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_10_1__1"
+
+
+    // $ANTLR start "rule__MachineBlock__Group_10_1__1__Impl"
+    // InternalFormalML.g:17775:1: rule__MachineBlock__Group_10_1__1__Impl : ( ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 )* ) ) ;
+    public final void rule__MachineBlock__Group_10_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17779:1: ( ( ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 )* ) ) )
+            // InternalFormalML.g:17780:1: ( ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 )* ) )
+            {
+            // InternalFormalML.g:17780:1: ( ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 )* ) )
+            // InternalFormalML.g:17781:2: ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 ) ) ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 )* )
+            {
+            // InternalFormalML.g:17781:2: ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 ) )
+            // InternalFormalML.g:17782:3: ( rule__MachineBlock__BehaviorAssignment_10_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_1_1()); 
+            }
+            // InternalFormalML.g:17783:3: ( rule__MachineBlock__BehaviorAssignment_10_1_1 )
+            // InternalFormalML.g:17783:4: rule__MachineBlock__BehaviorAssignment_10_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_48);
+            rule__MachineBlock__BehaviorAssignment_10_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:17786:2: ( ( rule__MachineBlock__BehaviorAssignment_10_1_1 )* )
+            // InternalFormalML.g:17787:3: ( rule__MachineBlock__BehaviorAssignment_10_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_1_1()); 
+            }
+            // InternalFormalML.g:17788:3: ( rule__MachineBlock__BehaviorAssignment_10_1_1 )*
+            loop341:
+            do {
+                int alt341=2;
+                int LA341_0 = input.LA(1);
+
+                if ( (LA341_0==28||LA341_0==40||(LA341_0>=143 && LA341_0<=147)||(LA341_0>=273 && LA341_0<=274)) ) {
+                    alt341=1;
+                }
+
+
+                switch (alt341) {
+            	case 1 :
+            	    // InternalFormalML.g:17788:4: rule__MachineBlock__BehaviorAssignment_10_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_48);
+            	    rule__MachineBlock__BehaviorAssignment_10_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop341;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBehaviorAssignment_10_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Group_10_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__0"
+    // InternalFormalML.g:17798:1: rule__Procedure__Group__0 : rule__Procedure__Group__0__Impl rule__Procedure__Group__1 ;
+    public final void rule__Procedure__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17802:1: ( rule__Procedure__Group__0__Impl rule__Procedure__Group__1 )
+            // InternalFormalML.g:17803:2: rule__Procedure__Group__0__Impl rule__Procedure__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_44);
+            rule__Procedure__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__0"
+
+
+    // $ANTLR start "rule__Procedure__Group__0__Impl"
+    // InternalFormalML.g:17810:1: rule__Procedure__Group__0__Impl : ( ( rule__Procedure__VisibilityAssignment_0 )? ) ;
+    public final void rule__Procedure__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17814:1: ( ( ( rule__Procedure__VisibilityAssignment_0 )? ) )
+            // InternalFormalML.g:17815:1: ( ( rule__Procedure__VisibilityAssignment_0 )? )
+            {
+            // InternalFormalML.g:17815:1: ( ( rule__Procedure__VisibilityAssignment_0 )? )
+            // InternalFormalML.g:17816:2: ( rule__Procedure__VisibilityAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:17817:2: ( rule__Procedure__VisibilityAssignment_0 )?
+            int alt342=2;
+            int LA342_0 = input.LA(1);
+
+            if ( (LA342_0==28||(LA342_0>=143 && LA342_0<=145)) ) {
+                alt342=1;
+            }
+            switch (alt342) {
+                case 1 :
+                    // InternalFormalML.g:17817:3: rule__Procedure__VisibilityAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__VisibilityAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__1"
+    // InternalFormalML.g:17825:1: rule__Procedure__Group__1 : rule__Procedure__Group__1__Impl rule__Procedure__Group__2 ;
+    public final void rule__Procedure__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17829:1: ( rule__Procedure__Group__1__Impl rule__Procedure__Group__2 )
+            // InternalFormalML.g:17830:2: rule__Procedure__Group__1__Impl rule__Procedure__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__Procedure__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__1"
+
+
+    // $ANTLR start "rule__Procedure__Group__1__Impl"
+    // InternalFormalML.g:17837:1: rule__Procedure__Group__1__Impl : ( 'procedure' ) ;
+    public final void rule__Procedure__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17841:1: ( ( 'procedure' ) )
+            // InternalFormalML.g:17842:1: ( 'procedure' )
+            {
+            // InternalFormalML.g:17842:1: ( 'procedure' )
+            // InternalFormalML.g:17843:2: 'procedure'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getProcedureKeyword_1()); 
+            }
+            match(input,214,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getProcedureKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__2"
+    // InternalFormalML.g:17852:1: rule__Procedure__Group__2 : rule__Procedure__Group__2__Impl rule__Procedure__Group__3 ;
+    public final void rule__Procedure__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17856:1: ( rule__Procedure__Group__2__Impl rule__Procedure__Group__3 )
+            // InternalFormalML.g:17857:2: rule__Procedure__Group__2__Impl rule__Procedure__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__Procedure__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__2"
+
+
+    // $ANTLR start "rule__Procedure__Group__2__Impl"
+    // InternalFormalML.g:17864:1: rule__Procedure__Group__2__Impl : ( ( rule__Procedure__Group_2__0 )? ) ;
+    public final void rule__Procedure__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17868:1: ( ( ( rule__Procedure__Group_2__0 )? ) )
+            // InternalFormalML.g:17869:1: ( ( rule__Procedure__Group_2__0 )? )
+            {
+            // InternalFormalML.g:17869:1: ( ( rule__Procedure__Group_2__0 )? )
+            // InternalFormalML.g:17870:2: ( rule__Procedure__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:17871:2: ( rule__Procedure__Group_2__0 )?
+            int alt343=2;
+            int LA343_0 = input.LA(1);
+
+            if ( (LA343_0==125) ) {
+                alt343=1;
+            }
+            switch (alt343) {
+                case 1 :
+                    // InternalFormalML.g:17871:3: rule__Procedure__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__3"
+    // InternalFormalML.g:17879:1: rule__Procedure__Group__3 : rule__Procedure__Group__3__Impl rule__Procedure__Group__4 ;
+    public final void rule__Procedure__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17883:1: ( rule__Procedure__Group__3__Impl rule__Procedure__Group__4 )
+            // InternalFormalML.g:17884:2: rule__Procedure__Group__3__Impl rule__Procedure__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_57);
+            rule__Procedure__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__3"
+
+
+    // $ANTLR start "rule__Procedure__Group__3__Impl"
+    // InternalFormalML.g:17891:1: rule__Procedure__Group__3__Impl : ( ( rule__Procedure__NameAssignment_3 ) ) ;
+    public final void rule__Procedure__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17895:1: ( ( ( rule__Procedure__NameAssignment_3 ) ) )
+            // InternalFormalML.g:17896:1: ( ( rule__Procedure__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:17896:1: ( ( rule__Procedure__NameAssignment_3 ) )
+            // InternalFormalML.g:17897:2: ( rule__Procedure__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:17898:2: ( rule__Procedure__NameAssignment_3 )
+            // InternalFormalML.g:17898:3: rule__Procedure__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__4"
+    // InternalFormalML.g:17906:1: rule__Procedure__Group__4 : rule__Procedure__Group__4__Impl rule__Procedure__Group__5 ;
+    public final void rule__Procedure__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17910:1: ( rule__Procedure__Group__4__Impl rule__Procedure__Group__5 )
+            // InternalFormalML.g:17911:2: rule__Procedure__Group__4__Impl rule__Procedure__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_57);
+            rule__Procedure__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__4"
+
+
+    // $ANTLR start "rule__Procedure__Group__4__Impl"
+    // InternalFormalML.g:17918:1: rule__Procedure__Group__4__Impl : ( ( rule__Procedure__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__Procedure__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17922:1: ( ( ( rule__Procedure__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:17923:1: ( ( rule__Procedure__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:17923:1: ( ( rule__Procedure__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:17924:2: ( rule__Procedure__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:17925:2: ( rule__Procedure__UnrestrictedNameAssignment_4 )?
+            int alt344=2;
+            int LA344_0 = input.LA(1);
+
+            if ( (LA344_0==RULE_STRING) ) {
+                alt344=1;
+            }
+            switch (alt344) {
+                case 1 :
+                    // InternalFormalML.g:17925:3: rule__Procedure__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__5"
+    // InternalFormalML.g:17933:1: rule__Procedure__Group__5 : rule__Procedure__Group__5__Impl rule__Procedure__Group__6 ;
+    public final void rule__Procedure__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17937:1: ( rule__Procedure__Group__5__Impl rule__Procedure__Group__6 )
+            // InternalFormalML.g:17938:2: rule__Procedure__Group__5__Impl rule__Procedure__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_57);
+            rule__Procedure__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__5"
+
+
+    // $ANTLR start "rule__Procedure__Group__5__Impl"
+    // InternalFormalML.g:17945:1: rule__Procedure__Group__5__Impl : ( ( rule__Procedure__Group_5__0 )? ) ;
+    public final void rule__Procedure__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17949:1: ( ( ( rule__Procedure__Group_5__0 )? ) )
+            // InternalFormalML.g:17950:1: ( ( rule__Procedure__Group_5__0 )? )
+            {
+            // InternalFormalML.g:17950:1: ( ( rule__Procedure__Group_5__0 )? )
+            // InternalFormalML.g:17951:2: ( rule__Procedure__Group_5__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getGroup_5()); 
+            }
+            // InternalFormalML.g:17952:2: ( rule__Procedure__Group_5__0 )?
+            int alt345=2;
+            int LA345_0 = input.LA(1);
+
+            if ( (LA345_0==23||LA345_0==215) ) {
+                alt345=1;
+            }
+            else if ( (LA345_0==199) ) {
+                int LA345_2 = input.LA(2);
+
+                if ( (synpred632_InternalFormalML()) ) {
+                    alt345=1;
+                }
+            }
+            switch (alt345) {
+                case 1 :
+                    // InternalFormalML.g:17952:3: rule__Procedure__Group_5__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getGroup_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__6"
+    // InternalFormalML.g:17960:1: rule__Procedure__Group__6 : rule__Procedure__Group__6__Impl rule__Procedure__Group__7 ;
+    public final void rule__Procedure__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17964:1: ( rule__Procedure__Group__6__Impl rule__Procedure__Group__7 )
+            // InternalFormalML.g:17965:2: rule__Procedure__Group__6__Impl rule__Procedure__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_58);
+            rule__Procedure__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__6"
+
+
+    // $ANTLR start "rule__Procedure__Group__6__Impl"
+    // InternalFormalML.g:17972:1: rule__Procedure__Group__6__Impl : ( '{' ) ;
+    public final void rule__Procedure__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17976:1: ( ( '{' ) )
+            // InternalFormalML.g:17977:1: ( '{' )
+            {
+            // InternalFormalML.g:17977:1: ( '{' )
+            // InternalFormalML.g:17978:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__7"
+    // InternalFormalML.g:17987:1: rule__Procedure__Group__7 : rule__Procedure__Group__7__Impl rule__Procedure__Group__8 ;
+    public final void rule__Procedure__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:17991:1: ( rule__Procedure__Group__7__Impl rule__Procedure__Group__8 )
+            // InternalFormalML.g:17992:2: rule__Procedure__Group__7__Impl rule__Procedure__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_59);
+            rule__Procedure__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__7"
+
+
+    // $ANTLR start "rule__Procedure__Group__7__Impl"
+    // InternalFormalML.g:17999:1: rule__Procedure__Group__7__Impl : ( ( rule__Procedure__Alternatives_7 ) ) ;
+    public final void rule__Procedure__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18003:1: ( ( ( rule__Procedure__Alternatives_7 ) ) )
+            // InternalFormalML.g:18004:1: ( ( rule__Procedure__Alternatives_7 ) )
+            {
+            // InternalFormalML.g:18004:1: ( ( rule__Procedure__Alternatives_7 ) )
+            // InternalFormalML.g:18005:2: ( rule__Procedure__Alternatives_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_7()); 
+            }
+            // InternalFormalML.g:18006:2: ( rule__Procedure__Alternatives_7 )
+            // InternalFormalML.g:18006:3: rule__Procedure__Alternatives_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Alternatives_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__7__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__8"
+    // InternalFormalML.g:18014:1: rule__Procedure__Group__8 : rule__Procedure__Group__8__Impl rule__Procedure__Group__9 ;
+    public final void rule__Procedure__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18018:1: ( rule__Procedure__Group__8__Impl rule__Procedure__Group__9 )
+            // InternalFormalML.g:18019:2: rule__Procedure__Group__8__Impl rule__Procedure__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_59);
+            rule__Procedure__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__8"
+
+
+    // $ANTLR start "rule__Procedure__Group__8__Impl"
+    // InternalFormalML.g:18026:1: rule__Procedure__Group__8__Impl : ( ( rule__Procedure__Alternatives_8 )* ) ;
+    public final void rule__Procedure__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18030:1: ( ( ( rule__Procedure__Alternatives_8 )* ) )
+            // InternalFormalML.g:18031:1: ( ( rule__Procedure__Alternatives_8 )* )
+            {
+            // InternalFormalML.g:18031:1: ( ( rule__Procedure__Alternatives_8 )* )
+            // InternalFormalML.g:18032:2: ( rule__Procedure__Alternatives_8 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:18033:2: ( rule__Procedure__Alternatives_8 )*
+            loop346:
+            do {
+                int alt346=2;
+                int LA346_0 = input.LA(1);
+
+                if ( ((LA346_0>=217 && LA346_0<=220)) ) {
+                    alt346=1;
+                }
+
+
+                switch (alt346) {
+            	case 1 :
+            	    // InternalFormalML.g:18033:3: rule__Procedure__Alternatives_8
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_60);
+            	    rule__Procedure__Alternatives_8();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop346;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__8__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__9"
+    // InternalFormalML.g:18041:1: rule__Procedure__Group__9 : rule__Procedure__Group__9__Impl rule__Procedure__Group__10 ;
+    public final void rule__Procedure__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18045:1: ( rule__Procedure__Group__9__Impl rule__Procedure__Group__10 )
+            // InternalFormalML.g:18046:2: rule__Procedure__Group__9__Impl rule__Procedure__Group__10
+            {
+            pushFollow(FollowSets000.FOLLOW_59);
+            rule__Procedure__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__9"
+
+
+    // $ANTLR start "rule__Procedure__Group__9__Impl"
+    // InternalFormalML.g:18053:1: rule__Procedure__Group__9__Impl : ( ( rule__Procedure__Alternatives_9 )* ) ;
+    public final void rule__Procedure__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18057:1: ( ( ( rule__Procedure__Alternatives_9 )* ) )
+            // InternalFormalML.g:18058:1: ( ( rule__Procedure__Alternatives_9 )* )
+            {
+            // InternalFormalML.g:18058:1: ( ( rule__Procedure__Alternatives_9 )* )
+            // InternalFormalML.g:18059:2: ( rule__Procedure__Alternatives_9 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_9()); 
+            }
+            // InternalFormalML.g:18060:2: ( rule__Procedure__Alternatives_9 )*
+            loop347:
+            do {
+                int alt347=2;
+                int LA347_0 = input.LA(1);
+
+                if ( ((LA347_0>=202 && LA347_0<=205)) ) {
+                    alt347=1;
+                }
+
+
+                switch (alt347) {
+            	case 1 :
+            	    // InternalFormalML.g:18060:3: rule__Procedure__Alternatives_9
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_32);
+            	    rule__Procedure__Alternatives_9();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop347;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__9__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__10"
+    // InternalFormalML.g:18068:1: rule__Procedure__Group__10 : rule__Procedure__Group__10__Impl rule__Procedure__Group__11 ;
+    public final void rule__Procedure__Group__10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18072:1: ( rule__Procedure__Group__10__Impl rule__Procedure__Group__11 )
+            // InternalFormalML.g:18073:2: rule__Procedure__Group__10__Impl rule__Procedure__Group__11
+            {
+            pushFollow(FollowSets000.FOLLOW_61);
+            rule__Procedure__Group__10__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__10"
+
+
+    // $ANTLR start "rule__Procedure__Group__10__Impl"
+    // InternalFormalML.g:18080:1: rule__Procedure__Group__10__Impl : ( ( rule__Procedure__Alternatives_10 ) ) ;
+    public final void rule__Procedure__Group__10__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18084:1: ( ( ( rule__Procedure__Alternatives_10 ) ) )
+            // InternalFormalML.g:18085:1: ( ( rule__Procedure__Alternatives_10 ) )
+            {
+            // InternalFormalML.g:18085:1: ( ( rule__Procedure__Alternatives_10 ) )
+            // InternalFormalML.g:18086:2: ( rule__Procedure__Alternatives_10 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_10()); 
+            }
+            // InternalFormalML.g:18087:2: ( rule__Procedure__Alternatives_10 )
+            // InternalFormalML.g:18087:3: rule__Procedure__Alternatives_10
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Alternatives_10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_10()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__10__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__11"
+    // InternalFormalML.g:18095:1: rule__Procedure__Group__11 : rule__Procedure__Group__11__Impl rule__Procedure__Group__12 ;
+    public final void rule__Procedure__Group__11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18099:1: ( rule__Procedure__Group__11__Impl rule__Procedure__Group__12 )
+            // InternalFormalML.g:18100:2: rule__Procedure__Group__11__Impl rule__Procedure__Group__12
+            {
+            pushFollow(FollowSets000.FOLLOW_61);
+            rule__Procedure__Group__11__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__12();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__11"
+
+
+    // $ANTLR start "rule__Procedure__Group__11__Impl"
+    // InternalFormalML.g:18107:1: rule__Procedure__Group__11__Impl : ( ( rule__Procedure__Alternatives_11 )? ) ;
+    public final void rule__Procedure__Group__11__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18111:1: ( ( ( rule__Procedure__Alternatives_11 )? ) )
+            // InternalFormalML.g:18112:1: ( ( rule__Procedure__Alternatives_11 )? )
+            {
+            // InternalFormalML.g:18112:1: ( ( rule__Procedure__Alternatives_11 )? )
+            // InternalFormalML.g:18113:2: ( rule__Procedure__Alternatives_11 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_11()); 
+            }
+            // InternalFormalML.g:18114:2: ( rule__Procedure__Alternatives_11 )?
+            int alt348=2;
+            int LA348_0 = input.LA(1);
+
+            if ( ((LA348_0>=41 && LA348_0<=44)||(LA348_0>=54 && LA348_0<=57)||(LA348_0>=275 && LA348_0<=276)) ) {
+                alt348=1;
+            }
+            switch (alt348) {
+                case 1 :
+                    // InternalFormalML.g:18114:3: rule__Procedure__Alternatives_11
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Alternatives_11();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_11()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__11__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__12"
+    // InternalFormalML.g:18122:1: rule__Procedure__Group__12 : rule__Procedure__Group__12__Impl rule__Procedure__Group__13 ;
+    public final void rule__Procedure__Group__12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18126:1: ( rule__Procedure__Group__12__Impl rule__Procedure__Group__13 )
+            // InternalFormalML.g:18127:2: rule__Procedure__Group__12__Impl rule__Procedure__Group__13
+            {
+            pushFollow(FollowSets000.FOLLOW_61);
+            rule__Procedure__Group__12__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__13();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__12"
+
+
+    // $ANTLR start "rule__Procedure__Group__12__Impl"
+    // InternalFormalML.g:18134:1: rule__Procedure__Group__12__Impl : ( ( rule__Procedure__ExecutionAssignment_12 )? ) ;
+    public final void rule__Procedure__Group__12__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18138:1: ( ( ( rule__Procedure__ExecutionAssignment_12 )? ) )
+            // InternalFormalML.g:18139:1: ( ( rule__Procedure__ExecutionAssignment_12 )? )
+            {
+            // InternalFormalML.g:18139:1: ( ( rule__Procedure__ExecutionAssignment_12 )? )
+            // InternalFormalML.g:18140:2: ( rule__Procedure__ExecutionAssignment_12 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getExecutionAssignment_12()); 
+            }
+            // InternalFormalML.g:18141:2: ( rule__Procedure__ExecutionAssignment_12 )?
+            int alt349=2;
+            int LA349_0 = input.LA(1);
+
+            if ( (LA349_0==51||LA349_0==53||LA349_0==221) ) {
+                alt349=1;
+            }
+            else if ( (LA349_0==200) ) {
+                int LA349_2 = input.LA(2);
+
+                if ( (synpred636_InternalFormalML()) ) {
+                    alt349=1;
+                }
+            }
+            switch (alt349) {
+                case 1 :
+                    // InternalFormalML.g:18141:3: rule__Procedure__ExecutionAssignment_12
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__ExecutionAssignment_12();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getExecutionAssignment_12()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__12__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group__13"
+    // InternalFormalML.g:18149:1: rule__Procedure__Group__13 : rule__Procedure__Group__13__Impl ;
+    public final void rule__Procedure__Group__13() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18153:1: ( rule__Procedure__Group__13__Impl )
+            // InternalFormalML.g:18154:2: rule__Procedure__Group__13__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group__13__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__13"
+
+
+    // $ANTLR start "rule__Procedure__Group__13__Impl"
+    // InternalFormalML.g:18160:1: rule__Procedure__Group__13__Impl : ( '}' ) ;
+    public final void rule__Procedure__Group__13__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18164:1: ( ( '}' ) )
+            // InternalFormalML.g:18165:1: ( '}' )
+            {
+            // InternalFormalML.g:18165:1: ( '}' )
+            // InternalFormalML.g:18166:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_13()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_13()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group__13__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_2__0"
+    // InternalFormalML.g:18176:1: rule__Procedure__Group_2__0 : rule__Procedure__Group_2__0__Impl rule__Procedure__Group_2__1 ;
+    public final void rule__Procedure__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18180:1: ( rule__Procedure__Group_2__0__Impl rule__Procedure__Group_2__1 )
+            // InternalFormalML.g:18181:2: rule__Procedure__Group_2__0__Impl rule__Procedure__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__Procedure__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_2__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_2__0__Impl"
+    // InternalFormalML.g:18188:1: rule__Procedure__Group_2__0__Impl : ( '<' ) ;
+    public final void rule__Procedure__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18192:1: ( ( '<' ) )
+            // InternalFormalML.g:18193:1: ( '<' )
+            {
+            // InternalFormalML.g:18193:1: ( '<' )
+            // InternalFormalML.g:18194:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLessThanSignKeyword_2_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLessThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_2__1"
+    // InternalFormalML.g:18203:1: rule__Procedure__Group_2__1 : rule__Procedure__Group_2__1__Impl rule__Procedure__Group_2__2 ;
+    public final void rule__Procedure__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18207:1: ( rule__Procedure__Group_2__1__Impl rule__Procedure__Group_2__2 )
+            // InternalFormalML.g:18208:2: rule__Procedure__Group_2__1__Impl rule__Procedure__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__Procedure__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_2__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_2__1__Impl"
+    // InternalFormalML.g:18215:1: rule__Procedure__Group_2__1__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__Procedure__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18219:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:18220:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:18220:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:18221:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getMocKeyword_2_1()); 
+            }
+            // InternalFormalML.g:18222:2: ( 'moc:' )?
+            int alt350=2;
+            int LA350_0 = input.LA(1);
+
+            if ( (LA350_0==201) ) {
+                alt350=1;
+            }
+            switch (alt350) {
+                case 1 :
+                    // InternalFormalML.g:18222:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getMocKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_2__2"
+    // InternalFormalML.g:18230:1: rule__Procedure__Group_2__2 : rule__Procedure__Group_2__2__Impl rule__Procedure__Group_2__3 ;
+    public final void rule__Procedure__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18234:1: ( rule__Procedure__Group_2__2__Impl rule__Procedure__Group_2__3 )
+            // InternalFormalML.g:18235:2: rule__Procedure__Group_2__2__Impl rule__Procedure__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__Procedure__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_2__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_2__2__Impl"
+    // InternalFormalML.g:18242:1: rule__Procedure__Group_2__2__Impl : ( ( rule__Procedure__Alternatives_2_2 ) ) ;
+    public final void rule__Procedure__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18246:1: ( ( ( rule__Procedure__Alternatives_2_2 ) ) )
+            // InternalFormalML.g:18247:1: ( ( rule__Procedure__Alternatives_2_2 ) )
+            {
+            // InternalFormalML.g:18247:1: ( ( rule__Procedure__Alternatives_2_2 ) )
+            // InternalFormalML.g:18248:2: ( rule__Procedure__Alternatives_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_2_2()); 
+            }
+            // InternalFormalML.g:18249:2: ( rule__Procedure__Alternatives_2_2 )
+            // InternalFormalML.g:18249:3: rule__Procedure__Alternatives_2_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Alternatives_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_2__3"
+    // InternalFormalML.g:18257:1: rule__Procedure__Group_2__3 : rule__Procedure__Group_2__3__Impl ;
+    public final void rule__Procedure__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18261:1: ( rule__Procedure__Group_2__3__Impl )
+            // InternalFormalML.g:18262:2: rule__Procedure__Group_2__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_2__3"
+
+
+    // $ANTLR start "rule__Procedure__Group_2__3__Impl"
+    // InternalFormalML.g:18268:1: rule__Procedure__Group_2__3__Impl : ( '>' ) ;
+    public final void rule__Procedure__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18272:1: ( ( '>' ) )
+            // InternalFormalML.g:18273:1: ( '>' )
+            {
+            // InternalFormalML.g:18273:1: ( '>' )
+            // InternalFormalML.g:18274:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getGreaterThanSignKeyword_2_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getGreaterThanSignKeyword_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5__0"
+    // InternalFormalML.g:18284:1: rule__Procedure__Group_5__0 : rule__Procedure__Group_5__0__Impl rule__Procedure__Group_5__1 ;
+    public final void rule__Procedure__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18288:1: ( rule__Procedure__Group_5__0__Impl rule__Procedure__Group_5__1 )
+            // InternalFormalML.g:18289:2: rule__Procedure__Group_5__0__Impl rule__Procedure__Group_5__1
+            {
+            pushFollow(FollowSets000.FOLLOW_62);
+            rule__Procedure__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_5__0__Impl"
+    // InternalFormalML.g:18296:1: rule__Procedure__Group_5__0__Impl : ( ( rule__Procedure__Group_5_0__0 )? ) ;
+    public final void rule__Procedure__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18300:1: ( ( ( rule__Procedure__Group_5_0__0 )? ) )
+            // InternalFormalML.g:18301:1: ( ( rule__Procedure__Group_5_0__0 )? )
+            {
+            // InternalFormalML.g:18301:1: ( ( rule__Procedure__Group_5_0__0 )? )
+            // InternalFormalML.g:18302:2: ( rule__Procedure__Group_5_0__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getGroup_5_0()); 
+            }
+            // InternalFormalML.g:18303:2: ( rule__Procedure__Group_5_0__0 )?
+            int alt351=2;
+            int LA351_0 = input.LA(1);
+
+            if ( (LA351_0==23) ) {
+                alt351=1;
+            }
+            switch (alt351) {
+                case 1 :
+                    // InternalFormalML.g:18303:3: rule__Procedure__Group_5_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_5_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getGroup_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5__1"
+    // InternalFormalML.g:18311:1: rule__Procedure__Group_5__1 : rule__Procedure__Group_5__1__Impl ;
+    public final void rule__Procedure__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18315:1: ( rule__Procedure__Group_5__1__Impl )
+            // InternalFormalML.g:18316:2: rule__Procedure__Group_5__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_5__1__Impl"
+    // InternalFormalML.g:18322:1: rule__Procedure__Group_5__1__Impl : ( ( rule__Procedure__Group_5_1__0 )? ) ;
+    public final void rule__Procedure__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18326:1: ( ( ( rule__Procedure__Group_5_1__0 )? ) )
+            // InternalFormalML.g:18327:1: ( ( rule__Procedure__Group_5_1__0 )? )
+            {
+            // InternalFormalML.g:18327:1: ( ( rule__Procedure__Group_5_1__0 )? )
+            // InternalFormalML.g:18328:2: ( rule__Procedure__Group_5_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getGroup_5_1()); 
+            }
+            // InternalFormalML.g:18329:2: ( rule__Procedure__Group_5_1__0 )?
+            int alt352=2;
+            int LA352_0 = input.LA(1);
+
+            if ( (LA352_0==215) ) {
+                alt352=1;
+            }
+            switch (alt352) {
+                case 1 :
+                    // InternalFormalML.g:18329:3: rule__Procedure__Group_5_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_5_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getGroup_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0__0"
+    // InternalFormalML.g:18338:1: rule__Procedure__Group_5_0__0 : rule__Procedure__Group_5_0__0__Impl rule__Procedure__Group_5_0__1 ;
+    public final void rule__Procedure__Group_5_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18342:1: ( rule__Procedure__Group_5_0__0__Impl rule__Procedure__Group_5_0__1 )
+            // InternalFormalML.g:18343:2: rule__Procedure__Group_5_0__0__Impl rule__Procedure__Group_5_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__Procedure__Group_5_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0__0__Impl"
+    // InternalFormalML.g:18350:1: rule__Procedure__Group_5_0__0__Impl : ( '(' ) ;
+    public final void rule__Procedure__Group_5_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18354:1: ( ( '(' ) )
+            // InternalFormalML.g:18355:1: ( '(' )
+            {
+            // InternalFormalML.g:18355:1: ( '(' )
+            // InternalFormalML.g:18356:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_0_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0__1"
+    // InternalFormalML.g:18365:1: rule__Procedure__Group_5_0__1 : rule__Procedure__Group_5_0__1__Impl rule__Procedure__Group_5_0__2 ;
+    public final void rule__Procedure__Group_5_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18369:1: ( rule__Procedure__Group_5_0__1__Impl rule__Procedure__Group_5_0__2 )
+            // InternalFormalML.g:18370:2: rule__Procedure__Group_5_0__1__Impl rule__Procedure__Group_5_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__Procedure__Group_5_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0__1__Impl"
+    // InternalFormalML.g:18377:1: rule__Procedure__Group_5_0__1__Impl : ( ( rule__Procedure__Group_5_0_1__0 )? ) ;
+    public final void rule__Procedure__Group_5_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18381:1: ( ( ( rule__Procedure__Group_5_0_1__0 )? ) )
+            // InternalFormalML.g:18382:1: ( ( rule__Procedure__Group_5_0_1__0 )? )
+            {
+            // InternalFormalML.g:18382:1: ( ( rule__Procedure__Group_5_0_1__0 )? )
+            // InternalFormalML.g:18383:2: ( rule__Procedure__Group_5_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getGroup_5_0_1()); 
+            }
+            // InternalFormalML.g:18384:2: ( rule__Procedure__Group_5_0_1__0 )?
+            int alt353=2;
+            int LA353_0 = input.LA(1);
+
+            if ( (LA353_0==RULE_XLIA_ID||LA353_0==15||(LA353_0>=17 && LA353_0<=18)||LA353_0==39||(LA353_0>=59 && LA353_0<=74)||(LA353_0>=129 && LA353_0<=132)||LA353_0==149||LA353_0==157||(LA353_0>=163 && LA353_0<=174)||(LA353_0>=231 && LA353_0<=237)||LA353_0==277) ) {
+                alt353=1;
+            }
+            switch (alt353) {
+                case 1 :
+                    // InternalFormalML.g:18384:3: rule__Procedure__Group_5_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Procedure__Group_5_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getGroup_5_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0__2"
+    // InternalFormalML.g:18392:1: rule__Procedure__Group_5_0__2 : rule__Procedure__Group_5_0__2__Impl ;
+    public final void rule__Procedure__Group_5_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18396:1: ( rule__Procedure__Group_5_0__2__Impl )
+            // InternalFormalML.g:18397:2: rule__Procedure__Group_5_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0__2__Impl"
+    // InternalFormalML.g:18403:1: rule__Procedure__Group_5_0__2__Impl : ( ')' ) ;
+    public final void rule__Procedure__Group_5_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18407:1: ( ( ')' ) )
+            // InternalFormalML.g:18408:1: ( ')' )
+            {
+            // InternalFormalML.g:18408:1: ( ')' )
+            // InternalFormalML.g:18409:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_0_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0_1__0"
+    // InternalFormalML.g:18419:1: rule__Procedure__Group_5_0_1__0 : rule__Procedure__Group_5_0_1__0__Impl rule__Procedure__Group_5_0_1__1 ;
+    public final void rule__Procedure__Group_5_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18423:1: ( rule__Procedure__Group_5_0_1__0__Impl rule__Procedure__Group_5_0_1__1 )
+            // InternalFormalML.g:18424:2: rule__Procedure__Group_5_0_1__0__Impl rule__Procedure__Group_5_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__Procedure__Group_5_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0_1__0__Impl"
+    // InternalFormalML.g:18431:1: rule__Procedure__Group_5_0_1__0__Impl : ( ( rule__Procedure__ParameterAssignment_5_0_1_0 ) ) ;
+    public final void rule__Procedure__Group_5_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18435:1: ( ( ( rule__Procedure__ParameterAssignment_5_0_1_0 ) ) )
+            // InternalFormalML.g:18436:1: ( ( rule__Procedure__ParameterAssignment_5_0_1_0 ) )
+            {
+            // InternalFormalML.g:18436:1: ( ( rule__Procedure__ParameterAssignment_5_0_1_0 ) )
+            // InternalFormalML.g:18437:2: ( rule__Procedure__ParameterAssignment_5_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_0()); 
+            }
+            // InternalFormalML.g:18438:2: ( rule__Procedure__ParameterAssignment_5_0_1_0 )
+            // InternalFormalML.g:18438:3: rule__Procedure__ParameterAssignment_5_0_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__ParameterAssignment_5_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0_1__1"
+    // InternalFormalML.g:18446:1: rule__Procedure__Group_5_0_1__1 : rule__Procedure__Group_5_0_1__1__Impl ;
+    public final void rule__Procedure__Group_5_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18450:1: ( rule__Procedure__Group_5_0_1__1__Impl )
+            // InternalFormalML.g:18451:2: rule__Procedure__Group_5_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0_1__1__Impl"
+    // InternalFormalML.g:18457:1: rule__Procedure__Group_5_0_1__1__Impl : ( ( rule__Procedure__Group_5_0_1_1__0 )* ) ;
+    public final void rule__Procedure__Group_5_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18461:1: ( ( ( rule__Procedure__Group_5_0_1_1__0 )* ) )
+            // InternalFormalML.g:18462:1: ( ( rule__Procedure__Group_5_0_1_1__0 )* )
+            {
+            // InternalFormalML.g:18462:1: ( ( rule__Procedure__Group_5_0_1_1__0 )* )
+            // InternalFormalML.g:18463:2: ( rule__Procedure__Group_5_0_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getGroup_5_0_1_1()); 
+            }
+            // InternalFormalML.g:18464:2: ( rule__Procedure__Group_5_0_1_1__0 )*
+            loop354:
+            do {
+                int alt354=2;
+                int LA354_0 = input.LA(1);
+
+                if ( (LA354_0==198) ) {
+                    alt354=1;
+                }
+
+
+                switch (alt354) {
+            	case 1 :
+            	    // InternalFormalML.g:18464:3: rule__Procedure__Group_5_0_1_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__Procedure__Group_5_0_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop354;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getGroup_5_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0_1_1__0"
+    // InternalFormalML.g:18473:1: rule__Procedure__Group_5_0_1_1__0 : rule__Procedure__Group_5_0_1_1__0__Impl rule__Procedure__Group_5_0_1_1__1 ;
+    public final void rule__Procedure__Group_5_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18477:1: ( rule__Procedure__Group_5_0_1_1__0__Impl rule__Procedure__Group_5_0_1_1__1 )
+            // InternalFormalML.g:18478:2: rule__Procedure__Group_5_0_1_1__0__Impl rule__Procedure__Group_5_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__Procedure__Group_5_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0_1_1__0__Impl"
+    // InternalFormalML.g:18485:1: rule__Procedure__Group_5_0_1_1__0__Impl : ( ',' ) ;
+    public final void rule__Procedure__Group_5_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18489:1: ( ( ',' ) )
+            // InternalFormalML.g:18490:1: ( ',' )
+            {
+            // InternalFormalML.g:18490:1: ( ',' )
+            // InternalFormalML.g:18491:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getCommaKeyword_5_0_1_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getCommaKeyword_5_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0_1_1__1"
+    // InternalFormalML.g:18500:1: rule__Procedure__Group_5_0_1_1__1 : rule__Procedure__Group_5_0_1_1__1__Impl ;
+    public final void rule__Procedure__Group_5_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18504:1: ( rule__Procedure__Group_5_0_1_1__1__Impl )
+            // InternalFormalML.g:18505:2: rule__Procedure__Group_5_0_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_0_1_1__1__Impl"
+    // InternalFormalML.g:18511:1: rule__Procedure__Group_5_0_1_1__1__Impl : ( ( rule__Procedure__ParameterAssignment_5_0_1_1_1 ) ) ;
+    public final void rule__Procedure__Group_5_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18515:1: ( ( ( rule__Procedure__ParameterAssignment_5_0_1_1_1 ) ) )
+            // InternalFormalML.g:18516:1: ( ( rule__Procedure__ParameterAssignment_5_0_1_1_1 ) )
+            {
+            // InternalFormalML.g:18516:1: ( ( rule__Procedure__ParameterAssignment_5_0_1_1_1 ) )
+            // InternalFormalML.g:18517:2: ( rule__Procedure__ParameterAssignment_5_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_1_1()); 
+            }
+            // InternalFormalML.g:18518:2: ( rule__Procedure__ParameterAssignment_5_0_1_1_1 )
+            // InternalFormalML.g:18518:3: rule__Procedure__ParameterAssignment_5_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__ParameterAssignment_5_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_5_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1__0"
+    // InternalFormalML.g:18527:1: rule__Procedure__Group_5_1__0 : rule__Procedure__Group_5_1__0__Impl rule__Procedure__Group_5_1__1 ;
+    public final void rule__Procedure__Group_5_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18531:1: ( rule__Procedure__Group_5_1__0__Impl rule__Procedure__Group_5_1__1 )
+            // InternalFormalML.g:18532:2: rule__Procedure__Group_5_1__0__Impl rule__Procedure__Group_5_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_65);
+            rule__Procedure__Group_5_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1__0__Impl"
+    // InternalFormalML.g:18539:1: rule__Procedure__Group_5_1__0__Impl : ( '-->' ) ;
+    public final void rule__Procedure__Group_5_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18543:1: ( ( '-->' ) )
+            // InternalFormalML.g:18544:1: ( '-->' )
+            {
+            // InternalFormalML.g:18544:1: ( '-->' )
+            // InternalFormalML.g:18545:2: '-->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0()); 
+            }
+            match(input,215,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1__1"
+    // InternalFormalML.g:18554:1: rule__Procedure__Group_5_1__1 : rule__Procedure__Group_5_1__1__Impl ;
+    public final void rule__Procedure__Group_5_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18558:1: ( rule__Procedure__Group_5_1__1__Impl )
+            // InternalFormalML.g:18559:2: rule__Procedure__Group_5_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1__1__Impl"
+    // InternalFormalML.g:18565:1: rule__Procedure__Group_5_1__1__Impl : ( ( rule__Procedure__Alternatives_5_1_1 ) ) ;
+    public final void rule__Procedure__Group_5_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18569:1: ( ( ( rule__Procedure__Alternatives_5_1_1 ) ) )
+            // InternalFormalML.g:18570:1: ( ( rule__Procedure__Alternatives_5_1_1 ) )
+            {
+            // InternalFormalML.g:18570:1: ( ( rule__Procedure__Alternatives_5_1_1 ) )
+            // InternalFormalML.g:18571:2: ( rule__Procedure__Alternatives_5_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_5_1_1()); 
+            }
+            // InternalFormalML.g:18572:2: ( rule__Procedure__Alternatives_5_1_1 )
+            // InternalFormalML.g:18572:3: rule__Procedure__Alternatives_5_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Alternatives_5_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_5_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1__0"
+    // InternalFormalML.g:18581:1: rule__Procedure__Group_5_1_1_1__0 : rule__Procedure__Group_5_1_1_1__0__Impl rule__Procedure__Group_5_1_1_1__1 ;
+    public final void rule__Procedure__Group_5_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18585:1: ( rule__Procedure__Group_5_1_1_1__0__Impl rule__Procedure__Group_5_1_1_1__1 )
+            // InternalFormalML.g:18586:2: rule__Procedure__Group_5_1_1_1__0__Impl rule__Procedure__Group_5_1_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__Procedure__Group_5_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1__0__Impl"
+    // InternalFormalML.g:18593:1: rule__Procedure__Group_5_1_1_1__0__Impl : ( '(' ) ;
+    public final void rule__Procedure__Group_5_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18597:1: ( ( '(' ) )
+            // InternalFormalML.g:18598:1: ( '(' )
+            {
+            // InternalFormalML.g:18598:1: ( '(' )
+            // InternalFormalML.g:18599:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_1_1_1_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1__1"
+    // InternalFormalML.g:18608:1: rule__Procedure__Group_5_1_1_1__1 : rule__Procedure__Group_5_1_1_1__1__Impl rule__Procedure__Group_5_1_1_1__2 ;
+    public final void rule__Procedure__Group_5_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18612:1: ( rule__Procedure__Group_5_1_1_1__1__Impl rule__Procedure__Group_5_1_1_1__2 )
+            // InternalFormalML.g:18613:2: rule__Procedure__Group_5_1_1_1__1__Impl rule__Procedure__Group_5_1_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__Procedure__Group_5_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_1_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1__1__Impl"
+    // InternalFormalML.g:18620:1: rule__Procedure__Group_5_1_1_1__1__Impl : ( ( rule__Procedure__ParameterAssignment_5_1_1_1_1 ) ) ;
+    public final void rule__Procedure__Group_5_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18624:1: ( ( ( rule__Procedure__ParameterAssignment_5_1_1_1_1 ) ) )
+            // InternalFormalML.g:18625:1: ( ( rule__Procedure__ParameterAssignment_5_1_1_1_1 ) )
+            {
+            // InternalFormalML.g:18625:1: ( ( rule__Procedure__ParameterAssignment_5_1_1_1_1 ) )
+            // InternalFormalML.g:18626:2: ( rule__Procedure__ParameterAssignment_5_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_1()); 
+            }
+            // InternalFormalML.g:18627:2: ( rule__Procedure__ParameterAssignment_5_1_1_1_1 )
+            // InternalFormalML.g:18627:3: rule__Procedure__ParameterAssignment_5_1_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__ParameterAssignment_5_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1__2"
+    // InternalFormalML.g:18635:1: rule__Procedure__Group_5_1_1_1__2 : rule__Procedure__Group_5_1_1_1__2__Impl rule__Procedure__Group_5_1_1_1__3 ;
+    public final void rule__Procedure__Group_5_1_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18639:1: ( rule__Procedure__Group_5_1_1_1__2__Impl rule__Procedure__Group_5_1_1_1__3 )
+            // InternalFormalML.g:18640:2: rule__Procedure__Group_5_1_1_1__2__Impl rule__Procedure__Group_5_1_1_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__Procedure__Group_5_1_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_1_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1__2__Impl"
+    // InternalFormalML.g:18647:1: rule__Procedure__Group_5_1_1_1__2__Impl : ( ( rule__Procedure__Group_5_1_1_1_2__0 )* ) ;
+    public final void rule__Procedure__Group_5_1_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18651:1: ( ( ( rule__Procedure__Group_5_1_1_1_2__0 )* ) )
+            // InternalFormalML.g:18652:1: ( ( rule__Procedure__Group_5_1_1_1_2__0 )* )
+            {
+            // InternalFormalML.g:18652:1: ( ( rule__Procedure__Group_5_1_1_1_2__0 )* )
+            // InternalFormalML.g:18653:2: ( rule__Procedure__Group_5_1_1_1_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getGroup_5_1_1_1_2()); 
+            }
+            // InternalFormalML.g:18654:2: ( rule__Procedure__Group_5_1_1_1_2__0 )*
+            loop355:
+            do {
+                int alt355=2;
+                int LA355_0 = input.LA(1);
+
+                if ( (LA355_0==198) ) {
+                    alt355=1;
+                }
+
+
+                switch (alt355) {
+            	case 1 :
+            	    // InternalFormalML.g:18654:3: rule__Procedure__Group_5_1_1_1_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__Procedure__Group_5_1_1_1_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop355;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getGroup_5_1_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1__3"
+    // InternalFormalML.g:18662:1: rule__Procedure__Group_5_1_1_1__3 : rule__Procedure__Group_5_1_1_1__3__Impl ;
+    public final void rule__Procedure__Group_5_1_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18666:1: ( rule__Procedure__Group_5_1_1_1__3__Impl )
+            // InternalFormalML.g:18667:2: rule__Procedure__Group_5_1_1_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_1_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1__3"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1__3__Impl"
+    // InternalFormalML.g:18673:1: rule__Procedure__Group_5_1_1_1__3__Impl : ( ')' ) ;
+    public final void rule__Procedure__Group_5_1_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18677:1: ( ( ')' ) )
+            // InternalFormalML.g:18678:1: ( ')' )
+            {
+            // InternalFormalML.g:18678:1: ( ')' )
+            // InternalFormalML.g:18679:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_1_1_1_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_1_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1_2__0"
+    // InternalFormalML.g:18689:1: rule__Procedure__Group_5_1_1_1_2__0 : rule__Procedure__Group_5_1_1_1_2__0__Impl rule__Procedure__Group_5_1_1_1_2__1 ;
+    public final void rule__Procedure__Group_5_1_1_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18693:1: ( rule__Procedure__Group_5_1_1_1_2__0__Impl rule__Procedure__Group_5_1_1_1_2__1 )
+            // InternalFormalML.g:18694:2: rule__Procedure__Group_5_1_1_1_2__0__Impl rule__Procedure__Group_5_1_1_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__Procedure__Group_5_1_1_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_1_1_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1_2__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1_2__0__Impl"
+    // InternalFormalML.g:18701:1: rule__Procedure__Group_5_1_1_1_2__0__Impl : ( ',' ) ;
+    public final void rule__Procedure__Group_5_1_1_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18705:1: ( ( ',' ) )
+            // InternalFormalML.g:18706:1: ( ',' )
+            {
+            // InternalFormalML.g:18706:1: ( ',' )
+            // InternalFormalML.g:18707:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getCommaKeyword_5_1_1_1_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getCommaKeyword_5_1_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1_2__1"
+    // InternalFormalML.g:18716:1: rule__Procedure__Group_5_1_1_1_2__1 : rule__Procedure__Group_5_1_1_1_2__1__Impl ;
+    public final void rule__Procedure__Group_5_1_1_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18720:1: ( rule__Procedure__Group_5_1_1_1_2__1__Impl )
+            // InternalFormalML.g:18721:2: rule__Procedure__Group_5_1_1_1_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_5_1_1_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1_2__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_5_1_1_1_2__1__Impl"
+    // InternalFormalML.g:18727:1: rule__Procedure__Group_5_1_1_1_2__1__Impl : ( ( rule__Procedure__ParameterAssignment_5_1_1_1_2_1 ) ) ;
+    public final void rule__Procedure__Group_5_1_1_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18731:1: ( ( ( rule__Procedure__ParameterAssignment_5_1_1_1_2_1 ) ) )
+            // InternalFormalML.g:18732:1: ( ( rule__Procedure__ParameterAssignment_5_1_1_1_2_1 ) )
+            {
+            // InternalFormalML.g:18732:1: ( ( rule__Procedure__ParameterAssignment_5_1_1_1_2_1 ) )
+            // InternalFormalML.g:18733:2: ( rule__Procedure__ParameterAssignment_5_1_1_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_2_1()); 
+            }
+            // InternalFormalML.g:18734:2: ( rule__Procedure__ParameterAssignment_5_1_1_1_2_1 )
+            // InternalFormalML.g:18734:3: rule__Procedure__ParameterAssignment_5_1_1_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__ParameterAssignment_5_1_1_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_5_1_1_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_5_1_1_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0__0"
+    // InternalFormalML.g:18743:1: rule__Procedure__Group_7_0__0 : rule__Procedure__Group_7_0__0__Impl rule__Procedure__Group_7_0__1 ;
+    public final void rule__Procedure__Group_7_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18747:1: ( rule__Procedure__Group_7_0__0__Impl rule__Procedure__Group_7_0__1 )
+            // InternalFormalML.g:18748:2: rule__Procedure__Group_7_0__0__Impl rule__Procedure__Group_7_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_67);
+            rule__Procedure__Group_7_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0__0__Impl"
+    // InternalFormalML.g:18755:1: rule__Procedure__Group_7_0__0__Impl : ( '@parameter:' ) ;
+    public final void rule__Procedure__Group_7_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18759:1: ( ( '@parameter:' ) )
+            // InternalFormalML.g:18760:1: ( '@parameter:' )
+            {
+            // InternalFormalML.g:18760:1: ( '@parameter:' )
+            // InternalFormalML.g:18761:2: '@parameter:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterKeyword_7_0_0()); 
+            }
+            match(input,216,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterKeyword_7_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0__1"
+    // InternalFormalML.g:18770:1: rule__Procedure__Group_7_0__1 : rule__Procedure__Group_7_0__1__Impl ;
+    public final void rule__Procedure__Group_7_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18774:1: ( rule__Procedure__Group_7_0__1__Impl )
+            // InternalFormalML.g:18775:2: rule__Procedure__Group_7_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0__1__Impl"
+    // InternalFormalML.g:18781:1: rule__Procedure__Group_7_0__1__Impl : ( ( rule__Procedure__Alternatives_7_0_1 )* ) ;
+    public final void rule__Procedure__Group_7_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18785:1: ( ( ( rule__Procedure__Alternatives_7_0_1 )* ) )
+            // InternalFormalML.g:18786:1: ( ( rule__Procedure__Alternatives_7_0_1 )* )
+            {
+            // InternalFormalML.g:18786:1: ( ( rule__Procedure__Alternatives_7_0_1 )* )
+            // InternalFormalML.g:18787:2: ( rule__Procedure__Alternatives_7_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1()); 
+            }
+            // InternalFormalML.g:18788:2: ( rule__Procedure__Alternatives_7_0_1 )*
+            loop356:
+            do {
+                int alt356=2;
+                int LA356_0 = input.LA(1);
+
+                if ( (LA356_0==157||LA356_0==173||(LA356_0>=175 && LA356_0<=176)) ) {
+                    alt356=1;
+                }
+
+
+                switch (alt356) {
+            	case 1 :
+            	    // InternalFormalML.g:18788:3: rule__Procedure__Alternatives_7_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_68);
+            	    rule__Procedure__Alternatives_7_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop356;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0__0"
+    // InternalFormalML.g:18797:1: rule__Procedure__Group_7_0_1_0__0 : rule__Procedure__Group_7_0_1_0__0__Impl rule__Procedure__Group_7_0_1_0__1 ;
+    public final void rule__Procedure__Group_7_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18801:1: ( rule__Procedure__Group_7_0_1_0__0__Impl rule__Procedure__Group_7_0_1_0__1 )
+            // InternalFormalML.g:18802:2: rule__Procedure__Group_7_0_1_0__0__Impl rule__Procedure__Group_7_0_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Procedure__Group_7_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0__0__Impl"
+    // InternalFormalML.g:18809:1: rule__Procedure__Group_7_0_1_0__0__Impl : ( 'input' ) ;
+    public final void rule__Procedure__Group_7_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18813:1: ( ( 'input' ) )
+            // InternalFormalML.g:18814:1: ( 'input' )
+            {
+            // InternalFormalML.g:18814:1: ( 'input' )
+            // InternalFormalML.g:18815:2: 'input'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getInputKeyword_7_0_1_0_0()); 
+            }
+            match(input,175,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getInputKeyword_7_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0__1"
+    // InternalFormalML.g:18824:1: rule__Procedure__Group_7_0_1_0__1 : rule__Procedure__Group_7_0_1_0__1__Impl ;
+    public final void rule__Procedure__Group_7_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18828:1: ( rule__Procedure__Group_7_0_1_0__1__Impl )
+            // InternalFormalML.g:18829:2: rule__Procedure__Group_7_0_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0__1__Impl"
+    // InternalFormalML.g:18835:1: rule__Procedure__Group_7_0_1_0__1__Impl : ( ( rule__Procedure__Alternatives_7_0_1_0_1 ) ) ;
+    public final void rule__Procedure__Group_7_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18839:1: ( ( ( rule__Procedure__Alternatives_7_0_1_0_1 ) ) )
+            // InternalFormalML.g:18840:1: ( ( rule__Procedure__Alternatives_7_0_1_0_1 ) )
+            {
+            // InternalFormalML.g:18840:1: ( ( rule__Procedure__Alternatives_7_0_1_0_1 ) )
+            // InternalFormalML.g:18841:2: ( rule__Procedure__Alternatives_7_0_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_0_1()); 
+            }
+            // InternalFormalML.g:18842:2: ( rule__Procedure__Alternatives_7_0_1_0_1 )
+            // InternalFormalML.g:18842:3: rule__Procedure__Alternatives_7_0_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Alternatives_7_0_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0_1_1__0"
+    // InternalFormalML.g:18851:1: rule__Procedure__Group_7_0_1_0_1_1__0 : rule__Procedure__Group_7_0_1_0_1_1__0__Impl rule__Procedure__Group_7_0_1_0_1_1__1 ;
+    public final void rule__Procedure__Group_7_0_1_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18855:1: ( rule__Procedure__Group_7_0_1_0_1_1__0__Impl rule__Procedure__Group_7_0_1_0_1_1__1 )
+            // InternalFormalML.g:18856:2: rule__Procedure__Group_7_0_1_0_1_1__0__Impl rule__Procedure__Group_7_0_1_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Procedure__Group_7_0_1_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0_1_1__0__Impl"
+    // InternalFormalML.g:18863:1: rule__Procedure__Group_7_0_1_0_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Procedure__Group_7_0_1_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18867:1: ( ( '{' ) )
+            // InternalFormalML.g:18868:1: ( '{' )
+            {
+            // InternalFormalML.g:18868:1: ( '{' )
+            // InternalFormalML.g:18869:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0_1_1__1"
+    // InternalFormalML.g:18878:1: rule__Procedure__Group_7_0_1_0_1_1__1 : rule__Procedure__Group_7_0_1_0_1_1__1__Impl rule__Procedure__Group_7_0_1_0_1_1__2 ;
+    public final void rule__Procedure__Group_7_0_1_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18882:1: ( rule__Procedure__Group_7_0_1_0_1_1__1__Impl rule__Procedure__Group_7_0_1_0_1_1__2 )
+            // InternalFormalML.g:18883:2: rule__Procedure__Group_7_0_1_0_1_1__1__Impl rule__Procedure__Group_7_0_1_0_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Procedure__Group_7_0_1_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_0_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0_1_1__1__Impl"
+    // InternalFormalML.g:18890:1: rule__Procedure__Group_7_0_1_0_1_1__1__Impl : ( ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )* ) ) ;
+    public final void rule__Procedure__Group_7_0_1_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18894:1: ( ( ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )* ) ) )
+            // InternalFormalML.g:18895:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:18895:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )* ) )
+            // InternalFormalML.g:18896:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )* )
+            {
+            // InternalFormalML.g:18896:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 ) )
+            // InternalFormalML.g:18897:3: ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_1_1()); 
+            }
+            // InternalFormalML.g:18898:3: ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )
+            // InternalFormalML.g:18898:4: rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:18901:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )* )
+            // InternalFormalML.g:18902:3: ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_1_1()); 
+            }
+            // InternalFormalML.g:18903:3: ( rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 )*
+            loop357:
+            do {
+                int alt357=2;
+                int LA357_0 = input.LA(1);
+
+                if ( (LA357_0==16) ) {
+                    alt357=1;
+                }
+
+
+                switch (alt357) {
+            	case 1 :
+            	    // InternalFormalML.g:18903:4: rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop357;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0_1_1__2"
+    // InternalFormalML.g:18912:1: rule__Procedure__Group_7_0_1_0_1_1__2 : rule__Procedure__Group_7_0_1_0_1_1__2__Impl ;
+    public final void rule__Procedure__Group_7_0_1_0_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18916:1: ( rule__Procedure__Group_7_0_1_0_1_1__2__Impl )
+            // InternalFormalML.g:18917:2: rule__Procedure__Group_7_0_1_0_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_0_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0_1_1__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_0_1_1__2__Impl"
+    // InternalFormalML.g:18923:1: rule__Procedure__Group_7_0_1_0_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Procedure__Group_7_0_1_0_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18927:1: ( ( '}' ) )
+            // InternalFormalML.g:18928:1: ( '}' )
+            {
+            // InternalFormalML.g:18928:1: ( '}' )
+            // InternalFormalML.g:18929:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_0_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1__0"
+    // InternalFormalML.g:18939:1: rule__Procedure__Group_7_0_1_1__0 : rule__Procedure__Group_7_0_1_1__0__Impl rule__Procedure__Group_7_0_1_1__1 ;
+    public final void rule__Procedure__Group_7_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18943:1: ( rule__Procedure__Group_7_0_1_1__0__Impl rule__Procedure__Group_7_0_1_1__1 )
+            // InternalFormalML.g:18944:2: rule__Procedure__Group_7_0_1_1__0__Impl rule__Procedure__Group_7_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Procedure__Group_7_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1__0__Impl"
+    // InternalFormalML.g:18951:1: rule__Procedure__Group_7_0_1_1__0__Impl : ( 'inout' ) ;
+    public final void rule__Procedure__Group_7_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18955:1: ( ( 'inout' ) )
+            // InternalFormalML.g:18956:1: ( 'inout' )
+            {
+            // InternalFormalML.g:18956:1: ( 'inout' )
+            // InternalFormalML.g:18957:2: 'inout'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getInoutKeyword_7_0_1_1_0()); 
+            }
+            match(input,173,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getInoutKeyword_7_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1__1"
+    // InternalFormalML.g:18966:1: rule__Procedure__Group_7_0_1_1__1 : rule__Procedure__Group_7_0_1_1__1__Impl ;
+    public final void rule__Procedure__Group_7_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18970:1: ( rule__Procedure__Group_7_0_1_1__1__Impl )
+            // InternalFormalML.g:18971:2: rule__Procedure__Group_7_0_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1__1__Impl"
+    // InternalFormalML.g:18977:1: rule__Procedure__Group_7_0_1_1__1__Impl : ( ( rule__Procedure__Alternatives_7_0_1_1_1 ) ) ;
+    public final void rule__Procedure__Group_7_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18981:1: ( ( ( rule__Procedure__Alternatives_7_0_1_1_1 ) ) )
+            // InternalFormalML.g:18982:1: ( ( rule__Procedure__Alternatives_7_0_1_1_1 ) )
+            {
+            // InternalFormalML.g:18982:1: ( ( rule__Procedure__Alternatives_7_0_1_1_1 ) )
+            // InternalFormalML.g:18983:2: ( rule__Procedure__Alternatives_7_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_1_1()); 
+            }
+            // InternalFormalML.g:18984:2: ( rule__Procedure__Alternatives_7_0_1_1_1 )
+            // InternalFormalML.g:18984:3: rule__Procedure__Alternatives_7_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Alternatives_7_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1_1_1__0"
+    // InternalFormalML.g:18993:1: rule__Procedure__Group_7_0_1_1_1_1__0 : rule__Procedure__Group_7_0_1_1_1_1__0__Impl rule__Procedure__Group_7_0_1_1_1_1__1 ;
+    public final void rule__Procedure__Group_7_0_1_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:18997:1: ( rule__Procedure__Group_7_0_1_1_1_1__0__Impl rule__Procedure__Group_7_0_1_1_1_1__1 )
+            // InternalFormalML.g:18998:2: rule__Procedure__Group_7_0_1_1_1_1__0__Impl rule__Procedure__Group_7_0_1_1_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Procedure__Group_7_0_1_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1_1_1__0__Impl"
+    // InternalFormalML.g:19005:1: rule__Procedure__Group_7_0_1_1_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Procedure__Group_7_0_1_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19009:1: ( ( '{' ) )
+            // InternalFormalML.g:19010:1: ( '{' )
+            {
+            // InternalFormalML.g:19010:1: ( '{' )
+            // InternalFormalML.g:19011:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1_1_1__1"
+    // InternalFormalML.g:19020:1: rule__Procedure__Group_7_0_1_1_1_1__1 : rule__Procedure__Group_7_0_1_1_1_1__1__Impl rule__Procedure__Group_7_0_1_1_1_1__2 ;
+    public final void rule__Procedure__Group_7_0_1_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19024:1: ( rule__Procedure__Group_7_0_1_1_1_1__1__Impl rule__Procedure__Group_7_0_1_1_1_1__2 )
+            // InternalFormalML.g:19025:2: rule__Procedure__Group_7_0_1_1_1_1__1__Impl rule__Procedure__Group_7_0_1_1_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Procedure__Group_7_0_1_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_1_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1_1_1__1__Impl"
+    // InternalFormalML.g:19032:1: rule__Procedure__Group_7_0_1_1_1_1__1__Impl : ( ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )* ) ) ;
+    public final void rule__Procedure__Group_7_0_1_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19036:1: ( ( ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )* ) ) )
+            // InternalFormalML.g:19037:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:19037:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )* ) )
+            // InternalFormalML.g:19038:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )* )
+            {
+            // InternalFormalML.g:19038:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 ) )
+            // InternalFormalML.g:19039:3: ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_1_1()); 
+            }
+            // InternalFormalML.g:19040:3: ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )
+            // InternalFormalML.g:19040:4: rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:19043:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )* )
+            // InternalFormalML.g:19044:3: ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_1_1()); 
+            }
+            // InternalFormalML.g:19045:3: ( rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 )*
+            loop358:
+            do {
+                int alt358=2;
+                int LA358_0 = input.LA(1);
+
+                if ( (LA358_0==16) ) {
+                    alt358=1;
+                }
+
+
+                switch (alt358) {
+            	case 1 :
+            	    // InternalFormalML.g:19045:4: rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop358;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1_1_1__2"
+    // InternalFormalML.g:19054:1: rule__Procedure__Group_7_0_1_1_1_1__2 : rule__Procedure__Group_7_0_1_1_1_1__2__Impl ;
+    public final void rule__Procedure__Group_7_0_1_1_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19058:1: ( rule__Procedure__Group_7_0_1_1_1_1__2__Impl )
+            // InternalFormalML.g:19059:2: rule__Procedure__Group_7_0_1_1_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_1_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1_1_1__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_1_1_1__2__Impl"
+    // InternalFormalML.g:19065:1: rule__Procedure__Group_7_0_1_1_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Procedure__Group_7_0_1_1_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19069:1: ( ( '}' ) )
+            // InternalFormalML.g:19070:1: ( '}' )
+            {
+            // InternalFormalML.g:19070:1: ( '}' )
+            // InternalFormalML.g:19071:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_1_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2__0"
+    // InternalFormalML.g:19081:1: rule__Procedure__Group_7_0_1_2__0 : rule__Procedure__Group_7_0_1_2__0__Impl rule__Procedure__Group_7_0_1_2__1 ;
+    public final void rule__Procedure__Group_7_0_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19085:1: ( rule__Procedure__Group_7_0_1_2__0__Impl rule__Procedure__Group_7_0_1_2__1 )
+            // InternalFormalML.g:19086:2: rule__Procedure__Group_7_0_1_2__0__Impl rule__Procedure__Group_7_0_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Procedure__Group_7_0_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2__0__Impl"
+    // InternalFormalML.g:19093:1: rule__Procedure__Group_7_0_1_2__0__Impl : ( 'output' ) ;
+    public final void rule__Procedure__Group_7_0_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19097:1: ( ( 'output' ) )
+            // InternalFormalML.g:19098:1: ( 'output' )
+            {
+            // InternalFormalML.g:19098:1: ( 'output' )
+            // InternalFormalML.g:19099:2: 'output'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getOutputKeyword_7_0_1_2_0()); 
+            }
+            match(input,176,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getOutputKeyword_7_0_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2__1"
+    // InternalFormalML.g:19108:1: rule__Procedure__Group_7_0_1_2__1 : rule__Procedure__Group_7_0_1_2__1__Impl ;
+    public final void rule__Procedure__Group_7_0_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19112:1: ( rule__Procedure__Group_7_0_1_2__1__Impl )
+            // InternalFormalML.g:19113:2: rule__Procedure__Group_7_0_1_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2__1__Impl"
+    // InternalFormalML.g:19119:1: rule__Procedure__Group_7_0_1_2__1__Impl : ( ( rule__Procedure__Alternatives_7_0_1_2_1 ) ) ;
+    public final void rule__Procedure__Group_7_0_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19123:1: ( ( ( rule__Procedure__Alternatives_7_0_1_2_1 ) ) )
+            // InternalFormalML.g:19124:1: ( ( rule__Procedure__Alternatives_7_0_1_2_1 ) )
+            {
+            // InternalFormalML.g:19124:1: ( ( rule__Procedure__Alternatives_7_0_1_2_1 ) )
+            // InternalFormalML.g:19125:2: ( rule__Procedure__Alternatives_7_0_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_2_1()); 
+            }
+            // InternalFormalML.g:19126:2: ( rule__Procedure__Alternatives_7_0_1_2_1 )
+            // InternalFormalML.g:19126:3: rule__Procedure__Alternatives_7_0_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Alternatives_7_0_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2_1_1__0"
+    // InternalFormalML.g:19135:1: rule__Procedure__Group_7_0_1_2_1_1__0 : rule__Procedure__Group_7_0_1_2_1_1__0__Impl rule__Procedure__Group_7_0_1_2_1_1__1 ;
+    public final void rule__Procedure__Group_7_0_1_2_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19139:1: ( rule__Procedure__Group_7_0_1_2_1_1__0__Impl rule__Procedure__Group_7_0_1_2_1_1__1 )
+            // InternalFormalML.g:19140:2: rule__Procedure__Group_7_0_1_2_1_1__0__Impl rule__Procedure__Group_7_0_1_2_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Procedure__Group_7_0_1_2_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_2_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2_1_1__0__Impl"
+    // InternalFormalML.g:19147:1: rule__Procedure__Group_7_0_1_2_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Procedure__Group_7_0_1_2_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19151:1: ( ( '{' ) )
+            // InternalFormalML.g:19152:1: ( '{' )
+            {
+            // InternalFormalML.g:19152:1: ( '{' )
+            // InternalFormalML.g:19153:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2_1_1__1"
+    // InternalFormalML.g:19162:1: rule__Procedure__Group_7_0_1_2_1_1__1 : rule__Procedure__Group_7_0_1_2_1_1__1__Impl rule__Procedure__Group_7_0_1_2_1_1__2 ;
+    public final void rule__Procedure__Group_7_0_1_2_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19166:1: ( rule__Procedure__Group_7_0_1_2_1_1__1__Impl rule__Procedure__Group_7_0_1_2_1_1__2 )
+            // InternalFormalML.g:19167:2: rule__Procedure__Group_7_0_1_2_1_1__1__Impl rule__Procedure__Group_7_0_1_2_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Procedure__Group_7_0_1_2_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_2_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2_1_1__1__Impl"
+    // InternalFormalML.g:19174:1: rule__Procedure__Group_7_0_1_2_1_1__1__Impl : ( ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )* ) ) ;
+    public final void rule__Procedure__Group_7_0_1_2_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19178:1: ( ( ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )* ) ) )
+            // InternalFormalML.g:19179:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:19179:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )* ) )
+            // InternalFormalML.g:19180:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )* )
+            {
+            // InternalFormalML.g:19180:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 ) )
+            // InternalFormalML.g:19181:3: ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_1_1()); 
+            }
+            // InternalFormalML.g:19182:3: ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )
+            // InternalFormalML.g:19182:4: rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:19185:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )* )
+            // InternalFormalML.g:19186:3: ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_1_1()); 
+            }
+            // InternalFormalML.g:19187:3: ( rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 )*
+            loop359:
+            do {
+                int alt359=2;
+                int LA359_0 = input.LA(1);
+
+                if ( (LA359_0==16) ) {
+                    alt359=1;
+                }
+
+
+                switch (alt359) {
+            	case 1 :
+            	    // InternalFormalML.g:19187:4: rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop359;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_2_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2_1_1__2"
+    // InternalFormalML.g:19196:1: rule__Procedure__Group_7_0_1_2_1_1__2 : rule__Procedure__Group_7_0_1_2_1_1__2__Impl ;
+    public final void rule__Procedure__Group_7_0_1_2_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19200:1: ( rule__Procedure__Group_7_0_1_2_1_1__2__Impl )
+            // InternalFormalML.g:19201:2: rule__Procedure__Group_7_0_1_2_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_2_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2_1_1__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_2_1_1__2__Impl"
+    // InternalFormalML.g:19207:1: rule__Procedure__Group_7_0_1_2_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Procedure__Group_7_0_1_2_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19211:1: ( ( '}' ) )
+            // InternalFormalML.g:19212:1: ( '}' )
+            {
+            // InternalFormalML.g:19212:1: ( '}' )
+            // InternalFormalML.g:19213:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_2_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3__0"
+    // InternalFormalML.g:19223:1: rule__Procedure__Group_7_0_1_3__0 : rule__Procedure__Group_7_0_1_3__0__Impl rule__Procedure__Group_7_0_1_3__1 ;
+    public final void rule__Procedure__Group_7_0_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19227:1: ( rule__Procedure__Group_7_0_1_3__0__Impl rule__Procedure__Group_7_0_1_3__1 )
+            // InternalFormalML.g:19228:2: rule__Procedure__Group_7_0_1_3__0__Impl rule__Procedure__Group_7_0_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Procedure__Group_7_0_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3__0__Impl"
+    // InternalFormalML.g:19235:1: rule__Procedure__Group_7_0_1_3__0__Impl : ( 'return' ) ;
+    public final void rule__Procedure__Group_7_0_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19239:1: ( ( 'return' ) )
+            // InternalFormalML.g:19240:1: ( 'return' )
+            {
+            // InternalFormalML.g:19240:1: ( 'return' )
+            // InternalFormalML.g:19241:2: 'return'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getReturnKeyword_7_0_1_3_0()); 
+            }
+            match(input,157,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getReturnKeyword_7_0_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3__1"
+    // InternalFormalML.g:19250:1: rule__Procedure__Group_7_0_1_3__1 : rule__Procedure__Group_7_0_1_3__1__Impl ;
+    public final void rule__Procedure__Group_7_0_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19254:1: ( rule__Procedure__Group_7_0_1_3__1__Impl )
+            // InternalFormalML.g:19255:2: rule__Procedure__Group_7_0_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3__1__Impl"
+    // InternalFormalML.g:19261:1: rule__Procedure__Group_7_0_1_3__1__Impl : ( ( rule__Procedure__Alternatives_7_0_1_3_1 ) ) ;
+    public final void rule__Procedure__Group_7_0_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19265:1: ( ( ( rule__Procedure__Alternatives_7_0_1_3_1 ) ) )
+            // InternalFormalML.g:19266:1: ( ( rule__Procedure__Alternatives_7_0_1_3_1 ) )
+            {
+            // InternalFormalML.g:19266:1: ( ( rule__Procedure__Alternatives_7_0_1_3_1 ) )
+            // InternalFormalML.g:19267:2: ( rule__Procedure__Alternatives_7_0_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_3_1()); 
+            }
+            // InternalFormalML.g:19268:2: ( rule__Procedure__Alternatives_7_0_1_3_1 )
+            // InternalFormalML.g:19268:3: rule__Procedure__Alternatives_7_0_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Alternatives_7_0_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_7_0_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3_1_1__0"
+    // InternalFormalML.g:19277:1: rule__Procedure__Group_7_0_1_3_1_1__0 : rule__Procedure__Group_7_0_1_3_1_1__0__Impl rule__Procedure__Group_7_0_1_3_1_1__1 ;
+    public final void rule__Procedure__Group_7_0_1_3_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19281:1: ( rule__Procedure__Group_7_0_1_3_1_1__0__Impl rule__Procedure__Group_7_0_1_3_1_1__1 )
+            // InternalFormalML.g:19282:2: rule__Procedure__Group_7_0_1_3_1_1__0__Impl rule__Procedure__Group_7_0_1_3_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Procedure__Group_7_0_1_3_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_3_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3_1_1__0__Impl"
+    // InternalFormalML.g:19289:1: rule__Procedure__Group_7_0_1_3_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Procedure__Group_7_0_1_3_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19293:1: ( ( '{' ) )
+            // InternalFormalML.g:19294:1: ( '{' )
+            {
+            // InternalFormalML.g:19294:1: ( '{' )
+            // InternalFormalML.g:19295:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3_1_1__1"
+    // InternalFormalML.g:19304:1: rule__Procedure__Group_7_0_1_3_1_1__1 : rule__Procedure__Group_7_0_1_3_1_1__1__Impl rule__Procedure__Group_7_0_1_3_1_1__2 ;
+    public final void rule__Procedure__Group_7_0_1_3_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19308:1: ( rule__Procedure__Group_7_0_1_3_1_1__1__Impl rule__Procedure__Group_7_0_1_3_1_1__2 )
+            // InternalFormalML.g:19309:2: rule__Procedure__Group_7_0_1_3_1_1__1__Impl rule__Procedure__Group_7_0_1_3_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Procedure__Group_7_0_1_3_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_3_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3_1_1__1__Impl"
+    // InternalFormalML.g:19316:1: rule__Procedure__Group_7_0_1_3_1_1__1__Impl : ( ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )* ) ) ;
+    public final void rule__Procedure__Group_7_0_1_3_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19320:1: ( ( ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )* ) ) )
+            // InternalFormalML.g:19321:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:19321:1: ( ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )* ) )
+            // InternalFormalML.g:19322:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )* )
+            {
+            // InternalFormalML.g:19322:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 ) )
+            // InternalFormalML.g:19323:3: ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_1_1()); 
+            }
+            // InternalFormalML.g:19324:3: ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )
+            // InternalFormalML.g:19324:4: rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:19327:2: ( ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )* )
+            // InternalFormalML.g:19328:3: ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_1_1()); 
+            }
+            // InternalFormalML.g:19329:3: ( rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 )*
+            loop360:
+            do {
+                int alt360=2;
+                int LA360_0 = input.LA(1);
+
+                if ( (LA360_0==16) ) {
+                    alt360=1;
+                }
+
+
+                switch (alt360) {
+            	case 1 :
+            	    // InternalFormalML.g:19329:4: rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop360;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_7_0_1_3_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3_1_1__2"
+    // InternalFormalML.g:19338:1: rule__Procedure__Group_7_0_1_3_1_1__2 : rule__Procedure__Group_7_0_1_3_1_1__2__Impl ;
+    public final void rule__Procedure__Group_7_0_1_3_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19342:1: ( rule__Procedure__Group_7_0_1_3_1_1__2__Impl )
+            // InternalFormalML.g:19343:2: rule__Procedure__Group_7_0_1_3_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_7_0_1_3_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3_1_1__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_7_0_1_3_1_1__2__Impl"
+    // InternalFormalML.g:19349:1: rule__Procedure__Group_7_0_1_3_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Procedure__Group_7_0_1_3_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19353:1: ( ( '}' ) )
+            // InternalFormalML.g:19354:1: ( '}' )
+            {
+            // InternalFormalML.g:19354:1: ( '}' )
+            // InternalFormalML.g:19355:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_7_0_1_3_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0__0"
+    // InternalFormalML.g:19365:1: rule__Procedure__Group_8_0__0 : rule__Procedure__Group_8_0__0__Impl rule__Procedure__Group_8_0__1 ;
+    public final void rule__Procedure__Group_8_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19369:1: ( rule__Procedure__Group_8_0__0__Impl rule__Procedure__Group_8_0__1 )
+            // InternalFormalML.g:19370:2: rule__Procedure__Group_8_0__0__Impl rule__Procedure__Group_8_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Procedure__Group_8_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0__0__Impl"
+    // InternalFormalML.g:19377:1: rule__Procedure__Group_8_0__0__Impl : ( '@input:' ) ;
+    public final void rule__Procedure__Group_8_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19381:1: ( ( '@input:' ) )
+            // InternalFormalML.g:19382:1: ( '@input:' )
+            {
+            // InternalFormalML.g:19382:1: ( '@input:' )
+            // InternalFormalML.g:19383:2: '@input:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()); 
+            }
+            match(input,217,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0__1"
+    // InternalFormalML.g:19392:1: rule__Procedure__Group_8_0__1 : rule__Procedure__Group_8_0__1__Impl ;
+    public final void rule__Procedure__Group_8_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19396:1: ( rule__Procedure__Group_8_0__1__Impl )
+            // InternalFormalML.g:19397:2: rule__Procedure__Group_8_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0__1__Impl"
+    // InternalFormalML.g:19403:1: rule__Procedure__Group_8_0__1__Impl : ( ( rule__Procedure__Alternatives_8_0_1 )* ) ;
+    public final void rule__Procedure__Group_8_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19407:1: ( ( ( rule__Procedure__Alternatives_8_0_1 )* ) )
+            // InternalFormalML.g:19408:1: ( ( rule__Procedure__Alternatives_8_0_1 )* )
+            {
+            // InternalFormalML.g:19408:1: ( ( rule__Procedure__Alternatives_8_0_1 )* )
+            // InternalFormalML.g:19409:2: ( rule__Procedure__Alternatives_8_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_8_0_1()); 
+            }
+            // InternalFormalML.g:19410:2: ( rule__Procedure__Alternatives_8_0_1 )*
+            loop361:
+            do {
+                int alt361=2;
+                int LA361_0 = input.LA(1);
+
+                if ( (LA361_0==16||LA361_0==199) ) {
+                    alt361=1;
+                }
+
+
+                switch (alt361) {
+            	case 1 :
+            	    // InternalFormalML.g:19410:3: rule__Procedure__Alternatives_8_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    rule__Procedure__Alternatives_8_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop361;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_8_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0_1_1__0"
+    // InternalFormalML.g:19419:1: rule__Procedure__Group_8_0_1_1__0 : rule__Procedure__Group_8_0_1_1__0__Impl rule__Procedure__Group_8_0_1_1__1 ;
+    public final void rule__Procedure__Group_8_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19423:1: ( rule__Procedure__Group_8_0_1_1__0__Impl rule__Procedure__Group_8_0_1_1__1 )
+            // InternalFormalML.g:19424:2: rule__Procedure__Group_8_0_1_1__0__Impl rule__Procedure__Group_8_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Procedure__Group_8_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0_1_1__0__Impl"
+    // InternalFormalML.g:19431:1: rule__Procedure__Group_8_0_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Procedure__Group_8_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19435:1: ( ( '{' ) )
+            // InternalFormalML.g:19436:1: ( '{' )
+            {
+            // InternalFormalML.g:19436:1: ( '{' )
+            // InternalFormalML.g:19437:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0_1_1__1"
+    // InternalFormalML.g:19446:1: rule__Procedure__Group_8_0_1_1__1 : rule__Procedure__Group_8_0_1_1__1__Impl rule__Procedure__Group_8_0_1_1__2 ;
+    public final void rule__Procedure__Group_8_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19450:1: ( rule__Procedure__Group_8_0_1_1__1__Impl rule__Procedure__Group_8_0_1_1__2 )
+            // InternalFormalML.g:19451:2: rule__Procedure__Group_8_0_1_1__1__Impl rule__Procedure__Group_8_0_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Procedure__Group_8_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_0_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0_1_1__1__Impl"
+    // InternalFormalML.g:19458:1: rule__Procedure__Group_8_0_1_1__1__Impl : ( ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )* ) ) ;
+    public final void rule__Procedure__Group_8_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19462:1: ( ( ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )* ) ) )
+            // InternalFormalML.g:19463:1: ( ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:19463:1: ( ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )* ) )
+            // InternalFormalML.g:19464:2: ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )* )
+            {
+            // InternalFormalML.g:19464:2: ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 ) )
+            // InternalFormalML.g:19465:3: ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_1_1()); 
+            }
+            // InternalFormalML.g:19466:3: ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )
+            // InternalFormalML.g:19466:4: rule__Procedure__ParameterAssignment_8_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Procedure__ParameterAssignment_8_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:19469:2: ( ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )* )
+            // InternalFormalML.g:19470:3: ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_1_1()); 
+            }
+            // InternalFormalML.g:19471:3: ( rule__Procedure__ParameterAssignment_8_0_1_1_1 )*
+            loop362:
+            do {
+                int alt362=2;
+                int LA362_0 = input.LA(1);
+
+                if ( (LA362_0==16) ) {
+                    alt362=1;
+                }
+
+
+                switch (alt362) {
+            	case 1 :
+            	    // InternalFormalML.g:19471:4: rule__Procedure__ParameterAssignment_8_0_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Procedure__ParameterAssignment_8_0_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop362;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_8_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0_1_1__2"
+    // InternalFormalML.g:19480:1: rule__Procedure__Group_8_0_1_1__2 : rule__Procedure__Group_8_0_1_1__2__Impl ;
+    public final void rule__Procedure__Group_8_0_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19484:1: ( rule__Procedure__Group_8_0_1_1__2__Impl )
+            // InternalFormalML.g:19485:2: rule__Procedure__Group_8_0_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_0_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0_1_1__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_0_1_1__2__Impl"
+    // InternalFormalML.g:19491:1: rule__Procedure__Group_8_0_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Procedure__Group_8_0_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19495:1: ( ( '}' ) )
+            // InternalFormalML.g:19496:1: ( '}' )
+            {
+            // InternalFormalML.g:19496:1: ( '}' )
+            // InternalFormalML.g:19497:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_0_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_0_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_0_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1__0"
+    // InternalFormalML.g:19507:1: rule__Procedure__Group_8_1__0 : rule__Procedure__Group_8_1__0__Impl rule__Procedure__Group_8_1__1 ;
+    public final void rule__Procedure__Group_8_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19511:1: ( rule__Procedure__Group_8_1__0__Impl rule__Procedure__Group_8_1__1 )
+            // InternalFormalML.g:19512:2: rule__Procedure__Group_8_1__0__Impl rule__Procedure__Group_8_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Procedure__Group_8_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1__0__Impl"
+    // InternalFormalML.g:19519:1: rule__Procedure__Group_8_1__0__Impl : ( '@inout:' ) ;
+    public final void rule__Procedure__Group_8_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19523:1: ( ( '@inout:' ) )
+            // InternalFormalML.g:19524:1: ( '@inout:' )
+            {
+            // InternalFormalML.g:19524:1: ( '@inout:' )
+            // InternalFormalML.g:19525:2: '@inout:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()); 
+            }
+            match(input,218,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1__1"
+    // InternalFormalML.g:19534:1: rule__Procedure__Group_8_1__1 : rule__Procedure__Group_8_1__1__Impl ;
+    public final void rule__Procedure__Group_8_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19538:1: ( rule__Procedure__Group_8_1__1__Impl )
+            // InternalFormalML.g:19539:2: rule__Procedure__Group_8_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1__1__Impl"
+    // InternalFormalML.g:19545:1: rule__Procedure__Group_8_1__1__Impl : ( ( rule__Procedure__Alternatives_8_1_1 )* ) ;
+    public final void rule__Procedure__Group_8_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19549:1: ( ( ( rule__Procedure__Alternatives_8_1_1 )* ) )
+            // InternalFormalML.g:19550:1: ( ( rule__Procedure__Alternatives_8_1_1 )* )
+            {
+            // InternalFormalML.g:19550:1: ( ( rule__Procedure__Alternatives_8_1_1 )* )
+            // InternalFormalML.g:19551:2: ( rule__Procedure__Alternatives_8_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_8_1_1()); 
+            }
+            // InternalFormalML.g:19552:2: ( rule__Procedure__Alternatives_8_1_1 )*
+            loop363:
+            do {
+                int alt363=2;
+                int LA363_0 = input.LA(1);
+
+                if ( (LA363_0==16||LA363_0==199) ) {
+                    alt363=1;
+                }
+
+
+                switch (alt363) {
+            	case 1 :
+            	    // InternalFormalML.g:19552:3: rule__Procedure__Alternatives_8_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    rule__Procedure__Alternatives_8_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop363;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_8_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1_1_1__0"
+    // InternalFormalML.g:19561:1: rule__Procedure__Group_8_1_1_1__0 : rule__Procedure__Group_8_1_1_1__0__Impl rule__Procedure__Group_8_1_1_1__1 ;
+    public final void rule__Procedure__Group_8_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19565:1: ( rule__Procedure__Group_8_1_1_1__0__Impl rule__Procedure__Group_8_1_1_1__1 )
+            // InternalFormalML.g:19566:2: rule__Procedure__Group_8_1_1_1__0__Impl rule__Procedure__Group_8_1_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Procedure__Group_8_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1_1_1__0__Impl"
+    // InternalFormalML.g:19573:1: rule__Procedure__Group_8_1_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Procedure__Group_8_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19577:1: ( ( '{' ) )
+            // InternalFormalML.g:19578:1: ( '{' )
+            {
+            // InternalFormalML.g:19578:1: ( '{' )
+            // InternalFormalML.g:19579:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1_1_1__1"
+    // InternalFormalML.g:19588:1: rule__Procedure__Group_8_1_1_1__1 : rule__Procedure__Group_8_1_1_1__1__Impl rule__Procedure__Group_8_1_1_1__2 ;
+    public final void rule__Procedure__Group_8_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19592:1: ( rule__Procedure__Group_8_1_1_1__1__Impl rule__Procedure__Group_8_1_1_1__2 )
+            // InternalFormalML.g:19593:2: rule__Procedure__Group_8_1_1_1__1__Impl rule__Procedure__Group_8_1_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Procedure__Group_8_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_1_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1_1_1__1__Impl"
+    // InternalFormalML.g:19600:1: rule__Procedure__Group_8_1_1_1__1__Impl : ( ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )* ) ) ;
+    public final void rule__Procedure__Group_8_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19604:1: ( ( ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )* ) ) )
+            // InternalFormalML.g:19605:1: ( ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:19605:1: ( ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )* ) )
+            // InternalFormalML.g:19606:2: ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )* )
+            {
+            // InternalFormalML.g:19606:2: ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 ) )
+            // InternalFormalML.g:19607:3: ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_1_1()); 
+            }
+            // InternalFormalML.g:19608:3: ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )
+            // InternalFormalML.g:19608:4: rule__Procedure__ParameterAssignment_8_1_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Procedure__ParameterAssignment_8_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:19611:2: ( ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )* )
+            // InternalFormalML.g:19612:3: ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_1_1()); 
+            }
+            // InternalFormalML.g:19613:3: ( rule__Procedure__ParameterAssignment_8_1_1_1_1 )*
+            loop364:
+            do {
+                int alt364=2;
+                int LA364_0 = input.LA(1);
+
+                if ( (LA364_0==16) ) {
+                    alt364=1;
+                }
+
+
+                switch (alt364) {
+            	case 1 :
+            	    // InternalFormalML.g:19613:4: rule__Procedure__ParameterAssignment_8_1_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Procedure__ParameterAssignment_8_1_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop364;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_8_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1_1_1__2"
+    // InternalFormalML.g:19622:1: rule__Procedure__Group_8_1_1_1__2 : rule__Procedure__Group_8_1_1_1__2__Impl ;
+    public final void rule__Procedure__Group_8_1_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19626:1: ( rule__Procedure__Group_8_1_1_1__2__Impl )
+            // InternalFormalML.g:19627:2: rule__Procedure__Group_8_1_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_1_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1_1_1__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_1_1_1__2__Impl"
+    // InternalFormalML.g:19633:1: rule__Procedure__Group_8_1_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Procedure__Group_8_1_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19637:1: ( ( '}' ) )
+            // InternalFormalML.g:19638:1: ( '}' )
+            {
+            // InternalFormalML.g:19638:1: ( '}' )
+            // InternalFormalML.g:19639:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_1_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_1_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_1_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2__0"
+    // InternalFormalML.g:19649:1: rule__Procedure__Group_8_2__0 : rule__Procedure__Group_8_2__0__Impl rule__Procedure__Group_8_2__1 ;
+    public final void rule__Procedure__Group_8_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19653:1: ( rule__Procedure__Group_8_2__0__Impl rule__Procedure__Group_8_2__1 )
+            // InternalFormalML.g:19654:2: rule__Procedure__Group_8_2__0__Impl rule__Procedure__Group_8_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Procedure__Group_8_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2__0__Impl"
+    // InternalFormalML.g:19661:1: rule__Procedure__Group_8_2__0__Impl : ( '@output:' ) ;
+    public final void rule__Procedure__Group_8_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19665:1: ( ( '@output:' ) )
+            // InternalFormalML.g:19666:1: ( '@output:' )
+            {
+            // InternalFormalML.g:19666:1: ( '@output:' )
+            // InternalFormalML.g:19667:2: '@output:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()); 
+            }
+            match(input,219,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2__1"
+    // InternalFormalML.g:19676:1: rule__Procedure__Group_8_2__1 : rule__Procedure__Group_8_2__1__Impl ;
+    public final void rule__Procedure__Group_8_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19680:1: ( rule__Procedure__Group_8_2__1__Impl )
+            // InternalFormalML.g:19681:2: rule__Procedure__Group_8_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2__1__Impl"
+    // InternalFormalML.g:19687:1: rule__Procedure__Group_8_2__1__Impl : ( ( rule__Procedure__Alternatives_8_2_1 )* ) ;
+    public final void rule__Procedure__Group_8_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19691:1: ( ( ( rule__Procedure__Alternatives_8_2_1 )* ) )
+            // InternalFormalML.g:19692:1: ( ( rule__Procedure__Alternatives_8_2_1 )* )
+            {
+            // InternalFormalML.g:19692:1: ( ( rule__Procedure__Alternatives_8_2_1 )* )
+            // InternalFormalML.g:19693:2: ( rule__Procedure__Alternatives_8_2_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_8_2_1()); 
+            }
+            // InternalFormalML.g:19694:2: ( rule__Procedure__Alternatives_8_2_1 )*
+            loop365:
+            do {
+                int alt365=2;
+                int LA365_0 = input.LA(1);
+
+                if ( (LA365_0==16||LA365_0==199) ) {
+                    alt365=1;
+                }
+
+
+                switch (alt365) {
+            	case 1 :
+            	    // InternalFormalML.g:19694:3: rule__Procedure__Alternatives_8_2_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    rule__Procedure__Alternatives_8_2_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop365;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_8_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2_1_1__0"
+    // InternalFormalML.g:19703:1: rule__Procedure__Group_8_2_1_1__0 : rule__Procedure__Group_8_2_1_1__0__Impl rule__Procedure__Group_8_2_1_1__1 ;
+    public final void rule__Procedure__Group_8_2_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19707:1: ( rule__Procedure__Group_8_2_1_1__0__Impl rule__Procedure__Group_8_2_1_1__1 )
+            // InternalFormalML.g:19708:2: rule__Procedure__Group_8_2_1_1__0__Impl rule__Procedure__Group_8_2_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Procedure__Group_8_2_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_2_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2_1_1__0__Impl"
+    // InternalFormalML.g:19715:1: rule__Procedure__Group_8_2_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Procedure__Group_8_2_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19719:1: ( ( '{' ) )
+            // InternalFormalML.g:19720:1: ( '{' )
+            {
+            // InternalFormalML.g:19720:1: ( '{' )
+            // InternalFormalML.g:19721:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2_1_1__1"
+    // InternalFormalML.g:19730:1: rule__Procedure__Group_8_2_1_1__1 : rule__Procedure__Group_8_2_1_1__1__Impl rule__Procedure__Group_8_2_1_1__2 ;
+    public final void rule__Procedure__Group_8_2_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19734:1: ( rule__Procedure__Group_8_2_1_1__1__Impl rule__Procedure__Group_8_2_1_1__2 )
+            // InternalFormalML.g:19735:2: rule__Procedure__Group_8_2_1_1__1__Impl rule__Procedure__Group_8_2_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Procedure__Group_8_2_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_2_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2_1_1__1__Impl"
+    // InternalFormalML.g:19742:1: rule__Procedure__Group_8_2_1_1__1__Impl : ( ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )* ) ) ;
+    public final void rule__Procedure__Group_8_2_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19746:1: ( ( ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )* ) ) )
+            // InternalFormalML.g:19747:1: ( ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:19747:1: ( ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )* ) )
+            // InternalFormalML.g:19748:2: ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )* )
+            {
+            // InternalFormalML.g:19748:2: ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 ) )
+            // InternalFormalML.g:19749:3: ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_1_1()); 
+            }
+            // InternalFormalML.g:19750:3: ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )
+            // InternalFormalML.g:19750:4: rule__Procedure__ParameterAssignment_8_2_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Procedure__ParameterAssignment_8_2_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:19753:2: ( ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )* )
+            // InternalFormalML.g:19754:3: ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_1_1()); 
+            }
+            // InternalFormalML.g:19755:3: ( rule__Procedure__ParameterAssignment_8_2_1_1_1 )*
+            loop366:
+            do {
+                int alt366=2;
+                int LA366_0 = input.LA(1);
+
+                if ( (LA366_0==16) ) {
+                    alt366=1;
+                }
+
+
+                switch (alt366) {
+            	case 1 :
+            	    // InternalFormalML.g:19755:4: rule__Procedure__ParameterAssignment_8_2_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Procedure__ParameterAssignment_8_2_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop366;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_8_2_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2_1_1__2"
+    // InternalFormalML.g:19764:1: rule__Procedure__Group_8_2_1_1__2 : rule__Procedure__Group_8_2_1_1__2__Impl ;
+    public final void rule__Procedure__Group_8_2_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19768:1: ( rule__Procedure__Group_8_2_1_1__2__Impl )
+            // InternalFormalML.g:19769:2: rule__Procedure__Group_8_2_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_2_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2_1_1__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_2_1_1__2__Impl"
+    // InternalFormalML.g:19775:1: rule__Procedure__Group_8_2_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Procedure__Group_8_2_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19779:1: ( ( '}' ) )
+            // InternalFormalML.g:19780:1: ( '}' )
+            {
+            // InternalFormalML.g:19780:1: ( '}' )
+            // InternalFormalML.g:19781:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_2_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_2_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_2_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3__0"
+    // InternalFormalML.g:19791:1: rule__Procedure__Group_8_3__0 : rule__Procedure__Group_8_3__0__Impl rule__Procedure__Group_8_3__1 ;
+    public final void rule__Procedure__Group_8_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19795:1: ( rule__Procedure__Group_8_3__0__Impl rule__Procedure__Group_8_3__1 )
+            // InternalFormalML.g:19796:2: rule__Procedure__Group_8_3__0__Impl rule__Procedure__Group_8_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Procedure__Group_8_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3__0__Impl"
+    // InternalFormalML.g:19803:1: rule__Procedure__Group_8_3__0__Impl : ( '@return:' ) ;
+    public final void rule__Procedure__Group_8_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19807:1: ( ( '@return:' ) )
+            // InternalFormalML.g:19808:1: ( '@return:' )
+            {
+            // InternalFormalML.g:19808:1: ( '@return:' )
+            // InternalFormalML.g:19809:2: '@return:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0()); 
+            }
+            match(input,220,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3__1"
+    // InternalFormalML.g:19818:1: rule__Procedure__Group_8_3__1 : rule__Procedure__Group_8_3__1__Impl ;
+    public final void rule__Procedure__Group_8_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19822:1: ( rule__Procedure__Group_8_3__1__Impl )
+            // InternalFormalML.g:19823:2: rule__Procedure__Group_8_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3__1__Impl"
+    // InternalFormalML.g:19829:1: rule__Procedure__Group_8_3__1__Impl : ( ( rule__Procedure__Alternatives_8_3_1 )* ) ;
+    public final void rule__Procedure__Group_8_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19833:1: ( ( ( rule__Procedure__Alternatives_8_3_1 )* ) )
+            // InternalFormalML.g:19834:1: ( ( rule__Procedure__Alternatives_8_3_1 )* )
+            {
+            // InternalFormalML.g:19834:1: ( ( rule__Procedure__Alternatives_8_3_1 )* )
+            // InternalFormalML.g:19835:2: ( rule__Procedure__Alternatives_8_3_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_8_3_1()); 
+            }
+            // InternalFormalML.g:19836:2: ( rule__Procedure__Alternatives_8_3_1 )*
+            loop367:
+            do {
+                int alt367=2;
+                int LA367_0 = input.LA(1);
+
+                if ( (LA367_0==16||LA367_0==199) ) {
+                    alt367=1;
+                }
+
+
+                switch (alt367) {
+            	case 1 :
+            	    // InternalFormalML.g:19836:3: rule__Procedure__Alternatives_8_3_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    rule__Procedure__Alternatives_8_3_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop367;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_8_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3_1_1__0"
+    // InternalFormalML.g:19845:1: rule__Procedure__Group_8_3_1_1__0 : rule__Procedure__Group_8_3_1_1__0__Impl rule__Procedure__Group_8_3_1_1__1 ;
+    public final void rule__Procedure__Group_8_3_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19849:1: ( rule__Procedure__Group_8_3_1_1__0__Impl rule__Procedure__Group_8_3_1_1__1 )
+            // InternalFormalML.g:19850:2: rule__Procedure__Group_8_3_1_1__0__Impl rule__Procedure__Group_8_3_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Procedure__Group_8_3_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_3_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3_1_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3_1_1__0__Impl"
+    // InternalFormalML.g:19857:1: rule__Procedure__Group_8_3_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Procedure__Group_8_3_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19861:1: ( ( '{' ) )
+            // InternalFormalML.g:19862:1: ( '{' )
+            {
+            // InternalFormalML.g:19862:1: ( '{' )
+            // InternalFormalML.g:19863:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3_1_1__1"
+    // InternalFormalML.g:19872:1: rule__Procedure__Group_8_3_1_1__1 : rule__Procedure__Group_8_3_1_1__1__Impl rule__Procedure__Group_8_3_1_1__2 ;
+    public final void rule__Procedure__Group_8_3_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19876:1: ( rule__Procedure__Group_8_3_1_1__1__Impl rule__Procedure__Group_8_3_1_1__2 )
+            // InternalFormalML.g:19877:2: rule__Procedure__Group_8_3_1_1__1__Impl rule__Procedure__Group_8_3_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Procedure__Group_8_3_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_3_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3_1_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3_1_1__1__Impl"
+    // InternalFormalML.g:19884:1: rule__Procedure__Group_8_3_1_1__1__Impl : ( ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )* ) ) ;
+    public final void rule__Procedure__Group_8_3_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19888:1: ( ( ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )* ) ) )
+            // InternalFormalML.g:19889:1: ( ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:19889:1: ( ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )* ) )
+            // InternalFormalML.g:19890:2: ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )* )
+            {
+            // InternalFormalML.g:19890:2: ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 ) )
+            // InternalFormalML.g:19891:3: ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_1_1()); 
+            }
+            // InternalFormalML.g:19892:3: ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )
+            // InternalFormalML.g:19892:4: rule__Procedure__ParameterAssignment_8_3_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Procedure__ParameterAssignment_8_3_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:19895:2: ( ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )* )
+            // InternalFormalML.g:19896:3: ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_1_1()); 
+            }
+            // InternalFormalML.g:19897:3: ( rule__Procedure__ParameterAssignment_8_3_1_1_1 )*
+            loop368:
+            do {
+                int alt368=2;
+                int LA368_0 = input.LA(1);
+
+                if ( (LA368_0==16) ) {
+                    alt368=1;
+                }
+
+
+                switch (alt368) {
+            	case 1 :
+            	    // InternalFormalML.g:19897:4: rule__Procedure__ParameterAssignment_8_3_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Procedure__ParameterAssignment_8_3_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop368;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterAssignment_8_3_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3_1_1__2"
+    // InternalFormalML.g:19906:1: rule__Procedure__Group_8_3_1_1__2 : rule__Procedure__Group_8_3_1_1__2__Impl ;
+    public final void rule__Procedure__Group_8_3_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19910:1: ( rule__Procedure__Group_8_3_1_1__2__Impl )
+            // InternalFormalML.g:19911:2: rule__Procedure__Group_8_3_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_8_3_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3_1_1__2"
+
+
+    // $ANTLR start "rule__Procedure__Group_8_3_1_1__2__Impl"
+    // InternalFormalML.g:19917:1: rule__Procedure__Group_8_3_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Procedure__Group_8_3_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19921:1: ( ( '}' ) )
+            // InternalFormalML.g:19922:1: ( '}' )
+            {
+            // InternalFormalML.g:19922:1: ( '}' )
+            // InternalFormalML.g:19923:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_3_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_3_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_8_3_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_0__0"
+    // InternalFormalML.g:19933:1: rule__Procedure__Group_9_0__0 : rule__Procedure__Group_9_0__0__Impl rule__Procedure__Group_9_0__1 ;
+    public final void rule__Procedure__Group_9_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19937:1: ( rule__Procedure__Group_9_0__0__Impl rule__Procedure__Group_9_0__1 )
+            // InternalFormalML.g:19938:2: rule__Procedure__Group_9_0__0__Impl rule__Procedure__Group_9_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__Procedure__Group_9_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_9_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_0__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_0__0__Impl"
+    // InternalFormalML.g:19945:1: rule__Procedure__Group_9_0__0__Impl : ( '@property:' ) ;
+    public final void rule__Procedure__Group_9_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19949:1: ( ( '@property:' ) )
+            // InternalFormalML.g:19950:1: ( '@property:' )
+            {
+            // InternalFormalML.g:19950:1: ( '@property:' )
+            // InternalFormalML.g:19951:2: '@property:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()); 
+            }
+            match(input,202,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_0__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_0__1"
+    // InternalFormalML.g:19960:1: rule__Procedure__Group_9_0__1 : rule__Procedure__Group_9_0__1__Impl ;
+    public final void rule__Procedure__Group_9_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19964:1: ( rule__Procedure__Group_9_0__1__Impl )
+            // InternalFormalML.g:19965:2: rule__Procedure__Group_9_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_9_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_0__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_0__1__Impl"
+    // InternalFormalML.g:19971:1: rule__Procedure__Group_9_0__1__Impl : ( ( rule__Procedure__Alternatives_9_0_1 )* ) ;
+    public final void rule__Procedure__Group_9_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19975:1: ( ( ( rule__Procedure__Alternatives_9_0_1 )* ) )
+            // InternalFormalML.g:19976:1: ( ( rule__Procedure__Alternatives_9_0_1 )* )
+            {
+            // InternalFormalML.g:19976:1: ( ( rule__Procedure__Alternatives_9_0_1 )* )
+            // InternalFormalML.g:19977:2: ( rule__Procedure__Alternatives_9_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_9_0_1()); 
+            }
+            // InternalFormalML.g:19978:2: ( rule__Procedure__Alternatives_9_0_1 )*
+            loop369:
+            do {
+                int alt369=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA369_2 = input.LA(2);
+
+                    if ( ((LA369_2>=15 && LA369_2<=19)||LA369_2==28||(LA369_2>=143 && LA369_2<=145)||LA369_2==179||LA369_2==229||(LA369_2>=278 && LA369_2<=283)) ) {
+                        alt369=1;
+                    }
+                    else if ( (LA369_2==224) ) {
+                        int LA369_6 = input.LA(3);
+
+                        if ( (LA369_6==RULE_XLIA_ID||(LA369_6>=15 && LA369_6<=18)||LA369_6==39||(LA369_6>=59 && LA369_6<=74)||(LA369_6>=129 && LA369_6<=132)||LA369_6==149||(LA369_6>=163 && LA369_6<=171)||(LA369_6>=231 && LA369_6<=237)||LA369_6==277||LA369_6==282) ) {
+                            alt369=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA369_3 = input.LA(2);
+
+                    if ( (LA369_3==224) ) {
+                        int LA369_6 = input.LA(3);
+
+                        if ( (LA369_6==RULE_XLIA_ID||(LA369_6>=15 && LA369_6<=18)||LA369_6==39||(LA369_6>=59 && LA369_6<=74)||(LA369_6>=129 && LA369_6<=132)||LA369_6==149||(LA369_6>=163 && LA369_6<=171)||(LA369_6>=231 && LA369_6<=237)||LA369_6==277||LA369_6==282) ) {
+                            alt369=1;
+                        }
+
+
+                    }
+                    else if ( ((LA369_3>=15 && LA369_3<=19)||LA369_3==28||(LA369_3>=143 && LA369_3<=145)||LA369_3==179||LA369_3==229||(LA369_3>=278 && LA369_3<=283)) ) {
+                        alt369=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA369_4 = input.LA(2);
+
+                    if ( ((LA369_4>=15 && LA369_4<=19)||LA369_4==28||(LA369_4>=143 && LA369_4<=145)||LA369_4==179||LA369_4==229||(LA369_4>=278 && LA369_4<=283)) ) {
+                        alt369=1;
+                    }
+                    else if ( (LA369_4==224) ) {
+                        int LA369_6 = input.LA(3);
+
+                        if ( (LA369_6==RULE_XLIA_ID||(LA369_6>=15 && LA369_6<=18)||LA369_6==39||(LA369_6>=59 && LA369_6<=74)||(LA369_6>=129 && LA369_6<=132)||LA369_6==149||(LA369_6>=163 && LA369_6<=171)||(LA369_6>=231 && LA369_6<=237)||LA369_6==277||LA369_6==282) ) {
+                            alt369=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA369_5 = input.LA(2);
+
+                    if ( ((LA369_5>=15 && LA369_5<=19)||LA369_5==28||(LA369_5>=143 && LA369_5<=145)||LA369_5==179||LA369_5==229||(LA369_5>=278 && LA369_5<=283)) ) {
+                        alt369=1;
+                    }
+                    else if ( (LA369_5==224) ) {
+                        int LA369_6 = input.LA(3);
+
+                        if ( (LA369_6==RULE_XLIA_ID||(LA369_6>=15 && LA369_6<=18)||LA369_6==39||(LA369_6>=59 && LA369_6<=74)||(LA369_6>=129 && LA369_6<=132)||LA369_6==149||(LA369_6>=163 && LA369_6<=171)||(LA369_6>=231 && LA369_6<=237)||LA369_6==277||LA369_6==282) ) {
+                            alt369=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA369_6 = input.LA(2);
+
+                    if ( (LA369_6==RULE_XLIA_ID||(LA369_6>=15 && LA369_6<=18)||LA369_6==39||(LA369_6>=59 && LA369_6<=74)||(LA369_6>=129 && LA369_6<=132)||LA369_6==149||(LA369_6>=163 && LA369_6<=171)||(LA369_6>=231 && LA369_6<=237)||LA369_6==277||LA369_6==282) ) {
+                        alt369=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 282:
+                case 283:
+                    {
+                    alt369=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt369) {
+            	case 1 :
+            	    // InternalFormalML.g:19978:3: rule__Procedure__Alternatives_9_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__Procedure__Alternatives_9_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop369;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_9_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_0__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_1__0"
+    // InternalFormalML.g:19987:1: rule__Procedure__Group_9_1__0 : rule__Procedure__Group_9_1__0__Impl rule__Procedure__Group_9_1__1 ;
+    public final void rule__Procedure__Group_9_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:19991:1: ( rule__Procedure__Group_9_1__0__Impl rule__Procedure__Group_9_1__1 )
+            // InternalFormalML.g:19992:2: rule__Procedure__Group_9_1__0__Impl rule__Procedure__Group_9_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__Procedure__Group_9_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_9_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_1__0__Impl"
+    // InternalFormalML.g:19999:1: rule__Procedure__Group_9_1__0__Impl : ( '@public:' ) ;
+    public final void rule__Procedure__Group_9_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20003:1: ( ( '@public:' ) )
+            // InternalFormalML.g:20004:1: ( '@public:' )
+            {
+            // InternalFormalML.g:20004:1: ( '@public:' )
+            // InternalFormalML.g:20005:2: '@public:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0()); 
+            }
+            match(input,203,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_1__1"
+    // InternalFormalML.g:20014:1: rule__Procedure__Group_9_1__1 : rule__Procedure__Group_9_1__1__Impl ;
+    public final void rule__Procedure__Group_9_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20018:1: ( rule__Procedure__Group_9_1__1__Impl )
+            // InternalFormalML.g:20019:2: rule__Procedure__Group_9_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_9_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_1__1__Impl"
+    // InternalFormalML.g:20025:1: rule__Procedure__Group_9_1__1__Impl : ( ( rule__Procedure__Alternatives_9_1_1 )* ) ;
+    public final void rule__Procedure__Group_9_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20029:1: ( ( ( rule__Procedure__Alternatives_9_1_1 )* ) )
+            // InternalFormalML.g:20030:1: ( ( rule__Procedure__Alternatives_9_1_1 )* )
+            {
+            // InternalFormalML.g:20030:1: ( ( rule__Procedure__Alternatives_9_1_1 )* )
+            // InternalFormalML.g:20031:2: ( rule__Procedure__Alternatives_9_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_9_1_1()); 
+            }
+            // InternalFormalML.g:20032:2: ( rule__Procedure__Alternatives_9_1_1 )*
+            loop370:
+            do {
+                int alt370=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA370_2 = input.LA(2);
+
+                    if ( (LA370_2==229) ) {
+                        alt370=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA370_3 = input.LA(2);
+
+                    if ( (LA370_3==229) ) {
+                        alt370=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA370_4 = input.LA(2);
+
+                    if ( (LA370_4==229) ) {
+                        alt370=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA370_5 = input.LA(2);
+
+                    if ( (LA370_5==229) ) {
+                        alt370=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA370_6 = input.LA(2);
+
+                    if ( (LA370_6==16||LA370_6==179||LA370_6==224||LA370_6==283) ) {
+                        alt370=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt370=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt370) {
+            	case 1 :
+            	    // InternalFormalML.g:20032:3: rule__Procedure__Alternatives_9_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__Procedure__Alternatives_9_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop370;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_9_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_1__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_2__0"
+    // InternalFormalML.g:20041:1: rule__Procedure__Group_9_2__0 : rule__Procedure__Group_9_2__0__Impl rule__Procedure__Group_9_2__1 ;
+    public final void rule__Procedure__Group_9_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20045:1: ( rule__Procedure__Group_9_2__0__Impl rule__Procedure__Group_9_2__1 )
+            // InternalFormalML.g:20046:2: rule__Procedure__Group_9_2__0__Impl rule__Procedure__Group_9_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__Procedure__Group_9_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_9_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_2__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_2__0__Impl"
+    // InternalFormalML.g:20053:1: rule__Procedure__Group_9_2__0__Impl : ( '@protected:' ) ;
+    public final void rule__Procedure__Group_9_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20057:1: ( ( '@protected:' ) )
+            // InternalFormalML.g:20058:1: ( '@protected:' )
+            {
+            // InternalFormalML.g:20058:1: ( '@protected:' )
+            // InternalFormalML.g:20059:2: '@protected:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()); 
+            }
+            match(input,204,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_2__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_2__1"
+    // InternalFormalML.g:20068:1: rule__Procedure__Group_9_2__1 : rule__Procedure__Group_9_2__1__Impl ;
+    public final void rule__Procedure__Group_9_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20072:1: ( rule__Procedure__Group_9_2__1__Impl )
+            // InternalFormalML.g:20073:2: rule__Procedure__Group_9_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_9_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_2__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_2__1__Impl"
+    // InternalFormalML.g:20079:1: rule__Procedure__Group_9_2__1__Impl : ( ( rule__Procedure__Alternatives_9_2_1 )* ) ;
+    public final void rule__Procedure__Group_9_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20083:1: ( ( ( rule__Procedure__Alternatives_9_2_1 )* ) )
+            // InternalFormalML.g:20084:1: ( ( rule__Procedure__Alternatives_9_2_1 )* )
+            {
+            // InternalFormalML.g:20084:1: ( ( rule__Procedure__Alternatives_9_2_1 )* )
+            // InternalFormalML.g:20085:2: ( rule__Procedure__Alternatives_9_2_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_9_2_1()); 
+            }
+            // InternalFormalML.g:20086:2: ( rule__Procedure__Alternatives_9_2_1 )*
+            loop371:
+            do {
+                int alt371=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA371_2 = input.LA(2);
+
+                    if ( (LA371_2==229) ) {
+                        alt371=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA371_3 = input.LA(2);
+
+                    if ( (LA371_3==229) ) {
+                        alt371=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA371_4 = input.LA(2);
+
+                    if ( (LA371_4==229) ) {
+                        alt371=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA371_5 = input.LA(2);
+
+                    if ( (LA371_5==229) ) {
+                        alt371=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA371_6 = input.LA(2);
+
+                    if ( (LA371_6==16||LA371_6==179||LA371_6==224||LA371_6==283) ) {
+                        alt371=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt371=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt371) {
+            	case 1 :
+            	    // InternalFormalML.g:20086:3: rule__Procedure__Alternatives_9_2_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__Procedure__Alternatives_9_2_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop371;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_9_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_2__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_3__0"
+    // InternalFormalML.g:20095:1: rule__Procedure__Group_9_3__0 : rule__Procedure__Group_9_3__0__Impl rule__Procedure__Group_9_3__1 ;
+    public final void rule__Procedure__Group_9_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20099:1: ( rule__Procedure__Group_9_3__0__Impl rule__Procedure__Group_9_3__1 )
+            // InternalFormalML.g:20100:2: rule__Procedure__Group_9_3__0__Impl rule__Procedure__Group_9_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__Procedure__Group_9_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_9_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_3__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_3__0__Impl"
+    // InternalFormalML.g:20107:1: rule__Procedure__Group_9_3__0__Impl : ( '@private:' ) ;
+    public final void rule__Procedure__Group_9_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20111:1: ( ( '@private:' ) )
+            // InternalFormalML.g:20112:1: ( '@private:' )
+            {
+            // InternalFormalML.g:20112:1: ( '@private:' )
+            // InternalFormalML.g:20113:2: '@private:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()); 
+            }
+            match(input,205,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_3__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_3__1"
+    // InternalFormalML.g:20122:1: rule__Procedure__Group_9_3__1 : rule__Procedure__Group_9_3__1__Impl ;
+    public final void rule__Procedure__Group_9_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20126:1: ( rule__Procedure__Group_9_3__1__Impl )
+            // InternalFormalML.g:20127:2: rule__Procedure__Group_9_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_9_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_3__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_9_3__1__Impl"
+    // InternalFormalML.g:20133:1: rule__Procedure__Group_9_3__1__Impl : ( ( rule__Procedure__Alternatives_9_3_1 )* ) ;
+    public final void rule__Procedure__Group_9_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20137:1: ( ( ( rule__Procedure__Alternatives_9_3_1 )* ) )
+            // InternalFormalML.g:20138:1: ( ( rule__Procedure__Alternatives_9_3_1 )* )
+            {
+            // InternalFormalML.g:20138:1: ( ( rule__Procedure__Alternatives_9_3_1 )* )
+            // InternalFormalML.g:20139:2: ( rule__Procedure__Alternatives_9_3_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_9_3_1()); 
+            }
+            // InternalFormalML.g:20140:2: ( rule__Procedure__Alternatives_9_3_1 )*
+            loop372:
+            do {
+                int alt372=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA372_2 = input.LA(2);
+
+                    if ( (LA372_2==229) ) {
+                        alt372=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA372_3 = input.LA(2);
+
+                    if ( (LA372_3==229) ) {
+                        alt372=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA372_4 = input.LA(2);
+
+                    if ( (LA372_4==229) ) {
+                        alt372=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA372_5 = input.LA(2);
+
+                    if ( (LA372_5==229) ) {
+                        alt372=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA372_6 = input.LA(2);
+
+                    if ( (LA372_6==16||LA372_6==179||LA372_6==224||LA372_6==283) ) {
+                        alt372=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt372=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt372) {
+            	case 1 :
+            	    // InternalFormalML.g:20140:3: rule__Procedure__Alternatives_9_3_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__Procedure__Alternatives_9_3_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop372;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_9_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_9_3__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_10_0_0__0"
+    // InternalFormalML.g:20149:1: rule__Procedure__Group_10_0_0__0 : rule__Procedure__Group_10_0_0__0__Impl rule__Procedure__Group_10_0_0__1 ;
+    public final void rule__Procedure__Group_10_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20153:1: ( rule__Procedure__Group_10_0_0__0__Impl rule__Procedure__Group_10_0_0__1 )
+            // InternalFormalML.g:20154:2: rule__Procedure__Group_10_0_0__0__Impl rule__Procedure__Group_10_0_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_42);
+            rule__Procedure__Group_10_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_10_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_10_0_0__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_10_0_0__0__Impl"
+    // InternalFormalML.g:20161:1: rule__Procedure__Group_10_0_0__0__Impl : ( ( rule__Procedure__Alternatives_10_0_0_0 ) ) ;
+    public final void rule__Procedure__Group_10_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20165:1: ( ( ( rule__Procedure__Alternatives_10_0_0_0 ) ) )
+            // InternalFormalML.g:20166:1: ( ( rule__Procedure__Alternatives_10_0_0_0 ) )
+            {
+            // InternalFormalML.g:20166:1: ( ( rule__Procedure__Alternatives_10_0_0_0 ) )
+            // InternalFormalML.g:20167:2: ( rule__Procedure__Alternatives_10_0_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getAlternatives_10_0_0_0()); 
+            }
+            // InternalFormalML.g:20168:2: ( rule__Procedure__Alternatives_10_0_0_0 )
+            // InternalFormalML.g:20168:3: rule__Procedure__Alternatives_10_0_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Alternatives_10_0_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getAlternatives_10_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_10_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_10_0_0__1"
+    // InternalFormalML.g:20176:1: rule__Procedure__Group_10_0_0__1 : rule__Procedure__Group_10_0_0__1__Impl ;
+    public final void rule__Procedure__Group_10_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20180:1: ( rule__Procedure__Group_10_0_0__1__Impl )
+            // InternalFormalML.g:20181:2: rule__Procedure__Group_10_0_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_10_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_10_0_0__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_10_0_0__1__Impl"
+    // InternalFormalML.g:20187:1: rule__Procedure__Group_10_0_0__1__Impl : ( ( ( rule__Procedure__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Procedure__RoutineAssignment_10_0_0_1 )* ) ) ;
+    public final void rule__Procedure__Group_10_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20191:1: ( ( ( ( rule__Procedure__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Procedure__RoutineAssignment_10_0_0_1 )* ) ) )
+            // InternalFormalML.g:20192:1: ( ( ( rule__Procedure__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Procedure__RoutineAssignment_10_0_0_1 )* ) )
+            {
+            // InternalFormalML.g:20192:1: ( ( ( rule__Procedure__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Procedure__RoutineAssignment_10_0_0_1 )* ) )
+            // InternalFormalML.g:20193:2: ( ( rule__Procedure__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Procedure__RoutineAssignment_10_0_0_1 )* )
+            {
+            // InternalFormalML.g:20193:2: ( ( rule__Procedure__RoutineAssignment_10_0_0_1 ) )
+            // InternalFormalML.g:20194:3: ( rule__Procedure__RoutineAssignment_10_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRoutineAssignment_10_0_0_1()); 
+            }
+            // InternalFormalML.g:20195:3: ( rule__Procedure__RoutineAssignment_10_0_0_1 )
+            // InternalFormalML.g:20195:4: rule__Procedure__RoutineAssignment_10_0_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_43);
+            rule__Procedure__RoutineAssignment_10_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRoutineAssignment_10_0_0_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:20198:2: ( ( rule__Procedure__RoutineAssignment_10_0_0_1 )* )
+            // InternalFormalML.g:20199:3: ( rule__Procedure__RoutineAssignment_10_0_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRoutineAssignment_10_0_0_1()); 
+            }
+            // InternalFormalML.g:20200:3: ( rule__Procedure__RoutineAssignment_10_0_0_1 )*
+            loop373:
+            do {
+                int alt373=2;
+                int LA373_0 = input.LA(1);
+
+                if ( (LA373_0==28||(LA373_0>=143 && LA373_0<=145)||(LA373_0>=224 && LA373_0<=225)) ) {
+                    alt373=1;
+                }
+
+
+                switch (alt373) {
+            	case 1 :
+            	    // InternalFormalML.g:20200:4: rule__Procedure__RoutineAssignment_10_0_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_43);
+            	    rule__Procedure__RoutineAssignment_10_0_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop373;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRoutineAssignment_10_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_10_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_10_0_1__0"
+    // InternalFormalML.g:20210:1: rule__Procedure__Group_10_0_1__0 : rule__Procedure__Group_10_0_1__0__Impl rule__Procedure__Group_10_0_1__1 ;
+    public final void rule__Procedure__Group_10_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20214:1: ( rule__Procedure__Group_10_0_1__0__Impl rule__Procedure__Group_10_0_1__1 )
+            // InternalFormalML.g:20215:2: rule__Procedure__Group_10_0_1__0__Impl rule__Procedure__Group_10_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_44);
+            rule__Procedure__Group_10_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_10_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_10_0_1__0"
+
+
+    // $ANTLR start "rule__Procedure__Group_10_0_1__0__Impl"
+    // InternalFormalML.g:20222:1: rule__Procedure__Group_10_0_1__0__Impl : ( '@procedure:' ) ;
+    public final void rule__Procedure__Group_10_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20226:1: ( ( '@procedure:' ) )
+            // InternalFormalML.g:20227:1: ( '@procedure:' )
+            {
+            // InternalFormalML.g:20227:1: ( '@procedure:' )
+            // InternalFormalML.g:20228:2: '@procedure:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getProcedureKeyword_10_0_1_0()); 
+            }
+            match(input,206,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getProcedureKeyword_10_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_10_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__Procedure__Group_10_0_1__1"
+    // InternalFormalML.g:20237:1: rule__Procedure__Group_10_0_1__1 : rule__Procedure__Group_10_0_1__1__Impl ;
+    public final void rule__Procedure__Group_10_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20241:1: ( rule__Procedure__Group_10_0_1__1__Impl )
+            // InternalFormalML.g:20242:2: rule__Procedure__Group_10_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Procedure__Group_10_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_10_0_1__1"
+
+
+    // $ANTLR start "rule__Procedure__Group_10_0_1__1__Impl"
+    // InternalFormalML.g:20248:1: rule__Procedure__Group_10_0_1__1__Impl : ( ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 )* ) ) ;
+    public final void rule__Procedure__Group_10_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20252:1: ( ( ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 )* ) ) )
+            // InternalFormalML.g:20253:1: ( ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 )* ) )
+            {
+            // InternalFormalML.g:20253:1: ( ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 )* ) )
+            // InternalFormalML.g:20254:2: ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 )* )
+            {
+            // InternalFormalML.g:20254:2: ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 ) )
+            // InternalFormalML.g:20255:3: ( rule__Procedure__ProcedureAssignment_10_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getProcedureAssignment_10_0_1_1()); 
+            }
+            // InternalFormalML.g:20256:3: ( rule__Procedure__ProcedureAssignment_10_0_1_1 )
+            // InternalFormalML.g:20256:4: rule__Procedure__ProcedureAssignment_10_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__Procedure__ProcedureAssignment_10_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getProcedureAssignment_10_0_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:20259:2: ( ( rule__Procedure__ProcedureAssignment_10_0_1_1 )* )
+            // InternalFormalML.g:20260:3: ( rule__Procedure__ProcedureAssignment_10_0_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getProcedureAssignment_10_0_1_1()); 
+            }
+            // InternalFormalML.g:20261:3: ( rule__Procedure__ProcedureAssignment_10_0_1_1 )*
+            loop374:
+            do {
+                int alt374=2;
+                int LA374_0 = input.LA(1);
+
+                if ( (LA374_0==28||(LA374_0>=143 && LA374_0<=145)||LA374_0==214) ) {
+                    alt374=1;
+                }
+
+
+                switch (alt374) {
+            	case 1 :
+            	    // InternalFormalML.g:20261:4: rule__Procedure__ProcedureAssignment_10_0_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_5);
+            	    rule__Procedure__ProcedureAssignment_10_0_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop374;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getProcedureAssignment_10_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__Group_10_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group__0"
+    // InternalFormalML.g:20271:1: rule__ProcedureExecution__Group__0 : rule__ProcedureExecution__Group__0__Impl rule__ProcedureExecution__Group__1 ;
+    public final void rule__ProcedureExecution__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20275:1: ( rule__ProcedureExecution__Group__0__Impl rule__ProcedureExecution__Group__1 )
+            // InternalFormalML.g:20276:2: rule__ProcedureExecution__Group__0__Impl rule__ProcedureExecution__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_73);
+            rule__ProcedureExecution__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group__0"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group__0__Impl"
+    // InternalFormalML.g:20283:1: rule__ProcedureExecution__Group__0__Impl : ( () ) ;
+    public final void rule__ProcedureExecution__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20287:1: ( ( () ) )
+            // InternalFormalML.g:20288:1: ( () )
+            {
+            // InternalFormalML.g:20288:1: ( () )
+            // InternalFormalML.g:20289:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getModelOfExecutionAction_0()); 
+            }
+            // InternalFormalML.g:20290:2: ()
+            // InternalFormalML.g:20290:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getModelOfExecutionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group__1"
+    // InternalFormalML.g:20298:1: rule__ProcedureExecution__Group__1 : rule__ProcedureExecution__Group__1__Impl rule__ProcedureExecution__Group__2 ;
+    public final void rule__ProcedureExecution__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20302:1: ( rule__ProcedureExecution__Group__1__Impl rule__ProcedureExecution__Group__2 )
+            // InternalFormalML.g:20303:2: rule__ProcedureExecution__Group__1__Impl rule__ProcedureExecution__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_73);
+            rule__ProcedureExecution__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group__1"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group__1__Impl"
+    // InternalFormalML.g:20310:1: rule__ProcedureExecution__Group__1__Impl : ( ( '@moe:' )? ) ;
+    public final void rule__ProcedureExecution__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20314:1: ( ( ( '@moe:' )? ) )
+            // InternalFormalML.g:20315:1: ( ( '@moe:' )? )
+            {
+            // InternalFormalML.g:20315:1: ( ( '@moe:' )? )
+            // InternalFormalML.g:20316:2: ( '@moe:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getMoeKeyword_1()); 
+            }
+            // InternalFormalML.g:20317:2: ( '@moe:' )?
+            int alt375=2;
+            int LA375_0 = input.LA(1);
+
+            if ( (LA375_0==221) ) {
+                alt375=1;
+            }
+            switch (alt375) {
+                case 1 :
+                    // InternalFormalML.g:20317:3: '@moe:'
+                    {
+                    match(input,221,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getMoeKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group__2"
+    // InternalFormalML.g:20325:1: rule__ProcedureExecution__Group__2 : rule__ProcedureExecution__Group__2__Impl ;
+    public final void rule__ProcedureExecution__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20329:1: ( rule__ProcedureExecution__Group__2__Impl )
+            // InternalFormalML.g:20330:2: rule__ProcedureExecution__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group__2"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group__2__Impl"
+    // InternalFormalML.g:20336:1: rule__ProcedureExecution__Group__2__Impl : ( ( rule__ProcedureExecution__UnorderedGroup_2 ) ) ;
+    public final void rule__ProcedureExecution__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20340:1: ( ( ( rule__ProcedureExecution__UnorderedGroup_2 ) ) )
+            // InternalFormalML.g:20341:1: ( ( rule__ProcedureExecution__UnorderedGroup_2 ) )
+            {
+            // InternalFormalML.g:20341:1: ( ( rule__ProcedureExecution__UnorderedGroup_2 ) )
+            // InternalFormalML.g:20342:2: ( rule__ProcedureExecution__UnorderedGroup_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()); 
+            }
+            // InternalFormalML.g:20343:2: ( rule__ProcedureExecution__UnorderedGroup_2 )
+            // InternalFormalML.g:20343:3: rule__ProcedureExecution__UnorderedGroup_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__UnorderedGroup_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group_2_0__0"
+    // InternalFormalML.g:20352:1: rule__ProcedureExecution__Group_2_0__0 : rule__ProcedureExecution__Group_2_0__0__Impl rule__ProcedureExecution__Group_2_0__1 ;
+    public final void rule__ProcedureExecution__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20356:1: ( rule__ProcedureExecution__Group_2_0__0__Impl rule__ProcedureExecution__Group_2_0__1 )
+            // InternalFormalML.g:20357:2: rule__ProcedureExecution__Group_2_0__0__Impl rule__ProcedureExecution__Group_2_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ProcedureExecution__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__Group_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group_2_0__0"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group_2_0__0__Impl"
+    // InternalFormalML.g:20364:1: rule__ProcedureExecution__Group_2_0__0__Impl : ( '@schedule' ) ;
+    public final void rule__ProcedureExecution__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20368:1: ( ( '@schedule' ) )
+            // InternalFormalML.g:20369:1: ( '@schedule' )
+            {
+            // InternalFormalML.g:20369:1: ( '@schedule' )
+            // InternalFormalML.g:20370:2: '@schedule'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getScheduleKeyword_2_0_0()); 
+            }
+            match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getScheduleKeyword_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group_2_0__1"
+    // InternalFormalML.g:20379:1: rule__ProcedureExecution__Group_2_0__1 : rule__ProcedureExecution__Group_2_0__1__Impl ;
+    public final void rule__ProcedureExecution__Group_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20383:1: ( rule__ProcedureExecution__Group_2_0__1__Impl )
+            // InternalFormalML.g:20384:2: rule__ProcedureExecution__Group_2_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__Group_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group_2_0__1"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group_2_0__1__Impl"
+    // InternalFormalML.g:20390:1: rule__ProcedureExecution__Group_2_0__1__Impl : ( ( rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1 ) ) ;
+    public final void rule__ProcedureExecution__Group_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20394:1: ( ( ( rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1 ) ) )
+            // InternalFormalML.g:20395:1: ( ( rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1 ) )
+            {
+            // InternalFormalML.g:20395:1: ( ( rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1 ) )
+            // InternalFormalML.g:20396:2: ( rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineAssignment_2_0_1()); 
+            }
+            // InternalFormalML.g:20397:2: ( rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1 )
+            // InternalFormalML.g:20397:3: rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineAssignment_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group_2_1__0"
+    // InternalFormalML.g:20406:1: rule__ProcedureExecution__Group_2_1__0 : rule__ProcedureExecution__Group_2_1__0__Impl rule__ProcedureExecution__Group_2_1__1 ;
+    public final void rule__ProcedureExecution__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20410:1: ( rule__ProcedureExecution__Group_2_1__0__Impl rule__ProcedureExecution__Group_2_1__1 )
+            // InternalFormalML.g:20411:2: rule__ProcedureExecution__Group_2_1__0__Impl rule__ProcedureExecution__Group_2_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ProcedureExecution__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group_2_1__0"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group_2_1__0__Impl"
+    // InternalFormalML.g:20418:1: rule__ProcedureExecution__Group_2_1__0__Impl : ( '@run' ) ;
+    public final void rule__ProcedureExecution__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20422:1: ( ( '@run' ) )
+            // InternalFormalML.g:20423:1: ( '@run' )
+            {
+            // InternalFormalML.g:20423:1: ( '@run' )
+            // InternalFormalML.g:20424:2: '@run'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getRunKeyword_2_1_0()); 
+            }
+            match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getRunKeyword_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group_2_1__1"
+    // InternalFormalML.g:20433:1: rule__ProcedureExecution__Group_2_1__1 : rule__ProcedureExecution__Group_2_1__1__Impl ;
+    public final void rule__ProcedureExecution__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20437:1: ( rule__ProcedureExecution__Group_2_1__1__Impl )
+            // InternalFormalML.g:20438:2: rule__ProcedureExecution__Group_2_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group_2_1__1"
+
+
+    // $ANTLR start "rule__ProcedureExecution__Group_2_1__1__Impl"
+    // InternalFormalML.g:20444:1: rule__ProcedureExecution__Group_2_1__1__Impl : ( ( rule__ProcedureExecution__RunRoutineAssignment_2_1_1 ) ) ;
+    public final void rule__ProcedureExecution__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20448:1: ( ( ( rule__ProcedureExecution__RunRoutineAssignment_2_1_1 ) ) )
+            // InternalFormalML.g:20449:1: ( ( rule__ProcedureExecution__RunRoutineAssignment_2_1_1 ) )
+            {
+            // InternalFormalML.g:20449:1: ( ( rule__ProcedureExecution__RunRoutineAssignment_2_1_1 ) )
+            // InternalFormalML.g:20450:2: ( rule__ProcedureExecution__RunRoutineAssignment_2_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getRunRoutineAssignment_2_1_1()); 
+            }
+            // InternalFormalML.g:20451:2: ( rule__ProcedureExecution__RunRoutineAssignment_2_1_1 )
+            // InternalFormalML.g:20451:3: rule__ProcedureExecution__RunRoutineAssignment_2_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__RunRoutineAssignment_2_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getRunRoutineAssignment_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group__0"
+    // InternalFormalML.g:20460:1: rule__MoeBehavior__Group__0 : rule__MoeBehavior__Group__0__Impl rule__MoeBehavior__Group__1 ;
+    public final void rule__MoeBehavior__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20464:1: ( rule__MoeBehavior__Group__0__Impl rule__MoeBehavior__Group__1 )
+            // InternalFormalML.g:20465:2: rule__MoeBehavior__Group__0__Impl rule__MoeBehavior__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__MoeBehavior__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeBehavior__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group__0"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group__0__Impl"
+    // InternalFormalML.g:20472:1: rule__MoeBehavior__Group__0__Impl : ( () ) ;
+    public final void rule__MoeBehavior__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20476:1: ( ( () ) )
+            // InternalFormalML.g:20477:1: ( () )
+            {
+            // InternalFormalML.g:20477:1: ( () )
+            // InternalFormalML.g:20478:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getBehaviorAction_0()); 
+            }
+            // InternalFormalML.g:20479:2: ()
+            // InternalFormalML.g:20479:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getBehaviorAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group__1"
+    // InternalFormalML.g:20487:1: rule__MoeBehavior__Group__1 : rule__MoeBehavior__Group__1__Impl rule__MoeBehavior__Group__2 ;
+    public final void rule__MoeBehavior__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20491:1: ( rule__MoeBehavior__Group__1__Impl rule__MoeBehavior__Group__2 )
+            // InternalFormalML.g:20492:2: rule__MoeBehavior__Group__1__Impl rule__MoeBehavior__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_33);
+            rule__MoeBehavior__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeBehavior__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group__1"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group__1__Impl"
+    // InternalFormalML.g:20499:1: rule__MoeBehavior__Group__1__Impl : ( ( rule__MoeBehavior__Group_1__0 )? ) ;
+    public final void rule__MoeBehavior__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20503:1: ( ( ( rule__MoeBehavior__Group_1__0 )? ) )
+            // InternalFormalML.g:20504:1: ( ( rule__MoeBehavior__Group_1__0 )? )
+            {
+            // InternalFormalML.g:20504:1: ( ( rule__MoeBehavior__Group_1__0 )? )
+            // InternalFormalML.g:20505:2: ( rule__MoeBehavior__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:20506:2: ( rule__MoeBehavior__Group_1__0 )?
+            int alt376=2;
+            int LA376_0 = input.LA(1);
+
+            if ( (LA376_0==222) ) {
+                alt376=1;
+            }
+            switch (alt376) {
+                case 1 :
+                    // InternalFormalML.g:20506:3: rule__MoeBehavior__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group__2"
+    // InternalFormalML.g:20514:1: rule__MoeBehavior__Group__2 : rule__MoeBehavior__Group__2__Impl ;
+    public final void rule__MoeBehavior__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20518:1: ( rule__MoeBehavior__Group__2__Impl )
+            // InternalFormalML.g:20519:2: rule__MoeBehavior__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeBehavior__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group__2"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group__2__Impl"
+    // InternalFormalML.g:20525:1: rule__MoeBehavior__Group__2__Impl : ( ( rule__MoeBehavior__UnorderedGroup_2 ) ) ;
+    public final void rule__MoeBehavior__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20529:1: ( ( ( rule__MoeBehavior__UnorderedGroup_2 ) ) )
+            // InternalFormalML.g:20530:1: ( ( rule__MoeBehavior__UnorderedGroup_2 ) )
+            {
+            // InternalFormalML.g:20530:1: ( ( rule__MoeBehavior__UnorderedGroup_2 ) )
+            // InternalFormalML.g:20531:2: ( rule__MoeBehavior__UnorderedGroup_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()); 
+            }
+            // InternalFormalML.g:20532:2: ( rule__MoeBehavior__UnorderedGroup_2 )
+            // InternalFormalML.g:20532:3: rule__MoeBehavior__UnorderedGroup_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeBehavior__UnorderedGroup_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group__2__Impl"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group_1__0"
+    // InternalFormalML.g:20541:1: rule__MoeBehavior__Group_1__0 : rule__MoeBehavior__Group_1__0__Impl rule__MoeBehavior__Group_1__1 ;
+    public final void rule__MoeBehavior__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20545:1: ( rule__MoeBehavior__Group_1__0__Impl rule__MoeBehavior__Group_1__1 )
+            // InternalFormalML.g:20546:2: rule__MoeBehavior__Group_1__0__Impl rule__MoeBehavior__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__MoeBehavior__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeBehavior__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group_1__0"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group_1__0__Impl"
+    // InternalFormalML.g:20553:1: rule__MoeBehavior__Group_1__0__Impl : ( '@local:' ) ;
+    public final void rule__MoeBehavior__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20557:1: ( ( '@local:' ) )
+            // InternalFormalML.g:20558:1: ( '@local:' )
+            {
+            // InternalFormalML.g:20558:1: ( '@local:' )
+            // InternalFormalML.g:20559:2: '@local:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getLocalKeyword_1_0()); 
+            }
+            match(input,222,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getLocalKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group_1__1"
+    // InternalFormalML.g:20568:1: rule__MoeBehavior__Group_1__1 : rule__MoeBehavior__Group_1__1__Impl ;
+    public final void rule__MoeBehavior__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20572:1: ( rule__MoeBehavior__Group_1__1__Impl )
+            // InternalFormalML.g:20573:2: rule__MoeBehavior__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeBehavior__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group_1__1"
+
+
+    // $ANTLR start "rule__MoeBehavior__Group_1__1__Impl"
+    // InternalFormalML.g:20579:1: rule__MoeBehavior__Group_1__1__Impl : ( ( rule__MoeBehavior__Alternatives_1_1 )* ) ;
+    public final void rule__MoeBehavior__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20583:1: ( ( ( rule__MoeBehavior__Alternatives_1_1 )* ) )
+            // InternalFormalML.g:20584:1: ( ( rule__MoeBehavior__Alternatives_1_1 )* )
+            {
+            // InternalFormalML.g:20584:1: ( ( rule__MoeBehavior__Alternatives_1_1 )* )
+            // InternalFormalML.g:20585:2: ( rule__MoeBehavior__Alternatives_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getAlternatives_1_1()); 
+            }
+            // InternalFormalML.g:20586:2: ( rule__MoeBehavior__Alternatives_1_1 )*
+            loop377:
+            do {
+                int alt377=2;
+                int LA377_0 = input.LA(1);
+
+                if ( ((LA377_0>=15 && LA377_0<=19)||LA377_0==28||(LA377_0>=143 && LA377_0<=145)||LA377_0==179||LA377_0==224||LA377_0==229||(LA377_0>=278 && LA377_0<=281)||LA377_0==283) ) {
+                    alt377=1;
+                }
+
+
+                switch (alt377) {
+            	case 1 :
+            	    // InternalFormalML.g:20586:3: rule__MoeBehavior__Alternatives_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__MoeBehavior__Alternatives_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop377;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getAlternatives_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__0"
+    // InternalFormalML.g:20595:1: rule__Statemachine__Group__0 : rule__Statemachine__Group__0__Impl rule__Statemachine__Group__1 ;
+    public final void rule__Statemachine__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20599:1: ( rule__Statemachine__Group__0__Impl rule__Statemachine__Group__1 )
+            // InternalFormalML.g:20600:2: rule__Statemachine__Group__0__Impl rule__Statemachine__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_47);
+            rule__Statemachine__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group__0__Impl"
+    // InternalFormalML.g:20607:1: rule__Statemachine__Group__0__Impl : ( () ) ;
+    public final void rule__Statemachine__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20611:1: ( ( () ) )
+            // InternalFormalML.g:20612:1: ( () )
+            {
+            // InternalFormalML.g:20612:1: ( () )
+            // InternalFormalML.g:20613:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getStatemachineAction_0()); 
+            }
+            // InternalFormalML.g:20614:2: ()
+            // InternalFormalML.g:20614:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getStatemachineAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__1"
+    // InternalFormalML.g:20622:1: rule__Statemachine__Group__1 : rule__Statemachine__Group__1__Impl rule__Statemachine__Group__2 ;
+    public final void rule__Statemachine__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20626:1: ( rule__Statemachine__Group__1__Impl rule__Statemachine__Group__2 )
+            // InternalFormalML.g:20627:2: rule__Statemachine__Group__1__Impl rule__Statemachine__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_75);
+            rule__Statemachine__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group__1__Impl"
+    // InternalFormalML.g:20634:1: rule__Statemachine__Group__1__Impl : ( ( rule__Statemachine__UnorderedGroup_1 ) ) ;
+    public final void rule__Statemachine__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20638:1: ( ( ( rule__Statemachine__UnorderedGroup_1 ) ) )
+            // InternalFormalML.g:20639:1: ( ( rule__Statemachine__UnorderedGroup_1 ) )
+            {
+            // InternalFormalML.g:20639:1: ( ( rule__Statemachine__UnorderedGroup_1 ) )
+            // InternalFormalML.g:20640:2: ( rule__Statemachine__UnorderedGroup_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getUnorderedGroup_1()); 
+            }
+            // InternalFormalML.g:20641:2: ( rule__Statemachine__UnorderedGroup_1 )
+            // InternalFormalML.g:20641:3: rule__Statemachine__UnorderedGroup_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__UnorderedGroup_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getUnorderedGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__2"
+    // InternalFormalML.g:20649:1: rule__Statemachine__Group__2 : rule__Statemachine__Group__2__Impl rule__Statemachine__Group__3 ;
+    public final void rule__Statemachine__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20653:1: ( rule__Statemachine__Group__2__Impl rule__Statemachine__Group__3 )
+            // InternalFormalML.g:20654:2: rule__Statemachine__Group__2__Impl rule__Statemachine__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__Statemachine__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group__2__Impl"
+    // InternalFormalML.g:20661:1: rule__Statemachine__Group__2__Impl : ( 'statemachine' ) ;
+    public final void rule__Statemachine__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20665:1: ( ( 'statemachine' ) )
+            // InternalFormalML.g:20666:1: ( 'statemachine' )
+            {
+            // InternalFormalML.g:20666:1: ( 'statemachine' )
+            // InternalFormalML.g:20667:2: 'statemachine'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getStatemachineKeyword_2()); 
+            }
+            match(input,40,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getStatemachineKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__3"
+    // InternalFormalML.g:20676:1: rule__Statemachine__Group__3 : rule__Statemachine__Group__3__Impl rule__Statemachine__Group__4 ;
+    public final void rule__Statemachine__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20680:1: ( rule__Statemachine__Group__3__Impl rule__Statemachine__Group__4 )
+            // InternalFormalML.g:20681:2: rule__Statemachine__Group__3__Impl rule__Statemachine__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__Statemachine__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__3"
+
+
+    // $ANTLR start "rule__Statemachine__Group__3__Impl"
+    // InternalFormalML.g:20688:1: rule__Statemachine__Group__3__Impl : ( ( rule__Statemachine__Group_3__0 )? ) ;
+    public final void rule__Statemachine__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20692:1: ( ( ( rule__Statemachine__Group_3__0 )? ) )
+            // InternalFormalML.g:20693:1: ( ( rule__Statemachine__Group_3__0 )? )
+            {
+            // InternalFormalML.g:20693:1: ( ( rule__Statemachine__Group_3__0 )? )
+            // InternalFormalML.g:20694:2: ( rule__Statemachine__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getGroup_3()); 
+            }
+            // InternalFormalML.g:20695:2: ( rule__Statemachine__Group_3__0 )?
+            int alt378=2;
+            int LA378_0 = input.LA(1);
+
+            if ( (LA378_0==125) ) {
+                alt378=1;
+            }
+            switch (alt378) {
+                case 1 :
+                    // InternalFormalML.g:20695:3: rule__Statemachine__Group_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__4"
+    // InternalFormalML.g:20703:1: rule__Statemachine__Group__4 : rule__Statemachine__Group__4__Impl rule__Statemachine__Group__5 ;
+    public final void rule__Statemachine__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20707:1: ( rule__Statemachine__Group__4__Impl rule__Statemachine__Group__5 )
+            // InternalFormalML.g:20708:2: rule__Statemachine__Group__4__Impl rule__Statemachine__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__Statemachine__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__4"
+
+
+    // $ANTLR start "rule__Statemachine__Group__4__Impl"
+    // InternalFormalML.g:20715:1: rule__Statemachine__Group__4__Impl : ( ( rule__Statemachine__NameAssignment_4 ) ) ;
+    public final void rule__Statemachine__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20719:1: ( ( ( rule__Statemachine__NameAssignment_4 ) ) )
+            // InternalFormalML.g:20720:1: ( ( rule__Statemachine__NameAssignment_4 ) )
+            {
+            // InternalFormalML.g:20720:1: ( ( rule__Statemachine__NameAssignment_4 ) )
+            // InternalFormalML.g:20721:2: ( rule__Statemachine__NameAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getNameAssignment_4()); 
+            }
+            // InternalFormalML.g:20722:2: ( rule__Statemachine__NameAssignment_4 )
+            // InternalFormalML.g:20722:3: rule__Statemachine__NameAssignment_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__NameAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__5"
+    // InternalFormalML.g:20730:1: rule__Statemachine__Group__5 : rule__Statemachine__Group__5__Impl rule__Statemachine__Group__6 ;
+    public final void rule__Statemachine__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20734:1: ( rule__Statemachine__Group__5__Impl rule__Statemachine__Group__6 )
+            // InternalFormalML.g:20735:2: rule__Statemachine__Group__5__Impl rule__Statemachine__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__Statemachine__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__5"
+
+
+    // $ANTLR start "rule__Statemachine__Group__5__Impl"
+    // InternalFormalML.g:20742:1: rule__Statemachine__Group__5__Impl : ( ( rule__Statemachine__UnrestrictedNameAssignment_5 )? ) ;
+    public final void rule__Statemachine__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20746:1: ( ( ( rule__Statemachine__UnrestrictedNameAssignment_5 )? ) )
+            // InternalFormalML.g:20747:1: ( ( rule__Statemachine__UnrestrictedNameAssignment_5 )? )
+            {
+            // InternalFormalML.g:20747:1: ( ( rule__Statemachine__UnrestrictedNameAssignment_5 )? )
+            // InternalFormalML.g:20748:2: ( rule__Statemachine__UnrestrictedNameAssignment_5 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getUnrestrictedNameAssignment_5()); 
+            }
+            // InternalFormalML.g:20749:2: ( rule__Statemachine__UnrestrictedNameAssignment_5 )?
+            int alt379=2;
+            int LA379_0 = input.LA(1);
+
+            if ( (LA379_0==RULE_STRING) ) {
+                alt379=1;
+            }
+            switch (alt379) {
+                case 1 :
+                    // InternalFormalML.g:20749:3: rule__Statemachine__UnrestrictedNameAssignment_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__UnrestrictedNameAssignment_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getUnrestrictedNameAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__6"
+    // InternalFormalML.g:20757:1: rule__Statemachine__Group__6 : rule__Statemachine__Group__6__Impl rule__Statemachine__Group__7 ;
+    public final void rule__Statemachine__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20761:1: ( rule__Statemachine__Group__6__Impl rule__Statemachine__Group__7 )
+            // InternalFormalML.g:20762:2: rule__Statemachine__Group__6__Impl rule__Statemachine__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_58);
+            rule__Statemachine__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__6"
+
+
+    // $ANTLR start "rule__Statemachine__Group__6__Impl"
+    // InternalFormalML.g:20769:1: rule__Statemachine__Group__6__Impl : ( '{' ) ;
+    public final void rule__Statemachine__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20773:1: ( ( '{' ) )
+            // InternalFormalML.g:20774:1: ( '{' )
+            {
+            // InternalFormalML.g:20774:1: ( '{' )
+            // InternalFormalML.g:20775:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__7"
+    // InternalFormalML.g:20784:1: rule__Statemachine__Group__7 : rule__Statemachine__Group__7__Impl rule__Statemachine__Group__8 ;
+    public final void rule__Statemachine__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20788:1: ( rule__Statemachine__Group__7__Impl rule__Statemachine__Group__8 )
+            // InternalFormalML.g:20789:2: rule__Statemachine__Group__7__Impl rule__Statemachine__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_59);
+            rule__Statemachine__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__7"
+
+
+    // $ANTLR start "rule__Statemachine__Group__7__Impl"
+    // InternalFormalML.g:20796:1: rule__Statemachine__Group__7__Impl : ( ( rule__Statemachine__Alternatives_7 ) ) ;
+    public final void rule__Statemachine__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20800:1: ( ( ( rule__Statemachine__Alternatives_7 ) ) )
+            // InternalFormalML.g:20801:1: ( ( rule__Statemachine__Alternatives_7 ) )
+            {
+            // InternalFormalML.g:20801:1: ( ( rule__Statemachine__Alternatives_7 ) )
+            // InternalFormalML.g:20802:2: ( rule__Statemachine__Alternatives_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_7()); 
+            }
+            // InternalFormalML.g:20803:2: ( rule__Statemachine__Alternatives_7 )
+            // InternalFormalML.g:20803:3: rule__Statemachine__Alternatives_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Alternatives_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__7__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__8"
+    // InternalFormalML.g:20811:1: rule__Statemachine__Group__8 : rule__Statemachine__Group__8__Impl rule__Statemachine__Group__9 ;
+    public final void rule__Statemachine__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20815:1: ( rule__Statemachine__Group__8__Impl rule__Statemachine__Group__9 )
+            // InternalFormalML.g:20816:2: rule__Statemachine__Group__8__Impl rule__Statemachine__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_59);
+            rule__Statemachine__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__8"
+
+
+    // $ANTLR start "rule__Statemachine__Group__8__Impl"
+    // InternalFormalML.g:20823:1: rule__Statemachine__Group__8__Impl : ( ( rule__Statemachine__Alternatives_8 )* ) ;
+    public final void rule__Statemachine__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20827:1: ( ( ( rule__Statemachine__Alternatives_8 )* ) )
+            // InternalFormalML.g:20828:1: ( ( rule__Statemachine__Alternatives_8 )* )
+            {
+            // InternalFormalML.g:20828:1: ( ( rule__Statemachine__Alternatives_8 )* )
+            // InternalFormalML.g:20829:2: ( rule__Statemachine__Alternatives_8 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:20830:2: ( rule__Statemachine__Alternatives_8 )*
+            loop380:
+            do {
+                int alt380=2;
+                int LA380_0 = input.LA(1);
+
+                if ( ((LA380_0>=217 && LA380_0<=220)) ) {
+                    alt380=1;
+                }
+
+
+                switch (alt380) {
+            	case 1 :
+            	    // InternalFormalML.g:20830:3: rule__Statemachine__Alternatives_8
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_60);
+            	    rule__Statemachine__Alternatives_8();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop380;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__8__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__9"
+    // InternalFormalML.g:20838:1: rule__Statemachine__Group__9 : rule__Statemachine__Group__9__Impl rule__Statemachine__Group__10 ;
+    public final void rule__Statemachine__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20842:1: ( rule__Statemachine__Group__9__Impl rule__Statemachine__Group__10 )
+            // InternalFormalML.g:20843:2: rule__Statemachine__Group__9__Impl rule__Statemachine__Group__10
+            {
+            pushFollow(FollowSets000.FOLLOW_59);
+            rule__Statemachine__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__9"
+
+
+    // $ANTLR start "rule__Statemachine__Group__9__Impl"
+    // InternalFormalML.g:20850:1: rule__Statemachine__Group__9__Impl : ( ( rule__Statemachine__Alternatives_9 )* ) ;
+    public final void rule__Statemachine__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20854:1: ( ( ( rule__Statemachine__Alternatives_9 )* ) )
+            // InternalFormalML.g:20855:1: ( ( rule__Statemachine__Alternatives_9 )* )
+            {
+            // InternalFormalML.g:20855:1: ( ( rule__Statemachine__Alternatives_9 )* )
+            // InternalFormalML.g:20856:2: ( rule__Statemachine__Alternatives_9 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_9()); 
+            }
+            // InternalFormalML.g:20857:2: ( rule__Statemachine__Alternatives_9 )*
+            loop381:
+            do {
+                int alt381=2;
+                int LA381_0 = input.LA(1);
+
+                if ( ((LA381_0>=202 && LA381_0<=205)) ) {
+                    alt381=1;
+                }
+
+
+                switch (alt381) {
+            	case 1 :
+            	    // InternalFormalML.g:20857:3: rule__Statemachine__Alternatives_9
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_32);
+            	    rule__Statemachine__Alternatives_9();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop381;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__9__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__10"
+    // InternalFormalML.g:20865:1: rule__Statemachine__Group__10 : rule__Statemachine__Group__10__Impl rule__Statemachine__Group__11 ;
+    public final void rule__Statemachine__Group__10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20869:1: ( rule__Statemachine__Group__10__Impl rule__Statemachine__Group__11 )
+            // InternalFormalML.g:20870:2: rule__Statemachine__Group__10__Impl rule__Statemachine__Group__11
+            {
+            pushFollow(FollowSets000.FOLLOW_76);
+            rule__Statemachine__Group__10__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__10"
+
+
+    // $ANTLR start "rule__Statemachine__Group__10__Impl"
+    // InternalFormalML.g:20877:1: rule__Statemachine__Group__10__Impl : ( ( rule__Statemachine__Alternatives_10 ) ) ;
+    public final void rule__Statemachine__Group__10__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20881:1: ( ( ( rule__Statemachine__Alternatives_10 ) ) )
+            // InternalFormalML.g:20882:1: ( ( rule__Statemachine__Alternatives_10 ) )
+            {
+            // InternalFormalML.g:20882:1: ( ( rule__Statemachine__Alternatives_10 ) )
+            // InternalFormalML.g:20883:2: ( rule__Statemachine__Alternatives_10 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_10()); 
+            }
+            // InternalFormalML.g:20884:2: ( rule__Statemachine__Alternatives_10 )
+            // InternalFormalML.g:20884:3: rule__Statemachine__Alternatives_10
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Alternatives_10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_10()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__10__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__11"
+    // InternalFormalML.g:20892:1: rule__Statemachine__Group__11 : rule__Statemachine__Group__11__Impl rule__Statemachine__Group__12 ;
+    public final void rule__Statemachine__Group__11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20896:1: ( rule__Statemachine__Group__11__Impl rule__Statemachine__Group__12 )
+            // InternalFormalML.g:20897:2: rule__Statemachine__Group__11__Impl rule__Statemachine__Group__12
+            {
+            pushFollow(FollowSets000.FOLLOW_77);
+            rule__Statemachine__Group__11__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__12();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__11"
+
+
+    // $ANTLR start "rule__Statemachine__Group__11__Impl"
+    // InternalFormalML.g:20904:1: rule__Statemachine__Group__11__Impl : ( ( rule__Statemachine__Alternatives_11 ) ) ;
+    public final void rule__Statemachine__Group__11__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20908:1: ( ( ( rule__Statemachine__Alternatives_11 ) ) )
+            // InternalFormalML.g:20909:1: ( ( rule__Statemachine__Alternatives_11 ) )
+            {
+            // InternalFormalML.g:20909:1: ( ( rule__Statemachine__Alternatives_11 ) )
+            // InternalFormalML.g:20910:2: ( rule__Statemachine__Alternatives_11 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_11()); 
+            }
+            // InternalFormalML.g:20911:2: ( rule__Statemachine__Alternatives_11 )
+            // InternalFormalML.g:20911:3: rule__Statemachine__Alternatives_11
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Alternatives_11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_11()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__11__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__12"
+    // InternalFormalML.g:20919:1: rule__Statemachine__Group__12 : rule__Statemachine__Group__12__Impl rule__Statemachine__Group__13 ;
+    public final void rule__Statemachine__Group__12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20923:1: ( rule__Statemachine__Group__12__Impl rule__Statemachine__Group__13 )
+            // InternalFormalML.g:20924:2: rule__Statemachine__Group__12__Impl rule__Statemachine__Group__13
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Statemachine__Group__12__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__13();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__12"
+
+
+    // $ANTLR start "rule__Statemachine__Group__12__Impl"
+    // InternalFormalML.g:20931:1: rule__Statemachine__Group__12__Impl : ( ( rule__Statemachine__UnorderedGroup_12 ) ) ;
+    public final void rule__Statemachine__Group__12__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20935:1: ( ( ( rule__Statemachine__UnorderedGroup_12 ) ) )
+            // InternalFormalML.g:20936:1: ( ( rule__Statemachine__UnorderedGroup_12 ) )
+            {
+            // InternalFormalML.g:20936:1: ( ( rule__Statemachine__UnorderedGroup_12 ) )
+            // InternalFormalML.g:20937:2: ( rule__Statemachine__UnorderedGroup_12 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getUnorderedGroup_12()); 
+            }
+            // InternalFormalML.g:20938:2: ( rule__Statemachine__UnorderedGroup_12 )
+            // InternalFormalML.g:20938:3: rule__Statemachine__UnorderedGroup_12
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__UnorderedGroup_12();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getUnorderedGroup_12()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__12__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group__13"
+    // InternalFormalML.g:20946:1: rule__Statemachine__Group__13 : rule__Statemachine__Group__13__Impl ;
+    public final void rule__Statemachine__Group__13() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20950:1: ( rule__Statemachine__Group__13__Impl )
+            // InternalFormalML.g:20951:2: rule__Statemachine__Group__13__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group__13__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__13"
+
+
+    // $ANTLR start "rule__Statemachine__Group__13__Impl"
+    // InternalFormalML.g:20957:1: rule__Statemachine__Group__13__Impl : ( '}' ) ;
+    public final void rule__Statemachine__Group__13__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20961:1: ( ( '}' ) )
+            // InternalFormalML.g:20962:1: ( '}' )
+            {
+            // InternalFormalML.g:20962:1: ( '}' )
+            // InternalFormalML.g:20963:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_13()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_13()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group__13__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_3__0"
+    // InternalFormalML.g:20973:1: rule__Statemachine__Group_3__0 : rule__Statemachine__Group_3__0__Impl rule__Statemachine__Group_3__1 ;
+    public final void rule__Statemachine__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20977:1: ( rule__Statemachine__Group_3__0__Impl rule__Statemachine__Group_3__1 )
+            // InternalFormalML.g:20978:2: rule__Statemachine__Group_3__0__Impl rule__Statemachine__Group_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__Statemachine__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_3__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_3__0__Impl"
+    // InternalFormalML.g:20985:1: rule__Statemachine__Group_3__0__Impl : ( '<' ) ;
+    public final void rule__Statemachine__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:20989:1: ( ( '<' ) )
+            // InternalFormalML.g:20990:1: ( '<' )
+            {
+            // InternalFormalML.g:20990:1: ( '<' )
+            // InternalFormalML.g:20991:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLessThanSignKeyword_3_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLessThanSignKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_3__1"
+    // InternalFormalML.g:21000:1: rule__Statemachine__Group_3__1 : rule__Statemachine__Group_3__1__Impl rule__Statemachine__Group_3__2 ;
+    public final void rule__Statemachine__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21004:1: ( rule__Statemachine__Group_3__1__Impl rule__Statemachine__Group_3__2 )
+            // InternalFormalML.g:21005:2: rule__Statemachine__Group_3__1__Impl rule__Statemachine__Group_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__Statemachine__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_3__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_3__1__Impl"
+    // InternalFormalML.g:21012:1: rule__Statemachine__Group_3__1__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__Statemachine__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21016:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:21017:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:21017:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:21018:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getMocKeyword_3_1()); 
+            }
+            // InternalFormalML.g:21019:2: ( 'moc:' )?
+            int alt382=2;
+            int LA382_0 = input.LA(1);
+
+            if ( (LA382_0==201) ) {
+                alt382=1;
+            }
+            switch (alt382) {
+                case 1 :
+                    // InternalFormalML.g:21019:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getMocKeyword_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_3__2"
+    // InternalFormalML.g:21027:1: rule__Statemachine__Group_3__2 : rule__Statemachine__Group_3__2__Impl rule__Statemachine__Group_3__3 ;
+    public final void rule__Statemachine__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21031:1: ( rule__Statemachine__Group_3__2__Impl rule__Statemachine__Group_3__3 )
+            // InternalFormalML.g:21032:2: rule__Statemachine__Group_3__2__Impl rule__Statemachine__Group_3__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__Statemachine__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_3__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_3__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group_3__2__Impl"
+    // InternalFormalML.g:21039:1: rule__Statemachine__Group_3__2__Impl : ( ( rule__Statemachine__Alternatives_3_2 ) ) ;
+    public final void rule__Statemachine__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21043:1: ( ( ( rule__Statemachine__Alternatives_3_2 ) ) )
+            // InternalFormalML.g:21044:1: ( ( rule__Statemachine__Alternatives_3_2 ) )
+            {
+            // InternalFormalML.g:21044:1: ( ( rule__Statemachine__Alternatives_3_2 ) )
+            // InternalFormalML.g:21045:2: ( rule__Statemachine__Alternatives_3_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_3_2()); 
+            }
+            // InternalFormalML.g:21046:2: ( rule__Statemachine__Alternatives_3_2 )
+            // InternalFormalML.g:21046:3: rule__Statemachine__Alternatives_3_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Alternatives_3_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_3__3"
+    // InternalFormalML.g:21054:1: rule__Statemachine__Group_3__3 : rule__Statemachine__Group_3__3__Impl ;
+    public final void rule__Statemachine__Group_3__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21058:1: ( rule__Statemachine__Group_3__3__Impl )
+            // InternalFormalML.g:21059:2: rule__Statemachine__Group_3__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_3__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_3__3"
+
+
+    // $ANTLR start "rule__Statemachine__Group_3__3__Impl"
+    // InternalFormalML.g:21065:1: rule__Statemachine__Group_3__3__Impl : ( '>' ) ;
+    public final void rule__Statemachine__Group_3__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21069:1: ( ( '>' ) )
+            // InternalFormalML.g:21070:1: ( '>' )
+            {
+            // InternalFormalML.g:21070:1: ( '>' )
+            // InternalFormalML.g:21071:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getGreaterThanSignKeyword_3_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getGreaterThanSignKeyword_3_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_3__3__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0__0"
+    // InternalFormalML.g:21081:1: rule__Statemachine__Group_7_0__0 : rule__Statemachine__Group_7_0__0__Impl rule__Statemachine__Group_7_0__1 ;
+    public final void rule__Statemachine__Group_7_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21085:1: ( rule__Statemachine__Group_7_0__0__Impl rule__Statemachine__Group_7_0__1 )
+            // InternalFormalML.g:21086:2: rule__Statemachine__Group_7_0__0__Impl rule__Statemachine__Group_7_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_67);
+            rule__Statemachine__Group_7_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0__0__Impl"
+    // InternalFormalML.g:21093:1: rule__Statemachine__Group_7_0__0__Impl : ( '@parameter:' ) ;
+    public final void rule__Statemachine__Group_7_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21097:1: ( ( '@parameter:' ) )
+            // InternalFormalML.g:21098:1: ( '@parameter:' )
+            {
+            // InternalFormalML.g:21098:1: ( '@parameter:' )
+            // InternalFormalML.g:21099:2: '@parameter:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterKeyword_7_0_0()); 
+            }
+            match(input,216,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterKeyword_7_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0__1"
+    // InternalFormalML.g:21108:1: rule__Statemachine__Group_7_0__1 : rule__Statemachine__Group_7_0__1__Impl ;
+    public final void rule__Statemachine__Group_7_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21112:1: ( rule__Statemachine__Group_7_0__1__Impl )
+            // InternalFormalML.g:21113:2: rule__Statemachine__Group_7_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0__1__Impl"
+    // InternalFormalML.g:21119:1: rule__Statemachine__Group_7_0__1__Impl : ( ( rule__Statemachine__Alternatives_7_0_1 )* ) ;
+    public final void rule__Statemachine__Group_7_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21123:1: ( ( ( rule__Statemachine__Alternatives_7_0_1 )* ) )
+            // InternalFormalML.g:21124:1: ( ( rule__Statemachine__Alternatives_7_0_1 )* )
+            {
+            // InternalFormalML.g:21124:1: ( ( rule__Statemachine__Alternatives_7_0_1 )* )
+            // InternalFormalML.g:21125:2: ( rule__Statemachine__Alternatives_7_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1()); 
+            }
+            // InternalFormalML.g:21126:2: ( rule__Statemachine__Alternatives_7_0_1 )*
+            loop383:
+            do {
+                int alt383=2;
+                int LA383_0 = input.LA(1);
+
+                if ( (LA383_0==157||LA383_0==173||(LA383_0>=175 && LA383_0<=176)) ) {
+                    alt383=1;
+                }
+
+
+                switch (alt383) {
+            	case 1 :
+            	    // InternalFormalML.g:21126:3: rule__Statemachine__Alternatives_7_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_68);
+            	    rule__Statemachine__Alternatives_7_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop383;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0__0"
+    // InternalFormalML.g:21135:1: rule__Statemachine__Group_7_0_1_0__0 : rule__Statemachine__Group_7_0_1_0__0__Impl rule__Statemachine__Group_7_0_1_0__1 ;
+    public final void rule__Statemachine__Group_7_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21139:1: ( rule__Statemachine__Group_7_0_1_0__0__Impl rule__Statemachine__Group_7_0_1_0__1 )
+            // InternalFormalML.g:21140:2: rule__Statemachine__Group_7_0_1_0__0__Impl rule__Statemachine__Group_7_0_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Statemachine__Group_7_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0__0__Impl"
+    // InternalFormalML.g:21147:1: rule__Statemachine__Group_7_0_1_0__0__Impl : ( 'input' ) ;
+    public final void rule__Statemachine__Group_7_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21151:1: ( ( 'input' ) )
+            // InternalFormalML.g:21152:1: ( 'input' )
+            {
+            // InternalFormalML.g:21152:1: ( 'input' )
+            // InternalFormalML.g:21153:2: 'input'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getInputKeyword_7_0_1_0_0()); 
+            }
+            match(input,175,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getInputKeyword_7_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0__1"
+    // InternalFormalML.g:21162:1: rule__Statemachine__Group_7_0_1_0__1 : rule__Statemachine__Group_7_0_1_0__1__Impl ;
+    public final void rule__Statemachine__Group_7_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21166:1: ( rule__Statemachine__Group_7_0_1_0__1__Impl )
+            // InternalFormalML.g:21167:2: rule__Statemachine__Group_7_0_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0__1__Impl"
+    // InternalFormalML.g:21173:1: rule__Statemachine__Group_7_0_1_0__1__Impl : ( ( rule__Statemachine__Alternatives_7_0_1_0_1 ) ) ;
+    public final void rule__Statemachine__Group_7_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21177:1: ( ( ( rule__Statemachine__Alternatives_7_0_1_0_1 ) ) )
+            // InternalFormalML.g:21178:1: ( ( rule__Statemachine__Alternatives_7_0_1_0_1 ) )
+            {
+            // InternalFormalML.g:21178:1: ( ( rule__Statemachine__Alternatives_7_0_1_0_1 ) )
+            // InternalFormalML.g:21179:2: ( rule__Statemachine__Alternatives_7_0_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_0_1()); 
+            }
+            // InternalFormalML.g:21180:2: ( rule__Statemachine__Alternatives_7_0_1_0_1 )
+            // InternalFormalML.g:21180:3: rule__Statemachine__Alternatives_7_0_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Alternatives_7_0_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0_1_1__0"
+    // InternalFormalML.g:21189:1: rule__Statemachine__Group_7_0_1_0_1_1__0 : rule__Statemachine__Group_7_0_1_0_1_1__0__Impl rule__Statemachine__Group_7_0_1_0_1_1__1 ;
+    public final void rule__Statemachine__Group_7_0_1_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21193:1: ( rule__Statemachine__Group_7_0_1_0_1_1__0__Impl rule__Statemachine__Group_7_0_1_0_1_1__1 )
+            // InternalFormalML.g:21194:2: rule__Statemachine__Group_7_0_1_0_1_1__0__Impl rule__Statemachine__Group_7_0_1_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Statemachine__Group_7_0_1_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0_1_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0_1_1__0__Impl"
+    // InternalFormalML.g:21201:1: rule__Statemachine__Group_7_0_1_0_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Statemachine__Group_7_0_1_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21205:1: ( ( '{' ) )
+            // InternalFormalML.g:21206:1: ( '{' )
+            {
+            // InternalFormalML.g:21206:1: ( '{' )
+            // InternalFormalML.g:21207:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0_1_1__1"
+    // InternalFormalML.g:21216:1: rule__Statemachine__Group_7_0_1_0_1_1__1 : rule__Statemachine__Group_7_0_1_0_1_1__1__Impl rule__Statemachine__Group_7_0_1_0_1_1__2 ;
+    public final void rule__Statemachine__Group_7_0_1_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21220:1: ( rule__Statemachine__Group_7_0_1_0_1_1__1__Impl rule__Statemachine__Group_7_0_1_0_1_1__2 )
+            // InternalFormalML.g:21221:2: rule__Statemachine__Group_7_0_1_0_1_1__1__Impl rule__Statemachine__Group_7_0_1_0_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Statemachine__Group_7_0_1_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_0_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0_1_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0_1_1__1__Impl"
+    // InternalFormalML.g:21228:1: rule__Statemachine__Group_7_0_1_0_1_1__1__Impl : ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )* ) ) ;
+    public final void rule__Statemachine__Group_7_0_1_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21232:1: ( ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )* ) ) )
+            // InternalFormalML.g:21233:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:21233:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )* ) )
+            // InternalFormalML.g:21234:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )* )
+            {
+            // InternalFormalML.g:21234:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 ) )
+            // InternalFormalML.g:21235:3: ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_1_1()); 
+            }
+            // InternalFormalML.g:21236:3: ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )
+            // InternalFormalML.g:21236:4: rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:21239:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )* )
+            // InternalFormalML.g:21240:3: ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_1_1()); 
+            }
+            // InternalFormalML.g:21241:3: ( rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 )*
+            loop384:
+            do {
+                int alt384=2;
+                int LA384_0 = input.LA(1);
+
+                if ( (LA384_0==16) ) {
+                    alt384=1;
+                }
+
+
+                switch (alt384) {
+            	case 1 :
+            	    // InternalFormalML.g:21241:4: rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop384;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0_1_1__2"
+    // InternalFormalML.g:21250:1: rule__Statemachine__Group_7_0_1_0_1_1__2 : rule__Statemachine__Group_7_0_1_0_1_1__2__Impl ;
+    public final void rule__Statemachine__Group_7_0_1_0_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21254:1: ( rule__Statemachine__Group_7_0_1_0_1_1__2__Impl )
+            // InternalFormalML.g:21255:2: rule__Statemachine__Group_7_0_1_0_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_0_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0_1_1__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_0_1_1__2__Impl"
+    // InternalFormalML.g:21261:1: rule__Statemachine__Group_7_0_1_0_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Statemachine__Group_7_0_1_0_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21265:1: ( ( '}' ) )
+            // InternalFormalML.g:21266:1: ( '}' )
+            {
+            // InternalFormalML.g:21266:1: ( '}' )
+            // InternalFormalML.g:21267:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_0_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1__0"
+    // InternalFormalML.g:21277:1: rule__Statemachine__Group_7_0_1_1__0 : rule__Statemachine__Group_7_0_1_1__0__Impl rule__Statemachine__Group_7_0_1_1__1 ;
+    public final void rule__Statemachine__Group_7_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21281:1: ( rule__Statemachine__Group_7_0_1_1__0__Impl rule__Statemachine__Group_7_0_1_1__1 )
+            // InternalFormalML.g:21282:2: rule__Statemachine__Group_7_0_1_1__0__Impl rule__Statemachine__Group_7_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Statemachine__Group_7_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1__0__Impl"
+    // InternalFormalML.g:21289:1: rule__Statemachine__Group_7_0_1_1__0__Impl : ( 'inout' ) ;
+    public final void rule__Statemachine__Group_7_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21293:1: ( ( 'inout' ) )
+            // InternalFormalML.g:21294:1: ( 'inout' )
+            {
+            // InternalFormalML.g:21294:1: ( 'inout' )
+            // InternalFormalML.g:21295:2: 'inout'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getInoutKeyword_7_0_1_1_0()); 
+            }
+            match(input,173,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getInoutKeyword_7_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1__1"
+    // InternalFormalML.g:21304:1: rule__Statemachine__Group_7_0_1_1__1 : rule__Statemachine__Group_7_0_1_1__1__Impl ;
+    public final void rule__Statemachine__Group_7_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21308:1: ( rule__Statemachine__Group_7_0_1_1__1__Impl )
+            // InternalFormalML.g:21309:2: rule__Statemachine__Group_7_0_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1__1__Impl"
+    // InternalFormalML.g:21315:1: rule__Statemachine__Group_7_0_1_1__1__Impl : ( ( rule__Statemachine__Alternatives_7_0_1_1_1 ) ) ;
+    public final void rule__Statemachine__Group_7_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21319:1: ( ( ( rule__Statemachine__Alternatives_7_0_1_1_1 ) ) )
+            // InternalFormalML.g:21320:1: ( ( rule__Statemachine__Alternatives_7_0_1_1_1 ) )
+            {
+            // InternalFormalML.g:21320:1: ( ( rule__Statemachine__Alternatives_7_0_1_1_1 ) )
+            // InternalFormalML.g:21321:2: ( rule__Statemachine__Alternatives_7_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_1_1()); 
+            }
+            // InternalFormalML.g:21322:2: ( rule__Statemachine__Alternatives_7_0_1_1_1 )
+            // InternalFormalML.g:21322:3: rule__Statemachine__Alternatives_7_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Alternatives_7_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1_1_1__0"
+    // InternalFormalML.g:21331:1: rule__Statemachine__Group_7_0_1_1_1_1__0 : rule__Statemachine__Group_7_0_1_1_1_1__0__Impl rule__Statemachine__Group_7_0_1_1_1_1__1 ;
+    public final void rule__Statemachine__Group_7_0_1_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21335:1: ( rule__Statemachine__Group_7_0_1_1_1_1__0__Impl rule__Statemachine__Group_7_0_1_1_1_1__1 )
+            // InternalFormalML.g:21336:2: rule__Statemachine__Group_7_0_1_1_1_1__0__Impl rule__Statemachine__Group_7_0_1_1_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Statemachine__Group_7_0_1_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1_1_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1_1_1__0__Impl"
+    // InternalFormalML.g:21343:1: rule__Statemachine__Group_7_0_1_1_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Statemachine__Group_7_0_1_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21347:1: ( ( '{' ) )
+            // InternalFormalML.g:21348:1: ( '{' )
+            {
+            // InternalFormalML.g:21348:1: ( '{' )
+            // InternalFormalML.g:21349:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1_1_1__1"
+    // InternalFormalML.g:21358:1: rule__Statemachine__Group_7_0_1_1_1_1__1 : rule__Statemachine__Group_7_0_1_1_1_1__1__Impl rule__Statemachine__Group_7_0_1_1_1_1__2 ;
+    public final void rule__Statemachine__Group_7_0_1_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21362:1: ( rule__Statemachine__Group_7_0_1_1_1_1__1__Impl rule__Statemachine__Group_7_0_1_1_1_1__2 )
+            // InternalFormalML.g:21363:2: rule__Statemachine__Group_7_0_1_1_1_1__1__Impl rule__Statemachine__Group_7_0_1_1_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Statemachine__Group_7_0_1_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_1_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1_1_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1_1_1__1__Impl"
+    // InternalFormalML.g:21370:1: rule__Statemachine__Group_7_0_1_1_1_1__1__Impl : ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )* ) ) ;
+    public final void rule__Statemachine__Group_7_0_1_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21374:1: ( ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )* ) ) )
+            // InternalFormalML.g:21375:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:21375:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )* ) )
+            // InternalFormalML.g:21376:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )* )
+            {
+            // InternalFormalML.g:21376:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 ) )
+            // InternalFormalML.g:21377:3: ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_1_1()); 
+            }
+            // InternalFormalML.g:21378:3: ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )
+            // InternalFormalML.g:21378:4: rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:21381:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )* )
+            // InternalFormalML.g:21382:3: ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_1_1()); 
+            }
+            // InternalFormalML.g:21383:3: ( rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 )*
+            loop385:
+            do {
+                int alt385=2;
+                int LA385_0 = input.LA(1);
+
+                if ( (LA385_0==16) ) {
+                    alt385=1;
+                }
+
+
+                switch (alt385) {
+            	case 1 :
+            	    // InternalFormalML.g:21383:4: rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop385;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1_1_1__2"
+    // InternalFormalML.g:21392:1: rule__Statemachine__Group_7_0_1_1_1_1__2 : rule__Statemachine__Group_7_0_1_1_1_1__2__Impl ;
+    public final void rule__Statemachine__Group_7_0_1_1_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21396:1: ( rule__Statemachine__Group_7_0_1_1_1_1__2__Impl )
+            // InternalFormalML.g:21397:2: rule__Statemachine__Group_7_0_1_1_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_1_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1_1_1__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_1_1_1__2__Impl"
+    // InternalFormalML.g:21403:1: rule__Statemachine__Group_7_0_1_1_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Statemachine__Group_7_0_1_1_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21407:1: ( ( '}' ) )
+            // InternalFormalML.g:21408:1: ( '}' )
+            {
+            // InternalFormalML.g:21408:1: ( '}' )
+            // InternalFormalML.g:21409:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_1_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2__0"
+    // InternalFormalML.g:21419:1: rule__Statemachine__Group_7_0_1_2__0 : rule__Statemachine__Group_7_0_1_2__0__Impl rule__Statemachine__Group_7_0_1_2__1 ;
+    public final void rule__Statemachine__Group_7_0_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21423:1: ( rule__Statemachine__Group_7_0_1_2__0__Impl rule__Statemachine__Group_7_0_1_2__1 )
+            // InternalFormalML.g:21424:2: rule__Statemachine__Group_7_0_1_2__0__Impl rule__Statemachine__Group_7_0_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Statemachine__Group_7_0_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2__0__Impl"
+    // InternalFormalML.g:21431:1: rule__Statemachine__Group_7_0_1_2__0__Impl : ( 'output' ) ;
+    public final void rule__Statemachine__Group_7_0_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21435:1: ( ( 'output' ) )
+            // InternalFormalML.g:21436:1: ( 'output' )
+            {
+            // InternalFormalML.g:21436:1: ( 'output' )
+            // InternalFormalML.g:21437:2: 'output'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getOutputKeyword_7_0_1_2_0()); 
+            }
+            match(input,176,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getOutputKeyword_7_0_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2__1"
+    // InternalFormalML.g:21446:1: rule__Statemachine__Group_7_0_1_2__1 : rule__Statemachine__Group_7_0_1_2__1__Impl ;
+    public final void rule__Statemachine__Group_7_0_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21450:1: ( rule__Statemachine__Group_7_0_1_2__1__Impl )
+            // InternalFormalML.g:21451:2: rule__Statemachine__Group_7_0_1_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2__1__Impl"
+    // InternalFormalML.g:21457:1: rule__Statemachine__Group_7_0_1_2__1__Impl : ( ( rule__Statemachine__Alternatives_7_0_1_2_1 ) ) ;
+    public final void rule__Statemachine__Group_7_0_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21461:1: ( ( ( rule__Statemachine__Alternatives_7_0_1_2_1 ) ) )
+            // InternalFormalML.g:21462:1: ( ( rule__Statemachine__Alternatives_7_0_1_2_1 ) )
+            {
+            // InternalFormalML.g:21462:1: ( ( rule__Statemachine__Alternatives_7_0_1_2_1 ) )
+            // InternalFormalML.g:21463:2: ( rule__Statemachine__Alternatives_7_0_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_2_1()); 
+            }
+            // InternalFormalML.g:21464:2: ( rule__Statemachine__Alternatives_7_0_1_2_1 )
+            // InternalFormalML.g:21464:3: rule__Statemachine__Alternatives_7_0_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Alternatives_7_0_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2_1_1__0"
+    // InternalFormalML.g:21473:1: rule__Statemachine__Group_7_0_1_2_1_1__0 : rule__Statemachine__Group_7_0_1_2_1_1__0__Impl rule__Statemachine__Group_7_0_1_2_1_1__1 ;
+    public final void rule__Statemachine__Group_7_0_1_2_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21477:1: ( rule__Statemachine__Group_7_0_1_2_1_1__0__Impl rule__Statemachine__Group_7_0_1_2_1_1__1 )
+            // InternalFormalML.g:21478:2: rule__Statemachine__Group_7_0_1_2_1_1__0__Impl rule__Statemachine__Group_7_0_1_2_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Statemachine__Group_7_0_1_2_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_2_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2_1_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2_1_1__0__Impl"
+    // InternalFormalML.g:21485:1: rule__Statemachine__Group_7_0_1_2_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Statemachine__Group_7_0_1_2_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21489:1: ( ( '{' ) )
+            // InternalFormalML.g:21490:1: ( '{' )
+            {
+            // InternalFormalML.g:21490:1: ( '{' )
+            // InternalFormalML.g:21491:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2_1_1__1"
+    // InternalFormalML.g:21500:1: rule__Statemachine__Group_7_0_1_2_1_1__1 : rule__Statemachine__Group_7_0_1_2_1_1__1__Impl rule__Statemachine__Group_7_0_1_2_1_1__2 ;
+    public final void rule__Statemachine__Group_7_0_1_2_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21504:1: ( rule__Statemachine__Group_7_0_1_2_1_1__1__Impl rule__Statemachine__Group_7_0_1_2_1_1__2 )
+            // InternalFormalML.g:21505:2: rule__Statemachine__Group_7_0_1_2_1_1__1__Impl rule__Statemachine__Group_7_0_1_2_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Statemachine__Group_7_0_1_2_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_2_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2_1_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2_1_1__1__Impl"
+    // InternalFormalML.g:21512:1: rule__Statemachine__Group_7_0_1_2_1_1__1__Impl : ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )* ) ) ;
+    public final void rule__Statemachine__Group_7_0_1_2_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21516:1: ( ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )* ) ) )
+            // InternalFormalML.g:21517:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:21517:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )* ) )
+            // InternalFormalML.g:21518:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )* )
+            {
+            // InternalFormalML.g:21518:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 ) )
+            // InternalFormalML.g:21519:3: ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_1_1()); 
+            }
+            // InternalFormalML.g:21520:3: ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )
+            // InternalFormalML.g:21520:4: rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:21523:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )* )
+            // InternalFormalML.g:21524:3: ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_1_1()); 
+            }
+            // InternalFormalML.g:21525:3: ( rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 )*
+            loop386:
+            do {
+                int alt386=2;
+                int LA386_0 = input.LA(1);
+
+                if ( (LA386_0==16) ) {
+                    alt386=1;
+                }
+
+
+                switch (alt386) {
+            	case 1 :
+            	    // InternalFormalML.g:21525:4: rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop386;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_2_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2_1_1__2"
+    // InternalFormalML.g:21534:1: rule__Statemachine__Group_7_0_1_2_1_1__2 : rule__Statemachine__Group_7_0_1_2_1_1__2__Impl ;
+    public final void rule__Statemachine__Group_7_0_1_2_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21538:1: ( rule__Statemachine__Group_7_0_1_2_1_1__2__Impl )
+            // InternalFormalML.g:21539:2: rule__Statemachine__Group_7_0_1_2_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_2_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2_1_1__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_2_1_1__2__Impl"
+    // InternalFormalML.g:21545:1: rule__Statemachine__Group_7_0_1_2_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Statemachine__Group_7_0_1_2_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21549:1: ( ( '}' ) )
+            // InternalFormalML.g:21550:1: ( '}' )
+            {
+            // InternalFormalML.g:21550:1: ( '}' )
+            // InternalFormalML.g:21551:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_2_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3__0"
+    // InternalFormalML.g:21561:1: rule__Statemachine__Group_7_0_1_3__0 : rule__Statemachine__Group_7_0_1_3__0__Impl rule__Statemachine__Group_7_0_1_3__1 ;
+    public final void rule__Statemachine__Group_7_0_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21565:1: ( rule__Statemachine__Group_7_0_1_3__0__Impl rule__Statemachine__Group_7_0_1_3__1 )
+            // InternalFormalML.g:21566:2: rule__Statemachine__Group_7_0_1_3__0__Impl rule__Statemachine__Group_7_0_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Statemachine__Group_7_0_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3__0__Impl"
+    // InternalFormalML.g:21573:1: rule__Statemachine__Group_7_0_1_3__0__Impl : ( 'return' ) ;
+    public final void rule__Statemachine__Group_7_0_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21577:1: ( ( 'return' ) )
+            // InternalFormalML.g:21578:1: ( 'return' )
+            {
+            // InternalFormalML.g:21578:1: ( 'return' )
+            // InternalFormalML.g:21579:2: 'return'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getReturnKeyword_7_0_1_3_0()); 
+            }
+            match(input,157,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getReturnKeyword_7_0_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3__1"
+    // InternalFormalML.g:21588:1: rule__Statemachine__Group_7_0_1_3__1 : rule__Statemachine__Group_7_0_1_3__1__Impl ;
+    public final void rule__Statemachine__Group_7_0_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21592:1: ( rule__Statemachine__Group_7_0_1_3__1__Impl )
+            // InternalFormalML.g:21593:2: rule__Statemachine__Group_7_0_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3__1__Impl"
+    // InternalFormalML.g:21599:1: rule__Statemachine__Group_7_0_1_3__1__Impl : ( ( rule__Statemachine__Alternatives_7_0_1_3_1 ) ) ;
+    public final void rule__Statemachine__Group_7_0_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21603:1: ( ( ( rule__Statemachine__Alternatives_7_0_1_3_1 ) ) )
+            // InternalFormalML.g:21604:1: ( ( rule__Statemachine__Alternatives_7_0_1_3_1 ) )
+            {
+            // InternalFormalML.g:21604:1: ( ( rule__Statemachine__Alternatives_7_0_1_3_1 ) )
+            // InternalFormalML.g:21605:2: ( rule__Statemachine__Alternatives_7_0_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_3_1()); 
+            }
+            // InternalFormalML.g:21606:2: ( rule__Statemachine__Alternatives_7_0_1_3_1 )
+            // InternalFormalML.g:21606:3: rule__Statemachine__Alternatives_7_0_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Alternatives_7_0_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_7_0_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3_1_1__0"
+    // InternalFormalML.g:21615:1: rule__Statemachine__Group_7_0_1_3_1_1__0 : rule__Statemachine__Group_7_0_1_3_1_1__0__Impl rule__Statemachine__Group_7_0_1_3_1_1__1 ;
+    public final void rule__Statemachine__Group_7_0_1_3_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21619:1: ( rule__Statemachine__Group_7_0_1_3_1_1__0__Impl rule__Statemachine__Group_7_0_1_3_1_1__1 )
+            // InternalFormalML.g:21620:2: rule__Statemachine__Group_7_0_1_3_1_1__0__Impl rule__Statemachine__Group_7_0_1_3_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Statemachine__Group_7_0_1_3_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_3_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3_1_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3_1_1__0__Impl"
+    // InternalFormalML.g:21627:1: rule__Statemachine__Group_7_0_1_3_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Statemachine__Group_7_0_1_3_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21631:1: ( ( '{' ) )
+            // InternalFormalML.g:21632:1: ( '{' )
+            {
+            // InternalFormalML.g:21632:1: ( '{' )
+            // InternalFormalML.g:21633:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3_1_1__1"
+    // InternalFormalML.g:21642:1: rule__Statemachine__Group_7_0_1_3_1_1__1 : rule__Statemachine__Group_7_0_1_3_1_1__1__Impl rule__Statemachine__Group_7_0_1_3_1_1__2 ;
+    public final void rule__Statemachine__Group_7_0_1_3_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21646:1: ( rule__Statemachine__Group_7_0_1_3_1_1__1__Impl rule__Statemachine__Group_7_0_1_3_1_1__2 )
+            // InternalFormalML.g:21647:2: rule__Statemachine__Group_7_0_1_3_1_1__1__Impl rule__Statemachine__Group_7_0_1_3_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Statemachine__Group_7_0_1_3_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_3_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3_1_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3_1_1__1__Impl"
+    // InternalFormalML.g:21654:1: rule__Statemachine__Group_7_0_1_3_1_1__1__Impl : ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )* ) ) ;
+    public final void rule__Statemachine__Group_7_0_1_3_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21658:1: ( ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )* ) ) )
+            // InternalFormalML.g:21659:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:21659:1: ( ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )* ) )
+            // InternalFormalML.g:21660:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )* )
+            {
+            // InternalFormalML.g:21660:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 ) )
+            // InternalFormalML.g:21661:3: ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_1_1()); 
+            }
+            // InternalFormalML.g:21662:3: ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )
+            // InternalFormalML.g:21662:4: rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:21665:2: ( ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )* )
+            // InternalFormalML.g:21666:3: ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_1_1()); 
+            }
+            // InternalFormalML.g:21667:3: ( rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 )*
+            loop387:
+            do {
+                int alt387=2;
+                int LA387_0 = input.LA(1);
+
+                if ( (LA387_0==16) ) {
+                    alt387=1;
+                }
+
+
+                switch (alt387) {
+            	case 1 :
+            	    // InternalFormalML.g:21667:4: rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop387;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_7_0_1_3_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3_1_1__2"
+    // InternalFormalML.g:21676:1: rule__Statemachine__Group_7_0_1_3_1_1__2 : rule__Statemachine__Group_7_0_1_3_1_1__2__Impl ;
+    public final void rule__Statemachine__Group_7_0_1_3_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21680:1: ( rule__Statemachine__Group_7_0_1_3_1_1__2__Impl )
+            // InternalFormalML.g:21681:2: rule__Statemachine__Group_7_0_1_3_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_7_0_1_3_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3_1_1__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group_7_0_1_3_1_1__2__Impl"
+    // InternalFormalML.g:21687:1: rule__Statemachine__Group_7_0_1_3_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Statemachine__Group_7_0_1_3_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21691:1: ( ( '}' ) )
+            // InternalFormalML.g:21692:1: ( '}' )
+            {
+            // InternalFormalML.g:21692:1: ( '}' )
+            // InternalFormalML.g:21693:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_7_0_1_3_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0__0"
+    // InternalFormalML.g:21703:1: rule__Statemachine__Group_8_0__0 : rule__Statemachine__Group_8_0__0__Impl rule__Statemachine__Group_8_0__1 ;
+    public final void rule__Statemachine__Group_8_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21707:1: ( rule__Statemachine__Group_8_0__0__Impl rule__Statemachine__Group_8_0__1 )
+            // InternalFormalML.g:21708:2: rule__Statemachine__Group_8_0__0__Impl rule__Statemachine__Group_8_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Statemachine__Group_8_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0__0__Impl"
+    // InternalFormalML.g:21715:1: rule__Statemachine__Group_8_0__0__Impl : ( '@input:' ) ;
+    public final void rule__Statemachine__Group_8_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21719:1: ( ( '@input:' ) )
+            // InternalFormalML.g:21720:1: ( '@input:' )
+            {
+            // InternalFormalML.g:21720:1: ( '@input:' )
+            // InternalFormalML.g:21721:2: '@input:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()); 
+            }
+            match(input,217,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0__1"
+    // InternalFormalML.g:21730:1: rule__Statemachine__Group_8_0__1 : rule__Statemachine__Group_8_0__1__Impl ;
+    public final void rule__Statemachine__Group_8_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21734:1: ( rule__Statemachine__Group_8_0__1__Impl )
+            // InternalFormalML.g:21735:2: rule__Statemachine__Group_8_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0__1__Impl"
+    // InternalFormalML.g:21741:1: rule__Statemachine__Group_8_0__1__Impl : ( ( rule__Statemachine__Alternatives_8_0_1 )* ) ;
+    public final void rule__Statemachine__Group_8_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21745:1: ( ( ( rule__Statemachine__Alternatives_8_0_1 )* ) )
+            // InternalFormalML.g:21746:1: ( ( rule__Statemachine__Alternatives_8_0_1 )* )
+            {
+            // InternalFormalML.g:21746:1: ( ( rule__Statemachine__Alternatives_8_0_1 )* )
+            // InternalFormalML.g:21747:2: ( rule__Statemachine__Alternatives_8_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_8_0_1()); 
+            }
+            // InternalFormalML.g:21748:2: ( rule__Statemachine__Alternatives_8_0_1 )*
+            loop388:
+            do {
+                int alt388=2;
+                int LA388_0 = input.LA(1);
+
+                if ( (LA388_0==16||LA388_0==199) ) {
+                    alt388=1;
+                }
+
+
+                switch (alt388) {
+            	case 1 :
+            	    // InternalFormalML.g:21748:3: rule__Statemachine__Alternatives_8_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    rule__Statemachine__Alternatives_8_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop388;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_8_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0_1_1__0"
+    // InternalFormalML.g:21757:1: rule__Statemachine__Group_8_0_1_1__0 : rule__Statemachine__Group_8_0_1_1__0__Impl rule__Statemachine__Group_8_0_1_1__1 ;
+    public final void rule__Statemachine__Group_8_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21761:1: ( rule__Statemachine__Group_8_0_1_1__0__Impl rule__Statemachine__Group_8_0_1_1__1 )
+            // InternalFormalML.g:21762:2: rule__Statemachine__Group_8_0_1_1__0__Impl rule__Statemachine__Group_8_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Statemachine__Group_8_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0_1_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0_1_1__0__Impl"
+    // InternalFormalML.g:21769:1: rule__Statemachine__Group_8_0_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Statemachine__Group_8_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21773:1: ( ( '{' ) )
+            // InternalFormalML.g:21774:1: ( '{' )
+            {
+            // InternalFormalML.g:21774:1: ( '{' )
+            // InternalFormalML.g:21775:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0_1_1__1"
+    // InternalFormalML.g:21784:1: rule__Statemachine__Group_8_0_1_1__1 : rule__Statemachine__Group_8_0_1_1__1__Impl rule__Statemachine__Group_8_0_1_1__2 ;
+    public final void rule__Statemachine__Group_8_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21788:1: ( rule__Statemachine__Group_8_0_1_1__1__Impl rule__Statemachine__Group_8_0_1_1__2 )
+            // InternalFormalML.g:21789:2: rule__Statemachine__Group_8_0_1_1__1__Impl rule__Statemachine__Group_8_0_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Statemachine__Group_8_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_0_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0_1_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0_1_1__1__Impl"
+    // InternalFormalML.g:21796:1: rule__Statemachine__Group_8_0_1_1__1__Impl : ( ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )* ) ) ;
+    public final void rule__Statemachine__Group_8_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21800:1: ( ( ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )* ) ) )
+            // InternalFormalML.g:21801:1: ( ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:21801:1: ( ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )* ) )
+            // InternalFormalML.g:21802:2: ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )* )
+            {
+            // InternalFormalML.g:21802:2: ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 ) )
+            // InternalFormalML.g:21803:3: ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_1_1()); 
+            }
+            // InternalFormalML.g:21804:3: ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )
+            // InternalFormalML.g:21804:4: rule__Statemachine__ParameterAssignment_8_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Statemachine__ParameterAssignment_8_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:21807:2: ( ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )* )
+            // InternalFormalML.g:21808:3: ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_1_1()); 
+            }
+            // InternalFormalML.g:21809:3: ( rule__Statemachine__ParameterAssignment_8_0_1_1_1 )*
+            loop389:
+            do {
+                int alt389=2;
+                int LA389_0 = input.LA(1);
+
+                if ( (LA389_0==16) ) {
+                    alt389=1;
+                }
+
+
+                switch (alt389) {
+            	case 1 :
+            	    // InternalFormalML.g:21809:4: rule__Statemachine__ParameterAssignment_8_0_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Statemachine__ParameterAssignment_8_0_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop389;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0_1_1__2"
+    // InternalFormalML.g:21818:1: rule__Statemachine__Group_8_0_1_1__2 : rule__Statemachine__Group_8_0_1_1__2__Impl ;
+    public final void rule__Statemachine__Group_8_0_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21822:1: ( rule__Statemachine__Group_8_0_1_1__2__Impl )
+            // InternalFormalML.g:21823:2: rule__Statemachine__Group_8_0_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_0_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0_1_1__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_0_1_1__2__Impl"
+    // InternalFormalML.g:21829:1: rule__Statemachine__Group_8_0_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Statemachine__Group_8_0_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21833:1: ( ( '}' ) )
+            // InternalFormalML.g:21834:1: ( '}' )
+            {
+            // InternalFormalML.g:21834:1: ( '}' )
+            // InternalFormalML.g:21835:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_0_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_0_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_0_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1__0"
+    // InternalFormalML.g:21845:1: rule__Statemachine__Group_8_1__0 : rule__Statemachine__Group_8_1__0__Impl rule__Statemachine__Group_8_1__1 ;
+    public final void rule__Statemachine__Group_8_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21849:1: ( rule__Statemachine__Group_8_1__0__Impl rule__Statemachine__Group_8_1__1 )
+            // InternalFormalML.g:21850:2: rule__Statemachine__Group_8_1__0__Impl rule__Statemachine__Group_8_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Statemachine__Group_8_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1__0__Impl"
+    // InternalFormalML.g:21857:1: rule__Statemachine__Group_8_1__0__Impl : ( '@inout:' ) ;
+    public final void rule__Statemachine__Group_8_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21861:1: ( ( '@inout:' ) )
+            // InternalFormalML.g:21862:1: ( '@inout:' )
+            {
+            // InternalFormalML.g:21862:1: ( '@inout:' )
+            // InternalFormalML.g:21863:2: '@inout:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()); 
+            }
+            match(input,218,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1__1"
+    // InternalFormalML.g:21872:1: rule__Statemachine__Group_8_1__1 : rule__Statemachine__Group_8_1__1__Impl ;
+    public final void rule__Statemachine__Group_8_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21876:1: ( rule__Statemachine__Group_8_1__1__Impl )
+            // InternalFormalML.g:21877:2: rule__Statemachine__Group_8_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1__1__Impl"
+    // InternalFormalML.g:21883:1: rule__Statemachine__Group_8_1__1__Impl : ( ( rule__Statemachine__Alternatives_8_1_1 )* ) ;
+    public final void rule__Statemachine__Group_8_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21887:1: ( ( ( rule__Statemachine__Alternatives_8_1_1 )* ) )
+            // InternalFormalML.g:21888:1: ( ( rule__Statemachine__Alternatives_8_1_1 )* )
+            {
+            // InternalFormalML.g:21888:1: ( ( rule__Statemachine__Alternatives_8_1_1 )* )
+            // InternalFormalML.g:21889:2: ( rule__Statemachine__Alternatives_8_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_8_1_1()); 
+            }
+            // InternalFormalML.g:21890:2: ( rule__Statemachine__Alternatives_8_1_1 )*
+            loop390:
+            do {
+                int alt390=2;
+                int LA390_0 = input.LA(1);
+
+                if ( (LA390_0==16||LA390_0==199) ) {
+                    alt390=1;
+                }
+
+
+                switch (alt390) {
+            	case 1 :
+            	    // InternalFormalML.g:21890:3: rule__Statemachine__Alternatives_8_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    rule__Statemachine__Alternatives_8_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop390;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_8_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1_1_1__0"
+    // InternalFormalML.g:21899:1: rule__Statemachine__Group_8_1_1_1__0 : rule__Statemachine__Group_8_1_1_1__0__Impl rule__Statemachine__Group_8_1_1_1__1 ;
+    public final void rule__Statemachine__Group_8_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21903:1: ( rule__Statemachine__Group_8_1_1_1__0__Impl rule__Statemachine__Group_8_1_1_1__1 )
+            // InternalFormalML.g:21904:2: rule__Statemachine__Group_8_1_1_1__0__Impl rule__Statemachine__Group_8_1_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Statemachine__Group_8_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1_1_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1_1_1__0__Impl"
+    // InternalFormalML.g:21911:1: rule__Statemachine__Group_8_1_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Statemachine__Group_8_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21915:1: ( ( '{' ) )
+            // InternalFormalML.g:21916:1: ( '{' )
+            {
+            // InternalFormalML.g:21916:1: ( '{' )
+            // InternalFormalML.g:21917:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1_1_1__1"
+    // InternalFormalML.g:21926:1: rule__Statemachine__Group_8_1_1_1__1 : rule__Statemachine__Group_8_1_1_1__1__Impl rule__Statemachine__Group_8_1_1_1__2 ;
+    public final void rule__Statemachine__Group_8_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21930:1: ( rule__Statemachine__Group_8_1_1_1__1__Impl rule__Statemachine__Group_8_1_1_1__2 )
+            // InternalFormalML.g:21931:2: rule__Statemachine__Group_8_1_1_1__1__Impl rule__Statemachine__Group_8_1_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Statemachine__Group_8_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_1_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1_1_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1_1_1__1__Impl"
+    // InternalFormalML.g:21938:1: rule__Statemachine__Group_8_1_1_1__1__Impl : ( ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )* ) ) ;
+    public final void rule__Statemachine__Group_8_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21942:1: ( ( ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )* ) ) )
+            // InternalFormalML.g:21943:1: ( ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:21943:1: ( ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )* ) )
+            // InternalFormalML.g:21944:2: ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )* )
+            {
+            // InternalFormalML.g:21944:2: ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 ) )
+            // InternalFormalML.g:21945:3: ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_1_1()); 
+            }
+            // InternalFormalML.g:21946:3: ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )
+            // InternalFormalML.g:21946:4: rule__Statemachine__ParameterAssignment_8_1_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Statemachine__ParameterAssignment_8_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:21949:2: ( ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )* )
+            // InternalFormalML.g:21950:3: ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_1_1()); 
+            }
+            // InternalFormalML.g:21951:3: ( rule__Statemachine__ParameterAssignment_8_1_1_1_1 )*
+            loop391:
+            do {
+                int alt391=2;
+                int LA391_0 = input.LA(1);
+
+                if ( (LA391_0==16) ) {
+                    alt391=1;
+                }
+
+
+                switch (alt391) {
+            	case 1 :
+            	    // InternalFormalML.g:21951:4: rule__Statemachine__ParameterAssignment_8_1_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Statemachine__ParameterAssignment_8_1_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop391;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1_1_1__2"
+    // InternalFormalML.g:21960:1: rule__Statemachine__Group_8_1_1_1__2 : rule__Statemachine__Group_8_1_1_1__2__Impl ;
+    public final void rule__Statemachine__Group_8_1_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21964:1: ( rule__Statemachine__Group_8_1_1_1__2__Impl )
+            // InternalFormalML.g:21965:2: rule__Statemachine__Group_8_1_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_1_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1_1_1__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_1_1_1__2__Impl"
+    // InternalFormalML.g:21971:1: rule__Statemachine__Group_8_1_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Statemachine__Group_8_1_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21975:1: ( ( '}' ) )
+            // InternalFormalML.g:21976:1: ( '}' )
+            {
+            // InternalFormalML.g:21976:1: ( '}' )
+            // InternalFormalML.g:21977:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_1_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2__0"
+    // InternalFormalML.g:21987:1: rule__Statemachine__Group_8_2__0 : rule__Statemachine__Group_8_2__0__Impl rule__Statemachine__Group_8_2__1 ;
+    public final void rule__Statemachine__Group_8_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:21991:1: ( rule__Statemachine__Group_8_2__0__Impl rule__Statemachine__Group_8_2__1 )
+            // InternalFormalML.g:21992:2: rule__Statemachine__Group_8_2__0__Impl rule__Statemachine__Group_8_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Statemachine__Group_8_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2__0__Impl"
+    // InternalFormalML.g:21999:1: rule__Statemachine__Group_8_2__0__Impl : ( '@output:' ) ;
+    public final void rule__Statemachine__Group_8_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22003:1: ( ( '@output:' ) )
+            // InternalFormalML.g:22004:1: ( '@output:' )
+            {
+            // InternalFormalML.g:22004:1: ( '@output:' )
+            // InternalFormalML.g:22005:2: '@output:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()); 
+            }
+            match(input,219,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2__1"
+    // InternalFormalML.g:22014:1: rule__Statemachine__Group_8_2__1 : rule__Statemachine__Group_8_2__1__Impl ;
+    public final void rule__Statemachine__Group_8_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22018:1: ( rule__Statemachine__Group_8_2__1__Impl )
+            // InternalFormalML.g:22019:2: rule__Statemachine__Group_8_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2__1__Impl"
+    // InternalFormalML.g:22025:1: rule__Statemachine__Group_8_2__1__Impl : ( ( rule__Statemachine__Alternatives_8_2_1 )* ) ;
+    public final void rule__Statemachine__Group_8_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22029:1: ( ( ( rule__Statemachine__Alternatives_8_2_1 )* ) )
+            // InternalFormalML.g:22030:1: ( ( rule__Statemachine__Alternatives_8_2_1 )* )
+            {
+            // InternalFormalML.g:22030:1: ( ( rule__Statemachine__Alternatives_8_2_1 )* )
+            // InternalFormalML.g:22031:2: ( rule__Statemachine__Alternatives_8_2_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_8_2_1()); 
+            }
+            // InternalFormalML.g:22032:2: ( rule__Statemachine__Alternatives_8_2_1 )*
+            loop392:
+            do {
+                int alt392=2;
+                int LA392_0 = input.LA(1);
+
+                if ( (LA392_0==16||LA392_0==199) ) {
+                    alt392=1;
+                }
+
+
+                switch (alt392) {
+            	case 1 :
+            	    // InternalFormalML.g:22032:3: rule__Statemachine__Alternatives_8_2_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    rule__Statemachine__Alternatives_8_2_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop392;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_8_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2_1_1__0"
+    // InternalFormalML.g:22041:1: rule__Statemachine__Group_8_2_1_1__0 : rule__Statemachine__Group_8_2_1_1__0__Impl rule__Statemachine__Group_8_2_1_1__1 ;
+    public final void rule__Statemachine__Group_8_2_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22045:1: ( rule__Statemachine__Group_8_2_1_1__0__Impl rule__Statemachine__Group_8_2_1_1__1 )
+            // InternalFormalML.g:22046:2: rule__Statemachine__Group_8_2_1_1__0__Impl rule__Statemachine__Group_8_2_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Statemachine__Group_8_2_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_2_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2_1_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2_1_1__0__Impl"
+    // InternalFormalML.g:22053:1: rule__Statemachine__Group_8_2_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Statemachine__Group_8_2_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22057:1: ( ( '{' ) )
+            // InternalFormalML.g:22058:1: ( '{' )
+            {
+            // InternalFormalML.g:22058:1: ( '{' )
+            // InternalFormalML.g:22059:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2_1_1__1"
+    // InternalFormalML.g:22068:1: rule__Statemachine__Group_8_2_1_1__1 : rule__Statemachine__Group_8_2_1_1__1__Impl rule__Statemachine__Group_8_2_1_1__2 ;
+    public final void rule__Statemachine__Group_8_2_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22072:1: ( rule__Statemachine__Group_8_2_1_1__1__Impl rule__Statemachine__Group_8_2_1_1__2 )
+            // InternalFormalML.g:22073:2: rule__Statemachine__Group_8_2_1_1__1__Impl rule__Statemachine__Group_8_2_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Statemachine__Group_8_2_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_2_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2_1_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2_1_1__1__Impl"
+    // InternalFormalML.g:22080:1: rule__Statemachine__Group_8_2_1_1__1__Impl : ( ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )* ) ) ;
+    public final void rule__Statemachine__Group_8_2_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22084:1: ( ( ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )* ) ) )
+            // InternalFormalML.g:22085:1: ( ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:22085:1: ( ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )* ) )
+            // InternalFormalML.g:22086:2: ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )* )
+            {
+            // InternalFormalML.g:22086:2: ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 ) )
+            // InternalFormalML.g:22087:3: ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_1_1()); 
+            }
+            // InternalFormalML.g:22088:3: ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )
+            // InternalFormalML.g:22088:4: rule__Statemachine__ParameterAssignment_8_2_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Statemachine__ParameterAssignment_8_2_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:22091:2: ( ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )* )
+            // InternalFormalML.g:22092:3: ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_1_1()); 
+            }
+            // InternalFormalML.g:22093:3: ( rule__Statemachine__ParameterAssignment_8_2_1_1_1 )*
+            loop393:
+            do {
+                int alt393=2;
+                int LA393_0 = input.LA(1);
+
+                if ( (LA393_0==16) ) {
+                    alt393=1;
+                }
+
+
+                switch (alt393) {
+            	case 1 :
+            	    // InternalFormalML.g:22093:4: rule__Statemachine__ParameterAssignment_8_2_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Statemachine__ParameterAssignment_8_2_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop393;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_2_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2_1_1__2"
+    // InternalFormalML.g:22102:1: rule__Statemachine__Group_8_2_1_1__2 : rule__Statemachine__Group_8_2_1_1__2__Impl ;
+    public final void rule__Statemachine__Group_8_2_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22106:1: ( rule__Statemachine__Group_8_2_1_1__2__Impl )
+            // InternalFormalML.g:22107:2: rule__Statemachine__Group_8_2_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_2_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2_1_1__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_2_1_1__2__Impl"
+    // InternalFormalML.g:22113:1: rule__Statemachine__Group_8_2_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Statemachine__Group_8_2_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22117:1: ( ( '}' ) )
+            // InternalFormalML.g:22118:1: ( '}' )
+            {
+            // InternalFormalML.g:22118:1: ( '}' )
+            // InternalFormalML.g:22119:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_2_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_2_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_2_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3__0"
+    // InternalFormalML.g:22129:1: rule__Statemachine__Group_8_3__0 : rule__Statemachine__Group_8_3__0__Impl rule__Statemachine__Group_8_3__1 ;
+    public final void rule__Statemachine__Group_8_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22133:1: ( rule__Statemachine__Group_8_3__0__Impl rule__Statemachine__Group_8_3__1 )
+            // InternalFormalML.g:22134:2: rule__Statemachine__Group_8_3__0__Impl rule__Statemachine__Group_8_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_69);
+            rule__Statemachine__Group_8_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3__0__Impl"
+    // InternalFormalML.g:22141:1: rule__Statemachine__Group_8_3__0__Impl : ( '@return:' ) ;
+    public final void rule__Statemachine__Group_8_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22145:1: ( ( '@return:' ) )
+            // InternalFormalML.g:22146:1: ( '@return:' )
+            {
+            // InternalFormalML.g:22146:1: ( '@return:' )
+            // InternalFormalML.g:22147:2: '@return:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0()); 
+            }
+            match(input,220,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3__1"
+    // InternalFormalML.g:22156:1: rule__Statemachine__Group_8_3__1 : rule__Statemachine__Group_8_3__1__Impl ;
+    public final void rule__Statemachine__Group_8_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22160:1: ( rule__Statemachine__Group_8_3__1__Impl )
+            // InternalFormalML.g:22161:2: rule__Statemachine__Group_8_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3__1__Impl"
+    // InternalFormalML.g:22167:1: rule__Statemachine__Group_8_3__1__Impl : ( ( rule__Statemachine__Alternatives_8_3_1 )* ) ;
+    public final void rule__Statemachine__Group_8_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22171:1: ( ( ( rule__Statemachine__Alternatives_8_3_1 )* ) )
+            // InternalFormalML.g:22172:1: ( ( rule__Statemachine__Alternatives_8_3_1 )* )
+            {
+            // InternalFormalML.g:22172:1: ( ( rule__Statemachine__Alternatives_8_3_1 )* )
+            // InternalFormalML.g:22173:2: ( rule__Statemachine__Alternatives_8_3_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_8_3_1()); 
+            }
+            // InternalFormalML.g:22174:2: ( rule__Statemachine__Alternatives_8_3_1 )*
+            loop394:
+            do {
+                int alt394=2;
+                int LA394_0 = input.LA(1);
+
+                if ( (LA394_0==16||LA394_0==199) ) {
+                    alt394=1;
+                }
+
+
+                switch (alt394) {
+            	case 1 :
+            	    // InternalFormalML.g:22174:3: rule__Statemachine__Alternatives_8_3_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    rule__Statemachine__Alternatives_8_3_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop394;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_8_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3_1_1__0"
+    // InternalFormalML.g:22183:1: rule__Statemachine__Group_8_3_1_1__0 : rule__Statemachine__Group_8_3_1_1__0__Impl rule__Statemachine__Group_8_3_1_1__1 ;
+    public final void rule__Statemachine__Group_8_3_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22187:1: ( rule__Statemachine__Group_8_3_1_1__0__Impl rule__Statemachine__Group_8_3_1_1__1 )
+            // InternalFormalML.g:22188:2: rule__Statemachine__Group_8_3_1_1__0__Impl rule__Statemachine__Group_8_3_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__Statemachine__Group_8_3_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_3_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3_1_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3_1_1__0__Impl"
+    // InternalFormalML.g:22195:1: rule__Statemachine__Group_8_3_1_1__0__Impl : ( '{' ) ;
+    public final void rule__Statemachine__Group_8_3_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22199:1: ( ( '{' ) )
+            // InternalFormalML.g:22200:1: ( '{' )
+            {
+            // InternalFormalML.g:22200:1: ( '{' )
+            // InternalFormalML.g:22201:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3_1_1__1"
+    // InternalFormalML.g:22210:1: rule__Statemachine__Group_8_3_1_1__1 : rule__Statemachine__Group_8_3_1_1__1__Impl rule__Statemachine__Group_8_3_1_1__2 ;
+    public final void rule__Statemachine__Group_8_3_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22214:1: ( rule__Statemachine__Group_8_3_1_1__1__Impl rule__Statemachine__Group_8_3_1_1__2 )
+            // InternalFormalML.g:22215:2: rule__Statemachine__Group_8_3_1_1__1__Impl rule__Statemachine__Group_8_3_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Statemachine__Group_8_3_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_3_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3_1_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3_1_1__1__Impl"
+    // InternalFormalML.g:22222:1: rule__Statemachine__Group_8_3_1_1__1__Impl : ( ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )* ) ) ;
+    public final void rule__Statemachine__Group_8_3_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22226:1: ( ( ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )* ) ) )
+            // InternalFormalML.g:22227:1: ( ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )* ) )
+            {
+            // InternalFormalML.g:22227:1: ( ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )* ) )
+            // InternalFormalML.g:22228:2: ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 ) ) ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )* )
+            {
+            // InternalFormalML.g:22228:2: ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 ) )
+            // InternalFormalML.g:22229:3: ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_1_1()); 
+            }
+            // InternalFormalML.g:22230:3: ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )
+            // InternalFormalML.g:22230:4: rule__Statemachine__ParameterAssignment_8_3_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_71);
+            rule__Statemachine__ParameterAssignment_8_3_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:22233:2: ( ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )* )
+            // InternalFormalML.g:22234:3: ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_1_1()); 
+            }
+            // InternalFormalML.g:22235:3: ( rule__Statemachine__ParameterAssignment_8_3_1_1_1 )*
+            loop395:
+            do {
+                int alt395=2;
+                int LA395_0 = input.LA(1);
+
+                if ( (LA395_0==16) ) {
+                    alt395=1;
+                }
+
+
+                switch (alt395) {
+            	case 1 :
+            	    // InternalFormalML.g:22235:4: rule__Statemachine__ParameterAssignment_8_3_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_71);
+            	    rule__Statemachine__ParameterAssignment_8_3_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop395;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterAssignment_8_3_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3_1_1__2"
+    // InternalFormalML.g:22244:1: rule__Statemachine__Group_8_3_1_1__2 : rule__Statemachine__Group_8_3_1_1__2__Impl ;
+    public final void rule__Statemachine__Group_8_3_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22248:1: ( rule__Statemachine__Group_8_3_1_1__2__Impl )
+            // InternalFormalML.g:22249:2: rule__Statemachine__Group_8_3_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_8_3_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3_1_1__2"
+
+
+    // $ANTLR start "rule__Statemachine__Group_8_3_1_1__2__Impl"
+    // InternalFormalML.g:22255:1: rule__Statemachine__Group_8_3_1_1__2__Impl : ( '}' ) ;
+    public final void rule__Statemachine__Group_8_3_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22259:1: ( ( '}' ) )
+            // InternalFormalML.g:22260:1: ( '}' )
+            {
+            // InternalFormalML.g:22260:1: ( '}' )
+            // InternalFormalML.g:22261:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_3_1_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_3_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_8_3_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_0__0"
+    // InternalFormalML.g:22271:1: rule__Statemachine__Group_9_0__0 : rule__Statemachine__Group_9_0__0__Impl rule__Statemachine__Group_9_0__1 ;
+    public final void rule__Statemachine__Group_9_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22275:1: ( rule__Statemachine__Group_9_0__0__Impl rule__Statemachine__Group_9_0__1 )
+            // InternalFormalML.g:22276:2: rule__Statemachine__Group_9_0__0__Impl rule__Statemachine__Group_9_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__Statemachine__Group_9_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_9_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_0__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_0__0__Impl"
+    // InternalFormalML.g:22283:1: rule__Statemachine__Group_9_0__0__Impl : ( '@property:' ) ;
+    public final void rule__Statemachine__Group_9_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22287:1: ( ( '@property:' ) )
+            // InternalFormalML.g:22288:1: ( '@property:' )
+            {
+            // InternalFormalML.g:22288:1: ( '@property:' )
+            // InternalFormalML.g:22289:2: '@property:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()); 
+            }
+            match(input,202,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_0__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_0__1"
+    // InternalFormalML.g:22298:1: rule__Statemachine__Group_9_0__1 : rule__Statemachine__Group_9_0__1__Impl ;
+    public final void rule__Statemachine__Group_9_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22302:1: ( rule__Statemachine__Group_9_0__1__Impl )
+            // InternalFormalML.g:22303:2: rule__Statemachine__Group_9_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_9_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_0__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_0__1__Impl"
+    // InternalFormalML.g:22309:1: rule__Statemachine__Group_9_0__1__Impl : ( ( rule__Statemachine__Alternatives_9_0_1 )* ) ;
+    public final void rule__Statemachine__Group_9_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22313:1: ( ( ( rule__Statemachine__Alternatives_9_0_1 )* ) )
+            // InternalFormalML.g:22314:1: ( ( rule__Statemachine__Alternatives_9_0_1 )* )
+            {
+            // InternalFormalML.g:22314:1: ( ( rule__Statemachine__Alternatives_9_0_1 )* )
+            // InternalFormalML.g:22315:2: ( rule__Statemachine__Alternatives_9_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_9_0_1()); 
+            }
+            // InternalFormalML.g:22316:2: ( rule__Statemachine__Alternatives_9_0_1 )*
+            loop396:
+            do {
+                int alt396=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA396_2 = input.LA(2);
+
+                    if ( ((LA396_2>=15 && LA396_2<=19)||LA396_2==28||(LA396_2>=143 && LA396_2<=145)||LA396_2==179||LA396_2==229||(LA396_2>=278 && LA396_2<=283)) ) {
+                        alt396=1;
+                    }
+                    else if ( (LA396_2==224) ) {
+                        int LA396_6 = input.LA(3);
+
+                        if ( (LA396_6==RULE_XLIA_ID||(LA396_6>=15 && LA396_6<=18)||LA396_6==39||(LA396_6>=59 && LA396_6<=74)||(LA396_6>=129 && LA396_6<=132)||LA396_6==149||(LA396_6>=163 && LA396_6<=171)||(LA396_6>=231 && LA396_6<=237)||LA396_6==277||LA396_6==282) ) {
+                            alt396=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA396_3 = input.LA(2);
+
+                    if ( ((LA396_3>=15 && LA396_3<=19)||LA396_3==28||(LA396_3>=143 && LA396_3<=145)||LA396_3==179||LA396_3==229||(LA396_3>=278 && LA396_3<=283)) ) {
+                        alt396=1;
+                    }
+                    else if ( (LA396_3==224) ) {
+                        int LA396_6 = input.LA(3);
+
+                        if ( (LA396_6==RULE_XLIA_ID||(LA396_6>=15 && LA396_6<=18)||LA396_6==39||(LA396_6>=59 && LA396_6<=74)||(LA396_6>=129 && LA396_6<=132)||LA396_6==149||(LA396_6>=163 && LA396_6<=171)||(LA396_6>=231 && LA396_6<=237)||LA396_6==277||LA396_6==282) ) {
+                            alt396=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA396_4 = input.LA(2);
+
+                    if ( ((LA396_4>=15 && LA396_4<=19)||LA396_4==28||(LA396_4>=143 && LA396_4<=145)||LA396_4==179||LA396_4==229||(LA396_4>=278 && LA396_4<=283)) ) {
+                        alt396=1;
+                    }
+                    else if ( (LA396_4==224) ) {
+                        int LA396_6 = input.LA(3);
+
+                        if ( (LA396_6==RULE_XLIA_ID||(LA396_6>=15 && LA396_6<=18)||LA396_6==39||(LA396_6>=59 && LA396_6<=74)||(LA396_6>=129 && LA396_6<=132)||LA396_6==149||(LA396_6>=163 && LA396_6<=171)||(LA396_6>=231 && LA396_6<=237)||LA396_6==277||LA396_6==282) ) {
+                            alt396=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA396_5 = input.LA(2);
+
+                    if ( ((LA396_5>=15 && LA396_5<=19)||LA396_5==28||(LA396_5>=143 && LA396_5<=145)||LA396_5==179||LA396_5==229||(LA396_5>=278 && LA396_5<=283)) ) {
+                        alt396=1;
+                    }
+                    else if ( (LA396_5==224) ) {
+                        int LA396_6 = input.LA(3);
+
+                        if ( (LA396_6==RULE_XLIA_ID||(LA396_6>=15 && LA396_6<=18)||LA396_6==39||(LA396_6>=59 && LA396_6<=74)||(LA396_6>=129 && LA396_6<=132)||LA396_6==149||(LA396_6>=163 && LA396_6<=171)||(LA396_6>=231 && LA396_6<=237)||LA396_6==277||LA396_6==282) ) {
+                            alt396=1;
+                        }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA396_6 = input.LA(2);
+
+                    if ( (LA396_6==RULE_XLIA_ID||(LA396_6>=15 && LA396_6<=18)||LA396_6==39||(LA396_6>=59 && LA396_6<=74)||(LA396_6>=129 && LA396_6<=132)||LA396_6==149||(LA396_6>=163 && LA396_6<=171)||(LA396_6>=231 && LA396_6<=237)||LA396_6==277||LA396_6==282) ) {
+                        alt396=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 282:
+                case 283:
+                    {
+                    alt396=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt396) {
+            	case 1 :
+            	    // InternalFormalML.g:22316:3: rule__Statemachine__Alternatives_9_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__Statemachine__Alternatives_9_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop396;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_9_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_0__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_1__0"
+    // InternalFormalML.g:22325:1: rule__Statemachine__Group_9_1__0 : rule__Statemachine__Group_9_1__0__Impl rule__Statemachine__Group_9_1__1 ;
+    public final void rule__Statemachine__Group_9_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22329:1: ( rule__Statemachine__Group_9_1__0__Impl rule__Statemachine__Group_9_1__1 )
+            // InternalFormalML.g:22330:2: rule__Statemachine__Group_9_1__0__Impl rule__Statemachine__Group_9_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__Statemachine__Group_9_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_9_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_1__0__Impl"
+    // InternalFormalML.g:22337:1: rule__Statemachine__Group_9_1__0__Impl : ( '@public:' ) ;
+    public final void rule__Statemachine__Group_9_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22341:1: ( ( '@public:' ) )
+            // InternalFormalML.g:22342:1: ( '@public:' )
+            {
+            // InternalFormalML.g:22342:1: ( '@public:' )
+            // InternalFormalML.g:22343:2: '@public:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0()); 
+            }
+            match(input,203,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_1__1"
+    // InternalFormalML.g:22352:1: rule__Statemachine__Group_9_1__1 : rule__Statemachine__Group_9_1__1__Impl ;
+    public final void rule__Statemachine__Group_9_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22356:1: ( rule__Statemachine__Group_9_1__1__Impl )
+            // InternalFormalML.g:22357:2: rule__Statemachine__Group_9_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_9_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_1__1__Impl"
+    // InternalFormalML.g:22363:1: rule__Statemachine__Group_9_1__1__Impl : ( ( rule__Statemachine__Alternatives_9_1_1 )* ) ;
+    public final void rule__Statemachine__Group_9_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22367:1: ( ( ( rule__Statemachine__Alternatives_9_1_1 )* ) )
+            // InternalFormalML.g:22368:1: ( ( rule__Statemachine__Alternatives_9_1_1 )* )
+            {
+            // InternalFormalML.g:22368:1: ( ( rule__Statemachine__Alternatives_9_1_1 )* )
+            // InternalFormalML.g:22369:2: ( rule__Statemachine__Alternatives_9_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_9_1_1()); 
+            }
+            // InternalFormalML.g:22370:2: ( rule__Statemachine__Alternatives_9_1_1 )*
+            loop397:
+            do {
+                int alt397=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA397_2 = input.LA(2);
+
+                    if ( (LA397_2==229) ) {
+                        alt397=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA397_3 = input.LA(2);
+
+                    if ( (LA397_3==229) ) {
+                        alt397=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA397_4 = input.LA(2);
+
+                    if ( (LA397_4==229) ) {
+                        alt397=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA397_5 = input.LA(2);
+
+                    if ( (LA397_5==229) ) {
+                        alt397=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA397_6 = input.LA(2);
+
+                    if ( (LA397_6==16||LA397_6==179||LA397_6==224||LA397_6==283) ) {
+                        alt397=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt397=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt397) {
+            	case 1 :
+            	    // InternalFormalML.g:22370:3: rule__Statemachine__Alternatives_9_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__Statemachine__Alternatives_9_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop397;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_9_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_1__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_2__0"
+    // InternalFormalML.g:22379:1: rule__Statemachine__Group_9_2__0 : rule__Statemachine__Group_9_2__0__Impl rule__Statemachine__Group_9_2__1 ;
+    public final void rule__Statemachine__Group_9_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22383:1: ( rule__Statemachine__Group_9_2__0__Impl rule__Statemachine__Group_9_2__1 )
+            // InternalFormalML.g:22384:2: rule__Statemachine__Group_9_2__0__Impl rule__Statemachine__Group_9_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__Statemachine__Group_9_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_9_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_2__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_2__0__Impl"
+    // InternalFormalML.g:22391:1: rule__Statemachine__Group_9_2__0__Impl : ( '@protected:' ) ;
+    public final void rule__Statemachine__Group_9_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22395:1: ( ( '@protected:' ) )
+            // InternalFormalML.g:22396:1: ( '@protected:' )
+            {
+            // InternalFormalML.g:22396:1: ( '@protected:' )
+            // InternalFormalML.g:22397:2: '@protected:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()); 
+            }
+            match(input,204,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_2__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_2__1"
+    // InternalFormalML.g:22406:1: rule__Statemachine__Group_9_2__1 : rule__Statemachine__Group_9_2__1__Impl ;
+    public final void rule__Statemachine__Group_9_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22410:1: ( rule__Statemachine__Group_9_2__1__Impl )
+            // InternalFormalML.g:22411:2: rule__Statemachine__Group_9_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_9_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_2__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_2__1__Impl"
+    // InternalFormalML.g:22417:1: rule__Statemachine__Group_9_2__1__Impl : ( ( rule__Statemachine__Alternatives_9_2_1 )* ) ;
+    public final void rule__Statemachine__Group_9_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22421:1: ( ( ( rule__Statemachine__Alternatives_9_2_1 )* ) )
+            // InternalFormalML.g:22422:1: ( ( rule__Statemachine__Alternatives_9_2_1 )* )
+            {
+            // InternalFormalML.g:22422:1: ( ( rule__Statemachine__Alternatives_9_2_1 )* )
+            // InternalFormalML.g:22423:2: ( rule__Statemachine__Alternatives_9_2_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_9_2_1()); 
+            }
+            // InternalFormalML.g:22424:2: ( rule__Statemachine__Alternatives_9_2_1 )*
+            loop398:
+            do {
+                int alt398=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA398_2 = input.LA(2);
+
+                    if ( (LA398_2==229) ) {
+                        alt398=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA398_3 = input.LA(2);
+
+                    if ( (LA398_3==229) ) {
+                        alt398=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA398_4 = input.LA(2);
+
+                    if ( (LA398_4==229) ) {
+                        alt398=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA398_5 = input.LA(2);
+
+                    if ( (LA398_5==229) ) {
+                        alt398=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA398_6 = input.LA(2);
+
+                    if ( (LA398_6==16||LA398_6==179||LA398_6==224||LA398_6==283) ) {
+                        alt398=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt398=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt398) {
+            	case 1 :
+            	    // InternalFormalML.g:22424:3: rule__Statemachine__Alternatives_9_2_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__Statemachine__Alternatives_9_2_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop398;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_9_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_2__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_3__0"
+    // InternalFormalML.g:22433:1: rule__Statemachine__Group_9_3__0 : rule__Statemachine__Group_9_3__0__Impl rule__Statemachine__Group_9_3__1 ;
+    public final void rule__Statemachine__Group_9_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22437:1: ( rule__Statemachine__Group_9_3__0__Impl rule__Statemachine__Group_9_3__1 )
+            // InternalFormalML.g:22438:2: rule__Statemachine__Group_9_3__0__Impl rule__Statemachine__Group_9_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__Statemachine__Group_9_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_9_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_3__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_3__0__Impl"
+    // InternalFormalML.g:22445:1: rule__Statemachine__Group_9_3__0__Impl : ( '@private:' ) ;
+    public final void rule__Statemachine__Group_9_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22449:1: ( ( '@private:' ) )
+            // InternalFormalML.g:22450:1: ( '@private:' )
+            {
+            // InternalFormalML.g:22450:1: ( '@private:' )
+            // InternalFormalML.g:22451:2: '@private:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()); 
+            }
+            match(input,205,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_3__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_3__1"
+    // InternalFormalML.g:22460:1: rule__Statemachine__Group_9_3__1 : rule__Statemachine__Group_9_3__1__Impl ;
+    public final void rule__Statemachine__Group_9_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22464:1: ( rule__Statemachine__Group_9_3__1__Impl )
+            // InternalFormalML.g:22465:2: rule__Statemachine__Group_9_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_9_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_3__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_9_3__1__Impl"
+    // InternalFormalML.g:22471:1: rule__Statemachine__Group_9_3__1__Impl : ( ( rule__Statemachine__Alternatives_9_3_1 )* ) ;
+    public final void rule__Statemachine__Group_9_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22475:1: ( ( ( rule__Statemachine__Alternatives_9_3_1 )* ) )
+            // InternalFormalML.g:22476:1: ( ( rule__Statemachine__Alternatives_9_3_1 )* )
+            {
+            // InternalFormalML.g:22476:1: ( ( rule__Statemachine__Alternatives_9_3_1 )* )
+            // InternalFormalML.g:22477:2: ( rule__Statemachine__Alternatives_9_3_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_9_3_1()); 
+            }
+            // InternalFormalML.g:22478:2: ( rule__Statemachine__Alternatives_9_3_1 )*
+            loop399:
+            do {
+                int alt399=2;
+                switch ( input.LA(1) ) {
+                case 143:
+                    {
+                    int LA399_2 = input.LA(2);
+
+                    if ( (LA399_2==229) ) {
+                        alt399=1;
+                    }
+
+
+                    }
+                    break;
+                case 144:
+                    {
+                    int LA399_3 = input.LA(2);
+
+                    if ( (LA399_3==229) ) {
+                        alt399=1;
+                    }
+
+
+                    }
+                    break;
+                case 145:
+                    {
+                    int LA399_4 = input.LA(2);
+
+                    if ( (LA399_4==229) ) {
+                        alt399=1;
+                    }
+
+
+                    }
+                    break;
+                case 28:
+                    {
+                    int LA399_5 = input.LA(2);
+
+                    if ( (LA399_5==229) ) {
+                        alt399=1;
+                    }
+
+
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA399_6 = input.LA(2);
+
+                    if ( (LA399_6==16||LA399_6==179||LA399_6==224||LA399_6==283) ) {
+                        alt399=1;
+                    }
+
+
+                    }
+                    break;
+                case 15:
+                case 16:
+                case 17:
+                case 18:
+                case 19:
+                case 179:
+                case 229:
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                case 283:
+                    {
+                    alt399=1;
+                    }
+                    break;
+
+                }
+
+                switch (alt399) {
+            	case 1 :
+            	    // InternalFormalML.g:22478:3: rule__Statemachine__Alternatives_9_3_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    rule__Statemachine__Alternatives_9_3_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop399;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_9_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_9_3__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_10_0_0__0"
+    // InternalFormalML.g:22487:1: rule__Statemachine__Group_10_0_0__0 : rule__Statemachine__Group_10_0_0__0__Impl rule__Statemachine__Group_10_0_0__1 ;
+    public final void rule__Statemachine__Group_10_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22491:1: ( rule__Statemachine__Group_10_0_0__0__Impl rule__Statemachine__Group_10_0_0__1 )
+            // InternalFormalML.g:22492:2: rule__Statemachine__Group_10_0_0__0__Impl rule__Statemachine__Group_10_0_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_42);
+            rule__Statemachine__Group_10_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_10_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_10_0_0__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_10_0_0__0__Impl"
+    // InternalFormalML.g:22499:1: rule__Statemachine__Group_10_0_0__0__Impl : ( ( rule__Statemachine__Alternatives_10_0_0_0 ) ) ;
+    public final void rule__Statemachine__Group_10_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22503:1: ( ( ( rule__Statemachine__Alternatives_10_0_0_0 ) ) )
+            // InternalFormalML.g:22504:1: ( ( rule__Statemachine__Alternatives_10_0_0_0 ) )
+            {
+            // InternalFormalML.g:22504:1: ( ( rule__Statemachine__Alternatives_10_0_0_0 ) )
+            // InternalFormalML.g:22505:2: ( rule__Statemachine__Alternatives_10_0_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getAlternatives_10_0_0_0()); 
+            }
+            // InternalFormalML.g:22506:2: ( rule__Statemachine__Alternatives_10_0_0_0 )
+            // InternalFormalML.g:22506:3: rule__Statemachine__Alternatives_10_0_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Alternatives_10_0_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getAlternatives_10_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_10_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_10_0_0__1"
+    // InternalFormalML.g:22514:1: rule__Statemachine__Group_10_0_0__1 : rule__Statemachine__Group_10_0_0__1__Impl ;
+    public final void rule__Statemachine__Group_10_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22518:1: ( rule__Statemachine__Group_10_0_0__1__Impl )
+            // InternalFormalML.g:22519:2: rule__Statemachine__Group_10_0_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_10_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_10_0_0__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_10_0_0__1__Impl"
+    // InternalFormalML.g:22525:1: rule__Statemachine__Group_10_0_0__1__Impl : ( ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 )* ) ) ;
+    public final void rule__Statemachine__Group_10_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22529:1: ( ( ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 )* ) ) )
+            // InternalFormalML.g:22530:1: ( ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 )* ) )
+            {
+            // InternalFormalML.g:22530:1: ( ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 )* ) )
+            // InternalFormalML.g:22531:2: ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 ) ) ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 )* )
+            {
+            // InternalFormalML.g:22531:2: ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 ) )
+            // InternalFormalML.g:22532:3: ( rule__Statemachine__RoutineAssignment_10_0_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_0_0_1()); 
+            }
+            // InternalFormalML.g:22533:3: ( rule__Statemachine__RoutineAssignment_10_0_0_1 )
+            // InternalFormalML.g:22533:4: rule__Statemachine__RoutineAssignment_10_0_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_43);
+            rule__Statemachine__RoutineAssignment_10_0_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_0_0_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:22536:2: ( ( rule__Statemachine__RoutineAssignment_10_0_0_1 )* )
+            // InternalFormalML.g:22537:3: ( rule__Statemachine__RoutineAssignment_10_0_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_0_0_1()); 
+            }
+            // InternalFormalML.g:22538:3: ( rule__Statemachine__RoutineAssignment_10_0_0_1 )*
+            loop400:
+            do {
+                int alt400=2;
+                int LA400_0 = input.LA(1);
+
+                if ( (LA400_0==28||(LA400_0>=143 && LA400_0<=145)||(LA400_0>=224 && LA400_0<=225)) ) {
+                    alt400=1;
+                }
+
+
+                switch (alt400) {
+            	case 1 :
+            	    // InternalFormalML.g:22538:4: rule__Statemachine__RoutineAssignment_10_0_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_43);
+            	    rule__Statemachine__RoutineAssignment_10_0_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop400;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRoutineAssignment_10_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_10_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_10_0_1__0"
+    // InternalFormalML.g:22548:1: rule__Statemachine__Group_10_0_1__0 : rule__Statemachine__Group_10_0_1__0__Impl rule__Statemachine__Group_10_0_1__1 ;
+    public final void rule__Statemachine__Group_10_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22552:1: ( rule__Statemachine__Group_10_0_1__0__Impl rule__Statemachine__Group_10_0_1__1 )
+            // InternalFormalML.g:22553:2: rule__Statemachine__Group_10_0_1__0__Impl rule__Statemachine__Group_10_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_44);
+            rule__Statemachine__Group_10_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_10_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_10_0_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__Group_10_0_1__0__Impl"
+    // InternalFormalML.g:22560:1: rule__Statemachine__Group_10_0_1__0__Impl : ( '@procedure:' ) ;
+    public final void rule__Statemachine__Group_10_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22564:1: ( ( '@procedure:' ) )
+            // InternalFormalML.g:22565:1: ( '@procedure:' )
+            {
+            // InternalFormalML.g:22565:1: ( '@procedure:' )
+            // InternalFormalML.g:22566:2: '@procedure:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getProcedureKeyword_10_0_1_0()); 
+            }
+            match(input,206,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getProcedureKeyword_10_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_10_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__Group_10_0_1__1"
+    // InternalFormalML.g:22575:1: rule__Statemachine__Group_10_0_1__1 : rule__Statemachine__Group_10_0_1__1__Impl ;
+    public final void rule__Statemachine__Group_10_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22579:1: ( rule__Statemachine__Group_10_0_1__1__Impl )
+            // InternalFormalML.g:22580:2: rule__Statemachine__Group_10_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__Group_10_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_10_0_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__Group_10_0_1__1__Impl"
+    // InternalFormalML.g:22586:1: rule__Statemachine__Group_10_0_1__1__Impl : ( ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )* ) ) ;
+    public final void rule__Statemachine__Group_10_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22590:1: ( ( ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )* ) ) )
+            // InternalFormalML.g:22591:1: ( ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )* ) )
+            {
+            // InternalFormalML.g:22591:1: ( ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )* ) )
+            // InternalFormalML.g:22592:2: ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 ) ) ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )* )
+            {
+            // InternalFormalML.g:22592:2: ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 ) )
+            // InternalFormalML.g:22593:3: ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_0_1_1()); 
+            }
+            // InternalFormalML.g:22594:3: ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )
+            // InternalFormalML.g:22594:4: rule__Statemachine__ProcedureAssignment_10_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_5);
+            rule__Statemachine__ProcedureAssignment_10_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_0_1_1()); 
+            }
+
+            }
+
+            // InternalFormalML.g:22597:2: ( ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )* )
+            // InternalFormalML.g:22598:3: ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_0_1_1()); 
+            }
+            // InternalFormalML.g:22599:3: ( rule__Statemachine__ProcedureAssignment_10_0_1_1 )*
+            loop401:
+            do {
+                int alt401=2;
+                int LA401_0 = input.LA(1);
+
+                if ( (LA401_0==28||(LA401_0>=143 && LA401_0<=145)||LA401_0==214) ) {
+                    alt401=1;
+                }
+
+
+                switch (alt401) {
+            	case 1 :
+            	    // InternalFormalML.g:22599:4: rule__Statemachine__ProcedureAssignment_10_0_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_5);
+            	    rule__Statemachine__ProcedureAssignment_10_0_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop401;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getProcedureAssignment_10_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Group_10_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group__0"
+    // InternalFormalML.g:22609:1: rule__StatemachineRegion__Group__0 : rule__StatemachineRegion__Group__0__Impl rule__StatemachineRegion__Group__1 ;
+    public final void rule__StatemachineRegion__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22613:1: ( rule__StatemachineRegion__Group__0__Impl rule__StatemachineRegion__Group__1 )
+            // InternalFormalML.g:22614:2: rule__StatemachineRegion__Group__0__Impl rule__StatemachineRegion__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_78);
+            rule__StatemachineRegion__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group__0"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group__0__Impl"
+    // InternalFormalML.g:22621:1: rule__StatemachineRegion__Group__0__Impl : ( () ) ;
+    public final void rule__StatemachineRegion__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22625:1: ( ( () ) )
+            // InternalFormalML.g:22626:1: ( () )
+            {
+            // InternalFormalML.g:22626:1: ( () )
+            // InternalFormalML.g:22627:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getRegionAction_0()); 
+            }
+            // InternalFormalML.g:22628:2: ()
+            // InternalFormalML.g:22628:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getRegionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group__0__Impl"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group__1"
+    // InternalFormalML.g:22636:1: rule__StatemachineRegion__Group__1 : rule__StatemachineRegion__Group__1__Impl rule__StatemachineRegion__Group__2 ;
+    public final void rule__StatemachineRegion__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22640:1: ( rule__StatemachineRegion__Group__1__Impl rule__StatemachineRegion__Group__2 )
+            // InternalFormalML.g:22641:2: rule__StatemachineRegion__Group__1__Impl rule__StatemachineRegion__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_79);
+            rule__StatemachineRegion__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group__1"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group__1__Impl"
+    // InternalFormalML.g:22648:1: rule__StatemachineRegion__Group__1__Impl : ( ( rule__StatemachineRegion__Alternatives_1 ) ) ;
+    public final void rule__StatemachineRegion__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22652:1: ( ( ( rule__StatemachineRegion__Alternatives_1 ) ) )
+            // InternalFormalML.g:22653:1: ( ( rule__StatemachineRegion__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:22653:1: ( ( rule__StatemachineRegion__Alternatives_1 ) )
+            // InternalFormalML.g:22654:2: ( rule__StatemachineRegion__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:22655:2: ( rule__StatemachineRegion__Alternatives_1 )
+            // InternalFormalML.g:22655:3: rule__StatemachineRegion__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group__1__Impl"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group__2"
+    // InternalFormalML.g:22663:1: rule__StatemachineRegion__Group__2 : rule__StatemachineRegion__Group__2__Impl ;
+    public final void rule__StatemachineRegion__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22667:1: ( rule__StatemachineRegion__Group__2__Impl )
+            // InternalFormalML.g:22668:2: rule__StatemachineRegion__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group__2"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group__2__Impl"
+    // InternalFormalML.g:22674:1: rule__StatemachineRegion__Group__2__Impl : ( ( ( rule__StatemachineRegion__Alternatives_2 ) ) ( ( rule__StatemachineRegion__Alternatives_2 )* ) ) ;
+    public final void rule__StatemachineRegion__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22678:1: ( ( ( ( rule__StatemachineRegion__Alternatives_2 ) ) ( ( rule__StatemachineRegion__Alternatives_2 )* ) ) )
+            // InternalFormalML.g:22679:1: ( ( ( rule__StatemachineRegion__Alternatives_2 ) ) ( ( rule__StatemachineRegion__Alternatives_2 )* ) )
+            {
+            // InternalFormalML.g:22679:1: ( ( ( rule__StatemachineRegion__Alternatives_2 ) ) ( ( rule__StatemachineRegion__Alternatives_2 )* ) )
+            // InternalFormalML.g:22680:2: ( ( rule__StatemachineRegion__Alternatives_2 ) ) ( ( rule__StatemachineRegion__Alternatives_2 )* )
+            {
+            // InternalFormalML.g:22680:2: ( ( rule__StatemachineRegion__Alternatives_2 ) )
+            // InternalFormalML.g:22681:3: ( rule__StatemachineRegion__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getAlternatives_2()); 
+            }
+            // InternalFormalML.g:22682:3: ( rule__StatemachineRegion__Alternatives_2 )
+            // InternalFormalML.g:22682:4: rule__StatemachineRegion__Alternatives_2
+            {
+            pushFollow(FollowSets000.FOLLOW_3);
+            rule__StatemachineRegion__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getAlternatives_2()); 
+            }
+
+            }
+
+            // InternalFormalML.g:22685:2: ( ( rule__StatemachineRegion__Alternatives_2 )* )
+            // InternalFormalML.g:22686:3: ( rule__StatemachineRegion__Alternatives_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getAlternatives_2()); 
+            }
+            // InternalFormalML.g:22687:3: ( rule__StatemachineRegion__Alternatives_2 )*
+            loop402:
+            do {
+                int alt402=2;
+                int LA402_0 = input.LA(1);
+
+                if ( ((LA402_0>=54 && LA402_0<=57)||(LA402_0>=275 && LA402_0<=276)) ) {
+                    alt402=1;
+                }
+
+
+                switch (alt402) {
+            	case 1 :
+            	    // InternalFormalML.g:22687:4: rule__StatemachineRegion__Alternatives_2
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_3);
+            	    rule__StatemachineRegion__Alternatives_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop402;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group__2__Impl"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group_1_1__0"
+    // InternalFormalML.g:22697:1: rule__StatemachineRegion__Group_1_1__0 : rule__StatemachineRegion__Group_1_1__0__Impl rule__StatemachineRegion__Group_1_1__1 ;
+    public final void rule__StatemachineRegion__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22701:1: ( rule__StatemachineRegion__Group_1_1__0__Impl rule__StatemachineRegion__Group_1_1__1 )
+            // InternalFormalML.g:22702:2: rule__StatemachineRegion__Group_1_1__0__Impl rule__StatemachineRegion__Group_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__StatemachineRegion__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group_1_1__0"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group_1_1__0__Impl"
+    // InternalFormalML.g:22709:1: rule__StatemachineRegion__Group_1_1__0__Impl : ( ( rule__StatemachineRegion__Alternatives_1_1_0 ) ) ;
+    public final void rule__StatemachineRegion__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22713:1: ( ( ( rule__StatemachineRegion__Alternatives_1_1_0 ) ) )
+            // InternalFormalML.g:22714:1: ( ( rule__StatemachineRegion__Alternatives_1_1_0 ) )
+            {
+            // InternalFormalML.g:22714:1: ( ( rule__StatemachineRegion__Alternatives_1_1_0 ) )
+            // InternalFormalML.g:22715:2: ( rule__StatemachineRegion__Alternatives_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_1_0()); 
+            }
+            // InternalFormalML.g:22716:2: ( rule__StatemachineRegion__Alternatives_1_1_0 )
+            // InternalFormalML.g:22716:3: rule__StatemachineRegion__Alternatives_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Alternatives_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getAlternatives_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group_1_1__1"
+    // InternalFormalML.g:22724:1: rule__StatemachineRegion__Group_1_1__1 : rule__StatemachineRegion__Group_1_1__1__Impl rule__StatemachineRegion__Group_1_1__2 ;
+    public final void rule__StatemachineRegion__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22728:1: ( rule__StatemachineRegion__Group_1_1__1__Impl rule__StatemachineRegion__Group_1_1__2 )
+            // InternalFormalML.g:22729:2: rule__StatemachineRegion__Group_1_1__1__Impl rule__StatemachineRegion__Group_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_80);
+            rule__StatemachineRegion__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Group_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group_1_1__1"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group_1_1__1__Impl"
+    // InternalFormalML.g:22736:1: rule__StatemachineRegion__Group_1_1__1__Impl : ( ( rule__StatemachineRegion__NameAssignment_1_1_1 ) ) ;
+    public final void rule__StatemachineRegion__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22740:1: ( ( ( rule__StatemachineRegion__NameAssignment_1_1_1 ) ) )
+            // InternalFormalML.g:22741:1: ( ( rule__StatemachineRegion__NameAssignment_1_1_1 ) )
+            {
+            // InternalFormalML.g:22741:1: ( ( rule__StatemachineRegion__NameAssignment_1_1_1 ) )
+            // InternalFormalML.g:22742:2: ( rule__StatemachineRegion__NameAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getNameAssignment_1_1_1()); 
+            }
+            // InternalFormalML.g:22743:2: ( rule__StatemachineRegion__NameAssignment_1_1_1 )
+            // InternalFormalML.g:22743:3: rule__StatemachineRegion__NameAssignment_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__NameAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getNameAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group_1_1__2"
+    // InternalFormalML.g:22751:1: rule__StatemachineRegion__Group_1_1__2 : rule__StatemachineRegion__Group_1_1__2__Impl rule__StatemachineRegion__Group_1_1__3 ;
+    public final void rule__StatemachineRegion__Group_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22755:1: ( rule__StatemachineRegion__Group_1_1__2__Impl rule__StatemachineRegion__Group_1_1__3 )
+            // InternalFormalML.g:22756:2: rule__StatemachineRegion__Group_1_1__2__Impl rule__StatemachineRegion__Group_1_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_80);
+            rule__StatemachineRegion__Group_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Group_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group_1_1__2"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group_1_1__2__Impl"
+    // InternalFormalML.g:22763:1: rule__StatemachineRegion__Group_1_1__2__Impl : ( ( rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2 )? ) ;
+    public final void rule__StatemachineRegion__Group_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22767:1: ( ( ( rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2 )? ) )
+            // InternalFormalML.g:22768:1: ( ( rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2 )? )
+            {
+            // InternalFormalML.g:22768:1: ( ( rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2 )? )
+            // InternalFormalML.g:22769:2: ( rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameAssignment_1_1_2()); 
+            }
+            // InternalFormalML.g:22770:2: ( rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2 )?
+            int alt403=2;
+            int LA403_0 = input.LA(1);
+
+            if ( (LA403_0==RULE_STRING) ) {
+                alt403=1;
+            }
+            switch (alt403) {
+                case 1 :
+                    // InternalFormalML.g:22770:3: rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameAssignment_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group_1_1__3"
+    // InternalFormalML.g:22778:1: rule__StatemachineRegion__Group_1_1__3 : rule__StatemachineRegion__Group_1_1__3__Impl ;
+    public final void rule__StatemachineRegion__Group_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22782:1: ( rule__StatemachineRegion__Group_1_1__3__Impl )
+            // InternalFormalML.g:22783:2: rule__StatemachineRegion__Group_1_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StatemachineRegion__Group_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group_1_1__3"
+
+
+    // $ANTLR start "rule__StatemachineRegion__Group_1_1__3__Impl"
+    // InternalFormalML.g:22789:1: rule__StatemachineRegion__Group_1_1__3__Impl : ( '>:' ) ;
+    public final void rule__StatemachineRegion__Group_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22793:1: ( ( '>:' ) )
+            // InternalFormalML.g:22794:1: ( '>:' )
+            {
+            // InternalFormalML.g:22794:1: ( '>:' )
+            // InternalFormalML.g:22795:2: '>:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getGreaterThanSignColonKeyword_1_1_3()); 
+            }
+            match(input,197,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getGreaterThanSignColonKeyword_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__Group_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group__0"
+    // InternalFormalML.g:22805:1: rule__CompositeState__Group__0 : rule__CompositeState__Group__0__Impl rule__CompositeState__Group__1 ;
+    public final void rule__CompositeState__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22809:1: ( rule__CompositeState__Group__0__Impl rule__CompositeState__Group__1 )
+            // InternalFormalML.g:22810:2: rule__CompositeState__Group__0__Impl rule__CompositeState__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_81);
+            rule__CompositeState__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__0"
+
+
+    // $ANTLR start "rule__CompositeState__Group__0__Impl"
+    // InternalFormalML.g:22817:1: rule__CompositeState__Group__0__Impl : ( () ) ;
+    public final void rule__CompositeState__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22821:1: ( ( () ) )
+            // InternalFormalML.g:22822:1: ( () )
+            {
+            // InternalFormalML.g:22822:1: ( () )
+            // InternalFormalML.g:22823:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getStateAction_0()); 
+            }
+            // InternalFormalML.g:22824:2: ()
+            // InternalFormalML.g:22824:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getStateAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__0__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group__1"
+    // InternalFormalML.g:22832:1: rule__CompositeState__Group__1 : rule__CompositeState__Group__1__Impl rule__CompositeState__Group__2 ;
+    public final void rule__CompositeState__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22836:1: ( rule__CompositeState__Group__1__Impl rule__CompositeState__Group__2 )
+            // InternalFormalML.g:22837:2: rule__CompositeState__Group__1__Impl rule__CompositeState__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__CompositeState__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__1"
+
+
+    // $ANTLR start "rule__CompositeState__Group__1__Impl"
+    // InternalFormalML.g:22844:1: rule__CompositeState__Group__1__Impl : ( ( rule__CompositeState__CompositeAssignment_1 ) ) ;
+    public final void rule__CompositeState__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22848:1: ( ( ( rule__CompositeState__CompositeAssignment_1 ) ) )
+            // InternalFormalML.g:22849:1: ( ( rule__CompositeState__CompositeAssignment_1 ) )
+            {
+            // InternalFormalML.g:22849:1: ( ( rule__CompositeState__CompositeAssignment_1 ) )
+            // InternalFormalML.g:22850:2: ( rule__CompositeState__CompositeAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getCompositeAssignment_1()); 
+            }
+            // InternalFormalML.g:22851:2: ( rule__CompositeState__CompositeAssignment_1 )
+            // InternalFormalML.g:22851:3: rule__CompositeState__CompositeAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__CompositeAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getCompositeAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__1__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group__2"
+    // InternalFormalML.g:22859:1: rule__CompositeState__Group__2 : rule__CompositeState__Group__2__Impl rule__CompositeState__Group__3 ;
+    public final void rule__CompositeState__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22863:1: ( rule__CompositeState__Group__2__Impl rule__CompositeState__Group__3 )
+            // InternalFormalML.g:22864:2: rule__CompositeState__Group__2__Impl rule__CompositeState__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__CompositeState__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__2"
+
+
+    // $ANTLR start "rule__CompositeState__Group__2__Impl"
+    // InternalFormalML.g:22871:1: rule__CompositeState__Group__2__Impl : ( '<' ) ;
+    public final void rule__CompositeState__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22875:1: ( ( '<' ) )
+            // InternalFormalML.g:22876:1: ( '<' )
+            {
+            // InternalFormalML.g:22876:1: ( '<' )
+            // InternalFormalML.g:22877:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getLessThanSignKeyword_2()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getLessThanSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__2__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group__3"
+    // InternalFormalML.g:22886:1: rule__CompositeState__Group__3 : rule__CompositeState__Group__3__Impl rule__CompositeState__Group__4 ;
+    public final void rule__CompositeState__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22890:1: ( rule__CompositeState__Group__3__Impl rule__CompositeState__Group__4 )
+            // InternalFormalML.g:22891:2: rule__CompositeState__Group__3__Impl rule__CompositeState__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_37);
+            rule__CompositeState__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__3"
+
+
+    // $ANTLR start "rule__CompositeState__Group__3__Impl"
+    // InternalFormalML.g:22898:1: rule__CompositeState__Group__3__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__CompositeState__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22902:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:22903:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:22903:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:22904:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getMocKeyword_3()); 
+            }
+            // InternalFormalML.g:22905:2: ( 'moc:' )?
+            int alt404=2;
+            int LA404_0 = input.LA(1);
+
+            if ( (LA404_0==201) ) {
+                alt404=1;
+            }
+            switch (alt404) {
+                case 1 :
+                    // InternalFormalML.g:22905:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getMocKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__3__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group__4"
+    // InternalFormalML.g:22913:1: rule__CompositeState__Group__4 : rule__CompositeState__Group__4__Impl rule__CompositeState__Group__5 ;
+    public final void rule__CompositeState__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22917:1: ( rule__CompositeState__Group__4__Impl rule__CompositeState__Group__5 )
+            // InternalFormalML.g:22918:2: rule__CompositeState__Group__4__Impl rule__CompositeState__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__CompositeState__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__4"
+
+
+    // $ANTLR start "rule__CompositeState__Group__4__Impl"
+    // InternalFormalML.g:22925:1: rule__CompositeState__Group__4__Impl : ( ( rule__CompositeState__Alternatives_4 ) ) ;
+    public final void rule__CompositeState__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22929:1: ( ( ( rule__CompositeState__Alternatives_4 ) ) )
+            // InternalFormalML.g:22930:1: ( ( rule__CompositeState__Alternatives_4 ) )
+            {
+            // InternalFormalML.g:22930:1: ( ( rule__CompositeState__Alternatives_4 ) )
+            // InternalFormalML.g:22931:2: ( rule__CompositeState__Alternatives_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getAlternatives_4()); 
+            }
+            // InternalFormalML.g:22932:2: ( rule__CompositeState__Alternatives_4 )
+            // InternalFormalML.g:22932:3: rule__CompositeState__Alternatives_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Alternatives_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getAlternatives_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__4__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group__5"
+    // InternalFormalML.g:22940:1: rule__CompositeState__Group__5 : rule__CompositeState__Group__5__Impl rule__CompositeState__Group__6 ;
+    public final void rule__CompositeState__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22944:1: ( rule__CompositeState__Group__5__Impl rule__CompositeState__Group__6 )
+            // InternalFormalML.g:22945:2: rule__CompositeState__Group__5__Impl rule__CompositeState__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__CompositeState__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__5"
+
+
+    // $ANTLR start "rule__CompositeState__Group__5__Impl"
+    // InternalFormalML.g:22952:1: rule__CompositeState__Group__5__Impl : ( '>' ) ;
+    public final void rule__CompositeState__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22956:1: ( ( '>' ) )
+            // InternalFormalML.g:22957:1: ( '>' )
+            {
+            // InternalFormalML.g:22957:1: ( '>' )
+            // InternalFormalML.g:22958:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getGreaterThanSignKeyword_5()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getGreaterThanSignKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__5__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group__6"
+    // InternalFormalML.g:22967:1: rule__CompositeState__Group__6 : rule__CompositeState__Group__6__Impl rule__CompositeState__Group__7 ;
+    public final void rule__CompositeState__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22971:1: ( rule__CompositeState__Group__6__Impl rule__CompositeState__Group__7 )
+            // InternalFormalML.g:22972:2: rule__CompositeState__Group__6__Impl rule__CompositeState__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__CompositeState__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__6"
+
+
+    // $ANTLR start "rule__CompositeState__Group__6__Impl"
+    // InternalFormalML.g:22979:1: rule__CompositeState__Group__6__Impl : ( ( rule__CompositeState__NameAssignment_6 ) ) ;
+    public final void rule__CompositeState__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22983:1: ( ( ( rule__CompositeState__NameAssignment_6 ) ) )
+            // InternalFormalML.g:22984:1: ( ( rule__CompositeState__NameAssignment_6 ) )
+            {
+            // InternalFormalML.g:22984:1: ( ( rule__CompositeState__NameAssignment_6 ) )
+            // InternalFormalML.g:22985:2: ( rule__CompositeState__NameAssignment_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getNameAssignment_6()); 
+            }
+            // InternalFormalML.g:22986:2: ( rule__CompositeState__NameAssignment_6 )
+            // InternalFormalML.g:22986:3: rule__CompositeState__NameAssignment_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__NameAssignment_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getNameAssignment_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__6__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group__7"
+    // InternalFormalML.g:22994:1: rule__CompositeState__Group__7 : rule__CompositeState__Group__7__Impl rule__CompositeState__Group__8 ;
+    public final void rule__CompositeState__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:22998:1: ( rule__CompositeState__Group__7__Impl rule__CompositeState__Group__8 )
+            // InternalFormalML.g:22999:2: rule__CompositeState__Group__7__Impl rule__CompositeState__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__CompositeState__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__7"
+
+
+    // $ANTLR start "rule__CompositeState__Group__7__Impl"
+    // InternalFormalML.g:23006:1: rule__CompositeState__Group__7__Impl : ( ( rule__CompositeState__UnrestrictedNameAssignment_7 )? ) ;
+    public final void rule__CompositeState__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23010:1: ( ( ( rule__CompositeState__UnrestrictedNameAssignment_7 )? ) )
+            // InternalFormalML.g:23011:1: ( ( rule__CompositeState__UnrestrictedNameAssignment_7 )? )
+            {
+            // InternalFormalML.g:23011:1: ( ( rule__CompositeState__UnrestrictedNameAssignment_7 )? )
+            // InternalFormalML.g:23012:2: ( rule__CompositeState__UnrestrictedNameAssignment_7 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getUnrestrictedNameAssignment_7()); 
+            }
+            // InternalFormalML.g:23013:2: ( rule__CompositeState__UnrestrictedNameAssignment_7 )?
+            int alt405=2;
+            int LA405_0 = input.LA(1);
+
+            if ( (LA405_0==RULE_STRING) ) {
+                alt405=1;
+            }
+            switch (alt405) {
+                case 1 :
+                    // InternalFormalML.g:23013:3: rule__CompositeState__UnrestrictedNameAssignment_7
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CompositeState__UnrestrictedNameAssignment_7();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getUnrestrictedNameAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__7__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group__8"
+    // InternalFormalML.g:23021:1: rule__CompositeState__Group__8 : rule__CompositeState__Group__8__Impl ;
+    public final void rule__CompositeState__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23025:1: ( rule__CompositeState__Group__8__Impl )
+            // InternalFormalML.g:23026:2: rule__CompositeState__Group__8__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__8"
+
+
+    // $ANTLR start "rule__CompositeState__Group__8__Impl"
+    // InternalFormalML.g:23032:1: rule__CompositeState__Group__8__Impl : ( ( rule__CompositeState__Alternatives_8 ) ) ;
+    public final void rule__CompositeState__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23036:1: ( ( ( rule__CompositeState__Alternatives_8 ) ) )
+            // InternalFormalML.g:23037:1: ( ( rule__CompositeState__Alternatives_8 ) )
+            {
+            // InternalFormalML.g:23037:1: ( ( rule__CompositeState__Alternatives_8 ) )
+            // InternalFormalML.g:23038:2: ( rule__CompositeState__Alternatives_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:23039:2: ( rule__CompositeState__Alternatives_8 )
+            // InternalFormalML.g:23039:3: rule__CompositeState__Alternatives_8
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Alternatives_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group__8__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0__0"
+    // InternalFormalML.g:23048:1: rule__CompositeState__Group_8_0__0 : rule__CompositeState__Group_8_0__0__Impl rule__CompositeState__Group_8_0__1 ;
+    public final void rule__CompositeState__Group_8_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23052:1: ( rule__CompositeState__Group_8_0__0__Impl rule__CompositeState__Group_8_0__1 )
+            // InternalFormalML.g:23053:2: rule__CompositeState__Group_8_0__0__Impl rule__CompositeState__Group_8_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_83);
+            rule__CompositeState__Group_8_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group_8_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0__0"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0__0__Impl"
+    // InternalFormalML.g:23060:1: rule__CompositeState__Group_8_0__0__Impl : ( '{' ) ;
+    public final void rule__CompositeState__Group_8_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23064:1: ( ( '{' ) )
+            // InternalFormalML.g:23065:1: ( '{' )
+            {
+            // InternalFormalML.g:23065:1: ( '{' )
+            // InternalFormalML.g:23066:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getLeftCurlyBracketKeyword_8_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getLeftCurlyBracketKeyword_8_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0__0__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0__1"
+    // InternalFormalML.g:23075:1: rule__CompositeState__Group_8_0__1 : rule__CompositeState__Group_8_0__1__Impl rule__CompositeState__Group_8_0__2 ;
+    public final void rule__CompositeState__Group_8_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23079:1: ( rule__CompositeState__Group_8_0__1__Impl rule__CompositeState__Group_8_0__2 )
+            // InternalFormalML.g:23080:2: rule__CompositeState__Group_8_0__1__Impl rule__CompositeState__Group_8_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__CompositeState__Group_8_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group_8_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0__1"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0__1__Impl"
+    // InternalFormalML.g:23087:1: rule__CompositeState__Group_8_0__1__Impl : ( ( rule__CompositeState__Alternatives_8_0_1 ) ) ;
+    public final void rule__CompositeState__Group_8_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23091:1: ( ( ( rule__CompositeState__Alternatives_8_0_1 ) ) )
+            // InternalFormalML.g:23092:1: ( ( rule__CompositeState__Alternatives_8_0_1 ) )
+            {
+            // InternalFormalML.g:23092:1: ( ( rule__CompositeState__Alternatives_8_0_1 ) )
+            // InternalFormalML.g:23093:2: ( rule__CompositeState__Alternatives_8_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1()); 
+            }
+            // InternalFormalML.g:23094:2: ( rule__CompositeState__Alternatives_8_0_1 )
+            // InternalFormalML.g:23094:3: rule__CompositeState__Alternatives_8_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Alternatives_8_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0__1__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0__2"
+    // InternalFormalML.g:23102:1: rule__CompositeState__Group_8_0__2 : rule__CompositeState__Group_8_0__2__Impl ;
+    public final void rule__CompositeState__Group_8_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23106:1: ( rule__CompositeState__Group_8_0__2__Impl )
+            // InternalFormalML.g:23107:2: rule__CompositeState__Group_8_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group_8_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0__2"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0__2__Impl"
+    // InternalFormalML.g:23113:1: rule__CompositeState__Group_8_0__2__Impl : ( '}' ) ;
+    public final void rule__CompositeState__Group_8_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23117:1: ( ( '}' ) )
+            // InternalFormalML.g:23118:1: ( '}' )
+            {
+            // InternalFormalML.g:23118:1: ( '}' )
+            // InternalFormalML.g:23119:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getRightCurlyBracketKeyword_8_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getRightCurlyBracketKeyword_8_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0__2__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_0_1__0"
+    // InternalFormalML.g:23129:1: rule__CompositeState__Group_8_0_1_0_1__0 : rule__CompositeState__Group_8_0_1_0_1__0__Impl rule__CompositeState__Group_8_0_1_0_1__1 ;
+    public final void rule__CompositeState__Group_8_0_1_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23133:1: ( rule__CompositeState__Group_8_0_1_0_1__0__Impl rule__CompositeState__Group_8_0_1_0_1__1 )
+            // InternalFormalML.g:23134:2: rule__CompositeState__Group_8_0_1_0_1__0__Impl rule__CompositeState__Group_8_0_1_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_84);
+            rule__CompositeState__Group_8_0_1_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group_8_0_1_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_0_1__0"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_0_1__0__Impl"
+    // InternalFormalML.g:23141:1: rule__CompositeState__Group_8_0_1_0_1__0__Impl : ( '@moe:' ) ;
+    public final void rule__CompositeState__Group_8_0_1_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23145:1: ( ( '@moe:' ) )
+            // InternalFormalML.g:23146:1: ( '@moe:' )
+            {
+            // InternalFormalML.g:23146:1: ( '@moe:' )
+            // InternalFormalML.g:23147:2: '@moe:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()); 
+            }
+            match(input,221,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_0_1__1"
+    // InternalFormalML.g:23156:1: rule__CompositeState__Group_8_0_1_0_1__1 : rule__CompositeState__Group_8_0_1_0_1__1__Impl ;
+    public final void rule__CompositeState__Group_8_0_1_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23160:1: ( rule__CompositeState__Group_8_0_1_0_1__1__Impl )
+            // InternalFormalML.g:23161:2: rule__CompositeState__Group_8_0_1_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group_8_0_1_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_0_1__1"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_0_1__1__Impl"
+    // InternalFormalML.g:23167:1: rule__CompositeState__Group_8_0_1_0_1__1__Impl : ( ( rule__CompositeState__MoeAssignment_8_0_1_0_1_1 )* ) ;
+    public final void rule__CompositeState__Group_8_0_1_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23171:1: ( ( ( rule__CompositeState__MoeAssignment_8_0_1_0_1_1 )* ) )
+            // InternalFormalML.g:23172:1: ( ( rule__CompositeState__MoeAssignment_8_0_1_0_1_1 )* )
+            {
+            // InternalFormalML.g:23172:1: ( ( rule__CompositeState__MoeAssignment_8_0_1_0_1_1 )* )
+            // InternalFormalML.g:23173:2: ( rule__CompositeState__MoeAssignment_8_0_1_0_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_0_1_1()); 
+            }
+            // InternalFormalML.g:23174:2: ( rule__CompositeState__MoeAssignment_8_0_1_0_1_1 )*
+            loop406:
+            do {
+                int alt406=2;
+                int LA406_0 = input.LA(1);
+
+                if ( ((LA406_0>=46 && LA406_0<=53)) ) {
+                    alt406=1;
+                }
+
+
+                switch (alt406) {
+            	case 1 :
+            	    // InternalFormalML.g:23174:3: rule__CompositeState__MoeAssignment_8_0_1_0_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_85);
+            	    rule__CompositeState__MoeAssignment_8_0_1_0_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop406;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getMoeAssignment_8_0_1_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_0_2__0"
+    // InternalFormalML.g:23183:1: rule__CompositeState__Group_8_0_1_0_2__0 : rule__CompositeState__Group_8_0_1_0_2__0__Impl rule__CompositeState__Group_8_0_1_0_2__1 ;
+    public final void rule__CompositeState__Group_8_0_1_0_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23187:1: ( rule__CompositeState__Group_8_0_1_0_2__0__Impl rule__CompositeState__Group_8_0_1_0_2__1 )
+            // InternalFormalML.g:23188:2: rule__CompositeState__Group_8_0_1_0_2__0__Impl rule__CompositeState__Group_8_0_1_0_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_86);
+            rule__CompositeState__Group_8_0_1_0_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group_8_0_1_0_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_0_2__0"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_0_2__0__Impl"
+    // InternalFormalML.g:23195:1: rule__CompositeState__Group_8_0_1_0_2__0__Impl : ( '@transition:' ) ;
+    public final void rule__CompositeState__Group_8_0_1_0_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23199:1: ( ( '@transition:' ) )
+            // InternalFormalML.g:23200:1: ( '@transition:' )
+            {
+            // InternalFormalML.g:23200:1: ( '@transition:' )
+            // InternalFormalML.g:23201:2: '@transition:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0()); 
+            }
+            match(input,223,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_0_2__0__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_0_2__1"
+    // InternalFormalML.g:23210:1: rule__CompositeState__Group_8_0_1_0_2__1 : rule__CompositeState__Group_8_0_1_0_2__1__Impl ;
+    public final void rule__CompositeState__Group_8_0_1_0_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23214:1: ( rule__CompositeState__Group_8_0_1_0_2__1__Impl )
+            // InternalFormalML.g:23215:2: rule__CompositeState__Group_8_0_1_0_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group_8_0_1_0_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_0_2__1"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_0_2__1__Impl"
+    // InternalFormalML.g:23221:1: rule__CompositeState__Group_8_0_1_0_2__1__Impl : ( ( rule__CompositeState__TransitionAssignment_8_0_1_0_2_1 )* ) ;
+    public final void rule__CompositeState__Group_8_0_1_0_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23225:1: ( ( ( rule__CompositeState__TransitionAssignment_8_0_1_0_2_1 )* ) )
+            // InternalFormalML.g:23226:1: ( ( rule__CompositeState__TransitionAssignment_8_0_1_0_2_1 )* )
+            {
+            // InternalFormalML.g:23226:1: ( ( rule__CompositeState__TransitionAssignment_8_0_1_0_2_1 )* )
+            // InternalFormalML.g:23227:2: ( rule__CompositeState__TransitionAssignment_8_0_1_0_2_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_0_2_1()); 
+            }
+            // InternalFormalML.g:23228:2: ( rule__CompositeState__TransitionAssignment_8_0_1_0_2_1 )*
+            loop407:
+            do {
+                int alt407=2;
+                int LA407_0 = input.LA(1);
+
+                if ( (LA407_0==239||LA407_0==281) ) {
+                    alt407=1;
+                }
+
+
+                switch (alt407) {
+            	case 1 :
+            	    // InternalFormalML.g:23228:3: rule__CompositeState__TransitionAssignment_8_0_1_0_2_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_87);
+            	    rule__CompositeState__TransitionAssignment_8_0_1_0_2_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop407;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getTransitionAssignment_8_0_1_0_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_0_2__1__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_1__0"
+    // InternalFormalML.g:23237:1: rule__CompositeState__Group_8_0_1_1__0 : rule__CompositeState__Group_8_0_1_1__0__Impl rule__CompositeState__Group_8_0_1_1__1 ;
+    public final void rule__CompositeState__Group_8_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23241:1: ( rule__CompositeState__Group_8_0_1_1__0__Impl rule__CompositeState__Group_8_0_1_1__1 )
+            // InternalFormalML.g:23242:2: rule__CompositeState__Group_8_0_1_1__0__Impl rule__CompositeState__Group_8_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_88);
+            rule__CompositeState__Group_8_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group_8_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_1__0"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_1__0__Impl"
+    // InternalFormalML.g:23249:1: rule__CompositeState__Group_8_0_1_1__0__Impl : ( ( rule__CompositeState__RegionAssignment_8_0_1_1_0 ) ) ;
+    public final void rule__CompositeState__Group_8_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23253:1: ( ( ( rule__CompositeState__RegionAssignment_8_0_1_1_0 ) ) )
+            // InternalFormalML.g:23254:1: ( ( rule__CompositeState__RegionAssignment_8_0_1_1_0 ) )
+            {
+            // InternalFormalML.g:23254:1: ( ( rule__CompositeState__RegionAssignment_8_0_1_1_0 ) )
+            // InternalFormalML.g:23255:2: ( rule__CompositeState__RegionAssignment_8_0_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_1_0()); 
+            }
+            // InternalFormalML.g:23256:2: ( rule__CompositeState__RegionAssignment_8_0_1_1_0 )
+            // InternalFormalML.g:23256:3: rule__CompositeState__RegionAssignment_8_0_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__RegionAssignment_8_0_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getRegionAssignment_8_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_1__1"
+    // InternalFormalML.g:23264:1: rule__CompositeState__Group_8_0_1_1__1 : rule__CompositeState__Group_8_0_1_1__1__Impl ;
+    public final void rule__CompositeState__Group_8_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23268:1: ( rule__CompositeState__Group_8_0_1_1__1__Impl )
+            // InternalFormalML.g:23269:2: rule__CompositeState__Group_8_0_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CompositeState__Group_8_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_1__1"
+
+
+    // $ANTLR start "rule__CompositeState__Group_8_0_1_1__1__Impl"
+    // InternalFormalML.g:23275:1: rule__CompositeState__Group_8_0_1_1__1__Impl : ( ( rule__CompositeState__Alternatives_8_0_1_1_1 )* ) ;
+    public final void rule__CompositeState__Group_8_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23279:1: ( ( ( rule__CompositeState__Alternatives_8_0_1_1_1 )* ) )
+            // InternalFormalML.g:23280:1: ( ( rule__CompositeState__Alternatives_8_0_1_1_1 )* )
+            {
+            // InternalFormalML.g:23280:1: ( ( rule__CompositeState__Alternatives_8_0_1_1_1 )* )
+            // InternalFormalML.g:23281:2: ( rule__CompositeState__Alternatives_8_0_1_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_1_1()); 
+            }
+            // InternalFormalML.g:23282:2: ( rule__CompositeState__Alternatives_8_0_1_1_1 )*
+            loop408:
+            do {
+                int alt408=2;
+                int LA408_0 = input.LA(1);
+
+                if ( ((LA408_0>=46 && LA408_0<=53)||LA408_0==239||LA408_0==281) ) {
+                    alt408=1;
+                }
+
+
+                switch (alt408) {
+            	case 1 :
+            	    // InternalFormalML.g:23282:3: rule__CompositeState__Alternatives_8_0_1_1_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_89);
+            	    rule__CompositeState__Alternatives_8_0_1_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop408;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getAlternatives_8_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__Group_8_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__MoeCompositeStateRoutines__Group__0"
+    // InternalFormalML.g:23291:1: rule__MoeCompositeStateRoutines__Group__0 : rule__MoeCompositeStateRoutines__Group__0__Impl rule__MoeCompositeStateRoutines__Group__1 ;
+    public final void rule__MoeCompositeStateRoutines__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23295:1: ( rule__MoeCompositeStateRoutines__Group__0__Impl rule__MoeCompositeStateRoutines__Group__1 )
+            // InternalFormalML.g:23296:2: rule__MoeCompositeStateRoutines__Group__0__Impl rule__MoeCompositeStateRoutines__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_84);
+            rule__MoeCompositeStateRoutines__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeCompositeStateRoutines__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeCompositeStateRoutines__Group__0"
+
+
+    // $ANTLR start "rule__MoeCompositeStateRoutines__Group__0__Impl"
+    // InternalFormalML.g:23303:1: rule__MoeCompositeStateRoutines__Group__0__Impl : ( () ) ;
+    public final void rule__MoeCompositeStateRoutines__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23307:1: ( ( () ) )
+            // InternalFormalML.g:23308:1: ( () )
+            {
+            // InternalFormalML.g:23308:1: ( () )
+            // InternalFormalML.g:23309:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeCompositeStateRoutinesAccess().getRoutineAction_0()); 
+            }
+            // InternalFormalML.g:23310:2: ()
+            // InternalFormalML.g:23310:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeCompositeStateRoutinesAccess().getRoutineAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeCompositeStateRoutines__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MoeCompositeStateRoutines__Group__1"
+    // InternalFormalML.g:23318:1: rule__MoeCompositeStateRoutines__Group__1 : rule__MoeCompositeStateRoutines__Group__1__Impl rule__MoeCompositeStateRoutines__Group__2 ;
+    public final void rule__MoeCompositeStateRoutines__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23322:1: ( rule__MoeCompositeStateRoutines__Group__1__Impl rule__MoeCompositeStateRoutines__Group__2 )
+            // InternalFormalML.g:23323:2: rule__MoeCompositeStateRoutines__Group__1__Impl rule__MoeCompositeStateRoutines__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__MoeCompositeStateRoutines__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeCompositeStateRoutines__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeCompositeStateRoutines__Group__1"
+
+
+    // $ANTLR start "rule__MoeCompositeStateRoutines__Group__1__Impl"
+    // InternalFormalML.g:23330:1: rule__MoeCompositeStateRoutines__Group__1__Impl : ( ( rule__MoeCompositeStateRoutines__NameAssignment_1 ) ) ;
+    public final void rule__MoeCompositeStateRoutines__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23334:1: ( ( ( rule__MoeCompositeStateRoutines__NameAssignment_1 ) ) )
+            // InternalFormalML.g:23335:1: ( ( rule__MoeCompositeStateRoutines__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:23335:1: ( ( rule__MoeCompositeStateRoutines__NameAssignment_1 ) )
+            // InternalFormalML.g:23336:2: ( rule__MoeCompositeStateRoutines__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:23337:2: ( rule__MoeCompositeStateRoutines__NameAssignment_1 )
+            // InternalFormalML.g:23337:3: rule__MoeCompositeStateRoutines__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeCompositeStateRoutines__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeCompositeStateRoutines__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MoeCompositeStateRoutines__Group__2"
+    // InternalFormalML.g:23345:1: rule__MoeCompositeStateRoutines__Group__2 : rule__MoeCompositeStateRoutines__Group__2__Impl ;
+    public final void rule__MoeCompositeStateRoutines__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23349:1: ( rule__MoeCompositeStateRoutines__Group__2__Impl )
+            // InternalFormalML.g:23350:2: rule__MoeCompositeStateRoutines__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeCompositeStateRoutines__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeCompositeStateRoutines__Group__2"
+
+
+    // $ANTLR start "rule__MoeCompositeStateRoutines__Group__2__Impl"
+    // InternalFormalML.g:23356:1: rule__MoeCompositeStateRoutines__Group__2__Impl : ( ( rule__MoeCompositeStateRoutines__BodyBlockAssignment_2 ) ) ;
+    public final void rule__MoeCompositeStateRoutines__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23360:1: ( ( ( rule__MoeCompositeStateRoutines__BodyBlockAssignment_2 ) ) )
+            // InternalFormalML.g:23361:1: ( ( rule__MoeCompositeStateRoutines__BodyBlockAssignment_2 ) )
+            {
+            // InternalFormalML.g:23361:1: ( ( rule__MoeCompositeStateRoutines__BodyBlockAssignment_2 ) )
+            // InternalFormalML.g:23362:2: ( rule__MoeCompositeStateRoutines__BodyBlockAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockAssignment_2()); 
+            }
+            // InternalFormalML.g:23363:2: ( rule__MoeCompositeStateRoutines__BodyBlockAssignment_2 )
+            // InternalFormalML.g:23363:3: rule__MoeCompositeStateRoutines__BodyBlockAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeCompositeStateRoutines__BodyBlockAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeCompositeStateRoutines__Group__2__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group__0"
+    // InternalFormalML.g:23372:1: rule__SimpleState__Group__0 : rule__SimpleState__Group__0__Impl rule__SimpleState__Group__1 ;
+    public final void rule__SimpleState__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23376:1: ( rule__SimpleState__Group__0__Impl rule__SimpleState__Group__1 )
+            // InternalFormalML.g:23377:2: rule__SimpleState__Group__0__Impl rule__SimpleState__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_81);
+            rule__SimpleState__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__0"
+
+
+    // $ANTLR start "rule__SimpleState__Group__0__Impl"
+    // InternalFormalML.g:23384:1: rule__SimpleState__Group__0__Impl : ( () ) ;
+    public final void rule__SimpleState__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23388:1: ( ( () ) )
+            // InternalFormalML.g:23389:1: ( () )
+            {
+            // InternalFormalML.g:23389:1: ( () )
+            // InternalFormalML.g:23390:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getStateAction_0()); 
+            }
+            // InternalFormalML.g:23391:2: ()
+            // InternalFormalML.g:23391:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getStateAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__0__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group__1"
+    // InternalFormalML.g:23399:1: rule__SimpleState__Group__1 : rule__SimpleState__Group__1__Impl rule__SimpleState__Group__2 ;
+    public final void rule__SimpleState__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23403:1: ( rule__SimpleState__Group__1__Impl rule__SimpleState__Group__2 )
+            // InternalFormalML.g:23404:2: rule__SimpleState__Group__1__Impl rule__SimpleState__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__SimpleState__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__1"
+
+
+    // $ANTLR start "rule__SimpleState__Group__1__Impl"
+    // InternalFormalML.g:23411:1: rule__SimpleState__Group__1__Impl : ( ( rule__SimpleState__SimpleAssignment_1 ) ) ;
+    public final void rule__SimpleState__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23415:1: ( ( ( rule__SimpleState__SimpleAssignment_1 ) ) )
+            // InternalFormalML.g:23416:1: ( ( rule__SimpleState__SimpleAssignment_1 ) )
+            {
+            // InternalFormalML.g:23416:1: ( ( rule__SimpleState__SimpleAssignment_1 ) )
+            // InternalFormalML.g:23417:2: ( rule__SimpleState__SimpleAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getSimpleAssignment_1()); 
+            }
+            // InternalFormalML.g:23418:2: ( rule__SimpleState__SimpleAssignment_1 )
+            // InternalFormalML.g:23418:3: rule__SimpleState__SimpleAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__SimpleAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getSimpleAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__1__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group__2"
+    // InternalFormalML.g:23426:1: rule__SimpleState__Group__2 : rule__SimpleState__Group__2__Impl rule__SimpleState__Group__3 ;
+    public final void rule__SimpleState__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23430:1: ( rule__SimpleState__Group__2__Impl rule__SimpleState__Group__3 )
+            // InternalFormalML.g:23431:2: rule__SimpleState__Group__2__Impl rule__SimpleState__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_29);
+            rule__SimpleState__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__2"
+
+
+    // $ANTLR start "rule__SimpleState__Group__2__Impl"
+    // InternalFormalML.g:23438:1: rule__SimpleState__Group__2__Impl : ( ( rule__SimpleState__Group_2__0 )? ) ;
+    public final void rule__SimpleState__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23442:1: ( ( ( rule__SimpleState__Group_2__0 )? ) )
+            // InternalFormalML.g:23443:1: ( ( rule__SimpleState__Group_2__0 )? )
+            {
+            // InternalFormalML.g:23443:1: ( ( rule__SimpleState__Group_2__0 )? )
+            // InternalFormalML.g:23444:2: ( rule__SimpleState__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:23445:2: ( rule__SimpleState__Group_2__0 )?
+            int alt409=2;
+            int LA409_0 = input.LA(1);
+
+            if ( (LA409_0==125) ) {
+                alt409=1;
+            }
+            switch (alt409) {
+                case 1 :
+                    // InternalFormalML.g:23445:3: rule__SimpleState__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SimpleState__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__2__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group__3"
+    // InternalFormalML.g:23453:1: rule__SimpleState__Group__3 : rule__SimpleState__Group__3__Impl rule__SimpleState__Group__4 ;
+    public final void rule__SimpleState__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23457:1: ( rule__SimpleState__Group__3__Impl rule__SimpleState__Group__4 )
+            // InternalFormalML.g:23458:2: rule__SimpleState__Group__3__Impl rule__SimpleState__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__SimpleState__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__3"
+
+
+    // $ANTLR start "rule__SimpleState__Group__3__Impl"
+    // InternalFormalML.g:23465:1: rule__SimpleState__Group__3__Impl : ( ( rule__SimpleState__NameAssignment_3 ) ) ;
+    public final void rule__SimpleState__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23469:1: ( ( ( rule__SimpleState__NameAssignment_3 ) ) )
+            // InternalFormalML.g:23470:1: ( ( rule__SimpleState__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:23470:1: ( ( rule__SimpleState__NameAssignment_3 ) )
+            // InternalFormalML.g:23471:2: ( rule__SimpleState__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:23472:2: ( rule__SimpleState__NameAssignment_3 )
+            // InternalFormalML.g:23472:3: rule__SimpleState__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__3__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group__4"
+    // InternalFormalML.g:23480:1: rule__SimpleState__Group__4 : rule__SimpleState__Group__4__Impl rule__SimpleState__Group__5 ;
+    public final void rule__SimpleState__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23484:1: ( rule__SimpleState__Group__4__Impl rule__SimpleState__Group__5 )
+            // InternalFormalML.g:23485:2: rule__SimpleState__Group__4__Impl rule__SimpleState__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__SimpleState__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__4"
+
+
+    // $ANTLR start "rule__SimpleState__Group__4__Impl"
+    // InternalFormalML.g:23492:1: rule__SimpleState__Group__4__Impl : ( ( rule__SimpleState__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__SimpleState__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23496:1: ( ( ( rule__SimpleState__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:23497:1: ( ( rule__SimpleState__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:23497:1: ( ( rule__SimpleState__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:23498:2: ( rule__SimpleState__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:23499:2: ( rule__SimpleState__UnrestrictedNameAssignment_4 )?
+            int alt410=2;
+            int LA410_0 = input.LA(1);
+
+            if ( (LA410_0==RULE_STRING) ) {
+                alt410=1;
+            }
+            switch (alt410) {
+                case 1 :
+                    // InternalFormalML.g:23499:3: rule__SimpleState__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SimpleState__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__4__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group__5"
+    // InternalFormalML.g:23507:1: rule__SimpleState__Group__5 : rule__SimpleState__Group__5__Impl ;
+    public final void rule__SimpleState__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23511:1: ( rule__SimpleState__Group__5__Impl )
+            // InternalFormalML.g:23512:2: rule__SimpleState__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__5"
+
+
+    // $ANTLR start "rule__SimpleState__Group__5__Impl"
+    // InternalFormalML.g:23518:1: rule__SimpleState__Group__5__Impl : ( ( rule__SimpleState__Alternatives_5 ) ) ;
+    public final void rule__SimpleState__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23522:1: ( ( ( rule__SimpleState__Alternatives_5 ) ) )
+            // InternalFormalML.g:23523:1: ( ( rule__SimpleState__Alternatives_5 ) )
+            {
+            // InternalFormalML.g:23523:1: ( ( rule__SimpleState__Alternatives_5 ) )
+            // InternalFormalML.g:23524:2: ( rule__SimpleState__Alternatives_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getAlternatives_5()); 
+            }
+            // InternalFormalML.g:23525:2: ( rule__SimpleState__Alternatives_5 )
+            // InternalFormalML.g:23525:3: rule__SimpleState__Alternatives_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Alternatives_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getAlternatives_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group__5__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group_2__0"
+    // InternalFormalML.g:23534:1: rule__SimpleState__Group_2__0 : rule__SimpleState__Group_2__0__Impl rule__SimpleState__Group_2__1 ;
+    public final void rule__SimpleState__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23538:1: ( rule__SimpleState__Group_2__0__Impl rule__SimpleState__Group_2__1 )
+            // InternalFormalML.g:23539:2: rule__SimpleState__Group_2__0__Impl rule__SimpleState__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_90);
+            rule__SimpleState__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_2__0"
+
+
+    // $ANTLR start "rule__SimpleState__Group_2__0__Impl"
+    // InternalFormalML.g:23546:1: rule__SimpleState__Group_2__0__Impl : ( '<' ) ;
+    public final void rule__SimpleState__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23550:1: ( ( '<' ) )
+            // InternalFormalML.g:23551:1: ( '<' )
+            {
+            // InternalFormalML.g:23551:1: ( '<' )
+            // InternalFormalML.g:23552:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getLessThanSignKeyword_2_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getLessThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group_2__1"
+    // InternalFormalML.g:23561:1: rule__SimpleState__Group_2__1 : rule__SimpleState__Group_2__1__Impl rule__SimpleState__Group_2__2 ;
+    public final void rule__SimpleState__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23565:1: ( rule__SimpleState__Group_2__1__Impl rule__SimpleState__Group_2__2 )
+            // InternalFormalML.g:23566:2: rule__SimpleState__Group_2__1__Impl rule__SimpleState__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_90);
+            rule__SimpleState__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_2__1"
+
+
+    // $ANTLR start "rule__SimpleState__Group_2__1__Impl"
+    // InternalFormalML.g:23573:1: rule__SimpleState__Group_2__1__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__SimpleState__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23577:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:23578:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:23578:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:23579:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getMocKeyword_2_1()); 
+            }
+            // InternalFormalML.g:23580:2: ( 'moc:' )?
+            int alt411=2;
+            int LA411_0 = input.LA(1);
+
+            if ( (LA411_0==201) ) {
+                alt411=1;
+            }
+            switch (alt411) {
+                case 1 :
+                    // InternalFormalML.g:23580:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getMocKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group_2__2"
+    // InternalFormalML.g:23588:1: rule__SimpleState__Group_2__2 : rule__SimpleState__Group_2__2__Impl rule__SimpleState__Group_2__3 ;
+    public final void rule__SimpleState__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23592:1: ( rule__SimpleState__Group_2__2__Impl rule__SimpleState__Group_2__3 )
+            // InternalFormalML.g:23593:2: rule__SimpleState__Group_2__2__Impl rule__SimpleState__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__SimpleState__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_2__2"
+
+
+    // $ANTLR start "rule__SimpleState__Group_2__2__Impl"
+    // InternalFormalML.g:23600:1: rule__SimpleState__Group_2__2__Impl : ( 'simple' ) ;
+    public final void rule__SimpleState__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23604:1: ( ( 'simple' ) )
+            // InternalFormalML.g:23605:1: ( 'simple' )
+            {
+            // InternalFormalML.g:23605:1: ( 'simple' )
+            // InternalFormalML.g:23606:2: 'simple'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getSimpleKeyword_2_2()); 
+            }
+            match(input,177,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getSimpleKeyword_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group_2__3"
+    // InternalFormalML.g:23615:1: rule__SimpleState__Group_2__3 : rule__SimpleState__Group_2__3__Impl ;
+    public final void rule__SimpleState__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23619:1: ( rule__SimpleState__Group_2__3__Impl )
+            // InternalFormalML.g:23620:2: rule__SimpleState__Group_2__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_2__3"
+
+
+    // $ANTLR start "rule__SimpleState__Group_2__3__Impl"
+    // InternalFormalML.g:23626:1: rule__SimpleState__Group_2__3__Impl : ( '>' ) ;
+    public final void rule__SimpleState__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23630:1: ( ( '>' ) )
+            // InternalFormalML.g:23631:1: ( '>' )
+            {
+            // InternalFormalML.g:23631:1: ( '>' )
+            // InternalFormalML.g:23632:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getGreaterThanSignKeyword_2_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getGreaterThanSignKeyword_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group_5_0__0"
+    // InternalFormalML.g:23642:1: rule__SimpleState__Group_5_0__0 : rule__SimpleState__Group_5_0__0__Impl rule__SimpleState__Group_5_0__1 ;
+    public final void rule__SimpleState__Group_5_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23646:1: ( rule__SimpleState__Group_5_0__0__Impl rule__SimpleState__Group_5_0__1 )
+            // InternalFormalML.g:23647:2: rule__SimpleState__Group_5_0__0__Impl rule__SimpleState__Group_5_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_91);
+            rule__SimpleState__Group_5_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group_5_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_5_0__0"
+
+
+    // $ANTLR start "rule__SimpleState__Group_5_0__0__Impl"
+    // InternalFormalML.g:23654:1: rule__SimpleState__Group_5_0__0__Impl : ( '{' ) ;
+    public final void rule__SimpleState__Group_5_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23658:1: ( ( '{' ) )
+            // InternalFormalML.g:23659:1: ( '{' )
+            {
+            // InternalFormalML.g:23659:1: ( '{' )
+            // InternalFormalML.g:23660:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getLeftCurlyBracketKeyword_5_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getLeftCurlyBracketKeyword_5_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_5_0__0__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group_5_0__1"
+    // InternalFormalML.g:23669:1: rule__SimpleState__Group_5_0__1 : rule__SimpleState__Group_5_0__1__Impl rule__SimpleState__Group_5_0__2 ;
+    public final void rule__SimpleState__Group_5_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23673:1: ( rule__SimpleState__Group_5_0__1__Impl rule__SimpleState__Group_5_0__2 )
+            // InternalFormalML.g:23674:2: rule__SimpleState__Group_5_0__1__Impl rule__SimpleState__Group_5_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_91);
+            rule__SimpleState__Group_5_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group_5_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_5_0__1"
+
+
+    // $ANTLR start "rule__SimpleState__Group_5_0__1__Impl"
+    // InternalFormalML.g:23681:1: rule__SimpleState__Group_5_0__1__Impl : ( ( rule__SimpleState__Alternatives_5_0_1 )* ) ;
+    public final void rule__SimpleState__Group_5_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23685:1: ( ( ( rule__SimpleState__Alternatives_5_0_1 )* ) )
+            // InternalFormalML.g:23686:1: ( ( rule__SimpleState__Alternatives_5_0_1 )* )
+            {
+            // InternalFormalML.g:23686:1: ( ( rule__SimpleState__Alternatives_5_0_1 )* )
+            // InternalFormalML.g:23687:2: ( rule__SimpleState__Alternatives_5_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getAlternatives_5_0_1()); 
+            }
+            // InternalFormalML.g:23688:2: ( rule__SimpleState__Alternatives_5_0_1 )*
+            loop412:
+            do {
+                int alt412=2;
+                int LA412_0 = input.LA(1);
+
+                if ( ((LA412_0>=48 && LA412_0<=49)||LA412_0==52||LA412_0==239||LA412_0==281) ) {
+                    alt412=1;
+                }
+
+
+                switch (alt412) {
+            	case 1 :
+            	    // InternalFormalML.g:23688:3: rule__SimpleState__Alternatives_5_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_92);
+            	    rule__SimpleState__Alternatives_5_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop412;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getAlternatives_5_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_5_0__1__Impl"
+
+
+    // $ANTLR start "rule__SimpleState__Group_5_0__2"
+    // InternalFormalML.g:23696:1: rule__SimpleState__Group_5_0__2 : rule__SimpleState__Group_5_0__2__Impl ;
+    public final void rule__SimpleState__Group_5_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23700:1: ( rule__SimpleState__Group_5_0__2__Impl )
+            // InternalFormalML.g:23701:2: rule__SimpleState__Group_5_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SimpleState__Group_5_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_5_0__2"
+
+
+    // $ANTLR start "rule__SimpleState__Group_5_0__2__Impl"
+    // InternalFormalML.g:23707:1: rule__SimpleState__Group_5_0__2__Impl : ( '}' ) ;
+    public final void rule__SimpleState__Group_5_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23711:1: ( ( '}' ) )
+            // InternalFormalML.g:23712:1: ( '}' )
+            {
+            // InternalFormalML.g:23712:1: ( '}' )
+            // InternalFormalML.g:23713:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getRightCurlyBracketKeyword_5_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getRightCurlyBracketKeyword_5_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__Group_5_0__2__Impl"
+
+
+    // $ANTLR start "rule__MoeSimpleStateRoutines__Group__0"
+    // InternalFormalML.g:23723:1: rule__MoeSimpleStateRoutines__Group__0 : rule__MoeSimpleStateRoutines__Group__0__Impl rule__MoeSimpleStateRoutines__Group__1 ;
+    public final void rule__MoeSimpleStateRoutines__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23727:1: ( rule__MoeSimpleStateRoutines__Group__0__Impl rule__MoeSimpleStateRoutines__Group__1 )
+            // InternalFormalML.g:23728:2: rule__MoeSimpleStateRoutines__Group__0__Impl rule__MoeSimpleStateRoutines__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_93);
+            rule__MoeSimpleStateRoutines__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeSimpleStateRoutines__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeSimpleStateRoutines__Group__0"
+
+
+    // $ANTLR start "rule__MoeSimpleStateRoutines__Group__0__Impl"
+    // InternalFormalML.g:23735:1: rule__MoeSimpleStateRoutines__Group__0__Impl : ( () ) ;
+    public final void rule__MoeSimpleStateRoutines__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23739:1: ( ( () ) )
+            // InternalFormalML.g:23740:1: ( () )
+            {
+            // InternalFormalML.g:23740:1: ( () )
+            // InternalFormalML.g:23741:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeSimpleStateRoutinesAccess().getRoutineAction_0()); 
+            }
+            // InternalFormalML.g:23742:2: ()
+            // InternalFormalML.g:23742:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeSimpleStateRoutinesAccess().getRoutineAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeSimpleStateRoutines__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MoeSimpleStateRoutines__Group__1"
+    // InternalFormalML.g:23750:1: rule__MoeSimpleStateRoutines__Group__1 : rule__MoeSimpleStateRoutines__Group__1__Impl rule__MoeSimpleStateRoutines__Group__2 ;
+    public final void rule__MoeSimpleStateRoutines__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23754:1: ( rule__MoeSimpleStateRoutines__Group__1__Impl rule__MoeSimpleStateRoutines__Group__2 )
+            // InternalFormalML.g:23755:2: rule__MoeSimpleStateRoutines__Group__1__Impl rule__MoeSimpleStateRoutines__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__MoeSimpleStateRoutines__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeSimpleStateRoutines__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeSimpleStateRoutines__Group__1"
+
+
+    // $ANTLR start "rule__MoeSimpleStateRoutines__Group__1__Impl"
+    // InternalFormalML.g:23762:1: rule__MoeSimpleStateRoutines__Group__1__Impl : ( ( rule__MoeSimpleStateRoutines__NameAssignment_1 ) ) ;
+    public final void rule__MoeSimpleStateRoutines__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23766:1: ( ( ( rule__MoeSimpleStateRoutines__NameAssignment_1 ) ) )
+            // InternalFormalML.g:23767:1: ( ( rule__MoeSimpleStateRoutines__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:23767:1: ( ( rule__MoeSimpleStateRoutines__NameAssignment_1 ) )
+            // InternalFormalML.g:23768:2: ( rule__MoeSimpleStateRoutines__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:23769:2: ( rule__MoeSimpleStateRoutines__NameAssignment_1 )
+            // InternalFormalML.g:23769:3: rule__MoeSimpleStateRoutines__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeSimpleStateRoutines__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeSimpleStateRoutines__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MoeSimpleStateRoutines__Group__2"
+    // InternalFormalML.g:23777:1: rule__MoeSimpleStateRoutines__Group__2 : rule__MoeSimpleStateRoutines__Group__2__Impl ;
+    public final void rule__MoeSimpleStateRoutines__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23781:1: ( rule__MoeSimpleStateRoutines__Group__2__Impl )
+            // InternalFormalML.g:23782:2: rule__MoeSimpleStateRoutines__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeSimpleStateRoutines__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeSimpleStateRoutines__Group__2"
+
+
+    // $ANTLR start "rule__MoeSimpleStateRoutines__Group__2__Impl"
+    // InternalFormalML.g:23788:1: rule__MoeSimpleStateRoutines__Group__2__Impl : ( ( rule__MoeSimpleStateRoutines__BodyBlockAssignment_2 ) ) ;
+    public final void rule__MoeSimpleStateRoutines__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23792:1: ( ( ( rule__MoeSimpleStateRoutines__BodyBlockAssignment_2 ) ) )
+            // InternalFormalML.g:23793:1: ( ( rule__MoeSimpleStateRoutines__BodyBlockAssignment_2 ) )
+            {
+            // InternalFormalML.g:23793:1: ( ( rule__MoeSimpleStateRoutines__BodyBlockAssignment_2 ) )
+            // InternalFormalML.g:23794:2: ( rule__MoeSimpleStateRoutines__BodyBlockAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockAssignment_2()); 
+            }
+            // InternalFormalML.g:23795:2: ( rule__MoeSimpleStateRoutines__BodyBlockAssignment_2 )
+            // InternalFormalML.g:23795:3: rule__MoeSimpleStateRoutines__BodyBlockAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeSimpleStateRoutines__BodyBlockAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeSimpleStateRoutines__Group__2__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group__0"
+    // InternalFormalML.g:23804:1: rule__StartState__Group__0 : rule__StartState__Group__0__Impl rule__StartState__Group__1 ;
+    public final void rule__StartState__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23808:1: ( rule__StartState__Group__0__Impl rule__StartState__Group__1 )
+            // InternalFormalML.g:23809:2: rule__StartState__Group__0__Impl rule__StartState__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_94);
+            rule__StartState__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group__0"
+
+
+    // $ANTLR start "rule__StartState__Group__0__Impl"
+    // InternalFormalML.g:23816:1: rule__StartState__Group__0__Impl : ( () ) ;
+    public final void rule__StartState__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23820:1: ( ( () ) )
+            // InternalFormalML.g:23821:1: ( () )
+            {
+            // InternalFormalML.g:23821:1: ( () )
+            // InternalFormalML.g:23822:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getStartStateAction_0()); 
+            }
+            // InternalFormalML.g:23823:2: ()
+            // InternalFormalML.g:23823:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getStartStateAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group__0__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group__1"
+    // InternalFormalML.g:23831:1: rule__StartState__Group__1 : rule__StartState__Group__1__Impl rule__StartState__Group__2 ;
+    public final void rule__StartState__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23835:1: ( rule__StartState__Group__1__Impl rule__StartState__Group__2 )
+            // InternalFormalML.g:23836:2: rule__StartState__Group__1__Impl rule__StartState__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__StartState__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group__1"
+
+
+    // $ANTLR start "rule__StartState__Group__1__Impl"
+    // InternalFormalML.g:23843:1: rule__StartState__Group__1__Impl : ( ( rule__StartState__Alternatives_1 ) ) ;
+    public final void rule__StartState__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23847:1: ( ( ( rule__StartState__Alternatives_1 ) ) )
+            // InternalFormalML.g:23848:1: ( ( rule__StartState__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:23848:1: ( ( rule__StartState__Alternatives_1 ) )
+            // InternalFormalML.g:23849:2: ( rule__StartState__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:23850:2: ( rule__StartState__Alternatives_1 )
+            // InternalFormalML.g:23850:3: rule__StartState__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group__1__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group__2"
+    // InternalFormalML.g:23858:1: rule__StartState__Group__2 : rule__StartState__Group__2__Impl rule__StartState__Group__3 ;
+    public final void rule__StartState__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23862:1: ( rule__StartState__Group__2__Impl rule__StartState__Group__3 )
+            // InternalFormalML.g:23863:2: rule__StartState__Group__2__Impl rule__StartState__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__StartState__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group__2"
+
+
+    // $ANTLR start "rule__StartState__Group__2__Impl"
+    // InternalFormalML.g:23870:1: rule__StartState__Group__2__Impl : ( ( rule__StartState__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__StartState__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23874:1: ( ( ( rule__StartState__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:23875:1: ( ( rule__StartState__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:23875:1: ( ( rule__StartState__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:23876:2: ( rule__StartState__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:23877:2: ( rule__StartState__UnrestrictedNameAssignment_2 )?
+            int alt413=2;
+            int LA413_0 = input.LA(1);
+
+            if ( (LA413_0==RULE_STRING) ) {
+                alt413=1;
+            }
+            switch (alt413) {
+                case 1 :
+                    // InternalFormalML.g:23877:3: rule__StartState__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StartState__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group__2__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group__3"
+    // InternalFormalML.g:23885:1: rule__StartState__Group__3 : rule__StartState__Group__3__Impl ;
+    public final void rule__StartState__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23889:1: ( rule__StartState__Group__3__Impl )
+            // InternalFormalML.g:23890:2: rule__StartState__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group__3"
+
+
+    // $ANTLR start "rule__StartState__Group__3__Impl"
+    // InternalFormalML.g:23896:1: rule__StartState__Group__3__Impl : ( ( rule__StartState__Alternatives_3 ) ) ;
+    public final void rule__StartState__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23900:1: ( ( ( rule__StartState__Alternatives_3 ) ) )
+            // InternalFormalML.g:23901:1: ( ( rule__StartState__Alternatives_3 ) )
+            {
+            // InternalFormalML.g:23901:1: ( ( rule__StartState__Alternatives_3 ) )
+            // InternalFormalML.g:23902:2: ( rule__StartState__Alternatives_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:23903:2: ( rule__StartState__Alternatives_3 )
+            // InternalFormalML.g:23903:3: rule__StartState__Alternatives_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Alternatives_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group__3__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__0"
+    // InternalFormalML.g:23912:1: rule__StartState__Group_1_0__0 : rule__StartState__Group_1_0__0__Impl rule__StartState__Group_1_0__1 ;
+    public final void rule__StartState__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23916:1: ( rule__StartState__Group_1_0__0__Impl rule__StartState__Group_1_0__1 )
+            // InternalFormalML.g:23917:2: rule__StartState__Group_1_0__0__Impl rule__StartState__Group_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__StartState__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__0"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__0__Impl"
+    // InternalFormalML.g:23924:1: rule__StartState__Group_1_0__0__Impl : ( ( rule__StartState__SimpleAssignment_1_0_0 ) ) ;
+    public final void rule__StartState__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23928:1: ( ( ( rule__StartState__SimpleAssignment_1_0_0 ) ) )
+            // InternalFormalML.g:23929:1: ( ( rule__StartState__SimpleAssignment_1_0_0 ) )
+            {
+            // InternalFormalML.g:23929:1: ( ( rule__StartState__SimpleAssignment_1_0_0 ) )
+            // InternalFormalML.g:23930:2: ( rule__StartState__SimpleAssignment_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getSimpleAssignment_1_0_0()); 
+            }
+            // InternalFormalML.g:23931:2: ( rule__StartState__SimpleAssignment_1_0_0 )
+            // InternalFormalML.g:23931:3: rule__StartState__SimpleAssignment_1_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__SimpleAssignment_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getSimpleAssignment_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__1"
+    // InternalFormalML.g:23939:1: rule__StartState__Group_1_0__1 : rule__StartState__Group_1_0__1__Impl rule__StartState__Group_1_0__2 ;
+    public final void rule__StartState__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23943:1: ( rule__StartState__Group_1_0__1__Impl rule__StartState__Group_1_0__2 )
+            // InternalFormalML.g:23944:2: rule__StartState__Group_1_0__1__Impl rule__StartState__Group_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_95);
+            rule__StartState__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__1"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__1__Impl"
+    // InternalFormalML.g:23951:1: rule__StartState__Group_1_0__1__Impl : ( '<' ) ;
+    public final void rule__StartState__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23955:1: ( ( '<' ) )
+            // InternalFormalML.g:23956:1: ( '<' )
+            {
+            // InternalFormalML.g:23956:1: ( '<' )
+            // InternalFormalML.g:23957:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getLessThanSignKeyword_1_0_1()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getLessThanSignKeyword_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__2"
+    // InternalFormalML.g:23966:1: rule__StartState__Group_1_0__2 : rule__StartState__Group_1_0__2__Impl rule__StartState__Group_1_0__3 ;
+    public final void rule__StartState__Group_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23970:1: ( rule__StartState__Group_1_0__2__Impl rule__StartState__Group_1_0__3 )
+            // InternalFormalML.g:23971:2: rule__StartState__Group_1_0__2__Impl rule__StartState__Group_1_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_95);
+            rule__StartState__Group_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group_1_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__2"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__2__Impl"
+    // InternalFormalML.g:23978:1: rule__StartState__Group_1_0__2__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__StartState__Group_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23982:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:23983:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:23983:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:23984:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getMocKeyword_1_0_2()); 
+            }
+            // InternalFormalML.g:23985:2: ( 'moc:' )?
+            int alt414=2;
+            int LA414_0 = input.LA(1);
+
+            if ( (LA414_0==201) ) {
+                alt414=1;
+            }
+            switch (alt414) {
+                case 1 :
+                    // InternalFormalML.g:23985:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getMocKeyword_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__3"
+    // InternalFormalML.g:23993:1: rule__StartState__Group_1_0__3 : rule__StartState__Group_1_0__3__Impl rule__StartState__Group_1_0__4 ;
+    public final void rule__StartState__Group_1_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:23997:1: ( rule__StartState__Group_1_0__3__Impl rule__StartState__Group_1_0__4 )
+            // InternalFormalML.g:23998:2: rule__StartState__Group_1_0__3__Impl rule__StartState__Group_1_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__StartState__Group_1_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group_1_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__3"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__3__Impl"
+    // InternalFormalML.g:24005:1: rule__StartState__Group_1_0__3__Impl : ( 'start' ) ;
+    public final void rule__StartState__Group_1_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24009:1: ( ( 'start' ) )
+            // InternalFormalML.g:24010:1: ( 'start' )
+            {
+            // InternalFormalML.g:24010:1: ( 'start' )
+            // InternalFormalML.g:24011:2: 'start'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getStartKeyword_1_0_3()); 
+            }
+            match(input,185,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getStartKeyword_1_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__3__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__4"
+    // InternalFormalML.g:24020:1: rule__StartState__Group_1_0__4 : rule__StartState__Group_1_0__4__Impl rule__StartState__Group_1_0__5 ;
+    public final void rule__StartState__Group_1_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24024:1: ( rule__StartState__Group_1_0__4__Impl rule__StartState__Group_1_0__5 )
+            // InternalFormalML.g:24025:2: rule__StartState__Group_1_0__4__Impl rule__StartState__Group_1_0__5
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__StartState__Group_1_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group_1_0__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__4"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__4__Impl"
+    // InternalFormalML.g:24032:1: rule__StartState__Group_1_0__4__Impl : ( '>' ) ;
+    public final void rule__StartState__Group_1_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24036:1: ( ( '>' ) )
+            // InternalFormalML.g:24037:1: ( '>' )
+            {
+            // InternalFormalML.g:24037:1: ( '>' )
+            // InternalFormalML.g:24038:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getGreaterThanSignKeyword_1_0_4()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getGreaterThanSignKeyword_1_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__4__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__5"
+    // InternalFormalML.g:24047:1: rule__StartState__Group_1_0__5 : rule__StartState__Group_1_0__5__Impl ;
+    public final void rule__StartState__Group_1_0__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24051:1: ( rule__StartState__Group_1_0__5__Impl )
+            // InternalFormalML.g:24052:2: rule__StartState__Group_1_0__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group_1_0__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__5"
+
+
+    // $ANTLR start "rule__StartState__Group_1_0__5__Impl"
+    // InternalFormalML.g:24058:1: rule__StartState__Group_1_0__5__Impl : ( ( rule__StartState__NameAssignment_1_0_5 ) ) ;
+    public final void rule__StartState__Group_1_0__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24062:1: ( ( ( rule__StartState__NameAssignment_1_0_5 ) ) )
+            // InternalFormalML.g:24063:1: ( ( rule__StartState__NameAssignment_1_0_5 ) )
+            {
+            // InternalFormalML.g:24063:1: ( ( rule__StartState__NameAssignment_1_0_5 ) )
+            // InternalFormalML.g:24064:2: ( rule__StartState__NameAssignment_1_0_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getNameAssignment_1_0_5()); 
+            }
+            // InternalFormalML.g:24065:2: ( rule__StartState__NameAssignment_1_0_5 )
+            // InternalFormalML.g:24065:3: rule__StartState__NameAssignment_1_0_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__NameAssignment_1_0_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getNameAssignment_1_0_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_1_0__5__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group_3_0__0"
+    // InternalFormalML.g:24074:1: rule__StartState__Group_3_0__0 : rule__StartState__Group_3_0__0__Impl rule__StartState__Group_3_0__1 ;
+    public final void rule__StartState__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24078:1: ( rule__StartState__Group_3_0__0__Impl rule__StartState__Group_3_0__1 )
+            // InternalFormalML.g:24079:2: rule__StartState__Group_3_0__0__Impl rule__StartState__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_96);
+            rule__StartState__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_3_0__0"
+
+
+    // $ANTLR start "rule__StartState__Group_3_0__0__Impl"
+    // InternalFormalML.g:24086:1: rule__StartState__Group_3_0__0__Impl : ( '{' ) ;
+    public final void rule__StartState__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24090:1: ( ( '{' ) )
+            // InternalFormalML.g:24091:1: ( '{' )
+            {
+            // InternalFormalML.g:24091:1: ( '{' )
+            // InternalFormalML.g:24092:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getLeftCurlyBracketKeyword_3_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getLeftCurlyBracketKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group_3_0__1"
+    // InternalFormalML.g:24101:1: rule__StartState__Group_3_0__1 : rule__StartState__Group_3_0__1__Impl rule__StartState__Group_3_0__2 ;
+    public final void rule__StartState__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24105:1: ( rule__StartState__Group_3_0__1__Impl rule__StartState__Group_3_0__2 )
+            // InternalFormalML.g:24106:2: rule__StartState__Group_3_0__1__Impl rule__StartState__Group_3_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_96);
+            rule__StartState__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group_3_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_3_0__1"
+
+
+    // $ANTLR start "rule__StartState__Group_3_0__1__Impl"
+    // InternalFormalML.g:24113:1: rule__StartState__Group_3_0__1__Impl : ( ( rule__StartState__Alternatives_3_0_1 )* ) ;
+    public final void rule__StartState__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24117:1: ( ( ( rule__StartState__Alternatives_3_0_1 )* ) )
+            // InternalFormalML.g:24118:1: ( ( rule__StartState__Alternatives_3_0_1 )* )
+            {
+            // InternalFormalML.g:24118:1: ( ( rule__StartState__Alternatives_3_0_1 )* )
+            // InternalFormalML.g:24119:2: ( rule__StartState__Alternatives_3_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getAlternatives_3_0_1()); 
+            }
+            // InternalFormalML.g:24120:2: ( rule__StartState__Alternatives_3_0_1 )*
+            loop415:
+            do {
+                int alt415=2;
+                int LA415_0 = input.LA(1);
+
+                if ( (LA415_0==46||(LA415_0>=48 && LA415_0<=49)||LA415_0==52||LA415_0==239||LA415_0==281) ) {
+                    alt415=1;
+                }
+
+
+                switch (alt415) {
+            	case 1 :
+            	    // InternalFormalML.g:24120:3: rule__StartState__Alternatives_3_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    rule__StartState__Alternatives_3_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop415;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getAlternatives_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__StartState__Group_3_0__2"
+    // InternalFormalML.g:24128:1: rule__StartState__Group_3_0__2 : rule__StartState__Group_3_0__2__Impl ;
+    public final void rule__StartState__Group_3_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24132:1: ( rule__StartState__Group_3_0__2__Impl )
+            // InternalFormalML.g:24133:2: rule__StartState__Group_3_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StartState__Group_3_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_3_0__2"
+
+
+    // $ANTLR start "rule__StartState__Group_3_0__2__Impl"
+    // InternalFormalML.g:24139:1: rule__StartState__Group_3_0__2__Impl : ( '}' ) ;
+    public final void rule__StartState__Group_3_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24143:1: ( ( '}' ) )
+            // InternalFormalML.g:24144:1: ( '}' )
+            {
+            // InternalFormalML.g:24144:1: ( '}' )
+            // InternalFormalML.g:24145:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getRightCurlyBracketKeyword_3_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getRightCurlyBracketKeyword_3_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__Group_3_0__2__Impl"
+
+
+    // $ANTLR start "rule__MoeStartStateRoutines__Group__0"
+    // InternalFormalML.g:24155:1: rule__MoeStartStateRoutines__Group__0 : rule__MoeStartStateRoutines__Group__0__Impl rule__MoeStartStateRoutines__Group__1 ;
+    public final void rule__MoeStartStateRoutines__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24159:1: ( rule__MoeStartStateRoutines__Group__0__Impl rule__MoeStartStateRoutines__Group__1 )
+            // InternalFormalML.g:24160:2: rule__MoeStartStateRoutines__Group__0__Impl rule__MoeStartStateRoutines__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_98);
+            rule__MoeStartStateRoutines__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeStartStateRoutines__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeStartStateRoutines__Group__0"
+
+
+    // $ANTLR start "rule__MoeStartStateRoutines__Group__0__Impl"
+    // InternalFormalML.g:24167:1: rule__MoeStartStateRoutines__Group__0__Impl : ( () ) ;
+    public final void rule__MoeStartStateRoutines__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24171:1: ( ( () ) )
+            // InternalFormalML.g:24172:1: ( () )
+            {
+            // InternalFormalML.g:24172:1: ( () )
+            // InternalFormalML.g:24173:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeStartStateRoutinesAccess().getRoutineAction_0()); 
+            }
+            // InternalFormalML.g:24174:2: ()
+            // InternalFormalML.g:24174:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeStartStateRoutinesAccess().getRoutineAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeStartStateRoutines__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MoeStartStateRoutines__Group__1"
+    // InternalFormalML.g:24182:1: rule__MoeStartStateRoutines__Group__1 : rule__MoeStartStateRoutines__Group__1__Impl rule__MoeStartStateRoutines__Group__2 ;
+    public final void rule__MoeStartStateRoutines__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24186:1: ( rule__MoeStartStateRoutines__Group__1__Impl rule__MoeStartStateRoutines__Group__2 )
+            // InternalFormalML.g:24187:2: rule__MoeStartStateRoutines__Group__1__Impl rule__MoeStartStateRoutines__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__MoeStartStateRoutines__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeStartStateRoutines__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeStartStateRoutines__Group__1"
+
+
+    // $ANTLR start "rule__MoeStartStateRoutines__Group__1__Impl"
+    // InternalFormalML.g:24194:1: rule__MoeStartStateRoutines__Group__1__Impl : ( ( rule__MoeStartStateRoutines__NameAssignment_1 ) ) ;
+    public final void rule__MoeStartStateRoutines__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24198:1: ( ( ( rule__MoeStartStateRoutines__NameAssignment_1 ) ) )
+            // InternalFormalML.g:24199:1: ( ( rule__MoeStartStateRoutines__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:24199:1: ( ( rule__MoeStartStateRoutines__NameAssignment_1 ) )
+            // InternalFormalML.g:24200:2: ( rule__MoeStartStateRoutines__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeStartStateRoutinesAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:24201:2: ( rule__MoeStartStateRoutines__NameAssignment_1 )
+            // InternalFormalML.g:24201:3: rule__MoeStartStateRoutines__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeStartStateRoutines__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeStartStateRoutinesAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeStartStateRoutines__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MoeStartStateRoutines__Group__2"
+    // InternalFormalML.g:24209:1: rule__MoeStartStateRoutines__Group__2 : rule__MoeStartStateRoutines__Group__2__Impl ;
+    public final void rule__MoeStartStateRoutines__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24213:1: ( rule__MoeStartStateRoutines__Group__2__Impl )
+            // InternalFormalML.g:24214:2: rule__MoeStartStateRoutines__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeStartStateRoutines__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeStartStateRoutines__Group__2"
+
+
+    // $ANTLR start "rule__MoeStartStateRoutines__Group__2__Impl"
+    // InternalFormalML.g:24220:1: rule__MoeStartStateRoutines__Group__2__Impl : ( ( rule__MoeStartStateRoutines__BodyBlockAssignment_2 ) ) ;
+    public final void rule__MoeStartStateRoutines__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24224:1: ( ( ( rule__MoeStartStateRoutines__BodyBlockAssignment_2 ) ) )
+            // InternalFormalML.g:24225:1: ( ( rule__MoeStartStateRoutines__BodyBlockAssignment_2 ) )
+            {
+            // InternalFormalML.g:24225:1: ( ( rule__MoeStartStateRoutines__BodyBlockAssignment_2 ) )
+            // InternalFormalML.g:24226:2: ( rule__MoeStartStateRoutines__BodyBlockAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockAssignment_2()); 
+            }
+            // InternalFormalML.g:24227:2: ( rule__MoeStartStateRoutines__BodyBlockAssignment_2 )
+            // InternalFormalML.g:24227:3: rule__MoeStartStateRoutines__BodyBlockAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeStartStateRoutines__BodyBlockAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeStartStateRoutines__Group__2__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group__0"
+    // InternalFormalML.g:24236:1: rule__FinalState__Group__0 : rule__FinalState__Group__0__Impl rule__FinalState__Group__1 ;
+    public final void rule__FinalState__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24240:1: ( rule__FinalState__Group__0__Impl rule__FinalState__Group__1 )
+            // InternalFormalML.g:24241:2: rule__FinalState__Group__0__Impl rule__FinalState__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_99);
+            rule__FinalState__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group__0"
+
+
+    // $ANTLR start "rule__FinalState__Group__0__Impl"
+    // InternalFormalML.g:24248:1: rule__FinalState__Group__0__Impl : ( () ) ;
+    public final void rule__FinalState__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24252:1: ( ( () ) )
+            // InternalFormalML.g:24253:1: ( () )
+            {
+            // InternalFormalML.g:24253:1: ( () )
+            // InternalFormalML.g:24254:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getFinalStateAction_0()); 
+            }
+            // InternalFormalML.g:24255:2: ()
+            // InternalFormalML.g:24255:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getFinalStateAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group__0__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group__1"
+    // InternalFormalML.g:24263:1: rule__FinalState__Group__1 : rule__FinalState__Group__1__Impl rule__FinalState__Group__2 ;
+    public final void rule__FinalState__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24267:1: ( rule__FinalState__Group__1__Impl rule__FinalState__Group__2 )
+            // InternalFormalML.g:24268:2: rule__FinalState__Group__1__Impl rule__FinalState__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__FinalState__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group__1"
+
+
+    // $ANTLR start "rule__FinalState__Group__1__Impl"
+    // InternalFormalML.g:24275:1: rule__FinalState__Group__1__Impl : ( ( rule__FinalState__Alternatives_1 ) ) ;
+    public final void rule__FinalState__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24279:1: ( ( ( rule__FinalState__Alternatives_1 ) ) )
+            // InternalFormalML.g:24280:1: ( ( rule__FinalState__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:24280:1: ( ( rule__FinalState__Alternatives_1 ) )
+            // InternalFormalML.g:24281:2: ( rule__FinalState__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:24282:2: ( rule__FinalState__Alternatives_1 )
+            // InternalFormalML.g:24282:3: rule__FinalState__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group__1__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group__2"
+    // InternalFormalML.g:24290:1: rule__FinalState__Group__2 : rule__FinalState__Group__2__Impl rule__FinalState__Group__3 ;
+    public final void rule__FinalState__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24294:1: ( rule__FinalState__Group__2__Impl rule__FinalState__Group__3 )
+            // InternalFormalML.g:24295:2: rule__FinalState__Group__2__Impl rule__FinalState__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__FinalState__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group__2"
+
+
+    // $ANTLR start "rule__FinalState__Group__2__Impl"
+    // InternalFormalML.g:24302:1: rule__FinalState__Group__2__Impl : ( ( rule__FinalState__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__FinalState__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24306:1: ( ( ( rule__FinalState__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:24307:1: ( ( rule__FinalState__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:24307:1: ( ( rule__FinalState__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:24308:2: ( rule__FinalState__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:24309:2: ( rule__FinalState__UnrestrictedNameAssignment_2 )?
+            int alt416=2;
+            int LA416_0 = input.LA(1);
+
+            if ( (LA416_0==RULE_STRING) ) {
+                alt416=1;
+            }
+            switch (alt416) {
+                case 1 :
+                    // InternalFormalML.g:24309:3: rule__FinalState__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__FinalState__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group__2__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group__3"
+    // InternalFormalML.g:24317:1: rule__FinalState__Group__3 : rule__FinalState__Group__3__Impl ;
+    public final void rule__FinalState__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24321:1: ( rule__FinalState__Group__3__Impl )
+            // InternalFormalML.g:24322:2: rule__FinalState__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group__3"
+
+
+    // $ANTLR start "rule__FinalState__Group__3__Impl"
+    // InternalFormalML.g:24328:1: rule__FinalState__Group__3__Impl : ( ( rule__FinalState__Alternatives_3 ) ) ;
+    public final void rule__FinalState__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24332:1: ( ( ( rule__FinalState__Alternatives_3 ) ) )
+            // InternalFormalML.g:24333:1: ( ( rule__FinalState__Alternatives_3 ) )
+            {
+            // InternalFormalML.g:24333:1: ( ( rule__FinalState__Alternatives_3 ) )
+            // InternalFormalML.g:24334:2: ( rule__FinalState__Alternatives_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:24335:2: ( rule__FinalState__Alternatives_3 )
+            // InternalFormalML.g:24335:3: rule__FinalState__Alternatives_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Alternatives_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group__3__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__0"
+    // InternalFormalML.g:24344:1: rule__FinalState__Group_1_0__0 : rule__FinalState__Group_1_0__0__Impl rule__FinalState__Group_1_0__1 ;
+    public final void rule__FinalState__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24348:1: ( rule__FinalState__Group_1_0__0__Impl rule__FinalState__Group_1_0__1 )
+            // InternalFormalML.g:24349:2: rule__FinalState__Group_1_0__0__Impl rule__FinalState__Group_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__FinalState__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__0"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__0__Impl"
+    // InternalFormalML.g:24356:1: rule__FinalState__Group_1_0__0__Impl : ( ( rule__FinalState__SimpleAssignment_1_0_0 ) ) ;
+    public final void rule__FinalState__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24360:1: ( ( ( rule__FinalState__SimpleAssignment_1_0_0 ) ) )
+            // InternalFormalML.g:24361:1: ( ( rule__FinalState__SimpleAssignment_1_0_0 ) )
+            {
+            // InternalFormalML.g:24361:1: ( ( rule__FinalState__SimpleAssignment_1_0_0 ) )
+            // InternalFormalML.g:24362:2: ( rule__FinalState__SimpleAssignment_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_0_0()); 
+            }
+            // InternalFormalML.g:24363:2: ( rule__FinalState__SimpleAssignment_1_0_0 )
+            // InternalFormalML.g:24363:3: rule__FinalState__SimpleAssignment_1_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__SimpleAssignment_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getSimpleAssignment_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__1"
+    // InternalFormalML.g:24371:1: rule__FinalState__Group_1_0__1 : rule__FinalState__Group_1_0__1__Impl rule__FinalState__Group_1_0__2 ;
+    public final void rule__FinalState__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24375:1: ( rule__FinalState__Group_1_0__1__Impl rule__FinalState__Group_1_0__2 )
+            // InternalFormalML.g:24376:2: rule__FinalState__Group_1_0__1__Impl rule__FinalState__Group_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_100);
+            rule__FinalState__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__1"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__1__Impl"
+    // InternalFormalML.g:24383:1: rule__FinalState__Group_1_0__1__Impl : ( '<' ) ;
+    public final void rule__FinalState__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24387:1: ( ( '<' ) )
+            // InternalFormalML.g:24388:1: ( '<' )
+            {
+            // InternalFormalML.g:24388:1: ( '<' )
+            // InternalFormalML.g:24389:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getLessThanSignKeyword_1_0_1()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getLessThanSignKeyword_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__2"
+    // InternalFormalML.g:24398:1: rule__FinalState__Group_1_0__2 : rule__FinalState__Group_1_0__2__Impl rule__FinalState__Group_1_0__3 ;
+    public final void rule__FinalState__Group_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24402:1: ( rule__FinalState__Group_1_0__2__Impl rule__FinalState__Group_1_0__3 )
+            // InternalFormalML.g:24403:2: rule__FinalState__Group_1_0__2__Impl rule__FinalState__Group_1_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_100);
+            rule__FinalState__Group_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group_1_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__2"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__2__Impl"
+    // InternalFormalML.g:24410:1: rule__FinalState__Group_1_0__2__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__FinalState__Group_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24414:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:24415:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:24415:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:24416:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getMocKeyword_1_0_2()); 
+            }
+            // InternalFormalML.g:24417:2: ( 'moc:' )?
+            int alt417=2;
+            int LA417_0 = input.LA(1);
+
+            if ( (LA417_0==201) ) {
+                alt417=1;
+            }
+            switch (alt417) {
+                case 1 :
+                    // InternalFormalML.g:24417:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getMocKeyword_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__3"
+    // InternalFormalML.g:24425:1: rule__FinalState__Group_1_0__3 : rule__FinalState__Group_1_0__3__Impl rule__FinalState__Group_1_0__4 ;
+    public final void rule__FinalState__Group_1_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24429:1: ( rule__FinalState__Group_1_0__3__Impl rule__FinalState__Group_1_0__4 )
+            // InternalFormalML.g:24430:2: rule__FinalState__Group_1_0__3__Impl rule__FinalState__Group_1_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__FinalState__Group_1_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group_1_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__3"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__3__Impl"
+    // InternalFormalML.g:24437:1: rule__FinalState__Group_1_0__3__Impl : ( 'final' ) ;
+    public final void rule__FinalState__Group_1_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24441:1: ( ( 'final' ) )
+            // InternalFormalML.g:24442:1: ( 'final' )
+            {
+            // InternalFormalML.g:24442:1: ( 'final' )
+            // InternalFormalML.g:24443:2: 'final'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getFinalKeyword_1_0_3()); 
+            }
+            match(input,179,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getFinalKeyword_1_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__3__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__4"
+    // InternalFormalML.g:24452:1: rule__FinalState__Group_1_0__4 : rule__FinalState__Group_1_0__4__Impl rule__FinalState__Group_1_0__5 ;
+    public final void rule__FinalState__Group_1_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24456:1: ( rule__FinalState__Group_1_0__4__Impl rule__FinalState__Group_1_0__5 )
+            // InternalFormalML.g:24457:2: rule__FinalState__Group_1_0__4__Impl rule__FinalState__Group_1_0__5
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__FinalState__Group_1_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group_1_0__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__4"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__4__Impl"
+    // InternalFormalML.g:24464:1: rule__FinalState__Group_1_0__4__Impl : ( '>' ) ;
+    public final void rule__FinalState__Group_1_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24468:1: ( ( '>' ) )
+            // InternalFormalML.g:24469:1: ( '>' )
+            {
+            // InternalFormalML.g:24469:1: ( '>' )
+            // InternalFormalML.g:24470:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getGreaterThanSignKeyword_1_0_4()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getGreaterThanSignKeyword_1_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__4__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__5"
+    // InternalFormalML.g:24479:1: rule__FinalState__Group_1_0__5 : rule__FinalState__Group_1_0__5__Impl ;
+    public final void rule__FinalState__Group_1_0__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24483:1: ( rule__FinalState__Group_1_0__5__Impl )
+            // InternalFormalML.g:24484:2: rule__FinalState__Group_1_0__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group_1_0__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__5"
+
+
+    // $ANTLR start "rule__FinalState__Group_1_0__5__Impl"
+    // InternalFormalML.g:24490:1: rule__FinalState__Group_1_0__5__Impl : ( ( rule__FinalState__NameAssignment_1_0_5 ) ) ;
+    public final void rule__FinalState__Group_1_0__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24494:1: ( ( ( rule__FinalState__NameAssignment_1_0_5 ) ) )
+            // InternalFormalML.g:24495:1: ( ( rule__FinalState__NameAssignment_1_0_5 ) )
+            {
+            // InternalFormalML.g:24495:1: ( ( rule__FinalState__NameAssignment_1_0_5 ) )
+            // InternalFormalML.g:24496:2: ( rule__FinalState__NameAssignment_1_0_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getNameAssignment_1_0_5()); 
+            }
+            // InternalFormalML.g:24497:2: ( rule__FinalState__NameAssignment_1_0_5 )
+            // InternalFormalML.g:24497:3: rule__FinalState__NameAssignment_1_0_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__NameAssignment_1_0_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getNameAssignment_1_0_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_1_0__5__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group_3_0__0"
+    // InternalFormalML.g:24506:1: rule__FinalState__Group_3_0__0 : rule__FinalState__Group_3_0__0__Impl rule__FinalState__Group_3_0__1 ;
+    public final void rule__FinalState__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24510:1: ( rule__FinalState__Group_3_0__0__Impl rule__FinalState__Group_3_0__1 )
+            // InternalFormalML.g:24511:2: rule__FinalState__Group_3_0__0__Impl rule__FinalState__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_101);
+            rule__FinalState__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_3_0__0"
+
+
+    // $ANTLR start "rule__FinalState__Group_3_0__0__Impl"
+    // InternalFormalML.g:24518:1: rule__FinalState__Group_3_0__0__Impl : ( '{' ) ;
+    public final void rule__FinalState__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24522:1: ( ( '{' ) )
+            // InternalFormalML.g:24523:1: ( '{' )
+            {
+            // InternalFormalML.g:24523:1: ( '{' )
+            // InternalFormalML.g:24524:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getLeftCurlyBracketKeyword_3_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getLeftCurlyBracketKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group_3_0__1"
+    // InternalFormalML.g:24533:1: rule__FinalState__Group_3_0__1 : rule__FinalState__Group_3_0__1__Impl rule__FinalState__Group_3_0__2 ;
+    public final void rule__FinalState__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24537:1: ( rule__FinalState__Group_3_0__1__Impl rule__FinalState__Group_3_0__2 )
+            // InternalFormalML.g:24538:2: rule__FinalState__Group_3_0__1__Impl rule__FinalState__Group_3_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_101);
+            rule__FinalState__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group_3_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_3_0__1"
+
+
+    // $ANTLR start "rule__FinalState__Group_3_0__1__Impl"
+    // InternalFormalML.g:24545:1: rule__FinalState__Group_3_0__1__Impl : ( ( rule__FinalState__MoeAssignment_3_0_1 )* ) ;
+    public final void rule__FinalState__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24549:1: ( ( ( rule__FinalState__MoeAssignment_3_0_1 )* ) )
+            // InternalFormalML.g:24550:1: ( ( rule__FinalState__MoeAssignment_3_0_1 )* )
+            {
+            // InternalFormalML.g:24550:1: ( ( rule__FinalState__MoeAssignment_3_0_1 )* )
+            // InternalFormalML.g:24551:2: ( rule__FinalState__MoeAssignment_3_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getMoeAssignment_3_0_1()); 
+            }
+            // InternalFormalML.g:24552:2: ( rule__FinalState__MoeAssignment_3_0_1 )*
+            loop418:
+            do {
+                int alt418=2;
+                int LA418_0 = input.LA(1);
+
+                if ( ((LA418_0>=47 && LA418_0<=48)) ) {
+                    alt418=1;
+                }
+
+
+                switch (alt418) {
+            	case 1 :
+            	    // InternalFormalML.g:24552:3: rule__FinalState__MoeAssignment_3_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_102);
+            	    rule__FinalState__MoeAssignment_3_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop418;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getMoeAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__FinalState__Group_3_0__2"
+    // InternalFormalML.g:24560:1: rule__FinalState__Group_3_0__2 : rule__FinalState__Group_3_0__2__Impl ;
+    public final void rule__FinalState__Group_3_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24564:1: ( rule__FinalState__Group_3_0__2__Impl )
+            // InternalFormalML.g:24565:2: rule__FinalState__Group_3_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FinalState__Group_3_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_3_0__2"
+
+
+    // $ANTLR start "rule__FinalState__Group_3_0__2__Impl"
+    // InternalFormalML.g:24571:1: rule__FinalState__Group_3_0__2__Impl : ( '}' ) ;
+    public final void rule__FinalState__Group_3_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24575:1: ( ( '}' ) )
+            // InternalFormalML.g:24576:1: ( '}' )
+            {
+            // InternalFormalML.g:24576:1: ( '}' )
+            // InternalFormalML.g:24577:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getRightCurlyBracketKeyword_3_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getRightCurlyBracketKeyword_3_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__Group_3_0__2__Impl"
+
+
+    // $ANTLR start "rule__MoeFinalStateRoutines__Group__0"
+    // InternalFormalML.g:24587:1: rule__MoeFinalStateRoutines__Group__0 : rule__MoeFinalStateRoutines__Group__0__Impl rule__MoeFinalStateRoutines__Group__1 ;
+    public final void rule__MoeFinalStateRoutines__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24591:1: ( rule__MoeFinalStateRoutines__Group__0__Impl rule__MoeFinalStateRoutines__Group__1 )
+            // InternalFormalML.g:24592:2: rule__MoeFinalStateRoutines__Group__0__Impl rule__MoeFinalStateRoutines__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_103);
+            rule__MoeFinalStateRoutines__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeFinalStateRoutines__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeFinalStateRoutines__Group__0"
+
+
+    // $ANTLR start "rule__MoeFinalStateRoutines__Group__0__Impl"
+    // InternalFormalML.g:24599:1: rule__MoeFinalStateRoutines__Group__0__Impl : ( () ) ;
+    public final void rule__MoeFinalStateRoutines__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24603:1: ( ( () ) )
+            // InternalFormalML.g:24604:1: ( () )
+            {
+            // InternalFormalML.g:24604:1: ( () )
+            // InternalFormalML.g:24605:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeFinalStateRoutinesAccess().getRoutineAction_0()); 
+            }
+            // InternalFormalML.g:24606:2: ()
+            // InternalFormalML.g:24606:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeFinalStateRoutinesAccess().getRoutineAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeFinalStateRoutines__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MoeFinalStateRoutines__Group__1"
+    // InternalFormalML.g:24614:1: rule__MoeFinalStateRoutines__Group__1 : rule__MoeFinalStateRoutines__Group__1__Impl rule__MoeFinalStateRoutines__Group__2 ;
+    public final void rule__MoeFinalStateRoutines__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24618:1: ( rule__MoeFinalStateRoutines__Group__1__Impl rule__MoeFinalStateRoutines__Group__2 )
+            // InternalFormalML.g:24619:2: rule__MoeFinalStateRoutines__Group__1__Impl rule__MoeFinalStateRoutines__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__MoeFinalStateRoutines__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeFinalStateRoutines__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeFinalStateRoutines__Group__1"
+
+
+    // $ANTLR start "rule__MoeFinalStateRoutines__Group__1__Impl"
+    // InternalFormalML.g:24626:1: rule__MoeFinalStateRoutines__Group__1__Impl : ( ( rule__MoeFinalStateRoutines__NameAssignment_1 ) ) ;
+    public final void rule__MoeFinalStateRoutines__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24630:1: ( ( ( rule__MoeFinalStateRoutines__NameAssignment_1 ) ) )
+            // InternalFormalML.g:24631:1: ( ( rule__MoeFinalStateRoutines__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:24631:1: ( ( rule__MoeFinalStateRoutines__NameAssignment_1 ) )
+            // InternalFormalML.g:24632:2: ( rule__MoeFinalStateRoutines__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:24633:2: ( rule__MoeFinalStateRoutines__NameAssignment_1 )
+            // InternalFormalML.g:24633:3: rule__MoeFinalStateRoutines__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeFinalStateRoutines__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeFinalStateRoutines__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MoeFinalStateRoutines__Group__2"
+    // InternalFormalML.g:24641:1: rule__MoeFinalStateRoutines__Group__2 : rule__MoeFinalStateRoutines__Group__2__Impl ;
+    public final void rule__MoeFinalStateRoutines__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24645:1: ( rule__MoeFinalStateRoutines__Group__2__Impl )
+            // InternalFormalML.g:24646:2: rule__MoeFinalStateRoutines__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeFinalStateRoutines__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeFinalStateRoutines__Group__2"
+
+
+    // $ANTLR start "rule__MoeFinalStateRoutines__Group__2__Impl"
+    // InternalFormalML.g:24652:1: rule__MoeFinalStateRoutines__Group__2__Impl : ( ( rule__MoeFinalStateRoutines__BodyBlockAssignment_2 ) ) ;
+    public final void rule__MoeFinalStateRoutines__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24656:1: ( ( ( rule__MoeFinalStateRoutines__BodyBlockAssignment_2 ) ) )
+            // InternalFormalML.g:24657:1: ( ( rule__MoeFinalStateRoutines__BodyBlockAssignment_2 ) )
+            {
+            // InternalFormalML.g:24657:1: ( ( rule__MoeFinalStateRoutines__BodyBlockAssignment_2 ) )
+            // InternalFormalML.g:24658:2: ( rule__MoeFinalStateRoutines__BodyBlockAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockAssignment_2()); 
+            }
+            // InternalFormalML.g:24659:2: ( rule__MoeFinalStateRoutines__BodyBlockAssignment_2 )
+            // InternalFormalML.g:24659:3: rule__MoeFinalStateRoutines__BodyBlockAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeFinalStateRoutines__BodyBlockAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeFinalStateRoutines__Group__2__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__0"
+    // InternalFormalML.g:24668:1: rule__OtherPseudostate__Group__0 : rule__OtherPseudostate__Group__0__Impl rule__OtherPseudostate__Group__1 ;
+    public final void rule__OtherPseudostate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24672:1: ( rule__OtherPseudostate__Group__0__Impl rule__OtherPseudostate__Group__1 )
+            // InternalFormalML.g:24673:2: rule__OtherPseudostate__Group__0__Impl rule__OtherPseudostate__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_79);
+            rule__OtherPseudostate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__0"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__0__Impl"
+    // InternalFormalML.g:24680:1: rule__OtherPseudostate__Group__0__Impl : ( () ) ;
+    public final void rule__OtherPseudostate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24684:1: ( ( () ) )
+            // InternalFormalML.g:24685:1: ( () )
+            {
+            // InternalFormalML.g:24685:1: ( () )
+            // InternalFormalML.g:24686:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getPseudostateAction_0()); 
+            }
+            // InternalFormalML.g:24687:2: ()
+            // InternalFormalML.g:24687:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getPseudostateAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__1"
+    // InternalFormalML.g:24695:1: rule__OtherPseudostate__Group__1 : rule__OtherPseudostate__Group__1__Impl rule__OtherPseudostate__Group__2 ;
+    public final void rule__OtherPseudostate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24699:1: ( rule__OtherPseudostate__Group__1__Impl rule__OtherPseudostate__Group__2 )
+            // InternalFormalML.g:24700:2: rule__OtherPseudostate__Group__1__Impl rule__OtherPseudostate__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__OtherPseudostate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__1"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__1__Impl"
+    // InternalFormalML.g:24707:1: rule__OtherPseudostate__Group__1__Impl : ( ( rule__OtherPseudostate__Alternatives_1 ) ) ;
+    public final void rule__OtherPseudostate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24711:1: ( ( ( rule__OtherPseudostate__Alternatives_1 ) ) )
+            // InternalFormalML.g:24712:1: ( ( rule__OtherPseudostate__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:24712:1: ( ( rule__OtherPseudostate__Alternatives_1 ) )
+            // InternalFormalML.g:24713:2: ( rule__OtherPseudostate__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:24714:2: ( rule__OtherPseudostate__Alternatives_1 )
+            // InternalFormalML.g:24714:3: rule__OtherPseudostate__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__2"
+    // InternalFormalML.g:24722:1: rule__OtherPseudostate__Group__2 : rule__OtherPseudostate__Group__2__Impl rule__OtherPseudostate__Group__3 ;
+    public final void rule__OtherPseudostate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24726:1: ( rule__OtherPseudostate__Group__2__Impl rule__OtherPseudostate__Group__3 )
+            // InternalFormalML.g:24727:2: rule__OtherPseudostate__Group__2__Impl rule__OtherPseudostate__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_104);
+            rule__OtherPseudostate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__2"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__2__Impl"
+    // InternalFormalML.g:24734:1: rule__OtherPseudostate__Group__2__Impl : ( '<' ) ;
+    public final void rule__OtherPseudostate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24738:1: ( ( '<' ) )
+            // InternalFormalML.g:24739:1: ( '<' )
+            {
+            // InternalFormalML.g:24739:1: ( '<' )
+            // InternalFormalML.g:24740:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getLessThanSignKeyword_2()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getLessThanSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__3"
+    // InternalFormalML.g:24749:1: rule__OtherPseudostate__Group__3 : rule__OtherPseudostate__Group__3__Impl rule__OtherPseudostate__Group__4 ;
+    public final void rule__OtherPseudostate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24753:1: ( rule__OtherPseudostate__Group__3__Impl rule__OtherPseudostate__Group__4 )
+            // InternalFormalML.g:24754:2: rule__OtherPseudostate__Group__3__Impl rule__OtherPseudostate__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_104);
+            rule__OtherPseudostate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__3"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__3__Impl"
+    // InternalFormalML.g:24761:1: rule__OtherPseudostate__Group__3__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__OtherPseudostate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24765:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:24766:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:24766:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:24767:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getMocKeyword_3()); 
+            }
+            // InternalFormalML.g:24768:2: ( 'moc:' )?
+            int alt419=2;
+            int LA419_0 = input.LA(1);
+
+            if ( (LA419_0==201) ) {
+                alt419=1;
+            }
+            switch (alt419) {
+                case 1 :
+                    // InternalFormalML.g:24768:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getMocKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__4"
+    // InternalFormalML.g:24776:1: rule__OtherPseudostate__Group__4 : rule__OtherPseudostate__Group__4__Impl rule__OtherPseudostate__Group__5 ;
+    public final void rule__OtherPseudostate__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24780:1: ( rule__OtherPseudostate__Group__4__Impl rule__OtherPseudostate__Group__5 )
+            // InternalFormalML.g:24781:2: rule__OtherPseudostate__Group__4__Impl rule__OtherPseudostate__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__OtherPseudostate__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__4"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__4__Impl"
+    // InternalFormalML.g:24788:1: rule__OtherPseudostate__Group__4__Impl : ( ( rule__OtherPseudostate__KindAssignment_4 ) ) ;
+    public final void rule__OtherPseudostate__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24792:1: ( ( ( rule__OtherPseudostate__KindAssignment_4 ) ) )
+            // InternalFormalML.g:24793:1: ( ( rule__OtherPseudostate__KindAssignment_4 ) )
+            {
+            // InternalFormalML.g:24793:1: ( ( rule__OtherPseudostate__KindAssignment_4 ) )
+            // InternalFormalML.g:24794:2: ( rule__OtherPseudostate__KindAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getKindAssignment_4()); 
+            }
+            // InternalFormalML.g:24795:2: ( rule__OtherPseudostate__KindAssignment_4 )
+            // InternalFormalML.g:24795:3: rule__OtherPseudostate__KindAssignment_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__KindAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getKindAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__4__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__5"
+    // InternalFormalML.g:24803:1: rule__OtherPseudostate__Group__5 : rule__OtherPseudostate__Group__5__Impl rule__OtherPseudostate__Group__6 ;
+    public final void rule__OtherPseudostate__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24807:1: ( rule__OtherPseudostate__Group__5__Impl rule__OtherPseudostate__Group__6 )
+            // InternalFormalML.g:24808:2: rule__OtherPseudostate__Group__5__Impl rule__OtherPseudostate__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__OtherPseudostate__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__5"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__5__Impl"
+    // InternalFormalML.g:24815:1: rule__OtherPseudostate__Group__5__Impl : ( '>' ) ;
+    public final void rule__OtherPseudostate__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24819:1: ( ( '>' ) )
+            // InternalFormalML.g:24820:1: ( '>' )
+            {
+            // InternalFormalML.g:24820:1: ( '>' )
+            // InternalFormalML.g:24821:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getGreaterThanSignKeyword_5()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getGreaterThanSignKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__5__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__6"
+    // InternalFormalML.g:24830:1: rule__OtherPseudostate__Group__6 : rule__OtherPseudostate__Group__6__Impl rule__OtherPseudostate__Group__7 ;
+    public final void rule__OtherPseudostate__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24834:1: ( rule__OtherPseudostate__Group__6__Impl rule__OtherPseudostate__Group__7 )
+            // InternalFormalML.g:24835:2: rule__OtherPseudostate__Group__6__Impl rule__OtherPseudostate__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__OtherPseudostate__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__6"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__6__Impl"
+    // InternalFormalML.g:24842:1: rule__OtherPseudostate__Group__6__Impl : ( ( rule__OtherPseudostate__NameAssignment_6 ) ) ;
+    public final void rule__OtherPseudostate__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24846:1: ( ( ( rule__OtherPseudostate__NameAssignment_6 ) ) )
+            // InternalFormalML.g:24847:1: ( ( rule__OtherPseudostate__NameAssignment_6 ) )
+            {
+            // InternalFormalML.g:24847:1: ( ( rule__OtherPseudostate__NameAssignment_6 ) )
+            // InternalFormalML.g:24848:2: ( rule__OtherPseudostate__NameAssignment_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getNameAssignment_6()); 
+            }
+            // InternalFormalML.g:24849:2: ( rule__OtherPseudostate__NameAssignment_6 )
+            // InternalFormalML.g:24849:3: rule__OtherPseudostate__NameAssignment_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__NameAssignment_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getNameAssignment_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__6__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__7"
+    // InternalFormalML.g:24857:1: rule__OtherPseudostate__Group__7 : rule__OtherPseudostate__Group__7__Impl rule__OtherPseudostate__Group__8 ;
+    public final void rule__OtherPseudostate__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24861:1: ( rule__OtherPseudostate__Group__7__Impl rule__OtherPseudostate__Group__8 )
+            // InternalFormalML.g:24862:2: rule__OtherPseudostate__Group__7__Impl rule__OtherPseudostate__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__OtherPseudostate__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__7"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__7__Impl"
+    // InternalFormalML.g:24869:1: rule__OtherPseudostate__Group__7__Impl : ( ( rule__OtherPseudostate__UnrestrictedNameAssignment_7 )? ) ;
+    public final void rule__OtherPseudostate__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24873:1: ( ( ( rule__OtherPseudostate__UnrestrictedNameAssignment_7 )? ) )
+            // InternalFormalML.g:24874:1: ( ( rule__OtherPseudostate__UnrestrictedNameAssignment_7 )? )
+            {
+            // InternalFormalML.g:24874:1: ( ( rule__OtherPseudostate__UnrestrictedNameAssignment_7 )? )
+            // InternalFormalML.g:24875:2: ( rule__OtherPseudostate__UnrestrictedNameAssignment_7 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameAssignment_7()); 
+            }
+            // InternalFormalML.g:24876:2: ( rule__OtherPseudostate__UnrestrictedNameAssignment_7 )?
+            int alt420=2;
+            int LA420_0 = input.LA(1);
+
+            if ( (LA420_0==RULE_STRING) ) {
+                alt420=1;
+            }
+            switch (alt420) {
+                case 1 :
+                    // InternalFormalML.g:24876:3: rule__OtherPseudostate__UnrestrictedNameAssignment_7
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherPseudostate__UnrestrictedNameAssignment_7();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__7__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__8"
+    // InternalFormalML.g:24884:1: rule__OtherPseudostate__Group__8 : rule__OtherPseudostate__Group__8__Impl ;
+    public final void rule__OtherPseudostate__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24888:1: ( rule__OtherPseudostate__Group__8__Impl )
+            // InternalFormalML.g:24889:2: rule__OtherPseudostate__Group__8__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__8"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group__8__Impl"
+    // InternalFormalML.g:24895:1: rule__OtherPseudostate__Group__8__Impl : ( ( rule__OtherPseudostate__Alternatives_8 ) ) ;
+    public final void rule__OtherPseudostate__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24899:1: ( ( ( rule__OtherPseudostate__Alternatives_8 ) ) )
+            // InternalFormalML.g:24900:1: ( ( rule__OtherPseudostate__Alternatives_8 ) )
+            {
+            // InternalFormalML.g:24900:1: ( ( rule__OtherPseudostate__Alternatives_8 ) )
+            // InternalFormalML.g:24901:2: ( rule__OtherPseudostate__Alternatives_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:24902:2: ( rule__OtherPseudostate__Alternatives_8 )
+            // InternalFormalML.g:24902:3: rule__OtherPseudostate__Alternatives_8
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Alternatives_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group__8__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group_8_0__0"
+    // InternalFormalML.g:24911:1: rule__OtherPseudostate__Group_8_0__0 : rule__OtherPseudostate__Group_8_0__0__Impl rule__OtherPseudostate__Group_8_0__1 ;
+    public final void rule__OtherPseudostate__Group_8_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24915:1: ( rule__OtherPseudostate__Group_8_0__0__Impl rule__OtherPseudostate__Group_8_0__1 )
+            // InternalFormalML.g:24916:2: rule__OtherPseudostate__Group_8_0__0__Impl rule__OtherPseudostate__Group_8_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_105);
+            rule__OtherPseudostate__Group_8_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group_8_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group_8_0__0"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group_8_0__0__Impl"
+    // InternalFormalML.g:24923:1: rule__OtherPseudostate__Group_8_0__0__Impl : ( '{' ) ;
+    public final void rule__OtherPseudostate__Group_8_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24927:1: ( ( '{' ) )
+            // InternalFormalML.g:24928:1: ( '{' )
+            {
+            // InternalFormalML.g:24928:1: ( '{' )
+            // InternalFormalML.g:24929:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group_8_0__0__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group_8_0__1"
+    // InternalFormalML.g:24938:1: rule__OtherPseudostate__Group_8_0__1 : rule__OtherPseudostate__Group_8_0__1__Impl rule__OtherPseudostate__Group_8_0__2 ;
+    public final void rule__OtherPseudostate__Group_8_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24942:1: ( rule__OtherPseudostate__Group_8_0__1__Impl rule__OtherPseudostate__Group_8_0__2 )
+            // InternalFormalML.g:24943:2: rule__OtherPseudostate__Group_8_0__1__Impl rule__OtherPseudostate__Group_8_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_105);
+            rule__OtherPseudostate__Group_8_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group_8_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group_8_0__1"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group_8_0__1__Impl"
+    // InternalFormalML.g:24950:1: rule__OtherPseudostate__Group_8_0__1__Impl : ( ( rule__OtherPseudostate__TransitionAssignment_8_0_1 )* ) ;
+    public final void rule__OtherPseudostate__Group_8_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24954:1: ( ( ( rule__OtherPseudostate__TransitionAssignment_8_0_1 )* ) )
+            // InternalFormalML.g:24955:1: ( ( rule__OtherPseudostate__TransitionAssignment_8_0_1 )* )
+            {
+            // InternalFormalML.g:24955:1: ( ( rule__OtherPseudostate__TransitionAssignment_8_0_1 )* )
+            // InternalFormalML.g:24956:2: ( rule__OtherPseudostate__TransitionAssignment_8_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getTransitionAssignment_8_0_1()); 
+            }
+            // InternalFormalML.g:24957:2: ( rule__OtherPseudostate__TransitionAssignment_8_0_1 )*
+            loop421:
+            do {
+                int alt421=2;
+                int LA421_0 = input.LA(1);
+
+                if ( (LA421_0==239||LA421_0==281) ) {
+                    alt421=1;
+                }
+
+
+                switch (alt421) {
+            	case 1 :
+            	    // InternalFormalML.g:24957:3: rule__OtherPseudostate__TransitionAssignment_8_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_87);
+            	    rule__OtherPseudostate__TransitionAssignment_8_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop421;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getTransitionAssignment_8_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group_8_0__1__Impl"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group_8_0__2"
+    // InternalFormalML.g:24965:1: rule__OtherPseudostate__Group_8_0__2 : rule__OtherPseudostate__Group_8_0__2__Impl ;
+    public final void rule__OtherPseudostate__Group_8_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24969:1: ( rule__OtherPseudostate__Group_8_0__2__Impl )
+            // InternalFormalML.g:24970:2: rule__OtherPseudostate__Group_8_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherPseudostate__Group_8_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group_8_0__2"
+
+
+    // $ANTLR start "rule__OtherPseudostate__Group_8_0__2__Impl"
+    // InternalFormalML.g:24976:1: rule__OtherPseudostate__Group_8_0__2__Impl : ( '}' ) ;
+    public final void rule__OtherPseudostate__Group_8_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24980:1: ( ( '}' ) )
+            // InternalFormalML.g:24981:1: ( '}' )
+            {
+            // InternalFormalML.g:24981:1: ( '}' )
+            // InternalFormalML.g:24982:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getRightCurlyBracketKeyword_8_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getRightCurlyBracketKeyword_8_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__Group_8_0__2__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group__0"
+    // InternalFormalML.g:24992:1: rule__PseudostateInitial__Group__0 : rule__PseudostateInitial__Group__0__Impl rule__PseudostateInitial__Group__1 ;
+    public final void rule__PseudostateInitial__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:24996:1: ( rule__PseudostateInitial__Group__0__Impl rule__PseudostateInitial__Group__1 )
+            // InternalFormalML.g:24997:2: rule__PseudostateInitial__Group__0__Impl rule__PseudostateInitial__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_106);
+            rule__PseudostateInitial__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group__0"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group__0__Impl"
+    // InternalFormalML.g:25004:1: rule__PseudostateInitial__Group__0__Impl : ( () ) ;
+    public final void rule__PseudostateInitial__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25008:1: ( ( () ) )
+            // InternalFormalML.g:25009:1: ( () )
+            {
+            // InternalFormalML.g:25009:1: ( () )
+            // InternalFormalML.g:25010:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getPseudostateAction_0()); 
+            }
+            // InternalFormalML.g:25011:2: ()
+            // InternalFormalML.g:25011:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getPseudostateAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group__1"
+    // InternalFormalML.g:25019:1: rule__PseudostateInitial__Group__1 : rule__PseudostateInitial__Group__1__Impl rule__PseudostateInitial__Group__2 ;
+    public final void rule__PseudostateInitial__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25023:1: ( rule__PseudostateInitial__Group__1__Impl rule__PseudostateInitial__Group__2 )
+            // InternalFormalML.g:25024:2: rule__PseudostateInitial__Group__1__Impl rule__PseudostateInitial__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__PseudostateInitial__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group__1"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group__1__Impl"
+    // InternalFormalML.g:25031:1: rule__PseudostateInitial__Group__1__Impl : ( ( rule__PseudostateInitial__Alternatives_1 ) ) ;
+    public final void rule__PseudostateInitial__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25035:1: ( ( ( rule__PseudostateInitial__Alternatives_1 ) ) )
+            // InternalFormalML.g:25036:1: ( ( rule__PseudostateInitial__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:25036:1: ( ( rule__PseudostateInitial__Alternatives_1 ) )
+            // InternalFormalML.g:25037:2: ( rule__PseudostateInitial__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:25038:2: ( rule__PseudostateInitial__Alternatives_1 )
+            // InternalFormalML.g:25038:3: rule__PseudostateInitial__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group__2"
+    // InternalFormalML.g:25046:1: rule__PseudostateInitial__Group__2 : rule__PseudostateInitial__Group__2__Impl rule__PseudostateInitial__Group__3 ;
+    public final void rule__PseudostateInitial__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25050:1: ( rule__PseudostateInitial__Group__2__Impl rule__PseudostateInitial__Group__3 )
+            // InternalFormalML.g:25051:2: rule__PseudostateInitial__Group__2__Impl rule__PseudostateInitial__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__PseudostateInitial__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group__2"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group__2__Impl"
+    // InternalFormalML.g:25058:1: rule__PseudostateInitial__Group__2__Impl : ( ( rule__PseudostateInitial__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__PseudostateInitial__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25062:1: ( ( ( rule__PseudostateInitial__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:25063:1: ( ( rule__PseudostateInitial__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:25063:1: ( ( rule__PseudostateInitial__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:25064:2: ( rule__PseudostateInitial__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:25065:2: ( rule__PseudostateInitial__UnrestrictedNameAssignment_2 )?
+            int alt422=2;
+            int LA422_0 = input.LA(1);
+
+            if ( (LA422_0==RULE_STRING) ) {
+                alt422=1;
+            }
+            switch (alt422) {
+                case 1 :
+                    // InternalFormalML.g:25065:3: rule__PseudostateInitial__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PseudostateInitial__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group__3"
+    // InternalFormalML.g:25073:1: rule__PseudostateInitial__Group__3 : rule__PseudostateInitial__Group__3__Impl ;
+    public final void rule__PseudostateInitial__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25077:1: ( rule__PseudostateInitial__Group__3__Impl )
+            // InternalFormalML.g:25078:2: rule__PseudostateInitial__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group__3"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group__3__Impl"
+    // InternalFormalML.g:25084:1: rule__PseudostateInitial__Group__3__Impl : ( ( rule__PseudostateInitial__Alternatives_3 ) ) ;
+    public final void rule__PseudostateInitial__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25088:1: ( ( ( rule__PseudostateInitial__Alternatives_3 ) ) )
+            // InternalFormalML.g:25089:1: ( ( rule__PseudostateInitial__Alternatives_3 ) )
+            {
+            // InternalFormalML.g:25089:1: ( ( rule__PseudostateInitial__Alternatives_3 ) )
+            // InternalFormalML.g:25090:2: ( rule__PseudostateInitial__Alternatives_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:25091:2: ( rule__PseudostateInitial__Alternatives_3 )
+            // InternalFormalML.g:25091:3: rule__PseudostateInitial__Alternatives_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Alternatives_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__0"
+    // InternalFormalML.g:25100:1: rule__PseudostateInitial__Group_1_0__0 : rule__PseudostateInitial__Group_1_0__0__Impl rule__PseudostateInitial__Group_1_0__1 ;
+    public final void rule__PseudostateInitial__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25104:1: ( rule__PseudostateInitial__Group_1_0__0__Impl rule__PseudostateInitial__Group_1_0__1 )
+            // InternalFormalML.g:25105:2: rule__PseudostateInitial__Group_1_0__0__Impl rule__PseudostateInitial__Group_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__PseudostateInitial__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__0"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__0__Impl"
+    // InternalFormalML.g:25112:1: rule__PseudostateInitial__Group_1_0__0__Impl : ( ( rule__PseudostateInitial__Alternatives_1_0_0 ) ) ;
+    public final void rule__PseudostateInitial__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25116:1: ( ( ( rule__PseudostateInitial__Alternatives_1_0_0 ) ) )
+            // InternalFormalML.g:25117:1: ( ( rule__PseudostateInitial__Alternatives_1_0_0 ) )
+            {
+            // InternalFormalML.g:25117:1: ( ( rule__PseudostateInitial__Alternatives_1_0_0 ) )
+            // InternalFormalML.g:25118:2: ( rule__PseudostateInitial__Alternatives_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getAlternatives_1_0_0()); 
+            }
+            // InternalFormalML.g:25119:2: ( rule__PseudostateInitial__Alternatives_1_0_0 )
+            // InternalFormalML.g:25119:3: rule__PseudostateInitial__Alternatives_1_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Alternatives_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getAlternatives_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__1"
+    // InternalFormalML.g:25127:1: rule__PseudostateInitial__Group_1_0__1 : rule__PseudostateInitial__Group_1_0__1__Impl rule__PseudostateInitial__Group_1_0__2 ;
+    public final void rule__PseudostateInitial__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25131:1: ( rule__PseudostateInitial__Group_1_0__1__Impl rule__PseudostateInitial__Group_1_0__2 )
+            // InternalFormalML.g:25132:2: rule__PseudostateInitial__Group_1_0__1__Impl rule__PseudostateInitial__Group_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_107);
+            rule__PseudostateInitial__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__1"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__1__Impl"
+    // InternalFormalML.g:25139:1: rule__PseudostateInitial__Group_1_0__1__Impl : ( '<' ) ;
+    public final void rule__PseudostateInitial__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25143:1: ( ( '<' ) )
+            // InternalFormalML.g:25144:1: ( '<' )
+            {
+            // InternalFormalML.g:25144:1: ( '<' )
+            // InternalFormalML.g:25145:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getLessThanSignKeyword_1_0_1()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getLessThanSignKeyword_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__2"
+    // InternalFormalML.g:25154:1: rule__PseudostateInitial__Group_1_0__2 : rule__PseudostateInitial__Group_1_0__2__Impl rule__PseudostateInitial__Group_1_0__3 ;
+    public final void rule__PseudostateInitial__Group_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25158:1: ( rule__PseudostateInitial__Group_1_0__2__Impl rule__PseudostateInitial__Group_1_0__3 )
+            // InternalFormalML.g:25159:2: rule__PseudostateInitial__Group_1_0__2__Impl rule__PseudostateInitial__Group_1_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_107);
+            rule__PseudostateInitial__Group_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group_1_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__2"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__2__Impl"
+    // InternalFormalML.g:25166:1: rule__PseudostateInitial__Group_1_0__2__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__PseudostateInitial__Group_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25170:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:25171:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:25171:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:25172:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getMocKeyword_1_0_2()); 
+            }
+            // InternalFormalML.g:25173:2: ( 'moc:' )?
+            int alt423=2;
+            int LA423_0 = input.LA(1);
+
+            if ( (LA423_0==201) ) {
+                alt423=1;
+            }
+            switch (alt423) {
+                case 1 :
+                    // InternalFormalML.g:25173:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getMocKeyword_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__3"
+    // InternalFormalML.g:25181:1: rule__PseudostateInitial__Group_1_0__3 : rule__PseudostateInitial__Group_1_0__3__Impl rule__PseudostateInitial__Group_1_0__4 ;
+    public final void rule__PseudostateInitial__Group_1_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25185:1: ( rule__PseudostateInitial__Group_1_0__3__Impl rule__PseudostateInitial__Group_1_0__4 )
+            // InternalFormalML.g:25186:2: rule__PseudostateInitial__Group_1_0__3__Impl rule__PseudostateInitial__Group_1_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__PseudostateInitial__Group_1_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group_1_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__3"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__3__Impl"
+    // InternalFormalML.g:25193:1: rule__PseudostateInitial__Group_1_0__3__Impl : ( ( rule__PseudostateInitial__KindAssignment_1_0_3 ) ) ;
+    public final void rule__PseudostateInitial__Group_1_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25197:1: ( ( ( rule__PseudostateInitial__KindAssignment_1_0_3 ) ) )
+            // InternalFormalML.g:25198:1: ( ( rule__PseudostateInitial__KindAssignment_1_0_3 ) )
+            {
+            // InternalFormalML.g:25198:1: ( ( rule__PseudostateInitial__KindAssignment_1_0_3 ) )
+            // InternalFormalML.g:25199:2: ( rule__PseudostateInitial__KindAssignment_1_0_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getKindAssignment_1_0_3()); 
+            }
+            // InternalFormalML.g:25200:2: ( rule__PseudostateInitial__KindAssignment_1_0_3 )
+            // InternalFormalML.g:25200:3: rule__PseudostateInitial__KindAssignment_1_0_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__KindAssignment_1_0_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getKindAssignment_1_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__3__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__4"
+    // InternalFormalML.g:25208:1: rule__PseudostateInitial__Group_1_0__4 : rule__PseudostateInitial__Group_1_0__4__Impl rule__PseudostateInitial__Group_1_0__5 ;
+    public final void rule__PseudostateInitial__Group_1_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25212:1: ( rule__PseudostateInitial__Group_1_0__4__Impl rule__PseudostateInitial__Group_1_0__5 )
+            // InternalFormalML.g:25213:2: rule__PseudostateInitial__Group_1_0__4__Impl rule__PseudostateInitial__Group_1_0__5
+            {
+            pushFollow(FollowSets000.FOLLOW_108);
+            rule__PseudostateInitial__Group_1_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group_1_0__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__4"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__4__Impl"
+    // InternalFormalML.g:25220:1: rule__PseudostateInitial__Group_1_0__4__Impl : ( '>' ) ;
+    public final void rule__PseudostateInitial__Group_1_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25224:1: ( ( '>' ) )
+            // InternalFormalML.g:25225:1: ( '>' )
+            {
+            // InternalFormalML.g:25225:1: ( '>' )
+            // InternalFormalML.g:25226:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getGreaterThanSignKeyword_1_0_4()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getGreaterThanSignKeyword_1_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__4__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__5"
+    // InternalFormalML.g:25235:1: rule__PseudostateInitial__Group_1_0__5 : rule__PseudostateInitial__Group_1_0__5__Impl ;
+    public final void rule__PseudostateInitial__Group_1_0__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25239:1: ( rule__PseudostateInitial__Group_1_0__5__Impl )
+            // InternalFormalML.g:25240:2: rule__PseudostateInitial__Group_1_0__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group_1_0__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__5"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_1_0__5__Impl"
+    // InternalFormalML.g:25246:1: rule__PseudostateInitial__Group_1_0__5__Impl : ( ( rule__PseudostateInitial__NameAssignment_1_0_5 ) ) ;
+    public final void rule__PseudostateInitial__Group_1_0__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25250:1: ( ( ( rule__PseudostateInitial__NameAssignment_1_0_5 ) ) )
+            // InternalFormalML.g:25251:1: ( ( rule__PseudostateInitial__NameAssignment_1_0_5 ) )
+            {
+            // InternalFormalML.g:25251:1: ( ( rule__PseudostateInitial__NameAssignment_1_0_5 ) )
+            // InternalFormalML.g:25252:2: ( rule__PseudostateInitial__NameAssignment_1_0_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_0_5()); 
+            }
+            // InternalFormalML.g:25253:2: ( rule__PseudostateInitial__NameAssignment_1_0_5 )
+            // InternalFormalML.g:25253:3: rule__PseudostateInitial__NameAssignment_1_0_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__NameAssignment_1_0_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getNameAssignment_1_0_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_1_0__5__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_3_0__0"
+    // InternalFormalML.g:25262:1: rule__PseudostateInitial__Group_3_0__0 : rule__PseudostateInitial__Group_3_0__0__Impl rule__PseudostateInitial__Group_3_0__1 ;
+    public final void rule__PseudostateInitial__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25266:1: ( rule__PseudostateInitial__Group_3_0__0__Impl rule__PseudostateInitial__Group_3_0__1 )
+            // InternalFormalML.g:25267:2: rule__PseudostateInitial__Group_3_0__0__Impl rule__PseudostateInitial__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_105);
+            rule__PseudostateInitial__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_3_0__0"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_3_0__0__Impl"
+    // InternalFormalML.g:25274:1: rule__PseudostateInitial__Group_3_0__0__Impl : ( '{' ) ;
+    public final void rule__PseudostateInitial__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25278:1: ( ( '{' ) )
+            // InternalFormalML.g:25279:1: ( '{' )
+            {
+            // InternalFormalML.g:25279:1: ( '{' )
+            // InternalFormalML.g:25280:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getLeftCurlyBracketKeyword_3_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getLeftCurlyBracketKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_3_0__1"
+    // InternalFormalML.g:25289:1: rule__PseudostateInitial__Group_3_0__1 : rule__PseudostateInitial__Group_3_0__1__Impl rule__PseudostateInitial__Group_3_0__2 ;
+    public final void rule__PseudostateInitial__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25293:1: ( rule__PseudostateInitial__Group_3_0__1__Impl rule__PseudostateInitial__Group_3_0__2 )
+            // InternalFormalML.g:25294:2: rule__PseudostateInitial__Group_3_0__1__Impl rule__PseudostateInitial__Group_3_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_105);
+            rule__PseudostateInitial__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group_3_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_3_0__1"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_3_0__1__Impl"
+    // InternalFormalML.g:25301:1: rule__PseudostateInitial__Group_3_0__1__Impl : ( ( rule__PseudostateInitial__TransitionAssignment_3_0_1 )* ) ;
+    public final void rule__PseudostateInitial__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25305:1: ( ( ( rule__PseudostateInitial__TransitionAssignment_3_0_1 )* ) )
+            // InternalFormalML.g:25306:1: ( ( rule__PseudostateInitial__TransitionAssignment_3_0_1 )* )
+            {
+            // InternalFormalML.g:25306:1: ( ( rule__PseudostateInitial__TransitionAssignment_3_0_1 )* )
+            // InternalFormalML.g:25307:2: ( rule__PseudostateInitial__TransitionAssignment_3_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getTransitionAssignment_3_0_1()); 
+            }
+            // InternalFormalML.g:25308:2: ( rule__PseudostateInitial__TransitionAssignment_3_0_1 )*
+            loop424:
+            do {
+                int alt424=2;
+                int LA424_0 = input.LA(1);
+
+                if ( (LA424_0==239||LA424_0==281) ) {
+                    alt424=1;
+                }
+
+
+                switch (alt424) {
+            	case 1 :
+            	    // InternalFormalML.g:25308:3: rule__PseudostateInitial__TransitionAssignment_3_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_87);
+            	    rule__PseudostateInitial__TransitionAssignment_3_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop424;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getTransitionAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_3_0__2"
+    // InternalFormalML.g:25316:1: rule__PseudostateInitial__Group_3_0__2 : rule__PseudostateInitial__Group_3_0__2__Impl ;
+    public final void rule__PseudostateInitial__Group_3_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25320:1: ( rule__PseudostateInitial__Group_3_0__2__Impl )
+            // InternalFormalML.g:25321:2: rule__PseudostateInitial__Group_3_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__Group_3_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_3_0__2"
+
+
+    // $ANTLR start "rule__PseudostateInitial__Group_3_0__2__Impl"
+    // InternalFormalML.g:25327:1: rule__PseudostateInitial__Group_3_0__2__Impl : ( '}' ) ;
+    public final void rule__PseudostateInitial__Group_3_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25331:1: ( ( '}' ) )
+            // InternalFormalML.g:25332:1: ( '}' )
+            {
+            // InternalFormalML.g:25332:1: ( '}' )
+            // InternalFormalML.g:25333:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getRightCurlyBracketKeyword_3_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getRightCurlyBracketKeyword_3_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__Group_3_0__2__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__0"
+    // InternalFormalML.g:25343:1: rule__EndingPseudostate__Group__0 : rule__EndingPseudostate__Group__0__Impl rule__EndingPseudostate__Group__1 ;
+    public final void rule__EndingPseudostate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25347:1: ( rule__EndingPseudostate__Group__0__Impl rule__EndingPseudostate__Group__1 )
+            // InternalFormalML.g:25348:2: rule__EndingPseudostate__Group__0__Impl rule__EndingPseudostate__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_109);
+            rule__EndingPseudostate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__0"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__0__Impl"
+    // InternalFormalML.g:25355:1: rule__EndingPseudostate__Group__0__Impl : ( () ) ;
+    public final void rule__EndingPseudostate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25359:1: ( ( () ) )
+            // InternalFormalML.g:25360:1: ( () )
+            {
+            // InternalFormalML.g:25360:1: ( () )
+            // InternalFormalML.g:25361:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getPseudostateAction_0()); 
+            }
+            // InternalFormalML.g:25362:2: ()
+            // InternalFormalML.g:25362:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getPseudostateAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__1"
+    // InternalFormalML.g:25370:1: rule__EndingPseudostate__Group__1 : rule__EndingPseudostate__Group__1__Impl rule__EndingPseudostate__Group__2 ;
+    public final void rule__EndingPseudostate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25374:1: ( rule__EndingPseudostate__Group__1__Impl rule__EndingPseudostate__Group__2 )
+            // InternalFormalML.g:25375:2: rule__EndingPseudostate__Group__1__Impl rule__EndingPseudostate__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__EndingPseudostate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__1"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__1__Impl"
+    // InternalFormalML.g:25382:1: rule__EndingPseudostate__Group__1__Impl : ( ( rule__EndingPseudostate__Alternatives_1 ) ) ;
+    public final void rule__EndingPseudostate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25386:1: ( ( ( rule__EndingPseudostate__Alternatives_1 ) ) )
+            // InternalFormalML.g:25387:1: ( ( rule__EndingPseudostate__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:25387:1: ( ( rule__EndingPseudostate__Alternatives_1 ) )
+            // InternalFormalML.g:25388:2: ( rule__EndingPseudostate__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:25389:2: ( rule__EndingPseudostate__Alternatives_1 )
+            // InternalFormalML.g:25389:3: rule__EndingPseudostate__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__2"
+    // InternalFormalML.g:25397:1: rule__EndingPseudostate__Group__2 : rule__EndingPseudostate__Group__2__Impl rule__EndingPseudostate__Group__3 ;
+    public final void rule__EndingPseudostate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25401:1: ( rule__EndingPseudostate__Group__2__Impl rule__EndingPseudostate__Group__3 )
+            // InternalFormalML.g:25402:2: rule__EndingPseudostate__Group__2__Impl rule__EndingPseudostate__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_110);
+            rule__EndingPseudostate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__2"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__2__Impl"
+    // InternalFormalML.g:25409:1: rule__EndingPseudostate__Group__2__Impl : ( '<' ) ;
+    public final void rule__EndingPseudostate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25413:1: ( ( '<' ) )
+            // InternalFormalML.g:25414:1: ( '<' )
+            {
+            // InternalFormalML.g:25414:1: ( '<' )
+            // InternalFormalML.g:25415:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getLessThanSignKeyword_2()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getLessThanSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__3"
+    // InternalFormalML.g:25424:1: rule__EndingPseudostate__Group__3 : rule__EndingPseudostate__Group__3__Impl rule__EndingPseudostate__Group__4 ;
+    public final void rule__EndingPseudostate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25428:1: ( rule__EndingPseudostate__Group__3__Impl rule__EndingPseudostate__Group__4 )
+            // InternalFormalML.g:25429:2: rule__EndingPseudostate__Group__3__Impl rule__EndingPseudostate__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_110);
+            rule__EndingPseudostate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__3"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__3__Impl"
+    // InternalFormalML.g:25436:1: rule__EndingPseudostate__Group__3__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__EndingPseudostate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25440:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:25441:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:25441:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:25442:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getMocKeyword_3()); 
+            }
+            // InternalFormalML.g:25443:2: ( 'moc:' )?
+            int alt425=2;
+            int LA425_0 = input.LA(1);
+
+            if ( (LA425_0==201) ) {
+                alt425=1;
+            }
+            switch (alt425) {
+                case 1 :
+                    // InternalFormalML.g:25443:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getMocKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__4"
+    // InternalFormalML.g:25451:1: rule__EndingPseudostate__Group__4 : rule__EndingPseudostate__Group__4__Impl rule__EndingPseudostate__Group__5 ;
+    public final void rule__EndingPseudostate__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25455:1: ( rule__EndingPseudostate__Group__4__Impl rule__EndingPseudostate__Group__5 )
+            // InternalFormalML.g:25456:2: rule__EndingPseudostate__Group__4__Impl rule__EndingPseudostate__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__EndingPseudostate__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__4"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__4__Impl"
+    // InternalFormalML.g:25463:1: rule__EndingPseudostate__Group__4__Impl : ( ( rule__EndingPseudostate__KindAssignment_4 ) ) ;
+    public final void rule__EndingPseudostate__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25467:1: ( ( ( rule__EndingPseudostate__KindAssignment_4 ) ) )
+            // InternalFormalML.g:25468:1: ( ( rule__EndingPseudostate__KindAssignment_4 ) )
+            {
+            // InternalFormalML.g:25468:1: ( ( rule__EndingPseudostate__KindAssignment_4 ) )
+            // InternalFormalML.g:25469:2: ( rule__EndingPseudostate__KindAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getKindAssignment_4()); 
+            }
+            // InternalFormalML.g:25470:2: ( rule__EndingPseudostate__KindAssignment_4 )
+            // InternalFormalML.g:25470:3: rule__EndingPseudostate__KindAssignment_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__KindAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getKindAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__5"
+    // InternalFormalML.g:25478:1: rule__EndingPseudostate__Group__5 : rule__EndingPseudostate__Group__5__Impl rule__EndingPseudostate__Group__6 ;
+    public final void rule__EndingPseudostate__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25482:1: ( rule__EndingPseudostate__Group__5__Impl rule__EndingPseudostate__Group__6 )
+            // InternalFormalML.g:25483:2: rule__EndingPseudostate__Group__5__Impl rule__EndingPseudostate__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__EndingPseudostate__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__5"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__5__Impl"
+    // InternalFormalML.g:25490:1: rule__EndingPseudostate__Group__5__Impl : ( '>' ) ;
+    public final void rule__EndingPseudostate__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25494:1: ( ( '>' ) )
+            // InternalFormalML.g:25495:1: ( '>' )
+            {
+            // InternalFormalML.g:25495:1: ( '>' )
+            // InternalFormalML.g:25496:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getGreaterThanSignKeyword_5()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getGreaterThanSignKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__5__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__6"
+    // InternalFormalML.g:25505:1: rule__EndingPseudostate__Group__6 : rule__EndingPseudostate__Group__6__Impl rule__EndingPseudostate__Group__7 ;
+    public final void rule__EndingPseudostate__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25509:1: ( rule__EndingPseudostate__Group__6__Impl rule__EndingPseudostate__Group__7 )
+            // InternalFormalML.g:25510:2: rule__EndingPseudostate__Group__6__Impl rule__EndingPseudostate__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__EndingPseudostate__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__6"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__6__Impl"
+    // InternalFormalML.g:25517:1: rule__EndingPseudostate__Group__6__Impl : ( ( rule__EndingPseudostate__NameAssignment_6 ) ) ;
+    public final void rule__EndingPseudostate__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25521:1: ( ( ( rule__EndingPseudostate__NameAssignment_6 ) ) )
+            // InternalFormalML.g:25522:1: ( ( rule__EndingPseudostate__NameAssignment_6 ) )
+            {
+            // InternalFormalML.g:25522:1: ( ( rule__EndingPseudostate__NameAssignment_6 ) )
+            // InternalFormalML.g:25523:2: ( rule__EndingPseudostate__NameAssignment_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getNameAssignment_6()); 
+            }
+            // InternalFormalML.g:25524:2: ( rule__EndingPseudostate__NameAssignment_6 )
+            // InternalFormalML.g:25524:3: rule__EndingPseudostate__NameAssignment_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__NameAssignment_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getNameAssignment_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__6__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__7"
+    // InternalFormalML.g:25532:1: rule__EndingPseudostate__Group__7 : rule__EndingPseudostate__Group__7__Impl rule__EndingPseudostate__Group__8 ;
+    public final void rule__EndingPseudostate__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25536:1: ( rule__EndingPseudostate__Group__7__Impl rule__EndingPseudostate__Group__8 )
+            // InternalFormalML.g:25537:2: rule__EndingPseudostate__Group__7__Impl rule__EndingPseudostate__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_82);
+            rule__EndingPseudostate__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__7"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__7__Impl"
+    // InternalFormalML.g:25544:1: rule__EndingPseudostate__Group__7__Impl : ( ( rule__EndingPseudostate__UnrestrictedNameAssignment_7 )? ) ;
+    public final void rule__EndingPseudostate__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25548:1: ( ( ( rule__EndingPseudostate__UnrestrictedNameAssignment_7 )? ) )
+            // InternalFormalML.g:25549:1: ( ( rule__EndingPseudostate__UnrestrictedNameAssignment_7 )? )
+            {
+            // InternalFormalML.g:25549:1: ( ( rule__EndingPseudostate__UnrestrictedNameAssignment_7 )? )
+            // InternalFormalML.g:25550:2: ( rule__EndingPseudostate__UnrestrictedNameAssignment_7 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameAssignment_7()); 
+            }
+            // InternalFormalML.g:25551:2: ( rule__EndingPseudostate__UnrestrictedNameAssignment_7 )?
+            int alt426=2;
+            int LA426_0 = input.LA(1);
+
+            if ( (LA426_0==RULE_STRING) ) {
+                alt426=1;
+            }
+            switch (alt426) {
+                case 1 :
+                    // InternalFormalML.g:25551:3: rule__EndingPseudostate__UnrestrictedNameAssignment_7
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__EndingPseudostate__UnrestrictedNameAssignment_7();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__7__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__8"
+    // InternalFormalML.g:25559:1: rule__EndingPseudostate__Group__8 : rule__EndingPseudostate__Group__8__Impl ;
+    public final void rule__EndingPseudostate__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25563:1: ( rule__EndingPseudostate__Group__8__Impl )
+            // InternalFormalML.g:25564:2: rule__EndingPseudostate__Group__8__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__8"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group__8__Impl"
+    // InternalFormalML.g:25570:1: rule__EndingPseudostate__Group__8__Impl : ( ( rule__EndingPseudostate__Alternatives_8 ) ) ;
+    public final void rule__EndingPseudostate__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25574:1: ( ( ( rule__EndingPseudostate__Alternatives_8 ) ) )
+            // InternalFormalML.g:25575:1: ( ( rule__EndingPseudostate__Alternatives_8 ) )
+            {
+            // InternalFormalML.g:25575:1: ( ( rule__EndingPseudostate__Alternatives_8 ) )
+            // InternalFormalML.g:25576:2: ( rule__EndingPseudostate__Alternatives_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:25577:2: ( rule__EndingPseudostate__Alternatives_8 )
+            // InternalFormalML.g:25577:3: rule__EndingPseudostate__Alternatives_8
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Alternatives_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group__8__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group_8_0__0"
+    // InternalFormalML.g:25586:1: rule__EndingPseudostate__Group_8_0__0 : rule__EndingPseudostate__Group_8_0__0__Impl rule__EndingPseudostate__Group_8_0__1 ;
+    public final void rule__EndingPseudostate__Group_8_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25590:1: ( rule__EndingPseudostate__Group_8_0__0__Impl rule__EndingPseudostate__Group_8_0__1 )
+            // InternalFormalML.g:25591:2: rule__EndingPseudostate__Group_8_0__0__Impl rule__EndingPseudostate__Group_8_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_101);
+            rule__EndingPseudostate__Group_8_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group_8_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group_8_0__0"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group_8_0__0__Impl"
+    // InternalFormalML.g:25598:1: rule__EndingPseudostate__Group_8_0__0__Impl : ( '{' ) ;
+    public final void rule__EndingPseudostate__Group_8_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25602:1: ( ( '{' ) )
+            // InternalFormalML.g:25603:1: ( '{' )
+            {
+            // InternalFormalML.g:25603:1: ( '{' )
+            // InternalFormalML.g:25604:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group_8_0__0__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group_8_0__1"
+    // InternalFormalML.g:25613:1: rule__EndingPseudostate__Group_8_0__1 : rule__EndingPseudostate__Group_8_0__1__Impl rule__EndingPseudostate__Group_8_0__2 ;
+    public final void rule__EndingPseudostate__Group_8_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25617:1: ( rule__EndingPseudostate__Group_8_0__1__Impl rule__EndingPseudostate__Group_8_0__2 )
+            // InternalFormalML.g:25618:2: rule__EndingPseudostate__Group_8_0__1__Impl rule__EndingPseudostate__Group_8_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_101);
+            rule__EndingPseudostate__Group_8_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group_8_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group_8_0__1"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group_8_0__1__Impl"
+    // InternalFormalML.g:25625:1: rule__EndingPseudostate__Group_8_0__1__Impl : ( ( rule__EndingPseudostate__MoeAssignment_8_0_1 )* ) ;
+    public final void rule__EndingPseudostate__Group_8_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25629:1: ( ( ( rule__EndingPseudostate__MoeAssignment_8_0_1 )* ) )
+            // InternalFormalML.g:25630:1: ( ( rule__EndingPseudostate__MoeAssignment_8_0_1 )* )
+            {
+            // InternalFormalML.g:25630:1: ( ( rule__EndingPseudostate__MoeAssignment_8_0_1 )* )
+            // InternalFormalML.g:25631:2: ( rule__EndingPseudostate__MoeAssignment_8_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getMoeAssignment_8_0_1()); 
+            }
+            // InternalFormalML.g:25632:2: ( rule__EndingPseudostate__MoeAssignment_8_0_1 )*
+            loop427:
+            do {
+                int alt427=2;
+                int LA427_0 = input.LA(1);
+
+                if ( ((LA427_0>=47 && LA427_0<=48)) ) {
+                    alt427=1;
+                }
+
+
+                switch (alt427) {
+            	case 1 :
+            	    // InternalFormalML.g:25632:3: rule__EndingPseudostate__MoeAssignment_8_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_102);
+            	    rule__EndingPseudostate__MoeAssignment_8_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop427;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getMoeAssignment_8_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group_8_0__1__Impl"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group_8_0__2"
+    // InternalFormalML.g:25640:1: rule__EndingPseudostate__Group_8_0__2 : rule__EndingPseudostate__Group_8_0__2__Impl ;
+    public final void rule__EndingPseudostate__Group_8_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25644:1: ( rule__EndingPseudostate__Group_8_0__2__Impl )
+            // InternalFormalML.g:25645:2: rule__EndingPseudostate__Group_8_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EndingPseudostate__Group_8_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group_8_0__2"
+
+
+    // $ANTLR start "rule__EndingPseudostate__Group_8_0__2__Impl"
+    // InternalFormalML.g:25651:1: rule__EndingPseudostate__Group_8_0__2__Impl : ( '}' ) ;
+    public final void rule__EndingPseudostate__Group_8_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25655:1: ( ( '}' ) )
+            // InternalFormalML.g:25656:1: ( '}' )
+            {
+            // InternalFormalML.g:25656:1: ( '}' )
+            // InternalFormalML.g:25657:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getRightCurlyBracketKeyword_8_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getRightCurlyBracketKeyword_8_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__Group_8_0__2__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__0"
+    // InternalFormalML.g:25667:1: rule__ModelOfExecution__Group__0 : rule__ModelOfExecution__Group__0__Impl rule__ModelOfExecution__Group__1 ;
+    public final void rule__ModelOfExecution__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25671:1: ( rule__ModelOfExecution__Group__0__Impl rule__ModelOfExecution__Group__1 )
+            // InternalFormalML.g:25672:2: rule__ModelOfExecution__Group__0__Impl rule__ModelOfExecution__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_111);
+            rule__ModelOfExecution__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__0__Impl"
+    // InternalFormalML.g:25679:1: rule__ModelOfExecution__Group__0__Impl : ( () ) ;
+    public final void rule__ModelOfExecution__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25683:1: ( ( () ) )
+            // InternalFormalML.g:25684:1: ( () )
+            {
+            // InternalFormalML.g:25684:1: ( () )
+            // InternalFormalML.g:25685:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getModelOfExecutionAction_0()); 
+            }
+            // InternalFormalML.g:25686:2: ()
+            // InternalFormalML.g:25686:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getModelOfExecutionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__1"
+    // InternalFormalML.g:25694:1: rule__ModelOfExecution__Group__1 : rule__ModelOfExecution__Group__1__Impl rule__ModelOfExecution__Group__2 ;
+    public final void rule__ModelOfExecution__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25698:1: ( rule__ModelOfExecution__Group__1__Impl rule__ModelOfExecution__Group__2 )
+            // InternalFormalML.g:25699:2: rule__ModelOfExecution__Group__1__Impl rule__ModelOfExecution__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_112);
+            rule__ModelOfExecution__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__1__Impl"
+    // InternalFormalML.g:25706:1: rule__ModelOfExecution__Group__1__Impl : ( '@moe:' ) ;
+    public final void rule__ModelOfExecution__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25710:1: ( ( '@moe:' ) )
+            // InternalFormalML.g:25711:1: ( '@moe:' )
+            {
+            // InternalFormalML.g:25711:1: ( '@moe:' )
+            // InternalFormalML.g:25712:2: '@moe:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getMoeKeyword_1()); 
+            }
+            match(input,221,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getMoeKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__2"
+    // InternalFormalML.g:25721:1: rule__ModelOfExecution__Group__2 : rule__ModelOfExecution__Group__2__Impl rule__ModelOfExecution__Group__3 ;
+    public final void rule__ModelOfExecution__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25725:1: ( rule__ModelOfExecution__Group__2__Impl rule__ModelOfExecution__Group__3 )
+            // InternalFormalML.g:25726:2: rule__ModelOfExecution__Group__2__Impl rule__ModelOfExecution__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_112);
+            rule__ModelOfExecution__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__2"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__2__Impl"
+    // InternalFormalML.g:25733:1: rule__ModelOfExecution__Group__2__Impl : ( ( rule__ModelOfExecution__RoutineAssignment_2 )* ) ;
+    public final void rule__ModelOfExecution__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25737:1: ( ( ( rule__ModelOfExecution__RoutineAssignment_2 )* ) )
+            // InternalFormalML.g:25738:1: ( ( rule__ModelOfExecution__RoutineAssignment_2 )* )
+            {
+            // InternalFormalML.g:25738:1: ( ( rule__ModelOfExecution__RoutineAssignment_2 )* )
+            // InternalFormalML.g:25739:2: ( rule__ModelOfExecution__RoutineAssignment_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_2()); 
+            }
+            // InternalFormalML.g:25740:2: ( rule__ModelOfExecution__RoutineAssignment_2 )*
+            loop428:
+            do {
+                int alt428=2;
+                alt428 = dfa428.predict(input);
+                switch (alt428) {
+            	case 1 :
+            	    // InternalFormalML.g:25740:3: rule__ModelOfExecution__RoutineAssignment_2
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_43);
+            	    rule__ModelOfExecution__RoutineAssignment_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop428;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__3"
+    // InternalFormalML.g:25748:1: rule__ModelOfExecution__Group__3 : rule__ModelOfExecution__Group__3__Impl rule__ModelOfExecution__Group__4 ;
+    public final void rule__ModelOfExecution__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25752:1: ( rule__ModelOfExecution__Group__3__Impl rule__ModelOfExecution__Group__4 )
+            // InternalFormalML.g:25753:2: rule__ModelOfExecution__Group__3__Impl rule__ModelOfExecution__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_42);
+            rule__ModelOfExecution__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__3"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__3__Impl"
+    // InternalFormalML.g:25760:1: rule__ModelOfExecution__Group__3__Impl : ( ( rule__ModelOfExecution__UnorderedGroup_3 ) ) ;
+    public final void rule__ModelOfExecution__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25764:1: ( ( ( rule__ModelOfExecution__UnorderedGroup_3 ) ) )
+            // InternalFormalML.g:25765:1: ( ( rule__ModelOfExecution__UnorderedGroup_3 ) )
+            {
+            // InternalFormalML.g:25765:1: ( ( rule__ModelOfExecution__UnorderedGroup_3 ) )
+            // InternalFormalML.g:25766:2: ( rule__ModelOfExecution__UnorderedGroup_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()); 
+            }
+            // InternalFormalML.g:25767:2: ( rule__ModelOfExecution__UnorderedGroup_3 )
+            // InternalFormalML.g:25767:3: rule__ModelOfExecution__UnorderedGroup_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__UnorderedGroup_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__4"
+    // InternalFormalML.g:25775:1: rule__ModelOfExecution__Group__4 : rule__ModelOfExecution__Group__4__Impl ;
+    public final void rule__ModelOfExecution__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25779:1: ( rule__ModelOfExecution__Group__4__Impl )
+            // InternalFormalML.g:25780:2: rule__ModelOfExecution__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__4"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group__4__Impl"
+    // InternalFormalML.g:25786:1: rule__ModelOfExecution__Group__4__Impl : ( ( rule__ModelOfExecution__RoutineAssignment_4 )* ) ;
+    public final void rule__ModelOfExecution__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25790:1: ( ( ( rule__ModelOfExecution__RoutineAssignment_4 )* ) )
+            // InternalFormalML.g:25791:1: ( ( rule__ModelOfExecution__RoutineAssignment_4 )* )
+            {
+            // InternalFormalML.g:25791:1: ( ( rule__ModelOfExecution__RoutineAssignment_4 )* )
+            // InternalFormalML.g:25792:2: ( rule__ModelOfExecution__RoutineAssignment_4 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_4()); 
+            }
+            // InternalFormalML.g:25793:2: ( rule__ModelOfExecution__RoutineAssignment_4 )*
+            loop429:
+            do {
+                int alt429=2;
+                int LA429_0 = input.LA(1);
+
+                if ( (LA429_0==28||(LA429_0>=143 && LA429_0<=145)||(LA429_0>=224 && LA429_0<=225)) ) {
+                    alt429=1;
+                }
+
+
+                switch (alt429) {
+            	case 1 :
+            	    // InternalFormalML.g:25793:3: rule__ModelOfExecution__RoutineAssignment_4
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_43);
+            	    rule__ModelOfExecution__RoutineAssignment_4();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop429;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getRoutineAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_0__0"
+    // InternalFormalML.g:25802:1: rule__ModelOfExecution__Group_3_0__0 : rule__ModelOfExecution__Group_3_0__0__Impl rule__ModelOfExecution__Group_3_0__1 ;
+    public final void rule__ModelOfExecution__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25806:1: ( rule__ModelOfExecution__Group_3_0__0__Impl rule__ModelOfExecution__Group_3_0__1 )
+            // InternalFormalML.g:25807:2: rule__ModelOfExecution__Group_3_0__0__Impl rule__ModelOfExecution__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ModelOfExecution__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_0__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_0__0__Impl"
+    // InternalFormalML.g:25814:1: rule__ModelOfExecution__Group_3_0__0__Impl : ( '@init' ) ;
+    public final void rule__ModelOfExecution__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25818:1: ( ( '@init' ) )
+            // InternalFormalML.g:25819:1: ( '@init' )
+            {
+            // InternalFormalML.g:25819:1: ( '@init' )
+            // InternalFormalML.g:25820:2: '@init'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getInitKeyword_3_0_0()); 
+            }
+            match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getInitKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_0__1"
+    // InternalFormalML.g:25829:1: rule__ModelOfExecution__Group_3_0__1 : rule__ModelOfExecution__Group_3_0__1__Impl ;
+    public final void rule__ModelOfExecution__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25833:1: ( rule__ModelOfExecution__Group_3_0__1__Impl )
+            // InternalFormalML.g:25834:2: rule__ModelOfExecution__Group_3_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_0__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_0__1__Impl"
+    // InternalFormalML.g:25840:1: rule__ModelOfExecution__Group_3_0__1__Impl : ( ( rule__ModelOfExecution__InitRoutineAssignment_3_0_1 ) ) ;
+    public final void rule__ModelOfExecution__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25844:1: ( ( ( rule__ModelOfExecution__InitRoutineAssignment_3_0_1 ) ) )
+            // InternalFormalML.g:25845:1: ( ( rule__ModelOfExecution__InitRoutineAssignment_3_0_1 ) )
+            {
+            // InternalFormalML.g:25845:1: ( ( rule__ModelOfExecution__InitRoutineAssignment_3_0_1 ) )
+            // InternalFormalML.g:25846:2: ( rule__ModelOfExecution__InitRoutineAssignment_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getInitRoutineAssignment_3_0_1()); 
+            }
+            // InternalFormalML.g:25847:2: ( rule__ModelOfExecution__InitRoutineAssignment_3_0_1 )
+            // InternalFormalML.g:25847:3: rule__ModelOfExecution__InitRoutineAssignment_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__InitRoutineAssignment_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getInitRoutineAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_1__0"
+    // InternalFormalML.g:25856:1: rule__ModelOfExecution__Group_3_1__0 : rule__ModelOfExecution__Group_3_1__0__Impl rule__ModelOfExecution__Group_3_1__1 ;
+    public final void rule__ModelOfExecution__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25860:1: ( rule__ModelOfExecution__Group_3_1__0__Impl rule__ModelOfExecution__Group_3_1__1 )
+            // InternalFormalML.g:25861:2: rule__ModelOfExecution__Group_3_1__0__Impl rule__ModelOfExecution__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ModelOfExecution__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_1__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_1__0__Impl"
+    // InternalFormalML.g:25868:1: rule__ModelOfExecution__Group_3_1__0__Impl : ( '@final' ) ;
+    public final void rule__ModelOfExecution__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25872:1: ( ( '@final' ) )
+            // InternalFormalML.g:25873:1: ( '@final' )
+            {
+            // InternalFormalML.g:25873:1: ( '@final' )
+            // InternalFormalML.g:25874:2: '@final'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getFinalKeyword_3_1_0()); 
+            }
+            match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getFinalKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_1__1"
+    // InternalFormalML.g:25883:1: rule__ModelOfExecution__Group_3_1__1 : rule__ModelOfExecution__Group_3_1__1__Impl ;
+    public final void rule__ModelOfExecution__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25887:1: ( rule__ModelOfExecution__Group_3_1__1__Impl )
+            // InternalFormalML.g:25888:2: rule__ModelOfExecution__Group_3_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_1__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_1__1__Impl"
+    // InternalFormalML.g:25894:1: rule__ModelOfExecution__Group_3_1__1__Impl : ( ( rule__ModelOfExecution__FinalRoutineAssignment_3_1_1 ) ) ;
+    public final void rule__ModelOfExecution__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25898:1: ( ( ( rule__ModelOfExecution__FinalRoutineAssignment_3_1_1 ) ) )
+            // InternalFormalML.g:25899:1: ( ( rule__ModelOfExecution__FinalRoutineAssignment_3_1_1 ) )
+            {
+            // InternalFormalML.g:25899:1: ( ( rule__ModelOfExecution__FinalRoutineAssignment_3_1_1 ) )
+            // InternalFormalML.g:25900:2: ( rule__ModelOfExecution__FinalRoutineAssignment_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getFinalRoutineAssignment_3_1_1()); 
+            }
+            // InternalFormalML.g:25901:2: ( rule__ModelOfExecution__FinalRoutineAssignment_3_1_1 )
+            // InternalFormalML.g:25901:3: rule__ModelOfExecution__FinalRoutineAssignment_3_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__FinalRoutineAssignment_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getFinalRoutineAssignment_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_2__0"
+    // InternalFormalML.g:25910:1: rule__ModelOfExecution__Group_3_2__0 : rule__ModelOfExecution__Group_3_2__0__Impl rule__ModelOfExecution__Group_3_2__1 ;
+    public final void rule__ModelOfExecution__Group_3_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25914:1: ( rule__ModelOfExecution__Group_3_2__0__Impl rule__ModelOfExecution__Group_3_2__1 )
+            // InternalFormalML.g:25915:2: rule__ModelOfExecution__Group_3_2__0__Impl rule__ModelOfExecution__Group_3_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ModelOfExecution__Group_3_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_2__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_2__0__Impl"
+    // InternalFormalML.g:25922:1: rule__ModelOfExecution__Group_3_2__0__Impl : ( '@enable' ) ;
+    public final void rule__ModelOfExecution__Group_3_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25926:1: ( ( '@enable' ) )
+            // InternalFormalML.g:25927:1: ( '@enable' )
+            {
+            // InternalFormalML.g:25927:1: ( '@enable' )
+            // InternalFormalML.g:25928:2: '@enable'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getEnableKeyword_3_2_0()); 
+            }
+            match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getEnableKeyword_3_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_2__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_2__1"
+    // InternalFormalML.g:25937:1: rule__ModelOfExecution__Group_3_2__1 : rule__ModelOfExecution__Group_3_2__1__Impl ;
+    public final void rule__ModelOfExecution__Group_3_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25941:1: ( rule__ModelOfExecution__Group_3_2__1__Impl )
+            // InternalFormalML.g:25942:2: rule__ModelOfExecution__Group_3_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_2__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_2__1__Impl"
+    // InternalFormalML.g:25948:1: rule__ModelOfExecution__Group_3_2__1__Impl : ( ( rule__ModelOfExecution__EnableRoutineAssignment_3_2_1 ) ) ;
+    public final void rule__ModelOfExecution__Group_3_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25952:1: ( ( ( rule__ModelOfExecution__EnableRoutineAssignment_3_2_1 ) ) )
+            // InternalFormalML.g:25953:1: ( ( rule__ModelOfExecution__EnableRoutineAssignment_3_2_1 ) )
+            {
+            // InternalFormalML.g:25953:1: ( ( rule__ModelOfExecution__EnableRoutineAssignment_3_2_1 ) )
+            // InternalFormalML.g:25954:2: ( rule__ModelOfExecution__EnableRoutineAssignment_3_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getEnableRoutineAssignment_3_2_1()); 
+            }
+            // InternalFormalML.g:25955:2: ( rule__ModelOfExecution__EnableRoutineAssignment_3_2_1 )
+            // InternalFormalML.g:25955:3: rule__ModelOfExecution__EnableRoutineAssignment_3_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__EnableRoutineAssignment_3_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getEnableRoutineAssignment_3_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_2__1__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_3__0"
+    // InternalFormalML.g:25964:1: rule__ModelOfExecution__Group_3_3__0 : rule__ModelOfExecution__Group_3_3__0__Impl rule__ModelOfExecution__Group_3_3__1 ;
+    public final void rule__ModelOfExecution__Group_3_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25968:1: ( rule__ModelOfExecution__Group_3_3__0__Impl rule__ModelOfExecution__Group_3_3__1 )
+            // InternalFormalML.g:25969:2: rule__ModelOfExecution__Group_3_3__0__Impl rule__ModelOfExecution__Group_3_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ModelOfExecution__Group_3_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_3__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_3__0__Impl"
+    // InternalFormalML.g:25976:1: rule__ModelOfExecution__Group_3_3__0__Impl : ( '@disable' ) ;
+    public final void rule__ModelOfExecution__Group_3_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25980:1: ( ( '@disable' ) )
+            // InternalFormalML.g:25981:1: ( '@disable' )
+            {
+            // InternalFormalML.g:25981:1: ( '@disable' )
+            // InternalFormalML.g:25982:2: '@disable'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getDisableKeyword_3_3_0()); 
+            }
+            match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getDisableKeyword_3_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_3__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_3__1"
+    // InternalFormalML.g:25991:1: rule__ModelOfExecution__Group_3_3__1 : rule__ModelOfExecution__Group_3_3__1__Impl ;
+    public final void rule__ModelOfExecution__Group_3_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:25995:1: ( rule__ModelOfExecution__Group_3_3__1__Impl )
+            // InternalFormalML.g:25996:2: rule__ModelOfExecution__Group_3_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_3__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_3__1__Impl"
+    // InternalFormalML.g:26002:1: rule__ModelOfExecution__Group_3_3__1__Impl : ( ( rule__ModelOfExecution__DisableRoutineAssignment_3_3_1 ) ) ;
+    public final void rule__ModelOfExecution__Group_3_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26006:1: ( ( ( rule__ModelOfExecution__DisableRoutineAssignment_3_3_1 ) ) )
+            // InternalFormalML.g:26007:1: ( ( rule__ModelOfExecution__DisableRoutineAssignment_3_3_1 ) )
+            {
+            // InternalFormalML.g:26007:1: ( ( rule__ModelOfExecution__DisableRoutineAssignment_3_3_1 ) )
+            // InternalFormalML.g:26008:2: ( rule__ModelOfExecution__DisableRoutineAssignment_3_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getDisableRoutineAssignment_3_3_1()); 
+            }
+            // InternalFormalML.g:26009:2: ( rule__ModelOfExecution__DisableRoutineAssignment_3_3_1 )
+            // InternalFormalML.g:26009:3: rule__ModelOfExecution__DisableRoutineAssignment_3_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__DisableRoutineAssignment_3_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getDisableRoutineAssignment_3_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_3__1__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_4__0"
+    // InternalFormalML.g:26018:1: rule__ModelOfExecution__Group_3_4__0 : rule__ModelOfExecution__Group_3_4__0__Impl rule__ModelOfExecution__Group_3_4__1 ;
+    public final void rule__ModelOfExecution__Group_3_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26022:1: ( rule__ModelOfExecution__Group_3_4__0__Impl rule__ModelOfExecution__Group_3_4__1 )
+            // InternalFormalML.g:26023:2: rule__ModelOfExecution__Group_3_4__0__Impl rule__ModelOfExecution__Group_3_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ModelOfExecution__Group_3_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_4__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_4__0__Impl"
+    // InternalFormalML.g:26030:1: rule__ModelOfExecution__Group_3_4__0__Impl : ( '@concurrency' ) ;
+    public final void rule__ModelOfExecution__Group_3_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26034:1: ( ( '@concurrency' ) )
+            // InternalFormalML.g:26035:1: ( '@concurrency' )
+            {
+            // InternalFormalML.g:26035:1: ( '@concurrency' )
+            // InternalFormalML.g:26036:2: '@concurrency'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getConcurrencyKeyword_3_4_0()); 
+            }
+            match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getConcurrencyKeyword_3_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_4__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_4__1"
+    // InternalFormalML.g:26045:1: rule__ModelOfExecution__Group_3_4__1 : rule__ModelOfExecution__Group_3_4__1__Impl ;
+    public final void rule__ModelOfExecution__Group_3_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26049:1: ( rule__ModelOfExecution__Group_3_4__1__Impl )
+            // InternalFormalML.g:26050:2: rule__ModelOfExecution__Group_3_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_4__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_4__1__Impl"
+    // InternalFormalML.g:26056:1: rule__ModelOfExecution__Group_3_4__1__Impl : ( ( rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1 ) ) ;
+    public final void rule__ModelOfExecution__Group_3_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26060:1: ( ( ( rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1 ) ) )
+            // InternalFormalML.g:26061:1: ( ( rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1 ) )
+            {
+            // InternalFormalML.g:26061:1: ( ( rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1 ) )
+            // InternalFormalML.g:26062:2: ( rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineAssignment_3_4_1()); 
+            }
+            // InternalFormalML.g:26063:2: ( rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1 )
+            // InternalFormalML.g:26063:3: rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineAssignment_3_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_4__1__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_5__0"
+    // InternalFormalML.g:26072:1: rule__ModelOfExecution__Group_3_5__0 : rule__ModelOfExecution__Group_3_5__0__Impl rule__ModelOfExecution__Group_3_5__1 ;
+    public final void rule__ModelOfExecution__Group_3_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26076:1: ( rule__ModelOfExecution__Group_3_5__0__Impl rule__ModelOfExecution__Group_3_5__1 )
+            // InternalFormalML.g:26077:2: rule__ModelOfExecution__Group_3_5__0__Impl rule__ModelOfExecution__Group_3_5__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ModelOfExecution__Group_3_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_5__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_5__0__Impl"
+    // InternalFormalML.g:26084:1: rule__ModelOfExecution__Group_3_5__0__Impl : ( '@schedule' ) ;
+    public final void rule__ModelOfExecution__Group_3_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26088:1: ( ( '@schedule' ) )
+            // InternalFormalML.g:26089:1: ( '@schedule' )
+            {
+            // InternalFormalML.g:26089:1: ( '@schedule' )
+            // InternalFormalML.g:26090:2: '@schedule'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getScheduleKeyword_3_5_0()); 
+            }
+            match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getScheduleKeyword_3_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_5__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_5__1"
+    // InternalFormalML.g:26099:1: rule__ModelOfExecution__Group_3_5__1 : rule__ModelOfExecution__Group_3_5__1__Impl ;
+    public final void rule__ModelOfExecution__Group_3_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26103:1: ( rule__ModelOfExecution__Group_3_5__1__Impl )
+            // InternalFormalML.g:26104:2: rule__ModelOfExecution__Group_3_5__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_5__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_5__1__Impl"
+    // InternalFormalML.g:26110:1: rule__ModelOfExecution__Group_3_5__1__Impl : ( ( rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1 ) ) ;
+    public final void rule__ModelOfExecution__Group_3_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26114:1: ( ( ( rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1 ) ) )
+            // InternalFormalML.g:26115:1: ( ( rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1 ) )
+            {
+            // InternalFormalML.g:26115:1: ( ( rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1 ) )
+            // InternalFormalML.g:26116:2: ( rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineAssignment_3_5_1()); 
+            }
+            // InternalFormalML.g:26117:2: ( rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1 )
+            // InternalFormalML.g:26117:3: rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineAssignment_3_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_5__1__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_6__0"
+    // InternalFormalML.g:26126:1: rule__ModelOfExecution__Group_3_6__0 : rule__ModelOfExecution__Group_3_6__0__Impl rule__ModelOfExecution__Group_3_6__1 ;
+    public final void rule__ModelOfExecution__Group_3_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26130:1: ( rule__ModelOfExecution__Group_3_6__0__Impl rule__ModelOfExecution__Group_3_6__1 )
+            // InternalFormalML.g:26131:2: rule__ModelOfExecution__Group_3_6__0__Impl rule__ModelOfExecution__Group_3_6__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ModelOfExecution__Group_3_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_6__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_6__0__Impl"
+    // InternalFormalML.g:26138:1: rule__ModelOfExecution__Group_3_6__0__Impl : ( '@irun' ) ;
+    public final void rule__ModelOfExecution__Group_3_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26142:1: ( ( '@irun' ) )
+            // InternalFormalML.g:26143:1: ( '@irun' )
+            {
+            // InternalFormalML.g:26143:1: ( '@irun' )
+            // InternalFormalML.g:26144:2: '@irun'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getIrunKeyword_3_6_0()); 
+            }
+            match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getIrunKeyword_3_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_6__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_6__1"
+    // InternalFormalML.g:26153:1: rule__ModelOfExecution__Group_3_6__1 : rule__ModelOfExecution__Group_3_6__1__Impl ;
+    public final void rule__ModelOfExecution__Group_3_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26157:1: ( rule__ModelOfExecution__Group_3_6__1__Impl )
+            // InternalFormalML.g:26158:2: rule__ModelOfExecution__Group_3_6__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_6__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_6__1__Impl"
+    // InternalFormalML.g:26164:1: rule__ModelOfExecution__Group_3_6__1__Impl : ( ( rule__ModelOfExecution__IrunRoutineAssignment_3_6_1 ) ) ;
+    public final void rule__ModelOfExecution__Group_3_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26168:1: ( ( ( rule__ModelOfExecution__IrunRoutineAssignment_3_6_1 ) ) )
+            // InternalFormalML.g:26169:1: ( ( rule__ModelOfExecution__IrunRoutineAssignment_3_6_1 ) )
+            {
+            // InternalFormalML.g:26169:1: ( ( rule__ModelOfExecution__IrunRoutineAssignment_3_6_1 ) )
+            // InternalFormalML.g:26170:2: ( rule__ModelOfExecution__IrunRoutineAssignment_3_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getIrunRoutineAssignment_3_6_1()); 
+            }
+            // InternalFormalML.g:26171:2: ( rule__ModelOfExecution__IrunRoutineAssignment_3_6_1 )
+            // InternalFormalML.g:26171:3: rule__ModelOfExecution__IrunRoutineAssignment_3_6_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__IrunRoutineAssignment_3_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getIrunRoutineAssignment_3_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_6__1__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_7__0"
+    // InternalFormalML.g:26180:1: rule__ModelOfExecution__Group_3_7__0 : rule__ModelOfExecution__Group_3_7__0__Impl rule__ModelOfExecution__Group_3_7__1 ;
+    public final void rule__ModelOfExecution__Group_3_7__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26184:1: ( rule__ModelOfExecution__Group_3_7__0__Impl rule__ModelOfExecution__Group_3_7__1 )
+            // InternalFormalML.g:26185:2: rule__ModelOfExecution__Group_3_7__0__Impl rule__ModelOfExecution__Group_3_7__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ModelOfExecution__Group_3_7__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_7__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_7__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_7__0__Impl"
+    // InternalFormalML.g:26192:1: rule__ModelOfExecution__Group_3_7__0__Impl : ( '@run' ) ;
+    public final void rule__ModelOfExecution__Group_3_7__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26196:1: ( ( '@run' ) )
+            // InternalFormalML.g:26197:1: ( '@run' )
+            {
+            // InternalFormalML.g:26197:1: ( '@run' )
+            // InternalFormalML.g:26198:2: '@run'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getRunKeyword_3_7_0()); 
+            }
+            match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getRunKeyword_3_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_7__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_7__1"
+    // InternalFormalML.g:26207:1: rule__ModelOfExecution__Group_3_7__1 : rule__ModelOfExecution__Group_3_7__1__Impl ;
+    public final void rule__ModelOfExecution__Group_3_7__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26211:1: ( rule__ModelOfExecution__Group_3_7__1__Impl )
+            // InternalFormalML.g:26212:2: rule__ModelOfExecution__Group_3_7__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__Group_3_7__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_7__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__Group_3_7__1__Impl"
+    // InternalFormalML.g:26218:1: rule__ModelOfExecution__Group_3_7__1__Impl : ( ( rule__ModelOfExecution__RunRoutineAssignment_3_7_1 ) ) ;
+    public final void rule__ModelOfExecution__Group_3_7__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26222:1: ( ( ( rule__ModelOfExecution__RunRoutineAssignment_3_7_1 ) ) )
+            // InternalFormalML.g:26223:1: ( ( rule__ModelOfExecution__RunRoutineAssignment_3_7_1 ) )
+            {
+            // InternalFormalML.g:26223:1: ( ( rule__ModelOfExecution__RunRoutineAssignment_3_7_1 ) )
+            // InternalFormalML.g:26224:2: ( rule__ModelOfExecution__RunRoutineAssignment_3_7_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getRunRoutineAssignment_3_7_1()); 
+            }
+            // InternalFormalML.g:26225:2: ( rule__ModelOfExecution__RunRoutineAssignment_3_7_1 )
+            // InternalFormalML.g:26225:3: rule__ModelOfExecution__RunRoutineAssignment_3_7_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__RunRoutineAssignment_3_7_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getRunRoutineAssignment_3_7_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__Group_3_7__1__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group__0"
+    // InternalFormalML.g:26234:1: rule__MoeRoutine__Group__0 : rule__MoeRoutine__Group__0__Impl rule__MoeRoutine__Group__1 ;
+    public final void rule__MoeRoutine__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26238:1: ( rule__MoeRoutine__Group__0__Impl rule__MoeRoutine__Group__1 )
+            // InternalFormalML.g:26239:2: rule__MoeRoutine__Group__0__Impl rule__MoeRoutine__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__MoeRoutine__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group__0"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group__0__Impl"
+    // InternalFormalML.g:26246:1: rule__MoeRoutine__Group__0__Impl : ( () ) ;
+    public final void rule__MoeRoutine__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26250:1: ( ( () ) )
+            // InternalFormalML.g:26251:1: ( () )
+            {
+            // InternalFormalML.g:26251:1: ( () )
+            // InternalFormalML.g:26252:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getRoutineAction_0()); 
+            }
+            // InternalFormalML.g:26253:2: ()
+            // InternalFormalML.g:26253:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getRoutineAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group__1"
+    // InternalFormalML.g:26261:1: rule__MoeRoutine__Group__1 : rule__MoeRoutine__Group__1__Impl rule__MoeRoutine__Group__2 ;
+    public final void rule__MoeRoutine__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26265:1: ( rule__MoeRoutine__Group__1__Impl rule__MoeRoutine__Group__2 )
+            // InternalFormalML.g:26266:2: rule__MoeRoutine__Group__1__Impl rule__MoeRoutine__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__MoeRoutine__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group__1"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group__1__Impl"
+    // InternalFormalML.g:26273:1: rule__MoeRoutine__Group__1__Impl : ( ( rule__MoeRoutine__Group_1__0 )? ) ;
+    public final void rule__MoeRoutine__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26277:1: ( ( ( rule__MoeRoutine__Group_1__0 )? ) )
+            // InternalFormalML.g:26278:1: ( ( rule__MoeRoutine__Group_1__0 )? )
+            {
+            // InternalFormalML.g:26278:1: ( ( rule__MoeRoutine__Group_1__0 )? )
+            // InternalFormalML.g:26279:2: ( rule__MoeRoutine__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:26280:2: ( rule__MoeRoutine__Group_1__0 )?
+            int alt430=2;
+            int LA430_0 = input.LA(1);
+
+            if ( (LA430_0==23) ) {
+                alt430=1;
+            }
+            switch (alt430) {
+                case 1 :
+                    // InternalFormalML.g:26280:3: rule__MoeRoutine__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeRoutine__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group__2"
+    // InternalFormalML.g:26288:1: rule__MoeRoutine__Group__2 : rule__MoeRoutine__Group__2__Impl rule__MoeRoutine__Group__3 ;
+    public final void rule__MoeRoutine__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26292:1: ( rule__MoeRoutine__Group__2__Impl rule__MoeRoutine__Group__3 )
+            // InternalFormalML.g:26293:2: rule__MoeRoutine__Group__2__Impl rule__MoeRoutine__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__MoeRoutine__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group__2"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group__2__Impl"
+    // InternalFormalML.g:26300:1: rule__MoeRoutine__Group__2__Impl : ( ( rule__MoeRoutine__Group_2__0 )? ) ;
+    public final void rule__MoeRoutine__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26304:1: ( ( ( rule__MoeRoutine__Group_2__0 )? ) )
+            // InternalFormalML.g:26305:1: ( ( rule__MoeRoutine__Group_2__0 )? )
+            {
+            // InternalFormalML.g:26305:1: ( ( rule__MoeRoutine__Group_2__0 )? )
+            // InternalFormalML.g:26306:2: ( rule__MoeRoutine__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:26307:2: ( rule__MoeRoutine__Group_2__0 )?
+            int alt431=2;
+            int LA431_0 = input.LA(1);
+
+            if ( (LA431_0==21) ) {
+                alt431=1;
+            }
+            switch (alt431) {
+                case 1 :
+                    // InternalFormalML.g:26307:3: rule__MoeRoutine__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeRoutine__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group__2__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group__3"
+    // InternalFormalML.g:26315:1: rule__MoeRoutine__Group__3 : rule__MoeRoutine__Group__3__Impl ;
+    public final void rule__MoeRoutine__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26319:1: ( rule__MoeRoutine__Group__3__Impl )
+            // InternalFormalML.g:26320:2: rule__MoeRoutine__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group__3"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group__3__Impl"
+    // InternalFormalML.g:26326:1: rule__MoeRoutine__Group__3__Impl : ( ( rule__MoeRoutine__BodyBlockAssignment_3 ) ) ;
+    public final void rule__MoeRoutine__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26330:1: ( ( ( rule__MoeRoutine__BodyBlockAssignment_3 ) ) )
+            // InternalFormalML.g:26331:1: ( ( rule__MoeRoutine__BodyBlockAssignment_3 ) )
+            {
+            // InternalFormalML.g:26331:1: ( ( rule__MoeRoutine__BodyBlockAssignment_3 ) )
+            // InternalFormalML.g:26332:2: ( rule__MoeRoutine__BodyBlockAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getBodyBlockAssignment_3()); 
+            }
+            // InternalFormalML.g:26333:2: ( rule__MoeRoutine__BodyBlockAssignment_3 )
+            // InternalFormalML.g:26333:3: rule__MoeRoutine__BodyBlockAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__BodyBlockAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getBodyBlockAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group__3__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_1__0"
+    // InternalFormalML.g:26342:1: rule__MoeRoutine__Group_1__0 : rule__MoeRoutine__Group_1__0__Impl rule__MoeRoutine__Group_1__1 ;
+    public final void rule__MoeRoutine__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26346:1: ( rule__MoeRoutine__Group_1__0__Impl rule__MoeRoutine__Group_1__1 )
+            // InternalFormalML.g:26347:2: rule__MoeRoutine__Group_1__0__Impl rule__MoeRoutine__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__MoeRoutine__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_1__0"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_1__0__Impl"
+    // InternalFormalML.g:26354:1: rule__MoeRoutine__Group_1__0__Impl : ( '(' ) ;
+    public final void rule__MoeRoutine__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26358:1: ( ( '(' ) )
+            // InternalFormalML.g:26359:1: ( '(' )
+            {
+            // InternalFormalML.g:26359:1: ( '(' )
+            // InternalFormalML.g:26360:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_1_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_1__1"
+    // InternalFormalML.g:26369:1: rule__MoeRoutine__Group_1__1 : rule__MoeRoutine__Group_1__1__Impl rule__MoeRoutine__Group_1__2 ;
+    public final void rule__MoeRoutine__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26373:1: ( rule__MoeRoutine__Group_1__1__Impl rule__MoeRoutine__Group_1__2 )
+            // InternalFormalML.g:26374:2: rule__MoeRoutine__Group_1__1__Impl rule__MoeRoutine__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__MoeRoutine__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_1__1"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_1__1__Impl"
+    // InternalFormalML.g:26381:1: rule__MoeRoutine__Group_1__1__Impl : ( ( rule__MoeRoutine__DomainAssignment_1_1 )? ) ;
+    public final void rule__MoeRoutine__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26385:1: ( ( ( rule__MoeRoutine__DomainAssignment_1_1 )? ) )
+            // InternalFormalML.g:26386:1: ( ( rule__MoeRoutine__DomainAssignment_1_1 )? )
+            {
+            // InternalFormalML.g:26386:1: ( ( rule__MoeRoutine__DomainAssignment_1_1 )? )
+            // InternalFormalML.g:26387:2: ( rule__MoeRoutine__DomainAssignment_1_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getDomainAssignment_1_1()); 
+            }
+            // InternalFormalML.g:26388:2: ( rule__MoeRoutine__DomainAssignment_1_1 )?
+            int alt432=2;
+            int LA432_0 = input.LA(1);
+
+            if ( (LA432_0==RULE_XLIA_ID||LA432_0==15||(LA432_0>=17 && LA432_0<=18)||LA432_0==39||(LA432_0>=59 && LA432_0<=74)||(LA432_0>=129 && LA432_0<=132)||LA432_0==149||LA432_0==157||(LA432_0>=163 && LA432_0<=174)||(LA432_0>=231 && LA432_0<=237)||LA432_0==277) ) {
+                alt432=1;
+            }
+            switch (alt432) {
+                case 1 :
+                    // InternalFormalML.g:26388:3: rule__MoeRoutine__DomainAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeRoutine__DomainAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getDomainAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_1__2"
+    // InternalFormalML.g:26396:1: rule__MoeRoutine__Group_1__2 : rule__MoeRoutine__Group_1__2__Impl ;
+    public final void rule__MoeRoutine__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26400:1: ( rule__MoeRoutine__Group_1__2__Impl )
+            // InternalFormalML.g:26401:2: rule__MoeRoutine__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_1__2"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_1__2__Impl"
+    // InternalFormalML.g:26407:1: rule__MoeRoutine__Group_1__2__Impl : ( ')' ) ;
+    public final void rule__MoeRoutine__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26411:1: ( ( ')' ) )
+            // InternalFormalML.g:26412:1: ( ')' )
+            {
+            // InternalFormalML.g:26412:1: ( ')' )
+            // InternalFormalML.g:26413:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_1_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2__0"
+    // InternalFormalML.g:26423:1: rule__MoeRoutine__Group_2__0 : rule__MoeRoutine__Group_2__0__Impl rule__MoeRoutine__Group_2__1 ;
+    public final void rule__MoeRoutine__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26427:1: ( rule__MoeRoutine__Group_2__0__Impl rule__MoeRoutine__Group_2__1 )
+            // InternalFormalML.g:26428:2: rule__MoeRoutine__Group_2__0__Impl rule__MoeRoutine__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_65);
+            rule__MoeRoutine__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2__0"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2__0__Impl"
+    // InternalFormalML.g:26435:1: rule__MoeRoutine__Group_2__0__Impl : ( '->' ) ;
+    public final void rule__MoeRoutine__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26439:1: ( ( '->' ) )
+            // InternalFormalML.g:26440:1: ( '->' )
+            {
+            // InternalFormalML.g:26440:1: ( '->' )
+            // InternalFormalML.g:26441:2: '->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getHyphenMinusGreaterThanSignKeyword_2_0()); 
+            }
+            match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getHyphenMinusGreaterThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2__1"
+    // InternalFormalML.g:26450:1: rule__MoeRoutine__Group_2__1 : rule__MoeRoutine__Group_2__1__Impl ;
+    public final void rule__MoeRoutine__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26454:1: ( rule__MoeRoutine__Group_2__1__Impl )
+            // InternalFormalML.g:26455:2: rule__MoeRoutine__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2__1"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2__1__Impl"
+    // InternalFormalML.g:26461:1: rule__MoeRoutine__Group_2__1__Impl : ( ( rule__MoeRoutine__Alternatives_2_1 ) ) ;
+    public final void rule__MoeRoutine__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26465:1: ( ( ( rule__MoeRoutine__Alternatives_2_1 ) ) )
+            // InternalFormalML.g:26466:1: ( ( rule__MoeRoutine__Alternatives_2_1 ) )
+            {
+            // InternalFormalML.g:26466:1: ( ( rule__MoeRoutine__Alternatives_2_1 ) )
+            // InternalFormalML.g:26467:2: ( rule__MoeRoutine__Alternatives_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getAlternatives_2_1()); 
+            }
+            // InternalFormalML.g:26468:2: ( rule__MoeRoutine__Alternatives_2_1 )
+            // InternalFormalML.g:26468:3: rule__MoeRoutine__Alternatives_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Alternatives_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getAlternatives_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2_1_0__0"
+    // InternalFormalML.g:26477:1: rule__MoeRoutine__Group_2_1_0__0 : rule__MoeRoutine__Group_2_1_0__0__Impl rule__MoeRoutine__Group_2_1_0__1 ;
+    public final void rule__MoeRoutine__Group_2_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26481:1: ( rule__MoeRoutine__Group_2_1_0__0__Impl rule__MoeRoutine__Group_2_1_0__1 )
+            // InternalFormalML.g:26482:2: rule__MoeRoutine__Group_2_1_0__0__Impl rule__MoeRoutine__Group_2_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__MoeRoutine__Group_2_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group_2_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2_1_0__0"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2_1_0__0__Impl"
+    // InternalFormalML.g:26489:1: rule__MoeRoutine__Group_2_1_0__0__Impl : ( '(' ) ;
+    public final void rule__MoeRoutine__Group_2_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26493:1: ( ( '(' ) )
+            // InternalFormalML.g:26494:1: ( '(' )
+            {
+            // InternalFormalML.g:26494:1: ( '(' )
+            // InternalFormalML.g:26495:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_2_1_0_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2_1_0__1"
+    // InternalFormalML.g:26504:1: rule__MoeRoutine__Group_2_1_0__1 : rule__MoeRoutine__Group_2_1_0__1__Impl rule__MoeRoutine__Group_2_1_0__2 ;
+    public final void rule__MoeRoutine__Group_2_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26508:1: ( rule__MoeRoutine__Group_2_1_0__1__Impl rule__MoeRoutine__Group_2_1_0__2 )
+            // InternalFormalML.g:26509:2: rule__MoeRoutine__Group_2_1_0__1__Impl rule__MoeRoutine__Group_2_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__MoeRoutine__Group_2_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group_2_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2_1_0__1"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2_1_0__1__Impl"
+    // InternalFormalML.g:26516:1: rule__MoeRoutine__Group_2_1_0__1__Impl : ( ( rule__MoeRoutine__CodomainAssignment_2_1_0_1 ) ) ;
+    public final void rule__MoeRoutine__Group_2_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26520:1: ( ( ( rule__MoeRoutine__CodomainAssignment_2_1_0_1 ) ) )
+            // InternalFormalML.g:26521:1: ( ( rule__MoeRoutine__CodomainAssignment_2_1_0_1 ) )
+            {
+            // InternalFormalML.g:26521:1: ( ( rule__MoeRoutine__CodomainAssignment_2_1_0_1 ) )
+            // InternalFormalML.g:26522:2: ( rule__MoeRoutine__CodomainAssignment_2_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_0_1()); 
+            }
+            // InternalFormalML.g:26523:2: ( rule__MoeRoutine__CodomainAssignment_2_1_0_1 )
+            // InternalFormalML.g:26523:3: rule__MoeRoutine__CodomainAssignment_2_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__CodomainAssignment_2_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getCodomainAssignment_2_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2_1_0__2"
+    // InternalFormalML.g:26531:1: rule__MoeRoutine__Group_2_1_0__2 : rule__MoeRoutine__Group_2_1_0__2__Impl ;
+    public final void rule__MoeRoutine__Group_2_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26535:1: ( rule__MoeRoutine__Group_2_1_0__2__Impl )
+            // InternalFormalML.g:26536:2: rule__MoeRoutine__Group_2_1_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeRoutine__Group_2_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2_1_0__2"
+
+
+    // $ANTLR start "rule__MoeRoutine__Group_2_1_0__2__Impl"
+    // InternalFormalML.g:26542:1: rule__MoeRoutine__Group_2_1_0__2__Impl : ( ')' ) ;
+    public final void rule__MoeRoutine__Group_2_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26546:1: ( ( ')' ) )
+            // InternalFormalML.g:26547:1: ( ')' )
+            {
+            // InternalFormalML.g:26547:1: ( ')' )
+            // InternalFormalML.g:26548:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_2_1_0_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_2_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__Group_2_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group__0"
+    // InternalFormalML.g:26558:1: rule__Routine__Group__0 : rule__Routine__Group__0__Impl rule__Routine__Group__1 ;
+    public final void rule__Routine__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26562:1: ( rule__Routine__Group__0__Impl rule__Routine__Group__1 )
+            // InternalFormalML.g:26563:2: rule__Routine__Group__0__Impl rule__Routine__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_42);
+            rule__Routine__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__0"
+
+
+    // $ANTLR start "rule__Routine__Group__0__Impl"
+    // InternalFormalML.g:26570:1: rule__Routine__Group__0__Impl : ( ( rule__Routine__VisibilityAssignment_0 )? ) ;
+    public final void rule__Routine__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26574:1: ( ( ( rule__Routine__VisibilityAssignment_0 )? ) )
+            // InternalFormalML.g:26575:1: ( ( rule__Routine__VisibilityAssignment_0 )? )
+            {
+            // InternalFormalML.g:26575:1: ( ( rule__Routine__VisibilityAssignment_0 )? )
+            // InternalFormalML.g:26576:2: ( rule__Routine__VisibilityAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:26577:2: ( rule__Routine__VisibilityAssignment_0 )?
+            int alt433=2;
+            int LA433_0 = input.LA(1);
+
+            if ( (LA433_0==28||(LA433_0>=143 && LA433_0<=145)) ) {
+                alt433=1;
+            }
+            switch (alt433) {
+                case 1 :
+                    // InternalFormalML.g:26577:3: rule__Routine__VisibilityAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Routine__VisibilityAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group__1"
+    // InternalFormalML.g:26585:1: rule__Routine__Group__1 : rule__Routine__Group__1__Impl rule__Routine__Group__2 ;
+    public final void rule__Routine__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26589:1: ( rule__Routine__Group__1__Impl rule__Routine__Group__2 )
+            // InternalFormalML.g:26590:2: rule__Routine__Group__1__Impl rule__Routine__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_42);
+            rule__Routine__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__1"
+
+
+    // $ANTLR start "rule__Routine__Group__1__Impl"
+    // InternalFormalML.g:26597:1: rule__Routine__Group__1__Impl : ( ( 'macro' )? ) ;
+    public final void rule__Routine__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26601:1: ( ( ( 'macro' )? ) )
+            // InternalFormalML.g:26602:1: ( ( 'macro' )? )
+            {
+            // InternalFormalML.g:26602:1: ( ( 'macro' )? )
+            // InternalFormalML.g:26603:2: ( 'macro' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getMacroKeyword_1()); 
+            }
+            // InternalFormalML.g:26604:2: ( 'macro' )?
+            int alt434=2;
+            int LA434_0 = input.LA(1);
+
+            if ( (LA434_0==224) ) {
+                alt434=1;
+            }
+            switch (alt434) {
+                case 1 :
+                    // InternalFormalML.g:26604:3: 'macro'
+                    {
+                    match(input,224,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getMacroKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group__2"
+    // InternalFormalML.g:26612:1: rule__Routine__Group__2 : rule__Routine__Group__2__Impl rule__Routine__Group__3 ;
+    public final void rule__Routine__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26616:1: ( rule__Routine__Group__2__Impl rule__Routine__Group__3 )
+            // InternalFormalML.g:26617:2: rule__Routine__Group__2__Impl rule__Routine__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__Routine__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__2"
+
+
+    // $ANTLR start "rule__Routine__Group__2__Impl"
+    // InternalFormalML.g:26624:1: rule__Routine__Group__2__Impl : ( 'routine' ) ;
+    public final void rule__Routine__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26628:1: ( ( 'routine' ) )
+            // InternalFormalML.g:26629:1: ( 'routine' )
+            {
+            // InternalFormalML.g:26629:1: ( 'routine' )
+            // InternalFormalML.g:26630:2: 'routine'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getRoutineKeyword_2()); 
+            }
+            match(input,225,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getRoutineKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group__3"
+    // InternalFormalML.g:26639:1: rule__Routine__Group__3 : rule__Routine__Group__3__Impl rule__Routine__Group__4 ;
+    public final void rule__Routine__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26643:1: ( rule__Routine__Group__3__Impl rule__Routine__Group__4 )
+            // InternalFormalML.g:26644:2: rule__Routine__Group__3__Impl rule__Routine__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_114);
+            rule__Routine__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__3"
+
+
+    // $ANTLR start "rule__Routine__Group__3__Impl"
+    // InternalFormalML.g:26651:1: rule__Routine__Group__3__Impl : ( ( rule__Routine__NameAssignment_3 ) ) ;
+    public final void rule__Routine__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26655:1: ( ( ( rule__Routine__NameAssignment_3 ) ) )
+            // InternalFormalML.g:26656:1: ( ( rule__Routine__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:26656:1: ( ( rule__Routine__NameAssignment_3 ) )
+            // InternalFormalML.g:26657:2: ( rule__Routine__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:26658:2: ( rule__Routine__NameAssignment_3 )
+            // InternalFormalML.g:26658:3: rule__Routine__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group__4"
+    // InternalFormalML.g:26666:1: rule__Routine__Group__4 : rule__Routine__Group__4__Impl rule__Routine__Group__5 ;
+    public final void rule__Routine__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26670:1: ( rule__Routine__Group__4__Impl rule__Routine__Group__5 )
+            // InternalFormalML.g:26671:2: rule__Routine__Group__4__Impl rule__Routine__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_114);
+            rule__Routine__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__4"
+
+
+    // $ANTLR start "rule__Routine__Group__4__Impl"
+    // InternalFormalML.g:26678:1: rule__Routine__Group__4__Impl : ( ( rule__Routine__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__Routine__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26682:1: ( ( ( rule__Routine__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:26683:1: ( ( rule__Routine__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:26683:1: ( ( rule__Routine__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:26684:2: ( rule__Routine__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:26685:2: ( rule__Routine__UnrestrictedNameAssignment_4 )?
+            int alt435=2;
+            int LA435_0 = input.LA(1);
+
+            if ( (LA435_0==RULE_STRING) ) {
+                alt435=1;
+            }
+            switch (alt435) {
+                case 1 :
+                    // InternalFormalML.g:26685:3: rule__Routine__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Routine__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group__5"
+    // InternalFormalML.g:26693:1: rule__Routine__Group__5 : rule__Routine__Group__5__Impl rule__Routine__Group__6 ;
+    public final void rule__Routine__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26697:1: ( rule__Routine__Group__5__Impl rule__Routine__Group__6 )
+            // InternalFormalML.g:26698:2: rule__Routine__Group__5__Impl rule__Routine__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_114);
+            rule__Routine__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__5"
+
+
+    // $ANTLR start "rule__Routine__Group__5__Impl"
+    // InternalFormalML.g:26705:1: rule__Routine__Group__5__Impl : ( ( rule__Routine__Group_5__0 )? ) ;
+    public final void rule__Routine__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26709:1: ( ( ( rule__Routine__Group_5__0 )? ) )
+            // InternalFormalML.g:26710:1: ( ( rule__Routine__Group_5__0 )? )
+            {
+            // InternalFormalML.g:26710:1: ( ( rule__Routine__Group_5__0 )? )
+            // InternalFormalML.g:26711:2: ( rule__Routine__Group_5__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getGroup_5()); 
+            }
+            // InternalFormalML.g:26712:2: ( rule__Routine__Group_5__0 )?
+            int alt436=2;
+            int LA436_0 = input.LA(1);
+
+            if ( (LA436_0==23) ) {
+                alt436=1;
+            }
+            switch (alt436) {
+                case 1 :
+                    // InternalFormalML.g:26712:3: rule__Routine__Group_5__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Routine__Group_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getGroup_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group__6"
+    // InternalFormalML.g:26720:1: rule__Routine__Group__6 : rule__Routine__Group__6__Impl rule__Routine__Group__7 ;
+    public final void rule__Routine__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26724:1: ( rule__Routine__Group__6__Impl rule__Routine__Group__7 )
+            // InternalFormalML.g:26725:2: rule__Routine__Group__6__Impl rule__Routine__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_114);
+            rule__Routine__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__6"
+
+
+    // $ANTLR start "rule__Routine__Group__6__Impl"
+    // InternalFormalML.g:26732:1: rule__Routine__Group__6__Impl : ( ( rule__Routine__Group_6__0 )? ) ;
+    public final void rule__Routine__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26736:1: ( ( ( rule__Routine__Group_6__0 )? ) )
+            // InternalFormalML.g:26737:1: ( ( rule__Routine__Group_6__0 )? )
+            {
+            // InternalFormalML.g:26737:1: ( ( rule__Routine__Group_6__0 )? )
+            // InternalFormalML.g:26738:2: ( rule__Routine__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getGroup_6()); 
+            }
+            // InternalFormalML.g:26739:2: ( rule__Routine__Group_6__0 )?
+            int alt437=2;
+            int LA437_0 = input.LA(1);
+
+            if ( (LA437_0==215) ) {
+                alt437=1;
+            }
+            switch (alt437) {
+                case 1 :
+                    // InternalFormalML.g:26739:3: rule__Routine__Group_6__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Routine__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group__7"
+    // InternalFormalML.g:26747:1: rule__Routine__Group__7 : rule__Routine__Group__7__Impl ;
+    public final void rule__Routine__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26751:1: ( rule__Routine__Group__7__Impl )
+            // InternalFormalML.g:26752:2: rule__Routine__Group__7__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__7"
+
+
+    // $ANTLR start "rule__Routine__Group__7__Impl"
+    // InternalFormalML.g:26758:1: rule__Routine__Group__7__Impl : ( ( rule__Routine__BodyBlockAssignment_7 ) ) ;
+    public final void rule__Routine__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26762:1: ( ( ( rule__Routine__BodyBlockAssignment_7 ) ) )
+            // InternalFormalML.g:26763:1: ( ( rule__Routine__BodyBlockAssignment_7 ) )
+            {
+            // InternalFormalML.g:26763:1: ( ( rule__Routine__BodyBlockAssignment_7 ) )
+            // InternalFormalML.g:26764:2: ( rule__Routine__BodyBlockAssignment_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getBodyBlockAssignment_7()); 
+            }
+            // InternalFormalML.g:26765:2: ( rule__Routine__BodyBlockAssignment_7 )
+            // InternalFormalML.g:26765:3: rule__Routine__BodyBlockAssignment_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__BodyBlockAssignment_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getBodyBlockAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group__7__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group_5__0"
+    // InternalFormalML.g:26774:1: rule__Routine__Group_5__0 : rule__Routine__Group_5__0__Impl rule__Routine__Group_5__1 ;
+    public final void rule__Routine__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26778:1: ( rule__Routine__Group_5__0__Impl rule__Routine__Group_5__1 )
+            // InternalFormalML.g:26779:2: rule__Routine__Group_5__0__Impl rule__Routine__Group_5__1
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__Routine__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_5__0"
+
+
+    // $ANTLR start "rule__Routine__Group_5__0__Impl"
+    // InternalFormalML.g:26786:1: rule__Routine__Group_5__0__Impl : ( '(' ) ;
+    public final void rule__Routine__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26790:1: ( ( '(' ) )
+            // InternalFormalML.g:26791:1: ( '(' )
+            {
+            // InternalFormalML.g:26791:1: ( '(' )
+            // InternalFormalML.g:26792:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_5_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group_5__1"
+    // InternalFormalML.g:26801:1: rule__Routine__Group_5__1 : rule__Routine__Group_5__1__Impl rule__Routine__Group_5__2 ;
+    public final void rule__Routine__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26805:1: ( rule__Routine__Group_5__1__Impl rule__Routine__Group_5__2 )
+            // InternalFormalML.g:26806:2: rule__Routine__Group_5__1__Impl rule__Routine__Group_5__2
+            {
+            pushFollow(FollowSets000.FOLLOW_63);
+            rule__Routine__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group_5__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_5__1"
+
+
+    // $ANTLR start "rule__Routine__Group_5__1__Impl"
+    // InternalFormalML.g:26813:1: rule__Routine__Group_5__1__Impl : ( ( rule__Routine__DomainAssignment_5_1 )? ) ;
+    public final void rule__Routine__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26817:1: ( ( ( rule__Routine__DomainAssignment_5_1 )? ) )
+            // InternalFormalML.g:26818:1: ( ( rule__Routine__DomainAssignment_5_1 )? )
+            {
+            // InternalFormalML.g:26818:1: ( ( rule__Routine__DomainAssignment_5_1 )? )
+            // InternalFormalML.g:26819:2: ( rule__Routine__DomainAssignment_5_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getDomainAssignment_5_1()); 
+            }
+            // InternalFormalML.g:26820:2: ( rule__Routine__DomainAssignment_5_1 )?
+            int alt438=2;
+            int LA438_0 = input.LA(1);
+
+            if ( (LA438_0==RULE_XLIA_ID||LA438_0==15||(LA438_0>=17 && LA438_0<=18)||LA438_0==39||(LA438_0>=59 && LA438_0<=74)||(LA438_0>=129 && LA438_0<=132)||LA438_0==149||LA438_0==157||(LA438_0>=163 && LA438_0<=174)||(LA438_0>=231 && LA438_0<=237)||LA438_0==277) ) {
+                alt438=1;
+            }
+            switch (alt438) {
+                case 1 :
+                    // InternalFormalML.g:26820:3: rule__Routine__DomainAssignment_5_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Routine__DomainAssignment_5_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getDomainAssignment_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group_5__2"
+    // InternalFormalML.g:26828:1: rule__Routine__Group_5__2 : rule__Routine__Group_5__2__Impl ;
+    public final void rule__Routine__Group_5__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26832:1: ( rule__Routine__Group_5__2__Impl )
+            // InternalFormalML.g:26833:2: rule__Routine__Group_5__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group_5__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_5__2"
+
+
+    // $ANTLR start "rule__Routine__Group_5__2__Impl"
+    // InternalFormalML.g:26839:1: rule__Routine__Group_5__2__Impl : ( ')' ) ;
+    public final void rule__Routine__Group_5__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26843:1: ( ( ')' ) )
+            // InternalFormalML.g:26844:1: ( ')' )
+            {
+            // InternalFormalML.g:26844:1: ( ')' )
+            // InternalFormalML.g:26845:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getRightParenthesisKeyword_5_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getRightParenthesisKeyword_5_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_5__2__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group_6__0"
+    // InternalFormalML.g:26855:1: rule__Routine__Group_6__0 : rule__Routine__Group_6__0__Impl rule__Routine__Group_6__1 ;
+    public final void rule__Routine__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26859:1: ( rule__Routine__Group_6__0__Impl rule__Routine__Group_6__1 )
+            // InternalFormalML.g:26860:2: rule__Routine__Group_6__0__Impl rule__Routine__Group_6__1
+            {
+            pushFollow(FollowSets000.FOLLOW_65);
+            rule__Routine__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6__0"
+
+
+    // $ANTLR start "rule__Routine__Group_6__0__Impl"
+    // InternalFormalML.g:26867:1: rule__Routine__Group_6__0__Impl : ( '-->' ) ;
+    public final void rule__Routine__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26871:1: ( ( '-->' ) )
+            // InternalFormalML.g:26872:1: ( '-->' )
+            {
+            // InternalFormalML.g:26872:1: ( '-->' )
+            // InternalFormalML.g:26873:2: '-->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0()); 
+            }
+            match(input,215,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group_6__1"
+    // InternalFormalML.g:26882:1: rule__Routine__Group_6__1 : rule__Routine__Group_6__1__Impl ;
+    public final void rule__Routine__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26886:1: ( rule__Routine__Group_6__1__Impl )
+            // InternalFormalML.g:26887:2: rule__Routine__Group_6__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6__1"
+
+
+    // $ANTLR start "rule__Routine__Group_6__1__Impl"
+    // InternalFormalML.g:26893:1: rule__Routine__Group_6__1__Impl : ( ( rule__Routine__Alternatives_6_1 ) ) ;
+    public final void rule__Routine__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26897:1: ( ( ( rule__Routine__Alternatives_6_1 ) ) )
+            // InternalFormalML.g:26898:1: ( ( rule__Routine__Alternatives_6_1 ) )
+            {
+            // InternalFormalML.g:26898:1: ( ( rule__Routine__Alternatives_6_1 ) )
+            // InternalFormalML.g:26899:2: ( rule__Routine__Alternatives_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getAlternatives_6_1()); 
+            }
+            // InternalFormalML.g:26900:2: ( rule__Routine__Alternatives_6_1 )
+            // InternalFormalML.g:26900:3: rule__Routine__Alternatives_6_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Alternatives_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getAlternatives_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group_6_1_0__0"
+    // InternalFormalML.g:26909:1: rule__Routine__Group_6_1_0__0 : rule__Routine__Group_6_1_0__0__Impl rule__Routine__Group_6_1_0__1 ;
+    public final void rule__Routine__Group_6_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26913:1: ( rule__Routine__Group_6_1_0__0__Impl rule__Routine__Group_6_1_0__1 )
+            // InternalFormalML.g:26914:2: rule__Routine__Group_6_1_0__0__Impl rule__Routine__Group_6_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__Routine__Group_6_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group_6_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6_1_0__0"
+
+
+    // $ANTLR start "rule__Routine__Group_6_1_0__0__Impl"
+    // InternalFormalML.g:26921:1: rule__Routine__Group_6_1_0__0__Impl : ( '(' ) ;
+    public final void rule__Routine__Group_6_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26925:1: ( ( '(' ) )
+            // InternalFormalML.g:26926:1: ( '(' )
+            {
+            // InternalFormalML.g:26926:1: ( '(' )
+            // InternalFormalML.g:26927:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_6_1_0_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_6_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group_6_1_0__1"
+    // InternalFormalML.g:26936:1: rule__Routine__Group_6_1_0__1 : rule__Routine__Group_6_1_0__1__Impl rule__Routine__Group_6_1_0__2 ;
+    public final void rule__Routine__Group_6_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26940:1: ( rule__Routine__Group_6_1_0__1__Impl rule__Routine__Group_6_1_0__2 )
+            // InternalFormalML.g:26941:2: rule__Routine__Group_6_1_0__1__Impl rule__Routine__Group_6_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__Routine__Group_6_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group_6_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6_1_0__1"
+
+
+    // $ANTLR start "rule__Routine__Group_6_1_0__1__Impl"
+    // InternalFormalML.g:26948:1: rule__Routine__Group_6_1_0__1__Impl : ( ( rule__Routine__CodomainAssignment_6_1_0_1 ) ) ;
+    public final void rule__Routine__Group_6_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26952:1: ( ( ( rule__Routine__CodomainAssignment_6_1_0_1 ) ) )
+            // InternalFormalML.g:26953:1: ( ( rule__Routine__CodomainAssignment_6_1_0_1 ) )
+            {
+            // InternalFormalML.g:26953:1: ( ( rule__Routine__CodomainAssignment_6_1_0_1 ) )
+            // InternalFormalML.g:26954:2: ( rule__Routine__CodomainAssignment_6_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_0_1()); 
+            }
+            // InternalFormalML.g:26955:2: ( rule__Routine__CodomainAssignment_6_1_0_1 )
+            // InternalFormalML.g:26955:3: rule__Routine__CodomainAssignment_6_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__CodomainAssignment_6_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getCodomainAssignment_6_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__Routine__Group_6_1_0__2"
+    // InternalFormalML.g:26963:1: rule__Routine__Group_6_1_0__2 : rule__Routine__Group_6_1_0__2__Impl ;
+    public final void rule__Routine__Group_6_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26967:1: ( rule__Routine__Group_6_1_0__2__Impl )
+            // InternalFormalML.g:26968:2: rule__Routine__Group_6_1_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Routine__Group_6_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6_1_0__2"
+
+
+    // $ANTLR start "rule__Routine__Group_6_1_0__2__Impl"
+    // InternalFormalML.g:26974:1: rule__Routine__Group_6_1_0__2__Impl : ( ')' ) ;
+    public final void rule__Routine__Group_6_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26978:1: ( ( ')' ) )
+            // InternalFormalML.g:26979:1: ( ')' )
+            {
+            // InternalFormalML.g:26979:1: ( ')' )
+            // InternalFormalML.g:26980:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getRightParenthesisKeyword_6_1_0_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getRightParenthesisKeyword_6_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__Group_6_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__ModelOfInteraction__Group__0"
+    // InternalFormalML.g:26990:1: rule__ModelOfInteraction__Group__0 : rule__ModelOfInteraction__Group__0__Impl rule__ModelOfInteraction__Group__1 ;
+    public final void rule__ModelOfInteraction__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:26994:1: ( rule__ModelOfInteraction__Group__0__Impl rule__ModelOfInteraction__Group__1 )
+            // InternalFormalML.g:26995:2: rule__ModelOfInteraction__Group__0__Impl rule__ModelOfInteraction__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_77);
+            rule__ModelOfInteraction__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfInteraction__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfInteraction__Group__0"
+
+
+    // $ANTLR start "rule__ModelOfInteraction__Group__0__Impl"
+    // InternalFormalML.g:27002:1: rule__ModelOfInteraction__Group__0__Impl : ( () ) ;
+    public final void rule__ModelOfInteraction__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27006:1: ( ( () ) )
+            // InternalFormalML.g:27007:1: ( () )
+            {
+            // InternalFormalML.g:27007:1: ( () )
+            // InternalFormalML.g:27008:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfInteractionAccess().getModelOfInteractionAction_0()); 
+            }
+            // InternalFormalML.g:27009:2: ()
+            // InternalFormalML.g:27009:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfInteractionAccess().getModelOfInteractionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfInteraction__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ModelOfInteraction__Group__1"
+    // InternalFormalML.g:27017:1: rule__ModelOfInteraction__Group__1 : rule__ModelOfInteraction__Group__1__Impl rule__ModelOfInteraction__Group__2 ;
+    public final void rule__ModelOfInteraction__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27021:1: ( rule__ModelOfInteraction__Group__1__Impl rule__ModelOfInteraction__Group__2 )
+            // InternalFormalML.g:27022:2: rule__ModelOfInteraction__Group__1__Impl rule__ModelOfInteraction__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_115);
+            rule__ModelOfInteraction__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfInteraction__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfInteraction__Group__1"
+
+
+    // $ANTLR start "rule__ModelOfInteraction__Group__1__Impl"
+    // InternalFormalML.g:27029:1: rule__ModelOfInteraction__Group__1__Impl : ( '@com:' ) ;
+    public final void rule__ModelOfInteraction__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27033:1: ( ( '@com:' ) )
+            // InternalFormalML.g:27034:1: ( '@com:' )
+            {
+            // InternalFormalML.g:27034:1: ( '@com:' )
+            // InternalFormalML.g:27035:2: '@com:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfInteractionAccess().getComKeyword_1()); 
+            }
+            match(input,226,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfInteractionAccess().getComKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfInteraction__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ModelOfInteraction__Group__2"
+    // InternalFormalML.g:27044:1: rule__ModelOfInteraction__Group__2 : rule__ModelOfInteraction__Group__2__Impl ;
+    public final void rule__ModelOfInteraction__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27048:1: ( rule__ModelOfInteraction__Group__2__Impl )
+            // InternalFormalML.g:27049:2: rule__ModelOfInteraction__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfInteraction__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfInteraction__Group__2"
+
+
+    // $ANTLR start "rule__ModelOfInteraction__Group__2__Impl"
+    // InternalFormalML.g:27055:1: rule__ModelOfInteraction__Group__2__Impl : ( ( rule__ModelOfInteraction__Alternatives_2 )* ) ;
+    public final void rule__ModelOfInteraction__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27059:1: ( ( ( rule__ModelOfInteraction__Alternatives_2 )* ) )
+            // InternalFormalML.g:27060:1: ( ( rule__ModelOfInteraction__Alternatives_2 )* )
+            {
+            // InternalFormalML.g:27060:1: ( ( rule__ModelOfInteraction__Alternatives_2 )* )
+            // InternalFormalML.g:27061:2: ( rule__ModelOfInteraction__Alternatives_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfInteractionAccess().getAlternatives_2()); 
+            }
+            // InternalFormalML.g:27062:2: ( rule__ModelOfInteraction__Alternatives_2 )*
+            loop439:
+            do {
+                int alt439=2;
+                int LA439_0 = input.LA(1);
+
+                if ( ((LA439_0>=227 && LA439_0<=228)) ) {
+                    alt439=1;
+                }
+
+
+                switch (alt439) {
+            	case 1 :
+            	    // InternalFormalML.g:27062:3: rule__ModelOfInteraction__Alternatives_2
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_116);
+            	    rule__ModelOfInteraction__Alternatives_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop439;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfInteractionAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfInteraction__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__0"
+    // InternalFormalML.g:27071:1: rule__Route__Group__0 : rule__Route__Group__0__Impl rule__Route__Group__1 ;
+    public final void rule__Route__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27075:1: ( rule__Route__Group__0__Impl rule__Route__Group__1 )
+            // InternalFormalML.g:27076:2: rule__Route__Group__0__Impl rule__Route__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_117);
+            rule__Route__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__0"
+
+
+    // $ANTLR start "rule__Route__Group__0__Impl"
+    // InternalFormalML.g:27083:1: rule__Route__Group__0__Impl : ( () ) ;
+    public final void rule__Route__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27087:1: ( ( () ) )
+            // InternalFormalML.g:27088:1: ( () )
+            {
+            // InternalFormalML.g:27088:1: ( () )
+            // InternalFormalML.g:27089:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getRouteAction_0()); 
+            }
+            // InternalFormalML.g:27090:2: ()
+            // InternalFormalML.g:27090:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getRouteAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__1"
+    // InternalFormalML.g:27098:1: rule__Route__Group__1 : rule__Route__Group__1__Impl rule__Route__Group__2 ;
+    public final void rule__Route__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27102:1: ( rule__Route__Group__1__Impl rule__Route__Group__2 )
+            // InternalFormalML.g:27103:2: rule__Route__Group__1__Impl rule__Route__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__Route__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__1"
+
+
+    // $ANTLR start "rule__Route__Group__1__Impl"
+    // InternalFormalML.g:27110:1: rule__Route__Group__1__Impl : ( 'route' ) ;
+    public final void rule__Route__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27114:1: ( ( 'route' ) )
+            // InternalFormalML.g:27115:1: ( 'route' )
+            {
+            // InternalFormalML.g:27115:1: ( 'route' )
+            // InternalFormalML.g:27116:2: 'route'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getRouteKeyword_1()); 
+            }
+            match(input,227,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getRouteKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__2"
+    // InternalFormalML.g:27125:1: rule__Route__Group__2 : rule__Route__Group__2__Impl rule__Route__Group__3 ;
+    public final void rule__Route__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27129:1: ( rule__Route__Group__2__Impl rule__Route__Group__3 )
+            // InternalFormalML.g:27130:2: rule__Route__Group__2__Impl rule__Route__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_118);
+            rule__Route__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__2"
+
+
+    // $ANTLR start "rule__Route__Group__2__Impl"
+    // InternalFormalML.g:27137:1: rule__Route__Group__2__Impl : ( '<' ) ;
+    public final void rule__Route__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27141:1: ( ( '<' ) )
+            // InternalFormalML.g:27142:1: ( '<' )
+            {
+            // InternalFormalML.g:27142:1: ( '<' )
+            // InternalFormalML.g:27143:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getLessThanSignKeyword_2()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getLessThanSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__3"
+    // InternalFormalML.g:27152:1: rule__Route__Group__3 : rule__Route__Group__3__Impl rule__Route__Group__4 ;
+    public final void rule__Route__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27156:1: ( rule__Route__Group__3__Impl rule__Route__Group__4 )
+            // InternalFormalML.g:27157:2: rule__Route__Group__3__Impl rule__Route__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__Route__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__3"
+
+
+    // $ANTLR start "rule__Route__Group__3__Impl"
+    // InternalFormalML.g:27164:1: rule__Route__Group__3__Impl : ( ( rule__Route__ProtocolAssignment_3 ) ) ;
+    public final void rule__Route__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27168:1: ( ( ( rule__Route__ProtocolAssignment_3 ) ) )
+            // InternalFormalML.g:27169:1: ( ( rule__Route__ProtocolAssignment_3 ) )
+            {
+            // InternalFormalML.g:27169:1: ( ( rule__Route__ProtocolAssignment_3 ) )
+            // InternalFormalML.g:27170:2: ( rule__Route__ProtocolAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getProtocolAssignment_3()); 
+            }
+            // InternalFormalML.g:27171:2: ( rule__Route__ProtocolAssignment_3 )
+            // InternalFormalML.g:27171:3: rule__Route__ProtocolAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__ProtocolAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getProtocolAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__4"
+    // InternalFormalML.g:27179:1: rule__Route__Group__4 : rule__Route__Group__4__Impl rule__Route__Group__5 ;
+    public final void rule__Route__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27183:1: ( rule__Route__Group__4__Impl rule__Route__Group__5 )
+            // InternalFormalML.g:27184:2: rule__Route__Group__4__Impl rule__Route__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_119);
+            rule__Route__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__4"
+
+
+    // $ANTLR start "rule__Route__Group__4__Impl"
+    // InternalFormalML.g:27191:1: rule__Route__Group__4__Impl : ( '>' ) ;
+    public final void rule__Route__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27195:1: ( ( '>' ) )
+            // InternalFormalML.g:27196:1: ( '>' )
+            {
+            // InternalFormalML.g:27196:1: ( '>' )
+            // InternalFormalML.g:27197:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getGreaterThanSignKeyword_4()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getGreaterThanSignKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__5"
+    // InternalFormalML.g:27206:1: rule__Route__Group__5 : rule__Route__Group__5__Impl rule__Route__Group__6 ;
+    public final void rule__Route__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27210:1: ( rule__Route__Group__5__Impl rule__Route__Group__6 )
+            // InternalFormalML.g:27211:2: rule__Route__Group__5__Impl rule__Route__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_119);
+            rule__Route__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__5"
+
+
+    // $ANTLR start "rule__Route__Group__5__Impl"
+    // InternalFormalML.g:27218:1: rule__Route__Group__5__Impl : ( ( rule__Route__Group_5__0 )? ) ;
+    public final void rule__Route__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27222:1: ( ( ( rule__Route__Group_5__0 )? ) )
+            // InternalFormalML.g:27223:1: ( ( rule__Route__Group_5__0 )? )
+            {
+            // InternalFormalML.g:27223:1: ( ( rule__Route__Group_5__0 )? )
+            // InternalFormalML.g:27224:2: ( rule__Route__Group_5__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getGroup_5()); 
+            }
+            // InternalFormalML.g:27225:2: ( rule__Route__Group_5__0 )?
+            int alt440=2;
+            int LA440_0 = input.LA(1);
+
+            if ( (LA440_0==RULE_XLIA_ID) ) {
+                alt440=1;
+            }
+            switch (alt440) {
+                case 1 :
+                    // InternalFormalML.g:27225:3: rule__Route__Group_5__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Route__Group_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getGroup_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__6"
+    // InternalFormalML.g:27233:1: rule__Route__Group__6 : rule__Route__Group__6__Impl rule__Route__Group__7 ;
+    public final void rule__Route__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27237:1: ( rule__Route__Group__6__Impl rule__Route__Group__7 )
+            // InternalFormalML.g:27238:2: rule__Route__Group__6__Impl rule__Route__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_120);
+            rule__Route__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__6"
+
+
+    // $ANTLR start "rule__Route__Group__6__Impl"
+    // InternalFormalML.g:27245:1: rule__Route__Group__6__Impl : ( '[' ) ;
+    public final void rule__Route__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27249:1: ( ( '[' ) )
+            // InternalFormalML.g:27250:1: ( '[' )
+            {
+            // InternalFormalML.g:27250:1: ( '[' )
+            // InternalFormalML.g:27251:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getLeftSquareBracketKeyword_6()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getLeftSquareBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__7"
+    // InternalFormalML.g:27260:1: rule__Route__Group__7 : rule__Route__Group__7__Impl rule__Route__Group__8 ;
+    public final void rule__Route__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27264:1: ( rule__Route__Group__7__Impl rule__Route__Group__8 )
+            // InternalFormalML.g:27265:2: rule__Route__Group__7__Impl rule__Route__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__Route__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__7"
+
+
+    // $ANTLR start "rule__Route__Group__7__Impl"
+    // InternalFormalML.g:27272:1: rule__Route__Group__7__Impl : ( ( rule__Route__Alternatives_7 ) ) ;
+    public final void rule__Route__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27276:1: ( ( ( rule__Route__Alternatives_7 ) ) )
+            // InternalFormalML.g:27277:1: ( ( rule__Route__Alternatives_7 ) )
+            {
+            // InternalFormalML.g:27277:1: ( ( rule__Route__Alternatives_7 ) )
+            // InternalFormalML.g:27278:2: ( rule__Route__Alternatives_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getAlternatives_7()); 
+            }
+            // InternalFormalML.g:27279:2: ( rule__Route__Alternatives_7 )
+            // InternalFormalML.g:27279:3: rule__Route__Alternatives_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Alternatives_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getAlternatives_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__7__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__8"
+    // InternalFormalML.g:27287:1: rule__Route__Group__8 : rule__Route__Group__8__Impl rule__Route__Group__9 ;
+    public final void rule__Route__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27291:1: ( rule__Route__Group__8__Impl rule__Route__Group__9 )
+            // InternalFormalML.g:27292:2: rule__Route__Group__8__Impl rule__Route__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__Route__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__8"
+
+
+    // $ANTLR start "rule__Route__Group__8__Impl"
+    // InternalFormalML.g:27299:1: rule__Route__Group__8__Impl : ( ']' ) ;
+    public final void rule__Route__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27303:1: ( ( ']' ) )
+            // InternalFormalML.g:27304:1: ( ']' )
+            {
+            // InternalFormalML.g:27304:1: ( ']' )
+            // InternalFormalML.g:27305:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getRightSquareBracketKeyword_8()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getRightSquareBracketKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__8__Impl"
+
+
+    // $ANTLR start "rule__Route__Group__9"
+    // InternalFormalML.g:27314:1: rule__Route__Group__9 : rule__Route__Group__9__Impl ;
+    public final void rule__Route__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27318:1: ( rule__Route__Group__9__Impl )
+            // InternalFormalML.g:27319:2: rule__Route__Group__9__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__9"
+
+
+    // $ANTLR start "rule__Route__Group__9__Impl"
+    // InternalFormalML.g:27325:1: rule__Route__Group__9__Impl : ( ';' ) ;
+    public final void rule__Route__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27329:1: ( ( ';' ) )
+            // InternalFormalML.g:27330:1: ( ';' )
+            {
+            // InternalFormalML.g:27330:1: ( ';' )
+            // InternalFormalML.g:27331:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getSemicolonKeyword_9()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getSemicolonKeyword_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group__9__Impl"
+
+
+    // $ANTLR start "rule__Route__Group_5__0"
+    // InternalFormalML.g:27341:1: rule__Route__Group_5__0 : rule__Route__Group_5__0__Impl rule__Route__Group_5__1 ;
+    public final void rule__Route__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27345:1: ( rule__Route__Group_5__0__Impl rule__Route__Group_5__1 )
+            // InternalFormalML.g:27346:2: rule__Route__Group_5__0__Impl rule__Route__Group_5__1
+            {
+            pushFollow(FollowSets000.FOLLOW_122);
+            rule__Route__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_5__0"
+
+
+    // $ANTLR start "rule__Route__Group_5__0__Impl"
+    // InternalFormalML.g:27353:1: rule__Route__Group_5__0__Impl : ( ( rule__Route__NameAssignment_5_0 ) ) ;
+    public final void rule__Route__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27357:1: ( ( ( rule__Route__NameAssignment_5_0 ) ) )
+            // InternalFormalML.g:27358:1: ( ( rule__Route__NameAssignment_5_0 ) )
+            {
+            // InternalFormalML.g:27358:1: ( ( rule__Route__NameAssignment_5_0 ) )
+            // InternalFormalML.g:27359:2: ( rule__Route__NameAssignment_5_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getNameAssignment_5_0()); 
+            }
+            // InternalFormalML.g:27360:2: ( rule__Route__NameAssignment_5_0 )
+            // InternalFormalML.g:27360:3: rule__Route__NameAssignment_5_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__NameAssignment_5_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getNameAssignment_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__Route__Group_5__1"
+    // InternalFormalML.g:27368:1: rule__Route__Group_5__1 : rule__Route__Group_5__1__Impl ;
+    public final void rule__Route__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27372:1: ( rule__Route__Group_5__1__Impl )
+            // InternalFormalML.g:27373:2: rule__Route__Group_5__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_5__1"
+
+
+    // $ANTLR start "rule__Route__Group_5__1__Impl"
+    // InternalFormalML.g:27379:1: rule__Route__Group_5__1__Impl : ( ( rule__Route__UnrestrictedNameAssignment_5_1 )? ) ;
+    public final void rule__Route__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27383:1: ( ( ( rule__Route__UnrestrictedNameAssignment_5_1 )? ) )
+            // InternalFormalML.g:27384:1: ( ( rule__Route__UnrestrictedNameAssignment_5_1 )? )
+            {
+            // InternalFormalML.g:27384:1: ( ( rule__Route__UnrestrictedNameAssignment_5_1 )? )
+            // InternalFormalML.g:27385:2: ( rule__Route__UnrestrictedNameAssignment_5_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getUnrestrictedNameAssignment_5_1()); 
+            }
+            // InternalFormalML.g:27386:2: ( rule__Route__UnrestrictedNameAssignment_5_1 )?
+            int alt441=2;
+            int LA441_0 = input.LA(1);
+
+            if ( (LA441_0==RULE_STRING) ) {
+                alt441=1;
+            }
+            switch (alt441) {
+                case 1 :
+                    // InternalFormalML.g:27386:3: rule__Route__UnrestrictedNameAssignment_5_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Route__UnrestrictedNameAssignment_5_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getUnrestrictedNameAssignment_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__Route__Group_7_1__0"
+    // InternalFormalML.g:27395:1: rule__Route__Group_7_1__0 : rule__Route__Group_7_1__0__Impl rule__Route__Group_7_1__1 ;
+    public final void rule__Route__Group_7_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27399:1: ( rule__Route__Group_7_1__0__Impl rule__Route__Group_7_1__1 )
+            // InternalFormalML.g:27400:2: rule__Route__Group_7_1__0__Impl rule__Route__Group_7_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__Route__Group_7_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group_7_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_7_1__0"
+
+
+    // $ANTLR start "rule__Route__Group_7_1__0__Impl"
+    // InternalFormalML.g:27407:1: rule__Route__Group_7_1__0__Impl : ( ( rule__Route__SignalsAssignment_7_1_0 ) ) ;
+    public final void rule__Route__Group_7_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27411:1: ( ( ( rule__Route__SignalsAssignment_7_1_0 ) ) )
+            // InternalFormalML.g:27412:1: ( ( rule__Route__SignalsAssignment_7_1_0 ) )
+            {
+            // InternalFormalML.g:27412:1: ( ( rule__Route__SignalsAssignment_7_1_0 ) )
+            // InternalFormalML.g:27413:2: ( rule__Route__SignalsAssignment_7_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_0()); 
+            }
+            // InternalFormalML.g:27414:2: ( rule__Route__SignalsAssignment_7_1_0 )
+            // InternalFormalML.g:27414:3: rule__Route__SignalsAssignment_7_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__SignalsAssignment_7_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_7_1__0__Impl"
+
+
+    // $ANTLR start "rule__Route__Group_7_1__1"
+    // InternalFormalML.g:27422:1: rule__Route__Group_7_1__1 : rule__Route__Group_7_1__1__Impl ;
+    public final void rule__Route__Group_7_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27426:1: ( rule__Route__Group_7_1__1__Impl )
+            // InternalFormalML.g:27427:2: rule__Route__Group_7_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group_7_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_7_1__1"
+
+
+    // $ANTLR start "rule__Route__Group_7_1__1__Impl"
+    // InternalFormalML.g:27433:1: rule__Route__Group_7_1__1__Impl : ( ( rule__Route__Group_7_1_1__0 )* ) ;
+    public final void rule__Route__Group_7_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27437:1: ( ( ( rule__Route__Group_7_1_1__0 )* ) )
+            // InternalFormalML.g:27438:1: ( ( rule__Route__Group_7_1_1__0 )* )
+            {
+            // InternalFormalML.g:27438:1: ( ( rule__Route__Group_7_1_1__0 )* )
+            // InternalFormalML.g:27439:2: ( rule__Route__Group_7_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getGroup_7_1_1()); 
+            }
+            // InternalFormalML.g:27440:2: ( rule__Route__Group_7_1_1__0 )*
+            loop442:
+            do {
+                int alt442=2;
+                int LA442_0 = input.LA(1);
+
+                if ( (LA442_0==198) ) {
+                    alt442=1;
+                }
+
+
+                switch (alt442) {
+            	case 1 :
+            	    // InternalFormalML.g:27440:3: rule__Route__Group_7_1_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__Route__Group_7_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop442;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getGroup_7_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_7_1__1__Impl"
+
+
+    // $ANTLR start "rule__Route__Group_7_1_1__0"
+    // InternalFormalML.g:27449:1: rule__Route__Group_7_1_1__0 : rule__Route__Group_7_1_1__0__Impl rule__Route__Group_7_1_1__1 ;
+    public final void rule__Route__Group_7_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27453:1: ( rule__Route__Group_7_1_1__0__Impl rule__Route__Group_7_1_1__1 )
+            // InternalFormalML.g:27454:2: rule__Route__Group_7_1_1__0__Impl rule__Route__Group_7_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__Route__Group_7_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group_7_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_7_1_1__0"
+
+
+    // $ANTLR start "rule__Route__Group_7_1_1__0__Impl"
+    // InternalFormalML.g:27461:1: rule__Route__Group_7_1_1__0__Impl : ( ',' ) ;
+    public final void rule__Route__Group_7_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27465:1: ( ( ',' ) )
+            // InternalFormalML.g:27466:1: ( ',' )
+            {
+            // InternalFormalML.g:27466:1: ( ',' )
+            // InternalFormalML.g:27467:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getCommaKeyword_7_1_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getCommaKeyword_7_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_7_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__Route__Group_7_1_1__1"
+    // InternalFormalML.g:27476:1: rule__Route__Group_7_1_1__1 : rule__Route__Group_7_1_1__1__Impl ;
+    public final void rule__Route__Group_7_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27480:1: ( rule__Route__Group_7_1_1__1__Impl )
+            // InternalFormalML.g:27481:2: rule__Route__Group_7_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__Group_7_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_7_1_1__1"
+
+
+    // $ANTLR start "rule__Route__Group_7_1_1__1__Impl"
+    // InternalFormalML.g:27487:1: rule__Route__Group_7_1_1__1__Impl : ( ( rule__Route__SignalsAssignment_7_1_1_1 ) ) ;
+    public final void rule__Route__Group_7_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27491:1: ( ( ( rule__Route__SignalsAssignment_7_1_1_1 ) ) )
+            // InternalFormalML.g:27492:1: ( ( rule__Route__SignalsAssignment_7_1_1_1 ) )
+            {
+            // InternalFormalML.g:27492:1: ( ( rule__Route__SignalsAssignment_7_1_1_1 ) )
+            // InternalFormalML.g:27493:2: ( rule__Route__SignalsAssignment_7_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_1_1()); 
+            }
+            // InternalFormalML.g:27494:2: ( rule__Route__SignalsAssignment_7_1_1_1 )
+            // InternalFormalML.g:27494:3: rule__Route__SignalsAssignment_7_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Route__SignalsAssignment_7_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getSignalsAssignment_7_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__Group_7_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1__0"
+    // InternalFormalML.g:27503:1: rule__ComRouteProtocol__Group_1__0 : rule__ComRouteProtocol__Group_1__0__Impl rule__ComRouteProtocol__Group_1__1 ;
+    public final void rule__ComRouteProtocol__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27507:1: ( rule__ComRouteProtocol__Group_1__0__Impl rule__ComRouteProtocol__Group_1__1 )
+            // InternalFormalML.g:27508:2: rule__ComRouteProtocol__Group_1__0__Impl rule__ComRouteProtocol__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_123);
+            rule__ComRouteProtocol__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1__0"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1__0__Impl"
+    // InternalFormalML.g:27515:1: rule__ComRouteProtocol__Group_1__0__Impl : ( ( rule__ComRouteProtocol__ProtocolAssignment_1_0 ) ) ;
+    public final void rule__ComRouteProtocol__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27519:1: ( ( ( rule__ComRouteProtocol__ProtocolAssignment_1_0 ) ) )
+            // InternalFormalML.g:27520:1: ( ( rule__ComRouteProtocol__ProtocolAssignment_1_0 ) )
+            {
+            // InternalFormalML.g:27520:1: ( ( rule__ComRouteProtocol__ProtocolAssignment_1_0 ) )
+            // InternalFormalML.g:27521:2: ( rule__ComRouteProtocol__ProtocolAssignment_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_1_0()); 
+            }
+            // InternalFormalML.g:27522:2: ( rule__ComRouteProtocol__ProtocolAssignment_1_0 )
+            // InternalFormalML.g:27522:3: rule__ComRouteProtocol__ProtocolAssignment_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__ProtocolAssignment_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getProtocolAssignment_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1__1"
+    // InternalFormalML.g:27530:1: rule__ComRouteProtocol__Group_1__1 : rule__ComRouteProtocol__Group_1__1__Impl ;
+    public final void rule__ComRouteProtocol__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27534:1: ( rule__ComRouteProtocol__Group_1__1__Impl )
+            // InternalFormalML.g:27535:2: rule__ComRouteProtocol__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1__1"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1__1__Impl"
+    // InternalFormalML.g:27541:1: rule__ComRouteProtocol__Group_1__1__Impl : ( ( rule__ComRouteProtocol__Alternatives_1_1 )? ) ;
+    public final void rule__ComRouteProtocol__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27545:1: ( ( ( rule__ComRouteProtocol__Alternatives_1_1 )? ) )
+            // InternalFormalML.g:27546:1: ( ( rule__ComRouteProtocol__Alternatives_1_1 )? )
+            {
+            // InternalFormalML.g:27546:1: ( ( rule__ComRouteProtocol__Alternatives_1_1 )? )
+            // InternalFormalML.g:27547:2: ( rule__ComRouteProtocol__Alternatives_1_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1()); 
+            }
+            // InternalFormalML.g:27548:2: ( rule__ComRouteProtocol__Alternatives_1_1 )?
+            int alt443=2;
+            int LA443_0 = input.LA(1);
+
+            if ( (LA443_0==31||LA443_0==125) ) {
+                alt443=1;
+            }
+            switch (alt443) {
+                case 1 :
+                    // InternalFormalML.g:27548:3: rule__ComRouteProtocol__Alternatives_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComRouteProtocol__Alternatives_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_0__0"
+    // InternalFormalML.g:27557:1: rule__ComRouteProtocol__Group_1_1_0__0 : rule__ComRouteProtocol__Group_1_1_0__0__Impl rule__ComRouteProtocol__Group_1_1_0__1 ;
+    public final void rule__ComRouteProtocol__Group_1_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27561:1: ( rule__ComRouteProtocol__Group_1_1_0__0__Impl rule__ComRouteProtocol__Group_1_1_0__1 )
+            // InternalFormalML.g:27562:2: rule__ComRouteProtocol__Group_1_1_0__0__Impl rule__ComRouteProtocol__Group_1_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_124);
+            rule__ComRouteProtocol__Group_1_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Group_1_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_0__0"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_0__0__Impl"
+    // InternalFormalML.g:27569:1: rule__ComRouteProtocol__Group_1_1_0__0__Impl : ( ':' ) ;
+    public final void rule__ComRouteProtocol__Group_1_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27573:1: ( ( ':' ) )
+            // InternalFormalML.g:27574:1: ( ':' )
+            {
+            // InternalFormalML.g:27574:1: ( ':' )
+            // InternalFormalML.g:27575:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getColonKeyword_1_1_0_0()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getColonKeyword_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_0__1"
+    // InternalFormalML.g:27584:1: rule__ComRouteProtocol__Group_1_1_0__1 : rule__ComRouteProtocol__Group_1_1_0__1__Impl ;
+    public final void rule__ComRouteProtocol__Group_1_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27588:1: ( rule__ComRouteProtocol__Group_1_1_0__1__Impl )
+            // InternalFormalML.g:27589:2: rule__ComRouteProtocol__Group_1_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Group_1_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_0__1"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_0__1__Impl"
+    // InternalFormalML.g:27595:1: rule__ComRouteProtocol__Group_1_1_0__1__Impl : ( ( rule__ComRouteProtocol__Alternatives_1_1_0_1 ) ) ;
+    public final void rule__ComRouteProtocol__Group_1_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27599:1: ( ( ( rule__ComRouteProtocol__Alternatives_1_1_0_1 ) ) )
+            // InternalFormalML.g:27600:1: ( ( rule__ComRouteProtocol__Alternatives_1_1_0_1 ) )
+            {
+            // InternalFormalML.g:27600:1: ( ( rule__ComRouteProtocol__Alternatives_1_1_0_1 ) )
+            // InternalFormalML.g:27601:2: ( rule__ComRouteProtocol__Alternatives_1_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_0_1()); 
+            }
+            // InternalFormalML.g:27602:2: ( rule__ComRouteProtocol__Alternatives_1_1_0_1 )
+            // InternalFormalML.g:27602:3: rule__ComRouteProtocol__Alternatives_1_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Alternatives_1_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_1__0"
+    // InternalFormalML.g:27611:1: rule__ComRouteProtocol__Group_1_1_1__0 : rule__ComRouteProtocol__Group_1_1_1__0__Impl rule__ComRouteProtocol__Group_1_1_1__1 ;
+    public final void rule__ComRouteProtocol__Group_1_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27615:1: ( rule__ComRouteProtocol__Group_1_1_1__0__Impl rule__ComRouteProtocol__Group_1_1_1__1 )
+            // InternalFormalML.g:27616:2: rule__ComRouteProtocol__Group_1_1_1__0__Impl rule__ComRouteProtocol__Group_1_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_124);
+            rule__ComRouteProtocol__Group_1_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Group_1_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_1__0"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_1__0__Impl"
+    // InternalFormalML.g:27623:1: rule__ComRouteProtocol__Group_1_1_1__0__Impl : ( '<' ) ;
+    public final void rule__ComRouteProtocol__Group_1_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27627:1: ( ( '<' ) )
+            // InternalFormalML.g:27628:1: ( '<' )
+            {
+            // InternalFormalML.g:27628:1: ( '<' )
+            // InternalFormalML.g:27629:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getLessThanSignKeyword_1_1_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getLessThanSignKeyword_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_1__1"
+    // InternalFormalML.g:27638:1: rule__ComRouteProtocol__Group_1_1_1__1 : rule__ComRouteProtocol__Group_1_1_1__1__Impl rule__ComRouteProtocol__Group_1_1_1__2 ;
+    public final void rule__ComRouteProtocol__Group_1_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27642:1: ( rule__ComRouteProtocol__Group_1_1_1__1__Impl rule__ComRouteProtocol__Group_1_1_1__2 )
+            // InternalFormalML.g:27643:2: rule__ComRouteProtocol__Group_1_1_1__1__Impl rule__ComRouteProtocol__Group_1_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__ComRouteProtocol__Group_1_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Group_1_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_1__1"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_1__1__Impl"
+    // InternalFormalML.g:27650:1: rule__ComRouteProtocol__Group_1_1_1__1__Impl : ( ( rule__ComRouteProtocol__Alternatives_1_1_1_1 ) ) ;
+    public final void rule__ComRouteProtocol__Group_1_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27654:1: ( ( ( rule__ComRouteProtocol__Alternatives_1_1_1_1 ) ) )
+            // InternalFormalML.g:27655:1: ( ( rule__ComRouteProtocol__Alternatives_1_1_1_1 ) )
+            {
+            // InternalFormalML.g:27655:1: ( ( rule__ComRouteProtocol__Alternatives_1_1_1_1 ) )
+            // InternalFormalML.g:27656:2: ( rule__ComRouteProtocol__Alternatives_1_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_1_1()); 
+            }
+            // InternalFormalML.g:27657:2: ( rule__ComRouteProtocol__Alternatives_1_1_1_1 )
+            // InternalFormalML.g:27657:3: rule__ComRouteProtocol__Alternatives_1_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Alternatives_1_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getAlternatives_1_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_1__2"
+    // InternalFormalML.g:27665:1: rule__ComRouteProtocol__Group_1_1_1__2 : rule__ComRouteProtocol__Group_1_1_1__2__Impl ;
+    public final void rule__ComRouteProtocol__Group_1_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27669:1: ( rule__ComRouteProtocol__Group_1_1_1__2__Impl )
+            // InternalFormalML.g:27670:2: rule__ComRouteProtocol__Group_1_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComRouteProtocol__Group_1_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_1__2"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Group_1_1_1__2__Impl"
+    // InternalFormalML.g:27676:1: rule__ComRouteProtocol__Group_1_1_1__2__Impl : ( '>' ) ;
+    public final void rule__ComRouteProtocol__Group_1_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27680:1: ( ( '>' ) )
+            // InternalFormalML.g:27681:1: ( '>' )
+            {
+            // InternalFormalML.g:27681:1: ( '>' )
+            // InternalFormalML.g:27682:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getGreaterThanSignKeyword_1_1_1_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getGreaterThanSignKeyword_1_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Group_1_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group__0"
+    // InternalFormalML.g:27692:1: rule__Connection__Group__0 : rule__Connection__Group__0__Impl rule__Connection__Group__1 ;
+    public final void rule__Connection__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27696:1: ( rule__Connection__Group__0__Impl rule__Connection__Group__1 )
+            // InternalFormalML.g:27697:2: rule__Connection__Group__0__Impl rule__Connection__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__Connection__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__0"
+
+
+    // $ANTLR start "rule__Connection__Group__0__Impl"
+    // InternalFormalML.g:27704:1: rule__Connection__Group__0__Impl : ( 'connect' ) ;
+    public final void rule__Connection__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27708:1: ( ( 'connect' ) )
+            // InternalFormalML.g:27709:1: ( 'connect' )
+            {
+            // InternalFormalML.g:27709:1: ( 'connect' )
+            // InternalFormalML.g:27710:2: 'connect'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getConnectKeyword_0()); 
+            }
+            match(input,228,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getConnectKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group__1"
+    // InternalFormalML.g:27719:1: rule__Connection__Group__1 : rule__Connection__Group__1__Impl rule__Connection__Group__2 ;
+    public final void rule__Connection__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27723:1: ( rule__Connection__Group__1__Impl rule__Connection__Group__2 )
+            // InternalFormalML.g:27724:2: rule__Connection__Group__1__Impl rule__Connection__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_125);
+            rule__Connection__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__1"
+
+
+    // $ANTLR start "rule__Connection__Group__1__Impl"
+    // InternalFormalML.g:27731:1: rule__Connection__Group__1__Impl : ( '<' ) ;
+    public final void rule__Connection__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27735:1: ( ( '<' ) )
+            // InternalFormalML.g:27736:1: ( '<' )
+            {
+            // InternalFormalML.g:27736:1: ( '<' )
+            // InternalFormalML.g:27737:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getLessThanSignKeyword_1()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getLessThanSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group__2"
+    // InternalFormalML.g:27746:1: rule__Connection__Group__2 : rule__Connection__Group__2__Impl rule__Connection__Group__3 ;
+    public final void rule__Connection__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27750:1: ( rule__Connection__Group__2__Impl rule__Connection__Group__3 )
+            // InternalFormalML.g:27751:2: rule__Connection__Group__2__Impl rule__Connection__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__Connection__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__2"
+
+
+    // $ANTLR start "rule__Connection__Group__2__Impl"
+    // InternalFormalML.g:27758:1: rule__Connection__Group__2__Impl : ( ( rule__Connection__ProtocolAssignment_2 ) ) ;
+    public final void rule__Connection__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27762:1: ( ( ( rule__Connection__ProtocolAssignment_2 ) ) )
+            // InternalFormalML.g:27763:1: ( ( rule__Connection__ProtocolAssignment_2 ) )
+            {
+            // InternalFormalML.g:27763:1: ( ( rule__Connection__ProtocolAssignment_2 ) )
+            // InternalFormalML.g:27764:2: ( rule__Connection__ProtocolAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getProtocolAssignment_2()); 
+            }
+            // InternalFormalML.g:27765:2: ( rule__Connection__ProtocolAssignment_2 )
+            // InternalFormalML.g:27765:3: rule__Connection__ProtocolAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__ProtocolAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getProtocolAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group__3"
+    // InternalFormalML.g:27773:1: rule__Connection__Group__3 : rule__Connection__Group__3__Impl rule__Connection__Group__4 ;
+    public final void rule__Connection__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27777:1: ( rule__Connection__Group__3__Impl rule__Connection__Group__4 )
+            // InternalFormalML.g:27778:2: rule__Connection__Group__3__Impl rule__Connection__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_126);
+            rule__Connection__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__3"
+
+
+    // $ANTLR start "rule__Connection__Group__3__Impl"
+    // InternalFormalML.g:27785:1: rule__Connection__Group__3__Impl : ( '>' ) ;
+    public final void rule__Connection__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27789:1: ( ( '>' ) )
+            // InternalFormalML.g:27790:1: ( '>' )
+            {
+            // InternalFormalML.g:27790:1: ( '>' )
+            // InternalFormalML.g:27791:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getGreaterThanSignKeyword_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getGreaterThanSignKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group__4"
+    // InternalFormalML.g:27800:1: rule__Connection__Group__4 : rule__Connection__Group__4__Impl rule__Connection__Group__5 ;
+    public final void rule__Connection__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27804:1: ( rule__Connection__Group__4__Impl rule__Connection__Group__5 )
+            // InternalFormalML.g:27805:2: rule__Connection__Group__4__Impl rule__Connection__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_126);
+            rule__Connection__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__4"
+
+
+    // $ANTLR start "rule__Connection__Group__4__Impl"
+    // InternalFormalML.g:27812:1: rule__Connection__Group__4__Impl : ( ( rule__Connection__Group_4__0 )? ) ;
+    public final void rule__Connection__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27816:1: ( ( ( rule__Connection__Group_4__0 )? ) )
+            // InternalFormalML.g:27817:1: ( ( rule__Connection__Group_4__0 )? )
+            {
+            // InternalFormalML.g:27817:1: ( ( rule__Connection__Group_4__0 )? )
+            // InternalFormalML.g:27818:2: ( rule__Connection__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:27819:2: ( rule__Connection__Group_4__0 )?
+            int alt444=2;
+            int LA444_0 = input.LA(1);
+
+            if ( (LA444_0==RULE_XLIA_ID) ) {
+                alt444=1;
+            }
+            switch (alt444) {
+                case 1 :
+                    // InternalFormalML.g:27819:3: rule__Connection__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Connection__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group__5"
+    // InternalFormalML.g:27827:1: rule__Connection__Group__5 : rule__Connection__Group__5__Impl rule__Connection__Group__6 ;
+    public final void rule__Connection__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27831:1: ( rule__Connection__Group__5__Impl rule__Connection__Group__6 )
+            // InternalFormalML.g:27832:2: rule__Connection__Group__5__Impl rule__Connection__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_127);
+            rule__Connection__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__5"
+
+
+    // $ANTLR start "rule__Connection__Group__5__Impl"
+    // InternalFormalML.g:27839:1: rule__Connection__Group__5__Impl : ( '{' ) ;
+    public final void rule__Connection__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27843:1: ( ( '{' ) )
+            // InternalFormalML.g:27844:1: ( '{' )
+            {
+            // InternalFormalML.g:27844:1: ( '{' )
+            // InternalFormalML.g:27845:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getLeftCurlyBracketKeyword_5()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getLeftCurlyBracketKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group__6"
+    // InternalFormalML.g:27854:1: rule__Connection__Group__6 : rule__Connection__Group__6__Impl rule__Connection__Group__7 ;
+    public final void rule__Connection__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27858:1: ( rule__Connection__Group__6__Impl rule__Connection__Group__7 )
+            // InternalFormalML.g:27859:2: rule__Connection__Group__6__Impl rule__Connection__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Connection__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__6"
+
+
+    // $ANTLR start "rule__Connection__Group__6__Impl"
+    // InternalFormalML.g:27866:1: rule__Connection__Group__6__Impl : ( ( ( rule__Connection__ComPointsAssignment_6 ) ) ( ( rule__Connection__ComPointsAssignment_6 )* ) ) ;
+    public final void rule__Connection__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27870:1: ( ( ( ( rule__Connection__ComPointsAssignment_6 ) ) ( ( rule__Connection__ComPointsAssignment_6 )* ) ) )
+            // InternalFormalML.g:27871:1: ( ( ( rule__Connection__ComPointsAssignment_6 ) ) ( ( rule__Connection__ComPointsAssignment_6 )* ) )
+            {
+            // InternalFormalML.g:27871:1: ( ( ( rule__Connection__ComPointsAssignment_6 ) ) ( ( rule__Connection__ComPointsAssignment_6 )* ) )
+            // InternalFormalML.g:27872:2: ( ( rule__Connection__ComPointsAssignment_6 ) ) ( ( rule__Connection__ComPointsAssignment_6 )* )
+            {
+            // InternalFormalML.g:27872:2: ( ( rule__Connection__ComPointsAssignment_6 ) )
+            // InternalFormalML.g:27873:3: ( rule__Connection__ComPointsAssignment_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getComPointsAssignment_6()); 
+            }
+            // InternalFormalML.g:27874:3: ( rule__Connection__ComPointsAssignment_6 )
+            // InternalFormalML.g:27874:4: rule__Connection__ComPointsAssignment_6
+            {
+            pushFollow(FollowSets000.FOLLOW_128);
+            rule__Connection__ComPointsAssignment_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getComPointsAssignment_6()); 
+            }
+
+            }
+
+            // InternalFormalML.g:27877:2: ( ( rule__Connection__ComPointsAssignment_6 )* )
+            // InternalFormalML.g:27878:3: ( rule__Connection__ComPointsAssignment_6 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getComPointsAssignment_6()); 
+            }
+            // InternalFormalML.g:27879:3: ( rule__Connection__ComPointsAssignment_6 )*
+            loop445:
+            do {
+                int alt445=2;
+                int LA445_0 = input.LA(1);
+
+                if ( (LA445_0==173||(LA445_0>=175 && LA445_0<=176)) ) {
+                    alt445=1;
+                }
+
+
+                switch (alt445) {
+            	case 1 :
+            	    // InternalFormalML.g:27879:4: rule__Connection__ComPointsAssignment_6
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_128);
+            	    rule__Connection__ComPointsAssignment_6();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop445;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getComPointsAssignment_6()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group__7"
+    // InternalFormalML.g:27888:1: rule__Connection__Group__7 : rule__Connection__Group__7__Impl ;
+    public final void rule__Connection__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27892:1: ( rule__Connection__Group__7__Impl )
+            // InternalFormalML.g:27893:2: rule__Connection__Group__7__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__7"
+
+
+    // $ANTLR start "rule__Connection__Group__7__Impl"
+    // InternalFormalML.g:27899:1: rule__Connection__Group__7__Impl : ( '}' ) ;
+    public final void rule__Connection__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27903:1: ( ( '}' ) )
+            // InternalFormalML.g:27904:1: ( '}' )
+            {
+            // InternalFormalML.g:27904:1: ( '}' )
+            // InternalFormalML.g:27905:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getRightCurlyBracketKeyword_7()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getRightCurlyBracketKeyword_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group__7__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group_4__0"
+    // InternalFormalML.g:27915:1: rule__Connection__Group_4__0 : rule__Connection__Group_4__0__Impl rule__Connection__Group_4__1 ;
+    public final void rule__Connection__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27919:1: ( rule__Connection__Group_4__0__Impl rule__Connection__Group_4__1 )
+            // InternalFormalML.g:27920:2: rule__Connection__Group_4__0__Impl rule__Connection__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_122);
+            rule__Connection__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group_4__0"
+
+
+    // $ANTLR start "rule__Connection__Group_4__0__Impl"
+    // InternalFormalML.g:27927:1: rule__Connection__Group_4__0__Impl : ( ( rule__Connection__NameAssignment_4_0 ) ) ;
+    public final void rule__Connection__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27931:1: ( ( ( rule__Connection__NameAssignment_4_0 ) ) )
+            // InternalFormalML.g:27932:1: ( ( rule__Connection__NameAssignment_4_0 ) )
+            {
+            // InternalFormalML.g:27932:1: ( ( rule__Connection__NameAssignment_4_0 ) )
+            // InternalFormalML.g:27933:2: ( rule__Connection__NameAssignment_4_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getNameAssignment_4_0()); 
+            }
+            // InternalFormalML.g:27934:2: ( rule__Connection__NameAssignment_4_0 )
+            // InternalFormalML.g:27934:3: rule__Connection__NameAssignment_4_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__NameAssignment_4_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getNameAssignment_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__Connection__Group_4__1"
+    // InternalFormalML.g:27942:1: rule__Connection__Group_4__1 : rule__Connection__Group_4__1__Impl ;
+    public final void rule__Connection__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27946:1: ( rule__Connection__Group_4__1__Impl )
+            // InternalFormalML.g:27947:2: rule__Connection__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Connection__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group_4__1"
+
+
+    // $ANTLR start "rule__Connection__Group_4__1__Impl"
+    // InternalFormalML.g:27953:1: rule__Connection__Group_4__1__Impl : ( ( rule__Connection__UnrestrictedNameAssignment_4_1 )? ) ;
+    public final void rule__Connection__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27957:1: ( ( ( rule__Connection__UnrestrictedNameAssignment_4_1 )? ) )
+            // InternalFormalML.g:27958:1: ( ( rule__Connection__UnrestrictedNameAssignment_4_1 )? )
+            {
+            // InternalFormalML.g:27958:1: ( ( rule__Connection__UnrestrictedNameAssignment_4_1 )? )
+            // InternalFormalML.g:27959:2: ( rule__Connection__UnrestrictedNameAssignment_4_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getUnrestrictedNameAssignment_4_1()); 
+            }
+            // InternalFormalML.g:27960:2: ( rule__Connection__UnrestrictedNameAssignment_4_1 )?
+            int alt446=2;
+            int LA446_0 = input.LA(1);
+
+            if ( (LA446_0==RULE_STRING) ) {
+                alt446=1;
+            }
+            switch (alt446) {
+                case 1 :
+                    // InternalFormalML.g:27960:3: rule__Connection__UnrestrictedNameAssignment_4_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Connection__UnrestrictedNameAssignment_4_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getUnrestrictedNameAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1__0"
+    // InternalFormalML.g:27969:1: rule__ComProtocol__Group_1__0 : rule__ComProtocol__Group_1__0__Impl rule__ComProtocol__Group_1__1 ;
+    public final void rule__ComProtocol__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27973:1: ( rule__ComProtocol__Group_1__0__Impl rule__ComProtocol__Group_1__1 )
+            // InternalFormalML.g:27974:2: rule__ComProtocol__Group_1__0__Impl rule__ComProtocol__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__ComProtocol__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1__0"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1__0__Impl"
+    // InternalFormalML.g:27981:1: rule__ComProtocol__Group_1__0__Impl : ( ( rule__ComProtocol__ProtocolAssignment_1_0 ) ) ;
+    public final void rule__ComProtocol__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:27985:1: ( ( ( rule__ComProtocol__ProtocolAssignment_1_0 ) ) )
+            // InternalFormalML.g:27986:1: ( ( rule__ComProtocol__ProtocolAssignment_1_0 ) )
+            {
+            // InternalFormalML.g:27986:1: ( ( rule__ComProtocol__ProtocolAssignment_1_0 ) )
+            // InternalFormalML.g:27987:2: ( rule__ComProtocol__ProtocolAssignment_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getProtocolAssignment_1_0()); 
+            }
+            // InternalFormalML.g:27988:2: ( rule__ComProtocol__ProtocolAssignment_1_0 )
+            // InternalFormalML.g:27988:3: rule__ComProtocol__ProtocolAssignment_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__ProtocolAssignment_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getProtocolAssignment_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1__1"
+    // InternalFormalML.g:27996:1: rule__ComProtocol__Group_1__1 : rule__ComProtocol__Group_1__1__Impl ;
+    public final void rule__ComProtocol__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28000:1: ( rule__ComProtocol__Group_1__1__Impl )
+            // InternalFormalML.g:28001:2: rule__ComProtocol__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1__1"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1__1__Impl"
+    // InternalFormalML.g:28007:1: rule__ComProtocol__Group_1__1__Impl : ( ( rule__ComProtocol__Group_1_1__0 )? ) ;
+    public final void rule__ComProtocol__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28011:1: ( ( ( rule__ComProtocol__Group_1_1__0 )? ) )
+            // InternalFormalML.g:28012:1: ( ( rule__ComProtocol__Group_1_1__0 )? )
+            {
+            // InternalFormalML.g:28012:1: ( ( rule__ComProtocol__Group_1_1__0 )? )
+            // InternalFormalML.g:28013:2: ( rule__ComProtocol__Group_1_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getGroup_1_1()); 
+            }
+            // InternalFormalML.g:28014:2: ( rule__ComProtocol__Group_1_1__0 )?
+            int alt447=2;
+            int LA447_0 = input.LA(1);
+
+            if ( (LA447_0==125) ) {
+                alt447=1;
+            }
+            switch (alt447) {
+                case 1 :
+                    // InternalFormalML.g:28014:3: rule__ComProtocol__Group_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Group_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getGroup_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1_1__0"
+    // InternalFormalML.g:28023:1: rule__ComProtocol__Group_1_1__0 : rule__ComProtocol__Group_1_1__0__Impl rule__ComProtocol__Group_1_1__1 ;
+    public final void rule__ComProtocol__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28027:1: ( rule__ComProtocol__Group_1_1__0__Impl rule__ComProtocol__Group_1_1__1 )
+            // InternalFormalML.g:28028:2: rule__ComProtocol__Group_1_1__0__Impl rule__ComProtocol__Group_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_125);
+            rule__ComProtocol__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1_1__0"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1_1__0__Impl"
+    // InternalFormalML.g:28035:1: rule__ComProtocol__Group_1_1__0__Impl : ( '<' ) ;
+    public final void rule__ComProtocol__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28039:1: ( ( '<' ) )
+            // InternalFormalML.g:28040:1: ( '<' )
+            {
+            // InternalFormalML.g:28040:1: ( '<' )
+            // InternalFormalML.g:28041:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getLessThanSignKeyword_1_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getLessThanSignKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1_1__1"
+    // InternalFormalML.g:28050:1: rule__ComProtocol__Group_1_1__1 : rule__ComProtocol__Group_1_1__1__Impl rule__ComProtocol__Group_1_1__2 ;
+    public final void rule__ComProtocol__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28054:1: ( rule__ComProtocol__Group_1_1__1__Impl rule__ComProtocol__Group_1_1__2 )
+            // InternalFormalML.g:28055:2: rule__ComProtocol__Group_1_1__1__Impl rule__ComProtocol__Group_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__ComProtocol__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1_1__1"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1_1__1__Impl"
+    // InternalFormalML.g:28062:1: rule__ComProtocol__Group_1_1__1__Impl : ( ( rule__ComProtocol__CastAssignment_1_1_1 ) ) ;
+    public final void rule__ComProtocol__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28066:1: ( ( ( rule__ComProtocol__CastAssignment_1_1_1 ) ) )
+            // InternalFormalML.g:28067:1: ( ( rule__ComProtocol__CastAssignment_1_1_1 ) )
+            {
+            // InternalFormalML.g:28067:1: ( ( rule__ComProtocol__CastAssignment_1_1_1 ) )
+            // InternalFormalML.g:28068:2: ( rule__ComProtocol__CastAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getCastAssignment_1_1_1()); 
+            }
+            // InternalFormalML.g:28069:2: ( rule__ComProtocol__CastAssignment_1_1_1 )
+            // InternalFormalML.g:28069:3: rule__ComProtocol__CastAssignment_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__CastAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getCastAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1_1__2"
+    // InternalFormalML.g:28077:1: rule__ComProtocol__Group_1_1__2 : rule__ComProtocol__Group_1_1__2__Impl ;
+    public final void rule__ComProtocol__Group_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28081:1: ( rule__ComProtocol__Group_1_1__2__Impl )
+            // InternalFormalML.g:28082:2: rule__ComProtocol__Group_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1_1__2"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_1_1__2__Impl"
+    // InternalFormalML.g:28088:1: rule__ComProtocol__Group_1_1__2__Impl : ( '>' ) ;
+    public final void rule__ComProtocol__Group_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28092:1: ( ( '>' ) )
+            // InternalFormalML.g:28093:1: ( '>' )
+            {
+            // InternalFormalML.g:28093:1: ( '>' )
+            // InternalFormalML.g:28094:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_1_1_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2__0"
+    // InternalFormalML.g:28104:1: rule__ComProtocol__Group_2__0 : rule__ComProtocol__Group_2__0__Impl rule__ComProtocol__Group_2__1 ;
+    public final void rule__ComProtocol__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28108:1: ( rule__ComProtocol__Group_2__0__Impl rule__ComProtocol__Group_2__1 )
+            // InternalFormalML.g:28109:2: rule__ComProtocol__Group_2__0__Impl rule__ComProtocol__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_123);
+            rule__ComProtocol__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2__0"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2__0__Impl"
+    // InternalFormalML.g:28116:1: rule__ComProtocol__Group_2__0__Impl : ( ( rule__ComProtocol__ProtocolAssignment_2_0 ) ) ;
+    public final void rule__ComProtocol__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28120:1: ( ( ( rule__ComProtocol__ProtocolAssignment_2_0 ) ) )
+            // InternalFormalML.g:28121:1: ( ( rule__ComProtocol__ProtocolAssignment_2_0 ) )
+            {
+            // InternalFormalML.g:28121:1: ( ( rule__ComProtocol__ProtocolAssignment_2_0 ) )
+            // InternalFormalML.g:28122:2: ( rule__ComProtocol__ProtocolAssignment_2_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getProtocolAssignment_2_0()); 
+            }
+            // InternalFormalML.g:28123:2: ( rule__ComProtocol__ProtocolAssignment_2_0 )
+            // InternalFormalML.g:28123:3: rule__ComProtocol__ProtocolAssignment_2_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__ProtocolAssignment_2_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getProtocolAssignment_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2__1"
+    // InternalFormalML.g:28131:1: rule__ComProtocol__Group_2__1 : rule__ComProtocol__Group_2__1__Impl ;
+    public final void rule__ComProtocol__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28135:1: ( rule__ComProtocol__Group_2__1__Impl )
+            // InternalFormalML.g:28136:2: rule__ComProtocol__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2__1"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2__1__Impl"
+    // InternalFormalML.g:28142:1: rule__ComProtocol__Group_2__1__Impl : ( ( rule__ComProtocol__Alternatives_2_1 )? ) ;
+    public final void rule__ComProtocol__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28146:1: ( ( ( rule__ComProtocol__Alternatives_2_1 )? ) )
+            // InternalFormalML.g:28147:1: ( ( rule__ComProtocol__Alternatives_2_1 )? )
+            {
+            // InternalFormalML.g:28147:1: ( ( rule__ComProtocol__Alternatives_2_1 )? )
+            // InternalFormalML.g:28148:2: ( rule__ComProtocol__Alternatives_2_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getAlternatives_2_1()); 
+            }
+            // InternalFormalML.g:28149:2: ( rule__ComProtocol__Alternatives_2_1 )?
+            int alt448=2;
+            int LA448_0 = input.LA(1);
+
+            if ( (LA448_0==31||LA448_0==125) ) {
+                alt448=1;
+            }
+            switch (alt448) {
+                case 1 :
+                    // InternalFormalML.g:28149:3: rule__ComProtocol__Alternatives_2_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComProtocol__Alternatives_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getAlternatives_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_0__0"
+    // InternalFormalML.g:28158:1: rule__ComProtocol__Group_2_1_0__0 : rule__ComProtocol__Group_2_1_0__0__Impl rule__ComProtocol__Group_2_1_0__1 ;
+    public final void rule__ComProtocol__Group_2_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28162:1: ( rule__ComProtocol__Group_2_1_0__0__Impl rule__ComProtocol__Group_2_1_0__1 )
+            // InternalFormalML.g:28163:2: rule__ComProtocol__Group_2_1_0__0__Impl rule__ComProtocol__Group_2_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_124);
+            rule__ComProtocol__Group_2_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_2_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_0__0"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_0__0__Impl"
+    // InternalFormalML.g:28170:1: rule__ComProtocol__Group_2_1_0__0__Impl : ( ':' ) ;
+    public final void rule__ComProtocol__Group_2_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28174:1: ( ( ':' ) )
+            // InternalFormalML.g:28175:1: ( ':' )
+            {
+            // InternalFormalML.g:28175:1: ( ':' )
+            // InternalFormalML.g:28176:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getColonKeyword_2_1_0_0()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getColonKeyword_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_0__1"
+    // InternalFormalML.g:28185:1: rule__ComProtocol__Group_2_1_0__1 : rule__ComProtocol__Group_2_1_0__1__Impl ;
+    public final void rule__ComProtocol__Group_2_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28189:1: ( rule__ComProtocol__Group_2_1_0__1__Impl )
+            // InternalFormalML.g:28190:2: rule__ComProtocol__Group_2_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_2_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_0__1"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_0__1__Impl"
+    // InternalFormalML.g:28196:1: rule__ComProtocol__Group_2_1_0__1__Impl : ( ( rule__ComProtocol__Alternatives_2_1_0_1 ) ) ;
+    public final void rule__ComProtocol__Group_2_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28200:1: ( ( ( rule__ComProtocol__Alternatives_2_1_0_1 ) ) )
+            // InternalFormalML.g:28201:1: ( ( rule__ComProtocol__Alternatives_2_1_0_1 ) )
+            {
+            // InternalFormalML.g:28201:1: ( ( rule__ComProtocol__Alternatives_2_1_0_1 ) )
+            // InternalFormalML.g:28202:2: ( rule__ComProtocol__Alternatives_2_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getAlternatives_2_1_0_1()); 
+            }
+            // InternalFormalML.g:28203:2: ( rule__ComProtocol__Alternatives_2_1_0_1 )
+            // InternalFormalML.g:28203:3: rule__ComProtocol__Alternatives_2_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Alternatives_2_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getAlternatives_2_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_1__0"
+    // InternalFormalML.g:28212:1: rule__ComProtocol__Group_2_1_1__0 : rule__ComProtocol__Group_2_1_1__0__Impl rule__ComProtocol__Group_2_1_1__1 ;
+    public final void rule__ComProtocol__Group_2_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28216:1: ( rule__ComProtocol__Group_2_1_1__0__Impl rule__ComProtocol__Group_2_1_1__1 )
+            // InternalFormalML.g:28217:2: rule__ComProtocol__Group_2_1_1__0__Impl rule__ComProtocol__Group_2_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_124);
+            rule__ComProtocol__Group_2_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_2_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_1__0"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_1__0__Impl"
+    // InternalFormalML.g:28224:1: rule__ComProtocol__Group_2_1_1__0__Impl : ( '<' ) ;
+    public final void rule__ComProtocol__Group_2_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28228:1: ( ( '<' ) )
+            // InternalFormalML.g:28229:1: ( '<' )
+            {
+            // InternalFormalML.g:28229:1: ( '<' )
+            // InternalFormalML.g:28230:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getLessThanSignKeyword_2_1_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getLessThanSignKeyword_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_1__1"
+    // InternalFormalML.g:28239:1: rule__ComProtocol__Group_2_1_1__1 : rule__ComProtocol__Group_2_1_1__1__Impl rule__ComProtocol__Group_2_1_1__2 ;
+    public final void rule__ComProtocol__Group_2_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28243:1: ( rule__ComProtocol__Group_2_1_1__1__Impl rule__ComProtocol__Group_2_1_1__2 )
+            // InternalFormalML.g:28244:2: rule__ComProtocol__Group_2_1_1__1__Impl rule__ComProtocol__Group_2_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__ComProtocol__Group_2_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_2_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_1__1"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_1__1__Impl"
+    // InternalFormalML.g:28251:1: rule__ComProtocol__Group_2_1_1__1__Impl : ( ( rule__ComProtocol__Alternatives_2_1_1_1 ) ) ;
+    public final void rule__ComProtocol__Group_2_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28255:1: ( ( ( rule__ComProtocol__Alternatives_2_1_1_1 ) ) )
+            // InternalFormalML.g:28256:1: ( ( rule__ComProtocol__Alternatives_2_1_1_1 ) )
+            {
+            // InternalFormalML.g:28256:1: ( ( rule__ComProtocol__Alternatives_2_1_1_1 ) )
+            // InternalFormalML.g:28257:2: ( rule__ComProtocol__Alternatives_2_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getAlternatives_2_1_1_1()); 
+            }
+            // InternalFormalML.g:28258:2: ( rule__ComProtocol__Alternatives_2_1_1_1 )
+            // InternalFormalML.g:28258:3: rule__ComProtocol__Alternatives_2_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Alternatives_2_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getAlternatives_2_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_1__2"
+    // InternalFormalML.g:28266:1: rule__ComProtocol__Group_2_1_1__2 : rule__ComProtocol__Group_2_1_1__2__Impl ;
+    public final void rule__ComProtocol__Group_2_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28270:1: ( rule__ComProtocol__Group_2_1_1__2__Impl )
+            // InternalFormalML.g:28271:2: rule__ComProtocol__Group_2_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComProtocol__Group_2_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_1__2"
+
+
+    // $ANTLR start "rule__ComProtocol__Group_2_1_1__2__Impl"
+    // InternalFormalML.g:28277:1: rule__ComProtocol__Group_2_1_1__2__Impl : ( '>' ) ;
+    public final void rule__ComProtocol__Group_2_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28281:1: ( ( '>' ) )
+            // InternalFormalML.g:28282:1: ( '>' )
+            {
+            // InternalFormalML.g:28282:1: ( '>' )
+            // InternalFormalML.g:28283:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_2_1_1_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_2_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Group_2_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group__0"
+    // InternalFormalML.g:28293:1: rule__ComPoint__Group__0 : rule__ComPoint__Group__0__Impl rule__ComPoint__Group__1 ;
+    public final void rule__ComPoint__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28297:1: ( rule__ComPoint__Group__0__Impl rule__ComPoint__Group__1 )
+            // InternalFormalML.g:28298:2: rule__ComPoint__Group__0__Impl rule__ComPoint__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_127);
+            rule__ComPoint__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group__0"
+
+
+    // $ANTLR start "rule__ComPoint__Group__0__Impl"
+    // InternalFormalML.g:28305:1: rule__ComPoint__Group__0__Impl : ( () ) ;
+    public final void rule__ComPoint__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28309:1: ( ( () ) )
+            // InternalFormalML.g:28310:1: ( () )
+            {
+            // InternalFormalML.g:28310:1: ( () )
+            // InternalFormalML.g:28311:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getComPointAction_0()); 
+            }
+            // InternalFormalML.g:28312:2: ()
+            // InternalFormalML.g:28312:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getComPointAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group__1"
+    // InternalFormalML.g:28320:1: rule__ComPoint__Group__1 : rule__ComPoint__Group__1__Impl rule__ComPoint__Group__2 ;
+    public final void rule__ComPoint__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28324:1: ( rule__ComPoint__Group__1__Impl rule__ComPoint__Group__2 )
+            // InternalFormalML.g:28325:2: rule__ComPoint__Group__1__Impl rule__ComPoint__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_129);
+            rule__ComPoint__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group__1"
+
+
+    // $ANTLR start "rule__ComPoint__Group__1__Impl"
+    // InternalFormalML.g:28332:1: rule__ComPoint__Group__1__Impl : ( ( rule__ComPoint__DirectionAssignment_1 ) ) ;
+    public final void rule__ComPoint__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28336:1: ( ( ( rule__ComPoint__DirectionAssignment_1 ) ) )
+            // InternalFormalML.g:28337:1: ( ( rule__ComPoint__DirectionAssignment_1 ) )
+            {
+            // InternalFormalML.g:28337:1: ( ( rule__ComPoint__DirectionAssignment_1 ) )
+            // InternalFormalML.g:28338:2: ( rule__ComPoint__DirectionAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getDirectionAssignment_1()); 
+            }
+            // InternalFormalML.g:28339:2: ( rule__ComPoint__DirectionAssignment_1 )
+            // InternalFormalML.g:28339:3: rule__ComPoint__DirectionAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__DirectionAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getDirectionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group__2"
+    // InternalFormalML.g:28347:1: rule__ComPoint__Group__2 : rule__ComPoint__Group__2__Impl rule__ComPoint__Group__3 ;
+    public final void rule__ComPoint__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28351:1: ( rule__ComPoint__Group__2__Impl rule__ComPoint__Group__3 )
+            // InternalFormalML.g:28352:2: rule__ComPoint__Group__2__Impl rule__ComPoint__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_129);
+            rule__ComPoint__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group__2"
+
+
+    // $ANTLR start "rule__ComPoint__Group__2__Impl"
+    // InternalFormalML.g:28359:1: rule__ComPoint__Group__2__Impl : ( ( rule__ComPoint__Group_2__0 )? ) ;
+    public final void rule__ComPoint__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28363:1: ( ( ( rule__ComPoint__Group_2__0 )? ) )
+            // InternalFormalML.g:28364:1: ( ( rule__ComPoint__Group_2__0 )? )
+            {
+            // InternalFormalML.g:28364:1: ( ( rule__ComPoint__Group_2__0 )? )
+            // InternalFormalML.g:28365:2: ( rule__ComPoint__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:28366:2: ( rule__ComPoint__Group_2__0 )?
+            int alt449=2;
+            int LA449_0 = input.LA(1);
+
+            if ( (LA449_0==125) ) {
+                alt449=1;
+            }
+            switch (alt449) {
+                case 1 :
+                    // InternalFormalML.g:28366:3: rule__ComPoint__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPoint__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group__3"
+    // InternalFormalML.g:28374:1: rule__ComPoint__Group__3 : rule__ComPoint__Group__3__Impl ;
+    public final void rule__ComPoint__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28378:1: ( rule__ComPoint__Group__3__Impl )
+            // InternalFormalML.g:28379:2: rule__ComPoint__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group__3"
+
+
+    // $ANTLR start "rule__ComPoint__Group__3__Impl"
+    // InternalFormalML.g:28385:1: rule__ComPoint__Group__3__Impl : ( ( rule__ComPoint__Alternatives_3 ) ) ;
+    public final void rule__ComPoint__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28389:1: ( ( ( rule__ComPoint__Alternatives_3 ) ) )
+            // InternalFormalML.g:28390:1: ( ( rule__ComPoint__Alternatives_3 ) )
+            {
+            // InternalFormalML.g:28390:1: ( ( rule__ComPoint__Alternatives_3 ) )
+            // InternalFormalML.g:28391:2: ( rule__ComPoint__Alternatives_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:28392:2: ( rule__ComPoint__Alternatives_3 )
+            // InternalFormalML.g:28392:3: rule__ComPoint__Alternatives_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Alternatives_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group_2__0"
+    // InternalFormalML.g:28401:1: rule__ComPoint__Group_2__0 : rule__ComPoint__Group_2__0__Impl rule__ComPoint__Group_2__1 ;
+    public final void rule__ComPoint__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28405:1: ( rule__ComPoint__Group_2__0__Impl rule__ComPoint__Group_2__1 )
+            // InternalFormalML.g:28406:2: rule__ComPoint__Group_2__0__Impl rule__ComPoint__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_130);
+            rule__ComPoint__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_2__0"
+
+
+    // $ANTLR start "rule__ComPoint__Group_2__0__Impl"
+    // InternalFormalML.g:28413:1: rule__ComPoint__Group_2__0__Impl : ( '<' ) ;
+    public final void rule__ComPoint__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28417:1: ( ( '<' ) )
+            // InternalFormalML.g:28418:1: ( '<' )
+            {
+            // InternalFormalML.g:28418:1: ( '<' )
+            // InternalFormalML.g:28419:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getLessThanSignKeyword_2_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getLessThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group_2__1"
+    // InternalFormalML.g:28428:1: rule__ComPoint__Group_2__1 : rule__ComPoint__Group_2__1__Impl rule__ComPoint__Group_2__2 ;
+    public final void rule__ComPoint__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28432:1: ( rule__ComPoint__Group_2__1__Impl rule__ComPoint__Group_2__2 )
+            // InternalFormalML.g:28433:2: rule__ComPoint__Group_2__1__Impl rule__ComPoint__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__ComPoint__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_2__1"
+
+
+    // $ANTLR start "rule__ComPoint__Group_2__1__Impl"
+    // InternalFormalML.g:28440:1: rule__ComPoint__Group_2__1__Impl : ( ( rule__ComPoint__ProtocolAssignment_2_1 ) ) ;
+    public final void rule__ComPoint__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28444:1: ( ( ( rule__ComPoint__ProtocolAssignment_2_1 ) ) )
+            // InternalFormalML.g:28445:1: ( ( rule__ComPoint__ProtocolAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:28445:1: ( ( rule__ComPoint__ProtocolAssignment_2_1 ) )
+            // InternalFormalML.g:28446:2: ( rule__ComPoint__ProtocolAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getProtocolAssignment_2_1()); 
+            }
+            // InternalFormalML.g:28447:2: ( rule__ComPoint__ProtocolAssignment_2_1 )
+            // InternalFormalML.g:28447:3: rule__ComPoint__ProtocolAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__ProtocolAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getProtocolAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group_2__2"
+    // InternalFormalML.g:28455:1: rule__ComPoint__Group_2__2 : rule__ComPoint__Group_2__2__Impl ;
+    public final void rule__ComPoint__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28459:1: ( rule__ComPoint__Group_2__2__Impl )
+            // InternalFormalML.g:28460:2: rule__ComPoint__Group_2__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_2__2"
+
+
+    // $ANTLR start "rule__ComPoint__Group_2__2__Impl"
+    // InternalFormalML.g:28466:1: rule__ComPoint__Group_2__2__Impl : ( '>' ) ;
+    public final void rule__ComPoint__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28470:1: ( ( '>' ) )
+            // InternalFormalML.g:28471:1: ( '>' )
+            {
+            // InternalFormalML.g:28471:1: ( '>' )
+            // InternalFormalML.g:28472:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getGreaterThanSignKeyword_2_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getGreaterThanSignKeyword_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_0__0"
+    // InternalFormalML.g:28482:1: rule__ComPoint__Group_3_0__0 : rule__ComPoint__Group_3_0__0__Impl rule__ComPoint__Group_3_0__1 ;
+    public final void rule__ComPoint__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28486:1: ( rule__ComPoint__Group_3_0__0__Impl rule__ComPoint__Group_3_0__1 )
+            // InternalFormalML.g:28487:2: rule__ComPoint__Group_3_0__0__Impl rule__ComPoint__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ComPoint__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_0__0"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_0__0__Impl"
+    // InternalFormalML.g:28494:1: rule__ComPoint__Group_3_0__0__Impl : ( ( rule__ComPoint__PointAssignment_3_0_0 ) ) ;
+    public final void rule__ComPoint__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28498:1: ( ( ( rule__ComPoint__PointAssignment_3_0_0 ) ) )
+            // InternalFormalML.g:28499:1: ( ( rule__ComPoint__PointAssignment_3_0_0 ) )
+            {
+            // InternalFormalML.g:28499:1: ( ( rule__ComPoint__PointAssignment_3_0_0 ) )
+            // InternalFormalML.g:28500:2: ( rule__ComPoint__PointAssignment_3_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getPointAssignment_3_0_0()); 
+            }
+            // InternalFormalML.g:28501:2: ( rule__ComPoint__PointAssignment_3_0_0 )
+            // InternalFormalML.g:28501:3: rule__ComPoint__PointAssignment_3_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__PointAssignment_3_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getPointAssignment_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_0__1"
+    // InternalFormalML.g:28509:1: rule__ComPoint__Group_3_0__1 : rule__ComPoint__Group_3_0__1__Impl ;
+    public final void rule__ComPoint__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28513:1: ( rule__ComPoint__Group_3_0__1__Impl )
+            // InternalFormalML.g:28514:2: rule__ComPoint__Group_3_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_0__1"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_0__1__Impl"
+    // InternalFormalML.g:28520:1: rule__ComPoint__Group_3_0__1__Impl : ( ';' ) ;
+    public final void rule__ComPoint__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28524:1: ( ( ';' ) )
+            // InternalFormalML.g:28525:1: ( ';' )
+            {
+            // InternalFormalML.g:28525:1: ( ';' )
+            // InternalFormalML.g:28526:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getSemicolonKeyword_3_0_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getSemicolonKeyword_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_1__0"
+    // InternalFormalML.g:28536:1: rule__ComPoint__Group_3_1__0 : rule__ComPoint__Group_3_1__0__Impl rule__ComPoint__Group_3_1__1 ;
+    public final void rule__ComPoint__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28540:1: ( rule__ComPoint__Group_3_1__0__Impl rule__ComPoint__Group_3_1__1 )
+            // InternalFormalML.g:28541:2: rule__ComPoint__Group_3_1__0__Impl rule__ComPoint__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_131);
+            rule__ComPoint__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_1__0"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_1__0__Impl"
+    // InternalFormalML.g:28548:1: rule__ComPoint__Group_3_1__0__Impl : ( '{' ) ;
+    public final void rule__ComPoint__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28552:1: ( ( '{' ) )
+            // InternalFormalML.g:28553:1: ( '{' )
+            {
+            // InternalFormalML.g:28553:1: ( '{' )
+            // InternalFormalML.g:28554:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getLeftCurlyBracketKeyword_3_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getLeftCurlyBracketKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_1__1"
+    // InternalFormalML.g:28563:1: rule__ComPoint__Group_3_1__1 : rule__ComPoint__Group_3_1__1__Impl rule__ComPoint__Group_3_1__2 ;
+    public final void rule__ComPoint__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28567:1: ( rule__ComPoint__Group_3_1__1__Impl rule__ComPoint__Group_3_1__2 )
+            // InternalFormalML.g:28568:2: rule__ComPoint__Group_3_1__1__Impl rule__ComPoint__Group_3_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__ComPoint__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group_3_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_1__1"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_1__1__Impl"
+    // InternalFormalML.g:28575:1: rule__ComPoint__Group_3_1__1__Impl : ( ( rule__ComPoint__PointsAssignment_3_1_1 ) ) ;
+    public final void rule__ComPoint__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28579:1: ( ( ( rule__ComPoint__PointsAssignment_3_1_1 ) ) )
+            // InternalFormalML.g:28580:1: ( ( rule__ComPoint__PointsAssignment_3_1_1 ) )
+            {
+            // InternalFormalML.g:28580:1: ( ( rule__ComPoint__PointsAssignment_3_1_1 ) )
+            // InternalFormalML.g:28581:2: ( rule__ComPoint__PointsAssignment_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getPointsAssignment_3_1_1()); 
+            }
+            // InternalFormalML.g:28582:2: ( rule__ComPoint__PointsAssignment_3_1_1 )
+            // InternalFormalML.g:28582:3: rule__ComPoint__PointsAssignment_3_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__PointsAssignment_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getPointsAssignment_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_1__2"
+    // InternalFormalML.g:28590:1: rule__ComPoint__Group_3_1__2 : rule__ComPoint__Group_3_1__2__Impl ;
+    public final void rule__ComPoint__Group_3_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28594:1: ( rule__ComPoint__Group_3_1__2__Impl )
+            // InternalFormalML.g:28595:2: rule__ComPoint__Group_3_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPoint__Group_3_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_1__2"
+
+
+    // $ANTLR start "rule__ComPoint__Group_3_1__2__Impl"
+    // InternalFormalML.g:28601:1: rule__ComPoint__Group_3_1__2__Impl : ( '}' ) ;
+    public final void rule__ComPoint__Group_3_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28605:1: ( ( '}' ) )
+            // InternalFormalML.g:28606:1: ( '}' )
+            {
+            // InternalFormalML.g:28606:1: ( '}' )
+            // InternalFormalML.g:28607:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getRightCurlyBracketKeyword_3_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getRightCurlyBracketKeyword_3_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__Group_3_1__2__Impl"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0__0"
+    // InternalFormalML.g:28617:1: rule__ComPointProtocol__Group_0__0 : rule__ComPointProtocol__Group_0__0__Impl rule__ComPointProtocol__Group_0__1 ;
+    public final void rule__ComPointProtocol__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28621:1: ( rule__ComPointProtocol__Group_0__0__Impl rule__ComPointProtocol__Group_0__1 )
+            // InternalFormalML.g:28622:2: rule__ComPointProtocol__Group_0__0__Impl rule__ComPointProtocol__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_123);
+            rule__ComPointProtocol__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0__0"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0__0__Impl"
+    // InternalFormalML.g:28629:1: rule__ComPointProtocol__Group_0__0__Impl : ( ( rule__ComPointProtocol__ProtocolAssignment_0_0 ) ) ;
+    public final void rule__ComPointProtocol__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28633:1: ( ( ( rule__ComPointProtocol__ProtocolAssignment_0_0 ) ) )
+            // InternalFormalML.g:28634:1: ( ( rule__ComPointProtocol__ProtocolAssignment_0_0 ) )
+            {
+            // InternalFormalML.g:28634:1: ( ( rule__ComPointProtocol__ProtocolAssignment_0_0 ) )
+            // InternalFormalML.g:28635:2: ( rule__ComPointProtocol__ProtocolAssignment_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getProtocolAssignment_0_0()); 
+            }
+            // InternalFormalML.g:28636:2: ( rule__ComPointProtocol__ProtocolAssignment_0_0 )
+            // InternalFormalML.g:28636:3: rule__ComPointProtocol__ProtocolAssignment_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__ProtocolAssignment_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getProtocolAssignment_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0__1"
+    // InternalFormalML.g:28644:1: rule__ComPointProtocol__Group_0__1 : rule__ComPointProtocol__Group_0__1__Impl ;
+    public final void rule__ComPointProtocol__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28648:1: ( rule__ComPointProtocol__Group_0__1__Impl )
+            // InternalFormalML.g:28649:2: rule__ComPointProtocol__Group_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0__1"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0__1__Impl"
+    // InternalFormalML.g:28655:1: rule__ComPointProtocol__Group_0__1__Impl : ( ( rule__ComPointProtocol__Alternatives_0_1 )? ) ;
+    public final void rule__ComPointProtocol__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28659:1: ( ( ( rule__ComPointProtocol__Alternatives_0_1 )? ) )
+            // InternalFormalML.g:28660:1: ( ( rule__ComPointProtocol__Alternatives_0_1 )? )
+            {
+            // InternalFormalML.g:28660:1: ( ( rule__ComPointProtocol__Alternatives_0_1 )? )
+            // InternalFormalML.g:28661:2: ( rule__ComPointProtocol__Alternatives_0_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1()); 
+            }
+            // InternalFormalML.g:28662:2: ( rule__ComPointProtocol__Alternatives_0_1 )?
+            int alt450=2;
+            int LA450_0 = input.LA(1);
+
+            if ( (LA450_0==31||LA450_0==125) ) {
+                alt450=1;
+            }
+            switch (alt450) {
+                case 1 :
+                    // InternalFormalML.g:28662:3: rule__ComPointProtocol__Alternatives_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComPointProtocol__Alternatives_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_0__0"
+    // InternalFormalML.g:28671:1: rule__ComPointProtocol__Group_0_1_0__0 : rule__ComPointProtocol__Group_0_1_0__0__Impl rule__ComPointProtocol__Group_0_1_0__1 ;
+    public final void rule__ComPointProtocol__Group_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28675:1: ( rule__ComPointProtocol__Group_0_1_0__0__Impl rule__ComPointProtocol__Group_0_1_0__1 )
+            // InternalFormalML.g:28676:2: rule__ComPointProtocol__Group_0_1_0__0__Impl rule__ComPointProtocol__Group_0_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_124);
+            rule__ComPointProtocol__Group_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Group_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_0__0"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_0__0__Impl"
+    // InternalFormalML.g:28683:1: rule__ComPointProtocol__Group_0_1_0__0__Impl : ( ':' ) ;
+    public final void rule__ComPointProtocol__Group_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28687:1: ( ( ':' ) )
+            // InternalFormalML.g:28688:1: ( ':' )
+            {
+            // InternalFormalML.g:28688:1: ( ':' )
+            // InternalFormalML.g:28689:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getColonKeyword_0_1_0_0()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getColonKeyword_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_0__1"
+    // InternalFormalML.g:28698:1: rule__ComPointProtocol__Group_0_1_0__1 : rule__ComPointProtocol__Group_0_1_0__1__Impl ;
+    public final void rule__ComPointProtocol__Group_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28702:1: ( rule__ComPointProtocol__Group_0_1_0__1__Impl )
+            // InternalFormalML.g:28703:2: rule__ComPointProtocol__Group_0_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Group_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_0__1"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_0__1__Impl"
+    // InternalFormalML.g:28709:1: rule__ComPointProtocol__Group_0_1_0__1__Impl : ( ( rule__ComPointProtocol__Alternatives_0_1_0_1 ) ) ;
+    public final void rule__ComPointProtocol__Group_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28713:1: ( ( ( rule__ComPointProtocol__Alternatives_0_1_0_1 ) ) )
+            // InternalFormalML.g:28714:1: ( ( rule__ComPointProtocol__Alternatives_0_1_0_1 ) )
+            {
+            // InternalFormalML.g:28714:1: ( ( rule__ComPointProtocol__Alternatives_0_1_0_1 ) )
+            // InternalFormalML.g:28715:2: ( rule__ComPointProtocol__Alternatives_0_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_0_1()); 
+            }
+            // InternalFormalML.g:28716:2: ( rule__ComPointProtocol__Alternatives_0_1_0_1 )
+            // InternalFormalML.g:28716:3: rule__ComPointProtocol__Alternatives_0_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Alternatives_0_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_1__0"
+    // InternalFormalML.g:28725:1: rule__ComPointProtocol__Group_0_1_1__0 : rule__ComPointProtocol__Group_0_1_1__0__Impl rule__ComPointProtocol__Group_0_1_1__1 ;
+    public final void rule__ComPointProtocol__Group_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28729:1: ( rule__ComPointProtocol__Group_0_1_1__0__Impl rule__ComPointProtocol__Group_0_1_1__1 )
+            // InternalFormalML.g:28730:2: rule__ComPointProtocol__Group_0_1_1__0__Impl rule__ComPointProtocol__Group_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_124);
+            rule__ComPointProtocol__Group_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Group_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_1__0"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_1__0__Impl"
+    // InternalFormalML.g:28737:1: rule__ComPointProtocol__Group_0_1_1__0__Impl : ( '<' ) ;
+    public final void rule__ComPointProtocol__Group_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28741:1: ( ( '<' ) )
+            // InternalFormalML.g:28742:1: ( '<' )
+            {
+            // InternalFormalML.g:28742:1: ( '<' )
+            // InternalFormalML.g:28743:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getLessThanSignKeyword_0_1_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getLessThanSignKeyword_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_1__1"
+    // InternalFormalML.g:28752:1: rule__ComPointProtocol__Group_0_1_1__1 : rule__ComPointProtocol__Group_0_1_1__1__Impl rule__ComPointProtocol__Group_0_1_1__2 ;
+    public final void rule__ComPointProtocol__Group_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28756:1: ( rule__ComPointProtocol__Group_0_1_1__1__Impl rule__ComPointProtocol__Group_0_1_1__2 )
+            // InternalFormalML.g:28757:2: rule__ComPointProtocol__Group_0_1_1__1__Impl rule__ComPointProtocol__Group_0_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__ComPointProtocol__Group_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Group_0_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_1__1"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_1__1__Impl"
+    // InternalFormalML.g:28764:1: rule__ComPointProtocol__Group_0_1_1__1__Impl : ( ( rule__ComPointProtocol__Alternatives_0_1_1_1 ) ) ;
+    public final void rule__ComPointProtocol__Group_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28768:1: ( ( ( rule__ComPointProtocol__Alternatives_0_1_1_1 ) ) )
+            // InternalFormalML.g:28769:1: ( ( rule__ComPointProtocol__Alternatives_0_1_1_1 ) )
+            {
+            // InternalFormalML.g:28769:1: ( ( rule__ComPointProtocol__Alternatives_0_1_1_1 ) )
+            // InternalFormalML.g:28770:2: ( rule__ComPointProtocol__Alternatives_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_1_1()); 
+            }
+            // InternalFormalML.g:28771:2: ( rule__ComPointProtocol__Alternatives_0_1_1_1 )
+            // InternalFormalML.g:28771:3: rule__ComPointProtocol__Alternatives_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Alternatives_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getAlternatives_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_1__2"
+    // InternalFormalML.g:28779:1: rule__ComPointProtocol__Group_0_1_1__2 : rule__ComPointProtocol__Group_0_1_1__2__Impl ;
+    public final void rule__ComPointProtocol__Group_0_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28783:1: ( rule__ComPointProtocol__Group_0_1_1__2__Impl )
+            // InternalFormalML.g:28784:2: rule__ComPointProtocol__Group_0_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComPointProtocol__Group_0_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_1__2"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Group_0_1_1__2__Impl"
+    // InternalFormalML.g:28790:1: rule__ComPointProtocol__Group_0_1_1__2__Impl : ( '>' ) ;
+    public final void rule__ComPointProtocol__Group_0_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28794:1: ( ( '>' ) )
+            // InternalFormalML.g:28795:1: ( '>' )
+            {
+            // InternalFormalML.g:28795:1: ( '>' )
+            // InternalFormalML.g:28796:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getGreaterThanSignKeyword_0_1_1_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getGreaterThanSignKeyword_0_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Group_0_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__ComElement__Group_0__0"
+    // InternalFormalML.g:28806:1: rule__ComElement__Group_0__0 : rule__ComElement__Group_0__0__Impl rule__ComElement__Group_0__1 ;
+    public final void rule__ComElement__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28810:1: ( rule__ComElement__Group_0__0__Impl rule__ComElement__Group_0__1 )
+            // InternalFormalML.g:28811:2: rule__ComElement__Group_0__0__Impl rule__ComElement__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__ComElement__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0__0"
+
+
+    // $ANTLR start "rule__ComElement__Group_0__0__Impl"
+    // InternalFormalML.g:28818:1: rule__ComElement__Group_0__0__Impl : ( ruleLiteralPureReferenceElement ) ;
+    public final void rule__ComElement__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28822:1: ( ( ruleLiteralPureReferenceElement ) )
+            // InternalFormalML.g:28823:1: ( ruleLiteralPureReferenceElement )
+            {
+            // InternalFormalML.g:28823:1: ( ruleLiteralPureReferenceElement )
+            // InternalFormalML.g:28824:2: ruleLiteralPureReferenceElement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getLiteralPureReferenceElementParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLiteralPureReferenceElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getLiteralPureReferenceElementParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__ComElement__Group_0__1"
+    // InternalFormalML.g:28833:1: rule__ComElement__Group_0__1 : rule__ComElement__Group_0__1__Impl ;
+    public final void rule__ComElement__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28837:1: ( rule__ComElement__Group_0__1__Impl )
+            // InternalFormalML.g:28838:2: rule__ComElement__Group_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0__1"
+
+
+    // $ANTLR start "rule__ComElement__Group_0__1__Impl"
+    // InternalFormalML.g:28844:1: rule__ComElement__Group_0__1__Impl : ( ( rule__ComElement__Group_0_1__0 )? ) ;
+    public final void rule__ComElement__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28848:1: ( ( ( rule__ComElement__Group_0_1__0 )? ) )
+            // InternalFormalML.g:28849:1: ( ( rule__ComElement__Group_0_1__0 )? )
+            {
+            // InternalFormalML.g:28849:1: ( ( rule__ComElement__Group_0_1__0 )? )
+            // InternalFormalML.g:28850:2: ( rule__ComElement__Group_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getGroup_0_1()); 
+            }
+            // InternalFormalML.g:28851:2: ( rule__ComElement__Group_0_1__0 )?
+            int alt451=2;
+            int LA451_0 = input.LA(1);
+
+            if ( ((LA451_0>=20 && LA451_0<=21)) ) {
+                alt451=1;
+            }
+            switch (alt451) {
+                case 1 :
+                    // InternalFormalML.g:28851:3: rule__ComElement__Group_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ComElement__Group_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getGroup_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__ComElement__Group_0_1__0"
+    // InternalFormalML.g:28860:1: rule__ComElement__Group_0_1__0 : rule__ComElement__Group_0_1__0__Impl rule__ComElement__Group_0_1__1 ;
+    public final void rule__ComElement__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28864:1: ( rule__ComElement__Group_0_1__0__Impl rule__ComElement__Group_0_1__1 )
+            // InternalFormalML.g:28865:2: rule__ComElement__Group_0_1__0__Impl rule__ComElement__Group_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__ComElement__Group_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Group_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0_1__0"
+
+
+    // $ANTLR start "rule__ComElement__Group_0_1__0__Impl"
+    // InternalFormalML.g:28872:1: rule__ComElement__Group_0_1__0__Impl : ( () ) ;
+    public final void rule__ComElement__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28876:1: ( ( () ) )
+            // InternalFormalML.g:28877:1: ( () )
+            {
+            // InternalFormalML.g:28877:1: ( () )
+            // InternalFormalML.g:28878:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getValueElementSpecificationTargetAction_0_1_0()); 
+            }
+            // InternalFormalML.g:28879:2: ()
+            // InternalFormalML.g:28879:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getValueElementSpecificationTargetAction_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__ComElement__Group_0_1__1"
+    // InternalFormalML.g:28887:1: rule__ComElement__Group_0_1__1 : rule__ComElement__Group_0_1__1__Impl rule__ComElement__Group_0_1__2 ;
+    public final void rule__ComElement__Group_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28891:1: ( rule__ComElement__Group_0_1__1__Impl rule__ComElement__Group_0_1__2 )
+            // InternalFormalML.g:28892:2: rule__ComElement__Group_0_1__1__Impl rule__ComElement__Group_0_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ComElement__Group_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Group_0_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0_1__1"
+
+
+    // $ANTLR start "rule__ComElement__Group_0_1__1__Impl"
+    // InternalFormalML.g:28899:1: rule__ComElement__Group_0_1__1__Impl : ( ( rule__ComElement__KindAssignment_0_1_1 ) ) ;
+    public final void rule__ComElement__Group_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28903:1: ( ( ( rule__ComElement__KindAssignment_0_1_1 ) ) )
+            // InternalFormalML.g:28904:1: ( ( rule__ComElement__KindAssignment_0_1_1 ) )
+            {
+            // InternalFormalML.g:28904:1: ( ( rule__ComElement__KindAssignment_0_1_1 ) )
+            // InternalFormalML.g:28905:2: ( rule__ComElement__KindAssignment_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getKindAssignment_0_1_1()); 
+            }
+            // InternalFormalML.g:28906:2: ( rule__ComElement__KindAssignment_0_1_1 )
+            // InternalFormalML.g:28906:3: rule__ComElement__KindAssignment_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__KindAssignment_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getKindAssignment_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComElement__Group_0_1__2"
+    // InternalFormalML.g:28914:1: rule__ComElement__Group_0_1__2 : rule__ComElement__Group_0_1__2__Impl ;
+    public final void rule__ComElement__Group_0_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28918:1: ( rule__ComElement__Group_0_1__2__Impl )
+            // InternalFormalML.g:28919:2: rule__ComElement__Group_0_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Group_0_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0_1__2"
+
+
+    // $ANTLR start "rule__ComElement__Group_0_1__2__Impl"
+    // InternalFormalML.g:28925:1: rule__ComElement__Group_0_1__2__Impl : ( ( rule__ComElement__ElementAssignment_0_1_2 ) ) ;
+    public final void rule__ComElement__Group_0_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28929:1: ( ( ( rule__ComElement__ElementAssignment_0_1_2 ) ) )
+            // InternalFormalML.g:28930:1: ( ( rule__ComElement__ElementAssignment_0_1_2 ) )
+            {
+            // InternalFormalML.g:28930:1: ( ( rule__ComElement__ElementAssignment_0_1_2 ) )
+            // InternalFormalML.g:28931:2: ( rule__ComElement__ElementAssignment_0_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getElementAssignment_0_1_2()); 
+            }
+            // InternalFormalML.g:28932:2: ( rule__ComElement__ElementAssignment_0_1_2 )
+            // InternalFormalML.g:28932:3: rule__ComElement__ElementAssignment_0_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__ElementAssignment_0_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getElementAssignment_0_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_0_1__2__Impl"
+
+
+    // $ANTLR start "rule__ComElement__Group_1__0"
+    // InternalFormalML.g:28941:1: rule__ComElement__Group_1__0 : rule__ComElement__Group_1__0__Impl rule__ComElement__Group_1__1 ;
+    public final void rule__ComElement__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28945:1: ( rule__ComElement__Group_1__0__Impl rule__ComElement__Group_1__1 )
+            // InternalFormalML.g:28946:2: rule__ComElement__Group_1__0__Impl rule__ComElement__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_131);
+            rule__ComElement__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_1__0"
+
+
+    // $ANTLR start "rule__ComElement__Group_1__0__Impl"
+    // InternalFormalML.g:28953:1: rule__ComElement__Group_1__0__Impl : ( () ) ;
+    public final void rule__ComElement__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28957:1: ( ( () ) )
+            // InternalFormalML.g:28958:1: ( () )
+            {
+            // InternalFormalML.g:28958:1: ( () )
+            // InternalFormalML.g:28959:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getValueElementSpecificationAction_1_0()); 
+            }
+            // InternalFormalML.g:28960:2: ()
+            // InternalFormalML.g:28960:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getValueElementSpecificationAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ComElement__Group_1__1"
+    // InternalFormalML.g:28968:1: rule__ComElement__Group_1__1 : rule__ComElement__Group_1__1__Impl rule__ComElement__Group_1__2 ;
+    public final void rule__ComElement__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28972:1: ( rule__ComElement__Group_1__1__Impl rule__ComElement__Group_1__2 )
+            // InternalFormalML.g:28973:2: rule__ComElement__Group_1__1__Impl rule__ComElement__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__ComElement__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_1__1"
+
+
+    // $ANTLR start "rule__ComElement__Group_1__1__Impl"
+    // InternalFormalML.g:28980:1: rule__ComElement__Group_1__1__Impl : ( ( rule__ComElement__TargetAssignment_1_1 ) ) ;
+    public final void rule__ComElement__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28984:1: ( ( ( rule__ComElement__TargetAssignment_1_1 ) ) )
+            // InternalFormalML.g:28985:1: ( ( rule__ComElement__TargetAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:28985:1: ( ( rule__ComElement__TargetAssignment_1_1 ) )
+            // InternalFormalML.g:28986:2: ( rule__ComElement__TargetAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getTargetAssignment_1_1()); 
+            }
+            // InternalFormalML.g:28987:2: ( rule__ComElement__TargetAssignment_1_1 )
+            // InternalFormalML.g:28987:3: rule__ComElement__TargetAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__TargetAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getTargetAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ComElement__Group_1__2"
+    // InternalFormalML.g:28995:1: rule__ComElement__Group_1__2 : rule__ComElement__Group_1__2__Impl rule__ComElement__Group_1__3 ;
+    public final void rule__ComElement__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:28999:1: ( rule__ComElement__Group_1__2__Impl rule__ComElement__Group_1__3 )
+            // InternalFormalML.g:29000:2: rule__ComElement__Group_1__2__Impl rule__ComElement__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ComElement__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_1__2"
+
+
+    // $ANTLR start "rule__ComElement__Group_1__2__Impl"
+    // InternalFormalML.g:29007:1: rule__ComElement__Group_1__2__Impl : ( ( rule__ComElement__KindAssignment_1_2 ) ) ;
+    public final void rule__ComElement__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29011:1: ( ( ( rule__ComElement__KindAssignment_1_2 ) ) )
+            // InternalFormalML.g:29012:1: ( ( rule__ComElement__KindAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:29012:1: ( ( rule__ComElement__KindAssignment_1_2 ) )
+            // InternalFormalML.g:29013:2: ( rule__ComElement__KindAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getKindAssignment_1_2()); 
+            }
+            // InternalFormalML.g:29014:2: ( rule__ComElement__KindAssignment_1_2 )
+            // InternalFormalML.g:29014:3: rule__ComElement__KindAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__KindAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getKindAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__ComElement__Group_1__3"
+    // InternalFormalML.g:29022:1: rule__ComElement__Group_1__3 : rule__ComElement__Group_1__3__Impl ;
+    public final void rule__ComElement__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29026:1: ( rule__ComElement__Group_1__3__Impl )
+            // InternalFormalML.g:29027:2: rule__ComElement__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_1__3"
+
+
+    // $ANTLR start "rule__ComElement__Group_1__3__Impl"
+    // InternalFormalML.g:29033:1: rule__ComElement__Group_1__3__Impl : ( ( rule__ComElement__ElementAssignment_1_3 ) ) ;
+    public final void rule__ComElement__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29037:1: ( ( ( rule__ComElement__ElementAssignment_1_3 ) ) )
+            // InternalFormalML.g:29038:1: ( ( rule__ComElement__ElementAssignment_1_3 ) )
+            {
+            // InternalFormalML.g:29038:1: ( ( rule__ComElement__ElementAssignment_1_3 ) )
+            // InternalFormalML.g:29039:2: ( rule__ComElement__ElementAssignment_1_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getElementAssignment_1_3()); 
+            }
+            // InternalFormalML.g:29040:2: ( rule__ComElement__ElementAssignment_1_3 )
+            // InternalFormalML.g:29040:3: rule__ComElement__ElementAssignment_1_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__ElementAssignment_1_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getElementAssignment_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0__0"
+    // InternalFormalML.g:29049:1: rule__DataTypeReference__Group_0__0 : rule__DataTypeReference__Group_0__0__Impl rule__DataTypeReference__Group_0__1 ;
+    public final void rule__DataTypeReference__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29053:1: ( rule__DataTypeReference__Group_0__0__Impl rule__DataTypeReference__Group_0__1 )
+            // InternalFormalML.g:29054:2: rule__DataTypeReference__Group_0__0__Impl rule__DataTypeReference__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_133);
+            rule__DataTypeReference__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0__0"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0__0__Impl"
+    // InternalFormalML.g:29061:1: rule__DataTypeReference__Group_0__0__Impl : ( ruleSimpleDataType ) ;
+    public final void rule__DataTypeReference__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29065:1: ( ( ruleSimpleDataType ) )
+            // InternalFormalML.g:29066:1: ( ruleSimpleDataType )
+            {
+            // InternalFormalML.g:29066:1: ( ruleSimpleDataType )
+            // InternalFormalML.g:29067:2: ruleSimpleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getSimpleDataTypeParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSimpleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getSimpleDataTypeParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0__1"
+    // InternalFormalML.g:29076:1: rule__DataTypeReference__Group_0__1 : rule__DataTypeReference__Group_0__1__Impl ;
+    public final void rule__DataTypeReference__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29080:1: ( rule__DataTypeReference__Group_0__1__Impl )
+            // InternalFormalML.g:29081:2: rule__DataTypeReference__Group_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0__1"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0__1__Impl"
+    // InternalFormalML.g:29087:1: rule__DataTypeReference__Group_0__1__Impl : ( ( rule__DataTypeReference__Group_0_1__0 )? ) ;
+    public final void rule__DataTypeReference__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29091:1: ( ( ( rule__DataTypeReference__Group_0_1__0 )? ) )
+            // InternalFormalML.g:29092:1: ( ( rule__DataTypeReference__Group_0_1__0 )? )
+            {
+            // InternalFormalML.g:29092:1: ( ( rule__DataTypeReference__Group_0_1__0 )? )
+            // InternalFormalML.g:29093:2: ( rule__DataTypeReference__Group_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getGroup_0_1()); 
+            }
+            // InternalFormalML.g:29094:2: ( rule__DataTypeReference__Group_0_1__0 )?
+            int alt452=2;
+            int LA452_0 = input.LA(1);
+
+            if ( (LA452_0==22) ) {
+                alt452=1;
+            }
+            switch (alt452) {
+                case 1 :
+                    // InternalFormalML.g:29094:3: rule__DataTypeReference__Group_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DataTypeReference__Group_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getGroup_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0_1__0"
+    // InternalFormalML.g:29103:1: rule__DataTypeReference__Group_0_1__0 : rule__DataTypeReference__Group_0_1__0__Impl rule__DataTypeReference__Group_0_1__1 ;
+    public final void rule__DataTypeReference__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29107:1: ( rule__DataTypeReference__Group_0_1__0__Impl rule__DataTypeReference__Group_0_1__1 )
+            // InternalFormalML.g:29108:2: rule__DataTypeReference__Group_0_1__0__Impl rule__DataTypeReference__Group_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_133);
+            rule__DataTypeReference__Group_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0_1__0"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0_1__0__Impl"
+    // InternalFormalML.g:29115:1: rule__DataTypeReference__Group_0_1__0__Impl : ( () ) ;
+    public final void rule__DataTypeReference__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29119:1: ( ( () ) )
+            // InternalFormalML.g:29120:1: ( () )
+            {
+            // InternalFormalML.g:29120:1: ( () )
+            // InternalFormalML.g:29121:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0()); 
+            }
+            // InternalFormalML.g:29122:2: ()
+            // InternalFormalML.g:29122:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0_1__1"
+    // InternalFormalML.g:29130:1: rule__DataTypeReference__Group_0_1__1 : rule__DataTypeReference__Group_0_1__1__Impl rule__DataTypeReference__Group_0_1__2 ;
+    public final void rule__DataTypeReference__Group_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29134:1: ( rule__DataTypeReference__Group_0_1__1__Impl rule__DataTypeReference__Group_0_1__2 )
+            // InternalFormalML.g:29135:2: rule__DataTypeReference__Group_0_1__1__Impl rule__DataTypeReference__Group_0_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_134);
+            rule__DataTypeReference__Group_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_0_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0_1__1"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0_1__1__Impl"
+    // InternalFormalML.g:29142:1: rule__DataTypeReference__Group_0_1__1__Impl : ( '[' ) ;
+    public final void rule__DataTypeReference__Group_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29146:1: ( ( '[' ) )
+            // InternalFormalML.g:29147:1: ( '[' )
+            {
+            // InternalFormalML.g:29147:1: ( '[' )
+            // InternalFormalML.g:29148:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_0_1_1()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0_1__2"
+    // InternalFormalML.g:29157:1: rule__DataTypeReference__Group_0_1__2 : rule__DataTypeReference__Group_0_1__2__Impl rule__DataTypeReference__Group_0_1__3 ;
+    public final void rule__DataTypeReference__Group_0_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29161:1: ( rule__DataTypeReference__Group_0_1__2__Impl rule__DataTypeReference__Group_0_1__3 )
+            // InternalFormalML.g:29162:2: rule__DataTypeReference__Group_0_1__2__Impl rule__DataTypeReference__Group_0_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__DataTypeReference__Group_0_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_0_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0_1__2"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0_1__2__Impl"
+    // InternalFormalML.g:29169:1: rule__DataTypeReference__Group_0_1__2__Impl : ( ( rule__DataTypeReference__MultiplicityAssignment_0_1_2 ) ) ;
+    public final void rule__DataTypeReference__Group_0_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29173:1: ( ( ( rule__DataTypeReference__MultiplicityAssignment_0_1_2 ) ) )
+            // InternalFormalML.g:29174:1: ( ( rule__DataTypeReference__MultiplicityAssignment_0_1_2 ) )
+            {
+            // InternalFormalML.g:29174:1: ( ( rule__DataTypeReference__MultiplicityAssignment_0_1_2 ) )
+            // InternalFormalML.g:29175:2: ( rule__DataTypeReference__MultiplicityAssignment_0_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_0_1_2()); 
+            }
+            // InternalFormalML.g:29176:2: ( rule__DataTypeReference__MultiplicityAssignment_0_1_2 )
+            // InternalFormalML.g:29176:3: rule__DataTypeReference__MultiplicityAssignment_0_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__MultiplicityAssignment_0_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_0_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0_1__2__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0_1__3"
+    // InternalFormalML.g:29184:1: rule__DataTypeReference__Group_0_1__3 : rule__DataTypeReference__Group_0_1__3__Impl ;
+    public final void rule__DataTypeReference__Group_0_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29188:1: ( rule__DataTypeReference__Group_0_1__3__Impl )
+            // InternalFormalML.g:29189:2: rule__DataTypeReference__Group_0_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_0_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0_1__3"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_0_1__3__Impl"
+    // InternalFormalML.g:29195:1: rule__DataTypeReference__Group_0_1__3__Impl : ( ']' ) ;
+    public final void rule__DataTypeReference__Group_0_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29199:1: ( ( ']' ) )
+            // InternalFormalML.g:29200:1: ( ']' )
+            {
+            // InternalFormalML.g:29200:1: ( ']' )
+            // InternalFormalML.g:29201:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_0_1_3()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_0_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_0_1__3__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1__0"
+    // InternalFormalML.g:29211:1: rule__DataTypeReference__Group_1__0 : rule__DataTypeReference__Group_1__0__Impl rule__DataTypeReference__Group_1__1 ;
+    public final void rule__DataTypeReference__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29215:1: ( rule__DataTypeReference__Group_1__0__Impl rule__DataTypeReference__Group_1__1 )
+            // InternalFormalML.g:29216:2: rule__DataTypeReference__Group_1__0__Impl rule__DataTypeReference__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_135);
+            rule__DataTypeReference__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1__0"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1__0__Impl"
+    // InternalFormalML.g:29223:1: rule__DataTypeReference__Group_1__0__Impl : ( () ) ;
+    public final void rule__DataTypeReference__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29227:1: ( ( () ) )
+            // InternalFormalML.g:29228:1: ( () )
+            {
+            // InternalFormalML.g:29228:1: ( () )
+            // InternalFormalML.g:29229:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceAction_1_0()); 
+            }
+            // InternalFormalML.g:29230:2: ()
+            // InternalFormalML.g:29230:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1__1"
+    // InternalFormalML.g:29238:1: rule__DataTypeReference__Group_1__1 : rule__DataTypeReference__Group_1__1__Impl rule__DataTypeReference__Group_1__2 ;
+    public final void rule__DataTypeReference__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29242:1: ( rule__DataTypeReference__Group_1__1__Impl rule__DataTypeReference__Group_1__2 )
+            // InternalFormalML.g:29243:2: rule__DataTypeReference__Group_1__1__Impl rule__DataTypeReference__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_133);
+            rule__DataTypeReference__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1__1"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1__1__Impl"
+    // InternalFormalML.g:29250:1: rule__DataTypeReference__Group_1__1__Impl : ( ( rule__DataTypeReference__TyperefAssignment_1_1 ) ) ;
+    public final void rule__DataTypeReference__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29254:1: ( ( ( rule__DataTypeReference__TyperefAssignment_1_1 ) ) )
+            // InternalFormalML.g:29255:1: ( ( rule__DataTypeReference__TyperefAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:29255:1: ( ( rule__DataTypeReference__TyperefAssignment_1_1 ) )
+            // InternalFormalML.g:29256:2: ( rule__DataTypeReference__TyperefAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getTyperefAssignment_1_1()); 
+            }
+            // InternalFormalML.g:29257:2: ( rule__DataTypeReference__TyperefAssignment_1_1 )
+            // InternalFormalML.g:29257:3: rule__DataTypeReference__TyperefAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__TyperefAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getTyperefAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1__2"
+    // InternalFormalML.g:29265:1: rule__DataTypeReference__Group_1__2 : rule__DataTypeReference__Group_1__2__Impl ;
+    public final void rule__DataTypeReference__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29269:1: ( rule__DataTypeReference__Group_1__2__Impl )
+            // InternalFormalML.g:29270:2: rule__DataTypeReference__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1__2"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1__2__Impl"
+    // InternalFormalML.g:29276:1: rule__DataTypeReference__Group_1__2__Impl : ( ( rule__DataTypeReference__Group_1_2__0 )? ) ;
+    public final void rule__DataTypeReference__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29280:1: ( ( ( rule__DataTypeReference__Group_1_2__0 )? ) )
+            // InternalFormalML.g:29281:1: ( ( rule__DataTypeReference__Group_1_2__0 )? )
+            {
+            // InternalFormalML.g:29281:1: ( ( rule__DataTypeReference__Group_1_2__0 )? )
+            // InternalFormalML.g:29282:2: ( rule__DataTypeReference__Group_1_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getGroup_1_2()); 
+            }
+            // InternalFormalML.g:29283:2: ( rule__DataTypeReference__Group_1_2__0 )?
+            int alt453=2;
+            int LA453_0 = input.LA(1);
+
+            if ( (LA453_0==22) ) {
+                alt453=1;
+            }
+            switch (alt453) {
+                case 1 :
+                    // InternalFormalML.g:29283:3: rule__DataTypeReference__Group_1_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DataTypeReference__Group_1_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getGroup_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1_2__0"
+    // InternalFormalML.g:29292:1: rule__DataTypeReference__Group_1_2__0 : rule__DataTypeReference__Group_1_2__0__Impl rule__DataTypeReference__Group_1_2__1 ;
+    public final void rule__DataTypeReference__Group_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29296:1: ( rule__DataTypeReference__Group_1_2__0__Impl rule__DataTypeReference__Group_1_2__1 )
+            // InternalFormalML.g:29297:2: rule__DataTypeReference__Group_1_2__0__Impl rule__DataTypeReference__Group_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_134);
+            rule__DataTypeReference__Group_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1_2__0"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1_2__0__Impl"
+    // InternalFormalML.g:29304:1: rule__DataTypeReference__Group_1_2__0__Impl : ( '[' ) ;
+    public final void rule__DataTypeReference__Group_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29308:1: ( ( '[' ) )
+            // InternalFormalML.g:29309:1: ( '[' )
+            {
+            // InternalFormalML.g:29309:1: ( '[' )
+            // InternalFormalML.g:29310:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_1_2_0()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1_2__1"
+    // InternalFormalML.g:29319:1: rule__DataTypeReference__Group_1_2__1 : rule__DataTypeReference__Group_1_2__1__Impl rule__DataTypeReference__Group_1_2__2 ;
+    public final void rule__DataTypeReference__Group_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29323:1: ( rule__DataTypeReference__Group_1_2__1__Impl rule__DataTypeReference__Group_1_2__2 )
+            // InternalFormalML.g:29324:2: rule__DataTypeReference__Group_1_2__1__Impl rule__DataTypeReference__Group_1_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__DataTypeReference__Group_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_1_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1_2__1"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1_2__1__Impl"
+    // InternalFormalML.g:29331:1: rule__DataTypeReference__Group_1_2__1__Impl : ( ( rule__DataTypeReference__MultiplicityAssignment_1_2_1 ) ) ;
+    public final void rule__DataTypeReference__Group_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29335:1: ( ( ( rule__DataTypeReference__MultiplicityAssignment_1_2_1 ) ) )
+            // InternalFormalML.g:29336:1: ( ( rule__DataTypeReference__MultiplicityAssignment_1_2_1 ) )
+            {
+            // InternalFormalML.g:29336:1: ( ( rule__DataTypeReference__MultiplicityAssignment_1_2_1 ) )
+            // InternalFormalML.g:29337:2: ( rule__DataTypeReference__MultiplicityAssignment_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_1_2_1()); 
+            }
+            // InternalFormalML.g:29338:2: ( rule__DataTypeReference__MultiplicityAssignment_1_2_1 )
+            // InternalFormalML.g:29338:3: rule__DataTypeReference__MultiplicityAssignment_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__MultiplicityAssignment_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getMultiplicityAssignment_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1_2__2"
+    // InternalFormalML.g:29346:1: rule__DataTypeReference__Group_1_2__2 : rule__DataTypeReference__Group_1_2__2__Impl ;
+    public final void rule__DataTypeReference__Group_1_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29350:1: ( rule__DataTypeReference__Group_1_2__2__Impl )
+            // InternalFormalML.g:29351:2: rule__DataTypeReference__Group_1_2__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DataTypeReference__Group_1_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1_2__2"
+
+
+    // $ANTLR start "rule__DataTypeReference__Group_1_2__2__Impl"
+    // InternalFormalML.g:29357:1: rule__DataTypeReference__Group_1_2__2__Impl : ( ']' ) ;
+    public final void rule__DataTypeReference__Group_1_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29361:1: ( ( ']' ) )
+            // InternalFormalML.g:29362:1: ( ']' )
+            {
+            // InternalFormalML.g:29362:1: ( ']' )
+            // InternalFormalML.g:29363:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_1_2_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_1_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__Group_1_2__2__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__0"
+    // InternalFormalML.g:29373:1: rule__OtherDataTypeDefinition__Group__0 : rule__OtherDataTypeDefinition__Group__0__Impl rule__OtherDataTypeDefinition__Group__1 ;
+    public final void rule__OtherDataTypeDefinition__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29377:1: ( rule__OtherDataTypeDefinition__Group__0__Impl rule__OtherDataTypeDefinition__Group__1 )
+            // InternalFormalML.g:29378:2: rule__OtherDataTypeDefinition__Group__0__Impl rule__OtherDataTypeDefinition__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__OtherDataTypeDefinition__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__0__Impl"
+    // InternalFormalML.g:29385:1: rule__OtherDataTypeDefinition__Group__0__Impl : ( () ) ;
+    public final void rule__OtherDataTypeDefinition__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29389:1: ( ( () ) )
+            // InternalFormalML.g:29390:1: ( () )
+            {
+            // InternalFormalML.g:29390:1: ( () )
+            // InternalFormalML.g:29391:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getDataTypeReferenceAction_0()); 
+            }
+            // InternalFormalML.g:29392:2: ()
+            // InternalFormalML.g:29392:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getDataTypeReferenceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__1"
+    // InternalFormalML.g:29400:1: rule__OtherDataTypeDefinition__Group__1 : rule__OtherDataTypeDefinition__Group__1__Impl rule__OtherDataTypeDefinition__Group__2 ;
+    public final void rule__OtherDataTypeDefinition__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29404:1: ( rule__OtherDataTypeDefinition__Group__1__Impl rule__OtherDataTypeDefinition__Group__2 )
+            // InternalFormalML.g:29405:2: rule__OtherDataTypeDefinition__Group__1__Impl rule__OtherDataTypeDefinition__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__OtherDataTypeDefinition__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__1__Impl"
+    // InternalFormalML.g:29412:1: rule__OtherDataTypeDefinition__Group__1__Impl : ( ( rule__OtherDataTypeDefinition__VisibilityAssignment_1 )? ) ;
+    public final void rule__OtherDataTypeDefinition__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29416:1: ( ( ( rule__OtherDataTypeDefinition__VisibilityAssignment_1 )? ) )
+            // InternalFormalML.g:29417:1: ( ( rule__OtherDataTypeDefinition__VisibilityAssignment_1 )? )
+            {
+            // InternalFormalML.g:29417:1: ( ( rule__OtherDataTypeDefinition__VisibilityAssignment_1 )? )
+            // InternalFormalML.g:29418:2: ( rule__OtherDataTypeDefinition__VisibilityAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:29419:2: ( rule__OtherDataTypeDefinition__VisibilityAssignment_1 )?
+            int alt454=2;
+            int LA454_0 = input.LA(1);
+
+            if ( (LA454_0==28||(LA454_0>=143 && LA454_0<=145)) ) {
+                alt454=1;
+            }
+            switch (alt454) {
+                case 1 :
+                    // InternalFormalML.g:29419:3: rule__OtherDataTypeDefinition__VisibilityAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinition__VisibilityAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__2"
+    // InternalFormalML.g:29427:1: rule__OtherDataTypeDefinition__Group__2 : rule__OtherDataTypeDefinition__Group__2__Impl rule__OtherDataTypeDefinition__Group__3 ;
+    public final void rule__OtherDataTypeDefinition__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29431:1: ( rule__OtherDataTypeDefinition__Group__2__Impl rule__OtherDataTypeDefinition__Group__3 )
+            // InternalFormalML.g:29432:2: rule__OtherDataTypeDefinition__Group__2__Impl rule__OtherDataTypeDefinition__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__OtherDataTypeDefinition__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__2"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__2__Impl"
+    // InternalFormalML.g:29439:1: rule__OtherDataTypeDefinition__Group__2__Impl : ( 'type' ) ;
+    public final void rule__OtherDataTypeDefinition__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29443:1: ( ( 'type' ) )
+            // InternalFormalML.g:29444:1: ( 'type' )
+            {
+            // InternalFormalML.g:29444:1: ( 'type' )
+            // InternalFormalML.g:29445:2: 'type'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+            match(input,229,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__2__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__3"
+    // InternalFormalML.g:29454:1: rule__OtherDataTypeDefinition__Group__3 : rule__OtherDataTypeDefinition__Group__3__Impl rule__OtherDataTypeDefinition__Group__4 ;
+    public final void rule__OtherDataTypeDefinition__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29458:1: ( rule__OtherDataTypeDefinition__Group__3__Impl rule__OtherDataTypeDefinition__Group__4 )
+            // InternalFormalML.g:29459:2: rule__OtherDataTypeDefinition__Group__3__Impl rule__OtherDataTypeDefinition__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_137);
+            rule__OtherDataTypeDefinition__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__3"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__3__Impl"
+    // InternalFormalML.g:29466:1: rule__OtherDataTypeDefinition__Group__3__Impl : ( ( rule__OtherDataTypeDefinition__NameAssignment_3 ) ) ;
+    public final void rule__OtherDataTypeDefinition__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29470:1: ( ( ( rule__OtherDataTypeDefinition__NameAssignment_3 ) ) )
+            // InternalFormalML.g:29471:1: ( ( rule__OtherDataTypeDefinition__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:29471:1: ( ( rule__OtherDataTypeDefinition__NameAssignment_3 ) )
+            // InternalFormalML.g:29472:2: ( rule__OtherDataTypeDefinition__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:29473:2: ( rule__OtherDataTypeDefinition__NameAssignment_3 )
+            // InternalFormalML.g:29473:3: rule__OtherDataTypeDefinition__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__3__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__4"
+    // InternalFormalML.g:29481:1: rule__OtherDataTypeDefinition__Group__4 : rule__OtherDataTypeDefinition__Group__4__Impl rule__OtherDataTypeDefinition__Group__5 ;
+    public final void rule__OtherDataTypeDefinition__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29485:1: ( rule__OtherDataTypeDefinition__Group__4__Impl rule__OtherDataTypeDefinition__Group__5 )
+            // InternalFormalML.g:29486:2: rule__OtherDataTypeDefinition__Group__4__Impl rule__OtherDataTypeDefinition__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_137);
+            rule__OtherDataTypeDefinition__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__4"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__4__Impl"
+    // InternalFormalML.g:29493:1: rule__OtherDataTypeDefinition__Group__4__Impl : ( ( rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__OtherDataTypeDefinition__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29497:1: ( ( ( rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:29498:1: ( ( rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:29498:1: ( ( rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:29499:2: ( rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:29500:2: ( rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4 )?
+            int alt455=2;
+            int LA455_0 = input.LA(1);
+
+            if ( (LA455_0==RULE_STRING) ) {
+                alt455=1;
+            }
+            switch (alt455) {
+                case 1 :
+                    // InternalFormalML.g:29500:3: rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__4__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__5"
+    // InternalFormalML.g:29508:1: rule__OtherDataTypeDefinition__Group__5 : rule__OtherDataTypeDefinition__Group__5__Impl rule__OtherDataTypeDefinition__Group__6 ;
+    public final void rule__OtherDataTypeDefinition__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29512:1: ( rule__OtherDataTypeDefinition__Group__5__Impl rule__OtherDataTypeDefinition__Group__6 )
+            // InternalFormalML.g:29513:2: rule__OtherDataTypeDefinition__Group__5__Impl rule__OtherDataTypeDefinition__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__OtherDataTypeDefinition__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__5"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__5__Impl"
+    // InternalFormalML.g:29520:1: rule__OtherDataTypeDefinition__Group__5__Impl : ( ( rule__OtherDataTypeDefinition__Alternatives_5 ) ) ;
+    public final void rule__OtherDataTypeDefinition__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29524:1: ( ( ( rule__OtherDataTypeDefinition__Alternatives_5 ) ) )
+            // InternalFormalML.g:29525:1: ( ( rule__OtherDataTypeDefinition__Alternatives_5 ) )
+            {
+            // InternalFormalML.g:29525:1: ( ( rule__OtherDataTypeDefinition__Alternatives_5 ) )
+            // InternalFormalML.g:29526:2: ( rule__OtherDataTypeDefinition__Alternatives_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getAlternatives_5()); 
+            }
+            // InternalFormalML.g:29527:2: ( rule__OtherDataTypeDefinition__Alternatives_5 )
+            // InternalFormalML.g:29527:3: rule__OtherDataTypeDefinition__Alternatives_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Alternatives_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getAlternatives_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__5__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__6"
+    // InternalFormalML.g:29535:1: rule__OtherDataTypeDefinition__Group__6 : rule__OtherDataTypeDefinition__Group__6__Impl ;
+    public final void rule__OtherDataTypeDefinition__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29539:1: ( rule__OtherDataTypeDefinition__Group__6__Impl )
+            // InternalFormalML.g:29540:2: rule__OtherDataTypeDefinition__Group__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__6"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group__6__Impl"
+    // InternalFormalML.g:29546:1: rule__OtherDataTypeDefinition__Group__6__Impl : ( ( rule__OtherDataTypeDefinition__TypedefAssignment_6 ) ) ;
+    public final void rule__OtherDataTypeDefinition__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29550:1: ( ( ( rule__OtherDataTypeDefinition__TypedefAssignment_6 ) ) )
+            // InternalFormalML.g:29551:1: ( ( rule__OtherDataTypeDefinition__TypedefAssignment_6 ) )
+            {
+            // InternalFormalML.g:29551:1: ( ( rule__OtherDataTypeDefinition__TypedefAssignment_6 ) )
+            // InternalFormalML.g:29552:2: ( rule__OtherDataTypeDefinition__TypedefAssignment_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefAssignment_6()); 
+            }
+            // InternalFormalML.g:29553:2: ( rule__OtherDataTypeDefinition__TypedefAssignment_6 )
+            // InternalFormalML.g:29553:3: rule__OtherDataTypeDefinition__TypedefAssignment_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__TypedefAssignment_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefAssignment_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group__6__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0__0"
+    // InternalFormalML.g:29562:1: rule__OtherDataTypeDefinition__Group_5_0__0 : rule__OtherDataTypeDefinition__Group_5_0__0__Impl rule__OtherDataTypeDefinition__Group_5_0__1 ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29566:1: ( rule__OtherDataTypeDefinition__Group_5_0__0__Impl rule__OtherDataTypeDefinition__Group_5_0__1 )
+            // InternalFormalML.g:29567:2: rule__OtherDataTypeDefinition__Group_5_0__0__Impl rule__OtherDataTypeDefinition__Group_5_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_133);
+            rule__OtherDataTypeDefinition__Group_5_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0__0__Impl"
+    // InternalFormalML.g:29574:1: rule__OtherDataTypeDefinition__Group_5_0__0__Impl : ( ( rule__OtherDataTypeDefinition__SupportAssignment_5_0_0 ) ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29578:1: ( ( ( rule__OtherDataTypeDefinition__SupportAssignment_5_0_0 ) ) )
+            // InternalFormalML.g:29579:1: ( ( rule__OtherDataTypeDefinition__SupportAssignment_5_0_0 ) )
+            {
+            // InternalFormalML.g:29579:1: ( ( rule__OtherDataTypeDefinition__SupportAssignment_5_0_0 ) )
+            // InternalFormalML.g:29580:2: ( rule__OtherDataTypeDefinition__SupportAssignment_5_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportAssignment_5_0_0()); 
+            }
+            // InternalFormalML.g:29581:2: ( rule__OtherDataTypeDefinition__SupportAssignment_5_0_0 )
+            // InternalFormalML.g:29581:3: rule__OtherDataTypeDefinition__SupportAssignment_5_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__SupportAssignment_5_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportAssignment_5_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0__1"
+    // InternalFormalML.g:29589:1: rule__OtherDataTypeDefinition__Group_5_0__1 : rule__OtherDataTypeDefinition__Group_5_0__1__Impl ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29593:1: ( rule__OtherDataTypeDefinition__Group_5_0__1__Impl )
+            // InternalFormalML.g:29594:2: rule__OtherDataTypeDefinition__Group_5_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0__1__Impl"
+    // InternalFormalML.g:29600:1: rule__OtherDataTypeDefinition__Group_5_0__1__Impl : ( ( rule__OtherDataTypeDefinition__Group_5_0_1__0 )? ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29604:1: ( ( ( rule__OtherDataTypeDefinition__Group_5_0_1__0 )? ) )
+            // InternalFormalML.g:29605:1: ( ( rule__OtherDataTypeDefinition__Group_5_0_1__0 )? )
+            {
+            // InternalFormalML.g:29605:1: ( ( rule__OtherDataTypeDefinition__Group_5_0_1__0 )? )
+            // InternalFormalML.g:29606:2: ( rule__OtherDataTypeDefinition__Group_5_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0_1()); 
+            }
+            // InternalFormalML.g:29607:2: ( rule__OtherDataTypeDefinition__Group_5_0_1__0 )?
+            int alt456=2;
+            int LA456_0 = input.LA(1);
+
+            if ( (LA456_0==22) ) {
+                alt456=1;
+            }
+            switch (alt456) {
+                case 1 :
+                    // InternalFormalML.g:29607:3: rule__OtherDataTypeDefinition__Group_5_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinition__Group_5_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0_1__0"
+    // InternalFormalML.g:29616:1: rule__OtherDataTypeDefinition__Group_5_0_1__0 : rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl rule__OtherDataTypeDefinition__Group_5_0_1__1 ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29620:1: ( rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl rule__OtherDataTypeDefinition__Group_5_0_1__1 )
+            // InternalFormalML.g:29621:2: rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl rule__OtherDataTypeDefinition__Group_5_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_134);
+            rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0_1__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl"
+    // InternalFormalML.g:29628:1: rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl : ( '[' ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29632:1: ( ( '[' ) )
+            // InternalFormalML.g:29633:1: ( '[' )
+            {
+            // InternalFormalML.g:29633:1: ( '[' )
+            // InternalFormalML.g:29634:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_0_1_0()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0_1__1"
+    // InternalFormalML.g:29643:1: rule__OtherDataTypeDefinition__Group_5_0_1__1 : rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl rule__OtherDataTypeDefinition__Group_5_0_1__2 ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29647:1: ( rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl rule__OtherDataTypeDefinition__Group_5_0_1__2 )
+            // InternalFormalML.g:29648:2: rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl rule__OtherDataTypeDefinition__Group_5_0_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_0_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0_1__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl"
+    // InternalFormalML.g:29655:1: rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl : ( ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1 ) ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29659:1: ( ( ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1 ) ) )
+            // InternalFormalML.g:29660:1: ( ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1 ) )
+            {
+            // InternalFormalML.g:29660:1: ( ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1 ) )
+            // InternalFormalML.g:29661:2: ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_0_1_1()); 
+            }
+            // InternalFormalML.g:29662:2: ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1 )
+            // InternalFormalML.g:29662:3: rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0_1__2"
+    // InternalFormalML.g:29670:1: rule__OtherDataTypeDefinition__Group_5_0_1__2 : rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29674:1: ( rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl )
+            // InternalFormalML.g:29675:2: rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0_1__2"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl"
+    // InternalFormalML.g:29681:1: rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl : ( ']' ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29685:1: ( ( ']' ) )
+            // InternalFormalML.g:29686:1: ( ']' )
+            {
+            // InternalFormalML.g:29686:1: ( ']' )
+            // InternalFormalML.g:29687:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_0_1_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_0_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_0_1__2__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1__0"
+    // InternalFormalML.g:29697:1: rule__OtherDataTypeDefinition__Group_5_1__0 : rule__OtherDataTypeDefinition__Group_5_1__0__Impl rule__OtherDataTypeDefinition__Group_5_1__1 ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29701:1: ( rule__OtherDataTypeDefinition__Group_5_1__0__Impl rule__OtherDataTypeDefinition__Group_5_1__1 )
+            // InternalFormalML.g:29702:2: rule__OtherDataTypeDefinition__Group_5_1__0__Impl rule__OtherDataTypeDefinition__Group_5_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_133);
+            rule__OtherDataTypeDefinition__Group_5_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1__0__Impl"
+    // InternalFormalML.g:29709:1: rule__OtherDataTypeDefinition__Group_5_1__0__Impl : ( ( rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0 ) ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29713:1: ( ( ( rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0 ) ) )
+            // InternalFormalML.g:29714:1: ( ( rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0 ) )
+            {
+            // InternalFormalML.g:29714:1: ( ( rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0 ) )
+            // InternalFormalML.g:29715:2: ( rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefAssignment_5_1_0()); 
+            }
+            // InternalFormalML.g:29716:2: ( rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0 )
+            // InternalFormalML.g:29716:3: rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefAssignment_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1__1"
+    // InternalFormalML.g:29724:1: rule__OtherDataTypeDefinition__Group_5_1__1 : rule__OtherDataTypeDefinition__Group_5_1__1__Impl ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29728:1: ( rule__OtherDataTypeDefinition__Group_5_1__1__Impl )
+            // InternalFormalML.g:29729:2: rule__OtherDataTypeDefinition__Group_5_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1__1__Impl"
+    // InternalFormalML.g:29735:1: rule__OtherDataTypeDefinition__Group_5_1__1__Impl : ( ( rule__OtherDataTypeDefinition__Group_5_1_1__0 )? ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29739:1: ( ( ( rule__OtherDataTypeDefinition__Group_5_1_1__0 )? ) )
+            // InternalFormalML.g:29740:1: ( ( rule__OtherDataTypeDefinition__Group_5_1_1__0 )? )
+            {
+            // InternalFormalML.g:29740:1: ( ( rule__OtherDataTypeDefinition__Group_5_1_1__0 )? )
+            // InternalFormalML.g:29741:2: ( rule__OtherDataTypeDefinition__Group_5_1_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1_1()); 
+            }
+            // InternalFormalML.g:29742:2: ( rule__OtherDataTypeDefinition__Group_5_1_1__0 )?
+            int alt457=2;
+            int LA457_0 = input.LA(1);
+
+            if ( (LA457_0==22) ) {
+                alt457=1;
+            }
+            switch (alt457) {
+                case 1 :
+                    // InternalFormalML.g:29742:3: rule__OtherDataTypeDefinition__Group_5_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinition__Group_5_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getGroup_5_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1_1__0"
+    // InternalFormalML.g:29751:1: rule__OtherDataTypeDefinition__Group_5_1_1__0 : rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl rule__OtherDataTypeDefinition__Group_5_1_1__1 ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29755:1: ( rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl rule__OtherDataTypeDefinition__Group_5_1_1__1 )
+            // InternalFormalML.g:29756:2: rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl rule__OtherDataTypeDefinition__Group_5_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_134);
+            rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1_1__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl"
+    // InternalFormalML.g:29763:1: rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl : ( '[' ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29767:1: ( ( '[' ) )
+            // InternalFormalML.g:29768:1: ( '[' )
+            {
+            // InternalFormalML.g:29768:1: ( '[' )
+            // InternalFormalML.g:29769:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_1_1_0()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1_1__1"
+    // InternalFormalML.g:29778:1: rule__OtherDataTypeDefinition__Group_5_1_1__1 : rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl rule__OtherDataTypeDefinition__Group_5_1_1__2 ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29782:1: ( rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl rule__OtherDataTypeDefinition__Group_5_1_1__2 )
+            // InternalFormalML.g:29783:2: rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl rule__OtherDataTypeDefinition__Group_5_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1_1__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl"
+    // InternalFormalML.g:29790:1: rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl : ( ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1 ) ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29794:1: ( ( ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1 ) ) )
+            // InternalFormalML.g:29795:1: ( ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1 ) )
+            {
+            // InternalFormalML.g:29795:1: ( ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1 ) )
+            // InternalFormalML.g:29796:2: ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_1_1_1()); 
+            }
+            // InternalFormalML.g:29797:2: ( rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1 )
+            // InternalFormalML.g:29797:3: rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityAssignment_5_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1_1__2"
+    // InternalFormalML.g:29805:1: rule__OtherDataTypeDefinition__Group_5_1_1__2 : rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29809:1: ( rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl )
+            // InternalFormalML.g:29810:2: rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1_1__2"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl"
+    // InternalFormalML.g:29816:1: rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl : ( ']' ) ;
+    public final void rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29820:1: ( ( ']' ) )
+            // InternalFormalML.g:29821:1: ( ']' )
+            {
+            // InternalFormalML.g:29821:1: ( ']' )
+            // InternalFormalML.g:29822:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_1_1_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__Group_5_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__0"
+    // InternalFormalML.g:29832:1: rule__OtherDataTypeDefinitionImpl__Group__0 : rule__OtherDataTypeDefinitionImpl__Group__0__Impl rule__OtherDataTypeDefinitionImpl__Group__1 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29836:1: ( rule__OtherDataTypeDefinitionImpl__Group__0__Impl rule__OtherDataTypeDefinitionImpl__Group__1 )
+            // InternalFormalML.g:29837:2: rule__OtherDataTypeDefinitionImpl__Group__0__Impl rule__OtherDataTypeDefinitionImpl__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__OtherDataTypeDefinitionImpl__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__0__Impl"
+    // InternalFormalML.g:29844:1: rule__OtherDataTypeDefinitionImpl__Group__0__Impl : ( () ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29848:1: ( ( () ) )
+            // InternalFormalML.g:29849:1: ( () )
+            {
+            // InternalFormalML.g:29849:1: ( () )
+            // InternalFormalML.g:29850:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getDataTypeReferenceAction_0()); 
+            }
+            // InternalFormalML.g:29851:2: ()
+            // InternalFormalML.g:29851:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getDataTypeReferenceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__1"
+    // InternalFormalML.g:29859:1: rule__OtherDataTypeDefinitionImpl__Group__1 : rule__OtherDataTypeDefinitionImpl__Group__1__Impl rule__OtherDataTypeDefinitionImpl__Group__2 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29863:1: ( rule__OtherDataTypeDefinitionImpl__Group__1__Impl rule__OtherDataTypeDefinitionImpl__Group__2 )
+            // InternalFormalML.g:29864:2: rule__OtherDataTypeDefinitionImpl__Group__1__Impl rule__OtherDataTypeDefinitionImpl__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_137);
+            rule__OtherDataTypeDefinitionImpl__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__1__Impl"
+    // InternalFormalML.g:29871:1: rule__OtherDataTypeDefinitionImpl__Group__1__Impl : ( ( rule__OtherDataTypeDefinitionImpl__NameAssignment_1 ) ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29875:1: ( ( ( rule__OtherDataTypeDefinitionImpl__NameAssignment_1 ) ) )
+            // InternalFormalML.g:29876:1: ( ( rule__OtherDataTypeDefinitionImpl__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:29876:1: ( ( rule__OtherDataTypeDefinitionImpl__NameAssignment_1 ) )
+            // InternalFormalML.g:29877:2: ( rule__OtherDataTypeDefinitionImpl__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:29878:2: ( rule__OtherDataTypeDefinitionImpl__NameAssignment_1 )
+            // InternalFormalML.g:29878:3: rule__OtherDataTypeDefinitionImpl__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__2"
+    // InternalFormalML.g:29886:1: rule__OtherDataTypeDefinitionImpl__Group__2 : rule__OtherDataTypeDefinitionImpl__Group__2__Impl rule__OtherDataTypeDefinitionImpl__Group__3 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29890:1: ( rule__OtherDataTypeDefinitionImpl__Group__2__Impl rule__OtherDataTypeDefinitionImpl__Group__3 )
+            // InternalFormalML.g:29891:2: rule__OtherDataTypeDefinitionImpl__Group__2__Impl rule__OtherDataTypeDefinitionImpl__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_137);
+            rule__OtherDataTypeDefinitionImpl__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__2"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__2__Impl"
+    // InternalFormalML.g:29898:1: rule__OtherDataTypeDefinitionImpl__Group__2__Impl : ( ( rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29902:1: ( ( ( rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:29903:1: ( ( rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:29903:1: ( ( rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:29904:2: ( rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:29905:2: ( rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            int alt458=2;
+            int LA458_0 = input.LA(1);
+
+            if ( (LA458_0==RULE_STRING) ) {
+                alt458=1;
+            }
+            switch (alt458) {
+                case 1 :
+                    // InternalFormalML.g:29905:3: rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__2__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__3"
+    // InternalFormalML.g:29913:1: rule__OtherDataTypeDefinitionImpl__Group__3 : rule__OtherDataTypeDefinitionImpl__Group__3__Impl rule__OtherDataTypeDefinitionImpl__Group__4 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29917:1: ( rule__OtherDataTypeDefinitionImpl__Group__3__Impl rule__OtherDataTypeDefinitionImpl__Group__4 )
+            // InternalFormalML.g:29918:2: rule__OtherDataTypeDefinitionImpl__Group__3__Impl rule__OtherDataTypeDefinitionImpl__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__OtherDataTypeDefinitionImpl__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__3"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__3__Impl"
+    // InternalFormalML.g:29925:1: rule__OtherDataTypeDefinitionImpl__Group__3__Impl : ( ( rule__OtherDataTypeDefinitionImpl__Alternatives_3 ) ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29929:1: ( ( ( rule__OtherDataTypeDefinitionImpl__Alternatives_3 ) ) )
+            // InternalFormalML.g:29930:1: ( ( rule__OtherDataTypeDefinitionImpl__Alternatives_3 ) )
+            {
+            // InternalFormalML.g:29930:1: ( ( rule__OtherDataTypeDefinitionImpl__Alternatives_3 ) )
+            // InternalFormalML.g:29931:2: ( rule__OtherDataTypeDefinitionImpl__Alternatives_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:29932:2: ( rule__OtherDataTypeDefinitionImpl__Alternatives_3 )
+            // InternalFormalML.g:29932:3: rule__OtherDataTypeDefinitionImpl__Alternatives_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Alternatives_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__3__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__4"
+    // InternalFormalML.g:29940:1: rule__OtherDataTypeDefinitionImpl__Group__4 : rule__OtherDataTypeDefinitionImpl__Group__4__Impl ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29944:1: ( rule__OtherDataTypeDefinitionImpl__Group__4__Impl )
+            // InternalFormalML.g:29945:2: rule__OtherDataTypeDefinitionImpl__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__4"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group__4__Impl"
+    // InternalFormalML.g:29951:1: rule__OtherDataTypeDefinitionImpl__Group__4__Impl : ( ( rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4 ) ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29955:1: ( ( ( rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4 ) ) )
+            // InternalFormalML.g:29956:1: ( ( rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4 ) )
+            {
+            // InternalFormalML.g:29956:1: ( ( rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4 ) )
+            // InternalFormalML.g:29957:2: ( rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefAssignment_4()); 
+            }
+            // InternalFormalML.g:29958:2: ( rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4 )
+            // InternalFormalML.g:29958:3: rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group__4__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0__0"
+    // InternalFormalML.g:29967:1: rule__OtherDataTypeDefinitionImpl__Group_3_0__0 : rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_0__1 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29971:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_0__1 )
+            // InternalFormalML.g:29972:2: rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_133);
+            rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl"
+    // InternalFormalML.g:29979:1: rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl : ( ( rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0 ) ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29983:1: ( ( ( rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0 ) ) )
+            // InternalFormalML.g:29984:1: ( ( rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0 ) )
+            {
+            // InternalFormalML.g:29984:1: ( ( rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0 ) )
+            // InternalFormalML.g:29985:2: ( rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportAssignment_3_0_0()); 
+            }
+            // InternalFormalML.g:29986:2: ( rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0 )
+            // InternalFormalML.g:29986:3: rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportAssignment_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0__1"
+    // InternalFormalML.g:29994:1: rule__OtherDataTypeDefinitionImpl__Group_3_0__1 : rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:29998:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl )
+            // InternalFormalML.g:29999:2: rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl"
+    // InternalFormalML.g:30005:1: rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl : ( ( rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0 )? ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30009:1: ( ( ( rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0 )? ) )
+            // InternalFormalML.g:30010:1: ( ( rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0 )? )
+            {
+            // InternalFormalML.g:30010:1: ( ( rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0 )? )
+            // InternalFormalML.g:30011:2: ( rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0_1()); 
+            }
+            // InternalFormalML.g:30012:2: ( rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0 )?
+            int alt459=2;
+            int LA459_0 = input.LA(1);
+
+            if ( (LA459_0==22) ) {
+                alt459=1;
+            }
+            switch (alt459) {
+                case 1 :
+                    // InternalFormalML.g:30012:3: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0"
+    // InternalFormalML.g:30021:1: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0 : rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30025:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1 )
+            // InternalFormalML.g:30026:2: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_134);
+            rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl"
+    // InternalFormalML.g:30033:1: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl : ( '[' ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30037:1: ( ( '[' ) )
+            // InternalFormalML.g:30038:1: ( '[' )
+            {
+            // InternalFormalML.g:30038:1: ( '[' )
+            // InternalFormalML.g:30039:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_0_1_0()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1"
+    // InternalFormalML.g:30048:1: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1 : rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30052:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2 )
+            // InternalFormalML.g:30053:2: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl"
+    // InternalFormalML.g:30060:1: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl : ( ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1 ) ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30064:1: ( ( ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1 ) ) )
+            // InternalFormalML.g:30065:1: ( ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1 ) )
+            {
+            // InternalFormalML.g:30065:1: ( ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1 ) )
+            // InternalFormalML.g:30066:2: ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_0_1_1()); 
+            }
+            // InternalFormalML.g:30067:2: ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1 )
+            // InternalFormalML.g:30067:3: rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2"
+    // InternalFormalML.g:30075:1: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2 : rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30079:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl )
+            // InternalFormalML.g:30080:2: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl"
+    // InternalFormalML.g:30086:1: rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl : ( ']' ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30090:1: ( ( ']' ) )
+            // InternalFormalML.g:30091:1: ( ']' )
+            {
+            // InternalFormalML.g:30091:1: ( ']' )
+            // InternalFormalML.g:30092:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_0_1_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_0_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_0_1__2__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1__0"
+    // InternalFormalML.g:30102:1: rule__OtherDataTypeDefinitionImpl__Group_3_1__0 : rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_1__1 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30106:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_1__1 )
+            // InternalFormalML.g:30107:2: rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_133);
+            rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl"
+    // InternalFormalML.g:30114:1: rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl : ( ( rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0 ) ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30118:1: ( ( ( rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0 ) ) )
+            // InternalFormalML.g:30119:1: ( ( rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0 ) )
+            {
+            // InternalFormalML.g:30119:1: ( ( rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0 ) )
+            // InternalFormalML.g:30120:2: ( rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefAssignment_3_1_0()); 
+            }
+            // InternalFormalML.g:30121:2: ( rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0 )
+            // InternalFormalML.g:30121:3: rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefAssignment_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1__1"
+    // InternalFormalML.g:30129:1: rule__OtherDataTypeDefinitionImpl__Group_3_1__1 : rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30133:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl )
+            // InternalFormalML.g:30134:2: rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl"
+    // InternalFormalML.g:30140:1: rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl : ( ( rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0 )? ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30144:1: ( ( ( rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0 )? ) )
+            // InternalFormalML.g:30145:1: ( ( rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0 )? )
+            {
+            // InternalFormalML.g:30145:1: ( ( rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0 )? )
+            // InternalFormalML.g:30146:2: ( rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1_1()); 
+            }
+            // InternalFormalML.g:30147:2: ( rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0 )?
+            int alt460=2;
+            int LA460_0 = input.LA(1);
+
+            if ( (LA460_0==22) ) {
+                alt460=1;
+            }
+            switch (alt460) {
+                case 1 :
+                    // InternalFormalML.g:30147:3: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getGroup_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0"
+    // InternalFormalML.g:30156:1: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0 : rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30160:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1 )
+            // InternalFormalML.g:30161:2: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_134);
+            rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl"
+    // InternalFormalML.g:30168:1: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl : ( '[' ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30172:1: ( ( '[' ) )
+            // InternalFormalML.g:30173:1: ( '[' )
+            {
+            // InternalFormalML.g:30173:1: ( '[' )
+            // InternalFormalML.g:30174:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_1_1_0()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1"
+    // InternalFormalML.g:30183:1: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1 : rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2 ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30187:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2 )
+            // InternalFormalML.g:30188:2: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl"
+    // InternalFormalML.g:30195:1: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl : ( ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1 ) ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30199:1: ( ( ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1 ) ) )
+            // InternalFormalML.g:30200:1: ( ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1 ) )
+            {
+            // InternalFormalML.g:30200:1: ( ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1 ) )
+            // InternalFormalML.g:30201:2: ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_1_1_1()); 
+            }
+            // InternalFormalML.g:30202:2: ( rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1 )
+            // InternalFormalML.g:30202:3: rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityAssignment_3_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2"
+    // InternalFormalML.g:30210:1: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2 : rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30214:1: ( rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl )
+            // InternalFormalML.g:30215:2: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl"
+    // InternalFormalML.g:30221:1: rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl : ( ']' ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30225:1: ( ( ']' ) )
+            // InternalFormalML.g:30226:1: ( ']' )
+            {
+            // InternalFormalML.g:30226:1: ( ']' )
+            // InternalFormalML.g:30227:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_1_1_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__Group_3_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group__0"
+    // InternalFormalML.g:30237:1: rule__PrimitiveIntegerType__Group__0 : rule__PrimitiveIntegerType__Group__0__Impl rule__PrimitiveIntegerType__Group__1 ;
+    public final void rule__PrimitiveIntegerType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30241:1: ( rule__PrimitiveIntegerType__Group__0__Impl rule__PrimitiveIntegerType__Group__1 )
+            // InternalFormalML.g:30242:2: rule__PrimitiveIntegerType__Group__0__Impl rule__PrimitiveIntegerType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_138);
+            rule__PrimitiveIntegerType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group__0"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group__0__Impl"
+    // InternalFormalML.g:30249:1: rule__PrimitiveIntegerType__Group__0__Impl : ( () ) ;
+    public final void rule__PrimitiveIntegerType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30253:1: ( ( () ) )
+            // InternalFormalML.g:30254:1: ( () )
+            {
+            // InternalFormalML.g:30254:1: ( () )
+            // InternalFormalML.g:30255:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getPrimitiveIntegerTypeAction_0()); 
+            }
+            // InternalFormalML.g:30256:2: ()
+            // InternalFormalML.g:30256:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getPrimitiveIntegerTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group__1"
+    // InternalFormalML.g:30264:1: rule__PrimitiveIntegerType__Group__1 : rule__PrimitiveIntegerType__Group__1__Impl rule__PrimitiveIntegerType__Group__2 ;
+    public final void rule__PrimitiveIntegerType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30268:1: ( rule__PrimitiveIntegerType__Group__1__Impl rule__PrimitiveIntegerType__Group__2 )
+            // InternalFormalML.g:30269:2: rule__PrimitiveIntegerType__Group__1__Impl rule__PrimitiveIntegerType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_138);
+            rule__PrimitiveIntegerType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group__1"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group__1__Impl"
+    // InternalFormalML.g:30276:1: rule__PrimitiveIntegerType__Group__1__Impl : ( ( rule__PrimitiveIntegerType__SignAssignment_1 )? ) ;
+    public final void rule__PrimitiveIntegerType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30280:1: ( ( ( rule__PrimitiveIntegerType__SignAssignment_1 )? ) )
+            // InternalFormalML.g:30281:1: ( ( rule__PrimitiveIntegerType__SignAssignment_1 )? )
+            {
+            // InternalFormalML.g:30281:1: ( ( rule__PrimitiveIntegerType__SignAssignment_1 )? )
+            // InternalFormalML.g:30282:2: ( rule__PrimitiveIntegerType__SignAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getSignAssignment_1()); 
+            }
+            // InternalFormalML.g:30283:2: ( rule__PrimitiveIntegerType__SignAssignment_1 )?
+            int alt461=2;
+            int LA461_0 = input.LA(1);
+
+            if ( ((LA461_0>=129 && LA461_0<=132)) ) {
+                alt461=1;
+            }
+            switch (alt461) {
+                case 1 :
+                    // InternalFormalML.g:30283:3: rule__PrimitiveIntegerType__SignAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveIntegerType__SignAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getSignAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group__2"
+    // InternalFormalML.g:30291:1: rule__PrimitiveIntegerType__Group__2 : rule__PrimitiveIntegerType__Group__2__Impl rule__PrimitiveIntegerType__Group__3 ;
+    public final void rule__PrimitiveIntegerType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30295:1: ( rule__PrimitiveIntegerType__Group__2__Impl rule__PrimitiveIntegerType__Group__3 )
+            // InternalFormalML.g:30296:2: rule__PrimitiveIntegerType__Group__2__Impl rule__PrimitiveIntegerType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_123);
+            rule__PrimitiveIntegerType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group__2"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group__2__Impl"
+    // InternalFormalML.g:30303:1: rule__PrimitiveIntegerType__Group__2__Impl : ( ( rule__PrimitiveIntegerType__Alternatives_2 ) ) ;
+    public final void rule__PrimitiveIntegerType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30307:1: ( ( ( rule__PrimitiveIntegerType__Alternatives_2 ) ) )
+            // InternalFormalML.g:30308:1: ( ( rule__PrimitiveIntegerType__Alternatives_2 ) )
+            {
+            // InternalFormalML.g:30308:1: ( ( rule__PrimitiveIntegerType__Alternatives_2 ) )
+            // InternalFormalML.g:30309:2: ( rule__PrimitiveIntegerType__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_2()); 
+            }
+            // InternalFormalML.g:30310:2: ( rule__PrimitiveIntegerType__Alternatives_2 )
+            // InternalFormalML.g:30310:3: rule__PrimitiveIntegerType__Alternatives_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group__3"
+    // InternalFormalML.g:30318:1: rule__PrimitiveIntegerType__Group__3 : rule__PrimitiveIntegerType__Group__3__Impl ;
+    public final void rule__PrimitiveIntegerType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30322:1: ( rule__PrimitiveIntegerType__Group__3__Impl )
+            // InternalFormalML.g:30323:2: rule__PrimitiveIntegerType__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group__3"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group__3__Impl"
+    // InternalFormalML.g:30329:1: rule__PrimitiveIntegerType__Group__3__Impl : ( ( rule__PrimitiveIntegerType__Alternatives_3 )? ) ;
+    public final void rule__PrimitiveIntegerType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30333:1: ( ( ( rule__PrimitiveIntegerType__Alternatives_3 )? ) )
+            // InternalFormalML.g:30334:1: ( ( rule__PrimitiveIntegerType__Alternatives_3 )? )
+            {
+            // InternalFormalML.g:30334:1: ( ( rule__PrimitiveIntegerType__Alternatives_3 )? )
+            // InternalFormalML.g:30335:2: ( rule__PrimitiveIntegerType__Alternatives_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:30336:2: ( rule__PrimitiveIntegerType__Alternatives_3 )?
+            int alt462=2;
+            int LA462_0 = input.LA(1);
+
+            if ( (LA462_0==31||LA462_0==125) ) {
+                alt462=1;
+            }
+            switch (alt462) {
+                case 1 :
+                    // InternalFormalML.g:30336:3: rule__PrimitiveIntegerType__Alternatives_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveIntegerType__Alternatives_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_0__0"
+    // InternalFormalML.g:30345:1: rule__PrimitiveIntegerType__Group_3_0__0 : rule__PrimitiveIntegerType__Group_3_0__0__Impl rule__PrimitiveIntegerType__Group_3_0__1 ;
+    public final void rule__PrimitiveIntegerType__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30349:1: ( rule__PrimitiveIntegerType__Group_3_0__0__Impl rule__PrimitiveIntegerType__Group_3_0__1 )
+            // InternalFormalML.g:30350:2: rule__PrimitiveIntegerType__Group_3_0__0__Impl rule__PrimitiveIntegerType__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__PrimitiveIntegerType__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_0__0"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_0__0__Impl"
+    // InternalFormalML.g:30357:1: rule__PrimitiveIntegerType__Group_3_0__0__Impl : ( ':' ) ;
+    public final void rule__PrimitiveIntegerType__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30361:1: ( ( ':' ) )
+            // InternalFormalML.g:30362:1: ( ':' )
+            {
+            // InternalFormalML.g:30362:1: ( ':' )
+            // InternalFormalML.g:30363:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getColonKeyword_3_0_0()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getColonKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_0__1"
+    // InternalFormalML.g:30372:1: rule__PrimitiveIntegerType__Group_3_0__1 : rule__PrimitiveIntegerType__Group_3_0__1__Impl ;
+    public final void rule__PrimitiveIntegerType__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30376:1: ( rule__PrimitiveIntegerType__Group_3_0__1__Impl )
+            // InternalFormalML.g:30377:2: rule__PrimitiveIntegerType__Group_3_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_0__1"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_0__1__Impl"
+    // InternalFormalML.g:30383:1: rule__PrimitiveIntegerType__Group_3_0__1__Impl : ( ( rule__PrimitiveIntegerType__SizeAssignment_3_0_1 ) ) ;
+    public final void rule__PrimitiveIntegerType__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30387:1: ( ( ( rule__PrimitiveIntegerType__SizeAssignment_3_0_1 ) ) )
+            // InternalFormalML.g:30388:1: ( ( rule__PrimitiveIntegerType__SizeAssignment_3_0_1 ) )
+            {
+            // InternalFormalML.g:30388:1: ( ( rule__PrimitiveIntegerType__SizeAssignment_3_0_1 ) )
+            // InternalFormalML.g:30389:2: ( rule__PrimitiveIntegerType__SizeAssignment_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_0_1()); 
+            }
+            // InternalFormalML.g:30390:2: ( rule__PrimitiveIntegerType__SizeAssignment_3_0_1 )
+            // InternalFormalML.g:30390:3: rule__PrimitiveIntegerType__SizeAssignment_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__SizeAssignment_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_1__0"
+    // InternalFormalML.g:30399:1: rule__PrimitiveIntegerType__Group_3_1__0 : rule__PrimitiveIntegerType__Group_3_1__0__Impl rule__PrimitiveIntegerType__Group_3_1__1 ;
+    public final void rule__PrimitiveIntegerType__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30403:1: ( rule__PrimitiveIntegerType__Group_3_1__0__Impl rule__PrimitiveIntegerType__Group_3_1__1 )
+            // InternalFormalML.g:30404:2: rule__PrimitiveIntegerType__Group_3_1__0__Impl rule__PrimitiveIntegerType__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveIntegerType__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_1__0"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_1__0__Impl"
+    // InternalFormalML.g:30411:1: rule__PrimitiveIntegerType__Group_3_1__0__Impl : ( '<' ) ;
+    public final void rule__PrimitiveIntegerType__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30415:1: ( ( '<' ) )
+            // InternalFormalML.g:30416:1: ( '<' )
+            {
+            // InternalFormalML.g:30416:1: ( '<' )
+            // InternalFormalML.g:30417:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getLessThanSignKeyword_3_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getLessThanSignKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_1__1"
+    // InternalFormalML.g:30426:1: rule__PrimitiveIntegerType__Group_3_1__1 : rule__PrimitiveIntegerType__Group_3_1__1__Impl rule__PrimitiveIntegerType__Group_3_1__2 ;
+    public final void rule__PrimitiveIntegerType__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30430:1: ( rule__PrimitiveIntegerType__Group_3_1__1__Impl rule__PrimitiveIntegerType__Group_3_1__2 )
+            // InternalFormalML.g:30431:2: rule__PrimitiveIntegerType__Group_3_1__1__Impl rule__PrimitiveIntegerType__Group_3_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveIntegerType__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group_3_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_1__1"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_1__1__Impl"
+    // InternalFormalML.g:30438:1: rule__PrimitiveIntegerType__Group_3_1__1__Impl : ( ( 'size:' )? ) ;
+    public final void rule__PrimitiveIntegerType__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30442:1: ( ( ( 'size:' )? ) )
+            // InternalFormalML.g:30443:1: ( ( 'size:' )? )
+            {
+            // InternalFormalML.g:30443:1: ( ( 'size:' )? )
+            // InternalFormalML.g:30444:2: ( 'size:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeKeyword_3_1_1()); 
+            }
+            // InternalFormalML.g:30445:2: ( 'size:' )?
+            int alt463=2;
+            int LA463_0 = input.LA(1);
+
+            if ( (LA463_0==230) ) {
+                alt463=1;
+            }
+            switch (alt463) {
+                case 1 :
+                    // InternalFormalML.g:30445:3: 'size:'
+                    {
+                    match(input,230,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeKeyword_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_1__2"
+    // InternalFormalML.g:30453:1: rule__PrimitiveIntegerType__Group_3_1__2 : rule__PrimitiveIntegerType__Group_3_1__2__Impl rule__PrimitiveIntegerType__Group_3_1__3 ;
+    public final void rule__PrimitiveIntegerType__Group_3_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30457:1: ( rule__PrimitiveIntegerType__Group_3_1__2__Impl rule__PrimitiveIntegerType__Group_3_1__3 )
+            // InternalFormalML.g:30458:2: rule__PrimitiveIntegerType__Group_3_1__2__Impl rule__PrimitiveIntegerType__Group_3_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__PrimitiveIntegerType__Group_3_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group_3_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_1__2"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_1__2__Impl"
+    // InternalFormalML.g:30465:1: rule__PrimitiveIntegerType__Group_3_1__2__Impl : ( ( rule__PrimitiveIntegerType__SizeAssignment_3_1_2 ) ) ;
+    public final void rule__PrimitiveIntegerType__Group_3_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30469:1: ( ( ( rule__PrimitiveIntegerType__SizeAssignment_3_1_2 ) ) )
+            // InternalFormalML.g:30470:1: ( ( rule__PrimitiveIntegerType__SizeAssignment_3_1_2 ) )
+            {
+            // InternalFormalML.g:30470:1: ( ( rule__PrimitiveIntegerType__SizeAssignment_3_1_2 ) )
+            // InternalFormalML.g:30471:2: ( rule__PrimitiveIntegerType__SizeAssignment_3_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_1_2()); 
+            }
+            // InternalFormalML.g:30472:2: ( rule__PrimitiveIntegerType__SizeAssignment_3_1_2 )
+            // InternalFormalML.g:30472:3: rule__PrimitiveIntegerType__SizeAssignment_3_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__SizeAssignment_3_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeAssignment_3_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_1__3"
+    // InternalFormalML.g:30480:1: rule__PrimitiveIntegerType__Group_3_1__3 : rule__PrimitiveIntegerType__Group_3_1__3__Impl ;
+    public final void rule__PrimitiveIntegerType__Group_3_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30484:1: ( rule__PrimitiveIntegerType__Group_3_1__3__Impl )
+            // InternalFormalML.g:30485:2: rule__PrimitiveIntegerType__Group_3_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveIntegerType__Group_3_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_1__3"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__Group_3_1__3__Impl"
+    // InternalFormalML.g:30491:1: rule__PrimitiveIntegerType__Group_3_1__3__Impl : ( '>' ) ;
+    public final void rule__PrimitiveIntegerType__Group_3_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30495:1: ( ( '>' ) )
+            // InternalFormalML.g:30496:1: ( '>' )
+            {
+            // InternalFormalML.g:30496:1: ( '>' )
+            // InternalFormalML.g:30497:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getGreaterThanSignKeyword_3_1_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getGreaterThanSignKeyword_3_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__Group_3_1__3__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group__0"
+    // InternalFormalML.g:30507:1: rule__PrimitiveRationalType__Group__0 : rule__PrimitiveRationalType__Group__0__Impl rule__PrimitiveRationalType__Group__1 ;
+    public final void rule__PrimitiveRationalType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30511:1: ( rule__PrimitiveRationalType__Group__0__Impl rule__PrimitiveRationalType__Group__1 )
+            // InternalFormalML.g:30512:2: rule__PrimitiveRationalType__Group__0__Impl rule__PrimitiveRationalType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_140);
+            rule__PrimitiveRationalType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group__0"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group__0__Impl"
+    // InternalFormalML.g:30519:1: rule__PrimitiveRationalType__Group__0__Impl : ( () ) ;
+    public final void rule__PrimitiveRationalType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30523:1: ( ( () ) )
+            // InternalFormalML.g:30524:1: ( () )
+            {
+            // InternalFormalML.g:30524:1: ( () )
+            // InternalFormalML.g:30525:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getPrimitiveRationalTypeAction_0()); 
+            }
+            // InternalFormalML.g:30526:2: ()
+            // InternalFormalML.g:30526:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getPrimitiveRationalTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group__1"
+    // InternalFormalML.g:30534:1: rule__PrimitiveRationalType__Group__1 : rule__PrimitiveRationalType__Group__1__Impl rule__PrimitiveRationalType__Group__2 ;
+    public final void rule__PrimitiveRationalType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30538:1: ( rule__PrimitiveRationalType__Group__1__Impl rule__PrimitiveRationalType__Group__2 )
+            // InternalFormalML.g:30539:2: rule__PrimitiveRationalType__Group__1__Impl rule__PrimitiveRationalType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_140);
+            rule__PrimitiveRationalType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group__1"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group__1__Impl"
+    // InternalFormalML.g:30546:1: rule__PrimitiveRationalType__Group__1__Impl : ( ( rule__PrimitiveRationalType__SignAssignment_1 )? ) ;
+    public final void rule__PrimitiveRationalType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30550:1: ( ( ( rule__PrimitiveRationalType__SignAssignment_1 )? ) )
+            // InternalFormalML.g:30551:1: ( ( rule__PrimitiveRationalType__SignAssignment_1 )? )
+            {
+            // InternalFormalML.g:30551:1: ( ( rule__PrimitiveRationalType__SignAssignment_1 )? )
+            // InternalFormalML.g:30552:2: ( rule__PrimitiveRationalType__SignAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getSignAssignment_1()); 
+            }
+            // InternalFormalML.g:30553:2: ( rule__PrimitiveRationalType__SignAssignment_1 )?
+            int alt464=2;
+            int LA464_0 = input.LA(1);
+
+            if ( ((LA464_0>=129 && LA464_0<=132)) ) {
+                alt464=1;
+            }
+            switch (alt464) {
+                case 1 :
+                    // InternalFormalML.g:30553:3: rule__PrimitiveRationalType__SignAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveRationalType__SignAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getSignAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group__2"
+    // InternalFormalML.g:30561:1: rule__PrimitiveRationalType__Group__2 : rule__PrimitiveRationalType__Group__2__Impl rule__PrimitiveRationalType__Group__3 ;
+    public final void rule__PrimitiveRationalType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30565:1: ( rule__PrimitiveRationalType__Group__2__Impl rule__PrimitiveRationalType__Group__3 )
+            // InternalFormalML.g:30566:2: rule__PrimitiveRationalType__Group__2__Impl rule__PrimitiveRationalType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_123);
+            rule__PrimitiveRationalType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group__2"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group__2__Impl"
+    // InternalFormalML.g:30573:1: rule__PrimitiveRationalType__Group__2__Impl : ( ( rule__PrimitiveRationalType__Alternatives_2 ) ) ;
+    public final void rule__PrimitiveRationalType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30577:1: ( ( ( rule__PrimitiveRationalType__Alternatives_2 ) ) )
+            // InternalFormalML.g:30578:1: ( ( rule__PrimitiveRationalType__Alternatives_2 ) )
+            {
+            // InternalFormalML.g:30578:1: ( ( rule__PrimitiveRationalType__Alternatives_2 ) )
+            // InternalFormalML.g:30579:2: ( rule__PrimitiveRationalType__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_2()); 
+            }
+            // InternalFormalML.g:30580:2: ( rule__PrimitiveRationalType__Alternatives_2 )
+            // InternalFormalML.g:30580:3: rule__PrimitiveRationalType__Alternatives_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group__3"
+    // InternalFormalML.g:30588:1: rule__PrimitiveRationalType__Group__3 : rule__PrimitiveRationalType__Group__3__Impl ;
+    public final void rule__PrimitiveRationalType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30592:1: ( rule__PrimitiveRationalType__Group__3__Impl )
+            // InternalFormalML.g:30593:2: rule__PrimitiveRationalType__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group__3"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group__3__Impl"
+    // InternalFormalML.g:30599:1: rule__PrimitiveRationalType__Group__3__Impl : ( ( rule__PrimitiveRationalType__Alternatives_3 )? ) ;
+    public final void rule__PrimitiveRationalType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30603:1: ( ( ( rule__PrimitiveRationalType__Alternatives_3 )? ) )
+            // InternalFormalML.g:30604:1: ( ( rule__PrimitiveRationalType__Alternatives_3 )? )
+            {
+            // InternalFormalML.g:30604:1: ( ( rule__PrimitiveRationalType__Alternatives_3 )? )
+            // InternalFormalML.g:30605:2: ( rule__PrimitiveRationalType__Alternatives_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:30606:2: ( rule__PrimitiveRationalType__Alternatives_3 )?
+            int alt465=2;
+            int LA465_0 = input.LA(1);
+
+            if ( (LA465_0==31||LA465_0==125) ) {
+                alt465=1;
+            }
+            switch (alt465) {
+                case 1 :
+                    // InternalFormalML.g:30606:3: rule__PrimitiveRationalType__Alternatives_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveRationalType__Alternatives_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_0__0"
+    // InternalFormalML.g:30615:1: rule__PrimitiveRationalType__Group_3_0__0 : rule__PrimitiveRationalType__Group_3_0__0__Impl rule__PrimitiveRationalType__Group_3_0__1 ;
+    public final void rule__PrimitiveRationalType__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30619:1: ( rule__PrimitiveRationalType__Group_3_0__0__Impl rule__PrimitiveRationalType__Group_3_0__1 )
+            // InternalFormalML.g:30620:2: rule__PrimitiveRationalType__Group_3_0__0__Impl rule__PrimitiveRationalType__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__PrimitiveRationalType__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_0__0"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_0__0__Impl"
+    // InternalFormalML.g:30627:1: rule__PrimitiveRationalType__Group_3_0__0__Impl : ( ':' ) ;
+    public final void rule__PrimitiveRationalType__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30631:1: ( ( ':' ) )
+            // InternalFormalML.g:30632:1: ( ':' )
+            {
+            // InternalFormalML.g:30632:1: ( ':' )
+            // InternalFormalML.g:30633:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getColonKeyword_3_0_0()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getColonKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_0__1"
+    // InternalFormalML.g:30642:1: rule__PrimitiveRationalType__Group_3_0__1 : rule__PrimitiveRationalType__Group_3_0__1__Impl ;
+    public final void rule__PrimitiveRationalType__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30646:1: ( rule__PrimitiveRationalType__Group_3_0__1__Impl )
+            // InternalFormalML.g:30647:2: rule__PrimitiveRationalType__Group_3_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_0__1"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_0__1__Impl"
+    // InternalFormalML.g:30653:1: rule__PrimitiveRationalType__Group_3_0__1__Impl : ( ( rule__PrimitiveRationalType__SizeAssignment_3_0_1 ) ) ;
+    public final void rule__PrimitiveRationalType__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30657:1: ( ( ( rule__PrimitiveRationalType__SizeAssignment_3_0_1 ) ) )
+            // InternalFormalML.g:30658:1: ( ( rule__PrimitiveRationalType__SizeAssignment_3_0_1 ) )
+            {
+            // InternalFormalML.g:30658:1: ( ( rule__PrimitiveRationalType__SizeAssignment_3_0_1 ) )
+            // InternalFormalML.g:30659:2: ( rule__PrimitiveRationalType__SizeAssignment_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_0_1()); 
+            }
+            // InternalFormalML.g:30660:2: ( rule__PrimitiveRationalType__SizeAssignment_3_0_1 )
+            // InternalFormalML.g:30660:3: rule__PrimitiveRationalType__SizeAssignment_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__SizeAssignment_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_1__0"
+    // InternalFormalML.g:30669:1: rule__PrimitiveRationalType__Group_3_1__0 : rule__PrimitiveRationalType__Group_3_1__0__Impl rule__PrimitiveRationalType__Group_3_1__1 ;
+    public final void rule__PrimitiveRationalType__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30673:1: ( rule__PrimitiveRationalType__Group_3_1__0__Impl rule__PrimitiveRationalType__Group_3_1__1 )
+            // InternalFormalML.g:30674:2: rule__PrimitiveRationalType__Group_3_1__0__Impl rule__PrimitiveRationalType__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveRationalType__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_1__0"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_1__0__Impl"
+    // InternalFormalML.g:30681:1: rule__PrimitiveRationalType__Group_3_1__0__Impl : ( '<' ) ;
+    public final void rule__PrimitiveRationalType__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30685:1: ( ( '<' ) )
+            // InternalFormalML.g:30686:1: ( '<' )
+            {
+            // InternalFormalML.g:30686:1: ( '<' )
+            // InternalFormalML.g:30687:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getLessThanSignKeyword_3_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getLessThanSignKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_1__1"
+    // InternalFormalML.g:30696:1: rule__PrimitiveRationalType__Group_3_1__1 : rule__PrimitiveRationalType__Group_3_1__1__Impl rule__PrimitiveRationalType__Group_3_1__2 ;
+    public final void rule__PrimitiveRationalType__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30700:1: ( rule__PrimitiveRationalType__Group_3_1__1__Impl rule__PrimitiveRationalType__Group_3_1__2 )
+            // InternalFormalML.g:30701:2: rule__PrimitiveRationalType__Group_3_1__1__Impl rule__PrimitiveRationalType__Group_3_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveRationalType__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group_3_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_1__1"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_1__1__Impl"
+    // InternalFormalML.g:30708:1: rule__PrimitiveRationalType__Group_3_1__1__Impl : ( ( 'size:' )? ) ;
+    public final void rule__PrimitiveRationalType__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30712:1: ( ( ( 'size:' )? ) )
+            // InternalFormalML.g:30713:1: ( ( 'size:' )? )
+            {
+            // InternalFormalML.g:30713:1: ( ( 'size:' )? )
+            // InternalFormalML.g:30714:2: ( 'size:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeKeyword_3_1_1()); 
+            }
+            // InternalFormalML.g:30715:2: ( 'size:' )?
+            int alt466=2;
+            int LA466_0 = input.LA(1);
+
+            if ( (LA466_0==230) ) {
+                alt466=1;
+            }
+            switch (alt466) {
+                case 1 :
+                    // InternalFormalML.g:30715:3: 'size:'
+                    {
+                    match(input,230,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeKeyword_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_1__2"
+    // InternalFormalML.g:30723:1: rule__PrimitiveRationalType__Group_3_1__2 : rule__PrimitiveRationalType__Group_3_1__2__Impl rule__PrimitiveRationalType__Group_3_1__3 ;
+    public final void rule__PrimitiveRationalType__Group_3_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30727:1: ( rule__PrimitiveRationalType__Group_3_1__2__Impl rule__PrimitiveRationalType__Group_3_1__3 )
+            // InternalFormalML.g:30728:2: rule__PrimitiveRationalType__Group_3_1__2__Impl rule__PrimitiveRationalType__Group_3_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__PrimitiveRationalType__Group_3_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group_3_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_1__2"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_1__2__Impl"
+    // InternalFormalML.g:30735:1: rule__PrimitiveRationalType__Group_3_1__2__Impl : ( ( rule__PrimitiveRationalType__SizeAssignment_3_1_2 ) ) ;
+    public final void rule__PrimitiveRationalType__Group_3_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30739:1: ( ( ( rule__PrimitiveRationalType__SizeAssignment_3_1_2 ) ) )
+            // InternalFormalML.g:30740:1: ( ( rule__PrimitiveRationalType__SizeAssignment_3_1_2 ) )
+            {
+            // InternalFormalML.g:30740:1: ( ( rule__PrimitiveRationalType__SizeAssignment_3_1_2 ) )
+            // InternalFormalML.g:30741:2: ( rule__PrimitiveRationalType__SizeAssignment_3_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_1_2()); 
+            }
+            // InternalFormalML.g:30742:2: ( rule__PrimitiveRationalType__SizeAssignment_3_1_2 )
+            // InternalFormalML.g:30742:3: rule__PrimitiveRationalType__SizeAssignment_3_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__SizeAssignment_3_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeAssignment_3_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_1__3"
+    // InternalFormalML.g:30750:1: rule__PrimitiveRationalType__Group_3_1__3 : rule__PrimitiveRationalType__Group_3_1__3__Impl ;
+    public final void rule__PrimitiveRationalType__Group_3_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30754:1: ( rule__PrimitiveRationalType__Group_3_1__3__Impl )
+            // InternalFormalML.g:30755:2: rule__PrimitiveRationalType__Group_3_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRationalType__Group_3_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_1__3"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__Group_3_1__3__Impl"
+    // InternalFormalML.g:30761:1: rule__PrimitiveRationalType__Group_3_1__3__Impl : ( '>' ) ;
+    public final void rule__PrimitiveRationalType__Group_3_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30765:1: ( ( '>' ) )
+            // InternalFormalML.g:30766:1: ( '>' )
+            {
+            // InternalFormalML.g:30766:1: ( '>' )
+            // InternalFormalML.g:30767:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getGreaterThanSignKeyword_3_1_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getGreaterThanSignKeyword_3_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__Group_3_1__3__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group__0"
+    // InternalFormalML.g:30777:1: rule__PrimitiveFloatType__Group__0 : rule__PrimitiveFloatType__Group__0__Impl rule__PrimitiveFloatType__Group__1 ;
+    public final void rule__PrimitiveFloatType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30781:1: ( rule__PrimitiveFloatType__Group__0__Impl rule__PrimitiveFloatType__Group__1 )
+            // InternalFormalML.g:30782:2: rule__PrimitiveFloatType__Group__0__Impl rule__PrimitiveFloatType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_141);
+            rule__PrimitiveFloatType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group__0"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group__0__Impl"
+    // InternalFormalML.g:30789:1: rule__PrimitiveFloatType__Group__0__Impl : ( () ) ;
+    public final void rule__PrimitiveFloatType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30793:1: ( ( () ) )
+            // InternalFormalML.g:30794:1: ( () )
+            {
+            // InternalFormalML.g:30794:1: ( () )
+            // InternalFormalML.g:30795:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getPrimitiveFloatTypeAction_0()); 
+            }
+            // InternalFormalML.g:30796:2: ()
+            // InternalFormalML.g:30796:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getPrimitiveFloatTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group__1"
+    // InternalFormalML.g:30804:1: rule__PrimitiveFloatType__Group__1 : rule__PrimitiveFloatType__Group__1__Impl rule__PrimitiveFloatType__Group__2 ;
+    public final void rule__PrimitiveFloatType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30808:1: ( rule__PrimitiveFloatType__Group__1__Impl rule__PrimitiveFloatType__Group__2 )
+            // InternalFormalML.g:30809:2: rule__PrimitiveFloatType__Group__1__Impl rule__PrimitiveFloatType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_141);
+            rule__PrimitiveFloatType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group__1"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group__1__Impl"
+    // InternalFormalML.g:30816:1: rule__PrimitiveFloatType__Group__1__Impl : ( ( rule__PrimitiveFloatType__SignAssignment_1 )? ) ;
+    public final void rule__PrimitiveFloatType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30820:1: ( ( ( rule__PrimitiveFloatType__SignAssignment_1 )? ) )
+            // InternalFormalML.g:30821:1: ( ( rule__PrimitiveFloatType__SignAssignment_1 )? )
+            {
+            // InternalFormalML.g:30821:1: ( ( rule__PrimitiveFloatType__SignAssignment_1 )? )
+            // InternalFormalML.g:30822:2: ( rule__PrimitiveFloatType__SignAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getSignAssignment_1()); 
+            }
+            // InternalFormalML.g:30823:2: ( rule__PrimitiveFloatType__SignAssignment_1 )?
+            int alt467=2;
+            int LA467_0 = input.LA(1);
+
+            if ( ((LA467_0>=129 && LA467_0<=132)) ) {
+                alt467=1;
+            }
+            switch (alt467) {
+                case 1 :
+                    // InternalFormalML.g:30823:3: rule__PrimitiveFloatType__SignAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveFloatType__SignAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getSignAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group__2"
+    // InternalFormalML.g:30831:1: rule__PrimitiveFloatType__Group__2 : rule__PrimitiveFloatType__Group__2__Impl rule__PrimitiveFloatType__Group__3 ;
+    public final void rule__PrimitiveFloatType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30835:1: ( rule__PrimitiveFloatType__Group__2__Impl rule__PrimitiveFloatType__Group__3 )
+            // InternalFormalML.g:30836:2: rule__PrimitiveFloatType__Group__2__Impl rule__PrimitiveFloatType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_123);
+            rule__PrimitiveFloatType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group__2"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group__2__Impl"
+    // InternalFormalML.g:30843:1: rule__PrimitiveFloatType__Group__2__Impl : ( ( rule__PrimitiveFloatType__Alternatives_2 ) ) ;
+    public final void rule__PrimitiveFloatType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30847:1: ( ( ( rule__PrimitiveFloatType__Alternatives_2 ) ) )
+            // InternalFormalML.g:30848:1: ( ( rule__PrimitiveFloatType__Alternatives_2 ) )
+            {
+            // InternalFormalML.g:30848:1: ( ( rule__PrimitiveFloatType__Alternatives_2 ) )
+            // InternalFormalML.g:30849:2: ( rule__PrimitiveFloatType__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_2()); 
+            }
+            // InternalFormalML.g:30850:2: ( rule__PrimitiveFloatType__Alternatives_2 )
+            // InternalFormalML.g:30850:3: rule__PrimitiveFloatType__Alternatives_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group__3"
+    // InternalFormalML.g:30858:1: rule__PrimitiveFloatType__Group__3 : rule__PrimitiveFloatType__Group__3__Impl ;
+    public final void rule__PrimitiveFloatType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30862:1: ( rule__PrimitiveFloatType__Group__3__Impl )
+            // InternalFormalML.g:30863:2: rule__PrimitiveFloatType__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group__3"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group__3__Impl"
+    // InternalFormalML.g:30869:1: rule__PrimitiveFloatType__Group__3__Impl : ( ( rule__PrimitiveFloatType__Alternatives_3 )? ) ;
+    public final void rule__PrimitiveFloatType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30873:1: ( ( ( rule__PrimitiveFloatType__Alternatives_3 )? ) )
+            // InternalFormalML.g:30874:1: ( ( rule__PrimitiveFloatType__Alternatives_3 )? )
+            {
+            // InternalFormalML.g:30874:1: ( ( rule__PrimitiveFloatType__Alternatives_3 )? )
+            // InternalFormalML.g:30875:2: ( rule__PrimitiveFloatType__Alternatives_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:30876:2: ( rule__PrimitiveFloatType__Alternatives_3 )?
+            int alt468=2;
+            int LA468_0 = input.LA(1);
+
+            if ( (LA468_0==31||LA468_0==125) ) {
+                alt468=1;
+            }
+            switch (alt468) {
+                case 1 :
+                    // InternalFormalML.g:30876:3: rule__PrimitiveFloatType__Alternatives_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveFloatType__Alternatives_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_0__0"
+    // InternalFormalML.g:30885:1: rule__PrimitiveFloatType__Group_3_0__0 : rule__PrimitiveFloatType__Group_3_0__0__Impl rule__PrimitiveFloatType__Group_3_0__1 ;
+    public final void rule__PrimitiveFloatType__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30889:1: ( rule__PrimitiveFloatType__Group_3_0__0__Impl rule__PrimitiveFloatType__Group_3_0__1 )
+            // InternalFormalML.g:30890:2: rule__PrimitiveFloatType__Group_3_0__0__Impl rule__PrimitiveFloatType__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__PrimitiveFloatType__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_0__0"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_0__0__Impl"
+    // InternalFormalML.g:30897:1: rule__PrimitiveFloatType__Group_3_0__0__Impl : ( ':' ) ;
+    public final void rule__PrimitiveFloatType__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30901:1: ( ( ':' ) )
+            // InternalFormalML.g:30902:1: ( ':' )
+            {
+            // InternalFormalML.g:30902:1: ( ':' )
+            // InternalFormalML.g:30903:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getColonKeyword_3_0_0()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getColonKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_0__1"
+    // InternalFormalML.g:30912:1: rule__PrimitiveFloatType__Group_3_0__1 : rule__PrimitiveFloatType__Group_3_0__1__Impl ;
+    public final void rule__PrimitiveFloatType__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30916:1: ( rule__PrimitiveFloatType__Group_3_0__1__Impl )
+            // InternalFormalML.g:30917:2: rule__PrimitiveFloatType__Group_3_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_0__1"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_0__1__Impl"
+    // InternalFormalML.g:30923:1: rule__PrimitiveFloatType__Group_3_0__1__Impl : ( ( rule__PrimitiveFloatType__SizeAssignment_3_0_1 ) ) ;
+    public final void rule__PrimitiveFloatType__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30927:1: ( ( ( rule__PrimitiveFloatType__SizeAssignment_3_0_1 ) ) )
+            // InternalFormalML.g:30928:1: ( ( rule__PrimitiveFloatType__SizeAssignment_3_0_1 ) )
+            {
+            // InternalFormalML.g:30928:1: ( ( rule__PrimitiveFloatType__SizeAssignment_3_0_1 ) )
+            // InternalFormalML.g:30929:2: ( rule__PrimitiveFloatType__SizeAssignment_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_0_1()); 
+            }
+            // InternalFormalML.g:30930:2: ( rule__PrimitiveFloatType__SizeAssignment_3_0_1 )
+            // InternalFormalML.g:30930:3: rule__PrimitiveFloatType__SizeAssignment_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__SizeAssignment_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_1__0"
+    // InternalFormalML.g:30939:1: rule__PrimitiveFloatType__Group_3_1__0 : rule__PrimitiveFloatType__Group_3_1__0__Impl rule__PrimitiveFloatType__Group_3_1__1 ;
+    public final void rule__PrimitiveFloatType__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30943:1: ( rule__PrimitiveFloatType__Group_3_1__0__Impl rule__PrimitiveFloatType__Group_3_1__1 )
+            // InternalFormalML.g:30944:2: rule__PrimitiveFloatType__Group_3_1__0__Impl rule__PrimitiveFloatType__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveFloatType__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_1__0"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_1__0__Impl"
+    // InternalFormalML.g:30951:1: rule__PrimitiveFloatType__Group_3_1__0__Impl : ( '<' ) ;
+    public final void rule__PrimitiveFloatType__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30955:1: ( ( '<' ) )
+            // InternalFormalML.g:30956:1: ( '<' )
+            {
+            // InternalFormalML.g:30956:1: ( '<' )
+            // InternalFormalML.g:30957:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getLessThanSignKeyword_3_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getLessThanSignKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_1__1"
+    // InternalFormalML.g:30966:1: rule__PrimitiveFloatType__Group_3_1__1 : rule__PrimitiveFloatType__Group_3_1__1__Impl rule__PrimitiveFloatType__Group_3_1__2 ;
+    public final void rule__PrimitiveFloatType__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30970:1: ( rule__PrimitiveFloatType__Group_3_1__1__Impl rule__PrimitiveFloatType__Group_3_1__2 )
+            // InternalFormalML.g:30971:2: rule__PrimitiveFloatType__Group_3_1__1__Impl rule__PrimitiveFloatType__Group_3_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveFloatType__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group_3_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_1__1"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_1__1__Impl"
+    // InternalFormalML.g:30978:1: rule__PrimitiveFloatType__Group_3_1__1__Impl : ( ( 'size:' )? ) ;
+    public final void rule__PrimitiveFloatType__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30982:1: ( ( ( 'size:' )? ) )
+            // InternalFormalML.g:30983:1: ( ( 'size:' )? )
+            {
+            // InternalFormalML.g:30983:1: ( ( 'size:' )? )
+            // InternalFormalML.g:30984:2: ( 'size:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeKeyword_3_1_1()); 
+            }
+            // InternalFormalML.g:30985:2: ( 'size:' )?
+            int alt469=2;
+            int LA469_0 = input.LA(1);
+
+            if ( (LA469_0==230) ) {
+                alt469=1;
+            }
+            switch (alt469) {
+                case 1 :
+                    // InternalFormalML.g:30985:3: 'size:'
+                    {
+                    match(input,230,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeKeyword_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_1__2"
+    // InternalFormalML.g:30993:1: rule__PrimitiveFloatType__Group_3_1__2 : rule__PrimitiveFloatType__Group_3_1__2__Impl rule__PrimitiveFloatType__Group_3_1__3 ;
+    public final void rule__PrimitiveFloatType__Group_3_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:30997:1: ( rule__PrimitiveFloatType__Group_3_1__2__Impl rule__PrimitiveFloatType__Group_3_1__3 )
+            // InternalFormalML.g:30998:2: rule__PrimitiveFloatType__Group_3_1__2__Impl rule__PrimitiveFloatType__Group_3_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__PrimitiveFloatType__Group_3_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group_3_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_1__2"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_1__2__Impl"
+    // InternalFormalML.g:31005:1: rule__PrimitiveFloatType__Group_3_1__2__Impl : ( ( rule__PrimitiveFloatType__SizeAssignment_3_1_2 ) ) ;
+    public final void rule__PrimitiveFloatType__Group_3_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31009:1: ( ( ( rule__PrimitiveFloatType__SizeAssignment_3_1_2 ) ) )
+            // InternalFormalML.g:31010:1: ( ( rule__PrimitiveFloatType__SizeAssignment_3_1_2 ) )
+            {
+            // InternalFormalML.g:31010:1: ( ( rule__PrimitiveFloatType__SizeAssignment_3_1_2 ) )
+            // InternalFormalML.g:31011:2: ( rule__PrimitiveFloatType__SizeAssignment_3_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_1_2()); 
+            }
+            // InternalFormalML.g:31012:2: ( rule__PrimitiveFloatType__SizeAssignment_3_1_2 )
+            // InternalFormalML.g:31012:3: rule__PrimitiveFloatType__SizeAssignment_3_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__SizeAssignment_3_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeAssignment_3_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_1__3"
+    // InternalFormalML.g:31020:1: rule__PrimitiveFloatType__Group_3_1__3 : rule__PrimitiveFloatType__Group_3_1__3__Impl ;
+    public final void rule__PrimitiveFloatType__Group_3_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31024:1: ( rule__PrimitiveFloatType__Group_3_1__3__Impl )
+            // InternalFormalML.g:31025:2: rule__PrimitiveFloatType__Group_3_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveFloatType__Group_3_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_1__3"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__Group_3_1__3__Impl"
+    // InternalFormalML.g:31031:1: rule__PrimitiveFloatType__Group_3_1__3__Impl : ( '>' ) ;
+    public final void rule__PrimitiveFloatType__Group_3_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31035:1: ( ( '>' ) )
+            // InternalFormalML.g:31036:1: ( '>' )
+            {
+            // InternalFormalML.g:31036:1: ( '>' )
+            // InternalFormalML.g:31037:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getGreaterThanSignKeyword_3_1_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getGreaterThanSignKeyword_3_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__Group_3_1__3__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group__0"
+    // InternalFormalML.g:31047:1: rule__PrimitiveRealType__Group__0 : rule__PrimitiveRealType__Group__0__Impl rule__PrimitiveRealType__Group__1 ;
+    public final void rule__PrimitiveRealType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31051:1: ( rule__PrimitiveRealType__Group__0__Impl rule__PrimitiveRealType__Group__1 )
+            // InternalFormalML.g:31052:2: rule__PrimitiveRealType__Group__0__Impl rule__PrimitiveRealType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_142);
+            rule__PrimitiveRealType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group__0"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group__0__Impl"
+    // InternalFormalML.g:31059:1: rule__PrimitiveRealType__Group__0__Impl : ( () ) ;
+    public final void rule__PrimitiveRealType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31063:1: ( ( () ) )
+            // InternalFormalML.g:31064:1: ( () )
+            {
+            // InternalFormalML.g:31064:1: ( () )
+            // InternalFormalML.g:31065:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getPrimitiveRealTypeAction_0()); 
+            }
+            // InternalFormalML.g:31066:2: ()
+            // InternalFormalML.g:31066:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getPrimitiveRealTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group__1"
+    // InternalFormalML.g:31074:1: rule__PrimitiveRealType__Group__1 : rule__PrimitiveRealType__Group__1__Impl rule__PrimitiveRealType__Group__2 ;
+    public final void rule__PrimitiveRealType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31078:1: ( rule__PrimitiveRealType__Group__1__Impl rule__PrimitiveRealType__Group__2 )
+            // InternalFormalML.g:31079:2: rule__PrimitiveRealType__Group__1__Impl rule__PrimitiveRealType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_142);
+            rule__PrimitiveRealType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group__1"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group__1__Impl"
+    // InternalFormalML.g:31086:1: rule__PrimitiveRealType__Group__1__Impl : ( ( rule__PrimitiveRealType__SignAssignment_1 )? ) ;
+    public final void rule__PrimitiveRealType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31090:1: ( ( ( rule__PrimitiveRealType__SignAssignment_1 )? ) )
+            // InternalFormalML.g:31091:1: ( ( rule__PrimitiveRealType__SignAssignment_1 )? )
+            {
+            // InternalFormalML.g:31091:1: ( ( rule__PrimitiveRealType__SignAssignment_1 )? )
+            // InternalFormalML.g:31092:2: ( rule__PrimitiveRealType__SignAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getSignAssignment_1()); 
+            }
+            // InternalFormalML.g:31093:2: ( rule__PrimitiveRealType__SignAssignment_1 )?
+            int alt470=2;
+            int LA470_0 = input.LA(1);
+
+            if ( ((LA470_0>=129 && LA470_0<=132)) ) {
+                alt470=1;
+            }
+            switch (alt470) {
+                case 1 :
+                    // InternalFormalML.g:31093:3: rule__PrimitiveRealType__SignAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveRealType__SignAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getSignAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group__2"
+    // InternalFormalML.g:31101:1: rule__PrimitiveRealType__Group__2 : rule__PrimitiveRealType__Group__2__Impl rule__PrimitiveRealType__Group__3 ;
+    public final void rule__PrimitiveRealType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31105:1: ( rule__PrimitiveRealType__Group__2__Impl rule__PrimitiveRealType__Group__3 )
+            // InternalFormalML.g:31106:2: rule__PrimitiveRealType__Group__2__Impl rule__PrimitiveRealType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_123);
+            rule__PrimitiveRealType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group__2"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group__2__Impl"
+    // InternalFormalML.g:31113:1: rule__PrimitiveRealType__Group__2__Impl : ( ( rule__PrimitiveRealType__Alternatives_2 ) ) ;
+    public final void rule__PrimitiveRealType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31117:1: ( ( ( rule__PrimitiveRealType__Alternatives_2 ) ) )
+            // InternalFormalML.g:31118:1: ( ( rule__PrimitiveRealType__Alternatives_2 ) )
+            {
+            // InternalFormalML.g:31118:1: ( ( rule__PrimitiveRealType__Alternatives_2 ) )
+            // InternalFormalML.g:31119:2: ( rule__PrimitiveRealType__Alternatives_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_2()); 
+            }
+            // InternalFormalML.g:31120:2: ( rule__PrimitiveRealType__Alternatives_2 )
+            // InternalFormalML.g:31120:3: rule__PrimitiveRealType__Alternatives_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Alternatives_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group__3"
+    // InternalFormalML.g:31128:1: rule__PrimitiveRealType__Group__3 : rule__PrimitiveRealType__Group__3__Impl ;
+    public final void rule__PrimitiveRealType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31132:1: ( rule__PrimitiveRealType__Group__3__Impl )
+            // InternalFormalML.g:31133:2: rule__PrimitiveRealType__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group__3"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group__3__Impl"
+    // InternalFormalML.g:31139:1: rule__PrimitiveRealType__Group__3__Impl : ( ( rule__PrimitiveRealType__Alternatives_3 )? ) ;
+    public final void rule__PrimitiveRealType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31143:1: ( ( ( rule__PrimitiveRealType__Alternatives_3 )? ) )
+            // InternalFormalML.g:31144:1: ( ( rule__PrimitiveRealType__Alternatives_3 )? )
+            {
+            // InternalFormalML.g:31144:1: ( ( rule__PrimitiveRealType__Alternatives_3 )? )
+            // InternalFormalML.g:31145:2: ( rule__PrimitiveRealType__Alternatives_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:31146:2: ( rule__PrimitiveRealType__Alternatives_3 )?
+            int alt471=2;
+            int LA471_0 = input.LA(1);
+
+            if ( (LA471_0==31||LA471_0==125) ) {
+                alt471=1;
+            }
+            switch (alt471) {
+                case 1 :
+                    // InternalFormalML.g:31146:3: rule__PrimitiveRealType__Alternatives_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveRealType__Alternatives_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_0__0"
+    // InternalFormalML.g:31155:1: rule__PrimitiveRealType__Group_3_0__0 : rule__PrimitiveRealType__Group_3_0__0__Impl rule__PrimitiveRealType__Group_3_0__1 ;
+    public final void rule__PrimitiveRealType__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31159:1: ( rule__PrimitiveRealType__Group_3_0__0__Impl rule__PrimitiveRealType__Group_3_0__1 )
+            // InternalFormalML.g:31160:2: rule__PrimitiveRealType__Group_3_0__0__Impl rule__PrimitiveRealType__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__PrimitiveRealType__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_0__0"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_0__0__Impl"
+    // InternalFormalML.g:31167:1: rule__PrimitiveRealType__Group_3_0__0__Impl : ( ':' ) ;
+    public final void rule__PrimitiveRealType__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31171:1: ( ( ':' ) )
+            // InternalFormalML.g:31172:1: ( ':' )
+            {
+            // InternalFormalML.g:31172:1: ( ':' )
+            // InternalFormalML.g:31173:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getColonKeyword_3_0_0()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getColonKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_0__1"
+    // InternalFormalML.g:31182:1: rule__PrimitiveRealType__Group_3_0__1 : rule__PrimitiveRealType__Group_3_0__1__Impl ;
+    public final void rule__PrimitiveRealType__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31186:1: ( rule__PrimitiveRealType__Group_3_0__1__Impl )
+            // InternalFormalML.g:31187:2: rule__PrimitiveRealType__Group_3_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_0__1"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_0__1__Impl"
+    // InternalFormalML.g:31193:1: rule__PrimitiveRealType__Group_3_0__1__Impl : ( ( rule__PrimitiveRealType__SizeAssignment_3_0_1 ) ) ;
+    public final void rule__PrimitiveRealType__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31197:1: ( ( ( rule__PrimitiveRealType__SizeAssignment_3_0_1 ) ) )
+            // InternalFormalML.g:31198:1: ( ( rule__PrimitiveRealType__SizeAssignment_3_0_1 ) )
+            {
+            // InternalFormalML.g:31198:1: ( ( rule__PrimitiveRealType__SizeAssignment_3_0_1 ) )
+            // InternalFormalML.g:31199:2: ( rule__PrimitiveRealType__SizeAssignment_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_0_1()); 
+            }
+            // InternalFormalML.g:31200:2: ( rule__PrimitiveRealType__SizeAssignment_3_0_1 )
+            // InternalFormalML.g:31200:3: rule__PrimitiveRealType__SizeAssignment_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__SizeAssignment_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_1__0"
+    // InternalFormalML.g:31209:1: rule__PrimitiveRealType__Group_3_1__0 : rule__PrimitiveRealType__Group_3_1__0__Impl rule__PrimitiveRealType__Group_3_1__1 ;
+    public final void rule__PrimitiveRealType__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31213:1: ( rule__PrimitiveRealType__Group_3_1__0__Impl rule__PrimitiveRealType__Group_3_1__1 )
+            // InternalFormalML.g:31214:2: rule__PrimitiveRealType__Group_3_1__0__Impl rule__PrimitiveRealType__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveRealType__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_1__0"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_1__0__Impl"
+    // InternalFormalML.g:31221:1: rule__PrimitiveRealType__Group_3_1__0__Impl : ( '<' ) ;
+    public final void rule__PrimitiveRealType__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31225:1: ( ( '<' ) )
+            // InternalFormalML.g:31226:1: ( '<' )
+            {
+            // InternalFormalML.g:31226:1: ( '<' )
+            // InternalFormalML.g:31227:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getLessThanSignKeyword_3_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getLessThanSignKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_1__1"
+    // InternalFormalML.g:31236:1: rule__PrimitiveRealType__Group_3_1__1 : rule__PrimitiveRealType__Group_3_1__1__Impl rule__PrimitiveRealType__Group_3_1__2 ;
+    public final void rule__PrimitiveRealType__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31240:1: ( rule__PrimitiveRealType__Group_3_1__1__Impl rule__PrimitiveRealType__Group_3_1__2 )
+            // InternalFormalML.g:31241:2: rule__PrimitiveRealType__Group_3_1__1__Impl rule__PrimitiveRealType__Group_3_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveRealType__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group_3_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_1__1"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_1__1__Impl"
+    // InternalFormalML.g:31248:1: rule__PrimitiveRealType__Group_3_1__1__Impl : ( ( 'size:' )? ) ;
+    public final void rule__PrimitiveRealType__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31252:1: ( ( ( 'size:' )? ) )
+            // InternalFormalML.g:31253:1: ( ( 'size:' )? )
+            {
+            // InternalFormalML.g:31253:1: ( ( 'size:' )? )
+            // InternalFormalML.g:31254:2: ( 'size:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getSizeKeyword_3_1_1()); 
+            }
+            // InternalFormalML.g:31255:2: ( 'size:' )?
+            int alt472=2;
+            int LA472_0 = input.LA(1);
+
+            if ( (LA472_0==230) ) {
+                alt472=1;
+            }
+            switch (alt472) {
+                case 1 :
+                    // InternalFormalML.g:31255:3: 'size:'
+                    {
+                    match(input,230,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getSizeKeyword_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_1__2"
+    // InternalFormalML.g:31263:1: rule__PrimitiveRealType__Group_3_1__2 : rule__PrimitiveRealType__Group_3_1__2__Impl rule__PrimitiveRealType__Group_3_1__3 ;
+    public final void rule__PrimitiveRealType__Group_3_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31267:1: ( rule__PrimitiveRealType__Group_3_1__2__Impl rule__PrimitiveRealType__Group_3_1__3 )
+            // InternalFormalML.g:31268:2: rule__PrimitiveRealType__Group_3_1__2__Impl rule__PrimitiveRealType__Group_3_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__PrimitiveRealType__Group_3_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group_3_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_1__2"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_1__2__Impl"
+    // InternalFormalML.g:31275:1: rule__PrimitiveRealType__Group_3_1__2__Impl : ( ( rule__PrimitiveRealType__SizeAssignment_3_1_2 ) ) ;
+    public final void rule__PrimitiveRealType__Group_3_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31279:1: ( ( ( rule__PrimitiveRealType__SizeAssignment_3_1_2 ) ) )
+            // InternalFormalML.g:31280:1: ( ( rule__PrimitiveRealType__SizeAssignment_3_1_2 ) )
+            {
+            // InternalFormalML.g:31280:1: ( ( rule__PrimitiveRealType__SizeAssignment_3_1_2 ) )
+            // InternalFormalML.g:31281:2: ( rule__PrimitiveRealType__SizeAssignment_3_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_1_2()); 
+            }
+            // InternalFormalML.g:31282:2: ( rule__PrimitiveRealType__SizeAssignment_3_1_2 )
+            // InternalFormalML.g:31282:3: rule__PrimitiveRealType__SizeAssignment_3_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__SizeAssignment_3_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getSizeAssignment_3_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_1__3"
+    // InternalFormalML.g:31290:1: rule__PrimitiveRealType__Group_3_1__3 : rule__PrimitiveRealType__Group_3_1__3__Impl ;
+    public final void rule__PrimitiveRealType__Group_3_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31294:1: ( rule__PrimitiveRealType__Group_3_1__3__Impl )
+            // InternalFormalML.g:31295:2: rule__PrimitiveRealType__Group_3_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveRealType__Group_3_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_1__3"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__Group_3_1__3__Impl"
+    // InternalFormalML.g:31301:1: rule__PrimitiveRealType__Group_3_1__3__Impl : ( '>' ) ;
+    public final void rule__PrimitiveRealType__Group_3_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31305:1: ( ( '>' ) )
+            // InternalFormalML.g:31306:1: ( '>' )
+            {
+            // InternalFormalML.g:31306:1: ( '>' )
+            // InternalFormalML.g:31307:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getGreaterThanSignKeyword_3_1_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getGreaterThanSignKeyword_3_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__Group_3_1__3__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0__0"
+    // InternalFormalML.g:31317:1: rule__PrimitiveTimeType__Group_0__0 : rule__PrimitiveTimeType__Group_0__0__Impl rule__PrimitiveTimeType__Group_0__1 ;
+    public final void rule__PrimitiveTimeType__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31321:1: ( rule__PrimitiveTimeType__Group_0__0__Impl rule__PrimitiveTimeType__Group_0__1 )
+            // InternalFormalML.g:31322:2: rule__PrimitiveTimeType__Group_0__0__Impl rule__PrimitiveTimeType__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_143);
+            rule__PrimitiveTimeType__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0__0"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0__0__Impl"
+    // InternalFormalML.g:31329:1: rule__PrimitiveTimeType__Group_0__0__Impl : ( () ) ;
+    public final void rule__PrimitiveTimeType__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31333:1: ( ( () ) )
+            // InternalFormalML.g:31334:1: ( () )
+            {
+            // InternalFormalML.g:31334:1: ( () )
+            // InternalFormalML.g:31335:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_0_0()); 
+            }
+            // InternalFormalML.g:31336:2: ()
+            // InternalFormalML.g:31336:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0__1"
+    // InternalFormalML.g:31344:1: rule__PrimitiveTimeType__Group_0__1 : rule__PrimitiveTimeType__Group_0__1__Impl rule__PrimitiveTimeType__Group_0__2 ;
+    public final void rule__PrimitiveTimeType__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31348:1: ( rule__PrimitiveTimeType__Group_0__1__Impl rule__PrimitiveTimeType__Group_0__2 )
+            // InternalFormalML.g:31349:2: rule__PrimitiveTimeType__Group_0__1__Impl rule__PrimitiveTimeType__Group_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_144);
+            rule__PrimitiveTimeType__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0__1"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0__1__Impl"
+    // InternalFormalML.g:31356:1: rule__PrimitiveTimeType__Group_0__1__Impl : ( 'time' ) ;
+    public final void rule__PrimitiveTimeType__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31360:1: ( ( 'time' ) )
+            // InternalFormalML.g:31361:1: ( 'time' )
+            {
+            // InternalFormalML.g:31361:1: ( 'time' )
+            // InternalFormalML.g:31362:2: 'time'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getTimeKeyword_0_1()); 
+            }
+            match(input,231,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getTimeKeyword_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0__2"
+    // InternalFormalML.g:31371:1: rule__PrimitiveTimeType__Group_0__2 : rule__PrimitiveTimeType__Group_0__2__Impl ;
+    public final void rule__PrimitiveTimeType__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31375:1: ( rule__PrimitiveTimeType__Group_0__2__Impl )
+            // InternalFormalML.g:31376:2: rule__PrimitiveTimeType__Group_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0__2"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0__2__Impl"
+    // InternalFormalML.g:31382:1: rule__PrimitiveTimeType__Group_0__2__Impl : ( ( rule__PrimitiveTimeType__Alternatives_0_2 )? ) ;
+    public final void rule__PrimitiveTimeType__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31386:1: ( ( ( rule__PrimitiveTimeType__Alternatives_0_2 )? ) )
+            // InternalFormalML.g:31387:1: ( ( rule__PrimitiveTimeType__Alternatives_0_2 )? )
+            {
+            // InternalFormalML.g:31387:1: ( ( rule__PrimitiveTimeType__Alternatives_0_2 )? )
+            // InternalFormalML.g:31388:2: ( rule__PrimitiveTimeType__Alternatives_0_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_0_2()); 
+            }
+            // InternalFormalML.g:31389:2: ( rule__PrimitiveTimeType__Alternatives_0_2 )?
+            int alt473=2;
+            int LA473_0 = input.LA(1);
+
+            if ( ((LA473_0>=59 && LA473_0<=72)||LA473_0==125||(LA473_0>=129 && LA473_0<=132)) ) {
+                alt473=1;
+            }
+            switch (alt473) {
+                case 1 :
+                    // InternalFormalML.g:31389:3: rule__PrimitiveTimeType__Alternatives_0_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveTimeType__Alternatives_0_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0_2_0__0"
+    // InternalFormalML.g:31398:1: rule__PrimitiveTimeType__Group_0_2_0__0 : rule__PrimitiveTimeType__Group_0_2_0__0__Impl rule__PrimitiveTimeType__Group_0_2_0__1 ;
+    public final void rule__PrimitiveTimeType__Group_0_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31402:1: ( rule__PrimitiveTimeType__Group_0_2_0__0__Impl rule__PrimitiveTimeType__Group_0_2_0__1 )
+            // InternalFormalML.g:31403:2: rule__PrimitiveTimeType__Group_0_2_0__0__Impl rule__PrimitiveTimeType__Group_0_2_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_144);
+            rule__PrimitiveTimeType__Group_0_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_0_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0_2_0__0"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0_2_0__0__Impl"
+    // InternalFormalML.g:31410:1: rule__PrimitiveTimeType__Group_0_2_0__0__Impl : ( '<' ) ;
+    public final void rule__PrimitiveTimeType__Group_0_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31414:1: ( ( '<' ) )
+            // InternalFormalML.g:31415:1: ( '<' )
+            {
+            // InternalFormalML.g:31415:1: ( '<' )
+            // InternalFormalML.g:31416:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_0_2_0_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_0_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0_2_0__1"
+    // InternalFormalML.g:31425:1: rule__PrimitiveTimeType__Group_0_2_0__1 : rule__PrimitiveTimeType__Group_0_2_0__1__Impl rule__PrimitiveTimeType__Group_0_2_0__2 ;
+    public final void rule__PrimitiveTimeType__Group_0_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31429:1: ( rule__PrimitiveTimeType__Group_0_2_0__1__Impl rule__PrimitiveTimeType__Group_0_2_0__2 )
+            // InternalFormalML.g:31430:2: rule__PrimitiveTimeType__Group_0_2_0__1__Impl rule__PrimitiveTimeType__Group_0_2_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__PrimitiveTimeType__Group_0_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_0_2_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0_2_0__1"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0_2_0__1__Impl"
+    // InternalFormalML.g:31437:1: rule__PrimitiveTimeType__Group_0_2_0__1__Impl : ( ( rule__PrimitiveTimeType__SupportAssignment_0_2_0_1 ) ) ;
+    public final void rule__PrimitiveTimeType__Group_0_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31441:1: ( ( ( rule__PrimitiveTimeType__SupportAssignment_0_2_0_1 ) ) )
+            // InternalFormalML.g:31442:1: ( ( rule__PrimitiveTimeType__SupportAssignment_0_2_0_1 ) )
+            {
+            // InternalFormalML.g:31442:1: ( ( rule__PrimitiveTimeType__SupportAssignment_0_2_0_1 ) )
+            // InternalFormalML.g:31443:2: ( rule__PrimitiveTimeType__SupportAssignment_0_2_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_0_1()); 
+            }
+            // InternalFormalML.g:31444:2: ( rule__PrimitiveTimeType__SupportAssignment_0_2_0_1 )
+            // InternalFormalML.g:31444:3: rule__PrimitiveTimeType__SupportAssignment_0_2_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__SupportAssignment_0_2_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_0_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0_2_0__2"
+    // InternalFormalML.g:31452:1: rule__PrimitiveTimeType__Group_0_2_0__2 : rule__PrimitiveTimeType__Group_0_2_0__2__Impl ;
+    public final void rule__PrimitiveTimeType__Group_0_2_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31456:1: ( rule__PrimitiveTimeType__Group_0_2_0__2__Impl )
+            // InternalFormalML.g:31457:2: rule__PrimitiveTimeType__Group_0_2_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_0_2_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0_2_0__2"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_0_2_0__2__Impl"
+    // InternalFormalML.g:31463:1: rule__PrimitiveTimeType__Group_0_2_0__2__Impl : ( '>' ) ;
+    public final void rule__PrimitiveTimeType__Group_0_2_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31467:1: ( ( '>' ) )
+            // InternalFormalML.g:31468:1: ( '>' )
+            {
+            // InternalFormalML.g:31468:1: ( '>' )
+            // InternalFormalML.g:31469:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_0_2_0_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_0_2_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_0_2_0__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1__0"
+    // InternalFormalML.g:31479:1: rule__PrimitiveTimeType__Group_1__0 : rule__PrimitiveTimeType__Group_1__0__Impl rule__PrimitiveTimeType__Group_1__1 ;
+    public final void rule__PrimitiveTimeType__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31483:1: ( rule__PrimitiveTimeType__Group_1__0__Impl rule__PrimitiveTimeType__Group_1__1 )
+            // InternalFormalML.g:31484:2: rule__PrimitiveTimeType__Group_1__0__Impl rule__PrimitiveTimeType__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_145);
+            rule__PrimitiveTimeType__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1__0"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1__0__Impl"
+    // InternalFormalML.g:31491:1: rule__PrimitiveTimeType__Group_1__0__Impl : ( () ) ;
+    public final void rule__PrimitiveTimeType__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31495:1: ( ( () ) )
+            // InternalFormalML.g:31496:1: ( () )
+            {
+            // InternalFormalML.g:31496:1: ( () )
+            // InternalFormalML.g:31497:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_1_0()); 
+            }
+            // InternalFormalML.g:31498:2: ()
+            // InternalFormalML.g:31498:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1__1"
+    // InternalFormalML.g:31506:1: rule__PrimitiveTimeType__Group_1__1 : rule__PrimitiveTimeType__Group_1__1__Impl rule__PrimitiveTimeType__Group_1__2 ;
+    public final void rule__PrimitiveTimeType__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31510:1: ( rule__PrimitiveTimeType__Group_1__1__Impl rule__PrimitiveTimeType__Group_1__2 )
+            // InternalFormalML.g:31511:2: rule__PrimitiveTimeType__Group_1__1__Impl rule__PrimitiveTimeType__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_144);
+            rule__PrimitiveTimeType__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1__1"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1__1__Impl"
+    // InternalFormalML.g:31518:1: rule__PrimitiveTimeType__Group_1__1__Impl : ( ( rule__PrimitiveTimeType__ClockAssignment_1_1 ) ) ;
+    public final void rule__PrimitiveTimeType__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31522:1: ( ( ( rule__PrimitiveTimeType__ClockAssignment_1_1 ) ) )
+            // InternalFormalML.g:31523:1: ( ( rule__PrimitiveTimeType__ClockAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:31523:1: ( ( rule__PrimitiveTimeType__ClockAssignment_1_1 ) )
+            // InternalFormalML.g:31524:2: ( rule__PrimitiveTimeType__ClockAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getClockAssignment_1_1()); 
+            }
+            // InternalFormalML.g:31525:2: ( rule__PrimitiveTimeType__ClockAssignment_1_1 )
+            // InternalFormalML.g:31525:3: rule__PrimitiveTimeType__ClockAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__ClockAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getClockAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1__2"
+    // InternalFormalML.g:31533:1: rule__PrimitiveTimeType__Group_1__2 : rule__PrimitiveTimeType__Group_1__2__Impl ;
+    public final void rule__PrimitiveTimeType__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31537:1: ( rule__PrimitiveTimeType__Group_1__2__Impl )
+            // InternalFormalML.g:31538:2: rule__PrimitiveTimeType__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1__2"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1__2__Impl"
+    // InternalFormalML.g:31544:1: rule__PrimitiveTimeType__Group_1__2__Impl : ( ( rule__PrimitiveTimeType__Alternatives_1_2 )? ) ;
+    public final void rule__PrimitiveTimeType__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31548:1: ( ( ( rule__PrimitiveTimeType__Alternatives_1_2 )? ) )
+            // InternalFormalML.g:31549:1: ( ( rule__PrimitiveTimeType__Alternatives_1_2 )? )
+            {
+            // InternalFormalML.g:31549:1: ( ( rule__PrimitiveTimeType__Alternatives_1_2 )? )
+            // InternalFormalML.g:31550:2: ( rule__PrimitiveTimeType__Alternatives_1_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_1_2()); 
+            }
+            // InternalFormalML.g:31551:2: ( rule__PrimitiveTimeType__Alternatives_1_2 )?
+            int alt474=2;
+            int LA474_0 = input.LA(1);
+
+            if ( ((LA474_0>=59 && LA474_0<=72)||LA474_0==125||(LA474_0>=129 && LA474_0<=132)) ) {
+                alt474=1;
+            }
+            switch (alt474) {
+                case 1 :
+                    // InternalFormalML.g:31551:3: rule__PrimitiveTimeType__Alternatives_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveTimeType__Alternatives_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getAlternatives_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1_2_0__0"
+    // InternalFormalML.g:31560:1: rule__PrimitiveTimeType__Group_1_2_0__0 : rule__PrimitiveTimeType__Group_1_2_0__0__Impl rule__PrimitiveTimeType__Group_1_2_0__1 ;
+    public final void rule__PrimitiveTimeType__Group_1_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31564:1: ( rule__PrimitiveTimeType__Group_1_2_0__0__Impl rule__PrimitiveTimeType__Group_1_2_0__1 )
+            // InternalFormalML.g:31565:2: rule__PrimitiveTimeType__Group_1_2_0__0__Impl rule__PrimitiveTimeType__Group_1_2_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_144);
+            rule__PrimitiveTimeType__Group_1_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_1_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1_2_0__0"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1_2_0__0__Impl"
+    // InternalFormalML.g:31572:1: rule__PrimitiveTimeType__Group_1_2_0__0__Impl : ( '<' ) ;
+    public final void rule__PrimitiveTimeType__Group_1_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31576:1: ( ( '<' ) )
+            // InternalFormalML.g:31577:1: ( '<' )
+            {
+            // InternalFormalML.g:31577:1: ( '<' )
+            // InternalFormalML.g:31578:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_1_2_0_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_1_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1_2_0__1"
+    // InternalFormalML.g:31587:1: rule__PrimitiveTimeType__Group_1_2_0__1 : rule__PrimitiveTimeType__Group_1_2_0__1__Impl rule__PrimitiveTimeType__Group_1_2_0__2 ;
+    public final void rule__PrimitiveTimeType__Group_1_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31591:1: ( rule__PrimitiveTimeType__Group_1_2_0__1__Impl rule__PrimitiveTimeType__Group_1_2_0__2 )
+            // InternalFormalML.g:31592:2: rule__PrimitiveTimeType__Group_1_2_0__1__Impl rule__PrimitiveTimeType__Group_1_2_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__PrimitiveTimeType__Group_1_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_1_2_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1_2_0__1"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1_2_0__1__Impl"
+    // InternalFormalML.g:31599:1: rule__PrimitiveTimeType__Group_1_2_0__1__Impl : ( ( rule__PrimitiveTimeType__SupportAssignment_1_2_0_1 ) ) ;
+    public final void rule__PrimitiveTimeType__Group_1_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31603:1: ( ( ( rule__PrimitiveTimeType__SupportAssignment_1_2_0_1 ) ) )
+            // InternalFormalML.g:31604:1: ( ( rule__PrimitiveTimeType__SupportAssignment_1_2_0_1 ) )
+            {
+            // InternalFormalML.g:31604:1: ( ( rule__PrimitiveTimeType__SupportAssignment_1_2_0_1 ) )
+            // InternalFormalML.g:31605:2: ( rule__PrimitiveTimeType__SupportAssignment_1_2_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_0_1()); 
+            }
+            // InternalFormalML.g:31606:2: ( rule__PrimitiveTimeType__SupportAssignment_1_2_0_1 )
+            // InternalFormalML.g:31606:3: rule__PrimitiveTimeType__SupportAssignment_1_2_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__SupportAssignment_1_2_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportAssignment_1_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1_2_0__2"
+    // InternalFormalML.g:31614:1: rule__PrimitiveTimeType__Group_1_2_0__2 : rule__PrimitiveTimeType__Group_1_2_0__2__Impl ;
+    public final void rule__PrimitiveTimeType__Group_1_2_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31618:1: ( rule__PrimitiveTimeType__Group_1_2_0__2__Impl )
+            // InternalFormalML.g:31619:2: rule__PrimitiveTimeType__Group_1_2_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveTimeType__Group_1_2_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1_2_0__2"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__Group_1_2_0__2__Impl"
+    // InternalFormalML.g:31625:1: rule__PrimitiveTimeType__Group_1_2_0__2__Impl : ( '>' ) ;
+    public final void rule__PrimitiveTimeType__Group_1_2_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31629:1: ( ( '>' ) )
+            // InternalFormalML.g:31630:1: ( '>' )
+            {
+            // InternalFormalML.g:31630:1: ( '>' )
+            // InternalFormalML.g:31631:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_1_2_0_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_1_2_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__Group_1_2_0__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveBooleanType__Group__0"
+    // InternalFormalML.g:31641:1: rule__PrimitiveBooleanType__Group__0 : rule__PrimitiveBooleanType__Group__0__Impl rule__PrimitiveBooleanType__Group__1 ;
+    public final void rule__PrimitiveBooleanType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31645:1: ( rule__PrimitiveBooleanType__Group__0__Impl rule__PrimitiveBooleanType__Group__1 )
+            // InternalFormalML.g:31646:2: rule__PrimitiveBooleanType__Group__0__Impl rule__PrimitiveBooleanType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_146);
+            rule__PrimitiveBooleanType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveBooleanType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveBooleanType__Group__0"
+
+
+    // $ANTLR start "rule__PrimitiveBooleanType__Group__0__Impl"
+    // InternalFormalML.g:31653:1: rule__PrimitiveBooleanType__Group__0__Impl : ( () ) ;
+    public final void rule__PrimitiveBooleanType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31657:1: ( ( () ) )
+            // InternalFormalML.g:31658:1: ( () )
+            {
+            // InternalFormalML.g:31658:1: ( () )
+            // InternalFormalML.g:31659:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveBooleanTypeAccess().getPrimitiveBooleanTypeAction_0()); 
+            }
+            // InternalFormalML.g:31660:2: ()
+            // InternalFormalML.g:31660:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveBooleanTypeAccess().getPrimitiveBooleanTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveBooleanType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveBooleanType__Group__1"
+    // InternalFormalML.g:31668:1: rule__PrimitiveBooleanType__Group__1 : rule__PrimitiveBooleanType__Group__1__Impl ;
+    public final void rule__PrimitiveBooleanType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31672:1: ( rule__PrimitiveBooleanType__Group__1__Impl )
+            // InternalFormalML.g:31673:2: rule__PrimitiveBooleanType__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveBooleanType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveBooleanType__Group__1"
+
+
+    // $ANTLR start "rule__PrimitiveBooleanType__Group__1__Impl"
+    // InternalFormalML.g:31679:1: rule__PrimitiveBooleanType__Group__1__Impl : ( ( rule__PrimitiveBooleanType__Alternatives_1 ) ) ;
+    public final void rule__PrimitiveBooleanType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31683:1: ( ( ( rule__PrimitiveBooleanType__Alternatives_1 ) ) )
+            // InternalFormalML.g:31684:1: ( ( rule__PrimitiveBooleanType__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:31684:1: ( ( rule__PrimitiveBooleanType__Alternatives_1 ) )
+            // InternalFormalML.g:31685:2: ( rule__PrimitiveBooleanType__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveBooleanTypeAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:31686:2: ( rule__PrimitiveBooleanType__Alternatives_1 )
+            // InternalFormalML.g:31686:3: rule__PrimitiveBooleanType__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveBooleanType__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveBooleanTypeAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveBooleanType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveCharacterType__Group__0"
+    // InternalFormalML.g:31695:1: rule__PrimitiveCharacterType__Group__0 : rule__PrimitiveCharacterType__Group__0__Impl rule__PrimitiveCharacterType__Group__1 ;
+    public final void rule__PrimitiveCharacterType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31699:1: ( rule__PrimitiveCharacterType__Group__0__Impl rule__PrimitiveCharacterType__Group__1 )
+            // InternalFormalML.g:31700:2: rule__PrimitiveCharacterType__Group__0__Impl rule__PrimitiveCharacterType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_147);
+            rule__PrimitiveCharacterType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveCharacterType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveCharacterType__Group__0"
+
+
+    // $ANTLR start "rule__PrimitiveCharacterType__Group__0__Impl"
+    // InternalFormalML.g:31707:1: rule__PrimitiveCharacterType__Group__0__Impl : ( () ) ;
+    public final void rule__PrimitiveCharacterType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31711:1: ( ( () ) )
+            // InternalFormalML.g:31712:1: ( () )
+            {
+            // InternalFormalML.g:31712:1: ( () )
+            // InternalFormalML.g:31713:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveCharacterTypeAccess().getPrimitiveCharacterTypeAction_0()); 
+            }
+            // InternalFormalML.g:31714:2: ()
+            // InternalFormalML.g:31714:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveCharacterTypeAccess().getPrimitiveCharacterTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveCharacterType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveCharacterType__Group__1"
+    // InternalFormalML.g:31722:1: rule__PrimitiveCharacterType__Group__1 : rule__PrimitiveCharacterType__Group__1__Impl ;
+    public final void rule__PrimitiveCharacterType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31726:1: ( rule__PrimitiveCharacterType__Group__1__Impl )
+            // InternalFormalML.g:31727:2: rule__PrimitiveCharacterType__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveCharacterType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveCharacterType__Group__1"
+
+
+    // $ANTLR start "rule__PrimitiveCharacterType__Group__1__Impl"
+    // InternalFormalML.g:31733:1: rule__PrimitiveCharacterType__Group__1__Impl : ( 'char' ) ;
+    public final void rule__PrimitiveCharacterType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31737:1: ( ( 'char' ) )
+            // InternalFormalML.g:31738:1: ( 'char' )
+            {
+            // InternalFormalML.g:31738:1: ( 'char' )
+            // InternalFormalML.g:31739:2: 'char'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveCharacterTypeAccess().getCharKeyword_1()); 
+            }
+            match(input,232,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveCharacterTypeAccess().getCharKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveCharacterType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group__0"
+    // InternalFormalML.g:31749:1: rule__PrimitiveStringType__Group__0 : rule__PrimitiveStringType__Group__0__Impl rule__PrimitiveStringType__Group__1 ;
+    public final void rule__PrimitiveStringType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31753:1: ( rule__PrimitiveStringType__Group__0__Impl rule__PrimitiveStringType__Group__1 )
+            // InternalFormalML.g:31754:2: rule__PrimitiveStringType__Group__0__Impl rule__PrimitiveStringType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_148);
+            rule__PrimitiveStringType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group__0"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group__0__Impl"
+    // InternalFormalML.g:31761:1: rule__PrimitiveStringType__Group__0__Impl : ( () ) ;
+    public final void rule__PrimitiveStringType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31765:1: ( ( () ) )
+            // InternalFormalML.g:31766:1: ( () )
+            {
+            // InternalFormalML.g:31766:1: ( () )
+            // InternalFormalML.g:31767:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getPrimitiveStringTypeAction_0()); 
+            }
+            // InternalFormalML.g:31768:2: ()
+            // InternalFormalML.g:31768:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getPrimitiveStringTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group__1"
+    // InternalFormalML.g:31776:1: rule__PrimitiveStringType__Group__1 : rule__PrimitiveStringType__Group__1__Impl rule__PrimitiveStringType__Group__2 ;
+    public final void rule__PrimitiveStringType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31780:1: ( rule__PrimitiveStringType__Group__1__Impl rule__PrimitiveStringType__Group__2 )
+            // InternalFormalML.g:31781:2: rule__PrimitiveStringType__Group__1__Impl rule__PrimitiveStringType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_123);
+            rule__PrimitiveStringType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group__1"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group__1__Impl"
+    // InternalFormalML.g:31788:1: rule__PrimitiveStringType__Group__1__Impl : ( 'string' ) ;
+    public final void rule__PrimitiveStringType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31792:1: ( ( 'string' ) )
+            // InternalFormalML.g:31793:1: ( 'string' )
+            {
+            // InternalFormalML.g:31793:1: ( 'string' )
+            // InternalFormalML.g:31794:2: 'string'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getStringKeyword_1()); 
+            }
+            match(input,233,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getStringKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group__2"
+    // InternalFormalML.g:31803:1: rule__PrimitiveStringType__Group__2 : rule__PrimitiveStringType__Group__2__Impl ;
+    public final void rule__PrimitiveStringType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31807:1: ( rule__PrimitiveStringType__Group__2__Impl )
+            // InternalFormalML.g:31808:2: rule__PrimitiveStringType__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group__2"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group__2__Impl"
+    // InternalFormalML.g:31814:1: rule__PrimitiveStringType__Group__2__Impl : ( ( rule__PrimitiveStringType__Alternatives_2 )? ) ;
+    public final void rule__PrimitiveStringType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31818:1: ( ( ( rule__PrimitiveStringType__Alternatives_2 )? ) )
+            // InternalFormalML.g:31819:1: ( ( rule__PrimitiveStringType__Alternatives_2 )? )
+            {
+            // InternalFormalML.g:31819:1: ( ( rule__PrimitiveStringType__Alternatives_2 )? )
+            // InternalFormalML.g:31820:2: ( rule__PrimitiveStringType__Alternatives_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getAlternatives_2()); 
+            }
+            // InternalFormalML.g:31821:2: ( rule__PrimitiveStringType__Alternatives_2 )?
+            int alt475=2;
+            int LA475_0 = input.LA(1);
+
+            if ( (LA475_0==31||LA475_0==125) ) {
+                alt475=1;
+            }
+            switch (alt475) {
+                case 1 :
+                    // InternalFormalML.g:31821:3: rule__PrimitiveStringType__Alternatives_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveStringType__Alternatives_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_0__0"
+    // InternalFormalML.g:31830:1: rule__PrimitiveStringType__Group_2_0__0 : rule__PrimitiveStringType__Group_2_0__0__Impl rule__PrimitiveStringType__Group_2_0__1 ;
+    public final void rule__PrimitiveStringType__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31834:1: ( rule__PrimitiveStringType__Group_2_0__0__Impl rule__PrimitiveStringType__Group_2_0__1 )
+            // InternalFormalML.g:31835:2: rule__PrimitiveStringType__Group_2_0__0__Impl rule__PrimitiveStringType__Group_2_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__PrimitiveStringType__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_0__0"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_0__0__Impl"
+    // InternalFormalML.g:31842:1: rule__PrimitiveStringType__Group_2_0__0__Impl : ( ':' ) ;
+    public final void rule__PrimitiveStringType__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31846:1: ( ( ':' ) )
+            // InternalFormalML.g:31847:1: ( ':' )
+            {
+            // InternalFormalML.g:31847:1: ( ':' )
+            // InternalFormalML.g:31848:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getColonKeyword_2_0_0()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getColonKeyword_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_0__1"
+    // InternalFormalML.g:31857:1: rule__PrimitiveStringType__Group_2_0__1 : rule__PrimitiveStringType__Group_2_0__1__Impl ;
+    public final void rule__PrimitiveStringType__Group_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31861:1: ( rule__PrimitiveStringType__Group_2_0__1__Impl )
+            // InternalFormalML.g:31862:2: rule__PrimitiveStringType__Group_2_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_0__1"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_0__1__Impl"
+    // InternalFormalML.g:31868:1: rule__PrimitiveStringType__Group_2_0__1__Impl : ( ( rule__PrimitiveStringType__SizeAssignment_2_0_1 ) ) ;
+    public final void rule__PrimitiveStringType__Group_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31872:1: ( ( ( rule__PrimitiveStringType__SizeAssignment_2_0_1 ) ) )
+            // InternalFormalML.g:31873:1: ( ( rule__PrimitiveStringType__SizeAssignment_2_0_1 ) )
+            {
+            // InternalFormalML.g:31873:1: ( ( rule__PrimitiveStringType__SizeAssignment_2_0_1 ) )
+            // InternalFormalML.g:31874:2: ( rule__PrimitiveStringType__SizeAssignment_2_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_0_1()); 
+            }
+            // InternalFormalML.g:31875:2: ( rule__PrimitiveStringType__SizeAssignment_2_0_1 )
+            // InternalFormalML.g:31875:3: rule__PrimitiveStringType__SizeAssignment_2_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__SizeAssignment_2_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_1__0"
+    // InternalFormalML.g:31884:1: rule__PrimitiveStringType__Group_2_1__0 : rule__PrimitiveStringType__Group_2_1__0__Impl rule__PrimitiveStringType__Group_2_1__1 ;
+    public final void rule__PrimitiveStringType__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31888:1: ( rule__PrimitiveStringType__Group_2_1__0__Impl rule__PrimitiveStringType__Group_2_1__1 )
+            // InternalFormalML.g:31889:2: rule__PrimitiveStringType__Group_2_1__0__Impl rule__PrimitiveStringType__Group_2_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveStringType__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_1__0"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_1__0__Impl"
+    // InternalFormalML.g:31896:1: rule__PrimitiveStringType__Group_2_1__0__Impl : ( '<' ) ;
+    public final void rule__PrimitiveStringType__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31900:1: ( ( '<' ) )
+            // InternalFormalML.g:31901:1: ( '<' )
+            {
+            // InternalFormalML.g:31901:1: ( '<' )
+            // InternalFormalML.g:31902:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getLessThanSignKeyword_2_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getLessThanSignKeyword_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_1__1"
+    // InternalFormalML.g:31911:1: rule__PrimitiveStringType__Group_2_1__1 : rule__PrimitiveStringType__Group_2_1__1__Impl rule__PrimitiveStringType__Group_2_1__2 ;
+    public final void rule__PrimitiveStringType__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31915:1: ( rule__PrimitiveStringType__Group_2_1__1__Impl rule__PrimitiveStringType__Group_2_1__2 )
+            // InternalFormalML.g:31916:2: rule__PrimitiveStringType__Group_2_1__1__Impl rule__PrimitiveStringType__Group_2_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_139);
+            rule__PrimitiveStringType__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group_2_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_1__1"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_1__1__Impl"
+    // InternalFormalML.g:31923:1: rule__PrimitiveStringType__Group_2_1__1__Impl : ( ( 'size:' )? ) ;
+    public final void rule__PrimitiveStringType__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31927:1: ( ( ( 'size:' )? ) )
+            // InternalFormalML.g:31928:1: ( ( 'size:' )? )
+            {
+            // InternalFormalML.g:31928:1: ( ( 'size:' )? )
+            // InternalFormalML.g:31929:2: ( 'size:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getSizeKeyword_2_1_1()); 
+            }
+            // InternalFormalML.g:31930:2: ( 'size:' )?
+            int alt476=2;
+            int LA476_0 = input.LA(1);
+
+            if ( (LA476_0==230) ) {
+                alt476=1;
+            }
+            switch (alt476) {
+                case 1 :
+                    // InternalFormalML.g:31930:3: 'size:'
+                    {
+                    match(input,230,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getSizeKeyword_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_1__2"
+    // InternalFormalML.g:31938:1: rule__PrimitiveStringType__Group_2_1__2 : rule__PrimitiveStringType__Group_2_1__2__Impl rule__PrimitiveStringType__Group_2_1__3 ;
+    public final void rule__PrimitiveStringType__Group_2_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31942:1: ( rule__PrimitiveStringType__Group_2_1__2__Impl rule__PrimitiveStringType__Group_2_1__3 )
+            // InternalFormalML.g:31943:2: rule__PrimitiveStringType__Group_2_1__2__Impl rule__PrimitiveStringType__Group_2_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__PrimitiveStringType__Group_2_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group_2_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_1__2"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_1__2__Impl"
+    // InternalFormalML.g:31950:1: rule__PrimitiveStringType__Group_2_1__2__Impl : ( ( rule__PrimitiveStringType__SizeAssignment_2_1_2 ) ) ;
+    public final void rule__PrimitiveStringType__Group_2_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31954:1: ( ( ( rule__PrimitiveStringType__SizeAssignment_2_1_2 ) ) )
+            // InternalFormalML.g:31955:1: ( ( rule__PrimitiveStringType__SizeAssignment_2_1_2 ) )
+            {
+            // InternalFormalML.g:31955:1: ( ( rule__PrimitiveStringType__SizeAssignment_2_1_2 ) )
+            // InternalFormalML.g:31956:2: ( rule__PrimitiveStringType__SizeAssignment_2_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_1_2()); 
+            }
+            // InternalFormalML.g:31957:2: ( rule__PrimitiveStringType__SizeAssignment_2_1_2 )
+            // InternalFormalML.g:31957:3: rule__PrimitiveStringType__SizeAssignment_2_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__SizeAssignment_2_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getSizeAssignment_2_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_1__3"
+    // InternalFormalML.g:31965:1: rule__PrimitiveStringType__Group_2_1__3 : rule__PrimitiveStringType__Group_2_1__3__Impl ;
+    public final void rule__PrimitiveStringType__Group_2_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31969:1: ( rule__PrimitiveStringType__Group_2_1__3__Impl )
+            // InternalFormalML.g:31970:2: rule__PrimitiveStringType__Group_2_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveStringType__Group_2_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_1__3"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__Group_2_1__3__Impl"
+    // InternalFormalML.g:31976:1: rule__PrimitiveStringType__Group_2_1__3__Impl : ( '>' ) ;
+    public final void rule__PrimitiveStringType__Group_2_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31980:1: ( ( '>' ) )
+            // InternalFormalML.g:31981:1: ( '>' )
+            {
+            // InternalFormalML.g:31981:1: ( '>' )
+            // InternalFormalML.g:31982:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getGreaterThanSignKeyword_2_1_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getGreaterThanSignKeyword_2_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__Group_2_1__3__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group__0"
+    // InternalFormalML.g:31992:1: rule__PrimitiveInstanceType__Group__0 : rule__PrimitiveInstanceType__Group__0__Impl rule__PrimitiveInstanceType__Group__1 ;
+    public final void rule__PrimitiveInstanceType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:31996:1: ( rule__PrimitiveInstanceType__Group__0__Impl rule__PrimitiveInstanceType__Group__1 )
+            // InternalFormalML.g:31997:2: rule__PrimitiveInstanceType__Group__0__Impl rule__PrimitiveInstanceType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_149);
+            rule__PrimitiveInstanceType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group__0"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group__0__Impl"
+    // InternalFormalML.g:32004:1: rule__PrimitiveInstanceType__Group__0__Impl : ( () ) ;
+    public final void rule__PrimitiveInstanceType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32008:1: ( ( () ) )
+            // InternalFormalML.g:32009:1: ( () )
+            {
+            // InternalFormalML.g:32009:1: ( () )
+            // InternalFormalML.g:32010:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getPrimitiveInstanceTypeAction_0()); 
+            }
+            // InternalFormalML.g:32011:2: ()
+            // InternalFormalML.g:32011:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getPrimitiveInstanceTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group__1"
+    // InternalFormalML.g:32019:1: rule__PrimitiveInstanceType__Group__1 : rule__PrimitiveInstanceType__Group__1__Impl rule__PrimitiveInstanceType__Group__2 ;
+    public final void rule__PrimitiveInstanceType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32023:1: ( rule__PrimitiveInstanceType__Group__1__Impl rule__PrimitiveInstanceType__Group__2 )
+            // InternalFormalML.g:32024:2: rule__PrimitiveInstanceType__Group__1__Impl rule__PrimitiveInstanceType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__PrimitiveInstanceType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group__1"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group__1__Impl"
+    // InternalFormalML.g:32031:1: rule__PrimitiveInstanceType__Group__1__Impl : ( ( rule__PrimitiveInstanceType__ExpectedAssignment_1 ) ) ;
+    public final void rule__PrimitiveInstanceType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32035:1: ( ( ( rule__PrimitiveInstanceType__ExpectedAssignment_1 ) ) )
+            // InternalFormalML.g:32036:1: ( ( rule__PrimitiveInstanceType__ExpectedAssignment_1 ) )
+            {
+            // InternalFormalML.g:32036:1: ( ( rule__PrimitiveInstanceType__ExpectedAssignment_1 ) )
+            // InternalFormalML.g:32037:2: ( rule__PrimitiveInstanceType__ExpectedAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedAssignment_1()); 
+            }
+            // InternalFormalML.g:32038:2: ( rule__PrimitiveInstanceType__ExpectedAssignment_1 )
+            // InternalFormalML.g:32038:3: rule__PrimitiveInstanceType__ExpectedAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceType__ExpectedAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group__2"
+    // InternalFormalML.g:32046:1: rule__PrimitiveInstanceType__Group__2 : rule__PrimitiveInstanceType__Group__2__Impl ;
+    public final void rule__PrimitiveInstanceType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32050:1: ( rule__PrimitiveInstanceType__Group__2__Impl )
+            // InternalFormalML.g:32051:2: rule__PrimitiveInstanceType__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group__2"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group__2__Impl"
+    // InternalFormalML.g:32057:1: rule__PrimitiveInstanceType__Group__2__Impl : ( ( rule__PrimitiveInstanceType__Group_2__0 )? ) ;
+    public final void rule__PrimitiveInstanceType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32061:1: ( ( ( rule__PrimitiveInstanceType__Group_2__0 )? ) )
+            // InternalFormalML.g:32062:1: ( ( rule__PrimitiveInstanceType__Group_2__0 )? )
+            {
+            // InternalFormalML.g:32062:1: ( ( rule__PrimitiveInstanceType__Group_2__0 )? )
+            // InternalFormalML.g:32063:2: ( rule__PrimitiveInstanceType__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:32064:2: ( rule__PrimitiveInstanceType__Group_2__0 )?
+            int alt477=2;
+            int LA477_0 = input.LA(1);
+
+            if ( (LA477_0==125) ) {
+                alt477=1;
+            }
+            switch (alt477) {
+                case 1 :
+                    // InternalFormalML.g:32064:3: rule__PrimitiveInstanceType__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimitiveInstanceType__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group_2__0"
+    // InternalFormalML.g:32073:1: rule__PrimitiveInstanceType__Group_2__0 : rule__PrimitiveInstanceType__Group_2__0__Impl rule__PrimitiveInstanceType__Group_2__1 ;
+    public final void rule__PrimitiveInstanceType__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32077:1: ( rule__PrimitiveInstanceType__Group_2__0__Impl rule__PrimitiveInstanceType__Group_2__1 )
+            // InternalFormalML.g:32078:2: rule__PrimitiveInstanceType__Group_2__0__Impl rule__PrimitiveInstanceType__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__PrimitiveInstanceType__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceType__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group_2__0"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group_2__0__Impl"
+    // InternalFormalML.g:32085:1: rule__PrimitiveInstanceType__Group_2__0__Impl : ( '<' ) ;
+    public final void rule__PrimitiveInstanceType__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32089:1: ( ( '<' ) )
+            // InternalFormalML.g:32090:1: ( '<' )
+            {
+            // InternalFormalML.g:32090:1: ( '<' )
+            // InternalFormalML.g:32091:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getLessThanSignKeyword_2_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getLessThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group_2__1"
+    // InternalFormalML.g:32100:1: rule__PrimitiveInstanceType__Group_2__1 : rule__PrimitiveInstanceType__Group_2__1__Impl rule__PrimitiveInstanceType__Group_2__2 ;
+    public final void rule__PrimitiveInstanceType__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32104:1: ( rule__PrimitiveInstanceType__Group_2__1__Impl rule__PrimitiveInstanceType__Group_2__2 )
+            // InternalFormalML.g:32105:2: rule__PrimitiveInstanceType__Group_2__1__Impl rule__PrimitiveInstanceType__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__PrimitiveInstanceType__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceType__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group_2__1"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group_2__1__Impl"
+    // InternalFormalML.g:32112:1: rule__PrimitiveInstanceType__Group_2__1__Impl : ( ( rule__PrimitiveInstanceType__ModelAssignment_2_1 ) ) ;
+    public final void rule__PrimitiveInstanceType__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32116:1: ( ( ( rule__PrimitiveInstanceType__ModelAssignment_2_1 ) ) )
+            // InternalFormalML.g:32117:1: ( ( rule__PrimitiveInstanceType__ModelAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:32117:1: ( ( rule__PrimitiveInstanceType__ModelAssignment_2_1 ) )
+            // InternalFormalML.g:32118:2: ( rule__PrimitiveInstanceType__ModelAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getModelAssignment_2_1()); 
+            }
+            // InternalFormalML.g:32119:2: ( rule__PrimitiveInstanceType__ModelAssignment_2_1 )
+            // InternalFormalML.g:32119:3: rule__PrimitiveInstanceType__ModelAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceType__ModelAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getModelAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group_2__2"
+    // InternalFormalML.g:32127:1: rule__PrimitiveInstanceType__Group_2__2 : rule__PrimitiveInstanceType__Group_2__2__Impl ;
+    public final void rule__PrimitiveInstanceType__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32131:1: ( rule__PrimitiveInstanceType__Group_2__2__Impl )
+            // InternalFormalML.g:32132:2: rule__PrimitiveInstanceType__Group_2__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimitiveInstanceType__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group_2__2"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__Group_2__2__Impl"
+    // InternalFormalML.g:32138:1: rule__PrimitiveInstanceType__Group_2__2__Impl : ( '>' ) ;
+    public final void rule__PrimitiveInstanceType__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32142:1: ( ( '>' ) )
+            // InternalFormalML.g:32143:1: ( '>' )
+            {
+            // InternalFormalML.g:32143:1: ( '>' )
+            // InternalFormalML.g:32144:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getGreaterThanSignKeyword_2_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getGreaterThanSignKeyword_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__0"
+    // InternalFormalML.g:32154:1: rule__IntervalType__Group__0 : rule__IntervalType__Group__0__Impl rule__IntervalType__Group__1 ;
+    public final void rule__IntervalType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32158:1: ( rule__IntervalType__Group__0__Impl rule__IntervalType__Group__1 )
+            // InternalFormalML.g:32159:2: rule__IntervalType__Group__0__Impl rule__IntervalType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_150);
+            rule__IntervalType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__0"
+
+
+    // $ANTLR start "rule__IntervalType__Group__0__Impl"
+    // InternalFormalML.g:32166:1: rule__IntervalType__Group__0__Impl : ( () ) ;
+    public final void rule__IntervalType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32170:1: ( ( () ) )
+            // InternalFormalML.g:32171:1: ( () )
+            {
+            // InternalFormalML.g:32171:1: ( () )
+            // InternalFormalML.g:32172:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getIntervalTypeAction_0()); 
+            }
+            // InternalFormalML.g:32173:2: ()
+            // InternalFormalML.g:32173:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getIntervalTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__1"
+    // InternalFormalML.g:32181:1: rule__IntervalType__Group__1 : rule__IntervalType__Group__1__Impl rule__IntervalType__Group__2 ;
+    public final void rule__IntervalType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32185:1: ( rule__IntervalType__Group__1__Impl rule__IntervalType__Group__2 )
+            // InternalFormalML.g:32186:2: rule__IntervalType__Group__1__Impl rule__IntervalType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__IntervalType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__1"
+
+
+    // $ANTLR start "rule__IntervalType__Group__1__Impl"
+    // InternalFormalML.g:32193:1: rule__IntervalType__Group__1__Impl : ( 'interval' ) ;
+    public final void rule__IntervalType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32197:1: ( ( 'interval' ) )
+            // InternalFormalML.g:32198:1: ( 'interval' )
+            {
+            // InternalFormalML.g:32198:1: ( 'interval' )
+            // InternalFormalML.g:32199:2: 'interval'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getIntervalKeyword_1()); 
+            }
+            match(input,234,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getIntervalKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__2"
+    // InternalFormalML.g:32208:1: rule__IntervalType__Group__2 : rule__IntervalType__Group__2__Impl rule__IntervalType__Group__3 ;
+    public final void rule__IntervalType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32212:1: ( rule__IntervalType__Group__2__Impl rule__IntervalType__Group__3 )
+            // InternalFormalML.g:32213:2: rule__IntervalType__Group__2__Impl rule__IntervalType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_145);
+            rule__IntervalType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__2"
+
+
+    // $ANTLR start "rule__IntervalType__Group__2__Impl"
+    // InternalFormalML.g:32220:1: rule__IntervalType__Group__2__Impl : ( '<' ) ;
+    public final void rule__IntervalType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32224:1: ( ( '<' ) )
+            // InternalFormalML.g:32225:1: ( '<' )
+            {
+            // InternalFormalML.g:32225:1: ( '<' )
+            // InternalFormalML.g:32226:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getLessThanSignKeyword_2()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getLessThanSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__3"
+    // InternalFormalML.g:32235:1: rule__IntervalType__Group__3 : rule__IntervalType__Group__3__Impl rule__IntervalType__Group__4 ;
+    public final void rule__IntervalType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32239:1: ( rule__IntervalType__Group__3__Impl rule__IntervalType__Group__4 )
+            // InternalFormalML.g:32240:2: rule__IntervalType__Group__3__Impl rule__IntervalType__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_151);
+            rule__IntervalType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__3"
+
+
+    // $ANTLR start "rule__IntervalType__Group__3__Impl"
+    // InternalFormalML.g:32247:1: rule__IntervalType__Group__3__Impl : ( ( rule__IntervalType__SupportAssignment_3 ) ) ;
+    public final void rule__IntervalType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32251:1: ( ( ( rule__IntervalType__SupportAssignment_3 ) ) )
+            // InternalFormalML.g:32252:1: ( ( rule__IntervalType__SupportAssignment_3 ) )
+            {
+            // InternalFormalML.g:32252:1: ( ( rule__IntervalType__SupportAssignment_3 ) )
+            // InternalFormalML.g:32253:2: ( rule__IntervalType__SupportAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getSupportAssignment_3()); 
+            }
+            // InternalFormalML.g:32254:2: ( rule__IntervalType__SupportAssignment_3 )
+            // InternalFormalML.g:32254:3: rule__IntervalType__SupportAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__SupportAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getSupportAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__4"
+    // InternalFormalML.g:32262:1: rule__IntervalType__Group__4 : rule__IntervalType__Group__4__Impl rule__IntervalType__Group__5 ;
+    public final void rule__IntervalType__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32266:1: ( rule__IntervalType__Group__4__Impl rule__IntervalType__Group__5 )
+            // InternalFormalML.g:32267:2: rule__IntervalType__Group__4__Impl rule__IntervalType__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__IntervalType__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__4"
+
+
+    // $ANTLR start "rule__IntervalType__Group__4__Impl"
+    // InternalFormalML.g:32274:1: rule__IntervalType__Group__4__Impl : ( ( rule__IntervalType__Alternatives_4 ) ) ;
+    public final void rule__IntervalType__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32278:1: ( ( ( rule__IntervalType__Alternatives_4 ) ) )
+            // InternalFormalML.g:32279:1: ( ( rule__IntervalType__Alternatives_4 ) )
+            {
+            // InternalFormalML.g:32279:1: ( ( rule__IntervalType__Alternatives_4 ) )
+            // InternalFormalML.g:32280:2: ( rule__IntervalType__Alternatives_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getAlternatives_4()); 
+            }
+            // InternalFormalML.g:32281:2: ( rule__IntervalType__Alternatives_4 )
+            // InternalFormalML.g:32281:3: rule__IntervalType__Alternatives_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Alternatives_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getAlternatives_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__4__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__5"
+    // InternalFormalML.g:32289:1: rule__IntervalType__Group__5 : rule__IntervalType__Group__5__Impl rule__IntervalType__Group__6 ;
+    public final void rule__IntervalType__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32293:1: ( rule__IntervalType__Group__5__Impl rule__IntervalType__Group__6 )
+            // InternalFormalML.g:32294:2: rule__IntervalType__Group__5__Impl rule__IntervalType__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__IntervalType__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__5"
+
+
+    // $ANTLR start "rule__IntervalType__Group__5__Impl"
+    // InternalFormalML.g:32301:1: rule__IntervalType__Group__5__Impl : ( ( rule__IntervalType__InfimumAssignment_5 ) ) ;
+    public final void rule__IntervalType__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32305:1: ( ( ( rule__IntervalType__InfimumAssignment_5 ) ) )
+            // InternalFormalML.g:32306:1: ( ( rule__IntervalType__InfimumAssignment_5 ) )
+            {
+            // InternalFormalML.g:32306:1: ( ( rule__IntervalType__InfimumAssignment_5 ) )
+            // InternalFormalML.g:32307:2: ( rule__IntervalType__InfimumAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getInfimumAssignment_5()); 
+            }
+            // InternalFormalML.g:32308:2: ( rule__IntervalType__InfimumAssignment_5 )
+            // InternalFormalML.g:32308:3: rule__IntervalType__InfimumAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__InfimumAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getInfimumAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__5__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__6"
+    // InternalFormalML.g:32316:1: rule__IntervalType__Group__6 : rule__IntervalType__Group__6__Impl rule__IntervalType__Group__7 ;
+    public final void rule__IntervalType__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32320:1: ( rule__IntervalType__Group__6__Impl rule__IntervalType__Group__7 )
+            // InternalFormalML.g:32321:2: rule__IntervalType__Group__6__Impl rule__IntervalType__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__IntervalType__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__6"
+
+
+    // $ANTLR start "rule__IntervalType__Group__6__Impl"
+    // InternalFormalML.g:32328:1: rule__IntervalType__Group__6__Impl : ( ',' ) ;
+    public final void rule__IntervalType__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32332:1: ( ( ',' ) )
+            // InternalFormalML.g:32333:1: ( ',' )
+            {
+            // InternalFormalML.g:32333:1: ( ',' )
+            // InternalFormalML.g:32334:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getCommaKeyword_6()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getCommaKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__6__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__7"
+    // InternalFormalML.g:32343:1: rule__IntervalType__Group__7 : rule__IntervalType__Group__7__Impl rule__IntervalType__Group__8 ;
+    public final void rule__IntervalType__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32347:1: ( rule__IntervalType__Group__7__Impl rule__IntervalType__Group__8 )
+            // InternalFormalML.g:32348:2: rule__IntervalType__Group__7__Impl rule__IntervalType__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_151);
+            rule__IntervalType__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__7"
+
+
+    // $ANTLR start "rule__IntervalType__Group__7__Impl"
+    // InternalFormalML.g:32355:1: rule__IntervalType__Group__7__Impl : ( ( rule__IntervalType__SupremumAssignment_7 ) ) ;
+    public final void rule__IntervalType__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32359:1: ( ( ( rule__IntervalType__SupremumAssignment_7 ) ) )
+            // InternalFormalML.g:32360:1: ( ( rule__IntervalType__SupremumAssignment_7 ) )
+            {
+            // InternalFormalML.g:32360:1: ( ( rule__IntervalType__SupremumAssignment_7 ) )
+            // InternalFormalML.g:32361:2: ( rule__IntervalType__SupremumAssignment_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getSupremumAssignment_7()); 
+            }
+            // InternalFormalML.g:32362:2: ( rule__IntervalType__SupremumAssignment_7 )
+            // InternalFormalML.g:32362:3: rule__IntervalType__SupremumAssignment_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__SupremumAssignment_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getSupremumAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__7__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__8"
+    // InternalFormalML.g:32370:1: rule__IntervalType__Group__8 : rule__IntervalType__Group__8__Impl rule__IntervalType__Group__9 ;
+    public final void rule__IntervalType__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32374:1: ( rule__IntervalType__Group__8__Impl rule__IntervalType__Group__9 )
+            // InternalFormalML.g:32375:2: rule__IntervalType__Group__8__Impl rule__IntervalType__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__IntervalType__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__8"
+
+
+    // $ANTLR start "rule__IntervalType__Group__8__Impl"
+    // InternalFormalML.g:32382:1: rule__IntervalType__Group__8__Impl : ( ( rule__IntervalType__Alternatives_8 ) ) ;
+    public final void rule__IntervalType__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32386:1: ( ( ( rule__IntervalType__Alternatives_8 ) ) )
+            // InternalFormalML.g:32387:1: ( ( rule__IntervalType__Alternatives_8 ) )
+            {
+            // InternalFormalML.g:32387:1: ( ( rule__IntervalType__Alternatives_8 ) )
+            // InternalFormalML.g:32388:2: ( rule__IntervalType__Alternatives_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:32389:2: ( rule__IntervalType__Alternatives_8 )
+            // InternalFormalML.g:32389:3: rule__IntervalType__Alternatives_8
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Alternatives_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__8__Impl"
+
+
+    // $ANTLR start "rule__IntervalType__Group__9"
+    // InternalFormalML.g:32397:1: rule__IntervalType__Group__9 : rule__IntervalType__Group__9__Impl ;
+    public final void rule__IntervalType__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32401:1: ( rule__IntervalType__Group__9__Impl )
+            // InternalFormalML.g:32402:2: rule__IntervalType__Group__9__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalType__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__9"
+
+
+    // $ANTLR start "rule__IntervalType__Group__9__Impl"
+    // InternalFormalML.g:32408:1: rule__IntervalType__Group__9__Impl : ( '>' ) ;
+    public final void rule__IntervalType__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32412:1: ( ( '>' ) )
+            // InternalFormalML.g:32413:1: ( '>' )
+            {
+            // InternalFormalML.g:32413:1: ( '>' )
+            // InternalFormalML.g:32414:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getGreaterThanSignKeyword_9()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getGreaterThanSignKeyword_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__Group__9__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__0"
+    // InternalFormalML.g:32424:1: rule__IntervalTypeDefinition__Group__0 : rule__IntervalTypeDefinition__Group__0__Impl rule__IntervalTypeDefinition__Group__1 ;
+    public final void rule__IntervalTypeDefinition__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32428:1: ( rule__IntervalTypeDefinition__Group__0__Impl rule__IntervalTypeDefinition__Group__1 )
+            // InternalFormalML.g:32429:2: rule__IntervalTypeDefinition__Group__0__Impl rule__IntervalTypeDefinition__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__IntervalTypeDefinition__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__0"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__0__Impl"
+    // InternalFormalML.g:32436:1: rule__IntervalTypeDefinition__Group__0__Impl : ( () ) ;
+    public final void rule__IntervalTypeDefinition__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32440:1: ( ( () ) )
+            // InternalFormalML.g:32441:1: ( () )
+            {
+            // InternalFormalML.g:32441:1: ( () )
+            // InternalFormalML.g:32442:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getIntervalTypeAction_0()); 
+            }
+            // InternalFormalML.g:32443:2: ()
+            // InternalFormalML.g:32443:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getIntervalTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__0__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__1"
+    // InternalFormalML.g:32451:1: rule__IntervalTypeDefinition__Group__1 : rule__IntervalTypeDefinition__Group__1__Impl rule__IntervalTypeDefinition__Group__2 ;
+    public final void rule__IntervalTypeDefinition__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32455:1: ( rule__IntervalTypeDefinition__Group__1__Impl rule__IntervalTypeDefinition__Group__2 )
+            // InternalFormalML.g:32456:2: rule__IntervalTypeDefinition__Group__1__Impl rule__IntervalTypeDefinition__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__IntervalTypeDefinition__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__1"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__1__Impl"
+    // InternalFormalML.g:32463:1: rule__IntervalTypeDefinition__Group__1__Impl : ( ( rule__IntervalTypeDefinition__VisibilityAssignment_1 )? ) ;
+    public final void rule__IntervalTypeDefinition__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32467:1: ( ( ( rule__IntervalTypeDefinition__VisibilityAssignment_1 )? ) )
+            // InternalFormalML.g:32468:1: ( ( rule__IntervalTypeDefinition__VisibilityAssignment_1 )? )
+            {
+            // InternalFormalML.g:32468:1: ( ( rule__IntervalTypeDefinition__VisibilityAssignment_1 )? )
+            // InternalFormalML.g:32469:2: ( rule__IntervalTypeDefinition__VisibilityAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:32470:2: ( rule__IntervalTypeDefinition__VisibilityAssignment_1 )?
+            int alt478=2;
+            int LA478_0 = input.LA(1);
+
+            if ( (LA478_0==28||(LA478_0>=143 && LA478_0<=145)) ) {
+                alt478=1;
+            }
+            switch (alt478) {
+                case 1 :
+                    // InternalFormalML.g:32470:3: rule__IntervalTypeDefinition__VisibilityAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IntervalTypeDefinition__VisibilityAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__1__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__2"
+    // InternalFormalML.g:32478:1: rule__IntervalTypeDefinition__Group__2 : rule__IntervalTypeDefinition__Group__2__Impl rule__IntervalTypeDefinition__Group__3 ;
+    public final void rule__IntervalTypeDefinition__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32482:1: ( rule__IntervalTypeDefinition__Group__2__Impl rule__IntervalTypeDefinition__Group__3 )
+            // InternalFormalML.g:32483:2: rule__IntervalTypeDefinition__Group__2__Impl rule__IntervalTypeDefinition__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__IntervalTypeDefinition__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__2"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__2__Impl"
+    // InternalFormalML.g:32490:1: rule__IntervalTypeDefinition__Group__2__Impl : ( 'type' ) ;
+    public final void rule__IntervalTypeDefinition__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32494:1: ( ( 'type' ) )
+            // InternalFormalML.g:32495:1: ( 'type' )
+            {
+            // InternalFormalML.g:32495:1: ( 'type' )
+            // InternalFormalML.g:32496:2: 'type'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+            match(input,229,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__2__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__3"
+    // InternalFormalML.g:32505:1: rule__IntervalTypeDefinition__Group__3 : rule__IntervalTypeDefinition__Group__3__Impl rule__IntervalTypeDefinition__Group__4 ;
+    public final void rule__IntervalTypeDefinition__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32509:1: ( rule__IntervalTypeDefinition__Group__3__Impl rule__IntervalTypeDefinition__Group__4 )
+            // InternalFormalML.g:32510:2: rule__IntervalTypeDefinition__Group__3__Impl rule__IntervalTypeDefinition__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_152);
+            rule__IntervalTypeDefinition__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__3"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__3__Impl"
+    // InternalFormalML.g:32517:1: rule__IntervalTypeDefinition__Group__3__Impl : ( ( rule__IntervalTypeDefinition__NameAssignment_3 ) ) ;
+    public final void rule__IntervalTypeDefinition__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32521:1: ( ( ( rule__IntervalTypeDefinition__NameAssignment_3 ) ) )
+            // InternalFormalML.g:32522:1: ( ( rule__IntervalTypeDefinition__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:32522:1: ( ( rule__IntervalTypeDefinition__NameAssignment_3 ) )
+            // InternalFormalML.g:32523:2: ( rule__IntervalTypeDefinition__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:32524:2: ( rule__IntervalTypeDefinition__NameAssignment_3 )
+            // InternalFormalML.g:32524:3: rule__IntervalTypeDefinition__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__3__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__4"
+    // InternalFormalML.g:32532:1: rule__IntervalTypeDefinition__Group__4 : rule__IntervalTypeDefinition__Group__4__Impl rule__IntervalTypeDefinition__Group__5 ;
+    public final void rule__IntervalTypeDefinition__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32536:1: ( rule__IntervalTypeDefinition__Group__4__Impl rule__IntervalTypeDefinition__Group__5 )
+            // InternalFormalML.g:32537:2: rule__IntervalTypeDefinition__Group__4__Impl rule__IntervalTypeDefinition__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_152);
+            rule__IntervalTypeDefinition__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__4"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__4__Impl"
+    // InternalFormalML.g:32544:1: rule__IntervalTypeDefinition__Group__4__Impl : ( ( rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__IntervalTypeDefinition__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32548:1: ( ( ( rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:32549:1: ( ( rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:32549:1: ( ( rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:32550:2: ( rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:32551:2: ( rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4 )?
+            int alt479=2;
+            int LA479_0 = input.LA(1);
+
+            if ( (LA479_0==RULE_STRING) ) {
+                alt479=1;
+            }
+            switch (alt479) {
+                case 1 :
+                    // InternalFormalML.g:32551:3: rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__4__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__5"
+    // InternalFormalML.g:32559:1: rule__IntervalTypeDefinition__Group__5 : rule__IntervalTypeDefinition__Group__5__Impl rule__IntervalTypeDefinition__Group__6 ;
+    public final void rule__IntervalTypeDefinition__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32563:1: ( rule__IntervalTypeDefinition__Group__5__Impl rule__IntervalTypeDefinition__Group__6 )
+            // InternalFormalML.g:32564:2: rule__IntervalTypeDefinition__Group__5__Impl rule__IntervalTypeDefinition__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__IntervalTypeDefinition__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__5"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__5__Impl"
+    // InternalFormalML.g:32571:1: rule__IntervalTypeDefinition__Group__5__Impl : ( 'interval' ) ;
+    public final void rule__IntervalTypeDefinition__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32575:1: ( ( 'interval' ) )
+            // InternalFormalML.g:32576:1: ( 'interval' )
+            {
+            // InternalFormalML.g:32576:1: ( 'interval' )
+            // InternalFormalML.g:32577:2: 'interval'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getIntervalKeyword_5()); 
+            }
+            match(input,234,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getIntervalKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__5__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__6"
+    // InternalFormalML.g:32586:1: rule__IntervalTypeDefinition__Group__6 : rule__IntervalTypeDefinition__Group__6__Impl rule__IntervalTypeDefinition__Group__7 ;
+    public final void rule__IntervalTypeDefinition__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32590:1: ( rule__IntervalTypeDefinition__Group__6__Impl rule__IntervalTypeDefinition__Group__7 )
+            // InternalFormalML.g:32591:2: rule__IntervalTypeDefinition__Group__6__Impl rule__IntervalTypeDefinition__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_145);
+            rule__IntervalTypeDefinition__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__6"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__6__Impl"
+    // InternalFormalML.g:32598:1: rule__IntervalTypeDefinition__Group__6__Impl : ( '<' ) ;
+    public final void rule__IntervalTypeDefinition__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32602:1: ( ( '<' ) )
+            // InternalFormalML.g:32603:1: ( '<' )
+            {
+            // InternalFormalML.g:32603:1: ( '<' )
+            // InternalFormalML.g:32604:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getLessThanSignKeyword_6()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getLessThanSignKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__6__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__7"
+    // InternalFormalML.g:32613:1: rule__IntervalTypeDefinition__Group__7 : rule__IntervalTypeDefinition__Group__7__Impl rule__IntervalTypeDefinition__Group__8 ;
+    public final void rule__IntervalTypeDefinition__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32617:1: ( rule__IntervalTypeDefinition__Group__7__Impl rule__IntervalTypeDefinition__Group__8 )
+            // InternalFormalML.g:32618:2: rule__IntervalTypeDefinition__Group__7__Impl rule__IntervalTypeDefinition__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_151);
+            rule__IntervalTypeDefinition__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__7"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__7__Impl"
+    // InternalFormalML.g:32625:1: rule__IntervalTypeDefinition__Group__7__Impl : ( ( rule__IntervalTypeDefinition__SupportAssignment_7 ) ) ;
+    public final void rule__IntervalTypeDefinition__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32629:1: ( ( ( rule__IntervalTypeDefinition__SupportAssignment_7 ) ) )
+            // InternalFormalML.g:32630:1: ( ( rule__IntervalTypeDefinition__SupportAssignment_7 ) )
+            {
+            // InternalFormalML.g:32630:1: ( ( rule__IntervalTypeDefinition__SupportAssignment_7 ) )
+            // InternalFormalML.g:32631:2: ( rule__IntervalTypeDefinition__SupportAssignment_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getSupportAssignment_7()); 
+            }
+            // InternalFormalML.g:32632:2: ( rule__IntervalTypeDefinition__SupportAssignment_7 )
+            // InternalFormalML.g:32632:3: rule__IntervalTypeDefinition__SupportAssignment_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__SupportAssignment_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getSupportAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__7__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__8"
+    // InternalFormalML.g:32640:1: rule__IntervalTypeDefinition__Group__8 : rule__IntervalTypeDefinition__Group__8__Impl rule__IntervalTypeDefinition__Group__9 ;
+    public final void rule__IntervalTypeDefinition__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32644:1: ( rule__IntervalTypeDefinition__Group__8__Impl rule__IntervalTypeDefinition__Group__9 )
+            // InternalFormalML.g:32645:2: rule__IntervalTypeDefinition__Group__8__Impl rule__IntervalTypeDefinition__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__IntervalTypeDefinition__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__8"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__8__Impl"
+    // InternalFormalML.g:32652:1: rule__IntervalTypeDefinition__Group__8__Impl : ( ( rule__IntervalTypeDefinition__Alternatives_8 ) ) ;
+    public final void rule__IntervalTypeDefinition__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32656:1: ( ( ( rule__IntervalTypeDefinition__Alternatives_8 ) ) )
+            // InternalFormalML.g:32657:1: ( ( rule__IntervalTypeDefinition__Alternatives_8 ) )
+            {
+            // InternalFormalML.g:32657:1: ( ( rule__IntervalTypeDefinition__Alternatives_8 ) )
+            // InternalFormalML.g:32658:2: ( rule__IntervalTypeDefinition__Alternatives_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_8()); 
+            }
+            // InternalFormalML.g:32659:2: ( rule__IntervalTypeDefinition__Alternatives_8 )
+            // InternalFormalML.g:32659:3: rule__IntervalTypeDefinition__Alternatives_8
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Alternatives_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__8__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__9"
+    // InternalFormalML.g:32667:1: rule__IntervalTypeDefinition__Group__9 : rule__IntervalTypeDefinition__Group__9__Impl rule__IntervalTypeDefinition__Group__10 ;
+    public final void rule__IntervalTypeDefinition__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32671:1: ( rule__IntervalTypeDefinition__Group__9__Impl rule__IntervalTypeDefinition__Group__10 )
+            // InternalFormalML.g:32672:2: rule__IntervalTypeDefinition__Group__9__Impl rule__IntervalTypeDefinition__Group__10
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__IntervalTypeDefinition__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__9"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__9__Impl"
+    // InternalFormalML.g:32679:1: rule__IntervalTypeDefinition__Group__9__Impl : ( ( rule__IntervalTypeDefinition__InfimumAssignment_9 ) ) ;
+    public final void rule__IntervalTypeDefinition__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32683:1: ( ( ( rule__IntervalTypeDefinition__InfimumAssignment_9 ) ) )
+            // InternalFormalML.g:32684:1: ( ( rule__IntervalTypeDefinition__InfimumAssignment_9 ) )
+            {
+            // InternalFormalML.g:32684:1: ( ( rule__IntervalTypeDefinition__InfimumAssignment_9 ) )
+            // InternalFormalML.g:32685:2: ( rule__IntervalTypeDefinition__InfimumAssignment_9 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumAssignment_9()); 
+            }
+            // InternalFormalML.g:32686:2: ( rule__IntervalTypeDefinition__InfimumAssignment_9 )
+            // InternalFormalML.g:32686:3: rule__IntervalTypeDefinition__InfimumAssignment_9
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__InfimumAssignment_9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumAssignment_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__9__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__10"
+    // InternalFormalML.g:32694:1: rule__IntervalTypeDefinition__Group__10 : rule__IntervalTypeDefinition__Group__10__Impl rule__IntervalTypeDefinition__Group__11 ;
+    public final void rule__IntervalTypeDefinition__Group__10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32698:1: ( rule__IntervalTypeDefinition__Group__10__Impl rule__IntervalTypeDefinition__Group__11 )
+            // InternalFormalML.g:32699:2: rule__IntervalTypeDefinition__Group__10__Impl rule__IntervalTypeDefinition__Group__11
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__IntervalTypeDefinition__Group__10__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__10"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__10__Impl"
+    // InternalFormalML.g:32706:1: rule__IntervalTypeDefinition__Group__10__Impl : ( ',' ) ;
+    public final void rule__IntervalTypeDefinition__Group__10__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32710:1: ( ( ',' ) )
+            // InternalFormalML.g:32711:1: ( ',' )
+            {
+            // InternalFormalML.g:32711:1: ( ',' )
+            // InternalFormalML.g:32712:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getCommaKeyword_10()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getCommaKeyword_10()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__10__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__11"
+    // InternalFormalML.g:32721:1: rule__IntervalTypeDefinition__Group__11 : rule__IntervalTypeDefinition__Group__11__Impl rule__IntervalTypeDefinition__Group__12 ;
+    public final void rule__IntervalTypeDefinition__Group__11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32725:1: ( rule__IntervalTypeDefinition__Group__11__Impl rule__IntervalTypeDefinition__Group__12 )
+            // InternalFormalML.g:32726:2: rule__IntervalTypeDefinition__Group__11__Impl rule__IntervalTypeDefinition__Group__12
+            {
+            pushFollow(FollowSets000.FOLLOW_151);
+            rule__IntervalTypeDefinition__Group__11__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__12();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__11"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__11__Impl"
+    // InternalFormalML.g:32733:1: rule__IntervalTypeDefinition__Group__11__Impl : ( ( rule__IntervalTypeDefinition__SupremumAssignment_11 ) ) ;
+    public final void rule__IntervalTypeDefinition__Group__11__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32737:1: ( ( ( rule__IntervalTypeDefinition__SupremumAssignment_11 ) ) )
+            // InternalFormalML.g:32738:1: ( ( rule__IntervalTypeDefinition__SupremumAssignment_11 ) )
+            {
+            // InternalFormalML.g:32738:1: ( ( rule__IntervalTypeDefinition__SupremumAssignment_11 ) )
+            // InternalFormalML.g:32739:2: ( rule__IntervalTypeDefinition__SupremumAssignment_11 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumAssignment_11()); 
+            }
+            // InternalFormalML.g:32740:2: ( rule__IntervalTypeDefinition__SupremumAssignment_11 )
+            // InternalFormalML.g:32740:3: rule__IntervalTypeDefinition__SupremumAssignment_11
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__SupremumAssignment_11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumAssignment_11()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__11__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__12"
+    // InternalFormalML.g:32748:1: rule__IntervalTypeDefinition__Group__12 : rule__IntervalTypeDefinition__Group__12__Impl rule__IntervalTypeDefinition__Group__13 ;
+    public final void rule__IntervalTypeDefinition__Group__12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32752:1: ( rule__IntervalTypeDefinition__Group__12__Impl rule__IntervalTypeDefinition__Group__13 )
+            // InternalFormalML.g:32753:2: rule__IntervalTypeDefinition__Group__12__Impl rule__IntervalTypeDefinition__Group__13
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__IntervalTypeDefinition__Group__12__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__13();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__12"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__12__Impl"
+    // InternalFormalML.g:32760:1: rule__IntervalTypeDefinition__Group__12__Impl : ( ( rule__IntervalTypeDefinition__Alternatives_12 ) ) ;
+    public final void rule__IntervalTypeDefinition__Group__12__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32764:1: ( ( ( rule__IntervalTypeDefinition__Alternatives_12 ) ) )
+            // InternalFormalML.g:32765:1: ( ( rule__IntervalTypeDefinition__Alternatives_12 ) )
+            {
+            // InternalFormalML.g:32765:1: ( ( rule__IntervalTypeDefinition__Alternatives_12 ) )
+            // InternalFormalML.g:32766:2: ( rule__IntervalTypeDefinition__Alternatives_12 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_12()); 
+            }
+            // InternalFormalML.g:32767:2: ( rule__IntervalTypeDefinition__Alternatives_12 )
+            // InternalFormalML.g:32767:3: rule__IntervalTypeDefinition__Alternatives_12
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Alternatives_12();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getAlternatives_12()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__12__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__13"
+    // InternalFormalML.g:32775:1: rule__IntervalTypeDefinition__Group__13 : rule__IntervalTypeDefinition__Group__13__Impl rule__IntervalTypeDefinition__Group__14 ;
+    public final void rule__IntervalTypeDefinition__Group__13() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32779:1: ( rule__IntervalTypeDefinition__Group__13__Impl rule__IntervalTypeDefinition__Group__14 )
+            // InternalFormalML.g:32780:2: rule__IntervalTypeDefinition__Group__13__Impl rule__IntervalTypeDefinition__Group__14
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__IntervalTypeDefinition__Group__13__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__14();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__13"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__13__Impl"
+    // InternalFormalML.g:32787:1: rule__IntervalTypeDefinition__Group__13__Impl : ( '>' ) ;
+    public final void rule__IntervalTypeDefinition__Group__13__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32791:1: ( ( '>' ) )
+            // InternalFormalML.g:32792:1: ( '>' )
+            {
+            // InternalFormalML.g:32792:1: ( '>' )
+            // InternalFormalML.g:32793:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getGreaterThanSignKeyword_13()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getGreaterThanSignKeyword_13()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__13__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__14"
+    // InternalFormalML.g:32802:1: rule__IntervalTypeDefinition__Group__14 : rule__IntervalTypeDefinition__Group__14__Impl ;
+    public final void rule__IntervalTypeDefinition__Group__14() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32806:1: ( rule__IntervalTypeDefinition__Group__14__Impl )
+            // InternalFormalML.g:32807:2: rule__IntervalTypeDefinition__Group__14__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinition__Group__14__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__14"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__Group__14__Impl"
+    // InternalFormalML.g:32813:1: rule__IntervalTypeDefinition__Group__14__Impl : ( ';' ) ;
+    public final void rule__IntervalTypeDefinition__Group__14__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32817:1: ( ( ';' ) )
+            // InternalFormalML.g:32818:1: ( ';' )
+            {
+            // InternalFormalML.g:32818:1: ( ';' )
+            // InternalFormalML.g:32819:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getSemicolonKeyword_14()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getSemicolonKeyword_14()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__Group__14__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__0"
+    // InternalFormalML.g:32829:1: rule__IntervalTypeDefinitionImpl__Group__0 : rule__IntervalTypeDefinitionImpl__Group__0__Impl rule__IntervalTypeDefinitionImpl__Group__1 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32833:1: ( rule__IntervalTypeDefinitionImpl__Group__0__Impl rule__IntervalTypeDefinitionImpl__Group__1 )
+            // InternalFormalML.g:32834:2: rule__IntervalTypeDefinitionImpl__Group__0__Impl rule__IntervalTypeDefinitionImpl__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__IntervalTypeDefinitionImpl__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__0"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__0__Impl"
+    // InternalFormalML.g:32841:1: rule__IntervalTypeDefinitionImpl__Group__0__Impl : ( () ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32845:1: ( ( () ) )
+            // InternalFormalML.g:32846:1: ( () )
+            {
+            // InternalFormalML.g:32846:1: ( () )
+            // InternalFormalML.g:32847:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalTypeAction_0()); 
+            }
+            // InternalFormalML.g:32848:2: ()
+            // InternalFormalML.g:32848:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__0__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__1"
+    // InternalFormalML.g:32856:1: rule__IntervalTypeDefinitionImpl__Group__1 : rule__IntervalTypeDefinitionImpl__Group__1__Impl rule__IntervalTypeDefinitionImpl__Group__2 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32860:1: ( rule__IntervalTypeDefinitionImpl__Group__1__Impl rule__IntervalTypeDefinitionImpl__Group__2 )
+            // InternalFormalML.g:32861:2: rule__IntervalTypeDefinitionImpl__Group__1__Impl rule__IntervalTypeDefinitionImpl__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_152);
+            rule__IntervalTypeDefinitionImpl__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__1"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__1__Impl"
+    // InternalFormalML.g:32868:1: rule__IntervalTypeDefinitionImpl__Group__1__Impl : ( ( rule__IntervalTypeDefinitionImpl__NameAssignment_1 ) ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32872:1: ( ( ( rule__IntervalTypeDefinitionImpl__NameAssignment_1 ) ) )
+            // InternalFormalML.g:32873:1: ( ( rule__IntervalTypeDefinitionImpl__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:32873:1: ( ( rule__IntervalTypeDefinitionImpl__NameAssignment_1 ) )
+            // InternalFormalML.g:32874:2: ( rule__IntervalTypeDefinitionImpl__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:32875:2: ( rule__IntervalTypeDefinitionImpl__NameAssignment_1 )
+            // InternalFormalML.g:32875:3: rule__IntervalTypeDefinitionImpl__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__1__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__2"
+    // InternalFormalML.g:32883:1: rule__IntervalTypeDefinitionImpl__Group__2 : rule__IntervalTypeDefinitionImpl__Group__2__Impl rule__IntervalTypeDefinitionImpl__Group__3 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32887:1: ( rule__IntervalTypeDefinitionImpl__Group__2__Impl rule__IntervalTypeDefinitionImpl__Group__3 )
+            // InternalFormalML.g:32888:2: rule__IntervalTypeDefinitionImpl__Group__2__Impl rule__IntervalTypeDefinitionImpl__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_152);
+            rule__IntervalTypeDefinitionImpl__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__2"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__2__Impl"
+    // InternalFormalML.g:32895:1: rule__IntervalTypeDefinitionImpl__Group__2__Impl : ( ( rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32899:1: ( ( ( rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:32900:1: ( ( rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:32900:1: ( ( rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:32901:2: ( rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:32902:2: ( rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            int alt480=2;
+            int LA480_0 = input.LA(1);
+
+            if ( (LA480_0==RULE_STRING) ) {
+                alt480=1;
+            }
+            switch (alt480) {
+                case 1 :
+                    // InternalFormalML.g:32902:3: rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__2__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__3"
+    // InternalFormalML.g:32910:1: rule__IntervalTypeDefinitionImpl__Group__3 : rule__IntervalTypeDefinitionImpl__Group__3__Impl rule__IntervalTypeDefinitionImpl__Group__4 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32914:1: ( rule__IntervalTypeDefinitionImpl__Group__3__Impl rule__IntervalTypeDefinitionImpl__Group__4 )
+            // InternalFormalML.g:32915:2: rule__IntervalTypeDefinitionImpl__Group__3__Impl rule__IntervalTypeDefinitionImpl__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__IntervalTypeDefinitionImpl__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__3"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__3__Impl"
+    // InternalFormalML.g:32922:1: rule__IntervalTypeDefinitionImpl__Group__3__Impl : ( 'interval' ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32926:1: ( ( 'interval' ) )
+            // InternalFormalML.g:32927:1: ( 'interval' )
+            {
+            // InternalFormalML.g:32927:1: ( 'interval' )
+            // InternalFormalML.g:32928:2: 'interval'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalKeyword_3()); 
+            }
+            match(input,234,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__3__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__4"
+    // InternalFormalML.g:32937:1: rule__IntervalTypeDefinitionImpl__Group__4 : rule__IntervalTypeDefinitionImpl__Group__4__Impl rule__IntervalTypeDefinitionImpl__Group__5 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32941:1: ( rule__IntervalTypeDefinitionImpl__Group__4__Impl rule__IntervalTypeDefinitionImpl__Group__5 )
+            // InternalFormalML.g:32942:2: rule__IntervalTypeDefinitionImpl__Group__4__Impl rule__IntervalTypeDefinitionImpl__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_145);
+            rule__IntervalTypeDefinitionImpl__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__4"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__4__Impl"
+    // InternalFormalML.g:32949:1: rule__IntervalTypeDefinitionImpl__Group__4__Impl : ( '<' ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32953:1: ( ( '<' ) )
+            // InternalFormalML.g:32954:1: ( '<' )
+            {
+            // InternalFormalML.g:32954:1: ( '<' )
+            // InternalFormalML.g:32955:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLessThanSignKeyword_4()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLessThanSignKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__4__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__5"
+    // InternalFormalML.g:32964:1: rule__IntervalTypeDefinitionImpl__Group__5 : rule__IntervalTypeDefinitionImpl__Group__5__Impl rule__IntervalTypeDefinitionImpl__Group__6 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32968:1: ( rule__IntervalTypeDefinitionImpl__Group__5__Impl rule__IntervalTypeDefinitionImpl__Group__6 )
+            // InternalFormalML.g:32969:2: rule__IntervalTypeDefinitionImpl__Group__5__Impl rule__IntervalTypeDefinitionImpl__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_151);
+            rule__IntervalTypeDefinitionImpl__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__5"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__5__Impl"
+    // InternalFormalML.g:32976:1: rule__IntervalTypeDefinitionImpl__Group__5__Impl : ( ( rule__IntervalTypeDefinitionImpl__SupportAssignment_5 ) ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32980:1: ( ( ( rule__IntervalTypeDefinitionImpl__SupportAssignment_5 ) ) )
+            // InternalFormalML.g:32981:1: ( ( rule__IntervalTypeDefinitionImpl__SupportAssignment_5 ) )
+            {
+            // InternalFormalML.g:32981:1: ( ( rule__IntervalTypeDefinitionImpl__SupportAssignment_5 ) )
+            // InternalFormalML.g:32982:2: ( rule__IntervalTypeDefinitionImpl__SupportAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportAssignment_5()); 
+            }
+            // InternalFormalML.g:32983:2: ( rule__IntervalTypeDefinitionImpl__SupportAssignment_5 )
+            // InternalFormalML.g:32983:3: rule__IntervalTypeDefinitionImpl__SupportAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__SupportAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__5__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__6"
+    // InternalFormalML.g:32991:1: rule__IntervalTypeDefinitionImpl__Group__6 : rule__IntervalTypeDefinitionImpl__Group__6__Impl rule__IntervalTypeDefinitionImpl__Group__7 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:32995:1: ( rule__IntervalTypeDefinitionImpl__Group__6__Impl rule__IntervalTypeDefinitionImpl__Group__7 )
+            // InternalFormalML.g:32996:2: rule__IntervalTypeDefinitionImpl__Group__6__Impl rule__IntervalTypeDefinitionImpl__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__IntervalTypeDefinitionImpl__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__6"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__6__Impl"
+    // InternalFormalML.g:33003:1: rule__IntervalTypeDefinitionImpl__Group__6__Impl : ( ( rule__IntervalTypeDefinitionImpl__Alternatives_6 ) ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33007:1: ( ( ( rule__IntervalTypeDefinitionImpl__Alternatives_6 ) ) )
+            // InternalFormalML.g:33008:1: ( ( rule__IntervalTypeDefinitionImpl__Alternatives_6 ) )
+            {
+            // InternalFormalML.g:33008:1: ( ( rule__IntervalTypeDefinitionImpl__Alternatives_6 ) )
+            // InternalFormalML.g:33009:2: ( rule__IntervalTypeDefinitionImpl__Alternatives_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_6()); 
+            }
+            // InternalFormalML.g:33010:2: ( rule__IntervalTypeDefinitionImpl__Alternatives_6 )
+            // InternalFormalML.g:33010:3: rule__IntervalTypeDefinitionImpl__Alternatives_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Alternatives_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__6__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__7"
+    // InternalFormalML.g:33018:1: rule__IntervalTypeDefinitionImpl__Group__7 : rule__IntervalTypeDefinitionImpl__Group__7__Impl rule__IntervalTypeDefinitionImpl__Group__8 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33022:1: ( rule__IntervalTypeDefinitionImpl__Group__7__Impl rule__IntervalTypeDefinitionImpl__Group__8 )
+            // InternalFormalML.g:33023:2: rule__IntervalTypeDefinitionImpl__Group__7__Impl rule__IntervalTypeDefinitionImpl__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__IntervalTypeDefinitionImpl__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__7"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__7__Impl"
+    // InternalFormalML.g:33030:1: rule__IntervalTypeDefinitionImpl__Group__7__Impl : ( ( rule__IntervalTypeDefinitionImpl__InfimumAssignment_7 ) ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33034:1: ( ( ( rule__IntervalTypeDefinitionImpl__InfimumAssignment_7 ) ) )
+            // InternalFormalML.g:33035:1: ( ( rule__IntervalTypeDefinitionImpl__InfimumAssignment_7 ) )
+            {
+            // InternalFormalML.g:33035:1: ( ( rule__IntervalTypeDefinitionImpl__InfimumAssignment_7 ) )
+            // InternalFormalML.g:33036:2: ( rule__IntervalTypeDefinitionImpl__InfimumAssignment_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumAssignment_7()); 
+            }
+            // InternalFormalML.g:33037:2: ( rule__IntervalTypeDefinitionImpl__InfimumAssignment_7 )
+            // InternalFormalML.g:33037:3: rule__IntervalTypeDefinitionImpl__InfimumAssignment_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__InfimumAssignment_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__7__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__8"
+    // InternalFormalML.g:33045:1: rule__IntervalTypeDefinitionImpl__Group__8 : rule__IntervalTypeDefinitionImpl__Group__8__Impl rule__IntervalTypeDefinitionImpl__Group__9 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33049:1: ( rule__IntervalTypeDefinitionImpl__Group__8__Impl rule__IntervalTypeDefinitionImpl__Group__9 )
+            // InternalFormalML.g:33050:2: rule__IntervalTypeDefinitionImpl__Group__8__Impl rule__IntervalTypeDefinitionImpl__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__IntervalTypeDefinitionImpl__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__8"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__8__Impl"
+    // InternalFormalML.g:33057:1: rule__IntervalTypeDefinitionImpl__Group__8__Impl : ( ',' ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33061:1: ( ( ',' ) )
+            // InternalFormalML.g:33062:1: ( ',' )
+            {
+            // InternalFormalML.g:33062:1: ( ',' )
+            // InternalFormalML.g:33063:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getCommaKeyword_8()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getCommaKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__8__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__9"
+    // InternalFormalML.g:33072:1: rule__IntervalTypeDefinitionImpl__Group__9 : rule__IntervalTypeDefinitionImpl__Group__9__Impl rule__IntervalTypeDefinitionImpl__Group__10 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33076:1: ( rule__IntervalTypeDefinitionImpl__Group__9__Impl rule__IntervalTypeDefinitionImpl__Group__10 )
+            // InternalFormalML.g:33077:2: rule__IntervalTypeDefinitionImpl__Group__9__Impl rule__IntervalTypeDefinitionImpl__Group__10
+            {
+            pushFollow(FollowSets000.FOLLOW_151);
+            rule__IntervalTypeDefinitionImpl__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__9"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__9__Impl"
+    // InternalFormalML.g:33084:1: rule__IntervalTypeDefinitionImpl__Group__9__Impl : ( ( rule__IntervalTypeDefinitionImpl__SupremumAssignment_9 ) ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33088:1: ( ( ( rule__IntervalTypeDefinitionImpl__SupremumAssignment_9 ) ) )
+            // InternalFormalML.g:33089:1: ( ( rule__IntervalTypeDefinitionImpl__SupremumAssignment_9 ) )
+            {
+            // InternalFormalML.g:33089:1: ( ( rule__IntervalTypeDefinitionImpl__SupremumAssignment_9 ) )
+            // InternalFormalML.g:33090:2: ( rule__IntervalTypeDefinitionImpl__SupremumAssignment_9 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumAssignment_9()); 
+            }
+            // InternalFormalML.g:33091:2: ( rule__IntervalTypeDefinitionImpl__SupremumAssignment_9 )
+            // InternalFormalML.g:33091:3: rule__IntervalTypeDefinitionImpl__SupremumAssignment_9
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__SupremumAssignment_9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumAssignment_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__9__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__10"
+    // InternalFormalML.g:33099:1: rule__IntervalTypeDefinitionImpl__Group__10 : rule__IntervalTypeDefinitionImpl__Group__10__Impl rule__IntervalTypeDefinitionImpl__Group__11 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33103:1: ( rule__IntervalTypeDefinitionImpl__Group__10__Impl rule__IntervalTypeDefinitionImpl__Group__11 )
+            // InternalFormalML.g:33104:2: rule__IntervalTypeDefinitionImpl__Group__10__Impl rule__IntervalTypeDefinitionImpl__Group__11
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__IntervalTypeDefinitionImpl__Group__10__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__10"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__10__Impl"
+    // InternalFormalML.g:33111:1: rule__IntervalTypeDefinitionImpl__Group__10__Impl : ( ( rule__IntervalTypeDefinitionImpl__Alternatives_10 ) ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__10__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33115:1: ( ( ( rule__IntervalTypeDefinitionImpl__Alternatives_10 ) ) )
+            // InternalFormalML.g:33116:1: ( ( rule__IntervalTypeDefinitionImpl__Alternatives_10 ) )
+            {
+            // InternalFormalML.g:33116:1: ( ( rule__IntervalTypeDefinitionImpl__Alternatives_10 ) )
+            // InternalFormalML.g:33117:2: ( rule__IntervalTypeDefinitionImpl__Alternatives_10 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_10()); 
+            }
+            // InternalFormalML.g:33118:2: ( rule__IntervalTypeDefinitionImpl__Alternatives_10 )
+            // InternalFormalML.g:33118:3: rule__IntervalTypeDefinitionImpl__Alternatives_10
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Alternatives_10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getAlternatives_10()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__10__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__11"
+    // InternalFormalML.g:33126:1: rule__IntervalTypeDefinitionImpl__Group__11 : rule__IntervalTypeDefinitionImpl__Group__11__Impl rule__IntervalTypeDefinitionImpl__Group__12 ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33130:1: ( rule__IntervalTypeDefinitionImpl__Group__11__Impl rule__IntervalTypeDefinitionImpl__Group__12 )
+            // InternalFormalML.g:33131:2: rule__IntervalTypeDefinitionImpl__Group__11__Impl rule__IntervalTypeDefinitionImpl__Group__12
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__IntervalTypeDefinitionImpl__Group__11__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__12();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__11"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__11__Impl"
+    // InternalFormalML.g:33138:1: rule__IntervalTypeDefinitionImpl__Group__11__Impl : ( '>' ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__11__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33142:1: ( ( '>' ) )
+            // InternalFormalML.g:33143:1: ( '>' )
+            {
+            // InternalFormalML.g:33143:1: ( '>' )
+            // InternalFormalML.g:33144:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getGreaterThanSignKeyword_11()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getGreaterThanSignKeyword_11()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__11__Impl"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__12"
+    // InternalFormalML.g:33153:1: rule__IntervalTypeDefinitionImpl__Group__12 : rule__IntervalTypeDefinitionImpl__Group__12__Impl ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33157:1: ( rule__IntervalTypeDefinitionImpl__Group__12__Impl )
+            // InternalFormalML.g:33158:2: rule__IntervalTypeDefinitionImpl__Group__12__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IntervalTypeDefinitionImpl__Group__12__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__12"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__Group__12__Impl"
+    // InternalFormalML.g:33164:1: rule__IntervalTypeDefinitionImpl__Group__12__Impl : ( ';' ) ;
+    public final void rule__IntervalTypeDefinitionImpl__Group__12__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33168:1: ( ( ';' ) )
+            // InternalFormalML.g:33169:1: ( ';' )
+            {
+            // InternalFormalML.g:33169:1: ( ';' )
+            // InternalFormalML.g:33170:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSemicolonKeyword_12()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSemicolonKeyword_12()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__Group__12__Impl"
+
+
+    // $ANTLR start "rule__CollectionType__Group__0"
+    // InternalFormalML.g:33180:1: rule__CollectionType__Group__0 : rule__CollectionType__Group__0__Impl rule__CollectionType__Group__1 ;
+    public final void rule__CollectionType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33184:1: ( rule__CollectionType__Group__0__Impl rule__CollectionType__Group__1 )
+            // InternalFormalML.g:33185:2: rule__CollectionType__Group__0__Impl rule__CollectionType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_153);
+            rule__CollectionType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__0"
+
+
+    // $ANTLR start "rule__CollectionType__Group__0__Impl"
+    // InternalFormalML.g:33192:1: rule__CollectionType__Group__0__Impl : ( () ) ;
+    public final void rule__CollectionType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33196:1: ( ( () ) )
+            // InternalFormalML.g:33197:1: ( () )
+            {
+            // InternalFormalML.g:33197:1: ( () )
+            // InternalFormalML.g:33198:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getCollectionTypeAction_0()); 
+            }
+            // InternalFormalML.g:33199:2: ()
+            // InternalFormalML.g:33199:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getCollectionTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__CollectionType__Group__1"
+    // InternalFormalML.g:33207:1: rule__CollectionType__Group__1 : rule__CollectionType__Group__1__Impl rule__CollectionType__Group__2 ;
+    public final void rule__CollectionType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33211:1: ( rule__CollectionType__Group__1__Impl rule__CollectionType__Group__2 )
+            // InternalFormalML.g:33212:2: rule__CollectionType__Group__1__Impl rule__CollectionType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__CollectionType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__1"
+
+
+    // $ANTLR start "rule__CollectionType__Group__1__Impl"
+    // InternalFormalML.g:33219:1: rule__CollectionType__Group__1__Impl : ( ( rule__CollectionType__ContainerAssignment_1 ) ) ;
+    public final void rule__CollectionType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33223:1: ( ( ( rule__CollectionType__ContainerAssignment_1 ) ) )
+            // InternalFormalML.g:33224:1: ( ( rule__CollectionType__ContainerAssignment_1 ) )
+            {
+            // InternalFormalML.g:33224:1: ( ( rule__CollectionType__ContainerAssignment_1 ) )
+            // InternalFormalML.g:33225:2: ( rule__CollectionType__ContainerAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getContainerAssignment_1()); 
+            }
+            // InternalFormalML.g:33226:2: ( rule__CollectionType__ContainerAssignment_1 )
+            // InternalFormalML.g:33226:3: rule__CollectionType__ContainerAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__ContainerAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getContainerAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__CollectionType__Group__2"
+    // InternalFormalML.g:33234:1: rule__CollectionType__Group__2 : rule__CollectionType__Group__2__Impl rule__CollectionType__Group__3 ;
+    public final void rule__CollectionType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33238:1: ( rule__CollectionType__Group__2__Impl rule__CollectionType__Group__3 )
+            // InternalFormalML.g:33239:2: rule__CollectionType__Group__2__Impl rule__CollectionType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__CollectionType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__2"
+
+
+    // $ANTLR start "rule__CollectionType__Group__2__Impl"
+    // InternalFormalML.g:33246:1: rule__CollectionType__Group__2__Impl : ( '<' ) ;
+    public final void rule__CollectionType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33250:1: ( ( '<' ) )
+            // InternalFormalML.g:33251:1: ( '<' )
+            {
+            // InternalFormalML.g:33251:1: ( '<' )
+            // InternalFormalML.g:33252:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getLessThanSignKeyword_2()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getLessThanSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__CollectionType__Group__3"
+    // InternalFormalML.g:33261:1: rule__CollectionType__Group__3 : rule__CollectionType__Group__3__Impl rule__CollectionType__Group__4 ;
+    public final void rule__CollectionType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33265:1: ( rule__CollectionType__Group__3__Impl rule__CollectionType__Group__4 )
+            // InternalFormalML.g:33266:2: rule__CollectionType__Group__3__Impl rule__CollectionType__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_154);
+            rule__CollectionType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__3"
+
+
+    // $ANTLR start "rule__CollectionType__Group__3__Impl"
+    // InternalFormalML.g:33273:1: rule__CollectionType__Group__3__Impl : ( ( rule__CollectionType__SupportAssignment_3 ) ) ;
+    public final void rule__CollectionType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33277:1: ( ( ( rule__CollectionType__SupportAssignment_3 ) ) )
+            // InternalFormalML.g:33278:1: ( ( rule__CollectionType__SupportAssignment_3 ) )
+            {
+            // InternalFormalML.g:33278:1: ( ( rule__CollectionType__SupportAssignment_3 ) )
+            // InternalFormalML.g:33279:2: ( rule__CollectionType__SupportAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getSupportAssignment_3()); 
+            }
+            // InternalFormalML.g:33280:2: ( rule__CollectionType__SupportAssignment_3 )
+            // InternalFormalML.g:33280:3: rule__CollectionType__SupportAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__SupportAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getSupportAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__CollectionType__Group__4"
+    // InternalFormalML.g:33288:1: rule__CollectionType__Group__4 : rule__CollectionType__Group__4__Impl rule__CollectionType__Group__5 ;
+    public final void rule__CollectionType__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33292:1: ( rule__CollectionType__Group__4__Impl rule__CollectionType__Group__5 )
+            // InternalFormalML.g:33293:2: rule__CollectionType__Group__4__Impl rule__CollectionType__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_154);
+            rule__CollectionType__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__4"
+
+
+    // $ANTLR start "rule__CollectionType__Group__4__Impl"
+    // InternalFormalML.g:33300:1: rule__CollectionType__Group__4__Impl : ( ( rule__CollectionType__Group_4__0 )? ) ;
+    public final void rule__CollectionType__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33304:1: ( ( ( rule__CollectionType__Group_4__0 )? ) )
+            // InternalFormalML.g:33305:1: ( ( rule__CollectionType__Group_4__0 )? )
+            {
+            // InternalFormalML.g:33305:1: ( ( rule__CollectionType__Group_4__0 )? )
+            // InternalFormalML.g:33306:2: ( rule__CollectionType__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:33307:2: ( rule__CollectionType__Group_4__0 )?
+            int alt481=2;
+            int LA481_0 = input.LA(1);
+
+            if ( (LA481_0==198) ) {
+                alt481=1;
+            }
+            switch (alt481) {
+                case 1 :
+                    // InternalFormalML.g:33307:3: rule__CollectionType__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionType__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__4__Impl"
+
+
+    // $ANTLR start "rule__CollectionType__Group__5"
+    // InternalFormalML.g:33315:1: rule__CollectionType__Group__5 : rule__CollectionType__Group__5__Impl ;
+    public final void rule__CollectionType__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33319:1: ( rule__CollectionType__Group__5__Impl )
+            // InternalFormalML.g:33320:2: rule__CollectionType__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__5"
+
+
+    // $ANTLR start "rule__CollectionType__Group__5__Impl"
+    // InternalFormalML.g:33326:1: rule__CollectionType__Group__5__Impl : ( '>' ) ;
+    public final void rule__CollectionType__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33330:1: ( ( '>' ) )
+            // InternalFormalML.g:33331:1: ( '>' )
+            {
+            // InternalFormalML.g:33331:1: ( '>' )
+            // InternalFormalML.g:33332:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getGreaterThanSignKeyword_5()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getGreaterThanSignKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group__5__Impl"
+
+
+    // $ANTLR start "rule__CollectionType__Group_4__0"
+    // InternalFormalML.g:33342:1: rule__CollectionType__Group_4__0 : rule__CollectionType__Group_4__0__Impl rule__CollectionType__Group_4__1 ;
+    public final void rule__CollectionType__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33346:1: ( rule__CollectionType__Group_4__0__Impl rule__CollectionType__Group_4__1 )
+            // InternalFormalML.g:33347:2: rule__CollectionType__Group_4__0__Impl rule__CollectionType__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_155);
+            rule__CollectionType__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group_4__0"
+
+
+    // $ANTLR start "rule__CollectionType__Group_4__0__Impl"
+    // InternalFormalML.g:33354:1: rule__CollectionType__Group_4__0__Impl : ( ',' ) ;
+    public final void rule__CollectionType__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33358:1: ( ( ',' ) )
+            // InternalFormalML.g:33359:1: ( ',' )
+            {
+            // InternalFormalML.g:33359:1: ( ',' )
+            // InternalFormalML.g:33360:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getCommaKeyword_4_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getCommaKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__CollectionType__Group_4__1"
+    // InternalFormalML.g:33369:1: rule__CollectionType__Group_4__1 : rule__CollectionType__Group_4__1__Impl ;
+    public final void rule__CollectionType__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33373:1: ( rule__CollectionType__Group_4__1__Impl )
+            // InternalFormalML.g:33374:2: rule__CollectionType__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group_4__1"
+
+
+    // $ANTLR start "rule__CollectionType__Group_4__1__Impl"
+    // InternalFormalML.g:33380:1: rule__CollectionType__Group_4__1__Impl : ( ( rule__CollectionType__Alternatives_4_1 ) ) ;
+    public final void rule__CollectionType__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33384:1: ( ( ( rule__CollectionType__Alternatives_4_1 ) ) )
+            // InternalFormalML.g:33385:1: ( ( rule__CollectionType__Alternatives_4_1 ) )
+            {
+            // InternalFormalML.g:33385:1: ( ( rule__CollectionType__Alternatives_4_1 ) )
+            // InternalFormalML.g:33386:2: ( rule__CollectionType__Alternatives_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getAlternatives_4_1()); 
+            }
+            // InternalFormalML.g:33387:2: ( rule__CollectionType__Alternatives_4_1 )
+            // InternalFormalML.g:33387:3: rule__CollectionType__Alternatives_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionType__Alternatives_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getAlternatives_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__0"
+    // InternalFormalML.g:33396:1: rule__CollectionTypeDefinition__Group__0 : rule__CollectionTypeDefinition__Group__0__Impl rule__CollectionTypeDefinition__Group__1 ;
+    public final void rule__CollectionTypeDefinition__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33400:1: ( rule__CollectionTypeDefinition__Group__0__Impl rule__CollectionTypeDefinition__Group__1 )
+            // InternalFormalML.g:33401:2: rule__CollectionTypeDefinition__Group__0__Impl rule__CollectionTypeDefinition__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__CollectionTypeDefinition__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__0"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__0__Impl"
+    // InternalFormalML.g:33408:1: rule__CollectionTypeDefinition__Group__0__Impl : ( () ) ;
+    public final void rule__CollectionTypeDefinition__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33412:1: ( ( () ) )
+            // InternalFormalML.g:33413:1: ( () )
+            {
+            // InternalFormalML.g:33413:1: ( () )
+            // InternalFormalML.g:33414:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getCollectionTypeAction_0()); 
+            }
+            // InternalFormalML.g:33415:2: ()
+            // InternalFormalML.g:33415:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getCollectionTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__0__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__1"
+    // InternalFormalML.g:33423:1: rule__CollectionTypeDefinition__Group__1 : rule__CollectionTypeDefinition__Group__1__Impl rule__CollectionTypeDefinition__Group__2 ;
+    public final void rule__CollectionTypeDefinition__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33427:1: ( rule__CollectionTypeDefinition__Group__1__Impl rule__CollectionTypeDefinition__Group__2 )
+            // InternalFormalML.g:33428:2: rule__CollectionTypeDefinition__Group__1__Impl rule__CollectionTypeDefinition__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__CollectionTypeDefinition__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__1__Impl"
+    // InternalFormalML.g:33435:1: rule__CollectionTypeDefinition__Group__1__Impl : ( ( rule__CollectionTypeDefinition__VisibilityAssignment_1 )? ) ;
+    public final void rule__CollectionTypeDefinition__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33439:1: ( ( ( rule__CollectionTypeDefinition__VisibilityAssignment_1 )? ) )
+            // InternalFormalML.g:33440:1: ( ( rule__CollectionTypeDefinition__VisibilityAssignment_1 )? )
+            {
+            // InternalFormalML.g:33440:1: ( ( rule__CollectionTypeDefinition__VisibilityAssignment_1 )? )
+            // InternalFormalML.g:33441:2: ( rule__CollectionTypeDefinition__VisibilityAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:33442:2: ( rule__CollectionTypeDefinition__VisibilityAssignment_1 )?
+            int alt482=2;
+            int LA482_0 = input.LA(1);
+
+            if ( (LA482_0==28||(LA482_0>=143 && LA482_0<=145)) ) {
+                alt482=1;
+            }
+            switch (alt482) {
+                case 1 :
+                    // InternalFormalML.g:33442:3: rule__CollectionTypeDefinition__VisibilityAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionTypeDefinition__VisibilityAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__1__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__2"
+    // InternalFormalML.g:33450:1: rule__CollectionTypeDefinition__Group__2 : rule__CollectionTypeDefinition__Group__2__Impl rule__CollectionTypeDefinition__Group__3 ;
+    public final void rule__CollectionTypeDefinition__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33454:1: ( rule__CollectionTypeDefinition__Group__2__Impl rule__CollectionTypeDefinition__Group__3 )
+            // InternalFormalML.g:33455:2: rule__CollectionTypeDefinition__Group__2__Impl rule__CollectionTypeDefinition__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__CollectionTypeDefinition__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__2"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__2__Impl"
+    // InternalFormalML.g:33462:1: rule__CollectionTypeDefinition__Group__2__Impl : ( 'type' ) ;
+    public final void rule__CollectionTypeDefinition__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33466:1: ( ( 'type' ) )
+            // InternalFormalML.g:33467:1: ( 'type' )
+            {
+            // InternalFormalML.g:33467:1: ( 'type' )
+            // InternalFormalML.g:33468:2: 'type'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+            match(input,229,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__2__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__3"
+    // InternalFormalML.g:33477:1: rule__CollectionTypeDefinition__Group__3 : rule__CollectionTypeDefinition__Group__3__Impl rule__CollectionTypeDefinition__Group__4 ;
+    public final void rule__CollectionTypeDefinition__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33481:1: ( rule__CollectionTypeDefinition__Group__3__Impl rule__CollectionTypeDefinition__Group__4 )
+            // InternalFormalML.g:33482:2: rule__CollectionTypeDefinition__Group__3__Impl rule__CollectionTypeDefinition__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_156);
+            rule__CollectionTypeDefinition__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__3"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__3__Impl"
+    // InternalFormalML.g:33489:1: rule__CollectionTypeDefinition__Group__3__Impl : ( ( rule__CollectionTypeDefinition__NameAssignment_3 ) ) ;
+    public final void rule__CollectionTypeDefinition__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33493:1: ( ( ( rule__CollectionTypeDefinition__NameAssignment_3 ) ) )
+            // InternalFormalML.g:33494:1: ( ( rule__CollectionTypeDefinition__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:33494:1: ( ( rule__CollectionTypeDefinition__NameAssignment_3 ) )
+            // InternalFormalML.g:33495:2: ( rule__CollectionTypeDefinition__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:33496:2: ( rule__CollectionTypeDefinition__NameAssignment_3 )
+            // InternalFormalML.g:33496:3: rule__CollectionTypeDefinition__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__3__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__4"
+    // InternalFormalML.g:33504:1: rule__CollectionTypeDefinition__Group__4 : rule__CollectionTypeDefinition__Group__4__Impl rule__CollectionTypeDefinition__Group__5 ;
+    public final void rule__CollectionTypeDefinition__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33508:1: ( rule__CollectionTypeDefinition__Group__4__Impl rule__CollectionTypeDefinition__Group__5 )
+            // InternalFormalML.g:33509:2: rule__CollectionTypeDefinition__Group__4__Impl rule__CollectionTypeDefinition__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_156);
+            rule__CollectionTypeDefinition__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__4"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__4__Impl"
+    // InternalFormalML.g:33516:1: rule__CollectionTypeDefinition__Group__4__Impl : ( ( rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__CollectionTypeDefinition__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33520:1: ( ( ( rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:33521:1: ( ( rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:33521:1: ( ( rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:33522:2: ( rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:33523:2: ( rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4 )?
+            int alt483=2;
+            int LA483_0 = input.LA(1);
+
+            if ( (LA483_0==RULE_STRING) ) {
+                alt483=1;
+            }
+            switch (alt483) {
+                case 1 :
+                    // InternalFormalML.g:33523:3: rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__4__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__5"
+    // InternalFormalML.g:33531:1: rule__CollectionTypeDefinition__Group__5 : rule__CollectionTypeDefinition__Group__5__Impl rule__CollectionTypeDefinition__Group__6 ;
+    public final void rule__CollectionTypeDefinition__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33535:1: ( rule__CollectionTypeDefinition__Group__5__Impl rule__CollectionTypeDefinition__Group__6 )
+            // InternalFormalML.g:33536:2: rule__CollectionTypeDefinition__Group__5__Impl rule__CollectionTypeDefinition__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__CollectionTypeDefinition__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__5"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__5__Impl"
+    // InternalFormalML.g:33543:1: rule__CollectionTypeDefinition__Group__5__Impl : ( ( rule__CollectionTypeDefinition__ContainerAssignment_5 ) ) ;
+    public final void rule__CollectionTypeDefinition__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33547:1: ( ( ( rule__CollectionTypeDefinition__ContainerAssignment_5 ) ) )
+            // InternalFormalML.g:33548:1: ( ( rule__CollectionTypeDefinition__ContainerAssignment_5 ) )
+            {
+            // InternalFormalML.g:33548:1: ( ( rule__CollectionTypeDefinition__ContainerAssignment_5 ) )
+            // InternalFormalML.g:33549:2: ( rule__CollectionTypeDefinition__ContainerAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getContainerAssignment_5()); 
+            }
+            // InternalFormalML.g:33550:2: ( rule__CollectionTypeDefinition__ContainerAssignment_5 )
+            // InternalFormalML.g:33550:3: rule__CollectionTypeDefinition__ContainerAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__ContainerAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getContainerAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__5__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__6"
+    // InternalFormalML.g:33558:1: rule__CollectionTypeDefinition__Group__6 : rule__CollectionTypeDefinition__Group__6__Impl rule__CollectionTypeDefinition__Group__7 ;
+    public final void rule__CollectionTypeDefinition__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33562:1: ( rule__CollectionTypeDefinition__Group__6__Impl rule__CollectionTypeDefinition__Group__7 )
+            // InternalFormalML.g:33563:2: rule__CollectionTypeDefinition__Group__6__Impl rule__CollectionTypeDefinition__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__CollectionTypeDefinition__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__6"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__6__Impl"
+    // InternalFormalML.g:33570:1: rule__CollectionTypeDefinition__Group__6__Impl : ( '<' ) ;
+    public final void rule__CollectionTypeDefinition__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33574:1: ( ( '<' ) )
+            // InternalFormalML.g:33575:1: ( '<' )
+            {
+            // InternalFormalML.g:33575:1: ( '<' )
+            // InternalFormalML.g:33576:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getLessThanSignKeyword_6()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getLessThanSignKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__6__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__7"
+    // InternalFormalML.g:33585:1: rule__CollectionTypeDefinition__Group__7 : rule__CollectionTypeDefinition__Group__7__Impl rule__CollectionTypeDefinition__Group__8 ;
+    public final void rule__CollectionTypeDefinition__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33589:1: ( rule__CollectionTypeDefinition__Group__7__Impl rule__CollectionTypeDefinition__Group__8 )
+            // InternalFormalML.g:33590:2: rule__CollectionTypeDefinition__Group__7__Impl rule__CollectionTypeDefinition__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_154);
+            rule__CollectionTypeDefinition__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__7"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__7__Impl"
+    // InternalFormalML.g:33597:1: rule__CollectionTypeDefinition__Group__7__Impl : ( ( rule__CollectionTypeDefinition__SupportAssignment_7 ) ) ;
+    public final void rule__CollectionTypeDefinition__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33601:1: ( ( ( rule__CollectionTypeDefinition__SupportAssignment_7 ) ) )
+            // InternalFormalML.g:33602:1: ( ( rule__CollectionTypeDefinition__SupportAssignment_7 ) )
+            {
+            // InternalFormalML.g:33602:1: ( ( rule__CollectionTypeDefinition__SupportAssignment_7 ) )
+            // InternalFormalML.g:33603:2: ( rule__CollectionTypeDefinition__SupportAssignment_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getSupportAssignment_7()); 
+            }
+            // InternalFormalML.g:33604:2: ( rule__CollectionTypeDefinition__SupportAssignment_7 )
+            // InternalFormalML.g:33604:3: rule__CollectionTypeDefinition__SupportAssignment_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__SupportAssignment_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getSupportAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__7__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__8"
+    // InternalFormalML.g:33612:1: rule__CollectionTypeDefinition__Group__8 : rule__CollectionTypeDefinition__Group__8__Impl rule__CollectionTypeDefinition__Group__9 ;
+    public final void rule__CollectionTypeDefinition__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33616:1: ( rule__CollectionTypeDefinition__Group__8__Impl rule__CollectionTypeDefinition__Group__9 )
+            // InternalFormalML.g:33617:2: rule__CollectionTypeDefinition__Group__8__Impl rule__CollectionTypeDefinition__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_154);
+            rule__CollectionTypeDefinition__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__8"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__8__Impl"
+    // InternalFormalML.g:33624:1: rule__CollectionTypeDefinition__Group__8__Impl : ( ( rule__CollectionTypeDefinition__Group_8__0 )? ) ;
+    public final void rule__CollectionTypeDefinition__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33628:1: ( ( ( rule__CollectionTypeDefinition__Group_8__0 )? ) )
+            // InternalFormalML.g:33629:1: ( ( rule__CollectionTypeDefinition__Group_8__0 )? )
+            {
+            // InternalFormalML.g:33629:1: ( ( rule__CollectionTypeDefinition__Group_8__0 )? )
+            // InternalFormalML.g:33630:2: ( rule__CollectionTypeDefinition__Group_8__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getGroup_8()); 
+            }
+            // InternalFormalML.g:33631:2: ( rule__CollectionTypeDefinition__Group_8__0 )?
+            int alt484=2;
+            int LA484_0 = input.LA(1);
+
+            if ( (LA484_0==198) ) {
+                alt484=1;
+            }
+            switch (alt484) {
+                case 1 :
+                    // InternalFormalML.g:33631:3: rule__CollectionTypeDefinition__Group_8__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionTypeDefinition__Group_8__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getGroup_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__8__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__9"
+    // InternalFormalML.g:33639:1: rule__CollectionTypeDefinition__Group__9 : rule__CollectionTypeDefinition__Group__9__Impl rule__CollectionTypeDefinition__Group__10 ;
+    public final void rule__CollectionTypeDefinition__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33643:1: ( rule__CollectionTypeDefinition__Group__9__Impl rule__CollectionTypeDefinition__Group__10 )
+            // InternalFormalML.g:33644:2: rule__CollectionTypeDefinition__Group__9__Impl rule__CollectionTypeDefinition__Group__10
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__CollectionTypeDefinition__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__9"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__9__Impl"
+    // InternalFormalML.g:33651:1: rule__CollectionTypeDefinition__Group__9__Impl : ( '>' ) ;
+    public final void rule__CollectionTypeDefinition__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33655:1: ( ( '>' ) )
+            // InternalFormalML.g:33656:1: ( '>' )
+            {
+            // InternalFormalML.g:33656:1: ( '>' )
+            // InternalFormalML.g:33657:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getGreaterThanSignKeyword_9()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getGreaterThanSignKeyword_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__9__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__10"
+    // InternalFormalML.g:33666:1: rule__CollectionTypeDefinition__Group__10 : rule__CollectionTypeDefinition__Group__10__Impl ;
+    public final void rule__CollectionTypeDefinition__Group__10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33670:1: ( rule__CollectionTypeDefinition__Group__10__Impl )
+            // InternalFormalML.g:33671:2: rule__CollectionTypeDefinition__Group__10__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group__10__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__10"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group__10__Impl"
+    // InternalFormalML.g:33677:1: rule__CollectionTypeDefinition__Group__10__Impl : ( ';' ) ;
+    public final void rule__CollectionTypeDefinition__Group__10__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33681:1: ( ( ';' ) )
+            // InternalFormalML.g:33682:1: ( ';' )
+            {
+            // InternalFormalML.g:33682:1: ( ';' )
+            // InternalFormalML.g:33683:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getSemicolonKeyword_10()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getSemicolonKeyword_10()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group__10__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group_8__0"
+    // InternalFormalML.g:33693:1: rule__CollectionTypeDefinition__Group_8__0 : rule__CollectionTypeDefinition__Group_8__0__Impl rule__CollectionTypeDefinition__Group_8__1 ;
+    public final void rule__CollectionTypeDefinition__Group_8__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33697:1: ( rule__CollectionTypeDefinition__Group_8__0__Impl rule__CollectionTypeDefinition__Group_8__1 )
+            // InternalFormalML.g:33698:2: rule__CollectionTypeDefinition__Group_8__0__Impl rule__CollectionTypeDefinition__Group_8__1
+            {
+            pushFollow(FollowSets000.FOLLOW_155);
+            rule__CollectionTypeDefinition__Group_8__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group_8__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group_8__0"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group_8__0__Impl"
+    // InternalFormalML.g:33705:1: rule__CollectionTypeDefinition__Group_8__0__Impl : ( ',' ) ;
+    public final void rule__CollectionTypeDefinition__Group_8__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33709:1: ( ( ',' ) )
+            // InternalFormalML.g:33710:1: ( ',' )
+            {
+            // InternalFormalML.g:33710:1: ( ',' )
+            // InternalFormalML.g:33711:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getCommaKeyword_8_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getCommaKeyword_8_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group_8__0__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group_8__1"
+    // InternalFormalML.g:33720:1: rule__CollectionTypeDefinition__Group_8__1 : rule__CollectionTypeDefinition__Group_8__1__Impl ;
+    public final void rule__CollectionTypeDefinition__Group_8__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33724:1: ( rule__CollectionTypeDefinition__Group_8__1__Impl )
+            // InternalFormalML.g:33725:2: rule__CollectionTypeDefinition__Group_8__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Group_8__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group_8__1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__Group_8__1__Impl"
+    // InternalFormalML.g:33731:1: rule__CollectionTypeDefinition__Group_8__1__Impl : ( ( rule__CollectionTypeDefinition__Alternatives_8_1 ) ) ;
+    public final void rule__CollectionTypeDefinition__Group_8__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33735:1: ( ( ( rule__CollectionTypeDefinition__Alternatives_8_1 ) ) )
+            // InternalFormalML.g:33736:1: ( ( rule__CollectionTypeDefinition__Alternatives_8_1 ) )
+            {
+            // InternalFormalML.g:33736:1: ( ( rule__CollectionTypeDefinition__Alternatives_8_1 ) )
+            // InternalFormalML.g:33737:2: ( rule__CollectionTypeDefinition__Alternatives_8_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getAlternatives_8_1()); 
+            }
+            // InternalFormalML.g:33738:2: ( rule__CollectionTypeDefinition__Alternatives_8_1 )
+            // InternalFormalML.g:33738:3: rule__CollectionTypeDefinition__Alternatives_8_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinition__Alternatives_8_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getAlternatives_8_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__Group_8__1__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__0"
+    // InternalFormalML.g:33747:1: rule__CollectionTypeDefinitionImpl__Group__0 : rule__CollectionTypeDefinitionImpl__Group__0__Impl rule__CollectionTypeDefinitionImpl__Group__1 ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33751:1: ( rule__CollectionTypeDefinitionImpl__Group__0__Impl rule__CollectionTypeDefinitionImpl__Group__1 )
+            // InternalFormalML.g:33752:2: rule__CollectionTypeDefinitionImpl__Group__0__Impl rule__CollectionTypeDefinitionImpl__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__CollectionTypeDefinitionImpl__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__0"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__0__Impl"
+    // InternalFormalML.g:33759:1: rule__CollectionTypeDefinitionImpl__Group__0__Impl : ( () ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33763:1: ( ( () ) )
+            // InternalFormalML.g:33764:1: ( () )
+            {
+            // InternalFormalML.g:33764:1: ( () )
+            // InternalFormalML.g:33765:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getCollectionTypeAction_0()); 
+            }
+            // InternalFormalML.g:33766:2: ()
+            // InternalFormalML.g:33766:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getCollectionTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__0__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__1"
+    // InternalFormalML.g:33774:1: rule__CollectionTypeDefinitionImpl__Group__1 : rule__CollectionTypeDefinitionImpl__Group__1__Impl rule__CollectionTypeDefinitionImpl__Group__2 ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33778:1: ( rule__CollectionTypeDefinitionImpl__Group__1__Impl rule__CollectionTypeDefinitionImpl__Group__2 )
+            // InternalFormalML.g:33779:2: rule__CollectionTypeDefinitionImpl__Group__1__Impl rule__CollectionTypeDefinitionImpl__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_156);
+            rule__CollectionTypeDefinitionImpl__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__1__Impl"
+    // InternalFormalML.g:33786:1: rule__CollectionTypeDefinitionImpl__Group__1__Impl : ( ( rule__CollectionTypeDefinitionImpl__NameAssignment_1 ) ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33790:1: ( ( ( rule__CollectionTypeDefinitionImpl__NameAssignment_1 ) ) )
+            // InternalFormalML.g:33791:1: ( ( rule__CollectionTypeDefinitionImpl__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:33791:1: ( ( rule__CollectionTypeDefinitionImpl__NameAssignment_1 ) )
+            // InternalFormalML.g:33792:2: ( rule__CollectionTypeDefinitionImpl__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:33793:2: ( rule__CollectionTypeDefinitionImpl__NameAssignment_1 )
+            // InternalFormalML.g:33793:3: rule__CollectionTypeDefinitionImpl__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__1__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__2"
+    // InternalFormalML.g:33801:1: rule__CollectionTypeDefinitionImpl__Group__2 : rule__CollectionTypeDefinitionImpl__Group__2__Impl rule__CollectionTypeDefinitionImpl__Group__3 ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33805:1: ( rule__CollectionTypeDefinitionImpl__Group__2__Impl rule__CollectionTypeDefinitionImpl__Group__3 )
+            // InternalFormalML.g:33806:2: rule__CollectionTypeDefinitionImpl__Group__2__Impl rule__CollectionTypeDefinitionImpl__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_156);
+            rule__CollectionTypeDefinitionImpl__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__2"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__2__Impl"
+    // InternalFormalML.g:33813:1: rule__CollectionTypeDefinitionImpl__Group__2__Impl : ( ( rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33817:1: ( ( ( rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:33818:1: ( ( rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:33818:1: ( ( rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:33819:2: ( rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:33820:2: ( rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            int alt485=2;
+            int LA485_0 = input.LA(1);
+
+            if ( (LA485_0==RULE_STRING) ) {
+                alt485=1;
+            }
+            switch (alt485) {
+                case 1 :
+                    // InternalFormalML.g:33820:3: rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__2__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__3"
+    // InternalFormalML.g:33828:1: rule__CollectionTypeDefinitionImpl__Group__3 : rule__CollectionTypeDefinitionImpl__Group__3__Impl rule__CollectionTypeDefinitionImpl__Group__4 ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33832:1: ( rule__CollectionTypeDefinitionImpl__Group__3__Impl rule__CollectionTypeDefinitionImpl__Group__4 )
+            // InternalFormalML.g:33833:2: rule__CollectionTypeDefinitionImpl__Group__3__Impl rule__CollectionTypeDefinitionImpl__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__CollectionTypeDefinitionImpl__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__3"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__3__Impl"
+    // InternalFormalML.g:33840:1: rule__CollectionTypeDefinitionImpl__Group__3__Impl : ( ( rule__CollectionTypeDefinitionImpl__ContainerAssignment_3 ) ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33844:1: ( ( ( rule__CollectionTypeDefinitionImpl__ContainerAssignment_3 ) ) )
+            // InternalFormalML.g:33845:1: ( ( rule__CollectionTypeDefinitionImpl__ContainerAssignment_3 ) )
+            {
+            // InternalFormalML.g:33845:1: ( ( rule__CollectionTypeDefinitionImpl__ContainerAssignment_3 ) )
+            // InternalFormalML.g:33846:2: ( rule__CollectionTypeDefinitionImpl__ContainerAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerAssignment_3()); 
+            }
+            // InternalFormalML.g:33847:2: ( rule__CollectionTypeDefinitionImpl__ContainerAssignment_3 )
+            // InternalFormalML.g:33847:3: rule__CollectionTypeDefinitionImpl__ContainerAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__ContainerAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__3__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__4"
+    // InternalFormalML.g:33855:1: rule__CollectionTypeDefinitionImpl__Group__4 : rule__CollectionTypeDefinitionImpl__Group__4__Impl rule__CollectionTypeDefinitionImpl__Group__5 ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33859:1: ( rule__CollectionTypeDefinitionImpl__Group__4__Impl rule__CollectionTypeDefinitionImpl__Group__5 )
+            // InternalFormalML.g:33860:2: rule__CollectionTypeDefinitionImpl__Group__4__Impl rule__CollectionTypeDefinitionImpl__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__CollectionTypeDefinitionImpl__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__4"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__4__Impl"
+    // InternalFormalML.g:33867:1: rule__CollectionTypeDefinitionImpl__Group__4__Impl : ( '<' ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33871:1: ( ( '<' ) )
+            // InternalFormalML.g:33872:1: ( '<' )
+            {
+            // InternalFormalML.g:33872:1: ( '<' )
+            // InternalFormalML.g:33873:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getLessThanSignKeyword_4()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getLessThanSignKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__4__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__5"
+    // InternalFormalML.g:33882:1: rule__CollectionTypeDefinitionImpl__Group__5 : rule__CollectionTypeDefinitionImpl__Group__5__Impl rule__CollectionTypeDefinitionImpl__Group__6 ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33886:1: ( rule__CollectionTypeDefinitionImpl__Group__5__Impl rule__CollectionTypeDefinitionImpl__Group__6 )
+            // InternalFormalML.g:33887:2: rule__CollectionTypeDefinitionImpl__Group__5__Impl rule__CollectionTypeDefinitionImpl__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_154);
+            rule__CollectionTypeDefinitionImpl__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__5"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__5__Impl"
+    // InternalFormalML.g:33894:1: rule__CollectionTypeDefinitionImpl__Group__5__Impl : ( ( rule__CollectionTypeDefinitionImpl__SupportAssignment_5 ) ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33898:1: ( ( ( rule__CollectionTypeDefinitionImpl__SupportAssignment_5 ) ) )
+            // InternalFormalML.g:33899:1: ( ( rule__CollectionTypeDefinitionImpl__SupportAssignment_5 ) )
+            {
+            // InternalFormalML.g:33899:1: ( ( rule__CollectionTypeDefinitionImpl__SupportAssignment_5 ) )
+            // InternalFormalML.g:33900:2: ( rule__CollectionTypeDefinitionImpl__SupportAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportAssignment_5()); 
+            }
+            // InternalFormalML.g:33901:2: ( rule__CollectionTypeDefinitionImpl__SupportAssignment_5 )
+            // InternalFormalML.g:33901:3: rule__CollectionTypeDefinitionImpl__SupportAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__SupportAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__5__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__6"
+    // InternalFormalML.g:33909:1: rule__CollectionTypeDefinitionImpl__Group__6 : rule__CollectionTypeDefinitionImpl__Group__6__Impl rule__CollectionTypeDefinitionImpl__Group__7 ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33913:1: ( rule__CollectionTypeDefinitionImpl__Group__6__Impl rule__CollectionTypeDefinitionImpl__Group__7 )
+            // InternalFormalML.g:33914:2: rule__CollectionTypeDefinitionImpl__Group__6__Impl rule__CollectionTypeDefinitionImpl__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_154);
+            rule__CollectionTypeDefinitionImpl__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__6"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__6__Impl"
+    // InternalFormalML.g:33921:1: rule__CollectionTypeDefinitionImpl__Group__6__Impl : ( ( rule__CollectionTypeDefinitionImpl__Group_6__0 )? ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33925:1: ( ( ( rule__CollectionTypeDefinitionImpl__Group_6__0 )? ) )
+            // InternalFormalML.g:33926:1: ( ( rule__CollectionTypeDefinitionImpl__Group_6__0 )? )
+            {
+            // InternalFormalML.g:33926:1: ( ( rule__CollectionTypeDefinitionImpl__Group_6__0 )? )
+            // InternalFormalML.g:33927:2: ( rule__CollectionTypeDefinitionImpl__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup_6()); 
+            }
+            // InternalFormalML.g:33928:2: ( rule__CollectionTypeDefinitionImpl__Group_6__0 )?
+            int alt486=2;
+            int LA486_0 = input.LA(1);
+
+            if ( (LA486_0==198) ) {
+                alt486=1;
+            }
+            switch (alt486) {
+                case 1 :
+                    // InternalFormalML.g:33928:3: rule__CollectionTypeDefinitionImpl__Group_6__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__CollectionTypeDefinitionImpl__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__6__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__7"
+    // InternalFormalML.g:33936:1: rule__CollectionTypeDefinitionImpl__Group__7 : rule__CollectionTypeDefinitionImpl__Group__7__Impl rule__CollectionTypeDefinitionImpl__Group__8 ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33940:1: ( rule__CollectionTypeDefinitionImpl__Group__7__Impl rule__CollectionTypeDefinitionImpl__Group__8 )
+            // InternalFormalML.g:33941:2: rule__CollectionTypeDefinitionImpl__Group__7__Impl rule__CollectionTypeDefinitionImpl__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__CollectionTypeDefinitionImpl__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__7"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__7__Impl"
+    // InternalFormalML.g:33948:1: rule__CollectionTypeDefinitionImpl__Group__7__Impl : ( '>' ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33952:1: ( ( '>' ) )
+            // InternalFormalML.g:33953:1: ( '>' )
+            {
+            // InternalFormalML.g:33953:1: ( '>' )
+            // InternalFormalML.g:33954:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getGreaterThanSignKeyword_7()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getGreaterThanSignKeyword_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__7__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__8"
+    // InternalFormalML.g:33963:1: rule__CollectionTypeDefinitionImpl__Group__8 : rule__CollectionTypeDefinitionImpl__Group__8__Impl ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33967:1: ( rule__CollectionTypeDefinitionImpl__Group__8__Impl )
+            // InternalFormalML.g:33968:2: rule__CollectionTypeDefinitionImpl__Group__8__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__8"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group__8__Impl"
+    // InternalFormalML.g:33974:1: rule__CollectionTypeDefinitionImpl__Group__8__Impl : ( ';' ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33978:1: ( ( ';' ) )
+            // InternalFormalML.g:33979:1: ( ';' )
+            {
+            // InternalFormalML.g:33979:1: ( ';' )
+            // InternalFormalML.g:33980:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSemicolonKeyword_8()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSemicolonKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group__8__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group_6__0"
+    // InternalFormalML.g:33990:1: rule__CollectionTypeDefinitionImpl__Group_6__0 : rule__CollectionTypeDefinitionImpl__Group_6__0__Impl rule__CollectionTypeDefinitionImpl__Group_6__1 ;
+    public final void rule__CollectionTypeDefinitionImpl__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:33994:1: ( rule__CollectionTypeDefinitionImpl__Group_6__0__Impl rule__CollectionTypeDefinitionImpl__Group_6__1 )
+            // InternalFormalML.g:33995:2: rule__CollectionTypeDefinitionImpl__Group_6__0__Impl rule__CollectionTypeDefinitionImpl__Group_6__1
+            {
+            pushFollow(FollowSets000.FOLLOW_155);
+            rule__CollectionTypeDefinitionImpl__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group_6__0"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group_6__0__Impl"
+    // InternalFormalML.g:34002:1: rule__CollectionTypeDefinitionImpl__Group_6__0__Impl : ( ',' ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34006:1: ( ( ',' ) )
+            // InternalFormalML.g:34007:1: ( ',' )
+            {
+            // InternalFormalML.g:34007:1: ( ',' )
+            // InternalFormalML.g:34008:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getCommaKeyword_6_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getCommaKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group_6__1"
+    // InternalFormalML.g:34017:1: rule__CollectionTypeDefinitionImpl__Group_6__1 : rule__CollectionTypeDefinitionImpl__Group_6__1__Impl ;
+    public final void rule__CollectionTypeDefinitionImpl__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34021:1: ( rule__CollectionTypeDefinitionImpl__Group_6__1__Impl )
+            // InternalFormalML.g:34022:2: rule__CollectionTypeDefinitionImpl__Group_6__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group_6__1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__Group_6__1__Impl"
+    // InternalFormalML.g:34028:1: rule__CollectionTypeDefinitionImpl__Group_6__1__Impl : ( ( rule__CollectionTypeDefinitionImpl__Alternatives_6_1 ) ) ;
+    public final void rule__CollectionTypeDefinitionImpl__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34032:1: ( ( ( rule__CollectionTypeDefinitionImpl__Alternatives_6_1 ) ) )
+            // InternalFormalML.g:34033:1: ( ( rule__CollectionTypeDefinitionImpl__Alternatives_6_1 ) )
+            {
+            // InternalFormalML.g:34033:1: ( ( rule__CollectionTypeDefinitionImpl__Alternatives_6_1 ) )
+            // InternalFormalML.g:34034:2: ( rule__CollectionTypeDefinitionImpl__Alternatives_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getAlternatives_6_1()); 
+            }
+            // InternalFormalML.g:34035:2: ( rule__CollectionTypeDefinitionImpl__Alternatives_6_1 )
+            // InternalFormalML.g:34035:3: rule__CollectionTypeDefinitionImpl__Alternatives_6_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CollectionTypeDefinitionImpl__Alternatives_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getAlternatives_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__0"
+    // InternalFormalML.g:34044:1: rule__EnumerationType__Group__0 : rule__EnumerationType__Group__0__Impl rule__EnumerationType__Group__1 ;
+    public final void rule__EnumerationType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34048:1: ( rule__EnumerationType__Group__0__Impl rule__EnumerationType__Group__1 )
+            // InternalFormalML.g:34049:2: rule__EnumerationType__Group__0__Impl rule__EnumerationType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_157);
+            rule__EnumerationType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__0"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__0__Impl"
+    // InternalFormalML.g:34056:1: rule__EnumerationType__Group__0__Impl : ( () ) ;
+    public final void rule__EnumerationType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34060:1: ( ( () ) )
+            // InternalFormalML.g:34061:1: ( () )
+            {
+            // InternalFormalML.g:34061:1: ( () )
+            // InternalFormalML.g:34062:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getEnumerationTypeAction_0()); 
+            }
+            // InternalFormalML.g:34063:2: ()
+            // InternalFormalML.g:34063:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getEnumerationTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__1"
+    // InternalFormalML.g:34071:1: rule__EnumerationType__Group__1 : rule__EnumerationType__Group__1__Impl rule__EnumerationType__Group__2 ;
+    public final void rule__EnumerationType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34075:1: ( rule__EnumerationType__Group__1__Impl rule__EnumerationType__Group__2 )
+            // InternalFormalML.g:34076:2: rule__EnumerationType__Group__1__Impl rule__EnumerationType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__EnumerationType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__1"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__1__Impl"
+    // InternalFormalML.g:34083:1: rule__EnumerationType__Group__1__Impl : ( 'enum' ) ;
+    public final void rule__EnumerationType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34087:1: ( ( 'enum' ) )
+            // InternalFormalML.g:34088:1: ( 'enum' )
+            {
+            // InternalFormalML.g:34088:1: ( 'enum' )
+            // InternalFormalML.g:34089:2: 'enum'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getEnumKeyword_1()); 
+            }
+            match(input,235,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getEnumKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__2"
+    // InternalFormalML.g:34098:1: rule__EnumerationType__Group__2 : rule__EnumerationType__Group__2__Impl rule__EnumerationType__Group__3 ;
+    public final void rule__EnumerationType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34102:1: ( rule__EnumerationType__Group__2__Impl rule__EnumerationType__Group__3 )
+            // InternalFormalML.g:34103:2: rule__EnumerationType__Group__2__Impl rule__EnumerationType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__EnumerationType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__2"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__2__Impl"
+    // InternalFormalML.g:34110:1: rule__EnumerationType__Group__2__Impl : ( '{' ) ;
+    public final void rule__EnumerationType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34114:1: ( ( '{' ) )
+            // InternalFormalML.g:34115:1: ( '{' )
+            {
+            // InternalFormalML.g:34115:1: ( '{' )
+            // InternalFormalML.g:34116:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__3"
+    // InternalFormalML.g:34125:1: rule__EnumerationType__Group__3 : rule__EnumerationType__Group__3__Impl rule__EnumerationType__Group__4 ;
+    public final void rule__EnumerationType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34129:1: ( rule__EnumerationType__Group__3__Impl rule__EnumerationType__Group__4 )
+            // InternalFormalML.g:34130:2: rule__EnumerationType__Group__3__Impl rule__EnumerationType__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_158);
+            rule__EnumerationType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__3"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__3__Impl"
+    // InternalFormalML.g:34137:1: rule__EnumerationType__Group__3__Impl : ( ( rule__EnumerationType__LiteralAssignment_3 ) ) ;
+    public final void rule__EnumerationType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34141:1: ( ( ( rule__EnumerationType__LiteralAssignment_3 ) ) )
+            // InternalFormalML.g:34142:1: ( ( rule__EnumerationType__LiteralAssignment_3 ) )
+            {
+            // InternalFormalML.g:34142:1: ( ( rule__EnumerationType__LiteralAssignment_3 ) )
+            // InternalFormalML.g:34143:2: ( rule__EnumerationType__LiteralAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_3()); 
+            }
+            // InternalFormalML.g:34144:2: ( rule__EnumerationType__LiteralAssignment_3 )
+            // InternalFormalML.g:34144:3: rule__EnumerationType__LiteralAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__LiteralAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__4"
+    // InternalFormalML.g:34152:1: rule__EnumerationType__Group__4 : rule__EnumerationType__Group__4__Impl rule__EnumerationType__Group__5 ;
+    public final void rule__EnumerationType__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34156:1: ( rule__EnumerationType__Group__4__Impl rule__EnumerationType__Group__5 )
+            // InternalFormalML.g:34157:2: rule__EnumerationType__Group__4__Impl rule__EnumerationType__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_158);
+            rule__EnumerationType__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__4"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__4__Impl"
+    // InternalFormalML.g:34164:1: rule__EnumerationType__Group__4__Impl : ( ( rule__EnumerationType__Group_4__0 )* ) ;
+    public final void rule__EnumerationType__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34168:1: ( ( ( rule__EnumerationType__Group_4__0 )* ) )
+            // InternalFormalML.g:34169:1: ( ( rule__EnumerationType__Group_4__0 )* )
+            {
+            // InternalFormalML.g:34169:1: ( ( rule__EnumerationType__Group_4__0 )* )
+            // InternalFormalML.g:34170:2: ( rule__EnumerationType__Group_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:34171:2: ( rule__EnumerationType__Group_4__0 )*
+            loop487:
+            do {
+                int alt487=2;
+                int LA487_0 = input.LA(1);
+
+                if ( (LA487_0==198) ) {
+                    alt487=1;
+                }
+
+
+                switch (alt487) {
+            	case 1 :
+            	    // InternalFormalML.g:34171:3: rule__EnumerationType__Group_4__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__EnumerationType__Group_4__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop487;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__5"
+    // InternalFormalML.g:34179:1: rule__EnumerationType__Group__5 : rule__EnumerationType__Group__5__Impl ;
+    public final void rule__EnumerationType__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34183:1: ( rule__EnumerationType__Group__5__Impl )
+            // InternalFormalML.g:34184:2: rule__EnumerationType__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__5"
+
+
+    // $ANTLR start "rule__EnumerationType__Group__5__Impl"
+    // InternalFormalML.g:34190:1: rule__EnumerationType__Group__5__Impl : ( '}' ) ;
+    public final void rule__EnumerationType__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34194:1: ( ( '}' ) )
+            // InternalFormalML.g:34195:1: ( '}' )
+            {
+            // InternalFormalML.g:34195:1: ( '}' )
+            // InternalFormalML.g:34196:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getRightCurlyBracketKeyword_5()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getRightCurlyBracketKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group__5__Impl"
+
+
+    // $ANTLR start "rule__EnumerationType__Group_4__0"
+    // InternalFormalML.g:34206:1: rule__EnumerationType__Group_4__0 : rule__EnumerationType__Group_4__0__Impl rule__EnumerationType__Group_4__1 ;
+    public final void rule__EnumerationType__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34210:1: ( rule__EnumerationType__Group_4__0__Impl rule__EnumerationType__Group_4__1 )
+            // InternalFormalML.g:34211:2: rule__EnumerationType__Group_4__0__Impl rule__EnumerationType__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__EnumerationType__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group_4__0"
+
+
+    // $ANTLR start "rule__EnumerationType__Group_4__0__Impl"
+    // InternalFormalML.g:34218:1: rule__EnumerationType__Group_4__0__Impl : ( ',' ) ;
+    public final void rule__EnumerationType__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34222:1: ( ( ',' ) )
+            // InternalFormalML.g:34223:1: ( ',' )
+            {
+            // InternalFormalML.g:34223:1: ( ',' )
+            // InternalFormalML.g:34224:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getCommaKeyword_4_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getCommaKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__EnumerationType__Group_4__1"
+    // InternalFormalML.g:34233:1: rule__EnumerationType__Group_4__1 : rule__EnumerationType__Group_4__1__Impl ;
+    public final void rule__EnumerationType__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34237:1: ( rule__EnumerationType__Group_4__1__Impl )
+            // InternalFormalML.g:34238:2: rule__EnumerationType__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group_4__1"
+
+
+    // $ANTLR start "rule__EnumerationType__Group_4__1__Impl"
+    // InternalFormalML.g:34244:1: rule__EnumerationType__Group_4__1__Impl : ( ( rule__EnumerationType__LiteralAssignment_4_1 ) ) ;
+    public final void rule__EnumerationType__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34248:1: ( ( ( rule__EnumerationType__LiteralAssignment_4_1 ) ) )
+            // InternalFormalML.g:34249:1: ( ( rule__EnumerationType__LiteralAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:34249:1: ( ( rule__EnumerationType__LiteralAssignment_4_1 ) )
+            // InternalFormalML.g:34250:2: ( rule__EnumerationType__LiteralAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_4_1()); 
+            }
+            // InternalFormalML.g:34251:2: ( rule__EnumerationType__LiteralAssignment_4_1 )
+            // InternalFormalML.g:34251:3: rule__EnumerationType__LiteralAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationType__LiteralAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getLiteralAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__0"
+    // InternalFormalML.g:34260:1: rule__EnumerationTypeDefinition__Group__0 : rule__EnumerationTypeDefinition__Group__0__Impl rule__EnumerationTypeDefinition__Group__1 ;
+    public final void rule__EnumerationTypeDefinition__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34264:1: ( rule__EnumerationTypeDefinition__Group__0__Impl rule__EnumerationTypeDefinition__Group__1 )
+            // InternalFormalML.g:34265:2: rule__EnumerationTypeDefinition__Group__0__Impl rule__EnumerationTypeDefinition__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__EnumerationTypeDefinition__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__0"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__0__Impl"
+    // InternalFormalML.g:34272:1: rule__EnumerationTypeDefinition__Group__0__Impl : ( () ) ;
+    public final void rule__EnumerationTypeDefinition__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34276:1: ( ( () ) )
+            // InternalFormalML.g:34277:1: ( () )
+            {
+            // InternalFormalML.g:34277:1: ( () )
+            // InternalFormalML.g:34278:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getEnumerationTypeAction_0()); 
+            }
+            // InternalFormalML.g:34279:2: ()
+            // InternalFormalML.g:34279:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getEnumerationTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__1"
+    // InternalFormalML.g:34287:1: rule__EnumerationTypeDefinition__Group__1 : rule__EnumerationTypeDefinition__Group__1__Impl rule__EnumerationTypeDefinition__Group__2 ;
+    public final void rule__EnumerationTypeDefinition__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34291:1: ( rule__EnumerationTypeDefinition__Group__1__Impl rule__EnumerationTypeDefinition__Group__2 )
+            // InternalFormalML.g:34292:2: rule__EnumerationTypeDefinition__Group__1__Impl rule__EnumerationTypeDefinition__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__EnumerationTypeDefinition__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__1"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__1__Impl"
+    // InternalFormalML.g:34299:1: rule__EnumerationTypeDefinition__Group__1__Impl : ( ( rule__EnumerationTypeDefinition__VisibilityAssignment_1 )? ) ;
+    public final void rule__EnumerationTypeDefinition__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34303:1: ( ( ( rule__EnumerationTypeDefinition__VisibilityAssignment_1 )? ) )
+            // InternalFormalML.g:34304:1: ( ( rule__EnumerationTypeDefinition__VisibilityAssignment_1 )? )
+            {
+            // InternalFormalML.g:34304:1: ( ( rule__EnumerationTypeDefinition__VisibilityAssignment_1 )? )
+            // InternalFormalML.g:34305:2: ( rule__EnumerationTypeDefinition__VisibilityAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:34306:2: ( rule__EnumerationTypeDefinition__VisibilityAssignment_1 )?
+            int alt488=2;
+            int LA488_0 = input.LA(1);
+
+            if ( (LA488_0==28||(LA488_0>=143 && LA488_0<=145)) ) {
+                alt488=1;
+            }
+            switch (alt488) {
+                case 1 :
+                    // InternalFormalML.g:34306:3: rule__EnumerationTypeDefinition__VisibilityAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__EnumerationTypeDefinition__VisibilityAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__2"
+    // InternalFormalML.g:34314:1: rule__EnumerationTypeDefinition__Group__2 : rule__EnumerationTypeDefinition__Group__2__Impl rule__EnumerationTypeDefinition__Group__3 ;
+    public final void rule__EnumerationTypeDefinition__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34318:1: ( rule__EnumerationTypeDefinition__Group__2__Impl rule__EnumerationTypeDefinition__Group__3 )
+            // InternalFormalML.g:34319:2: rule__EnumerationTypeDefinition__Group__2__Impl rule__EnumerationTypeDefinition__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__EnumerationTypeDefinition__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__2"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__2__Impl"
+    // InternalFormalML.g:34326:1: rule__EnumerationTypeDefinition__Group__2__Impl : ( 'type' ) ;
+    public final void rule__EnumerationTypeDefinition__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34330:1: ( ( 'type' ) )
+            // InternalFormalML.g:34331:1: ( 'type' )
+            {
+            // InternalFormalML.g:34331:1: ( 'type' )
+            // InternalFormalML.g:34332:2: 'type'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+            match(input,229,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__3"
+    // InternalFormalML.g:34341:1: rule__EnumerationTypeDefinition__Group__3 : rule__EnumerationTypeDefinition__Group__3__Impl rule__EnumerationTypeDefinition__Group__4 ;
+    public final void rule__EnumerationTypeDefinition__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34345:1: ( rule__EnumerationTypeDefinition__Group__3__Impl rule__EnumerationTypeDefinition__Group__4 )
+            // InternalFormalML.g:34346:2: rule__EnumerationTypeDefinition__Group__3__Impl rule__EnumerationTypeDefinition__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_159);
+            rule__EnumerationTypeDefinition__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__3"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__3__Impl"
+    // InternalFormalML.g:34353:1: rule__EnumerationTypeDefinition__Group__3__Impl : ( ( rule__EnumerationTypeDefinition__NameAssignment_3 ) ) ;
+    public final void rule__EnumerationTypeDefinition__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34357:1: ( ( ( rule__EnumerationTypeDefinition__NameAssignment_3 ) ) )
+            // InternalFormalML.g:34358:1: ( ( rule__EnumerationTypeDefinition__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:34358:1: ( ( rule__EnumerationTypeDefinition__NameAssignment_3 ) )
+            // InternalFormalML.g:34359:2: ( rule__EnumerationTypeDefinition__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:34360:2: ( rule__EnumerationTypeDefinition__NameAssignment_3 )
+            // InternalFormalML.g:34360:3: rule__EnumerationTypeDefinition__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__4"
+    // InternalFormalML.g:34368:1: rule__EnumerationTypeDefinition__Group__4 : rule__EnumerationTypeDefinition__Group__4__Impl rule__EnumerationTypeDefinition__Group__5 ;
+    public final void rule__EnumerationTypeDefinition__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34372:1: ( rule__EnumerationTypeDefinition__Group__4__Impl rule__EnumerationTypeDefinition__Group__5 )
+            // InternalFormalML.g:34373:2: rule__EnumerationTypeDefinition__Group__4__Impl rule__EnumerationTypeDefinition__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_159);
+            rule__EnumerationTypeDefinition__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__4"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__4__Impl"
+    // InternalFormalML.g:34380:1: rule__EnumerationTypeDefinition__Group__4__Impl : ( ( rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__EnumerationTypeDefinition__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34384:1: ( ( ( rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:34385:1: ( ( rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:34385:1: ( ( rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:34386:2: ( rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:34387:2: ( rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4 )?
+            int alt489=2;
+            int LA489_0 = input.LA(1);
+
+            if ( (LA489_0==RULE_STRING) ) {
+                alt489=1;
+            }
+            switch (alt489) {
+                case 1 :
+                    // InternalFormalML.g:34387:3: rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__5"
+    // InternalFormalML.g:34395:1: rule__EnumerationTypeDefinition__Group__5 : rule__EnumerationTypeDefinition__Group__5__Impl rule__EnumerationTypeDefinition__Group__6 ;
+    public final void rule__EnumerationTypeDefinition__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34399:1: ( rule__EnumerationTypeDefinition__Group__5__Impl rule__EnumerationTypeDefinition__Group__6 )
+            // InternalFormalML.g:34400:2: rule__EnumerationTypeDefinition__Group__5__Impl rule__EnumerationTypeDefinition__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__EnumerationTypeDefinition__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__5"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__5__Impl"
+    // InternalFormalML.g:34407:1: rule__EnumerationTypeDefinition__Group__5__Impl : ( ( rule__EnumerationTypeDefinition__TypedefAssignment_5 ) ) ;
+    public final void rule__EnumerationTypeDefinition__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34411:1: ( ( ( rule__EnumerationTypeDefinition__TypedefAssignment_5 ) ) )
+            // InternalFormalML.g:34412:1: ( ( rule__EnumerationTypeDefinition__TypedefAssignment_5 ) )
+            {
+            // InternalFormalML.g:34412:1: ( ( rule__EnumerationTypeDefinition__TypedefAssignment_5 ) )
+            // InternalFormalML.g:34413:2: ( rule__EnumerationTypeDefinition__TypedefAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefAssignment_5()); 
+            }
+            // InternalFormalML.g:34414:2: ( rule__EnumerationTypeDefinition__TypedefAssignment_5 )
+            // InternalFormalML.g:34414:3: rule__EnumerationTypeDefinition__TypedefAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__TypedefAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__5__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__6"
+    // InternalFormalML.g:34422:1: rule__EnumerationTypeDefinition__Group__6 : rule__EnumerationTypeDefinition__Group__6__Impl rule__EnumerationTypeDefinition__Group__7 ;
+    public final void rule__EnumerationTypeDefinition__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34426:1: ( rule__EnumerationTypeDefinition__Group__6__Impl rule__EnumerationTypeDefinition__Group__7 )
+            // InternalFormalML.g:34427:2: rule__EnumerationTypeDefinition__Group__6__Impl rule__EnumerationTypeDefinition__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__EnumerationTypeDefinition__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__6"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__6__Impl"
+    // InternalFormalML.g:34434:1: rule__EnumerationTypeDefinition__Group__6__Impl : ( '{' ) ;
+    public final void rule__EnumerationTypeDefinition__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34438:1: ( ( '{' ) )
+            // InternalFormalML.g:34439:1: ( '{' )
+            {
+            // InternalFormalML.g:34439:1: ( '{' )
+            // InternalFormalML.g:34440:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__6__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__7"
+    // InternalFormalML.g:34449:1: rule__EnumerationTypeDefinition__Group__7 : rule__EnumerationTypeDefinition__Group__7__Impl rule__EnumerationTypeDefinition__Group__8 ;
+    public final void rule__EnumerationTypeDefinition__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34453:1: ( rule__EnumerationTypeDefinition__Group__7__Impl rule__EnumerationTypeDefinition__Group__8 )
+            // InternalFormalML.g:34454:2: rule__EnumerationTypeDefinition__Group__7__Impl rule__EnumerationTypeDefinition__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_158);
+            rule__EnumerationTypeDefinition__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__7"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__7__Impl"
+    // InternalFormalML.g:34461:1: rule__EnumerationTypeDefinition__Group__7__Impl : ( ( rule__EnumerationTypeDefinition__LiteralAssignment_7 ) ) ;
+    public final void rule__EnumerationTypeDefinition__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34465:1: ( ( ( rule__EnumerationTypeDefinition__LiteralAssignment_7 ) ) )
+            // InternalFormalML.g:34466:1: ( ( rule__EnumerationTypeDefinition__LiteralAssignment_7 ) )
+            {
+            // InternalFormalML.g:34466:1: ( ( rule__EnumerationTypeDefinition__LiteralAssignment_7 ) )
+            // InternalFormalML.g:34467:2: ( rule__EnumerationTypeDefinition__LiteralAssignment_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_7()); 
+            }
+            // InternalFormalML.g:34468:2: ( rule__EnumerationTypeDefinition__LiteralAssignment_7 )
+            // InternalFormalML.g:34468:3: rule__EnumerationTypeDefinition__LiteralAssignment_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__LiteralAssignment_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__7__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__8"
+    // InternalFormalML.g:34476:1: rule__EnumerationTypeDefinition__Group__8 : rule__EnumerationTypeDefinition__Group__8__Impl rule__EnumerationTypeDefinition__Group__9 ;
+    public final void rule__EnumerationTypeDefinition__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34480:1: ( rule__EnumerationTypeDefinition__Group__8__Impl rule__EnumerationTypeDefinition__Group__9 )
+            // InternalFormalML.g:34481:2: rule__EnumerationTypeDefinition__Group__8__Impl rule__EnumerationTypeDefinition__Group__9
+            {
+            pushFollow(FollowSets000.FOLLOW_158);
+            rule__EnumerationTypeDefinition__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__8"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__8__Impl"
+    // InternalFormalML.g:34488:1: rule__EnumerationTypeDefinition__Group__8__Impl : ( ( rule__EnumerationTypeDefinition__Group_8__0 )* ) ;
+    public final void rule__EnumerationTypeDefinition__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34492:1: ( ( ( rule__EnumerationTypeDefinition__Group_8__0 )* ) )
+            // InternalFormalML.g:34493:1: ( ( rule__EnumerationTypeDefinition__Group_8__0 )* )
+            {
+            // InternalFormalML.g:34493:1: ( ( rule__EnumerationTypeDefinition__Group_8__0 )* )
+            // InternalFormalML.g:34494:2: ( rule__EnumerationTypeDefinition__Group_8__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup_8()); 
+            }
+            // InternalFormalML.g:34495:2: ( rule__EnumerationTypeDefinition__Group_8__0 )*
+            loop490:
+            do {
+                int alt490=2;
+                int LA490_0 = input.LA(1);
+
+                if ( (LA490_0==198) ) {
+                    alt490=1;
+                }
+
+
+                switch (alt490) {
+            	case 1 :
+            	    // InternalFormalML.g:34495:3: rule__EnumerationTypeDefinition__Group_8__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__EnumerationTypeDefinition__Group_8__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop490;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getGroup_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__8__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__9"
+    // InternalFormalML.g:34503:1: rule__EnumerationTypeDefinition__Group__9 : rule__EnumerationTypeDefinition__Group__9__Impl ;
+    public final void rule__EnumerationTypeDefinition__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34507:1: ( rule__EnumerationTypeDefinition__Group__9__Impl )
+            // InternalFormalML.g:34508:2: rule__EnumerationTypeDefinition__Group__9__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__9"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group__9__Impl"
+    // InternalFormalML.g:34514:1: rule__EnumerationTypeDefinition__Group__9__Impl : ( '}' ) ;
+    public final void rule__EnumerationTypeDefinition__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34518:1: ( ( '}' ) )
+            // InternalFormalML.g:34519:1: ( '}' )
+            {
+            // InternalFormalML.g:34519:1: ( '}' )
+            // InternalFormalML.g:34520:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getRightCurlyBracketKeyword_9()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getRightCurlyBracketKeyword_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group__9__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group_8__0"
+    // InternalFormalML.g:34530:1: rule__EnumerationTypeDefinition__Group_8__0 : rule__EnumerationTypeDefinition__Group_8__0__Impl rule__EnumerationTypeDefinition__Group_8__1 ;
+    public final void rule__EnumerationTypeDefinition__Group_8__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34534:1: ( rule__EnumerationTypeDefinition__Group_8__0__Impl rule__EnumerationTypeDefinition__Group_8__1 )
+            // InternalFormalML.g:34535:2: rule__EnumerationTypeDefinition__Group_8__0__Impl rule__EnumerationTypeDefinition__Group_8__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__EnumerationTypeDefinition__Group_8__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group_8__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group_8__0"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group_8__0__Impl"
+    // InternalFormalML.g:34542:1: rule__EnumerationTypeDefinition__Group_8__0__Impl : ( ',' ) ;
+    public final void rule__EnumerationTypeDefinition__Group_8__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34546:1: ( ( ',' ) )
+            // InternalFormalML.g:34547:1: ( ',' )
+            {
+            // InternalFormalML.g:34547:1: ( ',' )
+            // InternalFormalML.g:34548:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getCommaKeyword_8_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getCommaKeyword_8_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group_8__0__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group_8__1"
+    // InternalFormalML.g:34557:1: rule__EnumerationTypeDefinition__Group_8__1 : rule__EnumerationTypeDefinition__Group_8__1__Impl ;
+    public final void rule__EnumerationTypeDefinition__Group_8__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34561:1: ( rule__EnumerationTypeDefinition__Group_8__1__Impl )
+            // InternalFormalML.g:34562:2: rule__EnumerationTypeDefinition__Group_8__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__Group_8__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group_8__1"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__Group_8__1__Impl"
+    // InternalFormalML.g:34568:1: rule__EnumerationTypeDefinition__Group_8__1__Impl : ( ( rule__EnumerationTypeDefinition__LiteralAssignment_8_1 ) ) ;
+    public final void rule__EnumerationTypeDefinition__Group_8__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34572:1: ( ( ( rule__EnumerationTypeDefinition__LiteralAssignment_8_1 ) ) )
+            // InternalFormalML.g:34573:1: ( ( rule__EnumerationTypeDefinition__LiteralAssignment_8_1 ) )
+            {
+            // InternalFormalML.g:34573:1: ( ( rule__EnumerationTypeDefinition__LiteralAssignment_8_1 ) )
+            // InternalFormalML.g:34574:2: ( rule__EnumerationTypeDefinition__LiteralAssignment_8_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_8_1()); 
+            }
+            // InternalFormalML.g:34575:2: ( rule__EnumerationTypeDefinition__LiteralAssignment_8_1 )
+            // InternalFormalML.g:34575:3: rule__EnumerationTypeDefinition__LiteralAssignment_8_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinition__LiteralAssignment_8_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralAssignment_8_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__Group_8__1__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__0"
+    // InternalFormalML.g:34584:1: rule__EnumerationTypeDefinitionImpl__Group__0 : rule__EnumerationTypeDefinitionImpl__Group__0__Impl rule__EnumerationTypeDefinitionImpl__Group__1 ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34588:1: ( rule__EnumerationTypeDefinitionImpl__Group__0__Impl rule__EnumerationTypeDefinitionImpl__Group__1 )
+            // InternalFormalML.g:34589:2: rule__EnumerationTypeDefinitionImpl__Group__0__Impl rule__EnumerationTypeDefinitionImpl__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__EnumerationTypeDefinitionImpl__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__0"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__0__Impl"
+    // InternalFormalML.g:34596:1: rule__EnumerationTypeDefinitionImpl__Group__0__Impl : ( () ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34600:1: ( ( () ) )
+            // InternalFormalML.g:34601:1: ( () )
+            {
+            // InternalFormalML.g:34601:1: ( () )
+            // InternalFormalML.g:34602:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getEnumerationTypeAction_0()); 
+            }
+            // InternalFormalML.g:34603:2: ()
+            // InternalFormalML.g:34603:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getEnumerationTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__1"
+    // InternalFormalML.g:34611:1: rule__EnumerationTypeDefinitionImpl__Group__1 : rule__EnumerationTypeDefinitionImpl__Group__1__Impl rule__EnumerationTypeDefinitionImpl__Group__2 ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34615:1: ( rule__EnumerationTypeDefinitionImpl__Group__1__Impl rule__EnumerationTypeDefinitionImpl__Group__2 )
+            // InternalFormalML.g:34616:2: rule__EnumerationTypeDefinitionImpl__Group__1__Impl rule__EnumerationTypeDefinitionImpl__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_159);
+            rule__EnumerationTypeDefinitionImpl__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__1"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__1__Impl"
+    // InternalFormalML.g:34623:1: rule__EnumerationTypeDefinitionImpl__Group__1__Impl : ( ( rule__EnumerationTypeDefinitionImpl__NameAssignment_1 ) ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34627:1: ( ( ( rule__EnumerationTypeDefinitionImpl__NameAssignment_1 ) ) )
+            // InternalFormalML.g:34628:1: ( ( rule__EnumerationTypeDefinitionImpl__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:34628:1: ( ( rule__EnumerationTypeDefinitionImpl__NameAssignment_1 ) )
+            // InternalFormalML.g:34629:2: ( rule__EnumerationTypeDefinitionImpl__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:34630:2: ( rule__EnumerationTypeDefinitionImpl__NameAssignment_1 )
+            // InternalFormalML.g:34630:3: rule__EnumerationTypeDefinitionImpl__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__2"
+    // InternalFormalML.g:34638:1: rule__EnumerationTypeDefinitionImpl__Group__2 : rule__EnumerationTypeDefinitionImpl__Group__2__Impl rule__EnumerationTypeDefinitionImpl__Group__3 ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34642:1: ( rule__EnumerationTypeDefinitionImpl__Group__2__Impl rule__EnumerationTypeDefinitionImpl__Group__3 )
+            // InternalFormalML.g:34643:2: rule__EnumerationTypeDefinitionImpl__Group__2__Impl rule__EnumerationTypeDefinitionImpl__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_159);
+            rule__EnumerationTypeDefinitionImpl__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__2"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__2__Impl"
+    // InternalFormalML.g:34650:1: rule__EnumerationTypeDefinitionImpl__Group__2__Impl : ( ( rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34654:1: ( ( ( rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:34655:1: ( ( rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:34655:1: ( ( rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:34656:2: ( rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:34657:2: ( rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            int alt491=2;
+            int LA491_0 = input.LA(1);
+
+            if ( (LA491_0==RULE_STRING) ) {
+                alt491=1;
+            }
+            switch (alt491) {
+                case 1 :
+                    // InternalFormalML.g:34657:3: rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__3"
+    // InternalFormalML.g:34665:1: rule__EnumerationTypeDefinitionImpl__Group__3 : rule__EnumerationTypeDefinitionImpl__Group__3__Impl rule__EnumerationTypeDefinitionImpl__Group__4 ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34669:1: ( rule__EnumerationTypeDefinitionImpl__Group__3__Impl rule__EnumerationTypeDefinitionImpl__Group__4 )
+            // InternalFormalML.g:34670:2: rule__EnumerationTypeDefinitionImpl__Group__3__Impl rule__EnumerationTypeDefinitionImpl__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__EnumerationTypeDefinitionImpl__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__3"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__3__Impl"
+    // InternalFormalML.g:34677:1: rule__EnumerationTypeDefinitionImpl__Group__3__Impl : ( ( rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3 ) ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34681:1: ( ( ( rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3 ) ) )
+            // InternalFormalML.g:34682:1: ( ( rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3 ) )
+            {
+            // InternalFormalML.g:34682:1: ( ( rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3 ) )
+            // InternalFormalML.g:34683:2: ( rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefAssignment_3()); 
+            }
+            // InternalFormalML.g:34684:2: ( rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3 )
+            // InternalFormalML.g:34684:3: rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__4"
+    // InternalFormalML.g:34692:1: rule__EnumerationTypeDefinitionImpl__Group__4 : rule__EnumerationTypeDefinitionImpl__Group__4__Impl rule__EnumerationTypeDefinitionImpl__Group__5 ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34696:1: ( rule__EnumerationTypeDefinitionImpl__Group__4__Impl rule__EnumerationTypeDefinitionImpl__Group__5 )
+            // InternalFormalML.g:34697:2: rule__EnumerationTypeDefinitionImpl__Group__4__Impl rule__EnumerationTypeDefinitionImpl__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__EnumerationTypeDefinitionImpl__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__4"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__4__Impl"
+    // InternalFormalML.g:34704:1: rule__EnumerationTypeDefinitionImpl__Group__4__Impl : ( '{' ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34708:1: ( ( '{' ) )
+            // InternalFormalML.g:34709:1: ( '{' )
+            {
+            // InternalFormalML.g:34709:1: ( '{' )
+            // InternalFormalML.g:34710:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__5"
+    // InternalFormalML.g:34719:1: rule__EnumerationTypeDefinitionImpl__Group__5 : rule__EnumerationTypeDefinitionImpl__Group__5__Impl rule__EnumerationTypeDefinitionImpl__Group__6 ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34723:1: ( rule__EnumerationTypeDefinitionImpl__Group__5__Impl rule__EnumerationTypeDefinitionImpl__Group__6 )
+            // InternalFormalML.g:34724:2: rule__EnumerationTypeDefinitionImpl__Group__5__Impl rule__EnumerationTypeDefinitionImpl__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_158);
+            rule__EnumerationTypeDefinitionImpl__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__5"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__5__Impl"
+    // InternalFormalML.g:34731:1: rule__EnumerationTypeDefinitionImpl__Group__5__Impl : ( ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5 ) ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34735:1: ( ( ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5 ) ) )
+            // InternalFormalML.g:34736:1: ( ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5 ) )
+            {
+            // InternalFormalML.g:34736:1: ( ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5 ) )
+            // InternalFormalML.g:34737:2: ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_5()); 
+            }
+            // InternalFormalML.g:34738:2: ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5 )
+            // InternalFormalML.g:34738:3: rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__5__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__6"
+    // InternalFormalML.g:34746:1: rule__EnumerationTypeDefinitionImpl__Group__6 : rule__EnumerationTypeDefinitionImpl__Group__6__Impl rule__EnumerationTypeDefinitionImpl__Group__7 ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34750:1: ( rule__EnumerationTypeDefinitionImpl__Group__6__Impl rule__EnumerationTypeDefinitionImpl__Group__7 )
+            // InternalFormalML.g:34751:2: rule__EnumerationTypeDefinitionImpl__Group__6__Impl rule__EnumerationTypeDefinitionImpl__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_158);
+            rule__EnumerationTypeDefinitionImpl__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__6"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__6__Impl"
+    // InternalFormalML.g:34758:1: rule__EnumerationTypeDefinitionImpl__Group__6__Impl : ( ( rule__EnumerationTypeDefinitionImpl__Group_6__0 )* ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34762:1: ( ( ( rule__EnumerationTypeDefinitionImpl__Group_6__0 )* ) )
+            // InternalFormalML.g:34763:1: ( ( rule__EnumerationTypeDefinitionImpl__Group_6__0 )* )
+            {
+            // InternalFormalML.g:34763:1: ( ( rule__EnumerationTypeDefinitionImpl__Group_6__0 )* )
+            // InternalFormalML.g:34764:2: ( rule__EnumerationTypeDefinitionImpl__Group_6__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup_6()); 
+            }
+            // InternalFormalML.g:34765:2: ( rule__EnumerationTypeDefinitionImpl__Group_6__0 )*
+            loop492:
+            do {
+                int alt492=2;
+                int LA492_0 = input.LA(1);
+
+                if ( (LA492_0==198) ) {
+                    alt492=1;
+                }
+
+
+                switch (alt492) {
+            	case 1 :
+            	    // InternalFormalML.g:34765:3: rule__EnumerationTypeDefinitionImpl__Group_6__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__EnumerationTypeDefinitionImpl__Group_6__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop492;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__6__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__7"
+    // InternalFormalML.g:34773:1: rule__EnumerationTypeDefinitionImpl__Group__7 : rule__EnumerationTypeDefinitionImpl__Group__7__Impl ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34777:1: ( rule__EnumerationTypeDefinitionImpl__Group__7__Impl )
+            // InternalFormalML.g:34778:2: rule__EnumerationTypeDefinitionImpl__Group__7__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__7"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group__7__Impl"
+    // InternalFormalML.g:34784:1: rule__EnumerationTypeDefinitionImpl__Group__7__Impl : ( '}' ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34788:1: ( ( '}' ) )
+            // InternalFormalML.g:34789:1: ( '}' )
+            {
+            // InternalFormalML.g:34789:1: ( '}' )
+            // InternalFormalML.g:34790:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getRightCurlyBracketKeyword_7()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getRightCurlyBracketKeyword_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group__7__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group_6__0"
+    // InternalFormalML.g:34800:1: rule__EnumerationTypeDefinitionImpl__Group_6__0 : rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl rule__EnumerationTypeDefinitionImpl__Group_6__1 ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34804:1: ( rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl rule__EnumerationTypeDefinitionImpl__Group_6__1 )
+            // InternalFormalML.g:34805:2: rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl rule__EnumerationTypeDefinitionImpl__Group_6__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group_6__0"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl"
+    // InternalFormalML.g:34812:1: rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl : ( ',' ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34816:1: ( ( ',' ) )
+            // InternalFormalML.g:34817:1: ( ',' )
+            {
+            // InternalFormalML.g:34817:1: ( ',' )
+            // InternalFormalML.g:34818:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getCommaKeyword_6_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getCommaKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group_6__1"
+    // InternalFormalML.g:34827:1: rule__EnumerationTypeDefinitionImpl__Group_6__1 : rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34831:1: ( rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl )
+            // InternalFormalML.g:34832:2: rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group_6__1"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl"
+    // InternalFormalML.g:34838:1: rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl : ( ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1 ) ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34842:1: ( ( ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1 ) ) )
+            // InternalFormalML.g:34843:1: ( ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1 ) )
+            {
+            // InternalFormalML.g:34843:1: ( ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1 ) )
+            // InternalFormalML.g:34844:2: ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_6_1()); 
+            }
+            // InternalFormalML.g:34845:2: ( rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1 )
+            // InternalFormalML.g:34845:3: rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralAssignment_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group__0"
+    // InternalFormalML.g:34854:1: rule__EnumerationLiteral__Group__0 : rule__EnumerationLiteral__Group__0__Impl rule__EnumerationLiteral__Group__1 ;
+    public final void rule__EnumerationLiteral__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34858:1: ( rule__EnumerationLiteral__Group__0__Impl rule__EnumerationLiteral__Group__1 )
+            // InternalFormalML.g:34859:2: rule__EnumerationLiteral__Group__0__Impl rule__EnumerationLiteral__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_160);
+            rule__EnumerationLiteral__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationLiteral__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group__0"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group__0__Impl"
+    // InternalFormalML.g:34866:1: rule__EnumerationLiteral__Group__0__Impl : ( ( rule__EnumerationLiteral__NameAssignment_0 ) ) ;
+    public final void rule__EnumerationLiteral__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34870:1: ( ( ( rule__EnumerationLiteral__NameAssignment_0 ) ) )
+            // InternalFormalML.g:34871:1: ( ( rule__EnumerationLiteral__NameAssignment_0 ) )
+            {
+            // InternalFormalML.g:34871:1: ( ( rule__EnumerationLiteral__NameAssignment_0 ) )
+            // InternalFormalML.g:34872:2: ( rule__EnumerationLiteral__NameAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralAccess().getNameAssignment_0()); 
+            }
+            // InternalFormalML.g:34873:2: ( rule__EnumerationLiteral__NameAssignment_0 )
+            // InternalFormalML.g:34873:3: rule__EnumerationLiteral__NameAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationLiteral__NameAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralAccess().getNameAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group__1"
+    // InternalFormalML.g:34881:1: rule__EnumerationLiteral__Group__1 : rule__EnumerationLiteral__Group__1__Impl rule__EnumerationLiteral__Group__2 ;
+    public final void rule__EnumerationLiteral__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34885:1: ( rule__EnumerationLiteral__Group__1__Impl rule__EnumerationLiteral__Group__2 )
+            // InternalFormalML.g:34886:2: rule__EnumerationLiteral__Group__1__Impl rule__EnumerationLiteral__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_160);
+            rule__EnumerationLiteral__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationLiteral__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group__1"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group__1__Impl"
+    // InternalFormalML.g:34893:1: rule__EnumerationLiteral__Group__1__Impl : ( ( rule__EnumerationLiteral__UnrestrictedNameAssignment_1 )? ) ;
+    public final void rule__EnumerationLiteral__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34897:1: ( ( ( rule__EnumerationLiteral__UnrestrictedNameAssignment_1 )? ) )
+            // InternalFormalML.g:34898:1: ( ( rule__EnumerationLiteral__UnrestrictedNameAssignment_1 )? )
+            {
+            // InternalFormalML.g:34898:1: ( ( rule__EnumerationLiteral__UnrestrictedNameAssignment_1 )? )
+            // InternalFormalML.g:34899:2: ( rule__EnumerationLiteral__UnrestrictedNameAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameAssignment_1()); 
+            }
+            // InternalFormalML.g:34900:2: ( rule__EnumerationLiteral__UnrestrictedNameAssignment_1 )?
+            int alt493=2;
+            int LA493_0 = input.LA(1);
+
+            if ( (LA493_0==RULE_STRING) ) {
+                alt493=1;
+            }
+            switch (alt493) {
+                case 1 :
+                    // InternalFormalML.g:34900:3: rule__EnumerationLiteral__UnrestrictedNameAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__EnumerationLiteral__UnrestrictedNameAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group__2"
+    // InternalFormalML.g:34908:1: rule__EnumerationLiteral__Group__2 : rule__EnumerationLiteral__Group__2__Impl ;
+    public final void rule__EnumerationLiteral__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34912:1: ( rule__EnumerationLiteral__Group__2__Impl )
+            // InternalFormalML.g:34913:2: rule__EnumerationLiteral__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationLiteral__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group__2"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group__2__Impl"
+    // InternalFormalML.g:34919:1: rule__EnumerationLiteral__Group__2__Impl : ( ( rule__EnumerationLiteral__Group_2__0 )? ) ;
+    public final void rule__EnumerationLiteral__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34923:1: ( ( ( rule__EnumerationLiteral__Group_2__0 )? ) )
+            // InternalFormalML.g:34924:1: ( ( rule__EnumerationLiteral__Group_2__0 )? )
+            {
+            // InternalFormalML.g:34924:1: ( ( rule__EnumerationLiteral__Group_2__0 )? )
+            // InternalFormalML.g:34925:2: ( rule__EnumerationLiteral__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:34926:2: ( rule__EnumerationLiteral__Group_2__0 )?
+            int alt494=2;
+            int LA494_0 = input.LA(1);
+
+            if ( (LA494_0==100) ) {
+                alt494=1;
+            }
+            switch (alt494) {
+                case 1 :
+                    // InternalFormalML.g:34926:3: rule__EnumerationLiteral__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__EnumerationLiteral__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group_2__0"
+    // InternalFormalML.g:34935:1: rule__EnumerationLiteral__Group_2__0 : rule__EnumerationLiteral__Group_2__0__Impl rule__EnumerationLiteral__Group_2__1 ;
+    public final void rule__EnumerationLiteral__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34939:1: ( rule__EnumerationLiteral__Group_2__0__Impl rule__EnumerationLiteral__Group_2__1 )
+            // InternalFormalML.g:34940:2: rule__EnumerationLiteral__Group_2__0__Impl rule__EnumerationLiteral__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_161);
+            rule__EnumerationLiteral__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationLiteral__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group_2__0"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group_2__0__Impl"
+    // InternalFormalML.g:34947:1: rule__EnumerationLiteral__Group_2__0__Impl : ( '=' ) ;
+    public final void rule__EnumerationLiteral__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34951:1: ( ( '=' ) )
+            // InternalFormalML.g:34952:1: ( '=' )
+            {
+            // InternalFormalML.g:34952:1: ( '=' )
+            // InternalFormalML.g:34953:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralAccess().getEqualsSignKeyword_2_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralAccess().getEqualsSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group_2__1"
+    // InternalFormalML.g:34962:1: rule__EnumerationLiteral__Group_2__1 : rule__EnumerationLiteral__Group_2__1__Impl ;
+    public final void rule__EnumerationLiteral__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34966:1: ( rule__EnumerationLiteral__Group_2__1__Impl )
+            // InternalFormalML.g:34967:2: rule__EnumerationLiteral__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationLiteral__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group_2__1"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__Group_2__1__Impl"
+    // InternalFormalML.g:34973:1: rule__EnumerationLiteral__Group_2__1__Impl : ( ( rule__EnumerationLiteral__ValueAssignment_2_1 ) ) ;
+    public final void rule__EnumerationLiteral__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34977:1: ( ( ( rule__EnumerationLiteral__ValueAssignment_2_1 ) ) )
+            // InternalFormalML.g:34978:1: ( ( rule__EnumerationLiteral__ValueAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:34978:1: ( ( rule__EnumerationLiteral__ValueAssignment_2_1 ) )
+            // InternalFormalML.g:34979:2: ( rule__EnumerationLiteral__ValueAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralAccess().getValueAssignment_2_1()); 
+            }
+            // InternalFormalML.g:34980:2: ( rule__EnumerationLiteral__ValueAssignment_2_1 )
+            // InternalFormalML.g:34980:3: rule__EnumerationLiteral__ValueAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EnumerationLiteral__ValueAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralAccess().getValueAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__StructureType__Group__0"
+    // InternalFormalML.g:34989:1: rule__StructureType__Group__0 : rule__StructureType__Group__0__Impl rule__StructureType__Group__1 ;
+    public final void rule__StructureType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:34993:1: ( rule__StructureType__Group__0__Impl rule__StructureType__Group__1 )
+            // InternalFormalML.g:34994:2: rule__StructureType__Group__0__Impl rule__StructureType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_162);
+            rule__StructureType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__0"
+
+
+    // $ANTLR start "rule__StructureType__Group__0__Impl"
+    // InternalFormalML.g:35001:1: rule__StructureType__Group__0__Impl : ( () ) ;
+    public final void rule__StructureType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35005:1: ( ( () ) )
+            // InternalFormalML.g:35006:1: ( () )
+            {
+            // InternalFormalML.g:35006:1: ( () )
+            // InternalFormalML.g:35007:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeAccess().getStructureTypeAction_0()); 
+            }
+            // InternalFormalML.g:35008:2: ()
+            // InternalFormalML.g:35008:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeAccess().getStructureTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__StructureType__Group__1"
+    // InternalFormalML.g:35016:1: rule__StructureType__Group__1 : rule__StructureType__Group__1__Impl rule__StructureType__Group__2 ;
+    public final void rule__StructureType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35020:1: ( rule__StructureType__Group__1__Impl rule__StructureType__Group__2 )
+            // InternalFormalML.g:35021:2: rule__StructureType__Group__1__Impl rule__StructureType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__StructureType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__1"
+
+
+    // $ANTLR start "rule__StructureType__Group__1__Impl"
+    // InternalFormalML.g:35028:1: rule__StructureType__Group__1__Impl : ( 'struct' ) ;
+    public final void rule__StructureType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35032:1: ( ( 'struct' ) )
+            // InternalFormalML.g:35033:1: ( 'struct' )
+            {
+            // InternalFormalML.g:35033:1: ( 'struct' )
+            // InternalFormalML.g:35034:2: 'struct'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeAccess().getStructKeyword_1()); 
+            }
+            match(input,236,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeAccess().getStructKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__StructureType__Group__2"
+    // InternalFormalML.g:35043:1: rule__StructureType__Group__2 : rule__StructureType__Group__2__Impl rule__StructureType__Group__3 ;
+    public final void rule__StructureType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35047:1: ( rule__StructureType__Group__2__Impl rule__StructureType__Group__3 )
+            // InternalFormalML.g:35048:2: rule__StructureType__Group__2__Impl rule__StructureType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__StructureType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__2"
+
+
+    // $ANTLR start "rule__StructureType__Group__2__Impl"
+    // InternalFormalML.g:35055:1: rule__StructureType__Group__2__Impl : ( '{' ) ;
+    public final void rule__StructureType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35059:1: ( ( '{' ) )
+            // InternalFormalML.g:35060:1: ( '{' )
+            {
+            // InternalFormalML.g:35060:1: ( '{' )
+            // InternalFormalML.g:35061:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__StructureType__Group__3"
+    // InternalFormalML.g:35070:1: rule__StructureType__Group__3 : rule__StructureType__Group__3__Impl rule__StructureType__Group__4 ;
+    public final void rule__StructureType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35074:1: ( rule__StructureType__Group__3__Impl rule__StructureType__Group__4 )
+            // InternalFormalML.g:35075:2: rule__StructureType__Group__3__Impl rule__StructureType__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__StructureType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureType__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__3"
+
+
+    // $ANTLR start "rule__StructureType__Group__3__Impl"
+    // InternalFormalML.g:35082:1: rule__StructureType__Group__3__Impl : ( ( ( rule__StructureType__PropertyAssignment_3 ) ) ( ( rule__StructureType__PropertyAssignment_3 )* ) ) ;
+    public final void rule__StructureType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35086:1: ( ( ( ( rule__StructureType__PropertyAssignment_3 ) ) ( ( rule__StructureType__PropertyAssignment_3 )* ) ) )
+            // InternalFormalML.g:35087:1: ( ( ( rule__StructureType__PropertyAssignment_3 ) ) ( ( rule__StructureType__PropertyAssignment_3 )* ) )
+            {
+            // InternalFormalML.g:35087:1: ( ( ( rule__StructureType__PropertyAssignment_3 ) ) ( ( rule__StructureType__PropertyAssignment_3 )* ) )
+            // InternalFormalML.g:35088:2: ( ( rule__StructureType__PropertyAssignment_3 ) ) ( ( rule__StructureType__PropertyAssignment_3 )* )
+            {
+            // InternalFormalML.g:35088:2: ( ( rule__StructureType__PropertyAssignment_3 ) )
+            // InternalFormalML.g:35089:3: ( rule__StructureType__PropertyAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeAccess().getPropertyAssignment_3()); 
+            }
+            // InternalFormalML.g:35090:3: ( rule__StructureType__PropertyAssignment_3 )
+            // InternalFormalML.g:35090:4: rule__StructureType__PropertyAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_6);
+            rule__StructureType__PropertyAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeAccess().getPropertyAssignment_3()); 
+            }
+
+            }
+
+            // InternalFormalML.g:35093:2: ( ( rule__StructureType__PropertyAssignment_3 )* )
+            // InternalFormalML.g:35094:3: ( rule__StructureType__PropertyAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeAccess().getPropertyAssignment_3()); 
+            }
+            // InternalFormalML.g:35095:3: ( rule__StructureType__PropertyAssignment_3 )*
+            loop495:
+            do {
+                int alt495=2;
+                int LA495_0 = input.LA(1);
+
+                if ( (LA495_0==16||LA495_0==28||(LA495_0>=143 && LA495_0<=145)||LA495_0==179||LA495_0==224||(LA495_0>=278 && LA495_0<=283)) ) {
+                    alt495=1;
+                }
+
+
+                switch (alt495) {
+            	case 1 :
+            	    // InternalFormalML.g:35095:4: rule__StructureType__PropertyAssignment_3
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__StructureType__PropertyAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop495;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeAccess().getPropertyAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__StructureType__Group__4"
+    // InternalFormalML.g:35104:1: rule__StructureType__Group__4 : rule__StructureType__Group__4__Impl ;
+    public final void rule__StructureType__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35108:1: ( rule__StructureType__Group__4__Impl )
+            // InternalFormalML.g:35109:2: rule__StructureType__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureType__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__4"
+
+
+    // $ANTLR start "rule__StructureType__Group__4__Impl"
+    // InternalFormalML.g:35115:1: rule__StructureType__Group__4__Impl : ( '}' ) ;
+    public final void rule__StructureType__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35119:1: ( ( '}' ) )
+            // InternalFormalML.g:35120:1: ( '}' )
+            {
+            // InternalFormalML.g:35120:1: ( '}' )
+            // InternalFormalML.g:35121:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__Group__4__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__0"
+    // InternalFormalML.g:35131:1: rule__StructureTypeDefinition__Group__0 : rule__StructureTypeDefinition__Group__0__Impl rule__StructureTypeDefinition__Group__1 ;
+    public final void rule__StructureTypeDefinition__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35135:1: ( rule__StructureTypeDefinition__Group__0__Impl rule__StructureTypeDefinition__Group__1 )
+            // InternalFormalML.g:35136:2: rule__StructureTypeDefinition__Group__0__Impl rule__StructureTypeDefinition__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__StructureTypeDefinition__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__0"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__0__Impl"
+    // InternalFormalML.g:35143:1: rule__StructureTypeDefinition__Group__0__Impl : ( () ) ;
+    public final void rule__StructureTypeDefinition__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35147:1: ( ( () ) )
+            // InternalFormalML.g:35148:1: ( () )
+            {
+            // InternalFormalML.g:35148:1: ( () )
+            // InternalFormalML.g:35149:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getStructureTypeAction_0()); 
+            }
+            // InternalFormalML.g:35150:2: ()
+            // InternalFormalML.g:35150:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getStructureTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__0__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__1"
+    // InternalFormalML.g:35158:1: rule__StructureTypeDefinition__Group__1 : rule__StructureTypeDefinition__Group__1__Impl rule__StructureTypeDefinition__Group__2 ;
+    public final void rule__StructureTypeDefinition__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35162:1: ( rule__StructureTypeDefinition__Group__1__Impl rule__StructureTypeDefinition__Group__2 )
+            // InternalFormalML.g:35163:2: rule__StructureTypeDefinition__Group__1__Impl rule__StructureTypeDefinition__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__StructureTypeDefinition__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__1"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__1__Impl"
+    // InternalFormalML.g:35170:1: rule__StructureTypeDefinition__Group__1__Impl : ( ( rule__StructureTypeDefinition__VisibilityAssignment_1 )? ) ;
+    public final void rule__StructureTypeDefinition__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35174:1: ( ( ( rule__StructureTypeDefinition__VisibilityAssignment_1 )? ) )
+            // InternalFormalML.g:35175:1: ( ( rule__StructureTypeDefinition__VisibilityAssignment_1 )? )
+            {
+            // InternalFormalML.g:35175:1: ( ( rule__StructureTypeDefinition__VisibilityAssignment_1 )? )
+            // InternalFormalML.g:35176:2: ( rule__StructureTypeDefinition__VisibilityAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:35177:2: ( rule__StructureTypeDefinition__VisibilityAssignment_1 )?
+            int alt496=2;
+            int LA496_0 = input.LA(1);
+
+            if ( (LA496_0==28||(LA496_0>=143 && LA496_0<=145)) ) {
+                alt496=1;
+            }
+            switch (alt496) {
+                case 1 :
+                    // InternalFormalML.g:35177:3: rule__StructureTypeDefinition__VisibilityAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StructureTypeDefinition__VisibilityAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__1__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__2"
+    // InternalFormalML.g:35185:1: rule__StructureTypeDefinition__Group__2 : rule__StructureTypeDefinition__Group__2__Impl rule__StructureTypeDefinition__Group__3 ;
+    public final void rule__StructureTypeDefinition__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35189:1: ( rule__StructureTypeDefinition__Group__2__Impl rule__StructureTypeDefinition__Group__3 )
+            // InternalFormalML.g:35190:2: rule__StructureTypeDefinition__Group__2__Impl rule__StructureTypeDefinition__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__StructureTypeDefinition__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__2"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__2__Impl"
+    // InternalFormalML.g:35197:1: rule__StructureTypeDefinition__Group__2__Impl : ( 'type' ) ;
+    public final void rule__StructureTypeDefinition__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35201:1: ( ( 'type' ) )
+            // InternalFormalML.g:35202:1: ( 'type' )
+            {
+            // InternalFormalML.g:35202:1: ( 'type' )
+            // InternalFormalML.g:35203:2: 'type'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+            match(input,229,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__2__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__3"
+    // InternalFormalML.g:35212:1: rule__StructureTypeDefinition__Group__3 : rule__StructureTypeDefinition__Group__3__Impl rule__StructureTypeDefinition__Group__4 ;
+    public final void rule__StructureTypeDefinition__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35216:1: ( rule__StructureTypeDefinition__Group__3__Impl rule__StructureTypeDefinition__Group__4 )
+            // InternalFormalML.g:35217:2: rule__StructureTypeDefinition__Group__3__Impl rule__StructureTypeDefinition__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_163);
+            rule__StructureTypeDefinition__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__3"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__3__Impl"
+    // InternalFormalML.g:35224:1: rule__StructureTypeDefinition__Group__3__Impl : ( ( rule__StructureTypeDefinition__NameAssignment_3 ) ) ;
+    public final void rule__StructureTypeDefinition__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35228:1: ( ( ( rule__StructureTypeDefinition__NameAssignment_3 ) ) )
+            // InternalFormalML.g:35229:1: ( ( rule__StructureTypeDefinition__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:35229:1: ( ( rule__StructureTypeDefinition__NameAssignment_3 ) )
+            // InternalFormalML.g:35230:2: ( rule__StructureTypeDefinition__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:35231:2: ( rule__StructureTypeDefinition__NameAssignment_3 )
+            // InternalFormalML.g:35231:3: rule__StructureTypeDefinition__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__3__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__4"
+    // InternalFormalML.g:35239:1: rule__StructureTypeDefinition__Group__4 : rule__StructureTypeDefinition__Group__4__Impl rule__StructureTypeDefinition__Group__5 ;
+    public final void rule__StructureTypeDefinition__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35243:1: ( rule__StructureTypeDefinition__Group__4__Impl rule__StructureTypeDefinition__Group__5 )
+            // InternalFormalML.g:35244:2: rule__StructureTypeDefinition__Group__4__Impl rule__StructureTypeDefinition__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_163);
+            rule__StructureTypeDefinition__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__4"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__4__Impl"
+    // InternalFormalML.g:35251:1: rule__StructureTypeDefinition__Group__4__Impl : ( ( rule__StructureTypeDefinition__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__StructureTypeDefinition__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35255:1: ( ( ( rule__StructureTypeDefinition__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:35256:1: ( ( rule__StructureTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:35256:1: ( ( rule__StructureTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:35257:2: ( rule__StructureTypeDefinition__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:35258:2: ( rule__StructureTypeDefinition__UnrestrictedNameAssignment_4 )?
+            int alt497=2;
+            int LA497_0 = input.LA(1);
+
+            if ( (LA497_0==RULE_STRING) ) {
+                alt497=1;
+            }
+            switch (alt497) {
+                case 1 :
+                    // InternalFormalML.g:35258:3: rule__StructureTypeDefinition__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StructureTypeDefinition__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__4__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__5"
+    // InternalFormalML.g:35266:1: rule__StructureTypeDefinition__Group__5 : rule__StructureTypeDefinition__Group__5__Impl rule__StructureTypeDefinition__Group__6 ;
+    public final void rule__StructureTypeDefinition__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35270:1: ( rule__StructureTypeDefinition__Group__5__Impl rule__StructureTypeDefinition__Group__6 )
+            // InternalFormalML.g:35271:2: rule__StructureTypeDefinition__Group__5__Impl rule__StructureTypeDefinition__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__StructureTypeDefinition__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__5"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__5__Impl"
+    // InternalFormalML.g:35278:1: rule__StructureTypeDefinition__Group__5__Impl : ( ( rule__StructureTypeDefinition__TypedefAssignment_5 ) ) ;
+    public final void rule__StructureTypeDefinition__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35282:1: ( ( ( rule__StructureTypeDefinition__TypedefAssignment_5 ) ) )
+            // InternalFormalML.g:35283:1: ( ( rule__StructureTypeDefinition__TypedefAssignment_5 ) )
+            {
+            // InternalFormalML.g:35283:1: ( ( rule__StructureTypeDefinition__TypedefAssignment_5 ) )
+            // InternalFormalML.g:35284:2: ( rule__StructureTypeDefinition__TypedefAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getTypedefAssignment_5()); 
+            }
+            // InternalFormalML.g:35285:2: ( rule__StructureTypeDefinition__TypedefAssignment_5 )
+            // InternalFormalML.g:35285:3: rule__StructureTypeDefinition__TypedefAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__TypedefAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getTypedefAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__5__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__6"
+    // InternalFormalML.g:35293:1: rule__StructureTypeDefinition__Group__6 : rule__StructureTypeDefinition__Group__6__Impl rule__StructureTypeDefinition__Group__7 ;
+    public final void rule__StructureTypeDefinition__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35297:1: ( rule__StructureTypeDefinition__Group__6__Impl rule__StructureTypeDefinition__Group__7 )
+            // InternalFormalML.g:35298:2: rule__StructureTypeDefinition__Group__6__Impl rule__StructureTypeDefinition__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__StructureTypeDefinition__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__6"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__6__Impl"
+    // InternalFormalML.g:35305:1: rule__StructureTypeDefinition__Group__6__Impl : ( '{' ) ;
+    public final void rule__StructureTypeDefinition__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35309:1: ( ( '{' ) )
+            // InternalFormalML.g:35310:1: ( '{' )
+            {
+            // InternalFormalML.g:35310:1: ( '{' )
+            // InternalFormalML.g:35311:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__6__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__7"
+    // InternalFormalML.g:35320:1: rule__StructureTypeDefinition__Group__7 : rule__StructureTypeDefinition__Group__7__Impl rule__StructureTypeDefinition__Group__8 ;
+    public final void rule__StructureTypeDefinition__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35324:1: ( rule__StructureTypeDefinition__Group__7__Impl rule__StructureTypeDefinition__Group__8 )
+            // InternalFormalML.g:35325:2: rule__StructureTypeDefinition__Group__7__Impl rule__StructureTypeDefinition__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__StructureTypeDefinition__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__7"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__7__Impl"
+    // InternalFormalML.g:35332:1: rule__StructureTypeDefinition__Group__7__Impl : ( ( ( rule__StructureTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__StructureTypeDefinition__PropertyAssignment_7 )* ) ) ;
+    public final void rule__StructureTypeDefinition__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35336:1: ( ( ( ( rule__StructureTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__StructureTypeDefinition__PropertyAssignment_7 )* ) ) )
+            // InternalFormalML.g:35337:1: ( ( ( rule__StructureTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__StructureTypeDefinition__PropertyAssignment_7 )* ) )
+            {
+            // InternalFormalML.g:35337:1: ( ( ( rule__StructureTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__StructureTypeDefinition__PropertyAssignment_7 )* ) )
+            // InternalFormalML.g:35338:2: ( ( rule__StructureTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__StructureTypeDefinition__PropertyAssignment_7 )* )
+            {
+            // InternalFormalML.g:35338:2: ( ( rule__StructureTypeDefinition__PropertyAssignment_7 ) )
+            // InternalFormalML.g:35339:3: ( rule__StructureTypeDefinition__PropertyAssignment_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+            // InternalFormalML.g:35340:3: ( rule__StructureTypeDefinition__PropertyAssignment_7 )
+            // InternalFormalML.g:35340:4: rule__StructureTypeDefinition__PropertyAssignment_7
+            {
+            pushFollow(FollowSets000.FOLLOW_6);
+            rule__StructureTypeDefinition__PropertyAssignment_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+
+            }
+
+            // InternalFormalML.g:35343:2: ( ( rule__StructureTypeDefinition__PropertyAssignment_7 )* )
+            // InternalFormalML.g:35344:3: ( rule__StructureTypeDefinition__PropertyAssignment_7 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+            // InternalFormalML.g:35345:3: ( rule__StructureTypeDefinition__PropertyAssignment_7 )*
+            loop498:
+            do {
+                int alt498=2;
+                int LA498_0 = input.LA(1);
+
+                if ( (LA498_0==16||LA498_0==28||(LA498_0>=143 && LA498_0<=145)||LA498_0==179||LA498_0==224||(LA498_0>=278 && LA498_0<=283)) ) {
+                    alt498=1;
+                }
+
+
+                switch (alt498) {
+            	case 1 :
+            	    // InternalFormalML.g:35345:4: rule__StructureTypeDefinition__PropertyAssignment_7
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__StructureTypeDefinition__PropertyAssignment_7();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop498;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__7__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__8"
+    // InternalFormalML.g:35354:1: rule__StructureTypeDefinition__Group__8 : rule__StructureTypeDefinition__Group__8__Impl ;
+    public final void rule__StructureTypeDefinition__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35358:1: ( rule__StructureTypeDefinition__Group__8__Impl )
+            // InternalFormalML.g:35359:2: rule__StructureTypeDefinition__Group__8__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinition__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__8"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__Group__8__Impl"
+    // InternalFormalML.g:35365:1: rule__StructureTypeDefinition__Group__8__Impl : ( '}' ) ;
+    public final void rule__StructureTypeDefinition__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35369:1: ( ( '}' ) )
+            // InternalFormalML.g:35370:1: ( '}' )
+            {
+            // InternalFormalML.g:35370:1: ( '}' )
+            // InternalFormalML.g:35371:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__Group__8__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__0"
+    // InternalFormalML.g:35381:1: rule__StructureTypeDefinitionImpl__Group__0 : rule__StructureTypeDefinitionImpl__Group__0__Impl rule__StructureTypeDefinitionImpl__Group__1 ;
+    public final void rule__StructureTypeDefinitionImpl__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35385:1: ( rule__StructureTypeDefinitionImpl__Group__0__Impl rule__StructureTypeDefinitionImpl__Group__1 )
+            // InternalFormalML.g:35386:2: rule__StructureTypeDefinitionImpl__Group__0__Impl rule__StructureTypeDefinitionImpl__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__StructureTypeDefinitionImpl__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__0"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__0__Impl"
+    // InternalFormalML.g:35393:1: rule__StructureTypeDefinitionImpl__Group__0__Impl : ( () ) ;
+    public final void rule__StructureTypeDefinitionImpl__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35397:1: ( ( () ) )
+            // InternalFormalML.g:35398:1: ( () )
+            {
+            // InternalFormalML.g:35398:1: ( () )
+            // InternalFormalML.g:35399:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getStructureTypeAction_0()); 
+            }
+            // InternalFormalML.g:35400:2: ()
+            // InternalFormalML.g:35400:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getStructureTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__0__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__1"
+    // InternalFormalML.g:35408:1: rule__StructureTypeDefinitionImpl__Group__1 : rule__StructureTypeDefinitionImpl__Group__1__Impl rule__StructureTypeDefinitionImpl__Group__2 ;
+    public final void rule__StructureTypeDefinitionImpl__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35412:1: ( rule__StructureTypeDefinitionImpl__Group__1__Impl rule__StructureTypeDefinitionImpl__Group__2 )
+            // InternalFormalML.g:35413:2: rule__StructureTypeDefinitionImpl__Group__1__Impl rule__StructureTypeDefinitionImpl__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_163);
+            rule__StructureTypeDefinitionImpl__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__1"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__1__Impl"
+    // InternalFormalML.g:35420:1: rule__StructureTypeDefinitionImpl__Group__1__Impl : ( ( rule__StructureTypeDefinitionImpl__NameAssignment_1 ) ) ;
+    public final void rule__StructureTypeDefinitionImpl__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35424:1: ( ( ( rule__StructureTypeDefinitionImpl__NameAssignment_1 ) ) )
+            // InternalFormalML.g:35425:1: ( ( rule__StructureTypeDefinitionImpl__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:35425:1: ( ( rule__StructureTypeDefinitionImpl__NameAssignment_1 ) )
+            // InternalFormalML.g:35426:2: ( rule__StructureTypeDefinitionImpl__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:35427:2: ( rule__StructureTypeDefinitionImpl__NameAssignment_1 )
+            // InternalFormalML.g:35427:3: rule__StructureTypeDefinitionImpl__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__1__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__2"
+    // InternalFormalML.g:35435:1: rule__StructureTypeDefinitionImpl__Group__2 : rule__StructureTypeDefinitionImpl__Group__2__Impl rule__StructureTypeDefinitionImpl__Group__3 ;
+    public final void rule__StructureTypeDefinitionImpl__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35439:1: ( rule__StructureTypeDefinitionImpl__Group__2__Impl rule__StructureTypeDefinitionImpl__Group__3 )
+            // InternalFormalML.g:35440:2: rule__StructureTypeDefinitionImpl__Group__2__Impl rule__StructureTypeDefinitionImpl__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_163);
+            rule__StructureTypeDefinitionImpl__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__2"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__2__Impl"
+    // InternalFormalML.g:35447:1: rule__StructureTypeDefinitionImpl__Group__2__Impl : ( ( rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__StructureTypeDefinitionImpl__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35451:1: ( ( ( rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:35452:1: ( ( rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:35452:1: ( ( rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:35453:2: ( rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:35454:2: ( rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            int alt499=2;
+            int LA499_0 = input.LA(1);
+
+            if ( (LA499_0==RULE_STRING) ) {
+                alt499=1;
+            }
+            switch (alt499) {
+                case 1 :
+                    // InternalFormalML.g:35454:3: rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__2__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__3"
+    // InternalFormalML.g:35462:1: rule__StructureTypeDefinitionImpl__Group__3 : rule__StructureTypeDefinitionImpl__Group__3__Impl rule__StructureTypeDefinitionImpl__Group__4 ;
+    public final void rule__StructureTypeDefinitionImpl__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35466:1: ( rule__StructureTypeDefinitionImpl__Group__3__Impl rule__StructureTypeDefinitionImpl__Group__4 )
+            // InternalFormalML.g:35467:2: rule__StructureTypeDefinitionImpl__Group__3__Impl rule__StructureTypeDefinitionImpl__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__StructureTypeDefinitionImpl__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__3"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__3__Impl"
+    // InternalFormalML.g:35474:1: rule__StructureTypeDefinitionImpl__Group__3__Impl : ( ( rule__StructureTypeDefinitionImpl__TypedefAssignment_3 ) ) ;
+    public final void rule__StructureTypeDefinitionImpl__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35478:1: ( ( ( rule__StructureTypeDefinitionImpl__TypedefAssignment_3 ) ) )
+            // InternalFormalML.g:35479:1: ( ( rule__StructureTypeDefinitionImpl__TypedefAssignment_3 ) )
+            {
+            // InternalFormalML.g:35479:1: ( ( rule__StructureTypeDefinitionImpl__TypedefAssignment_3 ) )
+            // InternalFormalML.g:35480:2: ( rule__StructureTypeDefinitionImpl__TypedefAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefAssignment_3()); 
+            }
+            // InternalFormalML.g:35481:2: ( rule__StructureTypeDefinitionImpl__TypedefAssignment_3 )
+            // InternalFormalML.g:35481:3: rule__StructureTypeDefinitionImpl__TypedefAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__TypedefAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__3__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__4"
+    // InternalFormalML.g:35489:1: rule__StructureTypeDefinitionImpl__Group__4 : rule__StructureTypeDefinitionImpl__Group__4__Impl rule__StructureTypeDefinitionImpl__Group__5 ;
+    public final void rule__StructureTypeDefinitionImpl__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35493:1: ( rule__StructureTypeDefinitionImpl__Group__4__Impl rule__StructureTypeDefinitionImpl__Group__5 )
+            // InternalFormalML.g:35494:2: rule__StructureTypeDefinitionImpl__Group__4__Impl rule__StructureTypeDefinitionImpl__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__StructureTypeDefinitionImpl__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__4"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__4__Impl"
+    // InternalFormalML.g:35501:1: rule__StructureTypeDefinitionImpl__Group__4__Impl : ( '{' ) ;
+    public final void rule__StructureTypeDefinitionImpl__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35505:1: ( ( '{' ) )
+            // InternalFormalML.g:35506:1: ( '{' )
+            {
+            // InternalFormalML.g:35506:1: ( '{' )
+            // InternalFormalML.g:35507:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__4__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__5"
+    // InternalFormalML.g:35516:1: rule__StructureTypeDefinitionImpl__Group__5 : rule__StructureTypeDefinitionImpl__Group__5__Impl rule__StructureTypeDefinitionImpl__Group__6 ;
+    public final void rule__StructureTypeDefinitionImpl__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35520:1: ( rule__StructureTypeDefinitionImpl__Group__5__Impl rule__StructureTypeDefinitionImpl__Group__6 )
+            // InternalFormalML.g:35521:2: rule__StructureTypeDefinitionImpl__Group__5__Impl rule__StructureTypeDefinitionImpl__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__StructureTypeDefinitionImpl__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__5"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__5__Impl"
+    // InternalFormalML.g:35528:1: rule__StructureTypeDefinitionImpl__Group__5__Impl : ( ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )* ) ) ;
+    public final void rule__StructureTypeDefinitionImpl__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35532:1: ( ( ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )* ) ) )
+            // InternalFormalML.g:35533:1: ( ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )* ) )
+            {
+            // InternalFormalML.g:35533:1: ( ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )* ) )
+            // InternalFormalML.g:35534:2: ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )* )
+            {
+            // InternalFormalML.g:35534:2: ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 ) )
+            // InternalFormalML.g:35535:3: ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+            // InternalFormalML.g:35536:3: ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )
+            // InternalFormalML.g:35536:4: rule__StructureTypeDefinitionImpl__PropertyAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_6);
+            rule__StructureTypeDefinitionImpl__PropertyAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+
+            }
+
+            // InternalFormalML.g:35539:2: ( ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )* )
+            // InternalFormalML.g:35540:3: ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+            // InternalFormalML.g:35541:3: ( rule__StructureTypeDefinitionImpl__PropertyAssignment_5 )*
+            loop500:
+            do {
+                int alt500=2;
+                int LA500_0 = input.LA(1);
+
+                if ( (LA500_0==16||LA500_0==28||(LA500_0>=143 && LA500_0<=145)||LA500_0==179||LA500_0==224||(LA500_0>=278 && LA500_0<=283)) ) {
+                    alt500=1;
+                }
+
+
+                switch (alt500) {
+            	case 1 :
+            	    // InternalFormalML.g:35541:4: rule__StructureTypeDefinitionImpl__PropertyAssignment_5
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__StructureTypeDefinitionImpl__PropertyAssignment_5();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop500;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__5__Impl"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__6"
+    // InternalFormalML.g:35550:1: rule__StructureTypeDefinitionImpl__Group__6 : rule__StructureTypeDefinitionImpl__Group__6__Impl ;
+    public final void rule__StructureTypeDefinitionImpl__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35554:1: ( rule__StructureTypeDefinitionImpl__Group__6__Impl )
+            // InternalFormalML.g:35555:2: rule__StructureTypeDefinitionImpl__Group__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__StructureTypeDefinitionImpl__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__6"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__Group__6__Impl"
+    // InternalFormalML.g:35561:1: rule__StructureTypeDefinitionImpl__Group__6__Impl : ( '}' ) ;
+    public final void rule__StructureTypeDefinitionImpl__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35565:1: ( ( '}' ) )
+            // InternalFormalML.g:35566:1: ( '}' )
+            {
+            // InternalFormalML.g:35566:1: ( '}' )
+            // InternalFormalML.g:35567:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__Group__6__Impl"
+
+
+    // $ANTLR start "rule__UnionType__Group__0"
+    // InternalFormalML.g:35577:1: rule__UnionType__Group__0 : rule__UnionType__Group__0__Impl rule__UnionType__Group__1 ;
+    public final void rule__UnionType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35581:1: ( rule__UnionType__Group__0__Impl rule__UnionType__Group__1 )
+            // InternalFormalML.g:35582:2: rule__UnionType__Group__0__Impl rule__UnionType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_164);
+            rule__UnionType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__0"
+
+
+    // $ANTLR start "rule__UnionType__Group__0__Impl"
+    // InternalFormalML.g:35589:1: rule__UnionType__Group__0__Impl : ( () ) ;
+    public final void rule__UnionType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35593:1: ( ( () ) )
+            // InternalFormalML.g:35594:1: ( () )
+            {
+            // InternalFormalML.g:35594:1: ( () )
+            // InternalFormalML.g:35595:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeAccess().getUnionTypeAction_0()); 
+            }
+            // InternalFormalML.g:35596:2: ()
+            // InternalFormalML.g:35596:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeAccess().getUnionTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__UnionType__Group__1"
+    // InternalFormalML.g:35604:1: rule__UnionType__Group__1 : rule__UnionType__Group__1__Impl rule__UnionType__Group__2 ;
+    public final void rule__UnionType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35608:1: ( rule__UnionType__Group__1__Impl rule__UnionType__Group__2 )
+            // InternalFormalML.g:35609:2: rule__UnionType__Group__1__Impl rule__UnionType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__UnionType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__1"
+
+
+    // $ANTLR start "rule__UnionType__Group__1__Impl"
+    // InternalFormalML.g:35616:1: rule__UnionType__Group__1__Impl : ( 'union' ) ;
+    public final void rule__UnionType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35620:1: ( ( 'union' ) )
+            // InternalFormalML.g:35621:1: ( 'union' )
+            {
+            // InternalFormalML.g:35621:1: ( 'union' )
+            // InternalFormalML.g:35622:2: 'union'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeAccess().getUnionKeyword_1()); 
+            }
+            match(input,237,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeAccess().getUnionKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__UnionType__Group__2"
+    // InternalFormalML.g:35631:1: rule__UnionType__Group__2 : rule__UnionType__Group__2__Impl rule__UnionType__Group__3 ;
+    public final void rule__UnionType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35635:1: ( rule__UnionType__Group__2__Impl rule__UnionType__Group__3 )
+            // InternalFormalML.g:35636:2: rule__UnionType__Group__2__Impl rule__UnionType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__UnionType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__2"
+
+
+    // $ANTLR start "rule__UnionType__Group__2__Impl"
+    // InternalFormalML.g:35643:1: rule__UnionType__Group__2__Impl : ( '{' ) ;
+    public final void rule__UnionType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35647:1: ( ( '{' ) )
+            // InternalFormalML.g:35648:1: ( '{' )
+            {
+            // InternalFormalML.g:35648:1: ( '{' )
+            // InternalFormalML.g:35649:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__UnionType__Group__3"
+    // InternalFormalML.g:35658:1: rule__UnionType__Group__3 : rule__UnionType__Group__3__Impl rule__UnionType__Group__4 ;
+    public final void rule__UnionType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35662:1: ( rule__UnionType__Group__3__Impl rule__UnionType__Group__4 )
+            // InternalFormalML.g:35663:2: rule__UnionType__Group__3__Impl rule__UnionType__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__UnionType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionType__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__3"
+
+
+    // $ANTLR start "rule__UnionType__Group__3__Impl"
+    // InternalFormalML.g:35670:1: rule__UnionType__Group__3__Impl : ( ( ( rule__UnionType__PropertyAssignment_3 ) ) ( ( rule__UnionType__PropertyAssignment_3 )* ) ) ;
+    public final void rule__UnionType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35674:1: ( ( ( ( rule__UnionType__PropertyAssignment_3 ) ) ( ( rule__UnionType__PropertyAssignment_3 )* ) ) )
+            // InternalFormalML.g:35675:1: ( ( ( rule__UnionType__PropertyAssignment_3 ) ) ( ( rule__UnionType__PropertyAssignment_3 )* ) )
+            {
+            // InternalFormalML.g:35675:1: ( ( ( rule__UnionType__PropertyAssignment_3 ) ) ( ( rule__UnionType__PropertyAssignment_3 )* ) )
+            // InternalFormalML.g:35676:2: ( ( rule__UnionType__PropertyAssignment_3 ) ) ( ( rule__UnionType__PropertyAssignment_3 )* )
+            {
+            // InternalFormalML.g:35676:2: ( ( rule__UnionType__PropertyAssignment_3 ) )
+            // InternalFormalML.g:35677:3: ( rule__UnionType__PropertyAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeAccess().getPropertyAssignment_3()); 
+            }
+            // InternalFormalML.g:35678:3: ( rule__UnionType__PropertyAssignment_3 )
+            // InternalFormalML.g:35678:4: rule__UnionType__PropertyAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_6);
+            rule__UnionType__PropertyAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeAccess().getPropertyAssignment_3()); 
+            }
+
+            }
+
+            // InternalFormalML.g:35681:2: ( ( rule__UnionType__PropertyAssignment_3 )* )
+            // InternalFormalML.g:35682:3: ( rule__UnionType__PropertyAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeAccess().getPropertyAssignment_3()); 
+            }
+            // InternalFormalML.g:35683:3: ( rule__UnionType__PropertyAssignment_3 )*
+            loop501:
+            do {
+                int alt501=2;
+                int LA501_0 = input.LA(1);
+
+                if ( (LA501_0==16||LA501_0==28||(LA501_0>=143 && LA501_0<=145)||LA501_0==179||LA501_0==224||(LA501_0>=278 && LA501_0<=283)) ) {
+                    alt501=1;
+                }
+
+
+                switch (alt501) {
+            	case 1 :
+            	    // InternalFormalML.g:35683:4: rule__UnionType__PropertyAssignment_3
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__UnionType__PropertyAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop501;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeAccess().getPropertyAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__UnionType__Group__4"
+    // InternalFormalML.g:35692:1: rule__UnionType__Group__4 : rule__UnionType__Group__4__Impl ;
+    public final void rule__UnionType__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35696:1: ( rule__UnionType__Group__4__Impl )
+            // InternalFormalML.g:35697:2: rule__UnionType__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionType__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__4"
+
+
+    // $ANTLR start "rule__UnionType__Group__4__Impl"
+    // InternalFormalML.g:35703:1: rule__UnionType__Group__4__Impl : ( '}' ) ;
+    public final void rule__UnionType__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35707:1: ( ( '}' ) )
+            // InternalFormalML.g:35708:1: ( '}' )
+            {
+            // InternalFormalML.g:35708:1: ( '}' )
+            // InternalFormalML.g:35709:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__Group__4__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__0"
+    // InternalFormalML.g:35719:1: rule__UnionTypeDefinition__Group__0 : rule__UnionTypeDefinition__Group__0__Impl rule__UnionTypeDefinition__Group__1 ;
+    public final void rule__UnionTypeDefinition__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35723:1: ( rule__UnionTypeDefinition__Group__0__Impl rule__UnionTypeDefinition__Group__1 )
+            // InternalFormalML.g:35724:2: rule__UnionTypeDefinition__Group__0__Impl rule__UnionTypeDefinition__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__UnionTypeDefinition__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__0"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__0__Impl"
+    // InternalFormalML.g:35731:1: rule__UnionTypeDefinition__Group__0__Impl : ( () ) ;
+    public final void rule__UnionTypeDefinition__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35735:1: ( ( () ) )
+            // InternalFormalML.g:35736:1: ( () )
+            {
+            // InternalFormalML.g:35736:1: ( () )
+            // InternalFormalML.g:35737:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getUnionTypeAction_0()); 
+            }
+            // InternalFormalML.g:35738:2: ()
+            // InternalFormalML.g:35738:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getUnionTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__0__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__1"
+    // InternalFormalML.g:35746:1: rule__UnionTypeDefinition__Group__1 : rule__UnionTypeDefinition__Group__1__Impl rule__UnionTypeDefinition__Group__2 ;
+    public final void rule__UnionTypeDefinition__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35750:1: ( rule__UnionTypeDefinition__Group__1__Impl rule__UnionTypeDefinition__Group__2 )
+            // InternalFormalML.g:35751:2: rule__UnionTypeDefinition__Group__1__Impl rule__UnionTypeDefinition__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__UnionTypeDefinition__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__1"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__1__Impl"
+    // InternalFormalML.g:35758:1: rule__UnionTypeDefinition__Group__1__Impl : ( ( rule__UnionTypeDefinition__VisibilityAssignment_1 )? ) ;
+    public final void rule__UnionTypeDefinition__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35762:1: ( ( ( rule__UnionTypeDefinition__VisibilityAssignment_1 )? ) )
+            // InternalFormalML.g:35763:1: ( ( rule__UnionTypeDefinition__VisibilityAssignment_1 )? )
+            {
+            // InternalFormalML.g:35763:1: ( ( rule__UnionTypeDefinition__VisibilityAssignment_1 )? )
+            // InternalFormalML.g:35764:2: ( rule__UnionTypeDefinition__VisibilityAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:35765:2: ( rule__UnionTypeDefinition__VisibilityAssignment_1 )?
+            int alt502=2;
+            int LA502_0 = input.LA(1);
+
+            if ( (LA502_0==28||(LA502_0>=143 && LA502_0<=145)) ) {
+                alt502=1;
+            }
+            switch (alt502) {
+                case 1 :
+                    // InternalFormalML.g:35765:3: rule__UnionTypeDefinition__VisibilityAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__UnionTypeDefinition__VisibilityAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__1__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__2"
+    // InternalFormalML.g:35773:1: rule__UnionTypeDefinition__Group__2 : rule__UnionTypeDefinition__Group__2__Impl rule__UnionTypeDefinition__Group__3 ;
+    public final void rule__UnionTypeDefinition__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35777:1: ( rule__UnionTypeDefinition__Group__2__Impl rule__UnionTypeDefinition__Group__3 )
+            // InternalFormalML.g:35778:2: rule__UnionTypeDefinition__Group__2__Impl rule__UnionTypeDefinition__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__UnionTypeDefinition__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__2"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__2__Impl"
+    // InternalFormalML.g:35785:1: rule__UnionTypeDefinition__Group__2__Impl : ( 'type' ) ;
+    public final void rule__UnionTypeDefinition__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35789:1: ( ( 'type' ) )
+            // InternalFormalML.g:35790:1: ( 'type' )
+            {
+            // InternalFormalML.g:35790:1: ( 'type' )
+            // InternalFormalML.g:35791:2: 'type'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+            match(input,229,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__2__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__3"
+    // InternalFormalML.g:35800:1: rule__UnionTypeDefinition__Group__3 : rule__UnionTypeDefinition__Group__3__Impl rule__UnionTypeDefinition__Group__4 ;
+    public final void rule__UnionTypeDefinition__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35804:1: ( rule__UnionTypeDefinition__Group__3__Impl rule__UnionTypeDefinition__Group__4 )
+            // InternalFormalML.g:35805:2: rule__UnionTypeDefinition__Group__3__Impl rule__UnionTypeDefinition__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_165);
+            rule__UnionTypeDefinition__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__3"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__3__Impl"
+    // InternalFormalML.g:35812:1: rule__UnionTypeDefinition__Group__3__Impl : ( ( rule__UnionTypeDefinition__NameAssignment_3 ) ) ;
+    public final void rule__UnionTypeDefinition__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35816:1: ( ( ( rule__UnionTypeDefinition__NameAssignment_3 ) ) )
+            // InternalFormalML.g:35817:1: ( ( rule__UnionTypeDefinition__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:35817:1: ( ( rule__UnionTypeDefinition__NameAssignment_3 ) )
+            // InternalFormalML.g:35818:2: ( rule__UnionTypeDefinition__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:35819:2: ( rule__UnionTypeDefinition__NameAssignment_3 )
+            // InternalFormalML.g:35819:3: rule__UnionTypeDefinition__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__3__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__4"
+    // InternalFormalML.g:35827:1: rule__UnionTypeDefinition__Group__4 : rule__UnionTypeDefinition__Group__4__Impl rule__UnionTypeDefinition__Group__5 ;
+    public final void rule__UnionTypeDefinition__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35831:1: ( rule__UnionTypeDefinition__Group__4__Impl rule__UnionTypeDefinition__Group__5 )
+            // InternalFormalML.g:35832:2: rule__UnionTypeDefinition__Group__4__Impl rule__UnionTypeDefinition__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_165);
+            rule__UnionTypeDefinition__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__4"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__4__Impl"
+    // InternalFormalML.g:35839:1: rule__UnionTypeDefinition__Group__4__Impl : ( ( rule__UnionTypeDefinition__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__UnionTypeDefinition__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35843:1: ( ( ( rule__UnionTypeDefinition__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:35844:1: ( ( rule__UnionTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:35844:1: ( ( rule__UnionTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:35845:2: ( rule__UnionTypeDefinition__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:35846:2: ( rule__UnionTypeDefinition__UnrestrictedNameAssignment_4 )?
+            int alt503=2;
+            int LA503_0 = input.LA(1);
+
+            if ( (LA503_0==RULE_STRING) ) {
+                alt503=1;
+            }
+            switch (alt503) {
+                case 1 :
+                    // InternalFormalML.g:35846:3: rule__UnionTypeDefinition__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__UnionTypeDefinition__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__4__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__5"
+    // InternalFormalML.g:35854:1: rule__UnionTypeDefinition__Group__5 : rule__UnionTypeDefinition__Group__5__Impl rule__UnionTypeDefinition__Group__6 ;
+    public final void rule__UnionTypeDefinition__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35858:1: ( rule__UnionTypeDefinition__Group__5__Impl rule__UnionTypeDefinition__Group__6 )
+            // InternalFormalML.g:35859:2: rule__UnionTypeDefinition__Group__5__Impl rule__UnionTypeDefinition__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__UnionTypeDefinition__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__5"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__5__Impl"
+    // InternalFormalML.g:35866:1: rule__UnionTypeDefinition__Group__5__Impl : ( ( rule__UnionTypeDefinition__TypedefAssignment_5 ) ) ;
+    public final void rule__UnionTypeDefinition__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35870:1: ( ( ( rule__UnionTypeDefinition__TypedefAssignment_5 ) ) )
+            // InternalFormalML.g:35871:1: ( ( rule__UnionTypeDefinition__TypedefAssignment_5 ) )
+            {
+            // InternalFormalML.g:35871:1: ( ( rule__UnionTypeDefinition__TypedefAssignment_5 ) )
+            // InternalFormalML.g:35872:2: ( rule__UnionTypeDefinition__TypedefAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getTypedefAssignment_5()); 
+            }
+            // InternalFormalML.g:35873:2: ( rule__UnionTypeDefinition__TypedefAssignment_5 )
+            // InternalFormalML.g:35873:3: rule__UnionTypeDefinition__TypedefAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__TypedefAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getTypedefAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__5__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__6"
+    // InternalFormalML.g:35881:1: rule__UnionTypeDefinition__Group__6 : rule__UnionTypeDefinition__Group__6__Impl rule__UnionTypeDefinition__Group__7 ;
+    public final void rule__UnionTypeDefinition__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35885:1: ( rule__UnionTypeDefinition__Group__6__Impl rule__UnionTypeDefinition__Group__7 )
+            // InternalFormalML.g:35886:2: rule__UnionTypeDefinition__Group__6__Impl rule__UnionTypeDefinition__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__UnionTypeDefinition__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__6"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__6__Impl"
+    // InternalFormalML.g:35893:1: rule__UnionTypeDefinition__Group__6__Impl : ( '{' ) ;
+    public final void rule__UnionTypeDefinition__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35897:1: ( ( '{' ) )
+            // InternalFormalML.g:35898:1: ( '{' )
+            {
+            // InternalFormalML.g:35898:1: ( '{' )
+            // InternalFormalML.g:35899:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__6__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__7"
+    // InternalFormalML.g:35908:1: rule__UnionTypeDefinition__Group__7 : rule__UnionTypeDefinition__Group__7__Impl rule__UnionTypeDefinition__Group__8 ;
+    public final void rule__UnionTypeDefinition__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35912:1: ( rule__UnionTypeDefinition__Group__7__Impl rule__UnionTypeDefinition__Group__8 )
+            // InternalFormalML.g:35913:2: rule__UnionTypeDefinition__Group__7__Impl rule__UnionTypeDefinition__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__UnionTypeDefinition__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__7"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__7__Impl"
+    // InternalFormalML.g:35920:1: rule__UnionTypeDefinition__Group__7__Impl : ( ( ( rule__UnionTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__UnionTypeDefinition__PropertyAssignment_7 )* ) ) ;
+    public final void rule__UnionTypeDefinition__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35924:1: ( ( ( ( rule__UnionTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__UnionTypeDefinition__PropertyAssignment_7 )* ) ) )
+            // InternalFormalML.g:35925:1: ( ( ( rule__UnionTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__UnionTypeDefinition__PropertyAssignment_7 )* ) )
+            {
+            // InternalFormalML.g:35925:1: ( ( ( rule__UnionTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__UnionTypeDefinition__PropertyAssignment_7 )* ) )
+            // InternalFormalML.g:35926:2: ( ( rule__UnionTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__UnionTypeDefinition__PropertyAssignment_7 )* )
+            {
+            // InternalFormalML.g:35926:2: ( ( rule__UnionTypeDefinition__PropertyAssignment_7 ) )
+            // InternalFormalML.g:35927:3: ( rule__UnionTypeDefinition__PropertyAssignment_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+            // InternalFormalML.g:35928:3: ( rule__UnionTypeDefinition__PropertyAssignment_7 )
+            // InternalFormalML.g:35928:4: rule__UnionTypeDefinition__PropertyAssignment_7
+            {
+            pushFollow(FollowSets000.FOLLOW_6);
+            rule__UnionTypeDefinition__PropertyAssignment_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+
+            }
+
+            // InternalFormalML.g:35931:2: ( ( rule__UnionTypeDefinition__PropertyAssignment_7 )* )
+            // InternalFormalML.g:35932:3: ( rule__UnionTypeDefinition__PropertyAssignment_7 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+            // InternalFormalML.g:35933:3: ( rule__UnionTypeDefinition__PropertyAssignment_7 )*
+            loop504:
+            do {
+                int alt504=2;
+                int LA504_0 = input.LA(1);
+
+                if ( (LA504_0==16||LA504_0==28||(LA504_0>=143 && LA504_0<=145)||LA504_0==179||LA504_0==224||(LA504_0>=278 && LA504_0<=283)) ) {
+                    alt504=1;
+                }
+
+
+                switch (alt504) {
+            	case 1 :
+            	    // InternalFormalML.g:35933:4: rule__UnionTypeDefinition__PropertyAssignment_7
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__UnionTypeDefinition__PropertyAssignment_7();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop504;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__7__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__8"
+    // InternalFormalML.g:35942:1: rule__UnionTypeDefinition__Group__8 : rule__UnionTypeDefinition__Group__8__Impl ;
+    public final void rule__UnionTypeDefinition__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35946:1: ( rule__UnionTypeDefinition__Group__8__Impl )
+            // InternalFormalML.g:35947:2: rule__UnionTypeDefinition__Group__8__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinition__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__8"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__Group__8__Impl"
+    // InternalFormalML.g:35953:1: rule__UnionTypeDefinition__Group__8__Impl : ( '}' ) ;
+    public final void rule__UnionTypeDefinition__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35957:1: ( ( '}' ) )
+            // InternalFormalML.g:35958:1: ( '}' )
+            {
+            // InternalFormalML.g:35958:1: ( '}' )
+            // InternalFormalML.g:35959:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__Group__8__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__0"
+    // InternalFormalML.g:35969:1: rule__UnionTypeDefinitionImpl__Group__0 : rule__UnionTypeDefinitionImpl__Group__0__Impl rule__UnionTypeDefinitionImpl__Group__1 ;
+    public final void rule__UnionTypeDefinitionImpl__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35973:1: ( rule__UnionTypeDefinitionImpl__Group__0__Impl rule__UnionTypeDefinitionImpl__Group__1 )
+            // InternalFormalML.g:35974:2: rule__UnionTypeDefinitionImpl__Group__0__Impl rule__UnionTypeDefinitionImpl__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__UnionTypeDefinitionImpl__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__0"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__0__Impl"
+    // InternalFormalML.g:35981:1: rule__UnionTypeDefinitionImpl__Group__0__Impl : ( () ) ;
+    public final void rule__UnionTypeDefinitionImpl__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:35985:1: ( ( () ) )
+            // InternalFormalML.g:35986:1: ( () )
+            {
+            // InternalFormalML.g:35986:1: ( () )
+            // InternalFormalML.g:35987:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getUnionTypeAction_0()); 
+            }
+            // InternalFormalML.g:35988:2: ()
+            // InternalFormalML.g:35988:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getUnionTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__0__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__1"
+    // InternalFormalML.g:35996:1: rule__UnionTypeDefinitionImpl__Group__1 : rule__UnionTypeDefinitionImpl__Group__1__Impl rule__UnionTypeDefinitionImpl__Group__2 ;
+    public final void rule__UnionTypeDefinitionImpl__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36000:1: ( rule__UnionTypeDefinitionImpl__Group__1__Impl rule__UnionTypeDefinitionImpl__Group__2 )
+            // InternalFormalML.g:36001:2: rule__UnionTypeDefinitionImpl__Group__1__Impl rule__UnionTypeDefinitionImpl__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_165);
+            rule__UnionTypeDefinitionImpl__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__1"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__1__Impl"
+    // InternalFormalML.g:36008:1: rule__UnionTypeDefinitionImpl__Group__1__Impl : ( ( rule__UnionTypeDefinitionImpl__NameAssignment_1 ) ) ;
+    public final void rule__UnionTypeDefinitionImpl__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36012:1: ( ( ( rule__UnionTypeDefinitionImpl__NameAssignment_1 ) ) )
+            // InternalFormalML.g:36013:1: ( ( rule__UnionTypeDefinitionImpl__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:36013:1: ( ( rule__UnionTypeDefinitionImpl__NameAssignment_1 ) )
+            // InternalFormalML.g:36014:2: ( rule__UnionTypeDefinitionImpl__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:36015:2: ( rule__UnionTypeDefinitionImpl__NameAssignment_1 )
+            // InternalFormalML.g:36015:3: rule__UnionTypeDefinitionImpl__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__1__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__2"
+    // InternalFormalML.g:36023:1: rule__UnionTypeDefinitionImpl__Group__2 : rule__UnionTypeDefinitionImpl__Group__2__Impl rule__UnionTypeDefinitionImpl__Group__3 ;
+    public final void rule__UnionTypeDefinitionImpl__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36027:1: ( rule__UnionTypeDefinitionImpl__Group__2__Impl rule__UnionTypeDefinitionImpl__Group__3 )
+            // InternalFormalML.g:36028:2: rule__UnionTypeDefinitionImpl__Group__2__Impl rule__UnionTypeDefinitionImpl__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_165);
+            rule__UnionTypeDefinitionImpl__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__2"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__2__Impl"
+    // InternalFormalML.g:36035:1: rule__UnionTypeDefinitionImpl__Group__2__Impl : ( ( rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__UnionTypeDefinitionImpl__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36039:1: ( ( ( rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:36040:1: ( ( rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:36040:1: ( ( rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:36041:2: ( rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:36042:2: ( rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            int alt505=2;
+            int LA505_0 = input.LA(1);
+
+            if ( (LA505_0==RULE_STRING) ) {
+                alt505=1;
+            }
+            switch (alt505) {
+                case 1 :
+                    // InternalFormalML.g:36042:3: rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__2__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__3"
+    // InternalFormalML.g:36050:1: rule__UnionTypeDefinitionImpl__Group__3 : rule__UnionTypeDefinitionImpl__Group__3__Impl rule__UnionTypeDefinitionImpl__Group__4 ;
+    public final void rule__UnionTypeDefinitionImpl__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36054:1: ( rule__UnionTypeDefinitionImpl__Group__3__Impl rule__UnionTypeDefinitionImpl__Group__4 )
+            // InternalFormalML.g:36055:2: rule__UnionTypeDefinitionImpl__Group__3__Impl rule__UnionTypeDefinitionImpl__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__UnionTypeDefinitionImpl__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__3"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__3__Impl"
+    // InternalFormalML.g:36062:1: rule__UnionTypeDefinitionImpl__Group__3__Impl : ( ( rule__UnionTypeDefinitionImpl__TypedefAssignment_3 ) ) ;
+    public final void rule__UnionTypeDefinitionImpl__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36066:1: ( ( ( rule__UnionTypeDefinitionImpl__TypedefAssignment_3 ) ) )
+            // InternalFormalML.g:36067:1: ( ( rule__UnionTypeDefinitionImpl__TypedefAssignment_3 ) )
+            {
+            // InternalFormalML.g:36067:1: ( ( rule__UnionTypeDefinitionImpl__TypedefAssignment_3 ) )
+            // InternalFormalML.g:36068:2: ( rule__UnionTypeDefinitionImpl__TypedefAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefAssignment_3()); 
+            }
+            // InternalFormalML.g:36069:2: ( rule__UnionTypeDefinitionImpl__TypedefAssignment_3 )
+            // InternalFormalML.g:36069:3: rule__UnionTypeDefinitionImpl__TypedefAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__TypedefAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__3__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__4"
+    // InternalFormalML.g:36077:1: rule__UnionTypeDefinitionImpl__Group__4 : rule__UnionTypeDefinitionImpl__Group__4__Impl rule__UnionTypeDefinitionImpl__Group__5 ;
+    public final void rule__UnionTypeDefinitionImpl__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36081:1: ( rule__UnionTypeDefinitionImpl__Group__4__Impl rule__UnionTypeDefinitionImpl__Group__5 )
+            // InternalFormalML.g:36082:2: rule__UnionTypeDefinitionImpl__Group__4__Impl rule__UnionTypeDefinitionImpl__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__UnionTypeDefinitionImpl__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__4"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__4__Impl"
+    // InternalFormalML.g:36089:1: rule__UnionTypeDefinitionImpl__Group__4__Impl : ( '{' ) ;
+    public final void rule__UnionTypeDefinitionImpl__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36093:1: ( ( '{' ) )
+            // InternalFormalML.g:36094:1: ( '{' )
+            {
+            // InternalFormalML.g:36094:1: ( '{' )
+            // InternalFormalML.g:36095:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__4__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__5"
+    // InternalFormalML.g:36104:1: rule__UnionTypeDefinitionImpl__Group__5 : rule__UnionTypeDefinitionImpl__Group__5__Impl rule__UnionTypeDefinitionImpl__Group__6 ;
+    public final void rule__UnionTypeDefinitionImpl__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36108:1: ( rule__UnionTypeDefinitionImpl__Group__5__Impl rule__UnionTypeDefinitionImpl__Group__6 )
+            // InternalFormalML.g:36109:2: rule__UnionTypeDefinitionImpl__Group__5__Impl rule__UnionTypeDefinitionImpl__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__UnionTypeDefinitionImpl__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__5"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__5__Impl"
+    // InternalFormalML.g:36116:1: rule__UnionTypeDefinitionImpl__Group__5__Impl : ( ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )* ) ) ;
+    public final void rule__UnionTypeDefinitionImpl__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36120:1: ( ( ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )* ) ) )
+            // InternalFormalML.g:36121:1: ( ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )* ) )
+            {
+            // InternalFormalML.g:36121:1: ( ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )* ) )
+            // InternalFormalML.g:36122:2: ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )* )
+            {
+            // InternalFormalML.g:36122:2: ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 ) )
+            // InternalFormalML.g:36123:3: ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+            // InternalFormalML.g:36124:3: ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )
+            // InternalFormalML.g:36124:4: rule__UnionTypeDefinitionImpl__PropertyAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_6);
+            rule__UnionTypeDefinitionImpl__PropertyAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+
+            }
+
+            // InternalFormalML.g:36127:2: ( ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )* )
+            // InternalFormalML.g:36128:3: ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+            // InternalFormalML.g:36129:3: ( rule__UnionTypeDefinitionImpl__PropertyAssignment_5 )*
+            loop506:
+            do {
+                int alt506=2;
+                int LA506_0 = input.LA(1);
+
+                if ( (LA506_0==16||LA506_0==28||(LA506_0>=143 && LA506_0<=145)||LA506_0==179||LA506_0==224||(LA506_0>=278 && LA506_0<=283)) ) {
+                    alt506=1;
+                }
+
+
+                switch (alt506) {
+            	case 1 :
+            	    // InternalFormalML.g:36129:4: rule__UnionTypeDefinitionImpl__PropertyAssignment_5
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__UnionTypeDefinitionImpl__PropertyAssignment_5();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop506;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__5__Impl"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__6"
+    // InternalFormalML.g:36138:1: rule__UnionTypeDefinitionImpl__Group__6 : rule__UnionTypeDefinitionImpl__Group__6__Impl ;
+    public final void rule__UnionTypeDefinitionImpl__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36142:1: ( rule__UnionTypeDefinitionImpl__Group__6__Impl )
+            // InternalFormalML.g:36143:2: rule__UnionTypeDefinitionImpl__Group__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__UnionTypeDefinitionImpl__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__6"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__Group__6__Impl"
+    // InternalFormalML.g:36149:1: rule__UnionTypeDefinitionImpl__Group__6__Impl : ( '}' ) ;
+    public final void rule__UnionTypeDefinitionImpl__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36153:1: ( ( '}' ) )
+            // InternalFormalML.g:36154:1: ( '}' )
+            {
+            // InternalFormalML.g:36154:1: ( '}' )
+            // InternalFormalML.g:36155:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__Group__6__Impl"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__0"
+    // InternalFormalML.g:36165:1: rule__ChoiceType__Group__0 : rule__ChoiceType__Group__0__Impl rule__ChoiceType__Group__1 ;
+    public final void rule__ChoiceType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36169:1: ( rule__ChoiceType__Group__0__Impl rule__ChoiceType__Group__1 )
+            // InternalFormalML.g:36170:2: rule__ChoiceType__Group__0__Impl rule__ChoiceType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__ChoiceType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__0"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__0__Impl"
+    // InternalFormalML.g:36177:1: rule__ChoiceType__Group__0__Impl : ( () ) ;
+    public final void rule__ChoiceType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36181:1: ( ( () ) )
+            // InternalFormalML.g:36182:1: ( () )
+            {
+            // InternalFormalML.g:36182:1: ( () )
+            // InternalFormalML.g:36183:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeAccess().getChoiceTypeAction_0()); 
+            }
+            // InternalFormalML.g:36184:2: ()
+            // InternalFormalML.g:36184:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeAccess().getChoiceTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__1"
+    // InternalFormalML.g:36192:1: rule__ChoiceType__Group__1 : rule__ChoiceType__Group__1__Impl rule__ChoiceType__Group__2 ;
+    public final void rule__ChoiceType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36196:1: ( rule__ChoiceType__Group__1__Impl rule__ChoiceType__Group__2 )
+            // InternalFormalML.g:36197:2: rule__ChoiceType__Group__1__Impl rule__ChoiceType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__ChoiceType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__1"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__1__Impl"
+    // InternalFormalML.g:36204:1: rule__ChoiceType__Group__1__Impl : ( 'choice' ) ;
+    public final void rule__ChoiceType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36208:1: ( ( 'choice' ) )
+            // InternalFormalML.g:36209:1: ( 'choice' )
+            {
+            // InternalFormalML.g:36209:1: ( 'choice' )
+            // InternalFormalML.g:36210:2: 'choice'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeAccess().getChoiceKeyword_1()); 
+            }
+            match(input,149,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeAccess().getChoiceKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__2"
+    // InternalFormalML.g:36219:1: rule__ChoiceType__Group__2 : rule__ChoiceType__Group__2__Impl rule__ChoiceType__Group__3 ;
+    public final void rule__ChoiceType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36223:1: ( rule__ChoiceType__Group__2__Impl rule__ChoiceType__Group__3 )
+            // InternalFormalML.g:36224:2: rule__ChoiceType__Group__2__Impl rule__ChoiceType__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__ChoiceType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceType__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__2"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__2__Impl"
+    // InternalFormalML.g:36231:1: rule__ChoiceType__Group__2__Impl : ( '{' ) ;
+    public final void rule__ChoiceType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36235:1: ( ( '{' ) )
+            // InternalFormalML.g:36236:1: ( '{' )
+            {
+            // InternalFormalML.g:36236:1: ( '{' )
+            // InternalFormalML.g:36237:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__3"
+    // InternalFormalML.g:36246:1: rule__ChoiceType__Group__3 : rule__ChoiceType__Group__3__Impl rule__ChoiceType__Group__4 ;
+    public final void rule__ChoiceType__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36250:1: ( rule__ChoiceType__Group__3__Impl rule__ChoiceType__Group__4 )
+            // InternalFormalML.g:36251:2: rule__ChoiceType__Group__3__Impl rule__ChoiceType__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__ChoiceType__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceType__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__3"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__3__Impl"
+    // InternalFormalML.g:36258:1: rule__ChoiceType__Group__3__Impl : ( ( ( rule__ChoiceType__PropertyAssignment_3 ) ) ( ( rule__ChoiceType__PropertyAssignment_3 )* ) ) ;
+    public final void rule__ChoiceType__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36262:1: ( ( ( ( rule__ChoiceType__PropertyAssignment_3 ) ) ( ( rule__ChoiceType__PropertyAssignment_3 )* ) ) )
+            // InternalFormalML.g:36263:1: ( ( ( rule__ChoiceType__PropertyAssignment_3 ) ) ( ( rule__ChoiceType__PropertyAssignment_3 )* ) )
+            {
+            // InternalFormalML.g:36263:1: ( ( ( rule__ChoiceType__PropertyAssignment_3 ) ) ( ( rule__ChoiceType__PropertyAssignment_3 )* ) )
+            // InternalFormalML.g:36264:2: ( ( rule__ChoiceType__PropertyAssignment_3 ) ) ( ( rule__ChoiceType__PropertyAssignment_3 )* )
+            {
+            // InternalFormalML.g:36264:2: ( ( rule__ChoiceType__PropertyAssignment_3 ) )
+            // InternalFormalML.g:36265:3: ( rule__ChoiceType__PropertyAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeAccess().getPropertyAssignment_3()); 
+            }
+            // InternalFormalML.g:36266:3: ( rule__ChoiceType__PropertyAssignment_3 )
+            // InternalFormalML.g:36266:4: rule__ChoiceType__PropertyAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_6);
+            rule__ChoiceType__PropertyAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeAccess().getPropertyAssignment_3()); 
+            }
+
+            }
+
+            // InternalFormalML.g:36269:2: ( ( rule__ChoiceType__PropertyAssignment_3 )* )
+            // InternalFormalML.g:36270:3: ( rule__ChoiceType__PropertyAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeAccess().getPropertyAssignment_3()); 
+            }
+            // InternalFormalML.g:36271:3: ( rule__ChoiceType__PropertyAssignment_3 )*
+            loop507:
+            do {
+                int alt507=2;
+                int LA507_0 = input.LA(1);
+
+                if ( (LA507_0==16||LA507_0==28||(LA507_0>=143 && LA507_0<=145)||LA507_0==179||LA507_0==224||(LA507_0>=278 && LA507_0<=283)) ) {
+                    alt507=1;
+                }
+
+
+                switch (alt507) {
+            	case 1 :
+            	    // InternalFormalML.g:36271:4: rule__ChoiceType__PropertyAssignment_3
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__ChoiceType__PropertyAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop507;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeAccess().getPropertyAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__4"
+    // InternalFormalML.g:36280:1: rule__ChoiceType__Group__4 : rule__ChoiceType__Group__4__Impl ;
+    public final void rule__ChoiceType__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36284:1: ( rule__ChoiceType__Group__4__Impl )
+            // InternalFormalML.g:36285:2: rule__ChoiceType__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceType__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__4"
+
+
+    // $ANTLR start "rule__ChoiceType__Group__4__Impl"
+    // InternalFormalML.g:36291:1: rule__ChoiceType__Group__4__Impl : ( '}' ) ;
+    public final void rule__ChoiceType__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36295:1: ( ( '}' ) )
+            // InternalFormalML.g:36296:1: ( '}' )
+            {
+            // InternalFormalML.g:36296:1: ( '}' )
+            // InternalFormalML.g:36297:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__0"
+    // InternalFormalML.g:36307:1: rule__ChoiceTypeDefinition__Group__0 : rule__ChoiceTypeDefinition__Group__0__Impl rule__ChoiceTypeDefinition__Group__1 ;
+    public final void rule__ChoiceTypeDefinition__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36311:1: ( rule__ChoiceTypeDefinition__Group__0__Impl rule__ChoiceTypeDefinition__Group__1 )
+            // InternalFormalML.g:36312:2: rule__ChoiceTypeDefinition__Group__0__Impl rule__ChoiceTypeDefinition__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__ChoiceTypeDefinition__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__0"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__0__Impl"
+    // InternalFormalML.g:36319:1: rule__ChoiceTypeDefinition__Group__0__Impl : ( () ) ;
+    public final void rule__ChoiceTypeDefinition__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36323:1: ( ( () ) )
+            // InternalFormalML.g:36324:1: ( () )
+            {
+            // InternalFormalML.g:36324:1: ( () )
+            // InternalFormalML.g:36325:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getChoiceTypeAction_0()); 
+            }
+            // InternalFormalML.g:36326:2: ()
+            // InternalFormalML.g:36326:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getChoiceTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__1"
+    // InternalFormalML.g:36334:1: rule__ChoiceTypeDefinition__Group__1 : rule__ChoiceTypeDefinition__Group__1__Impl rule__ChoiceTypeDefinition__Group__2 ;
+    public final void rule__ChoiceTypeDefinition__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36338:1: ( rule__ChoiceTypeDefinition__Group__1__Impl rule__ChoiceTypeDefinition__Group__2 )
+            // InternalFormalML.g:36339:2: rule__ChoiceTypeDefinition__Group__1__Impl rule__ChoiceTypeDefinition__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_136);
+            rule__ChoiceTypeDefinition__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__1"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__1__Impl"
+    // InternalFormalML.g:36346:1: rule__ChoiceTypeDefinition__Group__1__Impl : ( ( rule__ChoiceTypeDefinition__VisibilityAssignment_1 )? ) ;
+    public final void rule__ChoiceTypeDefinition__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36350:1: ( ( ( rule__ChoiceTypeDefinition__VisibilityAssignment_1 )? ) )
+            // InternalFormalML.g:36351:1: ( ( rule__ChoiceTypeDefinition__VisibilityAssignment_1 )? )
+            {
+            // InternalFormalML.g:36351:1: ( ( rule__ChoiceTypeDefinition__VisibilityAssignment_1 )? )
+            // InternalFormalML.g:36352:2: ( rule__ChoiceTypeDefinition__VisibilityAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:36353:2: ( rule__ChoiceTypeDefinition__VisibilityAssignment_1 )?
+            int alt508=2;
+            int LA508_0 = input.LA(1);
+
+            if ( (LA508_0==28||(LA508_0>=143 && LA508_0<=145)) ) {
+                alt508=1;
+            }
+            switch (alt508) {
+                case 1 :
+                    // InternalFormalML.g:36353:3: rule__ChoiceTypeDefinition__VisibilityAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ChoiceTypeDefinition__VisibilityAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__2"
+    // InternalFormalML.g:36361:1: rule__ChoiceTypeDefinition__Group__2 : rule__ChoiceTypeDefinition__Group__2__Impl rule__ChoiceTypeDefinition__Group__3 ;
+    public final void rule__ChoiceTypeDefinition__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36365:1: ( rule__ChoiceTypeDefinition__Group__2__Impl rule__ChoiceTypeDefinition__Group__3 )
+            // InternalFormalML.g:36366:2: rule__ChoiceTypeDefinition__Group__2__Impl rule__ChoiceTypeDefinition__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ChoiceTypeDefinition__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__2"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__2__Impl"
+    // InternalFormalML.g:36373:1: rule__ChoiceTypeDefinition__Group__2__Impl : ( 'type' ) ;
+    public final void rule__ChoiceTypeDefinition__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36377:1: ( ( 'type' ) )
+            // InternalFormalML.g:36378:1: ( 'type' )
+            {
+            // InternalFormalML.g:36378:1: ( 'type' )
+            // InternalFormalML.g:36379:2: 'type'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+            match(input,229,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getTypeKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__3"
+    // InternalFormalML.g:36388:1: rule__ChoiceTypeDefinition__Group__3 : rule__ChoiceTypeDefinition__Group__3__Impl rule__ChoiceTypeDefinition__Group__4 ;
+    public final void rule__ChoiceTypeDefinition__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36392:1: ( rule__ChoiceTypeDefinition__Group__3__Impl rule__ChoiceTypeDefinition__Group__4 )
+            // InternalFormalML.g:36393:2: rule__ChoiceTypeDefinition__Group__3__Impl rule__ChoiceTypeDefinition__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_166);
+            rule__ChoiceTypeDefinition__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__3"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__3__Impl"
+    // InternalFormalML.g:36400:1: rule__ChoiceTypeDefinition__Group__3__Impl : ( ( rule__ChoiceTypeDefinition__NameAssignment_3 ) ) ;
+    public final void rule__ChoiceTypeDefinition__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36404:1: ( ( ( rule__ChoiceTypeDefinition__NameAssignment_3 ) ) )
+            // InternalFormalML.g:36405:1: ( ( rule__ChoiceTypeDefinition__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:36405:1: ( ( rule__ChoiceTypeDefinition__NameAssignment_3 ) )
+            // InternalFormalML.g:36406:2: ( rule__ChoiceTypeDefinition__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:36407:2: ( rule__ChoiceTypeDefinition__NameAssignment_3 )
+            // InternalFormalML.g:36407:3: rule__ChoiceTypeDefinition__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__4"
+    // InternalFormalML.g:36415:1: rule__ChoiceTypeDefinition__Group__4 : rule__ChoiceTypeDefinition__Group__4__Impl rule__ChoiceTypeDefinition__Group__5 ;
+    public final void rule__ChoiceTypeDefinition__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36419:1: ( rule__ChoiceTypeDefinition__Group__4__Impl rule__ChoiceTypeDefinition__Group__5 )
+            // InternalFormalML.g:36420:2: rule__ChoiceTypeDefinition__Group__4__Impl rule__ChoiceTypeDefinition__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_166);
+            rule__ChoiceTypeDefinition__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__4"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__4__Impl"
+    // InternalFormalML.g:36427:1: rule__ChoiceTypeDefinition__Group__4__Impl : ( ( rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__ChoiceTypeDefinition__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36431:1: ( ( ( rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:36432:1: ( ( rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:36432:1: ( ( rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:36433:2: ( rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:36434:2: ( rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4 )?
+            int alt509=2;
+            int LA509_0 = input.LA(1);
+
+            if ( (LA509_0==RULE_STRING) ) {
+                alt509=1;
+            }
+            switch (alt509) {
+                case 1 :
+                    // InternalFormalML.g:36434:3: rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__5"
+    // InternalFormalML.g:36442:1: rule__ChoiceTypeDefinition__Group__5 : rule__ChoiceTypeDefinition__Group__5__Impl rule__ChoiceTypeDefinition__Group__6 ;
+    public final void rule__ChoiceTypeDefinition__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36446:1: ( rule__ChoiceTypeDefinition__Group__5__Impl rule__ChoiceTypeDefinition__Group__6 )
+            // InternalFormalML.g:36447:2: rule__ChoiceTypeDefinition__Group__5__Impl rule__ChoiceTypeDefinition__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__ChoiceTypeDefinition__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__5"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__5__Impl"
+    // InternalFormalML.g:36454:1: rule__ChoiceTypeDefinition__Group__5__Impl : ( ( rule__ChoiceTypeDefinition__TypedefAssignment_5 ) ) ;
+    public final void rule__ChoiceTypeDefinition__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36458:1: ( ( ( rule__ChoiceTypeDefinition__TypedefAssignment_5 ) ) )
+            // InternalFormalML.g:36459:1: ( ( rule__ChoiceTypeDefinition__TypedefAssignment_5 ) )
+            {
+            // InternalFormalML.g:36459:1: ( ( rule__ChoiceTypeDefinition__TypedefAssignment_5 ) )
+            // InternalFormalML.g:36460:2: ( rule__ChoiceTypeDefinition__TypedefAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefAssignment_5()); 
+            }
+            // InternalFormalML.g:36461:2: ( rule__ChoiceTypeDefinition__TypedefAssignment_5 )
+            // InternalFormalML.g:36461:3: rule__ChoiceTypeDefinition__TypedefAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__TypedefAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__5__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__6"
+    // InternalFormalML.g:36469:1: rule__ChoiceTypeDefinition__Group__6 : rule__ChoiceTypeDefinition__Group__6__Impl rule__ChoiceTypeDefinition__Group__7 ;
+    public final void rule__ChoiceTypeDefinition__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36473:1: ( rule__ChoiceTypeDefinition__Group__6__Impl rule__ChoiceTypeDefinition__Group__7 )
+            // InternalFormalML.g:36474:2: rule__ChoiceTypeDefinition__Group__6__Impl rule__ChoiceTypeDefinition__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__ChoiceTypeDefinition__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__6"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__6__Impl"
+    // InternalFormalML.g:36481:1: rule__ChoiceTypeDefinition__Group__6__Impl : ( '{' ) ;
+    public final void rule__ChoiceTypeDefinition__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36485:1: ( ( '{' ) )
+            // InternalFormalML.g:36486:1: ( '{' )
+            {
+            // InternalFormalML.g:36486:1: ( '{' )
+            // InternalFormalML.g:36487:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__6__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__7"
+    // InternalFormalML.g:36496:1: rule__ChoiceTypeDefinition__Group__7 : rule__ChoiceTypeDefinition__Group__7__Impl rule__ChoiceTypeDefinition__Group__8 ;
+    public final void rule__ChoiceTypeDefinition__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36500:1: ( rule__ChoiceTypeDefinition__Group__7__Impl rule__ChoiceTypeDefinition__Group__8 )
+            // InternalFormalML.g:36501:2: rule__ChoiceTypeDefinition__Group__7__Impl rule__ChoiceTypeDefinition__Group__8
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__ChoiceTypeDefinition__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__7"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__7__Impl"
+    // InternalFormalML.g:36508:1: rule__ChoiceTypeDefinition__Group__7__Impl : ( ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )* ) ) ;
+    public final void rule__ChoiceTypeDefinition__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36512:1: ( ( ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )* ) ) )
+            // InternalFormalML.g:36513:1: ( ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )* ) )
+            {
+            // InternalFormalML.g:36513:1: ( ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )* ) )
+            // InternalFormalML.g:36514:2: ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 ) ) ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )* )
+            {
+            // InternalFormalML.g:36514:2: ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 ) )
+            // InternalFormalML.g:36515:3: ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+            // InternalFormalML.g:36516:3: ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )
+            // InternalFormalML.g:36516:4: rule__ChoiceTypeDefinition__PropertyAssignment_7
+            {
+            pushFollow(FollowSets000.FOLLOW_6);
+            rule__ChoiceTypeDefinition__PropertyAssignment_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+
+            }
+
+            // InternalFormalML.g:36519:2: ( ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )* )
+            // InternalFormalML.g:36520:3: ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+            // InternalFormalML.g:36521:3: ( rule__ChoiceTypeDefinition__PropertyAssignment_7 )*
+            loop510:
+            do {
+                int alt510=2;
+                int LA510_0 = input.LA(1);
+
+                if ( (LA510_0==16||LA510_0==28||(LA510_0>=143 && LA510_0<=145)||LA510_0==179||LA510_0==224||(LA510_0>=278 && LA510_0<=283)) ) {
+                    alt510=1;
+                }
+
+
+                switch (alt510) {
+            	case 1 :
+            	    // InternalFormalML.g:36521:4: rule__ChoiceTypeDefinition__PropertyAssignment_7
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__ChoiceTypeDefinition__PropertyAssignment_7();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop510;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__7__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__8"
+    // InternalFormalML.g:36530:1: rule__ChoiceTypeDefinition__Group__8 : rule__ChoiceTypeDefinition__Group__8__Impl ;
+    public final void rule__ChoiceTypeDefinition__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36534:1: ( rule__ChoiceTypeDefinition__Group__8__Impl )
+            // InternalFormalML.g:36535:2: rule__ChoiceTypeDefinition__Group__8__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinition__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__8"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__Group__8__Impl"
+    // InternalFormalML.g:36541:1: rule__ChoiceTypeDefinition__Group__8__Impl : ( '}' ) ;
+    public final void rule__ChoiceTypeDefinition__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36545:1: ( ( '}' ) )
+            // InternalFormalML.g:36546:1: ( '}' )
+            {
+            // InternalFormalML.g:36546:1: ( '}' )
+            // InternalFormalML.g:36547:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getRightCurlyBracketKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__Group__8__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__0"
+    // InternalFormalML.g:36557:1: rule__ChoiceTypeDefinitionImpl__Group__0 : rule__ChoiceTypeDefinitionImpl__Group__0__Impl rule__ChoiceTypeDefinitionImpl__Group__1 ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36561:1: ( rule__ChoiceTypeDefinitionImpl__Group__0__Impl rule__ChoiceTypeDefinitionImpl__Group__1 )
+            // InternalFormalML.g:36562:2: rule__ChoiceTypeDefinitionImpl__Group__0__Impl rule__ChoiceTypeDefinitionImpl__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ChoiceTypeDefinitionImpl__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__0"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__0__Impl"
+    // InternalFormalML.g:36569:1: rule__ChoiceTypeDefinitionImpl__Group__0__Impl : ( () ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36573:1: ( ( () ) )
+            // InternalFormalML.g:36574:1: ( () )
+            {
+            // InternalFormalML.g:36574:1: ( () )
+            // InternalFormalML.g:36575:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getChoiceTypeAction_0()); 
+            }
+            // InternalFormalML.g:36576:2: ()
+            // InternalFormalML.g:36576:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getChoiceTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__1"
+    // InternalFormalML.g:36584:1: rule__ChoiceTypeDefinitionImpl__Group__1 : rule__ChoiceTypeDefinitionImpl__Group__1__Impl rule__ChoiceTypeDefinitionImpl__Group__2 ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36588:1: ( rule__ChoiceTypeDefinitionImpl__Group__1__Impl rule__ChoiceTypeDefinitionImpl__Group__2 )
+            // InternalFormalML.g:36589:2: rule__ChoiceTypeDefinitionImpl__Group__1__Impl rule__ChoiceTypeDefinitionImpl__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_166);
+            rule__ChoiceTypeDefinitionImpl__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__1"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__1__Impl"
+    // InternalFormalML.g:36596:1: rule__ChoiceTypeDefinitionImpl__Group__1__Impl : ( ( rule__ChoiceTypeDefinitionImpl__NameAssignment_1 ) ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36600:1: ( ( ( rule__ChoiceTypeDefinitionImpl__NameAssignment_1 ) ) )
+            // InternalFormalML.g:36601:1: ( ( rule__ChoiceTypeDefinitionImpl__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:36601:1: ( ( rule__ChoiceTypeDefinitionImpl__NameAssignment_1 ) )
+            // InternalFormalML.g:36602:2: ( rule__ChoiceTypeDefinitionImpl__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:36603:2: ( rule__ChoiceTypeDefinitionImpl__NameAssignment_1 )
+            // InternalFormalML.g:36603:3: rule__ChoiceTypeDefinitionImpl__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__2"
+    // InternalFormalML.g:36611:1: rule__ChoiceTypeDefinitionImpl__Group__2 : rule__ChoiceTypeDefinitionImpl__Group__2__Impl rule__ChoiceTypeDefinitionImpl__Group__3 ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36615:1: ( rule__ChoiceTypeDefinitionImpl__Group__2__Impl rule__ChoiceTypeDefinitionImpl__Group__3 )
+            // InternalFormalML.g:36616:2: rule__ChoiceTypeDefinitionImpl__Group__2__Impl rule__ChoiceTypeDefinitionImpl__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_166);
+            rule__ChoiceTypeDefinitionImpl__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__2"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__2__Impl"
+    // InternalFormalML.g:36623:1: rule__ChoiceTypeDefinitionImpl__Group__2__Impl : ( ( rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36627:1: ( ( ( rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:36628:1: ( ( rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:36628:1: ( ( rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:36629:2: ( rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:36630:2: ( rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2 )?
+            int alt511=2;
+            int LA511_0 = input.LA(1);
+
+            if ( (LA511_0==RULE_STRING) ) {
+                alt511=1;
+            }
+            switch (alt511) {
+                case 1 :
+                    // InternalFormalML.g:36630:3: rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__3"
+    // InternalFormalML.g:36638:1: rule__ChoiceTypeDefinitionImpl__Group__3 : rule__ChoiceTypeDefinitionImpl__Group__3__Impl rule__ChoiceTypeDefinitionImpl__Group__4 ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36642:1: ( rule__ChoiceTypeDefinitionImpl__Group__3__Impl rule__ChoiceTypeDefinitionImpl__Group__4 )
+            // InternalFormalML.g:36643:2: rule__ChoiceTypeDefinitionImpl__Group__3__Impl rule__ChoiceTypeDefinitionImpl__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_16);
+            rule__ChoiceTypeDefinitionImpl__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__3"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__3__Impl"
+    // InternalFormalML.g:36650:1: rule__ChoiceTypeDefinitionImpl__Group__3__Impl : ( ( rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3 ) ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36654:1: ( ( ( rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3 ) ) )
+            // InternalFormalML.g:36655:1: ( ( rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3 ) )
+            {
+            // InternalFormalML.g:36655:1: ( ( rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3 ) )
+            // InternalFormalML.g:36656:2: ( rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefAssignment_3()); 
+            }
+            // InternalFormalML.g:36657:2: ( rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3 )
+            // InternalFormalML.g:36657:3: rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__4"
+    // InternalFormalML.g:36665:1: rule__ChoiceTypeDefinitionImpl__Group__4 : rule__ChoiceTypeDefinitionImpl__Group__4__Impl rule__ChoiceTypeDefinitionImpl__Group__5 ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36669:1: ( rule__ChoiceTypeDefinitionImpl__Group__4__Impl rule__ChoiceTypeDefinitionImpl__Group__5 )
+            // InternalFormalML.g:36670:2: rule__ChoiceTypeDefinitionImpl__Group__4__Impl rule__ChoiceTypeDefinitionImpl__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_39);
+            rule__ChoiceTypeDefinitionImpl__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__4"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__4__Impl"
+    // InternalFormalML.g:36677:1: rule__ChoiceTypeDefinitionImpl__Group__4__Impl : ( '{' ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36681:1: ( ( '{' ) )
+            // InternalFormalML.g:36682:1: ( '{' )
+            {
+            // InternalFormalML.g:36682:1: ( '{' )
+            // InternalFormalML.g:36683:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__5"
+    // InternalFormalML.g:36692:1: rule__ChoiceTypeDefinitionImpl__Group__5 : rule__ChoiceTypeDefinitionImpl__Group__5__Impl rule__ChoiceTypeDefinitionImpl__Group__6 ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36696:1: ( rule__ChoiceTypeDefinitionImpl__Group__5__Impl rule__ChoiceTypeDefinitionImpl__Group__6 )
+            // InternalFormalML.g:36697:2: rule__ChoiceTypeDefinitionImpl__Group__5__Impl rule__ChoiceTypeDefinitionImpl__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__ChoiceTypeDefinitionImpl__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__5"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__5__Impl"
+    // InternalFormalML.g:36704:1: rule__ChoiceTypeDefinitionImpl__Group__5__Impl : ( ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )* ) ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36708:1: ( ( ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )* ) ) )
+            // InternalFormalML.g:36709:1: ( ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )* ) )
+            {
+            // InternalFormalML.g:36709:1: ( ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )* ) )
+            // InternalFormalML.g:36710:2: ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 ) ) ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )* )
+            {
+            // InternalFormalML.g:36710:2: ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 ) )
+            // InternalFormalML.g:36711:3: ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+            // InternalFormalML.g:36712:3: ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )
+            // InternalFormalML.g:36712:4: rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_6);
+            rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+
+            }
+
+            // InternalFormalML.g:36715:2: ( ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )* )
+            // InternalFormalML.g:36716:3: ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+            // InternalFormalML.g:36717:3: ( rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 )*
+            loop512:
+            do {
+                int alt512=2;
+                int LA512_0 = input.LA(1);
+
+                if ( (LA512_0==16||LA512_0==28||(LA512_0>=143 && LA512_0<=145)||LA512_0==179||LA512_0==224||(LA512_0>=278 && LA512_0<=283)) ) {
+                    alt512=1;
+                }
+
+
+                switch (alt512) {
+            	case 1 :
+            	    // InternalFormalML.g:36717:4: rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_6);
+            	    rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop512;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__5__Impl"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__6"
+    // InternalFormalML.g:36726:1: rule__ChoiceTypeDefinitionImpl__Group__6 : rule__ChoiceTypeDefinitionImpl__Group__6__Impl ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36730:1: ( rule__ChoiceTypeDefinitionImpl__Group__6__Impl )
+            // InternalFormalML.g:36731:2: rule__ChoiceTypeDefinitionImpl__Group__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChoiceTypeDefinitionImpl__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__6"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__Group__6__Impl"
+    // InternalFormalML.g:36737:1: rule__ChoiceTypeDefinitionImpl__Group__6__Impl : ( '}' ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36741:1: ( ( '}' ) )
+            // InternalFormalML.g:36742:1: ( '}' )
+            {
+            // InternalFormalML.g:36742:1: ( '}' )
+            // InternalFormalML.g:36743:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Modifier__Group__0"
+    // InternalFormalML.g:36753:1: rule__Modifier__Group__0 : rule__Modifier__Group__0__Impl rule__Modifier__Group__1 ;
+    public final void rule__Modifier__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36757:1: ( rule__Modifier__Group__0__Impl rule__Modifier__Group__1 )
+            // InternalFormalML.g:36758:2: rule__Modifier__Group__0__Impl rule__Modifier__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_167);
+            rule__Modifier__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Modifier__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__Group__0"
+
+
+    // $ANTLR start "rule__Modifier__Group__0__Impl"
+    // InternalFormalML.g:36765:1: rule__Modifier__Group__0__Impl : ( () ) ;
+    public final void rule__Modifier__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36769:1: ( ( () ) )
+            // InternalFormalML.g:36770:1: ( () )
+            {
+            // InternalFormalML.g:36770:1: ( () )
+            // InternalFormalML.g:36771:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getModifierAction_0()); 
+            }
+            // InternalFormalML.g:36772:2: ()
+            // InternalFormalML.g:36772:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getModifierAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Modifier__Group__1"
+    // InternalFormalML.g:36780:1: rule__Modifier__Group__1 : rule__Modifier__Group__1__Impl ;
+    public final void rule__Modifier__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36784:1: ( rule__Modifier__Group__1__Impl )
+            // InternalFormalML.g:36785:2: rule__Modifier__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Modifier__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__Group__1"
+
+
+    // $ANTLR start "rule__Modifier__Group__1__Impl"
+    // InternalFormalML.g:36791:1: rule__Modifier__Group__1__Impl : ( ( rule__Modifier__UnorderedGroup_1 ) ) ;
+    public final void rule__Modifier__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36795:1: ( ( ( rule__Modifier__UnorderedGroup_1 ) ) )
+            // InternalFormalML.g:36796:1: ( ( rule__Modifier__UnorderedGroup_1 ) )
+            {
+            // InternalFormalML.g:36796:1: ( ( rule__Modifier__UnorderedGroup_1 ) )
+            // InternalFormalML.g:36797:2: ( rule__Modifier__UnorderedGroup_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getUnorderedGroup_1()); 
+            }
+            // InternalFormalML.g:36798:2: ( rule__Modifier__UnorderedGroup_1 )
+            // InternalFormalML.g:36798:3: rule__Modifier__UnorderedGroup_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Modifier__UnorderedGroup_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getUnorderedGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group__0"
+    // InternalFormalML.g:36807:1: rule__Variable__Group__0 : rule__Variable__Group__0__Impl rule__Variable__Group__1 ;
+    public final void rule__Variable__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36811:1: ( rule__Variable__Group__0__Impl rule__Variable__Group__1 )
+            // InternalFormalML.g:36812:2: rule__Variable__Group__0__Impl rule__Variable__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_168);
+            rule__Variable__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__0"
+
+
+    // $ANTLR start "rule__Variable__Group__0__Impl"
+    // InternalFormalML.g:36819:1: rule__Variable__Group__0__Impl : ( ( rule__Variable__UnorderedGroup_0 ) ) ;
+    public final void rule__Variable__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36823:1: ( ( ( rule__Variable__UnorderedGroup_0 ) ) )
+            // InternalFormalML.g:36824:1: ( ( rule__Variable__UnorderedGroup_0 ) )
+            {
+            // InternalFormalML.g:36824:1: ( ( rule__Variable__UnorderedGroup_0 ) )
+            // InternalFormalML.g:36825:2: ( rule__Variable__UnorderedGroup_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getUnorderedGroup_0()); 
+            }
+            // InternalFormalML.g:36826:2: ( rule__Variable__UnorderedGroup_0 )
+            // InternalFormalML.g:36826:3: rule__Variable__UnorderedGroup_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__UnorderedGroup_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getUnorderedGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group__1"
+    // InternalFormalML.g:36834:1: rule__Variable__Group__1 : rule__Variable__Group__1__Impl rule__Variable__Group__2 ;
+    public final void rule__Variable__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36838:1: ( rule__Variable__Group__1__Impl rule__Variable__Group__2 )
+            // InternalFormalML.g:36839:2: rule__Variable__Group__1__Impl rule__Variable__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__Variable__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__1"
+
+
+    // $ANTLR start "rule__Variable__Group__1__Impl"
+    // InternalFormalML.g:36846:1: rule__Variable__Group__1__Impl : ( ( rule__Variable__Alternatives_1 ) ) ;
+    public final void rule__Variable__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36850:1: ( ( ( rule__Variable__Alternatives_1 ) ) )
+            // InternalFormalML.g:36851:1: ( ( rule__Variable__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:36851:1: ( ( rule__Variable__Alternatives_1 ) )
+            // InternalFormalML.g:36852:2: ( rule__Variable__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:36853:2: ( rule__Variable__Alternatives_1 )
+            // InternalFormalML.g:36853:3: rule__Variable__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group__2"
+    // InternalFormalML.g:36861:1: rule__Variable__Group__2 : rule__Variable__Group__2__Impl rule__Variable__Group__3 ;
+    public final void rule__Variable__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36865:1: ( rule__Variable__Group__2__Impl rule__Variable__Group__3 )
+            // InternalFormalML.g:36866:2: rule__Variable__Group__2__Impl rule__Variable__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__Variable__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__2"
+
+
+    // $ANTLR start "rule__Variable__Group__2__Impl"
+    // InternalFormalML.g:36873:1: rule__Variable__Group__2__Impl : ( ( rule__Variable__TypeAssignment_2 ) ) ;
+    public final void rule__Variable__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36877:1: ( ( ( rule__Variable__TypeAssignment_2 ) ) )
+            // InternalFormalML.g:36878:1: ( ( rule__Variable__TypeAssignment_2 ) )
+            {
+            // InternalFormalML.g:36878:1: ( ( rule__Variable__TypeAssignment_2 ) )
+            // InternalFormalML.g:36879:2: ( rule__Variable__TypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getTypeAssignment_2()); 
+            }
+            // InternalFormalML.g:36880:2: ( rule__Variable__TypeAssignment_2 )
+            // InternalFormalML.g:36880:3: rule__Variable__TypeAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__TypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group__3"
+    // InternalFormalML.g:36888:1: rule__Variable__Group__3 : rule__Variable__Group__3__Impl rule__Variable__Group__4 ;
+    public final void rule__Variable__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36892:1: ( rule__Variable__Group__3__Impl rule__Variable__Group__4 )
+            // InternalFormalML.g:36893:2: rule__Variable__Group__3__Impl rule__Variable__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__Variable__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__3"
+
+
+    // $ANTLR start "rule__Variable__Group__3__Impl"
+    // InternalFormalML.g:36900:1: rule__Variable__Group__3__Impl : ( ( rule__Variable__NameAssignment_3 ) ) ;
+    public final void rule__Variable__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36904:1: ( ( ( rule__Variable__NameAssignment_3 ) ) )
+            // InternalFormalML.g:36905:1: ( ( rule__Variable__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:36905:1: ( ( rule__Variable__NameAssignment_3 ) )
+            // InternalFormalML.g:36906:2: ( rule__Variable__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:36907:2: ( rule__Variable__NameAssignment_3 )
+            // InternalFormalML.g:36907:3: rule__Variable__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group__4"
+    // InternalFormalML.g:36915:1: rule__Variable__Group__4 : rule__Variable__Group__4__Impl rule__Variable__Group__5 ;
+    public final void rule__Variable__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36919:1: ( rule__Variable__Group__4__Impl rule__Variable__Group__5 )
+            // InternalFormalML.g:36920:2: rule__Variable__Group__4__Impl rule__Variable__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__Variable__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__4"
+
+
+    // $ANTLR start "rule__Variable__Group__4__Impl"
+    // InternalFormalML.g:36927:1: rule__Variable__Group__4__Impl : ( ( rule__Variable__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__Variable__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36931:1: ( ( ( rule__Variable__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:36932:1: ( ( rule__Variable__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:36932:1: ( ( rule__Variable__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:36933:2: ( rule__Variable__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:36934:2: ( rule__Variable__UnrestrictedNameAssignment_4 )?
+            int alt513=2;
+            int LA513_0 = input.LA(1);
+
+            if ( (LA513_0==RULE_STRING) ) {
+                alt513=1;
+            }
+            switch (alt513) {
+                case 1 :
+                    // InternalFormalML.g:36934:3: rule__Variable__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group__5"
+    // InternalFormalML.g:36942:1: rule__Variable__Group__5 : rule__Variable__Group__5__Impl rule__Variable__Group__6 ;
+    public final void rule__Variable__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36946:1: ( rule__Variable__Group__5__Impl rule__Variable__Group__6 )
+            // InternalFormalML.g:36947:2: rule__Variable__Group__5__Impl rule__Variable__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__Variable__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__5"
+
+
+    // $ANTLR start "rule__Variable__Group__5__Impl"
+    // InternalFormalML.g:36954:1: rule__Variable__Group__5__Impl : ( ( rule__Variable__Group_5__0 )? ) ;
+    public final void rule__Variable__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36958:1: ( ( ( rule__Variable__Group_5__0 )? ) )
+            // InternalFormalML.g:36959:1: ( ( rule__Variable__Group_5__0 )? )
+            {
+            // InternalFormalML.g:36959:1: ( ( rule__Variable__Group_5__0 )? )
+            // InternalFormalML.g:36960:2: ( rule__Variable__Group_5__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getGroup_5()); 
+            }
+            // InternalFormalML.g:36961:2: ( rule__Variable__Group_5__0 )?
+            int alt514=2;
+            int LA514_0 = input.LA(1);
+
+            if ( (LA514_0==100) ) {
+                alt514=1;
+            }
+            switch (alt514) {
+                case 1 :
+                    // InternalFormalML.g:36961:3: rule__Variable__Group_5__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__Group_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getGroup_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group__6"
+    // InternalFormalML.g:36969:1: rule__Variable__Group__6 : rule__Variable__Group__6__Impl ;
+    public final void rule__Variable__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36973:1: ( rule__Variable__Group__6__Impl )
+            // InternalFormalML.g:36974:2: rule__Variable__Group__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__6"
+
+
+    // $ANTLR start "rule__Variable__Group__6__Impl"
+    // InternalFormalML.g:36980:1: rule__Variable__Group__6__Impl : ( ( rule__Variable__Alternatives_6 ) ) ;
+    public final void rule__Variable__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:36984:1: ( ( ( rule__Variable__Alternatives_6 ) ) )
+            // InternalFormalML.g:36985:1: ( ( rule__Variable__Alternatives_6 ) )
+            {
+            // InternalFormalML.g:36985:1: ( ( rule__Variable__Alternatives_6 ) )
+            // InternalFormalML.g:36986:2: ( rule__Variable__Alternatives_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getAlternatives_6()); 
+            }
+            // InternalFormalML.g:36987:2: ( rule__Variable__Alternatives_6 )
+            // InternalFormalML.g:36987:3: rule__Variable__Alternatives_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Alternatives_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getAlternatives_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_1_2__0"
+    // InternalFormalML.g:36996:1: rule__Variable__Group_1_2__0 : rule__Variable__Group_1_2__0__Impl rule__Variable__Group_1_2__1 ;
+    public final void rule__Variable__Group_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37000:1: ( rule__Variable__Group_1_2__0__Impl rule__Variable__Group_1_2__1 )
+            // InternalFormalML.g:37001:2: rule__Variable__Group_1_2__0__Impl rule__Variable__Group_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_170);
+            rule__Variable__Group_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_2__0"
+
+
+    // $ANTLR start "rule__Variable__Group_1_2__0__Impl"
+    // InternalFormalML.g:37008:1: rule__Variable__Group_1_2__0__Impl : ( ( rule__Variable__Alternatives_1_2_0 ) ) ;
+    public final void rule__Variable__Group_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37012:1: ( ( ( rule__Variable__Alternatives_1_2_0 ) ) )
+            // InternalFormalML.g:37013:1: ( ( rule__Variable__Alternatives_1_2_0 ) )
+            {
+            // InternalFormalML.g:37013:1: ( ( rule__Variable__Alternatives_1_2_0 ) )
+            // InternalFormalML.g:37014:2: ( rule__Variable__Alternatives_1_2_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getAlternatives_1_2_0()); 
+            }
+            // InternalFormalML.g:37015:2: ( rule__Variable__Alternatives_1_2_0 )
+            // InternalFormalML.g:37015:3: rule__Variable__Alternatives_1_2_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Alternatives_1_2_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getAlternatives_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_1_2__1"
+    // InternalFormalML.g:37023:1: rule__Variable__Group_1_2__1 : rule__Variable__Group_1_2__1__Impl rule__Variable__Group_1_2__2 ;
+    public final void rule__Variable__Group_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37027:1: ( rule__Variable__Group_1_2__1__Impl rule__Variable__Group_1_2__2 )
+            // InternalFormalML.g:37028:2: rule__Variable__Group_1_2__1__Impl rule__Variable__Group_1_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_170);
+            rule__Variable__Group_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_1_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_2__1"
+
+
+    // $ANTLR start "rule__Variable__Group_1_2__1__Impl"
+    // InternalFormalML.g:37035:1: rule__Variable__Group_1_2__1__Impl : ( ( rule__Variable__MacroAssignment_1_2_1 )? ) ;
+    public final void rule__Variable__Group_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37039:1: ( ( ( rule__Variable__MacroAssignment_1_2_1 )? ) )
+            // InternalFormalML.g:37040:1: ( ( rule__Variable__MacroAssignment_1_2_1 )? )
+            {
+            // InternalFormalML.g:37040:1: ( ( rule__Variable__MacroAssignment_1_2_1 )? )
+            // InternalFormalML.g:37041:2: ( rule__Variable__MacroAssignment_1_2_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getMacroAssignment_1_2_1()); 
+            }
+            // InternalFormalML.g:37042:2: ( rule__Variable__MacroAssignment_1_2_1 )?
+            int alt515=2;
+            int LA515_0 = input.LA(1);
+
+            if ( (LA515_0==224) ) {
+                alt515=1;
+            }
+            switch (alt515) {
+                case 1 :
+                    // InternalFormalML.g:37042:3: rule__Variable__MacroAssignment_1_2_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__MacroAssignment_1_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getMacroAssignment_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_1_2__2"
+    // InternalFormalML.g:37050:1: rule__Variable__Group_1_2__2 : rule__Variable__Group_1_2__2__Impl ;
+    public final void rule__Variable__Group_1_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37054:1: ( rule__Variable__Group_1_2__2__Impl )
+            // InternalFormalML.g:37055:2: rule__Variable__Group_1_2__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_1_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_2__2"
+
+
+    // $ANTLR start "rule__Variable__Group_1_2__2__Impl"
+    // InternalFormalML.g:37061:1: rule__Variable__Group_1_2__2__Impl : ( ( 'var' )? ) ;
+    public final void rule__Variable__Group_1_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37065:1: ( ( ( 'var' )? ) )
+            // InternalFormalML.g:37066:1: ( ( 'var' )? )
+            {
+            // InternalFormalML.g:37066:1: ( ( 'var' )? )
+            // InternalFormalML.g:37067:2: ( 'var' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getVarKeyword_1_2_2()); 
+            }
+            // InternalFormalML.g:37068:2: ( 'var' )?
+            int alt516=2;
+            int LA516_0 = input.LA(1);
+
+            if ( (LA516_0==16) ) {
+                alt516=1;
+            }
+            switch (alt516) {
+                case 1 :
+                    // InternalFormalML.g:37068:3: 'var'
+                    {
+                    match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getVarKeyword_1_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_2__2__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_1_3__0"
+    // InternalFormalML.g:37077:1: rule__Variable__Group_1_3__0 : rule__Variable__Group_1_3__0__Impl rule__Variable__Group_1_3__1 ;
+    public final void rule__Variable__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37081:1: ( rule__Variable__Group_1_3__0__Impl rule__Variable__Group_1_3__1 )
+            // InternalFormalML.g:37082:2: rule__Variable__Group_1_3__0__Impl rule__Variable__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_171);
+            rule__Variable__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_3__0"
+
+
+    // $ANTLR start "rule__Variable__Group_1_3__0__Impl"
+    // InternalFormalML.g:37089:1: rule__Variable__Group_1_3__0__Impl : ( ( rule__Variable__MacroAssignment_1_3_0 ) ) ;
+    public final void rule__Variable__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37093:1: ( ( ( rule__Variable__MacroAssignment_1_3_0 ) ) )
+            // InternalFormalML.g:37094:1: ( ( rule__Variable__MacroAssignment_1_3_0 ) )
+            {
+            // InternalFormalML.g:37094:1: ( ( rule__Variable__MacroAssignment_1_3_0 ) )
+            // InternalFormalML.g:37095:2: ( rule__Variable__MacroAssignment_1_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getMacroAssignment_1_3_0()); 
+            }
+            // InternalFormalML.g:37096:2: ( rule__Variable__MacroAssignment_1_3_0 )
+            // InternalFormalML.g:37096:3: rule__Variable__MacroAssignment_1_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__MacroAssignment_1_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getMacroAssignment_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_1_3__1"
+    // InternalFormalML.g:37104:1: rule__Variable__Group_1_3__1 : rule__Variable__Group_1_3__1__Impl ;
+    public final void rule__Variable__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37108:1: ( rule__Variable__Group_1_3__1__Impl )
+            // InternalFormalML.g:37109:2: rule__Variable__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_3__1"
+
+
+    // $ANTLR start "rule__Variable__Group_1_3__1__Impl"
+    // InternalFormalML.g:37115:1: rule__Variable__Group_1_3__1__Impl : ( ( rule__Variable__Alternatives_1_3_1 )? ) ;
+    public final void rule__Variable__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37119:1: ( ( ( rule__Variable__Alternatives_1_3_1 )? ) )
+            // InternalFormalML.g:37120:1: ( ( rule__Variable__Alternatives_1_3_1 )? )
+            {
+            // InternalFormalML.g:37120:1: ( ( rule__Variable__Alternatives_1_3_1 )? )
+            // InternalFormalML.g:37121:2: ( rule__Variable__Alternatives_1_3_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getAlternatives_1_3_1()); 
+            }
+            // InternalFormalML.g:37122:2: ( rule__Variable__Alternatives_1_3_1 )?
+            int alt517=2;
+            int LA517_0 = input.LA(1);
+
+            if ( (LA517_0==16||LA517_0==282) ) {
+                alt517=1;
+            }
+            switch (alt517) {
+                case 1 :
+                    // InternalFormalML.g:37122:3: rule__Variable__Alternatives_1_3_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__Alternatives_1_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getAlternatives_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_5__0"
+    // InternalFormalML.g:37131:1: rule__Variable__Group_5__0 : rule__Variable__Group_5__0__Impl rule__Variable__Group_5__1 ;
+    public final void rule__Variable__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37135:1: ( rule__Variable__Group_5__0__Impl rule__Variable__Group_5__1 )
+            // InternalFormalML.g:37136:2: rule__Variable__Group_5__0__Impl rule__Variable__Group_5__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__Variable__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_5__0"
+
+
+    // $ANTLR start "rule__Variable__Group_5__0__Impl"
+    // InternalFormalML.g:37143:1: rule__Variable__Group_5__0__Impl : ( '=' ) ;
+    public final void rule__Variable__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37147:1: ( ( '=' ) )
+            // InternalFormalML.g:37148:1: ( '=' )
+            {
+            // InternalFormalML.g:37148:1: ( '=' )
+            // InternalFormalML.g:37149:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getEqualsSignKeyword_5_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getEqualsSignKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_5__1"
+    // InternalFormalML.g:37158:1: rule__Variable__Group_5__1 : rule__Variable__Group_5__1__Impl ;
+    public final void rule__Variable__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37162:1: ( rule__Variable__Group_5__1__Impl )
+            // InternalFormalML.g:37163:2: rule__Variable__Group_5__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_5__1"
+
+
+    // $ANTLR start "rule__Variable__Group_5__1__Impl"
+    // InternalFormalML.g:37169:1: rule__Variable__Group_5__1__Impl : ( ( rule__Variable__DefaultValueAssignment_5_1 ) ) ;
+    public final void rule__Variable__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37173:1: ( ( ( rule__Variable__DefaultValueAssignment_5_1 ) ) )
+            // InternalFormalML.g:37174:1: ( ( rule__Variable__DefaultValueAssignment_5_1 ) )
+            {
+            // InternalFormalML.g:37174:1: ( ( rule__Variable__DefaultValueAssignment_5_1 ) )
+            // InternalFormalML.g:37175:2: ( rule__Variable__DefaultValueAssignment_5_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getDefaultValueAssignment_5_1()); 
+            }
+            // InternalFormalML.g:37176:2: ( rule__Variable__DefaultValueAssignment_5_1 )
+            // InternalFormalML.g:37176:3: rule__Variable__DefaultValueAssignment_5_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__DefaultValueAssignment_5_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getDefaultValueAssignment_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_6_0__0"
+    // InternalFormalML.g:37185:1: rule__Variable__Group_6_0__0 : rule__Variable__Group_6_0__0__Impl rule__Variable__Group_6_0__1 ;
+    public final void rule__Variable__Group_6_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37189:1: ( rule__Variable__Group_6_0__0__Impl rule__Variable__Group_6_0__1 )
+            // InternalFormalML.g:37190:2: rule__Variable__Group_6_0__0__Impl rule__Variable__Group_6_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_172);
+            rule__Variable__Group_6_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_6_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_6_0__0"
+
+
+    // $ANTLR start "rule__Variable__Group_6_0__0__Impl"
+    // InternalFormalML.g:37197:1: rule__Variable__Group_6_0__0__Impl : ( '{' ) ;
+    public final void rule__Variable__Group_6_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37201:1: ( ( '{' ) )
+            // InternalFormalML.g:37202:1: ( '{' )
+            {
+            // InternalFormalML.g:37202:1: ( '{' )
+            // InternalFormalML.g:37203:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getLeftCurlyBracketKeyword_6_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getLeftCurlyBracketKeyword_6_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_6_0__0__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_6_0__1"
+    // InternalFormalML.g:37212:1: rule__Variable__Group_6_0__1 : rule__Variable__Group_6_0__1__Impl rule__Variable__Group_6_0__2 ;
+    public final void rule__Variable__Group_6_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37216:1: ( rule__Variable__Group_6_0__1__Impl rule__Variable__Group_6_0__2 )
+            // InternalFormalML.g:37217:2: rule__Variable__Group_6_0__1__Impl rule__Variable__Group_6_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Variable__Group_6_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_6_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_6_0__1"
+
+
+    // $ANTLR start "rule__Variable__Group_6_0__1__Impl"
+    // InternalFormalML.g:37224:1: rule__Variable__Group_6_0__1__Impl : ( ( rule__Variable__OnWriteActionAssignment_6_0_1 ) ) ;
+    public final void rule__Variable__Group_6_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37228:1: ( ( ( rule__Variable__OnWriteActionAssignment_6_0_1 ) ) )
+            // InternalFormalML.g:37229:1: ( ( rule__Variable__OnWriteActionAssignment_6_0_1 ) )
+            {
+            // InternalFormalML.g:37229:1: ( ( rule__Variable__OnWriteActionAssignment_6_0_1 ) )
+            // InternalFormalML.g:37230:2: ( rule__Variable__OnWriteActionAssignment_6_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getOnWriteActionAssignment_6_0_1()); 
+            }
+            // InternalFormalML.g:37231:2: ( rule__Variable__OnWriteActionAssignment_6_0_1 )
+            // InternalFormalML.g:37231:3: rule__Variable__OnWriteActionAssignment_6_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__OnWriteActionAssignment_6_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getOnWriteActionAssignment_6_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_6_0__1__Impl"
+
+
+    // $ANTLR start "rule__Variable__Group_6_0__2"
+    // InternalFormalML.g:37239:1: rule__Variable__Group_6_0__2 : rule__Variable__Group_6_0__2__Impl ;
+    public final void rule__Variable__Group_6_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37243:1: ( rule__Variable__Group_6_0__2__Impl )
+            // InternalFormalML.g:37244:2: rule__Variable__Group_6_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__Group_6_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_6_0__2"
+
+
+    // $ANTLR start "rule__Variable__Group_6_0__2__Impl"
+    // InternalFormalML.g:37250:1: rule__Variable__Group_6_0__2__Impl : ( '}' ) ;
+    public final void rule__Variable__Group_6_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37254:1: ( ( '}' ) )
+            // InternalFormalML.g:37255:1: ( '}' )
+            {
+            // InternalFormalML.g:37255:1: ( '}' )
+            // InternalFormalML.g:37256:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getRightCurlyBracketKeyword_6_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getRightCurlyBracketKeyword_6_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__Group_6_0__2__Impl"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group__0"
+    // InternalFormalML.g:37266:1: rule__OnWriteRoutine__Group__0 : rule__OnWriteRoutine__Group__0__Impl rule__OnWriteRoutine__Group__1 ;
+    public final void rule__OnWriteRoutine__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37270:1: ( rule__OnWriteRoutine__Group__0__Impl rule__OnWriteRoutine__Group__1 )
+            // InternalFormalML.g:37271:2: rule__OnWriteRoutine__Group__0__Impl rule__OnWriteRoutine__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_172);
+            rule__OnWriteRoutine__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group__0"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group__0__Impl"
+    // InternalFormalML.g:37278:1: rule__OnWriteRoutine__Group__0__Impl : ( () ) ;
+    public final void rule__OnWriteRoutine__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37282:1: ( ( () ) )
+            // InternalFormalML.g:37283:1: ( () )
+            {
+            // InternalFormalML.g:37283:1: ( () )
+            // InternalFormalML.g:37284:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getRoutineAction_0()); 
+            }
+            // InternalFormalML.g:37285:2: ()
+            // InternalFormalML.g:37285:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getRoutineAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group__0__Impl"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group__1"
+    // InternalFormalML.g:37293:1: rule__OnWriteRoutine__Group__1 : rule__OnWriteRoutine__Group__1__Impl rule__OnWriteRoutine__Group__2 ;
+    public final void rule__OnWriteRoutine__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37297:1: ( rule__OnWriteRoutine__Group__1__Impl rule__OnWriteRoutine__Group__2 )
+            // InternalFormalML.g:37298:2: rule__OnWriteRoutine__Group__1__Impl rule__OnWriteRoutine__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__OnWriteRoutine__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group__1"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group__1__Impl"
+    // InternalFormalML.g:37305:1: rule__OnWriteRoutine__Group__1__Impl : ( '@on_write' ) ;
+    public final void rule__OnWriteRoutine__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37309:1: ( ( '@on_write' ) )
+            // InternalFormalML.g:37310:1: ( '@on_write' )
+            {
+            // InternalFormalML.g:37310:1: ( '@on_write' )
+            // InternalFormalML.g:37311:2: '@on_write'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getOn_writeKeyword_1()); 
+            }
+            match(input,238,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getOn_writeKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group__1__Impl"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group__2"
+    // InternalFormalML.g:37320:1: rule__OnWriteRoutine__Group__2 : rule__OnWriteRoutine__Group__2__Impl rule__OnWriteRoutine__Group__3 ;
+    public final void rule__OnWriteRoutine__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37324:1: ( rule__OnWriteRoutine__Group__2__Impl rule__OnWriteRoutine__Group__3 )
+            // InternalFormalML.g:37325:2: rule__OnWriteRoutine__Group__2__Impl rule__OnWriteRoutine__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__OnWriteRoutine__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group__2"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group__2__Impl"
+    // InternalFormalML.g:37332:1: rule__OnWriteRoutine__Group__2__Impl : ( ( rule__OnWriteRoutine__Group_2__0 )? ) ;
+    public final void rule__OnWriteRoutine__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37336:1: ( ( ( rule__OnWriteRoutine__Group_2__0 )? ) )
+            // InternalFormalML.g:37337:1: ( ( rule__OnWriteRoutine__Group_2__0 )? )
+            {
+            // InternalFormalML.g:37337:1: ( ( rule__OnWriteRoutine__Group_2__0 )? )
+            // InternalFormalML.g:37338:2: ( rule__OnWriteRoutine__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:37339:2: ( rule__OnWriteRoutine__Group_2__0 )?
+            int alt518=2;
+            int LA518_0 = input.LA(1);
+
+            if ( (LA518_0==23) ) {
+                alt518=1;
+            }
+            switch (alt518) {
+                case 1 :
+                    // InternalFormalML.g:37339:3: rule__OnWriteRoutine__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OnWriteRoutine__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group__2__Impl"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group__3"
+    // InternalFormalML.g:37347:1: rule__OnWriteRoutine__Group__3 : rule__OnWriteRoutine__Group__3__Impl ;
+    public final void rule__OnWriteRoutine__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37351:1: ( rule__OnWriteRoutine__Group__3__Impl )
+            // InternalFormalML.g:37352:2: rule__OnWriteRoutine__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group__3"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group__3__Impl"
+    // InternalFormalML.g:37358:1: rule__OnWriteRoutine__Group__3__Impl : ( ( rule__OnWriteRoutine__BodyBlockAssignment_3 ) ) ;
+    public final void rule__OnWriteRoutine__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37362:1: ( ( ( rule__OnWriteRoutine__BodyBlockAssignment_3 ) ) )
+            // InternalFormalML.g:37363:1: ( ( rule__OnWriteRoutine__BodyBlockAssignment_3 ) )
+            {
+            // InternalFormalML.g:37363:1: ( ( rule__OnWriteRoutine__BodyBlockAssignment_3 ) )
+            // InternalFormalML.g:37364:2: ( rule__OnWriteRoutine__BodyBlockAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getBodyBlockAssignment_3()); 
+            }
+            // InternalFormalML.g:37365:2: ( rule__OnWriteRoutine__BodyBlockAssignment_3 )
+            // InternalFormalML.g:37365:3: rule__OnWriteRoutine__BodyBlockAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__BodyBlockAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getBodyBlockAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group__3__Impl"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group_2__0"
+    // InternalFormalML.g:37374:1: rule__OnWriteRoutine__Group_2__0 : rule__OnWriteRoutine__Group_2__0__Impl rule__OnWriteRoutine__Group_2__1 ;
+    public final void rule__OnWriteRoutine__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37378:1: ( rule__OnWriteRoutine__Group_2__0__Impl rule__OnWriteRoutine__Group_2__1 )
+            // InternalFormalML.g:37379:2: rule__OnWriteRoutine__Group_2__0__Impl rule__OnWriteRoutine__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__OnWriteRoutine__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group_2__0"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group_2__0__Impl"
+    // InternalFormalML.g:37386:1: rule__OnWriteRoutine__Group_2__0__Impl : ( '(' ) ;
+    public final void rule__OnWriteRoutine__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37390:1: ( ( '(' ) )
+            // InternalFormalML.g:37391:1: ( '(' )
+            {
+            // InternalFormalML.g:37391:1: ( '(' )
+            // InternalFormalML.g:37392:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getLeftParenthesisKeyword_2_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getLeftParenthesisKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group_2__1"
+    // InternalFormalML.g:37401:1: rule__OnWriteRoutine__Group_2__1 : rule__OnWriteRoutine__Group_2__1__Impl rule__OnWriteRoutine__Group_2__2 ;
+    public final void rule__OnWriteRoutine__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37405:1: ( rule__OnWriteRoutine__Group_2__1__Impl rule__OnWriteRoutine__Group_2__2 )
+            // InternalFormalML.g:37406:2: rule__OnWriteRoutine__Group_2__1__Impl rule__OnWriteRoutine__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__OnWriteRoutine__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group_2__1"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group_2__1__Impl"
+    // InternalFormalML.g:37413:1: rule__OnWriteRoutine__Group_2__1__Impl : ( ( rule__OnWriteRoutine__ParameterAssignment_2_1 ) ) ;
+    public final void rule__OnWriteRoutine__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37417:1: ( ( ( rule__OnWriteRoutine__ParameterAssignment_2_1 ) ) )
+            // InternalFormalML.g:37418:1: ( ( rule__OnWriteRoutine__ParameterAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:37418:1: ( ( rule__OnWriteRoutine__ParameterAssignment_2_1 ) )
+            // InternalFormalML.g:37419:2: ( rule__OnWriteRoutine__ParameterAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getParameterAssignment_2_1()); 
+            }
+            // InternalFormalML.g:37420:2: ( rule__OnWriteRoutine__ParameterAssignment_2_1 )
+            // InternalFormalML.g:37420:3: rule__OnWriteRoutine__ParameterAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__ParameterAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getParameterAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group_2__2"
+    // InternalFormalML.g:37428:1: rule__OnWriteRoutine__Group_2__2 : rule__OnWriteRoutine__Group_2__2__Impl ;
+    public final void rule__OnWriteRoutine__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37432:1: ( rule__OnWriteRoutine__Group_2__2__Impl )
+            // InternalFormalML.g:37433:2: rule__OnWriteRoutine__Group_2__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OnWriteRoutine__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group_2__2"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__Group_2__2__Impl"
+    // InternalFormalML.g:37439:1: rule__OnWriteRoutine__Group_2__2__Impl : ( ')' ) ;
+    public final void rule__OnWriteRoutine__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37443:1: ( ( ')' ) )
+            // InternalFormalML.g:37444:1: ( ')' )
+            {
+            // InternalFormalML.g:37444:1: ( ')' )
+            // InternalFormalML.g:37445:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getRightParenthesisKeyword_2_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getRightParenthesisKeyword_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group__0"
+    // InternalFormalML.g:37455:1: rule__VariableRoutineParameter__Group__0 : rule__VariableRoutineParameter__Group__0__Impl rule__VariableRoutineParameter__Group__1 ;
+    public final void rule__VariableRoutineParameter__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37459:1: ( rule__VariableRoutineParameter__Group__0__Impl rule__VariableRoutineParameter__Group__1 )
+            // InternalFormalML.g:37460:2: rule__VariableRoutineParameter__Group__0__Impl rule__VariableRoutineParameter__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__VariableRoutineParameter__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableRoutineParameter__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group__0"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group__0__Impl"
+    // InternalFormalML.g:37467:1: rule__VariableRoutineParameter__Group__0__Impl : ( ( rule__VariableRoutineParameter__TypeAssignment_0 )? ) ;
+    public final void rule__VariableRoutineParameter__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37471:1: ( ( ( rule__VariableRoutineParameter__TypeAssignment_0 )? ) )
+            // InternalFormalML.g:37472:1: ( ( rule__VariableRoutineParameter__TypeAssignment_0 )? )
+            {
+            // InternalFormalML.g:37472:1: ( ( rule__VariableRoutineParameter__TypeAssignment_0 )? )
+            // InternalFormalML.g:37473:2: ( rule__VariableRoutineParameter__TypeAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterAccess().getTypeAssignment_0()); 
+            }
+            // InternalFormalML.g:37474:2: ( rule__VariableRoutineParameter__TypeAssignment_0 )?
+            int alt519=2;
+            int LA519_0 = input.LA(1);
+
+            if ( (LA519_0==15||(LA519_0>=17 && LA519_0<=18)||LA519_0==39||(LA519_0>=59 && LA519_0<=74)||(LA519_0>=129 && LA519_0<=132)||LA519_0==149||(LA519_0>=163 && LA519_0<=171)||(LA519_0>=231 && LA519_0<=237)||LA519_0==277) ) {
+                alt519=1;
+            }
+            else if ( (LA519_0==RULE_XLIA_ID) ) {
+                int LA519_2 = input.LA(2);
+
+                if ( (LA519_2==RULE_XLIA_ID||LA519_2==20||LA519_2==22||(LA519_2>=31 && LA519_2<=32)) ) {
+                    alt519=1;
+                }
+            }
+            switch (alt519) {
+                case 1 :
+                    // InternalFormalML.g:37474:3: rule__VariableRoutineParameter__TypeAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableRoutineParameter__TypeAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterAccess().getTypeAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group__0__Impl"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group__1"
+    // InternalFormalML.g:37482:1: rule__VariableRoutineParameter__Group__1 : rule__VariableRoutineParameter__Group__1__Impl rule__VariableRoutineParameter__Group__2 ;
+    public final void rule__VariableRoutineParameter__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37486:1: ( rule__VariableRoutineParameter__Group__1__Impl rule__VariableRoutineParameter__Group__2 )
+            // InternalFormalML.g:37487:2: rule__VariableRoutineParameter__Group__1__Impl rule__VariableRoutineParameter__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_19);
+            rule__VariableRoutineParameter__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableRoutineParameter__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group__1"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group__1__Impl"
+    // InternalFormalML.g:37494:1: rule__VariableRoutineParameter__Group__1__Impl : ( ( rule__VariableRoutineParameter__NameAssignment_1 ) ) ;
+    public final void rule__VariableRoutineParameter__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37498:1: ( ( ( rule__VariableRoutineParameter__NameAssignment_1 ) ) )
+            // InternalFormalML.g:37499:1: ( ( rule__VariableRoutineParameter__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:37499:1: ( ( rule__VariableRoutineParameter__NameAssignment_1 ) )
+            // InternalFormalML.g:37500:2: ( rule__VariableRoutineParameter__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:37501:2: ( rule__VariableRoutineParameter__NameAssignment_1 )
+            // InternalFormalML.g:37501:3: rule__VariableRoutineParameter__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableRoutineParameter__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group__1__Impl"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group__2"
+    // InternalFormalML.g:37509:1: rule__VariableRoutineParameter__Group__2 : rule__VariableRoutineParameter__Group__2__Impl ;
+    public final void rule__VariableRoutineParameter__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37513:1: ( rule__VariableRoutineParameter__Group__2__Impl )
+            // InternalFormalML.g:37514:2: rule__VariableRoutineParameter__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableRoutineParameter__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group__2"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group__2__Impl"
+    // InternalFormalML.g:37520:1: rule__VariableRoutineParameter__Group__2__Impl : ( ( rule__VariableRoutineParameter__Group_2__0 )? ) ;
+    public final void rule__VariableRoutineParameter__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37524:1: ( ( ( rule__VariableRoutineParameter__Group_2__0 )? ) )
+            // InternalFormalML.g:37525:1: ( ( rule__VariableRoutineParameter__Group_2__0 )? )
+            {
+            // InternalFormalML.g:37525:1: ( ( rule__VariableRoutineParameter__Group_2__0 )? )
+            // InternalFormalML.g:37526:2: ( rule__VariableRoutineParameter__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:37527:2: ( rule__VariableRoutineParameter__Group_2__0 )?
+            int alt520=2;
+            int LA520_0 = input.LA(1);
+
+            if ( (LA520_0==100) ) {
+                alt520=1;
+            }
+            switch (alt520) {
+                case 1 :
+                    // InternalFormalML.g:37527:3: rule__VariableRoutineParameter__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableRoutineParameter__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group__2__Impl"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group_2__0"
+    // InternalFormalML.g:37536:1: rule__VariableRoutineParameter__Group_2__0 : rule__VariableRoutineParameter__Group_2__0__Impl rule__VariableRoutineParameter__Group_2__1 ;
+    public final void rule__VariableRoutineParameter__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37540:1: ( rule__VariableRoutineParameter__Group_2__0__Impl rule__VariableRoutineParameter__Group_2__1 )
+            // InternalFormalML.g:37541:2: rule__VariableRoutineParameter__Group_2__0__Impl rule__VariableRoutineParameter__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__VariableRoutineParameter__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableRoutineParameter__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group_2__0"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group_2__0__Impl"
+    // InternalFormalML.g:37548:1: rule__VariableRoutineParameter__Group_2__0__Impl : ( '=' ) ;
+    public final void rule__VariableRoutineParameter__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37552:1: ( ( '=' ) )
+            // InternalFormalML.g:37553:1: ( '=' )
+            {
+            // InternalFormalML.g:37553:1: ( '=' )
+            // InternalFormalML.g:37554:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterAccess().getEqualsSignKeyword_2_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterAccess().getEqualsSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group_2__1"
+    // InternalFormalML.g:37563:1: rule__VariableRoutineParameter__Group_2__1 : rule__VariableRoutineParameter__Group_2__1__Impl ;
+    public final void rule__VariableRoutineParameter__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37567:1: ( rule__VariableRoutineParameter__Group_2__1__Impl )
+            // InternalFormalML.g:37568:2: rule__VariableRoutineParameter__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableRoutineParameter__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group_2__1"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__Group_2__1__Impl"
+    // InternalFormalML.g:37574:1: rule__VariableRoutineParameter__Group_2__1__Impl : ( ( rule__VariableRoutineParameter__DefaultValueAssignment_2_1 ) ) ;
+    public final void rule__VariableRoutineParameter__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37578:1: ( ( ( rule__VariableRoutineParameter__DefaultValueAssignment_2_1 ) ) )
+            // InternalFormalML.g:37579:1: ( ( rule__VariableRoutineParameter__DefaultValueAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:37579:1: ( ( rule__VariableRoutineParameter__DefaultValueAssignment_2_1 ) )
+            // InternalFormalML.g:37580:2: ( rule__VariableRoutineParameter__DefaultValueAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueAssignment_2_1()); 
+            }
+            // InternalFormalML.g:37581:2: ( rule__VariableRoutineParameter__DefaultValueAssignment_2_1 )
+            // InternalFormalML.g:37581:3: rule__VariableRoutineParameter__DefaultValueAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableRoutineParameter__DefaultValueAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__0"
+    // InternalFormalML.g:37590:1: rule__VariablePublic__Group__0 : rule__VariablePublic__Group__0__Impl rule__VariablePublic__Group__1 ;
+    public final void rule__VariablePublic__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37594:1: ( rule__VariablePublic__Group__0__Impl rule__VariablePublic__Group__1 )
+            // InternalFormalML.g:37595:2: rule__VariablePublic__Group__0__Impl rule__VariablePublic__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__VariablePublic__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__0"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__0__Impl"
+    // InternalFormalML.g:37602:1: rule__VariablePublic__Group__0__Impl : ( ( rule__VariablePublic__ModifierAssignment_0 )? ) ;
+    public final void rule__VariablePublic__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37606:1: ( ( ( rule__VariablePublic__ModifierAssignment_0 )? ) )
+            // InternalFormalML.g:37607:1: ( ( rule__VariablePublic__ModifierAssignment_0 )? )
+            {
+            // InternalFormalML.g:37607:1: ( ( rule__VariablePublic__ModifierAssignment_0 )? )
+            // InternalFormalML.g:37608:2: ( rule__VariablePublic__ModifierAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getModifierAssignment_0()); 
+            }
+            // InternalFormalML.g:37609:2: ( rule__VariablePublic__ModifierAssignment_0 )?
+            int alt521=2;
+            switch ( input.LA(1) ) {
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                    {
+                    alt521=1;
+                    }
+                    break;
+                case 179:
+                    {
+                    int LA521_2 = input.LA(2);
+
+                    if ( (synpred808_InternalFormalML()) ) {
+                        alt521=1;
+                    }
+                    }
+                    break;
+                case 283:
+                    {
+                    int LA521_3 = input.LA(2);
+
+                    if ( (synpred808_InternalFormalML()) ) {
+                        alt521=1;
+                    }
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA521_4 = input.LA(2);
+
+                    if ( (synpred808_InternalFormalML()) ) {
+                        alt521=1;
+                    }
+                    }
+                    break;
+                case 16:
+                    {
+                    int LA521_5 = input.LA(2);
+
+                    if ( (synpred808_InternalFormalML()) ) {
+                        alt521=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt521) {
+                case 1 :
+                    // InternalFormalML.g:37609:3: rule__VariablePublic__ModifierAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__ModifierAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getModifierAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__0__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__1"
+    // InternalFormalML.g:37617:1: rule__VariablePublic__Group__1 : rule__VariablePublic__Group__1__Impl rule__VariablePublic__Group__2 ;
+    public final void rule__VariablePublic__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37621:1: ( rule__VariablePublic__Group__1__Impl rule__VariablePublic__Group__2 )
+            // InternalFormalML.g:37622:2: rule__VariablePublic__Group__1__Impl rule__VariablePublic__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__VariablePublic__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__1"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__1__Impl"
+    // InternalFormalML.g:37629:1: rule__VariablePublic__Group__1__Impl : ( ( rule__VariablePublic__UnorderedGroup_1 )? ) ;
+    public final void rule__VariablePublic__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37633:1: ( ( ( rule__VariablePublic__UnorderedGroup_1 )? ) )
+            // InternalFormalML.g:37634:1: ( ( rule__VariablePublic__UnorderedGroup_1 )? )
+            {
+            // InternalFormalML.g:37634:1: ( ( rule__VariablePublic__UnorderedGroup_1 )? )
+            // InternalFormalML.g:37635:2: ( rule__VariablePublic__UnorderedGroup_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1()); 
+            }
+            // InternalFormalML.g:37636:2: ( rule__VariablePublic__UnorderedGroup_1 )?
+            int alt522=2;
+            int LA522_0 = input.LA(1);
+
+            if ( LA522_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt522=1;
+            }
+            else if ( LA522_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt522=1;
+            }
+            else if ( LA522_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+                alt522=1;
+            }
+            else if ( (LA522_0==16) ) {
+                int LA522_4 = input.LA(2);
+
+                if ( (synpred809_InternalFormalML()) ) {
+                    alt522=1;
+                }
+            }
+            switch (alt522) {
+                case 1 :
+                    // InternalFormalML.g:37636:3: rule__VariablePublic__UnorderedGroup_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__UnorderedGroup_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__1__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__2"
+    // InternalFormalML.g:37644:1: rule__VariablePublic__Group__2 : rule__VariablePublic__Group__2__Impl rule__VariablePublic__Group__3 ;
+    public final void rule__VariablePublic__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37648:1: ( rule__VariablePublic__Group__2__Impl rule__VariablePublic__Group__3 )
+            // InternalFormalML.g:37649:2: rule__VariablePublic__Group__2__Impl rule__VariablePublic__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__VariablePublic__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__2"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__2__Impl"
+    // InternalFormalML.g:37656:1: rule__VariablePublic__Group__2__Impl : ( ( rule__VariablePublic__VisibilityAssignment_2 ) ) ;
+    public final void rule__VariablePublic__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37660:1: ( ( ( rule__VariablePublic__VisibilityAssignment_2 ) ) )
+            // InternalFormalML.g:37661:1: ( ( rule__VariablePublic__VisibilityAssignment_2 ) )
+            {
+            // InternalFormalML.g:37661:1: ( ( rule__VariablePublic__VisibilityAssignment_2 ) )
+            // InternalFormalML.g:37662:2: ( rule__VariablePublic__VisibilityAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getVisibilityAssignment_2()); 
+            }
+            // InternalFormalML.g:37663:2: ( rule__VariablePublic__VisibilityAssignment_2 )
+            // InternalFormalML.g:37663:3: rule__VariablePublic__VisibilityAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__VisibilityAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getVisibilityAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__2__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__3"
+    // InternalFormalML.g:37671:1: rule__VariablePublic__Group__3 : rule__VariablePublic__Group__3__Impl rule__VariablePublic__Group__4 ;
+    public final void rule__VariablePublic__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37675:1: ( rule__VariablePublic__Group__3__Impl rule__VariablePublic__Group__4 )
+            // InternalFormalML.g:37676:2: rule__VariablePublic__Group__3__Impl rule__VariablePublic__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__VariablePublic__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__3"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__3__Impl"
+    // InternalFormalML.g:37683:1: rule__VariablePublic__Group__3__Impl : ( ( rule__VariablePublic__TypeAssignment_3 ) ) ;
+    public final void rule__VariablePublic__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37687:1: ( ( ( rule__VariablePublic__TypeAssignment_3 ) ) )
+            // InternalFormalML.g:37688:1: ( ( rule__VariablePublic__TypeAssignment_3 ) )
+            {
+            // InternalFormalML.g:37688:1: ( ( rule__VariablePublic__TypeAssignment_3 ) )
+            // InternalFormalML.g:37689:2: ( rule__VariablePublic__TypeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getTypeAssignment_3()); 
+            }
+            // InternalFormalML.g:37690:2: ( rule__VariablePublic__TypeAssignment_3 )
+            // InternalFormalML.g:37690:3: rule__VariablePublic__TypeAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__TypeAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getTypeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__3__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__4"
+    // InternalFormalML.g:37698:1: rule__VariablePublic__Group__4 : rule__VariablePublic__Group__4__Impl rule__VariablePublic__Group__5 ;
+    public final void rule__VariablePublic__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37702:1: ( rule__VariablePublic__Group__4__Impl rule__VariablePublic__Group__5 )
+            // InternalFormalML.g:37703:2: rule__VariablePublic__Group__4__Impl rule__VariablePublic__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__VariablePublic__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__4"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__4__Impl"
+    // InternalFormalML.g:37710:1: rule__VariablePublic__Group__4__Impl : ( ( rule__VariablePublic__NameAssignment_4 ) ) ;
+    public final void rule__VariablePublic__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37714:1: ( ( ( rule__VariablePublic__NameAssignment_4 ) ) )
+            // InternalFormalML.g:37715:1: ( ( rule__VariablePublic__NameAssignment_4 ) )
+            {
+            // InternalFormalML.g:37715:1: ( ( rule__VariablePublic__NameAssignment_4 ) )
+            // InternalFormalML.g:37716:2: ( rule__VariablePublic__NameAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getNameAssignment_4()); 
+            }
+            // InternalFormalML.g:37717:2: ( rule__VariablePublic__NameAssignment_4 )
+            // InternalFormalML.g:37717:3: rule__VariablePublic__NameAssignment_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__NameAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__4__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__5"
+    // InternalFormalML.g:37725:1: rule__VariablePublic__Group__5 : rule__VariablePublic__Group__5__Impl rule__VariablePublic__Group__6 ;
+    public final void rule__VariablePublic__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37729:1: ( rule__VariablePublic__Group__5__Impl rule__VariablePublic__Group__6 )
+            // InternalFormalML.g:37730:2: rule__VariablePublic__Group__5__Impl rule__VariablePublic__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__VariablePublic__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__5"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__5__Impl"
+    // InternalFormalML.g:37737:1: rule__VariablePublic__Group__5__Impl : ( ( rule__VariablePublic__UnrestrictedNameAssignment_5 )? ) ;
+    public final void rule__VariablePublic__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37741:1: ( ( ( rule__VariablePublic__UnrestrictedNameAssignment_5 )? ) )
+            // InternalFormalML.g:37742:1: ( ( rule__VariablePublic__UnrestrictedNameAssignment_5 )? )
+            {
+            // InternalFormalML.g:37742:1: ( ( rule__VariablePublic__UnrestrictedNameAssignment_5 )? )
+            // InternalFormalML.g:37743:2: ( rule__VariablePublic__UnrestrictedNameAssignment_5 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getUnrestrictedNameAssignment_5()); 
+            }
+            // InternalFormalML.g:37744:2: ( rule__VariablePublic__UnrestrictedNameAssignment_5 )?
+            int alt523=2;
+            int LA523_0 = input.LA(1);
+
+            if ( (LA523_0==RULE_STRING) ) {
+                alt523=1;
+            }
+            switch (alt523) {
+                case 1 :
+                    // InternalFormalML.g:37744:3: rule__VariablePublic__UnrestrictedNameAssignment_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__UnrestrictedNameAssignment_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getUnrestrictedNameAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__5__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__6"
+    // InternalFormalML.g:37752:1: rule__VariablePublic__Group__6 : rule__VariablePublic__Group__6__Impl rule__VariablePublic__Group__7 ;
+    public final void rule__VariablePublic__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37756:1: ( rule__VariablePublic__Group__6__Impl rule__VariablePublic__Group__7 )
+            // InternalFormalML.g:37757:2: rule__VariablePublic__Group__6__Impl rule__VariablePublic__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__VariablePublic__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__6"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__6__Impl"
+    // InternalFormalML.g:37764:1: rule__VariablePublic__Group__6__Impl : ( ( rule__VariablePublic__Group_6__0 )? ) ;
+    public final void rule__VariablePublic__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37768:1: ( ( ( rule__VariablePublic__Group_6__0 )? ) )
+            // InternalFormalML.g:37769:1: ( ( rule__VariablePublic__Group_6__0 )? )
+            {
+            // InternalFormalML.g:37769:1: ( ( rule__VariablePublic__Group_6__0 )? )
+            // InternalFormalML.g:37770:2: ( rule__VariablePublic__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getGroup_6()); 
+            }
+            // InternalFormalML.g:37771:2: ( rule__VariablePublic__Group_6__0 )?
+            int alt524=2;
+            int LA524_0 = input.LA(1);
+
+            if ( (LA524_0==100) ) {
+                alt524=1;
+            }
+            switch (alt524) {
+                case 1 :
+                    // InternalFormalML.g:37771:3: rule__VariablePublic__Group_6__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__6__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__7"
+    // InternalFormalML.g:37779:1: rule__VariablePublic__Group__7 : rule__VariablePublic__Group__7__Impl ;
+    public final void rule__VariablePublic__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37783:1: ( rule__VariablePublic__Group__7__Impl )
+            // InternalFormalML.g:37784:2: rule__VariablePublic__Group__7__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__7"
+
+
+    // $ANTLR start "rule__VariablePublic__Group__7__Impl"
+    // InternalFormalML.g:37790:1: rule__VariablePublic__Group__7__Impl : ( ( rule__VariablePublic__Alternatives_7 ) ) ;
+    public final void rule__VariablePublic__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37794:1: ( ( ( rule__VariablePublic__Alternatives_7 ) ) )
+            // InternalFormalML.g:37795:1: ( ( rule__VariablePublic__Alternatives_7 ) )
+            {
+            // InternalFormalML.g:37795:1: ( ( rule__VariablePublic__Alternatives_7 ) )
+            // InternalFormalML.g:37796:2: ( rule__VariablePublic__Alternatives_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getAlternatives_7()); 
+            }
+            // InternalFormalML.g:37797:2: ( rule__VariablePublic__Alternatives_7 )
+            // InternalFormalML.g:37797:3: rule__VariablePublic__Alternatives_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Alternatives_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getAlternatives_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group__7__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_6__0"
+    // InternalFormalML.g:37806:1: rule__VariablePublic__Group_6__0 : rule__VariablePublic__Group_6__0__Impl rule__VariablePublic__Group_6__1 ;
+    public final void rule__VariablePublic__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37810:1: ( rule__VariablePublic__Group_6__0__Impl rule__VariablePublic__Group_6__1 )
+            // InternalFormalML.g:37811:2: rule__VariablePublic__Group_6__0__Impl rule__VariablePublic__Group_6__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__VariablePublic__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_6__0"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_6__0__Impl"
+    // InternalFormalML.g:37818:1: rule__VariablePublic__Group_6__0__Impl : ( '=' ) ;
+    public final void rule__VariablePublic__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37822:1: ( ( '=' ) )
+            // InternalFormalML.g:37823:1: ( '=' )
+            {
+            // InternalFormalML.g:37823:1: ( '=' )
+            // InternalFormalML.g:37824:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getEqualsSignKeyword_6_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getEqualsSignKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_6__1"
+    // InternalFormalML.g:37833:1: rule__VariablePublic__Group_6__1 : rule__VariablePublic__Group_6__1__Impl ;
+    public final void rule__VariablePublic__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37837:1: ( rule__VariablePublic__Group_6__1__Impl )
+            // InternalFormalML.g:37838:2: rule__VariablePublic__Group_6__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_6__1"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_6__1__Impl"
+    // InternalFormalML.g:37844:1: rule__VariablePublic__Group_6__1__Impl : ( ( rule__VariablePublic__DefaultValueAssignment_6_1 ) ) ;
+    public final void rule__VariablePublic__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37848:1: ( ( ( rule__VariablePublic__DefaultValueAssignment_6_1 ) ) )
+            // InternalFormalML.g:37849:1: ( ( rule__VariablePublic__DefaultValueAssignment_6_1 ) )
+            {
+            // InternalFormalML.g:37849:1: ( ( rule__VariablePublic__DefaultValueAssignment_6_1 ) )
+            // InternalFormalML.g:37850:2: ( rule__VariablePublic__DefaultValueAssignment_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getDefaultValueAssignment_6_1()); 
+            }
+            // InternalFormalML.g:37851:2: ( rule__VariablePublic__DefaultValueAssignment_6_1 )
+            // InternalFormalML.g:37851:3: rule__VariablePublic__DefaultValueAssignment_6_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__DefaultValueAssignment_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getDefaultValueAssignment_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_7_0__0"
+    // InternalFormalML.g:37860:1: rule__VariablePublic__Group_7_0__0 : rule__VariablePublic__Group_7_0__0__Impl rule__VariablePublic__Group_7_0__1 ;
+    public final void rule__VariablePublic__Group_7_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37864:1: ( rule__VariablePublic__Group_7_0__0__Impl rule__VariablePublic__Group_7_0__1 )
+            // InternalFormalML.g:37865:2: rule__VariablePublic__Group_7_0__0__Impl rule__VariablePublic__Group_7_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_172);
+            rule__VariablePublic__Group_7_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group_7_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_7_0__0"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_7_0__0__Impl"
+    // InternalFormalML.g:37872:1: rule__VariablePublic__Group_7_0__0__Impl : ( '{' ) ;
+    public final void rule__VariablePublic__Group_7_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37876:1: ( ( '{' ) )
+            // InternalFormalML.g:37877:1: ( '{' )
+            {
+            // InternalFormalML.g:37877:1: ( '{' )
+            // InternalFormalML.g:37878:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getLeftCurlyBracketKeyword_7_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getLeftCurlyBracketKeyword_7_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_7_0__0__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_7_0__1"
+    // InternalFormalML.g:37887:1: rule__VariablePublic__Group_7_0__1 : rule__VariablePublic__Group_7_0__1__Impl rule__VariablePublic__Group_7_0__2 ;
+    public final void rule__VariablePublic__Group_7_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37891:1: ( rule__VariablePublic__Group_7_0__1__Impl rule__VariablePublic__Group_7_0__2 )
+            // InternalFormalML.g:37892:2: rule__VariablePublic__Group_7_0__1__Impl rule__VariablePublic__Group_7_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__VariablePublic__Group_7_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group_7_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_7_0__1"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_7_0__1__Impl"
+    // InternalFormalML.g:37899:1: rule__VariablePublic__Group_7_0__1__Impl : ( ( rule__VariablePublic__OnWriteActionAssignment_7_0_1 ) ) ;
+    public final void rule__VariablePublic__Group_7_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37903:1: ( ( ( rule__VariablePublic__OnWriteActionAssignment_7_0_1 ) ) )
+            // InternalFormalML.g:37904:1: ( ( rule__VariablePublic__OnWriteActionAssignment_7_0_1 ) )
+            {
+            // InternalFormalML.g:37904:1: ( ( rule__VariablePublic__OnWriteActionAssignment_7_0_1 ) )
+            // InternalFormalML.g:37905:2: ( rule__VariablePublic__OnWriteActionAssignment_7_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getOnWriteActionAssignment_7_0_1()); 
+            }
+            // InternalFormalML.g:37906:2: ( rule__VariablePublic__OnWriteActionAssignment_7_0_1 )
+            // InternalFormalML.g:37906:3: rule__VariablePublic__OnWriteActionAssignment_7_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__OnWriteActionAssignment_7_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getOnWriteActionAssignment_7_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_7_0__1__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_7_0__2"
+    // InternalFormalML.g:37914:1: rule__VariablePublic__Group_7_0__2 : rule__VariablePublic__Group_7_0__2__Impl ;
+    public final void rule__VariablePublic__Group_7_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37918:1: ( rule__VariablePublic__Group_7_0__2__Impl )
+            // InternalFormalML.g:37919:2: rule__VariablePublic__Group_7_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__Group_7_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_7_0__2"
+
+
+    // $ANTLR start "rule__VariablePublic__Group_7_0__2__Impl"
+    // InternalFormalML.g:37925:1: rule__VariablePublic__Group_7_0__2__Impl : ( '}' ) ;
+    public final void rule__VariablePublic__Group_7_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37929:1: ( ( '}' ) )
+            // InternalFormalML.g:37930:1: ( '}' )
+            {
+            // InternalFormalML.g:37930:1: ( '}' )
+            // InternalFormalML.g:37931:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getRightCurlyBracketKeyword_7_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getRightCurlyBracketKeyword_7_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__Group_7_0__2__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__0"
+    // InternalFormalML.g:37941:1: rule__VariableProtected__Group__0 : rule__VariableProtected__Group__0__Impl rule__VariableProtected__Group__1 ;
+    public final void rule__VariableProtected__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37945:1: ( rule__VariableProtected__Group__0__Impl rule__VariableProtected__Group__1 )
+            // InternalFormalML.g:37946:2: rule__VariableProtected__Group__0__Impl rule__VariableProtected__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__VariableProtected__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__0"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__0__Impl"
+    // InternalFormalML.g:37953:1: rule__VariableProtected__Group__0__Impl : ( ( rule__VariableProtected__ModifierAssignment_0 )? ) ;
+    public final void rule__VariableProtected__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37957:1: ( ( ( rule__VariableProtected__ModifierAssignment_0 )? ) )
+            // InternalFormalML.g:37958:1: ( ( rule__VariableProtected__ModifierAssignment_0 )? )
+            {
+            // InternalFormalML.g:37958:1: ( ( rule__VariableProtected__ModifierAssignment_0 )? )
+            // InternalFormalML.g:37959:2: ( rule__VariableProtected__ModifierAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getModifierAssignment_0()); 
+            }
+            // InternalFormalML.g:37960:2: ( rule__VariableProtected__ModifierAssignment_0 )?
+            int alt525=2;
+            switch ( input.LA(1) ) {
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                    {
+                    alt525=1;
+                    }
+                    break;
+                case 179:
+                    {
+                    int LA525_2 = input.LA(2);
+
+                    if ( (synpred812_InternalFormalML()) ) {
+                        alt525=1;
+                    }
+                    }
+                    break;
+                case 283:
+                    {
+                    int LA525_3 = input.LA(2);
+
+                    if ( (synpred812_InternalFormalML()) ) {
+                        alt525=1;
+                    }
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA525_4 = input.LA(2);
+
+                    if ( (synpred812_InternalFormalML()) ) {
+                        alt525=1;
+                    }
+                    }
+                    break;
+                case 16:
+                    {
+                    int LA525_5 = input.LA(2);
+
+                    if ( (synpred812_InternalFormalML()) ) {
+                        alt525=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt525) {
+                case 1 :
+                    // InternalFormalML.g:37960:3: rule__VariableProtected__ModifierAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__ModifierAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getModifierAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__0__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__1"
+    // InternalFormalML.g:37968:1: rule__VariableProtected__Group__1 : rule__VariableProtected__Group__1__Impl rule__VariableProtected__Group__2 ;
+    public final void rule__VariableProtected__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37972:1: ( rule__VariableProtected__Group__1__Impl rule__VariableProtected__Group__2 )
+            // InternalFormalML.g:37973:2: rule__VariableProtected__Group__1__Impl rule__VariableProtected__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__VariableProtected__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__1"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__1__Impl"
+    // InternalFormalML.g:37980:1: rule__VariableProtected__Group__1__Impl : ( ( rule__VariableProtected__UnorderedGroup_1 )? ) ;
+    public final void rule__VariableProtected__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37984:1: ( ( ( rule__VariableProtected__UnorderedGroup_1 )? ) )
+            // InternalFormalML.g:37985:1: ( ( rule__VariableProtected__UnorderedGroup_1 )? )
+            {
+            // InternalFormalML.g:37985:1: ( ( rule__VariableProtected__UnorderedGroup_1 )? )
+            // InternalFormalML.g:37986:2: ( rule__VariableProtected__UnorderedGroup_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1()); 
+            }
+            // InternalFormalML.g:37987:2: ( rule__VariableProtected__UnorderedGroup_1 )?
+            int alt526=2;
+            int LA526_0 = input.LA(1);
+
+            if ( LA526_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt526=1;
+            }
+            else if ( LA526_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt526=1;
+            }
+            else if ( LA526_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+                alt526=1;
+            }
+            else if ( (LA526_0==16) ) {
+                int LA526_4 = input.LA(2);
+
+                if ( (synpred813_InternalFormalML()) ) {
+                    alt526=1;
+                }
+            }
+            switch (alt526) {
+                case 1 :
+                    // InternalFormalML.g:37987:3: rule__VariableProtected__UnorderedGroup_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__UnorderedGroup_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__1__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__2"
+    // InternalFormalML.g:37995:1: rule__VariableProtected__Group__2 : rule__VariableProtected__Group__2__Impl rule__VariableProtected__Group__3 ;
+    public final void rule__VariableProtected__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:37999:1: ( rule__VariableProtected__Group__2__Impl rule__VariableProtected__Group__3 )
+            // InternalFormalML.g:38000:2: rule__VariableProtected__Group__2__Impl rule__VariableProtected__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__VariableProtected__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__2"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__2__Impl"
+    // InternalFormalML.g:38007:1: rule__VariableProtected__Group__2__Impl : ( ( rule__VariableProtected__VisibilityAssignment_2 ) ) ;
+    public final void rule__VariableProtected__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38011:1: ( ( ( rule__VariableProtected__VisibilityAssignment_2 ) ) )
+            // InternalFormalML.g:38012:1: ( ( rule__VariableProtected__VisibilityAssignment_2 ) )
+            {
+            // InternalFormalML.g:38012:1: ( ( rule__VariableProtected__VisibilityAssignment_2 ) )
+            // InternalFormalML.g:38013:2: ( rule__VariableProtected__VisibilityAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getVisibilityAssignment_2()); 
+            }
+            // InternalFormalML.g:38014:2: ( rule__VariableProtected__VisibilityAssignment_2 )
+            // InternalFormalML.g:38014:3: rule__VariableProtected__VisibilityAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__VisibilityAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getVisibilityAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__2__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__3"
+    // InternalFormalML.g:38022:1: rule__VariableProtected__Group__3 : rule__VariableProtected__Group__3__Impl rule__VariableProtected__Group__4 ;
+    public final void rule__VariableProtected__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38026:1: ( rule__VariableProtected__Group__3__Impl rule__VariableProtected__Group__4 )
+            // InternalFormalML.g:38027:2: rule__VariableProtected__Group__3__Impl rule__VariableProtected__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__VariableProtected__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__3"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__3__Impl"
+    // InternalFormalML.g:38034:1: rule__VariableProtected__Group__3__Impl : ( ( rule__VariableProtected__TypeAssignment_3 ) ) ;
+    public final void rule__VariableProtected__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38038:1: ( ( ( rule__VariableProtected__TypeAssignment_3 ) ) )
+            // InternalFormalML.g:38039:1: ( ( rule__VariableProtected__TypeAssignment_3 ) )
+            {
+            // InternalFormalML.g:38039:1: ( ( rule__VariableProtected__TypeAssignment_3 ) )
+            // InternalFormalML.g:38040:2: ( rule__VariableProtected__TypeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getTypeAssignment_3()); 
+            }
+            // InternalFormalML.g:38041:2: ( rule__VariableProtected__TypeAssignment_3 )
+            // InternalFormalML.g:38041:3: rule__VariableProtected__TypeAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__TypeAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getTypeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__3__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__4"
+    // InternalFormalML.g:38049:1: rule__VariableProtected__Group__4 : rule__VariableProtected__Group__4__Impl rule__VariableProtected__Group__5 ;
+    public final void rule__VariableProtected__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38053:1: ( rule__VariableProtected__Group__4__Impl rule__VariableProtected__Group__5 )
+            // InternalFormalML.g:38054:2: rule__VariableProtected__Group__4__Impl rule__VariableProtected__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__VariableProtected__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__4"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__4__Impl"
+    // InternalFormalML.g:38061:1: rule__VariableProtected__Group__4__Impl : ( ( rule__VariableProtected__NameAssignment_4 ) ) ;
+    public final void rule__VariableProtected__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38065:1: ( ( ( rule__VariableProtected__NameAssignment_4 ) ) )
+            // InternalFormalML.g:38066:1: ( ( rule__VariableProtected__NameAssignment_4 ) )
+            {
+            // InternalFormalML.g:38066:1: ( ( rule__VariableProtected__NameAssignment_4 ) )
+            // InternalFormalML.g:38067:2: ( rule__VariableProtected__NameAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getNameAssignment_4()); 
+            }
+            // InternalFormalML.g:38068:2: ( rule__VariableProtected__NameAssignment_4 )
+            // InternalFormalML.g:38068:3: rule__VariableProtected__NameAssignment_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__NameAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__4__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__5"
+    // InternalFormalML.g:38076:1: rule__VariableProtected__Group__5 : rule__VariableProtected__Group__5__Impl rule__VariableProtected__Group__6 ;
+    public final void rule__VariableProtected__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38080:1: ( rule__VariableProtected__Group__5__Impl rule__VariableProtected__Group__6 )
+            // InternalFormalML.g:38081:2: rule__VariableProtected__Group__5__Impl rule__VariableProtected__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__VariableProtected__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__5"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__5__Impl"
+    // InternalFormalML.g:38088:1: rule__VariableProtected__Group__5__Impl : ( ( rule__VariableProtected__UnrestrictedNameAssignment_5 )? ) ;
+    public final void rule__VariableProtected__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38092:1: ( ( ( rule__VariableProtected__UnrestrictedNameAssignment_5 )? ) )
+            // InternalFormalML.g:38093:1: ( ( rule__VariableProtected__UnrestrictedNameAssignment_5 )? )
+            {
+            // InternalFormalML.g:38093:1: ( ( rule__VariableProtected__UnrestrictedNameAssignment_5 )? )
+            // InternalFormalML.g:38094:2: ( rule__VariableProtected__UnrestrictedNameAssignment_5 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameAssignment_5()); 
+            }
+            // InternalFormalML.g:38095:2: ( rule__VariableProtected__UnrestrictedNameAssignment_5 )?
+            int alt527=2;
+            int LA527_0 = input.LA(1);
+
+            if ( (LA527_0==RULE_STRING) ) {
+                alt527=1;
+            }
+            switch (alt527) {
+                case 1 :
+                    // InternalFormalML.g:38095:3: rule__VariableProtected__UnrestrictedNameAssignment_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__UnrestrictedNameAssignment_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__5__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__6"
+    // InternalFormalML.g:38103:1: rule__VariableProtected__Group__6 : rule__VariableProtected__Group__6__Impl rule__VariableProtected__Group__7 ;
+    public final void rule__VariableProtected__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38107:1: ( rule__VariableProtected__Group__6__Impl rule__VariableProtected__Group__7 )
+            // InternalFormalML.g:38108:2: rule__VariableProtected__Group__6__Impl rule__VariableProtected__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__VariableProtected__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__6"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__6__Impl"
+    // InternalFormalML.g:38115:1: rule__VariableProtected__Group__6__Impl : ( ( rule__VariableProtected__Group_6__0 )? ) ;
+    public final void rule__VariableProtected__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38119:1: ( ( ( rule__VariableProtected__Group_6__0 )? ) )
+            // InternalFormalML.g:38120:1: ( ( rule__VariableProtected__Group_6__0 )? )
+            {
+            // InternalFormalML.g:38120:1: ( ( rule__VariableProtected__Group_6__0 )? )
+            // InternalFormalML.g:38121:2: ( rule__VariableProtected__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getGroup_6()); 
+            }
+            // InternalFormalML.g:38122:2: ( rule__VariableProtected__Group_6__0 )?
+            int alt528=2;
+            int LA528_0 = input.LA(1);
+
+            if ( (LA528_0==100) ) {
+                alt528=1;
+            }
+            switch (alt528) {
+                case 1 :
+                    // InternalFormalML.g:38122:3: rule__VariableProtected__Group_6__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__6__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__7"
+    // InternalFormalML.g:38130:1: rule__VariableProtected__Group__7 : rule__VariableProtected__Group__7__Impl ;
+    public final void rule__VariableProtected__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38134:1: ( rule__VariableProtected__Group__7__Impl )
+            // InternalFormalML.g:38135:2: rule__VariableProtected__Group__7__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__7"
+
+
+    // $ANTLR start "rule__VariableProtected__Group__7__Impl"
+    // InternalFormalML.g:38141:1: rule__VariableProtected__Group__7__Impl : ( ( rule__VariableProtected__Alternatives_7 ) ) ;
+    public final void rule__VariableProtected__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38145:1: ( ( ( rule__VariableProtected__Alternatives_7 ) ) )
+            // InternalFormalML.g:38146:1: ( ( rule__VariableProtected__Alternatives_7 ) )
+            {
+            // InternalFormalML.g:38146:1: ( ( rule__VariableProtected__Alternatives_7 ) )
+            // InternalFormalML.g:38147:2: ( rule__VariableProtected__Alternatives_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getAlternatives_7()); 
+            }
+            // InternalFormalML.g:38148:2: ( rule__VariableProtected__Alternatives_7 )
+            // InternalFormalML.g:38148:3: rule__VariableProtected__Alternatives_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Alternatives_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getAlternatives_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group__7__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_6__0"
+    // InternalFormalML.g:38157:1: rule__VariableProtected__Group_6__0 : rule__VariableProtected__Group_6__0__Impl rule__VariableProtected__Group_6__1 ;
+    public final void rule__VariableProtected__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38161:1: ( rule__VariableProtected__Group_6__0__Impl rule__VariableProtected__Group_6__1 )
+            // InternalFormalML.g:38162:2: rule__VariableProtected__Group_6__0__Impl rule__VariableProtected__Group_6__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__VariableProtected__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_6__0"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_6__0__Impl"
+    // InternalFormalML.g:38169:1: rule__VariableProtected__Group_6__0__Impl : ( '=' ) ;
+    public final void rule__VariableProtected__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38173:1: ( ( '=' ) )
+            // InternalFormalML.g:38174:1: ( '=' )
+            {
+            // InternalFormalML.g:38174:1: ( '=' )
+            // InternalFormalML.g:38175:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getEqualsSignKeyword_6_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getEqualsSignKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_6__1"
+    // InternalFormalML.g:38184:1: rule__VariableProtected__Group_6__1 : rule__VariableProtected__Group_6__1__Impl ;
+    public final void rule__VariableProtected__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38188:1: ( rule__VariableProtected__Group_6__1__Impl )
+            // InternalFormalML.g:38189:2: rule__VariableProtected__Group_6__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_6__1"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_6__1__Impl"
+    // InternalFormalML.g:38195:1: rule__VariableProtected__Group_6__1__Impl : ( ( rule__VariableProtected__DefaultValueAssignment_6_1 ) ) ;
+    public final void rule__VariableProtected__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38199:1: ( ( ( rule__VariableProtected__DefaultValueAssignment_6_1 ) ) )
+            // InternalFormalML.g:38200:1: ( ( rule__VariableProtected__DefaultValueAssignment_6_1 ) )
+            {
+            // InternalFormalML.g:38200:1: ( ( rule__VariableProtected__DefaultValueAssignment_6_1 ) )
+            // InternalFormalML.g:38201:2: ( rule__VariableProtected__DefaultValueAssignment_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getDefaultValueAssignment_6_1()); 
+            }
+            // InternalFormalML.g:38202:2: ( rule__VariableProtected__DefaultValueAssignment_6_1 )
+            // InternalFormalML.g:38202:3: rule__VariableProtected__DefaultValueAssignment_6_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__DefaultValueAssignment_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getDefaultValueAssignment_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_7_0__0"
+    // InternalFormalML.g:38211:1: rule__VariableProtected__Group_7_0__0 : rule__VariableProtected__Group_7_0__0__Impl rule__VariableProtected__Group_7_0__1 ;
+    public final void rule__VariableProtected__Group_7_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38215:1: ( rule__VariableProtected__Group_7_0__0__Impl rule__VariableProtected__Group_7_0__1 )
+            // InternalFormalML.g:38216:2: rule__VariableProtected__Group_7_0__0__Impl rule__VariableProtected__Group_7_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_172);
+            rule__VariableProtected__Group_7_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group_7_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_7_0__0"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_7_0__0__Impl"
+    // InternalFormalML.g:38223:1: rule__VariableProtected__Group_7_0__0__Impl : ( '{' ) ;
+    public final void rule__VariableProtected__Group_7_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38227:1: ( ( '{' ) )
+            // InternalFormalML.g:38228:1: ( '{' )
+            {
+            // InternalFormalML.g:38228:1: ( '{' )
+            // InternalFormalML.g:38229:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getLeftCurlyBracketKeyword_7_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getLeftCurlyBracketKeyword_7_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_7_0__0__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_7_0__1"
+    // InternalFormalML.g:38238:1: rule__VariableProtected__Group_7_0__1 : rule__VariableProtected__Group_7_0__1__Impl rule__VariableProtected__Group_7_0__2 ;
+    public final void rule__VariableProtected__Group_7_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38242:1: ( rule__VariableProtected__Group_7_0__1__Impl rule__VariableProtected__Group_7_0__2 )
+            // InternalFormalML.g:38243:2: rule__VariableProtected__Group_7_0__1__Impl rule__VariableProtected__Group_7_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__VariableProtected__Group_7_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group_7_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_7_0__1"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_7_0__1__Impl"
+    // InternalFormalML.g:38250:1: rule__VariableProtected__Group_7_0__1__Impl : ( ( rule__VariableProtected__OnWriteActionAssignment_7_0_1 ) ) ;
+    public final void rule__VariableProtected__Group_7_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38254:1: ( ( ( rule__VariableProtected__OnWriteActionAssignment_7_0_1 ) ) )
+            // InternalFormalML.g:38255:1: ( ( rule__VariableProtected__OnWriteActionAssignment_7_0_1 ) )
+            {
+            // InternalFormalML.g:38255:1: ( ( rule__VariableProtected__OnWriteActionAssignment_7_0_1 ) )
+            // InternalFormalML.g:38256:2: ( rule__VariableProtected__OnWriteActionAssignment_7_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getOnWriteActionAssignment_7_0_1()); 
+            }
+            // InternalFormalML.g:38257:2: ( rule__VariableProtected__OnWriteActionAssignment_7_0_1 )
+            // InternalFormalML.g:38257:3: rule__VariableProtected__OnWriteActionAssignment_7_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__OnWriteActionAssignment_7_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getOnWriteActionAssignment_7_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_7_0__1__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_7_0__2"
+    // InternalFormalML.g:38265:1: rule__VariableProtected__Group_7_0__2 : rule__VariableProtected__Group_7_0__2__Impl ;
+    public final void rule__VariableProtected__Group_7_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38269:1: ( rule__VariableProtected__Group_7_0__2__Impl )
+            // InternalFormalML.g:38270:2: rule__VariableProtected__Group_7_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__Group_7_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_7_0__2"
+
+
+    // $ANTLR start "rule__VariableProtected__Group_7_0__2__Impl"
+    // InternalFormalML.g:38276:1: rule__VariableProtected__Group_7_0__2__Impl : ( '}' ) ;
+    public final void rule__VariableProtected__Group_7_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38280:1: ( ( '}' ) )
+            // InternalFormalML.g:38281:1: ( '}' )
+            {
+            // InternalFormalML.g:38281:1: ( '}' )
+            // InternalFormalML.g:38282:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getRightCurlyBracketKeyword_7_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getRightCurlyBracketKeyword_7_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__Group_7_0__2__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__0"
+    // InternalFormalML.g:38292:1: rule__VariablePrivate__Group__0 : rule__VariablePrivate__Group__0__Impl rule__VariablePrivate__Group__1 ;
+    public final void rule__VariablePrivate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38296:1: ( rule__VariablePrivate__Group__0__Impl rule__VariablePrivate__Group__1 )
+            // InternalFormalML.g:38297:2: rule__VariablePrivate__Group__0__Impl rule__VariablePrivate__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_40);
+            rule__VariablePrivate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__0"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__0__Impl"
+    // InternalFormalML.g:38304:1: rule__VariablePrivate__Group__0__Impl : ( ( rule__VariablePrivate__ModifierAssignment_0 )? ) ;
+    public final void rule__VariablePrivate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38308:1: ( ( ( rule__VariablePrivate__ModifierAssignment_0 )? ) )
+            // InternalFormalML.g:38309:1: ( ( rule__VariablePrivate__ModifierAssignment_0 )? )
+            {
+            // InternalFormalML.g:38309:1: ( ( rule__VariablePrivate__ModifierAssignment_0 )? )
+            // InternalFormalML.g:38310:2: ( rule__VariablePrivate__ModifierAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getModifierAssignment_0()); 
+            }
+            // InternalFormalML.g:38311:2: ( rule__VariablePrivate__ModifierAssignment_0 )?
+            int alt529=2;
+            switch ( input.LA(1) ) {
+                case 278:
+                case 279:
+                case 280:
+                case 281:
+                    {
+                    alt529=1;
+                    }
+                    break;
+                case 179:
+                    {
+                    int LA529_2 = input.LA(2);
+
+                    if ( (synpred816_InternalFormalML()) ) {
+                        alt529=1;
+                    }
+                    }
+                    break;
+                case 283:
+                    {
+                    int LA529_3 = input.LA(2);
+
+                    if ( (synpred816_InternalFormalML()) ) {
+                        alt529=1;
+                    }
+                    }
+                    break;
+                case 224:
+                    {
+                    int LA529_4 = input.LA(2);
+
+                    if ( (synpred816_InternalFormalML()) ) {
+                        alt529=1;
+                    }
+                    }
+                    break;
+                case 16:
+                    {
+                    int LA529_5 = input.LA(2);
+
+                    if ( (synpred816_InternalFormalML()) ) {
+                        alt529=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt529) {
+                case 1 :
+                    // InternalFormalML.g:38311:3: rule__VariablePrivate__ModifierAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__ModifierAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getModifierAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__1"
+    // InternalFormalML.g:38319:1: rule__VariablePrivate__Group__1 : rule__VariablePrivate__Group__1__Impl rule__VariablePrivate__Group__2 ;
+    public final void rule__VariablePrivate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38323:1: ( rule__VariablePrivate__Group__1__Impl rule__VariablePrivate__Group__2 )
+            // InternalFormalML.g:38324:2: rule__VariablePrivate__Group__1__Impl rule__VariablePrivate__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_70);
+            rule__VariablePrivate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__1"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__1__Impl"
+    // InternalFormalML.g:38331:1: rule__VariablePrivate__Group__1__Impl : ( ( rule__VariablePrivate__UnorderedGroup_1 )? ) ;
+    public final void rule__VariablePrivate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38335:1: ( ( ( rule__VariablePrivate__UnorderedGroup_1 )? ) )
+            // InternalFormalML.g:38336:1: ( ( rule__VariablePrivate__UnorderedGroup_1 )? )
+            {
+            // InternalFormalML.g:38336:1: ( ( rule__VariablePrivate__UnorderedGroup_1 )? )
+            // InternalFormalML.g:38337:2: ( rule__VariablePrivate__UnorderedGroup_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1()); 
+            }
+            // InternalFormalML.g:38338:2: ( rule__VariablePrivate__UnorderedGroup_1 )?
+            int alt530=2;
+            int LA530_0 = input.LA(1);
+
+            if ( LA530_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt530=1;
+            }
+            else if ( LA530_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt530=1;
+            }
+            else if ( LA530_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+                alt530=1;
+            }
+            else if ( (LA530_0==16) ) {
+                int LA530_4 = input.LA(2);
+
+                if ( (synpred817_InternalFormalML()) ) {
+                    alt530=1;
+                }
+            }
+            switch (alt530) {
+                case 1 :
+                    // InternalFormalML.g:38338:3: rule__VariablePrivate__UnorderedGroup_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__UnorderedGroup_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__2"
+    // InternalFormalML.g:38346:1: rule__VariablePrivate__Group__2 : rule__VariablePrivate__Group__2__Impl rule__VariablePrivate__Group__3 ;
+    public final void rule__VariablePrivate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38350:1: ( rule__VariablePrivate__Group__2__Impl rule__VariablePrivate__Group__3 )
+            // InternalFormalML.g:38351:2: rule__VariablePrivate__Group__2__Impl rule__VariablePrivate__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__VariablePrivate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__2"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__2__Impl"
+    // InternalFormalML.g:38358:1: rule__VariablePrivate__Group__2__Impl : ( ( rule__VariablePrivate__VisibilityAssignment_2 ) ) ;
+    public final void rule__VariablePrivate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38362:1: ( ( ( rule__VariablePrivate__VisibilityAssignment_2 ) ) )
+            // InternalFormalML.g:38363:1: ( ( rule__VariablePrivate__VisibilityAssignment_2 ) )
+            {
+            // InternalFormalML.g:38363:1: ( ( rule__VariablePrivate__VisibilityAssignment_2 ) )
+            // InternalFormalML.g:38364:2: ( rule__VariablePrivate__VisibilityAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getVisibilityAssignment_2()); 
+            }
+            // InternalFormalML.g:38365:2: ( rule__VariablePrivate__VisibilityAssignment_2 )
+            // InternalFormalML.g:38365:3: rule__VariablePrivate__VisibilityAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__VisibilityAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getVisibilityAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__3"
+    // InternalFormalML.g:38373:1: rule__VariablePrivate__Group__3 : rule__VariablePrivate__Group__3__Impl rule__VariablePrivate__Group__4 ;
+    public final void rule__VariablePrivate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38377:1: ( rule__VariablePrivate__Group__3__Impl rule__VariablePrivate__Group__4 )
+            // InternalFormalML.g:38378:2: rule__VariablePrivate__Group__3__Impl rule__VariablePrivate__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__VariablePrivate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__3"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__3__Impl"
+    // InternalFormalML.g:38385:1: rule__VariablePrivate__Group__3__Impl : ( ( rule__VariablePrivate__TypeAssignment_3 ) ) ;
+    public final void rule__VariablePrivate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38389:1: ( ( ( rule__VariablePrivate__TypeAssignment_3 ) ) )
+            // InternalFormalML.g:38390:1: ( ( rule__VariablePrivate__TypeAssignment_3 ) )
+            {
+            // InternalFormalML.g:38390:1: ( ( rule__VariablePrivate__TypeAssignment_3 ) )
+            // InternalFormalML.g:38391:2: ( rule__VariablePrivate__TypeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getTypeAssignment_3()); 
+            }
+            // InternalFormalML.g:38392:2: ( rule__VariablePrivate__TypeAssignment_3 )
+            // InternalFormalML.g:38392:3: rule__VariablePrivate__TypeAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__TypeAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getTypeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__4"
+    // InternalFormalML.g:38400:1: rule__VariablePrivate__Group__4 : rule__VariablePrivate__Group__4__Impl rule__VariablePrivate__Group__5 ;
+    public final void rule__VariablePrivate__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38404:1: ( rule__VariablePrivate__Group__4__Impl rule__VariablePrivate__Group__5 )
+            // InternalFormalML.g:38405:2: rule__VariablePrivate__Group__4__Impl rule__VariablePrivate__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__VariablePrivate__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__4"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__4__Impl"
+    // InternalFormalML.g:38412:1: rule__VariablePrivate__Group__4__Impl : ( ( rule__VariablePrivate__NameAssignment_4 ) ) ;
+    public final void rule__VariablePrivate__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38416:1: ( ( ( rule__VariablePrivate__NameAssignment_4 ) ) )
+            // InternalFormalML.g:38417:1: ( ( rule__VariablePrivate__NameAssignment_4 ) )
+            {
+            // InternalFormalML.g:38417:1: ( ( rule__VariablePrivate__NameAssignment_4 ) )
+            // InternalFormalML.g:38418:2: ( rule__VariablePrivate__NameAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getNameAssignment_4()); 
+            }
+            // InternalFormalML.g:38419:2: ( rule__VariablePrivate__NameAssignment_4 )
+            // InternalFormalML.g:38419:3: rule__VariablePrivate__NameAssignment_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__NameAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__4__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__5"
+    // InternalFormalML.g:38427:1: rule__VariablePrivate__Group__5 : rule__VariablePrivate__Group__5__Impl rule__VariablePrivate__Group__6 ;
+    public final void rule__VariablePrivate__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38431:1: ( rule__VariablePrivate__Group__5__Impl rule__VariablePrivate__Group__6 )
+            // InternalFormalML.g:38432:2: rule__VariablePrivate__Group__5__Impl rule__VariablePrivate__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__VariablePrivate__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__5"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__5__Impl"
+    // InternalFormalML.g:38439:1: rule__VariablePrivate__Group__5__Impl : ( ( rule__VariablePrivate__UnrestrictedNameAssignment_5 )? ) ;
+    public final void rule__VariablePrivate__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38443:1: ( ( ( rule__VariablePrivate__UnrestrictedNameAssignment_5 )? ) )
+            // InternalFormalML.g:38444:1: ( ( rule__VariablePrivate__UnrestrictedNameAssignment_5 )? )
+            {
+            // InternalFormalML.g:38444:1: ( ( rule__VariablePrivate__UnrestrictedNameAssignment_5 )? )
+            // InternalFormalML.g:38445:2: ( rule__VariablePrivate__UnrestrictedNameAssignment_5 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameAssignment_5()); 
+            }
+            // InternalFormalML.g:38446:2: ( rule__VariablePrivate__UnrestrictedNameAssignment_5 )?
+            int alt531=2;
+            int LA531_0 = input.LA(1);
+
+            if ( (LA531_0==RULE_STRING) ) {
+                alt531=1;
+            }
+            switch (alt531) {
+                case 1 :
+                    // InternalFormalML.g:38446:3: rule__VariablePrivate__UnrestrictedNameAssignment_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__UnrestrictedNameAssignment_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__5__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__6"
+    // InternalFormalML.g:38454:1: rule__VariablePrivate__Group__6 : rule__VariablePrivate__Group__6__Impl rule__VariablePrivate__Group__7 ;
+    public final void rule__VariablePrivate__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38458:1: ( rule__VariablePrivate__Group__6__Impl rule__VariablePrivate__Group__7 )
+            // InternalFormalML.g:38459:2: rule__VariablePrivate__Group__6__Impl rule__VariablePrivate__Group__7
+            {
+            pushFollow(FollowSets000.FOLLOW_169);
+            rule__VariablePrivate__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__6"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__6__Impl"
+    // InternalFormalML.g:38466:1: rule__VariablePrivate__Group__6__Impl : ( ( rule__VariablePrivate__Group_6__0 )? ) ;
+    public final void rule__VariablePrivate__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38470:1: ( ( ( rule__VariablePrivate__Group_6__0 )? ) )
+            // InternalFormalML.g:38471:1: ( ( rule__VariablePrivate__Group_6__0 )? )
+            {
+            // InternalFormalML.g:38471:1: ( ( rule__VariablePrivate__Group_6__0 )? )
+            // InternalFormalML.g:38472:2: ( rule__VariablePrivate__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getGroup_6()); 
+            }
+            // InternalFormalML.g:38473:2: ( rule__VariablePrivate__Group_6__0 )?
+            int alt532=2;
+            int LA532_0 = input.LA(1);
+
+            if ( (LA532_0==100) ) {
+                alt532=1;
+            }
+            switch (alt532) {
+                case 1 :
+                    // InternalFormalML.g:38473:3: rule__VariablePrivate__Group_6__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__6__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__7"
+    // InternalFormalML.g:38481:1: rule__VariablePrivate__Group__7 : rule__VariablePrivate__Group__7__Impl ;
+    public final void rule__VariablePrivate__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38485:1: ( rule__VariablePrivate__Group__7__Impl )
+            // InternalFormalML.g:38486:2: rule__VariablePrivate__Group__7__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__7"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group__7__Impl"
+    // InternalFormalML.g:38492:1: rule__VariablePrivate__Group__7__Impl : ( ( rule__VariablePrivate__Alternatives_7 ) ) ;
+    public final void rule__VariablePrivate__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38496:1: ( ( ( rule__VariablePrivate__Alternatives_7 ) ) )
+            // InternalFormalML.g:38497:1: ( ( rule__VariablePrivate__Alternatives_7 ) )
+            {
+            // InternalFormalML.g:38497:1: ( ( rule__VariablePrivate__Alternatives_7 ) )
+            // InternalFormalML.g:38498:2: ( rule__VariablePrivate__Alternatives_7 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getAlternatives_7()); 
+            }
+            // InternalFormalML.g:38499:2: ( rule__VariablePrivate__Alternatives_7 )
+            // InternalFormalML.g:38499:3: rule__VariablePrivate__Alternatives_7
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Alternatives_7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getAlternatives_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group__7__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_6__0"
+    // InternalFormalML.g:38508:1: rule__VariablePrivate__Group_6__0 : rule__VariablePrivate__Group_6__0__Impl rule__VariablePrivate__Group_6__1 ;
+    public final void rule__VariablePrivate__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38512:1: ( rule__VariablePrivate__Group_6__0__Impl rule__VariablePrivate__Group_6__1 )
+            // InternalFormalML.g:38513:2: rule__VariablePrivate__Group_6__0__Impl rule__VariablePrivate__Group_6__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__VariablePrivate__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_6__0"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_6__0__Impl"
+    // InternalFormalML.g:38520:1: rule__VariablePrivate__Group_6__0__Impl : ( '=' ) ;
+    public final void rule__VariablePrivate__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38524:1: ( ( '=' ) )
+            // InternalFormalML.g:38525:1: ( '=' )
+            {
+            // InternalFormalML.g:38525:1: ( '=' )
+            // InternalFormalML.g:38526:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getEqualsSignKeyword_6_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getEqualsSignKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_6__1"
+    // InternalFormalML.g:38535:1: rule__VariablePrivate__Group_6__1 : rule__VariablePrivate__Group_6__1__Impl ;
+    public final void rule__VariablePrivate__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38539:1: ( rule__VariablePrivate__Group_6__1__Impl )
+            // InternalFormalML.g:38540:2: rule__VariablePrivate__Group_6__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_6__1"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_6__1__Impl"
+    // InternalFormalML.g:38546:1: rule__VariablePrivate__Group_6__1__Impl : ( ( rule__VariablePrivate__DefaultValueAssignment_6_1 ) ) ;
+    public final void rule__VariablePrivate__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38550:1: ( ( ( rule__VariablePrivate__DefaultValueAssignment_6_1 ) ) )
+            // InternalFormalML.g:38551:1: ( ( rule__VariablePrivate__DefaultValueAssignment_6_1 ) )
+            {
+            // InternalFormalML.g:38551:1: ( ( rule__VariablePrivate__DefaultValueAssignment_6_1 ) )
+            // InternalFormalML.g:38552:2: ( rule__VariablePrivate__DefaultValueAssignment_6_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getDefaultValueAssignment_6_1()); 
+            }
+            // InternalFormalML.g:38553:2: ( rule__VariablePrivate__DefaultValueAssignment_6_1 )
+            // InternalFormalML.g:38553:3: rule__VariablePrivate__DefaultValueAssignment_6_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__DefaultValueAssignment_6_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getDefaultValueAssignment_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_7_0__0"
+    // InternalFormalML.g:38562:1: rule__VariablePrivate__Group_7_0__0 : rule__VariablePrivate__Group_7_0__0__Impl rule__VariablePrivate__Group_7_0__1 ;
+    public final void rule__VariablePrivate__Group_7_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38566:1: ( rule__VariablePrivate__Group_7_0__0__Impl rule__VariablePrivate__Group_7_0__1 )
+            // InternalFormalML.g:38567:2: rule__VariablePrivate__Group_7_0__0__Impl rule__VariablePrivate__Group_7_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_172);
+            rule__VariablePrivate__Group_7_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group_7_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_7_0__0"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_7_0__0__Impl"
+    // InternalFormalML.g:38574:1: rule__VariablePrivate__Group_7_0__0__Impl : ( '{' ) ;
+    public final void rule__VariablePrivate__Group_7_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38578:1: ( ( '{' ) )
+            // InternalFormalML.g:38579:1: ( '{' )
+            {
+            // InternalFormalML.g:38579:1: ( '{' )
+            // InternalFormalML.g:38580:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getLeftCurlyBracketKeyword_7_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getLeftCurlyBracketKeyword_7_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_7_0__0__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_7_0__1"
+    // InternalFormalML.g:38589:1: rule__VariablePrivate__Group_7_0__1 : rule__VariablePrivate__Group_7_0__1__Impl rule__VariablePrivate__Group_7_0__2 ;
+    public final void rule__VariablePrivate__Group_7_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38593:1: ( rule__VariablePrivate__Group_7_0__1__Impl rule__VariablePrivate__Group_7_0__2 )
+            // InternalFormalML.g:38594:2: rule__VariablePrivate__Group_7_0__1__Impl rule__VariablePrivate__Group_7_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__VariablePrivate__Group_7_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group_7_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_7_0__1"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_7_0__1__Impl"
+    // InternalFormalML.g:38601:1: rule__VariablePrivate__Group_7_0__1__Impl : ( ( rule__VariablePrivate__OnWriteActionAssignment_7_0_1 ) ) ;
+    public final void rule__VariablePrivate__Group_7_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38605:1: ( ( ( rule__VariablePrivate__OnWriteActionAssignment_7_0_1 ) ) )
+            // InternalFormalML.g:38606:1: ( ( rule__VariablePrivate__OnWriteActionAssignment_7_0_1 ) )
+            {
+            // InternalFormalML.g:38606:1: ( ( rule__VariablePrivate__OnWriteActionAssignment_7_0_1 ) )
+            // InternalFormalML.g:38607:2: ( rule__VariablePrivate__OnWriteActionAssignment_7_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getOnWriteActionAssignment_7_0_1()); 
+            }
+            // InternalFormalML.g:38608:2: ( rule__VariablePrivate__OnWriteActionAssignment_7_0_1 )
+            // InternalFormalML.g:38608:3: rule__VariablePrivate__OnWriteActionAssignment_7_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__OnWriteActionAssignment_7_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getOnWriteActionAssignment_7_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_7_0__1__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_7_0__2"
+    // InternalFormalML.g:38616:1: rule__VariablePrivate__Group_7_0__2 : rule__VariablePrivate__Group_7_0__2__Impl ;
+    public final void rule__VariablePrivate__Group_7_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38620:1: ( rule__VariablePrivate__Group_7_0__2__Impl )
+            // InternalFormalML.g:38621:2: rule__VariablePrivate__Group_7_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__Group_7_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_7_0__2"
+
+
+    // $ANTLR start "rule__VariablePrivate__Group_7_0__2__Impl"
+    // InternalFormalML.g:38627:1: rule__VariablePrivate__Group_7_0__2__Impl : ( '}' ) ;
+    public final void rule__VariablePrivate__Group_7_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38631:1: ( ( '}' ) )
+            // InternalFormalML.g:38632:1: ( '}' )
+            {
+            // InternalFormalML.g:38632:1: ( '}' )
+            // InternalFormalML.g:38633:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getRightCurlyBracketKeyword_7_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getRightCurlyBracketKeyword_7_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__Group_7_0__2__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group__0"
+    // InternalFormalML.g:38643:1: rule__FunctionalParameterSet__Group__0 : rule__FunctionalParameterSet__Group__0__Impl rule__FunctionalParameterSet__Group__1 ;
+    public final void rule__FunctionalParameterSet__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38647:1: ( rule__FunctionalParameterSet__Group__0__Impl rule__FunctionalParameterSet__Group__1 )
+            // InternalFormalML.g:38648:2: rule__FunctionalParameterSet__Group__0__Impl rule__FunctionalParameterSet__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__FunctionalParameterSet__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameterSet__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group__0"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group__0__Impl"
+    // InternalFormalML.g:38655:1: rule__FunctionalParameterSet__Group__0__Impl : ( () ) ;
+    public final void rule__FunctionalParameterSet__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38659:1: ( ( () ) )
+            // InternalFormalML.g:38660:1: ( () )
+            {
+            // InternalFormalML.g:38660:1: ( () )
+            // InternalFormalML.g:38661:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterSetAccess().getParameterSetAction_0()); 
+            }
+            // InternalFormalML.g:38662:2: ()
+            // InternalFormalML.g:38662:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterSetAccess().getParameterSetAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group__0__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group__1"
+    // InternalFormalML.g:38670:1: rule__FunctionalParameterSet__Group__1 : rule__FunctionalParameterSet__Group__1__Impl rule__FunctionalParameterSet__Group__2 ;
+    public final void rule__FunctionalParameterSet__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38674:1: ( rule__FunctionalParameterSet__Group__1__Impl rule__FunctionalParameterSet__Group__2 )
+            // InternalFormalML.g:38675:2: rule__FunctionalParameterSet__Group__1__Impl rule__FunctionalParameterSet__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__FunctionalParameterSet__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameterSet__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group__1"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group__1__Impl"
+    // InternalFormalML.g:38682:1: rule__FunctionalParameterSet__Group__1__Impl : ( ( rule__FunctionalParameterSet__ParameterAssignment_1 ) ) ;
+    public final void rule__FunctionalParameterSet__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38686:1: ( ( ( rule__FunctionalParameterSet__ParameterAssignment_1 ) ) )
+            // InternalFormalML.g:38687:1: ( ( rule__FunctionalParameterSet__ParameterAssignment_1 ) )
+            {
+            // InternalFormalML.g:38687:1: ( ( rule__FunctionalParameterSet__ParameterAssignment_1 ) )
+            // InternalFormalML.g:38688:2: ( rule__FunctionalParameterSet__ParameterAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_1()); 
+            }
+            // InternalFormalML.g:38689:2: ( rule__FunctionalParameterSet__ParameterAssignment_1 )
+            // InternalFormalML.g:38689:3: rule__FunctionalParameterSet__ParameterAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameterSet__ParameterAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group__1__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group__2"
+    // InternalFormalML.g:38697:1: rule__FunctionalParameterSet__Group__2 : rule__FunctionalParameterSet__Group__2__Impl ;
+    public final void rule__FunctionalParameterSet__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38701:1: ( rule__FunctionalParameterSet__Group__2__Impl )
+            // InternalFormalML.g:38702:2: rule__FunctionalParameterSet__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameterSet__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group__2"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group__2__Impl"
+    // InternalFormalML.g:38708:1: rule__FunctionalParameterSet__Group__2__Impl : ( ( rule__FunctionalParameterSet__Group_2__0 )* ) ;
+    public final void rule__FunctionalParameterSet__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38712:1: ( ( ( rule__FunctionalParameterSet__Group_2__0 )* ) )
+            // InternalFormalML.g:38713:1: ( ( rule__FunctionalParameterSet__Group_2__0 )* )
+            {
+            // InternalFormalML.g:38713:1: ( ( rule__FunctionalParameterSet__Group_2__0 )* )
+            // InternalFormalML.g:38714:2: ( rule__FunctionalParameterSet__Group_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterSetAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:38715:2: ( rule__FunctionalParameterSet__Group_2__0 )*
+            loop533:
+            do {
+                int alt533=2;
+                int LA533_0 = input.LA(1);
+
+                if ( (LA533_0==198) ) {
+                    alt533=1;
+                }
+
+
+                switch (alt533) {
+            	case 1 :
+            	    // InternalFormalML.g:38715:3: rule__FunctionalParameterSet__Group_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__FunctionalParameterSet__Group_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop533;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterSetAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group__2__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group_2__0"
+    // InternalFormalML.g:38724:1: rule__FunctionalParameterSet__Group_2__0 : rule__FunctionalParameterSet__Group_2__0__Impl rule__FunctionalParameterSet__Group_2__1 ;
+    public final void rule__FunctionalParameterSet__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38728:1: ( rule__FunctionalParameterSet__Group_2__0__Impl rule__FunctionalParameterSet__Group_2__1 )
+            // InternalFormalML.g:38729:2: rule__FunctionalParameterSet__Group_2__0__Impl rule__FunctionalParameterSet__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__FunctionalParameterSet__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameterSet__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group_2__0"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group_2__0__Impl"
+    // InternalFormalML.g:38736:1: rule__FunctionalParameterSet__Group_2__0__Impl : ( ',' ) ;
+    public final void rule__FunctionalParameterSet__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38740:1: ( ( ',' ) )
+            // InternalFormalML.g:38741:1: ( ',' )
+            {
+            // InternalFormalML.g:38741:1: ( ',' )
+            // InternalFormalML.g:38742:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterSetAccess().getCommaKeyword_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterSetAccess().getCommaKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group_2__1"
+    // InternalFormalML.g:38751:1: rule__FunctionalParameterSet__Group_2__1 : rule__FunctionalParameterSet__Group_2__1__Impl ;
+    public final void rule__FunctionalParameterSet__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38755:1: ( rule__FunctionalParameterSet__Group_2__1__Impl )
+            // InternalFormalML.g:38756:2: rule__FunctionalParameterSet__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameterSet__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group_2__1"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__Group_2__1__Impl"
+    // InternalFormalML.g:38762:1: rule__FunctionalParameterSet__Group_2__1__Impl : ( ( rule__FunctionalParameterSet__ParameterAssignment_2_1 ) ) ;
+    public final void rule__FunctionalParameterSet__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38766:1: ( ( ( rule__FunctionalParameterSet__ParameterAssignment_2_1 ) ) )
+            // InternalFormalML.g:38767:1: ( ( rule__FunctionalParameterSet__ParameterAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:38767:1: ( ( rule__FunctionalParameterSet__ParameterAssignment_2_1 ) )
+            // InternalFormalML.g:38768:2: ( rule__FunctionalParameterSet__ParameterAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_2_1()); 
+            }
+            // InternalFormalML.g:38769:2: ( rule__FunctionalParameterSet__ParameterAssignment_2_1 )
+            // InternalFormalML.g:38769:3: rule__FunctionalParameterSet__ParameterAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameterSet__ParameterAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterSetAccess().getParameterAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__0"
+    // InternalFormalML.g:38778:1: rule__FunctionalParameter__Group__0 : rule__FunctionalParameter__Group__0__Impl rule__FunctionalParameter__Group__1 ;
+    public final void rule__FunctionalParameter__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38782:1: ( rule__FunctionalParameter__Group__0__Impl rule__FunctionalParameter__Group__1 )
+            // InternalFormalML.g:38783:2: rule__FunctionalParameter__Group__0__Impl rule__FunctionalParameter__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__FunctionalParameter__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__0"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__0__Impl"
+    // InternalFormalML.g:38790:1: rule__FunctionalParameter__Group__0__Impl : ( () ) ;
+    public final void rule__FunctionalParameter__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38794:1: ( ( () ) )
+            // InternalFormalML.g:38795:1: ( () )
+            {
+            // InternalFormalML.g:38795:1: ( () )
+            // InternalFormalML.g:38796:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getParameterAction_0()); 
+            }
+            // InternalFormalML.g:38797:2: ()
+            // InternalFormalML.g:38797:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getParameterAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__0__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__1"
+    // InternalFormalML.g:38805:1: rule__FunctionalParameter__Group__1 : rule__FunctionalParameter__Group__1__Impl rule__FunctionalParameter__Group__2 ;
+    public final void rule__FunctionalParameter__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38809:1: ( rule__FunctionalParameter__Group__1__Impl rule__FunctionalParameter__Group__2 )
+            // InternalFormalML.g:38810:2: rule__FunctionalParameter__Group__1__Impl rule__FunctionalParameter__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__FunctionalParameter__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__1"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__1__Impl"
+    // InternalFormalML.g:38817:1: rule__FunctionalParameter__Group__1__Impl : ( ( rule__FunctionalParameter__DirectionAssignment_1 )? ) ;
+    public final void rule__FunctionalParameter__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38821:1: ( ( ( rule__FunctionalParameter__DirectionAssignment_1 )? ) )
+            // InternalFormalML.g:38822:1: ( ( rule__FunctionalParameter__DirectionAssignment_1 )? )
+            {
+            // InternalFormalML.g:38822:1: ( ( rule__FunctionalParameter__DirectionAssignment_1 )? )
+            // InternalFormalML.g:38823:2: ( rule__FunctionalParameter__DirectionAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getDirectionAssignment_1()); 
+            }
+            // InternalFormalML.g:38824:2: ( rule__FunctionalParameter__DirectionAssignment_1 )?
+            int alt534=2;
+            int LA534_0 = input.LA(1);
+
+            if ( (LA534_0==157||(LA534_0>=172 && LA534_0<=174)) ) {
+                alt534=1;
+            }
+            switch (alt534) {
+                case 1 :
+                    // InternalFormalML.g:38824:3: rule__FunctionalParameter__DirectionAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__FunctionalParameter__DirectionAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getDirectionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__1__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__2"
+    // InternalFormalML.g:38832:1: rule__FunctionalParameter__Group__2 : rule__FunctionalParameter__Group__2__Impl rule__FunctionalParameter__Group__3 ;
+    public final void rule__FunctionalParameter__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38836:1: ( rule__FunctionalParameter__Group__2__Impl rule__FunctionalParameter__Group__3 )
+            // InternalFormalML.g:38837:2: rule__FunctionalParameter__Group__2__Impl rule__FunctionalParameter__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__FunctionalParameter__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__2"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__2__Impl"
+    // InternalFormalML.g:38844:1: rule__FunctionalParameter__Group__2__Impl : ( ( rule__FunctionalParameter__TypeAssignment_2 ) ) ;
+    public final void rule__FunctionalParameter__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38848:1: ( ( ( rule__FunctionalParameter__TypeAssignment_2 ) ) )
+            // InternalFormalML.g:38849:1: ( ( rule__FunctionalParameter__TypeAssignment_2 ) )
+            {
+            // InternalFormalML.g:38849:1: ( ( rule__FunctionalParameter__TypeAssignment_2 ) )
+            // InternalFormalML.g:38850:2: ( rule__FunctionalParameter__TypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getTypeAssignment_2()); 
+            }
+            // InternalFormalML.g:38851:2: ( rule__FunctionalParameter__TypeAssignment_2 )
+            // InternalFormalML.g:38851:3: rule__FunctionalParameter__TypeAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__TypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__2__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__3"
+    // InternalFormalML.g:38859:1: rule__FunctionalParameter__Group__3 : rule__FunctionalParameter__Group__3__Impl rule__FunctionalParameter__Group__4 ;
+    public final void rule__FunctionalParameter__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38863:1: ( rule__FunctionalParameter__Group__3__Impl rule__FunctionalParameter__Group__4 )
+            // InternalFormalML.g:38864:2: rule__FunctionalParameter__Group__3__Impl rule__FunctionalParameter__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_19);
+            rule__FunctionalParameter__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__3"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__3__Impl"
+    // InternalFormalML.g:38871:1: rule__FunctionalParameter__Group__3__Impl : ( ( rule__FunctionalParameter__NameAssignment_3 ) ) ;
+    public final void rule__FunctionalParameter__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38875:1: ( ( ( rule__FunctionalParameter__NameAssignment_3 ) ) )
+            // InternalFormalML.g:38876:1: ( ( rule__FunctionalParameter__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:38876:1: ( ( rule__FunctionalParameter__NameAssignment_3 ) )
+            // InternalFormalML.g:38877:2: ( rule__FunctionalParameter__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:38878:2: ( rule__FunctionalParameter__NameAssignment_3 )
+            // InternalFormalML.g:38878:3: rule__FunctionalParameter__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__3__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__4"
+    // InternalFormalML.g:38886:1: rule__FunctionalParameter__Group__4 : rule__FunctionalParameter__Group__4__Impl ;
+    public final void rule__FunctionalParameter__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38890:1: ( rule__FunctionalParameter__Group__4__Impl )
+            // InternalFormalML.g:38891:2: rule__FunctionalParameter__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__4"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group__4__Impl"
+    // InternalFormalML.g:38897:1: rule__FunctionalParameter__Group__4__Impl : ( ( rule__FunctionalParameter__Group_4__0 )? ) ;
+    public final void rule__FunctionalParameter__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38901:1: ( ( ( rule__FunctionalParameter__Group_4__0 )? ) )
+            // InternalFormalML.g:38902:1: ( ( rule__FunctionalParameter__Group_4__0 )? )
+            {
+            // InternalFormalML.g:38902:1: ( ( rule__FunctionalParameter__Group_4__0 )? )
+            // InternalFormalML.g:38903:2: ( rule__FunctionalParameter__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:38904:2: ( rule__FunctionalParameter__Group_4__0 )?
+            int alt535=2;
+            int LA535_0 = input.LA(1);
+
+            if ( (LA535_0==100) ) {
+                alt535=1;
+            }
+            switch (alt535) {
+                case 1 :
+                    // InternalFormalML.g:38904:3: rule__FunctionalParameter__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__FunctionalParameter__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group__4__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group_4__0"
+    // InternalFormalML.g:38913:1: rule__FunctionalParameter__Group_4__0 : rule__FunctionalParameter__Group_4__0__Impl rule__FunctionalParameter__Group_4__1 ;
+    public final void rule__FunctionalParameter__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38917:1: ( rule__FunctionalParameter__Group_4__0__Impl rule__FunctionalParameter__Group_4__1 )
+            // InternalFormalML.g:38918:2: rule__FunctionalParameter__Group_4__0__Impl rule__FunctionalParameter__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__FunctionalParameter__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group_4__0"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group_4__0__Impl"
+    // InternalFormalML.g:38925:1: rule__FunctionalParameter__Group_4__0__Impl : ( '=' ) ;
+    public final void rule__FunctionalParameter__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38929:1: ( ( '=' ) )
+            // InternalFormalML.g:38930:1: ( '=' )
+            {
+            // InternalFormalML.g:38930:1: ( '=' )
+            // InternalFormalML.g:38931:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getEqualsSignKeyword_4_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getEqualsSignKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group_4__1"
+    // InternalFormalML.g:38940:1: rule__FunctionalParameter__Group_4__1 : rule__FunctionalParameter__Group_4__1__Impl ;
+    public final void rule__FunctionalParameter__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38944:1: ( rule__FunctionalParameter__Group_4__1__Impl )
+            // InternalFormalML.g:38945:2: rule__FunctionalParameter__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group_4__1"
+
+
+    // $ANTLR start "rule__FunctionalParameter__Group_4__1__Impl"
+    // InternalFormalML.g:38951:1: rule__FunctionalParameter__Group_4__1__Impl : ( ( rule__FunctionalParameter__DefaultValueAssignment_4_1 ) ) ;
+    public final void rule__FunctionalParameter__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38955:1: ( ( ( rule__FunctionalParameter__DefaultValueAssignment_4_1 ) ) )
+            // InternalFormalML.g:38956:1: ( ( rule__FunctionalParameter__DefaultValueAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:38956:1: ( ( rule__FunctionalParameter__DefaultValueAssignment_4_1 ) )
+            // InternalFormalML.g:38957:2: ( rule__FunctionalParameter__DefaultValueAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getDefaultValueAssignment_4_1()); 
+            }
+            // InternalFormalML.g:38958:2: ( rule__FunctionalParameter__DefaultValueAssignment_4_1 )
+            // InternalFormalML.g:38958:3: rule__FunctionalParameter__DefaultValueAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FunctionalParameter__DefaultValueAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getDefaultValueAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group__0"
+    // InternalFormalML.g:38967:1: rule__FormalParameterSet__Group__0 : rule__FormalParameterSet__Group__0__Impl rule__FormalParameterSet__Group__1 ;
+    public final void rule__FormalParameterSet__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38971:1: ( rule__FormalParameterSet__Group__0__Impl rule__FormalParameterSet__Group__1 )
+            // InternalFormalML.g:38972:2: rule__FormalParameterSet__Group__0__Impl rule__FormalParameterSet__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_65);
+            rule__FormalParameterSet__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameterSet__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group__0"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group__0__Impl"
+    // InternalFormalML.g:38979:1: rule__FormalParameterSet__Group__0__Impl : ( () ) ;
+    public final void rule__FormalParameterSet__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38983:1: ( ( () ) )
+            // InternalFormalML.g:38984:1: ( () )
+            {
+            // InternalFormalML.g:38984:1: ( () )
+            // InternalFormalML.g:38985:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterSetAccess().getParameterSetAction_0()); 
+            }
+            // InternalFormalML.g:38986:2: ()
+            // InternalFormalML.g:38986:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterSetAccess().getParameterSetAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group__0__Impl"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group__1"
+    // InternalFormalML.g:38994:1: rule__FormalParameterSet__Group__1 : rule__FormalParameterSet__Group__1__Impl rule__FormalParameterSet__Group__2 ;
+    public final void rule__FormalParameterSet__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:38998:1: ( rule__FormalParameterSet__Group__1__Impl rule__FormalParameterSet__Group__2 )
+            // InternalFormalML.g:38999:2: rule__FormalParameterSet__Group__1__Impl rule__FormalParameterSet__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__FormalParameterSet__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameterSet__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group__1"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group__1__Impl"
+    // InternalFormalML.g:39006:1: rule__FormalParameterSet__Group__1__Impl : ( ( rule__FormalParameterSet__ParameterAssignment_1 ) ) ;
+    public final void rule__FormalParameterSet__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39010:1: ( ( ( rule__FormalParameterSet__ParameterAssignment_1 ) ) )
+            // InternalFormalML.g:39011:1: ( ( rule__FormalParameterSet__ParameterAssignment_1 ) )
+            {
+            // InternalFormalML.g:39011:1: ( ( rule__FormalParameterSet__ParameterAssignment_1 ) )
+            // InternalFormalML.g:39012:2: ( rule__FormalParameterSet__ParameterAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_1()); 
+            }
+            // InternalFormalML.g:39013:2: ( rule__FormalParameterSet__ParameterAssignment_1 )
+            // InternalFormalML.g:39013:3: rule__FormalParameterSet__ParameterAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameterSet__ParameterAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group__1__Impl"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group__2"
+    // InternalFormalML.g:39021:1: rule__FormalParameterSet__Group__2 : rule__FormalParameterSet__Group__2__Impl ;
+    public final void rule__FormalParameterSet__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39025:1: ( rule__FormalParameterSet__Group__2__Impl )
+            // InternalFormalML.g:39026:2: rule__FormalParameterSet__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameterSet__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group__2"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group__2__Impl"
+    // InternalFormalML.g:39032:1: rule__FormalParameterSet__Group__2__Impl : ( ( rule__FormalParameterSet__Group_2__0 )* ) ;
+    public final void rule__FormalParameterSet__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39036:1: ( ( ( rule__FormalParameterSet__Group_2__0 )* ) )
+            // InternalFormalML.g:39037:1: ( ( rule__FormalParameterSet__Group_2__0 )* )
+            {
+            // InternalFormalML.g:39037:1: ( ( rule__FormalParameterSet__Group_2__0 )* )
+            // InternalFormalML.g:39038:2: ( rule__FormalParameterSet__Group_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterSetAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:39039:2: ( rule__FormalParameterSet__Group_2__0 )*
+            loop536:
+            do {
+                int alt536=2;
+                int LA536_0 = input.LA(1);
+
+                if ( (LA536_0==198) ) {
+                    alt536=1;
+                }
+
+
+                switch (alt536) {
+            	case 1 :
+            	    // InternalFormalML.g:39039:3: rule__FormalParameterSet__Group_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__FormalParameterSet__Group_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop536;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterSetAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group__2__Impl"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group_2__0"
+    // InternalFormalML.g:39048:1: rule__FormalParameterSet__Group_2__0 : rule__FormalParameterSet__Group_2__0__Impl rule__FormalParameterSet__Group_2__1 ;
+    public final void rule__FormalParameterSet__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39052:1: ( rule__FormalParameterSet__Group_2__0__Impl rule__FormalParameterSet__Group_2__1 )
+            // InternalFormalML.g:39053:2: rule__FormalParameterSet__Group_2__0__Impl rule__FormalParameterSet__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__FormalParameterSet__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameterSet__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group_2__0"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group_2__0__Impl"
+    // InternalFormalML.g:39060:1: rule__FormalParameterSet__Group_2__0__Impl : ( ',' ) ;
+    public final void rule__FormalParameterSet__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39064:1: ( ( ',' ) )
+            // InternalFormalML.g:39065:1: ( ',' )
+            {
+            // InternalFormalML.g:39065:1: ( ',' )
+            // InternalFormalML.g:39066:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterSetAccess().getCommaKeyword_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterSetAccess().getCommaKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group_2__1"
+    // InternalFormalML.g:39075:1: rule__FormalParameterSet__Group_2__1 : rule__FormalParameterSet__Group_2__1__Impl ;
+    public final void rule__FormalParameterSet__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39079:1: ( rule__FormalParameterSet__Group_2__1__Impl )
+            // InternalFormalML.g:39080:2: rule__FormalParameterSet__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameterSet__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group_2__1"
+
+
+    // $ANTLR start "rule__FormalParameterSet__Group_2__1__Impl"
+    // InternalFormalML.g:39086:1: rule__FormalParameterSet__Group_2__1__Impl : ( ( rule__FormalParameterSet__ParameterAssignment_2_1 ) ) ;
+    public final void rule__FormalParameterSet__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39090:1: ( ( ( rule__FormalParameterSet__ParameterAssignment_2_1 ) ) )
+            // InternalFormalML.g:39091:1: ( ( rule__FormalParameterSet__ParameterAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:39091:1: ( ( rule__FormalParameterSet__ParameterAssignment_2_1 ) )
+            // InternalFormalML.g:39092:2: ( rule__FormalParameterSet__ParameterAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_2_1()); 
+            }
+            // InternalFormalML.g:39093:2: ( rule__FormalParameterSet__ParameterAssignment_2_1 )
+            // InternalFormalML.g:39093:3: rule__FormalParameterSet__ParameterAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameterSet__ParameterAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterSetAccess().getParameterAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__0"
+    // InternalFormalML.g:39102:1: rule__FormalParameter__Group__0 : rule__FormalParameter__Group__0__Impl rule__FormalParameter__Group__1 ;
+    public final void rule__FormalParameter__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39106:1: ( rule__FormalParameter__Group__0__Impl rule__FormalParameter__Group__1 )
+            // InternalFormalML.g:39107:2: rule__FormalParameter__Group__0__Impl rule__FormalParameter__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__FormalParameter__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__0"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__0__Impl"
+    // InternalFormalML.g:39114:1: rule__FormalParameter__Group__0__Impl : ( () ) ;
+    public final void rule__FormalParameter__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39118:1: ( ( () ) )
+            // InternalFormalML.g:39119:1: ( () )
+            {
+            // InternalFormalML.g:39119:1: ( () )
+            // InternalFormalML.g:39120:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getParameterAction_0()); 
+            }
+            // InternalFormalML.g:39121:2: ()
+            // InternalFormalML.g:39121:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getParameterAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__0__Impl"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__1"
+    // InternalFormalML.g:39129:1: rule__FormalParameter__Group__1 : rule__FormalParameter__Group__1__Impl rule__FormalParameter__Group__2 ;
+    public final void rule__FormalParameter__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39133:1: ( rule__FormalParameter__Group__1__Impl rule__FormalParameter__Group__2 )
+            // InternalFormalML.g:39134:2: rule__FormalParameter__Group__1__Impl rule__FormalParameter__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__FormalParameter__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__1"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__1__Impl"
+    // InternalFormalML.g:39141:1: rule__FormalParameter__Group__1__Impl : ( ( rule__FormalParameter__DirectionAssignment_1 )? ) ;
+    public final void rule__FormalParameter__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39145:1: ( ( ( rule__FormalParameter__DirectionAssignment_1 )? ) )
+            // InternalFormalML.g:39146:1: ( ( rule__FormalParameter__DirectionAssignment_1 )? )
+            {
+            // InternalFormalML.g:39146:1: ( ( rule__FormalParameter__DirectionAssignment_1 )? )
+            // InternalFormalML.g:39147:2: ( rule__FormalParameter__DirectionAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getDirectionAssignment_1()); 
+            }
+            // InternalFormalML.g:39148:2: ( rule__FormalParameter__DirectionAssignment_1 )?
+            int alt537=2;
+            int LA537_0 = input.LA(1);
+
+            if ( (LA537_0==157||(LA537_0>=172 && LA537_0<=174)) ) {
+                alt537=1;
+            }
+            switch (alt537) {
+                case 1 :
+                    // InternalFormalML.g:39148:3: rule__FormalParameter__DirectionAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__FormalParameter__DirectionAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getDirectionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__1__Impl"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__2"
+    // InternalFormalML.g:39156:1: rule__FormalParameter__Group__2 : rule__FormalParameter__Group__2__Impl rule__FormalParameter__Group__3 ;
+    public final void rule__FormalParameter__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39160:1: ( rule__FormalParameter__Group__2__Impl rule__FormalParameter__Group__3 )
+            // InternalFormalML.g:39161:2: rule__FormalParameter__Group__2__Impl rule__FormalParameter__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_173);
+            rule__FormalParameter__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__2"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__2__Impl"
+    // InternalFormalML.g:39168:1: rule__FormalParameter__Group__2__Impl : ( ( rule__FormalParameter__TypeAssignment_2 ) ) ;
+    public final void rule__FormalParameter__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39172:1: ( ( ( rule__FormalParameter__TypeAssignment_2 ) ) )
+            // InternalFormalML.g:39173:1: ( ( rule__FormalParameter__TypeAssignment_2 ) )
+            {
+            // InternalFormalML.g:39173:1: ( ( rule__FormalParameter__TypeAssignment_2 ) )
+            // InternalFormalML.g:39174:2: ( rule__FormalParameter__TypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getTypeAssignment_2()); 
+            }
+            // InternalFormalML.g:39175:2: ( rule__FormalParameter__TypeAssignment_2 )
+            // InternalFormalML.g:39175:3: rule__FormalParameter__TypeAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__TypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__2__Impl"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__3"
+    // InternalFormalML.g:39183:1: rule__FormalParameter__Group__3 : rule__FormalParameter__Group__3__Impl rule__FormalParameter__Group__4 ;
+    public final void rule__FormalParameter__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39187:1: ( rule__FormalParameter__Group__3__Impl rule__FormalParameter__Group__4 )
+            // InternalFormalML.g:39188:2: rule__FormalParameter__Group__3__Impl rule__FormalParameter__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_173);
+            rule__FormalParameter__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__3"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__3__Impl"
+    // InternalFormalML.g:39195:1: rule__FormalParameter__Group__3__Impl : ( ( rule__FormalParameter__NameAssignment_3 )? ) ;
+    public final void rule__FormalParameter__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39199:1: ( ( ( rule__FormalParameter__NameAssignment_3 )? ) )
+            // InternalFormalML.g:39200:1: ( ( rule__FormalParameter__NameAssignment_3 )? )
+            {
+            // InternalFormalML.g:39200:1: ( ( rule__FormalParameter__NameAssignment_3 )? )
+            // InternalFormalML.g:39201:2: ( rule__FormalParameter__NameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:39202:2: ( rule__FormalParameter__NameAssignment_3 )?
+            int alt538=2;
+            int LA538_0 = input.LA(1);
+
+            if ( (LA538_0==RULE_XLIA_ID) ) {
+                alt538=1;
+            }
+            switch (alt538) {
+                case 1 :
+                    // InternalFormalML.g:39202:3: rule__FormalParameter__NameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__FormalParameter__NameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__3__Impl"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__4"
+    // InternalFormalML.g:39210:1: rule__FormalParameter__Group__4 : rule__FormalParameter__Group__4__Impl ;
+    public final void rule__FormalParameter__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39214:1: ( rule__FormalParameter__Group__4__Impl )
+            // InternalFormalML.g:39215:2: rule__FormalParameter__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__4"
+
+
+    // $ANTLR start "rule__FormalParameter__Group__4__Impl"
+    // InternalFormalML.g:39221:1: rule__FormalParameter__Group__4__Impl : ( ( rule__FormalParameter__Group_4__0 )? ) ;
+    public final void rule__FormalParameter__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39225:1: ( ( ( rule__FormalParameter__Group_4__0 )? ) )
+            // InternalFormalML.g:39226:1: ( ( rule__FormalParameter__Group_4__0 )? )
+            {
+            // InternalFormalML.g:39226:1: ( ( rule__FormalParameter__Group_4__0 )? )
+            // InternalFormalML.g:39227:2: ( rule__FormalParameter__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:39228:2: ( rule__FormalParameter__Group_4__0 )?
+            int alt539=2;
+            int LA539_0 = input.LA(1);
+
+            if ( (LA539_0==100) ) {
+                alt539=1;
+            }
+            switch (alt539) {
+                case 1 :
+                    // InternalFormalML.g:39228:3: rule__FormalParameter__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__FormalParameter__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group__4__Impl"
+
+
+    // $ANTLR start "rule__FormalParameter__Group_4__0"
+    // InternalFormalML.g:39237:1: rule__FormalParameter__Group_4__0 : rule__FormalParameter__Group_4__0__Impl rule__FormalParameter__Group_4__1 ;
+    public final void rule__FormalParameter__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39241:1: ( rule__FormalParameter__Group_4__0__Impl rule__FormalParameter__Group_4__1 )
+            // InternalFormalML.g:39242:2: rule__FormalParameter__Group_4__0__Impl rule__FormalParameter__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__FormalParameter__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group_4__0"
+
+
+    // $ANTLR start "rule__FormalParameter__Group_4__0__Impl"
+    // InternalFormalML.g:39249:1: rule__FormalParameter__Group_4__0__Impl : ( '=' ) ;
+    public final void rule__FormalParameter__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39253:1: ( ( '=' ) )
+            // InternalFormalML.g:39254:1: ( '=' )
+            {
+            // InternalFormalML.g:39254:1: ( '=' )
+            // InternalFormalML.g:39255:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getEqualsSignKeyword_4_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getEqualsSignKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__FormalParameter__Group_4__1"
+    // InternalFormalML.g:39264:1: rule__FormalParameter__Group_4__1 : rule__FormalParameter__Group_4__1__Impl ;
+    public final void rule__FormalParameter__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39268:1: ( rule__FormalParameter__Group_4__1__Impl )
+            // InternalFormalML.g:39269:2: rule__FormalParameter__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group_4__1"
+
+
+    // $ANTLR start "rule__FormalParameter__Group_4__1__Impl"
+    // InternalFormalML.g:39275:1: rule__FormalParameter__Group_4__1__Impl : ( ( rule__FormalParameter__DefaultValueAssignment_4_1 ) ) ;
+    public final void rule__FormalParameter__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39279:1: ( ( ( rule__FormalParameter__DefaultValueAssignment_4_1 ) ) )
+            // InternalFormalML.g:39280:1: ( ( rule__FormalParameter__DefaultValueAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:39280:1: ( ( rule__FormalParameter__DefaultValueAssignment_4_1 ) )
+            // InternalFormalML.g:39281:2: ( rule__FormalParameter__DefaultValueAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getDefaultValueAssignment_4_1()); 
+            }
+            // InternalFormalML.g:39282:2: ( rule__FormalParameter__DefaultValueAssignment_4_1 )
+            // InternalFormalML.g:39282:3: rule__FormalParameter__DefaultValueAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__FormalParameter__DefaultValueAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getDefaultValueAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__0"
+    // InternalFormalML.g:39291:1: rule__ParameterInput__Group__0 : rule__ParameterInput__Group__0__Impl rule__ParameterInput__Group__1 ;
+    public final void rule__ParameterInput__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39295:1: ( rule__ParameterInput__Group__0__Impl rule__ParameterInput__Group__1 )
+            // InternalFormalML.g:39296:2: rule__ParameterInput__Group__0__Impl rule__ParameterInput__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__ParameterInput__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__0"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__0__Impl"
+    // InternalFormalML.g:39303:1: rule__ParameterInput__Group__0__Impl : ( ( rule__ParameterInput__DirectionAssignment_0 ) ) ;
+    public final void rule__ParameterInput__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39307:1: ( ( ( rule__ParameterInput__DirectionAssignment_0 ) ) )
+            // InternalFormalML.g:39308:1: ( ( rule__ParameterInput__DirectionAssignment_0 ) )
+            {
+            // InternalFormalML.g:39308:1: ( ( rule__ParameterInput__DirectionAssignment_0 ) )
+            // InternalFormalML.g:39309:2: ( rule__ParameterInput__DirectionAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getDirectionAssignment_0()); 
+            }
+            // InternalFormalML.g:39310:2: ( rule__ParameterInput__DirectionAssignment_0 )
+            // InternalFormalML.g:39310:3: rule__ParameterInput__DirectionAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__DirectionAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getDirectionAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__1"
+    // InternalFormalML.g:39318:1: rule__ParameterInput__Group__1 : rule__ParameterInput__Group__1__Impl rule__ParameterInput__Group__2 ;
+    public final void rule__ParameterInput__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39322:1: ( rule__ParameterInput__Group__1__Impl rule__ParameterInput__Group__2 )
+            // InternalFormalML.g:39323:2: rule__ParameterInput__Group__1__Impl rule__ParameterInput__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ParameterInput__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__1"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__1__Impl"
+    // InternalFormalML.g:39330:1: rule__ParameterInput__Group__1__Impl : ( ( rule__ParameterInput__TypeAssignment_1 ) ) ;
+    public final void rule__ParameterInput__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39334:1: ( ( ( rule__ParameterInput__TypeAssignment_1 ) ) )
+            // InternalFormalML.g:39335:1: ( ( rule__ParameterInput__TypeAssignment_1 ) )
+            {
+            // InternalFormalML.g:39335:1: ( ( rule__ParameterInput__TypeAssignment_1 ) )
+            // InternalFormalML.g:39336:2: ( rule__ParameterInput__TypeAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getTypeAssignment_1()); 
+            }
+            // InternalFormalML.g:39337:2: ( rule__ParameterInput__TypeAssignment_1 )
+            // InternalFormalML.g:39337:3: rule__ParameterInput__TypeAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__TypeAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getTypeAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__2"
+    // InternalFormalML.g:39345:1: rule__ParameterInput__Group__2 : rule__ParameterInput__Group__2__Impl rule__ParameterInput__Group__3 ;
+    public final void rule__ParameterInput__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39349:1: ( rule__ParameterInput__Group__2__Impl rule__ParameterInput__Group__3 )
+            // InternalFormalML.g:39350:2: rule__ParameterInput__Group__2__Impl rule__ParameterInput__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterInput__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__2"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__2__Impl"
+    // InternalFormalML.g:39357:1: rule__ParameterInput__Group__2__Impl : ( ( rule__ParameterInput__NameAssignment_2 ) ) ;
+    public final void rule__ParameterInput__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39361:1: ( ( ( rule__ParameterInput__NameAssignment_2 ) ) )
+            // InternalFormalML.g:39362:1: ( ( rule__ParameterInput__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:39362:1: ( ( rule__ParameterInput__NameAssignment_2 ) )
+            // InternalFormalML.g:39363:2: ( rule__ParameterInput__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:39364:2: ( rule__ParameterInput__NameAssignment_2 )
+            // InternalFormalML.g:39364:3: rule__ParameterInput__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__3"
+    // InternalFormalML.g:39372:1: rule__ParameterInput__Group__3 : rule__ParameterInput__Group__3__Impl rule__ParameterInput__Group__4 ;
+    public final void rule__ParameterInput__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39376:1: ( rule__ParameterInput__Group__3__Impl rule__ParameterInput__Group__4 )
+            // InternalFormalML.g:39377:2: rule__ParameterInput__Group__3__Impl rule__ParameterInput__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterInput__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__3"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__3__Impl"
+    // InternalFormalML.g:39384:1: rule__ParameterInput__Group__3__Impl : ( ( rule__ParameterInput__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__ParameterInput__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39388:1: ( ( ( rule__ParameterInput__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:39389:1: ( ( rule__ParameterInput__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:39389:1: ( ( rule__ParameterInput__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:39390:2: ( rule__ParameterInput__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:39391:2: ( rule__ParameterInput__UnrestrictedNameAssignment_3 )?
+            int alt540=2;
+            int LA540_0 = input.LA(1);
+
+            if ( (LA540_0==RULE_STRING) ) {
+                alt540=1;
+            }
+            switch (alt540) {
+                case 1 :
+                    // InternalFormalML.g:39391:3: rule__ParameterInput__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ParameterInput__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__4"
+    // InternalFormalML.g:39399:1: rule__ParameterInput__Group__4 : rule__ParameterInput__Group__4__Impl rule__ParameterInput__Group__5 ;
+    public final void rule__ParameterInput__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39403:1: ( rule__ParameterInput__Group__4__Impl rule__ParameterInput__Group__5 )
+            // InternalFormalML.g:39404:2: rule__ParameterInput__Group__4__Impl rule__ParameterInput__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterInput__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__4"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__4__Impl"
+    // InternalFormalML.g:39411:1: rule__ParameterInput__Group__4__Impl : ( ( rule__ParameterInput__Group_4__0 )? ) ;
+    public final void rule__ParameterInput__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39415:1: ( ( ( rule__ParameterInput__Group_4__0 )? ) )
+            // InternalFormalML.g:39416:1: ( ( rule__ParameterInput__Group_4__0 )? )
+            {
+            // InternalFormalML.g:39416:1: ( ( rule__ParameterInput__Group_4__0 )? )
+            // InternalFormalML.g:39417:2: ( rule__ParameterInput__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:39418:2: ( rule__ParameterInput__Group_4__0 )?
+            int alt541=2;
+            int LA541_0 = input.LA(1);
+
+            if ( (LA541_0==100) ) {
+                alt541=1;
+            }
+            switch (alt541) {
+                case 1 :
+                    // InternalFormalML.g:39418:3: rule__ParameterInput__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ParameterInput__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__5"
+    // InternalFormalML.g:39426:1: rule__ParameterInput__Group__5 : rule__ParameterInput__Group__5__Impl ;
+    public final void rule__ParameterInput__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39430:1: ( rule__ParameterInput__Group__5__Impl )
+            // InternalFormalML.g:39431:2: rule__ParameterInput__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__5"
+
+
+    // $ANTLR start "rule__ParameterInput__Group__5__Impl"
+    // InternalFormalML.g:39437:1: rule__ParameterInput__Group__5__Impl : ( ';' ) ;
+    public final void rule__ParameterInput__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39441:1: ( ( ';' ) )
+            // InternalFormalML.g:39442:1: ( ';' )
+            {
+            // InternalFormalML.g:39442:1: ( ';' )
+            // InternalFormalML.g:39443:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group__5__Impl"
+
+
+    // $ANTLR start "rule__ParameterInput__Group_4__0"
+    // InternalFormalML.g:39453:1: rule__ParameterInput__Group_4__0 : rule__ParameterInput__Group_4__0__Impl rule__ParameterInput__Group_4__1 ;
+    public final void rule__ParameterInput__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39457:1: ( rule__ParameterInput__Group_4__0__Impl rule__ParameterInput__Group_4__1 )
+            // InternalFormalML.g:39458:2: rule__ParameterInput__Group_4__0__Impl rule__ParameterInput__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ParameterInput__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group_4__0"
+
+
+    // $ANTLR start "rule__ParameterInput__Group_4__0__Impl"
+    // InternalFormalML.g:39465:1: rule__ParameterInput__Group_4__0__Impl : ( '=' ) ;
+    public final void rule__ParameterInput__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39469:1: ( ( '=' ) )
+            // InternalFormalML.g:39470:1: ( '=' )
+            {
+            // InternalFormalML.g:39470:1: ( '=' )
+            // InternalFormalML.g:39471:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getEqualsSignKeyword_4_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getEqualsSignKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__ParameterInput__Group_4__1"
+    // InternalFormalML.g:39480:1: rule__ParameterInput__Group_4__1 : rule__ParameterInput__Group_4__1__Impl ;
+    public final void rule__ParameterInput__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39484:1: ( rule__ParameterInput__Group_4__1__Impl )
+            // InternalFormalML.g:39485:2: rule__ParameterInput__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group_4__1"
+
+
+    // $ANTLR start "rule__ParameterInput__Group_4__1__Impl"
+    // InternalFormalML.g:39491:1: rule__ParameterInput__Group_4__1__Impl : ( ( rule__ParameterInput__DefaultValueAssignment_4_1 ) ) ;
+    public final void rule__ParameterInput__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39495:1: ( ( ( rule__ParameterInput__DefaultValueAssignment_4_1 ) ) )
+            // InternalFormalML.g:39496:1: ( ( rule__ParameterInput__DefaultValueAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:39496:1: ( ( rule__ParameterInput__DefaultValueAssignment_4_1 ) )
+            // InternalFormalML.g:39497:2: ( rule__ParameterInput__DefaultValueAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getDefaultValueAssignment_4_1()); 
+            }
+            // InternalFormalML.g:39498:2: ( rule__ParameterInput__DefaultValueAssignment_4_1 )
+            // InternalFormalML.g:39498:3: rule__ParameterInput__DefaultValueAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInput__DefaultValueAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getDefaultValueAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__0"
+    // InternalFormalML.g:39507:1: rule__ParameterInout__Group__0 : rule__ParameterInout__Group__0__Impl rule__ParameterInout__Group__1 ;
+    public final void rule__ParameterInout__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39511:1: ( rule__ParameterInout__Group__0__Impl rule__ParameterInout__Group__1 )
+            // InternalFormalML.g:39512:2: rule__ParameterInout__Group__0__Impl rule__ParameterInout__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__ParameterInout__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__0"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__0__Impl"
+    // InternalFormalML.g:39519:1: rule__ParameterInout__Group__0__Impl : ( ( rule__ParameterInout__DirectionAssignment_0 ) ) ;
+    public final void rule__ParameterInout__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39523:1: ( ( ( rule__ParameterInout__DirectionAssignment_0 ) ) )
+            // InternalFormalML.g:39524:1: ( ( rule__ParameterInout__DirectionAssignment_0 ) )
+            {
+            // InternalFormalML.g:39524:1: ( ( rule__ParameterInout__DirectionAssignment_0 ) )
+            // InternalFormalML.g:39525:2: ( rule__ParameterInout__DirectionAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getDirectionAssignment_0()); 
+            }
+            // InternalFormalML.g:39526:2: ( rule__ParameterInout__DirectionAssignment_0 )
+            // InternalFormalML.g:39526:3: rule__ParameterInout__DirectionAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__DirectionAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getDirectionAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__1"
+    // InternalFormalML.g:39534:1: rule__ParameterInout__Group__1 : rule__ParameterInout__Group__1__Impl rule__ParameterInout__Group__2 ;
+    public final void rule__ParameterInout__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39538:1: ( rule__ParameterInout__Group__1__Impl rule__ParameterInout__Group__2 )
+            // InternalFormalML.g:39539:2: rule__ParameterInout__Group__1__Impl rule__ParameterInout__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ParameterInout__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__1"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__1__Impl"
+    // InternalFormalML.g:39546:1: rule__ParameterInout__Group__1__Impl : ( ( rule__ParameterInout__TypeAssignment_1 ) ) ;
+    public final void rule__ParameterInout__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39550:1: ( ( ( rule__ParameterInout__TypeAssignment_1 ) ) )
+            // InternalFormalML.g:39551:1: ( ( rule__ParameterInout__TypeAssignment_1 ) )
+            {
+            // InternalFormalML.g:39551:1: ( ( rule__ParameterInout__TypeAssignment_1 ) )
+            // InternalFormalML.g:39552:2: ( rule__ParameterInout__TypeAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getTypeAssignment_1()); 
+            }
+            // InternalFormalML.g:39553:2: ( rule__ParameterInout__TypeAssignment_1 )
+            // InternalFormalML.g:39553:3: rule__ParameterInout__TypeAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__TypeAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getTypeAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__2"
+    // InternalFormalML.g:39561:1: rule__ParameterInout__Group__2 : rule__ParameterInout__Group__2__Impl rule__ParameterInout__Group__3 ;
+    public final void rule__ParameterInout__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39565:1: ( rule__ParameterInout__Group__2__Impl rule__ParameterInout__Group__3 )
+            // InternalFormalML.g:39566:2: rule__ParameterInout__Group__2__Impl rule__ParameterInout__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterInout__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__2"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__2__Impl"
+    // InternalFormalML.g:39573:1: rule__ParameterInout__Group__2__Impl : ( ( rule__ParameterInout__NameAssignment_2 ) ) ;
+    public final void rule__ParameterInout__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39577:1: ( ( ( rule__ParameterInout__NameAssignment_2 ) ) )
+            // InternalFormalML.g:39578:1: ( ( rule__ParameterInout__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:39578:1: ( ( rule__ParameterInout__NameAssignment_2 ) )
+            // InternalFormalML.g:39579:2: ( rule__ParameterInout__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:39580:2: ( rule__ParameterInout__NameAssignment_2 )
+            // InternalFormalML.g:39580:3: rule__ParameterInout__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__3"
+    // InternalFormalML.g:39588:1: rule__ParameterInout__Group__3 : rule__ParameterInout__Group__3__Impl rule__ParameterInout__Group__4 ;
+    public final void rule__ParameterInout__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39592:1: ( rule__ParameterInout__Group__3__Impl rule__ParameterInout__Group__4 )
+            // InternalFormalML.g:39593:2: rule__ParameterInout__Group__3__Impl rule__ParameterInout__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterInout__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__3"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__3__Impl"
+    // InternalFormalML.g:39600:1: rule__ParameterInout__Group__3__Impl : ( ( rule__ParameterInout__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__ParameterInout__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39604:1: ( ( ( rule__ParameterInout__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:39605:1: ( ( rule__ParameterInout__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:39605:1: ( ( rule__ParameterInout__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:39606:2: ( rule__ParameterInout__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:39607:2: ( rule__ParameterInout__UnrestrictedNameAssignment_3 )?
+            int alt542=2;
+            int LA542_0 = input.LA(1);
+
+            if ( (LA542_0==RULE_STRING) ) {
+                alt542=1;
+            }
+            switch (alt542) {
+                case 1 :
+                    // InternalFormalML.g:39607:3: rule__ParameterInout__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ParameterInout__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__4"
+    // InternalFormalML.g:39615:1: rule__ParameterInout__Group__4 : rule__ParameterInout__Group__4__Impl rule__ParameterInout__Group__5 ;
+    public final void rule__ParameterInout__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39619:1: ( rule__ParameterInout__Group__4__Impl rule__ParameterInout__Group__5 )
+            // InternalFormalML.g:39620:2: rule__ParameterInout__Group__4__Impl rule__ParameterInout__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterInout__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__4"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__4__Impl"
+    // InternalFormalML.g:39627:1: rule__ParameterInout__Group__4__Impl : ( ( rule__ParameterInout__Group_4__0 )? ) ;
+    public final void rule__ParameterInout__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39631:1: ( ( ( rule__ParameterInout__Group_4__0 )? ) )
+            // InternalFormalML.g:39632:1: ( ( rule__ParameterInout__Group_4__0 )? )
+            {
+            // InternalFormalML.g:39632:1: ( ( rule__ParameterInout__Group_4__0 )? )
+            // InternalFormalML.g:39633:2: ( rule__ParameterInout__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:39634:2: ( rule__ParameterInout__Group_4__0 )?
+            int alt543=2;
+            int LA543_0 = input.LA(1);
+
+            if ( (LA543_0==100) ) {
+                alt543=1;
+            }
+            switch (alt543) {
+                case 1 :
+                    // InternalFormalML.g:39634:3: rule__ParameterInout__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ParameterInout__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__5"
+    // InternalFormalML.g:39642:1: rule__ParameterInout__Group__5 : rule__ParameterInout__Group__5__Impl ;
+    public final void rule__ParameterInout__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39646:1: ( rule__ParameterInout__Group__5__Impl )
+            // InternalFormalML.g:39647:2: rule__ParameterInout__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__5"
+
+
+    // $ANTLR start "rule__ParameterInout__Group__5__Impl"
+    // InternalFormalML.g:39653:1: rule__ParameterInout__Group__5__Impl : ( ';' ) ;
+    public final void rule__ParameterInout__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39657:1: ( ( ';' ) )
+            // InternalFormalML.g:39658:1: ( ';' )
+            {
+            // InternalFormalML.g:39658:1: ( ';' )
+            // InternalFormalML.g:39659:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group__5__Impl"
+
+
+    // $ANTLR start "rule__ParameterInout__Group_4__0"
+    // InternalFormalML.g:39669:1: rule__ParameterInout__Group_4__0 : rule__ParameterInout__Group_4__0__Impl rule__ParameterInout__Group_4__1 ;
+    public final void rule__ParameterInout__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39673:1: ( rule__ParameterInout__Group_4__0__Impl rule__ParameterInout__Group_4__1 )
+            // InternalFormalML.g:39674:2: rule__ParameterInout__Group_4__0__Impl rule__ParameterInout__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ParameterInout__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group_4__0"
+
+
+    // $ANTLR start "rule__ParameterInout__Group_4__0__Impl"
+    // InternalFormalML.g:39681:1: rule__ParameterInout__Group_4__0__Impl : ( '=' ) ;
+    public final void rule__ParameterInout__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39685:1: ( ( '=' ) )
+            // InternalFormalML.g:39686:1: ( '=' )
+            {
+            // InternalFormalML.g:39686:1: ( '=' )
+            // InternalFormalML.g:39687:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getEqualsSignKeyword_4_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getEqualsSignKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__ParameterInout__Group_4__1"
+    // InternalFormalML.g:39696:1: rule__ParameterInout__Group_4__1 : rule__ParameterInout__Group_4__1__Impl ;
+    public final void rule__ParameterInout__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39700:1: ( rule__ParameterInout__Group_4__1__Impl )
+            // InternalFormalML.g:39701:2: rule__ParameterInout__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group_4__1"
+
+
+    // $ANTLR start "rule__ParameterInout__Group_4__1__Impl"
+    // InternalFormalML.g:39707:1: rule__ParameterInout__Group_4__1__Impl : ( ( rule__ParameterInout__DefaultValueAssignment_4_1 ) ) ;
+    public final void rule__ParameterInout__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39711:1: ( ( ( rule__ParameterInout__DefaultValueAssignment_4_1 ) ) )
+            // InternalFormalML.g:39712:1: ( ( rule__ParameterInout__DefaultValueAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:39712:1: ( ( rule__ParameterInout__DefaultValueAssignment_4_1 ) )
+            // InternalFormalML.g:39713:2: ( rule__ParameterInout__DefaultValueAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getDefaultValueAssignment_4_1()); 
+            }
+            // InternalFormalML.g:39714:2: ( rule__ParameterInout__DefaultValueAssignment_4_1 )
+            // InternalFormalML.g:39714:3: rule__ParameterInout__DefaultValueAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterInout__DefaultValueAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getDefaultValueAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__0"
+    // InternalFormalML.g:39723:1: rule__ParameterOutput__Group__0 : rule__ParameterOutput__Group__0__Impl rule__ParameterOutput__Group__1 ;
+    public final void rule__ParameterOutput__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39727:1: ( rule__ParameterOutput__Group__0__Impl rule__ParameterOutput__Group__1 )
+            // InternalFormalML.g:39728:2: rule__ParameterOutput__Group__0__Impl rule__ParameterOutput__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__ParameterOutput__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__0"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__0__Impl"
+    // InternalFormalML.g:39735:1: rule__ParameterOutput__Group__0__Impl : ( ( rule__ParameterOutput__DirectionAssignment_0 ) ) ;
+    public final void rule__ParameterOutput__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39739:1: ( ( ( rule__ParameterOutput__DirectionAssignment_0 ) ) )
+            // InternalFormalML.g:39740:1: ( ( rule__ParameterOutput__DirectionAssignment_0 ) )
+            {
+            // InternalFormalML.g:39740:1: ( ( rule__ParameterOutput__DirectionAssignment_0 ) )
+            // InternalFormalML.g:39741:2: ( rule__ParameterOutput__DirectionAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getDirectionAssignment_0()); 
+            }
+            // InternalFormalML.g:39742:2: ( rule__ParameterOutput__DirectionAssignment_0 )
+            // InternalFormalML.g:39742:3: rule__ParameterOutput__DirectionAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__DirectionAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getDirectionAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__1"
+    // InternalFormalML.g:39750:1: rule__ParameterOutput__Group__1 : rule__ParameterOutput__Group__1__Impl rule__ParameterOutput__Group__2 ;
+    public final void rule__ParameterOutput__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39754:1: ( rule__ParameterOutput__Group__1__Impl rule__ParameterOutput__Group__2 )
+            // InternalFormalML.g:39755:2: rule__ParameterOutput__Group__1__Impl rule__ParameterOutput__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ParameterOutput__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__1"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__1__Impl"
+    // InternalFormalML.g:39762:1: rule__ParameterOutput__Group__1__Impl : ( ( rule__ParameterOutput__TypeAssignment_1 ) ) ;
+    public final void rule__ParameterOutput__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39766:1: ( ( ( rule__ParameterOutput__TypeAssignment_1 ) ) )
+            // InternalFormalML.g:39767:1: ( ( rule__ParameterOutput__TypeAssignment_1 ) )
+            {
+            // InternalFormalML.g:39767:1: ( ( rule__ParameterOutput__TypeAssignment_1 ) )
+            // InternalFormalML.g:39768:2: ( rule__ParameterOutput__TypeAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getTypeAssignment_1()); 
+            }
+            // InternalFormalML.g:39769:2: ( rule__ParameterOutput__TypeAssignment_1 )
+            // InternalFormalML.g:39769:3: rule__ParameterOutput__TypeAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__TypeAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getTypeAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__2"
+    // InternalFormalML.g:39777:1: rule__ParameterOutput__Group__2 : rule__ParameterOutput__Group__2__Impl rule__ParameterOutput__Group__3 ;
+    public final void rule__ParameterOutput__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39781:1: ( rule__ParameterOutput__Group__2__Impl rule__ParameterOutput__Group__3 )
+            // InternalFormalML.g:39782:2: rule__ParameterOutput__Group__2__Impl rule__ParameterOutput__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterOutput__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__2"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__2__Impl"
+    // InternalFormalML.g:39789:1: rule__ParameterOutput__Group__2__Impl : ( ( rule__ParameterOutput__NameAssignment_2 ) ) ;
+    public final void rule__ParameterOutput__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39793:1: ( ( ( rule__ParameterOutput__NameAssignment_2 ) ) )
+            // InternalFormalML.g:39794:1: ( ( rule__ParameterOutput__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:39794:1: ( ( rule__ParameterOutput__NameAssignment_2 ) )
+            // InternalFormalML.g:39795:2: ( rule__ParameterOutput__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:39796:2: ( rule__ParameterOutput__NameAssignment_2 )
+            // InternalFormalML.g:39796:3: rule__ParameterOutput__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__3"
+    // InternalFormalML.g:39804:1: rule__ParameterOutput__Group__3 : rule__ParameterOutput__Group__3__Impl rule__ParameterOutput__Group__4 ;
+    public final void rule__ParameterOutput__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39808:1: ( rule__ParameterOutput__Group__3__Impl rule__ParameterOutput__Group__4 )
+            // InternalFormalML.g:39809:2: rule__ParameterOutput__Group__3__Impl rule__ParameterOutput__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterOutput__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__3"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__3__Impl"
+    // InternalFormalML.g:39816:1: rule__ParameterOutput__Group__3__Impl : ( ( rule__ParameterOutput__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__ParameterOutput__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39820:1: ( ( ( rule__ParameterOutput__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:39821:1: ( ( rule__ParameterOutput__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:39821:1: ( ( rule__ParameterOutput__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:39822:2: ( rule__ParameterOutput__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:39823:2: ( rule__ParameterOutput__UnrestrictedNameAssignment_3 )?
+            int alt544=2;
+            int LA544_0 = input.LA(1);
+
+            if ( (LA544_0==RULE_STRING) ) {
+                alt544=1;
+            }
+            switch (alt544) {
+                case 1 :
+                    // InternalFormalML.g:39823:3: rule__ParameterOutput__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ParameterOutput__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__4"
+    // InternalFormalML.g:39831:1: rule__ParameterOutput__Group__4 : rule__ParameterOutput__Group__4__Impl rule__ParameterOutput__Group__5 ;
+    public final void rule__ParameterOutput__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39835:1: ( rule__ParameterOutput__Group__4__Impl rule__ParameterOutput__Group__5 )
+            // InternalFormalML.g:39836:2: rule__ParameterOutput__Group__4__Impl rule__ParameterOutput__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterOutput__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__4"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__4__Impl"
+    // InternalFormalML.g:39843:1: rule__ParameterOutput__Group__4__Impl : ( ( rule__ParameterOutput__Group_4__0 )? ) ;
+    public final void rule__ParameterOutput__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39847:1: ( ( ( rule__ParameterOutput__Group_4__0 )? ) )
+            // InternalFormalML.g:39848:1: ( ( rule__ParameterOutput__Group_4__0 )? )
+            {
+            // InternalFormalML.g:39848:1: ( ( rule__ParameterOutput__Group_4__0 )? )
+            // InternalFormalML.g:39849:2: ( rule__ParameterOutput__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:39850:2: ( rule__ParameterOutput__Group_4__0 )?
+            int alt545=2;
+            int LA545_0 = input.LA(1);
+
+            if ( (LA545_0==100) ) {
+                alt545=1;
+            }
+            switch (alt545) {
+                case 1 :
+                    // InternalFormalML.g:39850:3: rule__ParameterOutput__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ParameterOutput__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__5"
+    // InternalFormalML.g:39858:1: rule__ParameterOutput__Group__5 : rule__ParameterOutput__Group__5__Impl ;
+    public final void rule__ParameterOutput__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39862:1: ( rule__ParameterOutput__Group__5__Impl )
+            // InternalFormalML.g:39863:2: rule__ParameterOutput__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__5"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group__5__Impl"
+    // InternalFormalML.g:39869:1: rule__ParameterOutput__Group__5__Impl : ( ';' ) ;
+    public final void rule__ParameterOutput__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39873:1: ( ( ';' ) )
+            // InternalFormalML.g:39874:1: ( ';' )
+            {
+            // InternalFormalML.g:39874:1: ( ';' )
+            // InternalFormalML.g:39875:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group__5__Impl"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group_4__0"
+    // InternalFormalML.g:39885:1: rule__ParameterOutput__Group_4__0 : rule__ParameterOutput__Group_4__0__Impl rule__ParameterOutput__Group_4__1 ;
+    public final void rule__ParameterOutput__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39889:1: ( rule__ParameterOutput__Group_4__0__Impl rule__ParameterOutput__Group_4__1 )
+            // InternalFormalML.g:39890:2: rule__ParameterOutput__Group_4__0__Impl rule__ParameterOutput__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ParameterOutput__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group_4__0"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group_4__0__Impl"
+    // InternalFormalML.g:39897:1: rule__ParameterOutput__Group_4__0__Impl : ( '=' ) ;
+    public final void rule__ParameterOutput__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39901:1: ( ( '=' ) )
+            // InternalFormalML.g:39902:1: ( '=' )
+            {
+            // InternalFormalML.g:39902:1: ( '=' )
+            // InternalFormalML.g:39903:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getEqualsSignKeyword_4_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getEqualsSignKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group_4__1"
+    // InternalFormalML.g:39912:1: rule__ParameterOutput__Group_4__1 : rule__ParameterOutput__Group_4__1__Impl ;
+    public final void rule__ParameterOutput__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39916:1: ( rule__ParameterOutput__Group_4__1__Impl )
+            // InternalFormalML.g:39917:2: rule__ParameterOutput__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group_4__1"
+
+
+    // $ANTLR start "rule__ParameterOutput__Group_4__1__Impl"
+    // InternalFormalML.g:39923:1: rule__ParameterOutput__Group_4__1__Impl : ( ( rule__ParameterOutput__DefaultValueAssignment_4_1 ) ) ;
+    public final void rule__ParameterOutput__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39927:1: ( ( ( rule__ParameterOutput__DefaultValueAssignment_4_1 ) ) )
+            // InternalFormalML.g:39928:1: ( ( rule__ParameterOutput__DefaultValueAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:39928:1: ( ( rule__ParameterOutput__DefaultValueAssignment_4_1 ) )
+            // InternalFormalML.g:39929:2: ( rule__ParameterOutput__DefaultValueAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getDefaultValueAssignment_4_1()); 
+            }
+            // InternalFormalML.g:39930:2: ( rule__ParameterOutput__DefaultValueAssignment_4_1 )
+            // InternalFormalML.g:39930:3: rule__ParameterOutput__DefaultValueAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterOutput__DefaultValueAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getDefaultValueAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__0"
+    // InternalFormalML.g:39939:1: rule__ParameterReturn__Group__0 : rule__ParameterReturn__Group__0__Impl rule__ParameterReturn__Group__1 ;
+    public final void rule__ParameterReturn__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39943:1: ( rule__ParameterReturn__Group__0__Impl rule__ParameterReturn__Group__1 )
+            // InternalFormalML.g:39944:2: rule__ParameterReturn__Group__0__Impl rule__ParameterReturn__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__ParameterReturn__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__0"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__0__Impl"
+    // InternalFormalML.g:39951:1: rule__ParameterReturn__Group__0__Impl : ( ( rule__ParameterReturn__DirectionAssignment_0 ) ) ;
+    public final void rule__ParameterReturn__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39955:1: ( ( ( rule__ParameterReturn__DirectionAssignment_0 ) ) )
+            // InternalFormalML.g:39956:1: ( ( rule__ParameterReturn__DirectionAssignment_0 ) )
+            {
+            // InternalFormalML.g:39956:1: ( ( rule__ParameterReturn__DirectionAssignment_0 ) )
+            // InternalFormalML.g:39957:2: ( rule__ParameterReturn__DirectionAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getDirectionAssignment_0()); 
+            }
+            // InternalFormalML.g:39958:2: ( rule__ParameterReturn__DirectionAssignment_0 )
+            // InternalFormalML.g:39958:3: rule__ParameterReturn__DirectionAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__DirectionAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getDirectionAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__1"
+    // InternalFormalML.g:39966:1: rule__ParameterReturn__Group__1 : rule__ParameterReturn__Group__1__Impl rule__ParameterReturn__Group__2 ;
+    public final void rule__ParameterReturn__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39970:1: ( rule__ParameterReturn__Group__1__Impl rule__ParameterReturn__Group__2 )
+            // InternalFormalML.g:39971:2: rule__ParameterReturn__Group__1__Impl rule__ParameterReturn__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ParameterReturn__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__1"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__1__Impl"
+    // InternalFormalML.g:39978:1: rule__ParameterReturn__Group__1__Impl : ( ( rule__ParameterReturn__TypeAssignment_1 ) ) ;
+    public final void rule__ParameterReturn__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39982:1: ( ( ( rule__ParameterReturn__TypeAssignment_1 ) ) )
+            // InternalFormalML.g:39983:1: ( ( rule__ParameterReturn__TypeAssignment_1 ) )
+            {
+            // InternalFormalML.g:39983:1: ( ( rule__ParameterReturn__TypeAssignment_1 ) )
+            // InternalFormalML.g:39984:2: ( rule__ParameterReturn__TypeAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getTypeAssignment_1()); 
+            }
+            // InternalFormalML.g:39985:2: ( rule__ParameterReturn__TypeAssignment_1 )
+            // InternalFormalML.g:39985:3: rule__ParameterReturn__TypeAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__TypeAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getTypeAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__2"
+    // InternalFormalML.g:39993:1: rule__ParameterReturn__Group__2 : rule__ParameterReturn__Group__2__Impl rule__ParameterReturn__Group__3 ;
+    public final void rule__ParameterReturn__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:39997:1: ( rule__ParameterReturn__Group__2__Impl rule__ParameterReturn__Group__3 )
+            // InternalFormalML.g:39998:2: rule__ParameterReturn__Group__2__Impl rule__ParameterReturn__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterReturn__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__2"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__2__Impl"
+    // InternalFormalML.g:40005:1: rule__ParameterReturn__Group__2__Impl : ( ( rule__ParameterReturn__NameAssignment_2 ) ) ;
+    public final void rule__ParameterReturn__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40009:1: ( ( ( rule__ParameterReturn__NameAssignment_2 ) ) )
+            // InternalFormalML.g:40010:1: ( ( rule__ParameterReturn__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:40010:1: ( ( rule__ParameterReturn__NameAssignment_2 ) )
+            // InternalFormalML.g:40011:2: ( rule__ParameterReturn__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:40012:2: ( rule__ParameterReturn__NameAssignment_2 )
+            // InternalFormalML.g:40012:3: rule__ParameterReturn__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__3"
+    // InternalFormalML.g:40020:1: rule__ParameterReturn__Group__3 : rule__ParameterReturn__Group__3__Impl rule__ParameterReturn__Group__4 ;
+    public final void rule__ParameterReturn__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40024:1: ( rule__ParameterReturn__Group__3__Impl rule__ParameterReturn__Group__4 )
+            // InternalFormalML.g:40025:2: rule__ParameterReturn__Group__3__Impl rule__ParameterReturn__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterReturn__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__3"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__3__Impl"
+    // InternalFormalML.g:40032:1: rule__ParameterReturn__Group__3__Impl : ( ( rule__ParameterReturn__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__ParameterReturn__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40036:1: ( ( ( rule__ParameterReturn__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:40037:1: ( ( rule__ParameterReturn__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:40037:1: ( ( rule__ParameterReturn__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:40038:2: ( rule__ParameterReturn__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:40039:2: ( rule__ParameterReturn__UnrestrictedNameAssignment_3 )?
+            int alt546=2;
+            int LA546_0 = input.LA(1);
+
+            if ( (LA546_0==RULE_STRING) ) {
+                alt546=1;
+            }
+            switch (alt546) {
+                case 1 :
+                    // InternalFormalML.g:40039:3: rule__ParameterReturn__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ParameterReturn__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__4"
+    // InternalFormalML.g:40047:1: rule__ParameterReturn__Group__4 : rule__ParameterReturn__Group__4__Impl rule__ParameterReturn__Group__5 ;
+    public final void rule__ParameterReturn__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40051:1: ( rule__ParameterReturn__Group__4__Impl rule__ParameterReturn__Group__5 )
+            // InternalFormalML.g:40052:2: rule__ParameterReturn__Group__4__Impl rule__ParameterReturn__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_174);
+            rule__ParameterReturn__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__4"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__4__Impl"
+    // InternalFormalML.g:40059:1: rule__ParameterReturn__Group__4__Impl : ( ( rule__ParameterReturn__Group_4__0 )? ) ;
+    public final void rule__ParameterReturn__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40063:1: ( ( ( rule__ParameterReturn__Group_4__0 )? ) )
+            // InternalFormalML.g:40064:1: ( ( rule__ParameterReturn__Group_4__0 )? )
+            {
+            // InternalFormalML.g:40064:1: ( ( rule__ParameterReturn__Group_4__0 )? )
+            // InternalFormalML.g:40065:2: ( rule__ParameterReturn__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:40066:2: ( rule__ParameterReturn__Group_4__0 )?
+            int alt547=2;
+            int LA547_0 = input.LA(1);
+
+            if ( (LA547_0==100) ) {
+                alt547=1;
+            }
+            switch (alt547) {
+                case 1 :
+                    // InternalFormalML.g:40066:3: rule__ParameterReturn__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ParameterReturn__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__5"
+    // InternalFormalML.g:40074:1: rule__ParameterReturn__Group__5 : rule__ParameterReturn__Group__5__Impl ;
+    public final void rule__ParameterReturn__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40078:1: ( rule__ParameterReturn__Group__5__Impl )
+            // InternalFormalML.g:40079:2: rule__ParameterReturn__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__5"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group__5__Impl"
+    // InternalFormalML.g:40085:1: rule__ParameterReturn__Group__5__Impl : ( ';' ) ;
+    public final void rule__ParameterReturn__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40089:1: ( ( ';' ) )
+            // InternalFormalML.g:40090:1: ( ';' )
+            {
+            // InternalFormalML.g:40090:1: ( ';' )
+            // InternalFormalML.g:40091:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group__5__Impl"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group_4__0"
+    // InternalFormalML.g:40101:1: rule__ParameterReturn__Group_4__0 : rule__ParameterReturn__Group_4__0__Impl rule__ParameterReturn__Group_4__1 ;
+    public final void rule__ParameterReturn__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40105:1: ( rule__ParameterReturn__Group_4__0__Impl rule__ParameterReturn__Group_4__1 )
+            // InternalFormalML.g:40106:2: rule__ParameterReturn__Group_4__0__Impl rule__ParameterReturn__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ParameterReturn__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group_4__0"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group_4__0__Impl"
+    // InternalFormalML.g:40113:1: rule__ParameterReturn__Group_4__0__Impl : ( '=' ) ;
+    public final void rule__ParameterReturn__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40117:1: ( ( '=' ) )
+            // InternalFormalML.g:40118:1: ( '=' )
+            {
+            // InternalFormalML.g:40118:1: ( '=' )
+            // InternalFormalML.g:40119:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getEqualsSignKeyword_4_0()); 
+            }
+            match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getEqualsSignKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group_4__1"
+    // InternalFormalML.g:40128:1: rule__ParameterReturn__Group_4__1 : rule__ParameterReturn__Group_4__1__Impl ;
+    public final void rule__ParameterReturn__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40132:1: ( rule__ParameterReturn__Group_4__1__Impl )
+            // InternalFormalML.g:40133:2: rule__ParameterReturn__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group_4__1"
+
+
+    // $ANTLR start "rule__ParameterReturn__Group_4__1__Impl"
+    // InternalFormalML.g:40139:1: rule__ParameterReturn__Group_4__1__Impl : ( ( rule__ParameterReturn__DefaultValueAssignment_4_1 ) ) ;
+    public final void rule__ParameterReturn__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40143:1: ( ( ( rule__ParameterReturn__DefaultValueAssignment_4_1 ) ) )
+            // InternalFormalML.g:40144:1: ( ( rule__ParameterReturn__DefaultValueAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:40144:1: ( ( rule__ParameterReturn__DefaultValueAssignment_4_1 ) )
+            // InternalFormalML.g:40145:2: ( rule__ParameterReturn__DefaultValueAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getDefaultValueAssignment_4_1()); 
+            }
+            // InternalFormalML.g:40146:2: ( rule__ParameterReturn__DefaultValueAssignment_4_1 )
+            // InternalFormalML.g:40146:3: rule__ParameterReturn__DefaultValueAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ParameterReturn__DefaultValueAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getDefaultValueAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group__0"
+    // InternalFormalML.g:40155:1: rule__BufferContainerType__Group__0 : rule__BufferContainerType__Group__0__Impl rule__BufferContainerType__Group__1 ;
+    public final void rule__BufferContainerType__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40159:1: ( rule__BufferContainerType__Group__0__Impl rule__BufferContainerType__Group__1 )
+            // InternalFormalML.g:40160:2: rule__BufferContainerType__Group__0__Impl rule__BufferContainerType__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_175);
+            rule__BufferContainerType__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferContainerType__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group__0"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group__0__Impl"
+    // InternalFormalML.g:40167:1: rule__BufferContainerType__Group__0__Impl : ( () ) ;
+    public final void rule__BufferContainerType__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40171:1: ( ( () ) )
+            // InternalFormalML.g:40172:1: ( () )
+            {
+            // InternalFormalML.g:40172:1: ( () )
+            // InternalFormalML.g:40173:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getCollectionTypeAction_0()); 
+            }
+            // InternalFormalML.g:40174:2: ()
+            // InternalFormalML.g:40174:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getCollectionTypeAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group__0__Impl"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group__1"
+    // InternalFormalML.g:40182:1: rule__BufferContainerType__Group__1 : rule__BufferContainerType__Group__1__Impl rule__BufferContainerType__Group__2 ;
+    public final void rule__BufferContainerType__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40186:1: ( rule__BufferContainerType__Group__1__Impl rule__BufferContainerType__Group__2 )
+            // InternalFormalML.g:40187:2: rule__BufferContainerType__Group__1__Impl rule__BufferContainerType__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__BufferContainerType__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferContainerType__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group__1"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group__1__Impl"
+    // InternalFormalML.g:40194:1: rule__BufferContainerType__Group__1__Impl : ( ( rule__BufferContainerType__ContainerAssignment_1 ) ) ;
+    public final void rule__BufferContainerType__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40198:1: ( ( ( rule__BufferContainerType__ContainerAssignment_1 ) ) )
+            // InternalFormalML.g:40199:1: ( ( rule__BufferContainerType__ContainerAssignment_1 ) )
+            {
+            // InternalFormalML.g:40199:1: ( ( rule__BufferContainerType__ContainerAssignment_1 ) )
+            // InternalFormalML.g:40200:2: ( rule__BufferContainerType__ContainerAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getContainerAssignment_1()); 
+            }
+            // InternalFormalML.g:40201:2: ( rule__BufferContainerType__ContainerAssignment_1 )
+            // InternalFormalML.g:40201:3: rule__BufferContainerType__ContainerAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferContainerType__ContainerAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getContainerAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group__1__Impl"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group__2"
+    // InternalFormalML.g:40209:1: rule__BufferContainerType__Group__2 : rule__BufferContainerType__Group__2__Impl ;
+    public final void rule__BufferContainerType__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40213:1: ( rule__BufferContainerType__Group__2__Impl )
+            // InternalFormalML.g:40214:2: rule__BufferContainerType__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferContainerType__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group__2"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group__2__Impl"
+    // InternalFormalML.g:40220:1: rule__BufferContainerType__Group__2__Impl : ( ( rule__BufferContainerType__Group_2__0 )? ) ;
+    public final void rule__BufferContainerType__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40224:1: ( ( ( rule__BufferContainerType__Group_2__0 )? ) )
+            // InternalFormalML.g:40225:1: ( ( rule__BufferContainerType__Group_2__0 )? )
+            {
+            // InternalFormalML.g:40225:1: ( ( rule__BufferContainerType__Group_2__0 )? )
+            // InternalFormalML.g:40226:2: ( rule__BufferContainerType__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:40227:2: ( rule__BufferContainerType__Group_2__0 )?
+            int alt548=2;
+            int LA548_0 = input.LA(1);
+
+            if ( (LA548_0==125) ) {
+                alt548=1;
+            }
+            switch (alt548) {
+                case 1 :
+                    // InternalFormalML.g:40227:3: rule__BufferContainerType__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferContainerType__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group__2__Impl"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group_2__0"
+    // InternalFormalML.g:40236:1: rule__BufferContainerType__Group_2__0 : rule__BufferContainerType__Group_2__0__Impl rule__BufferContainerType__Group_2__1 ;
+    public final void rule__BufferContainerType__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40240:1: ( rule__BufferContainerType__Group_2__0__Impl rule__BufferContainerType__Group_2__1 )
+            // InternalFormalML.g:40241:2: rule__BufferContainerType__Group_2__0__Impl rule__BufferContainerType__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_176);
+            rule__BufferContainerType__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferContainerType__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group_2__0"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group_2__0__Impl"
+    // InternalFormalML.g:40248:1: rule__BufferContainerType__Group_2__0__Impl : ( '<' ) ;
+    public final void rule__BufferContainerType__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40252:1: ( ( '<' ) )
+            // InternalFormalML.g:40253:1: ( '<' )
+            {
+            // InternalFormalML.g:40253:1: ( '<' )
+            // InternalFormalML.g:40254:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getLessThanSignKeyword_2_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getLessThanSignKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group_2__1"
+    // InternalFormalML.g:40263:1: rule__BufferContainerType__Group_2__1 : rule__BufferContainerType__Group_2__1__Impl rule__BufferContainerType__Group_2__2 ;
+    public final void rule__BufferContainerType__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40267:1: ( rule__BufferContainerType__Group_2__1__Impl rule__BufferContainerType__Group_2__2 )
+            // InternalFormalML.g:40268:2: rule__BufferContainerType__Group_2__1__Impl rule__BufferContainerType__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_176);
+            rule__BufferContainerType__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferContainerType__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group_2__1"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group_2__1__Impl"
+    // InternalFormalML.g:40275:1: rule__BufferContainerType__Group_2__1__Impl : ( ( rule__BufferContainerType__Alternatives_2_1 )? ) ;
+    public final void rule__BufferContainerType__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40279:1: ( ( ( rule__BufferContainerType__Alternatives_2_1 )? ) )
+            // InternalFormalML.g:40280:1: ( ( rule__BufferContainerType__Alternatives_2_1 )? )
+            {
+            // InternalFormalML.g:40280:1: ( ( rule__BufferContainerType__Alternatives_2_1 )? )
+            // InternalFormalML.g:40281:2: ( rule__BufferContainerType__Alternatives_2_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getAlternatives_2_1()); 
+            }
+            // InternalFormalML.g:40282:2: ( rule__BufferContainerType__Alternatives_2_1 )?
+            int alt549=2;
+            int LA549_0 = input.LA(1);
+
+            if ( (LA549_0==RULE_INT||LA549_0==58||LA549_0==132) ) {
+                alt549=1;
+            }
+            switch (alt549) {
+                case 1 :
+                    // InternalFormalML.g:40282:3: rule__BufferContainerType__Alternatives_2_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferContainerType__Alternatives_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getAlternatives_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group_2__2"
+    // InternalFormalML.g:40290:1: rule__BufferContainerType__Group_2__2 : rule__BufferContainerType__Group_2__2__Impl ;
+    public final void rule__BufferContainerType__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40294:1: ( rule__BufferContainerType__Group_2__2__Impl )
+            // InternalFormalML.g:40295:2: rule__BufferContainerType__Group_2__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferContainerType__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group_2__2"
+
+
+    // $ANTLR start "rule__BufferContainerType__Group_2__2__Impl"
+    // InternalFormalML.g:40301:1: rule__BufferContainerType__Group_2__2__Impl : ( '>' ) ;
+    public final void rule__BufferContainerType__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40305:1: ( ( '>' ) )
+            // InternalFormalML.g:40306:1: ( '>' )
+            {
+            // InternalFormalML.g:40306:1: ( '>' )
+            // InternalFormalML.g:40307:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getGreaterThanSignKeyword_2_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getGreaterThanSignKeyword_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__Buffer__Group__0"
+    // InternalFormalML.g:40317:1: rule__Buffer__Group__0 : rule__Buffer__Group__0__Impl rule__Buffer__Group__1 ;
+    public final void rule__Buffer__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40321:1: ( rule__Buffer__Group__0__Impl rule__Buffer__Group__1 )
+            // InternalFormalML.g:40322:2: rule__Buffer__Group__0__Impl rule__Buffer__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_177);
+            rule__Buffer__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__0"
+
+
+    // $ANTLR start "rule__Buffer__Group__0__Impl"
+    // InternalFormalML.g:40329:1: rule__Buffer__Group__0__Impl : ( ( rule__Buffer__UnorderedGroup_0 ) ) ;
+    public final void rule__Buffer__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40333:1: ( ( ( rule__Buffer__UnorderedGroup_0 ) ) )
+            // InternalFormalML.g:40334:1: ( ( rule__Buffer__UnorderedGroup_0 ) )
+            {
+            // InternalFormalML.g:40334:1: ( ( rule__Buffer__UnorderedGroup_0 ) )
+            // InternalFormalML.g:40335:2: ( rule__Buffer__UnorderedGroup_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getUnorderedGroup_0()); 
+            }
+            // InternalFormalML.g:40336:2: ( rule__Buffer__UnorderedGroup_0 )
+            // InternalFormalML.g:40336:3: rule__Buffer__UnorderedGroup_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__UnorderedGroup_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getUnorderedGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Buffer__Group__1"
+    // InternalFormalML.g:40344:1: rule__Buffer__Group__1 : rule__Buffer__Group__1__Impl rule__Buffer__Group__2 ;
+    public final void rule__Buffer__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40348:1: ( rule__Buffer__Group__1__Impl rule__Buffer__Group__2 )
+            // InternalFormalML.g:40349:2: rule__Buffer__Group__1__Impl rule__Buffer__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_175);
+            rule__Buffer__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__1"
+
+
+    // $ANTLR start "rule__Buffer__Group__1__Impl"
+    // InternalFormalML.g:40356:1: rule__Buffer__Group__1__Impl : ( 'buffer' ) ;
+    public final void rule__Buffer__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40360:1: ( ( 'buffer' ) )
+            // InternalFormalML.g:40361:1: ( 'buffer' )
+            {
+            // InternalFormalML.g:40361:1: ( 'buffer' )
+            // InternalFormalML.g:40362:2: 'buffer'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getBufferKeyword_1()); 
+            }
+            match(input,15,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getBufferKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Buffer__Group__2"
+    // InternalFormalML.g:40371:1: rule__Buffer__Group__2 : rule__Buffer__Group__2__Impl rule__Buffer__Group__3 ;
+    public final void rule__Buffer__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40375:1: ( rule__Buffer__Group__2__Impl rule__Buffer__Group__3 )
+            // InternalFormalML.g:40376:2: rule__Buffer__Group__2__Impl rule__Buffer__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__Buffer__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__2"
+
+
+    // $ANTLR start "rule__Buffer__Group__2__Impl"
+    // InternalFormalML.g:40383:1: rule__Buffer__Group__2__Impl : ( ( rule__Buffer__TypeAssignment_2 ) ) ;
+    public final void rule__Buffer__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40387:1: ( ( ( rule__Buffer__TypeAssignment_2 ) ) )
+            // InternalFormalML.g:40388:1: ( ( rule__Buffer__TypeAssignment_2 ) )
+            {
+            // InternalFormalML.g:40388:1: ( ( rule__Buffer__TypeAssignment_2 ) )
+            // InternalFormalML.g:40389:2: ( rule__Buffer__TypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getTypeAssignment_2()); 
+            }
+            // InternalFormalML.g:40390:2: ( rule__Buffer__TypeAssignment_2 )
+            // InternalFormalML.g:40390:3: rule__Buffer__TypeAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__TypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Buffer__Group__3"
+    // InternalFormalML.g:40398:1: rule__Buffer__Group__3 : rule__Buffer__Group__3__Impl rule__Buffer__Group__4 ;
+    public final void rule__Buffer__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40402:1: ( rule__Buffer__Group__3__Impl rule__Buffer__Group__4 )
+            // InternalFormalML.g:40403:2: rule__Buffer__Group__3__Impl rule__Buffer__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_178);
+            rule__Buffer__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__3"
+
+
+    // $ANTLR start "rule__Buffer__Group__3__Impl"
+    // InternalFormalML.g:40410:1: rule__Buffer__Group__3__Impl : ( ( rule__Buffer__NameAssignment_3 ) ) ;
+    public final void rule__Buffer__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40414:1: ( ( ( rule__Buffer__NameAssignment_3 ) ) )
+            // InternalFormalML.g:40415:1: ( ( rule__Buffer__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:40415:1: ( ( rule__Buffer__NameAssignment_3 ) )
+            // InternalFormalML.g:40416:2: ( rule__Buffer__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:40417:2: ( rule__Buffer__NameAssignment_3 )
+            // InternalFormalML.g:40417:3: rule__Buffer__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Buffer__Group__4"
+    // InternalFormalML.g:40425:1: rule__Buffer__Group__4 : rule__Buffer__Group__4__Impl rule__Buffer__Group__5 ;
+    public final void rule__Buffer__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40429:1: ( rule__Buffer__Group__4__Impl rule__Buffer__Group__5 )
+            // InternalFormalML.g:40430:2: rule__Buffer__Group__4__Impl rule__Buffer__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_178);
+            rule__Buffer__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__4"
+
+
+    // $ANTLR start "rule__Buffer__Group__4__Impl"
+    // InternalFormalML.g:40437:1: rule__Buffer__Group__4__Impl : ( ( rule__Buffer__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__Buffer__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40441:1: ( ( ( rule__Buffer__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:40442:1: ( ( rule__Buffer__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:40442:1: ( ( rule__Buffer__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:40443:2: ( rule__Buffer__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:40444:2: ( rule__Buffer__UnrestrictedNameAssignment_4 )?
+            int alt550=2;
+            int LA550_0 = input.LA(1);
+
+            if ( (LA550_0==RULE_STRING) ) {
+                alt550=1;
+            }
+            switch (alt550) {
+                case 1 :
+                    // InternalFormalML.g:40444:3: rule__Buffer__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Buffer__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Buffer__Group__5"
+    // InternalFormalML.g:40452:1: rule__Buffer__Group__5 : rule__Buffer__Group__5__Impl ;
+    public final void rule__Buffer__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40456:1: ( rule__Buffer__Group__5__Impl )
+            // InternalFormalML.g:40457:2: rule__Buffer__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__5"
+
+
+    // $ANTLR start "rule__Buffer__Group__5__Impl"
+    // InternalFormalML.g:40463:1: rule__Buffer__Group__5__Impl : ( ';' ) ;
+    public final void rule__Buffer__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40467:1: ( ( ';' ) )
+            // InternalFormalML.g:40468:1: ( ';' )
+            {
+            // InternalFormalML.g:40468:1: ( ';' )
+            // InternalFormalML.g:40469:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__Group__5__Impl"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__0"
+    // InternalFormalML.g:40479:1: rule__BufferPublic__Group__0 : rule__BufferPublic__Group__0__Impl rule__BufferPublic__Group__1 ;
+    public final void rule__BufferPublic__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40483:1: ( rule__BufferPublic__Group__0__Impl rule__BufferPublic__Group__1 )
+            // InternalFormalML.g:40484:2: rule__BufferPublic__Group__0__Impl rule__BufferPublic__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_179);
+            rule__BufferPublic__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__0"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__0__Impl"
+    // InternalFormalML.g:40491:1: rule__BufferPublic__Group__0__Impl : ( ( rule__BufferPublic__ModifierAssignment_0 )? ) ;
+    public final void rule__BufferPublic__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40495:1: ( ( ( rule__BufferPublic__ModifierAssignment_0 )? ) )
+            // InternalFormalML.g:40496:1: ( ( rule__BufferPublic__ModifierAssignment_0 )? )
+            {
+            // InternalFormalML.g:40496:1: ( ( rule__BufferPublic__ModifierAssignment_0 )? )
+            // InternalFormalML.g:40497:2: ( rule__BufferPublic__ModifierAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getModifierAssignment_0()); 
+            }
+            // InternalFormalML.g:40498:2: ( rule__BufferPublic__ModifierAssignment_0 )?
+            int alt551=2;
+            int LA551_0 = input.LA(1);
+
+            if ( (LA551_0==179||(LA551_0>=278 && LA551_0<=281)) ) {
+                alt551=1;
+            }
+            else if ( (LA551_0==15) ) {
+                int LA551_2 = input.LA(2);
+
+                if ( (synpred838_InternalFormalML()) ) {
+                    alt551=1;
+                }
+            }
+            switch (alt551) {
+                case 1 :
+                    // InternalFormalML.g:40498:3: rule__BufferPublic__ModifierAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferPublic__ModifierAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getModifierAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__0__Impl"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__1"
+    // InternalFormalML.g:40506:1: rule__BufferPublic__Group__1 : rule__BufferPublic__Group__1__Impl rule__BufferPublic__Group__2 ;
+    public final void rule__BufferPublic__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40510:1: ( rule__BufferPublic__Group__1__Impl rule__BufferPublic__Group__2 )
+            // InternalFormalML.g:40511:2: rule__BufferPublic__Group__1__Impl rule__BufferPublic__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_175);
+            rule__BufferPublic__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__1"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__1__Impl"
+    // InternalFormalML.g:40518:1: rule__BufferPublic__Group__1__Impl : ( ( rule__BufferPublic__VisibilityAssignment_1 ) ) ;
+    public final void rule__BufferPublic__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40522:1: ( ( ( rule__BufferPublic__VisibilityAssignment_1 ) ) )
+            // InternalFormalML.g:40523:1: ( ( rule__BufferPublic__VisibilityAssignment_1 ) )
+            {
+            // InternalFormalML.g:40523:1: ( ( rule__BufferPublic__VisibilityAssignment_1 ) )
+            // InternalFormalML.g:40524:2: ( rule__BufferPublic__VisibilityAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:40525:2: ( rule__BufferPublic__VisibilityAssignment_1 )
+            // InternalFormalML.g:40525:3: rule__BufferPublic__VisibilityAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__VisibilityAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__1__Impl"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__2"
+    // InternalFormalML.g:40533:1: rule__BufferPublic__Group__2 : rule__BufferPublic__Group__2__Impl rule__BufferPublic__Group__3 ;
+    public final void rule__BufferPublic__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40537:1: ( rule__BufferPublic__Group__2__Impl rule__BufferPublic__Group__3 )
+            // InternalFormalML.g:40538:2: rule__BufferPublic__Group__2__Impl rule__BufferPublic__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__BufferPublic__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__2"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__2__Impl"
+    // InternalFormalML.g:40545:1: rule__BufferPublic__Group__2__Impl : ( ( rule__BufferPublic__TypeAssignment_2 ) ) ;
+    public final void rule__BufferPublic__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40549:1: ( ( ( rule__BufferPublic__TypeAssignment_2 ) ) )
+            // InternalFormalML.g:40550:1: ( ( rule__BufferPublic__TypeAssignment_2 ) )
+            {
+            // InternalFormalML.g:40550:1: ( ( rule__BufferPublic__TypeAssignment_2 ) )
+            // InternalFormalML.g:40551:2: ( rule__BufferPublic__TypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getTypeAssignment_2()); 
+            }
+            // InternalFormalML.g:40552:2: ( rule__BufferPublic__TypeAssignment_2 )
+            // InternalFormalML.g:40552:3: rule__BufferPublic__TypeAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__TypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__2__Impl"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__3"
+    // InternalFormalML.g:40560:1: rule__BufferPublic__Group__3 : rule__BufferPublic__Group__3__Impl rule__BufferPublic__Group__4 ;
+    public final void rule__BufferPublic__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40564:1: ( rule__BufferPublic__Group__3__Impl rule__BufferPublic__Group__4 )
+            // InternalFormalML.g:40565:2: rule__BufferPublic__Group__3__Impl rule__BufferPublic__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_178);
+            rule__BufferPublic__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__3"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__3__Impl"
+    // InternalFormalML.g:40572:1: rule__BufferPublic__Group__3__Impl : ( ( rule__BufferPublic__NameAssignment_3 ) ) ;
+    public final void rule__BufferPublic__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40576:1: ( ( ( rule__BufferPublic__NameAssignment_3 ) ) )
+            // InternalFormalML.g:40577:1: ( ( rule__BufferPublic__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:40577:1: ( ( rule__BufferPublic__NameAssignment_3 ) )
+            // InternalFormalML.g:40578:2: ( rule__BufferPublic__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:40579:2: ( rule__BufferPublic__NameAssignment_3 )
+            // InternalFormalML.g:40579:3: rule__BufferPublic__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__3__Impl"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__4"
+    // InternalFormalML.g:40587:1: rule__BufferPublic__Group__4 : rule__BufferPublic__Group__4__Impl rule__BufferPublic__Group__5 ;
+    public final void rule__BufferPublic__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40591:1: ( rule__BufferPublic__Group__4__Impl rule__BufferPublic__Group__5 )
+            // InternalFormalML.g:40592:2: rule__BufferPublic__Group__4__Impl rule__BufferPublic__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_178);
+            rule__BufferPublic__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__4"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__4__Impl"
+    // InternalFormalML.g:40599:1: rule__BufferPublic__Group__4__Impl : ( ( rule__BufferPublic__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__BufferPublic__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40603:1: ( ( ( rule__BufferPublic__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:40604:1: ( ( rule__BufferPublic__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:40604:1: ( ( rule__BufferPublic__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:40605:2: ( rule__BufferPublic__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:40606:2: ( rule__BufferPublic__UnrestrictedNameAssignment_4 )?
+            int alt552=2;
+            int LA552_0 = input.LA(1);
+
+            if ( (LA552_0==RULE_STRING) ) {
+                alt552=1;
+            }
+            switch (alt552) {
+                case 1 :
+                    // InternalFormalML.g:40606:3: rule__BufferPublic__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferPublic__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__4__Impl"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__5"
+    // InternalFormalML.g:40614:1: rule__BufferPublic__Group__5 : rule__BufferPublic__Group__5__Impl ;
+    public final void rule__BufferPublic__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40618:1: ( rule__BufferPublic__Group__5__Impl )
+            // InternalFormalML.g:40619:2: rule__BufferPublic__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPublic__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__5"
+
+
+    // $ANTLR start "rule__BufferPublic__Group__5__Impl"
+    // InternalFormalML.g:40625:1: rule__BufferPublic__Group__5__Impl : ( ';' ) ;
+    public final void rule__BufferPublic__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40629:1: ( ( ';' ) )
+            // InternalFormalML.g:40630:1: ( ';' )
+            {
+            // InternalFormalML.g:40630:1: ( ';' )
+            // InternalFormalML.g:40631:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__Group__5__Impl"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__0"
+    // InternalFormalML.g:40641:1: rule__BufferProtected__Group__0 : rule__BufferProtected__Group__0__Impl rule__BufferProtected__Group__1 ;
+    public final void rule__BufferProtected__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40645:1: ( rule__BufferProtected__Group__0__Impl rule__BufferProtected__Group__1 )
+            // InternalFormalML.g:40646:2: rule__BufferProtected__Group__0__Impl rule__BufferProtected__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_179);
+            rule__BufferProtected__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__0"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__0__Impl"
+    // InternalFormalML.g:40653:1: rule__BufferProtected__Group__0__Impl : ( ( rule__BufferProtected__ModifierAssignment_0 )? ) ;
+    public final void rule__BufferProtected__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40657:1: ( ( ( rule__BufferProtected__ModifierAssignment_0 )? ) )
+            // InternalFormalML.g:40658:1: ( ( rule__BufferProtected__ModifierAssignment_0 )? )
+            {
+            // InternalFormalML.g:40658:1: ( ( rule__BufferProtected__ModifierAssignment_0 )? )
+            // InternalFormalML.g:40659:2: ( rule__BufferProtected__ModifierAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getModifierAssignment_0()); 
+            }
+            // InternalFormalML.g:40660:2: ( rule__BufferProtected__ModifierAssignment_0 )?
+            int alt553=2;
+            int LA553_0 = input.LA(1);
+
+            if ( (LA553_0==179||(LA553_0>=278 && LA553_0<=281)) ) {
+                alt553=1;
+            }
+            else if ( (LA553_0==15) ) {
+                int LA553_2 = input.LA(2);
+
+                if ( (synpred840_InternalFormalML()) ) {
+                    alt553=1;
+                }
+            }
+            switch (alt553) {
+                case 1 :
+                    // InternalFormalML.g:40660:3: rule__BufferProtected__ModifierAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferProtected__ModifierAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getModifierAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__0__Impl"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__1"
+    // InternalFormalML.g:40668:1: rule__BufferProtected__Group__1 : rule__BufferProtected__Group__1__Impl rule__BufferProtected__Group__2 ;
+    public final void rule__BufferProtected__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40672:1: ( rule__BufferProtected__Group__1__Impl rule__BufferProtected__Group__2 )
+            // InternalFormalML.g:40673:2: rule__BufferProtected__Group__1__Impl rule__BufferProtected__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_175);
+            rule__BufferProtected__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__1"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__1__Impl"
+    // InternalFormalML.g:40680:1: rule__BufferProtected__Group__1__Impl : ( ( rule__BufferProtected__VisibilityAssignment_1 ) ) ;
+    public final void rule__BufferProtected__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40684:1: ( ( ( rule__BufferProtected__VisibilityAssignment_1 ) ) )
+            // InternalFormalML.g:40685:1: ( ( rule__BufferProtected__VisibilityAssignment_1 ) )
+            {
+            // InternalFormalML.g:40685:1: ( ( rule__BufferProtected__VisibilityAssignment_1 ) )
+            // InternalFormalML.g:40686:2: ( rule__BufferProtected__VisibilityAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:40687:2: ( rule__BufferProtected__VisibilityAssignment_1 )
+            // InternalFormalML.g:40687:3: rule__BufferProtected__VisibilityAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__VisibilityAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__1__Impl"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__2"
+    // InternalFormalML.g:40695:1: rule__BufferProtected__Group__2 : rule__BufferProtected__Group__2__Impl rule__BufferProtected__Group__3 ;
+    public final void rule__BufferProtected__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40699:1: ( rule__BufferProtected__Group__2__Impl rule__BufferProtected__Group__3 )
+            // InternalFormalML.g:40700:2: rule__BufferProtected__Group__2__Impl rule__BufferProtected__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__BufferProtected__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__2"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__2__Impl"
+    // InternalFormalML.g:40707:1: rule__BufferProtected__Group__2__Impl : ( ( rule__BufferProtected__TypeAssignment_2 ) ) ;
+    public final void rule__BufferProtected__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40711:1: ( ( ( rule__BufferProtected__TypeAssignment_2 ) ) )
+            // InternalFormalML.g:40712:1: ( ( rule__BufferProtected__TypeAssignment_2 ) )
+            {
+            // InternalFormalML.g:40712:1: ( ( rule__BufferProtected__TypeAssignment_2 ) )
+            // InternalFormalML.g:40713:2: ( rule__BufferProtected__TypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getTypeAssignment_2()); 
+            }
+            // InternalFormalML.g:40714:2: ( rule__BufferProtected__TypeAssignment_2 )
+            // InternalFormalML.g:40714:3: rule__BufferProtected__TypeAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__TypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__2__Impl"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__3"
+    // InternalFormalML.g:40722:1: rule__BufferProtected__Group__3 : rule__BufferProtected__Group__3__Impl rule__BufferProtected__Group__4 ;
+    public final void rule__BufferProtected__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40726:1: ( rule__BufferProtected__Group__3__Impl rule__BufferProtected__Group__4 )
+            // InternalFormalML.g:40727:2: rule__BufferProtected__Group__3__Impl rule__BufferProtected__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_178);
+            rule__BufferProtected__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__3"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__3__Impl"
+    // InternalFormalML.g:40734:1: rule__BufferProtected__Group__3__Impl : ( ( rule__BufferProtected__NameAssignment_3 ) ) ;
+    public final void rule__BufferProtected__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40738:1: ( ( ( rule__BufferProtected__NameAssignment_3 ) ) )
+            // InternalFormalML.g:40739:1: ( ( rule__BufferProtected__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:40739:1: ( ( rule__BufferProtected__NameAssignment_3 ) )
+            // InternalFormalML.g:40740:2: ( rule__BufferProtected__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:40741:2: ( rule__BufferProtected__NameAssignment_3 )
+            // InternalFormalML.g:40741:3: rule__BufferProtected__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__3__Impl"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__4"
+    // InternalFormalML.g:40749:1: rule__BufferProtected__Group__4 : rule__BufferProtected__Group__4__Impl rule__BufferProtected__Group__5 ;
+    public final void rule__BufferProtected__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40753:1: ( rule__BufferProtected__Group__4__Impl rule__BufferProtected__Group__5 )
+            // InternalFormalML.g:40754:2: rule__BufferProtected__Group__4__Impl rule__BufferProtected__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_178);
+            rule__BufferProtected__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__4"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__4__Impl"
+    // InternalFormalML.g:40761:1: rule__BufferProtected__Group__4__Impl : ( ( rule__BufferProtected__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__BufferProtected__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40765:1: ( ( ( rule__BufferProtected__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:40766:1: ( ( rule__BufferProtected__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:40766:1: ( ( rule__BufferProtected__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:40767:2: ( rule__BufferProtected__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:40768:2: ( rule__BufferProtected__UnrestrictedNameAssignment_4 )?
+            int alt554=2;
+            int LA554_0 = input.LA(1);
+
+            if ( (LA554_0==RULE_STRING) ) {
+                alt554=1;
+            }
+            switch (alt554) {
+                case 1 :
+                    // InternalFormalML.g:40768:3: rule__BufferProtected__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferProtected__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__4__Impl"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__5"
+    // InternalFormalML.g:40776:1: rule__BufferProtected__Group__5 : rule__BufferProtected__Group__5__Impl ;
+    public final void rule__BufferProtected__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40780:1: ( rule__BufferProtected__Group__5__Impl )
+            // InternalFormalML.g:40781:2: rule__BufferProtected__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferProtected__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__5"
+
+
+    // $ANTLR start "rule__BufferProtected__Group__5__Impl"
+    // InternalFormalML.g:40787:1: rule__BufferProtected__Group__5__Impl : ( ';' ) ;
+    public final void rule__BufferProtected__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40791:1: ( ( ';' ) )
+            // InternalFormalML.g:40792:1: ( ';' )
+            {
+            // InternalFormalML.g:40792:1: ( ';' )
+            // InternalFormalML.g:40793:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__Group__5__Impl"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__0"
+    // InternalFormalML.g:40803:1: rule__BufferPrivate__Group__0 : rule__BufferPrivate__Group__0__Impl rule__BufferPrivate__Group__1 ;
+    public final void rule__BufferPrivate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40807:1: ( rule__BufferPrivate__Group__0__Impl rule__BufferPrivate__Group__1 )
+            // InternalFormalML.g:40808:2: rule__BufferPrivate__Group__0__Impl rule__BufferPrivate__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_179);
+            rule__BufferPrivate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__0"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__0__Impl"
+    // InternalFormalML.g:40815:1: rule__BufferPrivate__Group__0__Impl : ( ( rule__BufferPrivate__ModifierAssignment_0 )? ) ;
+    public final void rule__BufferPrivate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40819:1: ( ( ( rule__BufferPrivate__ModifierAssignment_0 )? ) )
+            // InternalFormalML.g:40820:1: ( ( rule__BufferPrivate__ModifierAssignment_0 )? )
+            {
+            // InternalFormalML.g:40820:1: ( ( rule__BufferPrivate__ModifierAssignment_0 )? )
+            // InternalFormalML.g:40821:2: ( rule__BufferPrivate__ModifierAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getModifierAssignment_0()); 
+            }
+            // InternalFormalML.g:40822:2: ( rule__BufferPrivate__ModifierAssignment_0 )?
+            int alt555=2;
+            int LA555_0 = input.LA(1);
+
+            if ( (LA555_0==179||(LA555_0>=278 && LA555_0<=281)) ) {
+                alt555=1;
+            }
+            else if ( (LA555_0==15) ) {
+                int LA555_2 = input.LA(2);
+
+                if ( (synpred842_InternalFormalML()) ) {
+                    alt555=1;
+                }
+            }
+            switch (alt555) {
+                case 1 :
+                    // InternalFormalML.g:40822:3: rule__BufferPrivate__ModifierAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferPrivate__ModifierAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getModifierAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__1"
+    // InternalFormalML.g:40830:1: rule__BufferPrivate__Group__1 : rule__BufferPrivate__Group__1__Impl rule__BufferPrivate__Group__2 ;
+    public final void rule__BufferPrivate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40834:1: ( rule__BufferPrivate__Group__1__Impl rule__BufferPrivate__Group__2 )
+            // InternalFormalML.g:40835:2: rule__BufferPrivate__Group__1__Impl rule__BufferPrivate__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_175);
+            rule__BufferPrivate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__1"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__1__Impl"
+    // InternalFormalML.g:40842:1: rule__BufferPrivate__Group__1__Impl : ( ( rule__BufferPrivate__VisibilityAssignment_1 ) ) ;
+    public final void rule__BufferPrivate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40846:1: ( ( ( rule__BufferPrivate__VisibilityAssignment_1 ) ) )
+            // InternalFormalML.g:40847:1: ( ( rule__BufferPrivate__VisibilityAssignment_1 ) )
+            {
+            // InternalFormalML.g:40847:1: ( ( rule__BufferPrivate__VisibilityAssignment_1 ) )
+            // InternalFormalML.g:40848:2: ( rule__BufferPrivate__VisibilityAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getVisibilityAssignment_1()); 
+            }
+            // InternalFormalML.g:40849:2: ( rule__BufferPrivate__VisibilityAssignment_1 )
+            // InternalFormalML.g:40849:3: rule__BufferPrivate__VisibilityAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__VisibilityAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getVisibilityAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__2"
+    // InternalFormalML.g:40857:1: rule__BufferPrivate__Group__2 : rule__BufferPrivate__Group__2__Impl rule__BufferPrivate__Group__3 ;
+    public final void rule__BufferPrivate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40861:1: ( rule__BufferPrivate__Group__2__Impl rule__BufferPrivate__Group__3 )
+            // InternalFormalML.g:40862:2: rule__BufferPrivate__Group__2__Impl rule__BufferPrivate__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__BufferPrivate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__2"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__2__Impl"
+    // InternalFormalML.g:40869:1: rule__BufferPrivate__Group__2__Impl : ( ( rule__BufferPrivate__TypeAssignment_2 ) ) ;
+    public final void rule__BufferPrivate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40873:1: ( ( ( rule__BufferPrivate__TypeAssignment_2 ) ) )
+            // InternalFormalML.g:40874:1: ( ( rule__BufferPrivate__TypeAssignment_2 ) )
+            {
+            // InternalFormalML.g:40874:1: ( ( rule__BufferPrivate__TypeAssignment_2 ) )
+            // InternalFormalML.g:40875:2: ( rule__BufferPrivate__TypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getTypeAssignment_2()); 
+            }
+            // InternalFormalML.g:40876:2: ( rule__BufferPrivate__TypeAssignment_2 )
+            // InternalFormalML.g:40876:3: rule__BufferPrivate__TypeAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__TypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__3"
+    // InternalFormalML.g:40884:1: rule__BufferPrivate__Group__3 : rule__BufferPrivate__Group__3__Impl rule__BufferPrivate__Group__4 ;
+    public final void rule__BufferPrivate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40888:1: ( rule__BufferPrivate__Group__3__Impl rule__BufferPrivate__Group__4 )
+            // InternalFormalML.g:40889:2: rule__BufferPrivate__Group__3__Impl rule__BufferPrivate__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_178);
+            rule__BufferPrivate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__3"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__3__Impl"
+    // InternalFormalML.g:40896:1: rule__BufferPrivate__Group__3__Impl : ( ( rule__BufferPrivate__NameAssignment_3 ) ) ;
+    public final void rule__BufferPrivate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40900:1: ( ( ( rule__BufferPrivate__NameAssignment_3 ) ) )
+            // InternalFormalML.g:40901:1: ( ( rule__BufferPrivate__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:40901:1: ( ( rule__BufferPrivate__NameAssignment_3 ) )
+            // InternalFormalML.g:40902:2: ( rule__BufferPrivate__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:40903:2: ( rule__BufferPrivate__NameAssignment_3 )
+            // InternalFormalML.g:40903:3: rule__BufferPrivate__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__4"
+    // InternalFormalML.g:40911:1: rule__BufferPrivate__Group__4 : rule__BufferPrivate__Group__4__Impl rule__BufferPrivate__Group__5 ;
+    public final void rule__BufferPrivate__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40915:1: ( rule__BufferPrivate__Group__4__Impl rule__BufferPrivate__Group__5 )
+            // InternalFormalML.g:40916:2: rule__BufferPrivate__Group__4__Impl rule__BufferPrivate__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_178);
+            rule__BufferPrivate__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__4"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__4__Impl"
+    // InternalFormalML.g:40923:1: rule__BufferPrivate__Group__4__Impl : ( ( rule__BufferPrivate__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__BufferPrivate__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40927:1: ( ( ( rule__BufferPrivate__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:40928:1: ( ( rule__BufferPrivate__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:40928:1: ( ( rule__BufferPrivate__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:40929:2: ( rule__BufferPrivate__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:40930:2: ( rule__BufferPrivate__UnrestrictedNameAssignment_4 )?
+            int alt556=2;
+            int LA556_0 = input.LA(1);
+
+            if ( (LA556_0==RULE_STRING) ) {
+                alt556=1;
+            }
+            switch (alt556) {
+                case 1 :
+                    // InternalFormalML.g:40930:3: rule__BufferPrivate__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BufferPrivate__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__4__Impl"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__5"
+    // InternalFormalML.g:40938:1: rule__BufferPrivate__Group__5 : rule__BufferPrivate__Group__5__Impl ;
+    public final void rule__BufferPrivate__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40942:1: ( rule__BufferPrivate__Group__5__Impl )
+            // InternalFormalML.g:40943:2: rule__BufferPrivate__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BufferPrivate__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__5"
+
+
+    // $ANTLR start "rule__BufferPrivate__Group__5__Impl"
+    // InternalFormalML.g:40949:1: rule__BufferPrivate__Group__5__Impl : ( ';' ) ;
+    public final void rule__BufferPrivate__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40953:1: ( ( ';' ) )
+            // InternalFormalML.g:40954:1: ( ';' )
+            {
+            // InternalFormalML.g:40954:1: ( ';' )
+            // InternalFormalML.g:40955:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Port__Group__0"
+    // InternalFormalML.g:40965:1: rule__Port__Group__0 : rule__Port__Group__0__Impl rule__Port__Group__1 ;
+    public final void rule__Port__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40969:1: ( rule__Port__Group__0__Impl rule__Port__Group__1 )
+            // InternalFormalML.g:40970:2: rule__Port__Group__0__Impl rule__Port__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_180);
+            rule__Port__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__0"
+
+
+    // $ANTLR start "rule__Port__Group__0__Impl"
+    // InternalFormalML.g:40977:1: rule__Port__Group__0__Impl : ( ( rule__Port__VisibilityAssignment_0 )? ) ;
+    public final void rule__Port__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40981:1: ( ( ( rule__Port__VisibilityAssignment_0 )? ) )
+            // InternalFormalML.g:40982:1: ( ( rule__Port__VisibilityAssignment_0 )? )
+            {
+            // InternalFormalML.g:40982:1: ( ( rule__Port__VisibilityAssignment_0 )? )
+            // InternalFormalML.g:40983:2: ( rule__Port__VisibilityAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:40984:2: ( rule__Port__VisibilityAssignment_0 )?
+            int alt557=2;
+            int LA557_0 = input.LA(1);
+
+            if ( (LA557_0==28||(LA557_0>=143 && LA557_0<=145)) ) {
+                alt557=1;
+            }
+            switch (alt557) {
+                case 1 :
+                    // InternalFormalML.g:40984:3: rule__Port__VisibilityAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Port__VisibilityAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Port__Group__1"
+    // InternalFormalML.g:40992:1: rule__Port__Group__1 : rule__Port__Group__1__Impl rule__Port__Group__2 ;
+    public final void rule__Port__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:40996:1: ( rule__Port__Group__1__Impl rule__Port__Group__2 )
+            // InternalFormalML.g:40997:2: rule__Port__Group__1__Impl rule__Port__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__Port__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__1"
+
+
+    // $ANTLR start "rule__Port__Group__1__Impl"
+    // InternalFormalML.g:41004:1: rule__Port__Group__1__Impl : ( 'port' ) ;
+    public final void rule__Port__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41008:1: ( ( 'port' ) )
+            // InternalFormalML.g:41009:1: ( 'port' )
+            {
+            // InternalFormalML.g:41009:1: ( 'port' )
+            // InternalFormalML.g:41010:2: 'port'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getPortKeyword_1()); 
+            }
+            match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getPortKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Port__Group__2"
+    // InternalFormalML.g:41019:1: rule__Port__Group__2 : rule__Port__Group__2__Impl rule__Port__Group__3 ;
+    public final void rule__Port__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41023:1: ( rule__Port__Group__2__Impl rule__Port__Group__3 )
+            // InternalFormalML.g:41024:2: rule__Port__Group__2__Impl rule__Port__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__Port__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__2"
+
+
+    // $ANTLR start "rule__Port__Group__2__Impl"
+    // InternalFormalML.g:41031:1: rule__Port__Group__2__Impl : ( ( rule__Port__DirectionAssignment_2 )? ) ;
+    public final void rule__Port__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41035:1: ( ( ( rule__Port__DirectionAssignment_2 )? ) )
+            // InternalFormalML.g:41036:1: ( ( rule__Port__DirectionAssignment_2 )? )
+            {
+            // InternalFormalML.g:41036:1: ( ( rule__Port__DirectionAssignment_2 )? )
+            // InternalFormalML.g:41037:2: ( rule__Port__DirectionAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getDirectionAssignment_2()); 
+            }
+            // InternalFormalML.g:41038:2: ( rule__Port__DirectionAssignment_2 )?
+            int alt558=2;
+            int LA558_0 = input.LA(1);
+
+            if ( (LA558_0==173||(LA558_0>=175 && LA558_0<=176)) ) {
+                alt558=1;
+            }
+            switch (alt558) {
+                case 1 :
+                    // InternalFormalML.g:41038:3: rule__Port__DirectionAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Port__DirectionAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getDirectionAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Port__Group__3"
+    // InternalFormalML.g:41046:1: rule__Port__Group__3 : rule__Port__Group__3__Impl rule__Port__Group__4 ;
+    public final void rule__Port__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41050:1: ( rule__Port__Group__3__Impl rule__Port__Group__4 )
+            // InternalFormalML.g:41051:2: rule__Port__Group__3__Impl rule__Port__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__Port__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__3"
+
+
+    // $ANTLR start "rule__Port__Group__3__Impl"
+    // InternalFormalML.g:41058:1: rule__Port__Group__3__Impl : ( ( rule__Port__NameAssignment_3 ) ) ;
+    public final void rule__Port__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41062:1: ( ( ( rule__Port__NameAssignment_3 ) ) )
+            // InternalFormalML.g:41063:1: ( ( rule__Port__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:41063:1: ( ( rule__Port__NameAssignment_3 ) )
+            // InternalFormalML.g:41064:2: ( rule__Port__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:41065:2: ( rule__Port__NameAssignment_3 )
+            // InternalFormalML.g:41065:3: rule__Port__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Port__Group__4"
+    // InternalFormalML.g:41073:1: rule__Port__Group__4 : rule__Port__Group__4__Impl rule__Port__Group__5 ;
+    public final void rule__Port__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41077:1: ( rule__Port__Group__4__Impl rule__Port__Group__5 )
+            // InternalFormalML.g:41078:2: rule__Port__Group__4__Impl rule__Port__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__Port__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__4"
+
+
+    // $ANTLR start "rule__Port__Group__4__Impl"
+    // InternalFormalML.g:41085:1: rule__Port__Group__4__Impl : ( ( rule__Port__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__Port__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41089:1: ( ( ( rule__Port__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:41090:1: ( ( rule__Port__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:41090:1: ( ( rule__Port__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:41091:2: ( rule__Port__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:41092:2: ( rule__Port__UnrestrictedNameAssignment_4 )?
+            int alt559=2;
+            int LA559_0 = input.LA(1);
+
+            if ( (LA559_0==RULE_STRING) ) {
+                alt559=1;
+            }
+            switch (alt559) {
+                case 1 :
+                    // InternalFormalML.g:41092:3: rule__Port__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Port__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Port__Group__5"
+    // InternalFormalML.g:41100:1: rule__Port__Group__5 : rule__Port__Group__5__Impl rule__Port__Group__6 ;
+    public final void rule__Port__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41104:1: ( rule__Port__Group__5__Impl rule__Port__Group__6 )
+            // InternalFormalML.g:41105:2: rule__Port__Group__5__Impl rule__Port__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__Port__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__5"
+
+
+    // $ANTLR start "rule__Port__Group__5__Impl"
+    // InternalFormalML.g:41112:1: rule__Port__Group__5__Impl : ( ( rule__Port__Group_5__0 )? ) ;
+    public final void rule__Port__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41116:1: ( ( ( rule__Port__Group_5__0 )? ) )
+            // InternalFormalML.g:41117:1: ( ( rule__Port__Group_5__0 )? )
+            {
+            // InternalFormalML.g:41117:1: ( ( rule__Port__Group_5__0 )? )
+            // InternalFormalML.g:41118:2: ( rule__Port__Group_5__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getGroup_5()); 
+            }
+            // InternalFormalML.g:41119:2: ( rule__Port__Group_5__0 )?
+            int alt560=2;
+            int LA560_0 = input.LA(1);
+
+            if ( (LA560_0==23) ) {
+                alt560=1;
+            }
+            switch (alt560) {
+                case 1 :
+                    // InternalFormalML.g:41119:3: rule__Port__Group_5__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Port__Group_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getGroup_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Port__Group__6"
+    // InternalFormalML.g:41127:1: rule__Port__Group__6 : rule__Port__Group__6__Impl ;
+    public final void rule__Port__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41131:1: ( rule__Port__Group__6__Impl )
+            // InternalFormalML.g:41132:2: rule__Port__Group__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__6"
+
+
+    // $ANTLR start "rule__Port__Group__6__Impl"
+    // InternalFormalML.g:41138:1: rule__Port__Group__6__Impl : ( ';' ) ;
+    public final void rule__Port__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41142:1: ( ( ';' ) )
+            // InternalFormalML.g:41143:1: ( ';' )
+            {
+            // InternalFormalML.g:41143:1: ( ';' )
+            // InternalFormalML.g:41144:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getSemicolonKeyword_6()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getSemicolonKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Port__Group_5__0"
+    // InternalFormalML.g:41154:1: rule__Port__Group_5__0 : rule__Port__Group_5__0__Impl rule__Port__Group_5__1 ;
+    public final void rule__Port__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41158:1: ( rule__Port__Group_5__0__Impl rule__Port__Group_5__1 )
+            // InternalFormalML.g:41159:2: rule__Port__Group_5__0__Impl rule__Port__Group_5__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__Port__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5__0"
+
+
+    // $ANTLR start "rule__Port__Group_5__0__Impl"
+    // InternalFormalML.g:41166:1: rule__Port__Group_5__0__Impl : ( '(' ) ;
+    public final void rule__Port__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41170:1: ( ( '(' ) )
+            // InternalFormalML.g:41171:1: ( '(' )
+            {
+            // InternalFormalML.g:41171:1: ( '(' )
+            // InternalFormalML.g:41172:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getLeftParenthesisKeyword_5_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getLeftParenthesisKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__Port__Group_5__1"
+    // InternalFormalML.g:41181:1: rule__Port__Group_5__1 : rule__Port__Group_5__1__Impl rule__Port__Group_5__2 ;
+    public final void rule__Port__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41185:1: ( rule__Port__Group_5__1__Impl rule__Port__Group_5__2 )
+            // InternalFormalML.g:41186:2: rule__Port__Group_5__1__Impl rule__Port__Group_5__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__Port__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group_5__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5__1"
+
+
+    // $ANTLR start "rule__Port__Group_5__1__Impl"
+    // InternalFormalML.g:41193:1: rule__Port__Group_5__1__Impl : ( ( rule__Port__ParameterAssignment_5_1 ) ) ;
+    public final void rule__Port__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41197:1: ( ( ( rule__Port__ParameterAssignment_5_1 ) ) )
+            // InternalFormalML.g:41198:1: ( ( rule__Port__ParameterAssignment_5_1 ) )
+            {
+            // InternalFormalML.g:41198:1: ( ( rule__Port__ParameterAssignment_5_1 ) )
+            // InternalFormalML.g:41199:2: ( rule__Port__ParameterAssignment_5_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getParameterAssignment_5_1()); 
+            }
+            // InternalFormalML.g:41200:2: ( rule__Port__ParameterAssignment_5_1 )
+            // InternalFormalML.g:41200:3: rule__Port__ParameterAssignment_5_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__ParameterAssignment_5_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getParameterAssignment_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__Port__Group_5__2"
+    // InternalFormalML.g:41208:1: rule__Port__Group_5__2 : rule__Port__Group_5__2__Impl rule__Port__Group_5__3 ;
+    public final void rule__Port__Group_5__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41212:1: ( rule__Port__Group_5__2__Impl rule__Port__Group_5__3 )
+            // InternalFormalML.g:41213:2: rule__Port__Group_5__2__Impl rule__Port__Group_5__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__Port__Group_5__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group_5__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5__2"
+
+
+    // $ANTLR start "rule__Port__Group_5__2__Impl"
+    // InternalFormalML.g:41220:1: rule__Port__Group_5__2__Impl : ( ( rule__Port__Group_5_2__0 )* ) ;
+    public final void rule__Port__Group_5__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41224:1: ( ( ( rule__Port__Group_5_2__0 )* ) )
+            // InternalFormalML.g:41225:1: ( ( rule__Port__Group_5_2__0 )* )
+            {
+            // InternalFormalML.g:41225:1: ( ( rule__Port__Group_5_2__0 )* )
+            // InternalFormalML.g:41226:2: ( rule__Port__Group_5_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getGroup_5_2()); 
+            }
+            // InternalFormalML.g:41227:2: ( rule__Port__Group_5_2__0 )*
+            loop561:
+            do {
+                int alt561=2;
+                int LA561_0 = input.LA(1);
+
+                if ( (LA561_0==198) ) {
+                    alt561=1;
+                }
+
+
+                switch (alt561) {
+            	case 1 :
+            	    // InternalFormalML.g:41227:3: rule__Port__Group_5_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__Port__Group_5_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop561;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getGroup_5_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5__2__Impl"
+
+
+    // $ANTLR start "rule__Port__Group_5__3"
+    // InternalFormalML.g:41235:1: rule__Port__Group_5__3 : rule__Port__Group_5__3__Impl ;
+    public final void rule__Port__Group_5__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41239:1: ( rule__Port__Group_5__3__Impl )
+            // InternalFormalML.g:41240:2: rule__Port__Group_5__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group_5__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5__3"
+
+
+    // $ANTLR start "rule__Port__Group_5__3__Impl"
+    // InternalFormalML.g:41246:1: rule__Port__Group_5__3__Impl : ( ')' ) ;
+    public final void rule__Port__Group_5__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41250:1: ( ( ')' ) )
+            // InternalFormalML.g:41251:1: ( ')' )
+            {
+            // InternalFormalML.g:41251:1: ( ')' )
+            // InternalFormalML.g:41252:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getRightParenthesisKeyword_5_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getRightParenthesisKeyword_5_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5__3__Impl"
+
+
+    // $ANTLR start "rule__Port__Group_5_2__0"
+    // InternalFormalML.g:41262:1: rule__Port__Group_5_2__0 : rule__Port__Group_5_2__0__Impl rule__Port__Group_5_2__1 ;
+    public final void rule__Port__Group_5_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41266:1: ( rule__Port__Group_5_2__0__Impl rule__Port__Group_5_2__1 )
+            // InternalFormalML.g:41267:2: rule__Port__Group_5_2__0__Impl rule__Port__Group_5_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__Port__Group_5_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group_5_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5_2__0"
+
+
+    // $ANTLR start "rule__Port__Group_5_2__0__Impl"
+    // InternalFormalML.g:41274:1: rule__Port__Group_5_2__0__Impl : ( ',' ) ;
+    public final void rule__Port__Group_5_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41278:1: ( ( ',' ) )
+            // InternalFormalML.g:41279:1: ( ',' )
+            {
+            // InternalFormalML.g:41279:1: ( ',' )
+            // InternalFormalML.g:41280:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getCommaKeyword_5_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getCommaKeyword_5_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5_2__0__Impl"
+
+
+    // $ANTLR start "rule__Port__Group_5_2__1"
+    // InternalFormalML.g:41289:1: rule__Port__Group_5_2__1 : rule__Port__Group_5_2__1__Impl ;
+    public final void rule__Port__Group_5_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41293:1: ( rule__Port__Group_5_2__1__Impl )
+            // InternalFormalML.g:41294:2: rule__Port__Group_5_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__Group_5_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5_2__1"
+
+
+    // $ANTLR start "rule__Port__Group_5_2__1__Impl"
+    // InternalFormalML.g:41300:1: rule__Port__Group_5_2__1__Impl : ( ( rule__Port__ParameterAssignment_5_2_1 ) ) ;
+    public final void rule__Port__Group_5_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41304:1: ( ( ( rule__Port__ParameterAssignment_5_2_1 ) ) )
+            // InternalFormalML.g:41305:1: ( ( rule__Port__ParameterAssignment_5_2_1 ) )
+            {
+            // InternalFormalML.g:41305:1: ( ( rule__Port__ParameterAssignment_5_2_1 ) )
+            // InternalFormalML.g:41306:2: ( rule__Port__ParameterAssignment_5_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getParameterAssignment_5_2_1()); 
+            }
+            // InternalFormalML.g:41307:2: ( rule__Port__ParameterAssignment_5_2_1 )
+            // InternalFormalML.g:41307:3: rule__Port__ParameterAssignment_5_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Port__ParameterAssignment_5_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getParameterAssignment_5_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__Group_5_2__1__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group__0"
+    // InternalFormalML.g:41316:1: rule__PortPublic__Group__0 : rule__PortPublic__Group__0__Impl rule__PortPublic__Group__1 ;
+    public final void rule__PortPublic__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41320:1: ( rule__PortPublic__Group__0__Impl rule__PortPublic__Group__1 )
+            // InternalFormalML.g:41321:2: rule__PortPublic__Group__0__Impl rule__PortPublic__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__PortPublic__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__0"
+
+
+    // $ANTLR start "rule__PortPublic__Group__0__Impl"
+    // InternalFormalML.g:41328:1: rule__PortPublic__Group__0__Impl : ( ( rule__PortPublic__VisibilityAssignment_0 ) ) ;
+    public final void rule__PortPublic__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41332:1: ( ( ( rule__PortPublic__VisibilityAssignment_0 ) ) )
+            // InternalFormalML.g:41333:1: ( ( rule__PortPublic__VisibilityAssignment_0 ) )
+            {
+            // InternalFormalML.g:41333:1: ( ( rule__PortPublic__VisibilityAssignment_0 ) )
+            // InternalFormalML.g:41334:2: ( rule__PortPublic__VisibilityAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:41335:2: ( rule__PortPublic__VisibilityAssignment_0 )
+            // InternalFormalML.g:41335:3: rule__PortPublic__VisibilityAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__VisibilityAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group__1"
+    // InternalFormalML.g:41343:1: rule__PortPublic__Group__1 : rule__PortPublic__Group__1__Impl rule__PortPublic__Group__2 ;
+    public final void rule__PortPublic__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41347:1: ( rule__PortPublic__Group__1__Impl rule__PortPublic__Group__2 )
+            // InternalFormalML.g:41348:2: rule__PortPublic__Group__1__Impl rule__PortPublic__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__PortPublic__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__1"
+
+
+    // $ANTLR start "rule__PortPublic__Group__1__Impl"
+    // InternalFormalML.g:41355:1: rule__PortPublic__Group__1__Impl : ( ( rule__PortPublic__DirectionAssignment_1 )? ) ;
+    public final void rule__PortPublic__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41359:1: ( ( ( rule__PortPublic__DirectionAssignment_1 )? ) )
+            // InternalFormalML.g:41360:1: ( ( rule__PortPublic__DirectionAssignment_1 )? )
+            {
+            // InternalFormalML.g:41360:1: ( ( rule__PortPublic__DirectionAssignment_1 )? )
+            // InternalFormalML.g:41361:2: ( rule__PortPublic__DirectionAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getDirectionAssignment_1()); 
+            }
+            // InternalFormalML.g:41362:2: ( rule__PortPublic__DirectionAssignment_1 )?
+            int alt562=2;
+            int LA562_0 = input.LA(1);
+
+            if ( (LA562_0==173||(LA562_0>=175 && LA562_0<=176)) ) {
+                alt562=1;
+            }
+            switch (alt562) {
+                case 1 :
+                    // InternalFormalML.g:41362:3: rule__PortPublic__DirectionAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PortPublic__DirectionAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getDirectionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group__2"
+    // InternalFormalML.g:41370:1: rule__PortPublic__Group__2 : rule__PortPublic__Group__2__Impl rule__PortPublic__Group__3 ;
+    public final void rule__PortPublic__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41374:1: ( rule__PortPublic__Group__2__Impl rule__PortPublic__Group__3 )
+            // InternalFormalML.g:41375:2: rule__PortPublic__Group__2__Impl rule__PortPublic__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__PortPublic__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__2"
+
+
+    // $ANTLR start "rule__PortPublic__Group__2__Impl"
+    // InternalFormalML.g:41382:1: rule__PortPublic__Group__2__Impl : ( ( rule__PortPublic__NameAssignment_2 ) ) ;
+    public final void rule__PortPublic__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41386:1: ( ( ( rule__PortPublic__NameAssignment_2 ) ) )
+            // InternalFormalML.g:41387:1: ( ( rule__PortPublic__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:41387:1: ( ( rule__PortPublic__NameAssignment_2 ) )
+            // InternalFormalML.g:41388:2: ( rule__PortPublic__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:41389:2: ( rule__PortPublic__NameAssignment_2 )
+            // InternalFormalML.g:41389:3: rule__PortPublic__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group__3"
+    // InternalFormalML.g:41397:1: rule__PortPublic__Group__3 : rule__PortPublic__Group__3__Impl rule__PortPublic__Group__4 ;
+    public final void rule__PortPublic__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41401:1: ( rule__PortPublic__Group__3__Impl rule__PortPublic__Group__4 )
+            // InternalFormalML.g:41402:2: rule__PortPublic__Group__3__Impl rule__PortPublic__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__PortPublic__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__3"
+
+
+    // $ANTLR start "rule__PortPublic__Group__3__Impl"
+    // InternalFormalML.g:41409:1: rule__PortPublic__Group__3__Impl : ( ( rule__PortPublic__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__PortPublic__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41413:1: ( ( ( rule__PortPublic__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:41414:1: ( ( rule__PortPublic__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:41414:1: ( ( rule__PortPublic__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:41415:2: ( rule__PortPublic__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:41416:2: ( rule__PortPublic__UnrestrictedNameAssignment_3 )?
+            int alt563=2;
+            int LA563_0 = input.LA(1);
+
+            if ( (LA563_0==RULE_STRING) ) {
+                alt563=1;
+            }
+            switch (alt563) {
+                case 1 :
+                    // InternalFormalML.g:41416:3: rule__PortPublic__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PortPublic__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group__4"
+    // InternalFormalML.g:41424:1: rule__PortPublic__Group__4 : rule__PortPublic__Group__4__Impl rule__PortPublic__Group__5 ;
+    public final void rule__PortPublic__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41428:1: ( rule__PortPublic__Group__4__Impl rule__PortPublic__Group__5 )
+            // InternalFormalML.g:41429:2: rule__PortPublic__Group__4__Impl rule__PortPublic__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__PortPublic__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__4"
+
+
+    // $ANTLR start "rule__PortPublic__Group__4__Impl"
+    // InternalFormalML.g:41436:1: rule__PortPublic__Group__4__Impl : ( ( rule__PortPublic__Group_4__0 )? ) ;
+    public final void rule__PortPublic__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41440:1: ( ( ( rule__PortPublic__Group_4__0 )? ) )
+            // InternalFormalML.g:41441:1: ( ( rule__PortPublic__Group_4__0 )? )
+            {
+            // InternalFormalML.g:41441:1: ( ( rule__PortPublic__Group_4__0 )? )
+            // InternalFormalML.g:41442:2: ( rule__PortPublic__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:41443:2: ( rule__PortPublic__Group_4__0 )?
+            int alt564=2;
+            int LA564_0 = input.LA(1);
+
+            if ( (LA564_0==23) ) {
+                alt564=1;
+            }
+            switch (alt564) {
+                case 1 :
+                    // InternalFormalML.g:41443:3: rule__PortPublic__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PortPublic__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group__5"
+    // InternalFormalML.g:41451:1: rule__PortPublic__Group__5 : rule__PortPublic__Group__5__Impl ;
+    public final void rule__PortPublic__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41455:1: ( rule__PortPublic__Group__5__Impl )
+            // InternalFormalML.g:41456:2: rule__PortPublic__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__5"
+
+
+    // $ANTLR start "rule__PortPublic__Group__5__Impl"
+    // InternalFormalML.g:41462:1: rule__PortPublic__Group__5__Impl : ( ';' ) ;
+    public final void rule__PortPublic__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41466:1: ( ( ';' ) )
+            // InternalFormalML.g:41467:1: ( ';' )
+            {
+            // InternalFormalML.g:41467:1: ( ';' )
+            // InternalFormalML.g:41468:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4__0"
+    // InternalFormalML.g:41478:1: rule__PortPublic__Group_4__0 : rule__PortPublic__Group_4__0__Impl rule__PortPublic__Group_4__1 ;
+    public final void rule__PortPublic__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41482:1: ( rule__PortPublic__Group_4__0__Impl rule__PortPublic__Group_4__1 )
+            // InternalFormalML.g:41483:2: rule__PortPublic__Group_4__0__Impl rule__PortPublic__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__PortPublic__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4__0"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4__0__Impl"
+    // InternalFormalML.g:41490:1: rule__PortPublic__Group_4__0__Impl : ( '(' ) ;
+    public final void rule__PortPublic__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41494:1: ( ( '(' ) )
+            // InternalFormalML.g:41495:1: ( '(' )
+            {
+            // InternalFormalML.g:41495:1: ( '(' )
+            // InternalFormalML.g:41496:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4__1"
+    // InternalFormalML.g:41505:1: rule__PortPublic__Group_4__1 : rule__PortPublic__Group_4__1__Impl rule__PortPublic__Group_4__2 ;
+    public final void rule__PortPublic__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41509:1: ( rule__PortPublic__Group_4__1__Impl rule__PortPublic__Group_4__2 )
+            // InternalFormalML.g:41510:2: rule__PortPublic__Group_4__1__Impl rule__PortPublic__Group_4__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__PortPublic__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4__1"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4__1__Impl"
+    // InternalFormalML.g:41517:1: rule__PortPublic__Group_4__1__Impl : ( ( rule__PortPublic__ParameterAssignment_4_1 ) ) ;
+    public final void rule__PortPublic__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41521:1: ( ( ( rule__PortPublic__ParameterAssignment_4_1 ) ) )
+            // InternalFormalML.g:41522:1: ( ( rule__PortPublic__ParameterAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:41522:1: ( ( rule__PortPublic__ParameterAssignment_4_1 ) )
+            // InternalFormalML.g:41523:2: ( rule__PortPublic__ParameterAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getParameterAssignment_4_1()); 
+            }
+            // InternalFormalML.g:41524:2: ( rule__PortPublic__ParameterAssignment_4_1 )
+            // InternalFormalML.g:41524:3: rule__PortPublic__ParameterAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__ParameterAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getParameterAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4__2"
+    // InternalFormalML.g:41532:1: rule__PortPublic__Group_4__2 : rule__PortPublic__Group_4__2__Impl rule__PortPublic__Group_4__3 ;
+    public final void rule__PortPublic__Group_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41536:1: ( rule__PortPublic__Group_4__2__Impl rule__PortPublic__Group_4__3 )
+            // InternalFormalML.g:41537:2: rule__PortPublic__Group_4__2__Impl rule__PortPublic__Group_4__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__PortPublic__Group_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group_4__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4__2"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4__2__Impl"
+    // InternalFormalML.g:41544:1: rule__PortPublic__Group_4__2__Impl : ( ( rule__PortPublic__Group_4_2__0 )* ) ;
+    public final void rule__PortPublic__Group_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41548:1: ( ( ( rule__PortPublic__Group_4_2__0 )* ) )
+            // InternalFormalML.g:41549:1: ( ( rule__PortPublic__Group_4_2__0 )* )
+            {
+            // InternalFormalML.g:41549:1: ( ( rule__PortPublic__Group_4_2__0 )* )
+            // InternalFormalML.g:41550:2: ( rule__PortPublic__Group_4_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getGroup_4_2()); 
+            }
+            // InternalFormalML.g:41551:2: ( rule__PortPublic__Group_4_2__0 )*
+            loop565:
+            do {
+                int alt565=2;
+                int LA565_0 = input.LA(1);
+
+                if ( (LA565_0==198) ) {
+                    alt565=1;
+                }
+
+
+                switch (alt565) {
+            	case 1 :
+            	    // InternalFormalML.g:41551:3: rule__PortPublic__Group_4_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__PortPublic__Group_4_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop565;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getGroup_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4__2__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4__3"
+    // InternalFormalML.g:41559:1: rule__PortPublic__Group_4__3 : rule__PortPublic__Group_4__3__Impl ;
+    public final void rule__PortPublic__Group_4__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41563:1: ( rule__PortPublic__Group_4__3__Impl )
+            // InternalFormalML.g:41564:2: rule__PortPublic__Group_4__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group_4__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4__3"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4__3__Impl"
+    // InternalFormalML.g:41570:1: rule__PortPublic__Group_4__3__Impl : ( ')' ) ;
+    public final void rule__PortPublic__Group_4__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41574:1: ( ( ')' ) )
+            // InternalFormalML.g:41575:1: ( ')' )
+            {
+            // InternalFormalML.g:41575:1: ( ')' )
+            // InternalFormalML.g:41576:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getRightParenthesisKeyword_4_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getRightParenthesisKeyword_4_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4__3__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4_2__0"
+    // InternalFormalML.g:41586:1: rule__PortPublic__Group_4_2__0 : rule__PortPublic__Group_4_2__0__Impl rule__PortPublic__Group_4_2__1 ;
+    public final void rule__PortPublic__Group_4_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41590:1: ( rule__PortPublic__Group_4_2__0__Impl rule__PortPublic__Group_4_2__1 )
+            // InternalFormalML.g:41591:2: rule__PortPublic__Group_4_2__0__Impl rule__PortPublic__Group_4_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__PortPublic__Group_4_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group_4_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4_2__0"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4_2__0__Impl"
+    // InternalFormalML.g:41598:1: rule__PortPublic__Group_4_2__0__Impl : ( ',' ) ;
+    public final void rule__PortPublic__Group_4_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41602:1: ( ( ',' ) )
+            // InternalFormalML.g:41603:1: ( ',' )
+            {
+            // InternalFormalML.g:41603:1: ( ',' )
+            // InternalFormalML.g:41604:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getCommaKeyword_4_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getCommaKeyword_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4_2__0__Impl"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4_2__1"
+    // InternalFormalML.g:41613:1: rule__PortPublic__Group_4_2__1 : rule__PortPublic__Group_4_2__1__Impl ;
+    public final void rule__PortPublic__Group_4_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41617:1: ( rule__PortPublic__Group_4_2__1__Impl )
+            // InternalFormalML.g:41618:2: rule__PortPublic__Group_4_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__Group_4_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4_2__1"
+
+
+    // $ANTLR start "rule__PortPublic__Group_4_2__1__Impl"
+    // InternalFormalML.g:41624:1: rule__PortPublic__Group_4_2__1__Impl : ( ( rule__PortPublic__ParameterAssignment_4_2_1 ) ) ;
+    public final void rule__PortPublic__Group_4_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41628:1: ( ( ( rule__PortPublic__ParameterAssignment_4_2_1 ) ) )
+            // InternalFormalML.g:41629:1: ( ( rule__PortPublic__ParameterAssignment_4_2_1 ) )
+            {
+            // InternalFormalML.g:41629:1: ( ( rule__PortPublic__ParameterAssignment_4_2_1 ) )
+            // InternalFormalML.g:41630:2: ( rule__PortPublic__ParameterAssignment_4_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getParameterAssignment_4_2_1()); 
+            }
+            // InternalFormalML.g:41631:2: ( rule__PortPublic__ParameterAssignment_4_2_1 )
+            // InternalFormalML.g:41631:3: rule__PortPublic__ParameterAssignment_4_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPublic__ParameterAssignment_4_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getParameterAssignment_4_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__Group_4_2__1__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group__0"
+    // InternalFormalML.g:41640:1: rule__PortProtected__Group__0 : rule__PortProtected__Group__0__Impl rule__PortProtected__Group__1 ;
+    public final void rule__PortProtected__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41644:1: ( rule__PortProtected__Group__0__Impl rule__PortProtected__Group__1 )
+            // InternalFormalML.g:41645:2: rule__PortProtected__Group__0__Impl rule__PortProtected__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__PortProtected__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__0"
+
+
+    // $ANTLR start "rule__PortProtected__Group__0__Impl"
+    // InternalFormalML.g:41652:1: rule__PortProtected__Group__0__Impl : ( ( rule__PortProtected__VisibilityAssignment_0 ) ) ;
+    public final void rule__PortProtected__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41656:1: ( ( ( rule__PortProtected__VisibilityAssignment_0 ) ) )
+            // InternalFormalML.g:41657:1: ( ( rule__PortProtected__VisibilityAssignment_0 ) )
+            {
+            // InternalFormalML.g:41657:1: ( ( rule__PortProtected__VisibilityAssignment_0 ) )
+            // InternalFormalML.g:41658:2: ( rule__PortProtected__VisibilityAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:41659:2: ( rule__PortProtected__VisibilityAssignment_0 )
+            // InternalFormalML.g:41659:3: rule__PortProtected__VisibilityAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__VisibilityAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group__1"
+    // InternalFormalML.g:41667:1: rule__PortProtected__Group__1 : rule__PortProtected__Group__1__Impl rule__PortProtected__Group__2 ;
+    public final void rule__PortProtected__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41671:1: ( rule__PortProtected__Group__1__Impl rule__PortProtected__Group__2 )
+            // InternalFormalML.g:41672:2: rule__PortProtected__Group__1__Impl rule__PortProtected__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__PortProtected__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__1"
+
+
+    // $ANTLR start "rule__PortProtected__Group__1__Impl"
+    // InternalFormalML.g:41679:1: rule__PortProtected__Group__1__Impl : ( ( rule__PortProtected__DirectionAssignment_1 )? ) ;
+    public final void rule__PortProtected__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41683:1: ( ( ( rule__PortProtected__DirectionAssignment_1 )? ) )
+            // InternalFormalML.g:41684:1: ( ( rule__PortProtected__DirectionAssignment_1 )? )
+            {
+            // InternalFormalML.g:41684:1: ( ( rule__PortProtected__DirectionAssignment_1 )? )
+            // InternalFormalML.g:41685:2: ( rule__PortProtected__DirectionAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getDirectionAssignment_1()); 
+            }
+            // InternalFormalML.g:41686:2: ( rule__PortProtected__DirectionAssignment_1 )?
+            int alt566=2;
+            int LA566_0 = input.LA(1);
+
+            if ( (LA566_0==173||(LA566_0>=175 && LA566_0<=176)) ) {
+                alt566=1;
+            }
+            switch (alt566) {
+                case 1 :
+                    // InternalFormalML.g:41686:3: rule__PortProtected__DirectionAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PortProtected__DirectionAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getDirectionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group__2"
+    // InternalFormalML.g:41694:1: rule__PortProtected__Group__2 : rule__PortProtected__Group__2__Impl rule__PortProtected__Group__3 ;
+    public final void rule__PortProtected__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41698:1: ( rule__PortProtected__Group__2__Impl rule__PortProtected__Group__3 )
+            // InternalFormalML.g:41699:2: rule__PortProtected__Group__2__Impl rule__PortProtected__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__PortProtected__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__2"
+
+
+    // $ANTLR start "rule__PortProtected__Group__2__Impl"
+    // InternalFormalML.g:41706:1: rule__PortProtected__Group__2__Impl : ( ( rule__PortProtected__NameAssignment_2 ) ) ;
+    public final void rule__PortProtected__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41710:1: ( ( ( rule__PortProtected__NameAssignment_2 ) ) )
+            // InternalFormalML.g:41711:1: ( ( rule__PortProtected__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:41711:1: ( ( rule__PortProtected__NameAssignment_2 ) )
+            // InternalFormalML.g:41712:2: ( rule__PortProtected__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:41713:2: ( rule__PortProtected__NameAssignment_2 )
+            // InternalFormalML.g:41713:3: rule__PortProtected__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group__3"
+    // InternalFormalML.g:41721:1: rule__PortProtected__Group__3 : rule__PortProtected__Group__3__Impl rule__PortProtected__Group__4 ;
+    public final void rule__PortProtected__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41725:1: ( rule__PortProtected__Group__3__Impl rule__PortProtected__Group__4 )
+            // InternalFormalML.g:41726:2: rule__PortProtected__Group__3__Impl rule__PortProtected__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__PortProtected__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__3"
+
+
+    // $ANTLR start "rule__PortProtected__Group__3__Impl"
+    // InternalFormalML.g:41733:1: rule__PortProtected__Group__3__Impl : ( ( rule__PortProtected__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__PortProtected__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41737:1: ( ( ( rule__PortProtected__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:41738:1: ( ( rule__PortProtected__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:41738:1: ( ( rule__PortProtected__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:41739:2: ( rule__PortProtected__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:41740:2: ( rule__PortProtected__UnrestrictedNameAssignment_3 )?
+            int alt567=2;
+            int LA567_0 = input.LA(1);
+
+            if ( (LA567_0==RULE_STRING) ) {
+                alt567=1;
+            }
+            switch (alt567) {
+                case 1 :
+                    // InternalFormalML.g:41740:3: rule__PortProtected__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PortProtected__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group__4"
+    // InternalFormalML.g:41748:1: rule__PortProtected__Group__4 : rule__PortProtected__Group__4__Impl rule__PortProtected__Group__5 ;
+    public final void rule__PortProtected__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41752:1: ( rule__PortProtected__Group__4__Impl rule__PortProtected__Group__5 )
+            // InternalFormalML.g:41753:2: rule__PortProtected__Group__4__Impl rule__PortProtected__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__PortProtected__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__4"
+
+
+    // $ANTLR start "rule__PortProtected__Group__4__Impl"
+    // InternalFormalML.g:41760:1: rule__PortProtected__Group__4__Impl : ( ( rule__PortProtected__Group_4__0 )? ) ;
+    public final void rule__PortProtected__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41764:1: ( ( ( rule__PortProtected__Group_4__0 )? ) )
+            // InternalFormalML.g:41765:1: ( ( rule__PortProtected__Group_4__0 )? )
+            {
+            // InternalFormalML.g:41765:1: ( ( rule__PortProtected__Group_4__0 )? )
+            // InternalFormalML.g:41766:2: ( rule__PortProtected__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:41767:2: ( rule__PortProtected__Group_4__0 )?
+            int alt568=2;
+            int LA568_0 = input.LA(1);
+
+            if ( (LA568_0==23) ) {
+                alt568=1;
+            }
+            switch (alt568) {
+                case 1 :
+                    // InternalFormalML.g:41767:3: rule__PortProtected__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PortProtected__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group__5"
+    // InternalFormalML.g:41775:1: rule__PortProtected__Group__5 : rule__PortProtected__Group__5__Impl ;
+    public final void rule__PortProtected__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41779:1: ( rule__PortProtected__Group__5__Impl )
+            // InternalFormalML.g:41780:2: rule__PortProtected__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__5"
+
+
+    // $ANTLR start "rule__PortProtected__Group__5__Impl"
+    // InternalFormalML.g:41786:1: rule__PortProtected__Group__5__Impl : ( ';' ) ;
+    public final void rule__PortProtected__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41790:1: ( ( ';' ) )
+            // InternalFormalML.g:41791:1: ( ';' )
+            {
+            // InternalFormalML.g:41791:1: ( ';' )
+            // InternalFormalML.g:41792:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4__0"
+    // InternalFormalML.g:41802:1: rule__PortProtected__Group_4__0 : rule__PortProtected__Group_4__0__Impl rule__PortProtected__Group_4__1 ;
+    public final void rule__PortProtected__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41806:1: ( rule__PortProtected__Group_4__0__Impl rule__PortProtected__Group_4__1 )
+            // InternalFormalML.g:41807:2: rule__PortProtected__Group_4__0__Impl rule__PortProtected__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__PortProtected__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4__0"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4__0__Impl"
+    // InternalFormalML.g:41814:1: rule__PortProtected__Group_4__0__Impl : ( '(' ) ;
+    public final void rule__PortProtected__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41818:1: ( ( '(' ) )
+            // InternalFormalML.g:41819:1: ( '(' )
+            {
+            // InternalFormalML.g:41819:1: ( '(' )
+            // InternalFormalML.g:41820:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4__1"
+    // InternalFormalML.g:41829:1: rule__PortProtected__Group_4__1 : rule__PortProtected__Group_4__1__Impl rule__PortProtected__Group_4__2 ;
+    public final void rule__PortProtected__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41833:1: ( rule__PortProtected__Group_4__1__Impl rule__PortProtected__Group_4__2 )
+            // InternalFormalML.g:41834:2: rule__PortProtected__Group_4__1__Impl rule__PortProtected__Group_4__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__PortProtected__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4__1"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4__1__Impl"
+    // InternalFormalML.g:41841:1: rule__PortProtected__Group_4__1__Impl : ( ( rule__PortProtected__ParameterAssignment_4_1 ) ) ;
+    public final void rule__PortProtected__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41845:1: ( ( ( rule__PortProtected__ParameterAssignment_4_1 ) ) )
+            // InternalFormalML.g:41846:1: ( ( rule__PortProtected__ParameterAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:41846:1: ( ( rule__PortProtected__ParameterAssignment_4_1 ) )
+            // InternalFormalML.g:41847:2: ( rule__PortProtected__ParameterAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_1()); 
+            }
+            // InternalFormalML.g:41848:2: ( rule__PortProtected__ParameterAssignment_4_1 )
+            // InternalFormalML.g:41848:3: rule__PortProtected__ParameterAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__ParameterAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4__2"
+    // InternalFormalML.g:41856:1: rule__PortProtected__Group_4__2 : rule__PortProtected__Group_4__2__Impl rule__PortProtected__Group_4__3 ;
+    public final void rule__PortProtected__Group_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41860:1: ( rule__PortProtected__Group_4__2__Impl rule__PortProtected__Group_4__3 )
+            // InternalFormalML.g:41861:2: rule__PortProtected__Group_4__2__Impl rule__PortProtected__Group_4__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__PortProtected__Group_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group_4__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4__2"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4__2__Impl"
+    // InternalFormalML.g:41868:1: rule__PortProtected__Group_4__2__Impl : ( ( rule__PortProtected__Group_4_2__0 )* ) ;
+    public final void rule__PortProtected__Group_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41872:1: ( ( ( rule__PortProtected__Group_4_2__0 )* ) )
+            // InternalFormalML.g:41873:1: ( ( rule__PortProtected__Group_4_2__0 )* )
+            {
+            // InternalFormalML.g:41873:1: ( ( rule__PortProtected__Group_4_2__0 )* )
+            // InternalFormalML.g:41874:2: ( rule__PortProtected__Group_4_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getGroup_4_2()); 
+            }
+            // InternalFormalML.g:41875:2: ( rule__PortProtected__Group_4_2__0 )*
+            loop569:
+            do {
+                int alt569=2;
+                int LA569_0 = input.LA(1);
+
+                if ( (LA569_0==198) ) {
+                    alt569=1;
+                }
+
+
+                switch (alt569) {
+            	case 1 :
+            	    // InternalFormalML.g:41875:3: rule__PortProtected__Group_4_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__PortProtected__Group_4_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop569;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getGroup_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4__2__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4__3"
+    // InternalFormalML.g:41883:1: rule__PortProtected__Group_4__3 : rule__PortProtected__Group_4__3__Impl ;
+    public final void rule__PortProtected__Group_4__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41887:1: ( rule__PortProtected__Group_4__3__Impl )
+            // InternalFormalML.g:41888:2: rule__PortProtected__Group_4__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group_4__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4__3"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4__3__Impl"
+    // InternalFormalML.g:41894:1: rule__PortProtected__Group_4__3__Impl : ( ')' ) ;
+    public final void rule__PortProtected__Group_4__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41898:1: ( ( ')' ) )
+            // InternalFormalML.g:41899:1: ( ')' )
+            {
+            // InternalFormalML.g:41899:1: ( ')' )
+            // InternalFormalML.g:41900:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getRightParenthesisKeyword_4_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getRightParenthesisKeyword_4_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4__3__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4_2__0"
+    // InternalFormalML.g:41910:1: rule__PortProtected__Group_4_2__0 : rule__PortProtected__Group_4_2__0__Impl rule__PortProtected__Group_4_2__1 ;
+    public final void rule__PortProtected__Group_4_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41914:1: ( rule__PortProtected__Group_4_2__0__Impl rule__PortProtected__Group_4_2__1 )
+            // InternalFormalML.g:41915:2: rule__PortProtected__Group_4_2__0__Impl rule__PortProtected__Group_4_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__PortProtected__Group_4_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group_4_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4_2__0"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4_2__0__Impl"
+    // InternalFormalML.g:41922:1: rule__PortProtected__Group_4_2__0__Impl : ( ',' ) ;
+    public final void rule__PortProtected__Group_4_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41926:1: ( ( ',' ) )
+            // InternalFormalML.g:41927:1: ( ',' )
+            {
+            // InternalFormalML.g:41927:1: ( ',' )
+            // InternalFormalML.g:41928:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getCommaKeyword_4_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getCommaKeyword_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4_2__0__Impl"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4_2__1"
+    // InternalFormalML.g:41937:1: rule__PortProtected__Group_4_2__1 : rule__PortProtected__Group_4_2__1__Impl ;
+    public final void rule__PortProtected__Group_4_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41941:1: ( rule__PortProtected__Group_4_2__1__Impl )
+            // InternalFormalML.g:41942:2: rule__PortProtected__Group_4_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__Group_4_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4_2__1"
+
+
+    // $ANTLR start "rule__PortProtected__Group_4_2__1__Impl"
+    // InternalFormalML.g:41948:1: rule__PortProtected__Group_4_2__1__Impl : ( ( rule__PortProtected__ParameterAssignment_4_2_1 ) ) ;
+    public final void rule__PortProtected__Group_4_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41952:1: ( ( ( rule__PortProtected__ParameterAssignment_4_2_1 ) ) )
+            // InternalFormalML.g:41953:1: ( ( rule__PortProtected__ParameterAssignment_4_2_1 ) )
+            {
+            // InternalFormalML.g:41953:1: ( ( rule__PortProtected__ParameterAssignment_4_2_1 ) )
+            // InternalFormalML.g:41954:2: ( rule__PortProtected__ParameterAssignment_4_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_2_1()); 
+            }
+            // InternalFormalML.g:41955:2: ( rule__PortProtected__ParameterAssignment_4_2_1 )
+            // InternalFormalML.g:41955:3: rule__PortProtected__ParameterAssignment_4_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortProtected__ParameterAssignment_4_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getParameterAssignment_4_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__Group_4_2__1__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__0"
+    // InternalFormalML.g:41964:1: rule__PortPrivate__Group__0 : rule__PortPrivate__Group__0__Impl rule__PortPrivate__Group__1 ;
+    public final void rule__PortPrivate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41968:1: ( rule__PortPrivate__Group__0__Impl rule__PortPrivate__Group__1 )
+            // InternalFormalML.g:41969:2: rule__PortPrivate__Group__0__Impl rule__PortPrivate__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__PortPrivate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__0"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__0__Impl"
+    // InternalFormalML.g:41976:1: rule__PortPrivate__Group__0__Impl : ( ( rule__PortPrivate__VisibilityAssignment_0 ) ) ;
+    public final void rule__PortPrivate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41980:1: ( ( ( rule__PortPrivate__VisibilityAssignment_0 ) ) )
+            // InternalFormalML.g:41981:1: ( ( rule__PortPrivate__VisibilityAssignment_0 ) )
+            {
+            // InternalFormalML.g:41981:1: ( ( rule__PortPrivate__VisibilityAssignment_0 ) )
+            // InternalFormalML.g:41982:2: ( rule__PortPrivate__VisibilityAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:41983:2: ( rule__PortPrivate__VisibilityAssignment_0 )
+            // InternalFormalML.g:41983:3: rule__PortPrivate__VisibilityAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__VisibilityAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__1"
+    // InternalFormalML.g:41991:1: rule__PortPrivate__Group__1 : rule__PortPrivate__Group__1__Impl rule__PortPrivate__Group__2 ;
+    public final void rule__PortPrivate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:41995:1: ( rule__PortPrivate__Group__1__Impl rule__PortPrivate__Group__2 )
+            // InternalFormalML.g:41996:2: rule__PortPrivate__Group__1__Impl rule__PortPrivate__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__PortPrivate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__1"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__1__Impl"
+    // InternalFormalML.g:42003:1: rule__PortPrivate__Group__1__Impl : ( ( rule__PortPrivate__DirectionAssignment_1 )? ) ;
+    public final void rule__PortPrivate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42007:1: ( ( ( rule__PortPrivate__DirectionAssignment_1 )? ) )
+            // InternalFormalML.g:42008:1: ( ( rule__PortPrivate__DirectionAssignment_1 )? )
+            {
+            // InternalFormalML.g:42008:1: ( ( rule__PortPrivate__DirectionAssignment_1 )? )
+            // InternalFormalML.g:42009:2: ( rule__PortPrivate__DirectionAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getDirectionAssignment_1()); 
+            }
+            // InternalFormalML.g:42010:2: ( rule__PortPrivate__DirectionAssignment_1 )?
+            int alt570=2;
+            int LA570_0 = input.LA(1);
+
+            if ( (LA570_0==173||(LA570_0>=175 && LA570_0<=176)) ) {
+                alt570=1;
+            }
+            switch (alt570) {
+                case 1 :
+                    // InternalFormalML.g:42010:3: rule__PortPrivate__DirectionAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PortPrivate__DirectionAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getDirectionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__2"
+    // InternalFormalML.g:42018:1: rule__PortPrivate__Group__2 : rule__PortPrivate__Group__2__Impl rule__PortPrivate__Group__3 ;
+    public final void rule__PortPrivate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42022:1: ( rule__PortPrivate__Group__2__Impl rule__PortPrivate__Group__3 )
+            // InternalFormalML.g:42023:2: rule__PortPrivate__Group__2__Impl rule__PortPrivate__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__PortPrivate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__2"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__2__Impl"
+    // InternalFormalML.g:42030:1: rule__PortPrivate__Group__2__Impl : ( ( rule__PortPrivate__NameAssignment_2 ) ) ;
+    public final void rule__PortPrivate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42034:1: ( ( ( rule__PortPrivate__NameAssignment_2 ) ) )
+            // InternalFormalML.g:42035:1: ( ( rule__PortPrivate__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:42035:1: ( ( rule__PortPrivate__NameAssignment_2 ) )
+            // InternalFormalML.g:42036:2: ( rule__PortPrivate__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:42037:2: ( rule__PortPrivate__NameAssignment_2 )
+            // InternalFormalML.g:42037:3: rule__PortPrivate__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__3"
+    // InternalFormalML.g:42045:1: rule__PortPrivate__Group__3 : rule__PortPrivate__Group__3__Impl rule__PortPrivate__Group__4 ;
+    public final void rule__PortPrivate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42049:1: ( rule__PortPrivate__Group__3__Impl rule__PortPrivate__Group__4 )
+            // InternalFormalML.g:42050:2: rule__PortPrivate__Group__3__Impl rule__PortPrivate__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__PortPrivate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__3"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__3__Impl"
+    // InternalFormalML.g:42057:1: rule__PortPrivate__Group__3__Impl : ( ( rule__PortPrivate__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__PortPrivate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42061:1: ( ( ( rule__PortPrivate__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:42062:1: ( ( rule__PortPrivate__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:42062:1: ( ( rule__PortPrivate__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:42063:2: ( rule__PortPrivate__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:42064:2: ( rule__PortPrivate__UnrestrictedNameAssignment_3 )?
+            int alt571=2;
+            int LA571_0 = input.LA(1);
+
+            if ( (LA571_0==RULE_STRING) ) {
+                alt571=1;
+            }
+            switch (alt571) {
+                case 1 :
+                    // InternalFormalML.g:42064:3: rule__PortPrivate__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PortPrivate__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__4"
+    // InternalFormalML.g:42072:1: rule__PortPrivate__Group__4 : rule__PortPrivate__Group__4__Impl rule__PortPrivate__Group__5 ;
+    public final void rule__PortPrivate__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42076:1: ( rule__PortPrivate__Group__4__Impl rule__PortPrivate__Group__5 )
+            // InternalFormalML.g:42077:2: rule__PortPrivate__Group__4__Impl rule__PortPrivate__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__PortPrivate__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__4"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__4__Impl"
+    // InternalFormalML.g:42084:1: rule__PortPrivate__Group__4__Impl : ( ( rule__PortPrivate__Group_4__0 )? ) ;
+    public final void rule__PortPrivate__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42088:1: ( ( ( rule__PortPrivate__Group_4__0 )? ) )
+            // InternalFormalML.g:42089:1: ( ( rule__PortPrivate__Group_4__0 )? )
+            {
+            // InternalFormalML.g:42089:1: ( ( rule__PortPrivate__Group_4__0 )? )
+            // InternalFormalML.g:42090:2: ( rule__PortPrivate__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:42091:2: ( rule__PortPrivate__Group_4__0 )?
+            int alt572=2;
+            int LA572_0 = input.LA(1);
+
+            if ( (LA572_0==23) ) {
+                alt572=1;
+            }
+            switch (alt572) {
+                case 1 :
+                    // InternalFormalML.g:42091:3: rule__PortPrivate__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PortPrivate__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__5"
+    // InternalFormalML.g:42099:1: rule__PortPrivate__Group__5 : rule__PortPrivate__Group__5__Impl ;
+    public final void rule__PortPrivate__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42103:1: ( rule__PortPrivate__Group__5__Impl )
+            // InternalFormalML.g:42104:2: rule__PortPrivate__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__5"
+
+
+    // $ANTLR start "rule__PortPrivate__Group__5__Impl"
+    // InternalFormalML.g:42110:1: rule__PortPrivate__Group__5__Impl : ( ';' ) ;
+    public final void rule__PortPrivate__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42114:1: ( ( ';' ) )
+            // InternalFormalML.g:42115:1: ( ';' )
+            {
+            // InternalFormalML.g:42115:1: ( ';' )
+            // InternalFormalML.g:42116:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4__0"
+    // InternalFormalML.g:42126:1: rule__PortPrivate__Group_4__0 : rule__PortPrivate__Group_4__0__Impl rule__PortPrivate__Group_4__1 ;
+    public final void rule__PortPrivate__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42130:1: ( rule__PortPrivate__Group_4__0__Impl rule__PortPrivate__Group_4__1 )
+            // InternalFormalML.g:42131:2: rule__PortPrivate__Group_4__0__Impl rule__PortPrivate__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__PortPrivate__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4__0"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4__0__Impl"
+    // InternalFormalML.g:42138:1: rule__PortPrivate__Group_4__0__Impl : ( '(' ) ;
+    public final void rule__PortPrivate__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42142:1: ( ( '(' ) )
+            // InternalFormalML.g:42143:1: ( '(' )
+            {
+            // InternalFormalML.g:42143:1: ( '(' )
+            // InternalFormalML.g:42144:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4__1"
+    // InternalFormalML.g:42153:1: rule__PortPrivate__Group_4__1 : rule__PortPrivate__Group_4__1__Impl rule__PortPrivate__Group_4__2 ;
+    public final void rule__PortPrivate__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42157:1: ( rule__PortPrivate__Group_4__1__Impl rule__PortPrivate__Group_4__2 )
+            // InternalFormalML.g:42158:2: rule__PortPrivate__Group_4__1__Impl rule__PortPrivate__Group_4__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__PortPrivate__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4__1"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4__1__Impl"
+    // InternalFormalML.g:42165:1: rule__PortPrivate__Group_4__1__Impl : ( ( rule__PortPrivate__ParameterAssignment_4_1 ) ) ;
+    public final void rule__PortPrivate__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42169:1: ( ( ( rule__PortPrivate__ParameterAssignment_4_1 ) ) )
+            // InternalFormalML.g:42170:1: ( ( rule__PortPrivate__ParameterAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:42170:1: ( ( rule__PortPrivate__ParameterAssignment_4_1 ) )
+            // InternalFormalML.g:42171:2: ( rule__PortPrivate__ParameterAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_1()); 
+            }
+            // InternalFormalML.g:42172:2: ( rule__PortPrivate__ParameterAssignment_4_1 )
+            // InternalFormalML.g:42172:3: rule__PortPrivate__ParameterAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__ParameterAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4__2"
+    // InternalFormalML.g:42180:1: rule__PortPrivate__Group_4__2 : rule__PortPrivate__Group_4__2__Impl rule__PortPrivate__Group_4__3 ;
+    public final void rule__PortPrivate__Group_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42184:1: ( rule__PortPrivate__Group_4__2__Impl rule__PortPrivate__Group_4__3 )
+            // InternalFormalML.g:42185:2: rule__PortPrivate__Group_4__2__Impl rule__PortPrivate__Group_4__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__PortPrivate__Group_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group_4__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4__2"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4__2__Impl"
+    // InternalFormalML.g:42192:1: rule__PortPrivate__Group_4__2__Impl : ( ( rule__PortPrivate__Group_4_2__0 )* ) ;
+    public final void rule__PortPrivate__Group_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42196:1: ( ( ( rule__PortPrivate__Group_4_2__0 )* ) )
+            // InternalFormalML.g:42197:1: ( ( rule__PortPrivate__Group_4_2__0 )* )
+            {
+            // InternalFormalML.g:42197:1: ( ( rule__PortPrivate__Group_4_2__0 )* )
+            // InternalFormalML.g:42198:2: ( rule__PortPrivate__Group_4_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getGroup_4_2()); 
+            }
+            // InternalFormalML.g:42199:2: ( rule__PortPrivate__Group_4_2__0 )*
+            loop573:
+            do {
+                int alt573=2;
+                int LA573_0 = input.LA(1);
+
+                if ( (LA573_0==198) ) {
+                    alt573=1;
+                }
+
+
+                switch (alt573) {
+            	case 1 :
+            	    // InternalFormalML.g:42199:3: rule__PortPrivate__Group_4_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__PortPrivate__Group_4_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop573;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getGroup_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4__2__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4__3"
+    // InternalFormalML.g:42207:1: rule__PortPrivate__Group_4__3 : rule__PortPrivate__Group_4__3__Impl ;
+    public final void rule__PortPrivate__Group_4__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42211:1: ( rule__PortPrivate__Group_4__3__Impl )
+            // InternalFormalML.g:42212:2: rule__PortPrivate__Group_4__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group_4__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4__3"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4__3__Impl"
+    // InternalFormalML.g:42218:1: rule__PortPrivate__Group_4__3__Impl : ( ')' ) ;
+    public final void rule__PortPrivate__Group_4__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42222:1: ( ( ')' ) )
+            // InternalFormalML.g:42223:1: ( ')' )
+            {
+            // InternalFormalML.g:42223:1: ( ')' )
+            // InternalFormalML.g:42224:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getRightParenthesisKeyword_4_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getRightParenthesisKeyword_4_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4__3__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4_2__0"
+    // InternalFormalML.g:42234:1: rule__PortPrivate__Group_4_2__0 : rule__PortPrivate__Group_4_2__0__Impl rule__PortPrivate__Group_4_2__1 ;
+    public final void rule__PortPrivate__Group_4_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42238:1: ( rule__PortPrivate__Group_4_2__0__Impl rule__PortPrivate__Group_4_2__1 )
+            // InternalFormalML.g:42239:2: rule__PortPrivate__Group_4_2__0__Impl rule__PortPrivate__Group_4_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__PortPrivate__Group_4_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group_4_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4_2__0"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4_2__0__Impl"
+    // InternalFormalML.g:42246:1: rule__PortPrivate__Group_4_2__0__Impl : ( ',' ) ;
+    public final void rule__PortPrivate__Group_4_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42250:1: ( ( ',' ) )
+            // InternalFormalML.g:42251:1: ( ',' )
+            {
+            // InternalFormalML.g:42251:1: ( ',' )
+            // InternalFormalML.g:42252:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getCommaKeyword_4_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getCommaKeyword_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4_2__0__Impl"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4_2__1"
+    // InternalFormalML.g:42261:1: rule__PortPrivate__Group_4_2__1 : rule__PortPrivate__Group_4_2__1__Impl ;
+    public final void rule__PortPrivate__Group_4_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42265:1: ( rule__PortPrivate__Group_4_2__1__Impl )
+            // InternalFormalML.g:42266:2: rule__PortPrivate__Group_4_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__Group_4_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4_2__1"
+
+
+    // $ANTLR start "rule__PortPrivate__Group_4_2__1__Impl"
+    // InternalFormalML.g:42272:1: rule__PortPrivate__Group_4_2__1__Impl : ( ( rule__PortPrivate__ParameterAssignment_4_2_1 ) ) ;
+    public final void rule__PortPrivate__Group_4_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42276:1: ( ( ( rule__PortPrivate__ParameterAssignment_4_2_1 ) ) )
+            // InternalFormalML.g:42277:1: ( ( rule__PortPrivate__ParameterAssignment_4_2_1 ) )
+            {
+            // InternalFormalML.g:42277:1: ( ( rule__PortPrivate__ParameterAssignment_4_2_1 ) )
+            // InternalFormalML.g:42278:2: ( rule__PortPrivate__ParameterAssignment_4_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_2_1()); 
+            }
+            // InternalFormalML.g:42279:2: ( rule__PortPrivate__ParameterAssignment_4_2_1 )
+            // InternalFormalML.g:42279:3: rule__PortPrivate__ParameterAssignment_4_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PortPrivate__ParameterAssignment_4_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getParameterAssignment_4_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__Group_4_2__1__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group__0"
+    // InternalFormalML.g:42288:1: rule__Signal__Group__0 : rule__Signal__Group__0__Impl rule__Signal__Group__1 ;
+    public final void rule__Signal__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42292:1: ( rule__Signal__Group__0__Impl rule__Signal__Group__1 )
+            // InternalFormalML.g:42293:2: rule__Signal__Group__0__Impl rule__Signal__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_183);
+            rule__Signal__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__0"
+
+
+    // $ANTLR start "rule__Signal__Group__0__Impl"
+    // InternalFormalML.g:42300:1: rule__Signal__Group__0__Impl : ( ( rule__Signal__VisibilityAssignment_0 )? ) ;
+    public final void rule__Signal__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42304:1: ( ( ( rule__Signal__VisibilityAssignment_0 )? ) )
+            // InternalFormalML.g:42305:1: ( ( rule__Signal__VisibilityAssignment_0 )? )
+            {
+            // InternalFormalML.g:42305:1: ( ( rule__Signal__VisibilityAssignment_0 )? )
+            // InternalFormalML.g:42306:2: ( rule__Signal__VisibilityAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:42307:2: ( rule__Signal__VisibilityAssignment_0 )?
+            int alt574=2;
+            int LA574_0 = input.LA(1);
+
+            if ( (LA574_0==28||(LA574_0>=143 && LA574_0<=145)) ) {
+                alt574=1;
+            }
+            switch (alt574) {
+                case 1 :
+                    // InternalFormalML.g:42307:3: rule__Signal__VisibilityAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Signal__VisibilityAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group__1"
+    // InternalFormalML.g:42315:1: rule__Signal__Group__1 : rule__Signal__Group__1__Impl rule__Signal__Group__2 ;
+    public final void rule__Signal__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42319:1: ( rule__Signal__Group__1__Impl rule__Signal__Group__2 )
+            // InternalFormalML.g:42320:2: rule__Signal__Group__1__Impl rule__Signal__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__Signal__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__1"
+
+
+    // $ANTLR start "rule__Signal__Group__1__Impl"
+    // InternalFormalML.g:42327:1: rule__Signal__Group__1__Impl : ( 'signal' ) ;
+    public final void rule__Signal__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42331:1: ( ( 'signal' ) )
+            // InternalFormalML.g:42332:1: ( 'signal' )
+            {
+            // InternalFormalML.g:42332:1: ( 'signal' )
+            // InternalFormalML.g:42333:2: 'signal'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getSignalKeyword_1()); 
+            }
+            match(input,18,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getSignalKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group__2"
+    // InternalFormalML.g:42342:1: rule__Signal__Group__2 : rule__Signal__Group__2__Impl rule__Signal__Group__3 ;
+    public final void rule__Signal__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42346:1: ( rule__Signal__Group__2__Impl rule__Signal__Group__3 )
+            // InternalFormalML.g:42347:2: rule__Signal__Group__2__Impl rule__Signal__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__Signal__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__2"
+
+
+    // $ANTLR start "rule__Signal__Group__2__Impl"
+    // InternalFormalML.g:42354:1: rule__Signal__Group__2__Impl : ( ( rule__Signal__DirectionAssignment_2 )? ) ;
+    public final void rule__Signal__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42358:1: ( ( ( rule__Signal__DirectionAssignment_2 )? ) )
+            // InternalFormalML.g:42359:1: ( ( rule__Signal__DirectionAssignment_2 )? )
+            {
+            // InternalFormalML.g:42359:1: ( ( rule__Signal__DirectionAssignment_2 )? )
+            // InternalFormalML.g:42360:2: ( rule__Signal__DirectionAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getDirectionAssignment_2()); 
+            }
+            // InternalFormalML.g:42361:2: ( rule__Signal__DirectionAssignment_2 )?
+            int alt575=2;
+            int LA575_0 = input.LA(1);
+
+            if ( (LA575_0==173||(LA575_0>=175 && LA575_0<=176)) ) {
+                alt575=1;
+            }
+            switch (alt575) {
+                case 1 :
+                    // InternalFormalML.g:42361:3: rule__Signal__DirectionAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Signal__DirectionAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getDirectionAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group__3"
+    // InternalFormalML.g:42369:1: rule__Signal__Group__3 : rule__Signal__Group__3__Impl rule__Signal__Group__4 ;
+    public final void rule__Signal__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42373:1: ( rule__Signal__Group__3__Impl rule__Signal__Group__4 )
+            // InternalFormalML.g:42374:2: rule__Signal__Group__3__Impl rule__Signal__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__Signal__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__3"
+
+
+    // $ANTLR start "rule__Signal__Group__3__Impl"
+    // InternalFormalML.g:42381:1: rule__Signal__Group__3__Impl : ( ( rule__Signal__NameAssignment_3 ) ) ;
+    public final void rule__Signal__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42385:1: ( ( ( rule__Signal__NameAssignment_3 ) ) )
+            // InternalFormalML.g:42386:1: ( ( rule__Signal__NameAssignment_3 ) )
+            {
+            // InternalFormalML.g:42386:1: ( ( rule__Signal__NameAssignment_3 ) )
+            // InternalFormalML.g:42387:2: ( rule__Signal__NameAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getNameAssignment_3()); 
+            }
+            // InternalFormalML.g:42388:2: ( rule__Signal__NameAssignment_3 )
+            // InternalFormalML.g:42388:3: rule__Signal__NameAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__NameAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group__4"
+    // InternalFormalML.g:42396:1: rule__Signal__Group__4 : rule__Signal__Group__4__Impl rule__Signal__Group__5 ;
+    public final void rule__Signal__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42400:1: ( rule__Signal__Group__4__Impl rule__Signal__Group__5 )
+            // InternalFormalML.g:42401:2: rule__Signal__Group__4__Impl rule__Signal__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__Signal__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__4"
+
+
+    // $ANTLR start "rule__Signal__Group__4__Impl"
+    // InternalFormalML.g:42408:1: rule__Signal__Group__4__Impl : ( ( rule__Signal__UnrestrictedNameAssignment_4 )? ) ;
+    public final void rule__Signal__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42412:1: ( ( ( rule__Signal__UnrestrictedNameAssignment_4 )? ) )
+            // InternalFormalML.g:42413:1: ( ( rule__Signal__UnrestrictedNameAssignment_4 )? )
+            {
+            // InternalFormalML.g:42413:1: ( ( rule__Signal__UnrestrictedNameAssignment_4 )? )
+            // InternalFormalML.g:42414:2: ( rule__Signal__UnrestrictedNameAssignment_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getUnrestrictedNameAssignment_4()); 
+            }
+            // InternalFormalML.g:42415:2: ( rule__Signal__UnrestrictedNameAssignment_4 )?
+            int alt576=2;
+            int LA576_0 = input.LA(1);
+
+            if ( (LA576_0==RULE_STRING) ) {
+                alt576=1;
+            }
+            switch (alt576) {
+                case 1 :
+                    // InternalFormalML.g:42415:3: rule__Signal__UnrestrictedNameAssignment_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Signal__UnrestrictedNameAssignment_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getUnrestrictedNameAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group__5"
+    // InternalFormalML.g:42423:1: rule__Signal__Group__5 : rule__Signal__Group__5__Impl rule__Signal__Group__6 ;
+    public final void rule__Signal__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42427:1: ( rule__Signal__Group__5__Impl rule__Signal__Group__6 )
+            // InternalFormalML.g:42428:2: rule__Signal__Group__5__Impl rule__Signal__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__Signal__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__5"
+
+
+    // $ANTLR start "rule__Signal__Group__5__Impl"
+    // InternalFormalML.g:42435:1: rule__Signal__Group__5__Impl : ( ( rule__Signal__Group_5__0 )? ) ;
+    public final void rule__Signal__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42439:1: ( ( ( rule__Signal__Group_5__0 )? ) )
+            // InternalFormalML.g:42440:1: ( ( rule__Signal__Group_5__0 )? )
+            {
+            // InternalFormalML.g:42440:1: ( ( rule__Signal__Group_5__0 )? )
+            // InternalFormalML.g:42441:2: ( rule__Signal__Group_5__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getGroup_5()); 
+            }
+            // InternalFormalML.g:42442:2: ( rule__Signal__Group_5__0 )?
+            int alt577=2;
+            int LA577_0 = input.LA(1);
+
+            if ( (LA577_0==23) ) {
+                alt577=1;
+            }
+            switch (alt577) {
+                case 1 :
+                    // InternalFormalML.g:42442:3: rule__Signal__Group_5__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Signal__Group_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getGroup_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group__6"
+    // InternalFormalML.g:42450:1: rule__Signal__Group__6 : rule__Signal__Group__6__Impl ;
+    public final void rule__Signal__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42454:1: ( rule__Signal__Group__6__Impl )
+            // InternalFormalML.g:42455:2: rule__Signal__Group__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__6"
+
+
+    // $ANTLR start "rule__Signal__Group__6__Impl"
+    // InternalFormalML.g:42461:1: rule__Signal__Group__6__Impl : ( ';' ) ;
+    public final void rule__Signal__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42465:1: ( ( ';' ) )
+            // InternalFormalML.g:42466:1: ( ';' )
+            {
+            // InternalFormalML.g:42466:1: ( ';' )
+            // InternalFormalML.g:42467:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getSemicolonKeyword_6()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getSemicolonKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group_5__0"
+    // InternalFormalML.g:42477:1: rule__Signal__Group_5__0 : rule__Signal__Group_5__0__Impl rule__Signal__Group_5__1 ;
+    public final void rule__Signal__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42481:1: ( rule__Signal__Group_5__0__Impl rule__Signal__Group_5__1 )
+            // InternalFormalML.g:42482:2: rule__Signal__Group_5__0__Impl rule__Signal__Group_5__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__Signal__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5__0"
+
+
+    // $ANTLR start "rule__Signal__Group_5__0__Impl"
+    // InternalFormalML.g:42489:1: rule__Signal__Group_5__0__Impl : ( '(' ) ;
+    public final void rule__Signal__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42493:1: ( ( '(' ) )
+            // InternalFormalML.g:42494:1: ( '(' )
+            {
+            // InternalFormalML.g:42494:1: ( '(' )
+            // InternalFormalML.g:42495:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getLeftParenthesisKeyword_5_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getLeftParenthesisKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group_5__1"
+    // InternalFormalML.g:42504:1: rule__Signal__Group_5__1 : rule__Signal__Group_5__1__Impl rule__Signal__Group_5__2 ;
+    public final void rule__Signal__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42508:1: ( rule__Signal__Group_5__1__Impl rule__Signal__Group_5__2 )
+            // InternalFormalML.g:42509:2: rule__Signal__Group_5__1__Impl rule__Signal__Group_5__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__Signal__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group_5__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5__1"
+
+
+    // $ANTLR start "rule__Signal__Group_5__1__Impl"
+    // InternalFormalML.g:42516:1: rule__Signal__Group_5__1__Impl : ( ( rule__Signal__ParameterAssignment_5_1 ) ) ;
+    public final void rule__Signal__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42520:1: ( ( ( rule__Signal__ParameterAssignment_5_1 ) ) )
+            // InternalFormalML.g:42521:1: ( ( rule__Signal__ParameterAssignment_5_1 ) )
+            {
+            // InternalFormalML.g:42521:1: ( ( rule__Signal__ParameterAssignment_5_1 ) )
+            // InternalFormalML.g:42522:2: ( rule__Signal__ParameterAssignment_5_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getParameterAssignment_5_1()); 
+            }
+            // InternalFormalML.g:42523:2: ( rule__Signal__ParameterAssignment_5_1 )
+            // InternalFormalML.g:42523:3: rule__Signal__ParameterAssignment_5_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__ParameterAssignment_5_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getParameterAssignment_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group_5__2"
+    // InternalFormalML.g:42531:1: rule__Signal__Group_5__2 : rule__Signal__Group_5__2__Impl rule__Signal__Group_5__3 ;
+    public final void rule__Signal__Group_5__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42535:1: ( rule__Signal__Group_5__2__Impl rule__Signal__Group_5__3 )
+            // InternalFormalML.g:42536:2: rule__Signal__Group_5__2__Impl rule__Signal__Group_5__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__Signal__Group_5__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group_5__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5__2"
+
+
+    // $ANTLR start "rule__Signal__Group_5__2__Impl"
+    // InternalFormalML.g:42543:1: rule__Signal__Group_5__2__Impl : ( ( rule__Signal__Group_5_2__0 )* ) ;
+    public final void rule__Signal__Group_5__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42547:1: ( ( ( rule__Signal__Group_5_2__0 )* ) )
+            // InternalFormalML.g:42548:1: ( ( rule__Signal__Group_5_2__0 )* )
+            {
+            // InternalFormalML.g:42548:1: ( ( rule__Signal__Group_5_2__0 )* )
+            // InternalFormalML.g:42549:2: ( rule__Signal__Group_5_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getGroup_5_2()); 
+            }
+            // InternalFormalML.g:42550:2: ( rule__Signal__Group_5_2__0 )*
+            loop578:
+            do {
+                int alt578=2;
+                int LA578_0 = input.LA(1);
+
+                if ( (LA578_0==198) ) {
+                    alt578=1;
+                }
+
+
+                switch (alt578) {
+            	case 1 :
+            	    // InternalFormalML.g:42550:3: rule__Signal__Group_5_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__Signal__Group_5_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop578;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getGroup_5_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5__2__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group_5__3"
+    // InternalFormalML.g:42558:1: rule__Signal__Group_5__3 : rule__Signal__Group_5__3__Impl ;
+    public final void rule__Signal__Group_5__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42562:1: ( rule__Signal__Group_5__3__Impl )
+            // InternalFormalML.g:42563:2: rule__Signal__Group_5__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group_5__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5__3"
+
+
+    // $ANTLR start "rule__Signal__Group_5__3__Impl"
+    // InternalFormalML.g:42569:1: rule__Signal__Group_5__3__Impl : ( ')' ) ;
+    public final void rule__Signal__Group_5__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42573:1: ( ( ')' ) )
+            // InternalFormalML.g:42574:1: ( ')' )
+            {
+            // InternalFormalML.g:42574:1: ( ')' )
+            // InternalFormalML.g:42575:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getRightParenthesisKeyword_5_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getRightParenthesisKeyword_5_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5__3__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group_5_2__0"
+    // InternalFormalML.g:42585:1: rule__Signal__Group_5_2__0 : rule__Signal__Group_5_2__0__Impl rule__Signal__Group_5_2__1 ;
+    public final void rule__Signal__Group_5_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42589:1: ( rule__Signal__Group_5_2__0__Impl rule__Signal__Group_5_2__1 )
+            // InternalFormalML.g:42590:2: rule__Signal__Group_5_2__0__Impl rule__Signal__Group_5_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__Signal__Group_5_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group_5_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5_2__0"
+
+
+    // $ANTLR start "rule__Signal__Group_5_2__0__Impl"
+    // InternalFormalML.g:42597:1: rule__Signal__Group_5_2__0__Impl : ( ',' ) ;
+    public final void rule__Signal__Group_5_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42601:1: ( ( ',' ) )
+            // InternalFormalML.g:42602:1: ( ',' )
+            {
+            // InternalFormalML.g:42602:1: ( ',' )
+            // InternalFormalML.g:42603:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getCommaKeyword_5_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getCommaKeyword_5_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5_2__0__Impl"
+
+
+    // $ANTLR start "rule__Signal__Group_5_2__1"
+    // InternalFormalML.g:42612:1: rule__Signal__Group_5_2__1 : rule__Signal__Group_5_2__1__Impl ;
+    public final void rule__Signal__Group_5_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42616:1: ( rule__Signal__Group_5_2__1__Impl )
+            // InternalFormalML.g:42617:2: rule__Signal__Group_5_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__Group_5_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5_2__1"
+
+
+    // $ANTLR start "rule__Signal__Group_5_2__1__Impl"
+    // InternalFormalML.g:42623:1: rule__Signal__Group_5_2__1__Impl : ( ( rule__Signal__ParameterAssignment_5_2_1 ) ) ;
+    public final void rule__Signal__Group_5_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42627:1: ( ( ( rule__Signal__ParameterAssignment_5_2_1 ) ) )
+            // InternalFormalML.g:42628:1: ( ( rule__Signal__ParameterAssignment_5_2_1 ) )
+            {
+            // InternalFormalML.g:42628:1: ( ( rule__Signal__ParameterAssignment_5_2_1 ) )
+            // InternalFormalML.g:42629:2: ( rule__Signal__ParameterAssignment_5_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getParameterAssignment_5_2_1()); 
+            }
+            // InternalFormalML.g:42630:2: ( rule__Signal__ParameterAssignment_5_2_1 )
+            // InternalFormalML.g:42630:3: rule__Signal__ParameterAssignment_5_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Signal__ParameterAssignment_5_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getParameterAssignment_5_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__Group_5_2__1__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__0"
+    // InternalFormalML.g:42639:1: rule__SignalPublic__Group__0 : rule__SignalPublic__Group__0__Impl rule__SignalPublic__Group__1 ;
+    public final void rule__SignalPublic__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42643:1: ( rule__SignalPublic__Group__0__Impl rule__SignalPublic__Group__1 )
+            // InternalFormalML.g:42644:2: rule__SignalPublic__Group__0__Impl rule__SignalPublic__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__SignalPublic__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__0"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__0__Impl"
+    // InternalFormalML.g:42651:1: rule__SignalPublic__Group__0__Impl : ( ( rule__SignalPublic__VisibilityAssignment_0 ) ) ;
+    public final void rule__SignalPublic__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42655:1: ( ( ( rule__SignalPublic__VisibilityAssignment_0 ) ) )
+            // InternalFormalML.g:42656:1: ( ( rule__SignalPublic__VisibilityAssignment_0 ) )
+            {
+            // InternalFormalML.g:42656:1: ( ( rule__SignalPublic__VisibilityAssignment_0 ) )
+            // InternalFormalML.g:42657:2: ( rule__SignalPublic__VisibilityAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:42658:2: ( rule__SignalPublic__VisibilityAssignment_0 )
+            // InternalFormalML.g:42658:3: rule__SignalPublic__VisibilityAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__VisibilityAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__0__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__1"
+    // InternalFormalML.g:42666:1: rule__SignalPublic__Group__1 : rule__SignalPublic__Group__1__Impl rule__SignalPublic__Group__2 ;
+    public final void rule__SignalPublic__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42670:1: ( rule__SignalPublic__Group__1__Impl rule__SignalPublic__Group__2 )
+            // InternalFormalML.g:42671:2: rule__SignalPublic__Group__1__Impl rule__SignalPublic__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__SignalPublic__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__1"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__1__Impl"
+    // InternalFormalML.g:42678:1: rule__SignalPublic__Group__1__Impl : ( ( rule__SignalPublic__DirectionAssignment_1 )? ) ;
+    public final void rule__SignalPublic__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42682:1: ( ( ( rule__SignalPublic__DirectionAssignment_1 )? ) )
+            // InternalFormalML.g:42683:1: ( ( rule__SignalPublic__DirectionAssignment_1 )? )
+            {
+            // InternalFormalML.g:42683:1: ( ( rule__SignalPublic__DirectionAssignment_1 )? )
+            // InternalFormalML.g:42684:2: ( rule__SignalPublic__DirectionAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getDirectionAssignment_1()); 
+            }
+            // InternalFormalML.g:42685:2: ( rule__SignalPublic__DirectionAssignment_1 )?
+            int alt579=2;
+            int LA579_0 = input.LA(1);
+
+            if ( (LA579_0==173||(LA579_0>=175 && LA579_0<=176)) ) {
+                alt579=1;
+            }
+            switch (alt579) {
+                case 1 :
+                    // InternalFormalML.g:42685:3: rule__SignalPublic__DirectionAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalPublic__DirectionAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getDirectionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__1__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__2"
+    // InternalFormalML.g:42693:1: rule__SignalPublic__Group__2 : rule__SignalPublic__Group__2__Impl rule__SignalPublic__Group__3 ;
+    public final void rule__SignalPublic__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42697:1: ( rule__SignalPublic__Group__2__Impl rule__SignalPublic__Group__3 )
+            // InternalFormalML.g:42698:2: rule__SignalPublic__Group__2__Impl rule__SignalPublic__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__SignalPublic__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__2"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__2__Impl"
+    // InternalFormalML.g:42705:1: rule__SignalPublic__Group__2__Impl : ( ( rule__SignalPublic__NameAssignment_2 ) ) ;
+    public final void rule__SignalPublic__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42709:1: ( ( ( rule__SignalPublic__NameAssignment_2 ) ) )
+            // InternalFormalML.g:42710:1: ( ( rule__SignalPublic__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:42710:1: ( ( rule__SignalPublic__NameAssignment_2 ) )
+            // InternalFormalML.g:42711:2: ( rule__SignalPublic__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:42712:2: ( rule__SignalPublic__NameAssignment_2 )
+            // InternalFormalML.g:42712:3: rule__SignalPublic__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__2__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__3"
+    // InternalFormalML.g:42720:1: rule__SignalPublic__Group__3 : rule__SignalPublic__Group__3__Impl rule__SignalPublic__Group__4 ;
+    public final void rule__SignalPublic__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42724:1: ( rule__SignalPublic__Group__3__Impl rule__SignalPublic__Group__4 )
+            // InternalFormalML.g:42725:2: rule__SignalPublic__Group__3__Impl rule__SignalPublic__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__SignalPublic__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__3"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__3__Impl"
+    // InternalFormalML.g:42732:1: rule__SignalPublic__Group__3__Impl : ( ( rule__SignalPublic__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__SignalPublic__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42736:1: ( ( ( rule__SignalPublic__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:42737:1: ( ( rule__SignalPublic__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:42737:1: ( ( rule__SignalPublic__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:42738:2: ( rule__SignalPublic__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:42739:2: ( rule__SignalPublic__UnrestrictedNameAssignment_3 )?
+            int alt580=2;
+            int LA580_0 = input.LA(1);
+
+            if ( (LA580_0==RULE_STRING) ) {
+                alt580=1;
+            }
+            switch (alt580) {
+                case 1 :
+                    // InternalFormalML.g:42739:3: rule__SignalPublic__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalPublic__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__3__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__4"
+    // InternalFormalML.g:42747:1: rule__SignalPublic__Group__4 : rule__SignalPublic__Group__4__Impl rule__SignalPublic__Group__5 ;
+    public final void rule__SignalPublic__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42751:1: ( rule__SignalPublic__Group__4__Impl rule__SignalPublic__Group__5 )
+            // InternalFormalML.g:42752:2: rule__SignalPublic__Group__4__Impl rule__SignalPublic__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__SignalPublic__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__4"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__4__Impl"
+    // InternalFormalML.g:42759:1: rule__SignalPublic__Group__4__Impl : ( ( rule__SignalPublic__Group_4__0 )? ) ;
+    public final void rule__SignalPublic__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42763:1: ( ( ( rule__SignalPublic__Group_4__0 )? ) )
+            // InternalFormalML.g:42764:1: ( ( rule__SignalPublic__Group_4__0 )? )
+            {
+            // InternalFormalML.g:42764:1: ( ( rule__SignalPublic__Group_4__0 )? )
+            // InternalFormalML.g:42765:2: ( rule__SignalPublic__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:42766:2: ( rule__SignalPublic__Group_4__0 )?
+            int alt581=2;
+            int LA581_0 = input.LA(1);
+
+            if ( (LA581_0==23) ) {
+                alt581=1;
+            }
+            switch (alt581) {
+                case 1 :
+                    // InternalFormalML.g:42766:3: rule__SignalPublic__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalPublic__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__4__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__5"
+    // InternalFormalML.g:42774:1: rule__SignalPublic__Group__5 : rule__SignalPublic__Group__5__Impl ;
+    public final void rule__SignalPublic__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42778:1: ( rule__SignalPublic__Group__5__Impl )
+            // InternalFormalML.g:42779:2: rule__SignalPublic__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__5"
+
+
+    // $ANTLR start "rule__SignalPublic__Group__5__Impl"
+    // InternalFormalML.g:42785:1: rule__SignalPublic__Group__5__Impl : ( ';' ) ;
+    public final void rule__SignalPublic__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42789:1: ( ( ';' ) )
+            // InternalFormalML.g:42790:1: ( ';' )
+            {
+            // InternalFormalML.g:42790:1: ( ';' )
+            // InternalFormalML.g:42791:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group__5__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4__0"
+    // InternalFormalML.g:42801:1: rule__SignalPublic__Group_4__0 : rule__SignalPublic__Group_4__0__Impl rule__SignalPublic__Group_4__1 ;
+    public final void rule__SignalPublic__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42805:1: ( rule__SignalPublic__Group_4__0__Impl rule__SignalPublic__Group_4__1 )
+            // InternalFormalML.g:42806:2: rule__SignalPublic__Group_4__0__Impl rule__SignalPublic__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__SignalPublic__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4__0"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4__0__Impl"
+    // InternalFormalML.g:42813:1: rule__SignalPublic__Group_4__0__Impl : ( '(' ) ;
+    public final void rule__SignalPublic__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42817:1: ( ( '(' ) )
+            // InternalFormalML.g:42818:1: ( '(' )
+            {
+            // InternalFormalML.g:42818:1: ( '(' )
+            // InternalFormalML.g:42819:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4__1"
+    // InternalFormalML.g:42828:1: rule__SignalPublic__Group_4__1 : rule__SignalPublic__Group_4__1__Impl rule__SignalPublic__Group_4__2 ;
+    public final void rule__SignalPublic__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42832:1: ( rule__SignalPublic__Group_4__1__Impl rule__SignalPublic__Group_4__2 )
+            // InternalFormalML.g:42833:2: rule__SignalPublic__Group_4__1__Impl rule__SignalPublic__Group_4__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__SignalPublic__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4__1"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4__1__Impl"
+    // InternalFormalML.g:42840:1: rule__SignalPublic__Group_4__1__Impl : ( ( rule__SignalPublic__ParameterAssignment_4_1 ) ) ;
+    public final void rule__SignalPublic__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42844:1: ( ( ( rule__SignalPublic__ParameterAssignment_4_1 ) ) )
+            // InternalFormalML.g:42845:1: ( ( rule__SignalPublic__ParameterAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:42845:1: ( ( rule__SignalPublic__ParameterAssignment_4_1 ) )
+            // InternalFormalML.g:42846:2: ( rule__SignalPublic__ParameterAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_1()); 
+            }
+            // InternalFormalML.g:42847:2: ( rule__SignalPublic__ParameterAssignment_4_1 )
+            // InternalFormalML.g:42847:3: rule__SignalPublic__ParameterAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__ParameterAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4__2"
+    // InternalFormalML.g:42855:1: rule__SignalPublic__Group_4__2 : rule__SignalPublic__Group_4__2__Impl rule__SignalPublic__Group_4__3 ;
+    public final void rule__SignalPublic__Group_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42859:1: ( rule__SignalPublic__Group_4__2__Impl rule__SignalPublic__Group_4__3 )
+            // InternalFormalML.g:42860:2: rule__SignalPublic__Group_4__2__Impl rule__SignalPublic__Group_4__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__SignalPublic__Group_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group_4__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4__2"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4__2__Impl"
+    // InternalFormalML.g:42867:1: rule__SignalPublic__Group_4__2__Impl : ( ( rule__SignalPublic__Group_4_2__0 )* ) ;
+    public final void rule__SignalPublic__Group_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42871:1: ( ( ( rule__SignalPublic__Group_4_2__0 )* ) )
+            // InternalFormalML.g:42872:1: ( ( rule__SignalPublic__Group_4_2__0 )* )
+            {
+            // InternalFormalML.g:42872:1: ( ( rule__SignalPublic__Group_4_2__0 )* )
+            // InternalFormalML.g:42873:2: ( rule__SignalPublic__Group_4_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getGroup_4_2()); 
+            }
+            // InternalFormalML.g:42874:2: ( rule__SignalPublic__Group_4_2__0 )*
+            loop582:
+            do {
+                int alt582=2;
+                int LA582_0 = input.LA(1);
+
+                if ( (LA582_0==198) ) {
+                    alt582=1;
+                }
+
+
+                switch (alt582) {
+            	case 1 :
+            	    // InternalFormalML.g:42874:3: rule__SignalPublic__Group_4_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__SignalPublic__Group_4_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop582;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getGroup_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4__2__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4__3"
+    // InternalFormalML.g:42882:1: rule__SignalPublic__Group_4__3 : rule__SignalPublic__Group_4__3__Impl ;
+    public final void rule__SignalPublic__Group_4__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42886:1: ( rule__SignalPublic__Group_4__3__Impl )
+            // InternalFormalML.g:42887:2: rule__SignalPublic__Group_4__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group_4__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4__3"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4__3__Impl"
+    // InternalFormalML.g:42893:1: rule__SignalPublic__Group_4__3__Impl : ( ')' ) ;
+    public final void rule__SignalPublic__Group_4__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42897:1: ( ( ')' ) )
+            // InternalFormalML.g:42898:1: ( ')' )
+            {
+            // InternalFormalML.g:42898:1: ( ')' )
+            // InternalFormalML.g:42899:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getRightParenthesisKeyword_4_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getRightParenthesisKeyword_4_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4__3__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4_2__0"
+    // InternalFormalML.g:42909:1: rule__SignalPublic__Group_4_2__0 : rule__SignalPublic__Group_4_2__0__Impl rule__SignalPublic__Group_4_2__1 ;
+    public final void rule__SignalPublic__Group_4_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42913:1: ( rule__SignalPublic__Group_4_2__0__Impl rule__SignalPublic__Group_4_2__1 )
+            // InternalFormalML.g:42914:2: rule__SignalPublic__Group_4_2__0__Impl rule__SignalPublic__Group_4_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__SignalPublic__Group_4_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group_4_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4_2__0"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4_2__0__Impl"
+    // InternalFormalML.g:42921:1: rule__SignalPublic__Group_4_2__0__Impl : ( ',' ) ;
+    public final void rule__SignalPublic__Group_4_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42925:1: ( ( ',' ) )
+            // InternalFormalML.g:42926:1: ( ',' )
+            {
+            // InternalFormalML.g:42926:1: ( ',' )
+            // InternalFormalML.g:42927:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getCommaKeyword_4_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getCommaKeyword_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4_2__0__Impl"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4_2__1"
+    // InternalFormalML.g:42936:1: rule__SignalPublic__Group_4_2__1 : rule__SignalPublic__Group_4_2__1__Impl ;
+    public final void rule__SignalPublic__Group_4_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42940:1: ( rule__SignalPublic__Group_4_2__1__Impl )
+            // InternalFormalML.g:42941:2: rule__SignalPublic__Group_4_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__Group_4_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4_2__1"
+
+
+    // $ANTLR start "rule__SignalPublic__Group_4_2__1__Impl"
+    // InternalFormalML.g:42947:1: rule__SignalPublic__Group_4_2__1__Impl : ( ( rule__SignalPublic__ParameterAssignment_4_2_1 ) ) ;
+    public final void rule__SignalPublic__Group_4_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42951:1: ( ( ( rule__SignalPublic__ParameterAssignment_4_2_1 ) ) )
+            // InternalFormalML.g:42952:1: ( ( rule__SignalPublic__ParameterAssignment_4_2_1 ) )
+            {
+            // InternalFormalML.g:42952:1: ( ( rule__SignalPublic__ParameterAssignment_4_2_1 ) )
+            // InternalFormalML.g:42953:2: ( rule__SignalPublic__ParameterAssignment_4_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_2_1()); 
+            }
+            // InternalFormalML.g:42954:2: ( rule__SignalPublic__ParameterAssignment_4_2_1 )
+            // InternalFormalML.g:42954:3: rule__SignalPublic__ParameterAssignment_4_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPublic__ParameterAssignment_4_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getParameterAssignment_4_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__Group_4_2__1__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__0"
+    // InternalFormalML.g:42963:1: rule__SignalProtected__Group__0 : rule__SignalProtected__Group__0__Impl rule__SignalProtected__Group__1 ;
+    public final void rule__SignalProtected__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42967:1: ( rule__SignalProtected__Group__0__Impl rule__SignalProtected__Group__1 )
+            // InternalFormalML.g:42968:2: rule__SignalProtected__Group__0__Impl rule__SignalProtected__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__SignalProtected__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__0"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__0__Impl"
+    // InternalFormalML.g:42975:1: rule__SignalProtected__Group__0__Impl : ( ( rule__SignalProtected__VisibilityAssignment_0 ) ) ;
+    public final void rule__SignalProtected__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42979:1: ( ( ( rule__SignalProtected__VisibilityAssignment_0 ) ) )
+            // InternalFormalML.g:42980:1: ( ( rule__SignalProtected__VisibilityAssignment_0 ) )
+            {
+            // InternalFormalML.g:42980:1: ( ( rule__SignalProtected__VisibilityAssignment_0 ) )
+            // InternalFormalML.g:42981:2: ( rule__SignalProtected__VisibilityAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:42982:2: ( rule__SignalProtected__VisibilityAssignment_0 )
+            // InternalFormalML.g:42982:3: rule__SignalProtected__VisibilityAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__VisibilityAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__0__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__1"
+    // InternalFormalML.g:42990:1: rule__SignalProtected__Group__1 : rule__SignalProtected__Group__1__Impl rule__SignalProtected__Group__2 ;
+    public final void rule__SignalProtected__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:42994:1: ( rule__SignalProtected__Group__1__Impl rule__SignalProtected__Group__2 )
+            // InternalFormalML.g:42995:2: rule__SignalProtected__Group__1__Impl rule__SignalProtected__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__SignalProtected__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__1"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__1__Impl"
+    // InternalFormalML.g:43002:1: rule__SignalProtected__Group__1__Impl : ( ( rule__SignalProtected__DirectionAssignment_1 )? ) ;
+    public final void rule__SignalProtected__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43006:1: ( ( ( rule__SignalProtected__DirectionAssignment_1 )? ) )
+            // InternalFormalML.g:43007:1: ( ( rule__SignalProtected__DirectionAssignment_1 )? )
+            {
+            // InternalFormalML.g:43007:1: ( ( rule__SignalProtected__DirectionAssignment_1 )? )
+            // InternalFormalML.g:43008:2: ( rule__SignalProtected__DirectionAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getDirectionAssignment_1()); 
+            }
+            // InternalFormalML.g:43009:2: ( rule__SignalProtected__DirectionAssignment_1 )?
+            int alt583=2;
+            int LA583_0 = input.LA(1);
+
+            if ( (LA583_0==173||(LA583_0>=175 && LA583_0<=176)) ) {
+                alt583=1;
+            }
+            switch (alt583) {
+                case 1 :
+                    // InternalFormalML.g:43009:3: rule__SignalProtected__DirectionAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalProtected__DirectionAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getDirectionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__1__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__2"
+    // InternalFormalML.g:43017:1: rule__SignalProtected__Group__2 : rule__SignalProtected__Group__2__Impl rule__SignalProtected__Group__3 ;
+    public final void rule__SignalProtected__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43021:1: ( rule__SignalProtected__Group__2__Impl rule__SignalProtected__Group__3 )
+            // InternalFormalML.g:43022:2: rule__SignalProtected__Group__2__Impl rule__SignalProtected__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__SignalProtected__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__2"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__2__Impl"
+    // InternalFormalML.g:43029:1: rule__SignalProtected__Group__2__Impl : ( ( rule__SignalProtected__NameAssignment_2 ) ) ;
+    public final void rule__SignalProtected__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43033:1: ( ( ( rule__SignalProtected__NameAssignment_2 ) ) )
+            // InternalFormalML.g:43034:1: ( ( rule__SignalProtected__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:43034:1: ( ( rule__SignalProtected__NameAssignment_2 ) )
+            // InternalFormalML.g:43035:2: ( rule__SignalProtected__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:43036:2: ( rule__SignalProtected__NameAssignment_2 )
+            // InternalFormalML.g:43036:3: rule__SignalProtected__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__2__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__3"
+    // InternalFormalML.g:43044:1: rule__SignalProtected__Group__3 : rule__SignalProtected__Group__3__Impl rule__SignalProtected__Group__4 ;
+    public final void rule__SignalProtected__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43048:1: ( rule__SignalProtected__Group__3__Impl rule__SignalProtected__Group__4 )
+            // InternalFormalML.g:43049:2: rule__SignalProtected__Group__3__Impl rule__SignalProtected__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__SignalProtected__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__3"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__3__Impl"
+    // InternalFormalML.g:43056:1: rule__SignalProtected__Group__3__Impl : ( ( rule__SignalProtected__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__SignalProtected__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43060:1: ( ( ( rule__SignalProtected__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:43061:1: ( ( rule__SignalProtected__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:43061:1: ( ( rule__SignalProtected__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:43062:2: ( rule__SignalProtected__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:43063:2: ( rule__SignalProtected__UnrestrictedNameAssignment_3 )?
+            int alt584=2;
+            int LA584_0 = input.LA(1);
+
+            if ( (LA584_0==RULE_STRING) ) {
+                alt584=1;
+            }
+            switch (alt584) {
+                case 1 :
+                    // InternalFormalML.g:43063:3: rule__SignalProtected__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalProtected__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__3__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__4"
+    // InternalFormalML.g:43071:1: rule__SignalProtected__Group__4 : rule__SignalProtected__Group__4__Impl rule__SignalProtected__Group__5 ;
+    public final void rule__SignalProtected__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43075:1: ( rule__SignalProtected__Group__4__Impl rule__SignalProtected__Group__5 )
+            // InternalFormalML.g:43076:2: rule__SignalProtected__Group__4__Impl rule__SignalProtected__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__SignalProtected__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__4"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__4__Impl"
+    // InternalFormalML.g:43083:1: rule__SignalProtected__Group__4__Impl : ( ( rule__SignalProtected__Group_4__0 )? ) ;
+    public final void rule__SignalProtected__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43087:1: ( ( ( rule__SignalProtected__Group_4__0 )? ) )
+            // InternalFormalML.g:43088:1: ( ( rule__SignalProtected__Group_4__0 )? )
+            {
+            // InternalFormalML.g:43088:1: ( ( rule__SignalProtected__Group_4__0 )? )
+            // InternalFormalML.g:43089:2: ( rule__SignalProtected__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:43090:2: ( rule__SignalProtected__Group_4__0 )?
+            int alt585=2;
+            int LA585_0 = input.LA(1);
+
+            if ( (LA585_0==23) ) {
+                alt585=1;
+            }
+            switch (alt585) {
+                case 1 :
+                    // InternalFormalML.g:43090:3: rule__SignalProtected__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalProtected__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__4__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__5"
+    // InternalFormalML.g:43098:1: rule__SignalProtected__Group__5 : rule__SignalProtected__Group__5__Impl ;
+    public final void rule__SignalProtected__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43102:1: ( rule__SignalProtected__Group__5__Impl )
+            // InternalFormalML.g:43103:2: rule__SignalProtected__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__5"
+
+
+    // $ANTLR start "rule__SignalProtected__Group__5__Impl"
+    // InternalFormalML.g:43109:1: rule__SignalProtected__Group__5__Impl : ( ';' ) ;
+    public final void rule__SignalProtected__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43113:1: ( ( ';' ) )
+            // InternalFormalML.g:43114:1: ( ';' )
+            {
+            // InternalFormalML.g:43114:1: ( ';' )
+            // InternalFormalML.g:43115:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group__5__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4__0"
+    // InternalFormalML.g:43125:1: rule__SignalProtected__Group_4__0 : rule__SignalProtected__Group_4__0__Impl rule__SignalProtected__Group_4__1 ;
+    public final void rule__SignalProtected__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43129:1: ( rule__SignalProtected__Group_4__0__Impl rule__SignalProtected__Group_4__1 )
+            // InternalFormalML.g:43130:2: rule__SignalProtected__Group_4__0__Impl rule__SignalProtected__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__SignalProtected__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4__0"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4__0__Impl"
+    // InternalFormalML.g:43137:1: rule__SignalProtected__Group_4__0__Impl : ( '(' ) ;
+    public final void rule__SignalProtected__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43141:1: ( ( '(' ) )
+            // InternalFormalML.g:43142:1: ( '(' )
+            {
+            // InternalFormalML.g:43142:1: ( '(' )
+            // InternalFormalML.g:43143:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4__1"
+    // InternalFormalML.g:43152:1: rule__SignalProtected__Group_4__1 : rule__SignalProtected__Group_4__1__Impl rule__SignalProtected__Group_4__2 ;
+    public final void rule__SignalProtected__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43156:1: ( rule__SignalProtected__Group_4__1__Impl rule__SignalProtected__Group_4__2 )
+            // InternalFormalML.g:43157:2: rule__SignalProtected__Group_4__1__Impl rule__SignalProtected__Group_4__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__SignalProtected__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4__1"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4__1__Impl"
+    // InternalFormalML.g:43164:1: rule__SignalProtected__Group_4__1__Impl : ( ( rule__SignalProtected__ParameterAssignment_4_1 ) ) ;
+    public final void rule__SignalProtected__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43168:1: ( ( ( rule__SignalProtected__ParameterAssignment_4_1 ) ) )
+            // InternalFormalML.g:43169:1: ( ( rule__SignalProtected__ParameterAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:43169:1: ( ( rule__SignalProtected__ParameterAssignment_4_1 ) )
+            // InternalFormalML.g:43170:2: ( rule__SignalProtected__ParameterAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_1()); 
+            }
+            // InternalFormalML.g:43171:2: ( rule__SignalProtected__ParameterAssignment_4_1 )
+            // InternalFormalML.g:43171:3: rule__SignalProtected__ParameterAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__ParameterAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4__2"
+    // InternalFormalML.g:43179:1: rule__SignalProtected__Group_4__2 : rule__SignalProtected__Group_4__2__Impl rule__SignalProtected__Group_4__3 ;
+    public final void rule__SignalProtected__Group_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43183:1: ( rule__SignalProtected__Group_4__2__Impl rule__SignalProtected__Group_4__3 )
+            // InternalFormalML.g:43184:2: rule__SignalProtected__Group_4__2__Impl rule__SignalProtected__Group_4__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__SignalProtected__Group_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group_4__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4__2"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4__2__Impl"
+    // InternalFormalML.g:43191:1: rule__SignalProtected__Group_4__2__Impl : ( ( rule__SignalProtected__Group_4_2__0 )* ) ;
+    public final void rule__SignalProtected__Group_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43195:1: ( ( ( rule__SignalProtected__Group_4_2__0 )* ) )
+            // InternalFormalML.g:43196:1: ( ( rule__SignalProtected__Group_4_2__0 )* )
+            {
+            // InternalFormalML.g:43196:1: ( ( rule__SignalProtected__Group_4_2__0 )* )
+            // InternalFormalML.g:43197:2: ( rule__SignalProtected__Group_4_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getGroup_4_2()); 
+            }
+            // InternalFormalML.g:43198:2: ( rule__SignalProtected__Group_4_2__0 )*
+            loop586:
+            do {
+                int alt586=2;
+                int LA586_0 = input.LA(1);
+
+                if ( (LA586_0==198) ) {
+                    alt586=1;
+                }
+
+
+                switch (alt586) {
+            	case 1 :
+            	    // InternalFormalML.g:43198:3: rule__SignalProtected__Group_4_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__SignalProtected__Group_4_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop586;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getGroup_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4__2__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4__3"
+    // InternalFormalML.g:43206:1: rule__SignalProtected__Group_4__3 : rule__SignalProtected__Group_4__3__Impl ;
+    public final void rule__SignalProtected__Group_4__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43210:1: ( rule__SignalProtected__Group_4__3__Impl )
+            // InternalFormalML.g:43211:2: rule__SignalProtected__Group_4__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group_4__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4__3"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4__3__Impl"
+    // InternalFormalML.g:43217:1: rule__SignalProtected__Group_4__3__Impl : ( ')' ) ;
+    public final void rule__SignalProtected__Group_4__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43221:1: ( ( ')' ) )
+            // InternalFormalML.g:43222:1: ( ')' )
+            {
+            // InternalFormalML.g:43222:1: ( ')' )
+            // InternalFormalML.g:43223:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getRightParenthesisKeyword_4_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getRightParenthesisKeyword_4_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4__3__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4_2__0"
+    // InternalFormalML.g:43233:1: rule__SignalProtected__Group_4_2__0 : rule__SignalProtected__Group_4_2__0__Impl rule__SignalProtected__Group_4_2__1 ;
+    public final void rule__SignalProtected__Group_4_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43237:1: ( rule__SignalProtected__Group_4_2__0__Impl rule__SignalProtected__Group_4_2__1 )
+            // InternalFormalML.g:43238:2: rule__SignalProtected__Group_4_2__0__Impl rule__SignalProtected__Group_4_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__SignalProtected__Group_4_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group_4_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4_2__0"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4_2__0__Impl"
+    // InternalFormalML.g:43245:1: rule__SignalProtected__Group_4_2__0__Impl : ( ',' ) ;
+    public final void rule__SignalProtected__Group_4_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43249:1: ( ( ',' ) )
+            // InternalFormalML.g:43250:1: ( ',' )
+            {
+            // InternalFormalML.g:43250:1: ( ',' )
+            // InternalFormalML.g:43251:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getCommaKeyword_4_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getCommaKeyword_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4_2__0__Impl"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4_2__1"
+    // InternalFormalML.g:43260:1: rule__SignalProtected__Group_4_2__1 : rule__SignalProtected__Group_4_2__1__Impl ;
+    public final void rule__SignalProtected__Group_4_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43264:1: ( rule__SignalProtected__Group_4_2__1__Impl )
+            // InternalFormalML.g:43265:2: rule__SignalProtected__Group_4_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__Group_4_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4_2__1"
+
+
+    // $ANTLR start "rule__SignalProtected__Group_4_2__1__Impl"
+    // InternalFormalML.g:43271:1: rule__SignalProtected__Group_4_2__1__Impl : ( ( rule__SignalProtected__ParameterAssignment_4_2_1 ) ) ;
+    public final void rule__SignalProtected__Group_4_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43275:1: ( ( ( rule__SignalProtected__ParameterAssignment_4_2_1 ) ) )
+            // InternalFormalML.g:43276:1: ( ( rule__SignalProtected__ParameterAssignment_4_2_1 ) )
+            {
+            // InternalFormalML.g:43276:1: ( ( rule__SignalProtected__ParameterAssignment_4_2_1 ) )
+            // InternalFormalML.g:43277:2: ( rule__SignalProtected__ParameterAssignment_4_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_2_1()); 
+            }
+            // InternalFormalML.g:43278:2: ( rule__SignalProtected__ParameterAssignment_4_2_1 )
+            // InternalFormalML.g:43278:3: rule__SignalProtected__ParameterAssignment_4_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalProtected__ParameterAssignment_4_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getParameterAssignment_4_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__Group_4_2__1__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__0"
+    // InternalFormalML.g:43287:1: rule__SignalPrivate__Group__0 : rule__SignalPrivate__Group__0__Impl rule__SignalPrivate__Group__1 ;
+    public final void rule__SignalPrivate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43291:1: ( rule__SignalPrivate__Group__0__Impl rule__SignalPrivate__Group__1 )
+            // InternalFormalML.g:43292:2: rule__SignalPrivate__Group__0__Impl rule__SignalPrivate__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__SignalPrivate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__0"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__0__Impl"
+    // InternalFormalML.g:43299:1: rule__SignalPrivate__Group__0__Impl : ( ( rule__SignalPrivate__VisibilityAssignment_0 ) ) ;
+    public final void rule__SignalPrivate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43303:1: ( ( ( rule__SignalPrivate__VisibilityAssignment_0 ) ) )
+            // InternalFormalML.g:43304:1: ( ( rule__SignalPrivate__VisibilityAssignment_0 ) )
+            {
+            // InternalFormalML.g:43304:1: ( ( rule__SignalPrivate__VisibilityAssignment_0 ) )
+            // InternalFormalML.g:43305:2: ( rule__SignalPrivate__VisibilityAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:43306:2: ( rule__SignalPrivate__VisibilityAssignment_0 )
+            // InternalFormalML.g:43306:3: rule__SignalPrivate__VisibilityAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__VisibilityAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__1"
+    // InternalFormalML.g:43314:1: rule__SignalPrivate__Group__1 : rule__SignalPrivate__Group__1__Impl rule__SignalPrivate__Group__2 ;
+    public final void rule__SignalPrivate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43318:1: ( rule__SignalPrivate__Group__1__Impl rule__SignalPrivate__Group__2 )
+            // InternalFormalML.g:43319:2: rule__SignalPrivate__Group__1__Impl rule__SignalPrivate__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__SignalPrivate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__1"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__1__Impl"
+    // InternalFormalML.g:43326:1: rule__SignalPrivate__Group__1__Impl : ( ( rule__SignalPrivate__DirectionAssignment_1 )? ) ;
+    public final void rule__SignalPrivate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43330:1: ( ( ( rule__SignalPrivate__DirectionAssignment_1 )? ) )
+            // InternalFormalML.g:43331:1: ( ( rule__SignalPrivate__DirectionAssignment_1 )? )
+            {
+            // InternalFormalML.g:43331:1: ( ( rule__SignalPrivate__DirectionAssignment_1 )? )
+            // InternalFormalML.g:43332:2: ( rule__SignalPrivate__DirectionAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getDirectionAssignment_1()); 
+            }
+            // InternalFormalML.g:43333:2: ( rule__SignalPrivate__DirectionAssignment_1 )?
+            int alt587=2;
+            int LA587_0 = input.LA(1);
+
+            if ( (LA587_0==173||(LA587_0>=175 && LA587_0<=176)) ) {
+                alt587=1;
+            }
+            switch (alt587) {
+                case 1 :
+                    // InternalFormalML.g:43333:3: rule__SignalPrivate__DirectionAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalPrivate__DirectionAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getDirectionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__2"
+    // InternalFormalML.g:43341:1: rule__SignalPrivate__Group__2 : rule__SignalPrivate__Group__2__Impl rule__SignalPrivate__Group__3 ;
+    public final void rule__SignalPrivate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43345:1: ( rule__SignalPrivate__Group__2__Impl rule__SignalPrivate__Group__3 )
+            // InternalFormalML.g:43346:2: rule__SignalPrivate__Group__2__Impl rule__SignalPrivate__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__SignalPrivate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__2"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__2__Impl"
+    // InternalFormalML.g:43353:1: rule__SignalPrivate__Group__2__Impl : ( ( rule__SignalPrivate__NameAssignment_2 ) ) ;
+    public final void rule__SignalPrivate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43357:1: ( ( ( rule__SignalPrivate__NameAssignment_2 ) ) )
+            // InternalFormalML.g:43358:1: ( ( rule__SignalPrivate__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:43358:1: ( ( rule__SignalPrivate__NameAssignment_2 ) )
+            // InternalFormalML.g:43359:2: ( rule__SignalPrivate__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:43360:2: ( rule__SignalPrivate__NameAssignment_2 )
+            // InternalFormalML.g:43360:3: rule__SignalPrivate__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__3"
+    // InternalFormalML.g:43368:1: rule__SignalPrivate__Group__3 : rule__SignalPrivate__Group__3__Impl rule__SignalPrivate__Group__4 ;
+    public final void rule__SignalPrivate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43372:1: ( rule__SignalPrivate__Group__3__Impl rule__SignalPrivate__Group__4 )
+            // InternalFormalML.g:43373:2: rule__SignalPrivate__Group__3__Impl rule__SignalPrivate__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__SignalPrivate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__3"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__3__Impl"
+    // InternalFormalML.g:43380:1: rule__SignalPrivate__Group__3__Impl : ( ( rule__SignalPrivate__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__SignalPrivate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43384:1: ( ( ( rule__SignalPrivate__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:43385:1: ( ( rule__SignalPrivate__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:43385:1: ( ( rule__SignalPrivate__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:43386:2: ( rule__SignalPrivate__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:43387:2: ( rule__SignalPrivate__UnrestrictedNameAssignment_3 )?
+            int alt588=2;
+            int LA588_0 = input.LA(1);
+
+            if ( (LA588_0==RULE_STRING) ) {
+                alt588=1;
+            }
+            switch (alt588) {
+                case 1 :
+                    // InternalFormalML.g:43387:3: rule__SignalPrivate__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalPrivate__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__4"
+    // InternalFormalML.g:43395:1: rule__SignalPrivate__Group__4 : rule__SignalPrivate__Group__4__Impl rule__SignalPrivate__Group__5 ;
+    public final void rule__SignalPrivate__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43399:1: ( rule__SignalPrivate__Group__4__Impl rule__SignalPrivate__Group__5 )
+            // InternalFormalML.g:43400:2: rule__SignalPrivate__Group__4__Impl rule__SignalPrivate__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_182);
+            rule__SignalPrivate__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__4"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__4__Impl"
+    // InternalFormalML.g:43407:1: rule__SignalPrivate__Group__4__Impl : ( ( rule__SignalPrivate__Group_4__0 )? ) ;
+    public final void rule__SignalPrivate__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43411:1: ( ( ( rule__SignalPrivate__Group_4__0 )? ) )
+            // InternalFormalML.g:43412:1: ( ( rule__SignalPrivate__Group_4__0 )? )
+            {
+            // InternalFormalML.g:43412:1: ( ( rule__SignalPrivate__Group_4__0 )? )
+            // InternalFormalML.g:43413:2: ( rule__SignalPrivate__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:43414:2: ( rule__SignalPrivate__Group_4__0 )?
+            int alt589=2;
+            int LA589_0 = input.LA(1);
+
+            if ( (LA589_0==23) ) {
+                alt589=1;
+            }
+            switch (alt589) {
+                case 1 :
+                    // InternalFormalML.g:43414:3: rule__SignalPrivate__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalPrivate__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__4__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__5"
+    // InternalFormalML.g:43422:1: rule__SignalPrivate__Group__5 : rule__SignalPrivate__Group__5__Impl ;
+    public final void rule__SignalPrivate__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43426:1: ( rule__SignalPrivate__Group__5__Impl )
+            // InternalFormalML.g:43427:2: rule__SignalPrivate__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__5"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group__5__Impl"
+    // InternalFormalML.g:43433:1: rule__SignalPrivate__Group__5__Impl : ( ';' ) ;
+    public final void rule__SignalPrivate__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43437:1: ( ( ';' ) )
+            // InternalFormalML.g:43438:1: ( ';' )
+            {
+            // InternalFormalML.g:43438:1: ( ';' )
+            // InternalFormalML.g:43439:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group__5__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4__0"
+    // InternalFormalML.g:43449:1: rule__SignalPrivate__Group_4__0 : rule__SignalPrivate__Group_4__0__Impl rule__SignalPrivate__Group_4__1 ;
+    public final void rule__SignalPrivate__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43453:1: ( rule__SignalPrivate__Group_4__0__Impl rule__SignalPrivate__Group_4__1 )
+            // InternalFormalML.g:43454:2: rule__SignalPrivate__Group_4__0__Impl rule__SignalPrivate__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__SignalPrivate__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4__0"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4__0__Impl"
+    // InternalFormalML.g:43461:1: rule__SignalPrivate__Group_4__0__Impl : ( '(' ) ;
+    public final void rule__SignalPrivate__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43465:1: ( ( '(' ) )
+            // InternalFormalML.g:43466:1: ( '(' )
+            {
+            // InternalFormalML.g:43466:1: ( '(' )
+            // InternalFormalML.g:43467:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getLeftParenthesisKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4__1"
+    // InternalFormalML.g:43476:1: rule__SignalPrivate__Group_4__1 : rule__SignalPrivate__Group_4__1__Impl rule__SignalPrivate__Group_4__2 ;
+    public final void rule__SignalPrivate__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43480:1: ( rule__SignalPrivate__Group_4__1__Impl rule__SignalPrivate__Group_4__2 )
+            // InternalFormalML.g:43481:2: rule__SignalPrivate__Group_4__1__Impl rule__SignalPrivate__Group_4__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__SignalPrivate__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4__1"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4__1__Impl"
+    // InternalFormalML.g:43488:1: rule__SignalPrivate__Group_4__1__Impl : ( ( rule__SignalPrivate__ParameterAssignment_4_1 ) ) ;
+    public final void rule__SignalPrivate__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43492:1: ( ( ( rule__SignalPrivate__ParameterAssignment_4_1 ) ) )
+            // InternalFormalML.g:43493:1: ( ( rule__SignalPrivate__ParameterAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:43493:1: ( ( rule__SignalPrivate__ParameterAssignment_4_1 ) )
+            // InternalFormalML.g:43494:2: ( rule__SignalPrivate__ParameterAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_1()); 
+            }
+            // InternalFormalML.g:43495:2: ( rule__SignalPrivate__ParameterAssignment_4_1 )
+            // InternalFormalML.g:43495:3: rule__SignalPrivate__ParameterAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__ParameterAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4__2"
+    // InternalFormalML.g:43503:1: rule__SignalPrivate__Group_4__2 : rule__SignalPrivate__Group_4__2__Impl rule__SignalPrivate__Group_4__3 ;
+    public final void rule__SignalPrivate__Group_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43507:1: ( rule__SignalPrivate__Group_4__2__Impl rule__SignalPrivate__Group_4__3 )
+            // InternalFormalML.g:43508:2: rule__SignalPrivate__Group_4__2__Impl rule__SignalPrivate__Group_4__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__SignalPrivate__Group_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group_4__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4__2"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4__2__Impl"
+    // InternalFormalML.g:43515:1: rule__SignalPrivate__Group_4__2__Impl : ( ( rule__SignalPrivate__Group_4_2__0 )* ) ;
+    public final void rule__SignalPrivate__Group_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43519:1: ( ( ( rule__SignalPrivate__Group_4_2__0 )* ) )
+            // InternalFormalML.g:43520:1: ( ( rule__SignalPrivate__Group_4_2__0 )* )
+            {
+            // InternalFormalML.g:43520:1: ( ( rule__SignalPrivate__Group_4_2__0 )* )
+            // InternalFormalML.g:43521:2: ( rule__SignalPrivate__Group_4_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getGroup_4_2()); 
+            }
+            // InternalFormalML.g:43522:2: ( rule__SignalPrivate__Group_4_2__0 )*
+            loop590:
+            do {
+                int alt590=2;
+                int LA590_0 = input.LA(1);
+
+                if ( (LA590_0==198) ) {
+                    alt590=1;
+                }
+
+
+                switch (alt590) {
+            	case 1 :
+            	    // InternalFormalML.g:43522:3: rule__SignalPrivate__Group_4_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__SignalPrivate__Group_4_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop590;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getGroup_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4__2__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4__3"
+    // InternalFormalML.g:43530:1: rule__SignalPrivate__Group_4__3 : rule__SignalPrivate__Group_4__3__Impl ;
+    public final void rule__SignalPrivate__Group_4__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43534:1: ( rule__SignalPrivate__Group_4__3__Impl )
+            // InternalFormalML.g:43535:2: rule__SignalPrivate__Group_4__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group_4__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4__3"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4__3__Impl"
+    // InternalFormalML.g:43541:1: rule__SignalPrivate__Group_4__3__Impl : ( ')' ) ;
+    public final void rule__SignalPrivate__Group_4__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43545:1: ( ( ')' ) )
+            // InternalFormalML.g:43546:1: ( ')' )
+            {
+            // InternalFormalML.g:43546:1: ( ')' )
+            // InternalFormalML.g:43547:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getRightParenthesisKeyword_4_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getRightParenthesisKeyword_4_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4__3__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4_2__0"
+    // InternalFormalML.g:43557:1: rule__SignalPrivate__Group_4_2__0 : rule__SignalPrivate__Group_4_2__0__Impl rule__SignalPrivate__Group_4_2__1 ;
+    public final void rule__SignalPrivate__Group_4_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43561:1: ( rule__SignalPrivate__Group_4_2__0__Impl rule__SignalPrivate__Group_4_2__1 )
+            // InternalFormalML.g:43562:2: rule__SignalPrivate__Group_4_2__0__Impl rule__SignalPrivate__Group_4_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__SignalPrivate__Group_4_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group_4_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4_2__0"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4_2__0__Impl"
+    // InternalFormalML.g:43569:1: rule__SignalPrivate__Group_4_2__0__Impl : ( ',' ) ;
+    public final void rule__SignalPrivate__Group_4_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43573:1: ( ( ',' ) )
+            // InternalFormalML.g:43574:1: ( ',' )
+            {
+            // InternalFormalML.g:43574:1: ( ',' )
+            // InternalFormalML.g:43575:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getCommaKeyword_4_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getCommaKeyword_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4_2__0__Impl"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4_2__1"
+    // InternalFormalML.g:43584:1: rule__SignalPrivate__Group_4_2__1 : rule__SignalPrivate__Group_4_2__1__Impl ;
+    public final void rule__SignalPrivate__Group_4_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43588:1: ( rule__SignalPrivate__Group_4_2__1__Impl )
+            // InternalFormalML.g:43589:2: rule__SignalPrivate__Group_4_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__Group_4_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4_2__1"
+
+
+    // $ANTLR start "rule__SignalPrivate__Group_4_2__1__Impl"
+    // InternalFormalML.g:43595:1: rule__SignalPrivate__Group_4_2__1__Impl : ( ( rule__SignalPrivate__ParameterAssignment_4_2_1 ) ) ;
+    public final void rule__SignalPrivate__Group_4_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43599:1: ( ( ( rule__SignalPrivate__ParameterAssignment_4_2_1 ) ) )
+            // InternalFormalML.g:43600:1: ( ( rule__SignalPrivate__ParameterAssignment_4_2_1 ) )
+            {
+            // InternalFormalML.g:43600:1: ( ( rule__SignalPrivate__ParameterAssignment_4_2_1 ) )
+            // InternalFormalML.g:43601:2: ( rule__SignalPrivate__ParameterAssignment_4_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_2_1()); 
+            }
+            // InternalFormalML.g:43602:2: ( rule__SignalPrivate__ParameterAssignment_4_2_1 )
+            // InternalFormalML.g:43602:3: rule__SignalPrivate__ParameterAssignment_4_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalPrivate__ParameterAssignment_4_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getParameterAssignment_4_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__Group_4_2__1__Impl"
+
+
+    // $ANTLR start "rule__Channel__Group__0"
+    // InternalFormalML.g:43611:1: rule__Channel__Group__0 : rule__Channel__Group__0__Impl rule__Channel__Group__1 ;
+    public final void rule__Channel__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43615:1: ( rule__Channel__Group__0__Impl rule__Channel__Group__1 )
+            // InternalFormalML.g:43616:2: rule__Channel__Group__0__Impl rule__Channel__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_184);
+            rule__Channel__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__0"
+
+
+    // $ANTLR start "rule__Channel__Group__0__Impl"
+    // InternalFormalML.g:43623:1: rule__Channel__Group__0__Impl : ( ( rule__Channel__VisibilityAssignment_0 )? ) ;
+    public final void rule__Channel__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43627:1: ( ( ( rule__Channel__VisibilityAssignment_0 )? ) )
+            // InternalFormalML.g:43628:1: ( ( rule__Channel__VisibilityAssignment_0 )? )
+            {
+            // InternalFormalML.g:43628:1: ( ( rule__Channel__VisibilityAssignment_0 )? )
+            // InternalFormalML.g:43629:2: ( rule__Channel__VisibilityAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:43630:2: ( rule__Channel__VisibilityAssignment_0 )?
+            int alt591=2;
+            int LA591_0 = input.LA(1);
+
+            if ( (LA591_0==28||(LA591_0>=143 && LA591_0<=145)) ) {
+                alt591=1;
+            }
+            switch (alt591) {
+                case 1 :
+                    // InternalFormalML.g:43630:3: rule__Channel__VisibilityAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Channel__VisibilityAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Channel__Group__1"
+    // InternalFormalML.g:43638:1: rule__Channel__Group__1 : rule__Channel__Group__1__Impl rule__Channel__Group__2 ;
+    public final void rule__Channel__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43642:1: ( rule__Channel__Group__1__Impl rule__Channel__Group__2 )
+            // InternalFormalML.g:43643:2: rule__Channel__Group__1__Impl rule__Channel__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__Channel__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__1"
+
+
+    // $ANTLR start "rule__Channel__Group__1__Impl"
+    // InternalFormalML.g:43650:1: rule__Channel__Group__1__Impl : ( 'channel' ) ;
+    public final void rule__Channel__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43654:1: ( ( 'channel' ) )
+            // InternalFormalML.g:43655:1: ( 'channel' )
+            {
+            // InternalFormalML.g:43655:1: ( 'channel' )
+            // InternalFormalML.g:43656:2: 'channel'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getChannelKeyword_1()); 
+            }
+            match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getChannelKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Channel__Group__2"
+    // InternalFormalML.g:43665:1: rule__Channel__Group__2 : rule__Channel__Group__2__Impl rule__Channel__Group__3 ;
+    public final void rule__Channel__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43669:1: ( rule__Channel__Group__2__Impl rule__Channel__Group__3 )
+            // InternalFormalML.g:43670:2: rule__Channel__Group__2__Impl rule__Channel__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__Channel__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__2"
+
+
+    // $ANTLR start "rule__Channel__Group__2__Impl"
+    // InternalFormalML.g:43677:1: rule__Channel__Group__2__Impl : ( ( rule__Channel__NameAssignment_2 ) ) ;
+    public final void rule__Channel__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43681:1: ( ( ( rule__Channel__NameAssignment_2 ) ) )
+            // InternalFormalML.g:43682:1: ( ( rule__Channel__NameAssignment_2 ) )
+            {
+            // InternalFormalML.g:43682:1: ( ( rule__Channel__NameAssignment_2 ) )
+            // InternalFormalML.g:43683:2: ( rule__Channel__NameAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getNameAssignment_2()); 
+            }
+            // InternalFormalML.g:43684:2: ( rule__Channel__NameAssignment_2 )
+            // InternalFormalML.g:43684:3: rule__Channel__NameAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__NameAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Channel__Group__3"
+    // InternalFormalML.g:43692:1: rule__Channel__Group__3 : rule__Channel__Group__3__Impl rule__Channel__Group__4 ;
+    public final void rule__Channel__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43696:1: ( rule__Channel__Group__3__Impl rule__Channel__Group__4 )
+            // InternalFormalML.g:43697:2: rule__Channel__Group__3__Impl rule__Channel__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__Channel__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__3"
+
+
+    // $ANTLR start "rule__Channel__Group__3__Impl"
+    // InternalFormalML.g:43704:1: rule__Channel__Group__3__Impl : ( ( rule__Channel__UnrestrictedNameAssignment_3 )? ) ;
+    public final void rule__Channel__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43708:1: ( ( ( rule__Channel__UnrestrictedNameAssignment_3 )? ) )
+            // InternalFormalML.g:43709:1: ( ( rule__Channel__UnrestrictedNameAssignment_3 )? )
+            {
+            // InternalFormalML.g:43709:1: ( ( rule__Channel__UnrestrictedNameAssignment_3 )? )
+            // InternalFormalML.g:43710:2: ( rule__Channel__UnrestrictedNameAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getUnrestrictedNameAssignment_3()); 
+            }
+            // InternalFormalML.g:43711:2: ( rule__Channel__UnrestrictedNameAssignment_3 )?
+            int alt592=2;
+            int LA592_0 = input.LA(1);
+
+            if ( (LA592_0==RULE_STRING) ) {
+                alt592=1;
+            }
+            switch (alt592) {
+                case 1 :
+                    // InternalFormalML.g:43711:3: rule__Channel__UnrestrictedNameAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Channel__UnrestrictedNameAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getUnrestrictedNameAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Channel__Group__4"
+    // InternalFormalML.g:43719:1: rule__Channel__Group__4 : rule__Channel__Group__4__Impl rule__Channel__Group__5 ;
+    public final void rule__Channel__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43723:1: ( rule__Channel__Group__4__Impl rule__Channel__Group__5 )
+            // InternalFormalML.g:43724:2: rule__Channel__Group__4__Impl rule__Channel__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__Channel__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__4"
+
+
+    // $ANTLR start "rule__Channel__Group__4__Impl"
+    // InternalFormalML.g:43731:1: rule__Channel__Group__4__Impl : ( '{' ) ;
+    public final void rule__Channel__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43735:1: ( ( '{' ) )
+            // InternalFormalML.g:43736:1: ( '{' )
+            {
+            // InternalFormalML.g:43736:1: ( '{' )
+            // InternalFormalML.g:43737:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Channel__Group__5"
+    // InternalFormalML.g:43746:1: rule__Channel__Group__5 : rule__Channel__Group__5__Impl rule__Channel__Group__6 ;
+    public final void rule__Channel__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43750:1: ( rule__Channel__Group__5__Impl rule__Channel__Group__6 )
+            // InternalFormalML.g:43751:2: rule__Channel__Group__5__Impl rule__Channel__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__Channel__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__5"
+
+
+    // $ANTLR start "rule__Channel__Group__5__Impl"
+    // InternalFormalML.g:43758:1: rule__Channel__Group__5__Impl : ( ( ( rule__Channel__Group_5__0 ) ) ( ( rule__Channel__Group_5__0 )* ) ) ;
+    public final void rule__Channel__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43762:1: ( ( ( ( rule__Channel__Group_5__0 ) ) ( ( rule__Channel__Group_5__0 )* ) ) )
+            // InternalFormalML.g:43763:1: ( ( ( rule__Channel__Group_5__0 ) ) ( ( rule__Channel__Group_5__0 )* ) )
+            {
+            // InternalFormalML.g:43763:1: ( ( ( rule__Channel__Group_5__0 ) ) ( ( rule__Channel__Group_5__0 )* ) )
+            // InternalFormalML.g:43764:2: ( ( rule__Channel__Group_5__0 ) ) ( ( rule__Channel__Group_5__0 )* )
+            {
+            // InternalFormalML.g:43764:2: ( ( rule__Channel__Group_5__0 ) )
+            // InternalFormalML.g:43765:3: ( rule__Channel__Group_5__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getGroup_5()); 
+            }
+            // InternalFormalML.g:43766:3: ( rule__Channel__Group_5__0 )
+            // InternalFormalML.g:43766:4: rule__Channel__Group_5__0
+            {
+            pushFollow(FollowSets000.FOLLOW_185);
+            rule__Channel__Group_5__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getGroup_5()); 
+            }
+
+            }
+
+            // InternalFormalML.g:43769:2: ( ( rule__Channel__Group_5__0 )* )
+            // InternalFormalML.g:43770:3: ( rule__Channel__Group_5__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getGroup_5()); 
+            }
+            // InternalFormalML.g:43771:3: ( rule__Channel__Group_5__0 )*
+            loop593:
+            do {
+                int alt593=2;
+                int LA593_0 = input.LA(1);
+
+                if ( (LA593_0==RULE_XLIA_ID||LA593_0==173||(LA593_0>=175 && LA593_0<=176)) ) {
+                    alt593=1;
+                }
+
+
+                switch (alt593) {
+            	case 1 :
+            	    // InternalFormalML.g:43771:4: rule__Channel__Group_5__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_185);
+            	    rule__Channel__Group_5__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop593;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getGroup_5()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Channel__Group__6"
+    // InternalFormalML.g:43780:1: rule__Channel__Group__6 : rule__Channel__Group__6__Impl ;
+    public final void rule__Channel__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43784:1: ( rule__Channel__Group__6__Impl )
+            // InternalFormalML.g:43785:2: rule__Channel__Group__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__6"
+
+
+    // $ANTLR start "rule__Channel__Group__6__Impl"
+    // InternalFormalML.g:43791:1: rule__Channel__Group__6__Impl : ( '}' ) ;
+    public final void rule__Channel__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43795:1: ( ( '}' ) )
+            // InternalFormalML.g:43796:1: ( '}' )
+            {
+            // InternalFormalML.g:43796:1: ( '}' )
+            // InternalFormalML.g:43797:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getRightCurlyBracketKeyword_6()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getRightCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Channel__Group_5__0"
+    // InternalFormalML.g:43807:1: rule__Channel__Group_5__0 : rule__Channel__Group_5__0__Impl rule__Channel__Group_5__1 ;
+    public final void rule__Channel__Group_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43811:1: ( rule__Channel__Group_5__0__Impl rule__Channel__Group_5__1 )
+            // InternalFormalML.g:43812:2: rule__Channel__Group_5__0__Impl rule__Channel__Group_5__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__Channel__Group_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group_5__0"
+
+
+    // $ANTLR start "rule__Channel__Group_5__0__Impl"
+    // InternalFormalML.g:43819:1: rule__Channel__Group_5__0__Impl : ( ( rule__Channel__SignalAssignment_5_0 ) ) ;
+    public final void rule__Channel__Group_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43823:1: ( ( ( rule__Channel__SignalAssignment_5_0 ) ) )
+            // InternalFormalML.g:43824:1: ( ( rule__Channel__SignalAssignment_5_0 ) )
+            {
+            // InternalFormalML.g:43824:1: ( ( rule__Channel__SignalAssignment_5_0 ) )
+            // InternalFormalML.g:43825:2: ( rule__Channel__SignalAssignment_5_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getSignalAssignment_5_0()); 
+            }
+            // InternalFormalML.g:43826:2: ( rule__Channel__SignalAssignment_5_0 )
+            // InternalFormalML.g:43826:3: rule__Channel__SignalAssignment_5_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__SignalAssignment_5_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getSignalAssignment_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group_5__0__Impl"
+
+
+    // $ANTLR start "rule__Channel__Group_5__1"
+    // InternalFormalML.g:43834:1: rule__Channel__Group_5__1 : rule__Channel__Group_5__1__Impl ;
+    public final void rule__Channel__Group_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43838:1: ( rule__Channel__Group_5__1__Impl )
+            // InternalFormalML.g:43839:2: rule__Channel__Group_5__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Channel__Group_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group_5__1"
+
+
+    // $ANTLR start "rule__Channel__Group_5__1__Impl"
+    // InternalFormalML.g:43845:1: rule__Channel__Group_5__1__Impl : ( ';' ) ;
+    public final void rule__Channel__Group_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43849:1: ( ( ';' ) )
+            // InternalFormalML.g:43850:1: ( ';' )
+            {
+            // InternalFormalML.g:43850:1: ( ';' )
+            // InternalFormalML.g:43851:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getSemicolonKeyword_5_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getSemicolonKeyword_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__Group_5__1__Impl"
+
+
+    // $ANTLR start "rule__SignalReference__Group__0"
+    // InternalFormalML.g:43861:1: rule__SignalReference__Group__0 : rule__SignalReference__Group__0__Impl rule__SignalReference__Group__1 ;
+    public final void rule__SignalReference__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43865:1: ( rule__SignalReference__Group__0__Impl rule__SignalReference__Group__1 )
+            // InternalFormalML.g:43866:2: rule__SignalReference__Group__0__Impl rule__SignalReference__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__SignalReference__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalReference__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalReference__Group__0"
+
+
+    // $ANTLR start "rule__SignalReference__Group__0__Impl"
+    // InternalFormalML.g:43873:1: rule__SignalReference__Group__0__Impl : ( ( rule__SignalReference__DirectionAssignment_0 )? ) ;
+    public final void rule__SignalReference__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43877:1: ( ( ( rule__SignalReference__DirectionAssignment_0 )? ) )
+            // InternalFormalML.g:43878:1: ( ( rule__SignalReference__DirectionAssignment_0 )? )
+            {
+            // InternalFormalML.g:43878:1: ( ( rule__SignalReference__DirectionAssignment_0 )? )
+            // InternalFormalML.g:43879:2: ( rule__SignalReference__DirectionAssignment_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalReferenceAccess().getDirectionAssignment_0()); 
+            }
+            // InternalFormalML.g:43880:2: ( rule__SignalReference__DirectionAssignment_0 )?
+            int alt594=2;
+            int LA594_0 = input.LA(1);
+
+            if ( (LA594_0==173||(LA594_0>=175 && LA594_0<=176)) ) {
+                alt594=1;
+            }
+            switch (alt594) {
+                case 1 :
+                    // InternalFormalML.g:43880:3: rule__SignalReference__DirectionAssignment_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__SignalReference__DirectionAssignment_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalReferenceAccess().getDirectionAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalReference__Group__0__Impl"
+
+
+    // $ANTLR start "rule__SignalReference__Group__1"
+    // InternalFormalML.g:43888:1: rule__SignalReference__Group__1 : rule__SignalReference__Group__1__Impl ;
+    public final void rule__SignalReference__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43892:1: ( rule__SignalReference__Group__1__Impl )
+            // InternalFormalML.g:43893:2: rule__SignalReference__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalReference__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalReference__Group__1"
+
+
+    // $ANTLR start "rule__SignalReference__Group__1__Impl"
+    // InternalFormalML.g:43899:1: rule__SignalReference__Group__1__Impl : ( ( rule__SignalReference__NameAssignment_1 ) ) ;
+    public final void rule__SignalReference__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43903:1: ( ( ( rule__SignalReference__NameAssignment_1 ) ) )
+            // InternalFormalML.g:43904:1: ( ( rule__SignalReference__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:43904:1: ( ( rule__SignalReference__NameAssignment_1 ) )
+            // InternalFormalML.g:43905:2: ( rule__SignalReference__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalReferenceAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:43906:2: ( rule__SignalReference__NameAssignment_1 )
+            // InternalFormalML.g:43906:3: rule__SignalReference__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__SignalReference__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalReferenceAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalReference__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__0"
+    // InternalFormalML.g:43915:1: rule__ChannelPublic__Group__0 : rule__ChannelPublic__Group__0__Impl rule__ChannelPublic__Group__1 ;
+    public final void rule__ChannelPublic__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43919:1: ( rule__ChannelPublic__Group__0__Impl rule__ChannelPublic__Group__1 )
+            // InternalFormalML.g:43920:2: rule__ChannelPublic__Group__0__Impl rule__ChannelPublic__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ChannelPublic__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__0"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__0__Impl"
+    // InternalFormalML.g:43927:1: rule__ChannelPublic__Group__0__Impl : ( ( rule__ChannelPublic__VisibilityAssignment_0 ) ) ;
+    public final void rule__ChannelPublic__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43931:1: ( ( ( rule__ChannelPublic__VisibilityAssignment_0 ) ) )
+            // InternalFormalML.g:43932:1: ( ( rule__ChannelPublic__VisibilityAssignment_0 ) )
+            {
+            // InternalFormalML.g:43932:1: ( ( rule__ChannelPublic__VisibilityAssignment_0 ) )
+            // InternalFormalML.g:43933:2: ( rule__ChannelPublic__VisibilityAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:43934:2: ( rule__ChannelPublic__VisibilityAssignment_0 )
+            // InternalFormalML.g:43934:3: rule__ChannelPublic__VisibilityAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__VisibilityAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__1"
+    // InternalFormalML.g:43942:1: rule__ChannelPublic__Group__1 : rule__ChannelPublic__Group__1__Impl rule__ChannelPublic__Group__2 ;
+    public final void rule__ChannelPublic__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43946:1: ( rule__ChannelPublic__Group__1__Impl rule__ChannelPublic__Group__2 )
+            // InternalFormalML.g:43947:2: rule__ChannelPublic__Group__1__Impl rule__ChannelPublic__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__ChannelPublic__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__1"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__1__Impl"
+    // InternalFormalML.g:43954:1: rule__ChannelPublic__Group__1__Impl : ( ( rule__ChannelPublic__NameAssignment_1 ) ) ;
+    public final void rule__ChannelPublic__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43958:1: ( ( ( rule__ChannelPublic__NameAssignment_1 ) ) )
+            // InternalFormalML.g:43959:1: ( ( rule__ChannelPublic__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:43959:1: ( ( rule__ChannelPublic__NameAssignment_1 ) )
+            // InternalFormalML.g:43960:2: ( rule__ChannelPublic__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:43961:2: ( rule__ChannelPublic__NameAssignment_1 )
+            // InternalFormalML.g:43961:3: rule__ChannelPublic__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__2"
+    // InternalFormalML.g:43969:1: rule__ChannelPublic__Group__2 : rule__ChannelPublic__Group__2__Impl rule__ChannelPublic__Group__3 ;
+    public final void rule__ChannelPublic__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43973:1: ( rule__ChannelPublic__Group__2__Impl rule__ChannelPublic__Group__3 )
+            // InternalFormalML.g:43974:2: rule__ChannelPublic__Group__2__Impl rule__ChannelPublic__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__ChannelPublic__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__2"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__2__Impl"
+    // InternalFormalML.g:43981:1: rule__ChannelPublic__Group__2__Impl : ( ( rule__ChannelPublic__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__ChannelPublic__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:43985:1: ( ( ( rule__ChannelPublic__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:43986:1: ( ( rule__ChannelPublic__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:43986:1: ( ( rule__ChannelPublic__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:43987:2: ( rule__ChannelPublic__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:43988:2: ( rule__ChannelPublic__UnrestrictedNameAssignment_2 )?
+            int alt595=2;
+            int LA595_0 = input.LA(1);
+
+            if ( (LA595_0==RULE_STRING) ) {
+                alt595=1;
+            }
+            switch (alt595) {
+                case 1 :
+                    // InternalFormalML.g:43988:3: rule__ChannelPublic__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ChannelPublic__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__3"
+    // InternalFormalML.g:43996:1: rule__ChannelPublic__Group__3 : rule__ChannelPublic__Group__3__Impl rule__ChannelPublic__Group__4 ;
+    public final void rule__ChannelPublic__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44000:1: ( rule__ChannelPublic__Group__3__Impl rule__ChannelPublic__Group__4 )
+            // InternalFormalML.g:44001:2: rule__ChannelPublic__Group__3__Impl rule__ChannelPublic__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__ChannelPublic__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__3"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__3__Impl"
+    // InternalFormalML.g:44008:1: rule__ChannelPublic__Group__3__Impl : ( '{' ) ;
+    public final void rule__ChannelPublic__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44012:1: ( ( '{' ) )
+            // InternalFormalML.g:44013:1: ( '{' )
+            {
+            // InternalFormalML.g:44013:1: ( '{' )
+            // InternalFormalML.g:44014:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__4"
+    // InternalFormalML.g:44023:1: rule__ChannelPublic__Group__4 : rule__ChannelPublic__Group__4__Impl rule__ChannelPublic__Group__5 ;
+    public final void rule__ChannelPublic__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44027:1: ( rule__ChannelPublic__Group__4__Impl rule__ChannelPublic__Group__5 )
+            // InternalFormalML.g:44028:2: rule__ChannelPublic__Group__4__Impl rule__ChannelPublic__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__ChannelPublic__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__4"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__4__Impl"
+    // InternalFormalML.g:44035:1: rule__ChannelPublic__Group__4__Impl : ( ( ( rule__ChannelPublic__Group_4__0 ) ) ( ( rule__ChannelPublic__Group_4__0 )* ) ) ;
+    public final void rule__ChannelPublic__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44039:1: ( ( ( ( rule__ChannelPublic__Group_4__0 ) ) ( ( rule__ChannelPublic__Group_4__0 )* ) ) )
+            // InternalFormalML.g:44040:1: ( ( ( rule__ChannelPublic__Group_4__0 ) ) ( ( rule__ChannelPublic__Group_4__0 )* ) )
+            {
+            // InternalFormalML.g:44040:1: ( ( ( rule__ChannelPublic__Group_4__0 ) ) ( ( rule__ChannelPublic__Group_4__0 )* ) )
+            // InternalFormalML.g:44041:2: ( ( rule__ChannelPublic__Group_4__0 ) ) ( ( rule__ChannelPublic__Group_4__0 )* )
+            {
+            // InternalFormalML.g:44041:2: ( ( rule__ChannelPublic__Group_4__0 ) )
+            // InternalFormalML.g:44042:3: ( rule__ChannelPublic__Group_4__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:44043:3: ( rule__ChannelPublic__Group_4__0 )
+            // InternalFormalML.g:44043:4: rule__ChannelPublic__Group_4__0
+            {
+            pushFollow(FollowSets000.FOLLOW_185);
+            rule__ChannelPublic__Group_4__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getGroup_4()); 
+            }
+
+            }
+
+            // InternalFormalML.g:44046:2: ( ( rule__ChannelPublic__Group_4__0 )* )
+            // InternalFormalML.g:44047:3: ( rule__ChannelPublic__Group_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:44048:3: ( rule__ChannelPublic__Group_4__0 )*
+            loop596:
+            do {
+                int alt596=2;
+                int LA596_0 = input.LA(1);
+
+                if ( (LA596_0==RULE_XLIA_ID||LA596_0==173||(LA596_0>=175 && LA596_0<=176)) ) {
+                    alt596=1;
+                }
+
+
+                switch (alt596) {
+            	case 1 :
+            	    // InternalFormalML.g:44048:4: rule__ChannelPublic__Group_4__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_185);
+            	    rule__ChannelPublic__Group_4__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop596;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__5"
+    // InternalFormalML.g:44057:1: rule__ChannelPublic__Group__5 : rule__ChannelPublic__Group__5__Impl ;
+    public final void rule__ChannelPublic__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44061:1: ( rule__ChannelPublic__Group__5__Impl )
+            // InternalFormalML.g:44062:2: rule__ChannelPublic__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__5"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group__5__Impl"
+    // InternalFormalML.g:44068:1: rule__ChannelPublic__Group__5__Impl : ( '}' ) ;
+    public final void rule__ChannelPublic__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44072:1: ( ( '}' ) )
+            // InternalFormalML.g:44073:1: ( '}' )
+            {
+            // InternalFormalML.g:44073:1: ( '}' )
+            // InternalFormalML.g:44074:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getRightCurlyBracketKeyword_5()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getRightCurlyBracketKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group__5__Impl"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group_4__0"
+    // InternalFormalML.g:44084:1: rule__ChannelPublic__Group_4__0 : rule__ChannelPublic__Group_4__0__Impl rule__ChannelPublic__Group_4__1 ;
+    public final void rule__ChannelPublic__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44088:1: ( rule__ChannelPublic__Group_4__0__Impl rule__ChannelPublic__Group_4__1 )
+            // InternalFormalML.g:44089:2: rule__ChannelPublic__Group_4__0__Impl rule__ChannelPublic__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ChannelPublic__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group_4__0"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group_4__0__Impl"
+    // InternalFormalML.g:44096:1: rule__ChannelPublic__Group_4__0__Impl : ( ( rule__ChannelPublic__SignalAssignment_4_0 ) ) ;
+    public final void rule__ChannelPublic__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44100:1: ( ( ( rule__ChannelPublic__SignalAssignment_4_0 ) ) )
+            // InternalFormalML.g:44101:1: ( ( rule__ChannelPublic__SignalAssignment_4_0 ) )
+            {
+            // InternalFormalML.g:44101:1: ( ( rule__ChannelPublic__SignalAssignment_4_0 ) )
+            // InternalFormalML.g:44102:2: ( rule__ChannelPublic__SignalAssignment_4_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getSignalAssignment_4_0()); 
+            }
+            // InternalFormalML.g:44103:2: ( rule__ChannelPublic__SignalAssignment_4_0 )
+            // InternalFormalML.g:44103:3: rule__ChannelPublic__SignalAssignment_4_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__SignalAssignment_4_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getSignalAssignment_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group_4__1"
+    // InternalFormalML.g:44111:1: rule__ChannelPublic__Group_4__1 : rule__ChannelPublic__Group_4__1__Impl ;
+    public final void rule__ChannelPublic__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44115:1: ( rule__ChannelPublic__Group_4__1__Impl )
+            // InternalFormalML.g:44116:2: rule__ChannelPublic__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPublic__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group_4__1"
+
+
+    // $ANTLR start "rule__ChannelPublic__Group_4__1__Impl"
+    // InternalFormalML.g:44122:1: rule__ChannelPublic__Group_4__1__Impl : ( ';' ) ;
+    public final void rule__ChannelPublic__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44126:1: ( ( ';' ) )
+            // InternalFormalML.g:44127:1: ( ';' )
+            {
+            // InternalFormalML.g:44127:1: ( ';' )
+            // InternalFormalML.g:44128:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getSemicolonKeyword_4_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getSemicolonKeyword_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__0"
+    // InternalFormalML.g:44138:1: rule__ChannelProtected__Group__0 : rule__ChannelProtected__Group__0__Impl rule__ChannelProtected__Group__1 ;
+    public final void rule__ChannelProtected__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44142:1: ( rule__ChannelProtected__Group__0__Impl rule__ChannelProtected__Group__1 )
+            // InternalFormalML.g:44143:2: rule__ChannelProtected__Group__0__Impl rule__ChannelProtected__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ChannelProtected__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__0"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__0__Impl"
+    // InternalFormalML.g:44150:1: rule__ChannelProtected__Group__0__Impl : ( ( rule__ChannelProtected__VisibilityAssignment_0 ) ) ;
+    public final void rule__ChannelProtected__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44154:1: ( ( ( rule__ChannelProtected__VisibilityAssignment_0 ) ) )
+            // InternalFormalML.g:44155:1: ( ( rule__ChannelProtected__VisibilityAssignment_0 ) )
+            {
+            // InternalFormalML.g:44155:1: ( ( rule__ChannelProtected__VisibilityAssignment_0 ) )
+            // InternalFormalML.g:44156:2: ( rule__ChannelProtected__VisibilityAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:44157:2: ( rule__ChannelProtected__VisibilityAssignment_0 )
+            // InternalFormalML.g:44157:3: rule__ChannelProtected__VisibilityAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__VisibilityAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__1"
+    // InternalFormalML.g:44165:1: rule__ChannelProtected__Group__1 : rule__ChannelProtected__Group__1__Impl rule__ChannelProtected__Group__2 ;
+    public final void rule__ChannelProtected__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44169:1: ( rule__ChannelProtected__Group__1__Impl rule__ChannelProtected__Group__2 )
+            // InternalFormalML.g:44170:2: rule__ChannelProtected__Group__1__Impl rule__ChannelProtected__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__ChannelProtected__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__1"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__1__Impl"
+    // InternalFormalML.g:44177:1: rule__ChannelProtected__Group__1__Impl : ( ( rule__ChannelProtected__NameAssignment_1 ) ) ;
+    public final void rule__ChannelProtected__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44181:1: ( ( ( rule__ChannelProtected__NameAssignment_1 ) ) )
+            // InternalFormalML.g:44182:1: ( ( rule__ChannelProtected__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:44182:1: ( ( rule__ChannelProtected__NameAssignment_1 ) )
+            // InternalFormalML.g:44183:2: ( rule__ChannelProtected__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:44184:2: ( rule__ChannelProtected__NameAssignment_1 )
+            // InternalFormalML.g:44184:3: rule__ChannelProtected__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__2"
+    // InternalFormalML.g:44192:1: rule__ChannelProtected__Group__2 : rule__ChannelProtected__Group__2__Impl rule__ChannelProtected__Group__3 ;
+    public final void rule__ChannelProtected__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44196:1: ( rule__ChannelProtected__Group__2__Impl rule__ChannelProtected__Group__3 )
+            // InternalFormalML.g:44197:2: rule__ChannelProtected__Group__2__Impl rule__ChannelProtected__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__ChannelProtected__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__2"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__2__Impl"
+    // InternalFormalML.g:44204:1: rule__ChannelProtected__Group__2__Impl : ( ( rule__ChannelProtected__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__ChannelProtected__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44208:1: ( ( ( rule__ChannelProtected__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:44209:1: ( ( rule__ChannelProtected__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:44209:1: ( ( rule__ChannelProtected__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:44210:2: ( rule__ChannelProtected__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:44211:2: ( rule__ChannelProtected__UnrestrictedNameAssignment_2 )?
+            int alt597=2;
+            int LA597_0 = input.LA(1);
+
+            if ( (LA597_0==RULE_STRING) ) {
+                alt597=1;
+            }
+            switch (alt597) {
+                case 1 :
+                    // InternalFormalML.g:44211:3: rule__ChannelProtected__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ChannelProtected__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__3"
+    // InternalFormalML.g:44219:1: rule__ChannelProtected__Group__3 : rule__ChannelProtected__Group__3__Impl rule__ChannelProtected__Group__4 ;
+    public final void rule__ChannelProtected__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44223:1: ( rule__ChannelProtected__Group__3__Impl rule__ChannelProtected__Group__4 )
+            // InternalFormalML.g:44224:2: rule__ChannelProtected__Group__3__Impl rule__ChannelProtected__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__ChannelProtected__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__3"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__3__Impl"
+    // InternalFormalML.g:44231:1: rule__ChannelProtected__Group__3__Impl : ( '{' ) ;
+    public final void rule__ChannelProtected__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44235:1: ( ( '{' ) )
+            // InternalFormalML.g:44236:1: ( '{' )
+            {
+            // InternalFormalML.g:44236:1: ( '{' )
+            // InternalFormalML.g:44237:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__4"
+    // InternalFormalML.g:44246:1: rule__ChannelProtected__Group__4 : rule__ChannelProtected__Group__4__Impl rule__ChannelProtected__Group__5 ;
+    public final void rule__ChannelProtected__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44250:1: ( rule__ChannelProtected__Group__4__Impl rule__ChannelProtected__Group__5 )
+            // InternalFormalML.g:44251:2: rule__ChannelProtected__Group__4__Impl rule__ChannelProtected__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__ChannelProtected__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__4"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__4__Impl"
+    // InternalFormalML.g:44258:1: rule__ChannelProtected__Group__4__Impl : ( ( ( rule__ChannelProtected__Group_4__0 ) ) ( ( rule__ChannelProtected__Group_4__0 )* ) ) ;
+    public final void rule__ChannelProtected__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44262:1: ( ( ( ( rule__ChannelProtected__Group_4__0 ) ) ( ( rule__ChannelProtected__Group_4__0 )* ) ) )
+            // InternalFormalML.g:44263:1: ( ( ( rule__ChannelProtected__Group_4__0 ) ) ( ( rule__ChannelProtected__Group_4__0 )* ) )
+            {
+            // InternalFormalML.g:44263:1: ( ( ( rule__ChannelProtected__Group_4__0 ) ) ( ( rule__ChannelProtected__Group_4__0 )* ) )
+            // InternalFormalML.g:44264:2: ( ( rule__ChannelProtected__Group_4__0 ) ) ( ( rule__ChannelProtected__Group_4__0 )* )
+            {
+            // InternalFormalML.g:44264:2: ( ( rule__ChannelProtected__Group_4__0 ) )
+            // InternalFormalML.g:44265:3: ( rule__ChannelProtected__Group_4__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:44266:3: ( rule__ChannelProtected__Group_4__0 )
+            // InternalFormalML.g:44266:4: rule__ChannelProtected__Group_4__0
+            {
+            pushFollow(FollowSets000.FOLLOW_185);
+            rule__ChannelProtected__Group_4__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getGroup_4()); 
+            }
+
+            }
+
+            // InternalFormalML.g:44269:2: ( ( rule__ChannelProtected__Group_4__0 )* )
+            // InternalFormalML.g:44270:3: ( rule__ChannelProtected__Group_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:44271:3: ( rule__ChannelProtected__Group_4__0 )*
+            loop598:
+            do {
+                int alt598=2;
+                int LA598_0 = input.LA(1);
+
+                if ( (LA598_0==RULE_XLIA_ID||LA598_0==173||(LA598_0>=175 && LA598_0<=176)) ) {
+                    alt598=1;
+                }
+
+
+                switch (alt598) {
+            	case 1 :
+            	    // InternalFormalML.g:44271:4: rule__ChannelProtected__Group_4__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_185);
+            	    rule__ChannelProtected__Group_4__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop598;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__5"
+    // InternalFormalML.g:44280:1: rule__ChannelProtected__Group__5 : rule__ChannelProtected__Group__5__Impl ;
+    public final void rule__ChannelProtected__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44284:1: ( rule__ChannelProtected__Group__5__Impl )
+            // InternalFormalML.g:44285:2: rule__ChannelProtected__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__5"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group__5__Impl"
+    // InternalFormalML.g:44291:1: rule__ChannelProtected__Group__5__Impl : ( '}' ) ;
+    public final void rule__ChannelProtected__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44295:1: ( ( '}' ) )
+            // InternalFormalML.g:44296:1: ( '}' )
+            {
+            // InternalFormalML.g:44296:1: ( '}' )
+            // InternalFormalML.g:44297:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getRightCurlyBracketKeyword_5()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getRightCurlyBracketKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group__5__Impl"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group_4__0"
+    // InternalFormalML.g:44307:1: rule__ChannelProtected__Group_4__0 : rule__ChannelProtected__Group_4__0__Impl rule__ChannelProtected__Group_4__1 ;
+    public final void rule__ChannelProtected__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44311:1: ( rule__ChannelProtected__Group_4__0__Impl rule__ChannelProtected__Group_4__1 )
+            // InternalFormalML.g:44312:2: rule__ChannelProtected__Group_4__0__Impl rule__ChannelProtected__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ChannelProtected__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group_4__0"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group_4__0__Impl"
+    // InternalFormalML.g:44319:1: rule__ChannelProtected__Group_4__0__Impl : ( ( rule__ChannelProtected__SignalAssignment_4_0 ) ) ;
+    public final void rule__ChannelProtected__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44323:1: ( ( ( rule__ChannelProtected__SignalAssignment_4_0 ) ) )
+            // InternalFormalML.g:44324:1: ( ( rule__ChannelProtected__SignalAssignment_4_0 ) )
+            {
+            // InternalFormalML.g:44324:1: ( ( rule__ChannelProtected__SignalAssignment_4_0 ) )
+            // InternalFormalML.g:44325:2: ( rule__ChannelProtected__SignalAssignment_4_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getSignalAssignment_4_0()); 
+            }
+            // InternalFormalML.g:44326:2: ( rule__ChannelProtected__SignalAssignment_4_0 )
+            // InternalFormalML.g:44326:3: rule__ChannelProtected__SignalAssignment_4_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__SignalAssignment_4_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getSignalAssignment_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group_4__1"
+    // InternalFormalML.g:44334:1: rule__ChannelProtected__Group_4__1 : rule__ChannelProtected__Group_4__1__Impl ;
+    public final void rule__ChannelProtected__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44338:1: ( rule__ChannelProtected__Group_4__1__Impl )
+            // InternalFormalML.g:44339:2: rule__ChannelProtected__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelProtected__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group_4__1"
+
+
+    // $ANTLR start "rule__ChannelProtected__Group_4__1__Impl"
+    // InternalFormalML.g:44345:1: rule__ChannelProtected__Group_4__1__Impl : ( ';' ) ;
+    public final void rule__ChannelProtected__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44349:1: ( ( ';' ) )
+            // InternalFormalML.g:44350:1: ( ';' )
+            {
+            // InternalFormalML.g:44350:1: ( ';' )
+            // InternalFormalML.g:44351:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getSemicolonKeyword_4_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getSemicolonKeyword_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__0"
+    // InternalFormalML.g:44361:1: rule__ChannelPrivate__Group__0 : rule__ChannelPrivate__Group__0__Impl rule__ChannelPrivate__Group__1 ;
+    public final void rule__ChannelPrivate__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44365:1: ( rule__ChannelPrivate__Group__0__Impl rule__ChannelPrivate__Group__1 )
+            // InternalFormalML.g:44366:2: rule__ChannelPrivate__Group__0__Impl rule__ChannelPrivate__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ChannelPrivate__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__0"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__0__Impl"
+    // InternalFormalML.g:44373:1: rule__ChannelPrivate__Group__0__Impl : ( ( rule__ChannelPrivate__VisibilityAssignment_0 ) ) ;
+    public final void rule__ChannelPrivate__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44377:1: ( ( ( rule__ChannelPrivate__VisibilityAssignment_0 ) ) )
+            // InternalFormalML.g:44378:1: ( ( rule__ChannelPrivate__VisibilityAssignment_0 ) )
+            {
+            // InternalFormalML.g:44378:1: ( ( rule__ChannelPrivate__VisibilityAssignment_0 ) )
+            // InternalFormalML.g:44379:2: ( rule__ChannelPrivate__VisibilityAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getVisibilityAssignment_0()); 
+            }
+            // InternalFormalML.g:44380:2: ( rule__ChannelPrivate__VisibilityAssignment_0 )
+            // InternalFormalML.g:44380:3: rule__ChannelPrivate__VisibilityAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__VisibilityAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getVisibilityAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__1"
+    // InternalFormalML.g:44388:1: rule__ChannelPrivate__Group__1 : rule__ChannelPrivate__Group__1__Impl rule__ChannelPrivate__Group__2 ;
+    public final void rule__ChannelPrivate__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44392:1: ( rule__ChannelPrivate__Group__1__Impl rule__ChannelPrivate__Group__2 )
+            // InternalFormalML.g:44393:2: rule__ChannelPrivate__Group__1__Impl rule__ChannelPrivate__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__ChannelPrivate__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__1"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__1__Impl"
+    // InternalFormalML.g:44400:1: rule__ChannelPrivate__Group__1__Impl : ( ( rule__ChannelPrivate__NameAssignment_1 ) ) ;
+    public final void rule__ChannelPrivate__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44404:1: ( ( ( rule__ChannelPrivate__NameAssignment_1 ) ) )
+            // InternalFormalML.g:44405:1: ( ( rule__ChannelPrivate__NameAssignment_1 ) )
+            {
+            // InternalFormalML.g:44405:1: ( ( rule__ChannelPrivate__NameAssignment_1 ) )
+            // InternalFormalML.g:44406:2: ( rule__ChannelPrivate__NameAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getNameAssignment_1()); 
+            }
+            // InternalFormalML.g:44407:2: ( rule__ChannelPrivate__NameAssignment_1 )
+            // InternalFormalML.g:44407:3: rule__ChannelPrivate__NameAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__NameAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getNameAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__2"
+    // InternalFormalML.g:44415:1: rule__ChannelPrivate__Group__2 : rule__ChannelPrivate__Group__2__Impl rule__ChannelPrivate__Group__3 ;
+    public final void rule__ChannelPrivate__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44419:1: ( rule__ChannelPrivate__Group__2__Impl rule__ChannelPrivate__Group__3 )
+            // InternalFormalML.g:44420:2: rule__ChannelPrivate__Group__2__Impl rule__ChannelPrivate__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_30);
+            rule__ChannelPrivate__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__2"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__2__Impl"
+    // InternalFormalML.g:44427:1: rule__ChannelPrivate__Group__2__Impl : ( ( rule__ChannelPrivate__UnrestrictedNameAssignment_2 )? ) ;
+    public final void rule__ChannelPrivate__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44431:1: ( ( ( rule__ChannelPrivate__UnrestrictedNameAssignment_2 )? ) )
+            // InternalFormalML.g:44432:1: ( ( rule__ChannelPrivate__UnrestrictedNameAssignment_2 )? )
+            {
+            // InternalFormalML.g:44432:1: ( ( rule__ChannelPrivate__UnrestrictedNameAssignment_2 )? )
+            // InternalFormalML.g:44433:2: ( rule__ChannelPrivate__UnrestrictedNameAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameAssignment_2()); 
+            }
+            // InternalFormalML.g:44434:2: ( rule__ChannelPrivate__UnrestrictedNameAssignment_2 )?
+            int alt599=2;
+            int LA599_0 = input.LA(1);
+
+            if ( (LA599_0==RULE_STRING) ) {
+                alt599=1;
+            }
+            switch (alt599) {
+                case 1 :
+                    // InternalFormalML.g:44434:3: rule__ChannelPrivate__UnrestrictedNameAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ChannelPrivate__UnrestrictedNameAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__3"
+    // InternalFormalML.g:44442:1: rule__ChannelPrivate__Group__3 : rule__ChannelPrivate__Group__3__Impl rule__ChannelPrivate__Group__4 ;
+    public final void rule__ChannelPrivate__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44446:1: ( rule__ChannelPrivate__Group__3__Impl rule__ChannelPrivate__Group__4 )
+            // InternalFormalML.g:44447:2: rule__ChannelPrivate__Group__3__Impl rule__ChannelPrivate__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_181);
+            rule__ChannelPrivate__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__3"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__3__Impl"
+    // InternalFormalML.g:44454:1: rule__ChannelPrivate__Group__3__Impl : ( '{' ) ;
+    public final void rule__ChannelPrivate__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44458:1: ( ( '{' ) )
+            // InternalFormalML.g:44459:1: ( '{' )
+            {
+            // InternalFormalML.g:44459:1: ( '{' )
+            // InternalFormalML.g:44460:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__4"
+    // InternalFormalML.g:44469:1: rule__ChannelPrivate__Group__4 : rule__ChannelPrivate__Group__4__Impl rule__ChannelPrivate__Group__5 ;
+    public final void rule__ChannelPrivate__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44473:1: ( rule__ChannelPrivate__Group__4__Impl rule__ChannelPrivate__Group__5 )
+            // InternalFormalML.g:44474:2: rule__ChannelPrivate__Group__4__Impl rule__ChannelPrivate__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__ChannelPrivate__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__4"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__4__Impl"
+    // InternalFormalML.g:44481:1: rule__ChannelPrivate__Group__4__Impl : ( ( ( rule__ChannelPrivate__Group_4__0 ) ) ( ( rule__ChannelPrivate__Group_4__0 )* ) ) ;
+    public final void rule__ChannelPrivate__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44485:1: ( ( ( ( rule__ChannelPrivate__Group_4__0 ) ) ( ( rule__ChannelPrivate__Group_4__0 )* ) ) )
+            // InternalFormalML.g:44486:1: ( ( ( rule__ChannelPrivate__Group_4__0 ) ) ( ( rule__ChannelPrivate__Group_4__0 )* ) )
+            {
+            // InternalFormalML.g:44486:1: ( ( ( rule__ChannelPrivate__Group_4__0 ) ) ( ( rule__ChannelPrivate__Group_4__0 )* ) )
+            // InternalFormalML.g:44487:2: ( ( rule__ChannelPrivate__Group_4__0 ) ) ( ( rule__ChannelPrivate__Group_4__0 )* )
+            {
+            // InternalFormalML.g:44487:2: ( ( rule__ChannelPrivate__Group_4__0 ) )
+            // InternalFormalML.g:44488:3: ( rule__ChannelPrivate__Group_4__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:44489:3: ( rule__ChannelPrivate__Group_4__0 )
+            // InternalFormalML.g:44489:4: rule__ChannelPrivate__Group_4__0
+            {
+            pushFollow(FollowSets000.FOLLOW_185);
+            rule__ChannelPrivate__Group_4__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getGroup_4()); 
+            }
+
+            }
+
+            // InternalFormalML.g:44492:2: ( ( rule__ChannelPrivate__Group_4__0 )* )
+            // InternalFormalML.g:44493:3: ( rule__ChannelPrivate__Group_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:44494:3: ( rule__ChannelPrivate__Group_4__0 )*
+            loop600:
+            do {
+                int alt600=2;
+                int LA600_0 = input.LA(1);
+
+                if ( (LA600_0==RULE_XLIA_ID||LA600_0==173||(LA600_0>=175 && LA600_0<=176)) ) {
+                    alt600=1;
+                }
+
+
+                switch (alt600) {
+            	case 1 :
+            	    // InternalFormalML.g:44494:4: rule__ChannelPrivate__Group_4__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_185);
+            	    rule__ChannelPrivate__Group_4__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop600;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__5"
+    // InternalFormalML.g:44503:1: rule__ChannelPrivate__Group__5 : rule__ChannelPrivate__Group__5__Impl ;
+    public final void rule__ChannelPrivate__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44507:1: ( rule__ChannelPrivate__Group__5__Impl )
+            // InternalFormalML.g:44508:2: rule__ChannelPrivate__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__5"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group__5__Impl"
+    // InternalFormalML.g:44514:1: rule__ChannelPrivate__Group__5__Impl : ( '}' ) ;
+    public final void rule__ChannelPrivate__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44518:1: ( ( '}' ) )
+            // InternalFormalML.g:44519:1: ( '}' )
+            {
+            // InternalFormalML.g:44519:1: ( '}' )
+            // InternalFormalML.g:44520:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getRightCurlyBracketKeyword_5()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getRightCurlyBracketKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group__5__Impl"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group_4__0"
+    // InternalFormalML.g:44530:1: rule__ChannelPrivate__Group_4__0 : rule__ChannelPrivate__Group_4__0__Impl rule__ChannelPrivate__Group_4__1 ;
+    public final void rule__ChannelPrivate__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44534:1: ( rule__ChannelPrivate__Group_4__0__Impl rule__ChannelPrivate__Group_4__1 )
+            // InternalFormalML.g:44535:2: rule__ChannelPrivate__Group_4__0__Impl rule__ChannelPrivate__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ChannelPrivate__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group_4__0"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group_4__0__Impl"
+    // InternalFormalML.g:44542:1: rule__ChannelPrivate__Group_4__0__Impl : ( ( rule__ChannelPrivate__SignalAssignment_4_0 ) ) ;
+    public final void rule__ChannelPrivate__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44546:1: ( ( ( rule__ChannelPrivate__SignalAssignment_4_0 ) ) )
+            // InternalFormalML.g:44547:1: ( ( rule__ChannelPrivate__SignalAssignment_4_0 ) )
+            {
+            // InternalFormalML.g:44547:1: ( ( rule__ChannelPrivate__SignalAssignment_4_0 ) )
+            // InternalFormalML.g:44548:2: ( rule__ChannelPrivate__SignalAssignment_4_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getSignalAssignment_4_0()); 
+            }
+            // InternalFormalML.g:44549:2: ( rule__ChannelPrivate__SignalAssignment_4_0 )
+            // InternalFormalML.g:44549:3: rule__ChannelPrivate__SignalAssignment_4_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__SignalAssignment_4_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getSignalAssignment_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group_4__1"
+    // InternalFormalML.g:44557:1: rule__ChannelPrivate__Group_4__1 : rule__ChannelPrivate__Group_4__1__Impl ;
+    public final void rule__ChannelPrivate__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44561:1: ( rule__ChannelPrivate__Group_4__1__Impl )
+            // InternalFormalML.g:44562:2: rule__ChannelPrivate__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ChannelPrivate__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group_4__1"
+
+
+    // $ANTLR start "rule__ChannelPrivate__Group_4__1__Impl"
+    // InternalFormalML.g:44568:1: rule__ChannelPrivate__Group_4__1__Impl : ( ';' ) ;
+    public final void rule__ChannelPrivate__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44572:1: ( ( ';' ) )
+            // InternalFormalML.g:44573:1: ( ';' )
+            {
+            // InternalFormalML.g:44573:1: ( ';' )
+            // InternalFormalML.g:44574:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getSemicolonKeyword_4_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getSemicolonKeyword_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group__0"
+    // InternalFormalML.g:44584:1: rule__Transition__Group__0 : rule__Transition__Group__0__Impl rule__Transition__Group__1 ;
+    public final void rule__Transition__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44588:1: ( rule__Transition__Group__0__Impl rule__Transition__Group__1 )
+            // InternalFormalML.g:44589:2: rule__Transition__Group__0__Impl rule__Transition__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_86);
+            rule__Transition__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__0"
+
+
+    // $ANTLR start "rule__Transition__Group__0__Impl"
+    // InternalFormalML.g:44596:1: rule__Transition__Group__0__Impl : ( () ) ;
+    public final void rule__Transition__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44600:1: ( ( () ) )
+            // InternalFormalML.g:44601:1: ( () )
+            {
+            // InternalFormalML.g:44601:1: ( () )
+            // InternalFormalML.g:44602:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTransitionAction_0()); 
+            }
+            // InternalFormalML.g:44603:2: ()
+            // InternalFormalML.g:44603:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTransitionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group__1"
+    // InternalFormalML.g:44611:1: rule__Transition__Group__1 : rule__Transition__Group__1__Impl rule__Transition__Group__2 ;
+    public final void rule__Transition__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44615:1: ( rule__Transition__Group__1__Impl rule__Transition__Group__2 )
+            // InternalFormalML.g:44616:2: rule__Transition__Group__1__Impl rule__Transition__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_86);
+            rule__Transition__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__1"
+
+
+    // $ANTLR start "rule__Transition__Group__1__Impl"
+    // InternalFormalML.g:44623:1: rule__Transition__Group__1__Impl : ( ( rule__Transition__TransientAssignment_1 )? ) ;
+    public final void rule__Transition__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44627:1: ( ( ( rule__Transition__TransientAssignment_1 )? ) )
+            // InternalFormalML.g:44628:1: ( ( rule__Transition__TransientAssignment_1 )? )
+            {
+            // InternalFormalML.g:44628:1: ( ( rule__Transition__TransientAssignment_1 )? )
+            // InternalFormalML.g:44629:2: ( rule__Transition__TransientAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTransientAssignment_1()); 
+            }
+            // InternalFormalML.g:44630:2: ( rule__Transition__TransientAssignment_1 )?
+            int alt601=2;
+            int LA601_0 = input.LA(1);
+
+            if ( (LA601_0==281) ) {
+                alt601=1;
+            }
+            switch (alt601) {
+                case 1 :
+                    // InternalFormalML.g:44630:3: rule__Transition__TransientAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__TransientAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTransientAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group__2"
+    // InternalFormalML.g:44638:1: rule__Transition__Group__2 : rule__Transition__Group__2__Impl rule__Transition__Group__3 ;
+    public final void rule__Transition__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44642:1: ( rule__Transition__Group__2__Impl rule__Transition__Group__3 )
+            // InternalFormalML.g:44643:2: rule__Transition__Group__2__Impl rule__Transition__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_186);
+            rule__Transition__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__2"
+
+
+    // $ANTLR start "rule__Transition__Group__2__Impl"
+    // InternalFormalML.g:44650:1: rule__Transition__Group__2__Impl : ( 'transition' ) ;
+    public final void rule__Transition__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44654:1: ( ( 'transition' ) )
+            // InternalFormalML.g:44655:1: ( 'transition' )
+            {
+            // InternalFormalML.g:44655:1: ( 'transition' )
+            // InternalFormalML.g:44656:2: 'transition'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTransitionKeyword_2()); 
+            }
+            match(input,239,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTransitionKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group__3"
+    // InternalFormalML.g:44665:1: rule__Transition__Group__3 : rule__Transition__Group__3__Impl rule__Transition__Group__4 ;
+    public final void rule__Transition__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44669:1: ( rule__Transition__Group__3__Impl rule__Transition__Group__4 )
+            // InternalFormalML.g:44670:2: rule__Transition__Group__3__Impl rule__Transition__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_186);
+            rule__Transition__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__3"
+
+
+    // $ANTLR start "rule__Transition__Group__3__Impl"
+    // InternalFormalML.g:44677:1: rule__Transition__Group__3__Impl : ( ( rule__Transition__MoeAssignment_3 )? ) ;
+    public final void rule__Transition__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44681:1: ( ( ( rule__Transition__MoeAssignment_3 )? ) )
+            // InternalFormalML.g:44682:1: ( ( rule__Transition__MoeAssignment_3 )? )
+            {
+            // InternalFormalML.g:44682:1: ( ( rule__Transition__MoeAssignment_3 )? )
+            // InternalFormalML.g:44683:2: ( rule__Transition__MoeAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getMoeAssignment_3()); 
+            }
+            // InternalFormalML.g:44684:2: ( rule__Transition__MoeAssignment_3 )?
+            int alt602=2;
+            int LA602_0 = input.LA(1);
+
+            if ( (LA602_0==125) ) {
+                alt602=1;
+            }
+            switch (alt602) {
+                case 1 :
+                    // InternalFormalML.g:44684:3: rule__Transition__MoeAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__MoeAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getMoeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group__4"
+    // InternalFormalML.g:44692:1: rule__Transition__Group__4 : rule__Transition__Group__4__Impl rule__Transition__Group__5 ;
+    public final void rule__Transition__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44696:1: ( rule__Transition__Group__4__Impl rule__Transition__Group__5 )
+            // InternalFormalML.g:44697:2: rule__Transition__Group__4__Impl rule__Transition__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_186);
+            rule__Transition__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__4"
+
+
+    // $ANTLR start "rule__Transition__Group__4__Impl"
+    // InternalFormalML.g:44704:1: rule__Transition__Group__4__Impl : ( ( rule__Transition__Group_4__0 )? ) ;
+    public final void rule__Transition__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44708:1: ( ( ( rule__Transition__Group_4__0 )? ) )
+            // InternalFormalML.g:44709:1: ( ( rule__Transition__Group_4__0 )? )
+            {
+            // InternalFormalML.g:44709:1: ( ( rule__Transition__Group_4__0 )? )
+            // InternalFormalML.g:44710:2: ( rule__Transition__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:44711:2: ( rule__Transition__Group_4__0 )?
+            int alt603=2;
+            int LA603_0 = input.LA(1);
+
+            if ( (LA603_0==RULE_XLIA_ID) ) {
+                alt603=1;
+            }
+            switch (alt603) {
+                case 1 :
+                    // InternalFormalML.g:44711:3: rule__Transition__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group__5"
+    // InternalFormalML.g:44719:1: rule__Transition__Group__5 : rule__Transition__Group__5__Impl ;
+    public final void rule__Transition__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44723:1: ( rule__Transition__Group__5__Impl )
+            // InternalFormalML.g:44724:2: rule__Transition__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__5"
+
+
+    // $ANTLR start "rule__Transition__Group__5__Impl"
+    // InternalFormalML.g:44730:1: rule__Transition__Group__5__Impl : ( ( rule__Transition__Alternatives_5 ) ) ;
+    public final void rule__Transition__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44734:1: ( ( ( rule__Transition__Alternatives_5 ) ) )
+            // InternalFormalML.g:44735:1: ( ( rule__Transition__Alternatives_5 ) )
+            {
+            // InternalFormalML.g:44735:1: ( ( rule__Transition__Alternatives_5 ) )
+            // InternalFormalML.g:44736:2: ( rule__Transition__Alternatives_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getAlternatives_5()); 
+            }
+            // InternalFormalML.g:44737:2: ( rule__Transition__Alternatives_5 )
+            // InternalFormalML.g:44737:3: rule__Transition__Alternatives_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Alternatives_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getAlternatives_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_4__0"
+    // InternalFormalML.g:44746:1: rule__Transition__Group_4__0 : rule__Transition__Group_4__0__Impl rule__Transition__Group_4__1 ;
+    public final void rule__Transition__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44750:1: ( rule__Transition__Group_4__0__Impl rule__Transition__Group_4__1 )
+            // InternalFormalML.g:44751:2: rule__Transition__Group_4__0__Impl rule__Transition__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_122);
+            rule__Transition__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_4__0"
+
+
+    // $ANTLR start "rule__Transition__Group_4__0__Impl"
+    // InternalFormalML.g:44758:1: rule__Transition__Group_4__0__Impl : ( ( rule__Transition__NameAssignment_4_0 ) ) ;
+    public final void rule__Transition__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44762:1: ( ( ( rule__Transition__NameAssignment_4_0 ) ) )
+            // InternalFormalML.g:44763:1: ( ( rule__Transition__NameAssignment_4_0 ) )
+            {
+            // InternalFormalML.g:44763:1: ( ( rule__Transition__NameAssignment_4_0 ) )
+            // InternalFormalML.g:44764:2: ( rule__Transition__NameAssignment_4_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getNameAssignment_4_0()); 
+            }
+            // InternalFormalML.g:44765:2: ( rule__Transition__NameAssignment_4_0 )
+            // InternalFormalML.g:44765:3: rule__Transition__NameAssignment_4_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__NameAssignment_4_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getNameAssignment_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_4__1"
+    // InternalFormalML.g:44773:1: rule__Transition__Group_4__1 : rule__Transition__Group_4__1__Impl ;
+    public final void rule__Transition__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44777:1: ( rule__Transition__Group_4__1__Impl )
+            // InternalFormalML.g:44778:2: rule__Transition__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_4__1"
+
+
+    // $ANTLR start "rule__Transition__Group_4__1__Impl"
+    // InternalFormalML.g:44784:1: rule__Transition__Group_4__1__Impl : ( ( rule__Transition__UnrestrictedNameAssignment_4_1 )? ) ;
+    public final void rule__Transition__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44788:1: ( ( ( rule__Transition__UnrestrictedNameAssignment_4_1 )? ) )
+            // InternalFormalML.g:44789:1: ( ( rule__Transition__UnrestrictedNameAssignment_4_1 )? )
+            {
+            // InternalFormalML.g:44789:1: ( ( rule__Transition__UnrestrictedNameAssignment_4_1 )? )
+            // InternalFormalML.g:44790:2: ( rule__Transition__UnrestrictedNameAssignment_4_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getUnrestrictedNameAssignment_4_1()); 
+            }
+            // InternalFormalML.g:44791:2: ( rule__Transition__UnrestrictedNameAssignment_4_1 )?
+            int alt604=2;
+            int LA604_0 = input.LA(1);
+
+            if ( (LA604_0==RULE_STRING) ) {
+                alt604=1;
+            }
+            switch (alt604) {
+                case 1 :
+                    // InternalFormalML.g:44791:3: rule__Transition__UnrestrictedNameAssignment_4_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__UnrestrictedNameAssignment_4_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getUnrestrictedNameAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0__0"
+    // InternalFormalML.g:44800:1: rule__Transition__Group_5_0__0 : rule__Transition__Group_5_0__0__Impl rule__Transition__Group_5_0__1 ;
+    public final void rule__Transition__Group_5_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44804:1: ( rule__Transition__Group_5_0__0__Impl rule__Transition__Group_5_0__1 )
+            // InternalFormalML.g:44805:2: rule__Transition__Group_5_0__0__Impl rule__Transition__Group_5_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_187);
+            rule__Transition__Group_5_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0__0"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0__0__Impl"
+    // InternalFormalML.g:44812:1: rule__Transition__Group_5_0__0__Impl : ( '{' ) ;
+    public final void rule__Transition__Group_5_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44816:1: ( ( '{' ) )
+            // InternalFormalML.g:44817:1: ( '{' )
+            {
+            // InternalFormalML.g:44817:1: ( '{' )
+            // InternalFormalML.g:44818:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0__1"
+    // InternalFormalML.g:44827:1: rule__Transition__Group_5_0__1 : rule__Transition__Group_5_0__1__Impl rule__Transition__Group_5_0__2 ;
+    public final void rule__Transition__Group_5_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44831:1: ( rule__Transition__Group_5_0__1__Impl rule__Transition__Group_5_0__2 )
+            // InternalFormalML.g:44832:2: rule__Transition__Group_5_0__1__Impl rule__Transition__Group_5_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_187);
+            rule__Transition__Group_5_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0__1"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0__1__Impl"
+    // InternalFormalML.g:44839:1: rule__Transition__Group_5_0__1__Impl : ( ( rule__Transition__Alternatives_5_0_1 )? ) ;
+    public final void rule__Transition__Group_5_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44843:1: ( ( ( rule__Transition__Alternatives_5_0_1 )? ) )
+            // InternalFormalML.g:44844:1: ( ( rule__Transition__Alternatives_5_0_1 )? )
+            {
+            // InternalFormalML.g:44844:1: ( ( rule__Transition__Alternatives_5_0_1 )? )
+            // InternalFormalML.g:44845:2: ( rule__Transition__Alternatives_5_0_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getAlternatives_5_0_1()); 
+            }
+            // InternalFormalML.g:44846:2: ( rule__Transition__Alternatives_5_0_1 )?
+            int alt605=2;
+            int LA605_0 = input.LA(1);
+
+            if ( (LA605_0==RULE_XLIA_ID||LA605_0==23||(LA605_0>=76 && LA605_0<=77)||(LA605_0>=80 && LA605_0<=95)||(LA605_0>=129 && LA605_0<=130)||(LA605_0>=141 && LA605_0<=142)||LA605_0==157||(LA605_0>=175 && LA605_0<=176)||(LA605_0>=178 && LA605_0<=196)||LA605_0==199||(LA605_0>=240 && LA605_0<=241)||(LA605_0>=244 && LA605_0<=249)||LA605_0==251||(LA605_0>=253 && LA605_0<=255)||(LA605_0>=261 && LA605_0<=262)||(LA605_0>=265 && LA605_0<=271)||(LA605_0>=284 && LA605_0<=285)) ) {
+                alt605=1;
+            }
+            else if ( (LA605_0==200) ) {
+                int LA605_2 = input.LA(2);
+
+                if ( (synpred892_InternalFormalML()) ) {
+                    alt605=1;
+                }
+            }
+            switch (alt605) {
+                case 1 :
+                    // InternalFormalML.g:44846:3: rule__Transition__Alternatives_5_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Alternatives_5_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getAlternatives_5_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0__2"
+    // InternalFormalML.g:44854:1: rule__Transition__Group_5_0__2 : rule__Transition__Group_5_0__2__Impl rule__Transition__Group_5_0__3 ;
+    public final void rule__Transition__Group_5_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44858:1: ( rule__Transition__Group_5_0__2__Impl rule__Transition__Group_5_0__3 )
+            // InternalFormalML.g:44859:2: rule__Transition__Group_5_0__2__Impl rule__Transition__Group_5_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_188);
+            rule__Transition__Group_5_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0__2"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0__2__Impl"
+    // InternalFormalML.g:44866:1: rule__Transition__Group_5_0__2__Impl : ( '}' ) ;
+    public final void rule__Transition__Group_5_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44870:1: ( ( '}' ) )
+            // InternalFormalML.g:44871:1: ( '}' )
+            {
+            // InternalFormalML.g:44871:1: ( '}' )
+            // InternalFormalML.g:44872:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0__2__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0__3"
+    // InternalFormalML.g:44881:1: rule__Transition__Group_5_0__3 : rule__Transition__Group_5_0__3__Impl ;
+    public final void rule__Transition__Group_5_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44885:1: ( rule__Transition__Group_5_0__3__Impl )
+            // InternalFormalML.g:44886:2: rule__Transition__Group_5_0__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0__3"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0__3__Impl"
+    // InternalFormalML.g:44892:1: rule__Transition__Group_5_0__3__Impl : ( ( rule__Transition__Group_5_0_3__0 )? ) ;
+    public final void rule__Transition__Group_5_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44896:1: ( ( ( rule__Transition__Group_5_0_3__0 )? ) )
+            // InternalFormalML.g:44897:1: ( ( rule__Transition__Group_5_0_3__0 )? )
+            {
+            // InternalFormalML.g:44897:1: ( ( rule__Transition__Group_5_0_3__0 )? )
+            // InternalFormalML.g:44898:2: ( rule__Transition__Group_5_0_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getGroup_5_0_3()); 
+            }
+            // InternalFormalML.g:44899:2: ( rule__Transition__Group_5_0_3__0 )?
+            int alt606=2;
+            int LA606_0 = input.LA(1);
+
+            if ( (LA606_0==215) ) {
+                alt606=1;
+            }
+            switch (alt606) {
+                case 1 :
+                    // InternalFormalML.g:44899:3: rule__Transition__Group_5_0_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Group_5_0_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getGroup_5_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0__3__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__0"
+    // InternalFormalML.g:44908:1: rule__Transition__Group_5_0_1_0__0 : rule__Transition__Group_5_0_1_0__0__Impl rule__Transition__Group_5_0_1_0__1 ;
+    public final void rule__Transition__Group_5_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44912:1: ( rule__Transition__Group_5_0_1_0__0__Impl rule__Transition__Group_5_0_1_0__1 )
+            // InternalFormalML.g:44913:2: rule__Transition__Group_5_0_1_0__0__Impl rule__Transition__Group_5_0_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_189);
+            rule__Transition__Group_5_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__0"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__0__Impl"
+    // InternalFormalML.g:44920:1: rule__Transition__Group_5_0_1_0__0__Impl : ( ( rule__Transition__Group_5_0_1_0_0__0 )? ) ;
+    public final void rule__Transition__Group_5_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44924:1: ( ( ( rule__Transition__Group_5_0_1_0_0__0 )? ) )
+            // InternalFormalML.g:44925:1: ( ( rule__Transition__Group_5_0_1_0_0__0 )? )
+            {
+            // InternalFormalML.g:44925:1: ( ( rule__Transition__Group_5_0_1_0_0__0 )? )
+            // InternalFormalML.g:44926:2: ( rule__Transition__Group_5_0_1_0_0__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getGroup_5_0_1_0_0()); 
+            }
+            // InternalFormalML.g:44927:2: ( rule__Transition__Group_5_0_1_0_0__0 )?
+            int alt607=2;
+            int LA607_0 = input.LA(1);
+
+            if ( (LA607_0==241) ) {
+                alt607=1;
+            }
+            switch (alt607) {
+                case 1 :
+                    // InternalFormalML.g:44927:3: rule__Transition__Group_5_0_1_0_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Group_5_0_1_0_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getGroup_5_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__1"
+    // InternalFormalML.g:44935:1: rule__Transition__Group_5_0_1_0__1 : rule__Transition__Group_5_0_1_0__1__Impl rule__Transition__Group_5_0_1_0__2 ;
+    public final void rule__Transition__Group_5_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44939:1: ( rule__Transition__Group_5_0_1_0__1__Impl rule__Transition__Group_5_0_1_0__2 )
+            // InternalFormalML.g:44940:2: rule__Transition__Group_5_0_1_0__1__Impl rule__Transition__Group_5_0_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_189);
+            rule__Transition__Group_5_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__1"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__1__Impl"
+    // InternalFormalML.g:44947:1: rule__Transition__Group_5_0_1_0__1__Impl : ( ( rule__Transition__Alternatives_5_0_1_0_1 )? ) ;
+    public final void rule__Transition__Group_5_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44951:1: ( ( ( rule__Transition__Alternatives_5_0_1_0_1 )? ) )
+            // InternalFormalML.g:44952:1: ( ( rule__Transition__Alternatives_5_0_1_0_1 )? )
+            {
+            // InternalFormalML.g:44952:1: ( ( rule__Transition__Alternatives_5_0_1_0_1 )? )
+            // InternalFormalML.g:44953:2: ( rule__Transition__Alternatives_5_0_1_0_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_1()); 
+            }
+            // InternalFormalML.g:44954:2: ( rule__Transition__Alternatives_5_0_1_0_1 )?
+            int alt608=2;
+            int LA608_0 = input.LA(1);
+
+            if ( (LA608_0==76||LA608_0==244) ) {
+                alt608=1;
+            }
+            switch (alt608) {
+                case 1 :
+                    // InternalFormalML.g:44954:3: rule__Transition__Alternatives_5_0_1_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Alternatives_5_0_1_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__2"
+    // InternalFormalML.g:44962:1: rule__Transition__Group_5_0_1_0__2 : rule__Transition__Group_5_0_1_0__2__Impl rule__Transition__Group_5_0_1_0__3 ;
+    public final void rule__Transition__Group_5_0_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44966:1: ( rule__Transition__Group_5_0_1_0__2__Impl rule__Transition__Group_5_0_1_0__3 )
+            // InternalFormalML.g:44967:2: rule__Transition__Group_5_0_1_0__2__Impl rule__Transition__Group_5_0_1_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_189);
+            rule__Transition__Group_5_0_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_1_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__2"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__2__Impl"
+    // InternalFormalML.g:44974:1: rule__Transition__Group_5_0_1_0__2__Impl : ( ( rule__Transition__Alternatives_5_0_1_0_2 )? ) ;
+    public final void rule__Transition__Group_5_0_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44978:1: ( ( ( rule__Transition__Alternatives_5_0_1_0_2 )? ) )
+            // InternalFormalML.g:44979:1: ( ( rule__Transition__Alternatives_5_0_1_0_2 )? )
+            {
+            // InternalFormalML.g:44979:1: ( ( rule__Transition__Alternatives_5_0_1_0_2 )? )
+            // InternalFormalML.g:44980:2: ( rule__Transition__Alternatives_5_0_1_0_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_2()); 
+            }
+            // InternalFormalML.g:44981:2: ( rule__Transition__Alternatives_5_0_1_0_2 )?
+            int alt609=2;
+            int LA609_0 = input.LA(1);
+
+            if ( (LA609_0==77||LA609_0==245) ) {
+                alt609=1;
+            }
+            switch (alt609) {
+                case 1 :
+                    // InternalFormalML.g:44981:3: rule__Transition__Alternatives_5_0_1_0_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Alternatives_5_0_1_0_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getAlternatives_5_0_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__3"
+    // InternalFormalML.g:44989:1: rule__Transition__Group_5_0_1_0__3 : rule__Transition__Group_5_0_1_0__3__Impl rule__Transition__Group_5_0_1_0__4 ;
+    public final void rule__Transition__Group_5_0_1_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:44993:1: ( rule__Transition__Group_5_0_1_0__3__Impl rule__Transition__Group_5_0_1_0__4 )
+            // InternalFormalML.g:44994:2: rule__Transition__Group_5_0_1_0__3__Impl rule__Transition__Group_5_0_1_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_190);
+            rule__Transition__Group_5_0_1_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_1_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__3"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__3__Impl"
+    // InternalFormalML.g:45001:1: rule__Transition__Group_5_0_1_0__3__Impl : ( '@effect:' ) ;
+    public final void rule__Transition__Group_5_0_1_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45005:1: ( ( '@effect:' ) )
+            // InternalFormalML.g:45006:1: ( '@effect:' )
+            {
+            // InternalFormalML.g:45006:1: ( '@effect:' )
+            // InternalFormalML.g:45007:2: '@effect:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getEffectKeyword_5_0_1_0_3()); 
+            }
+            match(input,240,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getEffectKeyword_5_0_1_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__3__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__4"
+    // InternalFormalML.g:45016:1: rule__Transition__Group_5_0_1_0__4 : rule__Transition__Group_5_0_1_0__4__Impl ;
+    public final void rule__Transition__Group_5_0_1_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45020:1: ( rule__Transition__Group_5_0_1_0__4__Impl )
+            // InternalFormalML.g:45021:2: rule__Transition__Group_5_0_1_0__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_1_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__4"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0__4__Impl"
+    // InternalFormalML.g:45027:1: rule__Transition__Group_5_0_1_0__4__Impl : ( ( rule__Transition__EffectAssignment_5_0_1_0_4 )? ) ;
+    public final void rule__Transition__Group_5_0_1_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45031:1: ( ( ( rule__Transition__EffectAssignment_5_0_1_0_4 )? ) )
+            // InternalFormalML.g:45032:1: ( ( rule__Transition__EffectAssignment_5_0_1_0_4 )? )
+            {
+            // InternalFormalML.g:45032:1: ( ( rule__Transition__EffectAssignment_5_0_1_0_4 )? )
+            // InternalFormalML.g:45033:2: ( rule__Transition__EffectAssignment_5_0_1_0_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getEffectAssignment_5_0_1_0_4()); 
+            }
+            // InternalFormalML.g:45034:2: ( rule__Transition__EffectAssignment_5_0_1_0_4 )?
+            int alt610=2;
+            int LA610_0 = input.LA(1);
+
+            if ( (LA610_0==RULE_XLIA_ID||LA610_0==23||(LA610_0>=129 && LA610_0<=130)||(LA610_0>=141 && LA610_0<=142)||LA610_0==157||LA610_0==176||(LA610_0>=178 && LA610_0<=196)||LA610_0==251||(LA610_0>=253 && LA610_0<=255)||(LA610_0>=261 && LA610_0<=262)||(LA610_0>=265 && LA610_0<=271)||(LA610_0>=284 && LA610_0<=285)) ) {
+                alt610=1;
+            }
+            switch (alt610) {
+                case 1 :
+                    // InternalFormalML.g:45034:3: rule__Transition__EffectAssignment_5_0_1_0_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__EffectAssignment_5_0_1_0_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getEffectAssignment_5_0_1_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0__4__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0_0__0"
+    // InternalFormalML.g:45043:1: rule__Transition__Group_5_0_1_0_0__0 : rule__Transition__Group_5_0_1_0_0__0__Impl rule__Transition__Group_5_0_1_0_0__1 ;
+    public final void rule__Transition__Group_5_0_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45047:1: ( rule__Transition__Group_5_0_1_0_0__0__Impl rule__Transition__Group_5_0_1_0_0__1 )
+            // InternalFormalML.g:45048:2: rule__Transition__Group_5_0_1_0_0__0__Impl rule__Transition__Group_5_0_1_0_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_191);
+            rule__Transition__Group_5_0_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0_0__0"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0_0__0__Impl"
+    // InternalFormalML.g:45055:1: rule__Transition__Group_5_0_1_0_0__0__Impl : ( '@trigger:' ) ;
+    public final void rule__Transition__Group_5_0_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45059:1: ( ( '@trigger:' ) )
+            // InternalFormalML.g:45060:1: ( '@trigger:' )
+            {
+            // InternalFormalML.g:45060:1: ( '@trigger:' )
+            // InternalFormalML.g:45061:2: '@trigger:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTriggerKeyword_5_0_1_0_0_0()); 
+            }
+            match(input,241,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTriggerKeyword_5_0_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0_0__1"
+    // InternalFormalML.g:45070:1: rule__Transition__Group_5_0_1_0_0__1 : rule__Transition__Group_5_0_1_0_0__1__Impl ;
+    public final void rule__Transition__Group_5_0_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45074:1: ( rule__Transition__Group_5_0_1_0_0__1__Impl )
+            // InternalFormalML.g:45075:2: rule__Transition__Group_5_0_1_0_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0_0__1"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_1_0_0__1__Impl"
+    // InternalFormalML.g:45081:1: rule__Transition__Group_5_0_1_0_0__1__Impl : ( ( rule__Transition__TriggerAssignment_5_0_1_0_0_1 )* ) ;
+    public final void rule__Transition__Group_5_0_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45085:1: ( ( ( rule__Transition__TriggerAssignment_5_0_1_0_0_1 )* ) )
+            // InternalFormalML.g:45086:1: ( ( rule__Transition__TriggerAssignment_5_0_1_0_0_1 )* )
+            {
+            // InternalFormalML.g:45086:1: ( ( rule__Transition__TriggerAssignment_5_0_1_0_0_1 )* )
+            // InternalFormalML.g:45087:2: ( rule__Transition__TriggerAssignment_5_0_1_0_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTriggerAssignment_5_0_1_0_0_1()); 
+            }
+            // InternalFormalML.g:45088:2: ( rule__Transition__TriggerAssignment_5_0_1_0_0_1 )*
+            loop611:
+            do {
+                int alt611=2;
+                int LA611_0 = input.LA(1);
+
+                if ( (LA611_0==175) ) {
+                    alt611=1;
+                }
+
+
+                switch (alt611) {
+            	case 1 :
+            	    // InternalFormalML.g:45088:3: rule__Transition__TriggerAssignment_5_0_1_0_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_192);
+            	    rule__Transition__TriggerAssignment_5_0_1_0_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop611;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTriggerAssignment_5_0_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_3__0"
+    // InternalFormalML.g:45097:1: rule__Transition__Group_5_0_3__0 : rule__Transition__Group_5_0_3__0__Impl rule__Transition__Group_5_0_3__1 ;
+    public final void rule__Transition__Group_5_0_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45101:1: ( rule__Transition__Group_5_0_3__0__Impl rule__Transition__Group_5_0_3__1 )
+            // InternalFormalML.g:45102:2: rule__Transition__Group_5_0_3__0__Impl rule__Transition__Group_5_0_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__Transition__Group_5_0_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_3__0"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_3__0__Impl"
+    // InternalFormalML.g:45109:1: rule__Transition__Group_5_0_3__0__Impl : ( '-->' ) ;
+    public final void rule__Transition__Group_5_0_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45113:1: ( ( '-->' ) )
+            // InternalFormalML.g:45114:1: ( '-->' )
+            {
+            // InternalFormalML.g:45114:1: ( '-->' )
+            // InternalFormalML.g:45115:2: '-->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_0_3_0()); 
+            }
+            match(input,215,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_3__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_3__1"
+    // InternalFormalML.g:45124:1: rule__Transition__Group_5_0_3__1 : rule__Transition__Group_5_0_3__1__Impl rule__Transition__Group_5_0_3__2 ;
+    public final void rule__Transition__Group_5_0_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45128:1: ( rule__Transition__Group_5_0_3__1__Impl rule__Transition__Group_5_0_3__2 )
+            // InternalFormalML.g:45129:2: rule__Transition__Group_5_0_3__1__Impl rule__Transition__Group_5_0_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__Transition__Group_5_0_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_3__1"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_3__1__Impl"
+    // InternalFormalML.g:45136:1: rule__Transition__Group_5_0_3__1__Impl : ( ( rule__Transition__TargetAssignment_5_0_3_1 ) ) ;
+    public final void rule__Transition__Group_5_0_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45140:1: ( ( ( rule__Transition__TargetAssignment_5_0_3_1 ) ) )
+            // InternalFormalML.g:45141:1: ( ( rule__Transition__TargetAssignment_5_0_3_1 ) )
+            {
+            // InternalFormalML.g:45141:1: ( ( rule__Transition__TargetAssignment_5_0_3_1 ) )
+            // InternalFormalML.g:45142:2: ( rule__Transition__TargetAssignment_5_0_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTargetAssignment_5_0_3_1()); 
+            }
+            // InternalFormalML.g:45143:2: ( rule__Transition__TargetAssignment_5_0_3_1 )
+            // InternalFormalML.g:45143:3: rule__Transition__TargetAssignment_5_0_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__TargetAssignment_5_0_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTargetAssignment_5_0_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_3__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_3__2"
+    // InternalFormalML.g:45151:1: rule__Transition__Group_5_0_3__2 : rule__Transition__Group_5_0_3__2__Impl ;
+    public final void rule__Transition__Group_5_0_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45155:1: ( rule__Transition__Group_5_0_3__2__Impl )
+            // InternalFormalML.g:45156:2: rule__Transition__Group_5_0_3__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_0_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_3__2"
+
+
+    // $ANTLR start "rule__Transition__Group_5_0_3__2__Impl"
+    // InternalFormalML.g:45162:1: rule__Transition__Group_5_0_3__2__Impl : ( ';' ) ;
+    public final void rule__Transition__Group_5_0_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45166:1: ( ( ';' ) )
+            // InternalFormalML.g:45167:1: ( ';' )
+            {
+            // InternalFormalML.g:45167:1: ( ';' )
+            // InternalFormalML.g:45168:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getSemicolonKeyword_5_0_3_2()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getSemicolonKeyword_5_0_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_0_3__2__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1__0"
+    // InternalFormalML.g:45178:1: rule__Transition__Group_5_1__0 : rule__Transition__Group_5_1__0__Impl rule__Transition__Group_5_1__1 ;
+    public final void rule__Transition__Group_5_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45182:1: ( rule__Transition__Group_5_1__0__Impl rule__Transition__Group_5_1__1 )
+            // InternalFormalML.g:45183:2: rule__Transition__Group_5_1__0__Impl rule__Transition__Group_5_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__Transition__Group_5_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1__0"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1__0__Impl"
+    // InternalFormalML.g:45190:1: rule__Transition__Group_5_1__0__Impl : ( '-->' ) ;
+    public final void rule__Transition__Group_5_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45194:1: ( ( '-->' ) )
+            // InternalFormalML.g:45195:1: ( '-->' )
+            {
+            // InternalFormalML.g:45195:1: ( '-->' )
+            // InternalFormalML.g:45196:2: '-->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0()); 
+            }
+            match(input,215,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1__1"
+    // InternalFormalML.g:45205:1: rule__Transition__Group_5_1__1 : rule__Transition__Group_5_1__1__Impl rule__Transition__Group_5_1__2 ;
+    public final void rule__Transition__Group_5_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45209:1: ( rule__Transition__Group_5_1__1__Impl rule__Transition__Group_5_1__2 )
+            // InternalFormalML.g:45210:2: rule__Transition__Group_5_1__1__Impl rule__Transition__Group_5_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_193);
+            rule__Transition__Group_5_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1__1"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1__1__Impl"
+    // InternalFormalML.g:45217:1: rule__Transition__Group_5_1__1__Impl : ( ( rule__Transition__TargetAssignment_5_1_1 ) ) ;
+    public final void rule__Transition__Group_5_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45221:1: ( ( ( rule__Transition__TargetAssignment_5_1_1 ) ) )
+            // InternalFormalML.g:45222:1: ( ( rule__Transition__TargetAssignment_5_1_1 ) )
+            {
+            // InternalFormalML.g:45222:1: ( ( rule__Transition__TargetAssignment_5_1_1 ) )
+            // InternalFormalML.g:45223:2: ( rule__Transition__TargetAssignment_5_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTargetAssignment_5_1_1()); 
+            }
+            // InternalFormalML.g:45224:2: ( rule__Transition__TargetAssignment_5_1_1 )
+            // InternalFormalML.g:45224:3: rule__Transition__TargetAssignment_5_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__TargetAssignment_5_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTargetAssignment_5_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1__2"
+    // InternalFormalML.g:45232:1: rule__Transition__Group_5_1__2 : rule__Transition__Group_5_1__2__Impl ;
+    public final void rule__Transition__Group_5_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45236:1: ( rule__Transition__Group_5_1__2__Impl )
+            // InternalFormalML.g:45237:2: rule__Transition__Group_5_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1__2"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1__2__Impl"
+    // InternalFormalML.g:45243:1: rule__Transition__Group_5_1__2__Impl : ( ( rule__Transition__Alternatives_5_1_2 ) ) ;
+    public final void rule__Transition__Group_5_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45247:1: ( ( ( rule__Transition__Alternatives_5_1_2 ) ) )
+            // InternalFormalML.g:45248:1: ( ( rule__Transition__Alternatives_5_1_2 ) )
+            {
+            // InternalFormalML.g:45248:1: ( ( rule__Transition__Alternatives_5_1_2 ) )
+            // InternalFormalML.g:45249:2: ( rule__Transition__Alternatives_5_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getAlternatives_5_1_2()); 
+            }
+            // InternalFormalML.g:45250:2: ( rule__Transition__Alternatives_5_1_2 )
+            // InternalFormalML.g:45250:3: rule__Transition__Alternatives_5_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Alternatives_5_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getAlternatives_5_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1__2__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0__0"
+    // InternalFormalML.g:45259:1: rule__Transition__Group_5_1_2_0__0 : rule__Transition__Group_5_1_2_0__0__Impl rule__Transition__Group_5_1_2_0__1 ;
+    public final void rule__Transition__Group_5_1_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45263:1: ( rule__Transition__Group_5_1_2_0__0__Impl rule__Transition__Group_5_1_2_0__1 )
+            // InternalFormalML.g:45264:2: rule__Transition__Group_5_1_2_0__0__Impl rule__Transition__Group_5_1_2_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_187);
+            rule__Transition__Group_5_1_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0__0"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0__0__Impl"
+    // InternalFormalML.g:45271:1: rule__Transition__Group_5_1_2_0__0__Impl : ( '{' ) ;
+    public final void rule__Transition__Group_5_1_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45275:1: ( ( '{' ) )
+            // InternalFormalML.g:45276:1: ( '{' )
+            {
+            // InternalFormalML.g:45276:1: ( '{' )
+            // InternalFormalML.g:45277:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_1_2_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_1_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0__1"
+    // InternalFormalML.g:45286:1: rule__Transition__Group_5_1_2_0__1 : rule__Transition__Group_5_1_2_0__1__Impl rule__Transition__Group_5_1_2_0__2 ;
+    public final void rule__Transition__Group_5_1_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45290:1: ( rule__Transition__Group_5_1_2_0__1__Impl rule__Transition__Group_5_1_2_0__2 )
+            // InternalFormalML.g:45291:2: rule__Transition__Group_5_1_2_0__1__Impl rule__Transition__Group_5_1_2_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_187);
+            rule__Transition__Group_5_1_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0__1"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0__1__Impl"
+    // InternalFormalML.g:45298:1: rule__Transition__Group_5_1_2_0__1__Impl : ( ( rule__Transition__Alternatives_5_1_2_0_1 )? ) ;
+    public final void rule__Transition__Group_5_1_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45302:1: ( ( ( rule__Transition__Alternatives_5_1_2_0_1 )? ) )
+            // InternalFormalML.g:45303:1: ( ( rule__Transition__Alternatives_5_1_2_0_1 )? )
+            {
+            // InternalFormalML.g:45303:1: ( ( rule__Transition__Alternatives_5_1_2_0_1 )? )
+            // InternalFormalML.g:45304:2: ( rule__Transition__Alternatives_5_1_2_0_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1()); 
+            }
+            // InternalFormalML.g:45305:2: ( rule__Transition__Alternatives_5_1_2_0_1 )?
+            int alt612=2;
+            int LA612_0 = input.LA(1);
+
+            if ( (LA612_0==RULE_XLIA_ID||LA612_0==23||(LA612_0>=76 && LA612_0<=77)||(LA612_0>=80 && LA612_0<=95)||(LA612_0>=129 && LA612_0<=130)||(LA612_0>=141 && LA612_0<=142)||LA612_0==157||(LA612_0>=175 && LA612_0<=176)||(LA612_0>=178 && LA612_0<=196)||LA612_0==199||(LA612_0>=240 && LA612_0<=241)||(LA612_0>=244 && LA612_0<=249)||LA612_0==251||(LA612_0>=253 && LA612_0<=255)||(LA612_0>=261 && LA612_0<=262)||(LA612_0>=265 && LA612_0<=271)||(LA612_0>=284 && LA612_0<=285)) ) {
+                alt612=1;
+            }
+            else if ( (LA612_0==200) ) {
+                int LA612_2 = input.LA(2);
+
+                if ( (synpred899_InternalFormalML()) ) {
+                    alt612=1;
+                }
+            }
+            switch (alt612) {
+                case 1 :
+                    // InternalFormalML.g:45305:3: rule__Transition__Alternatives_5_1_2_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Alternatives_5_1_2_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0__2"
+    // InternalFormalML.g:45313:1: rule__Transition__Group_5_1_2_0__2 : rule__Transition__Group_5_1_2_0__2__Impl ;
+    public final void rule__Transition__Group_5_1_2_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45317:1: ( rule__Transition__Group_5_1_2_0__2__Impl )
+            // InternalFormalML.g:45318:2: rule__Transition__Group_5_1_2_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0__2"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0__2__Impl"
+    // InternalFormalML.g:45324:1: rule__Transition__Group_5_1_2_0__2__Impl : ( '}' ) ;
+    public final void rule__Transition__Group_5_1_2_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45328:1: ( ( '}' ) )
+            // InternalFormalML.g:45329:1: ( '}' )
+            {
+            // InternalFormalML.g:45329:1: ( '}' )
+            // InternalFormalML.g:45330:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_1_2_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_1_2_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0__2__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__0"
+    // InternalFormalML.g:45340:1: rule__Transition__Group_5_1_2_0_1_0__0 : rule__Transition__Group_5_1_2_0_1_0__0__Impl rule__Transition__Group_5_1_2_0_1_0__1 ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45344:1: ( rule__Transition__Group_5_1_2_0_1_0__0__Impl rule__Transition__Group_5_1_2_0_1_0__1 )
+            // InternalFormalML.g:45345:2: rule__Transition__Group_5_1_2_0_1_0__0__Impl rule__Transition__Group_5_1_2_0_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_189);
+            rule__Transition__Group_5_1_2_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__0"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__0__Impl"
+    // InternalFormalML.g:45352:1: rule__Transition__Group_5_1_2_0_1_0__0__Impl : ( ( rule__Transition__Group_5_1_2_0_1_0_0__0 )? ) ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45356:1: ( ( ( rule__Transition__Group_5_1_2_0_1_0_0__0 )? ) )
+            // InternalFormalML.g:45357:1: ( ( rule__Transition__Group_5_1_2_0_1_0_0__0 )? )
+            {
+            // InternalFormalML.g:45357:1: ( ( rule__Transition__Group_5_1_2_0_1_0_0__0 )? )
+            // InternalFormalML.g:45358:2: ( rule__Transition__Group_5_1_2_0_1_0_0__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0_0()); 
+            }
+            // InternalFormalML.g:45359:2: ( rule__Transition__Group_5_1_2_0_1_0_0__0 )?
+            int alt613=2;
+            int LA613_0 = input.LA(1);
+
+            if ( (LA613_0==241) ) {
+                alt613=1;
+            }
+            switch (alt613) {
+                case 1 :
+                    // InternalFormalML.g:45359:3: rule__Transition__Group_5_1_2_0_1_0_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Group_5_1_2_0_1_0_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getGroup_5_1_2_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__1"
+    // InternalFormalML.g:45367:1: rule__Transition__Group_5_1_2_0_1_0__1 : rule__Transition__Group_5_1_2_0_1_0__1__Impl rule__Transition__Group_5_1_2_0_1_0__2 ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45371:1: ( rule__Transition__Group_5_1_2_0_1_0__1__Impl rule__Transition__Group_5_1_2_0_1_0__2 )
+            // InternalFormalML.g:45372:2: rule__Transition__Group_5_1_2_0_1_0__1__Impl rule__Transition__Group_5_1_2_0_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_189);
+            rule__Transition__Group_5_1_2_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__1"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__1__Impl"
+    // InternalFormalML.g:45379:1: rule__Transition__Group_5_1_2_0_1_0__1__Impl : ( ( rule__Transition__Alternatives_5_1_2_0_1_0_1 )? ) ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45383:1: ( ( ( rule__Transition__Alternatives_5_1_2_0_1_0_1 )? ) )
+            // InternalFormalML.g:45384:1: ( ( rule__Transition__Alternatives_5_1_2_0_1_0_1 )? )
+            {
+            // InternalFormalML.g:45384:1: ( ( rule__Transition__Alternatives_5_1_2_0_1_0_1 )? )
+            // InternalFormalML.g:45385:2: ( rule__Transition__Alternatives_5_1_2_0_1_0_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_1()); 
+            }
+            // InternalFormalML.g:45386:2: ( rule__Transition__Alternatives_5_1_2_0_1_0_1 )?
+            int alt614=2;
+            int LA614_0 = input.LA(1);
+
+            if ( (LA614_0==76||LA614_0==244) ) {
+                alt614=1;
+            }
+            switch (alt614) {
+                case 1 :
+                    // InternalFormalML.g:45386:3: rule__Transition__Alternatives_5_1_2_0_1_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Alternatives_5_1_2_0_1_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__2"
+    // InternalFormalML.g:45394:1: rule__Transition__Group_5_1_2_0_1_0__2 : rule__Transition__Group_5_1_2_0_1_0__2__Impl rule__Transition__Group_5_1_2_0_1_0__3 ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45398:1: ( rule__Transition__Group_5_1_2_0_1_0__2__Impl rule__Transition__Group_5_1_2_0_1_0__3 )
+            // InternalFormalML.g:45399:2: rule__Transition__Group_5_1_2_0_1_0__2__Impl rule__Transition__Group_5_1_2_0_1_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_189);
+            rule__Transition__Group_5_1_2_0_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0_1_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__2"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__2__Impl"
+    // InternalFormalML.g:45406:1: rule__Transition__Group_5_1_2_0_1_0__2__Impl : ( ( rule__Transition__Alternatives_5_1_2_0_1_0_2 )? ) ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45410:1: ( ( ( rule__Transition__Alternatives_5_1_2_0_1_0_2 )? ) )
+            // InternalFormalML.g:45411:1: ( ( rule__Transition__Alternatives_5_1_2_0_1_0_2 )? )
+            {
+            // InternalFormalML.g:45411:1: ( ( rule__Transition__Alternatives_5_1_2_0_1_0_2 )? )
+            // InternalFormalML.g:45412:2: ( rule__Transition__Alternatives_5_1_2_0_1_0_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_2()); 
+            }
+            // InternalFormalML.g:45413:2: ( rule__Transition__Alternatives_5_1_2_0_1_0_2 )?
+            int alt615=2;
+            int LA615_0 = input.LA(1);
+
+            if ( (LA615_0==77||LA615_0==245) ) {
+                alt615=1;
+            }
+            switch (alt615) {
+                case 1 :
+                    // InternalFormalML.g:45413:3: rule__Transition__Alternatives_5_1_2_0_1_0_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__Alternatives_5_1_2_0_1_0_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getAlternatives_5_1_2_0_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__3"
+    // InternalFormalML.g:45421:1: rule__Transition__Group_5_1_2_0_1_0__3 : rule__Transition__Group_5_1_2_0_1_0__3__Impl rule__Transition__Group_5_1_2_0_1_0__4 ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45425:1: ( rule__Transition__Group_5_1_2_0_1_0__3__Impl rule__Transition__Group_5_1_2_0_1_0__4 )
+            // InternalFormalML.g:45426:2: rule__Transition__Group_5_1_2_0_1_0__3__Impl rule__Transition__Group_5_1_2_0_1_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_190);
+            rule__Transition__Group_5_1_2_0_1_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0_1_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__3"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__3__Impl"
+    // InternalFormalML.g:45433:1: rule__Transition__Group_5_1_2_0_1_0__3__Impl : ( '@effect:' ) ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45437:1: ( ( '@effect:' ) )
+            // InternalFormalML.g:45438:1: ( '@effect:' )
+            {
+            // InternalFormalML.g:45438:1: ( '@effect:' )
+            // InternalFormalML.g:45439:2: '@effect:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getEffectKeyword_5_1_2_0_1_0_3()); 
+            }
+            match(input,240,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getEffectKeyword_5_1_2_0_1_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__3__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__4"
+    // InternalFormalML.g:45448:1: rule__Transition__Group_5_1_2_0_1_0__4 : rule__Transition__Group_5_1_2_0_1_0__4__Impl ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45452:1: ( rule__Transition__Group_5_1_2_0_1_0__4__Impl )
+            // InternalFormalML.g:45453:2: rule__Transition__Group_5_1_2_0_1_0__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0_1_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__4"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0__4__Impl"
+    // InternalFormalML.g:45459:1: rule__Transition__Group_5_1_2_0_1_0__4__Impl : ( ( rule__Transition__EffectAssignment_5_1_2_0_1_0_4 )? ) ;
+    public final void rule__Transition__Group_5_1_2_0_1_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45463:1: ( ( ( rule__Transition__EffectAssignment_5_1_2_0_1_0_4 )? ) )
+            // InternalFormalML.g:45464:1: ( ( rule__Transition__EffectAssignment_5_1_2_0_1_0_4 )? )
+            {
+            // InternalFormalML.g:45464:1: ( ( rule__Transition__EffectAssignment_5_1_2_0_1_0_4 )? )
+            // InternalFormalML.g:45465:2: ( rule__Transition__EffectAssignment_5_1_2_0_1_0_4 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getEffectAssignment_5_1_2_0_1_0_4()); 
+            }
+            // InternalFormalML.g:45466:2: ( rule__Transition__EffectAssignment_5_1_2_0_1_0_4 )?
+            int alt616=2;
+            int LA616_0 = input.LA(1);
+
+            if ( (LA616_0==RULE_XLIA_ID||LA616_0==23||(LA616_0>=129 && LA616_0<=130)||(LA616_0>=141 && LA616_0<=142)||LA616_0==157||LA616_0==176||(LA616_0>=178 && LA616_0<=196)||LA616_0==251||(LA616_0>=253 && LA616_0<=255)||(LA616_0>=261 && LA616_0<=262)||(LA616_0>=265 && LA616_0<=271)||(LA616_0>=284 && LA616_0<=285)) ) {
+                alt616=1;
+            }
+            switch (alt616) {
+                case 1 :
+                    // InternalFormalML.g:45466:3: rule__Transition__EffectAssignment_5_1_2_0_1_0_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Transition__EffectAssignment_5_1_2_0_1_0_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getEffectAssignment_5_1_2_0_1_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0__4__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0_0__0"
+    // InternalFormalML.g:45475:1: rule__Transition__Group_5_1_2_0_1_0_0__0 : rule__Transition__Group_5_1_2_0_1_0_0__0__Impl rule__Transition__Group_5_1_2_0_1_0_0__1 ;
+    public final void rule__Transition__Group_5_1_2_0_1_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45479:1: ( rule__Transition__Group_5_1_2_0_1_0_0__0__Impl rule__Transition__Group_5_1_2_0_1_0_0__1 )
+            // InternalFormalML.g:45480:2: rule__Transition__Group_5_1_2_0_1_0_0__0__Impl rule__Transition__Group_5_1_2_0_1_0_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_191);
+            rule__Transition__Group_5_1_2_0_1_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0_1_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0_0__0"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0_0__0__Impl"
+    // InternalFormalML.g:45487:1: rule__Transition__Group_5_1_2_0_1_0_0__0__Impl : ( '@trigger:' ) ;
+    public final void rule__Transition__Group_5_1_2_0_1_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45491:1: ( ( '@trigger:' ) )
+            // InternalFormalML.g:45492:1: ( '@trigger:' )
+            {
+            // InternalFormalML.g:45492:1: ( '@trigger:' )
+            // InternalFormalML.g:45493:2: '@trigger:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTriggerKeyword_5_1_2_0_1_0_0_0()); 
+            }
+            match(input,241,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTriggerKeyword_5_1_2_0_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0_0__1"
+    // InternalFormalML.g:45502:1: rule__Transition__Group_5_1_2_0_1_0_0__1 : rule__Transition__Group_5_1_2_0_1_0_0__1__Impl ;
+    public final void rule__Transition__Group_5_1_2_0_1_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45506:1: ( rule__Transition__Group_5_1_2_0_1_0_0__1__Impl )
+            // InternalFormalML.g:45507:2: rule__Transition__Group_5_1_2_0_1_0_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Transition__Group_5_1_2_0_1_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0_0__1"
+
+
+    // $ANTLR start "rule__Transition__Group_5_1_2_0_1_0_0__1__Impl"
+    // InternalFormalML.g:45513:1: rule__Transition__Group_5_1_2_0_1_0_0__1__Impl : ( ( rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1 )* ) ;
+    public final void rule__Transition__Group_5_1_2_0_1_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45517:1: ( ( ( rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1 )* ) )
+            // InternalFormalML.g:45518:1: ( ( rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1 )* )
+            {
+            // InternalFormalML.g:45518:1: ( ( rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1 )* )
+            // InternalFormalML.g:45519:2: ( rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTriggerAssignment_5_1_2_0_1_0_0_1()); 
+            }
+            // InternalFormalML.g:45520:2: ( rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1 )*
+            loop617:
+            do {
+                int alt617=2;
+                int LA617_0 = input.LA(1);
+
+                if ( (LA617_0==175) ) {
+                    alt617=1;
+                }
+
+
+                switch (alt617) {
+            	case 1 :
+            	    // InternalFormalML.g:45520:3: rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_192);
+            	    rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop617;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTriggerAssignment_5_1_2_0_1_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__Group_5_1_2_0_1_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group__0"
+    // InternalFormalML.g:45529:1: rule__TransitionMoe__Group__0 : rule__TransitionMoe__Group__0__Impl rule__TransitionMoe__Group__1 ;
+    public final void rule__TransitionMoe__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45533:1: ( rule__TransitionMoe__Group__0__Impl rule__TransitionMoe__Group__1 )
+            // InternalFormalML.g:45534:2: rule__TransitionMoe__Group__0__Impl rule__TransitionMoe__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_194);
+            rule__TransitionMoe__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group__0"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group__0__Impl"
+    // InternalFormalML.g:45541:1: rule__TransitionMoe__Group__0__Impl : ( '<' ) ;
+    public final void rule__TransitionMoe__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45545:1: ( ( '<' ) )
+            // InternalFormalML.g:45546:1: ( '<' )
+            {
+            // InternalFormalML.g:45546:1: ( '<' )
+            // InternalFormalML.g:45547:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getLessThanSignKeyword_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getLessThanSignKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group__1"
+    // InternalFormalML.g:45556:1: rule__TransitionMoe__Group__1 : rule__TransitionMoe__Group__1__Impl rule__TransitionMoe__Group__2 ;
+    public final void rule__TransitionMoe__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45560:1: ( rule__TransitionMoe__Group__1__Impl rule__TransitionMoe__Group__2 )
+            // InternalFormalML.g:45561:2: rule__TransitionMoe__Group__1__Impl rule__TransitionMoe__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__TransitionMoe__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group__1"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group__1__Impl"
+    // InternalFormalML.g:45568:1: rule__TransitionMoe__Group__1__Impl : ( ( rule__TransitionMoe__Alternatives_1 ) ) ;
+    public final void rule__TransitionMoe__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45572:1: ( ( ( rule__TransitionMoe__Alternatives_1 ) ) )
+            // InternalFormalML.g:45573:1: ( ( rule__TransitionMoe__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:45573:1: ( ( rule__TransitionMoe__Alternatives_1 ) )
+            // InternalFormalML.g:45574:2: ( rule__TransitionMoe__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:45575:2: ( rule__TransitionMoe__Alternatives_1 )
+            // InternalFormalML.g:45575:3: rule__TransitionMoe__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group__2"
+    // InternalFormalML.g:45583:1: rule__TransitionMoe__Group__2 : rule__TransitionMoe__Group__2__Impl ;
+    public final void rule__TransitionMoe__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45587:1: ( rule__TransitionMoe__Group__2__Impl )
+            // InternalFormalML.g:45588:2: rule__TransitionMoe__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group__2"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group__2__Impl"
+    // InternalFormalML.g:45594:1: rule__TransitionMoe__Group__2__Impl : ( '>' ) ;
+    public final void rule__TransitionMoe__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45598:1: ( ( '>' ) )
+            // InternalFormalML.g:45599:1: ( '>' )
+            {
+            // InternalFormalML.g:45599:1: ( '>' )
+            // InternalFormalML.g:45600:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getGreaterThanSignKeyword_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getGreaterThanSignKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0__0"
+    // InternalFormalML.g:45610:1: rule__TransitionMoe__Group_1_0__0 : rule__TransitionMoe__Group_1_0__0__Impl rule__TransitionMoe__Group_1_0__1 ;
+    public final void rule__TransitionMoe__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45614:1: ( rule__TransitionMoe__Group_1_0__0__Impl rule__TransitionMoe__Group_1_0__1 )
+            // InternalFormalML.g:45615:2: rule__TransitionMoe__Group_1_0__0__Impl rule__TransitionMoe__Group_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_195);
+            rule__TransitionMoe__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0__0"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0__0__Impl"
+    // InternalFormalML.g:45622:1: rule__TransitionMoe__Group_1_0__0__Impl : ( ( 'moc:' )? ) ;
+    public final void rule__TransitionMoe__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45626:1: ( ( ( 'moc:' )? ) )
+            // InternalFormalML.g:45627:1: ( ( 'moc:' )? )
+            {
+            // InternalFormalML.g:45627:1: ( ( 'moc:' )? )
+            // InternalFormalML.g:45628:2: ( 'moc:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getMocKeyword_1_0_0()); 
+            }
+            // InternalFormalML.g:45629:2: ( 'moc:' )?
+            int alt618=2;
+            int LA618_0 = input.LA(1);
+
+            if ( (LA618_0==201) ) {
+                alt618=1;
+            }
+            switch (alt618) {
+                case 1 :
+                    // InternalFormalML.g:45629:3: 'moc:'
+                    {
+                    match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getMocKeyword_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0__1"
+    // InternalFormalML.g:45637:1: rule__TransitionMoe__Group_1_0__1 : rule__TransitionMoe__Group_1_0__1__Impl rule__TransitionMoe__Group_1_0__2 ;
+    public final void rule__TransitionMoe__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45641:1: ( rule__TransitionMoe__Group_1_0__1__Impl rule__TransitionMoe__Group_1_0__2 )
+            // InternalFormalML.g:45642:2: rule__TransitionMoe__Group_1_0__1__Impl rule__TransitionMoe__Group_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__TransitionMoe__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0__1"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0__1__Impl"
+    // InternalFormalML.g:45649:1: rule__TransitionMoe__Group_1_0__1__Impl : ( ( rule__TransitionMoe__Alternatives_1_0_1 ) ) ;
+    public final void rule__TransitionMoe__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45653:1: ( ( ( rule__TransitionMoe__Alternatives_1_0_1 ) ) )
+            // InternalFormalML.g:45654:1: ( ( rule__TransitionMoe__Alternatives_1_0_1 ) )
+            {
+            // InternalFormalML.g:45654:1: ( ( rule__TransitionMoe__Alternatives_1_0_1 ) )
+            // InternalFormalML.g:45655:2: ( rule__TransitionMoe__Alternatives_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getAlternatives_1_0_1()); 
+            }
+            // InternalFormalML.g:45656:2: ( rule__TransitionMoe__Alternatives_1_0_1 )
+            // InternalFormalML.g:45656:3: rule__TransitionMoe__Alternatives_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Alternatives_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getAlternatives_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0__2"
+    // InternalFormalML.g:45664:1: rule__TransitionMoe__Group_1_0__2 : rule__TransitionMoe__Group_1_0__2__Impl ;
+    public final void rule__TransitionMoe__Group_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45668:1: ( rule__TransitionMoe__Group_1_0__2__Impl )
+            // InternalFormalML.g:45669:2: rule__TransitionMoe__Group_1_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0__2"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0__2__Impl"
+    // InternalFormalML.g:45675:1: rule__TransitionMoe__Group_1_0__2__Impl : ( ( rule__TransitionMoe__Group_1_0_2__0 )? ) ;
+    public final void rule__TransitionMoe__Group_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45679:1: ( ( ( rule__TransitionMoe__Group_1_0_2__0 )? ) )
+            // InternalFormalML.g:45680:1: ( ( rule__TransitionMoe__Group_1_0_2__0 )? )
+            {
+            // InternalFormalML.g:45680:1: ( ( rule__TransitionMoe__Group_1_0_2__0 )? )
+            // InternalFormalML.g:45681:2: ( rule__TransitionMoe__Group_1_0_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getGroup_1_0_2()); 
+            }
+            // InternalFormalML.g:45682:2: ( rule__TransitionMoe__Group_1_0_2__0 )?
+            int alt619=2;
+            int LA619_0 = input.LA(1);
+
+            if ( (LA619_0==198) ) {
+                alt619=1;
+            }
+            switch (alt619) {
+                case 1 :
+                    // InternalFormalML.g:45682:3: rule__TransitionMoe__Group_1_0_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionMoe__Group_1_0_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getGroup_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_1_0__0"
+    // InternalFormalML.g:45691:1: rule__TransitionMoe__Group_1_0_1_0__0 : rule__TransitionMoe__Group_1_0_1_0__0__Impl rule__TransitionMoe__Group_1_0_1_0__1 ;
+    public final void rule__TransitionMoe__Group_1_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45695:1: ( rule__TransitionMoe__Group_1_0_1_0__0__Impl rule__TransitionMoe__Group_1_0_1_0__1 )
+            // InternalFormalML.g:45696:2: rule__TransitionMoe__Group_1_0_1_0__0__Impl rule__TransitionMoe__Group_1_0_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_196);
+            rule__TransitionMoe__Group_1_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_1_0__0"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_1_0__0__Impl"
+    // InternalFormalML.g:45703:1: rule__TransitionMoe__Group_1_0_1_0__0__Impl : ( ( rule__TransitionMoe__MocAssignment_1_0_1_0_0 ) ) ;
+    public final void rule__TransitionMoe__Group_1_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45707:1: ( ( ( rule__TransitionMoe__MocAssignment_1_0_1_0_0 ) ) )
+            // InternalFormalML.g:45708:1: ( ( rule__TransitionMoe__MocAssignment_1_0_1_0_0 ) )
+            {
+            // InternalFormalML.g:45708:1: ( ( rule__TransitionMoe__MocAssignment_1_0_1_0_0 ) )
+            // InternalFormalML.g:45709:2: ( rule__TransitionMoe__MocAssignment_1_0_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getMocAssignment_1_0_1_0_0()); 
+            }
+            // InternalFormalML.g:45710:2: ( rule__TransitionMoe__MocAssignment_1_0_1_0_0 )
+            // InternalFormalML.g:45710:3: rule__TransitionMoe__MocAssignment_1_0_1_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__MocAssignment_1_0_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getMocAssignment_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_1_0__1"
+    // InternalFormalML.g:45718:1: rule__TransitionMoe__Group_1_0_1_0__1 : rule__TransitionMoe__Group_1_0_1_0__1__Impl ;
+    public final void rule__TransitionMoe__Group_1_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45722:1: ( rule__TransitionMoe__Group_1_0_1_0__1__Impl )
+            // InternalFormalML.g:45723:2: rule__TransitionMoe__Group_1_0_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_1_0__1"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_1_0__1__Impl"
+    // InternalFormalML.g:45729:1: rule__TransitionMoe__Group_1_0_1_0__1__Impl : ( ( rule__TransitionMoe__Group_1_0_1_0_1__0 )? ) ;
+    public final void rule__TransitionMoe__Group_1_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45733:1: ( ( ( rule__TransitionMoe__Group_1_0_1_0_1__0 )? ) )
+            // InternalFormalML.g:45734:1: ( ( rule__TransitionMoe__Group_1_0_1_0_1__0 )? )
+            {
+            // InternalFormalML.g:45734:1: ( ( rule__TransitionMoe__Group_1_0_1_0_1__0 )? )
+            // InternalFormalML.g:45735:2: ( rule__TransitionMoe__Group_1_0_1_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0_1()); 
+            }
+            // InternalFormalML.g:45736:2: ( rule__TransitionMoe__Group_1_0_1_0_1__0 )?
+            int alt620=2;
+            int LA620_0 = input.LA(1);
+
+            if ( (LA620_0==242) ) {
+                alt620=1;
+            }
+            switch (alt620) {
+                case 1 :
+                    // InternalFormalML.g:45736:3: rule__TransitionMoe__Group_1_0_1_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionMoe__Group_1_0_1_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getGroup_1_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_1_0_1__0"
+    // InternalFormalML.g:45745:1: rule__TransitionMoe__Group_1_0_1_0_1__0 : rule__TransitionMoe__Group_1_0_1_0_1__0__Impl rule__TransitionMoe__Group_1_0_1_0_1__1 ;
+    public final void rule__TransitionMoe__Group_1_0_1_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45749:1: ( rule__TransitionMoe__Group_1_0_1_0_1__0__Impl rule__TransitionMoe__Group_1_0_1_0_1__1 )
+            // InternalFormalML.g:45750:2: rule__TransitionMoe__Group_1_0_1_0_1__0__Impl rule__TransitionMoe__Group_1_0_1_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_197);
+            rule__TransitionMoe__Group_1_0_1_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0_1_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_1_0_1__0"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_1_0_1__0__Impl"
+    // InternalFormalML.g:45757:1: rule__TransitionMoe__Group_1_0_1_0_1__0__Impl : ( '&' ) ;
+    public final void rule__TransitionMoe__Group_1_0_1_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45761:1: ( ( '&' ) )
+            // InternalFormalML.g:45762:1: ( '&' )
+            {
+            // InternalFormalML.g:45762:1: ( '&' )
+            // InternalFormalML.g:45763:2: '&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getAmpersandKeyword_1_0_1_0_1_0()); 
+            }
+            match(input,242,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getAmpersandKeyword_1_0_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_1_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_1_0_1__1"
+    // InternalFormalML.g:45772:1: rule__TransitionMoe__Group_1_0_1_0_1__1 : rule__TransitionMoe__Group_1_0_1_0_1__1__Impl ;
+    public final void rule__TransitionMoe__Group_1_0_1_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45776:1: ( rule__TransitionMoe__Group_1_0_1_0_1__1__Impl )
+            // InternalFormalML.g:45777:2: rule__TransitionMoe__Group_1_0_1_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0_1_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_1_0_1__1"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_1_0_1__1__Impl"
+    // InternalFormalML.g:45783:1: rule__TransitionMoe__Group_1_0_1_0_1__1__Impl : ( ( rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1 ) ) ;
+    public final void rule__TransitionMoe__Group_1_0_1_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45787:1: ( ( ( rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1 ) ) )
+            // InternalFormalML.g:45788:1: ( ( rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1 ) )
+            {
+            // InternalFormalML.g:45788:1: ( ( rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1 ) )
+            // InternalFormalML.g:45789:2: ( rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_0_1_1()); 
+            }
+            // InternalFormalML.g:45790:2: ( rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1 )
+            // InternalFormalML.g:45790:3: rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getIsElseAssignment_1_0_1_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_1_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_2__0"
+    // InternalFormalML.g:45799:1: rule__TransitionMoe__Group_1_0_2__0 : rule__TransitionMoe__Group_1_0_2__0__Impl rule__TransitionMoe__Group_1_0_2__1 ;
+    public final void rule__TransitionMoe__Group_1_0_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45803:1: ( rule__TransitionMoe__Group_1_0_2__0__Impl rule__TransitionMoe__Group_1_0_2__1 )
+            // InternalFormalML.g:45804:2: rule__TransitionMoe__Group_1_0_2__0__Impl rule__TransitionMoe__Group_1_0_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_198);
+            rule__TransitionMoe__Group_1_0_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_2__0"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_2__0__Impl"
+    // InternalFormalML.g:45811:1: rule__TransitionMoe__Group_1_0_2__0__Impl : ( ',' ) ;
+    public final void rule__TransitionMoe__Group_1_0_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45815:1: ( ( ',' ) )
+            // InternalFormalML.g:45816:1: ( ',' )
+            {
+            // InternalFormalML.g:45816:1: ( ',' )
+            // InternalFormalML.g:45817:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getCommaKeyword_1_0_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getCommaKeyword_1_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_2__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_2__1"
+    // InternalFormalML.g:45826:1: rule__TransitionMoe__Group_1_0_2__1 : rule__TransitionMoe__Group_1_0_2__1__Impl rule__TransitionMoe__Group_1_0_2__2 ;
+    public final void rule__TransitionMoe__Group_1_0_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45830:1: ( rule__TransitionMoe__Group_1_0_2__1__Impl rule__TransitionMoe__Group_1_0_2__2 )
+            // InternalFormalML.g:45831:2: rule__TransitionMoe__Group_1_0_2__1__Impl rule__TransitionMoe__Group_1_0_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_198);
+            rule__TransitionMoe__Group_1_0_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_2__1"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_2__1__Impl"
+    // InternalFormalML.g:45838:1: rule__TransitionMoe__Group_1_0_2__1__Impl : ( ( 'prior:' )? ) ;
+    public final void rule__TransitionMoe__Group_1_0_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45842:1: ( ( ( 'prior:' )? ) )
+            // InternalFormalML.g:45843:1: ( ( 'prior:' )? )
+            {
+            // InternalFormalML.g:45843:1: ( ( 'prior:' )? )
+            // InternalFormalML.g:45844:2: ( 'prior:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_0_2_1()); 
+            }
+            // InternalFormalML.g:45845:2: ( 'prior:' )?
+            int alt621=2;
+            int LA621_0 = input.LA(1);
+
+            if ( (LA621_0==243) ) {
+                alt621=1;
+            }
+            switch (alt621) {
+                case 1 :
+                    // InternalFormalML.g:45845:3: 'prior:'
+                    {
+                    match(input,243,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_0_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_2__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_2__2"
+    // InternalFormalML.g:45853:1: rule__TransitionMoe__Group_1_0_2__2 : rule__TransitionMoe__Group_1_0_2__2__Impl ;
+    public final void rule__TransitionMoe__Group_1_0_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45857:1: ( rule__TransitionMoe__Group_1_0_2__2__Impl )
+            // InternalFormalML.g:45858:2: rule__TransitionMoe__Group_1_0_2__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_0_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_2__2"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_0_2__2__Impl"
+    // InternalFormalML.g:45864:1: rule__TransitionMoe__Group_1_0_2__2__Impl : ( ( rule__TransitionMoe__PriorAssignment_1_0_2_2 ) ) ;
+    public final void rule__TransitionMoe__Group_1_0_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45868:1: ( ( ( rule__TransitionMoe__PriorAssignment_1_0_2_2 ) ) )
+            // InternalFormalML.g:45869:1: ( ( rule__TransitionMoe__PriorAssignment_1_0_2_2 ) )
+            {
+            // InternalFormalML.g:45869:1: ( ( rule__TransitionMoe__PriorAssignment_1_0_2_2 ) )
+            // InternalFormalML.g:45870:2: ( rule__TransitionMoe__PriorAssignment_1_0_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_0_2_2()); 
+            }
+            // InternalFormalML.g:45871:2: ( rule__TransitionMoe__PriorAssignment_1_0_2_2 )
+            // InternalFormalML.g:45871:3: rule__TransitionMoe__PriorAssignment_1_0_2_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__PriorAssignment_1_0_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_0_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_0_2__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_1__0"
+    // InternalFormalML.g:45880:1: rule__TransitionMoe__Group_1_1__0 : rule__TransitionMoe__Group_1_1__0__Impl rule__TransitionMoe__Group_1_1__1 ;
+    public final void rule__TransitionMoe__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45884:1: ( rule__TransitionMoe__Group_1_1__0__Impl rule__TransitionMoe__Group_1_1__1 )
+            // InternalFormalML.g:45885:2: rule__TransitionMoe__Group_1_1__0__Impl rule__TransitionMoe__Group_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_194);
+            rule__TransitionMoe__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_1__0"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_1__0__Impl"
+    // InternalFormalML.g:45892:1: rule__TransitionMoe__Group_1_1__0__Impl : ( ( 'prior:' )? ) ;
+    public final void rule__TransitionMoe__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45896:1: ( ( ( 'prior:' )? ) )
+            // InternalFormalML.g:45897:1: ( ( 'prior:' )? )
+            {
+            // InternalFormalML.g:45897:1: ( ( 'prior:' )? )
+            // InternalFormalML.g:45898:2: ( 'prior:' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:45899:2: ( 'prior:' )?
+            int alt622=2;
+            int LA622_0 = input.LA(1);
+
+            if ( (LA622_0==243) ) {
+                alt622=1;
+            }
+            switch (alt622) {
+                case 1 :
+                    // InternalFormalML.g:45899:3: 'prior:'
+                    {
+                    match(input,243,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_1__1"
+    // InternalFormalML.g:45907:1: rule__TransitionMoe__Group_1_1__1 : rule__TransitionMoe__Group_1_1__1__Impl ;
+    public final void rule__TransitionMoe__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45911:1: ( rule__TransitionMoe__Group_1_1__1__Impl )
+            // InternalFormalML.g:45912:2: rule__TransitionMoe__Group_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_1__1"
+
+
+    // $ANTLR start "rule__TransitionMoe__Group_1_1__1__Impl"
+    // InternalFormalML.g:45918:1: rule__TransitionMoe__Group_1_1__1__Impl : ( ( rule__TransitionMoe__PriorAssignment_1_1_1 ) ) ;
+    public final void rule__TransitionMoe__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45922:1: ( ( ( rule__TransitionMoe__PriorAssignment_1_1_1 ) ) )
+            // InternalFormalML.g:45923:1: ( ( rule__TransitionMoe__PriorAssignment_1_1_1 ) )
+            {
+            // InternalFormalML.g:45923:1: ( ( rule__TransitionMoe__PriorAssignment_1_1_1 ) )
+            // InternalFormalML.g:45924:2: ( rule__TransitionMoe__PriorAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_1_1()); 
+            }
+            // InternalFormalML.g:45925:2: ( rule__TransitionMoe__PriorAssignment_1_1_1 )
+            // InternalFormalML.g:45925:3: rule__TransitionMoe__PriorAssignment_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionMoe__PriorAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getPriorAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionBehavior__Group__0"
+    // InternalFormalML.g:45934:1: rule__TransitionBehavior__Group__0 : rule__TransitionBehavior__Group__0__Impl rule__TransitionBehavior__Group__1 ;
+    public final void rule__TransitionBehavior__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45938:1: ( rule__TransitionBehavior__Group__0__Impl rule__TransitionBehavior__Group__1 )
+            // InternalFormalML.g:45939:2: rule__TransitionBehavior__Group__0__Impl rule__TransitionBehavior__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_199);
+            rule__TransitionBehavior__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionBehavior__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionBehavior__Group__0"
+
+
+    // $ANTLR start "rule__TransitionBehavior__Group__0__Impl"
+    // InternalFormalML.g:45946:1: rule__TransitionBehavior__Group__0__Impl : ( () ) ;
+    public final void rule__TransitionBehavior__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45950:1: ( ( () ) )
+            // InternalFormalML.g:45951:1: ( () )
+            {
+            // InternalFormalML.g:45951:1: ( () )
+            // InternalFormalML.g:45952:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionBehaviorAccess().getBlockStatementAction_0()); 
+            }
+            // InternalFormalML.g:45953:2: ()
+            // InternalFormalML.g:45953:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionBehaviorAccess().getBlockStatementAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionBehavior__Group__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionBehavior__Group__1"
+    // InternalFormalML.g:45961:1: rule__TransitionBehavior__Group__1 : rule__TransitionBehavior__Group__1__Impl rule__TransitionBehavior__Group__2 ;
+    public final void rule__TransitionBehavior__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45965:1: ( rule__TransitionBehavior__Group__1__Impl rule__TransitionBehavior__Group__2 )
+            // InternalFormalML.g:45966:2: rule__TransitionBehavior__Group__1__Impl rule__TransitionBehavior__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_199);
+            rule__TransitionBehavior__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionBehavior__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionBehavior__Group__1"
+
+
+    // $ANTLR start "rule__TransitionBehavior__Group__1__Impl"
+    // InternalFormalML.g:45973:1: rule__TransitionBehavior__Group__1__Impl : ( ( rule__TransitionBehavior__OpAssignment_1 )? ) ;
+    public final void rule__TransitionBehavior__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45977:1: ( ( ( rule__TransitionBehavior__OpAssignment_1 )? ) )
+            // InternalFormalML.g:45978:1: ( ( rule__TransitionBehavior__OpAssignment_1 )? )
+            {
+            // InternalFormalML.g:45978:1: ( ( rule__TransitionBehavior__OpAssignment_1 )? )
+            // InternalFormalML.g:45979:2: ( rule__TransitionBehavior__OpAssignment_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionBehaviorAccess().getOpAssignment_1()); 
+            }
+            // InternalFormalML.g:45980:2: ( rule__TransitionBehavior__OpAssignment_1 )?
+            int alt623=2;
+            int LA623_0 = input.LA(1);
+
+            if ( ((LA623_0>=80 && LA623_0<=95)) ) {
+                alt623=1;
+            }
+            switch (alt623) {
+                case 1 :
+                    // InternalFormalML.g:45980:3: rule__TransitionBehavior__OpAssignment_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__TransitionBehavior__OpAssignment_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionBehaviorAccess().getOpAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionBehavior__Group__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionBehavior__Group__2"
+    // InternalFormalML.g:45988:1: rule__TransitionBehavior__Group__2 : rule__TransitionBehavior__Group__2__Impl ;
+    public final void rule__TransitionBehavior__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:45992:1: ( rule__TransitionBehavior__Group__2__Impl )
+            // InternalFormalML.g:45993:2: rule__TransitionBehavior__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionBehavior__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionBehavior__Group__2"
+
+
+    // $ANTLR start "rule__TransitionBehavior__Group__2__Impl"
+    // InternalFormalML.g:45999:1: rule__TransitionBehavior__Group__2__Impl : ( ( rule__TransitionBehavior__StatementAssignment_2 )* ) ;
+    public final void rule__TransitionBehavior__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46003:1: ( ( ( rule__TransitionBehavior__StatementAssignment_2 )* ) )
+            // InternalFormalML.g:46004:1: ( ( rule__TransitionBehavior__StatementAssignment_2 )* )
+            {
+            // InternalFormalML.g:46004:1: ( ( rule__TransitionBehavior__StatementAssignment_2 )* )
+            // InternalFormalML.g:46005:2: ( rule__TransitionBehavior__StatementAssignment_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionBehaviorAccess().getStatementAssignment_2()); 
+            }
+            // InternalFormalML.g:46006:2: ( rule__TransitionBehavior__StatementAssignment_2 )*
+            loop624:
+            do {
+                int alt624=2;
+                int LA624_0 = input.LA(1);
+
+                if ( (LA624_0==RULE_XLIA_ID||LA624_0==23||(LA624_0>=129 && LA624_0<=130)||(LA624_0>=141 && LA624_0<=142)||LA624_0==157||(LA624_0>=175 && LA624_0<=176)||(LA624_0>=178 && LA624_0<=196)||LA624_0==199||(LA624_0>=246 && LA624_0<=249)||LA624_0==251||(LA624_0>=253 && LA624_0<=255)||(LA624_0>=261 && LA624_0<=262)||(LA624_0>=265 && LA624_0<=271)||(LA624_0>=284 && LA624_0<=285)) ) {
+                    alt624=1;
+                }
+
+
+                switch (alt624) {
+            	case 1 :
+            	    // InternalFormalML.g:46006:3: rule__TransitionBehavior__StatementAssignment_2
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_200);
+            	    rule__TransitionBehavior__StatementAssignment_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop624;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionBehaviorAccess().getStatementAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionBehavior__Group__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_0__0"
+    // InternalFormalML.g:46015:1: rule__TransitionGuard__Group_0__0 : rule__TransitionGuard__Group_0__0__Impl rule__TransitionGuard__Group_0__1 ;
+    public final void rule__TransitionGuard__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46019:1: ( rule__TransitionGuard__Group_0__0__Impl rule__TransitionGuard__Group_0__1 )
+            // InternalFormalML.g:46020:2: rule__TransitionGuard__Group_0__0__Impl rule__TransitionGuard__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_201);
+            rule__TransitionGuard__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_0__0"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_0__0__Impl"
+    // InternalFormalML.g:46027:1: rule__TransitionGuard__Group_0__0__Impl : ( () ) ;
+    public final void rule__TransitionGuard__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46031:1: ( ( () ) )
+            // InternalFormalML.g:46032:1: ( () )
+            {
+            // InternalFormalML.g:46032:1: ( () )
+            // InternalFormalML.g:46033:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getGuardStatementAction_0_0()); 
+            }
+            // InternalFormalML.g:46034:2: ()
+            // InternalFormalML.g:46034:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getGuardStatementAction_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_0__1"
+    // InternalFormalML.g:46042:1: rule__TransitionGuard__Group_0__1 : rule__TransitionGuard__Group_0__1__Impl rule__TransitionGuard__Group_0__2 ;
+    public final void rule__TransitionGuard__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46046:1: ( rule__TransitionGuard__Group_0__1__Impl rule__TransitionGuard__Group_0__2 )
+            // InternalFormalML.g:46047:2: rule__TransitionGuard__Group_0__1__Impl rule__TransitionGuard__Group_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_202);
+            rule__TransitionGuard__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_0__1"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_0__1__Impl"
+    // InternalFormalML.g:46054:1: rule__TransitionGuard__Group_0__1__Impl : ( '@guard<' ) ;
+    public final void rule__TransitionGuard__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46058:1: ( ( '@guard<' ) )
+            // InternalFormalML.g:46059:1: ( '@guard<' )
+            {
+            // InternalFormalML.g:46059:1: ( '@guard<' )
+            // InternalFormalML.g:46060:2: '@guard<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getGuardKeyword_0_1()); 
+            }
+            match(input,244,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getGuardKeyword_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_0__2"
+    // InternalFormalML.g:46069:1: rule__TransitionGuard__Group_0__2 : rule__TransitionGuard__Group_0__2__Impl ;
+    public final void rule__TransitionGuard__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46073:1: ( rule__TransitionGuard__Group_0__2__Impl )
+            // InternalFormalML.g:46074:2: rule__TransitionGuard__Group_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_0__2"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_0__2__Impl"
+    // InternalFormalML.g:46080:1: rule__TransitionGuard__Group_0__2__Impl : ( ( rule__TransitionGuard__ConditionAssignment_0_2 ) ) ;
+    public final void rule__TransitionGuard__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46084:1: ( ( ( rule__TransitionGuard__ConditionAssignment_0_2 ) ) )
+            // InternalFormalML.g:46085:1: ( ( rule__TransitionGuard__ConditionAssignment_0_2 ) )
+            {
+            // InternalFormalML.g:46085:1: ( ( rule__TransitionGuard__ConditionAssignment_0_2 ) )
+            // InternalFormalML.g:46086:2: ( rule__TransitionGuard__ConditionAssignment_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getConditionAssignment_0_2()); 
+            }
+            // InternalFormalML.g:46087:2: ( rule__TransitionGuard__ConditionAssignment_0_2 )
+            // InternalFormalML.g:46087:3: rule__TransitionGuard__ConditionAssignment_0_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__ConditionAssignment_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getConditionAssignment_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1__0"
+    // InternalFormalML.g:46096:1: rule__TransitionGuard__Group_1__0 : rule__TransitionGuard__Group_1__0__Impl rule__TransitionGuard__Group_1__1 ;
+    public final void rule__TransitionGuard__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46100:1: ( rule__TransitionGuard__Group_1__0__Impl rule__TransitionGuard__Group_1__1 )
+            // InternalFormalML.g:46101:2: rule__TransitionGuard__Group_1__0__Impl rule__TransitionGuard__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_203);
+            rule__TransitionGuard__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1__0"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1__0__Impl"
+    // InternalFormalML.g:46108:1: rule__TransitionGuard__Group_1__0__Impl : ( '@guard:' ) ;
+    public final void rule__TransitionGuard__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46112:1: ( ( '@guard:' ) )
+            // InternalFormalML.g:46113:1: ( '@guard:' )
+            {
+            // InternalFormalML.g:46113:1: ( '@guard:' )
+            // InternalFormalML.g:46114:2: '@guard:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getGuardKeyword_1_0()); 
+            }
+            match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getGuardKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1__1"
+    // InternalFormalML.g:46123:1: rule__TransitionGuard__Group_1__1 : rule__TransitionGuard__Group_1__1__Impl ;
+    public final void rule__TransitionGuard__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46127:1: ( rule__TransitionGuard__Group_1__1__Impl )
+            // InternalFormalML.g:46128:2: rule__TransitionGuard__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1__1"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1__1__Impl"
+    // InternalFormalML.g:46134:1: rule__TransitionGuard__Group_1__1__Impl : ( ( rule__TransitionGuard__Alternatives_1_1 ) ) ;
+    public final void rule__TransitionGuard__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46138:1: ( ( ( rule__TransitionGuard__Alternatives_1_1 ) ) )
+            // InternalFormalML.g:46139:1: ( ( rule__TransitionGuard__Alternatives_1_1 ) )
+            {
+            // InternalFormalML.g:46139:1: ( ( rule__TransitionGuard__Alternatives_1_1 ) )
+            // InternalFormalML.g:46140:2: ( rule__TransitionGuard__Alternatives_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1()); 
+            }
+            // InternalFormalML.g:46141:2: ( rule__TransitionGuard__Alternatives_1_1 )
+            // InternalFormalML.g:46141:3: rule__TransitionGuard__Alternatives_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Alternatives_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0__0"
+    // InternalFormalML.g:46150:1: rule__TransitionGuard__Group_1_1_0__0 : rule__TransitionGuard__Group_1_1_0__0__Impl rule__TransitionGuard__Group_1_1_0__1 ;
+    public final void rule__TransitionGuard__Group_1_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46154:1: ( rule__TransitionGuard__Group_1_1_0__0__Impl rule__TransitionGuard__Group_1_1_0__1 )
+            // InternalFormalML.g:46155:2: rule__TransitionGuard__Group_1_1_0__0__Impl rule__TransitionGuard__Group_1_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_204);
+            rule__TransitionGuard__Group_1_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_1_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0__0"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0__0__Impl"
+    // InternalFormalML.g:46162:1: rule__TransitionGuard__Group_1_1_0__0__Impl : ( () ) ;
+    public final void rule__TransitionGuard__Group_1_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46166:1: ( ( () ) )
+            // InternalFormalML.g:46167:1: ( () )
+            {
+            // InternalFormalML.g:46167:1: ( () )
+            // InternalFormalML.g:46168:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getGuardStatementAction_1_1_0_0()); 
+            }
+            // InternalFormalML.g:46169:2: ()
+            // InternalFormalML.g:46169:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getGuardStatementAction_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0__1"
+    // InternalFormalML.g:46177:1: rule__TransitionGuard__Group_1_1_0__1 : rule__TransitionGuard__Group_1_1_0__1__Impl ;
+    public final void rule__TransitionGuard__Group_1_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46181:1: ( rule__TransitionGuard__Group_1_1_0__1__Impl )
+            // InternalFormalML.g:46182:2: rule__TransitionGuard__Group_1_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_1_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0__1"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0__1__Impl"
+    // InternalFormalML.g:46188:1: rule__TransitionGuard__Group_1_1_0__1__Impl : ( ( rule__TransitionGuard__Alternatives_1_1_0_1 ) ) ;
+    public final void rule__TransitionGuard__Group_1_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46192:1: ( ( ( rule__TransitionGuard__Alternatives_1_1_0_1 ) ) )
+            // InternalFormalML.g:46193:1: ( ( rule__TransitionGuard__Alternatives_1_1_0_1 ) )
+            {
+            // InternalFormalML.g:46193:1: ( ( rule__TransitionGuard__Alternatives_1_1_0_1 ) )
+            // InternalFormalML.g:46194:2: ( rule__TransitionGuard__Alternatives_1_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1_0_1()); 
+            }
+            // InternalFormalML.g:46195:2: ( rule__TransitionGuard__Alternatives_1_1_0_1 )
+            // InternalFormalML.g:46195:3: rule__TransitionGuard__Alternatives_1_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Alternatives_1_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getAlternatives_1_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0_1_0__0"
+    // InternalFormalML.g:46204:1: rule__TransitionGuard__Group_1_1_0_1_0__0 : rule__TransitionGuard__Group_1_1_0_1_0__0__Impl rule__TransitionGuard__Group_1_1_0_1_0__1 ;
+    public final void rule__TransitionGuard__Group_1_1_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46208:1: ( rule__TransitionGuard__Group_1_1_0_1_0__0__Impl rule__TransitionGuard__Group_1_1_0_1_0__1 )
+            // InternalFormalML.g:46209:2: rule__TransitionGuard__Group_1_1_0_1_0__0__Impl rule__TransitionGuard__Group_1_1_0_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__TransitionGuard__Group_1_1_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_1_1_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0_1_0__0"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0_1_0__0__Impl"
+    // InternalFormalML.g:46216:1: rule__TransitionGuard__Group_1_1_0_1_0__0__Impl : ( '[' ) ;
+    public final void rule__TransitionGuard__Group_1_1_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46220:1: ( ( '[' ) )
+            // InternalFormalML.g:46221:1: ( '[' )
+            {
+            // InternalFormalML.g:46221:1: ( '[' )
+            // InternalFormalML.g:46222:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getLeftSquareBracketKeyword_1_1_0_1_0_0()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getLeftSquareBracketKeyword_1_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0_1_0__1"
+    // InternalFormalML.g:46231:1: rule__TransitionGuard__Group_1_1_0_1_0__1 : rule__TransitionGuard__Group_1_1_0_1_0__1__Impl rule__TransitionGuard__Group_1_1_0_1_0__2 ;
+    public final void rule__TransitionGuard__Group_1_1_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46235:1: ( rule__TransitionGuard__Group_1_1_0_1_0__1__Impl rule__TransitionGuard__Group_1_1_0_1_0__2 )
+            // InternalFormalML.g:46236:2: rule__TransitionGuard__Group_1_1_0_1_0__1__Impl rule__TransitionGuard__Group_1_1_0_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__TransitionGuard__Group_1_1_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_1_1_0_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0_1_0__1"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0_1_0__1__Impl"
+    // InternalFormalML.g:46243:1: rule__TransitionGuard__Group_1_1_0_1_0__1__Impl : ( ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1 ) ) ;
+    public final void rule__TransitionGuard__Group_1_1_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46247:1: ( ( ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1 ) ) )
+            // InternalFormalML.g:46248:1: ( ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1 ) )
+            {
+            // InternalFormalML.g:46248:1: ( ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1 ) )
+            // InternalFormalML.g:46249:2: ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_0_1()); 
+            }
+            // InternalFormalML.g:46250:2: ( rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1 )
+            // InternalFormalML.g:46250:3: rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getConditionAssignment_1_1_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0_1_0__2"
+    // InternalFormalML.g:46258:1: rule__TransitionGuard__Group_1_1_0_1_0__2 : rule__TransitionGuard__Group_1_1_0_1_0__2__Impl ;
+    public final void rule__TransitionGuard__Group_1_1_0_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46262:1: ( rule__TransitionGuard__Group_1_1_0_1_0__2__Impl )
+            // InternalFormalML.g:46263:2: rule__TransitionGuard__Group_1_1_0_1_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuard__Group_1_1_0_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0_1_0__2"
+
+
+    // $ANTLR start "rule__TransitionGuard__Group_1_1_0_1_0__2__Impl"
+    // InternalFormalML.g:46269:1: rule__TransitionGuard__Group_1_1_0_1_0__2__Impl : ( ']' ) ;
+    public final void rule__TransitionGuard__Group_1_1_0_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46273:1: ( ( ']' ) )
+            // InternalFormalML.g:46274:1: ( ']' )
+            {
+            // InternalFormalML.g:46274:1: ( ']' )
+            // InternalFormalML.g:46275:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getRightSquareBracketKeyword_1_1_0_1_0_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getRightSquareBracketKeyword_1_1_0_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__Group_1_1_0_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__Group__0"
+    // InternalFormalML.g:46285:1: rule__TransitionGuardExpression__Group__0 : rule__TransitionGuardExpression__Group__0__Impl rule__TransitionGuardExpression__Group__1 ;
+    public final void rule__TransitionGuardExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46289:1: ( rule__TransitionGuardExpression__Group__0__Impl rule__TransitionGuardExpression__Group__1 )
+            // InternalFormalML.g:46290:2: rule__TransitionGuardExpression__Group__0__Impl rule__TransitionGuardExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_202);
+            rule__TransitionGuardExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuardExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__Group__0"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__Group__0__Impl"
+    // InternalFormalML.g:46297:1: rule__TransitionGuardExpression__Group__0__Impl : ( () ) ;
+    public final void rule__TransitionGuardExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46301:1: ( ( () ) )
+            // InternalFormalML.g:46302:1: ( () )
+            {
+            // InternalFormalML.g:46302:1: ( () )
+            // InternalFormalML.g:46303:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardExpressionAccess().getLogicalAssociativeExpressionAction_0()); 
+            }
+            // InternalFormalML.g:46304:2: ()
+            // InternalFormalML.g:46304:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardExpressionAccess().getLogicalAssociativeExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__Group__1"
+    // InternalFormalML.g:46312:1: rule__TransitionGuardExpression__Group__1 : rule__TransitionGuardExpression__Group__1__Impl rule__TransitionGuardExpression__Group__2 ;
+    public final void rule__TransitionGuardExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46316:1: ( rule__TransitionGuardExpression__Group__1__Impl rule__TransitionGuardExpression__Group__2 )
+            // InternalFormalML.g:46317:2: rule__TransitionGuardExpression__Group__1__Impl rule__TransitionGuardExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_12);
+            rule__TransitionGuardExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuardExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__Group__1"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__Group__1__Impl"
+    // InternalFormalML.g:46324:1: rule__TransitionGuardExpression__Group__1__Impl : ( ( rule__TransitionGuardExpression__OperatorAssignment_1 ) ) ;
+    public final void rule__TransitionGuardExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46328:1: ( ( ( rule__TransitionGuardExpression__OperatorAssignment_1 ) ) )
+            // InternalFormalML.g:46329:1: ( ( rule__TransitionGuardExpression__OperatorAssignment_1 ) )
+            {
+            // InternalFormalML.g:46329:1: ( ( rule__TransitionGuardExpression__OperatorAssignment_1 ) )
+            // InternalFormalML.g:46330:2: ( rule__TransitionGuardExpression__OperatorAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAssignment_1()); 
+            }
+            // InternalFormalML.g:46331:2: ( rule__TransitionGuardExpression__OperatorAssignment_1 )
+            // InternalFormalML.g:46331:3: rule__TransitionGuardExpression__OperatorAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuardExpression__OperatorAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__Group__2"
+    // InternalFormalML.g:46339:1: rule__TransitionGuardExpression__Group__2 : rule__TransitionGuardExpression__Group__2__Impl rule__TransitionGuardExpression__Group__3 ;
+    public final void rule__TransitionGuardExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46343:1: ( rule__TransitionGuardExpression__Group__2__Impl rule__TransitionGuardExpression__Group__3 )
+            // InternalFormalML.g:46344:2: rule__TransitionGuardExpression__Group__2__Impl rule__TransitionGuardExpression__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__TransitionGuardExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuardExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__Group__2"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__Group__2__Impl"
+    // InternalFormalML.g:46351:1: rule__TransitionGuardExpression__Group__2__Impl : ( '>:' ) ;
+    public final void rule__TransitionGuardExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46355:1: ( ( '>:' ) )
+            // InternalFormalML.g:46356:1: ( '>:' )
+            {
+            // InternalFormalML.g:46356:1: ( '>:' )
+            // InternalFormalML.g:46357:2: '>:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardExpressionAccess().getGreaterThanSignColonKeyword_2()); 
+            }
+            match(input,197,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardExpressionAccess().getGreaterThanSignColonKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__Group__3"
+    // InternalFormalML.g:46366:1: rule__TransitionGuardExpression__Group__3 : rule__TransitionGuardExpression__Group__3__Impl ;
+    public final void rule__TransitionGuardExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46370:1: ( rule__TransitionGuardExpression__Group__3__Impl )
+            // InternalFormalML.g:46371:2: rule__TransitionGuardExpression__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuardExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__Group__3"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__Group__3__Impl"
+    // InternalFormalML.g:46377:1: rule__TransitionGuardExpression__Group__3__Impl : ( ( ( rule__TransitionGuardExpression__OperandAssignment_3 ) ) ( ( rule__TransitionGuardExpression__OperandAssignment_3 )* ) ) ;
+    public final void rule__TransitionGuardExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46381:1: ( ( ( ( rule__TransitionGuardExpression__OperandAssignment_3 ) ) ( ( rule__TransitionGuardExpression__OperandAssignment_3 )* ) ) )
+            // InternalFormalML.g:46382:1: ( ( ( rule__TransitionGuardExpression__OperandAssignment_3 ) ) ( ( rule__TransitionGuardExpression__OperandAssignment_3 )* ) )
+            {
+            // InternalFormalML.g:46382:1: ( ( ( rule__TransitionGuardExpression__OperandAssignment_3 ) ) ( ( rule__TransitionGuardExpression__OperandAssignment_3 )* ) )
+            // InternalFormalML.g:46383:2: ( ( rule__TransitionGuardExpression__OperandAssignment_3 ) ) ( ( rule__TransitionGuardExpression__OperandAssignment_3 )* )
+            {
+            // InternalFormalML.g:46383:2: ( ( rule__TransitionGuardExpression__OperandAssignment_3 ) )
+            // InternalFormalML.g:46384:3: ( rule__TransitionGuardExpression__OperandAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardExpressionAccess().getOperandAssignment_3()); 
+            }
+            // InternalFormalML.g:46385:3: ( rule__TransitionGuardExpression__OperandAssignment_3 )
+            // InternalFormalML.g:46385:4: rule__TransitionGuardExpression__OperandAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_205);
+            rule__TransitionGuardExpression__OperandAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardExpressionAccess().getOperandAssignment_3()); 
+            }
+
+            }
+
+            // InternalFormalML.g:46388:2: ( ( rule__TransitionGuardExpression__OperandAssignment_3 )* )
+            // InternalFormalML.g:46389:3: ( rule__TransitionGuardExpression__OperandAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardExpressionAccess().getOperandAssignment_3()); 
+            }
+            // InternalFormalML.g:46390:3: ( rule__TransitionGuardExpression__OperandAssignment_3 )*
+            loop625:
+            do {
+                int alt625=2;
+                int LA625_0 = input.LA(1);
+
+                if ( ((LA625_0>=RULE_CHARACTER && LA625_0<=RULE_INT)||LA625_0==20||LA625_0==23||(LA625_0>=29 && LA625_0<=30)||LA625_0==125||(LA625_0>=129 && LA625_0<=134)||(LA625_0>=137 && LA625_0<=142)||LA625_0==199||(LA625_0>=261 && LA625_0<=271)||LA625_0==287) ) {
+                    alt625=1;
+                }
+
+
+                switch (alt625) {
+            	case 1 :
+            	    // InternalFormalML.g:46390:4: rule__TransitionGuardExpression__OperandAssignment_3
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_205);
+            	    rule__TransitionGuardExpression__OperandAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop625;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardExpressionAccess().getOperandAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_0__0"
+    // InternalFormalML.g:46400:1: rule__TransitionTimedGuard__Group_0__0 : rule__TransitionTimedGuard__Group_0__0__Impl rule__TransitionTimedGuard__Group_0__1 ;
+    public final void rule__TransitionTimedGuard__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46404:1: ( rule__TransitionTimedGuard__Group_0__0__Impl rule__TransitionTimedGuard__Group_0__1 )
+            // InternalFormalML.g:46405:2: rule__TransitionTimedGuard__Group_0__0__Impl rule__TransitionTimedGuard__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_206);
+            rule__TransitionTimedGuard__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_0__0"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_0__0__Impl"
+    // InternalFormalML.g:46412:1: rule__TransitionTimedGuard__Group_0__0__Impl : ( () ) ;
+    public final void rule__TransitionTimedGuard__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46416:1: ( ( () ) )
+            // InternalFormalML.g:46417:1: ( () )
+            {
+            // InternalFormalML.g:46417:1: ( () )
+            // InternalFormalML.g:46418:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_0_0()); 
+            }
+            // InternalFormalML.g:46419:2: ()
+            // InternalFormalML.g:46419:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_0__1"
+    // InternalFormalML.g:46427:1: rule__TransitionTimedGuard__Group_0__1 : rule__TransitionTimedGuard__Group_0__1__Impl rule__TransitionTimedGuard__Group_0__2 ;
+    public final void rule__TransitionTimedGuard__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46431:1: ( rule__TransitionTimedGuard__Group_0__1__Impl rule__TransitionTimedGuard__Group_0__2 )
+            // InternalFormalML.g:46432:2: rule__TransitionTimedGuard__Group_0__1__Impl rule__TransitionTimedGuard__Group_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_202);
+            rule__TransitionTimedGuard__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_0__1"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_0__1__Impl"
+    // InternalFormalML.g:46439:1: rule__TransitionTimedGuard__Group_0__1__Impl : ( '@tguard<' ) ;
+    public final void rule__TransitionTimedGuard__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46443:1: ( ( '@tguard<' ) )
+            // InternalFormalML.g:46444:1: ( '@tguard<' )
+            {
+            // InternalFormalML.g:46444:1: ( '@tguard<' )
+            // InternalFormalML.g:46445:2: '@tguard<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_0_1()); 
+            }
+            match(input,245,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_0__2"
+    // InternalFormalML.g:46454:1: rule__TransitionTimedGuard__Group_0__2 : rule__TransitionTimedGuard__Group_0__2__Impl ;
+    public final void rule__TransitionTimedGuard__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46458:1: ( rule__TransitionTimedGuard__Group_0__2__Impl )
+            // InternalFormalML.g:46459:2: rule__TransitionTimedGuard__Group_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_0__2"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_0__2__Impl"
+    // InternalFormalML.g:46465:1: rule__TransitionTimedGuard__Group_0__2__Impl : ( ( rule__TransitionTimedGuard__ConditionAssignment_0_2 ) ) ;
+    public final void rule__TransitionTimedGuard__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46469:1: ( ( ( rule__TransitionTimedGuard__ConditionAssignment_0_2 ) ) )
+            // InternalFormalML.g:46470:1: ( ( rule__TransitionTimedGuard__ConditionAssignment_0_2 ) )
+            {
+            // InternalFormalML.g:46470:1: ( ( rule__TransitionTimedGuard__ConditionAssignment_0_2 ) )
+            // InternalFormalML.g:46471:2: ( rule__TransitionTimedGuard__ConditionAssignment_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_0_2()); 
+            }
+            // InternalFormalML.g:46472:2: ( rule__TransitionTimedGuard__ConditionAssignment_0_2 )
+            // InternalFormalML.g:46472:3: rule__TransitionTimedGuard__ConditionAssignment_0_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__ConditionAssignment_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1__0"
+    // InternalFormalML.g:46481:1: rule__TransitionTimedGuard__Group_1__0 : rule__TransitionTimedGuard__Group_1__0__Impl rule__TransitionTimedGuard__Group_1__1 ;
+    public final void rule__TransitionTimedGuard__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46485:1: ( rule__TransitionTimedGuard__Group_1__0__Impl rule__TransitionTimedGuard__Group_1__1 )
+            // InternalFormalML.g:46486:2: rule__TransitionTimedGuard__Group_1__0__Impl rule__TransitionTimedGuard__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_207);
+            rule__TransitionTimedGuard__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1__0"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1__0__Impl"
+    // InternalFormalML.g:46493:1: rule__TransitionTimedGuard__Group_1__0__Impl : ( '@tguard:' ) ;
+    public final void rule__TransitionTimedGuard__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46497:1: ( ( '@tguard:' ) )
+            // InternalFormalML.g:46498:1: ( '@tguard:' )
+            {
+            // InternalFormalML.g:46498:1: ( '@tguard:' )
+            // InternalFormalML.g:46499:2: '@tguard:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_1_0()); 
+            }
+            match(input,77,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1__1"
+    // InternalFormalML.g:46508:1: rule__TransitionTimedGuard__Group_1__1 : rule__TransitionTimedGuard__Group_1__1__Impl ;
+    public final void rule__TransitionTimedGuard__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46512:1: ( rule__TransitionTimedGuard__Group_1__1__Impl )
+            // InternalFormalML.g:46513:2: rule__TransitionTimedGuard__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1__1"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1__1__Impl"
+    // InternalFormalML.g:46519:1: rule__TransitionTimedGuard__Group_1__1__Impl : ( ( rule__TransitionTimedGuard__Alternatives_1_1 ) ) ;
+    public final void rule__TransitionTimedGuard__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46523:1: ( ( ( rule__TransitionTimedGuard__Alternatives_1_1 ) ) )
+            // InternalFormalML.g:46524:1: ( ( rule__TransitionTimedGuard__Alternatives_1_1 ) )
+            {
+            // InternalFormalML.g:46524:1: ( ( rule__TransitionTimedGuard__Alternatives_1_1 ) )
+            // InternalFormalML.g:46525:2: ( rule__TransitionTimedGuard__Alternatives_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1()); 
+            }
+            // InternalFormalML.g:46526:2: ( rule__TransitionTimedGuard__Alternatives_1_1 )
+            // InternalFormalML.g:46526:3: rule__TransitionTimedGuard__Alternatives_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Alternatives_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0__0"
+    // InternalFormalML.g:46535:1: rule__TransitionTimedGuard__Group_1_1_0__0 : rule__TransitionTimedGuard__Group_1_1_0__0__Impl rule__TransitionTimedGuard__Group_1_1_0__1 ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46539:1: ( rule__TransitionTimedGuard__Group_1_1_0__0__Impl rule__TransitionTimedGuard__Group_1_1_0__1 )
+            // InternalFormalML.g:46540:2: rule__TransitionTimedGuard__Group_1_1_0__0__Impl rule__TransitionTimedGuard__Group_1_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__TransitionTimedGuard__Group_1_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_1_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0__0"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0__0__Impl"
+    // InternalFormalML.g:46547:1: rule__TransitionTimedGuard__Group_1_1_0__0__Impl : ( () ) ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46551:1: ( ( () ) )
+            // InternalFormalML.g:46552:1: ( () )
+            {
+            // InternalFormalML.g:46552:1: ( () )
+            // InternalFormalML.g:46553:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_1_1_0_0()); 
+            }
+            // InternalFormalML.g:46554:2: ()
+            // InternalFormalML.g:46554:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0__1"
+    // InternalFormalML.g:46562:1: rule__TransitionTimedGuard__Group_1_1_0__1 : rule__TransitionTimedGuard__Group_1_1_0__1__Impl ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46566:1: ( rule__TransitionTimedGuard__Group_1_1_0__1__Impl )
+            // InternalFormalML.g:46567:2: rule__TransitionTimedGuard__Group_1_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_1_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0__1"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0__1__Impl"
+    // InternalFormalML.g:46573:1: rule__TransitionTimedGuard__Group_1_1_0__1__Impl : ( ( rule__TransitionTimedGuard__Alternatives_1_1_0_1 ) ) ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46577:1: ( ( ( rule__TransitionTimedGuard__Alternatives_1_1_0_1 ) ) )
+            // InternalFormalML.g:46578:1: ( ( rule__TransitionTimedGuard__Alternatives_1_1_0_1 ) )
+            {
+            // InternalFormalML.g:46578:1: ( ( rule__TransitionTimedGuard__Alternatives_1_1_0_1 ) )
+            // InternalFormalML.g:46579:2: ( rule__TransitionTimedGuard__Alternatives_1_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1_0_1()); 
+            }
+            // InternalFormalML.g:46580:2: ( rule__TransitionTimedGuard__Alternatives_1_1_0_1 )
+            // InternalFormalML.g:46580:3: rule__TransitionTimedGuard__Alternatives_1_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Alternatives_1_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getAlternatives_1_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0_1_0__0"
+    // InternalFormalML.g:46589:1: rule__TransitionTimedGuard__Group_1_1_0_1_0__0 : rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl rule__TransitionTimedGuard__Group_1_1_0_1_0__1 ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46593:1: ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl rule__TransitionTimedGuard__Group_1_1_0_1_0__1 )
+            // InternalFormalML.g:46594:2: rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl rule__TransitionTimedGuard__Group_1_1_0_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_1_1_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0_1_0__0"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl"
+    // InternalFormalML.g:46601:1: rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl : ( '{' ) ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46605:1: ( ( '{' ) )
+            // InternalFormalML.g:46606:1: ( '{' )
+            {
+            // InternalFormalML.g:46606:1: ( '{' )
+            // InternalFormalML.g:46607:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getLeftCurlyBracketKeyword_1_1_0_1_0_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getLeftCurlyBracketKeyword_1_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0_1_0__1"
+    // InternalFormalML.g:46616:1: rule__TransitionTimedGuard__Group_1_1_0_1_0__1 : rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl rule__TransitionTimedGuard__Group_1_1_0_1_0__2 ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46620:1: ( rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl rule__TransitionTimedGuard__Group_1_1_0_1_0__2 )
+            // InternalFormalML.g:46621:2: rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl rule__TransitionTimedGuard__Group_1_1_0_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_36);
+            rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_1_1_0_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0_1_0__1"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl"
+    // InternalFormalML.g:46628:1: rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl : ( ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1 ) ) ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46632:1: ( ( ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1 ) ) )
+            // InternalFormalML.g:46633:1: ( ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1 ) )
+            {
+            // InternalFormalML.g:46633:1: ( ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1 ) )
+            // InternalFormalML.g:46634:2: ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_0_1()); 
+            }
+            // InternalFormalML.g:46635:2: ( rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1 )
+            // InternalFormalML.g:46635:3: rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getConditionAssignment_1_1_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0_1_0__2"
+    // InternalFormalML.g:46643:1: rule__TransitionTimedGuard__Group_1_1_0_1_0__2 : rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46647:1: ( rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl )
+            // InternalFormalML.g:46648:2: rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0_1_0__2"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl"
+    // InternalFormalML.g:46654:1: rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl : ( '}' ) ;
+    public final void rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46658:1: ( ( '}' ) )
+            // InternalFormalML.g:46659:1: ( '}' )
+            {
+            // InternalFormalML.g:46659:1: ( '}' )
+            // InternalFormalML.g:46660:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getRightCurlyBracketKeyword_1_1_0_1_0_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getRightCurlyBracketKeyword_1_1_0_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__Group_1_1_0_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__TransitionEffect__Group__0"
+    // InternalFormalML.g:46670:1: rule__TransitionEffect__Group__0 : rule__TransitionEffect__Group__0__Impl rule__TransitionEffect__Group__1 ;
+    public final void rule__TransitionEffect__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46674:1: ( rule__TransitionEffect__Group__0__Impl rule__TransitionEffect__Group__1 )
+            // InternalFormalML.g:46675:2: rule__TransitionEffect__Group__0__Impl rule__TransitionEffect__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_190);
+            rule__TransitionEffect__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionEffect__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffect__Group__0"
+
+
+    // $ANTLR start "rule__TransitionEffect__Group__0__Impl"
+    // InternalFormalML.g:46682:1: rule__TransitionEffect__Group__0__Impl : ( ruleTransitionEffectStatement ) ;
+    public final void rule__TransitionEffect__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46686:1: ( ( ruleTransitionEffectStatement ) )
+            // InternalFormalML.g:46687:1: ( ruleTransitionEffectStatement )
+            {
+            // InternalFormalML.g:46687:1: ( ruleTransitionEffectStatement )
+            // InternalFormalML.g:46688:2: ruleTransitionEffectStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionEffectAccess().getTransitionEffectStatementParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionEffectStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionEffectAccess().getTransitionEffectStatementParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffect__Group__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionEffect__Group__1"
+    // InternalFormalML.g:46697:1: rule__TransitionEffect__Group__1 : rule__TransitionEffect__Group__1__Impl ;
+    public final void rule__TransitionEffect__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46701:1: ( rule__TransitionEffect__Group__1__Impl )
+            // InternalFormalML.g:46702:2: rule__TransitionEffect__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionEffect__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffect__Group__1"
+
+
+    // $ANTLR start "rule__TransitionEffect__Group__1__Impl"
+    // InternalFormalML.g:46708:1: rule__TransitionEffect__Group__1__Impl : ( ( rule__TransitionEffect__Group_1__0 )* ) ;
+    public final void rule__TransitionEffect__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46712:1: ( ( ( rule__TransitionEffect__Group_1__0 )* ) )
+            // InternalFormalML.g:46713:1: ( ( rule__TransitionEffect__Group_1__0 )* )
+            {
+            // InternalFormalML.g:46713:1: ( ( rule__TransitionEffect__Group_1__0 )* )
+            // InternalFormalML.g:46714:2: ( rule__TransitionEffect__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionEffectAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:46715:2: ( rule__TransitionEffect__Group_1__0 )*
+            loop626:
+            do {
+                int alt626=2;
+                int LA626_0 = input.LA(1);
+
+                if ( (LA626_0==RULE_XLIA_ID||LA626_0==23||(LA626_0>=129 && LA626_0<=130)||(LA626_0>=141 && LA626_0<=142)||LA626_0==157||LA626_0==176||(LA626_0>=178 && LA626_0<=196)||LA626_0==251||(LA626_0>=253 && LA626_0<=255)||(LA626_0>=261 && LA626_0<=262)||(LA626_0>=265 && LA626_0<=271)||(LA626_0>=284 && LA626_0<=285)) ) {
+                    alt626=1;
+                }
+
+
+                switch (alt626) {
+            	case 1 :
+            	    // InternalFormalML.g:46715:3: rule__TransitionEffect__Group_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_200);
+            	    rule__TransitionEffect__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop626;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionEffectAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffect__Group__1__Impl"
+
+
+    // $ANTLR start "rule__TransitionEffect__Group_1__0"
+    // InternalFormalML.g:46724:1: rule__TransitionEffect__Group_1__0 : rule__TransitionEffect__Group_1__0__Impl rule__TransitionEffect__Group_1__1 ;
+    public final void rule__TransitionEffect__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46728:1: ( rule__TransitionEffect__Group_1__0__Impl rule__TransitionEffect__Group_1__1 )
+            // InternalFormalML.g:46729:2: rule__TransitionEffect__Group_1__0__Impl rule__TransitionEffect__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_190);
+            rule__TransitionEffect__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionEffect__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffect__Group_1__0"
+
+
+    // $ANTLR start "rule__TransitionEffect__Group_1__0__Impl"
+    // InternalFormalML.g:46736:1: rule__TransitionEffect__Group_1__0__Impl : ( () ) ;
+    public final void rule__TransitionEffect__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46740:1: ( ( () ) )
+            // InternalFormalML.g:46741:1: ( () )
+            {
+            // InternalFormalML.g:46741:1: ( () )
+            // InternalFormalML.g:46742:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionEffectAccess().getBlockStatementStatementAction_1_0()); 
+            }
+            // InternalFormalML.g:46743:2: ()
+            // InternalFormalML.g:46743:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionEffectAccess().getBlockStatementStatementAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffect__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__TransitionEffect__Group_1__1"
+    // InternalFormalML.g:46751:1: rule__TransitionEffect__Group_1__1 : rule__TransitionEffect__Group_1__1__Impl ;
+    public final void rule__TransitionEffect__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46755:1: ( rule__TransitionEffect__Group_1__1__Impl )
+            // InternalFormalML.g:46756:2: rule__TransitionEffect__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionEffect__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffect__Group_1__1"
+
+
+    // $ANTLR start "rule__TransitionEffect__Group_1__1__Impl"
+    // InternalFormalML.g:46762:1: rule__TransitionEffect__Group_1__1__Impl : ( ( rule__TransitionEffect__StatementAssignment_1_1 ) ) ;
+    public final void rule__TransitionEffect__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46766:1: ( ( ( rule__TransitionEffect__StatementAssignment_1_1 ) ) )
+            // InternalFormalML.g:46767:1: ( ( rule__TransitionEffect__StatementAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:46767:1: ( ( rule__TransitionEffect__StatementAssignment_1_1 ) )
+            // InternalFormalML.g:46768:2: ( rule__TransitionEffect__StatementAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionEffectAccess().getStatementAssignment_1_1()); 
+            }
+            // InternalFormalML.g:46769:2: ( rule__TransitionEffect__StatementAssignment_1_1 )
+            // InternalFormalML.g:46769:3: rule__TransitionEffect__StatementAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionEffect__StatementAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionEffectAccess().getStatementAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffect__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__0"
+    // InternalFormalML.g:46778:1: rule__BlockStatement__Group__0 : rule__BlockStatement__Group__0__Impl rule__BlockStatement__Group__1 ;
+    public final void rule__BlockStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46782:1: ( rule__BlockStatement__Group__0__Impl rule__BlockStatement__Group__1 )
+            // InternalFormalML.g:46783:2: rule__BlockStatement__Group__0__Impl rule__BlockStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__BlockStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BlockStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__0"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__0__Impl"
+    // InternalFormalML.g:46790:1: rule__BlockStatement__Group__0__Impl : ( () ) ;
+    public final void rule__BlockStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46794:1: ( ( () ) )
+            // InternalFormalML.g:46795:1: ( () )
+            {
+            // InternalFormalML.g:46795:1: ( () )
+            // InternalFormalML.g:46796:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementAccess().getBlockStatementAction_0()); 
+            }
+            // InternalFormalML.g:46797:2: ()
+            // InternalFormalML.g:46797:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementAccess().getBlockStatementAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__1"
+    // InternalFormalML.g:46805:1: rule__BlockStatement__Group__1 : rule__BlockStatement__Group__1__Impl rule__BlockStatement__Group__2 ;
+    public final void rule__BlockStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46809:1: ( rule__BlockStatement__Group__1__Impl rule__BlockStatement__Group__2 )
+            // InternalFormalML.g:46810:2: rule__BlockStatement__Group__1__Impl rule__BlockStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_208);
+            rule__BlockStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BlockStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__1"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__1__Impl"
+    // InternalFormalML.g:46817:1: rule__BlockStatement__Group__1__Impl : ( '{' ) ;
+    public final void rule__BlockStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46821:1: ( ( '{' ) )
+            // InternalFormalML.g:46822:1: ( '{' )
+            {
+            // InternalFormalML.g:46822:1: ( '{' )
+            // InternalFormalML.g:46823:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementAccess().getLeftCurlyBracketKeyword_1()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementAccess().getLeftCurlyBracketKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__2"
+    // InternalFormalML.g:46832:1: rule__BlockStatement__Group__2 : rule__BlockStatement__Group__2__Impl rule__BlockStatement__Group__3 ;
+    public final void rule__BlockStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46836:1: ( rule__BlockStatement__Group__2__Impl rule__BlockStatement__Group__3 )
+            // InternalFormalML.g:46837:2: rule__BlockStatement__Group__2__Impl rule__BlockStatement__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_208);
+            rule__BlockStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BlockStatement__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__2"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__2__Impl"
+    // InternalFormalML.g:46844:1: rule__BlockStatement__Group__2__Impl : ( ( rule__BlockStatement__OpAssignment_2 )? ) ;
+    public final void rule__BlockStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46848:1: ( ( ( rule__BlockStatement__OpAssignment_2 )? ) )
+            // InternalFormalML.g:46849:1: ( ( rule__BlockStatement__OpAssignment_2 )? )
+            {
+            // InternalFormalML.g:46849:1: ( ( rule__BlockStatement__OpAssignment_2 )? )
+            // InternalFormalML.g:46850:2: ( rule__BlockStatement__OpAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementAccess().getOpAssignment_2()); 
+            }
+            // InternalFormalML.g:46851:2: ( rule__BlockStatement__OpAssignment_2 )?
+            int alt627=2;
+            int LA627_0 = input.LA(1);
+
+            if ( ((LA627_0>=80 && LA627_0<=95)) ) {
+                alt627=1;
+            }
+            switch (alt627) {
+                case 1 :
+                    // InternalFormalML.g:46851:3: rule__BlockStatement__OpAssignment_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BlockStatement__OpAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementAccess().getOpAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__3"
+    // InternalFormalML.g:46859:1: rule__BlockStatement__Group__3 : rule__BlockStatement__Group__3__Impl rule__BlockStatement__Group__4 ;
+    public final void rule__BlockStatement__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46863:1: ( rule__BlockStatement__Group__3__Impl rule__BlockStatement__Group__4 )
+            // InternalFormalML.g:46864:2: rule__BlockStatement__Group__3__Impl rule__BlockStatement__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_208);
+            rule__BlockStatement__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BlockStatement__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__3"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__3__Impl"
+    // InternalFormalML.g:46871:1: rule__BlockStatement__Group__3__Impl : ( ( rule__BlockStatement__StatementAssignment_3 )* ) ;
+    public final void rule__BlockStatement__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46875:1: ( ( ( rule__BlockStatement__StatementAssignment_3 )* ) )
+            // InternalFormalML.g:46876:1: ( ( rule__BlockStatement__StatementAssignment_3 )* )
+            {
+            // InternalFormalML.g:46876:1: ( ( rule__BlockStatement__StatementAssignment_3 )* )
+            // InternalFormalML.g:46877:2: ( rule__BlockStatement__StatementAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementAccess().getStatementAssignment_3()); 
+            }
+            // InternalFormalML.g:46878:2: ( rule__BlockStatement__StatementAssignment_3 )*
+            loop628:
+            do {
+                int alt628=2;
+                int LA628_0 = input.LA(1);
+
+                if ( (LA628_0==RULE_XLIA_ID||LA628_0==23||(LA628_0>=129 && LA628_0<=130)||(LA628_0>=141 && LA628_0<=142)||LA628_0==157||(LA628_0>=175 && LA628_0<=176)||(LA628_0>=178 && LA628_0<=196)||LA628_0==199||(LA628_0>=246 && LA628_0<=249)||LA628_0==251||(LA628_0>=253 && LA628_0<=255)||(LA628_0>=261 && LA628_0<=262)||(LA628_0>=265 && LA628_0<=271)||(LA628_0>=284 && LA628_0<=285)) ) {
+                    alt628=1;
+                }
+
+
+                switch (alt628) {
+            	case 1 :
+            	    // InternalFormalML.g:46878:3: rule__BlockStatement__StatementAssignment_3
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_200);
+            	    rule__BlockStatement__StatementAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop628;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementAccess().getStatementAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__3__Impl"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__4"
+    // InternalFormalML.g:46886:1: rule__BlockStatement__Group__4 : rule__BlockStatement__Group__4__Impl ;
+    public final void rule__BlockStatement__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46890:1: ( rule__BlockStatement__Group__4__Impl )
+            // InternalFormalML.g:46891:2: rule__BlockStatement__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BlockStatement__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__4"
+
+
+    // $ANTLR start "rule__BlockStatement__Group__4__Impl"
+    // InternalFormalML.g:46897:1: rule__BlockStatement__Group__4__Impl : ( '}' ) ;
+    public final void rule__BlockStatement__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46901:1: ( ( '}' ) )
+            // InternalFormalML.g:46902:1: ( '}' )
+            {
+            // InternalFormalML.g:46902:1: ( '}' )
+            // InternalFormalML.g:46903:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_0__0"
+    // InternalFormalML.g:46913:1: rule__ExpressionStatement__Group_0__0 : rule__ExpressionStatement__Group_0__0__Impl rule__ExpressionStatement__Group_0__1 ;
+    public final void rule__ExpressionStatement__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46917:1: ( rule__ExpressionStatement__Group_0__0__Impl rule__ExpressionStatement__Group_0__1 )
+            // InternalFormalML.g:46918:2: rule__ExpressionStatement__Group_0__0__Impl rule__ExpressionStatement__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ExpressionStatement__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_0__0"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_0__0__Impl"
+    // InternalFormalML.g:46925:1: rule__ExpressionStatement__Group_0__0__Impl : ( ( rule__ExpressionStatement__ExpressionAssignment_0_0 ) ) ;
+    public final void rule__ExpressionStatement__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46929:1: ( ( ( rule__ExpressionStatement__ExpressionAssignment_0_0 ) ) )
+            // InternalFormalML.g:46930:1: ( ( rule__ExpressionStatement__ExpressionAssignment_0_0 ) )
+            {
+            // InternalFormalML.g:46930:1: ( ( rule__ExpressionStatement__ExpressionAssignment_0_0 ) )
+            // InternalFormalML.g:46931:2: ( rule__ExpressionStatement__ExpressionAssignment_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_0_0()); 
+            }
+            // InternalFormalML.g:46932:2: ( rule__ExpressionStatement__ExpressionAssignment_0_0 )
+            // InternalFormalML.g:46932:3: rule__ExpressionStatement__ExpressionAssignment_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__ExpressionAssignment_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_0__1"
+    // InternalFormalML.g:46940:1: rule__ExpressionStatement__Group_0__1 : rule__ExpressionStatement__Group_0__1__Impl ;
+    public final void rule__ExpressionStatement__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46944:1: ( rule__ExpressionStatement__Group_0__1__Impl )
+            // InternalFormalML.g:46945:2: rule__ExpressionStatement__Group_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_0__1"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_0__1__Impl"
+    // InternalFormalML.g:46951:1: rule__ExpressionStatement__Group_0__1__Impl : ( ';' ) ;
+    public final void rule__ExpressionStatement__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46955:1: ( ( ';' ) )
+            // InternalFormalML.g:46956:1: ( ';' )
+            {
+            // InternalFormalML.g:46956:1: ( ';' )
+            // InternalFormalML.g:46957:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_0_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_1__0"
+    // InternalFormalML.g:46967:1: rule__ExpressionStatement__Group_1__0 : rule__ExpressionStatement__Group_1__0__Impl rule__ExpressionStatement__Group_1__1 ;
+    public final void rule__ExpressionStatement__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46971:1: ( rule__ExpressionStatement__Group_1__0__Impl rule__ExpressionStatement__Group_1__1 )
+            // InternalFormalML.g:46972:2: rule__ExpressionStatement__Group_1__0__Impl rule__ExpressionStatement__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ExpressionStatement__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_1__0"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_1__0__Impl"
+    // InternalFormalML.g:46979:1: rule__ExpressionStatement__Group_1__0__Impl : ( ( rule__ExpressionStatement__ExpressionAssignment_1_0 ) ) ;
+    public final void rule__ExpressionStatement__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46983:1: ( ( ( rule__ExpressionStatement__ExpressionAssignment_1_0 ) ) )
+            // InternalFormalML.g:46984:1: ( ( rule__ExpressionStatement__ExpressionAssignment_1_0 ) )
+            {
+            // InternalFormalML.g:46984:1: ( ( rule__ExpressionStatement__ExpressionAssignment_1_0 ) )
+            // InternalFormalML.g:46985:2: ( rule__ExpressionStatement__ExpressionAssignment_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_1_0()); 
+            }
+            // InternalFormalML.g:46986:2: ( rule__ExpressionStatement__ExpressionAssignment_1_0 )
+            // InternalFormalML.g:46986:3: rule__ExpressionStatement__ExpressionAssignment_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__ExpressionAssignment_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_1__1"
+    // InternalFormalML.g:46994:1: rule__ExpressionStatement__Group_1__1 : rule__ExpressionStatement__Group_1__1__Impl ;
+    public final void rule__ExpressionStatement__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:46998:1: ( rule__ExpressionStatement__Group_1__1__Impl )
+            // InternalFormalML.g:46999:2: rule__ExpressionStatement__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_1__1"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_1__1__Impl"
+    // InternalFormalML.g:47005:1: rule__ExpressionStatement__Group_1__1__Impl : ( ';' ) ;
+    public final void rule__ExpressionStatement__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47009:1: ( ( ';' ) )
+            // InternalFormalML.g:47010:1: ( ';' )
+            {
+            // InternalFormalML.g:47010:1: ( ';' )
+            // InternalFormalML.g:47011:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_1_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_2__0"
+    // InternalFormalML.g:47021:1: rule__ExpressionStatement__Group_2__0 : rule__ExpressionStatement__Group_2__0__Impl rule__ExpressionStatement__Group_2__1 ;
+    public final void rule__ExpressionStatement__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47025:1: ( rule__ExpressionStatement__Group_2__0__Impl rule__ExpressionStatement__Group_2__1 )
+            // InternalFormalML.g:47026:2: rule__ExpressionStatement__Group_2__0__Impl rule__ExpressionStatement__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ExpressionStatement__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_2__0"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_2__0__Impl"
+    // InternalFormalML.g:47033:1: rule__ExpressionStatement__Group_2__0__Impl : ( ( rule__ExpressionStatement__ExpressionAssignment_2_0 ) ) ;
+    public final void rule__ExpressionStatement__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47037:1: ( ( ( rule__ExpressionStatement__ExpressionAssignment_2_0 ) ) )
+            // InternalFormalML.g:47038:1: ( ( rule__ExpressionStatement__ExpressionAssignment_2_0 ) )
+            {
+            // InternalFormalML.g:47038:1: ( ( rule__ExpressionStatement__ExpressionAssignment_2_0 ) )
+            // InternalFormalML.g:47039:2: ( rule__ExpressionStatement__ExpressionAssignment_2_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_2_0()); 
+            }
+            // InternalFormalML.g:47040:2: ( rule__ExpressionStatement__ExpressionAssignment_2_0 )
+            // InternalFormalML.g:47040:3: rule__ExpressionStatement__ExpressionAssignment_2_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__ExpressionAssignment_2_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_2__1"
+    // InternalFormalML.g:47048:1: rule__ExpressionStatement__Group_2__1 : rule__ExpressionStatement__Group_2__1__Impl ;
+    public final void rule__ExpressionStatement__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47052:1: ( rule__ExpressionStatement__Group_2__1__Impl )
+            // InternalFormalML.g:47053:2: rule__ExpressionStatement__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_2__1"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_2__1__Impl"
+    // InternalFormalML.g:47059:1: rule__ExpressionStatement__Group_2__1__Impl : ( ';' ) ;
+    public final void rule__ExpressionStatement__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47063:1: ( ( ';' ) )
+            // InternalFormalML.g:47064:1: ( ';' )
+            {
+            // InternalFormalML.g:47064:1: ( ';' )
+            // InternalFormalML.g:47065:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_2_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_3__0"
+    // InternalFormalML.g:47075:1: rule__ExpressionStatement__Group_3__0 : rule__ExpressionStatement__Group_3__0__Impl rule__ExpressionStatement__Group_3__1 ;
+    public final void rule__ExpressionStatement__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47079:1: ( rule__ExpressionStatement__Group_3__0__Impl rule__ExpressionStatement__Group_3__1 )
+            // InternalFormalML.g:47080:2: rule__ExpressionStatement__Group_3__0__Impl rule__ExpressionStatement__Group_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ExpressionStatement__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_3__0"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_3__0__Impl"
+    // InternalFormalML.g:47087:1: rule__ExpressionStatement__Group_3__0__Impl : ( ( rule__ExpressionStatement__ExpressionAssignment_3_0 ) ) ;
+    public final void rule__ExpressionStatement__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47091:1: ( ( ( rule__ExpressionStatement__ExpressionAssignment_3_0 ) ) )
+            // InternalFormalML.g:47092:1: ( ( rule__ExpressionStatement__ExpressionAssignment_3_0 ) )
+            {
+            // InternalFormalML.g:47092:1: ( ( rule__ExpressionStatement__ExpressionAssignment_3_0 ) )
+            // InternalFormalML.g:47093:2: ( rule__ExpressionStatement__ExpressionAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_3_0()); 
+            }
+            // InternalFormalML.g:47094:2: ( rule__ExpressionStatement__ExpressionAssignment_3_0 )
+            // InternalFormalML.g:47094:3: rule__ExpressionStatement__ExpressionAssignment_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__ExpressionAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getExpressionAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_3__1"
+    // InternalFormalML.g:47102:1: rule__ExpressionStatement__Group_3__1 : rule__ExpressionStatement__Group_3__1__Impl ;
+    public final void rule__ExpressionStatement__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47106:1: ( rule__ExpressionStatement__Group_3__1__Impl )
+            // InternalFormalML.g:47107:2: rule__ExpressionStatement__Group_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ExpressionStatement__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_3__1"
+
+
+    // $ANTLR start "rule__ExpressionStatement__Group_3__1__Impl"
+    // InternalFormalML.g:47113:1: rule__ExpressionStatement__Group_3__1__Impl : ( ';' ) ;
+    public final void rule__ExpressionStatement__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47117:1: ( ( ';' ) )
+            // InternalFormalML.g:47118:1: ( ';' )
+            {
+            // InternalFormalML.g:47118:1: ( ';' )
+            // InternalFormalML.g:47119:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_3_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__GuardStatement__Group__0"
+    // InternalFormalML.g:47129:1: rule__GuardStatement__Group__0 : rule__GuardStatement__Group__0__Impl rule__GuardStatement__Group__1 ;
+    public final void rule__GuardStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47133:1: ( rule__GuardStatement__Group__0__Impl rule__GuardStatement__Group__1 )
+            // InternalFormalML.g:47134:2: rule__GuardStatement__Group__0__Impl rule__GuardStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__GuardStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__GuardStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardStatement__Group__0"
+
+
+    // $ANTLR start "rule__GuardStatement__Group__0__Impl"
+    // InternalFormalML.g:47141:1: rule__GuardStatement__Group__0__Impl : ( 'guard' ) ;
+    public final void rule__GuardStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47145:1: ( ( 'guard' ) )
+            // InternalFormalML.g:47146:1: ( 'guard' )
+            {
+            // InternalFormalML.g:47146:1: ( 'guard' )
+            // InternalFormalML.g:47147:2: 'guard'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGuardStatementAccess().getGuardKeyword_0()); 
+            }
+            match(input,246,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGuardStatementAccess().getGuardKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__GuardStatement__Group__1"
+    // InternalFormalML.g:47156:1: rule__GuardStatement__Group__1 : rule__GuardStatement__Group__1__Impl rule__GuardStatement__Group__2 ;
+    public final void rule__GuardStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47160:1: ( rule__GuardStatement__Group__1__Impl rule__GuardStatement__Group__2 )
+            // InternalFormalML.g:47161:2: rule__GuardStatement__Group__1__Impl rule__GuardStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__GuardStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__GuardStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardStatement__Group__1"
+
+
+    // $ANTLR start "rule__GuardStatement__Group__1__Impl"
+    // InternalFormalML.g:47168:1: rule__GuardStatement__Group__1__Impl : ( ( rule__GuardStatement__ConditionAssignment_1 ) ) ;
+    public final void rule__GuardStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47172:1: ( ( ( rule__GuardStatement__ConditionAssignment_1 ) ) )
+            // InternalFormalML.g:47173:1: ( ( rule__GuardStatement__ConditionAssignment_1 ) )
+            {
+            // InternalFormalML.g:47173:1: ( ( rule__GuardStatement__ConditionAssignment_1 ) )
+            // InternalFormalML.g:47174:2: ( rule__GuardStatement__ConditionAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGuardStatementAccess().getConditionAssignment_1()); 
+            }
+            // InternalFormalML.g:47175:2: ( rule__GuardStatement__ConditionAssignment_1 )
+            // InternalFormalML.g:47175:3: rule__GuardStatement__ConditionAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__GuardStatement__ConditionAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGuardStatementAccess().getConditionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__GuardStatement__Group__2"
+    // InternalFormalML.g:47183:1: rule__GuardStatement__Group__2 : rule__GuardStatement__Group__2__Impl ;
+    public final void rule__GuardStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47187:1: ( rule__GuardStatement__Group__2__Impl )
+            // InternalFormalML.g:47188:2: rule__GuardStatement__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__GuardStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardStatement__Group__2"
+
+
+    // $ANTLR start "rule__GuardStatement__Group__2__Impl"
+    // InternalFormalML.g:47194:1: rule__GuardStatement__Group__2__Impl : ( ';' ) ;
+    public final void rule__GuardStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47198:1: ( ( ';' ) )
+            // InternalFormalML.g:47199:1: ( ';' )
+            {
+            // InternalFormalML.g:47199:1: ( ';' )
+            // InternalFormalML.g:47200:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGuardStatementAccess().getSemicolonKeyword_2()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGuardStatementAccess().getSemicolonKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__TimedGuardStatement__Group__0"
+    // InternalFormalML.g:47210:1: rule__TimedGuardStatement__Group__0 : rule__TimedGuardStatement__Group__0__Impl rule__TimedGuardStatement__Group__1 ;
+    public final void rule__TimedGuardStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47214:1: ( rule__TimedGuardStatement__Group__0__Impl rule__TimedGuardStatement__Group__1 )
+            // InternalFormalML.g:47215:2: rule__TimedGuardStatement__Group__0__Impl rule__TimedGuardStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__TimedGuardStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TimedGuardStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TimedGuardStatement__Group__0"
+
+
+    // $ANTLR start "rule__TimedGuardStatement__Group__0__Impl"
+    // InternalFormalML.g:47222:1: rule__TimedGuardStatement__Group__0__Impl : ( 'tguard' ) ;
+    public final void rule__TimedGuardStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47226:1: ( ( 'tguard' ) )
+            // InternalFormalML.g:47227:1: ( 'tguard' )
+            {
+            // InternalFormalML.g:47227:1: ( 'tguard' )
+            // InternalFormalML.g:47228:2: 'tguard'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTimedGuardStatementAccess().getTguardKeyword_0()); 
+            }
+            match(input,247,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTimedGuardStatementAccess().getTguardKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TimedGuardStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__TimedGuardStatement__Group__1"
+    // InternalFormalML.g:47237:1: rule__TimedGuardStatement__Group__1 : rule__TimedGuardStatement__Group__1__Impl rule__TimedGuardStatement__Group__2 ;
+    public final void rule__TimedGuardStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47241:1: ( rule__TimedGuardStatement__Group__1__Impl rule__TimedGuardStatement__Group__2 )
+            // InternalFormalML.g:47242:2: rule__TimedGuardStatement__Group__1__Impl rule__TimedGuardStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__TimedGuardStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TimedGuardStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TimedGuardStatement__Group__1"
+
+
+    // $ANTLR start "rule__TimedGuardStatement__Group__1__Impl"
+    // InternalFormalML.g:47249:1: rule__TimedGuardStatement__Group__1__Impl : ( ( rule__TimedGuardStatement__ConditionAssignment_1 ) ) ;
+    public final void rule__TimedGuardStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47253:1: ( ( ( rule__TimedGuardStatement__ConditionAssignment_1 ) ) )
+            // InternalFormalML.g:47254:1: ( ( rule__TimedGuardStatement__ConditionAssignment_1 ) )
+            {
+            // InternalFormalML.g:47254:1: ( ( rule__TimedGuardStatement__ConditionAssignment_1 ) )
+            // InternalFormalML.g:47255:2: ( rule__TimedGuardStatement__ConditionAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTimedGuardStatementAccess().getConditionAssignment_1()); 
+            }
+            // InternalFormalML.g:47256:2: ( rule__TimedGuardStatement__ConditionAssignment_1 )
+            // InternalFormalML.g:47256:3: rule__TimedGuardStatement__ConditionAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TimedGuardStatement__ConditionAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTimedGuardStatementAccess().getConditionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TimedGuardStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__TimedGuardStatement__Group__2"
+    // InternalFormalML.g:47264:1: rule__TimedGuardStatement__Group__2 : rule__TimedGuardStatement__Group__2__Impl ;
+    public final void rule__TimedGuardStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47268:1: ( rule__TimedGuardStatement__Group__2__Impl )
+            // InternalFormalML.g:47269:2: rule__TimedGuardStatement__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TimedGuardStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TimedGuardStatement__Group__2"
+
+
+    // $ANTLR start "rule__TimedGuardStatement__Group__2__Impl"
+    // InternalFormalML.g:47275:1: rule__TimedGuardStatement__Group__2__Impl : ( ';' ) ;
+    public final void rule__TimedGuardStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47279:1: ( ( ';' ) )
+            // InternalFormalML.g:47280:1: ( ';' )
+            {
+            // InternalFormalML.g:47280:1: ( ';' )
+            // InternalFormalML.g:47281:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTimedGuardStatementAccess().getSemicolonKeyword_2()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTimedGuardStatementAccess().getSemicolonKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TimedGuardStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EventGuardStatement__Group__0"
+    // InternalFormalML.g:47291:1: rule__EventGuardStatement__Group__0 : rule__EventGuardStatement__Group__0__Impl rule__EventGuardStatement__Group__1 ;
+    public final void rule__EventGuardStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47295:1: ( rule__EventGuardStatement__Group__0__Impl rule__EventGuardStatement__Group__1 )
+            // InternalFormalML.g:47296:2: rule__EventGuardStatement__Group__0__Impl rule__EventGuardStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__EventGuardStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EventGuardStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EventGuardStatement__Group__0"
+
+
+    // $ANTLR start "rule__EventGuardStatement__Group__0__Impl"
+    // InternalFormalML.g:47303:1: rule__EventGuardStatement__Group__0__Impl : ( 'event' ) ;
+    public final void rule__EventGuardStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47307:1: ( ( 'event' ) )
+            // InternalFormalML.g:47308:1: ( 'event' )
+            {
+            // InternalFormalML.g:47308:1: ( 'event' )
+            // InternalFormalML.g:47309:2: 'event'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEventGuardStatementAccess().getEventKeyword_0()); 
+            }
+            match(input,248,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEventGuardStatementAccess().getEventKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EventGuardStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EventGuardStatement__Group__1"
+    // InternalFormalML.g:47318:1: rule__EventGuardStatement__Group__1 : rule__EventGuardStatement__Group__1__Impl rule__EventGuardStatement__Group__2 ;
+    public final void rule__EventGuardStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47322:1: ( rule__EventGuardStatement__Group__1__Impl rule__EventGuardStatement__Group__2 )
+            // InternalFormalML.g:47323:2: rule__EventGuardStatement__Group__1__Impl rule__EventGuardStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__EventGuardStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EventGuardStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EventGuardStatement__Group__1"
+
+
+    // $ANTLR start "rule__EventGuardStatement__Group__1__Impl"
+    // InternalFormalML.g:47330:1: rule__EventGuardStatement__Group__1__Impl : ( ( rule__EventGuardStatement__ConditionAssignment_1 ) ) ;
+    public final void rule__EventGuardStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47334:1: ( ( ( rule__EventGuardStatement__ConditionAssignment_1 ) ) )
+            // InternalFormalML.g:47335:1: ( ( rule__EventGuardStatement__ConditionAssignment_1 ) )
+            {
+            // InternalFormalML.g:47335:1: ( ( rule__EventGuardStatement__ConditionAssignment_1 ) )
+            // InternalFormalML.g:47336:2: ( rule__EventGuardStatement__ConditionAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEventGuardStatementAccess().getConditionAssignment_1()); 
+            }
+            // InternalFormalML.g:47337:2: ( rule__EventGuardStatement__ConditionAssignment_1 )
+            // InternalFormalML.g:47337:3: rule__EventGuardStatement__ConditionAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EventGuardStatement__ConditionAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEventGuardStatementAccess().getConditionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EventGuardStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EventGuardStatement__Group__2"
+    // InternalFormalML.g:47345:1: rule__EventGuardStatement__Group__2 : rule__EventGuardStatement__Group__2__Impl ;
+    public final void rule__EventGuardStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47349:1: ( rule__EventGuardStatement__Group__2__Impl )
+            // InternalFormalML.g:47350:2: rule__EventGuardStatement__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EventGuardStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EventGuardStatement__Group__2"
+
+
+    // $ANTLR start "rule__EventGuardStatement__Group__2__Impl"
+    // InternalFormalML.g:47356:1: rule__EventGuardStatement__Group__2__Impl : ( ';' ) ;
+    public final void rule__EventGuardStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47360:1: ( ( ';' ) )
+            // InternalFormalML.g:47361:1: ( ';' )
+            {
+            // InternalFormalML.g:47361:1: ( ';' )
+            // InternalFormalML.g:47362:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEventGuardStatementAccess().getSemicolonKeyword_2()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEventGuardStatementAccess().getSemicolonKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EventGuardStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__0"
+    // InternalFormalML.g:47372:1: rule__CheckSatGuardStatement__Group__0 : rule__CheckSatGuardStatement__Group__0__Impl rule__CheckSatGuardStatement__Group__1 ;
+    public final void rule__CheckSatGuardStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47376:1: ( rule__CheckSatGuardStatement__Group__0__Impl rule__CheckSatGuardStatement__Group__1 )
+            // InternalFormalML.g:47377:2: rule__CheckSatGuardStatement__Group__0__Impl rule__CheckSatGuardStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__CheckSatGuardStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CheckSatGuardStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__0"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__0__Impl"
+    // InternalFormalML.g:47384:1: rule__CheckSatGuardStatement__Group__0__Impl : ( 'checksat' ) ;
+    public final void rule__CheckSatGuardStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47388:1: ( ( 'checksat' ) )
+            // InternalFormalML.g:47389:1: ( 'checksat' )
+            {
+            // InternalFormalML.g:47389:1: ( 'checksat' )
+            // InternalFormalML.g:47390:2: 'checksat'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementAccess().getChecksatKeyword_0()); 
+            }
+            match(input,249,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementAccess().getChecksatKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__1"
+    // InternalFormalML.g:47399:1: rule__CheckSatGuardStatement__Group__1 : rule__CheckSatGuardStatement__Group__1__Impl rule__CheckSatGuardStatement__Group__2 ;
+    public final void rule__CheckSatGuardStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47403:1: ( rule__CheckSatGuardStatement__Group__1__Impl rule__CheckSatGuardStatement__Group__2 )
+            // InternalFormalML.g:47404:2: rule__CheckSatGuardStatement__Group__1__Impl rule__CheckSatGuardStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__CheckSatGuardStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CheckSatGuardStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__1"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__1__Impl"
+    // InternalFormalML.g:47411:1: rule__CheckSatGuardStatement__Group__1__Impl : ( '<' ) ;
+    public final void rule__CheckSatGuardStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47415:1: ( ( '<' ) )
+            // InternalFormalML.g:47416:1: ( '<' )
+            {
+            // InternalFormalML.g:47416:1: ( '<' )
+            // InternalFormalML.g:47417:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementAccess().getLessThanSignKeyword_1()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementAccess().getLessThanSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__2"
+    // InternalFormalML.g:47426:1: rule__CheckSatGuardStatement__Group__2 : rule__CheckSatGuardStatement__Group__2__Impl rule__CheckSatGuardStatement__Group__3 ;
+    public final void rule__CheckSatGuardStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47430:1: ( rule__CheckSatGuardStatement__Group__2__Impl rule__CheckSatGuardStatement__Group__3 )
+            // InternalFormalML.g:47431:2: rule__CheckSatGuardStatement__Group__2__Impl rule__CheckSatGuardStatement__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__CheckSatGuardStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CheckSatGuardStatement__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__2"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__2__Impl"
+    // InternalFormalML.g:47438:1: rule__CheckSatGuardStatement__Group__2__Impl : ( ( rule__CheckSatGuardStatement__SolverAssignment_2 ) ) ;
+    public final void rule__CheckSatGuardStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47442:1: ( ( ( rule__CheckSatGuardStatement__SolverAssignment_2 ) ) )
+            // InternalFormalML.g:47443:1: ( ( rule__CheckSatGuardStatement__SolverAssignment_2 ) )
+            {
+            // InternalFormalML.g:47443:1: ( ( rule__CheckSatGuardStatement__SolverAssignment_2 ) )
+            // InternalFormalML.g:47444:2: ( rule__CheckSatGuardStatement__SolverAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementAccess().getSolverAssignment_2()); 
+            }
+            // InternalFormalML.g:47445:2: ( rule__CheckSatGuardStatement__SolverAssignment_2 )
+            // InternalFormalML.g:47445:3: rule__CheckSatGuardStatement__SolverAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CheckSatGuardStatement__SolverAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementAccess().getSolverAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__3"
+    // InternalFormalML.g:47453:1: rule__CheckSatGuardStatement__Group__3 : rule__CheckSatGuardStatement__Group__3__Impl rule__CheckSatGuardStatement__Group__4 ;
+    public final void rule__CheckSatGuardStatement__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47457:1: ( rule__CheckSatGuardStatement__Group__3__Impl rule__CheckSatGuardStatement__Group__4 )
+            // InternalFormalML.g:47458:2: rule__CheckSatGuardStatement__Group__3__Impl rule__CheckSatGuardStatement__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__CheckSatGuardStatement__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CheckSatGuardStatement__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__3"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__3__Impl"
+    // InternalFormalML.g:47465:1: rule__CheckSatGuardStatement__Group__3__Impl : ( '>' ) ;
+    public final void rule__CheckSatGuardStatement__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47469:1: ( ( '>' ) )
+            // InternalFormalML.g:47470:1: ( '>' )
+            {
+            // InternalFormalML.g:47470:1: ( '>' )
+            // InternalFormalML.g:47471:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementAccess().getGreaterThanSignKeyword_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementAccess().getGreaterThanSignKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__3__Impl"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__4"
+    // InternalFormalML.g:47480:1: rule__CheckSatGuardStatement__Group__4 : rule__CheckSatGuardStatement__Group__4__Impl rule__CheckSatGuardStatement__Group__5 ;
+    public final void rule__CheckSatGuardStatement__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47484:1: ( rule__CheckSatGuardStatement__Group__4__Impl rule__CheckSatGuardStatement__Group__5 )
+            // InternalFormalML.g:47485:2: rule__CheckSatGuardStatement__Group__4__Impl rule__CheckSatGuardStatement__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__CheckSatGuardStatement__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CheckSatGuardStatement__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__4"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__4__Impl"
+    // InternalFormalML.g:47492:1: rule__CheckSatGuardStatement__Group__4__Impl : ( ( rule__CheckSatGuardStatement__ConditionAssignment_4 ) ) ;
+    public final void rule__CheckSatGuardStatement__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47496:1: ( ( ( rule__CheckSatGuardStatement__ConditionAssignment_4 ) ) )
+            // InternalFormalML.g:47497:1: ( ( rule__CheckSatGuardStatement__ConditionAssignment_4 ) )
+            {
+            // InternalFormalML.g:47497:1: ( ( rule__CheckSatGuardStatement__ConditionAssignment_4 ) )
+            // InternalFormalML.g:47498:2: ( rule__CheckSatGuardStatement__ConditionAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementAccess().getConditionAssignment_4()); 
+            }
+            // InternalFormalML.g:47499:2: ( rule__CheckSatGuardStatement__ConditionAssignment_4 )
+            // InternalFormalML.g:47499:3: rule__CheckSatGuardStatement__ConditionAssignment_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CheckSatGuardStatement__ConditionAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementAccess().getConditionAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__4__Impl"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__5"
+    // InternalFormalML.g:47507:1: rule__CheckSatGuardStatement__Group__5 : rule__CheckSatGuardStatement__Group__5__Impl ;
+    public final void rule__CheckSatGuardStatement__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47511:1: ( rule__CheckSatGuardStatement__Group__5__Impl )
+            // InternalFormalML.g:47512:2: rule__CheckSatGuardStatement__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CheckSatGuardStatement__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__5"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__Group__5__Impl"
+    // InternalFormalML.g:47518:1: rule__CheckSatGuardStatement__Group__5__Impl : ( ';' ) ;
+    public final void rule__CheckSatGuardStatement__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47522:1: ( ( ';' ) )
+            // InternalFormalML.g:47523:1: ( ';' )
+            {
+            // InternalFormalML.g:47523:1: ( ';' )
+            // InternalFormalML.g:47524:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementAccess().getSemicolonKeyword_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementAccess().getSemicolonKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__Group__5__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__0"
+    // InternalFormalML.g:47534:1: rule__InputComStatement__Group__0 : rule__InputComStatement__Group__0__Impl rule__InputComStatement__Group__1 ;
+    public final void rule__InputComStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47538:1: ( rule__InputComStatement__Group__0__Impl rule__InputComStatement__Group__1 )
+            // InternalFormalML.g:47539:2: rule__InputComStatement__Group__0__Impl rule__InputComStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__InputComStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__0"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__0__Impl"
+    // InternalFormalML.g:47546:1: rule__InputComStatement__Group__0__Impl : ( 'input' ) ;
+    public final void rule__InputComStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47550:1: ( ( 'input' ) )
+            // InternalFormalML.g:47551:1: ( 'input' )
+            {
+            // InternalFormalML.g:47551:1: ( 'input' )
+            // InternalFormalML.g:47552:2: 'input'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getInputKeyword_0()); 
+            }
+            match(input,175,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getInputKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__1"
+    // InternalFormalML.g:47561:1: rule__InputComStatement__Group__1 : rule__InputComStatement__Group__1__Impl rule__InputComStatement__Group__2 ;
+    public final void rule__InputComStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47565:1: ( rule__InputComStatement__Group__1__Impl rule__InputComStatement__Group__2 )
+            // InternalFormalML.g:47566:2: rule__InputComStatement__Group__1__Impl rule__InputComStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_209);
+            rule__InputComStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__1"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__1__Impl"
+    // InternalFormalML.g:47573:1: rule__InputComStatement__Group__1__Impl : ( ( rule__InputComStatement__PortAssignment_1 ) ) ;
+    public final void rule__InputComStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47577:1: ( ( ( rule__InputComStatement__PortAssignment_1 ) ) )
+            // InternalFormalML.g:47578:1: ( ( rule__InputComStatement__PortAssignment_1 ) )
+            {
+            // InternalFormalML.g:47578:1: ( ( rule__InputComStatement__PortAssignment_1 ) )
+            // InternalFormalML.g:47579:2: ( rule__InputComStatement__PortAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getPortAssignment_1()); 
+            }
+            // InternalFormalML.g:47580:2: ( rule__InputComStatement__PortAssignment_1 )
+            // InternalFormalML.g:47580:3: rule__InputComStatement__PortAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__PortAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getPortAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__2"
+    // InternalFormalML.g:47588:1: rule__InputComStatement__Group__2 : rule__InputComStatement__Group__2__Impl rule__InputComStatement__Group__3 ;
+    public final void rule__InputComStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47592:1: ( rule__InputComStatement__Group__2__Impl rule__InputComStatement__Group__3 )
+            // InternalFormalML.g:47593:2: rule__InputComStatement__Group__2__Impl rule__InputComStatement__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_209);
+            rule__InputComStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__2"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__2__Impl"
+    // InternalFormalML.g:47600:1: rule__InputComStatement__Group__2__Impl : ( ( rule__InputComStatement__Group_2__0 )? ) ;
+    public final void rule__InputComStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47604:1: ( ( ( rule__InputComStatement__Group_2__0 )? ) )
+            // InternalFormalML.g:47605:1: ( ( rule__InputComStatement__Group_2__0 )? )
+            {
+            // InternalFormalML.g:47605:1: ( ( rule__InputComStatement__Group_2__0 )? )
+            // InternalFormalML.g:47606:2: ( rule__InputComStatement__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:47607:2: ( rule__InputComStatement__Group_2__0 )?
+            int alt629=2;
+            int LA629_0 = input.LA(1);
+
+            if ( (LA629_0==23) ) {
+                alt629=1;
+            }
+            switch (alt629) {
+                case 1 :
+                    // InternalFormalML.g:47607:3: rule__InputComStatement__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InputComStatement__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__3"
+    // InternalFormalML.g:47615:1: rule__InputComStatement__Group__3 : rule__InputComStatement__Group__3__Impl rule__InputComStatement__Group__4 ;
+    public final void rule__InputComStatement__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47619:1: ( rule__InputComStatement__Group__3__Impl rule__InputComStatement__Group__4 )
+            // InternalFormalML.g:47620:2: rule__InputComStatement__Group__3__Impl rule__InputComStatement__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__InputComStatement__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__3"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__3__Impl"
+    // InternalFormalML.g:47627:1: rule__InputComStatement__Group__3__Impl : ( ( rule__InputComStatement__UnorderedGroup_3 ) ) ;
+    public final void rule__InputComStatement__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47631:1: ( ( ( rule__InputComStatement__UnorderedGroup_3 ) ) )
+            // InternalFormalML.g:47632:1: ( ( rule__InputComStatement__UnorderedGroup_3 ) )
+            {
+            // InternalFormalML.g:47632:1: ( ( rule__InputComStatement__UnorderedGroup_3 ) )
+            // InternalFormalML.g:47633:2: ( rule__InputComStatement__UnorderedGroup_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()); 
+            }
+            // InternalFormalML.g:47634:2: ( rule__InputComStatement__UnorderedGroup_3 )
+            // InternalFormalML.g:47634:3: rule__InputComStatement__UnorderedGroup_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__UnorderedGroup_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__3__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__4"
+    // InternalFormalML.g:47642:1: rule__InputComStatement__Group__4 : rule__InputComStatement__Group__4__Impl ;
+    public final void rule__InputComStatement__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47646:1: ( rule__InputComStatement__Group__4__Impl )
+            // InternalFormalML.g:47647:2: rule__InputComStatement__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__4"
+
+
+    // $ANTLR start "rule__InputComStatement__Group__4__Impl"
+    // InternalFormalML.g:47653:1: rule__InputComStatement__Group__4__Impl : ( ';' ) ;
+    public final void rule__InputComStatement__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47657:1: ( ( ';' ) )
+            // InternalFormalML.g:47658:1: ( ';' )
+            {
+            // InternalFormalML.g:47658:1: ( ';' )
+            // InternalFormalML.g:47659:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getSemicolonKeyword_4()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getSemicolonKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group__4__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2__0"
+    // InternalFormalML.g:47669:1: rule__InputComStatement__Group_2__0 : rule__InputComStatement__Group_2__0__Impl rule__InputComStatement__Group_2__1 ;
+    public final void rule__InputComStatement__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47673:1: ( rule__InputComStatement__Group_2__0__Impl rule__InputComStatement__Group_2__1 )
+            // InternalFormalML.g:47674:2: rule__InputComStatement__Group_2__0__Impl rule__InputComStatement__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__InputComStatement__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2__0"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2__0__Impl"
+    // InternalFormalML.g:47681:1: rule__InputComStatement__Group_2__0__Impl : ( '(' ) ;
+    public final void rule__InputComStatement__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47685:1: ( ( '(' ) )
+            // InternalFormalML.g:47686:1: ( '(' )
+            {
+            // InternalFormalML.g:47686:1: ( '(' )
+            // InternalFormalML.g:47687:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getLeftParenthesisKeyword_2_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getLeftParenthesisKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2__1"
+    // InternalFormalML.g:47696:1: rule__InputComStatement__Group_2__1 : rule__InputComStatement__Group_2__1__Impl rule__InputComStatement__Group_2__2 ;
+    public final void rule__InputComStatement__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47700:1: ( rule__InputComStatement__Group_2__1__Impl rule__InputComStatement__Group_2__2 )
+            // InternalFormalML.g:47701:2: rule__InputComStatement__Group_2__1__Impl rule__InputComStatement__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InputComStatement__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2__1"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2__1__Impl"
+    // InternalFormalML.g:47708:1: rule__InputComStatement__Group_2__1__Impl : ( ( rule__InputComStatement__LeftValueAssignment_2_1 ) ) ;
+    public final void rule__InputComStatement__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47712:1: ( ( ( rule__InputComStatement__LeftValueAssignment_2_1 ) ) )
+            // InternalFormalML.g:47713:1: ( ( rule__InputComStatement__LeftValueAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:47713:1: ( ( rule__InputComStatement__LeftValueAssignment_2_1 ) )
+            // InternalFormalML.g:47714:2: ( rule__InputComStatement__LeftValueAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_1()); 
+            }
+            // InternalFormalML.g:47715:2: ( rule__InputComStatement__LeftValueAssignment_2_1 )
+            // InternalFormalML.g:47715:3: rule__InputComStatement__LeftValueAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__LeftValueAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2__2"
+    // InternalFormalML.g:47723:1: rule__InputComStatement__Group_2__2 : rule__InputComStatement__Group_2__2__Impl rule__InputComStatement__Group_2__3 ;
+    public final void rule__InputComStatement__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47727:1: ( rule__InputComStatement__Group_2__2__Impl rule__InputComStatement__Group_2__3 )
+            // InternalFormalML.g:47728:2: rule__InputComStatement__Group_2__2__Impl rule__InputComStatement__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InputComStatement__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2__2"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2__2__Impl"
+    // InternalFormalML.g:47735:1: rule__InputComStatement__Group_2__2__Impl : ( ( rule__InputComStatement__Group_2_2__0 )* ) ;
+    public final void rule__InputComStatement__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47739:1: ( ( ( rule__InputComStatement__Group_2_2__0 )* ) )
+            // InternalFormalML.g:47740:1: ( ( rule__InputComStatement__Group_2_2__0 )* )
+            {
+            // InternalFormalML.g:47740:1: ( ( rule__InputComStatement__Group_2_2__0 )* )
+            // InternalFormalML.g:47741:2: ( rule__InputComStatement__Group_2_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getGroup_2_2()); 
+            }
+            // InternalFormalML.g:47742:2: ( rule__InputComStatement__Group_2_2__0 )*
+            loop630:
+            do {
+                int alt630=2;
+                int LA630_0 = input.LA(1);
+
+                if ( (LA630_0==198) ) {
+                    alt630=1;
+                }
+
+
+                switch (alt630) {
+            	case 1 :
+            	    // InternalFormalML.g:47742:3: rule__InputComStatement__Group_2_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__InputComStatement__Group_2_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop630;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getGroup_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2__3"
+    // InternalFormalML.g:47750:1: rule__InputComStatement__Group_2__3 : rule__InputComStatement__Group_2__3__Impl ;
+    public final void rule__InputComStatement__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47754:1: ( rule__InputComStatement__Group_2__3__Impl )
+            // InternalFormalML.g:47755:2: rule__InputComStatement__Group_2__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2__3"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2__3__Impl"
+    // InternalFormalML.g:47761:1: rule__InputComStatement__Group_2__3__Impl : ( ')' ) ;
+    public final void rule__InputComStatement__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47765:1: ( ( ')' ) )
+            // InternalFormalML.g:47766:1: ( ')' )
+            {
+            // InternalFormalML.g:47766:1: ( ')' )
+            // InternalFormalML.g:47767:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getRightParenthesisKeyword_2_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getRightParenthesisKeyword_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2_2__0"
+    // InternalFormalML.g:47777:1: rule__InputComStatement__Group_2_2__0 : rule__InputComStatement__Group_2_2__0__Impl rule__InputComStatement__Group_2_2__1 ;
+    public final void rule__InputComStatement__Group_2_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47781:1: ( rule__InputComStatement__Group_2_2__0__Impl rule__InputComStatement__Group_2_2__1 )
+            // InternalFormalML.g:47782:2: rule__InputComStatement__Group_2_2__0__Impl rule__InputComStatement__Group_2_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__InputComStatement__Group_2_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_2_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2_2__0"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2_2__0__Impl"
+    // InternalFormalML.g:47789:1: rule__InputComStatement__Group_2_2__0__Impl : ( ',' ) ;
+    public final void rule__InputComStatement__Group_2_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47793:1: ( ( ',' ) )
+            // InternalFormalML.g:47794:1: ( ',' )
+            {
+            // InternalFormalML.g:47794:1: ( ',' )
+            // InternalFormalML.g:47795:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getCommaKeyword_2_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getCommaKeyword_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2_2__0__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2_2__1"
+    // InternalFormalML.g:47804:1: rule__InputComStatement__Group_2_2__1 : rule__InputComStatement__Group_2_2__1__Impl ;
+    public final void rule__InputComStatement__Group_2_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47808:1: ( rule__InputComStatement__Group_2_2__1__Impl )
+            // InternalFormalML.g:47809:2: rule__InputComStatement__Group_2_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_2_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2_2__1"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_2_2__1__Impl"
+    // InternalFormalML.g:47815:1: rule__InputComStatement__Group_2_2__1__Impl : ( ( rule__InputComStatement__LeftValueAssignment_2_2_1 ) ) ;
+    public final void rule__InputComStatement__Group_2_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47819:1: ( ( ( rule__InputComStatement__LeftValueAssignment_2_2_1 ) ) )
+            // InternalFormalML.g:47820:1: ( ( rule__InputComStatement__LeftValueAssignment_2_2_1 ) )
+            {
+            // InternalFormalML.g:47820:1: ( ( rule__InputComStatement__LeftValueAssignment_2_2_1 ) )
+            // InternalFormalML.g:47821:2: ( rule__InputComStatement__LeftValueAssignment_2_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_2_1()); 
+            }
+            // InternalFormalML.g:47822:2: ( rule__InputComStatement__LeftValueAssignment_2_2_1 )
+            // InternalFormalML.g:47822:3: rule__InputComStatement__LeftValueAssignment_2_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__LeftValueAssignment_2_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getLeftValueAssignment_2_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_2_2__1__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_3_0__0"
+    // InternalFormalML.g:47831:1: rule__InputComStatement__Group_3_0__0 : rule__InputComStatement__Group_3_0__0__Impl rule__InputComStatement__Group_3_0__1 ;
+    public final void rule__InputComStatement__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47835:1: ( rule__InputComStatement__Group_3_0__0__Impl rule__InputComStatement__Group_3_0__1 )
+            // InternalFormalML.g:47836:2: rule__InputComStatement__Group_3_0__0__Impl rule__InputComStatement__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_131);
+            rule__InputComStatement__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_3_0__0"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_3_0__0__Impl"
+    // InternalFormalML.g:47843:1: rule__InputComStatement__Group_3_0__0__Impl : ( '<--' ) ;
+    public final void rule__InputComStatement__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47847:1: ( ( '<--' ) )
+            // InternalFormalML.g:47848:1: ( '<--' )
+            {
+            // InternalFormalML.g:47848:1: ( '<--' )
+            // InternalFormalML.g:47849:2: '<--'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0()); 
+            }
+            match(input,250,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_3_0__1"
+    // InternalFormalML.g:47858:1: rule__InputComStatement__Group_3_0__1 : rule__InputComStatement__Group_3_0__1__Impl ;
+    public final void rule__InputComStatement__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47862:1: ( rule__InputComStatement__Group_3_0__1__Impl )
+            // InternalFormalML.g:47863:2: rule__InputComStatement__Group_3_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_3_0__1"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_3_0__1__Impl"
+    // InternalFormalML.g:47869:1: rule__InputComStatement__Group_3_0__1__Impl : ( ( rule__InputComStatement__TargetAssignment_3_0_1 ) ) ;
+    public final void rule__InputComStatement__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47873:1: ( ( ( rule__InputComStatement__TargetAssignment_3_0_1 ) ) )
+            // InternalFormalML.g:47874:1: ( ( rule__InputComStatement__TargetAssignment_3_0_1 ) )
+            {
+            // InternalFormalML.g:47874:1: ( ( rule__InputComStatement__TargetAssignment_3_0_1 ) )
+            // InternalFormalML.g:47875:2: ( rule__InputComStatement__TargetAssignment_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getTargetAssignment_3_0_1()); 
+            }
+            // InternalFormalML.g:47876:2: ( rule__InputComStatement__TargetAssignment_3_0_1 )
+            // InternalFormalML.g:47876:3: rule__InputComStatement__TargetAssignment_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__TargetAssignment_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getTargetAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_3_1__0"
+    // InternalFormalML.g:47885:1: rule__InputComStatement__Group_3_1__0 : rule__InputComStatement__Group_3_1__0__Impl rule__InputComStatement__Group_3_1__1 ;
+    public final void rule__InputComStatement__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47889:1: ( rule__InputComStatement__Group_3_1__0__Impl rule__InputComStatement__Group_3_1__1 )
+            // InternalFormalML.g:47890:2: rule__InputComStatement__Group_3_1__0__Impl rule__InputComStatement__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__InputComStatement__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_3_1__0"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_3_1__0__Impl"
+    // InternalFormalML.g:47897:1: rule__InputComStatement__Group_3_1__0__Impl : ( ( rule__InputComStatement__Alternatives_3_1_0 ) ) ;
+    public final void rule__InputComStatement__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47901:1: ( ( ( rule__InputComStatement__Alternatives_3_1_0 ) ) )
+            // InternalFormalML.g:47902:1: ( ( rule__InputComStatement__Alternatives_3_1_0 ) )
+            {
+            // InternalFormalML.g:47902:1: ( ( rule__InputComStatement__Alternatives_3_1_0 ) )
+            // InternalFormalML.g:47903:2: ( rule__InputComStatement__Alternatives_3_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getAlternatives_3_1_0()); 
+            }
+            // InternalFormalML.g:47904:2: ( rule__InputComStatement__Alternatives_3_1_0 )
+            // InternalFormalML.g:47904:3: rule__InputComStatement__Alternatives_3_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Alternatives_3_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getAlternatives_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_3_1__1"
+    // InternalFormalML.g:47912:1: rule__InputComStatement__Group_3_1__1 : rule__InputComStatement__Group_3_1__1__Impl ;
+    public final void rule__InputComStatement__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47916:1: ( rule__InputComStatement__Group_3_1__1__Impl )
+            // InternalFormalML.g:47917:2: rule__InputComStatement__Group_3_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_3_1__1"
+
+
+    // $ANTLR start "rule__InputComStatement__Group_3_1__1__Impl"
+    // InternalFormalML.g:47923:1: rule__InputComStatement__Group_3_1__1__Impl : ( ( rule__InputComStatement__RouteAssignment_3_1_1 ) ) ;
+    public final void rule__InputComStatement__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47927:1: ( ( ( rule__InputComStatement__RouteAssignment_3_1_1 ) ) )
+            // InternalFormalML.g:47928:1: ( ( rule__InputComStatement__RouteAssignment_3_1_1 ) )
+            {
+            // InternalFormalML.g:47928:1: ( ( rule__InputComStatement__RouteAssignment_3_1_1 ) )
+            // InternalFormalML.g:47929:2: ( rule__InputComStatement__RouteAssignment_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getRouteAssignment_3_1_1()); 
+            }
+            // InternalFormalML.g:47930:2: ( rule__InputComStatement__RouteAssignment_3_1_1 )
+            // InternalFormalML.g:47930:3: rule__InputComStatement__RouteAssignment_3_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__RouteAssignment_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getRouteAssignment_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__0"
+    // InternalFormalML.g:47939:1: rule__OutputComStatement__Group__0 : rule__OutputComStatement__Group__0__Impl rule__OutputComStatement__Group__1 ;
+    public final void rule__OutputComStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47943:1: ( rule__OutputComStatement__Group__0__Impl rule__OutputComStatement__Group__1 )
+            // InternalFormalML.g:47944:2: rule__OutputComStatement__Group__0__Impl rule__OutputComStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__OutputComStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__0"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__0__Impl"
+    // InternalFormalML.g:47951:1: rule__OutputComStatement__Group__0__Impl : ( 'output' ) ;
+    public final void rule__OutputComStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47955:1: ( ( 'output' ) )
+            // InternalFormalML.g:47956:1: ( 'output' )
+            {
+            // InternalFormalML.g:47956:1: ( 'output' )
+            // InternalFormalML.g:47957:2: 'output'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getOutputKeyword_0()); 
+            }
+            match(input,176,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getOutputKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__1"
+    // InternalFormalML.g:47966:1: rule__OutputComStatement__Group__1 : rule__OutputComStatement__Group__1__Impl rule__OutputComStatement__Group__2 ;
+    public final void rule__OutputComStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47970:1: ( rule__OutputComStatement__Group__1__Impl rule__OutputComStatement__Group__2 )
+            // InternalFormalML.g:47971:2: rule__OutputComStatement__Group__1__Impl rule__OutputComStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_210);
+            rule__OutputComStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__1"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__1__Impl"
+    // InternalFormalML.g:47978:1: rule__OutputComStatement__Group__1__Impl : ( ( rule__OutputComStatement__PortAssignment_1 ) ) ;
+    public final void rule__OutputComStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47982:1: ( ( ( rule__OutputComStatement__PortAssignment_1 ) ) )
+            // InternalFormalML.g:47983:1: ( ( rule__OutputComStatement__PortAssignment_1 ) )
+            {
+            // InternalFormalML.g:47983:1: ( ( rule__OutputComStatement__PortAssignment_1 ) )
+            // InternalFormalML.g:47984:2: ( rule__OutputComStatement__PortAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getPortAssignment_1()); 
+            }
+            // InternalFormalML.g:47985:2: ( rule__OutputComStatement__PortAssignment_1 )
+            // InternalFormalML.g:47985:3: rule__OutputComStatement__PortAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__PortAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getPortAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__2"
+    // InternalFormalML.g:47993:1: rule__OutputComStatement__Group__2 : rule__OutputComStatement__Group__2__Impl rule__OutputComStatement__Group__3 ;
+    public final void rule__OutputComStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:47997:1: ( rule__OutputComStatement__Group__2__Impl rule__OutputComStatement__Group__3 )
+            // InternalFormalML.g:47998:2: rule__OutputComStatement__Group__2__Impl rule__OutputComStatement__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_210);
+            rule__OutputComStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__2"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__2__Impl"
+    // InternalFormalML.g:48005:1: rule__OutputComStatement__Group__2__Impl : ( ( rule__OutputComStatement__Group_2__0 )? ) ;
+    public final void rule__OutputComStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48009:1: ( ( ( rule__OutputComStatement__Group_2__0 )? ) )
+            // InternalFormalML.g:48010:1: ( ( rule__OutputComStatement__Group_2__0 )? )
+            {
+            // InternalFormalML.g:48010:1: ( ( rule__OutputComStatement__Group_2__0 )? )
+            // InternalFormalML.g:48011:2: ( rule__OutputComStatement__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:48012:2: ( rule__OutputComStatement__Group_2__0 )?
+            int alt631=2;
+            int LA631_0 = input.LA(1);
+
+            if ( (LA631_0==23) ) {
+                alt631=1;
+            }
+            switch (alt631) {
+                case 1 :
+                    // InternalFormalML.g:48012:3: rule__OutputComStatement__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OutputComStatement__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__3"
+    // InternalFormalML.g:48020:1: rule__OutputComStatement__Group__3 : rule__OutputComStatement__Group__3__Impl rule__OutputComStatement__Group__4 ;
+    public final void rule__OutputComStatement__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48024:1: ( rule__OutputComStatement__Group__3__Impl rule__OutputComStatement__Group__4 )
+            // InternalFormalML.g:48025:2: rule__OutputComStatement__Group__3__Impl rule__OutputComStatement__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__OutputComStatement__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__3"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__3__Impl"
+    // InternalFormalML.g:48032:1: rule__OutputComStatement__Group__3__Impl : ( ( rule__OutputComStatement__UnorderedGroup_3 ) ) ;
+    public final void rule__OutputComStatement__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48036:1: ( ( ( rule__OutputComStatement__UnorderedGroup_3 ) ) )
+            // InternalFormalML.g:48037:1: ( ( rule__OutputComStatement__UnorderedGroup_3 ) )
+            {
+            // InternalFormalML.g:48037:1: ( ( rule__OutputComStatement__UnorderedGroup_3 ) )
+            // InternalFormalML.g:48038:2: ( rule__OutputComStatement__UnorderedGroup_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()); 
+            }
+            // InternalFormalML.g:48039:2: ( rule__OutputComStatement__UnorderedGroup_3 )
+            // InternalFormalML.g:48039:3: rule__OutputComStatement__UnorderedGroup_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__UnorderedGroup_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__3__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__4"
+    // InternalFormalML.g:48047:1: rule__OutputComStatement__Group__4 : rule__OutputComStatement__Group__4__Impl ;
+    public final void rule__OutputComStatement__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48051:1: ( rule__OutputComStatement__Group__4__Impl )
+            // InternalFormalML.g:48052:2: rule__OutputComStatement__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__4"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group__4__Impl"
+    // InternalFormalML.g:48058:1: rule__OutputComStatement__Group__4__Impl : ( ';' ) ;
+    public final void rule__OutputComStatement__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48062:1: ( ( ';' ) )
+            // InternalFormalML.g:48063:1: ( ';' )
+            {
+            // InternalFormalML.g:48063:1: ( ';' )
+            // InternalFormalML.g:48064:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getSemicolonKeyword_4()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getSemicolonKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group__4__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2__0"
+    // InternalFormalML.g:48074:1: rule__OutputComStatement__Group_2__0 : rule__OutputComStatement__Group_2__0__Impl rule__OutputComStatement__Group_2__1 ;
+    public final void rule__OutputComStatement__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48078:1: ( rule__OutputComStatement__Group_2__0__Impl rule__OutputComStatement__Group_2__1 )
+            // InternalFormalML.g:48079:2: rule__OutputComStatement__Group_2__0__Impl rule__OutputComStatement__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__OutputComStatement__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2__0"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2__0__Impl"
+    // InternalFormalML.g:48086:1: rule__OutputComStatement__Group_2__0__Impl : ( '(' ) ;
+    public final void rule__OutputComStatement__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48090:1: ( ( '(' ) )
+            // InternalFormalML.g:48091:1: ( '(' )
+            {
+            // InternalFormalML.g:48091:1: ( '(' )
+            // InternalFormalML.g:48092:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getLeftParenthesisKeyword_2_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getLeftParenthesisKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2__1"
+    // InternalFormalML.g:48101:1: rule__OutputComStatement__Group_2__1 : rule__OutputComStatement__Group_2__1__Impl rule__OutputComStatement__Group_2__2 ;
+    public final void rule__OutputComStatement__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48105:1: ( rule__OutputComStatement__Group_2__1__Impl rule__OutputComStatement__Group_2__2 )
+            // InternalFormalML.g:48106:2: rule__OutputComStatement__Group_2__1__Impl rule__OutputComStatement__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__OutputComStatement__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2__1"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2__1__Impl"
+    // InternalFormalML.g:48113:1: rule__OutputComStatement__Group_2__1__Impl : ( ( rule__OutputComStatement__RigthValueAssignment_2_1 ) ) ;
+    public final void rule__OutputComStatement__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48117:1: ( ( ( rule__OutputComStatement__RigthValueAssignment_2_1 ) ) )
+            // InternalFormalML.g:48118:1: ( ( rule__OutputComStatement__RigthValueAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:48118:1: ( ( rule__OutputComStatement__RigthValueAssignment_2_1 ) )
+            // InternalFormalML.g:48119:2: ( rule__OutputComStatement__RigthValueAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_1()); 
+            }
+            // InternalFormalML.g:48120:2: ( rule__OutputComStatement__RigthValueAssignment_2_1 )
+            // InternalFormalML.g:48120:3: rule__OutputComStatement__RigthValueAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__RigthValueAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2__2"
+    // InternalFormalML.g:48128:1: rule__OutputComStatement__Group_2__2 : rule__OutputComStatement__Group_2__2__Impl rule__OutputComStatement__Group_2__3 ;
+    public final void rule__OutputComStatement__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48132:1: ( rule__OutputComStatement__Group_2__2__Impl rule__OutputComStatement__Group_2__3 )
+            // InternalFormalML.g:48133:2: rule__OutputComStatement__Group_2__2__Impl rule__OutputComStatement__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__OutputComStatement__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2__2"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2__2__Impl"
+    // InternalFormalML.g:48140:1: rule__OutputComStatement__Group_2__2__Impl : ( ( rule__OutputComStatement__Group_2_2__0 )* ) ;
+    public final void rule__OutputComStatement__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48144:1: ( ( ( rule__OutputComStatement__Group_2_2__0 )* ) )
+            // InternalFormalML.g:48145:1: ( ( rule__OutputComStatement__Group_2_2__0 )* )
+            {
+            // InternalFormalML.g:48145:1: ( ( rule__OutputComStatement__Group_2_2__0 )* )
+            // InternalFormalML.g:48146:2: ( rule__OutputComStatement__Group_2_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getGroup_2_2()); 
+            }
+            // InternalFormalML.g:48147:2: ( rule__OutputComStatement__Group_2_2__0 )*
+            loop632:
+            do {
+                int alt632=2;
+                int LA632_0 = input.LA(1);
+
+                if ( (LA632_0==198) ) {
+                    alt632=1;
+                }
+
+
+                switch (alt632) {
+            	case 1 :
+            	    // InternalFormalML.g:48147:3: rule__OutputComStatement__Group_2_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__OutputComStatement__Group_2_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop632;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getGroup_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2__3"
+    // InternalFormalML.g:48155:1: rule__OutputComStatement__Group_2__3 : rule__OutputComStatement__Group_2__3__Impl ;
+    public final void rule__OutputComStatement__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48159:1: ( rule__OutputComStatement__Group_2__3__Impl )
+            // InternalFormalML.g:48160:2: rule__OutputComStatement__Group_2__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2__3"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2__3__Impl"
+    // InternalFormalML.g:48166:1: rule__OutputComStatement__Group_2__3__Impl : ( ')' ) ;
+    public final void rule__OutputComStatement__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48170:1: ( ( ')' ) )
+            // InternalFormalML.g:48171:1: ( ')' )
+            {
+            // InternalFormalML.g:48171:1: ( ')' )
+            // InternalFormalML.g:48172:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getRightParenthesisKeyword_2_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getRightParenthesisKeyword_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2_2__0"
+    // InternalFormalML.g:48182:1: rule__OutputComStatement__Group_2_2__0 : rule__OutputComStatement__Group_2_2__0__Impl rule__OutputComStatement__Group_2_2__1 ;
+    public final void rule__OutputComStatement__Group_2_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48186:1: ( rule__OutputComStatement__Group_2_2__0__Impl rule__OutputComStatement__Group_2_2__1 )
+            // InternalFormalML.g:48187:2: rule__OutputComStatement__Group_2_2__0__Impl rule__OutputComStatement__Group_2_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__OutputComStatement__Group_2_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_2_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2_2__0"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2_2__0__Impl"
+    // InternalFormalML.g:48194:1: rule__OutputComStatement__Group_2_2__0__Impl : ( ',' ) ;
+    public final void rule__OutputComStatement__Group_2_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48198:1: ( ( ',' ) )
+            // InternalFormalML.g:48199:1: ( ',' )
+            {
+            // InternalFormalML.g:48199:1: ( ',' )
+            // InternalFormalML.g:48200:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getCommaKeyword_2_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getCommaKeyword_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2_2__0__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2_2__1"
+    // InternalFormalML.g:48209:1: rule__OutputComStatement__Group_2_2__1 : rule__OutputComStatement__Group_2_2__1__Impl ;
+    public final void rule__OutputComStatement__Group_2_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48213:1: ( rule__OutputComStatement__Group_2_2__1__Impl )
+            // InternalFormalML.g:48214:2: rule__OutputComStatement__Group_2_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_2_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2_2__1"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_2_2__1__Impl"
+    // InternalFormalML.g:48220:1: rule__OutputComStatement__Group_2_2__1__Impl : ( ( rule__OutputComStatement__RigthValueAssignment_2_2_1 ) ) ;
+    public final void rule__OutputComStatement__Group_2_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48224:1: ( ( ( rule__OutputComStatement__RigthValueAssignment_2_2_1 ) ) )
+            // InternalFormalML.g:48225:1: ( ( rule__OutputComStatement__RigthValueAssignment_2_2_1 ) )
+            {
+            // InternalFormalML.g:48225:1: ( ( rule__OutputComStatement__RigthValueAssignment_2_2_1 ) )
+            // InternalFormalML.g:48226:2: ( rule__OutputComStatement__RigthValueAssignment_2_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_2_1()); 
+            }
+            // InternalFormalML.g:48227:2: ( rule__OutputComStatement__RigthValueAssignment_2_2_1 )
+            // InternalFormalML.g:48227:3: rule__OutputComStatement__RigthValueAssignment_2_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__RigthValueAssignment_2_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getRigthValueAssignment_2_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_2_2__1__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_3_0__0"
+    // InternalFormalML.g:48236:1: rule__OutputComStatement__Group_3_0__0 : rule__OutputComStatement__Group_3_0__0__Impl rule__OutputComStatement__Group_3_0__1 ;
+    public final void rule__OutputComStatement__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48240:1: ( rule__OutputComStatement__Group_3_0__0__Impl rule__OutputComStatement__Group_3_0__1 )
+            // InternalFormalML.g:48241:2: rule__OutputComStatement__Group_3_0__0__Impl rule__OutputComStatement__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_131);
+            rule__OutputComStatement__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_3_0__0"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_3_0__0__Impl"
+    // InternalFormalML.g:48248:1: rule__OutputComStatement__Group_3_0__0__Impl : ( '-->' ) ;
+    public final void rule__OutputComStatement__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48252:1: ( ( '-->' ) )
+            // InternalFormalML.g:48253:1: ( '-->' )
+            {
+            // InternalFormalML.g:48253:1: ( '-->' )
+            // InternalFormalML.g:48254:2: '-->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0()); 
+            }
+            match(input,215,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_3_0__1"
+    // InternalFormalML.g:48263:1: rule__OutputComStatement__Group_3_0__1 : rule__OutputComStatement__Group_3_0__1__Impl ;
+    public final void rule__OutputComStatement__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48267:1: ( rule__OutputComStatement__Group_3_0__1__Impl )
+            // InternalFormalML.g:48268:2: rule__OutputComStatement__Group_3_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_3_0__1"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_3_0__1__Impl"
+    // InternalFormalML.g:48274:1: rule__OutputComStatement__Group_3_0__1__Impl : ( ( rule__OutputComStatement__TargetAssignment_3_0_1 ) ) ;
+    public final void rule__OutputComStatement__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48278:1: ( ( ( rule__OutputComStatement__TargetAssignment_3_0_1 ) ) )
+            // InternalFormalML.g:48279:1: ( ( rule__OutputComStatement__TargetAssignment_3_0_1 ) )
+            {
+            // InternalFormalML.g:48279:1: ( ( rule__OutputComStatement__TargetAssignment_3_0_1 ) )
+            // InternalFormalML.g:48280:2: ( rule__OutputComStatement__TargetAssignment_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getTargetAssignment_3_0_1()); 
+            }
+            // InternalFormalML.g:48281:2: ( rule__OutputComStatement__TargetAssignment_3_0_1 )
+            // InternalFormalML.g:48281:3: rule__OutputComStatement__TargetAssignment_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__TargetAssignment_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getTargetAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_3_1__0"
+    // InternalFormalML.g:48290:1: rule__OutputComStatement__Group_3_1__0 : rule__OutputComStatement__Group_3_1__0__Impl rule__OutputComStatement__Group_3_1__1 ;
+    public final void rule__OutputComStatement__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48294:1: ( rule__OutputComStatement__Group_3_1__0__Impl rule__OutputComStatement__Group_3_1__1 )
+            // InternalFormalML.g:48295:2: rule__OutputComStatement__Group_3_1__0__Impl rule__OutputComStatement__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__OutputComStatement__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_3_1__0"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_3_1__0__Impl"
+    // InternalFormalML.g:48302:1: rule__OutputComStatement__Group_3_1__0__Impl : ( ( rule__OutputComStatement__Alternatives_3_1_0 ) ) ;
+    public final void rule__OutputComStatement__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48306:1: ( ( ( rule__OutputComStatement__Alternatives_3_1_0 ) ) )
+            // InternalFormalML.g:48307:1: ( ( rule__OutputComStatement__Alternatives_3_1_0 ) )
+            {
+            // InternalFormalML.g:48307:1: ( ( rule__OutputComStatement__Alternatives_3_1_0 ) )
+            // InternalFormalML.g:48308:2: ( rule__OutputComStatement__Alternatives_3_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getAlternatives_3_1_0()); 
+            }
+            // InternalFormalML.g:48309:2: ( rule__OutputComStatement__Alternatives_3_1_0 )
+            // InternalFormalML.g:48309:3: rule__OutputComStatement__Alternatives_3_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Alternatives_3_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getAlternatives_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_3_1__1"
+    // InternalFormalML.g:48317:1: rule__OutputComStatement__Group_3_1__1 : rule__OutputComStatement__Group_3_1__1__Impl ;
+    public final void rule__OutputComStatement__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48321:1: ( rule__OutputComStatement__Group_3_1__1__Impl )
+            // InternalFormalML.g:48322:2: rule__OutputComStatement__Group_3_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_3_1__1"
+
+
+    // $ANTLR start "rule__OutputComStatement__Group_3_1__1__Impl"
+    // InternalFormalML.g:48328:1: rule__OutputComStatement__Group_3_1__1__Impl : ( ( rule__OutputComStatement__RouteAssignment_3_1_1 ) ) ;
+    public final void rule__OutputComStatement__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48332:1: ( ( ( rule__OutputComStatement__RouteAssignment_3_1_1 ) ) )
+            // InternalFormalML.g:48333:1: ( ( rule__OutputComStatement__RouteAssignment_3_1_1 ) )
+            {
+            // InternalFormalML.g:48333:1: ( ( rule__OutputComStatement__RouteAssignment_3_1_1 ) )
+            // InternalFormalML.g:48334:2: ( rule__OutputComStatement__RouteAssignment_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getRouteAssignment_3_1_1()); 
+            }
+            // InternalFormalML.g:48335:2: ( rule__OutputComStatement__RouteAssignment_3_1_1 )
+            // InternalFormalML.g:48335:3: rule__OutputComStatement__RouteAssignment_3_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__RouteAssignment_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getRouteAssignment_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__IfStatement__Group__0"
+    // InternalFormalML.g:48344:1: rule__IfStatement__Group__0 : rule__IfStatement__Group__0__Impl rule__IfStatement__Group__1 ;
+    public final void rule__IfStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48348:1: ( rule__IfStatement__Group__0__Impl rule__IfStatement__Group__1 )
+            // InternalFormalML.g:48349:2: rule__IfStatement__Group__0__Impl rule__IfStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__IfStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__0"
+
+
+    // $ANTLR start "rule__IfStatement__Group__0__Impl"
+    // InternalFormalML.g:48356:1: rule__IfStatement__Group__0__Impl : ( 'if' ) ;
+    public final void rule__IfStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48360:1: ( ( 'if' ) )
+            // InternalFormalML.g:48361:1: ( 'if' )
+            {
+            // InternalFormalML.g:48361:1: ( 'if' )
+            // InternalFormalML.g:48362:2: 'if'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getIfKeyword_0()); 
+            }
+            match(input,251,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getIfKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__IfStatement__Group__1"
+    // InternalFormalML.g:48371:1: rule__IfStatement__Group__1 : rule__IfStatement__Group__1__Impl rule__IfStatement__Group__2 ;
+    public final void rule__IfStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48375:1: ( rule__IfStatement__Group__1__Impl rule__IfStatement__Group__2 )
+            // InternalFormalML.g:48376:2: rule__IfStatement__Group__1__Impl rule__IfStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__IfStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__1"
+
+
+    // $ANTLR start "rule__IfStatement__Group__1__Impl"
+    // InternalFormalML.g:48383:1: rule__IfStatement__Group__1__Impl : ( ( rule__IfStatement__ConditionAssignment_1 ) ) ;
+    public final void rule__IfStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48387:1: ( ( ( rule__IfStatement__ConditionAssignment_1 ) ) )
+            // InternalFormalML.g:48388:1: ( ( rule__IfStatement__ConditionAssignment_1 ) )
+            {
+            // InternalFormalML.g:48388:1: ( ( rule__IfStatement__ConditionAssignment_1 ) )
+            // InternalFormalML.g:48389:2: ( rule__IfStatement__ConditionAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getConditionAssignment_1()); 
+            }
+            // InternalFormalML.g:48390:2: ( rule__IfStatement__ConditionAssignment_1 )
+            // InternalFormalML.g:48390:3: rule__IfStatement__ConditionAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__ConditionAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getConditionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__IfStatement__Group__2"
+    // InternalFormalML.g:48398:1: rule__IfStatement__Group__2 : rule__IfStatement__Group__2__Impl rule__IfStatement__Group__3 ;
+    public final void rule__IfStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48402:1: ( rule__IfStatement__Group__2__Impl rule__IfStatement__Group__3 )
+            // InternalFormalML.g:48403:2: rule__IfStatement__Group__2__Impl rule__IfStatement__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_211);
+            rule__IfStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__2"
+
+
+    // $ANTLR start "rule__IfStatement__Group__2__Impl"
+    // InternalFormalML.g:48410:1: rule__IfStatement__Group__2__Impl : ( ( rule__IfStatement__BodyBlockAssignment_2 ) ) ;
+    public final void rule__IfStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48414:1: ( ( ( rule__IfStatement__BodyBlockAssignment_2 ) ) )
+            // InternalFormalML.g:48415:1: ( ( rule__IfStatement__BodyBlockAssignment_2 ) )
+            {
+            // InternalFormalML.g:48415:1: ( ( rule__IfStatement__BodyBlockAssignment_2 ) )
+            // InternalFormalML.g:48416:2: ( rule__IfStatement__BodyBlockAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getBodyBlockAssignment_2()); 
+            }
+            // InternalFormalML.g:48417:2: ( rule__IfStatement__BodyBlockAssignment_2 )
+            // InternalFormalML.g:48417:3: rule__IfStatement__BodyBlockAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__BodyBlockAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getBodyBlockAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__IfStatement__Group__3"
+    // InternalFormalML.g:48425:1: rule__IfStatement__Group__3 : rule__IfStatement__Group__3__Impl rule__IfStatement__Group__4 ;
+    public final void rule__IfStatement__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48429:1: ( rule__IfStatement__Group__3__Impl rule__IfStatement__Group__4 )
+            // InternalFormalML.g:48430:2: rule__IfStatement__Group__3__Impl rule__IfStatement__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_211);
+            rule__IfStatement__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__3"
+
+
+    // $ANTLR start "rule__IfStatement__Group__3__Impl"
+    // InternalFormalML.g:48437:1: rule__IfStatement__Group__3__Impl : ( ( rule__IfStatement__ElseifStatementAssignment_3 )* ) ;
+    public final void rule__IfStatement__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48441:1: ( ( ( rule__IfStatement__ElseifStatementAssignment_3 )* ) )
+            // InternalFormalML.g:48442:1: ( ( rule__IfStatement__ElseifStatementAssignment_3 )* )
+            {
+            // InternalFormalML.g:48442:1: ( ( rule__IfStatement__ElseifStatementAssignment_3 )* )
+            // InternalFormalML.g:48443:2: ( rule__IfStatement__ElseifStatementAssignment_3 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getElseifStatementAssignment_3()); 
+            }
+            // InternalFormalML.g:48444:2: ( rule__IfStatement__ElseifStatementAssignment_3 )*
+            loop633:
+            do {
+                int alt633=2;
+                int LA633_0 = input.LA(1);
+
+                if ( (LA633_0==252) ) {
+                    int LA633_1 = input.LA(2);
+
+                    if ( (LA633_1==251) ) {
+                        alt633=1;
+                    }
+
+
+                }
+                else if ( (LA633_0==99) ) {
+                    alt633=1;
+                }
+
+
+                switch (alt633) {
+            	case 1 :
+            	    // InternalFormalML.g:48444:3: rule__IfStatement__ElseifStatementAssignment_3
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_212);
+            	    rule__IfStatement__ElseifStatementAssignment_3();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop633;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getElseifStatementAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__3__Impl"
+
+
+    // $ANTLR start "rule__IfStatement__Group__4"
+    // InternalFormalML.g:48452:1: rule__IfStatement__Group__4 : rule__IfStatement__Group__4__Impl ;
+    public final void rule__IfStatement__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48456:1: ( rule__IfStatement__Group__4__Impl )
+            // InternalFormalML.g:48457:2: rule__IfStatement__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__4"
+
+
+    // $ANTLR start "rule__IfStatement__Group__4__Impl"
+    // InternalFormalML.g:48463:1: rule__IfStatement__Group__4__Impl : ( ( rule__IfStatement__Group_4__0 )? ) ;
+    public final void rule__IfStatement__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48467:1: ( ( ( rule__IfStatement__Group_4__0 )? ) )
+            // InternalFormalML.g:48468:1: ( ( rule__IfStatement__Group_4__0 )? )
+            {
+            // InternalFormalML.g:48468:1: ( ( rule__IfStatement__Group_4__0 )? )
+            // InternalFormalML.g:48469:2: ( rule__IfStatement__Group_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getGroup_4()); 
+            }
+            // InternalFormalML.g:48470:2: ( rule__IfStatement__Group_4__0 )?
+            int alt634=2;
+            int LA634_0 = input.LA(1);
+
+            if ( (LA634_0==252) ) {
+                alt634=1;
+            }
+            switch (alt634) {
+                case 1 :
+                    // InternalFormalML.g:48470:3: rule__IfStatement__Group_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__IfStatement__Group_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group__4__Impl"
+
+
+    // $ANTLR start "rule__IfStatement__Group_4__0"
+    // InternalFormalML.g:48479:1: rule__IfStatement__Group_4__0 : rule__IfStatement__Group_4__0__Impl rule__IfStatement__Group_4__1 ;
+    public final void rule__IfStatement__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48483:1: ( rule__IfStatement__Group_4__0__Impl rule__IfStatement__Group_4__1 )
+            // InternalFormalML.g:48484:2: rule__IfStatement__Group_4__0__Impl rule__IfStatement__Group_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__IfStatement__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group_4__0"
+
+
+    // $ANTLR start "rule__IfStatement__Group_4__0__Impl"
+    // InternalFormalML.g:48491:1: rule__IfStatement__Group_4__0__Impl : ( 'else' ) ;
+    public final void rule__IfStatement__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48495:1: ( ( 'else' ) )
+            // InternalFormalML.g:48496:1: ( 'else' )
+            {
+            // InternalFormalML.g:48496:1: ( 'else' )
+            // InternalFormalML.g:48497:2: 'else'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getElseKeyword_4_0()); 
+            }
+            match(input,252,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getElseKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__IfStatement__Group_4__1"
+    // InternalFormalML.g:48506:1: rule__IfStatement__Group_4__1 : rule__IfStatement__Group_4__1__Impl ;
+    public final void rule__IfStatement__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48510:1: ( rule__IfStatement__Group_4__1__Impl )
+            // InternalFormalML.g:48511:2: rule__IfStatement__Group_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group_4__1"
+
+
+    // $ANTLR start "rule__IfStatement__Group_4__1__Impl"
+    // InternalFormalML.g:48517:1: rule__IfStatement__Group_4__1__Impl : ( ( rule__IfStatement__ElseBlockAssignment_4_1 ) ) ;
+    public final void rule__IfStatement__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48521:1: ( ( ( rule__IfStatement__ElseBlockAssignment_4_1 ) ) )
+            // InternalFormalML.g:48522:1: ( ( rule__IfStatement__ElseBlockAssignment_4_1 ) )
+            {
+            // InternalFormalML.g:48522:1: ( ( rule__IfStatement__ElseBlockAssignment_4_1 ) )
+            // InternalFormalML.g:48523:2: ( rule__IfStatement__ElseBlockAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getElseBlockAssignment_4_1()); 
+            }
+            // InternalFormalML.g:48524:2: ( rule__IfStatement__ElseBlockAssignment_4_1 )
+            // InternalFormalML.g:48524:3: rule__IfStatement__ElseBlockAssignment_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IfStatement__ElseBlockAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getElseBlockAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group__0"
+    // InternalFormalML.g:48533:1: rule__ElseIfStatement__Group__0 : rule__ElseIfStatement__Group__0__Impl rule__ElseIfStatement__Group__1 ;
+    public final void rule__ElseIfStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48537:1: ( rule__ElseIfStatement__Group__0__Impl rule__ElseIfStatement__Group__1 )
+            // InternalFormalML.g:48538:2: rule__ElseIfStatement__Group__0__Impl rule__ElseIfStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ElseIfStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ElseIfStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group__0"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group__0__Impl"
+    // InternalFormalML.g:48545:1: rule__ElseIfStatement__Group__0__Impl : ( ( rule__ElseIfStatement__Alternatives_0 ) ) ;
+    public final void rule__ElseIfStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48549:1: ( ( ( rule__ElseIfStatement__Alternatives_0 ) ) )
+            // InternalFormalML.g:48550:1: ( ( rule__ElseIfStatement__Alternatives_0 ) )
+            {
+            // InternalFormalML.g:48550:1: ( ( rule__ElseIfStatement__Alternatives_0 ) )
+            // InternalFormalML.g:48551:2: ( rule__ElseIfStatement__Alternatives_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getElseIfStatementAccess().getAlternatives_0()); 
+            }
+            // InternalFormalML.g:48552:2: ( rule__ElseIfStatement__Alternatives_0 )
+            // InternalFormalML.g:48552:3: rule__ElseIfStatement__Alternatives_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ElseIfStatement__Alternatives_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getElseIfStatementAccess().getAlternatives_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group__1"
+    // InternalFormalML.g:48560:1: rule__ElseIfStatement__Group__1 : rule__ElseIfStatement__Group__1__Impl rule__ElseIfStatement__Group__2 ;
+    public final void rule__ElseIfStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48564:1: ( rule__ElseIfStatement__Group__1__Impl rule__ElseIfStatement__Group__2 )
+            // InternalFormalML.g:48565:2: rule__ElseIfStatement__Group__1__Impl rule__ElseIfStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ElseIfStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ElseIfStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group__1"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group__1__Impl"
+    // InternalFormalML.g:48572:1: rule__ElseIfStatement__Group__1__Impl : ( ( rule__ElseIfStatement__ConditionAssignment_1 ) ) ;
+    public final void rule__ElseIfStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48576:1: ( ( ( rule__ElseIfStatement__ConditionAssignment_1 ) ) )
+            // InternalFormalML.g:48577:1: ( ( rule__ElseIfStatement__ConditionAssignment_1 ) )
+            {
+            // InternalFormalML.g:48577:1: ( ( rule__ElseIfStatement__ConditionAssignment_1 ) )
+            // InternalFormalML.g:48578:2: ( rule__ElseIfStatement__ConditionAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getElseIfStatementAccess().getConditionAssignment_1()); 
+            }
+            // InternalFormalML.g:48579:2: ( rule__ElseIfStatement__ConditionAssignment_1 )
+            // InternalFormalML.g:48579:3: rule__ElseIfStatement__ConditionAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ElseIfStatement__ConditionAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getElseIfStatementAccess().getConditionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group__2"
+    // InternalFormalML.g:48587:1: rule__ElseIfStatement__Group__2 : rule__ElseIfStatement__Group__2__Impl ;
+    public final void rule__ElseIfStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48591:1: ( rule__ElseIfStatement__Group__2__Impl )
+            // InternalFormalML.g:48592:2: rule__ElseIfStatement__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ElseIfStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group__2"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group__2__Impl"
+    // InternalFormalML.g:48598:1: rule__ElseIfStatement__Group__2__Impl : ( ( rule__ElseIfStatement__BodyBlockAssignment_2 ) ) ;
+    public final void rule__ElseIfStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48602:1: ( ( ( rule__ElseIfStatement__BodyBlockAssignment_2 ) ) )
+            // InternalFormalML.g:48603:1: ( ( rule__ElseIfStatement__BodyBlockAssignment_2 ) )
+            {
+            // InternalFormalML.g:48603:1: ( ( rule__ElseIfStatement__BodyBlockAssignment_2 ) )
+            // InternalFormalML.g:48604:2: ( rule__ElseIfStatement__BodyBlockAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getElseIfStatementAccess().getBodyBlockAssignment_2()); 
+            }
+            // InternalFormalML.g:48605:2: ( rule__ElseIfStatement__BodyBlockAssignment_2 )
+            // InternalFormalML.g:48605:3: rule__ElseIfStatement__BodyBlockAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ElseIfStatement__BodyBlockAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getElseIfStatementAccess().getBodyBlockAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group_0_1__0"
+    // InternalFormalML.g:48614:1: rule__ElseIfStatement__Group_0_1__0 : rule__ElseIfStatement__Group_0_1__0__Impl rule__ElseIfStatement__Group_0_1__1 ;
+    public final void rule__ElseIfStatement__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48618:1: ( rule__ElseIfStatement__Group_0_1__0__Impl rule__ElseIfStatement__Group_0_1__1 )
+            // InternalFormalML.g:48619:2: rule__ElseIfStatement__Group_0_1__0__Impl rule__ElseIfStatement__Group_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_213);
+            rule__ElseIfStatement__Group_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ElseIfStatement__Group_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group_0_1__0"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group_0_1__0__Impl"
+    // InternalFormalML.g:48626:1: rule__ElseIfStatement__Group_0_1__0__Impl : ( 'else' ) ;
+    public final void rule__ElseIfStatement__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48630:1: ( ( 'else' ) )
+            // InternalFormalML.g:48631:1: ( 'else' )
+            {
+            // InternalFormalML.g:48631:1: ( 'else' )
+            // InternalFormalML.g:48632:2: 'else'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getElseIfStatementAccess().getElseKeyword_0_1_0()); 
+            }
+            match(input,252,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getElseIfStatementAccess().getElseKeyword_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group_0_1__1"
+    // InternalFormalML.g:48641:1: rule__ElseIfStatement__Group_0_1__1 : rule__ElseIfStatement__Group_0_1__1__Impl ;
+    public final void rule__ElseIfStatement__Group_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48645:1: ( rule__ElseIfStatement__Group_0_1__1__Impl )
+            // InternalFormalML.g:48646:2: rule__ElseIfStatement__Group_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ElseIfStatement__Group_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group_0_1__1"
+
+
+    // $ANTLR start "rule__ElseIfStatement__Group_0_1__1__Impl"
+    // InternalFormalML.g:48652:1: rule__ElseIfStatement__Group_0_1__1__Impl : ( 'if' ) ;
+    public final void rule__ElseIfStatement__Group_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48656:1: ( ( 'if' ) )
+            // InternalFormalML.g:48657:1: ( 'if' )
+            {
+            // InternalFormalML.g:48657:1: ( 'if' )
+            // InternalFormalML.g:48658:2: 'if'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getElseIfStatementAccess().getIfKeyword_0_1_1()); 
+            }
+            match(input,251,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getElseIfStatementAccess().getIfKeyword_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__Group_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__WhileDoStatement__Group__0"
+    // InternalFormalML.g:48668:1: rule__WhileDoStatement__Group__0 : rule__WhileDoStatement__Group__0__Impl rule__WhileDoStatement__Group__1 ;
+    public final void rule__WhileDoStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48672:1: ( rule__WhileDoStatement__Group__0__Impl rule__WhileDoStatement__Group__1 )
+            // InternalFormalML.g:48673:2: rule__WhileDoStatement__Group__0__Impl rule__WhileDoStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__WhileDoStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__WhileDoStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__WhileDoStatement__Group__0"
+
+
+    // $ANTLR start "rule__WhileDoStatement__Group__0__Impl"
+    // InternalFormalML.g:48680:1: rule__WhileDoStatement__Group__0__Impl : ( 'while' ) ;
+    public final void rule__WhileDoStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48684:1: ( ( 'while' ) )
+            // InternalFormalML.g:48685:1: ( 'while' )
+            {
+            // InternalFormalML.g:48685:1: ( 'while' )
+            // InternalFormalML.g:48686:2: 'while'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWhileDoStatementAccess().getWhileKeyword_0()); 
+            }
+            match(input,253,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWhileDoStatementAccess().getWhileKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__WhileDoStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__WhileDoStatement__Group__1"
+    // InternalFormalML.g:48695:1: rule__WhileDoStatement__Group__1 : rule__WhileDoStatement__Group__1__Impl rule__WhileDoStatement__Group__2 ;
+    public final void rule__WhileDoStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48699:1: ( rule__WhileDoStatement__Group__1__Impl rule__WhileDoStatement__Group__2 )
+            // InternalFormalML.g:48700:2: rule__WhileDoStatement__Group__1__Impl rule__WhileDoStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__WhileDoStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__WhileDoStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__WhileDoStatement__Group__1"
+
+
+    // $ANTLR start "rule__WhileDoStatement__Group__1__Impl"
+    // InternalFormalML.g:48707:1: rule__WhileDoStatement__Group__1__Impl : ( ( rule__WhileDoStatement__ConditionAssignment_1 ) ) ;
+    public final void rule__WhileDoStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48711:1: ( ( ( rule__WhileDoStatement__ConditionAssignment_1 ) ) )
+            // InternalFormalML.g:48712:1: ( ( rule__WhileDoStatement__ConditionAssignment_1 ) )
+            {
+            // InternalFormalML.g:48712:1: ( ( rule__WhileDoStatement__ConditionAssignment_1 ) )
+            // InternalFormalML.g:48713:2: ( rule__WhileDoStatement__ConditionAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWhileDoStatementAccess().getConditionAssignment_1()); 
+            }
+            // InternalFormalML.g:48714:2: ( rule__WhileDoStatement__ConditionAssignment_1 )
+            // InternalFormalML.g:48714:3: rule__WhileDoStatement__ConditionAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__WhileDoStatement__ConditionAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWhileDoStatementAccess().getConditionAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__WhileDoStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__WhileDoStatement__Group__2"
+    // InternalFormalML.g:48722:1: rule__WhileDoStatement__Group__2 : rule__WhileDoStatement__Group__2__Impl ;
+    public final void rule__WhileDoStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48726:1: ( rule__WhileDoStatement__Group__2__Impl )
+            // InternalFormalML.g:48727:2: rule__WhileDoStatement__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__WhileDoStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__WhileDoStatement__Group__2"
+
+
+    // $ANTLR start "rule__WhileDoStatement__Group__2__Impl"
+    // InternalFormalML.g:48733:1: rule__WhileDoStatement__Group__2__Impl : ( ( rule__WhileDoStatement__BodyBlockAssignment_2 ) ) ;
+    public final void rule__WhileDoStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48737:1: ( ( ( rule__WhileDoStatement__BodyBlockAssignment_2 ) ) )
+            // InternalFormalML.g:48738:1: ( ( rule__WhileDoStatement__BodyBlockAssignment_2 ) )
+            {
+            // InternalFormalML.g:48738:1: ( ( rule__WhileDoStatement__BodyBlockAssignment_2 ) )
+            // InternalFormalML.g:48739:2: ( rule__WhileDoStatement__BodyBlockAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWhileDoStatementAccess().getBodyBlockAssignment_2()); 
+            }
+            // InternalFormalML.g:48740:2: ( rule__WhileDoStatement__BodyBlockAssignment_2 )
+            // InternalFormalML.g:48740:3: rule__WhileDoStatement__BodyBlockAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__WhileDoStatement__BodyBlockAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWhileDoStatementAccess().getBodyBlockAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__WhileDoStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__0"
+    // InternalFormalML.g:48749:1: rule__DoWhileStatement__Group__0 : rule__DoWhileStatement__Group__0__Impl rule__DoWhileStatement__Group__1 ;
+    public final void rule__DoWhileStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48753:1: ( rule__DoWhileStatement__Group__0__Impl rule__DoWhileStatement__Group__1 )
+            // InternalFormalML.g:48754:2: rule__DoWhileStatement__Group__0__Impl rule__DoWhileStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__DoWhileStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DoWhileStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__0"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__0__Impl"
+    // InternalFormalML.g:48761:1: rule__DoWhileStatement__Group__0__Impl : ( 'do' ) ;
+    public final void rule__DoWhileStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48765:1: ( ( 'do' ) )
+            // InternalFormalML.g:48766:1: ( 'do' )
+            {
+            // InternalFormalML.g:48766:1: ( 'do' )
+            // InternalFormalML.g:48767:2: 'do'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDoWhileStatementAccess().getDoKeyword_0()); 
+            }
+            match(input,254,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDoWhileStatementAccess().getDoKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__1"
+    // InternalFormalML.g:48776:1: rule__DoWhileStatement__Group__1 : rule__DoWhileStatement__Group__1__Impl rule__DoWhileStatement__Group__2 ;
+    public final void rule__DoWhileStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48780:1: ( rule__DoWhileStatement__Group__1__Impl rule__DoWhileStatement__Group__2 )
+            // InternalFormalML.g:48781:2: rule__DoWhileStatement__Group__1__Impl rule__DoWhileStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_214);
+            rule__DoWhileStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DoWhileStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__1"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__1__Impl"
+    // InternalFormalML.g:48788:1: rule__DoWhileStatement__Group__1__Impl : ( ( rule__DoWhileStatement__BodyBlockAssignment_1 ) ) ;
+    public final void rule__DoWhileStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48792:1: ( ( ( rule__DoWhileStatement__BodyBlockAssignment_1 ) ) )
+            // InternalFormalML.g:48793:1: ( ( rule__DoWhileStatement__BodyBlockAssignment_1 ) )
+            {
+            // InternalFormalML.g:48793:1: ( ( rule__DoWhileStatement__BodyBlockAssignment_1 ) )
+            // InternalFormalML.g:48794:2: ( rule__DoWhileStatement__BodyBlockAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDoWhileStatementAccess().getBodyBlockAssignment_1()); 
+            }
+            // InternalFormalML.g:48795:2: ( rule__DoWhileStatement__BodyBlockAssignment_1 )
+            // InternalFormalML.g:48795:3: rule__DoWhileStatement__BodyBlockAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DoWhileStatement__BodyBlockAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDoWhileStatementAccess().getBodyBlockAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__2"
+    // InternalFormalML.g:48803:1: rule__DoWhileStatement__Group__2 : rule__DoWhileStatement__Group__2__Impl rule__DoWhileStatement__Group__3 ;
+    public final void rule__DoWhileStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48807:1: ( rule__DoWhileStatement__Group__2__Impl rule__DoWhileStatement__Group__3 )
+            // InternalFormalML.g:48808:2: rule__DoWhileStatement__Group__2__Impl rule__DoWhileStatement__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__DoWhileStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DoWhileStatement__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__2"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__2__Impl"
+    // InternalFormalML.g:48815:1: rule__DoWhileStatement__Group__2__Impl : ( 'while' ) ;
+    public final void rule__DoWhileStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48819:1: ( ( 'while' ) )
+            // InternalFormalML.g:48820:1: ( 'while' )
+            {
+            // InternalFormalML.g:48820:1: ( 'while' )
+            // InternalFormalML.g:48821:2: 'while'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2()); 
+            }
+            match(input,253,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__3"
+    // InternalFormalML.g:48830:1: rule__DoWhileStatement__Group__3 : rule__DoWhileStatement__Group__3__Impl rule__DoWhileStatement__Group__4 ;
+    public final void rule__DoWhileStatement__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48834:1: ( rule__DoWhileStatement__Group__3__Impl rule__DoWhileStatement__Group__4 )
+            // InternalFormalML.g:48835:2: rule__DoWhileStatement__Group__3__Impl rule__DoWhileStatement__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__DoWhileStatement__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DoWhileStatement__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__3"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__3__Impl"
+    // InternalFormalML.g:48842:1: rule__DoWhileStatement__Group__3__Impl : ( ( rule__DoWhileStatement__ConditionAssignment_3 ) ) ;
+    public final void rule__DoWhileStatement__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48846:1: ( ( ( rule__DoWhileStatement__ConditionAssignment_3 ) ) )
+            // InternalFormalML.g:48847:1: ( ( rule__DoWhileStatement__ConditionAssignment_3 ) )
+            {
+            // InternalFormalML.g:48847:1: ( ( rule__DoWhileStatement__ConditionAssignment_3 ) )
+            // InternalFormalML.g:48848:2: ( rule__DoWhileStatement__ConditionAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_3()); 
+            }
+            // InternalFormalML.g:48849:2: ( rule__DoWhileStatement__ConditionAssignment_3 )
+            // InternalFormalML.g:48849:3: rule__DoWhileStatement__ConditionAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DoWhileStatement__ConditionAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDoWhileStatementAccess().getConditionAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__3__Impl"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__4"
+    // InternalFormalML.g:48857:1: rule__DoWhileStatement__Group__4 : rule__DoWhileStatement__Group__4__Impl ;
+    public final void rule__DoWhileStatement__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48861:1: ( rule__DoWhileStatement__Group__4__Impl )
+            // InternalFormalML.g:48862:2: rule__DoWhileStatement__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DoWhileStatement__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__4"
+
+
+    // $ANTLR start "rule__DoWhileStatement__Group__4__Impl"
+    // InternalFormalML.g:48868:1: rule__DoWhileStatement__Group__4__Impl : ( ';' ) ;
+    public final void rule__DoWhileStatement__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48872:1: ( ( ';' ) )
+            // InternalFormalML.g:48873:1: ( ';' )
+            {
+            // InternalFormalML.g:48873:1: ( ';' )
+            // InternalFormalML.g:48874:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_4()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__Group__4__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__0"
+    // InternalFormalML.g:48884:1: rule__ForStatement__Group_0__0 : rule__ForStatement__Group_0__0__Impl rule__ForStatement__Group_0__1 ;
+    public final void rule__ForStatement__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48888:1: ( rule__ForStatement__Group_0__0__Impl rule__ForStatement__Group_0__1 )
+            // InternalFormalML.g:48889:2: rule__ForStatement__Group_0__0__Impl rule__ForStatement__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_215);
+            rule__ForStatement__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__0"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__0__Impl"
+    // InternalFormalML.g:48896:1: rule__ForStatement__Group_0__0__Impl : ( 'for' ) ;
+    public final void rule__ForStatement__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48900:1: ( ( 'for' ) )
+            // InternalFormalML.g:48901:1: ( 'for' )
+            {
+            // InternalFormalML.g:48901:1: ( 'for' )
+            // InternalFormalML.g:48902:2: 'for'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getForKeyword_0_0()); 
+            }
+            match(input,255,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getForKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__1"
+    // InternalFormalML.g:48911:1: rule__ForStatement__Group_0__1 : rule__ForStatement__Group_0__1__Impl rule__ForStatement__Group_0__2 ;
+    public final void rule__ForStatement__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48915:1: ( rule__ForStatement__Group_0__1__Impl rule__ForStatement__Group_0__2 )
+            // InternalFormalML.g:48916:2: rule__ForStatement__Group_0__1__Impl rule__ForStatement__Group_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_215);
+            rule__ForStatement__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__1"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__1__Impl"
+    // InternalFormalML.g:48923:1: rule__ForStatement__Group_0__1__Impl : ( ( rule__ForStatement__InitAssignment_0_1 )? ) ;
+    public final void rule__ForStatement__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48927:1: ( ( ( rule__ForStatement__InitAssignment_0_1 )? ) )
+            // InternalFormalML.g:48928:1: ( ( rule__ForStatement__InitAssignment_0_1 )? )
+            {
+            // InternalFormalML.g:48928:1: ( ( rule__ForStatement__InitAssignment_0_1 )? )
+            // InternalFormalML.g:48929:2: ( rule__ForStatement__InitAssignment_0_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getInitAssignment_0_1()); 
+            }
+            // InternalFormalML.g:48930:2: ( rule__ForStatement__InitAssignment_0_1 )?
+            int alt635=2;
+            int LA635_0 = input.LA(1);
+
+            if ( (LA635_0==RULE_XLIA_ID||LA635_0==23||(LA635_0>=129 && LA635_0<=130)||(LA635_0>=141 && LA635_0<=142)||(LA635_0>=265 && LA635_0<=271)) ) {
+                alt635=1;
+            }
+            switch (alt635) {
+                case 1 :
+                    // InternalFormalML.g:48930:3: rule__ForStatement__InitAssignment_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ForStatement__InitAssignment_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getInitAssignment_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__2"
+    // InternalFormalML.g:48938:1: rule__ForStatement__Group_0__2 : rule__ForStatement__Group_0__2__Impl rule__ForStatement__Group_0__3 ;
+    public final void rule__ForStatement__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48942:1: ( rule__ForStatement__Group_0__2__Impl rule__ForStatement__Group_0__3 )
+            // InternalFormalML.g:48943:2: rule__ForStatement__Group_0__2__Impl rule__ForStatement__Group_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ForStatement__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__2"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__2__Impl"
+    // InternalFormalML.g:48950:1: rule__ForStatement__Group_0__2__Impl : ( ';' ) ;
+    public final void rule__ForStatement__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48954:1: ( ( ';' ) )
+            // InternalFormalML.g:48955:1: ( ';' )
+            {
+            // InternalFormalML.g:48955:1: ( ';' )
+            // InternalFormalML.g:48956:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getSemicolonKeyword_0_2()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getSemicolonKeyword_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__3"
+    // InternalFormalML.g:48965:1: rule__ForStatement__Group_0__3 : rule__ForStatement__Group_0__3__Impl rule__ForStatement__Group_0__4 ;
+    public final void rule__ForStatement__Group_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48969:1: ( rule__ForStatement__Group_0__3__Impl rule__ForStatement__Group_0__4 )
+            // InternalFormalML.g:48970:2: rule__ForStatement__Group_0__3__Impl rule__ForStatement__Group_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ForStatement__Group_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__3"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__3__Impl"
+    // InternalFormalML.g:48977:1: rule__ForStatement__Group_0__3__Impl : ( ( rule__ForStatement__ConditionAssignment_0_3 ) ) ;
+    public final void rule__ForStatement__Group_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48981:1: ( ( ( rule__ForStatement__ConditionAssignment_0_3 ) ) )
+            // InternalFormalML.g:48982:1: ( ( rule__ForStatement__ConditionAssignment_0_3 ) )
+            {
+            // InternalFormalML.g:48982:1: ( ( rule__ForStatement__ConditionAssignment_0_3 ) )
+            // InternalFormalML.g:48983:2: ( rule__ForStatement__ConditionAssignment_0_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getConditionAssignment_0_3()); 
+            }
+            // InternalFormalML.g:48984:2: ( rule__ForStatement__ConditionAssignment_0_3 )
+            // InternalFormalML.g:48984:3: rule__ForStatement__ConditionAssignment_0_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__ConditionAssignment_0_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getConditionAssignment_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__3__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__4"
+    // InternalFormalML.g:48992:1: rule__ForStatement__Group_0__4 : rule__ForStatement__Group_0__4__Impl rule__ForStatement__Group_0__5 ;
+    public final void rule__ForStatement__Group_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:48996:1: ( rule__ForStatement__Group_0__4__Impl rule__ForStatement__Group_0__5 )
+            // InternalFormalML.g:48997:2: rule__ForStatement__Group_0__4__Impl rule__ForStatement__Group_0__5
+            {
+            pushFollow(FollowSets000.FOLLOW_216);
+            rule__ForStatement__Group_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_0__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__4"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__4__Impl"
+    // InternalFormalML.g:49004:1: rule__ForStatement__Group_0__4__Impl : ( ';' ) ;
+    public final void rule__ForStatement__Group_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49008:1: ( ( ';' ) )
+            // InternalFormalML.g:49009:1: ( ';' )
+            {
+            // InternalFormalML.g:49009:1: ( ';' )
+            // InternalFormalML.g:49010:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getSemicolonKeyword_0_4()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getSemicolonKeyword_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__4__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__5"
+    // InternalFormalML.g:49019:1: rule__ForStatement__Group_0__5 : rule__ForStatement__Group_0__5__Impl rule__ForStatement__Group_0__6 ;
+    public final void rule__ForStatement__Group_0__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49023:1: ( rule__ForStatement__Group_0__5__Impl rule__ForStatement__Group_0__6 )
+            // InternalFormalML.g:49024:2: rule__ForStatement__Group_0__5__Impl rule__ForStatement__Group_0__6
+            {
+            pushFollow(FollowSets000.FOLLOW_216);
+            rule__ForStatement__Group_0__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_0__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__5"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__5__Impl"
+    // InternalFormalML.g:49031:1: rule__ForStatement__Group_0__5__Impl : ( ( rule__ForStatement__IterateAssignment_0_5 )? ) ;
+    public final void rule__ForStatement__Group_0__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49035:1: ( ( ( rule__ForStatement__IterateAssignment_0_5 )? ) )
+            // InternalFormalML.g:49036:1: ( ( rule__ForStatement__IterateAssignment_0_5 )? )
+            {
+            // InternalFormalML.g:49036:1: ( ( rule__ForStatement__IterateAssignment_0_5 )? )
+            // InternalFormalML.g:49037:2: ( rule__ForStatement__IterateAssignment_0_5 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getIterateAssignment_0_5()); 
+            }
+            // InternalFormalML.g:49038:2: ( rule__ForStatement__IterateAssignment_0_5 )?
+            int alt636=2;
+            int LA636_0 = input.LA(1);
+
+            if ( (LA636_0==RULE_XLIA_ID||LA636_0==23||(LA636_0>=129 && LA636_0<=130)||(LA636_0>=141 && LA636_0<=142)||(LA636_0>=265 && LA636_0<=271)) ) {
+                alt636=1;
+            }
+            switch (alt636) {
+                case 1 :
+                    // InternalFormalML.g:49038:3: rule__ForStatement__IterateAssignment_0_5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ForStatement__IterateAssignment_0_5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getIterateAssignment_0_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__5__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__6"
+    // InternalFormalML.g:49046:1: rule__ForStatement__Group_0__6 : rule__ForStatement__Group_0__6__Impl ;
+    public final void rule__ForStatement__Group_0__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49050:1: ( rule__ForStatement__Group_0__6__Impl )
+            // InternalFormalML.g:49051:2: rule__ForStatement__Group_0__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_0__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__6"
+
+
+    // $ANTLR start "rule__ForStatement__Group_0__6__Impl"
+    // InternalFormalML.g:49057:1: rule__ForStatement__Group_0__6__Impl : ( ( rule__ForStatement__BodyBlockAssignment_0_6 ) ) ;
+    public final void rule__ForStatement__Group_0__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49061:1: ( ( ( rule__ForStatement__BodyBlockAssignment_0_6 ) ) )
+            // InternalFormalML.g:49062:1: ( ( rule__ForStatement__BodyBlockAssignment_0_6 ) )
+            {
+            // InternalFormalML.g:49062:1: ( ( rule__ForStatement__BodyBlockAssignment_0_6 ) )
+            // InternalFormalML.g:49063:2: ( rule__ForStatement__BodyBlockAssignment_0_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getBodyBlockAssignment_0_6()); 
+            }
+            // InternalFormalML.g:49064:2: ( rule__ForStatement__BodyBlockAssignment_0_6 )
+            // InternalFormalML.g:49064:3: rule__ForStatement__BodyBlockAssignment_0_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__BodyBlockAssignment_0_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getBodyBlockAssignment_0_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_0__6__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__0"
+    // InternalFormalML.g:49073:1: rule__ForStatement__Group_1__0 : rule__ForStatement__Group_1__0__Impl rule__ForStatement__Group_1__1 ;
+    public final void rule__ForStatement__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49077:1: ( rule__ForStatement__Group_1__0__Impl rule__ForStatement__Group_1__1 )
+            // InternalFormalML.g:49078:2: rule__ForStatement__Group_1__0__Impl rule__ForStatement__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_217);
+            rule__ForStatement__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__0"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__0__Impl"
+    // InternalFormalML.g:49085:1: rule__ForStatement__Group_1__0__Impl : ( 'for' ) ;
+    public final void rule__ForStatement__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49089:1: ( ( 'for' ) )
+            // InternalFormalML.g:49090:1: ( 'for' )
+            {
+            // InternalFormalML.g:49090:1: ( 'for' )
+            // InternalFormalML.g:49091:2: 'for'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getForKeyword_1_0()); 
+            }
+            match(input,255,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getForKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__1"
+    // InternalFormalML.g:49100:1: rule__ForStatement__Group_1__1 : rule__ForStatement__Group_1__1__Impl rule__ForStatement__Group_1__2 ;
+    public final void rule__ForStatement__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49104:1: ( rule__ForStatement__Group_1__1__Impl rule__ForStatement__Group_1__2 )
+            // InternalFormalML.g:49105:2: rule__ForStatement__Group_1__1__Impl rule__ForStatement__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_215);
+            rule__ForStatement__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__1"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__1__Impl"
+    // InternalFormalML.g:49112:1: rule__ForStatement__Group_1__1__Impl : ( '(' ) ;
+    public final void rule__ForStatement__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49116:1: ( ( '(' ) )
+            // InternalFormalML.g:49117:1: ( '(' )
+            {
+            // InternalFormalML.g:49117:1: ( '(' )
+            // InternalFormalML.g:49118:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getLeftParenthesisKeyword_1_1()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getLeftParenthesisKeyword_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__2"
+    // InternalFormalML.g:49127:1: rule__ForStatement__Group_1__2 : rule__ForStatement__Group_1__2__Impl rule__ForStatement__Group_1__3 ;
+    public final void rule__ForStatement__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49131:1: ( rule__ForStatement__Group_1__2__Impl rule__ForStatement__Group_1__3 )
+            // InternalFormalML.g:49132:2: rule__ForStatement__Group_1__2__Impl rule__ForStatement__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_215);
+            rule__ForStatement__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__2"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__2__Impl"
+    // InternalFormalML.g:49139:1: rule__ForStatement__Group_1__2__Impl : ( ( rule__ForStatement__InitAssignment_1_2 )? ) ;
+    public final void rule__ForStatement__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49143:1: ( ( ( rule__ForStatement__InitAssignment_1_2 )? ) )
+            // InternalFormalML.g:49144:1: ( ( rule__ForStatement__InitAssignment_1_2 )? )
+            {
+            // InternalFormalML.g:49144:1: ( ( rule__ForStatement__InitAssignment_1_2 )? )
+            // InternalFormalML.g:49145:2: ( rule__ForStatement__InitAssignment_1_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getInitAssignment_1_2()); 
+            }
+            // InternalFormalML.g:49146:2: ( rule__ForStatement__InitAssignment_1_2 )?
+            int alt637=2;
+            int LA637_0 = input.LA(1);
+
+            if ( (LA637_0==RULE_XLIA_ID||LA637_0==23||(LA637_0>=129 && LA637_0<=130)||(LA637_0>=141 && LA637_0<=142)||(LA637_0>=265 && LA637_0<=271)) ) {
+                alt637=1;
+            }
+            switch (alt637) {
+                case 1 :
+                    // InternalFormalML.g:49146:3: rule__ForStatement__InitAssignment_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ForStatement__InitAssignment_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getInitAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__3"
+    // InternalFormalML.g:49154:1: rule__ForStatement__Group_1__3 : rule__ForStatement__Group_1__3__Impl rule__ForStatement__Group_1__4 ;
+    public final void rule__ForStatement__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49158:1: ( rule__ForStatement__Group_1__3__Impl rule__ForStatement__Group_1__4 )
+            // InternalFormalML.g:49159:2: rule__ForStatement__Group_1__3__Impl rule__ForStatement__Group_1__4
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ForStatement__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__3"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__3__Impl"
+    // InternalFormalML.g:49166:1: rule__ForStatement__Group_1__3__Impl : ( ';' ) ;
+    public final void rule__ForStatement__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49170:1: ( ( ';' ) )
+            // InternalFormalML.g:49171:1: ( ';' )
+            {
+            // InternalFormalML.g:49171:1: ( ';' )
+            // InternalFormalML.g:49172:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getSemicolonKeyword_1_3()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getSemicolonKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__4"
+    // InternalFormalML.g:49181:1: rule__ForStatement__Group_1__4 : rule__ForStatement__Group_1__4__Impl rule__ForStatement__Group_1__5 ;
+    public final void rule__ForStatement__Group_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49185:1: ( rule__ForStatement__Group_1__4__Impl rule__ForStatement__Group_1__5 )
+            // InternalFormalML.g:49186:2: rule__ForStatement__Group_1__4__Impl rule__ForStatement__Group_1__5
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__ForStatement__Group_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_1__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__4"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__4__Impl"
+    // InternalFormalML.g:49193:1: rule__ForStatement__Group_1__4__Impl : ( ( rule__ForStatement__ConditionAssignment_1_4 ) ) ;
+    public final void rule__ForStatement__Group_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49197:1: ( ( ( rule__ForStatement__ConditionAssignment_1_4 ) ) )
+            // InternalFormalML.g:49198:1: ( ( rule__ForStatement__ConditionAssignment_1_4 ) )
+            {
+            // InternalFormalML.g:49198:1: ( ( rule__ForStatement__ConditionAssignment_1_4 ) )
+            // InternalFormalML.g:49199:2: ( rule__ForStatement__ConditionAssignment_1_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getConditionAssignment_1_4()); 
+            }
+            // InternalFormalML.g:49200:2: ( rule__ForStatement__ConditionAssignment_1_4 )
+            // InternalFormalML.g:49200:3: rule__ForStatement__ConditionAssignment_1_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__ConditionAssignment_1_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getConditionAssignment_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__4__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__5"
+    // InternalFormalML.g:49208:1: rule__ForStatement__Group_1__5 : rule__ForStatement__Group_1__5__Impl rule__ForStatement__Group_1__6 ;
+    public final void rule__ForStatement__Group_1__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49212:1: ( rule__ForStatement__Group_1__5__Impl rule__ForStatement__Group_1__6 )
+            // InternalFormalML.g:49213:2: rule__ForStatement__Group_1__5__Impl rule__ForStatement__Group_1__6
+            {
+            pushFollow(FollowSets000.FOLLOW_218);
+            rule__ForStatement__Group_1__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_1__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__5"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__5__Impl"
+    // InternalFormalML.g:49220:1: rule__ForStatement__Group_1__5__Impl : ( ';' ) ;
+    public final void rule__ForStatement__Group_1__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49224:1: ( ( ';' ) )
+            // InternalFormalML.g:49225:1: ( ';' )
+            {
+            // InternalFormalML.g:49225:1: ( ';' )
+            // InternalFormalML.g:49226:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getSemicolonKeyword_1_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getSemicolonKeyword_1_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__5__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__6"
+    // InternalFormalML.g:49235:1: rule__ForStatement__Group_1__6 : rule__ForStatement__Group_1__6__Impl rule__ForStatement__Group_1__7 ;
+    public final void rule__ForStatement__Group_1__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49239:1: ( rule__ForStatement__Group_1__6__Impl rule__ForStatement__Group_1__7 )
+            // InternalFormalML.g:49240:2: rule__ForStatement__Group_1__6__Impl rule__ForStatement__Group_1__7
+            {
+            pushFollow(FollowSets000.FOLLOW_218);
+            rule__ForStatement__Group_1__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_1__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__6"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__6__Impl"
+    // InternalFormalML.g:49247:1: rule__ForStatement__Group_1__6__Impl : ( ( rule__ForStatement__IterateAssignment_1_6 )? ) ;
+    public final void rule__ForStatement__Group_1__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49251:1: ( ( ( rule__ForStatement__IterateAssignment_1_6 )? ) )
+            // InternalFormalML.g:49252:1: ( ( rule__ForStatement__IterateAssignment_1_6 )? )
+            {
+            // InternalFormalML.g:49252:1: ( ( rule__ForStatement__IterateAssignment_1_6 )? )
+            // InternalFormalML.g:49253:2: ( rule__ForStatement__IterateAssignment_1_6 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getIterateAssignment_1_6()); 
+            }
+            // InternalFormalML.g:49254:2: ( rule__ForStatement__IterateAssignment_1_6 )?
+            int alt638=2;
+            int LA638_0 = input.LA(1);
+
+            if ( (LA638_0==RULE_XLIA_ID||LA638_0==23||(LA638_0>=129 && LA638_0<=130)||(LA638_0>=141 && LA638_0<=142)||(LA638_0>=265 && LA638_0<=271)) ) {
+                alt638=1;
+            }
+            switch (alt638) {
+                case 1 :
+                    // InternalFormalML.g:49254:3: rule__ForStatement__IterateAssignment_1_6
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ForStatement__IterateAssignment_1_6();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getIterateAssignment_1_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__6__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__7"
+    // InternalFormalML.g:49262:1: rule__ForStatement__Group_1__7 : rule__ForStatement__Group_1__7__Impl rule__ForStatement__Group_1__8 ;
+    public final void rule__ForStatement__Group_1__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49266:1: ( rule__ForStatement__Group_1__7__Impl rule__ForStatement__Group_1__8 )
+            // InternalFormalML.g:49267:2: rule__ForStatement__Group_1__7__Impl rule__ForStatement__Group_1__8
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ForStatement__Group_1__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_1__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__7"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__7__Impl"
+    // InternalFormalML.g:49274:1: rule__ForStatement__Group_1__7__Impl : ( ')' ) ;
+    public final void rule__ForStatement__Group_1__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49278:1: ( ( ')' ) )
+            // InternalFormalML.g:49279:1: ( ')' )
+            {
+            // InternalFormalML.g:49279:1: ( ')' )
+            // InternalFormalML.g:49280:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getRightParenthesisKeyword_1_7()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getRightParenthesisKeyword_1_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__7__Impl"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__8"
+    // InternalFormalML.g:49289:1: rule__ForStatement__Group_1__8 : rule__ForStatement__Group_1__8__Impl ;
+    public final void rule__ForStatement__Group_1__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49293:1: ( rule__ForStatement__Group_1__8__Impl )
+            // InternalFormalML.g:49294:2: rule__ForStatement__Group_1__8__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__Group_1__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__8"
+
+
+    // $ANTLR start "rule__ForStatement__Group_1__8__Impl"
+    // InternalFormalML.g:49300:1: rule__ForStatement__Group_1__8__Impl : ( ( rule__ForStatement__BodyBlockAssignment_1_8 ) ) ;
+    public final void rule__ForStatement__Group_1__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49304:1: ( ( ( rule__ForStatement__BodyBlockAssignment_1_8 ) ) )
+            // InternalFormalML.g:49305:1: ( ( rule__ForStatement__BodyBlockAssignment_1_8 ) )
+            {
+            // InternalFormalML.g:49305:1: ( ( rule__ForStatement__BodyBlockAssignment_1_8 ) )
+            // InternalFormalML.g:49306:2: ( rule__ForStatement__BodyBlockAssignment_1_8 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getBodyBlockAssignment_1_8()); 
+            }
+            // InternalFormalML.g:49307:2: ( rule__ForStatement__BodyBlockAssignment_1_8 )
+            // InternalFormalML.g:49307:3: rule__ForStatement__BodyBlockAssignment_1_8
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForStatement__BodyBlockAssignment_1_8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getBodyBlockAssignment_1_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__Group_1__8__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__0"
+    // InternalFormalML.g:49316:1: rule__ForEachStatement__Group_0__0 : rule__ForEachStatement__Group_0__0__Impl rule__ForEachStatement__Group_0__1 ;
+    public final void rule__ForEachStatement__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49320:1: ( rule__ForEachStatement__Group_0__0__Impl rule__ForEachStatement__Group_0__1 )
+            // InternalFormalML.g:49321:2: rule__ForEachStatement__Group_0__0__Impl rule__ForEachStatement__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_219);
+            rule__ForEachStatement__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__0"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__0__Impl"
+    // InternalFormalML.g:49328:1: rule__ForEachStatement__Group_0__0__Impl : ( 'for' ) ;
+    public final void rule__ForEachStatement__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49332:1: ( ( 'for' ) )
+            // InternalFormalML.g:49333:1: ( 'for' )
+            {
+            // InternalFormalML.g:49333:1: ( 'for' )
+            // InternalFormalML.g:49334:2: 'for'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getForKeyword_0_0()); 
+            }
+            match(input,255,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getForKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__1"
+    // InternalFormalML.g:49343:1: rule__ForEachStatement__Group_0__1 : rule__ForEachStatement__Group_0__1__Impl rule__ForEachStatement__Group_0__2 ;
+    public final void rule__ForEachStatement__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49347:1: ( rule__ForEachStatement__Group_0__1__Impl rule__ForEachStatement__Group_0__2 )
+            // InternalFormalML.g:49348:2: rule__ForEachStatement__Group_0__1__Impl rule__ForEachStatement__Group_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_55);
+            rule__ForEachStatement__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__1"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__1__Impl"
+    // InternalFormalML.g:49355:1: rule__ForEachStatement__Group_0__1__Impl : ( ( rule__ForEachStatement__IteratorAssignment_0_1 ) ) ;
+    public final void rule__ForEachStatement__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49359:1: ( ( ( rule__ForEachStatement__IteratorAssignment_0_1 ) ) )
+            // InternalFormalML.g:49360:1: ( ( rule__ForEachStatement__IteratorAssignment_0_1 ) )
+            {
+            // InternalFormalML.g:49360:1: ( ( rule__ForEachStatement__IteratorAssignment_0_1 ) )
+            // InternalFormalML.g:49361:2: ( rule__ForEachStatement__IteratorAssignment_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getIteratorAssignment_0_1()); 
+            }
+            // InternalFormalML.g:49362:2: ( rule__ForEachStatement__IteratorAssignment_0_1 )
+            // InternalFormalML.g:49362:3: rule__ForEachStatement__IteratorAssignment_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__IteratorAssignment_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getIteratorAssignment_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__2"
+    // InternalFormalML.g:49370:1: rule__ForEachStatement__Group_0__2 : rule__ForEachStatement__Group_0__2__Impl rule__ForEachStatement__Group_0__3 ;
+    public final void rule__ForEachStatement__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49374:1: ( rule__ForEachStatement__Group_0__2__Impl rule__ForEachStatement__Group_0__3 )
+            // InternalFormalML.g:49375:2: rule__ForEachStatement__Group_0__2__Impl rule__ForEachStatement__Group_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ForEachStatement__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__2"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__2__Impl"
+    // InternalFormalML.g:49382:1: rule__ForEachStatement__Group_0__2__Impl : ( ':' ) ;
+    public final void rule__ForEachStatement__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49386:1: ( ( ':' ) )
+            // InternalFormalML.g:49387:1: ( ':' )
+            {
+            // InternalFormalML.g:49387:1: ( ':' )
+            // InternalFormalML.g:49388:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getColonKeyword_0_2()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getColonKeyword_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__3"
+    // InternalFormalML.g:49397:1: rule__ForEachStatement__Group_0__3 : rule__ForEachStatement__Group_0__3__Impl rule__ForEachStatement__Group_0__4 ;
+    public final void rule__ForEachStatement__Group_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49401:1: ( rule__ForEachStatement__Group_0__3__Impl rule__ForEachStatement__Group_0__4 )
+            // InternalFormalML.g:49402:2: rule__ForEachStatement__Group_0__3__Impl rule__ForEachStatement__Group_0__4
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ForEachStatement__Group_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_0__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__3"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__3__Impl"
+    // InternalFormalML.g:49409:1: rule__ForEachStatement__Group_0__3__Impl : ( ( rule__ForEachStatement__EnumerationAssignment_0_3 ) ) ;
+    public final void rule__ForEachStatement__Group_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49413:1: ( ( ( rule__ForEachStatement__EnumerationAssignment_0_3 ) ) )
+            // InternalFormalML.g:49414:1: ( ( rule__ForEachStatement__EnumerationAssignment_0_3 ) )
+            {
+            // InternalFormalML.g:49414:1: ( ( rule__ForEachStatement__EnumerationAssignment_0_3 ) )
+            // InternalFormalML.g:49415:2: ( rule__ForEachStatement__EnumerationAssignment_0_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_0_3()); 
+            }
+            // InternalFormalML.g:49416:2: ( rule__ForEachStatement__EnumerationAssignment_0_3 )
+            // InternalFormalML.g:49416:3: rule__ForEachStatement__EnumerationAssignment_0_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__EnumerationAssignment_0_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__3__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__4"
+    // InternalFormalML.g:49424:1: rule__ForEachStatement__Group_0__4 : rule__ForEachStatement__Group_0__4__Impl ;
+    public final void rule__ForEachStatement__Group_0__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49428:1: ( rule__ForEachStatement__Group_0__4__Impl )
+            // InternalFormalML.g:49429:2: rule__ForEachStatement__Group_0__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_0__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__4"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_0__4__Impl"
+    // InternalFormalML.g:49435:1: rule__ForEachStatement__Group_0__4__Impl : ( ( rule__ForEachStatement__BodyBlockAssignment_0_4 ) ) ;
+    public final void rule__ForEachStatement__Group_0__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49439:1: ( ( ( rule__ForEachStatement__BodyBlockAssignment_0_4 ) ) )
+            // InternalFormalML.g:49440:1: ( ( rule__ForEachStatement__BodyBlockAssignment_0_4 ) )
+            {
+            // InternalFormalML.g:49440:1: ( ( rule__ForEachStatement__BodyBlockAssignment_0_4 ) )
+            // InternalFormalML.g:49441:2: ( rule__ForEachStatement__BodyBlockAssignment_0_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_0_4()); 
+            }
+            // InternalFormalML.g:49442:2: ( rule__ForEachStatement__BodyBlockAssignment_0_4 )
+            // InternalFormalML.g:49442:3: rule__ForEachStatement__BodyBlockAssignment_0_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__BodyBlockAssignment_0_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_0_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_0__4__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__0"
+    // InternalFormalML.g:49451:1: rule__ForEachStatement__Group_1__0 : rule__ForEachStatement__Group_1__0__Impl rule__ForEachStatement__Group_1__1 ;
+    public final void rule__ForEachStatement__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49455:1: ( rule__ForEachStatement__Group_1__0__Impl rule__ForEachStatement__Group_1__1 )
+            // InternalFormalML.g:49456:2: rule__ForEachStatement__Group_1__0__Impl rule__ForEachStatement__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_217);
+            rule__ForEachStatement__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__0"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__0__Impl"
+    // InternalFormalML.g:49463:1: rule__ForEachStatement__Group_1__0__Impl : ( 'for' ) ;
+    public final void rule__ForEachStatement__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49467:1: ( ( 'for' ) )
+            // InternalFormalML.g:49468:1: ( 'for' )
+            {
+            // InternalFormalML.g:49468:1: ( 'for' )
+            // InternalFormalML.g:49469:2: 'for'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getForKeyword_1_0()); 
+            }
+            match(input,255,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getForKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__1"
+    // InternalFormalML.g:49478:1: rule__ForEachStatement__Group_1__1 : rule__ForEachStatement__Group_1__1__Impl rule__ForEachStatement__Group_1__2 ;
+    public final void rule__ForEachStatement__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49482:1: ( rule__ForEachStatement__Group_1__1__Impl rule__ForEachStatement__Group_1__2 )
+            // InternalFormalML.g:49483:2: rule__ForEachStatement__Group_1__1__Impl rule__ForEachStatement__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_219);
+            rule__ForEachStatement__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__1"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__1__Impl"
+    // InternalFormalML.g:49490:1: rule__ForEachStatement__Group_1__1__Impl : ( '(' ) ;
+    public final void rule__ForEachStatement__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49494:1: ( ( '(' ) )
+            // InternalFormalML.g:49495:1: ( '(' )
+            {
+            // InternalFormalML.g:49495:1: ( '(' )
+            // InternalFormalML.g:49496:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getLeftParenthesisKeyword_1_1()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getLeftParenthesisKeyword_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__2"
+    // InternalFormalML.g:49505:1: rule__ForEachStatement__Group_1__2 : rule__ForEachStatement__Group_1__2__Impl rule__ForEachStatement__Group_1__3 ;
+    public final void rule__ForEachStatement__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49509:1: ( rule__ForEachStatement__Group_1__2__Impl rule__ForEachStatement__Group_1__3 )
+            // InternalFormalML.g:49510:2: rule__ForEachStatement__Group_1__2__Impl rule__ForEachStatement__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_55);
+            rule__ForEachStatement__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__2"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__2__Impl"
+    // InternalFormalML.g:49517:1: rule__ForEachStatement__Group_1__2__Impl : ( ( rule__ForEachStatement__IteratorAssignment_1_2 ) ) ;
+    public final void rule__ForEachStatement__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49521:1: ( ( ( rule__ForEachStatement__IteratorAssignment_1_2 ) ) )
+            // InternalFormalML.g:49522:1: ( ( rule__ForEachStatement__IteratorAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:49522:1: ( ( rule__ForEachStatement__IteratorAssignment_1_2 ) )
+            // InternalFormalML.g:49523:2: ( rule__ForEachStatement__IteratorAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getIteratorAssignment_1_2()); 
+            }
+            // InternalFormalML.g:49524:2: ( rule__ForEachStatement__IteratorAssignment_1_2 )
+            // InternalFormalML.g:49524:3: rule__ForEachStatement__IteratorAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__IteratorAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getIteratorAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__3"
+    // InternalFormalML.g:49532:1: rule__ForEachStatement__Group_1__3 : rule__ForEachStatement__Group_1__3__Impl rule__ForEachStatement__Group_1__4 ;
+    public final void rule__ForEachStatement__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49536:1: ( rule__ForEachStatement__Group_1__3__Impl rule__ForEachStatement__Group_1__4 )
+            // InternalFormalML.g:49537:2: rule__ForEachStatement__Group_1__3__Impl rule__ForEachStatement__Group_1__4
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ForEachStatement__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__3"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__3__Impl"
+    // InternalFormalML.g:49544:1: rule__ForEachStatement__Group_1__3__Impl : ( ':' ) ;
+    public final void rule__ForEachStatement__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49548:1: ( ( ':' ) )
+            // InternalFormalML.g:49549:1: ( ':' )
+            {
+            // InternalFormalML.g:49549:1: ( ':' )
+            // InternalFormalML.g:49550:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getColonKeyword_1_3()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getColonKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__4"
+    // InternalFormalML.g:49559:1: rule__ForEachStatement__Group_1__4 : rule__ForEachStatement__Group_1__4__Impl rule__ForEachStatement__Group_1__5 ;
+    public final void rule__ForEachStatement__Group_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49563:1: ( rule__ForEachStatement__Group_1__4__Impl rule__ForEachStatement__Group_1__5 )
+            // InternalFormalML.g:49564:2: rule__ForEachStatement__Group_1__4__Impl rule__ForEachStatement__Group_1__5
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__ForEachStatement__Group_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_1__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__4"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__4__Impl"
+    // InternalFormalML.g:49571:1: rule__ForEachStatement__Group_1__4__Impl : ( ( rule__ForEachStatement__EnumerationAssignment_1_4 ) ) ;
+    public final void rule__ForEachStatement__Group_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49575:1: ( ( ( rule__ForEachStatement__EnumerationAssignment_1_4 ) ) )
+            // InternalFormalML.g:49576:1: ( ( rule__ForEachStatement__EnumerationAssignment_1_4 ) )
+            {
+            // InternalFormalML.g:49576:1: ( ( rule__ForEachStatement__EnumerationAssignment_1_4 ) )
+            // InternalFormalML.g:49577:2: ( rule__ForEachStatement__EnumerationAssignment_1_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_1_4()); 
+            }
+            // InternalFormalML.g:49578:2: ( rule__ForEachStatement__EnumerationAssignment_1_4 )
+            // InternalFormalML.g:49578:3: rule__ForEachStatement__EnumerationAssignment_1_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__EnumerationAssignment_1_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getEnumerationAssignment_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__4__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__5"
+    // InternalFormalML.g:49586:1: rule__ForEachStatement__Group_1__5 : rule__ForEachStatement__Group_1__5__Impl rule__ForEachStatement__Group_1__6 ;
+    public final void rule__ForEachStatement__Group_1__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49590:1: ( rule__ForEachStatement__Group_1__5__Impl rule__ForEachStatement__Group_1__6 )
+            // InternalFormalML.g:49591:2: rule__ForEachStatement__Group_1__5__Impl rule__ForEachStatement__Group_1__6
+            {
+            pushFollow(FollowSets000.FOLLOW_74);
+            rule__ForEachStatement__Group_1__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_1__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__5"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__5__Impl"
+    // InternalFormalML.g:49598:1: rule__ForEachStatement__Group_1__5__Impl : ( ')' ) ;
+    public final void rule__ForEachStatement__Group_1__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49602:1: ( ( ')' ) )
+            // InternalFormalML.g:49603:1: ( ')' )
+            {
+            // InternalFormalML.g:49603:1: ( ')' )
+            // InternalFormalML.g:49604:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getRightParenthesisKeyword_1_5()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getRightParenthesisKeyword_1_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__5__Impl"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__6"
+    // InternalFormalML.g:49613:1: rule__ForEachStatement__Group_1__6 : rule__ForEachStatement__Group_1__6__Impl ;
+    public final void rule__ForEachStatement__Group_1__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49617:1: ( rule__ForEachStatement__Group_1__6__Impl )
+            // InternalFormalML.g:49618:2: rule__ForEachStatement__Group_1__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__Group_1__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__6"
+
+
+    // $ANTLR start "rule__ForEachStatement__Group_1__6__Impl"
+    // InternalFormalML.g:49624:1: rule__ForEachStatement__Group_1__6__Impl : ( ( rule__ForEachStatement__BodyBlockAssignment_1_6 ) ) ;
+    public final void rule__ForEachStatement__Group_1__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49628:1: ( ( ( rule__ForEachStatement__BodyBlockAssignment_1_6 ) ) )
+            // InternalFormalML.g:49629:1: ( ( rule__ForEachStatement__BodyBlockAssignment_1_6 ) )
+            {
+            // InternalFormalML.g:49629:1: ( ( rule__ForEachStatement__BodyBlockAssignment_1_6 ) )
+            // InternalFormalML.g:49630:2: ( rule__ForEachStatement__BodyBlockAssignment_1_6 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_1_6()); 
+            }
+            // InternalFormalML.g:49631:2: ( rule__ForEachStatement__BodyBlockAssignment_1_6 )
+            // InternalFormalML.g:49631:3: rule__ForEachStatement__BodyBlockAssignment_1_6
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ForEachStatement__BodyBlockAssignment_1_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getBodyBlockAssignment_1_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__Group_1__6__Impl"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group__0"
+    // InternalFormalML.g:49640:1: rule__InterruptStatement__Group__0 : rule__InterruptStatement__Group__0__Impl rule__InterruptStatement__Group__1 ;
+    public final void rule__InterruptStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49644:1: ( rule__InterruptStatement__Group__0__Impl rule__InterruptStatement__Group__1 )
+            // InternalFormalML.g:49645:2: rule__InterruptStatement__Group__0__Impl rule__InterruptStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_220);
+            rule__InterruptStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group__0"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group__0__Impl"
+    // InternalFormalML.g:49652:1: rule__InterruptStatement__Group__0__Impl : ( ( rule__InterruptStatement__KindAssignment_0 ) ) ;
+    public final void rule__InterruptStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49656:1: ( ( ( rule__InterruptStatement__KindAssignment_0 ) ) )
+            // InternalFormalML.g:49657:1: ( ( rule__InterruptStatement__KindAssignment_0 ) )
+            {
+            // InternalFormalML.g:49657:1: ( ( rule__InterruptStatement__KindAssignment_0 ) )
+            // InternalFormalML.g:49658:2: ( rule__InterruptStatement__KindAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getKindAssignment_0()); 
+            }
+            // InternalFormalML.g:49659:2: ( rule__InterruptStatement__KindAssignment_0 )
+            // InternalFormalML.g:49659:3: rule__InterruptStatement__KindAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__KindAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getKindAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group__1"
+    // InternalFormalML.g:49667:1: rule__InterruptStatement__Group__1 : rule__InterruptStatement__Group__1__Impl rule__InterruptStatement__Group__2 ;
+    public final void rule__InterruptStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49671:1: ( rule__InterruptStatement__Group__1__Impl rule__InterruptStatement__Group__2 )
+            // InternalFormalML.g:49672:2: rule__InterruptStatement__Group__1__Impl rule__InterruptStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_220);
+            rule__InterruptStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group__1"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group__1__Impl"
+    // InternalFormalML.g:49679:1: rule__InterruptStatement__Group__1__Impl : ( ( rule__InterruptStatement__Alternatives_1 )? ) ;
+    public final void rule__InterruptStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49683:1: ( ( ( rule__InterruptStatement__Alternatives_1 )? ) )
+            // InternalFormalML.g:49684:1: ( ( rule__InterruptStatement__Alternatives_1 )? )
+            {
+            // InternalFormalML.g:49684:1: ( ( rule__InterruptStatement__Alternatives_1 )? )
+            // InternalFormalML.g:49685:2: ( rule__InterruptStatement__Alternatives_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:49686:2: ( rule__InterruptStatement__Alternatives_1 )?
+            int alt639=2;
+            int LA639_0 = input.LA(1);
+
+            if ( ((LA639_0>=RULE_CHARACTER && LA639_0<=RULE_INT)||LA639_0==20||LA639_0==23||(LA639_0>=29 && LA639_0<=30)||LA639_0==125||(LA639_0>=129 && LA639_0<=134)||(LA639_0>=137 && LA639_0<=142)||LA639_0==199||(LA639_0>=261 && LA639_0<=271)||LA639_0==287) ) {
+                alt639=1;
+            }
+            switch (alt639) {
+                case 1 :
+                    // InternalFormalML.g:49686:3: rule__InterruptStatement__Alternatives_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InterruptStatement__Alternatives_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group__2"
+    // InternalFormalML.g:49694:1: rule__InterruptStatement__Group__2 : rule__InterruptStatement__Group__2__Impl ;
+    public final void rule__InterruptStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49698:1: ( rule__InterruptStatement__Group__2__Impl )
+            // InternalFormalML.g:49699:2: rule__InterruptStatement__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group__2"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group__2__Impl"
+    // InternalFormalML.g:49705:1: rule__InterruptStatement__Group__2__Impl : ( ';' ) ;
+    public final void rule__InterruptStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49709:1: ( ( ';' ) )
+            // InternalFormalML.g:49710:1: ( ';' )
+            {
+            // InternalFormalML.g:49710:1: ( ';' )
+            // InternalFormalML.g:49711:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getSemicolonKeyword_2()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getSemicolonKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1__0"
+    // InternalFormalML.g:49721:1: rule__InterruptStatement__Group_1_1__0 : rule__InterruptStatement__Group_1_1__0__Impl rule__InterruptStatement__Group_1_1__1 ;
+    public final void rule__InterruptStatement__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49725:1: ( rule__InterruptStatement__Group_1_1__0__Impl rule__InterruptStatement__Group_1_1__1 )
+            // InternalFormalML.g:49726:2: rule__InterruptStatement__Group_1_1__0__Impl rule__InterruptStatement__Group_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__InterruptStatement__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1__0"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1__0__Impl"
+    // InternalFormalML.g:49733:1: rule__InterruptStatement__Group_1_1__0__Impl : ( '(' ) ;
+    public final void rule__InterruptStatement__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49737:1: ( ( '(' ) )
+            // InternalFormalML.g:49738:1: ( '(' )
+            {
+            // InternalFormalML.g:49738:1: ( '(' )
+            // InternalFormalML.g:49739:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getLeftParenthesisKeyword_1_1_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getLeftParenthesisKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1__1"
+    // InternalFormalML.g:49748:1: rule__InterruptStatement__Group_1_1__1 : rule__InterruptStatement__Group_1_1__1__Impl rule__InterruptStatement__Group_1_1__2 ;
+    public final void rule__InterruptStatement__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49752:1: ( rule__InterruptStatement__Group_1_1__1__Impl rule__InterruptStatement__Group_1_1__2 )
+            // InternalFormalML.g:49753:2: rule__InterruptStatement__Group_1_1__1__Impl rule__InterruptStatement__Group_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InterruptStatement__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1__1"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1__1__Impl"
+    // InternalFormalML.g:49760:1: rule__InterruptStatement__Group_1_1__1__Impl : ( ( rule__InterruptStatement__ExprAssignment_1_1_1 ) ) ;
+    public final void rule__InterruptStatement__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49764:1: ( ( ( rule__InterruptStatement__ExprAssignment_1_1_1 ) ) )
+            // InternalFormalML.g:49765:1: ( ( rule__InterruptStatement__ExprAssignment_1_1_1 ) )
+            {
+            // InternalFormalML.g:49765:1: ( ( rule__InterruptStatement__ExprAssignment_1_1_1 ) )
+            // InternalFormalML.g:49766:2: ( rule__InterruptStatement__ExprAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_1()); 
+            }
+            // InternalFormalML.g:49767:2: ( rule__InterruptStatement__ExprAssignment_1_1_1 )
+            // InternalFormalML.g:49767:3: rule__InterruptStatement__ExprAssignment_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__ExprAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1__2"
+    // InternalFormalML.g:49775:1: rule__InterruptStatement__Group_1_1__2 : rule__InterruptStatement__Group_1_1__2__Impl rule__InterruptStatement__Group_1_1__3 ;
+    public final void rule__InterruptStatement__Group_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49779:1: ( rule__InterruptStatement__Group_1_1__2__Impl rule__InterruptStatement__Group_1_1__3 )
+            // InternalFormalML.g:49780:2: rule__InterruptStatement__Group_1_1__2__Impl rule__InterruptStatement__Group_1_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InterruptStatement__Group_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1__2"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1__2__Impl"
+    // InternalFormalML.g:49787:1: rule__InterruptStatement__Group_1_1__2__Impl : ( ( rule__InterruptStatement__Group_1_1_2__0 )* ) ;
+    public final void rule__InterruptStatement__Group_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49791:1: ( ( ( rule__InterruptStatement__Group_1_1_2__0 )* ) )
+            // InternalFormalML.g:49792:1: ( ( rule__InterruptStatement__Group_1_1_2__0 )* )
+            {
+            // InternalFormalML.g:49792:1: ( ( rule__InterruptStatement__Group_1_1_2__0 )* )
+            // InternalFormalML.g:49793:2: ( rule__InterruptStatement__Group_1_1_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getGroup_1_1_2()); 
+            }
+            // InternalFormalML.g:49794:2: ( rule__InterruptStatement__Group_1_1_2__0 )*
+            loop640:
+            do {
+                int alt640=2;
+                int LA640_0 = input.LA(1);
+
+                if ( (LA640_0==198) ) {
+                    alt640=1;
+                }
+
+
+                switch (alt640) {
+            	case 1 :
+            	    // InternalFormalML.g:49794:3: rule__InterruptStatement__Group_1_1_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__InterruptStatement__Group_1_1_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop640;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getGroup_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1__3"
+    // InternalFormalML.g:49802:1: rule__InterruptStatement__Group_1_1__3 : rule__InterruptStatement__Group_1_1__3__Impl ;
+    public final void rule__InterruptStatement__Group_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49806:1: ( rule__InterruptStatement__Group_1_1__3__Impl )
+            // InternalFormalML.g:49807:2: rule__InterruptStatement__Group_1_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1__3"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1__3__Impl"
+    // InternalFormalML.g:49813:1: rule__InterruptStatement__Group_1_1__3__Impl : ( ')' ) ;
+    public final void rule__InterruptStatement__Group_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49817:1: ( ( ')' ) )
+            // InternalFormalML.g:49818:1: ( ')' )
+            {
+            // InternalFormalML.g:49818:1: ( ')' )
+            // InternalFormalML.g:49819:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getRightParenthesisKeyword_1_1_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getRightParenthesisKeyword_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1_2__0"
+    // InternalFormalML.g:49829:1: rule__InterruptStatement__Group_1_1_2__0 : rule__InterruptStatement__Group_1_1_2__0__Impl rule__InterruptStatement__Group_1_1_2__1 ;
+    public final void rule__InterruptStatement__Group_1_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49833:1: ( rule__InterruptStatement__Group_1_1_2__0__Impl rule__InterruptStatement__Group_1_1_2__1 )
+            // InternalFormalML.g:49834:2: rule__InterruptStatement__Group_1_1_2__0__Impl rule__InterruptStatement__Group_1_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__InterruptStatement__Group_1_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group_1_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1_2__0"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1_2__0__Impl"
+    // InternalFormalML.g:49841:1: rule__InterruptStatement__Group_1_1_2__0__Impl : ( ',' ) ;
+    public final void rule__InterruptStatement__Group_1_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49845:1: ( ( ',' ) )
+            // InternalFormalML.g:49846:1: ( ',' )
+            {
+            // InternalFormalML.g:49846:1: ( ',' )
+            // InternalFormalML.g:49847:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getCommaKeyword_1_1_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getCommaKeyword_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1_2__1"
+    // InternalFormalML.g:49856:1: rule__InterruptStatement__Group_1_1_2__1 : rule__InterruptStatement__Group_1_1_2__1__Impl ;
+    public final void rule__InterruptStatement__Group_1_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49860:1: ( rule__InterruptStatement__Group_1_1_2__1__Impl )
+            // InternalFormalML.g:49861:2: rule__InterruptStatement__Group_1_1_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__Group_1_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1_2__1"
+
+
+    // $ANTLR start "rule__InterruptStatement__Group_1_1_2__1__Impl"
+    // InternalFormalML.g:49867:1: rule__InterruptStatement__Group_1_1_2__1__Impl : ( ( rule__InterruptStatement__ExprAssignment_1_1_2_1 ) ) ;
+    public final void rule__InterruptStatement__Group_1_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49871:1: ( ( ( rule__InterruptStatement__ExprAssignment_1_1_2_1 ) ) )
+            // InternalFormalML.g:49872:1: ( ( rule__InterruptStatement__ExprAssignment_1_1_2_1 ) )
+            {
+            // InternalFormalML.g:49872:1: ( ( rule__InterruptStatement__ExprAssignment_1_1_2_1 ) )
+            // InternalFormalML.g:49873:2: ( rule__InterruptStatement__ExprAssignment_1_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_2_1()); 
+            }
+            // InternalFormalML.g:49874:2: ( rule__InterruptStatement__ExprAssignment_1_1_2_1 )
+            // InternalFormalML.g:49874:3: rule__InterruptStatement__ExprAssignment_1_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InterruptStatement__ExprAssignment_1_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__Group_1_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__0"
+    // InternalFormalML.g:49883:1: rule__ActivityStatement__Group__0 : rule__ActivityStatement__Group__0__Impl rule__ActivityStatement__Group__1 ;
+    public final void rule__ActivityStatement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49887:1: ( rule__ActivityStatement__Group__0__Impl rule__ActivityStatement__Group__1 )
+            // InternalFormalML.g:49888:2: rule__ActivityStatement__Group__0__Impl rule__ActivityStatement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_221);
+            rule__ActivityStatement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ActivityStatement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__0"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__0__Impl"
+    // InternalFormalML.g:49895:1: rule__ActivityStatement__Group__0__Impl : ( () ) ;
+    public final void rule__ActivityStatement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49899:1: ( ( () ) )
+            // InternalFormalML.g:49900:1: ( () )
+            {
+            // InternalFormalML.g:49900:1: ( () )
+            // InternalFormalML.g:49901:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementAccess().getActivityStatementAction_0()); 
+            }
+            // InternalFormalML.g:49902:2: ()
+            // InternalFormalML.g:49902:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementAccess().getActivityStatementAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__1"
+    // InternalFormalML.g:49910:1: rule__ActivityStatement__Group__1 : rule__ActivityStatement__Group__1__Impl rule__ActivityStatement__Group__2 ;
+    public final void rule__ActivityStatement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49914:1: ( rule__ActivityStatement__Group__1__Impl rule__ActivityStatement__Group__2 )
+            // InternalFormalML.g:49915:2: rule__ActivityStatement__Group__1__Impl rule__ActivityStatement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_131);
+            rule__ActivityStatement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ActivityStatement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__1"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__1__Impl"
+    // InternalFormalML.g:49922:1: rule__ActivityStatement__Group__1__Impl : ( ( rule__ActivityStatement__OpAssignment_1 ) ) ;
+    public final void rule__ActivityStatement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49926:1: ( ( ( rule__ActivityStatement__OpAssignment_1 ) ) )
+            // InternalFormalML.g:49927:1: ( ( rule__ActivityStatement__OpAssignment_1 ) )
+            {
+            // InternalFormalML.g:49927:1: ( ( rule__ActivityStatement__OpAssignment_1 ) )
+            // InternalFormalML.g:49928:2: ( rule__ActivityStatement__OpAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementAccess().getOpAssignment_1()); 
+            }
+            // InternalFormalML.g:49929:2: ( rule__ActivityStatement__OpAssignment_1 )
+            // InternalFormalML.g:49929:3: rule__ActivityStatement__OpAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ActivityStatement__OpAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementAccess().getOpAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__2"
+    // InternalFormalML.g:49937:1: rule__ActivityStatement__Group__2 : rule__ActivityStatement__Group__2__Impl rule__ActivityStatement__Group__3 ;
+    public final void rule__ActivityStatement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49941:1: ( rule__ActivityStatement__Group__2__Impl rule__ActivityStatement__Group__3 )
+            // InternalFormalML.g:49942:2: rule__ActivityStatement__Group__2__Impl rule__ActivityStatement__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_52);
+            rule__ActivityStatement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ActivityStatement__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__2"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__2__Impl"
+    // InternalFormalML.g:49949:1: rule__ActivityStatement__Group__2__Impl : ( ( rule__ActivityStatement__MachineAssignment_2 ) ) ;
+    public final void rule__ActivityStatement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49953:1: ( ( ( rule__ActivityStatement__MachineAssignment_2 ) ) )
+            // InternalFormalML.g:49954:1: ( ( rule__ActivityStatement__MachineAssignment_2 ) )
+            {
+            // InternalFormalML.g:49954:1: ( ( rule__ActivityStatement__MachineAssignment_2 ) )
+            // InternalFormalML.g:49955:2: ( rule__ActivityStatement__MachineAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementAccess().getMachineAssignment_2()); 
+            }
+            // InternalFormalML.g:49956:2: ( rule__ActivityStatement__MachineAssignment_2 )
+            // InternalFormalML.g:49956:3: rule__ActivityStatement__MachineAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ActivityStatement__MachineAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementAccess().getMachineAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__3"
+    // InternalFormalML.g:49964:1: rule__ActivityStatement__Group__3 : rule__ActivityStatement__Group__3__Impl rule__ActivityStatement__Group__4 ;
+    public final void rule__ActivityStatement__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49968:1: ( rule__ActivityStatement__Group__3__Impl rule__ActivityStatement__Group__4 )
+            // InternalFormalML.g:49969:2: rule__ActivityStatement__Group__3__Impl rule__ActivityStatement__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_52);
+            rule__ActivityStatement__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ActivityStatement__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__3"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__3__Impl"
+    // InternalFormalML.g:49976:1: rule__ActivityStatement__Group__3__Impl : ( ( rule__ActivityStatement__TupleAssignment_3 )? ) ;
+    public final void rule__ActivityStatement__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49980:1: ( ( ( rule__ActivityStatement__TupleAssignment_3 )? ) )
+            // InternalFormalML.g:49981:1: ( ( rule__ActivityStatement__TupleAssignment_3 )? )
+            {
+            // InternalFormalML.g:49981:1: ( ( rule__ActivityStatement__TupleAssignment_3 )? )
+            // InternalFormalML.g:49982:2: ( rule__ActivityStatement__TupleAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementAccess().getTupleAssignment_3()); 
+            }
+            // InternalFormalML.g:49983:2: ( rule__ActivityStatement__TupleAssignment_3 )?
+            int alt641=2;
+            int LA641_0 = input.LA(1);
+
+            if ( (LA641_0==23) ) {
+                alt641=1;
+            }
+            switch (alt641) {
+                case 1 :
+                    // InternalFormalML.g:49983:3: rule__ActivityStatement__TupleAssignment_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ActivityStatement__TupleAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementAccess().getTupleAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__3__Impl"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__4"
+    // InternalFormalML.g:49991:1: rule__ActivityStatement__Group__4 : rule__ActivityStatement__Group__4__Impl ;
+    public final void rule__ActivityStatement__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:49995:1: ( rule__ActivityStatement__Group__4__Impl )
+            // InternalFormalML.g:49996:2: rule__ActivityStatement__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ActivityStatement__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__4"
+
+
+    // $ANTLR start "rule__ActivityStatement__Group__4__Impl"
+    // InternalFormalML.g:50002:1: rule__ActivityStatement__Group__4__Impl : ( ';' ) ;
+    public final void rule__ActivityStatement__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50006:1: ( ( ';' ) )
+            // InternalFormalML.g:50007:1: ( ';' )
+            {
+            // InternalFormalML.g:50007:1: ( ';' )
+            // InternalFormalML.g:50008:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementAccess().getSemicolonKeyword_4()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementAccess().getSemicolonKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__Group__4__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_0__0"
+    // InternalFormalML.g:50018:1: rule__InvokeStatement__Group_0__0 : rule__InvokeStatement__Group_0__0__Impl rule__InvokeStatement__Group_0__1 ;
+    public final void rule__InvokeStatement__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50022:1: ( rule__InvokeStatement__Group_0__0__Impl rule__InvokeStatement__Group_0__1 )
+            // InternalFormalML.g:50023:2: rule__InvokeStatement__Group_0__0__Impl rule__InvokeStatement__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__InvokeStatement__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_0__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_0__0__Impl"
+    // InternalFormalML.g:50030:1: rule__InvokeStatement__Group_0__0__Impl : ( ( rule__InvokeStatement__ExpressionAssignment_0_0 ) ) ;
+    public final void rule__InvokeStatement__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50034:1: ( ( ( rule__InvokeStatement__ExpressionAssignment_0_0 ) ) )
+            // InternalFormalML.g:50035:1: ( ( rule__InvokeStatement__ExpressionAssignment_0_0 ) )
+            {
+            // InternalFormalML.g:50035:1: ( ( rule__InvokeStatement__ExpressionAssignment_0_0 ) )
+            // InternalFormalML.g:50036:2: ( rule__InvokeStatement__ExpressionAssignment_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getExpressionAssignment_0_0()); 
+            }
+            // InternalFormalML.g:50037:2: ( rule__InvokeStatement__ExpressionAssignment_0_0 )
+            // InternalFormalML.g:50037:3: rule__InvokeStatement__ExpressionAssignment_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__ExpressionAssignment_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getExpressionAssignment_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_0__1"
+    // InternalFormalML.g:50045:1: rule__InvokeStatement__Group_0__1 : rule__InvokeStatement__Group_0__1__Impl ;
+    public final void rule__InvokeStatement__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50049:1: ( rule__InvokeStatement__Group_0__1__Impl )
+            // InternalFormalML.g:50050:2: rule__InvokeStatement__Group_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_0__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_0__1__Impl"
+    // InternalFormalML.g:50056:1: rule__InvokeStatement__Group_0__1__Impl : ( ';' ) ;
+    public final void rule__InvokeStatement__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50060:1: ( ( ';' ) )
+            // InternalFormalML.g:50061:1: ( ';' )
+            {
+            // InternalFormalML.g:50061:1: ( ';' )
+            // InternalFormalML.g:50062:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_0_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__0"
+    // InternalFormalML.g:50072:1: rule__InvokeStatement__Group_1__0 : rule__InvokeStatement__Group_1__0__Impl rule__InvokeStatement__Group_1__1 ;
+    public final void rule__InvokeStatement__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50076:1: ( rule__InvokeStatement__Group_1__0__Impl rule__InvokeStatement__Group_1__1 )
+            // InternalFormalML.g:50077:2: rule__InvokeStatement__Group_1__0__Impl rule__InvokeStatement__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_217);
+            rule__InvokeStatement__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__0__Impl"
+    // InternalFormalML.g:50084:1: rule__InvokeStatement__Group_1__0__Impl : ( ( rule__InvokeStatement__InvokableAssignment_1_0 ) ) ;
+    public final void rule__InvokeStatement__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50088:1: ( ( ( rule__InvokeStatement__InvokableAssignment_1_0 ) ) )
+            // InternalFormalML.g:50089:1: ( ( rule__InvokeStatement__InvokableAssignment_1_0 ) )
+            {
+            // InternalFormalML.g:50089:1: ( ( rule__InvokeStatement__InvokableAssignment_1_0 ) )
+            // InternalFormalML.g:50090:2: ( rule__InvokeStatement__InvokableAssignment_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_1_0()); 
+            }
+            // InternalFormalML.g:50091:2: ( rule__InvokeStatement__InvokableAssignment_1_0 )
+            // InternalFormalML.g:50091:3: rule__InvokeStatement__InvokableAssignment_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__InvokableAssignment_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__1"
+    // InternalFormalML.g:50099:1: rule__InvokeStatement__Group_1__1 : rule__InvokeStatement__Group_1__1__Impl rule__InvokeStatement__Group_1__2 ;
+    public final void rule__InvokeStatement__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50103:1: ( rule__InvokeStatement__Group_1__1__Impl rule__InvokeStatement__Group_1__2 )
+            // InternalFormalML.g:50104:2: rule__InvokeStatement__Group_1__1__Impl rule__InvokeStatement__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_222);
+            rule__InvokeStatement__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__1__Impl"
+    // InternalFormalML.g:50111:1: rule__InvokeStatement__Group_1__1__Impl : ( ( rule__InvokeStatement__ExecRoutineAssignment_1_1 ) ) ;
+    public final void rule__InvokeStatement__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50115:1: ( ( ( rule__InvokeStatement__ExecRoutineAssignment_1_1 ) ) )
+            // InternalFormalML.g:50116:1: ( ( rule__InvokeStatement__ExecRoutineAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:50116:1: ( ( rule__InvokeStatement__ExecRoutineAssignment_1_1 ) )
+            // InternalFormalML.g:50117:2: ( rule__InvokeStatement__ExecRoutineAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_1_1()); 
+            }
+            // InternalFormalML.g:50118:2: ( rule__InvokeStatement__ExecRoutineAssignment_1_1 )
+            // InternalFormalML.g:50118:3: rule__InvokeStatement__ExecRoutineAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__ExecRoutineAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__2"
+    // InternalFormalML.g:50126:1: rule__InvokeStatement__Group_1__2 : rule__InvokeStatement__Group_1__2__Impl rule__InvokeStatement__Group_1__3 ;
+    public final void rule__InvokeStatement__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50130:1: ( rule__InvokeStatement__Group_1__2__Impl rule__InvokeStatement__Group_1__3 )
+            // InternalFormalML.g:50131:2: rule__InvokeStatement__Group_1__2__Impl rule__InvokeStatement__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_222);
+            rule__InvokeStatement__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__2"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__2__Impl"
+    // InternalFormalML.g:50138:1: rule__InvokeStatement__Group_1__2__Impl : ( ( rule__InvokeStatement__ArgsAssignment_1_2 )? ) ;
+    public final void rule__InvokeStatement__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50142:1: ( ( ( rule__InvokeStatement__ArgsAssignment_1_2 )? ) )
+            // InternalFormalML.g:50143:1: ( ( rule__InvokeStatement__ArgsAssignment_1_2 )? )
+            {
+            // InternalFormalML.g:50143:1: ( ( rule__InvokeStatement__ArgsAssignment_1_2 )? )
+            // InternalFormalML.g:50144:2: ( rule__InvokeStatement__ArgsAssignment_1_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getArgsAssignment_1_2()); 
+            }
+            // InternalFormalML.g:50145:2: ( rule__InvokeStatement__ArgsAssignment_1_2 )?
+            int alt642=2;
+            int LA642_0 = input.LA(1);
+
+            if ( ((LA642_0>=RULE_CHARACTER && LA642_0<=RULE_INT)||LA642_0==20||LA642_0==23||(LA642_0>=29 && LA642_0<=30)||LA642_0==125||(LA642_0>=129 && LA642_0<=134)||(LA642_0>=137 && LA642_0<=142)||LA642_0==199||(LA642_0>=261 && LA642_0<=271)||LA642_0==287) ) {
+                alt642=1;
+            }
+            switch (alt642) {
+                case 1 :
+                    // InternalFormalML.g:50145:3: rule__InvokeStatement__ArgsAssignment_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__ArgsAssignment_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getArgsAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__3"
+    // InternalFormalML.g:50153:1: rule__InvokeStatement__Group_1__3 : rule__InvokeStatement__Group_1__3__Impl rule__InvokeStatement__Group_1__4 ;
+    public final void rule__InvokeStatement__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50157:1: ( rule__InvokeStatement__Group_1__3__Impl rule__InvokeStatement__Group_1__4 )
+            // InternalFormalML.g:50158:2: rule__InvokeStatement__Group_1__3__Impl rule__InvokeStatement__Group_1__4
+            {
+            pushFollow(FollowSets000.FOLLOW_223);
+            rule__InvokeStatement__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__3"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__3__Impl"
+    // InternalFormalML.g:50165:1: rule__InvokeStatement__Group_1__3__Impl : ( ')' ) ;
+    public final void rule__InvokeStatement__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50169:1: ( ( ')' ) )
+            // InternalFormalML.g:50170:1: ( ')' )
+            {
+            // InternalFormalML.g:50170:1: ( ')' )
+            // InternalFormalML.g:50171:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__4"
+    // InternalFormalML.g:50180:1: rule__InvokeStatement__Group_1__4 : rule__InvokeStatement__Group_1__4__Impl rule__InvokeStatement__Group_1__5 ;
+    public final void rule__InvokeStatement__Group_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50184:1: ( rule__InvokeStatement__Group_1__4__Impl rule__InvokeStatement__Group_1__5 )
+            // InternalFormalML.g:50185:2: rule__InvokeStatement__Group_1__4__Impl rule__InvokeStatement__Group_1__5
+            {
+            pushFollow(FollowSets000.FOLLOW_223);
+            rule__InvokeStatement__Group_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__4"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__4__Impl"
+    // InternalFormalML.g:50192:1: rule__InvokeStatement__Group_1__4__Impl : ( ( rule__InvokeStatement__Group_1_4__0 )? ) ;
+    public final void rule__InvokeStatement__Group_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50196:1: ( ( ( rule__InvokeStatement__Group_1_4__0 )? ) )
+            // InternalFormalML.g:50197:1: ( ( rule__InvokeStatement__Group_1_4__0 )? )
+            {
+            // InternalFormalML.g:50197:1: ( ( rule__InvokeStatement__Group_1_4__0 )? )
+            // InternalFormalML.g:50198:2: ( rule__InvokeStatement__Group_1_4__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getGroup_1_4()); 
+            }
+            // InternalFormalML.g:50199:2: ( rule__InvokeStatement__Group_1_4__0 )?
+            int alt643=2;
+            int LA643_0 = input.LA(1);
+
+            if ( (LA643_0==215) ) {
+                alt643=1;
+            }
+            switch (alt643) {
+                case 1 :
+                    // InternalFormalML.g:50199:3: rule__InvokeStatement__Group_1_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_1_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getGroup_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__4__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__5"
+    // InternalFormalML.g:50207:1: rule__InvokeStatement__Group_1__5 : rule__InvokeStatement__Group_1__5__Impl ;
+    public final void rule__InvokeStatement__Group_1__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50211:1: ( rule__InvokeStatement__Group_1__5__Impl )
+            // InternalFormalML.g:50212:2: rule__InvokeStatement__Group_1__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__5"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1__5__Impl"
+    // InternalFormalML.g:50218:1: rule__InvokeStatement__Group_1__5__Impl : ( ';' ) ;
+    public final void rule__InvokeStatement__Group_1__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50222:1: ( ( ';' ) )
+            // InternalFormalML.g:50223:1: ( ';' )
+            {
+            // InternalFormalML.g:50223:1: ( ';' )
+            // InternalFormalML.g:50224:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_1_5()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_1_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1__5__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4__0"
+    // InternalFormalML.g:50234:1: rule__InvokeStatement__Group_1_4__0 : rule__InvokeStatement__Group_1_4__0__Impl rule__InvokeStatement__Group_1_4__1 ;
+    public final void rule__InvokeStatement__Group_1_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50238:1: ( rule__InvokeStatement__Group_1_4__0__Impl rule__InvokeStatement__Group_1_4__1 )
+            // InternalFormalML.g:50239:2: rule__InvokeStatement__Group_1_4__0__Impl rule__InvokeStatement__Group_1_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_224);
+            rule__InvokeStatement__Group_1_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4__0__Impl"
+    // InternalFormalML.g:50246:1: rule__InvokeStatement__Group_1_4__0__Impl : ( '-->' ) ;
+    public final void rule__InvokeStatement__Group_1_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50250:1: ( ( '-->' ) )
+            // InternalFormalML.g:50251:1: ( '-->' )
+            {
+            // InternalFormalML.g:50251:1: ( '-->' )
+            // InternalFormalML.g:50252:2: '-->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0()); 
+            }
+            match(input,215,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4__1"
+    // InternalFormalML.g:50261:1: rule__InvokeStatement__Group_1_4__1 : rule__InvokeStatement__Group_1_4__1__Impl ;
+    public final void rule__InvokeStatement__Group_1_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50265:1: ( rule__InvokeStatement__Group_1_4__1__Impl )
+            // InternalFormalML.g:50266:2: rule__InvokeStatement__Group_1_4__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4__1__Impl"
+    // InternalFormalML.g:50272:1: rule__InvokeStatement__Group_1_4__1__Impl : ( ( rule__InvokeStatement__Alternatives_1_4_1 ) ) ;
+    public final void rule__InvokeStatement__Group_1_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50276:1: ( ( ( rule__InvokeStatement__Alternatives_1_4_1 ) ) )
+            // InternalFormalML.g:50277:1: ( ( rule__InvokeStatement__Alternatives_1_4_1 ) )
+            {
+            // InternalFormalML.g:50277:1: ( ( rule__InvokeStatement__Alternatives_1_4_1 ) )
+            // InternalFormalML.g:50278:2: ( rule__InvokeStatement__Alternatives_1_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getAlternatives_1_4_1()); 
+            }
+            // InternalFormalML.g:50279:2: ( rule__InvokeStatement__Alternatives_1_4_1 )
+            // InternalFormalML.g:50279:3: rule__InvokeStatement__Alternatives_1_4_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Alternatives_1_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getAlternatives_1_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_0__0"
+    // InternalFormalML.g:50288:1: rule__InvokeStatement__Group_1_4_1_0__0 : rule__InvokeStatement__Group_1_4_1_0__0__Impl rule__InvokeStatement__Group_1_4_1_0__1 ;
+    public final void rule__InvokeStatement__Group_1_4_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50292:1: ( rule__InvokeStatement__Group_1_4_1_0__0__Impl rule__InvokeStatement__Group_1_4_1_0__1 )
+            // InternalFormalML.g:50293:2: rule__InvokeStatement__Group_1_4_1_0__0__Impl rule__InvokeStatement__Group_1_4_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__InvokeStatement__Group_1_4_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_0__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_0__0__Impl"
+    // InternalFormalML.g:50300:1: rule__InvokeStatement__Group_1_4_1_0__0__Impl : ( ( rule__InvokeStatement__RetsAssignment_1_4_1_0_0 ) ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50304:1: ( ( ( rule__InvokeStatement__RetsAssignment_1_4_1_0_0 ) ) )
+            // InternalFormalML.g:50305:1: ( ( rule__InvokeStatement__RetsAssignment_1_4_1_0_0 ) )
+            {
+            // InternalFormalML.g:50305:1: ( ( rule__InvokeStatement__RetsAssignment_1_4_1_0_0 ) )
+            // InternalFormalML.g:50306:2: ( rule__InvokeStatement__RetsAssignment_1_4_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_0()); 
+            }
+            // InternalFormalML.g:50307:2: ( rule__InvokeStatement__RetsAssignment_1_4_1_0_0 )
+            // InternalFormalML.g:50307:3: rule__InvokeStatement__RetsAssignment_1_4_1_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_1_4_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_0__1"
+    // InternalFormalML.g:50315:1: rule__InvokeStatement__Group_1_4_1_0__1 : rule__InvokeStatement__Group_1_4_1_0__1__Impl ;
+    public final void rule__InvokeStatement__Group_1_4_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50319:1: ( rule__InvokeStatement__Group_1_4_1_0__1__Impl )
+            // InternalFormalML.g:50320:2: rule__InvokeStatement__Group_1_4_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_0__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_0__1__Impl"
+    // InternalFormalML.g:50326:1: rule__InvokeStatement__Group_1_4_1_0__1__Impl : ( ( rule__InvokeStatement__Group_1_4_1_0_1__0 )* ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50330:1: ( ( ( rule__InvokeStatement__Group_1_4_1_0_1__0 )* ) )
+            // InternalFormalML.g:50331:1: ( ( rule__InvokeStatement__Group_1_4_1_0_1__0 )* )
+            {
+            // InternalFormalML.g:50331:1: ( ( rule__InvokeStatement__Group_1_4_1_0_1__0 )* )
+            // InternalFormalML.g:50332:2: ( rule__InvokeStatement__Group_1_4_1_0_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0_1()); 
+            }
+            // InternalFormalML.g:50333:2: ( rule__InvokeStatement__Group_1_4_1_0_1__0 )*
+            loop644:
+            do {
+                int alt644=2;
+                int LA644_0 = input.LA(1);
+
+                if ( (LA644_0==198) ) {
+                    alt644=1;
+                }
+
+
+                switch (alt644) {
+            	case 1 :
+            	    // InternalFormalML.g:50333:3: rule__InvokeStatement__Group_1_4_1_0_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__InvokeStatement__Group_1_4_1_0_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop644;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_0_1__0"
+    // InternalFormalML.g:50342:1: rule__InvokeStatement__Group_1_4_1_0_1__0 : rule__InvokeStatement__Group_1_4_1_0_1__0__Impl rule__InvokeStatement__Group_1_4_1_0_1__1 ;
+    public final void rule__InvokeStatement__Group_1_4_1_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50346:1: ( rule__InvokeStatement__Group_1_4_1_0_1__0__Impl rule__InvokeStatement__Group_1_4_1_0_1__1 )
+            // InternalFormalML.g:50347:2: rule__InvokeStatement__Group_1_4_1_0_1__0__Impl rule__InvokeStatement__Group_1_4_1_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_225);
+            rule__InvokeStatement__Group_1_4_1_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_0_1__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_0_1__0__Impl"
+    // InternalFormalML.g:50354:1: rule__InvokeStatement__Group_1_4_1_0_1__0__Impl : ( ',' ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50358:1: ( ( ',' ) )
+            // InternalFormalML.g:50359:1: ( ',' )
+            {
+            // InternalFormalML.g:50359:1: ( ',' )
+            // InternalFormalML.g:50360:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_0_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_0_1__1"
+    // InternalFormalML.g:50369:1: rule__InvokeStatement__Group_1_4_1_0_1__1 : rule__InvokeStatement__Group_1_4_1_0_1__1__Impl ;
+    public final void rule__InvokeStatement__Group_1_4_1_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50373:1: ( rule__InvokeStatement__Group_1_4_1_0_1__1__Impl )
+            // InternalFormalML.g:50374:2: rule__InvokeStatement__Group_1_4_1_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_0_1__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_0_1__1__Impl"
+    // InternalFormalML.g:50380:1: rule__InvokeStatement__Group_1_4_1_0_1__1__Impl : ( ( rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1 ) ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50384:1: ( ( ( rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1 ) ) )
+            // InternalFormalML.g:50385:1: ( ( rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1 ) )
+            {
+            // InternalFormalML.g:50385:1: ( ( rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1 ) )
+            // InternalFormalML.g:50386:2: ( rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_1_1()); 
+            }
+            // InternalFormalML.g:50387:2: ( rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1 )
+            // InternalFormalML.g:50387:3: rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1__0"
+    // InternalFormalML.g:50396:1: rule__InvokeStatement__Group_1_4_1_1__0 : rule__InvokeStatement__Group_1_4_1_1__0__Impl rule__InvokeStatement__Group_1_4_1_1__1 ;
+    public final void rule__InvokeStatement__Group_1_4_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50400:1: ( rule__InvokeStatement__Group_1_4_1_1__0__Impl rule__InvokeStatement__Group_1_4_1_1__1 )
+            // InternalFormalML.g:50401:2: rule__InvokeStatement__Group_1_4_1_1__0__Impl rule__InvokeStatement__Group_1_4_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_225);
+            rule__InvokeStatement__Group_1_4_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1__0__Impl"
+    // InternalFormalML.g:50408:1: rule__InvokeStatement__Group_1_4_1_1__0__Impl : ( '(' ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50412:1: ( ( '(' ) )
+            // InternalFormalML.g:50413:1: ( '(' )
+            {
+            // InternalFormalML.g:50413:1: ( '(' )
+            // InternalFormalML.g:50414:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_1_4_1_1_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_1_4_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1__1"
+    // InternalFormalML.g:50423:1: rule__InvokeStatement__Group_1_4_1_1__1 : rule__InvokeStatement__Group_1_4_1_1__1__Impl rule__InvokeStatement__Group_1_4_1_1__2 ;
+    public final void rule__InvokeStatement__Group_1_4_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50427:1: ( rule__InvokeStatement__Group_1_4_1_1__1__Impl rule__InvokeStatement__Group_1_4_1_1__2 )
+            // InternalFormalML.g:50428:2: rule__InvokeStatement__Group_1_4_1_1__1__Impl rule__InvokeStatement__Group_1_4_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InvokeStatement__Group_1_4_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1__1__Impl"
+    // InternalFormalML.g:50435:1: rule__InvokeStatement__Group_1_4_1_1__1__Impl : ( ( rule__InvokeStatement__RetsAssignment_1_4_1_1_1 ) ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50439:1: ( ( ( rule__InvokeStatement__RetsAssignment_1_4_1_1_1 ) ) )
+            // InternalFormalML.g:50440:1: ( ( rule__InvokeStatement__RetsAssignment_1_4_1_1_1 ) )
+            {
+            // InternalFormalML.g:50440:1: ( ( rule__InvokeStatement__RetsAssignment_1_4_1_1_1 ) )
+            // InternalFormalML.g:50441:2: ( rule__InvokeStatement__RetsAssignment_1_4_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_1()); 
+            }
+            // InternalFormalML.g:50442:2: ( rule__InvokeStatement__RetsAssignment_1_4_1_1_1 )
+            // InternalFormalML.g:50442:3: rule__InvokeStatement__RetsAssignment_1_4_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_1_4_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1__2"
+    // InternalFormalML.g:50450:1: rule__InvokeStatement__Group_1_4_1_1__2 : rule__InvokeStatement__Group_1_4_1_1__2__Impl rule__InvokeStatement__Group_1_4_1_1__3 ;
+    public final void rule__InvokeStatement__Group_1_4_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50454:1: ( rule__InvokeStatement__Group_1_4_1_1__2__Impl rule__InvokeStatement__Group_1_4_1_1__3 )
+            // InternalFormalML.g:50455:2: rule__InvokeStatement__Group_1_4_1_1__2__Impl rule__InvokeStatement__Group_1_4_1_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InvokeStatement__Group_1_4_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1__2"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1__2__Impl"
+    // InternalFormalML.g:50462:1: rule__InvokeStatement__Group_1_4_1_1__2__Impl : ( ( rule__InvokeStatement__Group_1_4_1_1_2__0 )* ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50466:1: ( ( ( rule__InvokeStatement__Group_1_4_1_1_2__0 )* ) )
+            // InternalFormalML.g:50467:1: ( ( rule__InvokeStatement__Group_1_4_1_1_2__0 )* )
+            {
+            // InternalFormalML.g:50467:1: ( ( rule__InvokeStatement__Group_1_4_1_1_2__0 )* )
+            // InternalFormalML.g:50468:2: ( rule__InvokeStatement__Group_1_4_1_1_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1_2()); 
+            }
+            // InternalFormalML.g:50469:2: ( rule__InvokeStatement__Group_1_4_1_1_2__0 )*
+            loop645:
+            do {
+                int alt645=2;
+                int LA645_0 = input.LA(1);
+
+                if ( (LA645_0==198) ) {
+                    alt645=1;
+                }
+
+
+                switch (alt645) {
+            	case 1 :
+            	    // InternalFormalML.g:50469:3: rule__InvokeStatement__Group_1_4_1_1_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__InvokeStatement__Group_1_4_1_1_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop645;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getGroup_1_4_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1__3"
+    // InternalFormalML.g:50477:1: rule__InvokeStatement__Group_1_4_1_1__3 : rule__InvokeStatement__Group_1_4_1_1__3__Impl ;
+    public final void rule__InvokeStatement__Group_1_4_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50481:1: ( rule__InvokeStatement__Group_1_4_1_1__3__Impl )
+            // InternalFormalML.g:50482:2: rule__InvokeStatement__Group_1_4_1_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1__3"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1__3__Impl"
+    // InternalFormalML.g:50488:1: rule__InvokeStatement__Group_1_4_1_1__3__Impl : ( ')' ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50492:1: ( ( ')' ) )
+            // InternalFormalML.g:50493:1: ( ')' )
+            {
+            // InternalFormalML.g:50493:1: ( ')' )
+            // InternalFormalML.g:50494:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_4_1_1_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_4_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1_2__0"
+    // InternalFormalML.g:50504:1: rule__InvokeStatement__Group_1_4_1_1_2__0 : rule__InvokeStatement__Group_1_4_1_1_2__0__Impl rule__InvokeStatement__Group_1_4_1_1_2__1 ;
+    public final void rule__InvokeStatement__Group_1_4_1_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50508:1: ( rule__InvokeStatement__Group_1_4_1_1_2__0__Impl rule__InvokeStatement__Group_1_4_1_1_2__1 )
+            // InternalFormalML.g:50509:2: rule__InvokeStatement__Group_1_4_1_1_2__0__Impl rule__InvokeStatement__Group_1_4_1_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_225);
+            rule__InvokeStatement__Group_1_4_1_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1_2__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1_2__0__Impl"
+    // InternalFormalML.g:50516:1: rule__InvokeStatement__Group_1_4_1_1_2__0__Impl : ( ',' ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50520:1: ( ( ',' ) )
+            // InternalFormalML.g:50521:1: ( ',' )
+            {
+            // InternalFormalML.g:50521:1: ( ',' )
+            // InternalFormalML.g:50522:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_1_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1_2__1"
+    // InternalFormalML.g:50531:1: rule__InvokeStatement__Group_1_4_1_1_2__1 : rule__InvokeStatement__Group_1_4_1_1_2__1__Impl ;
+    public final void rule__InvokeStatement__Group_1_4_1_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50535:1: ( rule__InvokeStatement__Group_1_4_1_1_2__1__Impl )
+            // InternalFormalML.g:50536:2: rule__InvokeStatement__Group_1_4_1_1_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_1_4_1_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1_2__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_1_4_1_1_2__1__Impl"
+    // InternalFormalML.g:50542:1: rule__InvokeStatement__Group_1_4_1_1_2__1__Impl : ( ( rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1 ) ) ;
+    public final void rule__InvokeStatement__Group_1_4_1_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50546:1: ( ( ( rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1 ) ) )
+            // InternalFormalML.g:50547:1: ( ( rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1 ) )
+            {
+            // InternalFormalML.g:50547:1: ( ( rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1 ) )
+            // InternalFormalML.g:50548:2: ( rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_2_1()); 
+            }
+            // InternalFormalML.g:50549:2: ( rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1 )
+            // InternalFormalML.g:50549:3: rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_1_4_1_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_1_4_1_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__0"
+    // InternalFormalML.g:50558:1: rule__InvokeStatement__Group_2__0 : rule__InvokeStatement__Group_2__0__Impl rule__InvokeStatement__Group_2__1 ;
+    public final void rule__InvokeStatement__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50562:1: ( rule__InvokeStatement__Group_2__0__Impl rule__InvokeStatement__Group_2__1 )
+            // InternalFormalML.g:50563:2: rule__InvokeStatement__Group_2__0__Impl rule__InvokeStatement__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__InvokeStatement__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__0__Impl"
+    // InternalFormalML.g:50570:1: rule__InvokeStatement__Group_2__0__Impl : ( ( rule__InvokeStatement__ExecRoutineAssignment_2_0 ) ) ;
+    public final void rule__InvokeStatement__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50574:1: ( ( ( rule__InvokeStatement__ExecRoutineAssignment_2_0 ) ) )
+            // InternalFormalML.g:50575:1: ( ( rule__InvokeStatement__ExecRoutineAssignment_2_0 ) )
+            {
+            // InternalFormalML.g:50575:1: ( ( rule__InvokeStatement__ExecRoutineAssignment_2_0 ) )
+            // InternalFormalML.g:50576:2: ( rule__InvokeStatement__ExecRoutineAssignment_2_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_2_0()); 
+            }
+            // InternalFormalML.g:50577:2: ( rule__InvokeStatement__ExecRoutineAssignment_2_0 )
+            // InternalFormalML.g:50577:3: rule__InvokeStatement__ExecRoutineAssignment_2_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__ExecRoutineAssignment_2_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getExecRoutineAssignment_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__1"
+    // InternalFormalML.g:50585:1: rule__InvokeStatement__Group_2__1 : rule__InvokeStatement__Group_2__1__Impl rule__InvokeStatement__Group_2__2 ;
+    public final void rule__InvokeStatement__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50589:1: ( rule__InvokeStatement__Group_2__1__Impl rule__InvokeStatement__Group_2__2 )
+            // InternalFormalML.g:50590:2: rule__InvokeStatement__Group_2__1__Impl rule__InvokeStatement__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_217);
+            rule__InvokeStatement__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__1__Impl"
+    // InternalFormalML.g:50597:1: rule__InvokeStatement__Group_2__1__Impl : ( ( rule__InvokeStatement__InvokableAssignment_2_1 ) ) ;
+    public final void rule__InvokeStatement__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50601:1: ( ( ( rule__InvokeStatement__InvokableAssignment_2_1 ) ) )
+            // InternalFormalML.g:50602:1: ( ( rule__InvokeStatement__InvokableAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:50602:1: ( ( rule__InvokeStatement__InvokableAssignment_2_1 ) )
+            // InternalFormalML.g:50603:2: ( rule__InvokeStatement__InvokableAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_2_1()); 
+            }
+            // InternalFormalML.g:50604:2: ( rule__InvokeStatement__InvokableAssignment_2_1 )
+            // InternalFormalML.g:50604:3: rule__InvokeStatement__InvokableAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__InvokableAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__2"
+    // InternalFormalML.g:50612:1: rule__InvokeStatement__Group_2__2 : rule__InvokeStatement__Group_2__2__Impl rule__InvokeStatement__Group_2__3 ;
+    public final void rule__InvokeStatement__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50616:1: ( rule__InvokeStatement__Group_2__2__Impl rule__InvokeStatement__Group_2__3 )
+            // InternalFormalML.g:50617:2: rule__InvokeStatement__Group_2__2__Impl rule__InvokeStatement__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_222);
+            rule__InvokeStatement__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__2"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__2__Impl"
+    // InternalFormalML.g:50624:1: rule__InvokeStatement__Group_2__2__Impl : ( '(' ) ;
+    public final void rule__InvokeStatement__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50628:1: ( ( '(' ) )
+            // InternalFormalML.g:50629:1: ( '(' )
+            {
+            // InternalFormalML.g:50629:1: ( '(' )
+            // InternalFormalML.g:50630:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_2()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__3"
+    // InternalFormalML.g:50639:1: rule__InvokeStatement__Group_2__3 : rule__InvokeStatement__Group_2__3__Impl rule__InvokeStatement__Group_2__4 ;
+    public final void rule__InvokeStatement__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50643:1: ( rule__InvokeStatement__Group_2__3__Impl rule__InvokeStatement__Group_2__4 )
+            // InternalFormalML.g:50644:2: rule__InvokeStatement__Group_2__3__Impl rule__InvokeStatement__Group_2__4
+            {
+            pushFollow(FollowSets000.FOLLOW_222);
+            rule__InvokeStatement__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__3"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__3__Impl"
+    // InternalFormalML.g:50651:1: rule__InvokeStatement__Group_2__3__Impl : ( ( rule__InvokeStatement__ArgsAssignment_2_3 )? ) ;
+    public final void rule__InvokeStatement__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50655:1: ( ( ( rule__InvokeStatement__ArgsAssignment_2_3 )? ) )
+            // InternalFormalML.g:50656:1: ( ( rule__InvokeStatement__ArgsAssignment_2_3 )? )
+            {
+            // InternalFormalML.g:50656:1: ( ( rule__InvokeStatement__ArgsAssignment_2_3 )? )
+            // InternalFormalML.g:50657:2: ( rule__InvokeStatement__ArgsAssignment_2_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getArgsAssignment_2_3()); 
+            }
+            // InternalFormalML.g:50658:2: ( rule__InvokeStatement__ArgsAssignment_2_3 )?
+            int alt646=2;
+            int LA646_0 = input.LA(1);
+
+            if ( ((LA646_0>=RULE_CHARACTER && LA646_0<=RULE_INT)||LA646_0==20||LA646_0==23||(LA646_0>=29 && LA646_0<=30)||LA646_0==125||(LA646_0>=129 && LA646_0<=134)||(LA646_0>=137 && LA646_0<=142)||LA646_0==199||(LA646_0>=261 && LA646_0<=271)||LA646_0==287) ) {
+                alt646=1;
+            }
+            switch (alt646) {
+                case 1 :
+                    // InternalFormalML.g:50658:3: rule__InvokeStatement__ArgsAssignment_2_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__ArgsAssignment_2_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getArgsAssignment_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__4"
+    // InternalFormalML.g:50666:1: rule__InvokeStatement__Group_2__4 : rule__InvokeStatement__Group_2__4__Impl rule__InvokeStatement__Group_2__5 ;
+    public final void rule__InvokeStatement__Group_2__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50670:1: ( rule__InvokeStatement__Group_2__4__Impl rule__InvokeStatement__Group_2__5 )
+            // InternalFormalML.g:50671:2: rule__InvokeStatement__Group_2__4__Impl rule__InvokeStatement__Group_2__5
+            {
+            pushFollow(FollowSets000.FOLLOW_223);
+            rule__InvokeStatement__Group_2__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__4"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__4__Impl"
+    // InternalFormalML.g:50678:1: rule__InvokeStatement__Group_2__4__Impl : ( ')' ) ;
+    public final void rule__InvokeStatement__Group_2__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50682:1: ( ( ')' ) )
+            // InternalFormalML.g:50683:1: ( ')' )
+            {
+            // InternalFormalML.g:50683:1: ( ')' )
+            // InternalFormalML.g:50684:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_4()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__4__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__5"
+    // InternalFormalML.g:50693:1: rule__InvokeStatement__Group_2__5 : rule__InvokeStatement__Group_2__5__Impl rule__InvokeStatement__Group_2__6 ;
+    public final void rule__InvokeStatement__Group_2__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50697:1: ( rule__InvokeStatement__Group_2__5__Impl rule__InvokeStatement__Group_2__6 )
+            // InternalFormalML.g:50698:2: rule__InvokeStatement__Group_2__5__Impl rule__InvokeStatement__Group_2__6
+            {
+            pushFollow(FollowSets000.FOLLOW_223);
+            rule__InvokeStatement__Group_2__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__5"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__5__Impl"
+    // InternalFormalML.g:50705:1: rule__InvokeStatement__Group_2__5__Impl : ( ( rule__InvokeStatement__Group_2_5__0 )? ) ;
+    public final void rule__InvokeStatement__Group_2__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50709:1: ( ( ( rule__InvokeStatement__Group_2_5__0 )? ) )
+            // InternalFormalML.g:50710:1: ( ( rule__InvokeStatement__Group_2_5__0 )? )
+            {
+            // InternalFormalML.g:50710:1: ( ( rule__InvokeStatement__Group_2_5__0 )? )
+            // InternalFormalML.g:50711:2: ( rule__InvokeStatement__Group_2_5__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getGroup_2_5()); 
+            }
+            // InternalFormalML.g:50712:2: ( rule__InvokeStatement__Group_2_5__0 )?
+            int alt647=2;
+            int LA647_0 = input.LA(1);
+
+            if ( (LA647_0==215) ) {
+                alt647=1;
+            }
+            switch (alt647) {
+                case 1 :
+                    // InternalFormalML.g:50712:3: rule__InvokeStatement__Group_2_5__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_2_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getGroup_2_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__5__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__6"
+    // InternalFormalML.g:50720:1: rule__InvokeStatement__Group_2__6 : rule__InvokeStatement__Group_2__6__Impl ;
+    public final void rule__InvokeStatement__Group_2__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50724:1: ( rule__InvokeStatement__Group_2__6__Impl )
+            // InternalFormalML.g:50725:2: rule__InvokeStatement__Group_2__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__6"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2__6__Impl"
+    // InternalFormalML.g:50731:1: rule__InvokeStatement__Group_2__6__Impl : ( ';' ) ;
+    public final void rule__InvokeStatement__Group_2__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50735:1: ( ( ';' ) )
+            // InternalFormalML.g:50736:1: ( ';' )
+            {
+            // InternalFormalML.g:50736:1: ( ';' )
+            // InternalFormalML.g:50737:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_2_6()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_2_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2__6__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5__0"
+    // InternalFormalML.g:50747:1: rule__InvokeStatement__Group_2_5__0 : rule__InvokeStatement__Group_2_5__0__Impl rule__InvokeStatement__Group_2_5__1 ;
+    public final void rule__InvokeStatement__Group_2_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50751:1: ( rule__InvokeStatement__Group_2_5__0__Impl rule__InvokeStatement__Group_2_5__1 )
+            // InternalFormalML.g:50752:2: rule__InvokeStatement__Group_2_5__0__Impl rule__InvokeStatement__Group_2_5__1
+            {
+            pushFollow(FollowSets000.FOLLOW_224);
+            rule__InvokeStatement__Group_2_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5__0__Impl"
+    // InternalFormalML.g:50759:1: rule__InvokeStatement__Group_2_5__0__Impl : ( '-->' ) ;
+    public final void rule__InvokeStatement__Group_2_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50763:1: ( ( '-->' ) )
+            // InternalFormalML.g:50764:1: ( '-->' )
+            {
+            // InternalFormalML.g:50764:1: ( '-->' )
+            // InternalFormalML.g:50765:2: '-->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0()); 
+            }
+            match(input,215,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5__1"
+    // InternalFormalML.g:50774:1: rule__InvokeStatement__Group_2_5__1 : rule__InvokeStatement__Group_2_5__1__Impl ;
+    public final void rule__InvokeStatement__Group_2_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50778:1: ( rule__InvokeStatement__Group_2_5__1__Impl )
+            // InternalFormalML.g:50779:2: rule__InvokeStatement__Group_2_5__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5__1__Impl"
+    // InternalFormalML.g:50785:1: rule__InvokeStatement__Group_2_5__1__Impl : ( ( rule__InvokeStatement__Alternatives_2_5_1 ) ) ;
+    public final void rule__InvokeStatement__Group_2_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50789:1: ( ( ( rule__InvokeStatement__Alternatives_2_5_1 ) ) )
+            // InternalFormalML.g:50790:1: ( ( rule__InvokeStatement__Alternatives_2_5_1 ) )
+            {
+            // InternalFormalML.g:50790:1: ( ( rule__InvokeStatement__Alternatives_2_5_1 ) )
+            // InternalFormalML.g:50791:2: ( rule__InvokeStatement__Alternatives_2_5_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getAlternatives_2_5_1()); 
+            }
+            // InternalFormalML.g:50792:2: ( rule__InvokeStatement__Alternatives_2_5_1 )
+            // InternalFormalML.g:50792:3: rule__InvokeStatement__Alternatives_2_5_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Alternatives_2_5_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getAlternatives_2_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_0__0"
+    // InternalFormalML.g:50801:1: rule__InvokeStatement__Group_2_5_1_0__0 : rule__InvokeStatement__Group_2_5_1_0__0__Impl rule__InvokeStatement__Group_2_5_1_0__1 ;
+    public final void rule__InvokeStatement__Group_2_5_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50805:1: ( rule__InvokeStatement__Group_2_5_1_0__0__Impl rule__InvokeStatement__Group_2_5_1_0__1 )
+            // InternalFormalML.g:50806:2: rule__InvokeStatement__Group_2_5_1_0__0__Impl rule__InvokeStatement__Group_2_5_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__InvokeStatement__Group_2_5_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_0__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_0__0__Impl"
+    // InternalFormalML.g:50813:1: rule__InvokeStatement__Group_2_5_1_0__0__Impl : ( ( rule__InvokeStatement__RetsAssignment_2_5_1_0_0 ) ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50817:1: ( ( ( rule__InvokeStatement__RetsAssignment_2_5_1_0_0 ) ) )
+            // InternalFormalML.g:50818:1: ( ( rule__InvokeStatement__RetsAssignment_2_5_1_0_0 ) )
+            {
+            // InternalFormalML.g:50818:1: ( ( rule__InvokeStatement__RetsAssignment_2_5_1_0_0 ) )
+            // InternalFormalML.g:50819:2: ( rule__InvokeStatement__RetsAssignment_2_5_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_0()); 
+            }
+            // InternalFormalML.g:50820:2: ( rule__InvokeStatement__RetsAssignment_2_5_1_0_0 )
+            // InternalFormalML.g:50820:3: rule__InvokeStatement__RetsAssignment_2_5_1_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_2_5_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_0__1"
+    // InternalFormalML.g:50828:1: rule__InvokeStatement__Group_2_5_1_0__1 : rule__InvokeStatement__Group_2_5_1_0__1__Impl ;
+    public final void rule__InvokeStatement__Group_2_5_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50832:1: ( rule__InvokeStatement__Group_2_5_1_0__1__Impl )
+            // InternalFormalML.g:50833:2: rule__InvokeStatement__Group_2_5_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_0__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_0__1__Impl"
+    // InternalFormalML.g:50839:1: rule__InvokeStatement__Group_2_5_1_0__1__Impl : ( ( rule__InvokeStatement__Group_2_5_1_0_1__0 )* ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50843:1: ( ( ( rule__InvokeStatement__Group_2_5_1_0_1__0 )* ) )
+            // InternalFormalML.g:50844:1: ( ( rule__InvokeStatement__Group_2_5_1_0_1__0 )* )
+            {
+            // InternalFormalML.g:50844:1: ( ( rule__InvokeStatement__Group_2_5_1_0_1__0 )* )
+            // InternalFormalML.g:50845:2: ( rule__InvokeStatement__Group_2_5_1_0_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0_1()); 
+            }
+            // InternalFormalML.g:50846:2: ( rule__InvokeStatement__Group_2_5_1_0_1__0 )*
+            loop648:
+            do {
+                int alt648=2;
+                int LA648_0 = input.LA(1);
+
+                if ( (LA648_0==198) ) {
+                    alt648=1;
+                }
+
+
+                switch (alt648) {
+            	case 1 :
+            	    // InternalFormalML.g:50846:3: rule__InvokeStatement__Group_2_5_1_0_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__InvokeStatement__Group_2_5_1_0_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop648;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_0_1__0"
+    // InternalFormalML.g:50855:1: rule__InvokeStatement__Group_2_5_1_0_1__0 : rule__InvokeStatement__Group_2_5_1_0_1__0__Impl rule__InvokeStatement__Group_2_5_1_0_1__1 ;
+    public final void rule__InvokeStatement__Group_2_5_1_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50859:1: ( rule__InvokeStatement__Group_2_5_1_0_1__0__Impl rule__InvokeStatement__Group_2_5_1_0_1__1 )
+            // InternalFormalML.g:50860:2: rule__InvokeStatement__Group_2_5_1_0_1__0__Impl rule__InvokeStatement__Group_2_5_1_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_225);
+            rule__InvokeStatement__Group_2_5_1_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_0_1__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_0_1__0__Impl"
+    // InternalFormalML.g:50867:1: rule__InvokeStatement__Group_2_5_1_0_1__0__Impl : ( ',' ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50871:1: ( ( ',' ) )
+            // InternalFormalML.g:50872:1: ( ',' )
+            {
+            // InternalFormalML.g:50872:1: ( ',' )
+            // InternalFormalML.g:50873:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_0_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_0_1__1"
+    // InternalFormalML.g:50882:1: rule__InvokeStatement__Group_2_5_1_0_1__1 : rule__InvokeStatement__Group_2_5_1_0_1__1__Impl ;
+    public final void rule__InvokeStatement__Group_2_5_1_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50886:1: ( rule__InvokeStatement__Group_2_5_1_0_1__1__Impl )
+            // InternalFormalML.g:50887:2: rule__InvokeStatement__Group_2_5_1_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_0_1__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_0_1__1__Impl"
+    // InternalFormalML.g:50893:1: rule__InvokeStatement__Group_2_5_1_0_1__1__Impl : ( ( rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1 ) ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50897:1: ( ( ( rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1 ) ) )
+            // InternalFormalML.g:50898:1: ( ( rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1 ) )
+            {
+            // InternalFormalML.g:50898:1: ( ( rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1 ) )
+            // InternalFormalML.g:50899:2: ( rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_1_1()); 
+            }
+            // InternalFormalML.g:50900:2: ( rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1 )
+            // InternalFormalML.g:50900:3: rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1__0"
+    // InternalFormalML.g:50909:1: rule__InvokeStatement__Group_2_5_1_1__0 : rule__InvokeStatement__Group_2_5_1_1__0__Impl rule__InvokeStatement__Group_2_5_1_1__1 ;
+    public final void rule__InvokeStatement__Group_2_5_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50913:1: ( rule__InvokeStatement__Group_2_5_1_1__0__Impl rule__InvokeStatement__Group_2_5_1_1__1 )
+            // InternalFormalML.g:50914:2: rule__InvokeStatement__Group_2_5_1_1__0__Impl rule__InvokeStatement__Group_2_5_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_225);
+            rule__InvokeStatement__Group_2_5_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1__0__Impl"
+    // InternalFormalML.g:50921:1: rule__InvokeStatement__Group_2_5_1_1__0__Impl : ( '(' ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50925:1: ( ( '(' ) )
+            // InternalFormalML.g:50926:1: ( '(' )
+            {
+            // InternalFormalML.g:50926:1: ( '(' )
+            // InternalFormalML.g:50927:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_5_1_1_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_5_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1__1"
+    // InternalFormalML.g:50936:1: rule__InvokeStatement__Group_2_5_1_1__1 : rule__InvokeStatement__Group_2_5_1_1__1__Impl rule__InvokeStatement__Group_2_5_1_1__2 ;
+    public final void rule__InvokeStatement__Group_2_5_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50940:1: ( rule__InvokeStatement__Group_2_5_1_1__1__Impl rule__InvokeStatement__Group_2_5_1_1__2 )
+            // InternalFormalML.g:50941:2: rule__InvokeStatement__Group_2_5_1_1__1__Impl rule__InvokeStatement__Group_2_5_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InvokeStatement__Group_2_5_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1__1__Impl"
+    // InternalFormalML.g:50948:1: rule__InvokeStatement__Group_2_5_1_1__1__Impl : ( ( rule__InvokeStatement__RetsAssignment_2_5_1_1_1 ) ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50952:1: ( ( ( rule__InvokeStatement__RetsAssignment_2_5_1_1_1 ) ) )
+            // InternalFormalML.g:50953:1: ( ( rule__InvokeStatement__RetsAssignment_2_5_1_1_1 ) )
+            {
+            // InternalFormalML.g:50953:1: ( ( rule__InvokeStatement__RetsAssignment_2_5_1_1_1 ) )
+            // InternalFormalML.g:50954:2: ( rule__InvokeStatement__RetsAssignment_2_5_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_1()); 
+            }
+            // InternalFormalML.g:50955:2: ( rule__InvokeStatement__RetsAssignment_2_5_1_1_1 )
+            // InternalFormalML.g:50955:3: rule__InvokeStatement__RetsAssignment_2_5_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_2_5_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1__2"
+    // InternalFormalML.g:50963:1: rule__InvokeStatement__Group_2_5_1_1__2 : rule__InvokeStatement__Group_2_5_1_1__2__Impl rule__InvokeStatement__Group_2_5_1_1__3 ;
+    public final void rule__InvokeStatement__Group_2_5_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50967:1: ( rule__InvokeStatement__Group_2_5_1_1__2__Impl rule__InvokeStatement__Group_2_5_1_1__3 )
+            // InternalFormalML.g:50968:2: rule__InvokeStatement__Group_2_5_1_1__2__Impl rule__InvokeStatement__Group_2_5_1_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InvokeStatement__Group_2_5_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1__2"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1__2__Impl"
+    // InternalFormalML.g:50975:1: rule__InvokeStatement__Group_2_5_1_1__2__Impl : ( ( rule__InvokeStatement__Group_2_5_1_1_2__0 )* ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50979:1: ( ( ( rule__InvokeStatement__Group_2_5_1_1_2__0 )* ) )
+            // InternalFormalML.g:50980:1: ( ( rule__InvokeStatement__Group_2_5_1_1_2__0 )* )
+            {
+            // InternalFormalML.g:50980:1: ( ( rule__InvokeStatement__Group_2_5_1_1_2__0 )* )
+            // InternalFormalML.g:50981:2: ( rule__InvokeStatement__Group_2_5_1_1_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1_2()); 
+            }
+            // InternalFormalML.g:50982:2: ( rule__InvokeStatement__Group_2_5_1_1_2__0 )*
+            loop649:
+            do {
+                int alt649=2;
+                int LA649_0 = input.LA(1);
+
+                if ( (LA649_0==198) ) {
+                    alt649=1;
+                }
+
+
+                switch (alt649) {
+            	case 1 :
+            	    // InternalFormalML.g:50982:3: rule__InvokeStatement__Group_2_5_1_1_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__InvokeStatement__Group_2_5_1_1_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop649;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getGroup_2_5_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1__3"
+    // InternalFormalML.g:50990:1: rule__InvokeStatement__Group_2_5_1_1__3 : rule__InvokeStatement__Group_2_5_1_1__3__Impl ;
+    public final void rule__InvokeStatement__Group_2_5_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:50994:1: ( rule__InvokeStatement__Group_2_5_1_1__3__Impl )
+            // InternalFormalML.g:50995:2: rule__InvokeStatement__Group_2_5_1_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1__3"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1__3__Impl"
+    // InternalFormalML.g:51001:1: rule__InvokeStatement__Group_2_5_1_1__3__Impl : ( ')' ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51005:1: ( ( ')' ) )
+            // InternalFormalML.g:51006:1: ( ')' )
+            {
+            // InternalFormalML.g:51006:1: ( ')' )
+            // InternalFormalML.g:51007:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_5_1_1_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_5_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1_2__0"
+    // InternalFormalML.g:51017:1: rule__InvokeStatement__Group_2_5_1_1_2__0 : rule__InvokeStatement__Group_2_5_1_1_2__0__Impl rule__InvokeStatement__Group_2_5_1_1_2__1 ;
+    public final void rule__InvokeStatement__Group_2_5_1_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51021:1: ( rule__InvokeStatement__Group_2_5_1_1_2__0__Impl rule__InvokeStatement__Group_2_5_1_1_2__1 )
+            // InternalFormalML.g:51022:2: rule__InvokeStatement__Group_2_5_1_1_2__0__Impl rule__InvokeStatement__Group_2_5_1_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_225);
+            rule__InvokeStatement__Group_2_5_1_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1_2__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1_2__0__Impl"
+    // InternalFormalML.g:51029:1: rule__InvokeStatement__Group_2_5_1_1_2__0__Impl : ( ',' ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51033:1: ( ( ',' ) )
+            // InternalFormalML.g:51034:1: ( ',' )
+            {
+            // InternalFormalML.g:51034:1: ( ',' )
+            // InternalFormalML.g:51035:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_1_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1_2__1"
+    // InternalFormalML.g:51044:1: rule__InvokeStatement__Group_2_5_1_1_2__1 : rule__InvokeStatement__Group_2_5_1_1_2__1__Impl ;
+    public final void rule__InvokeStatement__Group_2_5_1_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51048:1: ( rule__InvokeStatement__Group_2_5_1_1_2__1__Impl )
+            // InternalFormalML.g:51049:2: rule__InvokeStatement__Group_2_5_1_1_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_2_5_1_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1_2__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_2_5_1_1_2__1__Impl"
+    // InternalFormalML.g:51055:1: rule__InvokeStatement__Group_2_5_1_1_2__1__Impl : ( ( rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1 ) ) ;
+    public final void rule__InvokeStatement__Group_2_5_1_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51059:1: ( ( ( rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1 ) ) )
+            // InternalFormalML.g:51060:1: ( ( rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1 ) )
+            {
+            // InternalFormalML.g:51060:1: ( ( rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1 ) )
+            // InternalFormalML.g:51061:2: ( rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_2_1()); 
+            }
+            // InternalFormalML.g:51062:2: ( rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1 )
+            // InternalFormalML.g:51062:3: rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_2_5_1_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_2_5_1_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__0"
+    // InternalFormalML.g:51071:1: rule__InvokeStatement__Group_3__0 : rule__InvokeStatement__Group_3__0__Impl rule__InvokeStatement__Group_3__1 ;
+    public final void rule__InvokeStatement__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51075:1: ( rule__InvokeStatement__Group_3__0__Impl rule__InvokeStatement__Group_3__1 )
+            // InternalFormalML.g:51076:2: rule__InvokeStatement__Group_3__0__Impl rule__InvokeStatement__Group_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__InvokeStatement__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__0__Impl"
+    // InternalFormalML.g:51083:1: rule__InvokeStatement__Group_3__0__Impl : ( ( rule__InvokeStatement__CallProcedureAssignment_3_0 ) ) ;
+    public final void rule__InvokeStatement__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51087:1: ( ( ( rule__InvokeStatement__CallProcedureAssignment_3_0 ) ) )
+            // InternalFormalML.g:51088:1: ( ( rule__InvokeStatement__CallProcedureAssignment_3_0 ) )
+            {
+            // InternalFormalML.g:51088:1: ( ( rule__InvokeStatement__CallProcedureAssignment_3_0 ) )
+            // InternalFormalML.g:51089:2: ( rule__InvokeStatement__CallProcedureAssignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getCallProcedureAssignment_3_0()); 
+            }
+            // InternalFormalML.g:51090:2: ( rule__InvokeStatement__CallProcedureAssignment_3_0 )
+            // InternalFormalML.g:51090:3: rule__InvokeStatement__CallProcedureAssignment_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__CallProcedureAssignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getCallProcedureAssignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__1"
+    // InternalFormalML.g:51098:1: rule__InvokeStatement__Group_3__1 : rule__InvokeStatement__Group_3__1__Impl rule__InvokeStatement__Group_3__2 ;
+    public final void rule__InvokeStatement__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51102:1: ( rule__InvokeStatement__Group_3__1__Impl rule__InvokeStatement__Group_3__2 )
+            // InternalFormalML.g:51103:2: rule__InvokeStatement__Group_3__1__Impl rule__InvokeStatement__Group_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_226);
+            rule__InvokeStatement__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__1__Impl"
+    // InternalFormalML.g:51110:1: rule__InvokeStatement__Group_3__1__Impl : ( ( rule__InvokeStatement__InvokableAssignment_3_1 ) ) ;
+    public final void rule__InvokeStatement__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51114:1: ( ( ( rule__InvokeStatement__InvokableAssignment_3_1 ) ) )
+            // InternalFormalML.g:51115:1: ( ( rule__InvokeStatement__InvokableAssignment_3_1 ) )
+            {
+            // InternalFormalML.g:51115:1: ( ( rule__InvokeStatement__InvokableAssignment_3_1 ) )
+            // InternalFormalML.g:51116:2: ( rule__InvokeStatement__InvokableAssignment_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_3_1()); 
+            }
+            // InternalFormalML.g:51117:2: ( rule__InvokeStatement__InvokableAssignment_3_1 )
+            // InternalFormalML.g:51117:3: rule__InvokeStatement__InvokableAssignment_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__InvokableAssignment_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getInvokableAssignment_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__2"
+    // InternalFormalML.g:51125:1: rule__InvokeStatement__Group_3__2 : rule__InvokeStatement__Group_3__2__Impl rule__InvokeStatement__Group_3__3 ;
+    public final void rule__InvokeStatement__Group_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51129:1: ( rule__InvokeStatement__Group_3__2__Impl rule__InvokeStatement__Group_3__3 )
+            // InternalFormalML.g:51130:2: rule__InvokeStatement__Group_3__2__Impl rule__InvokeStatement__Group_3__3
+            {
+            pushFollow(FollowSets000.FOLLOW_226);
+            rule__InvokeStatement__Group_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__2"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__2__Impl"
+    // InternalFormalML.g:51137:1: rule__InvokeStatement__Group_3__2__Impl : ( ( rule__InvokeStatement__ArgsAssignment_3_2 )? ) ;
+    public final void rule__InvokeStatement__Group_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51141:1: ( ( ( rule__InvokeStatement__ArgsAssignment_3_2 )? ) )
+            // InternalFormalML.g:51142:1: ( ( rule__InvokeStatement__ArgsAssignment_3_2 )? )
+            {
+            // InternalFormalML.g:51142:1: ( ( rule__InvokeStatement__ArgsAssignment_3_2 )? )
+            // InternalFormalML.g:51143:2: ( rule__InvokeStatement__ArgsAssignment_3_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getArgsAssignment_3_2()); 
+            }
+            // InternalFormalML.g:51144:2: ( rule__InvokeStatement__ArgsAssignment_3_2 )?
+            int alt650=2;
+            int LA650_0 = input.LA(1);
+
+            if ( ((LA650_0>=RULE_CHARACTER && LA650_0<=RULE_INT)||LA650_0==20||LA650_0==23||(LA650_0>=29 && LA650_0<=30)||LA650_0==125||(LA650_0>=129 && LA650_0<=134)||(LA650_0>=137 && LA650_0<=142)||LA650_0==199||(LA650_0>=261 && LA650_0<=271)||LA650_0==287) ) {
+                alt650=1;
+            }
+            switch (alt650) {
+                case 1 :
+                    // InternalFormalML.g:51144:3: rule__InvokeStatement__ArgsAssignment_3_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__ArgsAssignment_3_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getArgsAssignment_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__2__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__3"
+    // InternalFormalML.g:51152:1: rule__InvokeStatement__Group_3__3 : rule__InvokeStatement__Group_3__3__Impl rule__InvokeStatement__Group_3__4 ;
+    public final void rule__InvokeStatement__Group_3__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51156:1: ( rule__InvokeStatement__Group_3__3__Impl rule__InvokeStatement__Group_3__4 )
+            // InternalFormalML.g:51157:2: rule__InvokeStatement__Group_3__3__Impl rule__InvokeStatement__Group_3__4
+            {
+            pushFollow(FollowSets000.FOLLOW_226);
+            rule__InvokeStatement__Group_3__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__3"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__3__Impl"
+    // InternalFormalML.g:51164:1: rule__InvokeStatement__Group_3__3__Impl : ( ( rule__InvokeStatement__Group_3_3__0 )? ) ;
+    public final void rule__InvokeStatement__Group_3__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51168:1: ( ( ( rule__InvokeStatement__Group_3_3__0 )? ) )
+            // InternalFormalML.g:51169:1: ( ( rule__InvokeStatement__Group_3_3__0 )? )
+            {
+            // InternalFormalML.g:51169:1: ( ( rule__InvokeStatement__Group_3_3__0 )? )
+            // InternalFormalML.g:51170:2: ( rule__InvokeStatement__Group_3_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getGroup_3_3()); 
+            }
+            // InternalFormalML.g:51171:2: ( rule__InvokeStatement__Group_3_3__0 )?
+            int alt651=2;
+            int LA651_0 = input.LA(1);
+
+            if ( (LA651_0==215) ) {
+                alt651=1;
+            }
+            switch (alt651) {
+                case 1 :
+                    // InternalFormalML.g:51171:3: rule__InvokeStatement__Group_3_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InvokeStatement__Group_3_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getGroup_3_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__3__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__4"
+    // InternalFormalML.g:51179:1: rule__InvokeStatement__Group_3__4 : rule__InvokeStatement__Group_3__4__Impl ;
+    public final void rule__InvokeStatement__Group_3__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51183:1: ( rule__InvokeStatement__Group_3__4__Impl )
+            // InternalFormalML.g:51184:2: rule__InvokeStatement__Group_3__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__4"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3__4__Impl"
+    // InternalFormalML.g:51190:1: rule__InvokeStatement__Group_3__4__Impl : ( ';' ) ;
+    public final void rule__InvokeStatement__Group_3__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51194:1: ( ( ';' ) )
+            // InternalFormalML.g:51195:1: ( ';' )
+            {
+            // InternalFormalML.g:51195:1: ( ';' )
+            // InternalFormalML.g:51196:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_3_4()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_3_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3__4__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3__0"
+    // InternalFormalML.g:51206:1: rule__InvokeStatement__Group_3_3__0 : rule__InvokeStatement__Group_3_3__0__Impl rule__InvokeStatement__Group_3_3__1 ;
+    public final void rule__InvokeStatement__Group_3_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51210:1: ( rule__InvokeStatement__Group_3_3__0__Impl rule__InvokeStatement__Group_3_3__1 )
+            // InternalFormalML.g:51211:2: rule__InvokeStatement__Group_3_3__0__Impl rule__InvokeStatement__Group_3_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_224);
+            rule__InvokeStatement__Group_3_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3__0__Impl"
+    // InternalFormalML.g:51218:1: rule__InvokeStatement__Group_3_3__0__Impl : ( '-->' ) ;
+    public final void rule__InvokeStatement__Group_3_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51222:1: ( ( '-->' ) )
+            // InternalFormalML.g:51223:1: ( '-->' )
+            {
+            // InternalFormalML.g:51223:1: ( '-->' )
+            // InternalFormalML.g:51224:2: '-->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0()); 
+            }
+            match(input,215,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3__1"
+    // InternalFormalML.g:51233:1: rule__InvokeStatement__Group_3_3__1 : rule__InvokeStatement__Group_3_3__1__Impl ;
+    public final void rule__InvokeStatement__Group_3_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51237:1: ( rule__InvokeStatement__Group_3_3__1__Impl )
+            // InternalFormalML.g:51238:2: rule__InvokeStatement__Group_3_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3__1__Impl"
+    // InternalFormalML.g:51244:1: rule__InvokeStatement__Group_3_3__1__Impl : ( ( rule__InvokeStatement__Alternatives_3_3_1 ) ) ;
+    public final void rule__InvokeStatement__Group_3_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51248:1: ( ( ( rule__InvokeStatement__Alternatives_3_3_1 ) ) )
+            // InternalFormalML.g:51249:1: ( ( rule__InvokeStatement__Alternatives_3_3_1 ) )
+            {
+            // InternalFormalML.g:51249:1: ( ( rule__InvokeStatement__Alternatives_3_3_1 ) )
+            // InternalFormalML.g:51250:2: ( rule__InvokeStatement__Alternatives_3_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getAlternatives_3_3_1()); 
+            }
+            // InternalFormalML.g:51251:2: ( rule__InvokeStatement__Alternatives_3_3_1 )
+            // InternalFormalML.g:51251:3: rule__InvokeStatement__Alternatives_3_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Alternatives_3_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getAlternatives_3_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_0__0"
+    // InternalFormalML.g:51260:1: rule__InvokeStatement__Group_3_3_1_0__0 : rule__InvokeStatement__Group_3_3_1_0__0__Impl rule__InvokeStatement__Group_3_3_1_0__1 ;
+    public final void rule__InvokeStatement__Group_3_3_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51264:1: ( rule__InvokeStatement__Group_3_3_1_0__0__Impl rule__InvokeStatement__Group_3_3_1_0__1 )
+            // InternalFormalML.g:51265:2: rule__InvokeStatement__Group_3_3_1_0__0__Impl rule__InvokeStatement__Group_3_3_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__InvokeStatement__Group_3_3_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_0__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_0__0__Impl"
+    // InternalFormalML.g:51272:1: rule__InvokeStatement__Group_3_3_1_0__0__Impl : ( ( rule__InvokeStatement__RetsAssignment_3_3_1_0_0 ) ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51276:1: ( ( ( rule__InvokeStatement__RetsAssignment_3_3_1_0_0 ) ) )
+            // InternalFormalML.g:51277:1: ( ( rule__InvokeStatement__RetsAssignment_3_3_1_0_0 ) )
+            {
+            // InternalFormalML.g:51277:1: ( ( rule__InvokeStatement__RetsAssignment_3_3_1_0_0 ) )
+            // InternalFormalML.g:51278:2: ( rule__InvokeStatement__RetsAssignment_3_3_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_0()); 
+            }
+            // InternalFormalML.g:51279:2: ( rule__InvokeStatement__RetsAssignment_3_3_1_0_0 )
+            // InternalFormalML.g:51279:3: rule__InvokeStatement__RetsAssignment_3_3_1_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_3_3_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_0__1"
+    // InternalFormalML.g:51287:1: rule__InvokeStatement__Group_3_3_1_0__1 : rule__InvokeStatement__Group_3_3_1_0__1__Impl ;
+    public final void rule__InvokeStatement__Group_3_3_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51291:1: ( rule__InvokeStatement__Group_3_3_1_0__1__Impl )
+            // InternalFormalML.g:51292:2: rule__InvokeStatement__Group_3_3_1_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_0__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_0__1__Impl"
+    // InternalFormalML.g:51298:1: rule__InvokeStatement__Group_3_3_1_0__1__Impl : ( ( rule__InvokeStatement__Group_3_3_1_0_1__0 )* ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51302:1: ( ( ( rule__InvokeStatement__Group_3_3_1_0_1__0 )* ) )
+            // InternalFormalML.g:51303:1: ( ( rule__InvokeStatement__Group_3_3_1_0_1__0 )* )
+            {
+            // InternalFormalML.g:51303:1: ( ( rule__InvokeStatement__Group_3_3_1_0_1__0 )* )
+            // InternalFormalML.g:51304:2: ( rule__InvokeStatement__Group_3_3_1_0_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0_1()); 
+            }
+            // InternalFormalML.g:51305:2: ( rule__InvokeStatement__Group_3_3_1_0_1__0 )*
+            loop652:
+            do {
+                int alt652=2;
+                int LA652_0 = input.LA(1);
+
+                if ( (LA652_0==198) ) {
+                    alt652=1;
+                }
+
+
+                switch (alt652) {
+            	case 1 :
+            	    // InternalFormalML.g:51305:3: rule__InvokeStatement__Group_3_3_1_0_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__InvokeStatement__Group_3_3_1_0_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop652;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_0_1__0"
+    // InternalFormalML.g:51314:1: rule__InvokeStatement__Group_3_3_1_0_1__0 : rule__InvokeStatement__Group_3_3_1_0_1__0__Impl rule__InvokeStatement__Group_3_3_1_0_1__1 ;
+    public final void rule__InvokeStatement__Group_3_3_1_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51318:1: ( rule__InvokeStatement__Group_3_3_1_0_1__0__Impl rule__InvokeStatement__Group_3_3_1_0_1__1 )
+            // InternalFormalML.g:51319:2: rule__InvokeStatement__Group_3_3_1_0_1__0__Impl rule__InvokeStatement__Group_3_3_1_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_225);
+            rule__InvokeStatement__Group_3_3_1_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_0_1__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_0_1__0__Impl"
+    // InternalFormalML.g:51326:1: rule__InvokeStatement__Group_3_3_1_0_1__0__Impl : ( ',' ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51330:1: ( ( ',' ) )
+            // InternalFormalML.g:51331:1: ( ',' )
+            {
+            // InternalFormalML.g:51331:1: ( ',' )
+            // InternalFormalML.g:51332:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_0_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_0_1__1"
+    // InternalFormalML.g:51341:1: rule__InvokeStatement__Group_3_3_1_0_1__1 : rule__InvokeStatement__Group_3_3_1_0_1__1__Impl ;
+    public final void rule__InvokeStatement__Group_3_3_1_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51345:1: ( rule__InvokeStatement__Group_3_3_1_0_1__1__Impl )
+            // InternalFormalML.g:51346:2: rule__InvokeStatement__Group_3_3_1_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_0_1__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_0_1__1__Impl"
+    // InternalFormalML.g:51352:1: rule__InvokeStatement__Group_3_3_1_0_1__1__Impl : ( ( rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1 ) ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51356:1: ( ( ( rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1 ) ) )
+            // InternalFormalML.g:51357:1: ( ( rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1 ) )
+            {
+            // InternalFormalML.g:51357:1: ( ( rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1 ) )
+            // InternalFormalML.g:51358:2: ( rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_1_1()); 
+            }
+            // InternalFormalML.g:51359:2: ( rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1 )
+            // InternalFormalML.g:51359:3: rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1__0"
+    // InternalFormalML.g:51368:1: rule__InvokeStatement__Group_3_3_1_1__0 : rule__InvokeStatement__Group_3_3_1_1__0__Impl rule__InvokeStatement__Group_3_3_1_1__1 ;
+    public final void rule__InvokeStatement__Group_3_3_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51372:1: ( rule__InvokeStatement__Group_3_3_1_1__0__Impl rule__InvokeStatement__Group_3_3_1_1__1 )
+            // InternalFormalML.g:51373:2: rule__InvokeStatement__Group_3_3_1_1__0__Impl rule__InvokeStatement__Group_3_3_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_225);
+            rule__InvokeStatement__Group_3_3_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1__0__Impl"
+    // InternalFormalML.g:51380:1: rule__InvokeStatement__Group_3_3_1_1__0__Impl : ( '(' ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51384:1: ( ( '(' ) )
+            // InternalFormalML.g:51385:1: ( '(' )
+            {
+            // InternalFormalML.g:51385:1: ( '(' )
+            // InternalFormalML.g:51386:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_3_3_1_1_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_3_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1__1"
+    // InternalFormalML.g:51395:1: rule__InvokeStatement__Group_3_3_1_1__1 : rule__InvokeStatement__Group_3_3_1_1__1__Impl rule__InvokeStatement__Group_3_3_1_1__2 ;
+    public final void rule__InvokeStatement__Group_3_3_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51399:1: ( rule__InvokeStatement__Group_3_3_1_1__1__Impl rule__InvokeStatement__Group_3_3_1_1__2 )
+            // InternalFormalML.g:51400:2: rule__InvokeStatement__Group_3_3_1_1__1__Impl rule__InvokeStatement__Group_3_3_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InvokeStatement__Group_3_3_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1__1__Impl"
+    // InternalFormalML.g:51407:1: rule__InvokeStatement__Group_3_3_1_1__1__Impl : ( ( rule__InvokeStatement__RetsAssignment_3_3_1_1_1 ) ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51411:1: ( ( ( rule__InvokeStatement__RetsAssignment_3_3_1_1_1 ) ) )
+            // InternalFormalML.g:51412:1: ( ( rule__InvokeStatement__RetsAssignment_3_3_1_1_1 ) )
+            {
+            // InternalFormalML.g:51412:1: ( ( rule__InvokeStatement__RetsAssignment_3_3_1_1_1 ) )
+            // InternalFormalML.g:51413:2: ( rule__InvokeStatement__RetsAssignment_3_3_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_1()); 
+            }
+            // InternalFormalML.g:51414:2: ( rule__InvokeStatement__RetsAssignment_3_3_1_1_1 )
+            // InternalFormalML.g:51414:3: rule__InvokeStatement__RetsAssignment_3_3_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_3_3_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1__2"
+    // InternalFormalML.g:51422:1: rule__InvokeStatement__Group_3_3_1_1__2 : rule__InvokeStatement__Group_3_3_1_1__2__Impl rule__InvokeStatement__Group_3_3_1_1__3 ;
+    public final void rule__InvokeStatement__Group_3_3_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51426:1: ( rule__InvokeStatement__Group_3_3_1_1__2__Impl rule__InvokeStatement__Group_3_3_1_1__3 )
+            // InternalFormalML.g:51427:2: rule__InvokeStatement__Group_3_3_1_1__2__Impl rule__InvokeStatement__Group_3_3_1_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_66);
+            rule__InvokeStatement__Group_3_3_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1__2"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1__2__Impl"
+    // InternalFormalML.g:51434:1: rule__InvokeStatement__Group_3_3_1_1__2__Impl : ( ( rule__InvokeStatement__Group_3_3_1_1_2__0 )* ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51438:1: ( ( ( rule__InvokeStatement__Group_3_3_1_1_2__0 )* ) )
+            // InternalFormalML.g:51439:1: ( ( rule__InvokeStatement__Group_3_3_1_1_2__0 )* )
+            {
+            // InternalFormalML.g:51439:1: ( ( rule__InvokeStatement__Group_3_3_1_1_2__0 )* )
+            // InternalFormalML.g:51440:2: ( rule__InvokeStatement__Group_3_3_1_1_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1_2()); 
+            }
+            // InternalFormalML.g:51441:2: ( rule__InvokeStatement__Group_3_3_1_1_2__0 )*
+            loop653:
+            do {
+                int alt653=2;
+                int LA653_0 = input.LA(1);
+
+                if ( (LA653_0==198) ) {
+                    alt653=1;
+                }
+
+
+                switch (alt653) {
+            	case 1 :
+            	    // InternalFormalML.g:51441:3: rule__InvokeStatement__Group_3_3_1_1_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__InvokeStatement__Group_3_3_1_1_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop653;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getGroup_3_3_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1__3"
+    // InternalFormalML.g:51449:1: rule__InvokeStatement__Group_3_3_1_1__3 : rule__InvokeStatement__Group_3_3_1_1__3__Impl ;
+    public final void rule__InvokeStatement__Group_3_3_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51453:1: ( rule__InvokeStatement__Group_3_3_1_1__3__Impl )
+            // InternalFormalML.g:51454:2: rule__InvokeStatement__Group_3_3_1_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1__3"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1__3__Impl"
+    // InternalFormalML.g:51460:1: rule__InvokeStatement__Group_3_3_1_1__3__Impl : ( ')' ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51464:1: ( ( ')' ) )
+            // InternalFormalML.g:51465:1: ( ')' )
+            {
+            // InternalFormalML.g:51465:1: ( ')' )
+            // InternalFormalML.g:51466:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_3_3_1_1_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_3_3_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1_2__0"
+    // InternalFormalML.g:51476:1: rule__InvokeStatement__Group_3_3_1_1_2__0 : rule__InvokeStatement__Group_3_3_1_1_2__0__Impl rule__InvokeStatement__Group_3_3_1_1_2__1 ;
+    public final void rule__InvokeStatement__Group_3_3_1_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51480:1: ( rule__InvokeStatement__Group_3_3_1_1_2__0__Impl rule__InvokeStatement__Group_3_3_1_1_2__1 )
+            // InternalFormalML.g:51481:2: rule__InvokeStatement__Group_3_3_1_1_2__0__Impl rule__InvokeStatement__Group_3_3_1_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_225);
+            rule__InvokeStatement__Group_3_3_1_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1_2__0"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1_2__0__Impl"
+    // InternalFormalML.g:51488:1: rule__InvokeStatement__Group_3_3_1_1_2__0__Impl : ( ',' ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51492:1: ( ( ',' ) )
+            // InternalFormalML.g:51493:1: ( ',' )
+            {
+            // InternalFormalML.g:51493:1: ( ',' )
+            // InternalFormalML.g:51494:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_1_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1_2__1"
+    // InternalFormalML.g:51503:1: rule__InvokeStatement__Group_3_3_1_1_2__1 : rule__InvokeStatement__Group_3_3_1_1_2__1__Impl ;
+    public final void rule__InvokeStatement__Group_3_3_1_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51507:1: ( rule__InvokeStatement__Group_3_3_1_1_2__1__Impl )
+            // InternalFormalML.g:51508:2: rule__InvokeStatement__Group_3_3_1_1_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__Group_3_3_1_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1_2__1"
+
+
+    // $ANTLR start "rule__InvokeStatement__Group_3_3_1_1_2__1__Impl"
+    // InternalFormalML.g:51514:1: rule__InvokeStatement__Group_3_3_1_1_2__1__Impl : ( ( rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1 ) ) ;
+    public final void rule__InvokeStatement__Group_3_3_1_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51518:1: ( ( ( rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1 ) ) )
+            // InternalFormalML.g:51519:1: ( ( rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1 ) )
+            {
+            // InternalFormalML.g:51519:1: ( ( rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1 ) )
+            // InternalFormalML.g:51520:2: ( rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_2_1()); 
+            }
+            // InternalFormalML.g:51521:2: ( rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1 )
+            // InternalFormalML.g:51521:3: rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsAssignment_3_3_1_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__Group_3_3_1_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__AssignmentExpression__Group__0"
+    // InternalFormalML.g:51530:1: rule__AssignmentExpression__Group__0 : rule__AssignmentExpression__Group__0__Impl rule__AssignmentExpression__Group__1 ;
+    public final void rule__AssignmentExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51534:1: ( rule__AssignmentExpression__Group__0__Impl rule__AssignmentExpression__Group__1 )
+            // InternalFormalML.g:51535:2: rule__AssignmentExpression__Group__0__Impl rule__AssignmentExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_227);
+            rule__AssignmentExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AssignmentExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentExpression__Group__0"
+
+
+    // $ANTLR start "rule__AssignmentExpression__Group__0__Impl"
+    // InternalFormalML.g:51542:1: rule__AssignmentExpression__Group__0__Impl : ( ( rule__AssignmentExpression__LeftHandSideAssignment_0 ) ) ;
+    public final void rule__AssignmentExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51546:1: ( ( ( rule__AssignmentExpression__LeftHandSideAssignment_0 ) ) )
+            // InternalFormalML.g:51547:1: ( ( rule__AssignmentExpression__LeftHandSideAssignment_0 ) )
+            {
+            // InternalFormalML.g:51547:1: ( ( rule__AssignmentExpression__LeftHandSideAssignment_0 ) )
+            // InternalFormalML.g:51548:2: ( rule__AssignmentExpression__LeftHandSideAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideAssignment_0()); 
+            }
+            // InternalFormalML.g:51549:2: ( rule__AssignmentExpression__LeftHandSideAssignment_0 )
+            // InternalFormalML.g:51549:3: rule__AssignmentExpression__LeftHandSideAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AssignmentExpression__LeftHandSideAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__AssignmentExpression__Group__1"
+    // InternalFormalML.g:51557:1: rule__AssignmentExpression__Group__1 : rule__AssignmentExpression__Group__1__Impl rule__AssignmentExpression__Group__2 ;
+    public final void rule__AssignmentExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51561:1: ( rule__AssignmentExpression__Group__1__Impl rule__AssignmentExpression__Group__2 )
+            // InternalFormalML.g:51562:2: rule__AssignmentExpression__Group__1__Impl rule__AssignmentExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__AssignmentExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AssignmentExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentExpression__Group__1"
+
+
+    // $ANTLR start "rule__AssignmentExpression__Group__1__Impl"
+    // InternalFormalML.g:51569:1: rule__AssignmentExpression__Group__1__Impl : ( ( rule__AssignmentExpression__OperatorAssignment_1 ) ) ;
+    public final void rule__AssignmentExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51573:1: ( ( ( rule__AssignmentExpression__OperatorAssignment_1 ) ) )
+            // InternalFormalML.g:51574:1: ( ( rule__AssignmentExpression__OperatorAssignment_1 ) )
+            {
+            // InternalFormalML.g:51574:1: ( ( rule__AssignmentExpression__OperatorAssignment_1 ) )
+            // InternalFormalML.g:51575:2: ( rule__AssignmentExpression__OperatorAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignment_1()); 
+            }
+            // InternalFormalML.g:51576:2: ( rule__AssignmentExpression__OperatorAssignment_1 )
+            // InternalFormalML.g:51576:3: rule__AssignmentExpression__OperatorAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AssignmentExpression__OperatorAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__AssignmentExpression__Group__2"
+    // InternalFormalML.g:51584:1: rule__AssignmentExpression__Group__2 : rule__AssignmentExpression__Group__2__Impl ;
+    public final void rule__AssignmentExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51588:1: ( rule__AssignmentExpression__Group__2__Impl )
+            // InternalFormalML.g:51589:2: rule__AssignmentExpression__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AssignmentExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentExpression__Group__2"
+
+
+    // $ANTLR start "rule__AssignmentExpression__Group__2__Impl"
+    // InternalFormalML.g:51595:1: rule__AssignmentExpression__Group__2__Impl : ( ( rule__AssignmentExpression__RigthHandSideAssignment_2 ) ) ;
+    public final void rule__AssignmentExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51599:1: ( ( ( rule__AssignmentExpression__RigthHandSideAssignment_2 ) ) )
+            // InternalFormalML.g:51600:1: ( ( rule__AssignmentExpression__RigthHandSideAssignment_2 ) )
+            {
+            // InternalFormalML.g:51600:1: ( ( rule__AssignmentExpression__RigthHandSideAssignment_2 ) )
+            // InternalFormalML.g:51601:2: ( rule__AssignmentExpression__RigthHandSideAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideAssignment_2()); 
+            }
+            // InternalFormalML.g:51602:2: ( rule__AssignmentExpression__RigthHandSideAssignment_2 )
+            // InternalFormalML.g:51602:3: rule__AssignmentExpression__RigthHandSideAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AssignmentExpression__RigthHandSideAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group__0"
+    // InternalFormalML.g:51611:1: rule__LeftHandSideExpression__Group__0 : rule__LeftHandSideExpression__Group__0__Impl rule__LeftHandSideExpression__Group__1 ;
+    public final void rule__LeftHandSideExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51615:1: ( rule__LeftHandSideExpression__Group__0__Impl rule__LeftHandSideExpression__Group__1 )
+            // InternalFormalML.g:51616:2: rule__LeftHandSideExpression__Group__0__Impl rule__LeftHandSideExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_219);
+            rule__LeftHandSideExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LeftHandSideExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group__0"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group__0__Impl"
+    // InternalFormalML.g:51623:1: rule__LeftHandSideExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LeftHandSideExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51627:1: ( ( () ) )
+            // InternalFormalML.g:51628:1: ( () )
+            {
+            // InternalFormalML.g:51628:1: ( () )
+            // InternalFormalML.g:51629:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLeftHandSideExpressionAccess().getLeftHandSideExpressionAction_0()); 
+            }
+            // InternalFormalML.g:51630:2: ()
+            // InternalFormalML.g:51630:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLeftHandSideExpressionAccess().getLeftHandSideExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group__1"
+    // InternalFormalML.g:51638:1: rule__LeftHandSideExpression__Group__1 : rule__LeftHandSideExpression__Group__1__Impl ;
+    public final void rule__LeftHandSideExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51642:1: ( rule__LeftHandSideExpression__Group__1__Impl )
+            // InternalFormalML.g:51643:2: rule__LeftHandSideExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LeftHandSideExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group__1"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group__1__Impl"
+    // InternalFormalML.g:51649:1: rule__LeftHandSideExpression__Group__1__Impl : ( ( rule__LeftHandSideExpression__Alternatives_1 ) ) ;
+    public final void rule__LeftHandSideExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51653:1: ( ( ( rule__LeftHandSideExpression__Alternatives_1 ) ) )
+            // InternalFormalML.g:51654:1: ( ( rule__LeftHandSideExpression__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:51654:1: ( ( rule__LeftHandSideExpression__Alternatives_1 ) )
+            // InternalFormalML.g:51655:2: ( rule__LeftHandSideExpression__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLeftHandSideExpressionAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:51656:2: ( rule__LeftHandSideExpression__Alternatives_1 )
+            // InternalFormalML.g:51656:3: rule__LeftHandSideExpression__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LeftHandSideExpression__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLeftHandSideExpressionAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group_1_1__0"
+    // InternalFormalML.g:51665:1: rule__LeftHandSideExpression__Group_1_1__0 : rule__LeftHandSideExpression__Group_1_1__0__Impl rule__LeftHandSideExpression__Group_1_1__1 ;
+    public final void rule__LeftHandSideExpression__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51669:1: ( rule__LeftHandSideExpression__Group_1_1__0__Impl rule__LeftHandSideExpression__Group_1_1__1 )
+            // InternalFormalML.g:51670:2: rule__LeftHandSideExpression__Group_1_1__0__Impl rule__LeftHandSideExpression__Group_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_228);
+            rule__LeftHandSideExpression__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LeftHandSideExpression__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group_1_1__0"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group_1_1__0__Impl"
+    // InternalFormalML.g:51677:1: rule__LeftHandSideExpression__Group_1_1__0__Impl : ( '(' ) ;
+    public final void rule__LeftHandSideExpression__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51681:1: ( ( '(' ) )
+            // InternalFormalML.g:51682:1: ( '(' )
+            {
+            // InternalFormalML.g:51682:1: ( '(' )
+            // InternalFormalML.g:51683:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLeftHandSideExpressionAccess().getLeftParenthesisKeyword_1_1_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLeftHandSideExpressionAccess().getLeftParenthesisKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group_1_1__1"
+    // InternalFormalML.g:51692:1: rule__LeftHandSideExpression__Group_1_1__1 : rule__LeftHandSideExpression__Group_1_1__1__Impl rule__LeftHandSideExpression__Group_1_1__2 ;
+    public final void rule__LeftHandSideExpression__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51696:1: ( rule__LeftHandSideExpression__Group_1_1__1__Impl rule__LeftHandSideExpression__Group_1_1__2 )
+            // InternalFormalML.g:51697:2: rule__LeftHandSideExpression__Group_1_1__1__Impl rule__LeftHandSideExpression__Group_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__LeftHandSideExpression__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LeftHandSideExpression__Group_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group_1_1__1"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group_1_1__1__Impl"
+    // InternalFormalML.g:51704:1: rule__LeftHandSideExpression__Group_1_1__1__Impl : ( ( rule__LeftHandSideExpression__LvalueAssignment_1_1_1 ) ) ;
+    public final void rule__LeftHandSideExpression__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51708:1: ( ( ( rule__LeftHandSideExpression__LvalueAssignment_1_1_1 ) ) )
+            // InternalFormalML.g:51709:1: ( ( rule__LeftHandSideExpression__LvalueAssignment_1_1_1 ) )
+            {
+            // InternalFormalML.g:51709:1: ( ( rule__LeftHandSideExpression__LvalueAssignment_1_1_1 ) )
+            // InternalFormalML.g:51710:2: ( rule__LeftHandSideExpression__LvalueAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_1_1()); 
+            }
+            // InternalFormalML.g:51711:2: ( rule__LeftHandSideExpression__LvalueAssignment_1_1_1 )
+            // InternalFormalML.g:51711:3: rule__LeftHandSideExpression__LvalueAssignment_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LeftHandSideExpression__LvalueAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLeftHandSideExpressionAccess().getLvalueAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group_1_1__2"
+    // InternalFormalML.g:51719:1: rule__LeftHandSideExpression__Group_1_1__2 : rule__LeftHandSideExpression__Group_1_1__2__Impl ;
+    public final void rule__LeftHandSideExpression__Group_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51723:1: ( rule__LeftHandSideExpression__Group_1_1__2__Impl )
+            // InternalFormalML.g:51724:2: rule__LeftHandSideExpression__Group_1_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LeftHandSideExpression__Group_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group_1_1__2"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__Group_1_1__2__Impl"
+    // InternalFormalML.g:51730:1: rule__LeftHandSideExpression__Group_1_1__2__Impl : ( ')' ) ;
+    public final void rule__LeftHandSideExpression__Group_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51734:1: ( ( ')' ) )
+            // InternalFormalML.g:51735:1: ( ')' )
+            {
+            // InternalFormalML.g:51735:1: ( ')' )
+            // InternalFormalML.g:51736:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLeftHandSideExpressionAccess().getRightParenthesisKeyword_1_1_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLeftHandSideExpressionAccess().getRightParenthesisKeyword_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__Group_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group__0"
+    // InternalFormalML.g:51746:1: rule__ConditionalTestExpression__Group__0 : rule__ConditionalTestExpression__Group__0__Impl rule__ConditionalTestExpression__Group__1 ;
+    public final void rule__ConditionalTestExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51750:1: ( rule__ConditionalTestExpression__Group__0__Impl rule__ConditionalTestExpression__Group__1 )
+            // InternalFormalML.g:51751:2: rule__ConditionalTestExpression__Group__0__Impl rule__ConditionalTestExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_229);
+            rule__ConditionalTestExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group__0"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group__0__Impl"
+    // InternalFormalML.g:51758:1: rule__ConditionalTestExpression__Group__0__Impl : ( ruleLogicalOrExpression ) ;
+    public final void rule__ConditionalTestExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51762:1: ( ( ruleLogicalOrExpression ) )
+            // InternalFormalML.g:51763:1: ( ruleLogicalOrExpression )
+            {
+            // InternalFormalML.g:51763:1: ( ruleLogicalOrExpression )
+            // InternalFormalML.g:51764:2: ruleLogicalOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getLogicalOrExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLogicalOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getLogicalOrExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group__1"
+    // InternalFormalML.g:51773:1: rule__ConditionalTestExpression__Group__1 : rule__ConditionalTestExpression__Group__1__Impl ;
+    public final void rule__ConditionalTestExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51777:1: ( rule__ConditionalTestExpression__Group__1__Impl )
+            // InternalFormalML.g:51778:2: rule__ConditionalTestExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group__1"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group__1__Impl"
+    // InternalFormalML.g:51784:1: rule__ConditionalTestExpression__Group__1__Impl : ( ( rule__ConditionalTestExpression__Group_1__0 )? ) ;
+    public final void rule__ConditionalTestExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51788:1: ( ( ( rule__ConditionalTestExpression__Group_1__0 )? ) )
+            // InternalFormalML.g:51789:1: ( ( rule__ConditionalTestExpression__Group_1__0 )? )
+            {
+            // InternalFormalML.g:51789:1: ( ( rule__ConditionalTestExpression__Group_1__0 )? )
+            // InternalFormalML.g:51790:2: ( rule__ConditionalTestExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:51791:2: ( rule__ConditionalTestExpression__Group_1__0 )?
+            int alt654=2;
+            int LA654_0 = input.LA(1);
+
+            if ( (LA654_0==286) ) {
+                alt654=1;
+            }
+            switch (alt654) {
+                case 1 :
+                    // InternalFormalML.g:51791:3: rule__ConditionalTestExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ConditionalTestExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__0"
+    // InternalFormalML.g:51800:1: rule__ConditionalTestExpression__Group_1__0 : rule__ConditionalTestExpression__Group_1__0__Impl rule__ConditionalTestExpression__Group_1__1 ;
+    public final void rule__ConditionalTestExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51804:1: ( rule__ConditionalTestExpression__Group_1__0__Impl rule__ConditionalTestExpression__Group_1__1 )
+            // InternalFormalML.g:51805:2: rule__ConditionalTestExpression__Group_1__0__Impl rule__ConditionalTestExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_229);
+            rule__ConditionalTestExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__0__Impl"
+    // InternalFormalML.g:51812:1: rule__ConditionalTestExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__ConditionalTestExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51816:1: ( ( () ) )
+            // InternalFormalML.g:51817:1: ( () )
+            {
+            // InternalFormalML.g:51817:1: ( () )
+            // InternalFormalML.g:51818:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0()); 
+            }
+            // InternalFormalML.g:51819:2: ()
+            // InternalFormalML.g:51819:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__1"
+    // InternalFormalML.g:51827:1: rule__ConditionalTestExpression__Group_1__1 : rule__ConditionalTestExpression__Group_1__1__Impl rule__ConditionalTestExpression__Group_1__2 ;
+    public final void rule__ConditionalTestExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51831:1: ( rule__ConditionalTestExpression__Group_1__1__Impl rule__ConditionalTestExpression__Group_1__2 )
+            // InternalFormalML.g:51832:2: rule__ConditionalTestExpression__Group_1__1__Impl rule__ConditionalTestExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ConditionalTestExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__1__Impl"
+    // InternalFormalML.g:51839:1: rule__ConditionalTestExpression__Group_1__1__Impl : ( ( rule__ConditionalTestExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__ConditionalTestExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51843:1: ( ( ( rule__ConditionalTestExpression__OperatorAssignment_1_1 ) ) )
+            // InternalFormalML.g:51844:1: ( ( rule__ConditionalTestExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:51844:1: ( ( rule__ConditionalTestExpression__OperatorAssignment_1_1 ) )
+            // InternalFormalML.g:51845:2: ( rule__ConditionalTestExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalFormalML.g:51846:2: ( rule__ConditionalTestExpression__OperatorAssignment_1_1 )
+            // InternalFormalML.g:51846:3: rule__ConditionalTestExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__2"
+    // InternalFormalML.g:51854:1: rule__ConditionalTestExpression__Group_1__2 : rule__ConditionalTestExpression__Group_1__2__Impl rule__ConditionalTestExpression__Group_1__3 ;
+    public final void rule__ConditionalTestExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51858:1: ( rule__ConditionalTestExpression__Group_1__2__Impl rule__ConditionalTestExpression__Group_1__3 )
+            // InternalFormalML.g:51859:2: rule__ConditionalTestExpression__Group_1__2__Impl rule__ConditionalTestExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_55);
+            rule__ConditionalTestExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__2__Impl"
+    // InternalFormalML.g:51866:1: rule__ConditionalTestExpression__Group_1__2__Impl : ( ( rule__ConditionalTestExpression__ThenOperandAssignment_1_2 ) ) ;
+    public final void rule__ConditionalTestExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51870:1: ( ( ( rule__ConditionalTestExpression__ThenOperandAssignment_1_2 ) ) )
+            // InternalFormalML.g:51871:1: ( ( rule__ConditionalTestExpression__ThenOperandAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:51871:1: ( ( rule__ConditionalTestExpression__ThenOperandAssignment_1_2 ) )
+            // InternalFormalML.g:51872:2: ( rule__ConditionalTestExpression__ThenOperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getThenOperandAssignment_1_2()); 
+            }
+            // InternalFormalML.g:51873:2: ( rule__ConditionalTestExpression__ThenOperandAssignment_1_2 )
+            // InternalFormalML.g:51873:3: rule__ConditionalTestExpression__ThenOperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__ThenOperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getThenOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__3"
+    // InternalFormalML.g:51881:1: rule__ConditionalTestExpression__Group_1__3 : rule__ConditionalTestExpression__Group_1__3__Impl rule__ConditionalTestExpression__Group_1__4 ;
+    public final void rule__ConditionalTestExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51885:1: ( rule__ConditionalTestExpression__Group_1__3__Impl rule__ConditionalTestExpression__Group_1__4 )
+            // InternalFormalML.g:51886:2: rule__ConditionalTestExpression__Group_1__3__Impl rule__ConditionalTestExpression__Group_1__4
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ConditionalTestExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__Group_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__3__Impl"
+    // InternalFormalML.g:51893:1: rule__ConditionalTestExpression__Group_1__3__Impl : ( ':' ) ;
+    public final void rule__ConditionalTestExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51897:1: ( ( ':' ) )
+            // InternalFormalML.g:51898:1: ( ':' )
+            {
+            // InternalFormalML.g:51898:1: ( ':' )
+            // InternalFormalML.g:51899:2: ':'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getColonKeyword_1_3()); 
+            }
+            match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getColonKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__4"
+    // InternalFormalML.g:51908:1: rule__ConditionalTestExpression__Group_1__4 : rule__ConditionalTestExpression__Group_1__4__Impl ;
+    public final void rule__ConditionalTestExpression__Group_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51912:1: ( rule__ConditionalTestExpression__Group_1__4__Impl )
+            // InternalFormalML.g:51913:2: rule__ConditionalTestExpression__Group_1__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__Group_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__4"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__Group_1__4__Impl"
+    // InternalFormalML.g:51919:1: rule__ConditionalTestExpression__Group_1__4__Impl : ( ( rule__ConditionalTestExpression__ElseOperandAssignment_1_4 ) ) ;
+    public final void rule__ConditionalTestExpression__Group_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51923:1: ( ( ( rule__ConditionalTestExpression__ElseOperandAssignment_1_4 ) ) )
+            // InternalFormalML.g:51924:1: ( ( rule__ConditionalTestExpression__ElseOperandAssignment_1_4 ) )
+            {
+            // InternalFormalML.g:51924:1: ( ( rule__ConditionalTestExpression__ElseOperandAssignment_1_4 ) )
+            // InternalFormalML.g:51925:2: ( rule__ConditionalTestExpression__ElseOperandAssignment_1_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getElseOperandAssignment_1_4()); 
+            }
+            // InternalFormalML.g:51926:2: ( rule__ConditionalTestExpression__ElseOperandAssignment_1_4 )
+            // InternalFormalML.g:51926:3: rule__ConditionalTestExpression__ElseOperandAssignment_1_4
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ConditionalTestExpression__ElseOperandAssignment_1_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getElseOperandAssignment_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__Group_1__4__Impl"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group__0"
+    // InternalFormalML.g:51935:1: rule__LogicalOrExpression__Group__0 : rule__LogicalOrExpression__Group__0__Impl rule__LogicalOrExpression__Group__1 ;
+    public final void rule__LogicalOrExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51939:1: ( rule__LogicalOrExpression__Group__0__Impl rule__LogicalOrExpression__Group__1 )
+            // InternalFormalML.g:51940:2: rule__LogicalOrExpression__Group__0__Impl rule__LogicalOrExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_230);
+            rule__LogicalOrExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group__0"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group__0__Impl"
+    // InternalFormalML.g:51947:1: rule__LogicalOrExpression__Group__0__Impl : ( ruleLogicalAndExpression ) ;
+    public final void rule__LogicalOrExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51951:1: ( ( ruleLogicalAndExpression ) )
+            // InternalFormalML.g:51952:1: ( ruleLogicalAndExpression )
+            {
+            // InternalFormalML.g:51952:1: ( ruleLogicalAndExpression )
+            // InternalFormalML.g:51953:2: ruleLogicalAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getLogicalAndExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLogicalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getLogicalAndExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group__1"
+    // InternalFormalML.g:51962:1: rule__LogicalOrExpression__Group__1 : rule__LogicalOrExpression__Group__1__Impl ;
+    public final void rule__LogicalOrExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51966:1: ( rule__LogicalOrExpression__Group__1__Impl )
+            // InternalFormalML.g:51967:2: rule__LogicalOrExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group__1"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group__1__Impl"
+    // InternalFormalML.g:51973:1: rule__LogicalOrExpression__Group__1__Impl : ( ( rule__LogicalOrExpression__Group_1__0 )? ) ;
+    public final void rule__LogicalOrExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51977:1: ( ( ( rule__LogicalOrExpression__Group_1__0 )? ) )
+            // InternalFormalML.g:51978:1: ( ( rule__LogicalOrExpression__Group_1__0 )? )
+            {
+            // InternalFormalML.g:51978:1: ( ( rule__LogicalOrExpression__Group_1__0 )? )
+            // InternalFormalML.g:51979:2: ( rule__LogicalOrExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:51980:2: ( rule__LogicalOrExpression__Group_1__0 )?
+            int alt655=2;
+            int LA655_0 = input.LA(1);
+
+            if ( (LA655_0==34||LA655_0==79) ) {
+                alt655=1;
+            }
+            switch (alt655) {
+                case 1 :
+                    // InternalFormalML.g:51980:3: rule__LogicalOrExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LogicalOrExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1__0"
+    // InternalFormalML.g:51989:1: rule__LogicalOrExpression__Group_1__0 : rule__LogicalOrExpression__Group_1__0__Impl rule__LogicalOrExpression__Group_1__1 ;
+    public final void rule__LogicalOrExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:51993:1: ( rule__LogicalOrExpression__Group_1__0__Impl rule__LogicalOrExpression__Group_1__1 )
+            // InternalFormalML.g:51994:2: rule__LogicalOrExpression__Group_1__0__Impl rule__LogicalOrExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_230);
+            rule__LogicalOrExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1__0__Impl"
+    // InternalFormalML.g:52001:1: rule__LogicalOrExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__LogicalOrExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52005:1: ( ( () ) )
+            // InternalFormalML.g:52006:1: ( () )
+            {
+            // InternalFormalML.g:52006:1: ( () )
+            // InternalFormalML.g:52007:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()); 
+            }
+            // InternalFormalML.g:52008:2: ()
+            // InternalFormalML.g:52008:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1__1"
+    // InternalFormalML.g:52016:1: rule__LogicalOrExpression__Group_1__1 : rule__LogicalOrExpression__Group_1__1__Impl rule__LogicalOrExpression__Group_1__2 ;
+    public final void rule__LogicalOrExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52020:1: ( rule__LogicalOrExpression__Group_1__1__Impl rule__LogicalOrExpression__Group_1__2 )
+            // InternalFormalML.g:52021:2: rule__LogicalOrExpression__Group_1__1__Impl rule__LogicalOrExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__LogicalOrExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1__1__Impl"
+    // InternalFormalML.g:52028:1: rule__LogicalOrExpression__Group_1__1__Impl : ( ( rule__LogicalOrExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__LogicalOrExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52032:1: ( ( ( rule__LogicalOrExpression__OperatorAssignment_1_1 ) ) )
+            // InternalFormalML.g:52033:1: ( ( rule__LogicalOrExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:52033:1: ( ( rule__LogicalOrExpression__OperatorAssignment_1_1 ) )
+            // InternalFormalML.g:52034:2: ( rule__LogicalOrExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalFormalML.g:52035:2: ( rule__LogicalOrExpression__OperatorAssignment_1_1 )
+            // InternalFormalML.g:52035:3: rule__LogicalOrExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1__2"
+    // InternalFormalML.g:52043:1: rule__LogicalOrExpression__Group_1__2 : rule__LogicalOrExpression__Group_1__2__Impl rule__LogicalOrExpression__Group_1__3 ;
+    public final void rule__LogicalOrExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52047:1: ( rule__LogicalOrExpression__Group_1__2__Impl rule__LogicalOrExpression__Group_1__3 )
+            // InternalFormalML.g:52048:2: rule__LogicalOrExpression__Group_1__2__Impl rule__LogicalOrExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_230);
+            rule__LogicalOrExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1__2__Impl"
+    // InternalFormalML.g:52055:1: rule__LogicalOrExpression__Group_1__2__Impl : ( ( rule__LogicalOrExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__LogicalOrExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52059:1: ( ( ( rule__LogicalOrExpression__OperandAssignment_1_2 ) ) )
+            // InternalFormalML.g:52060:1: ( ( rule__LogicalOrExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:52060:1: ( ( rule__LogicalOrExpression__OperandAssignment_1_2 ) )
+            // InternalFormalML.g:52061:2: ( rule__LogicalOrExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalFormalML.g:52062:2: ( rule__LogicalOrExpression__OperandAssignment_1_2 )
+            // InternalFormalML.g:52062:3: rule__LogicalOrExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1__3"
+    // InternalFormalML.g:52070:1: rule__LogicalOrExpression__Group_1__3 : rule__LogicalOrExpression__Group_1__3__Impl ;
+    public final void rule__LogicalOrExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52074:1: ( rule__LogicalOrExpression__Group_1__3__Impl )
+            // InternalFormalML.g:52075:2: rule__LogicalOrExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1__3__Impl"
+    // InternalFormalML.g:52081:1: rule__LogicalOrExpression__Group_1__3__Impl : ( ( rule__LogicalOrExpression__Group_1_3__0 )* ) ;
+    public final void rule__LogicalOrExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52085:1: ( ( ( rule__LogicalOrExpression__Group_1_3__0 )* ) )
+            // InternalFormalML.g:52086:1: ( ( rule__LogicalOrExpression__Group_1_3__0 )* )
+            {
+            // InternalFormalML.g:52086:1: ( ( rule__LogicalOrExpression__Group_1_3__0 )* )
+            // InternalFormalML.g:52087:2: ( rule__LogicalOrExpression__Group_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalFormalML.g:52088:2: ( rule__LogicalOrExpression__Group_1_3__0 )*
+            loop656:
+            do {
+                int alt656=2;
+                int LA656_0 = input.LA(1);
+
+                if ( (LA656_0==34||LA656_0==79) ) {
+                    alt656=1;
+                }
+
+
+                switch (alt656) {
+            	case 1 :
+            	    // InternalFormalML.g:52088:3: rule__LogicalOrExpression__Group_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_231);
+            	    rule__LogicalOrExpression__Group_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop656;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1_3__0"
+    // InternalFormalML.g:52097:1: rule__LogicalOrExpression__Group_1_3__0 : rule__LogicalOrExpression__Group_1_3__0__Impl rule__LogicalOrExpression__Group_1_3__1 ;
+    public final void rule__LogicalOrExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52101:1: ( rule__LogicalOrExpression__Group_1_3__0__Impl rule__LogicalOrExpression__Group_1_3__1 )
+            // InternalFormalML.g:52102:2: rule__LogicalOrExpression__Group_1_3__0__Impl rule__LogicalOrExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__LogicalOrExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1_3__0__Impl"
+    // InternalFormalML.g:52109:1: rule__LogicalOrExpression__Group_1_3__0__Impl : ( ( rule__LogicalOrExpression__Alternatives_1_3_0 ) ) ;
+    public final void rule__LogicalOrExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52113:1: ( ( ( rule__LogicalOrExpression__Alternatives_1_3_0 ) ) )
+            // InternalFormalML.g:52114:1: ( ( rule__LogicalOrExpression__Alternatives_1_3_0 ) )
+            {
+            // InternalFormalML.g:52114:1: ( ( rule__LogicalOrExpression__Alternatives_1_3_0 ) )
+            // InternalFormalML.g:52115:2: ( rule__LogicalOrExpression__Alternatives_1_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getAlternatives_1_3_0()); 
+            }
+            // InternalFormalML.g:52116:2: ( rule__LogicalOrExpression__Alternatives_1_3_0 )
+            // InternalFormalML.g:52116:3: rule__LogicalOrExpression__Alternatives_1_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Alternatives_1_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getAlternatives_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1_3__1"
+    // InternalFormalML.g:52124:1: rule__LogicalOrExpression__Group_1_3__1 : rule__LogicalOrExpression__Group_1_3__1__Impl ;
+    public final void rule__LogicalOrExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52128:1: ( rule__LogicalOrExpression__Group_1_3__1__Impl )
+            // InternalFormalML.g:52129:2: rule__LogicalOrExpression__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__Group_1_3__1__Impl"
+    // InternalFormalML.g:52135:1: rule__LogicalOrExpression__Group_1_3__1__Impl : ( ( rule__LogicalOrExpression__OperandAssignment_1_3_1 ) ) ;
+    public final void rule__LogicalOrExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52139:1: ( ( ( rule__LogicalOrExpression__OperandAssignment_1_3_1 ) ) )
+            // InternalFormalML.g:52140:1: ( ( rule__LogicalOrExpression__OperandAssignment_1_3_1 ) )
+            {
+            // InternalFormalML.g:52140:1: ( ( rule__LogicalOrExpression__OperandAssignment_1_3_1 ) )
+            // InternalFormalML.g:52141:2: ( rule__LogicalOrExpression__OperandAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+            // InternalFormalML.g:52142:2: ( rule__LogicalOrExpression__OperandAssignment_1_3_1 )
+            // InternalFormalML.g:52142:3: rule__LogicalOrExpression__OperandAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__OperandAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group__0"
+    // InternalFormalML.g:52151:1: rule__LogicalAndExpression__Group__0 : rule__LogicalAndExpression__Group__0__Impl rule__LogicalAndExpression__Group__1 ;
+    public final void rule__LogicalAndExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52155:1: ( rule__LogicalAndExpression__Group__0__Impl rule__LogicalAndExpression__Group__1 )
+            // InternalFormalML.g:52156:2: rule__LogicalAndExpression__Group__0__Impl rule__LogicalAndExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_232);
+            rule__LogicalAndExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group__0"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group__0__Impl"
+    // InternalFormalML.g:52163:1: rule__LogicalAndExpression__Group__0__Impl : ( ruleBitwiseOrExpression ) ;
+    public final void rule__LogicalAndExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52167:1: ( ( ruleBitwiseOrExpression ) )
+            // InternalFormalML.g:52168:1: ( ruleBitwiseOrExpression )
+            {
+            // InternalFormalML.g:52168:1: ( ruleBitwiseOrExpression )
+            // InternalFormalML.g:52169:2: ruleBitwiseOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getBitwiseOrExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getBitwiseOrExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group__1"
+    // InternalFormalML.g:52178:1: rule__LogicalAndExpression__Group__1 : rule__LogicalAndExpression__Group__1__Impl ;
+    public final void rule__LogicalAndExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52182:1: ( rule__LogicalAndExpression__Group__1__Impl )
+            // InternalFormalML.g:52183:2: rule__LogicalAndExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group__1"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group__1__Impl"
+    // InternalFormalML.g:52189:1: rule__LogicalAndExpression__Group__1__Impl : ( ( rule__LogicalAndExpression__Group_1__0 )? ) ;
+    public final void rule__LogicalAndExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52193:1: ( ( ( rule__LogicalAndExpression__Group_1__0 )? ) )
+            // InternalFormalML.g:52194:1: ( ( rule__LogicalAndExpression__Group_1__0 )? )
+            {
+            // InternalFormalML.g:52194:1: ( ( rule__LogicalAndExpression__Group_1__0 )? )
+            // InternalFormalML.g:52195:2: ( rule__LogicalAndExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:52196:2: ( rule__LogicalAndExpression__Group_1__0 )?
+            int alt657=2;
+            int LA657_0 = input.LA(1);
+
+            if ( (LA657_0==33||LA657_0==78) ) {
+                alt657=1;
+            }
+            switch (alt657) {
+                case 1 :
+                    // InternalFormalML.g:52196:3: rule__LogicalAndExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LogicalAndExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1__0"
+    // InternalFormalML.g:52205:1: rule__LogicalAndExpression__Group_1__0 : rule__LogicalAndExpression__Group_1__0__Impl rule__LogicalAndExpression__Group_1__1 ;
+    public final void rule__LogicalAndExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52209:1: ( rule__LogicalAndExpression__Group_1__0__Impl rule__LogicalAndExpression__Group_1__1 )
+            // InternalFormalML.g:52210:2: rule__LogicalAndExpression__Group_1__0__Impl rule__LogicalAndExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_232);
+            rule__LogicalAndExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1__0__Impl"
+    // InternalFormalML.g:52217:1: rule__LogicalAndExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__LogicalAndExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52221:1: ( ( () ) )
+            // InternalFormalML.g:52222:1: ( () )
+            {
+            // InternalFormalML.g:52222:1: ( () )
+            // InternalFormalML.g:52223:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()); 
+            }
+            // InternalFormalML.g:52224:2: ()
+            // InternalFormalML.g:52224:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1__1"
+    // InternalFormalML.g:52232:1: rule__LogicalAndExpression__Group_1__1 : rule__LogicalAndExpression__Group_1__1__Impl rule__LogicalAndExpression__Group_1__2 ;
+    public final void rule__LogicalAndExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52236:1: ( rule__LogicalAndExpression__Group_1__1__Impl rule__LogicalAndExpression__Group_1__2 )
+            // InternalFormalML.g:52237:2: rule__LogicalAndExpression__Group_1__1__Impl rule__LogicalAndExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__LogicalAndExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1__1__Impl"
+    // InternalFormalML.g:52244:1: rule__LogicalAndExpression__Group_1__1__Impl : ( ( rule__LogicalAndExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__LogicalAndExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52248:1: ( ( ( rule__LogicalAndExpression__OperatorAssignment_1_1 ) ) )
+            // InternalFormalML.g:52249:1: ( ( rule__LogicalAndExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:52249:1: ( ( rule__LogicalAndExpression__OperatorAssignment_1_1 ) )
+            // InternalFormalML.g:52250:2: ( rule__LogicalAndExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalFormalML.g:52251:2: ( rule__LogicalAndExpression__OperatorAssignment_1_1 )
+            // InternalFormalML.g:52251:3: rule__LogicalAndExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1__2"
+    // InternalFormalML.g:52259:1: rule__LogicalAndExpression__Group_1__2 : rule__LogicalAndExpression__Group_1__2__Impl rule__LogicalAndExpression__Group_1__3 ;
+    public final void rule__LogicalAndExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52263:1: ( rule__LogicalAndExpression__Group_1__2__Impl rule__LogicalAndExpression__Group_1__3 )
+            // InternalFormalML.g:52264:2: rule__LogicalAndExpression__Group_1__2__Impl rule__LogicalAndExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_232);
+            rule__LogicalAndExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1__2__Impl"
+    // InternalFormalML.g:52271:1: rule__LogicalAndExpression__Group_1__2__Impl : ( ( rule__LogicalAndExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__LogicalAndExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52275:1: ( ( ( rule__LogicalAndExpression__OperandAssignment_1_2 ) ) )
+            // InternalFormalML.g:52276:1: ( ( rule__LogicalAndExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:52276:1: ( ( rule__LogicalAndExpression__OperandAssignment_1_2 ) )
+            // InternalFormalML.g:52277:2: ( rule__LogicalAndExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalFormalML.g:52278:2: ( rule__LogicalAndExpression__OperandAssignment_1_2 )
+            // InternalFormalML.g:52278:3: rule__LogicalAndExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1__3"
+    // InternalFormalML.g:52286:1: rule__LogicalAndExpression__Group_1__3 : rule__LogicalAndExpression__Group_1__3__Impl ;
+    public final void rule__LogicalAndExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52290:1: ( rule__LogicalAndExpression__Group_1__3__Impl )
+            // InternalFormalML.g:52291:2: rule__LogicalAndExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1__3__Impl"
+    // InternalFormalML.g:52297:1: rule__LogicalAndExpression__Group_1__3__Impl : ( ( rule__LogicalAndExpression__Group_1_3__0 )* ) ;
+    public final void rule__LogicalAndExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52301:1: ( ( ( rule__LogicalAndExpression__Group_1_3__0 )* ) )
+            // InternalFormalML.g:52302:1: ( ( rule__LogicalAndExpression__Group_1_3__0 )* )
+            {
+            // InternalFormalML.g:52302:1: ( ( rule__LogicalAndExpression__Group_1_3__0 )* )
+            // InternalFormalML.g:52303:2: ( rule__LogicalAndExpression__Group_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalFormalML.g:52304:2: ( rule__LogicalAndExpression__Group_1_3__0 )*
+            loop658:
+            do {
+                int alt658=2;
+                int LA658_0 = input.LA(1);
+
+                if ( (LA658_0==33||LA658_0==78) ) {
+                    alt658=1;
+                }
+
+
+                switch (alt658) {
+            	case 1 :
+            	    // InternalFormalML.g:52304:3: rule__LogicalAndExpression__Group_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_233);
+            	    rule__LogicalAndExpression__Group_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop658;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1_3__0"
+    // InternalFormalML.g:52313:1: rule__LogicalAndExpression__Group_1_3__0 : rule__LogicalAndExpression__Group_1_3__0__Impl rule__LogicalAndExpression__Group_1_3__1 ;
+    public final void rule__LogicalAndExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52317:1: ( rule__LogicalAndExpression__Group_1_3__0__Impl rule__LogicalAndExpression__Group_1_3__1 )
+            // InternalFormalML.g:52318:2: rule__LogicalAndExpression__Group_1_3__0__Impl rule__LogicalAndExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__LogicalAndExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1_3__0__Impl"
+    // InternalFormalML.g:52325:1: rule__LogicalAndExpression__Group_1_3__0__Impl : ( ( rule__LogicalAndExpression__Alternatives_1_3_0 ) ) ;
+    public final void rule__LogicalAndExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52329:1: ( ( ( rule__LogicalAndExpression__Alternatives_1_3_0 ) ) )
+            // InternalFormalML.g:52330:1: ( ( rule__LogicalAndExpression__Alternatives_1_3_0 ) )
+            {
+            // InternalFormalML.g:52330:1: ( ( rule__LogicalAndExpression__Alternatives_1_3_0 ) )
+            // InternalFormalML.g:52331:2: ( rule__LogicalAndExpression__Alternatives_1_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getAlternatives_1_3_0()); 
+            }
+            // InternalFormalML.g:52332:2: ( rule__LogicalAndExpression__Alternatives_1_3_0 )
+            // InternalFormalML.g:52332:3: rule__LogicalAndExpression__Alternatives_1_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Alternatives_1_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getAlternatives_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1_3__1"
+    // InternalFormalML.g:52340:1: rule__LogicalAndExpression__Group_1_3__1 : rule__LogicalAndExpression__Group_1_3__1__Impl ;
+    public final void rule__LogicalAndExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52344:1: ( rule__LogicalAndExpression__Group_1_3__1__Impl )
+            // InternalFormalML.g:52345:2: rule__LogicalAndExpression__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__Group_1_3__1__Impl"
+    // InternalFormalML.g:52351:1: rule__LogicalAndExpression__Group_1_3__1__Impl : ( ( rule__LogicalAndExpression__OperandAssignment_1_3_1 ) ) ;
+    public final void rule__LogicalAndExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52355:1: ( ( ( rule__LogicalAndExpression__OperandAssignment_1_3_1 ) ) )
+            // InternalFormalML.g:52356:1: ( ( rule__LogicalAndExpression__OperandAssignment_1_3_1 ) )
+            {
+            // InternalFormalML.g:52356:1: ( ( rule__LogicalAndExpression__OperandAssignment_1_3_1 ) )
+            // InternalFormalML.g:52357:2: ( rule__LogicalAndExpression__OperandAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+            // InternalFormalML.g:52358:2: ( rule__LogicalAndExpression__OperandAssignment_1_3_1 )
+            // InternalFormalML.g:52358:3: rule__LogicalAndExpression__OperandAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__OperandAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group__0"
+    // InternalFormalML.g:52367:1: rule__BitwiseOrExpression__Group__0 : rule__BitwiseOrExpression__Group__0__Impl rule__BitwiseOrExpression__Group__1 ;
+    public final void rule__BitwiseOrExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52371:1: ( rule__BitwiseOrExpression__Group__0__Impl rule__BitwiseOrExpression__Group__1 )
+            // InternalFormalML.g:52372:2: rule__BitwiseOrExpression__Group__0__Impl rule__BitwiseOrExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_234);
+            rule__BitwiseOrExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group__0"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group__0__Impl"
+    // InternalFormalML.g:52379:1: rule__BitwiseOrExpression__Group__0__Impl : ( ruleBitwiseXorExpression ) ;
+    public final void rule__BitwiseOrExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52383:1: ( ( ruleBitwiseXorExpression ) )
+            // InternalFormalML.g:52384:1: ( ruleBitwiseXorExpression )
+            {
+            // InternalFormalML.g:52384:1: ( ruleBitwiseXorExpression )
+            // InternalFormalML.g:52385:2: ruleBitwiseXorExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseXorExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseXorExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseXorExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group__1"
+    // InternalFormalML.g:52394:1: rule__BitwiseOrExpression__Group__1 : rule__BitwiseOrExpression__Group__1__Impl ;
+    public final void rule__BitwiseOrExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52398:1: ( rule__BitwiseOrExpression__Group__1__Impl )
+            // InternalFormalML.g:52399:2: rule__BitwiseOrExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group__1"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group__1__Impl"
+    // InternalFormalML.g:52405:1: rule__BitwiseOrExpression__Group__1__Impl : ( ( rule__BitwiseOrExpression__Group_1__0 )? ) ;
+    public final void rule__BitwiseOrExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52409:1: ( ( ( rule__BitwiseOrExpression__Group_1__0 )? ) )
+            // InternalFormalML.g:52410:1: ( ( rule__BitwiseOrExpression__Group_1__0 )? )
+            {
+            // InternalFormalML.g:52410:1: ( ( rule__BitwiseOrExpression__Group_1__0 )? )
+            // InternalFormalML.g:52411:2: ( rule__BitwiseOrExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:52412:2: ( rule__BitwiseOrExpression__Group_1__0 )?
+            int alt659=2;
+            int LA659_0 = input.LA(1);
+
+            if ( (LA659_0==256) ) {
+                alt659=1;
+            }
+            switch (alt659) {
+                case 1 :
+                    // InternalFormalML.g:52412:3: rule__BitwiseOrExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BitwiseOrExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1__0"
+    // InternalFormalML.g:52421:1: rule__BitwiseOrExpression__Group_1__0 : rule__BitwiseOrExpression__Group_1__0__Impl rule__BitwiseOrExpression__Group_1__1 ;
+    public final void rule__BitwiseOrExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52425:1: ( rule__BitwiseOrExpression__Group_1__0__Impl rule__BitwiseOrExpression__Group_1__1 )
+            // InternalFormalML.g:52426:2: rule__BitwiseOrExpression__Group_1__0__Impl rule__BitwiseOrExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_234);
+            rule__BitwiseOrExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1__0__Impl"
+    // InternalFormalML.g:52433:1: rule__BitwiseOrExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__BitwiseOrExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52437:1: ( ( () ) )
+            // InternalFormalML.g:52438:1: ( () )
+            {
+            // InternalFormalML.g:52438:1: ( () )
+            // InternalFormalML.g:52439:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); 
+            }
+            // InternalFormalML.g:52440:2: ()
+            // InternalFormalML.g:52440:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1__1"
+    // InternalFormalML.g:52448:1: rule__BitwiseOrExpression__Group_1__1 : rule__BitwiseOrExpression__Group_1__1__Impl rule__BitwiseOrExpression__Group_1__2 ;
+    public final void rule__BitwiseOrExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52452:1: ( rule__BitwiseOrExpression__Group_1__1__Impl rule__BitwiseOrExpression__Group_1__2 )
+            // InternalFormalML.g:52453:2: rule__BitwiseOrExpression__Group_1__1__Impl rule__BitwiseOrExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__BitwiseOrExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1__1__Impl"
+    // InternalFormalML.g:52460:1: rule__BitwiseOrExpression__Group_1__1__Impl : ( ( rule__BitwiseOrExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__BitwiseOrExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52464:1: ( ( ( rule__BitwiseOrExpression__OperatorAssignment_1_1 ) ) )
+            // InternalFormalML.g:52465:1: ( ( rule__BitwiseOrExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:52465:1: ( ( rule__BitwiseOrExpression__OperatorAssignment_1_1 ) )
+            // InternalFormalML.g:52466:2: ( rule__BitwiseOrExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalFormalML.g:52467:2: ( rule__BitwiseOrExpression__OperatorAssignment_1_1 )
+            // InternalFormalML.g:52467:3: rule__BitwiseOrExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1__2"
+    // InternalFormalML.g:52475:1: rule__BitwiseOrExpression__Group_1__2 : rule__BitwiseOrExpression__Group_1__2__Impl rule__BitwiseOrExpression__Group_1__3 ;
+    public final void rule__BitwiseOrExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52479:1: ( rule__BitwiseOrExpression__Group_1__2__Impl rule__BitwiseOrExpression__Group_1__3 )
+            // InternalFormalML.g:52480:2: rule__BitwiseOrExpression__Group_1__2__Impl rule__BitwiseOrExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_234);
+            rule__BitwiseOrExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1__2__Impl"
+    // InternalFormalML.g:52487:1: rule__BitwiseOrExpression__Group_1__2__Impl : ( ( rule__BitwiseOrExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__BitwiseOrExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52491:1: ( ( ( rule__BitwiseOrExpression__OperandAssignment_1_2 ) ) )
+            // InternalFormalML.g:52492:1: ( ( rule__BitwiseOrExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:52492:1: ( ( rule__BitwiseOrExpression__OperandAssignment_1_2 ) )
+            // InternalFormalML.g:52493:2: ( rule__BitwiseOrExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalFormalML.g:52494:2: ( rule__BitwiseOrExpression__OperandAssignment_1_2 )
+            // InternalFormalML.g:52494:3: rule__BitwiseOrExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1__3"
+    // InternalFormalML.g:52502:1: rule__BitwiseOrExpression__Group_1__3 : rule__BitwiseOrExpression__Group_1__3__Impl ;
+    public final void rule__BitwiseOrExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52506:1: ( rule__BitwiseOrExpression__Group_1__3__Impl )
+            // InternalFormalML.g:52507:2: rule__BitwiseOrExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1__3__Impl"
+    // InternalFormalML.g:52513:1: rule__BitwiseOrExpression__Group_1__3__Impl : ( ( rule__BitwiseOrExpression__Group_1_3__0 )* ) ;
+    public final void rule__BitwiseOrExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52517:1: ( ( ( rule__BitwiseOrExpression__Group_1_3__0 )* ) )
+            // InternalFormalML.g:52518:1: ( ( rule__BitwiseOrExpression__Group_1_3__0 )* )
+            {
+            // InternalFormalML.g:52518:1: ( ( rule__BitwiseOrExpression__Group_1_3__0 )* )
+            // InternalFormalML.g:52519:2: ( rule__BitwiseOrExpression__Group_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalFormalML.g:52520:2: ( rule__BitwiseOrExpression__Group_1_3__0 )*
+            loop660:
+            do {
+                int alt660=2;
+                int LA660_0 = input.LA(1);
+
+                if ( (LA660_0==256) ) {
+                    alt660=1;
+                }
+
+
+                switch (alt660) {
+            	case 1 :
+            	    // InternalFormalML.g:52520:3: rule__BitwiseOrExpression__Group_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_235);
+            	    rule__BitwiseOrExpression__Group_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop660;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1_3__0"
+    // InternalFormalML.g:52529:1: rule__BitwiseOrExpression__Group_1_3__0 : rule__BitwiseOrExpression__Group_1_3__0__Impl rule__BitwiseOrExpression__Group_1_3__1 ;
+    public final void rule__BitwiseOrExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52533:1: ( rule__BitwiseOrExpression__Group_1_3__0__Impl rule__BitwiseOrExpression__Group_1_3__1 )
+            // InternalFormalML.g:52534:2: rule__BitwiseOrExpression__Group_1_3__0__Impl rule__BitwiseOrExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__BitwiseOrExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1_3__0__Impl"
+    // InternalFormalML.g:52541:1: rule__BitwiseOrExpression__Group_1_3__0__Impl : ( '|' ) ;
+    public final void rule__BitwiseOrExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52545:1: ( ( '|' ) )
+            // InternalFormalML.g:52546:1: ( '|' )
+            {
+            // InternalFormalML.g:52546:1: ( '|' )
+            // InternalFormalML.g:52547:2: '|'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getVerticalLineKeyword_1_3_0()); 
+            }
+            match(input,256,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getVerticalLineKeyword_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1_3__1"
+    // InternalFormalML.g:52556:1: rule__BitwiseOrExpression__Group_1_3__1 : rule__BitwiseOrExpression__Group_1_3__1__Impl ;
+    public final void rule__BitwiseOrExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52560:1: ( rule__BitwiseOrExpression__Group_1_3__1__Impl )
+            // InternalFormalML.g:52561:2: rule__BitwiseOrExpression__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__Group_1_3__1__Impl"
+    // InternalFormalML.g:52567:1: rule__BitwiseOrExpression__Group_1_3__1__Impl : ( ( rule__BitwiseOrExpression__OperandAssignment_1_3_1 ) ) ;
+    public final void rule__BitwiseOrExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52571:1: ( ( ( rule__BitwiseOrExpression__OperandAssignment_1_3_1 ) ) )
+            // InternalFormalML.g:52572:1: ( ( rule__BitwiseOrExpression__OperandAssignment_1_3_1 ) )
+            {
+            // InternalFormalML.g:52572:1: ( ( rule__BitwiseOrExpression__OperandAssignment_1_3_1 ) )
+            // InternalFormalML.g:52573:2: ( rule__BitwiseOrExpression__OperandAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+            // InternalFormalML.g:52574:2: ( rule__BitwiseOrExpression__OperandAssignment_1_3_1 )
+            // InternalFormalML.g:52574:3: rule__BitwiseOrExpression__OperandAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseOrExpression__OperandAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group__0"
+    // InternalFormalML.g:52583:1: rule__BitwiseXorExpression__Group__0 : rule__BitwiseXorExpression__Group__0__Impl rule__BitwiseXorExpression__Group__1 ;
+    public final void rule__BitwiseXorExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52587:1: ( rule__BitwiseXorExpression__Group__0__Impl rule__BitwiseXorExpression__Group__1 )
+            // InternalFormalML.g:52588:2: rule__BitwiseXorExpression__Group__0__Impl rule__BitwiseXorExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_236);
+            rule__BitwiseXorExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group__0"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group__0__Impl"
+    // InternalFormalML.g:52595:1: rule__BitwiseXorExpression__Group__0__Impl : ( ruleBitwiseAndExpression ) ;
+    public final void rule__BitwiseXorExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52599:1: ( ( ruleBitwiseAndExpression ) )
+            // InternalFormalML.g:52600:1: ( ruleBitwiseAndExpression )
+            {
+            // InternalFormalML.g:52600:1: ( ruleBitwiseAndExpression )
+            // InternalFormalML.g:52601:2: ruleBitwiseAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAndExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAndExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group__1"
+    // InternalFormalML.g:52610:1: rule__BitwiseXorExpression__Group__1 : rule__BitwiseXorExpression__Group__1__Impl ;
+    public final void rule__BitwiseXorExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52614:1: ( rule__BitwiseXorExpression__Group__1__Impl )
+            // InternalFormalML.g:52615:2: rule__BitwiseXorExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group__1"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group__1__Impl"
+    // InternalFormalML.g:52621:1: rule__BitwiseXorExpression__Group__1__Impl : ( ( rule__BitwiseXorExpression__Group_1__0 )? ) ;
+    public final void rule__BitwiseXorExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52625:1: ( ( ( rule__BitwiseXorExpression__Group_1__0 )? ) )
+            // InternalFormalML.g:52626:1: ( ( rule__BitwiseXorExpression__Group_1__0 )? )
+            {
+            // InternalFormalML.g:52626:1: ( ( rule__BitwiseXorExpression__Group_1__0 )? )
+            // InternalFormalML.g:52627:2: ( rule__BitwiseXorExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:52628:2: ( rule__BitwiseXorExpression__Group_1__0 )?
+            int alt661=2;
+            int LA661_0 = input.LA(1);
+
+            if ( (LA661_0==257) ) {
+                alt661=1;
+            }
+            switch (alt661) {
+                case 1 :
+                    // InternalFormalML.g:52628:3: rule__BitwiseXorExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BitwiseXorExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1__0"
+    // InternalFormalML.g:52637:1: rule__BitwiseXorExpression__Group_1__0 : rule__BitwiseXorExpression__Group_1__0__Impl rule__BitwiseXorExpression__Group_1__1 ;
+    public final void rule__BitwiseXorExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52641:1: ( rule__BitwiseXorExpression__Group_1__0__Impl rule__BitwiseXorExpression__Group_1__1 )
+            // InternalFormalML.g:52642:2: rule__BitwiseXorExpression__Group_1__0__Impl rule__BitwiseXorExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_236);
+            rule__BitwiseXorExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1__0__Impl"
+    // InternalFormalML.g:52649:1: rule__BitwiseXorExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__BitwiseXorExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52653:1: ( ( () ) )
+            // InternalFormalML.g:52654:1: ( () )
+            {
+            // InternalFormalML.g:52654:1: ( () )
+            // InternalFormalML.g:52655:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); 
+            }
+            // InternalFormalML.g:52656:2: ()
+            // InternalFormalML.g:52656:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1__1"
+    // InternalFormalML.g:52664:1: rule__BitwiseXorExpression__Group_1__1 : rule__BitwiseXorExpression__Group_1__1__Impl rule__BitwiseXorExpression__Group_1__2 ;
+    public final void rule__BitwiseXorExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52668:1: ( rule__BitwiseXorExpression__Group_1__1__Impl rule__BitwiseXorExpression__Group_1__2 )
+            // InternalFormalML.g:52669:2: rule__BitwiseXorExpression__Group_1__1__Impl rule__BitwiseXorExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__BitwiseXorExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1__1__Impl"
+    // InternalFormalML.g:52676:1: rule__BitwiseXorExpression__Group_1__1__Impl : ( ( rule__BitwiseXorExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__BitwiseXorExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52680:1: ( ( ( rule__BitwiseXorExpression__OperatorAssignment_1_1 ) ) )
+            // InternalFormalML.g:52681:1: ( ( rule__BitwiseXorExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:52681:1: ( ( rule__BitwiseXorExpression__OperatorAssignment_1_1 ) )
+            // InternalFormalML.g:52682:2: ( rule__BitwiseXorExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalFormalML.g:52683:2: ( rule__BitwiseXorExpression__OperatorAssignment_1_1 )
+            // InternalFormalML.g:52683:3: rule__BitwiseXorExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1__2"
+    // InternalFormalML.g:52691:1: rule__BitwiseXorExpression__Group_1__2 : rule__BitwiseXorExpression__Group_1__2__Impl rule__BitwiseXorExpression__Group_1__3 ;
+    public final void rule__BitwiseXorExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52695:1: ( rule__BitwiseXorExpression__Group_1__2__Impl rule__BitwiseXorExpression__Group_1__3 )
+            // InternalFormalML.g:52696:2: rule__BitwiseXorExpression__Group_1__2__Impl rule__BitwiseXorExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_236);
+            rule__BitwiseXorExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1__2__Impl"
+    // InternalFormalML.g:52703:1: rule__BitwiseXorExpression__Group_1__2__Impl : ( ( rule__BitwiseXorExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__BitwiseXorExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52707:1: ( ( ( rule__BitwiseXorExpression__OperandAssignment_1_2 ) ) )
+            // InternalFormalML.g:52708:1: ( ( rule__BitwiseXorExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:52708:1: ( ( rule__BitwiseXorExpression__OperandAssignment_1_2 ) )
+            // InternalFormalML.g:52709:2: ( rule__BitwiseXorExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalFormalML.g:52710:2: ( rule__BitwiseXorExpression__OperandAssignment_1_2 )
+            // InternalFormalML.g:52710:3: rule__BitwiseXorExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1__3"
+    // InternalFormalML.g:52718:1: rule__BitwiseXorExpression__Group_1__3 : rule__BitwiseXorExpression__Group_1__3__Impl ;
+    public final void rule__BitwiseXorExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52722:1: ( rule__BitwiseXorExpression__Group_1__3__Impl )
+            // InternalFormalML.g:52723:2: rule__BitwiseXorExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1__3__Impl"
+    // InternalFormalML.g:52729:1: rule__BitwiseXorExpression__Group_1__3__Impl : ( ( rule__BitwiseXorExpression__Group_1_3__0 )* ) ;
+    public final void rule__BitwiseXorExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52733:1: ( ( ( rule__BitwiseXorExpression__Group_1_3__0 )* ) )
+            // InternalFormalML.g:52734:1: ( ( rule__BitwiseXorExpression__Group_1_3__0 )* )
+            {
+            // InternalFormalML.g:52734:1: ( ( rule__BitwiseXorExpression__Group_1_3__0 )* )
+            // InternalFormalML.g:52735:2: ( rule__BitwiseXorExpression__Group_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalFormalML.g:52736:2: ( rule__BitwiseXorExpression__Group_1_3__0 )*
+            loop662:
+            do {
+                int alt662=2;
+                int LA662_0 = input.LA(1);
+
+                if ( (LA662_0==257) ) {
+                    alt662=1;
+                }
+
+
+                switch (alt662) {
+            	case 1 :
+            	    // InternalFormalML.g:52736:3: rule__BitwiseXorExpression__Group_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_237);
+            	    rule__BitwiseXorExpression__Group_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop662;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1_3__0"
+    // InternalFormalML.g:52745:1: rule__BitwiseXorExpression__Group_1_3__0 : rule__BitwiseXorExpression__Group_1_3__0__Impl rule__BitwiseXorExpression__Group_1_3__1 ;
+    public final void rule__BitwiseXorExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52749:1: ( rule__BitwiseXorExpression__Group_1_3__0__Impl rule__BitwiseXorExpression__Group_1_3__1 )
+            // InternalFormalML.g:52750:2: rule__BitwiseXorExpression__Group_1_3__0__Impl rule__BitwiseXorExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__BitwiseXorExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1_3__0__Impl"
+    // InternalFormalML.g:52757:1: rule__BitwiseXorExpression__Group_1_3__0__Impl : ( '^' ) ;
+    public final void rule__BitwiseXorExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52761:1: ( ( '^' ) )
+            // InternalFormalML.g:52762:1: ( '^' )
+            {
+            // InternalFormalML.g:52762:1: ( '^' )
+            // InternalFormalML.g:52763:2: '^'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getCircumflexAccentKeyword_1_3_0()); 
+            }
+            match(input,257,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getCircumflexAccentKeyword_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1_3__1"
+    // InternalFormalML.g:52772:1: rule__BitwiseXorExpression__Group_1_3__1 : rule__BitwiseXorExpression__Group_1_3__1__Impl ;
+    public final void rule__BitwiseXorExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52776:1: ( rule__BitwiseXorExpression__Group_1_3__1__Impl )
+            // InternalFormalML.g:52777:2: rule__BitwiseXorExpression__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__Group_1_3__1__Impl"
+    // InternalFormalML.g:52783:1: rule__BitwiseXorExpression__Group_1_3__1__Impl : ( ( rule__BitwiseXorExpression__OperandAssignment_1_3_1 ) ) ;
+    public final void rule__BitwiseXorExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52787:1: ( ( ( rule__BitwiseXorExpression__OperandAssignment_1_3_1 ) ) )
+            // InternalFormalML.g:52788:1: ( ( rule__BitwiseXorExpression__OperandAssignment_1_3_1 ) )
+            {
+            // InternalFormalML.g:52788:1: ( ( rule__BitwiseXorExpression__OperandAssignment_1_3_1 ) )
+            // InternalFormalML.g:52789:2: ( rule__BitwiseXorExpression__OperandAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+            // InternalFormalML.g:52790:2: ( rule__BitwiseXorExpression__OperandAssignment_1_3_1 )
+            // InternalFormalML.g:52790:3: rule__BitwiseXorExpression__OperandAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseXorExpression__OperandAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group__0"
+    // InternalFormalML.g:52799:1: rule__BitwiseAndExpression__Group__0 : rule__BitwiseAndExpression__Group__0__Impl rule__BitwiseAndExpression__Group__1 ;
+    public final void rule__BitwiseAndExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52803:1: ( rule__BitwiseAndExpression__Group__0__Impl rule__BitwiseAndExpression__Group__1 )
+            // InternalFormalML.g:52804:2: rule__BitwiseAndExpression__Group__0__Impl rule__BitwiseAndExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_196);
+            rule__BitwiseAndExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group__0"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group__0__Impl"
+    // InternalFormalML.g:52811:1: rule__BitwiseAndExpression__Group__0__Impl : ( ruleEqualityExpression ) ;
+    public final void rule__BitwiseAndExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52815:1: ( ( ruleEqualityExpression ) )
+            // InternalFormalML.g:52816:1: ( ruleEqualityExpression )
+            {
+            // InternalFormalML.g:52816:1: ( ruleEqualityExpression )
+            // InternalFormalML.g:52817:2: ruleEqualityExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getEqualityExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getEqualityExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group__1"
+    // InternalFormalML.g:52826:1: rule__BitwiseAndExpression__Group__1 : rule__BitwiseAndExpression__Group__1__Impl ;
+    public final void rule__BitwiseAndExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52830:1: ( rule__BitwiseAndExpression__Group__1__Impl )
+            // InternalFormalML.g:52831:2: rule__BitwiseAndExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group__1"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group__1__Impl"
+    // InternalFormalML.g:52837:1: rule__BitwiseAndExpression__Group__1__Impl : ( ( rule__BitwiseAndExpression__Group_1__0 )? ) ;
+    public final void rule__BitwiseAndExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52841:1: ( ( ( rule__BitwiseAndExpression__Group_1__0 )? ) )
+            // InternalFormalML.g:52842:1: ( ( rule__BitwiseAndExpression__Group_1__0 )? )
+            {
+            // InternalFormalML.g:52842:1: ( ( rule__BitwiseAndExpression__Group_1__0 )? )
+            // InternalFormalML.g:52843:2: ( rule__BitwiseAndExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:52844:2: ( rule__BitwiseAndExpression__Group_1__0 )?
+            int alt663=2;
+            int LA663_0 = input.LA(1);
+
+            if ( (LA663_0==242) ) {
+                alt663=1;
+            }
+            switch (alt663) {
+                case 1 :
+                    // InternalFormalML.g:52844:3: rule__BitwiseAndExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__BitwiseAndExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1__0"
+    // InternalFormalML.g:52853:1: rule__BitwiseAndExpression__Group_1__0 : rule__BitwiseAndExpression__Group_1__0__Impl rule__BitwiseAndExpression__Group_1__1 ;
+    public final void rule__BitwiseAndExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52857:1: ( rule__BitwiseAndExpression__Group_1__0__Impl rule__BitwiseAndExpression__Group_1__1 )
+            // InternalFormalML.g:52858:2: rule__BitwiseAndExpression__Group_1__0__Impl rule__BitwiseAndExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_196);
+            rule__BitwiseAndExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1__0__Impl"
+    // InternalFormalML.g:52865:1: rule__BitwiseAndExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__BitwiseAndExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52869:1: ( ( () ) )
+            // InternalFormalML.g:52870:1: ( () )
+            {
+            // InternalFormalML.g:52870:1: ( () )
+            // InternalFormalML.g:52871:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); 
+            }
+            // InternalFormalML.g:52872:2: ()
+            // InternalFormalML.g:52872:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1__1"
+    // InternalFormalML.g:52880:1: rule__BitwiseAndExpression__Group_1__1 : rule__BitwiseAndExpression__Group_1__1__Impl rule__BitwiseAndExpression__Group_1__2 ;
+    public final void rule__BitwiseAndExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52884:1: ( rule__BitwiseAndExpression__Group_1__1__Impl rule__BitwiseAndExpression__Group_1__2 )
+            // InternalFormalML.g:52885:2: rule__BitwiseAndExpression__Group_1__1__Impl rule__BitwiseAndExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__BitwiseAndExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1__1__Impl"
+    // InternalFormalML.g:52892:1: rule__BitwiseAndExpression__Group_1__1__Impl : ( ( rule__BitwiseAndExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__BitwiseAndExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52896:1: ( ( ( rule__BitwiseAndExpression__OperatorAssignment_1_1 ) ) )
+            // InternalFormalML.g:52897:1: ( ( rule__BitwiseAndExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:52897:1: ( ( rule__BitwiseAndExpression__OperatorAssignment_1_1 ) )
+            // InternalFormalML.g:52898:2: ( rule__BitwiseAndExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalFormalML.g:52899:2: ( rule__BitwiseAndExpression__OperatorAssignment_1_1 )
+            // InternalFormalML.g:52899:3: rule__BitwiseAndExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1__2"
+    // InternalFormalML.g:52907:1: rule__BitwiseAndExpression__Group_1__2 : rule__BitwiseAndExpression__Group_1__2__Impl rule__BitwiseAndExpression__Group_1__3 ;
+    public final void rule__BitwiseAndExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52911:1: ( rule__BitwiseAndExpression__Group_1__2__Impl rule__BitwiseAndExpression__Group_1__3 )
+            // InternalFormalML.g:52912:2: rule__BitwiseAndExpression__Group_1__2__Impl rule__BitwiseAndExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_196);
+            rule__BitwiseAndExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1__2__Impl"
+    // InternalFormalML.g:52919:1: rule__BitwiseAndExpression__Group_1__2__Impl : ( ( rule__BitwiseAndExpression__OperandAssignment_1_2 ) ) ;
+    public final void rule__BitwiseAndExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52923:1: ( ( ( rule__BitwiseAndExpression__OperandAssignment_1_2 ) ) )
+            // InternalFormalML.g:52924:1: ( ( rule__BitwiseAndExpression__OperandAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:52924:1: ( ( rule__BitwiseAndExpression__OperandAssignment_1_2 ) )
+            // InternalFormalML.g:52925:2: ( rule__BitwiseAndExpression__OperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_2()); 
+            }
+            // InternalFormalML.g:52926:2: ( rule__BitwiseAndExpression__OperandAssignment_1_2 )
+            // InternalFormalML.g:52926:3: rule__BitwiseAndExpression__OperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__OperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1__3"
+    // InternalFormalML.g:52934:1: rule__BitwiseAndExpression__Group_1__3 : rule__BitwiseAndExpression__Group_1__3__Impl ;
+    public final void rule__BitwiseAndExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52938:1: ( rule__BitwiseAndExpression__Group_1__3__Impl )
+            // InternalFormalML.g:52939:2: rule__BitwiseAndExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1__3__Impl"
+    // InternalFormalML.g:52945:1: rule__BitwiseAndExpression__Group_1__3__Impl : ( ( rule__BitwiseAndExpression__Group_1_3__0 )* ) ;
+    public final void rule__BitwiseAndExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52949:1: ( ( ( rule__BitwiseAndExpression__Group_1_3__0 )* ) )
+            // InternalFormalML.g:52950:1: ( ( rule__BitwiseAndExpression__Group_1_3__0 )* )
+            {
+            // InternalFormalML.g:52950:1: ( ( rule__BitwiseAndExpression__Group_1_3__0 )* )
+            // InternalFormalML.g:52951:2: ( rule__BitwiseAndExpression__Group_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalFormalML.g:52952:2: ( rule__BitwiseAndExpression__Group_1_3__0 )*
+            loop664:
+            do {
+                int alt664=2;
+                int LA664_0 = input.LA(1);
+
+                if ( (LA664_0==242) ) {
+                    alt664=1;
+                }
+
+
+                switch (alt664) {
+            	case 1 :
+            	    // InternalFormalML.g:52952:3: rule__BitwiseAndExpression__Group_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_238);
+            	    rule__BitwiseAndExpression__Group_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop664;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1_3__0"
+    // InternalFormalML.g:52961:1: rule__BitwiseAndExpression__Group_1_3__0 : rule__BitwiseAndExpression__Group_1_3__0__Impl rule__BitwiseAndExpression__Group_1_3__1 ;
+    public final void rule__BitwiseAndExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52965:1: ( rule__BitwiseAndExpression__Group_1_3__0__Impl rule__BitwiseAndExpression__Group_1_3__1 )
+            // InternalFormalML.g:52966:2: rule__BitwiseAndExpression__Group_1_3__0__Impl rule__BitwiseAndExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__BitwiseAndExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1_3__0__Impl"
+    // InternalFormalML.g:52973:1: rule__BitwiseAndExpression__Group_1_3__0__Impl : ( '&' ) ;
+    public final void rule__BitwiseAndExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52977:1: ( ( '&' ) )
+            // InternalFormalML.g:52978:1: ( '&' )
+            {
+            // InternalFormalML.g:52978:1: ( '&' )
+            // InternalFormalML.g:52979:2: '&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getAmpersandKeyword_1_3_0()); 
+            }
+            match(input,242,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getAmpersandKeyword_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1_3__1"
+    // InternalFormalML.g:52988:1: rule__BitwiseAndExpression__Group_1_3__1 : rule__BitwiseAndExpression__Group_1_3__1__Impl ;
+    public final void rule__BitwiseAndExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:52992:1: ( rule__BitwiseAndExpression__Group_1_3__1__Impl )
+            // InternalFormalML.g:52993:2: rule__BitwiseAndExpression__Group_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__Group_1_3__1__Impl"
+    // InternalFormalML.g:52999:1: rule__BitwiseAndExpression__Group_1_3__1__Impl : ( ( rule__BitwiseAndExpression__OperandAssignment_1_3_1 ) ) ;
+    public final void rule__BitwiseAndExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53003:1: ( ( ( rule__BitwiseAndExpression__OperandAssignment_1_3_1 ) ) )
+            // InternalFormalML.g:53004:1: ( ( rule__BitwiseAndExpression__OperandAssignment_1_3_1 ) )
+            {
+            // InternalFormalML.g:53004:1: ( ( rule__BitwiseAndExpression__OperandAssignment_1_3_1 ) )
+            // InternalFormalML.g:53005:2: ( rule__BitwiseAndExpression__OperandAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+            // InternalFormalML.g:53006:2: ( rule__BitwiseAndExpression__OperandAssignment_1_3_1 )
+            // InternalFormalML.g:53006:3: rule__BitwiseAndExpression__OperandAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseAndExpression__OperandAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getOperandAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group__0"
+    // InternalFormalML.g:53015:1: rule__EqualityExpression__Group__0 : rule__EqualityExpression__Group__0__Impl rule__EqualityExpression__Group__1 ;
+    public final void rule__EqualityExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53019:1: ( rule__EqualityExpression__Group__0__Impl rule__EqualityExpression__Group__1 )
+            // InternalFormalML.g:53020:2: rule__EqualityExpression__Group__0__Impl rule__EqualityExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_239);
+            rule__EqualityExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group__0"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group__0__Impl"
+    // InternalFormalML.g:53027:1: rule__EqualityExpression__Group__0__Impl : ( ruleRelationalExpression ) ;
+    public final void rule__EqualityExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53031:1: ( ( ruleRelationalExpression ) )
+            // InternalFormalML.g:53032:1: ( ruleRelationalExpression )
+            {
+            // InternalFormalML.g:53032:1: ( ruleRelationalExpression )
+            // InternalFormalML.g:53033:2: ruleRelationalExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group__1"
+    // InternalFormalML.g:53042:1: rule__EqualityExpression__Group__1 : rule__EqualityExpression__Group__1__Impl ;
+    public final void rule__EqualityExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53046:1: ( rule__EqualityExpression__Group__1__Impl )
+            // InternalFormalML.g:53047:2: rule__EqualityExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group__1"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group__1__Impl"
+    // InternalFormalML.g:53053:1: rule__EqualityExpression__Group__1__Impl : ( ( rule__EqualityExpression__Group_1__0 )? ) ;
+    public final void rule__EqualityExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53057:1: ( ( ( rule__EqualityExpression__Group_1__0 )? ) )
+            // InternalFormalML.g:53058:1: ( ( rule__EqualityExpression__Group_1__0 )? )
+            {
+            // InternalFormalML.g:53058:1: ( ( rule__EqualityExpression__Group_1__0 )? )
+            // InternalFormalML.g:53059:2: ( rule__EqualityExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:53060:2: ( rule__EqualityExpression__Group_1__0 )?
+            int alt665=2;
+            int LA665_0 = input.LA(1);
+
+            if ( ((LA665_0>=120 && LA665_0<=124)) ) {
+                alt665=1;
+            }
+            switch (alt665) {
+                case 1 :
+                    // InternalFormalML.g:53060:3: rule__EqualityExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__EqualityExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__0"
+    // InternalFormalML.g:53069:1: rule__EqualityExpression__Group_1__0 : rule__EqualityExpression__Group_1__0__Impl rule__EqualityExpression__Group_1__1 ;
+    public final void rule__EqualityExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53073:1: ( rule__EqualityExpression__Group_1__0__Impl rule__EqualityExpression__Group_1__1 )
+            // InternalFormalML.g:53074:2: rule__EqualityExpression__Group_1__0__Impl rule__EqualityExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_239);
+            rule__EqualityExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__0__Impl"
+    // InternalFormalML.g:53081:1: rule__EqualityExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__EqualityExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53085:1: ( ( () ) )
+            // InternalFormalML.g:53086:1: ( () )
+            {
+            // InternalFormalML.g:53086:1: ( () )
+            // InternalFormalML.g:53087:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0()); 
+            }
+            // InternalFormalML.g:53088:2: ()
+            // InternalFormalML.g:53088:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__1"
+    // InternalFormalML.g:53096:1: rule__EqualityExpression__Group_1__1 : rule__EqualityExpression__Group_1__1__Impl rule__EqualityExpression__Group_1__2 ;
+    public final void rule__EqualityExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53100:1: ( rule__EqualityExpression__Group_1__1__Impl rule__EqualityExpression__Group_1__2 )
+            // InternalFormalML.g:53101:2: rule__EqualityExpression__Group_1__1__Impl rule__EqualityExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__EqualityExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__1__Impl"
+    // InternalFormalML.g:53108:1: rule__EqualityExpression__Group_1__1__Impl : ( ( rule__EqualityExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__EqualityExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53112:1: ( ( ( rule__EqualityExpression__OperatorAssignment_1_1 ) ) )
+            // InternalFormalML.g:53113:1: ( ( rule__EqualityExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:53113:1: ( ( rule__EqualityExpression__OperatorAssignment_1_1 ) )
+            // InternalFormalML.g:53114:2: ( rule__EqualityExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalFormalML.g:53115:2: ( rule__EqualityExpression__OperatorAssignment_1_1 )
+            // InternalFormalML.g:53115:3: rule__EqualityExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__2"
+    // InternalFormalML.g:53123:1: rule__EqualityExpression__Group_1__2 : rule__EqualityExpression__Group_1__2__Impl ;
+    public final void rule__EqualityExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53127:1: ( rule__EqualityExpression__Group_1__2__Impl )
+            // InternalFormalML.g:53128:2: rule__EqualityExpression__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__EqualityExpression__Group_1__2__Impl"
+    // InternalFormalML.g:53134:1: rule__EqualityExpression__Group_1__2__Impl : ( ( rule__EqualityExpression__RigthOperandAssignment_1_2 ) ) ;
+    public final void rule__EqualityExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53138:1: ( ( ( rule__EqualityExpression__RigthOperandAssignment_1_2 ) ) )
+            // InternalFormalML.g:53139:1: ( ( rule__EqualityExpression__RigthOperandAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:53139:1: ( ( rule__EqualityExpression__RigthOperandAssignment_1_2 ) )
+            // InternalFormalML.g:53140:2: ( rule__EqualityExpression__RigthOperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getRigthOperandAssignment_1_2()); 
+            }
+            // InternalFormalML.g:53141:2: ( rule__EqualityExpression__RigthOperandAssignment_1_2 )
+            // InternalFormalML.g:53141:3: rule__EqualityExpression__RigthOperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__EqualityExpression__RigthOperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getRigthOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group__0"
+    // InternalFormalML.g:53150:1: rule__RelationalExpression__Group__0 : rule__RelationalExpression__Group__0__Impl rule__RelationalExpression__Group__1 ;
+    public final void rule__RelationalExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53154:1: ( rule__RelationalExpression__Group__0__Impl rule__RelationalExpression__Group__1 )
+            // InternalFormalML.g:53155:2: rule__RelationalExpression__Group__0__Impl rule__RelationalExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_240);
+            rule__RelationalExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group__0"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group__0__Impl"
+    // InternalFormalML.g:53162:1: rule__RelationalExpression__Group__0__Impl : ( ruleAdditiveExpression ) ;
+    public final void rule__RelationalExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53166:1: ( ( ruleAdditiveExpression ) )
+            // InternalFormalML.g:53167:1: ( ruleAdditiveExpression )
+            {
+            // InternalFormalML.g:53167:1: ( ruleAdditiveExpression )
+            // InternalFormalML.g:53168:2: ruleAdditiveExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group__1"
+    // InternalFormalML.g:53177:1: rule__RelationalExpression__Group__1 : rule__RelationalExpression__Group__1__Impl ;
+    public final void rule__RelationalExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53181:1: ( rule__RelationalExpression__Group__1__Impl )
+            // InternalFormalML.g:53182:2: rule__RelationalExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group__1"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group__1__Impl"
+    // InternalFormalML.g:53188:1: rule__RelationalExpression__Group__1__Impl : ( ( rule__RelationalExpression__Group_1__0 )? ) ;
+    public final void rule__RelationalExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53192:1: ( ( ( rule__RelationalExpression__Group_1__0 )? ) )
+            // InternalFormalML.g:53193:1: ( ( rule__RelationalExpression__Group_1__0 )? )
+            {
+            // InternalFormalML.g:53193:1: ( ( rule__RelationalExpression__Group_1__0 )? )
+            // InternalFormalML.g:53194:2: ( rule__RelationalExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:53195:2: ( rule__RelationalExpression__Group_1__0 )?
+            int alt666=2;
+            alt666 = dfa666.predict(input);
+            switch (alt666) {
+                case 1 :
+                    // InternalFormalML.g:53195:3: rule__RelationalExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__RelationalExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__0"
+    // InternalFormalML.g:53204:1: rule__RelationalExpression__Group_1__0 : rule__RelationalExpression__Group_1__0__Impl rule__RelationalExpression__Group_1__1 ;
+    public final void rule__RelationalExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53208:1: ( rule__RelationalExpression__Group_1__0__Impl rule__RelationalExpression__Group_1__1 )
+            // InternalFormalML.g:53209:2: rule__RelationalExpression__Group_1__0__Impl rule__RelationalExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_240);
+            rule__RelationalExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__0__Impl"
+    // InternalFormalML.g:53216:1: rule__RelationalExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__RelationalExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53220:1: ( ( () ) )
+            // InternalFormalML.g:53221:1: ( () )
+            {
+            // InternalFormalML.g:53221:1: ( () )
+            // InternalFormalML.g:53222:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0()); 
+            }
+            // InternalFormalML.g:53223:2: ()
+            // InternalFormalML.g:53223:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__1"
+    // InternalFormalML.g:53231:1: rule__RelationalExpression__Group_1__1 : rule__RelationalExpression__Group_1__1__Impl rule__RelationalExpression__Group_1__2 ;
+    public final void rule__RelationalExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53235:1: ( rule__RelationalExpression__Group_1__1__Impl rule__RelationalExpression__Group_1__2 )
+            // InternalFormalML.g:53236:2: rule__RelationalExpression__Group_1__1__Impl rule__RelationalExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__RelationalExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__1__Impl"
+    // InternalFormalML.g:53243:1: rule__RelationalExpression__Group_1__1__Impl : ( ( rule__RelationalExpression__OperatorAssignment_1_1 ) ) ;
+    public final void rule__RelationalExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53247:1: ( ( ( rule__RelationalExpression__OperatorAssignment_1_1 ) ) )
+            // InternalFormalML.g:53248:1: ( ( rule__RelationalExpression__OperatorAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:53248:1: ( ( rule__RelationalExpression__OperatorAssignment_1_1 ) )
+            // InternalFormalML.g:53249:2: ( rule__RelationalExpression__OperatorAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+            // InternalFormalML.g:53250:2: ( rule__RelationalExpression__OperatorAssignment_1_1 )
+            // InternalFormalML.g:53250:3: rule__RelationalExpression__OperatorAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__OperatorAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getOperatorAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__2"
+    // InternalFormalML.g:53258:1: rule__RelationalExpression__Group_1__2 : rule__RelationalExpression__Group_1__2__Impl rule__RelationalExpression__Group_1__3 ;
+    public final void rule__RelationalExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53262:1: ( rule__RelationalExpression__Group_1__2__Impl rule__RelationalExpression__Group_1__3 )
+            // InternalFormalML.g:53263:2: rule__RelationalExpression__Group_1__2__Impl rule__RelationalExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_240);
+            rule__RelationalExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__2__Impl"
+    // InternalFormalML.g:53270:1: rule__RelationalExpression__Group_1__2__Impl : ( ( rule__RelationalExpression__RigthOperandAssignment_1_2 ) ) ;
+    public final void rule__RelationalExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53274:1: ( ( ( rule__RelationalExpression__RigthOperandAssignment_1_2 ) ) )
+            // InternalFormalML.g:53275:1: ( ( rule__RelationalExpression__RigthOperandAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:53275:1: ( ( rule__RelationalExpression__RigthOperandAssignment_1_2 ) )
+            // InternalFormalML.g:53276:2: ( rule__RelationalExpression__RigthOperandAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_2()); 
+            }
+            // InternalFormalML.g:53277:2: ( rule__RelationalExpression__RigthOperandAssignment_1_2 )
+            // InternalFormalML.g:53277:3: rule__RelationalExpression__RigthOperandAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__RigthOperandAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__3"
+    // InternalFormalML.g:53285:1: rule__RelationalExpression__Group_1__3 : rule__RelationalExpression__Group_1__3__Impl ;
+    public final void rule__RelationalExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53289:1: ( rule__RelationalExpression__Group_1__3__Impl )
+            // InternalFormalML.g:53290:2: rule__RelationalExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1__3__Impl"
+    // InternalFormalML.g:53296:1: rule__RelationalExpression__Group_1__3__Impl : ( ( rule__RelationalExpression__Group_1_3__0 )? ) ;
+    public final void rule__RelationalExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53300:1: ( ( ( rule__RelationalExpression__Group_1_3__0 )? ) )
+            // InternalFormalML.g:53301:1: ( ( rule__RelationalExpression__Group_1_3__0 )? )
+            {
+            // InternalFormalML.g:53301:1: ( ( rule__RelationalExpression__Group_1_3__0 )? )
+            // InternalFormalML.g:53302:2: ( rule__RelationalExpression__Group_1_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalFormalML.g:53303:2: ( rule__RelationalExpression__Group_1_3__0 )?
+            int alt667=2;
+            alt667 = dfa667.predict(input);
+            switch (alt667) {
+                case 1 :
+                    // InternalFormalML.g:53303:3: rule__RelationalExpression__Group_1_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__RelationalExpression__Group_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1_3__0"
+    // InternalFormalML.g:53312:1: rule__RelationalExpression__Group_1_3__0 : rule__RelationalExpression__Group_1_3__0__Impl rule__RelationalExpression__Group_1_3__1 ;
+    public final void rule__RelationalExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53316:1: ( rule__RelationalExpression__Group_1_3__0__Impl rule__RelationalExpression__Group_1_3__1 )
+            // InternalFormalML.g:53317:2: rule__RelationalExpression__Group_1_3__0__Impl rule__RelationalExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_240);
+            rule__RelationalExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1_3__0__Impl"
+    // InternalFormalML.g:53324:1: rule__RelationalExpression__Group_1_3__0__Impl : ( () ) ;
+    public final void rule__RelationalExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53328:1: ( ( () ) )
+            // InternalFormalML.g:53329:1: ( () )
+            {
+            // InternalFormalML.g:53329:1: ( () )
+            // InternalFormalML.g:53330:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getRelationalTernaryExpressionLeftRelationAction_1_3_0()); 
+            }
+            // InternalFormalML.g:53331:2: ()
+            // InternalFormalML.g:53331:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getRelationalTernaryExpressionLeftRelationAction_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1_3__1"
+    // InternalFormalML.g:53339:1: rule__RelationalExpression__Group_1_3__1 : rule__RelationalExpression__Group_1_3__1__Impl rule__RelationalExpression__Group_1_3__2 ;
+    public final void rule__RelationalExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53343:1: ( rule__RelationalExpression__Group_1_3__1__Impl rule__RelationalExpression__Group_1_3__2 )
+            // InternalFormalML.g:53344:2: rule__RelationalExpression__Group_1_3__1__Impl rule__RelationalExpression__Group_1_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__RelationalExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1_3__1__Impl"
+    // InternalFormalML.g:53351:1: rule__RelationalExpression__Group_1_3__1__Impl : ( ( rule__RelationalExpression__RigthOperatorAssignment_1_3_1 ) ) ;
+    public final void rule__RelationalExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53355:1: ( ( ( rule__RelationalExpression__RigthOperatorAssignment_1_3_1 ) ) )
+            // InternalFormalML.g:53356:1: ( ( rule__RelationalExpression__RigthOperatorAssignment_1_3_1 ) )
+            {
+            // InternalFormalML.g:53356:1: ( ( rule__RelationalExpression__RigthOperatorAssignment_1_3_1 ) )
+            // InternalFormalML.g:53357:2: ( rule__RelationalExpression__RigthOperatorAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getRigthOperatorAssignment_1_3_1()); 
+            }
+            // InternalFormalML.g:53358:2: ( rule__RelationalExpression__RigthOperatorAssignment_1_3_1 )
+            // InternalFormalML.g:53358:3: rule__RelationalExpression__RigthOperatorAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__RigthOperatorAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getRigthOperatorAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1_3__2"
+    // InternalFormalML.g:53366:1: rule__RelationalExpression__Group_1_3__2 : rule__RelationalExpression__Group_1_3__2__Impl ;
+    public final void rule__RelationalExpression__Group_1_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53370:1: ( rule__RelationalExpression__Group_1_3__2__Impl )
+            // InternalFormalML.g:53371:2: rule__RelationalExpression__Group_1_3__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__Group_1_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1_3__2"
+
+
+    // $ANTLR start "rule__RelationalExpression__Group_1_3__2__Impl"
+    // InternalFormalML.g:53377:1: rule__RelationalExpression__Group_1_3__2__Impl : ( ( rule__RelationalExpression__RigthOperandAssignment_1_3_2 ) ) ;
+    public final void rule__RelationalExpression__Group_1_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53381:1: ( ( ( rule__RelationalExpression__RigthOperandAssignment_1_3_2 ) ) )
+            // InternalFormalML.g:53382:1: ( ( rule__RelationalExpression__RigthOperandAssignment_1_3_2 ) )
+            {
+            // InternalFormalML.g:53382:1: ( ( rule__RelationalExpression__RigthOperandAssignment_1_3_2 ) )
+            // InternalFormalML.g:53383:2: ( rule__RelationalExpression__RigthOperandAssignment_1_3_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_3_2()); 
+            }
+            // InternalFormalML.g:53384:2: ( rule__RelationalExpression__RigthOperandAssignment_1_3_2 )
+            // InternalFormalML.g:53384:3: rule__RelationalExpression__RigthOperandAssignment_1_3_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__RelationalExpression__RigthOperandAssignment_1_3_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getRigthOperandAssignment_1_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__Group_1_3__2__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group__0"
+    // InternalFormalML.g:53393:1: rule__AdditiveExpression__Group__0 : rule__AdditiveExpression__Group__0__Impl rule__AdditiveExpression__Group__1 ;
+    public final void rule__AdditiveExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53397:1: ( rule__AdditiveExpression__Group__0__Impl rule__AdditiveExpression__Group__1 )
+            // InternalFormalML.g:53398:2: rule__AdditiveExpression__Group__0__Impl rule__AdditiveExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_241);
+            rule__AdditiveExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group__0"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group__0__Impl"
+    // InternalFormalML.g:53405:1: rule__AdditiveExpression__Group__0__Impl : ( ruleMultiplicativeExpression ) ;
+    public final void rule__AdditiveExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53409:1: ( ( ruleMultiplicativeExpression ) )
+            // InternalFormalML.g:53410:1: ( ruleMultiplicativeExpression )
+            {
+            // InternalFormalML.g:53410:1: ( ruleMultiplicativeExpression )
+            // InternalFormalML.g:53411:2: ruleMultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group__1"
+    // InternalFormalML.g:53420:1: rule__AdditiveExpression__Group__1 : rule__AdditiveExpression__Group__1__Impl ;
+    public final void rule__AdditiveExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53424:1: ( rule__AdditiveExpression__Group__1__Impl )
+            // InternalFormalML.g:53425:2: rule__AdditiveExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group__1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group__1__Impl"
+    // InternalFormalML.g:53431:1: rule__AdditiveExpression__Group__1__Impl : ( ( rule__AdditiveExpression__Alternatives_1 )* ) ;
+    public final void rule__AdditiveExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53435:1: ( ( ( rule__AdditiveExpression__Alternatives_1 )* ) )
+            // InternalFormalML.g:53436:1: ( ( rule__AdditiveExpression__Alternatives_1 )* )
+            {
+            // InternalFormalML.g:53436:1: ( ( rule__AdditiveExpression__Alternatives_1 )* )
+            // InternalFormalML.g:53437:2: ( rule__AdditiveExpression__Alternatives_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:53438:2: ( rule__AdditiveExpression__Alternatives_1 )*
+            loop668:
+            do {
+                int alt668=2;
+                alt668 = dfa668.predict(input);
+                switch (alt668) {
+            	case 1 :
+            	    // InternalFormalML.g:53438:3: rule__AdditiveExpression__Alternatives_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_242);
+            	    rule__AdditiveExpression__Alternatives_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop668;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0__0"
+    // InternalFormalML.g:53447:1: rule__AdditiveExpression__Group_1_0__0 : rule__AdditiveExpression__Group_1_0__0__Impl rule__AdditiveExpression__Group_1_0__1 ;
+    public final void rule__AdditiveExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53451:1: ( rule__AdditiveExpression__Group_1_0__0__Impl rule__AdditiveExpression__Group_1_0__1 )
+            // InternalFormalML.g:53452:2: rule__AdditiveExpression__Group_1_0__0__Impl rule__AdditiveExpression__Group_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_243);
+            rule__AdditiveExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0__0__Impl"
+    // InternalFormalML.g:53459:1: rule__AdditiveExpression__Group_1_0__0__Impl : ( () ) ;
+    public final void rule__AdditiveExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53463:1: ( ( () ) )
+            // InternalFormalML.g:53464:1: ( () )
+            {
+            // InternalFormalML.g:53464:1: ( () )
+            // InternalFormalML.g:53465:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()); 
+            }
+            // InternalFormalML.g:53466:2: ()
+            // InternalFormalML.g:53466:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0__1"
+    // InternalFormalML.g:53474:1: rule__AdditiveExpression__Group_1_0__1 : rule__AdditiveExpression__Group_1_0__1__Impl rule__AdditiveExpression__Group_1_0__2 ;
+    public final void rule__AdditiveExpression__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53478:1: ( rule__AdditiveExpression__Group_1_0__1__Impl rule__AdditiveExpression__Group_1_0__2 )
+            // InternalFormalML.g:53479:2: rule__AdditiveExpression__Group_1_0__1__Impl rule__AdditiveExpression__Group_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__AdditiveExpression__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0__1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0__1__Impl"
+    // InternalFormalML.g:53486:1: rule__AdditiveExpression__Group_1_0__1__Impl : ( ( rule__AdditiveExpression__OperatorAssignment_1_0_1 ) ) ;
+    public final void rule__AdditiveExpression__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53490:1: ( ( ( rule__AdditiveExpression__OperatorAssignment_1_0_1 ) ) )
+            // InternalFormalML.g:53491:1: ( ( rule__AdditiveExpression__OperatorAssignment_1_0_1 ) )
+            {
+            // InternalFormalML.g:53491:1: ( ( rule__AdditiveExpression__OperatorAssignment_1_0_1 ) )
+            // InternalFormalML.g:53492:2: ( rule__AdditiveExpression__OperatorAssignment_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_0_1()); 
+            }
+            // InternalFormalML.g:53493:2: ( rule__AdditiveExpression__OperatorAssignment_1_0_1 )
+            // InternalFormalML.g:53493:3: rule__AdditiveExpression__OperatorAssignment_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__OperatorAssignment_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0__2"
+    // InternalFormalML.g:53501:1: rule__AdditiveExpression__Group_1_0__2 : rule__AdditiveExpression__Group_1_0__2__Impl rule__AdditiveExpression__Group_1_0__3 ;
+    public final void rule__AdditiveExpression__Group_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53505:1: ( rule__AdditiveExpression__Group_1_0__2__Impl rule__AdditiveExpression__Group_1_0__3 )
+            // InternalFormalML.g:53506:2: rule__AdditiveExpression__Group_1_0__2__Impl rule__AdditiveExpression__Group_1_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_243);
+            rule__AdditiveExpression__Group_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0__2"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0__2__Impl"
+    // InternalFormalML.g:53513:1: rule__AdditiveExpression__Group_1_0__2__Impl : ( ( rule__AdditiveExpression__OperandAssignment_1_0_2 ) ) ;
+    public final void rule__AdditiveExpression__Group_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53517:1: ( ( ( rule__AdditiveExpression__OperandAssignment_1_0_2 ) ) )
+            // InternalFormalML.g:53518:1: ( ( rule__AdditiveExpression__OperandAssignment_1_0_2 ) )
+            {
+            // InternalFormalML.g:53518:1: ( ( rule__AdditiveExpression__OperandAssignment_1_0_2 ) )
+            // InternalFormalML.g:53519:2: ( rule__AdditiveExpression__OperandAssignment_1_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_2()); 
+            }
+            // InternalFormalML.g:53520:2: ( rule__AdditiveExpression__OperandAssignment_1_0_2 )
+            // InternalFormalML.g:53520:3: rule__AdditiveExpression__OperandAssignment_1_0_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__OperandAssignment_1_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0__3"
+    // InternalFormalML.g:53528:1: rule__AdditiveExpression__Group_1_0__3 : rule__AdditiveExpression__Group_1_0__3__Impl ;
+    public final void rule__AdditiveExpression__Group_1_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53532:1: ( rule__AdditiveExpression__Group_1_0__3__Impl )
+            // InternalFormalML.g:53533:2: rule__AdditiveExpression__Group_1_0__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0__3"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0__3__Impl"
+    // InternalFormalML.g:53539:1: rule__AdditiveExpression__Group_1_0__3__Impl : ( ( rule__AdditiveExpression__Group_1_0_3__0 )* ) ;
+    public final void rule__AdditiveExpression__Group_1_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53543:1: ( ( ( rule__AdditiveExpression__Group_1_0_3__0 )* ) )
+            // InternalFormalML.g:53544:1: ( ( rule__AdditiveExpression__Group_1_0_3__0 )* )
+            {
+            // InternalFormalML.g:53544:1: ( ( rule__AdditiveExpression__Group_1_0_3__0 )* )
+            // InternalFormalML.g:53545:2: ( rule__AdditiveExpression__Group_1_0_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0_3()); 
+            }
+            // InternalFormalML.g:53546:2: ( rule__AdditiveExpression__Group_1_0_3__0 )*
+            loop669:
+            do {
+                int alt669=2;
+                alt669 = dfa669.predict(input);
+                switch (alt669) {
+            	case 1 :
+            	    // InternalFormalML.g:53546:3: rule__AdditiveExpression__Group_1_0_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_244);
+            	    rule__AdditiveExpression__Group_1_0_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop669;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0__3__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0_3__0"
+    // InternalFormalML.g:53555:1: rule__AdditiveExpression__Group_1_0_3__0 : rule__AdditiveExpression__Group_1_0_3__0__Impl rule__AdditiveExpression__Group_1_0_3__1 ;
+    public final void rule__AdditiveExpression__Group_1_0_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53559:1: ( rule__AdditiveExpression__Group_1_0_3__0__Impl rule__AdditiveExpression__Group_1_0_3__1 )
+            // InternalFormalML.g:53560:2: rule__AdditiveExpression__Group_1_0_3__0__Impl rule__AdditiveExpression__Group_1_0_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__AdditiveExpression__Group_1_0_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_0_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0_3__0"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0_3__0__Impl"
+    // InternalFormalML.g:53567:1: rule__AdditiveExpression__Group_1_0_3__0__Impl : ( '+' ) ;
+    public final void rule__AdditiveExpression__Group_1_0_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53571:1: ( ( '+' ) )
+            // InternalFormalML.g:53572:1: ( '+' )
+            {
+            // InternalFormalML.g:53572:1: ( '+' )
+            // InternalFormalML.g:53573:2: '+'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_0_3_0()); 
+            }
+            match(input,131,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0_3__0__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0_3__1"
+    // InternalFormalML.g:53582:1: rule__AdditiveExpression__Group_1_0_3__1 : rule__AdditiveExpression__Group_1_0_3__1__Impl ;
+    public final void rule__AdditiveExpression__Group_1_0_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53586:1: ( rule__AdditiveExpression__Group_1_0_3__1__Impl )
+            // InternalFormalML.g:53587:2: rule__AdditiveExpression__Group_1_0_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_0_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0_3__1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_0_3__1__Impl"
+    // InternalFormalML.g:53593:1: rule__AdditiveExpression__Group_1_0_3__1__Impl : ( ( rule__AdditiveExpression__OperandAssignment_1_0_3_1 ) ) ;
+    public final void rule__AdditiveExpression__Group_1_0_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53597:1: ( ( ( rule__AdditiveExpression__OperandAssignment_1_0_3_1 ) ) )
+            // InternalFormalML.g:53598:1: ( ( rule__AdditiveExpression__OperandAssignment_1_0_3_1 ) )
+            {
+            // InternalFormalML.g:53598:1: ( ( rule__AdditiveExpression__OperandAssignment_1_0_3_1 ) )
+            // InternalFormalML.g:53599:2: ( rule__AdditiveExpression__OperandAssignment_1_0_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_3_1()); 
+            }
+            // InternalFormalML.g:53600:2: ( rule__AdditiveExpression__OperandAssignment_1_0_3_1 )
+            // InternalFormalML.g:53600:3: rule__AdditiveExpression__OperandAssignment_1_0_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__OperandAssignment_1_0_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_0_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_0_3__1__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1__0"
+    // InternalFormalML.g:53609:1: rule__AdditiveExpression__Group_1_1__0 : rule__AdditiveExpression__Group_1_1__0__Impl rule__AdditiveExpression__Group_1_1__1 ;
+    public final void rule__AdditiveExpression__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53613:1: ( rule__AdditiveExpression__Group_1_1__0__Impl rule__AdditiveExpression__Group_1_1__1 )
+            // InternalFormalML.g:53614:2: rule__AdditiveExpression__Group_1_1__0__Impl rule__AdditiveExpression__Group_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_241);
+            rule__AdditiveExpression__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1__0"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1__0__Impl"
+    // InternalFormalML.g:53621:1: rule__AdditiveExpression__Group_1_1__0__Impl : ( () ) ;
+    public final void rule__AdditiveExpression__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53625:1: ( ( () ) )
+            // InternalFormalML.g:53626:1: ( () )
+            {
+            // InternalFormalML.g:53626:1: ( () )
+            // InternalFormalML.g:53627:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()); 
+            }
+            // InternalFormalML.g:53628:2: ()
+            // InternalFormalML.g:53628:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1__1"
+    // InternalFormalML.g:53636:1: rule__AdditiveExpression__Group_1_1__1 : rule__AdditiveExpression__Group_1_1__1__Impl rule__AdditiveExpression__Group_1_1__2 ;
+    public final void rule__AdditiveExpression__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53640:1: ( rule__AdditiveExpression__Group_1_1__1__Impl rule__AdditiveExpression__Group_1_1__2 )
+            // InternalFormalML.g:53641:2: rule__AdditiveExpression__Group_1_1__1__Impl rule__AdditiveExpression__Group_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__AdditiveExpression__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1__1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1__1__Impl"
+    // InternalFormalML.g:53648:1: rule__AdditiveExpression__Group_1_1__1__Impl : ( ( rule__AdditiveExpression__OperatorAssignment_1_1_1 ) ) ;
+    public final void rule__AdditiveExpression__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53652:1: ( ( ( rule__AdditiveExpression__OperatorAssignment_1_1_1 ) ) )
+            // InternalFormalML.g:53653:1: ( ( rule__AdditiveExpression__OperatorAssignment_1_1_1 ) )
+            {
+            // InternalFormalML.g:53653:1: ( ( rule__AdditiveExpression__OperatorAssignment_1_1_1 ) )
+            // InternalFormalML.g:53654:2: ( rule__AdditiveExpression__OperatorAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1_1()); 
+            }
+            // InternalFormalML.g:53655:2: ( rule__AdditiveExpression__OperatorAssignment_1_1_1 )
+            // InternalFormalML.g:53655:3: rule__AdditiveExpression__OperatorAssignment_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__OperatorAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperatorAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1__2"
+    // InternalFormalML.g:53663:1: rule__AdditiveExpression__Group_1_1__2 : rule__AdditiveExpression__Group_1_1__2__Impl rule__AdditiveExpression__Group_1_1__3 ;
+    public final void rule__AdditiveExpression__Group_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53667:1: ( rule__AdditiveExpression__Group_1_1__2__Impl rule__AdditiveExpression__Group_1_1__3 )
+            // InternalFormalML.g:53668:2: rule__AdditiveExpression__Group_1_1__2__Impl rule__AdditiveExpression__Group_1_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_245);
+            rule__AdditiveExpression__Group_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1__2"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1__2__Impl"
+    // InternalFormalML.g:53675:1: rule__AdditiveExpression__Group_1_1__2__Impl : ( ( rule__AdditiveExpression__OperandAssignment_1_1_2 ) ) ;
+    public final void rule__AdditiveExpression__Group_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53679:1: ( ( ( rule__AdditiveExpression__OperandAssignment_1_1_2 ) ) )
+            // InternalFormalML.g:53680:1: ( ( rule__AdditiveExpression__OperandAssignment_1_1_2 ) )
+            {
+            // InternalFormalML.g:53680:1: ( ( rule__AdditiveExpression__OperandAssignment_1_1_2 ) )
+            // InternalFormalML.g:53681:2: ( rule__AdditiveExpression__OperandAssignment_1_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_2()); 
+            }
+            // InternalFormalML.g:53682:2: ( rule__AdditiveExpression__OperandAssignment_1_1_2 )
+            // InternalFormalML.g:53682:3: rule__AdditiveExpression__OperandAssignment_1_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__OperandAssignment_1_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1__3"
+    // InternalFormalML.g:53690:1: rule__AdditiveExpression__Group_1_1__3 : rule__AdditiveExpression__Group_1_1__3__Impl ;
+    public final void rule__AdditiveExpression__Group_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53694:1: ( rule__AdditiveExpression__Group_1_1__3__Impl )
+            // InternalFormalML.g:53695:2: rule__AdditiveExpression__Group_1_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1__3"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1__3__Impl"
+    // InternalFormalML.g:53701:1: rule__AdditiveExpression__Group_1_1__3__Impl : ( ( rule__AdditiveExpression__Group_1_1_3__0 )* ) ;
+    public final void rule__AdditiveExpression__Group_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53705:1: ( ( ( rule__AdditiveExpression__Group_1_1_3__0 )* ) )
+            // InternalFormalML.g:53706:1: ( ( rule__AdditiveExpression__Group_1_1_3__0 )* )
+            {
+            // InternalFormalML.g:53706:1: ( ( rule__AdditiveExpression__Group_1_1_3__0 )* )
+            // InternalFormalML.g:53707:2: ( rule__AdditiveExpression__Group_1_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1_3()); 
+            }
+            // InternalFormalML.g:53708:2: ( rule__AdditiveExpression__Group_1_1_3__0 )*
+            loop670:
+            do {
+                int alt670=2;
+                alt670 = dfa670.predict(input);
+                switch (alt670) {
+            	case 1 :
+            	    // InternalFormalML.g:53708:3: rule__AdditiveExpression__Group_1_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_246);
+            	    rule__AdditiveExpression__Group_1_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop670;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getGroup_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1_3__0"
+    // InternalFormalML.g:53717:1: rule__AdditiveExpression__Group_1_1_3__0 : rule__AdditiveExpression__Group_1_1_3__0__Impl rule__AdditiveExpression__Group_1_1_3__1 ;
+    public final void rule__AdditiveExpression__Group_1_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53721:1: ( rule__AdditiveExpression__Group_1_1_3__0__Impl rule__AdditiveExpression__Group_1_1_3__1 )
+            // InternalFormalML.g:53722:2: rule__AdditiveExpression__Group_1_1_3__0__Impl rule__AdditiveExpression__Group_1_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__AdditiveExpression__Group_1_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1_3__0"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1_3__0__Impl"
+    // InternalFormalML.g:53729:1: rule__AdditiveExpression__Group_1_1_3__0__Impl : ( '-' ) ;
+    public final void rule__AdditiveExpression__Group_1_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53733:1: ( ( '-' ) )
+            // InternalFormalML.g:53734:1: ( '-' )
+            {
+            // InternalFormalML.g:53734:1: ( '-' )
+            // InternalFormalML.g:53735:2: '-'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getHyphenMinusKeyword_1_1_3_0()); 
+            }
+            match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getHyphenMinusKeyword_1_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1_3__1"
+    // InternalFormalML.g:53744:1: rule__AdditiveExpression__Group_1_1_3__1 : rule__AdditiveExpression__Group_1_1_3__1__Impl ;
+    public final void rule__AdditiveExpression__Group_1_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53748:1: ( rule__AdditiveExpression__Group_1_1_3__1__Impl )
+            // InternalFormalML.g:53749:2: rule__AdditiveExpression__Group_1_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__Group_1_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1_3__1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__Group_1_1_3__1__Impl"
+    // InternalFormalML.g:53755:1: rule__AdditiveExpression__Group_1_1_3__1__Impl : ( ( rule__AdditiveExpression__OperandAssignment_1_1_3_1 ) ) ;
+    public final void rule__AdditiveExpression__Group_1_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53759:1: ( ( ( rule__AdditiveExpression__OperandAssignment_1_1_3_1 ) ) )
+            // InternalFormalML.g:53760:1: ( ( rule__AdditiveExpression__OperandAssignment_1_1_3_1 ) )
+            {
+            // InternalFormalML.g:53760:1: ( ( rule__AdditiveExpression__OperandAssignment_1_1_3_1 ) )
+            // InternalFormalML.g:53761:2: ( rule__AdditiveExpression__OperandAssignment_1_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_3_1()); 
+            }
+            // InternalFormalML.g:53762:2: ( rule__AdditiveExpression__OperandAssignment_1_1_3_1 )
+            // InternalFormalML.g:53762:3: rule__AdditiveExpression__OperandAssignment_1_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__AdditiveExpression__OperandAssignment_1_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandAssignment_1_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__Group_1_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group__0"
+    // InternalFormalML.g:53771:1: rule__MultiplicativeExpression__Group__0 : rule__MultiplicativeExpression__Group__0__Impl rule__MultiplicativeExpression__Group__1 ;
+    public final void rule__MultiplicativeExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53775:1: ( rule__MultiplicativeExpression__Group__0__Impl rule__MultiplicativeExpression__Group__1 )
+            // InternalFormalML.g:53776:2: rule__MultiplicativeExpression__Group__0__Impl rule__MultiplicativeExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_247);
+            rule__MultiplicativeExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group__0__Impl"
+    // InternalFormalML.g:53783:1: rule__MultiplicativeExpression__Group__0__Impl : ( ruleUnaryExpression ) ;
+    public final void rule__MultiplicativeExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53787:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:53788:1: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:53788:1: ( ruleUnaryExpression )
+            // InternalFormalML.g:53789:2: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getUnaryExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getUnaryExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group__1"
+    // InternalFormalML.g:53798:1: rule__MultiplicativeExpression__Group__1 : rule__MultiplicativeExpression__Group__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53802:1: ( rule__MultiplicativeExpression__Group__1__Impl )
+            // InternalFormalML.g:53803:2: rule__MultiplicativeExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group__1__Impl"
+    // InternalFormalML.g:53809:1: rule__MultiplicativeExpression__Group__1__Impl : ( ( rule__MultiplicativeExpression__Alternatives_1 )* ) ;
+    public final void rule__MultiplicativeExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53813:1: ( ( ( rule__MultiplicativeExpression__Alternatives_1 )* ) )
+            // InternalFormalML.g:53814:1: ( ( rule__MultiplicativeExpression__Alternatives_1 )* )
+            {
+            // InternalFormalML.g:53814:1: ( ( rule__MultiplicativeExpression__Alternatives_1 )* )
+            // InternalFormalML.g:53815:2: ( rule__MultiplicativeExpression__Alternatives_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:53816:2: ( rule__MultiplicativeExpression__Alternatives_1 )*
+            loop671:
+            do {
+                int alt671=2;
+                int LA671_0 = input.LA(1);
+
+                if ( (LA671_0==58||(LA671_0>=258 && LA671_0<=260)) ) {
+                    alt671=1;
+                }
+
+
+                switch (alt671) {
+            	case 1 :
+            	    // InternalFormalML.g:53816:3: rule__MultiplicativeExpression__Alternatives_1
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_248);
+            	    rule__MultiplicativeExpression__Alternatives_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop671;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__0"
+    // InternalFormalML.g:53825:1: rule__MultiplicativeExpression__Group_1_0__0 : rule__MultiplicativeExpression__Group_1_0__0__Impl rule__MultiplicativeExpression__Group_1_0__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53829:1: ( rule__MultiplicativeExpression__Group_1_0__0__Impl rule__MultiplicativeExpression__Group_1_0__1 )
+            // InternalFormalML.g:53830:2: rule__MultiplicativeExpression__Group_1_0__0__Impl rule__MultiplicativeExpression__Group_1_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_249);
+            rule__MultiplicativeExpression__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__0__Impl"
+    // InternalFormalML.g:53837:1: rule__MultiplicativeExpression__Group_1_0__0__Impl : ( () ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53841:1: ( ( () ) )
+            // InternalFormalML.g:53842:1: ( () )
+            {
+            // InternalFormalML.g:53842:1: ( () )
+            // InternalFormalML.g:53843:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()); 
+            }
+            // InternalFormalML.g:53844:2: ()
+            // InternalFormalML.g:53844:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__1"
+    // InternalFormalML.g:53852:1: rule__MultiplicativeExpression__Group_1_0__1 : rule__MultiplicativeExpression__Group_1_0__1__Impl rule__MultiplicativeExpression__Group_1_0__2 ;
+    public final void rule__MultiplicativeExpression__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53856:1: ( rule__MultiplicativeExpression__Group_1_0__1__Impl rule__MultiplicativeExpression__Group_1_0__2 )
+            // InternalFormalML.g:53857:2: rule__MultiplicativeExpression__Group_1_0__1__Impl rule__MultiplicativeExpression__Group_1_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MultiplicativeExpression__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__1__Impl"
+    // InternalFormalML.g:53864:1: rule__MultiplicativeExpression__Group_1_0__1__Impl : ( ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53868:1: ( ( ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 ) ) )
+            // InternalFormalML.g:53869:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 ) )
+            {
+            // InternalFormalML.g:53869:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 ) )
+            // InternalFormalML.g:53870:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1()); 
+            }
+            // InternalFormalML.g:53871:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_0_1 )
+            // InternalFormalML.g:53871:3: rule__MultiplicativeExpression__OperatorAssignment_1_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperatorAssignment_1_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__2"
+    // InternalFormalML.g:53879:1: rule__MultiplicativeExpression__Group_1_0__2 : rule__MultiplicativeExpression__Group_1_0__2__Impl rule__MultiplicativeExpression__Group_1_0__3 ;
+    public final void rule__MultiplicativeExpression__Group_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53883:1: ( rule__MultiplicativeExpression__Group_1_0__2__Impl rule__MultiplicativeExpression__Group_1_0__3 )
+            // InternalFormalML.g:53884:2: rule__MultiplicativeExpression__Group_1_0__2__Impl rule__MultiplicativeExpression__Group_1_0__3
+            {
+            pushFollow(FollowSets000.FOLLOW_249);
+            rule__MultiplicativeExpression__Group_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__2__Impl"
+    // InternalFormalML.g:53891:1: rule__MultiplicativeExpression__Group_1_0__2__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53895:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 ) ) )
+            // InternalFormalML.g:53896:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 ) )
+            {
+            // InternalFormalML.g:53896:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 ) )
+            // InternalFormalML.g:53897:2: ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2()); 
+            }
+            // InternalFormalML.g:53898:2: ( rule__MultiplicativeExpression__OperandAssignment_1_0_2 )
+            // InternalFormalML.g:53898:3: rule__MultiplicativeExpression__OperandAssignment_1_0_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__3"
+    // InternalFormalML.g:53906:1: rule__MultiplicativeExpression__Group_1_0__3 : rule__MultiplicativeExpression__Group_1_0__3__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53910:1: ( rule__MultiplicativeExpression__Group_1_0__3__Impl )
+            // InternalFormalML.g:53911:2: rule__MultiplicativeExpression__Group_1_0__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__3"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0__3__Impl"
+    // InternalFormalML.g:53917:1: rule__MultiplicativeExpression__Group_1_0__3__Impl : ( ( rule__MultiplicativeExpression__Group_1_0_3__0 )* ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53921:1: ( ( ( rule__MultiplicativeExpression__Group_1_0_3__0 )* ) )
+            // InternalFormalML.g:53922:1: ( ( rule__MultiplicativeExpression__Group_1_0_3__0 )* )
+            {
+            // InternalFormalML.g:53922:1: ( ( rule__MultiplicativeExpression__Group_1_0_3__0 )* )
+            // InternalFormalML.g:53923:2: ( rule__MultiplicativeExpression__Group_1_0_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3()); 
+            }
+            // InternalFormalML.g:53924:2: ( rule__MultiplicativeExpression__Group_1_0_3__0 )*
+            loop672:
+            do {
+                int alt672=2;
+                alt672 = dfa672.predict(input);
+                switch (alt672) {
+            	case 1 :
+            	    // InternalFormalML.g:53924:3: rule__MultiplicativeExpression__Group_1_0_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_250);
+            	    rule__MultiplicativeExpression__Group_1_0_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop672;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0__3__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0_3__0"
+    // InternalFormalML.g:53933:1: rule__MultiplicativeExpression__Group_1_0_3__0 : rule__MultiplicativeExpression__Group_1_0_3__0__Impl rule__MultiplicativeExpression__Group_1_0_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_0_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53937:1: ( rule__MultiplicativeExpression__Group_1_0_3__0__Impl rule__MultiplicativeExpression__Group_1_0_3__1 )
+            // InternalFormalML.g:53938:2: rule__MultiplicativeExpression__Group_1_0_3__0__Impl rule__MultiplicativeExpression__Group_1_0_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MultiplicativeExpression__Group_1_0_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0_3__0__Impl"
+    // InternalFormalML.g:53945:1: rule__MultiplicativeExpression__Group_1_0_3__0__Impl : ( '*' ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53949:1: ( ( '*' ) )
+            // InternalFormalML.g:53950:1: ( '*' )
+            {
+            // InternalFormalML.g:53950:1: ( '*' )
+            // InternalFormalML.g:53951:2: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0()); 
+            }
+            match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0_3__1"
+    // InternalFormalML.g:53960:1: rule__MultiplicativeExpression__Group_1_0_3__1 : rule__MultiplicativeExpression__Group_1_0_3__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_0_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53964:1: ( rule__MultiplicativeExpression__Group_1_0_3__1__Impl )
+            // InternalFormalML.g:53965:2: rule__MultiplicativeExpression__Group_1_0_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_0_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_0_3__1__Impl"
+    // InternalFormalML.g:53971:1: rule__MultiplicativeExpression__Group_1_0_3__1__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_0_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53975:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 ) ) )
+            // InternalFormalML.g:53976:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 ) )
+            {
+            // InternalFormalML.g:53976:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 ) )
+            // InternalFormalML.g:53977:2: ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1()); 
+            }
+            // InternalFormalML.g:53978:2: ( rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 )
+            // InternalFormalML.g:53978:3: rule__MultiplicativeExpression__OperandAssignment_1_0_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_0_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_0_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_0_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__0"
+    // InternalFormalML.g:53987:1: rule__MultiplicativeExpression__Group_1_1__0 : rule__MultiplicativeExpression__Group_1_1__0__Impl rule__MultiplicativeExpression__Group_1_1__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:53991:1: ( rule__MultiplicativeExpression__Group_1_1__0__Impl rule__MultiplicativeExpression__Group_1_1__1 )
+            // InternalFormalML.g:53992:2: rule__MultiplicativeExpression__Group_1_1__0__Impl rule__MultiplicativeExpression__Group_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_251);
+            rule__MultiplicativeExpression__Group_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__0__Impl"
+    // InternalFormalML.g:53999:1: rule__MultiplicativeExpression__Group_1_1__0__Impl : ( () ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54003:1: ( ( () ) )
+            // InternalFormalML.g:54004:1: ( () )
+            {
+            // InternalFormalML.g:54004:1: ( () )
+            // InternalFormalML.g:54005:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()); 
+            }
+            // InternalFormalML.g:54006:2: ()
+            // InternalFormalML.g:54006:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__1"
+    // InternalFormalML.g:54014:1: rule__MultiplicativeExpression__Group_1_1__1 : rule__MultiplicativeExpression__Group_1_1__1__Impl rule__MultiplicativeExpression__Group_1_1__2 ;
+    public final void rule__MultiplicativeExpression__Group_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54018:1: ( rule__MultiplicativeExpression__Group_1_1__1__Impl rule__MultiplicativeExpression__Group_1_1__2 )
+            // InternalFormalML.g:54019:2: rule__MultiplicativeExpression__Group_1_1__1__Impl rule__MultiplicativeExpression__Group_1_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MultiplicativeExpression__Group_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__1__Impl"
+    // InternalFormalML.g:54026:1: rule__MultiplicativeExpression__Group_1_1__1__Impl : ( ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54030:1: ( ( ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 ) ) )
+            // InternalFormalML.g:54031:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 ) )
+            {
+            // InternalFormalML.g:54031:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 ) )
+            // InternalFormalML.g:54032:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1()); 
+            }
+            // InternalFormalML.g:54033:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_1_1 )
+            // InternalFormalML.g:54033:3: rule__MultiplicativeExpression__OperatorAssignment_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperatorAssignment_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__2"
+    // InternalFormalML.g:54041:1: rule__MultiplicativeExpression__Group_1_1__2 : rule__MultiplicativeExpression__Group_1_1__2__Impl rule__MultiplicativeExpression__Group_1_1__3 ;
+    public final void rule__MultiplicativeExpression__Group_1_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54045:1: ( rule__MultiplicativeExpression__Group_1_1__2__Impl rule__MultiplicativeExpression__Group_1_1__3 )
+            // InternalFormalML.g:54046:2: rule__MultiplicativeExpression__Group_1_1__2__Impl rule__MultiplicativeExpression__Group_1_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_251);
+            rule__MultiplicativeExpression__Group_1_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__2__Impl"
+    // InternalFormalML.g:54053:1: rule__MultiplicativeExpression__Group_1_1__2__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54057:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 ) ) )
+            // InternalFormalML.g:54058:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 ) )
+            {
+            // InternalFormalML.g:54058:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 ) )
+            // InternalFormalML.g:54059:2: ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2()); 
+            }
+            // InternalFormalML.g:54060:2: ( rule__MultiplicativeExpression__OperandAssignment_1_1_2 )
+            // InternalFormalML.g:54060:3: rule__MultiplicativeExpression__OperandAssignment_1_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__2__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__3"
+    // InternalFormalML.g:54068:1: rule__MultiplicativeExpression__Group_1_1__3 : rule__MultiplicativeExpression__Group_1_1__3__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54072:1: ( rule__MultiplicativeExpression__Group_1_1__3__Impl )
+            // InternalFormalML.g:54073:2: rule__MultiplicativeExpression__Group_1_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__3"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1__3__Impl"
+    // InternalFormalML.g:54079:1: rule__MultiplicativeExpression__Group_1_1__3__Impl : ( ( rule__MultiplicativeExpression__Group_1_1_3__0 )* ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54083:1: ( ( ( rule__MultiplicativeExpression__Group_1_1_3__0 )* ) )
+            // InternalFormalML.g:54084:1: ( ( rule__MultiplicativeExpression__Group_1_1_3__0 )* )
+            {
+            // InternalFormalML.g:54084:1: ( ( rule__MultiplicativeExpression__Group_1_1_3__0 )* )
+            // InternalFormalML.g:54085:2: ( rule__MultiplicativeExpression__Group_1_1_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3()); 
+            }
+            // InternalFormalML.g:54086:2: ( rule__MultiplicativeExpression__Group_1_1_3__0 )*
+            loop673:
+            do {
+                int alt673=2;
+                alt673 = dfa673.predict(input);
+                switch (alt673) {
+            	case 1 :
+            	    // InternalFormalML.g:54086:3: rule__MultiplicativeExpression__Group_1_1_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_252);
+            	    rule__MultiplicativeExpression__Group_1_1_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop673;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1__3__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1_3__0"
+    // InternalFormalML.g:54095:1: rule__MultiplicativeExpression__Group_1_1_3__0 : rule__MultiplicativeExpression__Group_1_1_3__0__Impl rule__MultiplicativeExpression__Group_1_1_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54099:1: ( rule__MultiplicativeExpression__Group_1_1_3__0__Impl rule__MultiplicativeExpression__Group_1_1_3__1 )
+            // InternalFormalML.g:54100:2: rule__MultiplicativeExpression__Group_1_1_3__0__Impl rule__MultiplicativeExpression__Group_1_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MultiplicativeExpression__Group_1_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1_3__0__Impl"
+    // InternalFormalML.g:54107:1: rule__MultiplicativeExpression__Group_1_1_3__0__Impl : ( '**' ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54111:1: ( ( '**' ) )
+            // InternalFormalML.g:54112:1: ( '**' )
+            {
+            // InternalFormalML.g:54112:1: ( '**' )
+            // InternalFormalML.g:54113:2: '**'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0()); 
+            }
+            match(input,258,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1_3__1"
+    // InternalFormalML.g:54122:1: rule__MultiplicativeExpression__Group_1_1_3__1 : rule__MultiplicativeExpression__Group_1_1_3__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54126:1: ( rule__MultiplicativeExpression__Group_1_1_3__1__Impl )
+            // InternalFormalML.g:54127:2: rule__MultiplicativeExpression__Group_1_1_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_1_3__1__Impl"
+    // InternalFormalML.g:54133:1: rule__MultiplicativeExpression__Group_1_1_3__1__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54137:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 ) ) )
+            // InternalFormalML.g:54138:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 ) )
+            {
+            // InternalFormalML.g:54138:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 ) )
+            // InternalFormalML.g:54139:2: ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1()); 
+            }
+            // InternalFormalML.g:54140:2: ( rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 )
+            // InternalFormalML.g:54140:3: rule__MultiplicativeExpression__OperandAssignment_1_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__0"
+    // InternalFormalML.g:54149:1: rule__MultiplicativeExpression__Group_1_2__0 : rule__MultiplicativeExpression__Group_1_2__0__Impl rule__MultiplicativeExpression__Group_1_2__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54153:1: ( rule__MultiplicativeExpression__Group_1_2__0__Impl rule__MultiplicativeExpression__Group_1_2__1 )
+            // InternalFormalML.g:54154:2: rule__MultiplicativeExpression__Group_1_2__0__Impl rule__MultiplicativeExpression__Group_1_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_253);
+            rule__MultiplicativeExpression__Group_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__0__Impl"
+    // InternalFormalML.g:54161:1: rule__MultiplicativeExpression__Group_1_2__0__Impl : ( () ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54165:1: ( ( () ) )
+            // InternalFormalML.g:54166:1: ( () )
+            {
+            // InternalFormalML.g:54166:1: ( () )
+            // InternalFormalML.g:54167:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0()); 
+            }
+            // InternalFormalML.g:54168:2: ()
+            // InternalFormalML.g:54168:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__1"
+    // InternalFormalML.g:54176:1: rule__MultiplicativeExpression__Group_1_2__1 : rule__MultiplicativeExpression__Group_1_2__1__Impl rule__MultiplicativeExpression__Group_1_2__2 ;
+    public final void rule__MultiplicativeExpression__Group_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54180:1: ( rule__MultiplicativeExpression__Group_1_2__1__Impl rule__MultiplicativeExpression__Group_1_2__2 )
+            // InternalFormalML.g:54181:2: rule__MultiplicativeExpression__Group_1_2__1__Impl rule__MultiplicativeExpression__Group_1_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MultiplicativeExpression__Group_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__1__Impl"
+    // InternalFormalML.g:54188:1: rule__MultiplicativeExpression__Group_1_2__1__Impl : ( ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54192:1: ( ( ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 ) ) )
+            // InternalFormalML.g:54193:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 ) )
+            {
+            // InternalFormalML.g:54193:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 ) )
+            // InternalFormalML.g:54194:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1()); 
+            }
+            // InternalFormalML.g:54195:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_2_1 )
+            // InternalFormalML.g:54195:3: rule__MultiplicativeExpression__OperatorAssignment_1_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperatorAssignment_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__2"
+    // InternalFormalML.g:54203:1: rule__MultiplicativeExpression__Group_1_2__2 : rule__MultiplicativeExpression__Group_1_2__2__Impl rule__MultiplicativeExpression__Group_1_2__3 ;
+    public final void rule__MultiplicativeExpression__Group_1_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54207:1: ( rule__MultiplicativeExpression__Group_1_2__2__Impl rule__MultiplicativeExpression__Group_1_2__3 )
+            // InternalFormalML.g:54208:2: rule__MultiplicativeExpression__Group_1_2__2__Impl rule__MultiplicativeExpression__Group_1_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_253);
+            rule__MultiplicativeExpression__Group_1_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__2__Impl"
+    // InternalFormalML.g:54215:1: rule__MultiplicativeExpression__Group_1_2__2__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54219:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 ) ) )
+            // InternalFormalML.g:54220:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 ) )
+            {
+            // InternalFormalML.g:54220:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 ) )
+            // InternalFormalML.g:54221:2: ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2()); 
+            }
+            // InternalFormalML.g:54222:2: ( rule__MultiplicativeExpression__OperandAssignment_1_2_2 )
+            // InternalFormalML.g:54222:3: rule__MultiplicativeExpression__OperandAssignment_1_2_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__2__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__3"
+    // InternalFormalML.g:54230:1: rule__MultiplicativeExpression__Group_1_2__3 : rule__MultiplicativeExpression__Group_1_2__3__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54234:1: ( rule__MultiplicativeExpression__Group_1_2__3__Impl )
+            // InternalFormalML.g:54235:2: rule__MultiplicativeExpression__Group_1_2__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__3"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2__3__Impl"
+    // InternalFormalML.g:54241:1: rule__MultiplicativeExpression__Group_1_2__3__Impl : ( ( rule__MultiplicativeExpression__Group_1_2_3__0 )* ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54245:1: ( ( ( rule__MultiplicativeExpression__Group_1_2_3__0 )* ) )
+            // InternalFormalML.g:54246:1: ( ( rule__MultiplicativeExpression__Group_1_2_3__0 )* )
+            {
+            // InternalFormalML.g:54246:1: ( ( rule__MultiplicativeExpression__Group_1_2_3__0 )* )
+            // InternalFormalML.g:54247:2: ( rule__MultiplicativeExpression__Group_1_2_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3()); 
+            }
+            // InternalFormalML.g:54248:2: ( rule__MultiplicativeExpression__Group_1_2_3__0 )*
+            loop674:
+            do {
+                int alt674=2;
+                alt674 = dfa674.predict(input);
+                switch (alt674) {
+            	case 1 :
+            	    // InternalFormalML.g:54248:3: rule__MultiplicativeExpression__Group_1_2_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_254);
+            	    rule__MultiplicativeExpression__Group_1_2_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop674;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2__3__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2_3__0"
+    // InternalFormalML.g:54257:1: rule__MultiplicativeExpression__Group_1_2_3__0 : rule__MultiplicativeExpression__Group_1_2_3__0__Impl rule__MultiplicativeExpression__Group_1_2_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_2_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54261:1: ( rule__MultiplicativeExpression__Group_1_2_3__0__Impl rule__MultiplicativeExpression__Group_1_2_3__1 )
+            // InternalFormalML.g:54262:2: rule__MultiplicativeExpression__Group_1_2_3__0__Impl rule__MultiplicativeExpression__Group_1_2_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MultiplicativeExpression__Group_1_2_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2_3__0__Impl"
+    // InternalFormalML.g:54269:1: rule__MultiplicativeExpression__Group_1_2_3__0__Impl : ( '/' ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54273:1: ( ( '/' ) )
+            // InternalFormalML.g:54274:1: ( '/' )
+            {
+            // InternalFormalML.g:54274:1: ( '/' )
+            // InternalFormalML.g:54275:2: '/'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0()); 
+            }
+            match(input,259,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2_3__1"
+    // InternalFormalML.g:54284:1: rule__MultiplicativeExpression__Group_1_2_3__1 : rule__MultiplicativeExpression__Group_1_2_3__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_2_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54288:1: ( rule__MultiplicativeExpression__Group_1_2_3__1__Impl )
+            // InternalFormalML.g:54289:2: rule__MultiplicativeExpression__Group_1_2_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_2_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_2_3__1__Impl"
+    // InternalFormalML.g:54295:1: rule__MultiplicativeExpression__Group_1_2_3__1__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_2_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54299:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 ) ) )
+            // InternalFormalML.g:54300:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 ) )
+            {
+            // InternalFormalML.g:54300:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 ) )
+            // InternalFormalML.g:54301:2: ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1()); 
+            }
+            // InternalFormalML.g:54302:2: ( rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 )
+            // InternalFormalML.g:54302:3: rule__MultiplicativeExpression__OperandAssignment_1_2_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_2_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_2_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_2_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__0"
+    // InternalFormalML.g:54311:1: rule__MultiplicativeExpression__Group_1_3__0 : rule__MultiplicativeExpression__Group_1_3__0__Impl rule__MultiplicativeExpression__Group_1_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54315:1: ( rule__MultiplicativeExpression__Group_1_3__0__Impl rule__MultiplicativeExpression__Group_1_3__1 )
+            // InternalFormalML.g:54316:2: rule__MultiplicativeExpression__Group_1_3__0__Impl rule__MultiplicativeExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_247);
+            rule__MultiplicativeExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__0__Impl"
+    // InternalFormalML.g:54323:1: rule__MultiplicativeExpression__Group_1_3__0__Impl : ( () ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54327:1: ( ( () ) )
+            // InternalFormalML.g:54328:1: ( () )
+            {
+            // InternalFormalML.g:54328:1: ( () )
+            // InternalFormalML.g:54329:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0()); 
+            }
+            // InternalFormalML.g:54330:2: ()
+            // InternalFormalML.g:54330:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__1"
+    // InternalFormalML.g:54338:1: rule__MultiplicativeExpression__Group_1_3__1 : rule__MultiplicativeExpression__Group_1_3__1__Impl rule__MultiplicativeExpression__Group_1_3__2 ;
+    public final void rule__MultiplicativeExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54342:1: ( rule__MultiplicativeExpression__Group_1_3__1__Impl rule__MultiplicativeExpression__Group_1_3__2 )
+            // InternalFormalML.g:54343:2: rule__MultiplicativeExpression__Group_1_3__1__Impl rule__MultiplicativeExpression__Group_1_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MultiplicativeExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__1__Impl"
+    // InternalFormalML.g:54350:1: rule__MultiplicativeExpression__Group_1_3__1__Impl : ( ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54354:1: ( ( ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 ) ) )
+            // InternalFormalML.g:54355:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 ) )
+            {
+            // InternalFormalML.g:54355:1: ( ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 ) )
+            // InternalFormalML.g:54356:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1()); 
+            }
+            // InternalFormalML.g:54357:2: ( rule__MultiplicativeExpression__OperatorAssignment_1_3_1 )
+            // InternalFormalML.g:54357:3: rule__MultiplicativeExpression__OperatorAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperatorAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__2"
+    // InternalFormalML.g:54365:1: rule__MultiplicativeExpression__Group_1_3__2 : rule__MultiplicativeExpression__Group_1_3__2__Impl rule__MultiplicativeExpression__Group_1_3__3 ;
+    public final void rule__MultiplicativeExpression__Group_1_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54369:1: ( rule__MultiplicativeExpression__Group_1_3__2__Impl rule__MultiplicativeExpression__Group_1_3__3 )
+            // InternalFormalML.g:54370:2: rule__MultiplicativeExpression__Group_1_3__2__Impl rule__MultiplicativeExpression__Group_1_3__3
+            {
+            pushFollow(FollowSets000.FOLLOW_255);
+            rule__MultiplicativeExpression__Group_1_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__2__Impl"
+    // InternalFormalML.g:54377:1: rule__MultiplicativeExpression__Group_1_3__2__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54381:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 ) ) )
+            // InternalFormalML.g:54382:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 ) )
+            {
+            // InternalFormalML.g:54382:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 ) )
+            // InternalFormalML.g:54383:2: ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2()); 
+            }
+            // InternalFormalML.g:54384:2: ( rule__MultiplicativeExpression__OperandAssignment_1_3_2 )
+            // InternalFormalML.g:54384:3: rule__MultiplicativeExpression__OperandAssignment_1_3_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_3_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__2__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__3"
+    // InternalFormalML.g:54392:1: rule__MultiplicativeExpression__Group_1_3__3 : rule__MultiplicativeExpression__Group_1_3__3__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_3__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54396:1: ( rule__MultiplicativeExpression__Group_1_3__3__Impl )
+            // InternalFormalML.g:54397:2: rule__MultiplicativeExpression__Group_1_3__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__3"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3__3__Impl"
+    // InternalFormalML.g:54403:1: rule__MultiplicativeExpression__Group_1_3__3__Impl : ( ( rule__MultiplicativeExpression__Group_1_3_3__0 )* ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54407:1: ( ( ( rule__MultiplicativeExpression__Group_1_3_3__0 )* ) )
+            // InternalFormalML.g:54408:1: ( ( rule__MultiplicativeExpression__Group_1_3_3__0 )* )
+            {
+            // InternalFormalML.g:54408:1: ( ( rule__MultiplicativeExpression__Group_1_3_3__0 )* )
+            // InternalFormalML.g:54409:2: ( rule__MultiplicativeExpression__Group_1_3_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3()); 
+            }
+            // InternalFormalML.g:54410:2: ( rule__MultiplicativeExpression__Group_1_3_3__0 )*
+            loop675:
+            do {
+                int alt675=2;
+                alt675 = dfa675.predict(input);
+                switch (alt675) {
+            	case 1 :
+            	    // InternalFormalML.g:54410:3: rule__MultiplicativeExpression__Group_1_3_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_256);
+            	    rule__MultiplicativeExpression__Group_1_3_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop675;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getGroup_1_3_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3__3__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3_3__0"
+    // InternalFormalML.g:54419:1: rule__MultiplicativeExpression__Group_1_3_3__0 : rule__MultiplicativeExpression__Group_1_3_3__0__Impl rule__MultiplicativeExpression__Group_1_3_3__1 ;
+    public final void rule__MultiplicativeExpression__Group_1_3_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54423:1: ( rule__MultiplicativeExpression__Group_1_3_3__0__Impl rule__MultiplicativeExpression__Group_1_3_3__1 )
+            // InternalFormalML.g:54424:2: rule__MultiplicativeExpression__Group_1_3_3__0__Impl rule__MultiplicativeExpression__Group_1_3_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MultiplicativeExpression__Group_1_3_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3_3__0"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3_3__0__Impl"
+    // InternalFormalML.g:54431:1: rule__MultiplicativeExpression__Group_1_3_3__0__Impl : ( '%' ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54435:1: ( ( '%' ) )
+            // InternalFormalML.g:54436:1: ( '%' )
+            {
+            // InternalFormalML.g:54436:1: ( '%' )
+            // InternalFormalML.g:54437:2: '%'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0()); 
+            }
+            match(input,260,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3_3__0__Impl"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3_3__1"
+    // InternalFormalML.g:54446:1: rule__MultiplicativeExpression__Group_1_3_3__1 : rule__MultiplicativeExpression__Group_1_3_3__1__Impl ;
+    public final void rule__MultiplicativeExpression__Group_1_3_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54450:1: ( rule__MultiplicativeExpression__Group_1_3_3__1__Impl )
+            // InternalFormalML.g:54451:2: rule__MultiplicativeExpression__Group_1_3_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__Group_1_3_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3_3__1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__Group_1_3_3__1__Impl"
+    // InternalFormalML.g:54457:1: rule__MultiplicativeExpression__Group_1_3_3__1__Impl : ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 ) ) ;
+    public final void rule__MultiplicativeExpression__Group_1_3_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54461:1: ( ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 ) ) )
+            // InternalFormalML.g:54462:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 ) )
+            {
+            // InternalFormalML.g:54462:1: ( ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 ) )
+            // InternalFormalML.g:54463:2: ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1()); 
+            }
+            // InternalFormalML.g:54464:2: ( rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 )
+            // InternalFormalML.g:54464:3: rule__MultiplicativeExpression__OperandAssignment_1_3_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MultiplicativeExpression__OperandAssignment_1_3_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandAssignment_1_3_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__Group_1_3_3__1__Impl"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPostfixExpression__Group__0"
+    // InternalFormalML.g:54473:1: rule__IncrementOrDecrementPostfixExpression__Group__0 : rule__IncrementOrDecrementPostfixExpression__Group__0__Impl rule__IncrementOrDecrementPostfixExpression__Group__1 ;
+    public final void rule__IncrementOrDecrementPostfixExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54477:1: ( rule__IncrementOrDecrementPostfixExpression__Group__0__Impl rule__IncrementOrDecrementPostfixExpression__Group__1 )
+            // InternalFormalML.g:54478:2: rule__IncrementOrDecrementPostfixExpression__Group__0__Impl rule__IncrementOrDecrementPostfixExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_257);
+            rule__IncrementOrDecrementPostfixExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPostfixExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPostfixExpression__Group__0"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPostfixExpression__Group__0__Impl"
+    // InternalFormalML.g:54485:1: rule__IncrementOrDecrementPostfixExpression__Group__0__Impl : ( ( rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0 ) ) ;
+    public final void rule__IncrementOrDecrementPostfixExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54489:1: ( ( ( rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0 ) ) )
+            // InternalFormalML.g:54490:1: ( ( rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0 ) )
+            {
+            // InternalFormalML.g:54490:1: ( ( rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0 ) )
+            // InternalFormalML.g:54491:2: ( rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideAssignment_0()); 
+            }
+            // InternalFormalML.g:54492:2: ( rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0 )
+            // InternalFormalML.g:54492:3: rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPostfixExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPostfixExpression__Group__1"
+    // InternalFormalML.g:54500:1: rule__IncrementOrDecrementPostfixExpression__Group__1 : rule__IncrementOrDecrementPostfixExpression__Group__1__Impl ;
+    public final void rule__IncrementOrDecrementPostfixExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54504:1: ( rule__IncrementOrDecrementPostfixExpression__Group__1__Impl )
+            // InternalFormalML.g:54505:2: rule__IncrementOrDecrementPostfixExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPostfixExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPostfixExpression__Group__1"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPostfixExpression__Group__1__Impl"
+    // InternalFormalML.g:54511:1: rule__IncrementOrDecrementPostfixExpression__Group__1__Impl : ( ( rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1 ) ) ;
+    public final void rule__IncrementOrDecrementPostfixExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54515:1: ( ( ( rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1 ) ) )
+            // InternalFormalML.g:54516:1: ( ( rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1 ) )
+            {
+            // InternalFormalML.g:54516:1: ( ( rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1 ) )
+            // InternalFormalML.g:54517:2: ( rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAssignment_1()); 
+            }
+            // InternalFormalML.g:54518:2: ( rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1 )
+            // InternalFormalML.g:54518:3: rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPostfixExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPrefixExpression__Group__0"
+    // InternalFormalML.g:54527:1: rule__IncrementOrDecrementPrefixExpression__Group__0 : rule__IncrementOrDecrementPrefixExpression__Group__0__Impl rule__IncrementOrDecrementPrefixExpression__Group__1 ;
+    public final void rule__IncrementOrDecrementPrefixExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54531:1: ( rule__IncrementOrDecrementPrefixExpression__Group__0__Impl rule__IncrementOrDecrementPrefixExpression__Group__1 )
+            // InternalFormalML.g:54532:2: rule__IncrementOrDecrementPrefixExpression__Group__0__Impl rule__IncrementOrDecrementPrefixExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_219);
+            rule__IncrementOrDecrementPrefixExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPrefixExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPrefixExpression__Group__0"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPrefixExpression__Group__0__Impl"
+    // InternalFormalML.g:54539:1: rule__IncrementOrDecrementPrefixExpression__Group__0__Impl : ( ( rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0 ) ) ;
+    public final void rule__IncrementOrDecrementPrefixExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54543:1: ( ( ( rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0 ) ) )
+            // InternalFormalML.g:54544:1: ( ( rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0 ) )
+            {
+            // InternalFormalML.g:54544:1: ( ( rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0 ) )
+            // InternalFormalML.g:54545:2: ( rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAssignment_0()); 
+            }
+            // InternalFormalML.g:54546:2: ( rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0 )
+            // InternalFormalML.g:54546:3: rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPrefixExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPrefixExpression__Group__1"
+    // InternalFormalML.g:54554:1: rule__IncrementOrDecrementPrefixExpression__Group__1 : rule__IncrementOrDecrementPrefixExpression__Group__1__Impl ;
+    public final void rule__IncrementOrDecrementPrefixExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54558:1: ( rule__IncrementOrDecrementPrefixExpression__Group__1__Impl )
+            // InternalFormalML.g:54559:2: rule__IncrementOrDecrementPrefixExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPrefixExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPrefixExpression__Group__1"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPrefixExpression__Group__1__Impl"
+    // InternalFormalML.g:54565:1: rule__IncrementOrDecrementPrefixExpression__Group__1__Impl : ( ( rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1 ) ) ;
+    public final void rule__IncrementOrDecrementPrefixExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54569:1: ( ( ( rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1 ) ) )
+            // InternalFormalML.g:54570:1: ( ( rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1 ) )
+            {
+            // InternalFormalML.g:54570:1: ( ( rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1 ) )
+            // InternalFormalML.g:54571:2: ( rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideAssignment_1()); 
+            }
+            // InternalFormalML.g:54572:2: ( rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1 )
+            // InternalFormalML.g:54572:3: rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPrefixExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_0__0"
+    // InternalFormalML.g:54581:1: rule__NewfreshExpression__Group_0__0 : rule__NewfreshExpression__Group_0__0__Impl rule__NewfreshExpression__Group_0__1 ;
+    public final void rule__NewfreshExpression__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54585:1: ( rule__NewfreshExpression__Group_0__0__Impl rule__NewfreshExpression__Group_0__1 )
+            // InternalFormalML.g:54586:2: rule__NewfreshExpression__Group_0__0__Impl rule__NewfreshExpression__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_219);
+            rule__NewfreshExpression__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NewfreshExpression__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_0__0"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_0__0__Impl"
+    // InternalFormalML.g:54593:1: rule__NewfreshExpression__Group_0__0__Impl : ( 'newfresh' ) ;
+    public final void rule__NewfreshExpression__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54597:1: ( ( 'newfresh' ) )
+            // InternalFormalML.g:54598:1: ( 'newfresh' )
+            {
+            // InternalFormalML.g:54598:1: ( 'newfresh' )
+            // InternalFormalML.g:54599:2: 'newfresh'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_0_0()); 
+            }
+            match(input,261,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_0__1"
+    // InternalFormalML.g:54608:1: rule__NewfreshExpression__Group_0__1 : rule__NewfreshExpression__Group_0__1__Impl ;
+    public final void rule__NewfreshExpression__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54612:1: ( rule__NewfreshExpression__Group_0__1__Impl )
+            // InternalFormalML.g:54613:2: rule__NewfreshExpression__Group_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NewfreshExpression__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_0__1"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_0__1__Impl"
+    // InternalFormalML.g:54619:1: rule__NewfreshExpression__Group_0__1__Impl : ( ( rule__NewfreshExpression__LeftHandSideAssignment_0_1 ) ) ;
+    public final void rule__NewfreshExpression__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54623:1: ( ( ( rule__NewfreshExpression__LeftHandSideAssignment_0_1 ) ) )
+            // InternalFormalML.g:54624:1: ( ( rule__NewfreshExpression__LeftHandSideAssignment_0_1 ) )
+            {
+            // InternalFormalML.g:54624:1: ( ( rule__NewfreshExpression__LeftHandSideAssignment_0_1 ) )
+            // InternalFormalML.g:54625:2: ( rule__NewfreshExpression__LeftHandSideAssignment_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_0_1()); 
+            }
+            // InternalFormalML.g:54626:2: ( rule__NewfreshExpression__LeftHandSideAssignment_0_1 )
+            // InternalFormalML.g:54626:3: rule__NewfreshExpression__LeftHandSideAssignment_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NewfreshExpression__LeftHandSideAssignment_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_1__0"
+    // InternalFormalML.g:54635:1: rule__NewfreshExpression__Group_1__0 : rule__NewfreshExpression__Group_1__0__Impl rule__NewfreshExpression__Group_1__1 ;
+    public final void rule__NewfreshExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54639:1: ( rule__NewfreshExpression__Group_1__0__Impl rule__NewfreshExpression__Group_1__1 )
+            // InternalFormalML.g:54640:2: rule__NewfreshExpression__Group_1__0__Impl rule__NewfreshExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_219);
+            rule__NewfreshExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NewfreshExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_1__0__Impl"
+    // InternalFormalML.g:54647:1: rule__NewfreshExpression__Group_1__0__Impl : ( '(:' ) ;
+    public final void rule__NewfreshExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54651:1: ( ( '(:' ) )
+            // InternalFormalML.g:54652:1: ( '(:' )
+            {
+            // InternalFormalML.g:54652:1: ( '(:' )
+            // InternalFormalML.g:54653:2: '(:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionAccess().getLeftParenthesisColonKeyword_1_0()); 
+            }
+            match(input,262,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionAccess().getLeftParenthesisColonKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_1__1"
+    // InternalFormalML.g:54662:1: rule__NewfreshExpression__Group_1__1 : rule__NewfreshExpression__Group_1__1__Impl rule__NewfreshExpression__Group_1__2 ;
+    public final void rule__NewfreshExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54666:1: ( rule__NewfreshExpression__Group_1__1__Impl rule__NewfreshExpression__Group_1__2 )
+            // InternalFormalML.g:54667:2: rule__NewfreshExpression__Group_1__1__Impl rule__NewfreshExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_258);
+            rule__NewfreshExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NewfreshExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_1__1__Impl"
+    // InternalFormalML.g:54674:1: rule__NewfreshExpression__Group_1__1__Impl : ( ( rule__NewfreshExpression__LeftHandSideAssignment_1_1 ) ) ;
+    public final void rule__NewfreshExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54678:1: ( ( ( rule__NewfreshExpression__LeftHandSideAssignment_1_1 ) ) )
+            // InternalFormalML.g:54679:1: ( ( rule__NewfreshExpression__LeftHandSideAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:54679:1: ( ( rule__NewfreshExpression__LeftHandSideAssignment_1_1 ) )
+            // InternalFormalML.g:54680:2: ( rule__NewfreshExpression__LeftHandSideAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_1_1()); 
+            }
+            // InternalFormalML.g:54681:2: ( rule__NewfreshExpression__LeftHandSideAssignment_1_1 )
+            // InternalFormalML.g:54681:3: rule__NewfreshExpression__LeftHandSideAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NewfreshExpression__LeftHandSideAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_1__2"
+    // InternalFormalML.g:54689:1: rule__NewfreshExpression__Group_1__2 : rule__NewfreshExpression__Group_1__2__Impl rule__NewfreshExpression__Group_1__3 ;
+    public final void rule__NewfreshExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54693:1: ( rule__NewfreshExpression__Group_1__2__Impl rule__NewfreshExpression__Group_1__3 )
+            // InternalFormalML.g:54694:2: rule__NewfreshExpression__Group_1__2__Impl rule__NewfreshExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__NewfreshExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NewfreshExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_1__2__Impl"
+    // InternalFormalML.g:54701:1: rule__NewfreshExpression__Group_1__2__Impl : ( 'newfresh' ) ;
+    public final void rule__NewfreshExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54705:1: ( ( 'newfresh' ) )
+            // InternalFormalML.g:54706:1: ( 'newfresh' )
+            {
+            // InternalFormalML.g:54706:1: ( 'newfresh' )
+            // InternalFormalML.g:54707:2: 'newfresh'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_1_2()); 
+            }
+            match(input,261,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_1__3"
+    // InternalFormalML.g:54716:1: rule__NewfreshExpression__Group_1__3 : rule__NewfreshExpression__Group_1__3__Impl ;
+    public final void rule__NewfreshExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54720:1: ( rule__NewfreshExpression__Group_1__3__Impl )
+            // InternalFormalML.g:54721:2: rule__NewfreshExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NewfreshExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__NewfreshExpression__Group_1__3__Impl"
+    // InternalFormalML.g:54727:1: rule__NewfreshExpression__Group_1__3__Impl : ( ')' ) ;
+    public final void rule__NewfreshExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54731:1: ( ( ')' ) )
+            // InternalFormalML.g:54732:1: ( ')' )
+            {
+            // InternalFormalML.g:54732:1: ( ')' )
+            // InternalFormalML.g:54733:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionAccess().getRightParenthesisKeyword_1_3()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionAccess().getRightParenthesisKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__CastExpression__Group__0"
+    // InternalFormalML.g:54743:1: rule__CastExpression__Group__0 : rule__CastExpression__Group__0__Impl rule__CastExpression__Group__1 ;
+    public final void rule__CastExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54747:1: ( rule__CastExpression__Group__0__Impl rule__CastExpression__Group__1 )
+            // InternalFormalML.g:54748:2: rule__CastExpression__Group__0__Impl rule__CastExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_10);
+            rule__CastExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__0"
+
+
+    // $ANTLR start "rule__CastExpression__Group__0__Impl"
+    // InternalFormalML.g:54755:1: rule__CastExpression__Group__0__Impl : ( 'ctor' ) ;
+    public final void rule__CastExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54759:1: ( ( 'ctor' ) )
+            // InternalFormalML.g:54760:1: ( 'ctor' )
+            {
+            // InternalFormalML.g:54760:1: ( 'ctor' )
+            // InternalFormalML.g:54761:2: 'ctor'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getCtorKeyword_0()); 
+            }
+            match(input,263,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getCtorKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__CastExpression__Group__1"
+    // InternalFormalML.g:54770:1: rule__CastExpression__Group__1 : rule__CastExpression__Group__1__Impl rule__CastExpression__Group__2 ;
+    public final void rule__CastExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54774:1: ( rule__CastExpression__Group__1__Impl rule__CastExpression__Group__2 )
+            // InternalFormalML.g:54775:2: rule__CastExpression__Group__1__Impl rule__CastExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_50);
+            rule__CastExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__1"
+
+
+    // $ANTLR start "rule__CastExpression__Group__1__Impl"
+    // InternalFormalML.g:54782:1: rule__CastExpression__Group__1__Impl : ( '<' ) ;
+    public final void rule__CastExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54786:1: ( ( '<' ) )
+            // InternalFormalML.g:54787:1: ( '<' )
+            {
+            // InternalFormalML.g:54787:1: ( '<' )
+            // InternalFormalML.g:54788:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getLessThanSignKeyword_1()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getLessThanSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__CastExpression__Group__2"
+    // InternalFormalML.g:54797:1: rule__CastExpression__Group__2 : rule__CastExpression__Group__2__Impl rule__CastExpression__Group__3 ;
+    public final void rule__CastExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54801:1: ( rule__CastExpression__Group__2__Impl rule__CastExpression__Group__3 )
+            // InternalFormalML.g:54802:2: rule__CastExpression__Group__2__Impl rule__CastExpression__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__CastExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__2"
+
+
+    // $ANTLR start "rule__CastExpression__Group__2__Impl"
+    // InternalFormalML.g:54809:1: rule__CastExpression__Group__2__Impl : ( ( rule__CastExpression__DatatypeAssignment_2 ) ) ;
+    public final void rule__CastExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54813:1: ( ( ( rule__CastExpression__DatatypeAssignment_2 ) ) )
+            // InternalFormalML.g:54814:1: ( ( rule__CastExpression__DatatypeAssignment_2 ) )
+            {
+            // InternalFormalML.g:54814:1: ( ( rule__CastExpression__DatatypeAssignment_2 ) )
+            // InternalFormalML.g:54815:2: ( rule__CastExpression__DatatypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getDatatypeAssignment_2()); 
+            }
+            // InternalFormalML.g:54816:2: ( rule__CastExpression__DatatypeAssignment_2 )
+            // InternalFormalML.g:54816:3: rule__CastExpression__DatatypeAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__DatatypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getDatatypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__CastExpression__Group__3"
+    // InternalFormalML.g:54824:1: rule__CastExpression__Group__3 : rule__CastExpression__Group__3__Impl rule__CastExpression__Group__4 ;
+    public final void rule__CastExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54828:1: ( rule__CastExpression__Group__3__Impl rule__CastExpression__Group__4 )
+            // InternalFormalML.g:54829:2: rule__CastExpression__Group__3__Impl rule__CastExpression__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_217);
+            rule__CastExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__3"
+
+
+    // $ANTLR start "rule__CastExpression__Group__3__Impl"
+    // InternalFormalML.g:54836:1: rule__CastExpression__Group__3__Impl : ( '>' ) ;
+    public final void rule__CastExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54840:1: ( ( '>' ) )
+            // InternalFormalML.g:54841:1: ( '>' )
+            {
+            // InternalFormalML.g:54841:1: ( '>' )
+            // InternalFormalML.g:54842:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getGreaterThanSignKeyword_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getGreaterThanSignKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__CastExpression__Group__4"
+    // InternalFormalML.g:54851:1: rule__CastExpression__Group__4 : rule__CastExpression__Group__4__Impl rule__CastExpression__Group__5 ;
+    public final void rule__CastExpression__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54855:1: ( rule__CastExpression__Group__4__Impl rule__CastExpression__Group__5 )
+            // InternalFormalML.g:54856:2: rule__CastExpression__Group__4__Impl rule__CastExpression__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__CastExpression__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__4"
+
+
+    // $ANTLR start "rule__CastExpression__Group__4__Impl"
+    // InternalFormalML.g:54863:1: rule__CastExpression__Group__4__Impl : ( '(' ) ;
+    public final void rule__CastExpression__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54867:1: ( ( '(' ) )
+            // InternalFormalML.g:54868:1: ( '(' )
+            {
+            // InternalFormalML.g:54868:1: ( '(' )
+            // InternalFormalML.g:54869:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getLeftParenthesisKeyword_4()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getLeftParenthesisKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__4__Impl"
+
+
+    // $ANTLR start "rule__CastExpression__Group__5"
+    // InternalFormalML.g:54878:1: rule__CastExpression__Group__5 : rule__CastExpression__Group__5__Impl rule__CastExpression__Group__6 ;
+    public final void rule__CastExpression__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54882:1: ( rule__CastExpression__Group__5__Impl rule__CastExpression__Group__6 )
+            // InternalFormalML.g:54883:2: rule__CastExpression__Group__5__Impl rule__CastExpression__Group__6
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__CastExpression__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__5"
+
+
+    // $ANTLR start "rule__CastExpression__Group__5__Impl"
+    // InternalFormalML.g:54890:1: rule__CastExpression__Group__5__Impl : ( ( rule__CastExpression__OperandAssignment_5 ) ) ;
+    public final void rule__CastExpression__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54894:1: ( ( ( rule__CastExpression__OperandAssignment_5 ) ) )
+            // InternalFormalML.g:54895:1: ( ( rule__CastExpression__OperandAssignment_5 ) )
+            {
+            // InternalFormalML.g:54895:1: ( ( rule__CastExpression__OperandAssignment_5 ) )
+            // InternalFormalML.g:54896:2: ( rule__CastExpression__OperandAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getOperandAssignment_5()); 
+            }
+            // InternalFormalML.g:54897:2: ( rule__CastExpression__OperandAssignment_5 )
+            // InternalFormalML.g:54897:3: rule__CastExpression__OperandAssignment_5
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__OperandAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getOperandAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__5__Impl"
+
+
+    // $ANTLR start "rule__CastExpression__Group__6"
+    // InternalFormalML.g:54905:1: rule__CastExpression__Group__6 : rule__CastExpression__Group__6__Impl ;
+    public final void rule__CastExpression__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54909:1: ( rule__CastExpression__Group__6__Impl )
+            // InternalFormalML.g:54910:2: rule__CastExpression__Group__6__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__CastExpression__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__6"
+
+
+    // $ANTLR start "rule__CastExpression__Group__6__Impl"
+    // InternalFormalML.g:54916:1: rule__CastExpression__Group__6__Impl : ( ')' ) ;
+    public final void rule__CastExpression__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54920:1: ( ( ')' ) )
+            // InternalFormalML.g:54921:1: ( ')' )
+            {
+            // InternalFormalML.g:54921:1: ( ')' )
+            // InternalFormalML.g:54922:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getRightParenthesisKeyword_6()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getRightParenthesisKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__Group__6__Impl"
+
+
+    // $ANTLR start "rule__ArithmeticUnaryExpression__Group__0"
+    // InternalFormalML.g:54932:1: rule__ArithmeticUnaryExpression__Group__0 : rule__ArithmeticUnaryExpression__Group__0__Impl rule__ArithmeticUnaryExpression__Group__1 ;
+    public final void rule__ArithmeticUnaryExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54936:1: ( rule__ArithmeticUnaryExpression__Group__0__Impl rule__ArithmeticUnaryExpression__Group__1 )
+            // InternalFormalML.g:54937:2: rule__ArithmeticUnaryExpression__Group__0__Impl rule__ArithmeticUnaryExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ArithmeticUnaryExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ArithmeticUnaryExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArithmeticUnaryExpression__Group__0"
+
+
+    // $ANTLR start "rule__ArithmeticUnaryExpression__Group__0__Impl"
+    // InternalFormalML.g:54944:1: rule__ArithmeticUnaryExpression__Group__0__Impl : ( ( rule__ArithmeticUnaryExpression__OperatorAssignment_0 ) ) ;
+    public final void rule__ArithmeticUnaryExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54948:1: ( ( ( rule__ArithmeticUnaryExpression__OperatorAssignment_0 ) ) )
+            // InternalFormalML.g:54949:1: ( ( rule__ArithmeticUnaryExpression__OperatorAssignment_0 ) )
+            {
+            // InternalFormalML.g:54949:1: ( ( rule__ArithmeticUnaryExpression__OperatorAssignment_0 ) )
+            // InternalFormalML.g:54950:2: ( rule__ArithmeticUnaryExpression__OperatorAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorAssignment_0()); 
+            }
+            // InternalFormalML.g:54951:2: ( rule__ArithmeticUnaryExpression__OperatorAssignment_0 )
+            // InternalFormalML.g:54951:3: rule__ArithmeticUnaryExpression__OperatorAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ArithmeticUnaryExpression__OperatorAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArithmeticUnaryExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ArithmeticUnaryExpression__Group__1"
+    // InternalFormalML.g:54959:1: rule__ArithmeticUnaryExpression__Group__1 : rule__ArithmeticUnaryExpression__Group__1__Impl ;
+    public final void rule__ArithmeticUnaryExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54963:1: ( rule__ArithmeticUnaryExpression__Group__1__Impl )
+            // InternalFormalML.g:54964:2: rule__ArithmeticUnaryExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ArithmeticUnaryExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArithmeticUnaryExpression__Group__1"
+
+
+    // $ANTLR start "rule__ArithmeticUnaryExpression__Group__1__Impl"
+    // InternalFormalML.g:54970:1: rule__ArithmeticUnaryExpression__Group__1__Impl : ( ( rule__ArithmeticUnaryExpression__OperandAssignment_1 ) ) ;
+    public final void rule__ArithmeticUnaryExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54974:1: ( ( ( rule__ArithmeticUnaryExpression__OperandAssignment_1 ) ) )
+            // InternalFormalML.g:54975:1: ( ( rule__ArithmeticUnaryExpression__OperandAssignment_1 ) )
+            {
+            // InternalFormalML.g:54975:1: ( ( rule__ArithmeticUnaryExpression__OperandAssignment_1 ) )
+            // InternalFormalML.g:54976:2: ( rule__ArithmeticUnaryExpression__OperandAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandAssignment_1()); 
+            }
+            // InternalFormalML.g:54977:2: ( rule__ArithmeticUnaryExpression__OperandAssignment_1 )
+            // InternalFormalML.g:54977:3: rule__ArithmeticUnaryExpression__OperandAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ArithmeticUnaryExpression__OperandAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArithmeticUnaryExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LogicalUnaryExpression__Group__0"
+    // InternalFormalML.g:54986:1: rule__LogicalUnaryExpression__Group__0 : rule__LogicalUnaryExpression__Group__0__Impl rule__LogicalUnaryExpression__Group__1 ;
+    public final void rule__LogicalUnaryExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:54990:1: ( rule__LogicalUnaryExpression__Group__0__Impl rule__LogicalUnaryExpression__Group__1 )
+            // InternalFormalML.g:54991:2: rule__LogicalUnaryExpression__Group__0__Impl rule__LogicalUnaryExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__LogicalUnaryExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalUnaryExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalUnaryExpression__Group__0"
+
+
+    // $ANTLR start "rule__LogicalUnaryExpression__Group__0__Impl"
+    // InternalFormalML.g:54998:1: rule__LogicalUnaryExpression__Group__0__Impl : ( ( rule__LogicalUnaryExpression__OperatorAssignment_0 ) ) ;
+    public final void rule__LogicalUnaryExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55002:1: ( ( ( rule__LogicalUnaryExpression__OperatorAssignment_0 ) ) )
+            // InternalFormalML.g:55003:1: ( ( rule__LogicalUnaryExpression__OperatorAssignment_0 ) )
+            {
+            // InternalFormalML.g:55003:1: ( ( rule__LogicalUnaryExpression__OperatorAssignment_0 ) )
+            // InternalFormalML.g:55004:2: ( rule__LogicalUnaryExpression__OperatorAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAssignment_0()); 
+            }
+            // InternalFormalML.g:55005:2: ( rule__LogicalUnaryExpression__OperatorAssignment_0 )
+            // InternalFormalML.g:55005:3: rule__LogicalUnaryExpression__OperatorAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalUnaryExpression__OperatorAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalUnaryExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LogicalUnaryExpression__Group__1"
+    // InternalFormalML.g:55013:1: rule__LogicalUnaryExpression__Group__1 : rule__LogicalUnaryExpression__Group__1__Impl ;
+    public final void rule__LogicalUnaryExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55017:1: ( rule__LogicalUnaryExpression__Group__1__Impl )
+            // InternalFormalML.g:55018:2: rule__LogicalUnaryExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalUnaryExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalUnaryExpression__Group__1"
+
+
+    // $ANTLR start "rule__LogicalUnaryExpression__Group__1__Impl"
+    // InternalFormalML.g:55024:1: rule__LogicalUnaryExpression__Group__1__Impl : ( ( rule__LogicalUnaryExpression__OperandAssignment_1 ) ) ;
+    public final void rule__LogicalUnaryExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55028:1: ( ( ( rule__LogicalUnaryExpression__OperandAssignment_1 ) ) )
+            // InternalFormalML.g:55029:1: ( ( rule__LogicalUnaryExpression__OperandAssignment_1 ) )
+            {
+            // InternalFormalML.g:55029:1: ( ( rule__LogicalUnaryExpression__OperandAssignment_1 ) )
+            // InternalFormalML.g:55030:2: ( rule__LogicalUnaryExpression__OperandAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalUnaryExpressionAccess().getOperandAssignment_1()); 
+            }
+            // InternalFormalML.g:55031:2: ( rule__LogicalUnaryExpression__OperandAssignment_1 )
+            // InternalFormalML.g:55031:3: rule__LogicalUnaryExpression__OperandAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalUnaryExpression__OperandAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalUnaryExpressionAccess().getOperandAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalUnaryExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__BitwiseUnaryExpression__Group__0"
+    // InternalFormalML.g:55040:1: rule__BitwiseUnaryExpression__Group__0 : rule__BitwiseUnaryExpression__Group__0__Impl rule__BitwiseUnaryExpression__Group__1 ;
+    public final void rule__BitwiseUnaryExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55044:1: ( rule__BitwiseUnaryExpression__Group__0__Impl rule__BitwiseUnaryExpression__Group__1 )
+            // InternalFormalML.g:55045:2: rule__BitwiseUnaryExpression__Group__0__Impl rule__BitwiseUnaryExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__BitwiseUnaryExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseUnaryExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseUnaryExpression__Group__0"
+
+
+    // $ANTLR start "rule__BitwiseUnaryExpression__Group__0__Impl"
+    // InternalFormalML.g:55052:1: rule__BitwiseUnaryExpression__Group__0__Impl : ( ( rule__BitwiseUnaryExpression__OperatorAssignment_0 ) ) ;
+    public final void rule__BitwiseUnaryExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55056:1: ( ( ( rule__BitwiseUnaryExpression__OperatorAssignment_0 ) ) )
+            // InternalFormalML.g:55057:1: ( ( rule__BitwiseUnaryExpression__OperatorAssignment_0 ) )
+            {
+            // InternalFormalML.g:55057:1: ( ( rule__BitwiseUnaryExpression__OperatorAssignment_0 ) )
+            // InternalFormalML.g:55058:2: ( rule__BitwiseUnaryExpression__OperatorAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorAssignment_0()); 
+            }
+            // InternalFormalML.g:55059:2: ( rule__BitwiseUnaryExpression__OperatorAssignment_0 )
+            // InternalFormalML.g:55059:3: rule__BitwiseUnaryExpression__OperatorAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseUnaryExpression__OperatorAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseUnaryExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__BitwiseUnaryExpression__Group__1"
+    // InternalFormalML.g:55067:1: rule__BitwiseUnaryExpression__Group__1 : rule__BitwiseUnaryExpression__Group__1__Impl ;
+    public final void rule__BitwiseUnaryExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55071:1: ( rule__BitwiseUnaryExpression__Group__1__Impl )
+            // InternalFormalML.g:55072:2: rule__BitwiseUnaryExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseUnaryExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseUnaryExpression__Group__1"
+
+
+    // $ANTLR start "rule__BitwiseUnaryExpression__Group__1__Impl"
+    // InternalFormalML.g:55078:1: rule__BitwiseUnaryExpression__Group__1__Impl : ( ( rule__BitwiseUnaryExpression__OperandAssignment_1 ) ) ;
+    public final void rule__BitwiseUnaryExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55082:1: ( ( ( rule__BitwiseUnaryExpression__OperandAssignment_1 ) ) )
+            // InternalFormalML.g:55083:1: ( ( rule__BitwiseUnaryExpression__OperandAssignment_1 ) )
+            {
+            // InternalFormalML.g:55083:1: ( ( rule__BitwiseUnaryExpression__OperandAssignment_1 ) )
+            // InternalFormalML.g:55084:2: ( rule__BitwiseUnaryExpression__OperandAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandAssignment_1()); 
+            }
+            // InternalFormalML.g:55085:2: ( rule__BitwiseUnaryExpression__OperandAssignment_1 )
+            // InternalFormalML.g:55085:3: rule__BitwiseUnaryExpression__OperandAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BitwiseUnaryExpression__OperandAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseUnaryExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group__0"
+    // InternalFormalML.g:55094:1: rule__PrimaryExpression__Group__0 : rule__PrimaryExpression__Group__0__Impl rule__PrimaryExpression__Group__1 ;
+    public final void rule__PrimaryExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55098:1: ( rule__PrimaryExpression__Group__0__Impl rule__PrimaryExpression__Group__1 )
+            // InternalFormalML.g:55099:2: rule__PrimaryExpression__Group__0__Impl rule__PrimaryExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__PrimaryExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group__0__Impl"
+    // InternalFormalML.g:55106:1: rule__PrimaryExpression__Group__0__Impl : ( ruleBaseExpression ) ;
+    public final void rule__PrimaryExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55110:1: ( ( ruleBaseExpression ) )
+            // InternalFormalML.g:55111:1: ( ruleBaseExpression )
+            {
+            // InternalFormalML.g:55111:1: ( ruleBaseExpression )
+            // InternalFormalML.g:55112:2: ruleBaseExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getBaseExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBaseExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getBaseExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group__1"
+    // InternalFormalML.g:55121:1: rule__PrimaryExpression__Group__1 : rule__PrimaryExpression__Group__1__Impl rule__PrimaryExpression__Group__2 ;
+    public final void rule__PrimaryExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55125:1: ( rule__PrimaryExpression__Group__1__Impl rule__PrimaryExpression__Group__2 )
+            // InternalFormalML.g:55126:2: rule__PrimaryExpression__Group__1__Impl rule__PrimaryExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__PrimaryExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group__1__Impl"
+    // InternalFormalML.g:55133:1: rule__PrimaryExpression__Group__1__Impl : ( ( rule__PrimaryExpression__Group_1__0 )* ) ;
+    public final void rule__PrimaryExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55137:1: ( ( ( rule__PrimaryExpression__Group_1__0 )* ) )
+            // InternalFormalML.g:55138:1: ( ( rule__PrimaryExpression__Group_1__0 )* )
+            {
+            // InternalFormalML.g:55138:1: ( ( rule__PrimaryExpression__Group_1__0 )* )
+            // InternalFormalML.g:55139:2: ( rule__PrimaryExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:55140:2: ( rule__PrimaryExpression__Group_1__0 )*
+            loop676:
+            do {
+                int alt676=2;
+                int LA676_0 = input.LA(1);
+
+                if ( (LA676_0==20) ) {
+                    int LA676_2 = input.LA(2);
+
+                    if ( (LA676_2==RULE_XLIA_ID) ) {
+                        alt676=1;
+                    }
+
+
+                }
+
+
+                switch (alt676) {
+            	case 1 :
+            	    // InternalFormalML.g:55140:3: rule__PrimaryExpression__Group_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_259);
+            	    rule__PrimaryExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop676;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group__2"
+    // InternalFormalML.g:55148:1: rule__PrimaryExpression__Group__2 : rule__PrimaryExpression__Group__2__Impl ;
+    public final void rule__PrimaryExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55152:1: ( rule__PrimaryExpression__Group__2__Impl )
+            // InternalFormalML.g:55153:2: rule__PrimaryExpression__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group__2__Impl"
+    // InternalFormalML.g:55159:1: rule__PrimaryExpression__Group__2__Impl : ( ( rule__PrimaryExpression__Group_2__0 )? ) ;
+    public final void rule__PrimaryExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55163:1: ( ( ( rule__PrimaryExpression__Group_2__0 )? ) )
+            // InternalFormalML.g:55164:1: ( ( rule__PrimaryExpression__Group_2__0 )? )
+            {
+            // InternalFormalML.g:55164:1: ( ( rule__PrimaryExpression__Group_2__0 )? )
+            // InternalFormalML.g:55165:2: ( rule__PrimaryExpression__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:55166:2: ( rule__PrimaryExpression__Group_2__0 )?
+            int alt677=2;
+            int LA677_0 = input.LA(1);
+
+            if ( (LA677_0==21) ) {
+                alt677=1;
+            }
+            switch (alt677) {
+                case 1 :
+                    // InternalFormalML.g:55166:3: rule__PrimaryExpression__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__0"
+    // InternalFormalML.g:55175:1: rule__PrimaryExpression__Group_1__0 : rule__PrimaryExpression__Group_1__0__Impl rule__PrimaryExpression__Group_1__1 ;
+    public final void rule__PrimaryExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55179:1: ( rule__PrimaryExpression__Group_1__0__Impl rule__PrimaryExpression__Group_1__1 )
+            // InternalFormalML.g:55180:2: rule__PrimaryExpression__Group_1__0__Impl rule__PrimaryExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_260);
+            rule__PrimaryExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__0__Impl"
+    // InternalFormalML.g:55187:1: rule__PrimaryExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__PrimaryExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55191:1: ( ( () ) )
+            // InternalFormalML.g:55192:1: ( () )
+            {
+            // InternalFormalML.g:55192:1: ( () )
+            // InternalFormalML.g:55193:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0()); 
+            }
+            // InternalFormalML.g:55194:2: ()
+            // InternalFormalML.g:55194:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__1"
+    // InternalFormalML.g:55202:1: rule__PrimaryExpression__Group_1__1 : rule__PrimaryExpression__Group_1__1__Impl rule__PrimaryExpression__Group_1__2 ;
+    public final void rule__PrimaryExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55206:1: ( rule__PrimaryExpression__Group_1__1__Impl rule__PrimaryExpression__Group_1__2 )
+            // InternalFormalML.g:55207:2: rule__PrimaryExpression__Group_1__1__Impl rule__PrimaryExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__PrimaryExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__1__Impl"
+    // InternalFormalML.g:55214:1: rule__PrimaryExpression__Group_1__1__Impl : ( '.' ) ;
+    public final void rule__PrimaryExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55218:1: ( ( '.' ) )
+            // InternalFormalML.g:55219:1: ( '.' )
+            {
+            // InternalFormalML.g:55219:1: ( '.' )
+            // InternalFormalML.g:55220:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_1_1()); 
+            }
+            match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__2"
+    // InternalFormalML.g:55229:1: rule__PrimaryExpression__Group_1__2 : rule__PrimaryExpression__Group_1__2__Impl rule__PrimaryExpression__Group_1__3 ;
+    public final void rule__PrimaryExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55233:1: ( rule__PrimaryExpression__Group_1__2__Impl rule__PrimaryExpression__Group_1__3 )
+            // InternalFormalML.g:55234:2: rule__PrimaryExpression__Group_1__2__Impl rule__PrimaryExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_261);
+            rule__PrimaryExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__2__Impl"
+    // InternalFormalML.g:55241:1: rule__PrimaryExpression__Group_1__2__Impl : ( ( rule__PrimaryExpression__ElementAssignment_1_2 ) ) ;
+    public final void rule__PrimaryExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55245:1: ( ( ( rule__PrimaryExpression__ElementAssignment_1_2 ) ) )
+            // InternalFormalML.g:55246:1: ( ( rule__PrimaryExpression__ElementAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:55246:1: ( ( rule__PrimaryExpression__ElementAssignment_1_2 ) )
+            // InternalFormalML.g:55247:2: ( rule__PrimaryExpression__ElementAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_1_2()); 
+            }
+            // InternalFormalML.g:55248:2: ( rule__PrimaryExpression__ElementAssignment_1_2 )
+            // InternalFormalML.g:55248:3: rule__PrimaryExpression__ElementAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__ElementAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__3"
+    // InternalFormalML.g:55256:1: rule__PrimaryExpression__Group_1__3 : rule__PrimaryExpression__Group_1__3__Impl ;
+    public final void rule__PrimaryExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55260:1: ( rule__PrimaryExpression__Group_1__3__Impl )
+            // InternalFormalML.g:55261:2: rule__PrimaryExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1__3__Impl"
+    // InternalFormalML.g:55267:1: rule__PrimaryExpression__Group_1__3__Impl : ( ( rule__PrimaryExpression__Alternatives_1_3 )? ) ;
+    public final void rule__PrimaryExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55271:1: ( ( ( rule__PrimaryExpression__Alternatives_1_3 )? ) )
+            // InternalFormalML.g:55272:1: ( ( rule__PrimaryExpression__Alternatives_1_3 )? )
+            {
+            // InternalFormalML.g:55272:1: ( ( rule__PrimaryExpression__Alternatives_1_3 )? )
+            // InternalFormalML.g:55273:2: ( rule__PrimaryExpression__Alternatives_1_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getAlternatives_1_3()); 
+            }
+            // InternalFormalML.g:55274:2: ( rule__PrimaryExpression__Alternatives_1_3 )?
+            int alt678=2;
+            alt678 = dfa678.predict(input);
+            switch (alt678) {
+                case 1 :
+                    // InternalFormalML.g:55274:3: rule__PrimaryExpression__Alternatives_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Alternatives_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getAlternatives_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_0__0"
+    // InternalFormalML.g:55283:1: rule__PrimaryExpression__Group_1_3_0__0 : rule__PrimaryExpression__Group_1_3_0__0__Impl rule__PrimaryExpression__Group_1_3_0__1 ;
+    public final void rule__PrimaryExpression__Group_1_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55287:1: ( rule__PrimaryExpression__Group_1_3_0__0__Impl rule__PrimaryExpression__Group_1_3_0__1 )
+            // InternalFormalML.g:55288:2: rule__PrimaryExpression__Group_1_3_0__0__Impl rule__PrimaryExpression__Group_1_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__PrimaryExpression__Group_1_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_0__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_0__0__Impl"
+    // InternalFormalML.g:55295:1: rule__PrimaryExpression__Group_1_3_0__0__Impl : ( ( rule__PrimaryExpression__KindAssignment_1_3_0_0 ) ) ;
+    public final void rule__PrimaryExpression__Group_1_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55299:1: ( ( ( rule__PrimaryExpression__KindAssignment_1_3_0_0 ) ) )
+            // InternalFormalML.g:55300:1: ( ( rule__PrimaryExpression__KindAssignment_1_3_0_0 ) )
+            {
+            // InternalFormalML.g:55300:1: ( ( rule__PrimaryExpression__KindAssignment_1_3_0_0 ) )
+            // InternalFormalML.g:55301:2: ( rule__PrimaryExpression__KindAssignment_1_3_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_0_0()); 
+            }
+            // InternalFormalML.g:55302:2: ( rule__PrimaryExpression__KindAssignment_1_3_0_0 )
+            // InternalFormalML.g:55302:3: rule__PrimaryExpression__KindAssignment_1_3_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__KindAssignment_1_3_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_0__1"
+    // InternalFormalML.g:55310:1: rule__PrimaryExpression__Group_1_3_0__1 : rule__PrimaryExpression__Group_1_3_0__1__Impl rule__PrimaryExpression__Group_1_3_0__2 ;
+    public final void rule__PrimaryExpression__Group_1_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55314:1: ( rule__PrimaryExpression__Group_1_3_0__1__Impl rule__PrimaryExpression__Group_1_3_0__2 )
+            // InternalFormalML.g:55315:2: rule__PrimaryExpression__Group_1_3_0__1__Impl rule__PrimaryExpression__Group_1_3_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__PrimaryExpression__Group_1_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1_3_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_0__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_0__1__Impl"
+    // InternalFormalML.g:55322:1: rule__PrimaryExpression__Group_1_3_0__1__Impl : ( ( rule__PrimaryExpression__ArgAssignment_1_3_0_1 ) ) ;
+    public final void rule__PrimaryExpression__Group_1_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55326:1: ( ( ( rule__PrimaryExpression__ArgAssignment_1_3_0_1 ) ) )
+            // InternalFormalML.g:55327:1: ( ( rule__PrimaryExpression__ArgAssignment_1_3_0_1 ) )
+            {
+            // InternalFormalML.g:55327:1: ( ( rule__PrimaryExpression__ArgAssignment_1_3_0_1 ) )
+            // InternalFormalML.g:55328:2: ( rule__PrimaryExpression__ArgAssignment_1_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_0_1()); 
+            }
+            // InternalFormalML.g:55329:2: ( rule__PrimaryExpression__ArgAssignment_1_3_0_1 )
+            // InternalFormalML.g:55329:3: rule__PrimaryExpression__ArgAssignment_1_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__ArgAssignment_1_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_0__2"
+    // InternalFormalML.g:55337:1: rule__PrimaryExpression__Group_1_3_0__2 : rule__PrimaryExpression__Group_1_3_0__2__Impl ;
+    public final void rule__PrimaryExpression__Group_1_3_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55341:1: ( rule__PrimaryExpression__Group_1_3_0__2__Impl )
+            // InternalFormalML.g:55342:2: rule__PrimaryExpression__Group_1_3_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1_3_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_0__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_0__2__Impl"
+    // InternalFormalML.g:55348:1: rule__PrimaryExpression__Group_1_3_0__2__Impl : ( ']' ) ;
+    public final void rule__PrimaryExpression__Group_1_3_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55352:1: ( ( ']' ) )
+            // InternalFormalML.g:55353:1: ( ']' )
+            {
+            // InternalFormalML.g:55353:1: ( ']' )
+            // InternalFormalML.g:55354:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_1_3_0_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_1_3_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_0__2__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_1__0"
+    // InternalFormalML.g:55364:1: rule__PrimaryExpression__Group_1_3_1__0 : rule__PrimaryExpression__Group_1_3_1__0__Impl rule__PrimaryExpression__Group_1_3_1__1 ;
+    public final void rule__PrimaryExpression__Group_1_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55368:1: ( rule__PrimaryExpression__Group_1_3_1__0__Impl rule__PrimaryExpression__Group_1_3_1__1 )
+            // InternalFormalML.g:55369:2: rule__PrimaryExpression__Group_1_3_1__0__Impl rule__PrimaryExpression__Group_1_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__PrimaryExpression__Group_1_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_1__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_1__0__Impl"
+    // InternalFormalML.g:55376:1: rule__PrimaryExpression__Group_1_3_1__0__Impl : ( ( rule__PrimaryExpression__KindAssignment_1_3_1_0 ) ) ;
+    public final void rule__PrimaryExpression__Group_1_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55380:1: ( ( ( rule__PrimaryExpression__KindAssignment_1_3_1_0 ) ) )
+            // InternalFormalML.g:55381:1: ( ( rule__PrimaryExpression__KindAssignment_1_3_1_0 ) )
+            {
+            // InternalFormalML.g:55381:1: ( ( rule__PrimaryExpression__KindAssignment_1_3_1_0 ) )
+            // InternalFormalML.g:55382:2: ( rule__PrimaryExpression__KindAssignment_1_3_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_1_0()); 
+            }
+            // InternalFormalML.g:55383:2: ( rule__PrimaryExpression__KindAssignment_1_3_1_0 )
+            // InternalFormalML.g:55383:3: rule__PrimaryExpression__KindAssignment_1_3_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__KindAssignment_1_3_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_1__1"
+    // InternalFormalML.g:55391:1: rule__PrimaryExpression__Group_1_3_1__1 : rule__PrimaryExpression__Group_1_3_1__1__Impl rule__PrimaryExpression__Group_1_3_1__2 ;
+    public final void rule__PrimaryExpression__Group_1_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55395:1: ( rule__PrimaryExpression__Group_1_3_1__1__Impl rule__PrimaryExpression__Group_1_3_1__2 )
+            // InternalFormalML.g:55396:2: rule__PrimaryExpression__Group_1_3_1__1__Impl rule__PrimaryExpression__Group_1_3_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__PrimaryExpression__Group_1_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1_3_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_1__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_1__1__Impl"
+    // InternalFormalML.g:55403:1: rule__PrimaryExpression__Group_1_3_1__1__Impl : ( ( rule__PrimaryExpression__ArgAssignment_1_3_1_1 ) ) ;
+    public final void rule__PrimaryExpression__Group_1_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55407:1: ( ( ( rule__PrimaryExpression__ArgAssignment_1_3_1_1 ) ) )
+            // InternalFormalML.g:55408:1: ( ( rule__PrimaryExpression__ArgAssignment_1_3_1_1 ) )
+            {
+            // InternalFormalML.g:55408:1: ( ( rule__PrimaryExpression__ArgAssignment_1_3_1_1 ) )
+            // InternalFormalML.g:55409:2: ( rule__PrimaryExpression__ArgAssignment_1_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_1_1()); 
+            }
+            // InternalFormalML.g:55410:2: ( rule__PrimaryExpression__ArgAssignment_1_3_1_1 )
+            // InternalFormalML.g:55410:3: rule__PrimaryExpression__ArgAssignment_1_3_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__ArgAssignment_1_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_1_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_1__2"
+    // InternalFormalML.g:55418:1: rule__PrimaryExpression__Group_1_3_1__2 : rule__PrimaryExpression__Group_1_3_1__2__Impl ;
+    public final void rule__PrimaryExpression__Group_1_3_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55422:1: ( rule__PrimaryExpression__Group_1_3_1__2__Impl )
+            // InternalFormalML.g:55423:2: rule__PrimaryExpression__Group_1_3_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_1_3_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_1__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_1_3_1__2__Impl"
+    // InternalFormalML.g:55429:1: rule__PrimaryExpression__Group_1_3_1__2__Impl : ( ')' ) ;
+    public final void rule__PrimaryExpression__Group_1_3_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55433:1: ( ( ')' ) )
+            // InternalFormalML.g:55434:1: ( ')' )
+            {
+            // InternalFormalML.g:55434:1: ( ')' )
+            // InternalFormalML.g:55435:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_1_3_1_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_1_3_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_1_3_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__0"
+    // InternalFormalML.g:55445:1: rule__PrimaryExpression__Group_2__0 : rule__PrimaryExpression__Group_2__0__Impl rule__PrimaryExpression__Group_2__1 ;
+    public final void rule__PrimaryExpression__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55449:1: ( rule__PrimaryExpression__Group_2__0__Impl rule__PrimaryExpression__Group_2__1 )
+            // InternalFormalML.g:55450:2: rule__PrimaryExpression__Group_2__0__Impl rule__PrimaryExpression__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_262);
+            rule__PrimaryExpression__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__0__Impl"
+    // InternalFormalML.g:55457:1: rule__PrimaryExpression__Group_2__0__Impl : ( () ) ;
+    public final void rule__PrimaryExpression__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55461:1: ( ( () ) )
+            // InternalFormalML.g:55462:1: ( () )
+            {
+            // InternalFormalML.g:55462:1: ( () )
+            // InternalFormalML.g:55463:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0()); 
+            }
+            // InternalFormalML.g:55464:2: ()
+            // InternalFormalML.g:55464:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__1"
+    // InternalFormalML.g:55472:1: rule__PrimaryExpression__Group_2__1 : rule__PrimaryExpression__Group_2__1__Impl rule__PrimaryExpression__Group_2__2 ;
+    public final void rule__PrimaryExpression__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55476:1: ( rule__PrimaryExpression__Group_2__1__Impl rule__PrimaryExpression__Group_2__2 )
+            // InternalFormalML.g:55477:2: rule__PrimaryExpression__Group_2__1__Impl rule__PrimaryExpression__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__PrimaryExpression__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__1__Impl"
+    // InternalFormalML.g:55484:1: rule__PrimaryExpression__Group_2__1__Impl : ( '->' ) ;
+    public final void rule__PrimaryExpression__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55488:1: ( ( '->' ) )
+            // InternalFormalML.g:55489:1: ( '->' )
+            {
+            // InternalFormalML.g:55489:1: ( '->' )
+            // InternalFormalML.g:55490:2: '->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1()); 
+            }
+            match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__2"
+    // InternalFormalML.g:55499:1: rule__PrimaryExpression__Group_2__2 : rule__PrimaryExpression__Group_2__2__Impl rule__PrimaryExpression__Group_2__3 ;
+    public final void rule__PrimaryExpression__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55503:1: ( rule__PrimaryExpression__Group_2__2__Impl rule__PrimaryExpression__Group_2__3 )
+            // InternalFormalML.g:55504:2: rule__PrimaryExpression__Group_2__2__Impl rule__PrimaryExpression__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_263);
+            rule__PrimaryExpression__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__2__Impl"
+    // InternalFormalML.g:55511:1: rule__PrimaryExpression__Group_2__2__Impl : ( ( rule__PrimaryExpression__ElementAssignment_2_2 ) ) ;
+    public final void rule__PrimaryExpression__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55515:1: ( ( ( rule__PrimaryExpression__ElementAssignment_2_2 ) ) )
+            // InternalFormalML.g:55516:1: ( ( rule__PrimaryExpression__ElementAssignment_2_2 ) )
+            {
+            // InternalFormalML.g:55516:1: ( ( rule__PrimaryExpression__ElementAssignment_2_2 ) )
+            // InternalFormalML.g:55517:2: ( rule__PrimaryExpression__ElementAssignment_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_2()); 
+            }
+            // InternalFormalML.g:55518:2: ( rule__PrimaryExpression__ElementAssignment_2_2 )
+            // InternalFormalML.g:55518:3: rule__PrimaryExpression__ElementAssignment_2_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__ElementAssignment_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__3"
+    // InternalFormalML.g:55526:1: rule__PrimaryExpression__Group_2__3 : rule__PrimaryExpression__Group_2__3__Impl rule__PrimaryExpression__Group_2__4 ;
+    public final void rule__PrimaryExpression__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55530:1: ( rule__PrimaryExpression__Group_2__3__Impl rule__PrimaryExpression__Group_2__4 )
+            // InternalFormalML.g:55531:2: rule__PrimaryExpression__Group_2__3__Impl rule__PrimaryExpression__Group_2__4
+            {
+            pushFollow(FollowSets000.FOLLOW_263);
+            rule__PrimaryExpression__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__3"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__3__Impl"
+    // InternalFormalML.g:55538:1: rule__PrimaryExpression__Group_2__3__Impl : ( ( rule__PrimaryExpression__Alternatives_2_3 )? ) ;
+    public final void rule__PrimaryExpression__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55542:1: ( ( ( rule__PrimaryExpression__Alternatives_2_3 )? ) )
+            // InternalFormalML.g:55543:1: ( ( rule__PrimaryExpression__Alternatives_2_3 )? )
+            {
+            // InternalFormalML.g:55543:1: ( ( rule__PrimaryExpression__Alternatives_2_3 )? )
+            // InternalFormalML.g:55544:2: ( rule__PrimaryExpression__Alternatives_2_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_3()); 
+            }
+            // InternalFormalML.g:55545:2: ( rule__PrimaryExpression__Alternatives_2_3 )?
+            int alt679=2;
+            alt679 = dfa679.predict(input);
+            switch (alt679) {
+                case 1 :
+                    // InternalFormalML.g:55545:3: rule__PrimaryExpression__Alternatives_2_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Alternatives_2_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__4"
+    // InternalFormalML.g:55553:1: rule__PrimaryExpression__Group_2__4 : rule__PrimaryExpression__Group_2__4__Impl ;
+    public final void rule__PrimaryExpression__Group_2__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55557:1: ( rule__PrimaryExpression__Group_2__4__Impl )
+            // InternalFormalML.g:55558:2: rule__PrimaryExpression__Group_2__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__4"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2__4__Impl"
+    // InternalFormalML.g:55564:1: rule__PrimaryExpression__Group_2__4__Impl : ( ( rule__PrimaryExpression__Group_2_4__0 )* ) ;
+    public final void rule__PrimaryExpression__Group_2__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55568:1: ( ( ( rule__PrimaryExpression__Group_2_4__0 )* ) )
+            // InternalFormalML.g:55569:1: ( ( rule__PrimaryExpression__Group_2_4__0 )* )
+            {
+            // InternalFormalML.g:55569:1: ( ( rule__PrimaryExpression__Group_2_4__0 )* )
+            // InternalFormalML.g:55570:2: ( rule__PrimaryExpression__Group_2_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4()); 
+            }
+            // InternalFormalML.g:55571:2: ( rule__PrimaryExpression__Group_2_4__0 )*
+            loop680:
+            do {
+                int alt680=2;
+                int LA680_0 = input.LA(1);
+
+                if ( (LA680_0==20) ) {
+                    int LA680_2 = input.LA(2);
+
+                    if ( (LA680_2==RULE_XLIA_ID) ) {
+                        alt680=1;
+                    }
+
+
+                }
+
+
+                switch (alt680) {
+            	case 1 :
+            	    // InternalFormalML.g:55571:3: rule__PrimaryExpression__Group_2_4__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_259);
+            	    rule__PrimaryExpression__Group_2_4__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop680;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getGroup_2_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2__4__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_0__0"
+    // InternalFormalML.g:55580:1: rule__PrimaryExpression__Group_2_3_0__0 : rule__PrimaryExpression__Group_2_3_0__0__Impl rule__PrimaryExpression__Group_2_3_0__1 ;
+    public final void rule__PrimaryExpression__Group_2_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55584:1: ( rule__PrimaryExpression__Group_2_3_0__0__Impl rule__PrimaryExpression__Group_2_3_0__1 )
+            // InternalFormalML.g:55585:2: rule__PrimaryExpression__Group_2_3_0__0__Impl rule__PrimaryExpression__Group_2_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__PrimaryExpression__Group_2_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_0__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_0__0__Impl"
+    // InternalFormalML.g:55592:1: rule__PrimaryExpression__Group_2_3_0__0__Impl : ( ( rule__PrimaryExpression__KindAssignment_2_3_0_0 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55596:1: ( ( ( rule__PrimaryExpression__KindAssignment_2_3_0_0 ) ) )
+            // InternalFormalML.g:55597:1: ( ( rule__PrimaryExpression__KindAssignment_2_3_0_0 ) )
+            {
+            // InternalFormalML.g:55597:1: ( ( rule__PrimaryExpression__KindAssignment_2_3_0_0 ) )
+            // InternalFormalML.g:55598:2: ( rule__PrimaryExpression__KindAssignment_2_3_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_0_0()); 
+            }
+            // InternalFormalML.g:55599:2: ( rule__PrimaryExpression__KindAssignment_2_3_0_0 )
+            // InternalFormalML.g:55599:3: rule__PrimaryExpression__KindAssignment_2_3_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__KindAssignment_2_3_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_0__1"
+    // InternalFormalML.g:55607:1: rule__PrimaryExpression__Group_2_3_0__1 : rule__PrimaryExpression__Group_2_3_0__1__Impl rule__PrimaryExpression__Group_2_3_0__2 ;
+    public final void rule__PrimaryExpression__Group_2_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55611:1: ( rule__PrimaryExpression__Group_2_3_0__1__Impl rule__PrimaryExpression__Group_2_3_0__2 )
+            // InternalFormalML.g:55612:2: rule__PrimaryExpression__Group_2_3_0__1__Impl rule__PrimaryExpression__Group_2_3_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__PrimaryExpression__Group_2_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_3_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_0__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_0__1__Impl"
+    // InternalFormalML.g:55619:1: rule__PrimaryExpression__Group_2_3_0__1__Impl : ( ( rule__PrimaryExpression__ArgAssignment_2_3_0_1 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55623:1: ( ( ( rule__PrimaryExpression__ArgAssignment_2_3_0_1 ) ) )
+            // InternalFormalML.g:55624:1: ( ( rule__PrimaryExpression__ArgAssignment_2_3_0_1 ) )
+            {
+            // InternalFormalML.g:55624:1: ( ( rule__PrimaryExpression__ArgAssignment_2_3_0_1 ) )
+            // InternalFormalML.g:55625:2: ( rule__PrimaryExpression__ArgAssignment_2_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_0_1()); 
+            }
+            // InternalFormalML.g:55626:2: ( rule__PrimaryExpression__ArgAssignment_2_3_0_1 )
+            // InternalFormalML.g:55626:3: rule__PrimaryExpression__ArgAssignment_2_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__ArgAssignment_2_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_0__2"
+    // InternalFormalML.g:55634:1: rule__PrimaryExpression__Group_2_3_0__2 : rule__PrimaryExpression__Group_2_3_0__2__Impl ;
+    public final void rule__PrimaryExpression__Group_2_3_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55638:1: ( rule__PrimaryExpression__Group_2_3_0__2__Impl )
+            // InternalFormalML.g:55639:2: rule__PrimaryExpression__Group_2_3_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_3_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_0__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_0__2__Impl"
+    // InternalFormalML.g:55645:1: rule__PrimaryExpression__Group_2_3_0__2__Impl : ( ']' ) ;
+    public final void rule__PrimaryExpression__Group_2_3_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55649:1: ( ( ']' ) )
+            // InternalFormalML.g:55650:1: ( ']' )
+            {
+            // InternalFormalML.g:55650:1: ( ']' )
+            // InternalFormalML.g:55651:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_3_0_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_3_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_0__2__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_1__0"
+    // InternalFormalML.g:55661:1: rule__PrimaryExpression__Group_2_3_1__0 : rule__PrimaryExpression__Group_2_3_1__0__Impl rule__PrimaryExpression__Group_2_3_1__1 ;
+    public final void rule__PrimaryExpression__Group_2_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55665:1: ( rule__PrimaryExpression__Group_2_3_1__0__Impl rule__PrimaryExpression__Group_2_3_1__1 )
+            // InternalFormalML.g:55666:2: rule__PrimaryExpression__Group_2_3_1__0__Impl rule__PrimaryExpression__Group_2_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__PrimaryExpression__Group_2_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_1__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_1__0__Impl"
+    // InternalFormalML.g:55673:1: rule__PrimaryExpression__Group_2_3_1__0__Impl : ( ( rule__PrimaryExpression__KindAssignment_2_3_1_0 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55677:1: ( ( ( rule__PrimaryExpression__KindAssignment_2_3_1_0 ) ) )
+            // InternalFormalML.g:55678:1: ( ( rule__PrimaryExpression__KindAssignment_2_3_1_0 ) )
+            {
+            // InternalFormalML.g:55678:1: ( ( rule__PrimaryExpression__KindAssignment_2_3_1_0 ) )
+            // InternalFormalML.g:55679:2: ( rule__PrimaryExpression__KindAssignment_2_3_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_1_0()); 
+            }
+            // InternalFormalML.g:55680:2: ( rule__PrimaryExpression__KindAssignment_2_3_1_0 )
+            // InternalFormalML.g:55680:3: rule__PrimaryExpression__KindAssignment_2_3_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__KindAssignment_2_3_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_1__1"
+    // InternalFormalML.g:55688:1: rule__PrimaryExpression__Group_2_3_1__1 : rule__PrimaryExpression__Group_2_3_1__1__Impl rule__PrimaryExpression__Group_2_3_1__2 ;
+    public final void rule__PrimaryExpression__Group_2_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55692:1: ( rule__PrimaryExpression__Group_2_3_1__1__Impl rule__PrimaryExpression__Group_2_3_1__2 )
+            // InternalFormalML.g:55693:2: rule__PrimaryExpression__Group_2_3_1__1__Impl rule__PrimaryExpression__Group_2_3_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__PrimaryExpression__Group_2_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_3_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_1__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_1__1__Impl"
+    // InternalFormalML.g:55700:1: rule__PrimaryExpression__Group_2_3_1__1__Impl : ( ( rule__PrimaryExpression__ArgAssignment_2_3_1_1 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55704:1: ( ( ( rule__PrimaryExpression__ArgAssignment_2_3_1_1 ) ) )
+            // InternalFormalML.g:55705:1: ( ( rule__PrimaryExpression__ArgAssignment_2_3_1_1 ) )
+            {
+            // InternalFormalML.g:55705:1: ( ( rule__PrimaryExpression__ArgAssignment_2_3_1_1 ) )
+            // InternalFormalML.g:55706:2: ( rule__PrimaryExpression__ArgAssignment_2_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_1_1()); 
+            }
+            // InternalFormalML.g:55707:2: ( rule__PrimaryExpression__ArgAssignment_2_3_1_1 )
+            // InternalFormalML.g:55707:3: rule__PrimaryExpression__ArgAssignment_2_3_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__ArgAssignment_2_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_1__2"
+    // InternalFormalML.g:55715:1: rule__PrimaryExpression__Group_2_3_1__2 : rule__PrimaryExpression__Group_2_3_1__2__Impl ;
+    public final void rule__PrimaryExpression__Group_2_3_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55719:1: ( rule__PrimaryExpression__Group_2_3_1__2__Impl )
+            // InternalFormalML.g:55720:2: rule__PrimaryExpression__Group_2_3_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_3_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_1__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_3_1__2__Impl"
+    // InternalFormalML.g:55726:1: rule__PrimaryExpression__Group_2_3_1__2__Impl : ( ')' ) ;
+    public final void rule__PrimaryExpression__Group_2_3_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55730:1: ( ( ')' ) )
+            // InternalFormalML.g:55731:1: ( ')' )
+            {
+            // InternalFormalML.g:55731:1: ( ')' )
+            // InternalFormalML.g:55732:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_3_1_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_3_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_3_1__2__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4__0"
+    // InternalFormalML.g:55742:1: rule__PrimaryExpression__Group_2_4__0 : rule__PrimaryExpression__Group_2_4__0__Impl rule__PrimaryExpression__Group_2_4__1 ;
+    public final void rule__PrimaryExpression__Group_2_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55746:1: ( rule__PrimaryExpression__Group_2_4__0__Impl rule__PrimaryExpression__Group_2_4__1 )
+            // InternalFormalML.g:55747:2: rule__PrimaryExpression__Group_2_4__0__Impl rule__PrimaryExpression__Group_2_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_260);
+            rule__PrimaryExpression__Group_2_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4__0__Impl"
+    // InternalFormalML.g:55754:1: rule__PrimaryExpression__Group_2_4__0__Impl : ( () ) ;
+    public final void rule__PrimaryExpression__Group_2_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55758:1: ( ( () ) )
+            // InternalFormalML.g:55759:1: ( () )
+            {
+            // InternalFormalML.g:55759:1: ( () )
+            // InternalFormalML.g:55760:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()); 
+            }
+            // InternalFormalML.g:55761:2: ()
+            // InternalFormalML.g:55761:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4__1"
+    // InternalFormalML.g:55769:1: rule__PrimaryExpression__Group_2_4__1 : rule__PrimaryExpression__Group_2_4__1__Impl rule__PrimaryExpression__Group_2_4__2 ;
+    public final void rule__PrimaryExpression__Group_2_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55773:1: ( rule__PrimaryExpression__Group_2_4__1__Impl rule__PrimaryExpression__Group_2_4__2 )
+            // InternalFormalML.g:55774:2: rule__PrimaryExpression__Group_2_4__1__Impl rule__PrimaryExpression__Group_2_4__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__PrimaryExpression__Group_2_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4__1__Impl"
+    // InternalFormalML.g:55781:1: rule__PrimaryExpression__Group_2_4__1__Impl : ( '.' ) ;
+    public final void rule__PrimaryExpression__Group_2_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55785:1: ( ( '.' ) )
+            // InternalFormalML.g:55786:1: ( '.' )
+            {
+            // InternalFormalML.g:55786:1: ( '.' )
+            // InternalFormalML.g:55787:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_2_4_1()); 
+            }
+            match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_2_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4__2"
+    // InternalFormalML.g:55796:1: rule__PrimaryExpression__Group_2_4__2 : rule__PrimaryExpression__Group_2_4__2__Impl rule__PrimaryExpression__Group_2_4__3 ;
+    public final void rule__PrimaryExpression__Group_2_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55800:1: ( rule__PrimaryExpression__Group_2_4__2__Impl rule__PrimaryExpression__Group_2_4__3 )
+            // InternalFormalML.g:55801:2: rule__PrimaryExpression__Group_2_4__2__Impl rule__PrimaryExpression__Group_2_4__3
+            {
+            pushFollow(FollowSets000.FOLLOW_261);
+            rule__PrimaryExpression__Group_2_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4__2__Impl"
+    // InternalFormalML.g:55808:1: rule__PrimaryExpression__Group_2_4__2__Impl : ( ( rule__PrimaryExpression__ElementAssignment_2_4_2 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55812:1: ( ( ( rule__PrimaryExpression__ElementAssignment_2_4_2 ) ) )
+            // InternalFormalML.g:55813:1: ( ( rule__PrimaryExpression__ElementAssignment_2_4_2 ) )
+            {
+            // InternalFormalML.g:55813:1: ( ( rule__PrimaryExpression__ElementAssignment_2_4_2 ) )
+            // InternalFormalML.g:55814:2: ( rule__PrimaryExpression__ElementAssignment_2_4_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_4_2()); 
+            }
+            // InternalFormalML.g:55815:2: ( rule__PrimaryExpression__ElementAssignment_2_4_2 )
+            // InternalFormalML.g:55815:3: rule__PrimaryExpression__ElementAssignment_2_4_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__ElementAssignment_2_4_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getElementAssignment_2_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4__2__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4__3"
+    // InternalFormalML.g:55823:1: rule__PrimaryExpression__Group_2_4__3 : rule__PrimaryExpression__Group_2_4__3__Impl ;
+    public final void rule__PrimaryExpression__Group_2_4__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55827:1: ( rule__PrimaryExpression__Group_2_4__3__Impl )
+            // InternalFormalML.g:55828:2: rule__PrimaryExpression__Group_2_4__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4__3"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4__3__Impl"
+    // InternalFormalML.g:55834:1: rule__PrimaryExpression__Group_2_4__3__Impl : ( ( rule__PrimaryExpression__Alternatives_2_4_3 )? ) ;
+    public final void rule__PrimaryExpression__Group_2_4__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55838:1: ( ( ( rule__PrimaryExpression__Alternatives_2_4_3 )? ) )
+            // InternalFormalML.g:55839:1: ( ( rule__PrimaryExpression__Alternatives_2_4_3 )? )
+            {
+            // InternalFormalML.g:55839:1: ( ( rule__PrimaryExpression__Alternatives_2_4_3 )? )
+            // InternalFormalML.g:55840:2: ( rule__PrimaryExpression__Alternatives_2_4_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_4_3()); 
+            }
+            // InternalFormalML.g:55841:2: ( rule__PrimaryExpression__Alternatives_2_4_3 )?
+            int alt681=2;
+            alt681 = dfa681.predict(input);
+            switch (alt681) {
+                case 1 :
+                    // InternalFormalML.g:55841:3: rule__PrimaryExpression__Alternatives_2_4_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__PrimaryExpression__Alternatives_2_4_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getAlternatives_2_4_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4__3__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_0__0"
+    // InternalFormalML.g:55850:1: rule__PrimaryExpression__Group_2_4_3_0__0 : rule__PrimaryExpression__Group_2_4_3_0__0__Impl rule__PrimaryExpression__Group_2_4_3_0__1 ;
+    public final void rule__PrimaryExpression__Group_2_4_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55854:1: ( rule__PrimaryExpression__Group_2_4_3_0__0__Impl rule__PrimaryExpression__Group_2_4_3_0__1 )
+            // InternalFormalML.g:55855:2: rule__PrimaryExpression__Group_2_4_3_0__0__Impl rule__PrimaryExpression__Group_2_4_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__PrimaryExpression__Group_2_4_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_0__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_0__0__Impl"
+    // InternalFormalML.g:55862:1: rule__PrimaryExpression__Group_2_4_3_0__0__Impl : ( ( rule__PrimaryExpression__KindAssignment_2_4_3_0_0 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_4_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55866:1: ( ( ( rule__PrimaryExpression__KindAssignment_2_4_3_0_0 ) ) )
+            // InternalFormalML.g:55867:1: ( ( rule__PrimaryExpression__KindAssignment_2_4_3_0_0 ) )
+            {
+            // InternalFormalML.g:55867:1: ( ( rule__PrimaryExpression__KindAssignment_2_4_3_0_0 ) )
+            // InternalFormalML.g:55868:2: ( rule__PrimaryExpression__KindAssignment_2_4_3_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_0_0()); 
+            }
+            // InternalFormalML.g:55869:2: ( rule__PrimaryExpression__KindAssignment_2_4_3_0_0 )
+            // InternalFormalML.g:55869:3: rule__PrimaryExpression__KindAssignment_2_4_3_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__KindAssignment_2_4_3_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_0__1"
+    // InternalFormalML.g:55877:1: rule__PrimaryExpression__Group_2_4_3_0__1 : rule__PrimaryExpression__Group_2_4_3_0__1__Impl rule__PrimaryExpression__Group_2_4_3_0__2 ;
+    public final void rule__PrimaryExpression__Group_2_4_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55881:1: ( rule__PrimaryExpression__Group_2_4_3_0__1__Impl rule__PrimaryExpression__Group_2_4_3_0__2 )
+            // InternalFormalML.g:55882:2: rule__PrimaryExpression__Group_2_4_3_0__1__Impl rule__PrimaryExpression__Group_2_4_3_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__PrimaryExpression__Group_2_4_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4_3_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_0__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_0__1__Impl"
+    // InternalFormalML.g:55889:1: rule__PrimaryExpression__Group_2_4_3_0__1__Impl : ( ( rule__PrimaryExpression__ArgAssignment_2_4_3_0_1 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_4_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55893:1: ( ( ( rule__PrimaryExpression__ArgAssignment_2_4_3_0_1 ) ) )
+            // InternalFormalML.g:55894:1: ( ( rule__PrimaryExpression__ArgAssignment_2_4_3_0_1 ) )
+            {
+            // InternalFormalML.g:55894:1: ( ( rule__PrimaryExpression__ArgAssignment_2_4_3_0_1 ) )
+            // InternalFormalML.g:55895:2: ( rule__PrimaryExpression__ArgAssignment_2_4_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_0_1()); 
+            }
+            // InternalFormalML.g:55896:2: ( rule__PrimaryExpression__ArgAssignment_2_4_3_0_1 )
+            // InternalFormalML.g:55896:3: rule__PrimaryExpression__ArgAssignment_2_4_3_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__ArgAssignment_2_4_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_0__2"
+    // InternalFormalML.g:55904:1: rule__PrimaryExpression__Group_2_4_3_0__2 : rule__PrimaryExpression__Group_2_4_3_0__2__Impl ;
+    public final void rule__PrimaryExpression__Group_2_4_3_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55908:1: ( rule__PrimaryExpression__Group_2_4_3_0__2__Impl )
+            // InternalFormalML.g:55909:2: rule__PrimaryExpression__Group_2_4_3_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4_3_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_0__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_0__2__Impl"
+    // InternalFormalML.g:55915:1: rule__PrimaryExpression__Group_2_4_3_0__2__Impl : ( ']' ) ;
+    public final void rule__PrimaryExpression__Group_2_4_3_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55919:1: ( ( ']' ) )
+            // InternalFormalML.g:55920:1: ( ']' )
+            {
+            // InternalFormalML.g:55920:1: ( ']' )
+            // InternalFormalML.g:55921:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_4_3_0_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_4_3_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_0__2__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_1__0"
+    // InternalFormalML.g:55931:1: rule__PrimaryExpression__Group_2_4_3_1__0 : rule__PrimaryExpression__Group_2_4_3_1__0__Impl rule__PrimaryExpression__Group_2_4_3_1__1 ;
+    public final void rule__PrimaryExpression__Group_2_4_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55935:1: ( rule__PrimaryExpression__Group_2_4_3_1__0__Impl rule__PrimaryExpression__Group_2_4_3_1__1 )
+            // InternalFormalML.g:55936:2: rule__PrimaryExpression__Group_2_4_3_1__0__Impl rule__PrimaryExpression__Group_2_4_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__PrimaryExpression__Group_2_4_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_1__0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_1__0__Impl"
+    // InternalFormalML.g:55943:1: rule__PrimaryExpression__Group_2_4_3_1__0__Impl : ( ( rule__PrimaryExpression__KindAssignment_2_4_3_1_0 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_4_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55947:1: ( ( ( rule__PrimaryExpression__KindAssignment_2_4_3_1_0 ) ) )
+            // InternalFormalML.g:55948:1: ( ( rule__PrimaryExpression__KindAssignment_2_4_3_1_0 ) )
+            {
+            // InternalFormalML.g:55948:1: ( ( rule__PrimaryExpression__KindAssignment_2_4_3_1_0 ) )
+            // InternalFormalML.g:55949:2: ( rule__PrimaryExpression__KindAssignment_2_4_3_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_1_0()); 
+            }
+            // InternalFormalML.g:55950:2: ( rule__PrimaryExpression__KindAssignment_2_4_3_1_0 )
+            // InternalFormalML.g:55950:3: rule__PrimaryExpression__KindAssignment_2_4_3_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__KindAssignment_2_4_3_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindAssignment_2_4_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_1__1"
+    // InternalFormalML.g:55958:1: rule__PrimaryExpression__Group_2_4_3_1__1 : rule__PrimaryExpression__Group_2_4_3_1__1__Impl rule__PrimaryExpression__Group_2_4_3_1__2 ;
+    public final void rule__PrimaryExpression__Group_2_4_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55962:1: ( rule__PrimaryExpression__Group_2_4_3_1__1__Impl rule__PrimaryExpression__Group_2_4_3_1__2 )
+            // InternalFormalML.g:55963:2: rule__PrimaryExpression__Group_2_4_3_1__1__Impl rule__PrimaryExpression__Group_2_4_3_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__PrimaryExpression__Group_2_4_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4_3_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_1__1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_1__1__Impl"
+    // InternalFormalML.g:55970:1: rule__PrimaryExpression__Group_2_4_3_1__1__Impl : ( ( rule__PrimaryExpression__ArgAssignment_2_4_3_1_1 ) ) ;
+    public final void rule__PrimaryExpression__Group_2_4_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55974:1: ( ( ( rule__PrimaryExpression__ArgAssignment_2_4_3_1_1 ) ) )
+            // InternalFormalML.g:55975:1: ( ( rule__PrimaryExpression__ArgAssignment_2_4_3_1_1 ) )
+            {
+            // InternalFormalML.g:55975:1: ( ( rule__PrimaryExpression__ArgAssignment_2_4_3_1_1 ) )
+            // InternalFormalML.g:55976:2: ( rule__PrimaryExpression__ArgAssignment_2_4_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_1_1()); 
+            }
+            // InternalFormalML.g:55977:2: ( rule__PrimaryExpression__ArgAssignment_2_4_3_1_1 )
+            // InternalFormalML.g:55977:3: rule__PrimaryExpression__ArgAssignment_2_4_3_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__ArgAssignment_2_4_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgAssignment_2_4_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_1__2"
+    // InternalFormalML.g:55985:1: rule__PrimaryExpression__Group_2_4_3_1__2 : rule__PrimaryExpression__Group_2_4_3_1__2__Impl ;
+    public final void rule__PrimaryExpression__Group_2_4_3_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:55989:1: ( rule__PrimaryExpression__Group_2_4_3_1__2__Impl )
+            // InternalFormalML.g:55990:2: rule__PrimaryExpression__Group_2_4_3_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PrimaryExpression__Group_2_4_3_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_1__2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__Group_2_4_3_1__2__Impl"
+    // InternalFormalML.g:55996:1: rule__PrimaryExpression__Group_2_4_3_1__2__Impl : ( ')' ) ;
+    public final void rule__PrimaryExpression__Group_2_4_3_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56000:1: ( ( ')' ) )
+            // InternalFormalML.g:56001:1: ( ')' )
+            {
+            // InternalFormalML.g:56001:1: ( ')' )
+            // InternalFormalML.g:56002:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_4_3_1_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_4_3_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__Group_2_4_3_1__2__Impl"
+
+
+    // $ANTLR start "rule__BaseExpression__Group_1__0"
+    // InternalFormalML.g:56012:1: rule__BaseExpression__Group_1__0 : rule__BaseExpression__Group_1__0__Impl rule__BaseExpression__Group_1__1 ;
+    public final void rule__BaseExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56016:1: ( rule__BaseExpression__Group_1__0__Impl rule__BaseExpression__Group_1__1 )
+            // InternalFormalML.g:56017:2: rule__BaseExpression__Group_1__0__Impl rule__BaseExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__BaseExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BaseExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BaseExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__BaseExpression__Group_1__0__Impl"
+    // InternalFormalML.g:56024:1: rule__BaseExpression__Group_1__0__Impl : ( '(' ) ;
+    public final void rule__BaseExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56028:1: ( ( '(' ) )
+            // InternalFormalML.g:56029:1: ( '(' )
+            {
+            // InternalFormalML.g:56029:1: ( '(' )
+            // InternalFormalML.g:56030:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBaseExpressionAccess().getLeftParenthesisKeyword_1_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBaseExpressionAccess().getLeftParenthesisKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BaseExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__BaseExpression__Group_1__1"
+    // InternalFormalML.g:56039:1: rule__BaseExpression__Group_1__1 : rule__BaseExpression__Group_1__1__Impl rule__BaseExpression__Group_1__2 ;
+    public final void rule__BaseExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56043:1: ( rule__BaseExpression__Group_1__1__Impl rule__BaseExpression__Group_1__2 )
+            // InternalFormalML.g:56044:2: rule__BaseExpression__Group_1__1__Impl rule__BaseExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__BaseExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BaseExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BaseExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__BaseExpression__Group_1__1__Impl"
+    // InternalFormalML.g:56051:1: rule__BaseExpression__Group_1__1__Impl : ( ruleExpression ) ;
+    public final void rule__BaseExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56055:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:56056:1: ( ruleExpression )
+            {
+            // InternalFormalML.g:56056:1: ( ruleExpression )
+            // InternalFormalML.g:56057:2: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBaseExpressionAccess().getExpressionParserRuleCall_1_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBaseExpressionAccess().getExpressionParserRuleCall_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BaseExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__BaseExpression__Group_1__2"
+    // InternalFormalML.g:56066:1: rule__BaseExpression__Group_1__2 : rule__BaseExpression__Group_1__2__Impl ;
+    public final void rule__BaseExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56070:1: ( rule__BaseExpression__Group_1__2__Impl )
+            // InternalFormalML.g:56071:2: rule__BaseExpression__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__BaseExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BaseExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__BaseExpression__Group_1__2__Impl"
+    // InternalFormalML.g:56077:1: rule__BaseExpression__Group_1__2__Impl : ( ')' ) ;
+    public final void rule__BaseExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56081:1: ( ( ')' ) )
+            // InternalFormalML.g:56082:1: ( ')' )
+            {
+            // InternalFormalML.g:56082:1: ( ')' )
+            // InternalFormalML.g:56083:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBaseExpressionAccess().getRightParenthesisKeyword_1_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBaseExpressionAccess().getRightParenthesisKeyword_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BaseExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__0"
+    // InternalFormalML.g:56093:1: rule__InvokeExpressionDeprecated__Group__0 : rule__InvokeExpressionDeprecated__Group__0__Impl rule__InvokeExpressionDeprecated__Group__1 ;
+    public final void rule__InvokeExpressionDeprecated__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56097:1: ( rule__InvokeExpressionDeprecated__Group__0__Impl rule__InvokeExpressionDeprecated__Group__1 )
+            // InternalFormalML.g:56098:2: rule__InvokeExpressionDeprecated__Group__0__Impl rule__InvokeExpressionDeprecated__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_264);
+            rule__InvokeExpressionDeprecated__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeExpressionDeprecated__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__0"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__0__Impl"
+    // InternalFormalML.g:56105:1: rule__InvokeExpressionDeprecated__Group__0__Impl : ( () ) ;
+    public final void rule__InvokeExpressionDeprecated__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56109:1: ( ( () ) )
+            // InternalFormalML.g:56110:1: ( () )
+            {
+            // InternalFormalML.g:56110:1: ( () )
+            // InternalFormalML.g:56111:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeExpressionAction_0()); 
+            }
+            // InternalFormalML.g:56112:2: ()
+            // InternalFormalML.g:56112:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__0__Impl"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__1"
+    // InternalFormalML.g:56120:1: rule__InvokeExpressionDeprecated__Group__1 : rule__InvokeExpressionDeprecated__Group__1__Impl rule__InvokeExpressionDeprecated__Group__2 ;
+    public final void rule__InvokeExpressionDeprecated__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56124:1: ( rule__InvokeExpressionDeprecated__Group__1__Impl rule__InvokeExpressionDeprecated__Group__2 )
+            // InternalFormalML.g:56125:2: rule__InvokeExpressionDeprecated__Group__1__Impl rule__InvokeExpressionDeprecated__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__InvokeExpressionDeprecated__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeExpressionDeprecated__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__1"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__1__Impl"
+    // InternalFormalML.g:56132:1: rule__InvokeExpressionDeprecated__Group__1__Impl : ( '(:' ) ;
+    public final void rule__InvokeExpressionDeprecated__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56136:1: ( ( '(:' ) )
+            // InternalFormalML.g:56137:1: ( '(:' )
+            {
+            // InternalFormalML.g:56137:1: ( '(:' )
+            // InternalFormalML.g:56138:2: '(:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getLeftParenthesisColonKeyword_1()); 
+            }
+            match(input,262,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getLeftParenthesisColonKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__1__Impl"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__2"
+    // InternalFormalML.g:56147:1: rule__InvokeExpressionDeprecated__Group__2 : rule__InvokeExpressionDeprecated__Group__2__Impl rule__InvokeExpressionDeprecated__Group__3 ;
+    public final void rule__InvokeExpressionDeprecated__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56151:1: ( rule__InvokeExpressionDeprecated__Group__2__Impl rule__InvokeExpressionDeprecated__Group__3 )
+            // InternalFormalML.g:56152:2: rule__InvokeExpressionDeprecated__Group__2__Impl rule__InvokeExpressionDeprecated__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__InvokeExpressionDeprecated__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeExpressionDeprecated__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__2"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__2__Impl"
+    // InternalFormalML.g:56159:1: rule__InvokeExpressionDeprecated__Group__2__Impl : ( ( rule__InvokeExpressionDeprecated__ArgsAssignment_2 ) ) ;
+    public final void rule__InvokeExpressionDeprecated__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56163:1: ( ( ( rule__InvokeExpressionDeprecated__ArgsAssignment_2 ) ) )
+            // InternalFormalML.g:56164:1: ( ( rule__InvokeExpressionDeprecated__ArgsAssignment_2 ) )
+            {
+            // InternalFormalML.g:56164:1: ( ( rule__InvokeExpressionDeprecated__ArgsAssignment_2 ) )
+            // InternalFormalML.g:56165:2: ( rule__InvokeExpressionDeprecated__ArgsAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_2()); 
+            }
+            // InternalFormalML.g:56166:2: ( rule__InvokeExpressionDeprecated__ArgsAssignment_2 )
+            // InternalFormalML.g:56166:3: rule__InvokeExpressionDeprecated__ArgsAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeExpressionDeprecated__ArgsAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__2__Impl"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__3"
+    // InternalFormalML.g:56174:1: rule__InvokeExpressionDeprecated__Group__3 : rule__InvokeExpressionDeprecated__Group__3__Impl rule__InvokeExpressionDeprecated__Group__4 ;
+    public final void rule__InvokeExpressionDeprecated__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56178:1: ( rule__InvokeExpressionDeprecated__Group__3__Impl rule__InvokeExpressionDeprecated__Group__4 )
+            // InternalFormalML.g:56179:2: rule__InvokeExpressionDeprecated__Group__3__Impl rule__InvokeExpressionDeprecated__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_222);
+            rule__InvokeExpressionDeprecated__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeExpressionDeprecated__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__3"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__3__Impl"
+    // InternalFormalML.g:56186:1: rule__InvokeExpressionDeprecated__Group__3__Impl : ( ( rule__InvokeExpressionDeprecated__InvokeAssignment_3 ) ) ;
+    public final void rule__InvokeExpressionDeprecated__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56190:1: ( ( ( rule__InvokeExpressionDeprecated__InvokeAssignment_3 ) ) )
+            // InternalFormalML.g:56191:1: ( ( rule__InvokeExpressionDeprecated__InvokeAssignment_3 ) )
+            {
+            // InternalFormalML.g:56191:1: ( ( rule__InvokeExpressionDeprecated__InvokeAssignment_3 ) )
+            // InternalFormalML.g:56192:2: ( rule__InvokeExpressionDeprecated__InvokeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeAssignment_3()); 
+            }
+            // InternalFormalML.g:56193:2: ( rule__InvokeExpressionDeprecated__InvokeAssignment_3 )
+            // InternalFormalML.g:56193:3: rule__InvokeExpressionDeprecated__InvokeAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeExpressionDeprecated__InvokeAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__3__Impl"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__4"
+    // InternalFormalML.g:56201:1: rule__InvokeExpressionDeprecated__Group__4 : rule__InvokeExpressionDeprecated__Group__4__Impl rule__InvokeExpressionDeprecated__Group__5 ;
+    public final void rule__InvokeExpressionDeprecated__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56205:1: ( rule__InvokeExpressionDeprecated__Group__4__Impl rule__InvokeExpressionDeprecated__Group__5 )
+            // InternalFormalML.g:56206:2: rule__InvokeExpressionDeprecated__Group__4__Impl rule__InvokeExpressionDeprecated__Group__5
+            {
+            pushFollow(FollowSets000.FOLLOW_222);
+            rule__InvokeExpressionDeprecated__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeExpressionDeprecated__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__4"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__4__Impl"
+    // InternalFormalML.g:56213:1: rule__InvokeExpressionDeprecated__Group__4__Impl : ( ( rule__InvokeExpressionDeprecated__ArgsAssignment_4 )* ) ;
+    public final void rule__InvokeExpressionDeprecated__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56217:1: ( ( ( rule__InvokeExpressionDeprecated__ArgsAssignment_4 )* ) )
+            // InternalFormalML.g:56218:1: ( ( rule__InvokeExpressionDeprecated__ArgsAssignment_4 )* )
+            {
+            // InternalFormalML.g:56218:1: ( ( rule__InvokeExpressionDeprecated__ArgsAssignment_4 )* )
+            // InternalFormalML.g:56219:2: ( rule__InvokeExpressionDeprecated__ArgsAssignment_4 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_4()); 
+            }
+            // InternalFormalML.g:56220:2: ( rule__InvokeExpressionDeprecated__ArgsAssignment_4 )*
+            loop682:
+            do {
+                int alt682=2;
+                int LA682_0 = input.LA(1);
+
+                if ( ((LA682_0>=RULE_CHARACTER && LA682_0<=RULE_INT)||LA682_0==20||LA682_0==23||(LA682_0>=29 && LA682_0<=30)||LA682_0==125||(LA682_0>=129 && LA682_0<=134)||(LA682_0>=137 && LA682_0<=142)||LA682_0==199||(LA682_0>=261 && LA682_0<=271)||LA682_0==287) ) {
+                    alt682=1;
+                }
+
+
+                switch (alt682) {
+            	case 1 :
+            	    // InternalFormalML.g:56220:3: rule__InvokeExpressionDeprecated__ArgsAssignment_4
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_205);
+            	    rule__InvokeExpressionDeprecated__ArgsAssignment_4();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop682;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__4__Impl"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__5"
+    // InternalFormalML.g:56228:1: rule__InvokeExpressionDeprecated__Group__5 : rule__InvokeExpressionDeprecated__Group__5__Impl ;
+    public final void rule__InvokeExpressionDeprecated__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56232:1: ( rule__InvokeExpressionDeprecated__Group__5__Impl )
+            // InternalFormalML.g:56233:2: rule__InvokeExpressionDeprecated__Group__5__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InvokeExpressionDeprecated__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__5"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__Group__5__Impl"
+    // InternalFormalML.g:56239:1: rule__InvokeExpressionDeprecated__Group__5__Impl : ( ')' ) ;
+    public final void rule__InvokeExpressionDeprecated__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56243:1: ( ( ')' ) )
+            // InternalFormalML.g:56244:1: ( ')' )
+            {
+            // InternalFormalML.g:56244:1: ( ')' )
+            // InternalFormalML.g:56245:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getRightParenthesisKeyword_5()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getRightParenthesisKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__Group__5__Impl"
+
+
+    // $ANTLR start "rule__InstantiationExpression__Group__0"
+    // InternalFormalML.g:56255:1: rule__InstantiationExpression__Group__0 : rule__InstantiationExpression__Group__0__Impl rule__InstantiationExpression__Group__1 ;
+    public final void rule__InstantiationExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56259:1: ( rule__InstantiationExpression__Group__0__Impl rule__InstantiationExpression__Group__1 )
+            // InternalFormalML.g:56260:2: rule__InstantiationExpression__Group__0__Impl rule__InstantiationExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__InstantiationExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstantiationExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstantiationExpression__Group__0"
+
+
+    // $ANTLR start "rule__InstantiationExpression__Group__0__Impl"
+    // InternalFormalML.g:56267:1: rule__InstantiationExpression__Group__0__Impl : ( () ) ;
+    public final void rule__InstantiationExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56271:1: ( ( () ) )
+            // InternalFormalML.g:56272:1: ( () )
+            {
+            // InternalFormalML.g:56272:1: ( () )
+            // InternalFormalML.g:56273:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstantiationExpressionAccess().getInstantiationExpressionAction_0()); 
+            }
+            // InternalFormalML.g:56274:2: ()
+            // InternalFormalML.g:56274:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstantiationExpressionAccess().getInstantiationExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstantiationExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__InstantiationExpression__Group__1"
+    // InternalFormalML.g:56282:1: rule__InstantiationExpression__Group__1 : rule__InstantiationExpression__Group__1__Impl rule__InstantiationExpression__Group__2 ;
+    public final void rule__InstantiationExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56286:1: ( rule__InstantiationExpression__Group__1__Impl rule__InstantiationExpression__Group__2 )
+            // InternalFormalML.g:56287:2: rule__InstantiationExpression__Group__1__Impl rule__InstantiationExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__InstantiationExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstantiationExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstantiationExpression__Group__1"
+
+
+    // $ANTLR start "rule__InstantiationExpression__Group__1__Impl"
+    // InternalFormalML.g:56294:1: rule__InstantiationExpression__Group__1__Impl : ( ( rule__InstantiationExpression__InstanceAssignment_1 ) ) ;
+    public final void rule__InstantiationExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56298:1: ( ( ( rule__InstantiationExpression__InstanceAssignment_1 ) ) )
+            // InternalFormalML.g:56299:1: ( ( rule__InstantiationExpression__InstanceAssignment_1 ) )
+            {
+            // InternalFormalML.g:56299:1: ( ( rule__InstantiationExpression__InstanceAssignment_1 ) )
+            // InternalFormalML.g:56300:2: ( rule__InstantiationExpression__InstanceAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstantiationExpressionAccess().getInstanceAssignment_1()); 
+            }
+            // InternalFormalML.g:56301:2: ( rule__InstantiationExpression__InstanceAssignment_1 )
+            // InternalFormalML.g:56301:3: rule__InstantiationExpression__InstanceAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstantiationExpression__InstanceAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstantiationExpressionAccess().getInstanceAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstantiationExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__InstantiationExpression__Group__2"
+    // InternalFormalML.g:56309:1: rule__InstantiationExpression__Group__2 : rule__InstantiationExpression__Group__2__Impl ;
+    public final void rule__InstantiationExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56313:1: ( rule__InstantiationExpression__Group__2__Impl )
+            // InternalFormalML.g:56314:2: rule__InstantiationExpression__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InstantiationExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstantiationExpression__Group__2"
+
+
+    // $ANTLR start "rule__InstantiationExpression__Group__2__Impl"
+    // InternalFormalML.g:56320:1: rule__InstantiationExpression__Group__2__Impl : ( ';' ) ;
+    public final void rule__InstantiationExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56324:1: ( ( ';' ) )
+            // InternalFormalML.g:56325:1: ( ';' )
+            {
+            // InternalFormalML.g:56325:1: ( ';' )
+            // InternalFormalML.g:56326:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstantiationExpressionAccess().getSemicolonKeyword_2()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstantiationExpressionAccess().getSemicolonKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstantiationExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group__0"
+    // InternalFormalML.g:56336:1: rule__DynamicInstanceSpecification__Group__0 : rule__DynamicInstanceSpecification__Group__0__Impl rule__DynamicInstanceSpecification__Group__1 ;
+    public final void rule__DynamicInstanceSpecification__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56340:1: ( rule__DynamicInstanceSpecification__Group__0__Impl rule__DynamicInstanceSpecification__Group__1 )
+            // InternalFormalML.g:56341:2: rule__DynamicInstanceSpecification__Group__0__Impl rule__DynamicInstanceSpecification__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__DynamicInstanceSpecification__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group__0"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group__0__Impl"
+    // InternalFormalML.g:56348:1: rule__DynamicInstanceSpecification__Group__0__Impl : ( () ) ;
+    public final void rule__DynamicInstanceSpecification__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56352:1: ( ( () ) )
+            // InternalFormalML.g:56353:1: ( () )
+            {
+            // InternalFormalML.g:56353:1: ( () )
+            // InternalFormalML.g:56354:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getInstanceMachineAction_0()); 
+            }
+            // InternalFormalML.g:56355:2: ()
+            // InternalFormalML.g:56355:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getInstanceMachineAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group__1"
+    // InternalFormalML.g:56363:1: rule__DynamicInstanceSpecification__Group__1 : rule__DynamicInstanceSpecification__Group__1__Impl rule__DynamicInstanceSpecification__Group__2 ;
+    public final void rule__DynamicInstanceSpecification__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56367:1: ( rule__DynamicInstanceSpecification__Group__1__Impl rule__DynamicInstanceSpecification__Group__2 )
+            // InternalFormalML.g:56368:2: rule__DynamicInstanceSpecification__Group__1__Impl rule__DynamicInstanceSpecification__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__DynamicInstanceSpecification__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group__1"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group__1__Impl"
+    // InternalFormalML.g:56375:1: rule__DynamicInstanceSpecification__Group__1__Impl : ( 'new' ) ;
+    public final void rule__DynamicInstanceSpecification__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56379:1: ( ( 'new' ) )
+            // InternalFormalML.g:56380:1: ( 'new' )
+            {
+            // InternalFormalML.g:56380:1: ( 'new' )
+            // InternalFormalML.g:56381:2: 'new'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getNewKeyword_1()); 
+            }
+            match(input,264,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getNewKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group__1__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group__2"
+    // InternalFormalML.g:56390:1: rule__DynamicInstanceSpecification__Group__2 : rule__DynamicInstanceSpecification__Group__2__Impl rule__DynamicInstanceSpecification__Group__3 ;
+    public final void rule__DynamicInstanceSpecification__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56394:1: ( rule__DynamicInstanceSpecification__Group__2__Impl rule__DynamicInstanceSpecification__Group__3 )
+            // InternalFormalML.g:56395:2: rule__DynamicInstanceSpecification__Group__2__Impl rule__DynamicInstanceSpecification__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_265);
+            rule__DynamicInstanceSpecification__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group__2"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group__2__Impl"
+    // InternalFormalML.g:56402:1: rule__DynamicInstanceSpecification__Group__2__Impl : ( ( rule__DynamicInstanceSpecification__ModelAssignment_2 ) ) ;
+    public final void rule__DynamicInstanceSpecification__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56406:1: ( ( ( rule__DynamicInstanceSpecification__ModelAssignment_2 ) ) )
+            // InternalFormalML.g:56407:1: ( ( rule__DynamicInstanceSpecification__ModelAssignment_2 ) )
+            {
+            // InternalFormalML.g:56407:1: ( ( rule__DynamicInstanceSpecification__ModelAssignment_2 ) )
+            // InternalFormalML.g:56408:2: ( rule__DynamicInstanceSpecification__ModelAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getModelAssignment_2()); 
+            }
+            // InternalFormalML.g:56409:2: ( rule__DynamicInstanceSpecification__ModelAssignment_2 )
+            // InternalFormalML.g:56409:3: rule__DynamicInstanceSpecification__ModelAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__ModelAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getModelAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group__3"
+    // InternalFormalML.g:56417:1: rule__DynamicInstanceSpecification__Group__3 : rule__DynamicInstanceSpecification__Group__3__Impl ;
+    public final void rule__DynamicInstanceSpecification__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56421:1: ( rule__DynamicInstanceSpecification__Group__3__Impl )
+            // InternalFormalML.g:56422:2: rule__DynamicInstanceSpecification__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group__3"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group__3__Impl"
+    // InternalFormalML.g:56428:1: rule__DynamicInstanceSpecification__Group__3__Impl : ( ( rule__DynamicInstanceSpecification__Alternatives_3 )? ) ;
+    public final void rule__DynamicInstanceSpecification__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56432:1: ( ( ( rule__DynamicInstanceSpecification__Alternatives_3 )? ) )
+            // InternalFormalML.g:56433:1: ( ( rule__DynamicInstanceSpecification__Alternatives_3 )? )
+            {
+            // InternalFormalML.g:56433:1: ( ( rule__DynamicInstanceSpecification__Alternatives_3 )? )
+            // InternalFormalML.g:56434:2: ( rule__DynamicInstanceSpecification__Alternatives_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getAlternatives_3()); 
+            }
+            // InternalFormalML.g:56435:2: ( rule__DynamicInstanceSpecification__Alternatives_3 )?
+            int alt683=2;
+            int LA683_0 = input.LA(1);
+
+            if ( (LA683_0==23||LA683_0==199) ) {
+                alt683=1;
+            }
+            switch (alt683) {
+                case 1 :
+                    // InternalFormalML.g:56435:3: rule__DynamicInstanceSpecification__Alternatives_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DynamicInstanceSpecification__Alternatives_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getAlternatives_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group__3__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0__0"
+    // InternalFormalML.g:56444:1: rule__DynamicInstanceSpecification__Group_3_0__0 : rule__DynamicInstanceSpecification__Group_3_0__0__Impl rule__DynamicInstanceSpecification__Group_3_0__1 ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56448:1: ( rule__DynamicInstanceSpecification__Group_3_0__0__Impl rule__DynamicInstanceSpecification__Group_3_0__1 )
+            // InternalFormalML.g:56449:2: rule__DynamicInstanceSpecification__Group_3_0__0__Impl rule__DynamicInstanceSpecification__Group_3_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_53);
+            rule__DynamicInstanceSpecification__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0__0"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0__0__Impl"
+    // InternalFormalML.g:56456:1: rule__DynamicInstanceSpecification__Group_3_0__0__Impl : ( '(' ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56460:1: ( ( '(' ) )
+            // InternalFormalML.g:56461:1: ( '(' )
+            {
+            // InternalFormalML.g:56461:1: ( '(' )
+            // InternalFormalML.g:56462:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getLeftParenthesisKeyword_3_0_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getLeftParenthesisKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0__1"
+    // InternalFormalML.g:56471:1: rule__DynamicInstanceSpecification__Group_3_0__1 : rule__DynamicInstanceSpecification__Group_3_0__1__Impl rule__DynamicInstanceSpecification__Group_3_0__2 ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56475:1: ( rule__DynamicInstanceSpecification__Group_3_0__1__Impl rule__DynamicInstanceSpecification__Group_3_0__2 )
+            // InternalFormalML.g:56476:2: rule__DynamicInstanceSpecification__Group_3_0__1__Impl rule__DynamicInstanceSpecification__Group_3_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_53);
+            rule__DynamicInstanceSpecification__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0__1"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0__1__Impl"
+    // InternalFormalML.g:56483:1: rule__DynamicInstanceSpecification__Group_3_0__1__Impl : ( ( rule__DynamicInstanceSpecification__Group_3_0_1__0 )? ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56487:1: ( ( ( rule__DynamicInstanceSpecification__Group_3_0_1__0 )? ) )
+            // InternalFormalML.g:56488:1: ( ( rule__DynamicInstanceSpecification__Group_3_0_1__0 )? )
+            {
+            // InternalFormalML.g:56488:1: ( ( rule__DynamicInstanceSpecification__Group_3_0_1__0 )? )
+            // InternalFormalML.g:56489:2: ( rule__DynamicInstanceSpecification__Group_3_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1()); 
+            }
+            // InternalFormalML.g:56490:2: ( rule__DynamicInstanceSpecification__Group_3_0_1__0 )?
+            int alt684=2;
+            int LA684_0 = input.LA(1);
+
+            if ( (LA684_0==RULE_XLIA_ID) ) {
+                alt684=1;
+            }
+            switch (alt684) {
+                case 1 :
+                    // InternalFormalML.g:56490:3: rule__DynamicInstanceSpecification__Group_3_0_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__DynamicInstanceSpecification__Group_3_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0__2"
+    // InternalFormalML.g:56498:1: rule__DynamicInstanceSpecification__Group_3_0__2 : rule__DynamicInstanceSpecification__Group_3_0__2__Impl ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56502:1: ( rule__DynamicInstanceSpecification__Group_3_0__2__Impl )
+            // InternalFormalML.g:56503:2: rule__DynamicInstanceSpecification__Group_3_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0__2"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0__2__Impl"
+    // InternalFormalML.g:56509:1: rule__DynamicInstanceSpecification__Group_3_0__2__Impl : ( ')' ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56513:1: ( ( ')' ) )
+            // InternalFormalML.g:56514:1: ( ')' )
+            {
+            // InternalFormalML.g:56514:1: ( ')' )
+            // InternalFormalML.g:56515:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getRightParenthesisKeyword_3_0_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getRightParenthesisKeyword_3_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0__2__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0_1__0"
+    // InternalFormalML.g:56525:1: rule__DynamicInstanceSpecification__Group_3_0_1__0 : rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl rule__DynamicInstanceSpecification__Group_3_0_1__1 ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56529:1: ( rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl rule__DynamicInstanceSpecification__Group_3_0_1__1 )
+            // InternalFormalML.g:56530:2: rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl rule__DynamicInstanceSpecification__Group_3_0_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0_1__0"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl"
+    // InternalFormalML.g:56537:1: rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl : ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0 ) ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56541:1: ( ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0 ) ) )
+            // InternalFormalML.g:56542:1: ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0 ) )
+            {
+            // InternalFormalML.g:56542:1: ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0 ) )
+            // InternalFormalML.g:56543:2: ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_0()); 
+            }
+            // InternalFormalML.g:56544:2: ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0 )
+            // InternalFormalML.g:56544:3: rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0_1__1"
+    // InternalFormalML.g:56552:1: rule__DynamicInstanceSpecification__Group_3_0_1__1 : rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56556:1: ( rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl )
+            // InternalFormalML.g:56557:2: rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0_1__1"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl"
+    // InternalFormalML.g:56563:1: rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl : ( ( rule__DynamicInstanceSpecification__Group_3_0_1_1__0 )* ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56567:1: ( ( ( rule__DynamicInstanceSpecification__Group_3_0_1_1__0 )* ) )
+            // InternalFormalML.g:56568:1: ( ( rule__DynamicInstanceSpecification__Group_3_0_1_1__0 )* )
+            {
+            // InternalFormalML.g:56568:1: ( ( rule__DynamicInstanceSpecification__Group_3_0_1_1__0 )* )
+            // InternalFormalML.g:56569:2: ( rule__DynamicInstanceSpecification__Group_3_0_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1_1()); 
+            }
+            // InternalFormalML.g:56570:2: ( rule__DynamicInstanceSpecification__Group_3_0_1_1__0 )*
+            loop685:
+            do {
+                int alt685=2;
+                int LA685_0 = input.LA(1);
+
+                if ( (LA685_0==198) ) {
+                    alt685=1;
+                }
+
+
+                switch (alt685) {
+            	case 1 :
+            	    // InternalFormalML.g:56570:3: rule__DynamicInstanceSpecification__Group_3_0_1_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__DynamicInstanceSpecification__Group_3_0_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop685;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0_1_1__0"
+    // InternalFormalML.g:56579:1: rule__DynamicInstanceSpecification__Group_3_0_1_1__0 : rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl rule__DynamicInstanceSpecification__Group_3_0_1_1__1 ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56583:1: ( rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl rule__DynamicInstanceSpecification__Group_3_0_1_1__1 )
+            // InternalFormalML.g:56584:2: rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl rule__DynamicInstanceSpecification__Group_3_0_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0_1_1__0"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl"
+    // InternalFormalML.g:56591:1: rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl : ( ',' ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56595:1: ( ( ',' ) )
+            // InternalFormalML.g:56596:1: ( ',' )
+            {
+            // InternalFormalML.g:56596:1: ( ',' )
+            // InternalFormalML.g:56597:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getCommaKeyword_3_0_1_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getCommaKeyword_3_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0_1_1__1"
+    // InternalFormalML.g:56606:1: rule__DynamicInstanceSpecification__Group_3_0_1_1__1 : rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56610:1: ( rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl )
+            // InternalFormalML.g:56611:2: rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0_1_1__1"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl"
+    // InternalFormalML.g:56617:1: rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl : ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1 ) ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56621:1: ( ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1 ) ) )
+            // InternalFormalML.g:56622:1: ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1 ) )
+            {
+            // InternalFormalML.g:56622:1: ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1 ) )
+            // InternalFormalML.g:56623:2: ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_1_1()); 
+            }
+            // InternalFormalML.g:56624:2: ( rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1 )
+            // InternalFormalML.g:56624:3: rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1__0"
+    // InternalFormalML.g:56633:1: rule__DynamicInstanceSpecification__Group_3_1__0 : rule__DynamicInstanceSpecification__Group_3_1__0__Impl rule__DynamicInstanceSpecification__Group_3_1__1 ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56637:1: ( rule__DynamicInstanceSpecification__Group_3_1__0__Impl rule__DynamicInstanceSpecification__Group_3_1__1 )
+            // InternalFormalML.g:56638:2: rule__DynamicInstanceSpecification__Group_3_1__0__Impl rule__DynamicInstanceSpecification__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__DynamicInstanceSpecification__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1__0"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1__0__Impl"
+    // InternalFormalML.g:56645:1: rule__DynamicInstanceSpecification__Group_3_1__0__Impl : ( '{' ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56649:1: ( ( '{' ) )
+            // InternalFormalML.g:56650:1: ( '{' )
+            {
+            // InternalFormalML.g:56650:1: ( '{' )
+            // InternalFormalML.g:56651:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getLeftCurlyBracketKeyword_3_1_0()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getLeftCurlyBracketKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1__1"
+    // InternalFormalML.g:56660:1: rule__DynamicInstanceSpecification__Group_3_1__1 : rule__DynamicInstanceSpecification__Group_3_1__1__Impl rule__DynamicInstanceSpecification__Group_3_1__2 ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56664:1: ( rule__DynamicInstanceSpecification__Group_3_1__1__Impl rule__DynamicInstanceSpecification__Group_3_1__2 )
+            // InternalFormalML.g:56665:2: rule__DynamicInstanceSpecification__Group_3_1__1__Impl rule__DynamicInstanceSpecification__Group_3_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_17);
+            rule__DynamicInstanceSpecification__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1__1"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1__1__Impl"
+    // InternalFormalML.g:56672:1: rule__DynamicInstanceSpecification__Group_3_1__1__Impl : ( ( rule__DynamicInstanceSpecification__Group_3_1_1__0 )* ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56676:1: ( ( ( rule__DynamicInstanceSpecification__Group_3_1_1__0 )* ) )
+            // InternalFormalML.g:56677:1: ( ( rule__DynamicInstanceSpecification__Group_3_1_1__0 )* )
+            {
+            // InternalFormalML.g:56677:1: ( ( rule__DynamicInstanceSpecification__Group_3_1_1__0 )* )
+            // InternalFormalML.g:56678:2: ( rule__DynamicInstanceSpecification__Group_3_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1_1()); 
+            }
+            // InternalFormalML.g:56679:2: ( rule__DynamicInstanceSpecification__Group_3_1_1__0 )*
+            loop686:
+            do {
+                int alt686=2;
+                int LA686_0 = input.LA(1);
+
+                if ( (LA686_0==RULE_XLIA_ID) ) {
+                    alt686=1;
+                }
+
+
+                switch (alt686) {
+            	case 1 :
+            	    // InternalFormalML.g:56679:3: rule__DynamicInstanceSpecification__Group_3_1_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_18);
+            	    rule__DynamicInstanceSpecification__Group_3_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop686;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getGroup_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1__2"
+    // InternalFormalML.g:56687:1: rule__DynamicInstanceSpecification__Group_3_1__2 : rule__DynamicInstanceSpecification__Group_3_1__2__Impl ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56691:1: ( rule__DynamicInstanceSpecification__Group_3_1__2__Impl )
+            // InternalFormalML.g:56692:2: rule__DynamicInstanceSpecification__Group_3_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1__2"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1__2__Impl"
+    // InternalFormalML.g:56698:1: rule__DynamicInstanceSpecification__Group_3_1__2__Impl : ( '}' ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56702:1: ( ( '}' ) )
+            // InternalFormalML.g:56703:1: ( '}' )
+            {
+            // InternalFormalML.g:56703:1: ( '}' )
+            // InternalFormalML.g:56704:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getRightCurlyBracketKeyword_3_1_2()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getRightCurlyBracketKeyword_3_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1__2__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1_1__0"
+    // InternalFormalML.g:56714:1: rule__DynamicInstanceSpecification__Group_3_1_1__0 : rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl rule__DynamicInstanceSpecification__Group_3_1_1__1 ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56718:1: ( rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl rule__DynamicInstanceSpecification__Group_3_1_1__1 )
+            // InternalFormalML.g:56719:2: rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl rule__DynamicInstanceSpecification__Group_3_1_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_21);
+            rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1_1__0"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl"
+    // InternalFormalML.g:56726:1: rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl : ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0 ) ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56730:1: ( ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0 ) ) )
+            // InternalFormalML.g:56731:1: ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0 ) )
+            {
+            // InternalFormalML.g:56731:1: ( ( rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0 ) )
+            // InternalFormalML.g:56732:2: ( rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_1_1_0()); 
+            }
+            // InternalFormalML.g:56733:2: ( rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0 )
+            // InternalFormalML.g:56733:3: rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotAssignment_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1_1__1"
+    // InternalFormalML.g:56741:1: rule__DynamicInstanceSpecification__Group_3_1_1__1 : rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56745:1: ( rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl )
+            // InternalFormalML.g:56746:2: rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1_1__1"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl"
+    // InternalFormalML.g:56752:1: rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl : ( ';' ) ;
+    public final void rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56756:1: ( ( ';' ) )
+            // InternalFormalML.g:56757:1: ( ';' )
+            {
+            // InternalFormalML.g:56757:1: ( ';' )
+            // InternalFormalML.g:56758:2: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getSemicolonKeyword_3_1_1_1()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getSemicolonKeyword_3_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__Group_3_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__TupleParameterExpression__Group__0"
+    // InternalFormalML.g:56768:1: rule__TupleParameterExpression__Group__0 : rule__TupleParameterExpression__Group__0__Impl rule__TupleParameterExpression__Group__1 ;
+    public final void rule__TupleParameterExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56772:1: ( rule__TupleParameterExpression__Group__0__Impl rule__TupleParameterExpression__Group__1 )
+            // InternalFormalML.g:56773:2: rule__TupleParameterExpression__Group__0__Impl rule__TupleParameterExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__TupleParameterExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TupleParameterExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TupleParameterExpression__Group__0"
+
+
+    // $ANTLR start "rule__TupleParameterExpression__Group__0__Impl"
+    // InternalFormalML.g:56780:1: rule__TupleParameterExpression__Group__0__Impl : ( '(' ) ;
+    public final void rule__TupleParameterExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56784:1: ( ( '(' ) )
+            // InternalFormalML.g:56785:1: ( '(' )
+            {
+            // InternalFormalML.g:56785:1: ( '(' )
+            // InternalFormalML.g:56786:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTupleParameterExpressionAccess().getLeftParenthesisKeyword_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTupleParameterExpressionAccess().getLeftParenthesisKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TupleParameterExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__TupleParameterExpression__Group__1"
+    // InternalFormalML.g:56795:1: rule__TupleParameterExpression__Group__1 : rule__TupleParameterExpression__Group__1__Impl rule__TupleParameterExpression__Group__2 ;
+    public final void rule__TupleParameterExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56799:1: ( rule__TupleParameterExpression__Group__1__Impl rule__TupleParameterExpression__Group__2 )
+            // InternalFormalML.g:56800:2: rule__TupleParameterExpression__Group__1__Impl rule__TupleParameterExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__TupleParameterExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TupleParameterExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TupleParameterExpression__Group__1"
+
+
+    // $ANTLR start "rule__TupleParameterExpression__Group__1__Impl"
+    // InternalFormalML.g:56807:1: rule__TupleParameterExpression__Group__1__Impl : ( ruleMixTupleExpressionList ) ;
+    public final void rule__TupleParameterExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56811:1: ( ( ruleMixTupleExpressionList ) )
+            // InternalFormalML.g:56812:1: ( ruleMixTupleExpressionList )
+            {
+            // InternalFormalML.g:56812:1: ( ruleMixTupleExpressionList )
+            // InternalFormalML.g:56813:2: ruleMixTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTupleParameterExpressionAccess().getMixTupleExpressionListParserRuleCall_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTupleParameterExpressionAccess().getMixTupleExpressionListParserRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TupleParameterExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__TupleParameterExpression__Group__2"
+    // InternalFormalML.g:56822:1: rule__TupleParameterExpression__Group__2 : rule__TupleParameterExpression__Group__2__Impl ;
+    public final void rule__TupleParameterExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56826:1: ( rule__TupleParameterExpression__Group__2__Impl )
+            // InternalFormalML.g:56827:2: rule__TupleParameterExpression__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TupleParameterExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TupleParameterExpression__Group__2"
+
+
+    // $ANTLR start "rule__TupleParameterExpression__Group__2__Impl"
+    // InternalFormalML.g:56833:1: rule__TupleParameterExpression__Group__2__Impl : ( ')' ) ;
+    public final void rule__TupleParameterExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56837:1: ( ( ')' ) )
+            // InternalFormalML.g:56838:1: ( ')' )
+            {
+            // InternalFormalML.g:56838:1: ( ')' )
+            // InternalFormalML.g:56839:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTupleParameterExpressionAccess().getRightParenthesisKeyword_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTupleParameterExpressionAccess().getRightParenthesisKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TupleParameterExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group__0"
+    // InternalFormalML.g:56849:1: rule__MixTupleExpressionList__Group__0 : rule__MixTupleExpressionList__Group__0__Impl rule__MixTupleExpressionList__Group__1 ;
+    public final void rule__MixTupleExpressionList__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56853:1: ( rule__MixTupleExpressionList__Group__0__Impl rule__MixTupleExpressionList__Group__1 )
+            // InternalFormalML.g:56854:2: rule__MixTupleExpressionList__Group__0__Impl rule__MixTupleExpressionList__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MixTupleExpressionList__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group__0"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group__0__Impl"
+    // InternalFormalML.g:56861:1: rule__MixTupleExpressionList__Group__0__Impl : ( () ) ;
+    public final void rule__MixTupleExpressionList__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56865:1: ( ( () ) )
+            // InternalFormalML.g:56866:1: ( () )
+            {
+            // InternalFormalML.g:56866:1: ( () )
+            // InternalFormalML.g:56867:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMixTupleExpressionListAccess().getMixTupleExpressionAction_0()); 
+            }
+            // InternalFormalML.g:56868:2: ()
+            // InternalFormalML.g:56868:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMixTupleExpressionListAccess().getMixTupleExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group__0__Impl"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group__1"
+    // InternalFormalML.g:56876:1: rule__MixTupleExpressionList__Group__1 : rule__MixTupleExpressionList__Group__1__Impl rule__MixTupleExpressionList__Group__2 ;
+    public final void rule__MixTupleExpressionList__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56880:1: ( rule__MixTupleExpressionList__Group__1__Impl rule__MixTupleExpressionList__Group__2 )
+            // InternalFormalML.g:56881:2: rule__MixTupleExpressionList__Group__1__Impl rule__MixTupleExpressionList__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__MixTupleExpressionList__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group__1"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group__1__Impl"
+    // InternalFormalML.g:56888:1: rule__MixTupleExpressionList__Group__1__Impl : ( ( rule__MixTupleExpressionList__ValueAssignment_1 ) ) ;
+    public final void rule__MixTupleExpressionList__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56892:1: ( ( ( rule__MixTupleExpressionList__ValueAssignment_1 ) ) )
+            // InternalFormalML.g:56893:1: ( ( rule__MixTupleExpressionList__ValueAssignment_1 ) )
+            {
+            // InternalFormalML.g:56893:1: ( ( rule__MixTupleExpressionList__ValueAssignment_1 ) )
+            // InternalFormalML.g:56894:2: ( rule__MixTupleExpressionList__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_1()); 
+            }
+            // InternalFormalML.g:56895:2: ( rule__MixTupleExpressionList__ValueAssignment_1 )
+            // InternalFormalML.g:56895:3: rule__MixTupleExpressionList__ValueAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group__1__Impl"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group__2"
+    // InternalFormalML.g:56903:1: rule__MixTupleExpressionList__Group__2 : rule__MixTupleExpressionList__Group__2__Impl ;
+    public final void rule__MixTupleExpressionList__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56907:1: ( rule__MixTupleExpressionList__Group__2__Impl )
+            // InternalFormalML.g:56908:2: rule__MixTupleExpressionList__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group__2"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group__2__Impl"
+    // InternalFormalML.g:56914:1: rule__MixTupleExpressionList__Group__2__Impl : ( ( rule__MixTupleExpressionList__Group_2__0 )* ) ;
+    public final void rule__MixTupleExpressionList__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56918:1: ( ( ( rule__MixTupleExpressionList__Group_2__0 )* ) )
+            // InternalFormalML.g:56919:1: ( ( rule__MixTupleExpressionList__Group_2__0 )* )
+            {
+            // InternalFormalML.g:56919:1: ( ( rule__MixTupleExpressionList__Group_2__0 )* )
+            // InternalFormalML.g:56920:2: ( rule__MixTupleExpressionList__Group_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMixTupleExpressionListAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:56921:2: ( rule__MixTupleExpressionList__Group_2__0 )*
+            loop687:
+            do {
+                int alt687=2;
+                int LA687_0 = input.LA(1);
+
+                if ( (LA687_0==198) ) {
+                    alt687=1;
+                }
+
+
+                switch (alt687) {
+            	case 1 :
+            	    // InternalFormalML.g:56921:3: rule__MixTupleExpressionList__Group_2__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__MixTupleExpressionList__Group_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop687;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMixTupleExpressionListAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group__2__Impl"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group_2__0"
+    // InternalFormalML.g:56930:1: rule__MixTupleExpressionList__Group_2__0 : rule__MixTupleExpressionList__Group_2__0__Impl rule__MixTupleExpressionList__Group_2__1 ;
+    public final void rule__MixTupleExpressionList__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56934:1: ( rule__MixTupleExpressionList__Group_2__0__Impl rule__MixTupleExpressionList__Group_2__1 )
+            // InternalFormalML.g:56935:2: rule__MixTupleExpressionList__Group_2__0__Impl rule__MixTupleExpressionList__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__MixTupleExpressionList__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group_2__0"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group_2__0__Impl"
+    // InternalFormalML.g:56942:1: rule__MixTupleExpressionList__Group_2__0__Impl : ( ',' ) ;
+    public final void rule__MixTupleExpressionList__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56946:1: ( ( ',' ) )
+            // InternalFormalML.g:56947:1: ( ',' )
+            {
+            // InternalFormalML.g:56947:1: ( ',' )
+            // InternalFormalML.g:56948:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMixTupleExpressionListAccess().getCommaKeyword_2_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMixTupleExpressionListAccess().getCommaKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group_2__1"
+    // InternalFormalML.g:56957:1: rule__MixTupleExpressionList__Group_2__1 : rule__MixTupleExpressionList__Group_2__1__Impl ;
+    public final void rule__MixTupleExpressionList__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56961:1: ( rule__MixTupleExpressionList__Group_2__1__Impl )
+            // InternalFormalML.g:56962:2: rule__MixTupleExpressionList__Group_2__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group_2__1"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__Group_2__1__Impl"
+    // InternalFormalML.g:56968:1: rule__MixTupleExpressionList__Group_2__1__Impl : ( ( rule__MixTupleExpressionList__ValueAssignment_2_1 ) ) ;
+    public final void rule__MixTupleExpressionList__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56972:1: ( ( ( rule__MixTupleExpressionList__ValueAssignment_2_1 ) ) )
+            // InternalFormalML.g:56973:1: ( ( rule__MixTupleExpressionList__ValueAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:56973:1: ( ( rule__MixTupleExpressionList__ValueAssignment_2_1 ) )
+            // InternalFormalML.g:56974:2: ( rule__MixTupleExpressionList__ValueAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_2_1()); 
+            }
+            // InternalFormalML.g:56975:2: ( rule__MixTupleExpressionList__ValueAssignment_2_1 )
+            // InternalFormalML.g:56975:3: rule__MixTupleExpressionList__ValueAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__ValueAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMixTupleExpressionListAccess().getValueAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__Group__0"
+    // InternalFormalML.g:56984:1: rule__PositionalTupleExpressionList__Group__0 : rule__PositionalTupleExpressionList__Group__0__Impl rule__PositionalTupleExpressionList__Group__1 ;
+    public final void rule__PositionalTupleExpressionList__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:56988:1: ( rule__PositionalTupleExpressionList__Group__0__Impl rule__PositionalTupleExpressionList__Group__1 )
+            // InternalFormalML.g:56989:2: rule__PositionalTupleExpressionList__Group__0__Impl rule__PositionalTupleExpressionList__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__PositionalTupleExpressionList__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PositionalTupleExpressionList__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__Group__0"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__Group__0__Impl"
+    // InternalFormalML.g:56996:1: rule__PositionalTupleExpressionList__Group__0__Impl : ( ( rule__PositionalTupleExpressionList__ValueAssignment_0 ) ) ;
+    public final void rule__PositionalTupleExpressionList__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57000:1: ( ( ( rule__PositionalTupleExpressionList__ValueAssignment_0 ) ) )
+            // InternalFormalML.g:57001:1: ( ( rule__PositionalTupleExpressionList__ValueAssignment_0 ) )
+            {
+            // InternalFormalML.g:57001:1: ( ( rule__PositionalTupleExpressionList__ValueAssignment_0 ) )
+            // InternalFormalML.g:57002:2: ( rule__PositionalTupleExpressionList__ValueAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_0()); 
+            }
+            // InternalFormalML.g:57003:2: ( rule__PositionalTupleExpressionList__ValueAssignment_0 )
+            // InternalFormalML.g:57003:3: rule__PositionalTupleExpressionList__ValueAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PositionalTupleExpressionList__ValueAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__Group__1"
+    // InternalFormalML.g:57011:1: rule__PositionalTupleExpressionList__Group__1 : rule__PositionalTupleExpressionList__Group__1__Impl ;
+    public final void rule__PositionalTupleExpressionList__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57015:1: ( rule__PositionalTupleExpressionList__Group__1__Impl )
+            // InternalFormalML.g:57016:2: rule__PositionalTupleExpressionList__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PositionalTupleExpressionList__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__Group__1"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__Group__1__Impl"
+    // InternalFormalML.g:57022:1: rule__PositionalTupleExpressionList__Group__1__Impl : ( ( rule__PositionalTupleExpressionList__Group_1__0 )* ) ;
+    public final void rule__PositionalTupleExpressionList__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57026:1: ( ( ( rule__PositionalTupleExpressionList__Group_1__0 )* ) )
+            // InternalFormalML.g:57027:1: ( ( rule__PositionalTupleExpressionList__Group_1__0 )* )
+            {
+            // InternalFormalML.g:57027:1: ( ( rule__PositionalTupleExpressionList__Group_1__0 )* )
+            // InternalFormalML.g:57028:2: ( rule__PositionalTupleExpressionList__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPositionalTupleExpressionListAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:57029:2: ( rule__PositionalTupleExpressionList__Group_1__0 )*
+            loop688:
+            do {
+                int alt688=2;
+                int LA688_0 = input.LA(1);
+
+                if ( (LA688_0==198) ) {
+                    alt688=1;
+                }
+
+
+                switch (alt688) {
+            	case 1 :
+            	    // InternalFormalML.g:57029:3: rule__PositionalTupleExpressionList__Group_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__PositionalTupleExpressionList__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop688;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPositionalTupleExpressionListAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__Group_1__0"
+    // InternalFormalML.g:57038:1: rule__PositionalTupleExpressionList__Group_1__0 : rule__PositionalTupleExpressionList__Group_1__0__Impl rule__PositionalTupleExpressionList__Group_1__1 ;
+    public final void rule__PositionalTupleExpressionList__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57042:1: ( rule__PositionalTupleExpressionList__Group_1__0__Impl rule__PositionalTupleExpressionList__Group_1__1 )
+            // InternalFormalML.g:57043:2: rule__PositionalTupleExpressionList__Group_1__0__Impl rule__PositionalTupleExpressionList__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__PositionalTupleExpressionList__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PositionalTupleExpressionList__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__Group_1__0"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__Group_1__0__Impl"
+    // InternalFormalML.g:57050:1: rule__PositionalTupleExpressionList__Group_1__0__Impl : ( ',' ) ;
+    public final void rule__PositionalTupleExpressionList__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57054:1: ( ( ',' ) )
+            // InternalFormalML.g:57055:1: ( ',' )
+            {
+            // InternalFormalML.g:57055:1: ( ',' )
+            // InternalFormalML.g:57056:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPositionalTupleExpressionListAccess().getCommaKeyword_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPositionalTupleExpressionListAccess().getCommaKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__Group_1__1"
+    // InternalFormalML.g:57065:1: rule__PositionalTupleExpressionList__Group_1__1 : rule__PositionalTupleExpressionList__Group_1__1__Impl ;
+    public final void rule__PositionalTupleExpressionList__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57069:1: ( rule__PositionalTupleExpressionList__Group_1__1__Impl )
+            // InternalFormalML.g:57070:2: rule__PositionalTupleExpressionList__Group_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PositionalTupleExpressionList__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__Group_1__1"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__Group_1__1__Impl"
+    // InternalFormalML.g:57076:1: rule__PositionalTupleExpressionList__Group_1__1__Impl : ( ( rule__PositionalTupleExpressionList__ValueAssignment_1_1 ) ) ;
+    public final void rule__PositionalTupleExpressionList__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57080:1: ( ( ( rule__PositionalTupleExpressionList__ValueAssignment_1_1 ) ) )
+            // InternalFormalML.g:57081:1: ( ( rule__PositionalTupleExpressionList__ValueAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:57081:1: ( ( rule__PositionalTupleExpressionList__ValueAssignment_1_1 ) )
+            // InternalFormalML.g:57082:2: ( rule__PositionalTupleExpressionList__ValueAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_1_1()); 
+            }
+            // InternalFormalML.g:57083:2: ( rule__PositionalTupleExpressionList__ValueAssignment_1_1 )
+            // InternalFormalML.g:57083:3: rule__PositionalTupleExpressionList__ValueAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PositionalTupleExpressionList__ValueAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPositionalTupleExpressionListAccess().getValueAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__NamedExpression__Group__0"
+    // InternalFormalML.g:57092:1: rule__NamedExpression__Group__0 : rule__NamedExpression__Group__0__Impl rule__NamedExpression__Group__1 ;
+    public final void rule__NamedExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57096:1: ( rule__NamedExpression__Group__0__Impl rule__NamedExpression__Group__1 )
+            // InternalFormalML.g:57097:2: rule__NamedExpression__Group__0__Impl rule__NamedExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_266);
+            rule__NamedExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NamedExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NamedExpression__Group__0"
+
+
+    // $ANTLR start "rule__NamedExpression__Group__0__Impl"
+    // InternalFormalML.g:57104:1: rule__NamedExpression__Group__0__Impl : ( ( rule__NamedExpression__NameAssignment_0 ) ) ;
+    public final void rule__NamedExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57108:1: ( ( ( rule__NamedExpression__NameAssignment_0 ) ) )
+            // InternalFormalML.g:57109:1: ( ( rule__NamedExpression__NameAssignment_0 ) )
+            {
+            // InternalFormalML.g:57109:1: ( ( rule__NamedExpression__NameAssignment_0 ) )
+            // InternalFormalML.g:57110:2: ( rule__NamedExpression__NameAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNamedExpressionAccess().getNameAssignment_0()); 
+            }
+            // InternalFormalML.g:57111:2: ( rule__NamedExpression__NameAssignment_0 )
+            // InternalFormalML.g:57111:3: rule__NamedExpression__NameAssignment_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NamedExpression__NameAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNamedExpressionAccess().getNameAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NamedExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__NamedExpression__Group__1"
+    // InternalFormalML.g:57119:1: rule__NamedExpression__Group__1 : rule__NamedExpression__Group__1__Impl rule__NamedExpression__Group__2 ;
+    public final void rule__NamedExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57123:1: ( rule__NamedExpression__Group__1__Impl rule__NamedExpression__Group__2 )
+            // InternalFormalML.g:57124:2: rule__NamedExpression__Group__1__Impl rule__NamedExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__NamedExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NamedExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NamedExpression__Group__1"
+
+
+    // $ANTLR start "rule__NamedExpression__Group__1__Impl"
+    // InternalFormalML.g:57131:1: rule__NamedExpression__Group__1__Impl : ( ( rule__NamedExpression__Alternatives_1 ) ) ;
+    public final void rule__NamedExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57135:1: ( ( ( rule__NamedExpression__Alternatives_1 ) ) )
+            // InternalFormalML.g:57136:1: ( ( rule__NamedExpression__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:57136:1: ( ( rule__NamedExpression__Alternatives_1 ) )
+            // InternalFormalML.g:57137:2: ( rule__NamedExpression__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNamedExpressionAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:57138:2: ( rule__NamedExpression__Alternatives_1 )
+            // InternalFormalML.g:57138:3: rule__NamedExpression__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NamedExpression__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNamedExpressionAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NamedExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__NamedExpression__Group__2"
+    // InternalFormalML.g:57146:1: rule__NamedExpression__Group__2 : rule__NamedExpression__Group__2__Impl ;
+    public final void rule__NamedExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57150:1: ( rule__NamedExpression__Group__2__Impl )
+            // InternalFormalML.g:57151:2: rule__NamedExpression__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NamedExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NamedExpression__Group__2"
+
+
+    // $ANTLR start "rule__NamedExpression__Group__2__Impl"
+    // InternalFormalML.g:57157:1: rule__NamedExpression__Group__2__Impl : ( ( rule__NamedExpression__ExpressionAssignment_2 ) ) ;
+    public final void rule__NamedExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57161:1: ( ( ( rule__NamedExpression__ExpressionAssignment_2 ) ) )
+            // InternalFormalML.g:57162:1: ( ( rule__NamedExpression__ExpressionAssignment_2 ) )
+            {
+            // InternalFormalML.g:57162:1: ( ( rule__NamedExpression__ExpressionAssignment_2 ) )
+            // InternalFormalML.g:57163:2: ( rule__NamedExpression__ExpressionAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNamedExpressionAccess().getExpressionAssignment_2()); 
+            }
+            // InternalFormalML.g:57164:2: ( rule__NamedExpression__ExpressionAssignment_2 )
+            // InternalFormalML.g:57164:3: rule__NamedExpression__ExpressionAssignment_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__NamedExpression__ExpressionAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNamedExpressionAccess().getExpressionAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NamedExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralBooleanExpression__Group__0"
+    // InternalFormalML.g:57173:1: rule__LiteralBooleanExpression__Group__0 : rule__LiteralBooleanExpression__Group__0__Impl rule__LiteralBooleanExpression__Group__1 ;
+    public final void rule__LiteralBooleanExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57177:1: ( rule__LiteralBooleanExpression__Group__0__Impl rule__LiteralBooleanExpression__Group__1 )
+            // InternalFormalML.g:57178:2: rule__LiteralBooleanExpression__Group__0__Impl rule__LiteralBooleanExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_267);
+            rule__LiteralBooleanExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralBooleanExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralBooleanExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralBooleanExpression__Group__0__Impl"
+    // InternalFormalML.g:57185:1: rule__LiteralBooleanExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralBooleanExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57189:1: ( ( () ) )
+            // InternalFormalML.g:57190:1: ( () )
+            {
+            // InternalFormalML.g:57190:1: ( () )
+            // InternalFormalML.g:57191:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralBooleanExpressionAccess().getLiteralBooleanExpressionAction_0()); 
+            }
+            // InternalFormalML.g:57192:2: ()
+            // InternalFormalML.g:57192:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralBooleanExpressionAccess().getLiteralBooleanExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralBooleanExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralBooleanExpression__Group__1"
+    // InternalFormalML.g:57200:1: rule__LiteralBooleanExpression__Group__1 : rule__LiteralBooleanExpression__Group__1__Impl ;
+    public final void rule__LiteralBooleanExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57204:1: ( rule__LiteralBooleanExpression__Group__1__Impl )
+            // InternalFormalML.g:57205:2: rule__LiteralBooleanExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralBooleanExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralBooleanExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralBooleanExpression__Group__1__Impl"
+    // InternalFormalML.g:57211:1: rule__LiteralBooleanExpression__Group__1__Impl : ( ( rule__LiteralBooleanExpression__ValueAssignment_1 ) ) ;
+    public final void rule__LiteralBooleanExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57215:1: ( ( ( rule__LiteralBooleanExpression__ValueAssignment_1 ) ) )
+            // InternalFormalML.g:57216:1: ( ( rule__LiteralBooleanExpression__ValueAssignment_1 ) )
+            {
+            // InternalFormalML.g:57216:1: ( ( rule__LiteralBooleanExpression__ValueAssignment_1 ) )
+            // InternalFormalML.g:57217:2: ( rule__LiteralBooleanExpression__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralBooleanExpressionAccess().getValueAssignment_1()); 
+            }
+            // InternalFormalML.g:57218:2: ( rule__LiteralBooleanExpression__ValueAssignment_1 )
+            // InternalFormalML.g:57218:3: rule__LiteralBooleanExpression__ValueAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralBooleanExpression__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralBooleanExpressionAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralBooleanExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralIntegerExpression__Group__0"
+    // InternalFormalML.g:57227:1: rule__LiteralIntegerExpression__Group__0 : rule__LiteralIntegerExpression__Group__0__Impl rule__LiteralIntegerExpression__Group__1 ;
+    public final void rule__LiteralIntegerExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57231:1: ( rule__LiteralIntegerExpression__Group__0__Impl rule__LiteralIntegerExpression__Group__1 )
+            // InternalFormalML.g:57232:2: rule__LiteralIntegerExpression__Group__0__Impl rule__LiteralIntegerExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__LiteralIntegerExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralIntegerExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralIntegerExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralIntegerExpression__Group__0__Impl"
+    // InternalFormalML.g:57239:1: rule__LiteralIntegerExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralIntegerExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57243:1: ( ( () ) )
+            // InternalFormalML.g:57244:1: ( () )
+            {
+            // InternalFormalML.g:57244:1: ( () )
+            // InternalFormalML.g:57245:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralIntegerExpressionAccess().getLiteralIntegerExpressionAction_0()); 
+            }
+            // InternalFormalML.g:57246:2: ()
+            // InternalFormalML.g:57246:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralIntegerExpressionAccess().getLiteralIntegerExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralIntegerExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralIntegerExpression__Group__1"
+    // InternalFormalML.g:57254:1: rule__LiteralIntegerExpression__Group__1 : rule__LiteralIntegerExpression__Group__1__Impl ;
+    public final void rule__LiteralIntegerExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57258:1: ( rule__LiteralIntegerExpression__Group__1__Impl )
+            // InternalFormalML.g:57259:2: rule__LiteralIntegerExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralIntegerExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralIntegerExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralIntegerExpression__Group__1__Impl"
+    // InternalFormalML.g:57265:1: rule__LiteralIntegerExpression__Group__1__Impl : ( ( rule__LiteralIntegerExpression__ValueAssignment_1 ) ) ;
+    public final void rule__LiteralIntegerExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57269:1: ( ( ( rule__LiteralIntegerExpression__ValueAssignment_1 ) ) )
+            // InternalFormalML.g:57270:1: ( ( rule__LiteralIntegerExpression__ValueAssignment_1 ) )
+            {
+            // InternalFormalML.g:57270:1: ( ( rule__LiteralIntegerExpression__ValueAssignment_1 ) )
+            // InternalFormalML.g:57271:2: ( rule__LiteralIntegerExpression__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralIntegerExpressionAccess().getValueAssignment_1()); 
+            }
+            // InternalFormalML.g:57272:2: ( rule__LiteralIntegerExpression__ValueAssignment_1 )
+            // InternalFormalML.g:57272:3: rule__LiteralIntegerExpression__ValueAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralIntegerExpression__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralIntegerExpressionAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralIntegerExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__Group__0"
+    // InternalFormalML.g:57281:1: rule__LiteralRationalExpression__Group__0 : rule__LiteralRationalExpression__Group__0__Impl rule__LiteralRationalExpression__Group__1 ;
+    public final void rule__LiteralRationalExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57285:1: ( rule__LiteralRationalExpression__Group__0__Impl rule__LiteralRationalExpression__Group__1 )
+            // InternalFormalML.g:57286:2: rule__LiteralRationalExpression__Group__0__Impl rule__LiteralRationalExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__LiteralRationalExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__Group__0__Impl"
+    // InternalFormalML.g:57293:1: rule__LiteralRationalExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralRationalExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57297:1: ( ( () ) )
+            // InternalFormalML.g:57298:1: ( () )
+            {
+            // InternalFormalML.g:57298:1: ( () )
+            // InternalFormalML.g:57299:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalExpressionAccess().getLiteralRationalExpressionAction_0()); 
+            }
+            // InternalFormalML.g:57300:2: ()
+            // InternalFormalML.g:57300:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalExpressionAccess().getLiteralRationalExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__Group__1"
+    // InternalFormalML.g:57308:1: rule__LiteralRationalExpression__Group__1 : rule__LiteralRationalExpression__Group__1__Impl rule__LiteralRationalExpression__Group__2 ;
+    public final void rule__LiteralRationalExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57312:1: ( rule__LiteralRationalExpression__Group__1__Impl rule__LiteralRationalExpression__Group__2 )
+            // InternalFormalML.g:57313:2: rule__LiteralRationalExpression__Group__1__Impl rule__LiteralRationalExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_253);
+            rule__LiteralRationalExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__Group__1__Impl"
+    // InternalFormalML.g:57320:1: rule__LiteralRationalExpression__Group__1__Impl : ( ( rule__LiteralRationalExpression__NumeratorAssignment_1 ) ) ;
+    public final void rule__LiteralRationalExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57324:1: ( ( ( rule__LiteralRationalExpression__NumeratorAssignment_1 ) ) )
+            // InternalFormalML.g:57325:1: ( ( rule__LiteralRationalExpression__NumeratorAssignment_1 ) )
+            {
+            // InternalFormalML.g:57325:1: ( ( rule__LiteralRationalExpression__NumeratorAssignment_1 ) )
+            // InternalFormalML.g:57326:2: ( rule__LiteralRationalExpression__NumeratorAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorAssignment_1()); 
+            }
+            // InternalFormalML.g:57327:2: ( rule__LiteralRationalExpression__NumeratorAssignment_1 )
+            // InternalFormalML.g:57327:3: rule__LiteralRationalExpression__NumeratorAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalExpression__NumeratorAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__Group__2"
+    // InternalFormalML.g:57335:1: rule__LiteralRationalExpression__Group__2 : rule__LiteralRationalExpression__Group__2__Impl rule__LiteralRationalExpression__Group__3 ;
+    public final void rule__LiteralRationalExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57339:1: ( rule__LiteralRationalExpression__Group__2__Impl rule__LiteralRationalExpression__Group__3 )
+            // InternalFormalML.g:57340:2: rule__LiteralRationalExpression__Group__2__Impl rule__LiteralRationalExpression__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_23);
+            rule__LiteralRationalExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__Group__2"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__Group__2__Impl"
+    // InternalFormalML.g:57347:1: rule__LiteralRationalExpression__Group__2__Impl : ( '/' ) ;
+    public final void rule__LiteralRationalExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57351:1: ( ( '/' ) )
+            // InternalFormalML.g:57352:1: ( '/' )
+            {
+            // InternalFormalML.g:57352:1: ( '/' )
+            // InternalFormalML.g:57353:2: '/'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalExpressionAccess().getSolidusKeyword_2()); 
+            }
+            match(input,259,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalExpressionAccess().getSolidusKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__Group__3"
+    // InternalFormalML.g:57362:1: rule__LiteralRationalExpression__Group__3 : rule__LiteralRationalExpression__Group__3__Impl ;
+    public final void rule__LiteralRationalExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57366:1: ( rule__LiteralRationalExpression__Group__3__Impl )
+            // InternalFormalML.g:57367:2: rule__LiteralRationalExpression__Group__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__Group__3"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__Group__3__Impl"
+    // InternalFormalML.g:57373:1: rule__LiteralRationalExpression__Group__3__Impl : ( ( rule__LiteralRationalExpression__DenominatorAssignment_3 ) ) ;
+    public final void rule__LiteralRationalExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57377:1: ( ( ( rule__LiteralRationalExpression__DenominatorAssignment_3 ) ) )
+            // InternalFormalML.g:57378:1: ( ( rule__LiteralRationalExpression__DenominatorAssignment_3 ) )
+            {
+            // InternalFormalML.g:57378:1: ( ( rule__LiteralRationalExpression__DenominatorAssignment_3 ) )
+            // InternalFormalML.g:57379:2: ( rule__LiteralRationalExpression__DenominatorAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorAssignment_3()); 
+            }
+            // InternalFormalML.g:57380:2: ( rule__LiteralRationalExpression__DenominatorAssignment_3 )
+            // InternalFormalML.g:57380:3: rule__LiteralRationalExpression__DenominatorAssignment_3
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralRationalExpression__DenominatorAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__LiteralFloatExpression__Group__0"
+    // InternalFormalML.g:57389:1: rule__LiteralFloatExpression__Group__0 : rule__LiteralFloatExpression__Group__0__Impl rule__LiteralFloatExpression__Group__1 ;
+    public final void rule__LiteralFloatExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57393:1: ( rule__LiteralFloatExpression__Group__0__Impl rule__LiteralFloatExpression__Group__1 )
+            // InternalFormalML.g:57394:2: rule__LiteralFloatExpression__Group__0__Impl rule__LiteralFloatExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_24);
+            rule__LiteralFloatExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralFloatExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralFloatExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralFloatExpression__Group__0__Impl"
+    // InternalFormalML.g:57401:1: rule__LiteralFloatExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralFloatExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57405:1: ( ( () ) )
+            // InternalFormalML.g:57406:1: ( () )
+            {
+            // InternalFormalML.g:57406:1: ( () )
+            // InternalFormalML.g:57407:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralFloatExpressionAccess().getLiteralFloatExpressionAction_0()); 
+            }
+            // InternalFormalML.g:57408:2: ()
+            // InternalFormalML.g:57408:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralFloatExpressionAccess().getLiteralFloatExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralFloatExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralFloatExpression__Group__1"
+    // InternalFormalML.g:57416:1: rule__LiteralFloatExpression__Group__1 : rule__LiteralFloatExpression__Group__1__Impl ;
+    public final void rule__LiteralFloatExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57420:1: ( rule__LiteralFloatExpression__Group__1__Impl )
+            // InternalFormalML.g:57421:2: rule__LiteralFloatExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralFloatExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralFloatExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralFloatExpression__Group__1__Impl"
+    // InternalFormalML.g:57427:1: rule__LiteralFloatExpression__Group__1__Impl : ( ( rule__LiteralFloatExpression__ValueAssignment_1 ) ) ;
+    public final void rule__LiteralFloatExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57431:1: ( ( ( rule__LiteralFloatExpression__ValueAssignment_1 ) ) )
+            // InternalFormalML.g:57432:1: ( ( rule__LiteralFloatExpression__ValueAssignment_1 ) )
+            {
+            // InternalFormalML.g:57432:1: ( ( rule__LiteralFloatExpression__ValueAssignment_1 ) )
+            // InternalFormalML.g:57433:2: ( rule__LiteralFloatExpression__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralFloatExpressionAccess().getValueAssignment_1()); 
+            }
+            // InternalFormalML.g:57434:2: ( rule__LiteralFloatExpression__ValueAssignment_1 )
+            // InternalFormalML.g:57434:3: rule__LiteralFloatExpression__ValueAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralFloatExpression__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralFloatExpressionAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralFloatExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralCharacterExpression__Group__0"
+    // InternalFormalML.g:57443:1: rule__LiteralCharacterExpression__Group__0 : rule__LiteralCharacterExpression__Group__0__Impl rule__LiteralCharacterExpression__Group__1 ;
+    public final void rule__LiteralCharacterExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57447:1: ( rule__LiteralCharacterExpression__Group__0__Impl rule__LiteralCharacterExpression__Group__1 )
+            // InternalFormalML.g:57448:2: rule__LiteralCharacterExpression__Group__0__Impl rule__LiteralCharacterExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_268);
+            rule__LiteralCharacterExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCharacterExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCharacterExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralCharacterExpression__Group__0__Impl"
+    // InternalFormalML.g:57455:1: rule__LiteralCharacterExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralCharacterExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57459:1: ( ( () ) )
+            // InternalFormalML.g:57460:1: ( () )
+            {
+            // InternalFormalML.g:57460:1: ( () )
+            // InternalFormalML.g:57461:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCharacterExpressionAccess().getLiteralCharacterExpressionAction_0()); 
+            }
+            // InternalFormalML.g:57462:2: ()
+            // InternalFormalML.g:57462:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCharacterExpressionAccess().getLiteralCharacterExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCharacterExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralCharacterExpression__Group__1"
+    // InternalFormalML.g:57470:1: rule__LiteralCharacterExpression__Group__1 : rule__LiteralCharacterExpression__Group__1__Impl ;
+    public final void rule__LiteralCharacterExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57474:1: ( rule__LiteralCharacterExpression__Group__1__Impl )
+            // InternalFormalML.g:57475:2: rule__LiteralCharacterExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCharacterExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCharacterExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralCharacterExpression__Group__1__Impl"
+    // InternalFormalML.g:57481:1: rule__LiteralCharacterExpression__Group__1__Impl : ( ( rule__LiteralCharacterExpression__ValueAssignment_1 ) ) ;
+    public final void rule__LiteralCharacterExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57485:1: ( ( ( rule__LiteralCharacterExpression__ValueAssignment_1 ) ) )
+            // InternalFormalML.g:57486:1: ( ( rule__LiteralCharacterExpression__ValueAssignment_1 ) )
+            {
+            // InternalFormalML.g:57486:1: ( ( rule__LiteralCharacterExpression__ValueAssignment_1 ) )
+            // InternalFormalML.g:57487:2: ( rule__LiteralCharacterExpression__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCharacterExpressionAccess().getValueAssignment_1()); 
+            }
+            // InternalFormalML.g:57488:2: ( rule__LiteralCharacterExpression__ValueAssignment_1 )
+            // InternalFormalML.g:57488:3: rule__LiteralCharacterExpression__ValueAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCharacterExpression__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCharacterExpressionAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCharacterExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralStringExpression__Group__0"
+    // InternalFormalML.g:57497:1: rule__LiteralStringExpression__Group__0 : rule__LiteralStringExpression__Group__0__Impl rule__LiteralStringExpression__Group__1 ;
+    public final void rule__LiteralStringExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57501:1: ( rule__LiteralStringExpression__Group__0__Impl rule__LiteralStringExpression__Group__1 )
+            // InternalFormalML.g:57502:2: rule__LiteralStringExpression__Group__0__Impl rule__LiteralStringExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_15);
+            rule__LiteralStringExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralStringExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralStringExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralStringExpression__Group__0__Impl"
+    // InternalFormalML.g:57509:1: rule__LiteralStringExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralStringExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57513:1: ( ( () ) )
+            // InternalFormalML.g:57514:1: ( () )
+            {
+            // InternalFormalML.g:57514:1: ( () )
+            // InternalFormalML.g:57515:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralStringExpressionAccess().getLiteralStringExpressionAction_0()); 
+            }
+            // InternalFormalML.g:57516:2: ()
+            // InternalFormalML.g:57516:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralStringExpressionAccess().getLiteralStringExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralStringExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralStringExpression__Group__1"
+    // InternalFormalML.g:57524:1: rule__LiteralStringExpression__Group__1 : rule__LiteralStringExpression__Group__1__Impl ;
+    public final void rule__LiteralStringExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57528:1: ( rule__LiteralStringExpression__Group__1__Impl )
+            // InternalFormalML.g:57529:2: rule__LiteralStringExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralStringExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralStringExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralStringExpression__Group__1__Impl"
+    // InternalFormalML.g:57535:1: rule__LiteralStringExpression__Group__1__Impl : ( ( rule__LiteralStringExpression__ValueAssignment_1 ) ) ;
+    public final void rule__LiteralStringExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57539:1: ( ( ( rule__LiteralStringExpression__ValueAssignment_1 ) ) )
+            // InternalFormalML.g:57540:1: ( ( rule__LiteralStringExpression__ValueAssignment_1 ) )
+            {
+            // InternalFormalML.g:57540:1: ( ( rule__LiteralStringExpression__ValueAssignment_1 ) )
+            // InternalFormalML.g:57541:2: ( rule__LiteralStringExpression__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralStringExpressionAccess().getValueAssignment_1()); 
+            }
+            // InternalFormalML.g:57542:2: ( rule__LiteralStringExpression__ValueAssignment_1 )
+            // InternalFormalML.g:57542:3: rule__LiteralStringExpression__ValueAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralStringExpression__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralStringExpressionAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralStringExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_0__0"
+    // InternalFormalML.g:57551:1: rule__LiteralNullExpression__Group_0__0 : rule__LiteralNullExpression__Group_0__0__Impl rule__LiteralNullExpression__Group_0__1 ;
+    public final void rule__LiteralNullExpression__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57555:1: ( rule__LiteralNullExpression__Group_0__0__Impl rule__LiteralNullExpression__Group_0__1 )
+            // InternalFormalML.g:57556:2: rule__LiteralNullExpression__Group_0__0__Impl rule__LiteralNullExpression__Group_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_269);
+            rule__LiteralNullExpression__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_0__0"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_0__0__Impl"
+    // InternalFormalML.g:57563:1: rule__LiteralNullExpression__Group_0__0__Impl : ( () ) ;
+    public final void rule__LiteralNullExpression__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57567:1: ( ( () ) )
+            // InternalFormalML.g:57568:1: ( () )
+            {
+            // InternalFormalML.g:57568:1: ( () )
+            // InternalFormalML.g:57569:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_0_0()); 
+            }
+            // InternalFormalML.g:57570:2: ()
+            // InternalFormalML.g:57570:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_0__1"
+    // InternalFormalML.g:57578:1: rule__LiteralNullExpression__Group_0__1 : rule__LiteralNullExpression__Group_0__1__Impl ;
+    public final void rule__LiteralNullExpression__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57582:1: ( rule__LiteralNullExpression__Group_0__1__Impl )
+            // InternalFormalML.g:57583:2: rule__LiteralNullExpression__Group_0__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_0__1"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_0__1__Impl"
+    // InternalFormalML.g:57589:1: rule__LiteralNullExpression__Group_0__1__Impl : ( ( rule__LiteralNullExpression__Alternatives_0_1 ) ) ;
+    public final void rule__LiteralNullExpression__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57593:1: ( ( ( rule__LiteralNullExpression__Alternatives_0_1 ) ) )
+            // InternalFormalML.g:57594:1: ( ( rule__LiteralNullExpression__Alternatives_0_1 ) )
+            {
+            // InternalFormalML.g:57594:1: ( ( rule__LiteralNullExpression__Alternatives_0_1 ) )
+            // InternalFormalML.g:57595:2: ( rule__LiteralNullExpression__Alternatives_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_0_1()); 
+            }
+            // InternalFormalML.g:57596:2: ( rule__LiteralNullExpression__Alternatives_0_1 )
+            // InternalFormalML.g:57596:3: rule__LiteralNullExpression__Alternatives_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__Alternatives_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_1__0"
+    // InternalFormalML.g:57605:1: rule__LiteralNullExpression__Group_1__0 : rule__LiteralNullExpression__Group_1__0__Impl rule__LiteralNullExpression__Group_1__1 ;
+    public final void rule__LiteralNullExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57609:1: ( rule__LiteralNullExpression__Group_1__0__Impl rule__LiteralNullExpression__Group_1__1 )
+            // InternalFormalML.g:57610:2: rule__LiteralNullExpression__Group_1__0__Impl rule__LiteralNullExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_161);
+            rule__LiteralNullExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_1__0__Impl"
+    // InternalFormalML.g:57617:1: rule__LiteralNullExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__LiteralNullExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57621:1: ( ( () ) )
+            // InternalFormalML.g:57622:1: ( () )
+            {
+            // InternalFormalML.g:57622:1: ( () )
+            // InternalFormalML.g:57623:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_1_0()); 
+            }
+            // InternalFormalML.g:57624:2: ()
+            // InternalFormalML.g:57624:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_1__1"
+    // InternalFormalML.g:57632:1: rule__LiteralNullExpression__Group_1__1 : rule__LiteralNullExpression__Group_1__1__Impl rule__LiteralNullExpression__Group_1__2 ;
+    public final void rule__LiteralNullExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57636:1: ( rule__LiteralNullExpression__Group_1__1__Impl rule__LiteralNullExpression__Group_1__2 )
+            // InternalFormalML.g:57637:2: rule__LiteralNullExpression__Group_1__1__Impl rule__LiteralNullExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__LiteralNullExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_1__1__Impl"
+    // InternalFormalML.g:57644:1: rule__LiteralNullExpression__Group_1__1__Impl : ( ( rule__LiteralNullExpression__Alternatives_1_1 ) ) ;
+    public final void rule__LiteralNullExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57648:1: ( ( ( rule__LiteralNullExpression__Alternatives_1_1 ) ) )
+            // InternalFormalML.g:57649:1: ( ( rule__LiteralNullExpression__Alternatives_1_1 ) )
+            {
+            // InternalFormalML.g:57649:1: ( ( rule__LiteralNullExpression__Alternatives_1_1 ) )
+            // InternalFormalML.g:57650:2: ( rule__LiteralNullExpression__Alternatives_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_1_1()); 
+            }
+            // InternalFormalML.g:57651:2: ( rule__LiteralNullExpression__Alternatives_1_1 )
+            // InternalFormalML.g:57651:3: rule__LiteralNullExpression__Alternatives_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__Alternatives_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullExpressionAccess().getAlternatives_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_1__2"
+    // InternalFormalML.g:57659:1: rule__LiteralNullExpression__Group_1__2 : rule__LiteralNullExpression__Group_1__2__Impl rule__LiteralNullExpression__Group_1__3 ;
+    public final void rule__LiteralNullExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57663:1: ( rule__LiteralNullExpression__Group_1__2__Impl rule__LiteralNullExpression__Group_1__3 )
+            // InternalFormalML.g:57664:2: rule__LiteralNullExpression__Group_1__2__Impl rule__LiteralNullExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__LiteralNullExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_1__2__Impl"
+    // InternalFormalML.g:57671:1: rule__LiteralNullExpression__Group_1__2__Impl : ( ( rule__LiteralNullExpression__TypeAssignment_1_2 ) ) ;
+    public final void rule__LiteralNullExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57675:1: ( ( ( rule__LiteralNullExpression__TypeAssignment_1_2 ) ) )
+            // InternalFormalML.g:57676:1: ( ( rule__LiteralNullExpression__TypeAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:57676:1: ( ( rule__LiteralNullExpression__TypeAssignment_1_2 ) )
+            // InternalFormalML.g:57677:2: ( rule__LiteralNullExpression__TypeAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullExpressionAccess().getTypeAssignment_1_2()); 
+            }
+            // InternalFormalML.g:57678:2: ( rule__LiteralNullExpression__TypeAssignment_1_2 )
+            // InternalFormalML.g:57678:3: rule__LiteralNullExpression__TypeAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__TypeAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullExpressionAccess().getTypeAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_1__3"
+    // InternalFormalML.g:57686:1: rule__LiteralNullExpression__Group_1__3 : rule__LiteralNullExpression__Group_1__3__Impl ;
+    public final void rule__LiteralNullExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57690:1: ( rule__LiteralNullExpression__Group_1__3__Impl )
+            // InternalFormalML.g:57691:2: rule__LiteralNullExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralNullExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__Group_1__3__Impl"
+    // InternalFormalML.g:57697:1: rule__LiteralNullExpression__Group_1__3__Impl : ( '>' ) ;
+    public final void rule__LiteralNullExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57701:1: ( ( '>' ) )
+            // InternalFormalML.g:57702:1: ( '>' )
+            {
+            // InternalFormalML.g:57702:1: ( '>' )
+            // InternalFormalML.g:57703:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullExpressionAccess().getGreaterThanSignKeyword_1_3()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullExpressionAccess().getGreaterThanSignKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__0"
+    // InternalFormalML.g:57713:1: rule__LiteralCollectionExpression__Group__0 : rule__LiteralCollectionExpression__Group__0__Impl rule__LiteralCollectionExpression__Group__1 ;
+    public final void rule__LiteralCollectionExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57717:1: ( rule__LiteralCollectionExpression__Group__0__Impl rule__LiteralCollectionExpression__Group__1 )
+            // InternalFormalML.g:57718:2: rule__LiteralCollectionExpression__Group__0__Impl rule__LiteralCollectionExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_270);
+            rule__LiteralCollectionExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__0__Impl"
+    // InternalFormalML.g:57725:1: rule__LiteralCollectionExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralCollectionExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57729:1: ( ( () ) )
+            // InternalFormalML.g:57730:1: ( () )
+            {
+            // InternalFormalML.g:57730:1: ( () )
+            // InternalFormalML.g:57731:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getLiteralCollectionExpressionAction_0()); 
+            }
+            // InternalFormalML.g:57732:2: ()
+            // InternalFormalML.g:57732:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getLiteralCollectionExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__1"
+    // InternalFormalML.g:57740:1: rule__LiteralCollectionExpression__Group__1 : rule__LiteralCollectionExpression__Group__1__Impl rule__LiteralCollectionExpression__Group__2 ;
+    public final void rule__LiteralCollectionExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57744:1: ( rule__LiteralCollectionExpression__Group__1__Impl rule__LiteralCollectionExpression__Group__2 )
+            // InternalFormalML.g:57745:2: rule__LiteralCollectionExpression__Group__1__Impl rule__LiteralCollectionExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_270);
+            rule__LiteralCollectionExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__1__Impl"
+    // InternalFormalML.g:57752:1: rule__LiteralCollectionExpression__Group__1__Impl : ( ( rule__LiteralCollectionExpression__Group_1__0 )? ) ;
+    public final void rule__LiteralCollectionExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57756:1: ( ( ( rule__LiteralCollectionExpression__Group_1__0 )? ) )
+            // InternalFormalML.g:57757:1: ( ( rule__LiteralCollectionExpression__Group_1__0 )? )
+            {
+            // InternalFormalML.g:57757:1: ( ( rule__LiteralCollectionExpression__Group_1__0 )? )
+            // InternalFormalML.g:57758:2: ( rule__LiteralCollectionExpression__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:57759:2: ( rule__LiteralCollectionExpression__Group_1__0 )?
+            int alt689=2;
+            int LA689_0 = input.LA(1);
+
+            if ( (LA689_0==125) ) {
+                alt689=1;
+            }
+            switch (alt689) {
+                case 1 :
+                    // InternalFormalML.g:57759:3: rule__LiteralCollectionExpression__Group_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralCollectionExpression__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__2"
+    // InternalFormalML.g:57767:1: rule__LiteralCollectionExpression__Group__2 : rule__LiteralCollectionExpression__Group__2__Impl rule__LiteralCollectionExpression__Group__3 ;
+    public final void rule__LiteralCollectionExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57771:1: ( rule__LiteralCollectionExpression__Group__2__Impl rule__LiteralCollectionExpression__Group__3 )
+            // InternalFormalML.g:57772:2: rule__LiteralCollectionExpression__Group__2__Impl rule__LiteralCollectionExpression__Group__3
+            {
+            pushFollow(FollowSets000.FOLLOW_271);
+            rule__LiteralCollectionExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__2"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__2__Impl"
+    // InternalFormalML.g:57779:1: rule__LiteralCollectionExpression__Group__2__Impl : ( '{' ) ;
+    public final void rule__LiteralCollectionExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57783:1: ( ( '{' ) )
+            // InternalFormalML.g:57784:1: ( '{' )
+            {
+            // InternalFormalML.g:57784:1: ( '{' )
+            // InternalFormalML.g:57785:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+            match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getLeftCurlyBracketKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__3"
+    // InternalFormalML.g:57794:1: rule__LiteralCollectionExpression__Group__3 : rule__LiteralCollectionExpression__Group__3__Impl rule__LiteralCollectionExpression__Group__4 ;
+    public final void rule__LiteralCollectionExpression__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57798:1: ( rule__LiteralCollectionExpression__Group__3__Impl rule__LiteralCollectionExpression__Group__4 )
+            // InternalFormalML.g:57799:2: rule__LiteralCollectionExpression__Group__3__Impl rule__LiteralCollectionExpression__Group__4
+            {
+            pushFollow(FollowSets000.FOLLOW_271);
+            rule__LiteralCollectionExpression__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__3"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__3__Impl"
+    // InternalFormalML.g:57806:1: rule__LiteralCollectionExpression__Group__3__Impl : ( ( rule__LiteralCollectionExpression__Group_3__0 )? ) ;
+    public final void rule__LiteralCollectionExpression__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57810:1: ( ( ( rule__LiteralCollectionExpression__Group_3__0 )? ) )
+            // InternalFormalML.g:57811:1: ( ( rule__LiteralCollectionExpression__Group_3__0 )? )
+            {
+            // InternalFormalML.g:57811:1: ( ( rule__LiteralCollectionExpression__Group_3__0 )? )
+            // InternalFormalML.g:57812:2: ( rule__LiteralCollectionExpression__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3()); 
+            }
+            // InternalFormalML.g:57813:2: ( rule__LiteralCollectionExpression__Group_3__0 )?
+            int alt690=2;
+            int LA690_0 = input.LA(1);
+
+            if ( ((LA690_0>=RULE_CHARACTER && LA690_0<=RULE_INT)||LA690_0==20||LA690_0==23||(LA690_0>=29 && LA690_0<=30)||LA690_0==125||(LA690_0>=129 && LA690_0<=134)||(LA690_0>=137 && LA690_0<=142)||LA690_0==199||(LA690_0>=261 && LA690_0<=271)||LA690_0==287) ) {
+                alt690=1;
+            }
+            switch (alt690) {
+                case 1 :
+                    // InternalFormalML.g:57813:3: rule__LiteralCollectionExpression__Group_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralCollectionExpression__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__3__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__4"
+    // InternalFormalML.g:57821:1: rule__LiteralCollectionExpression__Group__4 : rule__LiteralCollectionExpression__Group__4__Impl ;
+    public final void rule__LiteralCollectionExpression__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57825:1: ( rule__LiteralCollectionExpression__Group__4__Impl )
+            // InternalFormalML.g:57826:2: rule__LiteralCollectionExpression__Group__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__4"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group__4__Impl"
+    // InternalFormalML.g:57832:1: rule__LiteralCollectionExpression__Group__4__Impl : ( '}' ) ;
+    public final void rule__LiteralCollectionExpression__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57836:1: ( ( '}' ) )
+            // InternalFormalML.g:57837:1: ( '}' )
+            {
+            // InternalFormalML.g:57837:1: ( '}' )
+            // InternalFormalML.g:57838:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getRightCurlyBracketKeyword_4()); 
+            }
+            match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getRightCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group__4__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_1__0"
+    // InternalFormalML.g:57848:1: rule__LiteralCollectionExpression__Group_1__0 : rule__LiteralCollectionExpression__Group_1__0__Impl rule__LiteralCollectionExpression__Group_1__1 ;
+    public final void rule__LiteralCollectionExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57852:1: ( rule__LiteralCollectionExpression__Group_1__0__Impl rule__LiteralCollectionExpression__Group_1__1 )
+            // InternalFormalML.g:57853:2: rule__LiteralCollectionExpression__Group_1__0__Impl rule__LiteralCollectionExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_64);
+            rule__LiteralCollectionExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_1__0__Impl"
+    // InternalFormalML.g:57860:1: rule__LiteralCollectionExpression__Group_1__0__Impl : ( '<' ) ;
+    public final void rule__LiteralCollectionExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57864:1: ( ( '<' ) )
+            // InternalFormalML.g:57865:1: ( '<' )
+            {
+            // InternalFormalML.g:57865:1: ( '<' )
+            // InternalFormalML.g:57866:2: '<'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getLessThanSignKeyword_1_0()); 
+            }
+            match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getLessThanSignKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_1__1"
+    // InternalFormalML.g:57875:1: rule__LiteralCollectionExpression__Group_1__1 : rule__LiteralCollectionExpression__Group_1__1__Impl rule__LiteralCollectionExpression__Group_1__2 ;
+    public final void rule__LiteralCollectionExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57879:1: ( rule__LiteralCollectionExpression__Group_1__1__Impl rule__LiteralCollectionExpression__Group_1__2 )
+            // InternalFormalML.g:57880:2: rule__LiteralCollectionExpression__Group_1__1__Impl rule__LiteralCollectionExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_38);
+            rule__LiteralCollectionExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_1__1__Impl"
+    // InternalFormalML.g:57887:1: rule__LiteralCollectionExpression__Group_1__1__Impl : ( ( rule__LiteralCollectionExpression__DatatypeAssignment_1_1 ) ) ;
+    public final void rule__LiteralCollectionExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57891:1: ( ( ( rule__LiteralCollectionExpression__DatatypeAssignment_1_1 ) ) )
+            // InternalFormalML.g:57892:1: ( ( rule__LiteralCollectionExpression__DatatypeAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:57892:1: ( ( rule__LiteralCollectionExpression__DatatypeAssignment_1_1 ) )
+            // InternalFormalML.g:57893:2: ( rule__LiteralCollectionExpression__DatatypeAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeAssignment_1_1()); 
+            }
+            // InternalFormalML.g:57894:2: ( rule__LiteralCollectionExpression__DatatypeAssignment_1_1 )
+            // InternalFormalML.g:57894:3: rule__LiteralCollectionExpression__DatatypeAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__DatatypeAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_1__2"
+    // InternalFormalML.g:57902:1: rule__LiteralCollectionExpression__Group_1__2 : rule__LiteralCollectionExpression__Group_1__2__Impl ;
+    public final void rule__LiteralCollectionExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57906:1: ( rule__LiteralCollectionExpression__Group_1__2__Impl )
+            // InternalFormalML.g:57907:2: rule__LiteralCollectionExpression__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_1__2__Impl"
+    // InternalFormalML.g:57913:1: rule__LiteralCollectionExpression__Group_1__2__Impl : ( '>' ) ;
+    public final void rule__LiteralCollectionExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57917:1: ( ( '>' ) )
+            // InternalFormalML.g:57918:1: ( '>' )
+            {
+            // InternalFormalML.g:57918:1: ( '>' )
+            // InternalFormalML.g:57919:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getGreaterThanSignKeyword_1_2()); 
+            }
+            match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getGreaterThanSignKeyword_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_3__0"
+    // InternalFormalML.g:57929:1: rule__LiteralCollectionExpression__Group_3__0 : rule__LiteralCollectionExpression__Group_3__0__Impl rule__LiteralCollectionExpression__Group_3__1 ;
+    public final void rule__LiteralCollectionExpression__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57933:1: ( rule__LiteralCollectionExpression__Group_3__0__Impl rule__LiteralCollectionExpression__Group_3__1 )
+            // InternalFormalML.g:57934:2: rule__LiteralCollectionExpression__Group_3__0__Impl rule__LiteralCollectionExpression__Group_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_14);
+            rule__LiteralCollectionExpression__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_3__0"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_3__0__Impl"
+    // InternalFormalML.g:57941:1: rule__LiteralCollectionExpression__Group_3__0__Impl : ( ( rule__LiteralCollectionExpression__Alternatives_3_0 ) ) ;
+    public final void rule__LiteralCollectionExpression__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57945:1: ( ( ( rule__LiteralCollectionExpression__Alternatives_3_0 ) ) )
+            // InternalFormalML.g:57946:1: ( ( rule__LiteralCollectionExpression__Alternatives_3_0 ) )
+            {
+            // InternalFormalML.g:57946:1: ( ( rule__LiteralCollectionExpression__Alternatives_3_0 ) )
+            // InternalFormalML.g:57947:2: ( rule__LiteralCollectionExpression__Alternatives_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_0()); 
+            }
+            // InternalFormalML.g:57948:2: ( rule__LiteralCollectionExpression__Alternatives_3_0 )
+            // InternalFormalML.g:57948:3: rule__LiteralCollectionExpression__Alternatives_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Alternatives_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_3__1"
+    // InternalFormalML.g:57956:1: rule__LiteralCollectionExpression__Group_3__1 : rule__LiteralCollectionExpression__Group_3__1__Impl ;
+    public final void rule__LiteralCollectionExpression__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57960:1: ( rule__LiteralCollectionExpression__Group_3__1__Impl )
+            // InternalFormalML.g:57961:2: rule__LiteralCollectionExpression__Group_3__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_3__1"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_3__1__Impl"
+    // InternalFormalML.g:57967:1: rule__LiteralCollectionExpression__Group_3__1__Impl : ( ( rule__LiteralCollectionExpression__Group_3_1__0 )* ) ;
+    public final void rule__LiteralCollectionExpression__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57971:1: ( ( ( rule__LiteralCollectionExpression__Group_3_1__0 )* ) )
+            // InternalFormalML.g:57972:1: ( ( rule__LiteralCollectionExpression__Group_3_1__0 )* )
+            {
+            // InternalFormalML.g:57972:1: ( ( rule__LiteralCollectionExpression__Group_3_1__0 )* )
+            // InternalFormalML.g:57973:2: ( rule__LiteralCollectionExpression__Group_3_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3_1()); 
+            }
+            // InternalFormalML.g:57974:2: ( rule__LiteralCollectionExpression__Group_3_1__0 )*
+            loop691:
+            do {
+                int alt691=2;
+                int LA691_0 = input.LA(1);
+
+                if ( (LA691_0==198) ) {
+                    alt691=1;
+                }
+
+
+                switch (alt691) {
+            	case 1 :
+            	    // InternalFormalML.g:57974:3: rule__LiteralCollectionExpression__Group_3_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_54);
+            	    rule__LiteralCollectionExpression__Group_3_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop691;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getGroup_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_3_1__0"
+    // InternalFormalML.g:57983:1: rule__LiteralCollectionExpression__Group_3_1__0 : rule__LiteralCollectionExpression__Group_3_1__0__Impl rule__LiteralCollectionExpression__Group_3_1__1 ;
+    public final void rule__LiteralCollectionExpression__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57987:1: ( rule__LiteralCollectionExpression__Group_3_1__0__Impl rule__LiteralCollectionExpression__Group_3_1__1 )
+            // InternalFormalML.g:57988:2: rule__LiteralCollectionExpression__Group_3_1__0__Impl rule__LiteralCollectionExpression__Group_3_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__LiteralCollectionExpression__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_3_1__0"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_3_1__0__Impl"
+    // InternalFormalML.g:57995:1: rule__LiteralCollectionExpression__Group_3_1__0__Impl : ( ',' ) ;
+    public final void rule__LiteralCollectionExpression__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:57999:1: ( ( ',' ) )
+            // InternalFormalML.g:58000:1: ( ',' )
+            {
+            // InternalFormalML.g:58000:1: ( ',' )
+            // InternalFormalML.g:58001:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getCommaKeyword_3_1_0()); 
+            }
+            match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getCommaKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_3_1__1"
+    // InternalFormalML.g:58010:1: rule__LiteralCollectionExpression__Group_3_1__1 : rule__LiteralCollectionExpression__Group_3_1__1__Impl ;
+    public final void rule__LiteralCollectionExpression__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58014:1: ( rule__LiteralCollectionExpression__Group_3_1__1__Impl )
+            // InternalFormalML.g:58015:2: rule__LiteralCollectionExpression__Group_3_1__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_3_1__1"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__Group_3_1__1__Impl"
+    // InternalFormalML.g:58021:1: rule__LiteralCollectionExpression__Group_3_1__1__Impl : ( ( rule__LiteralCollectionExpression__Alternatives_3_1_1 ) ) ;
+    public final void rule__LiteralCollectionExpression__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58025:1: ( ( ( rule__LiteralCollectionExpression__Alternatives_3_1_1 ) ) )
+            // InternalFormalML.g:58026:1: ( ( rule__LiteralCollectionExpression__Alternatives_3_1_1 ) )
+            {
+            // InternalFormalML.g:58026:1: ( ( rule__LiteralCollectionExpression__Alternatives_3_1_1 ) )
+            // InternalFormalML.g:58027:2: ( rule__LiteralCollectionExpression__Alternatives_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_1_1()); 
+            }
+            // InternalFormalML.g:58028:2: ( rule__LiteralCollectionExpression__Alternatives_3_1_1 )
+            // InternalFormalML.g:58028:3: rule__LiteralCollectionExpression__Alternatives_3_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralCollectionExpression__Alternatives_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getAlternatives_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__Group_3_1__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group__0"
+    // InternalFormalML.g:58037:1: rule__LiteralReferenceElement__Group__0 : rule__LiteralReferenceElement__Group__0__Impl rule__LiteralReferenceElement__Group__1 ;
+    public final void rule__LiteralReferenceElement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58041:1: ( rule__LiteralReferenceElement__Group__0__Impl rule__LiteralReferenceElement__Group__1 )
+            // InternalFormalML.g:58042:2: rule__LiteralReferenceElement__Group__0__Impl rule__LiteralReferenceElement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__LiteralReferenceElement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group__0"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group__0__Impl"
+    // InternalFormalML.g:58049:1: rule__LiteralReferenceElement__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralReferenceElement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58053:1: ( ( () ) )
+            // InternalFormalML.g:58054:1: ( () )
+            {
+            // InternalFormalML.g:58054:1: ( () )
+            // InternalFormalML.g:58055:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getLiteralReferenceElementAction_0()); 
+            }
+            // InternalFormalML.g:58056:2: ()
+            // InternalFormalML.g:58056:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getLiteralReferenceElementAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group__1"
+    // InternalFormalML.g:58064:1: rule__LiteralReferenceElement__Group__1 : rule__LiteralReferenceElement__Group__1__Impl rule__LiteralReferenceElement__Group__2 ;
+    public final void rule__LiteralReferenceElement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58068:1: ( rule__LiteralReferenceElement__Group__1__Impl rule__LiteralReferenceElement__Group__2 )
+            // InternalFormalML.g:58069:2: rule__LiteralReferenceElement__Group__1__Impl rule__LiteralReferenceElement__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_261);
+            rule__LiteralReferenceElement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group__1"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group__1__Impl"
+    // InternalFormalML.g:58076:1: rule__LiteralReferenceElement__Group__1__Impl : ( ( rule__LiteralReferenceElement__ValueAssignment_1 ) ) ;
+    public final void rule__LiteralReferenceElement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58080:1: ( ( ( rule__LiteralReferenceElement__ValueAssignment_1 ) ) )
+            // InternalFormalML.g:58081:1: ( ( rule__LiteralReferenceElement__ValueAssignment_1 ) )
+            {
+            // InternalFormalML.g:58081:1: ( ( rule__LiteralReferenceElement__ValueAssignment_1 ) )
+            // InternalFormalML.g:58082:2: ( rule__LiteralReferenceElement__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getValueAssignment_1()); 
+            }
+            // InternalFormalML.g:58083:2: ( rule__LiteralReferenceElement__ValueAssignment_1 )
+            // InternalFormalML.g:58083:3: rule__LiteralReferenceElement__ValueAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group__2"
+    // InternalFormalML.g:58091:1: rule__LiteralReferenceElement__Group__2 : rule__LiteralReferenceElement__Group__2__Impl ;
+    public final void rule__LiteralReferenceElement__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58095:1: ( rule__LiteralReferenceElement__Group__2__Impl )
+            // InternalFormalML.g:58096:2: rule__LiteralReferenceElement__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group__2"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group__2__Impl"
+    // InternalFormalML.g:58102:1: rule__LiteralReferenceElement__Group__2__Impl : ( ( rule__LiteralReferenceElement__Alternatives_2 )? ) ;
+    public final void rule__LiteralReferenceElement__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58106:1: ( ( ( rule__LiteralReferenceElement__Alternatives_2 )? ) )
+            // InternalFormalML.g:58107:1: ( ( rule__LiteralReferenceElement__Alternatives_2 )? )
+            {
+            // InternalFormalML.g:58107:1: ( ( rule__LiteralReferenceElement__Alternatives_2 )? )
+            // InternalFormalML.g:58108:2: ( rule__LiteralReferenceElement__Alternatives_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getAlternatives_2()); 
+            }
+            // InternalFormalML.g:58109:2: ( rule__LiteralReferenceElement__Alternatives_2 )?
+            int alt692=2;
+            alt692 = dfa692.predict(input);
+            switch (alt692) {
+                case 1 :
+                    // InternalFormalML.g:58109:3: rule__LiteralReferenceElement__Alternatives_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__LiteralReferenceElement__Alternatives_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_0__0"
+    // InternalFormalML.g:58118:1: rule__LiteralReferenceElement__Group_2_0__0 : rule__LiteralReferenceElement__Group_2_0__0__Impl rule__LiteralReferenceElement__Group_2_0__1 ;
+    public final void rule__LiteralReferenceElement__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58122:1: ( rule__LiteralReferenceElement__Group_2_0__0__Impl rule__LiteralReferenceElement__Group_2_0__1 )
+            // InternalFormalML.g:58123:2: rule__LiteralReferenceElement__Group_2_0__0__Impl rule__LiteralReferenceElement__Group_2_0__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__LiteralReferenceElement__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_0__0"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_0__0__Impl"
+    // InternalFormalML.g:58130:1: rule__LiteralReferenceElement__Group_2_0__0__Impl : ( ( rule__LiteralReferenceElement__KindAssignment_2_0_0 ) ) ;
+    public final void rule__LiteralReferenceElement__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58134:1: ( ( ( rule__LiteralReferenceElement__KindAssignment_2_0_0 ) ) )
+            // InternalFormalML.g:58135:1: ( ( rule__LiteralReferenceElement__KindAssignment_2_0_0 ) )
+            {
+            // InternalFormalML.g:58135:1: ( ( rule__LiteralReferenceElement__KindAssignment_2_0_0 ) )
+            // InternalFormalML.g:58136:2: ( rule__LiteralReferenceElement__KindAssignment_2_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_0_0()); 
+            }
+            // InternalFormalML.g:58137:2: ( rule__LiteralReferenceElement__KindAssignment_2_0_0 )
+            // InternalFormalML.g:58137:3: rule__LiteralReferenceElement__KindAssignment_2_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__KindAssignment_2_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_0__1"
+    // InternalFormalML.g:58145:1: rule__LiteralReferenceElement__Group_2_0__1 : rule__LiteralReferenceElement__Group_2_0__1__Impl rule__LiteralReferenceElement__Group_2_0__2 ;
+    public final void rule__LiteralReferenceElement__Group_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58149:1: ( rule__LiteralReferenceElement__Group_2_0__1__Impl rule__LiteralReferenceElement__Group_2_0__2 )
+            // InternalFormalML.g:58150:2: rule__LiteralReferenceElement__Group_2_0__1__Impl rule__LiteralReferenceElement__Group_2_0__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__LiteralReferenceElement__Group_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group_2_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_0__1"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_0__1__Impl"
+    // InternalFormalML.g:58157:1: rule__LiteralReferenceElement__Group_2_0__1__Impl : ( ( rule__LiteralReferenceElement__ArgAssignment_2_0_1 ) ) ;
+    public final void rule__LiteralReferenceElement__Group_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58161:1: ( ( ( rule__LiteralReferenceElement__ArgAssignment_2_0_1 ) ) )
+            // InternalFormalML.g:58162:1: ( ( rule__LiteralReferenceElement__ArgAssignment_2_0_1 ) )
+            {
+            // InternalFormalML.g:58162:1: ( ( rule__LiteralReferenceElement__ArgAssignment_2_0_1 ) )
+            // InternalFormalML.g:58163:2: ( rule__LiteralReferenceElement__ArgAssignment_2_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_0_1()); 
+            }
+            // InternalFormalML.g:58164:2: ( rule__LiteralReferenceElement__ArgAssignment_2_0_1 )
+            // InternalFormalML.g:58164:3: rule__LiteralReferenceElement__ArgAssignment_2_0_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__ArgAssignment_2_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_0__2"
+    // InternalFormalML.g:58172:1: rule__LiteralReferenceElement__Group_2_0__2 : rule__LiteralReferenceElement__Group_2_0__2__Impl ;
+    public final void rule__LiteralReferenceElement__Group_2_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58176:1: ( rule__LiteralReferenceElement__Group_2_0__2__Impl )
+            // InternalFormalML.g:58177:2: rule__LiteralReferenceElement__Group_2_0__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group_2_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_0__2"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_0__2__Impl"
+    // InternalFormalML.g:58183:1: rule__LiteralReferenceElement__Group_2_0__2__Impl : ( ']' ) ;
+    public final void rule__LiteralReferenceElement__Group_2_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58187:1: ( ( ']' ) )
+            // InternalFormalML.g:58188:1: ( ']' )
+            {
+            // InternalFormalML.g:58188:1: ( ']' )
+            // InternalFormalML.g:58189:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getRightSquareBracketKeyword_2_0_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getRightSquareBracketKeyword_2_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_0__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_1__0"
+    // InternalFormalML.g:58199:1: rule__LiteralReferenceElement__Group_2_1__0 : rule__LiteralReferenceElement__Group_2_1__0__Impl rule__LiteralReferenceElement__Group_2_1__1 ;
+    public final void rule__LiteralReferenceElement__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58203:1: ( rule__LiteralReferenceElement__Group_2_1__0__Impl rule__LiteralReferenceElement__Group_2_1__1 )
+            // InternalFormalML.g:58204:2: rule__LiteralReferenceElement__Group_2_1__0__Impl rule__LiteralReferenceElement__Group_2_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__LiteralReferenceElement__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_1__0"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_1__0__Impl"
+    // InternalFormalML.g:58211:1: rule__LiteralReferenceElement__Group_2_1__0__Impl : ( ( rule__LiteralReferenceElement__KindAssignment_2_1_0 ) ) ;
+    public final void rule__LiteralReferenceElement__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58215:1: ( ( ( rule__LiteralReferenceElement__KindAssignment_2_1_0 ) ) )
+            // InternalFormalML.g:58216:1: ( ( rule__LiteralReferenceElement__KindAssignment_2_1_0 ) )
+            {
+            // InternalFormalML.g:58216:1: ( ( rule__LiteralReferenceElement__KindAssignment_2_1_0 ) )
+            // InternalFormalML.g:58217:2: ( rule__LiteralReferenceElement__KindAssignment_2_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_1_0()); 
+            }
+            // InternalFormalML.g:58218:2: ( rule__LiteralReferenceElement__KindAssignment_2_1_0 )
+            // InternalFormalML.g:58218:3: rule__LiteralReferenceElement__KindAssignment_2_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__KindAssignment_2_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getKindAssignment_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_1__1"
+    // InternalFormalML.g:58226:1: rule__LiteralReferenceElement__Group_2_1__1 : rule__LiteralReferenceElement__Group_2_1__1__Impl rule__LiteralReferenceElement__Group_2_1__2 ;
+    public final void rule__LiteralReferenceElement__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58230:1: ( rule__LiteralReferenceElement__Group_2_1__1__Impl rule__LiteralReferenceElement__Group_2_1__2 )
+            // InternalFormalML.g:58231:2: rule__LiteralReferenceElement__Group_2_1__1__Impl rule__LiteralReferenceElement__Group_2_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_113);
+            rule__LiteralReferenceElement__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group_2_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_1__1"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_1__1__Impl"
+    // InternalFormalML.g:58238:1: rule__LiteralReferenceElement__Group_2_1__1__Impl : ( ( rule__LiteralReferenceElement__ArgAssignment_2_1_1 ) ) ;
+    public final void rule__LiteralReferenceElement__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58242:1: ( ( ( rule__LiteralReferenceElement__ArgAssignment_2_1_1 ) ) )
+            // InternalFormalML.g:58243:1: ( ( rule__LiteralReferenceElement__ArgAssignment_2_1_1 ) )
+            {
+            // InternalFormalML.g:58243:1: ( ( rule__LiteralReferenceElement__ArgAssignment_2_1_1 ) )
+            // InternalFormalML.g:58244:2: ( rule__LiteralReferenceElement__ArgAssignment_2_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_1_1()); 
+            }
+            // InternalFormalML.g:58245:2: ( rule__LiteralReferenceElement__ArgAssignment_2_1_1 )
+            // InternalFormalML.g:58245:3: rule__LiteralReferenceElement__ArgAssignment_2_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__ArgAssignment_2_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getArgAssignment_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_1__2"
+    // InternalFormalML.g:58253:1: rule__LiteralReferenceElement__Group_2_1__2 : rule__LiteralReferenceElement__Group_2_1__2__Impl ;
+    public final void rule__LiteralReferenceElement__Group_2_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58257:1: ( rule__LiteralReferenceElement__Group_2_1__2__Impl )
+            // InternalFormalML.g:58258:2: rule__LiteralReferenceElement__Group_2_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralReferenceElement__Group_2_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_1__2"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__Group_2_1__2__Impl"
+    // InternalFormalML.g:58264:1: rule__LiteralReferenceElement__Group_2_1__2__Impl : ( ')' ) ;
+    public final void rule__LiteralReferenceElement__Group_2_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58268:1: ( ( ')' ) )
+            // InternalFormalML.g:58269:1: ( ')' )
+            {
+            // InternalFormalML.g:58269:1: ( ')' )
+            // InternalFormalML.g:58270:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getRightParenthesisKeyword_2_1_2()); 
+            }
+            match(input,213,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getRightParenthesisKeyword_2_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__Group_2_1__2__Impl"
+
+
+    // $ANTLR start "rule__LiteralPureReferenceElement__Group__0"
+    // InternalFormalML.g:58280:1: rule__LiteralPureReferenceElement__Group__0 : rule__LiteralPureReferenceElement__Group__0__Impl rule__LiteralPureReferenceElement__Group__1 ;
+    public final void rule__LiteralPureReferenceElement__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58284:1: ( rule__LiteralPureReferenceElement__Group__0__Impl rule__LiteralPureReferenceElement__Group__1 )
+            // InternalFormalML.g:58285:2: rule__LiteralPureReferenceElement__Group__0__Impl rule__LiteralPureReferenceElement__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__LiteralPureReferenceElement__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralPureReferenceElement__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralPureReferenceElement__Group__0"
+
+
+    // $ANTLR start "rule__LiteralPureReferenceElement__Group__0__Impl"
+    // InternalFormalML.g:58292:1: rule__LiteralPureReferenceElement__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralPureReferenceElement__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58296:1: ( ( () ) )
+            // InternalFormalML.g:58297:1: ( () )
+            {
+            // InternalFormalML.g:58297:1: ( () )
+            // InternalFormalML.g:58298:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralPureReferenceElementAccess().getLiteralReferenceElementAction_0()); 
+            }
+            // InternalFormalML.g:58299:2: ()
+            // InternalFormalML.g:58299:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralPureReferenceElementAccess().getLiteralReferenceElementAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralPureReferenceElement__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralPureReferenceElement__Group__1"
+    // InternalFormalML.g:58307:1: rule__LiteralPureReferenceElement__Group__1 : rule__LiteralPureReferenceElement__Group__1__Impl ;
+    public final void rule__LiteralPureReferenceElement__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58311:1: ( rule__LiteralPureReferenceElement__Group__1__Impl )
+            // InternalFormalML.g:58312:2: rule__LiteralPureReferenceElement__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralPureReferenceElement__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralPureReferenceElement__Group__1"
+
+
+    // $ANTLR start "rule__LiteralPureReferenceElement__Group__1__Impl"
+    // InternalFormalML.g:58318:1: rule__LiteralPureReferenceElement__Group__1__Impl : ( ( rule__LiteralPureReferenceElement__ValueAssignment_1 ) ) ;
+    public final void rule__LiteralPureReferenceElement__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58322:1: ( ( ( rule__LiteralPureReferenceElement__ValueAssignment_1 ) ) )
+            // InternalFormalML.g:58323:1: ( ( rule__LiteralPureReferenceElement__ValueAssignment_1 ) )
+            {
+            // InternalFormalML.g:58323:1: ( ( rule__LiteralPureReferenceElement__ValueAssignment_1 ) )
+            // InternalFormalML.g:58324:2: ( rule__LiteralPureReferenceElement__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralPureReferenceElementAccess().getValueAssignment_1()); 
+            }
+            // InternalFormalML.g:58325:2: ( rule__LiteralPureReferenceElement__ValueAssignment_1 )
+            // InternalFormalML.g:58325:3: rule__LiteralPureReferenceElement__ValueAssignment_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralPureReferenceElement__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralPureReferenceElementAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralPureReferenceElement__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralTimeExpression__Group__0"
+    // InternalFormalML.g:58334:1: rule__LiteralTimeExpression__Group__0 : rule__LiteralTimeExpression__Group__0__Impl rule__LiteralTimeExpression__Group__1 ;
+    public final void rule__LiteralTimeExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58338:1: ( rule__LiteralTimeExpression__Group__0__Impl rule__LiteralTimeExpression__Group__1 )
+            // InternalFormalML.g:58339:2: rule__LiteralTimeExpression__Group__0__Impl rule__LiteralTimeExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_272);
+            rule__LiteralTimeExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralTimeExpression__Group__0__Impl"
+    // InternalFormalML.g:58346:1: rule__LiteralTimeExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralTimeExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58350:1: ( ( () ) )
+            // InternalFormalML.g:58351:1: ( () )
+            {
+            // InternalFormalML.g:58351:1: ( () )
+            // InternalFormalML.g:58352:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeExpressionAccess().getLiteralTimeExpressionAction_0()); 
+            }
+            // InternalFormalML.g:58353:2: ()
+            // InternalFormalML.g:58353:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeExpressionAccess().getLiteralTimeExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralTimeExpression__Group__1"
+    // InternalFormalML.g:58361:1: rule__LiteralTimeExpression__Group__1 : rule__LiteralTimeExpression__Group__1__Impl ;
+    public final void rule__LiteralTimeExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58365:1: ( rule__LiteralTimeExpression__Group__1__Impl )
+            // InternalFormalML.g:58366:2: rule__LiteralTimeExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralTimeExpression__Group__1__Impl"
+    // InternalFormalML.g:58372:1: rule__LiteralTimeExpression__Group__1__Impl : ( '$time' ) ;
+    public final void rule__LiteralTimeExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58376:1: ( ( '$time' ) )
+            // InternalFormalML.g:58377:1: ( '$time' )
+            {
+            // InternalFormalML.g:58377:1: ( '$time' )
+            // InternalFormalML.g:58378:2: '$time'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeExpressionAccess().getTimeKeyword_1()); 
+            }
+            match(input,265,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeExpressionAccess().getTimeKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralTimeDeltaExpression__Group__0"
+    // InternalFormalML.g:58388:1: rule__LiteralTimeDeltaExpression__Group__0 : rule__LiteralTimeDeltaExpression__Group__0__Impl rule__LiteralTimeDeltaExpression__Group__1 ;
+    public final void rule__LiteralTimeDeltaExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58392:1: ( rule__LiteralTimeDeltaExpression__Group__0__Impl rule__LiteralTimeDeltaExpression__Group__1 )
+            // InternalFormalML.g:58393:2: rule__LiteralTimeDeltaExpression__Group__0__Impl rule__LiteralTimeDeltaExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_273);
+            rule__LiteralTimeDeltaExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeDeltaExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeDeltaExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralTimeDeltaExpression__Group__0__Impl"
+    // InternalFormalML.g:58400:1: rule__LiteralTimeDeltaExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralTimeDeltaExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58404:1: ( ( () ) )
+            // InternalFormalML.g:58405:1: ( () )
+            {
+            // InternalFormalML.g:58405:1: ( () )
+            // InternalFormalML.g:58406:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaExpressionAccess().getLiteralTimeDeltaExpressionAction_0()); 
+            }
+            // InternalFormalML.g:58407:2: ()
+            // InternalFormalML.g:58407:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaExpressionAccess().getLiteralTimeDeltaExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeDeltaExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralTimeDeltaExpression__Group__1"
+    // InternalFormalML.g:58415:1: rule__LiteralTimeDeltaExpression__Group__1 : rule__LiteralTimeDeltaExpression__Group__1__Impl ;
+    public final void rule__LiteralTimeDeltaExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58419:1: ( rule__LiteralTimeDeltaExpression__Group__1__Impl )
+            // InternalFormalML.g:58420:2: rule__LiteralTimeDeltaExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralTimeDeltaExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeDeltaExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralTimeDeltaExpression__Group__1__Impl"
+    // InternalFormalML.g:58426:1: rule__LiteralTimeDeltaExpression__Group__1__Impl : ( '$delta' ) ;
+    public final void rule__LiteralTimeDeltaExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58430:1: ( ( '$delta' ) )
+            // InternalFormalML.g:58431:1: ( '$delta' )
+            {
+            // InternalFormalML.g:58431:1: ( '$delta' )
+            // InternalFormalML.g:58432:2: '$delta'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralTimeDeltaExpressionAccess().getDeltaKeyword_1()); 
+            }
+            match(input,266,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralTimeDeltaExpressionAccess().getDeltaKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralTimeDeltaExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralThisExpression__Group__0"
+    // InternalFormalML.g:58442:1: rule__LiteralThisExpression__Group__0 : rule__LiteralThisExpression__Group__0__Impl rule__LiteralThisExpression__Group__1 ;
+    public final void rule__LiteralThisExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58446:1: ( rule__LiteralThisExpression__Group__0__Impl rule__LiteralThisExpression__Group__1 )
+            // InternalFormalML.g:58447:2: rule__LiteralThisExpression__Group__0__Impl rule__LiteralThisExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_274);
+            rule__LiteralThisExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralThisExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralThisExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralThisExpression__Group__0__Impl"
+    // InternalFormalML.g:58454:1: rule__LiteralThisExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralThisExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58458:1: ( ( () ) )
+            // InternalFormalML.g:58459:1: ( () )
+            {
+            // InternalFormalML.g:58459:1: ( () )
+            // InternalFormalML.g:58460:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisExpressionAccess().getLiteralThisExpressionAction_0()); 
+            }
+            // InternalFormalML.g:58461:2: ()
+            // InternalFormalML.g:58461:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisExpressionAccess().getLiteralThisExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralThisExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralThisExpression__Group__1"
+    // InternalFormalML.g:58469:1: rule__LiteralThisExpression__Group__1 : rule__LiteralThisExpression__Group__1__Impl ;
+    public final void rule__LiteralThisExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58473:1: ( rule__LiteralThisExpression__Group__1__Impl )
+            // InternalFormalML.g:58474:2: rule__LiteralThisExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralThisExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralThisExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralThisExpression__Group__1__Impl"
+    // InternalFormalML.g:58480:1: rule__LiteralThisExpression__Group__1__Impl : ( '$this' ) ;
+    public final void rule__LiteralThisExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58484:1: ( ( '$this' ) )
+            // InternalFormalML.g:58485:1: ( '$this' )
+            {
+            // InternalFormalML.g:58485:1: ( '$this' )
+            // InternalFormalML.g:58486:2: '$this'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralThisExpressionAccess().getThisKeyword_1()); 
+            }
+            match(input,267,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralThisExpressionAccess().getThisKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralThisExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralSelfExpression__Group__0"
+    // InternalFormalML.g:58496:1: rule__LiteralSelfExpression__Group__0 : rule__LiteralSelfExpression__Group__0__Impl rule__LiteralSelfExpression__Group__1 ;
+    public final void rule__LiteralSelfExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58500:1: ( rule__LiteralSelfExpression__Group__0__Impl rule__LiteralSelfExpression__Group__1 )
+            // InternalFormalML.g:58501:2: rule__LiteralSelfExpression__Group__0__Impl rule__LiteralSelfExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_275);
+            rule__LiteralSelfExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSelfExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSelfExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralSelfExpression__Group__0__Impl"
+    // InternalFormalML.g:58508:1: rule__LiteralSelfExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralSelfExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58512:1: ( ( () ) )
+            // InternalFormalML.g:58513:1: ( () )
+            {
+            // InternalFormalML.g:58513:1: ( () )
+            // InternalFormalML.g:58514:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfExpressionAccess().getLiteralSelfExpressionAction_0()); 
+            }
+            // InternalFormalML.g:58515:2: ()
+            // InternalFormalML.g:58515:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfExpressionAccess().getLiteralSelfExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSelfExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralSelfExpression__Group__1"
+    // InternalFormalML.g:58523:1: rule__LiteralSelfExpression__Group__1 : rule__LiteralSelfExpression__Group__1__Impl ;
+    public final void rule__LiteralSelfExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58527:1: ( rule__LiteralSelfExpression__Group__1__Impl )
+            // InternalFormalML.g:58528:2: rule__LiteralSelfExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSelfExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSelfExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralSelfExpression__Group__1__Impl"
+    // InternalFormalML.g:58534:1: rule__LiteralSelfExpression__Group__1__Impl : ( '$self' ) ;
+    public final void rule__LiteralSelfExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58538:1: ( ( '$self' ) )
+            // InternalFormalML.g:58539:1: ( '$self' )
+            {
+            // InternalFormalML.g:58539:1: ( '$self' )
+            // InternalFormalML.g:58540:2: '$self'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSelfExpressionAccess().getSelfKeyword_1()); 
+            }
+            match(input,268,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSelfExpressionAccess().getSelfKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSelfExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralParentExpression__Group__0"
+    // InternalFormalML.g:58550:1: rule__LiteralParentExpression__Group__0 : rule__LiteralParentExpression__Group__0__Impl rule__LiteralParentExpression__Group__1 ;
+    public final void rule__LiteralParentExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58554:1: ( rule__LiteralParentExpression__Group__0__Impl rule__LiteralParentExpression__Group__1 )
+            // InternalFormalML.g:58555:2: rule__LiteralParentExpression__Group__0__Impl rule__LiteralParentExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_276);
+            rule__LiteralParentExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralParentExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralParentExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralParentExpression__Group__0__Impl"
+    // InternalFormalML.g:58562:1: rule__LiteralParentExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralParentExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58566:1: ( ( () ) )
+            // InternalFormalML.g:58567:1: ( () )
+            {
+            // InternalFormalML.g:58567:1: ( () )
+            // InternalFormalML.g:58568:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentExpressionAccess().getLiteralParentExpressionAction_0()); 
+            }
+            // InternalFormalML.g:58569:2: ()
+            // InternalFormalML.g:58569:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentExpressionAccess().getLiteralParentExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralParentExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralParentExpression__Group__1"
+    // InternalFormalML.g:58577:1: rule__LiteralParentExpression__Group__1 : rule__LiteralParentExpression__Group__1__Impl ;
+    public final void rule__LiteralParentExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58581:1: ( rule__LiteralParentExpression__Group__1__Impl )
+            // InternalFormalML.g:58582:2: rule__LiteralParentExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralParentExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralParentExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralParentExpression__Group__1__Impl"
+    // InternalFormalML.g:58588:1: rule__LiteralParentExpression__Group__1__Impl : ( '$parent' ) ;
+    public final void rule__LiteralParentExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58592:1: ( ( '$parent' ) )
+            // InternalFormalML.g:58593:1: ( '$parent' )
+            {
+            // InternalFormalML.g:58593:1: ( '$parent' )
+            // InternalFormalML.g:58594:2: '$parent'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralParentExpressionAccess().getParentKeyword_1()); 
+            }
+            match(input,269,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralParentExpressionAccess().getParentKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralParentExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralSuperExpression__Group__0"
+    // InternalFormalML.g:58604:1: rule__LiteralSuperExpression__Group__0 : rule__LiteralSuperExpression__Group__0__Impl rule__LiteralSuperExpression__Group__1 ;
+    public final void rule__LiteralSuperExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58608:1: ( rule__LiteralSuperExpression__Group__0__Impl rule__LiteralSuperExpression__Group__1 )
+            // InternalFormalML.g:58609:2: rule__LiteralSuperExpression__Group__0__Impl rule__LiteralSuperExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_277);
+            rule__LiteralSuperExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSuperExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSuperExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralSuperExpression__Group__0__Impl"
+    // InternalFormalML.g:58616:1: rule__LiteralSuperExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralSuperExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58620:1: ( ( () ) )
+            // InternalFormalML.g:58621:1: ( () )
+            {
+            // InternalFormalML.g:58621:1: ( () )
+            // InternalFormalML.g:58622:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperExpressionAccess().getLiteralSuperExpressionAction_0()); 
+            }
+            // InternalFormalML.g:58623:2: ()
+            // InternalFormalML.g:58623:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperExpressionAccess().getLiteralSuperExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSuperExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralSuperExpression__Group__1"
+    // InternalFormalML.g:58631:1: rule__LiteralSuperExpression__Group__1 : rule__LiteralSuperExpression__Group__1__Impl ;
+    public final void rule__LiteralSuperExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58635:1: ( rule__LiteralSuperExpression__Group__1__Impl )
+            // InternalFormalML.g:58636:2: rule__LiteralSuperExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSuperExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSuperExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralSuperExpression__Group__1__Impl"
+    // InternalFormalML.g:58642:1: rule__LiteralSuperExpression__Group__1__Impl : ( '$super' ) ;
+    public final void rule__LiteralSuperExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58646:1: ( ( '$super' ) )
+            // InternalFormalML.g:58647:1: ( '$super' )
+            {
+            // InternalFormalML.g:58647:1: ( '$super' )
+            // InternalFormalML.g:58648:2: '$super'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSuperExpressionAccess().getSuperKeyword_1()); 
+            }
+            match(input,270,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSuperExpressionAccess().getSuperKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSuperExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralSystemExpression__Group__0"
+    // InternalFormalML.g:58658:1: rule__LiteralSystemExpression__Group__0 : rule__LiteralSystemExpression__Group__0__Impl rule__LiteralSystemExpression__Group__1 ;
+    public final void rule__LiteralSystemExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58662:1: ( rule__LiteralSystemExpression__Group__0__Impl rule__LiteralSystemExpression__Group__1 )
+            // InternalFormalML.g:58663:2: rule__LiteralSystemExpression__Group__0__Impl rule__LiteralSystemExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_278);
+            rule__LiteralSystemExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSystemExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSystemExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralSystemExpression__Group__0__Impl"
+    // InternalFormalML.g:58670:1: rule__LiteralSystemExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralSystemExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58674:1: ( ( () ) )
+            // InternalFormalML.g:58675:1: ( () )
+            {
+            // InternalFormalML.g:58675:1: ( () )
+            // InternalFormalML.g:58676:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemExpressionAccess().getLiteralSystemExpressionAction_0()); 
+            }
+            // InternalFormalML.g:58677:2: ()
+            // InternalFormalML.g:58677:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemExpressionAccess().getLiteralSystemExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSystemExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralSystemExpression__Group__1"
+    // InternalFormalML.g:58685:1: rule__LiteralSystemExpression__Group__1 : rule__LiteralSystemExpression__Group__1__Impl ;
+    public final void rule__LiteralSystemExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58689:1: ( rule__LiteralSystemExpression__Group__1__Impl )
+            // InternalFormalML.g:58690:2: rule__LiteralSystemExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralSystemExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSystemExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralSystemExpression__Group__1__Impl"
+    // InternalFormalML.g:58696:1: rule__LiteralSystemExpression__Group__1__Impl : ( '$system' ) ;
+    public final void rule__LiteralSystemExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58700:1: ( ( '$system' ) )
+            // InternalFormalML.g:58701:1: ( '$system' )
+            {
+            // InternalFormalML.g:58701:1: ( '$system' )
+            // InternalFormalML.g:58702:2: '$system'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralSystemExpressionAccess().getSystemKeyword_1()); 
+            }
+            match(input,271,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralSystemExpressionAccess().getSystemKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralSystemExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LiteralEnvExpression__Group__0"
+    // InternalFormalML.g:58712:1: rule__LiteralEnvExpression__Group__0 : rule__LiteralEnvExpression__Group__0__Impl rule__LiteralEnvExpression__Group__1 ;
+    public final void rule__LiteralEnvExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58716:1: ( rule__LiteralEnvExpression__Group__0__Impl rule__LiteralEnvExpression__Group__1 )
+            // InternalFormalML.g:58717:2: rule__LiteralEnvExpression__Group__0__Impl rule__LiteralEnvExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_279);
+            rule__LiteralEnvExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralEnvExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvExpression__Group__0"
+
+
+    // $ANTLR start "rule__LiteralEnvExpression__Group__0__Impl"
+    // InternalFormalML.g:58724:1: rule__LiteralEnvExpression__Group__0__Impl : ( () ) ;
+    public final void rule__LiteralEnvExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58728:1: ( ( () ) )
+            // InternalFormalML.g:58729:1: ( () )
+            {
+            // InternalFormalML.g:58729:1: ( () )
+            // InternalFormalML.g:58730:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralEnvExpressionAccess().getLiteralEnvExpressionAction_0()); 
+            }
+            // InternalFormalML.g:58731:2: ()
+            // InternalFormalML.g:58731:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralEnvExpressionAccess().getLiteralEnvExpressionAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LiteralEnvExpression__Group__1"
+    // InternalFormalML.g:58739:1: rule__LiteralEnvExpression__Group__1 : rule__LiteralEnvExpression__Group__1__Impl ;
+    public final void rule__LiteralEnvExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58743:1: ( rule__LiteralEnvExpression__Group__1__Impl )
+            // InternalFormalML.g:58744:2: rule__LiteralEnvExpression__Group__1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralEnvExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvExpression__Group__1"
+
+
+    // $ANTLR start "rule__LiteralEnvExpression__Group__1__Impl"
+    // InternalFormalML.g:58750:1: rule__LiteralEnvExpression__Group__1__Impl : ( ( rule__LiteralEnvExpression__Alternatives_1 ) ) ;
+    public final void rule__LiteralEnvExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58754:1: ( ( ( rule__LiteralEnvExpression__Alternatives_1 ) ) )
+            // InternalFormalML.g:58755:1: ( ( rule__LiteralEnvExpression__Alternatives_1 ) )
+            {
+            // InternalFormalML.g:58755:1: ( ( rule__LiteralEnvExpression__Alternatives_1 ) )
+            // InternalFormalML.g:58756:2: ( rule__LiteralEnvExpression__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralEnvExpressionAccess().getAlternatives_1()); 
+            }
+            // InternalFormalML.g:58757:2: ( rule__LiteralEnvExpression__Alternatives_1 )
+            // InternalFormalML.g:58757:3: rule__LiteralEnvExpression__Alternatives_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LiteralEnvExpression__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralEnvExpressionAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralEnvExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group__0"
+    // InternalFormalML.g:58766:1: rule__ValueSelectionExpression__Group__0 : rule__ValueSelectionExpression__Group__0__Impl rule__ValueSelectionExpression__Group__1 ;
+    public final void rule__ValueSelectionExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58770:1: ( rule__ValueSelectionExpression__Group__0__Impl rule__ValueSelectionExpression__Group__1 )
+            // InternalFormalML.g:58771:2: rule__ValueSelectionExpression__Group__0__Impl rule__ValueSelectionExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__ValueSelectionExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group__0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group__0__Impl"
+    // InternalFormalML.g:58778:1: rule__ValueSelectionExpression__Group__0__Impl : ( ruleLiteralReferenceExpression ) ;
+    public final void rule__ValueSelectionExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58782:1: ( ( ruleLiteralReferenceExpression ) )
+            // InternalFormalML.g:58783:1: ( ruleLiteralReferenceExpression )
+            {
+            // InternalFormalML.g:58783:1: ( ruleLiteralReferenceExpression )
+            // InternalFormalML.g:58784:2: ruleLiteralReferenceExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getLiteralReferenceExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLiteralReferenceExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getLiteralReferenceExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group__1"
+    // InternalFormalML.g:58793:1: rule__ValueSelectionExpression__Group__1 : rule__ValueSelectionExpression__Group__1__Impl rule__ValueSelectionExpression__Group__2 ;
+    public final void rule__ValueSelectionExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58797:1: ( rule__ValueSelectionExpression__Group__1__Impl rule__ValueSelectionExpression__Group__2 )
+            // InternalFormalML.g:58798:2: rule__ValueSelectionExpression__Group__1__Impl rule__ValueSelectionExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__ValueSelectionExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group__1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group__1__Impl"
+    // InternalFormalML.g:58805:1: rule__ValueSelectionExpression__Group__1__Impl : ( ( rule__ValueSelectionExpression__Group_1__0 )* ) ;
+    public final void rule__ValueSelectionExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58809:1: ( ( ( rule__ValueSelectionExpression__Group_1__0 )* ) )
+            // InternalFormalML.g:58810:1: ( ( rule__ValueSelectionExpression__Group_1__0 )* )
+            {
+            // InternalFormalML.g:58810:1: ( ( rule__ValueSelectionExpression__Group_1__0 )* )
+            // InternalFormalML.g:58811:2: ( rule__ValueSelectionExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:58812:2: ( rule__ValueSelectionExpression__Group_1__0 )*
+            loop693:
+            do {
+                int alt693=2;
+                int LA693_0 = input.LA(1);
+
+                if ( (LA693_0==20) ) {
+                    int LA693_2 = input.LA(2);
+
+                    if ( (LA693_2==RULE_XLIA_ID) ) {
+                        alt693=1;
+                    }
+
+
+                }
+
+
+                switch (alt693) {
+            	case 1 :
+            	    // InternalFormalML.g:58812:3: rule__ValueSelectionExpression__Group_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_259);
+            	    rule__ValueSelectionExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop693;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group__2"
+    // InternalFormalML.g:58820:1: rule__ValueSelectionExpression__Group__2 : rule__ValueSelectionExpression__Group__2__Impl ;
+    public final void rule__ValueSelectionExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58824:1: ( rule__ValueSelectionExpression__Group__2__Impl )
+            // InternalFormalML.g:58825:2: rule__ValueSelectionExpression__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group__2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group__2__Impl"
+    // InternalFormalML.g:58831:1: rule__ValueSelectionExpression__Group__2__Impl : ( ( rule__ValueSelectionExpression__Group_2__0 )? ) ;
+    public final void rule__ValueSelectionExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58835:1: ( ( ( rule__ValueSelectionExpression__Group_2__0 )? ) )
+            // InternalFormalML.g:58836:1: ( ( rule__ValueSelectionExpression__Group_2__0 )? )
+            {
+            // InternalFormalML.g:58836:1: ( ( rule__ValueSelectionExpression__Group_2__0 )? )
+            // InternalFormalML.g:58837:2: ( rule__ValueSelectionExpression__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:58838:2: ( rule__ValueSelectionExpression__Group_2__0 )?
+            int alt694=2;
+            int LA694_0 = input.LA(1);
+
+            if ( (LA694_0==21) ) {
+                alt694=1;
+            }
+            switch (alt694) {
+                case 1 :
+                    // InternalFormalML.g:58838:3: rule__ValueSelectionExpression__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ValueSelectionExpression__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1__0"
+    // InternalFormalML.g:58847:1: rule__ValueSelectionExpression__Group_1__0 : rule__ValueSelectionExpression__Group_1__0__Impl rule__ValueSelectionExpression__Group_1__1 ;
+    public final void rule__ValueSelectionExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58851:1: ( rule__ValueSelectionExpression__Group_1__0__Impl rule__ValueSelectionExpression__Group_1__1 )
+            // InternalFormalML.g:58852:2: rule__ValueSelectionExpression__Group_1__0__Impl rule__ValueSelectionExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_260);
+            rule__ValueSelectionExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1__0__Impl"
+    // InternalFormalML.g:58859:1: rule__ValueSelectionExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__ValueSelectionExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58863:1: ( ( () ) )
+            // InternalFormalML.g:58864:1: ( () )
+            {
+            // InternalFormalML.g:58864:1: ( () )
+            // InternalFormalML.g:58865:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_1_0()); 
+            }
+            // InternalFormalML.g:58866:2: ()
+            // InternalFormalML.g:58866:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1__1"
+    // InternalFormalML.g:58874:1: rule__ValueSelectionExpression__Group_1__1 : rule__ValueSelectionExpression__Group_1__1__Impl rule__ValueSelectionExpression__Group_1__2 ;
+    public final void rule__ValueSelectionExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58878:1: ( rule__ValueSelectionExpression__Group_1__1__Impl rule__ValueSelectionExpression__Group_1__2 )
+            // InternalFormalML.g:58879:2: rule__ValueSelectionExpression__Group_1__1__Impl rule__ValueSelectionExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ValueSelectionExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1__1__Impl"
+    // InternalFormalML.g:58886:1: rule__ValueSelectionExpression__Group_1__1__Impl : ( '.' ) ;
+    public final void rule__ValueSelectionExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58890:1: ( ( '.' ) )
+            // InternalFormalML.g:58891:1: ( '.' )
+            {
+            // InternalFormalML.g:58891:1: ( '.' )
+            // InternalFormalML.g:58892:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_1_1()); 
+            }
+            match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1__2"
+    // InternalFormalML.g:58901:1: rule__ValueSelectionExpression__Group_1__2 : rule__ValueSelectionExpression__Group_1__2__Impl rule__ValueSelectionExpression__Group_1__3 ;
+    public final void rule__ValueSelectionExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58905:1: ( rule__ValueSelectionExpression__Group_1__2__Impl rule__ValueSelectionExpression__Group_1__3 )
+            // InternalFormalML.g:58906:2: rule__ValueSelectionExpression__Group_1__2__Impl rule__ValueSelectionExpression__Group_1__3
+            {
+            pushFollow(FollowSets000.FOLLOW_133);
+            rule__ValueSelectionExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1__2__Impl"
+    // InternalFormalML.g:58913:1: rule__ValueSelectionExpression__Group_1__2__Impl : ( ( rule__ValueSelectionExpression__ElementAssignment_1_2 ) ) ;
+    public final void rule__ValueSelectionExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58917:1: ( ( ( rule__ValueSelectionExpression__ElementAssignment_1_2 ) ) )
+            // InternalFormalML.g:58918:1: ( ( rule__ValueSelectionExpression__ElementAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:58918:1: ( ( rule__ValueSelectionExpression__ElementAssignment_1_2 ) )
+            // InternalFormalML.g:58919:2: ( rule__ValueSelectionExpression__ElementAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_1_2()); 
+            }
+            // InternalFormalML.g:58920:2: ( rule__ValueSelectionExpression__ElementAssignment_1_2 )
+            // InternalFormalML.g:58920:3: rule__ValueSelectionExpression__ElementAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__ElementAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1__3"
+    // InternalFormalML.g:58928:1: rule__ValueSelectionExpression__Group_1__3 : rule__ValueSelectionExpression__Group_1__3__Impl ;
+    public final void rule__ValueSelectionExpression__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58932:1: ( rule__ValueSelectionExpression__Group_1__3__Impl )
+            // InternalFormalML.g:58933:2: rule__ValueSelectionExpression__Group_1__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1__3"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1__3__Impl"
+    // InternalFormalML.g:58939:1: rule__ValueSelectionExpression__Group_1__3__Impl : ( ( rule__ValueSelectionExpression__Group_1_3__0 )? ) ;
+    public final void rule__ValueSelectionExpression__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58943:1: ( ( ( rule__ValueSelectionExpression__Group_1_3__0 )? ) )
+            // InternalFormalML.g:58944:1: ( ( rule__ValueSelectionExpression__Group_1_3__0 )? )
+            {
+            // InternalFormalML.g:58944:1: ( ( rule__ValueSelectionExpression__Group_1_3__0 )? )
+            // InternalFormalML.g:58945:2: ( rule__ValueSelectionExpression__Group_1_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getGroup_1_3()); 
+            }
+            // InternalFormalML.g:58946:2: ( rule__ValueSelectionExpression__Group_1_3__0 )?
+            int alt695=2;
+            int LA695_0 = input.LA(1);
+
+            if ( (LA695_0==22) ) {
+                int LA695_1 = input.LA(2);
+
+                if ( ((LA695_1>=RULE_CHARACTER && LA695_1<=RULE_INT)||LA695_1==20||LA695_1==23||(LA695_1>=29 && LA695_1<=30)||LA695_1==125||(LA695_1>=129 && LA695_1<=134)||(LA695_1>=137 && LA695_1<=142)||LA695_1==199||(LA695_1>=261 && LA695_1<=271)||LA695_1==287) ) {
+                    alt695=1;
+                }
+            }
+            switch (alt695) {
+                case 1 :
+                    // InternalFormalML.g:58946:3: rule__ValueSelectionExpression__Group_1_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ValueSelectionExpression__Group_1_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getGroup_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1_3__0"
+    // InternalFormalML.g:58955:1: rule__ValueSelectionExpression__Group_1_3__0 : rule__ValueSelectionExpression__Group_1_3__0__Impl rule__ValueSelectionExpression__Group_1_3__1 ;
+    public final void rule__ValueSelectionExpression__Group_1_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58959:1: ( rule__ValueSelectionExpression__Group_1_3__0__Impl rule__ValueSelectionExpression__Group_1_3__1 )
+            // InternalFormalML.g:58960:2: rule__ValueSelectionExpression__Group_1_3__0__Impl rule__ValueSelectionExpression__Group_1_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ValueSelectionExpression__Group_1_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_1_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1_3__0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1_3__0__Impl"
+    // InternalFormalML.g:58967:1: rule__ValueSelectionExpression__Group_1_3__0__Impl : ( ( rule__ValueSelectionExpression__KindAssignment_1_3_0 ) ) ;
+    public final void rule__ValueSelectionExpression__Group_1_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58971:1: ( ( ( rule__ValueSelectionExpression__KindAssignment_1_3_0 ) ) )
+            // InternalFormalML.g:58972:1: ( ( rule__ValueSelectionExpression__KindAssignment_1_3_0 ) )
+            {
+            // InternalFormalML.g:58972:1: ( ( rule__ValueSelectionExpression__KindAssignment_1_3_0 ) )
+            // InternalFormalML.g:58973:2: ( rule__ValueSelectionExpression__KindAssignment_1_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_1_3_0()); 
+            }
+            // InternalFormalML.g:58974:2: ( rule__ValueSelectionExpression__KindAssignment_1_3_0 )
+            // InternalFormalML.g:58974:3: rule__ValueSelectionExpression__KindAssignment_1_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__KindAssignment_1_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1_3__0__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1_3__1"
+    // InternalFormalML.g:58982:1: rule__ValueSelectionExpression__Group_1_3__1 : rule__ValueSelectionExpression__Group_1_3__1__Impl rule__ValueSelectionExpression__Group_1_3__2 ;
+    public final void rule__ValueSelectionExpression__Group_1_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58986:1: ( rule__ValueSelectionExpression__Group_1_3__1__Impl rule__ValueSelectionExpression__Group_1_3__2 )
+            // InternalFormalML.g:58987:2: rule__ValueSelectionExpression__Group_1_3__1__Impl rule__ValueSelectionExpression__Group_1_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__ValueSelectionExpression__Group_1_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_1_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1_3__1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1_3__1__Impl"
+    // InternalFormalML.g:58994:1: rule__ValueSelectionExpression__Group_1_3__1__Impl : ( ( rule__ValueSelectionExpression__ArgAssignment_1_3_1 ) ) ;
+    public final void rule__ValueSelectionExpression__Group_1_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:58998:1: ( ( ( rule__ValueSelectionExpression__ArgAssignment_1_3_1 ) ) )
+            // InternalFormalML.g:58999:1: ( ( rule__ValueSelectionExpression__ArgAssignment_1_3_1 ) )
+            {
+            // InternalFormalML.g:58999:1: ( ( rule__ValueSelectionExpression__ArgAssignment_1_3_1 ) )
+            // InternalFormalML.g:59000:2: ( rule__ValueSelectionExpression__ArgAssignment_1_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_1_3_1()); 
+            }
+            // InternalFormalML.g:59001:2: ( rule__ValueSelectionExpression__ArgAssignment_1_3_1 )
+            // InternalFormalML.g:59001:3: rule__ValueSelectionExpression__ArgAssignment_1_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__ArgAssignment_1_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_1_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1_3__1__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1_3__2"
+    // InternalFormalML.g:59009:1: rule__ValueSelectionExpression__Group_1_3__2 : rule__ValueSelectionExpression__Group_1_3__2__Impl ;
+    public final void rule__ValueSelectionExpression__Group_1_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59013:1: ( rule__ValueSelectionExpression__Group_1_3__2__Impl )
+            // InternalFormalML.g:59014:2: rule__ValueSelectionExpression__Group_1_3__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_1_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1_3__2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_1_3__2__Impl"
+    // InternalFormalML.g:59020:1: rule__ValueSelectionExpression__Group_1_3__2__Impl : ( ']' ) ;
+    public final void rule__ValueSelectionExpression__Group_1_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59024:1: ( ( ']' ) )
+            // InternalFormalML.g:59025:1: ( ']' )
+            {
+            // InternalFormalML.g:59025:1: ( ']' )
+            // InternalFormalML.g:59026:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_1_3_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_1_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_1_3__2__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__0"
+    // InternalFormalML.g:59036:1: rule__ValueSelectionExpression__Group_2__0 : rule__ValueSelectionExpression__Group_2__0__Impl rule__ValueSelectionExpression__Group_2__1 ;
+    public final void rule__ValueSelectionExpression__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59040:1: ( rule__ValueSelectionExpression__Group_2__0__Impl rule__ValueSelectionExpression__Group_2__1 )
+            // InternalFormalML.g:59041:2: rule__ValueSelectionExpression__Group_2__0__Impl rule__ValueSelectionExpression__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_262);
+            rule__ValueSelectionExpression__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__0__Impl"
+    // InternalFormalML.g:59048:1: rule__ValueSelectionExpression__Group_2__0__Impl : ( () ) ;
+    public final void rule__ValueSelectionExpression__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59052:1: ( ( () ) )
+            // InternalFormalML.g:59053:1: ( () )
+            {
+            // InternalFormalML.g:59053:1: ( () )
+            // InternalFormalML.g:59054:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_0()); 
+            }
+            // InternalFormalML.g:59055:2: ()
+            // InternalFormalML.g:59055:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__1"
+    // InternalFormalML.g:59063:1: rule__ValueSelectionExpression__Group_2__1 : rule__ValueSelectionExpression__Group_2__1__Impl rule__ValueSelectionExpression__Group_2__2 ;
+    public final void rule__ValueSelectionExpression__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59067:1: ( rule__ValueSelectionExpression__Group_2__1__Impl rule__ValueSelectionExpression__Group_2__2 )
+            // InternalFormalML.g:59068:2: rule__ValueSelectionExpression__Group_2__1__Impl rule__ValueSelectionExpression__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ValueSelectionExpression__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__1__Impl"
+    // InternalFormalML.g:59075:1: rule__ValueSelectionExpression__Group_2__1__Impl : ( '->' ) ;
+    public final void rule__ValueSelectionExpression__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59079:1: ( ( '->' ) )
+            // InternalFormalML.g:59080:1: ( '->' )
+            {
+            // InternalFormalML.g:59080:1: ( '->' )
+            // InternalFormalML.g:59081:2: '->'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1()); 
+            }
+            match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__2"
+    // InternalFormalML.g:59090:1: rule__ValueSelectionExpression__Group_2__2 : rule__ValueSelectionExpression__Group_2__2__Impl rule__ValueSelectionExpression__Group_2__3 ;
+    public final void rule__ValueSelectionExpression__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59094:1: ( rule__ValueSelectionExpression__Group_2__2__Impl rule__ValueSelectionExpression__Group_2__3 )
+            // InternalFormalML.g:59095:2: rule__ValueSelectionExpression__Group_2__2__Impl rule__ValueSelectionExpression__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_280);
+            rule__ValueSelectionExpression__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__2__Impl"
+    // InternalFormalML.g:59102:1: rule__ValueSelectionExpression__Group_2__2__Impl : ( ( rule__ValueSelectionExpression__ElementAssignment_2_2 ) ) ;
+    public final void rule__ValueSelectionExpression__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59106:1: ( ( ( rule__ValueSelectionExpression__ElementAssignment_2_2 ) ) )
+            // InternalFormalML.g:59107:1: ( ( rule__ValueSelectionExpression__ElementAssignment_2_2 ) )
+            {
+            // InternalFormalML.g:59107:1: ( ( rule__ValueSelectionExpression__ElementAssignment_2_2 ) )
+            // InternalFormalML.g:59108:2: ( rule__ValueSelectionExpression__ElementAssignment_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_2()); 
+            }
+            // InternalFormalML.g:59109:2: ( rule__ValueSelectionExpression__ElementAssignment_2_2 )
+            // InternalFormalML.g:59109:3: rule__ValueSelectionExpression__ElementAssignment_2_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__ElementAssignment_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__3"
+    // InternalFormalML.g:59117:1: rule__ValueSelectionExpression__Group_2__3 : rule__ValueSelectionExpression__Group_2__3__Impl rule__ValueSelectionExpression__Group_2__4 ;
+    public final void rule__ValueSelectionExpression__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59121:1: ( rule__ValueSelectionExpression__Group_2__3__Impl rule__ValueSelectionExpression__Group_2__4 )
+            // InternalFormalML.g:59122:2: rule__ValueSelectionExpression__Group_2__3__Impl rule__ValueSelectionExpression__Group_2__4
+            {
+            pushFollow(FollowSets000.FOLLOW_280);
+            rule__ValueSelectionExpression__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__3"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__3__Impl"
+    // InternalFormalML.g:59129:1: rule__ValueSelectionExpression__Group_2__3__Impl : ( ( rule__ValueSelectionExpression__Group_2_3__0 )? ) ;
+    public final void rule__ValueSelectionExpression__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59133:1: ( ( ( rule__ValueSelectionExpression__Group_2_3__0 )? ) )
+            // InternalFormalML.g:59134:1: ( ( rule__ValueSelectionExpression__Group_2_3__0 )? )
+            {
+            // InternalFormalML.g:59134:1: ( ( rule__ValueSelectionExpression__Group_2_3__0 )? )
+            // InternalFormalML.g:59135:2: ( rule__ValueSelectionExpression__Group_2_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_3()); 
+            }
+            // InternalFormalML.g:59136:2: ( rule__ValueSelectionExpression__Group_2_3__0 )?
+            int alt696=2;
+            int LA696_0 = input.LA(1);
+
+            if ( (LA696_0==22) ) {
+                int LA696_1 = input.LA(2);
+
+                if ( ((LA696_1>=RULE_CHARACTER && LA696_1<=RULE_INT)||LA696_1==20||LA696_1==23||(LA696_1>=29 && LA696_1<=30)||LA696_1==125||(LA696_1>=129 && LA696_1<=134)||(LA696_1>=137 && LA696_1<=142)||LA696_1==199||(LA696_1>=261 && LA696_1<=271)||LA696_1==287) ) {
+                    alt696=1;
+                }
+            }
+            switch (alt696) {
+                case 1 :
+                    // InternalFormalML.g:59136:3: rule__ValueSelectionExpression__Group_2_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ValueSelectionExpression__Group_2_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__4"
+    // InternalFormalML.g:59144:1: rule__ValueSelectionExpression__Group_2__4 : rule__ValueSelectionExpression__Group_2__4__Impl ;
+    public final void rule__ValueSelectionExpression__Group_2__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59148:1: ( rule__ValueSelectionExpression__Group_2__4__Impl )
+            // InternalFormalML.g:59149:2: rule__ValueSelectionExpression__Group_2__4__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__4"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2__4__Impl"
+    // InternalFormalML.g:59155:1: rule__ValueSelectionExpression__Group_2__4__Impl : ( ( rule__ValueSelectionExpression__Group_2_4__0 )* ) ;
+    public final void rule__ValueSelectionExpression__Group_2__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59159:1: ( ( ( rule__ValueSelectionExpression__Group_2_4__0 )* ) )
+            // InternalFormalML.g:59160:1: ( ( rule__ValueSelectionExpression__Group_2_4__0 )* )
+            {
+            // InternalFormalML.g:59160:1: ( ( rule__ValueSelectionExpression__Group_2_4__0 )* )
+            // InternalFormalML.g:59161:2: ( rule__ValueSelectionExpression__Group_2_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4()); 
+            }
+            // InternalFormalML.g:59162:2: ( rule__ValueSelectionExpression__Group_2_4__0 )*
+            loop697:
+            do {
+                int alt697=2;
+                int LA697_0 = input.LA(1);
+
+                if ( (LA697_0==20) ) {
+                    int LA697_2 = input.LA(2);
+
+                    if ( (LA697_2==RULE_XLIA_ID) ) {
+                        alt697=1;
+                    }
+
+
+                }
+
+
+                switch (alt697) {
+            	case 1 :
+            	    // InternalFormalML.g:59162:3: rule__ValueSelectionExpression__Group_2_4__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_259);
+            	    rule__ValueSelectionExpression__Group_2_4__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop697;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2__4__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_3__0"
+    // InternalFormalML.g:59171:1: rule__ValueSelectionExpression__Group_2_3__0 : rule__ValueSelectionExpression__Group_2_3__0__Impl rule__ValueSelectionExpression__Group_2_3__1 ;
+    public final void rule__ValueSelectionExpression__Group_2_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59175:1: ( rule__ValueSelectionExpression__Group_2_3__0__Impl rule__ValueSelectionExpression__Group_2_3__1 )
+            // InternalFormalML.g:59176:2: rule__ValueSelectionExpression__Group_2_3__0__Impl rule__ValueSelectionExpression__Group_2_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ValueSelectionExpression__Group_2_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_3__0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_3__0__Impl"
+    // InternalFormalML.g:59183:1: rule__ValueSelectionExpression__Group_2_3__0__Impl : ( ( rule__ValueSelectionExpression__KindAssignment_2_3_0 ) ) ;
+    public final void rule__ValueSelectionExpression__Group_2_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59187:1: ( ( ( rule__ValueSelectionExpression__KindAssignment_2_3_0 ) ) )
+            // InternalFormalML.g:59188:1: ( ( rule__ValueSelectionExpression__KindAssignment_2_3_0 ) )
+            {
+            // InternalFormalML.g:59188:1: ( ( rule__ValueSelectionExpression__KindAssignment_2_3_0 ) )
+            // InternalFormalML.g:59189:2: ( rule__ValueSelectionExpression__KindAssignment_2_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_3_0()); 
+            }
+            // InternalFormalML.g:59190:2: ( rule__ValueSelectionExpression__KindAssignment_2_3_0 )
+            // InternalFormalML.g:59190:3: rule__ValueSelectionExpression__KindAssignment_2_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__KindAssignment_2_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_3__0__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_3__1"
+    // InternalFormalML.g:59198:1: rule__ValueSelectionExpression__Group_2_3__1 : rule__ValueSelectionExpression__Group_2_3__1__Impl rule__ValueSelectionExpression__Group_2_3__2 ;
+    public final void rule__ValueSelectionExpression__Group_2_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59202:1: ( rule__ValueSelectionExpression__Group_2_3__1__Impl rule__ValueSelectionExpression__Group_2_3__2 )
+            // InternalFormalML.g:59203:2: rule__ValueSelectionExpression__Group_2_3__1__Impl rule__ValueSelectionExpression__Group_2_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__ValueSelectionExpression__Group_2_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_3__1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_3__1__Impl"
+    // InternalFormalML.g:59210:1: rule__ValueSelectionExpression__Group_2_3__1__Impl : ( ( rule__ValueSelectionExpression__ArgAssignment_2_3_1 ) ) ;
+    public final void rule__ValueSelectionExpression__Group_2_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59214:1: ( ( ( rule__ValueSelectionExpression__ArgAssignment_2_3_1 ) ) )
+            // InternalFormalML.g:59215:1: ( ( rule__ValueSelectionExpression__ArgAssignment_2_3_1 ) )
+            {
+            // InternalFormalML.g:59215:1: ( ( rule__ValueSelectionExpression__ArgAssignment_2_3_1 ) )
+            // InternalFormalML.g:59216:2: ( rule__ValueSelectionExpression__ArgAssignment_2_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_3_1()); 
+            }
+            // InternalFormalML.g:59217:2: ( rule__ValueSelectionExpression__ArgAssignment_2_3_1 )
+            // InternalFormalML.g:59217:3: rule__ValueSelectionExpression__ArgAssignment_2_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__ArgAssignment_2_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_3__1__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_3__2"
+    // InternalFormalML.g:59225:1: rule__ValueSelectionExpression__Group_2_3__2 : rule__ValueSelectionExpression__Group_2_3__2__Impl ;
+    public final void rule__ValueSelectionExpression__Group_2_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59229:1: ( rule__ValueSelectionExpression__Group_2_3__2__Impl )
+            // InternalFormalML.g:59230:2: rule__ValueSelectionExpression__Group_2_3__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_3__2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_3__2__Impl"
+    // InternalFormalML.g:59236:1: rule__ValueSelectionExpression__Group_2_3__2__Impl : ( ']' ) ;
+    public final void rule__ValueSelectionExpression__Group_2_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59240:1: ( ( ']' ) )
+            // InternalFormalML.g:59241:1: ( ']' )
+            {
+            // InternalFormalML.g:59241:1: ( ']' )
+            // InternalFormalML.g:59242:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_3_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_3__2__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4__0"
+    // InternalFormalML.g:59252:1: rule__ValueSelectionExpression__Group_2_4__0 : rule__ValueSelectionExpression__Group_2_4__0__Impl rule__ValueSelectionExpression__Group_2_4__1 ;
+    public final void rule__ValueSelectionExpression__Group_2_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59256:1: ( rule__ValueSelectionExpression__Group_2_4__0__Impl rule__ValueSelectionExpression__Group_2_4__1 )
+            // InternalFormalML.g:59257:2: rule__ValueSelectionExpression__Group_2_4__0__Impl rule__ValueSelectionExpression__Group_2_4__1
+            {
+            pushFollow(FollowSets000.FOLLOW_260);
+            rule__ValueSelectionExpression__Group_2_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4__0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4__0__Impl"
+    // InternalFormalML.g:59264:1: rule__ValueSelectionExpression__Group_2_4__0__Impl : ( () ) ;
+    public final void rule__ValueSelectionExpression__Group_2_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59268:1: ( ( () ) )
+            // InternalFormalML.g:59269:1: ( () )
+            {
+            // InternalFormalML.g:59269:1: ( () )
+            // InternalFormalML.g:59270:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()); 
+            }
+            // InternalFormalML.g:59271:2: ()
+            // InternalFormalML.g:59271:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4__0__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4__1"
+    // InternalFormalML.g:59279:1: rule__ValueSelectionExpression__Group_2_4__1 : rule__ValueSelectionExpression__Group_2_4__1__Impl rule__ValueSelectionExpression__Group_2_4__2 ;
+    public final void rule__ValueSelectionExpression__Group_2_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59283:1: ( rule__ValueSelectionExpression__Group_2_4__1__Impl rule__ValueSelectionExpression__Group_2_4__2 )
+            // InternalFormalML.g:59284:2: rule__ValueSelectionExpression__Group_2_4__1__Impl rule__ValueSelectionExpression__Group_2_4__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ValueSelectionExpression__Group_2_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4__1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4__1__Impl"
+    // InternalFormalML.g:59291:1: rule__ValueSelectionExpression__Group_2_4__1__Impl : ( '.' ) ;
+    public final void rule__ValueSelectionExpression__Group_2_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59295:1: ( ( '.' ) )
+            // InternalFormalML.g:59296:1: ( '.' )
+            {
+            // InternalFormalML.g:59296:1: ( '.' )
+            // InternalFormalML.g:59297:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_2_4_1()); 
+            }
+            match(input,20,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_2_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4__1__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4__2"
+    // InternalFormalML.g:59306:1: rule__ValueSelectionExpression__Group_2_4__2 : rule__ValueSelectionExpression__Group_2_4__2__Impl rule__ValueSelectionExpression__Group_2_4__3 ;
+    public final void rule__ValueSelectionExpression__Group_2_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59310:1: ( rule__ValueSelectionExpression__Group_2_4__2__Impl rule__ValueSelectionExpression__Group_2_4__3 )
+            // InternalFormalML.g:59311:2: rule__ValueSelectionExpression__Group_2_4__2__Impl rule__ValueSelectionExpression__Group_2_4__3
+            {
+            pushFollow(FollowSets000.FOLLOW_133);
+            rule__ValueSelectionExpression__Group_2_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_4__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4__2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4__2__Impl"
+    // InternalFormalML.g:59318:1: rule__ValueSelectionExpression__Group_2_4__2__Impl : ( ( rule__ValueSelectionExpression__ElementAssignment_2_4_2 ) ) ;
+    public final void rule__ValueSelectionExpression__Group_2_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59322:1: ( ( ( rule__ValueSelectionExpression__ElementAssignment_2_4_2 ) ) )
+            // InternalFormalML.g:59323:1: ( ( rule__ValueSelectionExpression__ElementAssignment_2_4_2 ) )
+            {
+            // InternalFormalML.g:59323:1: ( ( rule__ValueSelectionExpression__ElementAssignment_2_4_2 ) )
+            // InternalFormalML.g:59324:2: ( rule__ValueSelectionExpression__ElementAssignment_2_4_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_4_2()); 
+            }
+            // InternalFormalML.g:59325:2: ( rule__ValueSelectionExpression__ElementAssignment_2_4_2 )
+            // InternalFormalML.g:59325:3: rule__ValueSelectionExpression__ElementAssignment_2_4_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__ElementAssignment_2_4_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getElementAssignment_2_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4__2__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4__3"
+    // InternalFormalML.g:59333:1: rule__ValueSelectionExpression__Group_2_4__3 : rule__ValueSelectionExpression__Group_2_4__3__Impl ;
+    public final void rule__ValueSelectionExpression__Group_2_4__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59337:1: ( rule__ValueSelectionExpression__Group_2_4__3__Impl )
+            // InternalFormalML.g:59338:2: rule__ValueSelectionExpression__Group_2_4__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_4__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4__3"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4__3__Impl"
+    // InternalFormalML.g:59344:1: rule__ValueSelectionExpression__Group_2_4__3__Impl : ( ( rule__ValueSelectionExpression__Group_2_4_3__0 )? ) ;
+    public final void rule__ValueSelectionExpression__Group_2_4__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59348:1: ( ( ( rule__ValueSelectionExpression__Group_2_4_3__0 )? ) )
+            // InternalFormalML.g:59349:1: ( ( rule__ValueSelectionExpression__Group_2_4_3__0 )? )
+            {
+            // InternalFormalML.g:59349:1: ( ( rule__ValueSelectionExpression__Group_2_4_3__0 )? )
+            // InternalFormalML.g:59350:2: ( rule__ValueSelectionExpression__Group_2_4_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4_3()); 
+            }
+            // InternalFormalML.g:59351:2: ( rule__ValueSelectionExpression__Group_2_4_3__0 )?
+            int alt698=2;
+            int LA698_0 = input.LA(1);
+
+            if ( (LA698_0==22) ) {
+                int LA698_1 = input.LA(2);
+
+                if ( ((LA698_1>=RULE_CHARACTER && LA698_1<=RULE_INT)||LA698_1==20||LA698_1==23||(LA698_1>=29 && LA698_1<=30)||LA698_1==125||(LA698_1>=129 && LA698_1<=134)||(LA698_1>=137 && LA698_1<=142)||LA698_1==199||(LA698_1>=261 && LA698_1<=271)||LA698_1==287) ) {
+                    alt698=1;
+                }
+            }
+            switch (alt698) {
+                case 1 :
+                    // InternalFormalML.g:59351:3: rule__ValueSelectionExpression__Group_2_4_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ValueSelectionExpression__Group_2_4_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getGroup_2_4_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4__3__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4_3__0"
+    // InternalFormalML.g:59360:1: rule__ValueSelectionExpression__Group_2_4_3__0 : rule__ValueSelectionExpression__Group_2_4_3__0__Impl rule__ValueSelectionExpression__Group_2_4_3__1 ;
+    public final void rule__ValueSelectionExpression__Group_2_4_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59364:1: ( rule__ValueSelectionExpression__Group_2_4_3__0__Impl rule__ValueSelectionExpression__Group_2_4_3__1 )
+            // InternalFormalML.g:59365:2: rule__ValueSelectionExpression__Group_2_4_3__0__Impl rule__ValueSelectionExpression__Group_2_4_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_20);
+            rule__ValueSelectionExpression__Group_2_4_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_4_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4_3__0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4_3__0__Impl"
+    // InternalFormalML.g:59372:1: rule__ValueSelectionExpression__Group_2_4_3__0__Impl : ( ( rule__ValueSelectionExpression__KindAssignment_2_4_3_0 ) ) ;
+    public final void rule__ValueSelectionExpression__Group_2_4_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59376:1: ( ( ( rule__ValueSelectionExpression__KindAssignment_2_4_3_0 ) ) )
+            // InternalFormalML.g:59377:1: ( ( rule__ValueSelectionExpression__KindAssignment_2_4_3_0 ) )
+            {
+            // InternalFormalML.g:59377:1: ( ( rule__ValueSelectionExpression__KindAssignment_2_4_3_0 ) )
+            // InternalFormalML.g:59378:2: ( rule__ValueSelectionExpression__KindAssignment_2_4_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_4_3_0()); 
+            }
+            // InternalFormalML.g:59379:2: ( rule__ValueSelectionExpression__KindAssignment_2_4_3_0 )
+            // InternalFormalML.g:59379:3: rule__ValueSelectionExpression__KindAssignment_2_4_3_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__KindAssignment_2_4_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getKindAssignment_2_4_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4_3__0__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4_3__1"
+    // InternalFormalML.g:59387:1: rule__ValueSelectionExpression__Group_2_4_3__1 : rule__ValueSelectionExpression__Group_2_4_3__1__Impl rule__ValueSelectionExpression__Group_2_4_3__2 ;
+    public final void rule__ValueSelectionExpression__Group_2_4_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59391:1: ( rule__ValueSelectionExpression__Group_2_4_3__1__Impl rule__ValueSelectionExpression__Group_2_4_3__2 )
+            // InternalFormalML.g:59392:2: rule__ValueSelectionExpression__Group_2_4_3__1__Impl rule__ValueSelectionExpression__Group_2_4_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_121);
+            rule__ValueSelectionExpression__Group_2_4_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_4_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4_3__1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4_3__1__Impl"
+    // InternalFormalML.g:59399:1: rule__ValueSelectionExpression__Group_2_4_3__1__Impl : ( ( rule__ValueSelectionExpression__ArgAssignment_2_4_3_1 ) ) ;
+    public final void rule__ValueSelectionExpression__Group_2_4_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59403:1: ( ( ( rule__ValueSelectionExpression__ArgAssignment_2_4_3_1 ) ) )
+            // InternalFormalML.g:59404:1: ( ( rule__ValueSelectionExpression__ArgAssignment_2_4_3_1 ) )
+            {
+            // InternalFormalML.g:59404:1: ( ( rule__ValueSelectionExpression__ArgAssignment_2_4_3_1 ) )
+            // InternalFormalML.g:59405:2: ( rule__ValueSelectionExpression__ArgAssignment_2_4_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_4_3_1()); 
+            }
+            // InternalFormalML.g:59406:2: ( rule__ValueSelectionExpression__ArgAssignment_2_4_3_1 )
+            // InternalFormalML.g:59406:3: rule__ValueSelectionExpression__ArgAssignment_2_4_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__ArgAssignment_2_4_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getArgAssignment_2_4_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4_3__1__Impl"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4_3__2"
+    // InternalFormalML.g:59414:1: rule__ValueSelectionExpression__Group_2_4_3__2 : rule__ValueSelectionExpression__Group_2_4_3__2__Impl ;
+    public final void rule__ValueSelectionExpression__Group_2_4_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59418:1: ( rule__ValueSelectionExpression__Group_2_4_3__2__Impl )
+            // InternalFormalML.g:59419:2: rule__ValueSelectionExpression__Group_2_4_3__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValueSelectionExpression__Group_2_4_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4_3__2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__Group_2_4_3__2__Impl"
+    // InternalFormalML.g:59425:1: rule__ValueSelectionExpression__Group_2_4_3__2__Impl : ( ']' ) ;
+    public final void rule__ValueSelectionExpression__Group_2_4_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59429:1: ( ( ']' ) )
+            // InternalFormalML.g:59430:1: ( ']' )
+            {
+            // InternalFormalML.g:59430:1: ( ']' )
+            // InternalFormalML.g:59431:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_4_3_2()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_4_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__Group_2_4_3__2__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group__0"
+    // InternalFormalML.g:59441:1: rule__ValuePureNamedMachineExpression__Group__0 : rule__ValuePureNamedMachineExpression__Group__0__Impl rule__ValuePureNamedMachineExpression__Group__1 ;
+    public final void rule__ValuePureNamedMachineExpression__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59445:1: ( rule__ValuePureNamedMachineExpression__Group__0__Impl rule__ValuePureNamedMachineExpression__Group__1 )
+            // InternalFormalML.g:59446:2: rule__ValuePureNamedMachineExpression__Group__0__Impl rule__ValuePureNamedMachineExpression__Group__1
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__ValuePureNamedMachineExpression__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group__0"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group__0__Impl"
+    // InternalFormalML.g:59453:1: rule__ValuePureNamedMachineExpression__Group__0__Impl : ( ruleLiteralPureReferenceExpression ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59457:1: ( ( ruleLiteralPureReferenceExpression ) )
+            // InternalFormalML.g:59458:1: ( ruleLiteralPureReferenceExpression )
+            {
+            // InternalFormalML.g:59458:1: ( ruleLiteralPureReferenceExpression )
+            // InternalFormalML.g:59459:2: ruleLiteralPureReferenceExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getLiteralPureReferenceExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLiteralPureReferenceExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getLiteralPureReferenceExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group__1"
+    // InternalFormalML.g:59468:1: rule__ValuePureNamedMachineExpression__Group__1 : rule__ValuePureNamedMachineExpression__Group__1__Impl rule__ValuePureNamedMachineExpression__Group__2 ;
+    public final void rule__ValuePureNamedMachineExpression__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59472:1: ( rule__ValuePureNamedMachineExpression__Group__1__Impl rule__ValuePureNamedMachineExpression__Group__2 )
+            // InternalFormalML.g:59473:2: rule__ValuePureNamedMachineExpression__Group__1__Impl rule__ValuePureNamedMachineExpression__Group__2
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__ValuePureNamedMachineExpression__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group__1"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group__1__Impl"
+    // InternalFormalML.g:59480:1: rule__ValuePureNamedMachineExpression__Group__1__Impl : ( ( rule__ValuePureNamedMachineExpression__Group_1__0 )* ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59484:1: ( ( ( rule__ValuePureNamedMachineExpression__Group_1__0 )* ) )
+            // InternalFormalML.g:59485:1: ( ( rule__ValuePureNamedMachineExpression__Group_1__0 )* )
+            {
+            // InternalFormalML.g:59485:1: ( ( rule__ValuePureNamedMachineExpression__Group_1__0 )* )
+            // InternalFormalML.g:59486:2: ( rule__ValuePureNamedMachineExpression__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_1()); 
+            }
+            // InternalFormalML.g:59487:2: ( rule__ValuePureNamedMachineExpression__Group_1__0 )*
+            loop699:
+            do {
+                int alt699=2;
+                int LA699_0 = input.LA(1);
+
+                if ( (LA699_0==20) ) {
+                    alt699=1;
+                }
+
+
+                switch (alt699) {
+            	case 1 :
+            	    // InternalFormalML.g:59487:3: rule__ValuePureNamedMachineExpression__Group_1__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_259);
+            	    rule__ValuePureNamedMachineExpression__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop699;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group__1__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group__2"
+    // InternalFormalML.g:59495:1: rule__ValuePureNamedMachineExpression__Group__2 : rule__ValuePureNamedMachineExpression__Group__2__Impl ;
+    public final void rule__ValuePureNamedMachineExpression__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59499:1: ( rule__ValuePureNamedMachineExpression__Group__2__Impl )
+            // InternalFormalML.g:59500:2: rule__ValuePureNamedMachineExpression__Group__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group__2"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group__2__Impl"
+    // InternalFormalML.g:59506:1: rule__ValuePureNamedMachineExpression__Group__2__Impl : ( ( rule__ValuePureNamedMachineExpression__Group_2__0 )? ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59510:1: ( ( ( rule__ValuePureNamedMachineExpression__Group_2__0 )? ) )
+            // InternalFormalML.g:59511:1: ( ( rule__ValuePureNamedMachineExpression__Group_2__0 )? )
+            {
+            // InternalFormalML.g:59511:1: ( ( rule__ValuePureNamedMachineExpression__Group_2__0 )? )
+            // InternalFormalML.g:59512:2: ( rule__ValuePureNamedMachineExpression__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2()); 
+            }
+            // InternalFormalML.g:59513:2: ( rule__ValuePureNamedMachineExpression__Group_2__0 )?
+            int alt700=2;
+            int LA700_0 = input.LA(1);
+
+            if ( (LA700_0==21) ) {
+                alt700=1;
+            }
+            switch (alt700) {
+                case 1 :
+                    // InternalFormalML.g:59513:3: rule__ValuePureNamedMachineExpression__Group_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ValuePureNamedMachineExpression__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group__2__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_1__0"
+    // InternalFormalML.g:59522:1: rule__ValuePureNamedMachineExpression__Group_1__0 : rule__ValuePureNamedMachineExpression__Group_1__0__Impl rule__ValuePureNamedMachineExpression__Group_1__1 ;
+    public final void rule__ValuePureNamedMachineExpression__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59526:1: ( rule__ValuePureNamedMachineExpression__Group_1__0__Impl rule__ValuePureNamedMachineExpression__Group_1__1 )
+            // InternalFormalML.g:59527:2: rule__ValuePureNamedMachineExpression__Group_1__0__Impl rule__ValuePureNamedMachineExpression__Group_1__1
+            {
+            pushFollow(FollowSets000.FOLLOW_260);
+            rule__ValuePureNamedMachineExpression__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_1__0"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_1__0__Impl"
+    // InternalFormalML.g:59534:1: rule__ValuePureNamedMachineExpression__Group_1__0__Impl : ( () ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59538:1: ( ( () ) )
+            // InternalFormalML.g:59539:1: ( () )
+            {
+            // InternalFormalML.g:59539:1: ( () )
+            // InternalFormalML.g:59540:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_1_0()); 
+            }
+            // InternalFormalML.g:59541:2: ()
+            // InternalFormalML.g:59541:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_1__1"
+    // InternalFormalML.g:59549:1: rule__ValuePureNamedMachineExpression__Group_1__1 : rule__ValuePureNamedMachineExpression__Group_1__1__Impl rule__ValuePureNamedMachineExpression__Group_1__2 ;
+    public final void rule__ValuePureNamedMachineExpression__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59553:1: ( rule__ValuePureNamedMachineExpression__Group_1__1__Impl rule__ValuePureNamedMachineExpression__Group_1__2 )
+            // InternalFormalML.g:59554:2: rule__ValuePureNamedMachineExpression__Group_1__1__Impl rule__ValuePureNamedMachineExpression__Group_1__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ValuePureNamedMachineExpression__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_1__1"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_1__1__Impl"
+    // InternalFormalML.g:59561:1: rule__ValuePureNamedMachineExpression__Group_1__1__Impl : ( ( rule__ValuePureNamedMachineExpression__KindAssignment_1_1 ) ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59565:1: ( ( ( rule__ValuePureNamedMachineExpression__KindAssignment_1_1 ) ) )
+            // InternalFormalML.g:59566:1: ( ( rule__ValuePureNamedMachineExpression__KindAssignment_1_1 ) )
+            {
+            // InternalFormalML.g:59566:1: ( ( rule__ValuePureNamedMachineExpression__KindAssignment_1_1 ) )
+            // InternalFormalML.g:59567:2: ( rule__ValuePureNamedMachineExpression__KindAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_1_1()); 
+            }
+            // InternalFormalML.g:59568:2: ( rule__ValuePureNamedMachineExpression__KindAssignment_1_1 )
+            // InternalFormalML.g:59568:3: rule__ValuePureNamedMachineExpression__KindAssignment_1_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__KindAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_1__2"
+    // InternalFormalML.g:59576:1: rule__ValuePureNamedMachineExpression__Group_1__2 : rule__ValuePureNamedMachineExpression__Group_1__2__Impl ;
+    public final void rule__ValuePureNamedMachineExpression__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59580:1: ( rule__ValuePureNamedMachineExpression__Group_1__2__Impl )
+            // InternalFormalML.g:59581:2: rule__ValuePureNamedMachineExpression__Group_1__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_1__2"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_1__2__Impl"
+    // InternalFormalML.g:59587:1: rule__ValuePureNamedMachineExpression__Group_1__2__Impl : ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_1_2 ) ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59591:1: ( ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_1_2 ) ) )
+            // InternalFormalML.g:59592:1: ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_1_2 ) )
+            {
+            // InternalFormalML.g:59592:1: ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_1_2 ) )
+            // InternalFormalML.g:59593:2: ( rule__ValuePureNamedMachineExpression__ElementAssignment_1_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_1_2()); 
+            }
+            // InternalFormalML.g:59594:2: ( rule__ValuePureNamedMachineExpression__ElementAssignment_1_2 )
+            // InternalFormalML.g:59594:3: rule__ValuePureNamedMachineExpression__ElementAssignment_1_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__ElementAssignment_1_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2__0"
+    // InternalFormalML.g:59603:1: rule__ValuePureNamedMachineExpression__Group_2__0 : rule__ValuePureNamedMachineExpression__Group_2__0__Impl rule__ValuePureNamedMachineExpression__Group_2__1 ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59607:1: ( rule__ValuePureNamedMachineExpression__Group_2__0__Impl rule__ValuePureNamedMachineExpression__Group_2__1 )
+            // InternalFormalML.g:59608:2: rule__ValuePureNamedMachineExpression__Group_2__0__Impl rule__ValuePureNamedMachineExpression__Group_2__1
+            {
+            pushFollow(FollowSets000.FOLLOW_132);
+            rule__ValuePureNamedMachineExpression__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2__0"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2__0__Impl"
+    // InternalFormalML.g:59615:1: rule__ValuePureNamedMachineExpression__Group_2__0__Impl : ( () ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59619:1: ( ( () ) )
+            // InternalFormalML.g:59620:1: ( () )
+            {
+            // InternalFormalML.g:59620:1: ( () )
+            // InternalFormalML.g:59621:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_0()); 
+            }
+            // InternalFormalML.g:59622:2: ()
+            // InternalFormalML.g:59622:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2__1"
+    // InternalFormalML.g:59630:1: rule__ValuePureNamedMachineExpression__Group_2__1 : rule__ValuePureNamedMachineExpression__Group_2__1__Impl rule__ValuePureNamedMachineExpression__Group_2__2 ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59634:1: ( rule__ValuePureNamedMachineExpression__Group_2__1__Impl rule__ValuePureNamedMachineExpression__Group_2__2 )
+            // InternalFormalML.g:59635:2: rule__ValuePureNamedMachineExpression__Group_2__1__Impl rule__ValuePureNamedMachineExpression__Group_2__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ValuePureNamedMachineExpression__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2__1"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2__1__Impl"
+    // InternalFormalML.g:59642:1: rule__ValuePureNamedMachineExpression__Group_2__1__Impl : ( ( rule__ValuePureNamedMachineExpression__KindAssignment_2_1 ) ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59646:1: ( ( ( rule__ValuePureNamedMachineExpression__KindAssignment_2_1 ) ) )
+            // InternalFormalML.g:59647:1: ( ( rule__ValuePureNamedMachineExpression__KindAssignment_2_1 ) )
+            {
+            // InternalFormalML.g:59647:1: ( ( rule__ValuePureNamedMachineExpression__KindAssignment_2_1 ) )
+            // InternalFormalML.g:59648:2: ( rule__ValuePureNamedMachineExpression__KindAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_1()); 
+            }
+            // InternalFormalML.g:59649:2: ( rule__ValuePureNamedMachineExpression__KindAssignment_2_1 )
+            // InternalFormalML.g:59649:3: rule__ValuePureNamedMachineExpression__KindAssignment_2_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__KindAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2__2"
+    // InternalFormalML.g:59657:1: rule__ValuePureNamedMachineExpression__Group_2__2 : rule__ValuePureNamedMachineExpression__Group_2__2__Impl rule__ValuePureNamedMachineExpression__Group_2__3 ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59661:1: ( rule__ValuePureNamedMachineExpression__Group_2__2__Impl rule__ValuePureNamedMachineExpression__Group_2__3 )
+            // InternalFormalML.g:59662:2: rule__ValuePureNamedMachineExpression__Group_2__2__Impl rule__ValuePureNamedMachineExpression__Group_2__3
+            {
+            pushFollow(FollowSets000.FOLLOW_260);
+            rule__ValuePureNamedMachineExpression__Group_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2__2"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2__2__Impl"
+    // InternalFormalML.g:59669:1: rule__ValuePureNamedMachineExpression__Group_2__2__Impl : ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_2 ) ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59673:1: ( ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_2 ) ) )
+            // InternalFormalML.g:59674:1: ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_2 ) )
+            {
+            // InternalFormalML.g:59674:1: ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_2 ) )
+            // InternalFormalML.g:59675:2: ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_2()); 
+            }
+            // InternalFormalML.g:59676:2: ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_2 )
+            // InternalFormalML.g:59676:3: rule__ValuePureNamedMachineExpression__ElementAssignment_2_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__ElementAssignment_2_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2__2__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2__3"
+    // InternalFormalML.g:59684:1: rule__ValuePureNamedMachineExpression__Group_2__3 : rule__ValuePureNamedMachineExpression__Group_2__3__Impl ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59688:1: ( rule__ValuePureNamedMachineExpression__Group_2__3__Impl )
+            // InternalFormalML.g:59689:2: rule__ValuePureNamedMachineExpression__Group_2__3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2__3"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2__3__Impl"
+    // InternalFormalML.g:59695:1: rule__ValuePureNamedMachineExpression__Group_2__3__Impl : ( ( rule__ValuePureNamedMachineExpression__Group_2_3__0 )* ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59699:1: ( ( ( rule__ValuePureNamedMachineExpression__Group_2_3__0 )* ) )
+            // InternalFormalML.g:59700:1: ( ( rule__ValuePureNamedMachineExpression__Group_2_3__0 )* )
+            {
+            // InternalFormalML.g:59700:1: ( ( rule__ValuePureNamedMachineExpression__Group_2_3__0 )* )
+            // InternalFormalML.g:59701:2: ( rule__ValuePureNamedMachineExpression__Group_2_3__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2_3()); 
+            }
+            // InternalFormalML.g:59702:2: ( rule__ValuePureNamedMachineExpression__Group_2_3__0 )*
+            loop701:
+            do {
+                int alt701=2;
+                int LA701_0 = input.LA(1);
+
+                if ( (LA701_0==20) ) {
+                    alt701=1;
+                }
+
+
+                switch (alt701) {
+            	case 1 :
+            	    // InternalFormalML.g:59702:3: rule__ValuePureNamedMachineExpression__Group_2_3__0
+            	    {
+            	    pushFollow(FollowSets000.FOLLOW_259);
+            	    rule__ValuePureNamedMachineExpression__Group_2_3__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop701;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getGroup_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2__3__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2_3__0"
+    // InternalFormalML.g:59711:1: rule__ValuePureNamedMachineExpression__Group_2_3__0 : rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl rule__ValuePureNamedMachineExpression__Group_2_3__1 ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59715:1: ( rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl rule__ValuePureNamedMachineExpression__Group_2_3__1 )
+            // InternalFormalML.g:59716:2: rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl rule__ValuePureNamedMachineExpression__Group_2_3__1
+            {
+            pushFollow(FollowSets000.FOLLOW_260);
+            rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_2_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2_3__0"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl"
+    // InternalFormalML.g:59723:1: rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl : ( () ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59727:1: ( ( () ) )
+            // InternalFormalML.g:59728:1: ( () )
+            {
+            // InternalFormalML.g:59728:1: ( () )
+            // InternalFormalML.g:59729:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_3_0()); 
+            }
+            // InternalFormalML.g:59730:2: ()
+            // InternalFormalML.g:59730:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2_3__0__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2_3__1"
+    // InternalFormalML.g:59738:1: rule__ValuePureNamedMachineExpression__Group_2_3__1 : rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl rule__ValuePureNamedMachineExpression__Group_2_3__2 ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59742:1: ( rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl rule__ValuePureNamedMachineExpression__Group_2_3__2 )
+            // InternalFormalML.g:59743:2: rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl rule__ValuePureNamedMachineExpression__Group_2_3__2
+            {
+            pushFollow(FollowSets000.FOLLOW_27);
+            rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_2_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2_3__1"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl"
+    // InternalFormalML.g:59750:1: rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl : ( ( rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1 ) ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59754:1: ( ( ( rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1 ) ) )
+            // InternalFormalML.g:59755:1: ( ( rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1 ) )
+            {
+            // InternalFormalML.g:59755:1: ( ( rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1 ) )
+            // InternalFormalML.g:59756:2: ( rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_3_1()); 
+            }
+            // InternalFormalML.g:59757:2: ( rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1 )
+            // InternalFormalML.g:59757:3: rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindAssignment_2_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2_3__1__Impl"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2_3__2"
+    // InternalFormalML.g:59765:1: rule__ValuePureNamedMachineExpression__Group_2_3__2 : rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59769:1: ( rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl )
+            // InternalFormalML.g:59770:2: rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2_3__2"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl"
+    // InternalFormalML.g:59776:1: rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl : ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2 ) ) ;
+    public final void rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59780:1: ( ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2 ) ) )
+            // InternalFormalML.g:59781:1: ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2 ) )
+            {
+            // InternalFormalML.g:59781:1: ( ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2 ) )
+            // InternalFormalML.g:59782:2: ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_3_2()); 
+            }
+            // InternalFormalML.g:59783:2: ( rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2 )
+            // InternalFormalML.g:59783:3: rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementAssignment_2_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__Group_2_3__2__Impl"
+
+
+    // $ANTLR start "rule__System__UnorderedGroup_0"
+    // InternalFormalML.g:59792:1: rule__System__UnorderedGroup_0 : ( rule__System__UnorderedGroup_0__0 )? ;
+    public final void rule__System__UnorderedGroup_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+        	
+        try {
+            // InternalFormalML.g:59797:1: ( ( rule__System__UnorderedGroup_0__0 )? )
+            // InternalFormalML.g:59798:2: ( rule__System__UnorderedGroup_0__0 )?
+            {
+            // InternalFormalML.g:59798:2: ( rule__System__UnorderedGroup_0__0 )?
+            int alt702=2;
+            int LA702_0 = input.LA(1);
+
+            if ( LA702_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt702=1;
+            }
+            else if ( LA702_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt702=1;
+            }
+            else if ( LA702_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt702=1;
+            }
+            else if ( LA702_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt702=1;
+            }
+            else if ( LA702_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+                alt702=1;
+            }
+            else if ( LA702_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+                alt702=1;
+            }
+            switch (alt702) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__System__UnorderedGroup_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__UnorderedGroup_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__UnorderedGroup_0"
+
+
+    // $ANTLR start "rule__System__UnorderedGroup_0__Impl"
+    // InternalFormalML.g:59806:1: rule__System__UnorderedGroup_0__Impl : ( ({...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__System__Alternatives_0_1 ) ) ) ) ) ;
+    public final void rule__System__UnorderedGroup_0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:59811:1: ( ( ({...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__System__Alternatives_0_1 ) ) ) ) ) )
+            // InternalFormalML.g:59812:3: ( ({...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__System__Alternatives_0_1 ) ) ) ) )
+            {
+            // InternalFormalML.g:59812:3: ( ({...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__System__Alternatives_0_1 ) ) ) ) )
+            int alt703=2;
+            int LA703_0 = input.LA(1);
+
+            if ( LA703_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt703=1;
+            }
+            else if ( LA703_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt703=1;
+            }
+            else if ( LA703_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt703=1;
+            }
+            else if ( LA703_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt703=1;
+            }
+            else if ( LA703_0 >= 273 && LA703_0 <= 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+                alt703=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 703, 0, input);
+
+                throw nvae;
+            }
+            switch (alt703) {
+                case 1 :
+                    // InternalFormalML.g:59813:3: ({...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:59813:3: ({...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) ) )
+                    // InternalFormalML.g:59814:4: {...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__System__UnorderedGroup_0__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0)");
+                    }
+                    // InternalFormalML.g:59814:102: ( ( ( rule__System__VisibilityAssignment_0_0 ) ) )
+                    // InternalFormalML.g:59815:5: ( ( rule__System__VisibilityAssignment_0_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0);
+                    selected = true;
+                    // InternalFormalML.g:59821:5: ( ( rule__System__VisibilityAssignment_0_0 ) )
+                    // InternalFormalML.g:59822:6: ( rule__System__VisibilityAssignment_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getVisibilityAssignment_0_0()); 
+                    }
+                    // InternalFormalML.g:59823:6: ( rule__System__VisibilityAssignment_0_0 )
+                    // InternalFormalML.g:59823:7: rule__System__VisibilityAssignment_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__VisibilityAssignment_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getVisibilityAssignment_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:59828:3: ({...}? => ( ( ( rule__System__Alternatives_0_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:59828:3: ({...}? => ( ( ( rule__System__Alternatives_0_1 ) ) ) )
+                    // InternalFormalML.g:59829:4: {...}? => ( ( ( rule__System__Alternatives_0_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__System__UnorderedGroup_0__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1)");
+                    }
+                    // InternalFormalML.g:59829:102: ( ( ( rule__System__Alternatives_0_1 ) ) )
+                    // InternalFormalML.g:59830:5: ( ( rule__System__Alternatives_0_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1);
+                    selected = true;
+                    // InternalFormalML.g:59836:5: ( ( rule__System__Alternatives_0_1 ) )
+                    // InternalFormalML.g:59837:6: ( rule__System__Alternatives_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getSystemAccess().getAlternatives_0_1()); 
+                    }
+                    // InternalFormalML.g:59838:6: ( rule__System__Alternatives_0_1 )
+                    // InternalFormalML.g:59838:7: rule__System__Alternatives_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__Alternatives_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getSystemAccess().getAlternatives_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__UnorderedGroup_0__Impl"
+
+
+    // $ANTLR start "rule__System__UnorderedGroup_0__0"
+    // InternalFormalML.g:59851:1: rule__System__UnorderedGroup_0__0 : rule__System__UnorderedGroup_0__Impl ( rule__System__UnorderedGroup_0__1 )? ;
+    public final void rule__System__UnorderedGroup_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59855:1: ( rule__System__UnorderedGroup_0__Impl ( rule__System__UnorderedGroup_0__1 )? )
+            // InternalFormalML.g:59856:2: rule__System__UnorderedGroup_0__Impl ( rule__System__UnorderedGroup_0__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_281);
+            rule__System__UnorderedGroup_0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:59857:2: ( rule__System__UnorderedGroup_0__1 )?
+            int alt704=2;
+            int LA704_0 = input.LA(1);
+
+            if ( LA704_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt704=1;
+            }
+            else if ( LA704_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt704=1;
+            }
+            else if ( LA704_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt704=1;
+            }
+            else if ( LA704_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                alt704=1;
+            }
+            else if ( LA704_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+                alt704=1;
+            }
+            else if ( LA704_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+                alt704=1;
+            }
+            switch (alt704) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__System__UnorderedGroup_0__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__System__UnorderedGroup_0__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__UnorderedGroup_0__0"
+
+
+    // $ANTLR start "rule__System__UnorderedGroup_0__1"
+    // InternalFormalML.g:59863:1: rule__System__UnorderedGroup_0__1 : rule__System__UnorderedGroup_0__Impl ;
+    public final void rule__System__UnorderedGroup_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59867:1: ( rule__System__UnorderedGroup_0__Impl )
+            // InternalFormalML.g:59868:2: rule__System__UnorderedGroup_0__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__System__UnorderedGroup_0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__UnorderedGroup_0__1"
+
+
+    // $ANTLR start "rule__MachineBlock__UnorderedGroup_0"
+    // InternalFormalML.g:59875:1: rule__MachineBlock__UnorderedGroup_0 : ( rule__MachineBlock__UnorderedGroup_0__0 )? ;
+    public final void rule__MachineBlock__UnorderedGroup_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+        	
+        try {
+            // InternalFormalML.g:59880:1: ( ( rule__MachineBlock__UnorderedGroup_0__0 )? )
+            // InternalFormalML.g:59881:2: ( rule__MachineBlock__UnorderedGroup_0__0 )?
+            {
+            // InternalFormalML.g:59881:2: ( rule__MachineBlock__UnorderedGroup_0__0 )?
+            int alt705=2;
+            alt705 = dfa705.predict(input);
+            switch (alt705) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__MachineBlock__UnorderedGroup_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__UnorderedGroup_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__UnorderedGroup_0"
+
+
+    // $ANTLR start "rule__MachineBlock__UnorderedGroup_0__Impl"
+    // InternalFormalML.g:59889:1: rule__MachineBlock__UnorderedGroup_0__Impl : ( ({...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) ) ) | ({...}? => ( ( ( rule__MachineBlock__DesignAssignment_0_2 ) ) ) ) ) ;
+    public final void rule__MachineBlock__UnorderedGroup_0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:59894:1: ( ( ({...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) ) ) | ({...}? => ( ( ( rule__MachineBlock__DesignAssignment_0_2 ) ) ) ) ) )
+            // InternalFormalML.g:59895:3: ( ({...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) ) ) | ({...}? => ( ( ( rule__MachineBlock__DesignAssignment_0_2 ) ) ) ) )
+            {
+            // InternalFormalML.g:59895:3: ( ({...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) ) ) | ({...}? => ( ( ( rule__MachineBlock__DesignAssignment_0_2 ) ) ) ) )
+            int alt706=3;
+            int LA706_0 = input.LA(1);
+
+            if ( LA706_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {
+                alt706=1;
+            }
+            else if ( LA706_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {
+                alt706=1;
+            }
+            else if ( LA706_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {
+                alt706=1;
+            }
+            else if ( LA706_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {
+                alt706=1;
+            }
+            else if ( LA706_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {
+                alt706=2;
+            }
+            else if ( LA706_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {
+                alt706=2;
+            }
+            else if ( LA706_0 >= 146 && LA706_0 <= 147 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {
+                alt706=3;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 706, 0, input);
+
+                throw nvae;
+            }
+            switch (alt706) {
+                case 1 :
+                    // InternalFormalML.g:59896:3: ({...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:59896:3: ({...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) ) )
+                    // InternalFormalML.g:59897:4: {...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__MachineBlock__UnorderedGroup_0__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0)");
+                    }
+                    // InternalFormalML.g:59897:108: ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) )
+                    // InternalFormalML.g:59898:5: ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0);
+                    selected = true;
+                    // InternalFormalML.g:59904:5: ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) )
+                    // InternalFormalML.g:59905:6: ( rule__MachineBlock__VisibilityAssignment_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getVisibilityAssignment_0_0()); 
+                    }
+                    // InternalFormalML.g:59906:6: ( rule__MachineBlock__VisibilityAssignment_0_0 )
+                    // InternalFormalML.g:59906:7: rule__MachineBlock__VisibilityAssignment_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__VisibilityAssignment_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getVisibilityAssignment_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:59911:3: ({...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:59911:3: ({...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) ) )
+                    // InternalFormalML.g:59912:4: {...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__MachineBlock__UnorderedGroup_0__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1)");
+                    }
+                    // InternalFormalML.g:59912:108: ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) )
+                    // InternalFormalML.g:59913:5: ( ( rule__MachineBlock__Alternatives_0_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1);
+                    selected = true;
+                    // InternalFormalML.g:59919:5: ( ( rule__MachineBlock__Alternatives_0_1 ) )
+                    // InternalFormalML.g:59920:6: ( rule__MachineBlock__Alternatives_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getAlternatives_0_1()); 
+                    }
+                    // InternalFormalML.g:59921:6: ( rule__MachineBlock__Alternatives_0_1 )
+                    // InternalFormalML.g:59921:7: rule__MachineBlock__Alternatives_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__Alternatives_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getAlternatives_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:59926:3: ({...}? => ( ( ( rule__MachineBlock__DesignAssignment_0_2 ) ) ) )
+                    {
+                    // InternalFormalML.g:59926:3: ({...}? => ( ( ( rule__MachineBlock__DesignAssignment_0_2 ) ) ) )
+                    // InternalFormalML.g:59927:4: {...}? => ( ( ( rule__MachineBlock__DesignAssignment_0_2 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__MachineBlock__UnorderedGroup_0__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2)");
+                    }
+                    // InternalFormalML.g:59927:108: ( ( ( rule__MachineBlock__DesignAssignment_0_2 ) ) )
+                    // InternalFormalML.g:59928:5: ( ( rule__MachineBlock__DesignAssignment_0_2 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2);
+                    selected = true;
+                    // InternalFormalML.g:59934:5: ( ( rule__MachineBlock__DesignAssignment_0_2 ) )
+                    // InternalFormalML.g:59935:6: ( rule__MachineBlock__DesignAssignment_0_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMachineBlockAccess().getDesignAssignment_0_2()); 
+                    }
+                    // InternalFormalML.g:59936:6: ( rule__MachineBlock__DesignAssignment_0_2 )
+                    // InternalFormalML.g:59936:7: rule__MachineBlock__DesignAssignment_0_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__DesignAssignment_0_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMachineBlockAccess().getDesignAssignment_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__UnorderedGroup_0__Impl"
+
+
+    // $ANTLR start "rule__MachineBlock__UnorderedGroup_0__0"
+    // InternalFormalML.g:59949:1: rule__MachineBlock__UnorderedGroup_0__0 : rule__MachineBlock__UnorderedGroup_0__Impl ( rule__MachineBlock__UnorderedGroup_0__1 )? ;
+    public final void rule__MachineBlock__UnorderedGroup_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59953:1: ( rule__MachineBlock__UnorderedGroup_0__Impl ( rule__MachineBlock__UnorderedGroup_0__1 )? )
+            // InternalFormalML.g:59954:2: rule__MachineBlock__UnorderedGroup_0__Impl ( rule__MachineBlock__UnorderedGroup_0__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_48);
+            rule__MachineBlock__UnorderedGroup_0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:59955:2: ( rule__MachineBlock__UnorderedGroup_0__1 )?
+            int alt707=2;
+            alt707 = dfa707.predict(input);
+            switch (alt707) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__MachineBlock__UnorderedGroup_0__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__UnorderedGroup_0__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__UnorderedGroup_0__0"
+
+
+    // $ANTLR start "rule__MachineBlock__UnorderedGroup_0__1"
+    // InternalFormalML.g:59961:1: rule__MachineBlock__UnorderedGroup_0__1 : rule__MachineBlock__UnorderedGroup_0__Impl ( rule__MachineBlock__UnorderedGroup_0__2 )? ;
+    public final void rule__MachineBlock__UnorderedGroup_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59965:1: ( rule__MachineBlock__UnorderedGroup_0__Impl ( rule__MachineBlock__UnorderedGroup_0__2 )? )
+            // InternalFormalML.g:59966:2: rule__MachineBlock__UnorderedGroup_0__Impl ( rule__MachineBlock__UnorderedGroup_0__2 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_48);
+            rule__MachineBlock__UnorderedGroup_0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:59967:2: ( rule__MachineBlock__UnorderedGroup_0__2 )?
+            int alt708=2;
+            alt708 = dfa708.predict(input);
+            switch (alt708) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__MachineBlock__UnorderedGroup_0__2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MachineBlock__UnorderedGroup_0__2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__UnorderedGroup_0__1"
+
+
+    // $ANTLR start "rule__MachineBlock__UnorderedGroup_0__2"
+    // InternalFormalML.g:59973:1: rule__MachineBlock__UnorderedGroup_0__2 : rule__MachineBlock__UnorderedGroup_0__Impl ;
+    public final void rule__MachineBlock__UnorderedGroup_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:59977:1: ( rule__MachineBlock__UnorderedGroup_0__Impl )
+            // InternalFormalML.g:59978:2: rule__MachineBlock__UnorderedGroup_0__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MachineBlock__UnorderedGroup_0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__UnorderedGroup_0__2"
+
+
+    // $ANTLR start "rule__ProcedureExecution__UnorderedGroup_2"
+    // InternalFormalML.g:59985:1: rule__ProcedureExecution__UnorderedGroup_2 : ( rule__ProcedureExecution__UnorderedGroup_2__0 )? ;
+    public final void rule__ProcedureExecution__UnorderedGroup_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+        	
+        try {
+            // InternalFormalML.g:59990:1: ( ( rule__ProcedureExecution__UnorderedGroup_2__0 )? )
+            // InternalFormalML.g:59991:2: ( rule__ProcedureExecution__UnorderedGroup_2__0 )?
+            {
+            // InternalFormalML.g:59991:2: ( rule__ProcedureExecution__UnorderedGroup_2__0 )?
+            int alt709=2;
+            int LA709_0 = input.LA(1);
+
+            if ( LA709_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0) ) {
+                alt709=1;
+            }
+            else if ( LA709_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1) ) {
+                alt709=1;
+            }
+            switch (alt709) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ProcedureExecution__UnorderedGroup_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ProcedureExecution__UnorderedGroup_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__UnorderedGroup_2"
+
+
+    // $ANTLR start "rule__ProcedureExecution__UnorderedGroup_2__Impl"
+    // InternalFormalML.g:59999:1: rule__ProcedureExecution__UnorderedGroup_2__Impl : ( ({...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) ) ) | ({...}? => ( ( ( rule__ProcedureExecution__Group_2_1__0 ) ) ) ) ) ;
+    public final void rule__ProcedureExecution__UnorderedGroup_2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:60004:1: ( ( ({...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) ) ) | ({...}? => ( ( ( rule__ProcedureExecution__Group_2_1__0 ) ) ) ) ) )
+            // InternalFormalML.g:60005:3: ( ({...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) ) ) | ({...}? => ( ( ( rule__ProcedureExecution__Group_2_1__0 ) ) ) ) )
+            {
+            // InternalFormalML.g:60005:3: ( ({...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) ) ) | ({...}? => ( ( ( rule__ProcedureExecution__Group_2_1__0 ) ) ) ) )
+            int alt710=2;
+            int LA710_0 = input.LA(1);
+
+            if ( LA710_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0) ) {
+                alt710=1;
+            }
+            else if ( LA710_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1) ) {
+                alt710=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 710, 0, input);
+
+                throw nvae;
+            }
+            switch (alt710) {
+                case 1 :
+                    // InternalFormalML.g:60006:3: ({...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60006:3: ({...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) ) )
+                    // InternalFormalML.g:60007:4: {...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ProcedureExecution__UnorderedGroup_2__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0)");
+                    }
+                    // InternalFormalML.g:60007:114: ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) )
+                    // InternalFormalML.g:60008:5: ( ( rule__ProcedureExecution__Group_2_0__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0);
+                    selected = true;
+                    // InternalFormalML.g:60014:5: ( ( rule__ProcedureExecution__Group_2_0__0 ) )
+                    // InternalFormalML.g:60015:6: ( rule__ProcedureExecution__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureExecutionAccess().getGroup_2_0()); 
+                    }
+                    // InternalFormalML.g:60016:6: ( rule__ProcedureExecution__Group_2_0__0 )
+                    // InternalFormalML.g:60016:7: rule__ProcedureExecution__Group_2_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ProcedureExecution__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureExecutionAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:60021:3: ({...}? => ( ( ( rule__ProcedureExecution__Group_2_1__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60021:3: ({...}? => ( ( ( rule__ProcedureExecution__Group_2_1__0 ) ) ) )
+                    // InternalFormalML.g:60022:4: {...}? => ( ( ( rule__ProcedureExecution__Group_2_1__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ProcedureExecution__UnorderedGroup_2__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1)");
+                    }
+                    // InternalFormalML.g:60022:114: ( ( ( rule__ProcedureExecution__Group_2_1__0 ) ) )
+                    // InternalFormalML.g:60023:5: ( ( rule__ProcedureExecution__Group_2_1__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1);
+                    selected = true;
+                    // InternalFormalML.g:60029:5: ( ( rule__ProcedureExecution__Group_2_1__0 ) )
+                    // InternalFormalML.g:60030:6: ( rule__ProcedureExecution__Group_2_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getProcedureExecutionAccess().getGroup_2_1()); 
+                    }
+                    // InternalFormalML.g:60031:6: ( rule__ProcedureExecution__Group_2_1__0 )
+                    // InternalFormalML.g:60031:7: rule__ProcedureExecution__Group_2_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ProcedureExecution__Group_2_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getProcedureExecutionAccess().getGroup_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__UnorderedGroup_2__Impl"
+
+
+    // $ANTLR start "rule__ProcedureExecution__UnorderedGroup_2__0"
+    // InternalFormalML.g:60044:1: rule__ProcedureExecution__UnorderedGroup_2__0 : rule__ProcedureExecution__UnorderedGroup_2__Impl ( rule__ProcedureExecution__UnorderedGroup_2__1 )? ;
+    public final void rule__ProcedureExecution__UnorderedGroup_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60048:1: ( rule__ProcedureExecution__UnorderedGroup_2__Impl ( rule__ProcedureExecution__UnorderedGroup_2__1 )? )
+            // InternalFormalML.g:60049:2: rule__ProcedureExecution__UnorderedGroup_2__Impl ( rule__ProcedureExecution__UnorderedGroup_2__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_282);
+            rule__ProcedureExecution__UnorderedGroup_2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60050:2: ( rule__ProcedureExecution__UnorderedGroup_2__1 )?
+            int alt711=2;
+            int LA711_0 = input.LA(1);
+
+            if ( LA711_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0) ) {
+                alt711=1;
+            }
+            else if ( LA711_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1) ) {
+                alt711=1;
+            }
+            switch (alt711) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ProcedureExecution__UnorderedGroup_2__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ProcedureExecution__UnorderedGroup_2__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__UnorderedGroup_2__0"
+
+
+    // $ANTLR start "rule__ProcedureExecution__UnorderedGroup_2__1"
+    // InternalFormalML.g:60056:1: rule__ProcedureExecution__UnorderedGroup_2__1 : rule__ProcedureExecution__UnorderedGroup_2__Impl ;
+    public final void rule__ProcedureExecution__UnorderedGroup_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60060:1: ( rule__ProcedureExecution__UnorderedGroup_2__Impl )
+            // InternalFormalML.g:60061:2: rule__ProcedureExecution__UnorderedGroup_2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ProcedureExecution__UnorderedGroup_2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__UnorderedGroup_2__1"
+
+
+    // $ANTLR start "rule__MoeBehavior__UnorderedGroup_2"
+    // InternalFormalML.g:60068:1: rule__MoeBehavior__UnorderedGroup_2 : ( rule__MoeBehavior__UnorderedGroup_2__0 )? ;
+    public final void rule__MoeBehavior__UnorderedGroup_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+        	
+        try {
+            // InternalFormalML.g:60073:1: ( ( rule__MoeBehavior__UnorderedGroup_2__0 )? )
+            // InternalFormalML.g:60074:2: ( rule__MoeBehavior__UnorderedGroup_2__0 )?
+            {
+            // InternalFormalML.g:60074:2: ( rule__MoeBehavior__UnorderedGroup_2__0 )?
+            int alt712=2;
+            int LA712_0 = input.LA(1);
+
+            if ( LA712_0 == 221 && getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0) ) {
+                alt712=1;
+            }
+            else if ( LA712_0 == 226 && getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1) ) {
+                alt712=1;
+            }
+            switch (alt712) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__MoeBehavior__UnorderedGroup_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__UnorderedGroup_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__UnorderedGroup_2"
+
+
+    // $ANTLR start "rule__MoeBehavior__UnorderedGroup_2__Impl"
+    // InternalFormalML.g:60082:1: rule__MoeBehavior__UnorderedGroup_2__Impl : ( ({...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) ) ) | ({...}? => ( ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) ) ) ) ) ;
+    public final void rule__MoeBehavior__UnorderedGroup_2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:60087:1: ( ( ({...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) ) ) | ({...}? => ( ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) ) ) ) ) )
+            // InternalFormalML.g:60088:3: ( ({...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) ) ) | ({...}? => ( ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) ) ) ) )
+            {
+            // InternalFormalML.g:60088:3: ( ({...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) ) ) | ({...}? => ( ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) ) ) ) )
+            int alt713=2;
+            int LA713_0 = input.LA(1);
+
+            if ( LA713_0 == 221 && getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0) ) {
+                alt713=1;
+            }
+            else if ( LA713_0 == 226 && getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1) ) {
+                alt713=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 713, 0, input);
+
+                throw nvae;
+            }
+            switch (alt713) {
+                case 1 :
+                    // InternalFormalML.g:60089:3: ({...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60089:3: ({...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) ) )
+                    // InternalFormalML.g:60090:4: {...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__MoeBehavior__UnorderedGroup_2__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0)");
+                    }
+                    // InternalFormalML.g:60090:107: ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) )
+                    // InternalFormalML.g:60091:5: ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0);
+                    selected = true;
+                    // InternalFormalML.g:60097:5: ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) )
+                    // InternalFormalML.g:60098:6: ( rule__MoeBehavior__ExecutionAssignment_2_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeBehaviorAccess().getExecutionAssignment_2_0()); 
+                    }
+                    // InternalFormalML.g:60099:6: ( rule__MoeBehavior__ExecutionAssignment_2_0 )
+                    // InternalFormalML.g:60099:7: rule__MoeBehavior__ExecutionAssignment_2_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__ExecutionAssignment_2_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeBehaviorAccess().getExecutionAssignment_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:60104:3: ({...}? => ( ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:60104:3: ({...}? => ( ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) ) ) )
+                    // InternalFormalML.g:60105:4: {...}? => ( ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__MoeBehavior__UnorderedGroup_2__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1)");
+                    }
+                    // InternalFormalML.g:60105:107: ( ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) ) )
+                    // InternalFormalML.g:60106:5: ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1);
+                    selected = true;
+                    // InternalFormalML.g:60112:5: ( ( rule__MoeBehavior__InteractionAssignment_2_1 ) )
+                    // InternalFormalML.g:60113:6: ( rule__MoeBehavior__InteractionAssignment_2_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getMoeBehaviorAccess().getInteractionAssignment_2_1()); 
+                    }
+                    // InternalFormalML.g:60114:6: ( rule__MoeBehavior__InteractionAssignment_2_1 )
+                    // InternalFormalML.g:60114:7: rule__MoeBehavior__InteractionAssignment_2_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__InteractionAssignment_2_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getMoeBehaviorAccess().getInteractionAssignment_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__UnorderedGroup_2__Impl"
+
+
+    // $ANTLR start "rule__MoeBehavior__UnorderedGroup_2__0"
+    // InternalFormalML.g:60127:1: rule__MoeBehavior__UnorderedGroup_2__0 : rule__MoeBehavior__UnorderedGroup_2__Impl ( rule__MoeBehavior__UnorderedGroup_2__1 )? ;
+    public final void rule__MoeBehavior__UnorderedGroup_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60131:1: ( rule__MoeBehavior__UnorderedGroup_2__Impl ( rule__MoeBehavior__UnorderedGroup_2__1 )? )
+            // InternalFormalML.g:60132:2: rule__MoeBehavior__UnorderedGroup_2__Impl ( rule__MoeBehavior__UnorderedGroup_2__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_283);
+            rule__MoeBehavior__UnorderedGroup_2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60133:2: ( rule__MoeBehavior__UnorderedGroup_2__1 )?
+            int alt714=2;
+            int LA714_0 = input.LA(1);
+
+            if ( LA714_0 == 221 && getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0) ) {
+                alt714=1;
+            }
+            else if ( LA714_0 == 226 && getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1) ) {
+                alt714=1;
+            }
+            switch (alt714) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__MoeBehavior__UnorderedGroup_2__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__MoeBehavior__UnorderedGroup_2__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__UnorderedGroup_2__0"
+
+
+    // $ANTLR start "rule__MoeBehavior__UnorderedGroup_2__1"
+    // InternalFormalML.g:60139:1: rule__MoeBehavior__UnorderedGroup_2__1 : rule__MoeBehavior__UnorderedGroup_2__Impl ;
+    public final void rule__MoeBehavior__UnorderedGroup_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60143:1: ( rule__MoeBehavior__UnorderedGroup_2__Impl )
+            // InternalFormalML.g:60144:2: rule__MoeBehavior__UnorderedGroup_2__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeBehavior__UnorderedGroup_2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__UnorderedGroup_2__1"
+
+
+    // $ANTLR start "rule__Statemachine__UnorderedGroup_1"
+    // InternalFormalML.g:60151:1: rule__Statemachine__UnorderedGroup_1 : ( rule__Statemachine__UnorderedGroup_1__0 )? ;
+    public final void rule__Statemachine__UnorderedGroup_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+        	
+        try {
+            // InternalFormalML.g:60156:1: ( ( rule__Statemachine__UnorderedGroup_1__0 )? )
+            // InternalFormalML.g:60157:2: ( rule__Statemachine__UnorderedGroup_1__0 )?
+            {
+            // InternalFormalML.g:60157:2: ( rule__Statemachine__UnorderedGroup_1__0 )?
+            int alt715=2;
+            alt715 = dfa715.predict(input);
+            switch (alt715) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Statemachine__UnorderedGroup_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__UnorderedGroup_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnorderedGroup_1"
+
+
+    // $ANTLR start "rule__Statemachine__UnorderedGroup_1__Impl"
+    // InternalFormalML.g:60165:1: rule__Statemachine__UnorderedGroup_1__Impl : ( ({...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__DesignAssignment_1_2 ) ) ) ) ) ;
+    public final void rule__Statemachine__UnorderedGroup_1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:60170:1: ( ( ({...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__DesignAssignment_1_2 ) ) ) ) ) )
+            // InternalFormalML.g:60171:3: ( ({...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__DesignAssignment_1_2 ) ) ) ) )
+            {
+            // InternalFormalML.g:60171:3: ( ({...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__DesignAssignment_1_2 ) ) ) ) )
+            int alt716=3;
+            int LA716_0 = input.LA(1);
+
+            if ( LA716_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {
+                alt716=1;
+            }
+            else if ( LA716_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {
+                alt716=1;
+            }
+            else if ( LA716_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {
+                alt716=1;
+            }
+            else if ( LA716_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {
+                alt716=1;
+            }
+            else if ( LA716_0 == 273 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {
+                alt716=2;
+            }
+            else if ( LA716_0 == 274 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {
+                alt716=2;
+            }
+            else if ( LA716_0 >= 146 && LA716_0 <= 147 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {
+                alt716=3;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 716, 0, input);
+
+                throw nvae;
+            }
+            switch (alt716) {
+                case 1 :
+                    // InternalFormalML.g:60172:3: ({...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60172:3: ({...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) ) )
+                    // InternalFormalML.g:60173:4: {...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Statemachine__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0)");
+                    }
+                    // InternalFormalML.g:60173:108: ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) )
+                    // InternalFormalML.g:60174:5: ( ( rule__Statemachine__VisibilityAssignment_1_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0);
+                    selected = true;
+                    // InternalFormalML.g:60180:5: ( ( rule__Statemachine__VisibilityAssignment_1_0 ) )
+                    // InternalFormalML.g:60181:6: ( rule__Statemachine__VisibilityAssignment_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getVisibilityAssignment_1_0()); 
+                    }
+                    // InternalFormalML.g:60182:6: ( rule__Statemachine__VisibilityAssignment_1_0 )
+                    // InternalFormalML.g:60182:7: rule__Statemachine__VisibilityAssignment_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__VisibilityAssignment_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getVisibilityAssignment_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:60187:3: ({...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:60187:3: ({...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) ) )
+                    // InternalFormalML.g:60188:4: {...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Statemachine__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1)");
+                    }
+                    // InternalFormalML.g:60188:108: ( ( ( rule__Statemachine__Alternatives_1_1 ) ) )
+                    // InternalFormalML.g:60189:5: ( ( rule__Statemachine__Alternatives_1_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1);
+                    selected = true;
+                    // InternalFormalML.g:60195:5: ( ( rule__Statemachine__Alternatives_1_1 ) )
+                    // InternalFormalML.g:60196:6: ( rule__Statemachine__Alternatives_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getAlternatives_1_1()); 
+                    }
+                    // InternalFormalML.g:60197:6: ( rule__Statemachine__Alternatives_1_1 )
+                    // InternalFormalML.g:60197:7: rule__Statemachine__Alternatives_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__Alternatives_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getAlternatives_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:60202:3: ({...}? => ( ( ( rule__Statemachine__DesignAssignment_1_2 ) ) ) )
+                    {
+                    // InternalFormalML.g:60202:3: ({...}? => ( ( ( rule__Statemachine__DesignAssignment_1_2 ) ) ) )
+                    // InternalFormalML.g:60203:4: {...}? => ( ( ( rule__Statemachine__DesignAssignment_1_2 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Statemachine__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2)");
+                    }
+                    // InternalFormalML.g:60203:108: ( ( ( rule__Statemachine__DesignAssignment_1_2 ) ) )
+                    // InternalFormalML.g:60204:5: ( ( rule__Statemachine__DesignAssignment_1_2 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2);
+                    selected = true;
+                    // InternalFormalML.g:60210:5: ( ( rule__Statemachine__DesignAssignment_1_2 ) )
+                    // InternalFormalML.g:60211:6: ( rule__Statemachine__DesignAssignment_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getDesignAssignment_1_2()); 
+                    }
+                    // InternalFormalML.g:60212:6: ( rule__Statemachine__DesignAssignment_1_2 )
+                    // InternalFormalML.g:60212:7: rule__Statemachine__DesignAssignment_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__DesignAssignment_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getDesignAssignment_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnorderedGroup_1__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__UnorderedGroup_1__0"
+    // InternalFormalML.g:60225:1: rule__Statemachine__UnorderedGroup_1__0 : rule__Statemachine__UnorderedGroup_1__Impl ( rule__Statemachine__UnorderedGroup_1__1 )? ;
+    public final void rule__Statemachine__UnorderedGroup_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60229:1: ( rule__Statemachine__UnorderedGroup_1__Impl ( rule__Statemachine__UnorderedGroup_1__1 )? )
+            // InternalFormalML.g:60230:2: rule__Statemachine__UnorderedGroup_1__Impl ( rule__Statemachine__UnorderedGroup_1__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_48);
+            rule__Statemachine__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60231:2: ( rule__Statemachine__UnorderedGroup_1__1 )?
+            int alt717=2;
+            alt717 = dfa717.predict(input);
+            switch (alt717) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Statemachine__UnorderedGroup_1__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__UnorderedGroup_1__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnorderedGroup_1__0"
+
+
+    // $ANTLR start "rule__Statemachine__UnorderedGroup_1__1"
+    // InternalFormalML.g:60237:1: rule__Statemachine__UnorderedGroup_1__1 : rule__Statemachine__UnorderedGroup_1__Impl ( rule__Statemachine__UnorderedGroup_1__2 )? ;
+    public final void rule__Statemachine__UnorderedGroup_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60241:1: ( rule__Statemachine__UnorderedGroup_1__Impl ( rule__Statemachine__UnorderedGroup_1__2 )? )
+            // InternalFormalML.g:60242:2: rule__Statemachine__UnorderedGroup_1__Impl ( rule__Statemachine__UnorderedGroup_1__2 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_48);
+            rule__Statemachine__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60243:2: ( rule__Statemachine__UnorderedGroup_1__2 )?
+            int alt718=2;
+            alt718 = dfa718.predict(input);
+            switch (alt718) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Statemachine__UnorderedGroup_1__2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__UnorderedGroup_1__2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnorderedGroup_1__1"
+
+
+    // $ANTLR start "rule__Statemachine__UnorderedGroup_1__2"
+    // InternalFormalML.g:60249:1: rule__Statemachine__UnorderedGroup_1__2 : rule__Statemachine__UnorderedGroup_1__Impl ;
+    public final void rule__Statemachine__UnorderedGroup_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60253:1: ( rule__Statemachine__UnorderedGroup_1__Impl )
+            // InternalFormalML.g:60254:2: rule__Statemachine__UnorderedGroup_1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnorderedGroup_1__2"
+
+
+    // $ANTLR start "rule__Statemachine__UnorderedGroup_12"
+    // InternalFormalML.g:60261:1: rule__Statemachine__UnorderedGroup_12 : ( rule__Statemachine__UnorderedGroup_12__0 )? ;
+    public final void rule__Statemachine__UnorderedGroup_12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+        	
+        try {
+            // InternalFormalML.g:60266:1: ( ( rule__Statemachine__UnorderedGroup_12__0 )? )
+            // InternalFormalML.g:60267:2: ( rule__Statemachine__UnorderedGroup_12__0 )?
+            {
+            // InternalFormalML.g:60267:2: ( rule__Statemachine__UnorderedGroup_12__0 )?
+            int alt719=2;
+            int LA719_0 = input.LA(1);
+
+            if ( LA719_0 == 221 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0) ) {
+                alt719=1;
+            }
+            else if ( LA719_0 == 226 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1) ) {
+                alt719=1;
+            }
+            switch (alt719) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Statemachine__UnorderedGroup_12__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__UnorderedGroup_12__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnorderedGroup_12"
+
+
+    // $ANTLR start "rule__Statemachine__UnorderedGroup_12__Impl"
+    // InternalFormalML.g:60275:1: rule__Statemachine__UnorderedGroup_12__Impl : ( ({...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__InteractionAssignment_12_1 ) ) ) ) ) ;
+    public final void rule__Statemachine__UnorderedGroup_12__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:60280:1: ( ( ({...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__InteractionAssignment_12_1 ) ) ) ) ) )
+            // InternalFormalML.g:60281:3: ( ({...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__InteractionAssignment_12_1 ) ) ) ) )
+            {
+            // InternalFormalML.g:60281:3: ( ({...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) ) ) | ({...}? => ( ( ( rule__Statemachine__InteractionAssignment_12_1 ) ) ) ) )
+            int alt720=2;
+            int LA720_0 = input.LA(1);
+
+            if ( LA720_0 == 221 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0) ) {
+                alt720=1;
+            }
+            else if ( LA720_0 == 226 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1) ) {
+                alt720=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 720, 0, input);
+
+                throw nvae;
+            }
+            switch (alt720) {
+                case 1 :
+                    // InternalFormalML.g:60282:3: ({...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60282:3: ({...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) ) )
+                    // InternalFormalML.g:60283:4: {...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Statemachine__UnorderedGroup_12__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0)");
+                    }
+                    // InternalFormalML.g:60283:109: ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) )
+                    // InternalFormalML.g:60284:5: ( ( rule__Statemachine__ExecutionAssignment_12_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0);
+                    selected = true;
+                    // InternalFormalML.g:60290:5: ( ( rule__Statemachine__ExecutionAssignment_12_0 ) )
+                    // InternalFormalML.g:60291:6: ( rule__Statemachine__ExecutionAssignment_12_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getExecutionAssignment_12_0()); 
+                    }
+                    // InternalFormalML.g:60292:6: ( rule__Statemachine__ExecutionAssignment_12_0 )
+                    // InternalFormalML.g:60292:7: rule__Statemachine__ExecutionAssignment_12_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__ExecutionAssignment_12_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getExecutionAssignment_12_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:60297:3: ({...}? => ( ( ( rule__Statemachine__InteractionAssignment_12_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:60297:3: ({...}? => ( ( ( rule__Statemachine__InteractionAssignment_12_1 ) ) ) )
+                    // InternalFormalML.g:60298:4: {...}? => ( ( ( rule__Statemachine__InteractionAssignment_12_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Statemachine__UnorderedGroup_12__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1)");
+                    }
+                    // InternalFormalML.g:60298:109: ( ( ( rule__Statemachine__InteractionAssignment_12_1 ) ) )
+                    // InternalFormalML.g:60299:5: ( ( rule__Statemachine__InteractionAssignment_12_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1);
+                    selected = true;
+                    // InternalFormalML.g:60305:5: ( ( rule__Statemachine__InteractionAssignment_12_1 ) )
+                    // InternalFormalML.g:60306:6: ( rule__Statemachine__InteractionAssignment_12_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStatemachineAccess().getInteractionAssignment_12_1()); 
+                    }
+                    // InternalFormalML.g:60307:6: ( rule__Statemachine__InteractionAssignment_12_1 )
+                    // InternalFormalML.g:60307:7: rule__Statemachine__InteractionAssignment_12_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__InteractionAssignment_12_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStatemachineAccess().getInteractionAssignment_12_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnorderedGroup_12__Impl"
+
+
+    // $ANTLR start "rule__Statemachine__UnorderedGroup_12__0"
+    // InternalFormalML.g:60320:1: rule__Statemachine__UnorderedGroup_12__0 : rule__Statemachine__UnorderedGroup_12__Impl ( rule__Statemachine__UnorderedGroup_12__1 )? ;
+    public final void rule__Statemachine__UnorderedGroup_12__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60324:1: ( rule__Statemachine__UnorderedGroup_12__Impl ( rule__Statemachine__UnorderedGroup_12__1 )? )
+            // InternalFormalML.g:60325:2: rule__Statemachine__UnorderedGroup_12__Impl ( rule__Statemachine__UnorderedGroup_12__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_283);
+            rule__Statemachine__UnorderedGroup_12__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60326:2: ( rule__Statemachine__UnorderedGroup_12__1 )?
+            int alt721=2;
+            int LA721_0 = input.LA(1);
+
+            if ( LA721_0 == 221 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0) ) {
+                alt721=1;
+            }
+            else if ( LA721_0 == 226 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1) ) {
+                alt721=1;
+            }
+            switch (alt721) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Statemachine__UnorderedGroup_12__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Statemachine__UnorderedGroup_12__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnorderedGroup_12__0"
+
+
+    // $ANTLR start "rule__Statemachine__UnorderedGroup_12__1"
+    // InternalFormalML.g:60332:1: rule__Statemachine__UnorderedGroup_12__1 : rule__Statemachine__UnorderedGroup_12__Impl ;
+    public final void rule__Statemachine__UnorderedGroup_12__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60336:1: ( rule__Statemachine__UnorderedGroup_12__Impl )
+            // InternalFormalML.g:60337:2: rule__Statemachine__UnorderedGroup_12__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Statemachine__UnorderedGroup_12__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnorderedGroup_12__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3"
+    // InternalFormalML.g:60344:1: rule__ModelOfExecution__UnorderedGroup_3 : ( rule__ModelOfExecution__UnorderedGroup_3__0 )? ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+        	
+        try {
+            // InternalFormalML.g:60349:1: ( ( rule__ModelOfExecution__UnorderedGroup_3__0 )? )
+            // InternalFormalML.g:60350:2: ( rule__ModelOfExecution__UnorderedGroup_3__0 )?
+            {
+            // InternalFormalML.g:60350:2: ( rule__ModelOfExecution__UnorderedGroup_3__0 )?
+            int alt722=2;
+            alt722 = dfa722.predict(input);
+            switch (alt722) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ModelOfExecution__UnorderedGroup_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__UnorderedGroup_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3__Impl"
+    // InternalFormalML.g:60358:1: rule__ModelOfExecution__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_7__0 ) ) ) ) ) ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:60363:1: ( ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_7__0 ) ) ) ) ) )
+            // InternalFormalML.g:60364:3: ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_7__0 ) ) ) ) )
+            {
+            // InternalFormalML.g:60364:3: ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) ) ) | ({...}? => ( ( ( rule__ModelOfExecution__Group_3_7__0 ) ) ) ) )
+            int alt723=8;
+            int LA723_0 = input.LA(1);
+
+            if ( LA723_0 == 46 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {
+                alt723=1;
+            }
+            else if ( LA723_0 == 47 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {
+                alt723=2;
+            }
+            else if ( LA723_0 == 48 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {
+                alt723=3;
+            }
+            else if ( LA723_0 == 49 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {
+                alt723=4;
+            }
+            else if ( LA723_0 == 50 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {
+                alt723=5;
+            }
+            else if ( LA723_0 == 51 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {
+                alt723=6;
+            }
+            else if ( LA723_0 == 52 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {
+                alt723=7;
+            }
+            else if ( LA723_0 == 53 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {
+                alt723=8;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 723, 0, input);
+
+                throw nvae;
+            }
+            switch (alt723) {
+                case 1 :
+                    // InternalFormalML.g:60365:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60365:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) ) )
+                    // InternalFormalML.g:60366:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ModelOfExecution__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0)");
+                    }
+                    // InternalFormalML.g:60366:112: ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) )
+                    // InternalFormalML.g:60367:5: ( ( rule__ModelOfExecution__Group_3_0__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0);
+                    selected = true;
+                    // InternalFormalML.g:60373:5: ( ( rule__ModelOfExecution__Group_3_0__0 ) )
+                    // InternalFormalML.g:60374:6: ( rule__ModelOfExecution__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfExecutionAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:60375:6: ( rule__ModelOfExecution__Group_3_0__0 )
+                    // InternalFormalML.g:60375:7: rule__ModelOfExecution__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfExecutionAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:60380:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60380:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) ) )
+                    // InternalFormalML.g:60381:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ModelOfExecution__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1)");
+                    }
+                    // InternalFormalML.g:60381:112: ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) )
+                    // InternalFormalML.g:60382:5: ( ( rule__ModelOfExecution__Group_3_1__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1);
+                    selected = true;
+                    // InternalFormalML.g:60388:5: ( ( rule__ModelOfExecution__Group_3_1__0 ) )
+                    // InternalFormalML.g:60389:6: ( rule__ModelOfExecution__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfExecutionAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:60390:6: ( rule__ModelOfExecution__Group_3_1__0 )
+                    // InternalFormalML.g:60390:7: rule__ModelOfExecution__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfExecutionAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:60395:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60395:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) ) )
+                    // InternalFormalML.g:60396:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ModelOfExecution__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2)");
+                    }
+                    // InternalFormalML.g:60396:112: ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) )
+                    // InternalFormalML.g:60397:5: ( ( rule__ModelOfExecution__Group_3_2__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2);
+                    selected = true;
+                    // InternalFormalML.g:60403:5: ( ( rule__ModelOfExecution__Group_3_2__0 ) )
+                    // InternalFormalML.g:60404:6: ( rule__ModelOfExecution__Group_3_2__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfExecutionAccess().getGroup_3_2()); 
+                    }
+                    // InternalFormalML.g:60405:6: ( rule__ModelOfExecution__Group_3_2__0 )
+                    // InternalFormalML.g:60405:7: rule__ModelOfExecution__Group_3_2__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__Group_3_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfExecutionAccess().getGroup_3_2()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:60410:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60410:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) ) )
+                    // InternalFormalML.g:60411:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ModelOfExecution__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3)");
+                    }
+                    // InternalFormalML.g:60411:112: ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) )
+                    // InternalFormalML.g:60412:5: ( ( rule__ModelOfExecution__Group_3_3__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3);
+                    selected = true;
+                    // InternalFormalML.g:60418:5: ( ( rule__ModelOfExecution__Group_3_3__0 ) )
+                    // InternalFormalML.g:60419:6: ( rule__ModelOfExecution__Group_3_3__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfExecutionAccess().getGroup_3_3()); 
+                    }
+                    // InternalFormalML.g:60420:6: ( rule__ModelOfExecution__Group_3_3__0 )
+                    // InternalFormalML.g:60420:7: rule__ModelOfExecution__Group_3_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__Group_3_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfExecutionAccess().getGroup_3_3()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:60425:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60425:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) ) )
+                    // InternalFormalML.g:60426:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ModelOfExecution__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4)");
+                    }
+                    // InternalFormalML.g:60426:112: ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) )
+                    // InternalFormalML.g:60427:5: ( ( rule__ModelOfExecution__Group_3_4__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4);
+                    selected = true;
+                    // InternalFormalML.g:60433:5: ( ( rule__ModelOfExecution__Group_3_4__0 ) )
+                    // InternalFormalML.g:60434:6: ( rule__ModelOfExecution__Group_3_4__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfExecutionAccess().getGroup_3_4()); 
+                    }
+                    // InternalFormalML.g:60435:6: ( rule__ModelOfExecution__Group_3_4__0 )
+                    // InternalFormalML.g:60435:7: rule__ModelOfExecution__Group_3_4__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__Group_3_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfExecutionAccess().getGroup_3_4()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:60440:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60440:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) ) )
+                    // InternalFormalML.g:60441:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ModelOfExecution__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5)");
+                    }
+                    // InternalFormalML.g:60441:112: ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) )
+                    // InternalFormalML.g:60442:5: ( ( rule__ModelOfExecution__Group_3_5__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5);
+                    selected = true;
+                    // InternalFormalML.g:60448:5: ( ( rule__ModelOfExecution__Group_3_5__0 ) )
+                    // InternalFormalML.g:60449:6: ( rule__ModelOfExecution__Group_3_5__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfExecutionAccess().getGroup_3_5()); 
+                    }
+                    // InternalFormalML.g:60450:6: ( rule__ModelOfExecution__Group_3_5__0 )
+                    // InternalFormalML.g:60450:7: rule__ModelOfExecution__Group_3_5__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__Group_3_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfExecutionAccess().getGroup_3_5()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:60455:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60455:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) ) )
+                    // InternalFormalML.g:60456:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ModelOfExecution__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6)");
+                    }
+                    // InternalFormalML.g:60456:112: ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) )
+                    // InternalFormalML.g:60457:5: ( ( rule__ModelOfExecution__Group_3_6__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6);
+                    selected = true;
+                    // InternalFormalML.g:60463:5: ( ( rule__ModelOfExecution__Group_3_6__0 ) )
+                    // InternalFormalML.g:60464:6: ( rule__ModelOfExecution__Group_3_6__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfExecutionAccess().getGroup_3_6()); 
+                    }
+                    // InternalFormalML.g:60465:6: ( rule__ModelOfExecution__Group_3_6__0 )
+                    // InternalFormalML.g:60465:7: rule__ModelOfExecution__Group_3_6__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__Group_3_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfExecutionAccess().getGroup_3_6()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:60470:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_7__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60470:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_7__0 ) ) ) )
+                    // InternalFormalML.g:60471:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_7__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__ModelOfExecution__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7)");
+                    }
+                    // InternalFormalML.g:60471:112: ( ( ( rule__ModelOfExecution__Group_3_7__0 ) ) )
+                    // InternalFormalML.g:60472:5: ( ( rule__ModelOfExecution__Group_3_7__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7);
+                    selected = true;
+                    // InternalFormalML.g:60478:5: ( ( rule__ModelOfExecution__Group_3_7__0 ) )
+                    // InternalFormalML.g:60479:6: ( rule__ModelOfExecution__Group_3_7__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModelOfExecutionAccess().getGroup_3_7()); 
+                    }
+                    // InternalFormalML.g:60480:6: ( rule__ModelOfExecution__Group_3_7__0 )
+                    // InternalFormalML.g:60480:7: rule__ModelOfExecution__Group_3_7__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__Group_3_7__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModelOfExecutionAccess().getGroup_3_7()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3__Impl"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3__0"
+    // InternalFormalML.g:60493:1: rule__ModelOfExecution__UnorderedGroup_3__0 : rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__1 )? ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60497:1: ( rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__1 )? )
+            // InternalFormalML.g:60498:2: rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_85);
+            rule__ModelOfExecution__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60499:2: ( rule__ModelOfExecution__UnorderedGroup_3__1 )?
+            int alt724=2;
+            alt724 = dfa724.predict(input);
+            switch (alt724) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ModelOfExecution__UnorderedGroup_3__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__UnorderedGroup_3__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3__0"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3__1"
+    // InternalFormalML.g:60505:1: rule__ModelOfExecution__UnorderedGroup_3__1 : rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__2 )? ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60509:1: ( rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__2 )? )
+            // InternalFormalML.g:60510:2: rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__2 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_85);
+            rule__ModelOfExecution__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60511:2: ( rule__ModelOfExecution__UnorderedGroup_3__2 )?
+            int alt725=2;
+            alt725 = dfa725.predict(input);
+            switch (alt725) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ModelOfExecution__UnorderedGroup_3__2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__UnorderedGroup_3__2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3__1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3__2"
+    // InternalFormalML.g:60517:1: rule__ModelOfExecution__UnorderedGroup_3__2 : rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__3 )? ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60521:1: ( rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__3 )? )
+            // InternalFormalML.g:60522:2: rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__3 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_85);
+            rule__ModelOfExecution__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60523:2: ( rule__ModelOfExecution__UnorderedGroup_3__3 )?
+            int alt726=2;
+            alt726 = dfa726.predict(input);
+            switch (alt726) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ModelOfExecution__UnorderedGroup_3__3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__UnorderedGroup_3__3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3__2"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3__3"
+    // InternalFormalML.g:60529:1: rule__ModelOfExecution__UnorderedGroup_3__3 : rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__4 )? ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60533:1: ( rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__4 )? )
+            // InternalFormalML.g:60534:2: rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__4 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_85);
+            rule__ModelOfExecution__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60535:2: ( rule__ModelOfExecution__UnorderedGroup_3__4 )?
+            int alt727=2;
+            alt727 = dfa727.predict(input);
+            switch (alt727) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ModelOfExecution__UnorderedGroup_3__4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__UnorderedGroup_3__4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3__3"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3__4"
+    // InternalFormalML.g:60541:1: rule__ModelOfExecution__UnorderedGroup_3__4 : rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__5 )? ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60545:1: ( rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__5 )? )
+            // InternalFormalML.g:60546:2: rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__5 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_85);
+            rule__ModelOfExecution__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60547:2: ( rule__ModelOfExecution__UnorderedGroup_3__5 )?
+            int alt728=2;
+            alt728 = dfa728.predict(input);
+            switch (alt728) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ModelOfExecution__UnorderedGroup_3__5
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__UnorderedGroup_3__5();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3__4"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3__5"
+    // InternalFormalML.g:60553:1: rule__ModelOfExecution__UnorderedGroup_3__5 : rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__6 )? ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60557:1: ( rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__6 )? )
+            // InternalFormalML.g:60558:2: rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__6 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_85);
+            rule__ModelOfExecution__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60559:2: ( rule__ModelOfExecution__UnorderedGroup_3__6 )?
+            int alt729=2;
+            alt729 = dfa729.predict(input);
+            switch (alt729) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ModelOfExecution__UnorderedGroup_3__6
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__UnorderedGroup_3__6();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3__5"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3__6"
+    // InternalFormalML.g:60565:1: rule__ModelOfExecution__UnorderedGroup_3__6 : rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__7 )? ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60569:1: ( rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__7 )? )
+            // InternalFormalML.g:60570:2: rule__ModelOfExecution__UnorderedGroup_3__Impl ( rule__ModelOfExecution__UnorderedGroup_3__7 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_85);
+            rule__ModelOfExecution__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60571:2: ( rule__ModelOfExecution__UnorderedGroup_3__7 )?
+            int alt730=2;
+            alt730 = dfa730.predict(input);
+            switch (alt730) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__ModelOfExecution__UnorderedGroup_3__7
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__ModelOfExecution__UnorderedGroup_3__7();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3__6"
+
+
+    // $ANTLR start "rule__ModelOfExecution__UnorderedGroup_3__7"
+    // InternalFormalML.g:60577:1: rule__ModelOfExecution__UnorderedGroup_3__7 : rule__ModelOfExecution__UnorderedGroup_3__Impl ;
+    public final void rule__ModelOfExecution__UnorderedGroup_3__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60581:1: ( rule__ModelOfExecution__UnorderedGroup_3__Impl )
+            // InternalFormalML.g:60582:2: rule__ModelOfExecution__UnorderedGroup_3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ModelOfExecution__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__UnorderedGroup_3__7"
+
+
+    // $ANTLR start "rule__Modifier__UnorderedGroup_1"
+    // InternalFormalML.g:60589:1: rule__Modifier__UnorderedGroup_1 : ( rule__Modifier__UnorderedGroup_1__0 )? ;
+    public final void rule__Modifier__UnorderedGroup_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+        	
+        try {
+            // InternalFormalML.g:60594:1: ( ( rule__Modifier__UnorderedGroup_1__0 )? )
+            // InternalFormalML.g:60595:2: ( rule__Modifier__UnorderedGroup_1__0 )?
+            {
+            // InternalFormalML.g:60595:2: ( rule__Modifier__UnorderedGroup_1__0 )?
+            int alt731=2;
+            switch ( input.LA(1) ) {
+                case 278:
+                    {
+                    int LA731_1 = input.LA(2);
+
+                    if ( synpred1026_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+                        alt731=1;
+                    }
+                    }
+                    break;
+                case 179:
+                    {
+                    int LA731_2 = input.LA(2);
+
+                    if ( synpred1026_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+                        alt731=1;
+                    }
+                    }
+                    break;
+                case 279:
+                    {
+                    int LA731_3 = input.LA(2);
+
+                    if ( synpred1026_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+                        alt731=1;
+                    }
+                    }
+                    break;
+                case 280:
+                    {
+                    int LA731_4 = input.LA(2);
+
+                    if ( synpred1026_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+                        alt731=1;
+                    }
+                    }
+                    break;
+                case 281:
+                    {
+                    int LA731_5 = input.LA(2);
+
+                    if ( synpred1026_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {
+                        alt731=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt731) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Modifier__UnorderedGroup_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__UnorderedGroup_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__UnorderedGroup_1"
+
+
+    // $ANTLR start "rule__Modifier__UnorderedGroup_1__Impl"
+    // InternalFormalML.g:60603:1: rule__Modifier__UnorderedGroup_1__Impl : ( ({...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__TransientAssignment_1_4 ) ) ) ) ) ;
+    public final void rule__Modifier__UnorderedGroup_1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:60608:1: ( ( ({...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__TransientAssignment_1_4 ) ) ) ) ) )
+            // InternalFormalML.g:60609:3: ( ({...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__TransientAssignment_1_4 ) ) ) ) )
+            {
+            // InternalFormalML.g:60609:3: ( ({...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) ) ) | ({...}? => ( ( ( rule__Modifier__TransientAssignment_1_4 ) ) ) ) )
+            int alt732=5;
+            int LA732_0 = input.LA(1);
+
+            if ( LA732_0 == 278 && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+                alt732=1;
+            }
+            else if ( LA732_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+                alt732=2;
+            }
+            else if ( LA732_0 == 279 && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+                alt732=3;
+            }
+            else if ( LA732_0 == 280 && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+                alt732=4;
+            }
+            else if ( LA732_0 == 281 && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {
+                alt732=5;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 732, 0, input);
+
+                throw nvae;
+            }
+            switch (alt732) {
+                case 1 :
+                    // InternalFormalML.g:60610:3: ({...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60610:3: ({...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) ) )
+                    // InternalFormalML.g:60611:4: {...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Modifier__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0)");
+                    }
+                    // InternalFormalML.g:60611:104: ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) )
+                    // InternalFormalML.g:60612:5: ( ( rule__Modifier__StaticAssignment_1_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0);
+                    selected = true;
+                    // InternalFormalML.g:60618:5: ( ( rule__Modifier__StaticAssignment_1_0 ) )
+                    // InternalFormalML.g:60619:6: ( rule__Modifier__StaticAssignment_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModifierAccess().getStaticAssignment_1_0()); 
+                    }
+                    // InternalFormalML.g:60620:6: ( rule__Modifier__StaticAssignment_1_0 )
+                    // InternalFormalML.g:60620:7: rule__Modifier__StaticAssignment_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__StaticAssignment_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModifierAccess().getStaticAssignment_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:60625:3: ({...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:60625:3: ({...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) ) )
+                    // InternalFormalML.g:60626:4: {...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Modifier__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1)");
+                    }
+                    // InternalFormalML.g:60626:104: ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) )
+                    // InternalFormalML.g:60627:5: ( ( rule__Modifier__FinalAssignment_1_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1);
+                    selected = true;
+                    // InternalFormalML.g:60633:5: ( ( rule__Modifier__FinalAssignment_1_1 ) )
+                    // InternalFormalML.g:60634:6: ( rule__Modifier__FinalAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModifierAccess().getFinalAssignment_1_1()); 
+                    }
+                    // InternalFormalML.g:60635:6: ( rule__Modifier__FinalAssignment_1_1 )
+                    // InternalFormalML.g:60635:7: rule__Modifier__FinalAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__FinalAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModifierAccess().getFinalAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:60640:3: ({...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) ) )
+                    {
+                    // InternalFormalML.g:60640:3: ({...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) ) )
+                    // InternalFormalML.g:60641:4: {...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Modifier__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2)");
+                    }
+                    // InternalFormalML.g:60641:104: ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) )
+                    // InternalFormalML.g:60642:5: ( ( rule__Modifier__ReferenceAssignment_1_2 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2);
+                    selected = true;
+                    // InternalFormalML.g:60648:5: ( ( rule__Modifier__ReferenceAssignment_1_2 ) )
+                    // InternalFormalML.g:60649:6: ( rule__Modifier__ReferenceAssignment_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModifierAccess().getReferenceAssignment_1_2()); 
+                    }
+                    // InternalFormalML.g:60650:6: ( rule__Modifier__ReferenceAssignment_1_2 )
+                    // InternalFormalML.g:60650:7: rule__Modifier__ReferenceAssignment_1_2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__ReferenceAssignment_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModifierAccess().getReferenceAssignment_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:60655:3: ({...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) ) )
+                    {
+                    // InternalFormalML.g:60655:3: ({...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) ) )
+                    // InternalFormalML.g:60656:4: {...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Modifier__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3)");
+                    }
+                    // InternalFormalML.g:60656:104: ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) )
+                    // InternalFormalML.g:60657:5: ( ( rule__Modifier__VolatileAssignment_1_3 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3);
+                    selected = true;
+                    // InternalFormalML.g:60663:5: ( ( rule__Modifier__VolatileAssignment_1_3 ) )
+                    // InternalFormalML.g:60664:6: ( rule__Modifier__VolatileAssignment_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModifierAccess().getVolatileAssignment_1_3()); 
+                    }
+                    // InternalFormalML.g:60665:6: ( rule__Modifier__VolatileAssignment_1_3 )
+                    // InternalFormalML.g:60665:7: rule__Modifier__VolatileAssignment_1_3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__VolatileAssignment_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModifierAccess().getVolatileAssignment_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:60670:3: ({...}? => ( ( ( rule__Modifier__TransientAssignment_1_4 ) ) ) )
+                    {
+                    // InternalFormalML.g:60670:3: ({...}? => ( ( ( rule__Modifier__TransientAssignment_1_4 ) ) ) )
+                    // InternalFormalML.g:60671:4: {...}? => ( ( ( rule__Modifier__TransientAssignment_1_4 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Modifier__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4)");
+                    }
+                    // InternalFormalML.g:60671:104: ( ( ( rule__Modifier__TransientAssignment_1_4 ) ) )
+                    // InternalFormalML.g:60672:5: ( ( rule__Modifier__TransientAssignment_1_4 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4);
+                    selected = true;
+                    // InternalFormalML.g:60678:5: ( ( rule__Modifier__TransientAssignment_1_4 ) )
+                    // InternalFormalML.g:60679:6: ( rule__Modifier__TransientAssignment_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getModifierAccess().getTransientAssignment_1_4()); 
+                    }
+                    // InternalFormalML.g:60680:6: ( rule__Modifier__TransientAssignment_1_4 )
+                    // InternalFormalML.g:60680:7: rule__Modifier__TransientAssignment_1_4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__TransientAssignment_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getModifierAccess().getTransientAssignment_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__UnorderedGroup_1__Impl"
+
+
+    // $ANTLR start "rule__Modifier__UnorderedGroup_1__0"
+    // InternalFormalML.g:60693:1: rule__Modifier__UnorderedGroup_1__0 : rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__1 )? ;
+    public final void rule__Modifier__UnorderedGroup_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60697:1: ( rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__1 )? )
+            // InternalFormalML.g:60698:2: rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_284);
+            rule__Modifier__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60699:2: ( rule__Modifier__UnorderedGroup_1__1 )?
+            int alt733=2;
+            switch ( input.LA(1) ) {
+                case 278:
+                    {
+                    int LA733_1 = input.LA(2);
+
+                    if ( synpred1031_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+                        alt733=1;
+                    }
+                    }
+                    break;
+                case 179:
+                    {
+                    int LA733_2 = input.LA(2);
+
+                    if ( synpred1031_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+                        alt733=1;
+                    }
+                    }
+                    break;
+                case 279:
+                    {
+                    int LA733_3 = input.LA(2);
+
+                    if ( synpred1031_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+                        alt733=1;
+                    }
+                    }
+                    break;
+                case 280:
+                    {
+                    int LA733_4 = input.LA(2);
+
+                    if ( synpred1031_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+                        alt733=1;
+                    }
+                    }
+                    break;
+                case 281:
+                    {
+                    int LA733_5 = input.LA(2);
+
+                    if ( synpred1031_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {
+                        alt733=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt733) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Modifier__UnorderedGroup_1__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__UnorderedGroup_1__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__UnorderedGroup_1__0"
+
+
+    // $ANTLR start "rule__Modifier__UnorderedGroup_1__1"
+    // InternalFormalML.g:60705:1: rule__Modifier__UnorderedGroup_1__1 : rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__2 )? ;
+    public final void rule__Modifier__UnorderedGroup_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60709:1: ( rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__2 )? )
+            // InternalFormalML.g:60710:2: rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__2 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_284);
+            rule__Modifier__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60711:2: ( rule__Modifier__UnorderedGroup_1__2 )?
+            int alt734=2;
+            switch ( input.LA(1) ) {
+                case 278:
+                    {
+                    int LA734_1 = input.LA(2);
+
+                    if ( synpred1032_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+                        alt734=1;
+                    }
+                    }
+                    break;
+                case 179:
+                    {
+                    int LA734_2 = input.LA(2);
+
+                    if ( synpred1032_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+                        alt734=1;
+                    }
+                    }
+                    break;
+                case 279:
+                    {
+                    int LA734_3 = input.LA(2);
+
+                    if ( synpred1032_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+                        alt734=1;
+                    }
+                    }
+                    break;
+                case 280:
+                    {
+                    int LA734_4 = input.LA(2);
+
+                    if ( synpred1032_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+                        alt734=1;
+                    }
+                    }
+                    break;
+                case 281:
+                    {
+                    int LA734_5 = input.LA(2);
+
+                    if ( synpred1032_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {
+                        alt734=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt734) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Modifier__UnorderedGroup_1__2
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__UnorderedGroup_1__2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__UnorderedGroup_1__1"
+
+
+    // $ANTLR start "rule__Modifier__UnorderedGroup_1__2"
+    // InternalFormalML.g:60717:1: rule__Modifier__UnorderedGroup_1__2 : rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__3 )? ;
+    public final void rule__Modifier__UnorderedGroup_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60721:1: ( rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__3 )? )
+            // InternalFormalML.g:60722:2: rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__3 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_284);
+            rule__Modifier__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60723:2: ( rule__Modifier__UnorderedGroup_1__3 )?
+            int alt735=2;
+            switch ( input.LA(1) ) {
+                case 278:
+                    {
+                    int LA735_1 = input.LA(2);
+
+                    if ( synpred1033_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+                        alt735=1;
+                    }
+                    }
+                    break;
+                case 179:
+                    {
+                    int LA735_2 = input.LA(2);
+
+                    if ( synpred1033_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+                        alt735=1;
+                    }
+                    }
+                    break;
+                case 279:
+                    {
+                    int LA735_3 = input.LA(2);
+
+                    if ( synpred1033_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+                        alt735=1;
+                    }
+                    }
+                    break;
+                case 280:
+                    {
+                    int LA735_4 = input.LA(2);
+
+                    if ( synpred1033_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+                        alt735=1;
+                    }
+                    }
+                    break;
+                case 281:
+                    {
+                    int LA735_5 = input.LA(2);
+
+                    if ( synpred1033_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {
+                        alt735=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt735) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Modifier__UnorderedGroup_1__3
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__UnorderedGroup_1__3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__UnorderedGroup_1__2"
+
+
+    // $ANTLR start "rule__Modifier__UnorderedGroup_1__3"
+    // InternalFormalML.g:60729:1: rule__Modifier__UnorderedGroup_1__3 : rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__4 )? ;
+    public final void rule__Modifier__UnorderedGroup_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60733:1: ( rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__4 )? )
+            // InternalFormalML.g:60734:2: rule__Modifier__UnorderedGroup_1__Impl ( rule__Modifier__UnorderedGroup_1__4 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_284);
+            rule__Modifier__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60735:2: ( rule__Modifier__UnorderedGroup_1__4 )?
+            int alt736=2;
+            switch ( input.LA(1) ) {
+                case 278:
+                    {
+                    int LA736_1 = input.LA(2);
+
+                    if ( synpred1034_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+                        alt736=1;
+                    }
+                    }
+                    break;
+                case 179:
+                    {
+                    int LA736_2 = input.LA(2);
+
+                    if ( synpred1034_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+                        alt736=1;
+                    }
+                    }
+                    break;
+                case 279:
+                    {
+                    int LA736_3 = input.LA(2);
+
+                    if ( synpred1034_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+                        alt736=1;
+                    }
+                    }
+                    break;
+                case 280:
+                    {
+                    int LA736_4 = input.LA(2);
+
+                    if ( synpred1034_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+                        alt736=1;
+                    }
+                    }
+                    break;
+                case 281:
+                    {
+                    int LA736_5 = input.LA(2);
+
+                    if ( synpred1034_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {
+                        alt736=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt736) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Modifier__UnorderedGroup_1__4
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Modifier__UnorderedGroup_1__4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__UnorderedGroup_1__3"
+
+
+    // $ANTLR start "rule__Modifier__UnorderedGroup_1__4"
+    // InternalFormalML.g:60741:1: rule__Modifier__UnorderedGroup_1__4 : rule__Modifier__UnorderedGroup_1__Impl ;
+    public final void rule__Modifier__UnorderedGroup_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60745:1: ( rule__Modifier__UnorderedGroup_1__Impl )
+            // InternalFormalML.g:60746:2: rule__Modifier__UnorderedGroup_1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Modifier__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__UnorderedGroup_1__4"
+
+
+    // $ANTLR start "rule__Variable__UnorderedGroup_0"
+    // InternalFormalML.g:60753:1: rule__Variable__UnorderedGroup_0 : ( rule__Variable__UnorderedGroup_0__0 )? ;
+    public final void rule__Variable__UnorderedGroup_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+        	
+        try {
+            // InternalFormalML.g:60758:1: ( ( rule__Variable__UnorderedGroup_0__0 )? )
+            // InternalFormalML.g:60759:2: ( rule__Variable__UnorderedGroup_0__0 )?
+            {
+            // InternalFormalML.g:60759:2: ( rule__Variable__UnorderedGroup_0__0 )?
+            int alt737=2;
+            alt737 = dfa737.predict(input);
+            switch (alt737) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Variable__UnorderedGroup_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__UnorderedGroup_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__UnorderedGroup_0"
+
+
+    // $ANTLR start "rule__Variable__UnorderedGroup_0__Impl"
+    // InternalFormalML.g:60767:1: rule__Variable__UnorderedGroup_0__Impl : ( ({...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__Variable__ModifierAssignment_0_1 ) ) ) ) ) ;
+    public final void rule__Variable__UnorderedGroup_0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:60772:1: ( ( ({...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__Variable__ModifierAssignment_0_1 ) ) ) ) ) )
+            // InternalFormalML.g:60773:3: ( ({...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__Variable__ModifierAssignment_0_1 ) ) ) ) )
+            {
+            // InternalFormalML.g:60773:3: ( ({...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__Variable__ModifierAssignment_0_1 ) ) ) ) )
+            int alt738=2;
+            int LA738_0 = input.LA(1);
+
+            if ( LA738_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                int LA738_1 = input.LA(2);
+
+                if ( synpred1036_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {
+                    alt738=1;
+                }
+                else if ( getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                    alt738=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 738, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( LA738_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                int LA738_2 = input.LA(2);
+
+                if ( synpred1036_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {
+                    alt738=1;
+                }
+                else if ( getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                    alt738=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 738, 2, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( LA738_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                int LA738_3 = input.LA(2);
+
+                if ( synpred1036_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {
+                    alt738=1;
+                }
+                else if ( getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                    alt738=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 738, 3, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( LA738_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                int LA738_4 = input.LA(2);
+
+                if ( synpred1036_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {
+                    alt738=1;
+                }
+                else if ( getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                    alt738=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 738, 4, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( ( LA738_0 == EOF || LA738_0 == 16 || LA738_0 == 179 || LA738_0 == 224 || LA738_0 >= 278 && LA738_0 <= 283 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                alt738=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 738, 0, input);
+
+                throw nvae;
+            }
+            switch (alt738) {
+                case 1 :
+                    // InternalFormalML.g:60774:3: ({...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60774:3: ({...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) ) )
+                    // InternalFormalML.g:60775:4: {...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Variable__UnorderedGroup_0__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0)");
+                    }
+                    // InternalFormalML.g:60775:104: ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) )
+                    // InternalFormalML.g:60776:5: ( ( rule__Variable__VisibilityAssignment_0_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0);
+                    selected = true;
+                    // InternalFormalML.g:60782:5: ( ( rule__Variable__VisibilityAssignment_0_0 ) )
+                    // InternalFormalML.g:60783:6: ( rule__Variable__VisibilityAssignment_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getVisibilityAssignment_0_0()); 
+                    }
+                    // InternalFormalML.g:60784:6: ( rule__Variable__VisibilityAssignment_0_0 )
+                    // InternalFormalML.g:60784:7: rule__Variable__VisibilityAssignment_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__VisibilityAssignment_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getVisibilityAssignment_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:60789:3: ({...}? => ( ( ( rule__Variable__ModifierAssignment_0_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:60789:3: ({...}? => ( ( ( rule__Variable__ModifierAssignment_0_1 ) ) ) )
+                    // InternalFormalML.g:60790:4: {...}? => ( ( ( rule__Variable__ModifierAssignment_0_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Variable__UnorderedGroup_0__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1)");
+                    }
+                    // InternalFormalML.g:60790:104: ( ( ( rule__Variable__ModifierAssignment_0_1 ) ) )
+                    // InternalFormalML.g:60791:5: ( ( rule__Variable__ModifierAssignment_0_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1);
+                    selected = true;
+                    // InternalFormalML.g:60797:5: ( ( rule__Variable__ModifierAssignment_0_1 ) )
+                    // InternalFormalML.g:60798:6: ( rule__Variable__ModifierAssignment_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableAccess().getModifierAssignment_0_1()); 
+                    }
+                    // InternalFormalML.g:60799:6: ( rule__Variable__ModifierAssignment_0_1 )
+                    // InternalFormalML.g:60799:7: rule__Variable__ModifierAssignment_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__ModifierAssignment_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableAccess().getModifierAssignment_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__UnorderedGroup_0__Impl"
+
+
+    // $ANTLR start "rule__Variable__UnorderedGroup_0__0"
+    // InternalFormalML.g:60812:1: rule__Variable__UnorderedGroup_0__0 : rule__Variable__UnorderedGroup_0__Impl ( rule__Variable__UnorderedGroup_0__1 )? ;
+    public final void rule__Variable__UnorderedGroup_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60816:1: ( rule__Variable__UnorderedGroup_0__Impl ( rule__Variable__UnorderedGroup_0__1 )? )
+            // InternalFormalML.g:60817:2: rule__Variable__UnorderedGroup_0__Impl ( rule__Variable__UnorderedGroup_0__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_285);
+            rule__Variable__UnorderedGroup_0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60818:2: ( rule__Variable__UnorderedGroup_0__1 )?
+            int alt739=2;
+            alt739 = dfa739.predict(input);
+            switch (alt739) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Variable__UnorderedGroup_0__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Variable__UnorderedGroup_0__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__UnorderedGroup_0__0"
+
+
+    // $ANTLR start "rule__Variable__UnorderedGroup_0__1"
+    // InternalFormalML.g:60824:1: rule__Variable__UnorderedGroup_0__1 : rule__Variable__UnorderedGroup_0__Impl ;
+    public final void rule__Variable__UnorderedGroup_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60828:1: ( rule__Variable__UnorderedGroup_0__Impl )
+            // InternalFormalML.g:60829:2: rule__Variable__UnorderedGroup_0__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Variable__UnorderedGroup_0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__UnorderedGroup_0__1"
+
+
+    // $ANTLR start "rule__VariablePublic__UnorderedGroup_1"
+    // InternalFormalML.g:60836:1: rule__VariablePublic__UnorderedGroup_1 : ( rule__VariablePublic__UnorderedGroup_1__0 )? ;
+    public final void rule__VariablePublic__UnorderedGroup_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+        	
+        try {
+            // InternalFormalML.g:60841:1: ( ( rule__VariablePublic__UnorderedGroup_1__0 )? )
+            // InternalFormalML.g:60842:2: ( rule__VariablePublic__UnorderedGroup_1__0 )?
+            {
+            // InternalFormalML.g:60842:2: ( rule__VariablePublic__UnorderedGroup_1__0 )?
+            int alt740=2;
+            int LA740_0 = input.LA(1);
+
+            if ( LA740_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt740=1;
+            }
+            else if ( LA740_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt740=1;
+            }
+            else if ( LA740_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+                alt740=1;
+            }
+            switch (alt740) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__VariablePublic__UnorderedGroup_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__UnorderedGroup_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__UnorderedGroup_1"
+
+
+    // $ANTLR start "rule__VariablePublic__UnorderedGroup_1__Impl"
+    // InternalFormalML.g:60850:1: rule__VariablePublic__UnorderedGroup_1__Impl : ( ({...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariablePublic__MacroAssignment_1_1 ) ) ) ) ) ;
+    public final void rule__VariablePublic__UnorderedGroup_1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:60855:1: ( ( ({...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariablePublic__MacroAssignment_1_1 ) ) ) ) ) )
+            // InternalFormalML.g:60856:3: ( ({...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariablePublic__MacroAssignment_1_1 ) ) ) ) )
+            {
+            // InternalFormalML.g:60856:3: ( ({...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariablePublic__MacroAssignment_1_1 ) ) ) ) )
+            int alt741=2;
+            int LA741_0 = input.LA(1);
+
+            if ( LA741_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt741=1;
+            }
+            else if ( LA741_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt741=1;
+            }
+            else if ( LA741_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+                alt741=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 741, 0, input);
+
+                throw nvae;
+            }
+            switch (alt741) {
+                case 1 :
+                    // InternalFormalML.g:60857:3: ({...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60857:3: ({...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) ) )
+                    // InternalFormalML.g:60858:4: {...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__VariablePublic__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0)");
+                    }
+                    // InternalFormalML.g:60858:110: ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) )
+                    // InternalFormalML.g:60859:5: ( ( rule__VariablePublic__Alternatives_1_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0);
+                    selected = true;
+                    // InternalFormalML.g:60865:5: ( ( rule__VariablePublic__Alternatives_1_0 ) )
+                    // InternalFormalML.g:60866:6: ( rule__VariablePublic__Alternatives_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePublicAccess().getAlternatives_1_0()); 
+                    }
+                    // InternalFormalML.g:60867:6: ( rule__VariablePublic__Alternatives_1_0 )
+                    // InternalFormalML.g:60867:7: rule__VariablePublic__Alternatives_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__Alternatives_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePublicAccess().getAlternatives_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:60872:3: ({...}? => ( ( ( rule__VariablePublic__MacroAssignment_1_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:60872:3: ({...}? => ( ( ( rule__VariablePublic__MacroAssignment_1_1 ) ) ) )
+                    // InternalFormalML.g:60873:4: {...}? => ( ( ( rule__VariablePublic__MacroAssignment_1_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__VariablePublic__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1)");
+                    }
+                    // InternalFormalML.g:60873:110: ( ( ( rule__VariablePublic__MacroAssignment_1_1 ) ) )
+                    // InternalFormalML.g:60874:5: ( ( rule__VariablePublic__MacroAssignment_1_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1);
+                    selected = true;
+                    // InternalFormalML.g:60880:5: ( ( rule__VariablePublic__MacroAssignment_1_1 ) )
+                    // InternalFormalML.g:60881:6: ( rule__VariablePublic__MacroAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePublicAccess().getMacroAssignment_1_1()); 
+                    }
+                    // InternalFormalML.g:60882:6: ( rule__VariablePublic__MacroAssignment_1_1 )
+                    // InternalFormalML.g:60882:7: rule__VariablePublic__MacroAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__MacroAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePublicAccess().getMacroAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__UnorderedGroup_1__Impl"
+
+
+    // $ANTLR start "rule__VariablePublic__UnorderedGroup_1__0"
+    // InternalFormalML.g:60895:1: rule__VariablePublic__UnorderedGroup_1__0 : rule__VariablePublic__UnorderedGroup_1__Impl ( rule__VariablePublic__UnorderedGroup_1__1 )? ;
+    public final void rule__VariablePublic__UnorderedGroup_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60899:1: ( rule__VariablePublic__UnorderedGroup_1__Impl ( rule__VariablePublic__UnorderedGroup_1__1 )? )
+            // InternalFormalML.g:60900:2: rule__VariablePublic__UnorderedGroup_1__Impl ( rule__VariablePublic__UnorderedGroup_1__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_286);
+            rule__VariablePublic__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60901:2: ( rule__VariablePublic__UnorderedGroup_1__1 )?
+            int alt742=2;
+            int LA742_0 = input.LA(1);
+
+            if ( LA742_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt742=1;
+            }
+            else if ( LA742_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt742=1;
+            }
+            else if ( LA742_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+                alt742=1;
+            }
+            switch (alt742) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__VariablePublic__UnorderedGroup_1__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePublic__UnorderedGroup_1__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__UnorderedGroup_1__0"
+
+
+    // $ANTLR start "rule__VariablePublic__UnorderedGroup_1__1"
+    // InternalFormalML.g:60907:1: rule__VariablePublic__UnorderedGroup_1__1 : rule__VariablePublic__UnorderedGroup_1__Impl ;
+    public final void rule__VariablePublic__UnorderedGroup_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60911:1: ( rule__VariablePublic__UnorderedGroup_1__Impl )
+            // InternalFormalML.g:60912:2: rule__VariablePublic__UnorderedGroup_1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePublic__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__UnorderedGroup_1__1"
+
+
+    // $ANTLR start "rule__VariableProtected__UnorderedGroup_1"
+    // InternalFormalML.g:60919:1: rule__VariableProtected__UnorderedGroup_1 : ( rule__VariableProtected__UnorderedGroup_1__0 )? ;
+    public final void rule__VariableProtected__UnorderedGroup_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+        	
+        try {
+            // InternalFormalML.g:60924:1: ( ( rule__VariableProtected__UnorderedGroup_1__0 )? )
+            // InternalFormalML.g:60925:2: ( rule__VariableProtected__UnorderedGroup_1__0 )?
+            {
+            // InternalFormalML.g:60925:2: ( rule__VariableProtected__UnorderedGroup_1__0 )?
+            int alt743=2;
+            int LA743_0 = input.LA(1);
+
+            if ( LA743_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt743=1;
+            }
+            else if ( LA743_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt743=1;
+            }
+            else if ( LA743_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+                alt743=1;
+            }
+            switch (alt743) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__VariableProtected__UnorderedGroup_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__UnorderedGroup_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__UnorderedGroup_1"
+
+
+    // $ANTLR start "rule__VariableProtected__UnorderedGroup_1__Impl"
+    // InternalFormalML.g:60933:1: rule__VariableProtected__UnorderedGroup_1__Impl : ( ({...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariableProtected__MacroAssignment_1_1 ) ) ) ) ) ;
+    public final void rule__VariableProtected__UnorderedGroup_1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:60938:1: ( ( ({...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariableProtected__MacroAssignment_1_1 ) ) ) ) ) )
+            // InternalFormalML.g:60939:3: ( ({...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariableProtected__MacroAssignment_1_1 ) ) ) ) )
+            {
+            // InternalFormalML.g:60939:3: ( ({...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariableProtected__MacroAssignment_1_1 ) ) ) ) )
+            int alt744=2;
+            int LA744_0 = input.LA(1);
+
+            if ( LA744_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt744=1;
+            }
+            else if ( LA744_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt744=1;
+            }
+            else if ( LA744_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+                alt744=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 744, 0, input);
+
+                throw nvae;
+            }
+            switch (alt744) {
+                case 1 :
+                    // InternalFormalML.g:60940:3: ({...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:60940:3: ({...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) ) )
+                    // InternalFormalML.g:60941:4: {...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__VariableProtected__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0)");
+                    }
+                    // InternalFormalML.g:60941:113: ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) )
+                    // InternalFormalML.g:60942:5: ( ( rule__VariableProtected__Alternatives_1_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0);
+                    selected = true;
+                    // InternalFormalML.g:60948:5: ( ( rule__VariableProtected__Alternatives_1_0 ) )
+                    // InternalFormalML.g:60949:6: ( rule__VariableProtected__Alternatives_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableProtectedAccess().getAlternatives_1_0()); 
+                    }
+                    // InternalFormalML.g:60950:6: ( rule__VariableProtected__Alternatives_1_0 )
+                    // InternalFormalML.g:60950:7: rule__VariableProtected__Alternatives_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__Alternatives_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableProtectedAccess().getAlternatives_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:60955:3: ({...}? => ( ( ( rule__VariableProtected__MacroAssignment_1_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:60955:3: ({...}? => ( ( ( rule__VariableProtected__MacroAssignment_1_1 ) ) ) )
+                    // InternalFormalML.g:60956:4: {...}? => ( ( ( rule__VariableProtected__MacroAssignment_1_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__VariableProtected__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1)");
+                    }
+                    // InternalFormalML.g:60956:113: ( ( ( rule__VariableProtected__MacroAssignment_1_1 ) ) )
+                    // InternalFormalML.g:60957:5: ( ( rule__VariableProtected__MacroAssignment_1_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1);
+                    selected = true;
+                    // InternalFormalML.g:60963:5: ( ( rule__VariableProtected__MacroAssignment_1_1 ) )
+                    // InternalFormalML.g:60964:6: ( rule__VariableProtected__MacroAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariableProtectedAccess().getMacroAssignment_1_1()); 
+                    }
+                    // InternalFormalML.g:60965:6: ( rule__VariableProtected__MacroAssignment_1_1 )
+                    // InternalFormalML.g:60965:7: rule__VariableProtected__MacroAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__MacroAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariableProtectedAccess().getMacroAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__UnorderedGroup_1__Impl"
+
+
+    // $ANTLR start "rule__VariableProtected__UnorderedGroup_1__0"
+    // InternalFormalML.g:60978:1: rule__VariableProtected__UnorderedGroup_1__0 : rule__VariableProtected__UnorderedGroup_1__Impl ( rule__VariableProtected__UnorderedGroup_1__1 )? ;
+    public final void rule__VariableProtected__UnorderedGroup_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60982:1: ( rule__VariableProtected__UnorderedGroup_1__Impl ( rule__VariableProtected__UnorderedGroup_1__1 )? )
+            // InternalFormalML.g:60983:2: rule__VariableProtected__UnorderedGroup_1__Impl ( rule__VariableProtected__UnorderedGroup_1__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_286);
+            rule__VariableProtected__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:60984:2: ( rule__VariableProtected__UnorderedGroup_1__1 )?
+            int alt745=2;
+            int LA745_0 = input.LA(1);
+
+            if ( LA745_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt745=1;
+            }
+            else if ( LA745_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt745=1;
+            }
+            else if ( LA745_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+                alt745=1;
+            }
+            switch (alt745) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__VariableProtected__UnorderedGroup_1__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariableProtected__UnorderedGroup_1__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__UnorderedGroup_1__0"
+
+
+    // $ANTLR start "rule__VariableProtected__UnorderedGroup_1__1"
+    // InternalFormalML.g:60990:1: rule__VariableProtected__UnorderedGroup_1__1 : rule__VariableProtected__UnorderedGroup_1__Impl ;
+    public final void rule__VariableProtected__UnorderedGroup_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:60994:1: ( rule__VariableProtected__UnorderedGroup_1__Impl )
+            // InternalFormalML.g:60995:2: rule__VariableProtected__UnorderedGroup_1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariableProtected__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__UnorderedGroup_1__1"
+
+
+    // $ANTLR start "rule__VariablePrivate__UnorderedGroup_1"
+    // InternalFormalML.g:61002:1: rule__VariablePrivate__UnorderedGroup_1 : ( rule__VariablePrivate__UnorderedGroup_1__0 )? ;
+    public final void rule__VariablePrivate__UnorderedGroup_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+        	
+        try {
+            // InternalFormalML.g:61007:1: ( ( rule__VariablePrivate__UnorderedGroup_1__0 )? )
+            // InternalFormalML.g:61008:2: ( rule__VariablePrivate__UnorderedGroup_1__0 )?
+            {
+            // InternalFormalML.g:61008:2: ( rule__VariablePrivate__UnorderedGroup_1__0 )?
+            int alt746=2;
+            int LA746_0 = input.LA(1);
+
+            if ( LA746_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt746=1;
+            }
+            else if ( LA746_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt746=1;
+            }
+            else if ( LA746_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+                alt746=1;
+            }
+            switch (alt746) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__VariablePrivate__UnorderedGroup_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__UnorderedGroup_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__UnorderedGroup_1"
+
+
+    // $ANTLR start "rule__VariablePrivate__UnorderedGroup_1__Impl"
+    // InternalFormalML.g:61016:1: rule__VariablePrivate__UnorderedGroup_1__Impl : ( ({...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariablePrivate__MacroAssignment_1_1 ) ) ) ) ) ;
+    public final void rule__VariablePrivate__UnorderedGroup_1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:61021:1: ( ( ({...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariablePrivate__MacroAssignment_1_1 ) ) ) ) ) )
+            // InternalFormalML.g:61022:3: ( ({...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariablePrivate__MacroAssignment_1_1 ) ) ) ) )
+            {
+            // InternalFormalML.g:61022:3: ( ({...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) ) ) | ({...}? => ( ( ( rule__VariablePrivate__MacroAssignment_1_1 ) ) ) ) )
+            int alt747=2;
+            int LA747_0 = input.LA(1);
+
+            if ( LA747_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt747=1;
+            }
+            else if ( LA747_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt747=1;
+            }
+            else if ( LA747_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+                alt747=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 747, 0, input);
+
+                throw nvae;
+            }
+            switch (alt747) {
+                case 1 :
+                    // InternalFormalML.g:61023:3: ({...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:61023:3: ({...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) ) )
+                    // InternalFormalML.g:61024:4: {...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__VariablePrivate__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0)");
+                    }
+                    // InternalFormalML.g:61024:111: ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) )
+                    // InternalFormalML.g:61025:5: ( ( rule__VariablePrivate__Alternatives_1_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0);
+                    selected = true;
+                    // InternalFormalML.g:61031:5: ( ( rule__VariablePrivate__Alternatives_1_0 ) )
+                    // InternalFormalML.g:61032:6: ( rule__VariablePrivate__Alternatives_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePrivateAccess().getAlternatives_1_0()); 
+                    }
+                    // InternalFormalML.g:61033:6: ( rule__VariablePrivate__Alternatives_1_0 )
+                    // InternalFormalML.g:61033:7: rule__VariablePrivate__Alternatives_1_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__Alternatives_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePrivateAccess().getAlternatives_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:61038:3: ({...}? => ( ( ( rule__VariablePrivate__MacroAssignment_1_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:61038:3: ({...}? => ( ( ( rule__VariablePrivate__MacroAssignment_1_1 ) ) ) )
+                    // InternalFormalML.g:61039:4: {...}? => ( ( ( rule__VariablePrivate__MacroAssignment_1_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__VariablePrivate__UnorderedGroup_1__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1)");
+                    }
+                    // InternalFormalML.g:61039:111: ( ( ( rule__VariablePrivate__MacroAssignment_1_1 ) ) )
+                    // InternalFormalML.g:61040:5: ( ( rule__VariablePrivate__MacroAssignment_1_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1);
+                    selected = true;
+                    // InternalFormalML.g:61046:5: ( ( rule__VariablePrivate__MacroAssignment_1_1 ) )
+                    // InternalFormalML.g:61047:6: ( rule__VariablePrivate__MacroAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getVariablePrivateAccess().getMacroAssignment_1_1()); 
+                    }
+                    // InternalFormalML.g:61048:6: ( rule__VariablePrivate__MacroAssignment_1_1 )
+                    // InternalFormalML.g:61048:7: rule__VariablePrivate__MacroAssignment_1_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__MacroAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getVariablePrivateAccess().getMacroAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__UnorderedGroup_1__Impl"
+
+
+    // $ANTLR start "rule__VariablePrivate__UnorderedGroup_1__0"
+    // InternalFormalML.g:61061:1: rule__VariablePrivate__UnorderedGroup_1__0 : rule__VariablePrivate__UnorderedGroup_1__Impl ( rule__VariablePrivate__UnorderedGroup_1__1 )? ;
+    public final void rule__VariablePrivate__UnorderedGroup_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61065:1: ( rule__VariablePrivate__UnorderedGroup_1__Impl ( rule__VariablePrivate__UnorderedGroup_1__1 )? )
+            // InternalFormalML.g:61066:2: rule__VariablePrivate__UnorderedGroup_1__Impl ( rule__VariablePrivate__UnorderedGroup_1__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_286);
+            rule__VariablePrivate__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:61067:2: ( rule__VariablePrivate__UnorderedGroup_1__1 )?
+            int alt748=2;
+            int LA748_0 = input.LA(1);
+
+            if ( LA748_0 == 283 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt748=1;
+            }
+            else if ( LA748_0 == 179 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt748=1;
+            }
+            else if ( LA748_0 == 224 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+                alt748=1;
+            }
+            switch (alt748) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__VariablePrivate__UnorderedGroup_1__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__VariablePrivate__UnorderedGroup_1__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__UnorderedGroup_1__0"
+
+
+    // $ANTLR start "rule__VariablePrivate__UnorderedGroup_1__1"
+    // InternalFormalML.g:61073:1: rule__VariablePrivate__UnorderedGroup_1__1 : rule__VariablePrivate__UnorderedGroup_1__Impl ;
+    public final void rule__VariablePrivate__UnorderedGroup_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61077:1: ( rule__VariablePrivate__UnorderedGroup_1__Impl )
+            // InternalFormalML.g:61078:2: rule__VariablePrivate__UnorderedGroup_1__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__VariablePrivate__UnorderedGroup_1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__UnorderedGroup_1__1"
+
+
+    // $ANTLR start "rule__Buffer__UnorderedGroup_0"
+    // InternalFormalML.g:61085:1: rule__Buffer__UnorderedGroup_0 : ( rule__Buffer__UnorderedGroup_0__0 )? ;
+    public final void rule__Buffer__UnorderedGroup_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+        	
+        try {
+            // InternalFormalML.g:61090:1: ( ( rule__Buffer__UnorderedGroup_0__0 )? )
+            // InternalFormalML.g:61091:2: ( rule__Buffer__UnorderedGroup_0__0 )?
+            {
+            // InternalFormalML.g:61091:2: ( rule__Buffer__UnorderedGroup_0__0 )?
+            int alt749=2;
+            alt749 = dfa749.predict(input);
+            switch (alt749) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Buffer__UnorderedGroup_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Buffer__UnorderedGroup_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__UnorderedGroup_0"
+
+
+    // $ANTLR start "rule__Buffer__UnorderedGroup_0__Impl"
+    // InternalFormalML.g:61099:1: rule__Buffer__UnorderedGroup_0__Impl : ( ({...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__Buffer__ModifierAssignment_0_1 ) ) ) ) ) ;
+    public final void rule__Buffer__UnorderedGroup_0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:61104:1: ( ( ({...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__Buffer__ModifierAssignment_0_1 ) ) ) ) ) )
+            // InternalFormalML.g:61105:3: ( ({...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__Buffer__ModifierAssignment_0_1 ) ) ) ) )
+            {
+            // InternalFormalML.g:61105:3: ( ({...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) ) ) | ({...}? => ( ( ( rule__Buffer__ModifierAssignment_0_1 ) ) ) ) )
+            int alt750=2;
+            int LA750_0 = input.LA(1);
+
+            if ( LA750_0 == 143 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                int LA750_1 = input.LA(2);
+
+                if ( synpred1048_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {
+                    alt750=1;
+                }
+                else if ( getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                    alt750=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 750, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( LA750_0 == 144 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                int LA750_2 = input.LA(2);
+
+                if ( synpred1048_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {
+                    alt750=1;
+                }
+                else if ( getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                    alt750=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 750, 2, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( LA750_0 == 145 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                int LA750_3 = input.LA(2);
+
+                if ( synpred1048_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {
+                    alt750=1;
+                }
+                else if ( getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                    alt750=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 750, 3, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( LA750_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                int LA750_4 = input.LA(2);
+
+                if ( synpred1048_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {
+                    alt750=1;
+                }
+                else if ( getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                    alt750=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 750, 4, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( ( LA750_0 == EOF || LA750_0 == 15 || LA750_0 == 179 || LA750_0 >= 278 && LA750_0 <= 281 ) && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                alt750=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 750, 0, input);
+
+                throw nvae;
+            }
+            switch (alt750) {
+                case 1 :
+                    // InternalFormalML.g:61106:3: ({...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) ) )
+                    {
+                    // InternalFormalML.g:61106:3: ({...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) ) )
+                    // InternalFormalML.g:61107:4: {...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Buffer__UnorderedGroup_0__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0)");
+                    }
+                    // InternalFormalML.g:61107:102: ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) )
+                    // InternalFormalML.g:61108:5: ( ( rule__Buffer__VisibilityAssignment_0_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0);
+                    selected = true;
+                    // InternalFormalML.g:61114:5: ( ( rule__Buffer__VisibilityAssignment_0_0 ) )
+                    // InternalFormalML.g:61115:6: ( rule__Buffer__VisibilityAssignment_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBufferAccess().getVisibilityAssignment_0_0()); 
+                    }
+                    // InternalFormalML.g:61116:6: ( rule__Buffer__VisibilityAssignment_0_0 )
+                    // InternalFormalML.g:61116:7: rule__Buffer__VisibilityAssignment_0_0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Buffer__VisibilityAssignment_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBufferAccess().getVisibilityAssignment_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:61121:3: ({...}? => ( ( ( rule__Buffer__ModifierAssignment_0_1 ) ) ) )
+                    {
+                    // InternalFormalML.g:61121:3: ({...}? => ( ( ( rule__Buffer__ModifierAssignment_0_1 ) ) ) )
+                    // InternalFormalML.g:61122:4: {...}? => ( ( ( rule__Buffer__ModifierAssignment_0_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__Buffer__UnorderedGroup_0__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1)");
+                    }
+                    // InternalFormalML.g:61122:102: ( ( ( rule__Buffer__ModifierAssignment_0_1 ) ) )
+                    // InternalFormalML.g:61123:5: ( ( rule__Buffer__ModifierAssignment_0_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1);
+                    selected = true;
+                    // InternalFormalML.g:61129:5: ( ( rule__Buffer__ModifierAssignment_0_1 ) )
+                    // InternalFormalML.g:61130:6: ( rule__Buffer__ModifierAssignment_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getBufferAccess().getModifierAssignment_0_1()); 
+                    }
+                    // InternalFormalML.g:61131:6: ( rule__Buffer__ModifierAssignment_0_1 )
+                    // InternalFormalML.g:61131:7: rule__Buffer__ModifierAssignment_0_1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Buffer__ModifierAssignment_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getBufferAccess().getModifierAssignment_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__UnorderedGroup_0__Impl"
+
+
+    // $ANTLR start "rule__Buffer__UnorderedGroup_0__0"
+    // InternalFormalML.g:61144:1: rule__Buffer__UnorderedGroup_0__0 : rule__Buffer__UnorderedGroup_0__Impl ( rule__Buffer__UnorderedGroup_0__1 )? ;
+    public final void rule__Buffer__UnorderedGroup_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61148:1: ( rule__Buffer__UnorderedGroup_0__Impl ( rule__Buffer__UnorderedGroup_0__1 )? )
+            // InternalFormalML.g:61149:2: rule__Buffer__UnorderedGroup_0__Impl ( rule__Buffer__UnorderedGroup_0__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_285);
+            rule__Buffer__UnorderedGroup_0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:61150:2: ( rule__Buffer__UnorderedGroup_0__1 )?
+            int alt751=2;
+            alt751 = dfa751.predict(input);
+            switch (alt751) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__Buffer__UnorderedGroup_0__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__Buffer__UnorderedGroup_0__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__UnorderedGroup_0__0"
+
+
+    // $ANTLR start "rule__Buffer__UnorderedGroup_0__1"
+    // InternalFormalML.g:61156:1: rule__Buffer__UnorderedGroup_0__1 : rule__Buffer__UnorderedGroup_0__Impl ;
+    public final void rule__Buffer__UnorderedGroup_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61160:1: ( rule__Buffer__UnorderedGroup_0__Impl )
+            // InternalFormalML.g:61161:2: rule__Buffer__UnorderedGroup_0__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__Buffer__UnorderedGroup_0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__UnorderedGroup_0__1"
+
+
+    // $ANTLR start "rule__InputComStatement__UnorderedGroup_3"
+    // InternalFormalML.g:61168:1: rule__InputComStatement__UnorderedGroup_3 : ( rule__InputComStatement__UnorderedGroup_3__0 )? ;
+    public final void rule__InputComStatement__UnorderedGroup_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+        	
+        try {
+            // InternalFormalML.g:61173:1: ( ( rule__InputComStatement__UnorderedGroup_3__0 )? )
+            // InternalFormalML.g:61174:2: ( rule__InputComStatement__UnorderedGroup_3__0 )?
+            {
+            // InternalFormalML.g:61174:2: ( rule__InputComStatement__UnorderedGroup_3__0 )?
+            int alt752=2;
+            int LA752_0 = input.LA(1);
+
+            if ( LA752_0 == 250 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                alt752=1;
+            }
+            else if ( LA752_0 == 96 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt752=1;
+            }
+            else if ( LA752_0 == 97 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt752=1;
+            }
+            switch (alt752) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__InputComStatement__UnorderedGroup_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InputComStatement__UnorderedGroup_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__UnorderedGroup_3"
+
+
+    // $ANTLR start "rule__InputComStatement__UnorderedGroup_3__Impl"
+    // InternalFormalML.g:61182:1: rule__InputComStatement__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__InputComStatement__Group_3_1__0 ) ) ) ) ) ;
+    public final void rule__InputComStatement__UnorderedGroup_3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:61187:1: ( ( ({...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__InputComStatement__Group_3_1__0 ) ) ) ) ) )
+            // InternalFormalML.g:61188:3: ( ({...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__InputComStatement__Group_3_1__0 ) ) ) ) )
+            {
+            // InternalFormalML.g:61188:3: ( ({...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__InputComStatement__Group_3_1__0 ) ) ) ) )
+            int alt753=2;
+            int LA753_0 = input.LA(1);
+
+            if ( LA753_0 == 250 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                alt753=1;
+            }
+            else if ( LA753_0 >= 96 && LA753_0 <= 97 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt753=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 753, 0, input);
+
+                throw nvae;
+            }
+            switch (alt753) {
+                case 1 :
+                    // InternalFormalML.g:61189:3: ({...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:61189:3: ({...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) ) )
+                    // InternalFormalML.g:61190:4: {...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__InputComStatement__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0)");
+                    }
+                    // InternalFormalML.g:61190:113: ( ( ( rule__InputComStatement__Group_3_0__0 ) ) )
+                    // InternalFormalML.g:61191:5: ( ( rule__InputComStatement__Group_3_0__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0);
+                    selected = true;
+                    // InternalFormalML.g:61197:5: ( ( rule__InputComStatement__Group_3_0__0 ) )
+                    // InternalFormalML.g:61198:6: ( rule__InputComStatement__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInputComStatementAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:61199:6: ( rule__InputComStatement__Group_3_0__0 )
+                    // InternalFormalML.g:61199:7: rule__InputComStatement__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InputComStatement__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInputComStatementAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:61204:3: ({...}? => ( ( ( rule__InputComStatement__Group_3_1__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:61204:3: ({...}? => ( ( ( rule__InputComStatement__Group_3_1__0 ) ) ) )
+                    // InternalFormalML.g:61205:4: {...}? => ( ( ( rule__InputComStatement__Group_3_1__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__InputComStatement__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1)");
+                    }
+                    // InternalFormalML.g:61205:113: ( ( ( rule__InputComStatement__Group_3_1__0 ) ) )
+                    // InternalFormalML.g:61206:5: ( ( rule__InputComStatement__Group_3_1__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1);
+                    selected = true;
+                    // InternalFormalML.g:61212:5: ( ( rule__InputComStatement__Group_3_1__0 ) )
+                    // InternalFormalML.g:61213:6: ( rule__InputComStatement__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getInputComStatementAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:61214:6: ( rule__InputComStatement__Group_3_1__0 )
+                    // InternalFormalML.g:61214:7: rule__InputComStatement__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InputComStatement__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getInputComStatementAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__UnorderedGroup_3__Impl"
+
+
+    // $ANTLR start "rule__InputComStatement__UnorderedGroup_3__0"
+    // InternalFormalML.g:61227:1: rule__InputComStatement__UnorderedGroup_3__0 : rule__InputComStatement__UnorderedGroup_3__Impl ( rule__InputComStatement__UnorderedGroup_3__1 )? ;
+    public final void rule__InputComStatement__UnorderedGroup_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61231:1: ( rule__InputComStatement__UnorderedGroup_3__Impl ( rule__InputComStatement__UnorderedGroup_3__1 )? )
+            // InternalFormalML.g:61232:2: rule__InputComStatement__UnorderedGroup_3__Impl ( rule__InputComStatement__UnorderedGroup_3__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_287);
+            rule__InputComStatement__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:61233:2: ( rule__InputComStatement__UnorderedGroup_3__1 )?
+            int alt754=2;
+            int LA754_0 = input.LA(1);
+
+            if ( LA754_0 == 250 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                alt754=1;
+            }
+            else if ( LA754_0 == 96 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt754=1;
+            }
+            else if ( LA754_0 == 97 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt754=1;
+            }
+            switch (alt754) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__InputComStatement__UnorderedGroup_3__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__InputComStatement__UnorderedGroup_3__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__UnorderedGroup_3__0"
+
+
+    // $ANTLR start "rule__InputComStatement__UnorderedGroup_3__1"
+    // InternalFormalML.g:61239:1: rule__InputComStatement__UnorderedGroup_3__1 : rule__InputComStatement__UnorderedGroup_3__Impl ;
+    public final void rule__InputComStatement__UnorderedGroup_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61243:1: ( rule__InputComStatement__UnorderedGroup_3__Impl )
+            // InternalFormalML.g:61244:2: rule__InputComStatement__UnorderedGroup_3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__InputComStatement__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__UnorderedGroup_3__1"
+
+
+    // $ANTLR start "rule__OutputComStatement__UnorderedGroup_3"
+    // InternalFormalML.g:61251:1: rule__OutputComStatement__UnorderedGroup_3 : ( rule__OutputComStatement__UnorderedGroup_3__0 )? ;
+    public final void rule__OutputComStatement__UnorderedGroup_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+        	
+        try {
+            // InternalFormalML.g:61256:1: ( ( rule__OutputComStatement__UnorderedGroup_3__0 )? )
+            // InternalFormalML.g:61257:2: ( rule__OutputComStatement__UnorderedGroup_3__0 )?
+            {
+            // InternalFormalML.g:61257:2: ( rule__OutputComStatement__UnorderedGroup_3__0 )?
+            int alt755=2;
+            int LA755_0 = input.LA(1);
+
+            if ( LA755_0 == 215 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                alt755=1;
+            }
+            else if ( LA755_0 == 98 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt755=1;
+            }
+            else if ( LA755_0 == 97 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt755=1;
+            }
+            switch (alt755) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__OutputComStatement__UnorderedGroup_3__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OutputComStatement__UnorderedGroup_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__UnorderedGroup_3"
+
+
+    // $ANTLR start "rule__OutputComStatement__UnorderedGroup_3__Impl"
+    // InternalFormalML.g:61265:1: rule__OutputComStatement__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__OutputComStatement__Group_3_1__0 ) ) ) ) ) ;
+    public final void rule__OutputComStatement__UnorderedGroup_3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalFormalML.g:61270:1: ( ( ({...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__OutputComStatement__Group_3_1__0 ) ) ) ) ) )
+            // InternalFormalML.g:61271:3: ( ({...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__OutputComStatement__Group_3_1__0 ) ) ) ) )
+            {
+            // InternalFormalML.g:61271:3: ( ({...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__OutputComStatement__Group_3_1__0 ) ) ) ) )
+            int alt756=2;
+            int LA756_0 = input.LA(1);
+
+            if ( LA756_0 == 215 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                alt756=1;
+            }
+            else if ( LA756_0 >= 97 && LA756_0 <= 98 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt756=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 756, 0, input);
+
+                throw nvae;
+            }
+            switch (alt756) {
+                case 1 :
+                    // InternalFormalML.g:61272:3: ({...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:61272:3: ({...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) ) )
+                    // InternalFormalML.g:61273:4: {...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__OutputComStatement__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0)");
+                    }
+                    // InternalFormalML.g:61273:114: ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) )
+                    // InternalFormalML.g:61274:5: ( ( rule__OutputComStatement__Group_3_0__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0);
+                    selected = true;
+                    // InternalFormalML.g:61280:5: ( ( rule__OutputComStatement__Group_3_0__0 ) )
+                    // InternalFormalML.g:61281:6: ( rule__OutputComStatement__Group_3_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOutputComStatementAccess().getGroup_3_0()); 
+                    }
+                    // InternalFormalML.g:61282:6: ( rule__OutputComStatement__Group_3_0__0 )
+                    // InternalFormalML.g:61282:7: rule__OutputComStatement__Group_3_0__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OutputComStatement__Group_3_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOutputComStatementAccess().getGroup_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:61287:3: ({...}? => ( ( ( rule__OutputComStatement__Group_3_1__0 ) ) ) )
+                    {
+                    // InternalFormalML.g:61287:3: ({...}? => ( ( ( rule__OutputComStatement__Group_3_1__0 ) ) ) )
+                    // InternalFormalML.g:61288:4: {...}? => ( ( ( rule__OutputComStatement__Group_3_1__0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__OutputComStatement__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1)");
+                    }
+                    // InternalFormalML.g:61288:114: ( ( ( rule__OutputComStatement__Group_3_1__0 ) ) )
+                    // InternalFormalML.g:61289:5: ( ( rule__OutputComStatement__Group_3_1__0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1);
+                    selected = true;
+                    // InternalFormalML.g:61295:5: ( ( rule__OutputComStatement__Group_3_1__0 ) )
+                    // InternalFormalML.g:61296:6: ( rule__OutputComStatement__Group_3_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getOutputComStatementAccess().getGroup_3_1()); 
+                    }
+                    // InternalFormalML.g:61297:6: ( rule__OutputComStatement__Group_3_1__0 )
+                    // InternalFormalML.g:61297:7: rule__OutputComStatement__Group_3_1__0
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OutputComStatement__Group_3_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getOutputComStatementAccess().getGroup_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__UnorderedGroup_3__Impl"
+
+
+    // $ANTLR start "rule__OutputComStatement__UnorderedGroup_3__0"
+    // InternalFormalML.g:61310:1: rule__OutputComStatement__UnorderedGroup_3__0 : rule__OutputComStatement__UnorderedGroup_3__Impl ( rule__OutputComStatement__UnorderedGroup_3__1 )? ;
+    public final void rule__OutputComStatement__UnorderedGroup_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61314:1: ( rule__OutputComStatement__UnorderedGroup_3__Impl ( rule__OutputComStatement__UnorderedGroup_3__1 )? )
+            // InternalFormalML.g:61315:2: rule__OutputComStatement__UnorderedGroup_3__Impl ( rule__OutputComStatement__UnorderedGroup_3__1 )?
+            {
+            pushFollow(FollowSets000.FOLLOW_288);
+            rule__OutputComStatement__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalFormalML.g:61316:2: ( rule__OutputComStatement__UnorderedGroup_3__1 )?
+            int alt757=2;
+            int LA757_0 = input.LA(1);
+
+            if ( LA757_0 == 215 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                alt757=1;
+            }
+            else if ( LA757_0 == 98 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt757=1;
+            }
+            else if ( LA757_0 == 97 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                alt757=1;
+            }
+            switch (alt757) {
+                case 1 :
+                    // InternalFormalML.g:0:0: rule__OutputComStatement__UnorderedGroup_3__1
+                    {
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    rule__OutputComStatement__UnorderedGroup_3__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__UnorderedGroup_3__0"
+
+
+    // $ANTLR start "rule__OutputComStatement__UnorderedGroup_3__1"
+    // InternalFormalML.g:61322:1: rule__OutputComStatement__UnorderedGroup_3__1 : rule__OutputComStatement__UnorderedGroup_3__Impl ;
+    public final void rule__OutputComStatement__UnorderedGroup_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61326:1: ( rule__OutputComStatement__UnorderedGroup_3__Impl )
+            // InternalFormalML.g:61327:2: rule__OutputComStatement__UnorderedGroup_3__Impl
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__OutputComStatement__UnorderedGroup_3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__UnorderedGroup_3__1"
+
+
+    // $ANTLR start "rule__Xlia__PrologAssignment_0"
+    // InternalFormalML.g:61334:1: rule__Xlia__PrologAssignment_0 : ( ruleXliaPrologObject ) ;
+    public final void rule__Xlia__PrologAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61338:1: ( ( ruleXliaPrologObject ) )
+            // InternalFormalML.g:61339:2: ( ruleXliaPrologObject )
+            {
+            // InternalFormalML.g:61339:2: ( ruleXliaPrologObject )
+            // InternalFormalML.g:61340:3: ruleXliaPrologObject
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAccess().getPrologXliaPrologObjectParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXliaPrologObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAccess().getPrologXliaPrologObjectParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Xlia__PrologAssignment_0"
+
+
+    // $ANTLR start "rule__Xlia__SystemAssignment_1"
+    // InternalFormalML.g:61349:1: rule__Xlia__SystemAssignment_1 : ( ruleSystem ) ;
+    public final void rule__Xlia__SystemAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61353:1: ( ( ruleSystem ) )
+            // InternalFormalML.g:61354:2: ( ruleSystem )
+            {
+            // InternalFormalML.g:61354:2: ( ruleSystem )
+            // InternalFormalML.g:61355:3: ruleSystem
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAccess().getSystemSystemParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSystem();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAccess().getSystemSystemParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Xlia__SystemAssignment_1"
+
+
+    // $ANTLR start "rule__XliaPrologObject__NameAssignment_0"
+    // InternalFormalML.g:61364:1: rule__XliaPrologObject__NameAssignment_0 : ( ( rule__XliaPrologObject__NameAlternatives_0_0 ) ) ;
+    public final void rule__XliaPrologObject__NameAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61368:1: ( ( ( rule__XliaPrologObject__NameAlternatives_0_0 ) ) )
+            // InternalFormalML.g:61369:2: ( ( rule__XliaPrologObject__NameAlternatives_0_0 ) )
+            {
+            // InternalFormalML.g:61369:2: ( ( rule__XliaPrologObject__NameAlternatives_0_0 ) )
+            // InternalFormalML.g:61370:3: ( rule__XliaPrologObject__NameAlternatives_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectAccess().getNameAlternatives_0_0()); 
+            }
+            // InternalFormalML.g:61371:3: ( rule__XliaPrologObject__NameAlternatives_0_0 )
+            // InternalFormalML.g:61371:4: rule__XliaPrologObject__NameAlternatives_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologObject__NameAlternatives_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectAccess().getNameAlternatives_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__NameAssignment_0"
+
+
+    // $ANTLR start "rule__XliaPrologObject__ElementsAssignment_2"
+    // InternalFormalML.g:61379:1: rule__XliaPrologObject__ElementsAssignment_2 : ( ruleXliaPrologAttribute ) ;
+    public final void rule__XliaPrologObject__ElementsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61383:1: ( ( ruleXliaPrologAttribute ) )
+            // InternalFormalML.g:61384:2: ( ruleXliaPrologAttribute )
+            {
+            // InternalFormalML.g:61384:2: ( ruleXliaPrologAttribute )
+            // InternalFormalML.g:61385:3: ruleXliaPrologAttribute
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectAccess().getElementsXliaPrologAttributeParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXliaPrologAttribute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectAccess().getElementsXliaPrologAttributeParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__ElementsAssignment_2"
+
+
+    // $ANTLR start "rule__XliaPrologObject__ElementsAssignment_4"
+    // InternalFormalML.g:61394:1: rule__XliaPrologObject__ElementsAssignment_4 : ( ruleXliaOptionObject ) ;
+    public final void rule__XliaPrologObject__ElementsAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61398:1: ( ( ruleXliaOptionObject ) )
+            // InternalFormalML.g:61399:2: ( ruleXliaOptionObject )
+            {
+            // InternalFormalML.g:61399:2: ( ruleXliaOptionObject )
+            // InternalFormalML.g:61400:3: ruleXliaOptionObject
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologObjectAccess().getElementsXliaOptionObjectParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXliaOptionObject();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologObjectAccess().getElementsXliaOptionObjectParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologObject__ElementsAssignment_4"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__NameAssignment_0"
+    // InternalFormalML.g:61409:1: rule__XliaPrologAttribute__NameAssignment_0 : ( ( rule__XliaPrologAttribute__NameAlternatives_0_0 ) ) ;
+    public final void rule__XliaPrologAttribute__NameAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61413:1: ( ( ( rule__XliaPrologAttribute__NameAlternatives_0_0 ) ) )
+            // InternalFormalML.g:61414:2: ( ( rule__XliaPrologAttribute__NameAlternatives_0_0 ) )
+            {
+            // InternalFormalML.g:61414:2: ( ( rule__XliaPrologAttribute__NameAlternatives_0_0 ) )
+            // InternalFormalML.g:61415:3: ( rule__XliaPrologAttribute__NameAlternatives_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologAttributeAccess().getNameAlternatives_0_0()); 
+            }
+            // InternalFormalML.g:61416:3: ( rule__XliaPrologAttribute__NameAlternatives_0_0 )
+            // InternalFormalML.g:61416:4: rule__XliaPrologAttribute__NameAlternatives_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologAttribute__NameAlternatives_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologAttributeAccess().getNameAlternatives_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__NameAssignment_0"
+
+
+    // $ANTLR start "rule__XliaPrologAttribute__ValueAssignment_1_1"
+    // InternalFormalML.g:61424:1: rule__XliaPrologAttribute__ValueAssignment_1_1 : ( ( rule__XliaPrologAttribute__ValueAlternatives_1_1_0 ) ) ;
+    public final void rule__XliaPrologAttribute__ValueAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61428:1: ( ( ( rule__XliaPrologAttribute__ValueAlternatives_1_1_0 ) ) )
+            // InternalFormalML.g:61429:2: ( ( rule__XliaPrologAttribute__ValueAlternatives_1_1_0 ) )
+            {
+            // InternalFormalML.g:61429:2: ( ( rule__XliaPrologAttribute__ValueAlternatives_1_1_0 ) )
+            // InternalFormalML.g:61430:3: ( rule__XliaPrologAttribute__ValueAlternatives_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaPrologAttributeAccess().getValueAlternatives_1_1_0()); 
+            }
+            // InternalFormalML.g:61431:3: ( rule__XliaPrologAttribute__ValueAlternatives_1_1_0 )
+            // InternalFormalML.g:61431:4: rule__XliaPrologAttribute__ValueAlternatives_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__XliaPrologAttribute__ValueAlternatives_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaPrologAttributeAccess().getValueAlternatives_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaPrologAttribute__ValueAssignment_1_1"
+
+
+    // $ANTLR start "rule__XliaOptionObject__NameAssignment_0"
+    // InternalFormalML.g:61439:1: rule__XliaOptionObject__NameAssignment_0 : ( ( '@option' ) ) ;
+    public final void rule__XliaOptionObject__NameAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61443:1: ( ( ( '@option' ) ) )
+            // InternalFormalML.g:61444:2: ( ( '@option' ) )
+            {
+            // InternalFormalML.g:61444:2: ( ( '@option' ) )
+            // InternalFormalML.g:61445:3: ( '@option' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0()); 
+            }
+            // InternalFormalML.g:61446:3: ( '@option' )
+            // InternalFormalML.g:61447:4: '@option'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0()); 
+            }
+            match(input,272,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__NameAssignment_0"
+
+
+    // $ANTLR start "rule__XliaOptionObject__ElementsAssignment_2"
+    // InternalFormalML.g:61458:1: rule__XliaOptionObject__ElementsAssignment_2 : ( ruleXliaNamedElement ) ;
+    public final void rule__XliaOptionObject__ElementsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61462:1: ( ( ruleXliaNamedElement ) )
+            // InternalFormalML.g:61463:2: ( ruleXliaNamedElement )
+            {
+            // InternalFormalML.g:61463:2: ( ruleXliaNamedElement )
+            // InternalFormalML.g:61464:3: ruleXliaNamedElement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaOptionObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXliaNamedElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaOptionObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaOptionObject__ElementsAssignment_2"
+
+
+    // $ANTLR start "rule__XliaObject__NameAssignment_0"
+    // InternalFormalML.g:61473:1: rule__XliaObject__NameAssignment_0 : ( RULE_XLIA_ID ) ;
+    public final void rule__XliaObject__NameAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61477:1: ( ( RULE_XLIA_ID ) )
+            // InternalFormalML.g:61478:2: ( RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:61478:2: ( RULE_XLIA_ID )
+            // InternalFormalML.g:61479:3: RULE_XLIA_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaObjectAccess().getNameXLIA_IDTerminalRuleCall_0_0()); 
+            }
+            match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaObjectAccess().getNameXLIA_IDTerminalRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__NameAssignment_0"
+
+
+    // $ANTLR start "rule__XliaObject__ElementsAssignment_2"
+    // InternalFormalML.g:61488:1: rule__XliaObject__ElementsAssignment_2 : ( ruleXliaNamedElement ) ;
+    public final void rule__XliaObject__ElementsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61492:1: ( ( ruleXliaNamedElement ) )
+            // InternalFormalML.g:61493:2: ( ruleXliaNamedElement )
+            {
+            // InternalFormalML.g:61493:2: ( ruleXliaNamedElement )
+            // InternalFormalML.g:61494:3: ruleXliaNamedElement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleXliaNamedElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaObject__ElementsAssignment_2"
+
+
+    // $ANTLR start "rule__XliaAttribute__NameAssignment_0"
+    // InternalFormalML.g:61503:1: rule__XliaAttribute__NameAssignment_0 : ( RULE_XLIA_ID ) ;
+    public final void rule__XliaAttribute__NameAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61507:1: ( ( RULE_XLIA_ID ) )
+            // InternalFormalML.g:61508:2: ( RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:61508:2: ( RULE_XLIA_ID )
+            // InternalFormalML.g:61509:3: RULE_XLIA_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAttributeAccess().getNameXLIA_IDTerminalRuleCall_0_0()); 
+            }
+            match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAttributeAccess().getNameXLIA_IDTerminalRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__NameAssignment_0"
+
+
+    // $ANTLR start "rule__XliaAttribute__ValueAssignment_2"
+    // InternalFormalML.g:61518:1: rule__XliaAttribute__ValueAssignment_2 : ( ruleExpression ) ;
+    public final void rule__XliaAttribute__ValueAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61522:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:61523:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:61523:2: ( ruleExpression )
+            // InternalFormalML.g:61524:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXliaAttributeAccess().getValueExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXliaAttributeAccess().getValueExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XliaAttribute__ValueAssignment_2"
+
+
+    // $ANTLR start "rule__UnqualifiedName__NameBindingAssignment"
+    // InternalFormalML.g:61533:1: rule__UnqualifiedName__NameBindingAssignment : ( ruleNameBinding ) ;
+    public final void rule__UnqualifiedName__NameBindingAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61537:1: ( ( ruleNameBinding ) )
+            // InternalFormalML.g:61538:2: ( ruleNameBinding )
+            {
+            // InternalFormalML.g:61538:2: ( ruleNameBinding )
+            // InternalFormalML.g:61539:3: ruleNameBinding
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnqualifiedNameAccess().getNameBindingNameBindingParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleNameBinding();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnqualifiedNameAccess().getNameBindingNameBindingParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnqualifiedName__NameBindingAssignment"
+
+
+    // $ANTLR start "rule__System__VisibilityAssignment_0_0"
+    // InternalFormalML.g:61548:1: rule__System__VisibilityAssignment_0_0 : ( ruleVisibilityKind ) ;
+    public final void rule__System__VisibilityAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61552:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:61553:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:61553:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:61554:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__VisibilityAssignment_0_0"
+
+
+    // $ANTLR start "rule__System__TimedAssignment_0_1_0"
+    // InternalFormalML.g:61563:1: rule__System__TimedAssignment_0_1_0 : ( ( 'timed' ) ) ;
+    public final void rule__System__TimedAssignment_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61567:1: ( ( ( 'timed' ) ) )
+            // InternalFormalML.g:61568:2: ( ( 'timed' ) )
+            {
+            // InternalFormalML.g:61568:2: ( ( 'timed' ) )
+            // InternalFormalML.g:61569:3: ( 'timed' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0()); 
+            }
+            // InternalFormalML.g:61570:3: ( 'timed' )
+            // InternalFormalML.g:61571:4: 'timed'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0()); 
+            }
+            match(input,273,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__TimedAssignment_0_1_0"
+
+
+    // $ANTLR start "rule__System__Input_enabledAssignment_0_1_1"
+    // InternalFormalML.g:61582:1: rule__System__Input_enabledAssignment_0_1_1 : ( ( 'input_enabled' ) ) ;
+    public final void rule__System__Input_enabledAssignment_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61586:1: ( ( ( 'input_enabled' ) ) )
+            // InternalFormalML.g:61587:2: ( ( 'input_enabled' ) )
+            {
+            // InternalFormalML.g:61587:2: ( ( 'input_enabled' ) )
+            // InternalFormalML.g:61588:3: ( 'input_enabled' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); 
+            }
+            // InternalFormalML.g:61589:3: ( 'input_enabled' )
+            // InternalFormalML.g:61590:4: 'input_enabled'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); 
+            }
+            match(input,274,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__Input_enabledAssignment_0_1_1"
+
+
+    // $ANTLR start "rule__System__NameAssignment_3"
+    // InternalFormalML.g:61601:1: rule__System__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__System__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61605:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:61606:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:61606:2: ( ruleESIdentifier )
+            // InternalFormalML.g:61607:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__NameAssignment_3"
+
+
+    // $ANTLR start "rule__System__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:61616:1: rule__System__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__System__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61620:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:61621:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:61621:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:61622:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__System__PortAssignment_6_0"
+    // InternalFormalML.g:61631:1: rule__System__PortAssignment_6_0 : ( rulePort ) ;
+    public final void rule__System__PortAssignment_6_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61635:1: ( ( rulePort ) )
+            // InternalFormalML.g:61636:2: ( rulePort )
+            {
+            // InternalFormalML.g:61636:2: ( rulePort )
+            // InternalFormalML.g:61637:3: rulePort
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPortPortParserRuleCall_6_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePort();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPortPortParserRuleCall_6_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PortAssignment_6_0"
+
+
+    // $ANTLR start "rule__System__SignalAssignment_6_1"
+    // InternalFormalML.g:61646:1: rule__System__SignalAssignment_6_1 : ( ruleSignal ) ;
+    public final void rule__System__SignalAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61650:1: ( ( ruleSignal ) )
+            // InternalFormalML.g:61651:2: ( ruleSignal )
+            {
+            // InternalFormalML.g:61651:2: ( ruleSignal )
+            // InternalFormalML.g:61652:3: ruleSignal
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_6_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__SignalAssignment_6_1"
+
+
+    // $ANTLR start "rule__System__BufferAssignment_6_2"
+    // InternalFormalML.g:61661:1: rule__System__BufferAssignment_6_2 : ( ruleBuffer ) ;
+    public final void rule__System__BufferAssignment_6_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61665:1: ( ( ruleBuffer ) )
+            // InternalFormalML.g:61666:2: ( ruleBuffer )
+            {
+            // InternalFormalML.g:61666:2: ( ruleBuffer )
+            // InternalFormalML.g:61667:3: ruleBuffer
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_6_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_6_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__BufferAssignment_6_2"
+
+
+    // $ANTLR start "rule__System__ChannelAssignment_6_3"
+    // InternalFormalML.g:61676:1: rule__System__ChannelAssignment_6_3 : ( ruleChannel ) ;
+    public final void rule__System__ChannelAssignment_6_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61680:1: ( ( ruleChannel ) )
+            // InternalFormalML.g:61681:2: ( ruleChannel )
+            {
+            // InternalFormalML.g:61681:2: ( ruleChannel )
+            // InternalFormalML.g:61682:3: ruleChannel
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_6_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_6_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__ChannelAssignment_6_3"
+
+
+    // $ANTLR start "rule__System__TypedefAssignment_6_4"
+    // InternalFormalML.g:61691:1: rule__System__TypedefAssignment_6_4 : ( ruleTypeDefinition ) ;
+    public final void rule__System__TypedefAssignment_6_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61695:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:61696:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:61696:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:61697:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__TypedefAssignment_6_4"
+
+
+    // $ANTLR start "rule__System__PropertyAssignment_6_5"
+    // InternalFormalML.g:61706:1: rule__System__PropertyAssignment_6_5 : ( ruleVariable ) ;
+    public final void rule__System__PropertyAssignment_6_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61710:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:61711:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:61711:2: ( ruleVariable )
+            // InternalFormalML.g:61712:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_6_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_6_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PropertyAssignment_6_5"
+
+
+    // $ANTLR start "rule__System__PortAssignment_7_0_1_0"
+    // InternalFormalML.g:61721:1: rule__System__PortAssignment_7_0_1_0 : ( rulePort ) ;
+    public final void rule__System__PortAssignment_7_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61725:1: ( ( rulePort ) )
+            // InternalFormalML.g:61726:2: ( rulePort )
+            {
+            // InternalFormalML.g:61726:2: ( rulePort )
+            // InternalFormalML.g:61727:3: rulePort
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPortPortParserRuleCall_7_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePort();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPortPortParserRuleCall_7_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PortAssignment_7_0_1_0"
+
+
+    // $ANTLR start "rule__System__SignalAssignment_7_0_1_1"
+    // InternalFormalML.g:61736:1: rule__System__SignalAssignment_7_0_1_1 : ( ruleSignal ) ;
+    public final void rule__System__SignalAssignment_7_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61740:1: ( ( ruleSignal ) )
+            // InternalFormalML.g:61741:2: ( ruleSignal )
+            {
+            // InternalFormalML.g:61741:2: ( ruleSignal )
+            // InternalFormalML.g:61742:3: ruleSignal
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_7_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_7_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__SignalAssignment_7_0_1_1"
+
+
+    // $ANTLR start "rule__System__BufferAssignment_7_0_1_2"
+    // InternalFormalML.g:61751:1: rule__System__BufferAssignment_7_0_1_2 : ( ruleBuffer ) ;
+    public final void rule__System__BufferAssignment_7_0_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61755:1: ( ( ruleBuffer ) )
+            // InternalFormalML.g:61756:2: ( ruleBuffer )
+            {
+            // InternalFormalML.g:61756:2: ( ruleBuffer )
+            // InternalFormalML.g:61757:3: ruleBuffer
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_7_0_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_7_0_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__BufferAssignment_7_0_1_2"
+
+
+    // $ANTLR start "rule__System__ChannelAssignment_7_0_1_3"
+    // InternalFormalML.g:61766:1: rule__System__ChannelAssignment_7_0_1_3 : ( ruleChannel ) ;
+    public final void rule__System__ChannelAssignment_7_0_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61770:1: ( ( ruleChannel ) )
+            // InternalFormalML.g:61771:2: ( ruleChannel )
+            {
+            // InternalFormalML.g:61771:2: ( ruleChannel )
+            // InternalFormalML.g:61772:3: ruleChannel
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_7_0_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_7_0_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__ChannelAssignment_7_0_1_3"
+
+
+    // $ANTLR start "rule__System__TypedefAssignment_7_0_1_4"
+    // InternalFormalML.g:61781:1: rule__System__TypedefAssignment_7_0_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__System__TypedefAssignment_7_0_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61785:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:61786:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:61786:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:61787:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__TypedefAssignment_7_0_1_4"
+
+
+    // $ANTLR start "rule__System__PropertyAssignment_7_0_1_5"
+    // InternalFormalML.g:61796:1: rule__System__PropertyAssignment_7_0_1_5 : ( ruleVariable ) ;
+    public final void rule__System__PropertyAssignment_7_0_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61800:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:61801:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:61801:2: ( ruleVariable )
+            // InternalFormalML.g:61802:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_7_0_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_7_0_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PropertyAssignment_7_0_1_5"
+
+
+    // $ANTLR start "rule__System__PortAssignment_7_1_1_0"
+    // InternalFormalML.g:61811:1: rule__System__PortAssignment_7_1_1_0 : ( rulePortPublic ) ;
+    public final void rule__System__PortAssignment_7_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61815:1: ( ( rulePortPublic ) )
+            // InternalFormalML.g:61816:2: ( rulePortPublic )
+            {
+            // InternalFormalML.g:61816:2: ( rulePortPublic )
+            // InternalFormalML.g:61817:3: rulePortPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPortPortPublicParserRuleCall_7_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPortPortPublicParserRuleCall_7_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PortAssignment_7_1_1_0"
+
+
+    // $ANTLR start "rule__System__SignalAssignment_7_1_1_1"
+    // InternalFormalML.g:61826:1: rule__System__SignalAssignment_7_1_1_1 : ( ruleSignalPublic ) ;
+    public final void rule__System__SignalAssignment_7_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61830:1: ( ( ruleSignalPublic ) )
+            // InternalFormalML.g:61831:2: ( ruleSignalPublic )
+            {
+            // InternalFormalML.g:61831:2: ( ruleSignalPublic )
+            // InternalFormalML.g:61832:3: ruleSignalPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__SignalAssignment_7_1_1_1"
+
+
+    // $ANTLR start "rule__System__BufferAssignment_7_1_1_2"
+    // InternalFormalML.g:61841:1: rule__System__BufferAssignment_7_1_1_2 : ( ruleBufferPublic ) ;
+    public final void rule__System__BufferAssignment_7_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61845:1: ( ( ruleBufferPublic ) )
+            // InternalFormalML.g:61846:2: ( ruleBufferPublic )
+            {
+            // InternalFormalML.g:61846:2: ( ruleBufferPublic )
+            // InternalFormalML.g:61847:3: ruleBufferPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__BufferAssignment_7_1_1_2"
+
+
+    // $ANTLR start "rule__System__ChannelAssignment_7_1_1_3"
+    // InternalFormalML.g:61856:1: rule__System__ChannelAssignment_7_1_1_3 : ( ruleChannelPublic ) ;
+    public final void rule__System__ChannelAssignment_7_1_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61860:1: ( ( ruleChannelPublic ) )
+            // InternalFormalML.g:61861:2: ( ruleChannelPublic )
+            {
+            // InternalFormalML.g:61861:2: ( ruleChannelPublic )
+            // InternalFormalML.g:61862:3: ruleChannelPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__ChannelAssignment_7_1_1_3"
+
+
+    // $ANTLR start "rule__System__TypedefAssignment_7_1_1_4"
+    // InternalFormalML.g:61871:1: rule__System__TypedefAssignment_7_1_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__System__TypedefAssignment_7_1_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61875:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:61876:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:61876:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:61877:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__TypedefAssignment_7_1_1_4"
+
+
+    // $ANTLR start "rule__System__PropertyAssignment_7_1_1_5"
+    // InternalFormalML.g:61886:1: rule__System__PropertyAssignment_7_1_1_5 : ( ruleVariablePublic ) ;
+    public final void rule__System__PropertyAssignment_7_1_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61890:1: ( ( ruleVariablePublic ) )
+            // InternalFormalML.g:61891:2: ( ruleVariablePublic )
+            {
+            // InternalFormalML.g:61891:2: ( ruleVariablePublic )
+            // InternalFormalML.g:61892:3: ruleVariablePublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariablePublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PropertyAssignment_7_1_1_5"
+
+
+    // $ANTLR start "rule__System__PortAssignment_7_2_1_0"
+    // InternalFormalML.g:61901:1: rule__System__PortAssignment_7_2_1_0 : ( rulePortProtected ) ;
+    public final void rule__System__PortAssignment_7_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61905:1: ( ( rulePortProtected ) )
+            // InternalFormalML.g:61906:2: ( rulePortProtected )
+            {
+            // InternalFormalML.g:61906:2: ( rulePortProtected )
+            // InternalFormalML.g:61907:3: rulePortProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PortAssignment_7_2_1_0"
+
+
+    // $ANTLR start "rule__System__SignalAssignment_7_2_1_1"
+    // InternalFormalML.g:61916:1: rule__System__SignalAssignment_7_2_1_1 : ( ruleSignalProtected ) ;
+    public final void rule__System__SignalAssignment_7_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61920:1: ( ( ruleSignalProtected ) )
+            // InternalFormalML.g:61921:2: ( ruleSignalProtected )
+            {
+            // InternalFormalML.g:61921:2: ( ruleSignalProtected )
+            // InternalFormalML.g:61922:3: ruleSignalProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__SignalAssignment_7_2_1_1"
+
+
+    // $ANTLR start "rule__System__BufferAssignment_7_2_1_2"
+    // InternalFormalML.g:61931:1: rule__System__BufferAssignment_7_2_1_2 : ( ruleBufferProtected ) ;
+    public final void rule__System__BufferAssignment_7_2_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61935:1: ( ( ruleBufferProtected ) )
+            // InternalFormalML.g:61936:2: ( ruleBufferProtected )
+            {
+            // InternalFormalML.g:61936:2: ( ruleBufferProtected )
+            // InternalFormalML.g:61937:3: ruleBufferProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__BufferAssignment_7_2_1_2"
+
+
+    // $ANTLR start "rule__System__ChannelAssignment_7_2_1_3"
+    // InternalFormalML.g:61946:1: rule__System__ChannelAssignment_7_2_1_3 : ( ruleChannelProtected ) ;
+    public final void rule__System__ChannelAssignment_7_2_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61950:1: ( ( ruleChannelProtected ) )
+            // InternalFormalML.g:61951:2: ( ruleChannelProtected )
+            {
+            // InternalFormalML.g:61951:2: ( ruleChannelProtected )
+            // InternalFormalML.g:61952:3: ruleChannelProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__ChannelAssignment_7_2_1_3"
+
+
+    // $ANTLR start "rule__System__TypedefAssignment_7_2_1_4"
+    // InternalFormalML.g:61961:1: rule__System__TypedefAssignment_7_2_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__System__TypedefAssignment_7_2_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61965:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:61966:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:61966:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:61967:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__TypedefAssignment_7_2_1_4"
+
+
+    // $ANTLR start "rule__System__PropertyAssignment_7_2_1_5"
+    // InternalFormalML.g:61976:1: rule__System__PropertyAssignment_7_2_1_5 : ( ruleVariableProtected ) ;
+    public final void rule__System__PropertyAssignment_7_2_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61980:1: ( ( ruleVariableProtected ) )
+            // InternalFormalML.g:61981:2: ( ruleVariableProtected )
+            {
+            // InternalFormalML.g:61981:2: ( ruleVariableProtected )
+            // InternalFormalML.g:61982:3: ruleVariableProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariableProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PropertyAssignment_7_2_1_5"
+
+
+    // $ANTLR start "rule__System__PortAssignment_7_3_1_0"
+    // InternalFormalML.g:61991:1: rule__System__PortAssignment_7_3_1_0 : ( rulePortPrivate ) ;
+    public final void rule__System__PortAssignment_7_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:61995:1: ( ( rulePortPrivate ) )
+            // InternalFormalML.g:61996:2: ( rulePortPrivate )
+            {
+            // InternalFormalML.g:61996:2: ( rulePortPrivate )
+            // InternalFormalML.g:61997:3: rulePortPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PortAssignment_7_3_1_0"
+
+
+    // $ANTLR start "rule__System__SignalAssignment_7_3_1_1"
+    // InternalFormalML.g:62006:1: rule__System__SignalAssignment_7_3_1_1 : ( ruleSignalPrivate ) ;
+    public final void rule__System__SignalAssignment_7_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62010:1: ( ( ruleSignalPrivate ) )
+            // InternalFormalML.g:62011:2: ( ruleSignalPrivate )
+            {
+            // InternalFormalML.g:62011:2: ( ruleSignalPrivate )
+            // InternalFormalML.g:62012:3: ruleSignalPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__SignalAssignment_7_3_1_1"
+
+
+    // $ANTLR start "rule__System__BufferAssignment_7_3_1_2"
+    // InternalFormalML.g:62021:1: rule__System__BufferAssignment_7_3_1_2 : ( ruleBufferPrivate ) ;
+    public final void rule__System__BufferAssignment_7_3_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62025:1: ( ( ruleBufferPrivate ) )
+            // InternalFormalML.g:62026:2: ( ruleBufferPrivate )
+            {
+            // InternalFormalML.g:62026:2: ( ruleBufferPrivate )
+            // InternalFormalML.g:62027:3: ruleBufferPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__BufferAssignment_7_3_1_2"
+
+
+    // $ANTLR start "rule__System__ChannelAssignment_7_3_1_3"
+    // InternalFormalML.g:62036:1: rule__System__ChannelAssignment_7_3_1_3 : ( ruleChannelPrivate ) ;
+    public final void rule__System__ChannelAssignment_7_3_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62040:1: ( ( ruleChannelPrivate ) )
+            // InternalFormalML.g:62041:2: ( ruleChannelPrivate )
+            {
+            // InternalFormalML.g:62041:2: ( ruleChannelPrivate )
+            // InternalFormalML.g:62042:3: ruleChannelPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__ChannelAssignment_7_3_1_3"
+
+
+    // $ANTLR start "rule__System__TypedefAssignment_7_3_1_4"
+    // InternalFormalML.g:62051:1: rule__System__TypedefAssignment_7_3_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__System__TypedefAssignment_7_3_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62055:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:62056:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:62056:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:62057:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__TypedefAssignment_7_3_1_4"
+
+
+    // $ANTLR start "rule__System__PropertyAssignment_7_3_1_5"
+    // InternalFormalML.g:62066:1: rule__System__PropertyAssignment_7_3_1_5 : ( ruleVariablePrivate ) ;
+    public final void rule__System__PropertyAssignment_7_3_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62070:1: ( ( ruleVariablePrivate ) )
+            // InternalFormalML.g:62071:2: ( ruleVariablePrivate )
+            {
+            // InternalFormalML.g:62071:2: ( ruleVariablePrivate )
+            // InternalFormalML.g:62072:3: ruleVariablePrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariablePrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__PropertyAssignment_7_3_1_5"
+
+
+    // $ANTLR start "rule__System__RoutineAssignment_8_0_0_1"
+    // InternalFormalML.g:62081:1: rule__System__RoutineAssignment_8_0_0_1 : ( ruleRoutine ) ;
+    public final void rule__System__RoutineAssignment_8_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62085:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:62086:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:62086:2: ( ruleRoutine )
+            // InternalFormalML.g:62087:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__RoutineAssignment_8_0_0_1"
+
+
+    // $ANTLR start "rule__System__ProcedureAssignment_8_0_1_1"
+    // InternalFormalML.g:62096:1: rule__System__ProcedureAssignment_8_0_1_1 : ( ruleProcedure ) ;
+    public final void rule__System__ProcedureAssignment_8_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62100:1: ( ( ruleProcedure ) )
+            // InternalFormalML.g:62101:2: ( ruleProcedure )
+            {
+            // InternalFormalML.g:62101:2: ( ruleProcedure )
+            // InternalFormalML.g:62102:3: ruleProcedure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__ProcedureAssignment_8_0_1_1"
+
+
+    // $ANTLR start "rule__System__RoutineAssignment_8_1_0"
+    // InternalFormalML.g:62111:1: rule__System__RoutineAssignment_8_1_0 : ( ruleRoutine ) ;
+    public final void rule__System__RoutineAssignment_8_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62115:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:62116:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:62116:2: ( ruleRoutine )
+            // InternalFormalML.g:62117:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__RoutineAssignment_8_1_0"
+
+
+    // $ANTLR start "rule__System__ProcedureAssignment_8_1_1"
+    // InternalFormalML.g:62126:1: rule__System__ProcedureAssignment_8_1_1 : ( ruleProcedure ) ;
+    public final void rule__System__ProcedureAssignment_8_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62130:1: ( ( ruleProcedure ) )
+            // InternalFormalML.g:62131:2: ( ruleProcedure )
+            {
+            // InternalFormalML.g:62131:2: ( ruleProcedure )
+            // InternalFormalML.g:62132:3: ruleProcedure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__ProcedureAssignment_8_1_1"
+
+
+    // $ANTLR start "rule__System__MachineAssignment_9_0_1_0"
+    // InternalFormalML.g:62141:1: rule__System__MachineAssignment_9_0_1_0 : ( ruleAnyMachineBlock ) ;
+    public final void rule__System__MachineAssignment_9_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62145:1: ( ( ruleAnyMachineBlock ) )
+            // InternalFormalML.g:62146:2: ( ruleAnyMachineBlock )
+            {
+            // InternalFormalML.g:62146:2: ( ruleAnyMachineBlock )
+            // InternalFormalML.g:62147:3: ruleAnyMachineBlock
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAnyMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__MachineAssignment_9_0_1_0"
+
+
+    // $ANTLR start "rule__System__InstanceAssignment_9_0_1_1"
+    // InternalFormalML.g:62156:1: rule__System__InstanceAssignment_9_0_1_1 : ( ruleInstanceMachine ) ;
+    public final void rule__System__InstanceAssignment_9_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62160:1: ( ( ruleInstanceMachine ) )
+            // InternalFormalML.g:62161:2: ( ruleInstanceMachine )
+            {
+            // InternalFormalML.g:62161:2: ( ruleInstanceMachine )
+            // InternalFormalML.g:62162:3: ruleInstanceMachine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleInstanceMachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__InstanceAssignment_9_0_1_1"
+
+
+    // $ANTLR start "rule__System__MachineAssignment_9_1_1"
+    // InternalFormalML.g:62171:1: rule__System__MachineAssignment_9_1_1 : ( ruleAnyMachineBlock ) ;
+    public final void rule__System__MachineAssignment_9_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62175:1: ( ( ruleAnyMachineBlock ) )
+            // InternalFormalML.g:62176:2: ( ruleAnyMachineBlock )
+            {
+            // InternalFormalML.g:62176:2: ( ruleAnyMachineBlock )
+            // InternalFormalML.g:62177:3: ruleAnyMachineBlock
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAnyMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__MachineAssignment_9_1_1"
+
+
+    // $ANTLR start "rule__System__MachineAssignment_9_2_1"
+    // InternalFormalML.g:62186:1: rule__System__MachineAssignment_9_2_1 : ( ruleAnyMachineBlock ) ;
+    public final void rule__System__MachineAssignment_9_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62190:1: ( ( ruleAnyMachineBlock ) )
+            // InternalFormalML.g:62191:2: ( ruleAnyMachineBlock )
+            {
+            // InternalFormalML.g:62191:2: ( ruleAnyMachineBlock )
+            // InternalFormalML.g:62192:3: ruleAnyMachineBlock
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAnyMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__MachineAssignment_9_2_1"
+
+
+    // $ANTLR start "rule__System__InstanceAssignment_9_3_1"
+    // InternalFormalML.g:62201:1: rule__System__InstanceAssignment_9_3_1 : ( ruleInstanceMachine ) ;
+    public final void rule__System__InstanceAssignment_9_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62205:1: ( ( ruleInstanceMachine ) )
+            // InternalFormalML.g:62206:2: ( ruleInstanceMachine )
+            {
+            // InternalFormalML.g:62206:2: ( ruleInstanceMachine )
+            // InternalFormalML.g:62207:3: ruleInstanceMachine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleInstanceMachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__InstanceAssignment_9_3_1"
+
+
+    // $ANTLR start "rule__System__BehaviorAssignment_10_0_1"
+    // InternalFormalML.g:62216:1: rule__System__BehaviorAssignment_10_0_1 : ( ruleBehavior ) ;
+    public final void rule__System__BehaviorAssignment_10_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62220:1: ( ( ruleBehavior ) )
+            // InternalFormalML.g:62221:2: ( ruleBehavior )
+            {
+            // InternalFormalML.g:62221:2: ( ruleBehavior )
+            // InternalFormalML.g:62222:3: ruleBehavior
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBehavior();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__BehaviorAssignment_10_0_1"
+
+
+    // $ANTLR start "rule__System__BehaviorAssignment_10_1_1"
+    // InternalFormalML.g:62231:1: rule__System__BehaviorAssignment_10_1_1 : ( ruleStatemachine ) ;
+    public final void rule__System__BehaviorAssignment_10_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62235:1: ( ( ruleStatemachine ) )
+            // InternalFormalML.g:62236:2: ( ruleStatemachine )
+            {
+            // InternalFormalML.g:62236:2: ( ruleStatemachine )
+            // InternalFormalML.g:62237:3: ruleStatemachine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatemachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__BehaviorAssignment_10_1_1"
+
+
+    // $ANTLR start "rule__System__MainAssignment_11"
+    // InternalFormalML.g:62246:1: rule__System__MainAssignment_11 : ( ruleMoeBehavior ) ;
+    public final void rule__System__MainAssignment_11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62250:1: ( ( ruleMoeBehavior ) )
+            // InternalFormalML.g:62251:2: ( ruleMoeBehavior )
+            {
+            // InternalFormalML.g:62251:2: ( ruleMoeBehavior )
+            // InternalFormalML.g:62252:3: ruleMoeBehavior
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSystemAccess().getMainMoeBehaviorParserRuleCall_11_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMoeBehavior();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSystemAccess().getMainMoeBehaviorParserRuleCall_11_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__System__MainAssignment_11"
+
+
+    // $ANTLR start "rule__InstanceMachine__ModelAssignment_4"
+    // InternalFormalML.g:62261:1: rule__InstanceMachine__ModelAssignment_4 : ( ( ruleESUfid ) ) ;
+    public final void rule__InstanceMachine__ModelAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62265:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:62266:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:62266:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:62267:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getModelMachineCrossReference_4_0()); 
+            }
+            // InternalFormalML.g:62268:3: ( ruleESUfid )
+            // InternalFormalML.g:62269:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getModelMachineESUfidParserRuleCall_4_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getModelMachineESUfidParserRuleCall_4_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getModelMachineCrossReference_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__ModelAssignment_4"
+
+
+    // $ANTLR start "rule__InstanceMachine__NameAssignment_6"
+    // InternalFormalML.g:62280:1: rule__InstanceMachine__NameAssignment_6 : ( ruleESIdentifier ) ;
+    public final void rule__InstanceMachine__NameAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62284:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:62285:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:62285:2: ( ruleESIdentifier )
+            // InternalFormalML.g:62286:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getNameESIdentifierParserRuleCall_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getNameESIdentifierParserRuleCall_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__NameAssignment_6"
+
+
+    // $ANTLR start "rule__InstanceMachine__UnrestrictedNameAssignment_7"
+    // InternalFormalML.g:62295:1: rule__InstanceMachine__UnrestrictedNameAssignment_7 : ( ruleUnrestrictedName ) ;
+    public final void rule__InstanceMachine__UnrestrictedNameAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62299:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:62300:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:62300:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:62301:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__UnrestrictedNameAssignment_7"
+
+
+    // $ANTLR start "rule__InstanceMachine__SlotAssignment_8_0_0_1_0"
+    // InternalFormalML.g:62310:1: rule__InstanceMachine__SlotAssignment_8_0_0_1_0 : ( ruleSlotParameter ) ;
+    public final void rule__InstanceMachine__SlotAssignment_8_0_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62314:1: ( ( ruleSlotParameter ) )
+            // InternalFormalML.g:62315:2: ( ruleSlotParameter )
+            {
+            // InternalFormalML.g:62315:2: ( ruleSlotParameter )
+            // InternalFormalML.g:62316:3: ruleSlotParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSlotParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__SlotAssignment_8_0_0_1_0"
+
+
+    // $ANTLR start "rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1"
+    // InternalFormalML.g:62325:1: rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1 : ( ruleSlotParameter ) ;
+    public final void rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62329:1: ( ( ruleSlotParameter ) )
+            // InternalFormalML.g:62330:2: ( ruleSlotParameter )
+            {
+            // InternalFormalML.g:62330:2: ( ruleSlotParameter )
+            // InternalFormalML.g:62331:3: ruleSlotParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSlotParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__SlotAssignment_8_0_0_1_1_1"
+
+
+    // $ANTLR start "rule__InstanceMachine__SlotAssignment_8_1_1_0"
+    // InternalFormalML.g:62340:1: rule__InstanceMachine__SlotAssignment_8_1_1_0 : ( ruleSlotProperty ) ;
+    public final void rule__InstanceMachine__SlotAssignment_8_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62344:1: ( ( ruleSlotProperty ) )
+            // InternalFormalML.g:62345:2: ( ruleSlotProperty )
+            {
+            // InternalFormalML.g:62345:2: ( ruleSlotProperty )
+            // InternalFormalML.g:62346:3: ruleSlotProperty
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstanceMachineAccess().getSlotSlotPropertyParserRuleCall_8_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSlotProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstanceMachineAccess().getSlotSlotPropertyParserRuleCall_8_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstanceMachine__SlotAssignment_8_1_1_0"
+
+
+    // $ANTLR start "rule__SlotParameter__XliaPropertyAssignment_0"
+    // InternalFormalML.g:62355:1: rule__SlotParameter__XliaPropertyAssignment_0 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__SlotParameter__XliaPropertyAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62359:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:62360:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:62360:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:62361:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0()); 
+            }
+            // InternalFormalML.g:62362:3: ( ruleESIdentifier )
+            // InternalFormalML.g:62363:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotParameter__XliaPropertyAssignment_0"
+
+
+    // $ANTLR start "rule__SlotParameter__ValueAssignment_2"
+    // InternalFormalML.g:62374:1: rule__SlotParameter__ValueAssignment_2 : ( ruleExpression ) ;
+    public final void rule__SlotParameter__ValueAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62378:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:62379:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:62379:2: ( ruleExpression )
+            // InternalFormalML.g:62380:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotParameterAccess().getValueExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotParameterAccess().getValueExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotParameter__ValueAssignment_2"
+
+
+    // $ANTLR start "rule__SlotProperty__XliaPropertyAssignment_0"
+    // InternalFormalML.g:62389:1: rule__SlotProperty__XliaPropertyAssignment_0 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__SlotProperty__XliaPropertyAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62393:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:62394:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:62394:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:62395:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0()); 
+            }
+            // InternalFormalML.g:62396:3: ( ruleESIdentifier )
+            // InternalFormalML.g:62397:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotProperty__XliaPropertyAssignment_0"
+
+
+    // $ANTLR start "rule__SlotProperty__ValueAssignment_2"
+    // InternalFormalML.g:62408:1: rule__SlotProperty__ValueAssignment_2 : ( ruleExpression ) ;
+    public final void rule__SlotProperty__ValueAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62412:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:62413:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:62413:2: ( ruleExpression )
+            // InternalFormalML.g:62414:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSlotPropertyAccess().getValueExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSlotPropertyAccess().getValueExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SlotProperty__ValueAssignment_2"
+
+
+    // $ANTLR start "rule__MachineBlock__VisibilityAssignment_0_0"
+    // InternalFormalML.g:62423:1: rule__MachineBlock__VisibilityAssignment_0_0 : ( ruleVisibilityKind ) ;
+    public final void rule__MachineBlock__VisibilityAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62427:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:62428:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:62428:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:62429:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__VisibilityAssignment_0_0"
+
+
+    // $ANTLR start "rule__MachineBlock__TimedAssignment_0_1_0"
+    // InternalFormalML.g:62438:1: rule__MachineBlock__TimedAssignment_0_1_0 : ( ( 'timed' ) ) ;
+    public final void rule__MachineBlock__TimedAssignment_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62442:1: ( ( ( 'timed' ) ) )
+            // InternalFormalML.g:62443:2: ( ( 'timed' ) )
+            {
+            // InternalFormalML.g:62443:2: ( ( 'timed' ) )
+            // InternalFormalML.g:62444:3: ( 'timed' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0()); 
+            }
+            // InternalFormalML.g:62445:3: ( 'timed' )
+            // InternalFormalML.g:62446:4: 'timed'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0()); 
+            }
+            match(input,273,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__TimedAssignment_0_1_0"
+
+
+    // $ANTLR start "rule__MachineBlock__Input_enabledAssignment_0_1_1"
+    // InternalFormalML.g:62457:1: rule__MachineBlock__Input_enabledAssignment_0_1_1 : ( ( 'input_enabled' ) ) ;
+    public final void rule__MachineBlock__Input_enabledAssignment_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62461:1: ( ( ( 'input_enabled' ) ) )
+            // InternalFormalML.g:62462:2: ( ( 'input_enabled' ) )
+            {
+            // InternalFormalML.g:62462:2: ( ( 'input_enabled' ) )
+            // InternalFormalML.g:62463:3: ( 'input_enabled' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); 
+            }
+            // InternalFormalML.g:62464:3: ( 'input_enabled' )
+            // InternalFormalML.g:62465:4: 'input_enabled'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); 
+            }
+            match(input,274,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__Input_enabledAssignment_0_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__DesignAssignment_0_2"
+    // InternalFormalML.g:62476:1: rule__MachineBlock__DesignAssignment_0_2 : ( ruleDesignKind ) ;
+    public final void rule__MachineBlock__DesignAssignment_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62480:1: ( ( ruleDesignKind ) )
+            // InternalFormalML.g:62481:2: ( ruleDesignKind )
+            {
+            // InternalFormalML.g:62481:2: ( ruleDesignKind )
+            // InternalFormalML.g:62482:3: ruleDesignKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getDesignDesignKindEnumRuleCall_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDesignKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getDesignDesignKindEnumRuleCall_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__DesignAssignment_0_2"
+
+
+    // $ANTLR start "rule__MachineBlock__NameAssignment_3"
+    // InternalFormalML.g:62491:1: rule__MachineBlock__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__MachineBlock__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62495:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:62496:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:62496:2: ( ruleESIdentifier )
+            // InternalFormalML.g:62497:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__NameAssignment_3"
+
+
+    // $ANTLR start "rule__MachineBlock__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:62506:1: rule__MachineBlock__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__MachineBlock__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62510:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:62511:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:62511:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:62512:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__MachineBlock__PortAssignment_6_0"
+    // InternalFormalML.g:62521:1: rule__MachineBlock__PortAssignment_6_0 : ( rulePort ) ;
+    public final void rule__MachineBlock__PortAssignment_6_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62525:1: ( ( rulePort ) )
+            // InternalFormalML.g:62526:2: ( rulePort )
+            {
+            // InternalFormalML.g:62526:2: ( rulePort )
+            // InternalFormalML.g:62527:3: rulePort
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_6_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePort();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_6_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PortAssignment_6_0"
+
+
+    // $ANTLR start "rule__MachineBlock__SignalAssignment_6_1"
+    // InternalFormalML.g:62536:1: rule__MachineBlock__SignalAssignment_6_1 : ( ruleSignal ) ;
+    public final void rule__MachineBlock__SignalAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62540:1: ( ( ruleSignal ) )
+            // InternalFormalML.g:62541:2: ( ruleSignal )
+            {
+            // InternalFormalML.g:62541:2: ( ruleSignal )
+            // InternalFormalML.g:62542:3: ruleSignal
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_6_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__SignalAssignment_6_1"
+
+
+    // $ANTLR start "rule__MachineBlock__BufferAssignment_6_2"
+    // InternalFormalML.g:62551:1: rule__MachineBlock__BufferAssignment_6_2 : ( ruleBuffer ) ;
+    public final void rule__MachineBlock__BufferAssignment_6_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62555:1: ( ( ruleBuffer ) )
+            // InternalFormalML.g:62556:2: ( ruleBuffer )
+            {
+            // InternalFormalML.g:62556:2: ( ruleBuffer )
+            // InternalFormalML.g:62557:3: ruleBuffer
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_6_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_6_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__BufferAssignment_6_2"
+
+
+    // $ANTLR start "rule__MachineBlock__ChannelAssignment_6_3"
+    // InternalFormalML.g:62566:1: rule__MachineBlock__ChannelAssignment_6_3 : ( ruleChannel ) ;
+    public final void rule__MachineBlock__ChannelAssignment_6_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62570:1: ( ( ruleChannel ) )
+            // InternalFormalML.g:62571:2: ( ruleChannel )
+            {
+            // InternalFormalML.g:62571:2: ( ruleChannel )
+            // InternalFormalML.g:62572:3: ruleChannel
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_6_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_6_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__ChannelAssignment_6_3"
+
+
+    // $ANTLR start "rule__MachineBlock__TypedefAssignment_6_4"
+    // InternalFormalML.g:62581:1: rule__MachineBlock__TypedefAssignment_6_4 : ( ruleTypeDefinition ) ;
+    public final void rule__MachineBlock__TypedefAssignment_6_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62585:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:62586:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:62586:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:62587:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__TypedefAssignment_6_4"
+
+
+    // $ANTLR start "rule__MachineBlock__PropertyAssignment_6_5"
+    // InternalFormalML.g:62596:1: rule__MachineBlock__PropertyAssignment_6_5 : ( ruleVariable ) ;
+    public final void rule__MachineBlock__PropertyAssignment_6_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62600:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:62601:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:62601:2: ( ruleVariable )
+            // InternalFormalML.g:62602:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_6_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_6_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PropertyAssignment_6_5"
+
+
+    // $ANTLR start "rule__MachineBlock__PortAssignment_7_0_1_0"
+    // InternalFormalML.g:62611:1: rule__MachineBlock__PortAssignment_7_0_1_0 : ( rulePort ) ;
+    public final void rule__MachineBlock__PortAssignment_7_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62615:1: ( ( rulePort ) )
+            // InternalFormalML.g:62616:2: ( rulePort )
+            {
+            // InternalFormalML.g:62616:2: ( rulePort )
+            // InternalFormalML.g:62617:3: rulePort
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_7_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePort();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_7_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PortAssignment_7_0_1_0"
+
+
+    // $ANTLR start "rule__MachineBlock__SignalAssignment_7_0_1_1"
+    // InternalFormalML.g:62626:1: rule__MachineBlock__SignalAssignment_7_0_1_1 : ( ruleSignal ) ;
+    public final void rule__MachineBlock__SignalAssignment_7_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62630:1: ( ( ruleSignal ) )
+            // InternalFormalML.g:62631:2: ( ruleSignal )
+            {
+            // InternalFormalML.g:62631:2: ( ruleSignal )
+            // InternalFormalML.g:62632:3: ruleSignal
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_7_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_7_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__SignalAssignment_7_0_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__BufferAssignment_7_0_1_2"
+    // InternalFormalML.g:62641:1: rule__MachineBlock__BufferAssignment_7_0_1_2 : ( ruleBuffer ) ;
+    public final void rule__MachineBlock__BufferAssignment_7_0_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62645:1: ( ( ruleBuffer ) )
+            // InternalFormalML.g:62646:2: ( ruleBuffer )
+            {
+            // InternalFormalML.g:62646:2: ( ruleBuffer )
+            // InternalFormalML.g:62647:3: ruleBuffer
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_7_0_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_7_0_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__BufferAssignment_7_0_1_2"
+
+
+    // $ANTLR start "rule__MachineBlock__ChannelAssignment_7_0_1_3"
+    // InternalFormalML.g:62656:1: rule__MachineBlock__ChannelAssignment_7_0_1_3 : ( ruleChannel ) ;
+    public final void rule__MachineBlock__ChannelAssignment_7_0_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62660:1: ( ( ruleChannel ) )
+            // InternalFormalML.g:62661:2: ( ruleChannel )
+            {
+            // InternalFormalML.g:62661:2: ( ruleChannel )
+            // InternalFormalML.g:62662:3: ruleChannel
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_7_0_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_7_0_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__ChannelAssignment_7_0_1_3"
+
+
+    // $ANTLR start "rule__MachineBlock__TypedefAssignment_7_0_1_4"
+    // InternalFormalML.g:62671:1: rule__MachineBlock__TypedefAssignment_7_0_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__MachineBlock__TypedefAssignment_7_0_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62675:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:62676:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:62676:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:62677:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__TypedefAssignment_7_0_1_4"
+
+
+    // $ANTLR start "rule__MachineBlock__PropertyAssignment_7_0_1_5"
+    // InternalFormalML.g:62686:1: rule__MachineBlock__PropertyAssignment_7_0_1_5 : ( ruleVariable ) ;
+    public final void rule__MachineBlock__PropertyAssignment_7_0_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62690:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:62691:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:62691:2: ( ruleVariable )
+            // InternalFormalML.g:62692:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_7_0_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_7_0_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PropertyAssignment_7_0_1_5"
+
+
+    // $ANTLR start "rule__MachineBlock__PortAssignment_7_1_1_0"
+    // InternalFormalML.g:62701:1: rule__MachineBlock__PortAssignment_7_1_1_0 : ( rulePortPublic ) ;
+    public final void rule__MachineBlock__PortAssignment_7_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62705:1: ( ( rulePortPublic ) )
+            // InternalFormalML.g:62706:2: ( rulePortPublic )
+            {
+            // InternalFormalML.g:62706:2: ( rulePortPublic )
+            // InternalFormalML.g:62707:3: rulePortPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPortPortPublicParserRuleCall_7_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPortPortPublicParserRuleCall_7_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PortAssignment_7_1_1_0"
+
+
+    // $ANTLR start "rule__MachineBlock__SignalAssignment_7_1_1_1"
+    // InternalFormalML.g:62716:1: rule__MachineBlock__SignalAssignment_7_1_1_1 : ( ruleSignalPublic ) ;
+    public final void rule__MachineBlock__SignalAssignment_7_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62720:1: ( ( ruleSignalPublic ) )
+            // InternalFormalML.g:62721:2: ( ruleSignalPublic )
+            {
+            // InternalFormalML.g:62721:2: ( ruleSignalPublic )
+            // InternalFormalML.g:62722:3: ruleSignalPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__SignalAssignment_7_1_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__BufferAssignment_7_1_1_2"
+    // InternalFormalML.g:62731:1: rule__MachineBlock__BufferAssignment_7_1_1_2 : ( ruleBufferPublic ) ;
+    public final void rule__MachineBlock__BufferAssignment_7_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62735:1: ( ( ruleBufferPublic ) )
+            // InternalFormalML.g:62736:2: ( ruleBufferPublic )
+            {
+            // InternalFormalML.g:62736:2: ( ruleBufferPublic )
+            // InternalFormalML.g:62737:3: ruleBufferPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__BufferAssignment_7_1_1_2"
+
+
+    // $ANTLR start "rule__MachineBlock__ChannelAssignment_7_1_1_3"
+    // InternalFormalML.g:62746:1: rule__MachineBlock__ChannelAssignment_7_1_1_3 : ( ruleChannelPublic ) ;
+    public final void rule__MachineBlock__ChannelAssignment_7_1_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62750:1: ( ( ruleChannelPublic ) )
+            // InternalFormalML.g:62751:2: ( ruleChannelPublic )
+            {
+            // InternalFormalML.g:62751:2: ( ruleChannelPublic )
+            // InternalFormalML.g:62752:3: ruleChannelPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__ChannelAssignment_7_1_1_3"
+
+
+    // $ANTLR start "rule__MachineBlock__TypedefAssignment_7_1_1_4"
+    // InternalFormalML.g:62761:1: rule__MachineBlock__TypedefAssignment_7_1_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__MachineBlock__TypedefAssignment_7_1_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62765:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:62766:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:62766:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:62767:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__TypedefAssignment_7_1_1_4"
+
+
+    // $ANTLR start "rule__MachineBlock__PropertyAssignment_7_1_1_5"
+    // InternalFormalML.g:62776:1: rule__MachineBlock__PropertyAssignment_7_1_1_5 : ( ruleVariablePublic ) ;
+    public final void rule__MachineBlock__PropertyAssignment_7_1_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62780:1: ( ( ruleVariablePublic ) )
+            // InternalFormalML.g:62781:2: ( ruleVariablePublic )
+            {
+            // InternalFormalML.g:62781:2: ( ruleVariablePublic )
+            // InternalFormalML.g:62782:3: ruleVariablePublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariablePublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PropertyAssignment_7_1_1_5"
+
+
+    // $ANTLR start "rule__MachineBlock__PortAssignment_7_2_1_0"
+    // InternalFormalML.g:62791:1: rule__MachineBlock__PortAssignment_7_2_1_0 : ( rulePortProtected ) ;
+    public final void rule__MachineBlock__PortAssignment_7_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62795:1: ( ( rulePortProtected ) )
+            // InternalFormalML.g:62796:2: ( rulePortProtected )
+            {
+            // InternalFormalML.g:62796:2: ( rulePortProtected )
+            // InternalFormalML.g:62797:3: rulePortProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PortAssignment_7_2_1_0"
+
+
+    // $ANTLR start "rule__MachineBlock__SignalAssignment_7_2_1_1"
+    // InternalFormalML.g:62806:1: rule__MachineBlock__SignalAssignment_7_2_1_1 : ( ruleSignalProtected ) ;
+    public final void rule__MachineBlock__SignalAssignment_7_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62810:1: ( ( ruleSignalProtected ) )
+            // InternalFormalML.g:62811:2: ( ruleSignalProtected )
+            {
+            // InternalFormalML.g:62811:2: ( ruleSignalProtected )
+            // InternalFormalML.g:62812:3: ruleSignalProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__SignalAssignment_7_2_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__BufferAssignment_7_2_1_2"
+    // InternalFormalML.g:62821:1: rule__MachineBlock__BufferAssignment_7_2_1_2 : ( ruleBufferProtected ) ;
+    public final void rule__MachineBlock__BufferAssignment_7_2_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62825:1: ( ( ruleBufferProtected ) )
+            // InternalFormalML.g:62826:2: ( ruleBufferProtected )
+            {
+            // InternalFormalML.g:62826:2: ( ruleBufferProtected )
+            // InternalFormalML.g:62827:3: ruleBufferProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__BufferAssignment_7_2_1_2"
+
+
+    // $ANTLR start "rule__MachineBlock__ChannelAssignment_7_2_1_3"
+    // InternalFormalML.g:62836:1: rule__MachineBlock__ChannelAssignment_7_2_1_3 : ( ruleChannelProtected ) ;
+    public final void rule__MachineBlock__ChannelAssignment_7_2_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62840:1: ( ( ruleChannelProtected ) )
+            // InternalFormalML.g:62841:2: ( ruleChannelProtected )
+            {
+            // InternalFormalML.g:62841:2: ( ruleChannelProtected )
+            // InternalFormalML.g:62842:3: ruleChannelProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__ChannelAssignment_7_2_1_3"
+
+
+    // $ANTLR start "rule__MachineBlock__TypedefAssignment_7_2_1_4"
+    // InternalFormalML.g:62851:1: rule__MachineBlock__TypedefAssignment_7_2_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__MachineBlock__TypedefAssignment_7_2_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62855:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:62856:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:62856:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:62857:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__TypedefAssignment_7_2_1_4"
+
+
+    // $ANTLR start "rule__MachineBlock__PropertyAssignment_7_2_1_5"
+    // InternalFormalML.g:62866:1: rule__MachineBlock__PropertyAssignment_7_2_1_5 : ( ruleVariableProtected ) ;
+    public final void rule__MachineBlock__PropertyAssignment_7_2_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62870:1: ( ( ruleVariableProtected ) )
+            // InternalFormalML.g:62871:2: ( ruleVariableProtected )
+            {
+            // InternalFormalML.g:62871:2: ( ruleVariableProtected )
+            // InternalFormalML.g:62872:3: ruleVariableProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariableProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PropertyAssignment_7_2_1_5"
+
+
+    // $ANTLR start "rule__MachineBlock__PortAssignment_7_3_1_0"
+    // InternalFormalML.g:62881:1: rule__MachineBlock__PortAssignment_7_3_1_0 : ( rulePortPrivate ) ;
+    public final void rule__MachineBlock__PortAssignment_7_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62885:1: ( ( rulePortPrivate ) )
+            // InternalFormalML.g:62886:2: ( rulePortPrivate )
+            {
+            // InternalFormalML.g:62886:2: ( rulePortPrivate )
+            // InternalFormalML.g:62887:3: rulePortPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PortAssignment_7_3_1_0"
+
+
+    // $ANTLR start "rule__MachineBlock__SignalAssignment_7_3_1_1"
+    // InternalFormalML.g:62896:1: rule__MachineBlock__SignalAssignment_7_3_1_1 : ( ruleSignalPrivate ) ;
+    public final void rule__MachineBlock__SignalAssignment_7_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62900:1: ( ( ruleSignalPrivate ) )
+            // InternalFormalML.g:62901:2: ( ruleSignalPrivate )
+            {
+            // InternalFormalML.g:62901:2: ( ruleSignalPrivate )
+            // InternalFormalML.g:62902:3: ruleSignalPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__SignalAssignment_7_3_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__BufferAssignment_7_3_1_2"
+    // InternalFormalML.g:62911:1: rule__MachineBlock__BufferAssignment_7_3_1_2 : ( ruleBufferPrivate ) ;
+    public final void rule__MachineBlock__BufferAssignment_7_3_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62915:1: ( ( ruleBufferPrivate ) )
+            // InternalFormalML.g:62916:2: ( ruleBufferPrivate )
+            {
+            // InternalFormalML.g:62916:2: ( ruleBufferPrivate )
+            // InternalFormalML.g:62917:3: ruleBufferPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__BufferAssignment_7_3_1_2"
+
+
+    // $ANTLR start "rule__MachineBlock__ChannelAssignment_7_3_1_3"
+    // InternalFormalML.g:62926:1: rule__MachineBlock__ChannelAssignment_7_3_1_3 : ( ruleChannelPrivate ) ;
+    public final void rule__MachineBlock__ChannelAssignment_7_3_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62930:1: ( ( ruleChannelPrivate ) )
+            // InternalFormalML.g:62931:2: ( ruleChannelPrivate )
+            {
+            // InternalFormalML.g:62931:2: ( ruleChannelPrivate )
+            // InternalFormalML.g:62932:3: ruleChannelPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__ChannelAssignment_7_3_1_3"
+
+
+    // $ANTLR start "rule__MachineBlock__TypedefAssignment_7_3_1_4"
+    // InternalFormalML.g:62941:1: rule__MachineBlock__TypedefAssignment_7_3_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__MachineBlock__TypedefAssignment_7_3_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62945:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:62946:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:62946:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:62947:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__TypedefAssignment_7_3_1_4"
+
+
+    // $ANTLR start "rule__MachineBlock__PropertyAssignment_7_3_1_5"
+    // InternalFormalML.g:62956:1: rule__MachineBlock__PropertyAssignment_7_3_1_5 : ( ruleVariablePrivate ) ;
+    public final void rule__MachineBlock__PropertyAssignment_7_3_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62960:1: ( ( ruleVariablePrivate ) )
+            // InternalFormalML.g:62961:2: ( ruleVariablePrivate )
+            {
+            // InternalFormalML.g:62961:2: ( ruleVariablePrivate )
+            // InternalFormalML.g:62962:3: ruleVariablePrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariablePrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__PropertyAssignment_7_3_1_5"
+
+
+    // $ANTLR start "rule__MachineBlock__RoutineAssignment_8_0_0_1"
+    // InternalFormalML.g:62971:1: rule__MachineBlock__RoutineAssignment_8_0_0_1 : ( ruleRoutine ) ;
+    public final void rule__MachineBlock__RoutineAssignment_8_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62975:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:62976:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:62976:2: ( ruleRoutine )
+            // InternalFormalML.g:62977:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__RoutineAssignment_8_0_0_1"
+
+
+    // $ANTLR start "rule__MachineBlock__ProcedureAssignment_8_0_1_1"
+    // InternalFormalML.g:62986:1: rule__MachineBlock__ProcedureAssignment_8_0_1_1 : ( ruleProcedure ) ;
+    public final void rule__MachineBlock__ProcedureAssignment_8_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:62990:1: ( ( ruleProcedure ) )
+            // InternalFormalML.g:62991:2: ( ruleProcedure )
+            {
+            // InternalFormalML.g:62991:2: ( ruleProcedure )
+            // InternalFormalML.g:62992:3: ruleProcedure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__ProcedureAssignment_8_0_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__RoutineAssignment_8_1_0"
+    // InternalFormalML.g:63001:1: rule__MachineBlock__RoutineAssignment_8_1_0 : ( ruleRoutine ) ;
+    public final void rule__MachineBlock__RoutineAssignment_8_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63005:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:63006:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:63006:2: ( ruleRoutine )
+            // InternalFormalML.g:63007:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__RoutineAssignment_8_1_0"
+
+
+    // $ANTLR start "rule__MachineBlock__ProcedureAssignment_8_1_1"
+    // InternalFormalML.g:63016:1: rule__MachineBlock__ProcedureAssignment_8_1_1 : ( ruleProcedure ) ;
+    public final void rule__MachineBlock__ProcedureAssignment_8_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63020:1: ( ( ruleProcedure ) )
+            // InternalFormalML.g:63021:2: ( ruleProcedure )
+            {
+            // InternalFormalML.g:63021:2: ( ruleProcedure )
+            // InternalFormalML.g:63022:3: ruleProcedure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__ProcedureAssignment_8_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__MachineAssignment_9_0_1_0"
+    // InternalFormalML.g:63031:1: rule__MachineBlock__MachineAssignment_9_0_1_0 : ( ruleAnyMachineBlock ) ;
+    public final void rule__MachineBlock__MachineAssignment_9_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63035:1: ( ( ruleAnyMachineBlock ) )
+            // InternalFormalML.g:63036:2: ( ruleAnyMachineBlock )
+            {
+            // InternalFormalML.g:63036:2: ( ruleAnyMachineBlock )
+            // InternalFormalML.g:63037:3: ruleAnyMachineBlock
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAnyMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__MachineAssignment_9_0_1_0"
+
+
+    // $ANTLR start "rule__MachineBlock__InstanceAssignment_9_0_1_1"
+    // InternalFormalML.g:63046:1: rule__MachineBlock__InstanceAssignment_9_0_1_1 : ( ruleInstanceMachine ) ;
+    public final void rule__MachineBlock__InstanceAssignment_9_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63050:1: ( ( ruleInstanceMachine ) )
+            // InternalFormalML.g:63051:2: ( ruleInstanceMachine )
+            {
+            // InternalFormalML.g:63051:2: ( ruleInstanceMachine )
+            // InternalFormalML.g:63052:3: ruleInstanceMachine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleInstanceMachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__InstanceAssignment_9_0_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__MachineAssignment_9_1_1"
+    // InternalFormalML.g:63061:1: rule__MachineBlock__MachineAssignment_9_1_1 : ( ruleAnyMachineBlock ) ;
+    public final void rule__MachineBlock__MachineAssignment_9_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63065:1: ( ( ruleAnyMachineBlock ) )
+            // InternalFormalML.g:63066:2: ( ruleAnyMachineBlock )
+            {
+            // InternalFormalML.g:63066:2: ( ruleAnyMachineBlock )
+            // InternalFormalML.g:63067:3: ruleAnyMachineBlock
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAnyMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__MachineAssignment_9_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__MachineAssignment_9_2_1"
+    // InternalFormalML.g:63076:1: rule__MachineBlock__MachineAssignment_9_2_1 : ( ruleAnyMachineBlock ) ;
+    public final void rule__MachineBlock__MachineAssignment_9_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63080:1: ( ( ruleAnyMachineBlock ) )
+            // InternalFormalML.g:63081:2: ( ruleAnyMachineBlock )
+            {
+            // InternalFormalML.g:63081:2: ( ruleAnyMachineBlock )
+            // InternalFormalML.g:63082:3: ruleAnyMachineBlock
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAnyMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__MachineAssignment_9_2_1"
+
+
+    // $ANTLR start "rule__MachineBlock__InstanceAssignment_9_3_1"
+    // InternalFormalML.g:63091:1: rule__MachineBlock__InstanceAssignment_9_3_1 : ( ruleInstanceMachine ) ;
+    public final void rule__MachineBlock__InstanceAssignment_9_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63095:1: ( ( ruleInstanceMachine ) )
+            // InternalFormalML.g:63096:2: ( ruleInstanceMachine )
+            {
+            // InternalFormalML.g:63096:2: ( ruleInstanceMachine )
+            // InternalFormalML.g:63097:3: ruleInstanceMachine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleInstanceMachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__InstanceAssignment_9_3_1"
+
+
+    // $ANTLR start "rule__MachineBlock__BehaviorAssignment_10_0_1"
+    // InternalFormalML.g:63106:1: rule__MachineBlock__BehaviorAssignment_10_0_1 : ( ruleBehavior ) ;
+    public final void rule__MachineBlock__BehaviorAssignment_10_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63110:1: ( ( ruleBehavior ) )
+            // InternalFormalML.g:63111:2: ( ruleBehavior )
+            {
+            // InternalFormalML.g:63111:2: ( ruleBehavior )
+            // InternalFormalML.g:63112:3: ruleBehavior
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBehavior();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__BehaviorAssignment_10_0_1"
+
+
+    // $ANTLR start "rule__MachineBlock__BehaviorAssignment_10_1_1"
+    // InternalFormalML.g:63121:1: rule__MachineBlock__BehaviorAssignment_10_1_1 : ( ruleStatemachine ) ;
+    public final void rule__MachineBlock__BehaviorAssignment_10_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63125:1: ( ( ruleStatemachine ) )
+            // InternalFormalML.g:63126:2: ( ruleStatemachine )
+            {
+            // InternalFormalML.g:63126:2: ( ruleStatemachine )
+            // InternalFormalML.g:63127:3: ruleStatemachine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatemachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__BehaviorAssignment_10_1_1"
+
+
+    // $ANTLR start "rule__MachineBlock__MainAssignment_11"
+    // InternalFormalML.g:63136:1: rule__MachineBlock__MainAssignment_11 : ( ruleMoeBehavior ) ;
+    public final void rule__MachineBlock__MainAssignment_11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63140:1: ( ( ruleMoeBehavior ) )
+            // InternalFormalML.g:63141:2: ( ruleMoeBehavior )
+            {
+            // InternalFormalML.g:63141:2: ( ruleMoeBehavior )
+            // InternalFormalML.g:63142:3: ruleMoeBehavior
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMachineBlockAccess().getMainMoeBehaviorParserRuleCall_11_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMoeBehavior();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMachineBlockAccess().getMainMoeBehaviorParserRuleCall_11_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MachineBlock__MainAssignment_11"
+
+
+    // $ANTLR start "rule__Procedure__VisibilityAssignment_0"
+    // InternalFormalML.g:63151:1: rule__Procedure__VisibilityAssignment_0 : ( ruleVisibilityKind ) ;
+    public final void rule__Procedure__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63155:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:63156:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:63156:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:63157:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__Procedure__NameAssignment_3"
+    // InternalFormalML.g:63166:1: rule__Procedure__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__Procedure__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63170:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:63171:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:63171:2: ( ruleESIdentifier )
+            // InternalFormalML.g:63172:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__NameAssignment_3"
+
+
+    // $ANTLR start "rule__Procedure__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:63181:1: rule__Procedure__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__Procedure__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63185:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:63186:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:63186:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:63187:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_5_0_1_0"
+    // InternalFormalML.g:63196:1: rule__Procedure__ParameterAssignment_5_0_1_0 : ( ruleFunctionalParameter ) ;
+    public final void rule__Procedure__ParameterAssignment_5_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63200:1: ( ( ruleFunctionalParameter ) )
+            // InternalFormalML.g:63201:2: ( ruleFunctionalParameter )
+            {
+            // InternalFormalML.g:63201:2: ( ruleFunctionalParameter )
+            // InternalFormalML.g:63202:3: ruleFunctionalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFunctionalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_5_0_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_5_0_1_1_1"
+    // InternalFormalML.g:63211:1: rule__Procedure__ParameterAssignment_5_0_1_1_1 : ( ruleFunctionalParameter ) ;
+    public final void rule__Procedure__ParameterAssignment_5_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63215:1: ( ( ruleFunctionalParameter ) )
+            // InternalFormalML.g:63216:2: ( ruleFunctionalParameter )
+            {
+            // InternalFormalML.g:63216:2: ( ruleFunctionalParameter )
+            // InternalFormalML.g:63217:3: ruleFunctionalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFunctionalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_5_0_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_5_1_1_0"
+    // InternalFormalML.g:63226:1: rule__Procedure__ParameterAssignment_5_1_1_0 : ( ruleFormalParameter ) ;
+    public final void rule__Procedure__ParameterAssignment_5_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63230:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:63231:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:63231:2: ( ruleFormalParameter )
+            // InternalFormalML.g:63232:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_5_1_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_5_1_1_1_1"
+    // InternalFormalML.g:63241:1: rule__Procedure__ParameterAssignment_5_1_1_1_1 : ( ruleFormalParameter ) ;
+    public final void rule__Procedure__ParameterAssignment_5_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63245:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:63246:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:63246:2: ( ruleFormalParameter )
+            // InternalFormalML.g:63247:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_5_1_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_5_1_1_1_2_1"
+    // InternalFormalML.g:63256:1: rule__Procedure__ParameterAssignment_5_1_1_1_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__Procedure__ParameterAssignment_5_1_1_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63260:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:63261:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:63261:2: ( ruleFormalParameter )
+            // InternalFormalML.g:63262:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_5_1_1_1_2_1"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_7_0_1_0_1_0"
+    // InternalFormalML.g:63271:1: rule__Procedure__ParameterAssignment_7_0_1_0_1_0 : ( ruleParameterInput ) ;
+    public final void rule__Procedure__ParameterAssignment_7_0_1_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63275:1: ( ( ruleParameterInput ) )
+            // InternalFormalML.g:63276:2: ( ruleParameterInput )
+            {
+            // InternalFormalML.g:63276:2: ( ruleParameterInput )
+            // InternalFormalML.g:63277:3: ruleParameterInput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_7_0_1_0_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1"
+    // InternalFormalML.g:63286:1: rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1 : ( ruleParameterInput ) ;
+    public final void rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63290:1: ( ( ruleParameterInput ) )
+            // InternalFormalML.g:63291:2: ( ruleParameterInput )
+            {
+            // InternalFormalML.g:63291:2: ( ruleParameterInput )
+            // InternalFormalML.g:63292:3: ruleParameterInput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_7_0_1_0_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_7_0_1_1_1_0"
+    // InternalFormalML.g:63301:1: rule__Procedure__ParameterAssignment_7_0_1_1_1_0 : ( ruleParameterInout ) ;
+    public final void rule__Procedure__ParameterAssignment_7_0_1_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63305:1: ( ( ruleParameterInout ) )
+            // InternalFormalML.g:63306:2: ( ruleParameterInout )
+            {
+            // InternalFormalML.g:63306:2: ( ruleParameterInout )
+            // InternalFormalML.g:63307:3: ruleParameterInout
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_7_0_1_1_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1"
+    // InternalFormalML.g:63316:1: rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1 : ( ruleParameterInout ) ;
+    public final void rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63320:1: ( ( ruleParameterInout ) )
+            // InternalFormalML.g:63321:2: ( ruleParameterInout )
+            {
+            // InternalFormalML.g:63321:2: ( ruleParameterInout )
+            // InternalFormalML.g:63322:3: ruleParameterInout
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_7_0_1_1_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_7_0_1_2_1_0"
+    // InternalFormalML.g:63331:1: rule__Procedure__ParameterAssignment_7_0_1_2_1_0 : ( ruleParameterOutput ) ;
+    public final void rule__Procedure__ParameterAssignment_7_0_1_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63335:1: ( ( ruleParameterOutput ) )
+            // InternalFormalML.g:63336:2: ( ruleParameterOutput )
+            {
+            // InternalFormalML.g:63336:2: ( ruleParameterOutput )
+            // InternalFormalML.g:63337:3: ruleParameterOutput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_7_0_1_2_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1"
+    // InternalFormalML.g:63346:1: rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1 : ( ruleParameterOutput ) ;
+    public final void rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63350:1: ( ( ruleParameterOutput ) )
+            // InternalFormalML.g:63351:2: ( ruleParameterOutput )
+            {
+            // InternalFormalML.g:63351:2: ( ruleParameterOutput )
+            // InternalFormalML.g:63352:3: ruleParameterOutput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_7_0_1_2_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_7_0_1_3_1_0"
+    // InternalFormalML.g:63361:1: rule__Procedure__ParameterAssignment_7_0_1_3_1_0 : ( ruleParameterReturn ) ;
+    public final void rule__Procedure__ParameterAssignment_7_0_1_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63365:1: ( ( ruleParameterReturn ) )
+            // InternalFormalML.g:63366:2: ( ruleParameterReturn )
+            {
+            // InternalFormalML.g:63366:2: ( ruleParameterReturn )
+            // InternalFormalML.g:63367:3: ruleParameterReturn
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_7_0_1_3_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1"
+    // InternalFormalML.g:63376:1: rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1 : ( ruleParameterReturn ) ;
+    public final void rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63380:1: ( ( ruleParameterReturn ) )
+            // InternalFormalML.g:63381:2: ( ruleParameterReturn )
+            {
+            // InternalFormalML.g:63381:2: ( ruleParameterReturn )
+            // InternalFormalML.g:63382:3: ruleParameterReturn
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_7_0_1_3_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__PortAssignment_7_1_0"
+    // InternalFormalML.g:63391:1: rule__Procedure__PortAssignment_7_1_0 : ( rulePort ) ;
+    public final void rule__Procedure__PortAssignment_7_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63395:1: ( ( rulePort ) )
+            // InternalFormalML.g:63396:2: ( rulePort )
+            {
+            // InternalFormalML.g:63396:2: ( rulePort )
+            // InternalFormalML.g:63397:3: rulePort
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_7_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePort();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_7_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PortAssignment_7_1_0"
+
+
+    // $ANTLR start "rule__Procedure__SignalAssignment_7_1_1"
+    // InternalFormalML.g:63406:1: rule__Procedure__SignalAssignment_7_1_1 : ( ruleSignal ) ;
+    public final void rule__Procedure__SignalAssignment_7_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63410:1: ( ( ruleSignal ) )
+            // InternalFormalML.g:63411:2: ( ruleSignal )
+            {
+            // InternalFormalML.g:63411:2: ( ruleSignal )
+            // InternalFormalML.g:63412:3: ruleSignal
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_7_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_7_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__SignalAssignment_7_1_1"
+
+
+    // $ANTLR start "rule__Procedure__BufferAssignment_7_1_2"
+    // InternalFormalML.g:63421:1: rule__Procedure__BufferAssignment_7_1_2 : ( ruleBuffer ) ;
+    public final void rule__Procedure__BufferAssignment_7_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63425:1: ( ( ruleBuffer ) )
+            // InternalFormalML.g:63426:2: ( ruleBuffer )
+            {
+            // InternalFormalML.g:63426:2: ( ruleBuffer )
+            // InternalFormalML.g:63427:3: ruleBuffer
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_7_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_7_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__BufferAssignment_7_1_2"
+
+
+    // $ANTLR start "rule__Procedure__ChannelAssignment_7_1_3"
+    // InternalFormalML.g:63436:1: rule__Procedure__ChannelAssignment_7_1_3 : ( ruleChannel ) ;
+    public final void rule__Procedure__ChannelAssignment_7_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63440:1: ( ( ruleChannel ) )
+            // InternalFormalML.g:63441:2: ( ruleChannel )
+            {
+            // InternalFormalML.g:63441:2: ( ruleChannel )
+            // InternalFormalML.g:63442:3: ruleChannel
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_7_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_7_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ChannelAssignment_7_1_3"
+
+
+    // $ANTLR start "rule__Procedure__TypedefAssignment_7_1_4"
+    // InternalFormalML.g:63451:1: rule__Procedure__TypedefAssignment_7_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Procedure__TypedefAssignment_7_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63455:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:63456:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:63456:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:63457:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__TypedefAssignment_7_1_4"
+
+
+    // $ANTLR start "rule__Procedure__PropertyAssignment_7_1_5"
+    // InternalFormalML.g:63466:1: rule__Procedure__PropertyAssignment_7_1_5 : ( ruleVariable ) ;
+    public final void rule__Procedure__PropertyAssignment_7_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63470:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:63471:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:63471:2: ( ruleVariable )
+            // InternalFormalML.g:63472:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_7_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_7_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PropertyAssignment_7_1_5"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_8_0_1_0"
+    // InternalFormalML.g:63481:1: rule__Procedure__ParameterAssignment_8_0_1_0 : ( ruleParameterInput ) ;
+    public final void rule__Procedure__ParameterAssignment_8_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63485:1: ( ( ruleParameterInput ) )
+            // InternalFormalML.g:63486:2: ( ruleParameterInput )
+            {
+            // InternalFormalML.g:63486:2: ( ruleParameterInput )
+            // InternalFormalML.g:63487:3: ruleParameterInput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_8_0_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_8_0_1_1_1"
+    // InternalFormalML.g:63496:1: rule__Procedure__ParameterAssignment_8_0_1_1_1 : ( ruleParameterInput ) ;
+    public final void rule__Procedure__ParameterAssignment_8_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63500:1: ( ( ruleParameterInput ) )
+            // InternalFormalML.g:63501:2: ( ruleParameterInput )
+            {
+            // InternalFormalML.g:63501:2: ( ruleParameterInput )
+            // InternalFormalML.g:63502:3: ruleParameterInput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_8_0_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_8_1_1_0"
+    // InternalFormalML.g:63511:1: rule__Procedure__ParameterAssignment_8_1_1_0 : ( ruleParameterInout ) ;
+    public final void rule__Procedure__ParameterAssignment_8_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63515:1: ( ( ruleParameterInout ) )
+            // InternalFormalML.g:63516:2: ( ruleParameterInout )
+            {
+            // InternalFormalML.g:63516:2: ( ruleParameterInout )
+            // InternalFormalML.g:63517:3: ruleParameterInout
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_8_1_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_8_1_1_1_1"
+    // InternalFormalML.g:63526:1: rule__Procedure__ParameterAssignment_8_1_1_1_1 : ( ruleParameterInout ) ;
+    public final void rule__Procedure__ParameterAssignment_8_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63530:1: ( ( ruleParameterInout ) )
+            // InternalFormalML.g:63531:2: ( ruleParameterInout )
+            {
+            // InternalFormalML.g:63531:2: ( ruleParameterInout )
+            // InternalFormalML.g:63532:3: ruleParameterInout
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_8_1_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_8_2_1_0"
+    // InternalFormalML.g:63541:1: rule__Procedure__ParameterAssignment_8_2_1_0 : ( ruleParameterOutput ) ;
+    public final void rule__Procedure__ParameterAssignment_8_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63545:1: ( ( ruleParameterOutput ) )
+            // InternalFormalML.g:63546:2: ( ruleParameterOutput )
+            {
+            // InternalFormalML.g:63546:2: ( ruleParameterOutput )
+            // InternalFormalML.g:63547:3: ruleParameterOutput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_8_2_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_8_2_1_1_1"
+    // InternalFormalML.g:63556:1: rule__Procedure__ParameterAssignment_8_2_1_1_1 : ( ruleParameterOutput ) ;
+    public final void rule__Procedure__ParameterAssignment_8_2_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63560:1: ( ( ruleParameterOutput ) )
+            // InternalFormalML.g:63561:2: ( ruleParameterOutput )
+            {
+            // InternalFormalML.g:63561:2: ( ruleParameterOutput )
+            // InternalFormalML.g:63562:3: ruleParameterOutput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_8_2_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_8_3_1_0"
+    // InternalFormalML.g:63571:1: rule__Procedure__ParameterAssignment_8_3_1_0 : ( ruleParameterReturn ) ;
+    public final void rule__Procedure__ParameterAssignment_8_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63575:1: ( ( ruleParameterReturn ) )
+            // InternalFormalML.g:63576:2: ( ruleParameterReturn )
+            {
+            // InternalFormalML.g:63576:2: ( ruleParameterReturn )
+            // InternalFormalML.g:63577:3: ruleParameterReturn
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_8_3_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ParameterAssignment_8_3_1_1_1"
+    // InternalFormalML.g:63586:1: rule__Procedure__ParameterAssignment_8_3_1_1_1 : ( ruleParameterReturn ) ;
+    public final void rule__Procedure__ParameterAssignment_8_3_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63590:1: ( ( ruleParameterReturn ) )
+            // InternalFormalML.g:63591:2: ( ruleParameterReturn )
+            {
+            // InternalFormalML.g:63591:2: ( ruleParameterReturn )
+            // InternalFormalML.g:63592:3: ruleParameterReturn
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ParameterAssignment_8_3_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__PortAssignment_9_0_1_0"
+    // InternalFormalML.g:63601:1: rule__Procedure__PortAssignment_9_0_1_0 : ( rulePort ) ;
+    public final void rule__Procedure__PortAssignment_9_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63605:1: ( ( rulePort ) )
+            // InternalFormalML.g:63606:2: ( rulePort )
+            {
+            // InternalFormalML.g:63606:2: ( rulePort )
+            // InternalFormalML.g:63607:3: rulePort
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_9_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePort();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_9_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PortAssignment_9_0_1_0"
+
+
+    // $ANTLR start "rule__Procedure__SignalAssignment_9_0_1_1"
+    // InternalFormalML.g:63616:1: rule__Procedure__SignalAssignment_9_0_1_1 : ( ruleSignal ) ;
+    public final void rule__Procedure__SignalAssignment_9_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63620:1: ( ( ruleSignal ) )
+            // InternalFormalML.g:63621:2: ( ruleSignal )
+            {
+            // InternalFormalML.g:63621:2: ( ruleSignal )
+            // InternalFormalML.g:63622:3: ruleSignal
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_9_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_9_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__SignalAssignment_9_0_1_1"
+
+
+    // $ANTLR start "rule__Procedure__BufferAssignment_9_0_1_2"
+    // InternalFormalML.g:63631:1: rule__Procedure__BufferAssignment_9_0_1_2 : ( ruleBuffer ) ;
+    public final void rule__Procedure__BufferAssignment_9_0_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63635:1: ( ( ruleBuffer ) )
+            // InternalFormalML.g:63636:2: ( ruleBuffer )
+            {
+            // InternalFormalML.g:63636:2: ( ruleBuffer )
+            // InternalFormalML.g:63637:3: ruleBuffer
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_9_0_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_9_0_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__BufferAssignment_9_0_1_2"
+
+
+    // $ANTLR start "rule__Procedure__ChannelAssignment_9_0_1_3"
+    // InternalFormalML.g:63646:1: rule__Procedure__ChannelAssignment_9_0_1_3 : ( ruleChannel ) ;
+    public final void rule__Procedure__ChannelAssignment_9_0_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63650:1: ( ( ruleChannel ) )
+            // InternalFormalML.g:63651:2: ( ruleChannel )
+            {
+            // InternalFormalML.g:63651:2: ( ruleChannel )
+            // InternalFormalML.g:63652:3: ruleChannel
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_9_0_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_9_0_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ChannelAssignment_9_0_1_3"
+
+
+    // $ANTLR start "rule__Procedure__TypedefAssignment_9_0_1_4"
+    // InternalFormalML.g:63661:1: rule__Procedure__TypedefAssignment_9_0_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Procedure__TypedefAssignment_9_0_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63665:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:63666:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:63666:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:63667:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__TypedefAssignment_9_0_1_4"
+
+
+    // $ANTLR start "rule__Procedure__PropertyAssignment_9_0_1_5"
+    // InternalFormalML.g:63676:1: rule__Procedure__PropertyAssignment_9_0_1_5 : ( ruleVariable ) ;
+    public final void rule__Procedure__PropertyAssignment_9_0_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63680:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:63681:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:63681:2: ( ruleVariable )
+            // InternalFormalML.g:63682:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_9_0_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_9_0_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PropertyAssignment_9_0_1_5"
+
+
+    // $ANTLR start "rule__Procedure__PortAssignment_9_1_1_0"
+    // InternalFormalML.g:63691:1: rule__Procedure__PortAssignment_9_1_1_0 : ( rulePortPublic ) ;
+    public final void rule__Procedure__PortAssignment_9_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63695:1: ( ( rulePortPublic ) )
+            // InternalFormalML.g:63696:2: ( rulePortPublic )
+            {
+            // InternalFormalML.g:63696:2: ( rulePortPublic )
+            // InternalFormalML.g:63697:3: rulePortPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPortPortPublicParserRuleCall_9_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPortPortPublicParserRuleCall_9_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PortAssignment_9_1_1_0"
+
+
+    // $ANTLR start "rule__Procedure__SignalAssignment_9_1_1_1"
+    // InternalFormalML.g:63706:1: rule__Procedure__SignalAssignment_9_1_1_1 : ( ruleSignalPublic ) ;
+    public final void rule__Procedure__SignalAssignment_9_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63710:1: ( ( ruleSignalPublic ) )
+            // InternalFormalML.g:63711:2: ( ruleSignalPublic )
+            {
+            // InternalFormalML.g:63711:2: ( ruleSignalPublic )
+            // InternalFormalML.g:63712:3: ruleSignalPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__SignalAssignment_9_1_1_1"
+
+
+    // $ANTLR start "rule__Procedure__BufferAssignment_9_1_1_2"
+    // InternalFormalML.g:63721:1: rule__Procedure__BufferAssignment_9_1_1_2 : ( ruleBufferPublic ) ;
+    public final void rule__Procedure__BufferAssignment_9_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63725:1: ( ( ruleBufferPublic ) )
+            // InternalFormalML.g:63726:2: ( ruleBufferPublic )
+            {
+            // InternalFormalML.g:63726:2: ( ruleBufferPublic )
+            // InternalFormalML.g:63727:3: ruleBufferPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__BufferAssignment_9_1_1_2"
+
+
+    // $ANTLR start "rule__Procedure__ChannelAssignment_9_1_1_3"
+    // InternalFormalML.g:63736:1: rule__Procedure__ChannelAssignment_9_1_1_3 : ( ruleChannelPublic ) ;
+    public final void rule__Procedure__ChannelAssignment_9_1_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63740:1: ( ( ruleChannelPublic ) )
+            // InternalFormalML.g:63741:2: ( ruleChannelPublic )
+            {
+            // InternalFormalML.g:63741:2: ( ruleChannelPublic )
+            // InternalFormalML.g:63742:3: ruleChannelPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ChannelAssignment_9_1_1_3"
+
+
+    // $ANTLR start "rule__Procedure__TypedefAssignment_9_1_1_4"
+    // InternalFormalML.g:63751:1: rule__Procedure__TypedefAssignment_9_1_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Procedure__TypedefAssignment_9_1_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63755:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:63756:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:63756:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:63757:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__TypedefAssignment_9_1_1_4"
+
+
+    // $ANTLR start "rule__Procedure__PropertyAssignment_9_1_1_5"
+    // InternalFormalML.g:63766:1: rule__Procedure__PropertyAssignment_9_1_1_5 : ( ruleVariablePublic ) ;
+    public final void rule__Procedure__PropertyAssignment_9_1_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63770:1: ( ( ruleVariablePublic ) )
+            // InternalFormalML.g:63771:2: ( ruleVariablePublic )
+            {
+            // InternalFormalML.g:63771:2: ( ruleVariablePublic )
+            // InternalFormalML.g:63772:3: ruleVariablePublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariablePublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PropertyAssignment_9_1_1_5"
+
+
+    // $ANTLR start "rule__Procedure__PortAssignment_9_2_1_0"
+    // InternalFormalML.g:63781:1: rule__Procedure__PortAssignment_9_2_1_0 : ( rulePortProtected ) ;
+    public final void rule__Procedure__PortAssignment_9_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63785:1: ( ( rulePortProtected ) )
+            // InternalFormalML.g:63786:2: ( rulePortProtected )
+            {
+            // InternalFormalML.g:63786:2: ( rulePortProtected )
+            // InternalFormalML.g:63787:3: rulePortProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PortAssignment_9_2_1_0"
+
+
+    // $ANTLR start "rule__Procedure__SignalAssignment_9_2_1_1"
+    // InternalFormalML.g:63796:1: rule__Procedure__SignalAssignment_9_2_1_1 : ( ruleSignalProtected ) ;
+    public final void rule__Procedure__SignalAssignment_9_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63800:1: ( ( ruleSignalProtected ) )
+            // InternalFormalML.g:63801:2: ( ruleSignalProtected )
+            {
+            // InternalFormalML.g:63801:2: ( ruleSignalProtected )
+            // InternalFormalML.g:63802:3: ruleSignalProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__SignalAssignment_9_2_1_1"
+
+
+    // $ANTLR start "rule__Procedure__BufferAssignment_9_2_1_2"
+    // InternalFormalML.g:63811:1: rule__Procedure__BufferAssignment_9_2_1_2 : ( ruleBufferProtected ) ;
+    public final void rule__Procedure__BufferAssignment_9_2_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63815:1: ( ( ruleBufferProtected ) )
+            // InternalFormalML.g:63816:2: ( ruleBufferProtected )
+            {
+            // InternalFormalML.g:63816:2: ( ruleBufferProtected )
+            // InternalFormalML.g:63817:3: ruleBufferProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__BufferAssignment_9_2_1_2"
+
+
+    // $ANTLR start "rule__Procedure__ChannelAssignment_9_2_1_3"
+    // InternalFormalML.g:63826:1: rule__Procedure__ChannelAssignment_9_2_1_3 : ( ruleChannelProtected ) ;
+    public final void rule__Procedure__ChannelAssignment_9_2_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63830:1: ( ( ruleChannelProtected ) )
+            // InternalFormalML.g:63831:2: ( ruleChannelProtected )
+            {
+            // InternalFormalML.g:63831:2: ( ruleChannelProtected )
+            // InternalFormalML.g:63832:3: ruleChannelProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ChannelAssignment_9_2_1_3"
+
+
+    // $ANTLR start "rule__Procedure__TypedefAssignment_9_2_1_4"
+    // InternalFormalML.g:63841:1: rule__Procedure__TypedefAssignment_9_2_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Procedure__TypedefAssignment_9_2_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63845:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:63846:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:63846:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:63847:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__TypedefAssignment_9_2_1_4"
+
+
+    // $ANTLR start "rule__Procedure__PropertyAssignment_9_2_1_5"
+    // InternalFormalML.g:63856:1: rule__Procedure__PropertyAssignment_9_2_1_5 : ( ruleVariableProtected ) ;
+    public final void rule__Procedure__PropertyAssignment_9_2_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63860:1: ( ( ruleVariableProtected ) )
+            // InternalFormalML.g:63861:2: ( ruleVariableProtected )
+            {
+            // InternalFormalML.g:63861:2: ( ruleVariableProtected )
+            // InternalFormalML.g:63862:3: ruleVariableProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariableProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PropertyAssignment_9_2_1_5"
+
+
+    // $ANTLR start "rule__Procedure__PortAssignment_9_3_1_0"
+    // InternalFormalML.g:63871:1: rule__Procedure__PortAssignment_9_3_1_0 : ( rulePortPrivate ) ;
+    public final void rule__Procedure__PortAssignment_9_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63875:1: ( ( rulePortPrivate ) )
+            // InternalFormalML.g:63876:2: ( rulePortPrivate )
+            {
+            // InternalFormalML.g:63876:2: ( rulePortPrivate )
+            // InternalFormalML.g:63877:3: rulePortPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PortAssignment_9_3_1_0"
+
+
+    // $ANTLR start "rule__Procedure__SignalAssignment_9_3_1_1"
+    // InternalFormalML.g:63886:1: rule__Procedure__SignalAssignment_9_3_1_1 : ( ruleSignalPrivate ) ;
+    public final void rule__Procedure__SignalAssignment_9_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63890:1: ( ( ruleSignalPrivate ) )
+            // InternalFormalML.g:63891:2: ( ruleSignalPrivate )
+            {
+            // InternalFormalML.g:63891:2: ( ruleSignalPrivate )
+            // InternalFormalML.g:63892:3: ruleSignalPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__SignalAssignment_9_3_1_1"
+
+
+    // $ANTLR start "rule__Procedure__BufferAssignment_9_3_1_2"
+    // InternalFormalML.g:63901:1: rule__Procedure__BufferAssignment_9_3_1_2 : ( ruleBufferPrivate ) ;
+    public final void rule__Procedure__BufferAssignment_9_3_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63905:1: ( ( ruleBufferPrivate ) )
+            // InternalFormalML.g:63906:2: ( ruleBufferPrivate )
+            {
+            // InternalFormalML.g:63906:2: ( ruleBufferPrivate )
+            // InternalFormalML.g:63907:3: ruleBufferPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__BufferAssignment_9_3_1_2"
+
+
+    // $ANTLR start "rule__Procedure__ChannelAssignment_9_3_1_3"
+    // InternalFormalML.g:63916:1: rule__Procedure__ChannelAssignment_9_3_1_3 : ( ruleChannelPrivate ) ;
+    public final void rule__Procedure__ChannelAssignment_9_3_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63920:1: ( ( ruleChannelPrivate ) )
+            // InternalFormalML.g:63921:2: ( ruleChannelPrivate )
+            {
+            // InternalFormalML.g:63921:2: ( ruleChannelPrivate )
+            // InternalFormalML.g:63922:3: ruleChannelPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ChannelAssignment_9_3_1_3"
+
+
+    // $ANTLR start "rule__Procedure__TypedefAssignment_9_3_1_4"
+    // InternalFormalML.g:63931:1: rule__Procedure__TypedefAssignment_9_3_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Procedure__TypedefAssignment_9_3_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63935:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:63936:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:63936:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:63937:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__TypedefAssignment_9_3_1_4"
+
+
+    // $ANTLR start "rule__Procedure__PropertyAssignment_9_3_1_5"
+    // InternalFormalML.g:63946:1: rule__Procedure__PropertyAssignment_9_3_1_5 : ( ruleVariablePrivate ) ;
+    public final void rule__Procedure__PropertyAssignment_9_3_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63950:1: ( ( ruleVariablePrivate ) )
+            // InternalFormalML.g:63951:2: ( ruleVariablePrivate )
+            {
+            // InternalFormalML.g:63951:2: ( ruleVariablePrivate )
+            // InternalFormalML.g:63952:3: ruleVariablePrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariablePrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__PropertyAssignment_9_3_1_5"
+
+
+    // $ANTLR start "rule__Procedure__RoutineAssignment_10_0_0_1"
+    // InternalFormalML.g:63961:1: rule__Procedure__RoutineAssignment_10_0_0_1 : ( ruleRoutine ) ;
+    public final void rule__Procedure__RoutineAssignment_10_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63965:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:63966:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:63966:2: ( ruleRoutine )
+            // InternalFormalML.g:63967:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__RoutineAssignment_10_0_0_1"
+
+
+    // $ANTLR start "rule__Procedure__ProcedureAssignment_10_0_1_1"
+    // InternalFormalML.g:63976:1: rule__Procedure__ProcedureAssignment_10_0_1_1 : ( ruleProcedure ) ;
+    public final void rule__Procedure__ProcedureAssignment_10_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63980:1: ( ( ruleProcedure ) )
+            // InternalFormalML.g:63981:2: ( ruleProcedure )
+            {
+            // InternalFormalML.g:63981:2: ( ruleProcedure )
+            // InternalFormalML.g:63982:3: ruleProcedure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ProcedureAssignment_10_0_1_1"
+
+
+    // $ANTLR start "rule__Procedure__RoutineAssignment_10_1_0"
+    // InternalFormalML.g:63991:1: rule__Procedure__RoutineAssignment_10_1_0 : ( ruleRoutine ) ;
+    public final void rule__Procedure__RoutineAssignment_10_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:63995:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:63996:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:63996:2: ( ruleRoutine )
+            // InternalFormalML.g:63997:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__RoutineAssignment_10_1_0"
+
+
+    // $ANTLR start "rule__Procedure__ProcedureAssignment_10_1_1"
+    // InternalFormalML.g:64006:1: rule__Procedure__ProcedureAssignment_10_1_1 : ( ruleProcedure ) ;
+    public final void rule__Procedure__ProcedureAssignment_10_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64010:1: ( ( ruleProcedure ) )
+            // InternalFormalML.g:64011:2: ( ruleProcedure )
+            {
+            // InternalFormalML.g:64011:2: ( ruleProcedure )
+            // InternalFormalML.g:64012:3: ruleProcedure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ProcedureAssignment_10_1_1"
+
+
+    // $ANTLR start "rule__Procedure__RegionAssignment_11_0"
+    // InternalFormalML.g:64021:1: rule__Procedure__RegionAssignment_11_0 : ( ruleStatemachineRegion ) ;
+    public final void rule__Procedure__RegionAssignment_11_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64025:1: ( ( ruleStatemachineRegion ) )
+            // InternalFormalML.g:64026:2: ( ruleStatemachineRegion )
+            {
+            // InternalFormalML.g:64026:2: ( ruleStatemachineRegion )
+            // InternalFormalML.g:64027:3: ruleStatemachineRegion
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRegionStatemachineRegionParserRuleCall_11_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatemachineRegion();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRegionStatemachineRegionParserRuleCall_11_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__RegionAssignment_11_0"
+
+
+    // $ANTLR start "rule__Procedure__RegionAssignment_11_1"
+    // InternalFormalML.g:64036:1: rule__Procedure__RegionAssignment_11_1 : ( ruleStatemachineRegionLite ) ;
+    public final void rule__Procedure__RegionAssignment_11_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64040:1: ( ( ruleStatemachineRegionLite ) )
+            // InternalFormalML.g:64041:2: ( ruleStatemachineRegionLite )
+            {
+            // InternalFormalML.g:64041:2: ( ruleStatemachineRegionLite )
+            // InternalFormalML.g:64042:3: ruleStatemachineRegionLite
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatemachineRegionLite();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__RegionAssignment_11_1"
+
+
+    // $ANTLR start "rule__Procedure__ExecutionAssignment_12"
+    // InternalFormalML.g:64051:1: rule__Procedure__ExecutionAssignment_12 : ( ruleProcedureExecution ) ;
+    public final void rule__Procedure__ExecutionAssignment_12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64055:1: ( ( ruleProcedureExecution ) )
+            // InternalFormalML.g:64056:2: ( ruleProcedureExecution )
+            {
+            // InternalFormalML.g:64056:2: ( ruleProcedureExecution )
+            // InternalFormalML.g:64057:3: ruleProcedureExecution
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureAccess().getExecutionProcedureExecutionParserRuleCall_12_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProcedureExecution();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureAccess().getExecutionProcedureExecutionParserRuleCall_12_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Procedure__ExecutionAssignment_12"
+
+
+    // $ANTLR start "rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1"
+    // InternalFormalML.g:64066:1: rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1 : ( rulemoeRoutine ) ;
+    public final void rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64070:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:64071:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:64071:2: ( rulemoeRoutine )
+            // InternalFormalML.g:64072:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__ScheduleRoutineAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__ProcedureExecution__RunRoutineAssignment_2_1_1"
+    // InternalFormalML.g:64081:1: rule__ProcedureExecution__RunRoutineAssignment_2_1_1 : ( rulemoeRoutine ) ;
+    public final void rule__ProcedureExecution__RunRoutineAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64085:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:64086:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:64086:2: ( rulemoeRoutine )
+            // InternalFormalML.g:64087:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getProcedureExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_2_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getProcedureExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ProcedureExecution__RunRoutineAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__MoeBehavior__PortAssignment_1_1_0"
+    // InternalFormalML.g:64096:1: rule__MoeBehavior__PortAssignment_1_1_0 : ( rulePortPrivate ) ;
+    public final void rule__MoeBehavior__PortAssignment_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64100:1: ( ( rulePortPrivate ) )
+            // InternalFormalML.g:64101:2: ( rulePortPrivate )
+            {
+            // InternalFormalML.g:64101:2: ( rulePortPrivate )
+            // InternalFormalML.g:64102:3: rulePortPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getPortPortPrivateParserRuleCall_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getPortPortPrivateParserRuleCall_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__PortAssignment_1_1_0"
+
+
+    // $ANTLR start "rule__MoeBehavior__SignalAssignment_1_1_1"
+    // InternalFormalML.g:64111:1: rule__MoeBehavior__SignalAssignment_1_1_1 : ( ruleSignalPrivate ) ;
+    public final void rule__MoeBehavior__SignalAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64115:1: ( ( ruleSignalPrivate ) )
+            // InternalFormalML.g:64116:2: ( ruleSignalPrivate )
+            {
+            // InternalFormalML.g:64116:2: ( ruleSignalPrivate )
+            // InternalFormalML.g:64117:3: ruleSignalPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getSignalSignalPrivateParserRuleCall_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getSignalSignalPrivateParserRuleCall_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__SignalAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__MoeBehavior__BufferAssignment_1_1_2"
+    // InternalFormalML.g:64126:1: rule__MoeBehavior__BufferAssignment_1_1_2 : ( ruleBufferPrivate ) ;
+    public final void rule__MoeBehavior__BufferAssignment_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64130:1: ( ( ruleBufferPrivate ) )
+            // InternalFormalML.g:64131:2: ( ruleBufferPrivate )
+            {
+            // InternalFormalML.g:64131:2: ( ruleBufferPrivate )
+            // InternalFormalML.g:64132:3: ruleBufferPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getBufferBufferPrivateParserRuleCall_1_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getBufferBufferPrivateParserRuleCall_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__BufferAssignment_1_1_2"
+
+
+    // $ANTLR start "rule__MoeBehavior__ChannelAssignment_1_1_3"
+    // InternalFormalML.g:64141:1: rule__MoeBehavior__ChannelAssignment_1_1_3 : ( ruleChannelPrivate ) ;
+    public final void rule__MoeBehavior__ChannelAssignment_1_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64145:1: ( ( ruleChannelPrivate ) )
+            // InternalFormalML.g:64146:2: ( ruleChannelPrivate )
+            {
+            // InternalFormalML.g:64146:2: ( ruleChannelPrivate )
+            // InternalFormalML.g:64147:3: ruleChannelPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getChannelChannelPrivateParserRuleCall_1_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getChannelChannelPrivateParserRuleCall_1_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__ChannelAssignment_1_1_3"
+
+
+    // $ANTLR start "rule__MoeBehavior__TypedefAssignment_1_1_4"
+    // InternalFormalML.g:64156:1: rule__MoeBehavior__TypedefAssignment_1_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__MoeBehavior__TypedefAssignment_1_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64160:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:64161:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:64161:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:64162:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getTypedefTypeDefinitionParserRuleCall_1_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getTypedefTypeDefinitionParserRuleCall_1_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__TypedefAssignment_1_1_4"
+
+
+    // $ANTLR start "rule__MoeBehavior__PropertyAssignment_1_1_5"
+    // InternalFormalML.g:64171:1: rule__MoeBehavior__PropertyAssignment_1_1_5 : ( ruleVariablePrivate ) ;
+    public final void rule__MoeBehavior__PropertyAssignment_1_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64175:1: ( ( ruleVariablePrivate ) )
+            // InternalFormalML.g:64176:2: ( ruleVariablePrivate )
+            {
+            // InternalFormalML.g:64176:2: ( ruleVariablePrivate )
+            // InternalFormalML.g:64177:3: ruleVariablePrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getPropertyVariablePrivateParserRuleCall_1_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariablePrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getPropertyVariablePrivateParserRuleCall_1_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__PropertyAssignment_1_1_5"
+
+
+    // $ANTLR start "rule__MoeBehavior__ExecutionAssignment_2_0"
+    // InternalFormalML.g:64186:1: rule__MoeBehavior__ExecutionAssignment_2_0 : ( ruleModelOfExecution ) ;
+    public final void rule__MoeBehavior__ExecutionAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64190:1: ( ( ruleModelOfExecution ) )
+            // InternalFormalML.g:64191:2: ( ruleModelOfExecution )
+            {
+            // InternalFormalML.g:64191:2: ( ruleModelOfExecution )
+            // InternalFormalML.g:64192:3: ruleModelOfExecution
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getExecutionModelOfExecutionParserRuleCall_2_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModelOfExecution();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getExecutionModelOfExecutionParserRuleCall_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__ExecutionAssignment_2_0"
+
+
+    // $ANTLR start "rule__MoeBehavior__InteractionAssignment_2_1"
+    // InternalFormalML.g:64201:1: rule__MoeBehavior__InteractionAssignment_2_1 : ( ruleModelOfInteraction ) ;
+    public final void rule__MoeBehavior__InteractionAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64205:1: ( ( ruleModelOfInteraction ) )
+            // InternalFormalML.g:64206:2: ( ruleModelOfInteraction )
+            {
+            // InternalFormalML.g:64206:2: ( ruleModelOfInteraction )
+            // InternalFormalML.g:64207:3: ruleModelOfInteraction
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeBehaviorAccess().getInteractionModelOfInteractionParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModelOfInteraction();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeBehaviorAccess().getInteractionModelOfInteractionParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeBehavior__InteractionAssignment_2_1"
+
+
+    // $ANTLR start "rule__Statemachine__VisibilityAssignment_1_0"
+    // InternalFormalML.g:64216:1: rule__Statemachine__VisibilityAssignment_1_0 : ( ruleVisibilityKind ) ;
+    public final void rule__Statemachine__VisibilityAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64220:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:64221:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:64221:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:64222:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__VisibilityAssignment_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__TimedAssignment_1_1_0"
+    // InternalFormalML.g:64231:1: rule__Statemachine__TimedAssignment_1_1_0 : ( ( 'timed' ) ) ;
+    public final void rule__Statemachine__TimedAssignment_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64235:1: ( ( ( 'timed' ) ) )
+            // InternalFormalML.g:64236:2: ( ( 'timed' ) )
+            {
+            // InternalFormalML.g:64236:2: ( ( 'timed' ) )
+            // InternalFormalML.g:64237:3: ( 'timed' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0()); 
+            }
+            // InternalFormalML.g:64238:3: ( 'timed' )
+            // InternalFormalML.g:64239:4: 'timed'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0()); 
+            }
+            match(input,273,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__TimedAssignment_1_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__Input_enabledAssignment_1_1_1"
+    // InternalFormalML.g:64250:1: rule__Statemachine__Input_enabledAssignment_1_1_1 : ( ( 'input_enabled' ) ) ;
+    public final void rule__Statemachine__Input_enabledAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64254:1: ( ( ( 'input_enabled' ) ) )
+            // InternalFormalML.g:64255:2: ( ( 'input_enabled' ) )
+            {
+            // InternalFormalML.g:64255:2: ( ( 'input_enabled' ) )
+            // InternalFormalML.g:64256:3: ( 'input_enabled' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0()); 
+            }
+            // InternalFormalML.g:64257:3: ( 'input_enabled' )
+            // InternalFormalML.g:64258:4: 'input_enabled'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0()); 
+            }
+            match(input,274,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__Input_enabledAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__DesignAssignment_1_2"
+    // InternalFormalML.g:64269:1: rule__Statemachine__DesignAssignment_1_2 : ( ruleDesignKind ) ;
+    public final void rule__Statemachine__DesignAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64273:1: ( ( ruleDesignKind ) )
+            // InternalFormalML.g:64274:2: ( ruleDesignKind )
+            {
+            // InternalFormalML.g:64274:2: ( ruleDesignKind )
+            // InternalFormalML.g:64275:3: ruleDesignKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getDesignDesignKindEnumRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDesignKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getDesignDesignKindEnumRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__DesignAssignment_1_2"
+
+
+    // $ANTLR start "rule__Statemachine__NameAssignment_4"
+    // InternalFormalML.g:64284:1: rule__Statemachine__NameAssignment_4 : ( ruleESIdentifier ) ;
+    public final void rule__Statemachine__NameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64288:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:64289:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:64289:2: ( ruleESIdentifier )
+            // InternalFormalML.g:64290:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getNameESIdentifierParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getNameESIdentifierParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__NameAssignment_4"
+
+
+    // $ANTLR start "rule__Statemachine__UnrestrictedNameAssignment_5"
+    // InternalFormalML.g:64299:1: rule__Statemachine__UnrestrictedNameAssignment_5 : ( ruleUnrestrictedName ) ;
+    public final void rule__Statemachine__UnrestrictedNameAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64303:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:64304:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:64304:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:64305:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__UnrestrictedNameAssignment_5"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_7_0_1_0_1_0"
+    // InternalFormalML.g:64314:1: rule__Statemachine__ParameterAssignment_7_0_1_0_1_0 : ( ruleParameterInput ) ;
+    public final void rule__Statemachine__ParameterAssignment_7_0_1_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64318:1: ( ( ruleParameterInput ) )
+            // InternalFormalML.g:64319:2: ( ruleParameterInput )
+            {
+            // InternalFormalML.g:64319:2: ( ruleParameterInput )
+            // InternalFormalML.g:64320:3: ruleParameterInput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_7_0_1_0_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1"
+    // InternalFormalML.g:64329:1: rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1 : ( ruleParameterInput ) ;
+    public final void rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64333:1: ( ( ruleParameterInput ) )
+            // InternalFormalML.g:64334:2: ( ruleParameterInput )
+            {
+            // InternalFormalML.g:64334:2: ( ruleParameterInput )
+            // InternalFormalML.g:64335:3: ruleParameterInput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_7_0_1_0_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_7_0_1_1_1_0"
+    // InternalFormalML.g:64344:1: rule__Statemachine__ParameterAssignment_7_0_1_1_1_0 : ( ruleParameterInout ) ;
+    public final void rule__Statemachine__ParameterAssignment_7_0_1_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64348:1: ( ( ruleParameterInout ) )
+            // InternalFormalML.g:64349:2: ( ruleParameterInout )
+            {
+            // InternalFormalML.g:64349:2: ( ruleParameterInout )
+            // InternalFormalML.g:64350:3: ruleParameterInout
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_7_0_1_1_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1"
+    // InternalFormalML.g:64359:1: rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1 : ( ruleParameterInout ) ;
+    public final void rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64363:1: ( ( ruleParameterInout ) )
+            // InternalFormalML.g:64364:2: ( ruleParameterInout )
+            {
+            // InternalFormalML.g:64364:2: ( ruleParameterInout )
+            // InternalFormalML.g:64365:3: ruleParameterInout
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_7_0_1_1_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_7_0_1_2_1_0"
+    // InternalFormalML.g:64374:1: rule__Statemachine__ParameterAssignment_7_0_1_2_1_0 : ( ruleParameterOutput ) ;
+    public final void rule__Statemachine__ParameterAssignment_7_0_1_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64378:1: ( ( ruleParameterOutput ) )
+            // InternalFormalML.g:64379:2: ( ruleParameterOutput )
+            {
+            // InternalFormalML.g:64379:2: ( ruleParameterOutput )
+            // InternalFormalML.g:64380:3: ruleParameterOutput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_7_0_1_2_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1"
+    // InternalFormalML.g:64389:1: rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1 : ( ruleParameterOutput ) ;
+    public final void rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64393:1: ( ( ruleParameterOutput ) )
+            // InternalFormalML.g:64394:2: ( ruleParameterOutput )
+            {
+            // InternalFormalML.g:64394:2: ( ruleParameterOutput )
+            // InternalFormalML.g:64395:3: ruleParameterOutput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_7_0_1_2_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_7_0_1_3_1_0"
+    // InternalFormalML.g:64404:1: rule__Statemachine__ParameterAssignment_7_0_1_3_1_0 : ( ruleParameterReturn ) ;
+    public final void rule__Statemachine__ParameterAssignment_7_0_1_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64408:1: ( ( ruleParameterReturn ) )
+            // InternalFormalML.g:64409:2: ( ruleParameterReturn )
+            {
+            // InternalFormalML.g:64409:2: ( ruleParameterReturn )
+            // InternalFormalML.g:64410:3: ruleParameterReturn
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_7_0_1_3_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1"
+    // InternalFormalML.g:64419:1: rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1 : ( ruleParameterReturn ) ;
+    public final void rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64423:1: ( ( ruleParameterReturn ) )
+            // InternalFormalML.g:64424:2: ( ruleParameterReturn )
+            {
+            // InternalFormalML.g:64424:2: ( ruleParameterReturn )
+            // InternalFormalML.g:64425:3: ruleParameterReturn
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_7_0_1_3_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__PortAssignment_7_1_0"
+    // InternalFormalML.g:64434:1: rule__Statemachine__PortAssignment_7_1_0 : ( rulePort ) ;
+    public final void rule__Statemachine__PortAssignment_7_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64438:1: ( ( rulePort ) )
+            // InternalFormalML.g:64439:2: ( rulePort )
+            {
+            // InternalFormalML.g:64439:2: ( rulePort )
+            // InternalFormalML.g:64440:3: rulePort
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_7_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePort();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_7_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PortAssignment_7_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__SignalAssignment_7_1_1"
+    // InternalFormalML.g:64449:1: rule__Statemachine__SignalAssignment_7_1_1 : ( ruleSignal ) ;
+    public final void rule__Statemachine__SignalAssignment_7_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64453:1: ( ( ruleSignal ) )
+            // InternalFormalML.g:64454:2: ( ruleSignal )
+            {
+            // InternalFormalML.g:64454:2: ( ruleSignal )
+            // InternalFormalML.g:64455:3: ruleSignal
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_7_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_7_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__SignalAssignment_7_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__BufferAssignment_7_1_2"
+    // InternalFormalML.g:64464:1: rule__Statemachine__BufferAssignment_7_1_2 : ( ruleBuffer ) ;
+    public final void rule__Statemachine__BufferAssignment_7_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64468:1: ( ( ruleBuffer ) )
+            // InternalFormalML.g:64469:2: ( ruleBuffer )
+            {
+            // InternalFormalML.g:64469:2: ( ruleBuffer )
+            // InternalFormalML.g:64470:3: ruleBuffer
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_7_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_7_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__BufferAssignment_7_1_2"
+
+
+    // $ANTLR start "rule__Statemachine__ChannelAssignment_7_1_3"
+    // InternalFormalML.g:64479:1: rule__Statemachine__ChannelAssignment_7_1_3 : ( ruleChannel ) ;
+    public final void rule__Statemachine__ChannelAssignment_7_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64483:1: ( ( ruleChannel ) )
+            // InternalFormalML.g:64484:2: ( ruleChannel )
+            {
+            // InternalFormalML.g:64484:2: ( ruleChannel )
+            // InternalFormalML.g:64485:3: ruleChannel
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_7_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_7_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ChannelAssignment_7_1_3"
+
+
+    // $ANTLR start "rule__Statemachine__TypedefAssignment_7_1_4"
+    // InternalFormalML.g:64494:1: rule__Statemachine__TypedefAssignment_7_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Statemachine__TypedefAssignment_7_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64498:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:64499:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:64499:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:64500:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__TypedefAssignment_7_1_4"
+
+
+    // $ANTLR start "rule__Statemachine__PropertyAssignment_7_1_5"
+    // InternalFormalML.g:64509:1: rule__Statemachine__PropertyAssignment_7_1_5 : ( ruleVariable ) ;
+    public final void rule__Statemachine__PropertyAssignment_7_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64513:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:64514:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:64514:2: ( ruleVariable )
+            // InternalFormalML.g:64515:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_7_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_7_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PropertyAssignment_7_1_5"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_8_0_1_0"
+    // InternalFormalML.g:64524:1: rule__Statemachine__ParameterAssignment_8_0_1_0 : ( ruleParameterInput ) ;
+    public final void rule__Statemachine__ParameterAssignment_8_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64528:1: ( ( ruleParameterInput ) )
+            // InternalFormalML.g:64529:2: ( ruleParameterInput )
+            {
+            // InternalFormalML.g:64529:2: ( ruleParameterInput )
+            // InternalFormalML.g:64530:3: ruleParameterInput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_8_0_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_8_0_1_1_1"
+    // InternalFormalML.g:64539:1: rule__Statemachine__ParameterAssignment_8_0_1_1_1 : ( ruleParameterInput ) ;
+    public final void rule__Statemachine__ParameterAssignment_8_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64543:1: ( ( ruleParameterInput ) )
+            // InternalFormalML.g:64544:2: ( ruleParameterInput )
+            {
+            // InternalFormalML.g:64544:2: ( ruleParameterInput )
+            // InternalFormalML.g:64545:3: ruleParameterInput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_8_0_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_8_1_1_0"
+    // InternalFormalML.g:64554:1: rule__Statemachine__ParameterAssignment_8_1_1_0 : ( ruleParameterInout ) ;
+    public final void rule__Statemachine__ParameterAssignment_8_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64558:1: ( ( ruleParameterInout ) )
+            // InternalFormalML.g:64559:2: ( ruleParameterInout )
+            {
+            // InternalFormalML.g:64559:2: ( ruleParameterInout )
+            // InternalFormalML.g:64560:3: ruleParameterInout
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_8_1_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_8_1_1_1_1"
+    // InternalFormalML.g:64569:1: rule__Statemachine__ParameterAssignment_8_1_1_1_1 : ( ruleParameterInout ) ;
+    public final void rule__Statemachine__ParameterAssignment_8_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64573:1: ( ( ruleParameterInout ) )
+            // InternalFormalML.g:64574:2: ( ruleParameterInout )
+            {
+            // InternalFormalML.g:64574:2: ( ruleParameterInout )
+            // InternalFormalML.g:64575:3: ruleParameterInout
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_8_1_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_8_2_1_0"
+    // InternalFormalML.g:64584:1: rule__Statemachine__ParameterAssignment_8_2_1_0 : ( ruleParameterOutput ) ;
+    public final void rule__Statemachine__ParameterAssignment_8_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64588:1: ( ( ruleParameterOutput ) )
+            // InternalFormalML.g:64589:2: ( ruleParameterOutput )
+            {
+            // InternalFormalML.g:64589:2: ( ruleParameterOutput )
+            // InternalFormalML.g:64590:3: ruleParameterOutput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_8_2_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_8_2_1_1_1"
+    // InternalFormalML.g:64599:1: rule__Statemachine__ParameterAssignment_8_2_1_1_1 : ( ruleParameterOutput ) ;
+    public final void rule__Statemachine__ParameterAssignment_8_2_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64603:1: ( ( ruleParameterOutput ) )
+            // InternalFormalML.g:64604:2: ( ruleParameterOutput )
+            {
+            // InternalFormalML.g:64604:2: ( ruleParameterOutput )
+            // InternalFormalML.g:64605:3: ruleParameterOutput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_8_2_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_8_3_1_0"
+    // InternalFormalML.g:64614:1: rule__Statemachine__ParameterAssignment_8_3_1_0 : ( ruleParameterReturn ) ;
+    public final void rule__Statemachine__ParameterAssignment_8_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64618:1: ( ( ruleParameterReturn ) )
+            // InternalFormalML.g:64619:2: ( ruleParameterReturn )
+            {
+            // InternalFormalML.g:64619:2: ( ruleParameterReturn )
+            // InternalFormalML.g:64620:3: ruleParameterReturn
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_8_3_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__ParameterAssignment_8_3_1_1_1"
+    // InternalFormalML.g:64629:1: rule__Statemachine__ParameterAssignment_8_3_1_1_1 : ( ruleParameterReturn ) ;
+    public final void rule__Statemachine__ParameterAssignment_8_3_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64633:1: ( ( ruleParameterReturn ) )
+            // InternalFormalML.g:64634:2: ( ruleParameterReturn )
+            {
+            // InternalFormalML.g:64634:2: ( ruleParameterReturn )
+            // InternalFormalML.g:64635:3: ruleParameterReturn
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ParameterAssignment_8_3_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__PortAssignment_9_0_1_0"
+    // InternalFormalML.g:64644:1: rule__Statemachine__PortAssignment_9_0_1_0 : ( rulePort ) ;
+    public final void rule__Statemachine__PortAssignment_9_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64648:1: ( ( rulePort ) )
+            // InternalFormalML.g:64649:2: ( rulePort )
+            {
+            // InternalFormalML.g:64649:2: ( rulePort )
+            // InternalFormalML.g:64650:3: rulePort
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_9_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePort();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_9_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PortAssignment_9_0_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__SignalAssignment_9_0_1_1"
+    // InternalFormalML.g:64659:1: rule__Statemachine__SignalAssignment_9_0_1_1 : ( ruleSignal ) ;
+    public final void rule__Statemachine__SignalAssignment_9_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64663:1: ( ( ruleSignal ) )
+            // InternalFormalML.g:64664:2: ( ruleSignal )
+            {
+            // InternalFormalML.g:64664:2: ( ruleSignal )
+            // InternalFormalML.g:64665:3: ruleSignal
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_9_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_9_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__SignalAssignment_9_0_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__BufferAssignment_9_0_1_2"
+    // InternalFormalML.g:64674:1: rule__Statemachine__BufferAssignment_9_0_1_2 : ( ruleBuffer ) ;
+    public final void rule__Statemachine__BufferAssignment_9_0_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64678:1: ( ( ruleBuffer ) )
+            // InternalFormalML.g:64679:2: ( ruleBuffer )
+            {
+            // InternalFormalML.g:64679:2: ( ruleBuffer )
+            // InternalFormalML.g:64680:3: ruleBuffer
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_9_0_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_9_0_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__BufferAssignment_9_0_1_2"
+
+
+    // $ANTLR start "rule__Statemachine__ChannelAssignment_9_0_1_3"
+    // InternalFormalML.g:64689:1: rule__Statemachine__ChannelAssignment_9_0_1_3 : ( ruleChannel ) ;
+    public final void rule__Statemachine__ChannelAssignment_9_0_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64693:1: ( ( ruleChannel ) )
+            // InternalFormalML.g:64694:2: ( ruleChannel )
+            {
+            // InternalFormalML.g:64694:2: ( ruleChannel )
+            // InternalFormalML.g:64695:3: ruleChannel
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_9_0_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_9_0_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ChannelAssignment_9_0_1_3"
+
+
+    // $ANTLR start "rule__Statemachine__TypedefAssignment_9_0_1_4"
+    // InternalFormalML.g:64704:1: rule__Statemachine__TypedefAssignment_9_0_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Statemachine__TypedefAssignment_9_0_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64708:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:64709:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:64709:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:64710:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__TypedefAssignment_9_0_1_4"
+
+
+    // $ANTLR start "rule__Statemachine__PropertyAssignment_9_0_1_5"
+    // InternalFormalML.g:64719:1: rule__Statemachine__PropertyAssignment_9_0_1_5 : ( ruleVariable ) ;
+    public final void rule__Statemachine__PropertyAssignment_9_0_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64723:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:64724:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:64724:2: ( ruleVariable )
+            // InternalFormalML.g:64725:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_9_0_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_9_0_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PropertyAssignment_9_0_1_5"
+
+
+    // $ANTLR start "rule__Statemachine__PortAssignment_9_1_1_0"
+    // InternalFormalML.g:64734:1: rule__Statemachine__PortAssignment_9_1_1_0 : ( rulePortPublic ) ;
+    public final void rule__Statemachine__PortAssignment_9_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64738:1: ( ( rulePortPublic ) )
+            // InternalFormalML.g:64739:2: ( rulePortPublic )
+            {
+            // InternalFormalML.g:64739:2: ( rulePortPublic )
+            // InternalFormalML.g:64740:3: rulePortPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPortPortPublicParserRuleCall_9_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPortPortPublicParserRuleCall_9_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PortAssignment_9_1_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__SignalAssignment_9_1_1_1"
+    // InternalFormalML.g:64749:1: rule__Statemachine__SignalAssignment_9_1_1_1 : ( ruleSignalPublic ) ;
+    public final void rule__Statemachine__SignalAssignment_9_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64753:1: ( ( ruleSignalPublic ) )
+            // InternalFormalML.g:64754:2: ( ruleSignalPublic )
+            {
+            // InternalFormalML.g:64754:2: ( ruleSignalPublic )
+            // InternalFormalML.g:64755:3: ruleSignalPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__SignalAssignment_9_1_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__BufferAssignment_9_1_1_2"
+    // InternalFormalML.g:64764:1: rule__Statemachine__BufferAssignment_9_1_1_2 : ( ruleBufferPublic ) ;
+    public final void rule__Statemachine__BufferAssignment_9_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64768:1: ( ( ruleBufferPublic ) )
+            // InternalFormalML.g:64769:2: ( ruleBufferPublic )
+            {
+            // InternalFormalML.g:64769:2: ( ruleBufferPublic )
+            // InternalFormalML.g:64770:3: ruleBufferPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__BufferAssignment_9_1_1_2"
+
+
+    // $ANTLR start "rule__Statemachine__ChannelAssignment_9_1_1_3"
+    // InternalFormalML.g:64779:1: rule__Statemachine__ChannelAssignment_9_1_1_3 : ( ruleChannelPublic ) ;
+    public final void rule__Statemachine__ChannelAssignment_9_1_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64783:1: ( ( ruleChannelPublic ) )
+            // InternalFormalML.g:64784:2: ( ruleChannelPublic )
+            {
+            // InternalFormalML.g:64784:2: ( ruleChannelPublic )
+            // InternalFormalML.g:64785:3: ruleChannelPublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelPublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ChannelAssignment_9_1_1_3"
+
+
+    // $ANTLR start "rule__Statemachine__TypedefAssignment_9_1_1_4"
+    // InternalFormalML.g:64794:1: rule__Statemachine__TypedefAssignment_9_1_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Statemachine__TypedefAssignment_9_1_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64798:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:64799:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:64799:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:64800:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__TypedefAssignment_9_1_1_4"
+
+
+    // $ANTLR start "rule__Statemachine__PropertyAssignment_9_1_1_5"
+    // InternalFormalML.g:64809:1: rule__Statemachine__PropertyAssignment_9_1_1_5 : ( ruleVariablePublic ) ;
+    public final void rule__Statemachine__PropertyAssignment_9_1_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64813:1: ( ( ruleVariablePublic ) )
+            // InternalFormalML.g:64814:2: ( ruleVariablePublic )
+            {
+            // InternalFormalML.g:64814:2: ( ruleVariablePublic )
+            // InternalFormalML.g:64815:3: ruleVariablePublic
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariablePublic();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PropertyAssignment_9_1_1_5"
+
+
+    // $ANTLR start "rule__Statemachine__PortAssignment_9_2_1_0"
+    // InternalFormalML.g:64824:1: rule__Statemachine__PortAssignment_9_2_1_0 : ( rulePortProtected ) ;
+    public final void rule__Statemachine__PortAssignment_9_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64828:1: ( ( rulePortProtected ) )
+            // InternalFormalML.g:64829:2: ( rulePortProtected )
+            {
+            // InternalFormalML.g:64829:2: ( rulePortProtected )
+            // InternalFormalML.g:64830:3: rulePortProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PortAssignment_9_2_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__SignalAssignment_9_2_1_1"
+    // InternalFormalML.g:64839:1: rule__Statemachine__SignalAssignment_9_2_1_1 : ( ruleSignalProtected ) ;
+    public final void rule__Statemachine__SignalAssignment_9_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64843:1: ( ( ruleSignalProtected ) )
+            // InternalFormalML.g:64844:2: ( ruleSignalProtected )
+            {
+            // InternalFormalML.g:64844:2: ( ruleSignalProtected )
+            // InternalFormalML.g:64845:3: ruleSignalProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__SignalAssignment_9_2_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__BufferAssignment_9_2_1_2"
+    // InternalFormalML.g:64854:1: rule__Statemachine__BufferAssignment_9_2_1_2 : ( ruleBufferProtected ) ;
+    public final void rule__Statemachine__BufferAssignment_9_2_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64858:1: ( ( ruleBufferProtected ) )
+            // InternalFormalML.g:64859:2: ( ruleBufferProtected )
+            {
+            // InternalFormalML.g:64859:2: ( ruleBufferProtected )
+            // InternalFormalML.g:64860:3: ruleBufferProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__BufferAssignment_9_2_1_2"
+
+
+    // $ANTLR start "rule__Statemachine__ChannelAssignment_9_2_1_3"
+    // InternalFormalML.g:64869:1: rule__Statemachine__ChannelAssignment_9_2_1_3 : ( ruleChannelProtected ) ;
+    public final void rule__Statemachine__ChannelAssignment_9_2_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64873:1: ( ( ruleChannelProtected ) )
+            // InternalFormalML.g:64874:2: ( ruleChannelProtected )
+            {
+            // InternalFormalML.g:64874:2: ( ruleChannelProtected )
+            // InternalFormalML.g:64875:3: ruleChannelProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ChannelAssignment_9_2_1_3"
+
+
+    // $ANTLR start "rule__Statemachine__TypedefAssignment_9_2_1_4"
+    // InternalFormalML.g:64884:1: rule__Statemachine__TypedefAssignment_9_2_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Statemachine__TypedefAssignment_9_2_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64888:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:64889:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:64889:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:64890:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__TypedefAssignment_9_2_1_4"
+
+
+    // $ANTLR start "rule__Statemachine__PropertyAssignment_9_2_1_5"
+    // InternalFormalML.g:64899:1: rule__Statemachine__PropertyAssignment_9_2_1_5 : ( ruleVariableProtected ) ;
+    public final void rule__Statemachine__PropertyAssignment_9_2_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64903:1: ( ( ruleVariableProtected ) )
+            // InternalFormalML.g:64904:2: ( ruleVariableProtected )
+            {
+            // InternalFormalML.g:64904:2: ( ruleVariableProtected )
+            // InternalFormalML.g:64905:3: ruleVariableProtected
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariableProtected();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PropertyAssignment_9_2_1_5"
+
+
+    // $ANTLR start "rule__Statemachine__PortAssignment_9_3_1_0"
+    // InternalFormalML.g:64914:1: rule__Statemachine__PortAssignment_9_3_1_0 : ( rulePortPrivate ) ;
+    public final void rule__Statemachine__PortAssignment_9_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64918:1: ( ( rulePortPrivate ) )
+            // InternalFormalML.g:64919:2: ( rulePortPrivate )
+            {
+            // InternalFormalML.g:64919:2: ( rulePortPrivate )
+            // InternalFormalML.g:64920:3: rulePortPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePortPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PortAssignment_9_3_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__SignalAssignment_9_3_1_1"
+    // InternalFormalML.g:64929:1: rule__Statemachine__SignalAssignment_9_3_1_1 : ( ruleSignalPrivate ) ;
+    public final void rule__Statemachine__SignalAssignment_9_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64933:1: ( ( ruleSignalPrivate ) )
+            // InternalFormalML.g:64934:2: ( ruleSignalPrivate )
+            {
+            // InternalFormalML.g:64934:2: ( ruleSignalPrivate )
+            // InternalFormalML.g:64935:3: ruleSignalPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__SignalAssignment_9_3_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__BufferAssignment_9_3_1_2"
+    // InternalFormalML.g:64944:1: rule__Statemachine__BufferAssignment_9_3_1_2 : ( ruleBufferPrivate ) ;
+    public final void rule__Statemachine__BufferAssignment_9_3_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64948:1: ( ( ruleBufferPrivate ) )
+            // InternalFormalML.g:64949:2: ( ruleBufferPrivate )
+            {
+            // InternalFormalML.g:64949:2: ( ruleBufferPrivate )
+            // InternalFormalML.g:64950:3: ruleBufferPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__BufferAssignment_9_3_1_2"
+
+
+    // $ANTLR start "rule__Statemachine__ChannelAssignment_9_3_1_3"
+    // InternalFormalML.g:64959:1: rule__Statemachine__ChannelAssignment_9_3_1_3 : ( ruleChannelPrivate ) ;
+    public final void rule__Statemachine__ChannelAssignment_9_3_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64963:1: ( ( ruleChannelPrivate ) )
+            // InternalFormalML.g:64964:2: ( ruleChannelPrivate )
+            {
+            // InternalFormalML.g:64964:2: ( ruleChannelPrivate )
+            // InternalFormalML.g:64965:3: ruleChannelPrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelPrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ChannelAssignment_9_3_1_3"
+
+
+    // $ANTLR start "rule__Statemachine__TypedefAssignment_9_3_1_4"
+    // InternalFormalML.g:64974:1: rule__Statemachine__TypedefAssignment_9_3_1_4 : ( ruleTypeDefinition ) ;
+    public final void rule__Statemachine__TypedefAssignment_9_3_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64978:1: ( ( ruleTypeDefinition ) )
+            // InternalFormalML.g:64979:2: ( ruleTypeDefinition )
+            {
+            // InternalFormalML.g:64979:2: ( ruleTypeDefinition )
+            // InternalFormalML.g:64980:3: ruleTypeDefinition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__TypedefAssignment_9_3_1_4"
+
+
+    // $ANTLR start "rule__Statemachine__PropertyAssignment_9_3_1_5"
+    // InternalFormalML.g:64989:1: rule__Statemachine__PropertyAssignment_9_3_1_5 : ( ruleVariablePrivate ) ;
+    public final void rule__Statemachine__PropertyAssignment_9_3_1_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:64993:1: ( ( ruleVariablePrivate ) )
+            // InternalFormalML.g:64994:2: ( ruleVariablePrivate )
+            {
+            // InternalFormalML.g:64994:2: ( ruleVariablePrivate )
+            // InternalFormalML.g:64995:3: ruleVariablePrivate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariablePrivate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__PropertyAssignment_9_3_1_5"
+
+
+    // $ANTLR start "rule__Statemachine__RoutineAssignment_10_0_0_1"
+    // InternalFormalML.g:65004:1: rule__Statemachine__RoutineAssignment_10_0_0_1 : ( ruleRoutine ) ;
+    public final void rule__Statemachine__RoutineAssignment_10_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65008:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:65009:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:65009:2: ( ruleRoutine )
+            // InternalFormalML.g:65010:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__RoutineAssignment_10_0_0_1"
+
+
+    // $ANTLR start "rule__Statemachine__ProcedureAssignment_10_0_1_1"
+    // InternalFormalML.g:65019:1: rule__Statemachine__ProcedureAssignment_10_0_1_1 : ( ruleProcedure ) ;
+    public final void rule__Statemachine__ProcedureAssignment_10_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65023:1: ( ( ruleProcedure ) )
+            // InternalFormalML.g:65024:2: ( ruleProcedure )
+            {
+            // InternalFormalML.g:65024:2: ( ruleProcedure )
+            // InternalFormalML.g:65025:3: ruleProcedure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ProcedureAssignment_10_0_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__RoutineAssignment_10_1_0"
+    // InternalFormalML.g:65034:1: rule__Statemachine__RoutineAssignment_10_1_0 : ( ruleRoutine ) ;
+    public final void rule__Statemachine__RoutineAssignment_10_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65038:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:65039:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:65039:2: ( ruleRoutine )
+            // InternalFormalML.g:65040:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__RoutineAssignment_10_1_0"
+
+
+    // $ANTLR start "rule__Statemachine__ProcedureAssignment_10_1_1"
+    // InternalFormalML.g:65049:1: rule__Statemachine__ProcedureAssignment_10_1_1 : ( ruleProcedure ) ;
+    public final void rule__Statemachine__ProcedureAssignment_10_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65053:1: ( ( ruleProcedure ) )
+            // InternalFormalML.g:65054:2: ( ruleProcedure )
+            {
+            // InternalFormalML.g:65054:2: ( ruleProcedure )
+            // InternalFormalML.g:65055:3: ruleProcedure
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ProcedureAssignment_10_1_1"
+
+
+    // $ANTLR start "rule__Statemachine__RegionAssignment_11_0"
+    // InternalFormalML.g:65064:1: rule__Statemachine__RegionAssignment_11_0 : ( ruleStatemachineRegion ) ;
+    public final void rule__Statemachine__RegionAssignment_11_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65068:1: ( ( ruleStatemachineRegion ) )
+            // InternalFormalML.g:65069:2: ( ruleStatemachineRegion )
+            {
+            // InternalFormalML.g:65069:2: ( ruleStatemachineRegion )
+            // InternalFormalML.g:65070:3: ruleStatemachineRegion
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionParserRuleCall_11_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatemachineRegion();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionParserRuleCall_11_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__RegionAssignment_11_0"
+
+
+    // $ANTLR start "rule__Statemachine__RegionAssignment_11_1"
+    // InternalFormalML.g:65079:1: rule__Statemachine__RegionAssignment_11_1 : ( ruleStatemachineRegionLite ) ;
+    public final void rule__Statemachine__RegionAssignment_11_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65083:1: ( ( ruleStatemachineRegionLite ) )
+            // InternalFormalML.g:65084:2: ( ruleStatemachineRegionLite )
+            {
+            // InternalFormalML.g:65084:2: ( ruleStatemachineRegionLite )
+            // InternalFormalML.g:65085:3: ruleStatemachineRegionLite
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatemachineRegionLite();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__RegionAssignment_11_1"
+
+
+    // $ANTLR start "rule__Statemachine__ExecutionAssignment_12_0"
+    // InternalFormalML.g:65094:1: rule__Statemachine__ExecutionAssignment_12_0 : ( ruleModelOfExecution ) ;
+    public final void rule__Statemachine__ExecutionAssignment_12_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65098:1: ( ( ruleModelOfExecution ) )
+            // InternalFormalML.g:65099:2: ( ruleModelOfExecution )
+            {
+            // InternalFormalML.g:65099:2: ( ruleModelOfExecution )
+            // InternalFormalML.g:65100:3: ruleModelOfExecution
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getExecutionModelOfExecutionParserRuleCall_12_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModelOfExecution();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getExecutionModelOfExecutionParserRuleCall_12_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__ExecutionAssignment_12_0"
+
+
+    // $ANTLR start "rule__Statemachine__InteractionAssignment_12_1"
+    // InternalFormalML.g:65109:1: rule__Statemachine__InteractionAssignment_12_1 : ( ruleModelOfInteraction ) ;
+    public final void rule__Statemachine__InteractionAssignment_12_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65113:1: ( ( ruleModelOfInteraction ) )
+            // InternalFormalML.g:65114:2: ( ruleModelOfInteraction )
+            {
+            // InternalFormalML.g:65114:2: ( ruleModelOfInteraction )
+            // InternalFormalML.g:65115:3: ruleModelOfInteraction
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineAccess().getInteractionModelOfInteractionParserRuleCall_12_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModelOfInteraction();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineAccess().getInteractionModelOfInteractionParserRuleCall_12_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Statemachine__InteractionAssignment_12_1"
+
+
+    // $ANTLR start "rule__StatemachineRegion__NameAssignment_1_1_1"
+    // InternalFormalML.g:65124:1: rule__StatemachineRegion__NameAssignment_1_1_1 : ( ruleESIdentifier ) ;
+    public final void rule__StatemachineRegion__NameAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65128:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:65129:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:65129:2: ( ruleESIdentifier )
+            // InternalFormalML.g:65130:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getNameESIdentifierParserRuleCall_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getNameESIdentifierParserRuleCall_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__NameAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2"
+    // InternalFormalML.g:65139:1: rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65143:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:65144:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:65144:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:65145:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__UnrestrictedNameAssignment_1_1_2"
+
+
+    // $ANTLR start "rule__StatemachineRegion__VertexAssignment_2_0"
+    // InternalFormalML.g:65154:1: rule__StatemachineRegion__VertexAssignment_2_0 : ( ruleState ) ;
+    public final void rule__StatemachineRegion__VertexAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65158:1: ( ( ruleState ) )
+            // InternalFormalML.g:65159:2: ( ruleState )
+            {
+            // InternalFormalML.g:65159:2: ( ruleState )
+            // InternalFormalML.g:65160:3: ruleState
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getVertexStateParserRuleCall_2_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleState();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getVertexStateParserRuleCall_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__VertexAssignment_2_0"
+
+
+    // $ANTLR start "rule__StatemachineRegion__VertexAssignment_2_1"
+    // InternalFormalML.g:65169:1: rule__StatemachineRegion__VertexAssignment_2_1 : ( rulePseudostate ) ;
+    public final void rule__StatemachineRegion__VertexAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65173:1: ( ( rulePseudostate ) )
+            // InternalFormalML.g:65174:2: ( rulePseudostate )
+            {
+            // InternalFormalML.g:65174:2: ( rulePseudostate )
+            // InternalFormalML.g:65175:3: rulePseudostate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionAccess().getVertexPseudostateParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePseudostate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionAccess().getVertexPseudostateParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegion__VertexAssignment_2_1"
+
+
+    // $ANTLR start "rule__StatemachineRegionLite__VertexAssignment_0"
+    // InternalFormalML.g:65184:1: rule__StatemachineRegionLite__VertexAssignment_0 : ( ruleState ) ;
+    public final void rule__StatemachineRegionLite__VertexAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65188:1: ( ( ruleState ) )
+            // InternalFormalML.g:65189:2: ( ruleState )
+            {
+            // InternalFormalML.g:65189:2: ( ruleState )
+            // InternalFormalML.g:65190:3: ruleState
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionLiteAccess().getVertexStateParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleState();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionLiteAccess().getVertexStateParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegionLite__VertexAssignment_0"
+
+
+    // $ANTLR start "rule__StatemachineRegionLite__VertexAssignment_1"
+    // InternalFormalML.g:65199:1: rule__StatemachineRegionLite__VertexAssignment_1 : ( rulePseudostate ) ;
+    public final void rule__StatemachineRegionLite__VertexAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65203:1: ( ( rulePseudostate ) )
+            // InternalFormalML.g:65204:2: ( rulePseudostate )
+            {
+            // InternalFormalML.g:65204:2: ( rulePseudostate )
+            // InternalFormalML.g:65205:3: rulePseudostate
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStatemachineRegionLiteAccess().getVertexPseudostateParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePseudostate();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStatemachineRegionLiteAccess().getVertexPseudostateParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StatemachineRegionLite__VertexAssignment_1"
+
+
+    // $ANTLR start "rule__CompositeState__CompositeAssignment_1"
+    // InternalFormalML.g:65214:1: rule__CompositeState__CompositeAssignment_1 : ( ( 'state' ) ) ;
+    public final void rule__CompositeState__CompositeAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65218:1: ( ( ( 'state' ) ) )
+            // InternalFormalML.g:65219:2: ( ( 'state' ) )
+            {
+            // InternalFormalML.g:65219:2: ( ( 'state' ) )
+            // InternalFormalML.g:65220:3: ( 'state' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0()); 
+            }
+            // InternalFormalML.g:65221:3: ( 'state' )
+            // InternalFormalML.g:65222:4: 'state'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0()); 
+            }
+            match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__CompositeAssignment_1"
+
+
+    // $ANTLR start "rule__CompositeState__OrthogonalAssignment_4_1"
+    // InternalFormalML.g:65233:1: rule__CompositeState__OrthogonalAssignment_4_1 : ( ( 'and' ) ) ;
+    public final void rule__CompositeState__OrthogonalAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65237:1: ( ( ( 'and' ) ) )
+            // InternalFormalML.g:65238:2: ( ( 'and' ) )
+            {
+            // InternalFormalML.g:65238:2: ( ( 'and' ) )
+            // InternalFormalML.g:65239:3: ( 'and' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0()); 
+            }
+            // InternalFormalML.g:65240:3: ( 'and' )
+            // InternalFormalML.g:65241:4: 'and'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0()); 
+            }
+            match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__OrthogonalAssignment_4_1"
+
+
+    // $ANTLR start "rule__CompositeState__NameAssignment_6"
+    // InternalFormalML.g:65252:1: rule__CompositeState__NameAssignment_6 : ( ruleESIdentifier ) ;
+    public final void rule__CompositeState__NameAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65256:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:65257:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:65257:2: ( ruleESIdentifier )
+            // InternalFormalML.g:65258:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getNameESIdentifierParserRuleCall_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getNameESIdentifierParserRuleCall_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__NameAssignment_6"
+
+
+    // $ANTLR start "rule__CompositeState__UnrestrictedNameAssignment_7"
+    // InternalFormalML.g:65267:1: rule__CompositeState__UnrestrictedNameAssignment_7 : ( ruleUnrestrictedName ) ;
+    public final void rule__CompositeState__UnrestrictedNameAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65271:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:65272:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:65272:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:65273:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__UnrestrictedNameAssignment_7"
+
+
+    // $ANTLR start "rule__CompositeState__RegionAssignment_8_0_1_0_0"
+    // InternalFormalML.g:65282:1: rule__CompositeState__RegionAssignment_8_0_1_0_0 : ( ruleStatemachineRegion ) ;
+    public final void rule__CompositeState__RegionAssignment_8_0_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65286:1: ( ( ruleStatemachineRegion ) )
+            // InternalFormalML.g:65287:2: ( ruleStatemachineRegion )
+            {
+            // InternalFormalML.g:65287:2: ( ruleStatemachineRegion )
+            // InternalFormalML.g:65288:3: ruleStatemachineRegion
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatemachineRegion();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__RegionAssignment_8_0_1_0_0"
+
+
+    // $ANTLR start "rule__CompositeState__MoeAssignment_8_0_1_0_1_1"
+    // InternalFormalML.g:65297:1: rule__CompositeState__MoeAssignment_8_0_1_0_1_1 : ( rulemoeCompositeStateRoutines ) ;
+    public final void rule__CompositeState__MoeAssignment_8_0_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65301:1: ( ( rulemoeCompositeStateRoutines ) )
+            // InternalFormalML.g:65302:2: ( rulemoeCompositeStateRoutines )
+            {
+            // InternalFormalML.g:65302:2: ( rulemoeCompositeStateRoutines )
+            // InternalFormalML.g:65303:3: rulemoeCompositeStateRoutines
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeCompositeStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__MoeAssignment_8_0_1_0_1_1"
+
+
+    // $ANTLR start "rule__CompositeState__TransitionAssignment_8_0_1_0_2_1"
+    // InternalFormalML.g:65312:1: rule__CompositeState__TransitionAssignment_8_0_1_0_2_1 : ( ruleTransition ) ;
+    public final void rule__CompositeState__TransitionAssignment_8_0_1_0_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65316:1: ( ( ruleTransition ) )
+            // InternalFormalML.g:65317:2: ( ruleTransition )
+            {
+            // InternalFormalML.g:65317:2: ( ruleTransition )
+            // InternalFormalML.g:65318:3: ruleTransition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_0_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_0_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__TransitionAssignment_8_0_1_0_2_1"
+
+
+    // $ANTLR start "rule__CompositeState__RegionAssignment_8_0_1_1_0"
+    // InternalFormalML.g:65327:1: rule__CompositeState__RegionAssignment_8_0_1_1_0 : ( ruleStatemachineRegionLite ) ;
+    public final void rule__CompositeState__RegionAssignment_8_0_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65331:1: ( ( ruleStatemachineRegionLite ) )
+            // InternalFormalML.g:65332:2: ( ruleStatemachineRegionLite )
+            {
+            // InternalFormalML.g:65332:2: ( ruleStatemachineRegionLite )
+            // InternalFormalML.g:65333:3: ruleStatemachineRegionLite
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatemachineRegionLite();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__RegionAssignment_8_0_1_1_0"
+
+
+    // $ANTLR start "rule__CompositeState__TransitionAssignment_8_0_1_1_1_0"
+    // InternalFormalML.g:65342:1: rule__CompositeState__TransitionAssignment_8_0_1_1_1_0 : ( ruleTransition ) ;
+    public final void rule__CompositeState__TransitionAssignment_8_0_1_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65346:1: ( ( ruleTransition ) )
+            // InternalFormalML.g:65347:2: ( ruleTransition )
+            {
+            // InternalFormalML.g:65347:2: ( ruleTransition )
+            // InternalFormalML.g:65348:3: ruleTransition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__TransitionAssignment_8_0_1_1_1_0"
+
+
+    // $ANTLR start "rule__CompositeState__MoeAssignment_8_0_1_1_1_1"
+    // InternalFormalML.g:65357:1: rule__CompositeState__MoeAssignment_8_0_1_1_1_1 : ( rulemoeCompositeStateRoutines ) ;
+    public final void rule__CompositeState__MoeAssignment_8_0_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65361:1: ( ( rulemoeCompositeStateRoutines ) )
+            // InternalFormalML.g:65362:2: ( rulemoeCompositeStateRoutines )
+            {
+            // InternalFormalML.g:65362:2: ( rulemoeCompositeStateRoutines )
+            // InternalFormalML.g:65363:3: rulemoeCompositeStateRoutines
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeCompositeStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CompositeState__MoeAssignment_8_0_1_1_1_1"
+
+
+    // $ANTLR start "rule__MoeCompositeStateRoutines__NameAssignment_1"
+    // InternalFormalML.g:65372:1: rule__MoeCompositeStateRoutines__NameAssignment_1 : ( ( rule__MoeCompositeStateRoutines__NameAlternatives_1_0 ) ) ;
+    public final void rule__MoeCompositeStateRoutines__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65376:1: ( ( ( rule__MoeCompositeStateRoutines__NameAlternatives_1_0 ) ) )
+            // InternalFormalML.g:65377:2: ( ( rule__MoeCompositeStateRoutines__NameAlternatives_1_0 ) )
+            {
+            // InternalFormalML.g:65377:2: ( ( rule__MoeCompositeStateRoutines__NameAlternatives_1_0 ) )
+            // InternalFormalML.g:65378:3: ( rule__MoeCompositeStateRoutines__NameAlternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAlternatives_1_0()); 
+            }
+            // InternalFormalML.g:65379:3: ( rule__MoeCompositeStateRoutines__NameAlternatives_1_0 )
+            // InternalFormalML.g:65379:4: rule__MoeCompositeStateRoutines__NameAlternatives_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeCompositeStateRoutines__NameAlternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeCompositeStateRoutinesAccess().getNameAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeCompositeStateRoutines__NameAssignment_1"
+
+
+    // $ANTLR start "rule__MoeCompositeStateRoutines__BodyBlockAssignment_2"
+    // InternalFormalML.g:65387:1: rule__MoeCompositeStateRoutines__BodyBlockAssignment_2 : ( ruleBlockStatement ) ;
+    public final void rule__MoeCompositeStateRoutines__BodyBlockAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65391:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:65392:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:65392:2: ( ruleBlockStatement )
+            // InternalFormalML.g:65393:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeCompositeStateRoutines__BodyBlockAssignment_2"
+
+
+    // $ANTLR start "rule__SimpleState__SimpleAssignment_1"
+    // InternalFormalML.g:65402:1: rule__SimpleState__SimpleAssignment_1 : ( ( 'state' ) ) ;
+    public final void rule__SimpleState__SimpleAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65406:1: ( ( ( 'state' ) ) )
+            // InternalFormalML.g:65407:2: ( ( 'state' ) )
+            {
+            // InternalFormalML.g:65407:2: ( ( 'state' ) )
+            // InternalFormalML.g:65408:3: ( 'state' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0()); 
+            }
+            // InternalFormalML.g:65409:3: ( 'state' )
+            // InternalFormalML.g:65410:4: 'state'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0()); 
+            }
+            match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__SimpleAssignment_1"
+
+
+    // $ANTLR start "rule__SimpleState__NameAssignment_3"
+    // InternalFormalML.g:65421:1: rule__SimpleState__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__SimpleState__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65425:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:65426:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:65426:2: ( ruleESIdentifier )
+            // InternalFormalML.g:65427:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__NameAssignment_3"
+
+
+    // $ANTLR start "rule__SimpleState__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:65436:1: rule__SimpleState__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__SimpleState__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65440:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:65441:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:65441:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:65442:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__SimpleState__TransitionAssignment_5_0_1_0"
+    // InternalFormalML.g:65451:1: rule__SimpleState__TransitionAssignment_5_0_1_0 : ( ruleTransition ) ;
+    public final void rule__SimpleState__TransitionAssignment_5_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65455:1: ( ( ruleTransition ) )
+            // InternalFormalML.g:65456:2: ( ruleTransition )
+            {
+            // InternalFormalML.g:65456:2: ( ruleTransition )
+            // InternalFormalML.g:65457:3: ruleTransition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getTransitionTransitionParserRuleCall_5_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getTransitionTransitionParserRuleCall_5_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__TransitionAssignment_5_0_1_0"
+
+
+    // $ANTLR start "rule__SimpleState__MoeAssignment_5_0_1_1"
+    // InternalFormalML.g:65466:1: rule__SimpleState__MoeAssignment_5_0_1_1 : ( rulemoeSimpleStateRoutines ) ;
+    public final void rule__SimpleState__MoeAssignment_5_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65470:1: ( ( rulemoeSimpleStateRoutines ) )
+            // InternalFormalML.g:65471:2: ( rulemoeSimpleStateRoutines )
+            {
+            // InternalFormalML.g:65471:2: ( rulemoeSimpleStateRoutines )
+            // InternalFormalML.g:65472:3: rulemoeSimpleStateRoutines
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSimpleStateAccess().getMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeSimpleStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSimpleStateAccess().getMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SimpleState__MoeAssignment_5_0_1_1"
+
+
+    // $ANTLR start "rule__MoeSimpleStateRoutines__NameAssignment_1"
+    // InternalFormalML.g:65481:1: rule__MoeSimpleStateRoutines__NameAssignment_1 : ( ( rule__MoeSimpleStateRoutines__NameAlternatives_1_0 ) ) ;
+    public final void rule__MoeSimpleStateRoutines__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65485:1: ( ( ( rule__MoeSimpleStateRoutines__NameAlternatives_1_0 ) ) )
+            // InternalFormalML.g:65486:2: ( ( rule__MoeSimpleStateRoutines__NameAlternatives_1_0 ) )
+            {
+            // InternalFormalML.g:65486:2: ( ( rule__MoeSimpleStateRoutines__NameAlternatives_1_0 ) )
+            // InternalFormalML.g:65487:3: ( rule__MoeSimpleStateRoutines__NameAlternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAlternatives_1_0()); 
+            }
+            // InternalFormalML.g:65488:3: ( rule__MoeSimpleStateRoutines__NameAlternatives_1_0 )
+            // InternalFormalML.g:65488:4: rule__MoeSimpleStateRoutines__NameAlternatives_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeSimpleStateRoutines__NameAlternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeSimpleStateRoutinesAccess().getNameAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeSimpleStateRoutines__NameAssignment_1"
+
+
+    // $ANTLR start "rule__MoeSimpleStateRoutines__BodyBlockAssignment_2"
+    // InternalFormalML.g:65496:1: rule__MoeSimpleStateRoutines__BodyBlockAssignment_2 : ( ruleBlockStatement ) ;
+    public final void rule__MoeSimpleStateRoutines__BodyBlockAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65500:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:65501:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:65501:2: ( ruleBlockStatement )
+            // InternalFormalML.g:65502:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeSimpleStateRoutines__BodyBlockAssignment_2"
+
+
+    // $ANTLR start "rule__StartState__SimpleAssignment_1_0_0"
+    // InternalFormalML.g:65511:1: rule__StartState__SimpleAssignment_1_0_0 : ( ( 'state' ) ) ;
+    public final void rule__StartState__SimpleAssignment_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65515:1: ( ( ( 'state' ) ) )
+            // InternalFormalML.g:65516:2: ( ( 'state' ) )
+            {
+            // InternalFormalML.g:65516:2: ( ( 'state' ) )
+            // InternalFormalML.g:65517:3: ( 'state' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0()); 
+            }
+            // InternalFormalML.g:65518:3: ( 'state' )
+            // InternalFormalML.g:65519:4: 'state'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0()); 
+            }
+            match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__SimpleAssignment_1_0_0"
+
+
+    // $ANTLR start "rule__StartState__NameAssignment_1_0_5"
+    // InternalFormalML.g:65530:1: rule__StartState__NameAssignment_1_0_5 : ( ruleESIdentifier ) ;
+    public final void rule__StartState__NameAssignment_1_0_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65534:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:65535:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:65535:2: ( ruleESIdentifier )
+            // InternalFormalML.g:65536:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__NameAssignment_1_0_5"
+
+
+    // $ANTLR start "rule__StartState__SimpleAssignment_1_1"
+    // InternalFormalML.g:65545:1: rule__StartState__SimpleAssignment_1_1 : ( ( '#start' ) ) ;
+    public final void rule__StartState__SimpleAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65549:1: ( ( ( '#start' ) ) )
+            // InternalFormalML.g:65550:2: ( ( '#start' ) )
+            {
+            // InternalFormalML.g:65550:2: ( ( '#start' ) )
+            // InternalFormalML.g:65551:3: ( '#start' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:65552:3: ( '#start' )
+            // InternalFormalML.g:65553:4: '#start'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0()); 
+            }
+            match(input,275,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__SimpleAssignment_1_1"
+
+
+    // $ANTLR start "rule__StartState__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:65564:1: rule__StartState__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__StartState__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65568:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:65569:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:65569:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:65570:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__StartState__TransitionAssignment_3_0_1_0"
+    // InternalFormalML.g:65579:1: rule__StartState__TransitionAssignment_3_0_1_0 : ( ruleTransition ) ;
+    public final void rule__StartState__TransitionAssignment_3_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65583:1: ( ( ruleTransition ) )
+            // InternalFormalML.g:65584:2: ( ruleTransition )
+            {
+            // InternalFormalML.g:65584:2: ( ruleTransition )
+            // InternalFormalML.g:65585:3: ruleTransition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getTransitionTransitionParserRuleCall_3_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getTransitionTransitionParserRuleCall_3_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__TransitionAssignment_3_0_1_0"
+
+
+    // $ANTLR start "rule__StartState__MoeAssignment_3_0_1_1"
+    // InternalFormalML.g:65594:1: rule__StartState__MoeAssignment_3_0_1_1 : ( rulemoeStartStateRoutines ) ;
+    public final void rule__StartState__MoeAssignment_3_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65598:1: ( ( rulemoeStartStateRoutines ) )
+            // InternalFormalML.g:65599:2: ( rulemoeStartStateRoutines )
+            {
+            // InternalFormalML.g:65599:2: ( rulemoeStartStateRoutines )
+            // InternalFormalML.g:65600:3: rulemoeStartStateRoutines
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStartStateAccess().getMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeStartStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStartStateAccess().getMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StartState__MoeAssignment_3_0_1_1"
+
+
+    // $ANTLR start "rule__MoeStartStateRoutines__NameAssignment_1"
+    // InternalFormalML.g:65609:1: rule__MoeStartStateRoutines__NameAssignment_1 : ( ( rule__MoeStartStateRoutines__NameAlternatives_1_0 ) ) ;
+    public final void rule__MoeStartStateRoutines__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65613:1: ( ( ( rule__MoeStartStateRoutines__NameAlternatives_1_0 ) ) )
+            // InternalFormalML.g:65614:2: ( ( rule__MoeStartStateRoutines__NameAlternatives_1_0 ) )
+            {
+            // InternalFormalML.g:65614:2: ( ( rule__MoeStartStateRoutines__NameAlternatives_1_0 ) )
+            // InternalFormalML.g:65615:3: ( rule__MoeStartStateRoutines__NameAlternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeStartStateRoutinesAccess().getNameAlternatives_1_0()); 
+            }
+            // InternalFormalML.g:65616:3: ( rule__MoeStartStateRoutines__NameAlternatives_1_0 )
+            // InternalFormalML.g:65616:4: rule__MoeStartStateRoutines__NameAlternatives_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeStartStateRoutines__NameAlternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeStartStateRoutinesAccess().getNameAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeStartStateRoutines__NameAssignment_1"
+
+
+    // $ANTLR start "rule__MoeStartStateRoutines__BodyBlockAssignment_2"
+    // InternalFormalML.g:65624:1: rule__MoeStartStateRoutines__BodyBlockAssignment_2 : ( ruleBlockStatement ) ;
+    public final void rule__MoeStartStateRoutines__BodyBlockAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65628:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:65629:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:65629:2: ( ruleBlockStatement )
+            // InternalFormalML.g:65630:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeStartStateRoutines__BodyBlockAssignment_2"
+
+
+    // $ANTLR start "rule__FinalState__SimpleAssignment_1_0_0"
+    // InternalFormalML.g:65639:1: rule__FinalState__SimpleAssignment_1_0_0 : ( ( 'state' ) ) ;
+    public final void rule__FinalState__SimpleAssignment_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65643:1: ( ( ( 'state' ) ) )
+            // InternalFormalML.g:65644:2: ( ( 'state' ) )
+            {
+            // InternalFormalML.g:65644:2: ( ( 'state' ) )
+            // InternalFormalML.g:65645:3: ( 'state' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0()); 
+            }
+            // InternalFormalML.g:65646:3: ( 'state' )
+            // InternalFormalML.g:65647:4: 'state'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0()); 
+            }
+            match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__SimpleAssignment_1_0_0"
+
+
+    // $ANTLR start "rule__FinalState__NameAssignment_1_0_5"
+    // InternalFormalML.g:65658:1: rule__FinalState__NameAssignment_1_0_5 : ( ruleESIdentifier ) ;
+    public final void rule__FinalState__NameAssignment_1_0_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65662:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:65663:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:65663:2: ( ruleESIdentifier )
+            // InternalFormalML.g:65664:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__NameAssignment_1_0_5"
+
+
+    // $ANTLR start "rule__FinalState__SimpleAssignment_1_1"
+    // InternalFormalML.g:65673:1: rule__FinalState__SimpleAssignment_1_1 : ( ( '#final' ) ) ;
+    public final void rule__FinalState__SimpleAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65677:1: ( ( ( '#final' ) ) )
+            // InternalFormalML.g:65678:2: ( ( '#final' ) )
+            {
+            // InternalFormalML.g:65678:2: ( ( '#final' ) )
+            // InternalFormalML.g:65679:3: ( '#final' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:65680:3: ( '#final' )
+            // InternalFormalML.g:65681:4: '#final'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0()); 
+            }
+            match(input,276,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__SimpleAssignment_1_1"
+
+
+    // $ANTLR start "rule__FinalState__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:65692:1: rule__FinalState__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__FinalState__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65696:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:65697:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:65697:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:65698:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__FinalState__MoeAssignment_3_0_1"
+    // InternalFormalML.g:65707:1: rule__FinalState__MoeAssignment_3_0_1 : ( rulemoeFinalStateRoutines ) ;
+    public final void rule__FinalState__MoeAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65711:1: ( ( rulemoeFinalStateRoutines ) )
+            // InternalFormalML.g:65712:2: ( rulemoeFinalStateRoutines )
+            {
+            // InternalFormalML.g:65712:2: ( rulemoeFinalStateRoutines )
+            // InternalFormalML.g:65713:3: rulemoeFinalStateRoutines
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFinalStateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeFinalStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFinalStateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FinalState__MoeAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__MoeFinalStateRoutines__NameAssignment_1"
+    // InternalFormalML.g:65722:1: rule__MoeFinalStateRoutines__NameAssignment_1 : ( ( rule__MoeFinalStateRoutines__NameAlternatives_1_0 ) ) ;
+    public final void rule__MoeFinalStateRoutines__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65726:1: ( ( ( rule__MoeFinalStateRoutines__NameAlternatives_1_0 ) ) )
+            // InternalFormalML.g:65727:2: ( ( rule__MoeFinalStateRoutines__NameAlternatives_1_0 ) )
+            {
+            // InternalFormalML.g:65727:2: ( ( rule__MoeFinalStateRoutines__NameAlternatives_1_0 ) )
+            // InternalFormalML.g:65728:3: ( rule__MoeFinalStateRoutines__NameAlternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAlternatives_1_0()); 
+            }
+            // InternalFormalML.g:65729:3: ( rule__MoeFinalStateRoutines__NameAlternatives_1_0 )
+            // InternalFormalML.g:65729:4: rule__MoeFinalStateRoutines__NameAlternatives_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MoeFinalStateRoutines__NameAlternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeFinalStateRoutinesAccess().getNameAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeFinalStateRoutines__NameAssignment_1"
+
+
+    // $ANTLR start "rule__MoeFinalStateRoutines__BodyBlockAssignment_2"
+    // InternalFormalML.g:65737:1: rule__MoeFinalStateRoutines__BodyBlockAssignment_2 : ( ruleBlockStatement ) ;
+    public final void rule__MoeFinalStateRoutines__BodyBlockAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65741:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:65742:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:65742:2: ( ruleBlockStatement )
+            // InternalFormalML.g:65743:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeFinalStateRoutines__BodyBlockAssignment_2"
+
+
+    // $ANTLR start "rule__OtherPseudostate__KindAssignment_4"
+    // InternalFormalML.g:65752:1: rule__OtherPseudostate__KindAssignment_4 : ( rulePseudostateKind ) ;
+    public final void rule__OtherPseudostate__KindAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65756:1: ( ( rulePseudostateKind ) )
+            // InternalFormalML.g:65757:2: ( rulePseudostateKind )
+            {
+            // InternalFormalML.g:65757:2: ( rulePseudostateKind )
+            // InternalFormalML.g:65758:3: rulePseudostateKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getKindPseudostateKindEnumRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePseudostateKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getKindPseudostateKindEnumRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__KindAssignment_4"
+
+
+    // $ANTLR start "rule__OtherPseudostate__NameAssignment_6"
+    // InternalFormalML.g:65767:1: rule__OtherPseudostate__NameAssignment_6 : ( ruleESIdentifier ) ;
+    public final void rule__OtherPseudostate__NameAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65771:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:65772:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:65772:2: ( ruleESIdentifier )
+            // InternalFormalML.g:65773:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getNameESIdentifierParserRuleCall_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getNameESIdentifierParserRuleCall_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__NameAssignment_6"
+
+
+    // $ANTLR start "rule__OtherPseudostate__UnrestrictedNameAssignment_7"
+    // InternalFormalML.g:65782:1: rule__OtherPseudostate__UnrestrictedNameAssignment_7 : ( ruleUnrestrictedName ) ;
+    public final void rule__OtherPseudostate__UnrestrictedNameAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65786:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:65787:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:65787:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:65788:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__UnrestrictedNameAssignment_7"
+
+
+    // $ANTLR start "rule__OtherPseudostate__TransitionAssignment_8_0_1"
+    // InternalFormalML.g:65797:1: rule__OtherPseudostate__TransitionAssignment_8_0_1 : ( ruleTransition ) ;
+    public final void rule__OtherPseudostate__TransitionAssignment_8_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65801:1: ( ( ruleTransition ) )
+            // InternalFormalML.g:65802:2: ( ruleTransition )
+            {
+            // InternalFormalML.g:65802:2: ( ruleTransition )
+            // InternalFormalML.g:65803:3: ruleTransition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherPseudostateAccess().getTransitionTransitionParserRuleCall_8_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherPseudostateAccess().getTransitionTransitionParserRuleCall_8_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherPseudostate__TransitionAssignment_8_0_1"
+
+
+    // $ANTLR start "rule__PseudostateInitial__KindAssignment_1_0_3"
+    // InternalFormalML.g:65812:1: rule__PseudostateInitial__KindAssignment_1_0_3 : ( rulePseudostateInitialKind ) ;
+    public final void rule__PseudostateInitial__KindAssignment_1_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65816:1: ( ( rulePseudostateInitialKind ) )
+            // InternalFormalML.g:65817:2: ( rulePseudostateInitialKind )
+            {
+            // InternalFormalML.g:65817:2: ( rulePseudostateInitialKind )
+            // InternalFormalML.g:65818:3: rulePseudostateInitialKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getKindPseudostateInitialKindEnumRuleCall_1_0_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePseudostateInitialKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getKindPseudostateInitialKindEnumRuleCall_1_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__KindAssignment_1_0_3"
+
+
+    // $ANTLR start "rule__PseudostateInitial__NameAssignment_1_0_5"
+    // InternalFormalML.g:65827:1: rule__PseudostateInitial__NameAssignment_1_0_5 : ( ( rule__PseudostateInitial__NameAlternatives_1_0_5_0 ) ) ;
+    public final void rule__PseudostateInitial__NameAssignment_1_0_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65831:1: ( ( ( rule__PseudostateInitial__NameAlternatives_1_0_5_0 ) ) )
+            // InternalFormalML.g:65832:2: ( ( rule__PseudostateInitial__NameAlternatives_1_0_5_0 ) )
+            {
+            // InternalFormalML.g:65832:2: ( ( rule__PseudostateInitial__NameAlternatives_1_0_5_0 ) )
+            // InternalFormalML.g:65833:3: ( rule__PseudostateInitial__NameAlternatives_1_0_5_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_0_5_0()); 
+            }
+            // InternalFormalML.g:65834:3: ( rule__PseudostateInitial__NameAlternatives_1_0_5_0 )
+            // InternalFormalML.g:65834:4: rule__PseudostateInitial__NameAlternatives_1_0_5_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__NameAlternatives_1_0_5_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_0_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__NameAssignment_1_0_5"
+
+
+    // $ANTLR start "rule__PseudostateInitial__NameAssignment_1_1"
+    // InternalFormalML.g:65842:1: rule__PseudostateInitial__NameAssignment_1_1 : ( ( rule__PseudostateInitial__NameAlternatives_1_1_0 ) ) ;
+    public final void rule__PseudostateInitial__NameAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65846:1: ( ( ( rule__PseudostateInitial__NameAlternatives_1_1_0 ) ) )
+            // InternalFormalML.g:65847:2: ( ( rule__PseudostateInitial__NameAlternatives_1_1_0 ) )
+            {
+            // InternalFormalML.g:65847:2: ( ( rule__PseudostateInitial__NameAlternatives_1_1_0 ) )
+            // InternalFormalML.g:65848:3: ( rule__PseudostateInitial__NameAlternatives_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_1_0()); 
+            }
+            // InternalFormalML.g:65849:3: ( rule__PseudostateInitial__NameAlternatives_1_1_0 )
+            // InternalFormalML.g:65849:4: rule__PseudostateInitial__NameAlternatives_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__PseudostateInitial__NameAlternatives_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getNameAlternatives_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__NameAssignment_1_1"
+
+
+    // $ANTLR start "rule__PseudostateInitial__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:65857:1: rule__PseudostateInitial__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__PseudostateInitial__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65861:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:65862:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:65862:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:65863:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__PseudostateInitial__TransitionAssignment_3_0_1"
+    // InternalFormalML.g:65872:1: rule__PseudostateInitial__TransitionAssignment_3_0_1 : ( ruleTransition ) ;
+    public final void rule__PseudostateInitial__TransitionAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65876:1: ( ( ruleTransition ) )
+            // InternalFormalML.g:65877:2: ( ruleTransition )
+            {
+            // InternalFormalML.g:65877:2: ( ruleTransition )
+            // InternalFormalML.g:65878:3: ruleTransition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPseudostateInitialAccess().getTransitionTransitionParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPseudostateInitialAccess().getTransitionTransitionParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PseudostateInitial__TransitionAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__EndingPseudostate__KindAssignment_4"
+    // InternalFormalML.g:65887:1: rule__EndingPseudostate__KindAssignment_4 : ( ruleEndingPseudostateKind ) ;
+    public final void rule__EndingPseudostate__KindAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65891:1: ( ( ruleEndingPseudostateKind ) )
+            // InternalFormalML.g:65892:2: ( ruleEndingPseudostateKind )
+            {
+            // InternalFormalML.g:65892:2: ( ruleEndingPseudostateKind )
+            // InternalFormalML.g:65893:3: ruleEndingPseudostateKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getKindEndingPseudostateKindEnumRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEndingPseudostateKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getKindEndingPseudostateKindEnumRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__KindAssignment_4"
+
+
+    // $ANTLR start "rule__EndingPseudostate__NameAssignment_6"
+    // InternalFormalML.g:65902:1: rule__EndingPseudostate__NameAssignment_6 : ( ruleESIdentifier ) ;
+    public final void rule__EndingPseudostate__NameAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65906:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:65907:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:65907:2: ( ruleESIdentifier )
+            // InternalFormalML.g:65908:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getNameESIdentifierParserRuleCall_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getNameESIdentifierParserRuleCall_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__NameAssignment_6"
+
+
+    // $ANTLR start "rule__EndingPseudostate__UnrestrictedNameAssignment_7"
+    // InternalFormalML.g:65917:1: rule__EndingPseudostate__UnrestrictedNameAssignment_7 : ( ruleUnrestrictedName ) ;
+    public final void rule__EndingPseudostate__UnrestrictedNameAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65921:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:65922:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:65922:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:65923:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__UnrestrictedNameAssignment_7"
+
+
+    // $ANTLR start "rule__EndingPseudostate__MoeAssignment_8_0_1"
+    // InternalFormalML.g:65932:1: rule__EndingPseudostate__MoeAssignment_8_0_1 : ( rulemoeFinalStateRoutines ) ;
+    public final void rule__EndingPseudostate__MoeAssignment_8_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65936:1: ( ( rulemoeFinalStateRoutines ) )
+            // InternalFormalML.g:65937:2: ( rulemoeFinalStateRoutines )
+            {
+            // InternalFormalML.g:65937:2: ( rulemoeFinalStateRoutines )
+            // InternalFormalML.g:65938:3: rulemoeFinalStateRoutines
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEndingPseudostateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeFinalStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEndingPseudostateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EndingPseudostate__MoeAssignment_8_0_1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__RoutineAssignment_2"
+    // InternalFormalML.g:65947:1: rule__ModelOfExecution__RoutineAssignment_2 : ( ruleRoutine ) ;
+    public final void rule__ModelOfExecution__RoutineAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65951:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:65952:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:65952:2: ( ruleRoutine )
+            // InternalFormalML.g:65953:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__RoutineAssignment_2"
+
+
+    // $ANTLR start "rule__ModelOfExecution__InitRoutineAssignment_3_0_1"
+    // InternalFormalML.g:65962:1: rule__ModelOfExecution__InitRoutineAssignment_3_0_1 : ( rulemoeRoutine ) ;
+    public final void rule__ModelOfExecution__InitRoutineAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65966:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:65967:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:65967:2: ( rulemoeRoutine )
+            // InternalFormalML.g:65968:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getInitRoutineMoeRoutineParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getInitRoutineMoeRoutineParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__InitRoutineAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__FinalRoutineAssignment_3_1_1"
+    // InternalFormalML.g:65977:1: rule__ModelOfExecution__FinalRoutineAssignment_3_1_1 : ( rulemoeRoutine ) ;
+    public final void rule__ModelOfExecution__FinalRoutineAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65981:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:65982:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:65982:2: ( rulemoeRoutine )
+            // InternalFormalML.g:65983:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getFinalRoutineMoeRoutineParserRuleCall_3_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getFinalRoutineMoeRoutineParserRuleCall_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__FinalRoutineAssignment_3_1_1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__EnableRoutineAssignment_3_2_1"
+    // InternalFormalML.g:65992:1: rule__ModelOfExecution__EnableRoutineAssignment_3_2_1 : ( rulemoeRoutine ) ;
+    public final void rule__ModelOfExecution__EnableRoutineAssignment_3_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:65996:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:65997:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:65997:2: ( rulemoeRoutine )
+            // InternalFormalML.g:65998:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getEnableRoutineMoeRoutineParserRuleCall_3_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getEnableRoutineMoeRoutineParserRuleCall_3_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__EnableRoutineAssignment_3_2_1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__DisableRoutineAssignment_3_3_1"
+    // InternalFormalML.g:66007:1: rule__ModelOfExecution__DisableRoutineAssignment_3_3_1 : ( rulemoeRoutine ) ;
+    public final void rule__ModelOfExecution__DisableRoutineAssignment_3_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66011:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:66012:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:66012:2: ( rulemoeRoutine )
+            // InternalFormalML.g:66013:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getDisableRoutineMoeRoutineParserRuleCall_3_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getDisableRoutineMoeRoutineParserRuleCall_3_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__DisableRoutineAssignment_3_3_1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1"
+    // InternalFormalML.g:66022:1: rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1 : ( rulemoeRoutine ) ;
+    public final void rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66026:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:66027:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:66027:2: ( rulemoeRoutine )
+            // InternalFormalML.g:66028:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__ConcurrencyRoutineAssignment_3_4_1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1"
+    // InternalFormalML.g:66037:1: rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1 : ( rulemoeRoutine ) ;
+    public final void rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66041:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:66042:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:66042:2: ( rulemoeRoutine )
+            // InternalFormalML.g:66043:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__ScheduleRoutineAssignment_3_5_1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__IrunRoutineAssignment_3_6_1"
+    // InternalFormalML.g:66052:1: rule__ModelOfExecution__IrunRoutineAssignment_3_6_1 : ( rulemoeRoutine ) ;
+    public final void rule__ModelOfExecution__IrunRoutineAssignment_3_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66056:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:66057:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:66057:2: ( rulemoeRoutine )
+            // InternalFormalML.g:66058:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getIrunRoutineMoeRoutineParserRuleCall_3_6_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getIrunRoutineMoeRoutineParserRuleCall_3_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__IrunRoutineAssignment_3_6_1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__RunRoutineAssignment_3_7_1"
+    // InternalFormalML.g:66067:1: rule__ModelOfExecution__RunRoutineAssignment_3_7_1 : ( rulemoeRoutine ) ;
+    public final void rule__ModelOfExecution__RunRoutineAssignment_3_7_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66071:1: ( ( rulemoeRoutine ) )
+            // InternalFormalML.g:66072:2: ( rulemoeRoutine )
+            {
+            // InternalFormalML.g:66072:2: ( rulemoeRoutine )
+            // InternalFormalML.g:66073:3: rulemoeRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_3_7_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_3_7_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__RunRoutineAssignment_3_7_1"
+
+
+    // $ANTLR start "rule__ModelOfExecution__RoutineAssignment_4"
+    // InternalFormalML.g:66082:1: rule__ModelOfExecution__RoutineAssignment_4 : ( ruleRoutine ) ;
+    public final void rule__ModelOfExecution__RoutineAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66086:1: ( ( ruleRoutine ) )
+            // InternalFormalML.g:66087:2: ( ruleRoutine )
+            {
+            // InternalFormalML.g:66087:2: ( ruleRoutine )
+            // InternalFormalML.g:66088:3: ruleRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfExecution__RoutineAssignment_4"
+
+
+    // $ANTLR start "rule__MoeRoutine__DomainAssignment_1_1"
+    // InternalFormalML.g:66097:1: rule__MoeRoutine__DomainAssignment_1_1 : ( ruleFunctionalParameterSet ) ;
+    public final void rule__MoeRoutine__DomainAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66101:1: ( ( ruleFunctionalParameterSet ) )
+            // InternalFormalML.g:66102:2: ( ruleFunctionalParameterSet )
+            {
+            // InternalFormalML.g:66102:2: ( ruleFunctionalParameterSet )
+            // InternalFormalML.g:66103:3: ruleFunctionalParameterSet
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFunctionalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__DomainAssignment_1_1"
+
+
+    // $ANTLR start "rule__MoeRoutine__CodomainAssignment_2_1_0_1"
+    // InternalFormalML.g:66112:1: rule__MoeRoutine__CodomainAssignment_2_1_0_1 : ( ruleFunctionalParameterSet ) ;
+    public final void rule__MoeRoutine__CodomainAssignment_2_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66116:1: ( ( ruleFunctionalParameterSet ) )
+            // InternalFormalML.g:66117:2: ( ruleFunctionalParameterSet )
+            {
+            // InternalFormalML.g:66117:2: ( ruleFunctionalParameterSet )
+            // InternalFormalML.g:66118:3: ruleFunctionalParameterSet
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFunctionalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__CodomainAssignment_2_1_0_1"
+
+
+    // $ANTLR start "rule__MoeRoutine__CodomainAssignment_2_1_1"
+    // InternalFormalML.g:66127:1: rule__MoeRoutine__CodomainAssignment_2_1_1 : ( ruleFunctionalParameterSet ) ;
+    public final void rule__MoeRoutine__CodomainAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66131:1: ( ( ruleFunctionalParameterSet ) )
+            // InternalFormalML.g:66132:2: ( ruleFunctionalParameterSet )
+            {
+            // InternalFormalML.g:66132:2: ( ruleFunctionalParameterSet )
+            // InternalFormalML.g:66133:3: ruleFunctionalParameterSet
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFunctionalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__CodomainAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__MoeRoutine__BodyBlockAssignment_3"
+    // InternalFormalML.g:66142:1: rule__MoeRoutine__BodyBlockAssignment_3 : ( ruleBlockStatement ) ;
+    public final void rule__MoeRoutine__BodyBlockAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66146:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:66147:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:66147:2: ( ruleBlockStatement )
+            // InternalFormalML.g:66148:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMoeRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMoeRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MoeRoutine__BodyBlockAssignment_3"
+
+
+    // $ANTLR start "rule__Routine__VisibilityAssignment_0"
+    // InternalFormalML.g:66157:1: rule__Routine__VisibilityAssignment_0 : ( ruleVisibilityKind ) ;
+    public final void rule__Routine__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66161:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:66162:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:66162:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:66163:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__Routine__NameAssignment_3"
+    // InternalFormalML.g:66172:1: rule__Routine__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__Routine__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66176:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:66177:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:66177:2: ( ruleESIdentifier )
+            // InternalFormalML.g:66178:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__NameAssignment_3"
+
+
+    // $ANTLR start "rule__Routine__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:66187:1: rule__Routine__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__Routine__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66191:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:66192:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:66192:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:66193:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__Routine__DomainAssignment_5_1"
+    // InternalFormalML.g:66202:1: rule__Routine__DomainAssignment_5_1 : ( ruleFunctionalParameterSet ) ;
+    public final void rule__Routine__DomainAssignment_5_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66206:1: ( ( ruleFunctionalParameterSet ) )
+            // InternalFormalML.g:66207:2: ( ruleFunctionalParameterSet )
+            {
+            // InternalFormalML.g:66207:2: ( ruleFunctionalParameterSet )
+            // InternalFormalML.g:66208:3: ruleFunctionalParameterSet
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_5_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFunctionalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__DomainAssignment_5_1"
+
+
+    // $ANTLR start "rule__Routine__CodomainAssignment_6_1_0_1"
+    // InternalFormalML.g:66217:1: rule__Routine__CodomainAssignment_6_1_0_1 : ( ruleFunctionalParameterSet ) ;
+    public final void rule__Routine__CodomainAssignment_6_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66221:1: ( ( ruleFunctionalParameterSet ) )
+            // InternalFormalML.g:66222:2: ( ruleFunctionalParameterSet )
+            {
+            // InternalFormalML.g:66222:2: ( ruleFunctionalParameterSet )
+            // InternalFormalML.g:66223:3: ruleFunctionalParameterSet
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_6_1_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFunctionalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_6_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__CodomainAssignment_6_1_0_1"
+
+
+    // $ANTLR start "rule__Routine__CodomainAssignment_6_1_1"
+    // InternalFormalML.g:66232:1: rule__Routine__CodomainAssignment_6_1_1 : ( ruleFormalParameterSet ) ;
+    public final void rule__Routine__CodomainAssignment_6_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66236:1: ( ( ruleFormalParameterSet ) )
+            // InternalFormalML.g:66237:2: ( ruleFormalParameterSet )
+            {
+            // InternalFormalML.g:66237:2: ( ruleFormalParameterSet )
+            // InternalFormalML.g:66238:3: ruleFormalParameterSet
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getCodomainFormalParameterSetParserRuleCall_6_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getCodomainFormalParameterSetParserRuleCall_6_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__CodomainAssignment_6_1_1"
+
+
+    // $ANTLR start "rule__Routine__BodyBlockAssignment_7"
+    // InternalFormalML.g:66247:1: rule__Routine__BodyBlockAssignment_7 : ( ruleBlockStatement ) ;
+    public final void rule__Routine__BodyBlockAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66251:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:66252:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:66252:2: ( ruleBlockStatement )
+            // InternalFormalML.g:66253:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRoutineAccess().getBodyBlockBlockStatementParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRoutineAccess().getBodyBlockBlockStatementParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Routine__BodyBlockAssignment_7"
+
+
+    // $ANTLR start "rule__ModelOfInteraction__RoutesAssignment_2_0"
+    // InternalFormalML.g:66262:1: rule__ModelOfInteraction__RoutesAssignment_2_0 : ( ruleRoute ) ;
+    public final void rule__ModelOfInteraction__RoutesAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66266:1: ( ( ruleRoute ) )
+            // InternalFormalML.g:66267:2: ( ruleRoute )
+            {
+            // InternalFormalML.g:66267:2: ( ruleRoute )
+            // InternalFormalML.g:66268:3: ruleRoute
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfInteractionAccess().getRoutesRouteParserRuleCall_2_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRoute();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfInteractionAccess().getRoutesRouteParserRuleCall_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfInteraction__RoutesAssignment_2_0"
+
+
+    // $ANTLR start "rule__ModelOfInteraction__ConnectionsAssignment_2_1"
+    // InternalFormalML.g:66277:1: rule__ModelOfInteraction__ConnectionsAssignment_2_1 : ( ruleConnection ) ;
+    public final void rule__ModelOfInteraction__ConnectionsAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66281:1: ( ( ruleConnection ) )
+            // InternalFormalML.g:66282:2: ( ruleConnection )
+            {
+            // InternalFormalML.g:66282:2: ( ruleConnection )
+            // InternalFormalML.g:66283:3: ruleConnection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModelOfInteractionAccess().getConnectionsConnectionParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleConnection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModelOfInteractionAccess().getConnectionsConnectionParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ModelOfInteraction__ConnectionsAssignment_2_1"
+
+
+    // $ANTLR start "rule__Route__ProtocolAssignment_3"
+    // InternalFormalML.g:66292:1: rule__Route__ProtocolAssignment_3 : ( ruleComRouteProtocol ) ;
+    public final void rule__Route__ProtocolAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66296:1: ( ( ruleComRouteProtocol ) )
+            // InternalFormalML.g:66297:2: ( ruleComRouteProtocol )
+            {
+            // InternalFormalML.g:66297:2: ( ruleComRouteProtocol )
+            // InternalFormalML.g:66298:3: ruleComRouteProtocol
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getProtocolComRouteProtocolParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComRouteProtocol();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getProtocolComRouteProtocolParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__ProtocolAssignment_3"
+
+
+    // $ANTLR start "rule__Route__NameAssignment_5_0"
+    // InternalFormalML.g:66307:1: rule__Route__NameAssignment_5_0 : ( ruleESIdentifier ) ;
+    public final void rule__Route__NameAssignment_5_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66311:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:66312:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:66312:2: ( ruleESIdentifier )
+            // InternalFormalML.g:66313:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getNameESIdentifierParserRuleCall_5_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getNameESIdentifierParserRuleCall_5_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__NameAssignment_5_0"
+
+
+    // $ANTLR start "rule__Route__UnrestrictedNameAssignment_5_1"
+    // InternalFormalML.g:66322:1: rule__Route__UnrestrictedNameAssignment_5_1 : ( ruleUnrestrictedName ) ;
+    public final void rule__Route__UnrestrictedNameAssignment_5_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66326:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:66327:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:66327:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:66328:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__UnrestrictedNameAssignment_5_1"
+
+
+    // $ANTLR start "rule__Route__SignalsAssignment_7_1_0"
+    // InternalFormalML.g:66337:1: rule__Route__SignalsAssignment_7_1_0 : ( ( ruleESUfid ) ) ;
+    public final void rule__Route__SignalsAssignment_7_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66341:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66342:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66342:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66343:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_0_0()); 
+            }
+            // InternalFormalML.g:66344:3: ( ruleESUfid )
+            // InternalFormalML.g:66345:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getSignalsSignalESUfidParserRuleCall_7_1_0_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getSignalsSignalESUfidParserRuleCall_7_1_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__SignalsAssignment_7_1_0"
+
+
+    // $ANTLR start "rule__Route__SignalsAssignment_7_1_1_1"
+    // InternalFormalML.g:66356:1: rule__Route__SignalsAssignment_7_1_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__Route__SignalsAssignment_7_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66360:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66361:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66361:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66362:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_1_1_0()); 
+            }
+            // InternalFormalML.g:66363:3: ( ruleESUfid )
+            // InternalFormalML.g:66364:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRouteAccess().getSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Route__SignalsAssignment_7_1_1_1"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__ProtocolAssignment_0"
+    // InternalFormalML.g:66375:1: rule__ComRouteProtocol__ProtocolAssignment_0 : ( ruleComProtocolKind ) ;
+    public final void rule__ComRouteProtocol__ProtocolAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66379:1: ( ( ruleComProtocolKind ) )
+            // InternalFormalML.g:66380:2: ( ruleComProtocolKind )
+            {
+            // InternalFormalML.g:66380:2: ( ruleComProtocolKind )
+            // InternalFormalML.g:66381:3: ruleComProtocolKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getProtocolComProtocolKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComProtocolKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getProtocolComProtocolKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__ProtocolAssignment_0"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__ProtocolAssignment_1_0"
+    // InternalFormalML.g:66390:1: rule__ComRouteProtocol__ProtocolAssignment_1_0 : ( ruleBufferProtocolKind ) ;
+    public final void rule__ComRouteProtocol__ProtocolAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66394:1: ( ( ruleBufferProtocolKind ) )
+            // InternalFormalML.g:66395:2: ( ruleBufferProtocolKind )
+            {
+            // InternalFormalML.g:66395:2: ( ruleBufferProtocolKind )
+            // InternalFormalML.g:66396:3: ruleBufferProtocolKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferProtocolKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__ProtocolAssignment_1_0"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0"
+    // InternalFormalML.g:66405:1: rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0 : ( ruleBufferContainerType ) ;
+    public final void rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66409:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:66410:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:66410:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:66411:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Inner_bufferAssignment_1_1_0_1_0"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1"
+    // InternalFormalML.g:66420:1: rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66424:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66425:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66425:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66426:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_0_1_1_0()); 
+            }
+            // InternalFormalML.g:66427:3: ( ruleESUfid )
+            // InternalFormalML.g:66428:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_1_1_0_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_1_1_0_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Ref_bufferAssignment_1_1_0_1_1"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0"
+    // InternalFormalML.g:66439:1: rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0 : ( ruleBufferContainerType ) ;
+    public final void rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66443:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:66444:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:66444:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:66445:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Inner_bufferAssignment_1_1_1_1_0"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1"
+    // InternalFormalML.g:66454:1: rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66458:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66459:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66459:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66460:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_1_1_1_0()); 
+            }
+            // InternalFormalML.g:66461:3: ( ruleESUfid )
+            // InternalFormalML.g:66462:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_1_1_1_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_1_1_1_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Ref_bufferAssignment_1_1_1_1_1"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Inner_bufferAssignment_2"
+    // InternalFormalML.g:66473:1: rule__ComRouteProtocol__Inner_bufferAssignment_2 : ( ruleBufferContainerType ) ;
+    public final void rule__ComRouteProtocol__Inner_bufferAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66477:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:66478:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:66478:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:66479:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Inner_bufferAssignment_2"
+
+
+    // $ANTLR start "rule__ComRouteProtocol__Ref_bufferAssignment_3"
+    // InternalFormalML.g:66488:1: rule__ComRouteProtocol__Ref_bufferAssignment_3 : ( ( ruleESUfid ) ) ;
+    public final void rule__ComRouteProtocol__Ref_bufferAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66492:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66493:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66493:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66494:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_3_0()); 
+            }
+            // InternalFormalML.g:66495:3: ( ruleESUfid )
+            // InternalFormalML.g:66496:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_3_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_3_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComRouteProtocol__Ref_bufferAssignment_3"
+
+
+    // $ANTLR start "rule__Connection__ProtocolAssignment_2"
+    // InternalFormalML.g:66507:1: rule__Connection__ProtocolAssignment_2 : ( ruleComProtocol ) ;
+    public final void rule__Connection__ProtocolAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66511:1: ( ( ruleComProtocol ) )
+            // InternalFormalML.g:66512:2: ( ruleComProtocol )
+            {
+            // InternalFormalML.g:66512:2: ( ruleComProtocol )
+            // InternalFormalML.g:66513:3: ruleComProtocol
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getProtocolComProtocolParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComProtocol();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getProtocolComProtocolParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__ProtocolAssignment_2"
+
+
+    // $ANTLR start "rule__Connection__NameAssignment_4_0"
+    // InternalFormalML.g:66522:1: rule__Connection__NameAssignment_4_0 : ( ruleESIdentifier ) ;
+    public final void rule__Connection__NameAssignment_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66526:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:66527:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:66527:2: ( ruleESIdentifier )
+            // InternalFormalML.g:66528:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getNameESIdentifierParserRuleCall_4_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getNameESIdentifierParserRuleCall_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__NameAssignment_4_0"
+
+
+    // $ANTLR start "rule__Connection__UnrestrictedNameAssignment_4_1"
+    // InternalFormalML.g:66537:1: rule__Connection__UnrestrictedNameAssignment_4_1 : ( ruleUnrestrictedName ) ;
+    public final void rule__Connection__UnrestrictedNameAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66541:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:66542:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:66542:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:66543:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__UnrestrictedNameAssignment_4_1"
+
+
+    // $ANTLR start "rule__Connection__ComPointsAssignment_6"
+    // InternalFormalML.g:66552:1: rule__Connection__ComPointsAssignment_6 : ( ruleComPoint ) ;
+    public final void rule__Connection__ComPointsAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66556:1: ( ( ruleComPoint ) )
+            // InternalFormalML.g:66557:2: ( ruleComPoint )
+            {
+            // InternalFormalML.g:66557:2: ( ruleComPoint )
+            // InternalFormalML.g:66558:3: ruleComPoint
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConnectionAccess().getComPointsComPointParserRuleCall_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComPoint();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConnectionAccess().getComPointsComPointParserRuleCall_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Connection__ComPointsAssignment_6"
+
+
+    // $ANTLR start "rule__ComProtocol__ProtocolAssignment_0"
+    // InternalFormalML.g:66567:1: rule__ComProtocol__ProtocolAssignment_0 : ( ruleComEnvRdvProtocolKind ) ;
+    public final void rule__ComProtocol__ProtocolAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66571:1: ( ( ruleComEnvRdvProtocolKind ) )
+            // InternalFormalML.g:66572:2: ( ruleComEnvRdvProtocolKind )
+            {
+            // InternalFormalML.g:66572:2: ( ruleComEnvRdvProtocolKind )
+            // InternalFormalML.g:66573:3: ruleComEnvRdvProtocolKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getProtocolComEnvRdvProtocolKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComEnvRdvProtocolKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getProtocolComEnvRdvProtocolKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__ProtocolAssignment_0"
+
+
+    // $ANTLR start "rule__ComProtocol__ProtocolAssignment_1_0"
+    // InternalFormalML.g:66582:1: rule__ComProtocol__ProtocolAssignment_1_0 : ( ruleComMultiRdvProtocolKind ) ;
+    public final void rule__ComProtocol__ProtocolAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66586:1: ( ( ruleComMultiRdvProtocolKind ) )
+            // InternalFormalML.g:66587:2: ( ruleComMultiRdvProtocolKind )
+            {
+            // InternalFormalML.g:66587:2: ( ruleComMultiRdvProtocolKind )
+            // InternalFormalML.g:66588:3: ruleComMultiRdvProtocolKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComMultiRdvProtocolKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__ProtocolAssignment_1_0"
+
+
+    // $ANTLR start "rule__ComProtocol__CastAssignment_1_1_1"
+    // InternalFormalML.g:66597:1: rule__ComProtocol__CastAssignment_1_1_1 : ( ruleComCastKing ) ;
+    public final void rule__ComProtocol__CastAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66601:1: ( ( ruleComCastKing ) )
+            // InternalFormalML.g:66602:2: ( ruleComCastKing )
+            {
+            // InternalFormalML.g:66602:2: ( ruleComCastKing )
+            // InternalFormalML.g:66603:3: ruleComCastKing
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComCastKing();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__CastAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__ComProtocol__ProtocolAssignment_2_0"
+    // InternalFormalML.g:66612:1: rule__ComProtocol__ProtocolAssignment_2_0 : ( ruleBufferProtocolKind ) ;
+    public final void rule__ComProtocol__ProtocolAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66616:1: ( ( ruleBufferProtocolKind ) )
+            // InternalFormalML.g:66617:2: ( ruleBufferProtocolKind )
+            {
+            // InternalFormalML.g:66617:2: ( ruleBufferProtocolKind )
+            // InternalFormalML.g:66618:3: ruleBufferProtocolKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_2_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferProtocolKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__ProtocolAssignment_2_0"
+
+
+    // $ANTLR start "rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0"
+    // InternalFormalML.g:66627:1: rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0 : ( ruleBufferContainerType ) ;
+    public final void rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66631:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:66632:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:66632:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:66633:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Inner_bufferAssignment_2_1_0_1_0"
+
+
+    // $ANTLR start "rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1"
+    // InternalFormalML.g:66642:1: rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66646:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66647:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66647:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66648:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_0_1_1_0()); 
+            }
+            // InternalFormalML.g:66649:3: ( ruleESUfid )
+            // InternalFormalML.g:66650:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_1_0_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_1_0_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Ref_bufferAssignment_2_1_0_1_1"
+
+
+    // $ANTLR start "rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0"
+    // InternalFormalML.g:66661:1: rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0 : ( ruleBufferContainerType ) ;
+    public final void rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66665:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:66666:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:66666:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:66667:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Inner_bufferAssignment_2_1_1_1_0"
+
+
+    // $ANTLR start "rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1"
+    // InternalFormalML.g:66676:1: rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66680:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66681:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66681:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66682:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_1_1_1_0()); 
+            }
+            // InternalFormalML.g:66683:3: ( ruleESUfid )
+            // InternalFormalML.g:66684:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_1_1_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_1_1_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Ref_bufferAssignment_2_1_1_1_1"
+
+
+    // $ANTLR start "rule__ComProtocol__Inner_bufferAssignment_3"
+    // InternalFormalML.g:66695:1: rule__ComProtocol__Inner_bufferAssignment_3 : ( ruleBufferContainerType ) ;
+    public final void rule__ComProtocol__Inner_bufferAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66699:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:66700:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:66700:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:66701:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Inner_bufferAssignment_3"
+
+
+    // $ANTLR start "rule__ComProtocol__Ref_bufferAssignment_4"
+    // InternalFormalML.g:66710:1: rule__ComProtocol__Ref_bufferAssignment_4 : ( ( ruleESUfid ) ) ;
+    public final void rule__ComProtocol__Ref_bufferAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66714:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66715:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66715:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66716:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_4_0()); 
+            }
+            // InternalFormalML.g:66717:3: ( ruleESUfid )
+            // InternalFormalML.g:66718:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_4_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_4_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__Ref_bufferAssignment_4"
+
+
+    // $ANTLR start "rule__ComProtocol__CastAssignment_5"
+    // InternalFormalML.g:66729:1: rule__ComProtocol__CastAssignment_5 : ( ruleComCastKing ) ;
+    public final void rule__ComProtocol__CastAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66733:1: ( ( ruleComCastKing ) )
+            // InternalFormalML.g:66734:2: ( ruleComCastKing )
+            {
+            // InternalFormalML.g:66734:2: ( ruleComCastKing )
+            // InternalFormalML.g:66735:3: ruleComCastKing
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComCastKing();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComProtocol__CastAssignment_5"
+
+
+    // $ANTLR start "rule__ComPoint__DirectionAssignment_1"
+    // InternalFormalML.g:66744:1: rule__ComPoint__DirectionAssignment_1 : ( ruleChannelDirection ) ;
+    public final void rule__ComPoint__DirectionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66748:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:66749:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:66749:2: ( ruleChannelDirection )
+            // InternalFormalML.g:66750:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__DirectionAssignment_1"
+
+
+    // $ANTLR start "rule__ComPoint__ProtocolAssignment_2_1"
+    // InternalFormalML.g:66759:1: rule__ComPoint__ProtocolAssignment_2_1 : ( ruleComPointProtocol ) ;
+    public final void rule__ComPoint__ProtocolAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66763:1: ( ( ruleComPointProtocol ) )
+            // InternalFormalML.g:66764:2: ( ruleComPointProtocol )
+            {
+            // InternalFormalML.g:66764:2: ( ruleComPointProtocol )
+            // InternalFormalML.g:66765:3: ruleComPointProtocol
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getProtocolComPointProtocolParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComPointProtocol();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getProtocolComPointProtocolParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__ProtocolAssignment_2_1"
+
+
+    // $ANTLR start "rule__ComPoint__PointAssignment_3_0_0"
+    // InternalFormalML.g:66774:1: rule__ComPoint__PointAssignment_3_0_0 : ( ruleComElement ) ;
+    public final void rule__ComPoint__PointAssignment_3_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66778:1: ( ( ruleComElement ) )
+            // InternalFormalML.g:66779:2: ( ruleComElement )
+            {
+            // InternalFormalML.g:66779:2: ( ruleComElement )
+            // InternalFormalML.g:66780:3: ruleComElement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getPointComElementParserRuleCall_3_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getPointComElementParserRuleCall_3_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__PointAssignment_3_0_0"
+
+
+    // $ANTLR start "rule__ComPoint__PointsAssignment_3_1_1"
+    // InternalFormalML.g:66789:1: rule__ComPoint__PointsAssignment_3_1_1 : ( ruleComElement ) ;
+    public final void rule__ComPoint__PointsAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66793:1: ( ( ruleComElement ) )
+            // InternalFormalML.g:66794:2: ( ruleComElement )
+            {
+            // InternalFormalML.g:66794:2: ( ruleComElement )
+            // InternalFormalML.g:66795:3: ruleComElement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointAccess().getPointsComElementParserRuleCall_3_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleComElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointAccess().getPointsComElementParserRuleCall_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPoint__PointsAssignment_3_1_1"
+
+
+    // $ANTLR start "rule__ComPointProtocol__ProtocolAssignment_0_0"
+    // InternalFormalML.g:66804:1: rule__ComPointProtocol__ProtocolAssignment_0_0 : ( ruleBufferProtocolKind ) ;
+    public final void rule__ComPointProtocol__ProtocolAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66808:1: ( ( ruleBufferProtocolKind ) )
+            // InternalFormalML.g:66809:2: ( ruleBufferProtocolKind )
+            {
+            // InternalFormalML.g:66809:2: ( ruleBufferProtocolKind )
+            // InternalFormalML.g:66810:3: ruleBufferProtocolKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferProtocolKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__ProtocolAssignment_0_0"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0"
+    // InternalFormalML.g:66819:1: rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0 : ( ruleBufferContainerType ) ;
+    public final void rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66823:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:66824:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:66824:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:66825:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Inner_bufferAssignment_0_1_0_1_0"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1"
+    // InternalFormalML.g:66834:1: rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66838:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66839:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66839:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66840:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_0_1_1_0()); 
+            }
+            // InternalFormalML.g:66841:3: ( ruleESUfid )
+            // InternalFormalML.g:66842:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_0_1_0_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_0_1_0_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Ref_bufferAssignment_0_1_0_1_1"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0"
+    // InternalFormalML.g:66853:1: rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0 : ( ruleBufferContainerType ) ;
+    public final void rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66857:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:66858:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:66858:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:66859:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Inner_bufferAssignment_0_1_1_1_0"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1"
+    // InternalFormalML.g:66868:1: rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66872:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66873:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66873:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66874:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_1_1_1_0()); 
+            }
+            // InternalFormalML.g:66875:3: ( ruleESUfid )
+            // InternalFormalML.g:66876:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_0_1_1_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_0_1_1_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Ref_bufferAssignment_0_1_1_1_1"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Inner_bufferAssignment_1"
+    // InternalFormalML.g:66887:1: rule__ComPointProtocol__Inner_bufferAssignment_1 : ( ruleBufferContainerType ) ;
+    public final void rule__ComPointProtocol__Inner_bufferAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66891:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:66892:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:66892:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:66893:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Inner_bufferAssignment_1"
+
+
+    // $ANTLR start "rule__ComPointProtocol__Ref_bufferAssignment_2"
+    // InternalFormalML.g:66902:1: rule__ComPointProtocol__Ref_bufferAssignment_2 : ( ( ruleESUfid ) ) ;
+    public final void rule__ComPointProtocol__Ref_bufferAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66906:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:66907:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:66907:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:66908:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_2_0()); 
+            }
+            // InternalFormalML.g:66909:3: ( ruleESUfid )
+            // InternalFormalML.g:66910:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferESUfidParserRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComPointProtocol__Ref_bufferAssignment_2"
+
+
+    // $ANTLR start "rule__ComElement__KindAssignment_0_1_1"
+    // InternalFormalML.g:66921:1: rule__ComElement__KindAssignment_0_1_1 : ( ( rule__ComElement__KindAlternatives_0_1_1_0 ) ) ;
+    public final void rule__ComElement__KindAssignment_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66925:1: ( ( ( rule__ComElement__KindAlternatives_0_1_1_0 ) ) )
+            // InternalFormalML.g:66926:2: ( ( rule__ComElement__KindAlternatives_0_1_1_0 ) )
+            {
+            // InternalFormalML.g:66926:2: ( ( rule__ComElement__KindAlternatives_0_1_1_0 ) )
+            // InternalFormalML.g:66927:3: ( rule__ComElement__KindAlternatives_0_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getKindAlternatives_0_1_1_0()); 
+            }
+            // InternalFormalML.g:66928:3: ( rule__ComElement__KindAlternatives_0_1_1_0 )
+            // InternalFormalML.g:66928:4: rule__ComElement__KindAlternatives_0_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__KindAlternatives_0_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getKindAlternatives_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__KindAssignment_0_1_1"
+
+
+    // $ANTLR start "rule__ComElement__ElementAssignment_0_1_2"
+    // InternalFormalML.g:66936:1: rule__ComElement__ElementAssignment_0_1_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__ComElement__ElementAssignment_0_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66940:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:66941:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:66941:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:66942:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_0_1_2_0()); 
+            }
+            // InternalFormalML.g:66943:3: ( ruleESIdentifier )
+            // InternalFormalML.g:66944:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getElementNamedElementESIdentifierParserRuleCall_0_1_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getElementNamedElementESIdentifierParserRuleCall_0_1_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_0_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__ElementAssignment_0_1_2"
+
+
+    // $ANTLR start "rule__ComElement__TargetAssignment_1_1"
+    // InternalFormalML.g:66955:1: rule__ComElement__TargetAssignment_1_1 : ( ruleLiteralReferenceMachineContext ) ;
+    public final void rule__ComElement__TargetAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66959:1: ( ( ruleLiteralReferenceMachineContext ) )
+            // InternalFormalML.g:66960:2: ( ruleLiteralReferenceMachineContext )
+            {
+            // InternalFormalML.g:66960:2: ( ruleLiteralReferenceMachineContext )
+            // InternalFormalML.g:66961:3: ruleLiteralReferenceMachineContext
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getTargetLiteralReferenceMachineContextParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLiteralReferenceMachineContext();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getTargetLiteralReferenceMachineContextParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__TargetAssignment_1_1"
+
+
+    // $ANTLR start "rule__ComElement__KindAssignment_1_2"
+    // InternalFormalML.g:66970:1: rule__ComElement__KindAssignment_1_2 : ( ( rule__ComElement__KindAlternatives_1_2_0 ) ) ;
+    public final void rule__ComElement__KindAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66974:1: ( ( ( rule__ComElement__KindAlternatives_1_2_0 ) ) )
+            // InternalFormalML.g:66975:2: ( ( rule__ComElement__KindAlternatives_1_2_0 ) )
+            {
+            // InternalFormalML.g:66975:2: ( ( rule__ComElement__KindAlternatives_1_2_0 ) )
+            // InternalFormalML.g:66976:3: ( rule__ComElement__KindAlternatives_1_2_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getKindAlternatives_1_2_0()); 
+            }
+            // InternalFormalML.g:66977:3: ( rule__ComElement__KindAlternatives_1_2_0 )
+            // InternalFormalML.g:66977:4: rule__ComElement__KindAlternatives_1_2_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__ComElement__KindAlternatives_1_2_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getKindAlternatives_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__KindAssignment_1_2"
+
+
+    // $ANTLR start "rule__ComElement__ElementAssignment_1_3"
+    // InternalFormalML.g:66985:1: rule__ComElement__ElementAssignment_1_3 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__ComElement__ElementAssignment_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:66989:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:66990:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:66990:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:66991:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_1_3_0()); 
+            }
+            // InternalFormalML.g:66992:3: ( ruleESIdentifier )
+            // InternalFormalML.g:66993:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getComElementAccess().getElementNamedElementESIdentifierParserRuleCall_1_3_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getElementNamedElementESIdentifierParserRuleCall_1_3_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ComElement__ElementAssignment_1_3"
+
+
+    // $ANTLR start "rule__DataTypeReference__MultiplicityAssignment_0_1_2"
+    // InternalFormalML.g:67004:1: rule__DataTypeReference__MultiplicityAssignment_0_1_2 : ( ruleDataTypeMultiplicity ) ;
+    public final void rule__DataTypeReference__MultiplicityAssignment_0_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67008:1: ( ( ruleDataTypeMultiplicity ) )
+            // InternalFormalML.g:67009:2: ( ruleDataTypeMultiplicity )
+            {
+            // InternalFormalML.g:67009:2: ( ruleDataTypeMultiplicity )
+            // InternalFormalML.g:67010:3: ruleDataTypeMultiplicity
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataTypeMultiplicity();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__MultiplicityAssignment_0_1_2"
+
+
+    // $ANTLR start "rule__DataTypeReference__TyperefAssignment_1_1"
+    // InternalFormalML.g:67019:1: rule__DataTypeReference__TyperefAssignment_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__DataTypeReference__TyperefAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67023:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:67024:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:67024:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:67025:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeCrossReference_1_1_0()); 
+            }
+            // InternalFormalML.g:67026:3: ( ruleESUfid )
+            // InternalFormalML.g:67027:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeESUfidParserRuleCall_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeESUfidParserRuleCall_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeCrossReference_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__TyperefAssignment_1_1"
+
+
+    // $ANTLR start "rule__DataTypeReference__MultiplicityAssignment_1_2_1"
+    // InternalFormalML.g:67038:1: rule__DataTypeReference__MultiplicityAssignment_1_2_1 : ( ruleDataTypeMultiplicity ) ;
+    public final void rule__DataTypeReference__MultiplicityAssignment_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67042:1: ( ( ruleDataTypeMultiplicity ) )
+            // InternalFormalML.g:67043:2: ( ruleDataTypeMultiplicity )
+            {
+            // InternalFormalML.g:67043:2: ( ruleDataTypeMultiplicity )
+            // InternalFormalML.g:67044:3: ruleDataTypeMultiplicity
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataTypeMultiplicity();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataTypeReference__MultiplicityAssignment_1_2_1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__VisibilityAssignment_1"
+    // InternalFormalML.g:67053:1: rule__OtherDataTypeDefinition__VisibilityAssignment_1 : ( ruleVisibilityKind ) ;
+    public final void rule__OtherDataTypeDefinition__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67057:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:67058:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:67058:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:67059:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__NameAssignment_3"
+    // InternalFormalML.g:67068:1: rule__OtherDataTypeDefinition__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__OtherDataTypeDefinition__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67072:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:67073:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:67073:2: ( ruleESIdentifier )
+            // InternalFormalML.g:67074:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__NameAssignment_3"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:67083:1: rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67087:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:67088:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:67088:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:67089:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__SupportAssignment_5_0_0"
+    // InternalFormalML.g:67098:1: rule__OtherDataTypeDefinition__SupportAssignment_5_0_0 : ( rulePrimitiveType ) ;
+    public final void rule__OtherDataTypeDefinition__SupportAssignment_5_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67102:1: ( ( rulePrimitiveType ) )
+            // InternalFormalML.g:67103:2: ( rulePrimitiveType )
+            {
+            // InternalFormalML.g:67103:2: ( rulePrimitiveType )
+            // InternalFormalML.g:67104:3: rulePrimitiveType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportPrimitiveTypeParserRuleCall_5_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportPrimitiveTypeParserRuleCall_5_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__SupportAssignment_5_0_0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1"
+    // InternalFormalML.g:67113:1: rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1 : ( ruleDataTypeMultiplicity ) ;
+    public final void rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67117:1: ( ( ruleDataTypeMultiplicity ) )
+            // InternalFormalML.g:67118:2: ( ruleDataTypeMultiplicity )
+            {
+            // InternalFormalML.g:67118:2: ( ruleDataTypeMultiplicity )
+            // InternalFormalML.g:67119:3: ruleDataTypeMultiplicity
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataTypeMultiplicity();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__MultiplicityAssignment_5_0_1_1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0"
+    // InternalFormalML.g:67128:1: rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0 : ( ( ruleESUfid ) ) ;
+    public final void rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67132:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:67133:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:67133:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:67134:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeCrossReference_5_1_0_0()); 
+            }
+            // InternalFormalML.g:67135:3: ( ruleESUfid )
+            // InternalFormalML.g:67136:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeCrossReference_5_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__TyperefAssignment_5_1_0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1"
+    // InternalFormalML.g:67147:1: rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1 : ( ruleDataTypeMultiplicity ) ;
+    public final void rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67151:1: ( ( ruleDataTypeMultiplicity ) )
+            // InternalFormalML.g:67152:2: ( ruleDataTypeMultiplicity )
+            {
+            // InternalFormalML.g:67152:2: ( ruleDataTypeMultiplicity )
+            // InternalFormalML.g:67153:3: ruleDataTypeMultiplicity
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataTypeMultiplicity();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__MultiplicityAssignment_5_1_1_1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinition__TypedefAssignment_6"
+    // InternalFormalML.g:67162:1: rule__OtherDataTypeDefinition__TypedefAssignment_6 : ( ( ';' ) ) ;
+    public final void rule__OtherDataTypeDefinition__TypedefAssignment_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67166:1: ( ( ( ';' ) ) )
+            // InternalFormalML.g:67167:2: ( ( ';' ) )
+            {
+            // InternalFormalML.g:67167:2: ( ( ';' ) )
+            // InternalFormalML.g:67168:3: ( ';' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0()); 
+            }
+            // InternalFormalML.g:67169:3: ( ';' )
+            // InternalFormalML.g:67170:4: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinition__TypedefAssignment_6"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__NameAssignment_1"
+    // InternalFormalML.g:67181:1: rule__OtherDataTypeDefinitionImpl__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67185:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:67186:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:67186:2: ( ruleESIdentifier )
+            // InternalFormalML.g:67187:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__NameAssignment_1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:67196:1: rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67200:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:67201:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:67201:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:67202:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0"
+    // InternalFormalML.g:67211:1: rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0 : ( rulePrimitiveType ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67215:1: ( ( rulePrimitiveType ) )
+            // InternalFormalML.g:67216:2: ( rulePrimitiveType )
+            {
+            // InternalFormalML.g:67216:2: ( rulePrimitiveType )
+            // InternalFormalML.g:67217:3: rulePrimitiveType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportPrimitiveTypeParserRuleCall_3_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportPrimitiveTypeParserRuleCall_3_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__SupportAssignment_3_0_0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1"
+    // InternalFormalML.g:67226:1: rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1 : ( ruleDataTypeMultiplicity ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67230:1: ( ( ruleDataTypeMultiplicity ) )
+            // InternalFormalML.g:67231:2: ( ruleDataTypeMultiplicity )
+            {
+            // InternalFormalML.g:67231:2: ( ruleDataTypeMultiplicity )
+            // InternalFormalML.g:67232:3: ruleDataTypeMultiplicity
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataTypeMultiplicity();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_0_1_1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0"
+    // InternalFormalML.g:67241:1: rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0 : ( ( ruleESUfid ) ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67245:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:67246:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:67246:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:67247:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeCrossReference_3_1_0_0()); 
+            }
+            // InternalFormalML.g:67248:3: ( ruleESUfid )
+            // InternalFormalML.g:67249:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeESUfidParserRuleCall_3_1_0_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeESUfidParserRuleCall_3_1_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeCrossReference_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__TyperefAssignment_3_1_0"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1"
+    // InternalFormalML.g:67260:1: rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1 : ( ruleDataTypeMultiplicity ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67264:1: ( ( ruleDataTypeMultiplicity ) )
+            // InternalFormalML.g:67265:2: ( ruleDataTypeMultiplicity )
+            {
+            // InternalFormalML.g:67265:2: ( ruleDataTypeMultiplicity )
+            // InternalFormalML.g:67266:3: ruleDataTypeMultiplicity
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataTypeMultiplicity();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__MultiplicityAssignment_3_1_1_1"
+
+
+    // $ANTLR start "rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4"
+    // InternalFormalML.g:67275:1: rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4 : ( ( ';' ) ) ;
+    public final void rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67279:1: ( ( ( ';' ) ) )
+            // InternalFormalML.g:67280:2: ( ( ';' ) )
+            {
+            // InternalFormalML.g:67280:2: ( ( ';' ) )
+            // InternalFormalML.g:67281:3: ( ';' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0()); 
+            }
+            // InternalFormalML.g:67282:3: ( ';' )
+            // InternalFormalML.g:67283:4: ';'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0()); 
+            }
+            match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OtherDataTypeDefinitionImpl__TypedefAssignment_4"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__SignAssignment_1"
+    // InternalFormalML.g:67294:1: rule__PrimitiveIntegerType__SignAssignment_1 : ( rulePrimitiveNumberSign ) ;
+    public final void rule__PrimitiveIntegerType__SignAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67298:1: ( ( rulePrimitiveNumberSign ) )
+            // InternalFormalML.g:67299:2: ( rulePrimitiveNumberSign )
+            {
+            // InternalFormalML.g:67299:2: ( rulePrimitiveNumberSign )
+            // InternalFormalML.g:67300:3: rulePrimitiveNumberSign
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveNumberSign();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__SignAssignment_1"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__SizeAssignment_3_0_1"
+    // InternalFormalML.g:67309:1: rule__PrimitiveIntegerType__SizeAssignment_3_0_1 : ( ruleEInt ) ;
+    public final void rule__PrimitiveIntegerType__SizeAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67313:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67314:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67314:2: ( ruleEInt )
+            // InternalFormalML.g:67315:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__SizeAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__PrimitiveIntegerType__SizeAssignment_3_1_2"
+    // InternalFormalML.g:67324:1: rule__PrimitiveIntegerType__SizeAssignment_3_1_2 : ( ruleEInt ) ;
+    public final void rule__PrimitiveIntegerType__SizeAssignment_3_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67328:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67329:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67329:2: ( ruleEInt )
+            // InternalFormalML.g:67330:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveIntegerType__SizeAssignment_3_1_2"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__SignAssignment_1"
+    // InternalFormalML.g:67339:1: rule__PrimitiveRationalType__SignAssignment_1 : ( rulePrimitiveNumberSign ) ;
+    public final void rule__PrimitiveRationalType__SignAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67343:1: ( ( rulePrimitiveNumberSign ) )
+            // InternalFormalML.g:67344:2: ( rulePrimitiveNumberSign )
+            {
+            // InternalFormalML.g:67344:2: ( rulePrimitiveNumberSign )
+            // InternalFormalML.g:67345:3: rulePrimitiveNumberSign
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveNumberSign();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__SignAssignment_1"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__SizeAssignment_3_0_1"
+    // InternalFormalML.g:67354:1: rule__PrimitiveRationalType__SizeAssignment_3_0_1 : ( ruleEInt ) ;
+    public final void rule__PrimitiveRationalType__SizeAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67358:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67359:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67359:2: ( ruleEInt )
+            // InternalFormalML.g:67360:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__SizeAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__PrimitiveRationalType__SizeAssignment_3_1_2"
+    // InternalFormalML.g:67369:1: rule__PrimitiveRationalType__SizeAssignment_3_1_2 : ( ruleEInt ) ;
+    public final void rule__PrimitiveRationalType__SizeAssignment_3_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67373:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67374:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67374:2: ( ruleEInt )
+            // InternalFormalML.g:67375:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRationalType__SizeAssignment_3_1_2"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__SignAssignment_1"
+    // InternalFormalML.g:67384:1: rule__PrimitiveFloatType__SignAssignment_1 : ( rulePrimitiveNumberSign ) ;
+    public final void rule__PrimitiveFloatType__SignAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67388:1: ( ( rulePrimitiveNumberSign ) )
+            // InternalFormalML.g:67389:2: ( rulePrimitiveNumberSign )
+            {
+            // InternalFormalML.g:67389:2: ( rulePrimitiveNumberSign )
+            // InternalFormalML.g:67390:3: rulePrimitiveNumberSign
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveNumberSign();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__SignAssignment_1"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__SizeAssignment_3_0_1"
+    // InternalFormalML.g:67399:1: rule__PrimitiveFloatType__SizeAssignment_3_0_1 : ( ruleEInt ) ;
+    public final void rule__PrimitiveFloatType__SizeAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67403:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67404:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67404:2: ( ruleEInt )
+            // InternalFormalML.g:67405:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__SizeAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__PrimitiveFloatType__SizeAssignment_3_1_2"
+    // InternalFormalML.g:67414:1: rule__PrimitiveFloatType__SizeAssignment_3_1_2 : ( ruleEInt ) ;
+    public final void rule__PrimitiveFloatType__SizeAssignment_3_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67418:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67419:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67419:2: ( ruleEInt )
+            // InternalFormalML.g:67420:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveFloatType__SizeAssignment_3_1_2"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__SignAssignment_1"
+    // InternalFormalML.g:67429:1: rule__PrimitiveRealType__SignAssignment_1 : ( rulePrimitiveNumberSign ) ;
+    public final void rule__PrimitiveRealType__SignAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67433:1: ( ( rulePrimitiveNumberSign ) )
+            // InternalFormalML.g:67434:2: ( rulePrimitiveNumberSign )
+            {
+            // InternalFormalML.g:67434:2: ( rulePrimitiveNumberSign )
+            // InternalFormalML.g:67435:3: rulePrimitiveNumberSign
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveNumberSign();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__SignAssignment_1"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__SizeAssignment_3_0_1"
+    // InternalFormalML.g:67444:1: rule__PrimitiveRealType__SizeAssignment_3_0_1 : ( ruleEInt ) ;
+    public final void rule__PrimitiveRealType__SizeAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67448:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67449:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67449:2: ( ruleEInt )
+            // InternalFormalML.g:67450:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__SizeAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__PrimitiveRealType__SizeAssignment_3_1_2"
+    // InternalFormalML.g:67459:1: rule__PrimitiveRealType__SizeAssignment_3_1_2 : ( ruleEInt ) ;
+    public final void rule__PrimitiveRealType__SizeAssignment_3_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67463:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67464:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67464:2: ( ruleEInt )
+            // InternalFormalML.g:67465:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveRealType__SizeAssignment_3_1_2"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__SupportAssignment_0_2_0_1"
+    // InternalFormalML.g:67474:1: rule__PrimitiveTimeType__SupportAssignment_0_2_0_1 : ( rulePrimitiveTimeNumberType ) ;
+    public final void rule__PrimitiveTimeType__SupportAssignment_0_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67478:1: ( ( rulePrimitiveTimeNumberType ) )
+            // InternalFormalML.g:67479:2: ( rulePrimitiveTimeNumberType )
+            {
+            // InternalFormalML.g:67479:2: ( rulePrimitiveTimeNumberType )
+            // InternalFormalML.g:67480:3: rulePrimitiveTimeNumberType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveTimeNumberType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__SupportAssignment_0_2_0_1"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__SupportAssignment_0_2_1"
+    // InternalFormalML.g:67489:1: rule__PrimitiveTimeType__SupportAssignment_0_2_1 : ( rulePrimitiveTimeNumberType ) ;
+    public final void rule__PrimitiveTimeType__SupportAssignment_0_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67493:1: ( ( rulePrimitiveTimeNumberType ) )
+            // InternalFormalML.g:67494:2: ( rulePrimitiveTimeNumberType )
+            {
+            // InternalFormalML.g:67494:2: ( rulePrimitiveTimeNumberType )
+            // InternalFormalML.g:67495:3: rulePrimitiveTimeNumberType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveTimeNumberType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__SupportAssignment_0_2_1"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__ClockAssignment_1_1"
+    // InternalFormalML.g:67504:1: rule__PrimitiveTimeType__ClockAssignment_1_1 : ( ( 'clock' ) ) ;
+    public final void rule__PrimitiveTimeType__ClockAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67508:1: ( ( ( 'clock' ) ) )
+            // InternalFormalML.g:67509:2: ( ( 'clock' ) )
+            {
+            // InternalFormalML.g:67509:2: ( ( 'clock' ) )
+            // InternalFormalML.g:67510:3: ( 'clock' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:67511:3: ( 'clock' )
+            // InternalFormalML.g:67512:4: 'clock'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0()); 
+            }
+            match(input,277,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__ClockAssignment_1_1"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__SupportAssignment_1_2_0_1"
+    // InternalFormalML.g:67523:1: rule__PrimitiveTimeType__SupportAssignment_1_2_0_1 : ( rulePrimitiveTimeNumberType ) ;
+    public final void rule__PrimitiveTimeType__SupportAssignment_1_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67527:1: ( ( rulePrimitiveTimeNumberType ) )
+            // InternalFormalML.g:67528:2: ( rulePrimitiveTimeNumberType )
+            {
+            // InternalFormalML.g:67528:2: ( rulePrimitiveTimeNumberType )
+            // InternalFormalML.g:67529:3: rulePrimitiveTimeNumberType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveTimeNumberType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__SupportAssignment_1_2_0_1"
+
+
+    // $ANTLR start "rule__PrimitiveTimeType__SupportAssignment_1_2_1"
+    // InternalFormalML.g:67538:1: rule__PrimitiveTimeType__SupportAssignment_1_2_1 : ( rulePrimitiveTimeNumberType ) ;
+    public final void rule__PrimitiveTimeType__SupportAssignment_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67542:1: ( ( rulePrimitiveTimeNumberType ) )
+            // InternalFormalML.g:67543:2: ( rulePrimitiveTimeNumberType )
+            {
+            // InternalFormalML.g:67543:2: ( rulePrimitiveTimeNumberType )
+            // InternalFormalML.g:67544:3: rulePrimitiveTimeNumberType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveTimeNumberType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveTimeType__SupportAssignment_1_2_1"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__SizeAssignment_2_0_1"
+    // InternalFormalML.g:67553:1: rule__PrimitiveStringType__SizeAssignment_2_0_1 : ( ruleEInt ) ;
+    public final void rule__PrimitiveStringType__SizeAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67557:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67558:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67558:2: ( ruleEInt )
+            // InternalFormalML.g:67559:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__SizeAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__PrimitiveStringType__SizeAssignment_2_1_2"
+    // InternalFormalML.g:67568:1: rule__PrimitiveStringType__SizeAssignment_2_1_2 : ( ruleEInt ) ;
+    public final void rule__PrimitiveStringType__SizeAssignment_2_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67572:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67573:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67573:2: ( ruleEInt )
+            // InternalFormalML.g:67574:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveStringType__SizeAssignment_2_1_2"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__ExpectedAssignment_1"
+    // InternalFormalML.g:67583:1: rule__PrimitiveInstanceType__ExpectedAssignment_1 : ( rulePrimitiveInstanceKind ) ;
+    public final void rule__PrimitiveInstanceType__ExpectedAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67587:1: ( ( rulePrimitiveInstanceKind ) )
+            // InternalFormalML.g:67588:2: ( rulePrimitiveInstanceKind )
+            {
+            // InternalFormalML.g:67588:2: ( rulePrimitiveInstanceKind )
+            // InternalFormalML.g:67589:3: rulePrimitiveInstanceKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedPrimitiveInstanceKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveInstanceKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedPrimitiveInstanceKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__ExpectedAssignment_1"
+
+
+    // $ANTLR start "rule__PrimitiveInstanceType__ModelAssignment_2_1"
+    // InternalFormalML.g:67598:1: rule__PrimitiveInstanceType__ModelAssignment_2_1 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__PrimitiveInstanceType__ModelAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67602:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:67603:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:67603:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:67604:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementCrossReference_2_1_0()); 
+            }
+            // InternalFormalML.g:67605:3: ( ruleESIdentifier )
+            // InternalFormalML.g:67606:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementESIdentifierParserRuleCall_2_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementESIdentifierParserRuleCall_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementCrossReference_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimitiveInstanceType__ModelAssignment_2_1"
+
+
+    // $ANTLR start "rule__IntervalType__SupportAssignment_3"
+    // InternalFormalML.g:67617:1: rule__IntervalType__SupportAssignment_3 : ( rulePrimitiveNumberType ) ;
+    public final void rule__IntervalType__SupportAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67621:1: ( ( rulePrimitiveNumberType ) )
+            // InternalFormalML.g:67622:2: ( rulePrimitiveNumberType )
+            {
+            // InternalFormalML.g:67622:2: ( rulePrimitiveNumberType )
+            // InternalFormalML.g:67623:3: rulePrimitiveNumberType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getSupportPrimitiveNumberTypeParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveNumberType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getSupportPrimitiveNumberTypeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__SupportAssignment_3"
+
+
+    // $ANTLR start "rule__IntervalType__LopenAssignment_4_0"
+    // InternalFormalML.g:67632:1: rule__IntervalType__LopenAssignment_4_0 : ( ( ']' ) ) ;
+    public final void rule__IntervalType__LopenAssignment_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67636:1: ( ( ( ']' ) ) )
+            // InternalFormalML.g:67637:2: ( ( ']' ) )
+            {
+            // InternalFormalML.g:67637:2: ( ( ']' ) )
+            // InternalFormalML.g:67638:3: ( ']' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0()); 
+            }
+            // InternalFormalML.g:67639:3: ( ']' )
+            // InternalFormalML.g:67640:4: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__LopenAssignment_4_0"
+
+
+    // $ANTLR start "rule__IntervalType__InfimumAssignment_5"
+    // InternalFormalML.g:67651:1: rule__IntervalType__InfimumAssignment_5 : ( ruleExpression ) ;
+    public final void rule__IntervalType__InfimumAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67655:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:67656:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:67656:2: ( ruleExpression )
+            // InternalFormalML.g:67657:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getInfimumExpressionParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getInfimumExpressionParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__InfimumAssignment_5"
+
+
+    // $ANTLR start "rule__IntervalType__SupremumAssignment_7"
+    // InternalFormalML.g:67666:1: rule__IntervalType__SupremumAssignment_7 : ( ruleExpression ) ;
+    public final void rule__IntervalType__SupremumAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67670:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:67671:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:67671:2: ( ruleExpression )
+            // InternalFormalML.g:67672:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getSupremumExpressionParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getSupremumExpressionParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__SupremumAssignment_7"
+
+
+    // $ANTLR start "rule__IntervalType__RopenAssignment_8_1"
+    // InternalFormalML.g:67681:1: rule__IntervalType__RopenAssignment_8_1 : ( ( '[' ) ) ;
+    public final void rule__IntervalType__RopenAssignment_8_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67685:1: ( ( ( '[' ) ) )
+            // InternalFormalML.g:67686:2: ( ( '[' ) )
+            {
+            // InternalFormalML.g:67686:2: ( ( '[' ) )
+            // InternalFormalML.g:67687:3: ( '[' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0()); 
+            }
+            // InternalFormalML.g:67688:3: ( '[' )
+            // InternalFormalML.g:67689:4: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalType__RopenAssignment_8_1"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__VisibilityAssignment_1"
+    // InternalFormalML.g:67700:1: rule__IntervalTypeDefinition__VisibilityAssignment_1 : ( ruleVisibilityKind ) ;
+    public final void rule__IntervalTypeDefinition__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67704:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:67705:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:67705:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:67706:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__NameAssignment_3"
+    // InternalFormalML.g:67715:1: rule__IntervalTypeDefinition__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__IntervalTypeDefinition__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67719:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:67720:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:67720:2: ( ruleESIdentifier )
+            // InternalFormalML.g:67721:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__NameAssignment_3"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:67730:1: rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67734:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:67735:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:67735:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:67736:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__SupportAssignment_7"
+    // InternalFormalML.g:67745:1: rule__IntervalTypeDefinition__SupportAssignment_7 : ( rulePrimitiveNumberType ) ;
+    public final void rule__IntervalTypeDefinition__SupportAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67749:1: ( ( rulePrimitiveNumberType ) )
+            // InternalFormalML.g:67750:2: ( rulePrimitiveNumberType )
+            {
+            // InternalFormalML.g:67750:2: ( rulePrimitiveNumberType )
+            // InternalFormalML.g:67751:3: rulePrimitiveNumberType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getSupportPrimitiveNumberTypeParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveNumberType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getSupportPrimitiveNumberTypeParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__SupportAssignment_7"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__LopenAssignment_8_0"
+    // InternalFormalML.g:67760:1: rule__IntervalTypeDefinition__LopenAssignment_8_0 : ( ( ']' ) ) ;
+    public final void rule__IntervalTypeDefinition__LopenAssignment_8_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67764:1: ( ( ( ']' ) ) )
+            // InternalFormalML.g:67765:2: ( ( ']' ) )
+            {
+            // InternalFormalML.g:67765:2: ( ( ']' ) )
+            // InternalFormalML.g:67766:3: ( ']' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0()); 
+            }
+            // InternalFormalML.g:67767:3: ( ']' )
+            // InternalFormalML.g:67768:4: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__LopenAssignment_8_0"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__InfimumAssignment_9"
+    // InternalFormalML.g:67779:1: rule__IntervalTypeDefinition__InfimumAssignment_9 : ( ruleExpression ) ;
+    public final void rule__IntervalTypeDefinition__InfimumAssignment_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67783:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:67784:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:67784:2: ( ruleExpression )
+            // InternalFormalML.g:67785:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumExpressionParserRuleCall_9_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumExpressionParserRuleCall_9_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__InfimumAssignment_9"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__SupremumAssignment_11"
+    // InternalFormalML.g:67794:1: rule__IntervalTypeDefinition__SupremumAssignment_11 : ( ruleExpression ) ;
+    public final void rule__IntervalTypeDefinition__SupremumAssignment_11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67798:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:67799:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:67799:2: ( ruleExpression )
+            // InternalFormalML.g:67800:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumExpressionParserRuleCall_11_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumExpressionParserRuleCall_11_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__SupremumAssignment_11"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinition__RopenAssignment_12_1"
+    // InternalFormalML.g:67809:1: rule__IntervalTypeDefinition__RopenAssignment_12_1 : ( ( '[' ) ) ;
+    public final void rule__IntervalTypeDefinition__RopenAssignment_12_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67813:1: ( ( ( '[' ) ) )
+            // InternalFormalML.g:67814:2: ( ( '[' ) )
+            {
+            // InternalFormalML.g:67814:2: ( ( '[' ) )
+            // InternalFormalML.g:67815:3: ( '[' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0()); 
+            }
+            // InternalFormalML.g:67816:3: ( '[' )
+            // InternalFormalML.g:67817:4: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinition__RopenAssignment_12_1"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__NameAssignment_1"
+    // InternalFormalML.g:67828:1: rule__IntervalTypeDefinitionImpl__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__IntervalTypeDefinitionImpl__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67832:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:67833:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:67833:2: ( ruleESIdentifier )
+            // InternalFormalML.g:67834:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__NameAssignment_1"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:67843:1: rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67847:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:67848:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:67848:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:67849:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__SupportAssignment_5"
+    // InternalFormalML.g:67858:1: rule__IntervalTypeDefinitionImpl__SupportAssignment_5 : ( rulePrimitiveNumberType ) ;
+    public final void rule__IntervalTypeDefinitionImpl__SupportAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67862:1: ( ( rulePrimitiveNumberType ) )
+            // InternalFormalML.g:67863:2: ( rulePrimitiveNumberType )
+            {
+            // InternalFormalML.g:67863:2: ( rulePrimitiveNumberType )
+            // InternalFormalML.g:67864:3: rulePrimitiveNumberType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportPrimitiveNumberTypeParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrimitiveNumberType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportPrimitiveNumberTypeParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__SupportAssignment_5"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0"
+    // InternalFormalML.g:67873:1: rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0 : ( ( ']' ) ) ;
+    public final void rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67877:1: ( ( ( ']' ) ) )
+            // InternalFormalML.g:67878:2: ( ( ']' ) )
+            {
+            // InternalFormalML.g:67878:2: ( ( ']' ) )
+            // InternalFormalML.g:67879:3: ( ']' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0()); 
+            }
+            // InternalFormalML.g:67880:3: ( ']' )
+            // InternalFormalML.g:67881:4: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0()); 
+            }
+            match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__LopenAssignment_6_0"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__InfimumAssignment_7"
+    // InternalFormalML.g:67892:1: rule__IntervalTypeDefinitionImpl__InfimumAssignment_7 : ( ruleExpression ) ;
+    public final void rule__IntervalTypeDefinitionImpl__InfimumAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67896:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:67897:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:67897:2: ( ruleExpression )
+            // InternalFormalML.g:67898:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumExpressionParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumExpressionParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__InfimumAssignment_7"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__SupremumAssignment_9"
+    // InternalFormalML.g:67907:1: rule__IntervalTypeDefinitionImpl__SupremumAssignment_9 : ( ruleExpression ) ;
+    public final void rule__IntervalTypeDefinitionImpl__SupremumAssignment_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67911:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:67912:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:67912:2: ( ruleExpression )
+            // InternalFormalML.g:67913:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumExpressionParserRuleCall_9_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumExpressionParserRuleCall_9_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__SupremumAssignment_9"
+
+
+    // $ANTLR start "rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1"
+    // InternalFormalML.g:67922:1: rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1 : ( ( '[' ) ) ;
+    public final void rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67926:1: ( ( ( '[' ) ) )
+            // InternalFormalML.g:67927:2: ( ( '[' ) )
+            {
+            // InternalFormalML.g:67927:2: ( ( '[' ) )
+            // InternalFormalML.g:67928:3: ( '[' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0()); 
+            }
+            // InternalFormalML.g:67929:3: ( '[' )
+            // InternalFormalML.g:67930:4: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0()); 
+            }
+            match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IntervalTypeDefinitionImpl__RopenAssignment_10_1"
+
+
+    // $ANTLR start "rule__CollectionType__ContainerAssignment_1"
+    // InternalFormalML.g:67941:1: rule__CollectionType__ContainerAssignment_1 : ( ruleCollectionKind ) ;
+    public final void rule__CollectionType__ContainerAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67945:1: ( ( ruleCollectionKind ) )
+            // InternalFormalML.g:67946:2: ( ruleCollectionKind )
+            {
+            // InternalFormalML.g:67946:2: ( ruleCollectionKind )
+            // InternalFormalML.g:67947:3: ruleCollectionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getContainerCollectionKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleCollectionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getContainerCollectionKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__ContainerAssignment_1"
+
+
+    // $ANTLR start "rule__CollectionType__SupportAssignment_3"
+    // InternalFormalML.g:67956:1: rule__CollectionType__SupportAssignment_3 : ( ruleDataType ) ;
+    public final void rule__CollectionType__SupportAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67960:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:67961:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:67961:2: ( ruleDataType )
+            // InternalFormalML.g:67962:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getSupportDataTypeParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getSupportDataTypeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__SupportAssignment_3"
+
+
+    // $ANTLR start "rule__CollectionType__SizeAssignment_4_1_0"
+    // InternalFormalML.g:67971:1: rule__CollectionType__SizeAssignment_4_1_0 : ( ruleEInt ) ;
+    public final void rule__CollectionType__SizeAssignment_4_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67975:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:67976:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:67976:2: ( ruleEInt )
+            // InternalFormalML.g:67977:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getSizeEIntParserRuleCall_4_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getSizeEIntParserRuleCall_4_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__SizeAssignment_4_1_0"
+
+
+    // $ANTLR start "rule__CollectionType__UnboundedAssignment_4_1_1"
+    // InternalFormalML.g:67986:1: rule__CollectionType__UnboundedAssignment_4_1_1 : ( ( '*' ) ) ;
+    public final void rule__CollectionType__UnboundedAssignment_4_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:67990:1: ( ( ( '*' ) ) )
+            // InternalFormalML.g:67991:2: ( ( '*' ) )
+            {
+            // InternalFormalML.g:67991:2: ( ( '*' ) )
+            // InternalFormalML.g:67992:3: ( '*' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0()); 
+            }
+            // InternalFormalML.g:67993:3: ( '*' )
+            // InternalFormalML.g:67994:4: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0()); 
+            }
+            match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionType__UnboundedAssignment_4_1_1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__VisibilityAssignment_1"
+    // InternalFormalML.g:68005:1: rule__CollectionTypeDefinition__VisibilityAssignment_1 : ( ruleVisibilityKind ) ;
+    public final void rule__CollectionTypeDefinition__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68009:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:68010:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:68010:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:68011:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__NameAssignment_3"
+    // InternalFormalML.g:68020:1: rule__CollectionTypeDefinition__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__CollectionTypeDefinition__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68024:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68025:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68025:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68026:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__NameAssignment_3"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:68035:1: rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68039:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68040:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68040:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68041:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__ContainerAssignment_5"
+    // InternalFormalML.g:68050:1: rule__CollectionTypeDefinition__ContainerAssignment_5 : ( ruleCollectionKind ) ;
+    public final void rule__CollectionTypeDefinition__ContainerAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68054:1: ( ( ruleCollectionKind ) )
+            // InternalFormalML.g:68055:2: ( ruleCollectionKind )
+            {
+            // InternalFormalML.g:68055:2: ( ruleCollectionKind )
+            // InternalFormalML.g:68056:3: ruleCollectionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getContainerCollectionKindEnumRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleCollectionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getContainerCollectionKindEnumRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__ContainerAssignment_5"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__SupportAssignment_7"
+    // InternalFormalML.g:68065:1: rule__CollectionTypeDefinition__SupportAssignment_7 : ( ruleDataType ) ;
+    public final void rule__CollectionTypeDefinition__SupportAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68069:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:68070:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:68070:2: ( ruleDataType )
+            // InternalFormalML.g:68071:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getSupportDataTypeParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getSupportDataTypeParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__SupportAssignment_7"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__SizeAssignment_8_1_0"
+    // InternalFormalML.g:68080:1: rule__CollectionTypeDefinition__SizeAssignment_8_1_0 : ( ruleEInt ) ;
+    public final void rule__CollectionTypeDefinition__SizeAssignment_8_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68084:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:68085:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:68085:2: ( ruleEInt )
+            // InternalFormalML.g:68086:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getSizeEIntParserRuleCall_8_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getSizeEIntParserRuleCall_8_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__SizeAssignment_8_1_0"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1"
+    // InternalFormalML.g:68095:1: rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1 : ( ( '*' ) ) ;
+    public final void rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68099:1: ( ( ( '*' ) ) )
+            // InternalFormalML.g:68100:2: ( ( '*' ) )
+            {
+            // InternalFormalML.g:68100:2: ( ( '*' ) )
+            // InternalFormalML.g:68101:3: ( '*' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0()); 
+            }
+            // InternalFormalML.g:68102:3: ( '*' )
+            // InternalFormalML.g:68103:4: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0()); 
+            }
+            match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinition__UnboundedAssignment_8_1_1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__NameAssignment_1"
+    // InternalFormalML.g:68114:1: rule__CollectionTypeDefinitionImpl__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__CollectionTypeDefinitionImpl__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68118:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68119:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68119:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68120:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__NameAssignment_1"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:68129:1: rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68133:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68134:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68134:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68135:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__ContainerAssignment_3"
+    // InternalFormalML.g:68144:1: rule__CollectionTypeDefinitionImpl__ContainerAssignment_3 : ( ruleCollectionKind ) ;
+    public final void rule__CollectionTypeDefinitionImpl__ContainerAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68148:1: ( ( ruleCollectionKind ) )
+            // InternalFormalML.g:68149:2: ( ruleCollectionKind )
+            {
+            // InternalFormalML.g:68149:2: ( ruleCollectionKind )
+            // InternalFormalML.g:68150:3: ruleCollectionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerCollectionKindEnumRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleCollectionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerCollectionKindEnumRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__ContainerAssignment_3"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__SupportAssignment_5"
+    // InternalFormalML.g:68159:1: rule__CollectionTypeDefinitionImpl__SupportAssignment_5 : ( ruleDataType ) ;
+    public final void rule__CollectionTypeDefinitionImpl__SupportAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68163:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:68164:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:68164:2: ( ruleDataType )
+            // InternalFormalML.g:68165:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportDataTypeParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportDataTypeParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__SupportAssignment_5"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0"
+    // InternalFormalML.g:68174:1: rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0 : ( ruleEInt ) ;
+    public final void rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68178:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:68179:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:68179:2: ( ruleEInt )
+            // InternalFormalML.g:68180:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeEIntParserRuleCall_6_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeEIntParserRuleCall_6_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__SizeAssignment_6_1_0"
+
+
+    // $ANTLR start "rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1"
+    // InternalFormalML.g:68189:1: rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1 : ( ( '*' ) ) ;
+    public final void rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68193:1: ( ( ( '*' ) ) )
+            // InternalFormalML.g:68194:2: ( ( '*' ) )
+            {
+            // InternalFormalML.g:68194:2: ( ( '*' ) )
+            // InternalFormalML.g:68195:3: ( '*' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0()); 
+            }
+            // InternalFormalML.g:68196:3: ( '*' )
+            // InternalFormalML.g:68197:4: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0()); 
+            }
+            match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CollectionTypeDefinitionImpl__UnboundedAssignment_6_1_1"
+
+
+    // $ANTLR start "rule__EnumerationType__LiteralAssignment_3"
+    // InternalFormalML.g:68208:1: rule__EnumerationType__LiteralAssignment_3 : ( ruleEnumerationLiteral ) ;
+    public final void rule__EnumerationType__LiteralAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68212:1: ( ( ruleEnumerationLiteral ) )
+            // InternalFormalML.g:68213:2: ( ruleEnumerationLiteral )
+            {
+            // InternalFormalML.g:68213:2: ( ruleEnumerationLiteral )
+            // InternalFormalML.g:68214:3: ruleEnumerationLiteral
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__LiteralAssignment_3"
+
+
+    // $ANTLR start "rule__EnumerationType__LiteralAssignment_4_1"
+    // InternalFormalML.g:68223:1: rule__EnumerationType__LiteralAssignment_4_1 : ( ruleEnumerationLiteral ) ;
+    public final void rule__EnumerationType__LiteralAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68227:1: ( ( ruleEnumerationLiteral ) )
+            // InternalFormalML.g:68228:2: ( ruleEnumerationLiteral )
+            {
+            // InternalFormalML.g:68228:2: ( ruleEnumerationLiteral )
+            // InternalFormalML.g:68229:3: ruleEnumerationLiteral
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationType__LiteralAssignment_4_1"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__VisibilityAssignment_1"
+    // InternalFormalML.g:68238:1: rule__EnumerationTypeDefinition__VisibilityAssignment_1 : ( ruleVisibilityKind ) ;
+    public final void rule__EnumerationTypeDefinition__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68242:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:68243:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:68243:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:68244:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__NameAssignment_3"
+    // InternalFormalML.g:68253:1: rule__EnumerationTypeDefinition__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__EnumerationTypeDefinition__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68257:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68258:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68258:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68259:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__NameAssignment_3"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:68268:1: rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68272:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68273:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68273:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68274:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__TypedefAssignment_5"
+    // InternalFormalML.g:68283:1: rule__EnumerationTypeDefinition__TypedefAssignment_5 : ( ( 'enum' ) ) ;
+    public final void rule__EnumerationTypeDefinition__TypedefAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68287:1: ( ( ( 'enum' ) ) )
+            // InternalFormalML.g:68288:2: ( ( 'enum' ) )
+            {
+            // InternalFormalML.g:68288:2: ( ( 'enum' ) )
+            // InternalFormalML.g:68289:3: ( 'enum' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0()); 
+            }
+            // InternalFormalML.g:68290:3: ( 'enum' )
+            // InternalFormalML.g:68291:4: 'enum'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0()); 
+            }
+            match(input,235,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__TypedefAssignment_5"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__LiteralAssignment_7"
+    // InternalFormalML.g:68302:1: rule__EnumerationTypeDefinition__LiteralAssignment_7 : ( ruleEnumerationLiteral ) ;
+    public final void rule__EnumerationTypeDefinition__LiteralAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68306:1: ( ( ruleEnumerationLiteral ) )
+            // InternalFormalML.g:68307:2: ( ruleEnumerationLiteral )
+            {
+            // InternalFormalML.g:68307:2: ( ruleEnumerationLiteral )
+            // InternalFormalML.g:68308:3: ruleEnumerationLiteral
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__LiteralAssignment_7"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinition__LiteralAssignment_8_1"
+    // InternalFormalML.g:68317:1: rule__EnumerationTypeDefinition__LiteralAssignment_8_1 : ( ruleEnumerationLiteral ) ;
+    public final void rule__EnumerationTypeDefinition__LiteralAssignment_8_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68321:1: ( ( ruleEnumerationLiteral ) )
+            // InternalFormalML.g:68322:2: ( ruleEnumerationLiteral )
+            {
+            // InternalFormalML.g:68322:2: ( ruleEnumerationLiteral )
+            // InternalFormalML.g:68323:3: ruleEnumerationLiteral
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_8_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_8_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinition__LiteralAssignment_8_1"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__NameAssignment_1"
+    // InternalFormalML.g:68332:1: rule__EnumerationTypeDefinitionImpl__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68336:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68337:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68337:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68338:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__NameAssignment_1"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:68347:1: rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68351:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68352:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68352:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68353:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3"
+    // InternalFormalML.g:68362:1: rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3 : ( ( 'enum' ) ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68366:1: ( ( ( 'enum' ) ) )
+            // InternalFormalML.g:68367:2: ( ( 'enum' ) )
+            {
+            // InternalFormalML.g:68367:2: ( ( 'enum' ) )
+            // InternalFormalML.g:68368:3: ( 'enum' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0()); 
+            }
+            // InternalFormalML.g:68369:3: ( 'enum' )
+            // InternalFormalML.g:68370:4: 'enum'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0()); 
+            }
+            match(input,235,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__TypedefAssignment_3"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5"
+    // InternalFormalML.g:68381:1: rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5 : ( ruleEnumerationLiteral ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68385:1: ( ( ruleEnumerationLiteral ) )
+            // InternalFormalML.g:68386:2: ( ruleEnumerationLiteral )
+            {
+            // InternalFormalML.g:68386:2: ( ruleEnumerationLiteral )
+            // InternalFormalML.g:68387:3: ruleEnumerationLiteral
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__LiteralAssignment_5"
+
+
+    // $ANTLR start "rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1"
+    // InternalFormalML.g:68396:1: rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1 : ( ruleEnumerationLiteral ) ;
+    public final void rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68400:1: ( ( ruleEnumerationLiteral ) )
+            // InternalFormalML.g:68401:2: ( ruleEnumerationLiteral )
+            {
+            // InternalFormalML.g:68401:2: ( ruleEnumerationLiteral )
+            // InternalFormalML.g:68402:3: ruleEnumerationLiteral
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_6_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationTypeDefinitionImpl__LiteralAssignment_6_1"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__NameAssignment_0"
+    // InternalFormalML.g:68411:1: rule__EnumerationLiteral__NameAssignment_0 : ( ruleESIdentifier ) ;
+    public final void rule__EnumerationLiteral__NameAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68415:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68416:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68416:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68417:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralAccess().getNameESIdentifierParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralAccess().getNameESIdentifierParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__NameAssignment_0"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__UnrestrictedNameAssignment_1"
+    // InternalFormalML.g:68426:1: rule__EnumerationLiteral__UnrestrictedNameAssignment_1 : ( ruleUnrestrictedName ) ;
+    public final void rule__EnumerationLiteral__UnrestrictedNameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68430:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68431:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68431:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68432:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__UnrestrictedNameAssignment_1"
+
+
+    // $ANTLR start "rule__EnumerationLiteral__ValueAssignment_2_1"
+    // InternalFormalML.g:68441:1: rule__EnumerationLiteral__ValueAssignment_2_1 : ( ruleLiteralTerminalExpression ) ;
+    public final void rule__EnumerationLiteral__ValueAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68445:1: ( ( ruleLiteralTerminalExpression ) )
+            // InternalFormalML.g:68446:2: ( ruleLiteralTerminalExpression )
+            {
+            // InternalFormalML.g:68446:2: ( ruleLiteralTerminalExpression )
+            // InternalFormalML.g:68447:3: ruleLiteralTerminalExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEnumerationLiteralAccess().getValueLiteralTerminalExpressionParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLiteralTerminalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEnumerationLiteralAccess().getValueLiteralTerminalExpressionParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EnumerationLiteral__ValueAssignment_2_1"
+
+
+    // $ANTLR start "rule__StructureType__PropertyAssignment_3"
+    // InternalFormalML.g:68456:1: rule__StructureType__PropertyAssignment_3 : ( ruleVariable ) ;
+    public final void rule__StructureType__PropertyAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68460:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:68461:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:68461:2: ( ruleVariable )
+            // InternalFormalML.g:68462:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeAccess().getPropertyVariableParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeAccess().getPropertyVariableParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureType__PropertyAssignment_3"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__VisibilityAssignment_1"
+    // InternalFormalML.g:68471:1: rule__StructureTypeDefinition__VisibilityAssignment_1 : ( ruleVisibilityKind ) ;
+    public final void rule__StructureTypeDefinition__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68475:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:68476:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:68476:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:68477:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__NameAssignment_3"
+    // InternalFormalML.g:68486:1: rule__StructureTypeDefinition__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__StructureTypeDefinition__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68490:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68491:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68491:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68492:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__NameAssignment_3"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:68501:1: rule__StructureTypeDefinition__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__StructureTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68505:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68506:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68506:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68507:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__TypedefAssignment_5"
+    // InternalFormalML.g:68516:1: rule__StructureTypeDefinition__TypedefAssignment_5 : ( ( 'struct' ) ) ;
+    public final void rule__StructureTypeDefinition__TypedefAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68520:1: ( ( ( 'struct' ) ) )
+            // InternalFormalML.g:68521:2: ( ( 'struct' ) )
+            {
+            // InternalFormalML.g:68521:2: ( ( 'struct' ) )
+            // InternalFormalML.g:68522:3: ( 'struct' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0()); 
+            }
+            // InternalFormalML.g:68523:3: ( 'struct' )
+            // InternalFormalML.g:68524:4: 'struct'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0()); 
+            }
+            match(input,236,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__TypedefAssignment_5"
+
+
+    // $ANTLR start "rule__StructureTypeDefinition__PropertyAssignment_7"
+    // InternalFormalML.g:68535:1: rule__StructureTypeDefinition__PropertyAssignment_7 : ( ruleVariable ) ;
+    public final void rule__StructureTypeDefinition__PropertyAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68539:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:68540:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:68540:2: ( ruleVariable )
+            // InternalFormalML.g:68541:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinition__PropertyAssignment_7"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__NameAssignment_1"
+    // InternalFormalML.g:68550:1: rule__StructureTypeDefinitionImpl__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__StructureTypeDefinitionImpl__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68554:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68555:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68555:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68556:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__NameAssignment_1"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:68565:1: rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68569:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68570:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68570:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68571:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__TypedefAssignment_3"
+    // InternalFormalML.g:68580:1: rule__StructureTypeDefinitionImpl__TypedefAssignment_3 : ( ( 'struct' ) ) ;
+    public final void rule__StructureTypeDefinitionImpl__TypedefAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68584:1: ( ( ( 'struct' ) ) )
+            // InternalFormalML.g:68585:2: ( ( 'struct' ) )
+            {
+            // InternalFormalML.g:68585:2: ( ( 'struct' ) )
+            // InternalFormalML.g:68586:3: ( 'struct' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0()); 
+            }
+            // InternalFormalML.g:68587:3: ( 'struct' )
+            // InternalFormalML.g:68588:4: 'struct'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0()); 
+            }
+            match(input,236,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__TypedefAssignment_3"
+
+
+    // $ANTLR start "rule__StructureTypeDefinitionImpl__PropertyAssignment_5"
+    // InternalFormalML.g:68599:1: rule__StructureTypeDefinitionImpl__PropertyAssignment_5 : ( ruleVariable ) ;
+    public final void rule__StructureTypeDefinitionImpl__PropertyAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68603:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:68604:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:68604:2: ( ruleVariable )
+            // InternalFormalML.g:68605:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StructureTypeDefinitionImpl__PropertyAssignment_5"
+
+
+    // $ANTLR start "rule__UnionType__PropertyAssignment_3"
+    // InternalFormalML.g:68614:1: rule__UnionType__PropertyAssignment_3 : ( ruleVariable ) ;
+    public final void rule__UnionType__PropertyAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68618:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:68619:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:68619:2: ( ruleVariable )
+            // InternalFormalML.g:68620:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeAccess().getPropertyVariableParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeAccess().getPropertyVariableParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionType__PropertyAssignment_3"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__VisibilityAssignment_1"
+    // InternalFormalML.g:68629:1: rule__UnionTypeDefinition__VisibilityAssignment_1 : ( ruleVisibilityKind ) ;
+    public final void rule__UnionTypeDefinition__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68633:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:68634:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:68634:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:68635:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__NameAssignment_3"
+    // InternalFormalML.g:68644:1: rule__UnionTypeDefinition__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__UnionTypeDefinition__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68648:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68649:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68649:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68650:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__NameAssignment_3"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:68659:1: rule__UnionTypeDefinition__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__UnionTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68663:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68664:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68664:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68665:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__TypedefAssignment_5"
+    // InternalFormalML.g:68674:1: rule__UnionTypeDefinition__TypedefAssignment_5 : ( ( 'union' ) ) ;
+    public final void rule__UnionTypeDefinition__TypedefAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68678:1: ( ( ( 'union' ) ) )
+            // InternalFormalML.g:68679:2: ( ( 'union' ) )
+            {
+            // InternalFormalML.g:68679:2: ( ( 'union' ) )
+            // InternalFormalML.g:68680:3: ( 'union' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0()); 
+            }
+            // InternalFormalML.g:68681:3: ( 'union' )
+            // InternalFormalML.g:68682:4: 'union'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0()); 
+            }
+            match(input,237,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__TypedefAssignment_5"
+
+
+    // $ANTLR start "rule__UnionTypeDefinition__PropertyAssignment_7"
+    // InternalFormalML.g:68693:1: rule__UnionTypeDefinition__PropertyAssignment_7 : ( ruleVariable ) ;
+    public final void rule__UnionTypeDefinition__PropertyAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68697:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:68698:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:68698:2: ( ruleVariable )
+            // InternalFormalML.g:68699:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinition__PropertyAssignment_7"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__NameAssignment_1"
+    // InternalFormalML.g:68708:1: rule__UnionTypeDefinitionImpl__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__UnionTypeDefinitionImpl__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68712:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68713:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68713:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68714:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__NameAssignment_1"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:68723:1: rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68727:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68728:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68728:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68729:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__TypedefAssignment_3"
+    // InternalFormalML.g:68738:1: rule__UnionTypeDefinitionImpl__TypedefAssignment_3 : ( ( 'union' ) ) ;
+    public final void rule__UnionTypeDefinitionImpl__TypedefAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68742:1: ( ( ( 'union' ) ) )
+            // InternalFormalML.g:68743:2: ( ( 'union' ) )
+            {
+            // InternalFormalML.g:68743:2: ( ( 'union' ) )
+            // InternalFormalML.g:68744:3: ( 'union' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0()); 
+            }
+            // InternalFormalML.g:68745:3: ( 'union' )
+            // InternalFormalML.g:68746:4: 'union'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0()); 
+            }
+            match(input,237,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__TypedefAssignment_3"
+
+
+    // $ANTLR start "rule__UnionTypeDefinitionImpl__PropertyAssignment_5"
+    // InternalFormalML.g:68757:1: rule__UnionTypeDefinitionImpl__PropertyAssignment_5 : ( ruleVariable ) ;
+    public final void rule__UnionTypeDefinitionImpl__PropertyAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68761:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:68762:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:68762:2: ( ruleVariable )
+            // InternalFormalML.g:68763:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__UnionTypeDefinitionImpl__PropertyAssignment_5"
+
+
+    // $ANTLR start "rule__ChoiceType__PropertyAssignment_3"
+    // InternalFormalML.g:68772:1: rule__ChoiceType__PropertyAssignment_3 : ( ruleVariable ) ;
+    public final void rule__ChoiceType__PropertyAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68776:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:68777:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:68777:2: ( ruleVariable )
+            // InternalFormalML.g:68778:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeAccess().getPropertyVariableParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeAccess().getPropertyVariableParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceType__PropertyAssignment_3"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__VisibilityAssignment_1"
+    // InternalFormalML.g:68787:1: rule__ChoiceTypeDefinition__VisibilityAssignment_1 : ( ruleVisibilityKind ) ;
+    public final void rule__ChoiceTypeDefinition__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68791:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:68792:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:68792:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:68793:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__NameAssignment_3"
+    // InternalFormalML.g:68802:1: rule__ChoiceTypeDefinition__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__ChoiceTypeDefinition__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68806:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68807:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68807:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68808:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__NameAssignment_3"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:68817:1: rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68821:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68822:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68822:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68823:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__TypedefAssignment_5"
+    // InternalFormalML.g:68832:1: rule__ChoiceTypeDefinition__TypedefAssignment_5 : ( ( 'choice' ) ) ;
+    public final void rule__ChoiceTypeDefinition__TypedefAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68836:1: ( ( ( 'choice' ) ) )
+            // InternalFormalML.g:68837:2: ( ( 'choice' ) )
+            {
+            // InternalFormalML.g:68837:2: ( ( 'choice' ) )
+            // InternalFormalML.g:68838:3: ( 'choice' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0()); 
+            }
+            // InternalFormalML.g:68839:3: ( 'choice' )
+            // InternalFormalML.g:68840:4: 'choice'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0()); 
+            }
+            match(input,149,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__TypedefAssignment_5"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinition__PropertyAssignment_7"
+    // InternalFormalML.g:68851:1: rule__ChoiceTypeDefinition__PropertyAssignment_7 : ( ruleVariable ) ;
+    public final void rule__ChoiceTypeDefinition__PropertyAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68855:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:68856:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:68856:2: ( ruleVariable )
+            // InternalFormalML.g:68857:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinition__PropertyAssignment_7"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__NameAssignment_1"
+    // InternalFormalML.g:68866:1: rule__ChoiceTypeDefinitionImpl__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68870:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:68871:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:68871:2: ( ruleESIdentifier )
+            // InternalFormalML.g:68872:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__NameAssignment_1"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:68881:1: rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68885:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:68886:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:68886:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:68887:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3"
+    // InternalFormalML.g:68896:1: rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3 : ( ( 'choice' ) ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68900:1: ( ( ( 'choice' ) ) )
+            // InternalFormalML.g:68901:2: ( ( 'choice' ) )
+            {
+            // InternalFormalML.g:68901:2: ( ( 'choice' ) )
+            // InternalFormalML.g:68902:3: ( 'choice' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0()); 
+            }
+            // InternalFormalML.g:68903:3: ( 'choice' )
+            // InternalFormalML.g:68904:4: 'choice'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0()); 
+            }
+            match(input,149,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__TypedefAssignment_3"
+
+
+    // $ANTLR start "rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5"
+    // InternalFormalML.g:68915:1: rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5 : ( ruleVariable ) ;
+    public final void rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68919:1: ( ( ruleVariable ) )
+            // InternalFormalML.g:68920:2: ( ruleVariable )
+            {
+            // InternalFormalML.g:68920:2: ( ruleVariable )
+            // InternalFormalML.g:68921:3: ruleVariable
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChoiceTypeDefinitionImpl__PropertyAssignment_5"
+
+
+    // $ANTLR start "rule__Modifier__StaticAssignment_1_0"
+    // InternalFormalML.g:68930:1: rule__Modifier__StaticAssignment_1_0 : ( ( 'static' ) ) ;
+    public final void rule__Modifier__StaticAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68934:1: ( ( ( 'static' ) ) )
+            // InternalFormalML.g:68935:2: ( ( 'static' ) )
+            {
+            // InternalFormalML.g:68935:2: ( ( 'static' ) )
+            // InternalFormalML.g:68936:3: ( 'static' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0()); 
+            }
+            // InternalFormalML.g:68937:3: ( 'static' )
+            // InternalFormalML.g:68938:4: 'static'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0()); 
+            }
+            match(input,278,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__StaticAssignment_1_0"
+
+
+    // $ANTLR start "rule__Modifier__FinalAssignment_1_1"
+    // InternalFormalML.g:68949:1: rule__Modifier__FinalAssignment_1_1 : ( ( 'final' ) ) ;
+    public final void rule__Modifier__FinalAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68953:1: ( ( ( 'final' ) ) )
+            // InternalFormalML.g:68954:2: ( ( 'final' ) )
+            {
+            // InternalFormalML.g:68954:2: ( ( 'final' ) )
+            // InternalFormalML.g:68955:3: ( 'final' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:68956:3: ( 'final' )
+            // InternalFormalML.g:68957:4: 'final'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0()); 
+            }
+            match(input,179,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__FinalAssignment_1_1"
+
+
+    // $ANTLR start "rule__Modifier__ReferenceAssignment_1_2"
+    // InternalFormalML.g:68968:1: rule__Modifier__ReferenceAssignment_1_2 : ( ( 'reference' ) ) ;
+    public final void rule__Modifier__ReferenceAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68972:1: ( ( ( 'reference' ) ) )
+            // InternalFormalML.g:68973:2: ( ( 'reference' ) )
+            {
+            // InternalFormalML.g:68973:2: ( ( 'reference' ) )
+            // InternalFormalML.g:68974:3: ( 'reference' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0()); 
+            }
+            // InternalFormalML.g:68975:3: ( 'reference' )
+            // InternalFormalML.g:68976:4: 'reference'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0()); 
+            }
+            match(input,279,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__ReferenceAssignment_1_2"
+
+
+    // $ANTLR start "rule__Modifier__VolatileAssignment_1_3"
+    // InternalFormalML.g:68987:1: rule__Modifier__VolatileAssignment_1_3 : ( ( 'volatile' ) ) ;
+    public final void rule__Modifier__VolatileAssignment_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:68991:1: ( ( ( 'volatile' ) ) )
+            // InternalFormalML.g:68992:2: ( ( 'volatile' ) )
+            {
+            // InternalFormalML.g:68992:2: ( ( 'volatile' ) )
+            // InternalFormalML.g:68993:3: ( 'volatile' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0()); 
+            }
+            // InternalFormalML.g:68994:3: ( 'volatile' )
+            // InternalFormalML.g:68995:4: 'volatile'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0()); 
+            }
+            match(input,280,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__VolatileAssignment_1_3"
+
+
+    // $ANTLR start "rule__Modifier__TransientAssignment_1_4"
+    // InternalFormalML.g:69006:1: rule__Modifier__TransientAssignment_1_4 : ( ( 'transient' ) ) ;
+    public final void rule__Modifier__TransientAssignment_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69010:1: ( ( ( 'transient' ) ) )
+            // InternalFormalML.g:69011:2: ( ( 'transient' ) )
+            {
+            // InternalFormalML.g:69011:2: ( ( 'transient' ) )
+            // InternalFormalML.g:69012:3: ( 'transient' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0()); 
+            }
+            // InternalFormalML.g:69013:3: ( 'transient' )
+            // InternalFormalML.g:69014:4: 'transient'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0()); 
+            }
+            match(input,281,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Modifier__TransientAssignment_1_4"
+
+
+    // $ANTLR start "rule__Variable__VisibilityAssignment_0_0"
+    // InternalFormalML.g:69025:1: rule__Variable__VisibilityAssignment_0_0 : ( ruleVisibilityKind ) ;
+    public final void rule__Variable__VisibilityAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69029:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:69030:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:69030:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:69031:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__VisibilityAssignment_0_0"
+
+
+    // $ANTLR start "rule__Variable__ModifierAssignment_0_1"
+    // InternalFormalML.g:69040:1: rule__Variable__ModifierAssignment_0_1 : ( ruleModifier ) ;
+    public final void rule__Variable__ModifierAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69044:1: ( ( ruleModifier ) )
+            // InternalFormalML.g:69045:2: ( ruleModifier )
+            {
+            // InternalFormalML.g:69045:2: ( ruleModifier )
+            // InternalFormalML.g:69046:3: ruleModifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getModifierModifierParserRuleCall_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getModifierModifierParserRuleCall_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__ModifierAssignment_0_1"
+
+
+    // $ANTLR start "rule__Variable__ConstAssignment_1_1"
+    // InternalFormalML.g:69055:1: rule__Variable__ConstAssignment_1_1 : ( ( 'val' ) ) ;
+    public final void rule__Variable__ConstAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69059:1: ( ( ( 'val' ) ) )
+            // InternalFormalML.g:69060:2: ( ( 'val' ) )
+            {
+            // InternalFormalML.g:69060:2: ( ( 'val' ) )
+            // InternalFormalML.g:69061:3: ( 'val' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getConstValKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:69062:3: ( 'val' )
+            // InternalFormalML.g:69063:4: 'val'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getConstValKeyword_1_1_0()); 
+            }
+            match(input,282,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getConstValKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getConstValKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__ConstAssignment_1_1"
+
+
+    // $ANTLR start "rule__Variable__ConstAssignment_1_2_0_0"
+    // InternalFormalML.g:69074:1: rule__Variable__ConstAssignment_1_2_0_0 : ( ( 'const' ) ) ;
+    public final void rule__Variable__ConstAssignment_1_2_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69078:1: ( ( ( 'const' ) ) )
+            // InternalFormalML.g:69079:2: ( ( 'const' ) )
+            {
+            // InternalFormalML.g:69079:2: ( ( 'const' ) )
+            // InternalFormalML.g:69080:3: ( 'const' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0()); 
+            }
+            // InternalFormalML.g:69081:3: ( 'const' )
+            // InternalFormalML.g:69082:4: 'const'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0()); 
+            }
+            match(input,283,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__ConstAssignment_1_2_0_0"
+
+
+    // $ANTLR start "rule__Variable__ConstAssignment_1_2_0_1"
+    // InternalFormalML.g:69093:1: rule__Variable__ConstAssignment_1_2_0_1 : ( ( 'final' ) ) ;
+    public final void rule__Variable__ConstAssignment_1_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69097:1: ( ( ( 'final' ) ) )
+            // InternalFormalML.g:69098:2: ( ( 'final' ) )
+            {
+            // InternalFormalML.g:69098:2: ( ( 'final' ) )
+            // InternalFormalML.g:69099:3: ( 'final' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0()); 
+            }
+            // InternalFormalML.g:69100:3: ( 'final' )
+            // InternalFormalML.g:69101:4: 'final'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0()); 
+            }
+            match(input,179,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__ConstAssignment_1_2_0_1"
+
+
+    // $ANTLR start "rule__Variable__MacroAssignment_1_2_1"
+    // InternalFormalML.g:69112:1: rule__Variable__MacroAssignment_1_2_1 : ( ( 'macro' ) ) ;
+    public final void rule__Variable__MacroAssignment_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69116:1: ( ( ( 'macro' ) ) )
+            // InternalFormalML.g:69117:2: ( ( 'macro' ) )
+            {
+            // InternalFormalML.g:69117:2: ( ( 'macro' ) )
+            // InternalFormalML.g:69118:3: ( 'macro' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0()); 
+            }
+            // InternalFormalML.g:69119:3: ( 'macro' )
+            // InternalFormalML.g:69120:4: 'macro'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0()); 
+            }
+            match(input,224,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__MacroAssignment_1_2_1"
+
+
+    // $ANTLR start "rule__Variable__MacroAssignment_1_3_0"
+    // InternalFormalML.g:69131:1: rule__Variable__MacroAssignment_1_3_0 : ( ( 'macro' ) ) ;
+    public final void rule__Variable__MacroAssignment_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69135:1: ( ( ( 'macro' ) ) )
+            // InternalFormalML.g:69136:2: ( ( 'macro' ) )
+            {
+            // InternalFormalML.g:69136:2: ( ( 'macro' ) )
+            // InternalFormalML.g:69137:3: ( 'macro' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0()); 
+            }
+            // InternalFormalML.g:69138:3: ( 'macro' )
+            // InternalFormalML.g:69139:4: 'macro'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0()); 
+            }
+            match(input,224,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__MacroAssignment_1_3_0"
+
+
+    // $ANTLR start "rule__Variable__ConstAssignment_1_3_1_1"
+    // InternalFormalML.g:69150:1: rule__Variable__ConstAssignment_1_3_1_1 : ( ( 'val' ) ) ;
+    public final void rule__Variable__ConstAssignment_1_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69154:1: ( ( ( 'val' ) ) )
+            // InternalFormalML.g:69155:2: ( ( 'val' ) )
+            {
+            // InternalFormalML.g:69155:2: ( ( 'val' ) )
+            // InternalFormalML.g:69156:3: ( 'val' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0()); 
+            }
+            // InternalFormalML.g:69157:3: ( 'val' )
+            // InternalFormalML.g:69158:4: 'val'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0()); 
+            }
+            match(input,282,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__ConstAssignment_1_3_1_1"
+
+
+    // $ANTLR start "rule__Variable__TypeAssignment_2"
+    // InternalFormalML.g:69169:1: rule__Variable__TypeAssignment_2 : ( ruleDataType ) ;
+    public final void rule__Variable__TypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69173:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:69174:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:69174:2: ( ruleDataType )
+            // InternalFormalML.g:69175:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getTypeDataTypeParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getTypeDataTypeParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__TypeAssignment_2"
+
+
+    // $ANTLR start "rule__Variable__NameAssignment_3"
+    // InternalFormalML.g:69184:1: rule__Variable__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__Variable__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69188:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:69189:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:69189:2: ( ruleESIdentifier )
+            // InternalFormalML.g:69190:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__NameAssignment_3"
+
+
+    // $ANTLR start "rule__Variable__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:69199:1: rule__Variable__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__Variable__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69203:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:69204:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:69204:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:69205:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__Variable__DefaultValueAssignment_5_1"
+    // InternalFormalML.g:69214:1: rule__Variable__DefaultValueAssignment_5_1 : ( ruleExpression ) ;
+    public final void rule__Variable__DefaultValueAssignment_5_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69218:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:69219:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:69219:2: ( ruleExpression )
+            // InternalFormalML.g:69220:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getDefaultValueExpressionParserRuleCall_5_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getDefaultValueExpressionParserRuleCall_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__DefaultValueAssignment_5_1"
+
+
+    // $ANTLR start "rule__Variable__OnWriteActionAssignment_6_0_1"
+    // InternalFormalML.g:69229:1: rule__Variable__OnWriteActionAssignment_6_0_1 : ( ruleOnWriteRoutine ) ;
+    public final void rule__Variable__OnWriteActionAssignment_6_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69233:1: ( ( ruleOnWriteRoutine ) )
+            // InternalFormalML.g:69234:2: ( ruleOnWriteRoutine )
+            {
+            // InternalFormalML.g:69234:2: ( ruleOnWriteRoutine )
+            // InternalFormalML.g:69235:3: ruleOnWriteRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableAccess().getOnWriteActionOnWriteRoutineParserRuleCall_6_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleOnWriteRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableAccess().getOnWriteActionOnWriteRoutineParserRuleCall_6_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Variable__OnWriteActionAssignment_6_0_1"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__ParameterAssignment_2_1"
+    // InternalFormalML.g:69244:1: rule__OnWriteRoutine__ParameterAssignment_2_1 : ( ruleVariableRoutineParameter ) ;
+    public final void rule__OnWriteRoutine__ParameterAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69248:1: ( ( ruleVariableRoutineParameter ) )
+            // InternalFormalML.g:69249:2: ( ruleVariableRoutineParameter )
+            {
+            // InternalFormalML.g:69249:2: ( ruleVariableRoutineParameter )
+            // InternalFormalML.g:69250:3: ruleVariableRoutineParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getParameterVariableRoutineParameterParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVariableRoutineParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getParameterVariableRoutineParameterParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__ParameterAssignment_2_1"
+
+
+    // $ANTLR start "rule__OnWriteRoutine__BodyBlockAssignment_3"
+    // InternalFormalML.g:69259:1: rule__OnWriteRoutine__BodyBlockAssignment_3 : ( ruleBlockStatement ) ;
+    public final void rule__OnWriteRoutine__BodyBlockAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69263:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:69264:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:69264:2: ( ruleBlockStatement )
+            // InternalFormalML.g:69265:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOnWriteRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOnWriteRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OnWriteRoutine__BodyBlockAssignment_3"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__TypeAssignment_0"
+    // InternalFormalML.g:69274:1: rule__VariableRoutineParameter__TypeAssignment_0 : ( ruleDataType ) ;
+    public final void rule__VariableRoutineParameter__TypeAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69278:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:69279:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:69279:2: ( ruleDataType )
+            // InternalFormalML.g:69280:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterAccess().getTypeDataTypeParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterAccess().getTypeDataTypeParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__TypeAssignment_0"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__NameAssignment_1"
+    // InternalFormalML.g:69289:1: rule__VariableRoutineParameter__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__VariableRoutineParameter__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69293:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:69294:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:69294:2: ( ruleESIdentifier )
+            // InternalFormalML.g:69295:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__NameAssignment_1"
+
+
+    // $ANTLR start "rule__VariableRoutineParameter__DefaultValueAssignment_2_1"
+    // InternalFormalML.g:69304:1: rule__VariableRoutineParameter__DefaultValueAssignment_2_1 : ( ruleExpression ) ;
+    public final void rule__VariableRoutineParameter__DefaultValueAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69308:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:69309:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:69309:2: ( ruleExpression )
+            // InternalFormalML.g:69310:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueExpressionParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueExpressionParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableRoutineParameter__DefaultValueAssignment_2_1"
+
+
+    // $ANTLR start "rule__VariablePublic__ModifierAssignment_0"
+    // InternalFormalML.g:69319:1: rule__VariablePublic__ModifierAssignment_0 : ( ruleModifier ) ;
+    public final void rule__VariablePublic__ModifierAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69323:1: ( ( ruleModifier ) )
+            // InternalFormalML.g:69324:2: ( ruleModifier )
+            {
+            // InternalFormalML.g:69324:2: ( ruleModifier )
+            // InternalFormalML.g:69325:3: ruleModifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__ModifierAssignment_0"
+
+
+    // $ANTLR start "rule__VariablePublic__ConstAssignment_1_0_0"
+    // InternalFormalML.g:69334:1: rule__VariablePublic__ConstAssignment_1_0_0 : ( ( 'const' ) ) ;
+    public final void rule__VariablePublic__ConstAssignment_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69338:1: ( ( ( 'const' ) ) )
+            // InternalFormalML.g:69339:2: ( ( 'const' ) )
+            {
+            // InternalFormalML.g:69339:2: ( ( 'const' ) )
+            // InternalFormalML.g:69340:3: ( 'const' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+            // InternalFormalML.g:69341:3: ( 'const' )
+            // InternalFormalML.g:69342:4: 'const'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+            match(input,283,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__ConstAssignment_1_0_0"
+
+
+    // $ANTLR start "rule__VariablePublic__ConstAssignment_1_0_1"
+    // InternalFormalML.g:69353:1: rule__VariablePublic__ConstAssignment_1_0_1 : ( ( 'final' ) ) ;
+    public final void rule__VariablePublic__ConstAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69357:1: ( ( ( 'final' ) ) )
+            // InternalFormalML.g:69358:2: ( ( 'final' ) )
+            {
+            // InternalFormalML.g:69358:2: ( ( 'final' ) )
+            // InternalFormalML.g:69359:3: ( 'final' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+            // InternalFormalML.g:69360:3: ( 'final' )
+            // InternalFormalML.g:69361:4: 'final'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+            match(input,179,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__ConstAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__VariablePublic__MacroAssignment_1_1"
+    // InternalFormalML.g:69372:1: rule__VariablePublic__MacroAssignment_1_1 : ( ( 'macro' ) ) ;
+    public final void rule__VariablePublic__MacroAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69376:1: ( ( ( 'macro' ) ) )
+            // InternalFormalML.g:69377:2: ( ( 'macro' ) )
+            {
+            // InternalFormalML.g:69377:2: ( ( 'macro' ) )
+            // InternalFormalML.g:69378:3: ( 'macro' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:69379:3: ( 'macro' )
+            // InternalFormalML.g:69380:4: 'macro'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+            match(input,224,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__MacroAssignment_1_1"
+
+
+    // $ANTLR start "rule__VariablePublic__VisibilityAssignment_2"
+    // InternalFormalML.g:69391:1: rule__VariablePublic__VisibilityAssignment_2 : ( rulePublicVariableVisibilityKind ) ;
+    public final void rule__VariablePublic__VisibilityAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69395:1: ( ( rulePublicVariableVisibilityKind ) )
+            // InternalFormalML.g:69396:2: ( rulePublicVariableVisibilityKind )
+            {
+            // InternalFormalML.g:69396:2: ( rulePublicVariableVisibilityKind )
+            // InternalFormalML.g:69397:3: rulePublicVariableVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getVisibilityPublicVariableVisibilityKindEnumRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePublicVariableVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getVisibilityPublicVariableVisibilityKindEnumRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__VisibilityAssignment_2"
+
+
+    // $ANTLR start "rule__VariablePublic__TypeAssignment_3"
+    // InternalFormalML.g:69406:1: rule__VariablePublic__TypeAssignment_3 : ( ruleDataType ) ;
+    public final void rule__VariablePublic__TypeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69410:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:69411:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:69411:2: ( ruleDataType )
+            // InternalFormalML.g:69412:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getTypeDataTypeParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getTypeDataTypeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__TypeAssignment_3"
+
+
+    // $ANTLR start "rule__VariablePublic__NameAssignment_4"
+    // InternalFormalML.g:69421:1: rule__VariablePublic__NameAssignment_4 : ( ruleESIdentifier ) ;
+    public final void rule__VariablePublic__NameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69425:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:69426:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:69426:2: ( ruleESIdentifier )
+            // InternalFormalML.g:69427:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getNameESIdentifierParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getNameESIdentifierParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__NameAssignment_4"
+
+
+    // $ANTLR start "rule__VariablePublic__UnrestrictedNameAssignment_5"
+    // InternalFormalML.g:69436:1: rule__VariablePublic__UnrestrictedNameAssignment_5 : ( ruleUnrestrictedName ) ;
+    public final void rule__VariablePublic__UnrestrictedNameAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69440:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:69441:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:69441:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:69442:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__UnrestrictedNameAssignment_5"
+
+
+    // $ANTLR start "rule__VariablePublic__DefaultValueAssignment_6_1"
+    // InternalFormalML.g:69451:1: rule__VariablePublic__DefaultValueAssignment_6_1 : ( ruleExpression ) ;
+    public final void rule__VariablePublic__DefaultValueAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69455:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:69456:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:69456:2: ( ruleExpression )
+            // InternalFormalML.g:69457:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__DefaultValueAssignment_6_1"
+
+
+    // $ANTLR start "rule__VariablePublic__OnWriteActionAssignment_7_0_1"
+    // InternalFormalML.g:69466:1: rule__VariablePublic__OnWriteActionAssignment_7_0_1 : ( ruleOnWriteRoutine ) ;
+    public final void rule__VariablePublic__OnWriteActionAssignment_7_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69470:1: ( ( ruleOnWriteRoutine ) )
+            // InternalFormalML.g:69471:2: ( ruleOnWriteRoutine )
+            {
+            // InternalFormalML.g:69471:2: ( ruleOnWriteRoutine )
+            // InternalFormalML.g:69472:3: ruleOnWriteRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePublicAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleOnWriteRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePublicAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePublic__OnWriteActionAssignment_7_0_1"
+
+
+    // $ANTLR start "rule__VariableProtected__ModifierAssignment_0"
+    // InternalFormalML.g:69481:1: rule__VariableProtected__ModifierAssignment_0 : ( ruleModifier ) ;
+    public final void rule__VariableProtected__ModifierAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69485:1: ( ( ruleModifier ) )
+            // InternalFormalML.g:69486:2: ( ruleModifier )
+            {
+            // InternalFormalML.g:69486:2: ( ruleModifier )
+            // InternalFormalML.g:69487:3: ruleModifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__ModifierAssignment_0"
+
+
+    // $ANTLR start "rule__VariableProtected__ConstAssignment_1_0_0"
+    // InternalFormalML.g:69496:1: rule__VariableProtected__ConstAssignment_1_0_0 : ( ( 'const' ) ) ;
+    public final void rule__VariableProtected__ConstAssignment_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69500:1: ( ( ( 'const' ) ) )
+            // InternalFormalML.g:69501:2: ( ( 'const' ) )
+            {
+            // InternalFormalML.g:69501:2: ( ( 'const' ) )
+            // InternalFormalML.g:69502:3: ( 'const' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+            // InternalFormalML.g:69503:3: ( 'const' )
+            // InternalFormalML.g:69504:4: 'const'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+            match(input,283,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__ConstAssignment_1_0_0"
+
+
+    // $ANTLR start "rule__VariableProtected__ConstAssignment_1_0_1"
+    // InternalFormalML.g:69515:1: rule__VariableProtected__ConstAssignment_1_0_1 : ( ( 'final' ) ) ;
+    public final void rule__VariableProtected__ConstAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69519:1: ( ( ( 'final' ) ) )
+            // InternalFormalML.g:69520:2: ( ( 'final' ) )
+            {
+            // InternalFormalML.g:69520:2: ( ( 'final' ) )
+            // InternalFormalML.g:69521:3: ( 'final' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+            // InternalFormalML.g:69522:3: ( 'final' )
+            // InternalFormalML.g:69523:4: 'final'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+            match(input,179,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__ConstAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__VariableProtected__MacroAssignment_1_1"
+    // InternalFormalML.g:69534:1: rule__VariableProtected__MacroAssignment_1_1 : ( ( 'macro' ) ) ;
+    public final void rule__VariableProtected__MacroAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69538:1: ( ( ( 'macro' ) ) )
+            // InternalFormalML.g:69539:2: ( ( 'macro' ) )
+            {
+            // InternalFormalML.g:69539:2: ( ( 'macro' ) )
+            // InternalFormalML.g:69540:3: ( 'macro' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:69541:3: ( 'macro' )
+            // InternalFormalML.g:69542:4: 'macro'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+            match(input,224,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__MacroAssignment_1_1"
+
+
+    // $ANTLR start "rule__VariableProtected__VisibilityAssignment_2"
+    // InternalFormalML.g:69553:1: rule__VariableProtected__VisibilityAssignment_2 : ( ruleProtectedVariableVisibilityKind ) ;
+    public final void rule__VariableProtected__VisibilityAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69557:1: ( ( ruleProtectedVariableVisibilityKind ) )
+            // InternalFormalML.g:69558:2: ( ruleProtectedVariableVisibilityKind )
+            {
+            // InternalFormalML.g:69558:2: ( ruleProtectedVariableVisibilityKind )
+            // InternalFormalML.g:69559:3: ruleProtectedVariableVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getVisibilityProtectedVariableVisibilityKindEnumRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProtectedVariableVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getVisibilityProtectedVariableVisibilityKindEnumRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__VisibilityAssignment_2"
+
+
+    // $ANTLR start "rule__VariableProtected__TypeAssignment_3"
+    // InternalFormalML.g:69568:1: rule__VariableProtected__TypeAssignment_3 : ( ruleDataType ) ;
+    public final void rule__VariableProtected__TypeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69572:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:69573:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:69573:2: ( ruleDataType )
+            // InternalFormalML.g:69574:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getTypeDataTypeParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getTypeDataTypeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__TypeAssignment_3"
+
+
+    // $ANTLR start "rule__VariableProtected__NameAssignment_4"
+    // InternalFormalML.g:69583:1: rule__VariableProtected__NameAssignment_4 : ( ruleESIdentifier ) ;
+    public final void rule__VariableProtected__NameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69587:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:69588:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:69588:2: ( ruleESIdentifier )
+            // InternalFormalML.g:69589:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getNameESIdentifierParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getNameESIdentifierParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__NameAssignment_4"
+
+
+    // $ANTLR start "rule__VariableProtected__UnrestrictedNameAssignment_5"
+    // InternalFormalML.g:69598:1: rule__VariableProtected__UnrestrictedNameAssignment_5 : ( ruleUnrestrictedName ) ;
+    public final void rule__VariableProtected__UnrestrictedNameAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69602:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:69603:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:69603:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:69604:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__UnrestrictedNameAssignment_5"
+
+
+    // $ANTLR start "rule__VariableProtected__DefaultValueAssignment_6_1"
+    // InternalFormalML.g:69613:1: rule__VariableProtected__DefaultValueAssignment_6_1 : ( ruleExpression ) ;
+    public final void rule__VariableProtected__DefaultValueAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69617:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:69618:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:69618:2: ( ruleExpression )
+            // InternalFormalML.g:69619:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__DefaultValueAssignment_6_1"
+
+
+    // $ANTLR start "rule__VariableProtected__OnWriteActionAssignment_7_0_1"
+    // InternalFormalML.g:69628:1: rule__VariableProtected__OnWriteActionAssignment_7_0_1 : ( ruleOnWriteRoutine ) ;
+    public final void rule__VariableProtected__OnWriteActionAssignment_7_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69632:1: ( ( ruleOnWriteRoutine ) )
+            // InternalFormalML.g:69633:2: ( ruleOnWriteRoutine )
+            {
+            // InternalFormalML.g:69633:2: ( ruleOnWriteRoutine )
+            // InternalFormalML.g:69634:3: ruleOnWriteRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariableProtectedAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleOnWriteRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariableProtectedAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariableProtected__OnWriteActionAssignment_7_0_1"
+
+
+    // $ANTLR start "rule__VariablePrivate__ModifierAssignment_0"
+    // InternalFormalML.g:69643:1: rule__VariablePrivate__ModifierAssignment_0 : ( ruleModifier ) ;
+    public final void rule__VariablePrivate__ModifierAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69647:1: ( ( ruleModifier ) )
+            // InternalFormalML.g:69648:2: ( ruleModifier )
+            {
+            // InternalFormalML.g:69648:2: ( ruleModifier )
+            // InternalFormalML.g:69649:3: ruleModifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__ModifierAssignment_0"
+
+
+    // $ANTLR start "rule__VariablePrivate__ConstAssignment_1_0_0"
+    // InternalFormalML.g:69658:1: rule__VariablePrivate__ConstAssignment_1_0_0 : ( ( 'const' ) ) ;
+    public final void rule__VariablePrivate__ConstAssignment_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69662:1: ( ( ( 'const' ) ) )
+            // InternalFormalML.g:69663:2: ( ( 'const' ) )
+            {
+            // InternalFormalML.g:69663:2: ( ( 'const' ) )
+            // InternalFormalML.g:69664:3: ( 'const' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+            // InternalFormalML.g:69665:3: ( 'const' )
+            // InternalFormalML.g:69666:4: 'const'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+            match(input,283,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__ConstAssignment_1_0_0"
+
+
+    // $ANTLR start "rule__VariablePrivate__ConstAssignment_1_0_1"
+    // InternalFormalML.g:69677:1: rule__VariablePrivate__ConstAssignment_1_0_1 : ( ( 'final' ) ) ;
+    public final void rule__VariablePrivate__ConstAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69681:1: ( ( ( 'final' ) ) )
+            // InternalFormalML.g:69682:2: ( ( 'final' ) )
+            {
+            // InternalFormalML.g:69682:2: ( ( 'final' ) )
+            // InternalFormalML.g:69683:3: ( 'final' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+            // InternalFormalML.g:69684:3: ( 'final' )
+            // InternalFormalML.g:69685:4: 'final'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+            match(input,179,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__ConstAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__VariablePrivate__MacroAssignment_1_1"
+    // InternalFormalML.g:69696:1: rule__VariablePrivate__MacroAssignment_1_1 : ( ( 'macro' ) ) ;
+    public final void rule__VariablePrivate__MacroAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69700:1: ( ( ( 'macro' ) ) )
+            // InternalFormalML.g:69701:2: ( ( 'macro' ) )
+            {
+            // InternalFormalML.g:69701:2: ( ( 'macro' ) )
+            // InternalFormalML.g:69702:3: ( 'macro' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:69703:3: ( 'macro' )
+            // InternalFormalML.g:69704:4: 'macro'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+            match(input,224,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__MacroAssignment_1_1"
+
+
+    // $ANTLR start "rule__VariablePrivate__VisibilityAssignment_2"
+    // InternalFormalML.g:69715:1: rule__VariablePrivate__VisibilityAssignment_2 : ( rulePrivateVariableVisibilityKind ) ;
+    public final void rule__VariablePrivate__VisibilityAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69719:1: ( ( rulePrivateVariableVisibilityKind ) )
+            // InternalFormalML.g:69720:2: ( rulePrivateVariableVisibilityKind )
+            {
+            // InternalFormalML.g:69720:2: ( rulePrivateVariableVisibilityKind )
+            // InternalFormalML.g:69721:3: rulePrivateVariableVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getVisibilityPrivateVariableVisibilityKindEnumRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrivateVariableVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getVisibilityPrivateVariableVisibilityKindEnumRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__VisibilityAssignment_2"
+
+
+    // $ANTLR start "rule__VariablePrivate__TypeAssignment_3"
+    // InternalFormalML.g:69730:1: rule__VariablePrivate__TypeAssignment_3 : ( ruleDataType ) ;
+    public final void rule__VariablePrivate__TypeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69734:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:69735:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:69735:2: ( ruleDataType )
+            // InternalFormalML.g:69736:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getTypeDataTypeParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getTypeDataTypeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__TypeAssignment_3"
+
+
+    // $ANTLR start "rule__VariablePrivate__NameAssignment_4"
+    // InternalFormalML.g:69745:1: rule__VariablePrivate__NameAssignment_4 : ( ruleESIdentifier ) ;
+    public final void rule__VariablePrivate__NameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69749:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:69750:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:69750:2: ( ruleESIdentifier )
+            // InternalFormalML.g:69751:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getNameESIdentifierParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getNameESIdentifierParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__NameAssignment_4"
+
+
+    // $ANTLR start "rule__VariablePrivate__UnrestrictedNameAssignment_5"
+    // InternalFormalML.g:69760:1: rule__VariablePrivate__UnrestrictedNameAssignment_5 : ( ruleUnrestrictedName ) ;
+    public final void rule__VariablePrivate__UnrestrictedNameAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69764:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:69765:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:69765:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:69766:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__UnrestrictedNameAssignment_5"
+
+
+    // $ANTLR start "rule__VariablePrivate__DefaultValueAssignment_6_1"
+    // InternalFormalML.g:69775:1: rule__VariablePrivate__DefaultValueAssignment_6_1 : ( ruleExpression ) ;
+    public final void rule__VariablePrivate__DefaultValueAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69779:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:69780:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:69780:2: ( ruleExpression )
+            // InternalFormalML.g:69781:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getDefaultValueExpressionParserRuleCall_6_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__DefaultValueAssignment_6_1"
+
+
+    // $ANTLR start "rule__VariablePrivate__OnWriteActionAssignment_7_0_1"
+    // InternalFormalML.g:69790:1: rule__VariablePrivate__OnWriteActionAssignment_7_0_1 : ( ruleOnWriteRoutine ) ;
+    public final void rule__VariablePrivate__OnWriteActionAssignment_7_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69794:1: ( ( ruleOnWriteRoutine ) )
+            // InternalFormalML.g:69795:2: ( ruleOnWriteRoutine )
+            {
+            // InternalFormalML.g:69795:2: ( ruleOnWriteRoutine )
+            // InternalFormalML.g:69796:3: ruleOnWriteRoutine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getVariablePrivateAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleOnWriteRoutine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getVariablePrivateAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__VariablePrivate__OnWriteActionAssignment_7_0_1"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__ParameterAssignment_1"
+    // InternalFormalML.g:69805:1: rule__FunctionalParameterSet__ParameterAssignment_1 : ( ruleFunctionalParameter ) ;
+    public final void rule__FunctionalParameterSet__ParameterAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69809:1: ( ( ruleFunctionalParameter ) )
+            // InternalFormalML.g:69810:2: ( ruleFunctionalParameter )
+            {
+            // InternalFormalML.g:69810:2: ( ruleFunctionalParameter )
+            // InternalFormalML.g:69811:3: ruleFunctionalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFunctionalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__ParameterAssignment_1"
+
+
+    // $ANTLR start "rule__FunctionalParameterSet__ParameterAssignment_2_1"
+    // InternalFormalML.g:69820:1: rule__FunctionalParameterSet__ParameterAssignment_2_1 : ( ruleFunctionalParameter ) ;
+    public final void rule__FunctionalParameterSet__ParameterAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69824:1: ( ( ruleFunctionalParameter ) )
+            // InternalFormalML.g:69825:2: ( ruleFunctionalParameter )
+            {
+            // InternalFormalML.g:69825:2: ( ruleFunctionalParameter )
+            // InternalFormalML.g:69826:3: ruleFunctionalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFunctionalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameterSet__ParameterAssignment_2_1"
+
+
+    // $ANTLR start "rule__FunctionalParameter__DirectionAssignment_1"
+    // InternalFormalML.g:69835:1: rule__FunctionalParameter__DirectionAssignment_1 : ( ruleParameterDirectionKind ) ;
+    public final void rule__FunctionalParameter__DirectionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69839:1: ( ( ruleParameterDirectionKind ) )
+            // InternalFormalML.g:69840:2: ( ruleParameterDirectionKind )
+            {
+            // InternalFormalML.g:69840:2: ( ruleParameterDirectionKind )
+            // InternalFormalML.g:69841:3: ruleParameterDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__DirectionAssignment_1"
+
+
+    // $ANTLR start "rule__FunctionalParameter__TypeAssignment_2"
+    // InternalFormalML.g:69850:1: rule__FunctionalParameter__TypeAssignment_2 : ( ruleDataType ) ;
+    public final void rule__FunctionalParameter__TypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69854:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:69855:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:69855:2: ( ruleDataType )
+            // InternalFormalML.g:69856:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getTypeDataTypeParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getTypeDataTypeParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__TypeAssignment_2"
+
+
+    // $ANTLR start "rule__FunctionalParameter__NameAssignment_3"
+    // InternalFormalML.g:69865:1: rule__FunctionalParameter__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__FunctionalParameter__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69869:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:69870:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:69870:2: ( ruleESIdentifier )
+            // InternalFormalML.g:69871:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__NameAssignment_3"
+
+
+    // $ANTLR start "rule__FunctionalParameter__DefaultValueAssignment_4_1"
+    // InternalFormalML.g:69880:1: rule__FunctionalParameter__DefaultValueAssignment_4_1 : ( ruleExpression ) ;
+    public final void rule__FunctionalParameter__DefaultValueAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69884:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:69885:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:69885:2: ( ruleExpression )
+            // InternalFormalML.g:69886:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFunctionalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFunctionalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FunctionalParameter__DefaultValueAssignment_4_1"
+
+
+    // $ANTLR start "rule__FormalParameterSet__ParameterAssignment_1"
+    // InternalFormalML.g:69895:1: rule__FormalParameterSet__ParameterAssignment_1 : ( ruleFormalParameter ) ;
+    public final void rule__FormalParameterSet__ParameterAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69899:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:69900:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:69900:2: ( ruleFormalParameter )
+            // InternalFormalML.g:69901:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__ParameterAssignment_1"
+
+
+    // $ANTLR start "rule__FormalParameterSet__ParameterAssignment_2_1"
+    // InternalFormalML.g:69910:1: rule__FormalParameterSet__ParameterAssignment_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__FormalParameterSet__ParameterAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69914:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:69915:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:69915:2: ( ruleFormalParameter )
+            // InternalFormalML.g:69916:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameterSet__ParameterAssignment_2_1"
+
+
+    // $ANTLR start "rule__FormalParameter__DirectionAssignment_1"
+    // InternalFormalML.g:69925:1: rule__FormalParameter__DirectionAssignment_1 : ( ruleParameterDirectionKind ) ;
+    public final void rule__FormalParameter__DirectionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69929:1: ( ( ruleParameterDirectionKind ) )
+            // InternalFormalML.g:69930:2: ( ruleParameterDirectionKind )
+            {
+            // InternalFormalML.g:69930:2: ( ruleParameterDirectionKind )
+            // InternalFormalML.g:69931:3: ruleParameterDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__DirectionAssignment_1"
+
+
+    // $ANTLR start "rule__FormalParameter__TypeAssignment_2"
+    // InternalFormalML.g:69940:1: rule__FormalParameter__TypeAssignment_2 : ( ruleDataType ) ;
+    public final void rule__FormalParameter__TypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69944:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:69945:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:69945:2: ( ruleDataType )
+            // InternalFormalML.g:69946:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getTypeDataTypeParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getTypeDataTypeParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__TypeAssignment_2"
+
+
+    // $ANTLR start "rule__FormalParameter__NameAssignment_3"
+    // InternalFormalML.g:69955:1: rule__FormalParameter__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__FormalParameter__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69959:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:69960:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:69960:2: ( ruleESIdentifier )
+            // InternalFormalML.g:69961:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__NameAssignment_3"
+
+
+    // $ANTLR start "rule__FormalParameter__DefaultValueAssignment_4_1"
+    // InternalFormalML.g:69970:1: rule__FormalParameter__DefaultValueAssignment_4_1 : ( ruleExpression ) ;
+    public final void rule__FormalParameter__DefaultValueAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69974:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:69975:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:69975:2: ( ruleExpression )
+            // InternalFormalML.g:69976:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getFormalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getFormalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__FormalParameter__DefaultValueAssignment_4_1"
+
+
+    // $ANTLR start "rule__ParameterInput__DirectionAssignment_0"
+    // InternalFormalML.g:69985:1: rule__ParameterInput__DirectionAssignment_0 : ( ruleParameterInputDirectionKind ) ;
+    public final void rule__ParameterInput__DirectionAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:69989:1: ( ( ruleParameterInputDirectionKind ) )
+            // InternalFormalML.g:69990:2: ( ruleParameterInputDirectionKind )
+            {
+            // InternalFormalML.g:69990:2: ( ruleParameterInputDirectionKind )
+            // InternalFormalML.g:69991:3: ruleParameterInputDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getDirectionParameterInputDirectionKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInputDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getDirectionParameterInputDirectionKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__DirectionAssignment_0"
+
+
+    // $ANTLR start "rule__ParameterInput__TypeAssignment_1"
+    // InternalFormalML.g:70000:1: rule__ParameterInput__TypeAssignment_1 : ( ruleDataType ) ;
+    public final void rule__ParameterInput__TypeAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70004:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:70005:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:70005:2: ( ruleDataType )
+            // InternalFormalML.g:70006:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getTypeDataTypeParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getTypeDataTypeParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__TypeAssignment_1"
+
+
+    // $ANTLR start "rule__ParameterInput__NameAssignment_2"
+    // InternalFormalML.g:70015:1: rule__ParameterInput__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__ParameterInput__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70019:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70020:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70020:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70021:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__NameAssignment_2"
+
+
+    // $ANTLR start "rule__ParameterInput__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:70030:1: rule__ParameterInput__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__ParameterInput__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70034:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70035:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70035:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70036:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__ParameterInput__DefaultValueAssignment_4_1"
+    // InternalFormalML.g:70045:1: rule__ParameterInput__DefaultValueAssignment_4_1 : ( ruleExpression ) ;
+    public final void rule__ParameterInput__DefaultValueAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70049:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:70050:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:70050:2: ( ruleExpression )
+            // InternalFormalML.g:70051:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInputAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInputAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInput__DefaultValueAssignment_4_1"
+
+
+    // $ANTLR start "rule__ParameterInout__DirectionAssignment_0"
+    // InternalFormalML.g:70060:1: rule__ParameterInout__DirectionAssignment_0 : ( ruleParameterInoutDirectionKind ) ;
+    public final void rule__ParameterInout__DirectionAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70064:1: ( ( ruleParameterInoutDirectionKind ) )
+            // InternalFormalML.g:70065:2: ( ruleParameterInoutDirectionKind )
+            {
+            // InternalFormalML.g:70065:2: ( ruleParameterInoutDirectionKind )
+            // InternalFormalML.g:70066:3: ruleParameterInoutDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getDirectionParameterInoutDirectionKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterInoutDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getDirectionParameterInoutDirectionKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__DirectionAssignment_0"
+
+
+    // $ANTLR start "rule__ParameterInout__TypeAssignment_1"
+    // InternalFormalML.g:70075:1: rule__ParameterInout__TypeAssignment_1 : ( ruleDataType ) ;
+    public final void rule__ParameterInout__TypeAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70079:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:70080:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:70080:2: ( ruleDataType )
+            // InternalFormalML.g:70081:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getTypeDataTypeParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getTypeDataTypeParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__TypeAssignment_1"
+
+
+    // $ANTLR start "rule__ParameterInout__NameAssignment_2"
+    // InternalFormalML.g:70090:1: rule__ParameterInout__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__ParameterInout__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70094:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70095:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70095:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70096:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__NameAssignment_2"
+
+
+    // $ANTLR start "rule__ParameterInout__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:70105:1: rule__ParameterInout__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__ParameterInout__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70109:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70110:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70110:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70111:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__ParameterInout__DefaultValueAssignment_4_1"
+    // InternalFormalML.g:70120:1: rule__ParameterInout__DefaultValueAssignment_4_1 : ( ruleExpression ) ;
+    public final void rule__ParameterInout__DefaultValueAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70124:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:70125:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:70125:2: ( ruleExpression )
+            // InternalFormalML.g:70126:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterInoutAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterInoutAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterInout__DefaultValueAssignment_4_1"
+
+
+    // $ANTLR start "rule__ParameterOutput__DirectionAssignment_0"
+    // InternalFormalML.g:70135:1: rule__ParameterOutput__DirectionAssignment_0 : ( ruleParameterOutputDirectionKind ) ;
+    public final void rule__ParameterOutput__DirectionAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70139:1: ( ( ruleParameterOutputDirectionKind ) )
+            // InternalFormalML.g:70140:2: ( ruleParameterOutputDirectionKind )
+            {
+            // InternalFormalML.g:70140:2: ( ruleParameterOutputDirectionKind )
+            // InternalFormalML.g:70141:3: ruleParameterOutputDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getDirectionParameterOutputDirectionKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterOutputDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getDirectionParameterOutputDirectionKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__DirectionAssignment_0"
+
+
+    // $ANTLR start "rule__ParameterOutput__TypeAssignment_1"
+    // InternalFormalML.g:70150:1: rule__ParameterOutput__TypeAssignment_1 : ( ruleDataType ) ;
+    public final void rule__ParameterOutput__TypeAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70154:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:70155:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:70155:2: ( ruleDataType )
+            // InternalFormalML.g:70156:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getTypeDataTypeParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getTypeDataTypeParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__TypeAssignment_1"
+
+
+    // $ANTLR start "rule__ParameterOutput__NameAssignment_2"
+    // InternalFormalML.g:70165:1: rule__ParameterOutput__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__ParameterOutput__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70169:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70170:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70170:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70171:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__NameAssignment_2"
+
+
+    // $ANTLR start "rule__ParameterOutput__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:70180:1: rule__ParameterOutput__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__ParameterOutput__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70184:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70185:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70185:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70186:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__ParameterOutput__DefaultValueAssignment_4_1"
+    // InternalFormalML.g:70195:1: rule__ParameterOutput__DefaultValueAssignment_4_1 : ( ruleExpression ) ;
+    public final void rule__ParameterOutput__DefaultValueAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70199:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:70200:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:70200:2: ( ruleExpression )
+            // InternalFormalML.g:70201:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterOutputAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterOutputAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterOutput__DefaultValueAssignment_4_1"
+
+
+    // $ANTLR start "rule__ParameterReturn__DirectionAssignment_0"
+    // InternalFormalML.g:70210:1: rule__ParameterReturn__DirectionAssignment_0 : ( ruleParameterReturnDirectionKind ) ;
+    public final void rule__ParameterReturn__DirectionAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70214:1: ( ( ruleParameterReturnDirectionKind ) )
+            // InternalFormalML.g:70215:2: ( ruleParameterReturnDirectionKind )
+            {
+            // InternalFormalML.g:70215:2: ( ruleParameterReturnDirectionKind )
+            // InternalFormalML.g:70216:3: ruleParameterReturnDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getDirectionParameterReturnDirectionKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleParameterReturnDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getDirectionParameterReturnDirectionKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__DirectionAssignment_0"
+
+
+    // $ANTLR start "rule__ParameterReturn__TypeAssignment_1"
+    // InternalFormalML.g:70225:1: rule__ParameterReturn__TypeAssignment_1 : ( ruleDataType ) ;
+    public final void rule__ParameterReturn__TypeAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70229:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:70230:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:70230:2: ( ruleDataType )
+            // InternalFormalML.g:70231:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getTypeDataTypeParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getTypeDataTypeParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__TypeAssignment_1"
+
+
+    // $ANTLR start "rule__ParameterReturn__NameAssignment_2"
+    // InternalFormalML.g:70240:1: rule__ParameterReturn__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__ParameterReturn__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70244:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70245:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70245:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70246:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__NameAssignment_2"
+
+
+    // $ANTLR start "rule__ParameterReturn__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:70255:1: rule__ParameterReturn__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__ParameterReturn__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70259:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70260:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70260:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70261:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__ParameterReturn__DefaultValueAssignment_4_1"
+    // InternalFormalML.g:70270:1: rule__ParameterReturn__DefaultValueAssignment_4_1 : ( ruleExpression ) ;
+    public final void rule__ParameterReturn__DefaultValueAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70274:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:70275:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:70275:2: ( ruleExpression )
+            // InternalFormalML.g:70276:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getParameterReturnAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getParameterReturnAccess().getDefaultValueExpressionParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ParameterReturn__DefaultValueAssignment_4_1"
+
+
+    // $ANTLR start "rule__BufferContainerType__ContainerAssignment_1"
+    // InternalFormalML.g:70285:1: rule__BufferContainerType__ContainerAssignment_1 : ( ruleBufferContainerKind ) ;
+    public final void rule__BufferContainerType__ContainerAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70289:1: ( ( ruleBufferContainerKind ) )
+            // InternalFormalML.g:70290:2: ( ruleBufferContainerKind )
+            {
+            // InternalFormalML.g:70290:2: ( ruleBufferContainerKind )
+            // InternalFormalML.g:70291:3: ruleBufferContainerKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getContainerBufferContainerKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getContainerBufferContainerKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__ContainerAssignment_1"
+
+
+    // $ANTLR start "rule__BufferContainerType__SizeAssignment_2_1_0"
+    // InternalFormalML.g:70300:1: rule__BufferContainerType__SizeAssignment_2_1_0 : ( ruleEInt ) ;
+    public final void rule__BufferContainerType__SizeAssignment_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70304:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:70305:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:70305:2: ( ruleEInt )
+            // InternalFormalML.g:70306:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getSizeEIntParserRuleCall_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getSizeEIntParserRuleCall_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__SizeAssignment_2_1_0"
+
+
+    // $ANTLR start "rule__BufferContainerType__UnboundedAssignment_2_1_1"
+    // InternalFormalML.g:70315:1: rule__BufferContainerType__UnboundedAssignment_2_1_1 : ( ( '*' ) ) ;
+    public final void rule__BufferContainerType__UnboundedAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70319:1: ( ( ( '*' ) ) )
+            // InternalFormalML.g:70320:2: ( ( '*' ) )
+            {
+            // InternalFormalML.g:70320:2: ( ( '*' ) )
+            // InternalFormalML.g:70321:3: ( '*' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0()); 
+            }
+            // InternalFormalML.g:70322:3: ( '*' )
+            // InternalFormalML.g:70323:4: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0()); 
+            }
+            match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferContainerType__UnboundedAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__Buffer__VisibilityAssignment_0_0"
+    // InternalFormalML.g:70334:1: rule__Buffer__VisibilityAssignment_0_0 : ( ruleVisibilityKind ) ;
+    public final void rule__Buffer__VisibilityAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70338:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:70339:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:70339:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:70340:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__VisibilityAssignment_0_0"
+
+
+    // $ANTLR start "rule__Buffer__ModifierAssignment_0_1"
+    // InternalFormalML.g:70349:1: rule__Buffer__ModifierAssignment_0_1 : ( ruleModifier ) ;
+    public final void rule__Buffer__ModifierAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70353:1: ( ( ruleModifier ) )
+            // InternalFormalML.g:70354:2: ( ruleModifier )
+            {
+            // InternalFormalML.g:70354:2: ( ruleModifier )
+            // InternalFormalML.g:70355:3: ruleModifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getModifierModifierParserRuleCall_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getModifierModifierParserRuleCall_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__ModifierAssignment_0_1"
+
+
+    // $ANTLR start "rule__Buffer__TypeAssignment_2"
+    // InternalFormalML.g:70364:1: rule__Buffer__TypeAssignment_2 : ( ruleBufferContainerType ) ;
+    public final void rule__Buffer__TypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70368:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:70369:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:70369:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:70370:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__TypeAssignment_2"
+
+
+    // $ANTLR start "rule__Buffer__NameAssignment_3"
+    // InternalFormalML.g:70379:1: rule__Buffer__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__Buffer__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70383:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70384:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70384:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70385:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__NameAssignment_3"
+
+
+    // $ANTLR start "rule__Buffer__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:70394:1: rule__Buffer__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__Buffer__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70398:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70399:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70399:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70400:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Buffer__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__BufferPublic__ModifierAssignment_0"
+    // InternalFormalML.g:70409:1: rule__BufferPublic__ModifierAssignment_0 : ( ruleModifier ) ;
+    public final void rule__BufferPublic__ModifierAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70413:1: ( ( ruleModifier ) )
+            // InternalFormalML.g:70414:2: ( ruleModifier )
+            {
+            // InternalFormalML.g:70414:2: ( ruleModifier )
+            // InternalFormalML.g:70415:3: ruleModifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__ModifierAssignment_0"
+
+
+    // $ANTLR start "rule__BufferPublic__VisibilityAssignment_1"
+    // InternalFormalML.g:70424:1: rule__BufferPublic__VisibilityAssignment_1 : ( rulePublicBufferVisibilityKind ) ;
+    public final void rule__BufferPublic__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70428:1: ( ( rulePublicBufferVisibilityKind ) )
+            // InternalFormalML.g:70429:2: ( rulePublicBufferVisibilityKind )
+            {
+            // InternalFormalML.g:70429:2: ( rulePublicBufferVisibilityKind )
+            // InternalFormalML.g:70430:3: rulePublicBufferVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getVisibilityPublicBufferVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePublicBufferVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getVisibilityPublicBufferVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__BufferPublic__TypeAssignment_2"
+    // InternalFormalML.g:70439:1: rule__BufferPublic__TypeAssignment_2 : ( ruleBufferContainerType ) ;
+    public final void rule__BufferPublic__TypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70443:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:70444:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:70444:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:70445:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__TypeAssignment_2"
+
+
+    // $ANTLR start "rule__BufferPublic__NameAssignment_3"
+    // InternalFormalML.g:70454:1: rule__BufferPublic__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__BufferPublic__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70458:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70459:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70459:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70460:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__NameAssignment_3"
+
+
+    // $ANTLR start "rule__BufferPublic__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:70469:1: rule__BufferPublic__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__BufferPublic__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70473:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70474:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70474:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70475:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPublic__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__BufferProtected__ModifierAssignment_0"
+    // InternalFormalML.g:70484:1: rule__BufferProtected__ModifierAssignment_0 : ( ruleModifier ) ;
+    public final void rule__BufferProtected__ModifierAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70488:1: ( ( ruleModifier ) )
+            // InternalFormalML.g:70489:2: ( ruleModifier )
+            {
+            // InternalFormalML.g:70489:2: ( ruleModifier )
+            // InternalFormalML.g:70490:3: ruleModifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__ModifierAssignment_0"
+
+
+    // $ANTLR start "rule__BufferProtected__VisibilityAssignment_1"
+    // InternalFormalML.g:70499:1: rule__BufferProtected__VisibilityAssignment_1 : ( ruleProtectedBufferVisibilityKind ) ;
+    public final void rule__BufferProtected__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70503:1: ( ( ruleProtectedBufferVisibilityKind ) )
+            // InternalFormalML.g:70504:2: ( ruleProtectedBufferVisibilityKind )
+            {
+            // InternalFormalML.g:70504:2: ( ruleProtectedBufferVisibilityKind )
+            // InternalFormalML.g:70505:3: ruleProtectedBufferVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getVisibilityProtectedBufferVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProtectedBufferVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getVisibilityProtectedBufferVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__BufferProtected__TypeAssignment_2"
+    // InternalFormalML.g:70514:1: rule__BufferProtected__TypeAssignment_2 : ( ruleBufferContainerType ) ;
+    public final void rule__BufferProtected__TypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70518:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:70519:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:70519:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:70520:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__TypeAssignment_2"
+
+
+    // $ANTLR start "rule__BufferProtected__NameAssignment_3"
+    // InternalFormalML.g:70529:1: rule__BufferProtected__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__BufferProtected__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70533:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70534:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70534:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70535:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__NameAssignment_3"
+
+
+    // $ANTLR start "rule__BufferProtected__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:70544:1: rule__BufferProtected__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__BufferProtected__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70548:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70549:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70549:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70550:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferProtected__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__BufferPrivate__ModifierAssignment_0"
+    // InternalFormalML.g:70559:1: rule__BufferPrivate__ModifierAssignment_0 : ( ruleModifier ) ;
+    public final void rule__BufferPrivate__ModifierAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70563:1: ( ( ruleModifier ) )
+            // InternalFormalML.g:70564:2: ( ruleModifier )
+            {
+            // InternalFormalML.g:70564:2: ( ruleModifier )
+            // InternalFormalML.g:70565:3: ruleModifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getModifierModifierParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__ModifierAssignment_0"
+
+
+    // $ANTLR start "rule__BufferPrivate__VisibilityAssignment_1"
+    // InternalFormalML.g:70574:1: rule__BufferPrivate__VisibilityAssignment_1 : ( rulePrivateBufferVisibilityKind ) ;
+    public final void rule__BufferPrivate__VisibilityAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70578:1: ( ( rulePrivateBufferVisibilityKind ) )
+            // InternalFormalML.g:70579:2: ( rulePrivateBufferVisibilityKind )
+            {
+            // InternalFormalML.g:70579:2: ( rulePrivateBufferVisibilityKind )
+            // InternalFormalML.g:70580:3: rulePrivateBufferVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getVisibilityPrivateBufferVisibilityKindEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrivateBufferVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getVisibilityPrivateBufferVisibilityKindEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__VisibilityAssignment_1"
+
+
+    // $ANTLR start "rule__BufferPrivate__TypeAssignment_2"
+    // InternalFormalML.g:70589:1: rule__BufferPrivate__TypeAssignment_2 : ( ruleBufferContainerType ) ;
+    public final void rule__BufferPrivate__TypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70593:1: ( ( ruleBufferContainerType ) )
+            // InternalFormalML.g:70594:2: ( ruleBufferContainerType )
+            {
+            // InternalFormalML.g:70594:2: ( ruleBufferContainerType )
+            // InternalFormalML.g:70595:3: ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getTypeBufferContainerTypeParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__TypeAssignment_2"
+
+
+    // $ANTLR start "rule__BufferPrivate__NameAssignment_3"
+    // InternalFormalML.g:70604:1: rule__BufferPrivate__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__BufferPrivate__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70608:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70609:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70609:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70610:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__NameAssignment_3"
+
+
+    // $ANTLR start "rule__BufferPrivate__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:70619:1: rule__BufferPrivate__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__BufferPrivate__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70623:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70624:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70624:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70625:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BufferPrivate__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__Port__VisibilityAssignment_0"
+    // InternalFormalML.g:70634:1: rule__Port__VisibilityAssignment_0 : ( ruleVisibilityKind ) ;
+    public final void rule__Port__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70638:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:70639:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:70639:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:70640:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__Port__DirectionAssignment_2"
+    // InternalFormalML.g:70649:1: rule__Port__DirectionAssignment_2 : ( ruleChannelDirection ) ;
+    public final void rule__Port__DirectionAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70653:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:70654:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:70654:2: ( ruleChannelDirection )
+            // InternalFormalML.g:70655:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getDirectionChannelDirectionEnumRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getDirectionChannelDirectionEnumRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__DirectionAssignment_2"
+
+
+    // $ANTLR start "rule__Port__NameAssignment_3"
+    // InternalFormalML.g:70664:1: rule__Port__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__Port__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70668:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70669:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70669:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70670:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__NameAssignment_3"
+
+
+    // $ANTLR start "rule__Port__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:70679:1: rule__Port__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__Port__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70683:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70684:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70684:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70685:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__Port__ParameterAssignment_5_1"
+    // InternalFormalML.g:70694:1: rule__Port__ParameterAssignment_5_1 : ( ruleFormalParameter ) ;
+    public final void rule__Port__ParameterAssignment_5_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70698:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:70699:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:70699:2: ( ruleFormalParameter )
+            // InternalFormalML.g:70700:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__ParameterAssignment_5_1"
+
+
+    // $ANTLR start "rule__Port__ParameterAssignment_5_2_1"
+    // InternalFormalML.g:70709:1: rule__Port__ParameterAssignment_5_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__Port__ParameterAssignment_5_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70713:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:70714:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:70714:2: ( ruleFormalParameter )
+            // InternalFormalML.g:70715:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Port__ParameterAssignment_5_2_1"
+
+
+    // $ANTLR start "rule__PortPublic__VisibilityAssignment_0"
+    // InternalFormalML.g:70724:1: rule__PortPublic__VisibilityAssignment_0 : ( rulePublicPortVisibilityKind ) ;
+    public final void rule__PortPublic__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70728:1: ( ( rulePublicPortVisibilityKind ) )
+            // InternalFormalML.g:70729:2: ( rulePublicPortVisibilityKind )
+            {
+            // InternalFormalML.g:70729:2: ( rulePublicPortVisibilityKind )
+            // InternalFormalML.g:70730:3: rulePublicPortVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getVisibilityPublicPortVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePublicPortVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getVisibilityPublicPortVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__PortPublic__DirectionAssignment_1"
+    // InternalFormalML.g:70739:1: rule__PortPublic__DirectionAssignment_1 : ( ruleChannelDirection ) ;
+    public final void rule__PortPublic__DirectionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70743:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:70744:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:70744:2: ( ruleChannelDirection )
+            // InternalFormalML.g:70745:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__DirectionAssignment_1"
+
+
+    // $ANTLR start "rule__PortPublic__NameAssignment_2"
+    // InternalFormalML.g:70754:1: rule__PortPublic__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__PortPublic__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70758:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70759:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70759:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70760:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__NameAssignment_2"
+
+
+    // $ANTLR start "rule__PortPublic__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:70769:1: rule__PortPublic__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__PortPublic__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70773:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70774:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70774:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70775:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__PortPublic__ParameterAssignment_4_1"
+    // InternalFormalML.g:70784:1: rule__PortPublic__ParameterAssignment_4_1 : ( ruleFormalParameter ) ;
+    public final void rule__PortPublic__ParameterAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70788:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:70789:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:70789:2: ( ruleFormalParameter )
+            // InternalFormalML.g:70790:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__ParameterAssignment_4_1"
+
+
+    // $ANTLR start "rule__PortPublic__ParameterAssignment_4_2_1"
+    // InternalFormalML.g:70799:1: rule__PortPublic__ParameterAssignment_4_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__PortPublic__ParameterAssignment_4_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70803:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:70804:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:70804:2: ( ruleFormalParameter )
+            // InternalFormalML.g:70805:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPublic__ParameterAssignment_4_2_1"
+
+
+    // $ANTLR start "rule__PortProtected__VisibilityAssignment_0"
+    // InternalFormalML.g:70814:1: rule__PortProtected__VisibilityAssignment_0 : ( ruleProtectedPortVisibilityKind ) ;
+    public final void rule__PortProtected__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70818:1: ( ( ruleProtectedPortVisibilityKind ) )
+            // InternalFormalML.g:70819:2: ( ruleProtectedPortVisibilityKind )
+            {
+            // InternalFormalML.g:70819:2: ( ruleProtectedPortVisibilityKind )
+            // InternalFormalML.g:70820:3: ruleProtectedPortVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getVisibilityProtectedPortVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProtectedPortVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getVisibilityProtectedPortVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__PortProtected__DirectionAssignment_1"
+    // InternalFormalML.g:70829:1: rule__PortProtected__DirectionAssignment_1 : ( ruleChannelDirection ) ;
+    public final void rule__PortProtected__DirectionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70833:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:70834:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:70834:2: ( ruleChannelDirection )
+            // InternalFormalML.g:70835:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__DirectionAssignment_1"
+
+
+    // $ANTLR start "rule__PortProtected__NameAssignment_2"
+    // InternalFormalML.g:70844:1: rule__PortProtected__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__PortProtected__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70848:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70849:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70849:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70850:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__NameAssignment_2"
+
+
+    // $ANTLR start "rule__PortProtected__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:70859:1: rule__PortProtected__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__PortProtected__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70863:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70864:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70864:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70865:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__PortProtected__ParameterAssignment_4_1"
+    // InternalFormalML.g:70874:1: rule__PortProtected__ParameterAssignment_4_1 : ( ruleFormalParameter ) ;
+    public final void rule__PortProtected__ParameterAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70878:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:70879:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:70879:2: ( ruleFormalParameter )
+            // InternalFormalML.g:70880:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__ParameterAssignment_4_1"
+
+
+    // $ANTLR start "rule__PortProtected__ParameterAssignment_4_2_1"
+    // InternalFormalML.g:70889:1: rule__PortProtected__ParameterAssignment_4_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__PortProtected__ParameterAssignment_4_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70893:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:70894:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:70894:2: ( ruleFormalParameter )
+            // InternalFormalML.g:70895:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortProtected__ParameterAssignment_4_2_1"
+
+
+    // $ANTLR start "rule__PortPrivate__VisibilityAssignment_0"
+    // InternalFormalML.g:70904:1: rule__PortPrivate__VisibilityAssignment_0 : ( rulePrivatePortVisibilityKind ) ;
+    public final void rule__PortPrivate__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70908:1: ( ( rulePrivatePortVisibilityKind ) )
+            // InternalFormalML.g:70909:2: ( rulePrivatePortVisibilityKind )
+            {
+            // InternalFormalML.g:70909:2: ( rulePrivatePortVisibilityKind )
+            // InternalFormalML.g:70910:3: rulePrivatePortVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getVisibilityPrivatePortVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrivatePortVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getVisibilityPrivatePortVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__PortPrivate__DirectionAssignment_1"
+    // InternalFormalML.g:70919:1: rule__PortPrivate__DirectionAssignment_1 : ( ruleChannelDirection ) ;
+    public final void rule__PortPrivate__DirectionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70923:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:70924:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:70924:2: ( ruleChannelDirection )
+            // InternalFormalML.g:70925:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__DirectionAssignment_1"
+
+
+    // $ANTLR start "rule__PortPrivate__NameAssignment_2"
+    // InternalFormalML.g:70934:1: rule__PortPrivate__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__PortPrivate__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70938:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:70939:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:70939:2: ( ruleESIdentifier )
+            // InternalFormalML.g:70940:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__NameAssignment_2"
+
+
+    // $ANTLR start "rule__PortPrivate__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:70949:1: rule__PortPrivate__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__PortPrivate__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70953:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:70954:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:70954:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:70955:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__PortPrivate__ParameterAssignment_4_1"
+    // InternalFormalML.g:70964:1: rule__PortPrivate__ParameterAssignment_4_1 : ( ruleFormalParameter ) ;
+    public final void rule__PortPrivate__ParameterAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70968:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:70969:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:70969:2: ( ruleFormalParameter )
+            // InternalFormalML.g:70970:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__ParameterAssignment_4_1"
+
+
+    // $ANTLR start "rule__PortPrivate__ParameterAssignment_4_2_1"
+    // InternalFormalML.g:70979:1: rule__PortPrivate__ParameterAssignment_4_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__PortPrivate__ParameterAssignment_4_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70983:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:70984:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:70984:2: ( ruleFormalParameter )
+            // InternalFormalML.g:70985:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PortPrivate__ParameterAssignment_4_2_1"
+
+
+    // $ANTLR start "rule__Signal__VisibilityAssignment_0"
+    // InternalFormalML.g:70994:1: rule__Signal__VisibilityAssignment_0 : ( ruleVisibilityKind ) ;
+    public final void rule__Signal__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:70998:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:70999:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:70999:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:71000:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__Signal__DirectionAssignment_2"
+    // InternalFormalML.g:71009:1: rule__Signal__DirectionAssignment_2 : ( ruleChannelDirection ) ;
+    public final void rule__Signal__DirectionAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71013:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:71014:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:71014:2: ( ruleChannelDirection )
+            // InternalFormalML.g:71015:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getDirectionChannelDirectionEnumRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getDirectionChannelDirectionEnumRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__DirectionAssignment_2"
+
+
+    // $ANTLR start "rule__Signal__NameAssignment_3"
+    // InternalFormalML.g:71024:1: rule__Signal__NameAssignment_3 : ( ruleESIdentifier ) ;
+    public final void rule__Signal__NameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71028:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71029:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71029:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71030:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getNameESIdentifierParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__NameAssignment_3"
+
+
+    // $ANTLR start "rule__Signal__UnrestrictedNameAssignment_4"
+    // InternalFormalML.g:71039:1: rule__Signal__UnrestrictedNameAssignment_4 : ( ruleUnrestrictedName ) ;
+    public final void rule__Signal__UnrestrictedNameAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71043:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:71044:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:71044:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:71045:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__UnrestrictedNameAssignment_4"
+
+
+    // $ANTLR start "rule__Signal__ParameterAssignment_5_1"
+    // InternalFormalML.g:71054:1: rule__Signal__ParameterAssignment_5_1 : ( ruleFormalParameter ) ;
+    public final void rule__Signal__ParameterAssignment_5_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71058:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:71059:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:71059:2: ( ruleFormalParameter )
+            // InternalFormalML.g:71060:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__ParameterAssignment_5_1"
+
+
+    // $ANTLR start "rule__Signal__ParameterAssignment_5_2_1"
+    // InternalFormalML.g:71069:1: rule__Signal__ParameterAssignment_5_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__Signal__ParameterAssignment_5_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71073:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:71074:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:71074:2: ( ruleFormalParameter )
+            // InternalFormalML.g:71075:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Signal__ParameterAssignment_5_2_1"
+
+
+    // $ANTLR start "rule__SignalPublic__VisibilityAssignment_0"
+    // InternalFormalML.g:71084:1: rule__SignalPublic__VisibilityAssignment_0 : ( rulePublicSignalVisibilityKind ) ;
+    public final void rule__SignalPublic__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71088:1: ( ( rulePublicSignalVisibilityKind ) )
+            // InternalFormalML.g:71089:2: ( rulePublicSignalVisibilityKind )
+            {
+            // InternalFormalML.g:71089:2: ( rulePublicSignalVisibilityKind )
+            // InternalFormalML.g:71090:3: rulePublicSignalVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getVisibilityPublicSignalVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePublicSignalVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getVisibilityPublicSignalVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__SignalPublic__DirectionAssignment_1"
+    // InternalFormalML.g:71099:1: rule__SignalPublic__DirectionAssignment_1 : ( ruleChannelDirection ) ;
+    public final void rule__SignalPublic__DirectionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71103:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:71104:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:71104:2: ( ruleChannelDirection )
+            // InternalFormalML.g:71105:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__DirectionAssignment_1"
+
+
+    // $ANTLR start "rule__SignalPublic__NameAssignment_2"
+    // InternalFormalML.g:71114:1: rule__SignalPublic__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__SignalPublic__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71118:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71119:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71119:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71120:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__NameAssignment_2"
+
+
+    // $ANTLR start "rule__SignalPublic__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:71129:1: rule__SignalPublic__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__SignalPublic__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71133:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:71134:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:71134:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:71135:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__SignalPublic__ParameterAssignment_4_1"
+    // InternalFormalML.g:71144:1: rule__SignalPublic__ParameterAssignment_4_1 : ( ruleFormalParameter ) ;
+    public final void rule__SignalPublic__ParameterAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71148:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:71149:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:71149:2: ( ruleFormalParameter )
+            // InternalFormalML.g:71150:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__ParameterAssignment_4_1"
+
+
+    // $ANTLR start "rule__SignalPublic__ParameterAssignment_4_2_1"
+    // InternalFormalML.g:71159:1: rule__SignalPublic__ParameterAssignment_4_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__SignalPublic__ParameterAssignment_4_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71163:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:71164:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:71164:2: ( ruleFormalParameter )
+            // InternalFormalML.g:71165:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPublic__ParameterAssignment_4_2_1"
+
+
+    // $ANTLR start "rule__SignalProtected__VisibilityAssignment_0"
+    // InternalFormalML.g:71174:1: rule__SignalProtected__VisibilityAssignment_0 : ( ruleProtectedSignalVisibilityKind ) ;
+    public final void rule__SignalProtected__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71178:1: ( ( ruleProtectedSignalVisibilityKind ) )
+            // InternalFormalML.g:71179:2: ( ruleProtectedSignalVisibilityKind )
+            {
+            // InternalFormalML.g:71179:2: ( ruleProtectedSignalVisibilityKind )
+            // InternalFormalML.g:71180:3: ruleProtectedSignalVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getVisibilityProtectedSignalVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProtectedSignalVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getVisibilityProtectedSignalVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__SignalProtected__DirectionAssignment_1"
+    // InternalFormalML.g:71189:1: rule__SignalProtected__DirectionAssignment_1 : ( ruleChannelDirection ) ;
+    public final void rule__SignalProtected__DirectionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71193:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:71194:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:71194:2: ( ruleChannelDirection )
+            // InternalFormalML.g:71195:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__DirectionAssignment_1"
+
+
+    // $ANTLR start "rule__SignalProtected__NameAssignment_2"
+    // InternalFormalML.g:71204:1: rule__SignalProtected__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__SignalProtected__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71208:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71209:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71209:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71210:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__NameAssignment_2"
+
+
+    // $ANTLR start "rule__SignalProtected__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:71219:1: rule__SignalProtected__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__SignalProtected__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71223:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:71224:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:71224:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:71225:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__SignalProtected__ParameterAssignment_4_1"
+    // InternalFormalML.g:71234:1: rule__SignalProtected__ParameterAssignment_4_1 : ( ruleFormalParameter ) ;
+    public final void rule__SignalProtected__ParameterAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71238:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:71239:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:71239:2: ( ruleFormalParameter )
+            // InternalFormalML.g:71240:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__ParameterAssignment_4_1"
+
+
+    // $ANTLR start "rule__SignalProtected__ParameterAssignment_4_2_1"
+    // InternalFormalML.g:71249:1: rule__SignalProtected__ParameterAssignment_4_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__SignalProtected__ParameterAssignment_4_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71253:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:71254:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:71254:2: ( ruleFormalParameter )
+            // InternalFormalML.g:71255:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalProtected__ParameterAssignment_4_2_1"
+
+
+    // $ANTLR start "rule__SignalPrivate__VisibilityAssignment_0"
+    // InternalFormalML.g:71264:1: rule__SignalPrivate__VisibilityAssignment_0 : ( rulePrivateSignalVisibilityKind ) ;
+    public final void rule__SignalPrivate__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71268:1: ( ( rulePrivateSignalVisibilityKind ) )
+            // InternalFormalML.g:71269:2: ( rulePrivateSignalVisibilityKind )
+            {
+            // InternalFormalML.g:71269:2: ( rulePrivateSignalVisibilityKind )
+            // InternalFormalML.g:71270:3: rulePrivateSignalVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getVisibilityPrivateSignalVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrivateSignalVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getVisibilityPrivateSignalVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__SignalPrivate__DirectionAssignment_1"
+    // InternalFormalML.g:71279:1: rule__SignalPrivate__DirectionAssignment_1 : ( ruleChannelDirection ) ;
+    public final void rule__SignalPrivate__DirectionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71283:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:71284:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:71284:2: ( ruleChannelDirection )
+            // InternalFormalML.g:71285:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__DirectionAssignment_1"
+
+
+    // $ANTLR start "rule__SignalPrivate__NameAssignment_2"
+    // InternalFormalML.g:71294:1: rule__SignalPrivate__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__SignalPrivate__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71298:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71299:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71299:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71300:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__NameAssignment_2"
+
+
+    // $ANTLR start "rule__SignalPrivate__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:71309:1: rule__SignalPrivate__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__SignalPrivate__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71313:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:71314:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:71314:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:71315:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__SignalPrivate__ParameterAssignment_4_1"
+    // InternalFormalML.g:71324:1: rule__SignalPrivate__ParameterAssignment_4_1 : ( ruleFormalParameter ) ;
+    public final void rule__SignalPrivate__ParameterAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71328:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:71329:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:71329:2: ( ruleFormalParameter )
+            // InternalFormalML.g:71330:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__ParameterAssignment_4_1"
+
+
+    // $ANTLR start "rule__SignalPrivate__ParameterAssignment_4_2_1"
+    // InternalFormalML.g:71339:1: rule__SignalPrivate__ParameterAssignment_4_2_1 : ( ruleFormalParameter ) ;
+    public final void rule__SignalPrivate__ParameterAssignment_4_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71343:1: ( ( ruleFormalParameter ) )
+            // InternalFormalML.g:71344:2: ( ruleFormalParameter )
+            {
+            // InternalFormalML.g:71344:2: ( ruleFormalParameter )
+            // InternalFormalML.g:71345:3: ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalPrivate__ParameterAssignment_4_2_1"
+
+
+    // $ANTLR start "rule__Channel__VisibilityAssignment_0"
+    // InternalFormalML.g:71354:1: rule__Channel__VisibilityAssignment_0 : ( ruleVisibilityKind ) ;
+    public final void rule__Channel__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71358:1: ( ( ruleVisibilityKind ) )
+            // InternalFormalML.g:71359:2: ( ruleVisibilityKind )
+            {
+            // InternalFormalML.g:71359:2: ( ruleVisibilityKind )
+            // InternalFormalML.g:71360:3: ruleVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getVisibilityVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__Channel__NameAssignment_2"
+    // InternalFormalML.g:71369:1: rule__Channel__NameAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__Channel__NameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71373:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71374:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71374:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71375:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getNameESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__NameAssignment_2"
+
+
+    // $ANTLR start "rule__Channel__UnrestrictedNameAssignment_3"
+    // InternalFormalML.g:71384:1: rule__Channel__UnrestrictedNameAssignment_3 : ( ruleUnrestrictedName ) ;
+    public final void rule__Channel__UnrestrictedNameAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71388:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:71389:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:71389:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:71390:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__UnrestrictedNameAssignment_3"
+
+
+    // $ANTLR start "rule__Channel__SignalAssignment_5_0"
+    // InternalFormalML.g:71399:1: rule__Channel__SignalAssignment_5_0 : ( ruleSignalReference ) ;
+    public final void rule__Channel__SignalAssignment_5_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71403:1: ( ( ruleSignalReference ) )
+            // InternalFormalML.g:71404:2: ( ruleSignalReference )
+            {
+            // InternalFormalML.g:71404:2: ( ruleSignalReference )
+            // InternalFormalML.g:71405:3: ruleSignalReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelAccess().getSignalSignalReferenceParserRuleCall_5_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelAccess().getSignalSignalReferenceParserRuleCall_5_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Channel__SignalAssignment_5_0"
+
+
+    // $ANTLR start "rule__SignalReference__DirectionAssignment_0"
+    // InternalFormalML.g:71414:1: rule__SignalReference__DirectionAssignment_0 : ( ruleChannelDirection ) ;
+    public final void rule__SignalReference__DirectionAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71418:1: ( ( ruleChannelDirection ) )
+            // InternalFormalML.g:71419:2: ( ruleChannelDirection )
+            {
+            // InternalFormalML.g:71419:2: ( ruleChannelDirection )
+            // InternalFormalML.g:71420:3: ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalReferenceAccess().getDirectionChannelDirectionEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalReferenceAccess().getDirectionChannelDirectionEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalReference__DirectionAssignment_0"
+
+
+    // $ANTLR start "rule__SignalReference__NameAssignment_1"
+    // InternalFormalML.g:71429:1: rule__SignalReference__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__SignalReference__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71433:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71434:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71434:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71435:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSignalReferenceAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSignalReferenceAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__SignalReference__NameAssignment_1"
+
+
+    // $ANTLR start "rule__ChannelPublic__VisibilityAssignment_0"
+    // InternalFormalML.g:71444:1: rule__ChannelPublic__VisibilityAssignment_0 : ( rulePublicChannelVisibilityKind ) ;
+    public final void rule__ChannelPublic__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71448:1: ( ( rulePublicChannelVisibilityKind ) )
+            // InternalFormalML.g:71449:2: ( rulePublicChannelVisibilityKind )
+            {
+            // InternalFormalML.g:71449:2: ( rulePublicChannelVisibilityKind )
+            // InternalFormalML.g:71450:3: rulePublicChannelVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getVisibilityPublicChannelVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePublicChannelVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getVisibilityPublicChannelVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__ChannelPublic__NameAssignment_1"
+    // InternalFormalML.g:71459:1: rule__ChannelPublic__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__ChannelPublic__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71463:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71464:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71464:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71465:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__NameAssignment_1"
+
+
+    // $ANTLR start "rule__ChannelPublic__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:71474:1: rule__ChannelPublic__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__ChannelPublic__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71478:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:71479:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:71479:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:71480:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__ChannelPublic__SignalAssignment_4_0"
+    // InternalFormalML.g:71489:1: rule__ChannelPublic__SignalAssignment_4_0 : ( ruleSignalReference ) ;
+    public final void rule__ChannelPublic__SignalAssignment_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71493:1: ( ( ruleSignalReference ) )
+            // InternalFormalML.g:71494:2: ( ruleSignalReference )
+            {
+            // InternalFormalML.g:71494:2: ( ruleSignalReference )
+            // InternalFormalML.g:71495:3: ruleSignalReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPublicAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPublicAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPublic__SignalAssignment_4_0"
+
+
+    // $ANTLR start "rule__ChannelProtected__VisibilityAssignment_0"
+    // InternalFormalML.g:71504:1: rule__ChannelProtected__VisibilityAssignment_0 : ( ruleProtectedChannelVisibilityKind ) ;
+    public final void rule__ChannelProtected__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71508:1: ( ( ruleProtectedChannelVisibilityKind ) )
+            // InternalFormalML.g:71509:2: ( ruleProtectedChannelVisibilityKind )
+            {
+            // InternalFormalML.g:71509:2: ( ruleProtectedChannelVisibilityKind )
+            // InternalFormalML.g:71510:3: ruleProtectedChannelVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getVisibilityProtectedChannelVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleProtectedChannelVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getVisibilityProtectedChannelVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__ChannelProtected__NameAssignment_1"
+    // InternalFormalML.g:71519:1: rule__ChannelProtected__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__ChannelProtected__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71523:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71524:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71524:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71525:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__NameAssignment_1"
+
+
+    // $ANTLR start "rule__ChannelProtected__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:71534:1: rule__ChannelProtected__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__ChannelProtected__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71538:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:71539:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:71539:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:71540:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__ChannelProtected__SignalAssignment_4_0"
+    // InternalFormalML.g:71549:1: rule__ChannelProtected__SignalAssignment_4_0 : ( ruleSignalReference ) ;
+    public final void rule__ChannelProtected__SignalAssignment_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71553:1: ( ( ruleSignalReference ) )
+            // InternalFormalML.g:71554:2: ( ruleSignalReference )
+            {
+            // InternalFormalML.g:71554:2: ( ruleSignalReference )
+            // InternalFormalML.g:71555:3: ruleSignalReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelProtectedAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelProtectedAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelProtected__SignalAssignment_4_0"
+
+
+    // $ANTLR start "rule__ChannelPrivate__VisibilityAssignment_0"
+    // InternalFormalML.g:71564:1: rule__ChannelPrivate__VisibilityAssignment_0 : ( rulePrivateChannelVisibilityKind ) ;
+    public final void rule__ChannelPrivate__VisibilityAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71568:1: ( ( rulePrivateChannelVisibilityKind ) )
+            // InternalFormalML.g:71569:2: ( rulePrivateChannelVisibilityKind )
+            {
+            // InternalFormalML.g:71569:2: ( rulePrivateChannelVisibilityKind )
+            // InternalFormalML.g:71570:3: rulePrivateChannelVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getVisibilityPrivateChannelVisibilityKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePrivateChannelVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getVisibilityPrivateChannelVisibilityKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__VisibilityAssignment_0"
+
+
+    // $ANTLR start "rule__ChannelPrivate__NameAssignment_1"
+    // InternalFormalML.g:71579:1: rule__ChannelPrivate__NameAssignment_1 : ( ruleESIdentifier ) ;
+    public final void rule__ChannelPrivate__NameAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71583:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71584:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71584:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71585:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getNameESIdentifierParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__NameAssignment_1"
+
+
+    // $ANTLR start "rule__ChannelPrivate__UnrestrictedNameAssignment_2"
+    // InternalFormalML.g:71594:1: rule__ChannelPrivate__UnrestrictedNameAssignment_2 : ( ruleUnrestrictedName ) ;
+    public final void rule__ChannelPrivate__UnrestrictedNameAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71598:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:71599:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:71599:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:71600:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__UnrestrictedNameAssignment_2"
+
+
+    // $ANTLR start "rule__ChannelPrivate__SignalAssignment_4_0"
+    // InternalFormalML.g:71609:1: rule__ChannelPrivate__SignalAssignment_4_0 : ( ruleSignalReference ) ;
+    public final void rule__ChannelPrivate__SignalAssignment_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71613:1: ( ( ruleSignalReference ) )
+            // InternalFormalML.g:71614:2: ( ruleSignalReference )
+            {
+            // InternalFormalML.g:71614:2: ( ruleSignalReference )
+            // InternalFormalML.g:71615:3: ruleSignalReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getChannelPrivateAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSignalReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getChannelPrivateAccess().getSignalSignalReferenceParserRuleCall_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ChannelPrivate__SignalAssignment_4_0"
+
+
+    // $ANTLR start "rule__Transition__TransientAssignment_1"
+    // InternalFormalML.g:71624:1: rule__Transition__TransientAssignment_1 : ( ( 'transient' ) ) ;
+    public final void rule__Transition__TransientAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71628:1: ( ( ( 'transient' ) ) )
+            // InternalFormalML.g:71629:2: ( ( 'transient' ) )
+            {
+            // InternalFormalML.g:71629:2: ( ( 'transient' ) )
+            // InternalFormalML.g:71630:3: ( 'transient' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0()); 
+            }
+            // InternalFormalML.g:71631:3: ( 'transient' )
+            // InternalFormalML.g:71632:4: 'transient'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0()); 
+            }
+            match(input,281,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__TransientAssignment_1"
+
+
+    // $ANTLR start "rule__Transition__MoeAssignment_3"
+    // InternalFormalML.g:71643:1: rule__Transition__MoeAssignment_3 : ( ruleTransitionMoe ) ;
+    public final void rule__Transition__MoeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71647:1: ( ( ruleTransitionMoe ) )
+            // InternalFormalML.g:71648:2: ( ruleTransitionMoe )
+            {
+            // InternalFormalML.g:71648:2: ( ruleTransitionMoe )
+            // InternalFormalML.g:71649:3: ruleTransitionMoe
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getMoeTransitionMoeParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionMoe();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getMoeTransitionMoeParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__MoeAssignment_3"
+
+
+    // $ANTLR start "rule__Transition__NameAssignment_4_0"
+    // InternalFormalML.g:71658:1: rule__Transition__NameAssignment_4_0 : ( ruleESIdentifier ) ;
+    public final void rule__Transition__NameAssignment_4_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71662:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:71663:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:71663:2: ( ruleESIdentifier )
+            // InternalFormalML.g:71664:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getNameESIdentifierParserRuleCall_4_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getNameESIdentifierParserRuleCall_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__NameAssignment_4_0"
+
+
+    // $ANTLR start "rule__Transition__UnrestrictedNameAssignment_4_1"
+    // InternalFormalML.g:71673:1: rule__Transition__UnrestrictedNameAssignment_4_1 : ( ruleUnrestrictedName ) ;
+    public final void rule__Transition__UnrestrictedNameAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71677:1: ( ( ruleUnrestrictedName ) )
+            // InternalFormalML.g:71678:2: ( ruleUnrestrictedName )
+            {
+            // InternalFormalML.g:71678:2: ( ruleUnrestrictedName )
+            // InternalFormalML.g:71679:3: ruleUnrestrictedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__UnrestrictedNameAssignment_4_1"
+
+
+    // $ANTLR start "rule__Transition__TriggerAssignment_5_0_1_0_0_1"
+    // InternalFormalML.g:71688:1: rule__Transition__TriggerAssignment_5_0_1_0_0_1 : ( ruleTransitionTrigger ) ;
+    public final void rule__Transition__TriggerAssignment_5_0_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71692:1: ( ( ruleTransitionTrigger ) )
+            // InternalFormalML.g:71693:2: ( ruleTransitionTrigger )
+            {
+            // InternalFormalML.g:71693:2: ( ruleTransitionTrigger )
+            // InternalFormalML.g:71694:3: ruleTransitionTrigger
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_0_1_0_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionTrigger();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_0_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__TriggerAssignment_5_0_1_0_0_1"
+
+
+    // $ANTLR start "rule__Transition__GuardAssignment_5_0_1_0_1_0"
+    // InternalFormalML.g:71703:1: rule__Transition__GuardAssignment_5_0_1_0_1_0 : ( ruleTransitionGuard ) ;
+    public final void rule__Transition__GuardAssignment_5_0_1_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71707:1: ( ( ruleTransitionGuard ) )
+            // InternalFormalML.g:71708:2: ( ruleTransitionGuard )
+            {
+            // InternalFormalML.g:71708:2: ( ruleTransitionGuard )
+            // InternalFormalML.g:71709:3: ruleTransitionGuard
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_0_1_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionGuard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_0_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__GuardAssignment_5_0_1_0_1_0"
+
+
+    // $ANTLR start "rule__Transition__TguardAssignment_5_0_1_0_2_0"
+    // InternalFormalML.g:71718:1: rule__Transition__TguardAssignment_5_0_1_0_2_0 : ( ruleTransitionTimedGuard ) ;
+    public final void rule__Transition__TguardAssignment_5_0_1_0_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71722:1: ( ( ruleTransitionTimedGuard ) )
+            // InternalFormalML.g:71723:2: ( ruleTransitionTimedGuard )
+            {
+            // InternalFormalML.g:71723:2: ( ruleTransitionTimedGuard )
+            // InternalFormalML.g:71724:3: ruleTransitionTimedGuard
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_0_1_0_2_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionTimedGuard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_0_1_0_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__TguardAssignment_5_0_1_0_2_0"
+
+
+    // $ANTLR start "rule__Transition__EffectAssignment_5_0_1_0_4"
+    // InternalFormalML.g:71733:1: rule__Transition__EffectAssignment_5_0_1_0_4 : ( ruleTransitionEffect ) ;
+    public final void rule__Transition__EffectAssignment_5_0_1_0_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71737:1: ( ( ruleTransitionEffect ) )
+            // InternalFormalML.g:71738:2: ( ruleTransitionEffect )
+            {
+            // InternalFormalML.g:71738:2: ( ruleTransitionEffect )
+            // InternalFormalML.g:71739:3: ruleTransitionEffect
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_0_1_0_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionEffect();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_0_1_0_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__EffectAssignment_5_0_1_0_4"
+
+
+    // $ANTLR start "rule__Transition__BehaviorAssignment_5_0_1_1"
+    // InternalFormalML.g:71748:1: rule__Transition__BehaviorAssignment_5_0_1_1 : ( ruleTransitionBehavior ) ;
+    public final void rule__Transition__BehaviorAssignment_5_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71752:1: ( ( ruleTransitionBehavior ) )
+            // InternalFormalML.g:71753:2: ( ruleTransitionBehavior )
+            {
+            // InternalFormalML.g:71753:2: ( ruleTransitionBehavior )
+            // InternalFormalML.g:71754:3: ruleTransitionBehavior
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionBehavior();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__BehaviorAssignment_5_0_1_1"
+
+
+    // $ANTLR start "rule__Transition__TargetAssignment_5_0_3_1"
+    // InternalFormalML.g:71763:1: rule__Transition__TargetAssignment_5_0_3_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__Transition__TargetAssignment_5_0_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71767:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:71768:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:71768:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:71769:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_0_3_1_0()); 
+            }
+            // InternalFormalML.g:71770:3: ( ruleESUfid )
+            // InternalFormalML.g:71771:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTargetNamedElementESUfidParserRuleCall_5_0_3_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTargetNamedElementESUfidParserRuleCall_5_0_3_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_0_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__TargetAssignment_5_0_3_1"
+
+
+    // $ANTLR start "rule__Transition__TargetAssignment_5_1_1"
+    // InternalFormalML.g:71782:1: rule__Transition__TargetAssignment_5_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__Transition__TargetAssignment_5_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71786:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:71787:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:71787:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:71788:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_1_1_0()); 
+            }
+            // InternalFormalML.g:71789:3: ( ruleESUfid )
+            // InternalFormalML.g:71790:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTargetNamedElementESUfidParserRuleCall_5_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTargetNamedElementESUfidParserRuleCall_5_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__TargetAssignment_5_1_1"
+
+
+    // $ANTLR start "rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1"
+    // InternalFormalML.g:71801:1: rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1 : ( ruleTransitionTrigger ) ;
+    public final void rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71805:1: ( ( ruleTransitionTrigger ) )
+            // InternalFormalML.g:71806:2: ( ruleTransitionTrigger )
+            {
+            // InternalFormalML.g:71806:2: ( ruleTransitionTrigger )
+            // InternalFormalML.g:71807:3: ruleTransitionTrigger
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_1_2_0_1_0_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionTrigger();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_1_2_0_1_0_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__TriggerAssignment_5_1_2_0_1_0_0_1"
+
+
+    // $ANTLR start "rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0"
+    // InternalFormalML.g:71816:1: rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0 : ( ruleTransitionGuard ) ;
+    public final void rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71820:1: ( ( ruleTransitionGuard ) )
+            // InternalFormalML.g:71821:2: ( ruleTransitionGuard )
+            {
+            // InternalFormalML.g:71821:2: ( ruleTransitionGuard )
+            // InternalFormalML.g:71822:3: ruleTransitionGuard
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_1_2_0_1_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionGuard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_1_2_0_1_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__GuardAssignment_5_1_2_0_1_0_1_0"
+
+
+    // $ANTLR start "rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0"
+    // InternalFormalML.g:71831:1: rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0 : ( ruleTransitionTimedGuard ) ;
+    public final void rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71835:1: ( ( ruleTransitionTimedGuard ) )
+            // InternalFormalML.g:71836:2: ( ruleTransitionTimedGuard )
+            {
+            // InternalFormalML.g:71836:2: ( ruleTransitionTimedGuard )
+            // InternalFormalML.g:71837:3: ruleTransitionTimedGuard
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_1_2_0_1_0_2_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionTimedGuard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_1_2_0_1_0_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__TguardAssignment_5_1_2_0_1_0_2_0"
+
+
+    // $ANTLR start "rule__Transition__EffectAssignment_5_1_2_0_1_0_4"
+    // InternalFormalML.g:71846:1: rule__Transition__EffectAssignment_5_1_2_0_1_0_4 : ( ruleTransitionEffect ) ;
+    public final void rule__Transition__EffectAssignment_5_1_2_0_1_0_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71850:1: ( ( ruleTransitionEffect ) )
+            // InternalFormalML.g:71851:2: ( ruleTransitionEffect )
+            {
+            // InternalFormalML.g:71851:2: ( ruleTransitionEffect )
+            // InternalFormalML.g:71852:3: ruleTransitionEffect
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_1_2_0_1_0_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionEffect();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_1_2_0_1_0_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__EffectAssignment_5_1_2_0_1_0_4"
+
+
+    // $ANTLR start "rule__Transition__BehaviorAssignment_5_1_2_0_1_1"
+    // InternalFormalML.g:71861:1: rule__Transition__BehaviorAssignment_5_1_2_0_1_1 : ( ruleTransitionBehavior ) ;
+    public final void rule__Transition__BehaviorAssignment_5_1_2_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71865:1: ( ( ruleTransitionBehavior ) )
+            // InternalFormalML.g:71866:2: ( ruleTransitionBehavior )
+            {
+            // InternalFormalML.g:71866:2: ( ruleTransitionBehavior )
+            // InternalFormalML.g:71867:3: ruleTransitionBehavior
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionBehavior();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Transition__BehaviorAssignment_5_1_2_0_1_1"
+
+
+    // $ANTLR start "rule__TransitionMoe__MocAssignment_1_0_1_0_0"
+    // InternalFormalML.g:71876:1: rule__TransitionMoe__MocAssignment_1_0_1_0_0 : ( ruleTransitionMoc ) ;
+    public final void rule__TransitionMoe__MocAssignment_1_0_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71880:1: ( ( ruleTransitionMoc ) )
+            // InternalFormalML.g:71881:2: ( ruleTransitionMoc )
+            {
+            // InternalFormalML.g:71881:2: ( ruleTransitionMoc )
+            // InternalFormalML.g:71882:3: ruleTransitionMoc
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getMocTransitionMocEnumRuleCall_1_0_1_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionMoc();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getMocTransitionMocEnumRuleCall_1_0_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__MocAssignment_1_0_1_0_0"
+
+
+    // $ANTLR start "rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1"
+    // InternalFormalML.g:71891:1: rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1 : ( ( 'else' ) ) ;
+    public final void rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71895:1: ( ( ( 'else' ) ) )
+            // InternalFormalML.g:71896:2: ( ( 'else' ) )
+            {
+            // InternalFormalML.g:71896:2: ( ( 'else' ) )
+            // InternalFormalML.g:71897:3: ( 'else' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0()); 
+            }
+            // InternalFormalML.g:71898:3: ( 'else' )
+            // InternalFormalML.g:71899:4: 'else'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0()); 
+            }
+            match(input,252,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__IsElseAssignment_1_0_1_0_1_1"
+
+
+    // $ANTLR start "rule__TransitionMoe__IsElseAssignment_1_0_1_1"
+    // InternalFormalML.g:71910:1: rule__TransitionMoe__IsElseAssignment_1_0_1_1 : ( ( 'else' ) ) ;
+    public final void rule__TransitionMoe__IsElseAssignment_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71914:1: ( ( ( 'else' ) ) )
+            // InternalFormalML.g:71915:2: ( ( 'else' ) )
+            {
+            // InternalFormalML.g:71915:2: ( ( 'else' ) )
+            // InternalFormalML.g:71916:3: ( 'else' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0()); 
+            }
+            // InternalFormalML.g:71917:3: ( 'else' )
+            // InternalFormalML.g:71918:4: 'else'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0()); 
+            }
+            match(input,252,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__IsElseAssignment_1_0_1_1"
+
+
+    // $ANTLR start "rule__TransitionMoe__PriorAssignment_1_0_2_2"
+    // InternalFormalML.g:71929:1: rule__TransitionMoe__PriorAssignment_1_0_2_2 : ( ruleEInt ) ;
+    public final void rule__TransitionMoe__PriorAssignment_1_0_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71933:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:71934:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:71934:2: ( ruleEInt )
+            // InternalFormalML.g:71935:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_0_2_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_0_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__PriorAssignment_1_0_2_2"
+
+
+    // $ANTLR start "rule__TransitionMoe__PriorAssignment_1_1_1"
+    // InternalFormalML.g:71944:1: rule__TransitionMoe__PriorAssignment_1_1_1 : ( ruleEInt ) ;
+    public final void rule__TransitionMoe__PriorAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71948:1: ( ( ruleEInt ) )
+            // InternalFormalML.g:71949:2: ( ruleEInt )
+            {
+            // InternalFormalML.g:71949:2: ( ruleEInt )
+            // InternalFormalML.g:71950:3: ruleEInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionMoe__PriorAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__TransitionBehavior__OpAssignment_1"
+    // InternalFormalML.g:71959:1: rule__TransitionBehavior__OpAssignment_1 : ( ruleBlockStatementScheduler ) ;
+    public final void rule__TransitionBehavior__OpAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71963:1: ( ( ruleBlockStatementScheduler ) )
+            // InternalFormalML.g:71964:2: ( ruleBlockStatementScheduler )
+            {
+            // InternalFormalML.g:71964:2: ( ruleBlockStatementScheduler )
+            // InternalFormalML.g:71965:3: ruleBlockStatementScheduler
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionBehaviorAccess().getOpBlockStatementSchedulerParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatementScheduler();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionBehaviorAccess().getOpBlockStatementSchedulerParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionBehavior__OpAssignment_1"
+
+
+    // $ANTLR start "rule__TransitionBehavior__StatementAssignment_2"
+    // InternalFormalML.g:71974:1: rule__TransitionBehavior__StatementAssignment_2 : ( ruleStatement ) ;
+    public final void rule__TransitionBehavior__StatementAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71978:1: ( ( ruleStatement ) )
+            // InternalFormalML.g:71979:2: ( ruleStatement )
+            {
+            // InternalFormalML.g:71979:2: ( ruleStatement )
+            // InternalFormalML.g:71980:3: ruleStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionBehaviorAccess().getStatementStatementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionBehaviorAccess().getStatementStatementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionBehavior__StatementAssignment_2"
+
+
+    // $ANTLR start "rule__TransitionGuard__ConditionAssignment_0_2"
+    // InternalFormalML.g:71989:1: rule__TransitionGuard__ConditionAssignment_0_2 : ( ruleTransitionGuardExpression ) ;
+    public final void rule__TransitionGuard__ConditionAssignment_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:71993:1: ( ( ruleTransitionGuardExpression ) )
+            // InternalFormalML.g:71994:2: ( ruleTransitionGuardExpression )
+            {
+            // InternalFormalML.g:71994:2: ( ruleTransitionGuardExpression )
+            // InternalFormalML.g:71995:3: ruleTransitionGuardExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionGuardExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__ConditionAssignment_0_2"
+
+
+    // $ANTLR start "rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1"
+    // InternalFormalML.g:72004:1: rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1 : ( ruleExpression ) ;
+    public final void rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72008:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72009:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72009:2: ( ruleExpression )
+            // InternalFormalML.g:72010:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__ConditionAssignment_1_1_0_1_0_1"
+
+
+    // $ANTLR start "rule__TransitionGuard__ConditionAssignment_1_1_0_1_1"
+    // InternalFormalML.g:72019:1: rule__TransitionGuard__ConditionAssignment_1_1_0_1_1 : ( ruleExpression ) ;
+    public final void rule__TransitionGuard__ConditionAssignment_1_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72023:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72024:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72024:2: ( ruleExpression )
+            // InternalFormalML.g:72025:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuard__ConditionAssignment_1_1_0_1_1"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__OperatorAssignment_1"
+    // InternalFormalML.g:72034:1: rule__TransitionGuardExpression__OperatorAssignment_1 : ( ( rule__TransitionGuardExpression__OperatorAlternatives_1_0 ) ) ;
+    public final void rule__TransitionGuardExpression__OperatorAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72038:1: ( ( ( rule__TransitionGuardExpression__OperatorAlternatives_1_0 ) ) )
+            // InternalFormalML.g:72039:2: ( ( rule__TransitionGuardExpression__OperatorAlternatives_1_0 ) )
+            {
+            // InternalFormalML.g:72039:2: ( ( rule__TransitionGuardExpression__OperatorAlternatives_1_0 ) )
+            // InternalFormalML.g:72040:3: ( rule__TransitionGuardExpression__OperatorAlternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAlternatives_1_0()); 
+            }
+            // InternalFormalML.g:72041:3: ( rule__TransitionGuardExpression__OperatorAlternatives_1_0 )
+            // InternalFormalML.g:72041:4: rule__TransitionGuardExpression__OperatorAlternatives_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__TransitionGuardExpression__OperatorAlternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardExpressionAccess().getOperatorAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__OperatorAssignment_1"
+
+
+    // $ANTLR start "rule__TransitionGuardExpression__OperandAssignment_3"
+    // InternalFormalML.g:72049:1: rule__TransitionGuardExpression__OperandAssignment_3 : ( ruleBitwiseOrExpression ) ;
+    public final void rule__TransitionGuardExpression__OperandAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72053:1: ( ( ruleBitwiseOrExpression ) )
+            // InternalFormalML.g:72054:2: ( ruleBitwiseOrExpression )
+            {
+            // InternalFormalML.g:72054:2: ( ruleBitwiseOrExpression )
+            // InternalFormalML.g:72055:3: ruleBitwiseOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionGuardExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionGuardExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionGuardExpression__OperandAssignment_3"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__ConditionAssignment_0_2"
+    // InternalFormalML.g:72064:1: rule__TransitionTimedGuard__ConditionAssignment_0_2 : ( ruleTransitionGuardExpression ) ;
+    public final void rule__TransitionTimedGuard__ConditionAssignment_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72068:1: ( ( ruleTransitionGuardExpression ) )
+            // InternalFormalML.g:72069:2: ( ruleTransitionGuardExpression )
+            {
+            // InternalFormalML.g:72069:2: ( ruleTransitionGuardExpression )
+            // InternalFormalML.g:72070:3: ruleTransitionGuardExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionGuardExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__ConditionAssignment_0_2"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1"
+    // InternalFormalML.g:72079:1: rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1 : ( ruleExpression ) ;
+    public final void rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72083:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72084:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72084:2: ( ruleExpression )
+            // InternalFormalML.g:72085:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_0_1"
+
+
+    // $ANTLR start "rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1"
+    // InternalFormalML.g:72094:1: rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1 : ( ruleExpression ) ;
+    public final void rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72098:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72099:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72099:2: ( ruleExpression )
+            // InternalFormalML.g:72100:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionTimedGuard__ConditionAssignment_1_1_0_1_1"
+
+
+    // $ANTLR start "rule__TransitionEffect__StatementAssignment_1_1"
+    // InternalFormalML.g:72109:1: rule__TransitionEffect__StatementAssignment_1_1 : ( ruleTransitionEffectStatement ) ;
+    public final void rule__TransitionEffect__StatementAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72113:1: ( ( ruleTransitionEffectStatement ) )
+            // InternalFormalML.g:72114:2: ( ruleTransitionEffectStatement )
+            {
+            // InternalFormalML.g:72114:2: ( ruleTransitionEffectStatement )
+            // InternalFormalML.g:72115:3: ruleTransitionEffectStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTransitionEffectAccess().getStatementTransitionEffectStatementParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTransitionEffectStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTransitionEffectAccess().getStatementTransitionEffectStatementParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TransitionEffect__StatementAssignment_1_1"
+
+
+    // $ANTLR start "rule__BlockStatement__OpAssignment_2"
+    // InternalFormalML.g:72124:1: rule__BlockStatement__OpAssignment_2 : ( ruleBlockStatementScheduler ) ;
+    public final void rule__BlockStatement__OpAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72128:1: ( ( ruleBlockStatementScheduler ) )
+            // InternalFormalML.g:72129:2: ( ruleBlockStatementScheduler )
+            {
+            // InternalFormalML.g:72129:2: ( ruleBlockStatementScheduler )
+            // InternalFormalML.g:72130:3: ruleBlockStatementScheduler
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementAccess().getOpBlockStatementSchedulerParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatementScheduler();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementAccess().getOpBlockStatementSchedulerParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__OpAssignment_2"
+
+
+    // $ANTLR start "rule__BlockStatement__StatementAssignment_3"
+    // InternalFormalML.g:72139:1: rule__BlockStatement__StatementAssignment_3 : ( ruleStatement ) ;
+    public final void rule__BlockStatement__StatementAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72143:1: ( ( ruleStatement ) )
+            // InternalFormalML.g:72144:2: ( ruleStatement )
+            {
+            // InternalFormalML.g:72144:2: ( ruleStatement )
+            // InternalFormalML.g:72145:3: ruleStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBlockStatementAccess().getStatementStatementParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBlockStatementAccess().getStatementStatementParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BlockStatement__StatementAssignment_3"
+
+
+    // $ANTLR start "rule__ExpressionStatement__ExpressionAssignment_0_0"
+    // InternalFormalML.g:72154:1: rule__ExpressionStatement__ExpressionAssignment_0_0 : ( ruleAssignmentExpression ) ;
+    public final void rule__ExpressionStatement__ExpressionAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72158:1: ( ( ruleAssignmentExpression ) )
+            // InternalFormalML.g:72159:2: ( ruleAssignmentExpression )
+            {
+            // InternalFormalML.g:72159:2: ( ruleAssignmentExpression )
+            // InternalFormalML.g:72160:3: ruleAssignmentExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getExpressionAssignmentExpressionParserRuleCall_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAssignmentExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getExpressionAssignmentExpressionParserRuleCall_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__ExpressionAssignment_0_0"
+
+
+    // $ANTLR start "rule__ExpressionStatement__ExpressionAssignment_1_0"
+    // InternalFormalML.g:72169:1: rule__ExpressionStatement__ExpressionAssignment_1_0 : ( ruleNewfreshExpression ) ;
+    public final void rule__ExpressionStatement__ExpressionAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72173:1: ( ( ruleNewfreshExpression ) )
+            // InternalFormalML.g:72174:2: ( ruleNewfreshExpression )
+            {
+            // InternalFormalML.g:72174:2: ( ruleNewfreshExpression )
+            // InternalFormalML.g:72175:3: ruleNewfreshExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getExpressionNewfreshExpressionParserRuleCall_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleNewfreshExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getExpressionNewfreshExpressionParserRuleCall_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__ExpressionAssignment_1_0"
+
+
+    // $ANTLR start "rule__ExpressionStatement__ExpressionAssignment_2_0"
+    // InternalFormalML.g:72184:1: rule__ExpressionStatement__ExpressionAssignment_2_0 : ( ruleIncrementOrDecrementPrefixExpression ) ;
+    public final void rule__ExpressionStatement__ExpressionAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72188:1: ( ( ruleIncrementOrDecrementPrefixExpression ) )
+            // InternalFormalML.g:72189:2: ( ruleIncrementOrDecrementPrefixExpression )
+            {
+            // InternalFormalML.g:72189:2: ( ruleIncrementOrDecrementPrefixExpression )
+            // InternalFormalML.g:72190:3: ruleIncrementOrDecrementPrefixExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleIncrementOrDecrementPrefixExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__ExpressionAssignment_2_0"
+
+
+    // $ANTLR start "rule__ExpressionStatement__ExpressionAssignment_3_0"
+    // InternalFormalML.g:72199:1: rule__ExpressionStatement__ExpressionAssignment_3_0 : ( ruleIncrementOrDecrementPostfixExpression ) ;
+    public final void rule__ExpressionStatement__ExpressionAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72203:1: ( ( ruleIncrementOrDecrementPostfixExpression ) )
+            // InternalFormalML.g:72204:2: ( ruleIncrementOrDecrementPostfixExpression )
+            {
+            // InternalFormalML.g:72204:2: ( ruleIncrementOrDecrementPostfixExpression )
+            // InternalFormalML.g:72205:3: ruleIncrementOrDecrementPostfixExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleIncrementOrDecrementPostfixExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionStatement__ExpressionAssignment_3_0"
+
+
+    // $ANTLR start "rule__GuardStatement__ConditionAssignment_1"
+    // InternalFormalML.g:72214:1: rule__GuardStatement__ConditionAssignment_1 : ( ruleExpression ) ;
+    public final void rule__GuardStatement__ConditionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72218:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72219:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72219:2: ( ruleExpression )
+            // InternalFormalML.g:72220:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GuardStatement__ConditionAssignment_1"
+
+
+    // $ANTLR start "rule__TimedGuardStatement__ConditionAssignment_1"
+    // InternalFormalML.g:72229:1: rule__TimedGuardStatement__ConditionAssignment_1 : ( ruleExpression ) ;
+    public final void rule__TimedGuardStatement__ConditionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72233:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72234:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72234:2: ( ruleExpression )
+            // InternalFormalML.g:72235:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getTimedGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getTimedGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__TimedGuardStatement__ConditionAssignment_1"
+
+
+    // $ANTLR start "rule__EventGuardStatement__ConditionAssignment_1"
+    // InternalFormalML.g:72244:1: rule__EventGuardStatement__ConditionAssignment_1 : ( ruleExpression ) ;
+    public final void rule__EventGuardStatement__ConditionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72248:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72249:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72249:2: ( ruleExpression )
+            // InternalFormalML.g:72250:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEventGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEventGuardStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EventGuardStatement__ConditionAssignment_1"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__SolverAssignment_2"
+    // InternalFormalML.g:72259:1: rule__CheckSatGuardStatement__SolverAssignment_2 : ( ruleESIdentifier ) ;
+    public final void rule__CheckSatGuardStatement__SolverAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72263:1: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:72264:2: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:72264:2: ( ruleESIdentifier )
+            // InternalFormalML.g:72265:3: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementAccess().getSolverESIdentifierParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementAccess().getSolverESIdentifierParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__SolverAssignment_2"
+
+
+    // $ANTLR start "rule__CheckSatGuardStatement__ConditionAssignment_4"
+    // InternalFormalML.g:72274:1: rule__CheckSatGuardStatement__ConditionAssignment_4 : ( ruleExpression ) ;
+    public final void rule__CheckSatGuardStatement__ConditionAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72278:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72279:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72279:2: ( ruleExpression )
+            // InternalFormalML.g:72280:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCheckSatGuardStatementAccess().getConditionExpressionParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCheckSatGuardStatementAccess().getConditionExpressionParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CheckSatGuardStatement__ConditionAssignment_4"
+
+
+    // $ANTLR start "rule__InputComStatement__PortAssignment_1"
+    // InternalFormalML.g:72289:1: rule__InputComStatement__PortAssignment_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__InputComStatement__PortAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72293:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:72294:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:72294:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:72295:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getPortNamedElementCrossReference_1_0()); 
+            }
+            // InternalFormalML.g:72296:3: ( ruleESUfid )
+            // InternalFormalML.g:72297:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getPortNamedElementESUfidParserRuleCall_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getPortNamedElementESUfidParserRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getPortNamedElementCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__PortAssignment_1"
+
+
+    // $ANTLR start "rule__InputComStatement__LeftValueAssignment_2_1"
+    // InternalFormalML.g:72308:1: rule__InputComStatement__LeftValueAssignment_2_1 : ( ruleExpression ) ;
+    public final void rule__InputComStatement__LeftValueAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72312:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72313:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72313:2: ( ruleExpression )
+            // InternalFormalML.g:72314:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__LeftValueAssignment_2_1"
+
+
+    // $ANTLR start "rule__InputComStatement__LeftValueAssignment_2_2_1"
+    // InternalFormalML.g:72323:1: rule__InputComStatement__LeftValueAssignment_2_2_1 : ( ruleExpression ) ;
+    public final void rule__InputComStatement__LeftValueAssignment_2_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72327:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72328:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72328:2: ( ruleExpression )
+            // InternalFormalML.g:72329:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__LeftValueAssignment_2_2_1"
+
+
+    // $ANTLR start "rule__InputComStatement__TargetAssignment_3_0_1"
+    // InternalFormalML.g:72338:1: rule__InputComStatement__TargetAssignment_3_0_1 : ( ruleExpressionAsMachine ) ;
+    public final void rule__InputComStatement__TargetAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72342:1: ( ( ruleExpressionAsMachine ) )
+            // InternalFormalML.g:72343:2: ( ruleExpressionAsMachine )
+            {
+            // InternalFormalML.g:72343:2: ( ruleExpressionAsMachine )
+            // InternalFormalML.g:72344:3: ruleExpressionAsMachine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpressionAsMachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__TargetAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__InputComStatement__RouteAssignment_3_1_1"
+    // InternalFormalML.g:72353:1: rule__InputComStatement__RouteAssignment_3_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__InputComStatement__RouteAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72357:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:72358:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:72358:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:72359:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getRouteChannelCrossReference_3_1_1_0()); 
+            }
+            // InternalFormalML.g:72360:3: ( ruleESUfid )
+            // InternalFormalML.g:72361:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputComStatementAccess().getRouteChannelESUfidParserRuleCall_3_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getRouteChannelESUfidParserRuleCall_3_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputComStatementAccess().getRouteChannelCrossReference_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InputComStatement__RouteAssignment_3_1_1"
+
+
+    // $ANTLR start "rule__OutputComStatement__PortAssignment_1"
+    // InternalFormalML.g:72372:1: rule__OutputComStatement__PortAssignment_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__OutputComStatement__PortAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72376:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:72377:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:72377:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:72378:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getPortNamedElementCrossReference_1_0()); 
+            }
+            // InternalFormalML.g:72379:3: ( ruleESUfid )
+            // InternalFormalML.g:72380:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getPortNamedElementESUfidParserRuleCall_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getPortNamedElementESUfidParserRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getPortNamedElementCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__PortAssignment_1"
+
+
+    // $ANTLR start "rule__OutputComStatement__RigthValueAssignment_2_1"
+    // InternalFormalML.g:72391:1: rule__OutputComStatement__RigthValueAssignment_2_1 : ( ruleExpression ) ;
+    public final void rule__OutputComStatement__RigthValueAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72395:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72396:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72396:2: ( ruleExpression )
+            // InternalFormalML.g:72397:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__RigthValueAssignment_2_1"
+
+
+    // $ANTLR start "rule__OutputComStatement__RigthValueAssignment_2_2_1"
+    // InternalFormalML.g:72406:1: rule__OutputComStatement__RigthValueAssignment_2_2_1 : ( ruleExpression ) ;
+    public final void rule__OutputComStatement__RigthValueAssignment_2_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72410:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72411:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72411:2: ( ruleExpression )
+            // InternalFormalML.g:72412:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__RigthValueAssignment_2_2_1"
+
+
+    // $ANTLR start "rule__OutputComStatement__TargetAssignment_3_0_1"
+    // InternalFormalML.g:72421:1: rule__OutputComStatement__TargetAssignment_3_0_1 : ( ruleExpressionAsMachine ) ;
+    public final void rule__OutputComStatement__TargetAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72425:1: ( ( ruleExpressionAsMachine ) )
+            // InternalFormalML.g:72426:2: ( ruleExpressionAsMachine )
+            {
+            // InternalFormalML.g:72426:2: ( ruleExpressionAsMachine )
+            // InternalFormalML.g:72427:3: ruleExpressionAsMachine
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpressionAsMachine();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__TargetAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__OutputComStatement__RouteAssignment_3_1_1"
+    // InternalFormalML.g:72436:1: rule__OutputComStatement__RouteAssignment_3_1_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__OutputComStatement__RouteAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72440:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:72441:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:72441:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:72442:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getRouteChannelCrossReference_3_1_1_0()); 
+            }
+            // InternalFormalML.g:72443:3: ( ruleESUfid )
+            // InternalFormalML.g:72444:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getOutputComStatementAccess().getRouteChannelESUfidParserRuleCall_3_1_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getRouteChannelESUfidParserRuleCall_3_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getOutputComStatementAccess().getRouteChannelCrossReference_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__OutputComStatement__RouteAssignment_3_1_1"
+
+
+    // $ANTLR start "rule__ExpressionAsMachine__MachineAssignment"
+    // InternalFormalML.g:72455:1: rule__ExpressionAsMachine__MachineAssignment : ( ruleValuePureNamedMachineExpression ) ;
+    public final void rule__ExpressionAsMachine__MachineAssignment() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72459:1: ( ( ruleValuePureNamedMachineExpression ) )
+            // InternalFormalML.g:72460:2: ( ruleValuePureNamedMachineExpression )
+            {
+            // InternalFormalML.g:72460:2: ( ruleValuePureNamedMachineExpression )
+            // InternalFormalML.g:72461:3: ruleValuePureNamedMachineExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getExpressionAsMachineAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValuePureNamedMachineExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getExpressionAsMachineAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ExpressionAsMachine__MachineAssignment"
+
+
+    // $ANTLR start "rule__IfStatement__ConditionAssignment_1"
+    // InternalFormalML.g:72470:1: rule__IfStatement__ConditionAssignment_1 : ( ruleExpression ) ;
+    public final void rule__IfStatement__ConditionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72474:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72475:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72475:2: ( ruleExpression )
+            // InternalFormalML.g:72476:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__ConditionAssignment_1"
+
+
+    // $ANTLR start "rule__IfStatement__BodyBlockAssignment_2"
+    // InternalFormalML.g:72485:1: rule__IfStatement__BodyBlockAssignment_2 : ( ruleBlockStatement ) ;
+    public final void rule__IfStatement__BodyBlockAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72489:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:72490:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:72490:2: ( ruleBlockStatement )
+            // InternalFormalML.g:72491:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__BodyBlockAssignment_2"
+
+
+    // $ANTLR start "rule__IfStatement__ElseifStatementAssignment_3"
+    // InternalFormalML.g:72500:1: rule__IfStatement__ElseifStatementAssignment_3 : ( ruleElseIfStatement ) ;
+    public final void rule__IfStatement__ElseifStatementAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72504:1: ( ( ruleElseIfStatement ) )
+            // InternalFormalML.g:72505:2: ( ruleElseIfStatement )
+            {
+            // InternalFormalML.g:72505:2: ( ruleElseIfStatement )
+            // InternalFormalML.g:72506:3: ruleElseIfStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getElseifStatementElseIfStatementParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleElseIfStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getElseifStatementElseIfStatementParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__ElseifStatementAssignment_3"
+
+
+    // $ANTLR start "rule__IfStatement__ElseBlockAssignment_4_1"
+    // InternalFormalML.g:72515:1: rule__IfStatement__ElseBlockAssignment_4_1 : ( ruleBlockStatement ) ;
+    public final void rule__IfStatement__ElseBlockAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72519:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:72520:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:72520:2: ( ruleBlockStatement )
+            // InternalFormalML.g:72521:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIfStatementAccess().getElseBlockBlockStatementParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIfStatementAccess().getElseBlockBlockStatementParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IfStatement__ElseBlockAssignment_4_1"
+
+
+    // $ANTLR start "rule__ElseIfStatement__ConditionAssignment_1"
+    // InternalFormalML.g:72530:1: rule__ElseIfStatement__ConditionAssignment_1 : ( ruleExpression ) ;
+    public final void rule__ElseIfStatement__ConditionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72534:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72535:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72535:2: ( ruleExpression )
+            // InternalFormalML.g:72536:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getElseIfStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getElseIfStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__ConditionAssignment_1"
+
+
+    // $ANTLR start "rule__ElseIfStatement__BodyBlockAssignment_2"
+    // InternalFormalML.g:72545:1: rule__ElseIfStatement__BodyBlockAssignment_2 : ( ruleBlockStatement ) ;
+    public final void rule__ElseIfStatement__BodyBlockAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72549:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:72550:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:72550:2: ( ruleBlockStatement )
+            // InternalFormalML.g:72551:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getElseIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getElseIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ElseIfStatement__BodyBlockAssignment_2"
+
+
+    // $ANTLR start "rule__WhileDoStatement__ConditionAssignment_1"
+    // InternalFormalML.g:72560:1: rule__WhileDoStatement__ConditionAssignment_1 : ( ruleExpression ) ;
+    public final void rule__WhileDoStatement__ConditionAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72564:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72565:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72565:2: ( ruleExpression )
+            // InternalFormalML.g:72566:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWhileDoStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWhileDoStatementAccess().getConditionExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__WhileDoStatement__ConditionAssignment_1"
+
+
+    // $ANTLR start "rule__WhileDoStatement__BodyBlockAssignment_2"
+    // InternalFormalML.g:72575:1: rule__WhileDoStatement__BodyBlockAssignment_2 : ( ruleBlockStatement ) ;
+    public final void rule__WhileDoStatement__BodyBlockAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72579:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:72580:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:72580:2: ( ruleBlockStatement )
+            // InternalFormalML.g:72581:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getWhileDoStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getWhileDoStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__WhileDoStatement__BodyBlockAssignment_2"
+
+
+    // $ANTLR start "rule__DoWhileStatement__BodyBlockAssignment_1"
+    // InternalFormalML.g:72590:1: rule__DoWhileStatement__BodyBlockAssignment_1 : ( ruleBlockStatement ) ;
+    public final void rule__DoWhileStatement__BodyBlockAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72594:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:72595:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:72595:2: ( ruleBlockStatement )
+            // InternalFormalML.g:72596:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDoWhileStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDoWhileStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__BodyBlockAssignment_1"
+
+
+    // $ANTLR start "rule__DoWhileStatement__ConditionAssignment_3"
+    // InternalFormalML.g:72605:1: rule__DoWhileStatement__ConditionAssignment_3 : ( ruleExpression ) ;
+    public final void rule__DoWhileStatement__ConditionAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72609:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72610:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72610:2: ( ruleExpression )
+            // InternalFormalML.g:72611:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DoWhileStatement__ConditionAssignment_3"
+
+
+    // $ANTLR start "rule__ForStatement__InitAssignment_0_1"
+    // InternalFormalML.g:72620:1: rule__ForStatement__InitAssignment_0_1 : ( ruleForAssignmentExpression ) ;
+    public final void rule__ForStatement__InitAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72624:1: ( ( ruleForAssignmentExpression ) )
+            // InternalFormalML.g:72625:2: ( ruleForAssignmentExpression )
+            {
+            // InternalFormalML.g:72625:2: ( ruleForAssignmentExpression )
+            // InternalFormalML.g:72626:3: ruleForAssignmentExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleForAssignmentExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__InitAssignment_0_1"
+
+
+    // $ANTLR start "rule__ForStatement__ConditionAssignment_0_3"
+    // InternalFormalML.g:72635:1: rule__ForStatement__ConditionAssignment_0_3 : ( ruleExpression ) ;
+    public final void rule__ForStatement__ConditionAssignment_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72639:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72640:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72640:2: ( ruleExpression )
+            // InternalFormalML.g:72641:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_0_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__ConditionAssignment_0_3"
+
+
+    // $ANTLR start "rule__ForStatement__IterateAssignment_0_5"
+    // InternalFormalML.g:72650:1: rule__ForStatement__IterateAssignment_0_5 : ( ruleForAssignmentExpression ) ;
+    public final void rule__ForStatement__IterateAssignment_0_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72654:1: ( ( ruleForAssignmentExpression ) )
+            // InternalFormalML.g:72655:2: ( ruleForAssignmentExpression )
+            {
+            // InternalFormalML.g:72655:2: ( ruleForAssignmentExpression )
+            // InternalFormalML.g:72656:3: ruleForAssignmentExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_0_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleForAssignmentExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_0_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__IterateAssignment_0_5"
+
+
+    // $ANTLR start "rule__ForStatement__BodyBlockAssignment_0_6"
+    // InternalFormalML.g:72665:1: rule__ForStatement__BodyBlockAssignment_0_6 : ( ruleBlockStatement ) ;
+    public final void rule__ForStatement__BodyBlockAssignment_0_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72669:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:72670:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:72670:2: ( ruleBlockStatement )
+            // InternalFormalML.g:72671:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__BodyBlockAssignment_0_6"
+
+
+    // $ANTLR start "rule__ForStatement__InitAssignment_1_2"
+    // InternalFormalML.g:72680:1: rule__ForStatement__InitAssignment_1_2 : ( ruleForAssignmentExpression ) ;
+    public final void rule__ForStatement__InitAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72684:1: ( ( ruleForAssignmentExpression ) )
+            // InternalFormalML.g:72685:2: ( ruleForAssignmentExpression )
+            {
+            // InternalFormalML.g:72685:2: ( ruleForAssignmentExpression )
+            // InternalFormalML.g:72686:3: ruleForAssignmentExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleForAssignmentExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__InitAssignment_1_2"
+
+
+    // $ANTLR start "rule__ForStatement__ConditionAssignment_1_4"
+    // InternalFormalML.g:72695:1: rule__ForStatement__ConditionAssignment_1_4 : ( ruleExpression ) ;
+    public final void rule__ForStatement__ConditionAssignment_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72699:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72700:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72700:2: ( ruleExpression )
+            // InternalFormalML.g:72701:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__ConditionAssignment_1_4"
+
+
+    // $ANTLR start "rule__ForStatement__IterateAssignment_1_6"
+    // InternalFormalML.g:72710:1: rule__ForStatement__IterateAssignment_1_6 : ( ruleForAssignmentExpression ) ;
+    public final void rule__ForStatement__IterateAssignment_1_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72714:1: ( ( ruleForAssignmentExpression ) )
+            // InternalFormalML.g:72715:2: ( ruleForAssignmentExpression )
+            {
+            // InternalFormalML.g:72715:2: ( ruleForAssignmentExpression )
+            // InternalFormalML.g:72716:3: ruleForAssignmentExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_1_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleForAssignmentExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_1_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__IterateAssignment_1_6"
+
+
+    // $ANTLR start "rule__ForStatement__BodyBlockAssignment_1_8"
+    // InternalFormalML.g:72725:1: rule__ForStatement__BodyBlockAssignment_1_8 : ( ruleBlockStatement ) ;
+    public final void rule__ForStatement__BodyBlockAssignment_1_8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72729:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:72730:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:72730:2: ( ruleBlockStatement )
+            // InternalFormalML.g:72731:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_8_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_8_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForStatement__BodyBlockAssignment_1_8"
+
+
+    // $ANTLR start "rule__ForEachStatement__IteratorAssignment_0_1"
+    // InternalFormalML.g:72740:1: rule__ForEachStatement__IteratorAssignment_0_1 : ( ruleLeftHandSideExpression ) ;
+    public final void rule__ForEachStatement__IteratorAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72744:1: ( ( ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:72745:2: ( ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:72745:2: ( ruleLeftHandSideExpression )
+            // InternalFormalML.g:72746:3: ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__IteratorAssignment_0_1"
+
+
+    // $ANTLR start "rule__ForEachStatement__EnumerationAssignment_0_3"
+    // InternalFormalML.g:72755:1: rule__ForEachStatement__EnumerationAssignment_0_3 : ( ruleExpression ) ;
+    public final void rule__ForEachStatement__EnumerationAssignment_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72759:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72760:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72760:2: ( ruleExpression )
+            // InternalFormalML.g:72761:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_0_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_0_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__EnumerationAssignment_0_3"
+
+
+    // $ANTLR start "rule__ForEachStatement__BodyBlockAssignment_0_4"
+    // InternalFormalML.g:72770:1: rule__ForEachStatement__BodyBlockAssignment_0_4 : ( ruleBlockStatement ) ;
+    public final void rule__ForEachStatement__BodyBlockAssignment_0_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72774:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:72775:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:72775:2: ( ruleBlockStatement )
+            // InternalFormalML.g:72776:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__BodyBlockAssignment_0_4"
+
+
+    // $ANTLR start "rule__ForEachStatement__IteratorAssignment_1_2"
+    // InternalFormalML.g:72785:1: rule__ForEachStatement__IteratorAssignment_1_2 : ( ruleLeftHandSideExpression ) ;
+    public final void rule__ForEachStatement__IteratorAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72789:1: ( ( ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:72790:2: ( ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:72790:2: ( ruleLeftHandSideExpression )
+            // InternalFormalML.g:72791:3: ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__IteratorAssignment_1_2"
+
+
+    // $ANTLR start "rule__ForEachStatement__EnumerationAssignment_1_4"
+    // InternalFormalML.g:72800:1: rule__ForEachStatement__EnumerationAssignment_1_4 : ( ruleExpression ) ;
+    public final void rule__ForEachStatement__EnumerationAssignment_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72804:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72805:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72805:2: ( ruleExpression )
+            // InternalFormalML.g:72806:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__EnumerationAssignment_1_4"
+
+
+    // $ANTLR start "rule__ForEachStatement__BodyBlockAssignment_1_6"
+    // InternalFormalML.g:72815:1: rule__ForEachStatement__BodyBlockAssignment_1_6 : ( ruleBlockStatement ) ;
+    public final void rule__ForEachStatement__BodyBlockAssignment_1_6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72819:1: ( ( ruleBlockStatement ) )
+            // InternalFormalML.g:72820:2: ( ruleBlockStatement )
+            {
+            // InternalFormalML.g:72820:2: ( ruleBlockStatement )
+            // InternalFormalML.g:72821:3: ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_6_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ForEachStatement__BodyBlockAssignment_1_6"
+
+
+    // $ANTLR start "rule__InterruptStatement__KindAssignment_0"
+    // InternalFormalML.g:72830:1: rule__InterruptStatement__KindAssignment_0 : ( ruleInterruptStatementKind ) ;
+    public final void rule__InterruptStatement__KindAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72834:1: ( ( ruleInterruptStatementKind ) )
+            // InternalFormalML.g:72835:2: ( ruleInterruptStatementKind )
+            {
+            // InternalFormalML.g:72835:2: ( ruleInterruptStatementKind )
+            // InternalFormalML.g:72836:3: ruleInterruptStatementKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getKindInterruptStatementKindEnumRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleInterruptStatementKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getKindInterruptStatementKindEnumRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__KindAssignment_0"
+
+
+    // $ANTLR start "rule__InterruptStatement__ExprAssignment_1_0"
+    // InternalFormalML.g:72845:1: rule__InterruptStatement__ExprAssignment_1_0 : ( ruleExpression ) ;
+    public final void rule__InterruptStatement__ExprAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72849:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72850:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72850:2: ( ruleExpression )
+            // InternalFormalML.g:72851:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__ExprAssignment_1_0"
+
+
+    // $ANTLR start "rule__InterruptStatement__ExprAssignment_1_1_1"
+    // InternalFormalML.g:72860:1: rule__InterruptStatement__ExprAssignment_1_1_1 : ( ruleExpression ) ;
+    public final void rule__InterruptStatement__ExprAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72864:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72865:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72865:2: ( ruleExpression )
+            // InternalFormalML.g:72866:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__ExprAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__InterruptStatement__ExprAssignment_1_1_2_1"
+    // InternalFormalML.g:72875:1: rule__InterruptStatement__ExprAssignment_1_1_2_1 : ( ruleExpression ) ;
+    public final void rule__InterruptStatement__ExprAssignment_1_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72879:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:72880:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:72880:2: ( ruleExpression )
+            // InternalFormalML.g:72881:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InterruptStatement__ExprAssignment_1_1_2_1"
+
+
+    // $ANTLR start "rule__ActivityStatement__OpAssignment_1"
+    // InternalFormalML.g:72890:1: rule__ActivityStatement__OpAssignment_1 : ( ruleOPERATOR_ACTIVITY ) ;
+    public final void rule__ActivityStatement__OpAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72894:1: ( ( ruleOPERATOR_ACTIVITY ) )
+            // InternalFormalML.g:72895:2: ( ruleOPERATOR_ACTIVITY )
+            {
+            // InternalFormalML.g:72895:2: ( ruleOPERATOR_ACTIVITY )
+            // InternalFormalML.g:72896:3: ruleOPERATOR_ACTIVITY
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementAccess().getOpOPERATOR_ACTIVITYEnumRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleOPERATOR_ACTIVITY();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementAccess().getOpOPERATOR_ACTIVITYEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__OpAssignment_1"
+
+
+    // $ANTLR start "rule__ActivityStatement__MachineAssignment_2"
+    // InternalFormalML.g:72905:1: rule__ActivityStatement__MachineAssignment_2 : ( ruleValuePureNamedMachineExpression ) ;
+    public final void rule__ActivityStatement__MachineAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72909:1: ( ( ruleValuePureNamedMachineExpression ) )
+            // InternalFormalML.g:72910:2: ( ruleValuePureNamedMachineExpression )
+            {
+            // InternalFormalML.g:72910:2: ( ruleValuePureNamedMachineExpression )
+            // InternalFormalML.g:72911:3: ruleValuePureNamedMachineExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValuePureNamedMachineExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__MachineAssignment_2"
+
+
+    // $ANTLR start "rule__ActivityStatement__TupleAssignment_3"
+    // InternalFormalML.g:72920:1: rule__ActivityStatement__TupleAssignment_3 : ( ruleTupleParameterExpression ) ;
+    public final void rule__ActivityStatement__TupleAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72924:1: ( ( ruleTupleParameterExpression ) )
+            // InternalFormalML.g:72925:2: ( ruleTupleParameterExpression )
+            {
+            // InternalFormalML.g:72925:2: ( ruleTupleParameterExpression )
+            // InternalFormalML.g:72926:3: ruleTupleParameterExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getActivityStatementAccess().getTupleTupleParameterExpressionParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleTupleParameterExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getActivityStatementAccess().getTupleTupleParameterExpressionParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ActivityStatement__TupleAssignment_3"
+
+
+    // $ANTLR start "rule__InvokeStatement__ExpressionAssignment_0_0"
+    // InternalFormalML.g:72935:1: rule__InvokeStatement__ExpressionAssignment_0_0 : ( ruleInvokeExpressionDeprecated ) ;
+    public final void rule__InvokeStatement__ExpressionAssignment_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72939:1: ( ( ruleInvokeExpressionDeprecated ) )
+            // InternalFormalML.g:72940:2: ( ruleInvokeExpressionDeprecated )
+            {
+            // InternalFormalML.g:72940:2: ( ruleInvokeExpressionDeprecated )
+            // InternalFormalML.g:72941:3: ruleInvokeExpressionDeprecated
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleInvokeExpressionDeprecated();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__ExpressionAssignment_0_0"
+
+
+    // $ANTLR start "rule__InvokeStatement__InvokableAssignment_1_0"
+    // InternalFormalML.g:72950:1: rule__InvokeStatement__InvokableAssignment_1_0 : ( ( ruleESUfid ) ) ;
+    public final void rule__InvokeStatement__InvokableAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72954:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:72955:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:72955:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:72956:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_1_0_0()); 
+            }
+            // InternalFormalML.g:72957:3: ( ruleESUfid )
+            // InternalFormalML.g:72958:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_1_0_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_1_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__InvokableAssignment_1_0"
+
+
+    // $ANTLR start "rule__InvokeStatement__ExecRoutineAssignment_1_1"
+    // InternalFormalML.g:72969:1: rule__InvokeStatement__ExecRoutineAssignment_1_1 : ( ( '(' ) ) ;
+    public final void rule__InvokeStatement__ExecRoutineAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72973:1: ( ( ( '(' ) ) )
+            // InternalFormalML.g:72974:2: ( ( '(' ) )
+            {
+            // InternalFormalML.g:72974:2: ( ( '(' ) )
+            // InternalFormalML.g:72975:3: ( '(' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:72976:3: ( '(' )
+            // InternalFormalML.g:72977:4: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0()); 
+            }
+            match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__ExecRoutineAssignment_1_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__ArgsAssignment_1_2"
+    // InternalFormalML.g:72988:1: rule__InvokeStatement__ArgsAssignment_1_2 : ( ruleMixTupleExpressionList ) ;
+    public final void rule__InvokeStatement__ArgsAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:72992:1: ( ( ruleMixTupleExpressionList ) )
+            // InternalFormalML.g:72993:2: ( ruleMixTupleExpressionList )
+            {
+            // InternalFormalML.g:72993:2: ( ruleMixTupleExpressionList )
+            // InternalFormalML.g:72994:3: ruleMixTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__ArgsAssignment_1_2"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_1_4_1_0_0"
+    // InternalFormalML.g:73003:1: rule__InvokeStatement__RetsAssignment_1_4_1_0_0 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_1_4_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73007:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73008:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73008:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73009:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_0_0()); 
+            }
+            // InternalFormalML.g:73010:3: ( RULE_ID )
+            // InternalFormalML.g:73011:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_1_4_1_0_0"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1"
+    // InternalFormalML.g:73022:1: rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73026:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73027:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73027:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73028:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_1_1_0()); 
+            }
+            // InternalFormalML.g:73029:3: ( RULE_ID )
+            // InternalFormalML.g:73030:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_1_4_1_0_1_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_1_4_1_1_1"
+    // InternalFormalML.g:73041:1: rule__InvokeStatement__RetsAssignment_1_4_1_1_1 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_1_4_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73045:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73046:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73046:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73047:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_1_0()); 
+            }
+            // InternalFormalML.g:73048:3: ( RULE_ID )
+            // InternalFormalML.g:73049:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_1_4_1_1_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1"
+    // InternalFormalML.g:73060:1: rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73064:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73065:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73065:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73066:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_2_1_0()); 
+            }
+            // InternalFormalML.g:73067:3: ( RULE_ID )
+            // InternalFormalML.g:73068:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_1_4_1_1_2_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__ExecRoutineAssignment_2_0"
+    // InternalFormalML.g:73079:1: rule__InvokeStatement__ExecRoutineAssignment_2_0 : ( ( 'exec' ) ) ;
+    public final void rule__InvokeStatement__ExecRoutineAssignment_2_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73083:1: ( ( ( 'exec' ) ) )
+            // InternalFormalML.g:73084:2: ( ( 'exec' ) )
+            {
+            // InternalFormalML.g:73084:2: ( ( 'exec' ) )
+            // InternalFormalML.g:73085:3: ( 'exec' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0()); 
+            }
+            // InternalFormalML.g:73086:3: ( 'exec' )
+            // InternalFormalML.g:73087:4: 'exec'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0()); 
+            }
+            match(input,284,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__ExecRoutineAssignment_2_0"
+
+
+    // $ANTLR start "rule__InvokeStatement__InvokableAssignment_2_1"
+    // InternalFormalML.g:73098:1: rule__InvokeStatement__InvokableAssignment_2_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__InvokeStatement__InvokableAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73102:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:73103:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:73103:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:73104:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_2_1_0()); 
+            }
+            // InternalFormalML.g:73105:3: ( ruleESUfid )
+            // InternalFormalML.g:73106:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_2_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__InvokableAssignment_2_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__ArgsAssignment_2_3"
+    // InternalFormalML.g:73117:1: rule__InvokeStatement__ArgsAssignment_2_3 : ( ruleMixTupleExpressionList ) ;
+    public final void rule__InvokeStatement__ArgsAssignment_2_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73121:1: ( ( ruleMixTupleExpressionList ) )
+            // InternalFormalML.g:73122:2: ( ruleMixTupleExpressionList )
+            {
+            // InternalFormalML.g:73122:2: ( ruleMixTupleExpressionList )
+            // InternalFormalML.g:73123:3: ruleMixTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_2_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_2_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__ArgsAssignment_2_3"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_2_5_1_0_0"
+    // InternalFormalML.g:73132:1: rule__InvokeStatement__RetsAssignment_2_5_1_0_0 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_2_5_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73136:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73137:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73137:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73138:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_0_0()); 
+            }
+            // InternalFormalML.g:73139:3: ( RULE_ID )
+            // InternalFormalML.g:73140:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_2_5_1_0_0"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1"
+    // InternalFormalML.g:73151:1: rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73155:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73156:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73156:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73157:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_1_1_0()); 
+            }
+            // InternalFormalML.g:73158:3: ( RULE_ID )
+            // InternalFormalML.g:73159:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_2_5_1_0_1_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_2_5_1_1_1"
+    // InternalFormalML.g:73170:1: rule__InvokeStatement__RetsAssignment_2_5_1_1_1 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_2_5_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73174:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73175:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73175:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73176:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_1_0()); 
+            }
+            // InternalFormalML.g:73177:3: ( RULE_ID )
+            // InternalFormalML.g:73178:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_2_5_1_1_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1"
+    // InternalFormalML.g:73189:1: rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73193:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73194:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73194:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73195:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_2_1_0()); 
+            }
+            // InternalFormalML.g:73196:3: ( RULE_ID )
+            // InternalFormalML.g:73197:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_2_5_1_1_2_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__CallProcedureAssignment_3_0"
+    // InternalFormalML.g:73208:1: rule__InvokeStatement__CallProcedureAssignment_3_0 : ( ( 'call' ) ) ;
+    public final void rule__InvokeStatement__CallProcedureAssignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73212:1: ( ( ( 'call' ) ) )
+            // InternalFormalML.g:73213:2: ( ( 'call' ) )
+            {
+            // InternalFormalML.g:73213:2: ( ( 'call' ) )
+            // InternalFormalML.g:73214:3: ( 'call' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0()); 
+            }
+            // InternalFormalML.g:73215:3: ( 'call' )
+            // InternalFormalML.g:73216:4: 'call'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0()); 
+            }
+            match(input,285,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__CallProcedureAssignment_3_0"
+
+
+    // $ANTLR start "rule__InvokeStatement__InvokableAssignment_3_1"
+    // InternalFormalML.g:73227:1: rule__InvokeStatement__InvokableAssignment_3_1 : ( ( ruleESUfid ) ) ;
+    public final void rule__InvokeStatement__InvokableAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73231:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:73232:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:73232:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:73233:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_3_1_0()); 
+            }
+            // InternalFormalML.g:73234:3: ( ruleESUfid )
+            // InternalFormalML.g:73235:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_3_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementESUfidParserRuleCall_3_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__InvokableAssignment_3_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__ArgsAssignment_3_2"
+    // InternalFormalML.g:73246:1: rule__InvokeStatement__ArgsAssignment_3_2 : ( ruleMixTupleExpressionList ) ;
+    public final void rule__InvokeStatement__ArgsAssignment_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73250:1: ( ( ruleMixTupleExpressionList ) )
+            // InternalFormalML.g:73251:2: ( ruleMixTupleExpressionList )
+            {
+            // InternalFormalML.g:73251:2: ( ruleMixTupleExpressionList )
+            // InternalFormalML.g:73252:3: ruleMixTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_3_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_3_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__ArgsAssignment_3_2"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_3_3_1_0_0"
+    // InternalFormalML.g:73261:1: rule__InvokeStatement__RetsAssignment_3_3_1_0_0 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_3_3_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73265:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73266:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73266:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73267:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_0_0()); 
+            }
+            // InternalFormalML.g:73268:3: ( RULE_ID )
+            // InternalFormalML.g:73269:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_3_3_1_0_0"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1"
+    // InternalFormalML.g:73280:1: rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73284:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73285:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73285:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73286:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_1_1_0()); 
+            }
+            // InternalFormalML.g:73287:3: ( RULE_ID )
+            // InternalFormalML.g:73288:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_3_3_1_0_1_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_3_3_1_1_1"
+    // InternalFormalML.g:73299:1: rule__InvokeStatement__RetsAssignment_3_3_1_1_1 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_3_3_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73303:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73304:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73304:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73305:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_1_0()); 
+            }
+            // InternalFormalML.g:73306:3: ( RULE_ID )
+            // InternalFormalML.g:73307:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_3_3_1_1_1"
+
+
+    // $ANTLR start "rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1"
+    // InternalFormalML.g:73318:1: rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1 : ( ( RULE_ID ) ) ;
+    public final void rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73322:1: ( ( ( RULE_ID ) ) )
+            // InternalFormalML.g:73323:2: ( ( RULE_ID ) )
+            {
+            // InternalFormalML.g:73323:2: ( ( RULE_ID ) )
+            // InternalFormalML.g:73324:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_2_1_0()); 
+            }
+            // InternalFormalML.g:73325:3: ( RULE_ID )
+            // InternalFormalML.g:73326:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1()); 
+            }
+            match(input,RULE_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeStatement__RetsAssignment_3_3_1_1_2_1"
+
+
+    // $ANTLR start "rule__AssignmentExpression__LeftHandSideAssignment_0"
+    // InternalFormalML.g:73337:1: rule__AssignmentExpression__LeftHandSideAssignment_0 : ( ruleLeftHandSideExpression ) ;
+    public final void rule__AssignmentExpression__LeftHandSideAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73341:1: ( ( ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:73342:2: ( ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:73342:2: ( ruleLeftHandSideExpression )
+            // InternalFormalML.g:73343:3: ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentExpression__LeftHandSideAssignment_0"
+
+
+    // $ANTLR start "rule__AssignmentExpression__OperatorAssignment_1"
+    // InternalFormalML.g:73352:1: rule__AssignmentExpression__OperatorAssignment_1 : ( ruleAssignmentOperator ) ;
+    public final void rule__AssignmentExpression__OperatorAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73356:1: ( ( ruleAssignmentOperator ) )
+            // InternalFormalML.g:73357:2: ( ruleAssignmentOperator )
+            {
+            // InternalFormalML.g:73357:2: ( ruleAssignmentOperator )
+            // InternalFormalML.g:73358:3: ruleAssignmentOperator
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignmentOperatorParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAssignmentOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignmentOperatorParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentExpression__OperatorAssignment_1"
+
+
+    // $ANTLR start "rule__AssignmentExpression__RigthHandSideAssignment_2"
+    // InternalFormalML.g:73367:1: rule__AssignmentExpression__RigthHandSideAssignment_2 : ( ruleExpression ) ;
+    public final void rule__AssignmentExpression__RigthHandSideAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73371:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:73372:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:73372:2: ( ruleExpression )
+            // InternalFormalML.g:73373:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AssignmentExpression__RigthHandSideAssignment_2"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__LvalueAssignment_1_0"
+    // InternalFormalML.g:73382:1: rule__LeftHandSideExpression__LvalueAssignment_1_0 : ( ruleValueSelectionExpression ) ;
+    public final void rule__LeftHandSideExpression__LvalueAssignment_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73386:1: ( ( ruleValueSelectionExpression ) )
+            // InternalFormalML.g:73387:2: ( ruleValueSelectionExpression )
+            {
+            // InternalFormalML.g:73387:2: ( ruleValueSelectionExpression )
+            // InternalFormalML.g:73388:3: ruleValueSelectionExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueSelectionExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__LvalueAssignment_1_0"
+
+
+    // $ANTLR start "rule__LeftHandSideExpression__LvalueAssignment_1_1_1"
+    // InternalFormalML.g:73397:1: rule__LeftHandSideExpression__LvalueAssignment_1_1_1 : ( ruleValueSelectionExpression ) ;
+    public final void rule__LeftHandSideExpression__LvalueAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73401:1: ( ( ruleValueSelectionExpression ) )
+            // InternalFormalML.g:73402:2: ( ruleValueSelectionExpression )
+            {
+            // InternalFormalML.g:73402:2: ( ruleValueSelectionExpression )
+            // InternalFormalML.g:73403:3: ruleValueSelectionExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueSelectionExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LeftHandSideExpression__LvalueAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__OperatorAssignment_1_1"
+    // InternalFormalML.g:73412:1: rule__ConditionalTestExpression__OperatorAssignment_1_1 : ( ( '?' ) ) ;
+    public final void rule__ConditionalTestExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73416:1: ( ( ( '?' ) ) )
+            // InternalFormalML.g:73417:2: ( ( '?' ) )
+            {
+            // InternalFormalML.g:73417:2: ( ( '?' ) )
+            // InternalFormalML.g:73418:3: ( '?' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:73419:3: ( '?' )
+            // InternalFormalML.g:73420:4: '?'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); 
+            }
+            match(input,286,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__ThenOperandAssignment_1_2"
+    // InternalFormalML.g:73431:1: rule__ConditionalTestExpression__ThenOperandAssignment_1_2 : ( ruleExpression ) ;
+    public final void rule__ConditionalTestExpression__ThenOperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73435:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:73436:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:73436:2: ( ruleExpression )
+            // InternalFormalML.g:73437:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getThenOperandExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getThenOperandExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__ThenOperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__ConditionalTestExpression__ElseOperandAssignment_1_4"
+    // InternalFormalML.g:73446:1: rule__ConditionalTestExpression__ElseOperandAssignment_1_4 : ( ruleExpression ) ;
+    public final void rule__ConditionalTestExpression__ElseOperandAssignment_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73450:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:73451:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:73451:2: ( ruleExpression )
+            // InternalFormalML.g:73452:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getConditionalTestExpressionAccess().getElseOperandExpressionParserRuleCall_1_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getConditionalTestExpressionAccess().getElseOperandExpressionParserRuleCall_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ConditionalTestExpression__ElseOperandAssignment_1_4"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__OperatorAssignment_1_1"
+    // InternalFormalML.g:73461:1: rule__LogicalOrExpression__OperatorAssignment_1_1 : ( ( rule__LogicalOrExpression__OperatorAlternatives_1_1_0 ) ) ;
+    public final void rule__LogicalOrExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73465:1: ( ( ( rule__LogicalOrExpression__OperatorAlternatives_1_1_0 ) ) )
+            // InternalFormalML.g:73466:2: ( ( rule__LogicalOrExpression__OperatorAlternatives_1_1_0 ) )
+            {
+            // InternalFormalML.g:73466:2: ( ( rule__LogicalOrExpression__OperatorAlternatives_1_1_0 ) )
+            // InternalFormalML.g:73467:3: ( rule__LogicalOrExpression__OperatorAlternatives_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+            // InternalFormalML.g:73468:3: ( rule__LogicalOrExpression__OperatorAlternatives_1_1_0 )
+            // InternalFormalML.g:73468:4: rule__LogicalOrExpression__OperatorAlternatives_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalOrExpression__OperatorAlternatives_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__OperandAssignment_1_2"
+    // InternalFormalML.g:73476:1: rule__LogicalOrExpression__OperandAssignment_1_2 : ( ruleLogicalAndExpression ) ;
+    public final void rule__LogicalOrExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73480:1: ( ( ruleLogicalAndExpression ) )
+            // InternalFormalML.g:73481:2: ( ruleLogicalAndExpression )
+            {
+            // InternalFormalML.g:73481:2: ( ruleLogicalAndExpression )
+            // InternalFormalML.g:73482:3: ruleLogicalAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLogicalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__LogicalOrExpression__OperandAssignment_1_3_1"
+    // InternalFormalML.g:73491:1: rule__LogicalOrExpression__OperandAssignment_1_3_1 : ( ruleLogicalAndExpression ) ;
+    public final void rule__LogicalOrExpression__OperandAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73495:1: ( ( ruleLogicalAndExpression ) )
+            // InternalFormalML.g:73496:2: ( ruleLogicalAndExpression )
+            {
+            // InternalFormalML.g:73496:2: ( ruleLogicalAndExpression )
+            // InternalFormalML.g:73497:3: ruleLogicalAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLogicalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalOrExpression__OperandAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__OperatorAssignment_1_1"
+    // InternalFormalML.g:73506:1: rule__LogicalAndExpression__OperatorAssignment_1_1 : ( ( rule__LogicalAndExpression__OperatorAlternatives_1_1_0 ) ) ;
+    public final void rule__LogicalAndExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73510:1: ( ( ( rule__LogicalAndExpression__OperatorAlternatives_1_1_0 ) ) )
+            // InternalFormalML.g:73511:2: ( ( rule__LogicalAndExpression__OperatorAlternatives_1_1_0 ) )
+            {
+            // InternalFormalML.g:73511:2: ( ( rule__LogicalAndExpression__OperatorAlternatives_1_1_0 ) )
+            // InternalFormalML.g:73512:3: ( rule__LogicalAndExpression__OperatorAlternatives_1_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+            // InternalFormalML.g:73513:3: ( rule__LogicalAndExpression__OperatorAlternatives_1_1_0 )
+            // InternalFormalML.g:73513:4: rule__LogicalAndExpression__OperatorAlternatives_1_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalAndExpression__OperatorAlternatives_1_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getOperatorAlternatives_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__OperandAssignment_1_2"
+    // InternalFormalML.g:73521:1: rule__LogicalAndExpression__OperandAssignment_1_2 : ( ruleBitwiseOrExpression ) ;
+    public final void rule__LogicalAndExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73525:1: ( ( ruleBitwiseOrExpression ) )
+            // InternalFormalML.g:73526:2: ( ruleBitwiseOrExpression )
+            {
+            // InternalFormalML.g:73526:2: ( ruleBitwiseOrExpression )
+            // InternalFormalML.g:73527:3: ruleBitwiseOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__LogicalAndExpression__OperandAssignment_1_3_1"
+    // InternalFormalML.g:73536:1: rule__LogicalAndExpression__OperandAssignment_1_3_1 : ( ruleBitwiseOrExpression ) ;
+    public final void rule__LogicalAndExpression__OperandAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73540:1: ( ( ruleBitwiseOrExpression ) )
+            // InternalFormalML.g:73541:2: ( ruleBitwiseOrExpression )
+            {
+            // InternalFormalML.g:73541:2: ( ruleBitwiseOrExpression )
+            // InternalFormalML.g:73542:3: ruleBitwiseOrExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseOrExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalAndExpression__OperandAssignment_1_3_1"
+
+}
+
+@SuppressWarnings("all")
+abstract class InternalFormalMLParser3 extends InternalFormalMLParser2 {
+
+        InternalFormalMLParser3(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+
+        InternalFormalMLParser3(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+        }
+
+    // $ANTLR start "rule__BitwiseOrExpression__OperatorAssignment_1_1"
+    // InternalFormalML.g:73551:1: rule__BitwiseOrExpression__OperatorAssignment_1_1 : ( ( '|' ) ) ;
+    public final void rule__BitwiseOrExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73555:1: ( ( ( '|' ) ) )
+            // InternalFormalML.g:73556:2: ( ( '|' ) )
+            {
+            // InternalFormalML.g:73556:2: ( ( '|' ) )
+            // InternalFormalML.g:73557:3: ( '|' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:73558:3: ( '|' )
+            // InternalFormalML.g:73559:4: '|'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0()); 
+            }
+            match(input,256,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__OperandAssignment_1_2"
+    // InternalFormalML.g:73570:1: rule__BitwiseOrExpression__OperandAssignment_1_2 : ( ruleBitwiseXorExpression ) ;
+    public final void rule__BitwiseOrExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73574:1: ( ( ruleBitwiseXorExpression ) )
+            // InternalFormalML.g:73575:2: ( ruleBitwiseXorExpression )
+            {
+            // InternalFormalML.g:73575:2: ( ruleBitwiseXorExpression )
+            // InternalFormalML.g:73576:3: ruleBitwiseXorExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseXorExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__BitwiseOrExpression__OperandAssignment_1_3_1"
+    // InternalFormalML.g:73585:1: rule__BitwiseOrExpression__OperandAssignment_1_3_1 : ( ruleBitwiseXorExpression ) ;
+    public final void rule__BitwiseOrExpression__OperandAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73589:1: ( ( ruleBitwiseXorExpression ) )
+            // InternalFormalML.g:73590:2: ( ruleBitwiseXorExpression )
+            {
+            // InternalFormalML.g:73590:2: ( ruleBitwiseXorExpression )
+            // InternalFormalML.g:73591:3: ruleBitwiseXorExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseXorExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseOrExpression__OperandAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__OperatorAssignment_1_1"
+    // InternalFormalML.g:73600:1: rule__BitwiseXorExpression__OperatorAssignment_1_1 : ( ( '^' ) ) ;
+    public final void rule__BitwiseXorExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73604:1: ( ( ( '^' ) ) )
+            // InternalFormalML.g:73605:2: ( ( '^' ) )
+            {
+            // InternalFormalML.g:73605:2: ( ( '^' ) )
+            // InternalFormalML.g:73606:3: ( '^' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:73607:3: ( '^' )
+            // InternalFormalML.g:73608:4: '^'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0()); 
+            }
+            match(input,257,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__OperandAssignment_1_2"
+    // InternalFormalML.g:73619:1: rule__BitwiseXorExpression__OperandAssignment_1_2 : ( ruleBitwiseAndExpression ) ;
+    public final void rule__BitwiseXorExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73623:1: ( ( ruleBitwiseAndExpression ) )
+            // InternalFormalML.g:73624:2: ( ruleBitwiseAndExpression )
+            {
+            // InternalFormalML.g:73624:2: ( ruleBitwiseAndExpression )
+            // InternalFormalML.g:73625:3: ruleBitwiseAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__BitwiseXorExpression__OperandAssignment_1_3_1"
+    // InternalFormalML.g:73634:1: rule__BitwiseXorExpression__OperandAssignment_1_3_1 : ( ruleBitwiseAndExpression ) ;
+    public final void rule__BitwiseXorExpression__OperandAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73638:1: ( ( ruleBitwiseAndExpression ) )
+            // InternalFormalML.g:73639:2: ( ruleBitwiseAndExpression )
+            {
+            // InternalFormalML.g:73639:2: ( ruleBitwiseAndExpression )
+            // InternalFormalML.g:73640:3: ruleBitwiseAndExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleBitwiseAndExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseXorExpression__OperandAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__OperatorAssignment_1_1"
+    // InternalFormalML.g:73649:1: rule__BitwiseAndExpression__OperatorAssignment_1_1 : ( ( '&' ) ) ;
+    public final void rule__BitwiseAndExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73653:1: ( ( ( '&' ) ) )
+            // InternalFormalML.g:73654:2: ( ( '&' ) )
+            {
+            // InternalFormalML.g:73654:2: ( ( '&' ) )
+            // InternalFormalML.g:73655:3: ( '&' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0()); 
+            }
+            // InternalFormalML.g:73656:3: ( '&' )
+            // InternalFormalML.g:73657:4: '&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0()); 
+            }
+            match(input,242,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__OperandAssignment_1_2"
+    // InternalFormalML.g:73668:1: rule__BitwiseAndExpression__OperandAssignment_1_2 : ( ruleEqualityExpression ) ;
+    public final void rule__BitwiseAndExpression__OperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73672:1: ( ( ruleEqualityExpression ) )
+            // InternalFormalML.g:73673:2: ( ruleEqualityExpression )
+            {
+            // InternalFormalML.g:73673:2: ( ruleEqualityExpression )
+            // InternalFormalML.g:73674:3: ruleEqualityExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__OperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__BitwiseAndExpression__OperandAssignment_1_3_1"
+    // InternalFormalML.g:73683:1: rule__BitwiseAndExpression__OperandAssignment_1_3_1 : ( ruleEqualityExpression ) ;
+    public final void rule__BitwiseAndExpression__OperandAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73687:1: ( ( ruleEqualityExpression ) )
+            // InternalFormalML.g:73688:2: ( ruleEqualityExpression )
+            {
+            // InternalFormalML.g:73688:2: ( ruleEqualityExpression )
+            // InternalFormalML.g:73689:3: ruleEqualityExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseAndExpression__OperandAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__EqualityExpression__OperatorAssignment_1_1"
+    // InternalFormalML.g:73698:1: rule__EqualityExpression__OperatorAssignment_1_1 : ( ruleEqualityOperator ) ;
+    public final void rule__EqualityExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73702:1: ( ( ruleEqualityOperator ) )
+            // InternalFormalML.g:73703:2: ( ruleEqualityOperator )
+            {
+            // InternalFormalML.g:73703:2: ( ruleEqualityOperator )
+            // InternalFormalML.g:73704:3: ruleEqualityOperator
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getOperatorEqualityOperatorParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEqualityOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getOperatorEqualityOperatorParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__EqualityExpression__RigthOperandAssignment_1_2"
+    // InternalFormalML.g:73713:1: rule__EqualityExpression__RigthOperandAssignment_1_2 : ( ruleRelationalExpression ) ;
+    public final void rule__EqualityExpression__RigthOperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73717:1: ( ( ruleRelationalExpression ) )
+            // InternalFormalML.g:73718:2: ( ruleRelationalExpression )
+            {
+            // InternalFormalML.g:73718:2: ( ruleRelationalExpression )
+            // InternalFormalML.g:73719:3: ruleRelationalExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEqualityExpressionAccess().getRigthOperandRelationalExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEqualityExpressionAccess().getRigthOperandRelationalExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EqualityExpression__RigthOperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__RelationalExpression__OperatorAssignment_1_1"
+    // InternalFormalML.g:73728:1: rule__RelationalExpression__OperatorAssignment_1_1 : ( ruleRelationalOperator ) ;
+    public final void rule__RelationalExpression__OperatorAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73732:1: ( ( ruleRelationalOperator ) )
+            // InternalFormalML.g:73733:2: ( ruleRelationalOperator )
+            {
+            // InternalFormalML.g:73733:2: ( ruleRelationalOperator )
+            // InternalFormalML.g:73734:3: ruleRelationalOperator
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRelationalOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__OperatorAssignment_1_1"
+
+
+    // $ANTLR start "rule__RelationalExpression__RigthOperandAssignment_1_2"
+    // InternalFormalML.g:73743:1: rule__RelationalExpression__RigthOperandAssignment_1_2 : ( ruleAdditiveExpression ) ;
+    public final void rule__RelationalExpression__RigthOperandAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73747:1: ( ( ruleAdditiveExpression ) )
+            // InternalFormalML.g:73748:2: ( ruleAdditiveExpression )
+            {
+            // InternalFormalML.g:73748:2: ( ruleAdditiveExpression )
+            // InternalFormalML.g:73749:3: ruleAdditiveExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__RigthOperandAssignment_1_2"
+
+
+    // $ANTLR start "rule__RelationalExpression__RigthOperatorAssignment_1_3_1"
+    // InternalFormalML.g:73758:1: rule__RelationalExpression__RigthOperatorAssignment_1_3_1 : ( ruleRelationalOperator ) ;
+    public final void rule__RelationalExpression__RigthOperatorAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73762:1: ( ( ruleRelationalOperator ) )
+            // InternalFormalML.g:73763:2: ( ruleRelationalOperator )
+            {
+            // InternalFormalML.g:73763:2: ( ruleRelationalOperator )
+            // InternalFormalML.g:73764:3: ruleRelationalOperator
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleRelationalOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__RigthOperatorAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__RelationalExpression__RigthOperandAssignment_1_3_2"
+    // InternalFormalML.g:73773:1: rule__RelationalExpression__RigthOperandAssignment_1_3_2 : ( ruleAdditiveExpression ) ;
+    public final void rule__RelationalExpression__RigthOperandAssignment_1_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73777:1: ( ( ruleAdditiveExpression ) )
+            // InternalFormalML.g:73778:2: ( ruleAdditiveExpression )
+            {
+            // InternalFormalML.g:73778:2: ( ruleAdditiveExpression )
+            // InternalFormalML.g:73779:3: ruleAdditiveExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__RelationalExpression__RigthOperandAssignment_1_3_2"
+
+
+    // $ANTLR start "rule__AdditiveExpression__OperatorAssignment_1_0_1"
+    // InternalFormalML.g:73788:1: rule__AdditiveExpression__OperatorAssignment_1_0_1 : ( ( '+' ) ) ;
+    public final void rule__AdditiveExpression__OperatorAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73792:1: ( ( ( '+' ) ) )
+            // InternalFormalML.g:73793:2: ( ( '+' ) )
+            {
+            // InternalFormalML.g:73793:2: ( ( '+' ) )
+            // InternalFormalML.g:73794:3: ( '+' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0()); 
+            }
+            // InternalFormalML.g:73795:3: ( '+' )
+            // InternalFormalML.g:73796:4: '+'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0()); 
+            }
+            match(input,131,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__OperatorAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__OperandAssignment_1_0_2"
+    // InternalFormalML.g:73807:1: rule__AdditiveExpression__OperandAssignment_1_0_2 : ( ruleMultiplicativeExpression ) ;
+    public final void rule__AdditiveExpression__OperandAssignment_1_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73811:1: ( ( ruleMultiplicativeExpression ) )
+            // InternalFormalML.g:73812:2: ( ruleMultiplicativeExpression )
+            {
+            // InternalFormalML.g:73812:2: ( ruleMultiplicativeExpression )
+            // InternalFormalML.g:73813:3: ruleMultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__OperandAssignment_1_0_2"
+
+
+    // $ANTLR start "rule__AdditiveExpression__OperandAssignment_1_0_3_1"
+    // InternalFormalML.g:73822:1: rule__AdditiveExpression__OperandAssignment_1_0_3_1 : ( ruleMultiplicativeExpression ) ;
+    public final void rule__AdditiveExpression__OperandAssignment_1_0_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73826:1: ( ( ruleMultiplicativeExpression ) )
+            // InternalFormalML.g:73827:2: ( ruleMultiplicativeExpression )
+            {
+            // InternalFormalML.g:73827:2: ( ruleMultiplicativeExpression )
+            // InternalFormalML.g:73828:3: ruleMultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__OperandAssignment_1_0_3_1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__OperatorAssignment_1_1_1"
+    // InternalFormalML.g:73837:1: rule__AdditiveExpression__OperatorAssignment_1_1_1 : ( ( '-' ) ) ;
+    public final void rule__AdditiveExpression__OperatorAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73841:1: ( ( ( '-' ) ) )
+            // InternalFormalML.g:73842:2: ( ( '-' ) )
+            {
+            // InternalFormalML.g:73842:2: ( ( '-' ) )
+            // InternalFormalML.g:73843:3: ( '-' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0()); 
+            }
+            // InternalFormalML.g:73844:3: ( '-' )
+            // InternalFormalML.g:73845:4: '-'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0()); 
+            }
+            match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__OperatorAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__AdditiveExpression__OperandAssignment_1_1_2"
+    // InternalFormalML.g:73856:1: rule__AdditiveExpression__OperandAssignment_1_1_2 : ( ruleMultiplicativeExpression ) ;
+    public final void rule__AdditiveExpression__OperandAssignment_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73860:1: ( ( ruleMultiplicativeExpression ) )
+            // InternalFormalML.g:73861:2: ( ruleMultiplicativeExpression )
+            {
+            // InternalFormalML.g:73861:2: ( ruleMultiplicativeExpression )
+            // InternalFormalML.g:73862:3: ruleMultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__OperandAssignment_1_1_2"
+
+
+    // $ANTLR start "rule__AdditiveExpression__OperandAssignment_1_1_3_1"
+    // InternalFormalML.g:73871:1: rule__AdditiveExpression__OperandAssignment_1_1_3_1 : ( ruleMultiplicativeExpression ) ;
+    public final void rule__AdditiveExpression__OperandAssignment_1_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73875:1: ( ( ruleMultiplicativeExpression ) )
+            // InternalFormalML.g:73876:2: ( ruleMultiplicativeExpression )
+            {
+            // InternalFormalML.g:73876:2: ( ruleMultiplicativeExpression )
+            // InternalFormalML.g:73877:3: ruleMultiplicativeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__AdditiveExpression__OperandAssignment_1_1_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperatorAssignment_1_0_1"
+    // InternalFormalML.g:73886:1: rule__MultiplicativeExpression__OperatorAssignment_1_0_1 : ( ( '*' ) ) ;
+    public final void rule__MultiplicativeExpression__OperatorAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73890:1: ( ( ( '*' ) ) )
+            // InternalFormalML.g:73891:2: ( ( '*' ) )
+            {
+            // InternalFormalML.g:73891:2: ( ( '*' ) )
+            // InternalFormalML.g:73892:3: ( '*' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); 
+            }
+            // InternalFormalML.g:73893:3: ( '*' )
+            // InternalFormalML.g:73894:4: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); 
+            }
+            match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperatorAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_0_2"
+    // InternalFormalML.g:73905:1: rule__MultiplicativeExpression__OperandAssignment_1_0_2 : ( ruleUnaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73909:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:73910:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:73910:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:73911:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_0_2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_0_3_1"
+    // InternalFormalML.g:73920:1: rule__MultiplicativeExpression__OperandAssignment_1_0_3_1 : ( ruleUnaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_0_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73924:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:73925:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:73925:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:73926:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_0_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperatorAssignment_1_1_1"
+    // InternalFormalML.g:73935:1: rule__MultiplicativeExpression__OperatorAssignment_1_1_1 : ( ( '**' ) ) ;
+    public final void rule__MultiplicativeExpression__OperatorAssignment_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73939:1: ( ( ( '**' ) ) )
+            // InternalFormalML.g:73940:2: ( ( '**' ) )
+            {
+            // InternalFormalML.g:73940:2: ( ( '**' ) )
+            // InternalFormalML.g:73941:3: ( '**' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); 
+            }
+            // InternalFormalML.g:73942:3: ( '**' )
+            // InternalFormalML.g:73943:4: '**'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); 
+            }
+            match(input,258,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperatorAssignment_1_1_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_1_2"
+    // InternalFormalML.g:73954:1: rule__MultiplicativeExpression__OperandAssignment_1_1_2 : ( ruleUnaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73958:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:73959:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:73959:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:73960:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_1_2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_1_3_1"
+    // InternalFormalML.g:73969:1: rule__MultiplicativeExpression__OperandAssignment_1_1_3_1 : ( ruleUnaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73973:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:73974:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:73974:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:73975:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_1_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperatorAssignment_1_2_1"
+    // InternalFormalML.g:73984:1: rule__MultiplicativeExpression__OperatorAssignment_1_2_1 : ( ( '/' ) ) ;
+    public final void rule__MultiplicativeExpression__OperatorAssignment_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:73988:1: ( ( ( '/' ) ) )
+            // InternalFormalML.g:73989:2: ( ( '/' ) )
+            {
+            // InternalFormalML.g:73989:2: ( ( '/' ) )
+            // InternalFormalML.g:73990:3: ( '/' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); 
+            }
+            // InternalFormalML.g:73991:3: ( '/' )
+            // InternalFormalML.g:73992:4: '/'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); 
+            }
+            match(input,259,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperatorAssignment_1_2_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_2_2"
+    // InternalFormalML.g:74003:1: rule__MultiplicativeExpression__OperandAssignment_1_2_2 : ( ruleUnaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74007:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:74008:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:74008:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:74009:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_2_2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_2_3_1"
+    // InternalFormalML.g:74018:1: rule__MultiplicativeExpression__OperandAssignment_1_2_3_1 : ( ruleUnaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_2_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74022:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:74023:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:74023:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:74024:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_2_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperatorAssignment_1_3_1"
+    // InternalFormalML.g:74033:1: rule__MultiplicativeExpression__OperatorAssignment_1_3_1 : ( ( '%' ) ) ;
+    public final void rule__MultiplicativeExpression__OperatorAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74037:1: ( ( ( '%' ) ) )
+            // InternalFormalML.g:74038:2: ( ( '%' ) )
+            {
+            // InternalFormalML.g:74038:2: ( ( '%' ) )
+            // InternalFormalML.g:74039:3: ( '%' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); 
+            }
+            // InternalFormalML.g:74040:3: ( '%' )
+            // InternalFormalML.g:74041:4: '%'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); 
+            }
+            match(input,260,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperatorAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_3_2"
+    // InternalFormalML.g:74052:1: rule__MultiplicativeExpression__OperandAssignment_1_3_2 : ( ruleUnaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74056:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:74057:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:74057:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:74058:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_3_2"
+
+
+    // $ANTLR start "rule__MultiplicativeExpression__OperandAssignment_1_3_3_1"
+    // InternalFormalML.g:74067:1: rule__MultiplicativeExpression__OperandAssignment_1_3_3_1 : ( ruleUnaryExpression ) ;
+    public final void rule__MultiplicativeExpression__OperandAssignment_1_3_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74071:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:74072:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:74072:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:74073:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MultiplicativeExpression__OperandAssignment_1_3_3_1"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0"
+    // InternalFormalML.g:74082:1: rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0 : ( ruleLeftHandSideExpression ) ;
+    public final void rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74086:1: ( ( ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:74087:2: ( ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:74087:2: ( ruleLeftHandSideExpression )
+            // InternalFormalML.g:74088:3: ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPostfixExpression__LeftHandSideAssignment_0"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1"
+    // InternalFormalML.g:74097:1: rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1 : ( ruleAffixOperator ) ;
+    public final void rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74101:1: ( ( ruleAffixOperator ) )
+            // InternalFormalML.g:74102:2: ( ruleAffixOperator )
+            {
+            // InternalFormalML.g:74102:2: ( ruleAffixOperator )
+            // InternalFormalML.g:74103:3: ruleAffixOperator
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAffixOperatorParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAffixOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAffixOperatorParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPostfixExpression__OperatorAssignment_1"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0"
+    // InternalFormalML.g:74112:1: rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0 : ( ruleAffixOperator ) ;
+    public final void rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74116:1: ( ( ruleAffixOperator ) )
+            // InternalFormalML.g:74117:2: ( ruleAffixOperator )
+            {
+            // InternalFormalML.g:74117:2: ( ruleAffixOperator )
+            // InternalFormalML.g:74118:3: ruleAffixOperator
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAffixOperatorParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleAffixOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAffixOperatorParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPrefixExpression__OperatorAssignment_0"
+
+
+    // $ANTLR start "rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1"
+    // InternalFormalML.g:74127:1: rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1 : ( ruleLeftHandSideExpression ) ;
+    public final void rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74131:1: ( ( ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:74132:2: ( ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:74132:2: ( ruleLeftHandSideExpression )
+            // InternalFormalML.g:74133:3: ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__IncrementOrDecrementPrefixExpression__LeftHandSideAssignment_1"
+
+
+    // $ANTLR start "rule__NewfreshExpression__LeftHandSideAssignment_0_1"
+    // InternalFormalML.g:74142:1: rule__NewfreshExpression__LeftHandSideAssignment_0_1 : ( ruleLeftHandSideExpression ) ;
+    public final void rule__NewfreshExpression__LeftHandSideAssignment_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74146:1: ( ( ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:74147:2: ( ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:74147:2: ( ruleLeftHandSideExpression )
+            // InternalFormalML.g:74148:3: ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__LeftHandSideAssignment_0_1"
+
+
+    // $ANTLR start "rule__NewfreshExpression__LeftHandSideAssignment_1_1"
+    // InternalFormalML.g:74157:1: rule__NewfreshExpression__LeftHandSideAssignment_1_1 : ( ruleLeftHandSideExpression ) ;
+    public final void rule__NewfreshExpression__LeftHandSideAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74161:1: ( ( ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:74162:2: ( ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:74162:2: ( ruleLeftHandSideExpression )
+            // InternalFormalML.g:74163:3: ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NewfreshExpression__LeftHandSideAssignment_1_1"
+
+
+    // $ANTLR start "rule__CastExpression__DatatypeAssignment_2"
+    // InternalFormalML.g:74172:1: rule__CastExpression__DatatypeAssignment_2 : ( ( ruleESUfid ) ) ;
+    public final void rule__CastExpression__DatatypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74176:1: ( ( ( ruleESUfid ) ) )
+            // InternalFormalML.g:74177:2: ( ( ruleESUfid ) )
+            {
+            // InternalFormalML.g:74177:2: ( ( ruleESUfid ) )
+            // InternalFormalML.g:74178:3: ( ruleESUfid )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeCrossReference_2_0()); 
+            }
+            // InternalFormalML.g:74179:3: ( ruleESUfid )
+            // InternalFormalML.g:74180:4: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeESUfidParserRuleCall_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeESUfidParserRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__DatatypeAssignment_2"
+
+
+    // $ANTLR start "rule__CastExpression__OperandAssignment_5"
+    // InternalFormalML.g:74191:1: rule__CastExpression__OperandAssignment_5 : ( ruleExpression ) ;
+    public final void rule__CastExpression__OperandAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74195:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:74196:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:74196:2: ( ruleExpression )
+            // InternalFormalML.g:74197:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getCastExpressionAccess().getOperandExpressionParserRuleCall_5_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getCastExpressionAccess().getOperandExpressionParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__CastExpression__OperandAssignment_5"
+
+
+    // $ANTLR start "rule__ArithmeticUnaryExpression__OperatorAssignment_0"
+    // InternalFormalML.g:74206:1: rule__ArithmeticUnaryExpression__OperatorAssignment_0 : ( ruleArithmeticUnaryOperator ) ;
+    public final void rule__ArithmeticUnaryExpression__OperatorAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74210:1: ( ( ruleArithmeticUnaryOperator ) )
+            // InternalFormalML.g:74211:2: ( ruleArithmeticUnaryOperator )
+            {
+            // InternalFormalML.g:74211:2: ( ruleArithmeticUnaryOperator )
+            // InternalFormalML.g:74212:3: ruleArithmeticUnaryOperator
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorArithmeticUnaryOperatorParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleArithmeticUnaryOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorArithmeticUnaryOperatorParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArithmeticUnaryExpression__OperatorAssignment_0"
+
+
+    // $ANTLR start "rule__ArithmeticUnaryExpression__OperandAssignment_1"
+    // InternalFormalML.g:74221:1: rule__ArithmeticUnaryExpression__OperandAssignment_1 : ( ruleUnaryExpression ) ;
+    public final void rule__ArithmeticUnaryExpression__OperandAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74225:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:74226:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:74226:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:74227:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArithmeticUnaryExpression__OperandAssignment_1"
+
+
+    // $ANTLR start "rule__LogicalUnaryExpression__OperatorAssignment_0"
+    // InternalFormalML.g:74236:1: rule__LogicalUnaryExpression__OperatorAssignment_0 : ( ( rule__LogicalUnaryExpression__OperatorAlternatives_0_0 ) ) ;
+    public final void rule__LogicalUnaryExpression__OperatorAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74240:1: ( ( ( rule__LogicalUnaryExpression__OperatorAlternatives_0_0 ) ) )
+            // InternalFormalML.g:74241:2: ( ( rule__LogicalUnaryExpression__OperatorAlternatives_0_0 ) )
+            {
+            // InternalFormalML.g:74241:2: ( ( rule__LogicalUnaryExpression__OperatorAlternatives_0_0 ) )
+            // InternalFormalML.g:74242:3: ( rule__LogicalUnaryExpression__OperatorAlternatives_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAlternatives_0_0()); 
+            }
+            // InternalFormalML.g:74243:3: ( rule__LogicalUnaryExpression__OperatorAlternatives_0_0 )
+            // InternalFormalML.g:74243:4: rule__LogicalUnaryExpression__OperatorAlternatives_0_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__LogicalUnaryExpression__OperatorAlternatives_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalUnaryExpressionAccess().getOperatorAlternatives_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalUnaryExpression__OperatorAssignment_0"
+
+
+    // $ANTLR start "rule__LogicalUnaryExpression__OperandAssignment_1"
+    // InternalFormalML.g:74251:1: rule__LogicalUnaryExpression__OperandAssignment_1 : ( ruleUnaryExpression ) ;
+    public final void rule__LogicalUnaryExpression__OperandAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74255:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:74256:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:74256:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:74257:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLogicalUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLogicalUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LogicalUnaryExpression__OperandAssignment_1"
+
+
+    // $ANTLR start "rule__BitwiseUnaryExpression__OperatorAssignment_0"
+    // InternalFormalML.g:74266:1: rule__BitwiseUnaryExpression__OperatorAssignment_0 : ( ( '~' ) ) ;
+    public final void rule__BitwiseUnaryExpression__OperatorAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74270:1: ( ( ( '~' ) ) )
+            // InternalFormalML.g:74271:2: ( ( '~' ) )
+            {
+            // InternalFormalML.g:74271:2: ( ( '~' ) )
+            // InternalFormalML.g:74272:3: ( '~' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0()); 
+            }
+            // InternalFormalML.g:74273:3: ( '~' )
+            // InternalFormalML.g:74274:4: '~'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0()); 
+            }
+            match(input,287,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseUnaryExpression__OperatorAssignment_0"
+
+
+    // $ANTLR start "rule__BitwiseUnaryExpression__OperandAssignment_1"
+    // InternalFormalML.g:74285:1: rule__BitwiseUnaryExpression__OperandAssignment_1 : ( ruleUnaryExpression ) ;
+    public final void rule__BitwiseUnaryExpression__OperandAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74289:1: ( ( ruleUnaryExpression ) )
+            // InternalFormalML.g:74290:2: ( ruleUnaryExpression )
+            {
+            // InternalFormalML.g:74290:2: ( ruleUnaryExpression )
+            // InternalFormalML.g:74291:3: ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__BitwiseUnaryExpression__OperandAssignment_1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__ElementAssignment_1_2"
+    // InternalFormalML.g:74300:1: rule__PrimaryExpression__ElementAssignment_1_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__PrimaryExpression__ElementAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74304:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:74305:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:74305:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:74306:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_1_2_0()); 
+            }
+            // InternalFormalML.g:74307:3: ( ruleESIdentifier )
+            // InternalFormalML.g:74308:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__ElementAssignment_1_2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__KindAssignment_1_3_0_0"
+    // InternalFormalML.g:74319:1: rule__PrimaryExpression__KindAssignment_1_3_0_0 : ( ruleValueIndexExpressionKind ) ;
+    public final void rule__PrimaryExpression__KindAssignment_1_3_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74323:1: ( ( ruleValueIndexExpressionKind ) )
+            // InternalFormalML.g:74324:2: ( ruleValueIndexExpressionKind )
+            {
+            // InternalFormalML.g:74324:2: ( ruleValueIndexExpressionKind )
+            // InternalFormalML.g:74325:3: ruleValueIndexExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueIndexExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__KindAssignment_1_3_0_0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__ArgAssignment_1_3_0_1"
+    // InternalFormalML.g:74334:1: rule__PrimaryExpression__ArgAssignment_1_3_0_1 : ( rulePositionalTupleExpressionList ) ;
+    public final void rule__PrimaryExpression__ArgAssignment_1_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74338:1: ( ( rulePositionalTupleExpressionList ) )
+            // InternalFormalML.g:74339:2: ( rulePositionalTupleExpressionList )
+            {
+            // InternalFormalML.g:74339:2: ( rulePositionalTupleExpressionList )
+            // InternalFormalML.g:74340:3: rulePositionalTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePositionalTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__ArgAssignment_1_3_0_1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__KindAssignment_1_3_1_0"
+    // InternalFormalML.g:74349:1: rule__PrimaryExpression__KindAssignment_1_3_1_0 : ( ruleValueParameterExpressionKind ) ;
+    public final void rule__PrimaryExpression__KindAssignment_1_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74353:1: ( ( ruleValueParameterExpressionKind ) )
+            // InternalFormalML.g:74354:2: ( ruleValueParameterExpressionKind )
+            {
+            // InternalFormalML.g:74354:2: ( ruleValueParameterExpressionKind )
+            // InternalFormalML.g:74355:3: ruleValueParameterExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueParameterExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__KindAssignment_1_3_1_0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__ArgAssignment_1_3_1_1"
+    // InternalFormalML.g:74364:1: rule__PrimaryExpression__ArgAssignment_1_3_1_1 : ( ruleMixTupleExpressionList ) ;
+    public final void rule__PrimaryExpression__ArgAssignment_1_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74368:1: ( ( ruleMixTupleExpressionList ) )
+            // InternalFormalML.g:74369:2: ( ruleMixTupleExpressionList )
+            {
+            // InternalFormalML.g:74369:2: ( ruleMixTupleExpressionList )
+            // InternalFormalML.g:74370:3: ruleMixTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__ArgAssignment_1_3_1_1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__ElementAssignment_2_2"
+    // InternalFormalML.g:74379:1: rule__PrimaryExpression__ElementAssignment_2_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__PrimaryExpression__ElementAssignment_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74383:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:74384:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:74384:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:74385:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_2_0()); 
+            }
+            // InternalFormalML.g:74386:3: ( ruleESIdentifier )
+            // InternalFormalML.g:74387:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__ElementAssignment_2_2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__KindAssignment_2_3_0_0"
+    // InternalFormalML.g:74398:1: rule__PrimaryExpression__KindAssignment_2_3_0_0 : ( ruleValueIndexExpressionKind ) ;
+    public final void rule__PrimaryExpression__KindAssignment_2_3_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74402:1: ( ( ruleValueIndexExpressionKind ) )
+            // InternalFormalML.g:74403:2: ( ruleValueIndexExpressionKind )
+            {
+            // InternalFormalML.g:74403:2: ( ruleValueIndexExpressionKind )
+            // InternalFormalML.g:74404:3: ruleValueIndexExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueIndexExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__KindAssignment_2_3_0_0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__ArgAssignment_2_3_0_1"
+    // InternalFormalML.g:74413:1: rule__PrimaryExpression__ArgAssignment_2_3_0_1 : ( rulePositionalTupleExpressionList ) ;
+    public final void rule__PrimaryExpression__ArgAssignment_2_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74417:1: ( ( rulePositionalTupleExpressionList ) )
+            // InternalFormalML.g:74418:2: ( rulePositionalTupleExpressionList )
+            {
+            // InternalFormalML.g:74418:2: ( rulePositionalTupleExpressionList )
+            // InternalFormalML.g:74419:3: rulePositionalTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePositionalTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__ArgAssignment_2_3_0_1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__KindAssignment_2_3_1_0"
+    // InternalFormalML.g:74428:1: rule__PrimaryExpression__KindAssignment_2_3_1_0 : ( ruleValueParameterExpressionKind ) ;
+    public final void rule__PrimaryExpression__KindAssignment_2_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74432:1: ( ( ruleValueParameterExpressionKind ) )
+            // InternalFormalML.g:74433:2: ( ruleValueParameterExpressionKind )
+            {
+            // InternalFormalML.g:74433:2: ( ruleValueParameterExpressionKind )
+            // InternalFormalML.g:74434:3: ruleValueParameterExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueParameterExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__KindAssignment_2_3_1_0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__ArgAssignment_2_3_1_1"
+    // InternalFormalML.g:74443:1: rule__PrimaryExpression__ArgAssignment_2_3_1_1 : ( ruleMixTupleExpressionList ) ;
+    public final void rule__PrimaryExpression__ArgAssignment_2_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74447:1: ( ( ruleMixTupleExpressionList ) )
+            // InternalFormalML.g:74448:2: ( ruleMixTupleExpressionList )
+            {
+            // InternalFormalML.g:74448:2: ( ruleMixTupleExpressionList )
+            // InternalFormalML.g:74449:3: ruleMixTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__ArgAssignment_2_3_1_1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__ElementAssignment_2_4_2"
+    // InternalFormalML.g:74458:1: rule__PrimaryExpression__ElementAssignment_2_4_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__PrimaryExpression__ElementAssignment_2_4_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74462:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:74463:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:74463:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:74464:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_4_2_0()); 
+            }
+            // InternalFormalML.g:74465:3: ( ruleESIdentifier )
+            // InternalFormalML.g:74466:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__ElementAssignment_2_4_2"
+
+
+    // $ANTLR start "rule__PrimaryExpression__KindAssignment_2_4_3_0_0"
+    // InternalFormalML.g:74477:1: rule__PrimaryExpression__KindAssignment_2_4_3_0_0 : ( ruleValueIndexExpressionKind ) ;
+    public final void rule__PrimaryExpression__KindAssignment_2_4_3_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74481:1: ( ( ruleValueIndexExpressionKind ) )
+            // InternalFormalML.g:74482:2: ( ruleValueIndexExpressionKind )
+            {
+            // InternalFormalML.g:74482:2: ( ruleValueIndexExpressionKind )
+            // InternalFormalML.g:74483:3: ruleValueIndexExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueIndexExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__KindAssignment_2_4_3_0_0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__ArgAssignment_2_4_3_0_1"
+    // InternalFormalML.g:74492:1: rule__PrimaryExpression__ArgAssignment_2_4_3_0_1 : ( rulePositionalTupleExpressionList ) ;
+    public final void rule__PrimaryExpression__ArgAssignment_2_4_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74496:1: ( ( rulePositionalTupleExpressionList ) )
+            // InternalFormalML.g:74497:2: ( rulePositionalTupleExpressionList )
+            {
+            // InternalFormalML.g:74497:2: ( rulePositionalTupleExpressionList )
+            // InternalFormalML.g:74498:3: rulePositionalTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePositionalTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__ArgAssignment_2_4_3_0_1"
+
+
+    // $ANTLR start "rule__PrimaryExpression__KindAssignment_2_4_3_1_0"
+    // InternalFormalML.g:74507:1: rule__PrimaryExpression__KindAssignment_2_4_3_1_0 : ( ruleValueParameterExpressionKind ) ;
+    public final void rule__PrimaryExpression__KindAssignment_2_4_3_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74511:1: ( ( ruleValueParameterExpressionKind ) )
+            // InternalFormalML.g:74512:2: ( ruleValueParameterExpressionKind )
+            {
+            // InternalFormalML.g:74512:2: ( ruleValueParameterExpressionKind )
+            // InternalFormalML.g:74513:3: ruleValueParameterExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueParameterExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__KindAssignment_2_4_3_1_0"
+
+
+    // $ANTLR start "rule__PrimaryExpression__ArgAssignment_2_4_3_1_1"
+    // InternalFormalML.g:74522:1: rule__PrimaryExpression__ArgAssignment_2_4_3_1_1 : ( ruleMixTupleExpressionList ) ;
+    public final void rule__PrimaryExpression__ArgAssignment_2_4_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74526:1: ( ( ruleMixTupleExpressionList ) )
+            // InternalFormalML.g:74527:2: ( ruleMixTupleExpressionList )
+            {
+            // InternalFormalML.g:74527:2: ( ruleMixTupleExpressionList )
+            // InternalFormalML.g:74528:3: ruleMixTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PrimaryExpression__ArgAssignment_2_4_3_1_1"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__ArgsAssignment_2"
+    // InternalFormalML.g:74537:1: rule__InvokeExpressionDeprecated__ArgsAssignment_2 : ( ruleExpression ) ;
+    public final void rule__InvokeExpressionDeprecated__ArgsAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74541:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:74542:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:74542:2: ( ruleExpression )
+            // InternalFormalML.g:74543:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__ArgsAssignment_2"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__InvokeAssignment_3"
+    // InternalFormalML.g:74552:1: rule__InvokeExpressionDeprecated__InvokeAssignment_3 : ( ruleLiteralReferenceElement ) ;
+    public final void rule__InvokeExpressionDeprecated__InvokeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74556:1: ( ( ruleLiteralReferenceElement ) )
+            // InternalFormalML.g:74557:2: ( ruleLiteralReferenceElement )
+            {
+            // InternalFormalML.g:74557:2: ( ruleLiteralReferenceElement )
+            // InternalFormalML.g:74558:3: ruleLiteralReferenceElement
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeLiteralReferenceElementParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleLiteralReferenceElement();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeLiteralReferenceElementParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__InvokeAssignment_3"
+
+
+    // $ANTLR start "rule__InvokeExpressionDeprecated__ArgsAssignment_4"
+    // InternalFormalML.g:74567:1: rule__InvokeExpressionDeprecated__ArgsAssignment_4 : ( ruleExpression ) ;
+    public final void rule__InvokeExpressionDeprecated__ArgsAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74571:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:74572:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:74572:2: ( ruleExpression )
+            // InternalFormalML.g:74573:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_4_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InvokeExpressionDeprecated__ArgsAssignment_4"
+
+
+    // $ANTLR start "rule__InstantiationExpression__InstanceAssignment_1"
+    // InternalFormalML.g:74582:1: rule__InstantiationExpression__InstanceAssignment_1 : ( ruleDynamicInstanceSpecification ) ;
+    public final void rule__InstantiationExpression__InstanceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74586:1: ( ( ruleDynamicInstanceSpecification ) )
+            // InternalFormalML.g:74587:2: ( ruleDynamicInstanceSpecification )
+            {
+            // InternalFormalML.g:74587:2: ( ruleDynamicInstanceSpecification )
+            // InternalFormalML.g:74588:3: ruleDynamicInstanceSpecification
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInstantiationExpressionAccess().getInstanceDynamicInstanceSpecificationParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDynamicInstanceSpecification();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInstantiationExpressionAccess().getInstanceDynamicInstanceSpecificationParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__InstantiationExpression__InstanceAssignment_1"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__ModelAssignment_2"
+    // InternalFormalML.g:74597:1: rule__DynamicInstanceSpecification__ModelAssignment_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__DynamicInstanceSpecification__ModelAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74601:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:74602:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:74602:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:74603:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineCrossReference_2_0()); 
+            }
+            // InternalFormalML.g:74604:3: ( ruleESIdentifier )
+            // InternalFormalML.g:74605:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineESIdentifierParserRuleCall_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineESIdentifierParserRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__ModelAssignment_2"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0"
+    // InternalFormalML.g:74616:1: rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0 : ( ruleSlotParameter ) ;
+    public final void rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74620:1: ( ( ruleSlotParameter ) )
+            // InternalFormalML.g:74621:2: ( ruleSlotParameter )
+            {
+            // InternalFormalML.g:74621:2: ( ruleSlotParameter )
+            // InternalFormalML.g:74622:3: ruleSlotParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSlotParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_0"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1"
+    // InternalFormalML.g:74631:1: rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1 : ( ruleSlotParameter ) ;
+    public final void rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74635:1: ( ( ruleSlotParameter ) )
+            // InternalFormalML.g:74636:2: ( ruleSlotParameter )
+            {
+            // InternalFormalML.g:74636:2: ( ruleSlotParameter )
+            // InternalFormalML.g:74637:3: ruleSlotParameter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSlotParameter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__SlotAssignment_3_0_1_1_1"
+
+
+    // $ANTLR start "rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0"
+    // InternalFormalML.g:74646:1: rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0 : ( ruleSlotProperty ) ;
+    public final void rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74650:1: ( ( ruleSlotProperty ) )
+            // InternalFormalML.g:74651:2: ( ruleSlotProperty )
+            {
+            // InternalFormalML.g:74651:2: ( ruleSlotProperty )
+            // InternalFormalML.g:74652:3: ruleSlotProperty
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotPropertyParserRuleCall_3_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleSlotProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotPropertyParserRuleCall_3_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DynamicInstanceSpecification__SlotAssignment_3_1_1_0"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__ValueAssignment_1"
+    // InternalFormalML.g:74661:1: rule__MixTupleExpressionList__ValueAssignment_1 : ( ( rule__MixTupleExpressionList__ValueAlternatives_1_0 ) ) ;
+    public final void rule__MixTupleExpressionList__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74665:1: ( ( ( rule__MixTupleExpressionList__ValueAlternatives_1_0 ) ) )
+            // InternalFormalML.g:74666:2: ( ( rule__MixTupleExpressionList__ValueAlternatives_1_0 ) )
+            {
+            // InternalFormalML.g:74666:2: ( ( rule__MixTupleExpressionList__ValueAlternatives_1_0 ) )
+            // InternalFormalML.g:74667:3: ( rule__MixTupleExpressionList__ValueAlternatives_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_1_0()); 
+            }
+            // InternalFormalML.g:74668:3: ( rule__MixTupleExpressionList__ValueAlternatives_1_0 )
+            // InternalFormalML.g:74668:4: rule__MixTupleExpressionList__ValueAlternatives_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__ValueAlternatives_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__MixTupleExpressionList__ValueAssignment_2_1"
+    // InternalFormalML.g:74676:1: rule__MixTupleExpressionList__ValueAssignment_2_1 : ( ( rule__MixTupleExpressionList__ValueAlternatives_2_1_0 ) ) ;
+    public final void rule__MixTupleExpressionList__ValueAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74680:1: ( ( ( rule__MixTupleExpressionList__ValueAlternatives_2_1_0 ) ) )
+            // InternalFormalML.g:74681:2: ( ( rule__MixTupleExpressionList__ValueAlternatives_2_1_0 ) )
+            {
+            // InternalFormalML.g:74681:2: ( ( rule__MixTupleExpressionList__ValueAlternatives_2_1_0 ) )
+            // InternalFormalML.g:74682:3: ( rule__MixTupleExpressionList__ValueAlternatives_2_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_2_1_0()); 
+            }
+            // InternalFormalML.g:74683:3: ( rule__MixTupleExpressionList__ValueAlternatives_2_1_0 )
+            // InternalFormalML.g:74683:4: rule__MixTupleExpressionList__ValueAlternatives_2_1_0
+            {
+            pushFollow(FollowSets000.FOLLOW_2);
+            rule__MixTupleExpressionList__ValueAlternatives_2_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getMixTupleExpressionListAccess().getValueAlternatives_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__MixTupleExpressionList__ValueAssignment_2_1"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__ValueAssignment_0"
+    // InternalFormalML.g:74691:1: rule__PositionalTupleExpressionList__ValueAssignment_0 : ( ruleExpression ) ;
+    public final void rule__PositionalTupleExpressionList__ValueAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74695:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:74696:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:74696:2: ( ruleExpression )
+            // InternalFormalML.g:74697:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__ValueAssignment_0"
+
+
+    // $ANTLR start "rule__PositionalTupleExpressionList__ValueAssignment_1_1"
+    // InternalFormalML.g:74706:1: rule__PositionalTupleExpressionList__ValueAssignment_1_1 : ( ruleExpression ) ;
+    public final void rule__PositionalTupleExpressionList__ValueAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74710:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:74711:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:74711:2: ( ruleExpression )
+            // InternalFormalML.g:74712:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PositionalTupleExpressionList__ValueAssignment_1_1"
+
+
+    // $ANTLR start "rule__NamedExpression__NameAssignment_0"
+    // InternalFormalML.g:74721:1: rule__NamedExpression__NameAssignment_0 : ( RULE_XLIA_ID ) ;
+    public final void rule__NamedExpression__NameAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74725:1: ( ( RULE_XLIA_ID ) )
+            // InternalFormalML.g:74726:2: ( RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:74726:2: ( RULE_XLIA_ID )
+            // InternalFormalML.g:74727:3: RULE_XLIA_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNamedExpressionAccess().getNameXLIA_IDTerminalRuleCall_0_0()); 
+            }
+            match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNamedExpressionAccess().getNameXLIA_IDTerminalRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NamedExpression__NameAssignment_0"
+
+
+    // $ANTLR start "rule__NamedExpression__ExpressionAssignment_2"
+    // InternalFormalML.g:74736:1: rule__NamedExpression__ExpressionAssignment_2 : ( ruleExpression ) ;
+    public final void rule__NamedExpression__ExpressionAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74740:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:74741:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:74741:2: ( ruleExpression )
+            // InternalFormalML.g:74742:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNamedExpressionAccess().getExpressionExpressionParserRuleCall_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNamedExpressionAccess().getExpressionExpressionParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NamedExpression__ExpressionAssignment_2"
+
+
+    // $ANTLR start "rule__LiteralBooleanExpression__ValueAssignment_1"
+    // InternalFormalML.g:74751:1: rule__LiteralBooleanExpression__ValueAssignment_1 : ( ruleEBoolean ) ;
+    public final void rule__LiteralBooleanExpression__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74755:1: ( ( ruleEBoolean ) )
+            // InternalFormalML.g:74756:2: ( ruleEBoolean )
+            {
+            // InternalFormalML.g:74756:2: ( ruleEBoolean )
+            // InternalFormalML.g:74757:3: ruleEBoolean
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralBooleanExpressionAccess().getValueEBooleanParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEBoolean();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralBooleanExpressionAccess().getValueEBooleanParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralBooleanExpression__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralIntegerExpression__ValueAssignment_1"
+    // InternalFormalML.g:74766:1: rule__LiteralIntegerExpression__ValueAssignment_1 : ( ruleEInteger ) ;
+    public final void rule__LiteralIntegerExpression__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74770:1: ( ( ruleEInteger ) )
+            // InternalFormalML.g:74771:2: ( ruleEInteger )
+            {
+            // InternalFormalML.g:74771:2: ( ruleEInteger )
+            // InternalFormalML.g:74772:3: ruleEInteger
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralIntegerExpressionAccess().getValueEIntegerParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInteger();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralIntegerExpressionAccess().getValueEIntegerParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralIntegerExpression__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__NumeratorAssignment_1"
+    // InternalFormalML.g:74781:1: rule__LiteralRationalExpression__NumeratorAssignment_1 : ( ruleEInteger ) ;
+    public final void rule__LiteralRationalExpression__NumeratorAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74785:1: ( ( ruleEInteger ) )
+            // InternalFormalML.g:74786:2: ( ruleEInteger )
+            {
+            // InternalFormalML.g:74786:2: ( ruleEInteger )
+            // InternalFormalML.g:74787:3: ruleEInteger
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorEIntegerParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInteger();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorEIntegerParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__NumeratorAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralRationalExpression__DenominatorAssignment_3"
+    // InternalFormalML.g:74796:1: rule__LiteralRationalExpression__DenominatorAssignment_3 : ( ruleEInteger ) ;
+    public final void rule__LiteralRationalExpression__DenominatorAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74800:1: ( ( ruleEInteger ) )
+            // InternalFormalML.g:74801:2: ( ruleEInteger )
+            {
+            // InternalFormalML.g:74801:2: ( ruleEInteger )
+            // InternalFormalML.g:74802:3: ruleEInteger
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorEIntegerParserRuleCall_3_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEInteger();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorEIntegerParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralRationalExpression__DenominatorAssignment_3"
+
+
+    // $ANTLR start "rule__LiteralFloatExpression__ValueAssignment_1"
+    // InternalFormalML.g:74811:1: rule__LiteralFloatExpression__ValueAssignment_1 : ( ruleEDouble ) ;
+    public final void rule__LiteralFloatExpression__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74815:1: ( ( ruleEDouble ) )
+            // InternalFormalML.g:74816:2: ( ruleEDouble )
+            {
+            // InternalFormalML.g:74816:2: ( ruleEDouble )
+            // InternalFormalML.g:74817:3: ruleEDouble
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralFloatExpressionAccess().getValueEDoubleParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralFloatExpressionAccess().getValueEDoubleParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralFloatExpression__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralCharacterExpression__ValueAssignment_1"
+    // InternalFormalML.g:74826:1: rule__LiteralCharacterExpression__ValueAssignment_1 : ( ruleECharacter ) ;
+    public final void rule__LiteralCharacterExpression__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74830:1: ( ( ruleECharacter ) )
+            // InternalFormalML.g:74831:2: ( ruleECharacter )
+            {
+            // InternalFormalML.g:74831:2: ( ruleECharacter )
+            // InternalFormalML.g:74832:3: ruleECharacter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCharacterExpressionAccess().getValueECharacterParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleECharacter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCharacterExpressionAccess().getValueECharacterParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCharacterExpression__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralStringExpression__ValueAssignment_1"
+    // InternalFormalML.g:74841:1: rule__LiteralStringExpression__ValueAssignment_1 : ( ruleEString ) ;
+    public final void rule__LiteralStringExpression__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74845:1: ( ( ruleEString ) )
+            // InternalFormalML.g:74846:2: ( ruleEString )
+            {
+            // InternalFormalML.g:74846:2: ( ruleEString )
+            // InternalFormalML.g:74847:3: ruleEString
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralStringExpressionAccess().getValueEStringParserRuleCall_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleEString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralStringExpressionAccess().getValueEStringParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralStringExpression__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralNullExpression__TypeAssignment_1_2"
+    // InternalFormalML.g:74856:1: rule__LiteralNullExpression__TypeAssignment_1_2 : ( ruleDataType ) ;
+    public final void rule__LiteralNullExpression__TypeAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74860:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:74861:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:74861:2: ( ruleDataType )
+            // InternalFormalML.g:74862:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralNullExpressionAccess().getTypeDataTypeParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralNullExpressionAccess().getTypeDataTypeParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralNullExpression__TypeAssignment_1_2"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__DatatypeAssignment_1_1"
+    // InternalFormalML.g:74871:1: rule__LiteralCollectionExpression__DatatypeAssignment_1_1 : ( ruleDataType ) ;
+    public final void rule__LiteralCollectionExpression__DatatypeAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74875:1: ( ( ruleDataType ) )
+            // InternalFormalML.g:74876:2: ( ruleDataType )
+            {
+            // InternalFormalML.g:74876:2: ( ruleDataType )
+            // InternalFormalML.g:74877:3: ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeDataTypeParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeDataTypeParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__DatatypeAssignment_1_1"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__ValueAssignment_3_0_0"
+    // InternalFormalML.g:74886:1: rule__LiteralCollectionExpression__ValueAssignment_3_0_0 : ( ruleExpression ) ;
+    public final void rule__LiteralCollectionExpression__ValueAssignment_3_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74890:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:74891:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:74891:2: ( ruleExpression )
+            // InternalFormalML.g:74892:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__ValueAssignment_3_0_0"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__ValueAssignment_3_0_1"
+    // InternalFormalML.g:74901:1: rule__LiteralCollectionExpression__ValueAssignment_3_0_1 : ( ruleNamedExpression ) ;
+    public final void rule__LiteralCollectionExpression__ValueAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74905:1: ( ( ruleNamedExpression ) )
+            // InternalFormalML.g:74906:2: ( ruleNamedExpression )
+            {
+            // InternalFormalML.g:74906:2: ( ruleNamedExpression )
+            // InternalFormalML.g:74907:3: ruleNamedExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleNamedExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__ValueAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0"
+    // InternalFormalML.g:74916:1: rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0 : ( ruleExpression ) ;
+    public final void rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74920:1: ( ( ruleExpression ) )
+            // InternalFormalML.g:74921:2: ( ruleExpression )
+            {
+            // InternalFormalML.g:74921:2: ( ruleExpression )
+            // InternalFormalML.g:74922:3: ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_1_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_1_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__ValueAssignment_3_1_1_0"
+
+
+    // $ANTLR start "rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1"
+    // InternalFormalML.g:74931:1: rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1 : ( ruleNamedExpression ) ;
+    public final void rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74935:1: ( ( ruleNamedExpression ) )
+            // InternalFormalML.g:74936:2: ( ruleNamedExpression )
+            {
+            // InternalFormalML.g:74936:2: ( ruleNamedExpression )
+            // InternalFormalML.g:74937:3: ruleNamedExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_1_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleNamedExpression();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralCollectionExpression__ValueAssignment_3_1_1_1"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__ValueAssignment_1"
+    // InternalFormalML.g:74946:1: rule__LiteralReferenceElement__ValueAssignment_1 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__LiteralReferenceElement__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74950:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:74951:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:74951:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:74952:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementCrossReference_1_0()); 
+            }
+            // InternalFormalML.g:74953:3: ( ruleESIdentifier )
+            // InternalFormalML.g:74954:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementESIdentifierParserRuleCall_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementESIdentifierParserRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__KindAssignment_2_0_0"
+    // InternalFormalML.g:74965:1: rule__LiteralReferenceElement__KindAssignment_2_0_0 : ( ruleValueIndexExpressionKind ) ;
+    public final void rule__LiteralReferenceElement__KindAssignment_2_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74969:1: ( ( ruleValueIndexExpressionKind ) )
+            // InternalFormalML.g:74970:2: ( ruleValueIndexExpressionKind )
+            {
+            // InternalFormalML.g:74970:2: ( ruleValueIndexExpressionKind )
+            // InternalFormalML.g:74971:3: ruleValueIndexExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getKindValueIndexExpressionKindEnumRuleCall_2_0_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueIndexExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getKindValueIndexExpressionKindEnumRuleCall_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__KindAssignment_2_0_0"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__ArgAssignment_2_0_1"
+    // InternalFormalML.g:74980:1: rule__LiteralReferenceElement__ArgAssignment_2_0_1 : ( rulePositionalTupleExpressionList ) ;
+    public final void rule__LiteralReferenceElement__ArgAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74984:1: ( ( rulePositionalTupleExpressionList ) )
+            // InternalFormalML.g:74985:2: ( rulePositionalTupleExpressionList )
+            {
+            // InternalFormalML.g:74985:2: ( rulePositionalTupleExpressionList )
+            // InternalFormalML.g:74986:3: rulePositionalTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getArgPositionalTupleExpressionListParserRuleCall_2_0_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePositionalTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getArgPositionalTupleExpressionListParserRuleCall_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__ArgAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__KindAssignment_2_1_0"
+    // InternalFormalML.g:74995:1: rule__LiteralReferenceElement__KindAssignment_2_1_0 : ( ruleValueParameterExpressionKind ) ;
+    public final void rule__LiteralReferenceElement__KindAssignment_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:74999:1: ( ( ruleValueParameterExpressionKind ) )
+            // InternalFormalML.g:75000:2: ( ruleValueParameterExpressionKind )
+            {
+            // InternalFormalML.g:75000:2: ( ruleValueParameterExpressionKind )
+            // InternalFormalML.g:75001:3: ruleValueParameterExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getKindValueParameterExpressionKindEnumRuleCall_2_1_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueParameterExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getKindValueParameterExpressionKindEnumRuleCall_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__KindAssignment_2_1_0"
+
+
+    // $ANTLR start "rule__LiteralReferenceElement__ArgAssignment_2_1_1"
+    // InternalFormalML.g:75010:1: rule__LiteralReferenceElement__ArgAssignment_2_1_1 : ( ruleMixTupleExpressionList ) ;
+    public final void rule__LiteralReferenceElement__ArgAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75014:1: ( ( ruleMixTupleExpressionList ) )
+            // InternalFormalML.g:75015:2: ( ruleMixTupleExpressionList )
+            {
+            // InternalFormalML.g:75015:2: ( ruleMixTupleExpressionList )
+            // InternalFormalML.g:75016:3: ruleMixTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralReferenceElementAccess().getArgMixTupleExpressionListParserRuleCall_2_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralReferenceElementAccess().getArgMixTupleExpressionListParserRuleCall_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralReferenceElement__ArgAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__LiteralPureReferenceElement__ValueAssignment_1"
+    // InternalFormalML.g:75025:1: rule__LiteralPureReferenceElement__ValueAssignment_1 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__LiteralPureReferenceElement__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75029:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:75030:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:75030:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:75031:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementCrossReference_1_0()); 
+            }
+            // InternalFormalML.g:75032:3: ( ruleESIdentifier )
+            // InternalFormalML.g:75033:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementESIdentifierParserRuleCall_1_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementESIdentifierParserRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LiteralPureReferenceElement__ValueAssignment_1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__ElementAssignment_1_2"
+    // InternalFormalML.g:75044:1: rule__ValueSelectionExpression__ElementAssignment_1_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__ValueSelectionExpression__ElementAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75048:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:75049:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:75049:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:75050:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_1_2_0()); 
+            }
+            // InternalFormalML.g:75051:3: ( ruleESIdentifier )
+            // InternalFormalML.g:75052:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__ElementAssignment_1_2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__KindAssignment_1_3_0"
+    // InternalFormalML.g:75063:1: rule__ValueSelectionExpression__KindAssignment_1_3_0 : ( ruleValueIndexExpressionKind ) ;
+    public final void rule__ValueSelectionExpression__KindAssignment_1_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75067:1: ( ( ruleValueIndexExpressionKind ) )
+            // InternalFormalML.g:75068:2: ( ruleValueIndexExpressionKind )
+            {
+            // InternalFormalML.g:75068:2: ( ruleValueIndexExpressionKind )
+            // InternalFormalML.g:75069:3: ruleValueIndexExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueIndexExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__KindAssignment_1_3_0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__ArgAssignment_1_3_1"
+    // InternalFormalML.g:75078:1: rule__ValueSelectionExpression__ArgAssignment_1_3_1 : ( rulePositionalTupleExpressionList ) ;
+    public final void rule__ValueSelectionExpression__ArgAssignment_1_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75082:1: ( ( rulePositionalTupleExpressionList ) )
+            // InternalFormalML.g:75083:2: ( rulePositionalTupleExpressionList )
+            {
+            // InternalFormalML.g:75083:2: ( rulePositionalTupleExpressionList )
+            // InternalFormalML.g:75084:3: rulePositionalTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePositionalTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__ArgAssignment_1_3_1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__ElementAssignment_2_2"
+    // InternalFormalML.g:75093:1: rule__ValueSelectionExpression__ElementAssignment_2_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__ValueSelectionExpression__ElementAssignment_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75097:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:75098:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:75098:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:75099:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_2_0()); 
+            }
+            // InternalFormalML.g:75100:3: ( ruleESIdentifier )
+            // InternalFormalML.g:75101:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__ElementAssignment_2_2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__KindAssignment_2_3_0"
+    // InternalFormalML.g:75112:1: rule__ValueSelectionExpression__KindAssignment_2_3_0 : ( ruleValueIndexExpressionKind ) ;
+    public final void rule__ValueSelectionExpression__KindAssignment_2_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75116:1: ( ( ruleValueIndexExpressionKind ) )
+            // InternalFormalML.g:75117:2: ( ruleValueIndexExpressionKind )
+            {
+            // InternalFormalML.g:75117:2: ( ruleValueIndexExpressionKind )
+            // InternalFormalML.g:75118:3: ruleValueIndexExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueIndexExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__KindAssignment_2_3_0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__ArgAssignment_2_3_1"
+    // InternalFormalML.g:75127:1: rule__ValueSelectionExpression__ArgAssignment_2_3_1 : ( rulePositionalTupleExpressionList ) ;
+    public final void rule__ValueSelectionExpression__ArgAssignment_2_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75131:1: ( ( rulePositionalTupleExpressionList ) )
+            // InternalFormalML.g:75132:2: ( rulePositionalTupleExpressionList )
+            {
+            // InternalFormalML.g:75132:2: ( rulePositionalTupleExpressionList )
+            // InternalFormalML.g:75133:3: rulePositionalTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePositionalTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__ArgAssignment_2_3_1"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__ElementAssignment_2_4_2"
+    // InternalFormalML.g:75142:1: rule__ValueSelectionExpression__ElementAssignment_2_4_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__ValueSelectionExpression__ElementAssignment_2_4_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75146:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:75147:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:75147:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:75148:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_4_2_0()); 
+            }
+            // InternalFormalML.g:75149:3: ( ruleESIdentifier )
+            // InternalFormalML.g:75150:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__ElementAssignment_2_4_2"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__KindAssignment_2_4_3_0"
+    // InternalFormalML.g:75161:1: rule__ValueSelectionExpression__KindAssignment_2_4_3_0 : ( ruleValueIndexExpressionKind ) ;
+    public final void rule__ValueSelectionExpression__KindAssignment_2_4_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75165:1: ( ( ruleValueIndexExpressionKind ) )
+            // InternalFormalML.g:75166:2: ( ruleValueIndexExpressionKind )
+            {
+            // InternalFormalML.g:75166:2: ( ruleValueIndexExpressionKind )
+            // InternalFormalML.g:75167:3: ruleValueIndexExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueIndexExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__KindAssignment_2_4_3_0"
+
+
+    // $ANTLR start "rule__ValueSelectionExpression__ArgAssignment_2_4_3_1"
+    // InternalFormalML.g:75176:1: rule__ValueSelectionExpression__ArgAssignment_2_4_3_1 : ( rulePositionalTupleExpressionList ) ;
+    public final void rule__ValueSelectionExpression__ArgAssignment_2_4_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75180:1: ( ( rulePositionalTupleExpressionList ) )
+            // InternalFormalML.g:75181:2: ( rulePositionalTupleExpressionList )
+            {
+            // InternalFormalML.g:75181:2: ( rulePositionalTupleExpressionList )
+            // InternalFormalML.g:75182:3: rulePositionalTupleExpressionList
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            rulePositionalTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValueSelectionExpression__ArgAssignment_2_4_3_1"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__KindAssignment_1_1"
+    // InternalFormalML.g:75191:1: rule__ValuePureNamedMachineExpression__KindAssignment_1_1 : ( ruleValueDotFieldExpressionKind ) ;
+    public final void rule__ValuePureNamedMachineExpression__KindAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75195:1: ( ( ruleValueDotFieldExpressionKind ) )
+            // InternalFormalML.g:75196:2: ( ruleValueDotFieldExpressionKind )
+            {
+            // InternalFormalML.g:75196:2: ( ruleValueDotFieldExpressionKind )
+            // InternalFormalML.g:75197:3: ruleValueDotFieldExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueDotFieldExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__KindAssignment_1_1"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__ElementAssignment_1_2"
+    // InternalFormalML.g:75206:1: rule__ValuePureNamedMachineExpression__ElementAssignment_1_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__ValuePureNamedMachineExpression__ElementAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75210:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:75211:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:75211:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:75212:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_1_2_0()); 
+            }
+            // InternalFormalML.g:75213:3: ( ruleESIdentifier )
+            // InternalFormalML.g:75214:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__ElementAssignment_1_2"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__KindAssignment_2_1"
+    // InternalFormalML.g:75225:1: rule__ValuePureNamedMachineExpression__KindAssignment_2_1 : ( ruleValueArrowFieldExpressionKind ) ;
+    public final void rule__ValuePureNamedMachineExpression__KindAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75229:1: ( ( ruleValueArrowFieldExpressionKind ) )
+            // InternalFormalML.g:75230:2: ( ruleValueArrowFieldExpressionKind )
+            {
+            // InternalFormalML.g:75230:2: ( ruleValueArrowFieldExpressionKind )
+            // InternalFormalML.g:75231:3: ruleValueArrowFieldExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_2_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueArrowFieldExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__KindAssignment_2_1"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__ElementAssignment_2_2"
+    // InternalFormalML.g:75240:1: rule__ValuePureNamedMachineExpression__ElementAssignment_2_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__ValuePureNamedMachineExpression__ElementAssignment_2_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75244:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:75245:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:75245:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:75246:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_2_0()); 
+            }
+            // InternalFormalML.g:75247:3: ( ruleESIdentifier )
+            // InternalFormalML.g:75248:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__ElementAssignment_2_2"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1"
+    // InternalFormalML.g:75259:1: rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1 : ( ruleValueDotFieldExpressionKind ) ;
+    public final void rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75263:1: ( ( ruleValueDotFieldExpressionKind ) )
+            // InternalFormalML.g:75264:2: ( ruleValueDotFieldExpressionKind )
+            {
+            // InternalFormalML.g:75264:2: ( ruleValueDotFieldExpressionKind )
+            // InternalFormalML.g:75265:3: ruleValueDotFieldExpressionKind
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_2_3_1_0()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleValueDotFieldExpressionKind();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_2_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__KindAssignment_2_3_1"
+
+
+    // $ANTLR start "rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2"
+    // InternalFormalML.g:75274:1: rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2 : ( ( ruleESIdentifier ) ) ;
+    public final void rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalFormalML.g:75278:1: ( ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:75279:2: ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:75279:2: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:75280:3: ( ruleESIdentifier )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_3_2_0()); 
+            }
+            // InternalFormalML.g:75281:3: ( ruleESIdentifier )
+            // InternalFormalML.g:75282:4: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_3_2_0_1()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_2_3_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_3_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ValuePureNamedMachineExpression__ElementAssignment_2_3_2"
+
+    // $ANTLR start synpred372_InternalFormalML
+    public final void synpred372_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11523:2: ( ( ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 ) ) )
+        // InternalFormalML.g:11523:2: ( ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 ) )
+        {
+        // InternalFormalML.g:11523:2: ( ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 ) )
+        // InternalFormalML.g:11524:3: ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getTransitionTimedGuardAccess().getGroup_1_1_0_1_0()); 
+        }
+        // InternalFormalML.g:11525:3: ( rule__TransitionTimedGuard__Group_1_1_0_1_0__0 )
+        // InternalFormalML.g:11525:4: rule__TransitionTimedGuard__Group_1_1_0_1_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__TransitionTimedGuard__Group_1_1_0_1_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred372_InternalFormalML
+
+    // $ANTLR start synpred373_InternalFormalML
+    public final void synpred373_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11544:2: ( ( ruleExpressionStatement ) )
+        // InternalFormalML.g:11544:2: ( ruleExpressionStatement )
+        {
+        // InternalFormalML.g:11544:2: ( ruleExpressionStatement )
+        // InternalFormalML.g:11545:3: ruleExpressionStatement
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getTransitionEffectStatementAccess().getExpressionStatementParserRuleCall_0()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleExpressionStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred373_InternalFormalML
+
+    // $ANTLR start synpred378_InternalFormalML
+    public final void synpred378_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11574:2: ( ( ruleForStatement ) )
+        // InternalFormalML.g:11574:2: ( ruleForStatement )
+        {
+        // InternalFormalML.g:11574:2: ( ruleForStatement )
+        // InternalFormalML.g:11575:3: ruleForStatement
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getTransitionEffectStatementAccess().getForStatementParserRuleCall_5()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleForStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred378_InternalFormalML
+
+    // $ANTLR start synpred379_InternalFormalML
+    public final void synpred379_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11580:2: ( ( ruleForEachStatement ) )
+        // InternalFormalML.g:11580:2: ( ruleForEachStatement )
+        {
+        // InternalFormalML.g:11580:2: ( ruleForEachStatement )
+        // InternalFormalML.g:11581:3: ruleForEachStatement
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getTransitionEffectStatementAccess().getForEachStatementParserRuleCall_6()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleForEachStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred379_InternalFormalML
+
+    // $ANTLR start synpred383_InternalFormalML
+    public final void synpred383_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11619:2: ( ( ruleExpressionStatement ) )
+        // InternalFormalML.g:11619:2: ( ruleExpressionStatement )
+        {
+        // InternalFormalML.g:11619:2: ( ruleExpressionStatement )
+        // InternalFormalML.g:11620:3: ruleExpressionStatement
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getStatementAccess().getExpressionStatementParserRuleCall_1()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleExpressionStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred383_InternalFormalML
+
+    // $ANTLR start synpred393_InternalFormalML
+    public final void synpred393_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11679:2: ( ( ruleForStatement ) )
+        // InternalFormalML.g:11679:2: ( ruleForStatement )
+        {
+        // InternalFormalML.g:11679:2: ( ruleForStatement )
+        // InternalFormalML.g:11680:3: ruleForStatement
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getStatementAccess().getForStatementParserRuleCall_11()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleForStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred393_InternalFormalML
+
+    // $ANTLR start synpred394_InternalFormalML
+    public final void synpred394_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11685:2: ( ( ruleForEachStatement ) )
+        // InternalFormalML.g:11685:2: ( ruleForEachStatement )
+        {
+        // InternalFormalML.g:11685:2: ( ruleForEachStatement )
+        // InternalFormalML.g:11686:3: ruleForEachStatement
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getStatementAccess().getForEachStatementParserRuleCall_12()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleForEachStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred394_InternalFormalML
+
+    // $ANTLR start synpred412_InternalFormalML
+    public final void synpred412_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11823:2: ( ( ( rule__ExpressionStatement__Group_0__0 ) ) )
+        // InternalFormalML.g:11823:2: ( ( rule__ExpressionStatement__Group_0__0 ) )
+        {
+        // InternalFormalML.g:11823:2: ( ( rule__ExpressionStatement__Group_0__0 ) )
+        // InternalFormalML.g:11824:3: ( rule__ExpressionStatement__Group_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getExpressionStatementAccess().getGroup_0()); 
+        }
+        // InternalFormalML.g:11825:3: ( rule__ExpressionStatement__Group_0__0 )
+        // InternalFormalML.g:11825:4: rule__ExpressionStatement__Group_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ExpressionStatement__Group_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred412_InternalFormalML
+
+    // $ANTLR start synpred418_InternalFormalML
+    public final void synpred418_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11919:2: ( ( ( rule__ForStatement__Group_0__0 ) ) )
+        // InternalFormalML.g:11919:2: ( ( rule__ForStatement__Group_0__0 ) )
+        {
+        // InternalFormalML.g:11919:2: ( ( rule__ForStatement__Group_0__0 ) )
+        // InternalFormalML.g:11920:3: ( rule__ForStatement__Group_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getForStatementAccess().getGroup_0()); 
+        }
+        // InternalFormalML.g:11921:3: ( rule__ForStatement__Group_0__0 )
+        // InternalFormalML.g:11921:4: rule__ForStatement__Group_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ForStatement__Group_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred418_InternalFormalML
+
+    // $ANTLR start synpred419_InternalFormalML
+    public final void synpred419_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11940:2: ( ( ruleAssignmentExpression ) )
+        // InternalFormalML.g:11940:2: ( ruleAssignmentExpression )
+        {
+        // InternalFormalML.g:11940:2: ( ruleAssignmentExpression )
+        // InternalFormalML.g:11941:3: ruleAssignmentExpression
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getForAssignmentExpressionAccess().getAssignmentExpressionParserRuleCall_0()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleAssignmentExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred419_InternalFormalML
+
+    // $ANTLR start synpred421_InternalFormalML
+    public final void synpred421_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11967:2: ( ( ( rule__ForEachStatement__Group_0__0 ) ) )
+        // InternalFormalML.g:11967:2: ( ( rule__ForEachStatement__Group_0__0 ) )
+        {
+        // InternalFormalML.g:11967:2: ( ( rule__ForEachStatement__Group_0__0 ) )
+        // InternalFormalML.g:11968:3: ( rule__ForEachStatement__Group_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getForEachStatementAccess().getGroup_0()); 
+        }
+        // InternalFormalML.g:11969:3: ( rule__ForEachStatement__Group_0__0 )
+        // InternalFormalML.g:11969:4: rule__ForEachStatement__Group_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ForEachStatement__Group_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred421_InternalFormalML
+
+    // $ANTLR start synpred422_InternalFormalML
+    public final void synpred422_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:11988:2: ( ( ( rule__InterruptStatement__ExprAssignment_1_0 ) ) )
+        // InternalFormalML.g:11988:2: ( ( rule__InterruptStatement__ExprAssignment_1_0 ) )
+        {
+        // InternalFormalML.g:11988:2: ( ( rule__InterruptStatement__ExprAssignment_1_0 ) )
+        // InternalFormalML.g:11989:3: ( rule__InterruptStatement__ExprAssignment_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getInterruptStatementAccess().getExprAssignment_1_0()); 
+        }
+        // InternalFormalML.g:11990:3: ( rule__InterruptStatement__ExprAssignment_1_0 )
+        // InternalFormalML.g:11990:4: rule__InterruptStatement__ExprAssignment_1_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__InterruptStatement__ExprAssignment_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred422_InternalFormalML
+
+    // $ANTLR start synpred429_InternalFormalML
+    public final void synpred429_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:12105:2: ( ( ruleAssignmentExpression ) )
+        // InternalFormalML.g:12105:2: ( ruleAssignmentExpression )
+        {
+        // InternalFormalML.g:12105:2: ( ruleAssignmentExpression )
+        // InternalFormalML.g:12106:3: ruleAssignmentExpression
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getExpressionAccess().getAssignmentExpressionParserRuleCall_0()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleAssignmentExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred429_InternalFormalML
+
+    // $ANTLR start synpred465_InternalFormalML
+    public final void synpred465_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:12486:2: ( ( ruleLiteralTerminalExpression ) )
+        // InternalFormalML.g:12486:2: ( ruleLiteralTerminalExpression )
+        {
+        // InternalFormalML.g:12486:2: ( ruleLiteralTerminalExpression )
+        // InternalFormalML.g:12487:3: ruleLiteralTerminalExpression
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getUnaryExpressionAccess().getLiteralTerminalExpressionParserRuleCall_0()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleLiteralTerminalExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred465_InternalFormalML
+
+    // $ANTLR start synpred466_InternalFormalML
+    public final void synpred466_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:12492:2: ( ( ruleArithmeticUnaryExpression ) )
+        // InternalFormalML.g:12492:2: ( ruleArithmeticUnaryExpression )
+        {
+        // InternalFormalML.g:12492:2: ( ruleArithmeticUnaryExpression )
+        // InternalFormalML.g:12493:3: ruleArithmeticUnaryExpression
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getUnaryExpressionAccess().getArithmeticUnaryExpressionParserRuleCall_1()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleArithmeticUnaryExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred466_InternalFormalML
+
+    // $ANTLR start synpred469_InternalFormalML
+    public final void synpred469_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:12510:2: ( ( ruleNewfreshExpression ) )
+        // InternalFormalML.g:12510:2: ( ruleNewfreshExpression )
+        {
+        // InternalFormalML.g:12510:2: ( ruleNewfreshExpression )
+        // InternalFormalML.g:12511:3: ruleNewfreshExpression
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getUnaryExpressionAccess().getNewfreshExpressionParserRuleCall_4()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleNewfreshExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred469_InternalFormalML
+
+    // $ANTLR start synpred472_InternalFormalML
+    public final void synpred472_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:12528:2: ( ( rulePostfixUnaryExpression ) )
+        // InternalFormalML.g:12528:2: ( rulePostfixUnaryExpression )
+        {
+        // InternalFormalML.g:12528:2: ( rulePostfixUnaryExpression )
+        // InternalFormalML.g:12529:3: rulePostfixUnaryExpression
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getUnaryExpressionAccess().getPostfixUnaryExpressionParserRuleCall_7()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        rulePostfixUnaryExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred472_InternalFormalML
+
+    // $ANTLR start synpred490_InternalFormalML
+    public final void synpred490_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:12846:2: ( ( ruleLiteralIntegerExpression ) )
+        // InternalFormalML.g:12846:2: ( ruleLiteralIntegerExpression )
+        {
+        // InternalFormalML.g:12846:2: ( ruleLiteralIntegerExpression )
+        // InternalFormalML.g:12847:3: ruleLiteralIntegerExpression
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralIntegerExpressionParserRuleCall_1()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleLiteralIntegerExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred490_InternalFormalML
+
+    // $ANTLR start synpred492_InternalFormalML
+    public final void synpred492_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:12858:2: ( ( ruleLiteralFloatExpression ) )
+        // InternalFormalML.g:12858:2: ( ruleLiteralFloatExpression )
+        {
+        // InternalFormalML.g:12858:2: ( ruleLiteralFloatExpression )
+        // InternalFormalML.g:12859:3: ruleLiteralFloatExpression
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralFloatExpressionParserRuleCall_3()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleLiteralFloatExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred492_InternalFormalML
+
+    // $ANTLR start synpred502_InternalFormalML
+    public final void synpred502_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:13008:2: ( ( ruleLiteralReferenceMachineContext ) )
+        // InternalFormalML.g:13008:2: ( ruleLiteralReferenceMachineContext )
+        {
+        // InternalFormalML.g:13008:2: ( ruleLiteralReferenceMachineContext )
+        // InternalFormalML.g:13009:3: ruleLiteralReferenceMachineContext
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_2()); 
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleLiteralReferenceMachineContext();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred502_InternalFormalML
+
+    // $ANTLR start synpred632_InternalFormalML
+    public final void synpred632_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:17952:3: ( rule__Procedure__Group_5__0 )
+        // InternalFormalML.g:17952:3: rule__Procedure__Group_5__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Procedure__Group_5__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred632_InternalFormalML
+
+    // $ANTLR start synpred636_InternalFormalML
+    public final void synpred636_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:18141:3: ( rule__Procedure__ExecutionAssignment_12 )
+        // InternalFormalML.g:18141:3: rule__Procedure__ExecutionAssignment_12
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Procedure__ExecutionAssignment_12();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred636_InternalFormalML
+
+    // $ANTLR start synpred715_InternalFormalML
+    public final void synpred715_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:25740:3: ( rule__ModelOfExecution__RoutineAssignment_2 )
+        // InternalFormalML.g:25740:3: rule__ModelOfExecution__RoutineAssignment_2
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__RoutineAssignment_2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred715_InternalFormalML
+
+    // $ANTLR start synpred808_InternalFormalML
+    public final void synpred808_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:37609:3: ( rule__VariablePublic__ModifierAssignment_0 )
+        // InternalFormalML.g:37609:3: rule__VariablePublic__ModifierAssignment_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePublic__ModifierAssignment_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred808_InternalFormalML
+
+    // $ANTLR start synpred809_InternalFormalML
+    public final void synpred809_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:37636:3: ( rule__VariablePublic__UnorderedGroup_1 )
+        // InternalFormalML.g:37636:3: rule__VariablePublic__UnorderedGroup_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePublic__UnorderedGroup_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred809_InternalFormalML
+
+    // $ANTLR start synpred812_InternalFormalML
+    public final void synpred812_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:37960:3: ( rule__VariableProtected__ModifierAssignment_0 )
+        // InternalFormalML.g:37960:3: rule__VariableProtected__ModifierAssignment_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariableProtected__ModifierAssignment_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred812_InternalFormalML
+
+    // $ANTLR start synpred813_InternalFormalML
+    public final void synpred813_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:37987:3: ( rule__VariableProtected__UnorderedGroup_1 )
+        // InternalFormalML.g:37987:3: rule__VariableProtected__UnorderedGroup_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariableProtected__UnorderedGroup_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred813_InternalFormalML
+
+    // $ANTLR start synpred816_InternalFormalML
+    public final void synpred816_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:38311:3: ( rule__VariablePrivate__ModifierAssignment_0 )
+        // InternalFormalML.g:38311:3: rule__VariablePrivate__ModifierAssignment_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePrivate__ModifierAssignment_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred816_InternalFormalML
+
+    // $ANTLR start synpred817_InternalFormalML
+    public final void synpred817_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:38338:3: ( rule__VariablePrivate__UnorderedGroup_1 )
+        // InternalFormalML.g:38338:3: rule__VariablePrivate__UnorderedGroup_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePrivate__UnorderedGroup_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred817_InternalFormalML
+
+    // $ANTLR start synpred838_InternalFormalML
+    public final void synpred838_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:40498:3: ( rule__BufferPublic__ModifierAssignment_0 )
+        // InternalFormalML.g:40498:3: rule__BufferPublic__ModifierAssignment_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__BufferPublic__ModifierAssignment_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred838_InternalFormalML
+
+    // $ANTLR start synpred840_InternalFormalML
+    public final void synpred840_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:40660:3: ( rule__BufferProtected__ModifierAssignment_0 )
+        // InternalFormalML.g:40660:3: rule__BufferProtected__ModifierAssignment_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__BufferProtected__ModifierAssignment_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred840_InternalFormalML
+
+    // $ANTLR start synpred842_InternalFormalML
+    public final void synpred842_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:40822:3: ( rule__BufferPrivate__ModifierAssignment_0 )
+        // InternalFormalML.g:40822:3: rule__BufferPrivate__ModifierAssignment_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__BufferPrivate__ModifierAssignment_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred842_InternalFormalML
+
+    // $ANTLR start synpred892_InternalFormalML
+    public final void synpred892_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:44846:3: ( rule__Transition__Alternatives_5_0_1 )
+        // InternalFormalML.g:44846:3: rule__Transition__Alternatives_5_0_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Transition__Alternatives_5_0_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred892_InternalFormalML
+
+    // $ANTLR start synpred899_InternalFormalML
+    public final void synpred899_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:45305:3: ( rule__Transition__Alternatives_5_1_2_0_1 )
+        // InternalFormalML.g:45305:3: rule__Transition__Alternatives_5_1_2_0_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Transition__Alternatives_5_1_2_0_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred899_InternalFormalML
+
+    // $ANTLR start synpred953_InternalFormalML
+    public final void synpred953_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:53195:3: ( rule__RelationalExpression__Group_1__0 )
+        // InternalFormalML.g:53195:3: rule__RelationalExpression__Group_1__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__RelationalExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred953_InternalFormalML
+
+    // $ANTLR start synpred954_InternalFormalML
+    public final void synpred954_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:53303:3: ( rule__RelationalExpression__Group_1_3__0 )
+        // InternalFormalML.g:53303:3: rule__RelationalExpression__Group_1_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__RelationalExpression__Group_1_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred954_InternalFormalML
+
+    // $ANTLR start synpred955_InternalFormalML
+    public final void synpred955_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:53438:3: ( rule__AdditiveExpression__Alternatives_1 )
+        // InternalFormalML.g:53438:3: rule__AdditiveExpression__Alternatives_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__AdditiveExpression__Alternatives_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred955_InternalFormalML
+
+    // $ANTLR start synpred956_InternalFormalML
+    public final void synpred956_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:53546:3: ( rule__AdditiveExpression__Group_1_0_3__0 )
+        // InternalFormalML.g:53546:3: rule__AdditiveExpression__Group_1_0_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__AdditiveExpression__Group_1_0_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred956_InternalFormalML
+
+    // $ANTLR start synpred957_InternalFormalML
+    public final void synpred957_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:53708:3: ( rule__AdditiveExpression__Group_1_1_3__0 )
+        // InternalFormalML.g:53708:3: rule__AdditiveExpression__Group_1_1_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__AdditiveExpression__Group_1_1_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred957_InternalFormalML
+
+    // $ANTLR start synpred959_InternalFormalML
+    public final void synpred959_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:53924:3: ( rule__MultiplicativeExpression__Group_1_0_3__0 )
+        // InternalFormalML.g:53924:3: rule__MultiplicativeExpression__Group_1_0_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MultiplicativeExpression__Group_1_0_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred959_InternalFormalML
+
+    // $ANTLR start synpred960_InternalFormalML
+    public final void synpred960_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:54086:3: ( rule__MultiplicativeExpression__Group_1_1_3__0 )
+        // InternalFormalML.g:54086:3: rule__MultiplicativeExpression__Group_1_1_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MultiplicativeExpression__Group_1_1_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred960_InternalFormalML
+
+    // $ANTLR start synpred961_InternalFormalML
+    public final void synpred961_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:54248:3: ( rule__MultiplicativeExpression__Group_1_2_3__0 )
+        // InternalFormalML.g:54248:3: rule__MultiplicativeExpression__Group_1_2_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MultiplicativeExpression__Group_1_2_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred961_InternalFormalML
+
+    // $ANTLR start synpred962_InternalFormalML
+    public final void synpred962_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:54410:3: ( rule__MultiplicativeExpression__Group_1_3_3__0 )
+        // InternalFormalML.g:54410:3: rule__MultiplicativeExpression__Group_1_3_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MultiplicativeExpression__Group_1_3_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred962_InternalFormalML
+
+    // $ANTLR start synpred965_InternalFormalML
+    public final void synpred965_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:55274:3: ( rule__PrimaryExpression__Alternatives_1_3 )
+        // InternalFormalML.g:55274:3: rule__PrimaryExpression__Alternatives_1_3
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__PrimaryExpression__Alternatives_1_3();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred965_InternalFormalML
+
+    // $ANTLR start synpred966_InternalFormalML
+    public final void synpred966_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:55545:3: ( rule__PrimaryExpression__Alternatives_2_3 )
+        // InternalFormalML.g:55545:3: rule__PrimaryExpression__Alternatives_2_3
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__PrimaryExpression__Alternatives_2_3();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred966_InternalFormalML
+
+    // $ANTLR start synpred968_InternalFormalML
+    public final void synpred968_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:55841:3: ( rule__PrimaryExpression__Alternatives_2_4_3 )
+        // InternalFormalML.g:55841:3: rule__PrimaryExpression__Alternatives_2_4_3
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__PrimaryExpression__Alternatives_2_4_3();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred968_InternalFormalML
+
+    // $ANTLR start synpred979_InternalFormalML
+    public final void synpred979_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:58109:3: ( rule__LiteralReferenceElement__Alternatives_2 )
+        // InternalFormalML.g:58109:3: rule__LiteralReferenceElement__Alternatives_2
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__LiteralReferenceElement__Alternatives_2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred979_InternalFormalML
+
+    // $ANTLR start synpred989_InternalFormalML
+    public final void synpred989_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:59798:2: ( rule__System__UnorderedGroup_0__0 )
+        // InternalFormalML.g:59798:2: rule__System__UnorderedGroup_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__System__UnorderedGroup_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred989_InternalFormalML
+
+    // $ANTLR start synpred990_InternalFormalML
+    public final void synpred990_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:59813:3: ( ({...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) ) ) )
+        // InternalFormalML.g:59813:3: ({...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) ) )
+        {
+        // InternalFormalML.g:59813:3: ({...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) ) )
+        // InternalFormalML.g:59814:4: {...}? => ( ( ( rule__System__VisibilityAssignment_0_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred990_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0)");
+        }
+        // InternalFormalML.g:59814:102: ( ( ( rule__System__VisibilityAssignment_0_0 ) ) )
+        // InternalFormalML.g:59815:5: ( ( rule__System__VisibilityAssignment_0_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0);
+        // InternalFormalML.g:59821:5: ( ( rule__System__VisibilityAssignment_0_0 ) )
+        // InternalFormalML.g:59822:6: ( rule__System__VisibilityAssignment_0_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getSystemAccess().getVisibilityAssignment_0_0()); 
+        }
+        // InternalFormalML.g:59823:6: ( rule__System__VisibilityAssignment_0_0 )
+        // InternalFormalML.g:59823:7: rule__System__VisibilityAssignment_0_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__System__VisibilityAssignment_0_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred990_InternalFormalML
+
+    // $ANTLR start synpred991_InternalFormalML
+    public final void synpred991_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:59857:2: ( rule__System__UnorderedGroup_0__1 )
+        // InternalFormalML.g:59857:2: rule__System__UnorderedGroup_0__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__System__UnorderedGroup_0__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred991_InternalFormalML
+
+    // $ANTLR start synpred992_InternalFormalML
+    public final void synpred992_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:59881:2: ( rule__MachineBlock__UnorderedGroup_0__0 )
+        // InternalFormalML.g:59881:2: rule__MachineBlock__UnorderedGroup_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MachineBlock__UnorderedGroup_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred992_InternalFormalML
+
+    // $ANTLR start synpred993_InternalFormalML
+    public final void synpred993_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:59896:3: ( ({...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) ) ) )
+        // InternalFormalML.g:59896:3: ({...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) ) )
+        {
+        // InternalFormalML.g:59896:3: ({...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) ) )
+        // InternalFormalML.g:59897:4: {...}? => ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred993_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0)");
+        }
+        // InternalFormalML.g:59897:108: ( ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) ) )
+        // InternalFormalML.g:59898:5: ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0);
+        // InternalFormalML.g:59904:5: ( ( rule__MachineBlock__VisibilityAssignment_0_0 ) )
+        // InternalFormalML.g:59905:6: ( rule__MachineBlock__VisibilityAssignment_0_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getMachineBlockAccess().getVisibilityAssignment_0_0()); 
+        }
+        // InternalFormalML.g:59906:6: ( rule__MachineBlock__VisibilityAssignment_0_0 )
+        // InternalFormalML.g:59906:7: rule__MachineBlock__VisibilityAssignment_0_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MachineBlock__VisibilityAssignment_0_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred993_InternalFormalML
+
+    // $ANTLR start synpred994_InternalFormalML
+    public final void synpred994_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:59911:3: ( ({...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) ) ) )
+        // InternalFormalML.g:59911:3: ({...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) ) )
+        {
+        // InternalFormalML.g:59911:3: ({...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) ) )
+        // InternalFormalML.g:59912:4: {...}? => ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred994_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1)");
+        }
+        // InternalFormalML.g:59912:108: ( ( ( rule__MachineBlock__Alternatives_0_1 ) ) )
+        // InternalFormalML.g:59913:5: ( ( rule__MachineBlock__Alternatives_0_1 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1);
+        // InternalFormalML.g:59919:5: ( ( rule__MachineBlock__Alternatives_0_1 ) )
+        // InternalFormalML.g:59920:6: ( rule__MachineBlock__Alternatives_0_1 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getMachineBlockAccess().getAlternatives_0_1()); 
+        }
+        // InternalFormalML.g:59921:6: ( rule__MachineBlock__Alternatives_0_1 )
+        // InternalFormalML.g:59921:7: rule__MachineBlock__Alternatives_0_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MachineBlock__Alternatives_0_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred994_InternalFormalML
+
+    // $ANTLR start synpred995_InternalFormalML
+    public final void synpred995_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:59955:2: ( rule__MachineBlock__UnorderedGroup_0__1 )
+        // InternalFormalML.g:59955:2: rule__MachineBlock__UnorderedGroup_0__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MachineBlock__UnorderedGroup_0__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred995_InternalFormalML
+
+    // $ANTLR start synpred996_InternalFormalML
+    public final void synpred996_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:59967:2: ( rule__MachineBlock__UnorderedGroup_0__2 )
+        // InternalFormalML.g:59967:2: rule__MachineBlock__UnorderedGroup_0__2
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MachineBlock__UnorderedGroup_0__2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred996_InternalFormalML
+
+    // $ANTLR start synpred997_InternalFormalML
+    public final void synpred997_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:59991:2: ( rule__ProcedureExecution__UnorderedGroup_2__0 )
+        // InternalFormalML.g:59991:2: rule__ProcedureExecution__UnorderedGroup_2__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ProcedureExecution__UnorderedGroup_2__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred997_InternalFormalML
+
+    // $ANTLR start synpred998_InternalFormalML
+    public final void synpred998_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60006:3: ( ({...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) ) ) )
+        // InternalFormalML.g:60006:3: ({...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) ) )
+        {
+        // InternalFormalML.g:60006:3: ({...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) ) )
+        // InternalFormalML.g:60007:4: {...}? => ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred998_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0)");
+        }
+        // InternalFormalML.g:60007:114: ( ( ( rule__ProcedureExecution__Group_2_0__0 ) ) )
+        // InternalFormalML.g:60008:5: ( ( rule__ProcedureExecution__Group_2_0__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0);
+        // InternalFormalML.g:60014:5: ( ( rule__ProcedureExecution__Group_2_0__0 ) )
+        // InternalFormalML.g:60015:6: ( rule__ProcedureExecution__Group_2_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getProcedureExecutionAccess().getGroup_2_0()); 
+        }
+        // InternalFormalML.g:60016:6: ( rule__ProcedureExecution__Group_2_0__0 )
+        // InternalFormalML.g:60016:7: rule__ProcedureExecution__Group_2_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ProcedureExecution__Group_2_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred998_InternalFormalML
+
+    // $ANTLR start synpred999_InternalFormalML
+    public final void synpred999_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60050:2: ( rule__ProcedureExecution__UnorderedGroup_2__1 )
+        // InternalFormalML.g:60050:2: rule__ProcedureExecution__UnorderedGroup_2__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ProcedureExecution__UnorderedGroup_2__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred999_InternalFormalML
+
+    // $ANTLR start synpred1000_InternalFormalML
+    public final void synpred1000_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60074:2: ( rule__MoeBehavior__UnorderedGroup_2__0 )
+        // InternalFormalML.g:60074:2: rule__MoeBehavior__UnorderedGroup_2__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MoeBehavior__UnorderedGroup_2__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1000_InternalFormalML
+
+    // $ANTLR start synpred1001_InternalFormalML
+    public final void synpred1001_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60089:3: ( ({...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) ) ) )
+        // InternalFormalML.g:60089:3: ({...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) ) )
+        {
+        // InternalFormalML.g:60089:3: ({...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) ) )
+        // InternalFormalML.g:60090:4: {...}? => ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1001_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0)");
+        }
+        // InternalFormalML.g:60090:107: ( ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) ) )
+        // InternalFormalML.g:60091:5: ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0);
+        // InternalFormalML.g:60097:5: ( ( rule__MoeBehavior__ExecutionAssignment_2_0 ) )
+        // InternalFormalML.g:60098:6: ( rule__MoeBehavior__ExecutionAssignment_2_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getMoeBehaviorAccess().getExecutionAssignment_2_0()); 
+        }
+        // InternalFormalML.g:60099:6: ( rule__MoeBehavior__ExecutionAssignment_2_0 )
+        // InternalFormalML.g:60099:7: rule__MoeBehavior__ExecutionAssignment_2_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MoeBehavior__ExecutionAssignment_2_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1001_InternalFormalML
+
+    // $ANTLR start synpred1002_InternalFormalML
+    public final void synpred1002_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60133:2: ( rule__MoeBehavior__UnorderedGroup_2__1 )
+        // InternalFormalML.g:60133:2: rule__MoeBehavior__UnorderedGroup_2__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__MoeBehavior__UnorderedGroup_2__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1002_InternalFormalML
+
+    // $ANTLR start synpred1003_InternalFormalML
+    public final void synpred1003_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60157:2: ( rule__Statemachine__UnorderedGroup_1__0 )
+        // InternalFormalML.g:60157:2: rule__Statemachine__UnorderedGroup_1__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Statemachine__UnorderedGroup_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1003_InternalFormalML
+
+    // $ANTLR start synpred1004_InternalFormalML
+    public final void synpred1004_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60172:3: ( ({...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) ) ) )
+        // InternalFormalML.g:60172:3: ({...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) ) )
+        {
+        // InternalFormalML.g:60172:3: ({...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) ) )
+        // InternalFormalML.g:60173:4: {...}? => ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1004_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:60173:108: ( ( ( rule__Statemachine__VisibilityAssignment_1_0 ) ) )
+        // InternalFormalML.g:60174:5: ( ( rule__Statemachine__VisibilityAssignment_1_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:60180:5: ( ( rule__Statemachine__VisibilityAssignment_1_0 ) )
+        // InternalFormalML.g:60181:6: ( rule__Statemachine__VisibilityAssignment_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getStatemachineAccess().getVisibilityAssignment_1_0()); 
+        }
+        // InternalFormalML.g:60182:6: ( rule__Statemachine__VisibilityAssignment_1_0 )
+        // InternalFormalML.g:60182:7: rule__Statemachine__VisibilityAssignment_1_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Statemachine__VisibilityAssignment_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1004_InternalFormalML
+
+    // $ANTLR start synpred1005_InternalFormalML
+    public final void synpred1005_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60187:3: ( ({...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) ) ) )
+        // InternalFormalML.g:60187:3: ({...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) ) )
+        {
+        // InternalFormalML.g:60187:3: ({...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) ) )
+        // InternalFormalML.g:60188:4: {...}? => ( ( ( rule__Statemachine__Alternatives_1_1 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1005_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1)");
+        }
+        // InternalFormalML.g:60188:108: ( ( ( rule__Statemachine__Alternatives_1_1 ) ) )
+        // InternalFormalML.g:60189:5: ( ( rule__Statemachine__Alternatives_1_1 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1);
+        // InternalFormalML.g:60195:5: ( ( rule__Statemachine__Alternatives_1_1 ) )
+        // InternalFormalML.g:60196:6: ( rule__Statemachine__Alternatives_1_1 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getStatemachineAccess().getAlternatives_1_1()); 
+        }
+        // InternalFormalML.g:60197:6: ( rule__Statemachine__Alternatives_1_1 )
+        // InternalFormalML.g:60197:7: rule__Statemachine__Alternatives_1_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Statemachine__Alternatives_1_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1005_InternalFormalML
+
+    // $ANTLR start synpred1006_InternalFormalML
+    public final void synpred1006_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60231:2: ( rule__Statemachine__UnorderedGroup_1__1 )
+        // InternalFormalML.g:60231:2: rule__Statemachine__UnorderedGroup_1__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Statemachine__UnorderedGroup_1__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1006_InternalFormalML
+
+    // $ANTLR start synpred1007_InternalFormalML
+    public final void synpred1007_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60243:2: ( rule__Statemachine__UnorderedGroup_1__2 )
+        // InternalFormalML.g:60243:2: rule__Statemachine__UnorderedGroup_1__2
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Statemachine__UnorderedGroup_1__2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1007_InternalFormalML
+
+    // $ANTLR start synpred1008_InternalFormalML
+    public final void synpred1008_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60267:2: ( rule__Statemachine__UnorderedGroup_12__0 )
+        // InternalFormalML.g:60267:2: rule__Statemachine__UnorderedGroup_12__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Statemachine__UnorderedGroup_12__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1008_InternalFormalML
+
+    // $ANTLR start synpred1009_InternalFormalML
+    public final void synpred1009_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60282:3: ( ({...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) ) ) )
+        // InternalFormalML.g:60282:3: ({...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) ) )
+        {
+        // InternalFormalML.g:60282:3: ({...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) ) )
+        // InternalFormalML.g:60283:4: {...}? => ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1009_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0)");
+        }
+        // InternalFormalML.g:60283:109: ( ( ( rule__Statemachine__ExecutionAssignment_12_0 ) ) )
+        // InternalFormalML.g:60284:5: ( ( rule__Statemachine__ExecutionAssignment_12_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0);
+        // InternalFormalML.g:60290:5: ( ( rule__Statemachine__ExecutionAssignment_12_0 ) )
+        // InternalFormalML.g:60291:6: ( rule__Statemachine__ExecutionAssignment_12_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getStatemachineAccess().getExecutionAssignment_12_0()); 
+        }
+        // InternalFormalML.g:60292:6: ( rule__Statemachine__ExecutionAssignment_12_0 )
+        // InternalFormalML.g:60292:7: rule__Statemachine__ExecutionAssignment_12_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Statemachine__ExecutionAssignment_12_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1009_InternalFormalML
+
+    // $ANTLR start synpred1010_InternalFormalML
+    public final void synpred1010_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60326:2: ( rule__Statemachine__UnorderedGroup_12__1 )
+        // InternalFormalML.g:60326:2: rule__Statemachine__UnorderedGroup_12__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Statemachine__UnorderedGroup_12__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1010_InternalFormalML
+
+    // $ANTLR start synpred1011_InternalFormalML
+    public final void synpred1011_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60350:2: ( rule__ModelOfExecution__UnorderedGroup_3__0 )
+        // InternalFormalML.g:60350:2: rule__ModelOfExecution__UnorderedGroup_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__UnorderedGroup_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1011_InternalFormalML
+
+    // $ANTLR start synpred1012_InternalFormalML
+    public final void synpred1012_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60365:3: ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) ) ) )
+        // InternalFormalML.g:60365:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) ) )
+        {
+        // InternalFormalML.g:60365:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) ) )
+        // InternalFormalML.g:60366:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1012_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0)");
+        }
+        // InternalFormalML.g:60366:112: ( ( ( rule__ModelOfExecution__Group_3_0__0 ) ) )
+        // InternalFormalML.g:60367:5: ( ( rule__ModelOfExecution__Group_3_0__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0);
+        // InternalFormalML.g:60373:5: ( ( rule__ModelOfExecution__Group_3_0__0 ) )
+        // InternalFormalML.g:60374:6: ( rule__ModelOfExecution__Group_3_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModelOfExecutionAccess().getGroup_3_0()); 
+        }
+        // InternalFormalML.g:60375:6: ( rule__ModelOfExecution__Group_3_0__0 )
+        // InternalFormalML.g:60375:7: rule__ModelOfExecution__Group_3_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__Group_3_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1012_InternalFormalML
+
+    // $ANTLR start synpred1013_InternalFormalML
+    public final void synpred1013_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60380:3: ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) ) ) )
+        // InternalFormalML.g:60380:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) ) )
+        {
+        // InternalFormalML.g:60380:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) ) )
+        // InternalFormalML.g:60381:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1013_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1)");
+        }
+        // InternalFormalML.g:60381:112: ( ( ( rule__ModelOfExecution__Group_3_1__0 ) ) )
+        // InternalFormalML.g:60382:5: ( ( rule__ModelOfExecution__Group_3_1__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1);
+        // InternalFormalML.g:60388:5: ( ( rule__ModelOfExecution__Group_3_1__0 ) )
+        // InternalFormalML.g:60389:6: ( rule__ModelOfExecution__Group_3_1__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModelOfExecutionAccess().getGroup_3_1()); 
+        }
+        // InternalFormalML.g:60390:6: ( rule__ModelOfExecution__Group_3_1__0 )
+        // InternalFormalML.g:60390:7: rule__ModelOfExecution__Group_3_1__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__Group_3_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1013_InternalFormalML
+
+    // $ANTLR start synpred1014_InternalFormalML
+    public final void synpred1014_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60395:3: ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) ) ) )
+        // InternalFormalML.g:60395:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) ) )
+        {
+        // InternalFormalML.g:60395:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) ) )
+        // InternalFormalML.g:60396:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1014_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2)");
+        }
+        // InternalFormalML.g:60396:112: ( ( ( rule__ModelOfExecution__Group_3_2__0 ) ) )
+        // InternalFormalML.g:60397:5: ( ( rule__ModelOfExecution__Group_3_2__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2);
+        // InternalFormalML.g:60403:5: ( ( rule__ModelOfExecution__Group_3_2__0 ) )
+        // InternalFormalML.g:60404:6: ( rule__ModelOfExecution__Group_3_2__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModelOfExecutionAccess().getGroup_3_2()); 
+        }
+        // InternalFormalML.g:60405:6: ( rule__ModelOfExecution__Group_3_2__0 )
+        // InternalFormalML.g:60405:7: rule__ModelOfExecution__Group_3_2__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__Group_3_2__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1014_InternalFormalML
+
+    // $ANTLR start synpred1015_InternalFormalML
+    public final void synpred1015_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60410:3: ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) ) ) )
+        // InternalFormalML.g:60410:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) ) )
+        {
+        // InternalFormalML.g:60410:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) ) )
+        // InternalFormalML.g:60411:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1015_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3)");
+        }
+        // InternalFormalML.g:60411:112: ( ( ( rule__ModelOfExecution__Group_3_3__0 ) ) )
+        // InternalFormalML.g:60412:5: ( ( rule__ModelOfExecution__Group_3_3__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3);
+        // InternalFormalML.g:60418:5: ( ( rule__ModelOfExecution__Group_3_3__0 ) )
+        // InternalFormalML.g:60419:6: ( rule__ModelOfExecution__Group_3_3__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModelOfExecutionAccess().getGroup_3_3()); 
+        }
+        // InternalFormalML.g:60420:6: ( rule__ModelOfExecution__Group_3_3__0 )
+        // InternalFormalML.g:60420:7: rule__ModelOfExecution__Group_3_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__Group_3_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1015_InternalFormalML
+
+    // $ANTLR start synpred1016_InternalFormalML
+    public final void synpred1016_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60425:3: ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) ) ) )
+        // InternalFormalML.g:60425:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) ) )
+        {
+        // InternalFormalML.g:60425:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) ) )
+        // InternalFormalML.g:60426:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1016_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4)");
+        }
+        // InternalFormalML.g:60426:112: ( ( ( rule__ModelOfExecution__Group_3_4__0 ) ) )
+        // InternalFormalML.g:60427:5: ( ( rule__ModelOfExecution__Group_3_4__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4);
+        // InternalFormalML.g:60433:5: ( ( rule__ModelOfExecution__Group_3_4__0 ) )
+        // InternalFormalML.g:60434:6: ( rule__ModelOfExecution__Group_3_4__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModelOfExecutionAccess().getGroup_3_4()); 
+        }
+        // InternalFormalML.g:60435:6: ( rule__ModelOfExecution__Group_3_4__0 )
+        // InternalFormalML.g:60435:7: rule__ModelOfExecution__Group_3_4__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__Group_3_4__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1016_InternalFormalML
+
+    // $ANTLR start synpred1017_InternalFormalML
+    public final void synpred1017_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60440:3: ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) ) ) )
+        // InternalFormalML.g:60440:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) ) )
+        {
+        // InternalFormalML.g:60440:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) ) )
+        // InternalFormalML.g:60441:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1017_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5)");
+        }
+        // InternalFormalML.g:60441:112: ( ( ( rule__ModelOfExecution__Group_3_5__0 ) ) )
+        // InternalFormalML.g:60442:5: ( ( rule__ModelOfExecution__Group_3_5__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5);
+        // InternalFormalML.g:60448:5: ( ( rule__ModelOfExecution__Group_3_5__0 ) )
+        // InternalFormalML.g:60449:6: ( rule__ModelOfExecution__Group_3_5__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModelOfExecutionAccess().getGroup_3_5()); 
+        }
+        // InternalFormalML.g:60450:6: ( rule__ModelOfExecution__Group_3_5__0 )
+        // InternalFormalML.g:60450:7: rule__ModelOfExecution__Group_3_5__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__Group_3_5__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1017_InternalFormalML
+
+    // $ANTLR start synpred1018_InternalFormalML
+    public final void synpred1018_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60455:3: ( ({...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) ) ) )
+        // InternalFormalML.g:60455:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) ) )
+        {
+        // InternalFormalML.g:60455:3: ({...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) ) )
+        // InternalFormalML.g:60456:4: {...}? => ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1018_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6)");
+        }
+        // InternalFormalML.g:60456:112: ( ( ( rule__ModelOfExecution__Group_3_6__0 ) ) )
+        // InternalFormalML.g:60457:5: ( ( rule__ModelOfExecution__Group_3_6__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6);
+        // InternalFormalML.g:60463:5: ( ( rule__ModelOfExecution__Group_3_6__0 ) )
+        // InternalFormalML.g:60464:6: ( rule__ModelOfExecution__Group_3_6__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModelOfExecutionAccess().getGroup_3_6()); 
+        }
+        // InternalFormalML.g:60465:6: ( rule__ModelOfExecution__Group_3_6__0 )
+        // InternalFormalML.g:60465:7: rule__ModelOfExecution__Group_3_6__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__Group_3_6__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1018_InternalFormalML
+
+    // $ANTLR start synpred1019_InternalFormalML
+    public final void synpred1019_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60499:2: ( rule__ModelOfExecution__UnorderedGroup_3__1 )
+        // InternalFormalML.g:60499:2: rule__ModelOfExecution__UnorderedGroup_3__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__UnorderedGroup_3__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1019_InternalFormalML
+
+    // $ANTLR start synpred1020_InternalFormalML
+    public final void synpred1020_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60511:2: ( rule__ModelOfExecution__UnorderedGroup_3__2 )
+        // InternalFormalML.g:60511:2: rule__ModelOfExecution__UnorderedGroup_3__2
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__UnorderedGroup_3__2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1020_InternalFormalML
+
+    // $ANTLR start synpred1021_InternalFormalML
+    public final void synpred1021_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60523:2: ( rule__ModelOfExecution__UnorderedGroup_3__3 )
+        // InternalFormalML.g:60523:2: rule__ModelOfExecution__UnorderedGroup_3__3
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__UnorderedGroup_3__3();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1021_InternalFormalML
+
+    // $ANTLR start synpred1022_InternalFormalML
+    public final void synpred1022_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60535:2: ( rule__ModelOfExecution__UnorderedGroup_3__4 )
+        // InternalFormalML.g:60535:2: rule__ModelOfExecution__UnorderedGroup_3__4
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__UnorderedGroup_3__4();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1022_InternalFormalML
+
+    // $ANTLR start synpred1023_InternalFormalML
+    public final void synpred1023_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60547:2: ( rule__ModelOfExecution__UnorderedGroup_3__5 )
+        // InternalFormalML.g:60547:2: rule__ModelOfExecution__UnorderedGroup_3__5
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__UnorderedGroup_3__5();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1023_InternalFormalML
+
+    // $ANTLR start synpred1024_InternalFormalML
+    public final void synpred1024_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60559:2: ( rule__ModelOfExecution__UnorderedGroup_3__6 )
+        // InternalFormalML.g:60559:2: rule__ModelOfExecution__UnorderedGroup_3__6
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__UnorderedGroup_3__6();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1024_InternalFormalML
+
+    // $ANTLR start synpred1025_InternalFormalML
+    public final void synpred1025_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60571:2: ( rule__ModelOfExecution__UnorderedGroup_3__7 )
+        // InternalFormalML.g:60571:2: rule__ModelOfExecution__UnorderedGroup_3__7
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__ModelOfExecution__UnorderedGroup_3__7();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1025_InternalFormalML
+
+    // $ANTLR start synpred1026_InternalFormalML
+    public final void synpred1026_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60595:2: ( rule__Modifier__UnorderedGroup_1__0 )
+        // InternalFormalML.g:60595:2: rule__Modifier__UnorderedGroup_1__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Modifier__UnorderedGroup_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1026_InternalFormalML
+
+    // $ANTLR start synpred1027_InternalFormalML
+    public final void synpred1027_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60610:3: ( ({...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) ) ) )
+        // InternalFormalML.g:60610:3: ({...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) ) )
+        {
+        // InternalFormalML.g:60610:3: ({...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) ) )
+        // InternalFormalML.g:60611:4: {...}? => ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1027_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:60611:104: ( ( ( rule__Modifier__StaticAssignment_1_0 ) ) )
+        // InternalFormalML.g:60612:5: ( ( rule__Modifier__StaticAssignment_1_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:60618:5: ( ( rule__Modifier__StaticAssignment_1_0 ) )
+        // InternalFormalML.g:60619:6: ( rule__Modifier__StaticAssignment_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModifierAccess().getStaticAssignment_1_0()); 
+        }
+        // InternalFormalML.g:60620:6: ( rule__Modifier__StaticAssignment_1_0 )
+        // InternalFormalML.g:60620:7: rule__Modifier__StaticAssignment_1_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Modifier__StaticAssignment_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1027_InternalFormalML
+
+    // $ANTLR start synpred1028_InternalFormalML
+    public final void synpred1028_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60625:3: ( ({...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) ) ) )
+        // InternalFormalML.g:60625:3: ({...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) ) )
+        {
+        // InternalFormalML.g:60625:3: ({...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) ) )
+        // InternalFormalML.g:60626:4: {...}? => ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1028_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1)");
+        }
+        // InternalFormalML.g:60626:104: ( ( ( rule__Modifier__FinalAssignment_1_1 ) ) )
+        // InternalFormalML.g:60627:5: ( ( rule__Modifier__FinalAssignment_1_1 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1);
+        // InternalFormalML.g:60633:5: ( ( rule__Modifier__FinalAssignment_1_1 ) )
+        // InternalFormalML.g:60634:6: ( rule__Modifier__FinalAssignment_1_1 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModifierAccess().getFinalAssignment_1_1()); 
+        }
+        // InternalFormalML.g:60635:6: ( rule__Modifier__FinalAssignment_1_1 )
+        // InternalFormalML.g:60635:7: rule__Modifier__FinalAssignment_1_1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Modifier__FinalAssignment_1_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1028_InternalFormalML
+
+    // $ANTLR start synpred1029_InternalFormalML
+    public final void synpred1029_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60640:3: ( ({...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) ) ) )
+        // InternalFormalML.g:60640:3: ({...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) ) )
+        {
+        // InternalFormalML.g:60640:3: ({...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) ) )
+        // InternalFormalML.g:60641:4: {...}? => ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1029_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2)");
+        }
+        // InternalFormalML.g:60641:104: ( ( ( rule__Modifier__ReferenceAssignment_1_2 ) ) )
+        // InternalFormalML.g:60642:5: ( ( rule__Modifier__ReferenceAssignment_1_2 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2);
+        // InternalFormalML.g:60648:5: ( ( rule__Modifier__ReferenceAssignment_1_2 ) )
+        // InternalFormalML.g:60649:6: ( rule__Modifier__ReferenceAssignment_1_2 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModifierAccess().getReferenceAssignment_1_2()); 
+        }
+        // InternalFormalML.g:60650:6: ( rule__Modifier__ReferenceAssignment_1_2 )
+        // InternalFormalML.g:60650:7: rule__Modifier__ReferenceAssignment_1_2
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Modifier__ReferenceAssignment_1_2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1029_InternalFormalML
+
+    // $ANTLR start synpred1030_InternalFormalML
+    public final void synpred1030_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60655:3: ( ({...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) ) ) )
+        // InternalFormalML.g:60655:3: ({...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) ) )
+        {
+        // InternalFormalML.g:60655:3: ({...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) ) )
+        // InternalFormalML.g:60656:4: {...}? => ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1030_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3)");
+        }
+        // InternalFormalML.g:60656:104: ( ( ( rule__Modifier__VolatileAssignment_1_3 ) ) )
+        // InternalFormalML.g:60657:5: ( ( rule__Modifier__VolatileAssignment_1_3 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3);
+        // InternalFormalML.g:60663:5: ( ( rule__Modifier__VolatileAssignment_1_3 ) )
+        // InternalFormalML.g:60664:6: ( rule__Modifier__VolatileAssignment_1_3 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getModifierAccess().getVolatileAssignment_1_3()); 
+        }
+        // InternalFormalML.g:60665:6: ( rule__Modifier__VolatileAssignment_1_3 )
+        // InternalFormalML.g:60665:7: rule__Modifier__VolatileAssignment_1_3
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Modifier__VolatileAssignment_1_3();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1030_InternalFormalML
+
+    // $ANTLR start synpred1031_InternalFormalML
+    public final void synpred1031_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60699:2: ( rule__Modifier__UnorderedGroup_1__1 )
+        // InternalFormalML.g:60699:2: rule__Modifier__UnorderedGroup_1__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Modifier__UnorderedGroup_1__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1031_InternalFormalML
+
+    // $ANTLR start synpred1032_InternalFormalML
+    public final void synpred1032_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60711:2: ( rule__Modifier__UnorderedGroup_1__2 )
+        // InternalFormalML.g:60711:2: rule__Modifier__UnorderedGroup_1__2
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Modifier__UnorderedGroup_1__2();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1032_InternalFormalML
+
+    // $ANTLR start synpred1033_InternalFormalML
+    public final void synpred1033_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60723:2: ( rule__Modifier__UnorderedGroup_1__3 )
+        // InternalFormalML.g:60723:2: rule__Modifier__UnorderedGroup_1__3
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Modifier__UnorderedGroup_1__3();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1033_InternalFormalML
+
+    // $ANTLR start synpred1034_InternalFormalML
+    public final void synpred1034_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60735:2: ( rule__Modifier__UnorderedGroup_1__4 )
+        // InternalFormalML.g:60735:2: rule__Modifier__UnorderedGroup_1__4
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Modifier__UnorderedGroup_1__4();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1034_InternalFormalML
+
+    // $ANTLR start synpred1035_InternalFormalML
+    public final void synpred1035_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60759:2: ( rule__Variable__UnorderedGroup_0__0 )
+        // InternalFormalML.g:60759:2: rule__Variable__UnorderedGroup_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Variable__UnorderedGroup_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1035_InternalFormalML
+
+    // $ANTLR start synpred1036_InternalFormalML
+    public final void synpred1036_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60774:3: ( ({...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) ) ) )
+        // InternalFormalML.g:60774:3: ({...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) ) )
+        {
+        // InternalFormalML.g:60774:3: ({...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) ) )
+        // InternalFormalML.g:60775:4: {...}? => ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1036_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0)");
+        }
+        // InternalFormalML.g:60775:104: ( ( ( rule__Variable__VisibilityAssignment_0_0 ) ) )
+        // InternalFormalML.g:60776:5: ( ( rule__Variable__VisibilityAssignment_0_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0);
+        // InternalFormalML.g:60782:5: ( ( rule__Variable__VisibilityAssignment_0_0 ) )
+        // InternalFormalML.g:60783:6: ( rule__Variable__VisibilityAssignment_0_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getVariableAccess().getVisibilityAssignment_0_0()); 
+        }
+        // InternalFormalML.g:60784:6: ( rule__Variable__VisibilityAssignment_0_0 )
+        // InternalFormalML.g:60784:7: rule__Variable__VisibilityAssignment_0_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Variable__VisibilityAssignment_0_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1036_InternalFormalML
+
+    // $ANTLR start synpred1037_InternalFormalML
+    public final void synpred1037_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60818:2: ( rule__Variable__UnorderedGroup_0__1 )
+        // InternalFormalML.g:60818:2: rule__Variable__UnorderedGroup_0__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Variable__UnorderedGroup_0__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1037_InternalFormalML
+
+    // $ANTLR start synpred1038_InternalFormalML
+    public final void synpred1038_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60842:2: ( rule__VariablePublic__UnorderedGroup_1__0 )
+        // InternalFormalML.g:60842:2: rule__VariablePublic__UnorderedGroup_1__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePublic__UnorderedGroup_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1038_InternalFormalML
+
+    // $ANTLR start synpred1039_InternalFormalML
+    public final void synpred1039_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60857:3: ( ({...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) ) ) )
+        // InternalFormalML.g:60857:3: ({...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) ) )
+        {
+        // InternalFormalML.g:60857:3: ({...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) ) )
+        // InternalFormalML.g:60858:4: {...}? => ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1039_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:60858:110: ( ( ( rule__VariablePublic__Alternatives_1_0 ) ) )
+        // InternalFormalML.g:60859:5: ( ( rule__VariablePublic__Alternatives_1_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:60865:5: ( ( rule__VariablePublic__Alternatives_1_0 ) )
+        // InternalFormalML.g:60866:6: ( rule__VariablePublic__Alternatives_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getVariablePublicAccess().getAlternatives_1_0()); 
+        }
+        // InternalFormalML.g:60867:6: ( rule__VariablePublic__Alternatives_1_0 )
+        // InternalFormalML.g:60867:7: rule__VariablePublic__Alternatives_1_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePublic__Alternatives_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1039_InternalFormalML
+
+    // $ANTLR start synpred1040_InternalFormalML
+    public final void synpred1040_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60901:2: ( rule__VariablePublic__UnorderedGroup_1__1 )
+        // InternalFormalML.g:60901:2: rule__VariablePublic__UnorderedGroup_1__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePublic__UnorderedGroup_1__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1040_InternalFormalML
+
+    // $ANTLR start synpred1041_InternalFormalML
+    public final void synpred1041_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60925:2: ( rule__VariableProtected__UnorderedGroup_1__0 )
+        // InternalFormalML.g:60925:2: rule__VariableProtected__UnorderedGroup_1__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariableProtected__UnorderedGroup_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1041_InternalFormalML
+
+    // $ANTLR start synpred1042_InternalFormalML
+    public final void synpred1042_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60940:3: ( ({...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) ) ) )
+        // InternalFormalML.g:60940:3: ({...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) ) )
+        {
+        // InternalFormalML.g:60940:3: ({...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) ) )
+        // InternalFormalML.g:60941:4: {...}? => ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1042_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:60941:113: ( ( ( rule__VariableProtected__Alternatives_1_0 ) ) )
+        // InternalFormalML.g:60942:5: ( ( rule__VariableProtected__Alternatives_1_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:60948:5: ( ( rule__VariableProtected__Alternatives_1_0 ) )
+        // InternalFormalML.g:60949:6: ( rule__VariableProtected__Alternatives_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getVariableProtectedAccess().getAlternatives_1_0()); 
+        }
+        // InternalFormalML.g:60950:6: ( rule__VariableProtected__Alternatives_1_0 )
+        // InternalFormalML.g:60950:7: rule__VariableProtected__Alternatives_1_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariableProtected__Alternatives_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1042_InternalFormalML
+
+    // $ANTLR start synpred1043_InternalFormalML
+    public final void synpred1043_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:60984:2: ( rule__VariableProtected__UnorderedGroup_1__1 )
+        // InternalFormalML.g:60984:2: rule__VariableProtected__UnorderedGroup_1__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariableProtected__UnorderedGroup_1__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1043_InternalFormalML
+
+    // $ANTLR start synpred1044_InternalFormalML
+    public final void synpred1044_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61008:2: ( rule__VariablePrivate__UnorderedGroup_1__0 )
+        // InternalFormalML.g:61008:2: rule__VariablePrivate__UnorderedGroup_1__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePrivate__UnorderedGroup_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1044_InternalFormalML
+
+    // $ANTLR start synpred1045_InternalFormalML
+    public final void synpred1045_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61023:3: ( ({...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) ) ) )
+        // InternalFormalML.g:61023:3: ({...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) ) )
+        {
+        // InternalFormalML.g:61023:3: ({...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) ) )
+        // InternalFormalML.g:61024:4: {...}? => ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1045_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:61024:111: ( ( ( rule__VariablePrivate__Alternatives_1_0 ) ) )
+        // InternalFormalML.g:61025:5: ( ( rule__VariablePrivate__Alternatives_1_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:61031:5: ( ( rule__VariablePrivate__Alternatives_1_0 ) )
+        // InternalFormalML.g:61032:6: ( rule__VariablePrivate__Alternatives_1_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getVariablePrivateAccess().getAlternatives_1_0()); 
+        }
+        // InternalFormalML.g:61033:6: ( rule__VariablePrivate__Alternatives_1_0 )
+        // InternalFormalML.g:61033:7: rule__VariablePrivate__Alternatives_1_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePrivate__Alternatives_1_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1045_InternalFormalML
+
+    // $ANTLR start synpred1046_InternalFormalML
+    public final void synpred1046_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61067:2: ( rule__VariablePrivate__UnorderedGroup_1__1 )
+        // InternalFormalML.g:61067:2: rule__VariablePrivate__UnorderedGroup_1__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__VariablePrivate__UnorderedGroup_1__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1046_InternalFormalML
+
+    // $ANTLR start synpred1047_InternalFormalML
+    public final void synpred1047_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61091:2: ( rule__Buffer__UnorderedGroup_0__0 )
+        // InternalFormalML.g:61091:2: rule__Buffer__UnorderedGroup_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Buffer__UnorderedGroup_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1047_InternalFormalML
+
+    // $ANTLR start synpred1048_InternalFormalML
+    public final void synpred1048_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61106:3: ( ({...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) ) ) )
+        // InternalFormalML.g:61106:3: ({...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) ) )
+        {
+        // InternalFormalML.g:61106:3: ({...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) ) )
+        // InternalFormalML.g:61107:4: {...}? => ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1048_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0)");
+        }
+        // InternalFormalML.g:61107:102: ( ( ( rule__Buffer__VisibilityAssignment_0_0 ) ) )
+        // InternalFormalML.g:61108:5: ( ( rule__Buffer__VisibilityAssignment_0_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0);
+        // InternalFormalML.g:61114:5: ( ( rule__Buffer__VisibilityAssignment_0_0 ) )
+        // InternalFormalML.g:61115:6: ( rule__Buffer__VisibilityAssignment_0_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getBufferAccess().getVisibilityAssignment_0_0()); 
+        }
+        // InternalFormalML.g:61116:6: ( rule__Buffer__VisibilityAssignment_0_0 )
+        // InternalFormalML.g:61116:7: rule__Buffer__VisibilityAssignment_0_0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Buffer__VisibilityAssignment_0_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1048_InternalFormalML
+
+    // $ANTLR start synpred1049_InternalFormalML
+    public final void synpred1049_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61150:2: ( rule__Buffer__UnorderedGroup_0__1 )
+        // InternalFormalML.g:61150:2: rule__Buffer__UnorderedGroup_0__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__Buffer__UnorderedGroup_0__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1049_InternalFormalML
+
+    // $ANTLR start synpred1050_InternalFormalML
+    public final void synpred1050_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61174:2: ( rule__InputComStatement__UnorderedGroup_3__0 )
+        // InternalFormalML.g:61174:2: rule__InputComStatement__UnorderedGroup_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__InputComStatement__UnorderedGroup_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1050_InternalFormalML
+
+    // $ANTLR start synpred1051_InternalFormalML
+    public final void synpred1051_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61189:3: ( ({...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) ) ) )
+        // InternalFormalML.g:61189:3: ({...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) ) )
+        {
+        // InternalFormalML.g:61189:3: ({...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) ) )
+        // InternalFormalML.g:61190:4: {...}? => ( ( ( rule__InputComStatement__Group_3_0__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1051_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0)");
+        }
+        // InternalFormalML.g:61190:113: ( ( ( rule__InputComStatement__Group_3_0__0 ) ) )
+        // InternalFormalML.g:61191:5: ( ( rule__InputComStatement__Group_3_0__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0);
+        // InternalFormalML.g:61197:5: ( ( rule__InputComStatement__Group_3_0__0 ) )
+        // InternalFormalML.g:61198:6: ( rule__InputComStatement__Group_3_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getInputComStatementAccess().getGroup_3_0()); 
+        }
+        // InternalFormalML.g:61199:6: ( rule__InputComStatement__Group_3_0__0 )
+        // InternalFormalML.g:61199:7: rule__InputComStatement__Group_3_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__InputComStatement__Group_3_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1051_InternalFormalML
+
+    // $ANTLR start synpred1052_InternalFormalML
+    public final void synpred1052_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61233:2: ( rule__InputComStatement__UnorderedGroup_3__1 )
+        // InternalFormalML.g:61233:2: rule__InputComStatement__UnorderedGroup_3__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__InputComStatement__UnorderedGroup_3__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1052_InternalFormalML
+
+    // $ANTLR start synpred1053_InternalFormalML
+    public final void synpred1053_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61257:2: ( rule__OutputComStatement__UnorderedGroup_3__0 )
+        // InternalFormalML.g:61257:2: rule__OutputComStatement__UnorderedGroup_3__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__OutputComStatement__UnorderedGroup_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1053_InternalFormalML
+
+    // $ANTLR start synpred1054_InternalFormalML
+    public final void synpred1054_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61272:3: ( ({...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) ) ) )
+        // InternalFormalML.g:61272:3: ({...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) ) )
+        {
+        // InternalFormalML.g:61272:3: ({...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) ) )
+        // InternalFormalML.g:61273:4: {...}? => ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred1054_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0)");
+        }
+        // InternalFormalML.g:61273:114: ( ( ( rule__OutputComStatement__Group_3_0__0 ) ) )
+        // InternalFormalML.g:61274:5: ( ( rule__OutputComStatement__Group_3_0__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0);
+        // InternalFormalML.g:61280:5: ( ( rule__OutputComStatement__Group_3_0__0 ) )
+        // InternalFormalML.g:61281:6: ( rule__OutputComStatement__Group_3_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getOutputComStatementAccess().getGroup_3_0()); 
+        }
+        // InternalFormalML.g:61282:6: ( rule__OutputComStatement__Group_3_0__0 )
+        // InternalFormalML.g:61282:7: rule__OutputComStatement__Group_3_0__0
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__OutputComStatement__Group_3_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred1054_InternalFormalML
+
+    // $ANTLR start synpred1055_InternalFormalML
+    public final void synpred1055_InternalFormalML_fragment() throws RecognitionException {   
+        // InternalFormalML.g:61316:2: ( rule__OutputComStatement__UnorderedGroup_3__1 )
+        // InternalFormalML.g:61316:2: rule__OutputComStatement__UnorderedGroup_3__1
+        {
+        pushFollow(FollowSets000.FOLLOW_2);
+        rule__OutputComStatement__UnorderedGroup_3__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1055_InternalFormalML
+
+}
+
+@SuppressWarnings("all")
+public class InternalFormalMLParser extends InternalFormalMLParser3 {
+
+
+
+        public InternalFormalMLParser(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+        public InternalFormalMLParser(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+             
+        }
+        
+
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src/.gitkeep b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/src/.gitkeep
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ide/xtend-gen/.gitkeep b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/xtend-gen/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ide/xtend-gen/.gitkeep
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.classpath b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.project b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.project
new file mode 100644
index 0000000..06fe560
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.formalml.xtext.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.settings/org.eclipse.core.resources.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.settings/org.eclipse.jdt.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.settings/org.eclipse.m2e.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/META-INF/MANIFEST.MF b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f19e48c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.formalml.xtext.tests; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.formalml.xtext,
+ org.eclipse.efm.formalml.ecore,
+ org.junit;bundle-version="4.7.0",
+ org.eclipse.xtext.junit4,
+ org.eclipse.xtext.xbase.junit,
+ org.eclipse.xtext.xbase.lib
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.formalml.xtext.tests
+Import-Package: org.hamcrest.core,
+ org.junit;version="4.5.0",
+ org.junit.runners.model;version="4.5.0",
+ org.junit.runner;version="4.5.0",
+ org.junit.runners;version="4.5.0",
+ org.junit.runner.manipulation;version="4.5.0",
+ org.junit.runner.notification;version="4.5.0"
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/README.md b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/README.md
new file mode 100644
index 0000000..b929bb6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/README.md
@@ -0,0 +1,3 @@
+# EFM, Formal Modeling Language, FormalML, Xtext based Editor Tests
+
+Model Ecore for Xtext Editor
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/about.html b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/build.properties b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/build.properties
new file mode 100644
index 0000000..db8fe81
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/pom.xml b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/pom.xml
new file mode 100644
index 0000000..8a38dd4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.xlia</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.formalml.xtext.tests</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.formalml.xtext.tests</name>
+	<description>This plug-in contains the xLIA's Xtext based editor core tests.</description>
+
+	
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/src-gen/org/eclipse/efm/formalml/xtext/tests/FormalMLInjectorProvider.java b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/src-gen/org/eclipse/efm/formalml/xtext/tests/FormalMLInjectorProvider.java
new file mode 100644
index 0000000..08bab39
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/src-gen/org/eclipse/efm/formalml/xtext/tests/FormalMLInjectorProvider.java
@@ -0,0 +1,75 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.tests;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.efm.formalml.xtext.FormalMLRuntimeModule;
+import org.eclipse.efm.formalml.xtext.FormalMLStandaloneSetup;
+import org.eclipse.xtext.junit4.GlobalRegistries;
+import org.eclipse.xtext.junit4.GlobalRegistries.GlobalStateMemento;
+import org.eclipse.xtext.junit4.IInjectorProvider;
+import org.eclipse.xtext.junit4.IRegistryConfigurator;
+
+public class FormalMLInjectorProvider implements IInjectorProvider, IRegistryConfigurator {
+
+	protected GlobalStateMemento stateBeforeInjectorCreation;
+	protected GlobalStateMemento stateAfterInjectorCreation;
+	protected Injector injector;
+
+	static {
+		GlobalRegistries.initializeDefaults();
+	}
+
+	@Override
+	public Injector getInjector() {
+		if (injector == null) {
+			stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+			this.injector = internalCreateInjector();
+			stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+		}
+		return injector;
+	}
+
+	protected Injector internalCreateInjector() {
+		return new FormalMLStandaloneSetup() {
+			@Override
+			public Injector createInjector() {
+				return Guice.createInjector(createRuntimeModule());
+			}
+		}.createInjectorAndDoEMFRegistration();
+	}
+
+	protected FormalMLRuntimeModule createRuntimeModule() {
+		// make it work also with Maven/Tycho and OSGI
+		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=493672
+		return new FormalMLRuntimeModule() {
+			@Override
+			public ClassLoader bindClassLoaderToInstance() {
+				return FormalMLInjectorProvider.class
+						.getClassLoader();
+			}
+		};
+	}
+
+	@Override
+	public void restoreRegistry() {
+		stateBeforeInjectorCreation.restoreGlobalState();
+	}
+
+	@Override
+	public void setupRegistry() {
+		getInjector();
+		stateAfterInjectorCreation.restoreGlobalState();
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/src/org/eclipse/efm/formalml/xtext/tests/FormalMLParsingTest.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/src/org/eclipse/efm/formalml/xtext/tests/FormalMLParsingTest.xtend
new file mode 100644
index 0000000..7fa08ce
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/src/org/eclipse/efm/formalml/xtext/tests/FormalMLParsingTest.xtend
@@ -0,0 +1,39 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.tests
+
+import com.google.inject.Inject
+import org.eclipse.efm.ecore.formalml.XliaModel
+import org.eclipse.xtext.junit4.InjectWith
+import org.eclipse.xtext.junit4.XtextRunner
+import org.eclipse.xtext.junit4.util.ParseHelper
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(XtextRunner)
+@InjectWith(FormalMLInjectorProvider)
+class FormalMLParsingTest{
+
+	@Inject
+	ParseHelper<XliaModel> parseHelper
+
+	@Test 
+	def void loadModel() {
+		val result = parseHelper.parse('''
+			Hello Xtext!
+		''')
+		Assert.assertNotNull(result)
+	}
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/xtend-gen/.FormalMLParsingTest.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/xtend-gen/.FormalMLParsingTest.xtendbin
new file mode 100644
index 0000000..03fc7ee
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/xtend-gen/.FormalMLParsingTest.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.tests/xtend-gen/org/eclipse/efm/formalml/xtext/tests/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/xtend-gen/org/eclipse/efm/formalml/xtext/tests/.gitignore
new file mode 100644
index 0000000..7572c7d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.tests/xtend-gen/org/eclipse/efm/formalml/xtext/tests/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/FormalMLParsingTest.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.classpath b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.project b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.project
new file mode 100644
index 0000000..6028ab5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.formalml.xtext.ui.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.settings/org.eclipse.core.resources.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.settings/org.eclipse.jdt.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.settings/org.eclipse.m2e.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/META-INF/MANIFEST.MF b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2a084ed
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.formalml.xtext.ui.tests; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.formalml.xtext.ui,
+ org.eclipse.efm.formalml.ecore,
+ org.junit;bundle-version="4.7.0",
+ org.eclipse.xtext.junit4,
+ org.eclipse.xtext.xbase.junit,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.workbench;resolution:=optional
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.formalml.xtext.ui.tests
+Import-Package: org.hamcrest.core,
+ org.junit;version="4.5.0",
+ org.junit.runners.model;version="4.5.0",
+ org.junit.runner;version="4.5.0",
+ org.junit.runners;version="4.5.0",
+ org.junit.runner.manipulation;version="4.5.0",
+ org.junit.runner.notification;version="4.5.0"
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/README.md b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/README.md
new file mode 100644
index 0000000..f44a689
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/README.md
@@ -0,0 +1,3 @@
+# EFM, Formal Modeling Language, FormalML, Xtext based Editor UI Tests
+
+Model Ecore for Xtext Editor
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/about.html b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/build.properties b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/build.properties
new file mode 100644
index 0000000..db8fe81
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/pom.xml b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/pom.xml
new file mode 100644
index 0000000..e4e8e90
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.xlia</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.formalml.xtext.ui.tests</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.formalml.xtext.ui.tests</name>
+	<description>This plug-in contains the xLIA's Xtext based editor UI tests.</description>
+	
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/src-gen/org/eclipse/efm/formalml/xtext/ui/tests/FormalMLUiInjectorProvider.java b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/src-gen/org/eclipse/efm/formalml/xtext/ui/tests/FormalMLUiInjectorProvider.java
new file mode 100644
index 0000000..e03c4c8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/src-gen/org/eclipse/efm/formalml/xtext/ui/tests/FormalMLUiInjectorProvider.java
@@ -0,0 +1,26 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui.tests;
+
+import com.google.inject.Injector;
+import org.eclipse.efm.formalml.xtext.ui.internal.XtextActivator;
+import org.eclipse.xtext.junit4.IInjectorProvider;
+
+public class FormalMLUiInjectorProvider implements IInjectorProvider {
+
+	@Override
+	public Injector getInjector() {
+		return XtextActivator.getInstance().getInjector("org.eclipse.efm.formalml.xtext.FormalML");
+	}
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/src/.gitkeep b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/src/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/src/.gitkeep
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/xtend-gen/.gitkeep b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/xtend-gen/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui.tests/xtend-gen/.gitkeep
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.classpath b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.project b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.project
new file mode 100644
index 0000000..9a6cd53
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.formalml.xtext.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.settings/org.eclipse.core.resources.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.settings/org.eclipse.jdt.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.settings/org.eclipse.m2e.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/META-INF/MANIFEST.MF b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..42bd795
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.formalml.xtext.ui; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.formalml.xtext,
+ org.eclipse.efm.formalml.xtext.ide,
+ org.eclipse.efm.formalml.ecore,
+ org.eclipse.xtext.ui,
+ org.eclipse.xtext.ui.shared,
+ org.eclipse.xtext.ui.codetemplates.ui,
+ org.eclipse.ui.editors;bundle-version="3.5.0",
+ org.eclipse.ui.ide;bundle-version="3.5.0",
+ org.eclipse.ui,
+ org.eclipse.compare,
+ org.eclipse.xtext.builder,
+ org.eclipse.xtend.lib;resolution:=optional,
+ org.eclipse.xtext.xbase.lib
+Import-Package: org.apache.log4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.formalml.xtext.ui.quickfix,
+ org.eclipse.efm.formalml.xtext.ui.contentassist,
+ org.eclipse.efm.formalml.xtext.ui.internal
+Bundle-Activator: org.eclipse.efm.formalml.xtext.ui.internal.XtextActivator
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/README.md b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/README.md
new file mode 100644
index 0000000..498134c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/README.md
@@ -0,0 +1,3 @@
+# EFM, Formal Modeling Language, FormalML, Xtext based Editor UI
+
+Model Ecore for Xtext Editor
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/about.html b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/build.properties b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/build.properties
new file mode 100644
index 0000000..0ed3fca
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/build.properties
@@ -0,0 +1,30 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/,\
+               plugin.xml
+additional.bundles = org.eclipse.xtext.xbase,\
+                     org.eclipse.xtext.common.types,\
+                     org.eclipse.xtext.xtext.generator,\
+                     org.eclipse.emf.codegen.ecore,\
+                     org.eclipse.emf.mwe.utils,\
+                     org.eclipse.emf.mwe2.launch,\
+                     org.eclipse.emf.mwe2.lib,\
+                     org.objectweb.asm,\
+                     org.apache.commons.logging,\
+                     org.apache.log4j,\
+                     com.ibm.icu,\
+                     org.eclipse.xtext.generator
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/Class.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/Class.gif
new file mode 100644
index 0000000..7c33c76
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/Class.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/Metaclass.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/Metaclass.gif
new file mode 100644
index 0000000..d022d2e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/Metaclass.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/Property.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/Property.gif
new file mode 100644
index 0000000..99b7fa6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/Property.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ActionExecutionSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ActionExecutionSpecification.gif
new file mode 100644
index 0000000..ccfb3c8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ActionExecutionSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Activity.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Activity.gif
new file mode 100644
index 0000000..698a6e4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Activity.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/BehaviorExecutionSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/BehaviorExecutionSpecification.gif
new file mode 100644
index 0000000..339e41f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/BehaviorExecutionSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Block.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Block.gif
new file mode 100644
index 0000000..bc5ab83
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Block.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/BlockProperty.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/BlockProperty.gif
new file mode 100644
index 0000000..0e14c65
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/BlockProperty.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/CallBehaviorAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/CallBehaviorAction.gif
new file mode 100644
index 0000000..ea02947
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/CallBehaviorAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ChoiceType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ChoiceType.gif
new file mode 100644
index 0000000..3e7750a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ChoiceType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Class.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Class.gif
new file mode 100644
index 0000000..7c33c76
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Class.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ConnectableElementTemplateParameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ConnectableElementTemplateParameter.gif
new file mode 100644
index 0000000..f26173e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ConnectableElementTemplateParameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ConnectorEnd.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ConnectorEnd.gif
new file mode 100644
index 0000000..a23b0b0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ConnectorEnd.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Connector_assembly.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Connector_assembly.gif
new file mode 100644
index 0000000..ee13f29
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Connector_assembly.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Constraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Constraint.gif
new file mode 100644
index 0000000..eed6ace
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Constraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ConstraintBlock.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ConstraintBlock.gif
new file mode 100644
index 0000000..3e7750a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ConstraintBlock.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/DataType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/DataType.gif
new file mode 100644
index 0000000..b4337de
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/DataType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Activity.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Activity.gif
new file mode 100644
index 0000000..7667c58
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Activity.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_BlockDefinition.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_BlockDefinition.gif
new file mode 100644
index 0000000..103060a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_BlockDefinition.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Class.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Class.gif
new file mode 100644
index 0000000..6d18ce4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Class.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Communication.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Communication.gif
new file mode 100644
index 0000000..db1445e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Communication.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Component.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Component.gif
new file mode 100644
index 0000000..75f0226
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Component.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_CompositeStructure.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_CompositeStructure.gif
new file mode 100644
index 0000000..b2c50eb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_CompositeStructure.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_InteractionOverview.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_InteractionOverview.gif
new file mode 100644
index 0000000..0a77dec
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_InteractionOverview.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_InternalBlock.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_InternalBlock.gif
new file mode 100644
index 0000000..ca02c19
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_InternalBlock.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Package.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Package.gif
new file mode 100644
index 0000000..be6068e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Package.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Profile.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Profile.gif
new file mode 100644
index 0000000..ca075d7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Profile.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Requirement.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Requirement.gif
new file mode 100644
index 0000000..f87c907
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Requirement.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Sequence.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Sequence.gif
new file mode 100644
index 0000000..a44f944
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Sequence.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_StateMachine.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_StateMachine.gif
new file mode 100644
index 0000000..baad798
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_StateMachine.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Timing.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Timing.gif
new file mode 100644
index 0000000..d765189
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_Timing.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_UML.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_UML.gif
new file mode 100644
index 0000000..6d18ce4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_UML.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_UseCase.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_UseCase.gif
new file mode 100644
index 0000000..0451c5e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Diagram_UseCase.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Dimension.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Dimension.gif
new file mode 100644
index 0000000..eb861a0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Dimension.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Enumeration.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Enumeration.gif
new file mode 100644
index 0000000..c7573bd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Enumeration.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/EnumerationLiteral.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/EnumerationLiteral.gif
new file mode 100644
index 0000000..4967b56
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/EnumerationLiteral.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ExecutionEnvironment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ExecutionEnvironment.gif
new file mode 100644
index 0000000..d05a59e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ExecutionEnvironment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Expression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Expression.gif
new file mode 100644
index 0000000..4c5d117
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Expression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FinalState.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FinalState.gif
new file mode 100644
index 0000000..d3972a3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FinalState.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort.gif
new file mode 100644
index 0000000..78ed7ce
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort_IN.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort_IN.gif
new file mode 100644
index 0000000..6e45798
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort_IN.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort_INOUT.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort_INOUT.gif
new file mode 100644
index 0000000..78ed7ce
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort_INOUT.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort_OUT.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort_OUT.gif
new file mode 100644
index 0000000..1b7c2cb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowPort_OUT.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowProperty.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowProperty.gif
new file mode 100644
index 0000000..77c0e22
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowProperty.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowProperty_IN.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowProperty_IN.gif
new file mode 100644
index 0000000..dcf0b98
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowProperty_IN.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowProperty_OUT.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowProperty_OUT.gif
new file mode 100644
index 0000000..1630535
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowProperty_OUT.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowSpecification.gif
new file mode 100644
index 0000000..1df635f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FlowSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FunctionBehavior.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FunctionBehavior.gif
new file mode 100644
index 0000000..ca01f01
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/FunctionBehavior.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/InputPin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/InputPin.gif
new file mode 100644
index 0000000..e03d0b5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/InputPin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/InstanceSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/InstanceSpecification.gif
new file mode 100644
index 0000000..862dd9e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/InstanceSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Interface.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Interface.gif
new file mode 100644
index 0000000..8032f5e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Interface.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/IntervalConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/IntervalConstraint.gif
new file mode 100644
index 0000000..7416f5c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/IntervalConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/IntervalType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/IntervalType.gif
new file mode 100644
index 0000000..8032f5e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/IntervalType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralBoolean.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralBoolean.gif
new file mode 100644
index 0000000..656797f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralBoolean.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralInteger.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralInteger.gif
new file mode 100644
index 0000000..3bd99b3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralInteger.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralNull.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralNull.gif
new file mode 100644
index 0000000..d28f9cc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralNull.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralReal.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralReal.gif
new file mode 100644
index 0000000..8bbd722
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralReal.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralString.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralString.gif
new file mode 100644
index 0000000..ef367ef
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LiteralString.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LoopStatement.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LoopStatement.gif
new file mode 100644
index 0000000..ccfb3c8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/LoopStatement.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MessageFound.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MessageFound.gif
new file mode 100644
index 0000000..b9afd4a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MessageFound.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MessageLost.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MessageLost.gif
new file mode 100644
index 0000000..6528f2a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MessageLost.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Metaclass.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Metaclass.gif
new file mode 100644
index 0000000..d022d2e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Metaclass.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Model.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Model.gif
new file mode 100644
index 0000000..36a276d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Model.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MultiView.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MultiView.gif
new file mode 100644
index 0000000..2e85ba1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MultiView.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MultiplicityHandler.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MultiplicityHandler.gif
new file mode 100644
index 0000000..f1f0195
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/MultiplicityHandler.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/OpaqueBehavior.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/OpaqueBehavior.gif
new file mode 100644
index 0000000..a22358e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/OpaqueBehavior.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Operation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Operation.gif
new file mode 100644
index 0000000..482a4d5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Operation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/OrganizationUnit.png b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/OrganizationUnit.png
new file mode 100644
index 0000000..4be76c1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/OrganizationUnit.png
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/OutputPin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/OutputPin.gif
new file mode 100644
index 0000000..063151f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/OutputPin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Package.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Package.gif
new file mode 100644
index 0000000..f844ade
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Package.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ParameterSet.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ParameterSet.gif
new file mode 100644
index 0000000..0667887
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ParameterSet.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_in.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_in.gif
new file mode 100644
index 0000000..d12cafa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_in.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_inout.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_inout.gif
new file mode 100644
index 0000000..87a6574
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_inout.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_out.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_out.gif
new file mode 100644
index 0000000..aeea60e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_out.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_return.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_return.gif
new file mode 100644
index 0000000..4a421c2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Parameter_return.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Port.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Port.gif
new file mode 100644
index 0000000..e602d05
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Port.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/PortGroup_OUT.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/PortGroup_OUT.gif
new file mode 100644
index 0000000..67d31fc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/PortGroup_OUT.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/PrimitiveType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/PrimitiveType.gif
new file mode 100644
index 0000000..f516ab3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/PrimitiveType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Property.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Property.gif
new file mode 100644
index 0000000..99b7fa6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Property.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate.gif
new file mode 100644
index 0000000..1df8f27
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_choice.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_choice.gif
new file mode 100644
index 0000000..7841957
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_choice.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_deepHistory.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_deepHistory.gif
new file mode 100644
index 0000000..1aa02f7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_deepHistory.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_entryPoint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_entryPoint.gif
new file mode 100644
index 0000000..d3050fb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_entryPoint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_exitPoint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_exitPoint.gif
new file mode 100644
index 0000000..8643925
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_exitPoint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_fork.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_fork.gif
new file mode 100644
index 0000000..fff0cfe
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_fork.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_initial.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_initial.gif
new file mode 100644
index 0000000..169e089
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_initial.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_join.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_join.gif
new file mode 100644
index 0000000..a5d1ef8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_join.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_junction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_junction.gif
new file mode 100644
index 0000000..edb5653
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_junction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_shallowHistory.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_shallowHistory.gif
new file mode 100644
index 0000000..32b56a4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_shallowHistory.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_terminate.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_terminate.gif
new file mode 100644
index 0000000..9181fb9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Pseudostate_terminate.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/QualifierValue.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/QualifierValue.gif
new file mode 100644
index 0000000..48f39c4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/QualifierValue.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ReceiveSignalEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ReceiveSignalEvent.gif
new file mode 100644
index 0000000..c3be49c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ReceiveSignalEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Refine.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Refine.gif
new file mode 100644
index 0000000..aa30150
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Refine.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Region.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Region.gif
new file mode 100644
index 0000000..2c9c14c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Region.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ReplyAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ReplyAction.gif
new file mode 100644
index 0000000..1cef6b7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ReplyAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Requirement.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Requirement.gif
new file mode 100644
index 0000000..50618e0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Requirement.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Signal.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Signal.gif
new file mode 100644
index 0000000..9a0860f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Signal.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/SignalEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/SignalEvent.gif
new file mode 100644
index 0000000..691be51
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/SignalEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StartClassifierBehaviorAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StartClassifierBehaviorAction.gif
new file mode 100644
index 0000000..cda0f6e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StartClassifierBehaviorAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/State.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/State.gif
new file mode 100644
index 0000000..5a2f907
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/State.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StateMachine.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StateMachine.gif
new file mode 100644
index 0000000..b58ee23
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StateMachine.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/State_start.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/State_start.gif
new file mode 100644
index 0000000..a4dd552
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/State_start.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StringExpression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StringExpression.gif
new file mode 100644
index 0000000..6c0b28e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StringExpression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StructureType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StructureType.gif
new file mode 100644
index 0000000..145e5d5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/StructureType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/TestCase.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/TestCase.gif
new file mode 100644
index 0000000..ac29611
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/TestCase.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/TimeConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/TimeConstraint.gif
new file mode 100644
index 0000000..8bd27e0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/TimeConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/TimeExpression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/TimeExpression.gif
new file mode 100644
index 0000000..5c9d232
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/TimeExpression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition.gif
new file mode 100644
index 0000000..938aeed
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition_external.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition_external.gif
new file mode 100644
index 0000000..db357d5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition_external.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition_internal.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition_internal.gif
new file mode 100644
index 0000000..ae55cda
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition_internal.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition_local.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition_local.gif
new file mode 100644
index 0000000..65b7e1b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Transition_local.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/UnionType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/UnionType.gif
new file mode 100644
index 0000000..33bfb26
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/UnionType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Variable.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Variable.gif
new file mode 100644
index 0000000..cb47d00
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/Variable.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ViewPoint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ViewPoint.gif
new file mode 100644
index 0000000..a1cd285
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/ViewPoint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/range.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/range.gif
new file mode 100644
index 0000000..2121fcb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/range.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_in.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_in.gif
new file mode 100644
index 0000000..f2dfacb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_in.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_inout.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_inout.gif
new file mode 100644
index 0000000..9b29810
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_inout.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_out.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_out.gif
new file mode 100644
index 0000000..0f139f3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_out.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_undefined.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_undefined.gif
new file mode 100644
index 0000000..91b89b8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/rt_message_undefined.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/zero.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/zero.gif
new file mode 100644
index 0000000..22540f7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/fml/zero.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Abstraction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Abstraction.gif
new file mode 100644
index 0000000..d01b567
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Abstraction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AcceptCallAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AcceptCallAction.gif
new file mode 100644
index 0000000..bdf16fe
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AcceptCallAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AcceptEventAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AcceptEventAction.gif
new file mode 100644
index 0000000..0eb6ab8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AcceptEventAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActionExecutionSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActionExecutionSpecification.gif
new file mode 100644
index 0000000..e46fc51
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActionExecutionSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActionInputPin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActionInputPin.gif
new file mode 100644
index 0000000..6404367
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActionInputPin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Activity.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Activity.gif
new file mode 100644
index 0000000..7d019de
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Activity.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActivityFinalNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActivityFinalNode.gif
new file mode 100644
index 0000000..083afef
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActivityFinalNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActivityParameterNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActivityParameterNode.gif
new file mode 100644
index 0000000..0073726
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActivityParameterNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActivityPartition.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActivityPartition.gif
new file mode 100644
index 0000000..0985ca8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ActivityPartition.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Actor.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Actor.gif
new file mode 100644
index 0000000..09a2a29
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Actor.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AddStructuralFeatureValueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AddStructuralFeatureValueAction.gif
new file mode 100644
index 0000000..afe6872
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AddStructuralFeatureValueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AddVariableValueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AddVariableValueAction.gif
new file mode 100644
index 0000000..7cc6624
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AddVariableValueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AnyReceiveEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AnyReceiveEvent.gif
new file mode 100644
index 0000000..521ea7d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AnyReceiveEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Artifact.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Artifact.gif
new file mode 100644
index 0000000..37cb7f0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Artifact.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association.gif
new file mode 100644
index 0000000..cebaea7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AssociationClass.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AssociationClass.gif
new file mode 100644
index 0000000..ec949e9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/AssociationClass.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association_composite.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association_composite.gif
new file mode 100644
index 0000000..6719309
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association_composite.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association_none.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association_none.gif
new file mode 100644
index 0000000..feb7d27
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association_none.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association_shared.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association_shared.gif
new file mode 100644
index 0000000..d117db8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Association_shared.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/BehaviorExecutionSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/BehaviorExecutionSpecification.gif
new file mode 100644
index 0000000..d1e6005
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/BehaviorExecutionSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/BroadcastSignalAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/BroadcastSignalAction.gif
new file mode 100644
index 0000000..0fbda5a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/BroadcastSignalAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CallBehaviorAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CallBehaviorAction.gif
new file mode 100644
index 0000000..cb2f04f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CallBehaviorAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CallEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CallEvent.gif
new file mode 100644
index 0000000..d43c8b6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CallEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CallOperationAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CallOperationAction.gif
new file mode 100644
index 0000000..1ba8911
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CallOperationAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CentralBufferNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CentralBufferNode.gif
new file mode 100644
index 0000000..e6f251c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CentralBufferNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ChangeEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ChangeEvent.gif
new file mode 100644
index 0000000..fcb6a15
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ChangeEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Class.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Class.gif
new file mode 100644
index 0000000..253ff62
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Class.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClassifierTemplateParameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClassifierTemplateParameter.gif
new file mode 100644
index 0000000..a5ff6e1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClassifierTemplateParameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Clause.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Clause.gif
new file mode 100644
index 0000000..8ef3472
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Clause.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClearAssociationAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClearAssociationAction.gif
new file mode 100644
index 0000000..141e780
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClearAssociationAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClearStructuralFeatureAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClearStructuralFeatureAction.gif
new file mode 100644
index 0000000..42605bd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClearStructuralFeatureAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClearVariableAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClearVariableAction.gif
new file mode 100644
index 0000000..7750007
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ClearVariableAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Collaboration.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Collaboration.gif
new file mode 100644
index 0000000..c07265c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Collaboration.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CollaborationUse.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CollaborationUse.gif
new file mode 100644
index 0000000..f03a267
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CollaborationUse.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CombinedFragment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CombinedFragment.gif
new file mode 100644
index 0000000..e835edb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CombinedFragment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Comment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Comment.gif
new file mode 100644
index 0000000..e410c70
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Comment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CommunicationPath.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CommunicationPath.gif
new file mode 100644
index 0000000..7a849eb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CommunicationPath.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Component.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Component.gif
new file mode 100644
index 0000000..7fd8b5e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Component.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ComponentRealization.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ComponentRealization.gif
new file mode 100644
index 0000000..fff050f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ComponentRealization.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConditionalNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConditionalNode.gif
new file mode 100644
index 0000000..1cbb501
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConditionalNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConnectableElementTemplateParameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConnectableElementTemplateParameter.gif
new file mode 100644
index 0000000..2663fee
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConnectableElementTemplateParameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConnectionPointReference.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConnectionPointReference.gif
new file mode 100644
index 0000000..939ace4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConnectionPointReference.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Connector.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Connector.gif
new file mode 100644
index 0000000..df47b3a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Connector.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConnectorEnd.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConnectorEnd.gif
new file mode 100644
index 0000000..7da4aba
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConnectorEnd.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Connector_assembly.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Connector_assembly.gif
new file mode 100644
index 0000000..b1a09d3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Connector_assembly.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Connector_delegation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Connector_delegation.gif
new file mode 100644
index 0000000..5f9a0d8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Connector_delegation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConsiderIgnoreFragment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConsiderIgnoreFragment.gif
new file mode 100644
index 0000000..1bad086
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ConsiderIgnoreFragment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Constraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Constraint.gif
new file mode 100644
index 0000000..65afa8e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Constraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Continuation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Continuation.gif
new file mode 100644
index 0000000..258c98f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Continuation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ControlFlow.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ControlFlow.gif
new file mode 100644
index 0000000..4fe5248
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ControlFlow.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreateLinkAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreateLinkAction.gif
new file mode 100644
index 0000000..5c40ac5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreateLinkAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreateLinkObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreateLinkObjectAction.gif
new file mode 100644
index 0000000..dba00b0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreateLinkObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreateObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreateObjectAction.gif
new file mode 100644
index 0000000..3842f57
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreateObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreationEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreationEvent.gif
new file mode 100644
index 0000000..b399298
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/CreationEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DataStoreNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DataStoreNode.gif
new file mode 100644
index 0000000..ea317cd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DataStoreNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DataType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DataType.gif
new file mode 100644
index 0000000..2778f49
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DataType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DecisionNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DecisionNode.gif
new file mode 100644
index 0000000..01c5ce6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DecisionNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Dependency.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Dependency.gif
new file mode 100644
index 0000000..db7c6dd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Dependency.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Deployment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Deployment.gif
new file mode 100644
index 0000000..91745cc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Deployment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DeploymentSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DeploymentSpecification.gif
new file mode 100644
index 0000000..af579f8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DeploymentSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DestroyLinkAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DestroyLinkAction.gif
new file mode 100644
index 0000000..e904edd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DestroyLinkAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DestroyObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DestroyObjectAction.gif
new file mode 100644
index 0000000..fbc01b8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DestroyObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DestructionEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DestructionEvent.gif
new file mode 100644
index 0000000..8de1a69
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DestructionEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Device.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Device.gif
new file mode 100644
index 0000000..7ea8070
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Device.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Duration.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Duration.gif
new file mode 100644
index 0000000..ab7361e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Duration.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DurationConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DurationConstraint.gif
new file mode 100644
index 0000000..14b4a03
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DurationConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DurationInterval.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DurationInterval.gif
new file mode 100644
index 0000000..972dd0c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DurationInterval.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DurationObservation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DurationObservation.gif
new file mode 100644
index 0000000..ec9155c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/DurationObservation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ElementImport.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ElementImport.gif
new file mode 100644
index 0000000..430b0c1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ElementImport.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Enumeration.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Enumeration.gif
new file mode 100644
index 0000000..0613ce0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Enumeration.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/EnumerationLiteral.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/EnumerationLiteral.gif
new file mode 100644
index 0000000..f0a62bc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/EnumerationLiteral.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExceptionHandler.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExceptionHandler.gif
new file mode 100644
index 0000000..4d94240
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExceptionHandler.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExecutionEnvironment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExecutionEnvironment.gif
new file mode 100644
index 0000000..e854685
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExecutionEnvironment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExecutionEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExecutionEvent.gif
new file mode 100644
index 0000000..7001ee7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExecutionEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExecutionOccurrenceSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExecutionOccurrenceSpecification.gif
new file mode 100644
index 0000000..cfe882c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExecutionOccurrenceSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExpansionNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExpansionNode.gif
new file mode 100644
index 0000000..a5a678f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExpansionNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExpansionRegion.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExpansionRegion.gif
new file mode 100644
index 0000000..08072f5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExpansionRegion.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Expression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Expression.gif
new file mode 100644
index 0000000..13efea3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Expression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Extend.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Extend.gif
new file mode 100644
index 0000000..8b05c19
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Extend.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Extension.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Extension.gif
new file mode 100644
index 0000000..4ea6245
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Extension.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExtensionEnd.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExtensionEnd.gif
new file mode 100644
index 0000000..5c750af
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExtensionEnd.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExtensionPoint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExtensionPoint.gif
new file mode 100644
index 0000000..f780751
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ExtensionPoint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/FinalState.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/FinalState.gif
new file mode 100644
index 0000000..2d0f535
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/FinalState.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/FlowFinalNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/FlowFinalNode.gif
new file mode 100644
index 0000000..60cfbe4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/FlowFinalNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ForkNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ForkNode.gif
new file mode 100644
index 0000000..415acec
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ForkNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/FunctionBehavior.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/FunctionBehavior.gif
new file mode 100644
index 0000000..acaf29a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/FunctionBehavior.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Gate.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Gate.gif
new file mode 100644
index 0000000..d581a7a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Gate.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/GeneralOrdering.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/GeneralOrdering.gif
new file mode 100644
index 0000000..885d153
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/GeneralOrdering.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Generalization.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Generalization.gif
new file mode 100644
index 0000000..71dc26f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Generalization.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/GeneralizationSet.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/GeneralizationSet.gif
new file mode 100644
index 0000000..08d0ebc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/GeneralizationSet.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Image.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Image.gif
new file mode 100644
index 0000000..0e096e3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Image.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Include.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Include.gif
new file mode 100644
index 0000000..6a51165
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Include.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InformationFlow.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InformationFlow.gif
new file mode 100644
index 0000000..c1ae321
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InformationFlow.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InformationItem.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InformationItem.gif
new file mode 100644
index 0000000..1a51486
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InformationItem.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InitialNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InitialNode.gif
new file mode 100644
index 0000000..aebab15
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InitialNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InputPin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InputPin.gif
new file mode 100644
index 0000000..e03d0b5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InputPin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InstanceSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InstanceSpecification.gif
new file mode 100644
index 0000000..6c33e1d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InstanceSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InstanceValue.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InstanceValue.gif
new file mode 100644
index 0000000..358b310
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InstanceValue.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Interaction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Interaction.gif
new file mode 100644
index 0000000..f5075f0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Interaction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InteractionConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InteractionConstraint.gif
new file mode 100644
index 0000000..7623dff
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InteractionConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InteractionOperand.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InteractionOperand.gif
new file mode 100644
index 0000000..ec0710a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InteractionOperand.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InteractionUse.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InteractionUse.gif
new file mode 100644
index 0000000..a89e6f3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InteractionUse.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Interface.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Interface.gif
new file mode 100644
index 0000000..280f767
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Interface.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InterfaceRealization.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InterfaceRealization.gif
new file mode 100644
index 0000000..4a69360
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InterfaceRealization.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InterruptibleActivityRegion.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InterruptibleActivityRegion.gif
new file mode 100644
index 0000000..6440a14
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/InterruptibleActivityRegion.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Interval.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Interval.gif
new file mode 100644
index 0000000..8193771
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Interval.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/IntervalConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/IntervalConstraint.gif
new file mode 100644
index 0000000..e757bd8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/IntervalConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/JoinNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/JoinNode.gif
new file mode 100644
index 0000000..6680f19
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/JoinNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Lifeline.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Lifeline.gif
new file mode 100644
index 0000000..099e66f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Lifeline.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LinkEndCreationData.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LinkEndCreationData.gif
new file mode 100644
index 0000000..7171cc9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LinkEndCreationData.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LinkEndData.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LinkEndData.gif
new file mode 100644
index 0000000..e81806c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LinkEndData.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LinkEndDestructionData.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LinkEndDestructionData.gif
new file mode 100644
index 0000000..e310889
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LinkEndDestructionData.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralBoolean.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralBoolean.gif
new file mode 100644
index 0000000..1e39564
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralBoolean.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralInteger.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralInteger.gif
new file mode 100644
index 0000000..3fcc8c4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralInteger.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralNull.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralNull.gif
new file mode 100644
index 0000000..75fa3e1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralNull.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralString.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralString.gif
new file mode 100644
index 0000000..e0191ee
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralString.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralUnlimitedNatural.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralUnlimitedNatural.gif
new file mode 100644
index 0000000..537bb5b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LiteralUnlimitedNatural.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LoopNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LoopNode.gif
new file mode 100644
index 0000000..0676ccf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/LoopNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Manifestation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Manifestation.gif
new file mode 100644
index 0000000..6ef8aa7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Manifestation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/MergeNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/MergeNode.gif
new file mode 100644
index 0000000..5af89ca
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/MergeNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message.gif
new file mode 100644
index 0000000..562971c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/MessageOccurrenceSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/MessageOccurrenceSpecification.gif
new file mode 100644
index 0000000..87581b8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/MessageOccurrenceSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_asynchCall.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_asynchCall.gif
new file mode 100644
index 0000000..ee64a9f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_asynchCall.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_asynchSignal.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_asynchSignal.gif
new file mode 100644
index 0000000..f111994
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_asynchSignal.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_createMessage.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_createMessage.gif
new file mode 100644
index 0000000..18021fb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_createMessage.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_deleteMessage.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_deleteMessage.gif
new file mode 100644
index 0000000..72171f1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_deleteMessage.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_reply.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_reply.gif
new file mode 100644
index 0000000..a88506f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_reply.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_synchCall.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_synchCall.gif
new file mode 100644
index 0000000..359796d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Message_synchCall.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Model.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Model.gif
new file mode 100644
index 0000000..c233c27
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Model.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Node.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Node.gif
new file mode 100644
index 0000000..81a9df6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Node.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ObjectFlow.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ObjectFlow.gif
new file mode 100644
index 0000000..2b7d7f8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ObjectFlow.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OccurrenceSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OccurrenceSpecification.gif
new file mode 100644
index 0000000..b6151c3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OccurrenceSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OpaqueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OpaqueAction.gif
new file mode 100644
index 0000000..70d132f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OpaqueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OpaqueBehavior.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OpaqueBehavior.gif
new file mode 100644
index 0000000..cffa856
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OpaqueBehavior.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OpaqueExpression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OpaqueExpression.gif
new file mode 100644
index 0000000..35ef83c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OpaqueExpression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Operation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Operation.gif
new file mode 100644
index 0000000..dfb60d9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Operation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OperationTemplateParameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OperationTemplateParameter.gif
new file mode 100644
index 0000000..11a34fe
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OperationTemplateParameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OutputPin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OutputPin.gif
new file mode 100644
index 0000000..063151f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/OutputPin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Package.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Package.gif
new file mode 100644
index 0000000..728e46a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Package.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PackageImport.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PackageImport.gif
new file mode 100644
index 0000000..e3b8a62
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PackageImport.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PackageMerge.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PackageMerge.gif
new file mode 100644
index 0000000..82b022f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PackageMerge.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter.gif
new file mode 100644
index 0000000..39ba0d5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ParameterSet.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ParameterSet.gif
new file mode 100644
index 0000000..f9301c4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ParameterSet.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_in.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_in.gif
new file mode 100644
index 0000000..911cbeb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_in.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_inout.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_inout.gif
new file mode 100644
index 0000000..3a0e6f3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_inout.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_out.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_out.gif
new file mode 100644
index 0000000..e80c5fa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_out.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_return.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_return.gif
new file mode 100644
index 0000000..65fdd7a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Parameter_return.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PartDecomposition.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PartDecomposition.gif
new file mode 100644
index 0000000..93d3ae6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PartDecomposition.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pin.gif
new file mode 100644
index 0000000..90fbc52
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Port.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Port.gif
new file mode 100644
index 0000000..ffc01ba
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Port.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PrimitiveType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PrimitiveType.gif
new file mode 100644
index 0000000..aed79cd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/PrimitiveType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Profile.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Profile.gif
new file mode 100644
index 0000000..0e55469
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Profile.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProfileApplication.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProfileApplication.gif
new file mode 100644
index 0000000..217115d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProfileApplication.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Property.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Property.gif
new file mode 100644
index 0000000..87d635f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Property.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProtocolConformance.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProtocolConformance.gif
new file mode 100644
index 0000000..e4aa826
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProtocolConformance.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProtocolStateMachine.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProtocolStateMachine.gif
new file mode 100644
index 0000000..0a4834d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProtocolStateMachine.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProtocolTransition.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProtocolTransition.gif
new file mode 100644
index 0000000..09bbe6f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ProtocolTransition.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate.gif
new file mode 100644
index 0000000..f743367
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_choice.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_choice.gif
new file mode 100644
index 0000000..b5e8004
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_choice.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_deepHistory.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_deepHistory.gif
new file mode 100644
index 0000000..3625384
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_deepHistory.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_entryPoint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_entryPoint.gif
new file mode 100644
index 0000000..2dadfae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_entryPoint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_exitPoint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_exitPoint.gif
new file mode 100644
index 0000000..3392389
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_exitPoint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_fork.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_fork.gif
new file mode 100644
index 0000000..971a5aa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_fork.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_initial.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_initial.gif
new file mode 100644
index 0000000..66ea8bf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_initial.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_join.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_join.gif
new file mode 100644
index 0000000..79e4410
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_join.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_junction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_junction.gif
new file mode 100644
index 0000000..b3e1a1d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_junction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_shallowHistory.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_shallowHistory.gif
new file mode 100644
index 0000000..8b101c4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_shallowHistory.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_terminate.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_terminate.gif
new file mode 100644
index 0000000..ea6fb9b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Pseudostate_terminate.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/QualifierValue.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/QualifierValue.gif
new file mode 100644
index 0000000..752929a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/QualifierValue.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RaiseExceptionAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RaiseExceptionAction.gif
new file mode 100644
index 0000000..a522017
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RaiseExceptionAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadExtentAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadExtentAction.gif
new file mode 100644
index 0000000..804dc35
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadExtentAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadIsClassifiedObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadIsClassifiedObjectAction.gif
new file mode 100644
index 0000000..4dbf9bd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadIsClassifiedObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadLinkAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadLinkAction.gif
new file mode 100644
index 0000000..29fe5c6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadLinkAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadLinkObjectEndAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadLinkObjectEndAction.gif
new file mode 100644
index 0000000..38d57a1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadLinkObjectEndAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadLinkObjectEndQualifierAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadLinkObjectEndQualifierAction.gif
new file mode 100644
index 0000000..33b8a77
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadLinkObjectEndQualifierAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadSelfAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadSelfAction.gif
new file mode 100644
index 0000000..d2ef012
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadSelfAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadStructuralFeatureAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadStructuralFeatureAction.gif
new file mode 100644
index 0000000..34534fb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadStructuralFeatureAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadVariableAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadVariableAction.gif
new file mode 100644
index 0000000..67d9830
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReadVariableAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Realization.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Realization.gif
new file mode 100644
index 0000000..322777e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Realization.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReceiveOperationEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReceiveOperationEvent.gif
new file mode 100644
index 0000000..427316c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReceiveOperationEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReceiveSignalEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReceiveSignalEvent.gif
new file mode 100644
index 0000000..1fe497f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReceiveSignalEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Reception.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Reception.gif
new file mode 100644
index 0000000..3931df2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Reception.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReclassifyObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReclassifyObjectAction.gif
new file mode 100644
index 0000000..86a2bdd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReclassifyObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RedefinableTemplateSignature.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RedefinableTemplateSignature.gif
new file mode 100644
index 0000000..99eae0d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RedefinableTemplateSignature.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReduceAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReduceAction.gif
new file mode 100644
index 0000000..2227d8a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReduceAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Region.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Region.gif
new file mode 100644
index 0000000..5f15ccc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Region.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RemoveStructuralFeatureValueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RemoveStructuralFeatureValueAction.gif
new file mode 100644
index 0000000..de84be1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RemoveStructuralFeatureValueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RemoveVariableValueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RemoveVariableValueAction.gif
new file mode 100644
index 0000000..06de084
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/RemoveVariableValueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReplyAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReplyAction.gif
new file mode 100644
index 0000000..dfd99a5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ReplyAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendObjectAction.gif
new file mode 100644
index 0000000..073811c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendOperationEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendOperationEvent.gif
new file mode 100644
index 0000000..8b9203a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendOperationEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendSignalAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendSignalAction.gif
new file mode 100644
index 0000000..19fc192
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendSignalAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendSignalEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendSignalEvent.gif
new file mode 100644
index 0000000..2663d5c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SendSignalEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SequenceNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SequenceNode.gif
new file mode 100644
index 0000000..0a6a9ed
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SequenceNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Signal.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Signal.gif
new file mode 100644
index 0000000..27c88f9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Signal.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SignalEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SignalEvent.gif
new file mode 100644
index 0000000..17af78f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/SignalEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Slot.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Slot.gif
new file mode 100644
index 0000000..76f20c0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Slot.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StartClassifierBehaviorAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StartClassifierBehaviorAction.gif
new file mode 100644
index 0000000..68fc093
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StartClassifierBehaviorAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StartObjectBehaviorAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StartObjectBehaviorAction.gif
new file mode 100644
index 0000000..8fd833b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StartObjectBehaviorAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/State.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/State.gif
new file mode 100644
index 0000000..a4dd552
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/State.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StateInvariant.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StateInvariant.gif
new file mode 100644
index 0000000..766937b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StateInvariant.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StateMachine.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StateMachine.gif
new file mode 100644
index 0000000..e255f63
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StateMachine.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Stereotype.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Stereotype.gif
new file mode 100644
index 0000000..b7ae870
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Stereotype.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StringExpression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StringExpression.gif
new file mode 100644
index 0000000..8bf023a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StringExpression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StructuredActivityNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StructuredActivityNode.gif
new file mode 100644
index 0000000..2e08503
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/StructuredActivityNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Substitution.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Substitution.gif
new file mode 100644
index 0000000..67658a3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Substitution.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateBinding.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateBinding.gif
new file mode 100644
index 0000000..63fc759
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateBinding.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateParameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateParameter.gif
new file mode 100644
index 0000000..efb1c83
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateParameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateParameterSubstitution.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateParameterSubstitution.gif
new file mode 100644
index 0000000..f972beb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateParameterSubstitution.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateSignature.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateSignature.gif
new file mode 100644
index 0000000..298a718
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TemplateSignature.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TestIdentityAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TestIdentityAction.gif
new file mode 100644
index 0000000..1eef543
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TestIdentityAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeConstraint.gif
new file mode 100644
index 0000000..2e5f9a6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeEvent.gif
new file mode 100644
index 0000000..c048b1c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeExpression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeExpression.gif
new file mode 100644
index 0000000..83b5d92
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeExpression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeInterval.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeInterval.gif
new file mode 100644
index 0000000..3c32dbb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeInterval.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeObservation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeObservation.gif
new file mode 100644
index 0000000..c12c199
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/TimeObservation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition.gif
new file mode 100644
index 0000000..698f368
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition_external.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition_external.gif
new file mode 100644
index 0000000..d550f3a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition_external.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition_internal.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition_internal.gif
new file mode 100644
index 0000000..b47d288
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition_internal.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition_local.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition_local.gif
new file mode 100644
index 0000000..3e5dffe
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Transition_local.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Trigger.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Trigger.gif
new file mode 100644
index 0000000..c7ec529
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Trigger.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/UnmarshallAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/UnmarshallAction.gif
new file mode 100644
index 0000000..daa8e07
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/UnmarshallAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Usage.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Usage.gif
new file mode 100644
index 0000000..52a5bf1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Usage.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/UseCase.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/UseCase.gif
new file mode 100644
index 0000000..8b2b8cd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/UseCase.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ValuePin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ValuePin.gif
new file mode 100644
index 0000000..0b54d09
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ValuePin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ValueSpecificationAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ValueSpecificationAction.gif
new file mode 100644
index 0000000..9c1b9a8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/ValueSpecificationAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Variable.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Variable.gif
new file mode 100644
index 0000000..111c260
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/gif/Variable.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Abstraction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Abstraction.gif
new file mode 100644
index 0000000..38df3e6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Abstraction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AcceptCallAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AcceptCallAction.gif
new file mode 100644
index 0000000..de7357c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AcceptCallAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AcceptEventAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AcceptEventAction.gif
new file mode 100644
index 0000000..9379c89
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AcceptEventAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActionExecutionSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActionExecutionSpecification.gif
new file mode 100644
index 0000000..ccfb3c8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActionExecutionSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActionInputPin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActionInputPin.gif
new file mode 100644
index 0000000..12ad056
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActionInputPin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Activity.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Activity.gif
new file mode 100644
index 0000000..c14b254
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Activity.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActivityFinalNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActivityFinalNode.gif
new file mode 100644
index 0000000..ed49728
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActivityFinalNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActivityParameterNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActivityParameterNode.gif
new file mode 100644
index 0000000..70d8737
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActivityParameterNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActivityPartition.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActivityPartition.gif
new file mode 100644
index 0000000..7c1f8fa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ActivityPartition.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Actor.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Actor.gif
new file mode 100644
index 0000000..1a65f92
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Actor.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AddStructuralFeatureValueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AddStructuralFeatureValueAction.gif
new file mode 100644
index 0000000..28a897e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AddStructuralFeatureValueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AddVariableValueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AddVariableValueAction.gif
new file mode 100644
index 0000000..1b41bd7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AddVariableValueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Add_16x16.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Add_16x16.gif
new file mode 100644
index 0000000..252d7eb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Add_16x16.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AnyReceiveEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AnyReceiveEvent.gif
new file mode 100644
index 0000000..ac86570
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AnyReceiveEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowDown_16x16.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowDown_16x16.gif
new file mode 100644
index 0000000..072b184
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowDown_16x16.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowLeft_16x16.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowLeft_16x16.gif
new file mode 100644
index 0000000..4fb4150
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowLeft_16x16.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowRight_16x16.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowRight_16x16.gif
new file mode 100644
index 0000000..1956789
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowRight_16x16.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowUp_16x16.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowUp_16x16.gif
new file mode 100644
index 0000000..0716475
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ArrowUp_16x16.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Artifact.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Artifact.gif
new file mode 100644
index 0000000..8a559fc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Artifact.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association.gif
new file mode 100644
index 0000000..88ec3ec
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AssociationClass.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AssociationClass.gif
new file mode 100644
index 0000000..314c198
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/AssociationClass.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association_composite.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association_composite.gif
new file mode 100644
index 0000000..b4fbec9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association_composite.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association_none.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association_none.gif
new file mode 100644
index 0000000..d9712d1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association_none.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association_shared.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association_shared.gif
new file mode 100644
index 0000000..3b687d2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Association_shared.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/BehaviorExecutionSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/BehaviorExecutionSpecification.gif
new file mode 100644
index 0000000..339e41f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/BehaviorExecutionSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/BroadcastSignalAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/BroadcastSignalAction.gif
new file mode 100644
index 0000000..64cff60
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/BroadcastSignalAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CallBehaviorAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CallBehaviorAction.gif
new file mode 100644
index 0000000..ea02947
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CallBehaviorAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CallEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CallEvent.gif
new file mode 100644
index 0000000..fb748af
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CallEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CallOperationAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CallOperationAction.gif
new file mode 100644
index 0000000..b394107
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CallOperationAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CentralBufferNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CentralBufferNode.gif
new file mode 100644
index 0000000..35311a4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CentralBufferNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ChangeEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ChangeEvent.gif
new file mode 100644
index 0000000..22d4ab4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ChangeEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Class.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Class.gif
new file mode 100644
index 0000000..5c50725
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Class.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClassifierTemplateParameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClassifierTemplateParameter.gif
new file mode 100644
index 0000000..3091c61
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClassifierTemplateParameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Clause.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Clause.gif
new file mode 100644
index 0000000..da535fd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Clause.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClearAssociationAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClearAssociationAction.gif
new file mode 100644
index 0000000..96f12f9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClearAssociationAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClearStructuralFeatureAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClearStructuralFeatureAction.gif
new file mode 100644
index 0000000..a5b4a02
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClearStructuralFeatureAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClearVariableAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClearVariableAction.gif
new file mode 100644
index 0000000..d91e794
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ClearVariableAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Collaboration.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Collaboration.gif
new file mode 100644
index 0000000..03268e4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Collaboration.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CollaborationUse.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CollaborationUse.gif
new file mode 100644
index 0000000..cd209bb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CollaborationUse.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CombinedFragment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CombinedFragment.gif
new file mode 100644
index 0000000..ad2d9bb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CombinedFragment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Comment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Comment.gif
new file mode 100644
index 0000000..c495731
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Comment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CommunicationPath.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CommunicationPath.gif
new file mode 100644
index 0000000..7c6185f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CommunicationPath.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Component.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Component.gif
new file mode 100644
index 0000000..56b94fc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Component.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ComponentRealization.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ComponentRealization.gif
new file mode 100644
index 0000000..14cdfbb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ComponentRealization.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConditionalNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConditionalNode.gif
new file mode 100644
index 0000000..0b4dcdf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConditionalNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConnectableElementTemplateParameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConnectableElementTemplateParameter.gif
new file mode 100644
index 0000000..f26173e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConnectableElementTemplateParameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConnectionPointReference.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConnectionPointReference.gif
new file mode 100644
index 0000000..45db5cc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConnectionPointReference.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Connector.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Connector.gif
new file mode 100644
index 0000000..88ec3ec
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Connector.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConnectorEnd.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConnectorEnd.gif
new file mode 100644
index 0000000..a23b0b0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConnectorEnd.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Connector_delegation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Connector_delegation.gif
new file mode 100644
index 0000000..f8a1133
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Connector_delegation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConsiderIgnoreFragment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConsiderIgnoreFragment.gif
new file mode 100644
index 0000000..8943fc0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ConsiderIgnoreFragment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Constraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Constraint.gif
new file mode 100644
index 0000000..eed6ace
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Constraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Continuation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Continuation.gif
new file mode 100644
index 0000000..2c83df9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Continuation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ControlFlow.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ControlFlow.gif
new file mode 100644
index 0000000..8fbd465
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ControlFlow.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreateLinkAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreateLinkAction.gif
new file mode 100644
index 0000000..2f99e5d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreateLinkAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreateLinkObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreateLinkObjectAction.gif
new file mode 100644
index 0000000..7c253ac
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreateLinkObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreateObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreateObjectAction.gif
new file mode 100644
index 0000000..3842c5e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreateObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreationEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreationEvent.gif
new file mode 100644
index 0000000..4419a3d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/CreationEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DataStoreNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DataStoreNode.gif
new file mode 100644
index 0000000..08c1cd5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DataStoreNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DataType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DataType.gif
new file mode 100644
index 0000000..e7dec0c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DataType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DecisionNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DecisionNode.gif
new file mode 100644
index 0000000..3848165
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DecisionNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Delete_16x16.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Delete_16x16.gif
new file mode 100644
index 0000000..b6922ac
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Delete_16x16.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Dependency.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Dependency.gif
new file mode 100644
index 0000000..1d9c7e3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Dependency.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Deployment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Deployment.gif
new file mode 100644
index 0000000..e4691c3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Deployment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DeploymentSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DeploymentSpecification.gif
new file mode 100644
index 0000000..626bddf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DeploymentSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DestroyLinkAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DestroyLinkAction.gif
new file mode 100644
index 0000000..ffa1793
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DestroyLinkAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DestroyObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DestroyObjectAction.gif
new file mode 100644
index 0000000..9a0d858
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DestroyObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DestructionEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DestructionEvent.gif
new file mode 100644
index 0000000..8f8741b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DestructionEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Device.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Device.gif
new file mode 100644
index 0000000..a181e6f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Device.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Duration.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Duration.gif
new file mode 100644
index 0000000..ccbe76d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Duration.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DurationConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DurationConstraint.gif
new file mode 100644
index 0000000..c355add
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DurationConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DurationInterval.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DurationInterval.gif
new file mode 100644
index 0000000..7a8e3ea
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DurationInterval.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DurationObservation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DurationObservation.gif
new file mode 100644
index 0000000..da5759f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/DurationObservation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ElementImport.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ElementImport.gif
new file mode 100644
index 0000000..dd39064
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ElementImport.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Enumeration.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Enumeration.gif
new file mode 100644
index 0000000..4e5dcd0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Enumeration.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/EnumerationLiteral.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/EnumerationLiteral.gif
new file mode 100644
index 0000000..cab41ef
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/EnumerationLiteral.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExceptionHandler.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExceptionHandler.gif
new file mode 100644
index 0000000..d4af8d5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExceptionHandler.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExecutionEnvironment.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExecutionEnvironment.gif
new file mode 100644
index 0000000..d05a59e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExecutionEnvironment.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExecutionEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExecutionEvent.gif
new file mode 100644
index 0000000..3d0e912
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExecutionEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExecutionOccurrenceSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExecutionOccurrenceSpecification.gif
new file mode 100644
index 0000000..c95743a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExecutionOccurrenceSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExpansionNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExpansionNode.gif
new file mode 100644
index 0000000..17be38b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExpansionNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExpansionRegion.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExpansionRegion.gif
new file mode 100644
index 0000000..9afad61
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExpansionRegion.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Expression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Expression.gif
new file mode 100644
index 0000000..4c5d117
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Expression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Extend.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Extend.gif
new file mode 100644
index 0000000..27d8768
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Extend.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Extension.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Extension.gif
new file mode 100644
index 0000000..d6e7b15
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Extension.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExtensionEnd.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExtensionEnd.gif
new file mode 100644
index 0000000..9a325e9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExtensionEnd.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExtensionPoint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExtensionPoint.gif
new file mode 100644
index 0000000..72c6415
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ExtensionPoint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/FinalState.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/FinalState.gif
new file mode 100644
index 0000000..d3972a3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/FinalState.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/FlowFinalNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/FlowFinalNode.gif
new file mode 100644
index 0000000..701d34c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/FlowFinalNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ForkNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ForkNode.gif
new file mode 100644
index 0000000..fff0cfe
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ForkNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/FunctionBehavior.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/FunctionBehavior.gif
new file mode 100644
index 0000000..ca01f01
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/FunctionBehavior.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Gate.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Gate.gif
new file mode 100644
index 0000000..8a2673d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Gate.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/GeneralOrdering.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/GeneralOrdering.gif
new file mode 100644
index 0000000..623c8db
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/GeneralOrdering.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Generalization.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Generalization.gif
new file mode 100644
index 0000000..20013df
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Generalization.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/GeneralizationSet.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/GeneralizationSet.gif
new file mode 100644
index 0000000..fc9ec31
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/GeneralizationSet.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Image.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Image.gif
new file mode 100644
index 0000000..07e2598
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Image.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Include.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Include.gif
new file mode 100644
index 0000000..b19b0af
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Include.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InformationFlow.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InformationFlow.gif
new file mode 100644
index 0000000..31c9dc8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InformationFlow.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InformationItem.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InformationItem.gif
new file mode 100644
index 0000000..d58d685
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InformationItem.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InitialNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InitialNode.gif
new file mode 100644
index 0000000..7f1edff
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InitialNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InputPin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InputPin.gif
new file mode 100644
index 0000000..77a927c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InputPin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InstanceSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InstanceSpecification.gif
new file mode 100644
index 0000000..862dd9e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InstanceSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InstanceValue.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InstanceValue.gif
new file mode 100644
index 0000000..b821b12
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InstanceValue.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Interaction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Interaction.gif
new file mode 100644
index 0000000..1da8b14
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Interaction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InteractionConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InteractionConstraint.gif
new file mode 100644
index 0000000..ff0e0c9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InteractionConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InteractionOperand.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InteractionOperand.gif
new file mode 100644
index 0000000..36c6979
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InteractionOperand.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InteractionUse.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InteractionUse.gif
new file mode 100644
index 0000000..30c4944
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InteractionUse.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Interface.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Interface.gif
new file mode 100644
index 0000000..517996a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Interface.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InterfaceRealization.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InterfaceRealization.gif
new file mode 100644
index 0000000..e73f578
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InterfaceRealization.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InterruptibleActivityRegion.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InterruptibleActivityRegion.gif
new file mode 100644
index 0000000..18b47c1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/InterruptibleActivityRegion.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Interval.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Interval.gif
new file mode 100644
index 0000000..26d0118
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Interval.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/IntervalConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/IntervalConstraint.gif
new file mode 100644
index 0000000..7416f5c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/IntervalConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/JoinNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/JoinNode.gif
new file mode 100644
index 0000000..a5d1ef8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/JoinNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Lifeline.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Lifeline.gif
new file mode 100644
index 0000000..712a259
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Lifeline.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LinkEndCreationData.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LinkEndCreationData.gif
new file mode 100644
index 0000000..5a57b7b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LinkEndCreationData.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LinkEndData.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LinkEndData.gif
new file mode 100644
index 0000000..ee8fbcc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LinkEndData.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LinkEndDestructionData.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LinkEndDestructionData.gif
new file mode 100644
index 0000000..660151b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LinkEndDestructionData.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralBoolean.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralBoolean.gif
new file mode 100644
index 0000000..656797f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralBoolean.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralInteger.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralInteger.gif
new file mode 100644
index 0000000..3bd99b3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralInteger.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralNull.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralNull.gif
new file mode 100644
index 0000000..d28f9cc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralNull.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralString.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralString.gif
new file mode 100644
index 0000000..ef367ef
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralString.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralUnlimitedNatural.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralUnlimitedNatural.gif
new file mode 100644
index 0000000..f1f0195
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LiteralUnlimitedNatural.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LoadResource.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LoadResource.gif
new file mode 100644
index 0000000..f2c989e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LoadResource.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LoopNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LoopNode.gif
new file mode 100644
index 0000000..f93584f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/LoopNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Manifestation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Manifestation.gif
new file mode 100644
index 0000000..de01668
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Manifestation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/MergeNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/MergeNode.gif
new file mode 100644
index 0000000..739077c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/MergeNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message.gif
new file mode 100644
index 0000000..bc0ef1b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/MessageOccurrenceSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/MessageOccurrenceSpecification.gif
new file mode 100644
index 0000000..35df2a5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/MessageOccurrenceSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_asynchCall.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_asynchCall.gif
new file mode 100644
index 0000000..8957581
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_asynchCall.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_asynchSignal.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_asynchSignal.gif
new file mode 100644
index 0000000..dade1f8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_asynchSignal.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_createMessage.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_createMessage.gif
new file mode 100644
index 0000000..2427bf2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_createMessage.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_deleteMessage.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_deleteMessage.gif
new file mode 100644
index 0000000..991a48a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_deleteMessage.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_reply.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_reply.gif
new file mode 100644
index 0000000..32614bd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_reply.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_synchCall.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_synchCall.gif
new file mode 100644
index 0000000..de08902
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Message_synchCall.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Model.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Model.gif
new file mode 100644
index 0000000..36a276d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Model.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Modify.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Modify.gif
new file mode 100644
index 0000000..17d8b2e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Modify.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Node.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Node.gif
new file mode 100644
index 0000000..047a553
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Node.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ObjectFlow.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ObjectFlow.gif
new file mode 100644
index 0000000..e7d848d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ObjectFlow.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OccurrenceSpecification.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OccurrenceSpecification.gif
new file mode 100644
index 0000000..7c23f2f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OccurrenceSpecification.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OpaqueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OpaqueAction.gif
new file mode 100644
index 0000000..01b03d5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OpaqueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OpaqueBehavior.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OpaqueBehavior.gif
new file mode 100644
index 0000000..a22358e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OpaqueBehavior.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OpaqueExpression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OpaqueExpression.gif
new file mode 100644
index 0000000..cb087e4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OpaqueExpression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Operation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Operation.gif
new file mode 100644
index 0000000..01350e3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Operation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OperationTemplateParameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OperationTemplateParameter.gif
new file mode 100644
index 0000000..5aff7d9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OperationTemplateParameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OutputPin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OutputPin.gif
new file mode 100644
index 0000000..7d741f8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/OutputPin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Package.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Package.gif
new file mode 100644
index 0000000..e79ecca
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Package.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PackageImport.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PackageImport.gif
new file mode 100644
index 0000000..4b5f91e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PackageImport.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PackageMerge.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PackageMerge.gif
new file mode 100644
index 0000000..4b7c2ff
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PackageMerge.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter.gif
new file mode 100644
index 0000000..d468477
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ParameterSet.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ParameterSet.gif
new file mode 100644
index 0000000..0667887
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ParameterSet.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_in.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_in.gif
new file mode 100644
index 0000000..d12cafa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_in.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_inout.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_inout.gif
new file mode 100644
index 0000000..87a6574
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_inout.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_out.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_out.gif
new file mode 100644
index 0000000..aeea60e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_out.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_return.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_return.gif
new file mode 100644
index 0000000..4a421c2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Parameter_return.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PartDecomposition.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PartDecomposition.gif
new file mode 100644
index 0000000..cf9cabe
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PartDecomposition.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Pin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Pin.gif
new file mode 100644
index 0000000..da5ffc8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Pin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Plus.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Plus.gif
new file mode 100644
index 0000000..252d7eb
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Plus.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Port.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Port.gif
new file mode 100644
index 0000000..43d235b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Port.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PrimitiveType.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PrimitiveType.gif
new file mode 100644
index 0000000..25d5766
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/PrimitiveType.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Profile.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Profile.gif
new file mode 100644
index 0000000..18eed1f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Profile.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProfileApplication.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProfileApplication.gif
new file mode 100644
index 0000000..2638d49
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProfileApplication.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Property.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Property.gif
new file mode 100644
index 0000000..99b7fa6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Property.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProtocolConformance.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProtocolConformance.gif
new file mode 100644
index 0000000..bc653fc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProtocolConformance.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProtocolStateMachine.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProtocolStateMachine.gif
new file mode 100644
index 0000000..c2bb715
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProtocolStateMachine.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProtocolTransition.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProtocolTransition.gif
new file mode 100644
index 0000000..d15825e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ProtocolTransition.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/QualifierValue.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/QualifierValue.gif
new file mode 100644
index 0000000..48f39c4
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/QualifierValue.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RaiseExceptionAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RaiseExceptionAction.gif
new file mode 100644
index 0000000..fa16a6d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RaiseExceptionAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadExtentAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadExtentAction.gif
new file mode 100644
index 0000000..0242a64
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadExtentAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadIsClassifiedObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadIsClassifiedObjectAction.gif
new file mode 100644
index 0000000..4208b08
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadIsClassifiedObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadLinkAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadLinkAction.gif
new file mode 100644
index 0000000..d547f75
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadLinkAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadLinkObjectEndAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadLinkObjectEndAction.gif
new file mode 100644
index 0000000..8fbc8a9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadLinkObjectEndAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadLinkObjectEndQualifierAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadLinkObjectEndQualifierAction.gif
new file mode 100644
index 0000000..ab2245f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadLinkObjectEndQualifierAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadSelfAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadSelfAction.gif
new file mode 100644
index 0000000..2c66a9a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadSelfAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadStructuralFeatureAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadStructuralFeatureAction.gif
new file mode 100644
index 0000000..7963550
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadStructuralFeatureAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadVariableAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadVariableAction.gif
new file mode 100644
index 0000000..c0e8d90
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReadVariableAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Realization.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Realization.gif
new file mode 100644
index 0000000..81880dd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Realization.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReceiveOperationEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReceiveOperationEvent.gif
new file mode 100644
index 0000000..4b62cec
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReceiveOperationEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReceiveSignalEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReceiveSignalEvent.gif
new file mode 100644
index 0000000..c3be49c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReceiveSignalEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Reception.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Reception.gif
new file mode 100644
index 0000000..bec9f0e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Reception.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReclassifyObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReclassifyObjectAction.gif
new file mode 100644
index 0000000..360c87d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReclassifyObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RedefinableTemplateSignature.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RedefinableTemplateSignature.gif
new file mode 100644
index 0000000..9450bc5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RedefinableTemplateSignature.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReduceAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReduceAction.gif
new file mode 100644
index 0000000..1e1594c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReduceAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RemoveStructuralFeatureValueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RemoveStructuralFeatureValueAction.gif
new file mode 100644
index 0000000..d21c8e7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RemoveStructuralFeatureValueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RemoveVariableValueAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RemoveVariableValueAction.gif
new file mode 100644
index 0000000..8bba16e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/RemoveVariableValueAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReplyAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReplyAction.gif
new file mode 100644
index 0000000..1cef6b7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ReplyAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendObjectAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendObjectAction.gif
new file mode 100644
index 0000000..fd34b21
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendObjectAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendOperationEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendOperationEvent.gif
new file mode 100644
index 0000000..73e5c13
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendOperationEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendSignalAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendSignalAction.gif
new file mode 100644
index 0000000..5f6e1bf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendSignalAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendSignalEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendSignalEvent.gif
new file mode 100644
index 0000000..c0bf7e3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SendSignalEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SequenceNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SequenceNode.gif
new file mode 100644
index 0000000..e0347d8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SequenceNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SignalEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SignalEvent.gif
new file mode 100644
index 0000000..691be51
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/SignalEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Slot.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Slot.gif
new file mode 100644
index 0000000..a5156ed
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Slot.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StartClassifierBehaviorAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StartClassifierBehaviorAction.gif
new file mode 100644
index 0000000..cda0f6e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StartClassifierBehaviorAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StateInvariant.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StateInvariant.gif
new file mode 100644
index 0000000..0e9f073
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StateInvariant.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Stereotype.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Stereotype.gif
new file mode 100644
index 0000000..145e5d5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Stereotype.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StringExpression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StringExpression.gif
new file mode 100644
index 0000000..6c0b28e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StringExpression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StructuredActivityNode.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StructuredActivityNode.gif
new file mode 100644
index 0000000..260fb29
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/StructuredActivityNode.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Substitution.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Substitution.gif
new file mode 100644
index 0000000..e86854e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Substitution.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateBinding.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateBinding.gif
new file mode 100644
index 0000000..37972e1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateBinding.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateParameter.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateParameter.gif
new file mode 100644
index 0000000..8f9b4b5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateParameter.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateParameterSubstitution.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateParameterSubstitution.gif
new file mode 100644
index 0000000..382ccb0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateParameterSubstitution.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateSignature.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateSignature.gif
new file mode 100644
index 0000000..1d1e425
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TemplateSignature.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TestIdentityAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TestIdentityAction.gif
new file mode 100644
index 0000000..8cf783c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TestIdentityAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Thumbs.db b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Thumbs.db
new file mode 100644
index 0000000..69fc6b5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Thumbs.db
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeConstraint.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeConstraint.gif
new file mode 100644
index 0000000..8bd27e0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeConstraint.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeEvent.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeEvent.gif
new file mode 100644
index 0000000..ed6a866
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeEvent.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeExpression.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeExpression.gif
new file mode 100644
index 0000000..5c9d232
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeExpression.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeInterval.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeInterval.gif
new file mode 100644
index 0000000..afb8fa9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeInterval.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeObservation.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeObservation.gif
new file mode 100644
index 0000000..c5b0685
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/TimeObservation.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Trigger.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Trigger.gif
new file mode 100644
index 0000000..0b53cf6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Trigger.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UMLDiagramFile.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UMLDiagramFile.gif
new file mode 100644
index 0000000..de93807
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UMLDiagramFile.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UnloadResource.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UnloadResource.gif
new file mode 100644
index 0000000..c1c07a7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UnloadResource.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UnmarshallAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UnmarshallAction.gif
new file mode 100644
index 0000000..85fd404
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UnmarshallAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Usage.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Usage.gif
new file mode 100644
index 0000000..6f8d212
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/Usage.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UseCase.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UseCase.gif
new file mode 100644
index 0000000..570069f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/UseCase.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ValuePin.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ValuePin.gif
new file mode 100644
index 0000000..16ab908
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ValuePin.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ValueSpecificationAction.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ValueSpecificationAction.gif
new file mode 100644
index 0000000..86e7600
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/ValueSpecificationAction.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/call.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/call.gif
new file mode 100644
index 0000000..d5aed7a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/call.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/eraser.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/eraser.gif
new file mode 100644
index 0000000..6bc10f9
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/eraser.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/file.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/file.gif
new file mode 100644
index 0000000..ef30288
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/file.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/hyperlink.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/hyperlink.gif
new file mode 100644
index 0000000..1e09d97
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/hyperlink.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/insp_sbook.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/insp_sbook.gif
new file mode 100644
index 0000000..e936fba
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/insp_sbook.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/message_info.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/message_info.gif
new file mode 100644
index 0000000..b484d9b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/obj16/message_info.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/profile.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/profile.gif
new file mode 100644
index 0000000..18eed1f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/profile.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/stack.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/stack.gif
new file mode 100644
index 0000000..2344861
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/stack.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/stereotype.gif b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/stereotype.gif
new file mode 100644
index 0000000..145e5d5
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/icons/stereotype.gif
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/plugin.xml b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/plugin.xml
new file mode 100644
index 0000000..4055348
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/plugin.xml
@@ -0,0 +1,474 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<plugin>
+	<extension
+		point="org.eclipse.ui.editors">
+		<editor
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+			contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+			default="true"
+			extensions="fml,xfml,xlia,xfsp"
+			id="org.eclipse.efm.formalml.xtext.FormalML"
+			name="FormalML Editor">
+		</editor>
+	</extension>
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+			commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+			commandId="org.eclipse.efm.formalml.xtext.FormalML.validate">
+		<activeWhen>
+			<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+			</reference>
+		</activeWhen>
+		</handler>
+		<!-- copy qualified name -->
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+			<activeWhen>
+				<and>
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.XtextEditor.opened" />
+					<iterate>
+						<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+					</iterate>
+				</and>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+			<and>
+				<reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+						value="org.eclipse.efm.formalml.xtext.FormalML" 
+						forcePluginActivation="true"/>
+				</with>		
+			</and>
+		</definition>
+		<definition id="org.eclipse.efm.formalml.xtext.FormalML.XtextEditor.opened">
+			<and>
+				<reference definitionId="isXtextEditorActive"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+						value="org.eclipse.efm.formalml.xtext.FormalML" 
+						forcePluginActivation="true"/>
+				</with>		
+			</and>
+		</definition>
+	</extension>
+	<extension
+			point="org.eclipse.ui.preferencePages">
+		<page
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML"
+			name="FormalML">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.coloring"
+			name="Syntax Coloring">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.templates"
+			name="Templates">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+	</extension>
+	<extension
+			point="org.eclipse.ui.propertyPages">
+		<page
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML"
+			name="FormalML">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension
+		point="org.eclipse.ui.keywords">
+		<keyword
+			id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"
+			label="FormalML"/>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+	<command
+			description="Trigger expensive validation"
+			id="org.eclipse.efm.formalml.xtext.FormalML.validate"
+			name="Validate">
+	</command>
+	<!-- copy qualified name -->
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			 <command
+				 commandId="org.eclipse.efm.formalml.xtext.FormalML.validate"
+				 style="push"
+				 tooltip="Trigger expensive validation">
+			<visibleWhen checkEnabled="false">
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</visibleWhen>
+		</command>
+		</menuContribution>
+		<!-- copy qualified name -->
+		<menuContribution locationURI="popup:#TextEditorContext?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName" 
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="menu:edit?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName" 
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<and>
+						<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.XtextEditor.opened" />
+						<iterate>
+							<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+						</iterate>
+					</and>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?endof=group.find">
+			<command commandId="org.eclipse.xtext.ui.editor.FindReferences">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+			commandId="org.eclipse.xtext.ui.editor.FindReferences">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- adding resource factories -->
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="fml">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="fml">
+		</resourceServiceProvider>
+	</extension>
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="xfml">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="xfml">
+		</resourceServiceProvider>
+	</extension>
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="xlia">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="xlia">
+		</resourceServiceProvider>
+	</extension>
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="xfsp">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="xfsp">
+		</resourceServiceProvider>
+	</extension>
+	<!-- marker definitions for org.eclipse.efm.formalml.xtext.FormalML -->
+	<extension
+			id="formalml.check.fast"
+			name="FormalML Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.fast"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="formalml.check.normal"
+			name="FormalML Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.normal"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="formalml.check.expensive"
+			name="FormalML Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.expensive"/>
+		<persistent value="true"/>
+	</extension>
+	<extension point="org.eclipse.xtext.builder.participant">
+		<participant
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+			fileExtensions="fml,xfml,xlia,xfsp"/>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.compiler.preferencePage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.propertyPages">
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.compiler.propertyPage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?after=xtext.ui.openDeclaration">
+			<command
+				commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand"
+				id="org.eclipse.efm.formalml.xtext.FormalML.OpenGeneratedCode"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"
+			commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- Quick Outline -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+		<command
+			description="Open the quick outline."
+			id="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+			name="Quick Outline">
+		</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.open">
+			<command commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+				style="push"
+				tooltip="Open Quick Outline">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<!-- quickfix marker resolution generator for org.eclipse.efm.formalml.xtext.FormalML -->
+	<extension
+			point="org.eclipse.ui.ide.markerResolution">
+		<markerResolutionGenerator
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.formalml.xtext.ui.formalml.check.fast">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.formalml.xtext.ui.formalml.check.normal">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.formalml.xtext.ui.formalml.check.expensive">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+	</extension>
+	<!-- Rename Refactoring -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
+			commandId="org.eclipse.xtext.ui.refactoring.RenameElement">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			<command commandId="org.eclipse.xtext.ui.refactoring.RenameElement"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference
+						definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.refactoring"
+			name="Refactoring">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.compare.contentViewers">
+		<viewer id="org.eclipse.efm.formalml.xtext.FormalML.compare.contentViewers"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="fml,xfml,xlia,xfsp">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.compare.contentMergeViewers">
+		<viewer id="org.eclipse.efm.formalml.xtext.FormalML.compare.contentMergeViewers"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="fml,xfml,xlia,xfsp" label="FormalML Compare">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider id="org.eclipse.efm.formalml.xtext.FormalML.editors.documentProviders"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+			extensions="fml,xfml,xlia,xfsp">
+		</provider>
+	</extension>
+	<extension point="org.eclipse.team.core.fileTypes">
+		<fileTypes
+			extension="fml"
+			type="text">
+		</fileTypes>
+		<fileTypes
+			extension="xfml"
+			type="text">
+		</fileTypes>
+		<fileTypes
+			extension="xlia"
+			type="text">
+		</fileTypes>
+		<fileTypes
+			extension="xfsp"
+			type="text">
+		</fileTypes>
+	</extension>
+</plugin>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/plugin.xml_gen b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/plugin.xml_gen
new file mode 100644
index 0000000..67df2b8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/plugin.xml_gen
@@ -0,0 +1,461 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+	<extension
+		point="org.eclipse.ui.editors">
+		<editor
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+			contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+			default="true"
+			extensions="fml,xfml,xlia,xfsp"
+			id="org.eclipse.efm.formalml.xtext.FormalML"
+			name="FormalML Editor">
+		</editor>
+	</extension>
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+			commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+			commandId="org.eclipse.efm.formalml.xtext.FormalML.validate">
+		<activeWhen>
+			<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+			</reference>
+		</activeWhen>
+		</handler>
+		<!-- copy qualified name -->
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+			</activeWhen>
+		</handler>
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+			commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+			<activeWhen>
+				<and>
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.XtextEditor.opened" />
+					<iterate>
+						<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+					</iterate>
+				</and>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.core.expressions.definitions">
+		<definition id="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+			<and>
+				<reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+						value="org.eclipse.efm.formalml.xtext.FormalML" 
+						forcePluginActivation="true"/>
+				</with>		
+			</and>
+		</definition>
+		<definition id="org.eclipse.efm.formalml.xtext.FormalML.XtextEditor.opened">
+			<and>
+				<reference definitionId="isXtextEditorActive"/>
+				<with variable="activeEditor">
+					<test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+						value="org.eclipse.efm.formalml.xtext.FormalML" 
+						forcePluginActivation="true"/>
+				</with>		
+			</and>
+		</definition>
+	</extension>
+	<extension
+			point="org.eclipse.ui.preferencePages">
+		<page
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML"
+			name="FormalML">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.coloring"
+			name="Syntax Coloring">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.templates"
+			name="Templates">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+	</extension>
+	<extension
+			point="org.eclipse.ui.propertyPages">
+		<page
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML"
+			name="FormalML">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension
+		point="org.eclipse.ui.keywords">
+		<keyword
+			id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"
+			label="FormalML"/>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+	<command
+			description="Trigger expensive validation"
+			id="org.eclipse.efm.formalml.xtext.FormalML.validate"
+			name="Validate">
+	</command>
+	<!-- copy qualified name -->
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	<command
+			id="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+			categoryId="org.eclipse.ui.category.edit"
+			description="Copy the qualified name for the selected element"
+			name="Copy Qualified Name">
+	</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			 <command
+				 commandId="org.eclipse.efm.formalml.xtext.FormalML.validate"
+				 style="push"
+				 tooltip="Trigger expensive validation">
+			<visibleWhen checkEnabled="false">
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</visibleWhen>
+		</command>
+		</menuContribution>
+		<!-- copy qualified name -->
+		<menuContribution locationURI="popup:#TextEditorContext?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName" 
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="menu:edit?after=copy">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+		<menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName" 
+				style="push" tooltip="Copy Qualified Name">
+				<visibleWhen checkEnabled="false">
+					<and>
+						<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.XtextEditor.opened" />
+						<iterate>
+							<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+						</iterate>
+					</and>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?endof=group.find">
+			<command commandId="org.eclipse.xtext.ui.editor.FindReferences">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+			commandId="org.eclipse.xtext.ui.editor.FindReferences">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- adding resource factories -->
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="fml">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="fml">
+		</resourceServiceProvider>
+	</extension>
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="xfml">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="xfml">
+		</resourceServiceProvider>
+	</extension>
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="xlia">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="xlia">
+		</resourceServiceProvider>
+	</extension>
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="xfsp">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+		<resourceServiceProvider
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+			uriExtension="xfsp">
+		</resourceServiceProvider>
+	</extension>
+	<!-- marker definitions for org.eclipse.efm.formalml.xtext.FormalML -->
+	<extension
+			id="formalml.check.fast"
+			name="FormalML Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.fast"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="formalml.check.normal"
+			name="FormalML Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.normal"/>
+		<persistent value="true"/>
+	</extension>
+	<extension
+			id="formalml.check.expensive"
+			name="FormalML Problem"
+			point="org.eclipse.core.resources.markers">
+		<super type="org.eclipse.xtext.ui.check.expensive"/>
+		<persistent value="true"/>
+	</extension>
+	<extension point="org.eclipse.xtext.builder.participant">
+		<participant
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+			fileExtensions="fml,xfml,xlia,xfsp"/>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.compiler.preferencePage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.propertyPages">
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.compiler.propertyPage"
+			name="Compiler">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+			<enabledWhen>
+				<adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+			<filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?after=xtext.ui.openDeclaration">
+			<command
+				commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand"
+				id="org.eclipse.efm.formalml.xtext.FormalML.OpenGeneratedCode"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"
+			commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand">
+			<activeWhen>
+				<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened" />
+			</activeWhen>
+		</handler>
+	</extension>
+	<!-- Quick Outline -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+		<command
+			description="Open the quick outline."
+			id="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+			name="Quick Outline">
+		</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.open">
+			<command commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+				style="push"
+				tooltip="Open Quick Outline">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<!-- quickfix marker resolution generator for org.eclipse.efm.formalml.xtext.FormalML -->
+	<extension
+			point="org.eclipse.ui.ide.markerResolution">
+		<markerResolutionGenerator
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.formalml.xtext.ui.formalml.check.fast">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.formalml.xtext.ui.formalml.check.normal">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+		<markerResolutionGenerator
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+			markerType="org.eclipse.efm.formalml.xtext.ui.formalml.check.expensive">
+			<attribute
+				name="FIXABLE_KEY"
+				value="true">
+			</attribute>
+		</markerResolutionGenerator>
+	</extension>
+	<!-- Rename Refactoring -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
+			commandId="org.eclipse.xtext.ui.refactoring.RenameElement">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.edit">
+			<command commandId="org.eclipse.xtext.ui.refactoring.RenameElement"
+				style="push">
+				<visibleWhen checkEnabled="false">
+					<reference
+						definitionId="org.eclipse.efm.formalml.xtext.FormalML.Editor.opened">
+					</reference>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.preferencePages">
+		<page
+			category="org.eclipse.efm.formalml.xtext.FormalML"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+			id="org.eclipse.efm.formalml.xtext.FormalML.refactoring"
+			name="Refactoring">
+			<keywordReference id="org.eclipse.efm.formalml.xtext.ui.keyword_FormalML"/>
+		</page>
+	</extension>
+	<extension point="org.eclipse.compare.contentViewers">
+		<viewer id="org.eclipse.efm.formalml.xtext.FormalML.compare.contentViewers"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="fml,xfml,xlia,xfsp">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.compare.contentMergeViewers">
+		<viewer id="org.eclipse.efm.formalml.xtext.FormalML.compare.contentMergeViewers"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+			extensions="fml,xfml,xlia,xfsp" label="FormalML Compare">
+		</viewer>
+	</extension>
+	<extension point="org.eclipse.ui.editors.documentProviders">
+		<provider id="org.eclipse.efm.formalml.xtext.FormalML.editors.documentProviders"
+			class="org.eclipse.efm.formalml.xtext.ui.FormalMLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+			extensions="fml,xfml,xlia,xfsp">
+		</provider>
+	</extension>
+	<extension point="org.eclipse.team.core.fileTypes">
+		<fileTypes
+			extension="fml"
+			type="text">
+		</fileTypes>
+		<fileTypes
+			extension="xfml"
+			type="text">
+		</fileTypes>
+		<fileTypes
+			extension="xlia"
+			type="text">
+		</fileTypes>
+		<fileTypes
+			extension="xfsp"
+			type="text">
+		</fileTypes>
+	</extension>
+</plugin>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/pom.xml b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/pom.xml
new file mode 100644
index 0000000..bafbe12
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.xlia</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.formalml.xtext.ui</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.formalml.xtext.ui</name>
+	<description>This plug-in contains the xLIA's Xtext based editor UI.</description>
+
+	
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/AbstractFormalMLUiModule.java b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/AbstractFormalMLUiModule.java
new file mode 100644
index 0000000..18ef27d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/AbstractFormalMLUiModule.java
@@ -0,0 +1,289 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui;
+
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import org.eclipse.compare.IViewerCreator;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.efm.formalml.xtext.ide.contentassist.antlr.FormalMLParser;
+import org.eclipse.efm.formalml.xtext.ide.contentassist.antlr.PartialFormalMLContentAssistParser;
+import org.eclipse.efm.formalml.xtext.ide.contentassist.antlr.internal.InternalFormalMLLexer;
+import org.eclipse.efm.formalml.xtext.ui.contentassist.FormalMLProposalProvider;
+import org.eclipse.efm.formalml.xtext.ui.labeling.FormalMLDescriptionLabelProvider;
+import org.eclipse.efm.formalml.xtext.ui.labeling.FormalMLLabelProvider;
+import org.eclipse.efm.formalml.xtext.ui.outline.FormalMLOutlineTreeProvider;
+import org.eclipse.efm.formalml.xtext.ui.quickfix.FormalMLQuickfixProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.builder.BuilderParticipant;
+import org.eclipse.xtext.builder.EclipseOutputConfigurationProvider;
+import org.eclipse.xtext.builder.IXtextBuilderParticipant;
+import org.eclipse.xtext.builder.builderState.IBuilderState;
+import org.eclipse.xtext.builder.clustering.CurrentDescriptions;
+import org.eclipse.xtext.builder.impl.PersistentDataAwareDirtyResource;
+import org.eclipse.xtext.builder.nature.NatureAddingEditorCallback;
+import org.eclipse.xtext.builder.preferences.BuilderPreferenceAccess;
+import org.eclipse.xtext.generator.IContextualOutputConfigurationProvider;
+import org.eclipse.xtext.ide.LexerIdeBindings;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.IContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.service.SingletonBinding;
+import org.eclipse.xtext.ui.DefaultUiModule;
+import org.eclipse.xtext.ui.codetemplates.ui.AccessibleCodetemplatesActivator;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.PartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.AdvancedTemplatesPreferencePage;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.TemplatesLanguageConfiguration;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistrar;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistry;
+import org.eclipse.xtext.ui.compare.DefaultViewerCreator;
+import org.eclipse.xtext.ui.editor.DocumentBasedDirtyResource;
+import org.eclipse.xtext.ui.editor.IXtextEditorCallback;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.FQNPrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.IContentProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.IProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.AntlrProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.DelegatingContentAssistContextFactory;
+import org.eclipse.xtext.ui.editor.outline.IOutlineTreeProvider;
+import org.eclipse.xtext.ui.editor.outline.impl.IOutlineTreeStructureProvider;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider;
+import org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage;
+import org.eclipse.xtext.ui.refactoring.IDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.IReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.IRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.IRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.ui.DefaultRenameSupport;
+import org.eclipse.xtext.ui.refactoring.ui.IRenameSupport;
+import org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferences;
+import org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider;
+import org.eclipse.xtext.ui.shared.Access;
+
+/**
+ * Manual modifications go to {@link FormalMLUiModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractFormalMLUiModule extends DefaultUiModule {
+
+	public AbstractFormalMLUiModule(AbstractUIPlugin plugin) {
+		super(plugin);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ImplicitFragment
+	public Provider<IAllContainersState> provideIAllContainersState() {
+		return Access.getJavaProjectsState();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IProposalConflictHelper> bindIProposalConflictHelper() {
+		return AntlrProposalConflictHelper.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureContentAssistLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.CONTENT_ASSIST))
+			.to(InternalFormalMLLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureHighlightingLexer(Binder binder) {
+		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(org.eclipse.efm.formalml.xtext.parser.antlr.internal.InternalFormalMLLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureHighlightingTokenDefProvider(Binder binder) {
+		binder.bind(ITokenDefProvider.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(AntlrTokenDefProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ContentAssistContext.Factory> bindContentAssistContext$Factory() {
+		return DelegatingContentAssistContextFactory.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IContentAssistParser> bindIContentAssistParser() {
+		return FormalMLParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureContentAssistLexerProvider(Binder binder) {
+		binder.bind(InternalFormalMLLexer.class).toProvider(LexerProvider.create(InternalFormalMLLexer.class));
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+	public Class<? extends PrefixMatcher> bindPrefixMatcher() {
+		return FQNPrefixMatcher.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsBuilderScope(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.NAMED_BUILDER_SCOPE)).to(CurrentDescriptions.ResourceSetAware.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IXtextEditorCallback> bindIXtextEditorCallback() {
+		return NatureAddingEditorCallback.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContextualOutputConfigurationProvider> bindIContextualOutputConfigurationProvider() {
+		return EclipseOutputConfigurationProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsPersisted(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(IBuilderState.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends DocumentBasedDirtyResource> bindDocumentBasedDirtyResource() {
+		return PersistentDataAwareDirtyResource.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public Class<? extends IXtextBuilderParticipant> bindIXtextBuilderParticipant() {
+		return BuilderParticipant.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public IWorkspaceRoot bindIWorkspaceRootToInstance() {
+		return ResourcesPlugin.getWorkspace().getRoot();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public void configureBuilderPreferenceStoreInitializer(Binder binder) {
+		binder.bind(IPreferenceStoreInitializer.class)
+			.annotatedWith(Names.named("builderPreferenceInitializer"))
+			.to(BuilderPreferenceAccess.Initializer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public Class<? extends ILabelProvider> bindILabelProvider() {
+		return FormalMLLabelProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public void configureResourceUIServiceLabelProvider(Binder binder) {
+		binder.bind(ILabelProvider.class).annotatedWith(ResourceServiceDescriptionLabelProvider.class).to(FormalMLDescriptionLabelProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeProvider> bindIOutlineTreeProvider() {
+		return FormalMLOutlineTreeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
+		return FormalMLOutlineTreeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.quickfix.QuickfixProviderFragment2
+	public Class<? extends IssueResolutionProvider> bindIssueResolutionProvider() {
+		return FormalMLQuickfixProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.contentAssist.ContentAssistFragment2
+	public Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
+		return FormalMLProposalProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameStrategy> bindIRenameStrategy() {
+		return DefaultRenameStrategy.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IReferenceUpdater> bindIReferenceUpdater() {
+		return DefaultReferenceUpdater.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public void configureIPreferenceStoreInitializer(Binder binder) {
+		binder.bind(IPreferenceStoreInitializer.class)
+			.annotatedWith(Names.named("RefactoringPreferences"))
+			.to(RefactoringPreferences.Initializer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
+		return DefaultRenameRefactoringProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameSupport.Factory> bindIRenameSupport$Factory() {
+		return DefaultRenameSupport.Factory.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<TemplatesLanguageConfiguration> provideTemplatesLanguageConfiguration() {
+		return AccessibleCodetemplatesActivator.getTemplatesLanguageConfigurationProvider();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<LanguageRegistry> provideLanguageRegistry() {
+		return AccessibleCodetemplatesActivator.getLanguageRegistry();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends LanguageRegistrar> bindLanguageRegistrar() {
+		return LanguageRegistrar.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends XtextTemplatePreferencePage> bindXtextTemplatePreferencePage() {
+		return AdvancedTemplatesPreferencePage.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistParser> bindIPartialEditingContentAssistParser() {
+		return PartialFormalMLContentAssistParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistContextFactory> bindIPartialEditingContentAssistContextFactory() {
+		return PartialEditingContentAssistContextFactory.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.compare.CompareFragment2
+	public Class<? extends IViewerCreator> bindIViewerCreator() {
+		return DefaultViewerCreator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.SimpleNamesFragment2
+	public Class<? extends IDependentElementsCalculator> bindIDependentElementsCalculator() {
+		return DefaultDependentElementsCalculator.class;
+	}
+	
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/FormalMLExecutableExtensionFactory.java b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/FormalMLExecutableExtensionFactory.java
new file mode 100644
index 0000000..3575ea0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/FormalMLExecutableExtensionFactory.java
@@ -0,0 +1,36 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui;
+
+import com.google.inject.Injector;
+import org.eclipse.efm.formalml.xtext.ui.internal.XtextActivator;
+import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
+import org.osgi.framework.Bundle;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass. 
+ */
+public class FormalMLExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
+
+	@Override
+	protected Bundle getBundle() {
+		return XtextActivator.getInstance().getBundle();
+	}
+	
+	@Override
+	protected Injector getInjector() {
+		return XtextActivator.getInstance().getInjector(XtextActivator.ORG_ECLIPSE_EFM_FORMALML_XTEXT_FORMALML);
+	}
+	
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/contentassist/AbstractFormalMLProposalProvider.java b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/contentassist/AbstractFormalMLProposalProvider.java
new file mode 100644
index 0000000..071a61e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/contentassist/AbstractFormalMLProposalProvider.java
@@ -0,0 +1,2771 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui.contentassist;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+
+/**
+ * Represents a generated, default implementation of superclass {@link TerminalsProposalProvider}.
+ * Methods are dynamically dispatched on the first parameter, i.e., you can override them 
+ * with a more concrete subtype. 
+ */
+public abstract class AbstractFormalMLProposalProvider extends TerminalsProposalProvider {
+
+	public void completeXlia_Prolog(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeXlia_System(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeXliaPrologObject_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeXliaPrologObject_Elements(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeXliaPrologAttribute_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeXliaPrologAttribute_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(1)), context, acceptor);
+	}
+	public void completeXliaOptionObject_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeXliaOptionObject_Elements(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeXliaObject_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeXliaObject_Elements(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeXliaAttribute_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeXliaAttribute_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeQualifiedName_NameBinding(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePotentiallyAmbiguousQualifiedName_NameBinding(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePotentiallyAmbiguousQualifiedName_IsAmbiguous(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeColonQualifiedName_NameBinding(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDotQualifiedName_NameBinding(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUnqualifiedName_NameBinding(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Timed(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeSystem_Input_enabled(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeSystem_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Port(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Signal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Channel(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Routine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Procedure(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Machine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Instance(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Behavior(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSystem_Main(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInstanceMachine_Model(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInstanceMachine_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInstanceMachine_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInstanceMachine_Slot(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSlotParameter_XliaProperty(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSlotParameter_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSlotProperty_XliaProperty(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSlotProperty_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Timed(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeMachineBlock_Input_enabled(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeMachineBlock_Design(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Port(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Signal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Channel(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Routine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Procedure(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Machine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Instance(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Behavior(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMachineBlock_Main(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Port(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Signal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Channel(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Routine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Procedure(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Region(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedure_Execution(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedureExecution_ScheduleRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProcedureExecution_RunRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeBehavior_Port(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeBehavior_Signal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeBehavior_Buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeBehavior_Channel(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeBehavior_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeBehavior_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeBehavior_Execution(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeBehavior_Interaction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Timed(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachine_Input_enabled(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStatemachine_Design(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Port(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Signal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Channel(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Routine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Procedure(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Region(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Execution(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachine_Interaction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineRegion_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineRegion_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineRegion_Vertex(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStatemachineRegionLite_Vertex(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCompositeState_Composite(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeCompositeState_Orthogonal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeCompositeState_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCompositeState_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCompositeState_Region(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCompositeState_Moe(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCompositeState_Transition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeCompositeStateRoutines_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeMoeCompositeStateRoutines_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSimpleState_Simple(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeSimpleState_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSimpleState_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSimpleState_Transition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSimpleState_Moe(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeSimpleStateRoutines_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeMoeSimpleStateRoutines_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStartState_Simple(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStartState_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStartState_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStartState_Transition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStartState_Moe(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeStartStateRoutines_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeMoeStartStateRoutines_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFinalState_Simple(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeFinalState_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFinalState_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFinalState_Moe(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeFinalStateRoutines_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeMoeFinalStateRoutines_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherPseudostate_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherPseudostate_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherPseudostate_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherPseudostate_Transition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePseudostateInitial_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePseudostateInitial_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completePseudostateInitial_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePseudostateInitial_Transition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEndingPseudostate_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEndingPseudostate_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEndingPseudostate_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEndingPseudostate_Moe(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfExecution_Routine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfExecution_InitRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfExecution_FinalRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfExecution_EnableRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfExecution_DisableRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfExecution_ConcurrencyRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfExecution_ScheduleRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfExecution_IrunRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfExecution_RunRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeRoutine_Domain(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeRoutine_Codomain(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMoeRoutine_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoutine_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoutine_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoutine_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoutine_Domain(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoutine_Codomain(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoutine_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfInteraction_Routes(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModelOfInteraction_Connections(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoute_Protocol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoute_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoute_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRoute_Signals(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComRouteProtocol_Protocol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComRouteProtocol_Inner_buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComRouteProtocol_Ref_buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeConnection_Protocol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeConnection_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeConnection_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeConnection_ComPoints(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComProtocol_Protocol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComProtocol_Cast(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComProtocol_Inner_buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComProtocol_Ref_buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComPoint_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComPoint_Protocol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComPoint_Point(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComPoint_Points(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComPointProtocol_Protocol(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComPointProtocol_Inner_buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComPointProtocol_Ref_buffer(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComElement_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(1)), context, acceptor);
+	}
+	public void completeComElement_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeComElement_Target(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataTypeReference_Multiplicity(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataTypeReference_Typeref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinition_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinition_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinition_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinition_Support(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinition_Multiplicity(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinition_Typeref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinition_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeOtherDataTypeDefinitionImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinitionImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinitionImpl_Support(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinitionImpl_Multiplicity(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinitionImpl_Typeref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOtherDataTypeDefinitionImpl_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completePrimitiveIntegerType_Sign(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveIntegerType_Size(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveRationalType_Sign(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveRationalType_Size(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveFloatType_Sign(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveFloatType_Size(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveRealType_Sign(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveRealType_Size(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveTimeType_Support(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveTimeType_Clock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completePrimitiveStringType_Size(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveInstanceType_Expected(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimitiveInstanceType_Model(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalType_Support(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalType_Lopen(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeIntervalType_Infimum(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalType_Supremum(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalType_Ropen(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeIntervalTypeDefinition_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinition_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinition_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinition_Support(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinition_Lopen(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeIntervalTypeDefinition_Infimum(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinition_Supremum(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinition_Ropen(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeIntervalTypeDefinitionImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinitionImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinitionImpl_Support(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinitionImpl_Lopen(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeIntervalTypeDefinitionImpl_Infimum(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinitionImpl_Supremum(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIntervalTypeDefinitionImpl_Ropen(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeCollectionType_Container(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionType_Support(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionType_Size(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionType_Unbounded(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeCollectionTypeDefinition_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinition_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinition_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinition_Container(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinition_Support(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinition_Size(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinition_Unbounded(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeCollectionTypeDefinitionImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinitionImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinitionImpl_Container(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinitionImpl_Support(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinitionImpl_Size(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCollectionTypeDefinitionImpl_Unbounded(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeEnumerationType_Literal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationTypeDefinition_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationTypeDefinition_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationTypeDefinition_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationTypeDefinition_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeEnumerationTypeDefinition_Literal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationTypeDefinitionImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationTypeDefinitionImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationTypeDefinitionImpl_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeEnumerationTypeDefinitionImpl_Literal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationLiteral_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationLiteral_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEnumerationLiteral_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStructureType_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStructureTypeDefinition_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStructureTypeDefinition_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStructureTypeDefinition_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStructureTypeDefinition_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStructureTypeDefinition_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStructureTypeDefinitionImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStructureTypeDefinitionImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStructureTypeDefinitionImpl_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeStructureTypeDefinitionImpl_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUnionType_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUnionTypeDefinition_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUnionTypeDefinition_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUnionTypeDefinition_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUnionTypeDefinition_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeUnionTypeDefinition_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUnionTypeDefinitionImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUnionTypeDefinitionImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeUnionTypeDefinitionImpl_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeUnionTypeDefinitionImpl_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChoiceType_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChoiceTypeDefinition_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChoiceTypeDefinition_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChoiceTypeDefinition_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChoiceTypeDefinition_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeChoiceTypeDefinition_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChoiceTypeDefinitionImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChoiceTypeDefinitionImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChoiceTypeDefinitionImpl_Typedef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeChoiceTypeDefinitionImpl_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeModifier_Static(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeModifier_Final(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeModifier_Reference(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeModifier_Volatile(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeModifier_Transient(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariable_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariable_Modifier(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariable_Const(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariable_Macro(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariable_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariable_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariable_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariable_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariable_OnWriteAction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableImpl_Const(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariableImpl_Macro(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariableImpl_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableImpl_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableImpl_OnWriteAction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOnWriteRoutine_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOnWriteRoutine_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableRoutineParameter_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableRoutineParameter_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableRoutineParameter_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePublic_Modifier(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePublic_Const(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariablePublic_Macro(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariablePublic_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePublic_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePublic_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePublic_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePublic_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePublic_OnWriteAction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableProtected_Modifier(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableProtected_Const(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariableProtected_Macro(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariableProtected_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableProtected_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableProtected_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableProtected_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableProtected_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariableProtected_OnWriteAction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePrivate_Modifier(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePrivate_Const(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariablePrivate_Macro(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeVariablePrivate_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePrivate_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePrivate_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePrivate_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePrivate_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeVariablePrivate_OnWriteAction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFunctionalParameterSet_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFunctionalParameter_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFunctionalParameter_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFunctionalParameter_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFunctionalParameter_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFormalParameterSet_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFormalParameter_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFormalParameter_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFormalParameter_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeFormalParameter_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBlockParameterSet_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInput_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInput_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInput_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInput_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInput_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInout_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInout_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInout_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInout_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterInout_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterOutput_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterOutput_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterOutput_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterOutput_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterOutput_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterReturn_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterReturn_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterReturn_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterReturn_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterReturn_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterDeclaration_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterDeclaration_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterDeclaration_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterDeclaration_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeParameterDeclaration_DefaultValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferContainerType_Container(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferContainerType_Size(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferContainerType_Unbounded(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeBuffer_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBuffer_Modifier(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBuffer_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBuffer_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBuffer_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferImpl_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPublic_Modifier(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPublic_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPublic_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPublic_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPublic_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferProtected_Modifier(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferProtected_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferProtected_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferProtected_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferProtected_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPrivate_Modifier(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPrivate_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPrivate_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPrivate_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBufferPrivate_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePort_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePort_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePort_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePort_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePort_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortImpl_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortImpl_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPublic_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPublic_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPublic_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPublic_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPublic_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortProtected_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortProtected_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortProtected_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortProtected_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortProtected_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPrivate_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPrivate_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPrivate_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPrivate_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePortPrivate_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignal_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignal_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignal_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignal_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignal_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalImpl_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalImpl_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalImpl_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalImpl_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPublic_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPublic_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPublic_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPublic_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPublic_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalProtected_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalProtected_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalProtected_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalProtected_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalProtected_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPrivate_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPrivate_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPrivate_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPrivate_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalPrivate_Parameter(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannel_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannel_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannel_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannel_Signal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalReference_Direction(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSignalReference_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelPublic_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelPublic_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelPublic_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelPublic_Signal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelProtected_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelProtected_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelProtected_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelProtected_Signal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelPrivate_Visibility(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelPrivate_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelPrivate_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeChannelPrivate_Signal(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransition_Transient(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeTransition_Moe(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransition_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransition_UnrestrictedName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransition_Trigger(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransition_Guard(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransition_Tguard(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransition_Effect(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransition_Behavior(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransition_Target(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionMoe_Moc(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionMoe_IsElse(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeTransitionMoe_Prior(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionBehavior_Op(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionBehavior_Statement(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionGuard_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionGuardExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeTransitionGuardExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionTimedGuard_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTransitionEffect_Statement(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBlockStatement_Op(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBlockStatement_Statement(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeExpressionStatement_Expression(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeGuardStatement_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeTimedGuardStatement_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEventGuardStatement_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCheckSatGuardStatement_Solver(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCheckSatGuardStatement_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInputComStatement_Port(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInputComStatement_LeftValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInputComStatement_Target(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInputComStatement_Route(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOutputComStatement_Port(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOutputComStatement_RigthValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOutputComStatement_Target(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeOutputComStatement_Route(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeExpressionAsMachine_Machine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIfStatement_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIfStatement_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIfStatement_ElseifStatement(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIfStatement_ElseBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeElseIfStatement_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeElseIfStatement_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeWhileDoStatement_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeWhileDoStatement_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDoWhileStatement_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDoWhileStatement_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeForStatement_Init(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeForStatement_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeForStatement_Iterate(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeForStatement_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeForEachStatement_Iterator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeForEachStatement_Enumeration(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeForEachStatement_BodyBlock(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInterruptStatement_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInterruptStatement_Expr(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeActivityStatement_Op(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeActivityStatement_Machine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeActivityStatement_Tuple(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInvokeStatement_Expression(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInvokeStatement_Invokable(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInvokeStatement_ExecRoutine(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeInvokeStatement_Args(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInvokeStatement_Rets(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInvokeStatement_CallProcedure(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeAssignmentExpression_LeftHandSide(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeAssignmentExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeAssignmentExpression_RigthHandSide(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLeftHandSideExpression_Lvalue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeConditionalTestExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeConditionalTestExpression_ThenOperand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeConditionalTestExpression_ElseOperand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLogicalOrExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeLogicalOrExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLogicalAndExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeLogicalAndExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBitwiseOrExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeBitwiseOrExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBitwiseXorExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeBitwiseXorExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBitwiseAndExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeBitwiseAndExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEqualityExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEqualityExpression_RigthOperand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRelationalExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRelationalExpression_RigthOperand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeRelationalExpression_RigthOperator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeAdditiveExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeAdditiveExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMultiplicativeExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeMultiplicativeExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIncrementOrDecrementPostfixExpression_LeftHandSide(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIncrementOrDecrementPostfixExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIncrementOrDecrementPrefixExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeIncrementOrDecrementPrefixExpression_LeftHandSide(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNewfreshExpression_LeftHandSide(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCastExpression_Datatype(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeCastExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeArithmeticUnaryExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeArithmeticUnaryExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLogicalUnaryExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+		// subclasses may override
+	}
+	public void completeLogicalUnaryExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeBitwiseUnaryExpression_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeBitwiseUnaryExpression_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimaryExpression_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimaryExpression_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePrimaryExpression_Arg(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInvokeExpression_Invoke(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInvokeExpressionDeprecated_Args(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInvokeExpressionDeprecated_Invoke(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInstantiationExpression_Instance(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDynamicInstanceSpecification_Model(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDynamicInstanceSpecification_Slot(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeMixTupleExpressionList_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+		completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(1)), context, acceptor);
+	}
+	public void completePositionalTupleExpressionList_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNamedExpression_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNamedExpression_Expression(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralBooleanExpression_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralIntegerExpression_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralRationalExpression_Numerator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralRationalExpression_Denominator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralFloatExpression_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralCharacterExpression_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralStringExpression_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralNullExpression_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralCollectionExpression_Datatype(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralCollectionExpression_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralReferenceElement_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralReferenceElement_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralReferenceElement_Arg(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeLiteralPureReferenceElement_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeValueSelectionExpression_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeValueSelectionExpression_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeValueSelectionExpression_Arg(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeValuePureNamedMachineExpression_Kind(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeValuePureNamedMachineExpression_Element(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+
+	public void complete_Xlia(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_XliaPrologObject(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_XliaPrologAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_XliaOptionObject(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_XliaNamedElement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_XliaObject(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_XliaAttribute(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EBoolean(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_INT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EInt(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EInteger(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EFloat(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EDouble(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_CHARACTER(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ECharacter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EString(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ReservedWord(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_XLIA_ID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ESIdentifier(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ESUfid(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_UnrestrictedName(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_QualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PotentiallyAmbiguousQualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ColonQualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DotQualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_UnqualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_NameBinding(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_VisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DesignKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DesignInstanceKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_System(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_AnyMachineBlock(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_InstanceMachine(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SlotParameter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SlotProperty(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_MachineBlock(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Procedure(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ProcedureExecution(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Behavior(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_MoeBehavior(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Statemachine(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineRegion(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StatemachineRegionLite(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_State(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_CompositeState(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_moeCompositeStateRoutines(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SimpleState(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_moeSimpleStateRoutines(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StartState(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_moeStartStateRoutines(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_FinalState(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_moeFinalStateRoutines(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Pseudostate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_OtherPseudostate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PseudostateKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PseudostateInitial(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PseudostateInitialKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EndingPseudostate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EndingPseudostateKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ModelOfComputation(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ModelOfExecution(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_moeRoutine(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Routine(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ModelOfInteraction(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Route(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ComRouteProtocol(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Connection(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ComProtocol(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ComProtocolKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ComEnvRdvProtocolKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ComMultiRdvProtocolKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BufferProtocolKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ComCastKing(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ComPoint(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ComPointProtocol(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ComElement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TypeDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TypeDefinitionImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DataTypeMultiplicity(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DataTypeReference(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_OtherDataTypeDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_OtherDataTypeDefinitionImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DataType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SimpleDataType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StructuredDataType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveNumberType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveNumberSign(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveIntegerType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveRationalType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveFloatType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveRealType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveTimeType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveTimeNumberType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_OtherPrimitiveType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveBooleanType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveCharacterType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveStringType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveInstanceKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimitiveInstanceType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_IntervalType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_IntervalTypeDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_IntervalTypeDefinitionImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_CollectionType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_CollectionTypeDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_CollectionTypeDefinitionImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_CollectionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EnumerationType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EnumerationTypeDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EnumerationTypeDefinitionImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EnumerationLiteral(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StructureType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StructureTypeDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StructureTypeDefinitionImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_UnionType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_UnionTypeDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_UnionTypeDefinitionImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ChoiceType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ChoiceTypeDefinition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ChoiceTypeDefinitionImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Modifier(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Variable(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_VariableImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_OnWriteRoutine(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_VariableRoutineParameter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PublicVariableVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_VariablePublic(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ProtectedVariableVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_VariableProtected(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrivateVariableVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_VariablePrivate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterDirectionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_FunctionalParameterSet(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_FunctionalParameter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_FormalParameterSet(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_FormalParameter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BlockParameterDirectionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BlockParameterSet(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterInputDirectionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterInput(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterInoutDirectionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterInout(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterOutputDirectionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterOutput(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterReturnDirectionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterReturn(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ParameterDeclaration(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BufferContainerType(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BufferContainerKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Buffer(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BufferImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PublicBufferVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BufferPublic(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ProtectedBufferVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BufferProtected(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrivateBufferVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BufferPrivate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Port(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PortImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PublicPortVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PortPublic(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ProtectedPortVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PortProtected(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrivatePortVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PortPrivate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Signal(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SignalImpl(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PublicSignalVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SignalPublic(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ProtectedSignalVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SignalProtected(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrivateSignalVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SignalPrivate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ChannelDirection(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Channel(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_SignalReference(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PublicChannelVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ChannelPublic(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ProtectedChannelVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ChannelProtected(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrivateChannelVisibilityKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ChannelPrivate(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Transition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TransitionMoe(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TransitionMoc(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TransitionBehavior(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TransitionTrigger(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TransitionGuard(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TransitionGuardExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TransitionTimedGuard(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TransitionEffect(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TransitionEffectStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Statement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BlockStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BlockStatementScheduler(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ExpressionStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_GuardStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TimedGuardStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EventGuardStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_CheckSatGuardStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_InputComStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_OutputComStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ExpressionAsMachine(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_IfStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ElseIfStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_WhileDoStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DoWhileStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ForStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ForAssignmentExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ForEachStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_InterruptStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_InterruptStatementKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ActivityStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_OPERATOR_ACTIVITY(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_InvokeStatement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Expression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_AssignmentExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_AssignmentOperator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LeftHandSideExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ConditionalTestExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LogicalOrExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LogicalAndExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BitwiseOrExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BitwiseXorExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BitwiseAndExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EqualityExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EqualityOperator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_RelationalExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_RelationalOperator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_AdditiveExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_MultiplicativeExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_UnaryExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PostfixUnaryExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_IncrementOrDecrementPostfixExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrefixUnaryExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_IncrementOrDecrementPrefixExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_AffixOperator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_NewfreshExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_CastExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ArithmeticUnaryExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ArithmeticUnaryOperator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LogicalUnaryExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BitwiseUnaryExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PrimaryExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_BaseExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_InvokeExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_InvokeExpressionDeprecated(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_InstantiationExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DynamicInstanceSpecification(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_TupleParameterExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_MixTupleExpressionList(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PositionalTupleExpressionList(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_NamedExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralReferenceableExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralTerminalExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralBooleanExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralIntegerExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralRationalExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralFloatExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralCharacterExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralStringExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralNullExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralCollectionExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralReferenceExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralReferenceElement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralPureReferenceElement(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralReferenceVariableContext(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralTimeExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralTimeDeltaExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralReferenceMachineContext(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralThisExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralSelfExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralParentExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralSuperExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralSystemExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralEnvExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LiteralPureReferenceExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ValueSelectionExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ValuePureNamedMachineExpression(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ValueDotFieldExpressionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ValueColonFieldExpressionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ValueDoubleColonFieldExpressionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ValueArrowFieldExpressionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ValueIndexExpressionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_ValueParameterExpressionKind(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/internal/XtextActivator.java b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/internal/XtextActivator.java
new file mode 100644
index 0000000..a29d291
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src-gen/org/eclipse/efm/formalml/xtext/ui/internal/XtextActivator.java
@@ -0,0 +1,102 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui.internal;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import java.util.Collections;
+import java.util.Map;
+import org.apache.log4j.Logger;
+import org.eclipse.efm.formalml.xtext.FormalMLRuntimeModule;
+import org.eclipse.efm.formalml.xtext.ui.FormalMLUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.ui.shared.SharedStateModule;
+import org.eclipse.xtext.util.Modules2;
+import org.osgi.framework.BundleContext;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass. 
+ */
+public class XtextActivator extends AbstractUIPlugin {
+
+	public static final String ORG_ECLIPSE_EFM_FORMALML_XTEXT_FORMALML = "org.eclipse.efm.formalml.xtext.FormalML";
+	
+	private static final Logger logger = Logger.getLogger(XtextActivator.class);
+	
+	private static XtextActivator INSTANCE;
+	
+	private Map<String, Injector> injectors = Collections.synchronizedMap(Maps.<String, Injector> newHashMapWithExpectedSize(1));
+	
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		INSTANCE = this;
+	}
+	
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		injectors.clear();
+		INSTANCE = null;
+		super.stop(context);
+	}
+	
+	public static XtextActivator getInstance() {
+		return INSTANCE;
+	}
+	
+	public Injector getInjector(String language) {
+		synchronized (injectors) {
+			Injector injector = injectors.get(language);
+			if (injector == null) {
+				injectors.put(language, injector = createInjector(language));
+			}
+			return injector;
+		}
+	}
+	
+	protected Injector createInjector(String language) {
+		try {
+			Module runtimeModule = getRuntimeModule(language);
+			Module sharedStateModule = getSharedStateModule();
+			Module uiModule = getUiModule(language);
+			Module mergedModule = Modules2.mixin(runtimeModule, sharedStateModule, uiModule);
+			return Guice.createInjector(mergedModule);
+		} catch (Exception e) {
+			logger.error("Failed to create injector for " + language);
+			logger.error(e.getMessage(), e);
+			throw new RuntimeException("Failed to create injector for " + language, e);
+		}
+	}
+	
+	protected Module getRuntimeModule(String grammar) {
+		if (ORG_ECLIPSE_EFM_FORMALML_XTEXT_FORMALML.equals(grammar)) {
+			return new FormalMLRuntimeModule();
+		}
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getUiModule(String grammar) {
+		if (ORG_ECLIPSE_EFM_FORMALML_XTEXT_FORMALML.equals(grammar)) {
+			return new FormalMLUiModule(this);
+		}
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getSharedStateModule() {
+		return new SharedStateModule();
+	}
+	
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/FormalMLUiModule.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/FormalMLUiModule.xtend
new file mode 100644
index 0000000..c8082fa
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/FormalMLUiModule.xtend
@@ -0,0 +1,22 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui
+
+import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
+
+/**
+ * Use this class to register components to be used within the Eclipse IDE.
+ */
+@FinalFieldsConstructor
+class FormalMLUiModule extends AbstractFormalMLUiModule {
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/contentassist/FormalMLProposalProvider.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/contentassist/FormalMLProposalProvider.xtend
new file mode 100644
index 0000000..27bbd2b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/contentassist/FormalMLProposalProvider.xtend
@@ -0,0 +1,21 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui.contentassist
+
+
+/**
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#content-assist
+ * on how to customize the content assistant.
+ */
+class FormalMLProposalProvider extends AbstractFormalMLProposalProvider {
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/labeling/FormalMLDescriptionLabelProvider.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/labeling/FormalMLDescriptionLabelProvider.xtend
new file mode 100644
index 0000000..637dbf6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/labeling/FormalMLDescriptionLabelProvider.xtend
@@ -0,0 +1,33 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui.labeling
+
+import org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider
+
+/**
+ * Provides labels for IEObjectDescriptions and IResourceDescriptions.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+class FormalMLDescriptionLabelProvider extends DefaultDescriptionLabelProvider {
+
+	// Labels and icons can be computed like this:
+	
+//	override text(IEObjectDescription ele) {
+//		ele.name.toString
+//	}
+//	 
+//	override image(IEObjectDescription ele) {
+//		ele.EClass.name + '.gif'
+//	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/labeling/FormalMLLabelProvider.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/labeling/FormalMLLabelProvider.xtend
new file mode 100644
index 0000000..eb286c1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/labeling/FormalMLLabelProvider.xtend
@@ -0,0 +1,1405 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui.labeling
+
+import com.google.inject.Inject
+import org.eclipse.efm.ecore.formalml.common.NamedElement
+import org.eclipse.efm.ecore.formalml.common.QualifiedName
+import org.eclipse.efm.ecore.formalml.common.Type
+import org.eclipse.efm.ecore.formalml.datatype.ChoiceType
+import org.eclipse.efm.ecore.formalml.datatype.CollectionType
+import org.eclipse.efm.ecore.formalml.datatype.DataSupportedType
+import org.eclipse.efm.ecore.formalml.datatype.DataType
+import org.eclipse.efm.ecore.formalml.datatype.DataTypeReference
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationType
+import org.eclipse.efm.ecore.formalml.datatype.IntervalType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveType
+import org.eclipse.efm.ecore.formalml.datatype.StructureType
+import org.eclipse.efm.ecore.formalml.datatype.UnionType
+import org.eclipse.efm.ecore.formalml.expression.AssignmentExpression
+import org.eclipse.efm.ecore.formalml.expression.AssociativeExpression
+import org.eclipse.efm.ecore.formalml.expression.BinaryExpression
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsPort
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementExpression
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPostfixExpression
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPrefixExpression
+import org.eclipse.efm.ecore.formalml.expression.InstantiationExpression
+import org.eclipse.efm.ecore.formalml.expression.InvokeExpression
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement
+import org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression
+import org.eclipse.efm.ecore.formalml.expression.NewfreshExpression
+import org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression
+import org.eclipse.efm.ecore.formalml.expression.UnaryExpression
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer
+import org.eclipse.efm.ecore.formalml.infrastructure.ComCastKind
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol
+import org.eclipse.efm.ecore.formalml.infrastructure.Connection
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter
+import org.eclipse.efm.ecore.formalml.infrastructure.Port
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition
+import org.eclipse.efm.ecore.formalml.infrastructure.Route
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty
+import org.eclipse.efm.ecore.formalml.infrastructure.System 
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable
+import org.eclipse.efm.ecore.formalml.statemachine.FinalState
+import org.eclipse.efm.ecore.formalml.statemachine.Pseudostate
+import org.eclipse.efm.ecore.formalml.statemachine.Region
+import org.eclipse.efm.ecore.formalml.statemachine.StartState
+import org.eclipse.efm.ecore.formalml.statemachine.State
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine
+import org.eclipse.efm.ecore.formalml.statemachine.Transition
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoc
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe
+import org.eclipse.efm.ecore.formalml.statement.ActivityStatement
+import org.eclipse.efm.ecore.formalml.statement.AssignmentStatement
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement
+import org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement
+import org.eclipse.efm.ecore.formalml.statement.DoWhileStatement
+import org.eclipse.efm.ecore.formalml.statement.ExpressionStatement
+import org.eclipse.efm.ecore.formalml.statement.ForEachStatement
+import org.eclipse.efm.ecore.formalml.statement.ForStatement
+import org.eclipse.efm.ecore.formalml.statement.GuardStatement
+import org.eclipse.efm.ecore.formalml.statement.IfStatement
+import org.eclipse.efm.ecore.formalml.statement.InputComStatement
+import org.eclipse.efm.ecore.formalml.statement.InterruptStatement
+import org.eclipse.efm.ecore.formalml.statement.OutputComStatement
+import org.eclipse.efm.ecore.formalml.statement.Statement
+import org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement
+import org.eclipse.efm.ecore.formalml.statement.WhileDoStatement
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider
+import org.eclipse.jface.viewers.StyledString
+import org.eclipse.xtext.naming.IQualifiedNameProvider
+import org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider
+
+/**
+ * Provides labels for EObjects.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+class FormalMLLabelProvider extends DefaultEObjectLabelProvider {
+
+	@Inject
+	new(AdapterFactoryLabelProvider delegate) {
+		super(delegate);
+	}
+
+	// Labels and icons can be computed like this:
+
+//	def text(Greeting ele) {
+//		'A greeting to ' + ele.name
+//	}
+//
+//	def image(Greeting ele) {
+//		'Greeting.gif'
+//	}
+
+
+	def fqnString(QualifiedName qualifiedname) {
+		var path = ""
+		var sep = ""
+		for( name : qualifiedname.nameBinding ) {
+			path += sep + name
+			if( sep.isEmpty ) {
+				sep = "."
+			}
+		}
+		if( qualifiedname.unqualifiedName != null ) {
+			path += sep + qualifiedname.unqualifiedName
+		}
+
+		path
+	}
+
+
+	@Inject
+	private IQualifiedNameProvider nameProvider;
+
+	def text(NamedElement decl) {
+		val fqn = nameProvider.getFullyQualifiedName(decl);
+
+		fqn?.toString ?: "no qfn: " + ( decl.name ?: "<unamed>" )
+	}
+
+
+	def text(PropertyDefinition decl) {
+		val fqn = nameProvider.getFullyQualifiedName(decl);
+
+		fqn?.toString ?: "no qfn: " + ( decl.name ?: "<property>" )
+	}
+
+
+
+	def text(Parameter decl) {
+		decl.name ?: "<parameter>"
+	}
+
+	def image(Parameter decl) {
+		switch( decl.direction ) {
+			case IN    : "fml/Parameter_in.gif"
+			case OUT   : "fml/Parameter_out.gif"
+
+			case INOUT :  "fml/Parameter_inout.gif"
+
+			case RETURN:  "fml/Parameter_return.gif"
+
+			default: "fml/Port.gif"
+		}
+	}
+
+
+	def text(Port decl) {
+		val fqn = nameProvider.getFullyQualifiedName(decl);
+		if( fqn != null ) {
+			fqn.toString();
+		}
+		else {
+	  		"no qfn: " + ( decl.name ?: "<port>" )
+		}
+	}
+
+	def image(Port port) {
+		switch( port.direction ) {
+			case INPUT : "fml/InputPin.gif"
+			case OUTPUT: "fml/OutputPin.gif"
+
+			case INOUT : "fml/FlowProperty.gif"
+
+			default: "fml/Port.gif"
+		}
+	}
+
+
+	def text(Signal decl) {
+		val fqn = nameProvider.getFullyQualifiedName(decl);
+		if( fqn != null ) {
+			fqn.toString();
+		}
+		else {
+	  		"no qfn: " + ( decl.name ?: "<signal>" )
+		}
+	}
+
+	def image(Signal decl) {
+		"fml/Signal.gif"
+	}
+
+
+	def text(Buffer decl) {
+		val fqn = nameProvider.getFullyQualifiedName(decl);
+		if( fqn != null ) {
+			fqn.toString();
+		}
+		else {
+	  		"no qfn: " + ( decl.name ?: "<buffer>" )
+		}
+	}
+
+	def image(Buffer decl) {
+		"fml/Signal.gif"
+	}
+
+
+	def text(Variable decl) {
+		val fqn = nameProvider.getFullyQualifiedName(decl);
+		if( fqn != null ) {
+			fqn.toString();
+		}
+		else if( (decl.name == null) && (decl.type != null) ) {
+	  		text( decl.type )
+		}
+		else {
+	  		"no qfn: " + ( decl.name ?: "<variable>" )
+		}
+	}
+
+	def image(Variable decl) {
+		"fml/Property.gif"
+//		"fml/Variable.gif"
+	}
+
+
+	def text(SlotProperty slot) {
+		if( slot.xliaProperty != null) {
+	  		text( slot.xliaProperty )
+		}
+//		else if( slot.umlProperty != null) {
+//	  		text( slot.umlProperty )
+//		}
+		else {
+	  		"<slot>"
+		}
+	}
+
+	def image(SlotProperty slot) {
+		if( slot.xliaProperty != null ) {
+			"fml/QualifierValue.gif"
+		}
+//		else if( slot.umlProperty != null ) {
+//			"fml/QualifierValue.gif"
+//		}
+		else {
+			"fml/Property.gif"
+		}
+	}
+
+
+	def text(Type type) {
+		val fqn = nameProvider.getFullyQualifiedName(type);
+		if( fqn != null ) {
+			fqn.toString();
+		}
+		else {
+	  		"no qfn: " + ( type.name ?: "<type>" )
+		}
+	}
+
+
+	def text(DataType type) {
+		val fqn = nameProvider.getFullyQualifiedName(type);
+		if( fqn != null ) {
+			fqn.toString();
+		}
+		else {
+	  		"no qfn: " + ( type.name ?: "<datatype>" )
+		}
+	}
+
+
+	def String image(DataType type) {
+		switch( type ) {
+			PrimitiveType  : "fml/PrimitiveType.gif"
+			EnumerationType: "fml/Enumeration.gif"
+			IntervalType   : "fml/IntervalType.gif"
+			StructureType  : "fml/StructureType.gif"
+			UnionType      : "fml/UnionType.gif"
+			ChoiceType     : "fml/ChoiceType.gif"
+
+			DataTypeReference :  {
+				if( type.typeref != null ) {
+					type.typeref.image
+				}
+				else if( type.support != null ) {
+					type.support.image
+				}
+				else {
+					"fml/DataType.gif"
+				}
+			}
+
+			DataSupportedType : type.support.image
+
+			default: "fml/DataType.gif"
+		}
+
+	}
+
+
+	def text(DataTypeReference type) {
+		var str =
+			if( type.name != null ) {
+				if( type.typeref != null ) {
+					type.name + " " + text( type.typeref )
+				}
+				else {
+					type.name
+				}
+			}
+			else if( type.typeref != null ) {
+				text( type.typeref )
+			}
+			else if( type.support != null ) {
+				text( type.support )
+			}
+			else {
+				"<datatype>"
+			}
+
+		if( type.multiplicity != null) {
+			str + " [ " + type.multiplicity + " ]"
+		}
+		else {
+			str
+		}
+	}
+
+	def image(DataTypeReference type) {
+		if( type.typeref != null ) {
+			image( type.typeref )
+		}
+		else if( type.support != null ) {
+			text( type.support )
+		}
+		else {
+			"fml/DataType.gif"
+		}
+	}
+
+
+	def text(EnumerationType type) {
+		if( type.name != null ) {
+			"enum " + type.name
+		}
+		else {
+			"<enum>"
+		}
+	}
+
+	def image(EnumerationType type) {
+		"fml/Enumeration.gif"
+	}
+
+
+	def text(EnumerationLiteral literal) {
+		literal.name
+	}
+
+	def image(EnumerationLiteral literal) {
+		"fml/EnumerationLiteral.gif"
+	}
+
+
+	def text(CollectionType type) {
+		type.container.toString + " " + ( type.name ?: "" ) +
+			if( type.unbounded || (type.size < 0) ) {
+				" [*]"
+			}
+			else {
+				" [ " + type.size + " ]"
+			}
+	}
+
+	def image(CollectionType type) {
+		image( type.support )
+	}
+
+
+	def text(StructureType type) {
+		if( type.name != null ) {
+			"struct " + type.name
+		}
+		else {
+			"<struct>"
+		}
+	}
+
+	def image(StructureType type) {
+		"fml/StructureType.gif"
+	}
+
+
+	def text(UnionType type) {
+		if( type.name != null ) {
+			"union " + type.name
+		}
+		else {
+			"<union>"
+		}
+	}
+
+	def image(UnionType type) {
+		"fml/UnionType.gif"
+	}
+
+
+	def text(ChoiceType type) {
+		if( type.name != null ) {
+			"choice " + type.name
+		}
+		else {
+			"<choice>"
+		}
+	}
+
+	def image(ChoiceType type) {
+		"fml/ChoiceType.gif"
+	}
+
+
+	def text(PrimitiveBooleanType type) {
+		"boolean"
+	}
+
+	def text(PrimitiveIntegerType type) {
+		"integer"
+	}
+
+	def text(PrimitiveRationalType type) {
+		"rational"
+	}
+
+	def text(PrimitiveFloatType type) {
+		"float"
+	}
+
+	def text(PrimitiveRealType type) {
+		"real"
+	}
+
+	def text(PrimitiveTimeType type) {
+		if( type.isClock ){
+			"clock"
+		}
+		else {
+			"time"
+		}
+	}
+
+	def text(PrimitiveCharacterType type) {
+		"char"
+	}
+
+	def text(PrimitiveStringType type) {
+		"string"
+	}
+
+	def text(PrimitiveInstanceType type) {
+		type.expected.toString +
+			if( type.model != null ) {
+				"< " + type.model.name + " >"
+			}
+			else {
+				""
+			}
+	}
+
+	def text(IntervalType type) {
+		"interval " + ( type.name ?: "" ) +
+			( if( type.lopen ) "] " else " [ " ) +
+			( if( type.ropen ) "[" else  "]" )
+	}
+
+	def image(IntervalType type) {
+		"fml/IntervalType.gif"
+	}
+
+
+	def image(PrimitiveType type) {
+		"fml/PrimitiveType.gif"
+	}
+
+
+
+	def text(Behavior behavior) {
+		if( behavior == (behavior.eContainer as Machine).main ) {
+			"Main Behavior"
+		}
+		else {
+			"Behavior"
+		}
+	}
+
+	def image(Behavior behavior) {
+		if( behavior == (behavior.eContainer as Machine).main ) {
+			"fml/BehaviorExecutionSpecification.gif"
+		}
+		else {
+			"fml/BehaviorExecutionSpecification.gif"
+		}
+	}
+
+
+	def text(Region region) {
+		if( region.name != null ) {
+			val str = new StyledString(region.name)
+
+			if( region.unrestrictedName != null ) {
+				str.append( new StyledString(
+					" " + region.unrestrictedName,
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			else {
+				str
+			}
+		}
+		else if( region.eContainer instanceof Statemachine ) {
+			"Statemachine Region"
+		}
+		else {
+			"State Region"
+		}
+	}
+
+	def image(Region region) {
+		"fml/Region.gif"
+	}
+
+
+	def text(System system) {
+		val str = new StyledString(system.name)
+
+		if( system.unrestrictedName != null ) {
+			str.append( new StyledString(
+				" " + system.unrestrictedName,
+				StyledString::DECORATIONS_STYLER ) )
+		}
+		else {
+			str
+		}
+	}
+
+	def image(System system) {
+		"fml/Block.gif"
+	}
+
+
+	def text(Machine machine) {
+		val str = new StyledString(machine.name)
+
+		if( machine.unrestrictedName != null ) {
+			str.append( new StyledString(
+				" " + machine.unrestrictedName,
+				StyledString::DECORATIONS_STYLER ) )
+		}
+		else {
+			str
+		}
+	}
+
+	def image(Machine machine) {
+		"fml/Block.gif"
+	}
+
+
+	def text(InstanceMachine instance) {
+		val str = new StyledString(instance.name)
+
+		if( instance.unrestrictedName != null ) {
+			str.append( new StyledString(
+				" " + instance.unrestrictedName,
+				StyledString::DECORATIONS_STYLER ) )
+		}
+		else if( instance.slot.empty && (instance.model != null) ) {
+			str.append( new StyledString(" as ",
+				StyledString::DECORATIONS_STYLER ).append(
+				 	 new StyledString( instance.model.name,
+				 	 	StyledString::QUALIFIER_STYLER ) ) )
+		}
+		else {
+			str
+		}
+	}
+
+	def image(InstanceMachine machine) {
+		"fml/InstanceSpecification.gif"
+	}
+
+
+	def text(Statemachine statemachine) {
+//		println( "Statemachine:" )
+//		val injector = Guice.createInjector(new XLIARuntimeModule)
+//
+////		var rs = injector.getInstance(ResourceSet)
+////		val uri = URI.createURI("test.xlia")
+////		val resource = rs.createResource(uri)
+////		resource.contents += statemachine
+////
+////		var saveOptions = new HashMap();
+////		saveOptions.put(XtextResource.OPTION_FORMAT, Boolean.TRUE);
+////		resource.save(new FileOutputStream("test.xliab"), saveOptions);
+//
+//
+//		val serializer = injector.getInstance(ISerializer)
+//		val result = serializer.serialize(statemachine)
+//		println( result )
+//		println( "--> end" )
+
+
+		val str = new StyledString(statemachine.name)
+
+		if( statemachine.unrestrictedName != null ) {
+			str.append( new StyledString(
+				" " + statemachine.unrestrictedName,
+				StyledString::DECORATIONS_STYLER  ) )
+		}
+		else {
+			str
+		}
+	}
+
+	def image(Statemachine statemachine) {
+		"fml/StateMachine.gif"
+	}
+
+
+	def text(State state) {
+		val str = new StyledString(state.name)
+
+		if( state.unrestrictedName != null ) {
+			str.append( new StyledString(
+				" " + state.unrestrictedName,
+				StyledString::DECORATIONS_STYLER  ) )
+		}
+		else {
+			str
+		}
+	}
+
+	def image(State state) {
+		if( (state.region != null) ) {
+			if( state.region.isEmpty ) {
+				"fml/State.gif"
+			}
+			else if( state.region.size > 1 ) {
+				"fml/StateMachine.gif"
+			}
+			else {
+				"fml/StateMachine.gif"
+			}
+		}
+		else {
+			"fml/State.gif"
+		}
+	}
+
+	def image(StartState state) {
+		"fml/State_start.gif"
+	}
+
+	def image(FinalState state) {
+		"fml/FinalState.gif"
+	}
+
+
+	def text(Pseudostate state) {
+		val str = new StyledString(state.name)
+
+		if( state.unrestrictedName != null ) {
+			str.append( new StyledString(
+				" " + state.unrestrictedName,
+				StyledString::DECORATIONS_STYLER  ) )
+		}
+		else {
+			str
+		}
+	}
+
+	def image(Pseudostate state) {
+		switch( state.kind ) {
+			case INITIAL  : "fml/Pseudostate_initial.gif"
+			case TERMINATE: "fml/Pseudostate_terminate.gif"
+
+			case JUNCTION : "fml/Pseudostate_junction.gif"
+			case CHOICE   : "fml/Pseudostate_choice.gif"
+
+			case FORK: "fml/Pseudostate_fork.gif"
+			case JOIN: "fml/Pseudostate_join.gif"
+
+			case DEEP_HISTORY   : "fml/Pseudostate_deepHistory.gif"
+			case SHALLOW_HISTORY: "fml/Pseudostate_shallowHistory.gif"
+
+			default: "fml/State.gif"
+		}
+	}
+
+
+	def text(Transition transition) {
+		val str = new StyledString( transition.name ?: "<transition>" )
+
+		if( transition.unrestrictedName != null ) {
+			str.append(	new StyledString(
+				" " + transition.unrestrictedName,
+				StyledString::DECORATIONS_STYLER ) ).append(
+					" --> " + transition.target?.name )
+		}
+		else {
+			str.append( " --> " + transition.target?.name )
+		}
+	}
+
+	def image(Transition transition) {
+		"fml/Transition_local.gif"
+	}
+
+	def text(TransitionMoe moe) {
+		var info = "moe< "
+		if( moe.moc != TransitionMoc.SIMPLE ) {
+			info += "moc: " + moe.moc.toString
+		}
+
+		if( moe.isElse ) {
+		  if( info != "moe< " ) {
+			info += " & "
+		  }
+		  info += "else"
+		}
+
+		if( moe.prior != 0 ) {
+		  if( info != "moe< " ) {
+			info += " , "
+		  }
+		  info += "prior: " + moe.prior
+		}
+
+		info += " >"
+
+		return info
+	}
+
+	def image(TransitionMoe moe) {
+		"fml/ExecutionEnvironment.gif"
+	}
+
+
+	def text(ModelOfExecution moe) {
+		"Model Of Execution"
+	}
+
+	def image(ModelOfExecution moe) {
+		"fml/ExecutionEnvironment.gif"
+	}
+
+
+	def text(Routine routine) {
+		if( routine.name != null ) {
+			val str = new StyledString(routine.name)
+
+			if( routine.unrestrictedName != null ) {
+				str.append( new StyledString(
+					" " + routine.unrestrictedName,
+					StyledString::DECORATIONS_STYLER ) )
+			}
+			else {
+				str
+			}
+		}
+		else if( routine.eContainer instanceof ModelOfExecution ) {
+			val moe = routine.eContainer as ModelOfExecution
+			switch( routine ) {
+				case moe.initRoutine        : "@init"
+				case moe.finalRoutine       : "@final"
+
+				case moe.enableRoutine      : "@enable"
+				case moe.disableRoutine     : "@disable"
+
+				case moe.irunRoutine        : "@irun"
+				case moe.runRoutine         : "@run"
+
+				case moe.concurrencyRoutine : "@concurrency"
+				case moe.scheduleRoutine    : "@schedule"
+
+				default: "Unknown Predefined Routine"
+			}
+		}
+		else {
+			"Anonymous Routine"
+		}
+	}
+
+	def image(Routine routine) {
+		"fml/StartClassifierBehaviorAction.gif"
+	}
+
+
+	def text(ModelOfInteraction moi) {
+		"Model Of Interaction"
+	}
+
+	def image(ModelOfInteraction moi) {
+		"fml/Diagram_Sequence.gif"
+	}
+
+
+	def text(Connection connection) {
+		connection.name ?: "Connection"
+	}
+
+	def image(Connection connection) {
+		"fml/Connector_assembly.gif"
+	}
+
+
+	def text(Route route) {
+		"Route"
+	}
+
+	def image(Route route) {
+		"fml/Connector_assembly.gif"
+	}
+
+
+	def text(ComPoint comPoint) {
+//		val str = ( comPoint.machine?.target.name ?: "this" ) + "->"
+//		str + ( comPoint.port.target?.name ?: text( comPoint.port.value ) )
+
+		"<compoint>"
+	}
+
+	def image(ComPoint comPoint) {
+		switch( comPoint.direction ) {
+//			case INPUT : "fml/FlowPort_IN.gif"
+//			case OUTPUT: "fml/FlowPort_OUT.gif"
+
+			case INPUT : "fml/InputPin.gif"
+			case OUTPUT: "fml/OutputPin.gif"
+
+			case INOUT : "fml/FlowProperty.gif"
+
+			default:     "fml/FlowPort.gif"
+		}
+	}
+
+
+	def text( ComCastKind cast ) {
+		switch( cast ) {
+			case UNICAST  : "unicast"
+			case ANYCAST  : "anycast"
+			case MULTICAST: "multicast"
+			case BROADCAST: "broadcast"
+			case NONE: "none"
+		}
+	}
+
+	def text(ComProtocol com) {
+		switch( com.protocol ) {
+			case BUFFER: {
+				if( com.inner_buffer != null ) {
+					"buffer: " + text( com.inner_buffer )
+				}
+				else if( com.ref_buffer != null ) {
+					"buffer: " + text( com.ref_buffer )
+				}
+				else {
+					"buffer"
+				}
+			}
+
+			case ENV: "env"
+
+			case RDV: "rdv"
+
+			case MULTI_RDV: {
+				if( com.cast != ComCastKind.NONE ) {
+					"multirdv< " + text( com.cast ) + " >"
+				}
+				else {
+					"multirdv"
+				}
+			}
+
+			case NONE: text( com.cast )
+		}
+	}
+
+	def image(ComProtocol com) {
+		"fml/Diagram_Communication.gif"
+	}
+
+
+	def text(Statement statement) {
+		"Statement"
+	}
+
+	def image(Statement statement) {
+		"fml/ExecutionEnvironment.gif"
+	}
+
+
+	def text(BlockStatement statement) {
+		var strBlock = "Block"
+
+		if( statement.eContainer instanceof IfStatement ) {
+			if( statement == (statement.eContainer as IfStatement).bodyBlock ) {
+				strBlock = "then"
+			}
+			else if( statement == (statement.eContainer as IfStatement).elseBlock ) {
+				strBlock = "else"
+			}
+		}
+
+		if( (statement.op != null) && (! statement.op.isEmpty) ) {
+			strBlock += " { " + statement.op + " }"
+		}
+
+		strBlock
+	}
+
+	def image(BlockStatement statement) {
+		"fml/Activity.gif"
+	}
+
+
+	def text(ExpressionStatement statement) {
+		switch( statement.expression ) {
+			AssignmentExpression: "assignment"
+
+			NewfreshExpression  : "newfresh"
+
+			IncrementOrDecrementPrefixExpression : "IncrementOrDecrementPrefix"
+
+			IncrementOrDecrementPostfixExpression: "IncrementOrDecrementPostfix"
+
+			default: "Expression Statement"
+		}
+	}
+
+	def text(AssignmentStatement statement) {
+		"assign " + statement.operator
+	}
+
+
+	def text(GuardStatement statement) {
+		"Guard"
+	}
+
+	def image(GuardStatement statement) {
+		"fml/Constraint.gif"
+	}
+
+	def text(TimedGuardStatement statement) {
+		"TimedGuard"
+	}
+
+	def image(TimedGuardStatement statement) {
+		"fml/TimeConstraint.gif"
+	}
+
+
+	def text(InputComStatement statement) {
+//		"input " + ( statement.port.target?.name ?: text(statement.port.value) )
+		"<input>"
+	}
+
+	def image(InputComStatement statement) {
+		"fml/InputPin.gif"
+	}
+
+	def text(OutputComStatement statement) {
+//		"output " + ( statement.port.target?.name ?: text(statement.port.value) )
+
+		"<output>"
+	}
+
+	def image(OutputComStatement statement) {
+		"fml/OutputPin.gif"
+	}
+
+
+	def text(ActivityStatement statement) {
+		statement.op.toString
+	}
+
+	def image(ActivityStatement statement) {
+		"fml/CallBehaviorAction.gif"
+	}
+
+
+	def text(InterruptStatement statement) {
+		statement.kind.toString
+	}
+
+	def image(InterruptStatement statement) {
+		"fml/CallBehaviorAction.gif"
+	}
+
+
+	def text(IfStatement statement) {
+		"if"
+	}
+
+	def image(IfStatement statement) {
+		"fml/Diagram_Activity.gif"
+	}
+
+
+	def text(ConditionalBlockStatement statement) {
+		if( statement.eContainer instanceof IfStatement ) {
+			"elseif"
+		}
+		else {
+			"Conditional Block"
+		}
+	}
+
+	def image(ConditionalBlockStatement statement) {
+		if( statement.eContainer instanceof IfStatement ) {
+			"fml/Diagram_Activity.gif"
+		}
+		else {
+			"fml/Activity.gif"
+		}
+	}
+
+
+	def text(ForStatement statement) {
+		"for( ; ; )"
+	}
+
+	def image(ForStatement statement) {
+		"fml/LoopStatement.gif"
+	}
+
+
+	def text(ForEachStatement statement) {
+		"foreach"
+	}
+
+	def image(ForEachStatement statement) {
+		"fml/LoopStatement.gif"
+	}
+
+
+	def text(WhileDoStatement statement) {
+		"while(...) do{...}"
+	}
+
+	def image(WhileDoStatement statement) {
+		"fml/LoopStatement.gif"
+	}
+
+
+	def text(DoWhileStatement statement) {
+		"do{...} while(...)"
+	}
+
+	def image(DoWhileStatement statement) {
+		"fml/LoopStatement.gif"
+	}
+
+
+	def text(LiteralBooleanExpression expression) {
+		"" + expression.value
+	}
+
+	def image(LiteralBooleanExpression expression) {
+		"fml/LiteralBoolean.gif"
+	}
+
+
+	def text(LiteralIntegerExpression expression) {
+		"" + expression.value
+	}
+
+	def image(LiteralIntegerExpression expression) {
+		"fml/LiteralInteger.gif"
+	}
+
+
+	def text(LiteralRationalExpression expression) {
+		"" + expression.numerator + "/" + expression.denominator
+	}
+
+	def image(LiteralRationalExpression expression) {
+		"fml/LiteralInteger.gif"
+	}
+
+
+	def text(LiteralFloatExpression expression) {
+		"" + expression.value
+	}
+
+	def image(LiteralFloatExpression expression) {
+		"fml/LiteralReal.gif"
+	}
+
+	def text(LiteralRealExpression expression) {
+		"" + expression.value
+	}
+
+	def image(LiteralRealExpression expression) {
+		"fml/LiteralReal.gif"
+	}
+
+
+	def text(LiteralCharacterExpression expression) {
+		"" + expression.value.toString
+	}
+
+	def image(LiteralCharacterExpression expression) {
+		"fml/LiteralString.gif"
+	}
+
+
+	def text(LiteralStringExpression expression) {
+		"" + expression.value
+	}
+
+	def image(LiteralStringExpression expression) {
+		"fml/LiteralString.gif"
+	}
+
+
+	def text(LiteralCollectionExpression expression) {
+		"<collection>"
+	}
+
+	def image(LiteralCollectionExpression expression) {
+		"fml/Variable.gif"
+	}
+
+	def text(LiteralReferenceElement expression) {
+		if( expression.value != null ) {
+			val fqn = nameProvider.getFullyQualifiedName(expression.value);
+
+			fqn?.toString ?: "no qfn: " + ( expression.value.name ?: "<reference>" )
+		}
+		else {
+			"<reference>"
+		}
+	}
+
+	def image(LiteralReferenceElement expression) {
+		if( expression.value != null ) {
+			image(expression.value)
+		}
+		else {
+			"fml/QualifierValue.gif"
+		}
+	}
+
+
+	def text(LiteralThisExpression expression) {
+		"$this"
+	}
+
+	def image(LiteralThisExpression expression) {
+		"fml/QualifierValue.gif"
+	}
+
+
+	def text(LiteralSelfExpression expression) {
+		"$self"
+	}
+
+	def image(LiteralSelfExpression expression) {
+		"fml/QualifierValue.gif"
+	}
+
+
+	def text(LiteralSuperExpression expression) {
+		"$super"
+	}
+
+	def image(LiteralSuperExpression expression) {
+		"fml/QualifierValue.gif"
+	}
+
+
+	def text(LiteralParentExpression expression) {
+		"$parent"
+	}
+
+	def image(LiteralParentExpression expression) {
+		"fml/QualifierValue.gif"
+	}
+
+
+	def text(LiteralSystemExpression expression) {
+		"$system"
+	}
+
+	def image(LiteralSystemExpression expression) {
+		"fml/QualifierValue.gif"
+	}
+
+	def text(LiteralEnvExpression expression) {
+		"$env"
+	}
+
+	def image(LiteralEnvExpression expression) {
+		"fml/QualifierValue.gif"
+	}
+
+
+	def text(LiteralNullExpression expression) {
+		"null"
+	}
+
+	def image(LiteralNullExpression expression) {
+		"fml/LiteralNull.gif"
+	}
+
+
+	def text(LeftHandSideExpression expression) {
+		"<lvalue>"
+	}
+
+	def image(LeftHandSideExpression expression) {
+		"fml/Variable.gif"
+	}
+
+
+	def text(InstantiationExpression expression) {
+		"Instantiation " + ( expression.instance?.model?.name ?: "<model>" )
+	}
+
+	def image(InvokeExpression expression) {
+		"fml/Parameter_return.gif"
+	}
+
+
+	def text(TupleExpression expression) {
+		if( (expression.eContainer instanceof ValueElementSpecification) &&
+			((expression.eContainer as ValueElementSpecification).kind ==
+				ValueElementSpecificationKind.INDEX) ) {
+			"[i,n,d,e,x]"
+		}
+		else {
+			"(t,u,p,l,e)"
+		}
+	}
+
+	def image(TupleExpression expression) {
+		"fml/Parameter_in.gif"
+	}
+
+
+	def text(UnaryExpression expression) {
+		"operator " + expression.operator
+	}
+
+	def image(UnaryExpression expression) {
+		"fml/Expression.gif"
+	}
+
+
+	def text(IncrementOrDecrementPrefixExpression expression) {
+		"operator " + expression.operator + "()"
+	}
+
+	def text(IncrementOrDecrementPostfixExpression expression) {
+		"operator ()" + expression.operator
+	}
+
+	def image(IncrementOrDecrementExpression expression) {
+		"fml/Expression.gif"
+	}
+
+
+	def text(BinaryExpression expression) {
+		"operator " + expression.operator
+	}
+
+	def image(BinaryExpression expression) {
+		"fml/Expression.gif"
+	}
+
+
+	def text(RelationalTernaryExpression expression) {
+		expression.leftRelation.operator + " operator " + expression.rigthOperator
+	}
+
+	def image(RelationalTernaryExpression expression) {
+		"fml/Expression.gif"
+	}
+
+
+	def text(AssignmentExpression expression) {
+		"operator " + expression.operator
+	}
+
+	def text(NewfreshExpression expression) {
+		"newfresh"
+	}
+
+	def image(AssignmentExpression expression) {
+		"fml/Expression.gif"
+	}
+
+
+	def text(AssociativeExpression expression) {
+		"operator " + expression.operator
+	}
+
+	def image(AssociativeExpression expression) {
+		"fml/Expression.gif"
+	}
+
+
+	def text(ValueElementSpecification ves) {
+		var str =
+			if( ves.element != null ) {
+				if( ves.element instanceof NamedElement ) {
+					(ves.element as NamedElement).name
+				}
+				else {
+					text( ves.element )
+				}
+			}
+			else {
+				"<ves>"
+			}
+
+		if( ves.arg != null ) {
+			val arg = text( ves.arg ) ?: "<arg>"
+
+			switch( ves.kind ) {
+				case INDEX:     str += "[ " + arg + " ]"
+
+				case PARAMETER: str += "( " + arg + " )"
+
+				default: str += " : " + arg
+			}
+		}
+
+		str
+	}
+
+	def image(ValueElementSpecification ves) {
+		switch( ves.kind ) {
+			case FIELD:     "fml/Property.gif"
+
+			case INDEX:     "fml/Variable.gif"
+
+			case PARAMETER: "fml/Parameter_inout.gif"
+
+			default:         "fml/QualifierValue.gif"
+		}
+	}
+
+
+	def text(ExpressionAsPort expression) {
+		"<port>"
+	}
+
+	def image(ExpressionAsPort expression) {
+		"fml/Port.gif"
+	}
+
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/outline/FormalMLOutlineTreeProvider.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/outline/FormalMLOutlineTreeProvider.xtend
new file mode 100644
index 0000000..39d72b6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/outline/FormalMLOutlineTreeProvider.xtend
@@ -0,0 +1,335 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui.outline
+
+import com.google.inject.Inject
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine
+import org.eclipse.xtext.naming.IQualifiedNameProvider
+import org.eclipse.xtext.ui.IImageHelper
+import org.eclipse.xtext.ui.editor.outline.IOutlineNode
+import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider
+
+/**
+ * Customization of the default outline structure.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#outline
+ */
+class FormalMLOutlineTreeProvider extends DefaultOutlineTreeProvider {
+
+	@Inject
+	IImageHelper imageHelper
+
+	@Inject
+	private IQualifiedNameProvider nameProvider;
+
+
+//	def _createChildren(DocumentRootNode parentNode, XliaModel xliaModel) {
+//		// show a virtual node for the XLIA SYSTEM MODEL
+////		createEStructuralFeatureNode(parentNode, xliaModel,
+////			XliaPackage.Literals.XLIA_MODEL__SYSTEM,
+////			imageHelper.getImage("fml/Package.gif"),
+////			"XLIA SYSTEM MODEL", true);
+//
+//  		createNode(parentNode, xliaModel.system);
+//	}
+
+
+	def createNodeProperty(IOutlineNode parentNode, Machine machine) {
+		if( ! machine.typedef.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__TYPEDEF,
+				imageHelper.getImage("fml/DataType.gif"),
+				"Typedefs", false);
+		}
+
+		if( ! machine.port.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__PORT,
+				imageHelper.getImage("fml/Port.gif"),
+				"Ports", false);
+		}
+
+		if( ! machine.signal.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__SIGNAL,
+				imageHelper.getImage("fml/Signal.gif"),
+				"Signals", false);
+		}
+
+		if( ! machine.channel.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__CHANNEL,
+				imageHelper.getImage("fml/Signal.gif"),
+				"Channels", false);
+		}
+
+		if( ! machine.buffer.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__BUFFER,
+				imageHelper.getImage("fml/Property.gif"),
+				"Buffers", false);
+		}
+
+		if( ! machine.property.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__PROPERTY,
+				imageHelper.getImage("fml/Property.gif"),
+				"Properties", false);
+		}
+
+
+		if( ! machine.routine.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__ROUTINE,
+				imageHelper.getImage("fml/FunctionBehavior.gif"),
+				"Routines", false);
+		}
+
+		if( ! machine.procedure.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__PROCEDURE,
+				imageHelper.getImage("fml/FunctionBehavior.gif"),
+				"Procedures", false);
+		}
+
+
+		if( ! machine.machine.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__MACHINE,
+				imageHelper.getImage("fml/Diagram_CompositeStructure.gif"),
+				"Submachines", false);
+		}
+
+		if( ! machine.instance.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__INSTANCE,
+				imageHelper.getImage("fml/InstanceSpecification.gif"),
+				"Instances", false);
+		}
+	}
+
+
+	def createNodeProperty(IOutlineNode parentNode, InstanceMachine instance) {
+		if( instance.model != null ) {
+			createEStructuralFeatureNode(parentNode, instance,
+				InfrastructurePackage.Literals.INSTANCE_MACHINE__MODEL,
+				imageHelper.getImage("fml/Model.gif"),
+				"model: " + nameProvider.getFullyQualifiedName(instance.model), false);
+		}
+	}
+
+
+	def createNodeProperty(IOutlineNode parentNode, Behavior behavior) {
+		if( ! behavior.parameter.empty ) {
+			createEStructuralFeatureNode(parentNode, behavior,
+				InfrastructurePackage.Literals.BEHAVIOR__PARAMETER,
+				imageHelper.getImage("fml/ParameterSet.gif"),
+				"Parameters", false);
+		}
+
+		createNodeProperty(parentNode, behavior as Machine)
+	}
+
+
+	def createNodeBehavior(IOutlineNode parentNode, Machine machine) {
+		if( ! machine.behavior.empty ) {
+			createEStructuralFeatureNode(parentNode, machine,
+				InfrastructurePackage.Literals.MACHINE__BEHAVIOR,
+				imageHelper.getImage("fml/BehaviorExecutionSpecification.gif"),
+				"Behaviors", false);
+		}
+
+		if( machine.main != null ) {
+			createNode(parentNode, machine.main);
+		}
+	}
+
+
+	def createNodeBehavior(IOutlineNode parentNode, Behavior behavior) {
+		if( ! behavior.behavior.empty ) {
+			createEStructuralFeatureNode(parentNode, behavior,
+				InfrastructurePackage.Literals.MACHINE__BEHAVIOR,
+				imageHelper.getImage("fml/BehaviorExecutionSpecification.gif"),
+				"Behaviors", false);
+		}
+
+		if( behavior.main != null ) {
+			createNode(parentNode, behavior.main);
+		}
+
+
+		if( behavior.computation != null ) {
+			createNode(parentNode, behavior.computation);
+		}
+
+		if( behavior.execution != null ) {
+			createNode(parentNode, behavior.execution);
+		}
+
+		if( behavior.interaction != null ) {
+			createNode(parentNode, behavior.interaction);
+		}
+
+
+		if( behavior.main != null ) {
+			createNode(parentNode, behavior.main);
+		}
+	}
+
+
+
+	def _createChildren(IOutlineNode parentNode, Machine machine) {
+//  		val machineNode = createEObjectNode(parentNode, machine);
+
+		createNodeProperty(parentNode, machine);
+
+		createNodeBehavior(parentNode, machine);
+	}
+
+//	def _createNode(IOutlineNode parentNode, Machine machine) {
+//  		val machineNode = createEObjectNode(parentNode, machine);
+//
+//		createNodeProperty(machineNode, machine);
+//
+//		createNodeBehavior(machineNode, machine);
+//
+//		machineNode
+//	}
+
+
+	def _createChildren(IOutlineNode parentNode, Behavior behavior) {
+		createNodeProperty(parentNode, behavior);
+
+		createNodeBehavior(parentNode, behavior);
+	}
+
+
+	def _createChildren(IOutlineNode parentNode, Statemachine statemachine) {
+//  		val statemachineNode = createEObjectNode(parentNode, statemachine);
+
+		createNodeProperty(parentNode, statemachine);
+
+  		for( region : statemachine.region ) {
+			createNode(parentNode, region);
+  		}
+
+		createNodeBehavior(parentNode, statemachine);
+	}
+
+//	def _createNode(IOutlineNode parentNode, Statemachine statemachine) {
+//  		val statemachineNode = createEObjectNode(parentNode, statemachine);
+//
+//		createNodeProperty(statemachineNode, statemachine);
+//
+//  	for( region : statemachine.region ) {
+//			createNode(statemachineNode, region);
+//  	}
+//
+//		createNodeBehavior(statemachineNode, statemachine);
+//
+//		statemachineNode
+//	}
+
+
+//	def _createChildren(IOutlineNode parentNode, State state) {
+//  		for( region : state.region ) {
+//			createNode(parentNode, region);
+//  		}
+//
+//  		for( transition : state.transition ) {
+//			createNode(parentNode, transition);
+//  		}
+//
+//		if( state.execution != null ) {
+//			createNode(parentNode, state.execution);
+//		}
+//	}
+
+//	def _createNode(IOutlineNode parentNode, State state) {
+//  	val stateNode = createEObjectNode(parentNode, state);
+//
+//		createNodeProperty(stateNode, state);
+//
+//  		for( region : state.region ) {
+//			createNode(stateNode, region);
+//  		}
+//
+//		createNodeBehavior(stateNode, state);
+//
+//		stateNode
+//	}
+
+
+
+
+//protected void _createChildren(DocumentRootNode parentNode,XtendFile xtendFile){
+//  if (xtendFile.getPackage() != null)
+//     createEStructuralFeatureNode(parentNode,xtendFile,
+//     	XtendPackage.Literals.XTEND_FILE__PACKAGE,
+//		images.forPackage(),xtendFile.getPackage(),true
+//     );
+//
+//  if (!xtendFile.getImports().isEmpty())
+//     createEStructuralFeatureNode(parentNode,xtendFile,
+//     	XtendPackage.Literals.XTEND_FILE__IMPORTS,
+//		images.forImportContainer(),"import declarations",false
+//     );
+//  for (  XtendTypeDeclaration xtendType : xtendFile.getXtendTypes()) {
+//    EObjectNode classNode=createEObjectNode(parentNode,xtendType);
+//    createFeatureNodes(classNode,xtendType);
+//  }
+//}
+
+
+//	def _isLeaf(DataType datatype) {
+//		true
+//	}
+//
+//	def _isLeaf(Signal signal) {
+//		true
+//	}
+//
+//	def _isLeaf(PropertyDefinition propertyDef) {
+//		true
+//	}
+//
+////	def _isLeaf(Port port) {
+////		true
+////	}
+////
+////	def _isLeaf(Buffer buffer) {
+////		true
+////	}
+////
+////	def _isLeaf(Variable variable) {
+////		true
+////	}
+////
+////	def _isLeaf(Channel channel) {
+////		true
+////	}
+//
+//
+//	def _isLeaf(Transition transition) {
+//		true
+//	}
+//
+//	def _isLeaf(Routine routine) {
+//		(routine.name == null)
+//	}
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/quickfix/FormalMLQuickfixProvider.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/quickfix/FormalMLQuickfixProvider.xtend
new file mode 100644
index 0000000..20d745b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/src/org/eclipse/efm/formalml/xtext/ui/quickfix/FormalMLQuickfixProvider.xtend
@@ -0,0 +1,33 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.ui.quickfix
+
+import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider
+
+/**
+ * Custom quickfixes.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/310_eclipse_support.html#quick-fixes
+ */
+class FormalMLQuickfixProvider extends DefaultQuickfixProvider {
+
+//	@Fix(FormalMLValidator.INVALID_NAME)
+//	def capitalizeName(Issue issue, IssueResolutionAcceptor acceptor) {
+//		acceptor.accept(issue, 'Capitalize name', 'Capitalize the name.', 'upcase.png') [
+//			context |
+//			val xtextDocument = context.xtextDocument
+//			val firstLetter = xtextDocument.get(issue.offset, 1)
+//			xtextDocument.replace(issue.offset, 1, firstLetter.toUpperCase)
+//		]
+//	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLDescriptionLabelProvider.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLDescriptionLabelProvider.xtendbin
new file mode 100644
index 0000000..a8c7b6d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLDescriptionLabelProvider.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLLabelProvider.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLLabelProvider.xtendbin
new file mode 100644
index 0000000..115a959
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLLabelProvider.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLOutlineTreeProvider.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLOutlineTreeProvider.xtendbin
new file mode 100644
index 0000000..65722e6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLOutlineTreeProvider.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLProposalProvider.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLProposalProvider.xtendbin
new file mode 100644
index 0000000..26370b3
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLProposalProvider.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLQuickfixProvider.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLQuickfixProvider.xtendbin
new file mode 100644
index 0000000..976d56d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLQuickfixProvider.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLUiModule.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLUiModule.xtendbin
new file mode 100644
index 0000000..e30c56e
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/.FormalMLUiModule.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/.gitignore
new file mode 100644
index 0000000..92ec9e6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/FormalMLUiModule.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/contentassist/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/contentassist/.gitignore
new file mode 100644
index 0000000..c33f598
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/contentassist/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/FormalMLProposalProvider.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/labeling/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/labeling/.gitignore
new file mode 100644
index 0000000..b38e5fc
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/labeling/.gitignore
@@ -0,0 +1,4 @@
+*._trace
+*.xtendbin
+/FormalMLDescriptionLabelProvider.java
+/FormalMLLabelProvider.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/outline/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/outline/.gitignore
new file mode 100644
index 0000000..2eb7877
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/outline/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/FormalMLOutlineTreeProvider.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/quickfix/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/quickfix/.gitignore
new file mode 100644
index 0000000..714253b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext.ui/xtend-gen/org/eclipse/efm/formalml/xtext/ui/quickfix/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/FormalMLQuickfixProvider.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/.antlr-generator-3.2.0-patch.jar b/editor/xlia/org.eclipse.efm.formalml.xtext/.antlr-generator-3.2.0-patch.jar
new file mode 100644
index 0000000..90516fd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/.antlr-generator-3.2.0-patch.jar
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/.classpath b/editor/xlia/org.eclipse.efm.formalml.xtext/.classpath
new file mode 100644
index 0000000..026e45b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext/.gitignore
new file mode 100644
index 0000000..bbdfc34
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+*.md.html
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/.project b/editor/xlia/org.eclipse.efm.formalml.xtext/.project
new file mode 100644
index 0000000..3fc3c47
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.efm.formalml.xtext</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/.settings/org.eclipse.core.resources.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..4824b80
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/.settings/org.eclipse.jdt.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..295926d
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/.settings/org.eclipse.m2e.core.prefs b/editor/xlia/org.eclipse.efm.formalml.xtext/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/META-INF/MANIFEST.MF b/editor/xlia/org.eclipse.efm.formalml.xtext/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8091bf8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.0.1.qualifier
+Bundle-SymbolicName: org.eclipse.efm.formalml.xtext; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.efm.formalml.ecore,
+ org.eclipse.xtext,
+ org.eclipse.xtext.xbase,
+ org.eclipse.equinox.common;bundle-version="3.5.0",
+ org.eclipse.xtext.xbase.lib,
+ org.antlr.runtime,
+ org.eclipse.xtext.util,
+ org.eclipse.xtend.lib
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.efm.formalml.xtext,
+ org.eclipse.efm.formalml.xtext.scoping,
+ org.eclipse.efm.formalml.xtext.generator,
+ org.eclipse.efm.formalml.xtext.parser.antlr,
+ org.eclipse.efm.formalml.xtext.formatting,
+ org.eclipse.efm.formalml.xtext.services,
+ org.eclipse.efm.formalml.xtext.serializer,
+ org.eclipse.efm.formalml.xtext.parser.antlr.internal,
+ org.eclipse.efm.formalml.xtext.validation
+Import-Package: org.apache.log4j
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/README.md b/editor/xlia/org.eclipse.efm.formalml.xtext/README.md
new file mode 100644
index 0000000..f5119fe
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/README.md
@@ -0,0 +1,3 @@
+# EFM, Formal Modeling Language, FormalML, Xtext based Editor
+
+Model Ecore for Xtext Editor
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/about.html b/editor/xlia/org.eclipse.efm.formalml.xtext/about.html
new file mode 100644
index 0000000..d35d5ae
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/build.properties b/editor/xlia/org.eclipse.efm.formalml.xtext/build.properties
new file mode 100644
index 0000000..e109a08
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/build.properties
@@ -0,0 +1,29 @@
+###############################################################################
+# Copyright (c) 2016 CEA LIST.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+#   - Initial API and Implementation
+###############################################################################
+source.. = src/,\
+           src-gen/,\
+           xtend-gen/
+bin.includes = .,\
+               META-INF/
+additional.bundles = org.eclipse.xtext.xbase,\
+                     org.eclipse.xtext.common.types,\
+                     org.eclipse.xtext.xtext.generator,\
+                     org.eclipse.emf.codegen.ecore,\
+                     org.eclipse.emf.mwe.utils,\
+                     org.eclipse.emf.mwe2.launch,\
+                     org.eclipse.emf.mwe2.lib,\
+                     org.objectweb.asm,\
+                     org.apache.commons.logging,\
+                     org.apache.log4j,\
+                     com.ibm.icu,\
+                     org.eclipse.xtext.generator
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/pom.xml b/editor/xlia/org.eclipse.efm.formalml.xtext/pom.xml
new file mode 100644
index 0000000..b0f77c2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor.xlia</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.formalml.xtext</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.efm.formalml.xtext</name>
+	<description>This plug-in contains the xLIA's Xtext based editor core elements (grammar, workflow...).</description>
+
+	<build>
+		<plugins>
+			<!-- Empty out the xtend-gen folder in the clean phase. -->
+		    <plugin>
+		        <artifactId>maven-clean-plugin</artifactId>
+		        <configuration>
+		            <filesets>
+		                <fileset>
+		                    <directory>xtend-gen</directory>
+		                    <excludes>
+		                       <exclude>**/.gitignore</exclude>
+		                    </excludes>
+		                </fileset>
+		            </filesets>
+		        </configuration>
+		    </plugin>
+		    <!-- Generate Xtend sources in the compilation phase. -->
+		    <plugin>
+		        <groupId>org.eclipse.xtend</groupId>
+		        <artifactId>xtend-maven-plugin</artifactId>
+		        <executions>
+		            <execution>
+		                <goals>
+		                    <goal>compile</goal>
+		                    <goal>testCompile</goal>
+		                </goals>
+		                <configuration>
+		                    <outputDirectory>xtend-gen</outputDirectory>
+		                </configuration>
+		            </execution>
+		        </executions>
+		    </plugin>
+		  </plugins>
+	 </build>
+</project>
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/AbstractFormalMLRuntimeModule.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/AbstractFormalMLRuntimeModule.java
new file mode 100644
index 0000000..415144c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/AbstractFormalMLRuntimeModule.java
@@ -0,0 +1,224 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext;
+
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import java.util.Properties;
+import org.eclipse.efm.formalml.xtext.formatting.FormalMLFormatter;
+import org.eclipse.efm.formalml.xtext.generator.FormalMLGenerator;
+import org.eclipse.efm.formalml.xtext.parser.antlr.FormalMLAntlrTokenFileProvider;
+import org.eclipse.efm.formalml.xtext.parser.antlr.FormalMLParser;
+import org.eclipse.efm.formalml.xtext.parser.antlr.internal.InternalFormalMLLexer;
+import org.eclipse.efm.formalml.xtext.scoping.FormalMLScopeProvider;
+import org.eclipse.efm.formalml.xtext.serializer.FormalMLSemanticSequencer;
+import org.eclipse.efm.formalml.xtext.serializer.FormalMLSyntacticSequencer;
+import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;
+import org.eclipse.efm.formalml.xtext.validation.FormalMLValidator;
+import org.eclipse.xtext.Constants;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.common.services.Ecore2XtextTerminalConverters;
+import org.eclipse.xtext.conversion.IValueConverterService;
+import org.eclipse.xtext.formatting.IFormatter;
+import org.eclipse.xtext.generator.IGenerator2;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.naming.SimpleNameProvider;
+import org.eclipse.xtext.parser.IParser;
+import org.eclipse.xtext.parser.ITokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.AntlrTokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.IUnorderedGroupHelper;
+import org.eclipse.xtext.parser.antlr.Lexer;
+import org.eclipse.xtext.parser.antlr.LexerBindings;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.parser.antlr.UnorderedGroupHelper;
+import org.eclipse.xtext.resource.IContainer;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.containers.ResourceSetBasedAllContainersStateProvider;
+import org.eclipse.xtext.resource.containers.StateBasedContainerManager;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions;
+import org.eclipse.xtext.scoping.IGlobalScopeProvider;
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.eclipse.xtext.scoping.IgnoreCaseLinking;
+import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
+import org.eclipse.xtext.scoping.impl.DefaultGlobalScopeProvider;
+import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider;
+import org.eclipse.xtext.serializer.ISerializer;
+import org.eclipse.xtext.serializer.impl.Serializer;
+import org.eclipse.xtext.serializer.sequencer.ISemanticSequencer;
+import org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer;
+import org.eclipse.xtext.service.DefaultRuntimeModule;
+import org.eclipse.xtext.service.SingletonBinding;
+
+/**
+ * Manual modifications go to {@link FormalMLRuntimeModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractFormalMLRuntimeModule extends DefaultRuntimeModule {
+
+	protected Properties properties = null;
+
+	@Override
+	public void configure(Binder binder) {
+		properties = tryBindProperties(binder, "org/eclipse/efm/formalml/xtext/FormalML.properties");
+		super.configure(binder);
+	}
+	
+	public void configureLanguageName(Binder binder) {
+		binder.bind(String.class).annotatedWith(Names.named(Constants.LANGUAGE_NAME)).toInstance("org.eclipse.efm.formalml.xtext.FormalML");
+	}
+	
+	public void configureFileExtensions(Binder binder) {
+		if (properties == null || properties.getProperty(Constants.FILE_EXTENSIONS) == null)
+			binder.bind(String.class).annotatedWith(Names.named(Constants.FILE_EXTENSIONS)).toInstance("fml,xfml,xlia,xfsp");
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public ClassLoader bindClassLoaderToInstance() {
+		return getClass().getClassLoader();
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+	public Class<? extends IGrammarAccess> bindIGrammarAccess() {
+		return FormalMLGrammarAccess.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISemanticSequencer> bindISemanticSequencer() {
+		return FormalMLSemanticSequencer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISyntacticSequencer> bindISyntacticSequencer() {
+		return FormalMLSyntacticSequencer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISerializer> bindISerializer() {
+		return Serializer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IParser> bindIParser() {
+		return FormalMLParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenToStringConverter> bindITokenToStringConverter() {
+		return AntlrTokenToStringConverter.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
+		return FormalMLAntlrTokenFileProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends Lexer> bindLexer() {
+		return InternalFormalMLLexer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenDefProvider> bindITokenDefProvider() {
+		return AntlrTokenDefProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Provider<InternalFormalMLLexer> provideInternalFormalMLLexer() {
+		return LexerProvider.create(InternalFormalMLLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureRuntimeLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerBindings.RUNTIME))
+			.to(InternalFormalMLLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IUnorderedGroupHelper> bindIUnorderedGroupHelper() {
+		return UnorderedGroupHelper.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.validation.ValidatorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends FormalMLValidator> bindFormalMLValidator() {
+		return FormalMLValidator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IScopeProvider> bindIScopeProvider() {
+		return FormalMLScopeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIScopeProviderDelegate(Binder binder) {
+		binder.bind(IScopeProvider.class).annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(ImportedNamespaceAwareLocalScopeProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return DefaultGlobalScopeProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIgnoreCaseLinking(Binder binder) {
+		binder.bindConstant().annotatedWith(IgnoreCaseLinking.class).to(false);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IContainer.Manager> bindIContainer$Manager() {
+		return StateBasedContainerManager.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IAllContainersState.Provider> bindIAllContainersState$Provider() {
+		return ResourceSetBasedAllContainersStateProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptions(Binder binder) {
+		binder.bind(IResourceDescriptions.class).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsPersisted(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public Class<? extends IGenerator2> bindIGenerator2() {
+		return FormalMLGenerator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ecore2xtext.Ecore2XtextValueConverterServiceFragment2
+	public Class<? extends IValueConverterService> bindIValueConverterService() {
+		return Ecore2XtextTerminalConverters.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.SimpleNamesFragment2
+	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+		return SimpleNameProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.generator.formatting.FormatterFragment
+	public Class<? extends IFormatter> bindIFormatter() {
+		return FormalMLFormatter.class;
+	}
+	
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/FormalML.xtextbin b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/FormalML.xtextbin
new file mode 100644
index 0000000..5cc0096
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/FormalML.xtextbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/FormalMLStandaloneSetupGenerated.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/FormalMLStandaloneSetupGenerated.java
new file mode 100644
index 0000000..741685f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/FormalMLStandaloneSetupGenerated.java
@@ -0,0 +1,53 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.ISetup;
+import org.eclipse.xtext.common.TerminalsStandaloneSetup;
+import org.eclipse.xtext.resource.IResourceFactory;
+import org.eclipse.xtext.resource.IResourceServiceProvider;
+
+@SuppressWarnings("all")
+public class FormalMLStandaloneSetupGenerated implements ISetup {
+
+	@Override
+	public Injector createInjectorAndDoEMFRegistration() {
+		TerminalsStandaloneSetup.doSetup();
+
+		Injector injector = createInjector();
+		register(injector);
+		return injector;
+	}
+	
+	public Injector createInjector() {
+		return Guice.createInjector(new FormalMLRuntimeModule());
+	}
+	
+	public void register(Injector injector) {
+		IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class);
+		IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class);
+		
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("fml", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("fml", serviceProvider);
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xfml", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("xfml", serviceProvider);
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xlia", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("xlia", serviceProvider);
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xfsp", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("xfsp", serviceProvider);
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/FormalMLAntlrTokenFileProvider.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/FormalMLAntlrTokenFileProvider.java
new file mode 100644
index 0000000..5f68ee0
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/FormalMLAntlrTokenFileProvider.java
@@ -0,0 +1,25 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.parser.antlr;
+
+import java.io.InputStream;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+
+public class FormalMLAntlrTokenFileProvider implements IAntlrTokenFileProvider {
+
+	@Override
+	public InputStream getAntlrTokenFile() {
+		ClassLoader classLoader = getClass().getClassLoader();
+		return classLoader.getResourceAsStream("org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalML.tokens");
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/FormalMLParser.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/FormalMLParser.java
new file mode 100644
index 0000000..a2b0248
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/FormalMLParser.java
@@ -0,0 +1,49 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.parser.antlr;
+
+import com.google.inject.Inject;
+import org.eclipse.efm.formalml.xtext.parser.antlr.internal.InternalFormalMLParser;
+import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;
+import org.eclipse.xtext.parser.antlr.AbstractAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+
+public class FormalMLParser extends AbstractAntlrParser {
+
+	@Inject
+	private FormalMLGrammarAccess grammarAccess;
+
+	@Override
+	protected void setInitialHiddenTokens(XtextTokenStream tokenStream) {
+		tokenStream.setInitialHiddenTokens("RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT");
+	}
+	
+
+	@Override
+	protected InternalFormalMLParser createParser(XtextTokenStream stream) {
+		return new InternalFormalMLParser(stream, getGrammarAccess());
+	}
+
+	@Override 
+	protected String getDefaultRuleName() {
+		return "Xlia";
+	}
+
+	public FormalMLGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(FormalMLGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalML.g b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalML.g
new file mode 100644
index 0000000..bc2269a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalML.g
@@ -0,0 +1,30647 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+grammar InternalFormalML;
+
+options {
+	superClass=AbstractInternalAntlrParser;
+	backtrack=true;
+}
+
+@lexer::header {
+package org.eclipse.efm.formalml.xtext.parser.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.parser.antlr.Lexer;
+}
+
+@parser::header {
+package org.eclipse.efm.formalml.xtext.parser.antlr.internal;
+
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.common.util.Enumerator;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.IUnorderedGroupHelper.UnorderedGroupState;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;
+
+}
+
+@parser::members {
+
+/*
+  This grammar contains a lot of empty actions to work around a bug in ANTLR.
+  Otherwise the ANTLR tool will create synpreds that cannot be compiled in some rare cases.
+*/
+
+ 	private FormalMLGrammarAccess grammarAccess;
+
+    public InternalFormalMLParser(TokenStream input, FormalMLGrammarAccess grammarAccess) {
+        this(input);
+        this.grammarAccess = grammarAccess;
+        registerRules(grammarAccess.getGrammar());
+    }
+
+    @Override
+    protected String getFirstRuleName() {
+    	return "Xlia";
+   	}
+
+   	@Override
+   	protected FormalMLGrammarAccess getGrammarAccess() {
+   		return grammarAccess;
+   	}
+
+}
+
+@rulecatch {
+    catch (RecognitionException re) {
+        recover(input,re);
+        appendSkippedTokens();
+    }
+}
+
+// Entry rule entryRuleXlia
+entryRuleXlia returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXliaRule()); }
+	iv_ruleXlia=ruleXlia
+	{ $current=$iv_ruleXlia.current; }
+	EOF;
+
+// Rule Xlia
+ruleXlia returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXliaAccess().getPrologXliaPrologObjectParserRuleCall_0_0());
+				}
+				lv_prolog_0_0=ruleXliaPrologObject
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXliaRule());
+					}
+					set(
+						$current,
+						"prolog",
+						lv_prolog_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.XliaPrologObject");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXliaAccess().getSystemSystemParserRuleCall_1_0());
+				}
+				lv_system_1_0=ruleSystem
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXliaRule());
+					}
+					set(
+						$current,
+						"system",
+						lv_system_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.System");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleXliaPrologObject
+entryRuleXliaPrologObject returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXliaPrologObjectRule()); }
+	iv_ruleXliaPrologObject=ruleXliaPrologObject
+	{ $current=$iv_ruleXliaPrologObject.current; }
+	EOF;
+
+// Rule XliaPrologObject
+ruleXliaPrologObject returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				(
+					lv_name_0_1='@FormalML'
+					{
+						newLeafNode(lv_name_0_1, grammarAccess.getXliaPrologObjectAccess().getNameFormalMLKeyword_0_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXliaPrologObjectRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_0_1, null);
+					}
+					    |
+					lv_name_0_2='@xlia'
+					{
+						newLeafNode(lv_name_0_2, grammarAccess.getXliaPrologObjectAccess().getNameXliaKeyword_0_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXliaPrologObjectRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_0_2, null);
+					}
+					    |
+					lv_name_0_3='@xfsp'
+					{
+						newLeafNode(lv_name_0_3, grammarAccess.getXliaPrologObjectAccess().getNameXfspKeyword_0_0_2());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXliaPrologObjectRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_0_3, null);
+					}
+				)
+			)
+		)
+		otherlv_1='<'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXliaPrologObjectAccess().getLessThanSignKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXliaPrologObjectAccess().getElementsXliaPrologAttributeParserRuleCall_2_0());
+				}
+				lv_elements_2_0=ruleXliaPrologAttribute
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXliaPrologObjectRule());
+					}
+					add(
+						$current,
+						"elements",
+						lv_elements_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.XliaPrologAttribute");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3='>:'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getXliaPrologObjectAccess().getGreaterThanSignColonKeyword_3());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXliaPrologObjectAccess().getElementsXliaOptionObjectParserRuleCall_4_0());
+				}
+				lv_elements_4_0=ruleXliaOptionObject
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXliaPrologObjectRule());
+					}
+					add(
+						$current,
+						"elements",
+						lv_elements_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.XliaOptionObject");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleXliaPrologAttribute
+entryRuleXliaPrologAttribute returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXliaPrologAttributeRule()); }
+	iv_ruleXliaPrologAttribute=ruleXliaPrologAttribute
+	{ $current=$iv_ruleXliaPrologAttribute.current; }
+	EOF;
+
+// Rule XliaPrologAttribute
+ruleXliaPrologAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				(
+					lv_name_0_1='system'
+					{
+						newLeafNode(lv_name_0_1, grammarAccess.getXliaPrologAttributeAccess().getNameSystemKeyword_0_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXliaPrologAttributeRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_0_1, null);
+					}
+					    |
+					lv_name_0_2='package'
+					{
+						newLeafNode(lv_name_0_2, grammarAccess.getXliaPrologAttributeAccess().getNamePackageKeyword_0_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXliaPrologAttributeRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_0_2, null);
+					}
+				)
+			)
+		)
+		(
+			otherlv_1=','
+			{
+				newLeafNode(otherlv_1, grammarAccess.getXliaPrologAttributeAccess().getCommaKeyword_1_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralFloatExpressionParserRuleCall_1_1_0_0());
+						}
+						lv_value_2_1=ruleLiteralFloatExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXliaPrologAttributeRule());
+							}
+							set(
+								$current,
+								"value",
+								lv_value_2_1,
+								"org.eclipse.efm.formalml.xtext.FormalML.LiteralFloatExpression");
+							afterParserOrEnumRuleCall();
+						}
+						    |
+						{
+							newCompositeNode(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralStringExpressionParserRuleCall_1_1_0_1());
+						}
+						lv_value_2_2=ruleLiteralStringExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getXliaPrologAttributeRule());
+							}
+							set(
+								$current,
+								"value",
+								lv_value_2_2,
+								"org.eclipse.efm.formalml.xtext.FormalML.LiteralStringExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleXliaOptionObject
+entryRuleXliaOptionObject returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXliaOptionObjectRule()); }
+	iv_ruleXliaOptionObject=ruleXliaOptionObject
+	{ $current=$iv_ruleXliaOptionObject.current; }
+	EOF;
+
+// Rule XliaOptionObject
+ruleXliaOptionObject returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				lv_name_0_0='@option'
+				{
+					newLeafNode(lv_name_0_0, grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getXliaOptionObjectRule());
+					}
+					setWithLastConsumed($current, "name", lv_name_0_0, "@option");
+				}
+			)
+		)
+		otherlv_1='{'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXliaOptionObjectAccess().getLeftCurlyBracketKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXliaOptionObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0());
+				}
+				lv_elements_2_0=ruleXliaNamedElement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXliaOptionObjectRule());
+					}
+					add(
+						$current,
+						"elements",
+						lv_elements_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.XliaNamedElement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_3='}'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getXliaOptionObjectAccess().getRightCurlyBracketKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleXliaNamedElement
+entryRuleXliaNamedElement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXliaNamedElementRule()); }
+	iv_ruleXliaNamedElement=ruleXliaNamedElement
+	{ $current=$iv_ruleXliaNamedElement.current; }
+	EOF;
+
+// Rule XliaNamedElement
+ruleXliaNamedElement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getXliaNamedElementAccess().getXliaObjectParserRuleCall_0());
+		}
+		this_XliaObject_0=ruleXliaObject
+		{
+			$current = $this_XliaObject_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getXliaNamedElementAccess().getXliaAttributeParserRuleCall_1());
+		}
+		this_XliaAttribute_1=ruleXliaAttribute
+		{
+			$current = $this_XliaAttribute_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleXliaObject
+entryRuleXliaObject returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXliaObjectRule()); }
+	iv_ruleXliaObject=ruleXliaObject
+	{ $current=$iv_ruleXliaObject.current; }
+	EOF;
+
+// Rule XliaObject
+ruleXliaObject returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				lv_name_0_0=RULE_XLIA_ID
+				{
+					newLeafNode(lv_name_0_0, grammarAccess.getXliaObjectAccess().getNameXLIA_IDTerminalRuleCall_0_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getXliaObjectRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
+				}
+			)
+		)
+		otherlv_1='{'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXliaObjectAccess().getLeftCurlyBracketKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXliaObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0());
+				}
+				lv_elements_2_0=ruleXliaNamedElement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXliaObjectRule());
+					}
+					add(
+						$current,
+						"elements",
+						lv_elements_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.XliaNamedElement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_3='}'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getXliaObjectAccess().getRightCurlyBracketKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleXliaAttribute
+entryRuleXliaAttribute returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getXliaAttributeRule()); }
+	iv_ruleXliaAttribute=ruleXliaAttribute
+	{ $current=$iv_ruleXliaAttribute.current; }
+	EOF;
+
+// Rule XliaAttribute
+ruleXliaAttribute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				lv_name_0_0=RULE_XLIA_ID
+				{
+					newLeafNode(lv_name_0_0, grammarAccess.getXliaAttributeAccess().getNameXLIA_IDTerminalRuleCall_0_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getXliaAttributeRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
+				}
+			)
+		)
+		otherlv_1='='
+		{
+			newLeafNode(otherlv_1, grammarAccess.getXliaAttributeAccess().getEqualsSignKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getXliaAttributeAccess().getValueExpressionParserRuleCall_2_0());
+				}
+				lv_value_2_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getXliaAttributeRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3=';'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getXliaAttributeAccess().getSemicolonKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleEBoolean
+entryRuleEBoolean returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEBooleanRule()); }
+	iv_ruleEBoolean=ruleEBoolean
+	{ $current=$iv_ruleEBoolean.current.getText(); }
+	EOF;
+
+// Rule EBoolean
+ruleEBoolean returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='true'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEBooleanAccess().getTrueKeyword_0());
+		}
+		    |
+		kw='false'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEBooleanAccess().getFalseKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleEInt
+entryRuleEInt returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEIntRule()); }
+	iv_ruleEInt=ruleEInt
+	{ $current=$iv_ruleEInt.current.getText(); }
+	EOF;
+
+// Rule EInt
+ruleEInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			kw='-'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getEIntAccess().getHyphenMinusKeyword_0());
+			}
+		)?
+		this_INT_1=RULE_INT
+		{
+			$current.merge(this_INT_1);
+		}
+		{
+			newLeafNode(this_INT_1, grammarAccess.getEIntAccess().getINTTerminalRuleCall_1());
+		}
+	)
+;
+
+// Entry rule entryRuleEInteger
+entryRuleEInteger returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEIntegerRule()); }
+	iv_ruleEInteger=ruleEInteger
+	{ $current=$iv_ruleEInteger.current.getText(); }
+	EOF;
+
+// Rule EInteger
+ruleEInteger returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			kw='-'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getEIntegerAccess().getHyphenMinusKeyword_0());
+			}
+		)?
+		this_INT_1=RULE_INT
+		{
+			$current.merge(this_INT_1);
+		}
+		{
+			newLeafNode(this_INT_1, grammarAccess.getEIntegerAccess().getINTTerminalRuleCall_1());
+		}
+	)
+;
+
+// Entry rule entryRuleEDouble
+entryRuleEDouble returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEDoubleRule()); }
+	iv_ruleEDouble=ruleEDouble
+	{ $current=$iv_ruleEDouble.current.getText(); }
+	EOF;
+
+// Rule EDouble
+ruleEDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			kw='-'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0());
+			}
+		)?
+		(
+			this_INT_1=RULE_INT
+			{
+				$current.merge(this_INT_1);
+			}
+			{
+				newLeafNode(this_INT_1, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1());
+			}
+		)?
+		kw='.'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEDoubleAccess().getFullStopKeyword_2());
+		}
+		this_INT_3=RULE_INT
+		{
+			$current.merge(this_INT_3);
+		}
+		{
+			newLeafNode(this_INT_3, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3());
+		}
+	)
+;
+
+// Entry rule entryRuleECharacter
+entryRuleECharacter returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getECharacterRule()); }
+	iv_ruleECharacter=ruleECharacter
+	{ $current=$iv_ruleECharacter.current.getText(); }
+	EOF;
+
+// Rule ECharacter
+ruleECharacter returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	this_CHARACTER_0=RULE_CHARACTER
+	{
+		$current.merge(this_CHARACTER_0);
+	}
+	{
+		newLeafNode(this_CHARACTER_0, grammarAccess.getECharacterAccess().getCHARACTERTerminalRuleCall());
+	}
+;
+
+// Entry rule entryRuleEString
+entryRuleEString returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEStringRule()); }
+	iv_ruleEString=ruleEString
+	{ $current=$iv_ruleEString.current.getText(); }
+	EOF;
+
+// Rule EString
+ruleEString returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	this_STRING_0=RULE_STRING
+	{
+		$current.merge(this_STRING_0);
+	}
+	{
+		newLeafNode(this_STRING_0, grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall());
+	}
+;
+
+// Entry rule entryRuleESIdentifier
+entryRuleESIdentifier returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getESIdentifierRule()); }
+	iv_ruleESIdentifier=ruleESIdentifier
+	{ $current=$iv_ruleESIdentifier.current.getText(); }
+	EOF;
+
+// Rule ESIdentifier
+ruleESIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	this_XLIA_ID_0=RULE_XLIA_ID
+	{
+		$current.merge(this_XLIA_ID_0);
+	}
+	{
+		newLeafNode(this_XLIA_ID_0, grammarAccess.getESIdentifierAccess().getXLIA_IDTerminalRuleCall());
+	}
+;
+
+// Entry rule entryRuleESUfid
+entryRuleESUfid returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getESUfidRule()); }
+	iv_ruleESUfid=ruleESUfid
+	{ $current=$iv_ruleESUfid.current.getText(); }
+	EOF;
+
+// Rule ESUfid
+ruleESUfid returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		this_XLIA_ID_0=RULE_XLIA_ID
+		{
+			$current.merge(this_XLIA_ID_0);
+		}
+		{
+			newLeafNode(this_XLIA_ID_0, grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_0());
+		}
+		(
+			(
+				kw='.'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getESUfidAccess().getFullStopKeyword_1_0_0());
+				}
+				    |
+				kw=':'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getESUfidAccess().getColonKeyword_1_0_1());
+				}
+				    |
+				kw='::'
+				{
+					$current.merge(kw);
+					newLeafNode(kw, grammarAccess.getESUfidAccess().getColonColonKeyword_1_0_2());
+				}
+			)
+			this_XLIA_ID_4=RULE_XLIA_ID
+			{
+				$current.merge(this_XLIA_ID_4);
+			}
+			{
+				newLeafNode(this_XLIA_ID_4, grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_1_1());
+			}
+		)*
+	)
+;
+
+// Entry rule entryRuleUnrestrictedName
+entryRuleUnrestrictedName returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getUnrestrictedNameRule()); }
+	iv_ruleUnrestrictedName=ruleUnrestrictedName
+	{ $current=$iv_ruleUnrestrictedName.current.getText(); }
+	EOF;
+
+// Rule UnrestrictedName
+ruleUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	this_STRING_0=RULE_STRING
+	{
+		$current.merge(this_STRING_0);
+	}
+	{
+		newLeafNode(this_STRING_0, grammarAccess.getUnrestrictedNameAccess().getSTRINGTerminalRuleCall());
+	}
+;
+
+// Entry rule entryRuleUnqualifiedName
+entryRuleUnqualifiedName returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUnqualifiedNameRule()); }
+	iv_ruleUnqualifiedName=ruleUnqualifiedName
+	{ $current=$iv_ruleUnqualifiedName.current; }
+	EOF;
+
+// Rule UnqualifiedName
+ruleUnqualifiedName returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getUnqualifiedNameAccess().getNameBindingNameBindingParserRuleCall_0());
+			}
+			lv_nameBinding_0_0=ruleNameBinding
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getUnqualifiedNameRule());
+				}
+				add(
+					$current,
+					"nameBinding",
+					lv_nameBinding_0_0,
+					"org.eclipse.efm.formalml.xtext.FormalML.NameBinding");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleNameBinding
+entryRuleNameBinding returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getNameBindingRule()); }
+	iv_ruleNameBinding=ruleNameBinding
+	{ $current=$iv_ruleNameBinding.current.getText(); }
+	EOF;
+
+// Rule NameBinding
+ruleNameBinding returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	this_XLIA_ID_0=RULE_XLIA_ID
+	{
+		$current.merge(this_XLIA_ID_0);
+	}
+	{
+		newLeafNode(this_XLIA_ID_0, grammarAccess.getNameBindingAccess().getXLIA_IDTerminalRuleCall());
+	}
+;
+
+// Entry rule entryRuleSystem
+entryRuleSystem returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getSystemAccess().getUnorderedGroup_0()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getSystemRule()); }
+	iv_ruleSystem=ruleSystem
+	{ $current=$iv_ruleSystem.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule System
+ruleSystem returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getSystemAccess().getUnorderedGroup_0()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getSystemAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+									}
+									lv_visibility_1_0=ruleVisibilityKind
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getSystemRule());
+										}
+										set(
+											$current,
+											"visibility",
+											lv_visibility_1_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1);
+					}
+								({true}?=>((
+									(
+										lv_timed_2_0='timed'
+										{
+											newLeafNode(lv_timed_2_0, grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getSystemRule());
+											}
+											setWithLastConsumed($current, "timed", true, "timed");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_input_enabled_3_0='input_enabled'
+										{
+											newLeafNode(lv_input_enabled_3_0, grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getSystemRule());
+											}
+											setWithLastConsumed($current, "input_enabled", true, "input_enabled");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+				}
+		)
+		otherlv_4='system'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getSystemAccess().getSystemKeyword_1());
+		}
+		(
+			otherlv_5='<'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getSystemAccess().getLessThanSignKeyword_2_0());
+			}
+			(
+				otherlv_6='moc:'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getSystemAccess().getMocKeyword_2_1());
+				}
+			)?
+			(
+				otherlv_7='and'
+				{
+					newLeafNode(otherlv_7, grammarAccess.getSystemAccess().getAndKeyword_2_2_0());
+				}
+				    |
+				otherlv_8='or'
+				{
+					newLeafNode(otherlv_8, grammarAccess.getSystemAccess().getOrKeyword_2_2_1());
+				}
+			)
+			otherlv_9='>'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getSystemAccess().getGreaterThanSignKeyword_2_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSystemAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_10_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSystemRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_10_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSystemAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_11_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSystemRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_11_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_12='{'
+		{
+			newLeafNode(otherlv_12, grammarAccess.getSystemAccess().getLeftCurlyBracketKeyword_5());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSystemAccess().getPortPortParserRuleCall_6_0_0());
+					}
+					lv_port_13_0=rulePort
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSystemRule());
+						}
+						add(
+							$current,
+							"port",
+							lv_port_13_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Port");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_6_1_0());
+					}
+					lv_signal_14_0=ruleSignal
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSystemRule());
+						}
+						add(
+							$current,
+							"signal",
+							lv_signal_14_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_6_2_0());
+					}
+					lv_buffer_15_0=ruleBuffer
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSystemRule());
+						}
+						add(
+							$current,
+							"buffer",
+							lv_buffer_15_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_6_3_0());
+					}
+					lv_channel_16_0=ruleChannel
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSystemRule());
+						}
+						add(
+							$current,
+							"channel",
+							lv_channel_16_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0());
+					}
+					lv_typedef_17_0=ruleTypeDefinition
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSystemRule());
+						}
+						add(
+							$current,
+							"typedef",
+							lv_typedef_17_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_6_5_0());
+					}
+					lv_property_18_0=ruleVariable
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSystemRule());
+						}
+						add(
+							$current,
+							"property",
+							lv_property_18_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		(
+			(
+				otherlv_19='@property:'
+				{
+					newLeafNode(otherlv_19, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getPortPortParserRuleCall_7_0_1_0_0());
+							}
+							lv_port_20_0=rulePort
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_20_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Port");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_7_0_1_1_0());
+							}
+							lv_signal_21_0=ruleSignal
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_21_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_7_0_1_2_0());
+							}
+							lv_buffer_22_0=ruleBuffer
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_22_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_7_0_1_3_0());
+							}
+							lv_channel_23_0=ruleChannel
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_23_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0());
+							}
+							lv_typedef_24_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_24_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_7_0_1_5_0());
+							}
+							lv_property_25_0=ruleVariable
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_25_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_26='@public:'
+				{
+					newLeafNode(otherlv_26, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getPortPortPublicParserRuleCall_7_1_1_0_0());
+							}
+							lv_port_27_0=rulePortPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_27_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0());
+							}
+							lv_signal_28_0=ruleSignalPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_28_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0());
+							}
+							lv_buffer_29_0=ruleBufferPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_29_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0());
+							}
+							lv_channel_30_0=ruleChannelPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_30_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0());
+							}
+							lv_typedef_31_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_31_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0());
+							}
+							lv_property_32_0=ruleVariablePublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_32_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_33='@protected:'
+				{
+					newLeafNode(otherlv_33, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0());
+							}
+							lv_port_34_0=rulePortProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_34_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0());
+							}
+							lv_signal_35_0=ruleSignalProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_35_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0());
+							}
+							lv_buffer_36_0=ruleBufferProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_36_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0());
+							}
+							lv_channel_37_0=ruleChannelProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_37_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0());
+							}
+							lv_typedef_38_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_38_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0());
+							}
+							lv_property_39_0=ruleVariableProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_39_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_40='@private:'
+				{
+					newLeafNode(otherlv_40, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0());
+							}
+							lv_port_41_0=rulePortPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_41_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0());
+							}
+							lv_signal_42_0=ruleSignalPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_42_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0());
+							}
+							lv_buffer_43_0=ruleBufferPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_43_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0());
+							}
+							lv_channel_44_0=ruleChannelPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_44_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0());
+							}
+							lv_typedef_45_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_45_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0());
+							}
+							lv_property_46_0=ruleVariablePrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_46_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+		)*
+		(
+			(
+				(
+					(
+						otherlv_47='@routine:'
+						{
+							newLeafNode(otherlv_47, grammarAccess.getSystemAccess().getRoutineKeyword_8_0_0_0_0());
+						}
+						    |
+						otherlv_48='@macro:'
+						{
+							newLeafNode(otherlv_48, grammarAccess.getSystemAccess().getMacroKeyword_8_0_0_0_1());
+						}
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0());
+							}
+							lv_routine_49_0=ruleRoutine
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"routine",
+									lv_routine_49_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)+
+				)
+				    |
+				(
+					otherlv_50='@procedure:'
+					{
+						newLeafNode(otherlv_50, grammarAccess.getSystemAccess().getProcedureKeyword_8_0_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0());
+							}
+							lv_procedure_51_0=ruleProcedure
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"procedure",
+									lv_procedure_51_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)+
+				)
+			)*
+			    |
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_1_0_0());
+						}
+						lv_routine_52_0=ruleRoutine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSystemRule());
+							}
+							add(
+								$current,
+								"routine",
+								lv_routine_52_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_1_1_0());
+						}
+						lv_procedure_53_0=ruleProcedure
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSystemRule());
+							}
+							add(
+								$current,
+								"procedure",
+								lv_procedure_53_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)+
+		)
+		(
+			(
+				(
+					otherlv_54='@composite:'
+					{
+						newLeafNode(otherlv_54, grammarAccess.getSystemAccess().getCompositeKeyword_9_0_0_0());
+					}
+					    |
+					otherlv_55='@machine:'
+					{
+						newLeafNode(otherlv_55, grammarAccess.getSystemAccess().getMachineKeyword_9_0_0_1());
+					}
+				)
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0());
+							}
+							lv_machine_56_0=ruleAnyMachineBlock
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"machine",
+									lv_machine_56_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0());
+							}
+							lv_instance_57_0=ruleInstanceMachine
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSystemRule());
+								}
+								add(
+									$current,
+									"instance",
+									lv_instance_57_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)+
+			)
+			    |
+			(
+				otherlv_58='@model:'
+				{
+					newLeafNode(otherlv_58, grammarAccess.getSystemAccess().getModelKeyword_9_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0());
+						}
+						lv_machine_59_0=ruleAnyMachineBlock
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSystemRule());
+							}
+							add(
+								$current,
+								"machine",
+								lv_machine_59_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_60='@prototype:'
+				{
+					newLeafNode(otherlv_60, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0());
+						}
+						lv_machine_61_0=ruleAnyMachineBlock
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSystemRule());
+							}
+							add(
+								$current,
+								"machine",
+								lv_machine_61_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_62='@instance:'
+				{
+					newLeafNode(otherlv_62, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0());
+						}
+						lv_instance_63_0=ruleInstanceMachine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSystemRule());
+							}
+							add(
+								$current,
+								"instance",
+								lv_instance_63_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+			)
+		)*
+		(
+			(
+				otherlv_64='@behavior:'
+				{
+					newLeafNode(otherlv_64, grammarAccess.getSystemAccess().getBehaviorKeyword_10_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSystemAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0());
+						}
+						lv_behavior_65_0=ruleBehavior
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSystemRule());
+							}
+							add(
+								$current,
+								"behavior",
+								lv_behavior_65_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Behavior");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)+
+			)
+			    |
+			(
+				otherlv_66='@statemachine:'
+				{
+					newLeafNode(otherlv_66, grammarAccess.getSystemAccess().getStatemachineKeyword_10_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSystemAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0());
+						}
+						lv_behavior_67_0=ruleStatemachine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSystemRule());
+							}
+							add(
+								$current,
+								"behavior",
+								lv_behavior_67_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Statemachine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)+
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSystemAccess().getMainMoeBehaviorParserRuleCall_11_0());
+				}
+				lv_main_68_0=ruleMoeBehavior
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSystemRule());
+					}
+					set(
+						$current,
+						"main",
+						lv_main_68_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.MoeBehavior");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_69='}'
+		{
+			newLeafNode(otherlv_69, grammarAccess.getSystemAccess().getRightCurlyBracketKeyword_12());
+		}
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleAnyMachineBlock
+entryRuleAnyMachineBlock returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getAnyMachineBlockRule()); }
+	iv_ruleAnyMachineBlock=ruleAnyMachineBlock
+	{ $current=$iv_ruleAnyMachineBlock.current; }
+	EOF;
+
+// Rule AnyMachineBlock
+ruleAnyMachineBlock returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getAnyMachineBlockAccess().getMachineBlockParserRuleCall_0());
+		}
+		this_MachineBlock_0=ruleMachineBlock
+		{
+			$current = $this_MachineBlock_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getAnyMachineBlockAccess().getStatemachineParserRuleCall_1());
+		}
+		this_Statemachine_1=ruleStatemachine
+		{
+			$current = $this_Statemachine_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleInstanceMachine
+entryRuleInstanceMachine returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getInstanceMachineRule()); }
+	iv_ruleInstanceMachine=ruleInstanceMachine
+	{ $current=$iv_ruleInstanceMachine.current; }
+	EOF;
+
+// Rule InstanceMachine
+ruleInstanceMachine returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='instance'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getInstanceMachineAccess().getInstanceKeyword_0());
+		}
+		(
+			otherlv_1='machine'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getInstanceMachineAccess().getMachineKeyword_1_0());
+			}
+			    |
+			otherlv_2='statemachine'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getInstanceMachineAccess().getStatemachineKeyword_1_1());
+			}
+		)?
+		otherlv_3='<'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getInstanceMachineAccess().getLessThanSignKeyword_2());
+		}
+		(
+			otherlv_4='model:'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getInstanceMachineAccess().getModelKeyword_3());
+			}
+		)?
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getInstanceMachineRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getInstanceMachineAccess().getModelMachineCrossReference_4_0());
+				}
+				ruleESUfid
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_6='>'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getInstanceMachineAccess().getGreaterThanSignKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getInstanceMachineAccess().getNameESIdentifierParserRuleCall_6_0());
+				}
+				lv_name_7_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				(
+					otherlv_9='('
+					{
+						newLeafNode(otherlv_9, grammarAccess.getInstanceMachineAccess().getLeftParenthesisKeyword_8_0_0_0());
+					}
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_0_0());
+								}
+								lv_slot_10_0=ruleSlotParameter
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+									}
+									add(
+										$current,
+										"slot",
+										lv_slot_10_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						(
+							otherlv_11=','
+							{
+								newLeafNode(otherlv_11, grammarAccess.getInstanceMachineAccess().getCommaKeyword_8_0_0_1_1_0());
+							}
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_1_1_0());
+									}
+									lv_slot_12_0=ruleSlotParameter
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+										}
+										add(
+											$current,
+											"slot",
+											lv_slot_12_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+						)*
+					)?
+					otherlv_13=')'
+					{
+						newLeafNode(otherlv_13, grammarAccess.getInstanceMachineAccess().getRightParenthesisKeyword_8_0_0_2());
+					}
+				)?
+				otherlv_14=';'
+				{
+					newLeafNode(otherlv_14, grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_0_1());
+				}
+			)
+			    |
+			(
+				otherlv_15='{'
+				{
+					newLeafNode(otherlv_15, grammarAccess.getInstanceMachineAccess().getLeftCurlyBracketKeyword_8_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getInstanceMachineAccess().getSlotSlotPropertyParserRuleCall_8_1_1_0_0());
+							}
+							lv_slot_16_0=ruleSlotProperty
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+								}
+								add(
+									$current,
+									"slot",
+									lv_slot_16_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SlotProperty");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_17=';'
+					{
+						newLeafNode(otherlv_17, grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_1_1_1());
+					}
+				)*
+				otherlv_18='}'
+				{
+					newLeafNode(otherlv_18, grammarAccess.getInstanceMachineAccess().getRightCurlyBracketKeyword_8_1_2());
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleSlotParameter
+entryRuleSlotParameter returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSlotParameterRule()); }
+	iv_ruleSlotParameter=ruleSlotParameter
+	{ $current=$iv_ruleSlotParameter.current; }
+	EOF;
+
+// Rule SlotParameter
+ruleSlotParameter returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getSlotParameterRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0());
+				}
+				ruleESIdentifier
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_1=':'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getSlotParameterAccess().getColonKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSlotParameterAccess().getValueExpressionParserRuleCall_2_0());
+				}
+				lv_value_2_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSlotParameterRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleSlotProperty
+entryRuleSlotProperty returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSlotPropertyRule()); }
+	iv_ruleSlotProperty=ruleSlotProperty
+	{ $current=$iv_ruleSlotProperty.current; }
+	EOF;
+
+// Rule SlotProperty
+ruleSlotProperty returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getSlotPropertyRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0());
+				}
+				ruleESIdentifier
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_1='='
+		{
+			newLeafNode(otherlv_1, grammarAccess.getSlotPropertyAccess().getEqualsSignKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSlotPropertyAccess().getValueExpressionParserRuleCall_2_0());
+				}
+				lv_value_2_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSlotPropertyRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleMachineBlock
+entryRuleMachineBlock returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getMachineBlockRule()); }
+	iv_ruleMachineBlock=ruleMachineBlock
+	{ $current=$iv_ruleMachineBlock.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule MachineBlock
+ruleMachineBlock returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getMachineBlockAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+									}
+									lv_visibility_1_0=ruleVisibilityKind
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+										}
+										set(
+											$current,
+											"visibility",
+											lv_visibility_1_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1);
+					}
+								({true}?=>((
+									(
+										lv_timed_2_0='timed'
+										{
+											newLeafNode(lv_timed_2_0, grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getMachineBlockRule());
+											}
+											setWithLastConsumed($current, "timed", true, "timed");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_input_enabled_3_0='input_enabled'
+										{
+											newLeafNode(lv_input_enabled_3_0, grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getMachineBlockRule());
+											}
+											setWithLastConsumed($current, "input_enabled", true, "input_enabled");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getMachineBlockAccess().getDesignDesignKindEnumRuleCall_0_2_0());
+									}
+									lv_design_4_0=ruleDesignKind
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+										}
+										set(
+											$current,
+											"design",
+											lv_design_4_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.DesignKind");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+				}
+		)
+		otherlv_5='machine'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getMachineBlockAccess().getMachineKeyword_1());
+		}
+		(
+			otherlv_6='<'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getMachineBlockAccess().getLessThanSignKeyword_2_0());
+			}
+			(
+				otherlv_7='moc:'
+				{
+					newLeafNode(otherlv_7, grammarAccess.getMachineBlockAccess().getMocKeyword_2_1());
+				}
+			)?
+			(
+				otherlv_8='and'
+				{
+					newLeafNode(otherlv_8, grammarAccess.getMachineBlockAccess().getAndKeyword_2_2_0());
+				}
+				    |
+				otherlv_9='or'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getMachineBlockAccess().getOrKeyword_2_2_1());
+				}
+			)
+			otherlv_10='>'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getMachineBlockAccess().getGreaterThanSignKeyword_2_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getMachineBlockAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_11_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_11_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getMachineBlockAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_12_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_12_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_13='{'
+		{
+			newLeafNode(otherlv_13, grammarAccess.getMachineBlockAccess().getLeftCurlyBracketKeyword_5());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_6_0_0());
+					}
+					lv_port_14_0=rulePort
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+						}
+						add(
+							$current,
+							"port",
+							lv_port_14_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Port");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_6_1_0());
+					}
+					lv_signal_15_0=ruleSignal
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+						}
+						add(
+							$current,
+							"signal",
+							lv_signal_15_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_6_2_0());
+					}
+					lv_buffer_16_0=ruleBuffer
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+						}
+						add(
+							$current,
+							"buffer",
+							lv_buffer_16_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_6_3_0());
+					}
+					lv_channel_17_0=ruleChannel
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+						}
+						add(
+							$current,
+							"channel",
+							lv_channel_17_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0());
+					}
+					lv_typedef_18_0=ruleTypeDefinition
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+						}
+						add(
+							$current,
+							"typedef",
+							lv_typedef_18_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_6_5_0());
+					}
+					lv_property_19_0=ruleVariable
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+						}
+						add(
+							$current,
+							"property",
+							lv_property_19_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		(
+			(
+				otherlv_20='@property:'
+				{
+					newLeafNode(otherlv_20, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_7_0_1_0_0());
+							}
+							lv_port_21_0=rulePort
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_21_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Port");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_7_0_1_1_0());
+							}
+							lv_signal_22_0=ruleSignal
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_22_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_7_0_1_2_0());
+							}
+							lv_buffer_23_0=ruleBuffer
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_23_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_7_0_1_3_0());
+							}
+							lv_channel_24_0=ruleChannel
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_24_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0());
+							}
+							lv_typedef_25_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_25_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_7_0_1_5_0());
+							}
+							lv_property_26_0=ruleVariable
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_26_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_27='@public:'
+				{
+					newLeafNode(otherlv_27, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortPublicParserRuleCall_7_1_1_0_0());
+							}
+							lv_port_28_0=rulePortPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_28_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0());
+							}
+							lv_signal_29_0=ruleSignalPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_29_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0());
+							}
+							lv_buffer_30_0=ruleBufferPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_30_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0());
+							}
+							lv_channel_31_0=ruleChannelPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_31_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0());
+							}
+							lv_typedef_32_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_32_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0());
+							}
+							lv_property_33_0=ruleVariablePublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_33_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_34='@protected:'
+				{
+					newLeafNode(otherlv_34, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0());
+							}
+							lv_port_35_0=rulePortProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_35_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0());
+							}
+							lv_signal_36_0=ruleSignalProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_36_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0());
+							}
+							lv_buffer_37_0=ruleBufferProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_37_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0());
+							}
+							lv_channel_38_0=ruleChannelProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_38_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0());
+							}
+							lv_typedef_39_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_39_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0());
+							}
+							lv_property_40_0=ruleVariableProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_40_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_41='@private:'
+				{
+					newLeafNode(otherlv_41, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0());
+							}
+							lv_port_42_0=rulePortPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_42_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0());
+							}
+							lv_signal_43_0=ruleSignalPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_43_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0());
+							}
+							lv_buffer_44_0=ruleBufferPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_44_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0());
+							}
+							lv_channel_45_0=ruleChannelPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_45_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0());
+							}
+							lv_typedef_46_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_46_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0());
+							}
+							lv_property_47_0=ruleVariablePrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_47_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+		)*
+		(
+			(
+				(
+					(
+						otherlv_48='@routine:'
+						{
+							newLeafNode(otherlv_48, grammarAccess.getMachineBlockAccess().getRoutineKeyword_8_0_0_0_0());
+						}
+						    |
+						otherlv_49='@macro:'
+						{
+							newLeafNode(otherlv_49, grammarAccess.getMachineBlockAccess().getMacroKeyword_8_0_0_0_1());
+						}
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0());
+							}
+							lv_routine_50_0=ruleRoutine
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"routine",
+									lv_routine_50_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)+
+				)
+				    |
+				(
+					otherlv_51='@procedure:'
+					{
+						newLeafNode(otherlv_51, grammarAccess.getMachineBlockAccess().getProcedureKeyword_8_0_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0());
+							}
+							lv_procedure_52_0=ruleProcedure
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"procedure",
+									lv_procedure_52_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)+
+				)
+			)*
+			    |
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_1_0_0());
+						}
+						lv_routine_53_0=ruleRoutine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+							}
+							add(
+								$current,
+								"routine",
+								lv_routine_53_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_1_1_0());
+						}
+						lv_procedure_54_0=ruleProcedure
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+							}
+							add(
+								$current,
+								"procedure",
+								lv_procedure_54_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)+
+		)
+		(
+			(
+				(
+					otherlv_55='@composite:'
+					{
+						newLeafNode(otherlv_55, grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0());
+					}
+					    |
+					otherlv_56='@machine:'
+					{
+						newLeafNode(otherlv_56, grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1());
+					}
+				)
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0());
+							}
+							lv_machine_57_0=ruleAnyMachineBlock
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"machine",
+									lv_machine_57_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0());
+							}
+							lv_instance_58_0=ruleInstanceMachine
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+								}
+								add(
+									$current,
+									"instance",
+									lv_instance_58_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)+
+			)
+			    |
+			(
+				otherlv_59='@model:'
+				{
+					newLeafNode(otherlv_59, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0());
+						}
+						lv_machine_60_0=ruleAnyMachineBlock
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+							}
+							add(
+								$current,
+								"machine",
+								lv_machine_60_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_61='@prototype:'
+				{
+					newLeafNode(otherlv_61, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0());
+						}
+						lv_machine_62_0=ruleAnyMachineBlock
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+							}
+							add(
+								$current,
+								"machine",
+								lv_machine_62_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_63='@instance:'
+				{
+					newLeafNode(otherlv_63, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0());
+						}
+						lv_instance_64_0=ruleInstanceMachine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+							}
+							add(
+								$current,
+								"instance",
+								lv_instance_64_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+			)
+		)*
+		(
+			(
+				otherlv_65='@behavior:'
+				{
+					newLeafNode(otherlv_65, grammarAccess.getMachineBlockAccess().getBehaviorKeyword_10_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMachineBlockAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0());
+						}
+						lv_behavior_66_0=ruleBehavior
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+							}
+							add(
+								$current,
+								"behavior",
+								lv_behavior_66_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Behavior");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)+
+			)
+			    |
+			(
+				otherlv_67='@statemachine:'
+				{
+					newLeafNode(otherlv_67, grammarAccess.getMachineBlockAccess().getStatemachineKeyword_10_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMachineBlockAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0());
+						}
+						lv_behavior_68_0=ruleStatemachine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+							}
+							add(
+								$current,
+								"behavior",
+								lv_behavior_68_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Statemachine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)+
+			)
+		)*
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getMachineBlockAccess().getMainMoeBehaviorParserRuleCall_11_0());
+				}
+				lv_main_69_0=ruleMoeBehavior
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+					}
+					set(
+						$current,
+						"main",
+						lv_main_69_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.MoeBehavior");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_70='}'
+		{
+			newLeafNode(otherlv_70, grammarAccess.getMachineBlockAccess().getRightCurlyBracketKeyword_12());
+		}
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleProcedure
+entryRuleProcedure returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getProcedureRule()); }
+	iv_ruleProcedure=ruleProcedure
+	{ $current=$iv_ruleProcedure.current; }
+	EOF;
+
+// Rule Procedure
+ruleProcedure returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getProcedureAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getProcedureRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_1='procedure'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getProcedureAccess().getProcedureKeyword_1());
+		}
+		(
+			otherlv_2='<'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getProcedureAccess().getLessThanSignKeyword_2_0());
+			}
+			(
+				otherlv_3='moc:'
+				{
+					newLeafNode(otherlv_3, grammarAccess.getProcedureAccess().getMocKeyword_2_1());
+				}
+			)?
+			(
+				otherlv_4='and'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getProcedureAccess().getAndKeyword_2_2_0());
+				}
+				    |
+				otherlv_5='or'
+				{
+					newLeafNode(otherlv_5, grammarAccess.getProcedureAccess().getOrKeyword_2_2_1());
+				}
+			)
+			otherlv_6='>'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getProcedureAccess().getGreaterThanSignKeyword_2_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getProcedureAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_7_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getProcedureRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getProcedureAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getProcedureRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				otherlv_9='('
+				{
+					newLeafNode(otherlv_9, grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_0_0());
+							}
+							lv_parameter_10_0=ruleFunctionalParameter
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_10_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						otherlv_11=','
+						{
+							newLeafNode(otherlv_11, grammarAccess.getProcedureAccess().getCommaKeyword_5_0_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0());
+								}
+								lv_parameter_12_0=ruleFunctionalParameter
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getProcedureRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_12_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+				)?
+				otherlv_13=')'
+				{
+					newLeafNode(otherlv_13, grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_0_2());
+				}
+			)?
+			(
+				otherlv_14='-->'
+				{
+					newLeafNode(otherlv_14, grammarAccess.getProcedureAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_0_0());
+							}
+							lv_parameter_15_0=ruleFormalParameter
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_15_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						otherlv_16='('
+						{
+							newLeafNode(otherlv_16, grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_1_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_1_0());
+								}
+								lv_parameter_17_0=ruleFormalParameter
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getProcedureRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_17_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						(
+							otherlv_18=','
+							{
+								newLeafNode(otherlv_18, grammarAccess.getProcedureAccess().getCommaKeyword_5_1_1_1_2_0());
+							}
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0());
+									}
+									lv_parameter_19_0=ruleFormalParameter
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getProcedureRule());
+										}
+										add(
+											$current,
+											"parameter",
+											lv_parameter_19_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+						)*
+						otherlv_20=')'
+						{
+							newLeafNode(otherlv_20, grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_1_1_1_3());
+						}
+					)
+				)
+			)?
+		)?
+		otherlv_21='{'
+		{
+			newLeafNode(otherlv_21, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_6());
+		}
+		(
+			(
+				otherlv_22='@parameter:'
+				{
+					newLeafNode(otherlv_22, grammarAccess.getProcedureAccess().getParameterKeyword_7_0_0());
+				}
+				(
+					(
+						otherlv_23='input'
+						{
+							newLeafNode(otherlv_23, grammarAccess.getProcedureAccess().getInputKeyword_7_0_1_0_0());
+						}
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0());
+									}
+									lv_parameter_24_0=ruleParameterInput
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getProcedureRule());
+										}
+										add(
+											$current,
+											"parameter",
+											lv_parameter_24_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							(
+								otherlv_25='{'
+								{
+									newLeafNode(otherlv_25, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0());
+										}
+										lv_parameter_26_0=ruleParameterInput
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getProcedureRule());
+											}
+											add(
+												$current,
+												"parameter",
+												lv_parameter_26_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)+
+								otherlv_27='}'
+								{
+									newLeafNode(otherlv_27, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2());
+								}
+							)
+						)
+					)
+					    |
+					(
+						otherlv_28='inout'
+						{
+							newLeafNode(otherlv_28, grammarAccess.getProcedureAccess().getInoutKeyword_7_0_1_1_0());
+						}
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0());
+									}
+									lv_parameter_29_0=ruleParameterInout
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getProcedureRule());
+										}
+										add(
+											$current,
+											"parameter",
+											lv_parameter_29_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							(
+								otherlv_30='{'
+								{
+									newLeafNode(otherlv_30, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0());
+										}
+										lv_parameter_31_0=ruleParameterInout
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getProcedureRule());
+											}
+											add(
+												$current,
+												"parameter",
+												lv_parameter_31_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)+
+								otherlv_32='}'
+								{
+									newLeafNode(otherlv_32, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2());
+								}
+							)
+						)
+					)
+					    |
+					(
+						otherlv_33='output'
+						{
+							newLeafNode(otherlv_33, grammarAccess.getProcedureAccess().getOutputKeyword_7_0_1_2_0());
+						}
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0());
+									}
+									lv_parameter_34_0=ruleParameterOutput
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getProcedureRule());
+										}
+										add(
+											$current,
+											"parameter",
+											lv_parameter_34_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							(
+								otherlv_35='{'
+								{
+									newLeafNode(otherlv_35, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0());
+										}
+										lv_parameter_36_0=ruleParameterOutput
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getProcedureRule());
+											}
+											add(
+												$current,
+												"parameter",
+												lv_parameter_36_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)+
+								otherlv_37='}'
+								{
+									newLeafNode(otherlv_37, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2());
+								}
+							)
+						)
+					)
+					    |
+					(
+						otherlv_38='return'
+						{
+							newLeafNode(otherlv_38, grammarAccess.getProcedureAccess().getReturnKeyword_7_0_1_3_0());
+						}
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0());
+									}
+									lv_parameter_39_0=ruleParameterReturn
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getProcedureRule());
+										}
+										add(
+											$current,
+											"parameter",
+											lv_parameter_39_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							(
+								otherlv_40='{'
+								{
+									newLeafNode(otherlv_40, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0());
+										}
+										lv_parameter_41_0=ruleParameterReturn
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getProcedureRule());
+											}
+											add(
+												$current,
+												"parameter",
+												lv_parameter_41_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)+
+								otherlv_42='}'
+								{
+									newLeafNode(otherlv_42, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2());
+								}
+							)
+						)
+					)
+				)*
+			)
+			    |
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_7_1_0_0());
+						}
+						lv_port_43_0=rulePort
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getProcedureRule());
+							}
+							add(
+								$current,
+								"port",
+								lv_port_43_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Port");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_7_1_1_0());
+						}
+						lv_signal_44_0=ruleSignal
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getProcedureRule());
+							}
+							add(
+								$current,
+								"signal",
+								lv_signal_44_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_7_1_2_0());
+						}
+						lv_buffer_45_0=ruleBuffer
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getProcedureRule());
+							}
+							add(
+								$current,
+								"buffer",
+								lv_buffer_45_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_7_1_3_0());
+						}
+						lv_channel_46_0=ruleChannel
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getProcedureRule());
+							}
+							add(
+								$current,
+								"channel",
+								lv_channel_46_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0());
+						}
+						lv_typedef_47_0=ruleTypeDefinition
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getProcedureRule());
+							}
+							add(
+								$current,
+								"typedef",
+								lv_typedef_47_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_7_1_5_0());
+						}
+						lv_property_48_0=ruleVariable
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getProcedureRule());
+							}
+							add(
+								$current,
+								"property",
+								lv_property_48_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)
+		(
+			(
+				otherlv_49='@input:'
+				{
+					newLeafNode(otherlv_49, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0());
+							}
+							lv_parameter_50_0=ruleParameterInput
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_50_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						otherlv_51='{'
+						{
+							newLeafNode(otherlv_51, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_0_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0());
+								}
+								lv_parameter_52_0=ruleParameterInput
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getProcedureRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_52_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)+
+						otherlv_53='}'
+						{
+							newLeafNode(otherlv_53, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_0_1_1_2());
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_54='@inout:'
+				{
+					newLeafNode(otherlv_54, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0());
+							}
+							lv_parameter_55_0=ruleParameterInout
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_55_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						otherlv_56='{'
+						{
+							newLeafNode(otherlv_56, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_1_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0());
+								}
+								lv_parameter_57_0=ruleParameterInout
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getProcedureRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_57_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)+
+						otherlv_58='}'
+						{
+							newLeafNode(otherlv_58, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_1_1_1_2());
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_59='@output:'
+				{
+					newLeafNode(otherlv_59, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0());
+							}
+							lv_parameter_60_0=ruleParameterOutput
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_60_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						otherlv_61='{'
+						{
+							newLeafNode(otherlv_61, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_2_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0());
+								}
+								lv_parameter_62_0=ruleParameterOutput
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getProcedureRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_62_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)+
+						otherlv_63='}'
+						{
+							newLeafNode(otherlv_63, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_2_1_1_2());
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_64='@return:'
+				{
+					newLeafNode(otherlv_64, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0());
+							}
+							lv_parameter_65_0=ruleParameterReturn
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_65_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						otherlv_66='{'
+						{
+							newLeafNode(otherlv_66, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_3_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0());
+								}
+								lv_parameter_67_0=ruleParameterReturn
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getProcedureRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_67_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)+
+						otherlv_68='}'
+						{
+							newLeafNode(otherlv_68, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_3_1_1_2());
+						}
+					)
+				)*
+			)
+		)*
+		(
+			(
+				otherlv_69='@property:'
+				{
+					newLeafNode(otherlv_69, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_9_0_1_0_0());
+							}
+							lv_port_70_0=rulePort
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_70_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Port");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_9_0_1_1_0());
+							}
+							lv_signal_71_0=ruleSignal
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_71_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_9_0_1_2_0());
+							}
+							lv_buffer_72_0=ruleBuffer
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_72_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_9_0_1_3_0());
+							}
+							lv_channel_73_0=ruleChannel
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_73_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0());
+							}
+							lv_typedef_74_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_74_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_9_0_1_5_0());
+							}
+							lv_property_75_0=ruleVariable
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_75_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_76='@public:'
+				{
+					newLeafNode(otherlv_76, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortPublicParserRuleCall_9_1_1_0_0());
+							}
+							lv_port_77_0=rulePortPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_77_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0());
+							}
+							lv_signal_78_0=ruleSignalPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_78_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0());
+							}
+							lv_buffer_79_0=ruleBufferPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_79_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0());
+							}
+							lv_channel_80_0=ruleChannelPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_80_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0());
+							}
+							lv_typedef_81_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_81_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0());
+							}
+							lv_property_82_0=ruleVariablePublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_82_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_83='@protected:'
+				{
+					newLeafNode(otherlv_83, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0());
+							}
+							lv_port_84_0=rulePortProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_84_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0());
+							}
+							lv_signal_85_0=ruleSignalProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_85_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0());
+							}
+							lv_buffer_86_0=ruleBufferProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_86_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0());
+							}
+							lv_channel_87_0=ruleChannelProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_87_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0());
+							}
+							lv_typedef_88_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_88_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0());
+							}
+							lv_property_89_0=ruleVariableProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_89_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_90='@private:'
+				{
+					newLeafNode(otherlv_90, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0());
+							}
+							lv_port_91_0=rulePortPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_91_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0());
+							}
+							lv_signal_92_0=ruleSignalPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_92_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0());
+							}
+							lv_buffer_93_0=ruleBufferPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_93_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0());
+							}
+							lv_channel_94_0=ruleChannelPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_94_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0());
+							}
+							lv_typedef_95_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_95_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0());
+							}
+							lv_property_96_0=ruleVariablePrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_96_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+		)*
+		(
+			(
+				(
+					(
+						otherlv_97='@routine:'
+						{
+							newLeafNode(otherlv_97, grammarAccess.getProcedureAccess().getRoutineKeyword_10_0_0_0_0());
+						}
+						    |
+						otherlv_98='@macro:'
+						{
+							newLeafNode(otherlv_98, grammarAccess.getProcedureAccess().getMacroKeyword_10_0_0_0_1());
+						}
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0());
+							}
+							lv_routine_99_0=ruleRoutine
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"routine",
+									lv_routine_99_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)+
+				)
+				    |
+				(
+					otherlv_100='@procedure:'
+					{
+						newLeafNode(otherlv_100, grammarAccess.getProcedureAccess().getProcedureKeyword_10_0_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0());
+							}
+							lv_procedure_101_0=ruleProcedure
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getProcedureRule());
+								}
+								add(
+									$current,
+									"procedure",
+									lv_procedure_101_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)+
+				)
+			)*
+			    |
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_1_0_0());
+						}
+						lv_routine_102_0=ruleRoutine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getProcedureRule());
+							}
+							add(
+								$current,
+								"routine",
+								lv_routine_102_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_1_1_0());
+						}
+						lv_procedure_103_0=ruleProcedure
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getProcedureRule());
+							}
+							add(
+								$current,
+								"procedure",
+								lv_procedure_103_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)+
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getProcedureAccess().getRegionStatemachineRegionParserRuleCall_11_0_0());
+					}
+					lv_region_104_0=ruleStatemachineRegion
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getProcedureRule());
+						}
+						add(
+							$current,
+							"region",
+							lv_region_104_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)+
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getProcedureAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0());
+					}
+					lv_region_105_0=ruleStatemachineRegionLite
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getProcedureRule());
+						}
+						add(
+							$current,
+							"region",
+							lv_region_105_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getProcedureAccess().getExecutionProcedureExecutionParserRuleCall_12_0());
+				}
+				lv_execution_106_0=ruleProcedureExecution
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getProcedureRule());
+					}
+					set(
+						$current,
+						"execution",
+						lv_execution_106_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ProcedureExecution");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_107='}'
+		{
+			newLeafNode(otherlv_107, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_13());
+		}
+	)
+;
+
+// Entry rule entryRuleProcedureExecution
+entryRuleProcedureExecution returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getProcedureExecutionRule()); }
+	iv_ruleProcedureExecution=ruleProcedureExecution
+	{ $current=$iv_ruleProcedureExecution.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule ProcedureExecution
+ruleProcedureExecution returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getProcedureExecutionAccess().getModelOfExecutionAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='@moe:'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getProcedureExecutionAccess().getMoeKeyword_1());
+			}
+		)?
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0);
+					}
+								({true}?=>(otherlv_3='@schedule'
+								{
+									newLeafNode(otherlv_3, grammarAccess.getProcedureExecutionAccess().getScheduleKeyword_2_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0());
+										}
+										lv_scheduleRoutine_4_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getProcedureExecutionRule());
+											}
+											set(
+												$current,
+												"scheduleRoutine",
+												lv_scheduleRoutine_4_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1);
+					}
+								({true}?=>(otherlv_5='@run'
+								{
+									newLeafNode(otherlv_5, grammarAccess.getProcedureExecutionAccess().getRunKeyword_2_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getProcedureExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_2_1_1_0());
+										}
+										lv_runRoutine_6_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getProcedureExecutionRule());
+											}
+											set(
+												$current,
+												"runRoutine",
+												lv_runRoutine_6_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+				}
+		)
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleBehavior
+entryRuleBehavior returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBehaviorRule()); }
+	iv_ruleBehavior=ruleBehavior
+	{ $current=$iv_ruleBehavior.current; }
+	EOF;
+
+// Rule Behavior
+ruleBehavior returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	{
+		/* */
+	}
+	{
+		newCompositeNode(grammarAccess.getBehaviorAccess().getStatemachineParserRuleCall());
+	}
+	this_Statemachine_0=ruleStatemachine
+	{
+		$current = $this_Statemachine_0.current;
+		afterParserOrEnumRuleCall();
+	}
+;
+
+// Entry rule entryRuleMoeBehavior
+entryRuleMoeBehavior returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getMoeBehaviorRule()); }
+	iv_ruleMoeBehavior=ruleMoeBehavior
+	{ $current=$iv_ruleMoeBehavior.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule MoeBehavior
+ruleMoeBehavior returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getMoeBehaviorAccess().getBehaviorAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='@local:'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getMoeBehaviorAccess().getLocalKeyword_1_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getPortPortPrivateParserRuleCall_1_1_0_0());
+						}
+						lv_port_2_0=rulePortPrivate
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+							}
+							add(
+								$current,
+								"port",
+								lv_port_2_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getSignalSignalPrivateParserRuleCall_1_1_1_0());
+						}
+						lv_signal_3_0=ruleSignalPrivate
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+							}
+							add(
+								$current,
+								"signal",
+								lv_signal_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getBufferBufferPrivateParserRuleCall_1_1_2_0());
+						}
+						lv_buffer_4_0=ruleBufferPrivate
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+							}
+							add(
+								$current,
+								"buffer",
+								lv_buffer_4_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getChannelChannelPrivateParserRuleCall_1_1_3_0());
+						}
+						lv_channel_5_0=ruleChannelPrivate
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+							}
+							add(
+								$current,
+								"channel",
+								lv_channel_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getTypedefTypeDefinitionParserRuleCall_1_1_4_0());
+						}
+						lv_typedef_6_0=ruleTypeDefinition
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+							}
+							add(
+								$current,
+								"typedef",
+								lv_typedef_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getPropertyVariablePrivateParserRuleCall_1_1_5_0());
+						}
+						lv_property_7_0=ruleVariablePrivate
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+							}
+							add(
+								$current,
+								"property",
+								lv_property_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getMoeBehaviorAccess().getExecutionModelOfExecutionParserRuleCall_2_0_0());
+									}
+									lv_execution_9_0=ruleModelOfExecution
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+										}
+										set(
+											$current,
+											"execution",
+											lv_execution_9_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfExecution");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getMoeBehaviorAccess().getInteractionModelOfInteractionParserRuleCall_2_1_0());
+									}
+									lv_interaction_10_0=ruleModelOfInteraction
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+										}
+										set(
+											$current,
+											"interaction",
+											lv_interaction_10_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfInteraction");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+				}
+		)
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleStatemachine
+entryRuleStatemachine returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 
+	grammarAccess.getStatemachineAccess().getUnorderedGroup_12()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getStatemachineRule()); }
+	iv_ruleStatemachine=ruleStatemachine
+	{ $current=$iv_ruleStatemachine.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule Statemachine
+ruleStatemachine returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 
+	grammarAccess.getStatemachineAccess().getUnorderedGroup_12()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getStatemachineAccess().getStatemachineAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getStatemachineAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0());
+									}
+									lv_visibility_2_0=ruleVisibilityKind
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+										}
+										set(
+											$current,
+											"visibility",
+											lv_visibility_2_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1);
+					}
+								({true}?=>((
+									(
+										lv_timed_3_0='timed'
+										{
+											newLeafNode(lv_timed_3_0, grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getStatemachineRule());
+											}
+											setWithLastConsumed($current, "timed", true, "timed");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_input_enabled_4_0='input_enabled'
+										{
+											newLeafNode(lv_input_enabled_4_0, grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getStatemachineRule());
+											}
+											setWithLastConsumed($current, "input_enabled", true, "input_enabled");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getStatemachineAccess().getDesignDesignKindEnumRuleCall_1_2_0());
+									}
+									lv_design_5_0=ruleDesignKind
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+										}
+										set(
+											$current,
+											"design",
+											lv_design_5_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.DesignKind");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+				}
+		)
+		otherlv_6='statemachine'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getStatemachineAccess().getStatemachineKeyword_2());
+		}
+		(
+			otherlv_7='<'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getStatemachineAccess().getLessThanSignKeyword_3_0());
+			}
+			(
+				otherlv_8='moc:'
+				{
+					newLeafNode(otherlv_8, grammarAccess.getStatemachineAccess().getMocKeyword_3_1());
+				}
+			)?
+			(
+				otherlv_9='or'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getStatemachineAccess().getOrKeyword_3_2_0());
+				}
+				    |
+				otherlv_10='and'
+				{
+					newLeafNode(otherlv_10, grammarAccess.getStatemachineAccess().getAndKeyword_3_2_1());
+				}
+			)
+			otherlv_11='>'
+			{
+				newLeafNode(otherlv_11, grammarAccess.getStatemachineAccess().getGreaterThanSignKeyword_3_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStatemachineAccess().getNameESIdentifierParserRuleCall_4_0());
+				}
+				lv_name_12_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_12_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStatemachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
+				}
+				lv_unrestrictedName_13_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_13_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_14='{'
+		{
+			newLeafNode(otherlv_14, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_6());
+		}
+		(
+			(
+				otherlv_15='@parameter:'
+				{
+					newLeafNode(otherlv_15, grammarAccess.getStatemachineAccess().getParameterKeyword_7_0_0());
+				}
+				(
+					(
+						otherlv_16='input'
+						{
+							newLeafNode(otherlv_16, grammarAccess.getStatemachineAccess().getInputKeyword_7_0_1_0_0());
+						}
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0());
+									}
+									lv_parameter_17_0=ruleParameterInput
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+										}
+										add(
+											$current,
+											"parameter",
+											lv_parameter_17_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							(
+								otherlv_18='{'
+								{
+									newLeafNode(otherlv_18, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0());
+										}
+										lv_parameter_19_0=ruleParameterInput
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+											}
+											add(
+												$current,
+												"parameter",
+												lv_parameter_19_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)+
+								otherlv_20='}'
+								{
+									newLeafNode(otherlv_20, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2());
+								}
+							)
+						)
+					)
+					    |
+					(
+						otherlv_21='inout'
+						{
+							newLeafNode(otherlv_21, grammarAccess.getStatemachineAccess().getInoutKeyword_7_0_1_1_0());
+						}
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0());
+									}
+									lv_parameter_22_0=ruleParameterInout
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+										}
+										add(
+											$current,
+											"parameter",
+											lv_parameter_22_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							(
+								otherlv_23='{'
+								{
+									newLeafNode(otherlv_23, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0());
+										}
+										lv_parameter_24_0=ruleParameterInout
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+											}
+											add(
+												$current,
+												"parameter",
+												lv_parameter_24_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)+
+								otherlv_25='}'
+								{
+									newLeafNode(otherlv_25, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2());
+								}
+							)
+						)
+					)
+					    |
+					(
+						otherlv_26='output'
+						{
+							newLeafNode(otherlv_26, grammarAccess.getStatemachineAccess().getOutputKeyword_7_0_1_2_0());
+						}
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0());
+									}
+									lv_parameter_27_0=ruleParameterOutput
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+										}
+										add(
+											$current,
+											"parameter",
+											lv_parameter_27_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							(
+								otherlv_28='{'
+								{
+									newLeafNode(otherlv_28, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0());
+										}
+										lv_parameter_29_0=ruleParameterOutput
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+											}
+											add(
+												$current,
+												"parameter",
+												lv_parameter_29_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)+
+								otherlv_30='}'
+								{
+									newLeafNode(otherlv_30, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2());
+								}
+							)
+						)
+					)
+					    |
+					(
+						otherlv_31='return'
+						{
+							newLeafNode(otherlv_31, grammarAccess.getStatemachineAccess().getReturnKeyword_7_0_1_3_0());
+						}
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0());
+									}
+									lv_parameter_32_0=ruleParameterReturn
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+										}
+										add(
+											$current,
+											"parameter",
+											lv_parameter_32_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							(
+								otherlv_33='{'
+								{
+									newLeafNode(otherlv_33, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0());
+										}
+										lv_parameter_34_0=ruleParameterReturn
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+											}
+											add(
+												$current,
+												"parameter",
+												lv_parameter_34_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)+
+								otherlv_35='}'
+								{
+									newLeafNode(otherlv_35, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2());
+								}
+							)
+						)
+					)
+				)*
+			)
+			    |
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_7_1_0_0());
+						}
+						lv_port_36_0=rulePort
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+							}
+							add(
+								$current,
+								"port",
+								lv_port_36_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Port");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_7_1_1_0());
+						}
+						lv_signal_37_0=ruleSignal
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+							}
+							add(
+								$current,
+								"signal",
+								lv_signal_37_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_7_1_2_0());
+						}
+						lv_buffer_38_0=ruleBuffer
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+							}
+							add(
+								$current,
+								"buffer",
+								lv_buffer_38_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_7_1_3_0());
+						}
+						lv_channel_39_0=ruleChannel
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+							}
+							add(
+								$current,
+								"channel",
+								lv_channel_39_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0());
+						}
+						lv_typedef_40_0=ruleTypeDefinition
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+							}
+							add(
+								$current,
+								"typedef",
+								lv_typedef_40_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_7_1_5_0());
+						}
+						lv_property_41_0=ruleVariable
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+							}
+							add(
+								$current,
+								"property",
+								lv_property_41_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)
+		(
+			(
+				otherlv_42='@input:'
+				{
+					newLeafNode(otherlv_42, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0());
+							}
+							lv_parameter_43_0=ruleParameterInput
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_43_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						otherlv_44='{'
+						{
+							newLeafNode(otherlv_44, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_0_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0());
+								}
+								lv_parameter_45_0=ruleParameterInput
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_45_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)+
+						otherlv_46='}'
+						{
+							newLeafNode(otherlv_46, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_0_1_1_2());
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_47='@inout:'
+				{
+					newLeafNode(otherlv_47, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0());
+							}
+							lv_parameter_48_0=ruleParameterInout
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_48_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						otherlv_49='{'
+						{
+							newLeafNode(otherlv_49, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0());
+								}
+								lv_parameter_50_0=ruleParameterInout
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_50_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)+
+						otherlv_51='}'
+						{
+							newLeafNode(otherlv_51, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_1_1_2());
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_52='@output:'
+				{
+					newLeafNode(otherlv_52, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0());
+							}
+							lv_parameter_53_0=ruleParameterOutput
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_53_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						otherlv_54='{'
+						{
+							newLeafNode(otherlv_54, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_2_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0());
+								}
+								lv_parameter_55_0=ruleParameterOutput
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_55_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)+
+						otherlv_56='}'
+						{
+							newLeafNode(otherlv_56, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_2_1_1_2());
+						}
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_57='@return:'
+				{
+					newLeafNode(otherlv_57, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0());
+							}
+							lv_parameter_58_0=ruleParameterReturn
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"parameter",
+									lv_parameter_58_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						otherlv_59='{'
+						{
+							newLeafNode(otherlv_59, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_3_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0());
+								}
+								lv_parameter_60_0=ruleParameterReturn
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+									}
+									add(
+										$current,
+										"parameter",
+										lv_parameter_60_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)+
+						otherlv_61='}'
+						{
+							newLeafNode(otherlv_61, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_3_1_1_2());
+						}
+					)
+				)*
+			)
+		)*
+		(
+			(
+				otherlv_62='@property:'
+				{
+					newLeafNode(otherlv_62, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_9_0_1_0_0());
+							}
+							lv_port_63_0=rulePort
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_63_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Port");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_9_0_1_1_0());
+							}
+							lv_signal_64_0=ruleSignal
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_64_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_9_0_1_2_0());
+							}
+							lv_buffer_65_0=ruleBuffer
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_65_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_9_0_1_3_0());
+							}
+							lv_channel_66_0=ruleChannel
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_66_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0());
+							}
+							lv_typedef_67_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_67_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_9_0_1_5_0());
+							}
+							lv_property_68_0=ruleVariable
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_68_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_69='@public:'
+				{
+					newLeafNode(otherlv_69, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortPublicParserRuleCall_9_1_1_0_0());
+							}
+							lv_port_70_0=rulePortPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_70_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0());
+							}
+							lv_signal_71_0=ruleSignalPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_71_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0());
+							}
+							lv_buffer_72_0=ruleBufferPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_72_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0());
+							}
+							lv_channel_73_0=ruleChannelPublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_73_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0());
+							}
+							lv_typedef_74_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_74_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0());
+							}
+							lv_property_75_0=ruleVariablePublic
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_75_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_76='@protected:'
+				{
+					newLeafNode(otherlv_76, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0());
+							}
+							lv_port_77_0=rulePortProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_77_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0());
+							}
+							lv_signal_78_0=ruleSignalProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_78_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0());
+							}
+							lv_buffer_79_0=ruleBufferProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_79_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0());
+							}
+							lv_channel_80_0=ruleChannelProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_80_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0());
+							}
+							lv_typedef_81_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_81_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0());
+							}
+							lv_property_82_0=ruleVariableProtected
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_82_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				otherlv_83='@private:'
+				{
+					newLeafNode(otherlv_83, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0());
+							}
+							lv_port_84_0=rulePortPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"port",
+									lv_port_84_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0());
+							}
+							lv_signal_85_0=ruleSignalPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"signal",
+									lv_signal_85_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0());
+							}
+							lv_buffer_86_0=ruleBufferPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"buffer",
+									lv_buffer_86_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0());
+							}
+							lv_channel_87_0=ruleChannelPrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"channel",
+									lv_channel_87_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0());
+							}
+							lv_typedef_88_0=ruleTypeDefinition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"typedef",
+									lv_typedef_88_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0());
+							}
+							lv_property_89_0=ruleVariablePrivate
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"property",
+									lv_property_89_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+		)*
+		(
+			(
+				(
+					(
+						otherlv_90='@routine:'
+						{
+							newLeafNode(otherlv_90, grammarAccess.getStatemachineAccess().getRoutineKeyword_10_0_0_0_0());
+						}
+						    |
+						otherlv_91='@macro:'
+						{
+							newLeafNode(otherlv_91, grammarAccess.getStatemachineAccess().getMacroKeyword_10_0_0_0_1());
+						}
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0());
+							}
+							lv_routine_92_0=ruleRoutine
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"routine",
+									lv_routine_92_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)+
+				)
+				    |
+				(
+					otherlv_93='@procedure:'
+					{
+						newLeafNode(otherlv_93, grammarAccess.getStatemachineAccess().getProcedureKeyword_10_0_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0());
+							}
+							lv_procedure_94_0=ruleProcedure
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+								}
+								add(
+									$current,
+									"procedure",
+									lv_procedure_94_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)+
+				)
+			)*
+			    |
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_1_0_0());
+						}
+						lv_routine_95_0=ruleRoutine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+							}
+							add(
+								$current,
+								"routine",
+								lv_routine_95_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_1_1_0());
+						}
+						lv_procedure_96_0=ruleProcedure
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+							}
+							add(
+								$current,
+								"procedure",
+								lv_procedure_96_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)+
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionParserRuleCall_11_0_0());
+					}
+					lv_region_97_0=ruleStatemachineRegion
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+						}
+						add(
+							$current,
+							"region",
+							lv_region_97_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)+
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0());
+					}
+					lv_region_98_0=ruleStatemachineRegionLite
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+						}
+						add(
+							$current,
+							"region",
+							lv_region_98_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getStatemachineAccess().getExecutionModelOfExecutionParserRuleCall_12_0_0());
+									}
+									lv_execution_100_0=ruleModelOfExecution
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+										}
+										set(
+											$current,
+											"execution",
+											lv_execution_100_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfExecution");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getStatemachineAccess().getInteractionModelOfInteractionParserRuleCall_12_1_0());
+									}
+									lv_interaction_101_0=ruleModelOfInteraction
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getStatemachineRule());
+										}
+										set(
+											$current,
+											"interaction",
+											lv_interaction_101_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfInteraction");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+				}
+		)
+		otherlv_102='}'
+		{
+			newLeafNode(otherlv_102, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_13());
+		}
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleStatemachineRegion
+entryRuleStatemachineRegion returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getStatemachineRegionRule()); }
+	iv_ruleStatemachineRegion=ruleStatemachineRegion
+	{ $current=$iv_ruleStatemachineRegion.current; }
+	EOF;
+
+// Rule StatemachineRegion
+ruleStatemachineRegion returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getStatemachineRegionAccess().getRegionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				otherlv_1='@region:'
+				{
+					newLeafNode(otherlv_1, grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_0_0());
+				}
+				    |
+				otherlv_2='@statemachine:'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_0_1());
+				}
+			)
+			    |
+			(
+				(
+					otherlv_3='@region<'
+					{
+						newLeafNode(otherlv_3, grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_1_0_0());
+					}
+					    |
+					otherlv_4='@statemachine<'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_1_0_1());
+					}
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineRegionAccess().getNameESIdentifierParserRuleCall_1_1_1_0());
+						}
+						lv_name_5_0=ruleESIdentifier
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
+							}
+							set(
+								$current,
+								"name",
+								lv_name_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_1_2_0());
+						}
+						lv_unrestrictedName_6_0=ruleUnrestrictedName
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
+							}
+							set(
+								$current,
+								"unrestrictedName",
+								lv_unrestrictedName_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)?
+				otherlv_7='>:'
+				{
+					newLeafNode(otherlv_7, grammarAccess.getStatemachineRegionAccess().getGreaterThanSignColonKeyword_1_1_3());
+				}
+			)
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getStatemachineRegionAccess().getVertexStateParserRuleCall_2_0_0());
+					}
+					lv_vertex_8_0=ruleState
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
+						}
+						add(
+							$current,
+							"vertex",
+							lv_vertex_8_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.State");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getStatemachineRegionAccess().getVertexPseudostateParserRuleCall_2_1_0());
+					}
+					lv_vertex_9_0=rulePseudostate
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
+						}
+						add(
+							$current,
+							"vertex",
+							lv_vertex_9_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Pseudostate");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)+
+	)
+;
+
+// Entry rule entryRuleStatemachineRegionLite
+entryRuleStatemachineRegionLite returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getStatemachineRegionLiteRule()); }
+	iv_ruleStatemachineRegionLite=ruleStatemachineRegionLite
+	{ $current=$iv_ruleStatemachineRegionLite.current; }
+	EOF;
+
+// Rule StatemachineRegionLite
+ruleStatemachineRegionLite returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStatemachineRegionLiteAccess().getVertexStateParserRuleCall_0_0());
+				}
+				lv_vertex_0_0=ruleState
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStatemachineRegionLiteRule());
+					}
+					add(
+						$current,
+						"vertex",
+						lv_vertex_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.State");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		    |
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStatemachineRegionLiteAccess().getVertexPseudostateParserRuleCall_1_0());
+				}
+				lv_vertex_1_0=rulePseudostate
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStatemachineRegionLiteRule());
+					}
+					add(
+						$current,
+						"vertex",
+						lv_vertex_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Pseudostate");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)+
+;
+
+// Entry rule entryRuleState
+entryRuleState returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getStateRule()); }
+	iv_ruleState=ruleState
+	{ $current=$iv_ruleState.current; }
+	EOF;
+
+// Rule State
+ruleState returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStateAccess().getCompositeStateParserRuleCall_0());
+		}
+		this_CompositeState_0=ruleCompositeState
+		{
+			$current = $this_CompositeState_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStateAccess().getStartStateParserRuleCall_1());
+		}
+		this_StartState_1=ruleStartState
+		{
+			$current = $this_StartState_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStateAccess().getSimpleStateParserRuleCall_2());
+		}
+		this_SimpleState_2=ruleSimpleState
+		{
+			$current = $this_SimpleState_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStateAccess().getFinalStateParserRuleCall_3());
+		}
+		this_FinalState_3=ruleFinalState
+		{
+			$current = $this_FinalState_3.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleCompositeState
+entryRuleCompositeState returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getCompositeStateRule()); }
+	iv_ruleCompositeState=ruleCompositeState
+	{ $current=$iv_ruleCompositeState.current; }
+	EOF;
+
+// Rule CompositeState
+ruleCompositeState returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getCompositeStateAccess().getStateAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_composite_1_0='state'
+				{
+					newLeafNode(lv_composite_1_0, grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getCompositeStateRule());
+					}
+					setWithLastConsumed($current, "composite", true, "state");
+				}
+			)
+		)
+		otherlv_2='<'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getCompositeStateAccess().getLessThanSignKeyword_2());
+		}
+		(
+			otherlv_3='moc:'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getCompositeStateAccess().getMocKeyword_3());
+			}
+		)?
+		(
+			otherlv_4='or'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getCompositeStateAccess().getOrKeyword_4_0());
+			}
+			    |
+			(
+				(
+					lv_orthogonal_5_0='and'
+					{
+						newLeafNode(lv_orthogonal_5_0, grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getCompositeStateRule());
+						}
+						setWithLastConsumed($current, "orthogonal", true, "and");
+					}
+				)
+			)
+		)
+		otherlv_6='>'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getCompositeStateAccess().getGreaterThanSignKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCompositeStateAccess().getNameESIdentifierParserRuleCall_6_0());
+				}
+				lv_name_7_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCompositeStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				otherlv_9='{'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getCompositeStateAccess().getLeftCurlyBracketKeyword_8_0_0());
+				}
+				(
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0());
+								}
+								lv_region_10_0=ruleStatemachineRegion
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+									}
+									add(
+										$current,
+										"region",
+										lv_region_10_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						    |
+						(
+							otherlv_11='@moe:'
+							{
+								newLeafNode(otherlv_11, grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0());
+							}
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0());
+									}
+									lv_moe_12_0=rulemoeCompositeStateRoutines
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+										}
+										add(
+											$current,
+											"moe",
+											lv_moe_12_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.moeCompositeStateRoutines");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)*
+						)
+						    |
+						(
+							otherlv_13='@transition:'
+							{
+								newLeafNode(otherlv_13, grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0());
+							}
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_0_2_1_0());
+									}
+									lv_transition_14_0=ruleTransition
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+										}
+										add(
+											$current,
+											"transition",
+											lv_transition_14_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)*
+						)
+					)+
+					    |
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0());
+								}
+								lv_region_15_0=ruleStatemachineRegionLite
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+									}
+									add(
+										$current,
+										"region",
+										lv_region_15_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_1_1_0_0());
+									}
+									lv_transition_16_0=ruleTransition
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+										}
+										add(
+											$current,
+											"transition",
+											lv_transition_16_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_1_0());
+									}
+									lv_moe_17_0=rulemoeCompositeStateRoutines
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+										}
+										add(
+											$current,
+											"moe",
+											lv_moe_17_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.moeCompositeStateRoutines");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+						)*
+					)
+				)
+				otherlv_18='}'
+				{
+					newLeafNode(otherlv_18, grammarAccess.getCompositeStateAccess().getRightCurlyBracketKeyword_8_0_2());
+				}
+			)
+			    |
+			otherlv_19=';'
+			{
+				newLeafNode(otherlv_19, grammarAccess.getCompositeStateAccess().getSemicolonKeyword_8_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRulemoeCompositeStateRoutines
+entryRulemoeCompositeStateRoutines returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesRule()); }
+	iv_rulemoeCompositeStateRoutines=rulemoeCompositeStateRoutines
+	{ $current=$iv_rulemoeCompositeStateRoutines.current; }
+	EOF;
+
+// Rule moeCompositeStateRoutines
+rulemoeCompositeStateRoutines returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getMoeCompositeStateRoutinesAccess().getRoutineAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					lv_name_1_1='@init'
+					{
+						newLeafNode(lv_name_1_1, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameInitKeyword_1_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_1, null);
+					}
+					    |
+					lv_name_1_2='@final'
+					{
+						newLeafNode(lv_name_1_2, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameFinalKeyword_1_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_2, null);
+					}
+					    |
+					lv_name_1_3='@enable'
+					{
+						newLeafNode(lv_name_1_3, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameEnableKeyword_1_0_2());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_3, null);
+					}
+					    |
+					lv_name_1_4='@disable'
+					{
+						newLeafNode(lv_name_1_4, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameDisableKeyword_1_0_3());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_4, null);
+					}
+					    |
+					lv_name_1_5='@concurrency'
+					{
+						newLeafNode(lv_name_1_5, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameConcurrencyKeyword_1_0_4());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_5, null);
+					}
+					    |
+					lv_name_1_6='@schedule'
+					{
+						newLeafNode(lv_name_1_6, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameScheduleKeyword_1_0_5());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_6, null);
+					}
+					    |
+					lv_name_1_7='@irun'
+					{
+						newLeafNode(lv_name_1_7, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameIrunKeyword_1_0_6());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_7, null);
+					}
+					    |
+					lv_name_1_8='@run'
+					{
+						newLeafNode(lv_name_1_8, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameRunKeyword_1_0_7());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_8, null);
+					}
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+				}
+				lv_bodyBlock_2_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleSimpleState
+entryRuleSimpleState returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSimpleStateRule()); }
+	iv_ruleSimpleState=ruleSimpleState
+	{ $current=$iv_ruleSimpleState.current; }
+	EOF;
+
+// Rule SimpleState
+ruleSimpleState returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getSimpleStateAccess().getStateAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_simple_1_0='state'
+				{
+					newLeafNode(lv_simple_1_0, grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getSimpleStateRule());
+					}
+					setWithLastConsumed($current, "simple", true, "state");
+				}
+			)
+		)
+		(
+			otherlv_2='<'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getSimpleStateAccess().getLessThanSignKeyword_2_0());
+			}
+			(
+				otherlv_3='moc:'
+				{
+					newLeafNode(otherlv_3, grammarAccess.getSimpleStateAccess().getMocKeyword_2_1());
+				}
+			)?
+			otherlv_4='simple'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getSimpleStateAccess().getSimpleKeyword_2_2());
+			}
+			otherlv_5='>'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getSimpleStateAccess().getGreaterThanSignKeyword_2_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSimpleStateAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_6_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSimpleStateRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_6_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSimpleStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_7_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSimpleStateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				otherlv_8='{'
+				{
+					newLeafNode(otherlv_8, grammarAccess.getSimpleStateAccess().getLeftCurlyBracketKeyword_5_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSimpleStateAccess().getTransitionTransitionParserRuleCall_5_0_1_0_0());
+							}
+							lv_transition_9_0=ruleTransition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSimpleStateRule());
+								}
+								add(
+									$current,
+									"transition",
+									lv_transition_9_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getSimpleStateAccess().getMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0());
+							}
+							lv_moe_10_0=rulemoeSimpleStateRoutines
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getSimpleStateRule());
+								}
+								add(
+									$current,
+									"moe",
+									lv_moe_10_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.moeSimpleStateRoutines");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+				otherlv_11='}'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getSimpleStateAccess().getRightCurlyBracketKeyword_5_0_2());
+				}
+			)
+			    |
+			otherlv_12=';'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getSimpleStateAccess().getSemicolonKeyword_5_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRulemoeSimpleStateRoutines
+entryRulemoeSimpleStateRoutines returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getMoeSimpleStateRoutinesRule()); }
+	iv_rulemoeSimpleStateRoutines=rulemoeSimpleStateRoutines
+	{ $current=$iv_rulemoeSimpleStateRoutines.current; }
+	EOF;
+
+// Rule moeSimpleStateRoutines
+rulemoeSimpleStateRoutines returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getMoeSimpleStateRoutinesAccess().getRoutineAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					lv_name_1_1='@enable'
+					{
+						newLeafNode(lv_name_1_1, grammarAccess.getMoeSimpleStateRoutinesAccess().getNameEnableKeyword_1_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeSimpleStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_1, null);
+					}
+					    |
+					lv_name_1_2='@disable'
+					{
+						newLeafNode(lv_name_1_2, grammarAccess.getMoeSimpleStateRoutinesAccess().getNameDisableKeyword_1_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeSimpleStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_2, null);
+					}
+					    |
+					lv_name_1_3='@irun'
+					{
+						newLeafNode(lv_name_1_3, grammarAccess.getMoeSimpleStateRoutinesAccess().getNameIrunKeyword_1_0_2());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeSimpleStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_3, null);
+					}
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+				}
+				lv_bodyBlock_2_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getMoeSimpleStateRoutinesRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleStartState
+entryRuleStartState returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getStartStateRule()); }
+	iv_ruleStartState=ruleStartState
+	{ $current=$iv_ruleStartState.current; }
+	EOF;
+
+// Rule StartState
+ruleStartState returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getStartStateAccess().getStartStateAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					(
+						lv_simple_1_0='state'
+						{
+							newLeafNode(lv_simple_1_0, grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getStartStateRule());
+							}
+							setWithLastConsumed($current, "simple", true, "state");
+						}
+					)
+				)
+				otherlv_2='<'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getStartStateAccess().getLessThanSignKeyword_1_0_1());
+				}
+				(
+					otherlv_3='moc:'
+					{
+						newLeafNode(otherlv_3, grammarAccess.getStartStateAccess().getMocKeyword_1_0_2());
+					}
+				)?
+				otherlv_4='start'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getStartStateAccess().getStartKeyword_1_0_3());
+				}
+				otherlv_5='>'
+				{
+					newLeafNode(otherlv_5, grammarAccess.getStartStateAccess().getGreaterThanSignKeyword_1_0_4());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getStartStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0());
+						}
+						lv_name_6_0=ruleESIdentifier
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getStartStateRule());
+							}
+							set(
+								$current,
+								"name",
+								lv_name_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				(
+					lv_simple_7_0='#start'
+					{
+						newLeafNode(lv_simple_7_0, grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getStartStateRule());
+						}
+						setWithLastConsumed($current, "simple", true, "#start");
+					}
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStartStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStartStateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				otherlv_9='{'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getStartStateAccess().getLeftCurlyBracketKeyword_3_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStartStateAccess().getTransitionTransitionParserRuleCall_3_0_1_0_0());
+							}
+							lv_transition_10_0=ruleTransition
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStartStateRule());
+								}
+								add(
+									$current,
+									"transition",
+									lv_transition_10_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getStartStateAccess().getMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0());
+							}
+							lv_moe_11_0=rulemoeStartStateRoutines
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getStartStateRule());
+								}
+								add(
+									$current,
+									"moe",
+									lv_moe_11_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.moeStartStateRoutines");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+				otherlv_12='}'
+				{
+					newLeafNode(otherlv_12, grammarAccess.getStartStateAccess().getRightCurlyBracketKeyword_3_0_2());
+				}
+			)
+			    |
+			otherlv_13=';'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getStartStateAccess().getSemicolonKeyword_3_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRulemoeStartStateRoutines
+entryRulemoeStartStateRoutines returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getMoeStartStateRoutinesRule()); }
+	iv_rulemoeStartStateRoutines=rulemoeStartStateRoutines
+	{ $current=$iv_rulemoeStartStateRoutines.current; }
+	EOF;
+
+// Rule moeStartStateRoutines
+rulemoeStartStateRoutines returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getMoeStartStateRoutinesAccess().getRoutineAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					lv_name_1_1='@init'
+					{
+						newLeafNode(lv_name_1_1, grammarAccess.getMoeStartStateRoutinesAccess().getNameInitKeyword_1_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeStartStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_1, null);
+					}
+					    |
+					lv_name_1_2='@enable'
+					{
+						newLeafNode(lv_name_1_2, grammarAccess.getMoeStartStateRoutinesAccess().getNameEnableKeyword_1_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeStartStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_2, null);
+					}
+					    |
+					lv_name_1_3='@disable'
+					{
+						newLeafNode(lv_name_1_3, grammarAccess.getMoeStartStateRoutinesAccess().getNameDisableKeyword_1_0_2());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeStartStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_3, null);
+					}
+					    |
+					lv_name_1_4='@irun'
+					{
+						newLeafNode(lv_name_1_4, grammarAccess.getMoeStartStateRoutinesAccess().getNameIrunKeyword_1_0_3());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeStartStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_4, null);
+					}
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+				}
+				lv_bodyBlock_2_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getMoeStartStateRoutinesRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleFinalState
+entryRuleFinalState returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getFinalStateRule()); }
+	iv_ruleFinalState=ruleFinalState
+	{ $current=$iv_ruleFinalState.current; }
+	EOF;
+
+// Rule FinalState
+ruleFinalState returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getFinalStateAccess().getFinalStateAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					(
+						lv_simple_1_0='state'
+						{
+							newLeafNode(lv_simple_1_0, grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getFinalStateRule());
+							}
+							setWithLastConsumed($current, "simple", true, "state");
+						}
+					)
+				)
+				otherlv_2='<'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getFinalStateAccess().getLessThanSignKeyword_1_0_1());
+				}
+				(
+					otherlv_3='moc:'
+					{
+						newLeafNode(otherlv_3, grammarAccess.getFinalStateAccess().getMocKeyword_1_0_2());
+					}
+				)?
+				otherlv_4='final'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getFinalStateAccess().getFinalKeyword_1_0_3());
+				}
+				otherlv_5='>'
+				{
+					newLeafNode(otherlv_5, grammarAccess.getFinalStateAccess().getGreaterThanSignKeyword_1_0_4());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getFinalStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0());
+						}
+						lv_name_6_0=ruleESIdentifier
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getFinalStateRule());
+							}
+							set(
+								$current,
+								"name",
+								lv_name_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				(
+					lv_simple_7_0='#final'
+					{
+						newLeafNode(lv_simple_7_0, grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getFinalStateRule());
+						}
+						setWithLastConsumed($current, "simple", true, "#final");
+					}
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFinalStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFinalStateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				otherlv_9='{'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getFinalStateAccess().getLeftCurlyBracketKeyword_3_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getFinalStateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_0());
+						}
+						lv_moe_10_0=rulemoeFinalStateRoutines
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getFinalStateRule());
+							}
+							add(
+								$current,
+								"moe",
+								lv_moe_10_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.moeFinalStateRoutines");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_11='}'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getFinalStateAccess().getRightCurlyBracketKeyword_3_0_2());
+				}
+			)
+			    |
+			otherlv_12=';'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getFinalStateAccess().getSemicolonKeyword_3_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRulemoeFinalStateRoutines
+entryRulemoeFinalStateRoutines returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getMoeFinalStateRoutinesRule()); }
+	iv_rulemoeFinalStateRoutines=rulemoeFinalStateRoutines
+	{ $current=$iv_rulemoeFinalStateRoutines.current; }
+	EOF;
+
+// Rule moeFinalStateRoutines
+rulemoeFinalStateRoutines returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getMoeFinalStateRoutinesAccess().getRoutineAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					lv_name_1_1='@enable'
+					{
+						newLeafNode(lv_name_1_1, grammarAccess.getMoeFinalStateRoutinesAccess().getNameEnableKeyword_1_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeFinalStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_1, null);
+					}
+					    |
+					lv_name_1_2='@final'
+					{
+						newLeafNode(lv_name_1_2, grammarAccess.getMoeFinalStateRoutinesAccess().getNameFinalKeyword_1_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getMoeFinalStateRoutinesRule());
+						}
+						setWithLastConsumed($current, "name", lv_name_1_2, null);
+					}
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+				}
+				lv_bodyBlock_2_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getMoeFinalStateRoutinesRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRulePseudostate
+entryRulePseudostate returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPseudostateRule()); }
+	iv_rulePseudostate=rulePseudostate
+	{ $current=$iv_rulePseudostate.current; }
+	EOF;
+
+// Rule Pseudostate
+rulePseudostate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPseudostateAccess().getPseudostateInitialParserRuleCall_0());
+		}
+		this_PseudostateInitial_0=rulePseudostateInitial
+		{
+			$current = $this_PseudostateInitial_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPseudostateAccess().getEndingPseudostateParserRuleCall_1());
+		}
+		this_EndingPseudostate_1=ruleEndingPseudostate
+		{
+			$current = $this_EndingPseudostate_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPseudostateAccess().getOtherPseudostateParserRuleCall_2());
+		}
+		this_OtherPseudostate_2=ruleOtherPseudostate
+		{
+			$current = $this_OtherPseudostate_2.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleOtherPseudostate
+entryRuleOtherPseudostate returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getOtherPseudostateRule()); }
+	iv_ruleOtherPseudostate=ruleOtherPseudostate
+	{ $current=$iv_ruleOtherPseudostate.current; }
+	EOF;
+
+// Rule OtherPseudostate
+ruleOtherPseudostate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getOtherPseudostateAccess().getPseudostateAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='state'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getOtherPseudostateAccess().getStateKeyword_1_0());
+			}
+			    |
+			otherlv_2='pseudostate'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getOtherPseudostateAccess().getPseudostateKeyword_1_1());
+			}
+		)
+		otherlv_3='<'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getOtherPseudostateAccess().getLessThanSignKeyword_2());
+		}
+		(
+			otherlv_4='moc:'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getOtherPseudostateAccess().getMocKeyword_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getOtherPseudostateAccess().getKindPseudostateKindEnumRuleCall_4_0());
+				}
+				lv_kind_5_0=rulePseudostateKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
+					}
+					set(
+						$current,
+						"kind",
+						lv_kind_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PseudostateKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_6='>'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getOtherPseudostateAccess().getGreaterThanSignKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getOtherPseudostateAccess().getNameESIdentifierParserRuleCall_6_0());
+				}
+				lv_name_7_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				otherlv_9='{'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getOtherPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getOtherPseudostateAccess().getTransitionTransitionParserRuleCall_8_0_1_0());
+						}
+						lv_transition_10_0=ruleTransition
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
+							}
+							add(
+								$current,
+								"transition",
+								lv_transition_10_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_11='}'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getOtherPseudostateAccess().getRightCurlyBracketKeyword_8_0_2());
+				}
+			)
+			    |
+			otherlv_12=';'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getOtherPseudostateAccess().getSemicolonKeyword_8_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRulePseudostateInitial
+entryRulePseudostateInitial returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPseudostateInitialRule()); }
+	iv_rulePseudostateInitial=rulePseudostateInitial
+	{ $current=$iv_rulePseudostateInitial.current; }
+	EOF;
+
+// Rule PseudostateInitial
+rulePseudostateInitial returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPseudostateInitialAccess().getPseudostateAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					otherlv_1='state'
+					{
+						newLeafNode(otherlv_1, grammarAccess.getPseudostateInitialAccess().getStateKeyword_1_0_0_0());
+					}
+					    |
+					otherlv_2='pseudostate'
+					{
+						newLeafNode(otherlv_2, grammarAccess.getPseudostateInitialAccess().getPseudostateKeyword_1_0_0_1());
+					}
+				)
+				otherlv_3='<'
+				{
+					newLeafNode(otherlv_3, grammarAccess.getPseudostateInitialAccess().getLessThanSignKeyword_1_0_1());
+				}
+				(
+					otherlv_4='moc:'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getPseudostateInitialAccess().getMocKeyword_1_0_2());
+					}
+				)?
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPseudostateInitialAccess().getKindPseudostateInitialKindEnumRuleCall_1_0_3_0());
+						}
+						lv_kind_5_0=rulePseudostateInitialKind
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
+							}
+							set(
+								$current,
+								"kind",
+								lv_kind_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.PseudostateInitialKind");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_6='>'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getPseudostateInitialAccess().getGreaterThanSignKeyword_1_0_4());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPseudostateInitialAccess().getNameESIdentifierParserRuleCall_1_0_5_0_0());
+							}
+							lv_name_7_1=ruleESIdentifier
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
+								}
+								set(
+									$current,
+									"name",
+									lv_name_7_1,
+									"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+								afterParserOrEnumRuleCall();
+							}
+							    |
+							lv_name_7_2='#initial'
+							{
+								newLeafNode(lv_name_7_2, grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_0_5_0_1());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getPseudostateInitialRule());
+								}
+								setWithLastConsumed($current, "name", lv_name_7_2, null);
+							}
+							    |
+							lv_name_7_3='#init'
+							{
+								newLeafNode(lv_name_7_3, grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_0_5_0_2());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getPseudostateInitialRule());
+								}
+								setWithLastConsumed($current, "name", lv_name_7_3, null);
+							}
+						)
+					)
+				)
+			)
+			    |
+			(
+				(
+					(
+						lv_name_8_1='#initial'
+						{
+							newLeafNode(lv_name_8_1, grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_1_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPseudostateInitialRule());
+							}
+							setWithLastConsumed($current, "name", lv_name_8_1, null);
+						}
+						    |
+						lv_name_8_2='#init'
+						{
+							newLeafNode(lv_name_8_2, grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_1_0_1());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPseudostateInitialRule());
+							}
+							setWithLastConsumed($current, "name", lv_name_8_2, null);
+						}
+					)
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_9_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_9_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				otherlv_10='{'
+				{
+					newLeafNode(otherlv_10, grammarAccess.getPseudostateInitialAccess().getLeftCurlyBracketKeyword_3_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPseudostateInitialAccess().getTransitionTransitionParserRuleCall_3_0_1_0());
+						}
+						lv_transition_11_0=ruleTransition
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
+							}
+							add(
+								$current,
+								"transition",
+								lv_transition_11_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_12='}'
+				{
+					newLeafNode(otherlv_12, grammarAccess.getPseudostateInitialAccess().getRightCurlyBracketKeyword_3_0_2());
+				}
+			)
+			    |
+			otherlv_13=';'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getPseudostateInitialAccess().getSemicolonKeyword_3_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleEndingPseudostate
+entryRuleEndingPseudostate returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEndingPseudostateRule()); }
+	iv_ruleEndingPseudostate=ruleEndingPseudostate
+	{ $current=$iv_ruleEndingPseudostate.current; }
+	EOF;
+
+// Rule EndingPseudostate
+ruleEndingPseudostate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEndingPseudostateAccess().getPseudostateAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='state'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getEndingPseudostateAccess().getStateKeyword_1_0());
+			}
+			    |
+			otherlv_2='pseudostate'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getEndingPseudostateAccess().getPseudostateKeyword_1_1());
+			}
+		)
+		otherlv_3='<'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getEndingPseudostateAccess().getLessThanSignKeyword_2());
+		}
+		(
+			otherlv_4='moc:'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getEndingPseudostateAccess().getMocKeyword_3());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEndingPseudostateAccess().getKindEndingPseudostateKindEnumRuleCall_4_0());
+				}
+				lv_kind_5_0=ruleEndingPseudostateKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
+					}
+					set(
+						$current,
+						"kind",
+						lv_kind_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EndingPseudostateKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_6='>'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getEndingPseudostateAccess().getGreaterThanSignKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEndingPseudostateAccess().getNameESIdentifierParserRuleCall_6_0());
+				}
+				lv_name_7_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				otherlv_9='{'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getEndingPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getEndingPseudostateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_0());
+						}
+						lv_moe_10_0=rulemoeFinalStateRoutines
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
+							}
+							add(
+								$current,
+								"moe",
+								lv_moe_10_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.moeFinalStateRoutines");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_11='}'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getEndingPseudostateAccess().getRightCurlyBracketKeyword_8_0_2());
+				}
+			)
+			    |
+			otherlv_12=';'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getEndingPseudostateAccess().getSemicolonKeyword_8_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleModelOfExecution
+entryRuleModelOfExecution returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getModelOfExecutionRule()); }
+	iv_ruleModelOfExecution=ruleModelOfExecution
+	{ $current=$iv_ruleModelOfExecution.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule ModelOfExecution
+ruleModelOfExecution returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getModelOfExecutionAccess().getModelOfExecutionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='@moe:'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getModelOfExecutionAccess().getMoeKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_2_0());
+				}
+				lv_routine_2_0=ruleRoutine
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+					}
+					add(
+						$current,
+						"routine",
+						lv_routine_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0);
+					}
+								({true}?=>(otherlv_4='@init'
+								{
+									newLeafNode(otherlv_4, grammarAccess.getModelOfExecutionAccess().getInitKeyword_3_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getInitRoutineMoeRoutineParserRuleCall_3_0_1_0());
+										}
+										lv_initRoutine_5_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+											}
+											set(
+												$current,
+												"initRoutine",
+												lv_initRoutine_5_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1);
+					}
+								({true}?=>(otherlv_6='@final'
+								{
+									newLeafNode(otherlv_6, grammarAccess.getModelOfExecutionAccess().getFinalKeyword_3_1_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getFinalRoutineMoeRoutineParserRuleCall_3_1_1_0());
+										}
+										lv_finalRoutine_7_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+											}
+											set(
+												$current,
+												"finalRoutine",
+												lv_finalRoutine_7_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2);
+					}
+								({true}?=>(otherlv_8='@enable'
+								{
+									newLeafNode(otherlv_8, grammarAccess.getModelOfExecutionAccess().getEnableKeyword_3_2_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getEnableRoutineMoeRoutineParserRuleCall_3_2_1_0());
+										}
+										lv_enableRoutine_9_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+											}
+											set(
+												$current,
+												"enableRoutine",
+												lv_enableRoutine_9_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3);
+					}
+								({true}?=>(otherlv_10='@disable'
+								{
+									newLeafNode(otherlv_10, grammarAccess.getModelOfExecutionAccess().getDisableKeyword_3_3_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getDisableRoutineMoeRoutineParserRuleCall_3_3_1_0());
+										}
+										lv_disableRoutine_11_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+											}
+											set(
+												$current,
+												"disableRoutine",
+												lv_disableRoutine_11_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4);
+					}
+								({true}?=>(otherlv_12='@concurrency'
+								{
+									newLeafNode(otherlv_12, grammarAccess.getModelOfExecutionAccess().getConcurrencyKeyword_3_4_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0());
+										}
+										lv_concurrencyRoutine_13_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+											}
+											set(
+												$current,
+												"concurrencyRoutine",
+												lv_concurrencyRoutine_13_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5);
+					}
+								({true}?=>(otherlv_14='@schedule'
+								{
+									newLeafNode(otherlv_14, grammarAccess.getModelOfExecutionAccess().getScheduleKeyword_3_5_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0());
+										}
+										lv_scheduleRoutine_15_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+											}
+											set(
+												$current,
+												"scheduleRoutine",
+												lv_scheduleRoutine_15_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6);
+					}
+								({true}?=>(otherlv_16='@irun'
+								{
+									newLeafNode(otherlv_16, grammarAccess.getModelOfExecutionAccess().getIrunKeyword_3_6_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getIrunRoutineMoeRoutineParserRuleCall_3_6_1_0());
+										}
+										lv_irunRoutine_17_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+											}
+											set(
+												$current,
+												"irunRoutine",
+												lv_irunRoutine_17_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7);
+					}
+								({true}?=>(otherlv_18='@run'
+								{
+									newLeafNode(otherlv_18, grammarAccess.getModelOfExecutionAccess().getRunKeyword_3_7_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_3_7_1_0());
+										}
+										lv_runRoutine_19_0=rulemoeRoutine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+											}
+											set(
+												$current,
+												"runRoutine",
+												lv_runRoutine_19_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+				}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_4_0());
+				}
+				lv_routine_20_0=ruleRoutine
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+					}
+					add(
+						$current,
+						"routine",
+						lv_routine_20_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRulemoeRoutine
+entryRulemoeRoutine returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getMoeRoutineRule()); }
+	iv_rulemoeRoutine=rulemoeRoutine
+	{ $current=$iv_rulemoeRoutine.current; }
+	EOF;
+
+// Rule moeRoutine
+rulemoeRoutine returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getMoeRoutineAccess().getRoutineAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='('
+			{
+				newLeafNode(otherlv_1, grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getMoeRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_1_1_0());
+					}
+					lv_domain_2_0=ruleFunctionalParameterSet
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
+						}
+						set(
+							$current,
+							"domain",
+							lv_domain_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_3=')'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_1_2());
+			}
+		)?
+		(
+			otherlv_4='->'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getMoeRoutineAccess().getHyphenMinusGreaterThanSignKeyword_2_0());
+			}
+			(
+				(
+					otherlv_5='('
+					{
+						newLeafNode(otherlv_5, grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_2_1_0_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_0_1_0());
+							}
+							lv_codomain_6_0=ruleFunctionalParameterSet
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
+								}
+								set(
+									$current,
+									"codomain",
+									lv_codomain_6_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_7=')'
+					{
+						newLeafNode(otherlv_7, grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_2_1_0_2());
+					}
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_1_0());
+						}
+						lv_codomain_8_0=ruleFunctionalParameterSet
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
+							}
+							set(
+								$current,
+								"codomain",
+								lv_codomain_8_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getMoeRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0());
+				}
+				lv_bodyBlock_9_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_9_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleRoutine
+entryRuleRoutine returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getRoutineRule()); }
+	iv_ruleRoutine=ruleRoutine
+	{ $current=$iv_ruleRoutine.current; }
+	EOF;
+
+// Rule Routine
+ruleRoutine returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getRoutineAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getRoutineRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_1='macro'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getRoutineAccess().getMacroKeyword_1());
+			}
+		)?
+		otherlv_2='routine'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getRoutineAccess().getRoutineKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getRoutineAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getRoutineRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getRoutineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getRoutineRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_5='('
+			{
+				newLeafNode(otherlv_5, grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_5_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_5_1_0());
+					}
+					lv_domain_6_0=ruleFunctionalParameterSet
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getRoutineRule());
+						}
+						set(
+							$current,
+							"domain",
+							lv_domain_6_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_7=')'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getRoutineAccess().getRightParenthesisKeyword_5_2());
+			}
+		)?
+		(
+			otherlv_8='-->'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getRoutineAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0());
+			}
+			(
+				(
+					otherlv_9='('
+					{
+						newLeafNode(otherlv_9, grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_6_1_0_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_6_1_0_1_0());
+							}
+							lv_codomain_10_0=ruleFunctionalParameterSet
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getRoutineRule());
+								}
+								set(
+									$current,
+									"codomain",
+									lv_codomain_10_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_11=')'
+					{
+						newLeafNode(otherlv_11, grammarAccess.getRoutineAccess().getRightParenthesisKeyword_6_1_0_2());
+					}
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getRoutineAccess().getCodomainFormalParameterSetParserRuleCall_6_1_1_0());
+						}
+						lv_codomain_12_0=ruleFormalParameterSet
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getRoutineRule());
+							}
+							set(
+								$current,
+								"codomain",
+								lv_codomain_12_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getRoutineAccess().getBodyBlockBlockStatementParserRuleCall_7_0());
+				}
+				lv_bodyBlock_13_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getRoutineRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_13_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleModelOfInteraction
+entryRuleModelOfInteraction returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getModelOfInteractionRule()); }
+	iv_ruleModelOfInteraction=ruleModelOfInteraction
+	{ $current=$iv_ruleModelOfInteraction.current; }
+	EOF;
+
+// Rule ModelOfInteraction
+ruleModelOfInteraction returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getModelOfInteractionAccess().getModelOfInteractionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='@com:'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getModelOfInteractionAccess().getComKeyword_1());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getModelOfInteractionAccess().getRoutesRouteParserRuleCall_2_0_0());
+					}
+					lv_routes_2_0=ruleRoute
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getModelOfInteractionRule());
+						}
+						add(
+							$current,
+							"routes",
+							lv_routes_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Route");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getModelOfInteractionAccess().getConnectionsConnectionParserRuleCall_2_1_0());
+					}
+					lv_connections_3_0=ruleConnection
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getModelOfInteractionRule());
+						}
+						add(
+							$current,
+							"connections",
+							lv_connections_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Connection");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleRoute
+entryRuleRoute returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getRouteRule()); }
+	iv_ruleRoute=ruleRoute
+	{ $current=$iv_ruleRoute.current; }
+	EOF;
+
+// Rule Route
+ruleRoute returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getRouteAccess().getRouteAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='route'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getRouteAccess().getRouteKeyword_1());
+		}
+		otherlv_2='<'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getRouteAccess().getLessThanSignKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getRouteAccess().getProtocolComRouteProtocolParserRuleCall_3_0());
+				}
+				lv_protocol_3_0=ruleComRouteProtocol
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getRouteRule());
+					}
+					set(
+						$current,
+						"protocol",
+						lv_protocol_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ComRouteProtocol");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4='>'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getRouteAccess().getGreaterThanSignKeyword_4());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getRouteAccess().getNameESIdentifierParserRuleCall_5_0_0());
+					}
+					lv_name_5_0=ruleESIdentifier
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getRouteRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getRouteAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0());
+					}
+					lv_unrestrictedName_6_0=ruleUnrestrictedName
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getRouteRule());
+						}
+						set(
+							$current,
+							"unrestrictedName",
+							lv_unrestrictedName_6_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+		)?
+		otherlv_7='['
+		{
+			newLeafNode(otherlv_7, grammarAccess.getRouteAccess().getLeftSquareBracketKeyword_6());
+		}
+		(
+			otherlv_8='*'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getRouteAccess().getAsteriskKeyword_7_0());
+			}
+			    |
+			(
+				(
+					(
+						{
+							/* */
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getRouteRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_0_0());
+						}
+						ruleESUfid
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_10=','
+					{
+						newLeafNode(otherlv_10, grammarAccess.getRouteAccess().getCommaKeyword_7_1_1_0());
+					}
+					(
+						(
+							{
+								/* */
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getRouteRule());
+								}
+							}
+							{
+								newCompositeNode(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_1_1_0());
+							}
+							ruleESUfid
+							{
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+		)
+		otherlv_12=']'
+		{
+			newLeafNode(otherlv_12, grammarAccess.getRouteAccess().getRightSquareBracketKeyword_8());
+		}
+		otherlv_13=';'
+		{
+			newLeafNode(otherlv_13, grammarAccess.getRouteAccess().getSemicolonKeyword_9());
+		}
+	)
+;
+
+// Entry rule entryRuleComRouteProtocol
+entryRuleComRouteProtocol returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getComRouteProtocolRule()); }
+	iv_ruleComRouteProtocol=ruleComRouteProtocol
+	{ $current=$iv_ruleComRouteProtocol.current; }
+	EOF;
+
+// Rule ComRouteProtocol
+ruleComRouteProtocol returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getComRouteProtocolAccess().getProtocolComProtocolKindEnumRuleCall_0_0());
+				}
+				lv_protocol_0_0=ruleComProtocolKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+					}
+					set(
+						$current,
+						"protocol",
+						lv_protocol_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ComProtocolKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		    |
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getComRouteProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_1_0_0());
+					}
+					lv_protocol_1_0=ruleBufferProtocolKind
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+						}
+						set(
+							$current,
+							"protocol",
+							lv_protocol_1_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					otherlv_2=':'
+					{
+						newLeafNode(otherlv_2, grammarAccess.getComRouteProtocolAccess().getColonKeyword_1_1_0_0());
+					}
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0());
+								}
+								lv_inner_buffer_3_0=ruleBufferContainerType
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+									}
+									set(
+										$current,
+										"inner_buffer",
+										lv_inner_buffer_3_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						    |
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getComRouteProtocolRule());
+									}
+								}
+								{
+									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_0_1_1_0());
+								}
+								ruleESUfid
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+				)
+				    |
+				(
+					otherlv_5='<'
+					{
+						newLeafNode(otherlv_5, grammarAccess.getComRouteProtocolAccess().getLessThanSignKeyword_1_1_1_0());
+					}
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0());
+								}
+								lv_inner_buffer_6_0=ruleBufferContainerType
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+									}
+									set(
+										$current,
+										"inner_buffer",
+										lv_inner_buffer_6_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						    |
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getComRouteProtocolRule());
+									}
+								}
+								{
+									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_1_1_1_0());
+								}
+								ruleESUfid
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+					otherlv_8='>'
+					{
+						newLeafNode(otherlv_8, grammarAccess.getComRouteProtocolAccess().getGreaterThanSignKeyword_1_1_1_2());
+					}
+				)
+			)?
+		)
+		    |
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_0());
+				}
+				lv_inner_buffer_9_0=ruleBufferContainerType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+					}
+					set(
+						$current,
+						"inner_buffer",
+						lv_inner_buffer_9_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getComRouteProtocolRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_3_0());
+				}
+				ruleESUfid
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleConnection
+entryRuleConnection returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getConnectionRule()); }
+	iv_ruleConnection=ruleConnection
+	{ $current=$iv_ruleConnection.current; }
+	EOF;
+
+// Rule Connection
+ruleConnection returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='connect'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getConnectionAccess().getConnectKeyword_0());
+		}
+		otherlv_1='<'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getConnectionAccess().getLessThanSignKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getConnectionAccess().getProtocolComProtocolParserRuleCall_2_0());
+				}
+				lv_protocol_2_0=ruleComProtocol
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getConnectionRule());
+					}
+					set(
+						$current,
+						"protocol",
+						lv_protocol_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ComProtocol");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3='>'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getConnectionAccess().getGreaterThanSignKeyword_3());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getConnectionAccess().getNameESIdentifierParserRuleCall_4_0_0());
+					}
+					lv_name_4_0=ruleESIdentifier
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getConnectionRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_4_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getConnectionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0());
+					}
+					lv_unrestrictedName_5_0=ruleUnrestrictedName
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getConnectionRule());
+						}
+						set(
+							$current,
+							"unrestrictedName",
+							lv_unrestrictedName_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+		)?
+		otherlv_6='{'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getConnectionAccess().getLeftCurlyBracketKeyword_5());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getConnectionAccess().getComPointsComPointParserRuleCall_6_0());
+				}
+				lv_comPoints_7_0=ruleComPoint
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getConnectionRule());
+					}
+					add(
+						$current,
+						"comPoints",
+						lv_comPoints_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ComPoint");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_8='}'
+		{
+			newLeafNode(otherlv_8, grammarAccess.getConnectionAccess().getRightCurlyBracketKeyword_7());
+		}
+	)
+;
+
+// Entry rule entryRuleComProtocol
+entryRuleComProtocol returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getComProtocolRule()); }
+	iv_ruleComProtocol=ruleComProtocol
+	{ $current=$iv_ruleComProtocol.current; }
+	EOF;
+
+// Rule ComProtocol
+ruleComProtocol returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getComProtocolAccess().getProtocolComEnvRdvProtocolKindEnumRuleCall_0_0());
+				}
+				lv_protocol_0_0=ruleComEnvRdvProtocolKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getComProtocolRule());
+					}
+					set(
+						$current,
+						"protocol",
+						lv_protocol_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ComEnvRdvProtocolKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		    |
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getComProtocolAccess().getProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0());
+					}
+					lv_protocol_1_0=ruleComMultiRdvProtocolKind
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getComProtocolRule());
+						}
+						set(
+							$current,
+							"protocol",
+							lv_protocol_1_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ComMultiRdvProtocolKind");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_2='<'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getComProtocolAccess().getLessThanSignKeyword_1_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_1_1_1_0());
+						}
+						lv_cast_3_0=ruleComCastKing
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getComProtocolRule());
+							}
+							set(
+								$current,
+								"cast",
+								lv_cast_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ComCastKing");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_4='>'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_1_1_2());
+				}
+			)?
+		)
+		    |
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getComProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_2_0_0());
+					}
+					lv_protocol_5_0=ruleBufferProtocolKind
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getComProtocolRule());
+						}
+						set(
+							$current,
+							"protocol",
+							lv_protocol_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					otherlv_6=':'
+					{
+						newLeafNode(otherlv_6, grammarAccess.getComProtocolAccess().getColonKeyword_2_1_0_0());
+					}
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0());
+								}
+								lv_inner_buffer_7_0=ruleBufferContainerType
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getComProtocolRule());
+									}
+									set(
+										$current,
+										"inner_buffer",
+										lv_inner_buffer_7_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						    |
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getComProtocolRule());
+									}
+								}
+								{
+									newCompositeNode(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_0_1_1_0());
+								}
+								ruleESUfid
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+				)
+				    |
+				(
+					otherlv_9='<'
+					{
+						newLeafNode(otherlv_9, grammarAccess.getComProtocolAccess().getLessThanSignKeyword_2_1_1_0());
+					}
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0());
+								}
+								lv_inner_buffer_10_0=ruleBufferContainerType
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getComProtocolRule());
+									}
+									set(
+										$current,
+										"inner_buffer",
+										lv_inner_buffer_10_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						    |
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getComProtocolRule());
+									}
+								}
+								{
+									newCompositeNode(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_1_1_1_0());
+								}
+								ruleESUfid
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+					otherlv_12='>'
+					{
+						newLeafNode(otherlv_12, grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_2_1_1_2());
+					}
+				)
+			)?
+		)
+		    |
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_3_0());
+				}
+				lv_inner_buffer_13_0=ruleBufferContainerType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getComProtocolRule());
+					}
+					set(
+						$current,
+						"inner_buffer",
+						lv_inner_buffer_13_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getComProtocolRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_4_0());
+				}
+				ruleESUfid
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		    |
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_5_0());
+				}
+				lv_cast_15_0=ruleComCastKing
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getComProtocolRule());
+					}
+					set(
+						$current,
+						"cast",
+						lv_cast_15_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ComCastKing");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleComPoint
+entryRuleComPoint returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getComPointRule()); }
+	iv_ruleComPoint=ruleComPoint
+	{ $current=$iv_ruleComPoint.current; }
+	EOF;
+
+// Rule ComPoint
+ruleComPoint returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getComPointAccess().getComPointAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getComPointAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+				}
+				lv_direction_1_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getComPointRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_2='<'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getComPointAccess().getLessThanSignKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getComPointAccess().getProtocolComPointProtocolParserRuleCall_2_1_0());
+					}
+					lv_protocol_3_0=ruleComPointProtocol
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getComPointRule());
+						}
+						set(
+							$current,
+							"protocol",
+							lv_protocol_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ComPointProtocol");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_4='>'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getComPointAccess().getGreaterThanSignKeyword_2_2());
+			}
+		)?
+		(
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getComPointAccess().getPointComElementParserRuleCall_3_0_0_0());
+						}
+						lv_point_5_0=ruleComElement
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getComPointRule());
+							}
+							set(
+								$current,
+								"point",
+								lv_point_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ComElement");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_6=';'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getComPointAccess().getSemicolonKeyword_3_0_1());
+				}
+			)
+			    |
+			(
+				otherlv_7='{'
+				{
+					newLeafNode(otherlv_7, grammarAccess.getComPointAccess().getLeftCurlyBracketKeyword_3_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getComPointAccess().getPointsComElementParserRuleCall_3_1_1_0());
+						}
+						lv_points_8_0=ruleComElement
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getComPointRule());
+							}
+							add(
+								$current,
+								"points",
+								lv_points_8_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ComElement");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_9='}'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getComPointAccess().getRightCurlyBracketKeyword_3_1_2());
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleComPointProtocol
+entryRuleComPointProtocol returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getComPointProtocolRule()); }
+	iv_ruleComPointProtocol=ruleComPointProtocol
+	{ $current=$iv_ruleComPointProtocol.current; }
+	EOF;
+
+// Rule ComPointProtocol
+ruleComPointProtocol returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getComPointProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_0_0_0());
+					}
+					lv_protocol_0_0=ruleBufferProtocolKind
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
+						}
+						set(
+							$current,
+							"protocol",
+							lv_protocol_0_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					otherlv_1=':'
+					{
+						newLeafNode(otherlv_1, grammarAccess.getComPointProtocolAccess().getColonKeyword_0_1_0_0());
+					}
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0());
+								}
+								lv_inner_buffer_2_0=ruleBufferContainerType
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
+									}
+									set(
+										$current,
+										"inner_buffer",
+										lv_inner_buffer_2_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						    |
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getComPointProtocolRule());
+									}
+								}
+								{
+									newCompositeNode(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_0_1_1_0());
+								}
+								ruleESUfid
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+				)
+				    |
+				(
+					otherlv_4='<'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getComPointProtocolAccess().getLessThanSignKeyword_0_1_1_0());
+					}
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0());
+								}
+								lv_inner_buffer_5_0=ruleBufferContainerType
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
+									}
+									set(
+										$current,
+										"inner_buffer",
+										lv_inner_buffer_5_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						    |
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getComPointProtocolRule());
+									}
+								}
+								{
+									newCompositeNode(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_1_1_1_0());
+								}
+								ruleESUfid
+								{
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+					otherlv_7='>'
+					{
+						newLeafNode(otherlv_7, grammarAccess.getComPointProtocolAccess().getGreaterThanSignKeyword_0_1_1_2());
+					}
+				)
+			)?
+		)
+		    |
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_0());
+				}
+				lv_inner_buffer_8_0=ruleBufferContainerType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
+					}
+					set(
+						$current,
+						"inner_buffer",
+						lv_inner_buffer_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getComPointProtocolRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_2_0());
+				}
+				ruleESUfid
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleComElement
+entryRuleComElement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getComElementRule()); }
+	iv_ruleComElement=ruleComElement
+	{ $current=$iv_ruleComElement.current; }
+	EOF;
+
+// Rule ComElement
+ruleComElement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				newCompositeNode(grammarAccess.getComElementAccess().getLiteralPureReferenceElementParserRuleCall_0_0());
+			}
+			this_LiteralPureReferenceElement_0=ruleLiteralPureReferenceElement
+			{
+				$current = $this_LiteralPureReferenceElement_0.current;
+				afterParserOrEnumRuleCall();
+			}
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndSet(
+							grammarAccess.getComElementAccess().getValueElementSpecificationTargetAction_0_1_0(),
+							$current);
+					}
+				)
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_0_1_1_0_0());
+							}
+							lv_kind_2_1=ruleValueDotFieldExpressionKind
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getComElementRule());
+								}
+								set(
+									$current,
+									"kind",
+									lv_kind_2_1,
+									"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
+								afterParserOrEnumRuleCall();
+							}
+							    |
+							{
+								newCompositeNode(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_0_1_1_0_1());
+							}
+							lv_kind_2_2=ruleValueArrowFieldExpressionKind
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getComElementRule());
+								}
+								set(
+									$current,
+									"kind",
+									lv_kind_2_2,
+									"org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+				(
+					(
+						{
+							/* */
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getComElementRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_0_1_2_0());
+						}
+						ruleESIdentifier
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)?
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getComElementAccess().getValueElementSpecificationAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getComElementAccess().getTargetLiteralReferenceMachineContextParserRuleCall_1_1_0());
+					}
+					lv_target_5_0=ruleLiteralReferenceMachineContext
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getComElementRule());
+						}
+						set(
+							$current,
+							"target",
+							lv_target_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceMachineContext");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_2_0_0());
+						}
+						lv_kind_6_1=ruleValueDotFieldExpressionKind
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getComElementRule());
+							}
+							set(
+								$current,
+								"kind",
+								lv_kind_6_1,
+								"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
+							afterParserOrEnumRuleCall();
+						}
+						    |
+						{
+							newCompositeNode(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_1_2_0_1());
+						}
+						lv_kind_6_2=ruleValueArrowFieldExpressionKind
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getComElementRule());
+							}
+							set(
+								$current,
+								"kind",
+								lv_kind_6_2,
+								"org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getComElementRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_1_3_0());
+					}
+					ruleESIdentifier
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleTypeDefinition
+entryRuleTypeDefinition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTypeDefinitionRule()); }
+	iv_ruleTypeDefinition=ruleTypeDefinition
+	{ $current=$iv_ruleTypeDefinition.current; }
+	EOF;
+
+// Rule TypeDefinition
+ruleTypeDefinition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getEnumerationTypeDefinitionParserRuleCall_0());
+		}
+		this_EnumerationTypeDefinition_0=ruleEnumerationTypeDefinition
+		{
+			$current = $this_EnumerationTypeDefinition_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getStructureTypeDefinitionParserRuleCall_1());
+		}
+		this_StructureTypeDefinition_1=ruleStructureTypeDefinition
+		{
+			$current = $this_StructureTypeDefinition_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getUnionTypeDefinitionParserRuleCall_2());
+		}
+		this_UnionTypeDefinition_2=ruleUnionTypeDefinition
+		{
+			$current = $this_UnionTypeDefinition_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getChoiceTypeDefinitionParserRuleCall_3());
+		}
+		this_ChoiceTypeDefinition_3=ruleChoiceTypeDefinition
+		{
+			$current = $this_ChoiceTypeDefinition_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getIntervalTypeDefinitionParserRuleCall_4());
+		}
+		this_IntervalTypeDefinition_4=ruleIntervalTypeDefinition
+		{
+			$current = $this_IntervalTypeDefinition_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getCollectionTypeDefinitionParserRuleCall_5());
+		}
+		this_CollectionTypeDefinition_5=ruleCollectionTypeDefinition
+		{
+			$current = $this_CollectionTypeDefinition_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getOtherDataTypeDefinitionParserRuleCall_6());
+		}
+		this_OtherDataTypeDefinition_6=ruleOtherDataTypeDefinition
+		{
+			$current = $this_OtherDataTypeDefinition_6.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleDataTypeMultiplicity
+entryRuleDataTypeMultiplicity returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataTypeMultiplicityRule()); }
+	iv_ruleDataTypeMultiplicity=ruleDataTypeMultiplicity
+	{ $current=$iv_ruleDataTypeMultiplicity.current; }
+	EOF;
+
+// Rule DataTypeMultiplicity
+ruleDataTypeMultiplicity returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getDataTypeMultiplicityAccess().getLiteralIntegerExpressionParserRuleCall_0());
+		}
+		this_LiteralIntegerExpression_0=ruleLiteralIntegerExpression
+		{
+			$current = $this_LiteralIntegerExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getDataTypeMultiplicityAccess().getLiteralReferenceElementParserRuleCall_1());
+		}
+		this_LiteralReferenceElement_1=ruleLiteralReferenceElement
+		{
+			$current = $this_LiteralReferenceElement_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleDataTypeReference
+entryRuleDataTypeReference returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataTypeReferenceRule()); }
+	iv_ruleDataTypeReference=ruleDataTypeReference
+	{ $current=$iv_ruleDataTypeReference.current; }
+	EOF;
+
+// Rule DataTypeReference
+ruleDataTypeReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getSimpleDataTypeParserRuleCall_0_0());
+			}
+			this_SimpleDataType_0=ruleSimpleDataType
+			{
+				$current = $this_SimpleDataType_0.current;
+				afterParserOrEnumRuleCall();
+			}
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndSet(
+							grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0(),
+							$current);
+					}
+				)
+				otherlv_2='['
+				{
+					newLeafNode(otherlv_2, grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_0_1_1());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0());
+						}
+						lv_multiplicity_3_0=ruleDataTypeMultiplicity
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDataTypeReferenceRule());
+							}
+							set(
+								$current,
+								"multiplicity",
+								lv_multiplicity_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_4=']'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_0_1_3());
+				}
+			)?
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getDataTypeReferenceRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeCrossReference_1_1_0());
+					}
+					ruleESUfid
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_7='['
+				{
+					newLeafNode(otherlv_7, grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_1_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0());
+						}
+						lv_multiplicity_8_0=ruleDataTypeMultiplicity
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDataTypeReferenceRule());
+							}
+							set(
+								$current,
+								"multiplicity",
+								lv_multiplicity_8_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_9=']'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_1_2_2());
+				}
+			)?
+		)
+	)
+;
+
+// Entry rule entryRuleOtherDataTypeDefinition
+entryRuleOtherDataTypeDefinition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getOtherDataTypeDefinitionRule()); }
+	iv_ruleOtherDataTypeDefinition=ruleOtherDataTypeDefinition
+	{ $current=$iv_ruleOtherDataTypeDefinition.current; }
+	EOF;
+
+// Rule OtherDataTypeDefinition
+ruleOtherDataTypeDefinition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getOtherDataTypeDefinitionAccess().getDataTypeReferenceAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_2='type'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getOtherDataTypeDefinitionAccess().getTypeKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportPrimitiveTypeParserRuleCall_5_0_0_0());
+						}
+						lv_support_5_0=rulePrimitiveType
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+							}
+							set(
+								$current,
+								"support",
+								lv_support_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveType");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_6='['
+					{
+						newLeafNode(otherlv_6, grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_0_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0());
+							}
+							lv_multiplicity_7_0=ruleDataTypeMultiplicity
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+								}
+								set(
+									$current,
+									"multiplicity",
+									lv_multiplicity_7_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_8=']'
+					{
+						newLeafNode(otherlv_8, grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_0_1_2());
+					}
+				)?
+			)
+			    |
+			(
+				(
+					(
+						{
+							/* */
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getOtherDataTypeDefinitionRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeCrossReference_5_1_0_0());
+						}
+						ruleESUfid
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_10='['
+					{
+						newLeafNode(otherlv_10, grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_1_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0());
+							}
+							lv_multiplicity_11_0=ruleDataTypeMultiplicity
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+								}
+								set(
+									$current,
+									"multiplicity",
+									lv_multiplicity_11_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_12=']'
+					{
+						newLeafNode(otherlv_12, grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_1_1_2());
+					}
+				)?
+			)
+		)
+		(
+			(
+				lv_typedef_13_0=';'
+				{
+					newLeafNode(lv_typedef_13_0, grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getOtherDataTypeDefinitionRule());
+					}
+					setWithLastConsumed($current, "typedef", true, ";");
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleOtherDataTypeDefinitionImpl
+entryRuleOtherDataTypeDefinitionImpl returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplRule()); }
+	iv_ruleOtherDataTypeDefinitionImpl=ruleOtherDataTypeDefinitionImpl
+	{ $current=$iv_ruleOtherDataTypeDefinitionImpl.current; }
+	EOF;
+
+// Rule OtherDataTypeDefinitionImpl
+ruleOtherDataTypeDefinitionImpl returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getOtherDataTypeDefinitionImplAccess().getDataTypeReferenceAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportPrimitiveTypeParserRuleCall_3_0_0_0());
+						}
+						lv_support_3_0=rulePrimitiveType
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+							}
+							set(
+								$current,
+								"support",
+								lv_support_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveType");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_4='['
+					{
+						newLeafNode(otherlv_4, grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_0_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_0_1_1_0());
+							}
+							lv_multiplicity_5_0=ruleDataTypeMultiplicity
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+								}
+								set(
+									$current,
+									"multiplicity",
+									lv_multiplicity_5_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_6=']'
+					{
+						newLeafNode(otherlv_6, grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_0_1_2());
+					}
+				)?
+			)
+			    |
+			(
+				(
+					(
+						{
+							/* */
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getOtherDataTypeDefinitionImplRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeCrossReference_3_1_0_0());
+						}
+						ruleESUfid
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_8='['
+					{
+						newLeafNode(otherlv_8, grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_1_1_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_1_1_1_0());
+							}
+							lv_multiplicity_9_0=ruleDataTypeMultiplicity
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+								}
+								set(
+									$current,
+									"multiplicity",
+									lv_multiplicity_9_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_10=']'
+					{
+						newLeafNode(otherlv_10, grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_1_1_2());
+					}
+				)?
+			)
+		)
+		(
+			(
+				lv_typedef_11_0=';'
+				{
+					newLeafNode(lv_typedef_11_0, grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getOtherDataTypeDefinitionImplRule());
+					}
+					setWithLastConsumed($current, "typedef", true, ";");
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleDataType
+entryRuleDataType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataTypeRule()); }
+	iv_ruleDataType=ruleDataType
+	{ $current=$iv_ruleDataType.current; }
+	EOF;
+
+// Rule DataType
+ruleDataType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getDataTypeAccess().getDataTypeReferenceParserRuleCall_0());
+		}
+		this_DataTypeReference_0=ruleDataTypeReference
+		{
+			$current = $this_DataTypeReference_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getDataTypeAccess().getStructuredDataTypeParserRuleCall_1());
+		}
+		this_StructuredDataType_1=ruleStructuredDataType
+		{
+			$current = $this_StructuredDataType_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleSimpleDataType
+entryRuleSimpleDataType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSimpleDataTypeRule()); }
+	iv_ruleSimpleDataType=ruleSimpleDataType
+	{ $current=$iv_ruleSimpleDataType.current; }
+	EOF;
+
+// Rule SimpleDataType
+ruleSimpleDataType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getSimpleDataTypeAccess().getPrimitiveTypeParserRuleCall_0());
+		}
+		this_PrimitiveType_0=rulePrimitiveType
+		{
+			$current = $this_PrimitiveType_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getSimpleDataTypeAccess().getIntervalTypeParserRuleCall_1());
+		}
+		this_IntervalType_1=ruleIntervalType
+		{
+			$current = $this_IntervalType_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getSimpleDataTypeAccess().getCollectionTypeParserRuleCall_2());
+		}
+		this_CollectionType_2=ruleCollectionType
+		{
+			$current = $this_CollectionType_2.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleStructuredDataType
+entryRuleStructuredDataType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getStructuredDataTypeRule()); }
+	iv_ruleStructuredDataType=ruleStructuredDataType
+	{ $current=$iv_ruleStructuredDataType.current; }
+	EOF;
+
+// Rule StructuredDataType
+ruleStructuredDataType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getEnumerationTypeParserRuleCall_0());
+		}
+		this_EnumerationType_0=ruleEnumerationType
+		{
+			$current = $this_EnumerationType_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getStructureTypeParserRuleCall_1());
+		}
+		this_StructureType_1=ruleStructureType
+		{
+			$current = $this_StructureType_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getUnionTypeParserRuleCall_2());
+		}
+		this_UnionType_2=ruleUnionType
+		{
+			$current = $this_UnionType_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getChoiceTypeParserRuleCall_3());
+		}
+		this_ChoiceType_3=ruleChoiceType
+		{
+			$current = $this_ChoiceType_3.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRulePrimitiveType
+entryRulePrimitiveType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveTypeRule()); }
+	iv_rulePrimitiveType=rulePrimitiveType
+	{ $current=$iv_rulePrimitiveType.current; }
+	EOF;
+
+// Rule PrimitiveType
+rulePrimitiveType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveTypeAccess().getPrimitiveNumberTypeParserRuleCall_0());
+		}
+		this_PrimitiveNumberType_0=rulePrimitiveNumberType
+		{
+			$current = $this_PrimitiveNumberType_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveTypeAccess().getOtherPrimitiveTypeParserRuleCall_1());
+		}
+		this_OtherPrimitiveType_1=ruleOtherPrimitiveType
+		{
+			$current = $this_OtherPrimitiveType_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRulePrimitiveNumberType
+entryRulePrimitiveNumberType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveNumberTypeRule()); }
+	iv_rulePrimitiveNumberType=rulePrimitiveNumberType
+	{ $current=$iv_rulePrimitiveNumberType.current; }
+	EOF;
+
+// Rule PrimitiveNumberType
+rulePrimitiveNumberType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0());
+		}
+		this_PrimitiveIntegerType_0=rulePrimitiveIntegerType
+		{
+			$current = $this_PrimitiveIntegerType_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1());
+		}
+		this_PrimitiveRationalType_1=rulePrimitiveRationalType
+		{
+			$current = $this_PrimitiveRationalType_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2());
+		}
+		this_PrimitiveFloatType_2=rulePrimitiveFloatType
+		{
+			$current = $this_PrimitiveFloatType_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3());
+		}
+		this_PrimitiveRealType_3=rulePrimitiveRealType
+		{
+			$current = $this_PrimitiveRealType_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveTimeTypeParserRuleCall_4());
+		}
+		this_PrimitiveTimeType_4=rulePrimitiveTimeType
+		{
+			$current = $this_PrimitiveTimeType_4.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRulePrimitiveIntegerType
+entryRulePrimitiveIntegerType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveIntegerTypeRule()); }
+	iv_rulePrimitiveIntegerType=rulePrimitiveIntegerType
+	{ $current=$iv_rulePrimitiveIntegerType.current; }
+	EOF;
+
+// Rule PrimitiveIntegerType
+rulePrimitiveIntegerType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPrimitiveIntegerTypeAccess().getPrimitiveIntegerTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPrimitiveIntegerTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
+				}
+				lv_sign_1_0=rulePrimitiveNumberSign
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPrimitiveIntegerTypeRule());
+					}
+					set(
+						$current,
+						"sign",
+						lv_sign_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_2='integer'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getPrimitiveIntegerTypeAccess().getIntegerKeyword_2_0());
+			}
+			    |
+			otherlv_3='uinteger'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getPrimitiveIntegerTypeAccess().getUintegerKeyword_2_1());
+			}
+			    |
+			otherlv_4='int'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getPrimitiveIntegerTypeAccess().getIntKeyword_2_2());
+			}
+			    |
+			otherlv_5='uint'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getPrimitiveIntegerTypeAccess().getUintKeyword_2_3());
+			}
+		)
+		(
+			(
+				otherlv_6=':'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getPrimitiveIntegerTypeAccess().getColonKeyword_3_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
+						}
+						lv_size_7_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveIntegerTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				otherlv_8='<'
+				{
+					newLeafNode(otherlv_8, grammarAccess.getPrimitiveIntegerTypeAccess().getLessThanSignKeyword_3_1_0());
+				}
+				(
+					otherlv_9='size:'
+					{
+						newLeafNode(otherlv_9, grammarAccess.getPrimitiveIntegerTypeAccess().getSizeKeyword_3_1_1());
+					}
+				)?
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
+						}
+						lv_size_10_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveIntegerTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_10_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_11='>'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getPrimitiveIntegerTypeAccess().getGreaterThanSignKeyword_3_1_3());
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRulePrimitiveRationalType
+entryRulePrimitiveRationalType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveRationalTypeRule()); }
+	iv_rulePrimitiveRationalType=rulePrimitiveRationalType
+	{ $current=$iv_rulePrimitiveRationalType.current; }
+	EOF;
+
+// Rule PrimitiveRationalType
+rulePrimitiveRationalType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPrimitiveRationalTypeAccess().getPrimitiveRationalTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPrimitiveRationalTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
+				}
+				lv_sign_1_0=rulePrimitiveNumberSign
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPrimitiveRationalTypeRule());
+					}
+					set(
+						$current,
+						"sign",
+						lv_sign_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_2='rational'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getPrimitiveRationalTypeAccess().getRationalKeyword_2_0());
+			}
+			    |
+			otherlv_3='urational'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getPrimitiveRationalTypeAccess().getUrationalKeyword_2_1());
+			}
+			    |
+			otherlv_4='rat'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getPrimitiveRationalTypeAccess().getRatKeyword_2_2());
+			}
+			    |
+			otherlv_5='urat'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getPrimitiveRationalTypeAccess().getUratKeyword_2_3());
+			}
+		)
+		(
+			(
+				otherlv_6=':'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getPrimitiveRationalTypeAccess().getColonKeyword_3_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
+						}
+						lv_size_7_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveRationalTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				otherlv_8='<'
+				{
+					newLeafNode(otherlv_8, grammarAccess.getPrimitiveRationalTypeAccess().getLessThanSignKeyword_3_1_0());
+				}
+				(
+					otherlv_9='size:'
+					{
+						newLeafNode(otherlv_9, grammarAccess.getPrimitiveRationalTypeAccess().getSizeKeyword_3_1_1());
+					}
+				)?
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
+						}
+						lv_size_10_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveRationalTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_10_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_11='>'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getPrimitiveRationalTypeAccess().getGreaterThanSignKeyword_3_1_3());
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRulePrimitiveFloatType
+entryRulePrimitiveFloatType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveFloatTypeRule()); }
+	iv_rulePrimitiveFloatType=rulePrimitiveFloatType
+	{ $current=$iv_rulePrimitiveFloatType.current; }
+	EOF;
+
+// Rule PrimitiveFloatType
+rulePrimitiveFloatType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPrimitiveFloatTypeAccess().getPrimitiveFloatTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPrimitiveFloatTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
+				}
+				lv_sign_1_0=rulePrimitiveNumberSign
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPrimitiveFloatTypeRule());
+					}
+					set(
+						$current,
+						"sign",
+						lv_sign_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_2='float'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getPrimitiveFloatTypeAccess().getFloatKeyword_2_0());
+			}
+			    |
+			otherlv_3='ufloat'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getPrimitiveFloatTypeAccess().getUfloatKeyword_2_1());
+			}
+			    |
+			otherlv_4='double'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getPrimitiveFloatTypeAccess().getDoubleKeyword_2_2());
+			}
+			    |
+			otherlv_5='udouble'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getPrimitiveFloatTypeAccess().getUdoubleKeyword_2_3());
+			}
+		)
+		(
+			(
+				otherlv_6=':'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getPrimitiveFloatTypeAccess().getColonKeyword_3_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
+						}
+						lv_size_7_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveFloatTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				otherlv_8='<'
+				{
+					newLeafNode(otherlv_8, grammarAccess.getPrimitiveFloatTypeAccess().getLessThanSignKeyword_3_1_0());
+				}
+				(
+					otherlv_9='size:'
+					{
+						newLeafNode(otherlv_9, grammarAccess.getPrimitiveFloatTypeAccess().getSizeKeyword_3_1_1());
+					}
+				)?
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
+						}
+						lv_size_10_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveFloatTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_10_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_11='>'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getPrimitiveFloatTypeAccess().getGreaterThanSignKeyword_3_1_3());
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRulePrimitiveRealType
+entryRulePrimitiveRealType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveRealTypeRule()); }
+	iv_rulePrimitiveRealType=rulePrimitiveRealType
+	{ $current=$iv_rulePrimitiveRealType.current; }
+	EOF;
+
+// Rule PrimitiveRealType
+rulePrimitiveRealType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPrimitiveRealTypeAccess().getPrimitiveRealTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPrimitiveRealTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
+				}
+				lv_sign_1_0=rulePrimitiveNumberSign
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPrimitiveRealTypeRule());
+					}
+					set(
+						$current,
+						"sign",
+						lv_sign_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_2='real'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getPrimitiveRealTypeAccess().getRealKeyword_2_0());
+			}
+			    |
+			otherlv_3='ureal'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getPrimitiveRealTypeAccess().getUrealKeyword_2_1());
+			}
+		)
+		(
+			(
+				otherlv_4=':'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getPrimitiveRealTypeAccess().getColonKeyword_3_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
+						}
+						lv_size_5_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveRealTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				otherlv_6='<'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getPrimitiveRealTypeAccess().getLessThanSignKeyword_3_1_0());
+				}
+				(
+					otherlv_7='size:'
+					{
+						newLeafNode(otherlv_7, grammarAccess.getPrimitiveRealTypeAccess().getSizeKeyword_3_1_1());
+					}
+				)?
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
+						}
+						lv_size_8_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveRealTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_8_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_9='>'
+				{
+					newLeafNode(otherlv_9, grammarAccess.getPrimitiveRealTypeAccess().getGreaterThanSignKeyword_3_1_3());
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRulePrimitiveTimeType
+entryRulePrimitiveTimeType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveTimeTypeRule()); }
+	iv_rulePrimitiveTimeType=rulePrimitiveTimeType
+	{ $current=$iv_rulePrimitiveTimeType.current; }
+	EOF;
+
+// Rule PrimitiveTimeType
+rulePrimitiveTimeType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_0_0(),
+						$current);
+				}
+			)
+			otherlv_1='time'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getPrimitiveTimeTypeAccess().getTimeKeyword_0_1());
+			}
+			(
+				(
+					otherlv_2='<'
+					{
+						newLeafNode(otherlv_2, grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_0_2_0_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0());
+							}
+							lv_support_3_0=rulePrimitiveTimeNumberType
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
+								}
+								set(
+									$current,
+									"support",
+									lv_support_3_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_4='>'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_0_2_0_2());
+					}
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0());
+						}
+						lv_support_5_0=rulePrimitiveTimeNumberType
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
+							}
+							set(
+								$current,
+								"support",
+								lv_support_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)?
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					lv_clock_7_0='clock'
+					{
+						newLeafNode(lv_clock_7_0, grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getPrimitiveTimeTypeRule());
+						}
+						setWithLastConsumed($current, "clock", true, "clock");
+					}
+				)
+			)
+			(
+				(
+					otherlv_8='<'
+					{
+						newLeafNode(otherlv_8, grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_1_2_0_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0());
+							}
+							lv_support_9_0=rulePrimitiveTimeNumberType
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
+								}
+								set(
+									$current,
+									"support",
+									lv_support_9_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_10='>'
+					{
+						newLeafNode(otherlv_10, grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_1_2_0_2());
+					}
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0());
+						}
+						lv_support_11_0=rulePrimitiveTimeNumberType
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
+							}
+							set(
+								$current,
+								"support",
+								lv_support_11_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)?
+		)
+	)
+;
+
+// Entry rule entryRulePrimitiveTimeNumberType
+entryRulePrimitiveTimeNumberType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeRule()); }
+	iv_rulePrimitiveTimeNumberType=rulePrimitiveTimeNumberType
+	{ $current=$iv_rulePrimitiveTimeNumberType.current; }
+	EOF;
+
+// Rule PrimitiveTimeNumberType
+rulePrimitiveTimeNumberType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0());
+		}
+		this_PrimitiveIntegerType_0=rulePrimitiveIntegerType
+		{
+			$current = $this_PrimitiveIntegerType_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1());
+		}
+		this_PrimitiveRationalType_1=rulePrimitiveRationalType
+		{
+			$current = $this_PrimitiveRationalType_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2());
+		}
+		this_PrimitiveFloatType_2=rulePrimitiveFloatType
+		{
+			$current = $this_PrimitiveFloatType_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3());
+		}
+		this_PrimitiveRealType_3=rulePrimitiveRealType
+		{
+			$current = $this_PrimitiveRealType_3.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleOtherPrimitiveType
+entryRuleOtherPrimitiveType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getOtherPrimitiveTypeRule()); }
+	iv_ruleOtherPrimitiveType=ruleOtherPrimitiveType
+	{ $current=$iv_ruleOtherPrimitiveType.current; }
+	EOF;
+
+// Rule OtherPrimitiveType
+ruleOtherPrimitiveType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveBooleanTypeParserRuleCall_0());
+		}
+		this_PrimitiveBooleanType_0=rulePrimitiveBooleanType
+		{
+			$current = $this_PrimitiveBooleanType_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveCharacterTypeParserRuleCall_1());
+		}
+		this_PrimitiveCharacterType_1=rulePrimitiveCharacterType
+		{
+			$current = $this_PrimitiveCharacterType_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveStringTypeParserRuleCall_2());
+		}
+		this_PrimitiveStringType_2=rulePrimitiveStringType
+		{
+			$current = $this_PrimitiveStringType_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveInstanceTypeParserRuleCall_3());
+		}
+		this_PrimitiveInstanceType_3=rulePrimitiveInstanceType
+		{
+			$current = $this_PrimitiveInstanceType_3.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRulePrimitiveBooleanType
+entryRulePrimitiveBooleanType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveBooleanTypeRule()); }
+	iv_rulePrimitiveBooleanType=rulePrimitiveBooleanType
+	{ $current=$iv_rulePrimitiveBooleanType.current; }
+	EOF;
+
+// Rule PrimitiveBooleanType
+rulePrimitiveBooleanType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPrimitiveBooleanTypeAccess().getPrimitiveBooleanTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='boolean'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getPrimitiveBooleanTypeAccess().getBooleanKeyword_1_0());
+			}
+			    |
+			otherlv_2='bool'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getPrimitiveBooleanTypeAccess().getBoolKeyword_1_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRulePrimitiveCharacterType
+entryRulePrimitiveCharacterType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveCharacterTypeRule()); }
+	iv_rulePrimitiveCharacterType=rulePrimitiveCharacterType
+	{ $current=$iv_rulePrimitiveCharacterType.current; }
+	EOF;
+
+// Rule PrimitiveCharacterType
+rulePrimitiveCharacterType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPrimitiveCharacterTypeAccess().getPrimitiveCharacterTypeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='char'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPrimitiveCharacterTypeAccess().getCharKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRulePrimitiveStringType
+entryRulePrimitiveStringType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveStringTypeRule()); }
+	iv_rulePrimitiveStringType=rulePrimitiveStringType
+	{ $current=$iv_rulePrimitiveStringType.current; }
+	EOF;
+
+// Rule PrimitiveStringType
+rulePrimitiveStringType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPrimitiveStringTypeAccess().getPrimitiveStringTypeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='string'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPrimitiveStringTypeAccess().getStringKeyword_1());
+		}
+		(
+			(
+				otherlv_2=':'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getPrimitiveStringTypeAccess().getColonKeyword_2_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_0_1_0());
+						}
+						lv_size_3_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveStringTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			    |
+			(
+				otherlv_4='<'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getPrimitiveStringTypeAccess().getLessThanSignKeyword_2_1_0());
+				}
+				(
+					otherlv_5='size:'
+					{
+						newLeafNode(otherlv_5, grammarAccess.getPrimitiveStringTypeAccess().getSizeKeyword_2_1_1());
+					}
+				)?
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_1_2_0());
+						}
+						lv_size_6_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPrimitiveStringTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_7='>'
+				{
+					newLeafNode(otherlv_7, grammarAccess.getPrimitiveStringTypeAccess().getGreaterThanSignKeyword_2_1_3());
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRulePrimitiveInstanceType
+entryRulePrimitiveInstanceType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimitiveInstanceTypeRule()); }
+	iv_rulePrimitiveInstanceType=rulePrimitiveInstanceType
+	{ $current=$iv_rulePrimitiveInstanceType.current; }
+	EOF;
+
+// Rule PrimitiveInstanceType
+rulePrimitiveInstanceType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPrimitiveInstanceTypeAccess().getPrimitiveInstanceTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedPrimitiveInstanceKindEnumRuleCall_1_0());
+				}
+				lv_expected_1_0=rulePrimitiveInstanceKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPrimitiveInstanceTypeRule());
+					}
+					set(
+						$current,
+						"expected",
+						lv_expected_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveInstanceKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_2='<'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getPrimitiveInstanceTypeAccess().getLessThanSignKeyword_2_0());
+			}
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getPrimitiveInstanceTypeRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementCrossReference_2_1_0());
+					}
+					ruleESIdentifier
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_4='>'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getPrimitiveInstanceTypeAccess().getGreaterThanSignKeyword_2_2());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleIntervalType
+entryRuleIntervalType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getIntervalTypeRule()); }
+	iv_ruleIntervalType=ruleIntervalType
+	{ $current=$iv_ruleIntervalType.current; }
+	EOF;
+
+// Rule IntervalType
+ruleIntervalType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getIntervalTypeAccess().getIntervalTypeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='interval'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getIntervalTypeAccess().getIntervalKeyword_1());
+		}
+		otherlv_2='<'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getIntervalTypeAccess().getLessThanSignKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeAccess().getSupportPrimitiveNumberTypeParserRuleCall_3_0());
+				}
+				lv_support_3_0=rulePrimitiveNumberType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeRule());
+					}
+					set(
+						$current,
+						"support",
+						lv_support_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				(
+					lv_lopen_4_0=']'
+					{
+						newLeafNode(lv_lopen_4_0, grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getIntervalTypeRule());
+						}
+						setWithLastConsumed($current, "lopen", true, "]");
+					}
+				)
+			)
+			    |
+			otherlv_5='['
+			{
+				newLeafNode(otherlv_5, grammarAccess.getIntervalTypeAccess().getLeftSquareBracketKeyword_4_1());
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeAccess().getInfimumExpressionParserRuleCall_5_0());
+				}
+				lv_infimum_6_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeRule());
+					}
+					set(
+						$current,
+						"infimum",
+						lv_infimum_6_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_7=','
+		{
+			newLeafNode(otherlv_7, grammarAccess.getIntervalTypeAccess().getCommaKeyword_6());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeAccess().getSupremumExpressionParserRuleCall_7_0());
+				}
+				lv_supremum_8_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeRule());
+					}
+					set(
+						$current,
+						"supremum",
+						lv_supremum_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_9=']'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getIntervalTypeAccess().getRightSquareBracketKeyword_8_0());
+			}
+			    |
+			(
+				(
+					lv_ropen_10_0='['
+					{
+						newLeafNode(lv_ropen_10_0, grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getIntervalTypeRule());
+						}
+						setWithLastConsumed($current, "ropen", true, "[");
+					}
+				)
+			)
+		)
+		otherlv_11='>'
+		{
+			newLeafNode(otherlv_11, grammarAccess.getIntervalTypeAccess().getGreaterThanSignKeyword_9());
+		}
+	)
+;
+
+// Entry rule entryRuleIntervalTypeDefinition
+entryRuleIntervalTypeDefinition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getIntervalTypeDefinitionRule()); }
+	iv_ruleIntervalTypeDefinition=ruleIntervalTypeDefinition
+	{ $current=$iv_ruleIntervalTypeDefinition.current; }
+	EOF;
+
+// Rule IntervalTypeDefinition
+ruleIntervalTypeDefinition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getIntervalTypeDefinitionAccess().getIntervalTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_2='type'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getIntervalTypeDefinitionAccess().getTypeKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_5='interval'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getIntervalTypeDefinitionAccess().getIntervalKeyword_5());
+		}
+		otherlv_6='<'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getIntervalTypeDefinitionAccess().getLessThanSignKeyword_6());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getSupportPrimitiveNumberTypeParserRuleCall_7_0());
+				}
+				lv_support_7_0=rulePrimitiveNumberType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"support",
+						lv_support_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				(
+					lv_lopen_8_0=']'
+					{
+						newLeafNode(lv_lopen_8_0, grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getIntervalTypeDefinitionRule());
+						}
+						setWithLastConsumed($current, "lopen", true, "]");
+					}
+				)
+			)
+			    |
+			otherlv_9='['
+			{
+				newLeafNode(otherlv_9, grammarAccess.getIntervalTypeDefinitionAccess().getLeftSquareBracketKeyword_8_1());
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumExpressionParserRuleCall_9_0());
+				}
+				lv_infimum_10_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"infimum",
+						lv_infimum_10_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_11=','
+		{
+			newLeafNode(otherlv_11, grammarAccess.getIntervalTypeDefinitionAccess().getCommaKeyword_10());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumExpressionParserRuleCall_11_0());
+				}
+				lv_supremum_12_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"supremum",
+						lv_supremum_12_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_13=']'
+			{
+				newLeafNode(otherlv_13, grammarAccess.getIntervalTypeDefinitionAccess().getRightSquareBracketKeyword_12_0());
+			}
+			    |
+			(
+				(
+					lv_ropen_14_0='['
+					{
+						newLeafNode(lv_ropen_14_0, grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getIntervalTypeDefinitionRule());
+						}
+						setWithLastConsumed($current, "ropen", true, "[");
+					}
+				)
+			)
+		)
+		otherlv_15='>'
+		{
+			newLeafNode(otherlv_15, grammarAccess.getIntervalTypeDefinitionAccess().getGreaterThanSignKeyword_13());
+		}
+		otherlv_16=';'
+		{
+			newLeafNode(otherlv_16, grammarAccess.getIntervalTypeDefinitionAccess().getSemicolonKeyword_14());
+		}
+	)
+;
+
+// Entry rule entryRuleIntervalTypeDefinitionImpl
+entryRuleIntervalTypeDefinitionImpl returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplRule()); }
+	iv_ruleIntervalTypeDefinitionImpl=ruleIntervalTypeDefinitionImpl
+	{ $current=$iv_ruleIntervalTypeDefinitionImpl.current; }
+	EOF;
+
+// Rule IntervalTypeDefinitionImpl
+ruleIntervalTypeDefinitionImpl returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_3='interval'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalKeyword_3());
+		}
+		otherlv_4='<'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getIntervalTypeDefinitionImplAccess().getLessThanSignKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportPrimitiveNumberTypeParserRuleCall_5_0());
+				}
+				lv_support_5_0=rulePrimitiveNumberType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"support",
+						lv_support_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				(
+					lv_lopen_6_0=']'
+					{
+						newLeafNode(lv_lopen_6_0, grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getIntervalTypeDefinitionImplRule());
+						}
+						setWithLastConsumed($current, "lopen", true, "]");
+					}
+				)
+			)
+			    |
+			otherlv_7='['
+			{
+				newLeafNode(otherlv_7, grammarAccess.getIntervalTypeDefinitionImplAccess().getLeftSquareBracketKeyword_6_1());
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumExpressionParserRuleCall_7_0());
+				}
+				lv_infimum_8_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"infimum",
+						lv_infimum_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_9=','
+		{
+			newLeafNode(otherlv_9, grammarAccess.getIntervalTypeDefinitionImplAccess().getCommaKeyword_8());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumExpressionParserRuleCall_9_0());
+				}
+				lv_supremum_10_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"supremum",
+						lv_supremum_10_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_11=']'
+			{
+				newLeafNode(otherlv_11, grammarAccess.getIntervalTypeDefinitionImplAccess().getRightSquareBracketKeyword_10_0());
+			}
+			    |
+			(
+				(
+					lv_ropen_12_0='['
+					{
+						newLeafNode(lv_ropen_12_0, grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getIntervalTypeDefinitionImplRule());
+						}
+						setWithLastConsumed($current, "ropen", true, "[");
+					}
+				)
+			)
+		)
+		otherlv_13='>'
+		{
+			newLeafNode(otherlv_13, grammarAccess.getIntervalTypeDefinitionImplAccess().getGreaterThanSignKeyword_11());
+		}
+		otherlv_14=';'
+		{
+			newLeafNode(otherlv_14, grammarAccess.getIntervalTypeDefinitionImplAccess().getSemicolonKeyword_12());
+		}
+	)
+;
+
+// Entry rule entryRuleCollectionType
+entryRuleCollectionType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getCollectionTypeRule()); }
+	iv_ruleCollectionType=ruleCollectionType
+	{ $current=$iv_ruleCollectionType.current; }
+	EOF;
+
+// Rule CollectionType
+ruleCollectionType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getCollectionTypeAccess().getCollectionTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeAccess().getContainerCollectionKindEnumRuleCall_1_0());
+				}
+				lv_container_1_0=ruleCollectionKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeRule());
+					}
+					set(
+						$current,
+						"container",
+						lv_container_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='<'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getCollectionTypeAccess().getLessThanSignKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeAccess().getSupportDataTypeParserRuleCall_3_0());
+				}
+				lv_support_3_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeRule());
+					}
+					set(
+						$current,
+						"support",
+						lv_support_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_4=','
+			{
+				newLeafNode(otherlv_4, grammarAccess.getCollectionTypeAccess().getCommaKeyword_4_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getCollectionTypeAccess().getSizeEIntParserRuleCall_4_1_0_0());
+						}
+						lv_size_5_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getCollectionTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						lv_unbounded_6_0='*'
+						{
+							newLeafNode(lv_unbounded_6_0, grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getCollectionTypeRule());
+							}
+							setWithLastConsumed($current, "unbounded", true, "*");
+						}
+					)
+				)
+			)
+		)?
+		otherlv_7='>'
+		{
+			newLeafNode(otherlv_7, grammarAccess.getCollectionTypeAccess().getGreaterThanSignKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleCollectionTypeDefinition
+entryRuleCollectionTypeDefinition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getCollectionTypeDefinitionRule()); }
+	iv_ruleCollectionTypeDefinition=ruleCollectionTypeDefinition
+	{ $current=$iv_ruleCollectionTypeDefinition.current; }
+	EOF;
+
+// Rule CollectionTypeDefinition
+ruleCollectionTypeDefinition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getCollectionTypeDefinitionAccess().getCollectionTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_2='type'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getCollectionTypeDefinitionAccess().getTypeKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getContainerCollectionKindEnumRuleCall_5_0());
+				}
+				lv_container_5_0=ruleCollectionKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"container",
+						lv_container_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_6='<'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getCollectionTypeDefinitionAccess().getLessThanSignKeyword_6());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getSupportDataTypeParserRuleCall_7_0());
+				}
+				lv_support_7_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"support",
+						lv_support_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_8=','
+			{
+				newLeafNode(otherlv_8, grammarAccess.getCollectionTypeDefinitionAccess().getCommaKeyword_8_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getSizeEIntParserRuleCall_8_1_0_0());
+						}
+						lv_size_9_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_9_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						lv_unbounded_10_0='*'
+						{
+							newLeafNode(lv_unbounded_10_0, grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getCollectionTypeDefinitionRule());
+							}
+							setWithLastConsumed($current, "unbounded", true, "*");
+						}
+					)
+				)
+			)
+		)?
+		otherlv_11='>'
+		{
+			newLeafNode(otherlv_11, grammarAccess.getCollectionTypeDefinitionAccess().getGreaterThanSignKeyword_9());
+		}
+		otherlv_12=';'
+		{
+			newLeafNode(otherlv_12, grammarAccess.getCollectionTypeDefinitionAccess().getSemicolonKeyword_10());
+		}
+	)
+;
+
+// Entry rule entryRuleCollectionTypeDefinitionImpl
+entryRuleCollectionTypeDefinitionImpl returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplRule()); }
+	iv_ruleCollectionTypeDefinitionImpl=ruleCollectionTypeDefinitionImpl
+	{ $current=$iv_ruleCollectionTypeDefinitionImpl.current; }
+	EOF;
+
+// Rule CollectionTypeDefinitionImpl
+ruleCollectionTypeDefinitionImpl returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getCollectionTypeDefinitionImplAccess().getCollectionTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerCollectionKindEnumRuleCall_3_0());
+				}
+				lv_container_3_0=ruleCollectionKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"container",
+						lv_container_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4='<'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getCollectionTypeDefinitionImplAccess().getLessThanSignKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportDataTypeParserRuleCall_5_0());
+				}
+				lv_support_5_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"support",
+						lv_support_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_6=','
+			{
+				newLeafNode(otherlv_6, grammarAccess.getCollectionTypeDefinitionImplAccess().getCommaKeyword_6_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeEIntParserRuleCall_6_1_0_0());
+						}
+						lv_size_7_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						lv_unbounded_8_0='*'
+						{
+							newLeafNode(lv_unbounded_8_0, grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getCollectionTypeDefinitionImplRule());
+							}
+							setWithLastConsumed($current, "unbounded", true, "*");
+						}
+					)
+				)
+			)
+		)?
+		otherlv_9='>'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getCollectionTypeDefinitionImplAccess().getGreaterThanSignKeyword_7());
+		}
+		otherlv_10=';'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getCollectionTypeDefinitionImplAccess().getSemicolonKeyword_8());
+		}
+	)
+;
+
+// Entry rule entryRuleEnumerationType
+entryRuleEnumerationType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEnumerationTypeRule()); }
+	iv_ruleEnumerationType=ruleEnumerationType
+	{ $current=$iv_ruleEnumerationType.current; }
+	EOF;
+
+// Rule EnumerationType
+ruleEnumerationType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEnumerationTypeAccess().getEnumerationTypeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='enum'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getEnumerationTypeAccess().getEnumKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEnumerationTypeAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_3_0());
+				}
+				lv_literal_3_0=ruleEnumerationLiteral
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationTypeRule());
+					}
+					add(
+						$current,
+						"literal",
+						lv_literal_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_4=','
+			{
+				newLeafNode(otherlv_4, grammarAccess.getEnumerationTypeAccess().getCommaKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_4_1_0());
+					}
+					lv_literal_5_0=ruleEnumerationLiteral
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEnumerationTypeRule());
+						}
+						add(
+							$current,
+							"literal",
+							lv_literal_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getEnumerationTypeAccess().getRightCurlyBracketKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleEnumerationTypeDefinition
+entryRuleEnumerationTypeDefinition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEnumerationTypeDefinitionRule()); }
+	iv_ruleEnumerationTypeDefinition=ruleEnumerationTypeDefinition
+	{ $current=$iv_ruleEnumerationTypeDefinition.current; }
+	EOF;
+
+// Rule EnumerationTypeDefinition
+ruleEnumerationTypeDefinition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEnumerationTypeDefinitionAccess().getEnumerationTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_2='type'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEnumerationTypeDefinitionAccess().getTypeKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				lv_typedef_5_0='enum'
+				{
+					newLeafNode(lv_typedef_5_0, grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEnumerationTypeDefinitionRule());
+					}
+					setWithLastConsumed($current, "typedef", true, "enum");
+				}
+			)
+		)
+		otherlv_6='{'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getEnumerationTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_7_0());
+				}
+				lv_literal_7_0=ruleEnumerationLiteral
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+					}
+					add(
+						$current,
+						"literal",
+						lv_literal_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_8=','
+			{
+				newLeafNode(otherlv_8, grammarAccess.getEnumerationTypeDefinitionAccess().getCommaKeyword_8_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_8_1_0());
+					}
+					lv_literal_9_0=ruleEnumerationLiteral
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+						}
+						add(
+							$current,
+							"literal",
+							lv_literal_9_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		otherlv_10='}'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getEnumerationTypeDefinitionAccess().getRightCurlyBracketKeyword_9());
+		}
+	)
+;
+
+// Entry rule entryRuleEnumerationTypeDefinitionImpl
+entryRuleEnumerationTypeDefinitionImpl returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplRule()); }
+	iv_ruleEnumerationTypeDefinitionImpl=ruleEnumerationTypeDefinitionImpl
+	{ $current=$iv_ruleEnumerationTypeDefinitionImpl.current; }
+	EOF;
+
+// Rule EnumerationTypeDefinitionImpl
+ruleEnumerationTypeDefinitionImpl returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEnumerationTypeDefinitionImplAccess().getEnumerationTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				lv_typedef_3_0='enum'
+				{
+					newLeafNode(lv_typedef_3_0, grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getEnumerationTypeDefinitionImplRule());
+					}
+					setWithLastConsumed($current, "typedef", true, "enum");
+				}
+			)
+		)
+		otherlv_4='{'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getEnumerationTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_5_0());
+				}
+				lv_literal_5_0=ruleEnumerationLiteral
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionImplRule());
+					}
+					add(
+						$current,
+						"literal",
+						lv_literal_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_6=','
+			{
+				newLeafNode(otherlv_6, grammarAccess.getEnumerationTypeDefinitionImplAccess().getCommaKeyword_6_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_6_1_0());
+					}
+					lv_literal_7_0=ruleEnumerationLiteral
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionImplRule());
+						}
+						add(
+							$current,
+							"literal",
+							lv_literal_7_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		otherlv_8='}'
+		{
+			newLeafNode(otherlv_8, grammarAccess.getEnumerationTypeDefinitionImplAccess().getRightCurlyBracketKeyword_7());
+		}
+	)
+;
+
+// Entry rule entryRuleEnumerationLiteral
+entryRuleEnumerationLiteral returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEnumerationLiteralRule()); }
+	iv_ruleEnumerationLiteral=ruleEnumerationLiteral
+	{ $current=$iv_ruleEnumerationLiteral.current; }
+	EOF;
+
+// Rule EnumerationLiteral
+ruleEnumerationLiteral returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationLiteralAccess().getNameESIdentifierParserRuleCall_0_0());
+				}
+				lv_name_0_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationLiteralRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_0());
+				}
+				lv_unrestrictedName_1_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEnumerationLiteralRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_2='='
+			{
+				newLeafNode(otherlv_2, grammarAccess.getEnumerationLiteralAccess().getEqualsSignKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEnumerationLiteralAccess().getValueLiteralTerminalExpressionParserRuleCall_2_1_0());
+					}
+					lv_value_3_0=ruleLiteralTerminalExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEnumerationLiteralRule());
+						}
+						set(
+							$current,
+							"value",
+							lv_value_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.LiteralTerminalExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleStructureType
+entryRuleStructureType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getStructureTypeRule()); }
+	iv_ruleStructureType=ruleStructureType
+	{ $current=$iv_ruleStructureType.current; }
+	EOF;
+
+// Rule StructureType
+ruleStructureType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getStructureTypeAccess().getStructureTypeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='struct'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getStructureTypeAccess().getStructKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getStructureTypeAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStructureTypeAccess().getPropertyVariableParserRuleCall_3_0());
+				}
+				lv_property_3_0=ruleVariable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStructureTypeRule());
+					}
+					add(
+						$current,
+						"property",
+						lv_property_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getStructureTypeAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleStructureTypeDefinition
+entryRuleStructureTypeDefinition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getStructureTypeDefinitionRule()); }
+	iv_ruleStructureTypeDefinition=ruleStructureTypeDefinition
+	{ $current=$iv_ruleStructureTypeDefinition.current; }
+	EOF;
+
+// Rule StructureTypeDefinition
+ruleStructureTypeDefinition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getStructureTypeDefinitionAccess().getStructureTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_2='type'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getStructureTypeDefinitionAccess().getTypeKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				lv_typedef_5_0='struct'
+				{
+					newLeafNode(lv_typedef_5_0, grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getStructureTypeDefinitionRule());
+					}
+					setWithLastConsumed($current, "typedef", true, "struct");
+				}
+			)
+		)
+		otherlv_6='{'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getStructureTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0());
+				}
+				lv_property_7_0=ruleVariable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
+					}
+					add(
+						$current,
+						"property",
+						lv_property_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_8='}'
+		{
+			newLeafNode(otherlv_8, grammarAccess.getStructureTypeDefinitionAccess().getRightCurlyBracketKeyword_8());
+		}
+	)
+;
+
+// Entry rule entryRuleStructureTypeDefinitionImpl
+entryRuleStructureTypeDefinitionImpl returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getStructureTypeDefinitionImplRule()); }
+	iv_ruleStructureTypeDefinitionImpl=ruleStructureTypeDefinitionImpl
+	{ $current=$iv_ruleStructureTypeDefinitionImpl.current; }
+	EOF;
+
+// Rule StructureTypeDefinitionImpl
+ruleStructureTypeDefinitionImpl returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getStructureTypeDefinitionImplAccess().getStructureTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStructureTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				lv_typedef_3_0='struct'
+				{
+					newLeafNode(lv_typedef_3_0, grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getStructureTypeDefinitionImplRule());
+					}
+					setWithLastConsumed($current, "typedef", true, "struct");
+				}
+			)
+		)
+		otherlv_4='{'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getStructureTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0());
+				}
+				lv_property_5_0=ruleVariable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionImplRule());
+					}
+					add(
+						$current,
+						"property",
+						lv_property_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getStructureTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRuleUnionType
+entryRuleUnionType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUnionTypeRule()); }
+	iv_ruleUnionType=ruleUnionType
+	{ $current=$iv_ruleUnionType.current; }
+	EOF;
+
+// Rule UnionType
+ruleUnionType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUnionTypeAccess().getUnionTypeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='union'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getUnionTypeAccess().getUnionKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getUnionTypeAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUnionTypeAccess().getPropertyVariableParserRuleCall_3_0());
+				}
+				lv_property_3_0=ruleVariable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUnionTypeRule());
+					}
+					add(
+						$current,
+						"property",
+						lv_property_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getUnionTypeAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleUnionTypeDefinition
+entryRuleUnionTypeDefinition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUnionTypeDefinitionRule()); }
+	iv_ruleUnionTypeDefinition=ruleUnionTypeDefinition
+	{ $current=$iv_ruleUnionTypeDefinition.current; }
+	EOF;
+
+// Rule UnionTypeDefinition
+ruleUnionTypeDefinition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUnionTypeDefinitionAccess().getUnionTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_2='type'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getUnionTypeDefinitionAccess().getTypeKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				lv_typedef_5_0='union'
+				{
+					newLeafNode(lv_typedef_5_0, grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUnionTypeDefinitionRule());
+					}
+					setWithLastConsumed($current, "typedef", true, "union");
+				}
+			)
+		)
+		otherlv_6='{'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getUnionTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0());
+				}
+				lv_property_7_0=ruleVariable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
+					}
+					add(
+						$current,
+						"property",
+						lv_property_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_8='}'
+		{
+			newLeafNode(otherlv_8, grammarAccess.getUnionTypeDefinitionAccess().getRightCurlyBracketKeyword_8());
+		}
+	)
+;
+
+// Entry rule entryRuleUnionTypeDefinitionImpl
+entryRuleUnionTypeDefinitionImpl returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUnionTypeDefinitionImplRule()); }
+	iv_ruleUnionTypeDefinitionImpl=ruleUnionTypeDefinitionImpl
+	{ $current=$iv_ruleUnionTypeDefinitionImpl.current; }
+	EOF;
+
+// Rule UnionTypeDefinitionImpl
+ruleUnionTypeDefinitionImpl returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getUnionTypeDefinitionImplAccess().getUnionTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUnionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				lv_typedef_3_0='union'
+				{
+					newLeafNode(lv_typedef_3_0, grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getUnionTypeDefinitionImplRule());
+					}
+					setWithLastConsumed($current, "typedef", true, "union");
+				}
+			)
+		)
+		otherlv_4='{'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getUnionTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0());
+				}
+				lv_property_5_0=ruleVariable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionImplRule());
+					}
+					add(
+						$current,
+						"property",
+						lv_property_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getUnionTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRuleChoiceType
+entryRuleChoiceType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getChoiceTypeRule()); }
+	iv_ruleChoiceType=ruleChoiceType
+	{ $current=$iv_ruleChoiceType.current; }
+	EOF;
+
+// Rule ChoiceType
+ruleChoiceType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getChoiceTypeAccess().getChoiceTypeAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='choice'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getChoiceTypeAccess().getChoiceKeyword_1());
+		}
+		otherlv_2='{'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getChoiceTypeAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChoiceTypeAccess().getPropertyVariableParserRuleCall_3_0());
+				}
+				lv_property_3_0=ruleVariable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChoiceTypeRule());
+					}
+					add(
+						$current,
+						"property",
+						lv_property_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getChoiceTypeAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleChoiceTypeDefinition
+entryRuleChoiceTypeDefinition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getChoiceTypeDefinitionRule()); }
+	iv_ruleChoiceTypeDefinition=ruleChoiceTypeDefinition
+	{ $current=$iv_ruleChoiceTypeDefinition.current; }
+	EOF;
+
+// Rule ChoiceTypeDefinition
+ruleChoiceTypeDefinition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getChoiceTypeDefinitionAccess().getChoiceTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_2='type'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getChoiceTypeDefinitionAccess().getTypeKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				lv_typedef_5_0='choice'
+				{
+					newLeafNode(lv_typedef_5_0, grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getChoiceTypeDefinitionRule());
+					}
+					setWithLastConsumed($current, "typedef", true, "choice");
+				}
+			)
+		)
+		otherlv_6='{'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getChoiceTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0());
+				}
+				lv_property_7_0=ruleVariable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
+					}
+					add(
+						$current,
+						"property",
+						lv_property_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_8='}'
+		{
+			newLeafNode(otherlv_8, grammarAccess.getChoiceTypeDefinitionAccess().getRightCurlyBracketKeyword_8());
+		}
+	)
+;
+
+// Entry rule entryRuleChoiceTypeDefinitionImpl
+entryRuleChoiceTypeDefinitionImpl returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getChoiceTypeDefinitionImplRule()); }
+	iv_ruleChoiceTypeDefinitionImpl=ruleChoiceTypeDefinitionImpl
+	{ $current=$iv_ruleChoiceTypeDefinitionImpl.current; }
+	EOF;
+
+// Rule ChoiceTypeDefinitionImpl
+ruleChoiceTypeDefinitionImpl returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getChoiceTypeDefinitionImplAccess().getChoiceTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionImplRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				lv_typedef_3_0='choice'
+				{
+					newLeafNode(lv_typedef_3_0, grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getChoiceTypeDefinitionImplRule());
+					}
+					setWithLastConsumed($current, "typedef", true, "choice");
+				}
+			)
+		)
+		otherlv_4='{'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getChoiceTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0());
+				}
+				lv_property_5_0=ruleVariable
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionImplRule());
+					}
+					add(
+						$current,
+						"property",
+						lv_property_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getChoiceTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRuleModifier
+entryRuleModifier returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getModifierAccess().getUnorderedGroup_1()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getModifierRule()); }
+	iv_ruleModifier=ruleModifier
+	{ $current=$iv_ruleModifier.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule Modifier
+ruleModifier returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getModifierAccess().getUnorderedGroup_1()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getModifierAccess().getModifierAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0);
+					}
+								({true}?=>((
+									lv_static_2_0='static'
+									{
+										newLeafNode(lv_static_2_0, grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getModifierRule());
+										}
+										setWithLastConsumed($current, "static", true, "static");
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1);
+					}
+								({true}?=>((
+									lv_final_3_0='final'
+									{
+										newLeafNode(lv_final_3_0, grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getModifierRule());
+										}
+										setWithLastConsumed($current, "final", true, "final");
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2);
+					}
+								({true}?=>((
+									lv_reference_4_0='reference'
+									{
+										newLeafNode(lv_reference_4_0, grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getModifierRule());
+										}
+										setWithLastConsumed($current, "reference", true, "reference");
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3);
+					}
+								({true}?=>((
+									lv_volatile_5_0='volatile'
+									{
+										newLeafNode(lv_volatile_5_0, grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getModifierRule());
+										}
+										setWithLastConsumed($current, "volatile", true, "volatile");
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4);
+					}
+								({true}?=>((
+									lv_transient_6_0='transient'
+									{
+										newLeafNode(lv_transient_6_0, grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getModifierRule());
+										}
+										setWithLastConsumed($current, "transient", true, "transient");
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+				}
+		)
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleVariable
+entryRuleVariable returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getVariableAccess().getUnorderedGroup_0()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getVariableRule()); }
+	iv_ruleVariable=ruleVariable
+	{ $current=$iv_ruleVariable.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule Variable
+ruleVariable returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getVariableAccess().getUnorderedGroup_0()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getVariableAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+									}
+									lv_visibility_1_0=ruleVisibilityKind
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getVariableRule());
+										}
+										set(
+											$current,
+											"visibility",
+											lv_visibility_1_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getVariableAccess().getModifierModifierParserRuleCall_0_1_0());
+									}
+									lv_modifier_2_0=ruleModifier
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getVariableRule());
+										}
+										set(
+											$current,
+											"modifier",
+											lv_modifier_2_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+				}
+		)
+		(
+			otherlv_3='var'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getVariableAccess().getVarKeyword_1_0());
+			}
+			    |
+			(
+				(
+					lv_const_4_0='val'
+					{
+						newLeafNode(lv_const_4_0, grammarAccess.getVariableAccess().getConstValKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getVariableRule());
+						}
+						setWithLastConsumed($current, "const", true, "val");
+					}
+				)
+			)
+			    |
+			(
+				(
+					(
+						(
+							lv_const_5_0='const'
+							{
+								newLeafNode(lv_const_5_0, grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getVariableRule());
+								}
+								setWithLastConsumed($current, "const", true, "const");
+							}
+						)
+					)
+					    |
+					(
+						(
+							lv_const_6_0='final'
+							{
+								newLeafNode(lv_const_6_0, grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getVariableRule());
+								}
+								setWithLastConsumed($current, "const", true, "final");
+							}
+						)
+					)
+				)
+				(
+					(
+						lv_macro_7_0='macro'
+						{
+							newLeafNode(lv_macro_7_0, grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getVariableRule());
+							}
+							setWithLastConsumed($current, "macro", true, "macro");
+						}
+					)
+				)?
+				(
+					otherlv_8='var'
+					{
+						newLeafNode(otherlv_8, grammarAccess.getVariableAccess().getVarKeyword_1_2_2());
+					}
+				)?
+			)
+			    |
+			(
+				(
+					(
+						lv_macro_9_0='macro'
+						{
+							newLeafNode(lv_macro_9_0, grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getVariableRule());
+							}
+							setWithLastConsumed($current, "macro", true, "macro");
+						}
+					)
+				)
+				(
+					otherlv_10='var'
+					{
+						newLeafNode(otherlv_10, grammarAccess.getVariableAccess().getVarKeyword_1_3_1_0());
+					}
+					    |
+					(
+						(
+							lv_const_11_0='val'
+							{
+								newLeafNode(lv_const_11_0, grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getVariableRule());
+								}
+								setWithLastConsumed($current, "const", true, "val");
+							}
+						)
+					)
+				)?
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableAccess().getTypeDataTypeParserRuleCall_2_0());
+				}
+				lv_type_12_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_12_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_13_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_13_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_14_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_14_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_15='='
+			{
+				newLeafNode(otherlv_15, grammarAccess.getVariableAccess().getEqualsSignKeyword_5_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getVariableAccess().getDefaultValueExpressionParserRuleCall_5_1_0());
+					}
+					lv_defaultValue_16_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getVariableRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_16_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			(
+				otherlv_17='{'
+				{
+					newLeafNode(otherlv_17, grammarAccess.getVariableAccess().getLeftCurlyBracketKeyword_6_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getVariableAccess().getOnWriteActionOnWriteRoutineParserRuleCall_6_0_1_0());
+						}
+						lv_onWriteAction_18_0=ruleOnWriteRoutine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getVariableRule());
+							}
+							set(
+								$current,
+								"onWriteAction",
+								lv_onWriteAction_18_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_19='}'
+				{
+					newLeafNode(otherlv_19, grammarAccess.getVariableAccess().getRightCurlyBracketKeyword_6_0_2());
+				}
+			)
+			    |
+			otherlv_20=';'
+			{
+				newLeafNode(otherlv_20, grammarAccess.getVariableAccess().getSemicolonKeyword_6_1());
+			}
+		)
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleOnWriteRoutine
+entryRuleOnWriteRoutine returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getOnWriteRoutineRule()); }
+	iv_ruleOnWriteRoutine=ruleOnWriteRoutine
+	{ $current=$iv_ruleOnWriteRoutine.current; }
+	EOF;
+
+// Rule OnWriteRoutine
+ruleOnWriteRoutine returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getOnWriteRoutineAccess().getRoutineAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='@on_write'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getOnWriteRoutineAccess().getOn_writeKeyword_1());
+		}
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getOnWriteRoutineAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getOnWriteRoutineAccess().getParameterVariableRoutineParameterParserRuleCall_2_1_0());
+					}
+					lv_parameter_3_0=ruleVariableRoutineParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getOnWriteRoutineRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.VariableRoutineParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_4=')'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getOnWriteRoutineAccess().getRightParenthesisKeyword_2_2());
+			}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getOnWriteRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0());
+				}
+				lv_bodyBlock_5_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getOnWriteRoutineRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleVariableRoutineParameter
+entryRuleVariableRoutineParameter returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getVariableRoutineParameterRule()); }
+	iv_ruleVariableRoutineParameter=ruleVariableRoutineParameter
+	{ $current=$iv_ruleVariableRoutineParameter.current; }
+	EOF;
+
+// Rule VariableRoutineParameter
+ruleVariableRoutineParameter returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getTypeDataTypeParserRuleCall_0_0());
+				}
+				lv_type_0_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_2='='
+			{
+				newLeafNode(otherlv_2, grammarAccess.getVariableRoutineParameterAccess().getEqualsSignKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueExpressionParserRuleCall_2_1_0());
+					}
+					lv_defaultValue_3_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleVariablePublic
+entryRuleVariablePublic returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getVariablePublicAccess().getUnorderedGroup_1()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getVariablePublicRule()); }
+	iv_ruleVariablePublic=ruleVariablePublic
+	{ $current=$iv_ruleVariablePublic.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule VariablePublic
+ruleVariablePublic returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getVariablePublicAccess().getUnorderedGroup_1()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePublicAccess().getModifierModifierParserRuleCall_0_0());
+				}
+				lv_modifier_0_0=ruleModifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+					}
+					set(
+						$current,
+						"modifier",
+						lv_modifier_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0);
+					}
+								({true}?=>((
+									(
+										lv_const_2_0='const'
+										{
+											newLeafNode(lv_const_2_0, grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getVariablePublicRule());
+											}
+											setWithLastConsumed($current, "const", true, "const");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_const_3_0='final'
+										{
+											newLeafNode(lv_const_3_0, grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getVariablePublicRule());
+											}
+											setWithLastConsumed($current, "const", true, "final");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1);
+					}
+								({true}?=>((
+									lv_macro_4_0='macro'
+									{
+										newLeafNode(lv_macro_4_0, grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getVariablePublicRule());
+										}
+										setWithLastConsumed($current, "macro", true, "macro");
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+				}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePublicAccess().getVisibilityPublicVariableVisibilityKindEnumRuleCall_2_0());
+				}
+				lv_visibility_5_0=rulePublicVariableVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PublicVariableVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePublicAccess().getTypeDataTypeParserRuleCall_3_0());
+				}
+				lv_type_6_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_6_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePublicAccess().getNameESIdentifierParserRuleCall_4_0());
+				}
+				lv_name_7_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_9='='
+			{
+				newLeafNode(otherlv_9, grammarAccess.getVariablePublicAccess().getEqualsSignKeyword_6_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getVariablePublicAccess().getDefaultValueExpressionParserRuleCall_6_1_0());
+					}
+					lv_defaultValue_10_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_10_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			(
+				otherlv_11='{'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getVariablePublicAccess().getLeftCurlyBracketKeyword_7_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getVariablePublicAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0());
+						}
+						lv_onWriteAction_12_0=ruleOnWriteRoutine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+							}
+							set(
+								$current,
+								"onWriteAction",
+								lv_onWriteAction_12_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_13='}'
+				{
+					newLeafNode(otherlv_13, grammarAccess.getVariablePublicAccess().getRightCurlyBracketKeyword_7_0_2());
+				}
+			)
+			    |
+			otherlv_14=';'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getVariablePublicAccess().getSemicolonKeyword_7_1());
+			}
+		)
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleVariableProtected
+entryRuleVariableProtected returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getVariableProtectedRule()); }
+	iv_ruleVariableProtected=ruleVariableProtected
+	{ $current=$iv_ruleVariableProtected.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule VariableProtected
+ruleVariableProtected returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableProtectedAccess().getModifierModifierParserRuleCall_0_0());
+				}
+				lv_modifier_0_0=ruleModifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+					}
+					set(
+						$current,
+						"modifier",
+						lv_modifier_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0);
+					}
+								({true}?=>((
+									(
+										lv_const_2_0='const'
+										{
+											newLeafNode(lv_const_2_0, grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getVariableProtectedRule());
+											}
+											setWithLastConsumed($current, "const", true, "const");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_const_3_0='final'
+										{
+											newLeafNode(lv_const_3_0, grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getVariableProtectedRule());
+											}
+											setWithLastConsumed($current, "const", true, "final");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1);
+					}
+								({true}?=>((
+									lv_macro_4_0='macro'
+									{
+										newLeafNode(lv_macro_4_0, grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getVariableProtectedRule());
+										}
+										setWithLastConsumed($current, "macro", true, "macro");
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+				}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableProtectedAccess().getVisibilityProtectedVariableVisibilityKindEnumRuleCall_2_0());
+				}
+				lv_visibility_5_0=ruleProtectedVariableVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedVariableVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableProtectedAccess().getTypeDataTypeParserRuleCall_3_0());
+				}
+				lv_type_6_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_6_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableProtectedAccess().getNameESIdentifierParserRuleCall_4_0());
+				}
+				lv_name_7_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_9='='
+			{
+				newLeafNode(otherlv_9, grammarAccess.getVariableProtectedAccess().getEqualsSignKeyword_6_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getVariableProtectedAccess().getDefaultValueExpressionParserRuleCall_6_1_0());
+					}
+					lv_defaultValue_10_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_10_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			(
+				otherlv_11='{'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getVariableProtectedAccess().getLeftCurlyBracketKeyword_7_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getVariableProtectedAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0());
+						}
+						lv_onWriteAction_12_0=ruleOnWriteRoutine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+							}
+							set(
+								$current,
+								"onWriteAction",
+								lv_onWriteAction_12_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_13='}'
+				{
+					newLeafNode(otherlv_13, grammarAccess.getVariableProtectedAccess().getRightCurlyBracketKeyword_7_0_2());
+				}
+			)
+			    |
+			otherlv_14=';'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getVariableProtectedAccess().getSemicolonKeyword_7_1());
+			}
+		)
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleVariablePrivate
+entryRuleVariablePrivate returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getVariablePrivateRule()); }
+	iv_ruleVariablePrivate=ruleVariablePrivate
+	{ $current=$iv_ruleVariablePrivate.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule VariablePrivate
+ruleVariablePrivate returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePrivateAccess().getModifierModifierParserRuleCall_0_0());
+				}
+				lv_modifier_0_0=ruleModifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+					}
+					set(
+						$current,
+						"modifier",
+						lv_modifier_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0);
+					}
+								({true}?=>((
+									(
+										lv_const_2_0='const'
+										{
+											newLeafNode(lv_const_2_0, grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getVariablePrivateRule());
+											}
+											setWithLastConsumed($current, "const", true, "const");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_const_3_0='final'
+										{
+											newLeafNode(lv_const_3_0, grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getVariablePrivateRule());
+											}
+											setWithLastConsumed($current, "const", true, "final");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1);
+					}
+								({true}?=>((
+									lv_macro_4_0='macro'
+									{
+										newLeafNode(lv_macro_4_0, grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getVariablePrivateRule());
+										}
+										setWithLastConsumed($current, "macro", true, "macro");
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+				}
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePrivateAccess().getVisibilityPrivateVariableVisibilityKindEnumRuleCall_2_0());
+				}
+				lv_visibility_5_0=rulePrivateVariableVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrivateVariableVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePrivateAccess().getTypeDataTypeParserRuleCall_3_0());
+				}
+				lv_type_6_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_6_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePrivateAccess().getNameESIdentifierParserRuleCall_4_0());
+				}
+				lv_name_7_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_7_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
+				}
+				lv_unrestrictedName_8_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_8_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_9='='
+			{
+				newLeafNode(otherlv_9, grammarAccess.getVariablePrivateAccess().getEqualsSignKeyword_6_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getVariablePrivateAccess().getDefaultValueExpressionParserRuleCall_6_1_0());
+					}
+					lv_defaultValue_10_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_10_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		(
+			(
+				otherlv_11='{'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getVariablePrivateAccess().getLeftCurlyBracketKeyword_7_0_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getVariablePrivateAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0());
+						}
+						lv_onWriteAction_12_0=ruleOnWriteRoutine
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+							}
+							set(
+								$current,
+								"onWriteAction",
+								lv_onWriteAction_12_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_13='}'
+				{
+					newLeafNode(otherlv_13, grammarAccess.getVariablePrivateAccess().getRightCurlyBracketKeyword_7_0_2());
+				}
+			)
+			    |
+			otherlv_14=';'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getVariablePrivateAccess().getSemicolonKeyword_7_1());
+			}
+		)
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleFunctionalParameterSet
+entryRuleFunctionalParameterSet returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getFunctionalParameterSetRule()); }
+	iv_ruleFunctionalParameterSet=ruleFunctionalParameterSet
+	{ $current=$iv_ruleFunctionalParameterSet.current; }
+	EOF;
+
+// Rule FunctionalParameterSet
+ruleFunctionalParameterSet returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getFunctionalParameterSetAccess().getParameterSetAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_1_0());
+				}
+				lv_parameter_1_0=ruleFunctionalParameter
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFunctionalParameterSetRule());
+					}
+					add(
+						$current,
+						"parameter",
+						lv_parameter_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_2=','
+			{
+				newLeafNode(otherlv_2, grammarAccess.getFunctionalParameterSetAccess().getCommaKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_2_1_0());
+					}
+					lv_parameter_3_0=ruleFunctionalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getFunctionalParameterSetRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleFunctionalParameter
+entryRuleFunctionalParameter returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getFunctionalParameterRule()); }
+	iv_ruleFunctionalParameter=ruleFunctionalParameter
+	{ $current=$iv_ruleFunctionalParameter.current; }
+	EOF;
+
+// Rule FunctionalParameter
+ruleFunctionalParameter returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getFunctionalParameterAccess().getParameterAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFunctionalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0());
+				}
+				lv_direction_1_0=ruleParameterDirectionKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ParameterDirectionKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFunctionalParameterAccess().getTypeDataTypeParserRuleCall_2_0());
+				}
+				lv_type_2_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFunctionalParameterAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_4='='
+			{
+				newLeafNode(otherlv_4, grammarAccess.getFunctionalParameterAccess().getEqualsSignKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getFunctionalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+					}
+					lv_defaultValue_5_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleFormalParameterSet
+entryRuleFormalParameterSet returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getFormalParameterSetRule()); }
+	iv_ruleFormalParameterSet=ruleFormalParameterSet
+	{ $current=$iv_ruleFormalParameterSet.current; }
+	EOF;
+
+// Rule FormalParameterSet
+ruleFormalParameterSet returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getFormalParameterSetAccess().getParameterSetAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_1_0());
+				}
+				lv_parameter_1_0=ruleFormalParameter
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFormalParameterSetRule());
+					}
+					add(
+						$current,
+						"parameter",
+						lv_parameter_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_2=','
+			{
+				newLeafNode(otherlv_2, grammarAccess.getFormalParameterSetAccess().getCommaKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_2_1_0());
+					}
+					lv_parameter_3_0=ruleFormalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getFormalParameterSetRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleFormalParameter
+entryRuleFormalParameter returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getFormalParameterRule()); }
+	iv_ruleFormalParameter=ruleFormalParameter
+	{ $current=$iv_ruleFormalParameter.current; }
+	EOF;
+
+// Rule FormalParameter
+ruleFormalParameter returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getFormalParameterAccess().getParameterAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFormalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0());
+				}
+				lv_direction_1_0=ruleParameterDirectionKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFormalParameterRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ParameterDirectionKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFormalParameterAccess().getTypeDataTypeParserRuleCall_2_0());
+				}
+				lv_type_2_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFormalParameterRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getFormalParameterAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getFormalParameterRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='='
+			{
+				newLeafNode(otherlv_4, grammarAccess.getFormalParameterAccess().getEqualsSignKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getFormalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+					}
+					lv_defaultValue_5_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getFormalParameterRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleParameterInput
+entryRuleParameterInput returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getParameterInputRule()); }
+	iv_ruleParameterInput=ruleParameterInput
+	{ $current=$iv_ruleParameterInput.current; }
+	EOF;
+
+// Rule ParameterInput
+ruleParameterInput returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterInputAccess().getDirectionParameterInputDirectionKindEnumRuleCall_0_0());
+				}
+				lv_direction_0_0=ruleParameterInputDirectionKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterInputRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ParameterInputDirectionKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterInputAccess().getTypeDataTypeParserRuleCall_1_0());
+				}
+				lv_type_1_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterInputRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterInputAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterInputRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterInputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterInputRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='='
+			{
+				newLeafNode(otherlv_4, grammarAccess.getParameterInputAccess().getEqualsSignKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getParameterInputAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+					}
+					lv_defaultValue_5_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getParameterInputRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		otherlv_6=';'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getParameterInputAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleParameterInout
+entryRuleParameterInout returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getParameterInoutRule()); }
+	iv_ruleParameterInout=ruleParameterInout
+	{ $current=$iv_ruleParameterInout.current; }
+	EOF;
+
+// Rule ParameterInout
+ruleParameterInout returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterInoutAccess().getDirectionParameterInoutDirectionKindEnumRuleCall_0_0());
+				}
+				lv_direction_0_0=ruleParameterInoutDirectionKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ParameterInoutDirectionKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterInoutAccess().getTypeDataTypeParserRuleCall_1_0());
+				}
+				lv_type_1_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterInoutAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterInoutAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='='
+			{
+				newLeafNode(otherlv_4, grammarAccess.getParameterInoutAccess().getEqualsSignKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getParameterInoutAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+					}
+					lv_defaultValue_5_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		otherlv_6=';'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getParameterInoutAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleParameterOutput
+entryRuleParameterOutput returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getParameterOutputRule()); }
+	iv_ruleParameterOutput=ruleParameterOutput
+	{ $current=$iv_ruleParameterOutput.current; }
+	EOF;
+
+// Rule ParameterOutput
+ruleParameterOutput returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterOutputAccess().getDirectionParameterOutputDirectionKindEnumRuleCall_0_0());
+				}
+				lv_direction_0_0=ruleParameterOutputDirectionKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutputDirectionKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterOutputAccess().getTypeDataTypeParserRuleCall_1_0());
+				}
+				lv_type_1_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterOutputAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterOutputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='='
+			{
+				newLeafNode(otherlv_4, grammarAccess.getParameterOutputAccess().getEqualsSignKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getParameterOutputAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+					}
+					lv_defaultValue_5_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		otherlv_6=';'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getParameterOutputAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleParameterReturn
+entryRuleParameterReturn returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getParameterReturnRule()); }
+	iv_ruleParameterReturn=ruleParameterReturn
+	{ $current=$iv_ruleParameterReturn.current; }
+	EOF;
+
+// Rule ParameterReturn
+ruleParameterReturn returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterReturnAccess().getDirectionParameterReturnDirectionKindEnumRuleCall_0_0());
+				}
+				lv_direction_0_0=ruleParameterReturnDirectionKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturnDirectionKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterReturnAccess().getTypeDataTypeParserRuleCall_1_0());
+				}
+				lv_type_1_0=ruleDataType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterReturnAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getParameterReturnAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='='
+			{
+				newLeafNode(otherlv_4, grammarAccess.getParameterReturnAccess().getEqualsSignKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getParameterReturnAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+					}
+					lv_defaultValue_5_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+						}
+						set(
+							$current,
+							"defaultValue",
+							lv_defaultValue_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+		otherlv_6=';'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getParameterReturnAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleBufferContainerType
+entryRuleBufferContainerType returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBufferContainerTypeRule()); }
+	iv_ruleBufferContainerType=ruleBufferContainerType
+	{ $current=$iv_ruleBufferContainerType.current; }
+	EOF;
+
+// Rule BufferContainerType
+ruleBufferContainerType returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getBufferContainerTypeAccess().getCollectionTypeAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferContainerTypeAccess().getContainerBufferContainerKindEnumRuleCall_1_0());
+				}
+				lv_container_1_0=ruleBufferContainerKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferContainerTypeRule());
+					}
+					set(
+						$current,
+						"container",
+						lv_container_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_2='<'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getBufferContainerTypeAccess().getLessThanSignKeyword_2_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getBufferContainerTypeAccess().getSizeEIntParserRuleCall_2_1_0_0());
+						}
+						lv_size_3_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getBufferContainerTypeRule());
+							}
+							set(
+								$current,
+								"size",
+								lv_size_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						lv_unbounded_4_0='*'
+						{
+							newLeafNode(lv_unbounded_4_0, grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getBufferContainerTypeRule());
+							}
+							setWithLastConsumed($current, "unbounded", true, "*");
+						}
+					)
+				)
+			)?
+			otherlv_5='>'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getBufferContainerTypeAccess().getGreaterThanSignKeyword_2_2());
+			}
+		)?
+	)
+;
+
+// Entry rule entryRuleBuffer
+entryRuleBuffer returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getBufferAccess().getUnorderedGroup_0()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getBufferRule()); }
+	iv_ruleBuffer=ruleBuffer
+	{ $current=$iv_ruleBuffer.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule Buffer
+ruleBuffer returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getBufferAccess().getUnorderedGroup_0()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getBufferAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+									}
+									lv_visibility_1_0=ruleVisibilityKind
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getBufferRule());
+										}
+										set(
+											$current,
+											"visibility",
+											lv_visibility_1_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getBufferAccess().getModifierModifierParserRuleCall_0_1_0());
+									}
+									lv_modifier_2_0=ruleModifier
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getBufferRule());
+										}
+										set(
+											$current,
+											"modifier",
+											lv_modifier_2_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+				}
+		)
+		otherlv_3='buffer'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getBufferAccess().getBufferKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferAccess().getTypeBufferContainerTypeParserRuleCall_2_0());
+				}
+				lv_type_4_0=ruleBufferContainerType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_5_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_6_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_6_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_7=';'
+		{
+			newLeafNode(otherlv_7, grammarAccess.getBufferAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleBufferPublic
+entryRuleBufferPublic returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBufferPublicRule()); }
+	iv_ruleBufferPublic=ruleBufferPublic
+	{ $current=$iv_ruleBufferPublic.current; }
+	EOF;
+
+// Rule BufferPublic
+ruleBufferPublic returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPublicAccess().getModifierModifierParserRuleCall_0_0());
+				}
+				lv_modifier_0_0=ruleModifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+					}
+					set(
+						$current,
+						"modifier",
+						lv_modifier_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPublicAccess().getVisibilityPublicBufferVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=rulePublicBufferVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PublicBufferVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPublicAccess().getTypeBufferContainerTypeParserRuleCall_2_0());
+				}
+				lv_type_2_0=ruleBufferContainerType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPublicAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_5=';'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getBufferPublicAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleBufferProtected
+entryRuleBufferProtected returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBufferProtectedRule()); }
+	iv_ruleBufferProtected=ruleBufferProtected
+	{ $current=$iv_ruleBufferProtected.current; }
+	EOF;
+
+// Rule BufferProtected
+ruleBufferProtected returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferProtectedAccess().getModifierModifierParserRuleCall_0_0());
+				}
+				lv_modifier_0_0=ruleModifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+					}
+					set(
+						$current,
+						"modifier",
+						lv_modifier_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferProtectedAccess().getVisibilityProtectedBufferVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=ruleProtectedBufferVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedBufferVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferProtectedAccess().getTypeBufferContainerTypeParserRuleCall_2_0());
+				}
+				lv_type_2_0=ruleBufferContainerType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferProtectedAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_5=';'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getBufferProtectedAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleBufferPrivate
+entryRuleBufferPrivate returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBufferPrivateRule()); }
+	iv_ruleBufferPrivate=ruleBufferPrivate
+	{ $current=$iv_ruleBufferPrivate.current; }
+	EOF;
+
+// Rule BufferPrivate
+ruleBufferPrivate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPrivateAccess().getModifierModifierParserRuleCall_0_0());
+				}
+				lv_modifier_0_0=ruleModifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+					}
+					set(
+						$current,
+						"modifier",
+						lv_modifier_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPrivateAccess().getVisibilityPrivateBufferVisibilityKindEnumRuleCall_1_0());
+				}
+				lv_visibility_1_0=rulePrivateBufferVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrivateBufferVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPrivateAccess().getTypeBufferContainerTypeParserRuleCall_2_0());
+				}
+				lv_type_2_0=ruleBufferContainerType
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+					}
+					set(
+						$current,
+						"type",
+						lv_type_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPrivateAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_5=';'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getBufferPrivateAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRulePort
+entryRulePort returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPortRule()); }
+	iv_rulePort=rulePort
+	{ $current=$iv_rulePort.current; }
+	EOF;
+
+// Rule Port
+rulePort returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_1='port'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPortAccess().getPortKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortAccess().getDirectionChannelDirectionEnumRuleCall_2_0());
+				}
+				lv_direction_2_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_5='('
+			{
+				newLeafNode(otherlv_5, grammarAccess.getPortAccess().getLeftParenthesisKeyword_5_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_1_0());
+					}
+					lv_parameter_6_0=ruleFormalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getPortRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_6_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_7=','
+				{
+					newLeafNode(otherlv_7, grammarAccess.getPortAccess().getCommaKeyword_5_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_2_1_0());
+						}
+						lv_parameter_8_0=ruleFormalParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPortRule());
+							}
+							add(
+								$current,
+								"parameter",
+								lv_parameter_8_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_9=')'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getPortAccess().getRightParenthesisKeyword_5_3());
+			}
+		)?
+		otherlv_10=';'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getPortAccess().getSemicolonKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRulePortPublic
+entryRulePortPublic returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPortPublicRule()); }
+	iv_rulePortPublic=rulePortPublic
+	{ $current=$iv_rulePortPublic.current; }
+	EOF;
+
+// Rule PortPublic
+rulePortPublic returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortPublicAccess().getVisibilityPublicPortVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=rulePublicPortVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortPublicRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PublicPortVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+				}
+				lv_direction_1_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortPublicRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortPublicAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortPublicRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortPublicRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='('
+			{
+				newLeafNode(otherlv_4, grammarAccess.getPortPublicAccess().getLeftParenthesisKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+					}
+					lv_parameter_5_0=ruleFormalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getPortPublicRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_6=','
+				{
+					newLeafNode(otherlv_6, grammarAccess.getPortPublicAccess().getCommaKeyword_4_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+						}
+						lv_parameter_7_0=ruleFormalParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPortPublicRule());
+							}
+							add(
+								$current,
+								"parameter",
+								lv_parameter_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getPortPublicAccess().getRightParenthesisKeyword_4_3());
+			}
+		)?
+		otherlv_9=';'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getPortPublicAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRulePortProtected
+entryRulePortProtected returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPortProtectedRule()); }
+	iv_rulePortProtected=rulePortProtected
+	{ $current=$iv_rulePortProtected.current; }
+	EOF;
+
+// Rule PortProtected
+rulePortProtected returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortProtectedAccess().getVisibilityProtectedPortVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=ruleProtectedPortVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedPortVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+				}
+				lv_direction_1_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortProtectedAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='('
+			{
+				newLeafNode(otherlv_4, grammarAccess.getPortProtectedAccess().getLeftParenthesisKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+					}
+					lv_parameter_5_0=ruleFormalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_6=','
+				{
+					newLeafNode(otherlv_6, grammarAccess.getPortProtectedAccess().getCommaKeyword_4_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+						}
+						lv_parameter_7_0=ruleFormalParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+							}
+							add(
+								$current,
+								"parameter",
+								lv_parameter_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getPortProtectedAccess().getRightParenthesisKeyword_4_3());
+			}
+		)?
+		otherlv_9=';'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getPortProtectedAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRulePortPrivate
+entryRulePortPrivate returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPortPrivateRule()); }
+	iv_rulePortPrivate=rulePortPrivate
+	{ $current=$iv_rulePortPrivate.current; }
+	EOF;
+
+// Rule PortPrivate
+rulePortPrivate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortPrivateAccess().getVisibilityPrivatePortVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=rulePrivatePortVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrivatePortVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+				}
+				lv_direction_1_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortPrivateAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPortPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='('
+			{
+				newLeafNode(otherlv_4, grammarAccess.getPortPrivateAccess().getLeftParenthesisKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+					}
+					lv_parameter_5_0=ruleFormalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_6=','
+				{
+					newLeafNode(otherlv_6, grammarAccess.getPortPrivateAccess().getCommaKeyword_4_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+						}
+						lv_parameter_7_0=ruleFormalParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+							}
+							add(
+								$current,
+								"parameter",
+								lv_parameter_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getPortPrivateAccess().getRightParenthesisKeyword_4_3());
+			}
+		)?
+		otherlv_9=';'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getPortPrivateAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleSignal
+entryRuleSignal returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSignalRule()); }
+	iv_ruleSignal=ruleSignal
+	{ $current=$iv_ruleSignal.current; }
+	EOF;
+
+// Rule Signal
+ruleSignal returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_1='signal'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getSignalAccess().getSignalKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalAccess().getDirectionChannelDirectionEnumRuleCall_2_0());
+				}
+				lv_direction_2_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalAccess().getNameESIdentifierParserRuleCall_3_0());
+				}
+				lv_name_3_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+				}
+				lv_unrestrictedName_4_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_5='('
+			{
+				newLeafNode(otherlv_5, grammarAccess.getSignalAccess().getLeftParenthesisKeyword_5_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_1_0());
+					}
+					lv_parameter_6_0=ruleFormalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSignalRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_6_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_7=','
+				{
+					newLeafNode(otherlv_7, grammarAccess.getSignalAccess().getCommaKeyword_5_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_2_1_0());
+						}
+						lv_parameter_8_0=ruleFormalParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSignalRule());
+							}
+							add(
+								$current,
+								"parameter",
+								lv_parameter_8_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_9=')'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getSignalAccess().getRightParenthesisKeyword_5_3());
+			}
+		)?
+		otherlv_10=';'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getSignalAccess().getSemicolonKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRuleSignalPublic
+entryRuleSignalPublic returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSignalPublicRule()); }
+	iv_ruleSignalPublic=ruleSignalPublic
+	{ $current=$iv_ruleSignalPublic.current; }
+	EOF;
+
+// Rule SignalPublic
+ruleSignalPublic returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalPublicAccess().getVisibilityPublicSignalVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=rulePublicSignalVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PublicSignalVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+				}
+				lv_direction_1_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalPublicAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='('
+			{
+				newLeafNode(otherlv_4, grammarAccess.getSignalPublicAccess().getLeftParenthesisKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+					}
+					lv_parameter_5_0=ruleFormalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_6=','
+				{
+					newLeafNode(otherlv_6, grammarAccess.getSignalPublicAccess().getCommaKeyword_4_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+						}
+						lv_parameter_7_0=ruleFormalParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+							}
+							add(
+								$current,
+								"parameter",
+								lv_parameter_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getSignalPublicAccess().getRightParenthesisKeyword_4_3());
+			}
+		)?
+		otherlv_9=';'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getSignalPublicAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleSignalProtected
+entryRuleSignalProtected returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSignalProtectedRule()); }
+	iv_ruleSignalProtected=ruleSignalProtected
+	{ $current=$iv_ruleSignalProtected.current; }
+	EOF;
+
+// Rule SignalProtected
+ruleSignalProtected returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalProtectedAccess().getVisibilityProtectedSignalVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=ruleProtectedSignalVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedSignalVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+				}
+				lv_direction_1_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalProtectedAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='('
+			{
+				newLeafNode(otherlv_4, grammarAccess.getSignalProtectedAccess().getLeftParenthesisKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+					}
+					lv_parameter_5_0=ruleFormalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_6=','
+				{
+					newLeafNode(otherlv_6, grammarAccess.getSignalProtectedAccess().getCommaKeyword_4_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+						}
+						lv_parameter_7_0=ruleFormalParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+							}
+							add(
+								$current,
+								"parameter",
+								lv_parameter_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getSignalProtectedAccess().getRightParenthesisKeyword_4_3());
+			}
+		)?
+		otherlv_9=';'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getSignalProtectedAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleSignalPrivate
+entryRuleSignalPrivate returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSignalPrivateRule()); }
+	iv_ruleSignalPrivate=ruleSignalPrivate
+	{ $current=$iv_ruleSignalPrivate.current; }
+	EOF;
+
+// Rule SignalPrivate
+ruleSignalPrivate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalPrivateAccess().getVisibilityPrivateSignalVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=rulePrivateSignalVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrivateSignalVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+				}
+				lv_direction_1_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalPrivateAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			otherlv_4='('
+			{
+				newLeafNode(otherlv_4, grammarAccess.getSignalPrivateAccess().getLeftParenthesisKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+					}
+					lv_parameter_5_0=ruleFormalParameter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+						}
+						add(
+							$current,
+							"parameter",
+							lv_parameter_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_6=','
+				{
+					newLeafNode(otherlv_6, grammarAccess.getSignalPrivateAccess().getCommaKeyword_4_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+						}
+						lv_parameter_7_0=ruleFormalParameter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+							}
+							add(
+								$current,
+								"parameter",
+								lv_parameter_7_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_8=')'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getSignalPrivateAccess().getRightParenthesisKeyword_4_3());
+			}
+		)?
+		otherlv_9=';'
+		{
+			newLeafNode(otherlv_9, grammarAccess.getSignalPrivateAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleChannel
+entryRuleChannel returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getChannelRule()); }
+	iv_ruleChannel=ruleChannel
+	{ $current=$iv_ruleChannel.current; }
+	EOF;
+
+// Rule Channel
+ruleChannel returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=ruleVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_1='channel'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getChannelAccess().getChannelKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelAccess().getNameESIdentifierParserRuleCall_2_0());
+				}
+				lv_name_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+				}
+				lv_unrestrictedName_3_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_4='{'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getChannelAccess().getLeftCurlyBracketKeyword_4());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getChannelAccess().getSignalSignalReferenceParserRuleCall_5_0_0());
+					}
+					lv_signal_5_0=ruleSignalReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getChannelRule());
+						}
+						add(
+							$current,
+							"signal",
+							lv_signal_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_6=';'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getChannelAccess().getSemicolonKeyword_5_1());
+			}
+		)+
+		otherlv_7='}'
+		{
+			newLeafNode(otherlv_7, grammarAccess.getChannelAccess().getRightCurlyBracketKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRuleSignalReference
+entryRuleSignalReference returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getSignalReferenceRule()); }
+	iv_ruleSignalReference=ruleSignalReference
+	{ $current=$iv_ruleSignalReference.current; }
+	EOF;
+
+// Rule SignalReference
+ruleSignalReference returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalReferenceAccess().getDirectionChannelDirectionEnumRuleCall_0_0());
+				}
+				lv_direction_0_0=ruleChannelDirection
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalReferenceRule());
+					}
+					set(
+						$current,
+						"direction",
+						lv_direction_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSignalReferenceAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSignalReferenceRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleChannelPublic
+entryRuleChannelPublic returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getChannelPublicRule()); }
+	iv_ruleChannelPublic=ruleChannelPublic
+	{ $current=$iv_ruleChannelPublic.current; }
+	EOF;
+
+// Rule ChannelPublic
+ruleChannelPublic returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelPublicAccess().getVisibilityPublicChannelVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=rulePublicChannelVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelPublicRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PublicChannelVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelPublicAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelPublicRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelPublicRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_3='{'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getChannelPublicAccess().getLeftCurlyBracketKeyword_3());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getChannelPublicAccess().getSignalSignalReferenceParserRuleCall_4_0_0());
+					}
+					lv_signal_4_0=ruleSignalReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getChannelPublicRule());
+						}
+						add(
+							$current,
+							"signal",
+							lv_signal_4_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_5=';'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getChannelPublicAccess().getSemicolonKeyword_4_1());
+			}
+		)+
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getChannelPublicAccess().getRightCurlyBracketKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleChannelProtected
+entryRuleChannelProtected returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getChannelProtectedRule()); }
+	iv_ruleChannelProtected=ruleChannelProtected
+	{ $current=$iv_ruleChannelProtected.current; }
+	EOF;
+
+// Rule ChannelProtected
+ruleChannelProtected returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelProtectedAccess().getVisibilityProtectedChannelVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=ruleProtectedChannelVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelProtectedRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedChannelVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelProtectedAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelProtectedRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelProtectedRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_3='{'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getChannelProtectedAccess().getLeftCurlyBracketKeyword_3());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getChannelProtectedAccess().getSignalSignalReferenceParserRuleCall_4_0_0());
+					}
+					lv_signal_4_0=ruleSignalReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getChannelProtectedRule());
+						}
+						add(
+							$current,
+							"signal",
+							lv_signal_4_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_5=';'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getChannelProtectedAccess().getSemicolonKeyword_4_1());
+			}
+		)+
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getChannelProtectedAccess().getRightCurlyBracketKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleChannelPrivate
+entryRuleChannelPrivate returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getChannelPrivateRule()); }
+	iv_ruleChannelPrivate=ruleChannelPrivate
+	{ $current=$iv_ruleChannelPrivate.current; }
+	EOF;
+
+// Rule ChannelPrivate
+ruleChannelPrivate returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelPrivateAccess().getVisibilityPrivateChannelVisibilityKindEnumRuleCall_0_0());
+				}
+				lv_visibility_0_0=rulePrivateChannelVisibilityKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelPrivateRule());
+					}
+					set(
+						$current,
+						"visibility",
+						lv_visibility_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.PrivateChannelVisibilityKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelPrivateAccess().getNameESIdentifierParserRuleCall_1_0());
+				}
+				lv_name_1_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelPrivateRule());
+					}
+					set(
+						$current,
+						"name",
+						lv_name_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+				}
+				lv_unrestrictedName_2_0=ruleUnrestrictedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getChannelPrivateRule());
+					}
+					set(
+						$current,
+						"unrestrictedName",
+						lv_unrestrictedName_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_3='{'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getChannelPrivateAccess().getLeftCurlyBracketKeyword_3());
+		}
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getChannelPrivateAccess().getSignalSignalReferenceParserRuleCall_4_0_0());
+					}
+					lv_signal_4_0=ruleSignalReference
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getChannelPrivateRule());
+						}
+						add(
+							$current,
+							"signal",
+							lv_signal_4_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_5=';'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getChannelPrivateAccess().getSemicolonKeyword_4_1());
+			}
+		)+
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getChannelPrivateAccess().getRightCurlyBracketKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleTransition
+entryRuleTransition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionRule()); }
+	iv_ruleTransition=ruleTransition
+	{ $current=$iv_ruleTransition.current; }
+	EOF;
+
+// Rule Transition
+ruleTransition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getTransitionAccess().getTransitionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_transient_1_0='transient'
+				{
+					newLeafNode(lv_transient_1_0, grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getTransitionRule());
+					}
+					setWithLastConsumed($current, "transient", true, "transient");
+				}
+			)
+		)?
+		otherlv_2='transition'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getTransitionAccess().getTransitionKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getTransitionAccess().getMoeTransitionMoeParserRuleCall_3_0());
+				}
+				lv_moe_3_0=ruleTransitionMoe
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getTransitionRule());
+					}
+					set(
+						$current,
+						"moe",
+						lv_moe_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.TransitionMoe");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getTransitionAccess().getNameESIdentifierParserRuleCall_4_0_0());
+					}
+					lv_name_4_0=ruleESIdentifier
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getTransitionRule());
+						}
+						set(
+							$current,
+							"name",
+							lv_name_4_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getTransitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0());
+					}
+					lv_unrestrictedName_5_0=ruleUnrestrictedName
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getTransitionRule());
+						}
+						set(
+							$current,
+							"unrestrictedName",
+							lv_unrestrictedName_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+		)?
+		(
+			(
+				otherlv_6='{'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_0_0());
+				}
+				(
+					(
+						(
+							otherlv_7='@trigger:'
+							{
+								newLeafNode(otherlv_7, grammarAccess.getTransitionAccess().getTriggerKeyword_5_0_1_0_0_0());
+							}
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_0_1_0_0_1_0());
+									}
+									lv_trigger_8_0=ruleTransitionTrigger
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getTransitionRule());
+										}
+										add(
+											$current,
+											"trigger",
+											lv_trigger_8_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.TransitionTrigger");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)*
+						)?
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_0_1_0_1_0_0());
+									}
+									lv_guard_9_0=ruleTransitionGuard
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getTransitionRule());
+										}
+										set(
+											$current,
+											"guard",
+											lv_guard_9_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuard");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							otherlv_10='@guard:'
+							{
+								newLeafNode(otherlv_10, grammarAccess.getTransitionAccess().getGuardKeyword_5_0_1_0_1_1());
+							}
+						)?
+						(
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_0_1_0_2_0_0());
+									}
+									lv_tguard_11_0=ruleTransitionTimedGuard
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getTransitionRule());
+										}
+										set(
+											$current,
+											"tguard",
+											lv_tguard_11_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.TransitionTimedGuard");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							    |
+							otherlv_12='@tguard:'
+							{
+								newLeafNode(otherlv_12, grammarAccess.getTransitionAccess().getTguardKeyword_5_0_1_0_2_1());
+							}
+						)?
+						otherlv_13='@effect:'
+						{
+							newLeafNode(otherlv_13, grammarAccess.getTransitionAccess().getEffectKeyword_5_0_1_0_3());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_0_1_0_4_0());
+								}
+								lv_effect_14_0=ruleTransitionEffect
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getTransitionRule());
+									}
+									set(
+										$current,
+										"effect",
+										lv_effect_14_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.TransitionEffect");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)?
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0());
+							}
+							lv_behavior_15_0=ruleTransitionBehavior
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getTransitionRule());
+								}
+								set(
+									$current,
+									"behavior",
+									lv_behavior_15_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.TransitionBehavior");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)?
+				otherlv_16='}'
+				{
+					newLeafNode(otherlv_16, grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_0_2());
+				}
+				(
+					otherlv_17='-->'
+					{
+						newLeafNode(otherlv_17, grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_0_3_0());
+					}
+					(
+						(
+							{
+								/* */
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getTransitionRule());
+								}
+							}
+							{
+								newCompositeNode(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_0_3_1_0());
+							}
+							ruleESUfid
+							{
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_19=';'
+					{
+						newLeafNode(otherlv_19, grammarAccess.getTransitionAccess().getSemicolonKeyword_5_0_3_2());
+					}
+				)?
+			)
+			    |
+			(
+				otherlv_20='-->'
+				{
+					newLeafNode(otherlv_20, grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0());
+				}
+				(
+					(
+						{
+							/* */
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getTransitionRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_1_1_0());
+						}
+						ruleESUfid
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						otherlv_22='{'
+						{
+							newLeafNode(otherlv_22, grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_1_2_0_0());
+						}
+						(
+							(
+								(
+									otherlv_23='@trigger:'
+									{
+										newLeafNode(otherlv_23, grammarAccess.getTransitionAccess().getTriggerKeyword_5_1_2_0_1_0_0_0());
+									}
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_1_2_0_1_0_0_1_0());
+											}
+											lv_trigger_24_0=ruleTransitionTrigger
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getTransitionRule());
+												}
+												add(
+													$current,
+													"trigger",
+													lv_trigger_24_0,
+													"org.eclipse.efm.formalml.xtext.FormalML.TransitionTrigger");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)*
+								)?
+								(
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_1_2_0_1_0_1_0_0());
+											}
+											lv_guard_25_0=ruleTransitionGuard
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getTransitionRule());
+												}
+												set(
+													$current,
+													"guard",
+													lv_guard_25_0,
+													"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuard");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									    |
+									otherlv_26='@guard:'
+									{
+										newLeafNode(otherlv_26, grammarAccess.getTransitionAccess().getGuardKeyword_5_1_2_0_1_0_1_1());
+									}
+								)?
+								(
+									(
+										(
+											{
+												newCompositeNode(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_1_2_0_1_0_2_0_0());
+											}
+											lv_tguard_27_0=ruleTransitionTimedGuard
+											{
+												if ($current==null) {
+													$current = createModelElementForParent(grammarAccess.getTransitionRule());
+												}
+												set(
+													$current,
+													"tguard",
+													lv_tguard_27_0,
+													"org.eclipse.efm.formalml.xtext.FormalML.TransitionTimedGuard");
+												afterParserOrEnumRuleCall();
+											}
+										)
+									)
+									    |
+									otherlv_28='@tguard:'
+									{
+										newLeafNode(otherlv_28, grammarAccess.getTransitionAccess().getTguardKeyword_5_1_2_0_1_0_2_1());
+									}
+								)?
+								otherlv_29='@effect:'
+								{
+									newLeafNode(otherlv_29, grammarAccess.getTransitionAccess().getEffectKeyword_5_1_2_0_1_0_3());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_1_2_0_1_0_4_0());
+										}
+										lv_effect_30_0=ruleTransitionEffect
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getTransitionRule());
+											}
+											set(
+												$current,
+												"effect",
+												lv_effect_30_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.TransitionEffect");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)?
+							)
+							    |
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0());
+									}
+									lv_behavior_31_0=ruleTransitionBehavior
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getTransitionRule());
+										}
+										set(
+											$current,
+											"behavior",
+											lv_behavior_31_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.TransitionBehavior");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+						)?
+						otherlv_32='}'
+						{
+							newLeafNode(otherlv_32, grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_1_2_0_2());
+						}
+					)
+					    |
+					otherlv_33=';'
+					{
+						newLeafNode(otherlv_33, grammarAccess.getTransitionAccess().getSemicolonKeyword_5_1_2_1());
+					}
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleTransitionMoe
+entryRuleTransitionMoe returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionMoeRule()); }
+	iv_ruleTransitionMoe=ruleTransitionMoe
+	{ $current=$iv_ruleTransitionMoe.current; }
+	EOF;
+
+// Rule TransitionMoe
+ruleTransitionMoe returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='<'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getTransitionMoeAccess().getLessThanSignKeyword_0());
+		}
+		(
+			(
+				(
+					otherlv_1='moc:'
+					{
+						newLeafNode(otherlv_1, grammarAccess.getTransitionMoeAccess().getMocKeyword_1_0_0());
+					}
+				)?
+				(
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getTransitionMoeAccess().getMocTransitionMocEnumRuleCall_1_0_1_0_0_0());
+								}
+								lv_moc_2_0=ruleTransitionMoc
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getTransitionMoeRule());
+									}
+									set(
+										$current,
+										"moc",
+										lv_moc_2_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.TransitionMoc");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						(
+							otherlv_3='&'
+							{
+								newLeafNode(otherlv_3, grammarAccess.getTransitionMoeAccess().getAmpersandKeyword_1_0_1_0_1_0());
+							}
+							(
+								(
+									lv_isElse_4_0='else'
+									{
+										newLeafNode(lv_isElse_4_0, grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getTransitionMoeRule());
+										}
+										setWithLastConsumed($current, "isElse", true, "else");
+									}
+								)
+							)
+						)?
+					)
+					    |
+					(
+						(
+							lv_isElse_5_0='else'
+							{
+								newLeafNode(lv_isElse_5_0, grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getTransitionMoeRule());
+								}
+								setWithLastConsumed($current, "isElse", true, "else");
+							}
+						)
+					)
+				)
+				(
+					otherlv_6=','
+					{
+						newLeafNode(otherlv_6, grammarAccess.getTransitionMoeAccess().getCommaKeyword_1_0_2_0());
+					}
+					(
+						otherlv_7='prior:'
+						{
+							newLeafNode(otherlv_7, grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_0_2_1());
+						}
+					)?
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_0_2_2_0());
+							}
+							lv_prior_8_0=ruleEInt
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getTransitionMoeRule());
+								}
+								set(
+									$current,
+									"prior",
+									lv_prior_8_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)?
+			)
+			    |
+			(
+				(
+					otherlv_9='prior:'
+					{
+						newLeafNode(otherlv_9, grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_1_0());
+					}
+				)?
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_1_1_0());
+						}
+						lv_prior_10_0=ruleEInt
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getTransitionMoeRule());
+							}
+							set(
+								$current,
+								"prior",
+								lv_prior_10_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)
+		otherlv_11='>'
+		{
+			newLeafNode(otherlv_11, grammarAccess.getTransitionMoeAccess().getGreaterThanSignKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleTransitionBehavior
+entryRuleTransitionBehavior returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionBehaviorRule()); }
+	iv_ruleTransitionBehavior=ruleTransitionBehavior
+	{ $current=$iv_ruleTransitionBehavior.current; }
+	EOF;
+
+// Rule TransitionBehavior
+ruleTransitionBehavior returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getTransitionBehaviorAccess().getBlockStatementAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getTransitionBehaviorAccess().getOpBlockStatementSchedulerParserRuleCall_1_0());
+				}
+				lv_op_1_0=ruleBlockStatementScheduler
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getTransitionBehaviorRule());
+					}
+					set(
+						$current,
+						"op",
+						lv_op_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatementScheduler");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getTransitionBehaviorAccess().getStatementStatementParserRuleCall_2_0());
+				}
+				lv_statement_2_0=ruleStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getTransitionBehaviorRule());
+					}
+					add(
+						$current,
+						"statement",
+						lv_statement_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Statement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleTransitionTrigger
+entryRuleTransitionTrigger returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionTriggerRule()); }
+	iv_ruleTransitionTrigger=ruleTransitionTrigger
+	{ $current=$iv_ruleTransitionTrigger.current; }
+	EOF;
+
+// Rule TransitionTrigger
+ruleTransitionTrigger returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	{
+		/* */
+	}
+	{
+		newCompositeNode(grammarAccess.getTransitionTriggerAccess().getInputComStatementParserRuleCall());
+	}
+	this_InputComStatement_0=ruleInputComStatement
+	{
+		$current = $this_InputComStatement_0.current;
+		afterParserOrEnumRuleCall();
+	}
+;
+
+// Entry rule entryRuleTransitionGuard
+entryRuleTransitionGuard returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionGuardRule()); }
+	iv_ruleTransitionGuard=ruleTransitionGuard
+	{ $current=$iv_ruleTransitionGuard.current; }
+	EOF;
+
+// Rule TransitionGuard
+ruleTransitionGuard returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getTransitionGuardAccess().getGuardStatementAction_0_0(),
+						$current);
+				}
+			)
+			otherlv_1='@guard<'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getTransitionGuardAccess().getGuardKeyword_0_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getTransitionGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0());
+					}
+					lv_condition_2_0=ruleTransitionGuardExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getTransitionGuardRule());
+						}
+						set(
+							$current,
+							"condition",
+							lv_condition_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuardExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		    |
+		(
+			otherlv_3='@guard:'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getTransitionGuardAccess().getGuardKeyword_1_0());
+			}
+			(
+				(
+					(
+						{
+							/* */
+						}
+						{
+							$current = forceCreateModelElement(
+								grammarAccess.getTransitionGuardAccess().getGuardStatementAction_1_1_0_0(),
+								$current);
+						}
+					)
+					(
+						(
+							otherlv_5='['
+							{
+								newLeafNode(otherlv_5, grammarAccess.getTransitionGuardAccess().getLeftSquareBracketKeyword_1_1_0_1_0_0());
+							}
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0());
+									}
+									lv_condition_6_0=ruleExpression
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getTransitionGuardRule());
+										}
+										set(
+											$current,
+											"condition",
+											lv_condition_6_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							otherlv_7=']'
+							{
+								newLeafNode(otherlv_7, grammarAccess.getTransitionGuardAccess().getRightSquareBracketKeyword_1_1_0_1_0_2());
+							}
+						)
+						    |
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0());
+								}
+								lv_condition_8_0=ruleExpression
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getTransitionGuardRule());
+									}
+									set(
+										$current,
+										"condition",
+										lv_condition_8_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+				)
+				    |
+				{
+					/* */
+				}
+				{
+					newCompositeNode(grammarAccess.getTransitionGuardAccess().getGuardStatementParserRuleCall_1_1_1());
+				}
+				this_GuardStatement_9=ruleGuardStatement
+				{
+					$current = $this_GuardStatement_9.current;
+					afterParserOrEnumRuleCall();
+				}
+				    |
+				{
+					/* */
+				}
+				{
+					newCompositeNode(grammarAccess.getTransitionGuardAccess().getEventGuardStatementParserRuleCall_1_1_2());
+				}
+				this_EventGuardStatement_10=ruleEventGuardStatement
+				{
+					$current = $this_EventGuardStatement_10.current;
+					afterParserOrEnumRuleCall();
+				}
+				    |
+				{
+					/* */
+				}
+				{
+					newCompositeNode(grammarAccess.getTransitionGuardAccess().getCheckSatGuardStatementParserRuleCall_1_1_3());
+				}
+				this_CheckSatGuardStatement_11=ruleCheckSatGuardStatement
+				{
+					$current = $this_CheckSatGuardStatement_11.current;
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleTransitionGuardExpression
+entryRuleTransitionGuardExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionGuardExpressionRule()); }
+	iv_ruleTransitionGuardExpression=ruleTransitionGuardExpression
+	{ $current=$iv_ruleTransitionGuardExpression.current; }
+	EOF;
+
+// Rule TransitionGuardExpression
+ruleTransitionGuardExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getTransitionGuardExpressionAccess().getLogicalAssociativeExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					lv_operator_1_1='&&'
+					{
+						newLeafNode(lv_operator_1_1, grammarAccess.getTransitionGuardExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_1_1, null);
+					}
+					    |
+					lv_operator_1_2='and'
+					{
+						newLeafNode(lv_operator_1_2, grammarAccess.getTransitionGuardExpressionAccess().getOperatorAndKeyword_1_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_1_2, null);
+					}
+					    |
+					lv_operator_1_3='||'
+					{
+						newLeafNode(lv_operator_1_3, grammarAccess.getTransitionGuardExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_0_2());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_1_3, null);
+					}
+					    |
+					lv_operator_1_4='or'
+					{
+						newLeafNode(lv_operator_1_4, grammarAccess.getTransitionGuardExpressionAccess().getOperatorOrKeyword_1_0_3());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_1_4, null);
+					}
+				)
+			)
+		)
+		otherlv_2='>:'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getTransitionGuardExpressionAccess().getGreaterThanSignColonKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getTransitionGuardExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_3_0());
+				}
+				lv_operand_3_0=ruleBitwiseOrExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getTransitionGuardExpressionRule());
+					}
+					add(
+						$current,
+						"operand",
+						lv_operand_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)+
+	)
+;
+
+// Entry rule entryRuleTransitionTimedGuard
+entryRuleTransitionTimedGuard returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionTimedGuardRule()); }
+	iv_ruleTransitionTimedGuard=ruleTransitionTimedGuard
+	{ $current=$iv_ruleTransitionTimedGuard.current; }
+	EOF;
+
+// Rule TransitionTimedGuard
+ruleTransitionTimedGuard returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_0_0(),
+						$current);
+				}
+			)
+			otherlv_1='@tguard<'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_0_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0());
+					}
+					lv_condition_2_0=ruleTransitionGuardExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getTransitionTimedGuardRule());
+						}
+						set(
+							$current,
+							"condition",
+							lv_condition_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuardExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		    |
+		(
+			otherlv_3='@tguard:'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_1_0());
+			}
+			(
+				(
+					(
+						{
+							/* */
+						}
+						{
+							$current = forceCreateModelElement(
+								grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_1_1_0_0(),
+								$current);
+						}
+					)
+					(
+						(
+							otherlv_5='{'
+							{
+								newLeafNode(otherlv_5, grammarAccess.getTransitionTimedGuardAccess().getLeftCurlyBracketKeyword_1_1_0_1_0_0());
+							}
+							(
+								(
+									{
+										newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0());
+									}
+									lv_condition_6_0=ruleExpression
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getTransitionTimedGuardRule());
+										}
+										set(
+											$current,
+											"condition",
+											lv_condition_6_0,
+											"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+										afterParserOrEnumRuleCall();
+									}
+								)
+							)
+							otherlv_7='}'
+							{
+								newLeafNode(otherlv_7, grammarAccess.getTransitionTimedGuardAccess().getRightCurlyBracketKeyword_1_1_0_1_0_2());
+							}
+						)
+						    |
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0());
+								}
+								lv_condition_8_0=ruleExpression
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getTransitionTimedGuardRule());
+									}
+									set(
+										$current,
+										"condition",
+										lv_condition_8_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)
+				)
+				    |
+				{
+					/* */
+				}
+				{
+					newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementParserRuleCall_1_1_1());
+				}
+				this_TimedGuardStatement_9=ruleTimedGuardStatement
+				{
+					$current = $this_TimedGuardStatement_9.current;
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleTransitionEffect
+entryRuleTransitionEffect returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionEffectRule()); }
+	iv_ruleTransitionEffect=ruleTransitionEffect
+	{ $current=$iv_ruleTransitionEffect.current; }
+	EOF;
+
+// Rule TransitionEffect
+ruleTransitionEffect returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectAccess().getTransitionEffectStatementParserRuleCall_0());
+		}
+		this_TransitionEffectStatement_0=ruleTransitionEffectStatement
+		{
+			$current = $this_TransitionEffectStatement_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getTransitionEffectAccess().getBlockStatementStatementAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getTransitionEffectAccess().getStatementTransitionEffectStatementParserRuleCall_1_1_0());
+					}
+					lv_statement_2_0=ruleTransitionEffectStatement
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getTransitionEffectRule());
+						}
+						add(
+							$current,
+							"statement",
+							lv_statement_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.TransitionEffectStatement");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleTransitionEffectStatement
+entryRuleTransitionEffectStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTransitionEffectStatementRule()); }
+	iv_ruleTransitionEffectStatement=ruleTransitionEffectStatement
+	{ $current=$iv_ruleTransitionEffectStatement.current; }
+	EOF;
+
+// Rule TransitionEffectStatement
+ruleTransitionEffectStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getExpressionStatementParserRuleCall_0());
+		}
+		this_ExpressionStatement_0=ruleExpressionStatement
+		{
+			$current = $this_ExpressionStatement_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getOutputComStatementParserRuleCall_1());
+		}
+		this_OutputComStatement_1=ruleOutputComStatement
+		{
+			$current = $this_OutputComStatement_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getIfStatementParserRuleCall_2());
+		}
+		this_IfStatement_2=ruleIfStatement
+		{
+			$current = $this_IfStatement_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getWhileDoStatementParserRuleCall_3());
+		}
+		this_WhileDoStatement_3=ruleWhileDoStatement
+		{
+			$current = $this_WhileDoStatement_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getDoWhileStatementParserRuleCall_4());
+		}
+		this_DoWhileStatement_4=ruleDoWhileStatement
+		{
+			$current = $this_DoWhileStatement_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getForStatementParserRuleCall_5());
+		}
+		this_ForStatement_5=ruleForStatement
+		{
+			$current = $this_ForStatement_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getForEachStatementParserRuleCall_6());
+		}
+		this_ForEachStatement_6=ruleForEachStatement
+		{
+			$current = $this_ForEachStatement_6.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getInterruptStatementParserRuleCall_7());
+		}
+		this_InterruptStatement_7=ruleInterruptStatement
+		{
+			$current = $this_InterruptStatement_7.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getActivityStatementParserRuleCall_8());
+		}
+		this_ActivityStatement_8=ruleActivityStatement
+		{
+			$current = $this_ActivityStatement_8.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getInvokeStatementParserRuleCall_9());
+		}
+		this_InvokeStatement_9=ruleInvokeStatement
+		{
+			$current = $this_InvokeStatement_9.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleStatement
+entryRuleStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getStatementRule()); }
+	iv_ruleStatement=ruleStatement
+	{ $current=$iv_ruleStatement.current; }
+	EOF;
+
+// Rule Statement
+ruleStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getBlockStatementParserRuleCall_0());
+		}
+		this_BlockStatement_0=ruleBlockStatement
+		{
+			$current = $this_BlockStatement_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getExpressionStatementParserRuleCall_1());
+		}
+		this_ExpressionStatement_1=ruleExpressionStatement
+		{
+			$current = $this_ExpressionStatement_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getGuardStatementParserRuleCall_2());
+		}
+		this_GuardStatement_2=ruleGuardStatement
+		{
+			$current = $this_GuardStatement_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getTimedGuardStatementParserRuleCall_3());
+		}
+		this_TimedGuardStatement_3=ruleTimedGuardStatement
+		{
+			$current = $this_TimedGuardStatement_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getEventGuardStatementParserRuleCall_4());
+		}
+		this_EventGuardStatement_4=ruleEventGuardStatement
+		{
+			$current = $this_EventGuardStatement_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getCheckSatGuardStatementParserRuleCall_5());
+		}
+		this_CheckSatGuardStatement_5=ruleCheckSatGuardStatement
+		{
+			$current = $this_CheckSatGuardStatement_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getInputComStatementParserRuleCall_6());
+		}
+		this_InputComStatement_6=ruleInputComStatement
+		{
+			$current = $this_InputComStatement_6.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getOutputComStatementParserRuleCall_7());
+		}
+		this_OutputComStatement_7=ruleOutputComStatement
+		{
+			$current = $this_OutputComStatement_7.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getIfStatementParserRuleCall_8());
+		}
+		this_IfStatement_8=ruleIfStatement
+		{
+			$current = $this_IfStatement_8.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getWhileDoStatementParserRuleCall_9());
+		}
+		this_WhileDoStatement_9=ruleWhileDoStatement
+		{
+			$current = $this_WhileDoStatement_9.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getDoWhileStatementParserRuleCall_10());
+		}
+		this_DoWhileStatement_10=ruleDoWhileStatement
+		{
+			$current = $this_DoWhileStatement_10.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getForStatementParserRuleCall_11());
+		}
+		this_ForStatement_11=ruleForStatement
+		{
+			$current = $this_ForStatement_11.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getForEachStatementParserRuleCall_12());
+		}
+		this_ForEachStatement_12=ruleForEachStatement
+		{
+			$current = $this_ForEachStatement_12.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getInterruptStatementParserRuleCall_13());
+		}
+		this_InterruptStatement_13=ruleInterruptStatement
+		{
+			$current = $this_InterruptStatement_13.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getActivityStatementParserRuleCall_14());
+		}
+		this_ActivityStatement_14=ruleActivityStatement
+		{
+			$current = $this_ActivityStatement_14.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getStatementAccess().getInvokeStatementParserRuleCall_15());
+		}
+		this_InvokeStatement_15=ruleInvokeStatement
+		{
+			$current = $this_InvokeStatement_15.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleBlockStatement
+entryRuleBlockStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBlockStatementRule()); }
+	iv_ruleBlockStatement=ruleBlockStatement
+	{ $current=$iv_ruleBlockStatement.current; }
+	EOF;
+
+// Rule BlockStatement
+ruleBlockStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getBlockStatementAccess().getBlockStatementAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='{'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getBlockStatementAccess().getLeftCurlyBracketKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBlockStatementAccess().getOpBlockStatementSchedulerParserRuleCall_2_0());
+				}
+				lv_op_2_0=ruleBlockStatementScheduler
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBlockStatementRule());
+					}
+					set(
+						$current,
+						"op",
+						lv_op_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatementScheduler");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBlockStatementAccess().getStatementStatementParserRuleCall_3_0());
+				}
+				lv_statement_3_0=ruleStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBlockStatementRule());
+					}
+					add(
+						$current,
+						"statement",
+						lv_statement_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Statement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_4='}'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getBlockStatementAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleBlockStatementScheduler
+entryRuleBlockStatementScheduler returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getBlockStatementSchedulerRule()); }
+	iv_ruleBlockStatementScheduler=ruleBlockStatementScheduler
+	{ $current=$iv_ruleBlockStatementScheduler.current.getText(); }
+	EOF;
+
+// Rule BlockStatementScheduler
+ruleBlockStatementScheduler returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='|;|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonVerticalLineKeyword_0());
+		}
+		    |
+		kw='|\u00A7|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSectionSignVerticalLineKeyword_1());
+		}
+		    |
+		kw='|;;|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonSemicolonVerticalLineKeyword_2());
+		}
+		    |
+		kw='|.|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineFullStopVerticalLineKeyword_3());
+		}
+		    |
+		kw='|/;|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusSemicolonVerticalLineKeyword_4());
+		}
+		    |
+		kw='|i|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getIKeyword_5());
+		}
+		    |
+		kw='|,|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineCommaVerticalLineKeyword_6());
+		}
+		    |
+		kw='|a|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAKeyword_7());
+		}
+		    |
+		kw='|and|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAndKeyword_8());
+		}
+		    |
+		kw='|or|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getOrKeyword_9());
+		}
+		    |
+		kw='|and#then|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAndThenKeyword_10());
+		}
+		    |
+		kw='|or#else|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getOrElseKeyword_11());
+		}
+		    |
+		kw='|indet|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getIndetKeyword_12());
+		}
+		    |
+		kw='|/\\|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusReverseSolidusVerticalLineKeyword_13());
+		}
+		    |
+		kw='|fork|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getForkKeyword_14());
+		}
+		    |
+		kw='|join|'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getJoinKeyword_15());
+		}
+	)
+;
+
+// Entry rule entryRuleExpressionStatement
+entryRuleExpressionStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getExpressionStatementRule()); }
+	iv_ruleExpressionStatement=ruleExpressionStatement
+	{ $current=$iv_ruleExpressionStatement.current; }
+	EOF;
+
+// Rule ExpressionStatement
+ruleExpressionStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionAssignmentExpressionParserRuleCall_0_0_0());
+					}
+					lv_expression_0_0=ruleAssignmentExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
+						}
+						set(
+							$current,
+							"expression",
+							lv_expression_0_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.AssignmentExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_1=';'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_0_1());
+			}
+		)
+		    |
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionNewfreshExpressionParserRuleCall_1_0_0());
+					}
+					lv_expression_2_0=ruleNewfreshExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
+						}
+						set(
+							$current,
+							"expression",
+							lv_expression_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.NewfreshExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_3=';'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_1_1());
+			}
+		)
+		    |
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0());
+					}
+					lv_expression_4_0=ruleIncrementOrDecrementPrefixExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
+						}
+						set(
+							$current,
+							"expression",
+							lv_expression_4_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPrefixExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_5=';'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_2_1());
+			}
+		)
+		    |
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0());
+					}
+					lv_expression_6_0=ruleIncrementOrDecrementPostfixExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
+						}
+						set(
+							$current,
+							"expression",
+							lv_expression_6_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPostfixExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_7=';'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_3_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleGuardStatement
+entryRuleGuardStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getGuardStatementRule()); }
+	iv_ruleGuardStatement=ruleGuardStatement
+	{ $current=$iv_ruleGuardStatement.current; }
+	EOF;
+
+// Rule GuardStatement
+ruleGuardStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='guard'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getGuardStatementAccess().getGuardKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getGuardStatementAccess().getConditionExpressionParserRuleCall_1_0());
+				}
+				lv_condition_1_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getGuardStatementRule());
+					}
+					set(
+						$current,
+						"condition",
+						lv_condition_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2=';'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getGuardStatementAccess().getSemicolonKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleTimedGuardStatement
+entryRuleTimedGuardStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTimedGuardStatementRule()); }
+	iv_ruleTimedGuardStatement=ruleTimedGuardStatement
+	{ $current=$iv_ruleTimedGuardStatement.current; }
+	EOF;
+
+// Rule TimedGuardStatement
+ruleTimedGuardStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='tguard'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getTimedGuardStatementAccess().getTguardKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getTimedGuardStatementAccess().getConditionExpressionParserRuleCall_1_0());
+				}
+				lv_condition_1_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getTimedGuardStatementRule());
+					}
+					set(
+						$current,
+						"condition",
+						lv_condition_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2=';'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getTimedGuardStatementAccess().getSemicolonKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleEventGuardStatement
+entryRuleEventGuardStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEventGuardStatementRule()); }
+	iv_ruleEventGuardStatement=ruleEventGuardStatement
+	{ $current=$iv_ruleEventGuardStatement.current; }
+	EOF;
+
+// Rule EventGuardStatement
+ruleEventGuardStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='event'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getEventGuardStatementAccess().getEventKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEventGuardStatementAccess().getConditionExpressionParserRuleCall_1_0());
+				}
+				lv_condition_1_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEventGuardStatementRule());
+					}
+					set(
+						$current,
+						"condition",
+						lv_condition_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2=';'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getEventGuardStatementAccess().getSemicolonKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleCheckSatGuardStatement
+entryRuleCheckSatGuardStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getCheckSatGuardStatementRule()); }
+	iv_ruleCheckSatGuardStatement=ruleCheckSatGuardStatement
+	{ $current=$iv_ruleCheckSatGuardStatement.current; }
+	EOF;
+
+// Rule CheckSatGuardStatement
+ruleCheckSatGuardStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='checksat'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getCheckSatGuardStatementAccess().getChecksatKeyword_0());
+		}
+		otherlv_1='<'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getCheckSatGuardStatementAccess().getLessThanSignKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCheckSatGuardStatementAccess().getSolverESIdentifierParserRuleCall_2_0());
+				}
+				lv_solver_2_0=ruleESIdentifier
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCheckSatGuardStatementRule());
+					}
+					set(
+						$current,
+						"solver",
+						lv_solver_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3='>'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getCheckSatGuardStatementAccess().getGreaterThanSignKeyword_3());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCheckSatGuardStatementAccess().getConditionExpressionParserRuleCall_4_0());
+				}
+				lv_condition_4_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCheckSatGuardStatementRule());
+					}
+					set(
+						$current,
+						"condition",
+						lv_condition_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_5=';'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getCheckSatGuardStatementAccess().getSemicolonKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleInputComStatement
+entryRuleInputComStatement returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getInputComStatementRule()); }
+	iv_ruleInputComStatement=ruleInputComStatement
+	{ $current=$iv_ruleInputComStatement.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule InputComStatement
+ruleInputComStatement returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='input'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getInputComStatementAccess().getInputKeyword_0());
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getInputComStatementRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getInputComStatementAccess().getPortNamedElementCrossReference_1_0());
+				}
+				ruleESUfid
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getInputComStatementAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_1_0());
+					}
+					lv_leftValue_3_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getInputComStatementRule());
+						}
+						add(
+							$current,
+							"leftValue",
+							lv_leftValue_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_4=','
+				{
+					newLeafNode(otherlv_4, grammarAccess.getInputComStatementAccess().getCommaKeyword_2_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_2_1_0());
+						}
+						lv_leftValue_5_0=ruleExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getInputComStatementRule());
+							}
+							add(
+								$current,
+								"leftValue",
+								lv_leftValue_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_6=')'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getInputComStatementAccess().getRightParenthesisKeyword_2_3());
+			}
+		)?
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0);
+					}
+								({true}?=>(otherlv_8='<--'
+								{
+									newLeafNode(otherlv_8, grammarAccess.getInputComStatementAccess().getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getInputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0());
+										}
+										lv_target_9_0=ruleExpressionAsMachine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getInputComStatementRule());
+											}
+											set(
+												$current,
+												"target",
+												lv_target_9_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ExpressionAsMachine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1);
+					}
+								({true}?=>((
+									otherlv_10='<=='
+									{
+										newLeafNode(otherlv_10, grammarAccess.getInputComStatementAccess().getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0());
+									}
+									    |
+									otherlv_11='via'
+									{
+										newLeafNode(otherlv_11, grammarAccess.getInputComStatementAccess().getViaKeyword_3_1_0_1());
+									}
+								)
+								(
+									(
+										{
+											/* */
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getInputComStatementRule());
+											}
+										}
+										{
+											newCompositeNode(grammarAccess.getInputComStatementAccess().getRouteChannelCrossReference_3_1_1_0());
+										}
+										ruleESUfid
+										{
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+				}
+		)
+		otherlv_13=';'
+		{
+			newLeafNode(otherlv_13, grammarAccess.getInputComStatementAccess().getSemicolonKeyword_4());
+		}
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleOutputComStatement
+entryRuleOutputComStatement returns [EObject current=null]@init {
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()
+	);
+}:
+	{ newCompositeNode(grammarAccess.getOutputComStatementRule()); }
+	iv_ruleOutputComStatement=ruleOutputComStatement
+	{ $current=$iv_ruleOutputComStatement.current; }
+	EOF;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Rule OutputComStatement
+ruleOutputComStatement returns [EObject current=null]
+@init {
+	enterRule();
+	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+	grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()
+	);
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='output'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getOutputComStatementAccess().getOutputKeyword_0());
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getOutputComStatementRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getOutputComStatementAccess().getPortNamedElementCrossReference_1_0());
+				}
+				ruleESUfid
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_2='('
+			{
+				newLeafNode(otherlv_2, grammarAccess.getOutputComStatementAccess().getLeftParenthesisKeyword_2_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_1_0());
+					}
+					lv_rigthValue_3_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
+						}
+						add(
+							$current,
+							"rigthValue",
+							lv_rigthValue_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_4=','
+				{
+					newLeafNode(otherlv_4, grammarAccess.getOutputComStatementAccess().getCommaKeyword_2_2_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_2_1_0());
+						}
+						lv_rigthValue_5_0=ruleExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
+							}
+							add(
+								$current,
+								"rigthValue",
+								lv_rigthValue_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+			otherlv_6=')'
+			{
+				newLeafNode(otherlv_6, grammarAccess.getOutputComStatementAccess().getRightParenthesisKeyword_2_3());
+			}
+		)?
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0);
+					}
+								({true}?=>(otherlv_8='-->'
+								{
+									newLeafNode(otherlv_8, grammarAccess.getOutputComStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0());
+								}
+								(
+									(
+										{
+											newCompositeNode(grammarAccess.getOutputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0());
+										}
+										lv_target_9_0=ruleExpressionAsMachine
+										{
+											if ($current==null) {
+												$current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
+											}
+											set(
+												$current,
+												"target",
+												lv_target_9_0,
+												"org.eclipse.efm.formalml.xtext.FormalML.ExpressionAsMachine");
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1);
+					}
+								({true}?=>((
+									otherlv_10='==>'
+									{
+										newLeafNode(otherlv_10, grammarAccess.getOutputComStatementAccess().getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0());
+									}
+									    |
+									otherlv_11='via'
+									{
+										newLeafNode(otherlv_11, grammarAccess.getOutputComStatementAccess().getViaKeyword_3_1_0_1());
+									}
+								)
+								(
+									(
+										{
+											/* */
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getOutputComStatementRule());
+											}
+										}
+										{
+											newCompositeNode(grammarAccess.getOutputComStatementAccess().getRouteChannelCrossReference_3_1_1_0());
+										}
+										ruleESUfid
+										{
+											afterParserOrEnumRuleCall();
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+				}
+		)
+		otherlv_13=';'
+		{
+			newLeafNode(otherlv_13, grammarAccess.getOutputComStatementAccess().getSemicolonKeyword_4());
+		}
+	)
+;
+finally {
+	myUnorderedGroupState.restore();
+}
+
+// Entry rule entryRuleExpressionAsMachine
+entryRuleExpressionAsMachine returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getExpressionAsMachineRule()); }
+	iv_ruleExpressionAsMachine=ruleExpressionAsMachine
+	{ $current=$iv_ruleExpressionAsMachine.current; }
+	EOF;
+
+// Rule ExpressionAsMachine
+ruleExpressionAsMachine returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				newCompositeNode(grammarAccess.getExpressionAsMachineAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_0());
+			}
+			lv_machine_0_0=ruleValuePureNamedMachineExpression
+			{
+				if ($current==null) {
+					$current = createModelElementForParent(grammarAccess.getExpressionAsMachineRule());
+				}
+				set(
+					$current,
+					"machine",
+					lv_machine_0_0,
+					"org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
+				afterParserOrEnumRuleCall();
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleIfStatement
+entryRuleIfStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getIfStatementRule()); }
+	iv_ruleIfStatement=ruleIfStatement
+	{ $current=$iv_ruleIfStatement.current; }
+	EOF;
+
+// Rule IfStatement
+ruleIfStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='if'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getIfStatementAccess().getIfKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIfStatementAccess().getConditionExpressionParserRuleCall_1_0());
+				}
+				lv_condition_1_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIfStatementRule());
+					}
+					set(
+						$current,
+						"condition",
+						lv_condition_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+				}
+				lv_bodyBlock_2_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIfStatementRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIfStatementAccess().getElseifStatementElseIfStatementParserRuleCall_3_0());
+				}
+				lv_elseifStatement_3_0=ruleElseIfStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIfStatementRule());
+					}
+					add(
+						$current,
+						"elseifStatement",
+						lv_elseifStatement_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ElseIfStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		(
+			otherlv_4='else'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getIfStatementAccess().getElseKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getIfStatementAccess().getElseBlockBlockStatementParserRuleCall_4_1_0());
+					}
+					lv_elseBlock_5_0=ruleBlockStatement
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getIfStatementRule());
+						}
+						set(
+							$current,
+							"elseBlock",
+							lv_elseBlock_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleElseIfStatement
+entryRuleElseIfStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getElseIfStatementRule()); }
+	iv_ruleElseIfStatement=ruleElseIfStatement
+	{ $current=$iv_ruleElseIfStatement.current; }
+	EOF;
+
+// Rule ElseIfStatement
+ruleElseIfStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			otherlv_0='elseif'
+			{
+				newLeafNode(otherlv_0, grammarAccess.getElseIfStatementAccess().getElseifKeyword_0_0());
+			}
+			    |
+			(
+				otherlv_1='else'
+				{
+					newLeafNode(otherlv_1, grammarAccess.getElseIfStatementAccess().getElseKeyword_0_1_0());
+				}
+				otherlv_2='if'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getElseIfStatementAccess().getIfKeyword_0_1_1());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getElseIfStatementAccess().getConditionExpressionParserRuleCall_1_0());
+				}
+				lv_condition_3_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getElseIfStatementRule());
+					}
+					set(
+						$current,
+						"condition",
+						lv_condition_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getElseIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+				}
+				lv_bodyBlock_4_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getElseIfStatementRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleWhileDoStatement
+entryRuleWhileDoStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getWhileDoStatementRule()); }
+	iv_ruleWhileDoStatement=ruleWhileDoStatement
+	{ $current=$iv_ruleWhileDoStatement.current; }
+	EOF;
+
+// Rule WhileDoStatement
+ruleWhileDoStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='while'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getWhileDoStatementAccess().getWhileKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getWhileDoStatementAccess().getConditionExpressionParserRuleCall_1_0());
+				}
+				lv_condition_1_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getWhileDoStatementRule());
+					}
+					set(
+						$current,
+						"condition",
+						lv_condition_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getWhileDoStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+				}
+				lv_bodyBlock_2_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getWhileDoStatementRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleDoWhileStatement
+entryRuleDoWhileStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDoWhileStatementRule()); }
+	iv_ruleDoWhileStatement=ruleDoWhileStatement
+	{ $current=$iv_ruleDoWhileStatement.current; }
+	EOF;
+
+// Rule DoWhileStatement
+ruleDoWhileStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='do'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getDoWhileStatementAccess().getDoKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDoWhileStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_0());
+				}
+				lv_bodyBlock_1_0=ruleBlockStatement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDoWhileStatementRule());
+					}
+					set(
+						$current,
+						"bodyBlock",
+						lv_bodyBlock_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='while'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0());
+				}
+				lv_condition_3_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDoWhileStatementRule());
+					}
+					set(
+						$current,
+						"condition",
+						lv_condition_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4=';'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleForStatement
+entryRuleForStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getForStatementRule()); }
+	iv_ruleForStatement=ruleForStatement
+	{ $current=$iv_ruleForStatement.current; }
+	EOF;
+
+// Rule ForStatement
+ruleForStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			otherlv_0='for'
+			{
+				newLeafNode(otherlv_0, grammarAccess.getForStatementAccess().getForKeyword_0_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_0_1_0());
+					}
+					lv_init_1_0=ruleForAssignmentExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForStatementRule());
+						}
+						set(
+							$current,
+							"init",
+							lv_init_1_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_2=';'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getForStatementAccess().getSemicolonKeyword_0_2());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_0_3_0());
+					}
+					lv_condition_3_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForStatementRule());
+						}
+						set(
+							$current,
+							"condition",
+							lv_condition_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_4=';'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getForStatementAccess().getSemicolonKeyword_0_4());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_0_5_0());
+					}
+					lv_iterate_5_0=ruleForAssignmentExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForStatementRule());
+						}
+						set(
+							$current,
+							"iterate",
+							lv_iterate_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_6_0());
+					}
+					lv_bodyBlock_6_0=ruleBlockStatement
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForStatementRule());
+						}
+						set(
+							$current,
+							"bodyBlock",
+							lv_bodyBlock_6_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		    |
+		(
+			otherlv_7='for'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getForStatementAccess().getForKeyword_1_0());
+			}
+			otherlv_8='('
+			{
+				newLeafNode(otherlv_8, grammarAccess.getForStatementAccess().getLeftParenthesisKeyword_1_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_1_2_0());
+					}
+					lv_init_9_0=ruleForAssignmentExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForStatementRule());
+						}
+						set(
+							$current,
+							"init",
+							lv_init_9_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_10=';'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getForStatementAccess().getSemicolonKeyword_1_3());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_1_4_0());
+					}
+					lv_condition_11_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForStatementRule());
+						}
+						set(
+							$current,
+							"condition",
+							lv_condition_11_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_12=';'
+			{
+				newLeafNode(otherlv_12, grammarAccess.getForStatementAccess().getSemicolonKeyword_1_5());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_1_6_0());
+					}
+					lv_iterate_13_0=ruleForAssignmentExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForStatementRule());
+						}
+						set(
+							$current,
+							"iterate",
+							lv_iterate_13_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_14=')'
+			{
+				newLeafNode(otherlv_14, grammarAccess.getForStatementAccess().getRightParenthesisKeyword_1_7());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_8_0());
+					}
+					lv_bodyBlock_15_0=ruleBlockStatement
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForStatementRule());
+						}
+						set(
+							$current,
+							"bodyBlock",
+							lv_bodyBlock_15_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleForAssignmentExpression
+entryRuleForAssignmentExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getForAssignmentExpressionRule()); }
+	iv_ruleForAssignmentExpression=ruleForAssignmentExpression
+	{ $current=$iv_ruleForAssignmentExpression.current; }
+	EOF;
+
+// Rule ForAssignmentExpression
+ruleForAssignmentExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getForAssignmentExpressionAccess().getAssignmentExpressionParserRuleCall_0());
+		}
+		this_AssignmentExpression_0=ruleAssignmentExpression
+		{
+			$current = $this_AssignmentExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall_1());
+		}
+		this_IncrementOrDecrementPrefixExpression_1=ruleIncrementOrDecrementPrefixExpression
+		{
+			$current = $this_IncrementOrDecrementPrefixExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall_2());
+		}
+		this_IncrementOrDecrementPostfixExpression_2=ruleIncrementOrDecrementPostfixExpression
+		{
+			$current = $this_IncrementOrDecrementPostfixExpression_2.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleForEachStatement
+entryRuleForEachStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getForEachStatementRule()); }
+	iv_ruleForEachStatement=ruleForEachStatement
+	{ $current=$iv_ruleForEachStatement.current; }
+	EOF;
+
+// Rule ForEachStatement
+ruleForEachStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			otherlv_0='for'
+			{
+				newLeafNode(otherlv_0, grammarAccess.getForEachStatementAccess().getForKeyword_0_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_0_1_0());
+					}
+					lv_iterator_1_0=ruleLeftHandSideExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+						}
+						set(
+							$current,
+							"iterator",
+							lv_iterator_1_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_2=':'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getForEachStatementAccess().getColonKeyword_0_2());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_0_3_0());
+					}
+					lv_enumeration_3_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+						}
+						set(
+							$current,
+							"enumeration",
+							lv_enumeration_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_4_0());
+					}
+					lv_bodyBlock_4_0=ruleBlockStatement
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+						}
+						set(
+							$current,
+							"bodyBlock",
+							lv_bodyBlock_4_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		    |
+		(
+			otherlv_5='for'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getForEachStatementAccess().getForKeyword_1_0());
+			}
+			otherlv_6='('
+			{
+				newLeafNode(otherlv_6, grammarAccess.getForEachStatementAccess().getLeftParenthesisKeyword_1_1());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_1_2_0());
+					}
+					lv_iterator_7_0=ruleLeftHandSideExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+						}
+						set(
+							$current,
+							"iterator",
+							lv_iterator_7_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_8=':'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getForEachStatementAccess().getColonKeyword_1_3());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_1_4_0());
+					}
+					lv_enumeration_9_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+						}
+						set(
+							$current,
+							"enumeration",
+							lv_enumeration_9_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_10=')'
+			{
+				newLeafNode(otherlv_10, grammarAccess.getForEachStatementAccess().getRightParenthesisKeyword_1_5());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_6_0());
+					}
+					lv_bodyBlock_11_0=ruleBlockStatement
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+						}
+						set(
+							$current,
+							"bodyBlock",
+							lv_bodyBlock_11_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleInterruptStatement
+entryRuleInterruptStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getInterruptStatementRule()); }
+	iv_ruleInterruptStatement=ruleInterruptStatement
+	{ $current=$iv_ruleInterruptStatement.current; }
+	EOF;
+
+// Rule InterruptStatement
+ruleInterruptStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getInterruptStatementAccess().getKindInterruptStatementKindEnumRuleCall_0_0());
+				}
+				lv_kind_0_0=ruleInterruptStatementKind
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
+					}
+					set(
+						$current,
+						"kind",
+						lv_kind_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.InterruptStatementKind");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_0_0());
+					}
+					lv_expr_1_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
+						}
+						add(
+							$current,
+							"expr",
+							lv_expr_1_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				otherlv_2='('
+				{
+					newLeafNode(otherlv_2, grammarAccess.getInterruptStatementAccess().getLeftParenthesisKeyword_1_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_1_0());
+						}
+						lv_expr_3_0=ruleExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
+							}
+							add(
+								$current,
+								"expr",
+								lv_expr_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_4=','
+					{
+						newLeafNode(otherlv_4, grammarAccess.getInterruptStatementAccess().getCommaKeyword_1_1_2_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_2_1_0());
+							}
+							lv_expr_5_0=ruleExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
+								}
+								add(
+									$current,
+									"expr",
+									lv_expr_5_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+				otherlv_6=')'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getInterruptStatementAccess().getRightParenthesisKeyword_1_1_3());
+				}
+			)
+		)?
+		otherlv_7=';'
+		{
+			newLeafNode(otherlv_7, grammarAccess.getInterruptStatementAccess().getSemicolonKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleActivityStatement
+entryRuleActivityStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getActivityStatementRule()); }
+	iv_ruleActivityStatement=ruleActivityStatement
+	{ $current=$iv_ruleActivityStatement.current; }
+	EOF;
+
+// Rule ActivityStatement
+ruleActivityStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getActivityStatementAccess().getActivityStatementAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getActivityStatementAccess().getOpOPERATOR_ACTIVITYEnumRuleCall_1_0());
+				}
+				lv_op_1_0=ruleOPERATOR_ACTIVITY
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getActivityStatementRule());
+					}
+					set(
+						$current,
+						"op",
+						lv_op_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.OPERATOR_ACTIVITY");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getActivityStatementAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_2_0());
+				}
+				lv_machine_2_0=ruleValuePureNamedMachineExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getActivityStatementRule());
+					}
+					set(
+						$current,
+						"machine",
+						lv_machine_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getActivityStatementAccess().getTupleTupleParameterExpressionParserRuleCall_3_0());
+				}
+				lv_tuple_3_0=ruleTupleParameterExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getActivityStatementRule());
+					}
+					set(
+						$current,
+						"tuple",
+						lv_tuple_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.TupleParameterExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		otherlv_4=';'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getActivityStatementAccess().getSemicolonKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleInvokeStatement
+entryRuleInvokeStatement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getInvokeStatementRule()); }
+	iv_ruleInvokeStatement=ruleInvokeStatement
+	{ $current=$iv_ruleInvokeStatement.current; }
+	EOF;
+
+// Rule InvokeStatement
+ruleInvokeStatement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getInvokeStatementAccess().getExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0());
+					}
+					lv_expression_0_0=ruleInvokeExpressionDeprecated
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
+						}
+						set(
+							$current,
+							"expression",
+							lv_expression_0_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.InvokeExpressionDeprecated");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_1=';'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_0_1());
+			}
+		)
+		    |
+		(
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getInvokeStatementRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_1_0_0());
+					}
+					ruleESUfid
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					lv_execRoutine_3_0='('
+					{
+						newLeafNode(lv_execRoutine_3_0, grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getInvokeStatementRule());
+						}
+						setWithLastConsumed($current, "execRoutine", true, "(");
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_1_2_0());
+					}
+					lv_args_4_0=ruleMixTupleExpressionList
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
+						}
+						set(
+							$current,
+							"args",
+							lv_args_4_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_5=')'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_3());
+			}
+			(
+				otherlv_6='-->'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0());
+				}
+				(
+					(
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getInvokeStatementRule());
+									}
+								}
+								otherlv_7=RULE_ID
+								{
+									newLeafNode(otherlv_7, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_0_0());
+								}
+							)
+						)
+						(
+							otherlv_8=','
+							{
+								newLeafNode(otherlv_8, grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_0_1_0());
+							}
+							(
+								(
+									{
+										/* */
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getInvokeStatementRule());
+										}
+									}
+									otherlv_9=RULE_ID
+									{
+										newLeafNode(otherlv_9, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_1_1_0());
+									}
+								)
+							)
+						)*
+					)
+					    |
+					(
+						otherlv_10='('
+						{
+							newLeafNode(otherlv_10, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_1_4_1_1_0());
+						}
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getInvokeStatementRule());
+									}
+								}
+								otherlv_11=RULE_ID
+								{
+									newLeafNode(otherlv_11, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_1_0());
+								}
+							)
+						)
+						(
+							otherlv_12=','
+							{
+								newLeafNode(otherlv_12, grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_1_2_0());
+							}
+							(
+								(
+									{
+										/* */
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getInvokeStatementRule());
+										}
+									}
+									otherlv_13=RULE_ID
+									{
+										newLeafNode(otherlv_13, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_2_1_0());
+									}
+								)
+							)
+						)*
+						otherlv_14=')'
+						{
+							newLeafNode(otherlv_14, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_4_1_1_3());
+						}
+					)
+				)
+			)?
+			otherlv_15=';'
+			{
+				newLeafNode(otherlv_15, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_1_5());
+			}
+		)
+		    |
+		(
+			(
+				(
+					lv_execRoutine_16_0='exec'
+					{
+						newLeafNode(lv_execRoutine_16_0, grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getInvokeStatementRule());
+						}
+						setWithLastConsumed($current, "execRoutine", true, "exec");
+					}
+				)
+			)
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getInvokeStatementRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_2_1_0());
+					}
+					ruleESUfid
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_18='('
+			{
+				newLeafNode(otherlv_18, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_2());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_2_3_0());
+					}
+					lv_args_19_0=ruleMixTupleExpressionList
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
+						}
+						set(
+							$current,
+							"args",
+							lv_args_19_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			otherlv_20=')'
+			{
+				newLeafNode(otherlv_20, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_4());
+			}
+			(
+				otherlv_21='-->'
+				{
+					newLeafNode(otherlv_21, grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0());
+				}
+				(
+					(
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getInvokeStatementRule());
+									}
+								}
+								otherlv_22=RULE_ID
+								{
+									newLeafNode(otherlv_22, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_0_0());
+								}
+							)
+						)
+						(
+							otherlv_23=','
+							{
+								newLeafNode(otherlv_23, grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_0_1_0());
+							}
+							(
+								(
+									{
+										/* */
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getInvokeStatementRule());
+										}
+									}
+									otherlv_24=RULE_ID
+									{
+										newLeafNode(otherlv_24, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_1_1_0());
+									}
+								)
+							)
+						)*
+					)
+					    |
+					(
+						otherlv_25='('
+						{
+							newLeafNode(otherlv_25, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_5_1_1_0());
+						}
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getInvokeStatementRule());
+									}
+								}
+								otherlv_26=RULE_ID
+								{
+									newLeafNode(otherlv_26, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_1_0());
+								}
+							)
+						)
+						(
+							otherlv_27=','
+							{
+								newLeafNode(otherlv_27, grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_1_2_0());
+							}
+							(
+								(
+									{
+										/* */
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getInvokeStatementRule());
+										}
+									}
+									otherlv_28=RULE_ID
+									{
+										newLeafNode(otherlv_28, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_2_1_0());
+									}
+								)
+							)
+						)*
+						otherlv_29=')'
+						{
+							newLeafNode(otherlv_29, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_5_1_1_3());
+						}
+					)
+				)
+			)?
+			otherlv_30=';'
+			{
+				newLeafNode(otherlv_30, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_2_6());
+			}
+		)
+		    |
+		(
+			(
+				(
+					lv_callProcedure_31_0='call'
+					{
+						newLeafNode(lv_callProcedure_31_0, grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getInvokeStatementRule());
+						}
+						setWithLastConsumed($current, "callProcedure", true, "call");
+					}
+				)
+			)
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getInvokeStatementRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_3_1_0());
+					}
+					ruleESUfid
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_3_2_0());
+					}
+					lv_args_33_0=ruleMixTupleExpressionList
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
+						}
+						set(
+							$current,
+							"args",
+							lv_args_33_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)?
+			(
+				otherlv_34='-->'
+				{
+					newLeafNode(otherlv_34, grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0());
+				}
+				(
+					(
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getInvokeStatementRule());
+									}
+								}
+								otherlv_35=RULE_ID
+								{
+									newLeafNode(otherlv_35, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_0_0());
+								}
+							)
+						)
+						(
+							otherlv_36=','
+							{
+								newLeafNode(otherlv_36, grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_0_1_0());
+							}
+							(
+								(
+									{
+										/* */
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getInvokeStatementRule());
+										}
+									}
+									otherlv_37=RULE_ID
+									{
+										newLeafNode(otherlv_37, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_1_1_0());
+									}
+								)
+							)
+						)*
+					)
+					    |
+					(
+						otherlv_38='('
+						{
+							newLeafNode(otherlv_38, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_3_3_1_1_0());
+						}
+						(
+							(
+								{
+									/* */
+								}
+								{
+									if ($current==null) {
+										$current = createModelElement(grammarAccess.getInvokeStatementRule());
+									}
+								}
+								otherlv_39=RULE_ID
+								{
+									newLeafNode(otherlv_39, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_1_0());
+								}
+							)
+						)
+						(
+							otherlv_40=','
+							{
+								newLeafNode(otherlv_40, grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_1_2_0());
+							}
+							(
+								(
+									{
+										/* */
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getInvokeStatementRule());
+										}
+									}
+									otherlv_41=RULE_ID
+									{
+										newLeafNode(otherlv_41, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_2_1_0());
+									}
+								)
+							)
+						)*
+						otherlv_42=')'
+						{
+							newLeafNode(otherlv_42, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_3_3_1_1_3());
+						}
+					)
+				)
+			)?
+			otherlv_43=';'
+			{
+				newLeafNode(otherlv_43, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_3_4());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleExpression
+entryRuleExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getExpressionRule()); }
+	iv_ruleExpression=ruleExpression
+	{ $current=$iv_ruleExpression.current; }
+	EOF;
+
+// Rule Expression
+ruleExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getExpressionAccess().getAssignmentExpressionParserRuleCall_0());
+		}
+		this_AssignmentExpression_0=ruleAssignmentExpression
+		{
+			$current = $this_AssignmentExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getExpressionAccess().getConditionalTestExpressionParserRuleCall_1());
+		}
+		this_ConditionalTestExpression_1=ruleConditionalTestExpression
+		{
+			$current = $this_ConditionalTestExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleAssignmentExpression
+entryRuleAssignmentExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getAssignmentExpressionRule()); }
+	iv_ruleAssignmentExpression=ruleAssignmentExpression
+	{ $current=$iv_ruleAssignmentExpression.current; }
+	EOF;
+
+// Rule AssignmentExpression
+ruleAssignmentExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0());
+				}
+				lv_leftHandSide_0_0=ruleLeftHandSideExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getAssignmentExpressionRule());
+					}
+					set(
+						$current,
+						"leftHandSide",
+						lv_leftHandSide_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignmentOperatorParserRuleCall_1_0());
+				}
+				lv_operator_1_0=ruleAssignmentOperator
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getAssignmentExpressionRule());
+					}
+					set(
+						$current,
+						"operator",
+						lv_operator_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.AssignmentOperator");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideExpressionParserRuleCall_2_0());
+				}
+				lv_rigthHandSide_2_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getAssignmentExpressionRule());
+					}
+					set(
+						$current,
+						"rigthHandSide",
+						lv_rigthHandSide_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleAssignmentOperator
+entryRuleAssignmentOperator returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getAssignmentOperatorRule()); }
+	iv_ruleAssignmentOperator=ruleAssignmentOperator
+	{ $current=$iv_ruleAssignmentOperator.current.getText(); }
+	EOF;
+
+// Rule AssignmentOperator
+ruleAssignmentOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getEqualsSignKeyword_0());
+		}
+		    |
+		kw=':='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getColonEqualsSignKeyword_1());
+		}
+		    |
+		kw='::='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getColonColonEqualsSignKeyword_2());
+		}
+		    |
+		kw='+='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getPlusSignEqualsSignKeyword_3());
+		}
+		    |
+		kw='-='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getHyphenMinusEqualsSignKeyword_4());
+		}
+		    |
+		kw='*='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getAsteriskEqualsSignKeyword_5());
+		}
+		    |
+		kw='/='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getSolidusEqualsSignKeyword_6());
+		}
+		    |
+		kw='%='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getPercentSignEqualsSignKeyword_7());
+		}
+		    |
+		kw='&&='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getAmpersandAmpersandEqualsSignKeyword_8());
+		}
+		    |
+		kw='||='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getVerticalLineVerticalLineEqualsSignKeyword_9());
+		}
+		    |
+		kw='&='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getAmpersandEqualsSignKeyword_10());
+		}
+		    |
+		kw='|='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getVerticalLineEqualsSignKeyword_11());
+		}
+		    |
+		kw='^='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignKeyword_12());
+		}
+		    |
+		kw='<<='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getLessThanSignLessThanSignEqualsSignKeyword_13());
+		}
+		    |
+		kw='>>='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignEqualsSignKeyword_14());
+		}
+		    |
+		kw='>>>='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15());
+		}
+		    |
+		kw='<=<'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getLessThanSignEqualsSignLessThanSignKeyword_16());
+		}
+		    |
+		kw='^=<'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignLessThanSignKeyword_17());
+		}
+		    |
+		kw='^=>'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignGreaterThanSignKeyword_18());
+		}
+		    |
+		kw='>=>'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignEqualsSignGreaterThanSignKeyword_19());
+		}
+	)
+;
+
+// Entry rule entryRuleLeftHandSideExpression
+entryRuleLeftHandSideExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLeftHandSideExpressionRule()); }
+	iv_ruleLeftHandSideExpression=ruleLeftHandSideExpression
+	{ $current=$iv_ruleLeftHandSideExpression.current; }
+	EOF;
+
+// Rule LeftHandSideExpression
+ruleLeftHandSideExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLeftHandSideExpressionAccess().getLeftHandSideExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_0_0());
+					}
+					lv_lvalue_1_0=ruleValueSelectionExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getLeftHandSideExpressionRule());
+						}
+						set(
+							$current,
+							"lvalue",
+							lv_lvalue_1_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ValueSelectionExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				otherlv_2='('
+				{
+					newLeafNode(otherlv_2, grammarAccess.getLeftHandSideExpressionAccess().getLeftParenthesisKeyword_1_1_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_1_1_0());
+						}
+						lv_lvalue_3_0=ruleValueSelectionExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLeftHandSideExpressionRule());
+							}
+							set(
+								$current,
+								"lvalue",
+								lv_lvalue_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ValueSelectionExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_4=')'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getLeftHandSideExpressionAccess().getRightParenthesisKeyword_1_1_2());
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleConditionalTestExpression
+entryRuleConditionalTestExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getConditionalTestExpressionRule()); }
+	iv_ruleConditionalTestExpression=ruleConditionalTestExpression
+	{ $current=$iv_ruleConditionalTestExpression.current; }
+	EOF;
+
+// Rule ConditionalTestExpression
+ruleConditionalTestExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getConditionalTestExpressionAccess().getLogicalOrExpressionParserRuleCall_0());
+		}
+		this_LogicalOrExpression_0=ruleLogicalOrExpression
+		{
+			$current = $this_LogicalOrExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					lv_operator_2_0='?'
+					{
+						newLeafNode(lv_operator_2_0, grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getConditionalTestExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_2_0, "?");
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getConditionalTestExpressionAccess().getThenOperandExpressionParserRuleCall_1_2_0());
+					}
+					lv_thenOperand_3_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getConditionalTestExpressionRule());
+						}
+						set(
+							$current,
+							"thenOperand",
+							lv_thenOperand_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_4=':'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getConditionalTestExpressionAccess().getColonKeyword_1_3());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getConditionalTestExpressionAccess().getElseOperandExpressionParserRuleCall_1_4_0());
+					}
+					lv_elseOperand_5_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getConditionalTestExpressionRule());
+						}
+						set(
+							$current,
+							"elseOperand",
+							lv_elseOperand_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleLogicalOrExpression
+entryRuleLogicalOrExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLogicalOrExpressionRule()); }
+	iv_ruleLogicalOrExpression=ruleLogicalOrExpression
+	{ $current=$iv_ruleLogicalOrExpression.current; }
+	EOF;
+
+// Rule LogicalOrExpression
+ruleLogicalOrExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getLogicalAndExpressionParserRuleCall_0());
+		}
+		this_LogicalAndExpression_0=ruleLogicalAndExpression
+		{
+			$current = $this_LogicalAndExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					(
+						lv_operator_2_1='||'
+						{
+							newLeafNode(lv_operator_2_1, grammarAccess.getLogicalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getLogicalOrExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_1, null);
+						}
+						    |
+						lv_operator_2_2='or'
+						{
+							newLeafNode(lv_operator_2_2, grammarAccess.getLogicalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getLogicalOrExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_2, null);
+						}
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=ruleLogicalAndExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getLogicalOrExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.LogicalAndExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					otherlv_4='||'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getLogicalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0());
+					}
+					    |
+					otherlv_5='or'
+					{
+						newLeafNode(otherlv_5, grammarAccess.getLogicalOrExpressionAccess().getOrKeyword_1_3_0_1());
+					}
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_3_1_0());
+						}
+						lv_operand_6_0=ruleLogicalAndExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLogicalOrExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.LogicalAndExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleLogicalAndExpression
+entryRuleLogicalAndExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLogicalAndExpressionRule()); }
+	iv_ruleLogicalAndExpression=ruleLogicalAndExpression
+	{ $current=$iv_ruleLogicalAndExpression.current; }
+	EOF;
+
+// Rule LogicalAndExpression
+ruleLogicalAndExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getBitwiseOrExpressionParserRuleCall_0());
+		}
+		this_BitwiseOrExpression_0=ruleBitwiseOrExpression
+		{
+			$current = $this_BitwiseOrExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					(
+						lv_operator_2_1='&&'
+						{
+							newLeafNode(lv_operator_2_1, grammarAccess.getLogicalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getLogicalAndExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_1, null);
+						}
+						    |
+						lv_operator_2_2='and'
+						{
+							newLeafNode(lv_operator_2_2, grammarAccess.getLogicalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getLogicalAndExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_2, null);
+						}
+					)
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=ruleBitwiseOrExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getLogicalAndExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					otherlv_4='&&'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getLogicalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0());
+					}
+					    |
+					otherlv_5='and'
+					{
+						newLeafNode(otherlv_5, grammarAccess.getLogicalAndExpressionAccess().getAndKeyword_1_3_0_1());
+					}
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_3_1_0());
+						}
+						lv_operand_6_0=ruleBitwiseOrExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLogicalAndExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleBitwiseOrExpression
+entryRuleBitwiseOrExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBitwiseOrExpressionRule()); }
+	iv_ruleBitwiseOrExpression=ruleBitwiseOrExpression
+	{ $current=$iv_ruleBitwiseOrExpression.current; }
+	EOF;
+
+// Rule BitwiseOrExpression
+ruleBitwiseOrExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseXorExpressionParserRuleCall_0());
+		}
+		this_BitwiseXorExpression_0=ruleBitwiseXorExpression
+		{
+			$current = $this_BitwiseXorExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					lv_operator_2_0='|'
+					{
+						newLeafNode(lv_operator_2_0, grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getBitwiseOrExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_2_0, "|");
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=ruleBitwiseXorExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getBitwiseOrExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BitwiseXorExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_4='|'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getBitwiseOrExpressionAccess().getVerticalLineKeyword_1_3_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_3_1_0());
+						}
+						lv_operand_5_0=ruleBitwiseXorExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getBitwiseOrExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.BitwiseXorExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleBitwiseXorExpression
+entryRuleBitwiseXorExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBitwiseXorExpressionRule()); }
+	iv_ruleBitwiseXorExpression=ruleBitwiseXorExpression
+	{ $current=$iv_ruleBitwiseXorExpression.current; }
+	EOF;
+
+// Rule BitwiseXorExpression
+ruleBitwiseXorExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAndExpressionParserRuleCall_0());
+		}
+		this_BitwiseAndExpression_0=ruleBitwiseAndExpression
+		{
+			$current = $this_BitwiseAndExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					lv_operator_2_0='^'
+					{
+						newLeafNode(lv_operator_2_0, grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getBitwiseXorExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_2_0, "^");
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=ruleBitwiseAndExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getBitwiseXorExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.BitwiseAndExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_4='^'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getBitwiseXorExpressionAccess().getCircumflexAccentKeyword_1_3_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_3_1_0());
+						}
+						lv_operand_5_0=ruleBitwiseAndExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getBitwiseXorExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.BitwiseAndExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleBitwiseAndExpression
+entryRuleBitwiseAndExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBitwiseAndExpressionRule()); }
+	iv_ruleBitwiseAndExpression=ruleBitwiseAndExpression
+	{ $current=$iv_ruleBitwiseAndExpression.current; }
+	EOF;
+
+// Rule BitwiseAndExpression
+ruleBitwiseAndExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getBitwiseAndExpressionAccess().getEqualityExpressionParserRuleCall_0());
+		}
+		this_EqualityExpression_0=ruleEqualityExpression
+		{
+			$current = $this_EqualityExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndAdd(
+						grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					lv_operator_2_0='&'
+					{
+						newLeafNode(lv_operator_2_0, grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getBitwiseAndExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_2_0, "&");
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0());
+					}
+					lv_operand_3_0=ruleEqualityExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getBitwiseAndExpressionRule());
+						}
+						add(
+							$current,
+							"operand",
+							lv_operand_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.EqualityExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				otherlv_4='&'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getBitwiseAndExpressionAccess().getAmpersandKeyword_1_3_0());
+				}
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0());
+						}
+						lv_operand_5_0=ruleEqualityExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getBitwiseAndExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.EqualityExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleEqualityExpression
+entryRuleEqualityExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getEqualityExpressionRule()); }
+	iv_ruleEqualityExpression=ruleEqualityExpression
+	{ $current=$iv_ruleEqualityExpression.current; }
+	EOF;
+
+// Rule EqualityExpression
+ruleEqualityExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0());
+		}
+		this_RelationalExpression_0=ruleRelationalExpression
+		{
+			$current = $this_RelationalExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEqualityExpressionAccess().getOperatorEqualityOperatorParserRuleCall_1_1_0());
+					}
+					lv_operator_2_0=ruleEqualityOperator
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
+						}
+						set(
+							$current,
+							"operator",
+							lv_operator_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.EqualityOperator");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRigthOperandRelationalExpressionParserRuleCall_1_2_0());
+					}
+					lv_rigthOperand_3_0=ruleRelationalExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
+						}
+						set(
+							$current,
+							"rigthOperand",
+							lv_rigthOperand_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.RelationalExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleEqualityOperator
+entryRuleEqualityOperator returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getEqualityOperatorRule()); }
+	iv_ruleEqualityOperator=ruleEqualityOperator
+	{ $current=$iv_ruleEqualityOperator.current.getText(); }
+	EOF;
+
+// Rule EqualityOperator
+ruleEqualityOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='=='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignKeyword_0());
+		}
+		    |
+		kw='!='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getExclamationMarkEqualsSignKeyword_1());
+		}
+		    |
+		kw='==='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
+		}
+		    |
+		kw='=!='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignExclamationMarkEqualsSignKeyword_3());
+		}
+		    |
+		kw='=/='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignSolidusEqualsSignKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleRelationalExpression
+entryRuleRelationalExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getRelationalExpressionRule()); }
+	iv_ruleRelationalExpression=ruleRelationalExpression
+	{ $current=$iv_ruleRelationalExpression.current; }
+	EOF;
+
+// Rule RelationalExpression
+ruleRelationalExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0());
+		}
+		this_AdditiveExpression_0=ruleAdditiveExpression
+		{
+			$current = $this_AdditiveExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorParserRuleCall_1_1_0());
+					}
+					lv_operator_2_0=ruleRelationalOperator
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+						}
+						set(
+							$current,
+							"operator",
+							lv_operator_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.RelationalOperator");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_2_0());
+					}
+					lv_rigthOperand_3_0=ruleAdditiveExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+						}
+						set(
+							$current,
+							"rigthOperand",
+							lv_rigthOperand_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.AdditiveExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndSet(
+							grammarAccess.getRelationalExpressionAccess().getRelationalTernaryExpressionLeftRelationAction_1_3_0(),
+							$current);
+					}
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0());
+						}
+						lv_rigthOperator_5_0=ruleRelationalOperator
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+							}
+							set(
+								$current,
+								"rigthOperator",
+								lv_rigthOperator_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.RelationalOperator");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0());
+						}
+						lv_rigthOperand_6_0=ruleAdditiveExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+							}
+							set(
+								$current,
+								"rigthOperand",
+								lv_rigthOperand_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.AdditiveExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)?
+		)?
+	)
+;
+
+// Entry rule entryRuleRelationalOperator
+entryRuleRelationalOperator returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getRelationalOperatorRule()); }
+	iv_ruleRelationalOperator=ruleRelationalOperator
+	{ $current=$iv_ruleRelationalOperator.current.getText(); }
+	EOF;
+
+// Rule RelationalOperator
+ruleRelationalOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='<'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getLessThanSignKeyword_0());
+		}
+		    |
+		kw='>'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getGreaterThanSignKeyword_1());
+		}
+		    |
+		kw='<='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getLessThanSignEqualsSignKeyword_2());
+		}
+		    |
+		kw='>='
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getGreaterThanSignEqualsSignKeyword_3());
+		}
+	)
+;
+
+// Entry rule entryRuleAdditiveExpression
+entryRuleAdditiveExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getAdditiveExpressionRule()); }
+	iv_ruleAdditiveExpression=ruleAdditiveExpression
+	{ $current=$iv_ruleAdditiveExpression.current; }
+	EOF;
+
+// Rule AdditiveExpression
+ruleAdditiveExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0());
+		}
+		this_MultiplicativeExpression_0=ruleMultiplicativeExpression
+		{
+			$current = $this_MultiplicativeExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_2_0='+'
+						{
+							newLeafNode(lv_operator_2_0, grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getAdditiveExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_0, "+");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0());
+						}
+						lv_operand_3_0=ruleMultiplicativeExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_4='+'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_0_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0());
+							}
+							lv_operand_5_0=ruleMultiplicativeExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_5_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_7_0='-'
+						{
+							newLeafNode(lv_operator_7_0, grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getAdditiveExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_7_0, "-");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0());
+						}
+						lv_operand_8_0=ruleMultiplicativeExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_8_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_9='-'
+					{
+						newLeafNode(otherlv_9, grammarAccess.getAdditiveExpressionAccess().getHyphenMinusKeyword_1_1_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0());
+							}
+							lv_operand_10_0=ruleMultiplicativeExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_10_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleMultiplicativeExpression
+entryRuleMultiplicativeExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getMultiplicativeExpressionRule()); }
+	iv_ruleMultiplicativeExpression=ruleMultiplicativeExpression
+	{ $current=$iv_ruleMultiplicativeExpression.current; }
+	EOF;
+
+// Rule MultiplicativeExpression
+ruleMultiplicativeExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getUnaryExpressionParserRuleCall_0());
+		}
+		this_UnaryExpression_0=ruleUnaryExpression
+		{
+			$current = $this_UnaryExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_2_0='*'
+						{
+							newLeafNode(lv_operator_2_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_2_0, "*");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_2_0());
+						}
+						lv_operand_3_0=ruleUnaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_4='*'
+					{
+						newLeafNode(otherlv_4, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_3_1_0());
+							}
+							lv_operand_5_0=ruleUnaryExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_5_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_7_0='**'
+						{
+							newLeafNode(lv_operator_7_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_7_0, "**");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_2_0());
+						}
+						lv_operand_8_0=ruleUnaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_8_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_9='**'
+					{
+						newLeafNode(otherlv_9, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_3_1_0());
+							}
+							lv_operand_10_0=ruleUnaryExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_10_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_12_0='/'
+						{
+							newLeafNode(lv_operator_12_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_12_0, "/");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_2_0());
+						}
+						lv_operand_13_0=ruleUnaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_13_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_14='/'
+					{
+						newLeafNode(otherlv_14, grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_3_1_0());
+							}
+							lv_operand_15_0=ruleUnaryExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_15_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+			    |
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndAdd(
+							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0(),
+							$current);
+					}
+				)
+				(
+					(
+						lv_operator_17_0='%'
+						{
+							newLeafNode(lv_operator_17_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							setWithLastConsumed($current, "operator", lv_operator_17_0, "\%");
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_2_0());
+						}
+						lv_operand_18_0=ruleUnaryExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+							}
+							add(
+								$current,
+								"operand",
+								lv_operand_18_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					otherlv_19='%'
+					{
+						newLeafNode(otherlv_19, grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0());
+					}
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_3_1_0());
+							}
+							lv_operand_20_0=ruleUnaryExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+								}
+								add(
+									$current,
+									"operand",
+									lv_operand_20_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)*
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleUnaryExpression
+entryRuleUnaryExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getUnaryExpressionRule()); }
+	iv_ruleUnaryExpression=ruleUnaryExpression
+	{ $current=$iv_ruleUnaryExpression.current; }
+	EOF;
+
+// Rule UnaryExpression
+ruleUnaryExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getLiteralTerminalExpressionParserRuleCall_0());
+		}
+		this_LiteralTerminalExpression_0=ruleLiteralTerminalExpression
+		{
+			$current = $this_LiteralTerminalExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getArithmeticUnaryExpressionParserRuleCall_1());
+		}
+		this_ArithmeticUnaryExpression_1=ruleArithmeticUnaryExpression
+		{
+			$current = $this_ArithmeticUnaryExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getLogicalUnaryExpressionParserRuleCall_2());
+		}
+		this_LogicalUnaryExpression_2=ruleLogicalUnaryExpression
+		{
+			$current = $this_LogicalUnaryExpression_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getBitwiseUnaryExpressionParserRuleCall_3());
+		}
+		this_BitwiseUnaryExpression_3=ruleBitwiseUnaryExpression
+		{
+			$current = $this_BitwiseUnaryExpression_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getNewfreshExpressionParserRuleCall_4());
+		}
+		this_NewfreshExpression_4=ruleNewfreshExpression
+		{
+			$current = $this_NewfreshExpression_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getCastExpressionParserRuleCall_5());
+		}
+		this_CastExpression_5=ruleCastExpression
+		{
+			$current = $this_CastExpression_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPrefixUnaryExpressionParserRuleCall_6());
+		}
+		this_PrefixUnaryExpression_6=rulePrefixUnaryExpression
+		{
+			$current = $this_PrefixUnaryExpression_6.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPostfixUnaryExpressionParserRuleCall_7());
+		}
+		this_PostfixUnaryExpression_7=rulePostfixUnaryExpression
+		{
+			$current = $this_PostfixUnaryExpression_7.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPrimaryExpressionParserRuleCall_8());
+		}
+		this_PrimaryExpression_8=rulePrimaryExpression
+		{
+			$current = $this_PrimaryExpression_8.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRulePostfixUnaryExpression
+entryRulePostfixUnaryExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPostfixUnaryExpressionRule()); }
+	iv_rulePostfixUnaryExpression=rulePostfixUnaryExpression
+	{ $current=$iv_rulePostfixUnaryExpression.current; }
+	EOF;
+
+// Rule PostfixUnaryExpression
+rulePostfixUnaryExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	{
+		/* */
+	}
+	{
+		newCompositeNode(grammarAccess.getPostfixUnaryExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall());
+	}
+	this_IncrementOrDecrementPostfixExpression_0=ruleIncrementOrDecrementPostfixExpression
+	{
+		$current = $this_IncrementOrDecrementPostfixExpression_0.current;
+		afterParserOrEnumRuleCall();
+	}
+;
+
+// Entry rule entryRuleIncrementOrDecrementPostfixExpression
+entryRuleIncrementOrDecrementPostfixExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getIncrementOrDecrementPostfixExpressionRule()); }
+	iv_ruleIncrementOrDecrementPostfixExpression=ruleIncrementOrDecrementPostfixExpression
+	{ $current=$iv_ruleIncrementOrDecrementPostfixExpression.current; }
+	EOF;
+
+// Rule IncrementOrDecrementPostfixExpression
+ruleIncrementOrDecrementPostfixExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0());
+				}
+				lv_leftHandSide_0_0=ruleLeftHandSideExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPostfixExpressionRule());
+					}
+					set(
+						$current,
+						"leftHandSide",
+						lv_leftHandSide_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAffixOperatorParserRuleCall_1_0());
+				}
+				lv_operator_1_0=ruleAffixOperator
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPostfixExpressionRule());
+					}
+					set(
+						$current,
+						"operator",
+						lv_operator_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.AffixOperator");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRulePrefixUnaryExpression
+entryRulePrefixUnaryExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrefixUnaryExpressionRule()); }
+	iv_rulePrefixUnaryExpression=rulePrefixUnaryExpression
+	{ $current=$iv_rulePrefixUnaryExpression.current; }
+	EOF;
+
+// Rule PrefixUnaryExpression
+rulePrefixUnaryExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	{
+		/* */
+	}
+	{
+		newCompositeNode(grammarAccess.getPrefixUnaryExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall());
+	}
+	this_IncrementOrDecrementPrefixExpression_0=ruleIncrementOrDecrementPrefixExpression
+	{
+		$current = $this_IncrementOrDecrementPrefixExpression_0.current;
+		afterParserOrEnumRuleCall();
+	}
+;
+
+// Entry rule entryRuleIncrementOrDecrementPrefixExpression
+entryRuleIncrementOrDecrementPrefixExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getIncrementOrDecrementPrefixExpressionRule()); }
+	iv_ruleIncrementOrDecrementPrefixExpression=ruleIncrementOrDecrementPrefixExpression
+	{ $current=$iv_ruleIncrementOrDecrementPrefixExpression.current; }
+	EOF;
+
+// Rule IncrementOrDecrementPrefixExpression
+ruleIncrementOrDecrementPrefixExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAffixOperatorParserRuleCall_0_0());
+				}
+				lv_operator_0_0=ruleAffixOperator
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPrefixExpressionRule());
+					}
+					set(
+						$current,
+						"operator",
+						lv_operator_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.AffixOperator");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0());
+				}
+				lv_leftHandSide_1_0=ruleLeftHandSideExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPrefixExpressionRule());
+					}
+					set(
+						$current,
+						"leftHandSide",
+						lv_leftHandSide_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleAffixOperator
+entryRuleAffixOperator returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getAffixOperatorRule()); }
+	iv_ruleAffixOperator=ruleAffixOperator
+	{ $current=$iv_ruleAffixOperator.current.getText(); }
+	EOF;
+
+// Rule AffixOperator
+ruleAffixOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='++'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAffixOperatorAccess().getPlusSignPlusSignKeyword_0());
+		}
+		    |
+		kw='--'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getAffixOperatorAccess().getHyphenMinusHyphenMinusKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleNewfreshExpression
+entryRuleNewfreshExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getNewfreshExpressionRule()); }
+	iv_ruleNewfreshExpression=ruleNewfreshExpression
+	{ $current=$iv_ruleNewfreshExpression.current; }
+	EOF;
+
+// Rule NewfreshExpression
+ruleNewfreshExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			otherlv_0='newfresh'
+			{
+				newLeafNode(otherlv_0, grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_0_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0());
+					}
+					lv_leftHandSide_1_0=ruleLeftHandSideExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getNewfreshExpressionRule());
+						}
+						set(
+							$current,
+							"leftHandSide",
+							lv_leftHandSide_1_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		    |
+		(
+			otherlv_2='(:'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getNewfreshExpressionAccess().getLeftParenthesisColonKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0());
+					}
+					lv_leftHandSide_3_0=ruleLeftHandSideExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getNewfreshExpressionRule());
+						}
+						set(
+							$current,
+							"leftHandSide",
+							lv_leftHandSide_3_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_4='newfresh'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_1_2());
+			}
+			otherlv_5=')'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getNewfreshExpressionAccess().getRightParenthesisKeyword_1_3());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleCastExpression
+entryRuleCastExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getCastExpressionRule()); }
+	iv_ruleCastExpression=ruleCastExpression
+	{ $current=$iv_ruleCastExpression.current; }
+	EOF;
+
+// Rule CastExpression
+ruleCastExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='ctor'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getCastExpressionAccess().getCtorKeyword_0());
+		}
+		otherlv_1='<'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getCastExpressionAccess().getLessThanSignKeyword_1());
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getCastExpressionRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeCrossReference_2_0());
+				}
+				ruleESUfid
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3='>'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getCastExpressionAccess().getGreaterThanSignKeyword_3());
+		}
+		otherlv_4='('
+		{
+			newLeafNode(otherlv_4, grammarAccess.getCastExpressionAccess().getLeftParenthesisKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getCastExpressionAccess().getOperandExpressionParserRuleCall_5_0());
+				}
+				lv_operand_5_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getCastExpressionRule());
+					}
+					set(
+						$current,
+						"operand",
+						lv_operand_5_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_6=')'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getCastExpressionAccess().getRightParenthesisKeyword_6());
+		}
+	)
+;
+
+// Entry rule entryRuleArithmeticUnaryExpression
+entryRuleArithmeticUnaryExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getArithmeticUnaryExpressionRule()); }
+	iv_ruleArithmeticUnaryExpression=ruleArithmeticUnaryExpression
+	{ $current=$iv_ruleArithmeticUnaryExpression.current; }
+	EOF;
+
+// Rule ArithmeticUnaryExpression
+ruleArithmeticUnaryExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorArithmeticUnaryOperatorParserRuleCall_0_0());
+				}
+				lv_operator_0_0=ruleArithmeticUnaryOperator
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getArithmeticUnaryExpressionRule());
+					}
+					set(
+						$current,
+						"operator",
+						lv_operator_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ArithmeticUnaryOperator");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0());
+				}
+				lv_operand_1_0=ruleUnaryExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getArithmeticUnaryExpressionRule());
+					}
+					set(
+						$current,
+						"operand",
+						lv_operand_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleArithmeticUnaryOperator
+entryRuleArithmeticUnaryOperator returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getArithmeticUnaryOperatorRule()); }
+	iv_ruleArithmeticUnaryOperator=ruleArithmeticUnaryOperator
+	{ $current=$iv_ruleArithmeticUnaryOperator.current.getText(); }
+	EOF;
+
+// Rule ArithmeticUnaryOperator
+ruleArithmeticUnaryOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		kw='+'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getArithmeticUnaryOperatorAccess().getPlusSignKeyword_0());
+		}
+		    |
+		kw='-'
+		{
+			$current.merge(kw);
+			newLeafNode(kw, grammarAccess.getArithmeticUnaryOperatorAccess().getHyphenMinusKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleLogicalUnaryExpression
+entryRuleLogicalUnaryExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLogicalUnaryExpressionRule()); }
+	iv_ruleLogicalUnaryExpression=ruleLogicalUnaryExpression
+	{ $current=$iv_ruleLogicalUnaryExpression.current; }
+	EOF;
+
+// Rule LogicalUnaryExpression
+ruleLogicalUnaryExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				(
+					lv_operator_0_1='!'
+					{
+						newLeafNode(lv_operator_0_1, grammarAccess.getLogicalUnaryExpressionAccess().getOperatorExclamationMarkKeyword_0_0_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getLogicalUnaryExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_0_1, null);
+					}
+					    |
+					lv_operator_0_2='not'
+					{
+						newLeafNode(lv_operator_0_2, grammarAccess.getLogicalUnaryExpressionAccess().getOperatorNotKeyword_0_0_1());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getLogicalUnaryExpressionRule());
+						}
+						setWithLastConsumed($current, "operator", lv_operator_0_2, null);
+					}
+				)
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLogicalUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0());
+				}
+				lv_operand_1_0=ruleUnaryExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLogicalUnaryExpressionRule());
+					}
+					set(
+						$current,
+						"operand",
+						lv_operand_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleBitwiseUnaryExpression
+entryRuleBitwiseUnaryExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBitwiseUnaryExpressionRule()); }
+	iv_ruleBitwiseUnaryExpression=ruleBitwiseUnaryExpression
+	{ $current=$iv_ruleBitwiseUnaryExpression.current; }
+	EOF;
+
+// Rule BitwiseUnaryExpression
+ruleBitwiseUnaryExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				lv_operator_0_0='~'
+				{
+					newLeafNode(lv_operator_0_0, grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getBitwiseUnaryExpressionRule());
+					}
+					setWithLastConsumed($current, "operator", lv_operator_0_0, "~");
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0());
+				}
+				lv_operand_1_0=ruleUnaryExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getBitwiseUnaryExpressionRule());
+					}
+					set(
+						$current,
+						"operand",
+						lv_operand_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRulePrimaryExpression
+entryRulePrimaryExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPrimaryExpressionRule()); }
+	iv_rulePrimaryExpression=rulePrimaryExpression
+	{ $current=$iv_rulePrimaryExpression.current; }
+	EOF;
+
+// Rule PrimaryExpression
+rulePrimaryExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getBaseExpressionParserRuleCall_0());
+		}
+		this_BaseExpression_0=ruleBaseExpression
+		{
+			$current = $this_BaseExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0(),
+						$current);
+				}
+			)
+			otherlv_2='.'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_1_1());
+			}
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_1_2_0());
+					}
+					ruleESIdentifier
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0());
+							}
+							lv_kind_4_0=ruleValueIndexExpressionKind
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+								}
+								set(
+									$current,
+									"kind",
+									lv_kind_4_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0());
+							}
+							lv_arg_5_0=rulePositionalTupleExpressionList
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+								}
+								set(
+									$current,
+									"arg",
+									lv_arg_5_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_6=']'
+					{
+						newLeafNode(otherlv_6, grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_1_3_0_2());
+					}
+				)
+				    |
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0());
+							}
+							lv_kind_7_0=ruleValueParameterExpressionKind
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+								}
+								set(
+									$current,
+									"kind",
+									lv_kind_7_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0());
+							}
+							lv_arg_8_0=ruleMixTupleExpressionList
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+								}
+								set(
+									$current,
+									"arg",
+									lv_arg_8_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_9=')'
+					{
+						newLeafNode(otherlv_9, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_1_3_1_2());
+					}
+				)
+			)?
+		)*
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0(),
+						$current);
+				}
+			)
+			otherlv_11='->'
+			{
+				newLeafNode(otherlv_11, grammarAccess.getPrimaryExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1());
+			}
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_2_0());
+					}
+					ruleESIdentifier
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0());
+							}
+							lv_kind_13_0=ruleValueIndexExpressionKind
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+								}
+								set(
+									$current,
+									"kind",
+									lv_kind_13_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0());
+							}
+							lv_arg_14_0=rulePositionalTupleExpressionList
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+								}
+								set(
+									$current,
+									"arg",
+									lv_arg_14_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_15=']'
+					{
+						newLeafNode(otherlv_15, grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_3_0_2());
+					}
+				)
+				    |
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0());
+							}
+							lv_kind_16_0=ruleValueParameterExpressionKind
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+								}
+								set(
+									$current,
+									"kind",
+									lv_kind_16_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0());
+							}
+							lv_arg_17_0=ruleMixTupleExpressionList
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+								}
+								set(
+									$current,
+									"arg",
+									lv_arg_17_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_18=')'
+					{
+						newLeafNode(otherlv_18, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_3_1_2());
+					}
+				)
+			)?
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndSet(
+							grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_4_0(),
+							$current);
+					}
+				)
+				otherlv_20='.'
+				{
+					newLeafNode(otherlv_20, grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_2_4_1());
+				}
+				(
+					(
+						{
+							/* */
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_4_2_0());
+						}
+						ruleESIdentifier
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0());
+								}
+								lv_kind_22_0=ruleValueIndexExpressionKind
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+									}
+									set(
+										$current,
+										"kind",
+										lv_kind_22_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0());
+								}
+								lv_arg_23_0=rulePositionalTupleExpressionList
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+									}
+									set(
+										$current,
+										"arg",
+										lv_arg_23_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						otherlv_24=']'
+						{
+							newLeafNode(otherlv_24, grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_4_3_0_2());
+						}
+					)
+					    |
+					(
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0());
+								}
+								lv_kind_25_0=ruleValueParameterExpressionKind
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+									}
+									set(
+										$current,
+										"kind",
+										lv_kind_25_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0());
+								}
+								lv_arg_26_0=ruleMixTupleExpressionList
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+									}
+									set(
+										$current,
+										"arg",
+										lv_arg_26_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+						otherlv_27=')'
+						{
+							newLeafNode(otherlv_27, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_4_3_1_2());
+						}
+					)
+				)?
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleBaseExpression
+entryRuleBaseExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getBaseExpressionRule()); }
+	iv_ruleBaseExpression=ruleBaseExpression
+	{ $current=$iv_ruleBaseExpression.current; }
+	EOF;
+
+// Rule BaseExpression
+ruleBaseExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getBaseExpressionAccess().getLiteralReferenceableExpressionParserRuleCall_0());
+		}
+		this_LiteralReferenceableExpression_0=ruleLiteralReferenceableExpression
+		{
+			$current = $this_LiteralReferenceableExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		(
+			otherlv_1='('
+			{
+				newLeafNode(otherlv_1, grammarAccess.getBaseExpressionAccess().getLeftParenthesisKeyword_1_0());
+			}
+			{
+				/* */
+			}
+			{
+				newCompositeNode(grammarAccess.getBaseExpressionAccess().getExpressionParserRuleCall_1_1());
+			}
+			this_Expression_2=ruleExpression
+			{
+				$current = $this_Expression_2.current;
+				afterParserOrEnumRuleCall();
+			}
+			otherlv_3=')'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getBaseExpressionAccess().getRightParenthesisKeyword_1_2());
+			}
+		)
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getBaseExpressionAccess().getInvokeExpressionDeprecatedParserRuleCall_2());
+		}
+		this_InvokeExpressionDeprecated_4=ruleInvokeExpressionDeprecated
+		{
+			$current = $this_InvokeExpressionDeprecated_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getBaseExpressionAccess().getInstantiationExpressionParserRuleCall_3());
+		}
+		this_InstantiationExpression_5=ruleInstantiationExpression
+		{
+			$current = $this_InstantiationExpression_5.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleInvokeExpressionDeprecated
+entryRuleInvokeExpressionDeprecated returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedRule()); }
+	iv_ruleInvokeExpressionDeprecated=ruleInvokeExpressionDeprecated
+	{ $current=$iv_ruleInvokeExpressionDeprecated.current; }
+	EOF;
+
+// Rule InvokeExpressionDeprecated
+ruleInvokeExpressionDeprecated returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='(:'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getInvokeExpressionDeprecatedAccess().getLeftParenthesisColonKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_2_0());
+				}
+				lv_args_2_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getInvokeExpressionDeprecatedRule());
+					}
+					add(
+						$current,
+						"args",
+						lv_args_2_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeLiteralReferenceElementParserRuleCall_3_0());
+				}
+				lv_invoke_3_0=ruleLiteralReferenceElement
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getInvokeExpressionDeprecatedRule());
+					}
+					set(
+						$current,
+						"invoke",
+						lv_invoke_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceElement");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_4_0());
+				}
+				lv_args_4_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getInvokeExpressionDeprecatedRule());
+					}
+					add(
+						$current,
+						"args",
+						lv_args_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_5=')'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getInvokeExpressionDeprecatedAccess().getRightParenthesisKeyword_5());
+		}
+	)
+;
+
+// Entry rule entryRuleInstantiationExpression
+entryRuleInstantiationExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getInstantiationExpressionRule()); }
+	iv_ruleInstantiationExpression=ruleInstantiationExpression
+	{ $current=$iv_ruleInstantiationExpression.current; }
+	EOF;
+
+// Rule InstantiationExpression
+ruleInstantiationExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getInstantiationExpressionAccess().getInstantiationExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getInstantiationExpressionAccess().getInstanceDynamicInstanceSpecificationParserRuleCall_1_0());
+				}
+				lv_instance_1_0=ruleDynamicInstanceSpecification
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getInstantiationExpressionRule());
+					}
+					set(
+						$current,
+						"instance",
+						lv_instance_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.DynamicInstanceSpecification");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2=';'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getInstantiationExpressionAccess().getSemicolonKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleDynamicInstanceSpecification
+entryRuleDynamicInstanceSpecification returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDynamicInstanceSpecificationRule()); }
+	iv_ruleDynamicInstanceSpecification=ruleDynamicInstanceSpecification
+	{ $current=$iv_ruleDynamicInstanceSpecification.current; }
+	EOF;
+
+// Rule DynamicInstanceSpecification
+ruleDynamicInstanceSpecification returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getDynamicInstanceSpecificationAccess().getInstanceMachineAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='new'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getDynamicInstanceSpecificationAccess().getNewKeyword_1());
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDynamicInstanceSpecificationRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineCrossReference_2_0());
+				}
+				ruleESIdentifier
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				otherlv_3='('
+				{
+					newLeafNode(otherlv_3, grammarAccess.getDynamicInstanceSpecificationAccess().getLeftParenthesisKeyword_3_0_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_0_0());
+							}
+							lv_slot_4_0=ruleSlotParameter
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getDynamicInstanceSpecificationRule());
+								}
+								add(
+									$current,
+									"slot",
+									lv_slot_4_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						otherlv_5=','
+						{
+							newLeafNode(otherlv_5, grammarAccess.getDynamicInstanceSpecificationAccess().getCommaKeyword_3_0_1_1_0());
+						}
+						(
+							(
+								{
+									newCompositeNode(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_1_1_0());
+								}
+								lv_slot_6_0=ruleSlotParameter
+								{
+									if ($current==null) {
+										$current = createModelElementForParent(grammarAccess.getDynamicInstanceSpecificationRule());
+									}
+									add(
+										$current,
+										"slot",
+										lv_slot_6_0,
+										"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
+									afterParserOrEnumRuleCall();
+								}
+							)
+						)
+					)*
+				)?
+				otherlv_7=')'
+				{
+					newLeafNode(otherlv_7, grammarAccess.getDynamicInstanceSpecificationAccess().getRightParenthesisKeyword_3_0_2());
+				}
+			)
+			    |
+			(
+				otherlv_8='{'
+				{
+					newLeafNode(otherlv_8, grammarAccess.getDynamicInstanceSpecificationAccess().getLeftCurlyBracketKeyword_3_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotPropertyParserRuleCall_3_1_1_0_0());
+							}
+							lv_slot_9_0=ruleSlotProperty
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getDynamicInstanceSpecificationRule());
+								}
+								add(
+									$current,
+									"slot",
+									lv_slot_9_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.SlotProperty");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_10=';'
+					{
+						newLeafNode(otherlv_10, grammarAccess.getDynamicInstanceSpecificationAccess().getSemicolonKeyword_3_1_1_1());
+					}
+				)*
+				otherlv_11='}'
+				{
+					newLeafNode(otherlv_11, grammarAccess.getDynamicInstanceSpecificationAccess().getRightCurlyBracketKeyword_3_1_2());
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleTupleParameterExpression
+entryRuleTupleParameterExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getTupleParameterExpressionRule()); }
+	iv_ruleTupleParameterExpression=ruleTupleParameterExpression
+	{ $current=$iv_ruleTupleParameterExpression.current; }
+	EOF;
+
+// Rule TupleParameterExpression
+ruleTupleParameterExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='('
+		{
+			newLeafNode(otherlv_0, grammarAccess.getTupleParameterExpressionAccess().getLeftParenthesisKeyword_0());
+		}
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getTupleParameterExpressionAccess().getMixTupleExpressionListParserRuleCall_1());
+		}
+		this_MixTupleExpressionList_1=ruleMixTupleExpressionList
+		{
+			$current = $this_MixTupleExpressionList_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		otherlv_2=')'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getTupleParameterExpressionAccess().getRightParenthesisKeyword_2());
+		}
+	)
+;
+
+// Entry rule entryRuleMixTupleExpressionList
+entryRuleMixTupleExpressionList returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getMixTupleExpressionListRule()); }
+	iv_ruleMixTupleExpressionList=ruleMixTupleExpressionList
+	{ $current=$iv_ruleMixTupleExpressionList.current; }
+	EOF;
+
+// Rule MixTupleExpressionList
+ruleMixTupleExpressionList returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getMixTupleExpressionListAccess().getMixTupleExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_1_0_0());
+					}
+					lv_value_1_1=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
+						}
+						add(
+							$current,
+							"value",
+							lv_value_1_1,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+					    |
+					{
+						newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_1_0_1());
+					}
+					lv_value_1_2=ruleNamedExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
+						}
+						add(
+							$current,
+							"value",
+							lv_value_1_2,
+							"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		(
+			otherlv_2=','
+			{
+				newLeafNode(otherlv_2, grammarAccess.getMixTupleExpressionListAccess().getCommaKeyword_2_0());
+			}
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_2_1_0_0());
+						}
+						lv_value_3_1=ruleExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
+							}
+							add(
+								$current,
+								"value",
+								lv_value_3_1,
+								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+							afterParserOrEnumRuleCall();
+						}
+						    |
+						{
+							newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_2_1_0_1());
+						}
+						lv_value_3_2=ruleNamedExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
+							}
+							add(
+								$current,
+								"value",
+								lv_value_3_2,
+								"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRulePositionalTupleExpressionList
+entryRulePositionalTupleExpressionList returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getPositionalTupleExpressionListRule()); }
+	iv_rulePositionalTupleExpressionList=rulePositionalTupleExpressionList
+	{ $current=$iv_rulePositionalTupleExpressionList.current; }
+	EOF;
+
+// Rule PositionalTupleExpressionList
+rulePositionalTupleExpressionList returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_0_0());
+				}
+				lv_value_0_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPositionalTupleExpressionListRule());
+					}
+					add(
+						$current,
+						"value",
+						lv_value_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_1=','
+			{
+				newLeafNode(otherlv_1, grammarAccess.getPositionalTupleExpressionListAccess().getCommaKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_1_1_0());
+					}
+					lv_value_2_0=ruleExpression
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getPositionalTupleExpressionListRule());
+						}
+						add(
+							$current,
+							"value",
+							lv_value_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
+;
+
+// Entry rule entryRuleNamedExpression
+entryRuleNamedExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getNamedExpressionRule()); }
+	iv_ruleNamedExpression=ruleNamedExpression
+	{ $current=$iv_ruleNamedExpression.current; }
+	EOF;
+
+// Rule NamedExpression
+ruleNamedExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				lv_name_0_0=RULE_XLIA_ID
+				{
+					newLeafNode(lv_name_0_0, grammarAccess.getNamedExpressionAccess().getNameXLIA_IDTerminalRuleCall_0_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getNamedExpressionRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"name",
+						lv_name_0_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
+				}
+			)
+		)
+		(
+			otherlv_1=':'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getNamedExpressionAccess().getColonKeyword_1_0());
+			}
+			    |
+			otherlv_2='=>'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getNamedExpressionAccess().getEqualsSignGreaterThanSignKeyword_1_1());
+			}
+			    |
+			otherlv_3='<-'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getNamedExpressionAccess().getLessThanSignHyphenMinusKeyword_1_2());
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getNamedExpressionAccess().getExpressionExpressionParserRuleCall_2_0());
+				}
+				lv_expression_4_0=ruleExpression
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getNamedExpressionRule());
+					}
+					set(
+						$current,
+						"expression",
+						lv_expression_4_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralReferenceableExpression
+entryRuleLiteralReferenceableExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralReferenceableExpressionRule()); }
+	iv_ruleLiteralReferenceableExpression=ruleLiteralReferenceableExpression
+	{ $current=$iv_ruleLiteralReferenceableExpression.current; }
+	EOF;
+
+// Rule LiteralReferenceableExpression
+ruleLiteralReferenceableExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralCollectionExpressionParserRuleCall_0());
+		}
+		this_LiteralCollectionExpression_0=ruleLiteralCollectionExpression
+		{
+			$current = $this_LiteralCollectionExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralReferenceExpressionParserRuleCall_1());
+		}
+		this_LiteralReferenceExpression_1=ruleLiteralReferenceExpression
+		{
+			$current = $this_LiteralReferenceExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralTerminalExpression
+entryRuleLiteralTerminalExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralTerminalExpressionRule()); }
+	iv_ruleLiteralTerminalExpression=ruleLiteralTerminalExpression
+	{ $current=$iv_ruleLiteralTerminalExpression.current; }
+	EOF;
+
+// Rule LiteralTerminalExpression
+ruleLiteralTerminalExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralBooleanExpressionParserRuleCall_0());
+		}
+		this_LiteralBooleanExpression_0=ruleLiteralBooleanExpression
+		{
+			$current = $this_LiteralBooleanExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralIntegerExpressionParserRuleCall_1());
+		}
+		this_LiteralIntegerExpression_1=ruleLiteralIntegerExpression
+		{
+			$current = $this_LiteralIntegerExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralRationalExpressionParserRuleCall_2());
+		}
+		this_LiteralRationalExpression_2=ruleLiteralRationalExpression
+		{
+			$current = $this_LiteralRationalExpression_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralFloatExpressionParserRuleCall_3());
+		}
+		this_LiteralFloatExpression_3=ruleLiteralFloatExpression
+		{
+			$current = $this_LiteralFloatExpression_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralCharacterExpressionParserRuleCall_4());
+		}
+		this_LiteralCharacterExpression_4=ruleLiteralCharacterExpression
+		{
+			$current = $this_LiteralCharacterExpression_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralStringExpressionParserRuleCall_5());
+		}
+		this_LiteralStringExpression_5=ruleLiteralStringExpression
+		{
+			$current = $this_LiteralStringExpression_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralNullExpressionParserRuleCall_6());
+		}
+		this_LiteralNullExpression_6=ruleLiteralNullExpression
+		{
+			$current = $this_LiteralNullExpression_6.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralBooleanExpression
+entryRuleLiteralBooleanExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralBooleanExpressionRule()); }
+	iv_ruleLiteralBooleanExpression=ruleLiteralBooleanExpression
+	{ $current=$iv_ruleLiteralBooleanExpression.current; }
+	EOF;
+
+// Rule LiteralBooleanExpression
+ruleLiteralBooleanExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralBooleanExpressionAccess().getLiteralBooleanExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLiteralBooleanExpressionAccess().getValueEBooleanParserRuleCall_1_0());
+				}
+				lv_value_1_0=ruleEBoolean
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLiteralBooleanExpressionRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EBoolean");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralIntegerExpression
+entryRuleLiteralIntegerExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralIntegerExpressionRule()); }
+	iv_ruleLiteralIntegerExpression=ruleLiteralIntegerExpression
+	{ $current=$iv_ruleLiteralIntegerExpression.current; }
+	EOF;
+
+// Rule LiteralIntegerExpression
+ruleLiteralIntegerExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralIntegerExpressionAccess().getLiteralIntegerExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLiteralIntegerExpressionAccess().getValueEIntegerParserRuleCall_1_0());
+				}
+				lv_value_1_0=ruleEInteger
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLiteralIntegerExpressionRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EInteger");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralRationalExpression
+entryRuleLiteralRationalExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralRationalExpressionRule()); }
+	iv_ruleLiteralRationalExpression=ruleLiteralRationalExpression
+	{ $current=$iv_ruleLiteralRationalExpression.current; }
+	EOF;
+
+// Rule LiteralRationalExpression
+ruleLiteralRationalExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralRationalExpressionAccess().getLiteralRationalExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorEIntegerParserRuleCall_1_0());
+				}
+				lv_numerator_1_0=ruleEInteger
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLiteralRationalExpressionRule());
+					}
+					set(
+						$current,
+						"numerator",
+						lv_numerator_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EInteger");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='/'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getLiteralRationalExpressionAccess().getSolidusKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorEIntegerParserRuleCall_3_0());
+				}
+				lv_denominator_3_0=ruleEInteger
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLiteralRationalExpressionRule());
+					}
+					set(
+						$current,
+						"denominator",
+						lv_denominator_3_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EInteger");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralFloatExpression
+entryRuleLiteralFloatExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralFloatExpressionRule()); }
+	iv_ruleLiteralFloatExpression=ruleLiteralFloatExpression
+	{ $current=$iv_ruleLiteralFloatExpression.current; }
+	EOF;
+
+// Rule LiteralFloatExpression
+ruleLiteralFloatExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralFloatExpressionAccess().getLiteralFloatExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLiteralFloatExpressionAccess().getValueEDoubleParserRuleCall_1_0());
+				}
+				lv_value_1_0=ruleEDouble
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLiteralFloatExpressionRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EDouble");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralCharacterExpression
+entryRuleLiteralCharacterExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralCharacterExpressionRule()); }
+	iv_ruleLiteralCharacterExpression=ruleLiteralCharacterExpression
+	{ $current=$iv_ruleLiteralCharacterExpression.current; }
+	EOF;
+
+// Rule LiteralCharacterExpression
+ruleLiteralCharacterExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralCharacterExpressionAccess().getLiteralCharacterExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLiteralCharacterExpressionAccess().getValueECharacterParserRuleCall_1_0());
+				}
+				lv_value_1_0=ruleECharacter
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLiteralCharacterExpressionRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.ECharacter");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralStringExpression
+entryRuleLiteralStringExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralStringExpressionRule()); }
+	iv_ruleLiteralStringExpression=ruleLiteralStringExpression
+	{ $current=$iv_ruleLiteralStringExpression.current; }
+	EOF;
+
+// Rule LiteralStringExpression
+ruleLiteralStringExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralStringExpressionAccess().getLiteralStringExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getLiteralStringExpressionAccess().getValueEStringParserRuleCall_1_0());
+				}
+				lv_value_1_0=ruleEString
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getLiteralStringExpressionRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_1_0,
+						"org.eclipse.efm.formalml.xtext.FormalML.EString");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralNullExpression
+entryRuleLiteralNullExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralNullExpressionRule()); }
+	iv_ruleLiteralNullExpression=ruleLiteralNullExpression
+	{ $current=$iv_ruleLiteralNullExpression.current; }
+	EOF;
+
+// Rule LiteralNullExpression
+ruleLiteralNullExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_0_0(),
+						$current);
+				}
+			)
+			(
+				otherlv_1='null'
+				{
+					newLeafNode(otherlv_1, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_0());
+				}
+				    |
+				otherlv_2='$null'
+				{
+					newLeafNode(otherlv_2, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_1());
+				}
+			)
+		)
+		    |
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElement(
+						grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_1_0(),
+						$current);
+				}
+			)
+			(
+				otherlv_4='null<'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_0());
+				}
+				    |
+				otherlv_5='$null<'
+				{
+					newLeafNode(otherlv_5, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_1());
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getLiteralNullExpressionAccess().getTypeDataTypeParserRuleCall_1_2_0());
+					}
+					lv_type_6_0=ruleDataType
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getLiteralNullExpressionRule());
+						}
+						set(
+							$current,
+							"type",
+							lv_type_6_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_7='>'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getLiteralNullExpressionAccess().getGreaterThanSignKeyword_1_3());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralCollectionExpression
+entryRuleLiteralCollectionExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralCollectionExpressionRule()); }
+	iv_ruleLiteralCollectionExpression=ruleLiteralCollectionExpression
+	{ $current=$iv_ruleLiteralCollectionExpression.current; }
+	EOF;
+
+// Rule LiteralCollectionExpression
+ruleLiteralCollectionExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralCollectionExpressionAccess().getLiteralCollectionExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='<'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getLiteralCollectionExpressionAccess().getLessThanSignKeyword_1_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeDataTypeParserRuleCall_1_1_0());
+					}
+					lv_datatype_2_0=ruleDataType
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+						}
+						set(
+							$current,
+							"datatype",
+							lv_datatype_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			otherlv_3='>'
+			{
+				newLeafNode(otherlv_3, grammarAccess.getLiteralCollectionExpressionAccess().getGreaterThanSignKeyword_1_2());
+			}
+		)?
+		otherlv_4='{'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getLiteralCollectionExpressionAccess().getLeftCurlyBracketKeyword_2());
+		}
+		(
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_0_0_0());
+						}
+						lv_value_5_0=ruleExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+							}
+							add(
+								$current,
+								"value",
+								lv_value_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				    |
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_0_1_0());
+						}
+						lv_value_6_0=ruleNamedExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+							}
+							add(
+								$current,
+								"value",
+								lv_value_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)
+			(
+				otherlv_7=','
+				{
+					newLeafNode(otherlv_7, grammarAccess.getLiteralCollectionExpressionAccess().getCommaKeyword_3_1_0());
+				}
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_1_1_0_0());
+							}
+							lv_value_8_0=ruleExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+								}
+								add(
+									$current,
+									"value",
+									lv_value_8_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_1_1_1_0());
+							}
+							lv_value_9_0=ruleNamedExpression
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+								}
+								add(
+									$current,
+									"value",
+									lv_value_9_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)*
+		)?
+		otherlv_10='}'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getLiteralCollectionExpressionAccess().getRightCurlyBracketKeyword_4());
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralReferenceExpression
+entryRuleLiteralReferenceExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralReferenceExpressionRule()); }
+	iv_ruleLiteralReferenceExpression=ruleLiteralReferenceExpression
+	{ $current=$iv_ruleLiteralReferenceExpression.current; }
+	EOF;
+
+// Rule LiteralReferenceExpression
+ruleLiteralReferenceExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceElementParserRuleCall_0());
+		}
+		this_LiteralReferenceElement_0=ruleLiteralReferenceElement
+		{
+			$current = $this_LiteralReferenceElement_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceVariableContextParserRuleCall_1());
+		}
+		this_LiteralReferenceVariableContext_1=ruleLiteralReferenceVariableContext
+		{
+			$current = $this_LiteralReferenceVariableContext_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_2());
+		}
+		this_LiteralReferenceMachineContext_2=ruleLiteralReferenceMachineContext
+		{
+			$current = $this_LiteralReferenceMachineContext_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralEnvExpressionParserRuleCall_3());
+		}
+		this_LiteralEnvExpression_3=ruleLiteralEnvExpression
+		{
+			$current = $this_LiteralEnvExpression_3.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralReferenceElement
+entryRuleLiteralReferenceElement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralReferenceElementRule()); }
+	iv_ruleLiteralReferenceElement=ruleLiteralReferenceElement
+	{ $current=$iv_ruleLiteralReferenceElement.current; }
+	EOF;
+
+// Rule LiteralReferenceElement
+ruleLiteralReferenceElement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralReferenceElementAccess().getLiteralReferenceElementAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getLiteralReferenceElementRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementCrossReference_1_0());
+				}
+				ruleESIdentifier
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getKindValueIndexExpressionKindEnumRuleCall_2_0_0_0());
+						}
+						lv_kind_2_0=ruleValueIndexExpressionKind
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
+							}
+							set(
+								$current,
+								"kind",
+								lv_kind_2_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getArgPositionalTupleExpressionListParserRuleCall_2_0_1_0());
+						}
+						lv_arg_3_0=rulePositionalTupleExpressionList
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
+							}
+							set(
+								$current,
+								"arg",
+								lv_arg_3_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_4=']'
+				{
+					newLeafNode(otherlv_4, grammarAccess.getLiteralReferenceElementAccess().getRightSquareBracketKeyword_2_0_2());
+				}
+			)
+			    |
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getKindValueParameterExpressionKindEnumRuleCall_2_1_0_0());
+						}
+						lv_kind_5_0=ruleValueParameterExpressionKind
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
+							}
+							set(
+								$current,
+								"kind",
+								lv_kind_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getArgMixTupleExpressionListParserRuleCall_2_1_1_0());
+						}
+						lv_arg_6_0=ruleMixTupleExpressionList
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
+							}
+							set(
+								$current,
+								"arg",
+								lv_arg_6_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_7=')'
+				{
+					newLeafNode(otherlv_7, grammarAccess.getLiteralReferenceElementAccess().getRightParenthesisKeyword_2_1_2());
+				}
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleLiteralPureReferenceElement
+entryRuleLiteralPureReferenceElement returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralPureReferenceElementRule()); }
+	iv_ruleLiteralPureReferenceElement=ruleLiteralPureReferenceElement
+	{ $current=$iv_ruleLiteralPureReferenceElement.current; }
+	EOF;
+
+// Rule LiteralPureReferenceElement
+ruleLiteralPureReferenceElement returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralPureReferenceElementAccess().getLiteralReferenceElementAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					/* */
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getLiteralPureReferenceElementRule());
+					}
+				}
+				{
+					newCompositeNode(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementCrossReference_1_0());
+				}
+				ruleESIdentifier
+				{
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralReferenceVariableContext
+entryRuleLiteralReferenceVariableContext returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralReferenceVariableContextRule()); }
+	iv_ruleLiteralReferenceVariableContext=ruleLiteralReferenceVariableContext
+	{ $current=$iv_ruleLiteralReferenceVariableContext.current; }
+	EOF;
+
+// Rule LiteralReferenceVariableContext
+ruleLiteralReferenceVariableContext returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeExpressionParserRuleCall_0());
+		}
+		this_LiteralTimeExpression_0=ruleLiteralTimeExpression
+		{
+			$current = $this_LiteralTimeExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeDeltaExpressionParserRuleCall_1());
+		}
+		this_LiteralTimeDeltaExpression_1=ruleLiteralTimeDeltaExpression
+		{
+			$current = $this_LiteralTimeDeltaExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralTimeExpression
+entryRuleLiteralTimeExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralTimeExpressionRule()); }
+	iv_ruleLiteralTimeExpression=ruleLiteralTimeExpression
+	{ $current=$iv_ruleLiteralTimeExpression.current; }
+	EOF;
+
+// Rule LiteralTimeExpression
+ruleLiteralTimeExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralTimeExpressionAccess().getLiteralTimeExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='$time'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralTimeExpressionAccess().getTimeKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralTimeDeltaExpression
+entryRuleLiteralTimeDeltaExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralTimeDeltaExpressionRule()); }
+	iv_ruleLiteralTimeDeltaExpression=ruleLiteralTimeDeltaExpression
+	{ $current=$iv_ruleLiteralTimeDeltaExpression.current; }
+	EOF;
+
+// Rule LiteralTimeDeltaExpression
+ruleLiteralTimeDeltaExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralTimeDeltaExpressionAccess().getLiteralTimeDeltaExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='$delta'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralTimeDeltaExpressionAccess().getDeltaKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralReferenceMachineContext
+entryRuleLiteralReferenceMachineContext returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralReferenceMachineContextRule()); }
+	iv_ruleLiteralReferenceMachineContext=ruleLiteralReferenceMachineContext
+	{ $current=$iv_ruleLiteralReferenceMachineContext.current; }
+	EOF;
+
+// Rule LiteralReferenceMachineContext
+ruleLiteralReferenceMachineContext returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralThisExpressionParserRuleCall_0());
+		}
+		this_LiteralThisExpression_0=ruleLiteralThisExpression
+		{
+			$current = $this_LiteralThisExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSelfExpressionParserRuleCall_1());
+		}
+		this_LiteralSelfExpression_1=ruleLiteralSelfExpression
+		{
+			$current = $this_LiteralSelfExpression_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralParentExpressionParserRuleCall_2());
+		}
+		this_LiteralParentExpression_2=ruleLiteralParentExpression
+		{
+			$current = $this_LiteralParentExpression_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSuperExpressionParserRuleCall_3());
+		}
+		this_LiteralSuperExpression_3=ruleLiteralSuperExpression
+		{
+			$current = $this_LiteralSuperExpression_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSystemExpressionParserRuleCall_4());
+		}
+		this_LiteralSystemExpression_4=ruleLiteralSystemExpression
+		{
+			$current = $this_LiteralSystemExpression_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralEnvExpressionParserRuleCall_5());
+		}
+		this_LiteralEnvExpression_5=ruleLiteralEnvExpression
+		{
+			$current = $this_LiteralEnvExpression_5.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralThisExpression
+entryRuleLiteralThisExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralThisExpressionRule()); }
+	iv_ruleLiteralThisExpression=ruleLiteralThisExpression
+	{ $current=$iv_ruleLiteralThisExpression.current; }
+	EOF;
+
+// Rule LiteralThisExpression
+ruleLiteralThisExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralThisExpressionAccess().getLiteralThisExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='$this'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralThisExpressionAccess().getThisKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralSelfExpression
+entryRuleLiteralSelfExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralSelfExpressionRule()); }
+	iv_ruleLiteralSelfExpression=ruleLiteralSelfExpression
+	{ $current=$iv_ruleLiteralSelfExpression.current; }
+	EOF;
+
+// Rule LiteralSelfExpression
+ruleLiteralSelfExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralSelfExpressionAccess().getLiteralSelfExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='$self'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralSelfExpressionAccess().getSelfKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralParentExpression
+entryRuleLiteralParentExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralParentExpressionRule()); }
+	iv_ruleLiteralParentExpression=ruleLiteralParentExpression
+	{ $current=$iv_ruleLiteralParentExpression.current; }
+	EOF;
+
+// Rule LiteralParentExpression
+ruleLiteralParentExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralParentExpressionAccess().getLiteralParentExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='$parent'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralParentExpressionAccess().getParentKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralSuperExpression
+entryRuleLiteralSuperExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralSuperExpressionRule()); }
+	iv_ruleLiteralSuperExpression=ruleLiteralSuperExpression
+	{ $current=$iv_ruleLiteralSuperExpression.current; }
+	EOF;
+
+// Rule LiteralSuperExpression
+ruleLiteralSuperExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralSuperExpressionAccess().getLiteralSuperExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='$super'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralSuperExpressionAccess().getSuperKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralSystemExpression
+entryRuleLiteralSystemExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralSystemExpressionRule()); }
+	iv_ruleLiteralSystemExpression=ruleLiteralSystemExpression
+	{ $current=$iv_ruleLiteralSystemExpression.current; }
+	EOF;
+
+// Rule LiteralSystemExpression
+ruleLiteralSystemExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralSystemExpressionAccess().getLiteralSystemExpressionAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='$system'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getLiteralSystemExpressionAccess().getSystemKeyword_1());
+		}
+	)
+;
+
+// Entry rule entryRuleLiteralEnvExpression
+entryRuleLiteralEnvExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralEnvExpressionRule()); }
+	iv_ruleLiteralEnvExpression=ruleLiteralEnvExpression
+	{ $current=$iv_ruleLiteralEnvExpression.current; }
+	EOF;
+
+// Rule LiteralEnvExpression
+ruleLiteralEnvExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				/* */
+			}
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getLiteralEnvExpressionAccess().getLiteralEnvExpressionAction_0(),
+					$current);
+			}
+		)
+		(
+			otherlv_1='$env'
+			{
+				newLeafNode(otherlv_1, grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_0());
+			}
+			    |
+			otherlv_2='env'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_1());
+			}
+		)
+	)
+;
+
+// Entry rule entryRuleLiteralPureReferenceExpression
+entryRuleLiteralPureReferenceExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getLiteralPureReferenceExpressionRule()); }
+	iv_ruleLiteralPureReferenceExpression=ruleLiteralPureReferenceExpression
+	{ $current=$iv_ruleLiteralPureReferenceExpression.current; }
+	EOF;
+
+// Rule LiteralPureReferenceExpression
+ruleLiteralPureReferenceExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralPureReferenceElementParserRuleCall_0());
+		}
+		this_LiteralPureReferenceElement_0=ruleLiteralPureReferenceElement
+		{
+			$current = $this_LiteralPureReferenceElement_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_1());
+		}
+		this_LiteralReferenceMachineContext_1=ruleLiteralReferenceMachineContext
+		{
+			$current = $this_LiteralReferenceMachineContext_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleValueSelectionExpression
+entryRuleValueSelectionExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getValueSelectionExpressionRule()); }
+	iv_ruleValueSelectionExpression=ruleValueSelectionExpression
+	{ $current=$iv_ruleValueSelectionExpression.current; }
+	EOF;
+
+// Rule ValueSelectionExpression
+ruleValueSelectionExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getLiteralReferenceExpressionParserRuleCall_0());
+		}
+		this_LiteralReferenceExpression_0=ruleLiteralReferenceExpression
+		{
+			$current = $this_LiteralReferenceExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_1_0(),
+						$current);
+				}
+			)
+			otherlv_2='.'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_1_1());
+			}
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getValueSelectionExpressionRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_1_2_0());
+					}
+					ruleESIdentifier
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0());
+						}
+						lv_kind_4_0=ruleValueIndexExpressionKind
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+							}
+							set(
+								$current,
+								"kind",
+								lv_kind_4_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_1_0());
+						}
+						lv_arg_5_0=rulePositionalTupleExpressionList
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+							}
+							set(
+								$current,
+								"arg",
+								lv_arg_5_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_6=']'
+				{
+					newLeafNode(otherlv_6, grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_1_3_2());
+				}
+			)?
+		)*
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_0(),
+						$current);
+				}
+			)
+			otherlv_8='->'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getValueSelectionExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1());
+			}
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getValueSelectionExpressionRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_2_0());
+					}
+					ruleESIdentifier
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0());
+						}
+						lv_kind_10_0=ruleValueIndexExpressionKind
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+							}
+							set(
+								$current,
+								"kind",
+								lv_kind_10_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_1_0());
+						}
+						lv_arg_11_0=rulePositionalTupleExpressionList
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+							}
+							set(
+								$current,
+								"arg",
+								lv_arg_11_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				otherlv_12=']'
+				{
+					newLeafNode(otherlv_12, grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_3_2());
+				}
+			)?
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndSet(
+							grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_4_0(),
+							$current);
+					}
+				)
+				otherlv_14='.'
+				{
+					newLeafNode(otherlv_14, grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_2_4_1());
+				}
+				(
+					(
+						{
+							/* */
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getValueSelectionExpressionRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_4_2_0());
+						}
+						ruleESIdentifier
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0());
+							}
+							lv_kind_16_0=ruleValueIndexExpressionKind
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+								}
+								set(
+									$current,
+									"kind",
+									lv_kind_16_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0());
+							}
+							lv_arg_17_0=rulePositionalTupleExpressionList
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+								}
+								set(
+									$current,
+									"arg",
+									lv_arg_17_0,
+									"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+					otherlv_18=']'
+					{
+						newLeafNode(otherlv_18, grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_4_3_2());
+					}
+				)?
+			)*
+		)?
+	)
+;
+
+// Entry rule entryRuleValuePureNamedMachineExpression
+entryRuleValuePureNamedMachineExpression returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionRule()); }
+	iv_ruleValuePureNamedMachineExpression=ruleValuePureNamedMachineExpression
+	{ $current=$iv_ruleValuePureNamedMachineExpression.current; }
+	EOF;
+
+// Rule ValuePureNamedMachineExpression
+ruleValuePureNamedMachineExpression returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			/* */
+		}
+		{
+			newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getLiteralPureReferenceExpressionParserRuleCall_0());
+		}
+		this_LiteralPureReferenceExpression_0=ruleLiteralPureReferenceExpression
+		{
+			$current = $this_LiteralPureReferenceExpression_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_1_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0());
+					}
+					lv_kind_2_0=ruleValueDotFieldExpressionKind
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getValuePureNamedMachineExpressionRule());
+						}
+						set(
+							$current,
+							"kind",
+							lv_kind_2_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getValuePureNamedMachineExpressionRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_1_2_0());
+					}
+					ruleESIdentifier
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+		(
+			(
+				{
+					/* */
+				}
+				{
+					$current = forceCreateModelElementAndSet(
+						grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_0(),
+						$current);
+				}
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_2_1_0());
+					}
+					lv_kind_5_0=ruleValueArrowFieldExpressionKind
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getValuePureNamedMachineExpressionRule());
+						}
+						set(
+							$current,
+							"kind",
+							lv_kind_5_0,
+							"org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						/* */
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getValuePureNamedMachineExpressionRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_2_0());
+					}
+					ruleESIdentifier
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						/* */
+					}
+					{
+						$current = forceCreateModelElementAndSet(
+							grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_3_0(),
+							$current);
+					}
+				)
+				(
+					(
+						{
+							newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_2_3_1_0());
+						}
+						lv_kind_8_0=ruleValueDotFieldExpressionKind
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getValuePureNamedMachineExpressionRule());
+							}
+							set(
+								$current,
+								"kind",
+								lv_kind_8_0,
+								"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						{
+							/* */
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getValuePureNamedMachineExpressionRule());
+							}
+						}
+						{
+							newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_3_2_0());
+						}
+						ruleESIdentifier
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+			)*
+		)?
+	)
+;
+
+// Rule VisibilityKind
+ruleVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='public'
+			{
+				$current = grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='private'
+			{
+				$current = grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='protected'
+			{
+				$current = grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='package'
+			{
+				$current = grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3());
+			}
+		)
+	)
+;
+
+// Rule DesignKind
+ruleDesignKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='model'
+			{
+				$current = grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='prototype'
+			{
+				$current = grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1());
+			}
+		)
+	)
+;
+
+// Rule PseudostateKind
+rulePseudostateKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='junction'
+			{
+				$current = grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='choice'
+			{
+				$current = grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='entryPoint'
+			{
+				$current = grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='exitPoint'
+			{
+				$current = grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_3());
+			}
+		)
+		    |
+		(
+			enumLiteral_4='fork'
+			{
+				$current = grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_4, grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4());
+			}
+		)
+		    |
+		(
+			enumLiteral_5='join'
+			{
+				$current = grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_5, grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5());
+			}
+		)
+		    |
+		(
+			enumLiteral_6='dhistory'
+			{
+				$current = grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_6, grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6());
+			}
+		)
+		    |
+		(
+			enumLiteral_7='shistory'
+			{
+				$current = grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_7, grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7());
+			}
+		)
+	)
+;
+
+// Rule PseudostateInitialKind
+rulePseudostateInitialKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='initial'
+		{
+			$current = grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule EndingPseudostateKind
+ruleEndingPseudostateKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='terminal'
+			{
+				$current = grammarAccess.getEndingPseudostateKindAccess().getTerminateEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getEndingPseudostateKindAccess().getTerminateEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='return'
+			{
+				$current = grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1());
+			}
+		)
+	)
+;
+
+// Rule ComProtocolKind
+ruleComProtocolKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='env'
+			{
+				$current = grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='rdv'
+			{
+				$current = grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='multi_rdv'
+			{
+				$current = grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2());
+			}
+		)
+	)
+;
+
+// Rule ComEnvRdvProtocolKind
+ruleComEnvRdvProtocolKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='env'
+			{
+				$current = grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='rdv'
+			{
+				$current = grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1());
+			}
+		)
+	)
+;
+
+// Rule ComMultiRdvProtocolKind
+ruleComMultiRdvProtocolKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='multi_rdv'
+		{
+			$current = grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule BufferProtocolKind
+ruleBufferProtocolKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='buffer'
+		{
+			$current = grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ComCastKing
+ruleComCastKing returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='unicast'
+			{
+				$current = grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='anycast'
+			{
+				$current = grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='multicast'
+			{
+				$current = grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='broadcast'
+			{
+				$current = grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3());
+			}
+		)
+	)
+;
+
+// Rule PrimitiveNumberSign
+rulePrimitiveNumberSign returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='+'
+			{
+				$current = grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='++'
+			{
+				$current = grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='-'
+			{
+				$current = grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='--'
+			{
+				$current = grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3());
+			}
+		)
+	)
+;
+
+// Rule PrimitiveInstanceKind
+rulePrimitiveInstanceKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='buffer'
+			{
+				$current = grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='message'
+			{
+				$current = grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='port'
+			{
+				$current = grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='signal'
+			{
+				$current = grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3());
+			}
+		)
+		    |
+		(
+			enumLiteral_4='machine'
+			{
+				$current = grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_4, grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4());
+			}
+		)
+		    |
+		(
+			enumLiteral_5='vertex'
+			{
+				$current = grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_5, grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5());
+			}
+		)
+	)
+;
+
+// Rule CollectionKind
+ruleCollectionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='vector'
+			{
+				$current = grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='rvector'
+			{
+				$current = grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='list'
+			{
+				$current = grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='set'
+			{
+				$current = grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3());
+			}
+		)
+		    |
+		(
+			enumLiteral_4='bag'
+			{
+				$current = grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_4, grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4());
+			}
+		)
+		    |
+		(
+			enumLiteral_5='fifo'
+			{
+				$current = grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_5, grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5());
+			}
+		)
+		    |
+		(
+			enumLiteral_6='lifo'
+			{
+				$current = grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_6, grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6());
+			}
+		)
+	)
+;
+
+// Rule PublicVariableVisibilityKind
+rulePublicVariableVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='var'
+		{
+			$current = grammarAccess.getPublicVariableVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPublicVariableVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ProtectedVariableVisibilityKind
+ruleProtectedVariableVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='var'
+		{
+			$current = grammarAccess.getProtectedVariableVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getProtectedVariableVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule PrivateVariableVisibilityKind
+rulePrivateVariableVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='var'
+		{
+			$current = grammarAccess.getPrivateVariableVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPrivateVariableVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ParameterDirectionKind
+ruleParameterDirectionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='in'
+			{
+				$current = grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='inout'
+			{
+				$current = grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='out'
+			{
+				$current = grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='return'
+			{
+				$current = grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3());
+			}
+		)
+	)
+;
+
+// Rule BlockParameterDirectionKind
+ruleBlockParameterDirectionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='input'
+			{
+				$current = grammarAccess.getBlockParameterDirectionKindAccess().getInEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getBlockParameterDirectionKindAccess().getInEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='inout'
+			{
+				$current = grammarAccess.getBlockParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getBlockParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='output'
+			{
+				$current = grammarAccess.getBlockParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getBlockParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='return'
+			{
+				$current = grammarAccess.getBlockParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getBlockParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3());
+			}
+		)
+	)
+;
+
+// Rule ParameterInputDirectionKind
+ruleParameterInputDirectionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='var'
+		{
+			$current = grammarAccess.getParameterInputDirectionKindAccess().getInEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getParameterInputDirectionKindAccess().getInEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ParameterInoutDirectionKind
+ruleParameterInoutDirectionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='var'
+		{
+			$current = grammarAccess.getParameterInoutDirectionKindAccess().getInoutEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getParameterInoutDirectionKindAccess().getInoutEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ParameterOutputDirectionKind
+ruleParameterOutputDirectionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='var'
+		{
+			$current = grammarAccess.getParameterOutputDirectionKindAccess().getOutEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getParameterOutputDirectionKindAccess().getOutEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ParameterReturnDirectionKind
+ruleParameterReturnDirectionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='var'
+		{
+			$current = grammarAccess.getParameterReturnDirectionKindAccess().getReturnEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getParameterReturnDirectionKindAccess().getReturnEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule BufferContainerKind
+ruleBufferContainerKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='set'
+			{
+				$current = grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='bag'
+			{
+				$current = grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='fifo'
+			{
+				$current = grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='lifo'
+			{
+				$current = grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3());
+			}
+		)
+	)
+;
+
+// Rule PublicBufferVisibilityKind
+rulePublicBufferVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='buffer'
+		{
+			$current = grammarAccess.getPublicBufferVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPublicBufferVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ProtectedBufferVisibilityKind
+ruleProtectedBufferVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='buffer'
+		{
+			$current = grammarAccess.getProtectedBufferVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getProtectedBufferVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule PrivateBufferVisibilityKind
+rulePrivateBufferVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='buffer'
+		{
+			$current = grammarAccess.getPrivateBufferVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPrivateBufferVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule PublicPortVisibilityKind
+rulePublicPortVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='port'
+		{
+			$current = grammarAccess.getPublicPortVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPublicPortVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ProtectedPortVisibilityKind
+ruleProtectedPortVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='port'
+		{
+			$current = grammarAccess.getProtectedPortVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getProtectedPortVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule PrivatePortVisibilityKind
+rulePrivatePortVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='port'
+		{
+			$current = grammarAccess.getPrivatePortVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPrivatePortVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule PublicSignalVisibilityKind
+rulePublicSignalVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='signal'
+		{
+			$current = grammarAccess.getPublicSignalVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPublicSignalVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ProtectedSignalVisibilityKind
+ruleProtectedSignalVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='signal'
+		{
+			$current = grammarAccess.getProtectedSignalVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getProtectedSignalVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule PrivateSignalVisibilityKind
+rulePrivateSignalVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='signal'
+		{
+			$current = grammarAccess.getPrivateSignalVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPrivateSignalVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ChannelDirection
+ruleChannelDirection returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='input'
+			{
+				$current = grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='inout'
+			{
+				$current = grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='output'
+			{
+				$current = grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2());
+			}
+		)
+	)
+;
+
+// Rule PublicChannelVisibilityKind
+rulePublicChannelVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='channel'
+		{
+			$current = grammarAccess.getPublicChannelVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPublicChannelVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ProtectedChannelVisibilityKind
+ruleProtectedChannelVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='channel'
+		{
+			$current = grammarAccess.getProtectedChannelVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getProtectedChannelVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule PrivateChannelVisibilityKind
+rulePrivateChannelVisibilityKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='channel'
+		{
+			$current = grammarAccess.getPrivateChannelVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getPrivateChannelVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule TransitionMoc
+ruleTransitionMoc returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='simple'
+			{
+				$current = grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='abort'
+			{
+				$current = grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='final'
+			{
+				$current = grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2());
+			}
+		)
+	)
+;
+
+// Rule InterruptStatementKind
+ruleInterruptStatementKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='break'
+			{
+				$current = grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='continue'
+			{
+				$current = grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='return'
+			{
+				$current = grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='exit'
+			{
+				$current = grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3());
+			}
+		)
+	)
+;
+
+// Rule OPERATOR_ACTIVITY
+ruleOPERATOR_ACTIVITY returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='init'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='final'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='destroy'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='start'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_3());
+			}
+		)
+		    |
+		(
+			enumLiteral_4='stop'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_4, grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_4());
+			}
+		)
+		    |
+		(
+			enumLiteral_5='restart'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_5, grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_5());
+			}
+		)
+		    |
+		(
+			enumLiteral_6='suspend'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_6, grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_6());
+			}
+		)
+		    |
+		(
+			enumLiteral_7='resume'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_7, grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_7());
+			}
+		)
+		    |
+		(
+			enumLiteral_8='wait'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_8, grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_8());
+			}
+		)
+		    |
+		(
+			enumLiteral_9='disable'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_9().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_9, grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_9());
+			}
+		)
+		    |
+		(
+			enumLiteral_10='enable'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_10().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_10, grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_10());
+			}
+		)
+		    |
+		(
+			enumLiteral_11='abort'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_11().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_11, grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_11());
+			}
+		)
+		    |
+		(
+			enumLiteral_12='schedule'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_12().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_12, grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_12());
+			}
+		)
+		    |
+		(
+			enumLiteral_13='irun'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_13().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_13, grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_13());
+			}
+		)
+		    |
+		(
+			enumLiteral_14='run'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_14().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_14, grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_14());
+			}
+		)
+		    |
+		(
+			enumLiteral_15='rtc'
+			{
+				$current = grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_15().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_15, grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_15());
+			}
+		)
+	)
+;
+
+// Rule ValueDotFieldExpressionKind
+ruleValueDotFieldExpressionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='.'
+		{
+			$current = grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ValueArrowFieldExpressionKind
+ruleValueArrowFieldExpressionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='->'
+		{
+			$current = grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ValueIndexExpressionKind
+ruleValueIndexExpressionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='['
+		{
+			$current = grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration());
+		}
+	)
+;
+
+// Rule ValueParameterExpressionKind
+ruleValueParameterExpressionKind returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		enumLiteral_0='('
+		{
+			$current = grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration().getEnumLiteral().getInstance();
+			newLeafNode(enumLiteral_0, grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration());
+		}
+	)
+;
+
+RULE_INT : ('0'..'9')+;
+
+RULE_CHARACTER : '\'' . '\'';
+
+RULE_XLIA_ID : ('a'..'z'|'A'..'Z'|'_'|'#') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'#')*;
+
+RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalML.tokens b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalML.tokens
new file mode 100644
index 0000000..93c8bb7
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalML.tokens
@@ -0,0 +1,559 @@
+'!'=221
+'!='=206
+'#final'=88
+'#init'=91
+'#initial'=90
+'#start'=86
+'$delta'=232
+'$env'=238
+'$null'=228
+'$null<'=230
+'$parent'=235
+'$self'=234
+'$super'=236
+'$system'=237
+'$this'=233
+'$time'=231
+'%'=215
+'%='=189
+'&&'=149
+'&&='=190
+'&'=145
+'&='=192
+'('=56
+'(:'=219
+')'=57
+'*'=98
+'**'=213
+'*='=187
+'+'=212
+'++'=216
+'+='=185
+','=20
+'-'=28
+'--'=217
+'-->'=59
+'-='=186
+'->'=92
+'.'=29
+'/'=214
+'/='=188
+':'=30
+'::'=31
+'::='=184
+':='=183
+';'=25
+'<'=16
+'<-'=226
+'<--'=172
+'<<='=195
+'<='=210
+'<=<'=198
+'<=='=173
+'=!='=208
+'='=24
+'=/='=209
+'=='=205
+'==='=207
+'==>'=175
+'=>'=225
+'>'=37
+'>:'=17
+'>='=211
+'>=>'=201
+'>>='=196
+'>>>='=197
+'?'=202
+'@FormalML'=13
+'@behavior:'=50
+'@com:'=95
+'@composite:'=45
+'@concurrency'=82
+'@disable'=81
+'@effect:'=144
+'@enable'=80
+'@final'=79
+'@guard:'=142
+'@guard<'=148
+'@init'=78
+'@inout:'=66
+'@input:'=65
+'@instance:'=49
+'@irun'=83
+'@local:'=72
+'@machine:'=46
+'@macro:'=43
+'@model:'=47
+'@moe:'=69
+'@on_write'=135
+'@option'=21
+'@output:'=67
+'@parameter:'=60
+'@private:'=41
+'@procedure:'=44
+'@property:'=38
+'@protected:'=40
+'@prototype:'=48
+'@public:'=39
+'@region:'=73
+'@region<'=74
+'@return:'=68
+'@routine:'=42
+'@run'=71
+'@schedule'=70
+'@statemachine:'=51
+'@statemachine<'=75
+'@tguard:'=143
+'@tguard<'=151
+'@transition:'=77
+'@trigger:'=141
+'@xfsp'=15
+'@xlia'=14
+'['=97
+']'=99
+'^'=204
+'^='=194
+'^=<'=199
+'^=>'=200
+'abort'=271
+'and'=35
+'anycast'=257
+'bag'=266
+'bool'=120
+'boolean'=119
+'break'=272
+'broadcast'=259
+'buffer'=136
+'call'=182
+'channel'=139
+'char'=121
+'checksat'=171
+'choice'=127
+'clock'=118
+'connect'=100
+'const'=134
+'continue'=273
+'ctor'=220
+'destroy'=276
+'dhistory'=250
+'disable'=282
+'do'=179
+'double'=113
+'else'=146
+'elseif'=177
+'enable'=283
+'entryPoint'=246
+'enum'=124
+'env'=239
+'event'=170
+'exec'=181
+'exit'=274
+'exitPoint'=247
+'false'=27
+'fifo'=267
+'final'=87
+'float'=111
+'for'=180
+'fork'=248
+'guard'=168
+'if'=176
+'in'=269
+'init'=275
+'initial'=252
+'inout'=62
+'input'=61
+'input_enabled'=33
+'instance'=52
+'int'=104
+'integer'=102
+'interval'=123
+'irun'=285
+'join'=249
+'junction'=245
+'lifo'=268
+'list'=264
+'machine'=53
+'macro'=93
+'message'=260
+'moc:'=34
+'model'=243
+'model:'=55
+'multi_rdv'=255
+'multicast'=258
+'new'=224
+'newfresh'=218
+'not'=222
+'null'=227
+'null<'=229
+'or'=36
+'out'=270
+'output'=63
+'package'=19
+'port'=137
+'prior:'=147
+'private'=241
+'procedure'=58
+'protected'=242
+'prototype'=244
+'pseudostate'=89
+'public'=240
+'rat'=109
+'rational'=107
+'rdv'=254
+'real'=115
+'reference'=129
+'restart'=278
+'resume'=280
+'return'=64
+'route'=96
+'routine'=94
+'rtc'=287
+'run'=286
+'rvector'=263
+'schedule'=284
+'set'=265
+'shistory'=251
+'signal'=138
+'simple'=84
+'size:'=106
+'start'=85
+'state'=76
+'statemachine'=54
+'static'=128
+'stop'=277
+'string'=122
+'struct'=125
+'suspend'=279
+'system'=18
+'terminal'=253
+'tguard'=169
+'time'=117
+'timed'=32
+'transient'=131
+'transition'=140
+'true'=26
+'type'=101
+'udouble'=114
+'ufloat'=112
+'uint'=105
+'uinteger'=103
+'unicast'=256
+'union'=126
+'urat'=110
+'urational'=108
+'ureal'=116
+'val'=133
+'var'=132
+'vector'=262
+'vertex'=261
+'via'=174
+'volatile'=130
+'wait'=281
+'while'=178
+'{'=22
+'|'=203
+'|,|'=158
+'|.|'=155
+'|/;|'=156
+'|/\\|'=165
+'|;;|'=154
+'|;|'=152
+'|='=193
+'|\u00A7|'=153
+'|and#then|'=162
+'|and|'=160
+'|a|'=159
+'|fork|'=166
+'|indet|'=164
+'|i|'=157
+'|join|'=167
+'|or#else|'=163
+'|or|'=161
+'||'=150
+'||='=191
+'}'=23
+'~'=223
+RULE_ANY_OTHER=12
+RULE_CHARACTER=6
+RULE_ID=8
+RULE_INT=5
+RULE_ML_COMMENT=9
+RULE_SL_COMMENT=10
+RULE_STRING=7
+RULE_WS=11
+RULE_XLIA_ID=4
+T__100=100
+T__101=101
+T__102=102
+T__103=103
+T__104=104
+T__105=105
+T__106=106
+T__107=107
+T__108=108
+T__109=109
+T__110=110
+T__111=111
+T__112=112
+T__113=113
+T__114=114
+T__115=115
+T__116=116
+T__117=117
+T__118=118
+T__119=119
+T__120=120
+T__121=121
+T__122=122
+T__123=123
+T__124=124
+T__125=125
+T__126=126
+T__127=127
+T__128=128
+T__129=129
+T__130=130
+T__131=131
+T__132=132
+T__133=133
+T__134=134
+T__135=135
+T__136=136
+T__137=137
+T__138=138
+T__139=139
+T__13=13
+T__140=140
+T__141=141
+T__142=142
+T__143=143
+T__144=144
+T__145=145
+T__146=146
+T__147=147
+T__148=148
+T__149=149
+T__14=14
+T__150=150
+T__151=151
+T__152=152
+T__153=153
+T__154=154
+T__155=155
+T__156=156
+T__157=157
+T__158=158
+T__159=159
+T__15=15
+T__160=160
+T__161=161
+T__162=162
+T__163=163
+T__164=164
+T__165=165
+T__166=166
+T__167=167
+T__168=168
+T__169=169
+T__16=16
+T__170=170
+T__171=171
+T__172=172
+T__173=173
+T__174=174
+T__175=175
+T__176=176
+T__177=177
+T__178=178
+T__179=179
+T__17=17
+T__180=180
+T__181=181
+T__182=182
+T__183=183
+T__184=184
+T__185=185
+T__186=186
+T__187=187
+T__188=188
+T__189=189
+T__18=18
+T__190=190
+T__191=191
+T__192=192
+T__193=193
+T__194=194
+T__195=195
+T__196=196
+T__197=197
+T__198=198
+T__199=199
+T__19=19
+T__200=200
+T__201=201
+T__202=202
+T__203=203
+T__204=204
+T__205=205
+T__206=206
+T__207=207
+T__208=208
+T__209=209
+T__20=20
+T__210=210
+T__211=211
+T__212=212
+T__213=213
+T__214=214
+T__215=215
+T__216=216
+T__217=217
+T__218=218
+T__219=219
+T__21=21
+T__220=220
+T__221=221
+T__222=222
+T__223=223
+T__224=224
+T__225=225
+T__226=226
+T__227=227
+T__228=228
+T__229=229
+T__22=22
+T__230=230
+T__231=231
+T__232=232
+T__233=233
+T__234=234
+T__235=235
+T__236=236
+T__237=237
+T__238=238
+T__239=239
+T__23=23
+T__240=240
+T__241=241
+T__242=242
+T__243=243
+T__244=244
+T__245=245
+T__246=246
+T__247=247
+T__248=248
+T__249=249
+T__24=24
+T__250=250
+T__251=251
+T__252=252
+T__253=253
+T__254=254
+T__255=255
+T__256=256
+T__257=257
+T__258=258
+T__259=259
+T__25=25
+T__260=260
+T__261=261
+T__262=262
+T__263=263
+T__264=264
+T__265=265
+T__266=266
+T__267=267
+T__268=268
+T__269=269
+T__26=26
+T__270=270
+T__271=271
+T__272=272
+T__273=273
+T__274=274
+T__275=275
+T__276=276
+T__277=277
+T__278=278
+T__279=279
+T__27=27
+T__280=280
+T__281=281
+T__282=282
+T__283=283
+T__284=284
+T__285=285
+T__286=286
+T__287=287
+T__28=28
+T__29=29
+T__30=30
+T__31=31
+T__32=32
+T__33=33
+T__34=34
+T__35=35
+T__36=36
+T__37=37
+T__38=38
+T__39=39
+T__40=40
+T__41=41
+T__42=42
+T__43=43
+T__44=44
+T__45=45
+T__46=46
+T__47=47
+T__48=48
+T__49=49
+T__50=50
+T__51=51
+T__52=52
+T__53=53
+T__54=54
+T__55=55
+T__56=56
+T__57=57
+T__58=58
+T__59=59
+T__60=60
+T__61=61
+T__62=62
+T__63=63
+T__64=64
+T__65=65
+T__66=66
+T__67=67
+T__68=68
+T__69=69
+T__70=70
+T__71=71
+T__72=72
+T__73=73
+T__74=74
+T__75=75
+T__76=76
+T__77=77
+T__78=78
+T__79=79
+T__80=80
+T__81=81
+T__82=82
+T__83=83
+T__84=84
+T__85=85
+T__86=86
+T__87=87
+T__88=88
+T__89=89
+T__90=90
+T__91=91
+T__92=92
+T__93=93
+T__94=94
+T__95=95
+T__96=96
+T__97=97
+T__98=98
+T__99=99
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalMLLexer.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalMLLexer.java
new file mode 100644
index 0000000..77d330c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalMLLexer.java
@@ -0,0 +1,9830 @@
+/*******************************************************************************
+ * Copyright (c) 2016 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+ *   - Initial API and Implementation
+ *******************************************************************************/
+package org.eclipse.efm.formalml.xtext.parser.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.parser.antlr.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalFormalMLLexer extends Lexer {
+    public static final int T__144=144;
+    public static final int T__265=265;
+    public static final int T__143=143;
+    public static final int T__264=264;
+    public static final int T__146=146;
+    public static final int T__267=267;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__266=266;
+    public static final int T__140=140;
+    public static final int T__261=261;
+    public static final int T__260=260;
+    public static final int T__142=142;
+    public static final int T__263=263;
+    public static final int T__141=141;
+    public static final int T__262=262;
+    public static final int RULE_CHARACTER=6;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__258=258;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__257=257;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__259=259;
+    public static final int T__133=133;
+    public static final int T__254=254;
+    public static final int T__132=132;
+    public static final int T__253=253;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__256=256;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int T__255=255;
+    public static final int T__250=250;
+    public static final int RULE_ID=8;
+    public static final int T__131=131;
+    public static final int T__252=252;
+    public static final int T__130=130;
+    public static final int T__251=251;
+    public static final int RULE_INT=5;
+    public static final int T__66=66;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__247=247;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__246=246;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__249=249;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__248=248;
+    public static final int T__166=166;
+    public static final int T__287=287;
+    public static final int T__165=165;
+    public static final int T__286=286;
+    public static final int T__168=168;
+    public static final int T__167=167;
+    public static final int T__162=162;
+    public static final int T__283=283;
+    public static final int T__161=161;
+    public static final int T__282=282;
+    public static final int T__164=164;
+    public static final int T__285=285;
+    public static final int T__163=163;
+    public static final int T__284=284;
+    public static final int T__160=160;
+    public static final int T__281=281;
+    public static final int T__280=280;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__159=159;
+    public static final int T__30=30;
+    public static final int T__158=158;
+    public static final int T__279=279;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__276=276;
+    public static final int T__154=154;
+    public static final int T__275=275;
+    public static final int T__157=157;
+    public static final int T__278=278;
+    public static final int T__156=156;
+    public static final int T__277=277;
+    public static final int T__151=151;
+    public static final int T__272=272;
+    public static final int T__150=150;
+    public static final int T__271=271;
+    public static final int T__153=153;
+    public static final int T__274=274;
+    public static final int T__152=152;
+    public static final int T__273=273;
+    public static final int T__270=270;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int RULE_XLIA_ID=4;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__269=269;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__268=268;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__100=100;
+    public static final int T__221=221;
+    public static final int T__220=220;
+    public static final int T__102=102;
+    public static final int T__223=223;
+    public static final int T__101=101;
+    public static final int T__222=222;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__218=218;
+    public static final int T__217=217;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__219=219;
+    public static final int T__214=214;
+    public static final int T__213=213;
+    public static final int T__216=216;
+    public static final int T__215=215;
+    public static final int T__210=210;
+    public static final int T__212=212;
+    public static final int T__211=211;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__207=207;
+    public static final int T__23=23;
+    public static final int T__206=206;
+    public static final int T__24=24;
+    public static final int T__209=209;
+    public static final int T__25=25;
+    public static final int T__208=208;
+    public static final int T__203=203;
+    public static final int T__202=202;
+    public static final int T__20=20;
+    public static final int T__205=205;
+    public static final int T__21=21;
+    public static final int T__204=204;
+    public static final int T__122=122;
+    public static final int T__243=243;
+    public static final int T__121=121;
+    public static final int T__242=242;
+    public static final int T__124=124;
+    public static final int T__245=245;
+    public static final int T__123=123;
+    public static final int T__244=244;
+    public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__119=119;
+    public static final int T__118=118;
+    public static final int T__239=239;
+    public static final int T__115=115;
+    public static final int T__236=236;
+    public static final int EOF=-1;
+    public static final int T__114=114;
+    public static final int T__235=235;
+    public static final int T__117=117;
+    public static final int T__238=238;
+    public static final int T__116=116;
+    public static final int T__237=237;
+    public static final int T__111=111;
+    public static final int T__232=232;
+    public static final int T__110=110;
+    public static final int T__231=231;
+    public static final int T__113=113;
+    public static final int T__234=234;
+    public static final int T__112=112;
+    public static final int T__233=233;
+    public static final int T__230=230;
+    public static final int T__108=108;
+    public static final int T__229=229;
+    public static final int T__107=107;
+    public static final int T__228=228;
+    public static final int T__109=109;
+    public static final int T__104=104;
+    public static final int T__225=225;
+    public static final int T__103=103;
+    public static final int T__224=224;
+    public static final int T__106=106;
+    public static final int T__227=227;
+    public static final int T__105=105;
+    public static final int T__226=226;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__201=201;
+    public static final int T__200=200;
+    public static final int T__91=91;
+    public static final int T__188=188;
+    public static final int T__92=92;
+    public static final int T__187=187;
+    public static final int T__93=93;
+    public static final int T__94=94;
+    public static final int T__189=189;
+    public static final int T__184=184;
+    public static final int T__183=183;
+    public static final int T__186=186;
+    public static final int T__90=90;
+    public static final int T__185=185;
+    public static final int T__180=180;
+    public static final int T__182=182;
+    public static final int T__181=181;
+    public static final int T__99=99;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
+    public static final int T__169=169;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=7;
+    public static final int T__77=77;
+    public static final int T__78=78;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__74=74;
+    public static final int T__75=75;
+    public static final int T__76=76;
+    public static final int T__80=80;
+    public static final int T__199=199;
+    public static final int T__81=81;
+    public static final int T__198=198;
+    public static final int T__82=82;
+    public static final int T__83=83;
+    public static final int T__195=195;
+    public static final int T__194=194;
+    public static final int RULE_WS=11;
+    public static final int T__197=197;
+    public static final int T__196=196;
+    public static final int T__191=191;
+    public static final int T__190=190;
+    public static final int T__193=193;
+    public static final int T__192=192;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__89=89;
+    public static final int T__84=84;
+    public static final int T__85=85;
+    public static final int T__86=86;
+    public static final int T__87=87;
+
+    // delegates
+    // delegators
+
+    public InternalFormalMLLexer() {;} 
+    public InternalFormalMLLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalFormalMLLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "InternalFormalML.g"; }
+
+    // $ANTLR start "T__13"
+    public final void mT__13() throws RecognitionException {
+        try {
+            int _type = T__13;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:11:7: ( '@FormalML' )
+            // InternalFormalML.g:11:9: '@FormalML'
+            {
+            match("@FormalML"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__13"
+
+    // $ANTLR start "T__14"
+    public final void mT__14() throws RecognitionException {
+        try {
+            int _type = T__14;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:12:7: ( '@xlia' )
+            // InternalFormalML.g:12:9: '@xlia'
+            {
+            match("@xlia"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__14"
+
+    // $ANTLR start "T__15"
+    public final void mT__15() throws RecognitionException {
+        try {
+            int _type = T__15;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:13:7: ( '@xfsp' )
+            // InternalFormalML.g:13:9: '@xfsp'
+            {
+            match("@xfsp"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__15"
+
+    // $ANTLR start "T__16"
+    public final void mT__16() throws RecognitionException {
+        try {
+            int _type = T__16;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:14:7: ( '<' )
+            // InternalFormalML.g:14:9: '<'
+            {
+            match('<'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__16"
+
+    // $ANTLR start "T__17"
+    public final void mT__17() throws RecognitionException {
+        try {
+            int _type = T__17;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:15:7: ( '>:' )
+            // InternalFormalML.g:15:9: '>:'
+            {
+            match(">:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__17"
+
+    // $ANTLR start "T__18"
+    public final void mT__18() throws RecognitionException {
+        try {
+            int _type = T__18;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:16:7: ( 'system' )
+            // InternalFormalML.g:16:9: 'system'
+            {
+            match("system"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__18"
+
+    // $ANTLR start "T__19"
+    public final void mT__19() throws RecognitionException {
+        try {
+            int _type = T__19;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:17:7: ( 'package' )
+            // InternalFormalML.g:17:9: 'package'
+            {
+            match("package"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__19"
+
+    // $ANTLR start "T__20"
+    public final void mT__20() throws RecognitionException {
+        try {
+            int _type = T__20;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:18:7: ( ',' )
+            // InternalFormalML.g:18:9: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__20"
+
+    // $ANTLR start "T__21"
+    public final void mT__21() throws RecognitionException {
+        try {
+            int _type = T__21;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:19:7: ( '@option' )
+            // InternalFormalML.g:19:9: '@option'
+            {
+            match("@option"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__21"
+
+    // $ANTLR start "T__22"
+    public final void mT__22() throws RecognitionException {
+        try {
+            int _type = T__22;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:20:7: ( '{' )
+            // InternalFormalML.g:20:9: '{'
+            {
+            match('{'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__22"
+
+    // $ANTLR start "T__23"
+    public final void mT__23() throws RecognitionException {
+        try {
+            int _type = T__23;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:21:7: ( '}' )
+            // InternalFormalML.g:21:9: '}'
+            {
+            match('}'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__23"
+
+    // $ANTLR start "T__24"
+    public final void mT__24() throws RecognitionException {
+        try {
+            int _type = T__24;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:22:7: ( '=' )
+            // InternalFormalML.g:22:9: '='
+            {
+            match('='); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__24"
+
+    // $ANTLR start "T__25"
+    public final void mT__25() throws RecognitionException {
+        try {
+            int _type = T__25;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:23:7: ( ';' )
+            // InternalFormalML.g:23:9: ';'
+            {
+            match(';'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__25"
+
+    // $ANTLR start "T__26"
+    public final void mT__26() throws RecognitionException {
+        try {
+            int _type = T__26;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:24:7: ( 'true' )
+            // InternalFormalML.g:24:9: 'true'
+            {
+            match("true"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__26"
+
+    // $ANTLR start "T__27"
+    public final void mT__27() throws RecognitionException {
+        try {
+            int _type = T__27;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:25:7: ( 'false' )
+            // InternalFormalML.g:25:9: 'false'
+            {
+            match("false"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__27"
+
+    // $ANTLR start "T__28"
+    public final void mT__28() throws RecognitionException {
+        try {
+            int _type = T__28;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:26:7: ( '-' )
+            // InternalFormalML.g:26:9: '-'
+            {
+            match('-'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__28"
+
+    // $ANTLR start "T__29"
+    public final void mT__29() throws RecognitionException {
+        try {
+            int _type = T__29;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:27:7: ( '.' )
+            // InternalFormalML.g:27:9: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__29"
+
+    // $ANTLR start "T__30"
+    public final void mT__30() throws RecognitionException {
+        try {
+            int _type = T__30;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:28:7: ( ':' )
+            // InternalFormalML.g:28:9: ':'
+            {
+            match(':'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__30"
+
+    // $ANTLR start "T__31"
+    public final void mT__31() throws RecognitionException {
+        try {
+            int _type = T__31;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:29:7: ( '::' )
+            // InternalFormalML.g:29:9: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__31"
+
+    // $ANTLR start "T__32"
+    public final void mT__32() throws RecognitionException {
+        try {
+            int _type = T__32;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30:7: ( 'timed' )
+            // InternalFormalML.g:30:9: 'timed'
+            {
+            match("timed"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__32"
+
+    // $ANTLR start "T__33"
+    public final void mT__33() throws RecognitionException {
+        try {
+            int _type = T__33;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:31:7: ( 'input_enabled' )
+            // InternalFormalML.g:31:9: 'input_enabled'
+            {
+            match("input_enabled"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__33"
+
+    // $ANTLR start "T__34"
+    public final void mT__34() throws RecognitionException {
+        try {
+            int _type = T__34;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:32:7: ( 'moc:' )
+            // InternalFormalML.g:32:9: 'moc:'
+            {
+            match("moc:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__34"
+
+    // $ANTLR start "T__35"
+    public final void mT__35() throws RecognitionException {
+        try {
+            int _type = T__35;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:33:7: ( 'and' )
+            // InternalFormalML.g:33:9: 'and'
+            {
+            match("and"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__35"
+
+    // $ANTLR start "T__36"
+    public final void mT__36() throws RecognitionException {
+        try {
+            int _type = T__36;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:34:7: ( 'or' )
+            // InternalFormalML.g:34:9: 'or'
+            {
+            match("or"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__36"
+
+    // $ANTLR start "T__37"
+    public final void mT__37() throws RecognitionException {
+        try {
+            int _type = T__37;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:35:7: ( '>' )
+            // InternalFormalML.g:35:9: '>'
+            {
+            match('>'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__37"
+
+    // $ANTLR start "T__38"
+    public final void mT__38() throws RecognitionException {
+        try {
+            int _type = T__38;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:36:7: ( '@property:' )
+            // InternalFormalML.g:36:9: '@property:'
+            {
+            match("@property:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__38"
+
+    // $ANTLR start "T__39"
+    public final void mT__39() throws RecognitionException {
+        try {
+            int _type = T__39;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:37:7: ( '@public:' )
+            // InternalFormalML.g:37:9: '@public:'
+            {
+            match("@public:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__39"
+
+    // $ANTLR start "T__40"
+    public final void mT__40() throws RecognitionException {
+        try {
+            int _type = T__40;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:38:7: ( '@protected:' )
+            // InternalFormalML.g:38:9: '@protected:'
+            {
+            match("@protected:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__40"
+
+    // $ANTLR start "T__41"
+    public final void mT__41() throws RecognitionException {
+        try {
+            int _type = T__41;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:39:7: ( '@private:' )
+            // InternalFormalML.g:39:9: '@private:'
+            {
+            match("@private:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__41"
+
+    // $ANTLR start "T__42"
+    public final void mT__42() throws RecognitionException {
+        try {
+            int _type = T__42;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:40:7: ( '@routine:' )
+            // InternalFormalML.g:40:9: '@routine:'
+            {
+            match("@routine:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__42"
+
+    // $ANTLR start "T__43"
+    public final void mT__43() throws RecognitionException {
+        try {
+            int _type = T__43;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:41:7: ( '@macro:' )
+            // InternalFormalML.g:41:9: '@macro:'
+            {
+            match("@macro:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__43"
+
+    // $ANTLR start "T__44"
+    public final void mT__44() throws RecognitionException {
+        try {
+            int _type = T__44;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:42:7: ( '@procedure:' )
+            // InternalFormalML.g:42:9: '@procedure:'
+            {
+            match("@procedure:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__44"
+
+    // $ANTLR start "T__45"
+    public final void mT__45() throws RecognitionException {
+        try {
+            int _type = T__45;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:43:7: ( '@composite:' )
+            // InternalFormalML.g:43:9: '@composite:'
+            {
+            match("@composite:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__45"
+
+    // $ANTLR start "T__46"
+    public final void mT__46() throws RecognitionException {
+        try {
+            int _type = T__46;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:44:7: ( '@machine:' )
+            // InternalFormalML.g:44:9: '@machine:'
+            {
+            match("@machine:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__46"
+
+    // $ANTLR start "T__47"
+    public final void mT__47() throws RecognitionException {
+        try {
+            int _type = T__47;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:45:7: ( '@model:' )
+            // InternalFormalML.g:45:9: '@model:'
+            {
+            match("@model:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__47"
+
+    // $ANTLR start "T__48"
+    public final void mT__48() throws RecognitionException {
+        try {
+            int _type = T__48;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:46:7: ( '@prototype:' )
+            // InternalFormalML.g:46:9: '@prototype:'
+            {
+            match("@prototype:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__48"
+
+    // $ANTLR start "T__49"
+    public final void mT__49() throws RecognitionException {
+        try {
+            int _type = T__49;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:47:7: ( '@instance:' )
+            // InternalFormalML.g:47:9: '@instance:'
+            {
+            match("@instance:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__49"
+
+    // $ANTLR start "T__50"
+    public final void mT__50() throws RecognitionException {
+        try {
+            int _type = T__50;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:48:7: ( '@behavior:' )
+            // InternalFormalML.g:48:9: '@behavior:'
+            {
+            match("@behavior:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__50"
+
+    // $ANTLR start "T__51"
+    public final void mT__51() throws RecognitionException {
+        try {
+            int _type = T__51;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:49:7: ( '@statemachine:' )
+            // InternalFormalML.g:49:9: '@statemachine:'
+            {
+            match("@statemachine:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__51"
+
+    // $ANTLR start "T__52"
+    public final void mT__52() throws RecognitionException {
+        try {
+            int _type = T__52;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:50:7: ( 'instance' )
+            // InternalFormalML.g:50:9: 'instance'
+            {
+            match("instance"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__52"
+
+    // $ANTLR start "T__53"
+    public final void mT__53() throws RecognitionException {
+        try {
+            int _type = T__53;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:51:7: ( 'machine' )
+            // InternalFormalML.g:51:9: 'machine'
+            {
+            match("machine"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__53"
+
+    // $ANTLR start "T__54"
+    public final void mT__54() throws RecognitionException {
+        try {
+            int _type = T__54;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:52:7: ( 'statemachine' )
+            // InternalFormalML.g:52:9: 'statemachine'
+            {
+            match("statemachine"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__54"
+
+    // $ANTLR start "T__55"
+    public final void mT__55() throws RecognitionException {
+        try {
+            int _type = T__55;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:53:7: ( 'model:' )
+            // InternalFormalML.g:53:9: 'model:'
+            {
+            match("model:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__55"
+
+    // $ANTLR start "T__56"
+    public final void mT__56() throws RecognitionException {
+        try {
+            int _type = T__56;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:54:7: ( '(' )
+            // InternalFormalML.g:54:9: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__56"
+
+    // $ANTLR start "T__57"
+    public final void mT__57() throws RecognitionException {
+        try {
+            int _type = T__57;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:55:7: ( ')' )
+            // InternalFormalML.g:55:9: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__57"
+
+    // $ANTLR start "T__58"
+    public final void mT__58() throws RecognitionException {
+        try {
+            int _type = T__58;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:56:7: ( 'procedure' )
+            // InternalFormalML.g:56:9: 'procedure'
+            {
+            match("procedure"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__58"
+
+    // $ANTLR start "T__59"
+    public final void mT__59() throws RecognitionException {
+        try {
+            int _type = T__59;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:57:7: ( '-->' )
+            // InternalFormalML.g:57:9: '-->'
+            {
+            match("-->"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__59"
+
+    // $ANTLR start "T__60"
+    public final void mT__60() throws RecognitionException {
+        try {
+            int _type = T__60;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:58:7: ( '@parameter:' )
+            // InternalFormalML.g:58:9: '@parameter:'
+            {
+            match("@parameter:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__60"
+
+    // $ANTLR start "T__61"
+    public final void mT__61() throws RecognitionException {
+        try {
+            int _type = T__61;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:59:7: ( 'input' )
+            // InternalFormalML.g:59:9: 'input'
+            {
+            match("input"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__61"
+
+    // $ANTLR start "T__62"
+    public final void mT__62() throws RecognitionException {
+        try {
+            int _type = T__62;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:60:7: ( 'inout' )
+            // InternalFormalML.g:60:9: 'inout'
+            {
+            match("inout"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__62"
+
+    // $ANTLR start "T__63"
+    public final void mT__63() throws RecognitionException {
+        try {
+            int _type = T__63;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:61:7: ( 'output' )
+            // InternalFormalML.g:61:9: 'output'
+            {
+            match("output"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__63"
+
+    // $ANTLR start "T__64"
+    public final void mT__64() throws RecognitionException {
+        try {
+            int _type = T__64;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:62:7: ( 'return' )
+            // InternalFormalML.g:62:9: 'return'
+            {
+            match("return"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__64"
+
+    // $ANTLR start "T__65"
+    public final void mT__65() throws RecognitionException {
+        try {
+            int _type = T__65;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:63:7: ( '@input:' )
+            // InternalFormalML.g:63:9: '@input:'
+            {
+            match("@input:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__65"
+
+    // $ANTLR start "T__66"
+    public final void mT__66() throws RecognitionException {
+        try {
+            int _type = T__66;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:64:7: ( '@inout:' )
+            // InternalFormalML.g:64:9: '@inout:'
+            {
+            match("@inout:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__66"
+
+    // $ANTLR start "T__67"
+    public final void mT__67() throws RecognitionException {
+        try {
+            int _type = T__67;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:65:7: ( '@output:' )
+            // InternalFormalML.g:65:9: '@output:'
+            {
+            match("@output:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__67"
+
+    // $ANTLR start "T__68"
+    public final void mT__68() throws RecognitionException {
+        try {
+            int _type = T__68;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:66:7: ( '@return:' )
+            // InternalFormalML.g:66:9: '@return:'
+            {
+            match("@return:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__68"
+
+    // $ANTLR start "T__69"
+    public final void mT__69() throws RecognitionException {
+        try {
+            int _type = T__69;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:67:7: ( '@moe:' )
+            // InternalFormalML.g:67:9: '@moe:'
+            {
+            match("@moe:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__69"
+
+    // $ANTLR start "T__70"
+    public final void mT__70() throws RecognitionException {
+        try {
+            int _type = T__70;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:68:7: ( '@schedule' )
+            // InternalFormalML.g:68:9: '@schedule'
+            {
+            match("@schedule"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__70"
+
+    // $ANTLR start "T__71"
+    public final void mT__71() throws RecognitionException {
+        try {
+            int _type = T__71;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:69:7: ( '@run' )
+            // InternalFormalML.g:69:9: '@run'
+            {
+            match("@run"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__71"
+
+    // $ANTLR start "T__72"
+    public final void mT__72() throws RecognitionException {
+        try {
+            int _type = T__72;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:70:7: ( '@local:' )
+            // InternalFormalML.g:70:9: '@local:'
+            {
+            match("@local:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__72"
+
+    // $ANTLR start "T__73"
+    public final void mT__73() throws RecognitionException {
+        try {
+            int _type = T__73;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:71:7: ( '@region:' )
+            // InternalFormalML.g:71:9: '@region:'
+            {
+            match("@region:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__73"
+
+    // $ANTLR start "T__74"
+    public final void mT__74() throws RecognitionException {
+        try {
+            int _type = T__74;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:72:7: ( '@region<' )
+            // InternalFormalML.g:72:9: '@region<'
+            {
+            match("@region<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__74"
+
+    // $ANTLR start "T__75"
+    public final void mT__75() throws RecognitionException {
+        try {
+            int _type = T__75;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:73:7: ( '@statemachine<' )
+            // InternalFormalML.g:73:9: '@statemachine<'
+            {
+            match("@statemachine<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__75"
+
+    // $ANTLR start "T__76"
+    public final void mT__76() throws RecognitionException {
+        try {
+            int _type = T__76;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:74:7: ( 'state' )
+            // InternalFormalML.g:74:9: 'state'
+            {
+            match("state"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__76"
+
+    // $ANTLR start "T__77"
+    public final void mT__77() throws RecognitionException {
+        try {
+            int _type = T__77;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:75:7: ( '@transition:' )
+            // InternalFormalML.g:75:9: '@transition:'
+            {
+            match("@transition:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__77"
+
+    // $ANTLR start "T__78"
+    public final void mT__78() throws RecognitionException {
+        try {
+            int _type = T__78;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:76:7: ( '@init' )
+            // InternalFormalML.g:76:9: '@init'
+            {
+            match("@init"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__78"
+
+    // $ANTLR start "T__79"
+    public final void mT__79() throws RecognitionException {
+        try {
+            int _type = T__79;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:77:7: ( '@final' )
+            // InternalFormalML.g:77:9: '@final'
+            {
+            match("@final"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__79"
+
+    // $ANTLR start "T__80"
+    public final void mT__80() throws RecognitionException {
+        try {
+            int _type = T__80;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:78:7: ( '@enable' )
+            // InternalFormalML.g:78:9: '@enable'
+            {
+            match("@enable"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__80"
+
+    // $ANTLR start "T__81"
+    public final void mT__81() throws RecognitionException {
+        try {
+            int _type = T__81;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:79:7: ( '@disable' )
+            // InternalFormalML.g:79:9: '@disable'
+            {
+            match("@disable"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__81"
+
+    // $ANTLR start "T__82"
+    public final void mT__82() throws RecognitionException {
+        try {
+            int _type = T__82;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:80:7: ( '@concurrency' )
+            // InternalFormalML.g:80:9: '@concurrency'
+            {
+            match("@concurrency"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__82"
+
+    // $ANTLR start "T__83"
+    public final void mT__83() throws RecognitionException {
+        try {
+            int _type = T__83;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:81:7: ( '@irun' )
+            // InternalFormalML.g:81:9: '@irun'
+            {
+            match("@irun"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__83"
+
+    // $ANTLR start "T__84"
+    public final void mT__84() throws RecognitionException {
+        try {
+            int _type = T__84;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:82:7: ( 'simple' )
+            // InternalFormalML.g:82:9: 'simple'
+            {
+            match("simple"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__84"
+
+    // $ANTLR start "T__85"
+    public final void mT__85() throws RecognitionException {
+        try {
+            int _type = T__85;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:83:7: ( 'start' )
+            // InternalFormalML.g:83:9: 'start'
+            {
+            match("start"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__85"
+
+    // $ANTLR start "T__86"
+    public final void mT__86() throws RecognitionException {
+        try {
+            int _type = T__86;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:84:7: ( '#start' )
+            // InternalFormalML.g:84:9: '#start'
+            {
+            match("#start"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__86"
+
+    // $ANTLR start "T__87"
+    public final void mT__87() throws RecognitionException {
+        try {
+            int _type = T__87;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:85:7: ( 'final' )
+            // InternalFormalML.g:85:9: 'final'
+            {
+            match("final"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__87"
+
+    // $ANTLR start "T__88"
+    public final void mT__88() throws RecognitionException {
+        try {
+            int _type = T__88;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:86:7: ( '#final' )
+            // InternalFormalML.g:86:9: '#final'
+            {
+            match("#final"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__88"
+
+    // $ANTLR start "T__89"
+    public final void mT__89() throws RecognitionException {
+        try {
+            int _type = T__89;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:87:7: ( 'pseudostate' )
+            // InternalFormalML.g:87:9: 'pseudostate'
+            {
+            match("pseudostate"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__89"
+
+    // $ANTLR start "T__90"
+    public final void mT__90() throws RecognitionException {
+        try {
+            int _type = T__90;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:88:7: ( '#initial' )
+            // InternalFormalML.g:88:9: '#initial'
+            {
+            match("#initial"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__90"
+
+    // $ANTLR start "T__91"
+    public final void mT__91() throws RecognitionException {
+        try {
+            int _type = T__91;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:89:7: ( '#init' )
+            // InternalFormalML.g:89:9: '#init'
+            {
+            match("#init"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__91"
+
+    // $ANTLR start "T__92"
+    public final void mT__92() throws RecognitionException {
+        try {
+            int _type = T__92;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:90:7: ( '->' )
+            // InternalFormalML.g:90:9: '->'
+            {
+            match("->"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__92"
+
+    // $ANTLR start "T__93"
+    public final void mT__93() throws RecognitionException {
+        try {
+            int _type = T__93;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:91:7: ( 'macro' )
+            // InternalFormalML.g:91:9: 'macro'
+            {
+            match("macro"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__93"
+
+    // $ANTLR start "T__94"
+    public final void mT__94() throws RecognitionException {
+        try {
+            int _type = T__94;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:92:7: ( 'routine' )
+            // InternalFormalML.g:92:9: 'routine'
+            {
+            match("routine"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__94"
+
+    // $ANTLR start "T__95"
+    public final void mT__95() throws RecognitionException {
+        try {
+            int _type = T__95;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:93:7: ( '@com:' )
+            // InternalFormalML.g:93:9: '@com:'
+            {
+            match("@com:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__95"
+
+    // $ANTLR start "T__96"
+    public final void mT__96() throws RecognitionException {
+        try {
+            int _type = T__96;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:94:7: ( 'route' )
+            // InternalFormalML.g:94:9: 'route'
+            {
+            match("route"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__96"
+
+    // $ANTLR start "T__97"
+    public final void mT__97() throws RecognitionException {
+        try {
+            int _type = T__97;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:95:7: ( '[' )
+            // InternalFormalML.g:95:9: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__97"
+
+    // $ANTLR start "T__98"
+    public final void mT__98() throws RecognitionException {
+        try {
+            int _type = T__98;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:96:7: ( '*' )
+            // InternalFormalML.g:96:9: '*'
+            {
+            match('*'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__98"
+
+    // $ANTLR start "T__99"
+    public final void mT__99() throws RecognitionException {
+        try {
+            int _type = T__99;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:97:7: ( ']' )
+            // InternalFormalML.g:97:9: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__99"
+
+    // $ANTLR start "T__100"
+    public final void mT__100() throws RecognitionException {
+        try {
+            int _type = T__100;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:98:8: ( 'connect' )
+            // InternalFormalML.g:98:10: 'connect'
+            {
+            match("connect"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__100"
+
+    // $ANTLR start "T__101"
+    public final void mT__101() throws RecognitionException {
+        try {
+            int _type = T__101;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:99:8: ( 'type' )
+            // InternalFormalML.g:99:10: 'type'
+            {
+            match("type"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__101"
+
+    // $ANTLR start "T__102"
+    public final void mT__102() throws RecognitionException {
+        try {
+            int _type = T__102;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:100:8: ( 'integer' )
+            // InternalFormalML.g:100:10: 'integer'
+            {
+            match("integer"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__102"
+
+    // $ANTLR start "T__103"
+    public final void mT__103() throws RecognitionException {
+        try {
+            int _type = T__103;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:101:8: ( 'uinteger' )
+            // InternalFormalML.g:101:10: 'uinteger'
+            {
+            match("uinteger"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__103"
+
+    // $ANTLR start "T__104"
+    public final void mT__104() throws RecognitionException {
+        try {
+            int _type = T__104;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:102:8: ( 'int' )
+            // InternalFormalML.g:102:10: 'int'
+            {
+            match("int"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__104"
+
+    // $ANTLR start "T__105"
+    public final void mT__105() throws RecognitionException {
+        try {
+            int _type = T__105;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:103:8: ( 'uint' )
+            // InternalFormalML.g:103:10: 'uint'
+            {
+            match("uint"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__105"
+
+    // $ANTLR start "T__106"
+    public final void mT__106() throws RecognitionException {
+        try {
+            int _type = T__106;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:104:8: ( 'size:' )
+            // InternalFormalML.g:104:10: 'size:'
+            {
+            match("size:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__106"
+
+    // $ANTLR start "T__107"
+    public final void mT__107() throws RecognitionException {
+        try {
+            int _type = T__107;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:105:8: ( 'rational' )
+            // InternalFormalML.g:105:10: 'rational'
+            {
+            match("rational"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__107"
+
+    // $ANTLR start "T__108"
+    public final void mT__108() throws RecognitionException {
+        try {
+            int _type = T__108;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:106:8: ( 'urational' )
+            // InternalFormalML.g:106:10: 'urational'
+            {
+            match("urational"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__108"
+
+    // $ANTLR start "T__109"
+    public final void mT__109() throws RecognitionException {
+        try {
+            int _type = T__109;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:107:8: ( 'rat' )
+            // InternalFormalML.g:107:10: 'rat'
+            {
+            match("rat"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__109"
+
+    // $ANTLR start "T__110"
+    public final void mT__110() throws RecognitionException {
+        try {
+            int _type = T__110;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:108:8: ( 'urat' )
+            // InternalFormalML.g:108:10: 'urat'
+            {
+            match("urat"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__110"
+
+    // $ANTLR start "T__111"
+    public final void mT__111() throws RecognitionException {
+        try {
+            int _type = T__111;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:109:8: ( 'float' )
+            // InternalFormalML.g:109:10: 'float'
+            {
+            match("float"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__111"
+
+    // $ANTLR start "T__112"
+    public final void mT__112() throws RecognitionException {
+        try {
+            int _type = T__112;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:110:8: ( 'ufloat' )
+            // InternalFormalML.g:110:10: 'ufloat'
+            {
+            match("ufloat"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__112"
+
+    // $ANTLR start "T__113"
+    public final void mT__113() throws RecognitionException {
+        try {
+            int _type = T__113;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:111:8: ( 'double' )
+            // InternalFormalML.g:111:10: 'double'
+            {
+            match("double"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__113"
+
+    // $ANTLR start "T__114"
+    public final void mT__114() throws RecognitionException {
+        try {
+            int _type = T__114;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:112:8: ( 'udouble' )
+            // InternalFormalML.g:112:10: 'udouble'
+            {
+            match("udouble"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__114"
+
+    // $ANTLR start "T__115"
+    public final void mT__115() throws RecognitionException {
+        try {
+            int _type = T__115;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:113:8: ( 'real' )
+            // InternalFormalML.g:113:10: 'real'
+            {
+            match("real"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__115"
+
+    // $ANTLR start "T__116"
+    public final void mT__116() throws RecognitionException {
+        try {
+            int _type = T__116;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:114:8: ( 'ureal' )
+            // InternalFormalML.g:114:10: 'ureal'
+            {
+            match("ureal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__116"
+
+    // $ANTLR start "T__117"
+    public final void mT__117() throws RecognitionException {
+        try {
+            int _type = T__117;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:115:8: ( 'time' )
+            // InternalFormalML.g:115:10: 'time'
+            {
+            match("time"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__117"
+
+    // $ANTLR start "T__118"
+    public final void mT__118() throws RecognitionException {
+        try {
+            int _type = T__118;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:116:8: ( 'clock' )
+            // InternalFormalML.g:116:10: 'clock'
+            {
+            match("clock"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__118"
+
+    // $ANTLR start "T__119"
+    public final void mT__119() throws RecognitionException {
+        try {
+            int _type = T__119;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:117:8: ( 'boolean' )
+            // InternalFormalML.g:117:10: 'boolean'
+            {
+            match("boolean"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__119"
+
+    // $ANTLR start "T__120"
+    public final void mT__120() throws RecognitionException {
+        try {
+            int _type = T__120;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:118:8: ( 'bool' )
+            // InternalFormalML.g:118:10: 'bool'
+            {
+            match("bool"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__120"
+
+    // $ANTLR start "T__121"
+    public final void mT__121() throws RecognitionException {
+        try {
+            int _type = T__121;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:119:8: ( 'char' )
+            // InternalFormalML.g:119:10: 'char'
+            {
+            match("char"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__121"
+
+    // $ANTLR start "T__122"
+    public final void mT__122() throws RecognitionException {
+        try {
+            int _type = T__122;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:120:8: ( 'string' )
+            // InternalFormalML.g:120:10: 'string'
+            {
+            match("string"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__122"
+
+    // $ANTLR start "T__123"
+    public final void mT__123() throws RecognitionException {
+        try {
+            int _type = T__123;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:121:8: ( 'interval' )
+            // InternalFormalML.g:121:10: 'interval'
+            {
+            match("interval"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__123"
+
+    // $ANTLR start "T__124"
+    public final void mT__124() throws RecognitionException {
+        try {
+            int _type = T__124;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:122:8: ( 'enum' )
+            // InternalFormalML.g:122:10: 'enum'
+            {
+            match("enum"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__124"
+
+    // $ANTLR start "T__125"
+    public final void mT__125() throws RecognitionException {
+        try {
+            int _type = T__125;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:123:8: ( 'struct' )
+            // InternalFormalML.g:123:10: 'struct'
+            {
+            match("struct"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__125"
+
+    // $ANTLR start "T__126"
+    public final void mT__126() throws RecognitionException {
+        try {
+            int _type = T__126;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:124:8: ( 'union' )
+            // InternalFormalML.g:124:10: 'union'
+            {
+            match("union"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__126"
+
+    // $ANTLR start "T__127"
+    public final void mT__127() throws RecognitionException {
+        try {
+            int _type = T__127;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:125:8: ( 'choice' )
+            // InternalFormalML.g:125:10: 'choice'
+            {
+            match("choice"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__127"
+
+    // $ANTLR start "T__128"
+    public final void mT__128() throws RecognitionException {
+        try {
+            int _type = T__128;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:126:8: ( 'static' )
+            // InternalFormalML.g:126:10: 'static'
+            {
+            match("static"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__128"
+
+    // $ANTLR start "T__129"
+    public final void mT__129() throws RecognitionException {
+        try {
+            int _type = T__129;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:127:8: ( 'reference' )
+            // InternalFormalML.g:127:10: 'reference'
+            {
+            match("reference"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__129"
+
+    // $ANTLR start "T__130"
+    public final void mT__130() throws RecognitionException {
+        try {
+            int _type = T__130;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:128:8: ( 'volatile' )
+            // InternalFormalML.g:128:10: 'volatile'
+            {
+            match("volatile"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__130"
+
+    // $ANTLR start "T__131"
+    public final void mT__131() throws RecognitionException {
+        try {
+            int _type = T__131;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:129:8: ( 'transient' )
+            // InternalFormalML.g:129:10: 'transient'
+            {
+            match("transient"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__131"
+
+    // $ANTLR start "T__132"
+    public final void mT__132() throws RecognitionException {
+        try {
+            int _type = T__132;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:130:8: ( 'var' )
+            // InternalFormalML.g:130:10: 'var'
+            {
+            match("var"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__132"
+
+    // $ANTLR start "T__133"
+    public final void mT__133() throws RecognitionException {
+        try {
+            int _type = T__133;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:131:8: ( 'val' )
+            // InternalFormalML.g:131:10: 'val'
+            {
+            match("val"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__133"
+
+    // $ANTLR start "T__134"
+    public final void mT__134() throws RecognitionException {
+        try {
+            int _type = T__134;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:132:8: ( 'const' )
+            // InternalFormalML.g:132:10: 'const'
+            {
+            match("const"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__134"
+
+    // $ANTLR start "T__135"
+    public final void mT__135() throws RecognitionException {
+        try {
+            int _type = T__135;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:133:8: ( '@on_write' )
+            // InternalFormalML.g:133:10: '@on_write'
+            {
+            match("@on_write"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__135"
+
+    // $ANTLR start "T__136"
+    public final void mT__136() throws RecognitionException {
+        try {
+            int _type = T__136;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:134:8: ( 'buffer' )
+            // InternalFormalML.g:134:10: 'buffer'
+            {
+            match("buffer"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__136"
+
+    // $ANTLR start "T__137"
+    public final void mT__137() throws RecognitionException {
+        try {
+            int _type = T__137;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:135:8: ( 'port' )
+            // InternalFormalML.g:135:10: 'port'
+            {
+            match("port"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__137"
+
+    // $ANTLR start "T__138"
+    public final void mT__138() throws RecognitionException {
+        try {
+            int _type = T__138;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:136:8: ( 'signal' )
+            // InternalFormalML.g:136:10: 'signal'
+            {
+            match("signal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__138"
+
+    // $ANTLR start "T__139"
+    public final void mT__139() throws RecognitionException {
+        try {
+            int _type = T__139;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:137:8: ( 'channel' )
+            // InternalFormalML.g:137:10: 'channel'
+            {
+            match("channel"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__139"
+
+    // $ANTLR start "T__140"
+    public final void mT__140() throws RecognitionException {
+        try {
+            int _type = T__140;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:138:8: ( 'transition' )
+            // InternalFormalML.g:138:10: 'transition'
+            {
+            match("transition"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__140"
+
+    // $ANTLR start "T__141"
+    public final void mT__141() throws RecognitionException {
+        try {
+            int _type = T__141;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:139:8: ( '@trigger:' )
+            // InternalFormalML.g:139:10: '@trigger:'
+            {
+            match("@trigger:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__141"
+
+    // $ANTLR start "T__142"
+    public final void mT__142() throws RecognitionException {
+        try {
+            int _type = T__142;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:140:8: ( '@guard:' )
+            // InternalFormalML.g:140:10: '@guard:'
+            {
+            match("@guard:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__142"
+
+    // $ANTLR start "T__143"
+    public final void mT__143() throws RecognitionException {
+        try {
+            int _type = T__143;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:141:8: ( '@tguard:' )
+            // InternalFormalML.g:141:10: '@tguard:'
+            {
+            match("@tguard:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__143"
+
+    // $ANTLR start "T__144"
+    public final void mT__144() throws RecognitionException {
+        try {
+            int _type = T__144;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:142:8: ( '@effect:' )
+            // InternalFormalML.g:142:10: '@effect:'
+            {
+            match("@effect:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__144"
+
+    // $ANTLR start "T__145"
+    public final void mT__145() throws RecognitionException {
+        try {
+            int _type = T__145;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:143:8: ( '&' )
+            // InternalFormalML.g:143:10: '&'
+            {
+            match('&'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__145"
+
+    // $ANTLR start "T__146"
+    public final void mT__146() throws RecognitionException {
+        try {
+            int _type = T__146;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:144:8: ( 'else' )
+            // InternalFormalML.g:144:10: 'else'
+            {
+            match("else"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__146"
+
+    // $ANTLR start "T__147"
+    public final void mT__147() throws RecognitionException {
+        try {
+            int _type = T__147;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:145:8: ( 'prior:' )
+            // InternalFormalML.g:145:10: 'prior:'
+            {
+            match("prior:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__147"
+
+    // $ANTLR start "T__148"
+    public final void mT__148() throws RecognitionException {
+        try {
+            int _type = T__148;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:146:8: ( '@guard<' )
+            // InternalFormalML.g:146:10: '@guard<'
+            {
+            match("@guard<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__148"
+
+    // $ANTLR start "T__149"
+    public final void mT__149() throws RecognitionException {
+        try {
+            int _type = T__149;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:147:8: ( '&&' )
+            // InternalFormalML.g:147:10: '&&'
+            {
+            match("&&"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__149"
+
+    // $ANTLR start "T__150"
+    public final void mT__150() throws RecognitionException {
+        try {
+            int _type = T__150;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:148:8: ( '||' )
+            // InternalFormalML.g:148:10: '||'
+            {
+            match("||"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__150"
+
+    // $ANTLR start "T__151"
+    public final void mT__151() throws RecognitionException {
+        try {
+            int _type = T__151;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:149:8: ( '@tguard<' )
+            // InternalFormalML.g:149:10: '@tguard<'
+            {
+            match("@tguard<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__151"
+
+    // $ANTLR start "T__152"
+    public final void mT__152() throws RecognitionException {
+        try {
+            int _type = T__152;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:150:8: ( '|;|' )
+            // InternalFormalML.g:150:10: '|;|'
+            {
+            match("|;|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__152"
+
+    // $ANTLR start "T__153"
+    public final void mT__153() throws RecognitionException {
+        try {
+            int _type = T__153;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:151:8: ( '|\\u00A7|' )
+            // InternalFormalML.g:151:10: '|\\u00A7|'
+            {
+            match("|\u00A7|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__153"
+
+    // $ANTLR start "T__154"
+    public final void mT__154() throws RecognitionException {
+        try {
+            int _type = T__154;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:152:8: ( '|;;|' )
+            // InternalFormalML.g:152:10: '|;;|'
+            {
+            match("|;;|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__154"
+
+    // $ANTLR start "T__155"
+    public final void mT__155() throws RecognitionException {
+        try {
+            int _type = T__155;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:153:8: ( '|.|' )
+            // InternalFormalML.g:153:10: '|.|'
+            {
+            match("|.|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__155"
+
+    // $ANTLR start "T__156"
+    public final void mT__156() throws RecognitionException {
+        try {
+            int _type = T__156;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:154:8: ( '|/;|' )
+            // InternalFormalML.g:154:10: '|/;|'
+            {
+            match("|/;|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__156"
+
+    // $ANTLR start "T__157"
+    public final void mT__157() throws RecognitionException {
+        try {
+            int _type = T__157;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:155:8: ( '|i|' )
+            // InternalFormalML.g:155:10: '|i|'
+            {
+            match("|i|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__157"
+
+    // $ANTLR start "T__158"
+    public final void mT__158() throws RecognitionException {
+        try {
+            int _type = T__158;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:156:8: ( '|,|' )
+            // InternalFormalML.g:156:10: '|,|'
+            {
+            match("|,|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__158"
+
+    // $ANTLR start "T__159"
+    public final void mT__159() throws RecognitionException {
+        try {
+            int _type = T__159;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:157:8: ( '|a|' )
+            // InternalFormalML.g:157:10: '|a|'
+            {
+            match("|a|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__159"
+
+    // $ANTLR start "T__160"
+    public final void mT__160() throws RecognitionException {
+        try {
+            int _type = T__160;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:158:8: ( '|and|' )
+            // InternalFormalML.g:158:10: '|and|'
+            {
+            match("|and|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__160"
+
+    // $ANTLR start "T__161"
+    public final void mT__161() throws RecognitionException {
+        try {
+            int _type = T__161;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:159:8: ( '|or|' )
+            // InternalFormalML.g:159:10: '|or|'
+            {
+            match("|or|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__161"
+
+    // $ANTLR start "T__162"
+    public final void mT__162() throws RecognitionException {
+        try {
+            int _type = T__162;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:160:8: ( '|and#then|' )
+            // InternalFormalML.g:160:10: '|and#then|'
+            {
+            match("|and#then|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__162"
+
+    // $ANTLR start "T__163"
+    public final void mT__163() throws RecognitionException {
+        try {
+            int _type = T__163;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:161:8: ( '|or#else|' )
+            // InternalFormalML.g:161:10: '|or#else|'
+            {
+            match("|or#else|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__163"
+
+    // $ANTLR start "T__164"
+    public final void mT__164() throws RecognitionException {
+        try {
+            int _type = T__164;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:162:8: ( '|indet|' )
+            // InternalFormalML.g:162:10: '|indet|'
+            {
+            match("|indet|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__164"
+
+    // $ANTLR start "T__165"
+    public final void mT__165() throws RecognitionException {
+        try {
+            int _type = T__165;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:163:8: ( '|/\\\\|' )
+            // InternalFormalML.g:163:10: '|/\\\\|'
+            {
+            match("|/\\|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__165"
+
+    // $ANTLR start "T__166"
+    public final void mT__166() throws RecognitionException {
+        try {
+            int _type = T__166;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:164:8: ( '|fork|' )
+            // InternalFormalML.g:164:10: '|fork|'
+            {
+            match("|fork|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__166"
+
+    // $ANTLR start "T__167"
+    public final void mT__167() throws RecognitionException {
+        try {
+            int _type = T__167;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:165:8: ( '|join|' )
+            // InternalFormalML.g:165:10: '|join|'
+            {
+            match("|join|"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__167"
+
+    // $ANTLR start "T__168"
+    public final void mT__168() throws RecognitionException {
+        try {
+            int _type = T__168;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:166:8: ( 'guard' )
+            // InternalFormalML.g:166:10: 'guard'
+            {
+            match("guard"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__168"
+
+    // $ANTLR start "T__169"
+    public final void mT__169() throws RecognitionException {
+        try {
+            int _type = T__169;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:167:8: ( 'tguard' )
+            // InternalFormalML.g:167:10: 'tguard'
+            {
+            match("tguard"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__169"
+
+    // $ANTLR start "T__170"
+    public final void mT__170() throws RecognitionException {
+        try {
+            int _type = T__170;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:168:8: ( 'event' )
+            // InternalFormalML.g:168:10: 'event'
+            {
+            match("event"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__170"
+
+    // $ANTLR start "T__171"
+    public final void mT__171() throws RecognitionException {
+        try {
+            int _type = T__171;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:169:8: ( 'checksat' )
+            // InternalFormalML.g:169:10: 'checksat'
+            {
+            match("checksat"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__171"
+
+    // $ANTLR start "T__172"
+    public final void mT__172() throws RecognitionException {
+        try {
+            int _type = T__172;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:170:8: ( '<--' )
+            // InternalFormalML.g:170:10: '<--'
+            {
+            match("<--"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__172"
+
+    // $ANTLR start "T__173"
+    public final void mT__173() throws RecognitionException {
+        try {
+            int _type = T__173;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:171:8: ( '<==' )
+            // InternalFormalML.g:171:10: '<=='
+            {
+            match("<=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__173"
+
+    // $ANTLR start "T__174"
+    public final void mT__174() throws RecognitionException {
+        try {
+            int _type = T__174;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:172:8: ( 'via' )
+            // InternalFormalML.g:172:10: 'via'
+            {
+            match("via"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__174"
+
+    // $ANTLR start "T__175"
+    public final void mT__175() throws RecognitionException {
+        try {
+            int _type = T__175;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:173:8: ( '==>' )
+            // InternalFormalML.g:173:10: '==>'
+            {
+            match("==>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__175"
+
+    // $ANTLR start "T__176"
+    public final void mT__176() throws RecognitionException {
+        try {
+            int _type = T__176;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:174:8: ( 'if' )
+            // InternalFormalML.g:174:10: 'if'
+            {
+            match("if"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__176"
+
+    // $ANTLR start "T__177"
+    public final void mT__177() throws RecognitionException {
+        try {
+            int _type = T__177;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:175:8: ( 'elseif' )
+            // InternalFormalML.g:175:10: 'elseif'
+            {
+            match("elseif"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__177"
+
+    // $ANTLR start "T__178"
+    public final void mT__178() throws RecognitionException {
+        try {
+            int _type = T__178;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:176:8: ( 'while' )
+            // InternalFormalML.g:176:10: 'while'
+            {
+            match("while"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__178"
+
+    // $ANTLR start "T__179"
+    public final void mT__179() throws RecognitionException {
+        try {
+            int _type = T__179;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:177:8: ( 'do' )
+            // InternalFormalML.g:177:10: 'do'
+            {
+            match("do"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__179"
+
+    // $ANTLR start "T__180"
+    public final void mT__180() throws RecognitionException {
+        try {
+            int _type = T__180;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:178:8: ( 'for' )
+            // InternalFormalML.g:178:10: 'for'
+            {
+            match("for"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__180"
+
+    // $ANTLR start "T__181"
+    public final void mT__181() throws RecognitionException {
+        try {
+            int _type = T__181;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:179:8: ( 'exec' )
+            // InternalFormalML.g:179:10: 'exec'
+            {
+            match("exec"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__181"
+
+    // $ANTLR start "T__182"
+    public final void mT__182() throws RecognitionException {
+        try {
+            int _type = T__182;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:180:8: ( 'call' )
+            // InternalFormalML.g:180:10: 'call'
+            {
+            match("call"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__182"
+
+    // $ANTLR start "T__183"
+    public final void mT__183() throws RecognitionException {
+        try {
+            int _type = T__183;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:181:8: ( ':=' )
+            // InternalFormalML.g:181:10: ':='
+            {
+            match(":="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__183"
+
+    // $ANTLR start "T__184"
+    public final void mT__184() throws RecognitionException {
+        try {
+            int _type = T__184;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:182:8: ( '::=' )
+            // InternalFormalML.g:182:10: '::='
+            {
+            match("::="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__184"
+
+    // $ANTLR start "T__185"
+    public final void mT__185() throws RecognitionException {
+        try {
+            int _type = T__185;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:183:8: ( '+=' )
+            // InternalFormalML.g:183:10: '+='
+            {
+            match("+="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__185"
+
+    // $ANTLR start "T__186"
+    public final void mT__186() throws RecognitionException {
+        try {
+            int _type = T__186;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:184:8: ( '-=' )
+            // InternalFormalML.g:184:10: '-='
+            {
+            match("-="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__186"
+
+    // $ANTLR start "T__187"
+    public final void mT__187() throws RecognitionException {
+        try {
+            int _type = T__187;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:185:8: ( '*=' )
+            // InternalFormalML.g:185:10: '*='
+            {
+            match("*="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__187"
+
+    // $ANTLR start "T__188"
+    public final void mT__188() throws RecognitionException {
+        try {
+            int _type = T__188;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:186:8: ( '/=' )
+            // InternalFormalML.g:186:10: '/='
+            {
+            match("/="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__188"
+
+    // $ANTLR start "T__189"
+    public final void mT__189() throws RecognitionException {
+        try {
+            int _type = T__189;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:187:8: ( '%=' )
+            // InternalFormalML.g:187:10: '%='
+            {
+            match("%="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__189"
+
+    // $ANTLR start "T__190"
+    public final void mT__190() throws RecognitionException {
+        try {
+            int _type = T__190;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:188:8: ( '&&=' )
+            // InternalFormalML.g:188:10: '&&='
+            {
+            match("&&="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__190"
+
+    // $ANTLR start "T__191"
+    public final void mT__191() throws RecognitionException {
+        try {
+            int _type = T__191;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:189:8: ( '||=' )
+            // InternalFormalML.g:189:10: '||='
+            {
+            match("||="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__191"
+
+    // $ANTLR start "T__192"
+    public final void mT__192() throws RecognitionException {
+        try {
+            int _type = T__192;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:190:8: ( '&=' )
+            // InternalFormalML.g:190:10: '&='
+            {
+            match("&="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__192"
+
+    // $ANTLR start "T__193"
+    public final void mT__193() throws RecognitionException {
+        try {
+            int _type = T__193;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:191:8: ( '|=' )
+            // InternalFormalML.g:191:10: '|='
+            {
+            match("|="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__193"
+
+    // $ANTLR start "T__194"
+    public final void mT__194() throws RecognitionException {
+        try {
+            int _type = T__194;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:192:8: ( '^=' )
+            // InternalFormalML.g:192:10: '^='
+            {
+            match("^="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__194"
+
+    // $ANTLR start "T__195"
+    public final void mT__195() throws RecognitionException {
+        try {
+            int _type = T__195;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:193:8: ( '<<=' )
+            // InternalFormalML.g:193:10: '<<='
+            {
+            match("<<="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__195"
+
+    // $ANTLR start "T__196"
+    public final void mT__196() throws RecognitionException {
+        try {
+            int _type = T__196;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:194:8: ( '>>=' )
+            // InternalFormalML.g:194:10: '>>='
+            {
+            match(">>="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__196"
+
+    // $ANTLR start "T__197"
+    public final void mT__197() throws RecognitionException {
+        try {
+            int _type = T__197;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:195:8: ( '>>>=' )
+            // InternalFormalML.g:195:10: '>>>='
+            {
+            match(">>>="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__197"
+
+    // $ANTLR start "T__198"
+    public final void mT__198() throws RecognitionException {
+        try {
+            int _type = T__198;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:196:8: ( '<=<' )
+            // InternalFormalML.g:196:10: '<=<'
+            {
+            match("<=<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__198"
+
+    // $ANTLR start "T__199"
+    public final void mT__199() throws RecognitionException {
+        try {
+            int _type = T__199;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:197:8: ( '^=<' )
+            // InternalFormalML.g:197:10: '^=<'
+            {
+            match("^=<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__199"
+
+    // $ANTLR start "T__200"
+    public final void mT__200() throws RecognitionException {
+        try {
+            int _type = T__200;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:198:8: ( '^=>' )
+            // InternalFormalML.g:198:10: '^=>'
+            {
+            match("^=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__200"
+
+    // $ANTLR start "T__201"
+    public final void mT__201() throws RecognitionException {
+        try {
+            int _type = T__201;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:199:8: ( '>=>' )
+            // InternalFormalML.g:199:10: '>=>'
+            {
+            match(">=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__201"
+
+    // $ANTLR start "T__202"
+    public final void mT__202() throws RecognitionException {
+        try {
+            int _type = T__202;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:200:8: ( '?' )
+            // InternalFormalML.g:200:10: '?'
+            {
+            match('?'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__202"
+
+    // $ANTLR start "T__203"
+    public final void mT__203() throws RecognitionException {
+        try {
+            int _type = T__203;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:201:8: ( '|' )
+            // InternalFormalML.g:201:10: '|'
+            {
+            match('|'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__203"
+
+    // $ANTLR start "T__204"
+    public final void mT__204() throws RecognitionException {
+        try {
+            int _type = T__204;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:202:8: ( '^' )
+            // InternalFormalML.g:202:10: '^'
+            {
+            match('^'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__204"
+
+    // $ANTLR start "T__205"
+    public final void mT__205() throws RecognitionException {
+        try {
+            int _type = T__205;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:203:8: ( '==' )
+            // InternalFormalML.g:203:10: '=='
+            {
+            match("=="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__205"
+
+    // $ANTLR start "T__206"
+    public final void mT__206() throws RecognitionException {
+        try {
+            int _type = T__206;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:204:8: ( '!=' )
+            // InternalFormalML.g:204:10: '!='
+            {
+            match("!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__206"
+
+    // $ANTLR start "T__207"
+    public final void mT__207() throws RecognitionException {
+        try {
+            int _type = T__207;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:205:8: ( '===' )
+            // InternalFormalML.g:205:10: '==='
+            {
+            match("==="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__207"
+
+    // $ANTLR start "T__208"
+    public final void mT__208() throws RecognitionException {
+        try {
+            int _type = T__208;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:206:8: ( '=!=' )
+            // InternalFormalML.g:206:10: '=!='
+            {
+            match("=!="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__208"
+
+    // $ANTLR start "T__209"
+    public final void mT__209() throws RecognitionException {
+        try {
+            int _type = T__209;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:207:8: ( '=/=' )
+            // InternalFormalML.g:207:10: '=/='
+            {
+            match("=/="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__209"
+
+    // $ANTLR start "T__210"
+    public final void mT__210() throws RecognitionException {
+        try {
+            int _type = T__210;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:208:8: ( '<=' )
+            // InternalFormalML.g:208:10: '<='
+            {
+            match("<="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__210"
+
+    // $ANTLR start "T__211"
+    public final void mT__211() throws RecognitionException {
+        try {
+            int _type = T__211;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:209:8: ( '>=' )
+            // InternalFormalML.g:209:10: '>='
+            {
+            match(">="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__211"
+
+    // $ANTLR start "T__212"
+    public final void mT__212() throws RecognitionException {
+        try {
+            int _type = T__212;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:210:8: ( '+' )
+            // InternalFormalML.g:210:10: '+'
+            {
+            match('+'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__212"
+
+    // $ANTLR start "T__213"
+    public final void mT__213() throws RecognitionException {
+        try {
+            int _type = T__213;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:211:8: ( '**' )
+            // InternalFormalML.g:211:10: '**'
+            {
+            match("**"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__213"
+
+    // $ANTLR start "T__214"
+    public final void mT__214() throws RecognitionException {
+        try {
+            int _type = T__214;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:212:8: ( '/' )
+            // InternalFormalML.g:212:10: '/'
+            {
+            match('/'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__214"
+
+    // $ANTLR start "T__215"
+    public final void mT__215() throws RecognitionException {
+        try {
+            int _type = T__215;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:213:8: ( '%' )
+            // InternalFormalML.g:213:10: '%'
+            {
+            match('%'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__215"
+
+    // $ANTLR start "T__216"
+    public final void mT__216() throws RecognitionException {
+        try {
+            int _type = T__216;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:214:8: ( '++' )
+            // InternalFormalML.g:214:10: '++'
+            {
+            match("++"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__216"
+
+    // $ANTLR start "T__217"
+    public final void mT__217() throws RecognitionException {
+        try {
+            int _type = T__217;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:215:8: ( '--' )
+            // InternalFormalML.g:215:10: '--'
+            {
+            match("--"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__217"
+
+    // $ANTLR start "T__218"
+    public final void mT__218() throws RecognitionException {
+        try {
+            int _type = T__218;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:216:8: ( 'newfresh' )
+            // InternalFormalML.g:216:10: 'newfresh'
+            {
+            match("newfresh"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__218"
+
+    // $ANTLR start "T__219"
+    public final void mT__219() throws RecognitionException {
+        try {
+            int _type = T__219;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:217:8: ( '(:' )
+            // InternalFormalML.g:217:10: '(:'
+            {
+            match("(:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__219"
+
+    // $ANTLR start "T__220"
+    public final void mT__220() throws RecognitionException {
+        try {
+            int _type = T__220;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:218:8: ( 'ctor' )
+            // InternalFormalML.g:218:10: 'ctor'
+            {
+            match("ctor"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__220"
+
+    // $ANTLR start "T__221"
+    public final void mT__221() throws RecognitionException {
+        try {
+            int _type = T__221;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:219:8: ( '!' )
+            // InternalFormalML.g:219:10: '!'
+            {
+            match('!'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__221"
+
+    // $ANTLR start "T__222"
+    public final void mT__222() throws RecognitionException {
+        try {
+            int _type = T__222;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:220:8: ( 'not' )
+            // InternalFormalML.g:220:10: 'not'
+            {
+            match("not"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__222"
+
+    // $ANTLR start "T__223"
+    public final void mT__223() throws RecognitionException {
+        try {
+            int _type = T__223;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:221:8: ( '~' )
+            // InternalFormalML.g:221:10: '~'
+            {
+            match('~'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__223"
+
+    // $ANTLR start "T__224"
+    public final void mT__224() throws RecognitionException {
+        try {
+            int _type = T__224;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:222:8: ( 'new' )
+            // InternalFormalML.g:222:10: 'new'
+            {
+            match("new"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__224"
+
+    // $ANTLR start "T__225"
+    public final void mT__225() throws RecognitionException {
+        try {
+            int _type = T__225;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:223:8: ( '=>' )
+            // InternalFormalML.g:223:10: '=>'
+            {
+            match("=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__225"
+
+    // $ANTLR start "T__226"
+    public final void mT__226() throws RecognitionException {
+        try {
+            int _type = T__226;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:224:8: ( '<-' )
+            // InternalFormalML.g:224:10: '<-'
+            {
+            match("<-"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__226"
+
+    // $ANTLR start "T__227"
+    public final void mT__227() throws RecognitionException {
+        try {
+            int _type = T__227;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:225:8: ( 'null' )
+            // InternalFormalML.g:225:10: 'null'
+            {
+            match("null"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__227"
+
+    // $ANTLR start "T__228"
+    public final void mT__228() throws RecognitionException {
+        try {
+            int _type = T__228;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:226:8: ( '$null' )
+            // InternalFormalML.g:226:10: '$null'
+            {
+            match("$null"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__228"
+
+    // $ANTLR start "T__229"
+    public final void mT__229() throws RecognitionException {
+        try {
+            int _type = T__229;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:227:8: ( 'null<' )
+            // InternalFormalML.g:227:10: 'null<'
+            {
+            match("null<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__229"
+
+    // $ANTLR start "T__230"
+    public final void mT__230() throws RecognitionException {
+        try {
+            int _type = T__230;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:228:8: ( '$null<' )
+            // InternalFormalML.g:228:10: '$null<'
+            {
+            match("$null<"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__230"
+
+    // $ANTLR start "T__231"
+    public final void mT__231() throws RecognitionException {
+        try {
+            int _type = T__231;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:229:8: ( '$time' )
+            // InternalFormalML.g:229:10: '$time'
+            {
+            match("$time"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__231"
+
+    // $ANTLR start "T__232"
+    public final void mT__232() throws RecognitionException {
+        try {
+            int _type = T__232;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:230:8: ( '$delta' )
+            // InternalFormalML.g:230:10: '$delta'
+            {
+            match("$delta"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__232"
+
+    // $ANTLR start "T__233"
+    public final void mT__233() throws RecognitionException {
+        try {
+            int _type = T__233;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:231:8: ( '$this' )
+            // InternalFormalML.g:231:10: '$this'
+            {
+            match("$this"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__233"
+
+    // $ANTLR start "T__234"
+    public final void mT__234() throws RecognitionException {
+        try {
+            int _type = T__234;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:232:8: ( '$self' )
+            // InternalFormalML.g:232:10: '$self'
+            {
+            match("$self"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__234"
+
+    // $ANTLR start "T__235"
+    public final void mT__235() throws RecognitionException {
+        try {
+            int _type = T__235;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:233:8: ( '$parent' )
+            // InternalFormalML.g:233:10: '$parent'
+            {
+            match("$parent"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__235"
+
+    // $ANTLR start "T__236"
+    public final void mT__236() throws RecognitionException {
+        try {
+            int _type = T__236;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:234:8: ( '$super' )
+            // InternalFormalML.g:234:10: '$super'
+            {
+            match("$super"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__236"
+
+    // $ANTLR start "T__237"
+    public final void mT__237() throws RecognitionException {
+        try {
+            int _type = T__237;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:235:8: ( '$system' )
+            // InternalFormalML.g:235:10: '$system'
+            {
+            match("$system"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__237"
+
+    // $ANTLR start "T__238"
+    public final void mT__238() throws RecognitionException {
+        try {
+            int _type = T__238;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:236:8: ( '$env' )
+            // InternalFormalML.g:236:10: '$env'
+            {
+            match("$env"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__238"
+
+    // $ANTLR start "T__239"
+    public final void mT__239() throws RecognitionException {
+        try {
+            int _type = T__239;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:237:8: ( 'env' )
+            // InternalFormalML.g:237:10: 'env'
+            {
+            match("env"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__239"
+
+    // $ANTLR start "T__240"
+    public final void mT__240() throws RecognitionException {
+        try {
+            int _type = T__240;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:238:8: ( 'public' )
+            // InternalFormalML.g:238:10: 'public'
+            {
+            match("public"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__240"
+
+    // $ANTLR start "T__241"
+    public final void mT__241() throws RecognitionException {
+        try {
+            int _type = T__241;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:239:8: ( 'private' )
+            // InternalFormalML.g:239:10: 'private'
+            {
+            match("private"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__241"
+
+    // $ANTLR start "T__242"
+    public final void mT__242() throws RecognitionException {
+        try {
+            int _type = T__242;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:240:8: ( 'protected' )
+            // InternalFormalML.g:240:10: 'protected'
+            {
+            match("protected"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__242"
+
+    // $ANTLR start "T__243"
+    public final void mT__243() throws RecognitionException {
+        try {
+            int _type = T__243;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:241:8: ( 'model' )
+            // InternalFormalML.g:241:10: 'model'
+            {
+            match("model"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__243"
+
+    // $ANTLR start "T__244"
+    public final void mT__244() throws RecognitionException {
+        try {
+            int _type = T__244;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:242:8: ( 'prototype' )
+            // InternalFormalML.g:242:10: 'prototype'
+            {
+            match("prototype"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__244"
+
+    // $ANTLR start "T__245"
+    public final void mT__245() throws RecognitionException {
+        try {
+            int _type = T__245;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:243:8: ( 'junction' )
+            // InternalFormalML.g:243:10: 'junction'
+            {
+            match("junction"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__245"
+
+    // $ANTLR start "T__246"
+    public final void mT__246() throws RecognitionException {
+        try {
+            int _type = T__246;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:244:8: ( 'entryPoint' )
+            // InternalFormalML.g:244:10: 'entryPoint'
+            {
+            match("entryPoint"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__246"
+
+    // $ANTLR start "T__247"
+    public final void mT__247() throws RecognitionException {
+        try {
+            int _type = T__247;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:245:8: ( 'exitPoint' )
+            // InternalFormalML.g:245:10: 'exitPoint'
+            {
+            match("exitPoint"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__247"
+
+    // $ANTLR start "T__248"
+    public final void mT__248() throws RecognitionException {
+        try {
+            int _type = T__248;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:246:8: ( 'fork' )
+            // InternalFormalML.g:246:10: 'fork'
+            {
+            match("fork"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__248"
+
+    // $ANTLR start "T__249"
+    public final void mT__249() throws RecognitionException {
+        try {
+            int _type = T__249;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:247:8: ( 'join' )
+            // InternalFormalML.g:247:10: 'join'
+            {
+            match("join"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__249"
+
+    // $ANTLR start "T__250"
+    public final void mT__250() throws RecognitionException {
+        try {
+            int _type = T__250;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:248:8: ( 'dhistory' )
+            // InternalFormalML.g:248:10: 'dhistory'
+            {
+            match("dhistory"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__250"
+
+    // $ANTLR start "T__251"
+    public final void mT__251() throws RecognitionException {
+        try {
+            int _type = T__251;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:249:8: ( 'shistory' )
+            // InternalFormalML.g:249:10: 'shistory'
+            {
+            match("shistory"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__251"
+
+    // $ANTLR start "T__252"
+    public final void mT__252() throws RecognitionException {
+        try {
+            int _type = T__252;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:250:8: ( 'initial' )
+            // InternalFormalML.g:250:10: 'initial'
+            {
+            match("initial"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__252"
+
+    // $ANTLR start "T__253"
+    public final void mT__253() throws RecognitionException {
+        try {
+            int _type = T__253;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:251:8: ( 'terminal' )
+            // InternalFormalML.g:251:10: 'terminal'
+            {
+            match("terminal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__253"
+
+    // $ANTLR start "T__254"
+    public final void mT__254() throws RecognitionException {
+        try {
+            int _type = T__254;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:252:8: ( 'rdv' )
+            // InternalFormalML.g:252:10: 'rdv'
+            {
+            match("rdv"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__254"
+
+    // $ANTLR start "T__255"
+    public final void mT__255() throws RecognitionException {
+        try {
+            int _type = T__255;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:253:8: ( 'multi_rdv' )
+            // InternalFormalML.g:253:10: 'multi_rdv'
+            {
+            match("multi_rdv"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__255"
+
+    // $ANTLR start "T__256"
+    public final void mT__256() throws RecognitionException {
+        try {
+            int _type = T__256;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:254:8: ( 'unicast' )
+            // InternalFormalML.g:254:10: 'unicast'
+            {
+            match("unicast"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__256"
+
+    // $ANTLR start "T__257"
+    public final void mT__257() throws RecognitionException {
+        try {
+            int _type = T__257;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:255:8: ( 'anycast' )
+            // InternalFormalML.g:255:10: 'anycast'
+            {
+            match("anycast"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__257"
+
+    // $ANTLR start "T__258"
+    public final void mT__258() throws RecognitionException {
+        try {
+            int _type = T__258;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:256:8: ( 'multicast' )
+            // InternalFormalML.g:256:10: 'multicast'
+            {
+            match("multicast"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__258"
+
+    // $ANTLR start "T__259"
+    public final void mT__259() throws RecognitionException {
+        try {
+            int _type = T__259;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:257:8: ( 'broadcast' )
+            // InternalFormalML.g:257:10: 'broadcast'
+            {
+            match("broadcast"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__259"
+
+    // $ANTLR start "T__260"
+    public final void mT__260() throws RecognitionException {
+        try {
+            int _type = T__260;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:258:8: ( 'message' )
+            // InternalFormalML.g:258:10: 'message'
+            {
+            match("message"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__260"
+
+    // $ANTLR start "T__261"
+    public final void mT__261() throws RecognitionException {
+        try {
+            int _type = T__261;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:259:8: ( 'vertex' )
+            // InternalFormalML.g:259:10: 'vertex'
+            {
+            match("vertex"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__261"
+
+    // $ANTLR start "T__262"
+    public final void mT__262() throws RecognitionException {
+        try {
+            int _type = T__262;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:260:8: ( 'vector' )
+            // InternalFormalML.g:260:10: 'vector'
+            {
+            match("vector"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__262"
+
+    // $ANTLR start "T__263"
+    public final void mT__263() throws RecognitionException {
+        try {
+            int _type = T__263;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:261:8: ( 'rvector' )
+            // InternalFormalML.g:261:10: 'rvector'
+            {
+            match("rvector"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__263"
+
+    // $ANTLR start "T__264"
+    public final void mT__264() throws RecognitionException {
+        try {
+            int _type = T__264;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:262:8: ( 'list' )
+            // InternalFormalML.g:262:10: 'list'
+            {
+            match("list"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__264"
+
+    // $ANTLR start "T__265"
+    public final void mT__265() throws RecognitionException {
+        try {
+            int _type = T__265;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:263:8: ( 'set' )
+            // InternalFormalML.g:263:10: 'set'
+            {
+            match("set"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__265"
+
+    // $ANTLR start "T__266"
+    public final void mT__266() throws RecognitionException {
+        try {
+            int _type = T__266;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:264:8: ( 'bag' )
+            // InternalFormalML.g:264:10: 'bag'
+            {
+            match("bag"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__266"
+
+    // $ANTLR start "T__267"
+    public final void mT__267() throws RecognitionException {
+        try {
+            int _type = T__267;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:265:8: ( 'fifo' )
+            // InternalFormalML.g:265:10: 'fifo'
+            {
+            match("fifo"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__267"
+
+    // $ANTLR start "T__268"
+    public final void mT__268() throws RecognitionException {
+        try {
+            int _type = T__268;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:266:8: ( 'lifo' )
+            // InternalFormalML.g:266:10: 'lifo'
+            {
+            match("lifo"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__268"
+
+    // $ANTLR start "T__269"
+    public final void mT__269() throws RecognitionException {
+        try {
+            int _type = T__269;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:267:8: ( 'in' )
+            // InternalFormalML.g:267:10: 'in'
+            {
+            match("in"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__269"
+
+    // $ANTLR start "T__270"
+    public final void mT__270() throws RecognitionException {
+        try {
+            int _type = T__270;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:268:8: ( 'out' )
+            // InternalFormalML.g:268:10: 'out'
+            {
+            match("out"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__270"
+
+    // $ANTLR start "T__271"
+    public final void mT__271() throws RecognitionException {
+        try {
+            int _type = T__271;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:269:8: ( 'abort' )
+            // InternalFormalML.g:269:10: 'abort'
+            {
+            match("abort"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__271"
+
+    // $ANTLR start "T__272"
+    public final void mT__272() throws RecognitionException {
+        try {
+            int _type = T__272;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:270:8: ( 'break' )
+            // InternalFormalML.g:270:10: 'break'
+            {
+            match("break"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__272"
+
+    // $ANTLR start "T__273"
+    public final void mT__273() throws RecognitionException {
+        try {
+            int _type = T__273;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:271:8: ( 'continue' )
+            // InternalFormalML.g:271:10: 'continue'
+            {
+            match("continue"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__273"
+
+    // $ANTLR start "T__274"
+    public final void mT__274() throws RecognitionException {
+        try {
+            int _type = T__274;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:272:8: ( 'exit' )
+            // InternalFormalML.g:272:10: 'exit'
+            {
+            match("exit"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__274"
+
+    // $ANTLR start "T__275"
+    public final void mT__275() throws RecognitionException {
+        try {
+            int _type = T__275;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:273:8: ( 'init' )
+            // InternalFormalML.g:273:10: 'init'
+            {
+            match("init"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__275"
+
+    // $ANTLR start "T__276"
+    public final void mT__276() throws RecognitionException {
+        try {
+            int _type = T__276;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:274:8: ( 'destroy' )
+            // InternalFormalML.g:274:10: 'destroy'
+            {
+            match("destroy"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__276"
+
+    // $ANTLR start "T__277"
+    public final void mT__277() throws RecognitionException {
+        try {
+            int _type = T__277;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:275:8: ( 'stop' )
+            // InternalFormalML.g:275:10: 'stop'
+            {
+            match("stop"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__277"
+
+    // $ANTLR start "T__278"
+    public final void mT__278() throws RecognitionException {
+        try {
+            int _type = T__278;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:276:8: ( 'restart' )
+            // InternalFormalML.g:276:10: 'restart'
+            {
+            match("restart"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__278"
+
+    // $ANTLR start "T__279"
+    public final void mT__279() throws RecognitionException {
+        try {
+            int _type = T__279;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:277:8: ( 'suspend' )
+            // InternalFormalML.g:277:10: 'suspend'
+            {
+            match("suspend"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__279"
+
+    // $ANTLR start "T__280"
+    public final void mT__280() throws RecognitionException {
+        try {
+            int _type = T__280;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:278:8: ( 'resume' )
+            // InternalFormalML.g:278:10: 'resume'
+            {
+            match("resume"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__280"
+
+    // $ANTLR start "T__281"
+    public final void mT__281() throws RecognitionException {
+        try {
+            int _type = T__281;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:279:8: ( 'wait' )
+            // InternalFormalML.g:279:10: 'wait'
+            {
+            match("wait"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__281"
+
+    // $ANTLR start "T__282"
+    public final void mT__282() throws RecognitionException {
+        try {
+            int _type = T__282;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:280:8: ( 'disable' )
+            // InternalFormalML.g:280:10: 'disable'
+            {
+            match("disable"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__282"
+
+    // $ANTLR start "T__283"
+    public final void mT__283() throws RecognitionException {
+        try {
+            int _type = T__283;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:281:8: ( 'enable' )
+            // InternalFormalML.g:281:10: 'enable'
+            {
+            match("enable"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__283"
+
+    // $ANTLR start "T__284"
+    public final void mT__284() throws RecognitionException {
+        try {
+            int _type = T__284;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:282:8: ( 'schedule' )
+            // InternalFormalML.g:282:10: 'schedule'
+            {
+            match("schedule"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__284"
+
+    // $ANTLR start "T__285"
+    public final void mT__285() throws RecognitionException {
+        try {
+            int _type = T__285;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:283:8: ( 'irun' )
+            // InternalFormalML.g:283:10: 'irun'
+            {
+            match("irun"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__285"
+
+    // $ANTLR start "T__286"
+    public final void mT__286() throws RecognitionException {
+        try {
+            int _type = T__286;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:284:8: ( 'run' )
+            // InternalFormalML.g:284:10: 'run'
+            {
+            match("run"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__286"
+
+    // $ANTLR start "T__287"
+    public final void mT__287() throws RecognitionException {
+        try {
+            int _type = T__287;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:285:8: ( 'rtc' )
+            // InternalFormalML.g:285:10: 'rtc'
+            {
+            match("rtc"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__287"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30631:10: ( ( '0' .. '9' )+ )
+            // InternalFormalML.g:30631:12: ( '0' .. '9' )+
+            {
+            // InternalFormalML.g:30631:12: ( '0' .. '9' )+
+            int cnt1=0;
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( ((LA1_0>='0' && LA1_0<='9')) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // InternalFormalML.g:30631:13: '0' .. '9'
+            	    {
+            	    matchRange('0','9'); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt1 >= 1 ) break loop1;
+                        EarlyExitException eee =
+                            new EarlyExitException(1, input);
+                        throw eee;
+                }
+                cnt1++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_CHARACTER"
+    public final void mRULE_CHARACTER() throws RecognitionException {
+        try {
+            int _type = RULE_CHARACTER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30633:16: ( '\\'' . '\\'' )
+            // InternalFormalML.g:30633:18: '\\'' . '\\''
+            {
+            match('\''); 
+            matchAny(); 
+            match('\''); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_CHARACTER"
+
+    // $ANTLR start "RULE_XLIA_ID"
+    public final void mRULE_XLIA_ID() throws RecognitionException {
+        try {
+            int _type = RULE_XLIA_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30635:14: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '#' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )* )
+            // InternalFormalML.g:30635:16: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '#' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )*
+            {
+            if ( input.LA(1)=='#'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalFormalML.g:30635:44: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '#' )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0=='#'||(LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='Z')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='z')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // InternalFormalML.g:
+            	    {
+            	    if ( input.LA(1)=='#'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_XLIA_ID"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30637:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* )
+            // InternalFormalML.g:30637:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            {
+            // InternalFormalML.g:30637:11: ( '^' )?
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0=='^') ) {
+                alt3=1;
+            }
+            switch (alt3) {
+                case 1 :
+                    // InternalFormalML.g:30637:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // InternalFormalML.g:30637:40: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            loop4:
+            do {
+                int alt4=2;
+                int LA4_0 = input.LA(1);
+
+                if ( ((LA4_0>='0' && LA4_0<='9')||(LA4_0>='A' && LA4_0<='Z')||LA4_0=='_'||(LA4_0>='a' && LA4_0<='z')) ) {
+                    alt4=1;
+                }
+
+
+                switch (alt4) {
+            	case 1 :
+            	    // InternalFormalML.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop4;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30639:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
+            // InternalFormalML.g:30639:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            {
+            // InternalFormalML.g:30639:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0=='\"') ) {
+                alt7=1;
+            }
+            else if ( (LA7_0=='\'') ) {
+                alt7=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalFormalML.g:30639:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+                    {
+                    match('\"'); 
+                    // InternalFormalML.g:30639:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop5:
+                    do {
+                        int alt5=3;
+                        int LA5_0 = input.LA(1);
+
+                        if ( (LA5_0=='\\') ) {
+                            alt5=1;
+                        }
+                        else if ( ((LA5_0>='\u0000' && LA5_0<='!')||(LA5_0>='#' && LA5_0<='[')||(LA5_0>=']' && LA5_0<='\uFFFF')) ) {
+                            alt5=2;
+                        }
+
+
+                        switch (alt5) {
+                    	case 1 :
+                    	    // InternalFormalML.g:30639:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:30639:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop5;
+                        }
+                    } while (true);
+
+                    match('\"'); 
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:30639:48: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+                    {
+                    match('\''); 
+                    // InternalFormalML.g:30639:53: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop6:
+                    do {
+                        int alt6=3;
+                        int LA6_0 = input.LA(1);
+
+                        if ( (LA6_0=='\\') ) {
+                            alt6=1;
+                        }
+                        else if ( ((LA6_0>='\u0000' && LA6_0<='&')||(LA6_0>='(' && LA6_0<='[')||(LA6_0>=']' && LA6_0<='\uFFFF')) ) {
+                            alt6=2;
+                        }
+
+
+                        switch (alt6) {
+                    	case 1 :
+                    	    // InternalFormalML.g:30639:54: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:30639:61: ~ ( ( '\\\\' | '\\'' ) )
+                    	    {
+                    	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+                    	        input.consume();
+
+                    	    }
+                    	    else {
+                    	        MismatchedSetException mse = new MismatchedSetException(null,input);
+                    	        recover(mse);
+                    	        throw mse;}
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop6;
+                        }
+                    } while (true);
+
+                    match('\''); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_STRING"
+
+    // $ANTLR start "RULE_ML_COMMENT"
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30641:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalFormalML.g:30641:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // InternalFormalML.g:30641:24: ( options {greedy=false; } : . )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( (LA8_0=='*') ) {
+                    int LA8_1 = input.LA(2);
+
+                    if ( (LA8_1=='/') ) {
+                        alt8=2;
+                    }
+                    else if ( ((LA8_1>='\u0000' && LA8_1<='.')||(LA8_1>='0' && LA8_1<='\uFFFF')) ) {
+                        alt8=1;
+                    }
+
+
+                }
+                else if ( ((LA8_0>='\u0000' && LA8_0<=')')||(LA8_0>='+' && LA8_0<='\uFFFF')) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // InternalFormalML.g:30641:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            match("*/"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ML_COMMENT"
+
+    // $ANTLR start "RULE_SL_COMMENT"
+    public final void mRULE_SL_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_SL_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30643:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalFormalML.g:30643:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // InternalFormalML.g:30643:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop9:
+            do {
+                int alt9=2;
+                int LA9_0 = input.LA(1);
+
+                if ( ((LA9_0>='\u0000' && LA9_0<='\t')||(LA9_0>='\u000B' && LA9_0<='\f')||(LA9_0>='\u000E' && LA9_0<='\uFFFF')) ) {
+                    alt9=1;
+                }
+
+
+                switch (alt9) {
+            	case 1 :
+            	    // InternalFormalML.g:30643:24: ~ ( ( '\\n' | '\\r' ) )
+            	    {
+            	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop9;
+                }
+            } while (true);
+
+            // InternalFormalML.g:30643:40: ( ( '\\r' )? '\\n' )?
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0=='\n'||LA11_0=='\r') ) {
+                alt11=1;
+            }
+            switch (alt11) {
+                case 1 :
+                    // InternalFormalML.g:30643:41: ( '\\r' )? '\\n'
+                    {
+                    // InternalFormalML.g:30643:41: ( '\\r' )?
+                    int alt10=2;
+                    int LA10_0 = input.LA(1);
+
+                    if ( (LA10_0=='\r') ) {
+                        alt10=1;
+                    }
+                    switch (alt10) {
+                        case 1 :
+                            // InternalFormalML.g:30643:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_SL_COMMENT"
+
+    // $ANTLR start "RULE_WS"
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30645:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalFormalML.g:30645:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // InternalFormalML.g:30645:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt12=0;
+            loop12:
+            do {
+                int alt12=2;
+                int LA12_0 = input.LA(1);
+
+                if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {
+                    alt12=1;
+                }
+
+
+                switch (alt12) {
+            	case 1 :
+            	    // InternalFormalML.g:
+            	    {
+            	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt12 >= 1 ) break loop12;
+                        EarlyExitException eee =
+                            new EarlyExitException(12, input);
+                        throw eee;
+                }
+                cnt12++;
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_WS"
+
+    // $ANTLR start "RULE_ANY_OTHER"
+    public final void mRULE_ANY_OTHER() throws RecognitionException {
+        try {
+            int _type = RULE_ANY_OTHER;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalFormalML.g:30647:16: ( . )
+            // InternalFormalML.g:30647:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // InternalFormalML.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | T__237 | T__238 | T__239 | T__240 | T__241 | T__242 | T__243 | T__244 | T__245 | T__246 | T__247 | T__248 | T__249 | T__250 | T__251 | T__252 | T__253 | T__254 | T__255 | T__256 | T__257 | T__258 | T__259 | T__260 | T__261 | T__262 | T__263 | T__264 | T__265 | T__266 | T__267 | T__268 | T__269 | T__270 | T__271 | T__272 | T__273 | T__274 | T__275 | T__276 | T__277 | T__278 | T__279 | T__280 | T__281 | T__282 | T__283 | T__284 | T__285 | T__286 | T__287 | RULE_INT | RULE_CHARACTER | RULE_XLIA_ID | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt13=284;
+        alt13 = dfa13.predict(input);
+        switch (alt13) {
+            case 1 :
+                // InternalFormalML.g:1:10: T__13
+                {
+                mT__13(); 
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:1:16: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 3 :
+                // InternalFormalML.g:1:22: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 4 :
+                // InternalFormalML.g:1:28: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 5 :
+                // InternalFormalML.g:1:34: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 6 :
+                // InternalFormalML.g:1:40: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 7 :
+                // InternalFormalML.g:1:46: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 8 :
+                // InternalFormalML.g:1:52: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 9 :
+                // InternalFormalML.g:1:58: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 10 :
+                // InternalFormalML.g:1:64: T__22
+                {
+                mT__22(); 
+
+                }
+                break;
+            case 11 :
+                // InternalFormalML.g:1:70: T__23
+                {
+                mT__23(); 
+
+                }
+                break;
+            case 12 :
+                // InternalFormalML.g:1:76: T__24
+                {
+                mT__24(); 
+
+                }
+                break;
+            case 13 :
+                // InternalFormalML.g:1:82: T__25
+                {
+                mT__25(); 
+
+                }
+                break;
+            case 14 :
+                // InternalFormalML.g:1:88: T__26
+                {
+                mT__26(); 
+
+                }
+                break;
+            case 15 :
+                // InternalFormalML.g:1:94: T__27
+                {
+                mT__27(); 
+
+                }
+                break;
+            case 16 :
+                // InternalFormalML.g:1:100: T__28
+                {
+                mT__28(); 
+
+                }
+                break;
+            case 17 :
+                // InternalFormalML.g:1:106: T__29
+                {
+                mT__29(); 
+
+                }
+                break;
+            case 18 :
+                // InternalFormalML.g:1:112: T__30
+                {
+                mT__30(); 
+
+                }
+                break;
+            case 19 :
+                // InternalFormalML.g:1:118: T__31
+                {
+                mT__31(); 
+
+                }
+                break;
+            case 20 :
+                // InternalFormalML.g:1:124: T__32
+                {
+                mT__32(); 
+
+                }
+                break;
+            case 21 :
+                // InternalFormalML.g:1:130: T__33
+                {
+                mT__33(); 
+
+                }
+                break;
+            case 22 :
+                // InternalFormalML.g:1:136: T__34
+                {
+                mT__34(); 
+
+                }
+                break;
+            case 23 :
+                // InternalFormalML.g:1:142: T__35
+                {
+                mT__35(); 
+
+                }
+                break;
+            case 24 :
+                // InternalFormalML.g:1:148: T__36
+                {
+                mT__36(); 
+
+                }
+                break;
+            case 25 :
+                // InternalFormalML.g:1:154: T__37
+                {
+                mT__37(); 
+
+                }
+                break;
+            case 26 :
+                // InternalFormalML.g:1:160: T__38
+                {
+                mT__38(); 
+
+                }
+                break;
+            case 27 :
+                // InternalFormalML.g:1:166: T__39
+                {
+                mT__39(); 
+
+                }
+                break;
+            case 28 :
+                // InternalFormalML.g:1:172: T__40
+                {
+                mT__40(); 
+
+                }
+                break;
+            case 29 :
+                // InternalFormalML.g:1:178: T__41
+                {
+                mT__41(); 
+
+                }
+                break;
+            case 30 :
+                // InternalFormalML.g:1:184: T__42
+                {
+                mT__42(); 
+
+                }
+                break;
+            case 31 :
+                // InternalFormalML.g:1:190: T__43
+                {
+                mT__43(); 
+
+                }
+                break;
+            case 32 :
+                // InternalFormalML.g:1:196: T__44
+                {
+                mT__44(); 
+
+                }
+                break;
+            case 33 :
+                // InternalFormalML.g:1:202: T__45
+                {
+                mT__45(); 
+
+                }
+                break;
+            case 34 :
+                // InternalFormalML.g:1:208: T__46
+                {
+                mT__46(); 
+
+                }
+                break;
+            case 35 :
+                // InternalFormalML.g:1:214: T__47
+                {
+                mT__47(); 
+
+                }
+                break;
+            case 36 :
+                // InternalFormalML.g:1:220: T__48
+                {
+                mT__48(); 
+
+                }
+                break;
+            case 37 :
+                // InternalFormalML.g:1:226: T__49
+                {
+                mT__49(); 
+
+                }
+                break;
+            case 38 :
+                // InternalFormalML.g:1:232: T__50
+                {
+                mT__50(); 
+
+                }
+                break;
+            case 39 :
+                // InternalFormalML.g:1:238: T__51
+                {
+                mT__51(); 
+
+                }
+                break;
+            case 40 :
+                // InternalFormalML.g:1:244: T__52
+                {
+                mT__52(); 
+
+                }
+                break;
+            case 41 :
+                // InternalFormalML.g:1:250: T__53
+                {
+                mT__53(); 
+
+                }
+                break;
+            case 42 :
+                // InternalFormalML.g:1:256: T__54
+                {
+                mT__54(); 
+
+                }
+                break;
+            case 43 :
+                // InternalFormalML.g:1:262: T__55
+                {
+                mT__55(); 
+
+                }
+                break;
+            case 44 :
+                // InternalFormalML.g:1:268: T__56
+                {
+                mT__56(); 
+
+                }
+                break;
+            case 45 :
+                // InternalFormalML.g:1:274: T__57
+                {
+                mT__57(); 
+
+                }
+                break;
+            case 46 :
+                // InternalFormalML.g:1:280: T__58
+                {
+                mT__58(); 
+
+                }
+                break;
+            case 47 :
+                // InternalFormalML.g:1:286: T__59
+                {
+                mT__59(); 
+
+                }
+                break;
+            case 48 :
+                // InternalFormalML.g:1:292: T__60
+                {
+                mT__60(); 
+
+                }
+                break;
+            case 49 :
+                // InternalFormalML.g:1:298: T__61
+                {
+                mT__61(); 
+
+                }
+                break;
+            case 50 :
+                // InternalFormalML.g:1:304: T__62
+                {
+                mT__62(); 
+
+                }
+                break;
+            case 51 :
+                // InternalFormalML.g:1:310: T__63
+                {
+                mT__63(); 
+
+                }
+                break;
+            case 52 :
+                // InternalFormalML.g:1:316: T__64
+                {
+                mT__64(); 
+
+                }
+                break;
+            case 53 :
+                // InternalFormalML.g:1:322: T__65
+                {
+                mT__65(); 
+
+                }
+                break;
+            case 54 :
+                // InternalFormalML.g:1:328: T__66
+                {
+                mT__66(); 
+
+                }
+                break;
+            case 55 :
+                // InternalFormalML.g:1:334: T__67
+                {
+                mT__67(); 
+
+                }
+                break;
+            case 56 :
+                // InternalFormalML.g:1:340: T__68
+                {
+                mT__68(); 
+
+                }
+                break;
+            case 57 :
+                // InternalFormalML.g:1:346: T__69
+                {
+                mT__69(); 
+
+                }
+                break;
+            case 58 :
+                // InternalFormalML.g:1:352: T__70
+                {
+                mT__70(); 
+
+                }
+                break;
+            case 59 :
+                // InternalFormalML.g:1:358: T__71
+                {
+                mT__71(); 
+
+                }
+                break;
+            case 60 :
+                // InternalFormalML.g:1:364: T__72
+                {
+                mT__72(); 
+
+                }
+                break;
+            case 61 :
+                // InternalFormalML.g:1:370: T__73
+                {
+                mT__73(); 
+
+                }
+                break;
+            case 62 :
+                // InternalFormalML.g:1:376: T__74
+                {
+                mT__74(); 
+
+                }
+                break;
+            case 63 :
+                // InternalFormalML.g:1:382: T__75
+                {
+                mT__75(); 
+
+                }
+                break;
+            case 64 :
+                // InternalFormalML.g:1:388: T__76
+                {
+                mT__76(); 
+
+                }
+                break;
+            case 65 :
+                // InternalFormalML.g:1:394: T__77
+                {
+                mT__77(); 
+
+                }
+                break;
+            case 66 :
+                // InternalFormalML.g:1:400: T__78
+                {
+                mT__78(); 
+
+                }
+                break;
+            case 67 :
+                // InternalFormalML.g:1:406: T__79
+                {
+                mT__79(); 
+
+                }
+                break;
+            case 68 :
+                // InternalFormalML.g:1:412: T__80
+                {
+                mT__80(); 
+
+                }
+                break;
+            case 69 :
+                // InternalFormalML.g:1:418: T__81
+                {
+                mT__81(); 
+
+                }
+                break;
+            case 70 :
+                // InternalFormalML.g:1:424: T__82
+                {
+                mT__82(); 
+
+                }
+                break;
+            case 71 :
+                // InternalFormalML.g:1:430: T__83
+                {
+                mT__83(); 
+
+                }
+                break;
+            case 72 :
+                // InternalFormalML.g:1:436: T__84
+                {
+                mT__84(); 
+
+                }
+                break;
+            case 73 :
+                // InternalFormalML.g:1:442: T__85
+                {
+                mT__85(); 
+
+                }
+                break;
+            case 74 :
+                // InternalFormalML.g:1:448: T__86
+                {
+                mT__86(); 
+
+                }
+                break;
+            case 75 :
+                // InternalFormalML.g:1:454: T__87
+                {
+                mT__87(); 
+
+                }
+                break;
+            case 76 :
+                // InternalFormalML.g:1:460: T__88
+                {
+                mT__88(); 
+
+                }
+                break;
+            case 77 :
+                // InternalFormalML.g:1:466: T__89
+                {
+                mT__89(); 
+
+                }
+                break;
+            case 78 :
+                // InternalFormalML.g:1:472: T__90
+                {
+                mT__90(); 
+
+                }
+                break;
+            case 79 :
+                // InternalFormalML.g:1:478: T__91
+                {
+                mT__91(); 
+
+                }
+                break;
+            case 80 :
+                // InternalFormalML.g:1:484: T__92
+                {
+                mT__92(); 
+
+                }
+                break;
+            case 81 :
+                // InternalFormalML.g:1:490: T__93
+                {
+                mT__93(); 
+
+                }
+                break;
+            case 82 :
+                // InternalFormalML.g:1:496: T__94
+                {
+                mT__94(); 
+
+                }
+                break;
+            case 83 :
+                // InternalFormalML.g:1:502: T__95
+                {
+                mT__95(); 
+
+                }
+                break;
+            case 84 :
+                // InternalFormalML.g:1:508: T__96
+                {
+                mT__96(); 
+
+                }
+                break;
+            case 85 :
+                // InternalFormalML.g:1:514: T__97
+                {
+                mT__97(); 
+
+                }
+                break;
+            case 86 :
+                // InternalFormalML.g:1:520: T__98
+                {
+                mT__98(); 
+
+                }
+                break;
+            case 87 :
+                // InternalFormalML.g:1:526: T__99
+                {
+                mT__99(); 
+
+                }
+                break;
+            case 88 :
+                // InternalFormalML.g:1:532: T__100
+                {
+                mT__100(); 
+
+                }
+                break;
+            case 89 :
+                // InternalFormalML.g:1:539: T__101
+                {
+                mT__101(); 
+
+                }
+                break;
+            case 90 :
+                // InternalFormalML.g:1:546: T__102
+                {
+                mT__102(); 
+
+                }
+                break;
+            case 91 :
+                // InternalFormalML.g:1:553: T__103
+                {
+                mT__103(); 
+
+                }
+                break;
+            case 92 :
+                // InternalFormalML.g:1:560: T__104
+                {
+                mT__104(); 
+
+                }
+                break;
+            case 93 :
+                // InternalFormalML.g:1:567: T__105
+                {
+                mT__105(); 
+
+                }
+                break;
+            case 94 :
+                // InternalFormalML.g:1:574: T__106
+                {
+                mT__106(); 
+
+                }
+                break;
+            case 95 :
+                // InternalFormalML.g:1:581: T__107
+                {
+                mT__107(); 
+
+                }
+                break;
+            case 96 :
+                // InternalFormalML.g:1:588: T__108
+                {
+                mT__108(); 
+
+                }
+                break;
+            case 97 :
+                // InternalFormalML.g:1:595: T__109
+                {
+                mT__109(); 
+
+                }
+                break;
+            case 98 :
+                // InternalFormalML.g:1:602: T__110
+                {
+                mT__110(); 
+
+                }
+                break;
+            case 99 :
+                // InternalFormalML.g:1:609: T__111
+                {
+                mT__111(); 
+
+                }
+                break;
+            case 100 :
+                // InternalFormalML.g:1:616: T__112
+                {
+                mT__112(); 
+
+                }
+                break;
+            case 101 :
+                // InternalFormalML.g:1:623: T__113
+                {
+                mT__113(); 
+
+                }
+                break;
+            case 102 :
+                // InternalFormalML.g:1:630: T__114
+                {
+                mT__114(); 
+
+                }
+                break;
+            case 103 :
+                // InternalFormalML.g:1:637: T__115
+                {
+                mT__115(); 
+
+                }
+                break;
+            case 104 :
+                // InternalFormalML.g:1:644: T__116
+                {
+                mT__116(); 
+
+                }
+                break;
+            case 105 :
+                // InternalFormalML.g:1:651: T__117
+                {
+                mT__117(); 
+
+                }
+                break;
+            case 106 :
+                // InternalFormalML.g:1:658: T__118
+                {
+                mT__118(); 
+
+                }
+                break;
+            case 107 :
+                // InternalFormalML.g:1:665: T__119
+                {
+                mT__119(); 
+
+                }
+                break;
+            case 108 :
+                // InternalFormalML.g:1:672: T__120
+                {
+                mT__120(); 
+
+                }
+                break;
+            case 109 :
+                // InternalFormalML.g:1:679: T__121
+                {
+                mT__121(); 
+
+                }
+                break;
+            case 110 :
+                // InternalFormalML.g:1:686: T__122
+                {
+                mT__122(); 
+
+                }
+                break;
+            case 111 :
+                // InternalFormalML.g:1:693: T__123
+                {
+                mT__123(); 
+
+                }
+                break;
+            case 112 :
+                // InternalFormalML.g:1:700: T__124
+                {
+                mT__124(); 
+
+                }
+                break;
+            case 113 :
+                // InternalFormalML.g:1:707: T__125
+                {
+                mT__125(); 
+
+                }
+                break;
+            case 114 :
+                // InternalFormalML.g:1:714: T__126
+                {
+                mT__126(); 
+
+                }
+                break;
+            case 115 :
+                // InternalFormalML.g:1:721: T__127
+                {
+                mT__127(); 
+
+                }
+                break;
+            case 116 :
+                // InternalFormalML.g:1:728: T__128
+                {
+                mT__128(); 
+
+                }
+                break;
+            case 117 :
+                // InternalFormalML.g:1:735: T__129
+                {
+                mT__129(); 
+
+                }
+                break;
+            case 118 :
+                // InternalFormalML.g:1:742: T__130
+                {
+                mT__130(); 
+
+                }
+                break;
+            case 119 :
+                // InternalFormalML.g:1:749: T__131
+                {
+                mT__131(); 
+
+                }
+                break;
+            case 120 :
+                // InternalFormalML.g:1:756: T__132
+                {
+                mT__132(); 
+
+                }
+                break;
+            case 121 :
+                // InternalFormalML.g:1:763: T__133
+                {
+                mT__133(); 
+
+                }
+                break;
+            case 122 :
+                // InternalFormalML.g:1:770: T__134
+                {
+                mT__134(); 
+
+                }
+                break;
+            case 123 :
+                // InternalFormalML.g:1:777: T__135
+                {
+                mT__135(); 
+
+                }
+                break;
+            case 124 :
+                // InternalFormalML.g:1:784: T__136
+                {
+                mT__136(); 
+
+                }
+                break;
+            case 125 :
+                // InternalFormalML.g:1:791: T__137
+                {
+                mT__137(); 
+
+                }
+                break;
+            case 126 :
+                // InternalFormalML.g:1:798: T__138
+                {
+                mT__138(); 
+
+                }
+                break;
+            case 127 :
+                // InternalFormalML.g:1:805: T__139
+                {
+                mT__139(); 
+
+                }
+                break;
+            case 128 :
+                // InternalFormalML.g:1:812: T__140
+                {
+                mT__140(); 
+
+                }
+                break;
+            case 129 :
+                // InternalFormalML.g:1:819: T__141
+                {
+                mT__141(); 
+
+                }
+                break;
+            case 130 :
+                // InternalFormalML.g:1:826: T__142
+                {
+                mT__142(); 
+
+                }
+                break;
+            case 131 :
+                // InternalFormalML.g:1:833: T__143
+                {
+                mT__143(); 
+
+                }
+                break;
+            case 132 :
+                // InternalFormalML.g:1:840: T__144
+                {
+                mT__144(); 
+
+                }
+                break;
+            case 133 :
+                // InternalFormalML.g:1:847: T__145
+                {
+                mT__145(); 
+
+                }
+                break;
+            case 134 :
+                // InternalFormalML.g:1:854: T__146
+                {
+                mT__146(); 
+
+                }
+                break;
+            case 135 :
+                // InternalFormalML.g:1:861: T__147
+                {
+                mT__147(); 
+
+                }
+                break;
+            case 136 :
+                // InternalFormalML.g:1:868: T__148
+                {
+                mT__148(); 
+
+                }
+                break;
+            case 137 :
+                // InternalFormalML.g:1:875: T__149
+                {
+                mT__149(); 
+
+                }
+                break;
+            case 138 :
+                // InternalFormalML.g:1:882: T__150
+                {
+                mT__150(); 
+
+                }
+                break;
+            case 139 :
+                // InternalFormalML.g:1:889: T__151
+                {
+                mT__151(); 
+
+                }
+                break;
+            case 140 :
+                // InternalFormalML.g:1:896: T__152
+                {
+                mT__152(); 
+
+                }
+                break;
+            case 141 :
+                // InternalFormalML.g:1:903: T__153
+                {
+                mT__153(); 
+
+                }
+                break;
+            case 142 :
+                // InternalFormalML.g:1:910: T__154
+                {
+                mT__154(); 
+
+                }
+                break;
+            case 143 :
+                // InternalFormalML.g:1:917: T__155
+                {
+                mT__155(); 
+
+                }
+                break;
+            case 144 :
+                // InternalFormalML.g:1:924: T__156
+                {
+                mT__156(); 
+
+                }
+                break;
+            case 145 :
+                // InternalFormalML.g:1:931: T__157
+                {
+                mT__157(); 
+
+                }
+                break;
+            case 146 :
+                // InternalFormalML.g:1:938: T__158
+                {
+                mT__158(); 
+
+                }
+                break;
+            case 147 :
+                // InternalFormalML.g:1:945: T__159
+                {
+                mT__159(); 
+
+                }
+                break;
+            case 148 :
+                // InternalFormalML.g:1:952: T__160
+                {
+                mT__160(); 
+
+                }
+                break;
+            case 149 :
+                // InternalFormalML.g:1:959: T__161
+                {
+                mT__161(); 
+
+                }
+                break;
+            case 150 :
+                // InternalFormalML.g:1:966: T__162
+                {
+                mT__162(); 
+
+                }
+                break;
+            case 151 :
+                // InternalFormalML.g:1:973: T__163
+                {
+                mT__163(); 
+
+                }
+                break;
+            case 152 :
+                // InternalFormalML.g:1:980: T__164
+                {
+                mT__164(); 
+
+                }
+                break;
+            case 153 :
+                // InternalFormalML.g:1:987: T__165
+                {
+                mT__165(); 
+
+                }
+                break;
+            case 154 :
+                // InternalFormalML.g:1:994: T__166
+                {
+                mT__166(); 
+
+                }
+                break;
+            case 155 :
+                // InternalFormalML.g:1:1001: T__167
+                {
+                mT__167(); 
+
+                }
+                break;
+            case 156 :
+                // InternalFormalML.g:1:1008: T__168
+                {
+                mT__168(); 
+
+                }
+                break;
+            case 157 :
+                // InternalFormalML.g:1:1015: T__169
+                {
+                mT__169(); 
+
+                }
+                break;
+            case 158 :
+                // InternalFormalML.g:1:1022: T__170
+                {
+                mT__170(); 
+
+                }
+                break;
+            case 159 :
+                // InternalFormalML.g:1:1029: T__171
+                {
+                mT__171(); 
+
+                }
+                break;
+            case 160 :
+                // InternalFormalML.g:1:1036: T__172
+                {
+                mT__172(); 
+
+                }
+                break;
+            case 161 :
+                // InternalFormalML.g:1:1043: T__173
+                {
+                mT__173(); 
+
+                }
+                break;
+            case 162 :
+                // InternalFormalML.g:1:1050: T__174
+                {
+                mT__174(); 
+
+                }
+                break;
+            case 163 :
+                // InternalFormalML.g:1:1057: T__175
+                {
+                mT__175(); 
+
+                }
+                break;
+            case 164 :
+                // InternalFormalML.g:1:1064: T__176
+                {
+                mT__176(); 
+
+                }
+                break;
+            case 165 :
+                // InternalFormalML.g:1:1071: T__177
+                {
+                mT__177(); 
+
+                }
+                break;
+            case 166 :
+                // InternalFormalML.g:1:1078: T__178
+                {
+                mT__178(); 
+
+                }
+                break;
+            case 167 :
+                // InternalFormalML.g:1:1085: T__179
+                {
+                mT__179(); 
+
+                }
+                break;
+            case 168 :
+                // InternalFormalML.g:1:1092: T__180
+                {
+                mT__180(); 
+
+                }
+                break;
+            case 169 :
+                // InternalFormalML.g:1:1099: T__181
+                {
+                mT__181(); 
+
+                }
+                break;
+            case 170 :
+                // InternalFormalML.g:1:1106: T__182
+                {
+                mT__182(); 
+
+                }
+                break;
+            case 171 :
+                // InternalFormalML.g:1:1113: T__183
+                {
+                mT__183(); 
+
+                }
+                break;
+            case 172 :
+                // InternalFormalML.g:1:1120: T__184
+                {
+                mT__184(); 
+
+                }
+                break;
+            case 173 :
+                // InternalFormalML.g:1:1127: T__185
+                {
+                mT__185(); 
+
+                }
+                break;
+            case 174 :
+                // InternalFormalML.g:1:1134: T__186
+                {
+                mT__186(); 
+
+                }
+                break;
+            case 175 :
+                // InternalFormalML.g:1:1141: T__187
+                {
+                mT__187(); 
+
+                }
+                break;
+            case 176 :
+                // InternalFormalML.g:1:1148: T__188
+                {
+                mT__188(); 
+
+                }
+                break;
+            case 177 :
+                // InternalFormalML.g:1:1155: T__189
+                {
+                mT__189(); 
+
+                }
+                break;
+            case 178 :
+                // InternalFormalML.g:1:1162: T__190
+                {
+                mT__190(); 
+
+                }
+                break;
+            case 179 :
+                // InternalFormalML.g:1:1169: T__191
+                {
+                mT__191(); 
+
+                }
+                break;
+            case 180 :
+                // InternalFormalML.g:1:1176: T__192
+                {
+                mT__192(); 
+
+                }
+                break;
+            case 181 :
+                // InternalFormalML.g:1:1183: T__193
+                {
+                mT__193(); 
+
+                }
+                break;
+            case 182 :
+                // InternalFormalML.g:1:1190: T__194
+                {
+                mT__194(); 
+
+                }
+                break;
+            case 183 :
+                // InternalFormalML.g:1:1197: T__195
+                {
+                mT__195(); 
+
+                }
+                break;
+            case 184 :
+                // InternalFormalML.g:1:1204: T__196
+                {
+                mT__196(); 
+
+                }
+                break;
+            case 185 :
+                // InternalFormalML.g:1:1211: T__197
+                {
+                mT__197(); 
+
+                }
+                break;
+            case 186 :
+                // InternalFormalML.g:1:1218: T__198
+                {
+                mT__198(); 
+
+                }
+                break;
+            case 187 :
+                // InternalFormalML.g:1:1225: T__199
+                {
+                mT__199(); 
+
+                }
+                break;
+            case 188 :
+                // InternalFormalML.g:1:1232: T__200
+                {
+                mT__200(); 
+
+                }
+                break;
+            case 189 :
+                // InternalFormalML.g:1:1239: T__201
+                {
+                mT__201(); 
+
+                }
+                break;
+            case 190 :
+                // InternalFormalML.g:1:1246: T__202
+                {
+                mT__202(); 
+
+                }
+                break;
+            case 191 :
+                // InternalFormalML.g:1:1253: T__203
+                {
+                mT__203(); 
+
+                }
+                break;
+            case 192 :
+                // InternalFormalML.g:1:1260: T__204
+                {
+                mT__204(); 
+
+                }
+                break;
+            case 193 :
+                // InternalFormalML.g:1:1267: T__205
+                {
+                mT__205(); 
+
+                }
+                break;
+            case 194 :
+                // InternalFormalML.g:1:1274: T__206
+                {
+                mT__206(); 
+
+                }
+                break;
+            case 195 :
+                // InternalFormalML.g:1:1281: T__207
+                {
+                mT__207(); 
+
+                }
+                break;
+            case 196 :
+                // InternalFormalML.g:1:1288: T__208
+                {
+                mT__208(); 
+
+                }
+                break;
+            case 197 :
+                // InternalFormalML.g:1:1295: T__209
+                {
+                mT__209(); 
+
+                }
+                break;
+            case 198 :
+                // InternalFormalML.g:1:1302: T__210
+                {
+                mT__210(); 
+
+                }
+                break;
+            case 199 :
+                // InternalFormalML.g:1:1309: T__211
+                {
+                mT__211(); 
+
+                }
+                break;
+            case 200 :
+                // InternalFormalML.g:1:1316: T__212
+                {
+                mT__212(); 
+
+                }
+                break;
+            case 201 :
+                // InternalFormalML.g:1:1323: T__213
+                {
+                mT__213(); 
+
+                }
+                break;
+            case 202 :
+                // InternalFormalML.g:1:1330: T__214
+                {
+                mT__214(); 
+
+                }
+                break;
+            case 203 :
+                // InternalFormalML.g:1:1337: T__215
+                {
+                mT__215(); 
+
+                }
+                break;
+            case 204 :
+                // InternalFormalML.g:1:1344: T__216
+                {
+                mT__216(); 
+
+                }
+                break;
+            case 205 :
+                // InternalFormalML.g:1:1351: T__217
+                {
+                mT__217(); 
+
+                }
+                break;
+            case 206 :
+                // InternalFormalML.g:1:1358: T__218
+                {
+                mT__218(); 
+
+                }
+                break;
+            case 207 :
+                // InternalFormalML.g:1:1365: T__219
+                {
+                mT__219(); 
+
+                }
+                break;
+            case 208 :
+                // InternalFormalML.g:1:1372: T__220
+                {
+                mT__220(); 
+
+                }
+                break;
+            case 209 :
+                // InternalFormalML.g:1:1379: T__221
+                {
+                mT__221(); 
+
+                }
+                break;
+            case 210 :
+                // InternalFormalML.g:1:1386: T__222
+                {
+                mT__222(); 
+
+                }
+                break;
+            case 211 :
+                // InternalFormalML.g:1:1393: T__223
+                {
+                mT__223(); 
+
+                }
+                break;
+            case 212 :
+                // InternalFormalML.g:1:1400: T__224
+                {
+                mT__224(); 
+
+                }
+                break;
+            case 213 :
+                // InternalFormalML.g:1:1407: T__225
+                {
+                mT__225(); 
+
+                }
+                break;
+            case 214 :
+                // InternalFormalML.g:1:1414: T__226
+                {
+                mT__226(); 
+
+                }
+                break;
+            case 215 :
+                // InternalFormalML.g:1:1421: T__227
+                {
+                mT__227(); 
+
+                }
+                break;
+            case 216 :
+                // InternalFormalML.g:1:1428: T__228
+                {
+                mT__228(); 
+
+                }
+                break;
+            case 217 :
+                // InternalFormalML.g:1:1435: T__229
+                {
+                mT__229(); 
+
+                }
+                break;
+            case 218 :
+                // InternalFormalML.g:1:1442: T__230
+                {
+                mT__230(); 
+
+                }
+                break;
+            case 219 :
+                // InternalFormalML.g:1:1449: T__231
+                {
+                mT__231(); 
+
+                }
+                break;
+            case 220 :
+                // InternalFormalML.g:1:1456: T__232
+                {
+                mT__232(); 
+
+                }
+                break;
+            case 221 :
+                // InternalFormalML.g:1:1463: T__233
+                {
+                mT__233(); 
+
+                }
+                break;
+            case 222 :
+                // InternalFormalML.g:1:1470: T__234
+                {
+                mT__234(); 
+
+                }
+                break;
+            case 223 :
+                // InternalFormalML.g:1:1477: T__235
+                {
+                mT__235(); 
+
+                }
+                break;
+            case 224 :
+                // InternalFormalML.g:1:1484: T__236
+                {
+                mT__236(); 
+
+                }
+                break;
+            case 225 :
+                // InternalFormalML.g:1:1491: T__237
+                {
+                mT__237(); 
+
+                }
+                break;
+            case 226 :
+                // InternalFormalML.g:1:1498: T__238
+                {
+                mT__238(); 
+
+                }
+                break;
+            case 227 :
+                // InternalFormalML.g:1:1505: T__239
+                {
+                mT__239(); 
+
+                }
+                break;
+            case 228 :
+                // InternalFormalML.g:1:1512: T__240
+                {
+                mT__240(); 
+
+                }
+                break;
+            case 229 :
+                // InternalFormalML.g:1:1519: T__241
+                {
+                mT__241(); 
+
+                }
+                break;
+            case 230 :
+                // InternalFormalML.g:1:1526: T__242
+                {
+                mT__242(); 
+
+                }
+                break;
+            case 231 :
+                // InternalFormalML.g:1:1533: T__243
+                {
+                mT__243(); 
+
+                }
+                break;
+            case 232 :
+                // InternalFormalML.g:1:1540: T__244
+                {
+                mT__244(); 
+
+                }
+                break;
+            case 233 :
+                // InternalFormalML.g:1:1547: T__245
+                {
+                mT__245(); 
+
+                }
+                break;
+            case 234 :
+                // InternalFormalML.g:1:1554: T__246
+                {
+                mT__246(); 
+
+                }
+                break;
+            case 235 :
+                // InternalFormalML.g:1:1561: T__247
+                {
+                mT__247(); 
+
+                }
+                break;
+            case 236 :
+                // InternalFormalML.g:1:1568: T__248
+                {
+                mT__248(); 
+
+                }
+                break;
+            case 237 :
+                // InternalFormalML.g:1:1575: T__249
+                {
+                mT__249(); 
+
+                }
+                break;
+            case 238 :
+                // InternalFormalML.g:1:1582: T__250
+                {
+                mT__250(); 
+
+                }
+                break;
+            case 239 :
+                // InternalFormalML.g:1:1589: T__251
+                {
+                mT__251(); 
+
+                }
+                break;
+            case 240 :
+                // InternalFormalML.g:1:1596: T__252
+                {
+                mT__252(); 
+
+                }
+                break;
+            case 241 :
+                // InternalFormalML.g:1:1603: T__253
+                {
+                mT__253(); 
+
+                }
+                break;
+            case 242 :
+                // InternalFormalML.g:1:1610: T__254
+                {
+                mT__254(); 
+
+                }
+                break;
+            case 243 :
+                // InternalFormalML.g:1:1617: T__255
+                {
+                mT__255(); 
+
+                }
+                break;
+            case 244 :
+                // InternalFormalML.g:1:1624: T__256
+                {
+                mT__256(); 
+
+                }
+                break;
+            case 245 :
+                // InternalFormalML.g:1:1631: T__257
+                {
+                mT__257(); 
+
+                }
+                break;
+            case 246 :
+                // InternalFormalML.g:1:1638: T__258
+                {
+                mT__258(); 
+
+                }
+                break;
+            case 247 :
+                // InternalFormalML.g:1:1645: T__259
+                {
+                mT__259(); 
+
+                }
+                break;
+            case 248 :
+                // InternalFormalML.g:1:1652: T__260
+                {
+                mT__260(); 
+
+                }
+                break;
+            case 249 :
+                // InternalFormalML.g:1:1659: T__261
+                {
+                mT__261(); 
+
+                }
+                break;
+            case 250 :
+                // InternalFormalML.g:1:1666: T__262
+                {
+                mT__262(); 
+
+                }
+                break;
+            case 251 :
+                // InternalFormalML.g:1:1673: T__263
+                {
+                mT__263(); 
+
+                }
+                break;
+            case 252 :
+                // InternalFormalML.g:1:1680: T__264
+                {
+                mT__264(); 
+
+                }
+                break;
+            case 253 :
+                // InternalFormalML.g:1:1687: T__265
+                {
+                mT__265(); 
+
+                }
+                break;
+            case 254 :
+                // InternalFormalML.g:1:1694: T__266
+                {
+                mT__266(); 
+
+                }
+                break;
+            case 255 :
+                // InternalFormalML.g:1:1701: T__267
+                {
+                mT__267(); 
+
+                }
+                break;
+            case 256 :
+                // InternalFormalML.g:1:1708: T__268
+                {
+                mT__268(); 
+
+                }
+                break;
+            case 257 :
+                // InternalFormalML.g:1:1715: T__269
+                {
+                mT__269(); 
+
+                }
+                break;
+            case 258 :
+                // InternalFormalML.g:1:1722: T__270
+                {
+                mT__270(); 
+
+                }
+                break;
+            case 259 :
+                // InternalFormalML.g:1:1729: T__271
+                {
+                mT__271(); 
+
+                }
+                break;
+            case 260 :
+                // InternalFormalML.g:1:1736: T__272
+                {
+                mT__272(); 
+
+                }
+                break;
+            case 261 :
+                // InternalFormalML.g:1:1743: T__273
+                {
+                mT__273(); 
+
+                }
+                break;
+            case 262 :
+                // InternalFormalML.g:1:1750: T__274
+                {
+                mT__274(); 
+
+                }
+                break;
+            case 263 :
+                // InternalFormalML.g:1:1757: T__275
+                {
+                mT__275(); 
+
+                }
+                break;
+            case 264 :
+                // InternalFormalML.g:1:1764: T__276
+                {
+                mT__276(); 
+
+                }
+                break;
+            case 265 :
+                // InternalFormalML.g:1:1771: T__277
+                {
+                mT__277(); 
+
+                }
+                break;
+            case 266 :
+                // InternalFormalML.g:1:1778: T__278
+                {
+                mT__278(); 
+
+                }
+                break;
+            case 267 :
+                // InternalFormalML.g:1:1785: T__279
+                {
+                mT__279(); 
+
+                }
+                break;
+            case 268 :
+                // InternalFormalML.g:1:1792: T__280
+                {
+                mT__280(); 
+
+                }
+                break;
+            case 269 :
+                // InternalFormalML.g:1:1799: T__281
+                {
+                mT__281(); 
+
+                }
+                break;
+            case 270 :
+                // InternalFormalML.g:1:1806: T__282
+                {
+                mT__282(); 
+
+                }
+                break;
+            case 271 :
+                // InternalFormalML.g:1:1813: T__283
+                {
+                mT__283(); 
+
+                }
+                break;
+            case 272 :
+                // InternalFormalML.g:1:1820: T__284
+                {
+                mT__284(); 
+
+                }
+                break;
+            case 273 :
+                // InternalFormalML.g:1:1827: T__285
+                {
+                mT__285(); 
+
+                }
+                break;
+            case 274 :
+                // InternalFormalML.g:1:1834: T__286
+                {
+                mT__286(); 
+
+                }
+                break;
+            case 275 :
+                // InternalFormalML.g:1:1841: T__287
+                {
+                mT__287(); 
+
+                }
+                break;
+            case 276 :
+                // InternalFormalML.g:1:1848: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 277 :
+                // InternalFormalML.g:1:1857: RULE_CHARACTER
+                {
+                mRULE_CHARACTER(); 
+
+                }
+                break;
+            case 278 :
+                // InternalFormalML.g:1:1872: RULE_XLIA_ID
+                {
+                mRULE_XLIA_ID(); 
+
+                }
+                break;
+            case 279 :
+                // InternalFormalML.g:1:1885: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 280 :
+                // InternalFormalML.g:1:1893: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 281 :
+                // InternalFormalML.g:1:1905: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 282 :
+                // InternalFormalML.g:1:1921: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 283 :
+                // InternalFormalML.g:1:1937: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 284 :
+                // InternalFormalML.g:1:1945: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA13 dfa13 = new DFA13(this);
+    static final String DFA13_eotS =
+        "\1\uffff\1\65\1\111\1\115\2\126\3\uffff\1\143\1\uffff\2\126\1\161\1\uffff\1\165\4\126\1\u0082\1\uffff\2\126\1\uffff\1\u0091\1\uffff\6\126\1\u00af\1\u00bc\2\126\1\u00c2\1\u00c6\1\u00c8\1\u00cb\1\uffff\1\u00ce\1\126\1\uffff\1\65\2\126\1\uffff\1\65\1\126\1\65\22\uffff\1\u00fa\1\u00fd\4\uffff\1\u0101\1\uffff\10\126\1\uffff\5\126\3\uffff\1\u0115\5\uffff\11\126\1\u0122\4\uffff\1\u0124\2\uffff\1\u012a\1\u012b\7\126\1\u0135\1\126\3\uffff\12\126\5\uffff\12\126\1\u0152\17\126\1\u016a\2\uffff\1\u016c\14\uffff\3\126\11\uffff\1\u017b\5\uffff\3\126\7\uffff\3\126\3\uffff\1\u00e0\42\uffff\10\126\1\u01a8\10\126\3\uffff\12\126\1\u01be\4\uffff\3\126\1\u01c3\1\126\2\uffff\6\126\1\u01cc\2\126\1\uffff\1\u01d0\5\126\1\u01d8\1\u01d9\1\126\1\u01db\1\u01dc\21\126\1\uffff\7\126\1\u01f9\1\126\1\u01fb\7\126\1\u0203\1\u0204\1\u0205\2\126\15\uffff\3\126\3\uffff\1\u020f\1\u0210\1\126\6\uffff\4\126\1\u018b\24\uffff\5\126\1\u0228\4\126\1\uffff\10\126\1\u0236\1\126\1\u0238\1\126\1\u023b\1\u023c\4\126\1\u0241\1\126\1\u0243\1\uffff\4\126\1\uffff\1\u024a\1\u024b\1\uffff\5\126\1\uffff\3\126\1\uffff\1\126\1\u0255\5\126\2\uffff\1\126\2\uffff\7\126\1\u0264\3\126\1\u0268\1\u0269\1\u026b\1\u026d\11\126\1\u0278\3\126\1\uffff\1\u027c\1\uffff\2\126\1\u0280\1\126\1\u0282\1\u0284\1\126\3\uffff\2\126\3\uffff\2\126\1\u028c\1\126\2\uffff\1\u028f\1\uffff\1\126\1\u0292\1\u0293\1\u0294\13\uffff\1\126\1\u029d\1\126\1\u029f\2\126\1\uffff\1\126\1\uffff\13\126\1\uffff\1\126\1\uffff\1\126\1\u02b0\2\uffff\2\126\1\u02b3\1\u02b4\1\uffff\1\u02b5\1\uffff\1\u02b7\1\126\1\u02b9\3\126\2\uffff\1\u02be\1\126\1\u02c0\3\126\1\u02c5\2\126\1\uffff\4\126\1\u02cc\4\126\1\u02d2\1\126\1\u02d4\1\126\1\u02d6\1\uffff\3\126\2\uffff\1\126\1\uffff\1\126\1\uffff\1\u02dc\2\126\1\u02df\6\126\1\uffff\2\126\1\u02e8\1\uffff\3\126\1\uffff\1\u02ec\1\uffff\1\126\1\uffff\3\126\2\uffff\1\u02f1\1\u02f2\1\uffff\1\126\2\uffff\1\u02f5\1\126\11\uffff\1\u02fc\1\126\1\uffff\1\u02fe\1\uffff\1\u02ff\1\u0300\1\u0301\1\u0302\7\126\1\uffff\2\126\1\u030c\1\126\1\uffff\1\u030f\1\126\3\uffff\1\126\1\uffff\1\126\1\uffff\3\126\2\uffff\1\126\1\uffff\4\126\1\uffff\1\u031b\1\u031c\2\126\1\u031f\1\126\1\uffff\2\126\1\u0323\1\u0324\1\126\1\uffff\1\126\1\uffff\1\126\1\uffff\1\126\1\u0329\3\126\1\uffff\1\u032d\1\126\1\uffff\1\126\1\u0330\4\126\1\u0335\1\126\1\uffff\1\126\1\u0338\1\u0339\1\uffff\2\126\1\u033c\1\u033d\2\uffff\1\126\2\uffff\1\126\6\uffff\1\126\5\uffff\1\126\1\u0347\1\126\1\u0349\3\126\1\u034d\1\126\1\uffff\2\126\1\uffff\3\126\1\u0354\1\126\1\u0356\1\u0357\2\126\1\u035a\1\u035b\2\uffff\1\126\1\u035d\1\uffff\1\u035e\1\126\1\u0360\2\uffff\1\126\1\u0362\1\126\1\u0364\1\uffff\3\126\1\uffff\1\u0368\1\u0369\1\uffff\1\126\1\u036b\1\u036c\1\u036d\1\uffff\2\126\2\uffff\2\126\2\uffff\2\126\5\uffff\1\126\1\u0376\1\uffff\1\u0377\1\uffff\3\126\1\uffff\3\126\1\u037e\1\126\1\u0380\1\uffff\1\u0381\2\uffff\2\126\2\uffff\1\126\2\uffff\1\u0385\1\uffff\1\u0386\1\uffff\1\u0387\1\uffff\1\u0388\1\u0389\1\126\2\uffff\1\u038b\3\uffff\3\126\1\u038f\1\u0390\1\u0391\1\uffff\1\126\2\uffff\1\u0394\1\u0395\1\u0396\1\126\1\u0398\1\126\1\uffff\1\126\2\uffff\1\u039b\1\u039c\1\u039d\5\uffff\1\u039e\1\uffff\1\u039f\1\126\1\u03a1\4\uffff\1\126\3\uffff\1\126\1\uffff\1\u03a5\1\126\5\uffff\1\u03a7\2\uffff\1\126\1\u03aa\1\uffff\1\126\2\uffff\1\u03ad\1\uffff\1\126\2\uffff\1\u03b1\3\uffff";
+    static final String DFA13_eofS =
+        "\u03b2\uffff";
+    static final String DFA13_minS =
+        "\1\0\1\106\1\55\1\72\2\60\3\uffff\1\41\1\uffff\2\60\1\55\1\uffff\1\72\4\60\1\72\1\uffff\1\60\1\146\1\uffff\1\52\1\uffff\6\60\1\46\1\54\2\60\1\53\1\52\2\75\1\uffff\1\75\1\60\1\uffff\1\144\2\60\1\uffff\1\0\1\60\1\0\3\uffff\1\146\1\156\1\141\1\145\1\141\1\157\1\156\1\uffff\1\143\1\uffff\1\147\1\uffff\1\146\1\uffff\1\165\1\55\1\74\3\uffff\1\75\1\76\1\uffff\10\60\1\uffff\5\60\3\uffff\1\75\5\uffff\11\60\1\76\4\uffff\1\75\2\uffff\2\43\7\60\1\43\1\60\3\uffff\7\60\1\164\1\151\1\156\5\uffff\12\60\1\43\17\60\1\75\2\uffff\1\75\1\73\2\uffff\1\73\1\156\1\uffff\1\156\1\162\4\uffff\3\60\11\uffff\1\74\5\uffff\3\60\1\uffff\1\165\1\150\1\uffff\1\145\2\uffff\3\60\1\uffff\2\0\1\47\7\uffff\1\151\3\uffff\1\147\1\uffff\1\143\1\144\1\155\1\151\1\uffff\1\141\1\uffff\1\141\1\165\2\uffff\1\141\11\uffff\10\60\1\43\10\60\3\uffff\12\60\1\43\4\uffff\3\60\1\43\1\60\2\uffff\6\60\1\43\2\60\1\uffff\1\43\5\60\2\43\1\60\2\43\1\141\1\156\1\151\16\60\1\uffff\7\60\1\43\1\60\1\43\7\60\3\43\2\60\13\uffff\1\144\1\43\3\60\3\uffff\2\43\1\60\1\154\5\uffff\4\60\1\0\2\uffff\1\143\2\uffff\1\151\1\150\2\uffff\1\72\5\uffff\1\164\2\uffff\1\141\1\162\5\60\1\43\4\60\1\uffff\10\60\1\43\1\60\1\43\1\60\2\43\4\60\1\43\1\60\1\43\1\uffff\4\60\1\uffff\2\43\1\uffff\5\60\1\uffff\3\60\1\uffff\1\60\1\43\5\60\2\uffff\1\60\2\uffff\1\162\1\141\1\164\4\60\1\43\3\60\4\43\11\60\1\43\3\60\1\uffff\1\43\1\uffff\2\60\1\43\1\60\2\43\1\60\3\uffff\2\60\1\43\2\uffff\2\60\1\43\1\60\2\uffff\1\43\1\154\1\60\3\43\1\uffff\1\145\1\uffff\1\157\4\uffff\1\145\1\162\1\144\1\60\1\43\1\60\1\43\2\60\1\uffff\1\60\1\uffff\13\60\1\uffff\1\60\1\uffff\1\60\1\43\2\uffff\2\60\2\43\1\uffff\1\43\1\uffff\1\43\1\60\1\43\3\60\2\uffff\1\43\1\60\1\43\3\60\1\43\2\60\1\uffff\4\60\1\43\2\60\1\164\1\154\1\43\1\60\1\43\1\60\1\43\1\uffff\3\60\2\uffff\1\60\1\uffff\1\60\1\uffff\1\43\2\60\1\43\6\60\1\uffff\2\60\1\43\1\uffff\3\60\1\uffff\1\43\1\uffff\1\60\1\uffff\3\60\2\uffff\2\43\1\uffff\1\60\2\uffff\1\74\1\60\5\uffff\1\156\1\155\1\144\1\72\1\43\1\60\1\uffff\1\43\1\uffff\4\43\7\60\1\uffff\2\60\1\43\1\60\1\uffff\1\43\1\60\3\uffff\1\60\1\uffff\1\60\1\uffff\3\60\2\uffff\1\60\1\uffff\4\60\1\uffff\2\43\2\60\1\43\1\60\1\uffff\2\60\2\43\1\141\1\uffff\1\60\1\uffff\1\60\1\uffff\1\60\1\43\3\60\1\uffff\1\43\1\60\1\uffff\1\60\1\43\4\60\1\43\1\60\1\uffff\1\60\2\43\1\uffff\2\60\2\43\2\uffff\1\60\2\uffff\1\60\1\72\1\141\1\72\3\uffff\1\60\5\uffff\1\60\1\43\1\60\1\43\3\60\1\43\1\60\1\uffff\2\60\1\uffff\3\60\1\43\1\60\2\43\2\60\2\43\2\uffff\1\60\1\43\1\uffff\1\43\1\60\1\43\2\uffff\1\154\1\43\1\60\1\43\1\uffff\3\60\1\uffff\2\43\1\uffff\1\60\3\43\1\uffff\2\60\2\uffff\2\60\2\uffff\2\60\2\uffff\1\143\2\uffff\1\60\1\43\1\uffff\1\43\1\uffff\3\60\1\uffff\3\60\1\43\1\60\1\43\1\uffff\1\43\2\uffff\2\60\2\uffff\1\60\2\uffff\1\43\1\uffff\1\43\1\uffff\1\43\1\uffff\2\43\1\60\2\uffff\1\43\3\uffff\3\60\3\43\1\150\1\60\2\uffff\3\43\1\60\1\43\1\60\1\uffff\1\60\2\uffff\3\43\5\uffff\1\43\1\uffff\1\43\1\60\1\43\3\uffff\1\151\1\60\3\uffff\1\60\1\uffff\1\43\1\60\5\uffff\1\43\1\uffff\1\156\1\60\1\43\1\uffff\1\60\1\uffff\1\145\1\43\1\uffff\1\60\1\72\1\uffff\1\43\3\uffff";
+    static final String DFA13_maxS =
+        "\1\uffff\1\170\1\75\1\76\2\172\3\uffff\1\76\1\uffff\2\172\1\76\1\uffff\1\75\4\172\1\72\1\uffff\1\172\1\163\1\uffff\1\75\1\uffff\6\172\1\75\1\u00a7\2\172\3\75\1\172\1\uffff\1\75\1\172\1\uffff\1\164\2\172\1\uffff\1\uffff\1\172\1\uffff\3\uffff\1\154\3\165\2\157\1\162\1\uffff\1\164\1\uffff\1\162\1\uffff\1\156\1\uffff\1\165\1\55\1\75\3\uffff\2\76\1\uffff\10\172\1\uffff\5\172\3\uffff\1\76\5\uffff\11\172\1\76\4\uffff\1\75\2\uffff\13\172\3\uffff\7\172\1\164\1\151\1\156\5\uffff\32\172\1\75\2\uffff\1\75\1\174\2\uffff\1\134\1\174\1\uffff\1\174\1\162\4\uffff\3\172\11\uffff\1\76\5\uffff\3\172\1\uffff\1\165\1\151\1\uffff\1\171\2\uffff\3\172\1\uffff\2\uffff\1\47\7\uffff\1\157\3\uffff\1\164\1\uffff\1\143\1\145\1\156\1\163\1\uffff\1\141\1\uffff\1\151\1\165\2\uffff\1\141\11\uffff\21\172\3\uffff\13\172\4\uffff\5\172\2\uffff\11\172\1\uffff\13\172\1\141\1\156\1\151\16\172\1\uffff\26\172\13\uffff\1\144\1\174\3\172\3\uffff\3\172\1\154\5\uffff\4\172\1\uffff\2\uffff\1\164\2\uffff\1\151\1\162\2\uffff\1\160\5\uffff\1\164\2\uffff\1\141\1\162\12\172\1\uffff\25\172\1\uffff\4\172\1\uffff\2\172\1\uffff\5\172\1\uffff\3\172\1\uffff\7\172\2\uffff\1\172\2\uffff\1\162\1\141\1\164\31\172\1\uffff\1\172\1\uffff\7\172\3\uffff\2\172\1\174\2\uffff\4\172\2\uffff\1\172\1\154\4\172\1\uffff\1\157\1\uffff\1\157\4\uffff\1\145\1\162\1\144\6\172\1\uffff\1\172\1\uffff\13\172\1\uffff\1\172\1\uffff\2\172\2\uffff\4\172\1\uffff\1\172\1\uffff\6\172\2\uffff\11\172\1\uffff\7\172\1\164\1\154\5\172\1\uffff\3\172\2\uffff\1\172\1\uffff\1\172\1\uffff\12\172\1\uffff\3\172\1\uffff\3\172\1\uffff\1\172\1\uffff\1\172\1\uffff\3\172\2\uffff\2\172\1\uffff\1\172\2\uffff\1\74\1\172\5\uffff\1\156\1\155\1\144\1\74\2\172\1\uffff\1\172\1\uffff\13\172\1\uffff\4\172\1\uffff\2\172\3\uffff\1\172\1\uffff\1\172\1\uffff\3\172\2\uffff\1\172\1\uffff\4\172\1\uffff\6\172\1\uffff\4\172\1\141\1\uffff\1\172\1\uffff\1\172\1\uffff\5\172\1\uffff\2\172\1\uffff\10\172\1\uffff\3\172\1\uffff\4\172\2\uffff\1\172\2\uffff\1\172\1\74\1\141\1\74\3\uffff\1\172\5\uffff\11\172\1\uffff\2\172\1\uffff\13\172\2\uffff\2\172\1\uffff\3\172\2\uffff\1\154\3\172\1\uffff\3\172\1\uffff\2\172\1\uffff\4\172\1\uffff\2\172\2\uffff\2\172\2\uffff\2\172\2\uffff\1\143\2\uffff\2\172\1\uffff\1\172\1\uffff\3\172\1\uffff\6\172\1\uffff\1\172\2\uffff\2\172\2\uffff\1\172\2\uffff\1\172\1\uffff\1\172\1\uffff\1\172\1\uffff\3\172\2\uffff\1\172\3\uffff\6\172\1\150\1\172\2\uffff\6\172\1\uffff\1\172\2\uffff\3\172\5\uffff\1\172\1\uffff\3\172\3\uffff\1\151\1\172\3\uffff\1\172\1\uffff\2\172\5\uffff\1\172\1\uffff\1\156\2\172\1\uffff\1\172\1\uffff\1\145\1\172\1\uffff\1\172\1\74\1\uffff\1\172\3\uffff";
+    static final String DFA13_acceptS =
+        "\6\uffff\1\10\1\12\1\13\1\uffff\1\15\3\uffff\1\21\6\uffff\1\55\2\uffff\1\125\1\uffff\1\127\16\uffff\1\u00be\2\uffff\1\u00d3\3\uffff\1\u0114\3\uffff\1\u011b\1\u011c\1\1\7\uffff\1\46\1\uffff\1\74\1\uffff\1\103\1\uffff\1\105\3\uffff\1\u00b7\1\4\1\5\2\uffff\1\31\10\uffff\1\u0116\5\uffff\1\10\1\12\1\13\1\uffff\1\u00c4\1\u00c5\1\u00d5\1\14\1\15\12\uffff\1\120\1\u00ae\1\20\1\21\1\uffff\1\u00ab\1\22\13\uffff\1\u00cf\1\54\1\55\12\uffff\1\125\1\u00af\1\u00c9\1\126\1\127\33\uffff\1\u00b4\1\u0085\2\uffff\1\u008d\1\u008f\2\uffff\1\u0092\2\uffff\1\u009a\1\u009b\1\u00b5\1\u00bf\3\uffff\1\u00ad\1\u00cc\1\u00c8\1\u00b0\1\u0119\1\u011a\1\u00ca\1\u00b1\1\u00cb\1\uffff\1\u0117\1\u00c0\1\u00be\1\u00c2\1\u00d1\3\uffff\1\u00d3\2\uffff\1\u00dc\1\uffff\1\u00df\1\u00e2\3\uffff\1\u0114\3\uffff\1\u0118\1\u011b\1\2\1\3\1\11\1\67\1\173\1\uffff\1\33\1\60\1\36\1\uffff\1\73\4\uffff\1\107\1\uffff\1\72\2\uffff\1\104\1\u0084\1\uffff\1\u00a0\1\u00d6\1\u00a1\1\u00ba\1\u00c6\1\u00b8\1\u00b9\1\u00bd\1\u00c7\21\uffff\1\u00a3\1\u00c3\1\u00c1\13\uffff\1\57\1\u00cd\1\u00ac\1\23\5\uffff\1\u0101\1\u00a4\11\uffff\1\30\34\uffff\1\u00a7\26\uffff\1\u00b2\1\u0089\1\u00b3\1\u008a\1\u008c\1\u008e\1\u0090\1\u0099\1\u0091\1\u0098\1\u0093\5\uffff\1\u00bb\1\u00bc\1\u00b6\4\uffff\1\u00db\1\u00dd\1\u00de\1\u00e0\1\u00e1\5\uffff\2\u0115\1\uffff\1\35\1\70\2\uffff\1\43\1\71\1\uffff\1\106\1\45\1\65\1\66\1\102\1\uffff\1\101\1\u0081\14\uffff\1\u00fd\25\uffff\1\u00a8\4\uffff\1\134\2\uffff\1\26\5\uffff\1\27\3\uffff\1\u0102\7\uffff\1\141\1\u00f2\1\uffff\1\u0112\1\u0113\34\uffff\1\u00fe\1\uffff\1\u00e3\7\uffff\1\170\1\171\1\u00a2\3\uffff\1\u0095\1\u0097\4\uffff\1\u00d4\1\u00d2\6\uffff\1\32\1\uffff\1\40\1\uffff\1\37\1\42\1\41\1\123\11\uffff\1\u0109\1\uffff\1\136\13\uffff\1\175\1\uffff\1\16\2\uffff\1\151\1\131\4\uffff\1\u00ff\1\uffff\1\u00ec\6\uffff\1\u0107\1\u0111\11\uffff\1\147\16\uffff\1\155\3\uffff\1\u00aa\1\u00d0\1\uffff\1\135\1\uffff\1\142\12\uffff\1\154\3\uffff\1\160\3\uffff\1\u0086\1\uffff\1\u00a9\1\uffff\1\u0106\3\uffff\1\u0094\1\u0096\2\uffff\1\u010d\1\uffff\1\u00d9\1\u00d7\2\uffff\1\u00ed\1\u00fc\1\u0100\1\34\1\44\6\uffff\1\100\1\uffff\1\111\13\uffff\1\u0087\4\uffff\1\24\2\uffff\1\17\1\113\1\143\1\uffff\1\61\1\uffff\1\62\3\uffff\1\53\1\u00e7\1\uffff\1\121\4\uffff\1\u0103\6\uffff\1\124\5\uffff\1\117\1\uffff\1\172\1\uffff\1\152\5\uffff\1\150\2\uffff\1\162\10\uffff\1\u0104\3\uffff\1\u009e\4\uffff\1\u009c\1\u00a6\1\uffff\1\u00da\1\u00d8\4\uffff\1\u0082\1\u0088\1\6\1\uffff\1\164\1\156\1\161\1\110\1\176\11\uffff\1\u00e4\2\uffff\1\u009d\13\uffff\1\63\1\64\2\uffff\1\u010c\3\uffff\1\112\1\114\4\uffff\1\163\3\uffff\1\144\2\uffff\1\145\4\uffff\1\174\2\uffff\1\u010f\1\u00a5\2\uffff\1\u00f9\1\u00fa\2\uffff\1\75\1\76\1\uffff\1\u0083\1\u008b\2\uffff\1\u010b\1\uffff\1\7\3\uffff\1\u00e5\6\uffff\1\132\1\uffff\1\u00f0\1\51\2\uffff\1\u00f8\1\u00f5\1\uffff\1\u010a\1\122\1\uffff\1\u00fb\1\uffff\1\130\1\uffff\1\177\3\uffff\1\146\1\u00f4\1\uffff\1\u0108\1\u010e\1\153\10\uffff\1\u00ef\1\u0110\6\uffff\1\u00f1\1\uffff\1\50\1\157\3\uffff\1\137\1\116\1\u0105\1\u009f\1\133\1\uffff\1\u00ee\3\uffff\1\166\1\u00ce\1\u00e9\2\uffff\1\56\1\u00e6\1\u00e8\1\uffff\1\167\2\uffff\1\u00f3\1\u00f6\1\165\1\140\1\u00f7\1\uffff\1\u00eb\3\uffff\1\u0080\1\uffff\1\u00ea\2\uffff\1\115\2\uffff\1\52\1\uffff\1\47\1\77\1\25";
+    static final String DFA13_specialS =
+        "\1\1\60\uffff\1\2\1\uffff\1\5\u00a9\uffff\1\4\1\0\u00aa\uffff\1\3\u0228\uffff}>";
+    static final String[] DFA13_transitionS = {
+            "\11\65\2\64\2\65\1\64\22\65\1\64\1\52\1\63\1\27\1\55\1\47\1\41\1\61\1\24\1\25\1\31\1\45\1\6\1\15\1\16\1\46\12\60\1\17\1\12\1\2\1\11\1\3\1\51\1\1\32\62\1\30\1\65\1\32\1\50\1\62\1\65\1\22\1\36\1\33\1\35\1\37\1\14\1\43\1\62\1\20\1\56\1\62\1\57\1\21\1\53\1\23\1\5\1\62\1\26\1\4\1\13\1\34\1\40\1\44\3\62\1\7\1\42\1\10\1\54\uff81\65",
+            "\1\66\33\uffff\1\76\1\74\1\104\1\103\1\102\1\105\1\uffff\1\75\2\uffff\1\100\1\73\1\uffff\1\70\1\71\1\uffff\1\72\1\77\1\101\3\uffff\1\67",
+            "\1\106\16\uffff\1\110\1\107",
+            "\1\112\2\uffff\1\114\1\113",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\124\1\125\1\122\2\125\1\121\1\120\12\125\1\117\1\123\3\125\1\116\1\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\127\15\125\1\132\2\125\1\130\1\131\1\125\1\133\5\125",
+            "",
+            "",
+            "",
+            "\1\140\15\uffff\1\141\15\uffff\1\137\1\142",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\151\1\125\1\150\1\125\1\146\10\125\1\145\6\125\1\147\1\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\152\7\125\1\153\2\125\1\154\2\125\1\155\13\125",
+            "\1\156\17\uffff\1\160\1\157",
+            "",
+            "\1\163\2\uffff\1\164",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\5\125\1\167\7\125\1\166\3\125\1\170\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\172\3\125\1\174\11\125\1\171\5\125\1\173\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\125\1\176\13\125\1\175\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\177\2\125\1\u0080\5\125",
+            "\1\u0081",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0086\2\125\1\u0087\1\u0084\11\125\1\u0085\4\125\1\u008a\1\u0089\1\u0088\4\125",
+            "\1\u008c\2\uffff\1\u008d\11\uffff\1\u008b",
+            "",
+            "\1\u0090\22\uffff\1\u008f",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0096\6\125\1\u0095\3\125\1\u0094\2\125\1\u0093\4\125\1\u0097\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u009b\1\125\1\u009a\2\125\1\u0098\4\125\1\u009c\3\125\1\u0099\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u009f\2\125\1\u009e\1\u00a0\5\125\1\u009d\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u00a4\15\125\1\u00a1\2\125\1\u00a3\2\125\1\u00a2\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u00a6\1\125\1\u00a5\7\125\1\u00a7\1\125\1\u00a8\2\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u00aa\3\125\1\u00ac\3\125\1\u00ab\5\125\1\u00a9\13\125",
+            "\1\u00ad\26\uffff\1\u00ae",
+            "\1\u00b6\1\uffff\1\u00b3\1\u00b4\13\uffff\1\u00b1\1\uffff\1\u00bb\43\uffff\1\u00b7\4\uffff\1\u00b9\2\uffff\1\u00b5\1\u00ba\4\uffff\1\u00b8\14\uffff\1\u00b0\52\uffff\1\u00b2",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u00bd\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u00bf\6\125\1\u00be\22\125",
+            "\1\u00c1\21\uffff\1\u00c0",
+            "\1\u00c4\4\uffff\1\u00c5\15\uffff\1\u00c3",
+            "\1\u00c7",
+            "\1\u00c9\3\uffff\32\u00ca\4\uffff\1\u00ca\1\uffff\32\u00ca",
+            "",
+            "\1\u00cd",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u00cf\11\125\1\u00d0\5\125\1\u00d1\5\125",
+            "",
+            "\1\u00d5\1\u00d8\10\uffff\1\u00d3\1\uffff\1\u00d7\2\uffff\1\u00d6\1\u00d4",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u00da\5\125\1\u00d9\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u00db\21\125",
+            "",
+            "\47\u00de\1\u00df\64\u00de\1\u00dd\uffa3\u00de",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\0\u00e0",
+            "",
+            "",
+            "",
+            "\1\u00e3\5\uffff\1\u00e2",
+            "\1\u00e6\1\uffff\1\u00e4\4\uffff\1\u00e5",
+            "\1\u00e9\20\uffff\1\u00e7\2\uffff\1\u00e8",
+            "\1\u00eb\11\uffff\1\u00ea\5\uffff\1\u00ec",
+            "\1\u00ed\15\uffff\1\u00ee",
+            "\1\u00ef",
+            "\1\u00f0\3\uffff\1\u00f1",
+            "",
+            "\1\u00f3\20\uffff\1\u00f2",
+            "",
+            "\1\u00f5\12\uffff\1\u00f4",
+            "",
+            "\1\u00f7\7\uffff\1\u00f6",
+            "",
+            "\1\u00f8",
+            "\1\u00f9",
+            "\1\u00fc\1\u00fb",
+            "",
+            "",
+            "",
+            "\1\u00fe\1\u00ff",
+            "\1\u0100",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u0102\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0103\15\125\1\u0105\2\125\1\u0104\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\6\125\1\u0108\5\125\1\u0106\14\125\1\u0107",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0109\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u010a\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u010b\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\7\125\1\u010c\22\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u010d\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u010f\5\125\1\u010e\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0110\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0111\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\125\1\u0112\30\125",
+            "",
+            "",
+            "",
+            "\1\u0114\1\u0113",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0117\23\125\1\u0116\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\14\125\1\u0118\15\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\17\125\1\u0119\12\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u011a\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u011b\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u011c\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\5\125\1\u011e\7\125\1\u011d\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u011f\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0120\10\125",
+            "\1\u0121",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0123",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0129\5\125\1\u0127\1\u0125\2\125\1\u0126\1\u0128\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u012c\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u012d\1\u012e\26\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u012f\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0130\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u0131\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u0132\24\125\1\u0133\1\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u0134\13\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0136\6\125",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0138\4\125\1\u0139\14\125\1\u013a\1\u0137\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u013b\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u013c\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\25\125\1\u013d\4\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u013e\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u013f\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u0140\27\125",
+            "\1\u0141",
+            "\1\u0142",
+            "\1\u0143",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0144\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u0145\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0146\3\125\1\u0148\11\125\1\u0147\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0149\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u014a\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u014b\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u014c\3\125\1\u014d\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u014e\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u014f\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0150\21\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u0151\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0153\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u0154\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u0155\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u0156\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\5\125\1\u0157\24\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0159\11\125\1\u0158\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\6\125\1\u015a\23\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u015e\22\125\1\u015d\1\u015b\1\u015c\4\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u015f\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0160\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0161\3\125\1\u0162\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0163\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0165\5\125\1\u0164\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0166\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u0168\16\125\1\u0167\10\125",
+            "\1\u0169",
+            "",
+            "",
+            "\1\u016b",
+            "\1\u016e\100\uffff\1\u016d",
+            "",
+            "",
+            "\1\u016f\40\uffff\1\u0170",
+            "\1\u0172\15\uffff\1\u0171",
+            "",
+            "\1\u0174\15\uffff\1\u0173",
+            "\1\u0175",
+            "",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0176\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0177\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0178\21\125",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0179\1\uffff\1\u017a",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\26\125\1\u017c\3\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u017d\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u017e\16\125",
+            "",
+            "\1\u017f",
+            "\1\u0181\1\u0180",
+            "",
+            "\1\u0182\17\uffff\1\u0183\3\uffff\1\u0184",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0185\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0186\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\5\125\1\u0188\14\125\1\u0187\7\125",
+            "",
+            "\47\u00e0\1\u0189\uffd8\u00e0",
+            "\47\u00e0\1\u018a\uffd8\u00e0",
+            "\1\u018b",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u018d\5\uffff\1\u018c",
+            "",
+            "",
+            "",
+            "\1\u018f\14\uffff\1\u018e",
+            "",
+            "\1\u0190",
+            "\1\u0191\1\u0192",
+            "\1\u0193\1\u0194",
+            "\1\u0198\5\uffff\1\u0197\1\u0196\2\uffff\1\u0195",
+            "",
+            "\1\u0199",
+            "",
+            "\1\u019a\7\uffff\1\u019b",
+            "\1\u019c",
+            "",
+            "",
+            "\1\u019d",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u019e\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u01a0\1\125\1\u019f\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u01a1\13\125\1\u01a2\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\17\125\1\u01a3\12\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\17\125\1\u01a4\12\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u01a5\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u01a6\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u01a7\7\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\17\125\1\u01a9\12\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u01aa\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\12\125\1\u01ab\17\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u01ac\20\125\1\u01ad\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u01ae\6\125\1\u01af\4\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u01b0\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u01b1\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u01b2\16\125",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u01b3\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u01b4\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u01b5\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u01b6\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u01b7\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\14\125\1\u01b8\15\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u01b9\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u01ba\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u01bb\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u01bc\31\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\12\125\1\u01bd\17\125",
+            "",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u01bf\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u01c0\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u01c1\5\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u01c2\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u01c4\6\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u01c5\14\125",
+            "\12\125\1\u01c6\6\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u01c7\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\7\125\1\u01c8\11\125\1\u01c9\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u01ca\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u01cb\7\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u01cd\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u01ce\10\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\17\125\1\u01cf\12\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u01d1\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u01d2\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u01d3\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u01d4\1\u01d5\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u01d6\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u01d7\21\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u01da\27\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\u01dd",
+            "\1\u01de",
+            "\1\u01df",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u01e0\4\125\1\u01e1\1\u01e2\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u01e3\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u01e5\3\125\1\u01e4\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u01e6\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u01e7\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u01e8\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u01e9\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u01ea\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u01eb\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u01ec\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u01ed\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u01ee\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u01f0\13\125\1\u01ef\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\125\1\u01f1\30\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u01f2\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u01f3\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u01f4\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u01f5\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\5\125\1\u01f6\24\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u01f7\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u01f8\31\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\14\125\1\u01fa\15\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u01fc\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\125\1\u01fd\30\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u01fe\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u01ff\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u0200\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0201\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0202\31\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0206\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0207\6\125",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0208",
+            "\1\u020a\130\uffff\1\u0209",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u020b\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u020c\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u020d\6\125",
+            "",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\5\125\1\u020e\24\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0211\16\125",
+            "\1\u0212",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u0213\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0214\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0215\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u0216\13\125",
+            "\0\u00e0",
+            "",
+            "",
+            "\1\u0219\14\uffff\1\u0217\3\uffff\1\u0218",
+            "",
+            "",
+            "\1\u021a",
+            "\1\u021c\11\uffff\1\u021b",
+            "",
+            "",
+            "\1\u021e\65\uffff\1\u021d",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u021f",
+            "",
+            "",
+            "\1\u0220",
+            "\1\u0221",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0222\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0223\3\125\1\u0224\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0225\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0226\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u0227\27\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0229\16\125",
+            "\12\125\1\u022a\6\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u022b\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u022c\6\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u022d\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u022e\26\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u022f\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0230\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0231\11\125\1\u0232\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0233\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0234\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u0235\26\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0237\21\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u0239\7\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u023a\26\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u023d\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u023e\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u023f\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0240\16\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0242\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0244\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0245\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0246\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\6\125\1\u0247\12\125\1\u0248\10\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0249\21\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u024c\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u024d\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u024e\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u024f\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0250\31\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0251\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0252\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u0253\5\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0254\10\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0256\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0257\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\14\125\1\u0258\15\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u025a\3\125\1\u0259\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u025b\13\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u025c\6\125",
+            "",
+            "",
+            "\1\u025d",
+            "\1\u025e",
+            "\1\u025f",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0260\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0261\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0262\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\12\125\1\u0263\17\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0265\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u0266\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\12\125\1\u0267\17\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u026a\25\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u026c\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u026e\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u026f\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\125\1\u0270\30\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0271\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0272\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0273\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0274\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0275\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\125\1\u0276\30\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0277\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0279\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u027a\26\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\12\125\1\u027b\17\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\30\125\1\u027d\1\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u027e\16\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u027f\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0281\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\17\125\1\u0283\12\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0285\6\125",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0286\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u0287\13\125",
+            "\1\u0289\130\uffff\1\u0288",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u028a\26\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u028b\25\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u028d\10\125",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\2\uffff\1\u028e\4\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\u0290",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0291\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\u0295\11\uffff\1\u0296",
+            "",
+            "\1\u0297",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0298",
+            "\1\u0299",
+            "\1\u029a",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\14\125\1\u029b\15\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\14\125\1\u029c\15\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u029e\27\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\6\125\1\u02a0\23\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u02a1\6\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u02a2\25\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u02a3\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u02a4\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u02a5\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u02a6\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\6\125\1\u02a7\23\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u02a8\26\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u02a9\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u02aa\6\125",
+            "\12\125\1\u02ab\6\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u02ac\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u02ad\13\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u02ae\27\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u02af\21\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u02b1\26\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u02b2\14\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\u02b6\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u02b8\14\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u02ba\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\25\125\1\u02bb\4\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u02bc\31\125",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\1\u02bd\6\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u02bf\14\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\u02c1\1\uffff\2\125\1\u02c2\27\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\6\125\1\u02c3\23\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u02c4\7\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u02c6\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u02c7\14\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u02c8\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u02c9\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u02ca\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u02cb\14\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u02cd\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u02ce\13\125",
+            "\1\u02cf",
+            "\1\u02d0",
+            "\1\126\14\uffff\12\126\7\uffff\32\126\4\uffff\1\126\1\uffff\10\126\1\u02d1\21\126",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u02d3\27\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u02d5\14\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u02d7\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u02d8\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u02d9\7\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\6\125\1\u02da\23\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u02db\13\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u02dd\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u02de\16\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u02e0\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u02e1\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u02e2\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u02e3\13\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u02e4\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u02e5\31\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u02e6\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u02e7\27\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\17\125\1\u02e9\12\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u02ea\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\5\125\1\u02eb\24\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u02ed\13\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u02ee\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\27\125\1\u02ef\2\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u02f0\10\125",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u02f3\25\125",
+            "",
+            "",
+            "\1\u02f4",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u02f6\21\125",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u02f7",
+            "\1\u02f8",
+            "\1\u02f9",
+            "\1\u02fa\1\uffff\1\u02fb",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u02fd\31\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0303\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u0304\26\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0305\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0306\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u0307\5\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0308\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\30\125\1\u0309\1\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u030a\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u030b\7\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u030d\16\125\1\u030e\6\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0310\31\125",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0311\25\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u0312\27\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0313\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0314\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0315\16\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0316\25\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0317\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0318\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0319\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u031a\6\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u031d\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u031e\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0320\25\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0321\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0322\10\125",
+            "\1\126\14\uffff\12\126\7\uffff\32\126\4\uffff\1\126\1\uffff\32\126",
+            "\1\126\14\uffff\12\126\7\uffff\32\126\4\uffff\1\126\1\uffff\32\126",
+            "\1\u0325",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0326\6\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\24\125\1\u0327\5\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0328\16\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u032a\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u032b\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u032c\14\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u032e\25\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u032f\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0331\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\30\125\1\u0332\1\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0333\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0334\14\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0336\31\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u0337\13\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u033a\21\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u033b\16\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u033e\7\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u033f\13\125",
+            "\1\u0340\1\uffff\1\u0341",
+            "\1\u0342",
+            "\1\u0343\1\uffff\1\u0344",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u0345\27\125",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\30\125\1\u0346\1\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0348\25\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u034a\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u034b\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\17\125\1\u034c\12\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u034e\6\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u034f\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0350\21\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0351\16\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0352\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0353\25\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u0355\16\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u0358\26\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u0359\7\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\2\125\1\u035c\27\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u035f\16\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "",
+            "\1\u0361",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0363\25\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0365\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\21\125\1\u0366\10\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u0367\31\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\30\125\1\u036a\1\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\22\125\1\u036e\7\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u036f\21\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0370\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0371\25\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\7\125\1\u0372\22\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0373\14\125",
+            "",
+            "",
+            "\1\u0374",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\7\125\1\u0375\22\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0378\25\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u0379\26\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u037a\25\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u037b\31\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u037c\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\16\125\1\u037d\13\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\u037f\31\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\25\125\1\u0382\4\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0383\6\125",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u0384\25\125",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\126\14\uffff\12\126\7\uffff\32\126\4\uffff\1\126\1\uffff\32\126",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u038a\16\125",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u038c\6\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u038d\14\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u038e\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\u0392",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\10\125\1\u0393\21\125",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u0397\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u0399\14\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\1\125\1\u039a\30\125",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\23\125\1\u03a0\6\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "",
+            "",
+            "\1\u03a2",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\15\125\1\u03a3\14\125",
+            "",
+            "",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u03a4\25\125",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\13\125\1\u03a6\16\125",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\1\u03a8",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u03a9\25\125",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\4\125\1\u03ab\25\125",
+            "",
+            "\1\u03ac",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\3\125\1\u03ae\26\125",
+            "\1\u03af\1\uffff\1\u03b0",
+            "",
+            "\1\126\14\uffff\12\125\7\uffff\32\125\4\uffff\1\125\1\uffff\32\125",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] DFA13_eot = DFA.unpackEncodedString(DFA13_eotS);
+    static final short[] DFA13_eof = DFA.unpackEncodedString(DFA13_eofS);
+    static final char[] DFA13_min = DFA.unpackEncodedStringToUnsignedChars(DFA13_minS);
+    static final char[] DFA13_max = DFA.unpackEncodedStringToUnsignedChars(DFA13_maxS);
+    static final short[] DFA13_accept = DFA.unpackEncodedString(DFA13_acceptS);
+    static final short[] DFA13_special = DFA.unpackEncodedString(DFA13_specialS);
+    static final short[][] DFA13_transition;
+
+    static {
+        int numStates = DFA13_transitionS.length;
+        DFA13_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA13_transition[i] = DFA.unpackEncodedString(DFA13_transitionS[i]);
+        }
+    }
+
+    static class DFA13 extends DFA {
+
+        public DFA13(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 13;
+            this.eot = DFA13_eot;
+            this.eof = DFA13_eof;
+            this.min = DFA13_min;
+            this.max = DFA13_max;
+            this.accept = DFA13_accept;
+            this.special = DFA13_special;
+            this.transition = DFA13_transition;
+        }
+        public String getDescription() {
+            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | T__180 | T__181 | T__182 | T__183 | T__184 | T__185 | T__186 | T__187 | T__188 | T__189 | T__190 | T__191 | T__192 | T__193 | T__194 | T__195 | T__196 | T__197 | T__198 | T__199 | T__200 | T__201 | T__202 | T__203 | T__204 | T__205 | T__206 | T__207 | T__208 | T__209 | T__210 | T__211 | T__212 | T__213 | T__214 | T__215 | T__216 | T__217 | T__218 | T__219 | T__220 | T__221 | T__222 | T__223 | T__224 | T__225 | T__226 | T__227 | T__228 | T__229 | T__230 | T__231 | T__232 | T__233 | T__234 | T__235 | T__236 | T__237 | T__238 | T__239 | T__240 | T__241 | T__242 | T__243 | T__244 | T__245 | T__246 | T__247 | T__248 | T__249 | T__250 | T__251 | T__252 | T__253 | T__254 | T__255 | T__256 | T__257 | T__258 | T__259 | T__260 | T__261 | T__262 | T__263 | T__264 | T__265 | T__266 | T__267 | T__268 | T__269 | T__270 | T__271 | T__272 | T__273 | T__274 | T__275 | T__276 | T__277 | T__278 | T__279 | T__280 | T__281 | T__282 | T__283 | T__284 | T__285 | T__286 | T__287 | RULE_INT | RULE_CHARACTER | RULE_XLIA_ID | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            IntStream input = _input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA13_222 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_222=='\'') ) {s = 394;}
+
+                        else if ( ((LA13_222>='\u0000' && LA13_222<='&')||(LA13_222>='(' && LA13_222<='\uFFFF')) ) {s = 224;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA13_0 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_0=='@') ) {s = 1;}
+
+                        else if ( (LA13_0=='<') ) {s = 2;}
+
+                        else if ( (LA13_0=='>') ) {s = 3;}
+
+                        else if ( (LA13_0=='s') ) {s = 4;}
+
+                        else if ( (LA13_0=='p') ) {s = 5;}
+
+                        else if ( (LA13_0==',') ) {s = 6;}
+
+                        else if ( (LA13_0=='{') ) {s = 7;}
+
+                        else if ( (LA13_0=='}') ) {s = 8;}
+
+                        else if ( (LA13_0=='=') ) {s = 9;}
+
+                        else if ( (LA13_0==';') ) {s = 10;}
+
+                        else if ( (LA13_0=='t') ) {s = 11;}
+
+                        else if ( (LA13_0=='f') ) {s = 12;}
+
+                        else if ( (LA13_0=='-') ) {s = 13;}
+
+                        else if ( (LA13_0=='.') ) {s = 14;}
+
+                        else if ( (LA13_0==':') ) {s = 15;}
+
+                        else if ( (LA13_0=='i') ) {s = 16;}
+
+                        else if ( (LA13_0=='m') ) {s = 17;}
+
+                        else if ( (LA13_0=='a') ) {s = 18;}
+
+                        else if ( (LA13_0=='o') ) {s = 19;}
+
+                        else if ( (LA13_0=='(') ) {s = 20;}
+
+                        else if ( (LA13_0==')') ) {s = 21;}
+
+                        else if ( (LA13_0=='r') ) {s = 22;}
+
+                        else if ( (LA13_0=='#') ) {s = 23;}
+
+                        else if ( (LA13_0=='[') ) {s = 24;}
+
+                        else if ( (LA13_0=='*') ) {s = 25;}
+
+                        else if ( (LA13_0==']') ) {s = 26;}
+
+                        else if ( (LA13_0=='c') ) {s = 27;}
+
+                        else if ( (LA13_0=='u') ) {s = 28;}
+
+                        else if ( (LA13_0=='d') ) {s = 29;}
+
+                        else if ( (LA13_0=='b') ) {s = 30;}
+
+                        else if ( (LA13_0=='e') ) {s = 31;}
+
+                        else if ( (LA13_0=='v') ) {s = 32;}
+
+                        else if ( (LA13_0=='&') ) {s = 33;}
+
+                        else if ( (LA13_0=='|') ) {s = 34;}
+
+                        else if ( (LA13_0=='g') ) {s = 35;}
+
+                        else if ( (LA13_0=='w') ) {s = 36;}
+
+                        else if ( (LA13_0=='+') ) {s = 37;}
+
+                        else if ( (LA13_0=='/') ) {s = 38;}
+
+                        else if ( (LA13_0=='%') ) {s = 39;}
+
+                        else if ( (LA13_0=='^') ) {s = 40;}
+
+                        else if ( (LA13_0=='?') ) {s = 41;}
+
+                        else if ( (LA13_0=='!') ) {s = 42;}
+
+                        else if ( (LA13_0=='n') ) {s = 43;}
+
+                        else if ( (LA13_0=='~') ) {s = 44;}
+
+                        else if ( (LA13_0=='$') ) {s = 45;}
+
+                        else if ( (LA13_0=='j') ) {s = 46;}
+
+                        else if ( (LA13_0=='l') ) {s = 47;}
+
+                        else if ( ((LA13_0>='0' && LA13_0<='9')) ) {s = 48;}
+
+                        else if ( (LA13_0=='\'') ) {s = 49;}
+
+                        else if ( ((LA13_0>='A' && LA13_0<='Z')||LA13_0=='_'||LA13_0=='h'||LA13_0=='k'||LA13_0=='q'||(LA13_0>='x' && LA13_0<='z')) ) {s = 50;}
+
+                        else if ( (LA13_0=='\"') ) {s = 51;}
+
+                        else if ( ((LA13_0>='\t' && LA13_0<='\n')||LA13_0=='\r'||LA13_0==' ') ) {s = 52;}
+
+                        else if ( ((LA13_0>='\u0000' && LA13_0<='\b')||(LA13_0>='\u000B' && LA13_0<='\f')||(LA13_0>='\u000E' && LA13_0<='\u001F')||LA13_0=='\\'||LA13_0=='`'||(LA13_0>='\u007F' && LA13_0<='\uFFFF')) ) {s = 53;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA13_49 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_49=='\\') ) {s = 221;}
+
+                        else if ( ((LA13_49>='\u0000' && LA13_49<='&')||(LA13_49>='(' && LA13_49<='[')||(LA13_49>=']' && LA13_49<='\uFFFF')) ) {s = 222;}
+
+                        else if ( (LA13_49=='\'') ) {s = 223;}
+
+                        else s = 53;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA13_393 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA13_393>='\u0000' && LA13_393<='\uFFFF')) ) {s = 224;}
+
+                        else s = 395;
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA13_221 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA13_221=='\'') ) {s = 393;}
+
+                        else if ( ((LA13_221>='\u0000' && LA13_221<='&')||(LA13_221>='(' && LA13_221<='\uFFFF')) ) {s = 224;}
+
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA13_51 = input.LA(1);
+
+                        s = -1;
+                        if ( ((LA13_51>='\u0000' && LA13_51<='\uFFFF')) ) {s = 224;}
+
+                        else s = 53;
+
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 13, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+}
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalMLParser.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalMLParser.java
new file mode 100644
index 0000000..bc7c40c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/parser/antlr/internal/InternalFormalMLParser.java
@@ -0,0 +1,98304 @@
+package org.eclipse.efm.formalml.xtext.parser.antlr.internal;
+
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.common.util.Enumerator;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.IUnorderedGroupHelper.UnorderedGroupState;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+@SuppressWarnings("all")
+public class InternalFormalMLParser extends AbstractInternalAntlrParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_XLIA_ID", "RULE_INT", "RULE_CHARACTER", "RULE_STRING", "RULE_ID", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'@FormalML'", "'@xlia'", "'@xfsp'", "'<'", "'>:'", "'system'", "'package'", "','", "'@option'", "'{'", "'}'", "'='", "';'", "'true'", "'false'", "'-'", "'.'", "':'", "'::'", "'timed'", "'input_enabled'", "'moc:'", "'and'", "'or'", "'>'", "'@property:'", "'@public:'", "'@protected:'", "'@private:'", "'@routine:'", "'@macro:'", "'@procedure:'", "'@composite:'", "'@machine:'", "'@model:'", "'@prototype:'", "'@instance:'", "'@behavior:'", "'@statemachine:'", "'instance'", "'machine'", "'statemachine'", "'model:'", "'('", "')'", "'procedure'", "'-->'", "'@parameter:'", "'input'", "'inout'", "'output'", "'return'", "'@input:'", "'@inout:'", "'@output:'", "'@return:'", "'@moe:'", "'@schedule'", "'@run'", "'@local:'", "'@region:'", "'@region<'", "'@statemachine<'", "'state'", "'@transition:'", "'@init'", "'@final'", "'@enable'", "'@disable'", "'@concurrency'", "'@irun'", "'simple'", "'start'", "'#start'", "'final'", "'#final'", "'pseudostate'", "'#initial'", "'#init'", "'->'", "'macro'", "'routine'", "'@com:'", "'route'", "'['", "'*'", "']'", "'connect'", "'type'", "'integer'", "'uinteger'", "'int'", "'uint'", "'size:'", "'rational'", "'urational'", "'rat'", "'urat'", "'float'", "'ufloat'", "'double'", "'udouble'", "'real'", "'ureal'", "'time'", "'clock'", "'boolean'", "'bool'", "'char'", "'string'", "'interval'", "'enum'", "'struct'", "'union'", "'choice'", "'static'", "'reference'", "'volatile'", "'transient'", "'var'", "'val'", "'const'", "'@on_write'", "'buffer'", "'port'", "'signal'", "'channel'", "'transition'", "'@trigger:'", "'@guard:'", "'@tguard:'", "'@effect:'", "'&'", "'else'", "'prior:'", "'@guard<'", "'&&'", "'||'", "'@tguard<'", "'|;|'", "'|\\u00A7|'", "'|;;|'", "'|.|'", "'|/;|'", "'|i|'", "'|,|'", "'|a|'", "'|and|'", "'|or|'", "'|and#then|'", "'|or#else|'", "'|indet|'", "'|/\\\\|'", "'|fork|'", "'|join|'", "'guard'", "'tguard'", "'event'", "'checksat'", "'<--'", "'<=='", "'via'", "'==>'", "'if'", "'elseif'", "'while'", "'do'", "'for'", "'exec'", "'call'", "':='", "'::='", "'+='", "'-='", "'*='", "'/='", "'%='", "'&&='", "'||='", "'&='", "'|='", "'^='", "'<<='", "'>>='", "'>>>='", "'<=<'", "'^=<'", "'^=>'", "'>=>'", "'?'", "'|'", "'^'", "'=='", "'!='", "'==='", "'=!='", "'=/='", "'<='", "'>='", "'+'", "'**'", "'/'", "'%'", "'++'", "'--'", "'newfresh'", "'(:'", "'ctor'", "'!'", "'not'", "'~'", "'new'", "'=>'", "'<-'", "'null'", "'$null'", "'null<'", "'$null<'", "'$time'", "'$delta'", "'$this'", "'$self'", "'$parent'", "'$super'", "'$system'", "'$env'", "'env'", "'public'", "'private'", "'protected'", "'model'", "'prototype'", "'junction'", "'entryPoint'", "'exitPoint'", "'fork'", "'join'", "'dhistory'", "'shistory'", "'initial'", "'terminal'", "'rdv'", "'multi_rdv'", "'unicast'", "'anycast'", "'multicast'", "'broadcast'", "'message'", "'vertex'", "'vector'", "'rvector'", "'list'", "'set'", "'bag'", "'fifo'", "'lifo'", "'in'", "'out'", "'abort'", "'break'", "'continue'", "'exit'", "'init'", "'destroy'", "'stop'", "'restart'", "'suspend'", "'resume'", "'wait'", "'disable'", "'enable'", "'schedule'", "'irun'", "'run'", "'rtc'"
+    };
+    public static final int T__144=144;
+    public static final int T__265=265;
+    public static final int T__143=143;
+    public static final int T__264=264;
+    public static final int T__146=146;
+    public static final int T__267=267;
+    public static final int T__50=50;
+    public static final int T__145=145;
+    public static final int T__266=266;
+    public static final int T__140=140;
+    public static final int T__261=261;
+    public static final int T__260=260;
+    public static final int T__142=142;
+    public static final int T__263=263;
+    public static final int T__141=141;
+    public static final int T__262=262;
+    public static final int RULE_CHARACTER=6;
+    public static final int T__59=59;
+    public static final int T__55=55;
+    public static final int T__56=56;
+    public static final int T__57=57;
+    public static final int T__58=58;
+    public static final int T__51=51;
+    public static final int T__137=137;
+    public static final int T__258=258;
+    public static final int T__52=52;
+    public static final int T__136=136;
+    public static final int T__257=257;
+    public static final int T__53=53;
+    public static final int T__139=139;
+    public static final int T__54=54;
+    public static final int T__138=138;
+    public static final int T__259=259;
+    public static final int T__133=133;
+    public static final int T__254=254;
+    public static final int T__132=132;
+    public static final int T__253=253;
+    public static final int T__60=60;
+    public static final int T__135=135;
+    public static final int T__256=256;
+    public static final int T__61=61;
+    public static final int T__134=134;
+    public static final int T__255=255;
+    public static final int T__250=250;
+    public static final int RULE_ID=8;
+    public static final int T__131=131;
+    public static final int T__252=252;
+    public static final int T__130=130;
+    public static final int T__251=251;
+    public static final int RULE_INT=5;
+    public static final int T__66=66;
+    public static final int T__67=67;
+    public static final int T__129=129;
+    public static final int T__68=68;
+    public static final int T__69=69;
+    public static final int T__62=62;
+    public static final int T__126=126;
+    public static final int T__247=247;
+    public static final int T__63=63;
+    public static final int T__125=125;
+    public static final int T__246=246;
+    public static final int T__64=64;
+    public static final int T__128=128;
+    public static final int T__249=249;
+    public static final int T__65=65;
+    public static final int T__127=127;
+    public static final int T__248=248;
+    public static final int T__166=166;
+    public static final int T__287=287;
+    public static final int T__165=165;
+    public static final int T__286=286;
+    public static final int T__168=168;
+    public static final int T__167=167;
+    public static final int T__162=162;
+    public static final int T__283=283;
+    public static final int T__161=161;
+    public static final int T__282=282;
+    public static final int T__164=164;
+    public static final int T__285=285;
+    public static final int T__163=163;
+    public static final int T__284=284;
+    public static final int T__160=160;
+    public static final int T__281=281;
+    public static final int T__280=280;
+    public static final int T__37=37;
+    public static final int T__38=38;
+    public static final int T__39=39;
+    public static final int T__33=33;
+    public static final int T__34=34;
+    public static final int T__35=35;
+    public static final int T__36=36;
+    public static final int T__159=159;
+    public static final int T__30=30;
+    public static final int T__158=158;
+    public static final int T__279=279;
+    public static final int T__31=31;
+    public static final int T__32=32;
+    public static final int T__155=155;
+    public static final int T__276=276;
+    public static final int T__154=154;
+    public static final int T__275=275;
+    public static final int T__157=157;
+    public static final int T__278=278;
+    public static final int T__156=156;
+    public static final int T__277=277;
+    public static final int T__151=151;
+    public static final int T__272=272;
+    public static final int T__150=150;
+    public static final int T__271=271;
+    public static final int T__153=153;
+    public static final int T__274=274;
+    public static final int T__152=152;
+    public static final int T__273=273;
+    public static final int T__270=270;
+    public static final int T__48=48;
+    public static final int T__49=49;
+    public static final int RULE_XLIA_ID=4;
+    public static final int T__44=44;
+    public static final int T__45=45;
+    public static final int T__46=46;
+    public static final int T__47=47;
+    public static final int T__40=40;
+    public static final int T__148=148;
+    public static final int T__269=269;
+    public static final int T__41=41;
+    public static final int T__147=147;
+    public static final int T__268=268;
+    public static final int T__42=42;
+    public static final int T__43=43;
+    public static final int T__149=149;
+    public static final int T__100=100;
+    public static final int T__221=221;
+    public static final int T__220=220;
+    public static final int T__102=102;
+    public static final int T__223=223;
+    public static final int T__101=101;
+    public static final int T__222=222;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__16=16;
+    public static final int T__17=17;
+    public static final int T__18=18;
+    public static final int T__218=218;
+    public static final int T__217=217;
+    public static final int T__13=13;
+    public static final int T__14=14;
+    public static final int T__219=219;
+    public static final int T__214=214;
+    public static final int T__213=213;
+    public static final int T__216=216;
+    public static final int T__215=215;
+    public static final int T__210=210;
+    public static final int T__212=212;
+    public static final int T__211=211;
+    public static final int T__26=26;
+    public static final int T__27=27;
+    public static final int T__28=28;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__207=207;
+    public static final int T__23=23;
+    public static final int T__206=206;
+    public static final int T__24=24;
+    public static final int T__209=209;
+    public static final int T__25=25;
+    public static final int T__208=208;
+    public static final int T__203=203;
+    public static final int T__202=202;
+    public static final int T__20=20;
+    public static final int T__205=205;
+    public static final int T__21=21;
+    public static final int T__204=204;
+    public static final int T__122=122;
+    public static final int T__243=243;
+    public static final int T__121=121;
+    public static final int T__242=242;
+    public static final int T__124=124;
+    public static final int T__245=245;
+    public static final int T__123=123;
+    public static final int T__244=244;
+    public static final int T__120=120;
+    public static final int T__241=241;
+    public static final int T__240=240;
+    public static final int RULE_SL_COMMENT=10;
+    public static final int T__119=119;
+    public static final int T__118=118;
+    public static final int T__239=239;
+    public static final int T__115=115;
+    public static final int T__236=236;
+    public static final int EOF=-1;
+    public static final int T__114=114;
+    public static final int T__235=235;
+    public static final int T__117=117;
+    public static final int T__238=238;
+    public static final int T__116=116;
+    public static final int T__237=237;
+    public static final int T__111=111;
+    public static final int T__232=232;
+    public static final int T__110=110;
+    public static final int T__231=231;
+    public static final int T__113=113;
+    public static final int T__234=234;
+    public static final int T__112=112;
+    public static final int T__233=233;
+    public static final int T__230=230;
+    public static final int T__108=108;
+    public static final int T__229=229;
+    public static final int T__107=107;
+    public static final int T__228=228;
+    public static final int T__109=109;
+    public static final int T__104=104;
+    public static final int T__225=225;
+    public static final int T__103=103;
+    public static final int T__224=224;
+    public static final int T__106=106;
+    public static final int T__227=227;
+    public static final int T__105=105;
+    public static final int T__226=226;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__201=201;
+    public static final int T__200=200;
+    public static final int T__91=91;
+    public static final int T__188=188;
+    public static final int T__92=92;
+    public static final int T__187=187;
+    public static final int T__93=93;
+    public static final int T__94=94;
+    public static final int T__189=189;
+    public static final int T__184=184;
+    public static final int T__183=183;
+    public static final int T__186=186;
+    public static final int T__90=90;
+    public static final int T__185=185;
+    public static final int T__180=180;
+    public static final int T__182=182;
+    public static final int T__181=181;
+    public static final int T__99=99;
+    public static final int T__95=95;
+    public static final int T__96=96;
+    public static final int T__97=97;
+    public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
+    public static final int T__169=169;
+    public static final int T__70=70;
+    public static final int T__71=71;
+    public static final int T__72=72;
+    public static final int RULE_STRING=7;
+    public static final int T__77=77;
+    public static final int T__78=78;
+    public static final int T__79=79;
+    public static final int T__73=73;
+    public static final int T__74=74;
+    public static final int T__75=75;
+    public static final int T__76=76;
+    public static final int T__80=80;
+    public static final int T__199=199;
+    public static final int T__81=81;
+    public static final int T__198=198;
+    public static final int T__82=82;
+    public static final int T__83=83;
+    public static final int T__195=195;
+    public static final int T__194=194;
+    public static final int RULE_WS=11;
+    public static final int T__197=197;
+    public static final int T__196=196;
+    public static final int T__191=191;
+    public static final int T__190=190;
+    public static final int T__193=193;
+    public static final int T__192=192;
+    public static final int RULE_ANY_OTHER=12;
+    public static final int T__88=88;
+    public static final int T__89=89;
+    public static final int T__84=84;
+    public static final int T__85=85;
+    public static final int T__86=86;
+    public static final int T__87=87;
+
+    // delegates
+    // delegators
+
+
+        public InternalFormalMLParser(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+        public InternalFormalMLParser(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+             
+        }
+        
+
+    public String[] getTokenNames() { return InternalFormalMLParser.tokenNames; }
+    public String getGrammarFileName() { return "InternalFormalML.g"; }
+
+
+
+    /*
+      This grammar contains a lot of empty actions to work around a bug in ANTLR.
+      Otherwise the ANTLR tool will create synpreds that cannot be compiled in some rare cases.
+    */
+
+     	private FormalMLGrammarAccess grammarAccess;
+
+        public InternalFormalMLParser(TokenStream input, FormalMLGrammarAccess grammarAccess) {
+            this(input);
+            this.grammarAccess = grammarAccess;
+            registerRules(grammarAccess.getGrammar());
+        }
+
+        @Override
+        protected String getFirstRuleName() {
+        	return "Xlia";
+       	}
+
+       	@Override
+       	protected FormalMLGrammarAccess getGrammarAccess() {
+       		return grammarAccess;
+       	}
+
+
+
+
+    // $ANTLR start "entryRuleXlia"
+    // InternalFormalML.g:81:1: entryRuleXlia returns [EObject current=null] : iv_ruleXlia= ruleXlia EOF ;
+    public final EObject entryRuleXlia() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXlia = null;
+
+
+        try {
+            // InternalFormalML.g:81:45: (iv_ruleXlia= ruleXlia EOF )
+            // InternalFormalML.g:82:2: iv_ruleXlia= ruleXlia EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXliaRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleXlia=ruleXlia();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXlia; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXlia"
+
+
+    // $ANTLR start "ruleXlia"
+    // InternalFormalML.g:88:1: ruleXlia returns [EObject current=null] : ( ( (lv_prolog_0_0= ruleXliaPrologObject ) ) ( (lv_system_1_0= ruleSystem ) ) ) ;
+    public final EObject ruleXlia() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_prolog_0_0 = null;
+
+        EObject lv_system_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:94:2: ( ( ( (lv_prolog_0_0= ruleXliaPrologObject ) ) ( (lv_system_1_0= ruleSystem ) ) ) )
+            // InternalFormalML.g:95:2: ( ( (lv_prolog_0_0= ruleXliaPrologObject ) ) ( (lv_system_1_0= ruleSystem ) ) )
+            {
+            // InternalFormalML.g:95:2: ( ( (lv_prolog_0_0= ruleXliaPrologObject ) ) ( (lv_system_1_0= ruleSystem ) ) )
+            // InternalFormalML.g:96:3: ( (lv_prolog_0_0= ruleXliaPrologObject ) ) ( (lv_system_1_0= ruleSystem ) )
+            {
+            // InternalFormalML.g:96:3: ( (lv_prolog_0_0= ruleXliaPrologObject ) )
+            // InternalFormalML.g:97:4: (lv_prolog_0_0= ruleXliaPrologObject )
+            {
+            // InternalFormalML.g:97:4: (lv_prolog_0_0= ruleXliaPrologObject )
+            // InternalFormalML.g:98:5: lv_prolog_0_0= ruleXliaPrologObject
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXliaAccess().getPrologXliaPrologObjectParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_3);
+            lv_prolog_0_0=ruleXliaPrologObject();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXliaRule());
+              					}
+              					set(
+              						current,
+              						"prolog",
+              						lv_prolog_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.XliaPrologObject");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:115:3: ( (lv_system_1_0= ruleSystem ) )
+            // InternalFormalML.g:116:4: (lv_system_1_0= ruleSystem )
+            {
+            // InternalFormalML.g:116:4: (lv_system_1_0= ruleSystem )
+            // InternalFormalML.g:117:5: lv_system_1_0= ruleSystem
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXliaAccess().getSystemSystemParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_system_1_0=ruleSystem();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXliaRule());
+              					}
+              					set(
+              						current,
+              						"system",
+              						lv_system_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.System");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXlia"
+
+
+    // $ANTLR start "entryRuleXliaPrologObject"
+    // InternalFormalML.g:138:1: entryRuleXliaPrologObject returns [EObject current=null] : iv_ruleXliaPrologObject= ruleXliaPrologObject EOF ;
+    public final EObject entryRuleXliaPrologObject() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXliaPrologObject = null;
+
+
+        try {
+            // InternalFormalML.g:138:57: (iv_ruleXliaPrologObject= ruleXliaPrologObject EOF )
+            // InternalFormalML.g:139:2: iv_ruleXliaPrologObject= ruleXliaPrologObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXliaPrologObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleXliaPrologObject=ruleXliaPrologObject();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXliaPrologObject; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXliaPrologObject"
+
+
+    // $ANTLR start "ruleXliaPrologObject"
+    // InternalFormalML.g:145:1: ruleXliaPrologObject returns [EObject current=null] : ( ( ( (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' ) ) ) otherlv_1= '<' ( (lv_elements_2_0= ruleXliaPrologAttribute ) ) otherlv_3= '>:' ( (lv_elements_4_0= ruleXliaOptionObject ) )? ) ;
+    public final EObject ruleXliaPrologObject() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_0_1=null;
+        Token lv_name_0_2=null;
+        Token lv_name_0_3=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        EObject lv_elements_2_0 = null;
+
+        EObject lv_elements_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:151:2: ( ( ( ( (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' ) ) ) otherlv_1= '<' ( (lv_elements_2_0= ruleXliaPrologAttribute ) ) otherlv_3= '>:' ( (lv_elements_4_0= ruleXliaOptionObject ) )? ) )
+            // InternalFormalML.g:152:2: ( ( ( (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' ) ) ) otherlv_1= '<' ( (lv_elements_2_0= ruleXliaPrologAttribute ) ) otherlv_3= '>:' ( (lv_elements_4_0= ruleXliaOptionObject ) )? )
+            {
+            // InternalFormalML.g:152:2: ( ( ( (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' ) ) ) otherlv_1= '<' ( (lv_elements_2_0= ruleXliaPrologAttribute ) ) otherlv_3= '>:' ( (lv_elements_4_0= ruleXliaOptionObject ) )? )
+            // InternalFormalML.g:153:3: ( ( (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' ) ) ) otherlv_1= '<' ( (lv_elements_2_0= ruleXliaPrologAttribute ) ) otherlv_3= '>:' ( (lv_elements_4_0= ruleXliaOptionObject ) )?
+            {
+            // InternalFormalML.g:153:3: ( ( (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' ) ) )
+            // InternalFormalML.g:154:4: ( (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' ) )
+            {
+            // InternalFormalML.g:154:4: ( (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' ) )
+            // InternalFormalML.g:155:5: (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' )
+            {
+            // InternalFormalML.g:155:5: (lv_name_0_1= '@FormalML' | lv_name_0_2= '@xlia' | lv_name_0_3= '@xfsp' )
+            int alt1=3;
+            switch ( input.LA(1) ) {
+            case 13:
+                {
+                alt1=1;
+                }
+                break;
+            case 14:
+                {
+                alt1=2;
+                }
+                break;
+            case 15:
+                {
+                alt1=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 1, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt1) {
+                case 1 :
+                    // InternalFormalML.g:156:6: lv_name_0_1= '@FormalML'
+                    {
+                    lv_name_0_1=(Token)match(input,13,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_0_1, grammarAccess.getXliaPrologObjectAccess().getNameFormalMLKeyword_0_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXliaPrologObjectRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_0_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:167:6: lv_name_0_2= '@xlia'
+                    {
+                    lv_name_0_2=(Token)match(input,14,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_0_2, grammarAccess.getXliaPrologObjectAccess().getNameXliaKeyword_0_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXliaPrologObjectRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_0_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:178:6: lv_name_0_3= '@xfsp'
+                    {
+                    lv_name_0_3=(Token)match(input,15,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_0_3, grammarAccess.getXliaPrologObjectAccess().getNameXfspKeyword_0_0_2());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXliaPrologObjectRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_0_3, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,16,FollowSets000.FOLLOW_5); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXliaPrologObjectAccess().getLessThanSignKeyword_1());
+              		
+            }
+            // InternalFormalML.g:195:3: ( (lv_elements_2_0= ruleXliaPrologAttribute ) )
+            // InternalFormalML.g:196:4: (lv_elements_2_0= ruleXliaPrologAttribute )
+            {
+            // InternalFormalML.g:196:4: (lv_elements_2_0= ruleXliaPrologAttribute )
+            // InternalFormalML.g:197:5: lv_elements_2_0= ruleXliaPrologAttribute
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXliaPrologObjectAccess().getElementsXliaPrologAttributeParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_6);
+            lv_elements_2_0=ruleXliaPrologAttribute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXliaPrologObjectRule());
+              					}
+              					add(
+              						current,
+              						"elements",
+              						lv_elements_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.XliaPrologAttribute");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,17,FollowSets000.FOLLOW_7); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXliaPrologObjectAccess().getGreaterThanSignColonKeyword_3());
+              		
+            }
+            // InternalFormalML.g:218:3: ( (lv_elements_4_0= ruleXliaOptionObject ) )?
+            int alt2=2;
+            int LA2_0 = input.LA(1);
+
+            if ( (LA2_0==21) ) {
+                alt2=1;
+            }
+            switch (alt2) {
+                case 1 :
+                    // InternalFormalML.g:219:4: (lv_elements_4_0= ruleXliaOptionObject )
+                    {
+                    // InternalFormalML.g:219:4: (lv_elements_4_0= ruleXliaOptionObject )
+                    // InternalFormalML.g:220:5: lv_elements_4_0= ruleXliaOptionObject
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getXliaPrologObjectAccess().getElementsXliaOptionObjectParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_elements_4_0=ruleXliaOptionObject();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getXliaPrologObjectRule());
+                      					}
+                      					add(
+                      						current,
+                      						"elements",
+                      						lv_elements_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.XliaOptionObject");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXliaPrologObject"
+
+
+    // $ANTLR start "entryRuleXliaPrologAttribute"
+    // InternalFormalML.g:241:1: entryRuleXliaPrologAttribute returns [EObject current=null] : iv_ruleXliaPrologAttribute= ruleXliaPrologAttribute EOF ;
+    public final EObject entryRuleXliaPrologAttribute() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXliaPrologAttribute = null;
+
+
+        try {
+            // InternalFormalML.g:241:60: (iv_ruleXliaPrologAttribute= ruleXliaPrologAttribute EOF )
+            // InternalFormalML.g:242:2: iv_ruleXliaPrologAttribute= ruleXliaPrologAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXliaPrologAttributeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleXliaPrologAttribute=ruleXliaPrologAttribute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXliaPrologAttribute; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXliaPrologAttribute"
+
+
+    // $ANTLR start "ruleXliaPrologAttribute"
+    // InternalFormalML.g:248:1: ruleXliaPrologAttribute returns [EObject current=null] : ( ( ( (lv_name_0_1= 'system' | lv_name_0_2= 'package' ) ) ) (otherlv_1= ',' ( ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) ) ) )? ) ;
+    public final EObject ruleXliaPrologAttribute() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_0_1=null;
+        Token lv_name_0_2=null;
+        Token otherlv_1=null;
+        EObject lv_value_2_1 = null;
+
+        EObject lv_value_2_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:254:2: ( ( ( ( (lv_name_0_1= 'system' | lv_name_0_2= 'package' ) ) ) (otherlv_1= ',' ( ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) ) ) )? ) )
+            // InternalFormalML.g:255:2: ( ( ( (lv_name_0_1= 'system' | lv_name_0_2= 'package' ) ) ) (otherlv_1= ',' ( ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) ) ) )? )
+            {
+            // InternalFormalML.g:255:2: ( ( ( (lv_name_0_1= 'system' | lv_name_0_2= 'package' ) ) ) (otherlv_1= ',' ( ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) ) ) )? )
+            // InternalFormalML.g:256:3: ( ( (lv_name_0_1= 'system' | lv_name_0_2= 'package' ) ) ) (otherlv_1= ',' ( ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) ) ) )?
+            {
+            // InternalFormalML.g:256:3: ( ( (lv_name_0_1= 'system' | lv_name_0_2= 'package' ) ) )
+            // InternalFormalML.g:257:4: ( (lv_name_0_1= 'system' | lv_name_0_2= 'package' ) )
+            {
+            // InternalFormalML.g:257:4: ( (lv_name_0_1= 'system' | lv_name_0_2= 'package' ) )
+            // InternalFormalML.g:258:5: (lv_name_0_1= 'system' | lv_name_0_2= 'package' )
+            {
+            // InternalFormalML.g:258:5: (lv_name_0_1= 'system' | lv_name_0_2= 'package' )
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0==18) ) {
+                alt3=1;
+            }
+            else if ( (LA3_0==19) ) {
+                alt3=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 3, 0, input);
+
+                throw nvae;
+            }
+            switch (alt3) {
+                case 1 :
+                    // InternalFormalML.g:259:6: lv_name_0_1= 'system'
+                    {
+                    lv_name_0_1=(Token)match(input,18,FollowSets000.FOLLOW_8); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_0_1, grammarAccess.getXliaPrologAttributeAccess().getNameSystemKeyword_0_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXliaPrologAttributeRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_0_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:270:6: lv_name_0_2= 'package'
+                    {
+                    lv_name_0_2=(Token)match(input,19,FollowSets000.FOLLOW_8); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_0_2, grammarAccess.getXliaPrologAttributeAccess().getNamePackageKeyword_0_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getXliaPrologAttributeRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_0_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:283:3: (otherlv_1= ',' ( ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) ) ) )?
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==20) ) {
+                alt5=1;
+            }
+            switch (alt5) {
+                case 1 :
+                    // InternalFormalML.g:284:4: otherlv_1= ',' ( ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) ) )
+                    {
+                    otherlv_1=(Token)match(input,20,FollowSets000.FOLLOW_9); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getXliaPrologAttributeAccess().getCommaKeyword_1_0());
+                      			
+                    }
+                    // InternalFormalML.g:288:4: ( ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) ) )
+                    // InternalFormalML.g:289:5: ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) )
+                    {
+                    // InternalFormalML.g:289:5: ( (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression ) )
+                    // InternalFormalML.g:290:6: (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression )
+                    {
+                    // InternalFormalML.g:290:6: (lv_value_2_1= ruleLiteralFloatExpression | lv_value_2_2= ruleLiteralStringExpression )
+                    int alt4=2;
+                    int LA4_0 = input.LA(1);
+
+                    if ( (LA4_0==RULE_INT||(LA4_0>=28 && LA4_0<=29)) ) {
+                        alt4=1;
+                    }
+                    else if ( (LA4_0==RULE_STRING) ) {
+                        alt4=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 4, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt4) {
+                        case 1 :
+                            // InternalFormalML.g:291:7: lv_value_2_1= ruleLiteralFloatExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralFloatExpressionParserRuleCall_1_1_0_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            lv_value_2_1=ruleLiteralFloatExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXliaPrologAttributeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"value",
+                              								lv_value_2_1,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.LiteralFloatExpression");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:307:7: lv_value_2_2= ruleLiteralStringExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getXliaPrologAttributeAccess().getValueLiteralStringExpressionParserRuleCall_1_1_0_1());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            lv_value_2_2=ruleLiteralStringExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXliaPrologAttributeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"value",
+                              								lv_value_2_2,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.LiteralStringExpression");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXliaPrologAttribute"
+
+
+    // $ANTLR start "entryRuleXliaOptionObject"
+    // InternalFormalML.g:330:1: entryRuleXliaOptionObject returns [EObject current=null] : iv_ruleXliaOptionObject= ruleXliaOptionObject EOF ;
+    public final EObject entryRuleXliaOptionObject() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXliaOptionObject = null;
+
+
+        try {
+            // InternalFormalML.g:330:57: (iv_ruleXliaOptionObject= ruleXliaOptionObject EOF )
+            // InternalFormalML.g:331:2: iv_ruleXliaOptionObject= ruleXliaOptionObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXliaOptionObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleXliaOptionObject=ruleXliaOptionObject();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXliaOptionObject; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXliaOptionObject"
+
+
+    // $ANTLR start "ruleXliaOptionObject"
+    // InternalFormalML.g:337:1: ruleXliaOptionObject returns [EObject current=null] : ( ( (lv_name_0_0= '@option' ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}' ) ;
+    public final EObject ruleXliaOptionObject() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_0_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        EObject lv_elements_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:343:2: ( ( ( (lv_name_0_0= '@option' ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}' ) )
+            // InternalFormalML.g:344:2: ( ( (lv_name_0_0= '@option' ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}' )
+            {
+            // InternalFormalML.g:344:2: ( ( (lv_name_0_0= '@option' ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}' )
+            // InternalFormalML.g:345:3: ( (lv_name_0_0= '@option' ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}'
+            {
+            // InternalFormalML.g:345:3: ( (lv_name_0_0= '@option' ) )
+            // InternalFormalML.g:346:4: (lv_name_0_0= '@option' )
+            {
+            // InternalFormalML.g:346:4: (lv_name_0_0= '@option' )
+            // InternalFormalML.g:347:5: lv_name_0_0= '@option'
+            {
+            lv_name_0_0=(Token)match(input,21,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_0_0, grammarAccess.getXliaOptionObjectAccess().getNameOptionKeyword_0_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getXliaOptionObjectRule());
+              					}
+              					setWithLastConsumed(current, "name", lv_name_0_0, "@option");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,22,FollowSets000.FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXliaOptionObjectAccess().getLeftCurlyBracketKeyword_1());
+              		
+            }
+            // InternalFormalML.g:363:3: ( (lv_elements_2_0= ruleXliaNamedElement ) )*
+            loop6:
+            do {
+                int alt6=2;
+                int LA6_0 = input.LA(1);
+
+                if ( (LA6_0==RULE_XLIA_ID) ) {
+                    alt6=1;
+                }
+
+
+                switch (alt6) {
+            	case 1 :
+            	    // InternalFormalML.g:364:4: (lv_elements_2_0= ruleXliaNamedElement )
+            	    {
+            	    // InternalFormalML.g:364:4: (lv_elements_2_0= ruleXliaNamedElement )
+            	    // InternalFormalML.g:365:5: lv_elements_2_0= ruleXliaNamedElement
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getXliaOptionObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_11);
+            	    lv_elements_2_0=ruleXliaNamedElement();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getXliaOptionObjectRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"elements",
+            	      						lv_elements_2_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.XliaNamedElement");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop6;
+                }
+            } while (true);
+
+            otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXliaOptionObjectAccess().getRightCurlyBracketKeyword_3());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXliaOptionObject"
+
+
+    // $ANTLR start "entryRuleXliaNamedElement"
+    // InternalFormalML.g:390:1: entryRuleXliaNamedElement returns [EObject current=null] : iv_ruleXliaNamedElement= ruleXliaNamedElement EOF ;
+    public final EObject entryRuleXliaNamedElement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXliaNamedElement = null;
+
+
+        try {
+            // InternalFormalML.g:390:57: (iv_ruleXliaNamedElement= ruleXliaNamedElement EOF )
+            // InternalFormalML.g:391:2: iv_ruleXliaNamedElement= ruleXliaNamedElement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXliaNamedElementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleXliaNamedElement=ruleXliaNamedElement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXliaNamedElement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXliaNamedElement"
+
+
+    // $ANTLR start "ruleXliaNamedElement"
+    // InternalFormalML.g:397:1: ruleXliaNamedElement returns [EObject current=null] : (this_XliaObject_0= ruleXliaObject | this_XliaAttribute_1= ruleXliaAttribute ) ;
+    public final EObject ruleXliaNamedElement() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_XliaObject_0 = null;
+
+        EObject this_XliaAttribute_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:403:2: ( (this_XliaObject_0= ruleXliaObject | this_XliaAttribute_1= ruleXliaAttribute ) )
+            // InternalFormalML.g:404:2: (this_XliaObject_0= ruleXliaObject | this_XliaAttribute_1= ruleXliaAttribute )
+            {
+            // InternalFormalML.g:404:2: (this_XliaObject_0= ruleXliaObject | this_XliaAttribute_1= ruleXliaAttribute )
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0==RULE_XLIA_ID) ) {
+                int LA7_1 = input.LA(2);
+
+                if ( (LA7_1==22) ) {
+                    alt7=1;
+                }
+                else if ( (LA7_1==24) ) {
+                    alt7=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 7, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalFormalML.g:405:3: this_XliaObject_0= ruleXliaObject
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXliaNamedElementAccess().getXliaObjectParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_XliaObject_0=ruleXliaObject();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XliaObject_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:417:3: this_XliaAttribute_1= ruleXliaAttribute
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getXliaNamedElementAccess().getXliaAttributeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_XliaAttribute_1=ruleXliaAttribute();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_XliaAttribute_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXliaNamedElement"
+
+
+    // $ANTLR start "entryRuleXliaObject"
+    // InternalFormalML.g:432:1: entryRuleXliaObject returns [EObject current=null] : iv_ruleXliaObject= ruleXliaObject EOF ;
+    public final EObject entryRuleXliaObject() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXliaObject = null;
+
+
+        try {
+            // InternalFormalML.g:432:51: (iv_ruleXliaObject= ruleXliaObject EOF )
+            // InternalFormalML.g:433:2: iv_ruleXliaObject= ruleXliaObject EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXliaObjectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleXliaObject=ruleXliaObject();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXliaObject; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXliaObject"
+
+
+    // $ANTLR start "ruleXliaObject"
+    // InternalFormalML.g:439:1: ruleXliaObject returns [EObject current=null] : ( ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}' ) ;
+    public final EObject ruleXliaObject() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_0_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        EObject lv_elements_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:445:2: ( ( ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}' ) )
+            // InternalFormalML.g:446:2: ( ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}' )
+            {
+            // InternalFormalML.g:446:2: ( ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}' )
+            // InternalFormalML.g:447:3: ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '{' ( (lv_elements_2_0= ruleXliaNamedElement ) )* otherlv_3= '}'
+            {
+            // InternalFormalML.g:447:3: ( (lv_name_0_0= RULE_XLIA_ID ) )
+            // InternalFormalML.g:448:4: (lv_name_0_0= RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:448:4: (lv_name_0_0= RULE_XLIA_ID )
+            // InternalFormalML.g:449:5: lv_name_0_0= RULE_XLIA_ID
+            {
+            lv_name_0_0=(Token)match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_0_0, grammarAccess.getXliaObjectAccess().getNameXLIA_IDTerminalRuleCall_0_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getXliaObjectRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,22,FollowSets000.FOLLOW_11); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXliaObjectAccess().getLeftCurlyBracketKeyword_1());
+              		
+            }
+            // InternalFormalML.g:469:3: ( (lv_elements_2_0= ruleXliaNamedElement ) )*
+            loop8:
+            do {
+                int alt8=2;
+                int LA8_0 = input.LA(1);
+
+                if ( (LA8_0==RULE_XLIA_ID) ) {
+                    alt8=1;
+                }
+
+
+                switch (alt8) {
+            	case 1 :
+            	    // InternalFormalML.g:470:4: (lv_elements_2_0= ruleXliaNamedElement )
+            	    {
+            	    // InternalFormalML.g:470:4: (lv_elements_2_0= ruleXliaNamedElement )
+            	    // InternalFormalML.g:471:5: lv_elements_2_0= ruleXliaNamedElement
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getXliaObjectAccess().getElementsXliaNamedElementParserRuleCall_2_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_11);
+            	    lv_elements_2_0=ruleXliaNamedElement();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getXliaObjectRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"elements",
+            	      						lv_elements_2_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.XliaNamedElement");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop8;
+                }
+            } while (true);
+
+            otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXliaObjectAccess().getRightCurlyBracketKeyword_3());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXliaObject"
+
+
+    // $ANTLR start "entryRuleXliaAttribute"
+    // InternalFormalML.g:496:1: entryRuleXliaAttribute returns [EObject current=null] : iv_ruleXliaAttribute= ruleXliaAttribute EOF ;
+    public final EObject entryRuleXliaAttribute() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXliaAttribute = null;
+
+
+        try {
+            // InternalFormalML.g:496:54: (iv_ruleXliaAttribute= ruleXliaAttribute EOF )
+            // InternalFormalML.g:497:2: iv_ruleXliaAttribute= ruleXliaAttribute EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXliaAttributeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleXliaAttribute=ruleXliaAttribute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXliaAttribute; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXliaAttribute"
+
+
+    // $ANTLR start "ruleXliaAttribute"
+    // InternalFormalML.g:503:1: ruleXliaAttribute returns [EObject current=null] : ( ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) otherlv_3= ';' ) ;
+    public final EObject ruleXliaAttribute() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_0_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        EObject lv_value_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:509:2: ( ( ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) otherlv_3= ';' ) )
+            // InternalFormalML.g:510:2: ( ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) otherlv_3= ';' )
+            {
+            // InternalFormalML.g:510:2: ( ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) otherlv_3= ';' )
+            // InternalFormalML.g:511:3: ( (lv_name_0_0= RULE_XLIA_ID ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) otherlv_3= ';'
+            {
+            // InternalFormalML.g:511:3: ( (lv_name_0_0= RULE_XLIA_ID ) )
+            // InternalFormalML.g:512:4: (lv_name_0_0= RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:512:4: (lv_name_0_0= RULE_XLIA_ID )
+            // InternalFormalML.g:513:5: lv_name_0_0= RULE_XLIA_ID
+            {
+            lv_name_0_0=(Token)match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_12); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_0_0, grammarAccess.getXliaAttributeAccess().getNameXLIA_IDTerminalRuleCall_0_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getXliaAttributeRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getXliaAttributeAccess().getEqualsSignKeyword_1());
+              		
+            }
+            // InternalFormalML.g:533:3: ( (lv_value_2_0= ruleExpression ) )
+            // InternalFormalML.g:534:4: (lv_value_2_0= ruleExpression )
+            {
+            // InternalFormalML.g:534:4: (lv_value_2_0= ruleExpression )
+            // InternalFormalML.g:535:5: lv_value_2_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getXliaAttributeAccess().getValueExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_14);
+            lv_value_2_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXliaAttributeRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getXliaAttributeAccess().getSemicolonKeyword_3());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXliaAttribute"
+
+
+    // $ANTLR start "entryRuleEBoolean"
+    // InternalFormalML.g:560:1: entryRuleEBoolean returns [String current=null] : iv_ruleEBoolean= ruleEBoolean EOF ;
+    public final String entryRuleEBoolean() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEBoolean = null;
+
+
+        try {
+            // InternalFormalML.g:560:48: (iv_ruleEBoolean= ruleEBoolean EOF )
+            // InternalFormalML.g:561:2: iv_ruleEBoolean= ruleEBoolean EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEBooleanRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEBoolean=ruleEBoolean();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEBoolean.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEBoolean"
+
+
+    // $ANTLR start "ruleEBoolean"
+    // InternalFormalML.g:567:1: ruleEBoolean returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'true' | kw= 'false' ) ;
+    public final AntlrDatatypeRuleToken ruleEBoolean() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:573:2: ( (kw= 'true' | kw= 'false' ) )
+            // InternalFormalML.g:574:2: (kw= 'true' | kw= 'false' )
+            {
+            // InternalFormalML.g:574:2: (kw= 'true' | kw= 'false' )
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==26) ) {
+                alt9=1;
+            }
+            else if ( (LA9_0==27) ) {
+                alt9=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 9, 0, input);
+
+                throw nvae;
+            }
+            switch (alt9) {
+                case 1 :
+                    // InternalFormalML.g:575:3: kw= 'true'
+                    {
+                    kw=(Token)match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getEBooleanAccess().getTrueKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:581:3: kw= 'false'
+                    {
+                    kw=(Token)match(input,27,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getEBooleanAccess().getFalseKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEBoolean"
+
+
+    // $ANTLR start "entryRuleEInt"
+    // InternalFormalML.g:590:1: entryRuleEInt returns [String current=null] : iv_ruleEInt= ruleEInt EOF ;
+    public final String entryRuleEInt() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEInt = null;
+
+
+        try {
+            // InternalFormalML.g:590:44: (iv_ruleEInt= ruleEInt EOF )
+            // InternalFormalML.g:591:2: iv_ruleEInt= ruleEInt EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEIntRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEInt=ruleEInt();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEInt.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEInt"
+
+
+    // $ANTLR start "ruleEInt"
+    // InternalFormalML.g:597:1: ruleEInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_INT_1= RULE_INT ) ;
+    public final AntlrDatatypeRuleToken ruleEInt() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        Token this_INT_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:603:2: ( ( (kw= '-' )? this_INT_1= RULE_INT ) )
+            // InternalFormalML.g:604:2: ( (kw= '-' )? this_INT_1= RULE_INT )
+            {
+            // InternalFormalML.g:604:2: ( (kw= '-' )? this_INT_1= RULE_INT )
+            // InternalFormalML.g:605:3: (kw= '-' )? this_INT_1= RULE_INT
+            {
+            // InternalFormalML.g:605:3: (kw= '-' )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0==28) ) {
+                alt10=1;
+            }
+            switch (alt10) {
+                case 1 :
+                    // InternalFormalML.g:606:4: kw= '-'
+                    {
+                    kw=(Token)match(input,28,FollowSets000.FOLLOW_15); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getEIntAccess().getHyphenMinusKeyword_0());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            this_INT_1=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_INT_1);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(this_INT_1, grammarAccess.getEIntAccess().getINTTerminalRuleCall_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEInt"
+
+
+    // $ANTLR start "entryRuleEInteger"
+    // InternalFormalML.g:623:1: entryRuleEInteger returns [String current=null] : iv_ruleEInteger= ruleEInteger EOF ;
+    public final String entryRuleEInteger() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEInteger = null;
+
+
+        try {
+            // InternalFormalML.g:623:48: (iv_ruleEInteger= ruleEInteger EOF )
+            // InternalFormalML.g:624:2: iv_ruleEInteger= ruleEInteger EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEIntegerRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEInteger=ruleEInteger();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEInteger.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEInteger"
+
+
+    // $ANTLR start "ruleEInteger"
+    // InternalFormalML.g:630:1: ruleEInteger returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_INT_1= RULE_INT ) ;
+    public final AntlrDatatypeRuleToken ruleEInteger() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        Token this_INT_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:636:2: ( ( (kw= '-' )? this_INT_1= RULE_INT ) )
+            // InternalFormalML.g:637:2: ( (kw= '-' )? this_INT_1= RULE_INT )
+            {
+            // InternalFormalML.g:637:2: ( (kw= '-' )? this_INT_1= RULE_INT )
+            // InternalFormalML.g:638:3: (kw= '-' )? this_INT_1= RULE_INT
+            {
+            // InternalFormalML.g:638:3: (kw= '-' )?
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0==28) ) {
+                alt11=1;
+            }
+            switch (alt11) {
+                case 1 :
+                    // InternalFormalML.g:639:4: kw= '-'
+                    {
+                    kw=(Token)match(input,28,FollowSets000.FOLLOW_15); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getEIntegerAccess().getHyphenMinusKeyword_0());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            this_INT_1=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_INT_1);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(this_INT_1, grammarAccess.getEIntegerAccess().getINTTerminalRuleCall_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEInteger"
+
+
+    // $ANTLR start "entryRuleEDouble"
+    // InternalFormalML.g:656:1: entryRuleEDouble returns [String current=null] : iv_ruleEDouble= ruleEDouble EOF ;
+    public final String entryRuleEDouble() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEDouble = null;
+
+
+        try {
+            // InternalFormalML.g:656:47: (iv_ruleEDouble= ruleEDouble EOF )
+            // InternalFormalML.g:657:2: iv_ruleEDouble= ruleEDouble EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEDoubleRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEDouble=ruleEDouble();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEDouble.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEDouble"
+
+
+    // $ANTLR start "ruleEDouble"
+    // InternalFormalML.g:663:1: ruleEDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT ) ;
+    public final AntlrDatatypeRuleToken ruleEDouble() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        Token this_INT_1=null;
+        Token this_INT_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:669:2: ( ( (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT ) )
+            // InternalFormalML.g:670:2: ( (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT )
+            {
+            // InternalFormalML.g:670:2: ( (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT )
+            // InternalFormalML.g:671:3: (kw= '-' )? (this_INT_1= RULE_INT )? kw= '.' this_INT_3= RULE_INT
+            {
+            // InternalFormalML.g:671:3: (kw= '-' )?
+            int alt12=2;
+            int LA12_0 = input.LA(1);
+
+            if ( (LA12_0==28) ) {
+                alt12=1;
+            }
+            switch (alt12) {
+                case 1 :
+                    // InternalFormalML.g:672:4: kw= '-'
+                    {
+                    kw=(Token)match(input,28,FollowSets000.FOLLOW_16); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getEDoubleAccess().getHyphenMinusKeyword_0());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:678:3: (this_INT_1= RULE_INT )?
+            int alt13=2;
+            int LA13_0 = input.LA(1);
+
+            if ( (LA13_0==RULE_INT) ) {
+                alt13=1;
+            }
+            switch (alt13) {
+                case 1 :
+                    // InternalFormalML.g:679:4: this_INT_1= RULE_INT
+                    {
+                    this_INT_1=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_17); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current.merge(this_INT_1);
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(this_INT_1, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            kw=(Token)match(input,29,FollowSets000.FOLLOW_15); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getEDoubleAccess().getFullStopKeyword_2());
+              		
+            }
+            this_INT_3=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_INT_3);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(this_INT_3, grammarAccess.getEDoubleAccess().getINTTerminalRuleCall_3());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEDouble"
+
+
+    // $ANTLR start "entryRuleECharacter"
+    // InternalFormalML.g:703:1: entryRuleECharacter returns [String current=null] : iv_ruleECharacter= ruleECharacter EOF ;
+    public final String entryRuleECharacter() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleECharacter = null;
+
+
+        try {
+            // InternalFormalML.g:703:50: (iv_ruleECharacter= ruleECharacter EOF )
+            // InternalFormalML.g:704:2: iv_ruleECharacter= ruleECharacter EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getECharacterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleECharacter=ruleECharacter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleECharacter.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleECharacter"
+
+
+    // $ANTLR start "ruleECharacter"
+    // InternalFormalML.g:710:1: ruleECharacter returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_CHARACTER_0= RULE_CHARACTER ;
+    public final AntlrDatatypeRuleToken ruleECharacter() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_CHARACTER_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:716:2: (this_CHARACTER_0= RULE_CHARACTER )
+            // InternalFormalML.g:717:2: this_CHARACTER_0= RULE_CHARACTER
+            {
+            this_CHARACTER_0=(Token)match(input,RULE_CHARACTER,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_CHARACTER_0);
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(this_CHARACTER_0, grammarAccess.getECharacterAccess().getCHARACTERTerminalRuleCall());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleECharacter"
+
+
+    // $ANTLR start "entryRuleEString"
+    // InternalFormalML.g:727:1: entryRuleEString returns [String current=null] : iv_ruleEString= ruleEString EOF ;
+    public final String entryRuleEString() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEString = null;
+
+
+        try {
+            // InternalFormalML.g:727:47: (iv_ruleEString= ruleEString EOF )
+            // InternalFormalML.g:728:2: iv_ruleEString= ruleEString EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEStringRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEString=ruleEString();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEString.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEString"
+
+
+    // $ANTLR start "ruleEString"
+    // InternalFormalML.g:734:1: ruleEString returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_STRING_0= RULE_STRING ;
+    public final AntlrDatatypeRuleToken ruleEString() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_STRING_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:740:2: (this_STRING_0= RULE_STRING )
+            // InternalFormalML.g:741:2: this_STRING_0= RULE_STRING
+            {
+            this_STRING_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_STRING_0);
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(this_STRING_0, grammarAccess.getEStringAccess().getSTRINGTerminalRuleCall());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEString"
+
+
+    // $ANTLR start "entryRuleESIdentifier"
+    // InternalFormalML.g:751:1: entryRuleESIdentifier returns [String current=null] : iv_ruleESIdentifier= ruleESIdentifier EOF ;
+    public final String entryRuleESIdentifier() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleESIdentifier = null;
+
+
+        try {
+            // InternalFormalML.g:751:52: (iv_ruleESIdentifier= ruleESIdentifier EOF )
+            // InternalFormalML.g:752:2: iv_ruleESIdentifier= ruleESIdentifier EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getESIdentifierRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleESIdentifier=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleESIdentifier.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleESIdentifier"
+
+
+    // $ANTLR start "ruleESIdentifier"
+    // InternalFormalML.g:758:1: ruleESIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_XLIA_ID_0= RULE_XLIA_ID ;
+    public final AntlrDatatypeRuleToken ruleESIdentifier() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_XLIA_ID_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:764:2: (this_XLIA_ID_0= RULE_XLIA_ID )
+            // InternalFormalML.g:765:2: this_XLIA_ID_0= RULE_XLIA_ID
+            {
+            this_XLIA_ID_0=(Token)match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_XLIA_ID_0);
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(this_XLIA_ID_0, grammarAccess.getESIdentifierAccess().getXLIA_IDTerminalRuleCall());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleESIdentifier"
+
+
+    // $ANTLR start "entryRuleESUfid"
+    // InternalFormalML.g:775:1: entryRuleESUfid returns [String current=null] : iv_ruleESUfid= ruleESUfid EOF ;
+    public final String entryRuleESUfid() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleESUfid = null;
+
+
+        try {
+            // InternalFormalML.g:775:46: (iv_ruleESUfid= ruleESUfid EOF )
+            // InternalFormalML.g:776:2: iv_ruleESUfid= ruleESUfid EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getESUfidRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleESUfid=ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleESUfid.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleESUfid"
+
+
+    // $ANTLR start "ruleESUfid"
+    // InternalFormalML.g:782:1: ruleESUfid returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_XLIA_ID_0= RULE_XLIA_ID ( (kw= '.' | kw= ':' | kw= '::' ) this_XLIA_ID_4= RULE_XLIA_ID )* ) ;
+    public final AntlrDatatypeRuleToken ruleESUfid() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_XLIA_ID_0=null;
+        Token kw=null;
+        Token this_XLIA_ID_4=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:788:2: ( (this_XLIA_ID_0= RULE_XLIA_ID ( (kw= '.' | kw= ':' | kw= '::' ) this_XLIA_ID_4= RULE_XLIA_ID )* ) )
+            // InternalFormalML.g:789:2: (this_XLIA_ID_0= RULE_XLIA_ID ( (kw= '.' | kw= ':' | kw= '::' ) this_XLIA_ID_4= RULE_XLIA_ID )* )
+            {
+            // InternalFormalML.g:789:2: (this_XLIA_ID_0= RULE_XLIA_ID ( (kw= '.' | kw= ':' | kw= '::' ) this_XLIA_ID_4= RULE_XLIA_ID )* )
+            // InternalFormalML.g:790:3: this_XLIA_ID_0= RULE_XLIA_ID ( (kw= '.' | kw= ':' | kw= '::' ) this_XLIA_ID_4= RULE_XLIA_ID )*
+            {
+            this_XLIA_ID_0=(Token)match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_18); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(this_XLIA_ID_0);
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(this_XLIA_ID_0, grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_0());
+              		
+            }
+            // InternalFormalML.g:797:3: ( (kw= '.' | kw= ':' | kw= '::' ) this_XLIA_ID_4= RULE_XLIA_ID )*
+            loop15:
+            do {
+                int alt15=2;
+                int LA15_0 = input.LA(1);
+
+                if ( (LA15_0==29) ) {
+                    int LA15_2 = input.LA(2);
+
+                    if ( (LA15_2==RULE_XLIA_ID) ) {
+                        alt15=1;
+                    }
+
+
+                }
+                else if ( ((LA15_0>=30 && LA15_0<=31)) ) {
+                    alt15=1;
+                }
+
+
+                switch (alt15) {
+            	case 1 :
+            	    // InternalFormalML.g:798:4: (kw= '.' | kw= ':' | kw= '::' ) this_XLIA_ID_4= RULE_XLIA_ID
+            	    {
+            	    // InternalFormalML.g:798:4: (kw= '.' | kw= ':' | kw= '::' )
+            	    int alt14=3;
+            	    switch ( input.LA(1) ) {
+            	    case 29:
+            	        {
+            	        alt14=1;
+            	        }
+            	        break;
+            	    case 30:
+            	        {
+            	        alt14=2;
+            	        }
+            	        break;
+            	    case 31:
+            	        {
+            	        alt14=3;
+            	        }
+            	        break;
+            	    default:
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 14, 0, input);
+
+            	        throw nvae;
+            	    }
+
+            	    switch (alt14) {
+            	        case 1 :
+            	            // InternalFormalML.g:799:5: kw= '.'
+            	            {
+            	            kw=(Token)match(input,29,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					current.merge(kw);
+            	              					newLeafNode(kw, grammarAccess.getESUfidAccess().getFullStopKeyword_1_0_0());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:805:5: kw= ':'
+            	            {
+            	            kw=(Token)match(input,30,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					current.merge(kw);
+            	              					newLeafNode(kw, grammarAccess.getESUfidAccess().getColonKeyword_1_0_1());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+            	        case 3 :
+            	            // InternalFormalML.g:811:5: kw= '::'
+            	            {
+            	            kw=(Token)match(input,31,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					current.merge(kw);
+            	              					newLeafNode(kw, grammarAccess.getESUfidAccess().getColonColonKeyword_1_0_2());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    this_XLIA_ID_4=(Token)match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_18); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				current.merge(this_XLIA_ID_4);
+            	      			
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(this_XLIA_ID_4, grammarAccess.getESUfidAccess().getXLIA_IDTerminalRuleCall_1_1());
+            	      			
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop15;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleESUfid"
+
+
+    // $ANTLR start "entryRuleUnrestrictedName"
+    // InternalFormalML.g:829:1: entryRuleUnrestrictedName returns [String current=null] : iv_ruleUnrestrictedName= ruleUnrestrictedName EOF ;
+    public final String entryRuleUnrestrictedName() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleUnrestrictedName = null;
+
+
+        try {
+            // InternalFormalML.g:829:56: (iv_ruleUnrestrictedName= ruleUnrestrictedName EOF )
+            // InternalFormalML.g:830:2: iv_ruleUnrestrictedName= ruleUnrestrictedName EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUnrestrictedNameRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleUnrestrictedName=ruleUnrestrictedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUnrestrictedName.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUnrestrictedName"
+
+
+    // $ANTLR start "ruleUnrestrictedName"
+    // InternalFormalML.g:836:1: ruleUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_STRING_0= RULE_STRING ;
+    public final AntlrDatatypeRuleToken ruleUnrestrictedName() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_STRING_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:842:2: (this_STRING_0= RULE_STRING )
+            // InternalFormalML.g:843:2: this_STRING_0= RULE_STRING
+            {
+            this_STRING_0=(Token)match(input,RULE_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_STRING_0);
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(this_STRING_0, grammarAccess.getUnrestrictedNameAccess().getSTRINGTerminalRuleCall());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUnrestrictedName"
+
+
+    // $ANTLR start "entryRuleUnqualifiedName"
+    // InternalFormalML.g:853:1: entryRuleUnqualifiedName returns [EObject current=null] : iv_ruleUnqualifiedName= ruleUnqualifiedName EOF ;
+    public final EObject entryRuleUnqualifiedName() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUnqualifiedName = null;
+
+
+        try {
+            // InternalFormalML.g:853:56: (iv_ruleUnqualifiedName= ruleUnqualifiedName EOF )
+            // InternalFormalML.g:854:2: iv_ruleUnqualifiedName= ruleUnqualifiedName EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUnqualifiedNameRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleUnqualifiedName=ruleUnqualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUnqualifiedName; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUnqualifiedName"
+
+
+    // $ANTLR start "ruleUnqualifiedName"
+    // InternalFormalML.g:860:1: ruleUnqualifiedName returns [EObject current=null] : ( (lv_nameBinding_0_0= ruleNameBinding ) ) ;
+    public final EObject ruleUnqualifiedName() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_nameBinding_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:866:2: ( ( (lv_nameBinding_0_0= ruleNameBinding ) ) )
+            // InternalFormalML.g:867:2: ( (lv_nameBinding_0_0= ruleNameBinding ) )
+            {
+            // InternalFormalML.g:867:2: ( (lv_nameBinding_0_0= ruleNameBinding ) )
+            // InternalFormalML.g:868:3: (lv_nameBinding_0_0= ruleNameBinding )
+            {
+            // InternalFormalML.g:868:3: (lv_nameBinding_0_0= ruleNameBinding )
+            // InternalFormalML.g:869:4: lv_nameBinding_0_0= ruleNameBinding
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getUnqualifiedNameAccess().getNameBindingNameBindingParserRuleCall_0());
+              			
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_nameBinding_0_0=ruleNameBinding();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getUnqualifiedNameRule());
+              				}
+              				add(
+              					current,
+              					"nameBinding",
+              					lv_nameBinding_0_0,
+              					"org.eclipse.efm.formalml.xtext.FormalML.NameBinding");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUnqualifiedName"
+
+
+    // $ANTLR start "entryRuleNameBinding"
+    // InternalFormalML.g:889:1: entryRuleNameBinding returns [String current=null] : iv_ruleNameBinding= ruleNameBinding EOF ;
+    public final String entryRuleNameBinding() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleNameBinding = null;
+
+
+        try {
+            // InternalFormalML.g:889:51: (iv_ruleNameBinding= ruleNameBinding EOF )
+            // InternalFormalML.g:890:2: iv_ruleNameBinding= ruleNameBinding EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getNameBindingRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleNameBinding=ruleNameBinding();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleNameBinding.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleNameBinding"
+
+
+    // $ANTLR start "ruleNameBinding"
+    // InternalFormalML.g:896:1: ruleNameBinding returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_XLIA_ID_0= RULE_XLIA_ID ;
+    public final AntlrDatatypeRuleToken ruleNameBinding() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_XLIA_ID_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:902:2: (this_XLIA_ID_0= RULE_XLIA_ID )
+            // InternalFormalML.g:903:2: this_XLIA_ID_0= RULE_XLIA_ID
+            {
+            this_XLIA_ID_0=(Token)match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_XLIA_ID_0);
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(this_XLIA_ID_0, grammarAccess.getNameBindingAccess().getXLIA_IDTerminalRuleCall());
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleNameBinding"
+
+
+    // $ANTLR start "entryRuleSystem"
+    // InternalFormalML.g:913:1: entryRuleSystem returns [EObject current=null] : iv_ruleSystem= ruleSystem EOF ;
+    public final EObject entryRuleSystem() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSystem = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getSystemAccess().getUnorderedGroup_0()
+        	);
+
+        try {
+            // InternalFormalML.g:917:2: (iv_ruleSystem= ruleSystem EOF )
+            // InternalFormalML.g:918:2: iv_ruleSystem= ruleSystem EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSystemRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSystem=ruleSystem();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSystem; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSystem"
+
+
+    // $ANTLR start "ruleSystem"
+    // InternalFormalML.g:927:1: ruleSystem returns [EObject current=null] : ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* ) ) ) otherlv_4= 'system' (otherlv_5= '<' (otherlv_6= 'moc:' )? (otherlv_7= 'and' | otherlv_8= 'or' ) otherlv_9= '>' )? ( (lv_name_10_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_11_0= ruleUnrestrictedName ) )? otherlv_12= '{' ( ( (lv_port_13_0= rulePort ) ) | ( (lv_signal_14_0= ruleSignal ) ) | ( (lv_buffer_15_0= ruleBuffer ) ) | ( (lv_channel_16_0= ruleChannel ) ) | ( (lv_typedef_17_0= ruleTypeDefinition ) ) | ( (lv_property_18_0= ruleVariable ) ) )* ( (otherlv_19= '@property:' ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )* ) | (otherlv_26= '@public:' ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )* ) | (otherlv_33= '@protected:' ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )* ) | (otherlv_40= '@private:' ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ ) | (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_52_0= ruleRoutine ) ) | ( (lv_procedure_53_0= ruleProcedure ) ) )+ ) ( ( (otherlv_54= '@composite:' | otherlv_55= '@machine:' ) ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+ ) | (otherlv_58= '@model:' ( (lv_machine_59_0= ruleAnyMachineBlock ) )* ) | (otherlv_60= '@prototype:' ( (lv_machine_61_0= ruleAnyMachineBlock ) )* ) | (otherlv_62= '@instance:' ( (lv_instance_63_0= ruleInstanceMachine ) )* ) )* ( (otherlv_64= '@behavior:' ( (lv_behavior_65_0= ruleBehavior ) )+ ) | (otherlv_66= '@statemachine:' ( (lv_behavior_67_0= ruleStatemachine ) )+ ) )* ( (lv_main_68_0= ruleMoeBehavior ) ) otherlv_69= '}' ) ;
+    public final EObject ruleSystem() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_timed_2_0=null;
+        Token lv_input_enabled_3_0=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_12=null;
+        Token otherlv_19=null;
+        Token otherlv_26=null;
+        Token otherlv_33=null;
+        Token otherlv_40=null;
+        Token otherlv_47=null;
+        Token otherlv_48=null;
+        Token otherlv_50=null;
+        Token otherlv_54=null;
+        Token otherlv_55=null;
+        Token otherlv_58=null;
+        Token otherlv_60=null;
+        Token otherlv_62=null;
+        Token otherlv_64=null;
+        Token otherlv_66=null;
+        Token otherlv_69=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_10_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_11_0 = null;
+
+        EObject lv_port_13_0 = null;
+
+        EObject lv_signal_14_0 = null;
+
+        EObject lv_buffer_15_0 = null;
+
+        EObject lv_channel_16_0 = null;
+
+        EObject lv_typedef_17_0 = null;
+
+        EObject lv_property_18_0 = null;
+
+        EObject lv_port_20_0 = null;
+
+        EObject lv_signal_21_0 = null;
+
+        EObject lv_buffer_22_0 = null;
+
+        EObject lv_channel_23_0 = null;
+
+        EObject lv_typedef_24_0 = null;
+
+        EObject lv_property_25_0 = null;
+
+        EObject lv_port_27_0 = null;
+
+        EObject lv_signal_28_0 = null;
+
+        EObject lv_buffer_29_0 = null;
+
+        EObject lv_channel_30_0 = null;
+
+        EObject lv_typedef_31_0 = null;
+
+        EObject lv_property_32_0 = null;
+
+        EObject lv_port_34_0 = null;
+
+        EObject lv_signal_35_0 = null;
+
+        EObject lv_buffer_36_0 = null;
+
+        EObject lv_channel_37_0 = null;
+
+        EObject lv_typedef_38_0 = null;
+
+        EObject lv_property_39_0 = null;
+
+        EObject lv_port_41_0 = null;
+
+        EObject lv_signal_42_0 = null;
+
+        EObject lv_buffer_43_0 = null;
+
+        EObject lv_channel_44_0 = null;
+
+        EObject lv_typedef_45_0 = null;
+
+        EObject lv_property_46_0 = null;
+
+        EObject lv_routine_49_0 = null;
+
+        EObject lv_procedure_51_0 = null;
+
+        EObject lv_routine_52_0 = null;
+
+        EObject lv_procedure_53_0 = null;
+
+        EObject lv_machine_56_0 = null;
+
+        EObject lv_instance_57_0 = null;
+
+        EObject lv_machine_59_0 = null;
+
+        EObject lv_machine_61_0 = null;
+
+        EObject lv_instance_63_0 = null;
+
+        EObject lv_behavior_65_0 = null;
+
+        EObject lv_behavior_67_0 = null;
+
+        EObject lv_main_68_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getSystemAccess().getUnorderedGroup_0()
+        	);
+
+        try {
+            // InternalFormalML.g:936:2: ( ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* ) ) ) otherlv_4= 'system' (otherlv_5= '<' (otherlv_6= 'moc:' )? (otherlv_7= 'and' | otherlv_8= 'or' ) otherlv_9= '>' )? ( (lv_name_10_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_11_0= ruleUnrestrictedName ) )? otherlv_12= '{' ( ( (lv_port_13_0= rulePort ) ) | ( (lv_signal_14_0= ruleSignal ) ) | ( (lv_buffer_15_0= ruleBuffer ) ) | ( (lv_channel_16_0= ruleChannel ) ) | ( (lv_typedef_17_0= ruleTypeDefinition ) ) | ( (lv_property_18_0= ruleVariable ) ) )* ( (otherlv_19= '@property:' ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )* ) | (otherlv_26= '@public:' ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )* ) | (otherlv_33= '@protected:' ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )* ) | (otherlv_40= '@private:' ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ ) | (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_52_0= ruleRoutine ) ) | ( (lv_procedure_53_0= ruleProcedure ) ) )+ ) ( ( (otherlv_54= '@composite:' | otherlv_55= '@machine:' ) ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+ ) | (otherlv_58= '@model:' ( (lv_machine_59_0= ruleAnyMachineBlock ) )* ) | (otherlv_60= '@prototype:' ( (lv_machine_61_0= ruleAnyMachineBlock ) )* ) | (otherlv_62= '@instance:' ( (lv_instance_63_0= ruleInstanceMachine ) )* ) )* ( (otherlv_64= '@behavior:' ( (lv_behavior_65_0= ruleBehavior ) )+ ) | (otherlv_66= '@statemachine:' ( (lv_behavior_67_0= ruleStatemachine ) )+ ) )* ( (lv_main_68_0= ruleMoeBehavior ) ) otherlv_69= '}' ) )
+            // InternalFormalML.g:937:2: ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* ) ) ) otherlv_4= 'system' (otherlv_5= '<' (otherlv_6= 'moc:' )? (otherlv_7= 'and' | otherlv_8= 'or' ) otherlv_9= '>' )? ( (lv_name_10_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_11_0= ruleUnrestrictedName ) )? otherlv_12= '{' ( ( (lv_port_13_0= rulePort ) ) | ( (lv_signal_14_0= ruleSignal ) ) | ( (lv_buffer_15_0= ruleBuffer ) ) | ( (lv_channel_16_0= ruleChannel ) ) | ( (lv_typedef_17_0= ruleTypeDefinition ) ) | ( (lv_property_18_0= ruleVariable ) ) )* ( (otherlv_19= '@property:' ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )* ) | (otherlv_26= '@public:' ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )* ) | (otherlv_33= '@protected:' ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )* ) | (otherlv_40= '@private:' ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ ) | (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_52_0= ruleRoutine ) ) | ( (lv_procedure_53_0= ruleProcedure ) ) )+ ) ( ( (otherlv_54= '@composite:' | otherlv_55= '@machine:' ) ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+ ) | (otherlv_58= '@model:' ( (lv_machine_59_0= ruleAnyMachineBlock ) )* ) | (otherlv_60= '@prototype:' ( (lv_machine_61_0= ruleAnyMachineBlock ) )* ) | (otherlv_62= '@instance:' ( (lv_instance_63_0= ruleInstanceMachine ) )* ) )* ( (otherlv_64= '@behavior:' ( (lv_behavior_65_0= ruleBehavior ) )+ ) | (otherlv_66= '@statemachine:' ( (lv_behavior_67_0= ruleStatemachine ) )+ ) )* ( (lv_main_68_0= ruleMoeBehavior ) ) otherlv_69= '}' )
+            {
+            // InternalFormalML.g:937:2: ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* ) ) ) otherlv_4= 'system' (otherlv_5= '<' (otherlv_6= 'moc:' )? (otherlv_7= 'and' | otherlv_8= 'or' ) otherlv_9= '>' )? ( (lv_name_10_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_11_0= ruleUnrestrictedName ) )? otherlv_12= '{' ( ( (lv_port_13_0= rulePort ) ) | ( (lv_signal_14_0= ruleSignal ) ) | ( (lv_buffer_15_0= ruleBuffer ) ) | ( (lv_channel_16_0= ruleChannel ) ) | ( (lv_typedef_17_0= ruleTypeDefinition ) ) | ( (lv_property_18_0= ruleVariable ) ) )* ( (otherlv_19= '@property:' ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )* ) | (otherlv_26= '@public:' ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )* ) | (otherlv_33= '@protected:' ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )* ) | (otherlv_40= '@private:' ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ ) | (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_52_0= ruleRoutine ) ) | ( (lv_procedure_53_0= ruleProcedure ) ) )+ ) ( ( (otherlv_54= '@composite:' | otherlv_55= '@machine:' ) ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+ ) | (otherlv_58= '@model:' ( (lv_machine_59_0= ruleAnyMachineBlock ) )* ) | (otherlv_60= '@prototype:' ( (lv_machine_61_0= ruleAnyMachineBlock ) )* ) | (otherlv_62= '@instance:' ( (lv_instance_63_0= ruleInstanceMachine ) )* ) )* ( (otherlv_64= '@behavior:' ( (lv_behavior_65_0= ruleBehavior ) )+ ) | (otherlv_66= '@statemachine:' ( (lv_behavior_67_0= ruleStatemachine ) )+ ) )* ( (lv_main_68_0= ruleMoeBehavior ) ) otherlv_69= '}' )
+            // InternalFormalML.g:938:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* ) ) ) otherlv_4= 'system' (otherlv_5= '<' (otherlv_6= 'moc:' )? (otherlv_7= 'and' | otherlv_8= 'or' ) otherlv_9= '>' )? ( (lv_name_10_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_11_0= ruleUnrestrictedName ) )? otherlv_12= '{' ( ( (lv_port_13_0= rulePort ) ) | ( (lv_signal_14_0= ruleSignal ) ) | ( (lv_buffer_15_0= ruleBuffer ) ) | ( (lv_channel_16_0= ruleChannel ) ) | ( (lv_typedef_17_0= ruleTypeDefinition ) ) | ( (lv_property_18_0= ruleVariable ) ) )* ( (otherlv_19= '@property:' ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )* ) | (otherlv_26= '@public:' ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )* ) | (otherlv_33= '@protected:' ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )* ) | (otherlv_40= '@private:' ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ ) | (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_52_0= ruleRoutine ) ) | ( (lv_procedure_53_0= ruleProcedure ) ) )+ ) ( ( (otherlv_54= '@composite:' | otherlv_55= '@machine:' ) ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+ ) | (otherlv_58= '@model:' ( (lv_machine_59_0= ruleAnyMachineBlock ) )* ) | (otherlv_60= '@prototype:' ( (lv_machine_61_0= ruleAnyMachineBlock ) )* ) | (otherlv_62= '@instance:' ( (lv_instance_63_0= ruleInstanceMachine ) )* ) )* ( (otherlv_64= '@behavior:' ( (lv_behavior_65_0= ruleBehavior ) )+ ) | (otherlv_66= '@statemachine:' ( (lv_behavior_67_0= ruleStatemachine ) )+ ) )* ( (lv_main_68_0= ruleMoeBehavior ) ) otherlv_69= '}'
+            {
+            // InternalFormalML.g:938:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:939:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:939:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* ) )
+            // InternalFormalML.g:940:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+            // InternalFormalML.g:943:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )* )
+            // InternalFormalML.g:944:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:944:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )*
+            loop17:
+            do {
+                int alt17=3;
+                int LA17_0 = input.LA(1);
+
+                if ( LA17_0 == 240 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                    alt17=1;
+                }
+                else if ( LA17_0 == 241 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                    alt17=1;
+                }
+                else if ( LA17_0 == 242 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                    alt17=1;
+                }
+                else if ( LA17_0 == 19 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+                    alt17=1;
+                }
+                else if ( LA17_0 == 32 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+                    alt17=2;
+                }
+                else if ( LA17_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+                    alt17=2;
+                }
+
+
+                switch (alt17) {
+            	case 1 :
+            	    // InternalFormalML.g:945:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:945:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+            	    // InternalFormalML.g:946:5: {...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleSystem", "getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0)");
+            	    }
+            	    // InternalFormalML.g:946:103: ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+            	    // InternalFormalML.g:947:6: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0);
+            	    // InternalFormalML.g:950:9: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+            	    // InternalFormalML.g:950:10: {...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleSystem", "true");
+            	    }
+            	    // InternalFormalML.g:950:19: ( (lv_visibility_1_0= ruleVisibilityKind ) )
+            	    // InternalFormalML.g:950:20: (lv_visibility_1_0= ruleVisibilityKind )
+            	    {
+            	    // InternalFormalML.g:950:20: (lv_visibility_1_0= ruleVisibilityKind )
+            	    // InternalFormalML.g:951:10: lv_visibility_1_0= ruleVisibilityKind
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getSystemAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_3);
+            	    lv_visibility_1_0=ruleVisibilityKind();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getSystemRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"visibility",
+            	      											lv_visibility_1_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:973:4: ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:973:4: ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) )
+            	    // InternalFormalML.g:974:5: {...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleSystem", "getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1)");
+            	    }
+            	    // InternalFormalML.g:974:103: ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) )
+            	    // InternalFormalML.g:975:6: ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1);
+            	    // InternalFormalML.g:978:9: ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) )
+            	    // InternalFormalML.g:978:10: {...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleSystem", "true");
+            	    }
+            	    // InternalFormalML.g:978:19: ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) )
+            	    int alt16=2;
+            	    int LA16_0 = input.LA(1);
+
+            	    if ( (LA16_0==32) ) {
+            	        alt16=1;
+            	    }
+            	    else if ( (LA16_0==33) ) {
+            	        alt16=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 16, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt16) {
+            	        case 1 :
+            	            // InternalFormalML.g:978:20: ( (lv_timed_2_0= 'timed' ) )
+            	            {
+            	            // InternalFormalML.g:978:20: ( (lv_timed_2_0= 'timed' ) )
+            	            // InternalFormalML.g:979:10: (lv_timed_2_0= 'timed' )
+            	            {
+            	            // InternalFormalML.g:979:10: (lv_timed_2_0= 'timed' )
+            	            // InternalFormalML.g:980:11: lv_timed_2_0= 'timed'
+            	            {
+            	            lv_timed_2_0=(Token)match(input,32,FollowSets000.FOLLOW_3); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_timed_2_0, grammarAccess.getSystemAccess().getTimedTimedKeyword_0_1_0_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getSystemRule());
+            	              											}
+            	              											setWithLastConsumed(current, "timed", true, "timed");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:993:9: ( (lv_input_enabled_3_0= 'input_enabled' ) )
+            	            {
+            	            // InternalFormalML.g:993:9: ( (lv_input_enabled_3_0= 'input_enabled' ) )
+            	            // InternalFormalML.g:994:10: (lv_input_enabled_3_0= 'input_enabled' )
+            	            {
+            	            // InternalFormalML.g:994:10: (lv_input_enabled_3_0= 'input_enabled' )
+            	            // InternalFormalML.g:995:11: lv_input_enabled_3_0= 'input_enabled'
+            	            {
+            	            lv_input_enabled_3_0=(Token)match(input,33,FollowSets000.FOLLOW_3); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_input_enabled_3_0, grammarAccess.getSystemAccess().getInput_enabledInput_enabledKeyword_0_1_1_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getSystemRule());
+            	              											}
+            	              											setWithLastConsumed(current, "input_enabled", true, "input_enabled");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop17;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getSystemAccess().getUnorderedGroup_0());
+
+            }
+
+            otherlv_4=(Token)match(input,18,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getSystemAccess().getSystemKeyword_1());
+              		
+            }
+            // InternalFormalML.g:1024:3: (otherlv_5= '<' (otherlv_6= 'moc:' )? (otherlv_7= 'and' | otherlv_8= 'or' ) otherlv_9= '>' )?
+            int alt20=2;
+            int LA20_0 = input.LA(1);
+
+            if ( (LA20_0==16) ) {
+                alt20=1;
+            }
+            switch (alt20) {
+                case 1 :
+                    // InternalFormalML.g:1025:4: otherlv_5= '<' (otherlv_6= 'moc:' )? (otherlv_7= 'and' | otherlv_8= 'or' ) otherlv_9= '>'
+                    {
+                    otherlv_5=(Token)match(input,16,FollowSets000.FOLLOW_21); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getSystemAccess().getLessThanSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:1029:4: (otherlv_6= 'moc:' )?
+                    int alt18=2;
+                    int LA18_0 = input.LA(1);
+
+                    if ( (LA18_0==34) ) {
+                        alt18=1;
+                    }
+                    switch (alt18) {
+                        case 1 :
+                            // InternalFormalML.g:1030:5: otherlv_6= 'moc:'
+                            {
+                            otherlv_6=(Token)match(input,34,FollowSets000.FOLLOW_22); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_6, grammarAccess.getSystemAccess().getMocKeyword_2_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:1035:4: (otherlv_7= 'and' | otherlv_8= 'or' )
+                    int alt19=2;
+                    int LA19_0 = input.LA(1);
+
+                    if ( (LA19_0==35) ) {
+                        alt19=1;
+                    }
+                    else if ( (LA19_0==36) ) {
+                        alt19=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 19, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt19) {
+                        case 1 :
+                            // InternalFormalML.g:1036:5: otherlv_7= 'and'
+                            {
+                            otherlv_7=(Token)match(input,35,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_7, grammarAccess.getSystemAccess().getAndKeyword_2_2_0());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:1041:5: otherlv_8= 'or'
+                            {
+                            otherlv_8=(Token)match(input,36,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_8, grammarAccess.getSystemAccess().getOrKeyword_2_2_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_9=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getSystemAccess().getGreaterThanSignKeyword_2_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:1051:3: ( (lv_name_10_0= ruleESIdentifier ) )
+            // InternalFormalML.g:1052:4: (lv_name_10_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:1052:4: (lv_name_10_0= ruleESIdentifier )
+            // InternalFormalML.g:1053:5: lv_name_10_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSystemAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_24);
+            lv_name_10_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSystemRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_10_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:1070:3: ( (lv_unrestrictedName_11_0= ruleUnrestrictedName ) )?
+            int alt21=2;
+            int LA21_0 = input.LA(1);
+
+            if ( (LA21_0==RULE_STRING) ) {
+                alt21=1;
+            }
+            switch (alt21) {
+                case 1 :
+                    // InternalFormalML.g:1071:4: (lv_unrestrictedName_11_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:1071:4: (lv_unrestrictedName_11_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:1072:5: lv_unrestrictedName_11_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSystemAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_10);
+                    lv_unrestrictedName_11_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSystemRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_11_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_12=(Token)match(input,22,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_12, grammarAccess.getSystemAccess().getLeftCurlyBracketKeyword_5());
+              		
+            }
+            // InternalFormalML.g:1093:3: ( ( (lv_port_13_0= rulePort ) ) | ( (lv_signal_14_0= ruleSignal ) ) | ( (lv_buffer_15_0= ruleBuffer ) ) | ( (lv_channel_16_0= ruleChannel ) ) | ( (lv_typedef_17_0= ruleTypeDefinition ) ) | ( (lv_property_18_0= ruleVariable ) ) )*
+            loop22:
+            do {
+                int alt22=7;
+                alt22 = dfa22.predict(input);
+                switch (alt22) {
+            	case 1 :
+            	    // InternalFormalML.g:1094:4: ( (lv_port_13_0= rulePort ) )
+            	    {
+            	    // InternalFormalML.g:1094:4: ( (lv_port_13_0= rulePort ) )
+            	    // InternalFormalML.g:1095:5: (lv_port_13_0= rulePort )
+            	    {
+            	    // InternalFormalML.g:1095:5: (lv_port_13_0= rulePort )
+            	    // InternalFormalML.g:1096:6: lv_port_13_0= rulePort
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getSystemAccess().getPortPortParserRuleCall_6_0_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_port_13_0=rulePort();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getSystemRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"port",
+            	      							lv_port_13_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Port");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:1114:4: ( (lv_signal_14_0= ruleSignal ) )
+            	    {
+            	    // InternalFormalML.g:1114:4: ( (lv_signal_14_0= ruleSignal ) )
+            	    // InternalFormalML.g:1115:5: (lv_signal_14_0= ruleSignal )
+            	    {
+            	    // InternalFormalML.g:1115:5: (lv_signal_14_0= ruleSignal )
+            	    // InternalFormalML.g:1116:6: lv_signal_14_0= ruleSignal
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_6_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_signal_14_0=ruleSignal();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getSystemRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"signal",
+            	      							lv_signal_14_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:1134:4: ( (lv_buffer_15_0= ruleBuffer ) )
+            	    {
+            	    // InternalFormalML.g:1134:4: ( (lv_buffer_15_0= ruleBuffer ) )
+            	    // InternalFormalML.g:1135:5: (lv_buffer_15_0= ruleBuffer )
+            	    {
+            	    // InternalFormalML.g:1135:5: (lv_buffer_15_0= ruleBuffer )
+            	    // InternalFormalML.g:1136:6: lv_buffer_15_0= ruleBuffer
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_6_2_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_buffer_15_0=ruleBuffer();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getSystemRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"buffer",
+            	      							lv_buffer_15_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:1154:4: ( (lv_channel_16_0= ruleChannel ) )
+            	    {
+            	    // InternalFormalML.g:1154:4: ( (lv_channel_16_0= ruleChannel ) )
+            	    // InternalFormalML.g:1155:5: (lv_channel_16_0= ruleChannel )
+            	    {
+            	    // InternalFormalML.g:1155:5: (lv_channel_16_0= ruleChannel )
+            	    // InternalFormalML.g:1156:6: lv_channel_16_0= ruleChannel
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_6_3_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_channel_16_0=ruleChannel();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getSystemRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"channel",
+            	      							lv_channel_16_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 5 :
+            	    // InternalFormalML.g:1174:4: ( (lv_typedef_17_0= ruleTypeDefinition ) )
+            	    {
+            	    // InternalFormalML.g:1174:4: ( (lv_typedef_17_0= ruleTypeDefinition ) )
+            	    // InternalFormalML.g:1175:5: (lv_typedef_17_0= ruleTypeDefinition )
+            	    {
+            	    // InternalFormalML.g:1175:5: (lv_typedef_17_0= ruleTypeDefinition )
+            	    // InternalFormalML.g:1176:6: lv_typedef_17_0= ruleTypeDefinition
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_typedef_17_0=ruleTypeDefinition();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getSystemRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"typedef",
+            	      							lv_typedef_17_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 6 :
+            	    // InternalFormalML.g:1194:4: ( (lv_property_18_0= ruleVariable ) )
+            	    {
+            	    // InternalFormalML.g:1194:4: ( (lv_property_18_0= ruleVariable ) )
+            	    // InternalFormalML.g:1195:5: (lv_property_18_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:1195:5: (lv_property_18_0= ruleVariable )
+            	    // InternalFormalML.g:1196:6: lv_property_18_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_6_5_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_property_18_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getSystemRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"property",
+            	      							lv_property_18_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop22;
+                }
+            } while (true);
+
+            // InternalFormalML.g:1214:3: ( (otherlv_19= '@property:' ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )* ) | (otherlv_26= '@public:' ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )* ) | (otherlv_33= '@protected:' ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )* ) | (otherlv_40= '@private:' ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )* ) )*
+            loop27:
+            do {
+                int alt27=5;
+                switch ( input.LA(1) ) {
+                case 38:
+                    {
+                    alt27=1;
+                    }
+                    break;
+                case 39:
+                    {
+                    alt27=2;
+                    }
+                    break;
+                case 40:
+                    {
+                    alt27=3;
+                    }
+                    break;
+                case 41:
+                    {
+                    alt27=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt27) {
+            	case 1 :
+            	    // InternalFormalML.g:1215:4: (otherlv_19= '@property:' ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )* )
+            	    {
+            	    // InternalFormalML.g:1215:4: (otherlv_19= '@property:' ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )* )
+            	    // InternalFormalML.g:1216:5: otherlv_19= '@property:' ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )*
+            	    {
+            	    otherlv_19=(Token)match(input,38,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_19, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:1220:5: ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )*
+            	    loop23:
+            	    do {
+            	        int alt23=7;
+            	        alt23 = dfa23.predict(input);
+            	        switch (alt23) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1221:6: ( (lv_port_20_0= rulePort ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1221:6: ( (lv_port_20_0= rulePort ) )
+            	    	    // InternalFormalML.g:1222:7: (lv_port_20_0= rulePort )
+            	    	    {
+            	    	    // InternalFormalML.g:1222:7: (lv_port_20_0= rulePort )
+            	    	    // InternalFormalML.g:1223:8: lv_port_20_0= rulePort
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getPortPortParserRuleCall_7_0_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_port_20_0=rulePort();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_20_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Port");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:1241:6: ( (lv_signal_21_0= ruleSignal ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1241:6: ( (lv_signal_21_0= ruleSignal ) )
+            	    	    // InternalFormalML.g:1242:7: (lv_signal_21_0= ruleSignal )
+            	    	    {
+            	    	    // InternalFormalML.g:1242:7: (lv_signal_21_0= ruleSignal )
+            	    	    // InternalFormalML.g:1243:8: lv_signal_21_0= ruleSignal
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalParserRuleCall_7_0_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_signal_21_0=ruleSignal();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_21_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:1261:6: ( (lv_buffer_22_0= ruleBuffer ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1261:6: ( (lv_buffer_22_0= ruleBuffer ) )
+            	    	    // InternalFormalML.g:1262:7: (lv_buffer_22_0= ruleBuffer )
+            	    	    {
+            	    	    // InternalFormalML.g:1262:7: (lv_buffer_22_0= ruleBuffer )
+            	    	    // InternalFormalML.g:1263:8: lv_buffer_22_0= ruleBuffer
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferParserRuleCall_7_0_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_buffer_22_0=ruleBuffer();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_22_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:1281:6: ( (lv_channel_23_0= ruleChannel ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1281:6: ( (lv_channel_23_0= ruleChannel ) )
+            	    	    // InternalFormalML.g:1282:7: (lv_channel_23_0= ruleChannel )
+            	    	    {
+            	    	    // InternalFormalML.g:1282:7: (lv_channel_23_0= ruleChannel )
+            	    	    // InternalFormalML.g:1283:8: lv_channel_23_0= ruleChannel
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelParserRuleCall_7_0_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_channel_23_0=ruleChannel();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_23_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:1301:6: ( (lv_typedef_24_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1301:6: ( (lv_typedef_24_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:1302:7: (lv_typedef_24_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:1302:7: (lv_typedef_24_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:1303:8: lv_typedef_24_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_typedef_24_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_24_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:1321:6: ( (lv_property_25_0= ruleVariable ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1321:6: ( (lv_property_25_0= ruleVariable ) )
+            	    	    // InternalFormalML.g:1322:7: (lv_property_25_0= ruleVariable )
+            	    	    {
+            	    	    // InternalFormalML.g:1322:7: (lv_property_25_0= ruleVariable )
+            	    	    // InternalFormalML.g:1323:8: lv_property_25_0= ruleVariable
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariableParserRuleCall_7_0_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_property_25_0=ruleVariable();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_25_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop23;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:1343:4: (otherlv_26= '@public:' ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )* )
+            	    {
+            	    // InternalFormalML.g:1343:4: (otherlv_26= '@public:' ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )* )
+            	    // InternalFormalML.g:1344:5: otherlv_26= '@public:' ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )*
+            	    {
+            	    otherlv_26=(Token)match(input,39,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_26, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:1348:5: ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )*
+            	    loop24:
+            	    do {
+            	        int alt24=7;
+            	        alt24 = dfa24.predict(input);
+            	        switch (alt24) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1349:6: ( (lv_port_27_0= rulePortPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1349:6: ( (lv_port_27_0= rulePortPublic ) )
+            	    	    // InternalFormalML.g:1350:7: (lv_port_27_0= rulePortPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:1350:7: (lv_port_27_0= rulePortPublic )
+            	    	    // InternalFormalML.g:1351:8: lv_port_27_0= rulePortPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getPortPortPublicParserRuleCall_7_1_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_port_27_0=rulePortPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_27_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:1369:6: ( (lv_signal_28_0= ruleSignalPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1369:6: ( (lv_signal_28_0= ruleSignalPublic ) )
+            	    	    // InternalFormalML.g:1370:7: (lv_signal_28_0= ruleSignalPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:1370:7: (lv_signal_28_0= ruleSignalPublic )
+            	    	    // InternalFormalML.g:1371:8: lv_signal_28_0= ruleSignalPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_signal_28_0=ruleSignalPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_28_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:1389:6: ( (lv_buffer_29_0= ruleBufferPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1389:6: ( (lv_buffer_29_0= ruleBufferPublic ) )
+            	    	    // InternalFormalML.g:1390:7: (lv_buffer_29_0= ruleBufferPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:1390:7: (lv_buffer_29_0= ruleBufferPublic )
+            	    	    // InternalFormalML.g:1391:8: lv_buffer_29_0= ruleBufferPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_buffer_29_0=ruleBufferPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_29_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:1409:6: ( (lv_channel_30_0= ruleChannelPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1409:6: ( (lv_channel_30_0= ruleChannelPublic ) )
+            	    	    // InternalFormalML.g:1410:7: (lv_channel_30_0= ruleChannelPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:1410:7: (lv_channel_30_0= ruleChannelPublic )
+            	    	    // InternalFormalML.g:1411:8: lv_channel_30_0= ruleChannelPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_channel_30_0=ruleChannelPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_30_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:1429:6: ( (lv_typedef_31_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1429:6: ( (lv_typedef_31_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:1430:7: (lv_typedef_31_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:1430:7: (lv_typedef_31_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:1431:8: lv_typedef_31_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_typedef_31_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_31_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:1449:6: ( (lv_property_32_0= ruleVariablePublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1449:6: ( (lv_property_32_0= ruleVariablePublic ) )
+            	    	    // InternalFormalML.g:1450:7: (lv_property_32_0= ruleVariablePublic )
+            	    	    {
+            	    	    // InternalFormalML.g:1450:7: (lv_property_32_0= ruleVariablePublic )
+            	    	    // InternalFormalML.g:1451:8: lv_property_32_0= ruleVariablePublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_property_32_0=ruleVariablePublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_32_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop24;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:1471:4: (otherlv_33= '@protected:' ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )* )
+            	    {
+            	    // InternalFormalML.g:1471:4: (otherlv_33= '@protected:' ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )* )
+            	    // InternalFormalML.g:1472:5: otherlv_33= '@protected:' ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )*
+            	    {
+            	    otherlv_33=(Token)match(input,40,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_33, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:1476:5: ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )*
+            	    loop25:
+            	    do {
+            	        int alt25=7;
+            	        alt25 = dfa25.predict(input);
+            	        switch (alt25) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1477:6: ( (lv_port_34_0= rulePortProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1477:6: ( (lv_port_34_0= rulePortProtected ) )
+            	    	    // InternalFormalML.g:1478:7: (lv_port_34_0= rulePortProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:1478:7: (lv_port_34_0= rulePortProtected )
+            	    	    // InternalFormalML.g:1479:8: lv_port_34_0= rulePortProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_port_34_0=rulePortProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_34_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:1497:6: ( (lv_signal_35_0= ruleSignalProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1497:6: ( (lv_signal_35_0= ruleSignalProtected ) )
+            	    	    // InternalFormalML.g:1498:7: (lv_signal_35_0= ruleSignalProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:1498:7: (lv_signal_35_0= ruleSignalProtected )
+            	    	    // InternalFormalML.g:1499:8: lv_signal_35_0= ruleSignalProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_signal_35_0=ruleSignalProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_35_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:1517:6: ( (lv_buffer_36_0= ruleBufferProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1517:6: ( (lv_buffer_36_0= ruleBufferProtected ) )
+            	    	    // InternalFormalML.g:1518:7: (lv_buffer_36_0= ruleBufferProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:1518:7: (lv_buffer_36_0= ruleBufferProtected )
+            	    	    // InternalFormalML.g:1519:8: lv_buffer_36_0= ruleBufferProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_buffer_36_0=ruleBufferProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_36_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:1537:6: ( (lv_channel_37_0= ruleChannelProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1537:6: ( (lv_channel_37_0= ruleChannelProtected ) )
+            	    	    // InternalFormalML.g:1538:7: (lv_channel_37_0= ruleChannelProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:1538:7: (lv_channel_37_0= ruleChannelProtected )
+            	    	    // InternalFormalML.g:1539:8: lv_channel_37_0= ruleChannelProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_channel_37_0=ruleChannelProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_37_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:1557:6: ( (lv_typedef_38_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1557:6: ( (lv_typedef_38_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:1558:7: (lv_typedef_38_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:1558:7: (lv_typedef_38_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:1559:8: lv_typedef_38_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_typedef_38_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_38_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:1577:6: ( (lv_property_39_0= ruleVariableProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1577:6: ( (lv_property_39_0= ruleVariableProtected ) )
+            	    	    // InternalFormalML.g:1578:7: (lv_property_39_0= ruleVariableProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:1578:7: (lv_property_39_0= ruleVariableProtected )
+            	    	    // InternalFormalML.g:1579:8: lv_property_39_0= ruleVariableProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_property_39_0=ruleVariableProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_39_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop25;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:1599:4: (otherlv_40= '@private:' ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )* )
+            	    {
+            	    // InternalFormalML.g:1599:4: (otherlv_40= '@private:' ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )* )
+            	    // InternalFormalML.g:1600:5: otherlv_40= '@private:' ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )*
+            	    {
+            	    otherlv_40=(Token)match(input,41,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_40, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:1604:5: ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )*
+            	    loop26:
+            	    do {
+            	        int alt26=7;
+            	        alt26 = dfa26.predict(input);
+            	        switch (alt26) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1605:6: ( (lv_port_41_0= rulePortPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1605:6: ( (lv_port_41_0= rulePortPrivate ) )
+            	    	    // InternalFormalML.g:1606:7: (lv_port_41_0= rulePortPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:1606:7: (lv_port_41_0= rulePortPrivate )
+            	    	    // InternalFormalML.g:1607:8: lv_port_41_0= rulePortPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_port_41_0=rulePortPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_41_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:1625:6: ( (lv_signal_42_0= ruleSignalPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1625:6: ( (lv_signal_42_0= ruleSignalPrivate ) )
+            	    	    // InternalFormalML.g:1626:7: (lv_signal_42_0= ruleSignalPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:1626:7: (lv_signal_42_0= ruleSignalPrivate )
+            	    	    // InternalFormalML.g:1627:8: lv_signal_42_0= ruleSignalPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_signal_42_0=ruleSignalPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_42_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:1645:6: ( (lv_buffer_43_0= ruleBufferPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1645:6: ( (lv_buffer_43_0= ruleBufferPrivate ) )
+            	    	    // InternalFormalML.g:1646:7: (lv_buffer_43_0= ruleBufferPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:1646:7: (lv_buffer_43_0= ruleBufferPrivate )
+            	    	    // InternalFormalML.g:1647:8: lv_buffer_43_0= ruleBufferPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_buffer_43_0=ruleBufferPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_43_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:1665:6: ( (lv_channel_44_0= ruleChannelPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1665:6: ( (lv_channel_44_0= ruleChannelPrivate ) )
+            	    	    // InternalFormalML.g:1666:7: (lv_channel_44_0= ruleChannelPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:1666:7: (lv_channel_44_0= ruleChannelPrivate )
+            	    	    // InternalFormalML.g:1667:8: lv_channel_44_0= ruleChannelPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_channel_44_0=ruleChannelPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_44_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:1685:6: ( (lv_typedef_45_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1685:6: ( (lv_typedef_45_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:1686:7: (lv_typedef_45_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:1686:7: (lv_typedef_45_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:1687:8: lv_typedef_45_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_typedef_45_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_45_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:1705:6: ( (lv_property_46_0= ruleVariablePrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1705:6: ( (lv_property_46_0= ruleVariablePrivate ) )
+            	    	    // InternalFormalML.g:1706:7: (lv_property_46_0= ruleVariablePrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:1706:7: (lv_property_46_0= ruleVariablePrivate )
+            	    	    // InternalFormalML.g:1707:8: lv_property_46_0= ruleVariablePrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_property_46_0=ruleVariablePrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_46_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop26;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop27;
+                }
+            } while (true);
+
+            // InternalFormalML.g:1727:3: ( ( ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ ) | (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_52_0= ruleRoutine ) ) | ( (lv_procedure_53_0= ruleProcedure ) ) )+ )
+            int alt33=2;
+            int LA33_0 = input.LA(1);
+
+            if ( (LA33_0==23||(LA33_0>=42 && LA33_0<=51)||LA33_0==69||LA33_0==72||LA33_0==95) ) {
+                alt33=1;
+            }
+            else if ( (LA33_0==19||LA33_0==58||(LA33_0>=93 && LA33_0<=94)||(LA33_0>=240 && LA33_0<=242)) ) {
+                alt33=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 33, 0, input);
+
+                throw nvae;
+            }
+            switch (alt33) {
+                case 1 :
+                    // InternalFormalML.g:1728:4: ( ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ ) | (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ ) )*
+                    {
+                    // InternalFormalML.g:1728:4: ( ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ ) | (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ ) )*
+                    loop31:
+                    do {
+                        int alt31=3;
+                        int LA31_0 = input.LA(1);
+
+                        if ( ((LA31_0>=42 && LA31_0<=43)) ) {
+                            alt31=1;
+                        }
+                        else if ( (LA31_0==44) ) {
+                            alt31=2;
+                        }
+
+
+                        switch (alt31) {
+                    	case 1 :
+                    	    // InternalFormalML.g:1729:5: ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ )
+                    	    {
+                    	    // InternalFormalML.g:1729:5: ( (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+ )
+                    	    // InternalFormalML.g:1730:6: (otherlv_47= '@routine:' | otherlv_48= '@macro:' ) ( (lv_routine_49_0= ruleRoutine ) )+
+                    	    {
+                    	    // InternalFormalML.g:1730:6: (otherlv_47= '@routine:' | otherlv_48= '@macro:' )
+                    	    int alt28=2;
+                    	    int LA28_0 = input.LA(1);
+
+                    	    if ( (LA28_0==42) ) {
+                    	        alt28=1;
+                    	    }
+                    	    else if ( (LA28_0==43) ) {
+                    	        alt28=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 28, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt28) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:1731:7: otherlv_47= '@routine:'
+                    	            {
+                    	            otherlv_47=(Token)match(input,42,FollowSets000.FOLLOW_26); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_47, grammarAccess.getSystemAccess().getRoutineKeyword_8_0_0_0_0());
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:1736:7: otherlv_48= '@macro:'
+                    	            {
+                    	            otherlv_48=(Token)match(input,43,FollowSets000.FOLLOW_26); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_48, grammarAccess.getSystemAccess().getMacroKeyword_8_0_0_0_1());
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    // InternalFormalML.g:1741:6: ( (lv_routine_49_0= ruleRoutine ) )+
+                    	    int cnt29=0;
+                    	    loop29:
+                    	    do {
+                    	        int alt29=2;
+                    	        int LA29_0 = input.LA(1);
+
+                    	        if ( (LA29_0==19||(LA29_0>=93 && LA29_0<=94)||(LA29_0>=240 && LA29_0<=242)) ) {
+                    	            alt29=1;
+                    	        }
+
+
+                    	        switch (alt29) {
+                    	    	case 1 :
+                    	    	    // InternalFormalML.g:1742:7: (lv_routine_49_0= ruleRoutine )
+                    	    	    {
+                    	    	    // InternalFormalML.g:1742:7: (lv_routine_49_0= ruleRoutine )
+                    	    	    // InternalFormalML.g:1743:8: lv_routine_49_0= ruleRoutine
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								newCompositeNode(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0());
+                    	    	      							
+                    	    	    }
+                    	    	    pushFollow(FollowSets000.FOLLOW_27);
+                    	    	    lv_routine_49_0=ruleRoutine();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								if (current==null) {
+                    	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+                    	    	      								}
+                    	    	      								add(
+                    	    	      									current,
+                    	    	      									"routine",
+                    	    	      									lv_routine_49_0,
+                    	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+                    	    	      								afterParserOrEnumRuleCall();
+                    	    	      							
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    if ( cnt29 >= 1 ) break loop29;
+                    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                EarlyExitException eee =
+                    	                    new EarlyExitException(29, input);
+                    	                throw eee;
+                    	        }
+                    	        cnt29++;
+                    	    } while (true);
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:1762:5: (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ )
+                    	    {
+                    	    // InternalFormalML.g:1762:5: (otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+ )
+                    	    // InternalFormalML.g:1763:6: otherlv_50= '@procedure:' ( (lv_procedure_51_0= ruleProcedure ) )+
+                    	    {
+                    	    otherlv_50=(Token)match(input,44,FollowSets000.FOLLOW_25); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_50, grammarAccess.getSystemAccess().getProcedureKeyword_8_0_1_0());
+                    	      					
+                    	    }
+                    	    // InternalFormalML.g:1767:6: ( (lv_procedure_51_0= ruleProcedure ) )+
+                    	    int cnt30=0;
+                    	    loop30:
+                    	    do {
+                    	        int alt30=2;
+                    	        int LA30_0 = input.LA(1);
+
+                    	        if ( (LA30_0==19||LA30_0==58||(LA30_0>=240 && LA30_0<=242)) ) {
+                    	            alt30=1;
+                    	        }
+
+
+                    	        switch (alt30) {
+                    	    	case 1 :
+                    	    	    // InternalFormalML.g:1768:7: (lv_procedure_51_0= ruleProcedure )
+                    	    	    {
+                    	    	    // InternalFormalML.g:1768:7: (lv_procedure_51_0= ruleProcedure )
+                    	    	    // InternalFormalML.g:1769:8: lv_procedure_51_0= ruleProcedure
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								newCompositeNode(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0());
+                    	    	      							
+                    	    	    }
+                    	    	    pushFollow(FollowSets000.FOLLOW_25);
+                    	    	    lv_procedure_51_0=ruleProcedure();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								if (current==null) {
+                    	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+                    	    	      								}
+                    	    	      								add(
+                    	    	      									current,
+                    	    	      									"procedure",
+                    	    	      									lv_procedure_51_0,
+                    	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+                    	    	      								afterParserOrEnumRuleCall();
+                    	    	      							
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    if ( cnt30 >= 1 ) break loop30;
+                    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                EarlyExitException eee =
+                    	                    new EarlyExitException(30, input);
+                    	                throw eee;
+                    	        }
+                    	        cnt30++;
+                    	    } while (true);
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop31;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:1789:4: ( ( (lv_routine_52_0= ruleRoutine ) ) | ( (lv_procedure_53_0= ruleProcedure ) ) )+
+                    {
+                    // InternalFormalML.g:1789:4: ( ( (lv_routine_52_0= ruleRoutine ) ) | ( (lv_procedure_53_0= ruleProcedure ) ) )+
+                    int cnt32=0;
+                    loop32:
+                    do {
+                        int alt32=3;
+                        switch ( input.LA(1) ) {
+                        case 240:
+                            {
+                            int LA32_2 = input.LA(2);
+
+                            if ( (LA32_2==58) ) {
+                                alt32=2;
+                            }
+                            else if ( ((LA32_2>=93 && LA32_2<=94)) ) {
+                                alt32=1;
+                            }
+
+
+                            }
+                            break;
+                        case 241:
+                            {
+                            int LA32_3 = input.LA(2);
+
+                            if ( ((LA32_3>=93 && LA32_3<=94)) ) {
+                                alt32=1;
+                            }
+                            else if ( (LA32_3==58) ) {
+                                alt32=2;
+                            }
+
+
+                            }
+                            break;
+                        case 242:
+                            {
+                            int LA32_4 = input.LA(2);
+
+                            if ( (LA32_4==58) ) {
+                                alt32=2;
+                            }
+                            else if ( ((LA32_4>=93 && LA32_4<=94)) ) {
+                                alt32=1;
+                            }
+
+
+                            }
+                            break;
+                        case 19:
+                            {
+                            int LA32_5 = input.LA(2);
+
+                            if ( ((LA32_5>=93 && LA32_5<=94)) ) {
+                                alt32=1;
+                            }
+                            else if ( (LA32_5==58) ) {
+                                alt32=2;
+                            }
+
+
+                            }
+                            break;
+                        case 93:
+                        case 94:
+                            {
+                            alt32=1;
+                            }
+                            break;
+                        case 58:
+                            {
+                            alt32=2;
+                            }
+                            break;
+
+                        }
+
+                        switch (alt32) {
+                    	case 1 :
+                    	    // InternalFormalML.g:1790:5: ( (lv_routine_52_0= ruleRoutine ) )
+                    	    {
+                    	    // InternalFormalML.g:1790:5: ( (lv_routine_52_0= ruleRoutine ) )
+                    	    // InternalFormalML.g:1791:6: (lv_routine_52_0= ruleRoutine )
+                    	    {
+                    	    // InternalFormalML.g:1791:6: (lv_routine_52_0= ruleRoutine )
+                    	    // InternalFormalML.g:1792:7: lv_routine_52_0= ruleRoutine
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getSystemAccess().getRoutineRoutineParserRuleCall_8_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_25);
+                    	    lv_routine_52_0=ruleRoutine();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getSystemRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"routine",
+                    	      								lv_routine_52_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:1810:5: ( (lv_procedure_53_0= ruleProcedure ) )
+                    	    {
+                    	    // InternalFormalML.g:1810:5: ( (lv_procedure_53_0= ruleProcedure ) )
+                    	    // InternalFormalML.g:1811:6: (lv_procedure_53_0= ruleProcedure )
+                    	    {
+                    	    // InternalFormalML.g:1811:6: (lv_procedure_53_0= ruleProcedure )
+                    	    // InternalFormalML.g:1812:7: lv_procedure_53_0= ruleProcedure
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getSystemAccess().getProcedureProcedureParserRuleCall_8_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_25);
+                    	    lv_procedure_53_0=ruleProcedure();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getSystemRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"procedure",
+                    	      								lv_procedure_53_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt32 >= 1 ) break loop32;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(32, input);
+                                throw eee;
+                        }
+                        cnt32++;
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:1831:3: ( ( (otherlv_54= '@composite:' | otherlv_55= '@machine:' ) ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+ ) | (otherlv_58= '@model:' ( (lv_machine_59_0= ruleAnyMachineBlock ) )* ) | (otherlv_60= '@prototype:' ( (lv_machine_61_0= ruleAnyMachineBlock ) )* ) | (otherlv_62= '@instance:' ( (lv_instance_63_0= ruleInstanceMachine ) )* ) )*
+            loop39:
+            do {
+                int alt39=5;
+                switch ( input.LA(1) ) {
+                case 45:
+                case 46:
+                    {
+                    alt39=1;
+                    }
+                    break;
+                case 47:
+                    {
+                    alt39=2;
+                    }
+                    break;
+                case 48:
+                    {
+                    alt39=3;
+                    }
+                    break;
+                case 49:
+                    {
+                    alt39=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt39) {
+            	case 1 :
+            	    // InternalFormalML.g:1832:4: ( (otherlv_54= '@composite:' | otherlv_55= '@machine:' ) ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+ )
+            	    {
+            	    // InternalFormalML.g:1832:4: ( (otherlv_54= '@composite:' | otherlv_55= '@machine:' ) ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+ )
+            	    // InternalFormalML.g:1833:5: (otherlv_54= '@composite:' | otherlv_55= '@machine:' ) ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+
+            	    {
+            	    // InternalFormalML.g:1833:5: (otherlv_54= '@composite:' | otherlv_55= '@machine:' )
+            	    int alt34=2;
+            	    int LA34_0 = input.LA(1);
+
+            	    if ( (LA34_0==45) ) {
+            	        alt34=1;
+            	    }
+            	    else if ( (LA34_0==46) ) {
+            	        alt34=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 34, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt34) {
+            	        case 1 :
+            	            // InternalFormalML.g:1834:6: otherlv_54= '@composite:'
+            	            {
+            	            otherlv_54=(Token)match(input,45,FollowSets000.FOLLOW_28); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_54, grammarAccess.getSystemAccess().getCompositeKeyword_9_0_0_0());
+            	              					
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:1839:6: otherlv_55= '@machine:'
+            	            {
+            	            otherlv_55=(Token)match(input,46,FollowSets000.FOLLOW_28); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_55, grammarAccess.getSystemAccess().getMachineKeyword_9_0_0_1());
+            	              					
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalFormalML.g:1844:5: ( ( (lv_machine_56_0= ruleAnyMachineBlock ) ) | ( (lv_instance_57_0= ruleInstanceMachine ) ) )+
+            	    int cnt35=0;
+            	    loop35:
+            	    do {
+            	        int alt35=3;
+            	        int LA35_0 = input.LA(1);
+
+            	        if ( (LA35_0==19||(LA35_0>=32 && LA35_0<=33)||(LA35_0>=53 && LA35_0<=54)||(LA35_0>=240 && LA35_0<=244)) ) {
+            	            alt35=1;
+            	        }
+            	        else if ( (LA35_0==52) ) {
+            	            alt35=2;
+            	        }
+
+
+            	        switch (alt35) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1845:6: ( (lv_machine_56_0= ruleAnyMachineBlock ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1845:6: ( (lv_machine_56_0= ruleAnyMachineBlock ) )
+            	    	    // InternalFormalML.g:1846:7: (lv_machine_56_0= ruleAnyMachineBlock )
+            	    	    {
+            	    	    // InternalFormalML.g:1846:7: (lv_machine_56_0= ruleAnyMachineBlock )
+            	    	    // InternalFormalML.g:1847:8: lv_machine_56_0= ruleAnyMachineBlock
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_29);
+            	    	    lv_machine_56_0=ruleAnyMachineBlock();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"machine",
+            	    	      									lv_machine_56_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:1865:6: ( (lv_instance_57_0= ruleInstanceMachine ) )
+            	    	    {
+            	    	    // InternalFormalML.g:1865:6: ( (lv_instance_57_0= ruleInstanceMachine ) )
+            	    	    // InternalFormalML.g:1866:7: (lv_instance_57_0= ruleInstanceMachine )
+            	    	    {
+            	    	    // InternalFormalML.g:1866:7: (lv_instance_57_0= ruleInstanceMachine )
+            	    	    // InternalFormalML.g:1867:8: lv_instance_57_0= ruleInstanceMachine
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_29);
+            	    	    lv_instance_57_0=ruleInstanceMachine();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"instance",
+            	    	      									lv_instance_57_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    if ( cnt35 >= 1 ) break loop35;
+            	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	                EarlyExitException eee =
+            	                    new EarlyExitException(35, input);
+            	                throw eee;
+            	        }
+            	        cnt35++;
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:1887:4: (otherlv_58= '@model:' ( (lv_machine_59_0= ruleAnyMachineBlock ) )* )
+            	    {
+            	    // InternalFormalML.g:1887:4: (otherlv_58= '@model:' ( (lv_machine_59_0= ruleAnyMachineBlock ) )* )
+            	    // InternalFormalML.g:1888:5: otherlv_58= '@model:' ( (lv_machine_59_0= ruleAnyMachineBlock ) )*
+            	    {
+            	    otherlv_58=(Token)match(input,47,FollowSets000.FOLLOW_30); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_58, grammarAccess.getSystemAccess().getModelKeyword_9_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:1892:5: ( (lv_machine_59_0= ruleAnyMachineBlock ) )*
+            	    loop36:
+            	    do {
+            	        int alt36=2;
+            	        int LA36_0 = input.LA(1);
+
+            	        if ( (LA36_0==19||(LA36_0>=32 && LA36_0<=33)||(LA36_0>=53 && LA36_0<=54)||(LA36_0>=240 && LA36_0<=244)) ) {
+            	            alt36=1;
+            	        }
+
+
+            	        switch (alt36) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1893:6: (lv_machine_59_0= ruleAnyMachineBlock )
+            	    	    {
+            	    	    // InternalFormalML.g:1893:6: (lv_machine_59_0= ruleAnyMachineBlock )
+            	    	    // InternalFormalML.g:1894:7: lv_machine_59_0= ruleAnyMachineBlock
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_30);
+            	    	    lv_machine_59_0=ruleAnyMachineBlock();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"machine",
+            	    	      								lv_machine_59_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop36;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:1913:4: (otherlv_60= '@prototype:' ( (lv_machine_61_0= ruleAnyMachineBlock ) )* )
+            	    {
+            	    // InternalFormalML.g:1913:4: (otherlv_60= '@prototype:' ( (lv_machine_61_0= ruleAnyMachineBlock ) )* )
+            	    // InternalFormalML.g:1914:5: otherlv_60= '@prototype:' ( (lv_machine_61_0= ruleAnyMachineBlock ) )*
+            	    {
+            	    otherlv_60=(Token)match(input,48,FollowSets000.FOLLOW_30); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_60, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:1918:5: ( (lv_machine_61_0= ruleAnyMachineBlock ) )*
+            	    loop37:
+            	    do {
+            	        int alt37=2;
+            	        int LA37_0 = input.LA(1);
+
+            	        if ( (LA37_0==19||(LA37_0>=32 && LA37_0<=33)||(LA37_0>=53 && LA37_0<=54)||(LA37_0>=240 && LA37_0<=244)) ) {
+            	            alt37=1;
+            	        }
+
+
+            	        switch (alt37) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1919:6: (lv_machine_61_0= ruleAnyMachineBlock )
+            	    	    {
+            	    	    // InternalFormalML.g:1919:6: (lv_machine_61_0= ruleAnyMachineBlock )
+            	    	    // InternalFormalML.g:1920:7: lv_machine_61_0= ruleAnyMachineBlock
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getSystemAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_30);
+            	    	    lv_machine_61_0=ruleAnyMachineBlock();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"machine",
+            	    	      								lv_machine_61_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop37;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:1939:4: (otherlv_62= '@instance:' ( (lv_instance_63_0= ruleInstanceMachine ) )* )
+            	    {
+            	    // InternalFormalML.g:1939:4: (otherlv_62= '@instance:' ( (lv_instance_63_0= ruleInstanceMachine ) )* )
+            	    // InternalFormalML.g:1940:5: otherlv_62= '@instance:' ( (lv_instance_63_0= ruleInstanceMachine ) )*
+            	    {
+            	    otherlv_62=(Token)match(input,49,FollowSets000.FOLLOW_29); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_62, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:1944:5: ( (lv_instance_63_0= ruleInstanceMachine ) )*
+            	    loop38:
+            	    do {
+            	        int alt38=2;
+            	        int LA38_0 = input.LA(1);
+
+            	        if ( (LA38_0==52) ) {
+            	            alt38=1;
+            	        }
+
+
+            	        switch (alt38) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1945:6: (lv_instance_63_0= ruleInstanceMachine )
+            	    	    {
+            	    	    // InternalFormalML.g:1945:6: (lv_instance_63_0= ruleInstanceMachine )
+            	    	    // InternalFormalML.g:1946:7: lv_instance_63_0= ruleInstanceMachine
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getSystemAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_29);
+            	    	    lv_instance_63_0=ruleInstanceMachine();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"instance",
+            	    	      								lv_instance_63_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop38;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop39;
+                }
+            } while (true);
+
+            // InternalFormalML.g:1965:3: ( (otherlv_64= '@behavior:' ( (lv_behavior_65_0= ruleBehavior ) )+ ) | (otherlv_66= '@statemachine:' ( (lv_behavior_67_0= ruleStatemachine ) )+ ) )*
+            loop42:
+            do {
+                int alt42=3;
+                int LA42_0 = input.LA(1);
+
+                if ( (LA42_0==50) ) {
+                    alt42=1;
+                }
+                else if ( (LA42_0==51) ) {
+                    alt42=2;
+                }
+
+
+                switch (alt42) {
+            	case 1 :
+            	    // InternalFormalML.g:1966:4: (otherlv_64= '@behavior:' ( (lv_behavior_65_0= ruleBehavior ) )+ )
+            	    {
+            	    // InternalFormalML.g:1966:4: (otherlv_64= '@behavior:' ( (lv_behavior_65_0= ruleBehavior ) )+ )
+            	    // InternalFormalML.g:1967:5: otherlv_64= '@behavior:' ( (lv_behavior_65_0= ruleBehavior ) )+
+            	    {
+            	    otherlv_64=(Token)match(input,50,FollowSets000.FOLLOW_31); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_64, grammarAccess.getSystemAccess().getBehaviorKeyword_10_0_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:1971:5: ( (lv_behavior_65_0= ruleBehavior ) )+
+            	    int cnt40=0;
+            	    loop40:
+            	    do {
+            	        int alt40=2;
+            	        int LA40_0 = input.LA(1);
+
+            	        if ( (LA40_0==19||(LA40_0>=32 && LA40_0<=33)||LA40_0==54||(LA40_0>=240 && LA40_0<=244)) ) {
+            	            alt40=1;
+            	        }
+
+
+            	        switch (alt40) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1972:6: (lv_behavior_65_0= ruleBehavior )
+            	    	    {
+            	    	    // InternalFormalML.g:1972:6: (lv_behavior_65_0= ruleBehavior )
+            	    	    // InternalFormalML.g:1973:7: lv_behavior_65_0= ruleBehavior
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getSystemAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_32);
+            	    	    lv_behavior_65_0=ruleBehavior();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"behavior",
+            	    	      								lv_behavior_65_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.Behavior");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    if ( cnt40 >= 1 ) break loop40;
+            	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	                EarlyExitException eee =
+            	                    new EarlyExitException(40, input);
+            	                throw eee;
+            	        }
+            	        cnt40++;
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:1992:4: (otherlv_66= '@statemachine:' ( (lv_behavior_67_0= ruleStatemachine ) )+ )
+            	    {
+            	    // InternalFormalML.g:1992:4: (otherlv_66= '@statemachine:' ( (lv_behavior_67_0= ruleStatemachine ) )+ )
+            	    // InternalFormalML.g:1993:5: otherlv_66= '@statemachine:' ( (lv_behavior_67_0= ruleStatemachine ) )+
+            	    {
+            	    otherlv_66=(Token)match(input,51,FollowSets000.FOLLOW_31); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_66, grammarAccess.getSystemAccess().getStatemachineKeyword_10_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:1997:5: ( (lv_behavior_67_0= ruleStatemachine ) )+
+            	    int cnt41=0;
+            	    loop41:
+            	    do {
+            	        int alt41=2;
+            	        int LA41_0 = input.LA(1);
+
+            	        if ( (LA41_0==19||(LA41_0>=32 && LA41_0<=33)||LA41_0==54||(LA41_0>=240 && LA41_0<=244)) ) {
+            	            alt41=1;
+            	        }
+
+
+            	        switch (alt41) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:1998:6: (lv_behavior_67_0= ruleStatemachine )
+            	    	    {
+            	    	    // InternalFormalML.g:1998:6: (lv_behavior_67_0= ruleStatemachine )
+            	    	    // InternalFormalML.g:1999:7: lv_behavior_67_0= ruleStatemachine
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getSystemAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_32);
+            	    	    lv_behavior_67_0=ruleStatemachine();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getSystemRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"behavior",
+            	    	      								lv_behavior_67_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.Statemachine");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    if ( cnt41 >= 1 ) break loop41;
+            	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	                EarlyExitException eee =
+            	                    new EarlyExitException(41, input);
+            	                throw eee;
+            	        }
+            	        cnt41++;
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop42;
+                }
+            } while (true);
+
+            // InternalFormalML.g:2018:3: ( (lv_main_68_0= ruleMoeBehavior ) )
+            // InternalFormalML.g:2019:4: (lv_main_68_0= ruleMoeBehavior )
+            {
+            // InternalFormalML.g:2019:4: (lv_main_68_0= ruleMoeBehavior )
+            // InternalFormalML.g:2020:5: lv_main_68_0= ruleMoeBehavior
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSystemAccess().getMainMoeBehaviorParserRuleCall_11_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_33);
+            lv_main_68_0=ruleMoeBehavior();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSystemRule());
+              					}
+              					set(
+              						current,
+              						"main",
+              						lv_main_68_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.MoeBehavior");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_69=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_69, grammarAccess.getSystemAccess().getRightCurlyBracketKeyword_12());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSystem"
+
+
+    // $ANTLR start "entryRuleAnyMachineBlock"
+    // InternalFormalML.g:2048:1: entryRuleAnyMachineBlock returns [EObject current=null] : iv_ruleAnyMachineBlock= ruleAnyMachineBlock EOF ;
+    public final EObject entryRuleAnyMachineBlock() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleAnyMachineBlock = null;
+
+
+        try {
+            // InternalFormalML.g:2048:56: (iv_ruleAnyMachineBlock= ruleAnyMachineBlock EOF )
+            // InternalFormalML.g:2049:2: iv_ruleAnyMachineBlock= ruleAnyMachineBlock EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getAnyMachineBlockRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleAnyMachineBlock=ruleAnyMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleAnyMachineBlock; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleAnyMachineBlock"
+
+
+    // $ANTLR start "ruleAnyMachineBlock"
+    // InternalFormalML.g:2055:1: ruleAnyMachineBlock returns [EObject current=null] : (this_MachineBlock_0= ruleMachineBlock | this_Statemachine_1= ruleStatemachine ) ;
+    public final EObject ruleAnyMachineBlock() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_MachineBlock_0 = null;
+
+        EObject this_Statemachine_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:2061:2: ( (this_MachineBlock_0= ruleMachineBlock | this_Statemachine_1= ruleStatemachine ) )
+            // InternalFormalML.g:2062:2: (this_MachineBlock_0= ruleMachineBlock | this_Statemachine_1= ruleStatemachine )
+            {
+            // InternalFormalML.g:2062:2: (this_MachineBlock_0= ruleMachineBlock | this_Statemachine_1= ruleStatemachine )
+            int alt43=2;
+            alt43 = dfa43.predict(input);
+            switch (alt43) {
+                case 1 :
+                    // InternalFormalML.g:2063:3: this_MachineBlock_0= ruleMachineBlock
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getAnyMachineBlockAccess().getMachineBlockParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_MachineBlock_0=ruleMachineBlock();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_MachineBlock_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:2075:3: this_Statemachine_1= ruleStatemachine
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getAnyMachineBlockAccess().getStatemachineParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_Statemachine_1=ruleStatemachine();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_Statemachine_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleAnyMachineBlock"
+
+
+    // $ANTLR start "entryRuleInstanceMachine"
+    // InternalFormalML.g:2090:1: entryRuleInstanceMachine returns [EObject current=null] : iv_ruleInstanceMachine= ruleInstanceMachine EOF ;
+    public final EObject entryRuleInstanceMachine() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleInstanceMachine = null;
+
+
+        try {
+            // InternalFormalML.g:2090:56: (iv_ruleInstanceMachine= ruleInstanceMachine EOF )
+            // InternalFormalML.g:2091:2: iv_ruleInstanceMachine= ruleInstanceMachine EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getInstanceMachineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleInstanceMachine=ruleInstanceMachine();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleInstanceMachine; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleInstanceMachine"
+
+
+    // $ANTLR start "ruleInstanceMachine"
+    // InternalFormalML.g:2097:1: ruleInstanceMachine returns [EObject current=null] : (otherlv_0= 'instance' (otherlv_1= 'machine' | otherlv_2= 'statemachine' )? otherlv_3= '<' (otherlv_4= 'model:' )? ( ( ruleESUfid ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( ( (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )? otherlv_14= ';' ) | (otherlv_15= '{' ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )* otherlv_18= '}' ) ) ) ;
+    public final EObject ruleInstanceMachine() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_15=null;
+        Token otherlv_17=null;
+        Token otherlv_18=null;
+        AntlrDatatypeRuleToken lv_name_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_slot_10_0 = null;
+
+        EObject lv_slot_12_0 = null;
+
+        EObject lv_slot_16_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:2103:2: ( (otherlv_0= 'instance' (otherlv_1= 'machine' | otherlv_2= 'statemachine' )? otherlv_3= '<' (otherlv_4= 'model:' )? ( ( ruleESUfid ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( ( (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )? otherlv_14= ';' ) | (otherlv_15= '{' ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )* otherlv_18= '}' ) ) ) )
+            // InternalFormalML.g:2104:2: (otherlv_0= 'instance' (otherlv_1= 'machine' | otherlv_2= 'statemachine' )? otherlv_3= '<' (otherlv_4= 'model:' )? ( ( ruleESUfid ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( ( (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )? otherlv_14= ';' ) | (otherlv_15= '{' ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )* otherlv_18= '}' ) ) )
+            {
+            // InternalFormalML.g:2104:2: (otherlv_0= 'instance' (otherlv_1= 'machine' | otherlv_2= 'statemachine' )? otherlv_3= '<' (otherlv_4= 'model:' )? ( ( ruleESUfid ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( ( (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )? otherlv_14= ';' ) | (otherlv_15= '{' ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )* otherlv_18= '}' ) ) )
+            // InternalFormalML.g:2105:3: otherlv_0= 'instance' (otherlv_1= 'machine' | otherlv_2= 'statemachine' )? otherlv_3= '<' (otherlv_4= 'model:' )? ( ( ruleESUfid ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( ( (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )? otherlv_14= ';' ) | (otherlv_15= '{' ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )* otherlv_18= '}' ) )
+            {
+            otherlv_0=(Token)match(input,52,FollowSets000.FOLLOW_34); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getInstanceMachineAccess().getInstanceKeyword_0());
+              		
+            }
+            // InternalFormalML.g:2109:3: (otherlv_1= 'machine' | otherlv_2= 'statemachine' )?
+            int alt44=3;
+            int LA44_0 = input.LA(1);
+
+            if ( (LA44_0==53) ) {
+                alt44=1;
+            }
+            else if ( (LA44_0==54) ) {
+                alt44=2;
+            }
+            switch (alt44) {
+                case 1 :
+                    // InternalFormalML.g:2110:4: otherlv_1= 'machine'
+                    {
+                    otherlv_1=(Token)match(input,53,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getInstanceMachineAccess().getMachineKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:2115:4: otherlv_2= 'statemachine'
+                    {
+                    otherlv_2=(Token)match(input,54,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getInstanceMachineAccess().getStatemachineKeyword_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,16,FollowSets000.FOLLOW_35); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getInstanceMachineAccess().getLessThanSignKeyword_2());
+              		
+            }
+            // InternalFormalML.g:2124:3: (otherlv_4= 'model:' )?
+            int alt45=2;
+            int LA45_0 = input.LA(1);
+
+            if ( (LA45_0==55) ) {
+                alt45=1;
+            }
+            switch (alt45) {
+                case 1 :
+                    // InternalFormalML.g:2125:4: otherlv_4= 'model:'
+                    {
+                    otherlv_4=(Token)match(input,55,FollowSets000.FOLLOW_35); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getInstanceMachineAccess().getModelKeyword_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:2130:3: ( ( ruleESUfid ) )
+            // InternalFormalML.g:2131:4: ( ruleESUfid )
+            {
+            // InternalFormalML.g:2131:4: ( ruleESUfid )
+            // InternalFormalML.g:2132:5: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+
+              					/* */
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getInstanceMachineRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getInstanceMachineAccess().getModelMachineCrossReference_4_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_23);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getInstanceMachineAccess().getGreaterThanSignKeyword_5());
+              		
+            }
+            // InternalFormalML.g:2153:3: ( (lv_name_7_0= ruleESIdentifier ) )
+            // InternalFormalML.g:2154:4: (lv_name_7_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:2154:4: (lv_name_7_0= ruleESIdentifier )
+            // InternalFormalML.g:2155:5: lv_name_7_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getInstanceMachineAccess().getNameESIdentifierParserRuleCall_6_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_36);
+            lv_name_7_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:2172:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt46=2;
+            int LA46_0 = input.LA(1);
+
+            if ( (LA46_0==RULE_STRING) ) {
+                alt46=1;
+            }
+            switch (alt46) {
+                case 1 :
+                    // InternalFormalML.g:2173:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:2173:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:2174:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getInstanceMachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_37);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:2191:3: ( ( (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )? otherlv_14= ';' ) | (otherlv_15= '{' ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )* otherlv_18= '}' ) )
+            int alt51=2;
+            int LA51_0 = input.LA(1);
+
+            if ( (LA51_0==25||LA51_0==56) ) {
+                alt51=1;
+            }
+            else if ( (LA51_0==22) ) {
+                alt51=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 51, 0, input);
+
+                throw nvae;
+            }
+            switch (alt51) {
+                case 1 :
+                    // InternalFormalML.g:2192:4: ( (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )? otherlv_14= ';' )
+                    {
+                    // InternalFormalML.g:2192:4: ( (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )? otherlv_14= ';' )
+                    // InternalFormalML.g:2193:5: (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )? otherlv_14= ';'
+                    {
+                    // InternalFormalML.g:2193:5: (otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')' )?
+                    int alt49=2;
+                    int LA49_0 = input.LA(1);
+
+                    if ( (LA49_0==56) ) {
+                        alt49=1;
+                    }
+                    switch (alt49) {
+                        case 1 :
+                            // InternalFormalML.g:2194:6: otherlv_9= '(' ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )? otherlv_13= ')'
+                            {
+                            otherlv_9=(Token)match(input,56,FollowSets000.FOLLOW_38); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_9, grammarAccess.getInstanceMachineAccess().getLeftParenthesisKeyword_8_0_0_0());
+                              					
+                            }
+                            // InternalFormalML.g:2198:6: ( ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )* )?
+                            int alt48=2;
+                            int LA48_0 = input.LA(1);
+
+                            if ( (LA48_0==RULE_XLIA_ID) ) {
+                                alt48=1;
+                            }
+                            switch (alt48) {
+                                case 1 :
+                                    // InternalFormalML.g:2199:7: ( (lv_slot_10_0= ruleSlotParameter ) ) (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )*
+                                    {
+                                    // InternalFormalML.g:2199:7: ( (lv_slot_10_0= ruleSlotParameter ) )
+                                    // InternalFormalML.g:2200:8: (lv_slot_10_0= ruleSlotParameter )
+                                    {
+                                    // InternalFormalML.g:2200:8: (lv_slot_10_0= ruleSlotParameter )
+                                    // InternalFormalML.g:2201:9: lv_slot_10_0= ruleSlotParameter
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_0_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_39);
+                                    lv_slot_10_0=ruleSlotParameter();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+                                      									}
+                                      									add(
+                                      										current,
+                                      										"slot",
+                                      										lv_slot_10_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    // InternalFormalML.g:2218:7: (otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) ) )*
+                                    loop47:
+                                    do {
+                                        int alt47=2;
+                                        int LA47_0 = input.LA(1);
+
+                                        if ( (LA47_0==20) ) {
+                                            alt47=1;
+                                        }
+
+
+                                        switch (alt47) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:2219:8: otherlv_11= ',' ( (lv_slot_12_0= ruleSlotParameter ) )
+                                    	    {
+                                    	    otherlv_11=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      								newLeafNode(otherlv_11, grammarAccess.getInstanceMachineAccess().getCommaKeyword_8_0_0_1_1_0());
+                                    	      							
+                                    	    }
+                                    	    // InternalFormalML.g:2223:8: ( (lv_slot_12_0= ruleSlotParameter ) )
+                                    	    // InternalFormalML.g:2224:9: (lv_slot_12_0= ruleSlotParameter )
+                                    	    {
+                                    	    // InternalFormalML.g:2224:9: (lv_slot_12_0= ruleSlotParameter )
+                                    	    // InternalFormalML.g:2225:10: lv_slot_12_0= ruleSlotParameter
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										newCompositeNode(grammarAccess.getInstanceMachineAccess().getSlotSlotParameterParserRuleCall_8_0_0_1_1_1_0());
+                                    	      									
+                                    	    }
+                                    	    pushFollow(FollowSets000.FOLLOW_39);
+                                    	    lv_slot_12_0=ruleSlotParameter();
+
+                                    	    state._fsp--;
+                                    	    if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										if (current==null) {
+                                    	      											current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+                                    	      										}
+                                    	      										add(
+                                    	      											current,
+                                    	      											"slot",
+                                    	      											lv_slot_12_0,
+                                    	      											"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
+                                    	      										afterParserOrEnumRuleCall();
+                                    	      									
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop47;
+                                        }
+                                    } while (true);
+
+
+                                    }
+                                    break;
+
+                            }
+
+                            otherlv_13=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_13, grammarAccess.getInstanceMachineAccess().getRightParenthesisKeyword_8_0_0_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_14=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_14, grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_0_1());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:2255:4: (otherlv_15= '{' ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )* otherlv_18= '}' )
+                    {
+                    // InternalFormalML.g:2255:4: (otherlv_15= '{' ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )* otherlv_18= '}' )
+                    // InternalFormalML.g:2256:5: otherlv_15= '{' ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )* otherlv_18= '}'
+                    {
+                    otherlv_15=(Token)match(input,22,FollowSets000.FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_15, grammarAccess.getInstanceMachineAccess().getLeftCurlyBracketKeyword_8_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:2260:5: ( ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';' )*
+                    loop50:
+                    do {
+                        int alt50=2;
+                        int LA50_0 = input.LA(1);
+
+                        if ( (LA50_0==RULE_XLIA_ID) ) {
+                            alt50=1;
+                        }
+
+
+                        switch (alt50) {
+                    	case 1 :
+                    	    // InternalFormalML.g:2261:6: ( (lv_slot_16_0= ruleSlotProperty ) ) otherlv_17= ';'
+                    	    {
+                    	    // InternalFormalML.g:2261:6: ( (lv_slot_16_0= ruleSlotProperty ) )
+                    	    // InternalFormalML.g:2262:7: (lv_slot_16_0= ruleSlotProperty )
+                    	    {
+                    	    // InternalFormalML.g:2262:7: (lv_slot_16_0= ruleSlotProperty )
+                    	    // InternalFormalML.g:2263:8: lv_slot_16_0= ruleSlotProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getInstanceMachineAccess().getSlotSlotPropertyParserRuleCall_8_1_1_0_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_14);
+                    	    lv_slot_16_0=ruleSlotProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getInstanceMachineRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"slot",
+                    	      									lv_slot_16_0,
+                    	      									"org.eclipse.efm.formalml.xtext.FormalML.SlotProperty");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    otherlv_17=(Token)match(input,25,FollowSets000.FOLLOW_11); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_17, grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_1_1_1());
+                    	      					
+                    	    }
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop50;
+                        }
+                    } while (true);
+
+                    otherlv_18=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_18, grammarAccess.getInstanceMachineAccess().getRightCurlyBracketKeyword_8_1_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleInstanceMachine"
+
+
+    // $ANTLR start "entryRuleSlotParameter"
+    // InternalFormalML.g:2295:1: entryRuleSlotParameter returns [EObject current=null] : iv_ruleSlotParameter= ruleSlotParameter EOF ;
+    public final EObject entryRuleSlotParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSlotParameter = null;
+
+
+        try {
+            // InternalFormalML.g:2295:54: (iv_ruleSlotParameter= ruleSlotParameter EOF )
+            // InternalFormalML.g:2296:2: iv_ruleSlotParameter= ruleSlotParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSlotParameterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSlotParameter=ruleSlotParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSlotParameter; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSlotParameter"
+
+
+    // $ANTLR start "ruleSlotParameter"
+    // InternalFormalML.g:2302:1: ruleSlotParameter returns [EObject current=null] : ( ( ( ruleESIdentifier ) ) otherlv_1= ':' ( (lv_value_2_0= ruleExpression ) ) ) ;
+    public final EObject ruleSlotParameter() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_value_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:2308:2: ( ( ( ( ruleESIdentifier ) ) otherlv_1= ':' ( (lv_value_2_0= ruleExpression ) ) ) )
+            // InternalFormalML.g:2309:2: ( ( ( ruleESIdentifier ) ) otherlv_1= ':' ( (lv_value_2_0= ruleExpression ) ) )
+            {
+            // InternalFormalML.g:2309:2: ( ( ( ruleESIdentifier ) ) otherlv_1= ':' ( (lv_value_2_0= ruleExpression ) ) )
+            // InternalFormalML.g:2310:3: ( ( ruleESIdentifier ) ) otherlv_1= ':' ( (lv_value_2_0= ruleExpression ) )
+            {
+            // InternalFormalML.g:2310:3: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:2311:4: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:2311:4: ( ruleESIdentifier )
+            // InternalFormalML.g:2312:5: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					/* */
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getSlotParameterRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_40);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,30,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getSlotParameterAccess().getColonKeyword_1());
+              		
+            }
+            // InternalFormalML.g:2333:3: ( (lv_value_2_0= ruleExpression ) )
+            // InternalFormalML.g:2334:4: (lv_value_2_0= ruleExpression )
+            {
+            // InternalFormalML.g:2334:4: (lv_value_2_0= ruleExpression )
+            // InternalFormalML.g:2335:5: lv_value_2_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSlotParameterAccess().getValueExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_2_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSlotParameterRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSlotParameter"
+
+
+    // $ANTLR start "entryRuleSlotProperty"
+    // InternalFormalML.g:2356:1: entryRuleSlotProperty returns [EObject current=null] : iv_ruleSlotProperty= ruleSlotProperty EOF ;
+    public final EObject entryRuleSlotProperty() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSlotProperty = null;
+
+
+        try {
+            // InternalFormalML.g:2356:53: (iv_ruleSlotProperty= ruleSlotProperty EOF )
+            // InternalFormalML.g:2357:2: iv_ruleSlotProperty= ruleSlotProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSlotPropertyRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSlotProperty=ruleSlotProperty();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSlotProperty; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSlotProperty"
+
+
+    // $ANTLR start "ruleSlotProperty"
+    // InternalFormalML.g:2363:1: ruleSlotProperty returns [EObject current=null] : ( ( ( ruleESIdentifier ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) ) ;
+    public final EObject ruleSlotProperty() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_value_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:2369:2: ( ( ( ( ruleESIdentifier ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) ) )
+            // InternalFormalML.g:2370:2: ( ( ( ruleESIdentifier ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) )
+            {
+            // InternalFormalML.g:2370:2: ( ( ( ruleESIdentifier ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) ) )
+            // InternalFormalML.g:2371:3: ( ( ruleESIdentifier ) ) otherlv_1= '=' ( (lv_value_2_0= ruleExpression ) )
+            {
+            // InternalFormalML.g:2371:3: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:2372:4: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:2372:4: ( ruleESIdentifier )
+            // InternalFormalML.g:2373:5: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					/* */
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getSlotPropertyRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionCrossReference_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_12);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_1=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getSlotPropertyAccess().getEqualsSignKeyword_1());
+              		
+            }
+            // InternalFormalML.g:2394:3: ( (lv_value_2_0= ruleExpression ) )
+            // InternalFormalML.g:2395:4: (lv_value_2_0= ruleExpression )
+            {
+            // InternalFormalML.g:2395:4: (lv_value_2_0= ruleExpression )
+            // InternalFormalML.g:2396:5: lv_value_2_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSlotPropertyAccess().getValueExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_2_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSlotPropertyRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSlotProperty"
+
+
+    // $ANTLR start "entryRuleMachineBlock"
+    // InternalFormalML.g:2417:1: entryRuleMachineBlock returns [EObject current=null] : iv_ruleMachineBlock= ruleMachineBlock EOF ;
+    public final EObject entryRuleMachineBlock() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleMachineBlock = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()
+        	);
+
+        try {
+            // InternalFormalML.g:2421:2: (iv_ruleMachineBlock= ruleMachineBlock EOF )
+            // InternalFormalML.g:2422:2: iv_ruleMachineBlock= ruleMachineBlock EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMachineBlockRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleMachineBlock=ruleMachineBlock();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleMachineBlock; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleMachineBlock"
+
+
+    // $ANTLR start "ruleMachineBlock"
+    // InternalFormalML.g:2431:1: ruleMachineBlock returns [EObject current=null] : ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_5= 'machine' (otherlv_6= '<' (otherlv_7= 'moc:' )? (otherlv_8= 'and' | otherlv_9= 'or' ) otherlv_10= '>' )? ( (lv_name_11_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_12_0= ruleUnrestrictedName ) )? otherlv_13= '{' ( ( (lv_port_14_0= rulePort ) ) | ( (lv_signal_15_0= ruleSignal ) ) | ( (lv_buffer_16_0= ruleBuffer ) ) | ( (lv_channel_17_0= ruleChannel ) ) | ( (lv_typedef_18_0= ruleTypeDefinition ) ) | ( (lv_property_19_0= ruleVariable ) ) )* ( (otherlv_20= '@property:' ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )* ) | (otherlv_27= '@public:' ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )* ) | (otherlv_34= '@protected:' ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )* ) | (otherlv_41= '@private:' ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ ) | (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_53_0= ruleRoutine ) ) | ( (lv_procedure_54_0= ruleProcedure ) ) )+ ) ( ( (otherlv_55= '@composite:' | otherlv_56= '@machine:' ) ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+ ) | (otherlv_59= '@model:' ( (lv_machine_60_0= ruleAnyMachineBlock ) )* ) | (otherlv_61= '@prototype:' ( (lv_machine_62_0= ruleAnyMachineBlock ) )* ) | (otherlv_63= '@instance:' ( (lv_instance_64_0= ruleInstanceMachine ) )* ) )* ( (otherlv_65= '@behavior:' ( (lv_behavior_66_0= ruleBehavior ) )+ ) | (otherlv_67= '@statemachine:' ( (lv_behavior_68_0= ruleStatemachine ) )+ ) )* ( (lv_main_69_0= ruleMoeBehavior ) ) otherlv_70= '}' ) ;
+    public final EObject ruleMachineBlock() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_timed_2_0=null;
+        Token lv_input_enabled_3_0=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_13=null;
+        Token otherlv_20=null;
+        Token otherlv_27=null;
+        Token otherlv_34=null;
+        Token otherlv_41=null;
+        Token otherlv_48=null;
+        Token otherlv_49=null;
+        Token otherlv_51=null;
+        Token otherlv_55=null;
+        Token otherlv_56=null;
+        Token otherlv_59=null;
+        Token otherlv_61=null;
+        Token otherlv_63=null;
+        Token otherlv_65=null;
+        Token otherlv_67=null;
+        Token otherlv_70=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        Enumerator lv_design_4_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_11_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_12_0 = null;
+
+        EObject lv_port_14_0 = null;
+
+        EObject lv_signal_15_0 = null;
+
+        EObject lv_buffer_16_0 = null;
+
+        EObject lv_channel_17_0 = null;
+
+        EObject lv_typedef_18_0 = null;
+
+        EObject lv_property_19_0 = null;
+
+        EObject lv_port_21_0 = null;
+
+        EObject lv_signal_22_0 = null;
+
+        EObject lv_buffer_23_0 = null;
+
+        EObject lv_channel_24_0 = null;
+
+        EObject lv_typedef_25_0 = null;
+
+        EObject lv_property_26_0 = null;
+
+        EObject lv_port_28_0 = null;
+
+        EObject lv_signal_29_0 = null;
+
+        EObject lv_buffer_30_0 = null;
+
+        EObject lv_channel_31_0 = null;
+
+        EObject lv_typedef_32_0 = null;
+
+        EObject lv_property_33_0 = null;
+
+        EObject lv_port_35_0 = null;
+
+        EObject lv_signal_36_0 = null;
+
+        EObject lv_buffer_37_0 = null;
+
+        EObject lv_channel_38_0 = null;
+
+        EObject lv_typedef_39_0 = null;
+
+        EObject lv_property_40_0 = null;
+
+        EObject lv_port_42_0 = null;
+
+        EObject lv_signal_43_0 = null;
+
+        EObject lv_buffer_44_0 = null;
+
+        EObject lv_channel_45_0 = null;
+
+        EObject lv_typedef_46_0 = null;
+
+        EObject lv_property_47_0 = null;
+
+        EObject lv_routine_50_0 = null;
+
+        EObject lv_procedure_52_0 = null;
+
+        EObject lv_routine_53_0 = null;
+
+        EObject lv_procedure_54_0 = null;
+
+        EObject lv_machine_57_0 = null;
+
+        EObject lv_instance_58_0 = null;
+
+        EObject lv_machine_60_0 = null;
+
+        EObject lv_machine_62_0 = null;
+
+        EObject lv_instance_64_0 = null;
+
+        EObject lv_behavior_66_0 = null;
+
+        EObject lv_behavior_68_0 = null;
+
+        EObject lv_main_69_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getMachineBlockAccess().getUnorderedGroup_0()
+        	);
+
+        try {
+            // InternalFormalML.g:2440:2: ( ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_5= 'machine' (otherlv_6= '<' (otherlv_7= 'moc:' )? (otherlv_8= 'and' | otherlv_9= 'or' ) otherlv_10= '>' )? ( (lv_name_11_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_12_0= ruleUnrestrictedName ) )? otherlv_13= '{' ( ( (lv_port_14_0= rulePort ) ) | ( (lv_signal_15_0= ruleSignal ) ) | ( (lv_buffer_16_0= ruleBuffer ) ) | ( (lv_channel_17_0= ruleChannel ) ) | ( (lv_typedef_18_0= ruleTypeDefinition ) ) | ( (lv_property_19_0= ruleVariable ) ) )* ( (otherlv_20= '@property:' ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )* ) | (otherlv_27= '@public:' ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )* ) | (otherlv_34= '@protected:' ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )* ) | (otherlv_41= '@private:' ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ ) | (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_53_0= ruleRoutine ) ) | ( (lv_procedure_54_0= ruleProcedure ) ) )+ ) ( ( (otherlv_55= '@composite:' | otherlv_56= '@machine:' ) ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+ ) | (otherlv_59= '@model:' ( (lv_machine_60_0= ruleAnyMachineBlock ) )* ) | (otherlv_61= '@prototype:' ( (lv_machine_62_0= ruleAnyMachineBlock ) )* ) | (otherlv_63= '@instance:' ( (lv_instance_64_0= ruleInstanceMachine ) )* ) )* ( (otherlv_65= '@behavior:' ( (lv_behavior_66_0= ruleBehavior ) )+ ) | (otherlv_67= '@statemachine:' ( (lv_behavior_68_0= ruleStatemachine ) )+ ) )* ( (lv_main_69_0= ruleMoeBehavior ) ) otherlv_70= '}' ) )
+            // InternalFormalML.g:2441:2: ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_5= 'machine' (otherlv_6= '<' (otherlv_7= 'moc:' )? (otherlv_8= 'and' | otherlv_9= 'or' ) otherlv_10= '>' )? ( (lv_name_11_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_12_0= ruleUnrestrictedName ) )? otherlv_13= '{' ( ( (lv_port_14_0= rulePort ) ) | ( (lv_signal_15_0= ruleSignal ) ) | ( (lv_buffer_16_0= ruleBuffer ) ) | ( (lv_channel_17_0= ruleChannel ) ) | ( (lv_typedef_18_0= ruleTypeDefinition ) ) | ( (lv_property_19_0= ruleVariable ) ) )* ( (otherlv_20= '@property:' ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )* ) | (otherlv_27= '@public:' ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )* ) | (otherlv_34= '@protected:' ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )* ) | (otherlv_41= '@private:' ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ ) | (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_53_0= ruleRoutine ) ) | ( (lv_procedure_54_0= ruleProcedure ) ) )+ ) ( ( (otherlv_55= '@composite:' | otherlv_56= '@machine:' ) ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+ ) | (otherlv_59= '@model:' ( (lv_machine_60_0= ruleAnyMachineBlock ) )* ) | (otherlv_61= '@prototype:' ( (lv_machine_62_0= ruleAnyMachineBlock ) )* ) | (otherlv_63= '@instance:' ( (lv_instance_64_0= ruleInstanceMachine ) )* ) )* ( (otherlv_65= '@behavior:' ( (lv_behavior_66_0= ruleBehavior ) )+ ) | (otherlv_67= '@statemachine:' ( (lv_behavior_68_0= ruleStatemachine ) )+ ) )* ( (lv_main_69_0= ruleMoeBehavior ) ) otherlv_70= '}' )
+            {
+            // InternalFormalML.g:2441:2: ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_5= 'machine' (otherlv_6= '<' (otherlv_7= 'moc:' )? (otherlv_8= 'and' | otherlv_9= 'or' ) otherlv_10= '>' )? ( (lv_name_11_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_12_0= ruleUnrestrictedName ) )? otherlv_13= '{' ( ( (lv_port_14_0= rulePort ) ) | ( (lv_signal_15_0= ruleSignal ) ) | ( (lv_buffer_16_0= ruleBuffer ) ) | ( (lv_channel_17_0= ruleChannel ) ) | ( (lv_typedef_18_0= ruleTypeDefinition ) ) | ( (lv_property_19_0= ruleVariable ) ) )* ( (otherlv_20= '@property:' ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )* ) | (otherlv_27= '@public:' ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )* ) | (otherlv_34= '@protected:' ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )* ) | (otherlv_41= '@private:' ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ ) | (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_53_0= ruleRoutine ) ) | ( (lv_procedure_54_0= ruleProcedure ) ) )+ ) ( ( (otherlv_55= '@composite:' | otherlv_56= '@machine:' ) ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+ ) | (otherlv_59= '@model:' ( (lv_machine_60_0= ruleAnyMachineBlock ) )* ) | (otherlv_61= '@prototype:' ( (lv_machine_62_0= ruleAnyMachineBlock ) )* ) | (otherlv_63= '@instance:' ( (lv_instance_64_0= ruleInstanceMachine ) )* ) )* ( (otherlv_65= '@behavior:' ( (lv_behavior_66_0= ruleBehavior ) )+ ) | (otherlv_67= '@statemachine:' ( (lv_behavior_68_0= ruleStatemachine ) )+ ) )* ( (lv_main_69_0= ruleMoeBehavior ) ) otherlv_70= '}' )
+            // InternalFormalML.g:2442:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_5= 'machine' (otherlv_6= '<' (otherlv_7= 'moc:' )? (otherlv_8= 'and' | otherlv_9= 'or' ) otherlv_10= '>' )? ( (lv_name_11_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_12_0= ruleUnrestrictedName ) )? otherlv_13= '{' ( ( (lv_port_14_0= rulePort ) ) | ( (lv_signal_15_0= ruleSignal ) ) | ( (lv_buffer_16_0= ruleBuffer ) ) | ( (lv_channel_17_0= ruleChannel ) ) | ( (lv_typedef_18_0= ruleTypeDefinition ) ) | ( (lv_property_19_0= ruleVariable ) ) )* ( (otherlv_20= '@property:' ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )* ) | (otherlv_27= '@public:' ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )* ) | (otherlv_34= '@protected:' ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )* ) | (otherlv_41= '@private:' ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ ) | (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_53_0= ruleRoutine ) ) | ( (lv_procedure_54_0= ruleProcedure ) ) )+ ) ( ( (otherlv_55= '@composite:' | otherlv_56= '@machine:' ) ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+ ) | (otherlv_59= '@model:' ( (lv_machine_60_0= ruleAnyMachineBlock ) )* ) | (otherlv_61= '@prototype:' ( (lv_machine_62_0= ruleAnyMachineBlock ) )* ) | (otherlv_63= '@instance:' ( (lv_instance_64_0= ruleInstanceMachine ) )* ) )* ( (otherlv_65= '@behavior:' ( (lv_behavior_66_0= ruleBehavior ) )+ ) | (otherlv_67= '@statemachine:' ( (lv_behavior_68_0= ruleStatemachine ) )+ ) )* ( (lv_main_69_0= ruleMoeBehavior ) ) otherlv_70= '}'
+            {
+            // InternalFormalML.g:2442:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:2443:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:2443:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* ) )
+            // InternalFormalML.g:2444:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+            // InternalFormalML.g:2447:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )* )
+            // InternalFormalML.g:2448:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:2448:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )*
+            loop53:
+            do {
+                int alt53=4;
+                alt53 = dfa53.predict(input);
+                switch (alt53) {
+            	case 1 :
+            	    // InternalFormalML.g:2449:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:2449:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+            	    // InternalFormalML.g:2450:5: {...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMachineBlock", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0)");
+            	    }
+            	    // InternalFormalML.g:2450:109: ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+            	    // InternalFormalML.g:2451:6: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0);
+            	    // InternalFormalML.g:2454:9: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+            	    // InternalFormalML.g:2454:10: {...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMachineBlock", "true");
+            	    }
+            	    // InternalFormalML.g:2454:19: ( (lv_visibility_1_0= ruleVisibilityKind ) )
+            	    // InternalFormalML.g:2454:20: (lv_visibility_1_0= ruleVisibilityKind )
+            	    {
+            	    // InternalFormalML.g:2454:20: (lv_visibility_1_0= ruleVisibilityKind )
+            	    // InternalFormalML.g:2455:10: lv_visibility_1_0= ruleVisibilityKind
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getMachineBlockAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    lv_visibility_1_0=ruleVisibilityKind();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"visibility",
+            	      											lv_visibility_1_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:2477:4: ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:2477:4: ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) )
+            	    // InternalFormalML.g:2478:5: {...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMachineBlock", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1)");
+            	    }
+            	    // InternalFormalML.g:2478:109: ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) )
+            	    // InternalFormalML.g:2479:6: ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1);
+            	    // InternalFormalML.g:2482:9: ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) )
+            	    // InternalFormalML.g:2482:10: {...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMachineBlock", "true");
+            	    }
+            	    // InternalFormalML.g:2482:19: ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) )
+            	    int alt52=2;
+            	    int LA52_0 = input.LA(1);
+
+            	    if ( (LA52_0==32) ) {
+            	        alt52=1;
+            	    }
+            	    else if ( (LA52_0==33) ) {
+            	        alt52=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 52, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt52) {
+            	        case 1 :
+            	            // InternalFormalML.g:2482:20: ( (lv_timed_2_0= 'timed' ) )
+            	            {
+            	            // InternalFormalML.g:2482:20: ( (lv_timed_2_0= 'timed' ) )
+            	            // InternalFormalML.g:2483:10: (lv_timed_2_0= 'timed' )
+            	            {
+            	            // InternalFormalML.g:2483:10: (lv_timed_2_0= 'timed' )
+            	            // InternalFormalML.g:2484:11: lv_timed_2_0= 'timed'
+            	            {
+            	            lv_timed_2_0=(Token)match(input,32,FollowSets000.FOLLOW_41); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_timed_2_0, grammarAccess.getMachineBlockAccess().getTimedTimedKeyword_0_1_0_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getMachineBlockRule());
+            	              											}
+            	              											setWithLastConsumed(current, "timed", true, "timed");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:2497:9: ( (lv_input_enabled_3_0= 'input_enabled' ) )
+            	            {
+            	            // InternalFormalML.g:2497:9: ( (lv_input_enabled_3_0= 'input_enabled' ) )
+            	            // InternalFormalML.g:2498:10: (lv_input_enabled_3_0= 'input_enabled' )
+            	            {
+            	            // InternalFormalML.g:2498:10: (lv_input_enabled_3_0= 'input_enabled' )
+            	            // InternalFormalML.g:2499:11: lv_input_enabled_3_0= 'input_enabled'
+            	            {
+            	            lv_input_enabled_3_0=(Token)match(input,33,FollowSets000.FOLLOW_41); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_input_enabled_3_0, grammarAccess.getMachineBlockAccess().getInput_enabledInput_enabledKeyword_0_1_1_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getMachineBlockRule());
+            	              											}
+            	              											setWithLastConsumed(current, "input_enabled", true, "input_enabled");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:2517:4: ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:2517:4: ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) )
+            	    // InternalFormalML.g:2518:5: {...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMachineBlock", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2)");
+            	    }
+            	    // InternalFormalML.g:2518:109: ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) )
+            	    // InternalFormalML.g:2519:6: ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2);
+            	    // InternalFormalML.g:2522:9: ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) )
+            	    // InternalFormalML.g:2522:10: {...}? => ( (lv_design_4_0= ruleDesignKind ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMachineBlock", "true");
+            	    }
+            	    // InternalFormalML.g:2522:19: ( (lv_design_4_0= ruleDesignKind ) )
+            	    // InternalFormalML.g:2522:20: (lv_design_4_0= ruleDesignKind )
+            	    {
+            	    // InternalFormalML.g:2522:20: (lv_design_4_0= ruleDesignKind )
+            	    // InternalFormalML.g:2523:10: lv_design_4_0= ruleDesignKind
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getMachineBlockAccess().getDesignDesignKindEnumRuleCall_0_2_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_41);
+            	    lv_design_4_0=ruleDesignKind();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"design",
+            	      											lv_design_4_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.DesignKind");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop53;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0());
+
+            }
+
+            otherlv_5=(Token)match(input,53,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getMachineBlockAccess().getMachineKeyword_1());
+              		
+            }
+            // InternalFormalML.g:2556:3: (otherlv_6= '<' (otherlv_7= 'moc:' )? (otherlv_8= 'and' | otherlv_9= 'or' ) otherlv_10= '>' )?
+            int alt56=2;
+            int LA56_0 = input.LA(1);
+
+            if ( (LA56_0==16) ) {
+                alt56=1;
+            }
+            switch (alt56) {
+                case 1 :
+                    // InternalFormalML.g:2557:4: otherlv_6= '<' (otherlv_7= 'moc:' )? (otherlv_8= 'and' | otherlv_9= 'or' ) otherlv_10= '>'
+                    {
+                    otherlv_6=(Token)match(input,16,FollowSets000.FOLLOW_21); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getMachineBlockAccess().getLessThanSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:2561:4: (otherlv_7= 'moc:' )?
+                    int alt54=2;
+                    int LA54_0 = input.LA(1);
+
+                    if ( (LA54_0==34) ) {
+                        alt54=1;
+                    }
+                    switch (alt54) {
+                        case 1 :
+                            // InternalFormalML.g:2562:5: otherlv_7= 'moc:'
+                            {
+                            otherlv_7=(Token)match(input,34,FollowSets000.FOLLOW_22); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_7, grammarAccess.getMachineBlockAccess().getMocKeyword_2_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:2567:4: (otherlv_8= 'and' | otherlv_9= 'or' )
+                    int alt55=2;
+                    int LA55_0 = input.LA(1);
+
+                    if ( (LA55_0==35) ) {
+                        alt55=1;
+                    }
+                    else if ( (LA55_0==36) ) {
+                        alt55=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 55, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt55) {
+                        case 1 :
+                            // InternalFormalML.g:2568:5: otherlv_8= 'and'
+                            {
+                            otherlv_8=(Token)match(input,35,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_8, grammarAccess.getMachineBlockAccess().getAndKeyword_2_2_0());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:2573:5: otherlv_9= 'or'
+                            {
+                            otherlv_9=(Token)match(input,36,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_9, grammarAccess.getMachineBlockAccess().getOrKeyword_2_2_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_10=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getMachineBlockAccess().getGreaterThanSignKeyword_2_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:2583:3: ( (lv_name_11_0= ruleESIdentifier ) )
+            // InternalFormalML.g:2584:4: (lv_name_11_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:2584:4: (lv_name_11_0= ruleESIdentifier )
+            // InternalFormalML.g:2585:5: lv_name_11_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getMachineBlockAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_24);
+            lv_name_11_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_11_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:2602:3: ( (lv_unrestrictedName_12_0= ruleUnrestrictedName ) )?
+            int alt57=2;
+            int LA57_0 = input.LA(1);
+
+            if ( (LA57_0==RULE_STRING) ) {
+                alt57=1;
+            }
+            switch (alt57) {
+                case 1 :
+                    // InternalFormalML.g:2603:4: (lv_unrestrictedName_12_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:2603:4: (lv_unrestrictedName_12_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:2604:5: lv_unrestrictedName_12_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getMachineBlockAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_10);
+                    lv_unrestrictedName_12_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_12_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_13=(Token)match(input,22,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_13, grammarAccess.getMachineBlockAccess().getLeftCurlyBracketKeyword_5());
+              		
+            }
+            // InternalFormalML.g:2625:3: ( ( (lv_port_14_0= rulePort ) ) | ( (lv_signal_15_0= ruleSignal ) ) | ( (lv_buffer_16_0= ruleBuffer ) ) | ( (lv_channel_17_0= ruleChannel ) ) | ( (lv_typedef_18_0= ruleTypeDefinition ) ) | ( (lv_property_19_0= ruleVariable ) ) )*
+            loop58:
+            do {
+                int alt58=7;
+                alt58 = dfa58.predict(input);
+                switch (alt58) {
+            	case 1 :
+            	    // InternalFormalML.g:2626:4: ( (lv_port_14_0= rulePort ) )
+            	    {
+            	    // InternalFormalML.g:2626:4: ( (lv_port_14_0= rulePort ) )
+            	    // InternalFormalML.g:2627:5: (lv_port_14_0= rulePort )
+            	    {
+            	    // InternalFormalML.g:2627:5: (lv_port_14_0= rulePort )
+            	    // InternalFormalML.g:2628:6: lv_port_14_0= rulePort
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_6_0_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_port_14_0=rulePort();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"port",
+            	      							lv_port_14_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Port");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:2646:4: ( (lv_signal_15_0= ruleSignal ) )
+            	    {
+            	    // InternalFormalML.g:2646:4: ( (lv_signal_15_0= ruleSignal ) )
+            	    // InternalFormalML.g:2647:5: (lv_signal_15_0= ruleSignal )
+            	    {
+            	    // InternalFormalML.g:2647:5: (lv_signal_15_0= ruleSignal )
+            	    // InternalFormalML.g:2648:6: lv_signal_15_0= ruleSignal
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_6_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_signal_15_0=ruleSignal();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"signal",
+            	      							lv_signal_15_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:2666:4: ( (lv_buffer_16_0= ruleBuffer ) )
+            	    {
+            	    // InternalFormalML.g:2666:4: ( (lv_buffer_16_0= ruleBuffer ) )
+            	    // InternalFormalML.g:2667:5: (lv_buffer_16_0= ruleBuffer )
+            	    {
+            	    // InternalFormalML.g:2667:5: (lv_buffer_16_0= ruleBuffer )
+            	    // InternalFormalML.g:2668:6: lv_buffer_16_0= ruleBuffer
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_6_2_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_buffer_16_0=ruleBuffer();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"buffer",
+            	      							lv_buffer_16_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:2686:4: ( (lv_channel_17_0= ruleChannel ) )
+            	    {
+            	    // InternalFormalML.g:2686:4: ( (lv_channel_17_0= ruleChannel ) )
+            	    // InternalFormalML.g:2687:5: (lv_channel_17_0= ruleChannel )
+            	    {
+            	    // InternalFormalML.g:2687:5: (lv_channel_17_0= ruleChannel )
+            	    // InternalFormalML.g:2688:6: lv_channel_17_0= ruleChannel
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_6_3_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_channel_17_0=ruleChannel();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"channel",
+            	      							lv_channel_17_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 5 :
+            	    // InternalFormalML.g:2706:4: ( (lv_typedef_18_0= ruleTypeDefinition ) )
+            	    {
+            	    // InternalFormalML.g:2706:4: ( (lv_typedef_18_0= ruleTypeDefinition ) )
+            	    // InternalFormalML.g:2707:5: (lv_typedef_18_0= ruleTypeDefinition )
+            	    {
+            	    // InternalFormalML.g:2707:5: (lv_typedef_18_0= ruleTypeDefinition )
+            	    // InternalFormalML.g:2708:6: lv_typedef_18_0= ruleTypeDefinition
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_6_4_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_typedef_18_0=ruleTypeDefinition();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"typedef",
+            	      							lv_typedef_18_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 6 :
+            	    // InternalFormalML.g:2726:4: ( (lv_property_19_0= ruleVariable ) )
+            	    {
+            	    // InternalFormalML.g:2726:4: ( (lv_property_19_0= ruleVariable ) )
+            	    // InternalFormalML.g:2727:5: (lv_property_19_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:2727:5: (lv_property_19_0= ruleVariable )
+            	    // InternalFormalML.g:2728:6: lv_property_19_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_6_5_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_25);
+            	    lv_property_19_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"property",
+            	      							lv_property_19_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop58;
+                }
+            } while (true);
+
+            // InternalFormalML.g:2746:3: ( (otherlv_20= '@property:' ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )* ) | (otherlv_27= '@public:' ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )* ) | (otherlv_34= '@protected:' ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )* ) | (otherlv_41= '@private:' ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )* ) )*
+            loop63:
+            do {
+                int alt63=5;
+                switch ( input.LA(1) ) {
+                case 38:
+                    {
+                    alt63=1;
+                    }
+                    break;
+                case 39:
+                    {
+                    alt63=2;
+                    }
+                    break;
+                case 40:
+                    {
+                    alt63=3;
+                    }
+                    break;
+                case 41:
+                    {
+                    alt63=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt63) {
+            	case 1 :
+            	    // InternalFormalML.g:2747:4: (otherlv_20= '@property:' ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )* )
+            	    {
+            	    // InternalFormalML.g:2747:4: (otherlv_20= '@property:' ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )* )
+            	    // InternalFormalML.g:2748:5: otherlv_20= '@property:' ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )*
+            	    {
+            	    otherlv_20=(Token)match(input,38,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_20, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:2752:5: ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )*
+            	    loop59:
+            	    do {
+            	        int alt59=7;
+            	        alt59 = dfa59.predict(input);
+            	        switch (alt59) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:2753:6: ( (lv_port_21_0= rulePort ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2753:6: ( (lv_port_21_0= rulePort ) )
+            	    	    // InternalFormalML.g:2754:7: (lv_port_21_0= rulePort )
+            	    	    {
+            	    	    // InternalFormalML.g:2754:7: (lv_port_21_0= rulePort )
+            	    	    // InternalFormalML.g:2755:8: lv_port_21_0= rulePort
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortParserRuleCall_7_0_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_port_21_0=rulePort();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_21_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Port");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:2773:6: ( (lv_signal_22_0= ruleSignal ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2773:6: ( (lv_signal_22_0= ruleSignal ) )
+            	    	    // InternalFormalML.g:2774:7: (lv_signal_22_0= ruleSignal )
+            	    	    {
+            	    	    // InternalFormalML.g:2774:7: (lv_signal_22_0= ruleSignal )
+            	    	    // InternalFormalML.g:2775:8: lv_signal_22_0= ruleSignal
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalParserRuleCall_7_0_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_signal_22_0=ruleSignal();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_22_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:2793:6: ( (lv_buffer_23_0= ruleBuffer ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2793:6: ( (lv_buffer_23_0= ruleBuffer ) )
+            	    	    // InternalFormalML.g:2794:7: (lv_buffer_23_0= ruleBuffer )
+            	    	    {
+            	    	    // InternalFormalML.g:2794:7: (lv_buffer_23_0= ruleBuffer )
+            	    	    // InternalFormalML.g:2795:8: lv_buffer_23_0= ruleBuffer
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferParserRuleCall_7_0_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_buffer_23_0=ruleBuffer();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_23_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:2813:6: ( (lv_channel_24_0= ruleChannel ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2813:6: ( (lv_channel_24_0= ruleChannel ) )
+            	    	    // InternalFormalML.g:2814:7: (lv_channel_24_0= ruleChannel )
+            	    	    {
+            	    	    // InternalFormalML.g:2814:7: (lv_channel_24_0= ruleChannel )
+            	    	    // InternalFormalML.g:2815:8: lv_channel_24_0= ruleChannel
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelParserRuleCall_7_0_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_channel_24_0=ruleChannel();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_24_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:2833:6: ( (lv_typedef_25_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2833:6: ( (lv_typedef_25_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:2834:7: (lv_typedef_25_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:2834:7: (lv_typedef_25_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:2835:8: lv_typedef_25_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_typedef_25_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_25_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:2853:6: ( (lv_property_26_0= ruleVariable ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2853:6: ( (lv_property_26_0= ruleVariable ) )
+            	    	    // InternalFormalML.g:2854:7: (lv_property_26_0= ruleVariable )
+            	    	    {
+            	    	    // InternalFormalML.g:2854:7: (lv_property_26_0= ruleVariable )
+            	    	    // InternalFormalML.g:2855:8: lv_property_26_0= ruleVariable
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariableParserRuleCall_7_0_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_property_26_0=ruleVariable();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_26_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop59;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:2875:4: (otherlv_27= '@public:' ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )* )
+            	    {
+            	    // InternalFormalML.g:2875:4: (otherlv_27= '@public:' ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )* )
+            	    // InternalFormalML.g:2876:5: otherlv_27= '@public:' ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )*
+            	    {
+            	    otherlv_27=(Token)match(input,39,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_27, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:2880:5: ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )*
+            	    loop60:
+            	    do {
+            	        int alt60=7;
+            	        alt60 = dfa60.predict(input);
+            	        switch (alt60) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:2881:6: ( (lv_port_28_0= rulePortPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2881:6: ( (lv_port_28_0= rulePortPublic ) )
+            	    	    // InternalFormalML.g:2882:7: (lv_port_28_0= rulePortPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:2882:7: (lv_port_28_0= rulePortPublic )
+            	    	    // InternalFormalML.g:2883:8: lv_port_28_0= rulePortPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortPublicParserRuleCall_7_1_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_port_28_0=rulePortPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_28_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:2901:6: ( (lv_signal_29_0= ruleSignalPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2901:6: ( (lv_signal_29_0= ruleSignalPublic ) )
+            	    	    // InternalFormalML.g:2902:7: (lv_signal_29_0= ruleSignalPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:2902:7: (lv_signal_29_0= ruleSignalPublic )
+            	    	    // InternalFormalML.g:2903:8: lv_signal_29_0= ruleSignalPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalPublicParserRuleCall_7_1_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_signal_29_0=ruleSignalPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_29_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:2921:6: ( (lv_buffer_30_0= ruleBufferPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2921:6: ( (lv_buffer_30_0= ruleBufferPublic ) )
+            	    	    // InternalFormalML.g:2922:7: (lv_buffer_30_0= ruleBufferPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:2922:7: (lv_buffer_30_0= ruleBufferPublic )
+            	    	    // InternalFormalML.g:2923:8: lv_buffer_30_0= ruleBufferPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferPublicParserRuleCall_7_1_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_buffer_30_0=ruleBufferPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_30_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:2941:6: ( (lv_channel_31_0= ruleChannelPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2941:6: ( (lv_channel_31_0= ruleChannelPublic ) )
+            	    	    // InternalFormalML.g:2942:7: (lv_channel_31_0= ruleChannelPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:2942:7: (lv_channel_31_0= ruleChannelPublic )
+            	    	    // InternalFormalML.g:2943:8: lv_channel_31_0= ruleChannelPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelPublicParserRuleCall_7_1_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_channel_31_0=ruleChannelPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_31_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:2961:6: ( (lv_typedef_32_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2961:6: ( (lv_typedef_32_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:2962:7: (lv_typedef_32_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:2962:7: (lv_typedef_32_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:2963:8: lv_typedef_32_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_typedef_32_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_32_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:2981:6: ( (lv_property_33_0= ruleVariablePublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:2981:6: ( (lv_property_33_0= ruleVariablePublic ) )
+            	    	    // InternalFormalML.g:2982:7: (lv_property_33_0= ruleVariablePublic )
+            	    	    {
+            	    	    // InternalFormalML.g:2982:7: (lv_property_33_0= ruleVariablePublic )
+            	    	    // InternalFormalML.g:2983:8: lv_property_33_0= ruleVariablePublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariablePublicParserRuleCall_7_1_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_property_33_0=ruleVariablePublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_33_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop60;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:3003:4: (otherlv_34= '@protected:' ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )* )
+            	    {
+            	    // InternalFormalML.g:3003:4: (otherlv_34= '@protected:' ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )* )
+            	    // InternalFormalML.g:3004:5: otherlv_34= '@protected:' ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )*
+            	    {
+            	    otherlv_34=(Token)match(input,40,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_34, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:3008:5: ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )*
+            	    loop61:
+            	    do {
+            	        int alt61=7;
+            	        alt61 = dfa61.predict(input);
+            	        switch (alt61) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:3009:6: ( (lv_port_35_0= rulePortProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3009:6: ( (lv_port_35_0= rulePortProtected ) )
+            	    	    // InternalFormalML.g:3010:7: (lv_port_35_0= rulePortProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:3010:7: (lv_port_35_0= rulePortProtected )
+            	    	    // InternalFormalML.g:3011:8: lv_port_35_0= rulePortProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortProtectedParserRuleCall_7_2_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_port_35_0=rulePortProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_35_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:3029:6: ( (lv_signal_36_0= ruleSignalProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3029:6: ( (lv_signal_36_0= ruleSignalProtected ) )
+            	    	    // InternalFormalML.g:3030:7: (lv_signal_36_0= ruleSignalProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:3030:7: (lv_signal_36_0= ruleSignalProtected )
+            	    	    // InternalFormalML.g:3031:8: lv_signal_36_0= ruleSignalProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalProtectedParserRuleCall_7_2_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_signal_36_0=ruleSignalProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_36_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:3049:6: ( (lv_buffer_37_0= ruleBufferProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3049:6: ( (lv_buffer_37_0= ruleBufferProtected ) )
+            	    	    // InternalFormalML.g:3050:7: (lv_buffer_37_0= ruleBufferProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:3050:7: (lv_buffer_37_0= ruleBufferProtected )
+            	    	    // InternalFormalML.g:3051:8: lv_buffer_37_0= ruleBufferProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferProtectedParserRuleCall_7_2_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_buffer_37_0=ruleBufferProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_37_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:3069:6: ( (lv_channel_38_0= ruleChannelProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3069:6: ( (lv_channel_38_0= ruleChannelProtected ) )
+            	    	    // InternalFormalML.g:3070:7: (lv_channel_38_0= ruleChannelProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:3070:7: (lv_channel_38_0= ruleChannelProtected )
+            	    	    // InternalFormalML.g:3071:8: lv_channel_38_0= ruleChannelProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelProtectedParserRuleCall_7_2_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_channel_38_0=ruleChannelProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_38_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:3089:6: ( (lv_typedef_39_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3089:6: ( (lv_typedef_39_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:3090:7: (lv_typedef_39_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:3090:7: (lv_typedef_39_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:3091:8: lv_typedef_39_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_typedef_39_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_39_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:3109:6: ( (lv_property_40_0= ruleVariableProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3109:6: ( (lv_property_40_0= ruleVariableProtected ) )
+            	    	    // InternalFormalML.g:3110:7: (lv_property_40_0= ruleVariableProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:3110:7: (lv_property_40_0= ruleVariableProtected )
+            	    	    // InternalFormalML.g:3111:8: lv_property_40_0= ruleVariableProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariableProtectedParserRuleCall_7_2_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_property_40_0=ruleVariableProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_40_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop61;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:3131:4: (otherlv_41= '@private:' ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )* )
+            	    {
+            	    // InternalFormalML.g:3131:4: (otherlv_41= '@private:' ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )* )
+            	    // InternalFormalML.g:3132:5: otherlv_41= '@private:' ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )*
+            	    {
+            	    otherlv_41=(Token)match(input,41,FollowSets000.FOLLOW_25); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_41, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:3136:5: ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )*
+            	    loop62:
+            	    do {
+            	        int alt62=7;
+            	        alt62 = dfa62.predict(input);
+            	        switch (alt62) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:3137:6: ( (lv_port_42_0= rulePortPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3137:6: ( (lv_port_42_0= rulePortPrivate ) )
+            	    	    // InternalFormalML.g:3138:7: (lv_port_42_0= rulePortPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:3138:7: (lv_port_42_0= rulePortPrivate )
+            	    	    // InternalFormalML.g:3139:8: lv_port_42_0= rulePortPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getPortPortPrivateParserRuleCall_7_3_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_port_42_0=rulePortPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_42_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:3157:6: ( (lv_signal_43_0= ruleSignalPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3157:6: ( (lv_signal_43_0= ruleSignalPrivate ) )
+            	    	    // InternalFormalML.g:3158:7: (lv_signal_43_0= ruleSignalPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:3158:7: (lv_signal_43_0= ruleSignalPrivate )
+            	    	    // InternalFormalML.g:3159:8: lv_signal_43_0= ruleSignalPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getSignalSignalPrivateParserRuleCall_7_3_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_signal_43_0=ruleSignalPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_43_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:3177:6: ( (lv_buffer_44_0= ruleBufferPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3177:6: ( (lv_buffer_44_0= ruleBufferPrivate ) )
+            	    	    // InternalFormalML.g:3178:7: (lv_buffer_44_0= ruleBufferPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:3178:7: (lv_buffer_44_0= ruleBufferPrivate )
+            	    	    // InternalFormalML.g:3179:8: lv_buffer_44_0= ruleBufferPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getBufferBufferPrivateParserRuleCall_7_3_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_buffer_44_0=ruleBufferPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_44_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:3197:6: ( (lv_channel_45_0= ruleChannelPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3197:6: ( (lv_channel_45_0= ruleChannelPrivate ) )
+            	    	    // InternalFormalML.g:3198:7: (lv_channel_45_0= ruleChannelPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:3198:7: (lv_channel_45_0= ruleChannelPrivate )
+            	    	    // InternalFormalML.g:3199:8: lv_channel_45_0= ruleChannelPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getChannelChannelPrivateParserRuleCall_7_3_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_channel_45_0=ruleChannelPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_45_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:3217:6: ( (lv_typedef_46_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3217:6: ( (lv_typedef_46_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:3218:7: (lv_typedef_46_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:3218:7: (lv_typedef_46_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:3219:8: lv_typedef_46_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_typedef_46_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_46_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:3237:6: ( (lv_property_47_0= ruleVariablePrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3237:6: ( (lv_property_47_0= ruleVariablePrivate ) )
+            	    	    // InternalFormalML.g:3238:7: (lv_property_47_0= ruleVariablePrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:3238:7: (lv_property_47_0= ruleVariablePrivate )
+            	    	    // InternalFormalML.g:3239:8: lv_property_47_0= ruleVariablePrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getPropertyVariablePrivateParserRuleCall_7_3_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_25);
+            	    	    lv_property_47_0=ruleVariablePrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_47_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop62;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop63;
+                }
+            } while (true);
+
+            // InternalFormalML.g:3259:3: ( ( ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ ) | (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_53_0= ruleRoutine ) ) | ( (lv_procedure_54_0= ruleProcedure ) ) )+ )
+            int alt69=2;
+            int LA69_0 = input.LA(1);
+
+            if ( (LA69_0==23||(LA69_0>=42 && LA69_0<=51)||LA69_0==69||LA69_0==72||LA69_0==95) ) {
+                alt69=1;
+            }
+            else if ( (LA69_0==19||LA69_0==58||(LA69_0>=93 && LA69_0<=94)||(LA69_0>=240 && LA69_0<=242)) ) {
+                alt69=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 69, 0, input);
+
+                throw nvae;
+            }
+            switch (alt69) {
+                case 1 :
+                    // InternalFormalML.g:3260:4: ( ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ ) | (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ ) )*
+                    {
+                    // InternalFormalML.g:3260:4: ( ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ ) | (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ ) )*
+                    loop67:
+                    do {
+                        int alt67=3;
+                        int LA67_0 = input.LA(1);
+
+                        if ( ((LA67_0>=42 && LA67_0<=43)) ) {
+                            alt67=1;
+                        }
+                        else if ( (LA67_0==44) ) {
+                            alt67=2;
+                        }
+
+
+                        switch (alt67) {
+                    	case 1 :
+                    	    // InternalFormalML.g:3261:5: ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ )
+                    	    {
+                    	    // InternalFormalML.g:3261:5: ( (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+ )
+                    	    // InternalFormalML.g:3262:6: (otherlv_48= '@routine:' | otherlv_49= '@macro:' ) ( (lv_routine_50_0= ruleRoutine ) )+
+                    	    {
+                    	    // InternalFormalML.g:3262:6: (otherlv_48= '@routine:' | otherlv_49= '@macro:' )
+                    	    int alt64=2;
+                    	    int LA64_0 = input.LA(1);
+
+                    	    if ( (LA64_0==42) ) {
+                    	        alt64=1;
+                    	    }
+                    	    else if ( (LA64_0==43) ) {
+                    	        alt64=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 64, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt64) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:3263:7: otherlv_48= '@routine:'
+                    	            {
+                    	            otherlv_48=(Token)match(input,42,FollowSets000.FOLLOW_26); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_48, grammarAccess.getMachineBlockAccess().getRoutineKeyword_8_0_0_0_0());
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:3268:7: otherlv_49= '@macro:'
+                    	            {
+                    	            otherlv_49=(Token)match(input,43,FollowSets000.FOLLOW_26); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_49, grammarAccess.getMachineBlockAccess().getMacroKeyword_8_0_0_0_1());
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    // InternalFormalML.g:3273:6: ( (lv_routine_50_0= ruleRoutine ) )+
+                    	    int cnt65=0;
+                    	    loop65:
+                    	    do {
+                    	        int alt65=2;
+                    	        int LA65_0 = input.LA(1);
+
+                    	        if ( (LA65_0==19||(LA65_0>=93 && LA65_0<=94)||(LA65_0>=240 && LA65_0<=242)) ) {
+                    	            alt65=1;
+                    	        }
+
+
+                    	        switch (alt65) {
+                    	    	case 1 :
+                    	    	    // InternalFormalML.g:3274:7: (lv_routine_50_0= ruleRoutine )
+                    	    	    {
+                    	    	    // InternalFormalML.g:3274:7: (lv_routine_50_0= ruleRoutine )
+                    	    	    // InternalFormalML.g:3275:8: lv_routine_50_0= ruleRoutine
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_0_0_1_0());
+                    	    	      							
+                    	    	    }
+                    	    	    pushFollow(FollowSets000.FOLLOW_27);
+                    	    	    lv_routine_50_0=ruleRoutine();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								if (current==null) {
+                    	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+                    	    	      								}
+                    	    	      								add(
+                    	    	      									current,
+                    	    	      									"routine",
+                    	    	      									lv_routine_50_0,
+                    	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+                    	    	      								afterParserOrEnumRuleCall();
+                    	    	      							
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    if ( cnt65 >= 1 ) break loop65;
+                    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                EarlyExitException eee =
+                    	                    new EarlyExitException(65, input);
+                    	                throw eee;
+                    	        }
+                    	        cnt65++;
+                    	    } while (true);
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:3294:5: (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ )
+                    	    {
+                    	    // InternalFormalML.g:3294:5: (otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+ )
+                    	    // InternalFormalML.g:3295:6: otherlv_51= '@procedure:' ( (lv_procedure_52_0= ruleProcedure ) )+
+                    	    {
+                    	    otherlv_51=(Token)match(input,44,FollowSets000.FOLLOW_25); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_51, grammarAccess.getMachineBlockAccess().getProcedureKeyword_8_0_1_0());
+                    	      					
+                    	    }
+                    	    // InternalFormalML.g:3299:6: ( (lv_procedure_52_0= ruleProcedure ) )+
+                    	    int cnt66=0;
+                    	    loop66:
+                    	    do {
+                    	        int alt66=2;
+                    	        int LA66_0 = input.LA(1);
+
+                    	        if ( (LA66_0==19||LA66_0==58||(LA66_0>=240 && LA66_0<=242)) ) {
+                    	            alt66=1;
+                    	        }
+
+
+                    	        switch (alt66) {
+                    	    	case 1 :
+                    	    	    // InternalFormalML.g:3300:7: (lv_procedure_52_0= ruleProcedure )
+                    	    	    {
+                    	    	    // InternalFormalML.g:3300:7: (lv_procedure_52_0= ruleProcedure )
+                    	    	    // InternalFormalML.g:3301:8: lv_procedure_52_0= ruleProcedure
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_0_1_1_0());
+                    	    	      							
+                    	    	    }
+                    	    	    pushFollow(FollowSets000.FOLLOW_25);
+                    	    	    lv_procedure_52_0=ruleProcedure();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								if (current==null) {
+                    	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+                    	    	      								}
+                    	    	      								add(
+                    	    	      									current,
+                    	    	      									"procedure",
+                    	    	      									lv_procedure_52_0,
+                    	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+                    	    	      								afterParserOrEnumRuleCall();
+                    	    	      							
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    if ( cnt66 >= 1 ) break loop66;
+                    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                EarlyExitException eee =
+                    	                    new EarlyExitException(66, input);
+                    	                throw eee;
+                    	        }
+                    	        cnt66++;
+                    	    } while (true);
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop67;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:3321:4: ( ( (lv_routine_53_0= ruleRoutine ) ) | ( (lv_procedure_54_0= ruleProcedure ) ) )+
+                    {
+                    // InternalFormalML.g:3321:4: ( ( (lv_routine_53_0= ruleRoutine ) ) | ( (lv_procedure_54_0= ruleProcedure ) ) )+
+                    int cnt68=0;
+                    loop68:
+                    do {
+                        int alt68=3;
+                        switch ( input.LA(1) ) {
+                        case 240:
+                            {
+                            int LA68_2 = input.LA(2);
+
+                            if ( (LA68_2==58) ) {
+                                alt68=2;
+                            }
+                            else if ( ((LA68_2>=93 && LA68_2<=94)) ) {
+                                alt68=1;
+                            }
+
+
+                            }
+                            break;
+                        case 241:
+                            {
+                            int LA68_3 = input.LA(2);
+
+                            if ( ((LA68_3>=93 && LA68_3<=94)) ) {
+                                alt68=1;
+                            }
+                            else if ( (LA68_3==58) ) {
+                                alt68=2;
+                            }
+
+
+                            }
+                            break;
+                        case 242:
+                            {
+                            int LA68_4 = input.LA(2);
+
+                            if ( ((LA68_4>=93 && LA68_4<=94)) ) {
+                                alt68=1;
+                            }
+                            else if ( (LA68_4==58) ) {
+                                alt68=2;
+                            }
+
+
+                            }
+                            break;
+                        case 19:
+                            {
+                            int LA68_5 = input.LA(2);
+
+                            if ( (LA68_5==58) ) {
+                                alt68=2;
+                            }
+                            else if ( ((LA68_5>=93 && LA68_5<=94)) ) {
+                                alt68=1;
+                            }
+
+
+                            }
+                            break;
+                        case 93:
+                        case 94:
+                            {
+                            alt68=1;
+                            }
+                            break;
+                        case 58:
+                            {
+                            alt68=2;
+                            }
+                            break;
+
+                        }
+
+                        switch (alt68) {
+                    	case 1 :
+                    	    // InternalFormalML.g:3322:5: ( (lv_routine_53_0= ruleRoutine ) )
+                    	    {
+                    	    // InternalFormalML.g:3322:5: ( (lv_routine_53_0= ruleRoutine ) )
+                    	    // InternalFormalML.g:3323:6: (lv_routine_53_0= ruleRoutine )
+                    	    {
+                    	    // InternalFormalML.g:3323:6: (lv_routine_53_0= ruleRoutine )
+                    	    // InternalFormalML.g:3324:7: lv_routine_53_0= ruleRoutine
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getMachineBlockAccess().getRoutineRoutineParserRuleCall_8_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_25);
+                    	    lv_routine_53_0=ruleRoutine();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"routine",
+                    	      								lv_routine_53_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:3342:5: ( (lv_procedure_54_0= ruleProcedure ) )
+                    	    {
+                    	    // InternalFormalML.g:3342:5: ( (lv_procedure_54_0= ruleProcedure ) )
+                    	    // InternalFormalML.g:3343:6: (lv_procedure_54_0= ruleProcedure )
+                    	    {
+                    	    // InternalFormalML.g:3343:6: (lv_procedure_54_0= ruleProcedure )
+                    	    // InternalFormalML.g:3344:7: lv_procedure_54_0= ruleProcedure
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getMachineBlockAccess().getProcedureProcedureParserRuleCall_8_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_25);
+                    	    lv_procedure_54_0=ruleProcedure();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"procedure",
+                    	      								lv_procedure_54_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt68 >= 1 ) break loop68;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(68, input);
+                                throw eee;
+                        }
+                        cnt68++;
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:3363:3: ( ( (otherlv_55= '@composite:' | otherlv_56= '@machine:' ) ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+ ) | (otherlv_59= '@model:' ( (lv_machine_60_0= ruleAnyMachineBlock ) )* ) | (otherlv_61= '@prototype:' ( (lv_machine_62_0= ruleAnyMachineBlock ) )* ) | (otherlv_63= '@instance:' ( (lv_instance_64_0= ruleInstanceMachine ) )* ) )*
+            loop75:
+            do {
+                int alt75=5;
+                switch ( input.LA(1) ) {
+                case 45:
+                case 46:
+                    {
+                    alt75=1;
+                    }
+                    break;
+                case 47:
+                    {
+                    alt75=2;
+                    }
+                    break;
+                case 48:
+                    {
+                    alt75=3;
+                    }
+                    break;
+                case 49:
+                    {
+                    alt75=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt75) {
+            	case 1 :
+            	    // InternalFormalML.g:3364:4: ( (otherlv_55= '@composite:' | otherlv_56= '@machine:' ) ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+ )
+            	    {
+            	    // InternalFormalML.g:3364:4: ( (otherlv_55= '@composite:' | otherlv_56= '@machine:' ) ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+ )
+            	    // InternalFormalML.g:3365:5: (otherlv_55= '@composite:' | otherlv_56= '@machine:' ) ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+
+            	    {
+            	    // InternalFormalML.g:3365:5: (otherlv_55= '@composite:' | otherlv_56= '@machine:' )
+            	    int alt70=2;
+            	    int LA70_0 = input.LA(1);
+
+            	    if ( (LA70_0==45) ) {
+            	        alt70=1;
+            	    }
+            	    else if ( (LA70_0==46) ) {
+            	        alt70=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 70, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt70) {
+            	        case 1 :
+            	            // InternalFormalML.g:3366:6: otherlv_55= '@composite:'
+            	            {
+            	            otherlv_55=(Token)match(input,45,FollowSets000.FOLLOW_28); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_55, grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0());
+            	              					
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:3371:6: otherlv_56= '@machine:'
+            	            {
+            	            otherlv_56=(Token)match(input,46,FollowSets000.FOLLOW_28); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_56, grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1());
+            	              					
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalFormalML.g:3376:5: ( ( (lv_machine_57_0= ruleAnyMachineBlock ) ) | ( (lv_instance_58_0= ruleInstanceMachine ) ) )+
+            	    int cnt71=0;
+            	    loop71:
+            	    do {
+            	        int alt71=3;
+            	        int LA71_0 = input.LA(1);
+
+            	        if ( (LA71_0==19||(LA71_0>=32 && LA71_0<=33)||(LA71_0>=53 && LA71_0<=54)||(LA71_0>=240 && LA71_0<=244)) ) {
+            	            alt71=1;
+            	        }
+            	        else if ( (LA71_0==52) ) {
+            	            alt71=2;
+            	        }
+
+
+            	        switch (alt71) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:3377:6: ( (lv_machine_57_0= ruleAnyMachineBlock ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3377:6: ( (lv_machine_57_0= ruleAnyMachineBlock ) )
+            	    	    // InternalFormalML.g:3378:7: (lv_machine_57_0= ruleAnyMachineBlock )
+            	    	    {
+            	    	    // InternalFormalML.g:3378:7: (lv_machine_57_0= ruleAnyMachineBlock )
+            	    	    // InternalFormalML.g:3379:8: lv_machine_57_0= ruleAnyMachineBlock
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_29);
+            	    	    lv_machine_57_0=ruleAnyMachineBlock();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"machine",
+            	    	      									lv_machine_57_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:3397:6: ( (lv_instance_58_0= ruleInstanceMachine ) )
+            	    	    {
+            	    	    // InternalFormalML.g:3397:6: ( (lv_instance_58_0= ruleInstanceMachine ) )
+            	    	    // InternalFormalML.g:3398:7: (lv_instance_58_0= ruleInstanceMachine )
+            	    	    {
+            	    	    // InternalFormalML.g:3398:7: (lv_instance_58_0= ruleInstanceMachine )
+            	    	    // InternalFormalML.g:3399:8: lv_instance_58_0= ruleInstanceMachine
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_0_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_29);
+            	    	    lv_instance_58_0=ruleInstanceMachine();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"instance",
+            	    	      									lv_instance_58_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    if ( cnt71 >= 1 ) break loop71;
+            	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	                EarlyExitException eee =
+            	                    new EarlyExitException(71, input);
+            	                throw eee;
+            	        }
+            	        cnt71++;
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:3419:4: (otherlv_59= '@model:' ( (lv_machine_60_0= ruleAnyMachineBlock ) )* )
+            	    {
+            	    // InternalFormalML.g:3419:4: (otherlv_59= '@model:' ( (lv_machine_60_0= ruleAnyMachineBlock ) )* )
+            	    // InternalFormalML.g:3420:5: otherlv_59= '@model:' ( (lv_machine_60_0= ruleAnyMachineBlock ) )*
+            	    {
+            	    otherlv_59=(Token)match(input,47,FollowSets000.FOLLOW_30); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_59, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:3424:5: ( (lv_machine_60_0= ruleAnyMachineBlock ) )*
+            	    loop72:
+            	    do {
+            	        int alt72=2;
+            	        int LA72_0 = input.LA(1);
+
+            	        if ( (LA72_0==19||(LA72_0>=32 && LA72_0<=33)||(LA72_0>=53 && LA72_0<=54)||(LA72_0>=240 && LA72_0<=244)) ) {
+            	            alt72=1;
+            	        }
+
+
+            	        switch (alt72) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:3425:6: (lv_machine_60_0= ruleAnyMachineBlock )
+            	    	    {
+            	    	    // InternalFormalML.g:3425:6: (lv_machine_60_0= ruleAnyMachineBlock )
+            	    	    // InternalFormalML.g:3426:7: lv_machine_60_0= ruleAnyMachineBlock
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_30);
+            	    	    lv_machine_60_0=ruleAnyMachineBlock();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"machine",
+            	    	      								lv_machine_60_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop72;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:3445:4: (otherlv_61= '@prototype:' ( (lv_machine_62_0= ruleAnyMachineBlock ) )* )
+            	    {
+            	    // InternalFormalML.g:3445:4: (otherlv_61= '@prototype:' ( (lv_machine_62_0= ruleAnyMachineBlock ) )* )
+            	    // InternalFormalML.g:3446:5: otherlv_61= '@prototype:' ( (lv_machine_62_0= ruleAnyMachineBlock ) )*
+            	    {
+            	    otherlv_61=(Token)match(input,48,FollowSets000.FOLLOW_30); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_61, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:3450:5: ( (lv_machine_62_0= ruleAnyMachineBlock ) )*
+            	    loop73:
+            	    do {
+            	        int alt73=2;
+            	        int LA73_0 = input.LA(1);
+
+            	        if ( (LA73_0==19||(LA73_0>=32 && LA73_0<=33)||(LA73_0>=53 && LA73_0<=54)||(LA73_0>=240 && LA73_0<=244)) ) {
+            	            alt73=1;
+            	        }
+
+
+            	        switch (alt73) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:3451:6: (lv_machine_62_0= ruleAnyMachineBlock )
+            	    	    {
+            	    	    // InternalFormalML.g:3451:6: (lv_machine_62_0= ruleAnyMachineBlock )
+            	    	    // InternalFormalML.g:3452:7: lv_machine_62_0= ruleAnyMachineBlock
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getMachineBlockAccess().getMachineAnyMachineBlockParserRuleCall_9_2_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_30);
+            	    	    lv_machine_62_0=ruleAnyMachineBlock();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"machine",
+            	    	      								lv_machine_62_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop73;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:3471:4: (otherlv_63= '@instance:' ( (lv_instance_64_0= ruleInstanceMachine ) )* )
+            	    {
+            	    // InternalFormalML.g:3471:4: (otherlv_63= '@instance:' ( (lv_instance_64_0= ruleInstanceMachine ) )* )
+            	    // InternalFormalML.g:3472:5: otherlv_63= '@instance:' ( (lv_instance_64_0= ruleInstanceMachine ) )*
+            	    {
+            	    otherlv_63=(Token)match(input,49,FollowSets000.FOLLOW_29); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_63, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:3476:5: ( (lv_instance_64_0= ruleInstanceMachine ) )*
+            	    loop74:
+            	    do {
+            	        int alt74=2;
+            	        int LA74_0 = input.LA(1);
+
+            	        if ( (LA74_0==52) ) {
+            	            alt74=1;
+            	        }
+
+
+            	        switch (alt74) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:3477:6: (lv_instance_64_0= ruleInstanceMachine )
+            	    	    {
+            	    	    // InternalFormalML.g:3477:6: (lv_instance_64_0= ruleInstanceMachine )
+            	    	    // InternalFormalML.g:3478:7: lv_instance_64_0= ruleInstanceMachine
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getMachineBlockAccess().getInstanceInstanceMachineParserRuleCall_9_3_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_29);
+            	    	    lv_instance_64_0=ruleInstanceMachine();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"instance",
+            	    	      								lv_instance_64_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop74;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop75;
+                }
+            } while (true);
+
+            // InternalFormalML.g:3497:3: ( (otherlv_65= '@behavior:' ( (lv_behavior_66_0= ruleBehavior ) )+ ) | (otherlv_67= '@statemachine:' ( (lv_behavior_68_0= ruleStatemachine ) )+ ) )*
+            loop78:
+            do {
+                int alt78=3;
+                int LA78_0 = input.LA(1);
+
+                if ( (LA78_0==50) ) {
+                    alt78=1;
+                }
+                else if ( (LA78_0==51) ) {
+                    alt78=2;
+                }
+
+
+                switch (alt78) {
+            	case 1 :
+            	    // InternalFormalML.g:3498:4: (otherlv_65= '@behavior:' ( (lv_behavior_66_0= ruleBehavior ) )+ )
+            	    {
+            	    // InternalFormalML.g:3498:4: (otherlv_65= '@behavior:' ( (lv_behavior_66_0= ruleBehavior ) )+ )
+            	    // InternalFormalML.g:3499:5: otherlv_65= '@behavior:' ( (lv_behavior_66_0= ruleBehavior ) )+
+            	    {
+            	    otherlv_65=(Token)match(input,50,FollowSets000.FOLLOW_31); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_65, grammarAccess.getMachineBlockAccess().getBehaviorKeyword_10_0_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:3503:5: ( (lv_behavior_66_0= ruleBehavior ) )+
+            	    int cnt76=0;
+            	    loop76:
+            	    do {
+            	        int alt76=2;
+            	        int LA76_0 = input.LA(1);
+
+            	        if ( (LA76_0==19||(LA76_0>=32 && LA76_0<=33)||LA76_0==54||(LA76_0>=240 && LA76_0<=244)) ) {
+            	            alt76=1;
+            	        }
+
+
+            	        switch (alt76) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:3504:6: (lv_behavior_66_0= ruleBehavior )
+            	    	    {
+            	    	    // InternalFormalML.g:3504:6: (lv_behavior_66_0= ruleBehavior )
+            	    	    // InternalFormalML.g:3505:7: lv_behavior_66_0= ruleBehavior
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getMachineBlockAccess().getBehaviorBehaviorParserRuleCall_10_0_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_32);
+            	    	    lv_behavior_66_0=ruleBehavior();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"behavior",
+            	    	      								lv_behavior_66_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.Behavior");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    if ( cnt76 >= 1 ) break loop76;
+            	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	                EarlyExitException eee =
+            	                    new EarlyExitException(76, input);
+            	                throw eee;
+            	        }
+            	        cnt76++;
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:3524:4: (otherlv_67= '@statemachine:' ( (lv_behavior_68_0= ruleStatemachine ) )+ )
+            	    {
+            	    // InternalFormalML.g:3524:4: (otherlv_67= '@statemachine:' ( (lv_behavior_68_0= ruleStatemachine ) )+ )
+            	    // InternalFormalML.g:3525:5: otherlv_67= '@statemachine:' ( (lv_behavior_68_0= ruleStatemachine ) )+
+            	    {
+            	    otherlv_67=(Token)match(input,51,FollowSets000.FOLLOW_31); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_67, grammarAccess.getMachineBlockAccess().getStatemachineKeyword_10_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:3529:5: ( (lv_behavior_68_0= ruleStatemachine ) )+
+            	    int cnt77=0;
+            	    loop77:
+            	    do {
+            	        int alt77=2;
+            	        int LA77_0 = input.LA(1);
+
+            	        if ( (LA77_0==19||(LA77_0>=32 && LA77_0<=33)||LA77_0==54||(LA77_0>=240 && LA77_0<=244)) ) {
+            	            alt77=1;
+            	        }
+
+
+            	        switch (alt77) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:3530:6: (lv_behavior_68_0= ruleStatemachine )
+            	    	    {
+            	    	    // InternalFormalML.g:3530:6: (lv_behavior_68_0= ruleStatemachine )
+            	    	    // InternalFormalML.g:3531:7: lv_behavior_68_0= ruleStatemachine
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newCompositeNode(grammarAccess.getMachineBlockAccess().getBehaviorStatemachineParserRuleCall_10_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_32);
+            	    	    lv_behavior_68_0=ruleStatemachine();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							if (current==null) {
+            	    	      								current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+            	    	      							}
+            	    	      							add(
+            	    	      								current,
+            	    	      								"behavior",
+            	    	      								lv_behavior_68_0,
+            	    	      								"org.eclipse.efm.formalml.xtext.FormalML.Statemachine");
+            	    	      							afterParserOrEnumRuleCall();
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    if ( cnt77 >= 1 ) break loop77;
+            	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	                EarlyExitException eee =
+            	                    new EarlyExitException(77, input);
+            	                throw eee;
+            	        }
+            	        cnt77++;
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop78;
+                }
+            } while (true);
+
+            // InternalFormalML.g:3550:3: ( (lv_main_69_0= ruleMoeBehavior ) )
+            // InternalFormalML.g:3551:4: (lv_main_69_0= ruleMoeBehavior )
+            {
+            // InternalFormalML.g:3551:4: (lv_main_69_0= ruleMoeBehavior )
+            // InternalFormalML.g:3552:5: lv_main_69_0= ruleMoeBehavior
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getMachineBlockAccess().getMainMoeBehaviorParserRuleCall_11_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_33);
+            lv_main_69_0=ruleMoeBehavior();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getMachineBlockRule());
+              					}
+              					set(
+              						current,
+              						"main",
+              						lv_main_69_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.MoeBehavior");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_70=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_70, grammarAccess.getMachineBlockAccess().getRightCurlyBracketKeyword_12());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleMachineBlock"
+
+
+    // $ANTLR start "entryRuleProcedure"
+    // InternalFormalML.g:3580:1: entryRuleProcedure returns [EObject current=null] : iv_ruleProcedure= ruleProcedure EOF ;
+    public final EObject entryRuleProcedure() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleProcedure = null;
+
+
+        try {
+            // InternalFormalML.g:3580:50: (iv_ruleProcedure= ruleProcedure EOF )
+            // InternalFormalML.g:3581:2: iv_ruleProcedure= ruleProcedure EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getProcedureRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleProcedure=ruleProcedure();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleProcedure; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleProcedure"
+
+
+    // $ANTLR start "ruleProcedure"
+    // InternalFormalML.g:3587:1: ruleProcedure returns [EObject current=null] : ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'procedure' (otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'and' | otherlv_5= 'or' ) otherlv_6= '>' )? ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )? (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )? )? otherlv_21= '{' ( (otherlv_22= '@parameter:' ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )* ) | ( ( (lv_port_43_0= rulePort ) ) | ( (lv_signal_44_0= ruleSignal ) ) | ( (lv_buffer_45_0= ruleBuffer ) ) | ( (lv_channel_46_0= ruleChannel ) ) | ( (lv_typedef_47_0= ruleTypeDefinition ) ) | ( (lv_property_48_0= ruleVariable ) ) )* ) ( (otherlv_49= '@input:' ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )* ) | (otherlv_54= '@inout:' ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )* ) | (otherlv_59= '@output:' ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )* ) | (otherlv_64= '@return:' ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )* ) )* ( (otherlv_69= '@property:' ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )* ) | (otherlv_76= '@public:' ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )* ) | (otherlv_83= '@protected:' ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )* ) | (otherlv_90= '@private:' ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ ) | (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_102_0= ruleRoutine ) ) | ( (lv_procedure_103_0= ruleProcedure ) ) )+ ) ( ( (lv_region_104_0= ruleStatemachineRegion ) )+ | ( (lv_region_105_0= ruleStatemachineRegionLite ) ) )? ( (lv_execution_106_0= ruleProcedureExecution ) )? otherlv_107= '}' ) ;
+    public final EObject ruleProcedure() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_16=null;
+        Token otherlv_18=null;
+        Token otherlv_20=null;
+        Token otherlv_21=null;
+        Token otherlv_22=null;
+        Token otherlv_23=null;
+        Token otherlv_25=null;
+        Token otherlv_27=null;
+        Token otherlv_28=null;
+        Token otherlv_30=null;
+        Token otherlv_32=null;
+        Token otherlv_33=null;
+        Token otherlv_35=null;
+        Token otherlv_37=null;
+        Token otherlv_38=null;
+        Token otherlv_40=null;
+        Token otherlv_42=null;
+        Token otherlv_49=null;
+        Token otherlv_51=null;
+        Token otherlv_53=null;
+        Token otherlv_54=null;
+        Token otherlv_56=null;
+        Token otherlv_58=null;
+        Token otherlv_59=null;
+        Token otherlv_61=null;
+        Token otherlv_63=null;
+        Token otherlv_64=null;
+        Token otherlv_66=null;
+        Token otherlv_68=null;
+        Token otherlv_69=null;
+        Token otherlv_76=null;
+        Token otherlv_83=null;
+        Token otherlv_90=null;
+        Token otherlv_97=null;
+        Token otherlv_98=null;
+        Token otherlv_100=null;
+        Token otherlv_107=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_parameter_10_0 = null;
+
+        EObject lv_parameter_12_0 = null;
+
+        EObject lv_parameter_15_0 = null;
+
+        EObject lv_parameter_17_0 = null;
+
+        EObject lv_parameter_19_0 = null;
+
+        EObject lv_parameter_24_0 = null;
+
+        EObject lv_parameter_26_0 = null;
+
+        EObject lv_parameter_29_0 = null;
+
+        EObject lv_parameter_31_0 = null;
+
+        EObject lv_parameter_34_0 = null;
+
+        EObject lv_parameter_36_0 = null;
+
+        EObject lv_parameter_39_0 = null;
+
+        EObject lv_parameter_41_0 = null;
+
+        EObject lv_port_43_0 = null;
+
+        EObject lv_signal_44_0 = null;
+
+        EObject lv_buffer_45_0 = null;
+
+        EObject lv_channel_46_0 = null;
+
+        EObject lv_typedef_47_0 = null;
+
+        EObject lv_property_48_0 = null;
+
+        EObject lv_parameter_50_0 = null;
+
+        EObject lv_parameter_52_0 = null;
+
+        EObject lv_parameter_55_0 = null;
+
+        EObject lv_parameter_57_0 = null;
+
+        EObject lv_parameter_60_0 = null;
+
+        EObject lv_parameter_62_0 = null;
+
+        EObject lv_parameter_65_0 = null;
+
+        EObject lv_parameter_67_0 = null;
+
+        EObject lv_port_70_0 = null;
+
+        EObject lv_signal_71_0 = null;
+
+        EObject lv_buffer_72_0 = null;
+
+        EObject lv_channel_73_0 = null;
+
+        EObject lv_typedef_74_0 = null;
+
+        EObject lv_property_75_0 = null;
+
+        EObject lv_port_77_0 = null;
+
+        EObject lv_signal_78_0 = null;
+
+        EObject lv_buffer_79_0 = null;
+
+        EObject lv_channel_80_0 = null;
+
+        EObject lv_typedef_81_0 = null;
+
+        EObject lv_property_82_0 = null;
+
+        EObject lv_port_84_0 = null;
+
+        EObject lv_signal_85_0 = null;
+
+        EObject lv_buffer_86_0 = null;
+
+        EObject lv_channel_87_0 = null;
+
+        EObject lv_typedef_88_0 = null;
+
+        EObject lv_property_89_0 = null;
+
+        EObject lv_port_91_0 = null;
+
+        EObject lv_signal_92_0 = null;
+
+        EObject lv_buffer_93_0 = null;
+
+        EObject lv_channel_94_0 = null;
+
+        EObject lv_typedef_95_0 = null;
+
+        EObject lv_property_96_0 = null;
+
+        EObject lv_routine_99_0 = null;
+
+        EObject lv_procedure_101_0 = null;
+
+        EObject lv_routine_102_0 = null;
+
+        EObject lv_procedure_103_0 = null;
+
+        EObject lv_region_104_0 = null;
+
+        EObject lv_region_105_0 = null;
+
+        EObject lv_execution_106_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:3593:2: ( ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'procedure' (otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'and' | otherlv_5= 'or' ) otherlv_6= '>' )? ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )? (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )? )? otherlv_21= '{' ( (otherlv_22= '@parameter:' ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )* ) | ( ( (lv_port_43_0= rulePort ) ) | ( (lv_signal_44_0= ruleSignal ) ) | ( (lv_buffer_45_0= ruleBuffer ) ) | ( (lv_channel_46_0= ruleChannel ) ) | ( (lv_typedef_47_0= ruleTypeDefinition ) ) | ( (lv_property_48_0= ruleVariable ) ) )* ) ( (otherlv_49= '@input:' ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )* ) | (otherlv_54= '@inout:' ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )* ) | (otherlv_59= '@output:' ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )* ) | (otherlv_64= '@return:' ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )* ) )* ( (otherlv_69= '@property:' ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )* ) | (otherlv_76= '@public:' ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )* ) | (otherlv_83= '@protected:' ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )* ) | (otherlv_90= '@private:' ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ ) | (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_102_0= ruleRoutine ) ) | ( (lv_procedure_103_0= ruleProcedure ) ) )+ ) ( ( (lv_region_104_0= ruleStatemachineRegion ) )+ | ( (lv_region_105_0= ruleStatemachineRegionLite ) ) )? ( (lv_execution_106_0= ruleProcedureExecution ) )? otherlv_107= '}' ) )
+            // InternalFormalML.g:3594:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'procedure' (otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'and' | otherlv_5= 'or' ) otherlv_6= '>' )? ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )? (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )? )? otherlv_21= '{' ( (otherlv_22= '@parameter:' ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )* ) | ( ( (lv_port_43_0= rulePort ) ) | ( (lv_signal_44_0= ruleSignal ) ) | ( (lv_buffer_45_0= ruleBuffer ) ) | ( (lv_channel_46_0= ruleChannel ) ) | ( (lv_typedef_47_0= ruleTypeDefinition ) ) | ( (lv_property_48_0= ruleVariable ) ) )* ) ( (otherlv_49= '@input:' ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )* ) | (otherlv_54= '@inout:' ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )* ) | (otherlv_59= '@output:' ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )* ) | (otherlv_64= '@return:' ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )* ) )* ( (otherlv_69= '@property:' ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )* ) | (otherlv_76= '@public:' ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )* ) | (otherlv_83= '@protected:' ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )* ) | (otherlv_90= '@private:' ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ ) | (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_102_0= ruleRoutine ) ) | ( (lv_procedure_103_0= ruleProcedure ) ) )+ ) ( ( (lv_region_104_0= ruleStatemachineRegion ) )+ | ( (lv_region_105_0= ruleStatemachineRegionLite ) ) )? ( (lv_execution_106_0= ruleProcedureExecution ) )? otherlv_107= '}' )
+            {
+            // InternalFormalML.g:3594:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'procedure' (otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'and' | otherlv_5= 'or' ) otherlv_6= '>' )? ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )? (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )? )? otherlv_21= '{' ( (otherlv_22= '@parameter:' ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )* ) | ( ( (lv_port_43_0= rulePort ) ) | ( (lv_signal_44_0= ruleSignal ) ) | ( (lv_buffer_45_0= ruleBuffer ) ) | ( (lv_channel_46_0= ruleChannel ) ) | ( (lv_typedef_47_0= ruleTypeDefinition ) ) | ( (lv_property_48_0= ruleVariable ) ) )* ) ( (otherlv_49= '@input:' ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )* ) | (otherlv_54= '@inout:' ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )* ) | (otherlv_59= '@output:' ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )* ) | (otherlv_64= '@return:' ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )* ) )* ( (otherlv_69= '@property:' ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )* ) | (otherlv_76= '@public:' ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )* ) | (otherlv_83= '@protected:' ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )* ) | (otherlv_90= '@private:' ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ ) | (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_102_0= ruleRoutine ) ) | ( (lv_procedure_103_0= ruleProcedure ) ) )+ ) ( ( (lv_region_104_0= ruleStatemachineRegion ) )+ | ( (lv_region_105_0= ruleStatemachineRegionLite ) ) )? ( (lv_execution_106_0= ruleProcedureExecution ) )? otherlv_107= '}' )
+            // InternalFormalML.g:3595:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'procedure' (otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'and' | otherlv_5= 'or' ) otherlv_6= '>' )? ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )? (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )? )? otherlv_21= '{' ( (otherlv_22= '@parameter:' ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )* ) | ( ( (lv_port_43_0= rulePort ) ) | ( (lv_signal_44_0= ruleSignal ) ) | ( (lv_buffer_45_0= ruleBuffer ) ) | ( (lv_channel_46_0= ruleChannel ) ) | ( (lv_typedef_47_0= ruleTypeDefinition ) ) | ( (lv_property_48_0= ruleVariable ) ) )* ) ( (otherlv_49= '@input:' ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )* ) | (otherlv_54= '@inout:' ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )* ) | (otherlv_59= '@output:' ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )* ) | (otherlv_64= '@return:' ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )* ) )* ( (otherlv_69= '@property:' ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )* ) | (otherlv_76= '@public:' ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )* ) | (otherlv_83= '@protected:' ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )* ) | (otherlv_90= '@private:' ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ ) | (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_102_0= ruleRoutine ) ) | ( (lv_procedure_103_0= ruleProcedure ) ) )+ ) ( ( (lv_region_104_0= ruleStatemachineRegion ) )+ | ( (lv_region_105_0= ruleStatemachineRegionLite ) ) )? ( (lv_execution_106_0= ruleProcedureExecution ) )? otherlv_107= '}'
+            {
+            // InternalFormalML.g:3595:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )?
+            int alt79=2;
+            int LA79_0 = input.LA(1);
+
+            if ( (LA79_0==19||(LA79_0>=240 && LA79_0<=242)) ) {
+                alt79=1;
+            }
+            switch (alt79) {
+                case 1 :
+                    // InternalFormalML.g:3596:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:3596:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    // InternalFormalML.g:3597:5: lv_visibility_0_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getProcedureAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_42);
+                    lv_visibility_0_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getProcedureRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_1=(Token)match(input,58,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getProcedureAccess().getProcedureKeyword_1());
+              		
+            }
+            // InternalFormalML.g:3618:3: (otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'and' | otherlv_5= 'or' ) otherlv_6= '>' )?
+            int alt82=2;
+            int LA82_0 = input.LA(1);
+
+            if ( (LA82_0==16) ) {
+                alt82=1;
+            }
+            switch (alt82) {
+                case 1 :
+                    // InternalFormalML.g:3619:4: otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'and' | otherlv_5= 'or' ) otherlv_6= '>'
+                    {
+                    otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_21); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getProcedureAccess().getLessThanSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:3623:4: (otherlv_3= 'moc:' )?
+                    int alt80=2;
+                    int LA80_0 = input.LA(1);
+
+                    if ( (LA80_0==34) ) {
+                        alt80=1;
+                    }
+                    switch (alt80) {
+                        case 1 :
+                            // InternalFormalML.g:3624:5: otherlv_3= 'moc:'
+                            {
+                            otherlv_3=(Token)match(input,34,FollowSets000.FOLLOW_22); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_3, grammarAccess.getProcedureAccess().getMocKeyword_2_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:3629:4: (otherlv_4= 'and' | otherlv_5= 'or' )
+                    int alt81=2;
+                    int LA81_0 = input.LA(1);
+
+                    if ( (LA81_0==35) ) {
+                        alt81=1;
+                    }
+                    else if ( (LA81_0==36) ) {
+                        alt81=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 81, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt81) {
+                        case 1 :
+                            // InternalFormalML.g:3630:5: otherlv_4= 'and'
+                            {
+                            otherlv_4=(Token)match(input,35,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_4, grammarAccess.getProcedureAccess().getAndKeyword_2_2_0());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:3635:5: otherlv_5= 'or'
+                            {
+                            otherlv_5=(Token)match(input,36,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_5, grammarAccess.getProcedureAccess().getOrKeyword_2_2_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_6=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getProcedureAccess().getGreaterThanSignKeyword_2_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:3645:3: ( (lv_name_7_0= ruleESIdentifier ) )
+            // InternalFormalML.g:3646:4: (lv_name_7_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:3646:4: (lv_name_7_0= ruleESIdentifier )
+            // InternalFormalML.g:3647:5: lv_name_7_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getProcedureAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_43);
+            lv_name_7_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getProcedureRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:3664:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt83=2;
+            int LA83_0 = input.LA(1);
+
+            if ( (LA83_0==RULE_STRING) ) {
+                alt83=1;
+            }
+            switch (alt83) {
+                case 1 :
+                    // InternalFormalML.g:3665:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:3665:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:3666:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getProcedureAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_44);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getProcedureRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:3683:3: ( (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )? (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )? )?
+            int alt90=2;
+            int LA90_0 = input.LA(1);
+
+            if ( (LA90_0==56||LA90_0==59) ) {
+                alt90=1;
+            }
+            else if ( (LA90_0==22) ) {
+                int LA90_2 = input.LA(2);
+
+                if ( (synpred166_InternalFormalML()) ) {
+                    alt90=1;
+                }
+            }
+            switch (alt90) {
+                case 1 :
+                    // InternalFormalML.g:3684:4: (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )? (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )?
+                    {
+                    // InternalFormalML.g:3684:4: (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )?
+                    int alt86=2;
+                    int LA86_0 = input.LA(1);
+
+                    if ( (LA86_0==56) ) {
+                        alt86=1;
+                    }
+                    switch (alt86) {
+                        case 1 :
+                            // InternalFormalML.g:3685:5: otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')'
+                            {
+                            otherlv_9=(Token)match(input,56,FollowSets000.FOLLOW_45); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_9, grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_0_0());
+                              				
+                            }
+                            // InternalFormalML.g:3689:5: ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )?
+                            int alt85=2;
+                            int LA85_0 = input.LA(1);
+
+                            if ( (LA85_0==RULE_XLIA_ID||LA85_0==28||LA85_0==53||LA85_0==62||LA85_0==64||(LA85_0>=102 && LA85_0<=105)||(LA85_0>=107 && LA85_0<=127)||(LA85_0>=136 && LA85_0<=138)||LA85_0==212||(LA85_0>=216 && LA85_0<=217)||(LA85_0>=260 && LA85_0<=270)) ) {
+                                alt85=1;
+                            }
+                            switch (alt85) {
+                                case 1 :
+                                    // InternalFormalML.g:3690:6: ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )*
+                                    {
+                                    // InternalFormalML.g:3690:6: ( (lv_parameter_10_0= ruleFunctionalParameter ) )
+                                    // InternalFormalML.g:3691:7: (lv_parameter_10_0= ruleFunctionalParameter )
+                                    {
+                                    // InternalFormalML.g:3691:7: (lv_parameter_10_0= ruleFunctionalParameter )
+                                    // InternalFormalML.g:3692:8: lv_parameter_10_0= ruleFunctionalParameter
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      								newCompositeNode(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_0_0());
+                                      							
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_39);
+                                    lv_parameter_10_0=ruleFunctionalParameter();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								if (current==null) {
+                                      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+                                      								}
+                                      								add(
+                                      									current,
+                                      									"parameter",
+                                      									lv_parameter_10_0,
+                                      									"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
+                                      								afterParserOrEnumRuleCall();
+                                      							
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    // InternalFormalML.g:3709:6: (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )*
+                                    loop84:
+                                    do {
+                                        int alt84=2;
+                                        int LA84_0 = input.LA(1);
+
+                                        if ( (LA84_0==20) ) {
+                                            alt84=1;
+                                        }
+
+
+                                        switch (alt84) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:3710:7: otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) )
+                                    	    {
+                                    	    otherlv_11=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      							newLeafNode(otherlv_11, grammarAccess.getProcedureAccess().getCommaKeyword_5_0_1_1_0());
+                                    	      						
+                                    	    }
+                                    	    // InternalFormalML.g:3714:7: ( (lv_parameter_12_0= ruleFunctionalParameter ) )
+                                    	    // InternalFormalML.g:3715:8: (lv_parameter_12_0= ruleFunctionalParameter )
+                                    	    {
+                                    	    // InternalFormalML.g:3715:8: (lv_parameter_12_0= ruleFunctionalParameter )
+                                    	    // InternalFormalML.g:3716:9: lv_parameter_12_0= ruleFunctionalParameter
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      									newCompositeNode(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0());
+                                    	      								
+                                    	    }
+                                    	    pushFollow(FollowSets000.FOLLOW_39);
+                                    	    lv_parameter_12_0=ruleFunctionalParameter();
+
+                                    	    state._fsp--;
+                                    	    if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      									if (current==null) {
+                                    	      										current = createModelElementForParent(grammarAccess.getProcedureRule());
+                                    	      									}
+                                    	      									add(
+                                    	      										current,
+                                    	      										"parameter",
+                                    	      										lv_parameter_12_0,
+                                    	      										"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
+                                    	      									afterParserOrEnumRuleCall();
+                                    	      								
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop84;
+                                        }
+                                    } while (true);
+
+
+                                    }
+                                    break;
+
+                            }
+
+                            otherlv_13=(Token)match(input,57,FollowSets000.FOLLOW_47); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_13, grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_0_2());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:3740:4: (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )?
+                    int alt89=2;
+                    int LA89_0 = input.LA(1);
+
+                    if ( (LA89_0==59) ) {
+                        alt89=1;
+                    }
+                    switch (alt89) {
+                        case 1 :
+                            // InternalFormalML.g:3741:5: otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) )
+                            {
+                            otherlv_14=(Token)match(input,59,FollowSets000.FOLLOW_48); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_14, grammarAccess.getProcedureAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0());
+                              				
+                            }
+                            // InternalFormalML.g:3745:5: ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) )
+                            int alt88=2;
+                            int LA88_0 = input.LA(1);
+
+                            if ( (LA88_0==RULE_XLIA_ID||LA88_0==28||LA88_0==53||LA88_0==62||LA88_0==64||(LA88_0>=102 && LA88_0<=105)||(LA88_0>=107 && LA88_0<=127)||(LA88_0>=136 && LA88_0<=138)||LA88_0==212||(LA88_0>=216 && LA88_0<=217)||(LA88_0>=260 && LA88_0<=270)) ) {
+                                alt88=1;
+                            }
+                            else if ( (LA88_0==56) ) {
+                                alt88=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 88, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt88) {
+                                case 1 :
+                                    // InternalFormalML.g:3746:6: ( (lv_parameter_15_0= ruleFormalParameter ) )
+                                    {
+                                    // InternalFormalML.g:3746:6: ( (lv_parameter_15_0= ruleFormalParameter ) )
+                                    // InternalFormalML.g:3747:7: (lv_parameter_15_0= ruleFormalParameter )
+                                    {
+                                    // InternalFormalML.g:3747:7: (lv_parameter_15_0= ruleFormalParameter )
+                                    // InternalFormalML.g:3748:8: lv_parameter_15_0= ruleFormalParameter
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      								newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_0_0());
+                                      							
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_10);
+                                    lv_parameter_15_0=ruleFormalParameter();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								if (current==null) {
+                                      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+                                      								}
+                                      								add(
+                                      									current,
+                                      									"parameter",
+                                      									lv_parameter_15_0,
+                                      									"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                                      								afterParserOrEnumRuleCall();
+                                      							
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:3766:6: (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' )
+                                    {
+                                    // InternalFormalML.g:3766:6: (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' )
+                                    // InternalFormalML.g:3767:7: otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')'
+                                    {
+                                    otherlv_16=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							newLeafNode(otherlv_16, grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_1_1_1_0());
+                                      						
+                                    }
+                                    // InternalFormalML.g:3771:7: ( (lv_parameter_17_0= ruleFormalParameter ) )
+                                    // InternalFormalML.g:3772:8: (lv_parameter_17_0= ruleFormalParameter )
+                                    {
+                                    // InternalFormalML.g:3772:8: (lv_parameter_17_0= ruleFormalParameter )
+                                    // InternalFormalML.g:3773:9: lv_parameter_17_0= ruleFormalParameter
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_1_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_39);
+                                    lv_parameter_17_0=ruleFormalParameter();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getProcedureRule());
+                                      									}
+                                      									add(
+                                      										current,
+                                      										"parameter",
+                                      										lv_parameter_17_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    // InternalFormalML.g:3790:7: (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )*
+                                    loop87:
+                                    do {
+                                        int alt87=2;
+                                        int LA87_0 = input.LA(1);
+
+                                        if ( (LA87_0==20) ) {
+                                            alt87=1;
+                                        }
+
+
+                                        switch (alt87) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:3791:8: otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) )
+                                    	    {
+                                    	    otherlv_18=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      								newLeafNode(otherlv_18, grammarAccess.getProcedureAccess().getCommaKeyword_5_1_1_1_2_0());
+                                    	      							
+                                    	    }
+                                    	    // InternalFormalML.g:3795:8: ( (lv_parameter_19_0= ruleFormalParameter ) )
+                                    	    // InternalFormalML.g:3796:9: (lv_parameter_19_0= ruleFormalParameter )
+                                    	    {
+                                    	    // InternalFormalML.g:3796:9: (lv_parameter_19_0= ruleFormalParameter )
+                                    	    // InternalFormalML.g:3797:10: lv_parameter_19_0= ruleFormalParameter
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0());
+                                    	      									
+                                    	    }
+                                    	    pushFollow(FollowSets000.FOLLOW_39);
+                                    	    lv_parameter_19_0=ruleFormalParameter();
+
+                                    	    state._fsp--;
+                                    	    if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										if (current==null) {
+                                    	      											current = createModelElementForParent(grammarAccess.getProcedureRule());
+                                    	      										}
+                                    	      										add(
+                                    	      											current,
+                                    	      											"parameter",
+                                    	      											lv_parameter_19_0,
+                                    	      											"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                                    	      										afterParserOrEnumRuleCall();
+                                    	      									
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop87;
+                                        }
+                                    } while (true);
+
+                                    otherlv_20=(Token)match(input,57,FollowSets000.FOLLOW_10); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							newLeafNode(otherlv_20, grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_1_1_1_3());
+                                      						
+                                    }
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_21=(Token)match(input,22,FollowSets000.FOLLOW_49); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_21, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_6());
+              		
+            }
+            // InternalFormalML.g:3827:3: ( (otherlv_22= '@parameter:' ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )* ) | ( ( (lv_port_43_0= rulePort ) ) | ( (lv_signal_44_0= ruleSignal ) ) | ( (lv_buffer_45_0= ruleBuffer ) ) | ( (lv_channel_46_0= ruleChannel ) ) | ( (lv_typedef_47_0= ruleTypeDefinition ) ) | ( (lv_property_48_0= ruleVariable ) ) )* )
+            int alt101=2;
+            int LA101_0 = input.LA(1);
+
+            if ( (LA101_0==60) ) {
+                alt101=1;
+            }
+            else if ( (LA101_0==19||LA101_0==23||(LA101_0>=38 && LA101_0<=44)||LA101_0==51||LA101_0==58||(LA101_0>=65 && LA101_0<=71)||(LA101_0>=73 && LA101_0<=76)||(LA101_0>=86 && LA101_0<=91)||(LA101_0>=93 && LA101_0<=94)||LA101_0==101||(LA101_0>=128 && LA101_0<=134)||(LA101_0>=136 && LA101_0<=139)||(LA101_0>=240 && LA101_0<=242)) ) {
+                alt101=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 101, 0, input);
+
+                throw nvae;
+            }
+            switch (alt101) {
+                case 1 :
+                    // InternalFormalML.g:3828:4: (otherlv_22= '@parameter:' ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )* )
+                    {
+                    // InternalFormalML.g:3828:4: (otherlv_22= '@parameter:' ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )* )
+                    // InternalFormalML.g:3829:5: otherlv_22= '@parameter:' ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )*
+                    {
+                    otherlv_22=(Token)match(input,60,FollowSets000.FOLLOW_50); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_22, grammarAccess.getProcedureAccess().getParameterKeyword_7_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:3833:5: ( (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) ) | (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) ) | (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) ) | (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) ) )*
+                    loop99:
+                    do {
+                        int alt99=5;
+                        switch ( input.LA(1) ) {
+                        case 61:
+                            {
+                            alt99=1;
+                            }
+                            break;
+                        case 62:
+                            {
+                            alt99=2;
+                            }
+                            break;
+                        case 63:
+                            {
+                            alt99=3;
+                            }
+                            break;
+                        case 64:
+                            {
+                            alt99=4;
+                            }
+                            break;
+
+                        }
+
+                        switch (alt99) {
+                    	case 1 :
+                    	    // InternalFormalML.g:3834:6: (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) )
+                    	    {
+                    	    // InternalFormalML.g:3834:6: (otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) ) )
+                    	    // InternalFormalML.g:3835:7: otherlv_23= 'input' ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) )
+                    	    {
+                    	    otherlv_23=(Token)match(input,61,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_23, grammarAccess.getProcedureAccess().getInputKeyword_7_0_1_0_0());
+                    	      						
+                    	    }
+                    	    // InternalFormalML.g:3839:7: ( ( (lv_parameter_24_0= ruleParameterInput ) ) | (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' ) )
+                    	    int alt92=2;
+                    	    int LA92_0 = input.LA(1);
+
+                    	    if ( (LA92_0==132) ) {
+                    	        alt92=1;
+                    	    }
+                    	    else if ( (LA92_0==22) ) {
+                    	        alt92=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 92, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt92) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:3840:8: ( (lv_parameter_24_0= ruleParameterInput ) )
+                    	            {
+                    	            // InternalFormalML.g:3840:8: ( (lv_parameter_24_0= ruleParameterInput ) )
+                    	            // InternalFormalML.g:3841:9: (lv_parameter_24_0= ruleParameterInput )
+                    	            {
+                    	            // InternalFormalML.g:3841:9: (lv_parameter_24_0= ruleParameterInput )
+                    	            // InternalFormalML.g:3842:10: lv_parameter_24_0= ruleParameterInput
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0());
+                    	              									
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_50);
+                    	            lv_parameter_24_0=ruleParameterInput();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										if (current==null) {
+                    	              											current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	              										}
+                    	              										add(
+                    	              											current,
+                    	              											"parameter",
+                    	              											lv_parameter_24_0,
+                    	              											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+                    	              										afterParserOrEnumRuleCall();
+                    	              									
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:3860:8: (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' )
+                    	            {
+                    	            // InternalFormalML.g:3860:8: (otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}' )
+                    	            // InternalFormalML.g:3861:9: otherlv_25= '{' ( (lv_parameter_26_0= ruleParameterInput ) )+ otherlv_27= '}'
+                    	            {
+                    	            otherlv_25=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_25, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0());
+                    	              								
+                    	            }
+                    	            // InternalFormalML.g:3865:9: ( (lv_parameter_26_0= ruleParameterInput ) )+
+                    	            int cnt91=0;
+                    	            loop91:
+                    	            do {
+                    	                int alt91=2;
+                    	                int LA91_0 = input.LA(1);
+
+                    	                if ( (LA91_0==132) ) {
+                    	                    alt91=1;
+                    	                }
+
+
+                    	                switch (alt91) {
+                    	            	case 1 :
+                    	            	    // InternalFormalML.g:3866:10: (lv_parameter_26_0= ruleParameterInput )
+                    	            	    {
+                    	            	    // InternalFormalML.g:3866:10: (lv_parameter_26_0= ruleParameterInput )
+                    	            	    // InternalFormalML.g:3867:11: lv_parameter_26_0= ruleParameterInput
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0());
+                    	            	      										
+                    	            	    }
+                    	            	    pushFollow(FollowSets000.FOLLOW_53);
+                    	            	    lv_parameter_26_0=ruleParameterInput();
+
+                    	            	    state._fsp--;
+                    	            	    if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											if (current==null) {
+                    	            	      												current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	            	      											}
+                    	            	      											add(
+                    	            	      												current,
+                    	            	      												"parameter",
+                    	            	      												lv_parameter_26_0,
+                    	            	      												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+                    	            	      											afterParserOrEnumRuleCall();
+                    	            	      										
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    if ( cnt91 >= 1 ) break loop91;
+                    	            	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                        EarlyExitException eee =
+                    	                            new EarlyExitException(91, input);
+                    	                        throw eee;
+                    	                }
+                    	                cnt91++;
+                    	            } while (true);
+
+                    	            otherlv_27=(Token)match(input,23,FollowSets000.FOLLOW_50); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_27, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2());
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:3892:6: (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) )
+                    	    {
+                    	    // InternalFormalML.g:3892:6: (otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) ) )
+                    	    // InternalFormalML.g:3893:7: otherlv_28= 'inout' ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) )
+                    	    {
+                    	    otherlv_28=(Token)match(input,62,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_28, grammarAccess.getProcedureAccess().getInoutKeyword_7_0_1_1_0());
+                    	      						
+                    	    }
+                    	    // InternalFormalML.g:3897:7: ( ( (lv_parameter_29_0= ruleParameterInout ) ) | (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' ) )
+                    	    int alt94=2;
+                    	    int LA94_0 = input.LA(1);
+
+                    	    if ( (LA94_0==132) ) {
+                    	        alt94=1;
+                    	    }
+                    	    else if ( (LA94_0==22) ) {
+                    	        alt94=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 94, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt94) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:3898:8: ( (lv_parameter_29_0= ruleParameterInout ) )
+                    	            {
+                    	            // InternalFormalML.g:3898:8: ( (lv_parameter_29_0= ruleParameterInout ) )
+                    	            // InternalFormalML.g:3899:9: (lv_parameter_29_0= ruleParameterInout )
+                    	            {
+                    	            // InternalFormalML.g:3899:9: (lv_parameter_29_0= ruleParameterInout )
+                    	            // InternalFormalML.g:3900:10: lv_parameter_29_0= ruleParameterInout
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0());
+                    	              									
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_50);
+                    	            lv_parameter_29_0=ruleParameterInout();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										if (current==null) {
+                    	              											current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	              										}
+                    	              										add(
+                    	              											current,
+                    	              											"parameter",
+                    	              											lv_parameter_29_0,
+                    	              											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+                    	              										afterParserOrEnumRuleCall();
+                    	              									
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:3918:8: (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' )
+                    	            {
+                    	            // InternalFormalML.g:3918:8: (otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}' )
+                    	            // InternalFormalML.g:3919:9: otherlv_30= '{' ( (lv_parameter_31_0= ruleParameterInout ) )+ otherlv_32= '}'
+                    	            {
+                    	            otherlv_30=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_30, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0());
+                    	              								
+                    	            }
+                    	            // InternalFormalML.g:3923:9: ( (lv_parameter_31_0= ruleParameterInout ) )+
+                    	            int cnt93=0;
+                    	            loop93:
+                    	            do {
+                    	                int alt93=2;
+                    	                int LA93_0 = input.LA(1);
+
+                    	                if ( (LA93_0==132) ) {
+                    	                    alt93=1;
+                    	                }
+
+
+                    	                switch (alt93) {
+                    	            	case 1 :
+                    	            	    // InternalFormalML.g:3924:10: (lv_parameter_31_0= ruleParameterInout )
+                    	            	    {
+                    	            	    // InternalFormalML.g:3924:10: (lv_parameter_31_0= ruleParameterInout )
+                    	            	    // InternalFormalML.g:3925:11: lv_parameter_31_0= ruleParameterInout
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0());
+                    	            	      										
+                    	            	    }
+                    	            	    pushFollow(FollowSets000.FOLLOW_53);
+                    	            	    lv_parameter_31_0=ruleParameterInout();
+
+                    	            	    state._fsp--;
+                    	            	    if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											if (current==null) {
+                    	            	      												current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	            	      											}
+                    	            	      											add(
+                    	            	      												current,
+                    	            	      												"parameter",
+                    	            	      												lv_parameter_31_0,
+                    	            	      												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+                    	            	      											afterParserOrEnumRuleCall();
+                    	            	      										
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    if ( cnt93 >= 1 ) break loop93;
+                    	            	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                        EarlyExitException eee =
+                    	                            new EarlyExitException(93, input);
+                    	                        throw eee;
+                    	                }
+                    	                cnt93++;
+                    	            } while (true);
+
+                    	            otherlv_32=(Token)match(input,23,FollowSets000.FOLLOW_50); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_32, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2());
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalFormalML.g:3950:6: (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) )
+                    	    {
+                    	    // InternalFormalML.g:3950:6: (otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) ) )
+                    	    // InternalFormalML.g:3951:7: otherlv_33= 'output' ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) )
+                    	    {
+                    	    otherlv_33=(Token)match(input,63,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_33, grammarAccess.getProcedureAccess().getOutputKeyword_7_0_1_2_0());
+                    	      						
+                    	    }
+                    	    // InternalFormalML.g:3955:7: ( ( (lv_parameter_34_0= ruleParameterOutput ) ) | (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' ) )
+                    	    int alt96=2;
+                    	    int LA96_0 = input.LA(1);
+
+                    	    if ( (LA96_0==132) ) {
+                    	        alt96=1;
+                    	    }
+                    	    else if ( (LA96_0==22) ) {
+                    	        alt96=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 96, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt96) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:3956:8: ( (lv_parameter_34_0= ruleParameterOutput ) )
+                    	            {
+                    	            // InternalFormalML.g:3956:8: ( (lv_parameter_34_0= ruleParameterOutput ) )
+                    	            // InternalFormalML.g:3957:9: (lv_parameter_34_0= ruleParameterOutput )
+                    	            {
+                    	            // InternalFormalML.g:3957:9: (lv_parameter_34_0= ruleParameterOutput )
+                    	            // InternalFormalML.g:3958:10: lv_parameter_34_0= ruleParameterOutput
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0());
+                    	              									
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_50);
+                    	            lv_parameter_34_0=ruleParameterOutput();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										if (current==null) {
+                    	              											current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	              										}
+                    	              										add(
+                    	              											current,
+                    	              											"parameter",
+                    	              											lv_parameter_34_0,
+                    	              											"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+                    	              										afterParserOrEnumRuleCall();
+                    	              									
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:3976:8: (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' )
+                    	            {
+                    	            // InternalFormalML.g:3976:8: (otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}' )
+                    	            // InternalFormalML.g:3977:9: otherlv_35= '{' ( (lv_parameter_36_0= ruleParameterOutput ) )+ otherlv_37= '}'
+                    	            {
+                    	            otherlv_35=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_35, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0());
+                    	              								
+                    	            }
+                    	            // InternalFormalML.g:3981:9: ( (lv_parameter_36_0= ruleParameterOutput ) )+
+                    	            int cnt95=0;
+                    	            loop95:
+                    	            do {
+                    	                int alt95=2;
+                    	                int LA95_0 = input.LA(1);
+
+                    	                if ( (LA95_0==132) ) {
+                    	                    alt95=1;
+                    	                }
+
+
+                    	                switch (alt95) {
+                    	            	case 1 :
+                    	            	    // InternalFormalML.g:3982:10: (lv_parameter_36_0= ruleParameterOutput )
+                    	            	    {
+                    	            	    // InternalFormalML.g:3982:10: (lv_parameter_36_0= ruleParameterOutput )
+                    	            	    // InternalFormalML.g:3983:11: lv_parameter_36_0= ruleParameterOutput
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0());
+                    	            	      										
+                    	            	    }
+                    	            	    pushFollow(FollowSets000.FOLLOW_53);
+                    	            	    lv_parameter_36_0=ruleParameterOutput();
+
+                    	            	    state._fsp--;
+                    	            	    if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											if (current==null) {
+                    	            	      												current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	            	      											}
+                    	            	      											add(
+                    	            	      												current,
+                    	            	      												"parameter",
+                    	            	      												lv_parameter_36_0,
+                    	            	      												"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+                    	            	      											afterParserOrEnumRuleCall();
+                    	            	      										
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    if ( cnt95 >= 1 ) break loop95;
+                    	            	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                        EarlyExitException eee =
+                    	                            new EarlyExitException(95, input);
+                    	                        throw eee;
+                    	                }
+                    	                cnt95++;
+                    	            } while (true);
+
+                    	            otherlv_37=(Token)match(input,23,FollowSets000.FOLLOW_50); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_37, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2());
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalFormalML.g:4008:6: (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) )
+                    	    {
+                    	    // InternalFormalML.g:4008:6: (otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) ) )
+                    	    // InternalFormalML.g:4009:7: otherlv_38= 'return' ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) )
+                    	    {
+                    	    otherlv_38=(Token)match(input,64,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_38, grammarAccess.getProcedureAccess().getReturnKeyword_7_0_1_3_0());
+                    	      						
+                    	    }
+                    	    // InternalFormalML.g:4013:7: ( ( (lv_parameter_39_0= ruleParameterReturn ) ) | (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' ) )
+                    	    int alt98=2;
+                    	    int LA98_0 = input.LA(1);
+
+                    	    if ( (LA98_0==132) ) {
+                    	        alt98=1;
+                    	    }
+                    	    else if ( (LA98_0==22) ) {
+                    	        alt98=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 98, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt98) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:4014:8: ( (lv_parameter_39_0= ruleParameterReturn ) )
+                    	            {
+                    	            // InternalFormalML.g:4014:8: ( (lv_parameter_39_0= ruleParameterReturn ) )
+                    	            // InternalFormalML.g:4015:9: (lv_parameter_39_0= ruleParameterReturn )
+                    	            {
+                    	            // InternalFormalML.g:4015:9: (lv_parameter_39_0= ruleParameterReturn )
+                    	            // InternalFormalML.g:4016:10: lv_parameter_39_0= ruleParameterReturn
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0());
+                    	              									
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_50);
+                    	            lv_parameter_39_0=ruleParameterReturn();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										if (current==null) {
+                    	              											current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	              										}
+                    	              										add(
+                    	              											current,
+                    	              											"parameter",
+                    	              											lv_parameter_39_0,
+                    	              											"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+                    	              										afterParserOrEnumRuleCall();
+                    	              									
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:4034:8: (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' )
+                    	            {
+                    	            // InternalFormalML.g:4034:8: (otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}' )
+                    	            // InternalFormalML.g:4035:9: otherlv_40= '{' ( (lv_parameter_41_0= ruleParameterReturn ) )+ otherlv_42= '}'
+                    	            {
+                    	            otherlv_40=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_40, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0());
+                    	              								
+                    	            }
+                    	            // InternalFormalML.g:4039:9: ( (lv_parameter_41_0= ruleParameterReturn ) )+
+                    	            int cnt97=0;
+                    	            loop97:
+                    	            do {
+                    	                int alt97=2;
+                    	                int LA97_0 = input.LA(1);
+
+                    	                if ( (LA97_0==132) ) {
+                    	                    alt97=1;
+                    	                }
+
+
+                    	                switch (alt97) {
+                    	            	case 1 :
+                    	            	    // InternalFormalML.g:4040:10: (lv_parameter_41_0= ruleParameterReturn )
+                    	            	    {
+                    	            	    // InternalFormalML.g:4040:10: (lv_parameter_41_0= ruleParameterReturn )
+                    	            	    // InternalFormalML.g:4041:11: lv_parameter_41_0= ruleParameterReturn
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0());
+                    	            	      										
+                    	            	    }
+                    	            	    pushFollow(FollowSets000.FOLLOW_53);
+                    	            	    lv_parameter_41_0=ruleParameterReturn();
+
+                    	            	    state._fsp--;
+                    	            	    if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											if (current==null) {
+                    	            	      												current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	            	      											}
+                    	            	      											add(
+                    	            	      												current,
+                    	            	      												"parameter",
+                    	            	      												lv_parameter_41_0,
+                    	            	      												"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+                    	            	      											afterParserOrEnumRuleCall();
+                    	            	      										
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    if ( cnt97 >= 1 ) break loop97;
+                    	            	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                        EarlyExitException eee =
+                    	                            new EarlyExitException(97, input);
+                    	                        throw eee;
+                    	                }
+                    	                cnt97++;
+                    	            } while (true);
+
+                    	            otherlv_42=(Token)match(input,23,FollowSets000.FOLLOW_50); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_42, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2());
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop99;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:4068:4: ( ( (lv_port_43_0= rulePort ) ) | ( (lv_signal_44_0= ruleSignal ) ) | ( (lv_buffer_45_0= ruleBuffer ) ) | ( (lv_channel_46_0= ruleChannel ) ) | ( (lv_typedef_47_0= ruleTypeDefinition ) ) | ( (lv_property_48_0= ruleVariable ) ) )*
+                    {
+                    // InternalFormalML.g:4068:4: ( ( (lv_port_43_0= rulePort ) ) | ( (lv_signal_44_0= ruleSignal ) ) | ( (lv_buffer_45_0= ruleBuffer ) ) | ( (lv_channel_46_0= ruleChannel ) ) | ( (lv_typedef_47_0= ruleTypeDefinition ) ) | ( (lv_property_48_0= ruleVariable ) ) )*
+                    loop100:
+                    do {
+                        int alt100=7;
+                        alt100 = dfa100.predict(input);
+                        switch (alt100) {
+                    	case 1 :
+                    	    // InternalFormalML.g:4069:5: ( (lv_port_43_0= rulePort ) )
+                    	    {
+                    	    // InternalFormalML.g:4069:5: ( (lv_port_43_0= rulePort ) )
+                    	    // InternalFormalML.g:4070:6: (lv_port_43_0= rulePort )
+                    	    {
+                    	    // InternalFormalML.g:4070:6: (lv_port_43_0= rulePort )
+                    	    // InternalFormalML.g:4071:7: lv_port_43_0= rulePort
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_7_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_54);
+                    	    lv_port_43_0=rulePort();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"port",
+                    	      								lv_port_43_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Port");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:4089:5: ( (lv_signal_44_0= ruleSignal ) )
+                    	    {
+                    	    // InternalFormalML.g:4089:5: ( (lv_signal_44_0= ruleSignal ) )
+                    	    // InternalFormalML.g:4090:6: (lv_signal_44_0= ruleSignal )
+                    	    {
+                    	    // InternalFormalML.g:4090:6: (lv_signal_44_0= ruleSignal )
+                    	    // InternalFormalML.g:4091:7: lv_signal_44_0= ruleSignal
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_7_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_54);
+                    	    lv_signal_44_0=ruleSignal();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"signal",
+                    	      								lv_signal_44_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalFormalML.g:4109:5: ( (lv_buffer_45_0= ruleBuffer ) )
+                    	    {
+                    	    // InternalFormalML.g:4109:5: ( (lv_buffer_45_0= ruleBuffer ) )
+                    	    // InternalFormalML.g:4110:6: (lv_buffer_45_0= ruleBuffer )
+                    	    {
+                    	    // InternalFormalML.g:4110:6: (lv_buffer_45_0= ruleBuffer )
+                    	    // InternalFormalML.g:4111:7: lv_buffer_45_0= ruleBuffer
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_7_1_2_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_54);
+                    	    lv_buffer_45_0=ruleBuffer();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"buffer",
+                    	      								lv_buffer_45_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalFormalML.g:4129:5: ( (lv_channel_46_0= ruleChannel ) )
+                    	    {
+                    	    // InternalFormalML.g:4129:5: ( (lv_channel_46_0= ruleChannel ) )
+                    	    // InternalFormalML.g:4130:6: (lv_channel_46_0= ruleChannel )
+                    	    {
+                    	    // InternalFormalML.g:4130:6: (lv_channel_46_0= ruleChannel )
+                    	    // InternalFormalML.g:4131:7: lv_channel_46_0= ruleChannel
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_7_1_3_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_54);
+                    	    lv_channel_46_0=ruleChannel();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"channel",
+                    	      								lv_channel_46_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalFormalML.g:4149:5: ( (lv_typedef_47_0= ruleTypeDefinition ) )
+                    	    {
+                    	    // InternalFormalML.g:4149:5: ( (lv_typedef_47_0= ruleTypeDefinition ) )
+                    	    // InternalFormalML.g:4150:6: (lv_typedef_47_0= ruleTypeDefinition )
+                    	    {
+                    	    // InternalFormalML.g:4150:6: (lv_typedef_47_0= ruleTypeDefinition )
+                    	    // InternalFormalML.g:4151:7: lv_typedef_47_0= ruleTypeDefinition
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_54);
+                    	    lv_typedef_47_0=ruleTypeDefinition();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"typedef",
+                    	      								lv_typedef_47_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalFormalML.g:4169:5: ( (lv_property_48_0= ruleVariable ) )
+                    	    {
+                    	    // InternalFormalML.g:4169:5: ( (lv_property_48_0= ruleVariable ) )
+                    	    // InternalFormalML.g:4170:6: (lv_property_48_0= ruleVariable )
+                    	    {
+                    	    // InternalFormalML.g:4170:6: (lv_property_48_0= ruleVariable )
+                    	    // InternalFormalML.g:4171:7: lv_property_48_0= ruleVariable
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_7_1_5_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_54);
+                    	    lv_property_48_0=ruleVariable();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"property",
+                    	      								lv_property_48_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop100;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:4190:3: ( (otherlv_49= '@input:' ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )* ) | (otherlv_54= '@inout:' ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )* ) | (otherlv_59= '@output:' ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )* ) | (otherlv_64= '@return:' ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )* ) )*
+            loop110:
+            do {
+                int alt110=5;
+                switch ( input.LA(1) ) {
+                case 65:
+                    {
+                    alt110=1;
+                    }
+                    break;
+                case 66:
+                    {
+                    alt110=2;
+                    }
+                    break;
+                case 67:
+                    {
+                    alt110=3;
+                    }
+                    break;
+                case 68:
+                    {
+                    alt110=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt110) {
+            	case 1 :
+            	    // InternalFormalML.g:4191:4: (otherlv_49= '@input:' ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )* )
+            	    {
+            	    // InternalFormalML.g:4191:4: (otherlv_49= '@input:' ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )* )
+            	    // InternalFormalML.g:4192:5: otherlv_49= '@input:' ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )*
+            	    {
+            	    otherlv_49=(Token)match(input,65,FollowSets000.FOLLOW_55); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_49, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:4196:5: ( ( (lv_parameter_50_0= ruleParameterInput ) ) | (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' ) )*
+            	    loop103:
+            	    do {
+            	        int alt103=3;
+            	        int LA103_0 = input.LA(1);
+
+            	        if ( (LA103_0==132) ) {
+            	            alt103=1;
+            	        }
+            	        else if ( (LA103_0==22) ) {
+            	            alt103=2;
+            	        }
+
+
+            	        switch (alt103) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:4197:6: ( (lv_parameter_50_0= ruleParameterInput ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4197:6: ( (lv_parameter_50_0= ruleParameterInput ) )
+            	    	    // InternalFormalML.g:4198:7: (lv_parameter_50_0= ruleParameterInput )
+            	    	    {
+            	    	    // InternalFormalML.g:4198:7: (lv_parameter_50_0= ruleParameterInput )
+            	    	    // InternalFormalML.g:4199:8: lv_parameter_50_0= ruleParameterInput
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_55);
+            	    	    lv_parameter_50_0=ruleParameterInput();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"parameter",
+            	    	      									lv_parameter_50_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:4217:6: (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' )
+            	    	    {
+            	    	    // InternalFormalML.g:4217:6: (otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}' )
+            	    	    // InternalFormalML.g:4218:7: otherlv_51= '{' ( (lv_parameter_52_0= ruleParameterInput ) )+ otherlv_53= '}'
+            	    	    {
+            	    	    otherlv_51=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_51, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_0_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    // InternalFormalML.g:4222:7: ( (lv_parameter_52_0= ruleParameterInput ) )+
+            	    	    int cnt102=0;
+            	    	    loop102:
+            	    	    do {
+            	    	        int alt102=2;
+            	    	        int LA102_0 = input.LA(1);
+
+            	    	        if ( (LA102_0==132) ) {
+            	    	            alt102=1;
+            	    	        }
+
+
+            	    	        switch (alt102) {
+            	    	    	case 1 :
+            	    	    	    // InternalFormalML.g:4223:8: (lv_parameter_52_0= ruleParameterInput )
+            	    	    	    {
+            	    	    	    // InternalFormalML.g:4223:8: (lv_parameter_52_0= ruleParameterInput )
+            	    	    	    // InternalFormalML.g:4224:9: lv_parameter_52_0= ruleParameterInput
+            	    	    	    {
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0());
+            	    	    	      								
+            	    	    	    }
+            	    	    	    pushFollow(FollowSets000.FOLLOW_53);
+            	    	    	    lv_parameter_52_0=ruleParameterInput();
+
+            	    	    	    state._fsp--;
+            	    	    	    if (state.failed) return current;
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									if (current==null) {
+            	    	    	      										current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	    	      									}
+            	    	    	      									add(
+            	    	    	      										current,
+            	    	    	      										"parameter",
+            	    	    	      										lv_parameter_52_0,
+            	    	    	      										"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+            	    	    	      									afterParserOrEnumRuleCall();
+            	    	    	      								
+            	    	    	    }
+
+            	    	    	    }
+
+
+            	    	    	    }
+            	    	    	    break;
+
+            	    	    	default :
+            	    	    	    if ( cnt102 >= 1 ) break loop102;
+            	    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	    	                EarlyExitException eee =
+            	    	                    new EarlyExitException(102, input);
+            	    	                throw eee;
+            	    	        }
+            	    	        cnt102++;
+            	    	    } while (true);
+
+            	    	    otherlv_53=(Token)match(input,23,FollowSets000.FOLLOW_55); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_53, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_0_1_1_2());
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop103;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:4249:4: (otherlv_54= '@inout:' ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )* )
+            	    {
+            	    // InternalFormalML.g:4249:4: (otherlv_54= '@inout:' ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )* )
+            	    // InternalFormalML.g:4250:5: otherlv_54= '@inout:' ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )*
+            	    {
+            	    otherlv_54=(Token)match(input,66,FollowSets000.FOLLOW_55); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_54, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:4254:5: ( ( (lv_parameter_55_0= ruleParameterInout ) ) | (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' ) )*
+            	    loop105:
+            	    do {
+            	        int alt105=3;
+            	        int LA105_0 = input.LA(1);
+
+            	        if ( (LA105_0==132) ) {
+            	            alt105=1;
+            	        }
+            	        else if ( (LA105_0==22) ) {
+            	            alt105=2;
+            	        }
+
+
+            	        switch (alt105) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:4255:6: ( (lv_parameter_55_0= ruleParameterInout ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4255:6: ( (lv_parameter_55_0= ruleParameterInout ) )
+            	    	    // InternalFormalML.g:4256:7: (lv_parameter_55_0= ruleParameterInout )
+            	    	    {
+            	    	    // InternalFormalML.g:4256:7: (lv_parameter_55_0= ruleParameterInout )
+            	    	    // InternalFormalML.g:4257:8: lv_parameter_55_0= ruleParameterInout
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_55);
+            	    	    lv_parameter_55_0=ruleParameterInout();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"parameter",
+            	    	      									lv_parameter_55_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:4275:6: (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' )
+            	    	    {
+            	    	    // InternalFormalML.g:4275:6: (otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}' )
+            	    	    // InternalFormalML.g:4276:7: otherlv_56= '{' ( (lv_parameter_57_0= ruleParameterInout ) )+ otherlv_58= '}'
+            	    	    {
+            	    	    otherlv_56=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_56, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_1_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    // InternalFormalML.g:4280:7: ( (lv_parameter_57_0= ruleParameterInout ) )+
+            	    	    int cnt104=0;
+            	    	    loop104:
+            	    	    do {
+            	    	        int alt104=2;
+            	    	        int LA104_0 = input.LA(1);
+
+            	    	        if ( (LA104_0==132) ) {
+            	    	            alt104=1;
+            	    	        }
+
+
+            	    	        switch (alt104) {
+            	    	    	case 1 :
+            	    	    	    // InternalFormalML.g:4281:8: (lv_parameter_57_0= ruleParameterInout )
+            	    	    	    {
+            	    	    	    // InternalFormalML.g:4281:8: (lv_parameter_57_0= ruleParameterInout )
+            	    	    	    // InternalFormalML.g:4282:9: lv_parameter_57_0= ruleParameterInout
+            	    	    	    {
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0());
+            	    	    	      								
+            	    	    	    }
+            	    	    	    pushFollow(FollowSets000.FOLLOW_53);
+            	    	    	    lv_parameter_57_0=ruleParameterInout();
+
+            	    	    	    state._fsp--;
+            	    	    	    if (state.failed) return current;
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									if (current==null) {
+            	    	    	      										current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	    	      									}
+            	    	    	      									add(
+            	    	    	      										current,
+            	    	    	      										"parameter",
+            	    	    	      										lv_parameter_57_0,
+            	    	    	      										"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+            	    	    	      									afterParserOrEnumRuleCall();
+            	    	    	      								
+            	    	    	    }
+
+            	    	    	    }
+
+
+            	    	    	    }
+            	    	    	    break;
+
+            	    	    	default :
+            	    	    	    if ( cnt104 >= 1 ) break loop104;
+            	    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	    	                EarlyExitException eee =
+            	    	                    new EarlyExitException(104, input);
+            	    	                throw eee;
+            	    	        }
+            	    	        cnt104++;
+            	    	    } while (true);
+
+            	    	    otherlv_58=(Token)match(input,23,FollowSets000.FOLLOW_55); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_58, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_1_1_1_2());
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop105;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:4307:4: (otherlv_59= '@output:' ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )* )
+            	    {
+            	    // InternalFormalML.g:4307:4: (otherlv_59= '@output:' ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )* )
+            	    // InternalFormalML.g:4308:5: otherlv_59= '@output:' ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )*
+            	    {
+            	    otherlv_59=(Token)match(input,67,FollowSets000.FOLLOW_55); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_59, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:4312:5: ( ( (lv_parameter_60_0= ruleParameterOutput ) ) | (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' ) )*
+            	    loop107:
+            	    do {
+            	        int alt107=3;
+            	        int LA107_0 = input.LA(1);
+
+            	        if ( (LA107_0==132) ) {
+            	            alt107=1;
+            	        }
+            	        else if ( (LA107_0==22) ) {
+            	            alt107=2;
+            	        }
+
+
+            	        switch (alt107) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:4313:6: ( (lv_parameter_60_0= ruleParameterOutput ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4313:6: ( (lv_parameter_60_0= ruleParameterOutput ) )
+            	    	    // InternalFormalML.g:4314:7: (lv_parameter_60_0= ruleParameterOutput )
+            	    	    {
+            	    	    // InternalFormalML.g:4314:7: (lv_parameter_60_0= ruleParameterOutput )
+            	    	    // InternalFormalML.g:4315:8: lv_parameter_60_0= ruleParameterOutput
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_55);
+            	    	    lv_parameter_60_0=ruleParameterOutput();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"parameter",
+            	    	      									lv_parameter_60_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:4333:6: (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' )
+            	    	    {
+            	    	    // InternalFormalML.g:4333:6: (otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}' )
+            	    	    // InternalFormalML.g:4334:7: otherlv_61= '{' ( (lv_parameter_62_0= ruleParameterOutput ) )+ otherlv_63= '}'
+            	    	    {
+            	    	    otherlv_61=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_61, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_2_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    // InternalFormalML.g:4338:7: ( (lv_parameter_62_0= ruleParameterOutput ) )+
+            	    	    int cnt106=0;
+            	    	    loop106:
+            	    	    do {
+            	    	        int alt106=2;
+            	    	        int LA106_0 = input.LA(1);
+
+            	    	        if ( (LA106_0==132) ) {
+            	    	            alt106=1;
+            	    	        }
+
+
+            	    	        switch (alt106) {
+            	    	    	case 1 :
+            	    	    	    // InternalFormalML.g:4339:8: (lv_parameter_62_0= ruleParameterOutput )
+            	    	    	    {
+            	    	    	    // InternalFormalML.g:4339:8: (lv_parameter_62_0= ruleParameterOutput )
+            	    	    	    // InternalFormalML.g:4340:9: lv_parameter_62_0= ruleParameterOutput
+            	    	    	    {
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0());
+            	    	    	      								
+            	    	    	    }
+            	    	    	    pushFollow(FollowSets000.FOLLOW_53);
+            	    	    	    lv_parameter_62_0=ruleParameterOutput();
+
+            	    	    	    state._fsp--;
+            	    	    	    if (state.failed) return current;
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									if (current==null) {
+            	    	    	      										current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	    	      									}
+            	    	    	      									add(
+            	    	    	      										current,
+            	    	    	      										"parameter",
+            	    	    	      										lv_parameter_62_0,
+            	    	    	      										"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+            	    	    	      									afterParserOrEnumRuleCall();
+            	    	    	      								
+            	    	    	    }
+
+            	    	    	    }
+
+
+            	    	    	    }
+            	    	    	    break;
+
+            	    	    	default :
+            	    	    	    if ( cnt106 >= 1 ) break loop106;
+            	    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	    	                EarlyExitException eee =
+            	    	                    new EarlyExitException(106, input);
+            	    	                throw eee;
+            	    	        }
+            	    	        cnt106++;
+            	    	    } while (true);
+
+            	    	    otherlv_63=(Token)match(input,23,FollowSets000.FOLLOW_55); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_63, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_2_1_1_2());
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop107;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:4365:4: (otherlv_64= '@return:' ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )* )
+            	    {
+            	    // InternalFormalML.g:4365:4: (otherlv_64= '@return:' ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )* )
+            	    // InternalFormalML.g:4366:5: otherlv_64= '@return:' ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )*
+            	    {
+            	    otherlv_64=(Token)match(input,68,FollowSets000.FOLLOW_55); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_64, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:4370:5: ( ( (lv_parameter_65_0= ruleParameterReturn ) ) | (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' ) )*
+            	    loop109:
+            	    do {
+            	        int alt109=3;
+            	        int LA109_0 = input.LA(1);
+
+            	        if ( (LA109_0==132) ) {
+            	            alt109=1;
+            	        }
+            	        else if ( (LA109_0==22) ) {
+            	            alt109=2;
+            	        }
+
+
+            	        switch (alt109) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:4371:6: ( (lv_parameter_65_0= ruleParameterReturn ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4371:6: ( (lv_parameter_65_0= ruleParameterReturn ) )
+            	    	    // InternalFormalML.g:4372:7: (lv_parameter_65_0= ruleParameterReturn )
+            	    	    {
+            	    	    // InternalFormalML.g:4372:7: (lv_parameter_65_0= ruleParameterReturn )
+            	    	    // InternalFormalML.g:4373:8: lv_parameter_65_0= ruleParameterReturn
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_55);
+            	    	    lv_parameter_65_0=ruleParameterReturn();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"parameter",
+            	    	      									lv_parameter_65_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:4391:6: (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' )
+            	    	    {
+            	    	    // InternalFormalML.g:4391:6: (otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}' )
+            	    	    // InternalFormalML.g:4392:7: otherlv_66= '{' ( (lv_parameter_67_0= ruleParameterReturn ) )+ otherlv_68= '}'
+            	    	    {
+            	    	    otherlv_66=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_66, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_3_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    // InternalFormalML.g:4396:7: ( (lv_parameter_67_0= ruleParameterReturn ) )+
+            	    	    int cnt108=0;
+            	    	    loop108:
+            	    	    do {
+            	    	        int alt108=2;
+            	    	        int LA108_0 = input.LA(1);
+
+            	    	        if ( (LA108_0==132) ) {
+            	    	            alt108=1;
+            	    	        }
+
+
+            	    	        switch (alt108) {
+            	    	    	case 1 :
+            	    	    	    // InternalFormalML.g:4397:8: (lv_parameter_67_0= ruleParameterReturn )
+            	    	    	    {
+            	    	    	    // InternalFormalML.g:4397:8: (lv_parameter_67_0= ruleParameterReturn )
+            	    	    	    // InternalFormalML.g:4398:9: lv_parameter_67_0= ruleParameterReturn
+            	    	    	    {
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									newCompositeNode(grammarAccess.getProcedureAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0());
+            	    	    	      								
+            	    	    	    }
+            	    	    	    pushFollow(FollowSets000.FOLLOW_53);
+            	    	    	    lv_parameter_67_0=ruleParameterReturn();
+
+            	    	    	    state._fsp--;
+            	    	    	    if (state.failed) return current;
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									if (current==null) {
+            	    	    	      										current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	    	      									}
+            	    	    	      									add(
+            	    	    	      										current,
+            	    	    	      										"parameter",
+            	    	    	      										lv_parameter_67_0,
+            	    	    	      										"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+            	    	    	      									afterParserOrEnumRuleCall();
+            	    	    	      								
+            	    	    	    }
+
+            	    	    	    }
+
+
+            	    	    	    }
+            	    	    	    break;
+
+            	    	    	default :
+            	    	    	    if ( cnt108 >= 1 ) break loop108;
+            	    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	    	                EarlyExitException eee =
+            	    	                    new EarlyExitException(108, input);
+            	    	                throw eee;
+            	    	        }
+            	    	        cnt108++;
+            	    	    } while (true);
+
+            	    	    otherlv_68=(Token)match(input,23,FollowSets000.FOLLOW_55); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_68, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_3_1_1_2());
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop109;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop110;
+                }
+            } while (true);
+
+            // InternalFormalML.g:4423:3: ( (otherlv_69= '@property:' ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )* ) | (otherlv_76= '@public:' ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )* ) | (otherlv_83= '@protected:' ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )* ) | (otherlv_90= '@private:' ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )* ) )*
+            loop115:
+            do {
+                int alt115=5;
+                switch ( input.LA(1) ) {
+                case 38:
+                    {
+                    alt115=1;
+                    }
+                    break;
+                case 39:
+                    {
+                    alt115=2;
+                    }
+                    break;
+                case 40:
+                    {
+                    alt115=3;
+                    }
+                    break;
+                case 41:
+                    {
+                    alt115=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt115) {
+            	case 1 :
+            	    // InternalFormalML.g:4424:4: (otherlv_69= '@property:' ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )* )
+            	    {
+            	    // InternalFormalML.g:4424:4: (otherlv_69= '@property:' ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )* )
+            	    // InternalFormalML.g:4425:5: otherlv_69= '@property:' ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )*
+            	    {
+            	    otherlv_69=(Token)match(input,38,FollowSets000.FOLLOW_56); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_69, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:4429:5: ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )*
+            	    loop111:
+            	    do {
+            	        int alt111=7;
+            	        alt111 = dfa111.predict(input);
+            	        switch (alt111) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:4430:6: ( (lv_port_70_0= rulePort ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4430:6: ( (lv_port_70_0= rulePort ) )
+            	    	    // InternalFormalML.g:4431:7: (lv_port_70_0= rulePort )
+            	    	    {
+            	    	    // InternalFormalML.g:4431:7: (lv_port_70_0= rulePort )
+            	    	    // InternalFormalML.g:4432:8: lv_port_70_0= rulePort
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortParserRuleCall_9_0_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_port_70_0=rulePort();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_70_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Port");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:4450:6: ( (lv_signal_71_0= ruleSignal ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4450:6: ( (lv_signal_71_0= ruleSignal ) )
+            	    	    // InternalFormalML.g:4451:7: (lv_signal_71_0= ruleSignal )
+            	    	    {
+            	    	    // InternalFormalML.g:4451:7: (lv_signal_71_0= ruleSignal )
+            	    	    // InternalFormalML.g:4452:8: lv_signal_71_0= ruleSignal
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalParserRuleCall_9_0_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_signal_71_0=ruleSignal();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_71_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:4470:6: ( (lv_buffer_72_0= ruleBuffer ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4470:6: ( (lv_buffer_72_0= ruleBuffer ) )
+            	    	    // InternalFormalML.g:4471:7: (lv_buffer_72_0= ruleBuffer )
+            	    	    {
+            	    	    // InternalFormalML.g:4471:7: (lv_buffer_72_0= ruleBuffer )
+            	    	    // InternalFormalML.g:4472:8: lv_buffer_72_0= ruleBuffer
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferParserRuleCall_9_0_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_buffer_72_0=ruleBuffer();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_72_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:4490:6: ( (lv_channel_73_0= ruleChannel ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4490:6: ( (lv_channel_73_0= ruleChannel ) )
+            	    	    // InternalFormalML.g:4491:7: (lv_channel_73_0= ruleChannel )
+            	    	    {
+            	    	    // InternalFormalML.g:4491:7: (lv_channel_73_0= ruleChannel )
+            	    	    // InternalFormalML.g:4492:8: lv_channel_73_0= ruleChannel
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelParserRuleCall_9_0_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_channel_73_0=ruleChannel();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_73_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:4510:6: ( (lv_typedef_74_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4510:6: ( (lv_typedef_74_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:4511:7: (lv_typedef_74_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:4511:7: (lv_typedef_74_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:4512:8: lv_typedef_74_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_typedef_74_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_74_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:4530:6: ( (lv_property_75_0= ruleVariable ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4530:6: ( (lv_property_75_0= ruleVariable ) )
+            	    	    // InternalFormalML.g:4531:7: (lv_property_75_0= ruleVariable )
+            	    	    {
+            	    	    // InternalFormalML.g:4531:7: (lv_property_75_0= ruleVariable )
+            	    	    // InternalFormalML.g:4532:8: lv_property_75_0= ruleVariable
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariableParserRuleCall_9_0_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_property_75_0=ruleVariable();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_75_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop111;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:4552:4: (otherlv_76= '@public:' ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )* )
+            	    {
+            	    // InternalFormalML.g:4552:4: (otherlv_76= '@public:' ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )* )
+            	    // InternalFormalML.g:4553:5: otherlv_76= '@public:' ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )*
+            	    {
+            	    otherlv_76=(Token)match(input,39,FollowSets000.FOLLOW_56); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_76, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:4557:5: ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )*
+            	    loop112:
+            	    do {
+            	        int alt112=7;
+            	        alt112 = dfa112.predict(input);
+            	        switch (alt112) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:4558:6: ( (lv_port_77_0= rulePortPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4558:6: ( (lv_port_77_0= rulePortPublic ) )
+            	    	    // InternalFormalML.g:4559:7: (lv_port_77_0= rulePortPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:4559:7: (lv_port_77_0= rulePortPublic )
+            	    	    // InternalFormalML.g:4560:8: lv_port_77_0= rulePortPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortPublicParserRuleCall_9_1_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_port_77_0=rulePortPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_77_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:4578:6: ( (lv_signal_78_0= ruleSignalPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4578:6: ( (lv_signal_78_0= ruleSignalPublic ) )
+            	    	    // InternalFormalML.g:4579:7: (lv_signal_78_0= ruleSignalPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:4579:7: (lv_signal_78_0= ruleSignalPublic )
+            	    	    // InternalFormalML.g:4580:8: lv_signal_78_0= ruleSignalPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_signal_78_0=ruleSignalPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_78_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:4598:6: ( (lv_buffer_79_0= ruleBufferPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4598:6: ( (lv_buffer_79_0= ruleBufferPublic ) )
+            	    	    // InternalFormalML.g:4599:7: (lv_buffer_79_0= ruleBufferPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:4599:7: (lv_buffer_79_0= ruleBufferPublic )
+            	    	    // InternalFormalML.g:4600:8: lv_buffer_79_0= ruleBufferPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_buffer_79_0=ruleBufferPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_79_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:4618:6: ( (lv_channel_80_0= ruleChannelPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4618:6: ( (lv_channel_80_0= ruleChannelPublic ) )
+            	    	    // InternalFormalML.g:4619:7: (lv_channel_80_0= ruleChannelPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:4619:7: (lv_channel_80_0= ruleChannelPublic )
+            	    	    // InternalFormalML.g:4620:8: lv_channel_80_0= ruleChannelPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_channel_80_0=ruleChannelPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_80_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:4638:6: ( (lv_typedef_81_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4638:6: ( (lv_typedef_81_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:4639:7: (lv_typedef_81_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:4639:7: (lv_typedef_81_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:4640:8: lv_typedef_81_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_typedef_81_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_81_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:4658:6: ( (lv_property_82_0= ruleVariablePublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4658:6: ( (lv_property_82_0= ruleVariablePublic ) )
+            	    	    // InternalFormalML.g:4659:7: (lv_property_82_0= ruleVariablePublic )
+            	    	    {
+            	    	    // InternalFormalML.g:4659:7: (lv_property_82_0= ruleVariablePublic )
+            	    	    // InternalFormalML.g:4660:8: lv_property_82_0= ruleVariablePublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_property_82_0=ruleVariablePublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_82_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop112;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:4680:4: (otherlv_83= '@protected:' ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )* )
+            	    {
+            	    // InternalFormalML.g:4680:4: (otherlv_83= '@protected:' ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )* )
+            	    // InternalFormalML.g:4681:5: otherlv_83= '@protected:' ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )*
+            	    {
+            	    otherlv_83=(Token)match(input,40,FollowSets000.FOLLOW_56); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_83, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:4685:5: ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )*
+            	    loop113:
+            	    do {
+            	        int alt113=7;
+            	        alt113 = dfa113.predict(input);
+            	        switch (alt113) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:4686:6: ( (lv_port_84_0= rulePortProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4686:6: ( (lv_port_84_0= rulePortProtected ) )
+            	    	    // InternalFormalML.g:4687:7: (lv_port_84_0= rulePortProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:4687:7: (lv_port_84_0= rulePortProtected )
+            	    	    // InternalFormalML.g:4688:8: lv_port_84_0= rulePortProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_port_84_0=rulePortProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_84_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:4706:6: ( (lv_signal_85_0= ruleSignalProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4706:6: ( (lv_signal_85_0= ruleSignalProtected ) )
+            	    	    // InternalFormalML.g:4707:7: (lv_signal_85_0= ruleSignalProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:4707:7: (lv_signal_85_0= ruleSignalProtected )
+            	    	    // InternalFormalML.g:4708:8: lv_signal_85_0= ruleSignalProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_signal_85_0=ruleSignalProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_85_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:4726:6: ( (lv_buffer_86_0= ruleBufferProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4726:6: ( (lv_buffer_86_0= ruleBufferProtected ) )
+            	    	    // InternalFormalML.g:4727:7: (lv_buffer_86_0= ruleBufferProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:4727:7: (lv_buffer_86_0= ruleBufferProtected )
+            	    	    // InternalFormalML.g:4728:8: lv_buffer_86_0= ruleBufferProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_buffer_86_0=ruleBufferProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_86_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:4746:6: ( (lv_channel_87_0= ruleChannelProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4746:6: ( (lv_channel_87_0= ruleChannelProtected ) )
+            	    	    // InternalFormalML.g:4747:7: (lv_channel_87_0= ruleChannelProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:4747:7: (lv_channel_87_0= ruleChannelProtected )
+            	    	    // InternalFormalML.g:4748:8: lv_channel_87_0= ruleChannelProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_channel_87_0=ruleChannelProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_87_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:4766:6: ( (lv_typedef_88_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4766:6: ( (lv_typedef_88_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:4767:7: (lv_typedef_88_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:4767:7: (lv_typedef_88_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:4768:8: lv_typedef_88_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_typedef_88_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_88_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:4786:6: ( (lv_property_89_0= ruleVariableProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4786:6: ( (lv_property_89_0= ruleVariableProtected ) )
+            	    	    // InternalFormalML.g:4787:7: (lv_property_89_0= ruleVariableProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:4787:7: (lv_property_89_0= ruleVariableProtected )
+            	    	    // InternalFormalML.g:4788:8: lv_property_89_0= ruleVariableProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_property_89_0=ruleVariableProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_89_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop113;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:4808:4: (otherlv_90= '@private:' ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )* )
+            	    {
+            	    // InternalFormalML.g:4808:4: (otherlv_90= '@private:' ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )* )
+            	    // InternalFormalML.g:4809:5: otherlv_90= '@private:' ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )*
+            	    {
+            	    otherlv_90=(Token)match(input,41,FollowSets000.FOLLOW_56); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_90, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:4813:5: ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )*
+            	    loop114:
+            	    do {
+            	        int alt114=7;
+            	        alt114 = dfa114.predict(input);
+            	        switch (alt114) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:4814:6: ( (lv_port_91_0= rulePortPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4814:6: ( (lv_port_91_0= rulePortPrivate ) )
+            	    	    // InternalFormalML.g:4815:7: (lv_port_91_0= rulePortPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:4815:7: (lv_port_91_0= rulePortPrivate )
+            	    	    // InternalFormalML.g:4816:8: lv_port_91_0= rulePortPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_port_91_0=rulePortPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_91_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:4834:6: ( (lv_signal_92_0= ruleSignalPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4834:6: ( (lv_signal_92_0= ruleSignalPrivate ) )
+            	    	    // InternalFormalML.g:4835:7: (lv_signal_92_0= ruleSignalPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:4835:7: (lv_signal_92_0= ruleSignalPrivate )
+            	    	    // InternalFormalML.g:4836:8: lv_signal_92_0= ruleSignalPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_signal_92_0=ruleSignalPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_92_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:4854:6: ( (lv_buffer_93_0= ruleBufferPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4854:6: ( (lv_buffer_93_0= ruleBufferPrivate ) )
+            	    	    // InternalFormalML.g:4855:7: (lv_buffer_93_0= ruleBufferPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:4855:7: (lv_buffer_93_0= ruleBufferPrivate )
+            	    	    // InternalFormalML.g:4856:8: lv_buffer_93_0= ruleBufferPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_buffer_93_0=ruleBufferPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_93_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:4874:6: ( (lv_channel_94_0= ruleChannelPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4874:6: ( (lv_channel_94_0= ruleChannelPrivate ) )
+            	    	    // InternalFormalML.g:4875:7: (lv_channel_94_0= ruleChannelPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:4875:7: (lv_channel_94_0= ruleChannelPrivate )
+            	    	    // InternalFormalML.g:4876:8: lv_channel_94_0= ruleChannelPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_channel_94_0=ruleChannelPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_94_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:4894:6: ( (lv_typedef_95_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4894:6: ( (lv_typedef_95_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:4895:7: (lv_typedef_95_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:4895:7: (lv_typedef_95_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:4896:8: lv_typedef_95_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_typedef_95_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_95_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:4914:6: ( (lv_property_96_0= ruleVariablePrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:4914:6: ( (lv_property_96_0= ruleVariablePrivate ) )
+            	    	    // InternalFormalML.g:4915:7: (lv_property_96_0= ruleVariablePrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:4915:7: (lv_property_96_0= ruleVariablePrivate )
+            	    	    // InternalFormalML.g:4916:8: lv_property_96_0= ruleVariablePrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_56);
+            	    	    lv_property_96_0=ruleVariablePrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_96_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop114;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop115;
+                }
+            } while (true);
+
+            // InternalFormalML.g:4936:3: ( ( ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ ) | (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_102_0= ruleRoutine ) ) | ( (lv_procedure_103_0= ruleProcedure ) ) )+ )
+            int alt121=2;
+            int LA121_0 = input.LA(1);
+
+            if ( (LA121_0==23||(LA121_0>=42 && LA121_0<=44)||LA121_0==51||(LA121_0>=69 && LA121_0<=71)||(LA121_0>=73 && LA121_0<=76)||LA121_0==86||(LA121_0>=88 && LA121_0<=91)) ) {
+                alt121=1;
+            }
+            else if ( (LA121_0==19||LA121_0==58||(LA121_0>=93 && LA121_0<=94)||(LA121_0>=240 && LA121_0<=242)) ) {
+                alt121=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 121, 0, input);
+
+                throw nvae;
+            }
+            switch (alt121) {
+                case 1 :
+                    // InternalFormalML.g:4937:4: ( ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ ) | (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ ) )*
+                    {
+                    // InternalFormalML.g:4937:4: ( ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ ) | (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ ) )*
+                    loop119:
+                    do {
+                        int alt119=3;
+                        int LA119_0 = input.LA(1);
+
+                        if ( ((LA119_0>=42 && LA119_0<=43)) ) {
+                            alt119=1;
+                        }
+                        else if ( (LA119_0==44) ) {
+                            alt119=2;
+                        }
+
+
+                        switch (alt119) {
+                    	case 1 :
+                    	    // InternalFormalML.g:4938:5: ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ )
+                    	    {
+                    	    // InternalFormalML.g:4938:5: ( (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+ )
+                    	    // InternalFormalML.g:4939:6: (otherlv_97= '@routine:' | otherlv_98= '@macro:' ) ( (lv_routine_99_0= ruleRoutine ) )+
+                    	    {
+                    	    // InternalFormalML.g:4939:6: (otherlv_97= '@routine:' | otherlv_98= '@macro:' )
+                    	    int alt116=2;
+                    	    int LA116_0 = input.LA(1);
+
+                    	    if ( (LA116_0==42) ) {
+                    	        alt116=1;
+                    	    }
+                    	    else if ( (LA116_0==43) ) {
+                    	        alt116=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 116, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt116) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:4940:7: otherlv_97= '@routine:'
+                    	            {
+                    	            otherlv_97=(Token)match(input,42,FollowSets000.FOLLOW_26); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_97, grammarAccess.getProcedureAccess().getRoutineKeyword_10_0_0_0_0());
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:4945:7: otherlv_98= '@macro:'
+                    	            {
+                    	            otherlv_98=(Token)match(input,43,FollowSets000.FOLLOW_26); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_98, grammarAccess.getProcedureAccess().getMacroKeyword_10_0_0_0_1());
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    // InternalFormalML.g:4950:6: ( (lv_routine_99_0= ruleRoutine ) )+
+                    	    int cnt117=0;
+                    	    loop117:
+                    	    do {
+                    	        int alt117=2;
+                    	        int LA117_0 = input.LA(1);
+
+                    	        if ( (LA117_0==19||(LA117_0>=93 && LA117_0<=94)||(LA117_0>=240 && LA117_0<=242)) ) {
+                    	            alt117=1;
+                    	        }
+
+
+                    	        switch (alt117) {
+                    	    	case 1 :
+                    	    	    // InternalFormalML.g:4951:7: (lv_routine_99_0= ruleRoutine )
+                    	    	    {
+                    	    	    // InternalFormalML.g:4951:7: (lv_routine_99_0= ruleRoutine )
+                    	    	    // InternalFormalML.g:4952:8: lv_routine_99_0= ruleRoutine
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0());
+                    	    	      							
+                    	    	    }
+                    	    	    pushFollow(FollowSets000.FOLLOW_57);
+                    	    	    lv_routine_99_0=ruleRoutine();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								if (current==null) {
+                    	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	    	      								}
+                    	    	      								add(
+                    	    	      									current,
+                    	    	      									"routine",
+                    	    	      									lv_routine_99_0,
+                    	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+                    	    	      								afterParserOrEnumRuleCall();
+                    	    	      							
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    if ( cnt117 >= 1 ) break loop117;
+                    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                EarlyExitException eee =
+                    	                    new EarlyExitException(117, input);
+                    	                throw eee;
+                    	        }
+                    	        cnt117++;
+                    	    } while (true);
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:4971:5: (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ )
+                    	    {
+                    	    // InternalFormalML.g:4971:5: (otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+ )
+                    	    // InternalFormalML.g:4972:6: otherlv_100= '@procedure:' ( (lv_procedure_101_0= ruleProcedure ) )+
+                    	    {
+                    	    otherlv_100=(Token)match(input,44,FollowSets000.FOLLOW_25); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_100, grammarAccess.getProcedureAccess().getProcedureKeyword_10_0_1_0());
+                    	      					
+                    	    }
+                    	    // InternalFormalML.g:4976:6: ( (lv_procedure_101_0= ruleProcedure ) )+
+                    	    int cnt118=0;
+                    	    loop118:
+                    	    do {
+                    	        int alt118=2;
+                    	        int LA118_0 = input.LA(1);
+
+                    	        if ( (LA118_0==19||LA118_0==58||(LA118_0>=240 && LA118_0<=242)) ) {
+                    	            alt118=1;
+                    	        }
+
+
+                    	        switch (alt118) {
+                    	    	case 1 :
+                    	    	    // InternalFormalML.g:4977:7: (lv_procedure_101_0= ruleProcedure )
+                    	    	    {
+                    	    	    // InternalFormalML.g:4977:7: (lv_procedure_101_0= ruleProcedure )
+                    	    	    // InternalFormalML.g:4978:8: lv_procedure_101_0= ruleProcedure
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								newCompositeNode(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0());
+                    	    	      							
+                    	    	    }
+                    	    	    pushFollow(FollowSets000.FOLLOW_56);
+                    	    	    lv_procedure_101_0=ruleProcedure();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								if (current==null) {
+                    	    	      									current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	    	      								}
+                    	    	      								add(
+                    	    	      									current,
+                    	    	      									"procedure",
+                    	    	      									lv_procedure_101_0,
+                    	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+                    	    	      								afterParserOrEnumRuleCall();
+                    	    	      							
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    if ( cnt118 >= 1 ) break loop118;
+                    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                EarlyExitException eee =
+                    	                    new EarlyExitException(118, input);
+                    	                throw eee;
+                    	        }
+                    	        cnt118++;
+                    	    } while (true);
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop119;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:4998:4: ( ( (lv_routine_102_0= ruleRoutine ) ) | ( (lv_procedure_103_0= ruleProcedure ) ) )+
+                    {
+                    // InternalFormalML.g:4998:4: ( ( (lv_routine_102_0= ruleRoutine ) ) | ( (lv_procedure_103_0= ruleProcedure ) ) )+
+                    int cnt120=0;
+                    loop120:
+                    do {
+                        int alt120=3;
+                        switch ( input.LA(1) ) {
+                        case 240:
+                            {
+                            int LA120_2 = input.LA(2);
+
+                            if ( ((LA120_2>=93 && LA120_2<=94)) ) {
+                                alt120=1;
+                            }
+                            else if ( (LA120_2==58) ) {
+                                alt120=2;
+                            }
+
+
+                            }
+                            break;
+                        case 241:
+                            {
+                            int LA120_3 = input.LA(2);
+
+                            if ( (LA120_3==58) ) {
+                                alt120=2;
+                            }
+                            else if ( ((LA120_3>=93 && LA120_3<=94)) ) {
+                                alt120=1;
+                            }
+
+
+                            }
+                            break;
+                        case 242:
+                            {
+                            int LA120_4 = input.LA(2);
+
+                            if ( ((LA120_4>=93 && LA120_4<=94)) ) {
+                                alt120=1;
+                            }
+                            else if ( (LA120_4==58) ) {
+                                alt120=2;
+                            }
+
+
+                            }
+                            break;
+                        case 19:
+                            {
+                            int LA120_5 = input.LA(2);
+
+                            if ( (LA120_5==58) ) {
+                                alt120=2;
+                            }
+                            else if ( ((LA120_5>=93 && LA120_5<=94)) ) {
+                                alt120=1;
+                            }
+
+
+                            }
+                            break;
+                        case 93:
+                        case 94:
+                            {
+                            alt120=1;
+                            }
+                            break;
+                        case 58:
+                            {
+                            alt120=2;
+                            }
+                            break;
+
+                        }
+
+                        switch (alt120) {
+                    	case 1 :
+                    	    // InternalFormalML.g:4999:5: ( (lv_routine_102_0= ruleRoutine ) )
+                    	    {
+                    	    // InternalFormalML.g:4999:5: ( (lv_routine_102_0= ruleRoutine ) )
+                    	    // InternalFormalML.g:5000:6: (lv_routine_102_0= ruleRoutine )
+                    	    {
+                    	    // InternalFormalML.g:5000:6: (lv_routine_102_0= ruleRoutine )
+                    	    // InternalFormalML.g:5001:7: lv_routine_102_0= ruleRoutine
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getProcedureAccess().getRoutineRoutineParserRuleCall_10_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_56);
+                    	    lv_routine_102_0=ruleRoutine();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"routine",
+                    	      								lv_routine_102_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:5019:5: ( (lv_procedure_103_0= ruleProcedure ) )
+                    	    {
+                    	    // InternalFormalML.g:5019:5: ( (lv_procedure_103_0= ruleProcedure ) )
+                    	    // InternalFormalML.g:5020:6: (lv_procedure_103_0= ruleProcedure )
+                    	    {
+                    	    // InternalFormalML.g:5020:6: (lv_procedure_103_0= ruleProcedure )
+                    	    // InternalFormalML.g:5021:7: lv_procedure_103_0= ruleProcedure
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getProcedureAccess().getProcedureProcedureParserRuleCall_10_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_56);
+                    	    lv_procedure_103_0=ruleProcedure();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"procedure",
+                    	      								lv_procedure_103_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt120 >= 1 ) break loop120;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(120, input);
+                                throw eee;
+                        }
+                        cnt120++;
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:5040:3: ( ( (lv_region_104_0= ruleStatemachineRegion ) )+ | ( (lv_region_105_0= ruleStatemachineRegionLite ) ) )?
+            int alt123=3;
+            int LA123_0 = input.LA(1);
+
+            if ( (LA123_0==51||(LA123_0>=73 && LA123_0<=75)) ) {
+                alt123=1;
+            }
+            else if ( (LA123_0==76||LA123_0==86||(LA123_0>=88 && LA123_0<=91)) ) {
+                alt123=2;
+            }
+            switch (alt123) {
+                case 1 :
+                    // InternalFormalML.g:5041:4: ( (lv_region_104_0= ruleStatemachineRegion ) )+
+                    {
+                    // InternalFormalML.g:5041:4: ( (lv_region_104_0= ruleStatemachineRegion ) )+
+                    int cnt122=0;
+                    loop122:
+                    do {
+                        int alt122=2;
+                        int LA122_0 = input.LA(1);
+
+                        if ( (LA122_0==51||(LA122_0>=73 && LA122_0<=75)) ) {
+                            alt122=1;
+                        }
+
+
+                        switch (alt122) {
+                    	case 1 :
+                    	    // InternalFormalML.g:5042:5: (lv_region_104_0= ruleStatemachineRegion )
+                    	    {
+                    	    // InternalFormalML.g:5042:5: (lv_region_104_0= ruleStatemachineRegion )
+                    	    // InternalFormalML.g:5043:6: lv_region_104_0= ruleStatemachineRegion
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getProcedureAccess().getRegionStatemachineRegionParserRuleCall_11_0_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_58);
+                    	    lv_region_104_0=ruleStatemachineRegion();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getProcedureRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"region",
+                    	      							lv_region_104_0,
+                    	      							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt122 >= 1 ) break loop122;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(122, input);
+                                throw eee;
+                        }
+                        cnt122++;
+                    } while (true);
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:5061:4: ( (lv_region_105_0= ruleStatemachineRegionLite ) )
+                    {
+                    // InternalFormalML.g:5061:4: ( (lv_region_105_0= ruleStatemachineRegionLite ) )
+                    // InternalFormalML.g:5062:5: (lv_region_105_0= ruleStatemachineRegionLite )
+                    {
+                    // InternalFormalML.g:5062:5: (lv_region_105_0= ruleStatemachineRegionLite )
+                    // InternalFormalML.g:5063:6: lv_region_105_0= ruleStatemachineRegionLite
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getProcedureAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_59);
+                    lv_region_105_0=ruleStatemachineRegionLite();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getProcedureRule());
+                      						}
+                      						add(
+                      							current,
+                      							"region",
+                      							lv_region_105_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:5081:3: ( (lv_execution_106_0= ruleProcedureExecution ) )?
+            int alt124=2;
+            int LA124_0 = input.LA(1);
+
+            if ( ((LA124_0>=69 && LA124_0<=71)) ) {
+                alt124=1;
+            }
+            else if ( (LA124_0==23) ) {
+                int LA124_2 = input.LA(2);
+
+                if ( (synpred241_InternalFormalML()) ) {
+                    alt124=1;
+                }
+            }
+            switch (alt124) {
+                case 1 :
+                    // InternalFormalML.g:5082:4: (lv_execution_106_0= ruleProcedureExecution )
+                    {
+                    // InternalFormalML.g:5082:4: (lv_execution_106_0= ruleProcedureExecution )
+                    // InternalFormalML.g:5083:5: lv_execution_106_0= ruleProcedureExecution
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getProcedureAccess().getExecutionProcedureExecutionParserRuleCall_12_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_33);
+                    lv_execution_106_0=ruleProcedureExecution();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getProcedureRule());
+                      					}
+                      					set(
+                      						current,
+                      						"execution",
+                      						lv_execution_106_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ProcedureExecution");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_107=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_107, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_13());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProcedure"
+
+
+    // $ANTLR start "entryRuleProcedureExecution"
+    // InternalFormalML.g:5108:1: entryRuleProcedureExecution returns [EObject current=null] : iv_ruleProcedureExecution= ruleProcedureExecution EOF ;
+    public final EObject entryRuleProcedureExecution() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleProcedureExecution = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()
+        	);
+
+        try {
+            // InternalFormalML.g:5112:2: (iv_ruleProcedureExecution= ruleProcedureExecution EOF )
+            // InternalFormalML.g:5113:2: iv_ruleProcedureExecution= ruleProcedureExecution EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getProcedureExecutionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleProcedureExecution=ruleProcedureExecution();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleProcedureExecution; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleProcedureExecution"
+
+
+    // $ANTLR start "ruleProcedureExecution"
+    // InternalFormalML.g:5122:1: ruleProcedureExecution returns [EObject current=null] : ( () (otherlv_1= '@moe:' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) ) ) ;
+    public final EObject ruleProcedureExecution() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        EObject lv_scheduleRoutine_4_0 = null;
+
+        EObject lv_runRoutine_6_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2()
+        	);
+
+        try {
+            // InternalFormalML.g:5131:2: ( ( () (otherlv_1= '@moe:' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) ) ) )
+            // InternalFormalML.g:5132:2: ( () (otherlv_1= '@moe:' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) ) )
+            {
+            // InternalFormalML.g:5132:2: ( () (otherlv_1= '@moe:' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) ) )
+            // InternalFormalML.g:5133:3: () (otherlv_1= '@moe:' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) )
+            {
+            // InternalFormalML.g:5133:3: ()
+            // InternalFormalML.g:5134:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getProcedureExecutionAccess().getModelOfExecutionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:5143:3: (otherlv_1= '@moe:' )?
+            int alt125=2;
+            int LA125_0 = input.LA(1);
+
+            if ( (LA125_0==69) ) {
+                alt125=1;
+            }
+            switch (alt125) {
+                case 1 :
+                    // InternalFormalML.g:5144:4: otherlv_1= '@moe:'
+                    {
+                    otherlv_1=(Token)match(input,69,FollowSets000.FOLLOW_60); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getProcedureExecutionAccess().getMoeKeyword_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:5149:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:5150:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:5150:4: ( ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* ) )
+            // InternalFormalML.g:5151:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+            // InternalFormalML.g:5154:5: ( ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )* )
+            // InternalFormalML.g:5155:6: ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:5155:6: ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )*
+            loop126:
+            do {
+                int alt126=3;
+                int LA126_0 = input.LA(1);
+
+                if ( LA126_0 == 70 && getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0) ) {
+                    alt126=1;
+                }
+                else if ( LA126_0 == 71 && getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1) ) {
+                    alt126=2;
+                }
+
+
+                switch (alt126) {
+            	case 1 :
+            	    // InternalFormalML.g:5156:4: ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:5156:4: ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:5157:5: {...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleProcedureExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0)");
+            	    }
+            	    // InternalFormalML.g:5157:115: ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:5158:6: ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0);
+            	    // InternalFormalML.g:5161:9: ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:5161:10: {...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleProcedureExecution", "true");
+            	    }
+            	    // InternalFormalML.g:5161:19: (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:5161:20: otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_3=(Token)match(input,70,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_3, grammarAccess.getProcedureExecutionAccess().getScheduleKeyword_2_0_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:5165:9: ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:5166:10: (lv_scheduleRoutine_4_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:5166:10: (lv_scheduleRoutine_4_0= rulemoeRoutine )
+            	    // InternalFormalML.g:5167:11: lv_scheduleRoutine_4_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_60);
+            	    lv_scheduleRoutine_4_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getProcedureExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"scheduleRoutine",
+            	      												lv_scheduleRoutine_4_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:5190:4: ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:5190:4: ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:5191:5: {...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleProcedureExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1)");
+            	    }
+            	    // InternalFormalML.g:5191:115: ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:5192:6: ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1);
+            	    // InternalFormalML.g:5195:9: ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:5195:10: {...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleProcedureExecution", "true");
+            	    }
+            	    // InternalFormalML.g:5195:19: (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:5195:20: otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_5=(Token)match(input,71,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_5, grammarAccess.getProcedureExecutionAccess().getRunKeyword_2_1_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:5199:9: ( (lv_runRoutine_6_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:5200:10: (lv_runRoutine_6_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:5200:10: (lv_runRoutine_6_0= rulemoeRoutine )
+            	    // InternalFormalML.g:5201:11: lv_runRoutine_6_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getProcedureExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_2_1_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_60);
+            	    lv_runRoutine_6_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getProcedureExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"runRoutine",
+            	      												lv_runRoutine_6_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop126;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2());
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProcedureExecution"
+
+
+    // $ANTLR start "entryRuleBehavior"
+    // InternalFormalML.g:5238:1: entryRuleBehavior returns [EObject current=null] : iv_ruleBehavior= ruleBehavior EOF ;
+    public final EObject entryRuleBehavior() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBehavior = null;
+
+
+        try {
+            // InternalFormalML.g:5238:49: (iv_ruleBehavior= ruleBehavior EOF )
+            // InternalFormalML.g:5239:2: iv_ruleBehavior= ruleBehavior EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBehaviorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBehavior=ruleBehavior();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBehavior; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBehavior"
+
+
+    // $ANTLR start "ruleBehavior"
+    // InternalFormalML.g:5245:1: ruleBehavior returns [EObject current=null] : this_Statemachine_0= ruleStatemachine ;
+    public final EObject ruleBehavior() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_Statemachine_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:5251:2: (this_Statemachine_0= ruleStatemachine )
+            // InternalFormalML.g:5252:2: this_Statemachine_0= ruleStatemachine
+            {
+            if ( state.backtracking==0 ) {
+
+              		/* */
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newCompositeNode(grammarAccess.getBehaviorAccess().getStatemachineParserRuleCall());
+              	
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            this_Statemachine_0=ruleStatemachine();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current = this_Statemachine_0;
+              		afterParserOrEnumRuleCall();
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBehavior"
+
+
+    // $ANTLR start "entryRuleMoeBehavior"
+    // InternalFormalML.g:5266:1: entryRuleMoeBehavior returns [EObject current=null] : iv_ruleMoeBehavior= ruleMoeBehavior EOF ;
+    public final EObject entryRuleMoeBehavior() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleMoeBehavior = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()
+        	);
+
+        try {
+            // InternalFormalML.g:5270:2: (iv_ruleMoeBehavior= ruleMoeBehavior EOF )
+            // InternalFormalML.g:5271:2: iv_ruleMoeBehavior= ruleMoeBehavior EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMoeBehaviorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleMoeBehavior=ruleMoeBehavior();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleMoeBehavior; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleMoeBehavior"
+
+
+    // $ANTLR start "ruleMoeBehavior"
+    // InternalFormalML.g:5280:1: ruleMoeBehavior returns [EObject current=null] : ( () (otherlv_1= '@local:' ( ( (lv_port_2_0= rulePortPrivate ) ) | ( (lv_signal_3_0= ruleSignalPrivate ) ) | ( (lv_buffer_4_0= ruleBufferPrivate ) ) | ( (lv_channel_5_0= ruleChannelPrivate ) ) | ( (lv_typedef_6_0= ruleTypeDefinition ) ) | ( (lv_property_7_0= ruleVariablePrivate ) ) )* )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) ) ) ;
+    public final EObject ruleMoeBehavior() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_port_2_0 = null;
+
+        EObject lv_signal_3_0 = null;
+
+        EObject lv_buffer_4_0 = null;
+
+        EObject lv_channel_5_0 = null;
+
+        EObject lv_typedef_6_0 = null;
+
+        EObject lv_property_7_0 = null;
+
+        EObject lv_execution_9_0 = null;
+
+        EObject lv_interaction_10_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2()
+        	);
+
+        try {
+            // InternalFormalML.g:5289:2: ( ( () (otherlv_1= '@local:' ( ( (lv_port_2_0= rulePortPrivate ) ) | ( (lv_signal_3_0= ruleSignalPrivate ) ) | ( (lv_buffer_4_0= ruleBufferPrivate ) ) | ( (lv_channel_5_0= ruleChannelPrivate ) ) | ( (lv_typedef_6_0= ruleTypeDefinition ) ) | ( (lv_property_7_0= ruleVariablePrivate ) ) )* )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) ) ) )
+            // InternalFormalML.g:5290:2: ( () (otherlv_1= '@local:' ( ( (lv_port_2_0= rulePortPrivate ) ) | ( (lv_signal_3_0= ruleSignalPrivate ) ) | ( (lv_buffer_4_0= ruleBufferPrivate ) ) | ( (lv_channel_5_0= ruleChannelPrivate ) ) | ( (lv_typedef_6_0= ruleTypeDefinition ) ) | ( (lv_property_7_0= ruleVariablePrivate ) ) )* )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) ) )
+            {
+            // InternalFormalML.g:5290:2: ( () (otherlv_1= '@local:' ( ( (lv_port_2_0= rulePortPrivate ) ) | ( (lv_signal_3_0= ruleSignalPrivate ) ) | ( (lv_buffer_4_0= ruleBufferPrivate ) ) | ( (lv_channel_5_0= ruleChannelPrivate ) ) | ( (lv_typedef_6_0= ruleTypeDefinition ) ) | ( (lv_property_7_0= ruleVariablePrivate ) ) )* )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) ) )
+            // InternalFormalML.g:5291:3: () (otherlv_1= '@local:' ( ( (lv_port_2_0= rulePortPrivate ) ) | ( (lv_signal_3_0= ruleSignalPrivate ) ) | ( (lv_buffer_4_0= ruleBufferPrivate ) ) | ( (lv_channel_5_0= ruleChannelPrivate ) ) | ( (lv_typedef_6_0= ruleTypeDefinition ) ) | ( (lv_property_7_0= ruleVariablePrivate ) ) )* )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) )
+            {
+            // InternalFormalML.g:5291:3: ()
+            // InternalFormalML.g:5292:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getMoeBehaviorAccess().getBehaviorAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:5301:3: (otherlv_1= '@local:' ( ( (lv_port_2_0= rulePortPrivate ) ) | ( (lv_signal_3_0= ruleSignalPrivate ) ) | ( (lv_buffer_4_0= ruleBufferPrivate ) ) | ( (lv_channel_5_0= ruleChannelPrivate ) ) | ( (lv_typedef_6_0= ruleTypeDefinition ) ) | ( (lv_property_7_0= ruleVariablePrivate ) ) )* )?
+            int alt128=2;
+            int LA128_0 = input.LA(1);
+
+            if ( (LA128_0==72) ) {
+                alt128=1;
+            }
+            switch (alt128) {
+                case 1 :
+                    // InternalFormalML.g:5302:4: otherlv_1= '@local:' ( ( (lv_port_2_0= rulePortPrivate ) ) | ( (lv_signal_3_0= ruleSignalPrivate ) ) | ( (lv_buffer_4_0= ruleBufferPrivate ) ) | ( (lv_channel_5_0= ruleChannelPrivate ) ) | ( (lv_typedef_6_0= ruleTypeDefinition ) ) | ( (lv_property_7_0= ruleVariablePrivate ) ) )*
+                    {
+                    otherlv_1=(Token)match(input,72,FollowSets000.FOLLOW_62); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getMoeBehaviorAccess().getLocalKeyword_1_0());
+                      			
+                    }
+                    // InternalFormalML.g:5306:4: ( ( (lv_port_2_0= rulePortPrivate ) ) | ( (lv_signal_3_0= ruleSignalPrivate ) ) | ( (lv_buffer_4_0= ruleBufferPrivate ) ) | ( (lv_channel_5_0= ruleChannelPrivate ) ) | ( (lv_typedef_6_0= ruleTypeDefinition ) ) | ( (lv_property_7_0= ruleVariablePrivate ) ) )*
+                    loop127:
+                    do {
+                        int alt127=7;
+                        alt127 = dfa127.predict(input);
+                        switch (alt127) {
+                    	case 1 :
+                    	    // InternalFormalML.g:5307:5: ( (lv_port_2_0= rulePortPrivate ) )
+                    	    {
+                    	    // InternalFormalML.g:5307:5: ( (lv_port_2_0= rulePortPrivate ) )
+                    	    // InternalFormalML.g:5308:6: (lv_port_2_0= rulePortPrivate )
+                    	    {
+                    	    // InternalFormalML.g:5308:6: (lv_port_2_0= rulePortPrivate )
+                    	    // InternalFormalML.g:5309:7: lv_port_2_0= rulePortPrivate
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getPortPortPrivateParserRuleCall_1_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_62);
+                    	    lv_port_2_0=rulePortPrivate();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"port",
+                    	      								lv_port_2_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:5327:5: ( (lv_signal_3_0= ruleSignalPrivate ) )
+                    	    {
+                    	    // InternalFormalML.g:5327:5: ( (lv_signal_3_0= ruleSignalPrivate ) )
+                    	    // InternalFormalML.g:5328:6: (lv_signal_3_0= ruleSignalPrivate )
+                    	    {
+                    	    // InternalFormalML.g:5328:6: (lv_signal_3_0= ruleSignalPrivate )
+                    	    // InternalFormalML.g:5329:7: lv_signal_3_0= ruleSignalPrivate
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getSignalSignalPrivateParserRuleCall_1_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_62);
+                    	    lv_signal_3_0=ruleSignalPrivate();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"signal",
+                    	      								lv_signal_3_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalFormalML.g:5347:5: ( (lv_buffer_4_0= ruleBufferPrivate ) )
+                    	    {
+                    	    // InternalFormalML.g:5347:5: ( (lv_buffer_4_0= ruleBufferPrivate ) )
+                    	    // InternalFormalML.g:5348:6: (lv_buffer_4_0= ruleBufferPrivate )
+                    	    {
+                    	    // InternalFormalML.g:5348:6: (lv_buffer_4_0= ruleBufferPrivate )
+                    	    // InternalFormalML.g:5349:7: lv_buffer_4_0= ruleBufferPrivate
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getBufferBufferPrivateParserRuleCall_1_1_2_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_62);
+                    	    lv_buffer_4_0=ruleBufferPrivate();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"buffer",
+                    	      								lv_buffer_4_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalFormalML.g:5367:5: ( (lv_channel_5_0= ruleChannelPrivate ) )
+                    	    {
+                    	    // InternalFormalML.g:5367:5: ( (lv_channel_5_0= ruleChannelPrivate ) )
+                    	    // InternalFormalML.g:5368:6: (lv_channel_5_0= ruleChannelPrivate )
+                    	    {
+                    	    // InternalFormalML.g:5368:6: (lv_channel_5_0= ruleChannelPrivate )
+                    	    // InternalFormalML.g:5369:7: lv_channel_5_0= ruleChannelPrivate
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getChannelChannelPrivateParserRuleCall_1_1_3_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_62);
+                    	    lv_channel_5_0=ruleChannelPrivate();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"channel",
+                    	      								lv_channel_5_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalFormalML.g:5387:5: ( (lv_typedef_6_0= ruleTypeDefinition ) )
+                    	    {
+                    	    // InternalFormalML.g:5387:5: ( (lv_typedef_6_0= ruleTypeDefinition ) )
+                    	    // InternalFormalML.g:5388:6: (lv_typedef_6_0= ruleTypeDefinition )
+                    	    {
+                    	    // InternalFormalML.g:5388:6: (lv_typedef_6_0= ruleTypeDefinition )
+                    	    // InternalFormalML.g:5389:7: lv_typedef_6_0= ruleTypeDefinition
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getTypedefTypeDefinitionParserRuleCall_1_1_4_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_62);
+                    	    lv_typedef_6_0=ruleTypeDefinition();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"typedef",
+                    	      								lv_typedef_6_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalFormalML.g:5407:5: ( (lv_property_7_0= ruleVariablePrivate ) )
+                    	    {
+                    	    // InternalFormalML.g:5407:5: ( (lv_property_7_0= ruleVariablePrivate ) )
+                    	    // InternalFormalML.g:5408:6: (lv_property_7_0= ruleVariablePrivate )
+                    	    {
+                    	    // InternalFormalML.g:5408:6: (lv_property_7_0= ruleVariablePrivate )
+                    	    // InternalFormalML.g:5409:7: lv_property_7_0= ruleVariablePrivate
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getMoeBehaviorAccess().getPropertyVariablePrivateParserRuleCall_1_1_5_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_62);
+                    	    lv_property_7_0=ruleVariablePrivate();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"property",
+                    	      								lv_property_7_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop127;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:5428:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:5429:4: ( ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:5429:4: ( ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* ) )
+            // InternalFormalML.g:5430:5: ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+            // InternalFormalML.g:5433:5: ( ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )* )
+            // InternalFormalML.g:5434:6: ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:5434:6: ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )*
+            loop129:
+            do {
+                int alt129=3;
+                int LA129_0 = input.LA(1);
+
+                if ( LA129_0 == 69 && getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0) ) {
+                    alt129=1;
+                }
+                else if ( LA129_0 == 95 && getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1) ) {
+                    alt129=2;
+                }
+
+
+                switch (alt129) {
+            	case 1 :
+            	    // InternalFormalML.g:5435:4: ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:5435:4: ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) )
+            	    // InternalFormalML.g:5436:5: {...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMoeBehavior", "getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0)");
+            	    }
+            	    // InternalFormalML.g:5436:108: ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) )
+            	    // InternalFormalML.g:5437:6: ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0);
+            	    // InternalFormalML.g:5440:9: ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) )
+            	    // InternalFormalML.g:5440:10: {...}? => ( (lv_execution_9_0= ruleModelOfExecution ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMoeBehavior", "true");
+            	    }
+            	    // InternalFormalML.g:5440:19: ( (lv_execution_9_0= ruleModelOfExecution ) )
+            	    // InternalFormalML.g:5440:20: (lv_execution_9_0= ruleModelOfExecution )
+            	    {
+            	    // InternalFormalML.g:5440:20: (lv_execution_9_0= ruleModelOfExecution )
+            	    // InternalFormalML.g:5441:10: lv_execution_9_0= ruleModelOfExecution
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getMoeBehaviorAccess().getExecutionModelOfExecutionParserRuleCall_2_0_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_63);
+            	    lv_execution_9_0=ruleModelOfExecution();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"execution",
+            	      											lv_execution_9_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfExecution");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:5463:4: ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:5463:4: ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) )
+            	    // InternalFormalML.g:5464:5: {...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMoeBehavior", "getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1)");
+            	    }
+            	    // InternalFormalML.g:5464:108: ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) )
+            	    // InternalFormalML.g:5465:6: ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1);
+            	    // InternalFormalML.g:5468:9: ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) )
+            	    // InternalFormalML.g:5468:10: {...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleMoeBehavior", "true");
+            	    }
+            	    // InternalFormalML.g:5468:19: ( (lv_interaction_10_0= ruleModelOfInteraction ) )
+            	    // InternalFormalML.g:5468:20: (lv_interaction_10_0= ruleModelOfInteraction )
+            	    {
+            	    // InternalFormalML.g:5468:20: (lv_interaction_10_0= ruleModelOfInteraction )
+            	    // InternalFormalML.g:5469:10: lv_interaction_10_0= ruleModelOfInteraction
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getMoeBehaviorAccess().getInteractionModelOfInteractionParserRuleCall_2_1_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_63);
+            	    lv_interaction_10_0=ruleModelOfInteraction();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getMoeBehaviorRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"interaction",
+            	      											lv_interaction_10_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfInteraction");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop129;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2());
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleMoeBehavior"
+
+
+    // $ANTLR start "entryRuleStatemachine"
+    // InternalFormalML.g:5505:1: entryRuleStatemachine returns [EObject current=null] : iv_ruleStatemachine= ruleStatemachine EOF ;
+    public final EObject entryRuleStatemachine() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachine = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 
+        	grammarAccess.getStatemachineAccess().getUnorderedGroup_12()
+        	);
+
+        try {
+            // InternalFormalML.g:5510:2: (iv_ruleStatemachine= ruleStatemachine EOF )
+            // InternalFormalML.g:5511:2: iv_ruleStatemachine= ruleStatemachine EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleStatemachine=ruleStatemachine();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachine; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachine"
+
+
+    // $ANTLR start "ruleStatemachine"
+    // InternalFormalML.g:5520:1: ruleStatemachine returns [EObject current=null] : ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_6= 'statemachine' (otherlv_7= '<' (otherlv_8= 'moc:' )? (otherlv_9= 'or' | otherlv_10= 'and' ) otherlv_11= '>' )? ( (lv_name_12_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_13_0= ruleUnrestrictedName ) )? otherlv_14= '{' ( (otherlv_15= '@parameter:' ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )* ) | ( ( (lv_port_36_0= rulePort ) ) | ( (lv_signal_37_0= ruleSignal ) ) | ( (lv_buffer_38_0= ruleBuffer ) ) | ( (lv_channel_39_0= ruleChannel ) ) | ( (lv_typedef_40_0= ruleTypeDefinition ) ) | ( (lv_property_41_0= ruleVariable ) ) )* ) ( (otherlv_42= '@input:' ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )* ) | (otherlv_47= '@inout:' ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )* ) | (otherlv_52= '@output:' ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )* ) | (otherlv_57= '@return:' ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )* ) )* ( (otherlv_62= '@property:' ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )* ) | (otherlv_69= '@public:' ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )* ) | (otherlv_76= '@protected:' ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )* ) | (otherlv_83= '@private:' ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ ) | (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_95_0= ruleRoutine ) ) | ( (lv_procedure_96_0= ruleProcedure ) ) )+ ) ( ( (lv_region_97_0= ruleStatemachineRegion ) )+ | ( (lv_region_98_0= ruleStatemachineRegionLite ) ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) ) otherlv_102= '}' ) ;
+    public final EObject ruleStatemachine() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_timed_3_0=null;
+        Token lv_input_enabled_4_0=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        Token otherlv_14=null;
+        Token otherlv_15=null;
+        Token otherlv_16=null;
+        Token otherlv_18=null;
+        Token otherlv_20=null;
+        Token otherlv_21=null;
+        Token otherlv_23=null;
+        Token otherlv_25=null;
+        Token otherlv_26=null;
+        Token otherlv_28=null;
+        Token otherlv_30=null;
+        Token otherlv_31=null;
+        Token otherlv_33=null;
+        Token otherlv_35=null;
+        Token otherlv_42=null;
+        Token otherlv_44=null;
+        Token otherlv_46=null;
+        Token otherlv_47=null;
+        Token otherlv_49=null;
+        Token otherlv_51=null;
+        Token otherlv_52=null;
+        Token otherlv_54=null;
+        Token otherlv_56=null;
+        Token otherlv_57=null;
+        Token otherlv_59=null;
+        Token otherlv_61=null;
+        Token otherlv_62=null;
+        Token otherlv_69=null;
+        Token otherlv_76=null;
+        Token otherlv_83=null;
+        Token otherlv_90=null;
+        Token otherlv_91=null;
+        Token otherlv_93=null;
+        Token otherlv_102=null;
+        Enumerator lv_visibility_2_0 = null;
+
+        Enumerator lv_design_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_12_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_13_0 = null;
+
+        EObject lv_parameter_17_0 = null;
+
+        EObject lv_parameter_19_0 = null;
+
+        EObject lv_parameter_22_0 = null;
+
+        EObject lv_parameter_24_0 = null;
+
+        EObject lv_parameter_27_0 = null;
+
+        EObject lv_parameter_29_0 = null;
+
+        EObject lv_parameter_32_0 = null;
+
+        EObject lv_parameter_34_0 = null;
+
+        EObject lv_port_36_0 = null;
+
+        EObject lv_signal_37_0 = null;
+
+        EObject lv_buffer_38_0 = null;
+
+        EObject lv_channel_39_0 = null;
+
+        EObject lv_typedef_40_0 = null;
+
+        EObject lv_property_41_0 = null;
+
+        EObject lv_parameter_43_0 = null;
+
+        EObject lv_parameter_45_0 = null;
+
+        EObject lv_parameter_48_0 = null;
+
+        EObject lv_parameter_50_0 = null;
+
+        EObject lv_parameter_53_0 = null;
+
+        EObject lv_parameter_55_0 = null;
+
+        EObject lv_parameter_58_0 = null;
+
+        EObject lv_parameter_60_0 = null;
+
+        EObject lv_port_63_0 = null;
+
+        EObject lv_signal_64_0 = null;
+
+        EObject lv_buffer_65_0 = null;
+
+        EObject lv_channel_66_0 = null;
+
+        EObject lv_typedef_67_0 = null;
+
+        EObject lv_property_68_0 = null;
+
+        EObject lv_port_70_0 = null;
+
+        EObject lv_signal_71_0 = null;
+
+        EObject lv_buffer_72_0 = null;
+
+        EObject lv_channel_73_0 = null;
+
+        EObject lv_typedef_74_0 = null;
+
+        EObject lv_property_75_0 = null;
+
+        EObject lv_port_77_0 = null;
+
+        EObject lv_signal_78_0 = null;
+
+        EObject lv_buffer_79_0 = null;
+
+        EObject lv_channel_80_0 = null;
+
+        EObject lv_typedef_81_0 = null;
+
+        EObject lv_property_82_0 = null;
+
+        EObject lv_port_84_0 = null;
+
+        EObject lv_signal_85_0 = null;
+
+        EObject lv_buffer_86_0 = null;
+
+        EObject lv_channel_87_0 = null;
+
+        EObject lv_typedef_88_0 = null;
+
+        EObject lv_property_89_0 = null;
+
+        EObject lv_routine_92_0 = null;
+
+        EObject lv_procedure_94_0 = null;
+
+        EObject lv_routine_95_0 = null;
+
+        EObject lv_procedure_96_0 = null;
+
+        EObject lv_region_97_0 = null;
+
+        EObject lv_region_98_0 = null;
+
+        EObject lv_execution_100_0 = null;
+
+        EObject lv_interaction_101_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 
+        	grammarAccess.getStatemachineAccess().getUnorderedGroup_12()
+        	);
+
+        try {
+            // InternalFormalML.g:5530:2: ( ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_6= 'statemachine' (otherlv_7= '<' (otherlv_8= 'moc:' )? (otherlv_9= 'or' | otherlv_10= 'and' ) otherlv_11= '>' )? ( (lv_name_12_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_13_0= ruleUnrestrictedName ) )? otherlv_14= '{' ( (otherlv_15= '@parameter:' ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )* ) | ( ( (lv_port_36_0= rulePort ) ) | ( (lv_signal_37_0= ruleSignal ) ) | ( (lv_buffer_38_0= ruleBuffer ) ) | ( (lv_channel_39_0= ruleChannel ) ) | ( (lv_typedef_40_0= ruleTypeDefinition ) ) | ( (lv_property_41_0= ruleVariable ) ) )* ) ( (otherlv_42= '@input:' ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )* ) | (otherlv_47= '@inout:' ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )* ) | (otherlv_52= '@output:' ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )* ) | (otherlv_57= '@return:' ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )* ) )* ( (otherlv_62= '@property:' ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )* ) | (otherlv_69= '@public:' ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )* ) | (otherlv_76= '@protected:' ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )* ) | (otherlv_83= '@private:' ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ ) | (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_95_0= ruleRoutine ) ) | ( (lv_procedure_96_0= ruleProcedure ) ) )+ ) ( ( (lv_region_97_0= ruleStatemachineRegion ) )+ | ( (lv_region_98_0= ruleStatemachineRegionLite ) ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) ) otherlv_102= '}' ) )
+            // InternalFormalML.g:5531:2: ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_6= 'statemachine' (otherlv_7= '<' (otherlv_8= 'moc:' )? (otherlv_9= 'or' | otherlv_10= 'and' ) otherlv_11= '>' )? ( (lv_name_12_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_13_0= ruleUnrestrictedName ) )? otherlv_14= '{' ( (otherlv_15= '@parameter:' ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )* ) | ( ( (lv_port_36_0= rulePort ) ) | ( (lv_signal_37_0= ruleSignal ) ) | ( (lv_buffer_38_0= ruleBuffer ) ) | ( (lv_channel_39_0= ruleChannel ) ) | ( (lv_typedef_40_0= ruleTypeDefinition ) ) | ( (lv_property_41_0= ruleVariable ) ) )* ) ( (otherlv_42= '@input:' ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )* ) | (otherlv_47= '@inout:' ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )* ) | (otherlv_52= '@output:' ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )* ) | (otherlv_57= '@return:' ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )* ) )* ( (otherlv_62= '@property:' ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )* ) | (otherlv_69= '@public:' ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )* ) | (otherlv_76= '@protected:' ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )* ) | (otherlv_83= '@private:' ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ ) | (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_95_0= ruleRoutine ) ) | ( (lv_procedure_96_0= ruleProcedure ) ) )+ ) ( ( (lv_region_97_0= ruleStatemachineRegion ) )+ | ( (lv_region_98_0= ruleStatemachineRegionLite ) ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) ) otherlv_102= '}' )
+            {
+            // InternalFormalML.g:5531:2: ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_6= 'statemachine' (otherlv_7= '<' (otherlv_8= 'moc:' )? (otherlv_9= 'or' | otherlv_10= 'and' ) otherlv_11= '>' )? ( (lv_name_12_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_13_0= ruleUnrestrictedName ) )? otherlv_14= '{' ( (otherlv_15= '@parameter:' ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )* ) | ( ( (lv_port_36_0= rulePort ) ) | ( (lv_signal_37_0= ruleSignal ) ) | ( (lv_buffer_38_0= ruleBuffer ) ) | ( (lv_channel_39_0= ruleChannel ) ) | ( (lv_typedef_40_0= ruleTypeDefinition ) ) | ( (lv_property_41_0= ruleVariable ) ) )* ) ( (otherlv_42= '@input:' ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )* ) | (otherlv_47= '@inout:' ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )* ) | (otherlv_52= '@output:' ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )* ) | (otherlv_57= '@return:' ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )* ) )* ( (otherlv_62= '@property:' ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )* ) | (otherlv_69= '@public:' ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )* ) | (otherlv_76= '@protected:' ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )* ) | (otherlv_83= '@private:' ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ ) | (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_95_0= ruleRoutine ) ) | ( (lv_procedure_96_0= ruleProcedure ) ) )+ ) ( ( (lv_region_97_0= ruleStatemachineRegion ) )+ | ( (lv_region_98_0= ruleStatemachineRegionLite ) ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) ) otherlv_102= '}' )
+            // InternalFormalML.g:5532:3: () ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* ) ) ) otherlv_6= 'statemachine' (otherlv_7= '<' (otherlv_8= 'moc:' )? (otherlv_9= 'or' | otherlv_10= 'and' ) otherlv_11= '>' )? ( (lv_name_12_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_13_0= ruleUnrestrictedName ) )? otherlv_14= '{' ( (otherlv_15= '@parameter:' ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )* ) | ( ( (lv_port_36_0= rulePort ) ) | ( (lv_signal_37_0= ruleSignal ) ) | ( (lv_buffer_38_0= ruleBuffer ) ) | ( (lv_channel_39_0= ruleChannel ) ) | ( (lv_typedef_40_0= ruleTypeDefinition ) ) | ( (lv_property_41_0= ruleVariable ) ) )* ) ( (otherlv_42= '@input:' ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )* ) | (otherlv_47= '@inout:' ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )* ) | (otherlv_52= '@output:' ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )* ) | (otherlv_57= '@return:' ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )* ) )* ( (otherlv_62= '@property:' ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )* ) | (otherlv_69= '@public:' ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )* ) | (otherlv_76= '@protected:' ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )* ) | (otherlv_83= '@private:' ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )* ) )* ( ( ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ ) | (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_95_0= ruleRoutine ) ) | ( (lv_procedure_96_0= ruleProcedure ) ) )+ ) ( ( (lv_region_97_0= ruleStatemachineRegion ) )+ | ( (lv_region_98_0= ruleStatemachineRegionLite ) ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) ) otherlv_102= '}'
+            {
+            // InternalFormalML.g:5532:3: ()
+            // InternalFormalML.g:5533:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getStatemachineAccess().getStatemachineAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:5542:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:5543:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:5543:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* ) )
+            // InternalFormalML.g:5544:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+            // InternalFormalML.g:5547:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )* )
+            // InternalFormalML.g:5548:6: ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:5548:6: ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )*
+            loop131:
+            do {
+                int alt131=4;
+                alt131 = dfa131.predict(input);
+                switch (alt131) {
+            	case 1 :
+            	    // InternalFormalML.g:5549:4: ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:5549:4: ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) )
+            	    // InternalFormalML.g:5550:5: {...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0)");
+            	    }
+            	    // InternalFormalML.g:5550:109: ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) )
+            	    // InternalFormalML.g:5551:6: ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0);
+            	    // InternalFormalML.g:5554:9: ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) )
+            	    // InternalFormalML.g:5554:10: {...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "true");
+            	    }
+            	    // InternalFormalML.g:5554:19: ( (lv_visibility_2_0= ruleVisibilityKind ) )
+            	    // InternalFormalML.g:5554:20: (lv_visibility_2_0= ruleVisibilityKind )
+            	    {
+            	    // InternalFormalML.g:5554:20: (lv_visibility_2_0= ruleVisibilityKind )
+            	    // InternalFormalML.g:5555:10: lv_visibility_2_0= ruleVisibilityKind
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getStatemachineAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_64);
+            	    lv_visibility_2_0=ruleVisibilityKind();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"visibility",
+            	      											lv_visibility_2_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:5577:4: ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:5577:4: ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) )
+            	    // InternalFormalML.g:5578:5: {...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1)");
+            	    }
+            	    // InternalFormalML.g:5578:109: ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) )
+            	    // InternalFormalML.g:5579:6: ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1);
+            	    // InternalFormalML.g:5582:9: ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) )
+            	    // InternalFormalML.g:5582:10: {...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "true");
+            	    }
+            	    // InternalFormalML.g:5582:19: ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) )
+            	    int alt130=2;
+            	    int LA130_0 = input.LA(1);
+
+            	    if ( (LA130_0==32) ) {
+            	        alt130=1;
+            	    }
+            	    else if ( (LA130_0==33) ) {
+            	        alt130=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 130, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt130) {
+            	        case 1 :
+            	            // InternalFormalML.g:5582:20: ( (lv_timed_3_0= 'timed' ) )
+            	            {
+            	            // InternalFormalML.g:5582:20: ( (lv_timed_3_0= 'timed' ) )
+            	            // InternalFormalML.g:5583:10: (lv_timed_3_0= 'timed' )
+            	            {
+            	            // InternalFormalML.g:5583:10: (lv_timed_3_0= 'timed' )
+            	            // InternalFormalML.g:5584:11: lv_timed_3_0= 'timed'
+            	            {
+            	            lv_timed_3_0=(Token)match(input,32,FollowSets000.FOLLOW_64); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_timed_3_0, grammarAccess.getStatemachineAccess().getTimedTimedKeyword_1_1_0_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getStatemachineRule());
+            	              											}
+            	              											setWithLastConsumed(current, "timed", true, "timed");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:5597:9: ( (lv_input_enabled_4_0= 'input_enabled' ) )
+            	            {
+            	            // InternalFormalML.g:5597:9: ( (lv_input_enabled_4_0= 'input_enabled' ) )
+            	            // InternalFormalML.g:5598:10: (lv_input_enabled_4_0= 'input_enabled' )
+            	            {
+            	            // InternalFormalML.g:5598:10: (lv_input_enabled_4_0= 'input_enabled' )
+            	            // InternalFormalML.g:5599:11: lv_input_enabled_4_0= 'input_enabled'
+            	            {
+            	            lv_input_enabled_4_0=(Token)match(input,33,FollowSets000.FOLLOW_64); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_input_enabled_4_0, grammarAccess.getStatemachineAccess().getInput_enabledInput_enabledKeyword_1_1_1_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getStatemachineRule());
+            	              											}
+            	              											setWithLastConsumed(current, "input_enabled", true, "input_enabled");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:5617:4: ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:5617:4: ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) )
+            	    // InternalFormalML.g:5618:5: {...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2)");
+            	    }
+            	    // InternalFormalML.g:5618:109: ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) )
+            	    // InternalFormalML.g:5619:6: ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2);
+            	    // InternalFormalML.g:5622:9: ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) )
+            	    // InternalFormalML.g:5622:10: {...}? => ( (lv_design_5_0= ruleDesignKind ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "true");
+            	    }
+            	    // InternalFormalML.g:5622:19: ( (lv_design_5_0= ruleDesignKind ) )
+            	    // InternalFormalML.g:5622:20: (lv_design_5_0= ruleDesignKind )
+            	    {
+            	    // InternalFormalML.g:5622:20: (lv_design_5_0= ruleDesignKind )
+            	    // InternalFormalML.g:5623:10: lv_design_5_0= ruleDesignKind
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getStatemachineAccess().getDesignDesignKindEnumRuleCall_1_2_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_64);
+            	    lv_design_5_0=ruleDesignKind();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"design",
+            	      											lv_design_5_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.DesignKind");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop131;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_1());
+
+            }
+
+            otherlv_6=(Token)match(input,54,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getStatemachineAccess().getStatemachineKeyword_2());
+              		
+            }
+            // InternalFormalML.g:5656:3: (otherlv_7= '<' (otherlv_8= 'moc:' )? (otherlv_9= 'or' | otherlv_10= 'and' ) otherlv_11= '>' )?
+            int alt134=2;
+            int LA134_0 = input.LA(1);
+
+            if ( (LA134_0==16) ) {
+                alt134=1;
+            }
+            switch (alt134) {
+                case 1 :
+                    // InternalFormalML.g:5657:4: otherlv_7= '<' (otherlv_8= 'moc:' )? (otherlv_9= 'or' | otherlv_10= 'and' ) otherlv_11= '>'
+                    {
+                    otherlv_7=(Token)match(input,16,FollowSets000.FOLLOW_21); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getStatemachineAccess().getLessThanSignKeyword_3_0());
+                      			
+                    }
+                    // InternalFormalML.g:5661:4: (otherlv_8= 'moc:' )?
+                    int alt132=2;
+                    int LA132_0 = input.LA(1);
+
+                    if ( (LA132_0==34) ) {
+                        alt132=1;
+                    }
+                    switch (alt132) {
+                        case 1 :
+                            // InternalFormalML.g:5662:5: otherlv_8= 'moc:'
+                            {
+                            otherlv_8=(Token)match(input,34,FollowSets000.FOLLOW_22); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_8, grammarAccess.getStatemachineAccess().getMocKeyword_3_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:5667:4: (otherlv_9= 'or' | otherlv_10= 'and' )
+                    int alt133=2;
+                    int LA133_0 = input.LA(1);
+
+                    if ( (LA133_0==36) ) {
+                        alt133=1;
+                    }
+                    else if ( (LA133_0==35) ) {
+                        alt133=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 133, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt133) {
+                        case 1 :
+                            // InternalFormalML.g:5668:5: otherlv_9= 'or'
+                            {
+                            otherlv_9=(Token)match(input,36,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_9, grammarAccess.getStatemachineAccess().getOrKeyword_3_2_0());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:5673:5: otherlv_10= 'and'
+                            {
+                            otherlv_10=(Token)match(input,35,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_10, grammarAccess.getStatemachineAccess().getAndKeyword_3_2_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_11=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_11, grammarAccess.getStatemachineAccess().getGreaterThanSignKeyword_3_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:5683:3: ( (lv_name_12_0= ruleESIdentifier ) )
+            // InternalFormalML.g:5684:4: (lv_name_12_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:5684:4: (lv_name_12_0= ruleESIdentifier )
+            // InternalFormalML.g:5685:5: lv_name_12_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getStatemachineAccess().getNameESIdentifierParserRuleCall_4_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_24);
+            lv_name_12_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getStatemachineRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_12_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:5702:3: ( (lv_unrestrictedName_13_0= ruleUnrestrictedName ) )?
+            int alt135=2;
+            int LA135_0 = input.LA(1);
+
+            if ( (LA135_0==RULE_STRING) ) {
+                alt135=1;
+            }
+            switch (alt135) {
+                case 1 :
+                    // InternalFormalML.g:5703:4: (lv_unrestrictedName_13_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:5703:4: (lv_unrestrictedName_13_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:5704:5: lv_unrestrictedName_13_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getStatemachineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_10);
+                    lv_unrestrictedName_13_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_13_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_14=(Token)match(input,22,FollowSets000.FOLLOW_65); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_14, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_6());
+              		
+            }
+            // InternalFormalML.g:5725:3: ( (otherlv_15= '@parameter:' ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )* ) | ( ( (lv_port_36_0= rulePort ) ) | ( (lv_signal_37_0= ruleSignal ) ) | ( (lv_buffer_38_0= ruleBuffer ) ) | ( (lv_channel_39_0= ruleChannel ) ) | ( (lv_typedef_40_0= ruleTypeDefinition ) ) | ( (lv_property_41_0= ruleVariable ) ) )* )
+            int alt146=2;
+            int LA146_0 = input.LA(1);
+
+            if ( (LA146_0==60) ) {
+                alt146=1;
+            }
+            else if ( (LA146_0==19||(LA146_0>=38 && LA146_0<=44)||LA146_0==51||LA146_0==58||(LA146_0>=65 && LA146_0<=68)||(LA146_0>=73 && LA146_0<=76)||(LA146_0>=86 && LA146_0<=91)||(LA146_0>=93 && LA146_0<=94)||LA146_0==101||(LA146_0>=128 && LA146_0<=134)||(LA146_0>=136 && LA146_0<=139)||(LA146_0>=240 && LA146_0<=242)) ) {
+                alt146=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 146, 0, input);
+
+                throw nvae;
+            }
+            switch (alt146) {
+                case 1 :
+                    // InternalFormalML.g:5726:4: (otherlv_15= '@parameter:' ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )* )
+                    {
+                    // InternalFormalML.g:5726:4: (otherlv_15= '@parameter:' ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )* )
+                    // InternalFormalML.g:5727:5: otherlv_15= '@parameter:' ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )*
+                    {
+                    otherlv_15=(Token)match(input,60,FollowSets000.FOLLOW_66); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_15, grammarAccess.getStatemachineAccess().getParameterKeyword_7_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:5731:5: ( (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) ) | (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) ) | (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) ) | (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) ) )*
+                    loop144:
+                    do {
+                        int alt144=5;
+                        switch ( input.LA(1) ) {
+                        case 61:
+                            {
+                            alt144=1;
+                            }
+                            break;
+                        case 62:
+                            {
+                            alt144=2;
+                            }
+                            break;
+                        case 63:
+                            {
+                            alt144=3;
+                            }
+                            break;
+                        case 64:
+                            {
+                            alt144=4;
+                            }
+                            break;
+
+                        }
+
+                        switch (alt144) {
+                    	case 1 :
+                    	    // InternalFormalML.g:5732:6: (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) )
+                    	    {
+                    	    // InternalFormalML.g:5732:6: (otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) ) )
+                    	    // InternalFormalML.g:5733:7: otherlv_16= 'input' ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) )
+                    	    {
+                    	    otherlv_16=(Token)match(input,61,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_16, grammarAccess.getStatemachineAccess().getInputKeyword_7_0_1_0_0());
+                    	      						
+                    	    }
+                    	    // InternalFormalML.g:5737:7: ( ( (lv_parameter_17_0= ruleParameterInput ) ) | (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' ) )
+                    	    int alt137=2;
+                    	    int LA137_0 = input.LA(1);
+
+                    	    if ( (LA137_0==132) ) {
+                    	        alt137=1;
+                    	    }
+                    	    else if ( (LA137_0==22) ) {
+                    	        alt137=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 137, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt137) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:5738:8: ( (lv_parameter_17_0= ruleParameterInput ) )
+                    	            {
+                    	            // InternalFormalML.g:5738:8: ( (lv_parameter_17_0= ruleParameterInput ) )
+                    	            // InternalFormalML.g:5739:9: (lv_parameter_17_0= ruleParameterInput )
+                    	            {
+                    	            // InternalFormalML.g:5739:9: (lv_parameter_17_0= ruleParameterInput )
+                    	            // InternalFormalML.g:5740:10: lv_parameter_17_0= ruleParameterInput
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0());
+                    	              									
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_66);
+                    	            lv_parameter_17_0=ruleParameterInput();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										if (current==null) {
+                    	              											current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	              										}
+                    	              										add(
+                    	              											current,
+                    	              											"parameter",
+                    	              											lv_parameter_17_0,
+                    	              											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+                    	              										afterParserOrEnumRuleCall();
+                    	              									
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:5758:8: (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' )
+                    	            {
+                    	            // InternalFormalML.g:5758:8: (otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}' )
+                    	            // InternalFormalML.g:5759:9: otherlv_18= '{' ( (lv_parameter_19_0= ruleParameterInput ) )+ otherlv_20= '}'
+                    	            {
+                    	            otherlv_18=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_18, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0());
+                    	              								
+                    	            }
+                    	            // InternalFormalML.g:5763:9: ( (lv_parameter_19_0= ruleParameterInput ) )+
+                    	            int cnt136=0;
+                    	            loop136:
+                    	            do {
+                    	                int alt136=2;
+                    	                int LA136_0 = input.LA(1);
+
+                    	                if ( (LA136_0==132) ) {
+                    	                    alt136=1;
+                    	                }
+
+
+                    	                switch (alt136) {
+                    	            	case 1 :
+                    	            	    // InternalFormalML.g:5764:10: (lv_parameter_19_0= ruleParameterInput )
+                    	            	    {
+                    	            	    // InternalFormalML.g:5764:10: (lv_parameter_19_0= ruleParameterInput )
+                    	            	    // InternalFormalML.g:5765:11: lv_parameter_19_0= ruleParameterInput
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0());
+                    	            	      										
+                    	            	    }
+                    	            	    pushFollow(FollowSets000.FOLLOW_53);
+                    	            	    lv_parameter_19_0=ruleParameterInput();
+
+                    	            	    state._fsp--;
+                    	            	    if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											if (current==null) {
+                    	            	      												current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	            	      											}
+                    	            	      											add(
+                    	            	      												current,
+                    	            	      												"parameter",
+                    	            	      												lv_parameter_19_0,
+                    	            	      												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+                    	            	      											afterParserOrEnumRuleCall();
+                    	            	      										
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    if ( cnt136 >= 1 ) break loop136;
+                    	            	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                        EarlyExitException eee =
+                    	                            new EarlyExitException(136, input);
+                    	                        throw eee;
+                    	                }
+                    	                cnt136++;
+                    	            } while (true);
+
+                    	            otherlv_20=(Token)match(input,23,FollowSets000.FOLLOW_66); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_20, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2());
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:5790:6: (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) )
+                    	    {
+                    	    // InternalFormalML.g:5790:6: (otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) ) )
+                    	    // InternalFormalML.g:5791:7: otherlv_21= 'inout' ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) )
+                    	    {
+                    	    otherlv_21=(Token)match(input,62,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_21, grammarAccess.getStatemachineAccess().getInoutKeyword_7_0_1_1_0());
+                    	      						
+                    	    }
+                    	    // InternalFormalML.g:5795:7: ( ( (lv_parameter_22_0= ruleParameterInout ) ) | (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' ) )
+                    	    int alt139=2;
+                    	    int LA139_0 = input.LA(1);
+
+                    	    if ( (LA139_0==132) ) {
+                    	        alt139=1;
+                    	    }
+                    	    else if ( (LA139_0==22) ) {
+                    	        alt139=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 139, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt139) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:5796:8: ( (lv_parameter_22_0= ruleParameterInout ) )
+                    	            {
+                    	            // InternalFormalML.g:5796:8: ( (lv_parameter_22_0= ruleParameterInout ) )
+                    	            // InternalFormalML.g:5797:9: (lv_parameter_22_0= ruleParameterInout )
+                    	            {
+                    	            // InternalFormalML.g:5797:9: (lv_parameter_22_0= ruleParameterInout )
+                    	            // InternalFormalML.g:5798:10: lv_parameter_22_0= ruleParameterInout
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0());
+                    	              									
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_66);
+                    	            lv_parameter_22_0=ruleParameterInout();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										if (current==null) {
+                    	              											current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	              										}
+                    	              										add(
+                    	              											current,
+                    	              											"parameter",
+                    	              											lv_parameter_22_0,
+                    	              											"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+                    	              										afterParserOrEnumRuleCall();
+                    	              									
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:5816:8: (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' )
+                    	            {
+                    	            // InternalFormalML.g:5816:8: (otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}' )
+                    	            // InternalFormalML.g:5817:9: otherlv_23= '{' ( (lv_parameter_24_0= ruleParameterInout ) )+ otherlv_25= '}'
+                    	            {
+                    	            otherlv_23=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_23, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0());
+                    	              								
+                    	            }
+                    	            // InternalFormalML.g:5821:9: ( (lv_parameter_24_0= ruleParameterInout ) )+
+                    	            int cnt138=0;
+                    	            loop138:
+                    	            do {
+                    	                int alt138=2;
+                    	                int LA138_0 = input.LA(1);
+
+                    	                if ( (LA138_0==132) ) {
+                    	                    alt138=1;
+                    	                }
+
+
+                    	                switch (alt138) {
+                    	            	case 1 :
+                    	            	    // InternalFormalML.g:5822:10: (lv_parameter_24_0= ruleParameterInout )
+                    	            	    {
+                    	            	    // InternalFormalML.g:5822:10: (lv_parameter_24_0= ruleParameterInout )
+                    	            	    // InternalFormalML.g:5823:11: lv_parameter_24_0= ruleParameterInout
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0());
+                    	            	      										
+                    	            	    }
+                    	            	    pushFollow(FollowSets000.FOLLOW_53);
+                    	            	    lv_parameter_24_0=ruleParameterInout();
+
+                    	            	    state._fsp--;
+                    	            	    if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											if (current==null) {
+                    	            	      												current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	            	      											}
+                    	            	      											add(
+                    	            	      												current,
+                    	            	      												"parameter",
+                    	            	      												lv_parameter_24_0,
+                    	            	      												"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+                    	            	      											afterParserOrEnumRuleCall();
+                    	            	      										
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    if ( cnt138 >= 1 ) break loop138;
+                    	            	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                        EarlyExitException eee =
+                    	                            new EarlyExitException(138, input);
+                    	                        throw eee;
+                    	                }
+                    	                cnt138++;
+                    	            } while (true);
+
+                    	            otherlv_25=(Token)match(input,23,FollowSets000.FOLLOW_66); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_25, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2());
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalFormalML.g:5848:6: (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) )
+                    	    {
+                    	    // InternalFormalML.g:5848:6: (otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) ) )
+                    	    // InternalFormalML.g:5849:7: otherlv_26= 'output' ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) )
+                    	    {
+                    	    otherlv_26=(Token)match(input,63,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_26, grammarAccess.getStatemachineAccess().getOutputKeyword_7_0_1_2_0());
+                    	      						
+                    	    }
+                    	    // InternalFormalML.g:5853:7: ( ( (lv_parameter_27_0= ruleParameterOutput ) ) | (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' ) )
+                    	    int alt141=2;
+                    	    int LA141_0 = input.LA(1);
+
+                    	    if ( (LA141_0==132) ) {
+                    	        alt141=1;
+                    	    }
+                    	    else if ( (LA141_0==22) ) {
+                    	        alt141=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 141, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt141) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:5854:8: ( (lv_parameter_27_0= ruleParameterOutput ) )
+                    	            {
+                    	            // InternalFormalML.g:5854:8: ( (lv_parameter_27_0= ruleParameterOutput ) )
+                    	            // InternalFormalML.g:5855:9: (lv_parameter_27_0= ruleParameterOutput )
+                    	            {
+                    	            // InternalFormalML.g:5855:9: (lv_parameter_27_0= ruleParameterOutput )
+                    	            // InternalFormalML.g:5856:10: lv_parameter_27_0= ruleParameterOutput
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0());
+                    	              									
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_66);
+                    	            lv_parameter_27_0=ruleParameterOutput();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										if (current==null) {
+                    	              											current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	              										}
+                    	              										add(
+                    	              											current,
+                    	              											"parameter",
+                    	              											lv_parameter_27_0,
+                    	              											"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+                    	              										afterParserOrEnumRuleCall();
+                    	              									
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:5874:8: (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' )
+                    	            {
+                    	            // InternalFormalML.g:5874:8: (otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}' )
+                    	            // InternalFormalML.g:5875:9: otherlv_28= '{' ( (lv_parameter_29_0= ruleParameterOutput ) )+ otherlv_30= '}'
+                    	            {
+                    	            otherlv_28=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_28, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0());
+                    	              								
+                    	            }
+                    	            // InternalFormalML.g:5879:9: ( (lv_parameter_29_0= ruleParameterOutput ) )+
+                    	            int cnt140=0;
+                    	            loop140:
+                    	            do {
+                    	                int alt140=2;
+                    	                int LA140_0 = input.LA(1);
+
+                    	                if ( (LA140_0==132) ) {
+                    	                    alt140=1;
+                    	                }
+
+
+                    	                switch (alt140) {
+                    	            	case 1 :
+                    	            	    // InternalFormalML.g:5880:10: (lv_parameter_29_0= ruleParameterOutput )
+                    	            	    {
+                    	            	    // InternalFormalML.g:5880:10: (lv_parameter_29_0= ruleParameterOutput )
+                    	            	    // InternalFormalML.g:5881:11: lv_parameter_29_0= ruleParameterOutput
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0());
+                    	            	      										
+                    	            	    }
+                    	            	    pushFollow(FollowSets000.FOLLOW_53);
+                    	            	    lv_parameter_29_0=ruleParameterOutput();
+
+                    	            	    state._fsp--;
+                    	            	    if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											if (current==null) {
+                    	            	      												current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	            	      											}
+                    	            	      											add(
+                    	            	      												current,
+                    	            	      												"parameter",
+                    	            	      												lv_parameter_29_0,
+                    	            	      												"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+                    	            	      											afterParserOrEnumRuleCall();
+                    	            	      										
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    if ( cnt140 >= 1 ) break loop140;
+                    	            	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                        EarlyExitException eee =
+                    	                            new EarlyExitException(140, input);
+                    	                        throw eee;
+                    	                }
+                    	                cnt140++;
+                    	            } while (true);
+
+                    	            otherlv_30=(Token)match(input,23,FollowSets000.FOLLOW_66); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_30, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2());
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalFormalML.g:5906:6: (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) )
+                    	    {
+                    	    // InternalFormalML.g:5906:6: (otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) ) )
+                    	    // InternalFormalML.g:5907:7: otherlv_31= 'return' ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) )
+                    	    {
+                    	    otherlv_31=(Token)match(input,64,FollowSets000.FOLLOW_51); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newLeafNode(otherlv_31, grammarAccess.getStatemachineAccess().getReturnKeyword_7_0_1_3_0());
+                    	      						
+                    	    }
+                    	    // InternalFormalML.g:5911:7: ( ( (lv_parameter_32_0= ruleParameterReturn ) ) | (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' ) )
+                    	    int alt143=2;
+                    	    int LA143_0 = input.LA(1);
+
+                    	    if ( (LA143_0==132) ) {
+                    	        alt143=1;
+                    	    }
+                    	    else if ( (LA143_0==22) ) {
+                    	        alt143=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 143, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt143) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:5912:8: ( (lv_parameter_32_0= ruleParameterReturn ) )
+                    	            {
+                    	            // InternalFormalML.g:5912:8: ( (lv_parameter_32_0= ruleParameterReturn ) )
+                    	            // InternalFormalML.g:5913:9: (lv_parameter_32_0= ruleParameterReturn )
+                    	            {
+                    	            // InternalFormalML.g:5913:9: (lv_parameter_32_0= ruleParameterReturn )
+                    	            // InternalFormalML.g:5914:10: lv_parameter_32_0= ruleParameterReturn
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0());
+                    	              									
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_66);
+                    	            lv_parameter_32_0=ruleParameterReturn();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              										if (current==null) {
+                    	              											current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	              										}
+                    	              										add(
+                    	              											current,
+                    	              											"parameter",
+                    	              											lv_parameter_32_0,
+                    	              											"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+                    	              										afterParserOrEnumRuleCall();
+                    	              									
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:5932:8: (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' )
+                    	            {
+                    	            // InternalFormalML.g:5932:8: (otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}' )
+                    	            // InternalFormalML.g:5933:9: otherlv_33= '{' ( (lv_parameter_34_0= ruleParameterReturn ) )+ otherlv_35= '}'
+                    	            {
+                    	            otherlv_33=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_33, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0());
+                    	              								
+                    	            }
+                    	            // InternalFormalML.g:5937:9: ( (lv_parameter_34_0= ruleParameterReturn ) )+
+                    	            int cnt142=0;
+                    	            loop142:
+                    	            do {
+                    	                int alt142=2;
+                    	                int LA142_0 = input.LA(1);
+
+                    	                if ( (LA142_0==132) ) {
+                    	                    alt142=1;
+                    	                }
+
+
+                    	                switch (alt142) {
+                    	            	case 1 :
+                    	            	    // InternalFormalML.g:5938:10: (lv_parameter_34_0= ruleParameterReturn )
+                    	            	    {
+                    	            	    // InternalFormalML.g:5938:10: (lv_parameter_34_0= ruleParameterReturn )
+                    	            	    // InternalFormalML.g:5939:11: lv_parameter_34_0= ruleParameterReturn
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0());
+                    	            	      										
+                    	            	    }
+                    	            	    pushFollow(FollowSets000.FOLLOW_53);
+                    	            	    lv_parameter_34_0=ruleParameterReturn();
+
+                    	            	    state._fsp--;
+                    	            	    if (state.failed) return current;
+                    	            	    if ( state.backtracking==0 ) {
+
+                    	            	      											if (current==null) {
+                    	            	      												current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	            	      											}
+                    	            	      											add(
+                    	            	      												current,
+                    	            	      												"parameter",
+                    	            	      												lv_parameter_34_0,
+                    	            	      												"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+                    	            	      											afterParserOrEnumRuleCall();
+                    	            	      										
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    if ( cnt142 >= 1 ) break loop142;
+                    	            	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                        EarlyExitException eee =
+                    	                            new EarlyExitException(142, input);
+                    	                        throw eee;
+                    	                }
+                    	                cnt142++;
+                    	            } while (true);
+
+                    	            otherlv_35=(Token)match(input,23,FollowSets000.FOLLOW_66); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newLeafNode(otherlv_35, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2());
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop144;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:5966:4: ( ( (lv_port_36_0= rulePort ) ) | ( (lv_signal_37_0= ruleSignal ) ) | ( (lv_buffer_38_0= ruleBuffer ) ) | ( (lv_channel_39_0= ruleChannel ) ) | ( (lv_typedef_40_0= ruleTypeDefinition ) ) | ( (lv_property_41_0= ruleVariable ) ) )*
+                    {
+                    // InternalFormalML.g:5966:4: ( ( (lv_port_36_0= rulePort ) ) | ( (lv_signal_37_0= ruleSignal ) ) | ( (lv_buffer_38_0= ruleBuffer ) ) | ( (lv_channel_39_0= ruleChannel ) ) | ( (lv_typedef_40_0= ruleTypeDefinition ) ) | ( (lv_property_41_0= ruleVariable ) ) )*
+                    loop145:
+                    do {
+                        int alt145=7;
+                        alt145 = dfa145.predict(input);
+                        switch (alt145) {
+                    	case 1 :
+                    	    // InternalFormalML.g:5967:5: ( (lv_port_36_0= rulePort ) )
+                    	    {
+                    	    // InternalFormalML.g:5967:5: ( (lv_port_36_0= rulePort ) )
+                    	    // InternalFormalML.g:5968:6: (lv_port_36_0= rulePort )
+                    	    {
+                    	    // InternalFormalML.g:5968:6: (lv_port_36_0= rulePort )
+                    	    // InternalFormalML.g:5969:7: lv_port_36_0= rulePort
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_7_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_67);
+                    	    lv_port_36_0=rulePort();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"port",
+                    	      								lv_port_36_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Port");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:5987:5: ( (lv_signal_37_0= ruleSignal ) )
+                    	    {
+                    	    // InternalFormalML.g:5987:5: ( (lv_signal_37_0= ruleSignal ) )
+                    	    // InternalFormalML.g:5988:6: (lv_signal_37_0= ruleSignal )
+                    	    {
+                    	    // InternalFormalML.g:5988:6: (lv_signal_37_0= ruleSignal )
+                    	    // InternalFormalML.g:5989:7: lv_signal_37_0= ruleSignal
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_7_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_67);
+                    	    lv_signal_37_0=ruleSignal();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"signal",
+                    	      								lv_signal_37_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 3 :
+                    	    // InternalFormalML.g:6007:5: ( (lv_buffer_38_0= ruleBuffer ) )
+                    	    {
+                    	    // InternalFormalML.g:6007:5: ( (lv_buffer_38_0= ruleBuffer ) )
+                    	    // InternalFormalML.g:6008:6: (lv_buffer_38_0= ruleBuffer )
+                    	    {
+                    	    // InternalFormalML.g:6008:6: (lv_buffer_38_0= ruleBuffer )
+                    	    // InternalFormalML.g:6009:7: lv_buffer_38_0= ruleBuffer
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_7_1_2_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_67);
+                    	    lv_buffer_38_0=ruleBuffer();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"buffer",
+                    	      								lv_buffer_38_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 4 :
+                    	    // InternalFormalML.g:6027:5: ( (lv_channel_39_0= ruleChannel ) )
+                    	    {
+                    	    // InternalFormalML.g:6027:5: ( (lv_channel_39_0= ruleChannel ) )
+                    	    // InternalFormalML.g:6028:6: (lv_channel_39_0= ruleChannel )
+                    	    {
+                    	    // InternalFormalML.g:6028:6: (lv_channel_39_0= ruleChannel )
+                    	    // InternalFormalML.g:6029:7: lv_channel_39_0= ruleChannel
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_7_1_3_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_67);
+                    	    lv_channel_39_0=ruleChannel();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"channel",
+                    	      								lv_channel_39_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 5 :
+                    	    // InternalFormalML.g:6047:5: ( (lv_typedef_40_0= ruleTypeDefinition ) )
+                    	    {
+                    	    // InternalFormalML.g:6047:5: ( (lv_typedef_40_0= ruleTypeDefinition ) )
+                    	    // InternalFormalML.g:6048:6: (lv_typedef_40_0= ruleTypeDefinition )
+                    	    {
+                    	    // InternalFormalML.g:6048:6: (lv_typedef_40_0= ruleTypeDefinition )
+                    	    // InternalFormalML.g:6049:7: lv_typedef_40_0= ruleTypeDefinition
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_7_1_4_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_67);
+                    	    lv_typedef_40_0=ruleTypeDefinition();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"typedef",
+                    	      								lv_typedef_40_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 6 :
+                    	    // InternalFormalML.g:6067:5: ( (lv_property_41_0= ruleVariable ) )
+                    	    {
+                    	    // InternalFormalML.g:6067:5: ( (lv_property_41_0= ruleVariable ) )
+                    	    // InternalFormalML.g:6068:6: (lv_property_41_0= ruleVariable )
+                    	    {
+                    	    // InternalFormalML.g:6068:6: (lv_property_41_0= ruleVariable )
+                    	    // InternalFormalML.g:6069:7: lv_property_41_0= ruleVariable
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_7_1_5_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_67);
+                    	    lv_property_41_0=ruleVariable();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"property",
+                    	      								lv_property_41_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop145;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:6088:3: ( (otherlv_42= '@input:' ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )* ) | (otherlv_47= '@inout:' ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )* ) | (otherlv_52= '@output:' ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )* ) | (otherlv_57= '@return:' ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )* ) )*
+            loop155:
+            do {
+                int alt155=5;
+                switch ( input.LA(1) ) {
+                case 65:
+                    {
+                    alt155=1;
+                    }
+                    break;
+                case 66:
+                    {
+                    alt155=2;
+                    }
+                    break;
+                case 67:
+                    {
+                    alt155=3;
+                    }
+                    break;
+                case 68:
+                    {
+                    alt155=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt155) {
+            	case 1 :
+            	    // InternalFormalML.g:6089:4: (otherlv_42= '@input:' ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )* )
+            	    {
+            	    // InternalFormalML.g:6089:4: (otherlv_42= '@input:' ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )* )
+            	    // InternalFormalML.g:6090:5: otherlv_42= '@input:' ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )*
+            	    {
+            	    otherlv_42=(Token)match(input,65,FollowSets000.FOLLOW_68); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_42, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:6094:5: ( ( (lv_parameter_43_0= ruleParameterInput ) ) | (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' ) )*
+            	    loop148:
+            	    do {
+            	        int alt148=3;
+            	        int LA148_0 = input.LA(1);
+
+            	        if ( (LA148_0==132) ) {
+            	            alt148=1;
+            	        }
+            	        else if ( (LA148_0==22) ) {
+            	            alt148=2;
+            	        }
+
+
+            	        switch (alt148) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:6095:6: ( (lv_parameter_43_0= ruleParameterInput ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6095:6: ( (lv_parameter_43_0= ruleParameterInput ) )
+            	    	    // InternalFormalML.g:6096:7: (lv_parameter_43_0= ruleParameterInput )
+            	    	    {
+            	    	    // InternalFormalML.g:6096:7: (lv_parameter_43_0= ruleParameterInput )
+            	    	    // InternalFormalML.g:6097:8: lv_parameter_43_0= ruleParameterInput
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_68);
+            	    	    lv_parameter_43_0=ruleParameterInput();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"parameter",
+            	    	      									lv_parameter_43_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:6115:6: (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' )
+            	    	    {
+            	    	    // InternalFormalML.g:6115:6: (otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}' )
+            	    	    // InternalFormalML.g:6116:7: otherlv_44= '{' ( (lv_parameter_45_0= ruleParameterInput ) )+ otherlv_46= '}'
+            	    	    {
+            	    	    otherlv_44=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_44, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_0_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    // InternalFormalML.g:6120:7: ( (lv_parameter_45_0= ruleParameterInput ) )+
+            	    	    int cnt147=0;
+            	    	    loop147:
+            	    	    do {
+            	    	        int alt147=2;
+            	    	        int LA147_0 = input.LA(1);
+
+            	    	        if ( (LA147_0==132) ) {
+            	    	            alt147=1;
+            	    	        }
+
+
+            	    	        switch (alt147) {
+            	    	    	case 1 :
+            	    	    	    // InternalFormalML.g:6121:8: (lv_parameter_45_0= ruleParameterInput )
+            	    	    	    {
+            	    	    	    // InternalFormalML.g:6121:8: (lv_parameter_45_0= ruleParameterInput )
+            	    	    	    // InternalFormalML.g:6122:9: lv_parameter_45_0= ruleParameterInput
+            	    	    	    {
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInputParserRuleCall_8_0_1_1_1_0());
+            	    	    	      								
+            	    	    	    }
+            	    	    	    pushFollow(FollowSets000.FOLLOW_53);
+            	    	    	    lv_parameter_45_0=ruleParameterInput();
+
+            	    	    	    state._fsp--;
+            	    	    	    if (state.failed) return current;
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									if (current==null) {
+            	    	    	      										current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	    	      									}
+            	    	    	      									add(
+            	    	    	      										current,
+            	    	    	      										"parameter",
+            	    	    	      										lv_parameter_45_0,
+            	    	    	      										"org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+            	    	    	      									afterParserOrEnumRuleCall();
+            	    	    	      								
+            	    	    	    }
+
+            	    	    	    }
+
+
+            	    	    	    }
+            	    	    	    break;
+
+            	    	    	default :
+            	    	    	    if ( cnt147 >= 1 ) break loop147;
+            	    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	    	                EarlyExitException eee =
+            	    	                    new EarlyExitException(147, input);
+            	    	                throw eee;
+            	    	        }
+            	    	        cnt147++;
+            	    	    } while (true);
+
+            	    	    otherlv_46=(Token)match(input,23,FollowSets000.FOLLOW_68); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_46, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_0_1_1_2());
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop148;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:6147:4: (otherlv_47= '@inout:' ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )* )
+            	    {
+            	    // InternalFormalML.g:6147:4: (otherlv_47= '@inout:' ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )* )
+            	    // InternalFormalML.g:6148:5: otherlv_47= '@inout:' ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )*
+            	    {
+            	    otherlv_47=(Token)match(input,66,FollowSets000.FOLLOW_68); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_47, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:6152:5: ( ( (lv_parameter_48_0= ruleParameterInout ) ) | (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' ) )*
+            	    loop150:
+            	    do {
+            	        int alt150=3;
+            	        int LA150_0 = input.LA(1);
+
+            	        if ( (LA150_0==132) ) {
+            	            alt150=1;
+            	        }
+            	        else if ( (LA150_0==22) ) {
+            	            alt150=2;
+            	        }
+
+
+            	        switch (alt150) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:6153:6: ( (lv_parameter_48_0= ruleParameterInout ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6153:6: ( (lv_parameter_48_0= ruleParameterInout ) )
+            	    	    // InternalFormalML.g:6154:7: (lv_parameter_48_0= ruleParameterInout )
+            	    	    {
+            	    	    // InternalFormalML.g:6154:7: (lv_parameter_48_0= ruleParameterInout )
+            	    	    // InternalFormalML.g:6155:8: lv_parameter_48_0= ruleParameterInout
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_68);
+            	    	    lv_parameter_48_0=ruleParameterInout();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"parameter",
+            	    	      									lv_parameter_48_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:6173:6: (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' )
+            	    	    {
+            	    	    // InternalFormalML.g:6173:6: (otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}' )
+            	    	    // InternalFormalML.g:6174:7: otherlv_49= '{' ( (lv_parameter_50_0= ruleParameterInout ) )+ otherlv_51= '}'
+            	    	    {
+            	    	    otherlv_49=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_49, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    // InternalFormalML.g:6178:7: ( (lv_parameter_50_0= ruleParameterInout ) )+
+            	    	    int cnt149=0;
+            	    	    loop149:
+            	    	    do {
+            	    	        int alt149=2;
+            	    	        int LA149_0 = input.LA(1);
+
+            	    	        if ( (LA149_0==132) ) {
+            	    	            alt149=1;
+            	    	        }
+
+
+            	    	        switch (alt149) {
+            	    	    	case 1 :
+            	    	    	    // InternalFormalML.g:6179:8: (lv_parameter_50_0= ruleParameterInout )
+            	    	    	    {
+            	    	    	    // InternalFormalML.g:6179:8: (lv_parameter_50_0= ruleParameterInout )
+            	    	    	    // InternalFormalML.g:6180:9: lv_parameter_50_0= ruleParameterInout
+            	    	    	    {
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterInoutParserRuleCall_8_1_1_1_1_0());
+            	    	    	      								
+            	    	    	    }
+            	    	    	    pushFollow(FollowSets000.FOLLOW_53);
+            	    	    	    lv_parameter_50_0=ruleParameterInout();
+
+            	    	    	    state._fsp--;
+            	    	    	    if (state.failed) return current;
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									if (current==null) {
+            	    	    	      										current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	    	      									}
+            	    	    	      									add(
+            	    	    	      										current,
+            	    	    	      										"parameter",
+            	    	    	      										lv_parameter_50_0,
+            	    	    	      										"org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+            	    	    	      									afterParserOrEnumRuleCall();
+            	    	    	      								
+            	    	    	    }
+
+            	    	    	    }
+
+
+            	    	    	    }
+            	    	    	    break;
+
+            	    	    	default :
+            	    	    	    if ( cnt149 >= 1 ) break loop149;
+            	    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	    	                EarlyExitException eee =
+            	    	                    new EarlyExitException(149, input);
+            	    	                throw eee;
+            	    	        }
+            	    	        cnt149++;
+            	    	    } while (true);
+
+            	    	    otherlv_51=(Token)match(input,23,FollowSets000.FOLLOW_68); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_51, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_1_1_2());
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop150;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:6205:4: (otherlv_52= '@output:' ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )* )
+            	    {
+            	    // InternalFormalML.g:6205:4: (otherlv_52= '@output:' ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )* )
+            	    // InternalFormalML.g:6206:5: otherlv_52= '@output:' ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )*
+            	    {
+            	    otherlv_52=(Token)match(input,67,FollowSets000.FOLLOW_68); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_52, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:6210:5: ( ( (lv_parameter_53_0= ruleParameterOutput ) ) | (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' ) )*
+            	    loop152:
+            	    do {
+            	        int alt152=3;
+            	        int LA152_0 = input.LA(1);
+
+            	        if ( (LA152_0==132) ) {
+            	            alt152=1;
+            	        }
+            	        else if ( (LA152_0==22) ) {
+            	            alt152=2;
+            	        }
+
+
+            	        switch (alt152) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:6211:6: ( (lv_parameter_53_0= ruleParameterOutput ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6211:6: ( (lv_parameter_53_0= ruleParameterOutput ) )
+            	    	    // InternalFormalML.g:6212:7: (lv_parameter_53_0= ruleParameterOutput )
+            	    	    {
+            	    	    // InternalFormalML.g:6212:7: (lv_parameter_53_0= ruleParameterOutput )
+            	    	    // InternalFormalML.g:6213:8: lv_parameter_53_0= ruleParameterOutput
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_68);
+            	    	    lv_parameter_53_0=ruleParameterOutput();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"parameter",
+            	    	      									lv_parameter_53_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:6231:6: (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' )
+            	    	    {
+            	    	    // InternalFormalML.g:6231:6: (otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}' )
+            	    	    // InternalFormalML.g:6232:7: otherlv_54= '{' ( (lv_parameter_55_0= ruleParameterOutput ) )+ otherlv_56= '}'
+            	    	    {
+            	    	    otherlv_54=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_54, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_2_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    // InternalFormalML.g:6236:7: ( (lv_parameter_55_0= ruleParameterOutput ) )+
+            	    	    int cnt151=0;
+            	    	    loop151:
+            	    	    do {
+            	    	        int alt151=2;
+            	    	        int LA151_0 = input.LA(1);
+
+            	    	        if ( (LA151_0==132) ) {
+            	    	            alt151=1;
+            	    	        }
+
+
+            	    	        switch (alt151) {
+            	    	    	case 1 :
+            	    	    	    // InternalFormalML.g:6237:8: (lv_parameter_55_0= ruleParameterOutput )
+            	    	    	    {
+            	    	    	    // InternalFormalML.g:6237:8: (lv_parameter_55_0= ruleParameterOutput )
+            	    	    	    // InternalFormalML.g:6238:9: lv_parameter_55_0= ruleParameterOutput
+            	    	    	    {
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterOutputParserRuleCall_8_2_1_1_1_0());
+            	    	    	      								
+            	    	    	    }
+            	    	    	    pushFollow(FollowSets000.FOLLOW_53);
+            	    	    	    lv_parameter_55_0=ruleParameterOutput();
+
+            	    	    	    state._fsp--;
+            	    	    	    if (state.failed) return current;
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									if (current==null) {
+            	    	    	      										current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	    	      									}
+            	    	    	      									add(
+            	    	    	      										current,
+            	    	    	      										"parameter",
+            	    	    	      										lv_parameter_55_0,
+            	    	    	      										"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+            	    	    	      									afterParserOrEnumRuleCall();
+            	    	    	      								
+            	    	    	    }
+
+            	    	    	    }
+
+
+            	    	    	    }
+            	    	    	    break;
+
+            	    	    	default :
+            	    	    	    if ( cnt151 >= 1 ) break loop151;
+            	    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	    	                EarlyExitException eee =
+            	    	                    new EarlyExitException(151, input);
+            	    	                throw eee;
+            	    	        }
+            	    	        cnt151++;
+            	    	    } while (true);
+
+            	    	    otherlv_56=(Token)match(input,23,FollowSets000.FOLLOW_68); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_56, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_2_1_1_2());
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop152;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:6263:4: (otherlv_57= '@return:' ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )* )
+            	    {
+            	    // InternalFormalML.g:6263:4: (otherlv_57= '@return:' ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )* )
+            	    // InternalFormalML.g:6264:5: otherlv_57= '@return:' ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )*
+            	    {
+            	    otherlv_57=(Token)match(input,68,FollowSets000.FOLLOW_68); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_57, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:6268:5: ( ( (lv_parameter_58_0= ruleParameterReturn ) ) | (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' ) )*
+            	    loop154:
+            	    do {
+            	        int alt154=3;
+            	        int LA154_0 = input.LA(1);
+
+            	        if ( (LA154_0==132) ) {
+            	            alt154=1;
+            	        }
+            	        else if ( (LA154_0==22) ) {
+            	            alt154=2;
+            	        }
+
+
+            	        switch (alt154) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:6269:6: ( (lv_parameter_58_0= ruleParameterReturn ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6269:6: ( (lv_parameter_58_0= ruleParameterReturn ) )
+            	    	    // InternalFormalML.g:6270:7: (lv_parameter_58_0= ruleParameterReturn )
+            	    	    {
+            	    	    // InternalFormalML.g:6270:7: (lv_parameter_58_0= ruleParameterReturn )
+            	    	    // InternalFormalML.g:6271:8: lv_parameter_58_0= ruleParameterReturn
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_68);
+            	    	    lv_parameter_58_0=ruleParameterReturn();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"parameter",
+            	    	      									lv_parameter_58_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:6289:6: (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' )
+            	    	    {
+            	    	    // InternalFormalML.g:6289:6: (otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}' )
+            	    	    // InternalFormalML.g:6290:7: otherlv_59= '{' ( (lv_parameter_60_0= ruleParameterReturn ) )+ otherlv_61= '}'
+            	    	    {
+            	    	    otherlv_59=(Token)match(input,22,FollowSets000.FOLLOW_52); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_59, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_3_1_1_0());
+            	    	      						
+            	    	    }
+            	    	    // InternalFormalML.g:6294:7: ( (lv_parameter_60_0= ruleParameterReturn ) )+
+            	    	    int cnt153=0;
+            	    	    loop153:
+            	    	    do {
+            	    	        int alt153=2;
+            	    	        int LA153_0 = input.LA(1);
+
+            	    	        if ( (LA153_0==132) ) {
+            	    	            alt153=1;
+            	    	        }
+
+
+            	    	        switch (alt153) {
+            	    	    	case 1 :
+            	    	    	    // InternalFormalML.g:6295:8: (lv_parameter_60_0= ruleParameterReturn )
+            	    	    	    {
+            	    	    	    // InternalFormalML.g:6295:8: (lv_parameter_60_0= ruleParameterReturn )
+            	    	    	    // InternalFormalML.g:6296:9: lv_parameter_60_0= ruleParameterReturn
+            	    	    	    {
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									newCompositeNode(grammarAccess.getStatemachineAccess().getParameterParameterReturnParserRuleCall_8_3_1_1_1_0());
+            	    	    	      								
+            	    	    	    }
+            	    	    	    pushFollow(FollowSets000.FOLLOW_53);
+            	    	    	    lv_parameter_60_0=ruleParameterReturn();
+
+            	    	    	    state._fsp--;
+            	    	    	    if (state.failed) return current;
+            	    	    	    if ( state.backtracking==0 ) {
+
+            	    	    	      									if (current==null) {
+            	    	    	      										current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	    	      									}
+            	    	    	      									add(
+            	    	    	      										current,
+            	    	    	      										"parameter",
+            	    	    	      										lv_parameter_60_0,
+            	    	    	      										"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+            	    	    	      									afterParserOrEnumRuleCall();
+            	    	    	      								
+            	    	    	    }
+
+            	    	    	    }
+
+
+            	    	    	    }
+            	    	    	    break;
+
+            	    	    	default :
+            	    	    	    if ( cnt153 >= 1 ) break loop153;
+            	    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+            	    	                EarlyExitException eee =
+            	    	                    new EarlyExitException(153, input);
+            	    	                throw eee;
+            	    	        }
+            	    	        cnt153++;
+            	    	    } while (true);
+
+            	    	    otherlv_61=(Token)match(input,23,FollowSets000.FOLLOW_68); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      							newLeafNode(otherlv_61, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_3_1_1_2());
+            	    	      						
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop154;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop155;
+                }
+            } while (true);
+
+            // InternalFormalML.g:6321:3: ( (otherlv_62= '@property:' ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )* ) | (otherlv_69= '@public:' ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )* ) | (otherlv_76= '@protected:' ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )* ) | (otherlv_83= '@private:' ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )* ) )*
+            loop160:
+            do {
+                int alt160=5;
+                switch ( input.LA(1) ) {
+                case 38:
+                    {
+                    alt160=1;
+                    }
+                    break;
+                case 39:
+                    {
+                    alt160=2;
+                    }
+                    break;
+                case 40:
+                    {
+                    alt160=3;
+                    }
+                    break;
+                case 41:
+                    {
+                    alt160=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt160) {
+            	case 1 :
+            	    // InternalFormalML.g:6322:4: (otherlv_62= '@property:' ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )* )
+            	    {
+            	    // InternalFormalML.g:6322:4: (otherlv_62= '@property:' ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )* )
+            	    // InternalFormalML.g:6323:5: otherlv_62= '@property:' ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )*
+            	    {
+            	    otherlv_62=(Token)match(input,38,FollowSets000.FOLLOW_69); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_62, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:6327:5: ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )*
+            	    loop156:
+            	    do {
+            	        int alt156=7;
+            	        alt156 = dfa156.predict(input);
+            	        switch (alt156) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:6328:6: ( (lv_port_63_0= rulePort ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6328:6: ( (lv_port_63_0= rulePort ) )
+            	    	    // InternalFormalML.g:6329:7: (lv_port_63_0= rulePort )
+            	    	    {
+            	    	    // InternalFormalML.g:6329:7: (lv_port_63_0= rulePort )
+            	    	    // InternalFormalML.g:6330:8: lv_port_63_0= rulePort
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortParserRuleCall_9_0_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_port_63_0=rulePort();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_63_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Port");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:6348:6: ( (lv_signal_64_0= ruleSignal ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6348:6: ( (lv_signal_64_0= ruleSignal ) )
+            	    	    // InternalFormalML.g:6349:7: (lv_signal_64_0= ruleSignal )
+            	    	    {
+            	    	    // InternalFormalML.g:6349:7: (lv_signal_64_0= ruleSignal )
+            	    	    // InternalFormalML.g:6350:8: lv_signal_64_0= ruleSignal
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalParserRuleCall_9_0_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_signal_64_0=ruleSignal();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_64_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Signal");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:6368:6: ( (lv_buffer_65_0= ruleBuffer ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6368:6: ( (lv_buffer_65_0= ruleBuffer ) )
+            	    	    // InternalFormalML.g:6369:7: (lv_buffer_65_0= ruleBuffer )
+            	    	    {
+            	    	    // InternalFormalML.g:6369:7: (lv_buffer_65_0= ruleBuffer )
+            	    	    // InternalFormalML.g:6370:8: lv_buffer_65_0= ruleBuffer
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferParserRuleCall_9_0_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_buffer_65_0=ruleBuffer();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_65_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:6388:6: ( (lv_channel_66_0= ruleChannel ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6388:6: ( (lv_channel_66_0= ruleChannel ) )
+            	    	    // InternalFormalML.g:6389:7: (lv_channel_66_0= ruleChannel )
+            	    	    {
+            	    	    // InternalFormalML.g:6389:7: (lv_channel_66_0= ruleChannel )
+            	    	    // InternalFormalML.g:6390:8: lv_channel_66_0= ruleChannel
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelParserRuleCall_9_0_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_channel_66_0=ruleChannel();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_66_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Channel");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:6408:6: ( (lv_typedef_67_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6408:6: ( (lv_typedef_67_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:6409:7: (lv_typedef_67_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:6409:7: (lv_typedef_67_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:6410:8: lv_typedef_67_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_typedef_67_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_67_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:6428:6: ( (lv_property_68_0= ruleVariable ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6428:6: ( (lv_property_68_0= ruleVariable ) )
+            	    	    // InternalFormalML.g:6429:7: (lv_property_68_0= ruleVariable )
+            	    	    {
+            	    	    // InternalFormalML.g:6429:7: (lv_property_68_0= ruleVariable )
+            	    	    // InternalFormalML.g:6430:8: lv_property_68_0= ruleVariable
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariableParserRuleCall_9_0_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_property_68_0=ruleVariable();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_68_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop156;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:6450:4: (otherlv_69= '@public:' ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )* )
+            	    {
+            	    // InternalFormalML.g:6450:4: (otherlv_69= '@public:' ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )* )
+            	    // InternalFormalML.g:6451:5: otherlv_69= '@public:' ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )*
+            	    {
+            	    otherlv_69=(Token)match(input,39,FollowSets000.FOLLOW_69); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_69, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:6455:5: ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )*
+            	    loop157:
+            	    do {
+            	        int alt157=7;
+            	        alt157 = dfa157.predict(input);
+            	        switch (alt157) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:6456:6: ( (lv_port_70_0= rulePortPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6456:6: ( (lv_port_70_0= rulePortPublic ) )
+            	    	    // InternalFormalML.g:6457:7: (lv_port_70_0= rulePortPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:6457:7: (lv_port_70_0= rulePortPublic )
+            	    	    // InternalFormalML.g:6458:8: lv_port_70_0= rulePortPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortPublicParserRuleCall_9_1_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_port_70_0=rulePortPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_70_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:6476:6: ( (lv_signal_71_0= ruleSignalPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6476:6: ( (lv_signal_71_0= ruleSignalPublic ) )
+            	    	    // InternalFormalML.g:6477:7: (lv_signal_71_0= ruleSignalPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:6477:7: (lv_signal_71_0= ruleSignalPublic )
+            	    	    // InternalFormalML.g:6478:8: lv_signal_71_0= ruleSignalPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalPublicParserRuleCall_9_1_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_signal_71_0=ruleSignalPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_71_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:6496:6: ( (lv_buffer_72_0= ruleBufferPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6496:6: ( (lv_buffer_72_0= ruleBufferPublic ) )
+            	    	    // InternalFormalML.g:6497:7: (lv_buffer_72_0= ruleBufferPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:6497:7: (lv_buffer_72_0= ruleBufferPublic )
+            	    	    // InternalFormalML.g:6498:8: lv_buffer_72_0= ruleBufferPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferPublicParserRuleCall_9_1_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_buffer_72_0=ruleBufferPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_72_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:6516:6: ( (lv_channel_73_0= ruleChannelPublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6516:6: ( (lv_channel_73_0= ruleChannelPublic ) )
+            	    	    // InternalFormalML.g:6517:7: (lv_channel_73_0= ruleChannelPublic )
+            	    	    {
+            	    	    // InternalFormalML.g:6517:7: (lv_channel_73_0= ruleChannelPublic )
+            	    	    // InternalFormalML.g:6518:8: lv_channel_73_0= ruleChannelPublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelPublicParserRuleCall_9_1_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_channel_73_0=ruleChannelPublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_73_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:6536:6: ( (lv_typedef_74_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6536:6: ( (lv_typedef_74_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:6537:7: (lv_typedef_74_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:6537:7: (lv_typedef_74_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:6538:8: lv_typedef_74_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_typedef_74_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_74_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:6556:6: ( (lv_property_75_0= ruleVariablePublic ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6556:6: ( (lv_property_75_0= ruleVariablePublic ) )
+            	    	    // InternalFormalML.g:6557:7: (lv_property_75_0= ruleVariablePublic )
+            	    	    {
+            	    	    // InternalFormalML.g:6557:7: (lv_property_75_0= ruleVariablePublic )
+            	    	    // InternalFormalML.g:6558:8: lv_property_75_0= ruleVariablePublic
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariablePublicParserRuleCall_9_1_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_property_75_0=ruleVariablePublic();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_75_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop157;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:6578:4: (otherlv_76= '@protected:' ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )* )
+            	    {
+            	    // InternalFormalML.g:6578:4: (otherlv_76= '@protected:' ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )* )
+            	    // InternalFormalML.g:6579:5: otherlv_76= '@protected:' ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )*
+            	    {
+            	    otherlv_76=(Token)match(input,40,FollowSets000.FOLLOW_69); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_76, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:6583:5: ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )*
+            	    loop158:
+            	    do {
+            	        int alt158=7;
+            	        alt158 = dfa158.predict(input);
+            	        switch (alt158) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:6584:6: ( (lv_port_77_0= rulePortProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6584:6: ( (lv_port_77_0= rulePortProtected ) )
+            	    	    // InternalFormalML.g:6585:7: (lv_port_77_0= rulePortProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:6585:7: (lv_port_77_0= rulePortProtected )
+            	    	    // InternalFormalML.g:6586:8: lv_port_77_0= rulePortProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortProtectedParserRuleCall_9_2_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_port_77_0=rulePortProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_77_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:6604:6: ( (lv_signal_78_0= ruleSignalProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6604:6: ( (lv_signal_78_0= ruleSignalProtected ) )
+            	    	    // InternalFormalML.g:6605:7: (lv_signal_78_0= ruleSignalProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:6605:7: (lv_signal_78_0= ruleSignalProtected )
+            	    	    // InternalFormalML.g:6606:8: lv_signal_78_0= ruleSignalProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalProtectedParserRuleCall_9_2_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_signal_78_0=ruleSignalProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_78_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:6624:6: ( (lv_buffer_79_0= ruleBufferProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6624:6: ( (lv_buffer_79_0= ruleBufferProtected ) )
+            	    	    // InternalFormalML.g:6625:7: (lv_buffer_79_0= ruleBufferProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:6625:7: (lv_buffer_79_0= ruleBufferProtected )
+            	    	    // InternalFormalML.g:6626:8: lv_buffer_79_0= ruleBufferProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferProtectedParserRuleCall_9_2_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_buffer_79_0=ruleBufferProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_79_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:6644:6: ( (lv_channel_80_0= ruleChannelProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6644:6: ( (lv_channel_80_0= ruleChannelProtected ) )
+            	    	    // InternalFormalML.g:6645:7: (lv_channel_80_0= ruleChannelProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:6645:7: (lv_channel_80_0= ruleChannelProtected )
+            	    	    // InternalFormalML.g:6646:8: lv_channel_80_0= ruleChannelProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelProtectedParserRuleCall_9_2_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_channel_80_0=ruleChannelProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_80_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:6664:6: ( (lv_typedef_81_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6664:6: ( (lv_typedef_81_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:6665:7: (lv_typedef_81_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:6665:7: (lv_typedef_81_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:6666:8: lv_typedef_81_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_typedef_81_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_81_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:6684:6: ( (lv_property_82_0= ruleVariableProtected ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6684:6: ( (lv_property_82_0= ruleVariableProtected ) )
+            	    	    // InternalFormalML.g:6685:7: (lv_property_82_0= ruleVariableProtected )
+            	    	    {
+            	    	    // InternalFormalML.g:6685:7: (lv_property_82_0= ruleVariableProtected )
+            	    	    // InternalFormalML.g:6686:8: lv_property_82_0= ruleVariableProtected
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariableProtectedParserRuleCall_9_2_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_property_82_0=ruleVariableProtected();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_82_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop158;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:6706:4: (otherlv_83= '@private:' ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )* )
+            	    {
+            	    // InternalFormalML.g:6706:4: (otherlv_83= '@private:' ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )* )
+            	    // InternalFormalML.g:6707:5: otherlv_83= '@private:' ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )*
+            	    {
+            	    otherlv_83=(Token)match(input,41,FollowSets000.FOLLOW_69); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					newLeafNode(otherlv_83, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0());
+            	      				
+            	    }
+            	    // InternalFormalML.g:6711:5: ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )*
+            	    loop159:
+            	    do {
+            	        int alt159=7;
+            	        alt159 = dfa159.predict(input);
+            	        switch (alt159) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:6712:6: ( (lv_port_84_0= rulePortPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6712:6: ( (lv_port_84_0= rulePortPrivate ) )
+            	    	    // InternalFormalML.g:6713:7: (lv_port_84_0= rulePortPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:6713:7: (lv_port_84_0= rulePortPrivate )
+            	    	    // InternalFormalML.g:6714:8: lv_port_84_0= rulePortPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getPortPortPrivateParserRuleCall_9_3_1_0_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_port_84_0=rulePortPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"port",
+            	    	      									lv_port_84_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 2 :
+            	    	    // InternalFormalML.g:6732:6: ( (lv_signal_85_0= ruleSignalPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6732:6: ( (lv_signal_85_0= ruleSignalPrivate ) )
+            	    	    // InternalFormalML.g:6733:7: (lv_signal_85_0= ruleSignalPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:6733:7: (lv_signal_85_0= ruleSignalPrivate )
+            	    	    // InternalFormalML.g:6734:8: lv_signal_85_0= ruleSignalPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getSignalSignalPrivateParserRuleCall_9_3_1_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_signal_85_0=ruleSignalPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"signal",
+            	    	      									lv_signal_85_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 3 :
+            	    	    // InternalFormalML.g:6752:6: ( (lv_buffer_86_0= ruleBufferPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6752:6: ( (lv_buffer_86_0= ruleBufferPrivate ) )
+            	    	    // InternalFormalML.g:6753:7: (lv_buffer_86_0= ruleBufferPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:6753:7: (lv_buffer_86_0= ruleBufferPrivate )
+            	    	    // InternalFormalML.g:6754:8: lv_buffer_86_0= ruleBufferPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getBufferBufferPrivateParserRuleCall_9_3_1_2_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_buffer_86_0=ruleBufferPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"buffer",
+            	    	      									lv_buffer_86_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 4 :
+            	    	    // InternalFormalML.g:6772:6: ( (lv_channel_87_0= ruleChannelPrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6772:6: ( (lv_channel_87_0= ruleChannelPrivate ) )
+            	    	    // InternalFormalML.g:6773:7: (lv_channel_87_0= ruleChannelPrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:6773:7: (lv_channel_87_0= ruleChannelPrivate )
+            	    	    // InternalFormalML.g:6774:8: lv_channel_87_0= ruleChannelPrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getChannelChannelPrivateParserRuleCall_9_3_1_3_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_channel_87_0=ruleChannelPrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"channel",
+            	    	      									lv_channel_87_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 5 :
+            	    	    // InternalFormalML.g:6792:6: ( (lv_typedef_88_0= ruleTypeDefinition ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6792:6: ( (lv_typedef_88_0= ruleTypeDefinition ) )
+            	    	    // InternalFormalML.g:6793:7: (lv_typedef_88_0= ruleTypeDefinition )
+            	    	    {
+            	    	    // InternalFormalML.g:6793:7: (lv_typedef_88_0= ruleTypeDefinition )
+            	    	    // InternalFormalML.g:6794:8: lv_typedef_88_0= ruleTypeDefinition
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_typedef_88_0=ruleTypeDefinition();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"typedef",
+            	    	      									lv_typedef_88_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+            	    	case 6 :
+            	    	    // InternalFormalML.g:6812:6: ( (lv_property_89_0= ruleVariablePrivate ) )
+            	    	    {
+            	    	    // InternalFormalML.g:6812:6: ( (lv_property_89_0= ruleVariablePrivate ) )
+            	    	    // InternalFormalML.g:6813:7: (lv_property_89_0= ruleVariablePrivate )
+            	    	    {
+            	    	    // InternalFormalML.g:6813:7: (lv_property_89_0= ruleVariablePrivate )
+            	    	    // InternalFormalML.g:6814:8: lv_property_89_0= ruleVariablePrivate
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getPropertyVariablePrivateParserRuleCall_9_3_1_5_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_69);
+            	    	    lv_property_89_0=ruleVariablePrivate();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"property",
+            	    	      									lv_property_89_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop159;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop160;
+                }
+            } while (true);
+
+            // InternalFormalML.g:6834:3: ( ( ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ ) | (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ ) )* | ( ( (lv_routine_95_0= ruleRoutine ) ) | ( (lv_procedure_96_0= ruleProcedure ) ) )+ )
+            int alt166=2;
+            int LA166_0 = input.LA(1);
+
+            if ( ((LA166_0>=42 && LA166_0<=44)||LA166_0==51||(LA166_0>=73 && LA166_0<=76)||LA166_0==86||(LA166_0>=88 && LA166_0<=91)) ) {
+                alt166=1;
+            }
+            else if ( (LA166_0==19||LA166_0==58||(LA166_0>=93 && LA166_0<=94)||(LA166_0>=240 && LA166_0<=242)) ) {
+                alt166=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 166, 0, input);
+
+                throw nvae;
+            }
+            switch (alt166) {
+                case 1 :
+                    // InternalFormalML.g:6835:4: ( ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ ) | (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ ) )*
+                    {
+                    // InternalFormalML.g:6835:4: ( ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ ) | (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ ) )*
+                    loop164:
+                    do {
+                        int alt164=3;
+                        int LA164_0 = input.LA(1);
+
+                        if ( ((LA164_0>=42 && LA164_0<=43)) ) {
+                            alt164=1;
+                        }
+                        else if ( (LA164_0==44) ) {
+                            alt164=2;
+                        }
+
+
+                        switch (alt164) {
+                    	case 1 :
+                    	    // InternalFormalML.g:6836:5: ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ )
+                    	    {
+                    	    // InternalFormalML.g:6836:5: ( (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+ )
+                    	    // InternalFormalML.g:6837:6: (otherlv_90= '@routine:' | otherlv_91= '@macro:' ) ( (lv_routine_92_0= ruleRoutine ) )+
+                    	    {
+                    	    // InternalFormalML.g:6837:6: (otherlv_90= '@routine:' | otherlv_91= '@macro:' )
+                    	    int alt161=2;
+                    	    int LA161_0 = input.LA(1);
+
+                    	    if ( (LA161_0==42) ) {
+                    	        alt161=1;
+                    	    }
+                    	    else if ( (LA161_0==43) ) {
+                    	        alt161=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 161, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt161) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:6838:7: otherlv_90= '@routine:'
+                    	            {
+                    	            otherlv_90=(Token)match(input,42,FollowSets000.FOLLOW_26); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_90, grammarAccess.getStatemachineAccess().getRoutineKeyword_10_0_0_0_0());
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:6843:7: otherlv_91= '@macro:'
+                    	            {
+                    	            otherlv_91=(Token)match(input,43,FollowSets000.FOLLOW_26); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_91, grammarAccess.getStatemachineAccess().getMacroKeyword_10_0_0_0_1());
+                    	              						
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    // InternalFormalML.g:6848:6: ( (lv_routine_92_0= ruleRoutine ) )+
+                    	    int cnt162=0;
+                    	    loop162:
+                    	    do {
+                    	        int alt162=2;
+                    	        int LA162_0 = input.LA(1);
+
+                    	        if ( (LA162_0==19||(LA162_0>=93 && LA162_0<=94)||(LA162_0>=240 && LA162_0<=242)) ) {
+                    	            alt162=1;
+                    	        }
+
+
+                    	        switch (alt162) {
+                    	    	case 1 :
+                    	    	    // InternalFormalML.g:6849:7: (lv_routine_92_0= ruleRoutine )
+                    	    	    {
+                    	    	    // InternalFormalML.g:6849:7: (lv_routine_92_0= ruleRoutine )
+                    	    	    // InternalFormalML.g:6850:8: lv_routine_92_0= ruleRoutine
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_0_0_1_0());
+                    	    	      							
+                    	    	    }
+                    	    	    pushFollow(FollowSets000.FOLLOW_70);
+                    	    	    lv_routine_92_0=ruleRoutine();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								if (current==null) {
+                    	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	    	      								}
+                    	    	      								add(
+                    	    	      									current,
+                    	    	      									"routine",
+                    	    	      									lv_routine_92_0,
+                    	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+                    	    	      								afterParserOrEnumRuleCall();
+                    	    	      							
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    if ( cnt162 >= 1 ) break loop162;
+                    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                EarlyExitException eee =
+                    	                    new EarlyExitException(162, input);
+                    	                throw eee;
+                    	        }
+                    	        cnt162++;
+                    	    } while (true);
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:6869:5: (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ )
+                    	    {
+                    	    // InternalFormalML.g:6869:5: (otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+ )
+                    	    // InternalFormalML.g:6870:6: otherlv_93= '@procedure:' ( (lv_procedure_94_0= ruleProcedure ) )+
+                    	    {
+                    	    otherlv_93=(Token)match(input,44,FollowSets000.FOLLOW_25); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_93, grammarAccess.getStatemachineAccess().getProcedureKeyword_10_0_1_0());
+                    	      					
+                    	    }
+                    	    // InternalFormalML.g:6874:6: ( (lv_procedure_94_0= ruleProcedure ) )+
+                    	    int cnt163=0;
+                    	    loop163:
+                    	    do {
+                    	        int alt163=2;
+                    	        int LA163_0 = input.LA(1);
+
+                    	        if ( (LA163_0==19||LA163_0==58||(LA163_0>=240 && LA163_0<=242)) ) {
+                    	            alt163=1;
+                    	        }
+
+
+                    	        switch (alt163) {
+                    	    	case 1 :
+                    	    	    // InternalFormalML.g:6875:7: (lv_procedure_94_0= ruleProcedure )
+                    	    	    {
+                    	    	    // InternalFormalML.g:6875:7: (lv_procedure_94_0= ruleProcedure )
+                    	    	    // InternalFormalML.g:6876:8: lv_procedure_94_0= ruleProcedure
+                    	    	    {
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								newCompositeNode(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_0_1_1_0());
+                    	    	      							
+                    	    	    }
+                    	    	    pushFollow(FollowSets000.FOLLOW_69);
+                    	    	    lv_procedure_94_0=ruleProcedure();
+
+                    	    	    state._fsp--;
+                    	    	    if (state.failed) return current;
+                    	    	    if ( state.backtracking==0 ) {
+
+                    	    	      								if (current==null) {
+                    	    	      									current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	    	      								}
+                    	    	      								add(
+                    	    	      									current,
+                    	    	      									"procedure",
+                    	    	      									lv_procedure_94_0,
+                    	    	      									"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+                    	    	      								afterParserOrEnumRuleCall();
+                    	    	      							
+                    	    	    }
+
+                    	    	    }
+
+
+                    	    	    }
+                    	    	    break;
+
+                    	    	default :
+                    	    	    if ( cnt163 >= 1 ) break loop163;
+                    	    	    if (state.backtracking>0) {state.failed=true; return current;}
+                    	                EarlyExitException eee =
+                    	                    new EarlyExitException(163, input);
+                    	                throw eee;
+                    	        }
+                    	        cnt163++;
+                    	    } while (true);
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop164;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6896:4: ( ( (lv_routine_95_0= ruleRoutine ) ) | ( (lv_procedure_96_0= ruleProcedure ) ) )+
+                    {
+                    // InternalFormalML.g:6896:4: ( ( (lv_routine_95_0= ruleRoutine ) ) | ( (lv_procedure_96_0= ruleProcedure ) ) )+
+                    int cnt165=0;
+                    loop165:
+                    do {
+                        int alt165=3;
+                        switch ( input.LA(1) ) {
+                        case 240:
+                            {
+                            int LA165_2 = input.LA(2);
+
+                            if ( (LA165_2==58) ) {
+                                alt165=2;
+                            }
+                            else if ( ((LA165_2>=93 && LA165_2<=94)) ) {
+                                alt165=1;
+                            }
+
+
+                            }
+                            break;
+                        case 241:
+                            {
+                            int LA165_3 = input.LA(2);
+
+                            if ( ((LA165_3>=93 && LA165_3<=94)) ) {
+                                alt165=1;
+                            }
+                            else if ( (LA165_3==58) ) {
+                                alt165=2;
+                            }
+
+
+                            }
+                            break;
+                        case 242:
+                            {
+                            int LA165_4 = input.LA(2);
+
+                            if ( (LA165_4==58) ) {
+                                alt165=2;
+                            }
+                            else if ( ((LA165_4>=93 && LA165_4<=94)) ) {
+                                alt165=1;
+                            }
+
+
+                            }
+                            break;
+                        case 19:
+                            {
+                            int LA165_5 = input.LA(2);
+
+                            if ( (LA165_5==58) ) {
+                                alt165=2;
+                            }
+                            else if ( ((LA165_5>=93 && LA165_5<=94)) ) {
+                                alt165=1;
+                            }
+
+
+                            }
+                            break;
+                        case 93:
+                        case 94:
+                            {
+                            alt165=1;
+                            }
+                            break;
+                        case 58:
+                            {
+                            alt165=2;
+                            }
+                            break;
+
+                        }
+
+                        switch (alt165) {
+                    	case 1 :
+                    	    // InternalFormalML.g:6897:5: ( (lv_routine_95_0= ruleRoutine ) )
+                    	    {
+                    	    // InternalFormalML.g:6897:5: ( (lv_routine_95_0= ruleRoutine ) )
+                    	    // InternalFormalML.g:6898:6: (lv_routine_95_0= ruleRoutine )
+                    	    {
+                    	    // InternalFormalML.g:6898:6: (lv_routine_95_0= ruleRoutine )
+                    	    // InternalFormalML.g:6899:7: lv_routine_95_0= ruleRoutine
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getStatemachineAccess().getRoutineRoutineParserRuleCall_10_1_0_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_69);
+                    	    lv_routine_95_0=ruleRoutine();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"routine",
+                    	      								lv_routine_95_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:6917:5: ( (lv_procedure_96_0= ruleProcedure ) )
+                    	    {
+                    	    // InternalFormalML.g:6917:5: ( (lv_procedure_96_0= ruleProcedure ) )
+                    	    // InternalFormalML.g:6918:6: (lv_procedure_96_0= ruleProcedure )
+                    	    {
+                    	    // InternalFormalML.g:6918:6: (lv_procedure_96_0= ruleProcedure )
+                    	    // InternalFormalML.g:6919:7: lv_procedure_96_0= ruleProcedure
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getStatemachineAccess().getProcedureProcedureParserRuleCall_10_1_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_69);
+                    	    lv_procedure_96_0=ruleProcedure();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"procedure",
+                    	      								lv_procedure_96_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt165 >= 1 ) break loop165;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(165, input);
+                                throw eee;
+                        }
+                        cnt165++;
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:6938:3: ( ( (lv_region_97_0= ruleStatemachineRegion ) )+ | ( (lv_region_98_0= ruleStatemachineRegionLite ) ) )
+            int alt168=2;
+            int LA168_0 = input.LA(1);
+
+            if ( (LA168_0==51||(LA168_0>=73 && LA168_0<=75)) ) {
+                alt168=1;
+            }
+            else if ( (LA168_0==76||LA168_0==86||(LA168_0>=88 && LA168_0<=91)) ) {
+                alt168=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 168, 0, input);
+
+                throw nvae;
+            }
+            switch (alt168) {
+                case 1 :
+                    // InternalFormalML.g:6939:4: ( (lv_region_97_0= ruleStatemachineRegion ) )+
+                    {
+                    // InternalFormalML.g:6939:4: ( (lv_region_97_0= ruleStatemachineRegion ) )+
+                    int cnt167=0;
+                    loop167:
+                    do {
+                        int alt167=2;
+                        int LA167_0 = input.LA(1);
+
+                        if ( (LA167_0==51||(LA167_0>=73 && LA167_0<=75)) ) {
+                            alt167=1;
+                        }
+
+
+                        switch (alt167) {
+                    	case 1 :
+                    	    // InternalFormalML.g:6940:5: (lv_region_97_0= ruleStatemachineRegion )
+                    	    {
+                    	    // InternalFormalML.g:6940:5: (lv_region_97_0= ruleStatemachineRegion )
+                    	    // InternalFormalML.g:6941:6: lv_region_97_0= ruleStatemachineRegion
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newCompositeNode(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionParserRuleCall_11_0_0());
+                    	      					
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_71);
+                    	    lv_region_97_0=ruleStatemachineRegion();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						if (current==null) {
+                    	      							current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                    	      						}
+                    	      						add(
+                    	      							current,
+                    	      							"region",
+                    	      							lv_region_97_0,
+                    	      							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    if ( cnt167 >= 1 ) break loop167;
+                    	    if (state.backtracking>0) {state.failed=true; return current;}
+                                EarlyExitException eee =
+                                    new EarlyExitException(167, input);
+                                throw eee;
+                        }
+                        cnt167++;
+                    } while (true);
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:6959:4: ( (lv_region_98_0= ruleStatemachineRegionLite ) )
+                    {
+                    // InternalFormalML.g:6959:4: ( (lv_region_98_0= ruleStatemachineRegionLite ) )
+                    // InternalFormalML.g:6960:5: (lv_region_98_0= ruleStatemachineRegionLite )
+                    {
+                    // InternalFormalML.g:6960:5: (lv_region_98_0= ruleStatemachineRegionLite )
+                    // InternalFormalML.g:6961:6: lv_region_98_0= ruleStatemachineRegionLite
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getStatemachineAccess().getRegionStatemachineRegionLiteParserRuleCall_11_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_72);
+                    lv_region_98_0=ruleStatemachineRegionLite();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getStatemachineRule());
+                      						}
+                      						add(
+                      							current,
+                      							"region",
+                      							lv_region_98_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:6979:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:6980:4: ( ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:6980:4: ( ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* ) )
+            // InternalFormalML.g:6981:5: ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+            // InternalFormalML.g:6984:5: ( ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )* )
+            // InternalFormalML.g:6985:6: ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:6985:6: ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )*
+            loop169:
+            do {
+                int alt169=3;
+                int LA169_0 = input.LA(1);
+
+                if ( LA169_0 == 69 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0) ) {
+                    alt169=1;
+                }
+                else if ( LA169_0 == 95 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1) ) {
+                    alt169=2;
+                }
+
+
+                switch (alt169) {
+            	case 1 :
+            	    // InternalFormalML.g:6986:4: ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:6986:4: ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) )
+            	    // InternalFormalML.g:6987:5: {...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0)");
+            	    }
+            	    // InternalFormalML.g:6987:110: ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) )
+            	    // InternalFormalML.g:6988:6: ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0);
+            	    // InternalFormalML.g:6991:9: ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) )
+            	    // InternalFormalML.g:6991:10: {...}? => ( (lv_execution_100_0= ruleModelOfExecution ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "true");
+            	    }
+            	    // InternalFormalML.g:6991:19: ( (lv_execution_100_0= ruleModelOfExecution ) )
+            	    // InternalFormalML.g:6991:20: (lv_execution_100_0= ruleModelOfExecution )
+            	    {
+            	    // InternalFormalML.g:6991:20: (lv_execution_100_0= ruleModelOfExecution )
+            	    // InternalFormalML.g:6992:10: lv_execution_100_0= ruleModelOfExecution
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getStatemachineAccess().getExecutionModelOfExecutionParserRuleCall_12_0_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    lv_execution_100_0=ruleModelOfExecution();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"execution",
+            	      											lv_execution_100_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfExecution");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:7014:4: ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:7014:4: ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) )
+            	    // InternalFormalML.g:7015:5: {...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1)");
+            	    }
+            	    // InternalFormalML.g:7015:110: ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) )
+            	    // InternalFormalML.g:7016:6: ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1);
+            	    // InternalFormalML.g:7019:9: ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) )
+            	    // InternalFormalML.g:7019:10: {...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleStatemachine", "true");
+            	    }
+            	    // InternalFormalML.g:7019:19: ( (lv_interaction_101_0= ruleModelOfInteraction ) )
+            	    // InternalFormalML.g:7019:20: (lv_interaction_101_0= ruleModelOfInteraction )
+            	    {
+            	    // InternalFormalML.g:7019:20: (lv_interaction_101_0= ruleModelOfInteraction )
+            	    // InternalFormalML.g:7020:10: lv_interaction_101_0= ruleModelOfInteraction
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getStatemachineAccess().getInteractionModelOfInteractionParserRuleCall_12_1_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_72);
+            	    lv_interaction_101_0=ruleModelOfInteraction();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getStatemachineRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"interaction",
+            	      											lv_interaction_101_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.ModelOfInteraction");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop169;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getStatemachineAccess().getUnorderedGroup_12());
+
+            }
+
+            otherlv_102=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_102, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_13());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachine"
+
+
+    // $ANTLR start "entryRuleStatemachineRegion"
+    // InternalFormalML.g:7060:1: entryRuleStatemachineRegion returns [EObject current=null] : iv_ruleStatemachineRegion= ruleStatemachineRegion EOF ;
+    public final EObject entryRuleStatemachineRegion() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineRegion = null;
+
+
+        try {
+            // InternalFormalML.g:7060:59: (iv_ruleStatemachineRegion= ruleStatemachineRegion EOF )
+            // InternalFormalML.g:7061:2: iv_ruleStatemachineRegion= ruleStatemachineRegion EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineRegionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleStatemachineRegion=ruleStatemachineRegion();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineRegion; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineRegion"
+
+
+    // $ANTLR start "ruleStatemachineRegion"
+    // InternalFormalML.g:7067:1: ruleStatemachineRegion returns [EObject current=null] : ( () ( (otherlv_1= '@region:' | otherlv_2= '@statemachine:' ) | ( (otherlv_3= '@region<' | otherlv_4= '@statemachine<' ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= '>:' ) ) ( ( (lv_vertex_8_0= ruleState ) ) | ( (lv_vertex_9_0= rulePseudostate ) ) )+ ) ;
+    public final EObject ruleStatemachineRegion() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_7=null;
+        AntlrDatatypeRuleToken lv_name_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_6_0 = null;
+
+        EObject lv_vertex_8_0 = null;
+
+        EObject lv_vertex_9_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:7073:2: ( ( () ( (otherlv_1= '@region:' | otherlv_2= '@statemachine:' ) | ( (otherlv_3= '@region<' | otherlv_4= '@statemachine<' ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= '>:' ) ) ( ( (lv_vertex_8_0= ruleState ) ) | ( (lv_vertex_9_0= rulePseudostate ) ) )+ ) )
+            // InternalFormalML.g:7074:2: ( () ( (otherlv_1= '@region:' | otherlv_2= '@statemachine:' ) | ( (otherlv_3= '@region<' | otherlv_4= '@statemachine<' ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= '>:' ) ) ( ( (lv_vertex_8_0= ruleState ) ) | ( (lv_vertex_9_0= rulePseudostate ) ) )+ )
+            {
+            // InternalFormalML.g:7074:2: ( () ( (otherlv_1= '@region:' | otherlv_2= '@statemachine:' ) | ( (otherlv_3= '@region<' | otherlv_4= '@statemachine<' ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= '>:' ) ) ( ( (lv_vertex_8_0= ruleState ) ) | ( (lv_vertex_9_0= rulePseudostate ) ) )+ )
+            // InternalFormalML.g:7075:3: () ( (otherlv_1= '@region:' | otherlv_2= '@statemachine:' ) | ( (otherlv_3= '@region<' | otherlv_4= '@statemachine<' ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= '>:' ) ) ( ( (lv_vertex_8_0= ruleState ) ) | ( (lv_vertex_9_0= rulePseudostate ) ) )+
+            {
+            // InternalFormalML.g:7075:3: ()
+            // InternalFormalML.g:7076:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getStatemachineRegionAccess().getRegionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:7085:3: ( (otherlv_1= '@region:' | otherlv_2= '@statemachine:' ) | ( (otherlv_3= '@region<' | otherlv_4= '@statemachine<' ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= '>:' ) )
+            int alt173=2;
+            int LA173_0 = input.LA(1);
+
+            if ( (LA173_0==51||LA173_0==73) ) {
+                alt173=1;
+            }
+            else if ( ((LA173_0>=74 && LA173_0<=75)) ) {
+                alt173=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 173, 0, input);
+
+                throw nvae;
+            }
+            switch (alt173) {
+                case 1 :
+                    // InternalFormalML.g:7086:4: (otherlv_1= '@region:' | otherlv_2= '@statemachine:' )
+                    {
+                    // InternalFormalML.g:7086:4: (otherlv_1= '@region:' | otherlv_2= '@statemachine:' )
+                    int alt170=2;
+                    int LA170_0 = input.LA(1);
+
+                    if ( (LA170_0==73) ) {
+                        alt170=1;
+                    }
+                    else if ( (LA170_0==51) ) {
+                        alt170=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 170, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt170) {
+                        case 1 :
+                            // InternalFormalML.g:7087:5: otherlv_1= '@region:'
+                            {
+                            otherlv_1=(Token)match(input,73,FollowSets000.FOLLOW_73); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_1, grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_0_0());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:7092:5: otherlv_2= '@statemachine:'
+                            {
+                            otherlv_2=(Token)match(input,51,FollowSets000.FOLLOW_73); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_2, grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_0_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7098:4: ( (otherlv_3= '@region<' | otherlv_4= '@statemachine<' ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= '>:' )
+                    {
+                    // InternalFormalML.g:7098:4: ( (otherlv_3= '@region<' | otherlv_4= '@statemachine<' ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= '>:' )
+                    // InternalFormalML.g:7099:5: (otherlv_3= '@region<' | otherlv_4= '@statemachine<' ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= '>:'
+                    {
+                    // InternalFormalML.g:7099:5: (otherlv_3= '@region<' | otherlv_4= '@statemachine<' )
+                    int alt171=2;
+                    int LA171_0 = input.LA(1);
+
+                    if ( (LA171_0==74) ) {
+                        alt171=1;
+                    }
+                    else if ( (LA171_0==75) ) {
+                        alt171=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 171, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt171) {
+                        case 1 :
+                            // InternalFormalML.g:7100:6: otherlv_3= '@region<'
+                            {
+                            otherlv_3=(Token)match(input,74,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_3, grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_1_0_0());
+                              					
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:7105:6: otherlv_4= '@statemachine<'
+                            {
+                            otherlv_4=(Token)match(input,75,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_4, grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_1_0_1());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:7110:5: ( (lv_name_5_0= ruleESIdentifier ) )
+                    // InternalFormalML.g:7111:6: (lv_name_5_0= ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:7111:6: (lv_name_5_0= ruleESIdentifier )
+                    // InternalFormalML.g:7112:7: lv_name_5_0= ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getStatemachineRegionAccess().getNameESIdentifierParserRuleCall_1_1_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_74);
+                    lv_name_5_0=ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
+                      							}
+                      							set(
+                      								current,
+                      								"name",
+                      								lv_name_5_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:7129:5: ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )?
+                    int alt172=2;
+                    int LA172_0 = input.LA(1);
+
+                    if ( (LA172_0==RULE_STRING) ) {
+                        alt172=1;
+                    }
+                    switch (alt172) {
+                        case 1 :
+                            // InternalFormalML.g:7130:6: (lv_unrestrictedName_6_0= ruleUnrestrictedName )
+                            {
+                            // InternalFormalML.g:7130:6: (lv_unrestrictedName_6_0= ruleUnrestrictedName )
+                            // InternalFormalML.g:7131:7: lv_unrestrictedName_6_0= ruleUnrestrictedName
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getStatemachineRegionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_1_2_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_6);
+                            lv_unrestrictedName_6_0=ruleUnrestrictedName();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
+                              							}
+                              							set(
+                              								current,
+                              								"unrestrictedName",
+                              								lv_unrestrictedName_6_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_7=(Token)match(input,17,FollowSets000.FOLLOW_73); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_7, grammarAccess.getStatemachineRegionAccess().getGreaterThanSignColonKeyword_1_1_3());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:7154:3: ( ( (lv_vertex_8_0= ruleState ) ) | ( (lv_vertex_9_0= rulePseudostate ) ) )+
+            int cnt174=0;
+            loop174:
+            do {
+                int alt174=3;
+                switch ( input.LA(1) ) {
+                case 76:
+                    {
+                    int LA174_2 = input.LA(2);
+
+                    if ( (LA174_2==16) ) {
+                        switch ( input.LA(3) ) {
+                        case 34:
+                            {
+                            int LA174_6 = input.LA(4);
+
+                            if ( ((LA174_6>=35 && LA174_6<=36)||(LA174_6>=84 && LA174_6<=85)||LA174_6==87) ) {
+                                alt174=1;
+                            }
+                            else if ( (LA174_6==64||LA174_6==127||(LA174_6>=245 && LA174_6<=253)) ) {
+                                alt174=2;
+                            }
+
+
+                            }
+                            break;
+                        case 35:
+                        case 36:
+                        case 84:
+                        case 85:
+                        case 87:
+                            {
+                            alt174=1;
+                            }
+                            break;
+                        case 64:
+                        case 127:
+                        case 245:
+                        case 246:
+                        case 247:
+                        case 248:
+                        case 249:
+                        case 250:
+                        case 251:
+                        case 252:
+                        case 253:
+                            {
+                            alt174=2;
+                            }
+                            break;
+
+                        }
+
+                    }
+                    else if ( (LA174_2==RULE_XLIA_ID) ) {
+                        alt174=1;
+                    }
+
+
+                    }
+                    break;
+                case 86:
+                case 88:
+                    {
+                    alt174=1;
+                    }
+                    break;
+                case 89:
+                case 90:
+                case 91:
+                    {
+                    alt174=2;
+                    }
+                    break;
+
+                }
+
+                switch (alt174) {
+            	case 1 :
+            	    // InternalFormalML.g:7155:4: ( (lv_vertex_8_0= ruleState ) )
+            	    {
+            	    // InternalFormalML.g:7155:4: ( (lv_vertex_8_0= ruleState ) )
+            	    // InternalFormalML.g:7156:5: (lv_vertex_8_0= ruleState )
+            	    {
+            	    // InternalFormalML.g:7156:5: (lv_vertex_8_0= ruleState )
+            	    // InternalFormalML.g:7157:6: lv_vertex_8_0= ruleState
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getStatemachineRegionAccess().getVertexStateParserRuleCall_2_0_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_75);
+            	    lv_vertex_8_0=ruleState();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"vertex",
+            	      							lv_vertex_8_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.State");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:7175:4: ( (lv_vertex_9_0= rulePseudostate ) )
+            	    {
+            	    // InternalFormalML.g:7175:4: ( (lv_vertex_9_0= rulePseudostate ) )
+            	    // InternalFormalML.g:7176:5: (lv_vertex_9_0= rulePseudostate )
+            	    {
+            	    // InternalFormalML.g:7176:5: (lv_vertex_9_0= rulePseudostate )
+            	    // InternalFormalML.g:7177:6: lv_vertex_9_0= rulePseudostate
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getStatemachineRegionAccess().getVertexPseudostateParserRuleCall_2_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_75);
+            	    lv_vertex_9_0=rulePseudostate();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getStatemachineRegionRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"vertex",
+            	      							lv_vertex_9_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Pseudostate");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt174 >= 1 ) break loop174;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(174, input);
+                        throw eee;
+                }
+                cnt174++;
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineRegion"
+
+
+    // $ANTLR start "entryRuleStatemachineRegionLite"
+    // InternalFormalML.g:7199:1: entryRuleStatemachineRegionLite returns [EObject current=null] : iv_ruleStatemachineRegionLite= ruleStatemachineRegionLite EOF ;
+    public final EObject entryRuleStatemachineRegionLite() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatemachineRegionLite = null;
+
+
+        try {
+            // InternalFormalML.g:7199:63: (iv_ruleStatemachineRegionLite= ruleStatemachineRegionLite EOF )
+            // InternalFormalML.g:7200:2: iv_ruleStatemachineRegionLite= ruleStatemachineRegionLite EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatemachineRegionLiteRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleStatemachineRegionLite=ruleStatemachineRegionLite();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatemachineRegionLite; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatemachineRegionLite"
+
+
+    // $ANTLR start "ruleStatemachineRegionLite"
+    // InternalFormalML.g:7206:1: ruleStatemachineRegionLite returns [EObject current=null] : ( ( (lv_vertex_0_0= ruleState ) ) | ( (lv_vertex_1_0= rulePseudostate ) ) )+ ;
+    public final EObject ruleStatemachineRegionLite() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_vertex_0_0 = null;
+
+        EObject lv_vertex_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:7212:2: ( ( ( (lv_vertex_0_0= ruleState ) ) | ( (lv_vertex_1_0= rulePseudostate ) ) )+ )
+            // InternalFormalML.g:7213:2: ( ( (lv_vertex_0_0= ruleState ) ) | ( (lv_vertex_1_0= rulePseudostate ) ) )+
+            {
+            // InternalFormalML.g:7213:2: ( ( (lv_vertex_0_0= ruleState ) ) | ( (lv_vertex_1_0= rulePseudostate ) ) )+
+            int cnt175=0;
+            loop175:
+            do {
+                int alt175=3;
+                switch ( input.LA(1) ) {
+                case 76:
+                    {
+                    int LA175_2 = input.LA(2);
+
+                    if ( (LA175_2==16) ) {
+                        switch ( input.LA(3) ) {
+                        case 34:
+                            {
+                            int LA175_6 = input.LA(4);
+
+                            if ( (LA175_6==64||LA175_6==127||(LA175_6>=245 && LA175_6<=253)) ) {
+                                alt175=2;
+                            }
+                            else if ( ((LA175_6>=35 && LA175_6<=36)||(LA175_6>=84 && LA175_6<=85)||LA175_6==87) ) {
+                                alt175=1;
+                            }
+
+
+                            }
+                            break;
+                        case 35:
+                        case 36:
+                        case 84:
+                        case 85:
+                        case 87:
+                            {
+                            alt175=1;
+                            }
+                            break;
+                        case 64:
+                        case 127:
+                        case 245:
+                        case 246:
+                        case 247:
+                        case 248:
+                        case 249:
+                        case 250:
+                        case 251:
+                        case 252:
+                        case 253:
+                            {
+                            alt175=2;
+                            }
+                            break;
+
+                        }
+
+                    }
+                    else if ( (LA175_2==RULE_XLIA_ID) ) {
+                        alt175=1;
+                    }
+
+
+                    }
+                    break;
+                case 86:
+                case 88:
+                    {
+                    alt175=1;
+                    }
+                    break;
+                case 89:
+                case 90:
+                case 91:
+                    {
+                    alt175=2;
+                    }
+                    break;
+
+                }
+
+                switch (alt175) {
+            	case 1 :
+            	    // InternalFormalML.g:7214:3: ( (lv_vertex_0_0= ruleState ) )
+            	    {
+            	    // InternalFormalML.g:7214:3: ( (lv_vertex_0_0= ruleState ) )
+            	    // InternalFormalML.g:7215:4: (lv_vertex_0_0= ruleState )
+            	    {
+            	    // InternalFormalML.g:7215:4: (lv_vertex_0_0= ruleState )
+            	    // InternalFormalML.g:7216:5: lv_vertex_0_0= ruleState
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getStatemachineRegionLiteAccess().getVertexStateParserRuleCall_0_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_75);
+            	    lv_vertex_0_0=ruleState();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getStatemachineRegionLiteRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"vertex",
+            	      						lv_vertex_0_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.State");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:7234:3: ( (lv_vertex_1_0= rulePseudostate ) )
+            	    {
+            	    // InternalFormalML.g:7234:3: ( (lv_vertex_1_0= rulePseudostate ) )
+            	    // InternalFormalML.g:7235:4: (lv_vertex_1_0= rulePseudostate )
+            	    {
+            	    // InternalFormalML.g:7235:4: (lv_vertex_1_0= rulePseudostate )
+            	    // InternalFormalML.g:7236:5: lv_vertex_1_0= rulePseudostate
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getStatemachineRegionLiteAccess().getVertexPseudostateParserRuleCall_1_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_75);
+            	    lv_vertex_1_0=rulePseudostate();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getStatemachineRegionLiteRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"vertex",
+            	      						lv_vertex_1_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Pseudostate");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt175 >= 1 ) break loop175;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(175, input);
+                        throw eee;
+                }
+                cnt175++;
+            } while (true);
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatemachineRegionLite"
+
+
+    // $ANTLR start "entryRuleState"
+    // InternalFormalML.g:7257:1: entryRuleState returns [EObject current=null] : iv_ruleState= ruleState EOF ;
+    public final EObject entryRuleState() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleState = null;
+
+
+        try {
+            // InternalFormalML.g:7257:46: (iv_ruleState= ruleState EOF )
+            // InternalFormalML.g:7258:2: iv_ruleState= ruleState EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleState=ruleState();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleState; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleState"
+
+
+    // $ANTLR start "ruleState"
+    // InternalFormalML.g:7264:1: ruleState returns [EObject current=null] : (this_CompositeState_0= ruleCompositeState | this_StartState_1= ruleStartState | this_SimpleState_2= ruleSimpleState | this_FinalState_3= ruleFinalState ) ;
+    public final EObject ruleState() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_CompositeState_0 = null;
+
+        EObject this_StartState_1 = null;
+
+        EObject this_SimpleState_2 = null;
+
+        EObject this_FinalState_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:7270:2: ( (this_CompositeState_0= ruleCompositeState | this_StartState_1= ruleStartState | this_SimpleState_2= ruleSimpleState | this_FinalState_3= ruleFinalState ) )
+            // InternalFormalML.g:7271:2: (this_CompositeState_0= ruleCompositeState | this_StartState_1= ruleStartState | this_SimpleState_2= ruleSimpleState | this_FinalState_3= ruleFinalState )
+            {
+            // InternalFormalML.g:7271:2: (this_CompositeState_0= ruleCompositeState | this_StartState_1= ruleStartState | this_SimpleState_2= ruleSimpleState | this_FinalState_3= ruleFinalState )
+            int alt176=4;
+            switch ( input.LA(1) ) {
+            case 76:
+                {
+                int LA176_1 = input.LA(2);
+
+                if ( (LA176_1==16) ) {
+                    switch ( input.LA(3) ) {
+                    case 34:
+                        {
+                        switch ( input.LA(4) ) {
+                        case 35:
+                        case 36:
+                            {
+                            alt176=1;
+                            }
+                            break;
+                        case 84:
+                            {
+                            alt176=3;
+                            }
+                            break;
+                        case 85:
+                            {
+                            alt176=2;
+                            }
+                            break;
+                        case 87:
+                            {
+                            alt176=4;
+                            }
+                            break;
+                        default:
+                            if (state.backtracking>0) {state.failed=true; return current;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 176, 6, input);
+
+                            throw nvae;
+                        }
+
+                        }
+                        break;
+                    case 35:
+                    case 36:
+                        {
+                        alt176=1;
+                        }
+                        break;
+                    case 84:
+                        {
+                        alt176=3;
+                        }
+                        break;
+                    case 85:
+                        {
+                        alt176=2;
+                        }
+                        break;
+                    case 87:
+                        {
+                        alt176=4;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 176, 4, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else if ( (LA176_1==RULE_XLIA_ID) ) {
+                    alt176=3;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 176, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 86:
+                {
+                alt176=2;
+                }
+                break;
+            case 88:
+                {
+                alt176=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 176, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt176) {
+                case 1 :
+                    // InternalFormalML.g:7272:3: this_CompositeState_0= ruleCompositeState
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStateAccess().getCompositeStateParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_CompositeState_0=ruleCompositeState();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_CompositeState_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7284:3: this_StartState_1= ruleStartState
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStateAccess().getStartStateParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_StartState_1=ruleStartState();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_StartState_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7296:3: this_SimpleState_2= ruleSimpleState
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStateAccess().getSimpleStateParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_SimpleState_2=ruleSimpleState();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_SimpleState_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7308:3: this_FinalState_3= ruleFinalState
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStateAccess().getFinalStateParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_FinalState_3=ruleFinalState();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_FinalState_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleState"
+
+
+    // $ANTLR start "entryRuleCompositeState"
+    // InternalFormalML.g:7323:1: entryRuleCompositeState returns [EObject current=null] : iv_ruleCompositeState= ruleCompositeState EOF ;
+    public final EObject entryRuleCompositeState() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleCompositeState = null;
+
+
+        try {
+            // InternalFormalML.g:7323:55: (iv_ruleCompositeState= ruleCompositeState EOF )
+            // InternalFormalML.g:7324:2: iv_ruleCompositeState= ruleCompositeState EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getCompositeStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleCompositeState=ruleCompositeState();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleCompositeState; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleCompositeState"
+
+
+    // $ANTLR start "ruleCompositeState"
+    // InternalFormalML.g:7330:1: ruleCompositeState returns [EObject current=null] : ( () ( (lv_composite_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'or' | ( (lv_orthogonal_5_0= 'and' ) ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) ) otherlv_18= '}' ) | otherlv_19= ';' ) ) ;
+    public final EObject ruleCompositeState() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_composite_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token lv_orthogonal_5_0=null;
+        Token otherlv_6=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_18=null;
+        Token otherlv_19=null;
+        AntlrDatatypeRuleToken lv_name_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_region_10_0 = null;
+
+        EObject lv_moe_12_0 = null;
+
+        EObject lv_transition_14_0 = null;
+
+        EObject lv_region_15_0 = null;
+
+        EObject lv_transition_16_0 = null;
+
+        EObject lv_moe_17_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:7336:2: ( ( () ( (lv_composite_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'or' | ( (lv_orthogonal_5_0= 'and' ) ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) ) otherlv_18= '}' ) | otherlv_19= ';' ) ) )
+            // InternalFormalML.g:7337:2: ( () ( (lv_composite_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'or' | ( (lv_orthogonal_5_0= 'and' ) ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) ) otherlv_18= '}' ) | otherlv_19= ';' ) )
+            {
+            // InternalFormalML.g:7337:2: ( () ( (lv_composite_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'or' | ( (lv_orthogonal_5_0= 'and' ) ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) ) otherlv_18= '}' ) | otherlv_19= ';' ) )
+            // InternalFormalML.g:7338:3: () ( (lv_composite_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? (otherlv_4= 'or' | ( (lv_orthogonal_5_0= 'and' ) ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) ) otherlv_18= '}' ) | otherlv_19= ';' )
+            {
+            // InternalFormalML.g:7338:3: ()
+            // InternalFormalML.g:7339:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getCompositeStateAccess().getStateAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:7348:3: ( (lv_composite_1_0= 'state' ) )
+            // InternalFormalML.g:7349:4: (lv_composite_1_0= 'state' )
+            {
+            // InternalFormalML.g:7349:4: (lv_composite_1_0= 'state' )
+            // InternalFormalML.g:7350:5: lv_composite_1_0= 'state'
+            {
+            lv_composite_1_0=(Token)match(input,76,FollowSets000.FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_composite_1_0, grammarAccess.getCompositeStateAccess().getCompositeStateKeyword_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getCompositeStateRule());
+              					}
+              					setWithLastConsumed(current, "composite", true, "state");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_21); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getCompositeStateAccess().getLessThanSignKeyword_2());
+              		
+            }
+            // InternalFormalML.g:7366:3: (otherlv_3= 'moc:' )?
+            int alt177=2;
+            int LA177_0 = input.LA(1);
+
+            if ( (LA177_0==34) ) {
+                alt177=1;
+            }
+            switch (alt177) {
+                case 1 :
+                    // InternalFormalML.g:7367:4: otherlv_3= 'moc:'
+                    {
+                    otherlv_3=(Token)match(input,34,FollowSets000.FOLLOW_22); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getCompositeStateAccess().getMocKeyword_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:7372:3: (otherlv_4= 'or' | ( (lv_orthogonal_5_0= 'and' ) ) )
+            int alt178=2;
+            int LA178_0 = input.LA(1);
+
+            if ( (LA178_0==36) ) {
+                alt178=1;
+            }
+            else if ( (LA178_0==35) ) {
+                alt178=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 178, 0, input);
+
+                throw nvae;
+            }
+            switch (alt178) {
+                case 1 :
+                    // InternalFormalML.g:7373:4: otherlv_4= 'or'
+                    {
+                    otherlv_4=(Token)match(input,36,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getCompositeStateAccess().getOrKeyword_4_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7378:4: ( (lv_orthogonal_5_0= 'and' ) )
+                    {
+                    // InternalFormalML.g:7378:4: ( (lv_orthogonal_5_0= 'and' ) )
+                    // InternalFormalML.g:7379:5: (lv_orthogonal_5_0= 'and' )
+                    {
+                    // InternalFormalML.g:7379:5: (lv_orthogonal_5_0= 'and' )
+                    // InternalFormalML.g:7380:6: lv_orthogonal_5_0= 'and'
+                    {
+                    lv_orthogonal_5_0=(Token)match(input,35,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_orthogonal_5_0, grammarAccess.getCompositeStateAccess().getOrthogonalAndKeyword_4_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getCompositeStateRule());
+                      						}
+                      						setWithLastConsumed(current, "orthogonal", true, "and");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getCompositeStateAccess().getGreaterThanSignKeyword_5());
+              		
+            }
+            // InternalFormalML.g:7397:3: ( (lv_name_7_0= ruleESIdentifier ) )
+            // InternalFormalML.g:7398:4: (lv_name_7_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:7398:4: (lv_name_7_0= ruleESIdentifier )
+            // InternalFormalML.g:7399:5: lv_name_7_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCompositeStateAccess().getNameESIdentifierParserRuleCall_6_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_76);
+            lv_name_7_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:7416:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt179=2;
+            int LA179_0 = input.LA(1);
+
+            if ( (LA179_0==RULE_STRING) ) {
+                alt179=1;
+            }
+            switch (alt179) {
+                case 1 :
+                    // InternalFormalML.g:7417:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:7417:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:7418:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getCompositeStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:7435:3: ( (otherlv_9= '{' ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) ) otherlv_18= '}' ) | otherlv_19= ';' )
+            int alt185=2;
+            int LA185_0 = input.LA(1);
+
+            if ( (LA185_0==22) ) {
+                alt185=1;
+            }
+            else if ( (LA185_0==25) ) {
+                alt185=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 185, 0, input);
+
+                throw nvae;
+            }
+            switch (alt185) {
+                case 1 :
+                    // InternalFormalML.g:7436:4: (otherlv_9= '{' ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) ) otherlv_18= '}' )
+                    {
+                    // InternalFormalML.g:7436:4: (otherlv_9= '{' ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) ) otherlv_18= '}' )
+                    // InternalFormalML.g:7437:5: otherlv_9= '{' ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) ) otherlv_18= '}'
+                    {
+                    otherlv_9=(Token)match(input,22,FollowSets000.FOLLOW_78); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_9, grammarAccess.getCompositeStateAccess().getLeftCurlyBracketKeyword_8_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:7441:5: ( ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+ | ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* ) )
+                    int alt184=2;
+                    int LA184_0 = input.LA(1);
+
+                    if ( (LA184_0==51||LA184_0==69||(LA184_0>=73 && LA184_0<=75)||LA184_0==77) ) {
+                        alt184=1;
+                    }
+                    else if ( (LA184_0==76||LA184_0==86||(LA184_0>=88 && LA184_0<=91)) ) {
+                        alt184=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 184, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt184) {
+                        case 1 :
+                            // InternalFormalML.g:7442:6: ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+
+                            {
+                            // InternalFormalML.g:7442:6: ( ( (lv_region_10_0= ruleStatemachineRegion ) ) | (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* ) | (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* ) )+
+                            int cnt182=0;
+                            loop182:
+                            do {
+                                int alt182=4;
+                                switch ( input.LA(1) ) {
+                                case 51:
+                                case 73:
+                                case 74:
+                                case 75:
+                                    {
+                                    alt182=1;
+                                    }
+                                    break;
+                                case 69:
+                                    {
+                                    alt182=2;
+                                    }
+                                    break;
+                                case 77:
+                                    {
+                                    alt182=3;
+                                    }
+                                    break;
+
+                                }
+
+                                switch (alt182) {
+                            	case 1 :
+                            	    // InternalFormalML.g:7443:7: ( (lv_region_10_0= ruleStatemachineRegion ) )
+                            	    {
+                            	    // InternalFormalML.g:7443:7: ( (lv_region_10_0= ruleStatemachineRegion ) )
+                            	    // InternalFormalML.g:7444:8: (lv_region_10_0= ruleStatemachineRegion )
+                            	    {
+                            	    // InternalFormalML.g:7444:8: (lv_region_10_0= ruleStatemachineRegion )
+                            	    // InternalFormalML.g:7445:9: lv_region_10_0= ruleStatemachineRegion
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FollowSets000.FOLLOW_79);
+                            	    lv_region_10_0=ruleStatemachineRegion();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									if (current==null) {
+                            	      										current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+                            	      									}
+                            	      									add(
+                            	      										current,
+                            	      										"region",
+                            	      										lv_region_10_0,
+                            	      										"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
+                            	      									afterParserOrEnumRuleCall();
+                            	      								
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+                            	case 2 :
+                            	    // InternalFormalML.g:7463:7: (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* )
+                            	    {
+                            	    // InternalFormalML.g:7463:7: (otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )* )
+                            	    // InternalFormalML.g:7464:8: otherlv_11= '@moe:' ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )*
+                            	    {
+                            	    otherlv_11=(Token)match(input,69,FollowSets000.FOLLOW_80); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newLeafNode(otherlv_11, grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0());
+                            	      							
+                            	    }
+                            	    // InternalFormalML.g:7468:8: ( (lv_moe_12_0= rulemoeCompositeStateRoutines ) )*
+                            	    loop180:
+                            	    do {
+                            	        int alt180=2;
+                            	        int LA180_0 = input.LA(1);
+
+                            	        if ( ((LA180_0>=70 && LA180_0<=71)||(LA180_0>=78 && LA180_0<=83)) ) {
+                            	            alt180=1;
+                            	        }
+
+
+                            	        switch (alt180) {
+                            	    	case 1 :
+                            	    	    // InternalFormalML.g:7469:9: (lv_moe_12_0= rulemoeCompositeStateRoutines )
+                            	    	    {
+                            	    	    // InternalFormalML.g:7469:9: (lv_moe_12_0= rulemoeCompositeStateRoutines )
+                            	    	    // InternalFormalML.g:7470:10: lv_moe_12_0= rulemoeCompositeStateRoutines
+                            	    	    {
+                            	    	    if ( state.backtracking==0 ) {
+
+                            	    	      										newCompositeNode(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0());
+                            	    	      									
+                            	    	    }
+                            	    	    pushFollow(FollowSets000.FOLLOW_80);
+                            	    	    lv_moe_12_0=rulemoeCompositeStateRoutines();
+
+                            	    	    state._fsp--;
+                            	    	    if (state.failed) return current;
+                            	    	    if ( state.backtracking==0 ) {
+
+                            	    	      										if (current==null) {
+                            	    	      											current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+                            	    	      										}
+                            	    	      										add(
+                            	    	      											current,
+                            	    	      											"moe",
+                            	    	      											lv_moe_12_0,
+                            	    	      											"org.eclipse.efm.formalml.xtext.FormalML.moeCompositeStateRoutines");
+                            	    	      										afterParserOrEnumRuleCall();
+                            	    	      									
+                            	    	    }
+
+                            	    	    }
+
+
+                            	    	    }
+                            	    	    break;
+
+                            	    	default :
+                            	    	    break loop180;
+                            	        }
+                            	    } while (true);
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+                            	case 3 :
+                            	    // InternalFormalML.g:7489:7: (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* )
+                            	    {
+                            	    // InternalFormalML.g:7489:7: (otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )* )
+                            	    // InternalFormalML.g:7490:8: otherlv_13= '@transition:' ( (lv_transition_14_0= ruleTransition ) )*
+                            	    {
+                            	    otherlv_13=(Token)match(input,77,FollowSets000.FOLLOW_81); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      								newLeafNode(otherlv_13, grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0());
+                            	      							
+                            	    }
+                            	    // InternalFormalML.g:7494:8: ( (lv_transition_14_0= ruleTransition ) )*
+                            	    loop181:
+                            	    do {
+                            	        int alt181=2;
+                            	        int LA181_0 = input.LA(1);
+
+                            	        if ( (LA181_0==131||LA181_0==140) ) {
+                            	            alt181=1;
+                            	        }
+
+
+                            	        switch (alt181) {
+                            	    	case 1 :
+                            	    	    // InternalFormalML.g:7495:9: (lv_transition_14_0= ruleTransition )
+                            	    	    {
+                            	    	    // InternalFormalML.g:7495:9: (lv_transition_14_0= ruleTransition )
+                            	    	    // InternalFormalML.g:7496:10: lv_transition_14_0= ruleTransition
+                            	    	    {
+                            	    	    if ( state.backtracking==0 ) {
+
+                            	    	      										newCompositeNode(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_0_2_1_0());
+                            	    	      									
+                            	    	    }
+                            	    	    pushFollow(FollowSets000.FOLLOW_81);
+                            	    	    lv_transition_14_0=ruleTransition();
+
+                            	    	    state._fsp--;
+                            	    	    if (state.failed) return current;
+                            	    	    if ( state.backtracking==0 ) {
+
+                            	    	      										if (current==null) {
+                            	    	      											current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+                            	    	      										}
+                            	    	      										add(
+                            	    	      											current,
+                            	    	      											"transition",
+                            	    	      											lv_transition_14_0,
+                            	    	      											"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+                            	    	      										afterParserOrEnumRuleCall();
+                            	    	      									
+                            	    	    }
+
+                            	    	    }
+
+
+                            	    	    }
+                            	    	    break;
+
+                            	    	default :
+                            	    	    break loop181;
+                            	        }
+                            	    } while (true);
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    if ( cnt182 >= 1 ) break loop182;
+                            	    if (state.backtracking>0) {state.failed=true; return current;}
+                                        EarlyExitException eee =
+                                            new EarlyExitException(182, input);
+                                        throw eee;
+                                }
+                                cnt182++;
+                            } while (true);
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:7516:6: ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* )
+                            {
+                            // InternalFormalML.g:7516:6: ( ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )* )
+                            // InternalFormalML.g:7517:7: ( (lv_region_15_0= ruleStatemachineRegionLite ) ) ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )*
+                            {
+                            // InternalFormalML.g:7517:7: ( (lv_region_15_0= ruleStatemachineRegionLite ) )
+                            // InternalFormalML.g:7518:8: (lv_region_15_0= ruleStatemachineRegionLite )
+                            {
+                            // InternalFormalML.g:7518:8: (lv_region_15_0= ruleStatemachineRegionLite )
+                            // InternalFormalML.g:7519:9: lv_region_15_0= ruleStatemachineRegionLite
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              									newCompositeNode(grammarAccess.getCompositeStateAccess().getRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0());
+                              								
+                            }
+                            pushFollow(FollowSets000.FOLLOW_82);
+                            lv_region_15_0=ruleStatemachineRegionLite();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              									if (current==null) {
+                              										current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+                              									}
+                              									add(
+                              										current,
+                              										"region",
+                              										lv_region_15_0,
+                              										"org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
+                              									afterParserOrEnumRuleCall();
+                              								
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalFormalML.g:7536:7: ( ( (lv_transition_16_0= ruleTransition ) ) | ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) ) )*
+                            loop183:
+                            do {
+                                int alt183=3;
+                                int LA183_0 = input.LA(1);
+
+                                if ( (LA183_0==131||LA183_0==140) ) {
+                                    alt183=1;
+                                }
+                                else if ( ((LA183_0>=70 && LA183_0<=71)||(LA183_0>=78 && LA183_0<=83)) ) {
+                                    alt183=2;
+                                }
+
+
+                                switch (alt183) {
+                            	case 1 :
+                            	    // InternalFormalML.g:7537:8: ( (lv_transition_16_0= ruleTransition ) )
+                            	    {
+                            	    // InternalFormalML.g:7537:8: ( (lv_transition_16_0= ruleTransition ) )
+                            	    // InternalFormalML.g:7538:9: (lv_transition_16_0= ruleTransition )
+                            	    {
+                            	    // InternalFormalML.g:7538:9: (lv_transition_16_0= ruleTransition )
+                            	    // InternalFormalML.g:7539:10: lv_transition_16_0= ruleTransition
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      										newCompositeNode(grammarAccess.getCompositeStateAccess().getTransitionTransitionParserRuleCall_8_0_1_1_1_0_0());
+                            	      									
+                            	    }
+                            	    pushFollow(FollowSets000.FOLLOW_82);
+                            	    lv_transition_16_0=ruleTransition();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      										if (current==null) {
+                            	      											current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+                            	      										}
+                            	      										add(
+                            	      											current,
+                            	      											"transition",
+                            	      											lv_transition_16_0,
+                            	      											"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+                            	      										afterParserOrEnumRuleCall();
+                            	      									
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+                            	case 2 :
+                            	    // InternalFormalML.g:7557:8: ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) )
+                            	    {
+                            	    // InternalFormalML.g:7557:8: ( (lv_moe_17_0= rulemoeCompositeStateRoutines ) )
+                            	    // InternalFormalML.g:7558:9: (lv_moe_17_0= rulemoeCompositeStateRoutines )
+                            	    {
+                            	    // InternalFormalML.g:7558:9: (lv_moe_17_0= rulemoeCompositeStateRoutines )
+                            	    // InternalFormalML.g:7559:10: lv_moe_17_0= rulemoeCompositeStateRoutines
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      										newCompositeNode(grammarAccess.getCompositeStateAccess().getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_1_0());
+                            	      									
+                            	    }
+                            	    pushFollow(FollowSets000.FOLLOW_82);
+                            	    lv_moe_17_0=rulemoeCompositeStateRoutines();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      										if (current==null) {
+                            	      											current = createModelElementForParent(grammarAccess.getCompositeStateRule());
+                            	      										}
+                            	      										add(
+                            	      											current,
+                            	      											"moe",
+                            	      											lv_moe_17_0,
+                            	      											"org.eclipse.efm.formalml.xtext.FormalML.moeCompositeStateRoutines");
+                            	      										afterParserOrEnumRuleCall();
+                            	      									
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop183;
+                                }
+                            } while (true);
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_18=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_18, grammarAccess.getCompositeStateAccess().getRightCurlyBracketKeyword_8_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7585:4: otherlv_19= ';'
+                    {
+                    otherlv_19=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_19, grammarAccess.getCompositeStateAccess().getSemicolonKeyword_8_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleCompositeState"
+
+
+    // $ANTLR start "entryRulemoeCompositeStateRoutines"
+    // InternalFormalML.g:7594:1: entryRulemoeCompositeStateRoutines returns [EObject current=null] : iv_rulemoeCompositeStateRoutines= rulemoeCompositeStateRoutines EOF ;
+    public final EObject entryRulemoeCompositeStateRoutines() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulemoeCompositeStateRoutines = null;
+
+
+        try {
+            // InternalFormalML.g:7594:66: (iv_rulemoeCompositeStateRoutines= rulemoeCompositeStateRoutines EOF )
+            // InternalFormalML.g:7595:2: iv_rulemoeCompositeStateRoutines= rulemoeCompositeStateRoutines EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulemoeCompositeStateRoutines=rulemoeCompositeStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulemoeCompositeStateRoutines; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulemoeCompositeStateRoutines"
+
+
+    // $ANTLR start "rulemoeCompositeStateRoutines"
+    // InternalFormalML.g:7601:1: rulemoeCompositeStateRoutines returns [EObject current=null] : ( () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) ;
+    public final EObject rulemoeCompositeStateRoutines() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_1_1=null;
+        Token lv_name_1_2=null;
+        Token lv_name_1_3=null;
+        Token lv_name_1_4=null;
+        Token lv_name_1_5=null;
+        Token lv_name_1_6=null;
+        Token lv_name_1_7=null;
+        Token lv_name_1_8=null;
+        EObject lv_bodyBlock_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:7607:2: ( ( () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) )
+            // InternalFormalML.g:7608:2: ( () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            {
+            // InternalFormalML.g:7608:2: ( () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            // InternalFormalML.g:7609:3: () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            {
+            // InternalFormalML.g:7609:3: ()
+            // InternalFormalML.g:7610:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getMoeCompositeStateRoutinesAccess().getRoutineAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:7619:3: ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' ) ) )
+            // InternalFormalML.g:7620:4: ( (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' ) )
+            {
+            // InternalFormalML.g:7620:4: ( (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' ) )
+            // InternalFormalML.g:7621:5: (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' )
+            {
+            // InternalFormalML.g:7621:5: (lv_name_1_1= '@init' | lv_name_1_2= '@final' | lv_name_1_3= '@enable' | lv_name_1_4= '@disable' | lv_name_1_5= '@concurrency' | lv_name_1_6= '@schedule' | lv_name_1_7= '@irun' | lv_name_1_8= '@run' )
+            int alt186=8;
+            switch ( input.LA(1) ) {
+            case 78:
+                {
+                alt186=1;
+                }
+                break;
+            case 79:
+                {
+                alt186=2;
+                }
+                break;
+            case 80:
+                {
+                alt186=3;
+                }
+                break;
+            case 81:
+                {
+                alt186=4;
+                }
+                break;
+            case 82:
+                {
+                alt186=5;
+                }
+                break;
+            case 70:
+                {
+                alt186=6;
+                }
+                break;
+            case 83:
+                {
+                alt186=7;
+                }
+                break;
+            case 71:
+                {
+                alt186=8;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 186, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt186) {
+                case 1 :
+                    // InternalFormalML.g:7622:6: lv_name_1_1= '@init'
+                    {
+                    lv_name_1_1=(Token)match(input,78,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_1, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameInitKeyword_1_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7633:6: lv_name_1_2= '@final'
+                    {
+                    lv_name_1_2=(Token)match(input,79,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_2, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameFinalKeyword_1_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7644:6: lv_name_1_3= '@enable'
+                    {
+                    lv_name_1_3=(Token)match(input,80,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_3, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameEnableKeyword_1_0_2());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_3, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:7655:6: lv_name_1_4= '@disable'
+                    {
+                    lv_name_1_4=(Token)match(input,81,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_4, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameDisableKeyword_1_0_3());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_4, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:7666:6: lv_name_1_5= '@concurrency'
+                    {
+                    lv_name_1_5=(Token)match(input,82,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_5, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameConcurrencyKeyword_1_0_4());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_5, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:7677:6: lv_name_1_6= '@schedule'
+                    {
+                    lv_name_1_6=(Token)match(input,70,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_6, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameScheduleKeyword_1_0_5());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_6, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:7688:6: lv_name_1_7= '@irun'
+                    {
+                    lv_name_1_7=(Token)match(input,83,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_7, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameIrunKeyword_1_0_6());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_7, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:7699:6: lv_name_1_8= '@run'
+                    {
+                    lv_name_1_8=(Token)match(input,71,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_8, grammarAccess.getMoeCompositeStateRoutinesAccess().getNameRunKeyword_1_0_7());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeCompositeStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_8, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:7712:3: ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            // InternalFormalML.g:7713:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:7713:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            // InternalFormalML.g:7714:5: lv_bodyBlock_2_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getMoeCompositeStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_bodyBlock_2_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getMoeCompositeStateRoutinesRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulemoeCompositeStateRoutines"
+
+
+    // $ANTLR start "entryRuleSimpleState"
+    // InternalFormalML.g:7735:1: entryRuleSimpleState returns [EObject current=null] : iv_ruleSimpleState= ruleSimpleState EOF ;
+    public final EObject entryRuleSimpleState() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSimpleState = null;
+
+
+        try {
+            // InternalFormalML.g:7735:52: (iv_ruleSimpleState= ruleSimpleState EOF )
+            // InternalFormalML.g:7736:2: iv_ruleSimpleState= ruleSimpleState EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSimpleStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSimpleState=ruleSimpleState();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSimpleState; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSimpleState"
+
+
+    // $ANTLR start "ruleSimpleState"
+    // InternalFormalML.g:7742:1: ruleSimpleState returns [EObject current=null] : ( () ( (lv_simple_1_0= 'state' ) ) (otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'simple' otherlv_5= '>' )? ( (lv_name_6_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_7_0= ruleUnrestrictedName ) )? ( (otherlv_8= '{' ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) ;
+    public final EObject ruleSimpleState() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_simple_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_8=null;
+        Token otherlv_11=null;
+        Token otherlv_12=null;
+        AntlrDatatypeRuleToken lv_name_6_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_7_0 = null;
+
+        EObject lv_transition_9_0 = null;
+
+        EObject lv_moe_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:7748:2: ( ( () ( (lv_simple_1_0= 'state' ) ) (otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'simple' otherlv_5= '>' )? ( (lv_name_6_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_7_0= ruleUnrestrictedName ) )? ( (otherlv_8= '{' ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) )
+            // InternalFormalML.g:7749:2: ( () ( (lv_simple_1_0= 'state' ) ) (otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'simple' otherlv_5= '>' )? ( (lv_name_6_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_7_0= ruleUnrestrictedName ) )? ( (otherlv_8= '{' ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
+            {
+            // InternalFormalML.g:7749:2: ( () ( (lv_simple_1_0= 'state' ) ) (otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'simple' otherlv_5= '>' )? ( (lv_name_6_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_7_0= ruleUnrestrictedName ) )? ( (otherlv_8= '{' ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
+            // InternalFormalML.g:7750:3: () ( (lv_simple_1_0= 'state' ) ) (otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'simple' otherlv_5= '>' )? ( (lv_name_6_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_7_0= ruleUnrestrictedName ) )? ( (otherlv_8= '{' ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )* otherlv_11= '}' ) | otherlv_12= ';' )
+            {
+            // InternalFormalML.g:7750:3: ()
+            // InternalFormalML.g:7751:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getSimpleStateAccess().getStateAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:7760:3: ( (lv_simple_1_0= 'state' ) )
+            // InternalFormalML.g:7761:4: (lv_simple_1_0= 'state' )
+            {
+            // InternalFormalML.g:7761:4: (lv_simple_1_0= 'state' )
+            // InternalFormalML.g:7762:5: lv_simple_1_0= 'state'
+            {
+            lv_simple_1_0=(Token)match(input,76,FollowSets000.FOLLOW_20); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_simple_1_0, grammarAccess.getSimpleStateAccess().getSimpleStateKeyword_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getSimpleStateRule());
+              					}
+              					setWithLastConsumed(current, "simple", true, "state");
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:7774:3: (otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'simple' otherlv_5= '>' )?
+            int alt188=2;
+            int LA188_0 = input.LA(1);
+
+            if ( (LA188_0==16) ) {
+                alt188=1;
+            }
+            switch (alt188) {
+                case 1 :
+                    // InternalFormalML.g:7775:4: otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'simple' otherlv_5= '>'
+                    {
+                    otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_83); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getSimpleStateAccess().getLessThanSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:7779:4: (otherlv_3= 'moc:' )?
+                    int alt187=2;
+                    int LA187_0 = input.LA(1);
+
+                    if ( (LA187_0==34) ) {
+                        alt187=1;
+                    }
+                    switch (alt187) {
+                        case 1 :
+                            // InternalFormalML.g:7780:5: otherlv_3= 'moc:'
+                            {
+                            otherlv_3=(Token)match(input,34,FollowSets000.FOLLOW_84); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_3, grammarAccess.getSimpleStateAccess().getMocKeyword_2_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_4=(Token)match(input,84,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getSimpleStateAccess().getSimpleKeyword_2_2());
+                      			
+                    }
+                    otherlv_5=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getSimpleStateAccess().getGreaterThanSignKeyword_2_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:7794:3: ( (lv_name_6_0= ruleESIdentifier ) )
+            // InternalFormalML.g:7795:4: (lv_name_6_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:7795:4: (lv_name_6_0= ruleESIdentifier )
+            // InternalFormalML.g:7796:5: lv_name_6_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSimpleStateAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_76);
+            lv_name_6_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSimpleStateRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_6_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:7813:3: ( (lv_unrestrictedName_7_0= ruleUnrestrictedName ) )?
+            int alt189=2;
+            int LA189_0 = input.LA(1);
+
+            if ( (LA189_0==RULE_STRING) ) {
+                alt189=1;
+            }
+            switch (alt189) {
+                case 1 :
+                    // InternalFormalML.g:7814:4: (lv_unrestrictedName_7_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:7814:4: (lv_unrestrictedName_7_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:7815:5: lv_unrestrictedName_7_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSimpleStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_unrestrictedName_7_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSimpleStateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_7_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:7832:3: ( (otherlv_8= '{' ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )* otherlv_11= '}' ) | otherlv_12= ';' )
+            int alt191=2;
+            int LA191_0 = input.LA(1);
+
+            if ( (LA191_0==22) ) {
+                alt191=1;
+            }
+            else if ( (LA191_0==25) ) {
+                alt191=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 191, 0, input);
+
+                throw nvae;
+            }
+            switch (alt191) {
+                case 1 :
+                    // InternalFormalML.g:7833:4: (otherlv_8= '{' ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )* otherlv_11= '}' )
+                    {
+                    // InternalFormalML.g:7833:4: (otherlv_8= '{' ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )* otherlv_11= '}' )
+                    // InternalFormalML.g:7834:5: otherlv_8= '{' ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )* otherlv_11= '}'
+                    {
+                    otherlv_8=(Token)match(input,22,FollowSets000.FOLLOW_85); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_8, grammarAccess.getSimpleStateAccess().getLeftCurlyBracketKeyword_5_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:7838:5: ( ( (lv_transition_9_0= ruleTransition ) ) | ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) ) )*
+                    loop190:
+                    do {
+                        int alt190=3;
+                        int LA190_0 = input.LA(1);
+
+                        if ( (LA190_0==131||LA190_0==140) ) {
+                            alt190=1;
+                        }
+                        else if ( ((LA190_0>=80 && LA190_0<=81)||LA190_0==83) ) {
+                            alt190=2;
+                        }
+
+
+                        switch (alt190) {
+                    	case 1 :
+                    	    // InternalFormalML.g:7839:6: ( (lv_transition_9_0= ruleTransition ) )
+                    	    {
+                    	    // InternalFormalML.g:7839:6: ( (lv_transition_9_0= ruleTransition ) )
+                    	    // InternalFormalML.g:7840:7: (lv_transition_9_0= ruleTransition )
+                    	    {
+                    	    // InternalFormalML.g:7840:7: (lv_transition_9_0= ruleTransition )
+                    	    // InternalFormalML.g:7841:8: lv_transition_9_0= ruleTransition
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getSimpleStateAccess().getTransitionTransitionParserRuleCall_5_0_1_0_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_85);
+                    	    lv_transition_9_0=ruleTransition();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getSimpleStateRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"transition",
+                    	      									lv_transition_9_0,
+                    	      									"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:7859:6: ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) )
+                    	    {
+                    	    // InternalFormalML.g:7859:6: ( (lv_moe_10_0= rulemoeSimpleStateRoutines ) )
+                    	    // InternalFormalML.g:7860:7: (lv_moe_10_0= rulemoeSimpleStateRoutines )
+                    	    {
+                    	    // InternalFormalML.g:7860:7: (lv_moe_10_0= rulemoeSimpleStateRoutines )
+                    	    // InternalFormalML.g:7861:8: lv_moe_10_0= rulemoeSimpleStateRoutines
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getSimpleStateAccess().getMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_85);
+                    	    lv_moe_10_0=rulemoeSimpleStateRoutines();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getSimpleStateRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"moe",
+                    	      									lv_moe_10_0,
+                    	      									"org.eclipse.efm.formalml.xtext.FormalML.moeSimpleStateRoutines");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop190;
+                        }
+                    } while (true);
+
+                    otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getSimpleStateAccess().getRightCurlyBracketKeyword_5_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7885:4: otherlv_12= ';'
+                    {
+                    otherlv_12=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getSimpleStateAccess().getSemicolonKeyword_5_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSimpleState"
+
+
+    // $ANTLR start "entryRulemoeSimpleStateRoutines"
+    // InternalFormalML.g:7894:1: entryRulemoeSimpleStateRoutines returns [EObject current=null] : iv_rulemoeSimpleStateRoutines= rulemoeSimpleStateRoutines EOF ;
+    public final EObject entryRulemoeSimpleStateRoutines() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulemoeSimpleStateRoutines = null;
+
+
+        try {
+            // InternalFormalML.g:7894:63: (iv_rulemoeSimpleStateRoutines= rulemoeSimpleStateRoutines EOF )
+            // InternalFormalML.g:7895:2: iv_rulemoeSimpleStateRoutines= rulemoeSimpleStateRoutines EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMoeSimpleStateRoutinesRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulemoeSimpleStateRoutines=rulemoeSimpleStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulemoeSimpleStateRoutines; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulemoeSimpleStateRoutines"
+
+
+    // $ANTLR start "rulemoeSimpleStateRoutines"
+    // InternalFormalML.g:7901:1: rulemoeSimpleStateRoutines returns [EObject current=null] : ( () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) ;
+    public final EObject rulemoeSimpleStateRoutines() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_1_1=null;
+        Token lv_name_1_2=null;
+        Token lv_name_1_3=null;
+        EObject lv_bodyBlock_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:7907:2: ( ( () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) )
+            // InternalFormalML.g:7908:2: ( () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            {
+            // InternalFormalML.g:7908:2: ( () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            // InternalFormalML.g:7909:3: () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            {
+            // InternalFormalML.g:7909:3: ()
+            // InternalFormalML.g:7910:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getMoeSimpleStateRoutinesAccess().getRoutineAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:7919:3: ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' ) ) )
+            // InternalFormalML.g:7920:4: ( (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' ) )
+            {
+            // InternalFormalML.g:7920:4: ( (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' ) )
+            // InternalFormalML.g:7921:5: (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' )
+            {
+            // InternalFormalML.g:7921:5: (lv_name_1_1= '@enable' | lv_name_1_2= '@disable' | lv_name_1_3= '@irun' )
+            int alt192=3;
+            switch ( input.LA(1) ) {
+            case 80:
+                {
+                alt192=1;
+                }
+                break;
+            case 81:
+                {
+                alt192=2;
+                }
+                break;
+            case 83:
+                {
+                alt192=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 192, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt192) {
+                case 1 :
+                    // InternalFormalML.g:7922:6: lv_name_1_1= '@enable'
+                    {
+                    lv_name_1_1=(Token)match(input,80,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_1, grammarAccess.getMoeSimpleStateRoutinesAccess().getNameEnableKeyword_1_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeSimpleStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:7933:6: lv_name_1_2= '@disable'
+                    {
+                    lv_name_1_2=(Token)match(input,81,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_2, grammarAccess.getMoeSimpleStateRoutinesAccess().getNameDisableKeyword_1_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeSimpleStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:7944:6: lv_name_1_3= '@irun'
+                    {
+                    lv_name_1_3=(Token)match(input,83,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_3, grammarAccess.getMoeSimpleStateRoutinesAccess().getNameIrunKeyword_1_0_2());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeSimpleStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_3, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:7957:3: ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            // InternalFormalML.g:7958:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:7958:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            // InternalFormalML.g:7959:5: lv_bodyBlock_2_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getMoeSimpleStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_bodyBlock_2_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getMoeSimpleStateRoutinesRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulemoeSimpleStateRoutines"
+
+
+    // $ANTLR start "entryRuleStartState"
+    // InternalFormalML.g:7980:1: entryRuleStartState returns [EObject current=null] : iv_ruleStartState= ruleStartState EOF ;
+    public final EObject entryRuleStartState() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStartState = null;
+
+
+        try {
+            // InternalFormalML.g:7980:51: (iv_ruleStartState= ruleStartState EOF )
+            // InternalFormalML.g:7981:2: iv_ruleStartState= ruleStartState EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStartStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleStartState=ruleStartState();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStartState; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStartState"
+
+
+    // $ANTLR start "ruleStartState"
+    // InternalFormalML.g:7987:1: ruleStartState returns [EObject current=null] : ( () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'start' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#start' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )* otherlv_12= '}' ) | otherlv_13= ';' ) ) ;
+    public final EObject ruleStartState() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_simple_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token lv_simple_7_0=null;
+        Token otherlv_9=null;
+        Token otherlv_12=null;
+        Token otherlv_13=null;
+        AntlrDatatypeRuleToken lv_name_6_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_transition_10_0 = null;
+
+        EObject lv_moe_11_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:7993:2: ( ( () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'start' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#start' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )* otherlv_12= '}' ) | otherlv_13= ';' ) ) )
+            // InternalFormalML.g:7994:2: ( () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'start' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#start' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )* otherlv_12= '}' ) | otherlv_13= ';' ) )
+            {
+            // InternalFormalML.g:7994:2: ( () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'start' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#start' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )* otherlv_12= '}' ) | otherlv_13= ';' ) )
+            // InternalFormalML.g:7995:3: () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'start' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#start' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )* otherlv_12= '}' ) | otherlv_13= ';' )
+            {
+            // InternalFormalML.g:7995:3: ()
+            // InternalFormalML.g:7996:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getStartStateAccess().getStartStateAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:8005:3: ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'start' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#start' ) ) )
+            int alt194=2;
+            int LA194_0 = input.LA(1);
+
+            if ( (LA194_0==76) ) {
+                alt194=1;
+            }
+            else if ( (LA194_0==86) ) {
+                alt194=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 194, 0, input);
+
+                throw nvae;
+            }
+            switch (alt194) {
+                case 1 :
+                    // InternalFormalML.g:8006:4: ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'start' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) )
+                    {
+                    // InternalFormalML.g:8006:4: ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'start' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) )
+                    // InternalFormalML.g:8007:5: ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'start' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) )
+                    {
+                    // InternalFormalML.g:8007:5: ( (lv_simple_1_0= 'state' ) )
+                    // InternalFormalML.g:8008:6: (lv_simple_1_0= 'state' )
+                    {
+                    // InternalFormalML.g:8008:6: (lv_simple_1_0= 'state' )
+                    // InternalFormalML.g:8009:7: lv_simple_1_0= 'state'
+                    {
+                    lv_simple_1_0=(Token)match(input,76,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_simple_1_0, grammarAccess.getStartStateAccess().getSimpleStateKeyword_1_0_0_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getStartStateRule());
+                      							}
+                      							setWithLastConsumed(current, "simple", true, "state");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_86); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_2, grammarAccess.getStartStateAccess().getLessThanSignKeyword_1_0_1());
+                      				
+                    }
+                    // InternalFormalML.g:8025:5: (otherlv_3= 'moc:' )?
+                    int alt193=2;
+                    int LA193_0 = input.LA(1);
+
+                    if ( (LA193_0==34) ) {
+                        alt193=1;
+                    }
+                    switch (alt193) {
+                        case 1 :
+                            // InternalFormalML.g:8026:6: otherlv_3= 'moc:'
+                            {
+                            otherlv_3=(Token)match(input,34,FollowSets000.FOLLOW_87); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_3, grammarAccess.getStartStateAccess().getMocKeyword_1_0_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_4=(Token)match(input,85,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getStartStateAccess().getStartKeyword_1_0_3());
+                      				
+                    }
+                    otherlv_5=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_5, grammarAccess.getStartStateAccess().getGreaterThanSignKeyword_1_0_4());
+                      				
+                    }
+                    // InternalFormalML.g:8039:5: ( (lv_name_6_0= ruleESIdentifier ) )
+                    // InternalFormalML.g:8040:6: (lv_name_6_0= ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:8040:6: (lv_name_6_0= ruleESIdentifier )
+                    // InternalFormalML.g:8041:7: lv_name_6_0= ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getStartStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_76);
+                    lv_name_6_0=ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getStartStateRule());
+                      							}
+                      							set(
+                      								current,
+                      								"name",
+                      								lv_name_6_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8060:4: ( (lv_simple_7_0= '#start' ) )
+                    {
+                    // InternalFormalML.g:8060:4: ( (lv_simple_7_0= '#start' ) )
+                    // InternalFormalML.g:8061:5: (lv_simple_7_0= '#start' )
+                    {
+                    // InternalFormalML.g:8061:5: (lv_simple_7_0= '#start' )
+                    // InternalFormalML.g:8062:6: lv_simple_7_0= '#start'
+                    {
+                    lv_simple_7_0=(Token)match(input,86,FollowSets000.FOLLOW_76); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_simple_7_0, grammarAccess.getStartStateAccess().getSimpleStartKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getStartStateRule());
+                      						}
+                      						setWithLastConsumed(current, "simple", true, "#start");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8075:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt195=2;
+            int LA195_0 = input.LA(1);
+
+            if ( (LA195_0==RULE_STRING) ) {
+                alt195=1;
+            }
+            switch (alt195) {
+                case 1 :
+                    // InternalFormalML.g:8076:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:8076:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:8077:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getStartStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getStartStateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8094:3: ( (otherlv_9= '{' ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )* otherlv_12= '}' ) | otherlv_13= ';' )
+            int alt197=2;
+            int LA197_0 = input.LA(1);
+
+            if ( (LA197_0==22) ) {
+                alt197=1;
+            }
+            else if ( (LA197_0==25) ) {
+                alt197=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 197, 0, input);
+
+                throw nvae;
+            }
+            switch (alt197) {
+                case 1 :
+                    // InternalFormalML.g:8095:4: (otherlv_9= '{' ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )* otherlv_12= '}' )
+                    {
+                    // InternalFormalML.g:8095:4: (otherlv_9= '{' ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )* otherlv_12= '}' )
+                    // InternalFormalML.g:8096:5: otherlv_9= '{' ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )* otherlv_12= '}'
+                    {
+                    otherlv_9=(Token)match(input,22,FollowSets000.FOLLOW_88); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_9, grammarAccess.getStartStateAccess().getLeftCurlyBracketKeyword_3_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:8100:5: ( ( (lv_transition_10_0= ruleTransition ) ) | ( (lv_moe_11_0= rulemoeStartStateRoutines ) ) )*
+                    loop196:
+                    do {
+                        int alt196=3;
+                        int LA196_0 = input.LA(1);
+
+                        if ( (LA196_0==131||LA196_0==140) ) {
+                            alt196=1;
+                        }
+                        else if ( (LA196_0==78||(LA196_0>=80 && LA196_0<=81)||LA196_0==83) ) {
+                            alt196=2;
+                        }
+
+
+                        switch (alt196) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8101:6: ( (lv_transition_10_0= ruleTransition ) )
+                    	    {
+                    	    // InternalFormalML.g:8101:6: ( (lv_transition_10_0= ruleTransition ) )
+                    	    // InternalFormalML.g:8102:7: (lv_transition_10_0= ruleTransition )
+                    	    {
+                    	    // InternalFormalML.g:8102:7: (lv_transition_10_0= ruleTransition )
+                    	    // InternalFormalML.g:8103:8: lv_transition_10_0= ruleTransition
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getStartStateAccess().getTransitionTransitionParserRuleCall_3_0_1_0_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_88);
+                    	    lv_transition_10_0=ruleTransition();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getStartStateRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"transition",
+                    	      									lv_transition_10_0,
+                    	      									"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:8121:6: ( (lv_moe_11_0= rulemoeStartStateRoutines ) )
+                    	    {
+                    	    // InternalFormalML.g:8121:6: ( (lv_moe_11_0= rulemoeStartStateRoutines ) )
+                    	    // InternalFormalML.g:8122:7: (lv_moe_11_0= rulemoeStartStateRoutines )
+                    	    {
+                    	    // InternalFormalML.g:8122:7: (lv_moe_11_0= rulemoeStartStateRoutines )
+                    	    // InternalFormalML.g:8123:8: lv_moe_11_0= rulemoeStartStateRoutines
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getStartStateAccess().getMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_88);
+                    	    lv_moe_11_0=rulemoeStartStateRoutines();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getStartStateRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"moe",
+                    	      									lv_moe_11_0,
+                    	      									"org.eclipse.efm.formalml.xtext.FormalML.moeStartStateRoutines");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop196;
+                        }
+                    } while (true);
+
+                    otherlv_12=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_12, grammarAccess.getStartStateAccess().getRightCurlyBracketKeyword_3_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8147:4: otherlv_13= ';'
+                    {
+                    otherlv_13=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getStartStateAccess().getSemicolonKeyword_3_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStartState"
+
+
+    // $ANTLR start "entryRulemoeStartStateRoutines"
+    // InternalFormalML.g:8156:1: entryRulemoeStartStateRoutines returns [EObject current=null] : iv_rulemoeStartStateRoutines= rulemoeStartStateRoutines EOF ;
+    public final EObject entryRulemoeStartStateRoutines() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulemoeStartStateRoutines = null;
+
+
+        try {
+            // InternalFormalML.g:8156:62: (iv_rulemoeStartStateRoutines= rulemoeStartStateRoutines EOF )
+            // InternalFormalML.g:8157:2: iv_rulemoeStartStateRoutines= rulemoeStartStateRoutines EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMoeStartStateRoutinesRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulemoeStartStateRoutines=rulemoeStartStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulemoeStartStateRoutines; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulemoeStartStateRoutines"
+
+
+    // $ANTLR start "rulemoeStartStateRoutines"
+    // InternalFormalML.g:8163:1: rulemoeStartStateRoutines returns [EObject current=null] : ( () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) ;
+    public final EObject rulemoeStartStateRoutines() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_1_1=null;
+        Token lv_name_1_2=null;
+        Token lv_name_1_3=null;
+        Token lv_name_1_4=null;
+        EObject lv_bodyBlock_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:8169:2: ( ( () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) )
+            // InternalFormalML.g:8170:2: ( () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            {
+            // InternalFormalML.g:8170:2: ( () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            // InternalFormalML.g:8171:3: () ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            {
+            // InternalFormalML.g:8171:3: ()
+            // InternalFormalML.g:8172:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getMoeStartStateRoutinesAccess().getRoutineAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:8181:3: ( ( (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' ) ) )
+            // InternalFormalML.g:8182:4: ( (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' ) )
+            {
+            // InternalFormalML.g:8182:4: ( (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' ) )
+            // InternalFormalML.g:8183:5: (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' )
+            {
+            // InternalFormalML.g:8183:5: (lv_name_1_1= '@init' | lv_name_1_2= '@enable' | lv_name_1_3= '@disable' | lv_name_1_4= '@irun' )
+            int alt198=4;
+            switch ( input.LA(1) ) {
+            case 78:
+                {
+                alt198=1;
+                }
+                break;
+            case 80:
+                {
+                alt198=2;
+                }
+                break;
+            case 81:
+                {
+                alt198=3;
+                }
+                break;
+            case 83:
+                {
+                alt198=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 198, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt198) {
+                case 1 :
+                    // InternalFormalML.g:8184:6: lv_name_1_1= '@init'
+                    {
+                    lv_name_1_1=(Token)match(input,78,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_1, grammarAccess.getMoeStartStateRoutinesAccess().getNameInitKeyword_1_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeStartStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8195:6: lv_name_1_2= '@enable'
+                    {
+                    lv_name_1_2=(Token)match(input,80,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_2, grammarAccess.getMoeStartStateRoutinesAccess().getNameEnableKeyword_1_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeStartStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8206:6: lv_name_1_3= '@disable'
+                    {
+                    lv_name_1_3=(Token)match(input,81,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_3, grammarAccess.getMoeStartStateRoutinesAccess().getNameDisableKeyword_1_0_2());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeStartStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_3, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:8217:6: lv_name_1_4= '@irun'
+                    {
+                    lv_name_1_4=(Token)match(input,83,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_4, grammarAccess.getMoeStartStateRoutinesAccess().getNameIrunKeyword_1_0_3());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeStartStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_4, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:8230:3: ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            // InternalFormalML.g:8231:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:8231:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            // InternalFormalML.g:8232:5: lv_bodyBlock_2_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getMoeStartStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_bodyBlock_2_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getMoeStartStateRoutinesRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulemoeStartStateRoutines"
+
+
+    // $ANTLR start "entryRuleFinalState"
+    // InternalFormalML.g:8253:1: entryRuleFinalState returns [EObject current=null] : iv_ruleFinalState= ruleFinalState EOF ;
+    public final EObject entryRuleFinalState() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleFinalState = null;
+
+
+        try {
+            // InternalFormalML.g:8253:51: (iv_ruleFinalState= ruleFinalState EOF )
+            // InternalFormalML.g:8254:2: iv_ruleFinalState= ruleFinalState EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getFinalStateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleFinalState=ruleFinalState();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleFinalState; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleFinalState"
+
+
+    // $ANTLR start "ruleFinalState"
+    // InternalFormalML.g:8260:1: ruleFinalState returns [EObject current=null] : ( () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'final' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#final' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) ;
+    public final EObject ruleFinalState() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_simple_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token lv_simple_7_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_12=null;
+        AntlrDatatypeRuleToken lv_name_6_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_moe_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:8266:2: ( ( () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'final' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#final' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) )
+            // InternalFormalML.g:8267:2: ( () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'final' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#final' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
+            {
+            // InternalFormalML.g:8267:2: ( () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'final' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#final' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
+            // InternalFormalML.g:8268:3: () ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'final' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#final' ) ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' )
+            {
+            // InternalFormalML.g:8268:3: ()
+            // InternalFormalML.g:8269:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getFinalStateAccess().getFinalStateAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:8278:3: ( ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'final' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) ) | ( (lv_simple_7_0= '#final' ) ) )
+            int alt200=2;
+            int LA200_0 = input.LA(1);
+
+            if ( (LA200_0==76) ) {
+                alt200=1;
+            }
+            else if ( (LA200_0==88) ) {
+                alt200=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 200, 0, input);
+
+                throw nvae;
+            }
+            switch (alt200) {
+                case 1 :
+                    // InternalFormalML.g:8279:4: ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'final' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) )
+                    {
+                    // InternalFormalML.g:8279:4: ( ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'final' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) ) )
+                    // InternalFormalML.g:8280:5: ( (lv_simple_1_0= 'state' ) ) otherlv_2= '<' (otherlv_3= 'moc:' )? otherlv_4= 'final' otherlv_5= '>' ( (lv_name_6_0= ruleESIdentifier ) )
+                    {
+                    // InternalFormalML.g:8280:5: ( (lv_simple_1_0= 'state' ) )
+                    // InternalFormalML.g:8281:6: (lv_simple_1_0= 'state' )
+                    {
+                    // InternalFormalML.g:8281:6: (lv_simple_1_0= 'state' )
+                    // InternalFormalML.g:8282:7: lv_simple_1_0= 'state'
+                    {
+                    lv_simple_1_0=(Token)match(input,76,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_simple_1_0, grammarAccess.getFinalStateAccess().getSimpleStateKeyword_1_0_0_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getFinalStateRule());
+                      							}
+                      							setWithLastConsumed(current, "simple", true, "state");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_89); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_2, grammarAccess.getFinalStateAccess().getLessThanSignKeyword_1_0_1());
+                      				
+                    }
+                    // InternalFormalML.g:8298:5: (otherlv_3= 'moc:' )?
+                    int alt199=2;
+                    int LA199_0 = input.LA(1);
+
+                    if ( (LA199_0==34) ) {
+                        alt199=1;
+                    }
+                    switch (alt199) {
+                        case 1 :
+                            // InternalFormalML.g:8299:6: otherlv_3= 'moc:'
+                            {
+                            otherlv_3=(Token)match(input,34,FollowSets000.FOLLOW_90); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_3, grammarAccess.getFinalStateAccess().getMocKeyword_1_0_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_4=(Token)match(input,87,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getFinalStateAccess().getFinalKeyword_1_0_3());
+                      				
+                    }
+                    otherlv_5=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_5, grammarAccess.getFinalStateAccess().getGreaterThanSignKeyword_1_0_4());
+                      				
+                    }
+                    // InternalFormalML.g:8312:5: ( (lv_name_6_0= ruleESIdentifier ) )
+                    // InternalFormalML.g:8313:6: (lv_name_6_0= ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:8313:6: (lv_name_6_0= ruleESIdentifier )
+                    // InternalFormalML.g:8314:7: lv_name_6_0= ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getFinalStateAccess().getNameESIdentifierParserRuleCall_1_0_5_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_76);
+                    lv_name_6_0=ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getFinalStateRule());
+                      							}
+                      							set(
+                      								current,
+                      								"name",
+                      								lv_name_6_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8333:4: ( (lv_simple_7_0= '#final' ) )
+                    {
+                    // InternalFormalML.g:8333:4: ( (lv_simple_7_0= '#final' ) )
+                    // InternalFormalML.g:8334:5: (lv_simple_7_0= '#final' )
+                    {
+                    // InternalFormalML.g:8334:5: (lv_simple_7_0= '#final' )
+                    // InternalFormalML.g:8335:6: lv_simple_7_0= '#final'
+                    {
+                    lv_simple_7_0=(Token)match(input,88,FollowSets000.FOLLOW_76); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_simple_7_0, grammarAccess.getFinalStateAccess().getSimpleFinalKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getFinalStateRule());
+                      						}
+                      						setWithLastConsumed(current, "simple", true, "#final");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8348:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt201=2;
+            int LA201_0 = input.LA(1);
+
+            if ( (LA201_0==RULE_STRING) ) {
+                alt201=1;
+            }
+            switch (alt201) {
+                case 1 :
+                    // InternalFormalML.g:8349:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:8349:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:8350:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getFinalStateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getFinalStateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8367:3: ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' )
+            int alt203=2;
+            int LA203_0 = input.LA(1);
+
+            if ( (LA203_0==22) ) {
+                alt203=1;
+            }
+            else if ( (LA203_0==25) ) {
+                alt203=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 203, 0, input);
+
+                throw nvae;
+            }
+            switch (alt203) {
+                case 1 :
+                    // InternalFormalML.g:8368:4: (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' )
+                    {
+                    // InternalFormalML.g:8368:4: (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' )
+                    // InternalFormalML.g:8369:5: otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}'
+                    {
+                    otherlv_9=(Token)match(input,22,FollowSets000.FOLLOW_91); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_9, grammarAccess.getFinalStateAccess().getLeftCurlyBracketKeyword_3_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:8373:5: ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )*
+                    loop202:
+                    do {
+                        int alt202=2;
+                        int LA202_0 = input.LA(1);
+
+                        if ( ((LA202_0>=79 && LA202_0<=80)) ) {
+                            alt202=1;
+                        }
+
+
+                        switch (alt202) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8374:6: (lv_moe_10_0= rulemoeFinalStateRoutines )
+                    	    {
+                    	    // InternalFormalML.g:8374:6: (lv_moe_10_0= rulemoeFinalStateRoutines )
+                    	    // InternalFormalML.g:8375:7: lv_moe_10_0= rulemoeFinalStateRoutines
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getFinalStateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_91);
+                    	    lv_moe_10_0=rulemoeFinalStateRoutines();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getFinalStateRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"moe",
+                    	      								lv_moe_10_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.moeFinalStateRoutines");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop202;
+                        }
+                    } while (true);
+
+                    otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getFinalStateAccess().getRightCurlyBracketKeyword_3_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8398:4: otherlv_12= ';'
+                    {
+                    otherlv_12=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getFinalStateAccess().getSemicolonKeyword_3_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleFinalState"
+
+
+    // $ANTLR start "entryRulemoeFinalStateRoutines"
+    // InternalFormalML.g:8407:1: entryRulemoeFinalStateRoutines returns [EObject current=null] : iv_rulemoeFinalStateRoutines= rulemoeFinalStateRoutines EOF ;
+    public final EObject entryRulemoeFinalStateRoutines() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulemoeFinalStateRoutines = null;
+
+
+        try {
+            // InternalFormalML.g:8407:62: (iv_rulemoeFinalStateRoutines= rulemoeFinalStateRoutines EOF )
+            // InternalFormalML.g:8408:2: iv_rulemoeFinalStateRoutines= rulemoeFinalStateRoutines EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMoeFinalStateRoutinesRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulemoeFinalStateRoutines=rulemoeFinalStateRoutines();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulemoeFinalStateRoutines; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulemoeFinalStateRoutines"
+
+
+    // $ANTLR start "rulemoeFinalStateRoutines"
+    // InternalFormalML.g:8414:1: rulemoeFinalStateRoutines returns [EObject current=null] : ( () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@final' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) ;
+    public final EObject rulemoeFinalStateRoutines() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_1_1=null;
+        Token lv_name_1_2=null;
+        EObject lv_bodyBlock_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:8420:2: ( ( () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@final' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) )
+            // InternalFormalML.g:8421:2: ( () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@final' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            {
+            // InternalFormalML.g:8421:2: ( () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@final' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            // InternalFormalML.g:8422:3: () ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@final' ) ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            {
+            // InternalFormalML.g:8422:3: ()
+            // InternalFormalML.g:8423:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getMoeFinalStateRoutinesAccess().getRoutineAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:8432:3: ( ( (lv_name_1_1= '@enable' | lv_name_1_2= '@final' ) ) )
+            // InternalFormalML.g:8433:4: ( (lv_name_1_1= '@enable' | lv_name_1_2= '@final' ) )
+            {
+            // InternalFormalML.g:8433:4: ( (lv_name_1_1= '@enable' | lv_name_1_2= '@final' ) )
+            // InternalFormalML.g:8434:5: (lv_name_1_1= '@enable' | lv_name_1_2= '@final' )
+            {
+            // InternalFormalML.g:8434:5: (lv_name_1_1= '@enable' | lv_name_1_2= '@final' )
+            int alt204=2;
+            int LA204_0 = input.LA(1);
+
+            if ( (LA204_0==80) ) {
+                alt204=1;
+            }
+            else if ( (LA204_0==79) ) {
+                alt204=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 204, 0, input);
+
+                throw nvae;
+            }
+            switch (alt204) {
+                case 1 :
+                    // InternalFormalML.g:8435:6: lv_name_1_1= '@enable'
+                    {
+                    lv_name_1_1=(Token)match(input,80,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_1, grammarAccess.getMoeFinalStateRoutinesAccess().getNameEnableKeyword_1_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeFinalStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8446:6: lv_name_1_2= '@final'
+                    {
+                    lv_name_1_2=(Token)match(input,79,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_name_1_2, grammarAccess.getMoeFinalStateRoutinesAccess().getNameFinalKeyword_1_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getMoeFinalStateRoutinesRule());
+                      						}
+                      						setWithLastConsumed(current, "name", lv_name_1_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:8459:3: ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            // InternalFormalML.g:8460:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:8460:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            // InternalFormalML.g:8461:5: lv_bodyBlock_2_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getMoeFinalStateRoutinesAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_bodyBlock_2_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getMoeFinalStateRoutinesRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulemoeFinalStateRoutines"
+
+
+    // $ANTLR start "entryRulePseudostate"
+    // InternalFormalML.g:8482:1: entryRulePseudostate returns [EObject current=null] : iv_rulePseudostate= rulePseudostate EOF ;
+    public final EObject entryRulePseudostate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePseudostate = null;
+
+
+        try {
+            // InternalFormalML.g:8482:52: (iv_rulePseudostate= rulePseudostate EOF )
+            // InternalFormalML.g:8483:2: iv_rulePseudostate= rulePseudostate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPseudostateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePseudostate=rulePseudostate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePseudostate; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePseudostate"
+
+
+    // $ANTLR start "rulePseudostate"
+    // InternalFormalML.g:8489:1: rulePseudostate returns [EObject current=null] : (this_PseudostateInitial_0= rulePseudostateInitial | this_EndingPseudostate_1= ruleEndingPseudostate | this_OtherPseudostate_2= ruleOtherPseudostate ) ;
+    public final EObject rulePseudostate() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_PseudostateInitial_0 = null;
+
+        EObject this_EndingPseudostate_1 = null;
+
+        EObject this_OtherPseudostate_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:8495:2: ( (this_PseudostateInitial_0= rulePseudostateInitial | this_EndingPseudostate_1= ruleEndingPseudostate | this_OtherPseudostate_2= ruleOtherPseudostate ) )
+            // InternalFormalML.g:8496:2: (this_PseudostateInitial_0= rulePseudostateInitial | this_EndingPseudostate_1= ruleEndingPseudostate | this_OtherPseudostate_2= ruleOtherPseudostate )
+            {
+            // InternalFormalML.g:8496:2: (this_PseudostateInitial_0= rulePseudostateInitial | this_EndingPseudostate_1= ruleEndingPseudostate | this_OtherPseudostate_2= ruleOtherPseudostate )
+            int alt205=3;
+            switch ( input.LA(1) ) {
+            case 76:
+                {
+                int LA205_1 = input.LA(2);
+
+                if ( (LA205_1==16) ) {
+                    switch ( input.LA(3) ) {
+                    case 34:
+                        {
+                        switch ( input.LA(4) ) {
+                        case 252:
+                            {
+                            alt205=1;
+                            }
+                            break;
+                        case 64:
+                        case 253:
+                            {
+                            alt205=2;
+                            }
+                            break;
+                        case 127:
+                        case 245:
+                        case 246:
+                        case 247:
+                        case 248:
+                        case 249:
+                        case 250:
+                        case 251:
+                            {
+                            alt205=3;
+                            }
+                            break;
+                        default:
+                            if (state.backtracking>0) {state.failed=true; return current;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 205, 5, input);
+
+                            throw nvae;
+                        }
+
+                        }
+                        break;
+                    case 127:
+                    case 245:
+                    case 246:
+                    case 247:
+                    case 248:
+                    case 249:
+                    case 250:
+                    case 251:
+                        {
+                        alt205=3;
+                        }
+                        break;
+                    case 252:
+                        {
+                        alt205=1;
+                        }
+                        break;
+                    case 64:
+                    case 253:
+                        {
+                        alt205=2;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 205, 4, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 205, 1, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 89:
+                {
+                int LA205_2 = input.LA(2);
+
+                if ( (LA205_2==16) ) {
+                    switch ( input.LA(3) ) {
+                    case 34:
+                        {
+                        switch ( input.LA(4) ) {
+                        case 252:
+                            {
+                            alt205=1;
+                            }
+                            break;
+                        case 64:
+                        case 253:
+                            {
+                            alt205=2;
+                            }
+                            break;
+                        case 127:
+                        case 245:
+                        case 246:
+                        case 247:
+                        case 248:
+                        case 249:
+                        case 250:
+                        case 251:
+                            {
+                            alt205=3;
+                            }
+                            break;
+                        default:
+                            if (state.backtracking>0) {state.failed=true; return current;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 205, 5, input);
+
+                            throw nvae;
+                        }
+
+                        }
+                        break;
+                    case 127:
+                    case 245:
+                    case 246:
+                    case 247:
+                    case 248:
+                    case 249:
+                    case 250:
+                    case 251:
+                        {
+                        alt205=3;
+                        }
+                        break;
+                    case 252:
+                        {
+                        alt205=1;
+                        }
+                        break;
+                    case 64:
+                    case 253:
+                        {
+                        alt205=2;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 205, 4, input);
+
+                        throw nvae;
+                    }
+
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 205, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 90:
+            case 91:
+                {
+                alt205=1;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 205, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt205) {
+                case 1 :
+                    // InternalFormalML.g:8497:3: this_PseudostateInitial_0= rulePseudostateInitial
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPseudostateAccess().getPseudostateInitialParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PseudostateInitial_0=rulePseudostateInitial();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PseudostateInitial_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8509:3: this_EndingPseudostate_1= ruleEndingPseudostate
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPseudostateAccess().getEndingPseudostateParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_EndingPseudostate_1=ruleEndingPseudostate();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_EndingPseudostate_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:8521:3: this_OtherPseudostate_2= ruleOtherPseudostate
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPseudostateAccess().getOtherPseudostateParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_OtherPseudostate_2=ruleOtherPseudostate();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_OtherPseudostate_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePseudostate"
+
+
+    // $ANTLR start "entryRuleOtherPseudostate"
+    // InternalFormalML.g:8536:1: entryRuleOtherPseudostate returns [EObject current=null] : iv_ruleOtherPseudostate= ruleOtherPseudostate EOF ;
+    public final EObject entryRuleOtherPseudostate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleOtherPseudostate = null;
+
+
+        try {
+            // InternalFormalML.g:8536:57: (iv_ruleOtherPseudostate= ruleOtherPseudostate EOF )
+            // InternalFormalML.g:8537:2: iv_ruleOtherPseudostate= ruleOtherPseudostate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOtherPseudostateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleOtherPseudostate=ruleOtherPseudostate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOtherPseudostate; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOtherPseudostate"
+
+
+    // $ANTLR start "ruleOtherPseudostate"
+    // InternalFormalML.g:8543:1: ruleOtherPseudostate returns [EObject current=null] : ( () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_transition_10_0= ruleTransition ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) ;
+    public final EObject ruleOtherPseudostate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_12=null;
+        Enumerator lv_kind_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_transition_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:8549:2: ( ( () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_transition_10_0= ruleTransition ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) )
+            // InternalFormalML.g:8550:2: ( () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_transition_10_0= ruleTransition ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
+            {
+            // InternalFormalML.g:8550:2: ( () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_transition_10_0= ruleTransition ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
+            // InternalFormalML.g:8551:3: () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_transition_10_0= ruleTransition ) )* otherlv_11= '}' ) | otherlv_12= ';' )
+            {
+            // InternalFormalML.g:8551:3: ()
+            // InternalFormalML.g:8552:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getOtherPseudostateAccess().getPseudostateAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:8561:3: (otherlv_1= 'state' | otherlv_2= 'pseudostate' )
+            int alt206=2;
+            int LA206_0 = input.LA(1);
+
+            if ( (LA206_0==76) ) {
+                alt206=1;
+            }
+            else if ( (LA206_0==89) ) {
+                alt206=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 206, 0, input);
+
+                throw nvae;
+            }
+            switch (alt206) {
+                case 1 :
+                    // InternalFormalML.g:8562:4: otherlv_1= 'state'
+                    {
+                    otherlv_1=(Token)match(input,76,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getOtherPseudostateAccess().getStateKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8567:4: otherlv_2= 'pseudostate'
+                    {
+                    otherlv_2=(Token)match(input,89,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getOtherPseudostateAccess().getPseudostateKeyword_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,16,FollowSets000.FOLLOW_92); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getOtherPseudostateAccess().getLessThanSignKeyword_2());
+              		
+            }
+            // InternalFormalML.g:8576:3: (otherlv_4= 'moc:' )?
+            int alt207=2;
+            int LA207_0 = input.LA(1);
+
+            if ( (LA207_0==34) ) {
+                alt207=1;
+            }
+            switch (alt207) {
+                case 1 :
+                    // InternalFormalML.g:8577:4: otherlv_4= 'moc:'
+                    {
+                    otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_92); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getOtherPseudostateAccess().getMocKeyword_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8582:3: ( (lv_kind_5_0= rulePseudostateKind ) )
+            // InternalFormalML.g:8583:4: (lv_kind_5_0= rulePseudostateKind )
+            {
+            // InternalFormalML.g:8583:4: (lv_kind_5_0= rulePseudostateKind )
+            // InternalFormalML.g:8584:5: lv_kind_5_0= rulePseudostateKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getOtherPseudostateAccess().getKindPseudostateKindEnumRuleCall_4_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_23);
+            lv_kind_5_0=rulePseudostateKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
+              					}
+              					set(
+              						current,
+              						"kind",
+              						lv_kind_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PseudostateKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getOtherPseudostateAccess().getGreaterThanSignKeyword_5());
+              		
+            }
+            // InternalFormalML.g:8605:3: ( (lv_name_7_0= ruleESIdentifier ) )
+            // InternalFormalML.g:8606:4: (lv_name_7_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:8606:4: (lv_name_7_0= ruleESIdentifier )
+            // InternalFormalML.g:8607:5: lv_name_7_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getOtherPseudostateAccess().getNameESIdentifierParserRuleCall_6_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_76);
+            lv_name_7_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:8624:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt208=2;
+            int LA208_0 = input.LA(1);
+
+            if ( (LA208_0==RULE_STRING) ) {
+                alt208=1;
+            }
+            switch (alt208) {
+                case 1 :
+                    // InternalFormalML.g:8625:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:8625:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:8626:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getOtherPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8643:3: ( (otherlv_9= '{' ( (lv_transition_10_0= ruleTransition ) )* otherlv_11= '}' ) | otherlv_12= ';' )
+            int alt210=2;
+            int LA210_0 = input.LA(1);
+
+            if ( (LA210_0==22) ) {
+                alt210=1;
+            }
+            else if ( (LA210_0==25) ) {
+                alt210=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 210, 0, input);
+
+                throw nvae;
+            }
+            switch (alt210) {
+                case 1 :
+                    // InternalFormalML.g:8644:4: (otherlv_9= '{' ( (lv_transition_10_0= ruleTransition ) )* otherlv_11= '}' )
+                    {
+                    // InternalFormalML.g:8644:4: (otherlv_9= '{' ( (lv_transition_10_0= ruleTransition ) )* otherlv_11= '}' )
+                    // InternalFormalML.g:8645:5: otherlv_9= '{' ( (lv_transition_10_0= ruleTransition ) )* otherlv_11= '}'
+                    {
+                    otherlv_9=(Token)match(input,22,FollowSets000.FOLLOW_93); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_9, grammarAccess.getOtherPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:8649:5: ( (lv_transition_10_0= ruleTransition ) )*
+                    loop209:
+                    do {
+                        int alt209=2;
+                        int LA209_0 = input.LA(1);
+
+                        if ( (LA209_0==131||LA209_0==140) ) {
+                            alt209=1;
+                        }
+
+
+                        switch (alt209) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8650:6: (lv_transition_10_0= ruleTransition )
+                    	    {
+                    	    // InternalFormalML.g:8650:6: (lv_transition_10_0= ruleTransition )
+                    	    // InternalFormalML.g:8651:7: lv_transition_10_0= ruleTransition
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getOtherPseudostateAccess().getTransitionTransitionParserRuleCall_8_0_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_93);
+                    	    lv_transition_10_0=ruleTransition();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getOtherPseudostateRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"transition",
+                    	      								lv_transition_10_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop209;
+                        }
+                    } while (true);
+
+                    otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getOtherPseudostateAccess().getRightCurlyBracketKeyword_8_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8674:4: otherlv_12= ';'
+                    {
+                    otherlv_12=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getOtherPseudostateAccess().getSemicolonKeyword_8_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOtherPseudostate"
+
+
+    // $ANTLR start "entryRulePseudostateInitial"
+    // InternalFormalML.g:8683:1: entryRulePseudostateInitial returns [EObject current=null] : iv_rulePseudostateInitial= rulePseudostateInitial EOF ;
+    public final EObject entryRulePseudostateInitial() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePseudostateInitial = null;
+
+
+        try {
+            // InternalFormalML.g:8683:59: (iv_rulePseudostateInitial= rulePseudostateInitial EOF )
+            // InternalFormalML.g:8684:2: iv_rulePseudostateInitial= rulePseudostateInitial EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPseudostateInitialRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePseudostateInitial=rulePseudostateInitial();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePseudostateInitial; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePseudostateInitial"
+
+
+    // $ANTLR start "rulePseudostateInitial"
+    // InternalFormalML.g:8690:1: rulePseudostateInitial returns [EObject current=null] : ( () ( ( (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateInitialKind ) ) otherlv_6= '>' ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) ) ) | ( ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) ) ) ) ( (lv_unrestrictedName_9_0= ruleUnrestrictedName ) )? ( (otherlv_10= '{' ( (lv_transition_11_0= ruleTransition ) )* otherlv_12= '}' ) | otherlv_13= ';' ) ) ;
+    public final EObject rulePseudostateInitial() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token lv_name_7_2=null;
+        Token lv_name_7_3=null;
+        Token lv_name_8_1=null;
+        Token lv_name_8_2=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_13=null;
+        Enumerator lv_kind_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_7_1 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_9_0 = null;
+
+        EObject lv_transition_11_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:8696:2: ( ( () ( ( (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateInitialKind ) ) otherlv_6= '>' ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) ) ) | ( ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) ) ) ) ( (lv_unrestrictedName_9_0= ruleUnrestrictedName ) )? ( (otherlv_10= '{' ( (lv_transition_11_0= ruleTransition ) )* otherlv_12= '}' ) | otherlv_13= ';' ) ) )
+            // InternalFormalML.g:8697:2: ( () ( ( (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateInitialKind ) ) otherlv_6= '>' ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) ) ) | ( ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) ) ) ) ( (lv_unrestrictedName_9_0= ruleUnrestrictedName ) )? ( (otherlv_10= '{' ( (lv_transition_11_0= ruleTransition ) )* otherlv_12= '}' ) | otherlv_13= ';' ) )
+            {
+            // InternalFormalML.g:8697:2: ( () ( ( (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateInitialKind ) ) otherlv_6= '>' ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) ) ) | ( ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) ) ) ) ( (lv_unrestrictedName_9_0= ruleUnrestrictedName ) )? ( (otherlv_10= '{' ( (lv_transition_11_0= ruleTransition ) )* otherlv_12= '}' ) | otherlv_13= ';' ) )
+            // InternalFormalML.g:8698:3: () ( ( (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateInitialKind ) ) otherlv_6= '>' ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) ) ) | ( ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) ) ) ) ( (lv_unrestrictedName_9_0= ruleUnrestrictedName ) )? ( (otherlv_10= '{' ( (lv_transition_11_0= ruleTransition ) )* otherlv_12= '}' ) | otherlv_13= ';' )
+            {
+            // InternalFormalML.g:8698:3: ()
+            // InternalFormalML.g:8699:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getPseudostateInitialAccess().getPseudostateAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:8708:3: ( ( (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateInitialKind ) ) otherlv_6= '>' ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) ) ) | ( ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) ) ) )
+            int alt215=2;
+            int LA215_0 = input.LA(1);
+
+            if ( (LA215_0==76||LA215_0==89) ) {
+                alt215=1;
+            }
+            else if ( ((LA215_0>=90 && LA215_0<=91)) ) {
+                alt215=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 215, 0, input);
+
+                throw nvae;
+            }
+            switch (alt215) {
+                case 1 :
+                    // InternalFormalML.g:8709:4: ( (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateInitialKind ) ) otherlv_6= '>' ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) ) )
+                    {
+                    // InternalFormalML.g:8709:4: ( (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateInitialKind ) ) otherlv_6= '>' ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) ) )
+                    // InternalFormalML.g:8710:5: (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= rulePseudostateInitialKind ) ) otherlv_6= '>' ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) )
+                    {
+                    // InternalFormalML.g:8710:5: (otherlv_1= 'state' | otherlv_2= 'pseudostate' )
+                    int alt211=2;
+                    int LA211_0 = input.LA(1);
+
+                    if ( (LA211_0==76) ) {
+                        alt211=1;
+                    }
+                    else if ( (LA211_0==89) ) {
+                        alt211=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 211, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt211) {
+                        case 1 :
+                            // InternalFormalML.g:8711:6: otherlv_1= 'state'
+                            {
+                            otherlv_1=(Token)match(input,76,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_1, grammarAccess.getPseudostateInitialAccess().getStateKeyword_1_0_0_0());
+                              					
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:8716:6: otherlv_2= 'pseudostate'
+                            {
+                            otherlv_2=(Token)match(input,89,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_2, grammarAccess.getPseudostateInitialAccess().getPseudostateKeyword_1_0_0_1());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_3=(Token)match(input,16,FollowSets000.FOLLOW_94); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_3, grammarAccess.getPseudostateInitialAccess().getLessThanSignKeyword_1_0_1());
+                      				
+                    }
+                    // InternalFormalML.g:8725:5: (otherlv_4= 'moc:' )?
+                    int alt212=2;
+                    int LA212_0 = input.LA(1);
+
+                    if ( (LA212_0==34) ) {
+                        alt212=1;
+                    }
+                    switch (alt212) {
+                        case 1 :
+                            // InternalFormalML.g:8726:6: otherlv_4= 'moc:'
+                            {
+                            otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_94); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_4, grammarAccess.getPseudostateInitialAccess().getMocKeyword_1_0_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:8731:5: ( (lv_kind_5_0= rulePseudostateInitialKind ) )
+                    // InternalFormalML.g:8732:6: (lv_kind_5_0= rulePseudostateInitialKind )
+                    {
+                    // InternalFormalML.g:8732:6: (lv_kind_5_0= rulePseudostateInitialKind )
+                    // InternalFormalML.g:8733:7: lv_kind_5_0= rulePseudostateInitialKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPseudostateInitialAccess().getKindPseudostateInitialKindEnumRuleCall_1_0_3_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_kind_5_0=rulePseudostateInitialKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
+                      							}
+                      							set(
+                      								current,
+                      								"kind",
+                      								lv_kind_5_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.PseudostateInitialKind");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_6=(Token)match(input,37,FollowSets000.FOLLOW_95); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getPseudostateInitialAccess().getGreaterThanSignKeyword_1_0_4());
+                      				
+                    }
+                    // InternalFormalML.g:8754:5: ( ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) ) )
+                    // InternalFormalML.g:8755:6: ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) )
+                    {
+                    // InternalFormalML.g:8755:6: ( (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' ) )
+                    // InternalFormalML.g:8756:7: (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' )
+                    {
+                    // InternalFormalML.g:8756:7: (lv_name_7_1= ruleESIdentifier | lv_name_7_2= '#initial' | lv_name_7_3= '#init' )
+                    int alt213=3;
+                    switch ( input.LA(1) ) {
+                    case RULE_XLIA_ID:
+                        {
+                        alt213=1;
+                        }
+                        break;
+                    case 90:
+                        {
+                        alt213=2;
+                        }
+                        break;
+                    case 91:
+                        {
+                        alt213=3;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 213, 0, input);
+
+                        throw nvae;
+                    }
+
+                    switch (alt213) {
+                        case 1 :
+                            // InternalFormalML.g:8757:8: lv_name_7_1= ruleESIdentifier
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getPseudostateInitialAccess().getNameESIdentifierParserRuleCall_1_0_5_0_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_76);
+                            lv_name_7_1=ruleESIdentifier();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
+                              								}
+                              								set(
+                              									current,
+                              									"name",
+                              									lv_name_7_1,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:8773:8: lv_name_7_2= '#initial'
+                            {
+                            lv_name_7_2=(Token)match(input,90,FollowSets000.FOLLOW_76); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_name_7_2, grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_0_5_0_1());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getPseudostateInitialRule());
+                              								}
+                              								setWithLastConsumed(current, "name", lv_name_7_2, null);
+                              							
+                            }
+
+                            }
+                            break;
+                        case 3 :
+                            // InternalFormalML.g:8784:8: lv_name_7_3= '#init'
+                            {
+                            lv_name_7_3=(Token)match(input,91,FollowSets000.FOLLOW_76); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_name_7_3, grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_0_5_0_2());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getPseudostateInitialRule());
+                              								}
+                              								setWithLastConsumed(current, "name", lv_name_7_3, null);
+                              							
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8799:4: ( ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) ) )
+                    {
+                    // InternalFormalML.g:8799:4: ( ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) ) )
+                    // InternalFormalML.g:8800:5: ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) )
+                    {
+                    // InternalFormalML.g:8800:5: ( (lv_name_8_1= '#initial' | lv_name_8_2= '#init' ) )
+                    // InternalFormalML.g:8801:6: (lv_name_8_1= '#initial' | lv_name_8_2= '#init' )
+                    {
+                    // InternalFormalML.g:8801:6: (lv_name_8_1= '#initial' | lv_name_8_2= '#init' )
+                    int alt214=2;
+                    int LA214_0 = input.LA(1);
+
+                    if ( (LA214_0==90) ) {
+                        alt214=1;
+                    }
+                    else if ( (LA214_0==91) ) {
+                        alt214=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 214, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt214) {
+                        case 1 :
+                            // InternalFormalML.g:8802:7: lv_name_8_1= '#initial'
+                            {
+                            lv_name_8_1=(Token)match(input,90,FollowSets000.FOLLOW_76); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_name_8_1, grammarAccess.getPseudostateInitialAccess().getNameInitialKeyword_1_1_0_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPseudostateInitialRule());
+                              							}
+                              							setWithLastConsumed(current, "name", lv_name_8_1, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:8813:7: lv_name_8_2= '#init'
+                            {
+                            lv_name_8_2=(Token)match(input,91,FollowSets000.FOLLOW_76); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_name_8_2, grammarAccess.getPseudostateInitialAccess().getNameInitKeyword_1_1_0_1());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getPseudostateInitialRule());
+                              							}
+                              							setWithLastConsumed(current, "name", lv_name_8_2, null);
+                              						
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8827:3: ( (lv_unrestrictedName_9_0= ruleUnrestrictedName ) )?
+            int alt216=2;
+            int LA216_0 = input.LA(1);
+
+            if ( (LA216_0==RULE_STRING) ) {
+                alt216=1;
+            }
+            switch (alt216) {
+                case 1 :
+                    // InternalFormalML.g:8828:4: (lv_unrestrictedName_9_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:8828:4: (lv_unrestrictedName_9_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:8829:5: lv_unrestrictedName_9_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPseudostateInitialAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_unrestrictedName_9_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_9_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8846:3: ( (otherlv_10= '{' ( (lv_transition_11_0= ruleTransition ) )* otherlv_12= '}' ) | otherlv_13= ';' )
+            int alt218=2;
+            int LA218_0 = input.LA(1);
+
+            if ( (LA218_0==22) ) {
+                alt218=1;
+            }
+            else if ( (LA218_0==25) ) {
+                alt218=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 218, 0, input);
+
+                throw nvae;
+            }
+            switch (alt218) {
+                case 1 :
+                    // InternalFormalML.g:8847:4: (otherlv_10= '{' ( (lv_transition_11_0= ruleTransition ) )* otherlv_12= '}' )
+                    {
+                    // InternalFormalML.g:8847:4: (otherlv_10= '{' ( (lv_transition_11_0= ruleTransition ) )* otherlv_12= '}' )
+                    // InternalFormalML.g:8848:5: otherlv_10= '{' ( (lv_transition_11_0= ruleTransition ) )* otherlv_12= '}'
+                    {
+                    otherlv_10=(Token)match(input,22,FollowSets000.FOLLOW_93); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_10, grammarAccess.getPseudostateInitialAccess().getLeftCurlyBracketKeyword_3_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:8852:5: ( (lv_transition_11_0= ruleTransition ) )*
+                    loop217:
+                    do {
+                        int alt217=2;
+                        int LA217_0 = input.LA(1);
+
+                        if ( (LA217_0==131||LA217_0==140) ) {
+                            alt217=1;
+                        }
+
+
+                        switch (alt217) {
+                    	case 1 :
+                    	    // InternalFormalML.g:8853:6: (lv_transition_11_0= ruleTransition )
+                    	    {
+                    	    // InternalFormalML.g:8853:6: (lv_transition_11_0= ruleTransition )
+                    	    // InternalFormalML.g:8854:7: lv_transition_11_0= ruleTransition
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getPseudostateInitialAccess().getTransitionTransitionParserRuleCall_3_0_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_93);
+                    	    lv_transition_11_0=ruleTransition();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getPseudostateInitialRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"transition",
+                    	      								lv_transition_11_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Transition");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop217;
+                        }
+                    } while (true);
+
+                    otherlv_12=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_12, grammarAccess.getPseudostateInitialAccess().getRightCurlyBracketKeyword_3_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8877:4: otherlv_13= ';'
+                    {
+                    otherlv_13=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getPseudostateInitialAccess().getSemicolonKeyword_3_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePseudostateInitial"
+
+
+    // $ANTLR start "entryRuleEndingPseudostate"
+    // InternalFormalML.g:8886:1: entryRuleEndingPseudostate returns [EObject current=null] : iv_ruleEndingPseudostate= ruleEndingPseudostate EOF ;
+    public final EObject entryRuleEndingPseudostate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEndingPseudostate = null;
+
+
+        try {
+            // InternalFormalML.g:8886:58: (iv_ruleEndingPseudostate= ruleEndingPseudostate EOF )
+            // InternalFormalML.g:8887:2: iv_ruleEndingPseudostate= ruleEndingPseudostate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEndingPseudostateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEndingPseudostate=ruleEndingPseudostate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEndingPseudostate; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEndingPseudostate"
+
+
+    // $ANTLR start "ruleEndingPseudostate"
+    // InternalFormalML.g:8893:1: ruleEndingPseudostate returns [EObject current=null] : ( () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= ruleEndingPseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) ;
+    public final EObject ruleEndingPseudostate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_12=null;
+        Enumerator lv_kind_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_moe_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:8899:2: ( ( () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= ruleEndingPseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) )
+            // InternalFormalML.g:8900:2: ( () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= ruleEndingPseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
+            {
+            // InternalFormalML.g:8900:2: ( () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= ruleEndingPseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
+            // InternalFormalML.g:8901:3: () (otherlv_1= 'state' | otherlv_2= 'pseudostate' ) otherlv_3= '<' (otherlv_4= 'moc:' )? ( (lv_kind_5_0= ruleEndingPseudostateKind ) ) otherlv_6= '>' ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' )
+            {
+            // InternalFormalML.g:8901:3: ()
+            // InternalFormalML.g:8902:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getEndingPseudostateAccess().getPseudostateAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:8911:3: (otherlv_1= 'state' | otherlv_2= 'pseudostate' )
+            int alt219=2;
+            int LA219_0 = input.LA(1);
+
+            if ( (LA219_0==76) ) {
+                alt219=1;
+            }
+            else if ( (LA219_0==89) ) {
+                alt219=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 219, 0, input);
+
+                throw nvae;
+            }
+            switch (alt219) {
+                case 1 :
+                    // InternalFormalML.g:8912:4: otherlv_1= 'state'
+                    {
+                    otherlv_1=(Token)match(input,76,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getEndingPseudostateAccess().getStateKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:8917:4: otherlv_2= 'pseudostate'
+                    {
+                    otherlv_2=(Token)match(input,89,FollowSets000.FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getEndingPseudostateAccess().getPseudostateKeyword_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,16,FollowSets000.FOLLOW_96); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getEndingPseudostateAccess().getLessThanSignKeyword_2());
+              		
+            }
+            // InternalFormalML.g:8926:3: (otherlv_4= 'moc:' )?
+            int alt220=2;
+            int LA220_0 = input.LA(1);
+
+            if ( (LA220_0==34) ) {
+                alt220=1;
+            }
+            switch (alt220) {
+                case 1 :
+                    // InternalFormalML.g:8927:4: otherlv_4= 'moc:'
+                    {
+                    otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_96); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getEndingPseudostateAccess().getMocKeyword_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8932:3: ( (lv_kind_5_0= ruleEndingPseudostateKind ) )
+            // InternalFormalML.g:8933:4: (lv_kind_5_0= ruleEndingPseudostateKind )
+            {
+            // InternalFormalML.g:8933:4: (lv_kind_5_0= ruleEndingPseudostateKind )
+            // InternalFormalML.g:8934:5: lv_kind_5_0= ruleEndingPseudostateKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEndingPseudostateAccess().getKindEndingPseudostateKindEnumRuleCall_4_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_23);
+            lv_kind_5_0=ruleEndingPseudostateKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
+              					}
+              					set(
+              						current,
+              						"kind",
+              						lv_kind_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EndingPseudostateKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,37,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getEndingPseudostateAccess().getGreaterThanSignKeyword_5());
+              		
+            }
+            // InternalFormalML.g:8955:3: ( (lv_name_7_0= ruleESIdentifier ) )
+            // InternalFormalML.g:8956:4: (lv_name_7_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:8956:4: (lv_name_7_0= ruleESIdentifier )
+            // InternalFormalML.g:8957:5: lv_name_7_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEndingPseudostateAccess().getNameESIdentifierParserRuleCall_6_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_76);
+            lv_name_7_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:8974:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt221=2;
+            int LA221_0 = input.LA(1);
+
+            if ( (LA221_0==RULE_STRING) ) {
+                alt221=1;
+            }
+            switch (alt221) {
+                case 1 :
+                    // InternalFormalML.g:8975:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:8975:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:8976:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getEndingPseudostateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:8993:3: ( (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' ) | otherlv_12= ';' )
+            int alt223=2;
+            int LA223_0 = input.LA(1);
+
+            if ( (LA223_0==22) ) {
+                alt223=1;
+            }
+            else if ( (LA223_0==25) ) {
+                alt223=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 223, 0, input);
+
+                throw nvae;
+            }
+            switch (alt223) {
+                case 1 :
+                    // InternalFormalML.g:8994:4: (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' )
+                    {
+                    // InternalFormalML.g:8994:4: (otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}' )
+                    // InternalFormalML.g:8995:5: otherlv_9= '{' ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )* otherlv_11= '}'
+                    {
+                    otherlv_9=(Token)match(input,22,FollowSets000.FOLLOW_91); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_9, grammarAccess.getEndingPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:8999:5: ( (lv_moe_10_0= rulemoeFinalStateRoutines ) )*
+                    loop222:
+                    do {
+                        int alt222=2;
+                        int LA222_0 = input.LA(1);
+
+                        if ( ((LA222_0>=79 && LA222_0<=80)) ) {
+                            alt222=1;
+                        }
+
+
+                        switch (alt222) {
+                    	case 1 :
+                    	    // InternalFormalML.g:9000:6: (lv_moe_10_0= rulemoeFinalStateRoutines )
+                    	    {
+                    	    // InternalFormalML.g:9000:6: (lv_moe_10_0= rulemoeFinalStateRoutines )
+                    	    // InternalFormalML.g:9001:7: lv_moe_10_0= rulemoeFinalStateRoutines
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getEndingPseudostateAccess().getMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_91);
+                    	    lv_moe_10_0=rulemoeFinalStateRoutines();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getEndingPseudostateRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"moe",
+                    	      								lv_moe_10_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.moeFinalStateRoutines");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop222;
+                        }
+                    } while (true);
+
+                    otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getEndingPseudostateAccess().getRightCurlyBracketKeyword_8_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9024:4: otherlv_12= ';'
+                    {
+                    otherlv_12=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getEndingPseudostateAccess().getSemicolonKeyword_8_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEndingPseudostate"
+
+
+    // $ANTLR start "entryRuleModelOfExecution"
+    // InternalFormalML.g:9033:1: entryRuleModelOfExecution returns [EObject current=null] : iv_ruleModelOfExecution= ruleModelOfExecution EOF ;
+    public final EObject entryRuleModelOfExecution() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleModelOfExecution = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()
+        	);
+
+        try {
+            // InternalFormalML.g:9037:2: (iv_ruleModelOfExecution= ruleModelOfExecution EOF )
+            // InternalFormalML.g:9038:2: iv_ruleModelOfExecution= ruleModelOfExecution EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getModelOfExecutionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleModelOfExecution=ruleModelOfExecution();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleModelOfExecution; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleModelOfExecution"
+
+
+    // $ANTLR start "ruleModelOfExecution"
+    // InternalFormalML.g:9047:1: ruleModelOfExecution returns [EObject current=null] : ( () otherlv_1= '@moe:' ( (lv_routine_2_0= ruleRoutine ) )* ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) ) ( (lv_routine_20_0= ruleRoutine ) )* ) ;
+    public final EObject ruleModelOfExecution() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_14=null;
+        Token otherlv_16=null;
+        Token otherlv_18=null;
+        EObject lv_routine_2_0 = null;
+
+        EObject lv_initRoutine_5_0 = null;
+
+        EObject lv_finalRoutine_7_0 = null;
+
+        EObject lv_enableRoutine_9_0 = null;
+
+        EObject lv_disableRoutine_11_0 = null;
+
+        EObject lv_concurrencyRoutine_13_0 = null;
+
+        EObject lv_scheduleRoutine_15_0 = null;
+
+        EObject lv_irunRoutine_17_0 = null;
+
+        EObject lv_runRoutine_19_0 = null;
+
+        EObject lv_routine_20_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3()
+        	);
+
+        try {
+            // InternalFormalML.g:9056:2: ( ( () otherlv_1= '@moe:' ( (lv_routine_2_0= ruleRoutine ) )* ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) ) ( (lv_routine_20_0= ruleRoutine ) )* ) )
+            // InternalFormalML.g:9057:2: ( () otherlv_1= '@moe:' ( (lv_routine_2_0= ruleRoutine ) )* ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) ) ( (lv_routine_20_0= ruleRoutine ) )* )
+            {
+            // InternalFormalML.g:9057:2: ( () otherlv_1= '@moe:' ( (lv_routine_2_0= ruleRoutine ) )* ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) ) ( (lv_routine_20_0= ruleRoutine ) )* )
+            // InternalFormalML.g:9058:3: () otherlv_1= '@moe:' ( (lv_routine_2_0= ruleRoutine ) )* ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) ) ( (lv_routine_20_0= ruleRoutine ) )*
+            {
+            // InternalFormalML.g:9058:3: ()
+            // InternalFormalML.g:9059:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getModelOfExecutionAccess().getModelOfExecutionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,69,FollowSets000.FOLLOW_97); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getModelOfExecutionAccess().getMoeKeyword_1());
+              		
+            }
+            // InternalFormalML.g:9072:3: ( (lv_routine_2_0= ruleRoutine ) )*
+            loop224:
+            do {
+                int alt224=2;
+                alt224 = dfa224.predict(input);
+                switch (alt224) {
+            	case 1 :
+            	    // InternalFormalML.g:9073:4: (lv_routine_2_0= ruleRoutine )
+            	    {
+            	    // InternalFormalML.g:9073:4: (lv_routine_2_0= ruleRoutine )
+            	    // InternalFormalML.g:9074:5: lv_routine_2_0= ruleRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_2_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    lv_routine_2_0=ruleRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"routine",
+            	      						lv_routine_2_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop224;
+                }
+            } while (true);
+
+            // InternalFormalML.g:9091:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:9092:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:9092:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* ) )
+            // InternalFormalML.g:9093:5: ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+            // InternalFormalML.g:9096:5: ( ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )* )
+            // InternalFormalML.g:9097:6: ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:9097:6: ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )*
+            loop225:
+            do {
+                int alt225=9;
+                alt225 = dfa225.predict(input);
+                switch (alt225) {
+            	case 1 :
+            	    // InternalFormalML.g:9098:4: ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:9098:4: ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:9099:5: {...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0)");
+            	    }
+            	    // InternalFormalML.g:9099:113: ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:9100:6: ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0);
+            	    // InternalFormalML.g:9103:9: ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:9103:10: {...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "true");
+            	    }
+            	    // InternalFormalML.g:9103:19: (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:9103:20: otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_4=(Token)match(input,78,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_4, grammarAccess.getModelOfExecutionAccess().getInitKeyword_3_0_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:9107:9: ( (lv_initRoutine_5_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:9108:10: (lv_initRoutine_5_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:9108:10: (lv_initRoutine_5_0= rulemoeRoutine )
+            	    // InternalFormalML.g:9109:11: lv_initRoutine_5_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getInitRoutineMoeRoutineParserRuleCall_3_0_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    lv_initRoutine_5_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"initRoutine",
+            	      												lv_initRoutine_5_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:9132:4: ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:9132:4: ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:9133:5: {...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1)");
+            	    }
+            	    // InternalFormalML.g:9133:113: ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:9134:6: ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1);
+            	    // InternalFormalML.g:9137:9: ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:9137:10: {...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "true");
+            	    }
+            	    // InternalFormalML.g:9137:19: (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:9137:20: otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_6=(Token)match(input,79,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_6, grammarAccess.getModelOfExecutionAccess().getFinalKeyword_3_1_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:9141:9: ( (lv_finalRoutine_7_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:9142:10: (lv_finalRoutine_7_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:9142:10: (lv_finalRoutine_7_0= rulemoeRoutine )
+            	    // InternalFormalML.g:9143:11: lv_finalRoutine_7_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getFinalRoutineMoeRoutineParserRuleCall_3_1_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    lv_finalRoutine_7_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"finalRoutine",
+            	      												lv_finalRoutine_7_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:9166:4: ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:9166:4: ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:9167:5: {...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2)");
+            	    }
+            	    // InternalFormalML.g:9167:113: ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:9168:6: ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2);
+            	    // InternalFormalML.g:9171:9: ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:9171:10: {...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "true");
+            	    }
+            	    // InternalFormalML.g:9171:19: (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:9171:20: otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_8=(Token)match(input,80,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_8, grammarAccess.getModelOfExecutionAccess().getEnableKeyword_3_2_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:9175:9: ( (lv_enableRoutine_9_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:9176:10: (lv_enableRoutine_9_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:9176:10: (lv_enableRoutine_9_0= rulemoeRoutine )
+            	    // InternalFormalML.g:9177:11: lv_enableRoutine_9_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getEnableRoutineMoeRoutineParserRuleCall_3_2_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    lv_enableRoutine_9_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"enableRoutine",
+            	      												lv_enableRoutine_9_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:9200:4: ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:9200:4: ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:9201:5: {...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3)");
+            	    }
+            	    // InternalFormalML.g:9201:113: ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:9202:6: ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3);
+            	    // InternalFormalML.g:9205:9: ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:9205:10: {...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "true");
+            	    }
+            	    // InternalFormalML.g:9205:19: (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:9205:20: otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_10=(Token)match(input,81,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_10, grammarAccess.getModelOfExecutionAccess().getDisableKeyword_3_3_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:9209:9: ( (lv_disableRoutine_11_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:9210:10: (lv_disableRoutine_11_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:9210:10: (lv_disableRoutine_11_0= rulemoeRoutine )
+            	    // InternalFormalML.g:9211:11: lv_disableRoutine_11_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getDisableRoutineMoeRoutineParserRuleCall_3_3_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    lv_disableRoutine_11_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"disableRoutine",
+            	      												lv_disableRoutine_11_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 5 :
+            	    // InternalFormalML.g:9234:4: ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:9234:4: ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:9235:5: {...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4)");
+            	    }
+            	    // InternalFormalML.g:9235:113: ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:9236:6: ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4);
+            	    // InternalFormalML.g:9239:9: ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:9239:10: {...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "true");
+            	    }
+            	    // InternalFormalML.g:9239:19: (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:9239:20: otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_12=(Token)match(input,82,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_12, grammarAccess.getModelOfExecutionAccess().getConcurrencyKeyword_3_4_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:9243:9: ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:9244:10: (lv_concurrencyRoutine_13_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:9244:10: (lv_concurrencyRoutine_13_0= rulemoeRoutine )
+            	    // InternalFormalML.g:9245:11: lv_concurrencyRoutine_13_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    lv_concurrencyRoutine_13_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"concurrencyRoutine",
+            	      												lv_concurrencyRoutine_13_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 6 :
+            	    // InternalFormalML.g:9268:4: ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:9268:4: ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:9269:5: {...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5)");
+            	    }
+            	    // InternalFormalML.g:9269:113: ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:9270:6: ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5);
+            	    // InternalFormalML.g:9273:9: ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:9273:10: {...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "true");
+            	    }
+            	    // InternalFormalML.g:9273:19: (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:9273:20: otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_14=(Token)match(input,70,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_14, grammarAccess.getModelOfExecutionAccess().getScheduleKeyword_3_5_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:9277:9: ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:9278:10: (lv_scheduleRoutine_15_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:9278:10: (lv_scheduleRoutine_15_0= rulemoeRoutine )
+            	    // InternalFormalML.g:9279:11: lv_scheduleRoutine_15_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    lv_scheduleRoutine_15_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"scheduleRoutine",
+            	      												lv_scheduleRoutine_15_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 7 :
+            	    // InternalFormalML.g:9302:4: ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:9302:4: ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:9303:5: {...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6)");
+            	    }
+            	    // InternalFormalML.g:9303:113: ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:9304:6: ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6);
+            	    // InternalFormalML.g:9307:9: ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:9307:10: {...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "true");
+            	    }
+            	    // InternalFormalML.g:9307:19: (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:9307:20: otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_16=(Token)match(input,83,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_16, grammarAccess.getModelOfExecutionAccess().getIrunKeyword_3_6_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:9311:9: ( (lv_irunRoutine_17_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:9312:10: (lv_irunRoutine_17_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:9312:10: (lv_irunRoutine_17_0= rulemoeRoutine )
+            	    // InternalFormalML.g:9313:11: lv_irunRoutine_17_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getIrunRoutineMoeRoutineParserRuleCall_3_6_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    lv_irunRoutine_17_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"irunRoutine",
+            	      												lv_irunRoutine_17_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 8 :
+            	    // InternalFormalML.g:9336:4: ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:9336:4: ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) )
+            	    // InternalFormalML.g:9337:5: {...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7)");
+            	    }
+            	    // InternalFormalML.g:9337:113: ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) )
+            	    // InternalFormalML.g:9338:6: ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7);
+            	    // InternalFormalML.g:9341:9: ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) )
+            	    // InternalFormalML.g:9341:10: {...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModelOfExecution", "true");
+            	    }
+            	    // InternalFormalML.g:9341:19: (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) )
+            	    // InternalFormalML.g:9341:20: otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) )
+            	    {
+            	    otherlv_18=(Token)match(input,71,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_18, grammarAccess.getModelOfExecutionAccess().getRunKeyword_3_7_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:9345:9: ( (lv_runRoutine_19_0= rulemoeRoutine ) )
+            	    // InternalFormalML.g:9346:10: (lv_runRoutine_19_0= rulemoeRoutine )
+            	    {
+            	    // InternalFormalML.g:9346:10: (lv_runRoutine_19_0= rulemoeRoutine )
+            	    // InternalFormalML.g:9347:11: lv_runRoutine_19_0= rulemoeRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_3_7_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_97);
+            	    lv_runRoutine_19_0=rulemoeRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"runRoutine",
+            	      												lv_runRoutine_19_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop225;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3());
+
+            }
+
+            // InternalFormalML.g:9377:3: ( (lv_routine_20_0= ruleRoutine ) )*
+            loop226:
+            do {
+                int alt226=2;
+                int LA226_0 = input.LA(1);
+
+                if ( (LA226_0==19||(LA226_0>=93 && LA226_0<=94)||(LA226_0>=240 && LA226_0<=242)) ) {
+                    alt226=1;
+                }
+
+
+                switch (alt226) {
+            	case 1 :
+            	    // InternalFormalML.g:9378:4: (lv_routine_20_0= ruleRoutine )
+            	    {
+            	    // InternalFormalML.g:9378:4: (lv_routine_20_0= ruleRoutine )
+            	    // InternalFormalML.g:9379:5: lv_routine_20_0= ruleRoutine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_4_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_98);
+            	    lv_routine_20_0=ruleRoutine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getModelOfExecutionRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"routine",
+            	      						lv_routine_20_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Routine");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop226;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleModelOfExecution"
+
+
+    // $ANTLR start "entryRulemoeRoutine"
+    // InternalFormalML.g:9403:1: entryRulemoeRoutine returns [EObject current=null] : iv_rulemoeRoutine= rulemoeRoutine EOF ;
+    public final EObject entryRulemoeRoutine() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulemoeRoutine = null;
+
+
+        try {
+            // InternalFormalML.g:9403:51: (iv_rulemoeRoutine= rulemoeRoutine EOF )
+            // InternalFormalML.g:9404:2: iv_rulemoeRoutine= rulemoeRoutine EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMoeRoutineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulemoeRoutine=rulemoeRoutine();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulemoeRoutine; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulemoeRoutine"
+
+
+    // $ANTLR start "rulemoeRoutine"
+    // InternalFormalML.g:9410:1: rulemoeRoutine returns [EObject current=null] : ( () (otherlv_1= '(' ( (lv_domain_2_0= ruleFunctionalParameterSet ) )? otherlv_3= ')' )? (otherlv_4= '->' ( (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' ) | ( (lv_codomain_8_0= ruleFunctionalParameterSet ) ) ) )? ( (lv_bodyBlock_9_0= ruleBlockStatement ) ) ) ;
+    public final EObject rulemoeRoutine() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        EObject lv_domain_2_0 = null;
+
+        EObject lv_codomain_6_0 = null;
+
+        EObject lv_codomain_8_0 = null;
+
+        EObject lv_bodyBlock_9_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:9416:2: ( ( () (otherlv_1= '(' ( (lv_domain_2_0= ruleFunctionalParameterSet ) )? otherlv_3= ')' )? (otherlv_4= '->' ( (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' ) | ( (lv_codomain_8_0= ruleFunctionalParameterSet ) ) ) )? ( (lv_bodyBlock_9_0= ruleBlockStatement ) ) ) )
+            // InternalFormalML.g:9417:2: ( () (otherlv_1= '(' ( (lv_domain_2_0= ruleFunctionalParameterSet ) )? otherlv_3= ')' )? (otherlv_4= '->' ( (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' ) | ( (lv_codomain_8_0= ruleFunctionalParameterSet ) ) ) )? ( (lv_bodyBlock_9_0= ruleBlockStatement ) ) )
+            {
+            // InternalFormalML.g:9417:2: ( () (otherlv_1= '(' ( (lv_domain_2_0= ruleFunctionalParameterSet ) )? otherlv_3= ')' )? (otherlv_4= '->' ( (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' ) | ( (lv_codomain_8_0= ruleFunctionalParameterSet ) ) ) )? ( (lv_bodyBlock_9_0= ruleBlockStatement ) ) )
+            // InternalFormalML.g:9418:3: () (otherlv_1= '(' ( (lv_domain_2_0= ruleFunctionalParameterSet ) )? otherlv_3= ')' )? (otherlv_4= '->' ( (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' ) | ( (lv_codomain_8_0= ruleFunctionalParameterSet ) ) ) )? ( (lv_bodyBlock_9_0= ruleBlockStatement ) )
+            {
+            // InternalFormalML.g:9418:3: ()
+            // InternalFormalML.g:9419:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getMoeRoutineAccess().getRoutineAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:9428:3: (otherlv_1= '(' ( (lv_domain_2_0= ruleFunctionalParameterSet ) )? otherlv_3= ')' )?
+            int alt228=2;
+            int LA228_0 = input.LA(1);
+
+            if ( (LA228_0==56) ) {
+                alt228=1;
+            }
+            switch (alt228) {
+                case 1 :
+                    // InternalFormalML.g:9429:4: otherlv_1= '(' ( (lv_domain_2_0= ruleFunctionalParameterSet ) )? otherlv_3= ')'
+                    {
+                    otherlv_1=(Token)match(input,56,FollowSets000.FOLLOW_45); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_1_0());
+                      			
+                    }
+                    // InternalFormalML.g:9433:4: ( (lv_domain_2_0= ruleFunctionalParameterSet ) )?
+                    int alt227=2;
+                    int LA227_0 = input.LA(1);
+
+                    if ( (LA227_0==RULE_XLIA_ID||LA227_0==28||LA227_0==53||LA227_0==62||LA227_0==64||(LA227_0>=102 && LA227_0<=105)||(LA227_0>=107 && LA227_0<=127)||(LA227_0>=136 && LA227_0<=138)||LA227_0==212||(LA227_0>=216 && LA227_0<=217)||(LA227_0>=260 && LA227_0<=270)) ) {
+                        alt227=1;
+                    }
+                    switch (alt227) {
+                        case 1 :
+                            // InternalFormalML.g:9434:5: (lv_domain_2_0= ruleFunctionalParameterSet )
+                            {
+                            // InternalFormalML.g:9434:5: (lv_domain_2_0= ruleFunctionalParameterSet )
+                            // InternalFormalML.g:9435:6: lv_domain_2_0= ruleFunctionalParameterSet
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getMoeRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_1_1_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_99);
+                            lv_domain_2_0=ruleFunctionalParameterSet();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
+                              						}
+                              						set(
+                              							current,
+                              							"domain",
+                              							lv_domain_2_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_3=(Token)match(input,57,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_1_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:9457:3: (otherlv_4= '->' ( (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' ) | ( (lv_codomain_8_0= ruleFunctionalParameterSet ) ) ) )?
+            int alt230=2;
+            int LA230_0 = input.LA(1);
+
+            if ( (LA230_0==92) ) {
+                alt230=1;
+            }
+            switch (alt230) {
+                case 1 :
+                    // InternalFormalML.g:9458:4: otherlv_4= '->' ( (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' ) | ( (lv_codomain_8_0= ruleFunctionalParameterSet ) ) )
+                    {
+                    otherlv_4=(Token)match(input,92,FollowSets000.FOLLOW_48); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getMoeRoutineAccess().getHyphenMinusGreaterThanSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:9462:4: ( (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' ) | ( (lv_codomain_8_0= ruleFunctionalParameterSet ) ) )
+                    int alt229=2;
+                    int LA229_0 = input.LA(1);
+
+                    if ( (LA229_0==56) ) {
+                        alt229=1;
+                    }
+                    else if ( (LA229_0==RULE_XLIA_ID||LA229_0==28||LA229_0==53||LA229_0==62||LA229_0==64||(LA229_0>=102 && LA229_0<=105)||(LA229_0>=107 && LA229_0<=127)||(LA229_0>=136 && LA229_0<=138)||LA229_0==212||(LA229_0>=216 && LA229_0<=217)||(LA229_0>=260 && LA229_0<=270)) ) {
+                        alt229=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 229, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt229) {
+                        case 1 :
+                            // InternalFormalML.g:9463:5: (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' )
+                            {
+                            // InternalFormalML.g:9463:5: (otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')' )
+                            // InternalFormalML.g:9464:6: otherlv_5= '(' ( (lv_codomain_6_0= ruleFunctionalParameterSet ) ) otherlv_7= ')'
+                            {
+                            otherlv_5=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_5, grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_2_1_0_0());
+                              					
+                            }
+                            // InternalFormalML.g:9468:6: ( (lv_codomain_6_0= ruleFunctionalParameterSet ) )
+                            // InternalFormalML.g:9469:7: (lv_codomain_6_0= ruleFunctionalParameterSet )
+                            {
+                            // InternalFormalML.g:9469:7: (lv_codomain_6_0= ruleFunctionalParameterSet )
+                            // InternalFormalML.g:9470:8: lv_codomain_6_0= ruleFunctionalParameterSet
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_0_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_99);
+                            lv_codomain_6_0=ruleFunctionalParameterSet();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
+                              								}
+                              								set(
+                              									current,
+                              									"codomain",
+                              									lv_codomain_6_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_7=(Token)match(input,57,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_7, grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_2_1_0_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:9493:5: ( (lv_codomain_8_0= ruleFunctionalParameterSet ) )
+                            {
+                            // InternalFormalML.g:9493:5: ( (lv_codomain_8_0= ruleFunctionalParameterSet ) )
+                            // InternalFormalML.g:9494:6: (lv_codomain_8_0= ruleFunctionalParameterSet )
+                            {
+                            // InternalFormalML.g:9494:6: (lv_codomain_8_0= ruleFunctionalParameterSet )
+                            // InternalFormalML.g:9495:7: lv_codomain_8_0= ruleFunctionalParameterSet
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getMoeRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_2_1_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_61);
+                            lv_codomain_8_0=ruleFunctionalParameterSet();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
+                              							}
+                              							set(
+                              								current,
+                              								"codomain",
+                              								lv_codomain_8_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:9514:3: ( (lv_bodyBlock_9_0= ruleBlockStatement ) )
+            // InternalFormalML.g:9515:4: (lv_bodyBlock_9_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:9515:4: (lv_bodyBlock_9_0= ruleBlockStatement )
+            // InternalFormalML.g:9516:5: lv_bodyBlock_9_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getMoeRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_bodyBlock_9_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getMoeRoutineRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_9_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulemoeRoutine"
+
+
+    // $ANTLR start "entryRuleRoutine"
+    // InternalFormalML.g:9537:1: entryRuleRoutine returns [EObject current=null] : iv_ruleRoutine= ruleRoutine EOF ;
+    public final EObject entryRuleRoutine() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleRoutine = null;
+
+
+        try {
+            // InternalFormalML.g:9537:48: (iv_ruleRoutine= ruleRoutine EOF )
+            // InternalFormalML.g:9538:2: iv_ruleRoutine= ruleRoutine EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getRoutineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleRoutine=ruleRoutine();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleRoutine; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleRoutine"
+
+
+    // $ANTLR start "ruleRoutine"
+    // InternalFormalML.g:9544:1: ruleRoutine returns [EObject current=null] : ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? (otherlv_1= 'macro' )? otherlv_2= 'routine' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_domain_6_0= ruleFunctionalParameterSet ) )? otherlv_7= ')' )? (otherlv_8= '-->' ( (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' ) | ( (lv_codomain_12_0= ruleFormalParameterSet ) ) ) )? ( (lv_bodyBlock_13_0= ruleBlockStatement ) ) ) ;
+    public final EObject ruleRoutine() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        EObject lv_domain_6_0 = null;
+
+        EObject lv_codomain_10_0 = null;
+
+        EObject lv_codomain_12_0 = null;
+
+        EObject lv_bodyBlock_13_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:9550:2: ( ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? (otherlv_1= 'macro' )? otherlv_2= 'routine' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_domain_6_0= ruleFunctionalParameterSet ) )? otherlv_7= ')' )? (otherlv_8= '-->' ( (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' ) | ( (lv_codomain_12_0= ruleFormalParameterSet ) ) ) )? ( (lv_bodyBlock_13_0= ruleBlockStatement ) ) ) )
+            // InternalFormalML.g:9551:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? (otherlv_1= 'macro' )? otherlv_2= 'routine' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_domain_6_0= ruleFunctionalParameterSet ) )? otherlv_7= ')' )? (otherlv_8= '-->' ( (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' ) | ( (lv_codomain_12_0= ruleFormalParameterSet ) ) ) )? ( (lv_bodyBlock_13_0= ruleBlockStatement ) ) )
+            {
+            // InternalFormalML.g:9551:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? (otherlv_1= 'macro' )? otherlv_2= 'routine' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_domain_6_0= ruleFunctionalParameterSet ) )? otherlv_7= ')' )? (otherlv_8= '-->' ( (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' ) | ( (lv_codomain_12_0= ruleFormalParameterSet ) ) ) )? ( (lv_bodyBlock_13_0= ruleBlockStatement ) ) )
+            // InternalFormalML.g:9552:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )? (otherlv_1= 'macro' )? otherlv_2= 'routine' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_domain_6_0= ruleFunctionalParameterSet ) )? otherlv_7= ')' )? (otherlv_8= '-->' ( (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' ) | ( (lv_codomain_12_0= ruleFormalParameterSet ) ) ) )? ( (lv_bodyBlock_13_0= ruleBlockStatement ) )
+            {
+            // InternalFormalML.g:9552:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )?
+            int alt231=2;
+            int LA231_0 = input.LA(1);
+
+            if ( (LA231_0==19||(LA231_0>=240 && LA231_0<=242)) ) {
+                alt231=1;
+            }
+            switch (alt231) {
+                case 1 :
+                    // InternalFormalML.g:9553:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:9553:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    // InternalFormalML.g:9554:5: lv_visibility_0_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getRoutineAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_100);
+                    lv_visibility_0_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getRoutineRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:9571:3: (otherlv_1= 'macro' )?
+            int alt232=2;
+            int LA232_0 = input.LA(1);
+
+            if ( (LA232_0==93) ) {
+                alt232=1;
+            }
+            switch (alt232) {
+                case 1 :
+                    // InternalFormalML.g:9572:4: otherlv_1= 'macro'
+                    {
+                    otherlv_1=(Token)match(input,93,FollowSets000.FOLLOW_101); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getRoutineAccess().getMacroKeyword_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,94,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getRoutineAccess().getRoutineKeyword_2());
+              		
+            }
+            // InternalFormalML.g:9581:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:9582:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:9582:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:9583:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getRoutineAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_102);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getRoutineRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:9600:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt233=2;
+            int LA233_0 = input.LA(1);
+
+            if ( (LA233_0==RULE_STRING) ) {
+                alt233=1;
+            }
+            switch (alt233) {
+                case 1 :
+                    // InternalFormalML.g:9601:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:9601:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:9602:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getRoutineAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_103);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getRoutineRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:9619:3: (otherlv_5= '(' ( (lv_domain_6_0= ruleFunctionalParameterSet ) )? otherlv_7= ')' )?
+            int alt235=2;
+            int LA235_0 = input.LA(1);
+
+            if ( (LA235_0==56) ) {
+                alt235=1;
+            }
+            switch (alt235) {
+                case 1 :
+                    // InternalFormalML.g:9620:4: otherlv_5= '(' ( (lv_domain_6_0= ruleFunctionalParameterSet ) )? otherlv_7= ')'
+                    {
+                    otherlv_5=(Token)match(input,56,FollowSets000.FOLLOW_45); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_5_0());
+                      			
+                    }
+                    // InternalFormalML.g:9624:4: ( (lv_domain_6_0= ruleFunctionalParameterSet ) )?
+                    int alt234=2;
+                    int LA234_0 = input.LA(1);
+
+                    if ( (LA234_0==RULE_XLIA_ID||LA234_0==28||LA234_0==53||LA234_0==62||LA234_0==64||(LA234_0>=102 && LA234_0<=105)||(LA234_0>=107 && LA234_0<=127)||(LA234_0>=136 && LA234_0<=138)||LA234_0==212||(LA234_0>=216 && LA234_0<=217)||(LA234_0>=260 && LA234_0<=270)) ) {
+                        alt234=1;
+                    }
+                    switch (alt234) {
+                        case 1 :
+                            // InternalFormalML.g:9625:5: (lv_domain_6_0= ruleFunctionalParameterSet )
+                            {
+                            // InternalFormalML.g:9625:5: (lv_domain_6_0= ruleFunctionalParameterSet )
+                            // InternalFormalML.g:9626:6: lv_domain_6_0= ruleFunctionalParameterSet
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getRoutineAccess().getDomainFunctionalParameterSetParserRuleCall_5_1_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_99);
+                            lv_domain_6_0=ruleFunctionalParameterSet();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getRoutineRule());
+                              						}
+                              						set(
+                              							current,
+                              							"domain",
+                              							lv_domain_6_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_7=(Token)match(input,57,FollowSets000.FOLLOW_103); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getRoutineAccess().getRightParenthesisKeyword_5_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:9648:3: (otherlv_8= '-->' ( (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' ) | ( (lv_codomain_12_0= ruleFormalParameterSet ) ) ) )?
+            int alt237=2;
+            int LA237_0 = input.LA(1);
+
+            if ( (LA237_0==59) ) {
+                alt237=1;
+            }
+            switch (alt237) {
+                case 1 :
+                    // InternalFormalML.g:9649:4: otherlv_8= '-->' ( (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' ) | ( (lv_codomain_12_0= ruleFormalParameterSet ) ) )
+                    {
+                    otherlv_8=(Token)match(input,59,FollowSets000.FOLLOW_48); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getRoutineAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0());
+                      			
+                    }
+                    // InternalFormalML.g:9653:4: ( (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' ) | ( (lv_codomain_12_0= ruleFormalParameterSet ) ) )
+                    int alt236=2;
+                    int LA236_0 = input.LA(1);
+
+                    if ( (LA236_0==56) ) {
+                        alt236=1;
+                    }
+                    else if ( (LA236_0==RULE_XLIA_ID||LA236_0==28||LA236_0==53||LA236_0==62||LA236_0==64||(LA236_0>=102 && LA236_0<=105)||(LA236_0>=107 && LA236_0<=127)||(LA236_0>=136 && LA236_0<=138)||LA236_0==212||(LA236_0>=216 && LA236_0<=217)||(LA236_0>=260 && LA236_0<=270)) ) {
+                        alt236=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 236, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt236) {
+                        case 1 :
+                            // InternalFormalML.g:9654:5: (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' )
+                            {
+                            // InternalFormalML.g:9654:5: (otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')' )
+                            // InternalFormalML.g:9655:6: otherlv_9= '(' ( (lv_codomain_10_0= ruleFunctionalParameterSet ) ) otherlv_11= ')'
+                            {
+                            otherlv_9=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_9, grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_6_1_0_0());
+                              					
+                            }
+                            // InternalFormalML.g:9659:6: ( (lv_codomain_10_0= ruleFunctionalParameterSet ) )
+                            // InternalFormalML.g:9660:7: (lv_codomain_10_0= ruleFunctionalParameterSet )
+                            {
+                            // InternalFormalML.g:9660:7: (lv_codomain_10_0= ruleFunctionalParameterSet )
+                            // InternalFormalML.g:9661:8: lv_codomain_10_0= ruleFunctionalParameterSet
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getRoutineAccess().getCodomainFunctionalParameterSetParserRuleCall_6_1_0_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_99);
+                            lv_codomain_10_0=ruleFunctionalParameterSet();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getRoutineRule());
+                              								}
+                              								set(
+                              									current,
+                              									"codomain",
+                              									lv_codomain_10_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_11=(Token)match(input,57,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_11, grammarAccess.getRoutineAccess().getRightParenthesisKeyword_6_1_0_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:9684:5: ( (lv_codomain_12_0= ruleFormalParameterSet ) )
+                            {
+                            // InternalFormalML.g:9684:5: ( (lv_codomain_12_0= ruleFormalParameterSet ) )
+                            // InternalFormalML.g:9685:6: (lv_codomain_12_0= ruleFormalParameterSet )
+                            {
+                            // InternalFormalML.g:9685:6: (lv_codomain_12_0= ruleFormalParameterSet )
+                            // InternalFormalML.g:9686:7: lv_codomain_12_0= ruleFormalParameterSet
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getRoutineAccess().getCodomainFormalParameterSetParserRuleCall_6_1_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_61);
+                            lv_codomain_12_0=ruleFormalParameterSet();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getRoutineRule());
+                              							}
+                              							set(
+                              								current,
+                              								"codomain",
+                              								lv_codomain_12_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:9705:3: ( (lv_bodyBlock_13_0= ruleBlockStatement ) )
+            // InternalFormalML.g:9706:4: (lv_bodyBlock_13_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:9706:4: (lv_bodyBlock_13_0= ruleBlockStatement )
+            // InternalFormalML.g:9707:5: lv_bodyBlock_13_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getRoutineAccess().getBodyBlockBlockStatementParserRuleCall_7_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_bodyBlock_13_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getRoutineRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_13_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleRoutine"
+
+
+    // $ANTLR start "entryRuleModelOfInteraction"
+    // InternalFormalML.g:9728:1: entryRuleModelOfInteraction returns [EObject current=null] : iv_ruleModelOfInteraction= ruleModelOfInteraction EOF ;
+    public final EObject entryRuleModelOfInteraction() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleModelOfInteraction = null;
+
+
+        try {
+            // InternalFormalML.g:9728:59: (iv_ruleModelOfInteraction= ruleModelOfInteraction EOF )
+            // InternalFormalML.g:9729:2: iv_ruleModelOfInteraction= ruleModelOfInteraction EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getModelOfInteractionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleModelOfInteraction=ruleModelOfInteraction();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleModelOfInteraction; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleModelOfInteraction"
+
+
+    // $ANTLR start "ruleModelOfInteraction"
+    // InternalFormalML.g:9735:1: ruleModelOfInteraction returns [EObject current=null] : ( () otherlv_1= '@com:' ( ( (lv_routes_2_0= ruleRoute ) ) | ( (lv_connections_3_0= ruleConnection ) ) )* ) ;
+    public final EObject ruleModelOfInteraction() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_routes_2_0 = null;
+
+        EObject lv_connections_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:9741:2: ( ( () otherlv_1= '@com:' ( ( (lv_routes_2_0= ruleRoute ) ) | ( (lv_connections_3_0= ruleConnection ) ) )* ) )
+            // InternalFormalML.g:9742:2: ( () otherlv_1= '@com:' ( ( (lv_routes_2_0= ruleRoute ) ) | ( (lv_connections_3_0= ruleConnection ) ) )* )
+            {
+            // InternalFormalML.g:9742:2: ( () otherlv_1= '@com:' ( ( (lv_routes_2_0= ruleRoute ) ) | ( (lv_connections_3_0= ruleConnection ) ) )* )
+            // InternalFormalML.g:9743:3: () otherlv_1= '@com:' ( ( (lv_routes_2_0= ruleRoute ) ) | ( (lv_connections_3_0= ruleConnection ) ) )*
+            {
+            // InternalFormalML.g:9743:3: ()
+            // InternalFormalML.g:9744:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getModelOfInteractionAccess().getModelOfInteractionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,95,FollowSets000.FOLLOW_104); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getModelOfInteractionAccess().getComKeyword_1());
+              		
+            }
+            // InternalFormalML.g:9757:3: ( ( (lv_routes_2_0= ruleRoute ) ) | ( (lv_connections_3_0= ruleConnection ) ) )*
+            loop238:
+            do {
+                int alt238=3;
+                int LA238_0 = input.LA(1);
+
+                if ( (LA238_0==96) ) {
+                    alt238=1;
+                }
+                else if ( (LA238_0==100) ) {
+                    alt238=2;
+                }
+
+
+                switch (alt238) {
+            	case 1 :
+            	    // InternalFormalML.g:9758:4: ( (lv_routes_2_0= ruleRoute ) )
+            	    {
+            	    // InternalFormalML.g:9758:4: ( (lv_routes_2_0= ruleRoute ) )
+            	    // InternalFormalML.g:9759:5: (lv_routes_2_0= ruleRoute )
+            	    {
+            	    // InternalFormalML.g:9759:5: (lv_routes_2_0= ruleRoute )
+            	    // InternalFormalML.g:9760:6: lv_routes_2_0= ruleRoute
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getModelOfInteractionAccess().getRoutesRouteParserRuleCall_2_0_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_104);
+            	    lv_routes_2_0=ruleRoute();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getModelOfInteractionRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"routes",
+            	      							lv_routes_2_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Route");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:9778:4: ( (lv_connections_3_0= ruleConnection ) )
+            	    {
+            	    // InternalFormalML.g:9778:4: ( (lv_connections_3_0= ruleConnection ) )
+            	    // InternalFormalML.g:9779:5: (lv_connections_3_0= ruleConnection )
+            	    {
+            	    // InternalFormalML.g:9779:5: (lv_connections_3_0= ruleConnection )
+            	    // InternalFormalML.g:9780:6: lv_connections_3_0= ruleConnection
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getModelOfInteractionAccess().getConnectionsConnectionParserRuleCall_2_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_104);
+            	    lv_connections_3_0=ruleConnection();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getModelOfInteractionRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"connections",
+            	      							lv_connections_3_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Connection");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop238;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleModelOfInteraction"
+
+
+    // $ANTLR start "entryRuleRoute"
+    // InternalFormalML.g:9802:1: entryRuleRoute returns [EObject current=null] : iv_ruleRoute= ruleRoute EOF ;
+    public final EObject entryRuleRoute() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleRoute = null;
+
+
+        try {
+            // InternalFormalML.g:9802:46: (iv_ruleRoute= ruleRoute EOF )
+            // InternalFormalML.g:9803:2: iv_ruleRoute= ruleRoute EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getRouteRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleRoute=ruleRoute();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleRoute; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleRoute"
+
+
+    // $ANTLR start "ruleRoute"
+    // InternalFormalML.g:9809:1: ruleRoute returns [EObject current=null] : ( () otherlv_1= 'route' otherlv_2= '<' ( (lv_protocol_3_0= ruleComRouteProtocol ) ) otherlv_4= '>' ( ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? )? otherlv_7= '[' (otherlv_8= '*' | ( ( ( ruleESUfid ) ) (otherlv_10= ',' ( ( ruleESUfid ) ) )* ) ) otherlv_12= ']' otherlv_13= ';' ) ;
+    public final EObject ruleRoute() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_13=null;
+        EObject lv_protocol_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:9815:2: ( ( () otherlv_1= 'route' otherlv_2= '<' ( (lv_protocol_3_0= ruleComRouteProtocol ) ) otherlv_4= '>' ( ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? )? otherlv_7= '[' (otherlv_8= '*' | ( ( ( ruleESUfid ) ) (otherlv_10= ',' ( ( ruleESUfid ) ) )* ) ) otherlv_12= ']' otherlv_13= ';' ) )
+            // InternalFormalML.g:9816:2: ( () otherlv_1= 'route' otherlv_2= '<' ( (lv_protocol_3_0= ruleComRouteProtocol ) ) otherlv_4= '>' ( ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? )? otherlv_7= '[' (otherlv_8= '*' | ( ( ( ruleESUfid ) ) (otherlv_10= ',' ( ( ruleESUfid ) ) )* ) ) otherlv_12= ']' otherlv_13= ';' )
+            {
+            // InternalFormalML.g:9816:2: ( () otherlv_1= 'route' otherlv_2= '<' ( (lv_protocol_3_0= ruleComRouteProtocol ) ) otherlv_4= '>' ( ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? )? otherlv_7= '[' (otherlv_8= '*' | ( ( ( ruleESUfid ) ) (otherlv_10= ',' ( ( ruleESUfid ) ) )* ) ) otherlv_12= ']' otherlv_13= ';' )
+            // InternalFormalML.g:9817:3: () otherlv_1= 'route' otherlv_2= '<' ( (lv_protocol_3_0= ruleComRouteProtocol ) ) otherlv_4= '>' ( ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? )? otherlv_7= '[' (otherlv_8= '*' | ( ( ( ruleESUfid ) ) (otherlv_10= ',' ( ( ruleESUfid ) ) )* ) ) otherlv_12= ']' otherlv_13= ';'
+            {
+            // InternalFormalML.g:9817:3: ()
+            // InternalFormalML.g:9818:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getRouteAccess().getRouteAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,96,FollowSets000.FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getRouteAccess().getRouteKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_105); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getRouteAccess().getLessThanSignKeyword_2());
+              		
+            }
+            // InternalFormalML.g:9835:3: ( (lv_protocol_3_0= ruleComRouteProtocol ) )
+            // InternalFormalML.g:9836:4: (lv_protocol_3_0= ruleComRouteProtocol )
+            {
+            // InternalFormalML.g:9836:4: (lv_protocol_3_0= ruleComRouteProtocol )
+            // InternalFormalML.g:9837:5: lv_protocol_3_0= ruleComRouteProtocol
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getRouteAccess().getProtocolComRouteProtocolParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_23);
+            lv_protocol_3_0=ruleComRouteProtocol();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getRouteRule());
+              					}
+              					set(
+              						current,
+              						"protocol",
+              						lv_protocol_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ComRouteProtocol");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,37,FollowSets000.FOLLOW_106); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getRouteAccess().getGreaterThanSignKeyword_4());
+              		
+            }
+            // InternalFormalML.g:9858:3: ( ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? )?
+            int alt240=2;
+            int LA240_0 = input.LA(1);
+
+            if ( (LA240_0==RULE_XLIA_ID) ) {
+                alt240=1;
+            }
+            switch (alt240) {
+                case 1 :
+                    // InternalFormalML.g:9859:4: ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )?
+                    {
+                    // InternalFormalML.g:9859:4: ( (lv_name_5_0= ruleESIdentifier ) )
+                    // InternalFormalML.g:9860:5: (lv_name_5_0= ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:9860:5: (lv_name_5_0= ruleESIdentifier )
+                    // InternalFormalML.g:9861:6: lv_name_5_0= ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getRouteAccess().getNameESIdentifierParserRuleCall_5_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_107);
+                    lv_name_5_0=ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getRouteRule());
+                      						}
+                      						set(
+                      							current,
+                      							"name",
+                      							lv_name_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:9878:4: ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )?
+                    int alt239=2;
+                    int LA239_0 = input.LA(1);
+
+                    if ( (LA239_0==RULE_STRING) ) {
+                        alt239=1;
+                    }
+                    switch (alt239) {
+                        case 1 :
+                            // InternalFormalML.g:9879:5: (lv_unrestrictedName_6_0= ruleUnrestrictedName )
+                            {
+                            // InternalFormalML.g:9879:5: (lv_unrestrictedName_6_0= ruleUnrestrictedName )
+                            // InternalFormalML.g:9880:6: lv_unrestrictedName_6_0= ruleUnrestrictedName
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getRouteAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_108);
+                            lv_unrestrictedName_6_0=ruleUnrestrictedName();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getRouteRule());
+                              						}
+                              						set(
+                              							current,
+                              							"unrestrictedName",
+                              							lv_unrestrictedName_6_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_7=(Token)match(input,97,FollowSets000.FOLLOW_109); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_7, grammarAccess.getRouteAccess().getLeftSquareBracketKeyword_6());
+              		
+            }
+            // InternalFormalML.g:9902:3: (otherlv_8= '*' | ( ( ( ruleESUfid ) ) (otherlv_10= ',' ( ( ruleESUfid ) ) )* ) )
+            int alt242=2;
+            int LA242_0 = input.LA(1);
+
+            if ( (LA242_0==98) ) {
+                alt242=1;
+            }
+            else if ( (LA242_0==RULE_XLIA_ID) ) {
+                alt242=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 242, 0, input);
+
+                throw nvae;
+            }
+            switch (alt242) {
+                case 1 :
+                    // InternalFormalML.g:9903:4: otherlv_8= '*'
+                    {
+                    otherlv_8=(Token)match(input,98,FollowSets000.FOLLOW_110); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getRouteAccess().getAsteriskKeyword_7_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:9908:4: ( ( ( ruleESUfid ) ) (otherlv_10= ',' ( ( ruleESUfid ) ) )* )
+                    {
+                    // InternalFormalML.g:9908:4: ( ( ( ruleESUfid ) ) (otherlv_10= ',' ( ( ruleESUfid ) ) )* )
+                    // InternalFormalML.g:9909:5: ( ( ruleESUfid ) ) (otherlv_10= ',' ( ( ruleESUfid ) ) )*
+                    {
+                    // InternalFormalML.g:9909:5: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:9910:6: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:9910:6: ( ruleESUfid )
+                    // InternalFormalML.g:9911:7: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							/* */
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getRouteRule());
+                      							}
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_0_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_111);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:9928:5: (otherlv_10= ',' ( ( ruleESUfid ) ) )*
+                    loop241:
+                    do {
+                        int alt241=2;
+                        int LA241_0 = input.LA(1);
+
+                        if ( (LA241_0==20) ) {
+                            alt241=1;
+                        }
+
+
+                        switch (alt241) {
+                    	case 1 :
+                    	    // InternalFormalML.g:9929:6: otherlv_10= ',' ( ( ruleESUfid ) )
+                    	    {
+                    	    otherlv_10=(Token)match(input,20,FollowSets000.FOLLOW_35); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_10, grammarAccess.getRouteAccess().getCommaKeyword_7_1_1_0());
+                    	      					
+                    	    }
+                    	    // InternalFormalML.g:9933:6: ( ( ruleESUfid ) )
+                    	    // InternalFormalML.g:9934:7: ( ruleESUfid )
+                    	    {
+                    	    // InternalFormalML.g:9934:7: ( ruleESUfid )
+                    	    // InternalFormalML.g:9935:8: ruleESUfid
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								/* */
+                    	      							
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElement(grammarAccess.getRouteRule());
+                    	      								}
+                    	      							
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getRouteAccess().getSignalsSignalCrossReference_7_1_1_1_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_111);
+                    	    ruleESUfid();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop241;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_12=(Token)match(input,99,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_12, grammarAccess.getRouteAccess().getRightSquareBracketKeyword_8());
+              		
+            }
+            otherlv_13=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_13, grammarAccess.getRouteAccess().getSemicolonKeyword_9());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleRoute"
+
+
+    // $ANTLR start "entryRuleComRouteProtocol"
+    // InternalFormalML.g:9967:1: entryRuleComRouteProtocol returns [EObject current=null] : iv_ruleComRouteProtocol= ruleComRouteProtocol EOF ;
+    public final EObject entryRuleComRouteProtocol() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleComRouteProtocol = null;
+
+
+        try {
+            // InternalFormalML.g:9967:57: (iv_ruleComRouteProtocol= ruleComRouteProtocol EOF )
+            // InternalFormalML.g:9968:2: iv_ruleComRouteProtocol= ruleComRouteProtocol EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getComRouteProtocolRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleComRouteProtocol=ruleComRouteProtocol();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleComRouteProtocol; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleComRouteProtocol"
+
+
+    // $ANTLR start "ruleComRouteProtocol"
+    // InternalFormalML.g:9974:1: ruleComRouteProtocol returns [EObject current=null] : ( ( (lv_protocol_0_0= ruleComProtocolKind ) ) | ( ( (lv_protocol_1_0= ruleBufferProtocolKind ) ) ( (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' ) )? ) | ( (lv_inner_buffer_9_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ;
+    public final EObject ruleComRouteProtocol() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token otherlv_8=null;
+        Enumerator lv_protocol_0_0 = null;
+
+        Enumerator lv_protocol_1_0 = null;
+
+        EObject lv_inner_buffer_3_0 = null;
+
+        EObject lv_inner_buffer_6_0 = null;
+
+        EObject lv_inner_buffer_9_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:9980:2: ( ( ( (lv_protocol_0_0= ruleComProtocolKind ) ) | ( ( (lv_protocol_1_0= ruleBufferProtocolKind ) ) ( (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' ) )? ) | ( (lv_inner_buffer_9_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) )
+            // InternalFormalML.g:9981:2: ( ( (lv_protocol_0_0= ruleComProtocolKind ) ) | ( ( (lv_protocol_1_0= ruleBufferProtocolKind ) ) ( (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' ) )? ) | ( (lv_inner_buffer_9_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+            {
+            // InternalFormalML.g:9981:2: ( ( (lv_protocol_0_0= ruleComProtocolKind ) ) | ( ( (lv_protocol_1_0= ruleBufferProtocolKind ) ) ( (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' ) )? ) | ( (lv_inner_buffer_9_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+            int alt246=4;
+            switch ( input.LA(1) ) {
+            case 239:
+            case 254:
+            case 255:
+                {
+                alt246=1;
+                }
+                break;
+            case 136:
+                {
+                alt246=2;
+                }
+                break;
+            case 265:
+            case 266:
+            case 267:
+            case 268:
+                {
+                alt246=3;
+                }
+                break;
+            case RULE_XLIA_ID:
+                {
+                alt246=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 246, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt246) {
+                case 1 :
+                    // InternalFormalML.g:9982:3: ( (lv_protocol_0_0= ruleComProtocolKind ) )
+                    {
+                    // InternalFormalML.g:9982:3: ( (lv_protocol_0_0= ruleComProtocolKind ) )
+                    // InternalFormalML.g:9983:4: (lv_protocol_0_0= ruleComProtocolKind )
+                    {
+                    // InternalFormalML.g:9983:4: (lv_protocol_0_0= ruleComProtocolKind )
+                    // InternalFormalML.g:9984:5: lv_protocol_0_0= ruleComProtocolKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getComRouteProtocolAccess().getProtocolComProtocolKindEnumRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_protocol_0_0=ruleComProtocolKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+                      					}
+                      					set(
+                      						current,
+                      						"protocol",
+                      						lv_protocol_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ComProtocolKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10002:3: ( ( (lv_protocol_1_0= ruleBufferProtocolKind ) ) ( (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' ) )? )
+                    {
+                    // InternalFormalML.g:10002:3: ( ( (lv_protocol_1_0= ruleBufferProtocolKind ) ) ( (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' ) )? )
+                    // InternalFormalML.g:10003:4: ( (lv_protocol_1_0= ruleBufferProtocolKind ) ) ( (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' ) )?
+                    {
+                    // InternalFormalML.g:10003:4: ( (lv_protocol_1_0= ruleBufferProtocolKind ) )
+                    // InternalFormalML.g:10004:5: (lv_protocol_1_0= ruleBufferProtocolKind )
+                    {
+                    // InternalFormalML.g:10004:5: (lv_protocol_1_0= ruleBufferProtocolKind )
+                    // InternalFormalML.g:10005:6: lv_protocol_1_0= ruleBufferProtocolKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getComRouteProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_1_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_112);
+                    lv_protocol_1_0=ruleBufferProtocolKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+                      						}
+                      						set(
+                      							current,
+                      							"protocol",
+                      							lv_protocol_1_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:10022:4: ( (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' ) )?
+                    int alt245=3;
+                    int LA245_0 = input.LA(1);
+
+                    if ( (LA245_0==30) ) {
+                        alt245=1;
+                    }
+                    else if ( (LA245_0==16) ) {
+                        alt245=2;
+                    }
+                    switch (alt245) {
+                        case 1 :
+                            // InternalFormalML.g:10023:5: (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) )
+                            {
+                            // InternalFormalML.g:10023:5: (otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) )
+                            // InternalFormalML.g:10024:6: otherlv_2= ':' ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+                            {
+                            otherlv_2=(Token)match(input,30,FollowSets000.FOLLOW_113); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_2, grammarAccess.getComRouteProtocolAccess().getColonKeyword_1_1_0_0());
+                              					
+                            }
+                            // InternalFormalML.g:10028:6: ( ( (lv_inner_buffer_3_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+                            int alt243=2;
+                            int LA243_0 = input.LA(1);
+
+                            if ( ((LA243_0>=265 && LA243_0<=268)) ) {
+                                alt243=1;
+                            }
+                            else if ( (LA243_0==RULE_XLIA_ID) ) {
+                                alt243=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 243, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt243) {
+                                case 1 :
+                                    // InternalFormalML.g:10029:7: ( (lv_inner_buffer_3_0= ruleBufferContainerType ) )
+                                    {
+                                    // InternalFormalML.g:10029:7: ( (lv_inner_buffer_3_0= ruleBufferContainerType ) )
+                                    // InternalFormalML.g:10030:8: (lv_inner_buffer_3_0= ruleBufferContainerType )
+                                    {
+                                    // InternalFormalML.g:10030:8: (lv_inner_buffer_3_0= ruleBufferContainerType )
+                                    // InternalFormalML.g:10031:9: lv_inner_buffer_3_0= ruleBufferContainerType
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_2);
+                                    lv_inner_buffer_3_0=ruleBufferContainerType();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+                                      									}
+                                      									set(
+                                      										current,
+                                      										"inner_buffer",
+                                      										lv_inner_buffer_3_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:10049:7: ( ( ruleESUfid ) )
+                                    {
+                                    // InternalFormalML.g:10049:7: ( ( ruleESUfid ) )
+                                    // InternalFormalML.g:10050:8: ( ruleESUfid )
+                                    {
+                                    // InternalFormalML.g:10050:8: ( ruleESUfid )
+                                    // InternalFormalML.g:10051:9: ruleESUfid
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getComRouteProtocolRule());
+                                      									}
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_0_1_1_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_2);
+                                    ruleESUfid();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:10071:5: (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' )
+                            {
+                            // InternalFormalML.g:10071:5: (otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>' )
+                            // InternalFormalML.g:10072:6: otherlv_5= '<' ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_8= '>'
+                            {
+                            otherlv_5=(Token)match(input,16,FollowSets000.FOLLOW_113); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_5, grammarAccess.getComRouteProtocolAccess().getLessThanSignKeyword_1_1_1_0());
+                              					
+                            }
+                            // InternalFormalML.g:10076:6: ( ( (lv_inner_buffer_6_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+                            int alt244=2;
+                            int LA244_0 = input.LA(1);
+
+                            if ( ((LA244_0>=265 && LA244_0<=268)) ) {
+                                alt244=1;
+                            }
+                            else if ( (LA244_0==RULE_XLIA_ID) ) {
+                                alt244=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 244, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt244) {
+                                case 1 :
+                                    // InternalFormalML.g:10077:7: ( (lv_inner_buffer_6_0= ruleBufferContainerType ) )
+                                    {
+                                    // InternalFormalML.g:10077:7: ( (lv_inner_buffer_6_0= ruleBufferContainerType ) )
+                                    // InternalFormalML.g:10078:8: (lv_inner_buffer_6_0= ruleBufferContainerType )
+                                    {
+                                    // InternalFormalML.g:10078:8: (lv_inner_buffer_6_0= ruleBufferContainerType )
+                                    // InternalFormalML.g:10079:9: lv_inner_buffer_6_0= ruleBufferContainerType
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_23);
+                                    lv_inner_buffer_6_0=ruleBufferContainerType();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+                                      									}
+                                      									set(
+                                      										current,
+                                      										"inner_buffer",
+                                      										lv_inner_buffer_6_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:10097:7: ( ( ruleESUfid ) )
+                                    {
+                                    // InternalFormalML.g:10097:7: ( ( ruleESUfid ) )
+                                    // InternalFormalML.g:10098:8: ( ruleESUfid )
+                                    {
+                                    // InternalFormalML.g:10098:8: ( ruleESUfid )
+                                    // InternalFormalML.g:10099:9: ruleESUfid
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getComRouteProtocolRule());
+                                      									}
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_1_1_1_1_1_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_23);
+                                    ruleESUfid();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+                            otherlv_8=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_8, grammarAccess.getComRouteProtocolAccess().getGreaterThanSignKeyword_1_1_1_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10125:3: ( (lv_inner_buffer_9_0= ruleBufferContainerType ) )
+                    {
+                    // InternalFormalML.g:10125:3: ( (lv_inner_buffer_9_0= ruleBufferContainerType ) )
+                    // InternalFormalML.g:10126:4: (lv_inner_buffer_9_0= ruleBufferContainerType )
+                    {
+                    // InternalFormalML.g:10126:4: (lv_inner_buffer_9_0= ruleBufferContainerType )
+                    // InternalFormalML.g:10127:5: lv_inner_buffer_9_0= ruleBufferContainerType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getComRouteProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_inner_buffer_9_0=ruleBufferContainerType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getComRouteProtocolRule());
+                      					}
+                      					set(
+                      						current,
+                      						"inner_buffer",
+                      						lv_inner_buffer_9_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10145:3: ( ( ruleESUfid ) )
+                    {
+                    // InternalFormalML.g:10145:3: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:10146:4: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:10146:4: ( ruleESUfid )
+                    // InternalFormalML.g:10147:5: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getComRouteProtocolRule());
+                      					}
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getComRouteProtocolAccess().getRef_bufferBufferCrossReference_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleComRouteProtocol"
+
+
+    // $ANTLR start "entryRuleConnection"
+    // InternalFormalML.g:10168:1: entryRuleConnection returns [EObject current=null] : iv_ruleConnection= ruleConnection EOF ;
+    public final EObject entryRuleConnection() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleConnection = null;
+
+
+        try {
+            // InternalFormalML.g:10168:51: (iv_ruleConnection= ruleConnection EOF )
+            // InternalFormalML.g:10169:2: iv_ruleConnection= ruleConnection EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getConnectionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleConnection=ruleConnection();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleConnection; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleConnection"
+
+
+    // $ANTLR start "ruleConnection"
+    // InternalFormalML.g:10175:1: ruleConnection returns [EObject current=null] : (otherlv_0= 'connect' otherlv_1= '<' ( (lv_protocol_2_0= ruleComProtocol ) ) otherlv_3= '>' ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? otherlv_6= '{' ( (lv_comPoints_7_0= ruleComPoint ) )+ otherlv_8= '}' ) ;
+    public final EObject ruleConnection() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        EObject lv_protocol_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_4_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_5_0 = null;
+
+        EObject lv_comPoints_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:10181:2: ( (otherlv_0= 'connect' otherlv_1= '<' ( (lv_protocol_2_0= ruleComProtocol ) ) otherlv_3= '>' ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? otherlv_6= '{' ( (lv_comPoints_7_0= ruleComPoint ) )+ otherlv_8= '}' ) )
+            // InternalFormalML.g:10182:2: (otherlv_0= 'connect' otherlv_1= '<' ( (lv_protocol_2_0= ruleComProtocol ) ) otherlv_3= '>' ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? otherlv_6= '{' ( (lv_comPoints_7_0= ruleComPoint ) )+ otherlv_8= '}' )
+            {
+            // InternalFormalML.g:10182:2: (otherlv_0= 'connect' otherlv_1= '<' ( (lv_protocol_2_0= ruleComProtocol ) ) otherlv_3= '>' ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? otherlv_6= '{' ( (lv_comPoints_7_0= ruleComPoint ) )+ otherlv_8= '}' )
+            // InternalFormalML.g:10183:3: otherlv_0= 'connect' otherlv_1= '<' ( (lv_protocol_2_0= ruleComProtocol ) ) otherlv_3= '>' ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? otherlv_6= '{' ( (lv_comPoints_7_0= ruleComPoint ) )+ otherlv_8= '}'
+            {
+            otherlv_0=(Token)match(input,100,FollowSets000.FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getConnectionAccess().getConnectKeyword_0());
+              		
+            }
+            otherlv_1=(Token)match(input,16,FollowSets000.FOLLOW_114); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getConnectionAccess().getLessThanSignKeyword_1());
+              		
+            }
+            // InternalFormalML.g:10191:3: ( (lv_protocol_2_0= ruleComProtocol ) )
+            // InternalFormalML.g:10192:4: (lv_protocol_2_0= ruleComProtocol )
+            {
+            // InternalFormalML.g:10192:4: (lv_protocol_2_0= ruleComProtocol )
+            // InternalFormalML.g:10193:5: lv_protocol_2_0= ruleComProtocol
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getConnectionAccess().getProtocolComProtocolParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_23);
+            lv_protocol_2_0=ruleComProtocol();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getConnectionRule());
+              					}
+              					set(
+              						current,
+              						"protocol",
+              						lv_protocol_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ComProtocol");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,37,FollowSets000.FOLLOW_115); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getConnectionAccess().getGreaterThanSignKeyword_3());
+              		
+            }
+            // InternalFormalML.g:10214:3: ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )?
+            int alt248=2;
+            int LA248_0 = input.LA(1);
+
+            if ( (LA248_0==RULE_XLIA_ID) ) {
+                alt248=1;
+            }
+            switch (alt248) {
+                case 1 :
+                    // InternalFormalML.g:10215:4: ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )?
+                    {
+                    // InternalFormalML.g:10215:4: ( (lv_name_4_0= ruleESIdentifier ) )
+                    // InternalFormalML.g:10216:5: (lv_name_4_0= ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:10216:5: (lv_name_4_0= ruleESIdentifier )
+                    // InternalFormalML.g:10217:6: lv_name_4_0= ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getConnectionAccess().getNameESIdentifierParserRuleCall_4_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_24);
+                    lv_name_4_0=ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getConnectionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"name",
+                      							lv_name_4_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:10234:4: ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )?
+                    int alt247=2;
+                    int LA247_0 = input.LA(1);
+
+                    if ( (LA247_0==RULE_STRING) ) {
+                        alt247=1;
+                    }
+                    switch (alt247) {
+                        case 1 :
+                            // InternalFormalML.g:10235:5: (lv_unrestrictedName_5_0= ruleUnrestrictedName )
+                            {
+                            // InternalFormalML.g:10235:5: (lv_unrestrictedName_5_0= ruleUnrestrictedName )
+                            // InternalFormalML.g:10236:6: lv_unrestrictedName_5_0= ruleUnrestrictedName
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getConnectionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_10);
+                            lv_unrestrictedName_5_0=ruleUnrestrictedName();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getConnectionRule());
+                              						}
+                              						set(
+                              							current,
+                              							"unrestrictedName",
+                              							lv_unrestrictedName_5_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,22,FollowSets000.FOLLOW_116); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getConnectionAccess().getLeftCurlyBracketKeyword_5());
+              		
+            }
+            // InternalFormalML.g:10258:3: ( (lv_comPoints_7_0= ruleComPoint ) )+
+            int cnt249=0;
+            loop249:
+            do {
+                int alt249=2;
+                int LA249_0 = input.LA(1);
+
+                if ( ((LA249_0>=61 && LA249_0<=63)) ) {
+                    alt249=1;
+                }
+
+
+                switch (alt249) {
+            	case 1 :
+            	    // InternalFormalML.g:10259:4: (lv_comPoints_7_0= ruleComPoint )
+            	    {
+            	    // InternalFormalML.g:10259:4: (lv_comPoints_7_0= ruleComPoint )
+            	    // InternalFormalML.g:10260:5: lv_comPoints_7_0= ruleComPoint
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getConnectionAccess().getComPointsComPointParserRuleCall_6_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_117);
+            	    lv_comPoints_7_0=ruleComPoint();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getConnectionRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"comPoints",
+            	      						lv_comPoints_7_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.ComPoint");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt249 >= 1 ) break loop249;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(249, input);
+                        throw eee;
+                }
+                cnt249++;
+            } while (true);
+
+            otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getConnectionAccess().getRightCurlyBracketKeyword_7());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleConnection"
+
+
+    // $ANTLR start "entryRuleComProtocol"
+    // InternalFormalML.g:10285:1: entryRuleComProtocol returns [EObject current=null] : iv_ruleComProtocol= ruleComProtocol EOF ;
+    public final EObject entryRuleComProtocol() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleComProtocol = null;
+
+
+        try {
+            // InternalFormalML.g:10285:52: (iv_ruleComProtocol= ruleComProtocol EOF )
+            // InternalFormalML.g:10286:2: iv_ruleComProtocol= ruleComProtocol EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getComProtocolRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleComProtocol=ruleComProtocol();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleComProtocol; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleComProtocol"
+
+
+    // $ANTLR start "ruleComProtocol"
+    // InternalFormalML.g:10292:1: ruleComProtocol returns [EObject current=null] : ( ( (lv_protocol_0_0= ruleComEnvRdvProtocolKind ) ) | ( ( (lv_protocol_1_0= ruleComMultiRdvProtocolKind ) ) (otherlv_2= '<' ( (lv_cast_3_0= ruleComCastKing ) ) otherlv_4= '>' )? ) | ( ( (lv_protocol_5_0= ruleBufferProtocolKind ) ) ( (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' ) )? ) | ( (lv_inner_buffer_13_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) | ( (lv_cast_15_0= ruleComCastKing ) ) ) ;
+    public final EObject ruleComProtocol() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_9=null;
+        Token otherlv_12=null;
+        Enumerator lv_protocol_0_0 = null;
+
+        Enumerator lv_protocol_1_0 = null;
+
+        Enumerator lv_cast_3_0 = null;
+
+        Enumerator lv_protocol_5_0 = null;
+
+        EObject lv_inner_buffer_7_0 = null;
+
+        EObject lv_inner_buffer_10_0 = null;
+
+        EObject lv_inner_buffer_13_0 = null;
+
+        Enumerator lv_cast_15_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:10298:2: ( ( ( (lv_protocol_0_0= ruleComEnvRdvProtocolKind ) ) | ( ( (lv_protocol_1_0= ruleComMultiRdvProtocolKind ) ) (otherlv_2= '<' ( (lv_cast_3_0= ruleComCastKing ) ) otherlv_4= '>' )? ) | ( ( (lv_protocol_5_0= ruleBufferProtocolKind ) ) ( (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' ) )? ) | ( (lv_inner_buffer_13_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) | ( (lv_cast_15_0= ruleComCastKing ) ) ) )
+            // InternalFormalML.g:10299:2: ( ( (lv_protocol_0_0= ruleComEnvRdvProtocolKind ) ) | ( ( (lv_protocol_1_0= ruleComMultiRdvProtocolKind ) ) (otherlv_2= '<' ( (lv_cast_3_0= ruleComCastKing ) ) otherlv_4= '>' )? ) | ( ( (lv_protocol_5_0= ruleBufferProtocolKind ) ) ( (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' ) )? ) | ( (lv_inner_buffer_13_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) | ( (lv_cast_15_0= ruleComCastKing ) ) )
+            {
+            // InternalFormalML.g:10299:2: ( ( (lv_protocol_0_0= ruleComEnvRdvProtocolKind ) ) | ( ( (lv_protocol_1_0= ruleComMultiRdvProtocolKind ) ) (otherlv_2= '<' ( (lv_cast_3_0= ruleComCastKing ) ) otherlv_4= '>' )? ) | ( ( (lv_protocol_5_0= ruleBufferProtocolKind ) ) ( (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' ) )? ) | ( (lv_inner_buffer_13_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) | ( (lv_cast_15_0= ruleComCastKing ) ) )
+            int alt254=6;
+            switch ( input.LA(1) ) {
+            case 239:
+            case 254:
+                {
+                alt254=1;
+                }
+                break;
+            case 255:
+                {
+                alt254=2;
+                }
+                break;
+            case 136:
+                {
+                alt254=3;
+                }
+                break;
+            case 265:
+            case 266:
+            case 267:
+            case 268:
+                {
+                alt254=4;
+                }
+                break;
+            case RULE_XLIA_ID:
+                {
+                alt254=5;
+                }
+                break;
+            case 256:
+            case 257:
+            case 258:
+            case 259:
+                {
+                alt254=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 254, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt254) {
+                case 1 :
+                    // InternalFormalML.g:10300:3: ( (lv_protocol_0_0= ruleComEnvRdvProtocolKind ) )
+                    {
+                    // InternalFormalML.g:10300:3: ( (lv_protocol_0_0= ruleComEnvRdvProtocolKind ) )
+                    // InternalFormalML.g:10301:4: (lv_protocol_0_0= ruleComEnvRdvProtocolKind )
+                    {
+                    // InternalFormalML.g:10301:4: (lv_protocol_0_0= ruleComEnvRdvProtocolKind )
+                    // InternalFormalML.g:10302:5: lv_protocol_0_0= ruleComEnvRdvProtocolKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getComProtocolAccess().getProtocolComEnvRdvProtocolKindEnumRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_protocol_0_0=ruleComEnvRdvProtocolKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getComProtocolRule());
+                      					}
+                      					set(
+                      						current,
+                      						"protocol",
+                      						lv_protocol_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ComEnvRdvProtocolKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10320:3: ( ( (lv_protocol_1_0= ruleComMultiRdvProtocolKind ) ) (otherlv_2= '<' ( (lv_cast_3_0= ruleComCastKing ) ) otherlv_4= '>' )? )
+                    {
+                    // InternalFormalML.g:10320:3: ( ( (lv_protocol_1_0= ruleComMultiRdvProtocolKind ) ) (otherlv_2= '<' ( (lv_cast_3_0= ruleComCastKing ) ) otherlv_4= '>' )? )
+                    // InternalFormalML.g:10321:4: ( (lv_protocol_1_0= ruleComMultiRdvProtocolKind ) ) (otherlv_2= '<' ( (lv_cast_3_0= ruleComCastKing ) ) otherlv_4= '>' )?
+                    {
+                    // InternalFormalML.g:10321:4: ( (lv_protocol_1_0= ruleComMultiRdvProtocolKind ) )
+                    // InternalFormalML.g:10322:5: (lv_protocol_1_0= ruleComMultiRdvProtocolKind )
+                    {
+                    // InternalFormalML.g:10322:5: (lv_protocol_1_0= ruleComMultiRdvProtocolKind )
+                    // InternalFormalML.g:10323:6: lv_protocol_1_0= ruleComMultiRdvProtocolKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getComProtocolAccess().getProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_118);
+                    lv_protocol_1_0=ruleComMultiRdvProtocolKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getComProtocolRule());
+                      						}
+                      						set(
+                      							current,
+                      							"protocol",
+                      							lv_protocol_1_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.ComMultiRdvProtocolKind");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:10340:4: (otherlv_2= '<' ( (lv_cast_3_0= ruleComCastKing ) ) otherlv_4= '>' )?
+                    int alt250=2;
+                    int LA250_0 = input.LA(1);
+
+                    if ( (LA250_0==16) ) {
+                        alt250=1;
+                    }
+                    switch (alt250) {
+                        case 1 :
+                            // InternalFormalML.g:10341:5: otherlv_2= '<' ( (lv_cast_3_0= ruleComCastKing ) ) otherlv_4= '>'
+                            {
+                            otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_114); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_2, grammarAccess.getComProtocolAccess().getLessThanSignKeyword_1_1_0());
+                              				
+                            }
+                            // InternalFormalML.g:10345:5: ( (lv_cast_3_0= ruleComCastKing ) )
+                            // InternalFormalML.g:10346:6: (lv_cast_3_0= ruleComCastKing )
+                            {
+                            // InternalFormalML.g:10346:6: (lv_cast_3_0= ruleComCastKing )
+                            // InternalFormalML.g:10347:7: lv_cast_3_0= ruleComCastKing
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_1_1_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_23);
+                            lv_cast_3_0=ruleComCastKing();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getComProtocolRule());
+                              							}
+                              							set(
+                              								current,
+                              								"cast",
+                              								lv_cast_3_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.ComCastKing");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_4=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_4, grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_1_1_2());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10371:3: ( ( (lv_protocol_5_0= ruleBufferProtocolKind ) ) ( (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' ) )? )
+                    {
+                    // InternalFormalML.g:10371:3: ( ( (lv_protocol_5_0= ruleBufferProtocolKind ) ) ( (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' ) )? )
+                    // InternalFormalML.g:10372:4: ( (lv_protocol_5_0= ruleBufferProtocolKind ) ) ( (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' ) )?
+                    {
+                    // InternalFormalML.g:10372:4: ( (lv_protocol_5_0= ruleBufferProtocolKind ) )
+                    // InternalFormalML.g:10373:5: (lv_protocol_5_0= ruleBufferProtocolKind )
+                    {
+                    // InternalFormalML.g:10373:5: (lv_protocol_5_0= ruleBufferProtocolKind )
+                    // InternalFormalML.g:10374:6: lv_protocol_5_0= ruleBufferProtocolKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getComProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_2_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_112);
+                    lv_protocol_5_0=ruleBufferProtocolKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getComProtocolRule());
+                      						}
+                      						set(
+                      							current,
+                      							"protocol",
+                      							lv_protocol_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:10391:4: ( (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' ) )?
+                    int alt253=3;
+                    int LA253_0 = input.LA(1);
+
+                    if ( (LA253_0==30) ) {
+                        alt253=1;
+                    }
+                    else if ( (LA253_0==16) ) {
+                        alt253=2;
+                    }
+                    switch (alt253) {
+                        case 1 :
+                            // InternalFormalML.g:10392:5: (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) )
+                            {
+                            // InternalFormalML.g:10392:5: (otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) )
+                            // InternalFormalML.g:10393:6: otherlv_6= ':' ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+                            {
+                            otherlv_6=(Token)match(input,30,FollowSets000.FOLLOW_113); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_6, grammarAccess.getComProtocolAccess().getColonKeyword_2_1_0_0());
+                              					
+                            }
+                            // InternalFormalML.g:10397:6: ( ( (lv_inner_buffer_7_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+                            int alt251=2;
+                            int LA251_0 = input.LA(1);
+
+                            if ( ((LA251_0>=265 && LA251_0<=268)) ) {
+                                alt251=1;
+                            }
+                            else if ( (LA251_0==RULE_XLIA_ID) ) {
+                                alt251=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 251, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt251) {
+                                case 1 :
+                                    // InternalFormalML.g:10398:7: ( (lv_inner_buffer_7_0= ruleBufferContainerType ) )
+                                    {
+                                    // InternalFormalML.g:10398:7: ( (lv_inner_buffer_7_0= ruleBufferContainerType ) )
+                                    // InternalFormalML.g:10399:8: (lv_inner_buffer_7_0= ruleBufferContainerType )
+                                    {
+                                    // InternalFormalML.g:10399:8: (lv_inner_buffer_7_0= ruleBufferContainerType )
+                                    // InternalFormalML.g:10400:9: lv_inner_buffer_7_0= ruleBufferContainerType
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_2);
+                                    lv_inner_buffer_7_0=ruleBufferContainerType();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getComProtocolRule());
+                                      									}
+                                      									set(
+                                      										current,
+                                      										"inner_buffer",
+                                      										lv_inner_buffer_7_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:10418:7: ( ( ruleESUfid ) )
+                                    {
+                                    // InternalFormalML.g:10418:7: ( ( ruleESUfid ) )
+                                    // InternalFormalML.g:10419:8: ( ruleESUfid )
+                                    {
+                                    // InternalFormalML.g:10419:8: ( ruleESUfid )
+                                    // InternalFormalML.g:10420:9: ruleESUfid
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getComProtocolRule());
+                                      									}
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_0_1_1_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_2);
+                                    ruleESUfid();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:10440:5: (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' )
+                            {
+                            // InternalFormalML.g:10440:5: (otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>' )
+                            // InternalFormalML.g:10441:6: otherlv_9= '<' ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_12= '>'
+                            {
+                            otherlv_9=(Token)match(input,16,FollowSets000.FOLLOW_113); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_9, grammarAccess.getComProtocolAccess().getLessThanSignKeyword_2_1_1_0());
+                              					
+                            }
+                            // InternalFormalML.g:10445:6: ( ( (lv_inner_buffer_10_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+                            int alt252=2;
+                            int LA252_0 = input.LA(1);
+
+                            if ( ((LA252_0>=265 && LA252_0<=268)) ) {
+                                alt252=1;
+                            }
+                            else if ( (LA252_0==RULE_XLIA_ID) ) {
+                                alt252=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 252, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt252) {
+                                case 1 :
+                                    // InternalFormalML.g:10446:7: ( (lv_inner_buffer_10_0= ruleBufferContainerType ) )
+                                    {
+                                    // InternalFormalML.g:10446:7: ( (lv_inner_buffer_10_0= ruleBufferContainerType ) )
+                                    // InternalFormalML.g:10447:8: (lv_inner_buffer_10_0= ruleBufferContainerType )
+                                    {
+                                    // InternalFormalML.g:10447:8: (lv_inner_buffer_10_0= ruleBufferContainerType )
+                                    // InternalFormalML.g:10448:9: lv_inner_buffer_10_0= ruleBufferContainerType
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_23);
+                                    lv_inner_buffer_10_0=ruleBufferContainerType();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getComProtocolRule());
+                                      									}
+                                      									set(
+                                      										current,
+                                      										"inner_buffer",
+                                      										lv_inner_buffer_10_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:10466:7: ( ( ruleESUfid ) )
+                                    {
+                                    // InternalFormalML.g:10466:7: ( ( ruleESUfid ) )
+                                    // InternalFormalML.g:10467:8: ( ruleESUfid )
+                                    {
+                                    // InternalFormalML.g:10467:8: ( ruleESUfid )
+                                    // InternalFormalML.g:10468:9: ruleESUfid
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getComProtocolRule());
+                                      									}
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_2_1_1_1_1_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_23);
+                                    ruleESUfid();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+                            otherlv_12=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_12, grammarAccess.getComProtocolAccess().getGreaterThanSignKeyword_2_1_1_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:10494:3: ( (lv_inner_buffer_13_0= ruleBufferContainerType ) )
+                    {
+                    // InternalFormalML.g:10494:3: ( (lv_inner_buffer_13_0= ruleBufferContainerType ) )
+                    // InternalFormalML.g:10495:4: (lv_inner_buffer_13_0= ruleBufferContainerType )
+                    {
+                    // InternalFormalML.g:10495:4: (lv_inner_buffer_13_0= ruleBufferContainerType )
+                    // InternalFormalML.g:10496:5: lv_inner_buffer_13_0= ruleBufferContainerType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getComProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_inner_buffer_13_0=ruleBufferContainerType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getComProtocolRule());
+                      					}
+                      					set(
+                      						current,
+                      						"inner_buffer",
+                      						lv_inner_buffer_13_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:10514:3: ( ( ruleESUfid ) )
+                    {
+                    // InternalFormalML.g:10514:3: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:10515:4: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:10515:4: ( ruleESUfid )
+                    // InternalFormalML.g:10516:5: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getComProtocolRule());
+                      					}
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getComProtocolAccess().getRef_bufferBufferCrossReference_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:10534:3: ( (lv_cast_15_0= ruleComCastKing ) )
+                    {
+                    // InternalFormalML.g:10534:3: ( (lv_cast_15_0= ruleComCastKing ) )
+                    // InternalFormalML.g:10535:4: (lv_cast_15_0= ruleComCastKing )
+                    {
+                    // InternalFormalML.g:10535:4: (lv_cast_15_0= ruleComCastKing )
+                    // InternalFormalML.g:10536:5: lv_cast_15_0= ruleComCastKing
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getComProtocolAccess().getCastComCastKingEnumRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_cast_15_0=ruleComCastKing();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getComProtocolRule());
+                      					}
+                      					set(
+                      						current,
+                      						"cast",
+                      						lv_cast_15_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ComCastKing");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleComProtocol"
+
+
+    // $ANTLR start "entryRuleComPoint"
+    // InternalFormalML.g:10557:1: entryRuleComPoint returns [EObject current=null] : iv_ruleComPoint= ruleComPoint EOF ;
+    public final EObject entryRuleComPoint() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleComPoint = null;
+
+
+        try {
+            // InternalFormalML.g:10557:49: (iv_ruleComPoint= ruleComPoint EOF )
+            // InternalFormalML.g:10558:2: iv_ruleComPoint= ruleComPoint EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getComPointRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleComPoint=ruleComPoint();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleComPoint; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleComPoint"
+
+
+    // $ANTLR start "ruleComPoint"
+    // InternalFormalML.g:10564:1: ruleComPoint returns [EObject current=null] : ( () ( (lv_direction_1_0= ruleChannelDirection ) ) (otherlv_2= '<' ( (lv_protocol_3_0= ruleComPointProtocol ) ) otherlv_4= '>' )? ( ( ( (lv_point_5_0= ruleComElement ) ) otherlv_6= ';' ) | (otherlv_7= '{' ( (lv_points_8_0= ruleComElement ) ) otherlv_9= '}' ) ) ) ;
+    public final EObject ruleComPoint() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Enumerator lv_direction_1_0 = null;
+
+        EObject lv_protocol_3_0 = null;
+
+        EObject lv_point_5_0 = null;
+
+        EObject lv_points_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:10570:2: ( ( () ( (lv_direction_1_0= ruleChannelDirection ) ) (otherlv_2= '<' ( (lv_protocol_3_0= ruleComPointProtocol ) ) otherlv_4= '>' )? ( ( ( (lv_point_5_0= ruleComElement ) ) otherlv_6= ';' ) | (otherlv_7= '{' ( (lv_points_8_0= ruleComElement ) ) otherlv_9= '}' ) ) ) )
+            // InternalFormalML.g:10571:2: ( () ( (lv_direction_1_0= ruleChannelDirection ) ) (otherlv_2= '<' ( (lv_protocol_3_0= ruleComPointProtocol ) ) otherlv_4= '>' )? ( ( ( (lv_point_5_0= ruleComElement ) ) otherlv_6= ';' ) | (otherlv_7= '{' ( (lv_points_8_0= ruleComElement ) ) otherlv_9= '}' ) ) )
+            {
+            // InternalFormalML.g:10571:2: ( () ( (lv_direction_1_0= ruleChannelDirection ) ) (otherlv_2= '<' ( (lv_protocol_3_0= ruleComPointProtocol ) ) otherlv_4= '>' )? ( ( ( (lv_point_5_0= ruleComElement ) ) otherlv_6= ';' ) | (otherlv_7= '{' ( (lv_points_8_0= ruleComElement ) ) otherlv_9= '}' ) ) )
+            // InternalFormalML.g:10572:3: () ( (lv_direction_1_0= ruleChannelDirection ) ) (otherlv_2= '<' ( (lv_protocol_3_0= ruleComPointProtocol ) ) otherlv_4= '>' )? ( ( ( (lv_point_5_0= ruleComElement ) ) otherlv_6= ';' ) | (otherlv_7= '{' ( (lv_points_8_0= ruleComElement ) ) otherlv_9= '}' ) )
+            {
+            // InternalFormalML.g:10572:3: ()
+            // InternalFormalML.g:10573:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getComPointAccess().getComPointAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:10582:3: ( (lv_direction_1_0= ruleChannelDirection ) )
+            // InternalFormalML.g:10583:4: (lv_direction_1_0= ruleChannelDirection )
+            {
+            // InternalFormalML.g:10583:4: (lv_direction_1_0= ruleChannelDirection )
+            // InternalFormalML.g:10584:5: lv_direction_1_0= ruleChannelDirection
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getComPointAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_119);
+            lv_direction_1_0=ruleChannelDirection();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getComPointRule());
+              					}
+              					set(
+              						current,
+              						"direction",
+              						lv_direction_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:10601:3: (otherlv_2= '<' ( (lv_protocol_3_0= ruleComPointProtocol ) ) otherlv_4= '>' )?
+            int alt255=2;
+            int LA255_0 = input.LA(1);
+
+            if ( (LA255_0==16) ) {
+                alt255=1;
+            }
+            switch (alt255) {
+                case 1 :
+                    // InternalFormalML.g:10602:4: otherlv_2= '<' ( (lv_protocol_3_0= ruleComPointProtocol ) ) otherlv_4= '>'
+                    {
+                    otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_120); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getComPointAccess().getLessThanSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:10606:4: ( (lv_protocol_3_0= ruleComPointProtocol ) )
+                    // InternalFormalML.g:10607:5: (lv_protocol_3_0= ruleComPointProtocol )
+                    {
+                    // InternalFormalML.g:10607:5: (lv_protocol_3_0= ruleComPointProtocol )
+                    // InternalFormalML.g:10608:6: lv_protocol_3_0= ruleComPointProtocol
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getComPointAccess().getProtocolComPointProtocolParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_protocol_3_0=ruleComPointProtocol();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getComPointRule());
+                      						}
+                      						set(
+                      							current,
+                      							"protocol",
+                      							lv_protocol_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.ComPointProtocol");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,37,FollowSets000.FOLLOW_121); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getComPointAccess().getGreaterThanSignKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:10630:3: ( ( ( (lv_point_5_0= ruleComElement ) ) otherlv_6= ';' ) | (otherlv_7= '{' ( (lv_points_8_0= ruleComElement ) ) otherlv_9= '}' ) )
+            int alt256=2;
+            int LA256_0 = input.LA(1);
+
+            if ( (LA256_0==RULE_XLIA_ID||(LA256_0>=233 && LA256_0<=239)) ) {
+                alt256=1;
+            }
+            else if ( (LA256_0==22) ) {
+                alt256=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 256, 0, input);
+
+                throw nvae;
+            }
+            switch (alt256) {
+                case 1 :
+                    // InternalFormalML.g:10631:4: ( ( (lv_point_5_0= ruleComElement ) ) otherlv_6= ';' )
+                    {
+                    // InternalFormalML.g:10631:4: ( ( (lv_point_5_0= ruleComElement ) ) otherlv_6= ';' )
+                    // InternalFormalML.g:10632:5: ( (lv_point_5_0= ruleComElement ) ) otherlv_6= ';'
+                    {
+                    // InternalFormalML.g:10632:5: ( (lv_point_5_0= ruleComElement ) )
+                    // InternalFormalML.g:10633:6: (lv_point_5_0= ruleComElement )
+                    {
+                    // InternalFormalML.g:10633:6: (lv_point_5_0= ruleComElement )
+                    // InternalFormalML.g:10634:7: lv_point_5_0= ruleComElement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getComPointAccess().getPointComElementParserRuleCall_3_0_0_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_point_5_0=ruleComElement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getComPointRule());
+                      							}
+                      							set(
+                      								current,
+                      								"point",
+                      								lv_point_5_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.ComElement");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_6=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getComPointAccess().getSemicolonKeyword_3_0_1());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10657:4: (otherlv_7= '{' ( (lv_points_8_0= ruleComElement ) ) otherlv_9= '}' )
+                    {
+                    // InternalFormalML.g:10657:4: (otherlv_7= '{' ( (lv_points_8_0= ruleComElement ) ) otherlv_9= '}' )
+                    // InternalFormalML.g:10658:5: otherlv_7= '{' ( (lv_points_8_0= ruleComElement ) ) otherlv_9= '}'
+                    {
+                    otherlv_7=(Token)match(input,22,FollowSets000.FOLLOW_122); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_7, grammarAccess.getComPointAccess().getLeftCurlyBracketKeyword_3_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:10662:5: ( (lv_points_8_0= ruleComElement ) )
+                    // InternalFormalML.g:10663:6: (lv_points_8_0= ruleComElement )
+                    {
+                    // InternalFormalML.g:10663:6: (lv_points_8_0= ruleComElement )
+                    // InternalFormalML.g:10664:7: lv_points_8_0= ruleComElement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getComPointAccess().getPointsComElementParserRuleCall_3_1_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_33);
+                    lv_points_8_0=ruleComElement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getComPointRule());
+                      							}
+                      							add(
+                      								current,
+                      								"points",
+                      								lv_points_8_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.ComElement");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_9=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_9, grammarAccess.getComPointAccess().getRightCurlyBracketKeyword_3_1_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleComPoint"
+
+
+    // $ANTLR start "entryRuleComPointProtocol"
+    // InternalFormalML.g:10691:1: entryRuleComPointProtocol returns [EObject current=null] : iv_ruleComPointProtocol= ruleComPointProtocol EOF ;
+    public final EObject entryRuleComPointProtocol() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleComPointProtocol = null;
+
+
+        try {
+            // InternalFormalML.g:10691:57: (iv_ruleComPointProtocol= ruleComPointProtocol EOF )
+            // InternalFormalML.g:10692:2: iv_ruleComPointProtocol= ruleComPointProtocol EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getComPointProtocolRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleComPointProtocol=ruleComPointProtocol();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleComPointProtocol; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleComPointProtocol"
+
+
+    // $ANTLR start "ruleComPointProtocol"
+    // InternalFormalML.g:10698:1: ruleComPointProtocol returns [EObject current=null] : ( ( ( (lv_protocol_0_0= ruleBufferProtocolKind ) ) ( (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' ) )? ) | ( (lv_inner_buffer_8_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ;
+    public final EObject ruleComPointProtocol() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_4=null;
+        Token otherlv_7=null;
+        Enumerator lv_protocol_0_0 = null;
+
+        EObject lv_inner_buffer_2_0 = null;
+
+        EObject lv_inner_buffer_5_0 = null;
+
+        EObject lv_inner_buffer_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:10704:2: ( ( ( ( (lv_protocol_0_0= ruleBufferProtocolKind ) ) ( (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' ) )? ) | ( (lv_inner_buffer_8_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) )
+            // InternalFormalML.g:10705:2: ( ( ( (lv_protocol_0_0= ruleBufferProtocolKind ) ) ( (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' ) )? ) | ( (lv_inner_buffer_8_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+            {
+            // InternalFormalML.g:10705:2: ( ( ( (lv_protocol_0_0= ruleBufferProtocolKind ) ) ( (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' ) )? ) | ( (lv_inner_buffer_8_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+            int alt260=3;
+            switch ( input.LA(1) ) {
+            case 136:
+                {
+                alt260=1;
+                }
+                break;
+            case 265:
+            case 266:
+            case 267:
+            case 268:
+                {
+                alt260=2;
+                }
+                break;
+            case RULE_XLIA_ID:
+                {
+                alt260=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 260, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt260) {
+                case 1 :
+                    // InternalFormalML.g:10706:3: ( ( (lv_protocol_0_0= ruleBufferProtocolKind ) ) ( (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' ) )? )
+                    {
+                    // InternalFormalML.g:10706:3: ( ( (lv_protocol_0_0= ruleBufferProtocolKind ) ) ( (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' ) )? )
+                    // InternalFormalML.g:10707:4: ( (lv_protocol_0_0= ruleBufferProtocolKind ) ) ( (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' ) )?
+                    {
+                    // InternalFormalML.g:10707:4: ( (lv_protocol_0_0= ruleBufferProtocolKind ) )
+                    // InternalFormalML.g:10708:5: (lv_protocol_0_0= ruleBufferProtocolKind )
+                    {
+                    // InternalFormalML.g:10708:5: (lv_protocol_0_0= ruleBufferProtocolKind )
+                    // InternalFormalML.g:10709:6: lv_protocol_0_0= ruleBufferProtocolKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getComPointProtocolAccess().getProtocolBufferProtocolKindEnumRuleCall_0_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_112);
+                    lv_protocol_0_0=ruleBufferProtocolKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
+                      						}
+                      						set(
+                      							current,
+                      							"protocol",
+                      							lv_protocol_0_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:10726:4: ( (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) ) | (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' ) )?
+                    int alt259=3;
+                    int LA259_0 = input.LA(1);
+
+                    if ( (LA259_0==30) ) {
+                        alt259=1;
+                    }
+                    else if ( (LA259_0==16) ) {
+                        alt259=2;
+                    }
+                    switch (alt259) {
+                        case 1 :
+                            // InternalFormalML.g:10727:5: (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) )
+                            {
+                            // InternalFormalML.g:10727:5: (otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) )
+                            // InternalFormalML.g:10728:6: otherlv_1= ':' ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+                            {
+                            otherlv_1=(Token)match(input,30,FollowSets000.FOLLOW_113); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_1, grammarAccess.getComPointProtocolAccess().getColonKeyword_0_1_0_0());
+                              					
+                            }
+                            // InternalFormalML.g:10732:6: ( ( (lv_inner_buffer_2_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+                            int alt257=2;
+                            int LA257_0 = input.LA(1);
+
+                            if ( ((LA257_0>=265 && LA257_0<=268)) ) {
+                                alt257=1;
+                            }
+                            else if ( (LA257_0==RULE_XLIA_ID) ) {
+                                alt257=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 257, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt257) {
+                                case 1 :
+                                    // InternalFormalML.g:10733:7: ( (lv_inner_buffer_2_0= ruleBufferContainerType ) )
+                                    {
+                                    // InternalFormalML.g:10733:7: ( (lv_inner_buffer_2_0= ruleBufferContainerType ) )
+                                    // InternalFormalML.g:10734:8: (lv_inner_buffer_2_0= ruleBufferContainerType )
+                                    {
+                                    // InternalFormalML.g:10734:8: (lv_inner_buffer_2_0= ruleBufferContainerType )
+                                    // InternalFormalML.g:10735:9: lv_inner_buffer_2_0= ruleBufferContainerType
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_2);
+                                    lv_inner_buffer_2_0=ruleBufferContainerType();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
+                                      									}
+                                      									set(
+                                      										current,
+                                      										"inner_buffer",
+                                      										lv_inner_buffer_2_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:10753:7: ( ( ruleESUfid ) )
+                                    {
+                                    // InternalFormalML.g:10753:7: ( ( ruleESUfid ) )
+                                    // InternalFormalML.g:10754:8: ( ruleESUfid )
+                                    {
+                                    // InternalFormalML.g:10754:8: ( ruleESUfid )
+                                    // InternalFormalML.g:10755:9: ruleESUfid
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getComPointProtocolRule());
+                                      									}
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_0_1_1_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_2);
+                                    ruleESUfid();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:10775:5: (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' )
+                            {
+                            // InternalFormalML.g:10775:5: (otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>' )
+                            // InternalFormalML.g:10776:6: otherlv_4= '<' ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) ) otherlv_7= '>'
+                            {
+                            otherlv_4=(Token)match(input,16,FollowSets000.FOLLOW_113); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_4, grammarAccess.getComPointProtocolAccess().getLessThanSignKeyword_0_1_1_0());
+                              					
+                            }
+                            // InternalFormalML.g:10780:6: ( ( (lv_inner_buffer_5_0= ruleBufferContainerType ) ) | ( ( ruleESUfid ) ) )
+                            int alt258=2;
+                            int LA258_0 = input.LA(1);
+
+                            if ( ((LA258_0>=265 && LA258_0<=268)) ) {
+                                alt258=1;
+                            }
+                            else if ( (LA258_0==RULE_XLIA_ID) ) {
+                                alt258=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 258, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt258) {
+                                case 1 :
+                                    // InternalFormalML.g:10781:7: ( (lv_inner_buffer_5_0= ruleBufferContainerType ) )
+                                    {
+                                    // InternalFormalML.g:10781:7: ( (lv_inner_buffer_5_0= ruleBufferContainerType ) )
+                                    // InternalFormalML.g:10782:8: (lv_inner_buffer_5_0= ruleBufferContainerType )
+                                    {
+                                    // InternalFormalML.g:10782:8: (lv_inner_buffer_5_0= ruleBufferContainerType )
+                                    // InternalFormalML.g:10783:9: lv_inner_buffer_5_0= ruleBufferContainerType
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_23);
+                                    lv_inner_buffer_5_0=ruleBufferContainerType();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
+                                      									}
+                                      									set(
+                                      										current,
+                                      										"inner_buffer",
+                                      										lv_inner_buffer_5_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:10801:7: ( ( ruleESUfid ) )
+                                    {
+                                    // InternalFormalML.g:10801:7: ( ( ruleESUfid ) )
+                                    // InternalFormalML.g:10802:8: ( ruleESUfid )
+                                    {
+                                    // InternalFormalML.g:10802:8: ( ruleESUfid )
+                                    // InternalFormalML.g:10803:9: ruleESUfid
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getComPointProtocolRule());
+                                      									}
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_0_1_1_1_1_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_23);
+                                    ruleESUfid();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+                            otherlv_7=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_7, grammarAccess.getComPointProtocolAccess().getGreaterThanSignKeyword_0_1_1_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10829:3: ( (lv_inner_buffer_8_0= ruleBufferContainerType ) )
+                    {
+                    // InternalFormalML.g:10829:3: ( (lv_inner_buffer_8_0= ruleBufferContainerType ) )
+                    // InternalFormalML.g:10830:4: (lv_inner_buffer_8_0= ruleBufferContainerType )
+                    {
+                    // InternalFormalML.g:10830:4: (lv_inner_buffer_8_0= ruleBufferContainerType )
+                    // InternalFormalML.g:10831:5: lv_inner_buffer_8_0= ruleBufferContainerType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getComPointProtocolAccess().getInner_bufferBufferContainerTypeParserRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_inner_buffer_8_0=ruleBufferContainerType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getComPointProtocolRule());
+                      					}
+                      					set(
+                      						current,
+                      						"inner_buffer",
+                      						lv_inner_buffer_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:10849:3: ( ( ruleESUfid ) )
+                    {
+                    // InternalFormalML.g:10849:3: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:10850:4: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:10850:4: ( ruleESUfid )
+                    // InternalFormalML.g:10851:5: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getComPointProtocolRule());
+                      					}
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getComPointProtocolAccess().getRef_bufferBufferCrossReference_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleComPointProtocol"
+
+
+    // $ANTLR start "entryRuleComElement"
+    // InternalFormalML.g:10872:1: entryRuleComElement returns [EObject current=null] : iv_ruleComElement= ruleComElement EOF ;
+    public final EObject entryRuleComElement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleComElement = null;
+
+
+        try {
+            // InternalFormalML.g:10872:51: (iv_ruleComElement= ruleComElement EOF )
+            // InternalFormalML.g:10873:2: iv_ruleComElement= ruleComElement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getComElementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleComElement=ruleComElement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleComElement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleComElement"
+
+
+    // $ANTLR start "ruleComElement"
+    // InternalFormalML.g:10879:1: ruleComElement returns [EObject current=null] : ( (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement ( () ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )? ) | ( () ( (lv_target_5_0= ruleLiteralReferenceMachineContext ) ) ( ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) ) ) ;
+    public final EObject ruleComElement() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralPureReferenceElement_0 = null;
+
+        Enumerator lv_kind_2_1 = null;
+
+        Enumerator lv_kind_2_2 = null;
+
+        EObject lv_target_5_0 = null;
+
+        Enumerator lv_kind_6_1 = null;
+
+        Enumerator lv_kind_6_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:10885:2: ( ( (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement ( () ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )? ) | ( () ( (lv_target_5_0= ruleLiteralReferenceMachineContext ) ) ( ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) ) ) )
+            // InternalFormalML.g:10886:2: ( (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement ( () ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )? ) | ( () ( (lv_target_5_0= ruleLiteralReferenceMachineContext ) ) ( ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) ) )
+            {
+            // InternalFormalML.g:10886:2: ( (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement ( () ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )? ) | ( () ( (lv_target_5_0= ruleLiteralReferenceMachineContext ) ) ( ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) ) )
+            int alt264=2;
+            int LA264_0 = input.LA(1);
+
+            if ( (LA264_0==RULE_XLIA_ID) ) {
+                alt264=1;
+            }
+            else if ( ((LA264_0>=233 && LA264_0<=239)) ) {
+                alt264=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 264, 0, input);
+
+                throw nvae;
+            }
+            switch (alt264) {
+                case 1 :
+                    // InternalFormalML.g:10887:3: (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement ( () ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )? )
+                    {
+                    // InternalFormalML.g:10887:3: (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement ( () ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )? )
+                    // InternalFormalML.g:10888:4: this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement ( () ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )?
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				/* */
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getComElementAccess().getLiteralPureReferenceElementParserRuleCall_0_0());
+                      			
+                    }
+                    pushFollow(FollowSets000.FOLLOW_123);
+                    this_LiteralPureReferenceElement_0=ruleLiteralPureReferenceElement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_LiteralPureReferenceElement_0;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalFormalML.g:10899:4: ( () ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )?
+                    int alt262=2;
+                    int LA262_0 = input.LA(1);
+
+                    if ( (LA262_0==29||LA262_0==92) ) {
+                        alt262=1;
+                    }
+                    switch (alt262) {
+                        case 1 :
+                            // InternalFormalML.g:10900:5: () ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) )
+                            {
+                            // InternalFormalML.g:10900:5: ()
+                            // InternalFormalML.g:10901:6: 
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						/* */
+                              					
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              						current = forceCreateModelElementAndSet(
+                              							grammarAccess.getComElementAccess().getValueElementSpecificationTargetAction_0_1_0(),
+                              							current);
+                              					
+                            }
+
+                            }
+
+                            // InternalFormalML.g:10910:5: ( ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) ) )
+                            // InternalFormalML.g:10911:6: ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) )
+                            {
+                            // InternalFormalML.g:10911:6: ( (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind ) )
+                            // InternalFormalML.g:10912:7: (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind )
+                            {
+                            // InternalFormalML.g:10912:7: (lv_kind_2_1= ruleValueDotFieldExpressionKind | lv_kind_2_2= ruleValueArrowFieldExpressionKind )
+                            int alt261=2;
+                            int LA261_0 = input.LA(1);
+
+                            if ( (LA261_0==29) ) {
+                                alt261=1;
+                            }
+                            else if ( (LA261_0==92) ) {
+                                alt261=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 261, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt261) {
+                                case 1 :
+                                    // InternalFormalML.g:10913:8: lv_kind_2_1= ruleValueDotFieldExpressionKind
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      								newCompositeNode(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_0_1_1_0_0());
+                                      							
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_19);
+                                    lv_kind_2_1=ruleValueDotFieldExpressionKind();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								if (current==null) {
+                                      									current = createModelElementForParent(grammarAccess.getComElementRule());
+                                      								}
+                                      								set(
+                                      									current,
+                                      									"kind",
+                                      									lv_kind_2_1,
+                                      									"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
+                                      								afterParserOrEnumRuleCall();
+                                      							
+                                    }
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:10929:8: lv_kind_2_2= ruleValueArrowFieldExpressionKind
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      								newCompositeNode(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_0_1_1_0_1());
+                                      							
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_19);
+                                    lv_kind_2_2=ruleValueArrowFieldExpressionKind();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								if (current==null) {
+                                      									current = createModelElementForParent(grammarAccess.getComElementRule());
+                                      								}
+                                      								set(
+                                      									current,
+                                      									"kind",
+                                      									lv_kind_2_2,
+                                      									"org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
+                                      								afterParserOrEnumRuleCall();
+                                      							
+                                    }
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+
+
+                            }
+
+                            // InternalFormalML.g:10947:5: ( ( ruleESIdentifier ) )
+                            // InternalFormalML.g:10948:6: ( ruleESIdentifier )
+                            {
+                            // InternalFormalML.g:10948:6: ( ruleESIdentifier )
+                            // InternalFormalML.g:10949:7: ruleESIdentifier
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							/* */
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getComElementRule());
+                              							}
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_0_1_2_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            ruleESIdentifier();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:10969:3: ( () ( (lv_target_5_0= ruleLiteralReferenceMachineContext ) ) ( ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )
+                    {
+                    // InternalFormalML.g:10969:3: ( () ( (lv_target_5_0= ruleLiteralReferenceMachineContext ) ) ( ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) ) )
+                    // InternalFormalML.g:10970:4: () ( (lv_target_5_0= ruleLiteralReferenceMachineContext ) ) ( ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) ) ) ( ( ruleESIdentifier ) )
+                    {
+                    // InternalFormalML.g:10970:4: ()
+                    // InternalFormalML.g:10971:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getComElementAccess().getValueElementSpecificationAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:10980:4: ( (lv_target_5_0= ruleLiteralReferenceMachineContext ) )
+                    // InternalFormalML.g:10981:5: (lv_target_5_0= ruleLiteralReferenceMachineContext )
+                    {
+                    // InternalFormalML.g:10981:5: (lv_target_5_0= ruleLiteralReferenceMachineContext )
+                    // InternalFormalML.g:10982:6: lv_target_5_0= ruleLiteralReferenceMachineContext
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getComElementAccess().getTargetLiteralReferenceMachineContextParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_124);
+                    lv_target_5_0=ruleLiteralReferenceMachineContext();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getComElementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"target",
+                      							lv_target_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceMachineContext");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:10999:4: ( ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) ) )
+                    // InternalFormalML.g:11000:5: ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) )
+                    {
+                    // InternalFormalML.g:11000:5: ( (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind ) )
+                    // InternalFormalML.g:11001:6: (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind )
+                    {
+                    // InternalFormalML.g:11001:6: (lv_kind_6_1= ruleValueDotFieldExpressionKind | lv_kind_6_2= ruleValueArrowFieldExpressionKind )
+                    int alt263=2;
+                    int LA263_0 = input.LA(1);
+
+                    if ( (LA263_0==29) ) {
+                        alt263=1;
+                    }
+                    else if ( (LA263_0==92) ) {
+                        alt263=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 263, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt263) {
+                        case 1 :
+                            // InternalFormalML.g:11002:7: lv_kind_6_1= ruleValueDotFieldExpressionKind
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getComElementAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_2_0_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_19);
+                            lv_kind_6_1=ruleValueDotFieldExpressionKind();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getComElementRule());
+                              							}
+                              							set(
+                              								current,
+                              								"kind",
+                              								lv_kind_6_1,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:11018:7: lv_kind_6_2= ruleValueArrowFieldExpressionKind
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getComElementAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_1_2_0_1());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_19);
+                            lv_kind_6_2=ruleValueArrowFieldExpressionKind();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getComElementRule());
+                              							}
+                              							set(
+                              								current,
+                              								"kind",
+                              								lv_kind_6_2,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:11036:4: ( ( ruleESIdentifier ) )
+                    // InternalFormalML.g:11037:5: ( ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:11037:5: ( ruleESIdentifier )
+                    // InternalFormalML.g:11038:6: ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getComElementRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getComElementAccess().getElementNamedElementCrossReference_1_3_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleComElement"
+
+
+    // $ANTLR start "entryRuleTypeDefinition"
+    // InternalFormalML.g:11060:1: entryRuleTypeDefinition returns [EObject current=null] : iv_ruleTypeDefinition= ruleTypeDefinition EOF ;
+    public final EObject entryRuleTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTypeDefinition = null;
+
+
+        try {
+            // InternalFormalML.g:11060:55: (iv_ruleTypeDefinition= ruleTypeDefinition EOF )
+            // InternalFormalML.g:11061:2: iv_ruleTypeDefinition= ruleTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTypeDefinition=ruleTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTypeDefinition; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTypeDefinition"
+
+
+    // $ANTLR start "ruleTypeDefinition"
+    // InternalFormalML.g:11067:1: ruleTypeDefinition returns [EObject current=null] : (this_EnumerationTypeDefinition_0= ruleEnumerationTypeDefinition | this_StructureTypeDefinition_1= ruleStructureTypeDefinition | this_UnionTypeDefinition_2= ruleUnionTypeDefinition | this_ChoiceTypeDefinition_3= ruleChoiceTypeDefinition | this_IntervalTypeDefinition_4= ruleIntervalTypeDefinition | this_CollectionTypeDefinition_5= ruleCollectionTypeDefinition | this_OtherDataTypeDefinition_6= ruleOtherDataTypeDefinition ) ;
+    public final EObject ruleTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_EnumerationTypeDefinition_0 = null;
+
+        EObject this_StructureTypeDefinition_1 = null;
+
+        EObject this_UnionTypeDefinition_2 = null;
+
+        EObject this_ChoiceTypeDefinition_3 = null;
+
+        EObject this_IntervalTypeDefinition_4 = null;
+
+        EObject this_CollectionTypeDefinition_5 = null;
+
+        EObject this_OtherDataTypeDefinition_6 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11073:2: ( (this_EnumerationTypeDefinition_0= ruleEnumerationTypeDefinition | this_StructureTypeDefinition_1= ruleStructureTypeDefinition | this_UnionTypeDefinition_2= ruleUnionTypeDefinition | this_ChoiceTypeDefinition_3= ruleChoiceTypeDefinition | this_IntervalTypeDefinition_4= ruleIntervalTypeDefinition | this_CollectionTypeDefinition_5= ruleCollectionTypeDefinition | this_OtherDataTypeDefinition_6= ruleOtherDataTypeDefinition ) )
+            // InternalFormalML.g:11074:2: (this_EnumerationTypeDefinition_0= ruleEnumerationTypeDefinition | this_StructureTypeDefinition_1= ruleStructureTypeDefinition | this_UnionTypeDefinition_2= ruleUnionTypeDefinition | this_ChoiceTypeDefinition_3= ruleChoiceTypeDefinition | this_IntervalTypeDefinition_4= ruleIntervalTypeDefinition | this_CollectionTypeDefinition_5= ruleCollectionTypeDefinition | this_OtherDataTypeDefinition_6= ruleOtherDataTypeDefinition )
+            {
+            // InternalFormalML.g:11074:2: (this_EnumerationTypeDefinition_0= ruleEnumerationTypeDefinition | this_StructureTypeDefinition_1= ruleStructureTypeDefinition | this_UnionTypeDefinition_2= ruleUnionTypeDefinition | this_ChoiceTypeDefinition_3= ruleChoiceTypeDefinition | this_IntervalTypeDefinition_4= ruleIntervalTypeDefinition | this_CollectionTypeDefinition_5= ruleCollectionTypeDefinition | this_OtherDataTypeDefinition_6= ruleOtherDataTypeDefinition )
+            int alt265=7;
+            alt265 = dfa265.predict(input);
+            switch (alt265) {
+                case 1 :
+                    // InternalFormalML.g:11075:3: this_EnumerationTypeDefinition_0= ruleEnumerationTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getEnumerationTypeDefinitionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_EnumerationTypeDefinition_0=ruleEnumerationTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_EnumerationTypeDefinition_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11087:3: this_StructureTypeDefinition_1= ruleStructureTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getStructureTypeDefinitionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_StructureTypeDefinition_1=ruleStructureTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_StructureTypeDefinition_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11099:3: this_UnionTypeDefinition_2= ruleUnionTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getUnionTypeDefinitionParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_UnionTypeDefinition_2=ruleUnionTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UnionTypeDefinition_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:11111:3: this_ChoiceTypeDefinition_3= ruleChoiceTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getChoiceTypeDefinitionParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ChoiceTypeDefinition_3=ruleChoiceTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ChoiceTypeDefinition_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:11123:3: this_IntervalTypeDefinition_4= ruleIntervalTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getIntervalTypeDefinitionParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_IntervalTypeDefinition_4=ruleIntervalTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_IntervalTypeDefinition_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:11135:3: this_CollectionTypeDefinition_5= ruleCollectionTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getCollectionTypeDefinitionParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_CollectionTypeDefinition_5=ruleCollectionTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_CollectionTypeDefinition_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:11147:3: this_OtherDataTypeDefinition_6= ruleOtherDataTypeDefinition
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTypeDefinitionAccess().getOtherDataTypeDefinitionParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_OtherDataTypeDefinition_6=ruleOtherDataTypeDefinition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_OtherDataTypeDefinition_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTypeDefinition"
+
+
+    // $ANTLR start "entryRuleDataTypeMultiplicity"
+    // InternalFormalML.g:11162:1: entryRuleDataTypeMultiplicity returns [EObject current=null] : iv_ruleDataTypeMultiplicity= ruleDataTypeMultiplicity EOF ;
+    public final EObject entryRuleDataTypeMultiplicity() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDataTypeMultiplicity = null;
+
+
+        try {
+            // InternalFormalML.g:11162:61: (iv_ruleDataTypeMultiplicity= ruleDataTypeMultiplicity EOF )
+            // InternalFormalML.g:11163:2: iv_ruleDataTypeMultiplicity= ruleDataTypeMultiplicity EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDataTypeMultiplicityRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDataTypeMultiplicity=ruleDataTypeMultiplicity();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDataTypeMultiplicity; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDataTypeMultiplicity"
+
+
+    // $ANTLR start "ruleDataTypeMultiplicity"
+    // InternalFormalML.g:11169:1: ruleDataTypeMultiplicity returns [EObject current=null] : (this_LiteralIntegerExpression_0= ruleLiteralIntegerExpression | this_LiteralReferenceElement_1= ruleLiteralReferenceElement ) ;
+    public final EObject ruleDataTypeMultiplicity() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralIntegerExpression_0 = null;
+
+        EObject this_LiteralReferenceElement_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11175:2: ( (this_LiteralIntegerExpression_0= ruleLiteralIntegerExpression | this_LiteralReferenceElement_1= ruleLiteralReferenceElement ) )
+            // InternalFormalML.g:11176:2: (this_LiteralIntegerExpression_0= ruleLiteralIntegerExpression | this_LiteralReferenceElement_1= ruleLiteralReferenceElement )
+            {
+            // InternalFormalML.g:11176:2: (this_LiteralIntegerExpression_0= ruleLiteralIntegerExpression | this_LiteralReferenceElement_1= ruleLiteralReferenceElement )
+            int alt266=2;
+            int LA266_0 = input.LA(1);
+
+            if ( (LA266_0==RULE_INT||LA266_0==28) ) {
+                alt266=1;
+            }
+            else if ( (LA266_0==RULE_XLIA_ID) ) {
+                alt266=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 266, 0, input);
+
+                throw nvae;
+            }
+            switch (alt266) {
+                case 1 :
+                    // InternalFormalML.g:11177:3: this_LiteralIntegerExpression_0= ruleLiteralIntegerExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDataTypeMultiplicityAccess().getLiteralIntegerExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralIntegerExpression_0=ruleLiteralIntegerExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralIntegerExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11189:3: this_LiteralReferenceElement_1= ruleLiteralReferenceElement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDataTypeMultiplicityAccess().getLiteralReferenceElementParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralReferenceElement_1=ruleLiteralReferenceElement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralReferenceElement_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDataTypeMultiplicity"
+
+
+    // $ANTLR start "entryRuleDataTypeReference"
+    // InternalFormalML.g:11204:1: entryRuleDataTypeReference returns [EObject current=null] : iv_ruleDataTypeReference= ruleDataTypeReference EOF ;
+    public final EObject entryRuleDataTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDataTypeReference = null;
+
+
+        try {
+            // InternalFormalML.g:11204:58: (iv_ruleDataTypeReference= ruleDataTypeReference EOF )
+            // InternalFormalML.g:11205:2: iv_ruleDataTypeReference= ruleDataTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDataTypeReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDataTypeReference=ruleDataTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDataTypeReference; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDataTypeReference"
+
+
+    // $ANTLR start "ruleDataTypeReference"
+    // InternalFormalML.g:11211:1: ruleDataTypeReference returns [EObject current=null] : ( (this_SimpleDataType_0= ruleSimpleDataType ( () otherlv_2= '[' ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) ) otherlv_4= ']' )? ) | ( () ( ( ruleESUfid ) ) (otherlv_7= '[' ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) ) otherlv_9= ']' )? ) ) ;
+    public final EObject ruleDataTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        EObject this_SimpleDataType_0 = null;
+
+        EObject lv_multiplicity_3_0 = null;
+
+        EObject lv_multiplicity_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11217:2: ( ( (this_SimpleDataType_0= ruleSimpleDataType ( () otherlv_2= '[' ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) ) otherlv_4= ']' )? ) | ( () ( ( ruleESUfid ) ) (otherlv_7= '[' ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) ) otherlv_9= ']' )? ) ) )
+            // InternalFormalML.g:11218:2: ( (this_SimpleDataType_0= ruleSimpleDataType ( () otherlv_2= '[' ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) ) otherlv_4= ']' )? ) | ( () ( ( ruleESUfid ) ) (otherlv_7= '[' ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) ) otherlv_9= ']' )? ) )
+            {
+            // InternalFormalML.g:11218:2: ( (this_SimpleDataType_0= ruleSimpleDataType ( () otherlv_2= '[' ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) ) otherlv_4= ']' )? ) | ( () ( ( ruleESUfid ) ) (otherlv_7= '[' ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) ) otherlv_9= ']' )? ) )
+            int alt269=2;
+            int LA269_0 = input.LA(1);
+
+            if ( (LA269_0==28||LA269_0==53||(LA269_0>=102 && LA269_0<=105)||(LA269_0>=107 && LA269_0<=123)||(LA269_0>=136 && LA269_0<=138)||LA269_0==212||(LA269_0>=216 && LA269_0<=217)||(LA269_0>=260 && LA269_0<=268)) ) {
+                alt269=1;
+            }
+            else if ( (LA269_0==RULE_XLIA_ID) ) {
+                alt269=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 269, 0, input);
+
+                throw nvae;
+            }
+            switch (alt269) {
+                case 1 :
+                    // InternalFormalML.g:11219:3: (this_SimpleDataType_0= ruleSimpleDataType ( () otherlv_2= '[' ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) ) otherlv_4= ']' )? )
+                    {
+                    // InternalFormalML.g:11219:3: (this_SimpleDataType_0= ruleSimpleDataType ( () otherlv_2= '[' ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) ) otherlv_4= ']' )? )
+                    // InternalFormalML.g:11220:4: this_SimpleDataType_0= ruleSimpleDataType ( () otherlv_2= '[' ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) ) otherlv_4= ']' )?
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      				/* */
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getSimpleDataTypeParserRuleCall_0_0());
+                      			
+                    }
+                    pushFollow(FollowSets000.FOLLOW_125);
+                    this_SimpleDataType_0=ruleSimpleDataType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_SimpleDataType_0;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    // InternalFormalML.g:11231:4: ( () otherlv_2= '[' ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) ) otherlv_4= ']' )?
+                    int alt267=2;
+                    int LA267_0 = input.LA(1);
+
+                    if ( (LA267_0==97) ) {
+                        alt267=1;
+                    }
+                    switch (alt267) {
+                        case 1 :
+                            // InternalFormalML.g:11232:5: () otherlv_2= '[' ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) ) otherlv_4= ']'
+                            {
+                            // InternalFormalML.g:11232:5: ()
+                            // InternalFormalML.g:11233:6: 
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						/* */
+                              					
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              						current = forceCreateModelElementAndSet(
+                              							grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0(),
+                              							current);
+                              					
+                            }
+
+                            }
+
+                            otherlv_2=(Token)match(input,97,FollowSets000.FOLLOW_126); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_2, grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_0_1_1());
+                              				
+                            }
+                            // InternalFormalML.g:11246:5: ( (lv_multiplicity_3_0= ruleDataTypeMultiplicity ) )
+                            // InternalFormalML.g:11247:6: (lv_multiplicity_3_0= ruleDataTypeMultiplicity )
+                            {
+                            // InternalFormalML.g:11247:6: (lv_multiplicity_3_0= ruleDataTypeMultiplicity )
+                            // InternalFormalML.g:11248:7: lv_multiplicity_3_0= ruleDataTypeMultiplicity
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_110);
+                            lv_multiplicity_3_0=ruleDataTypeMultiplicity();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getDataTypeReferenceRule());
+                              							}
+                              							set(
+                              								current,
+                              								"multiplicity",
+                              								lv_multiplicity_3_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_4=(Token)match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_4, grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_0_1_3());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11272:3: ( () ( ( ruleESUfid ) ) (otherlv_7= '[' ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) ) otherlv_9= ']' )? )
+                    {
+                    // InternalFormalML.g:11272:3: ( () ( ( ruleESUfid ) ) (otherlv_7= '[' ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) ) otherlv_9= ']' )? )
+                    // InternalFormalML.g:11273:4: () ( ( ruleESUfid ) ) (otherlv_7= '[' ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) ) otherlv_9= ']' )?
+                    {
+                    // InternalFormalML.g:11273:4: ()
+                    // InternalFormalML.g:11274:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:11283:4: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:11284:5: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:11284:5: ( ruleESUfid )
+                    // InternalFormalML.g:11285:6: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getDataTypeReferenceRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getTyperefDataTypeCrossReference_1_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_125);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:11302:4: (otherlv_7= '[' ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) ) otherlv_9= ']' )?
+                    int alt268=2;
+                    int LA268_0 = input.LA(1);
+
+                    if ( (LA268_0==97) ) {
+                        alt268=1;
+                    }
+                    switch (alt268) {
+                        case 1 :
+                            // InternalFormalML.g:11303:5: otherlv_7= '[' ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) ) otherlv_9= ']'
+                            {
+                            otherlv_7=(Token)match(input,97,FollowSets000.FOLLOW_126); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_7, grammarAccess.getDataTypeReferenceAccess().getLeftSquareBracketKeyword_1_2_0());
+                              				
+                            }
+                            // InternalFormalML.g:11307:5: ( (lv_multiplicity_8_0= ruleDataTypeMultiplicity ) )
+                            // InternalFormalML.g:11308:6: (lv_multiplicity_8_0= ruleDataTypeMultiplicity )
+                            {
+                            // InternalFormalML.g:11308:6: (lv_multiplicity_8_0= ruleDataTypeMultiplicity )
+                            // InternalFormalML.g:11309:7: lv_multiplicity_8_0= ruleDataTypeMultiplicity
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getDataTypeReferenceAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_110);
+                            lv_multiplicity_8_0=ruleDataTypeMultiplicity();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getDataTypeReferenceRule());
+                              							}
+                              							set(
+                              								current,
+                              								"multiplicity",
+                              								lv_multiplicity_8_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_9=(Token)match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_9, grammarAccess.getDataTypeReferenceAccess().getRightSquareBracketKeyword_1_2_2());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDataTypeReference"
+
+
+    // $ANTLR start "entryRuleOtherDataTypeDefinition"
+    // InternalFormalML.g:11336:1: entryRuleOtherDataTypeDefinition returns [EObject current=null] : iv_ruleOtherDataTypeDefinition= ruleOtherDataTypeDefinition EOF ;
+    public final EObject entryRuleOtherDataTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleOtherDataTypeDefinition = null;
+
+
+        try {
+            // InternalFormalML.g:11336:64: (iv_ruleOtherDataTypeDefinition= ruleOtherDataTypeDefinition EOF )
+            // InternalFormalML.g:11337:2: iv_ruleOtherDataTypeDefinition= ruleOtherDataTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOtherDataTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleOtherDataTypeDefinition=ruleOtherDataTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOtherDataTypeDefinition; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOtherDataTypeDefinition"
+
+
+    // $ANTLR start "ruleOtherDataTypeDefinition"
+    // InternalFormalML.g:11343:1: ruleOtherDataTypeDefinition returns [EObject current=null] : ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_5_0= rulePrimitiveType ) ) (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )? ) ) ( (lv_typedef_13_0= ';' ) ) ) ;
+    public final EObject ruleOtherDataTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token lv_typedef_13_0=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        EObject lv_support_5_0 = null;
+
+        EObject lv_multiplicity_7_0 = null;
+
+        EObject lv_multiplicity_11_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11349:2: ( ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_5_0= rulePrimitiveType ) ) (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )? ) ) ( (lv_typedef_13_0= ';' ) ) ) )
+            // InternalFormalML.g:11350:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_5_0= rulePrimitiveType ) ) (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )? ) ) ( (lv_typedef_13_0= ';' ) ) )
+            {
+            // InternalFormalML.g:11350:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_5_0= rulePrimitiveType ) ) (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )? ) ) ( (lv_typedef_13_0= ';' ) ) )
+            // InternalFormalML.g:11351:3: () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_5_0= rulePrimitiveType ) ) (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )? ) ) ( (lv_typedef_13_0= ';' ) )
+            {
+            // InternalFormalML.g:11351:3: ()
+            // InternalFormalML.g:11352:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getOtherDataTypeDefinitionAccess().getDataTypeReferenceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:11361:3: ( (lv_visibility_1_0= ruleVisibilityKind ) )?
+            int alt270=2;
+            int LA270_0 = input.LA(1);
+
+            if ( (LA270_0==19||(LA270_0>=240 && LA270_0<=242)) ) {
+                alt270=1;
+            }
+            switch (alt270) {
+                case 1 :
+                    // InternalFormalML.g:11362:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:11362:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    // InternalFormalML.g:11363:5: lv_visibility_1_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_127);
+                    lv_visibility_1_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,101,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getOtherDataTypeDefinitionAccess().getTypeKeyword_2());
+              		
+            }
+            // InternalFormalML.g:11384:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:11385:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:11385:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:11386:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_128);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:11403:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt271=2;
+            int LA271_0 = input.LA(1);
+
+            if ( (LA271_0==RULE_STRING) ) {
+                alt271=1;
+            }
+            switch (alt271) {
+                case 1 :
+                    // InternalFormalML.g:11404:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:11404:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:11405:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_129);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:11422:3: ( ( ( (lv_support_5_0= rulePrimitiveType ) ) (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )? ) )
+            int alt274=2;
+            int LA274_0 = input.LA(1);
+
+            if ( (LA274_0==28||LA274_0==53||(LA274_0>=102 && LA274_0<=105)||(LA274_0>=107 && LA274_0<=122)||(LA274_0>=136 && LA274_0<=138)||LA274_0==212||(LA274_0>=216 && LA274_0<=217)||(LA274_0>=260 && LA274_0<=261)) ) {
+                alt274=1;
+            }
+            else if ( (LA274_0==RULE_XLIA_ID) ) {
+                alt274=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 274, 0, input);
+
+                throw nvae;
+            }
+            switch (alt274) {
+                case 1 :
+                    // InternalFormalML.g:11423:4: ( ( (lv_support_5_0= rulePrimitiveType ) ) (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )? )
+                    {
+                    // InternalFormalML.g:11423:4: ( ( (lv_support_5_0= rulePrimitiveType ) ) (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )? )
+                    // InternalFormalML.g:11424:5: ( (lv_support_5_0= rulePrimitiveType ) ) (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )?
+                    {
+                    // InternalFormalML.g:11424:5: ( (lv_support_5_0= rulePrimitiveType ) )
+                    // InternalFormalML.g:11425:6: (lv_support_5_0= rulePrimitiveType )
+                    {
+                    // InternalFormalML.g:11425:6: (lv_support_5_0= rulePrimitiveType )
+                    // InternalFormalML.g:11426:7: lv_support_5_0= rulePrimitiveType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getSupportPrimitiveTypeParserRuleCall_5_0_0_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_130);
+                    lv_support_5_0=rulePrimitiveType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+                      							}
+                      							set(
+                      								current,
+                      								"support",
+                      								lv_support_5_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveType");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:11443:5: (otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']' )?
+                    int alt272=2;
+                    int LA272_0 = input.LA(1);
+
+                    if ( (LA272_0==97) ) {
+                        alt272=1;
+                    }
+                    switch (alt272) {
+                        case 1 :
+                            // InternalFormalML.g:11444:6: otherlv_6= '[' ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) ) otherlv_8= ']'
+                            {
+                            otherlv_6=(Token)match(input,97,FollowSets000.FOLLOW_126); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_6, grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_0_1_0());
+                              					
+                            }
+                            // InternalFormalML.g:11448:6: ( (lv_multiplicity_7_0= ruleDataTypeMultiplicity ) )
+                            // InternalFormalML.g:11449:7: (lv_multiplicity_7_0= ruleDataTypeMultiplicity )
+                            {
+                            // InternalFormalML.g:11449:7: (lv_multiplicity_7_0= ruleDataTypeMultiplicity )
+                            // InternalFormalML.g:11450:8: lv_multiplicity_7_0= ruleDataTypeMultiplicity
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_110);
+                            lv_multiplicity_7_0=ruleDataTypeMultiplicity();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+                              								}
+                              								set(
+                              									current,
+                              									"multiplicity",
+                              									lv_multiplicity_7_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_8=(Token)match(input,99,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_8, grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_0_1_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11474:4: ( ( ( ruleESUfid ) ) (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )? )
+                    {
+                    // InternalFormalML.g:11474:4: ( ( ( ruleESUfid ) ) (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )? )
+                    // InternalFormalML.g:11475:5: ( ( ruleESUfid ) ) (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )?
+                    {
+                    // InternalFormalML.g:11475:5: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:11476:6: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:11476:6: ( ruleESUfid )
+                    // InternalFormalML.g:11477:7: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							/* */
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getOtherDataTypeDefinitionRule());
+                      							}
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getTyperefDataTypeCrossReference_5_1_0_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_130);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:11494:5: (otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']' )?
+                    int alt273=2;
+                    int LA273_0 = input.LA(1);
+
+                    if ( (LA273_0==97) ) {
+                        alt273=1;
+                    }
+                    switch (alt273) {
+                        case 1 :
+                            // InternalFormalML.g:11495:6: otherlv_10= '[' ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) ) otherlv_12= ']'
+                            {
+                            otherlv_10=(Token)match(input,97,FollowSets000.FOLLOW_126); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_10, grammarAccess.getOtherDataTypeDefinitionAccess().getLeftSquareBracketKeyword_5_1_1_0());
+                              					
+                            }
+                            // InternalFormalML.g:11499:6: ( (lv_multiplicity_11_0= ruleDataTypeMultiplicity ) )
+                            // InternalFormalML.g:11500:7: (lv_multiplicity_11_0= ruleDataTypeMultiplicity )
+                            {
+                            // InternalFormalML.g:11500:7: (lv_multiplicity_11_0= ruleDataTypeMultiplicity )
+                            // InternalFormalML.g:11501:8: lv_multiplicity_11_0= ruleDataTypeMultiplicity
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_110);
+                            lv_multiplicity_11_0=ruleDataTypeMultiplicity();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionRule());
+                              								}
+                              								set(
+                              									current,
+                              									"multiplicity",
+                              									lv_multiplicity_11_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_12=(Token)match(input,99,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_12, grammarAccess.getOtherDataTypeDefinitionAccess().getRightSquareBracketKeyword_5_1_1_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:11525:3: ( (lv_typedef_13_0= ';' ) )
+            // InternalFormalML.g:11526:4: (lv_typedef_13_0= ';' )
+            {
+            // InternalFormalML.g:11526:4: (lv_typedef_13_0= ';' )
+            // InternalFormalML.g:11527:5: lv_typedef_13_0= ';'
+            {
+            lv_typedef_13_0=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_13_0, grammarAccess.getOtherDataTypeDefinitionAccess().getTypedefSemicolonKeyword_6_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getOtherDataTypeDefinitionRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, ";");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOtherDataTypeDefinition"
+
+
+    // $ANTLR start "entryRuleOtherDataTypeDefinitionImpl"
+    // InternalFormalML.g:11543:1: entryRuleOtherDataTypeDefinitionImpl returns [EObject current=null] : iv_ruleOtherDataTypeDefinitionImpl= ruleOtherDataTypeDefinitionImpl EOF ;
+    public final EObject entryRuleOtherDataTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleOtherDataTypeDefinitionImpl = null;
+
+
+        try {
+            // InternalFormalML.g:11543:68: (iv_ruleOtherDataTypeDefinitionImpl= ruleOtherDataTypeDefinitionImpl EOF )
+            // InternalFormalML.g:11544:2: iv_ruleOtherDataTypeDefinitionImpl= ruleOtherDataTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleOtherDataTypeDefinitionImpl=ruleOtherDataTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOtherDataTypeDefinitionImpl; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOtherDataTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleOtherDataTypeDefinitionImpl"
+    // InternalFormalML.g:11550:1: ruleOtherDataTypeDefinitionImpl returns [EObject current=null] : ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_3_0= rulePrimitiveType ) ) (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )? ) ) ( (lv_typedef_11_0= ';' ) ) ) ;
+    public final EObject ruleOtherDataTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token lv_typedef_11_0=null;
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        EObject lv_support_3_0 = null;
+
+        EObject lv_multiplicity_5_0 = null;
+
+        EObject lv_multiplicity_9_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11556:2: ( ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_3_0= rulePrimitiveType ) ) (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )? ) ) ( (lv_typedef_11_0= ';' ) ) ) )
+            // InternalFormalML.g:11557:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_3_0= rulePrimitiveType ) ) (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )? ) ) ( (lv_typedef_11_0= ';' ) ) )
+            {
+            // InternalFormalML.g:11557:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_3_0= rulePrimitiveType ) ) (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )? ) ) ( (lv_typedef_11_0= ';' ) ) )
+            // InternalFormalML.g:11558:3: () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( ( ( (lv_support_3_0= rulePrimitiveType ) ) (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )? ) ) ( (lv_typedef_11_0= ';' ) )
+            {
+            // InternalFormalML.g:11558:3: ()
+            // InternalFormalML.g:11559:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getOtherDataTypeDefinitionImplAccess().getDataTypeReferenceAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:11568:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:11569:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:11569:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:11570:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_128);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:11587:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt275=2;
+            int LA275_0 = input.LA(1);
+
+            if ( (LA275_0==RULE_STRING) ) {
+                alt275=1;
+            }
+            switch (alt275) {
+                case 1 :
+                    // InternalFormalML.g:11588:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:11588:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:11589:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_129);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:11606:3: ( ( ( (lv_support_3_0= rulePrimitiveType ) ) (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )? ) | ( ( ( ruleESUfid ) ) (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )? ) )
+            int alt278=2;
+            int LA278_0 = input.LA(1);
+
+            if ( (LA278_0==28||LA278_0==53||(LA278_0>=102 && LA278_0<=105)||(LA278_0>=107 && LA278_0<=122)||(LA278_0>=136 && LA278_0<=138)||LA278_0==212||(LA278_0>=216 && LA278_0<=217)||(LA278_0>=260 && LA278_0<=261)) ) {
+                alt278=1;
+            }
+            else if ( (LA278_0==RULE_XLIA_ID) ) {
+                alt278=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 278, 0, input);
+
+                throw nvae;
+            }
+            switch (alt278) {
+                case 1 :
+                    // InternalFormalML.g:11607:4: ( ( (lv_support_3_0= rulePrimitiveType ) ) (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )? )
+                    {
+                    // InternalFormalML.g:11607:4: ( ( (lv_support_3_0= rulePrimitiveType ) ) (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )? )
+                    // InternalFormalML.g:11608:5: ( (lv_support_3_0= rulePrimitiveType ) ) (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )?
+                    {
+                    // InternalFormalML.g:11608:5: ( (lv_support_3_0= rulePrimitiveType ) )
+                    // InternalFormalML.g:11609:6: (lv_support_3_0= rulePrimitiveType )
+                    {
+                    // InternalFormalML.g:11609:6: (lv_support_3_0= rulePrimitiveType )
+                    // InternalFormalML.g:11610:7: lv_support_3_0= rulePrimitiveType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getSupportPrimitiveTypeParserRuleCall_3_0_0_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_130);
+                    lv_support_3_0=rulePrimitiveType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+                      							}
+                      							set(
+                      								current,
+                      								"support",
+                      								lv_support_3_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveType");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:11627:5: (otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']' )?
+                    int alt276=2;
+                    int LA276_0 = input.LA(1);
+
+                    if ( (LA276_0==97) ) {
+                        alt276=1;
+                    }
+                    switch (alt276) {
+                        case 1 :
+                            // InternalFormalML.g:11628:6: otherlv_4= '[' ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) ) otherlv_6= ']'
+                            {
+                            otherlv_4=(Token)match(input,97,FollowSets000.FOLLOW_126); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_4, grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_0_1_0());
+                              					
+                            }
+                            // InternalFormalML.g:11632:6: ( (lv_multiplicity_5_0= ruleDataTypeMultiplicity ) )
+                            // InternalFormalML.g:11633:7: (lv_multiplicity_5_0= ruleDataTypeMultiplicity )
+                            {
+                            // InternalFormalML.g:11633:7: (lv_multiplicity_5_0= ruleDataTypeMultiplicity )
+                            // InternalFormalML.g:11634:8: lv_multiplicity_5_0= ruleDataTypeMultiplicity
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_0_1_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_110);
+                            lv_multiplicity_5_0=ruleDataTypeMultiplicity();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+                              								}
+                              								set(
+                              									current,
+                              									"multiplicity",
+                              									lv_multiplicity_5_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_6=(Token)match(input,99,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_6, grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_0_1_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11658:4: ( ( ( ruleESUfid ) ) (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )? )
+                    {
+                    // InternalFormalML.g:11658:4: ( ( ( ruleESUfid ) ) (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )? )
+                    // InternalFormalML.g:11659:5: ( ( ruleESUfid ) ) (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )?
+                    {
+                    // InternalFormalML.g:11659:5: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:11660:6: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:11660:6: ( ruleESUfid )
+                    // InternalFormalML.g:11661:7: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							/* */
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getOtherDataTypeDefinitionImplRule());
+                      							}
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getTyperefDataTypeCrossReference_3_1_0_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_130);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:11678:5: (otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']' )?
+                    int alt277=2;
+                    int LA277_0 = input.LA(1);
+
+                    if ( (LA277_0==97) ) {
+                        alt277=1;
+                    }
+                    switch (alt277) {
+                        case 1 :
+                            // InternalFormalML.g:11679:6: otherlv_8= '[' ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) ) otherlv_10= ']'
+                            {
+                            otherlv_8=(Token)match(input,97,FollowSets000.FOLLOW_126); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_8, grammarAccess.getOtherDataTypeDefinitionImplAccess().getLeftSquareBracketKeyword_3_1_1_0());
+                              					
+                            }
+                            // InternalFormalML.g:11683:6: ( (lv_multiplicity_9_0= ruleDataTypeMultiplicity ) )
+                            // InternalFormalML.g:11684:7: (lv_multiplicity_9_0= ruleDataTypeMultiplicity )
+                            {
+                            // InternalFormalML.g:11684:7: (lv_multiplicity_9_0= ruleDataTypeMultiplicity )
+                            // InternalFormalML.g:11685:8: lv_multiplicity_9_0= ruleDataTypeMultiplicity
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getOtherDataTypeDefinitionImplAccess().getMultiplicityDataTypeMultiplicityParserRuleCall_3_1_1_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_110);
+                            lv_multiplicity_9_0=ruleDataTypeMultiplicity();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getOtherDataTypeDefinitionImplRule());
+                              								}
+                              								set(
+                              									current,
+                              									"multiplicity",
+                              									lv_multiplicity_9_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_10=(Token)match(input,99,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_10, grammarAccess.getOtherDataTypeDefinitionImplAccess().getRightSquareBracketKeyword_3_1_1_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:11709:3: ( (lv_typedef_11_0= ';' ) )
+            // InternalFormalML.g:11710:4: (lv_typedef_11_0= ';' )
+            {
+            // InternalFormalML.g:11710:4: (lv_typedef_11_0= ';' )
+            // InternalFormalML.g:11711:5: lv_typedef_11_0= ';'
+            {
+            lv_typedef_11_0=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_11_0, grammarAccess.getOtherDataTypeDefinitionImplAccess().getTypedefSemicolonKeyword_4_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getOtherDataTypeDefinitionImplRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, ";");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOtherDataTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleDataType"
+    // InternalFormalML.g:11727:1: entryRuleDataType returns [EObject current=null] : iv_ruleDataType= ruleDataType EOF ;
+    public final EObject entryRuleDataType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDataType = null;
+
+
+        try {
+            // InternalFormalML.g:11727:49: (iv_ruleDataType= ruleDataType EOF )
+            // InternalFormalML.g:11728:2: iv_ruleDataType= ruleDataType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDataTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDataType=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDataType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDataType"
+
+
+    // $ANTLR start "ruleDataType"
+    // InternalFormalML.g:11734:1: ruleDataType returns [EObject current=null] : (this_DataTypeReference_0= ruleDataTypeReference | this_StructuredDataType_1= ruleStructuredDataType ) ;
+    public final EObject ruleDataType() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_DataTypeReference_0 = null;
+
+        EObject this_StructuredDataType_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11740:2: ( (this_DataTypeReference_0= ruleDataTypeReference | this_StructuredDataType_1= ruleStructuredDataType ) )
+            // InternalFormalML.g:11741:2: (this_DataTypeReference_0= ruleDataTypeReference | this_StructuredDataType_1= ruleStructuredDataType )
+            {
+            // InternalFormalML.g:11741:2: (this_DataTypeReference_0= ruleDataTypeReference | this_StructuredDataType_1= ruleStructuredDataType )
+            int alt279=2;
+            int LA279_0 = input.LA(1);
+
+            if ( (LA279_0==RULE_XLIA_ID||LA279_0==28||LA279_0==53||(LA279_0>=102 && LA279_0<=105)||(LA279_0>=107 && LA279_0<=123)||(LA279_0>=136 && LA279_0<=138)||LA279_0==212||(LA279_0>=216 && LA279_0<=217)||(LA279_0>=260 && LA279_0<=268)) ) {
+                alt279=1;
+            }
+            else if ( ((LA279_0>=124 && LA279_0<=127)) ) {
+                alt279=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 279, 0, input);
+
+                throw nvae;
+            }
+            switch (alt279) {
+                case 1 :
+                    // InternalFormalML.g:11742:3: this_DataTypeReference_0= ruleDataTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDataTypeAccess().getDataTypeReferenceParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_DataTypeReference_0=ruleDataTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DataTypeReference_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11754:3: this_StructuredDataType_1= ruleStructuredDataType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDataTypeAccess().getStructuredDataTypeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_StructuredDataType_1=ruleStructuredDataType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_StructuredDataType_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDataType"
+
+
+    // $ANTLR start "entryRuleSimpleDataType"
+    // InternalFormalML.g:11769:1: entryRuleSimpleDataType returns [EObject current=null] : iv_ruleSimpleDataType= ruleSimpleDataType EOF ;
+    public final EObject entryRuleSimpleDataType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSimpleDataType = null;
+
+
+        try {
+            // InternalFormalML.g:11769:55: (iv_ruleSimpleDataType= ruleSimpleDataType EOF )
+            // InternalFormalML.g:11770:2: iv_ruleSimpleDataType= ruleSimpleDataType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSimpleDataTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSimpleDataType=ruleSimpleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSimpleDataType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSimpleDataType"
+
+
+    // $ANTLR start "ruleSimpleDataType"
+    // InternalFormalML.g:11776:1: ruleSimpleDataType returns [EObject current=null] : (this_PrimitiveType_0= rulePrimitiveType | this_IntervalType_1= ruleIntervalType | this_CollectionType_2= ruleCollectionType ) ;
+    public final EObject ruleSimpleDataType() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_PrimitiveType_0 = null;
+
+        EObject this_IntervalType_1 = null;
+
+        EObject this_CollectionType_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11782:2: ( (this_PrimitiveType_0= rulePrimitiveType | this_IntervalType_1= ruleIntervalType | this_CollectionType_2= ruleCollectionType ) )
+            // InternalFormalML.g:11783:2: (this_PrimitiveType_0= rulePrimitiveType | this_IntervalType_1= ruleIntervalType | this_CollectionType_2= ruleCollectionType )
+            {
+            // InternalFormalML.g:11783:2: (this_PrimitiveType_0= rulePrimitiveType | this_IntervalType_1= ruleIntervalType | this_CollectionType_2= ruleCollectionType )
+            int alt280=3;
+            switch ( input.LA(1) ) {
+            case 28:
+            case 53:
+            case 102:
+            case 103:
+            case 104:
+            case 105:
+            case 107:
+            case 108:
+            case 109:
+            case 110:
+            case 111:
+            case 112:
+            case 113:
+            case 114:
+            case 115:
+            case 116:
+            case 117:
+            case 118:
+            case 119:
+            case 120:
+            case 121:
+            case 122:
+            case 136:
+            case 137:
+            case 138:
+            case 212:
+            case 216:
+            case 217:
+            case 260:
+            case 261:
+                {
+                alt280=1;
+                }
+                break;
+            case 123:
+                {
+                alt280=2;
+                }
+                break;
+            case 262:
+            case 263:
+            case 264:
+            case 265:
+            case 266:
+            case 267:
+            case 268:
+                {
+                alt280=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 280, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt280) {
+                case 1 :
+                    // InternalFormalML.g:11784:3: this_PrimitiveType_0= rulePrimitiveType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getSimpleDataTypeAccess().getPrimitiveTypeParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveType_0=rulePrimitiveType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveType_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11796:3: this_IntervalType_1= ruleIntervalType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getSimpleDataTypeAccess().getIntervalTypeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_IntervalType_1=ruleIntervalType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_IntervalType_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11808:3: this_CollectionType_2= ruleCollectionType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getSimpleDataTypeAccess().getCollectionTypeParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_CollectionType_2=ruleCollectionType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_CollectionType_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSimpleDataType"
+
+
+    // $ANTLR start "entryRuleStructuredDataType"
+    // InternalFormalML.g:11823:1: entryRuleStructuredDataType returns [EObject current=null] : iv_ruleStructuredDataType= ruleStructuredDataType EOF ;
+    public final EObject entryRuleStructuredDataType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStructuredDataType = null;
+
+
+        try {
+            // InternalFormalML.g:11823:59: (iv_ruleStructuredDataType= ruleStructuredDataType EOF )
+            // InternalFormalML.g:11824:2: iv_ruleStructuredDataType= ruleStructuredDataType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStructuredDataTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleStructuredDataType=ruleStructuredDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStructuredDataType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStructuredDataType"
+
+
+    // $ANTLR start "ruleStructuredDataType"
+    // InternalFormalML.g:11830:1: ruleStructuredDataType returns [EObject current=null] : (this_EnumerationType_0= ruleEnumerationType | this_StructureType_1= ruleStructureType | this_UnionType_2= ruleUnionType | this_ChoiceType_3= ruleChoiceType ) ;
+    public final EObject ruleStructuredDataType() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_EnumerationType_0 = null;
+
+        EObject this_StructureType_1 = null;
+
+        EObject this_UnionType_2 = null;
+
+        EObject this_ChoiceType_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11836:2: ( (this_EnumerationType_0= ruleEnumerationType | this_StructureType_1= ruleStructureType | this_UnionType_2= ruleUnionType | this_ChoiceType_3= ruleChoiceType ) )
+            // InternalFormalML.g:11837:2: (this_EnumerationType_0= ruleEnumerationType | this_StructureType_1= ruleStructureType | this_UnionType_2= ruleUnionType | this_ChoiceType_3= ruleChoiceType )
+            {
+            // InternalFormalML.g:11837:2: (this_EnumerationType_0= ruleEnumerationType | this_StructureType_1= ruleStructureType | this_UnionType_2= ruleUnionType | this_ChoiceType_3= ruleChoiceType )
+            int alt281=4;
+            switch ( input.LA(1) ) {
+            case 124:
+                {
+                alt281=1;
+                }
+                break;
+            case 125:
+                {
+                alt281=2;
+                }
+                break;
+            case 126:
+                {
+                alt281=3;
+                }
+                break;
+            case 127:
+                {
+                alt281=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 281, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt281) {
+                case 1 :
+                    // InternalFormalML.g:11838:3: this_EnumerationType_0= ruleEnumerationType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getEnumerationTypeParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_EnumerationType_0=ruleEnumerationType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_EnumerationType_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11850:3: this_StructureType_1= ruleStructureType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getStructureTypeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_StructureType_1=ruleStructureType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_StructureType_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11862:3: this_UnionType_2= ruleUnionType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getUnionTypeParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_UnionType_2=ruleUnionType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_UnionType_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:11874:3: this_ChoiceType_3= ruleChoiceType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStructuredDataTypeAccess().getChoiceTypeParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ChoiceType_3=ruleChoiceType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ChoiceType_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStructuredDataType"
+
+
+    // $ANTLR start "entryRulePrimitiveType"
+    // InternalFormalML.g:11889:1: entryRulePrimitiveType returns [EObject current=null] : iv_rulePrimitiveType= rulePrimitiveType EOF ;
+    public final EObject entryRulePrimitiveType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveType = null;
+
+
+        try {
+            // InternalFormalML.g:11889:54: (iv_rulePrimitiveType= rulePrimitiveType EOF )
+            // InternalFormalML.g:11890:2: iv_rulePrimitiveType= rulePrimitiveType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveType=rulePrimitiveType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveType"
+
+
+    // $ANTLR start "rulePrimitiveType"
+    // InternalFormalML.g:11896:1: rulePrimitiveType returns [EObject current=null] : (this_PrimitiveNumberType_0= rulePrimitiveNumberType | this_OtherPrimitiveType_1= ruleOtherPrimitiveType ) ;
+    public final EObject rulePrimitiveType() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_PrimitiveNumberType_0 = null;
+
+        EObject this_OtherPrimitiveType_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11902:2: ( (this_PrimitiveNumberType_0= rulePrimitiveNumberType | this_OtherPrimitiveType_1= ruleOtherPrimitiveType ) )
+            // InternalFormalML.g:11903:2: (this_PrimitiveNumberType_0= rulePrimitiveNumberType | this_OtherPrimitiveType_1= ruleOtherPrimitiveType )
+            {
+            // InternalFormalML.g:11903:2: (this_PrimitiveNumberType_0= rulePrimitiveNumberType | this_OtherPrimitiveType_1= ruleOtherPrimitiveType )
+            int alt282=2;
+            int LA282_0 = input.LA(1);
+
+            if ( (LA282_0==28||(LA282_0>=102 && LA282_0<=105)||(LA282_0>=107 && LA282_0<=118)||LA282_0==212||(LA282_0>=216 && LA282_0<=217)) ) {
+                alt282=1;
+            }
+            else if ( (LA282_0==53||(LA282_0>=119 && LA282_0<=122)||(LA282_0>=136 && LA282_0<=138)||(LA282_0>=260 && LA282_0<=261)) ) {
+                alt282=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 282, 0, input);
+
+                throw nvae;
+            }
+            switch (alt282) {
+                case 1 :
+                    // InternalFormalML.g:11904:3: this_PrimitiveNumberType_0= rulePrimitiveNumberType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveTypeAccess().getPrimitiveNumberTypeParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveNumberType_0=rulePrimitiveNumberType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveNumberType_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11916:3: this_OtherPrimitiveType_1= ruleOtherPrimitiveType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveTypeAccess().getOtherPrimitiveTypeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_OtherPrimitiveType_1=ruleOtherPrimitiveType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_OtherPrimitiveType_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveType"
+
+
+    // $ANTLR start "entryRulePrimitiveNumberType"
+    // InternalFormalML.g:11931:1: entryRulePrimitiveNumberType returns [EObject current=null] : iv_rulePrimitiveNumberType= rulePrimitiveNumberType EOF ;
+    public final EObject entryRulePrimitiveNumberType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveNumberType = null;
+
+
+        try {
+            // InternalFormalML.g:11931:60: (iv_rulePrimitiveNumberType= rulePrimitiveNumberType EOF )
+            // InternalFormalML.g:11932:2: iv_rulePrimitiveNumberType= rulePrimitiveNumberType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveNumberTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveNumberType=rulePrimitiveNumberType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveNumberType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveNumberType"
+
+
+    // $ANTLR start "rulePrimitiveNumberType"
+    // InternalFormalML.g:11938:1: rulePrimitiveNumberType returns [EObject current=null] : (this_PrimitiveIntegerType_0= rulePrimitiveIntegerType | this_PrimitiveRationalType_1= rulePrimitiveRationalType | this_PrimitiveFloatType_2= rulePrimitiveFloatType | this_PrimitiveRealType_3= rulePrimitiveRealType | this_PrimitiveTimeType_4= rulePrimitiveTimeType ) ;
+    public final EObject rulePrimitiveNumberType() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_PrimitiveIntegerType_0 = null;
+
+        EObject this_PrimitiveRationalType_1 = null;
+
+        EObject this_PrimitiveFloatType_2 = null;
+
+        EObject this_PrimitiveRealType_3 = null;
+
+        EObject this_PrimitiveTimeType_4 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:11944:2: ( (this_PrimitiveIntegerType_0= rulePrimitiveIntegerType | this_PrimitiveRationalType_1= rulePrimitiveRationalType | this_PrimitiveFloatType_2= rulePrimitiveFloatType | this_PrimitiveRealType_3= rulePrimitiveRealType | this_PrimitiveTimeType_4= rulePrimitiveTimeType ) )
+            // InternalFormalML.g:11945:2: (this_PrimitiveIntegerType_0= rulePrimitiveIntegerType | this_PrimitiveRationalType_1= rulePrimitiveRationalType | this_PrimitiveFloatType_2= rulePrimitiveFloatType | this_PrimitiveRealType_3= rulePrimitiveRealType | this_PrimitiveTimeType_4= rulePrimitiveTimeType )
+            {
+            // InternalFormalML.g:11945:2: (this_PrimitiveIntegerType_0= rulePrimitiveIntegerType | this_PrimitiveRationalType_1= rulePrimitiveRationalType | this_PrimitiveFloatType_2= rulePrimitiveFloatType | this_PrimitiveRealType_3= rulePrimitiveRealType | this_PrimitiveTimeType_4= rulePrimitiveTimeType )
+            int alt283=5;
+            alt283 = dfa283.predict(input);
+            switch (alt283) {
+                case 1 :
+                    // InternalFormalML.g:11946:3: this_PrimitiveIntegerType_0= rulePrimitiveIntegerType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveIntegerType_0=rulePrimitiveIntegerType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveIntegerType_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:11958:3: this_PrimitiveRationalType_1= rulePrimitiveRationalType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveRationalType_1=rulePrimitiveRationalType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveRationalType_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:11970:3: this_PrimitiveFloatType_2= rulePrimitiveFloatType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveFloatType_2=rulePrimitiveFloatType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveFloatType_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:11982:3: this_PrimitiveRealType_3= rulePrimitiveRealType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveRealType_3=rulePrimitiveRealType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveRealType_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:11994:3: this_PrimitiveTimeType_4= rulePrimitiveTimeType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveNumberTypeAccess().getPrimitiveTimeTypeParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveTimeType_4=rulePrimitiveTimeType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveTimeType_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveNumberType"
+
+
+    // $ANTLR start "entryRulePrimitiveIntegerType"
+    // InternalFormalML.g:12009:1: entryRulePrimitiveIntegerType returns [EObject current=null] : iv_rulePrimitiveIntegerType= rulePrimitiveIntegerType EOF ;
+    public final EObject entryRulePrimitiveIntegerType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveIntegerType = null;
+
+
+        try {
+            // InternalFormalML.g:12009:61: (iv_rulePrimitiveIntegerType= rulePrimitiveIntegerType EOF )
+            // InternalFormalML.g:12010:2: iv_rulePrimitiveIntegerType= rulePrimitiveIntegerType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveIntegerTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveIntegerType=rulePrimitiveIntegerType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveIntegerType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveIntegerType"
+
+
+    // $ANTLR start "rulePrimitiveIntegerType"
+    // InternalFormalML.g:12016:1: rulePrimitiveIntegerType returns [EObject current=null] : ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'integer' | otherlv_3= 'uinteger' | otherlv_4= 'int' | otherlv_5= 'uint' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? ) ;
+    public final EObject rulePrimitiveIntegerType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Enumerator lv_sign_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12022:2: ( ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'integer' | otherlv_3= 'uinteger' | otherlv_4= 'int' | otherlv_5= 'uint' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? ) )
+            // InternalFormalML.g:12023:2: ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'integer' | otherlv_3= 'uinteger' | otherlv_4= 'int' | otherlv_5= 'uint' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? )
+            {
+            // InternalFormalML.g:12023:2: ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'integer' | otherlv_3= 'uinteger' | otherlv_4= 'int' | otherlv_5= 'uint' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? )
+            // InternalFormalML.g:12024:3: () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'integer' | otherlv_3= 'uinteger' | otherlv_4= 'int' | otherlv_5= 'uint' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )?
+            {
+            // InternalFormalML.g:12024:3: ()
+            // InternalFormalML.g:12025:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getPrimitiveIntegerTypeAccess().getPrimitiveIntegerTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:12034:3: ( (lv_sign_1_0= rulePrimitiveNumberSign ) )?
+            int alt284=2;
+            int LA284_0 = input.LA(1);
+
+            if ( (LA284_0==28||LA284_0==212||(LA284_0>=216 && LA284_0<=217)) ) {
+                alt284=1;
+            }
+            switch (alt284) {
+                case 1 :
+                    // InternalFormalML.g:12035:4: (lv_sign_1_0= rulePrimitiveNumberSign )
+                    {
+                    // InternalFormalML.g:12035:4: (lv_sign_1_0= rulePrimitiveNumberSign )
+                    // InternalFormalML.g:12036:5: lv_sign_1_0= rulePrimitiveNumberSign
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPrimitiveIntegerTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_131);
+                    lv_sign_1_0=rulePrimitiveNumberSign();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPrimitiveIntegerTypeRule());
+                      					}
+                      					set(
+                      						current,
+                      						"sign",
+                      						lv_sign_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:12053:3: (otherlv_2= 'integer' | otherlv_3= 'uinteger' | otherlv_4= 'int' | otherlv_5= 'uint' )
+            int alt285=4;
+            switch ( input.LA(1) ) {
+            case 102:
+                {
+                alt285=1;
+                }
+                break;
+            case 103:
+                {
+                alt285=2;
+                }
+                break;
+            case 104:
+                {
+                alt285=3;
+                }
+                break;
+            case 105:
+                {
+                alt285=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 285, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt285) {
+                case 1 :
+                    // InternalFormalML.g:12054:4: otherlv_2= 'integer'
+                    {
+                    otherlv_2=(Token)match(input,102,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getPrimitiveIntegerTypeAccess().getIntegerKeyword_2_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12059:4: otherlv_3= 'uinteger'
+                    {
+                    otherlv_3=(Token)match(input,103,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getPrimitiveIntegerTypeAccess().getUintegerKeyword_2_1());
+                      			
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12064:4: otherlv_4= 'int'
+                    {
+                    otherlv_4=(Token)match(input,104,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getPrimitiveIntegerTypeAccess().getIntKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12069:4: otherlv_5= 'uint'
+                    {
+                    otherlv_5=(Token)match(input,105,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getPrimitiveIntegerTypeAccess().getUintKeyword_2_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:12074:3: ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )?
+            int alt287=3;
+            int LA287_0 = input.LA(1);
+
+            if ( (LA287_0==30) ) {
+                alt287=1;
+            }
+            else if ( (LA287_0==16) ) {
+                alt287=2;
+            }
+            switch (alt287) {
+                case 1 :
+                    // InternalFormalML.g:12075:4: (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) )
+                    {
+                    // InternalFormalML.g:12075:4: (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) )
+                    // InternalFormalML.g:12076:5: otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) )
+                    {
+                    otherlv_6=(Token)match(input,30,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getPrimitiveIntegerTypeAccess().getColonKeyword_3_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:12080:5: ( (lv_size_7_0= ruleEInt ) )
+                    // InternalFormalML.g:12081:6: (lv_size_7_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12081:6: (lv_size_7_0= ruleEInt )
+                    // InternalFormalML.g:12082:7: lv_size_7_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_size_7_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveIntegerTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_7_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12101:4: (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' )
+                    {
+                    // InternalFormalML.g:12101:4: (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' )
+                    // InternalFormalML.g:12102:5: otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>'
+                    {
+                    otherlv_8=(Token)match(input,16,FollowSets000.FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_8, grammarAccess.getPrimitiveIntegerTypeAccess().getLessThanSignKeyword_3_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:12106:5: (otherlv_9= 'size:' )?
+                    int alt286=2;
+                    int LA286_0 = input.LA(1);
+
+                    if ( (LA286_0==106) ) {
+                        alt286=1;
+                    }
+                    switch (alt286) {
+                        case 1 :
+                            // InternalFormalML.g:12107:6: otherlv_9= 'size:'
+                            {
+                            otherlv_9=(Token)match(input,106,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_9, grammarAccess.getPrimitiveIntegerTypeAccess().getSizeKeyword_3_1_1());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:12112:5: ( (lv_size_10_0= ruleEInt ) )
+                    // InternalFormalML.g:12113:6: (lv_size_10_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12113:6: (lv_size_10_0= ruleEInt )
+                    // InternalFormalML.g:12114:7: lv_size_10_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveIntegerTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_size_10_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveIntegerTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_10_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_11=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getPrimitiveIntegerTypeAccess().getGreaterThanSignKeyword_3_1_3());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveIntegerType"
+
+
+    // $ANTLR start "entryRulePrimitiveRationalType"
+    // InternalFormalML.g:12141:1: entryRulePrimitiveRationalType returns [EObject current=null] : iv_rulePrimitiveRationalType= rulePrimitiveRationalType EOF ;
+    public final EObject entryRulePrimitiveRationalType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveRationalType = null;
+
+
+        try {
+            // InternalFormalML.g:12141:62: (iv_rulePrimitiveRationalType= rulePrimitiveRationalType EOF )
+            // InternalFormalML.g:12142:2: iv_rulePrimitiveRationalType= rulePrimitiveRationalType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveRationalTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveRationalType=rulePrimitiveRationalType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveRationalType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveRationalType"
+
+
+    // $ANTLR start "rulePrimitiveRationalType"
+    // InternalFormalML.g:12148:1: rulePrimitiveRationalType returns [EObject current=null] : ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'rational' | otherlv_3= 'urational' | otherlv_4= 'rat' | otherlv_5= 'urat' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? ) ;
+    public final EObject rulePrimitiveRationalType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Enumerator lv_sign_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12154:2: ( ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'rational' | otherlv_3= 'urational' | otherlv_4= 'rat' | otherlv_5= 'urat' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? ) )
+            // InternalFormalML.g:12155:2: ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'rational' | otherlv_3= 'urational' | otherlv_4= 'rat' | otherlv_5= 'urat' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? )
+            {
+            // InternalFormalML.g:12155:2: ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'rational' | otherlv_3= 'urational' | otherlv_4= 'rat' | otherlv_5= 'urat' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? )
+            // InternalFormalML.g:12156:3: () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'rational' | otherlv_3= 'urational' | otherlv_4= 'rat' | otherlv_5= 'urat' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )?
+            {
+            // InternalFormalML.g:12156:3: ()
+            // InternalFormalML.g:12157:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getPrimitiveRationalTypeAccess().getPrimitiveRationalTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:12166:3: ( (lv_sign_1_0= rulePrimitiveNumberSign ) )?
+            int alt288=2;
+            int LA288_0 = input.LA(1);
+
+            if ( (LA288_0==28||LA288_0==212||(LA288_0>=216 && LA288_0<=217)) ) {
+                alt288=1;
+            }
+            switch (alt288) {
+                case 1 :
+                    // InternalFormalML.g:12167:4: (lv_sign_1_0= rulePrimitiveNumberSign )
+                    {
+                    // InternalFormalML.g:12167:4: (lv_sign_1_0= rulePrimitiveNumberSign )
+                    // InternalFormalML.g:12168:5: lv_sign_1_0= rulePrimitiveNumberSign
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPrimitiveRationalTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_134);
+                    lv_sign_1_0=rulePrimitiveNumberSign();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPrimitiveRationalTypeRule());
+                      					}
+                      					set(
+                      						current,
+                      						"sign",
+                      						lv_sign_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:12185:3: (otherlv_2= 'rational' | otherlv_3= 'urational' | otherlv_4= 'rat' | otherlv_5= 'urat' )
+            int alt289=4;
+            switch ( input.LA(1) ) {
+            case 107:
+                {
+                alt289=1;
+                }
+                break;
+            case 108:
+                {
+                alt289=2;
+                }
+                break;
+            case 109:
+                {
+                alt289=3;
+                }
+                break;
+            case 110:
+                {
+                alt289=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 289, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt289) {
+                case 1 :
+                    // InternalFormalML.g:12186:4: otherlv_2= 'rational'
+                    {
+                    otherlv_2=(Token)match(input,107,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getPrimitiveRationalTypeAccess().getRationalKeyword_2_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12191:4: otherlv_3= 'urational'
+                    {
+                    otherlv_3=(Token)match(input,108,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getPrimitiveRationalTypeAccess().getUrationalKeyword_2_1());
+                      			
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12196:4: otherlv_4= 'rat'
+                    {
+                    otherlv_4=(Token)match(input,109,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getPrimitiveRationalTypeAccess().getRatKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12201:4: otherlv_5= 'urat'
+                    {
+                    otherlv_5=(Token)match(input,110,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getPrimitiveRationalTypeAccess().getUratKeyword_2_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:12206:3: ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )?
+            int alt291=3;
+            int LA291_0 = input.LA(1);
+
+            if ( (LA291_0==30) ) {
+                alt291=1;
+            }
+            else if ( (LA291_0==16) ) {
+                alt291=2;
+            }
+            switch (alt291) {
+                case 1 :
+                    // InternalFormalML.g:12207:4: (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) )
+                    {
+                    // InternalFormalML.g:12207:4: (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) )
+                    // InternalFormalML.g:12208:5: otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) )
+                    {
+                    otherlv_6=(Token)match(input,30,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getPrimitiveRationalTypeAccess().getColonKeyword_3_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:12212:5: ( (lv_size_7_0= ruleEInt ) )
+                    // InternalFormalML.g:12213:6: (lv_size_7_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12213:6: (lv_size_7_0= ruleEInt )
+                    // InternalFormalML.g:12214:7: lv_size_7_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_size_7_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveRationalTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_7_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12233:4: (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' )
+                    {
+                    // InternalFormalML.g:12233:4: (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' )
+                    // InternalFormalML.g:12234:5: otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>'
+                    {
+                    otherlv_8=(Token)match(input,16,FollowSets000.FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_8, grammarAccess.getPrimitiveRationalTypeAccess().getLessThanSignKeyword_3_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:12238:5: (otherlv_9= 'size:' )?
+                    int alt290=2;
+                    int LA290_0 = input.LA(1);
+
+                    if ( (LA290_0==106) ) {
+                        alt290=1;
+                    }
+                    switch (alt290) {
+                        case 1 :
+                            // InternalFormalML.g:12239:6: otherlv_9= 'size:'
+                            {
+                            otherlv_9=(Token)match(input,106,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_9, grammarAccess.getPrimitiveRationalTypeAccess().getSizeKeyword_3_1_1());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:12244:5: ( (lv_size_10_0= ruleEInt ) )
+                    // InternalFormalML.g:12245:6: (lv_size_10_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12245:6: (lv_size_10_0= ruleEInt )
+                    // InternalFormalML.g:12246:7: lv_size_10_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveRationalTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_size_10_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveRationalTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_10_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_11=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getPrimitiveRationalTypeAccess().getGreaterThanSignKeyword_3_1_3());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveRationalType"
+
+
+    // $ANTLR start "entryRulePrimitiveFloatType"
+    // InternalFormalML.g:12273:1: entryRulePrimitiveFloatType returns [EObject current=null] : iv_rulePrimitiveFloatType= rulePrimitiveFloatType EOF ;
+    public final EObject entryRulePrimitiveFloatType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveFloatType = null;
+
+
+        try {
+            // InternalFormalML.g:12273:59: (iv_rulePrimitiveFloatType= rulePrimitiveFloatType EOF )
+            // InternalFormalML.g:12274:2: iv_rulePrimitiveFloatType= rulePrimitiveFloatType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveFloatTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveFloatType=rulePrimitiveFloatType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveFloatType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveFloatType"
+
+
+    // $ANTLR start "rulePrimitiveFloatType"
+    // InternalFormalML.g:12280:1: rulePrimitiveFloatType returns [EObject current=null] : ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'float' | otherlv_3= 'ufloat' | otherlv_4= 'double' | otherlv_5= 'udouble' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? ) ;
+    public final EObject rulePrimitiveFloatType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Enumerator lv_sign_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12286:2: ( ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'float' | otherlv_3= 'ufloat' | otherlv_4= 'double' | otherlv_5= 'udouble' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? ) )
+            // InternalFormalML.g:12287:2: ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'float' | otherlv_3= 'ufloat' | otherlv_4= 'double' | otherlv_5= 'udouble' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? )
+            {
+            // InternalFormalML.g:12287:2: ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'float' | otherlv_3= 'ufloat' | otherlv_4= 'double' | otherlv_5= 'udouble' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )? )
+            // InternalFormalML.g:12288:3: () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'float' | otherlv_3= 'ufloat' | otherlv_4= 'double' | otherlv_5= 'udouble' ) ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )?
+            {
+            // InternalFormalML.g:12288:3: ()
+            // InternalFormalML.g:12289:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getPrimitiveFloatTypeAccess().getPrimitiveFloatTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:12298:3: ( (lv_sign_1_0= rulePrimitiveNumberSign ) )?
+            int alt292=2;
+            int LA292_0 = input.LA(1);
+
+            if ( (LA292_0==28||LA292_0==212||(LA292_0>=216 && LA292_0<=217)) ) {
+                alt292=1;
+            }
+            switch (alt292) {
+                case 1 :
+                    // InternalFormalML.g:12299:4: (lv_sign_1_0= rulePrimitiveNumberSign )
+                    {
+                    // InternalFormalML.g:12299:4: (lv_sign_1_0= rulePrimitiveNumberSign )
+                    // InternalFormalML.g:12300:5: lv_sign_1_0= rulePrimitiveNumberSign
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPrimitiveFloatTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_135);
+                    lv_sign_1_0=rulePrimitiveNumberSign();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPrimitiveFloatTypeRule());
+                      					}
+                      					set(
+                      						current,
+                      						"sign",
+                      						lv_sign_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:12317:3: (otherlv_2= 'float' | otherlv_3= 'ufloat' | otherlv_4= 'double' | otherlv_5= 'udouble' )
+            int alt293=4;
+            switch ( input.LA(1) ) {
+            case 111:
+                {
+                alt293=1;
+                }
+                break;
+            case 112:
+                {
+                alt293=2;
+                }
+                break;
+            case 113:
+                {
+                alt293=3;
+                }
+                break;
+            case 114:
+                {
+                alt293=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 293, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt293) {
+                case 1 :
+                    // InternalFormalML.g:12318:4: otherlv_2= 'float'
+                    {
+                    otherlv_2=(Token)match(input,111,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getPrimitiveFloatTypeAccess().getFloatKeyword_2_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12323:4: otherlv_3= 'ufloat'
+                    {
+                    otherlv_3=(Token)match(input,112,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getPrimitiveFloatTypeAccess().getUfloatKeyword_2_1());
+                      			
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12328:4: otherlv_4= 'double'
+                    {
+                    otherlv_4=(Token)match(input,113,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getPrimitiveFloatTypeAccess().getDoubleKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12333:4: otherlv_5= 'udouble'
+                    {
+                    otherlv_5=(Token)match(input,114,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getPrimitiveFloatTypeAccess().getUdoubleKeyword_2_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:12338:3: ( (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) ) | (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' ) )?
+            int alt295=3;
+            int LA295_0 = input.LA(1);
+
+            if ( (LA295_0==30) ) {
+                alt295=1;
+            }
+            else if ( (LA295_0==16) ) {
+                alt295=2;
+            }
+            switch (alt295) {
+                case 1 :
+                    // InternalFormalML.g:12339:4: (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) )
+                    {
+                    // InternalFormalML.g:12339:4: (otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) ) )
+                    // InternalFormalML.g:12340:5: otherlv_6= ':' ( (lv_size_7_0= ruleEInt ) )
+                    {
+                    otherlv_6=(Token)match(input,30,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getPrimitiveFloatTypeAccess().getColonKeyword_3_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:12344:5: ( (lv_size_7_0= ruleEInt ) )
+                    // InternalFormalML.g:12345:6: (lv_size_7_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12345:6: (lv_size_7_0= ruleEInt )
+                    // InternalFormalML.g:12346:7: lv_size_7_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_size_7_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveFloatTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_7_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12365:4: (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' )
+                    {
+                    // InternalFormalML.g:12365:4: (otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>' )
+                    // InternalFormalML.g:12366:5: otherlv_8= '<' (otherlv_9= 'size:' )? ( (lv_size_10_0= ruleEInt ) ) otherlv_11= '>'
+                    {
+                    otherlv_8=(Token)match(input,16,FollowSets000.FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_8, grammarAccess.getPrimitiveFloatTypeAccess().getLessThanSignKeyword_3_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:12370:5: (otherlv_9= 'size:' )?
+                    int alt294=2;
+                    int LA294_0 = input.LA(1);
+
+                    if ( (LA294_0==106) ) {
+                        alt294=1;
+                    }
+                    switch (alt294) {
+                        case 1 :
+                            // InternalFormalML.g:12371:6: otherlv_9= 'size:'
+                            {
+                            otherlv_9=(Token)match(input,106,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_9, grammarAccess.getPrimitiveFloatTypeAccess().getSizeKeyword_3_1_1());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:12376:5: ( (lv_size_10_0= ruleEInt ) )
+                    // InternalFormalML.g:12377:6: (lv_size_10_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12377:6: (lv_size_10_0= ruleEInt )
+                    // InternalFormalML.g:12378:7: lv_size_10_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveFloatTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_size_10_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveFloatTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_10_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_11=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getPrimitiveFloatTypeAccess().getGreaterThanSignKeyword_3_1_3());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveFloatType"
+
+
+    // $ANTLR start "entryRulePrimitiveRealType"
+    // InternalFormalML.g:12405:1: entryRulePrimitiveRealType returns [EObject current=null] : iv_rulePrimitiveRealType= rulePrimitiveRealType EOF ;
+    public final EObject entryRulePrimitiveRealType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveRealType = null;
+
+
+        try {
+            // InternalFormalML.g:12405:58: (iv_rulePrimitiveRealType= rulePrimitiveRealType EOF )
+            // InternalFormalML.g:12406:2: iv_rulePrimitiveRealType= rulePrimitiveRealType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveRealTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveRealType=rulePrimitiveRealType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveRealType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveRealType"
+
+
+    // $ANTLR start "rulePrimitiveRealType"
+    // InternalFormalML.g:12412:1: rulePrimitiveRealType returns [EObject current=null] : ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'real' | otherlv_3= 'ureal' ) ( (otherlv_4= ':' ( (lv_size_5_0= ruleEInt ) ) ) | (otherlv_6= '<' (otherlv_7= 'size:' )? ( (lv_size_8_0= ruleEInt ) ) otherlv_9= '>' ) )? ) ;
+    public final EObject rulePrimitiveRealType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Enumerator lv_sign_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12418:2: ( ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'real' | otherlv_3= 'ureal' ) ( (otherlv_4= ':' ( (lv_size_5_0= ruleEInt ) ) ) | (otherlv_6= '<' (otherlv_7= 'size:' )? ( (lv_size_8_0= ruleEInt ) ) otherlv_9= '>' ) )? ) )
+            // InternalFormalML.g:12419:2: ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'real' | otherlv_3= 'ureal' ) ( (otherlv_4= ':' ( (lv_size_5_0= ruleEInt ) ) ) | (otherlv_6= '<' (otherlv_7= 'size:' )? ( (lv_size_8_0= ruleEInt ) ) otherlv_9= '>' ) )? )
+            {
+            // InternalFormalML.g:12419:2: ( () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'real' | otherlv_3= 'ureal' ) ( (otherlv_4= ':' ( (lv_size_5_0= ruleEInt ) ) ) | (otherlv_6= '<' (otherlv_7= 'size:' )? ( (lv_size_8_0= ruleEInt ) ) otherlv_9= '>' ) )? )
+            // InternalFormalML.g:12420:3: () ( (lv_sign_1_0= rulePrimitiveNumberSign ) )? (otherlv_2= 'real' | otherlv_3= 'ureal' ) ( (otherlv_4= ':' ( (lv_size_5_0= ruleEInt ) ) ) | (otherlv_6= '<' (otherlv_7= 'size:' )? ( (lv_size_8_0= ruleEInt ) ) otherlv_9= '>' ) )?
+            {
+            // InternalFormalML.g:12420:3: ()
+            // InternalFormalML.g:12421:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getPrimitiveRealTypeAccess().getPrimitiveRealTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:12430:3: ( (lv_sign_1_0= rulePrimitiveNumberSign ) )?
+            int alt296=2;
+            int LA296_0 = input.LA(1);
+
+            if ( (LA296_0==28||LA296_0==212||(LA296_0>=216 && LA296_0<=217)) ) {
+                alt296=1;
+            }
+            switch (alt296) {
+                case 1 :
+                    // InternalFormalML.g:12431:4: (lv_sign_1_0= rulePrimitiveNumberSign )
+                    {
+                    // InternalFormalML.g:12431:4: (lv_sign_1_0= rulePrimitiveNumberSign )
+                    // InternalFormalML.g:12432:5: lv_sign_1_0= rulePrimitiveNumberSign
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPrimitiveRealTypeAccess().getSignPrimitiveNumberSignEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_136);
+                    lv_sign_1_0=rulePrimitiveNumberSign();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPrimitiveRealTypeRule());
+                      					}
+                      					set(
+                      						current,
+                      						"sign",
+                      						lv_sign_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:12449:3: (otherlv_2= 'real' | otherlv_3= 'ureal' )
+            int alt297=2;
+            int LA297_0 = input.LA(1);
+
+            if ( (LA297_0==115) ) {
+                alt297=1;
+            }
+            else if ( (LA297_0==116) ) {
+                alt297=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 297, 0, input);
+
+                throw nvae;
+            }
+            switch (alt297) {
+                case 1 :
+                    // InternalFormalML.g:12450:4: otherlv_2= 'real'
+                    {
+                    otherlv_2=(Token)match(input,115,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getPrimitiveRealTypeAccess().getRealKeyword_2_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12455:4: otherlv_3= 'ureal'
+                    {
+                    otherlv_3=(Token)match(input,116,FollowSets000.FOLLOW_112); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getPrimitiveRealTypeAccess().getUrealKeyword_2_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:12460:3: ( (otherlv_4= ':' ( (lv_size_5_0= ruleEInt ) ) ) | (otherlv_6= '<' (otherlv_7= 'size:' )? ( (lv_size_8_0= ruleEInt ) ) otherlv_9= '>' ) )?
+            int alt299=3;
+            int LA299_0 = input.LA(1);
+
+            if ( (LA299_0==30) ) {
+                alt299=1;
+            }
+            else if ( (LA299_0==16) ) {
+                alt299=2;
+            }
+            switch (alt299) {
+                case 1 :
+                    // InternalFormalML.g:12461:4: (otherlv_4= ':' ( (lv_size_5_0= ruleEInt ) ) )
+                    {
+                    // InternalFormalML.g:12461:4: (otherlv_4= ':' ( (lv_size_5_0= ruleEInt ) ) )
+                    // InternalFormalML.g:12462:5: otherlv_4= ':' ( (lv_size_5_0= ruleEInt ) )
+                    {
+                    otherlv_4=(Token)match(input,30,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getPrimitiveRealTypeAccess().getColonKeyword_3_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:12466:5: ( (lv_size_5_0= ruleEInt ) )
+                    // InternalFormalML.g:12467:6: (lv_size_5_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12467:6: (lv_size_5_0= ruleEInt )
+                    // InternalFormalML.g:12468:7: lv_size_5_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_size_5_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveRealTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_5_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12487:4: (otherlv_6= '<' (otherlv_7= 'size:' )? ( (lv_size_8_0= ruleEInt ) ) otherlv_9= '>' )
+                    {
+                    // InternalFormalML.g:12487:4: (otherlv_6= '<' (otherlv_7= 'size:' )? ( (lv_size_8_0= ruleEInt ) ) otherlv_9= '>' )
+                    // InternalFormalML.g:12488:5: otherlv_6= '<' (otherlv_7= 'size:' )? ( (lv_size_8_0= ruleEInt ) ) otherlv_9= '>'
+                    {
+                    otherlv_6=(Token)match(input,16,FollowSets000.FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getPrimitiveRealTypeAccess().getLessThanSignKeyword_3_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:12492:5: (otherlv_7= 'size:' )?
+                    int alt298=2;
+                    int LA298_0 = input.LA(1);
+
+                    if ( (LA298_0==106) ) {
+                        alt298=1;
+                    }
+                    switch (alt298) {
+                        case 1 :
+                            // InternalFormalML.g:12493:6: otherlv_7= 'size:'
+                            {
+                            otherlv_7=(Token)match(input,106,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_7, grammarAccess.getPrimitiveRealTypeAccess().getSizeKeyword_3_1_1());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:12498:5: ( (lv_size_8_0= ruleEInt ) )
+                    // InternalFormalML.g:12499:6: (lv_size_8_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12499:6: (lv_size_8_0= ruleEInt )
+                    // InternalFormalML.g:12500:7: lv_size_8_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveRealTypeAccess().getSizeEIntParserRuleCall_3_1_2_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_size_8_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveRealTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_8_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_9=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_9, grammarAccess.getPrimitiveRealTypeAccess().getGreaterThanSignKeyword_3_1_3());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveRealType"
+
+
+    // $ANTLR start "entryRulePrimitiveTimeType"
+    // InternalFormalML.g:12527:1: entryRulePrimitiveTimeType returns [EObject current=null] : iv_rulePrimitiveTimeType= rulePrimitiveTimeType EOF ;
+    public final EObject entryRulePrimitiveTimeType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveTimeType = null;
+
+
+        try {
+            // InternalFormalML.g:12527:58: (iv_rulePrimitiveTimeType= rulePrimitiveTimeType EOF )
+            // InternalFormalML.g:12528:2: iv_rulePrimitiveTimeType= rulePrimitiveTimeType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveTimeTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveTimeType=rulePrimitiveTimeType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveTimeType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveTimeType"
+
+
+    // $ANTLR start "rulePrimitiveTimeType"
+    // InternalFormalML.g:12534:1: rulePrimitiveTimeType returns [EObject current=null] : ( ( () otherlv_1= 'time' ( (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' ) | ( (lv_support_5_0= rulePrimitiveTimeNumberType ) ) )? ) | ( () ( (lv_clock_7_0= 'clock' ) ) ( (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' ) | ( (lv_support_11_0= rulePrimitiveTimeNumberType ) ) )? ) ) ;
+    public final EObject rulePrimitiveTimeType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_clock_7_0=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        EObject lv_support_3_0 = null;
+
+        EObject lv_support_5_0 = null;
+
+        EObject lv_support_9_0 = null;
+
+        EObject lv_support_11_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12540:2: ( ( ( () otherlv_1= 'time' ( (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' ) | ( (lv_support_5_0= rulePrimitiveTimeNumberType ) ) )? ) | ( () ( (lv_clock_7_0= 'clock' ) ) ( (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' ) | ( (lv_support_11_0= rulePrimitiveTimeNumberType ) ) )? ) ) )
+            // InternalFormalML.g:12541:2: ( ( () otherlv_1= 'time' ( (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' ) | ( (lv_support_5_0= rulePrimitiveTimeNumberType ) ) )? ) | ( () ( (lv_clock_7_0= 'clock' ) ) ( (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' ) | ( (lv_support_11_0= rulePrimitiveTimeNumberType ) ) )? ) )
+            {
+            // InternalFormalML.g:12541:2: ( ( () otherlv_1= 'time' ( (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' ) | ( (lv_support_5_0= rulePrimitiveTimeNumberType ) ) )? ) | ( () ( (lv_clock_7_0= 'clock' ) ) ( (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' ) | ( (lv_support_11_0= rulePrimitiveTimeNumberType ) ) )? ) )
+            int alt302=2;
+            int LA302_0 = input.LA(1);
+
+            if ( (LA302_0==117) ) {
+                alt302=1;
+            }
+            else if ( (LA302_0==118) ) {
+                alt302=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 302, 0, input);
+
+                throw nvae;
+            }
+            switch (alt302) {
+                case 1 :
+                    // InternalFormalML.g:12542:3: ( () otherlv_1= 'time' ( (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' ) | ( (lv_support_5_0= rulePrimitiveTimeNumberType ) ) )? )
+                    {
+                    // InternalFormalML.g:12542:3: ( () otherlv_1= 'time' ( (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' ) | ( (lv_support_5_0= rulePrimitiveTimeNumberType ) ) )? )
+                    // InternalFormalML.g:12543:4: () otherlv_1= 'time' ( (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' ) | ( (lv_support_5_0= rulePrimitiveTimeNumberType ) ) )?
+                    {
+                    // InternalFormalML.g:12543:4: ()
+                    // InternalFormalML.g:12544:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    otherlv_1=(Token)match(input,117,FollowSets000.FOLLOW_137); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getPrimitiveTimeTypeAccess().getTimeKeyword_0_1());
+                      			
+                    }
+                    // InternalFormalML.g:12557:4: ( (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' ) | ( (lv_support_5_0= rulePrimitiveTimeNumberType ) ) )?
+                    int alt300=3;
+                    int LA300_0 = input.LA(1);
+
+                    if ( (LA300_0==16) ) {
+                        alt300=1;
+                    }
+                    else if ( (LA300_0==28||(LA300_0>=102 && LA300_0<=105)||(LA300_0>=107 && LA300_0<=116)||LA300_0==212||(LA300_0>=216 && LA300_0<=217)) ) {
+                        alt300=2;
+                    }
+                    switch (alt300) {
+                        case 1 :
+                            // InternalFormalML.g:12558:5: (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' )
+                            {
+                            // InternalFormalML.g:12558:5: (otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>' )
+                            // InternalFormalML.g:12559:6: otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveTimeNumberType ) ) otherlv_4= '>'
+                            {
+                            otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_138); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_2, grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_0_2_0_0());
+                              					
+                            }
+                            // InternalFormalML.g:12563:6: ( (lv_support_3_0= rulePrimitiveTimeNumberType ) )
+                            // InternalFormalML.g:12564:7: (lv_support_3_0= rulePrimitiveTimeNumberType )
+                            {
+                            // InternalFormalML.g:12564:7: (lv_support_3_0= rulePrimitiveTimeNumberType )
+                            // InternalFormalML.g:12565:8: lv_support_3_0= rulePrimitiveTimeNumberType
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_23);
+                            lv_support_3_0=rulePrimitiveTimeNumberType();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
+                              								}
+                              								set(
+                              									current,
+                              									"support",
+                              									lv_support_3_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_4=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_4, grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_0_2_0_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:12588:5: ( (lv_support_5_0= rulePrimitiveTimeNumberType ) )
+                            {
+                            // InternalFormalML.g:12588:5: ( (lv_support_5_0= rulePrimitiveTimeNumberType ) )
+                            // InternalFormalML.g:12589:6: (lv_support_5_0= rulePrimitiveTimeNumberType )
+                            {
+                            // InternalFormalML.g:12589:6: (lv_support_5_0= rulePrimitiveTimeNumberType )
+                            // InternalFormalML.g:12590:7: lv_support_5_0= rulePrimitiveTimeNumberType
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            lv_support_5_0=rulePrimitiveTimeNumberType();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"support",
+                              								lv_support_5_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12610:3: ( () ( (lv_clock_7_0= 'clock' ) ) ( (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' ) | ( (lv_support_11_0= rulePrimitiveTimeNumberType ) ) )? )
+                    {
+                    // InternalFormalML.g:12610:3: ( () ( (lv_clock_7_0= 'clock' ) ) ( (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' ) | ( (lv_support_11_0= rulePrimitiveTimeNumberType ) ) )? )
+                    // InternalFormalML.g:12611:4: () ( (lv_clock_7_0= 'clock' ) ) ( (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' ) | ( (lv_support_11_0= rulePrimitiveTimeNumberType ) ) )?
+                    {
+                    // InternalFormalML.g:12611:4: ()
+                    // InternalFormalML.g:12612:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getPrimitiveTimeTypeAccess().getPrimitiveTimeTypeAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:12621:4: ( (lv_clock_7_0= 'clock' ) )
+                    // InternalFormalML.g:12622:5: (lv_clock_7_0= 'clock' )
+                    {
+                    // InternalFormalML.g:12622:5: (lv_clock_7_0= 'clock' )
+                    // InternalFormalML.g:12623:6: lv_clock_7_0= 'clock'
+                    {
+                    lv_clock_7_0=(Token)match(input,118,FollowSets000.FOLLOW_137); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_clock_7_0, grammarAccess.getPrimitiveTimeTypeAccess().getClockClockKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getPrimitiveTimeTypeRule());
+                      						}
+                      						setWithLastConsumed(current, "clock", true, "clock");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:12635:4: ( (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' ) | ( (lv_support_11_0= rulePrimitiveTimeNumberType ) ) )?
+                    int alt301=3;
+                    int LA301_0 = input.LA(1);
+
+                    if ( (LA301_0==16) ) {
+                        alt301=1;
+                    }
+                    else if ( (LA301_0==28||(LA301_0>=102 && LA301_0<=105)||(LA301_0>=107 && LA301_0<=116)||LA301_0==212||(LA301_0>=216 && LA301_0<=217)) ) {
+                        alt301=2;
+                    }
+                    switch (alt301) {
+                        case 1 :
+                            // InternalFormalML.g:12636:5: (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' )
+                            {
+                            // InternalFormalML.g:12636:5: (otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>' )
+                            // InternalFormalML.g:12637:6: otherlv_8= '<' ( (lv_support_9_0= rulePrimitiveTimeNumberType ) ) otherlv_10= '>'
+                            {
+                            otherlv_8=(Token)match(input,16,FollowSets000.FOLLOW_138); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_8, grammarAccess.getPrimitiveTimeTypeAccess().getLessThanSignKeyword_1_2_0_0());
+                              					
+                            }
+                            // InternalFormalML.g:12641:6: ( (lv_support_9_0= rulePrimitiveTimeNumberType ) )
+                            // InternalFormalML.g:12642:7: (lv_support_9_0= rulePrimitiveTimeNumberType )
+                            {
+                            // InternalFormalML.g:12642:7: (lv_support_9_0= rulePrimitiveTimeNumberType )
+                            // InternalFormalML.g:12643:8: lv_support_9_0= rulePrimitiveTimeNumberType
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_23);
+                            lv_support_9_0=rulePrimitiveTimeNumberType();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
+                              								}
+                              								set(
+                              									current,
+                              									"support",
+                              									lv_support_9_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_10=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_10, grammarAccess.getPrimitiveTimeTypeAccess().getGreaterThanSignKeyword_1_2_0_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:12666:5: ( (lv_support_11_0= rulePrimitiveTimeNumberType ) )
+                            {
+                            // InternalFormalML.g:12666:5: ( (lv_support_11_0= rulePrimitiveTimeNumberType ) )
+                            // InternalFormalML.g:12667:6: (lv_support_11_0= rulePrimitiveTimeNumberType )
+                            {
+                            // InternalFormalML.g:12667:6: (lv_support_11_0= rulePrimitiveTimeNumberType )
+                            // InternalFormalML.g:12668:7: lv_support_11_0= rulePrimitiveTimeNumberType
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getPrimitiveTimeTypeAccess().getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            lv_support_11_0=rulePrimitiveTimeNumberType();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getPrimitiveTimeTypeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"support",
+                              								lv_support_11_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveTimeType"
+
+
+    // $ANTLR start "entryRulePrimitiveTimeNumberType"
+    // InternalFormalML.g:12691:1: entryRulePrimitiveTimeNumberType returns [EObject current=null] : iv_rulePrimitiveTimeNumberType= rulePrimitiveTimeNumberType EOF ;
+    public final EObject entryRulePrimitiveTimeNumberType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveTimeNumberType = null;
+
+
+        try {
+            // InternalFormalML.g:12691:64: (iv_rulePrimitiveTimeNumberType= rulePrimitiveTimeNumberType EOF )
+            // InternalFormalML.g:12692:2: iv_rulePrimitiveTimeNumberType= rulePrimitiveTimeNumberType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveTimeNumberType=rulePrimitiveTimeNumberType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveTimeNumberType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveTimeNumberType"
+
+
+    // $ANTLR start "rulePrimitiveTimeNumberType"
+    // InternalFormalML.g:12698:1: rulePrimitiveTimeNumberType returns [EObject current=null] : (this_PrimitiveIntegerType_0= rulePrimitiveIntegerType | this_PrimitiveRationalType_1= rulePrimitiveRationalType | this_PrimitiveFloatType_2= rulePrimitiveFloatType | this_PrimitiveRealType_3= rulePrimitiveRealType ) ;
+    public final EObject rulePrimitiveTimeNumberType() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_PrimitiveIntegerType_0 = null;
+
+        EObject this_PrimitiveRationalType_1 = null;
+
+        EObject this_PrimitiveFloatType_2 = null;
+
+        EObject this_PrimitiveRealType_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12704:2: ( (this_PrimitiveIntegerType_0= rulePrimitiveIntegerType | this_PrimitiveRationalType_1= rulePrimitiveRationalType | this_PrimitiveFloatType_2= rulePrimitiveFloatType | this_PrimitiveRealType_3= rulePrimitiveRealType ) )
+            // InternalFormalML.g:12705:2: (this_PrimitiveIntegerType_0= rulePrimitiveIntegerType | this_PrimitiveRationalType_1= rulePrimitiveRationalType | this_PrimitiveFloatType_2= rulePrimitiveFloatType | this_PrimitiveRealType_3= rulePrimitiveRealType )
+            {
+            // InternalFormalML.g:12705:2: (this_PrimitiveIntegerType_0= rulePrimitiveIntegerType | this_PrimitiveRationalType_1= rulePrimitiveRationalType | this_PrimitiveFloatType_2= rulePrimitiveFloatType | this_PrimitiveRealType_3= rulePrimitiveRealType )
+            int alt303=4;
+            switch ( input.LA(1) ) {
+            case 212:
+                {
+                switch ( input.LA(2) ) {
+                case 111:
+                case 112:
+                case 113:
+                case 114:
+                    {
+                    alt303=3;
+                    }
+                    break;
+                case 115:
+                case 116:
+                    {
+                    alt303=4;
+                    }
+                    break;
+                case 102:
+                case 103:
+                case 104:
+                case 105:
+                    {
+                    alt303=1;
+                    }
+                    break;
+                case 107:
+                case 108:
+                case 109:
+                case 110:
+                    {
+                    alt303=2;
+                    }
+                    break;
+                default:
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 303, 1, input);
+
+                    throw nvae;
+                }
+
+                }
+                break;
+            case 216:
+                {
+                switch ( input.LA(2) ) {
+                case 107:
+                case 108:
+                case 109:
+                case 110:
+                    {
+                    alt303=2;
+                    }
+                    break;
+                case 111:
+                case 112:
+                case 113:
+                case 114:
+                    {
+                    alt303=3;
+                    }
+                    break;
+                case 115:
+                case 116:
+                    {
+                    alt303=4;
+                    }
+                    break;
+                case 102:
+                case 103:
+                case 104:
+                case 105:
+                    {
+                    alt303=1;
+                    }
+                    break;
+                default:
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 303, 2, input);
+
+                    throw nvae;
+                }
+
+                }
+                break;
+            case 28:
+                {
+                switch ( input.LA(2) ) {
+                case 111:
+                case 112:
+                case 113:
+                case 114:
+                    {
+                    alt303=3;
+                    }
+                    break;
+                case 115:
+                case 116:
+                    {
+                    alt303=4;
+                    }
+                    break;
+                case 102:
+                case 103:
+                case 104:
+                case 105:
+                    {
+                    alt303=1;
+                    }
+                    break;
+                case 107:
+                case 108:
+                case 109:
+                case 110:
+                    {
+                    alt303=2;
+                    }
+                    break;
+                default:
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 303, 3, input);
+
+                    throw nvae;
+                }
+
+                }
+                break;
+            case 217:
+                {
+                switch ( input.LA(2) ) {
+                case 111:
+                case 112:
+                case 113:
+                case 114:
+                    {
+                    alt303=3;
+                    }
+                    break;
+                case 115:
+                case 116:
+                    {
+                    alt303=4;
+                    }
+                    break;
+                case 102:
+                case 103:
+                case 104:
+                case 105:
+                    {
+                    alt303=1;
+                    }
+                    break;
+                case 107:
+                case 108:
+                case 109:
+                case 110:
+                    {
+                    alt303=2;
+                    }
+                    break;
+                default:
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 303, 4, input);
+
+                    throw nvae;
+                }
+
+                }
+                break;
+            case 102:
+            case 103:
+            case 104:
+            case 105:
+                {
+                alt303=1;
+                }
+                break;
+            case 107:
+            case 108:
+            case 109:
+            case 110:
+                {
+                alt303=2;
+                }
+                break;
+            case 111:
+            case 112:
+            case 113:
+            case 114:
+                {
+                alt303=3;
+                }
+                break;
+            case 115:
+            case 116:
+                {
+                alt303=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 303, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt303) {
+                case 1 :
+                    // InternalFormalML.g:12706:3: this_PrimitiveIntegerType_0= rulePrimitiveIntegerType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveIntegerTypeParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveIntegerType_0=rulePrimitiveIntegerType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveIntegerType_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12718:3: this_PrimitiveRationalType_1= rulePrimitiveRationalType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRationalTypeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveRationalType_1=rulePrimitiveRationalType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveRationalType_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12730:3: this_PrimitiveFloatType_2= rulePrimitiveFloatType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveFloatTypeParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveFloatType_2=rulePrimitiveFloatType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveFloatType_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12742:3: this_PrimitiveRealType_3= rulePrimitiveRealType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getPrimitiveTimeNumberTypeAccess().getPrimitiveRealTypeParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveRealType_3=rulePrimitiveRealType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveRealType_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveTimeNumberType"
+
+
+    // $ANTLR start "entryRuleOtherPrimitiveType"
+    // InternalFormalML.g:12757:1: entryRuleOtherPrimitiveType returns [EObject current=null] : iv_ruleOtherPrimitiveType= ruleOtherPrimitiveType EOF ;
+    public final EObject entryRuleOtherPrimitiveType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleOtherPrimitiveType = null;
+
+
+        try {
+            // InternalFormalML.g:12757:59: (iv_ruleOtherPrimitiveType= ruleOtherPrimitiveType EOF )
+            // InternalFormalML.g:12758:2: iv_ruleOtherPrimitiveType= ruleOtherPrimitiveType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOtherPrimitiveTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleOtherPrimitiveType=ruleOtherPrimitiveType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOtherPrimitiveType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOtherPrimitiveType"
+
+
+    // $ANTLR start "ruleOtherPrimitiveType"
+    // InternalFormalML.g:12764:1: ruleOtherPrimitiveType returns [EObject current=null] : (this_PrimitiveBooleanType_0= rulePrimitiveBooleanType | this_PrimitiveCharacterType_1= rulePrimitiveCharacterType | this_PrimitiveStringType_2= rulePrimitiveStringType | this_PrimitiveInstanceType_3= rulePrimitiveInstanceType ) ;
+    public final EObject ruleOtherPrimitiveType() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_PrimitiveBooleanType_0 = null;
+
+        EObject this_PrimitiveCharacterType_1 = null;
+
+        EObject this_PrimitiveStringType_2 = null;
+
+        EObject this_PrimitiveInstanceType_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12770:2: ( (this_PrimitiveBooleanType_0= rulePrimitiveBooleanType | this_PrimitiveCharacterType_1= rulePrimitiveCharacterType | this_PrimitiveStringType_2= rulePrimitiveStringType | this_PrimitiveInstanceType_3= rulePrimitiveInstanceType ) )
+            // InternalFormalML.g:12771:2: (this_PrimitiveBooleanType_0= rulePrimitiveBooleanType | this_PrimitiveCharacterType_1= rulePrimitiveCharacterType | this_PrimitiveStringType_2= rulePrimitiveStringType | this_PrimitiveInstanceType_3= rulePrimitiveInstanceType )
+            {
+            // InternalFormalML.g:12771:2: (this_PrimitiveBooleanType_0= rulePrimitiveBooleanType | this_PrimitiveCharacterType_1= rulePrimitiveCharacterType | this_PrimitiveStringType_2= rulePrimitiveStringType | this_PrimitiveInstanceType_3= rulePrimitiveInstanceType )
+            int alt304=4;
+            switch ( input.LA(1) ) {
+            case 119:
+            case 120:
+                {
+                alt304=1;
+                }
+                break;
+            case 121:
+                {
+                alt304=2;
+                }
+                break;
+            case 122:
+                {
+                alt304=3;
+                }
+                break;
+            case 53:
+            case 136:
+            case 137:
+            case 138:
+            case 260:
+            case 261:
+                {
+                alt304=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 304, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt304) {
+                case 1 :
+                    // InternalFormalML.g:12772:3: this_PrimitiveBooleanType_0= rulePrimitiveBooleanType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveBooleanTypeParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveBooleanType_0=rulePrimitiveBooleanType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveBooleanType_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12784:3: this_PrimitiveCharacterType_1= rulePrimitiveCharacterType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveCharacterTypeParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveCharacterType_1=rulePrimitiveCharacterType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveCharacterType_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:12796:3: this_PrimitiveStringType_2= rulePrimitiveStringType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveStringTypeParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveStringType_2=rulePrimitiveStringType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveStringType_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:12808:3: this_PrimitiveInstanceType_3= rulePrimitiveInstanceType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getOtherPrimitiveTypeAccess().getPrimitiveInstanceTypeParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimitiveInstanceType_3=rulePrimitiveInstanceType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimitiveInstanceType_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOtherPrimitiveType"
+
+
+    // $ANTLR start "entryRulePrimitiveBooleanType"
+    // InternalFormalML.g:12823:1: entryRulePrimitiveBooleanType returns [EObject current=null] : iv_rulePrimitiveBooleanType= rulePrimitiveBooleanType EOF ;
+    public final EObject entryRulePrimitiveBooleanType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveBooleanType = null;
+
+
+        try {
+            // InternalFormalML.g:12823:61: (iv_rulePrimitiveBooleanType= rulePrimitiveBooleanType EOF )
+            // InternalFormalML.g:12824:2: iv_rulePrimitiveBooleanType= rulePrimitiveBooleanType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveBooleanTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveBooleanType=rulePrimitiveBooleanType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveBooleanType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveBooleanType"
+
+
+    // $ANTLR start "rulePrimitiveBooleanType"
+    // InternalFormalML.g:12830:1: rulePrimitiveBooleanType returns [EObject current=null] : ( () (otherlv_1= 'boolean' | otherlv_2= 'bool' ) ) ;
+    public final EObject rulePrimitiveBooleanType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12836:2: ( ( () (otherlv_1= 'boolean' | otherlv_2= 'bool' ) ) )
+            // InternalFormalML.g:12837:2: ( () (otherlv_1= 'boolean' | otherlv_2= 'bool' ) )
+            {
+            // InternalFormalML.g:12837:2: ( () (otherlv_1= 'boolean' | otherlv_2= 'bool' ) )
+            // InternalFormalML.g:12838:3: () (otherlv_1= 'boolean' | otherlv_2= 'bool' )
+            {
+            // InternalFormalML.g:12838:3: ()
+            // InternalFormalML.g:12839:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getPrimitiveBooleanTypeAccess().getPrimitiveBooleanTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:12848:3: (otherlv_1= 'boolean' | otherlv_2= 'bool' )
+            int alt305=2;
+            int LA305_0 = input.LA(1);
+
+            if ( (LA305_0==119) ) {
+                alt305=1;
+            }
+            else if ( (LA305_0==120) ) {
+                alt305=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 305, 0, input);
+
+                throw nvae;
+            }
+            switch (alt305) {
+                case 1 :
+                    // InternalFormalML.g:12849:4: otherlv_1= 'boolean'
+                    {
+                    otherlv_1=(Token)match(input,119,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getPrimitiveBooleanTypeAccess().getBooleanKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12854:4: otherlv_2= 'bool'
+                    {
+                    otherlv_2=(Token)match(input,120,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getPrimitiveBooleanTypeAccess().getBoolKeyword_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveBooleanType"
+
+
+    // $ANTLR start "entryRulePrimitiveCharacterType"
+    // InternalFormalML.g:12863:1: entryRulePrimitiveCharacterType returns [EObject current=null] : iv_rulePrimitiveCharacterType= rulePrimitiveCharacterType EOF ;
+    public final EObject entryRulePrimitiveCharacterType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveCharacterType = null;
+
+
+        try {
+            // InternalFormalML.g:12863:63: (iv_rulePrimitiveCharacterType= rulePrimitiveCharacterType EOF )
+            // InternalFormalML.g:12864:2: iv_rulePrimitiveCharacterType= rulePrimitiveCharacterType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveCharacterTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveCharacterType=rulePrimitiveCharacterType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveCharacterType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveCharacterType"
+
+
+    // $ANTLR start "rulePrimitiveCharacterType"
+    // InternalFormalML.g:12870:1: rulePrimitiveCharacterType returns [EObject current=null] : ( () otherlv_1= 'char' ) ;
+    public final EObject rulePrimitiveCharacterType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12876:2: ( ( () otherlv_1= 'char' ) )
+            // InternalFormalML.g:12877:2: ( () otherlv_1= 'char' )
+            {
+            // InternalFormalML.g:12877:2: ( () otherlv_1= 'char' )
+            // InternalFormalML.g:12878:3: () otherlv_1= 'char'
+            {
+            // InternalFormalML.g:12878:3: ()
+            // InternalFormalML.g:12879:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getPrimitiveCharacterTypeAccess().getPrimitiveCharacterTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,121,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getPrimitiveCharacterTypeAccess().getCharKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveCharacterType"
+
+
+    // $ANTLR start "entryRulePrimitiveStringType"
+    // InternalFormalML.g:12896:1: entryRulePrimitiveStringType returns [EObject current=null] : iv_rulePrimitiveStringType= rulePrimitiveStringType EOF ;
+    public final EObject entryRulePrimitiveStringType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveStringType = null;
+
+
+        try {
+            // InternalFormalML.g:12896:60: (iv_rulePrimitiveStringType= rulePrimitiveStringType EOF )
+            // InternalFormalML.g:12897:2: iv_rulePrimitiveStringType= rulePrimitiveStringType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveStringTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveStringType=rulePrimitiveStringType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveStringType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveStringType"
+
+
+    // $ANTLR start "rulePrimitiveStringType"
+    // InternalFormalML.g:12903:1: rulePrimitiveStringType returns [EObject current=null] : ( () otherlv_1= 'string' ( (otherlv_2= ':' ( (lv_size_3_0= ruleEInt ) ) ) | (otherlv_4= '<' (otherlv_5= 'size:' )? ( (lv_size_6_0= ruleEInt ) ) otherlv_7= '>' ) )? ) ;
+    public final EObject rulePrimitiveStringType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        AntlrDatatypeRuleToken lv_size_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:12909:2: ( ( () otherlv_1= 'string' ( (otherlv_2= ':' ( (lv_size_3_0= ruleEInt ) ) ) | (otherlv_4= '<' (otherlv_5= 'size:' )? ( (lv_size_6_0= ruleEInt ) ) otherlv_7= '>' ) )? ) )
+            // InternalFormalML.g:12910:2: ( () otherlv_1= 'string' ( (otherlv_2= ':' ( (lv_size_3_0= ruleEInt ) ) ) | (otherlv_4= '<' (otherlv_5= 'size:' )? ( (lv_size_6_0= ruleEInt ) ) otherlv_7= '>' ) )? )
+            {
+            // InternalFormalML.g:12910:2: ( () otherlv_1= 'string' ( (otherlv_2= ':' ( (lv_size_3_0= ruleEInt ) ) ) | (otherlv_4= '<' (otherlv_5= 'size:' )? ( (lv_size_6_0= ruleEInt ) ) otherlv_7= '>' ) )? )
+            // InternalFormalML.g:12911:3: () otherlv_1= 'string' ( (otherlv_2= ':' ( (lv_size_3_0= ruleEInt ) ) ) | (otherlv_4= '<' (otherlv_5= 'size:' )? ( (lv_size_6_0= ruleEInt ) ) otherlv_7= '>' ) )?
+            {
+            // InternalFormalML.g:12911:3: ()
+            // InternalFormalML.g:12912:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getPrimitiveStringTypeAccess().getPrimitiveStringTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,122,FollowSets000.FOLLOW_112); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getPrimitiveStringTypeAccess().getStringKeyword_1());
+              		
+            }
+            // InternalFormalML.g:12925:3: ( (otherlv_2= ':' ( (lv_size_3_0= ruleEInt ) ) ) | (otherlv_4= '<' (otherlv_5= 'size:' )? ( (lv_size_6_0= ruleEInt ) ) otherlv_7= '>' ) )?
+            int alt307=3;
+            int LA307_0 = input.LA(1);
+
+            if ( (LA307_0==30) ) {
+                alt307=1;
+            }
+            else if ( (LA307_0==16) ) {
+                alt307=2;
+            }
+            switch (alt307) {
+                case 1 :
+                    // InternalFormalML.g:12926:4: (otherlv_2= ':' ( (lv_size_3_0= ruleEInt ) ) )
+                    {
+                    // InternalFormalML.g:12926:4: (otherlv_2= ':' ( (lv_size_3_0= ruleEInt ) ) )
+                    // InternalFormalML.g:12927:5: otherlv_2= ':' ( (lv_size_3_0= ruleEInt ) )
+                    {
+                    otherlv_2=(Token)match(input,30,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_2, grammarAccess.getPrimitiveStringTypeAccess().getColonKeyword_2_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:12931:5: ( (lv_size_3_0= ruleEInt ) )
+                    // InternalFormalML.g:12932:6: (lv_size_3_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12932:6: (lv_size_3_0= ruleEInt )
+                    // InternalFormalML.g:12933:7: lv_size_3_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_size_3_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveStringTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_3_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:12952:4: (otherlv_4= '<' (otherlv_5= 'size:' )? ( (lv_size_6_0= ruleEInt ) ) otherlv_7= '>' )
+                    {
+                    // InternalFormalML.g:12952:4: (otherlv_4= '<' (otherlv_5= 'size:' )? ( (lv_size_6_0= ruleEInt ) ) otherlv_7= '>' )
+                    // InternalFormalML.g:12953:5: otherlv_4= '<' (otherlv_5= 'size:' )? ( (lv_size_6_0= ruleEInt ) ) otherlv_7= '>'
+                    {
+                    otherlv_4=(Token)match(input,16,FollowSets000.FOLLOW_133); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getPrimitiveStringTypeAccess().getLessThanSignKeyword_2_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:12957:5: (otherlv_5= 'size:' )?
+                    int alt306=2;
+                    int LA306_0 = input.LA(1);
+
+                    if ( (LA306_0==106) ) {
+                        alt306=1;
+                    }
+                    switch (alt306) {
+                        case 1 :
+                            // InternalFormalML.g:12958:6: otherlv_5= 'size:'
+                            {
+                            otherlv_5=(Token)match(input,106,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_5, grammarAccess.getPrimitiveStringTypeAccess().getSizeKeyword_2_1_1());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:12963:5: ( (lv_size_6_0= ruleEInt ) )
+                    // InternalFormalML.g:12964:6: (lv_size_6_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:12964:6: (lv_size_6_0= ruleEInt )
+                    // InternalFormalML.g:12965:7: lv_size_6_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getPrimitiveStringTypeAccess().getSizeEIntParserRuleCall_2_1_2_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_size_6_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getPrimitiveStringTypeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"size",
+                      								lv_size_6_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_7=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_7, grammarAccess.getPrimitiveStringTypeAccess().getGreaterThanSignKeyword_2_1_3());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveStringType"
+
+
+    // $ANTLR start "entryRulePrimitiveInstanceType"
+    // InternalFormalML.g:12992:1: entryRulePrimitiveInstanceType returns [EObject current=null] : iv_rulePrimitiveInstanceType= rulePrimitiveInstanceType EOF ;
+    public final EObject entryRulePrimitiveInstanceType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimitiveInstanceType = null;
+
+
+        try {
+            // InternalFormalML.g:12992:62: (iv_rulePrimitiveInstanceType= rulePrimitiveInstanceType EOF )
+            // InternalFormalML.g:12993:2: iv_rulePrimitiveInstanceType= rulePrimitiveInstanceType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimitiveInstanceTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimitiveInstanceType=rulePrimitiveInstanceType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimitiveInstanceType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimitiveInstanceType"
+
+
+    // $ANTLR start "rulePrimitiveInstanceType"
+    // InternalFormalML.g:12999:1: rulePrimitiveInstanceType returns [EObject current=null] : ( () ( (lv_expected_1_0= rulePrimitiveInstanceKind ) ) (otherlv_2= '<' ( ( ruleESIdentifier ) ) otherlv_4= '>' )? ) ;
+    public final EObject rulePrimitiveInstanceType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Enumerator lv_expected_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:13005:2: ( ( () ( (lv_expected_1_0= rulePrimitiveInstanceKind ) ) (otherlv_2= '<' ( ( ruleESIdentifier ) ) otherlv_4= '>' )? ) )
+            // InternalFormalML.g:13006:2: ( () ( (lv_expected_1_0= rulePrimitiveInstanceKind ) ) (otherlv_2= '<' ( ( ruleESIdentifier ) ) otherlv_4= '>' )? )
+            {
+            // InternalFormalML.g:13006:2: ( () ( (lv_expected_1_0= rulePrimitiveInstanceKind ) ) (otherlv_2= '<' ( ( ruleESIdentifier ) ) otherlv_4= '>' )? )
+            // InternalFormalML.g:13007:3: () ( (lv_expected_1_0= rulePrimitiveInstanceKind ) ) (otherlv_2= '<' ( ( ruleESIdentifier ) ) otherlv_4= '>' )?
+            {
+            // InternalFormalML.g:13007:3: ()
+            // InternalFormalML.g:13008:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getPrimitiveInstanceTypeAccess().getPrimitiveInstanceTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:13017:3: ( (lv_expected_1_0= rulePrimitiveInstanceKind ) )
+            // InternalFormalML.g:13018:4: (lv_expected_1_0= rulePrimitiveInstanceKind )
+            {
+            // InternalFormalML.g:13018:4: (lv_expected_1_0= rulePrimitiveInstanceKind )
+            // InternalFormalML.g:13019:5: lv_expected_1_0= rulePrimitiveInstanceKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getPrimitiveInstanceTypeAccess().getExpectedPrimitiveInstanceKindEnumRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_118);
+            lv_expected_1_0=rulePrimitiveInstanceKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPrimitiveInstanceTypeRule());
+              					}
+              					set(
+              						current,
+              						"expected",
+              						lv_expected_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveInstanceKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13036:3: (otherlv_2= '<' ( ( ruleESIdentifier ) ) otherlv_4= '>' )?
+            int alt308=2;
+            int LA308_0 = input.LA(1);
+
+            if ( (LA308_0==16) ) {
+                alt308=1;
+            }
+            switch (alt308) {
+                case 1 :
+                    // InternalFormalML.g:13037:4: otherlv_2= '<' ( ( ruleESIdentifier ) ) otherlv_4= '>'
+                    {
+                    otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getPrimitiveInstanceTypeAccess().getLessThanSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:13041:4: ( ( ruleESIdentifier ) )
+                    // InternalFormalML.g:13042:5: ( ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:13042:5: ( ruleESIdentifier )
+                    // InternalFormalML.g:13043:6: ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getPrimitiveInstanceTypeRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getPrimitiveInstanceTypeAccess().getModelNamedElementCrossReference_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getPrimitiveInstanceTypeAccess().getGreaterThanSignKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveInstanceType"
+
+
+    // $ANTLR start "entryRuleIntervalType"
+    // InternalFormalML.g:13069:1: entryRuleIntervalType returns [EObject current=null] : iv_ruleIntervalType= ruleIntervalType EOF ;
+    public final EObject entryRuleIntervalType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleIntervalType = null;
+
+
+        try {
+            // InternalFormalML.g:13069:53: (iv_ruleIntervalType= ruleIntervalType EOF )
+            // InternalFormalML.g:13070:2: iv_ruleIntervalType= ruleIntervalType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getIntervalTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleIntervalType=ruleIntervalType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleIntervalType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleIntervalType"
+
+
+    // $ANTLR start "ruleIntervalType"
+    // InternalFormalML.g:13076:1: ruleIntervalType returns [EObject current=null] : ( () otherlv_1= 'interval' otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_4_0= ']' ) ) | otherlv_5= '[' ) ( (lv_infimum_6_0= ruleExpression ) ) otherlv_7= ',' ( (lv_supremum_8_0= ruleExpression ) ) (otherlv_9= ']' | ( (lv_ropen_10_0= '[' ) ) ) otherlv_11= '>' ) ;
+    public final EObject ruleIntervalType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_lopen_4_0=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Token lv_ropen_10_0=null;
+        Token otherlv_11=null;
+        EObject lv_support_3_0 = null;
+
+        EObject lv_infimum_6_0 = null;
+
+        EObject lv_supremum_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:13082:2: ( ( () otherlv_1= 'interval' otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_4_0= ']' ) ) | otherlv_5= '[' ) ( (lv_infimum_6_0= ruleExpression ) ) otherlv_7= ',' ( (lv_supremum_8_0= ruleExpression ) ) (otherlv_9= ']' | ( (lv_ropen_10_0= '[' ) ) ) otherlv_11= '>' ) )
+            // InternalFormalML.g:13083:2: ( () otherlv_1= 'interval' otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_4_0= ']' ) ) | otherlv_5= '[' ) ( (lv_infimum_6_0= ruleExpression ) ) otherlv_7= ',' ( (lv_supremum_8_0= ruleExpression ) ) (otherlv_9= ']' | ( (lv_ropen_10_0= '[' ) ) ) otherlv_11= '>' )
+            {
+            // InternalFormalML.g:13083:2: ( () otherlv_1= 'interval' otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_4_0= ']' ) ) | otherlv_5= '[' ) ( (lv_infimum_6_0= ruleExpression ) ) otherlv_7= ',' ( (lv_supremum_8_0= ruleExpression ) ) (otherlv_9= ']' | ( (lv_ropen_10_0= '[' ) ) ) otherlv_11= '>' )
+            // InternalFormalML.g:13084:3: () otherlv_1= 'interval' otherlv_2= '<' ( (lv_support_3_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_4_0= ']' ) ) | otherlv_5= '[' ) ( (lv_infimum_6_0= ruleExpression ) ) otherlv_7= ',' ( (lv_supremum_8_0= ruleExpression ) ) (otherlv_9= ']' | ( (lv_ropen_10_0= '[' ) ) ) otherlv_11= '>'
+            {
+            // InternalFormalML.g:13084:3: ()
+            // InternalFormalML.g:13085:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getIntervalTypeAccess().getIntervalTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,123,FollowSets000.FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getIntervalTypeAccess().getIntervalKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_139); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getIntervalTypeAccess().getLessThanSignKeyword_2());
+              		
+            }
+            // InternalFormalML.g:13102:3: ( (lv_support_3_0= rulePrimitiveNumberType ) )
+            // InternalFormalML.g:13103:4: (lv_support_3_0= rulePrimitiveNumberType )
+            {
+            // InternalFormalML.g:13103:4: (lv_support_3_0= rulePrimitiveNumberType )
+            // InternalFormalML.g:13104:5: lv_support_3_0= rulePrimitiveNumberType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeAccess().getSupportPrimitiveNumberTypeParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_140);
+            lv_support_3_0=rulePrimitiveNumberType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeRule());
+              					}
+              					set(
+              						current,
+              						"support",
+              						lv_support_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13121:3: ( ( (lv_lopen_4_0= ']' ) ) | otherlv_5= '[' )
+            int alt309=2;
+            int LA309_0 = input.LA(1);
+
+            if ( (LA309_0==99) ) {
+                alt309=1;
+            }
+            else if ( (LA309_0==97) ) {
+                alt309=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 309, 0, input);
+
+                throw nvae;
+            }
+            switch (alt309) {
+                case 1 :
+                    // InternalFormalML.g:13122:4: ( (lv_lopen_4_0= ']' ) )
+                    {
+                    // InternalFormalML.g:13122:4: ( (lv_lopen_4_0= ']' ) )
+                    // InternalFormalML.g:13123:5: (lv_lopen_4_0= ']' )
+                    {
+                    // InternalFormalML.g:13123:5: (lv_lopen_4_0= ']' )
+                    // InternalFormalML.g:13124:6: lv_lopen_4_0= ']'
+                    {
+                    lv_lopen_4_0=(Token)match(input,99,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_lopen_4_0, grammarAccess.getIntervalTypeAccess().getLopenRightSquareBracketKeyword_4_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getIntervalTypeRule());
+                      						}
+                      						setWithLastConsumed(current, "lopen", true, "]");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13137:4: otherlv_5= '['
+                    {
+                    otherlv_5=(Token)match(input,97,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getIntervalTypeAccess().getLeftSquareBracketKeyword_4_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:13142:3: ( (lv_infimum_6_0= ruleExpression ) )
+            // InternalFormalML.g:13143:4: (lv_infimum_6_0= ruleExpression )
+            {
+            // InternalFormalML.g:13143:4: (lv_infimum_6_0= ruleExpression )
+            // InternalFormalML.g:13144:5: lv_infimum_6_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeAccess().getInfimumExpressionParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_141);
+            lv_infimum_6_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeRule());
+              					}
+              					set(
+              						current,
+              						"infimum",
+              						lv_infimum_6_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_7=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_7, grammarAccess.getIntervalTypeAccess().getCommaKeyword_6());
+              		
+            }
+            // InternalFormalML.g:13165:3: ( (lv_supremum_8_0= ruleExpression ) )
+            // InternalFormalML.g:13166:4: (lv_supremum_8_0= ruleExpression )
+            {
+            // InternalFormalML.g:13166:4: (lv_supremum_8_0= ruleExpression )
+            // InternalFormalML.g:13167:5: lv_supremum_8_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeAccess().getSupremumExpressionParserRuleCall_7_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_140);
+            lv_supremum_8_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeRule());
+              					}
+              					set(
+              						current,
+              						"supremum",
+              						lv_supremum_8_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13184:3: (otherlv_9= ']' | ( (lv_ropen_10_0= '[' ) ) )
+            int alt310=2;
+            int LA310_0 = input.LA(1);
+
+            if ( (LA310_0==99) ) {
+                alt310=1;
+            }
+            else if ( (LA310_0==97) ) {
+                alt310=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 310, 0, input);
+
+                throw nvae;
+            }
+            switch (alt310) {
+                case 1 :
+                    // InternalFormalML.g:13185:4: otherlv_9= ']'
+                    {
+                    otherlv_9=(Token)match(input,99,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getIntervalTypeAccess().getRightSquareBracketKeyword_8_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13190:4: ( (lv_ropen_10_0= '[' ) )
+                    {
+                    // InternalFormalML.g:13190:4: ( (lv_ropen_10_0= '[' ) )
+                    // InternalFormalML.g:13191:5: (lv_ropen_10_0= '[' )
+                    {
+                    // InternalFormalML.g:13191:5: (lv_ropen_10_0= '[' )
+                    // InternalFormalML.g:13192:6: lv_ropen_10_0= '['
+                    {
+                    lv_ropen_10_0=(Token)match(input,97,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_ropen_10_0, grammarAccess.getIntervalTypeAccess().getRopenLeftSquareBracketKeyword_8_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getIntervalTypeRule());
+                      						}
+                      						setWithLastConsumed(current, "ropen", true, "[");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_11=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_11, grammarAccess.getIntervalTypeAccess().getGreaterThanSignKeyword_9());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIntervalType"
+
+
+    // $ANTLR start "entryRuleIntervalTypeDefinition"
+    // InternalFormalML.g:13213:1: entryRuleIntervalTypeDefinition returns [EObject current=null] : iv_ruleIntervalTypeDefinition= ruleIntervalTypeDefinition EOF ;
+    public final EObject entryRuleIntervalTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleIntervalTypeDefinition = null;
+
+
+        try {
+            // InternalFormalML.g:13213:63: (iv_ruleIntervalTypeDefinition= ruleIntervalTypeDefinition EOF )
+            // InternalFormalML.g:13214:2: iv_ruleIntervalTypeDefinition= ruleIntervalTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getIntervalTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleIntervalTypeDefinition=ruleIntervalTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleIntervalTypeDefinition; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleIntervalTypeDefinition"
+
+
+    // $ANTLR start "ruleIntervalTypeDefinition"
+    // InternalFormalML.g:13220:1: ruleIntervalTypeDefinition returns [EObject current=null] : ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= 'interval' otherlv_6= '<' ( (lv_support_7_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_8_0= ']' ) ) | otherlv_9= '[' ) ( (lv_infimum_10_0= ruleExpression ) ) otherlv_11= ',' ( (lv_supremum_12_0= ruleExpression ) ) (otherlv_13= ']' | ( (lv_ropen_14_0= '[' ) ) ) otherlv_15= '>' otherlv_16= ';' ) ;
+    public final EObject ruleIntervalTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token lv_lopen_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token lv_ropen_14_0=null;
+        Token otherlv_15=null;
+        Token otherlv_16=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        EObject lv_support_7_0 = null;
+
+        EObject lv_infimum_10_0 = null;
+
+        EObject lv_supremum_12_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:13226:2: ( ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= 'interval' otherlv_6= '<' ( (lv_support_7_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_8_0= ']' ) ) | otherlv_9= '[' ) ( (lv_infimum_10_0= ruleExpression ) ) otherlv_11= ',' ( (lv_supremum_12_0= ruleExpression ) ) (otherlv_13= ']' | ( (lv_ropen_14_0= '[' ) ) ) otherlv_15= '>' otherlv_16= ';' ) )
+            // InternalFormalML.g:13227:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= 'interval' otherlv_6= '<' ( (lv_support_7_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_8_0= ']' ) ) | otherlv_9= '[' ) ( (lv_infimum_10_0= ruleExpression ) ) otherlv_11= ',' ( (lv_supremum_12_0= ruleExpression ) ) (otherlv_13= ']' | ( (lv_ropen_14_0= '[' ) ) ) otherlv_15= '>' otherlv_16= ';' )
+            {
+            // InternalFormalML.g:13227:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= 'interval' otherlv_6= '<' ( (lv_support_7_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_8_0= ']' ) ) | otherlv_9= '[' ) ( (lv_infimum_10_0= ruleExpression ) ) otherlv_11= ',' ( (lv_supremum_12_0= ruleExpression ) ) (otherlv_13= ']' | ( (lv_ropen_14_0= '[' ) ) ) otherlv_15= '>' otherlv_16= ';' )
+            // InternalFormalML.g:13228:3: () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= 'interval' otherlv_6= '<' ( (lv_support_7_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_8_0= ']' ) ) | otherlv_9= '[' ) ( (lv_infimum_10_0= ruleExpression ) ) otherlv_11= ',' ( (lv_supremum_12_0= ruleExpression ) ) (otherlv_13= ']' | ( (lv_ropen_14_0= '[' ) ) ) otherlv_15= '>' otherlv_16= ';'
+            {
+            // InternalFormalML.g:13228:3: ()
+            // InternalFormalML.g:13229:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getIntervalTypeDefinitionAccess().getIntervalTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:13238:3: ( (lv_visibility_1_0= ruleVisibilityKind ) )?
+            int alt311=2;
+            int LA311_0 = input.LA(1);
+
+            if ( (LA311_0==19||(LA311_0>=240 && LA311_0<=242)) ) {
+                alt311=1;
+            }
+            switch (alt311) {
+                case 1 :
+                    // InternalFormalML.g:13239:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:13239:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    // InternalFormalML.g:13240:5: lv_visibility_1_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_127);
+                    lv_visibility_1_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,101,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getIntervalTypeDefinitionAccess().getTypeKeyword_2());
+              		
+            }
+            // InternalFormalML.g:13261:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:13262:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:13262:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:13263:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_142);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13280:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt312=2;
+            int LA312_0 = input.LA(1);
+
+            if ( (LA312_0==RULE_STRING) ) {
+                alt312=1;
+            }
+            switch (alt312) {
+                case 1 :
+                    // InternalFormalML.g:13281:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:13281:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:13282:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_143);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,123,FollowSets000.FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getIntervalTypeDefinitionAccess().getIntervalKeyword_5());
+              		
+            }
+            otherlv_6=(Token)match(input,16,FollowSets000.FOLLOW_139); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getIntervalTypeDefinitionAccess().getLessThanSignKeyword_6());
+              		
+            }
+            // InternalFormalML.g:13307:3: ( (lv_support_7_0= rulePrimitiveNumberType ) )
+            // InternalFormalML.g:13308:4: (lv_support_7_0= rulePrimitiveNumberType )
+            {
+            // InternalFormalML.g:13308:4: (lv_support_7_0= rulePrimitiveNumberType )
+            // InternalFormalML.g:13309:5: lv_support_7_0= rulePrimitiveNumberType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getSupportPrimitiveNumberTypeParserRuleCall_7_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_140);
+            lv_support_7_0=rulePrimitiveNumberType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"support",
+              						lv_support_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13326:3: ( ( (lv_lopen_8_0= ']' ) ) | otherlv_9= '[' )
+            int alt313=2;
+            int LA313_0 = input.LA(1);
+
+            if ( (LA313_0==99) ) {
+                alt313=1;
+            }
+            else if ( (LA313_0==97) ) {
+                alt313=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 313, 0, input);
+
+                throw nvae;
+            }
+            switch (alt313) {
+                case 1 :
+                    // InternalFormalML.g:13327:4: ( (lv_lopen_8_0= ']' ) )
+                    {
+                    // InternalFormalML.g:13327:4: ( (lv_lopen_8_0= ']' ) )
+                    // InternalFormalML.g:13328:5: (lv_lopen_8_0= ']' )
+                    {
+                    // InternalFormalML.g:13328:5: (lv_lopen_8_0= ']' )
+                    // InternalFormalML.g:13329:6: lv_lopen_8_0= ']'
+                    {
+                    lv_lopen_8_0=(Token)match(input,99,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_lopen_8_0, grammarAccess.getIntervalTypeDefinitionAccess().getLopenRightSquareBracketKeyword_8_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getIntervalTypeDefinitionRule());
+                      						}
+                      						setWithLastConsumed(current, "lopen", true, "]");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13342:4: otherlv_9= '['
+                    {
+                    otherlv_9=(Token)match(input,97,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getIntervalTypeDefinitionAccess().getLeftSquareBracketKeyword_8_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:13347:3: ( (lv_infimum_10_0= ruleExpression ) )
+            // InternalFormalML.g:13348:4: (lv_infimum_10_0= ruleExpression )
+            {
+            // InternalFormalML.g:13348:4: (lv_infimum_10_0= ruleExpression )
+            // InternalFormalML.g:13349:5: lv_infimum_10_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getInfimumExpressionParserRuleCall_9_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_141);
+            lv_infimum_10_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"infimum",
+              						lv_infimum_10_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_11=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_11, grammarAccess.getIntervalTypeDefinitionAccess().getCommaKeyword_10());
+              		
+            }
+            // InternalFormalML.g:13370:3: ( (lv_supremum_12_0= ruleExpression ) )
+            // InternalFormalML.g:13371:4: (lv_supremum_12_0= ruleExpression )
+            {
+            // InternalFormalML.g:13371:4: (lv_supremum_12_0= ruleExpression )
+            // InternalFormalML.g:13372:5: lv_supremum_12_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeDefinitionAccess().getSupremumExpressionParserRuleCall_11_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_140);
+            lv_supremum_12_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"supremum",
+              						lv_supremum_12_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13389:3: (otherlv_13= ']' | ( (lv_ropen_14_0= '[' ) ) )
+            int alt314=2;
+            int LA314_0 = input.LA(1);
+
+            if ( (LA314_0==99) ) {
+                alt314=1;
+            }
+            else if ( (LA314_0==97) ) {
+                alt314=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 314, 0, input);
+
+                throw nvae;
+            }
+            switch (alt314) {
+                case 1 :
+                    // InternalFormalML.g:13390:4: otherlv_13= ']'
+                    {
+                    otherlv_13=(Token)match(input,99,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_13, grammarAccess.getIntervalTypeDefinitionAccess().getRightSquareBracketKeyword_12_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13395:4: ( (lv_ropen_14_0= '[' ) )
+                    {
+                    // InternalFormalML.g:13395:4: ( (lv_ropen_14_0= '[' ) )
+                    // InternalFormalML.g:13396:5: (lv_ropen_14_0= '[' )
+                    {
+                    // InternalFormalML.g:13396:5: (lv_ropen_14_0= '[' )
+                    // InternalFormalML.g:13397:6: lv_ropen_14_0= '['
+                    {
+                    lv_ropen_14_0=(Token)match(input,97,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_ropen_14_0, grammarAccess.getIntervalTypeDefinitionAccess().getRopenLeftSquareBracketKeyword_12_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getIntervalTypeDefinitionRule());
+                      						}
+                      						setWithLastConsumed(current, "ropen", true, "[");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_15=(Token)match(input,37,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_15, grammarAccess.getIntervalTypeDefinitionAccess().getGreaterThanSignKeyword_13());
+              		
+            }
+            otherlv_16=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_16, grammarAccess.getIntervalTypeDefinitionAccess().getSemicolonKeyword_14());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIntervalTypeDefinition"
+
+
+    // $ANTLR start "entryRuleIntervalTypeDefinitionImpl"
+    // InternalFormalML.g:13422:1: entryRuleIntervalTypeDefinitionImpl returns [EObject current=null] : iv_ruleIntervalTypeDefinitionImpl= ruleIntervalTypeDefinitionImpl EOF ;
+    public final EObject entryRuleIntervalTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleIntervalTypeDefinitionImpl = null;
+
+
+        try {
+            // InternalFormalML.g:13422:67: (iv_ruleIntervalTypeDefinitionImpl= ruleIntervalTypeDefinitionImpl EOF )
+            // InternalFormalML.g:13423:2: iv_ruleIntervalTypeDefinitionImpl= ruleIntervalTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleIntervalTypeDefinitionImpl=ruleIntervalTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleIntervalTypeDefinitionImpl; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleIntervalTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleIntervalTypeDefinitionImpl"
+    // InternalFormalML.g:13429:1: ruleIntervalTypeDefinitionImpl returns [EObject current=null] : ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= 'interval' otherlv_4= '<' ( (lv_support_5_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_6_0= ']' ) ) | otherlv_7= '[' ) ( (lv_infimum_8_0= ruleExpression ) ) otherlv_9= ',' ( (lv_supremum_10_0= ruleExpression ) ) (otherlv_11= ']' | ( (lv_ropen_12_0= '[' ) ) ) otherlv_13= '>' otherlv_14= ';' ) ;
+    public final EObject ruleIntervalTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token lv_lopen_6_0=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token lv_ropen_12_0=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        EObject lv_support_5_0 = null;
+
+        EObject lv_infimum_8_0 = null;
+
+        EObject lv_supremum_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:13435:2: ( ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= 'interval' otherlv_4= '<' ( (lv_support_5_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_6_0= ']' ) ) | otherlv_7= '[' ) ( (lv_infimum_8_0= ruleExpression ) ) otherlv_9= ',' ( (lv_supremum_10_0= ruleExpression ) ) (otherlv_11= ']' | ( (lv_ropen_12_0= '[' ) ) ) otherlv_13= '>' otherlv_14= ';' ) )
+            // InternalFormalML.g:13436:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= 'interval' otherlv_4= '<' ( (lv_support_5_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_6_0= ']' ) ) | otherlv_7= '[' ) ( (lv_infimum_8_0= ruleExpression ) ) otherlv_9= ',' ( (lv_supremum_10_0= ruleExpression ) ) (otherlv_11= ']' | ( (lv_ropen_12_0= '[' ) ) ) otherlv_13= '>' otherlv_14= ';' )
+            {
+            // InternalFormalML.g:13436:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= 'interval' otherlv_4= '<' ( (lv_support_5_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_6_0= ']' ) ) | otherlv_7= '[' ) ( (lv_infimum_8_0= ruleExpression ) ) otherlv_9= ',' ( (lv_supremum_10_0= ruleExpression ) ) (otherlv_11= ']' | ( (lv_ropen_12_0= '[' ) ) ) otherlv_13= '>' otherlv_14= ';' )
+            // InternalFormalML.g:13437:3: () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= 'interval' otherlv_4= '<' ( (lv_support_5_0= rulePrimitiveNumberType ) ) ( ( (lv_lopen_6_0= ']' ) ) | otherlv_7= '[' ) ( (lv_infimum_8_0= ruleExpression ) ) otherlv_9= ',' ( (lv_supremum_10_0= ruleExpression ) ) (otherlv_11= ']' | ( (lv_ropen_12_0= '[' ) ) ) otherlv_13= '>' otherlv_14= ';'
+            {
+            // InternalFormalML.g:13437:3: ()
+            // InternalFormalML.g:13438:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:13447:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:13448:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:13448:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:13449:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_142);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13466:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt315=2;
+            int LA315_0 = input.LA(1);
+
+            if ( (LA315_0==RULE_STRING) ) {
+                alt315=1;
+            }
+            switch (alt315) {
+                case 1 :
+                    // InternalFormalML.g:13467:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:13467:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:13468:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_143);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,123,FollowSets000.FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getIntervalTypeDefinitionImplAccess().getIntervalKeyword_3());
+              		
+            }
+            otherlv_4=(Token)match(input,16,FollowSets000.FOLLOW_139); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getIntervalTypeDefinitionImplAccess().getLessThanSignKeyword_4());
+              		
+            }
+            // InternalFormalML.g:13493:3: ( (lv_support_5_0= rulePrimitiveNumberType ) )
+            // InternalFormalML.g:13494:4: (lv_support_5_0= rulePrimitiveNumberType )
+            {
+            // InternalFormalML.g:13494:4: (lv_support_5_0= rulePrimitiveNumberType )
+            // InternalFormalML.g:13495:5: lv_support_5_0= rulePrimitiveNumberType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupportPrimitiveNumberTypeParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_140);
+            lv_support_5_0=rulePrimitiveNumberType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"support",
+              						lv_support_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13512:3: ( ( (lv_lopen_6_0= ']' ) ) | otherlv_7= '[' )
+            int alt316=2;
+            int LA316_0 = input.LA(1);
+
+            if ( (LA316_0==99) ) {
+                alt316=1;
+            }
+            else if ( (LA316_0==97) ) {
+                alt316=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 316, 0, input);
+
+                throw nvae;
+            }
+            switch (alt316) {
+                case 1 :
+                    // InternalFormalML.g:13513:4: ( (lv_lopen_6_0= ']' ) )
+                    {
+                    // InternalFormalML.g:13513:4: ( (lv_lopen_6_0= ']' ) )
+                    // InternalFormalML.g:13514:5: (lv_lopen_6_0= ']' )
+                    {
+                    // InternalFormalML.g:13514:5: (lv_lopen_6_0= ']' )
+                    // InternalFormalML.g:13515:6: lv_lopen_6_0= ']'
+                    {
+                    lv_lopen_6_0=(Token)match(input,99,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_lopen_6_0, grammarAccess.getIntervalTypeDefinitionImplAccess().getLopenRightSquareBracketKeyword_6_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getIntervalTypeDefinitionImplRule());
+                      						}
+                      						setWithLastConsumed(current, "lopen", true, "]");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13528:4: otherlv_7= '['
+                    {
+                    otherlv_7=(Token)match(input,97,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getIntervalTypeDefinitionImplAccess().getLeftSquareBracketKeyword_6_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:13533:3: ( (lv_infimum_8_0= ruleExpression ) )
+            // InternalFormalML.g:13534:4: (lv_infimum_8_0= ruleExpression )
+            {
+            // InternalFormalML.g:13534:4: (lv_infimum_8_0= ruleExpression )
+            // InternalFormalML.g:13535:5: lv_infimum_8_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getInfimumExpressionParserRuleCall_7_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_141);
+            lv_infimum_8_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"infimum",
+              						lv_infimum_8_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_9=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getIntervalTypeDefinitionImplAccess().getCommaKeyword_8());
+              		
+            }
+            // InternalFormalML.g:13556:3: ( (lv_supremum_10_0= ruleExpression ) )
+            // InternalFormalML.g:13557:4: (lv_supremum_10_0= ruleExpression )
+            {
+            // InternalFormalML.g:13557:4: (lv_supremum_10_0= ruleExpression )
+            // InternalFormalML.g:13558:5: lv_supremum_10_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIntervalTypeDefinitionImplAccess().getSupremumExpressionParserRuleCall_9_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_140);
+            lv_supremum_10_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIntervalTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"supremum",
+              						lv_supremum_10_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13575:3: (otherlv_11= ']' | ( (lv_ropen_12_0= '[' ) ) )
+            int alt317=2;
+            int LA317_0 = input.LA(1);
+
+            if ( (LA317_0==99) ) {
+                alt317=1;
+            }
+            else if ( (LA317_0==97) ) {
+                alt317=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 317, 0, input);
+
+                throw nvae;
+            }
+            switch (alt317) {
+                case 1 :
+                    // InternalFormalML.g:13576:4: otherlv_11= ']'
+                    {
+                    otherlv_11=(Token)match(input,99,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_11, grammarAccess.getIntervalTypeDefinitionImplAccess().getRightSquareBracketKeyword_10_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:13581:4: ( (lv_ropen_12_0= '[' ) )
+                    {
+                    // InternalFormalML.g:13581:4: ( (lv_ropen_12_0= '[' ) )
+                    // InternalFormalML.g:13582:5: (lv_ropen_12_0= '[' )
+                    {
+                    // InternalFormalML.g:13582:5: (lv_ropen_12_0= '[' )
+                    // InternalFormalML.g:13583:6: lv_ropen_12_0= '['
+                    {
+                    lv_ropen_12_0=(Token)match(input,97,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_ropen_12_0, grammarAccess.getIntervalTypeDefinitionImplAccess().getRopenLeftSquareBracketKeyword_10_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getIntervalTypeDefinitionImplRule());
+                      						}
+                      						setWithLastConsumed(current, "ropen", true, "[");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_13=(Token)match(input,37,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_13, grammarAccess.getIntervalTypeDefinitionImplAccess().getGreaterThanSignKeyword_11());
+              		
+            }
+            otherlv_14=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_14, grammarAccess.getIntervalTypeDefinitionImplAccess().getSemicolonKeyword_12());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIntervalTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleCollectionType"
+    // InternalFormalML.g:13608:1: entryRuleCollectionType returns [EObject current=null] : iv_ruleCollectionType= ruleCollectionType EOF ;
+    public final EObject entryRuleCollectionType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleCollectionType = null;
+
+
+        try {
+            // InternalFormalML.g:13608:55: (iv_ruleCollectionType= ruleCollectionType EOF )
+            // InternalFormalML.g:13609:2: iv_ruleCollectionType= ruleCollectionType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getCollectionTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleCollectionType=ruleCollectionType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleCollectionType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleCollectionType"
+
+
+    // $ANTLR start "ruleCollectionType"
+    // InternalFormalML.g:13615:1: ruleCollectionType returns [EObject current=null] : ( () ( (lv_container_1_0= ruleCollectionKind ) ) otherlv_2= '<' ( (lv_support_3_0= ruleDataType ) ) (otherlv_4= ',' ( ( (lv_size_5_0= ruleEInt ) ) | ( (lv_unbounded_6_0= '*' ) ) ) )? otherlv_7= '>' ) ;
+    public final EObject ruleCollectionType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token lv_unbounded_6_0=null;
+        Token otherlv_7=null;
+        Enumerator lv_container_1_0 = null;
+
+        EObject lv_support_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:13621:2: ( ( () ( (lv_container_1_0= ruleCollectionKind ) ) otherlv_2= '<' ( (lv_support_3_0= ruleDataType ) ) (otherlv_4= ',' ( ( (lv_size_5_0= ruleEInt ) ) | ( (lv_unbounded_6_0= '*' ) ) ) )? otherlv_7= '>' ) )
+            // InternalFormalML.g:13622:2: ( () ( (lv_container_1_0= ruleCollectionKind ) ) otherlv_2= '<' ( (lv_support_3_0= ruleDataType ) ) (otherlv_4= ',' ( ( (lv_size_5_0= ruleEInt ) ) | ( (lv_unbounded_6_0= '*' ) ) ) )? otherlv_7= '>' )
+            {
+            // InternalFormalML.g:13622:2: ( () ( (lv_container_1_0= ruleCollectionKind ) ) otherlv_2= '<' ( (lv_support_3_0= ruleDataType ) ) (otherlv_4= ',' ( ( (lv_size_5_0= ruleEInt ) ) | ( (lv_unbounded_6_0= '*' ) ) ) )? otherlv_7= '>' )
+            // InternalFormalML.g:13623:3: () ( (lv_container_1_0= ruleCollectionKind ) ) otherlv_2= '<' ( (lv_support_3_0= ruleDataType ) ) (otherlv_4= ',' ( ( (lv_size_5_0= ruleEInt ) ) | ( (lv_unbounded_6_0= '*' ) ) ) )? otherlv_7= '>'
+            {
+            // InternalFormalML.g:13623:3: ()
+            // InternalFormalML.g:13624:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getCollectionTypeAccess().getCollectionTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:13633:3: ( (lv_container_1_0= ruleCollectionKind ) )
+            // InternalFormalML.g:13634:4: (lv_container_1_0= ruleCollectionKind )
+            {
+            // InternalFormalML.g:13634:4: (lv_container_1_0= ruleCollectionKind )
+            // InternalFormalML.g:13635:5: lv_container_1_0= ruleCollectionKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCollectionTypeAccess().getContainerCollectionKindEnumRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_4);
+            lv_container_1_0=ruleCollectionKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCollectionTypeRule());
+              					}
+              					set(
+              						current,
+              						"container",
+              						lv_container_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_46); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getCollectionTypeAccess().getLessThanSignKeyword_2());
+              		
+            }
+            // InternalFormalML.g:13656:3: ( (lv_support_3_0= ruleDataType ) )
+            // InternalFormalML.g:13657:4: (lv_support_3_0= ruleDataType )
+            {
+            // InternalFormalML.g:13657:4: (lv_support_3_0= ruleDataType )
+            // InternalFormalML.g:13658:5: lv_support_3_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCollectionTypeAccess().getSupportDataTypeParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_144);
+            lv_support_3_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCollectionTypeRule());
+              					}
+              					set(
+              						current,
+              						"support",
+              						lv_support_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13675:3: (otherlv_4= ',' ( ( (lv_size_5_0= ruleEInt ) ) | ( (lv_unbounded_6_0= '*' ) ) ) )?
+            int alt319=2;
+            int LA319_0 = input.LA(1);
+
+            if ( (LA319_0==20) ) {
+                alt319=1;
+            }
+            switch (alt319) {
+                case 1 :
+                    // InternalFormalML.g:13676:4: otherlv_4= ',' ( ( (lv_size_5_0= ruleEInt ) ) | ( (lv_unbounded_6_0= '*' ) ) )
+                    {
+                    otherlv_4=(Token)match(input,20,FollowSets000.FOLLOW_145); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getCollectionTypeAccess().getCommaKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:13680:4: ( ( (lv_size_5_0= ruleEInt ) ) | ( (lv_unbounded_6_0= '*' ) ) )
+                    int alt318=2;
+                    int LA318_0 = input.LA(1);
+
+                    if ( (LA318_0==RULE_INT||LA318_0==28) ) {
+                        alt318=1;
+                    }
+                    else if ( (LA318_0==98) ) {
+                        alt318=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 318, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt318) {
+                        case 1 :
+                            // InternalFormalML.g:13681:5: ( (lv_size_5_0= ruleEInt ) )
+                            {
+                            // InternalFormalML.g:13681:5: ( (lv_size_5_0= ruleEInt ) )
+                            // InternalFormalML.g:13682:6: (lv_size_5_0= ruleEInt )
+                            {
+                            // InternalFormalML.g:13682:6: (lv_size_5_0= ruleEInt )
+                            // InternalFormalML.g:13683:7: lv_size_5_0= ruleEInt
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getCollectionTypeAccess().getSizeEIntParserRuleCall_4_1_0_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_23);
+                            lv_size_5_0=ruleEInt();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getCollectionTypeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"size",
+                              								lv_size_5_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:13701:5: ( (lv_unbounded_6_0= '*' ) )
+                            {
+                            // InternalFormalML.g:13701:5: ( (lv_unbounded_6_0= '*' ) )
+                            // InternalFormalML.g:13702:6: (lv_unbounded_6_0= '*' )
+                            {
+                            // InternalFormalML.g:13702:6: (lv_unbounded_6_0= '*' )
+                            // InternalFormalML.g:13703:7: lv_unbounded_6_0= '*'
+                            {
+                            lv_unbounded_6_0=(Token)match(input,98,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_unbounded_6_0, grammarAccess.getCollectionTypeAccess().getUnboundedAsteriskKeyword_4_1_1_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getCollectionTypeRule());
+                              							}
+                              							setWithLastConsumed(current, "unbounded", true, "*");
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_7=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_7, grammarAccess.getCollectionTypeAccess().getGreaterThanSignKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleCollectionType"
+
+
+    // $ANTLR start "entryRuleCollectionTypeDefinition"
+    // InternalFormalML.g:13725:1: entryRuleCollectionTypeDefinition returns [EObject current=null] : iv_ruleCollectionTypeDefinition= ruleCollectionTypeDefinition EOF ;
+    public final EObject entryRuleCollectionTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleCollectionTypeDefinition = null;
+
+
+        try {
+            // InternalFormalML.g:13725:65: (iv_ruleCollectionTypeDefinition= ruleCollectionTypeDefinition EOF )
+            // InternalFormalML.g:13726:2: iv_ruleCollectionTypeDefinition= ruleCollectionTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getCollectionTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleCollectionTypeDefinition=ruleCollectionTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleCollectionTypeDefinition; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleCollectionTypeDefinition"
+
+
+    // $ANTLR start "ruleCollectionTypeDefinition"
+    // InternalFormalML.g:13732:1: ruleCollectionTypeDefinition returns [EObject current=null] : ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_container_5_0= ruleCollectionKind ) ) otherlv_6= '<' ( (lv_support_7_0= ruleDataType ) ) (otherlv_8= ',' ( ( (lv_size_9_0= ruleEInt ) ) | ( (lv_unbounded_10_0= '*' ) ) ) )? otherlv_11= '>' otherlv_12= ';' ) ;
+    public final EObject ruleCollectionTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token lv_unbounded_10_0=null;
+        Token otherlv_11=null;
+        Token otherlv_12=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        Enumerator lv_container_5_0 = null;
+
+        EObject lv_support_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_9_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:13738:2: ( ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_container_5_0= ruleCollectionKind ) ) otherlv_6= '<' ( (lv_support_7_0= ruleDataType ) ) (otherlv_8= ',' ( ( (lv_size_9_0= ruleEInt ) ) | ( (lv_unbounded_10_0= '*' ) ) ) )? otherlv_11= '>' otherlv_12= ';' ) )
+            // InternalFormalML.g:13739:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_container_5_0= ruleCollectionKind ) ) otherlv_6= '<' ( (lv_support_7_0= ruleDataType ) ) (otherlv_8= ',' ( ( (lv_size_9_0= ruleEInt ) ) | ( (lv_unbounded_10_0= '*' ) ) ) )? otherlv_11= '>' otherlv_12= ';' )
+            {
+            // InternalFormalML.g:13739:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_container_5_0= ruleCollectionKind ) ) otherlv_6= '<' ( (lv_support_7_0= ruleDataType ) ) (otherlv_8= ',' ( ( (lv_size_9_0= ruleEInt ) ) | ( (lv_unbounded_10_0= '*' ) ) ) )? otherlv_11= '>' otherlv_12= ';' )
+            // InternalFormalML.g:13740:3: () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_container_5_0= ruleCollectionKind ) ) otherlv_6= '<' ( (lv_support_7_0= ruleDataType ) ) (otherlv_8= ',' ( ( (lv_size_9_0= ruleEInt ) ) | ( (lv_unbounded_10_0= '*' ) ) ) )? otherlv_11= '>' otherlv_12= ';'
+            {
+            // InternalFormalML.g:13740:3: ()
+            // InternalFormalML.g:13741:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getCollectionTypeDefinitionAccess().getCollectionTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:13750:3: ( (lv_visibility_1_0= ruleVisibilityKind ) )?
+            int alt320=2;
+            int LA320_0 = input.LA(1);
+
+            if ( (LA320_0==19||(LA320_0>=240 && LA320_0<=242)) ) {
+                alt320=1;
+            }
+            switch (alt320) {
+                case 1 :
+                    // InternalFormalML.g:13751:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:13751:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    // InternalFormalML.g:13752:5: lv_visibility_1_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_127);
+                    lv_visibility_1_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,101,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getCollectionTypeDefinitionAccess().getTypeKeyword_2());
+              		
+            }
+            // InternalFormalML.g:13773:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:13774:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:13774:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:13775:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_146);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13792:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt321=2;
+            int LA321_0 = input.LA(1);
+
+            if ( (LA321_0==RULE_STRING) ) {
+                alt321=1;
+            }
+            switch (alt321) {
+                case 1 :
+                    // InternalFormalML.g:13793:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:13793:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:13794:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_147);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:13811:3: ( (lv_container_5_0= ruleCollectionKind ) )
+            // InternalFormalML.g:13812:4: (lv_container_5_0= ruleCollectionKind )
+            {
+            // InternalFormalML.g:13812:4: (lv_container_5_0= ruleCollectionKind )
+            // InternalFormalML.g:13813:5: lv_container_5_0= ruleCollectionKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getContainerCollectionKindEnumRuleCall_5_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_4);
+            lv_container_5_0=ruleCollectionKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"container",
+              						lv_container_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,16,FollowSets000.FOLLOW_46); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getCollectionTypeDefinitionAccess().getLessThanSignKeyword_6());
+              		
+            }
+            // InternalFormalML.g:13834:3: ( (lv_support_7_0= ruleDataType ) )
+            // InternalFormalML.g:13835:4: (lv_support_7_0= ruleDataType )
+            {
+            // InternalFormalML.g:13835:4: (lv_support_7_0= ruleDataType )
+            // InternalFormalML.g:13836:5: lv_support_7_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getSupportDataTypeParserRuleCall_7_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_144);
+            lv_support_7_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"support",
+              						lv_support_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13853:3: (otherlv_8= ',' ( ( (lv_size_9_0= ruleEInt ) ) | ( (lv_unbounded_10_0= '*' ) ) ) )?
+            int alt323=2;
+            int LA323_0 = input.LA(1);
+
+            if ( (LA323_0==20) ) {
+                alt323=1;
+            }
+            switch (alt323) {
+                case 1 :
+                    // InternalFormalML.g:13854:4: otherlv_8= ',' ( ( (lv_size_9_0= ruleEInt ) ) | ( (lv_unbounded_10_0= '*' ) ) )
+                    {
+                    otherlv_8=(Token)match(input,20,FollowSets000.FOLLOW_145); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getCollectionTypeDefinitionAccess().getCommaKeyword_8_0());
+                      			
+                    }
+                    // InternalFormalML.g:13858:4: ( ( (lv_size_9_0= ruleEInt ) ) | ( (lv_unbounded_10_0= '*' ) ) )
+                    int alt322=2;
+                    int LA322_0 = input.LA(1);
+
+                    if ( (LA322_0==RULE_INT||LA322_0==28) ) {
+                        alt322=1;
+                    }
+                    else if ( (LA322_0==98) ) {
+                        alt322=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 322, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt322) {
+                        case 1 :
+                            // InternalFormalML.g:13859:5: ( (lv_size_9_0= ruleEInt ) )
+                            {
+                            // InternalFormalML.g:13859:5: ( (lv_size_9_0= ruleEInt ) )
+                            // InternalFormalML.g:13860:6: (lv_size_9_0= ruleEInt )
+                            {
+                            // InternalFormalML.g:13860:6: (lv_size_9_0= ruleEInt )
+                            // InternalFormalML.g:13861:7: lv_size_9_0= ruleEInt
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getCollectionTypeDefinitionAccess().getSizeEIntParserRuleCall_8_1_0_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_23);
+                            lv_size_9_0=ruleEInt();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionRule());
+                              							}
+                              							set(
+                              								current,
+                              								"size",
+                              								lv_size_9_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:13879:5: ( (lv_unbounded_10_0= '*' ) )
+                            {
+                            // InternalFormalML.g:13879:5: ( (lv_unbounded_10_0= '*' ) )
+                            // InternalFormalML.g:13880:6: (lv_unbounded_10_0= '*' )
+                            {
+                            // InternalFormalML.g:13880:6: (lv_unbounded_10_0= '*' )
+                            // InternalFormalML.g:13881:7: lv_unbounded_10_0= '*'
+                            {
+                            lv_unbounded_10_0=(Token)match(input,98,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_unbounded_10_0, grammarAccess.getCollectionTypeDefinitionAccess().getUnboundedAsteriskKeyword_8_1_1_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getCollectionTypeDefinitionRule());
+                              							}
+                              							setWithLastConsumed(current, "unbounded", true, "*");
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_11=(Token)match(input,37,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_11, grammarAccess.getCollectionTypeDefinitionAccess().getGreaterThanSignKeyword_9());
+              		
+            }
+            otherlv_12=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_12, grammarAccess.getCollectionTypeDefinitionAccess().getSemicolonKeyword_10());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleCollectionTypeDefinition"
+
+
+    // $ANTLR start "entryRuleCollectionTypeDefinitionImpl"
+    // InternalFormalML.g:13907:1: entryRuleCollectionTypeDefinitionImpl returns [EObject current=null] : iv_ruleCollectionTypeDefinitionImpl= ruleCollectionTypeDefinitionImpl EOF ;
+    public final EObject entryRuleCollectionTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleCollectionTypeDefinitionImpl = null;
+
+
+        try {
+            // InternalFormalML.g:13907:69: (iv_ruleCollectionTypeDefinitionImpl= ruleCollectionTypeDefinitionImpl EOF )
+            // InternalFormalML.g:13908:2: iv_ruleCollectionTypeDefinitionImpl= ruleCollectionTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleCollectionTypeDefinitionImpl=ruleCollectionTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleCollectionTypeDefinitionImpl; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleCollectionTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleCollectionTypeDefinitionImpl"
+    // InternalFormalML.g:13914:1: ruleCollectionTypeDefinitionImpl returns [EObject current=null] : ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_container_3_0= ruleCollectionKind ) ) otherlv_4= '<' ( (lv_support_5_0= ruleDataType ) ) (otherlv_6= ',' ( ( (lv_size_7_0= ruleEInt ) ) | ( (lv_unbounded_8_0= '*' ) ) ) )? otherlv_9= '>' otherlv_10= ';' ) ;
+    public final EObject ruleCollectionTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token lv_unbounded_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        Enumerator lv_container_3_0 = null;
+
+        EObject lv_support_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:13920:2: ( ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_container_3_0= ruleCollectionKind ) ) otherlv_4= '<' ( (lv_support_5_0= ruleDataType ) ) (otherlv_6= ',' ( ( (lv_size_7_0= ruleEInt ) ) | ( (lv_unbounded_8_0= '*' ) ) ) )? otherlv_9= '>' otherlv_10= ';' ) )
+            // InternalFormalML.g:13921:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_container_3_0= ruleCollectionKind ) ) otherlv_4= '<' ( (lv_support_5_0= ruleDataType ) ) (otherlv_6= ',' ( ( (lv_size_7_0= ruleEInt ) ) | ( (lv_unbounded_8_0= '*' ) ) ) )? otherlv_9= '>' otherlv_10= ';' )
+            {
+            // InternalFormalML.g:13921:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_container_3_0= ruleCollectionKind ) ) otherlv_4= '<' ( (lv_support_5_0= ruleDataType ) ) (otherlv_6= ',' ( ( (lv_size_7_0= ruleEInt ) ) | ( (lv_unbounded_8_0= '*' ) ) ) )? otherlv_9= '>' otherlv_10= ';' )
+            // InternalFormalML.g:13922:3: () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_container_3_0= ruleCollectionKind ) ) otherlv_4= '<' ( (lv_support_5_0= ruleDataType ) ) (otherlv_6= ',' ( ( (lv_size_7_0= ruleEInt ) ) | ( (lv_unbounded_8_0= '*' ) ) ) )? otherlv_9= '>' otherlv_10= ';'
+            {
+            // InternalFormalML.g:13922:3: ()
+            // InternalFormalML.g:13923:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getCollectionTypeDefinitionImplAccess().getCollectionTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:13932:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:13933:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:13933:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:13934:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_146);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:13951:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt324=2;
+            int LA324_0 = input.LA(1);
+
+            if ( (LA324_0==RULE_STRING) ) {
+                alt324=1;
+            }
+            switch (alt324) {
+                case 1 :
+                    // InternalFormalML.g:13952:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:13952:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:13953:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_147);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:13970:3: ( (lv_container_3_0= ruleCollectionKind ) )
+            // InternalFormalML.g:13971:4: (lv_container_3_0= ruleCollectionKind )
+            {
+            // InternalFormalML.g:13971:4: (lv_container_3_0= ruleCollectionKind )
+            // InternalFormalML.g:13972:5: lv_container_3_0= ruleCollectionKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getContainerCollectionKindEnumRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_4);
+            lv_container_3_0=ruleCollectionKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"container",
+              						lv_container_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,16,FollowSets000.FOLLOW_46); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getCollectionTypeDefinitionImplAccess().getLessThanSignKeyword_4());
+              		
+            }
+            // InternalFormalML.g:13993:3: ( (lv_support_5_0= ruleDataType ) )
+            // InternalFormalML.g:13994:4: (lv_support_5_0= ruleDataType )
+            {
+            // InternalFormalML.g:13994:4: (lv_support_5_0= ruleDataType )
+            // InternalFormalML.g:13995:5: lv_support_5_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getSupportDataTypeParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_144);
+            lv_support_5_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"support",
+              						lv_support_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14012:3: (otherlv_6= ',' ( ( (lv_size_7_0= ruleEInt ) ) | ( (lv_unbounded_8_0= '*' ) ) ) )?
+            int alt326=2;
+            int LA326_0 = input.LA(1);
+
+            if ( (LA326_0==20) ) {
+                alt326=1;
+            }
+            switch (alt326) {
+                case 1 :
+                    // InternalFormalML.g:14013:4: otherlv_6= ',' ( ( (lv_size_7_0= ruleEInt ) ) | ( (lv_unbounded_8_0= '*' ) ) )
+                    {
+                    otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_145); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getCollectionTypeDefinitionImplAccess().getCommaKeyword_6_0());
+                      			
+                    }
+                    // InternalFormalML.g:14017:4: ( ( (lv_size_7_0= ruleEInt ) ) | ( (lv_unbounded_8_0= '*' ) ) )
+                    int alt325=2;
+                    int LA325_0 = input.LA(1);
+
+                    if ( (LA325_0==RULE_INT||LA325_0==28) ) {
+                        alt325=1;
+                    }
+                    else if ( (LA325_0==98) ) {
+                        alt325=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 325, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt325) {
+                        case 1 :
+                            // InternalFormalML.g:14018:5: ( (lv_size_7_0= ruleEInt ) )
+                            {
+                            // InternalFormalML.g:14018:5: ( (lv_size_7_0= ruleEInt ) )
+                            // InternalFormalML.g:14019:6: (lv_size_7_0= ruleEInt )
+                            {
+                            // InternalFormalML.g:14019:6: (lv_size_7_0= ruleEInt )
+                            // InternalFormalML.g:14020:7: lv_size_7_0= ruleEInt
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getCollectionTypeDefinitionImplAccess().getSizeEIntParserRuleCall_6_1_0_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_23);
+                            lv_size_7_0=ruleEInt();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getCollectionTypeDefinitionImplRule());
+                              							}
+                              							set(
+                              								current,
+                              								"size",
+                              								lv_size_7_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:14038:5: ( (lv_unbounded_8_0= '*' ) )
+                            {
+                            // InternalFormalML.g:14038:5: ( (lv_unbounded_8_0= '*' ) )
+                            // InternalFormalML.g:14039:6: (lv_unbounded_8_0= '*' )
+                            {
+                            // InternalFormalML.g:14039:6: (lv_unbounded_8_0= '*' )
+                            // InternalFormalML.g:14040:7: lv_unbounded_8_0= '*'
+                            {
+                            lv_unbounded_8_0=(Token)match(input,98,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_unbounded_8_0, grammarAccess.getCollectionTypeDefinitionImplAccess().getUnboundedAsteriskKeyword_6_1_1_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getCollectionTypeDefinitionImplRule());
+                              							}
+                              							setWithLastConsumed(current, "unbounded", true, "*");
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,37,FollowSets000.FOLLOW_14); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getCollectionTypeDefinitionImplAccess().getGreaterThanSignKeyword_7());
+              		
+            }
+            otherlv_10=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getCollectionTypeDefinitionImplAccess().getSemicolonKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleCollectionTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleEnumerationType"
+    // InternalFormalML.g:14066:1: entryRuleEnumerationType returns [EObject current=null] : iv_ruleEnumerationType= ruleEnumerationType EOF ;
+    public final EObject entryRuleEnumerationType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEnumerationType = null;
+
+
+        try {
+            // InternalFormalML.g:14066:56: (iv_ruleEnumerationType= ruleEnumerationType EOF )
+            // InternalFormalML.g:14067:2: iv_ruleEnumerationType= ruleEnumerationType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEnumerationTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEnumerationType=ruleEnumerationType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEnumerationType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEnumerationType"
+
+
+    // $ANTLR start "ruleEnumerationType"
+    // InternalFormalML.g:14073:1: ruleEnumerationType returns [EObject current=null] : ( () otherlv_1= 'enum' otherlv_2= '{' ( (lv_literal_3_0= ruleEnumerationLiteral ) ) (otherlv_4= ',' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) )* otherlv_6= '}' ) ;
+    public final EObject ruleEnumerationType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_literal_3_0 = null;
+
+        EObject lv_literal_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:14079:2: ( ( () otherlv_1= 'enum' otherlv_2= '{' ( (lv_literal_3_0= ruleEnumerationLiteral ) ) (otherlv_4= ',' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) )* otherlv_6= '}' ) )
+            // InternalFormalML.g:14080:2: ( () otherlv_1= 'enum' otherlv_2= '{' ( (lv_literal_3_0= ruleEnumerationLiteral ) ) (otherlv_4= ',' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) )* otherlv_6= '}' )
+            {
+            // InternalFormalML.g:14080:2: ( () otherlv_1= 'enum' otherlv_2= '{' ( (lv_literal_3_0= ruleEnumerationLiteral ) ) (otherlv_4= ',' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) )* otherlv_6= '}' )
+            // InternalFormalML.g:14081:3: () otherlv_1= 'enum' otherlv_2= '{' ( (lv_literal_3_0= ruleEnumerationLiteral ) ) (otherlv_4= ',' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) )* otherlv_6= '}'
+            {
+            // InternalFormalML.g:14081:3: ()
+            // InternalFormalML.g:14082:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getEnumerationTypeAccess().getEnumerationTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,124,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getEnumerationTypeAccess().getEnumKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,22,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEnumerationTypeAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalFormalML.g:14099:3: ( (lv_literal_3_0= ruleEnumerationLiteral ) )
+            // InternalFormalML.g:14100:4: (lv_literal_3_0= ruleEnumerationLiteral )
+            {
+            // InternalFormalML.g:14100:4: (lv_literal_3_0= ruleEnumerationLiteral )
+            // InternalFormalML.g:14101:5: lv_literal_3_0= ruleEnumerationLiteral
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_148);
+            lv_literal_3_0=ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEnumerationTypeRule());
+              					}
+              					add(
+              						current,
+              						"literal",
+              						lv_literal_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14118:3: (otherlv_4= ',' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) )*
+            loop327:
+            do {
+                int alt327=2;
+                int LA327_0 = input.LA(1);
+
+                if ( (LA327_0==20) ) {
+                    alt327=1;
+                }
+
+
+                switch (alt327) {
+            	case 1 :
+            	    // InternalFormalML.g:14119:4: otherlv_4= ',' ( (lv_literal_5_0= ruleEnumerationLiteral ) )
+            	    {
+            	    otherlv_4=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_4, grammarAccess.getEnumerationTypeAccess().getCommaKeyword_4_0());
+            	      			
+            	    }
+            	    // InternalFormalML.g:14123:4: ( (lv_literal_5_0= ruleEnumerationLiteral ) )
+            	    // InternalFormalML.g:14124:5: (lv_literal_5_0= ruleEnumerationLiteral )
+            	    {
+            	    // InternalFormalML.g:14124:5: (lv_literal_5_0= ruleEnumerationLiteral )
+            	    // InternalFormalML.g:14125:6: lv_literal_5_0= ruleEnumerationLiteral
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getEnumerationTypeAccess().getLiteralEnumerationLiteralParserRuleCall_4_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_148);
+            	    lv_literal_5_0=ruleEnumerationLiteral();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getEnumerationTypeRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"literal",
+            	      							lv_literal_5_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop327;
+                }
+            } while (true);
+
+            otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getEnumerationTypeAccess().getRightCurlyBracketKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEnumerationType"
+
+
+    // $ANTLR start "entryRuleEnumerationTypeDefinition"
+    // InternalFormalML.g:14151:1: entryRuleEnumerationTypeDefinition returns [EObject current=null] : iv_ruleEnumerationTypeDefinition= ruleEnumerationTypeDefinition EOF ;
+    public final EObject entryRuleEnumerationTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEnumerationTypeDefinition = null;
+
+
+        try {
+            // InternalFormalML.g:14151:66: (iv_ruleEnumerationTypeDefinition= ruleEnumerationTypeDefinition EOF )
+            // InternalFormalML.g:14152:2: iv_ruleEnumerationTypeDefinition= ruleEnumerationTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEnumerationTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEnumerationTypeDefinition=ruleEnumerationTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEnumerationTypeDefinition; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEnumerationTypeDefinition"
+
+
+    // $ANTLR start "ruleEnumerationTypeDefinition"
+    // InternalFormalML.g:14158:1: ruleEnumerationTypeDefinition returns [EObject current=null] : ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'enum' ) ) otherlv_6= '{' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) (otherlv_8= ',' ( (lv_literal_9_0= ruleEnumerationLiteral ) ) )* otherlv_10= '}' ) ;
+    public final EObject ruleEnumerationTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token lv_typedef_5_0=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        EObject lv_literal_7_0 = null;
+
+        EObject lv_literal_9_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:14164:2: ( ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'enum' ) ) otherlv_6= '{' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) (otherlv_8= ',' ( (lv_literal_9_0= ruleEnumerationLiteral ) ) )* otherlv_10= '}' ) )
+            // InternalFormalML.g:14165:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'enum' ) ) otherlv_6= '{' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) (otherlv_8= ',' ( (lv_literal_9_0= ruleEnumerationLiteral ) ) )* otherlv_10= '}' )
+            {
+            // InternalFormalML.g:14165:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'enum' ) ) otherlv_6= '{' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) (otherlv_8= ',' ( (lv_literal_9_0= ruleEnumerationLiteral ) ) )* otherlv_10= '}' )
+            // InternalFormalML.g:14166:3: () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'enum' ) ) otherlv_6= '{' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) (otherlv_8= ',' ( (lv_literal_9_0= ruleEnumerationLiteral ) ) )* otherlv_10= '}'
+            {
+            // InternalFormalML.g:14166:3: ()
+            // InternalFormalML.g:14167:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getEnumerationTypeDefinitionAccess().getEnumerationTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:14176:3: ( (lv_visibility_1_0= ruleVisibilityKind ) )?
+            int alt328=2;
+            int LA328_0 = input.LA(1);
+
+            if ( (LA328_0==19||(LA328_0>=240 && LA328_0<=242)) ) {
+                alt328=1;
+            }
+            switch (alt328) {
+                case 1 :
+                    // InternalFormalML.g:14177:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:14177:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    // InternalFormalML.g:14178:5: lv_visibility_1_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_127);
+                    lv_visibility_1_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,101,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEnumerationTypeDefinitionAccess().getTypeKeyword_2());
+              		
+            }
+            // InternalFormalML.g:14199:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:14200:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:14200:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:14201:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_149);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14218:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt329=2;
+            int LA329_0 = input.LA(1);
+
+            if ( (LA329_0==RULE_STRING) ) {
+                alt329=1;
+            }
+            switch (alt329) {
+                case 1 :
+                    // InternalFormalML.g:14219:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:14219:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:14220:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_150);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:14237:3: ( (lv_typedef_5_0= 'enum' ) )
+            // InternalFormalML.g:14238:4: (lv_typedef_5_0= 'enum' )
+            {
+            // InternalFormalML.g:14238:4: (lv_typedef_5_0= 'enum' )
+            // InternalFormalML.g:14239:5: lv_typedef_5_0= 'enum'
+            {
+            lv_typedef_5_0=(Token)match(input,124,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_5_0, grammarAccess.getEnumerationTypeDefinitionAccess().getTypedefEnumKeyword_5_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEnumerationTypeDefinitionRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, "enum");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,22,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getEnumerationTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
+              		
+            }
+            // InternalFormalML.g:14255:3: ( (lv_literal_7_0= ruleEnumerationLiteral ) )
+            // InternalFormalML.g:14256:4: (lv_literal_7_0= ruleEnumerationLiteral )
+            {
+            // InternalFormalML.g:14256:4: (lv_literal_7_0= ruleEnumerationLiteral )
+            // InternalFormalML.g:14257:5: lv_literal_7_0= ruleEnumerationLiteral
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_7_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_148);
+            lv_literal_7_0=ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+              					}
+              					add(
+              						current,
+              						"literal",
+              						lv_literal_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14274:3: (otherlv_8= ',' ( (lv_literal_9_0= ruleEnumerationLiteral ) ) )*
+            loop330:
+            do {
+                int alt330=2;
+                int LA330_0 = input.LA(1);
+
+                if ( (LA330_0==20) ) {
+                    alt330=1;
+                }
+
+
+                switch (alt330) {
+            	case 1 :
+            	    // InternalFormalML.g:14275:4: otherlv_8= ',' ( (lv_literal_9_0= ruleEnumerationLiteral ) )
+            	    {
+            	    otherlv_8=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_8, grammarAccess.getEnumerationTypeDefinitionAccess().getCommaKeyword_8_0());
+            	      			
+            	    }
+            	    // InternalFormalML.g:14279:4: ( (lv_literal_9_0= ruleEnumerationLiteral ) )
+            	    // InternalFormalML.g:14280:5: (lv_literal_9_0= ruleEnumerationLiteral )
+            	    {
+            	    // InternalFormalML.g:14280:5: (lv_literal_9_0= ruleEnumerationLiteral )
+            	    // InternalFormalML.g:14281:6: lv_literal_9_0= ruleEnumerationLiteral
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getEnumerationTypeDefinitionAccess().getLiteralEnumerationLiteralParserRuleCall_8_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_148);
+            	    lv_literal_9_0=ruleEnumerationLiteral();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"literal",
+            	      							lv_literal_9_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop330;
+                }
+            } while (true);
+
+            otherlv_10=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getEnumerationTypeDefinitionAccess().getRightCurlyBracketKeyword_9());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEnumerationTypeDefinition"
+
+
+    // $ANTLR start "entryRuleEnumerationTypeDefinitionImpl"
+    // InternalFormalML.g:14307:1: entryRuleEnumerationTypeDefinitionImpl returns [EObject current=null] : iv_ruleEnumerationTypeDefinitionImpl= ruleEnumerationTypeDefinitionImpl EOF ;
+    public final EObject entryRuleEnumerationTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEnumerationTypeDefinitionImpl = null;
+
+
+        try {
+            // InternalFormalML.g:14307:70: (iv_ruleEnumerationTypeDefinitionImpl= ruleEnumerationTypeDefinitionImpl EOF )
+            // InternalFormalML.g:14308:2: iv_ruleEnumerationTypeDefinitionImpl= ruleEnumerationTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEnumerationTypeDefinitionImpl=ruleEnumerationTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEnumerationTypeDefinitionImpl; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEnumerationTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleEnumerationTypeDefinitionImpl"
+    // InternalFormalML.g:14314:1: ruleEnumerationTypeDefinitionImpl returns [EObject current=null] : ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'enum' ) ) otherlv_4= '{' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) (otherlv_6= ',' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) )* otherlv_8= '}' ) ;
+    public final EObject ruleEnumerationTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_typedef_3_0=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        EObject lv_literal_5_0 = null;
+
+        EObject lv_literal_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:14320:2: ( ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'enum' ) ) otherlv_4= '{' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) (otherlv_6= ',' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) )* otherlv_8= '}' ) )
+            // InternalFormalML.g:14321:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'enum' ) ) otherlv_4= '{' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) (otherlv_6= ',' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) )* otherlv_8= '}' )
+            {
+            // InternalFormalML.g:14321:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'enum' ) ) otherlv_4= '{' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) (otherlv_6= ',' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) )* otherlv_8= '}' )
+            // InternalFormalML.g:14322:3: () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'enum' ) ) otherlv_4= '{' ( (lv_literal_5_0= ruleEnumerationLiteral ) ) (otherlv_6= ',' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) )* otherlv_8= '}'
+            {
+            // InternalFormalML.g:14322:3: ()
+            // InternalFormalML.g:14323:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getEnumerationTypeDefinitionImplAccess().getEnumerationTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:14332:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:14333:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:14333:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:14334:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_149);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14351:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt331=2;
+            int LA331_0 = input.LA(1);
+
+            if ( (LA331_0==RULE_STRING) ) {
+                alt331=1;
+            }
+            switch (alt331) {
+                case 1 :
+                    // InternalFormalML.g:14352:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:14352:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:14353:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_150);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionImplRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:14370:3: ( (lv_typedef_3_0= 'enum' ) )
+            // InternalFormalML.g:14371:4: (lv_typedef_3_0= 'enum' )
+            {
+            // InternalFormalML.g:14371:4: (lv_typedef_3_0= 'enum' )
+            // InternalFormalML.g:14372:5: lv_typedef_3_0= 'enum'
+            {
+            lv_typedef_3_0=(Token)match(input,124,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_3_0, grammarAccess.getEnumerationTypeDefinitionImplAccess().getTypedefEnumKeyword_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getEnumerationTypeDefinitionImplRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, "enum");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,22,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getEnumerationTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalFormalML.g:14388:3: ( (lv_literal_5_0= ruleEnumerationLiteral ) )
+            // InternalFormalML.g:14389:4: (lv_literal_5_0= ruleEnumerationLiteral )
+            {
+            // InternalFormalML.g:14389:4: (lv_literal_5_0= ruleEnumerationLiteral )
+            // InternalFormalML.g:14390:5: lv_literal_5_0= ruleEnumerationLiteral
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_148);
+            lv_literal_5_0=ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionImplRule());
+              					}
+              					add(
+              						current,
+              						"literal",
+              						lv_literal_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14407:3: (otherlv_6= ',' ( (lv_literal_7_0= ruleEnumerationLiteral ) ) )*
+            loop332:
+            do {
+                int alt332=2;
+                int LA332_0 = input.LA(1);
+
+                if ( (LA332_0==20) ) {
+                    alt332=1;
+                }
+
+
+                switch (alt332) {
+            	case 1 :
+            	    // InternalFormalML.g:14408:4: otherlv_6= ',' ( (lv_literal_7_0= ruleEnumerationLiteral ) )
+            	    {
+            	    otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_6, grammarAccess.getEnumerationTypeDefinitionImplAccess().getCommaKeyword_6_0());
+            	      			
+            	    }
+            	    // InternalFormalML.g:14412:4: ( (lv_literal_7_0= ruleEnumerationLiteral ) )
+            	    // InternalFormalML.g:14413:5: (lv_literal_7_0= ruleEnumerationLiteral )
+            	    {
+            	    // InternalFormalML.g:14413:5: (lv_literal_7_0= ruleEnumerationLiteral )
+            	    // InternalFormalML.g:14414:6: lv_literal_7_0= ruleEnumerationLiteral
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getEnumerationTypeDefinitionImplAccess().getLiteralEnumerationLiteralParserRuleCall_6_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_148);
+            	    lv_literal_7_0=ruleEnumerationLiteral();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getEnumerationTypeDefinitionImplRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"literal",
+            	      							lv_literal_7_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop332;
+                }
+            } while (true);
+
+            otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getEnumerationTypeDefinitionImplAccess().getRightCurlyBracketKeyword_7());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEnumerationTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleEnumerationLiteral"
+    // InternalFormalML.g:14440:1: entryRuleEnumerationLiteral returns [EObject current=null] : iv_ruleEnumerationLiteral= ruleEnumerationLiteral EOF ;
+    public final EObject entryRuleEnumerationLiteral() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEnumerationLiteral = null;
+
+
+        try {
+            // InternalFormalML.g:14440:59: (iv_ruleEnumerationLiteral= ruleEnumerationLiteral EOF )
+            // InternalFormalML.g:14441:2: iv_ruleEnumerationLiteral= ruleEnumerationLiteral EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEnumerationLiteralRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEnumerationLiteral=ruleEnumerationLiteral();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEnumerationLiteral; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEnumerationLiteral"
+
+
+    // $ANTLR start "ruleEnumerationLiteral"
+    // InternalFormalML.g:14447:1: ruleEnumerationLiteral returns [EObject current=null] : ( ( (lv_name_0_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_1_0= ruleUnrestrictedName ) )? (otherlv_2= '=' ( (lv_value_3_0= ruleLiteralTerminalExpression ) ) )? ) ;
+    public final EObject ruleEnumerationLiteral() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        AntlrDatatypeRuleToken lv_name_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_1_0 = null;
+
+        EObject lv_value_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:14453:2: ( ( ( (lv_name_0_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_1_0= ruleUnrestrictedName ) )? (otherlv_2= '=' ( (lv_value_3_0= ruleLiteralTerminalExpression ) ) )? ) )
+            // InternalFormalML.g:14454:2: ( ( (lv_name_0_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_1_0= ruleUnrestrictedName ) )? (otherlv_2= '=' ( (lv_value_3_0= ruleLiteralTerminalExpression ) ) )? )
+            {
+            // InternalFormalML.g:14454:2: ( ( (lv_name_0_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_1_0= ruleUnrestrictedName ) )? (otherlv_2= '=' ( (lv_value_3_0= ruleLiteralTerminalExpression ) ) )? )
+            // InternalFormalML.g:14455:3: ( (lv_name_0_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_1_0= ruleUnrestrictedName ) )? (otherlv_2= '=' ( (lv_value_3_0= ruleLiteralTerminalExpression ) ) )?
+            {
+            // InternalFormalML.g:14455:3: ( (lv_name_0_0= ruleESIdentifier ) )
+            // InternalFormalML.g:14456:4: (lv_name_0_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:14456:4: (lv_name_0_0= ruleESIdentifier )
+            // InternalFormalML.g:14457:5: lv_name_0_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEnumerationLiteralAccess().getNameESIdentifierParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_151);
+            lv_name_0_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEnumerationLiteralRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14474:3: ( (lv_unrestrictedName_1_0= ruleUnrestrictedName ) )?
+            int alt333=2;
+            int LA333_0 = input.LA(1);
+
+            if ( (LA333_0==RULE_STRING) ) {
+                alt333=1;
+            }
+            switch (alt333) {
+                case 1 :
+                    // InternalFormalML.g:14475:4: (lv_unrestrictedName_1_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:14475:4: (lv_unrestrictedName_1_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:14476:5: lv_unrestrictedName_1_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getEnumerationLiteralAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_152);
+                    lv_unrestrictedName_1_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getEnumerationLiteralRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:14493:3: (otherlv_2= '=' ( (lv_value_3_0= ruleLiteralTerminalExpression ) ) )?
+            int alt334=2;
+            int LA334_0 = input.LA(1);
+
+            if ( (LA334_0==24) ) {
+                alt334=1;
+            }
+            switch (alt334) {
+                case 1 :
+                    // InternalFormalML.g:14494:4: otherlv_2= '=' ( (lv_value_3_0= ruleLiteralTerminalExpression ) )
+                    {
+                    otherlv_2=(Token)match(input,24,FollowSets000.FOLLOW_153); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getEnumerationLiteralAccess().getEqualsSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:14498:4: ( (lv_value_3_0= ruleLiteralTerminalExpression ) )
+                    // InternalFormalML.g:14499:5: (lv_value_3_0= ruleLiteralTerminalExpression )
+                    {
+                    // InternalFormalML.g:14499:5: (lv_value_3_0= ruleLiteralTerminalExpression )
+                    // InternalFormalML.g:14500:6: lv_value_3_0= ruleLiteralTerminalExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getEnumerationLiteralAccess().getValueLiteralTerminalExpressionParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_value_3_0=ruleLiteralTerminalExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getEnumerationLiteralRule());
+                      						}
+                      						set(
+                      							current,
+                      							"value",
+                      							lv_value_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.LiteralTerminalExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEnumerationLiteral"
+
+
+    // $ANTLR start "entryRuleStructureType"
+    // InternalFormalML.g:14522:1: entryRuleStructureType returns [EObject current=null] : iv_ruleStructureType= ruleStructureType EOF ;
+    public final EObject entryRuleStructureType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStructureType = null;
+
+
+        try {
+            // InternalFormalML.g:14522:54: (iv_ruleStructureType= ruleStructureType EOF )
+            // InternalFormalML.g:14523:2: iv_ruleStructureType= ruleStructureType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStructureTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleStructureType=ruleStructureType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStructureType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStructureType"
+
+
+    // $ANTLR start "ruleStructureType"
+    // InternalFormalML.g:14529:1: ruleStructureType returns [EObject current=null] : ( () otherlv_1= 'struct' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' ) ;
+    public final EObject ruleStructureType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_property_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:14535:2: ( ( () otherlv_1= 'struct' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' ) )
+            // InternalFormalML.g:14536:2: ( () otherlv_1= 'struct' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' )
+            {
+            // InternalFormalML.g:14536:2: ( () otherlv_1= 'struct' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' )
+            // InternalFormalML.g:14537:3: () otherlv_1= 'struct' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}'
+            {
+            // InternalFormalML.g:14537:3: ()
+            // InternalFormalML.g:14538:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getStructureTypeAccess().getStructureTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,125,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getStructureTypeAccess().getStructKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,22,FollowSets000.FOLLOW_154); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getStructureTypeAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalFormalML.g:14555:3: ( (lv_property_3_0= ruleVariable ) )+
+            int cnt335=0;
+            loop335:
+            do {
+                int alt335=2;
+                int LA335_0 = input.LA(1);
+
+                if ( (LA335_0==19||LA335_0==87||LA335_0==93||(LA335_0>=128 && LA335_0<=134)||(LA335_0>=240 && LA335_0<=242)) ) {
+                    alt335=1;
+                }
+
+
+                switch (alt335) {
+            	case 1 :
+            	    // InternalFormalML.g:14556:4: (lv_property_3_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:14556:4: (lv_property_3_0= ruleVariable )
+            	    // InternalFormalML.g:14557:5: lv_property_3_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getStructureTypeAccess().getPropertyVariableParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_155);
+            	    lv_property_3_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getStructureTypeRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"property",
+            	      						lv_property_3_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt335 >= 1 ) break loop335;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(335, input);
+                        throw eee;
+                }
+                cnt335++;
+            } while (true);
+
+            otherlv_4=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getStructureTypeAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStructureType"
+
+
+    // $ANTLR start "entryRuleStructureTypeDefinition"
+    // InternalFormalML.g:14582:1: entryRuleStructureTypeDefinition returns [EObject current=null] : iv_ruleStructureTypeDefinition= ruleStructureTypeDefinition EOF ;
+    public final EObject entryRuleStructureTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStructureTypeDefinition = null;
+
+
+        try {
+            // InternalFormalML.g:14582:64: (iv_ruleStructureTypeDefinition= ruleStructureTypeDefinition EOF )
+            // InternalFormalML.g:14583:2: iv_ruleStructureTypeDefinition= ruleStructureTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStructureTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleStructureTypeDefinition=ruleStructureTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStructureTypeDefinition; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStructureTypeDefinition"
+
+
+    // $ANTLR start "ruleStructureTypeDefinition"
+    // InternalFormalML.g:14589:1: ruleStructureTypeDefinition returns [EObject current=null] : ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'struct' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' ) ;
+    public final EObject ruleStructureTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token lv_typedef_5_0=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        EObject lv_property_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:14595:2: ( ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'struct' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' ) )
+            // InternalFormalML.g:14596:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'struct' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' )
+            {
+            // InternalFormalML.g:14596:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'struct' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' )
+            // InternalFormalML.g:14597:3: () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'struct' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}'
+            {
+            // InternalFormalML.g:14597:3: ()
+            // InternalFormalML.g:14598:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getStructureTypeDefinitionAccess().getStructureTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:14607:3: ( (lv_visibility_1_0= ruleVisibilityKind ) )?
+            int alt336=2;
+            int LA336_0 = input.LA(1);
+
+            if ( (LA336_0==19||(LA336_0>=240 && LA336_0<=242)) ) {
+                alt336=1;
+            }
+            switch (alt336) {
+                case 1 :
+                    // InternalFormalML.g:14608:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:14608:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    // InternalFormalML.g:14609:5: lv_visibility_1_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_127);
+                    lv_visibility_1_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,101,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getStructureTypeDefinitionAccess().getTypeKeyword_2());
+              		
+            }
+            // InternalFormalML.g:14630:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:14631:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:14631:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:14632:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_156);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14649:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt337=2;
+            int LA337_0 = input.LA(1);
+
+            if ( (LA337_0==RULE_STRING) ) {
+                alt337=1;
+            }
+            switch (alt337) {
+                case 1 :
+                    // InternalFormalML.g:14650:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:14650:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:14651:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_157);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:14668:3: ( (lv_typedef_5_0= 'struct' ) )
+            // InternalFormalML.g:14669:4: (lv_typedef_5_0= 'struct' )
+            {
+            // InternalFormalML.g:14669:4: (lv_typedef_5_0= 'struct' )
+            // InternalFormalML.g:14670:5: lv_typedef_5_0= 'struct'
+            {
+            lv_typedef_5_0=(Token)match(input,125,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_5_0, grammarAccess.getStructureTypeDefinitionAccess().getTypedefStructKeyword_5_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getStructureTypeDefinitionRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, "struct");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,22,FollowSets000.FOLLOW_154); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getStructureTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
+              		
+            }
+            // InternalFormalML.g:14686:3: ( (lv_property_7_0= ruleVariable ) )+
+            int cnt338=0;
+            loop338:
+            do {
+                int alt338=2;
+                int LA338_0 = input.LA(1);
+
+                if ( (LA338_0==19||LA338_0==87||LA338_0==93||(LA338_0>=128 && LA338_0<=134)||(LA338_0>=240 && LA338_0<=242)) ) {
+                    alt338=1;
+                }
+
+
+                switch (alt338) {
+            	case 1 :
+            	    // InternalFormalML.g:14687:4: (lv_property_7_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:14687:4: (lv_property_7_0= ruleVariable )
+            	    // InternalFormalML.g:14688:5: lv_property_7_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getStructureTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_155);
+            	    lv_property_7_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"property",
+            	      						lv_property_7_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt338 >= 1 ) break loop338;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(338, input);
+                        throw eee;
+                }
+                cnt338++;
+            } while (true);
+
+            otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getStructureTypeDefinitionAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStructureTypeDefinition"
+
+
+    // $ANTLR start "entryRuleStructureTypeDefinitionImpl"
+    // InternalFormalML.g:14713:1: entryRuleStructureTypeDefinitionImpl returns [EObject current=null] : iv_ruleStructureTypeDefinitionImpl= ruleStructureTypeDefinitionImpl EOF ;
+    public final EObject entryRuleStructureTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStructureTypeDefinitionImpl = null;
+
+
+        try {
+            // InternalFormalML.g:14713:68: (iv_ruleStructureTypeDefinitionImpl= ruleStructureTypeDefinitionImpl EOF )
+            // InternalFormalML.g:14714:2: iv_ruleStructureTypeDefinitionImpl= ruleStructureTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStructureTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleStructureTypeDefinitionImpl=ruleStructureTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStructureTypeDefinitionImpl; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStructureTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleStructureTypeDefinitionImpl"
+    // InternalFormalML.g:14720:1: ruleStructureTypeDefinitionImpl returns [EObject current=null] : ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'struct' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' ) ;
+    public final EObject ruleStructureTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_typedef_3_0=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        EObject lv_property_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:14726:2: ( ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'struct' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' ) )
+            // InternalFormalML.g:14727:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'struct' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' )
+            {
+            // InternalFormalML.g:14727:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'struct' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' )
+            // InternalFormalML.g:14728:3: () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'struct' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}'
+            {
+            // InternalFormalML.g:14728:3: ()
+            // InternalFormalML.g:14729:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getStructureTypeDefinitionImplAccess().getStructureTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:14738:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:14739:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:14739:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:14740:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getStructureTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_156);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14757:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt339=2;
+            int LA339_0 = input.LA(1);
+
+            if ( (LA339_0==RULE_STRING) ) {
+                alt339=1;
+            }
+            switch (alt339) {
+                case 1 :
+                    // InternalFormalML.g:14758:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:14758:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:14759:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getStructureTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_157);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionImplRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:14776:3: ( (lv_typedef_3_0= 'struct' ) )
+            // InternalFormalML.g:14777:4: (lv_typedef_3_0= 'struct' )
+            {
+            // InternalFormalML.g:14777:4: (lv_typedef_3_0= 'struct' )
+            // InternalFormalML.g:14778:5: lv_typedef_3_0= 'struct'
+            {
+            lv_typedef_3_0=(Token)match(input,125,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_3_0, grammarAccess.getStructureTypeDefinitionImplAccess().getTypedefStructKeyword_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getStructureTypeDefinitionImplRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, "struct");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,22,FollowSets000.FOLLOW_154); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getStructureTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalFormalML.g:14794:3: ( (lv_property_5_0= ruleVariable ) )+
+            int cnt340=0;
+            loop340:
+            do {
+                int alt340=2;
+                int LA340_0 = input.LA(1);
+
+                if ( (LA340_0==19||LA340_0==87||LA340_0==93||(LA340_0>=128 && LA340_0<=134)||(LA340_0>=240 && LA340_0<=242)) ) {
+                    alt340=1;
+                }
+
+
+                switch (alt340) {
+            	case 1 :
+            	    // InternalFormalML.g:14795:4: (lv_property_5_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:14795:4: (lv_property_5_0= ruleVariable )
+            	    // InternalFormalML.g:14796:5: lv_property_5_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getStructureTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_155);
+            	    lv_property_5_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getStructureTypeDefinitionImplRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"property",
+            	      						lv_property_5_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt340 >= 1 ) break loop340;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(340, input);
+                        throw eee;
+                }
+                cnt340++;
+            } while (true);
+
+            otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getStructureTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStructureTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleUnionType"
+    // InternalFormalML.g:14821:1: entryRuleUnionType returns [EObject current=null] : iv_ruleUnionType= ruleUnionType EOF ;
+    public final EObject entryRuleUnionType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUnionType = null;
+
+
+        try {
+            // InternalFormalML.g:14821:50: (iv_ruleUnionType= ruleUnionType EOF )
+            // InternalFormalML.g:14822:2: iv_ruleUnionType= ruleUnionType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUnionTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleUnionType=ruleUnionType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUnionType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUnionType"
+
+
+    // $ANTLR start "ruleUnionType"
+    // InternalFormalML.g:14828:1: ruleUnionType returns [EObject current=null] : ( () otherlv_1= 'union' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' ) ;
+    public final EObject ruleUnionType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_property_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:14834:2: ( ( () otherlv_1= 'union' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' ) )
+            // InternalFormalML.g:14835:2: ( () otherlv_1= 'union' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' )
+            {
+            // InternalFormalML.g:14835:2: ( () otherlv_1= 'union' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' )
+            // InternalFormalML.g:14836:3: () otherlv_1= 'union' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}'
+            {
+            // InternalFormalML.g:14836:3: ()
+            // InternalFormalML.g:14837:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUnionTypeAccess().getUnionTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,126,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getUnionTypeAccess().getUnionKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,22,FollowSets000.FOLLOW_154); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUnionTypeAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalFormalML.g:14854:3: ( (lv_property_3_0= ruleVariable ) )+
+            int cnt341=0;
+            loop341:
+            do {
+                int alt341=2;
+                int LA341_0 = input.LA(1);
+
+                if ( (LA341_0==19||LA341_0==87||LA341_0==93||(LA341_0>=128 && LA341_0<=134)||(LA341_0>=240 && LA341_0<=242)) ) {
+                    alt341=1;
+                }
+
+
+                switch (alt341) {
+            	case 1 :
+            	    // InternalFormalML.g:14855:4: (lv_property_3_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:14855:4: (lv_property_3_0= ruleVariable )
+            	    // InternalFormalML.g:14856:5: lv_property_3_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUnionTypeAccess().getPropertyVariableParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_155);
+            	    lv_property_3_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUnionTypeRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"property",
+            	      						lv_property_3_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt341 >= 1 ) break loop341;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(341, input);
+                        throw eee;
+                }
+                cnt341++;
+            } while (true);
+
+            otherlv_4=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getUnionTypeAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUnionType"
+
+
+    // $ANTLR start "entryRuleUnionTypeDefinition"
+    // InternalFormalML.g:14881:1: entryRuleUnionTypeDefinition returns [EObject current=null] : iv_ruleUnionTypeDefinition= ruleUnionTypeDefinition EOF ;
+    public final EObject entryRuleUnionTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUnionTypeDefinition = null;
+
+
+        try {
+            // InternalFormalML.g:14881:60: (iv_ruleUnionTypeDefinition= ruleUnionTypeDefinition EOF )
+            // InternalFormalML.g:14882:2: iv_ruleUnionTypeDefinition= ruleUnionTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUnionTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleUnionTypeDefinition=ruleUnionTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUnionTypeDefinition; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUnionTypeDefinition"
+
+
+    // $ANTLR start "ruleUnionTypeDefinition"
+    // InternalFormalML.g:14888:1: ruleUnionTypeDefinition returns [EObject current=null] : ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'union' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' ) ;
+    public final EObject ruleUnionTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token lv_typedef_5_0=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        EObject lv_property_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:14894:2: ( ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'union' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' ) )
+            // InternalFormalML.g:14895:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'union' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' )
+            {
+            // InternalFormalML.g:14895:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'union' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' )
+            // InternalFormalML.g:14896:3: () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'union' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}'
+            {
+            // InternalFormalML.g:14896:3: ()
+            // InternalFormalML.g:14897:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUnionTypeDefinitionAccess().getUnionTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:14906:3: ( (lv_visibility_1_0= ruleVisibilityKind ) )?
+            int alt342=2;
+            int LA342_0 = input.LA(1);
+
+            if ( (LA342_0==19||(LA342_0>=240 && LA342_0<=242)) ) {
+                alt342=1;
+            }
+            switch (alt342) {
+                case 1 :
+                    // InternalFormalML.g:14907:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:14907:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    // InternalFormalML.g:14908:5: lv_visibility_1_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_127);
+                    lv_visibility_1_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,101,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getUnionTypeDefinitionAccess().getTypeKeyword_2());
+              		
+            }
+            // InternalFormalML.g:14929:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:14930:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:14930:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:14931:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_158);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:14948:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt343=2;
+            int LA343_0 = input.LA(1);
+
+            if ( (LA343_0==RULE_STRING) ) {
+                alt343=1;
+            }
+            switch (alt343) {
+                case 1 :
+                    // InternalFormalML.g:14949:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:14949:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:14950:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_159);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:14967:3: ( (lv_typedef_5_0= 'union' ) )
+            // InternalFormalML.g:14968:4: (lv_typedef_5_0= 'union' )
+            {
+            // InternalFormalML.g:14968:4: (lv_typedef_5_0= 'union' )
+            // InternalFormalML.g:14969:5: lv_typedef_5_0= 'union'
+            {
+            lv_typedef_5_0=(Token)match(input,126,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_5_0, grammarAccess.getUnionTypeDefinitionAccess().getTypedefUnionKeyword_5_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUnionTypeDefinitionRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, "union");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,22,FollowSets000.FOLLOW_154); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getUnionTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
+              		
+            }
+            // InternalFormalML.g:14985:3: ( (lv_property_7_0= ruleVariable ) )+
+            int cnt344=0;
+            loop344:
+            do {
+                int alt344=2;
+                int LA344_0 = input.LA(1);
+
+                if ( (LA344_0==19||LA344_0==87||LA344_0==93||(LA344_0>=128 && LA344_0<=134)||(LA344_0>=240 && LA344_0<=242)) ) {
+                    alt344=1;
+                }
+
+
+                switch (alt344) {
+            	case 1 :
+            	    // InternalFormalML.g:14986:4: (lv_property_7_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:14986:4: (lv_property_7_0= ruleVariable )
+            	    // InternalFormalML.g:14987:5: lv_property_7_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUnionTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_155);
+            	    lv_property_7_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"property",
+            	      						lv_property_7_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt344 >= 1 ) break loop344;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(344, input);
+                        throw eee;
+                }
+                cnt344++;
+            } while (true);
+
+            otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getUnionTypeDefinitionAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUnionTypeDefinition"
+
+
+    // $ANTLR start "entryRuleUnionTypeDefinitionImpl"
+    // InternalFormalML.g:15012:1: entryRuleUnionTypeDefinitionImpl returns [EObject current=null] : iv_ruleUnionTypeDefinitionImpl= ruleUnionTypeDefinitionImpl EOF ;
+    public final EObject entryRuleUnionTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUnionTypeDefinitionImpl = null;
+
+
+        try {
+            // InternalFormalML.g:15012:64: (iv_ruleUnionTypeDefinitionImpl= ruleUnionTypeDefinitionImpl EOF )
+            // InternalFormalML.g:15013:2: iv_ruleUnionTypeDefinitionImpl= ruleUnionTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUnionTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleUnionTypeDefinitionImpl=ruleUnionTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUnionTypeDefinitionImpl; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUnionTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleUnionTypeDefinitionImpl"
+    // InternalFormalML.g:15019:1: ruleUnionTypeDefinitionImpl returns [EObject current=null] : ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'union' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' ) ;
+    public final EObject ruleUnionTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_typedef_3_0=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        EObject lv_property_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:15025:2: ( ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'union' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' ) )
+            // InternalFormalML.g:15026:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'union' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' )
+            {
+            // InternalFormalML.g:15026:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'union' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' )
+            // InternalFormalML.g:15027:3: () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'union' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}'
+            {
+            // InternalFormalML.g:15027:3: ()
+            // InternalFormalML.g:15028:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getUnionTypeDefinitionImplAccess().getUnionTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:15037:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:15038:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:15038:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:15039:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getUnionTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_158);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:15056:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt345=2;
+            int LA345_0 = input.LA(1);
+
+            if ( (LA345_0==RULE_STRING) ) {
+                alt345=1;
+            }
+            switch (alt345) {
+                case 1 :
+                    // InternalFormalML.g:15057:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:15057:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:15058:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getUnionTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_159);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionImplRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:15075:3: ( (lv_typedef_3_0= 'union' ) )
+            // InternalFormalML.g:15076:4: (lv_typedef_3_0= 'union' )
+            {
+            // InternalFormalML.g:15076:4: (lv_typedef_3_0= 'union' )
+            // InternalFormalML.g:15077:5: lv_typedef_3_0= 'union'
+            {
+            lv_typedef_3_0=(Token)match(input,126,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_3_0, grammarAccess.getUnionTypeDefinitionImplAccess().getTypedefUnionKeyword_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getUnionTypeDefinitionImplRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, "union");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,22,FollowSets000.FOLLOW_154); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getUnionTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalFormalML.g:15093:3: ( (lv_property_5_0= ruleVariable ) )+
+            int cnt346=0;
+            loop346:
+            do {
+                int alt346=2;
+                int LA346_0 = input.LA(1);
+
+                if ( (LA346_0==19||LA346_0==87||LA346_0==93||(LA346_0>=128 && LA346_0<=134)||(LA346_0>=240 && LA346_0<=242)) ) {
+                    alt346=1;
+                }
+
+
+                switch (alt346) {
+            	case 1 :
+            	    // InternalFormalML.g:15094:4: (lv_property_5_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:15094:4: (lv_property_5_0= ruleVariable )
+            	    // InternalFormalML.g:15095:5: lv_property_5_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getUnionTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_155);
+            	    lv_property_5_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getUnionTypeDefinitionImplRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"property",
+            	      						lv_property_5_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt346 >= 1 ) break loop346;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(346, input);
+                        throw eee;
+                }
+                cnt346++;
+            } while (true);
+
+            otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getUnionTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUnionTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleChoiceType"
+    // InternalFormalML.g:15120:1: entryRuleChoiceType returns [EObject current=null] : iv_ruleChoiceType= ruleChoiceType EOF ;
+    public final EObject entryRuleChoiceType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleChoiceType = null;
+
+
+        try {
+            // InternalFormalML.g:15120:51: (iv_ruleChoiceType= ruleChoiceType EOF )
+            // InternalFormalML.g:15121:2: iv_ruleChoiceType= ruleChoiceType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getChoiceTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleChoiceType=ruleChoiceType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleChoiceType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleChoiceType"
+
+
+    // $ANTLR start "ruleChoiceType"
+    // InternalFormalML.g:15127:1: ruleChoiceType returns [EObject current=null] : ( () otherlv_1= 'choice' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' ) ;
+    public final EObject ruleChoiceType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_property_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:15133:2: ( ( () otherlv_1= 'choice' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' ) )
+            // InternalFormalML.g:15134:2: ( () otherlv_1= 'choice' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' )
+            {
+            // InternalFormalML.g:15134:2: ( () otherlv_1= 'choice' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}' )
+            // InternalFormalML.g:15135:3: () otherlv_1= 'choice' otherlv_2= '{' ( (lv_property_3_0= ruleVariable ) )+ otherlv_4= '}'
+            {
+            // InternalFormalML.g:15135:3: ()
+            // InternalFormalML.g:15136:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getChoiceTypeAccess().getChoiceTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,127,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getChoiceTypeAccess().getChoiceKeyword_1());
+              		
+            }
+            otherlv_2=(Token)match(input,22,FollowSets000.FOLLOW_154); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getChoiceTypeAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalFormalML.g:15153:3: ( (lv_property_3_0= ruleVariable ) )+
+            int cnt347=0;
+            loop347:
+            do {
+                int alt347=2;
+                int LA347_0 = input.LA(1);
+
+                if ( (LA347_0==19||LA347_0==87||LA347_0==93||(LA347_0>=128 && LA347_0<=134)||(LA347_0>=240 && LA347_0<=242)) ) {
+                    alt347=1;
+                }
+
+
+                switch (alt347) {
+            	case 1 :
+            	    // InternalFormalML.g:15154:4: (lv_property_3_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:15154:4: (lv_property_3_0= ruleVariable )
+            	    // InternalFormalML.g:15155:5: lv_property_3_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getChoiceTypeAccess().getPropertyVariableParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_155);
+            	    lv_property_3_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getChoiceTypeRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"property",
+            	      						lv_property_3_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt347 >= 1 ) break loop347;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(347, input);
+                        throw eee;
+                }
+                cnt347++;
+            } while (true);
+
+            otherlv_4=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getChoiceTypeAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleChoiceType"
+
+
+    // $ANTLR start "entryRuleChoiceTypeDefinition"
+    // InternalFormalML.g:15180:1: entryRuleChoiceTypeDefinition returns [EObject current=null] : iv_ruleChoiceTypeDefinition= ruleChoiceTypeDefinition EOF ;
+    public final EObject entryRuleChoiceTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleChoiceTypeDefinition = null;
+
+
+        try {
+            // InternalFormalML.g:15180:61: (iv_ruleChoiceTypeDefinition= ruleChoiceTypeDefinition EOF )
+            // InternalFormalML.g:15181:2: iv_ruleChoiceTypeDefinition= ruleChoiceTypeDefinition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getChoiceTypeDefinitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleChoiceTypeDefinition=ruleChoiceTypeDefinition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleChoiceTypeDefinition; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleChoiceTypeDefinition"
+
+
+    // $ANTLR start "ruleChoiceTypeDefinition"
+    // InternalFormalML.g:15187:1: ruleChoiceTypeDefinition returns [EObject current=null] : ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'choice' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' ) ;
+    public final EObject ruleChoiceTypeDefinition() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token lv_typedef_5_0=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        EObject lv_property_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:15193:2: ( ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'choice' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' ) )
+            // InternalFormalML.g:15194:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'choice' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' )
+            {
+            // InternalFormalML.g:15194:2: ( () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'choice' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}' )
+            // InternalFormalML.g:15195:3: () ( (lv_visibility_1_0= ruleVisibilityKind ) )? otherlv_2= 'type' ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? ( (lv_typedef_5_0= 'choice' ) ) otherlv_6= '{' ( (lv_property_7_0= ruleVariable ) )+ otherlv_8= '}'
+            {
+            // InternalFormalML.g:15195:3: ()
+            // InternalFormalML.g:15196:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getChoiceTypeDefinitionAccess().getChoiceTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:15205:3: ( (lv_visibility_1_0= ruleVisibilityKind ) )?
+            int alt348=2;
+            int LA348_0 = input.LA(1);
+
+            if ( (LA348_0==19||(LA348_0>=240 && LA348_0<=242)) ) {
+                alt348=1;
+            }
+            switch (alt348) {
+                case 1 :
+                    // InternalFormalML.g:15206:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:15206:4: (lv_visibility_1_0= ruleVisibilityKind )
+                    // InternalFormalML.g:15207:5: lv_visibility_1_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getVisibilityVisibilityKindEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_127);
+                    lv_visibility_1_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,101,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getChoiceTypeDefinitionAccess().getTypeKeyword_2());
+              		
+            }
+            // InternalFormalML.g:15228:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:15229:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:15229:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:15230:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_160);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:15247:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt349=2;
+            int LA349_0 = input.LA(1);
+
+            if ( (LA349_0==RULE_STRING) ) {
+                alt349=1;
+            }
+            switch (alt349) {
+                case 1 :
+                    // InternalFormalML.g:15248:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:15248:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:15249:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_161);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:15266:3: ( (lv_typedef_5_0= 'choice' ) )
+            // InternalFormalML.g:15267:4: (lv_typedef_5_0= 'choice' )
+            {
+            // InternalFormalML.g:15267:4: (lv_typedef_5_0= 'choice' )
+            // InternalFormalML.g:15268:5: lv_typedef_5_0= 'choice'
+            {
+            lv_typedef_5_0=(Token)match(input,127,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_5_0, grammarAccess.getChoiceTypeDefinitionAccess().getTypedefChoiceKeyword_5_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getChoiceTypeDefinitionRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, "choice");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,22,FollowSets000.FOLLOW_154); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getChoiceTypeDefinitionAccess().getLeftCurlyBracketKeyword_6());
+              		
+            }
+            // InternalFormalML.g:15284:3: ( (lv_property_7_0= ruleVariable ) )+
+            int cnt350=0;
+            loop350:
+            do {
+                int alt350=2;
+                int LA350_0 = input.LA(1);
+
+                if ( (LA350_0==19||LA350_0==87||LA350_0==93||(LA350_0>=128 && LA350_0<=134)||(LA350_0>=240 && LA350_0<=242)) ) {
+                    alt350=1;
+                }
+
+
+                switch (alt350) {
+            	case 1 :
+            	    // InternalFormalML.g:15285:4: (lv_property_7_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:15285:4: (lv_property_7_0= ruleVariable )
+            	    // InternalFormalML.g:15286:5: lv_property_7_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getChoiceTypeDefinitionAccess().getPropertyVariableParserRuleCall_7_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_155);
+            	    lv_property_7_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"property",
+            	      						lv_property_7_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt350 >= 1 ) break loop350;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(350, input);
+                        throw eee;
+                }
+                cnt350++;
+            } while (true);
+
+            otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_8, grammarAccess.getChoiceTypeDefinitionAccess().getRightCurlyBracketKeyword_8());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleChoiceTypeDefinition"
+
+
+    // $ANTLR start "entryRuleChoiceTypeDefinitionImpl"
+    // InternalFormalML.g:15311:1: entryRuleChoiceTypeDefinitionImpl returns [EObject current=null] : iv_ruleChoiceTypeDefinitionImpl= ruleChoiceTypeDefinitionImpl EOF ;
+    public final EObject entryRuleChoiceTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleChoiceTypeDefinitionImpl = null;
+
+
+        try {
+            // InternalFormalML.g:15311:65: (iv_ruleChoiceTypeDefinitionImpl= ruleChoiceTypeDefinitionImpl EOF )
+            // InternalFormalML.g:15312:2: iv_ruleChoiceTypeDefinitionImpl= ruleChoiceTypeDefinitionImpl EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getChoiceTypeDefinitionImplRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleChoiceTypeDefinitionImpl=ruleChoiceTypeDefinitionImpl();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleChoiceTypeDefinitionImpl; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleChoiceTypeDefinitionImpl"
+
+
+    // $ANTLR start "ruleChoiceTypeDefinitionImpl"
+    // InternalFormalML.g:15318:1: ruleChoiceTypeDefinitionImpl returns [EObject current=null] : ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'choice' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' ) ;
+    public final EObject ruleChoiceTypeDefinitionImpl() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_typedef_3_0=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        EObject lv_property_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:15324:2: ( ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'choice' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' ) )
+            // InternalFormalML.g:15325:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'choice' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' )
+            {
+            // InternalFormalML.g:15325:2: ( () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'choice' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}' )
+            // InternalFormalML.g:15326:3: () ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? ( (lv_typedef_3_0= 'choice' ) ) otherlv_4= '{' ( (lv_property_5_0= ruleVariable ) )+ otherlv_6= '}'
+            {
+            // InternalFormalML.g:15326:3: ()
+            // InternalFormalML.g:15327:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getChoiceTypeDefinitionImplAccess().getChoiceTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:15336:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:15337:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:15337:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:15338:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getChoiceTypeDefinitionImplAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_160);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionImplRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:15355:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt351=2;
+            int LA351_0 = input.LA(1);
+
+            if ( (LA351_0==RULE_STRING) ) {
+                alt351=1;
+            }
+            switch (alt351) {
+                case 1 :
+                    // InternalFormalML.g:15356:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:15356:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:15357:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getChoiceTypeDefinitionImplAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_161);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionImplRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:15374:3: ( (lv_typedef_3_0= 'choice' ) )
+            // InternalFormalML.g:15375:4: (lv_typedef_3_0= 'choice' )
+            {
+            // InternalFormalML.g:15375:4: (lv_typedef_3_0= 'choice' )
+            // InternalFormalML.g:15376:5: lv_typedef_3_0= 'choice'
+            {
+            lv_typedef_3_0=(Token)match(input,127,FollowSets000.FOLLOW_10); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_typedef_3_0, grammarAccess.getChoiceTypeDefinitionImplAccess().getTypedefChoiceKeyword_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getChoiceTypeDefinitionImplRule());
+              					}
+              					setWithLastConsumed(current, "typedef", true, "choice");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,22,FollowSets000.FOLLOW_154); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getChoiceTypeDefinitionImplAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalFormalML.g:15392:3: ( (lv_property_5_0= ruleVariable ) )+
+            int cnt352=0;
+            loop352:
+            do {
+                int alt352=2;
+                int LA352_0 = input.LA(1);
+
+                if ( (LA352_0==19||LA352_0==87||LA352_0==93||(LA352_0>=128 && LA352_0<=134)||(LA352_0>=240 && LA352_0<=242)) ) {
+                    alt352=1;
+                }
+
+
+                switch (alt352) {
+            	case 1 :
+            	    // InternalFormalML.g:15393:4: (lv_property_5_0= ruleVariable )
+            	    {
+            	    // InternalFormalML.g:15393:4: (lv_property_5_0= ruleVariable )
+            	    // InternalFormalML.g:15394:5: lv_property_5_0= ruleVariable
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getChoiceTypeDefinitionImplAccess().getPropertyVariableParserRuleCall_5_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_155);
+            	    lv_property_5_0=ruleVariable();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getChoiceTypeDefinitionImplRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"property",
+            	      						lv_property_5_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Variable");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt352 >= 1 ) break loop352;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(352, input);
+                        throw eee;
+                }
+                cnt352++;
+            } while (true);
+
+            otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getChoiceTypeDefinitionImplAccess().getRightCurlyBracketKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleChoiceTypeDefinitionImpl"
+
+
+    // $ANTLR start "entryRuleModifier"
+    // InternalFormalML.g:15419:1: entryRuleModifier returns [EObject current=null] : iv_ruleModifier= ruleModifier EOF ;
+    public final EObject entryRuleModifier() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleModifier = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getModifierAccess().getUnorderedGroup_1()
+        	);
+
+        try {
+            // InternalFormalML.g:15423:2: (iv_ruleModifier= ruleModifier EOF )
+            // InternalFormalML.g:15424:2: iv_ruleModifier= ruleModifier EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getModifierRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleModifier=ruleModifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleModifier; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleModifier"
+
+
+    // $ANTLR start "ruleModifier"
+    // InternalFormalML.g:15433:1: ruleModifier returns [EObject current=null] : ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* ) ) ) ) ;
+    public final EObject ruleModifier() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_static_2_0=null;
+        Token lv_final_3_0=null;
+        Token lv_reference_4_0=null;
+        Token lv_volatile_5_0=null;
+        Token lv_transient_6_0=null;
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getModifierAccess().getUnorderedGroup_1()
+        	);
+
+        try {
+            // InternalFormalML.g:15442:2: ( ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* ) ) ) ) )
+            // InternalFormalML.g:15443:2: ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* ) ) ) )
+            {
+            // InternalFormalML.g:15443:2: ( () ( ( ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* ) ) ) )
+            // InternalFormalML.g:15444:3: () ( ( ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* ) ) )
+            {
+            // InternalFormalML.g:15444:3: ()
+            // InternalFormalML.g:15445:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getModifierAccess().getModifierAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:15454:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:15455:4: ( ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:15455:4: ( ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* ) )
+            // InternalFormalML.g:15456:5: ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+            // InternalFormalML.g:15459:5: ( ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )* )
+            // InternalFormalML.g:15460:6: ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:15460:6: ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )*
+            loop353:
+            do {
+                int alt353=6;
+                alt353 = dfa353.predict(input);
+                switch (alt353) {
+            	case 1 :
+            	    // InternalFormalML.g:15461:4: ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:15461:4: ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) )
+            	    // InternalFormalML.g:15462:5: {...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0)");
+            	    }
+            	    // InternalFormalML.g:15462:105: ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) )
+            	    // InternalFormalML.g:15463:6: ({...}? => ( (lv_static_2_0= 'static' ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0);
+            	    // InternalFormalML.g:15466:9: ({...}? => ( (lv_static_2_0= 'static' ) ) )
+            	    // InternalFormalML.g:15466:10: {...}? => ( (lv_static_2_0= 'static' ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "true");
+            	    }
+            	    // InternalFormalML.g:15466:19: ( (lv_static_2_0= 'static' ) )
+            	    // InternalFormalML.g:15466:20: (lv_static_2_0= 'static' )
+            	    {
+            	    // InternalFormalML.g:15466:20: (lv_static_2_0= 'static' )
+            	    // InternalFormalML.g:15467:10: lv_static_2_0= 'static'
+            	    {
+            	    lv_static_2_0=(Token)match(input,128,FollowSets000.FOLLOW_162); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										newLeafNode(lv_static_2_0, grammarAccess.getModifierAccess().getStaticStaticKeyword_1_0_0());
+            	      									
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElement(grammarAccess.getModifierRule());
+            	      										}
+            	      										setWithLastConsumed(current, "static", true, "static");
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:15484:4: ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:15484:4: ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) )
+            	    // InternalFormalML.g:15485:5: {...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1)");
+            	    }
+            	    // InternalFormalML.g:15485:105: ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) )
+            	    // InternalFormalML.g:15486:6: ({...}? => ( (lv_final_3_0= 'final' ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1);
+            	    // InternalFormalML.g:15489:9: ({...}? => ( (lv_final_3_0= 'final' ) ) )
+            	    // InternalFormalML.g:15489:10: {...}? => ( (lv_final_3_0= 'final' ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "true");
+            	    }
+            	    // InternalFormalML.g:15489:19: ( (lv_final_3_0= 'final' ) )
+            	    // InternalFormalML.g:15489:20: (lv_final_3_0= 'final' )
+            	    {
+            	    // InternalFormalML.g:15489:20: (lv_final_3_0= 'final' )
+            	    // InternalFormalML.g:15490:10: lv_final_3_0= 'final'
+            	    {
+            	    lv_final_3_0=(Token)match(input,87,FollowSets000.FOLLOW_162); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										newLeafNode(lv_final_3_0, grammarAccess.getModifierAccess().getFinalFinalKeyword_1_1_0());
+            	      									
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElement(grammarAccess.getModifierRule());
+            	      										}
+            	      										setWithLastConsumed(current, "final", true, "final");
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:15507:4: ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:15507:4: ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) )
+            	    // InternalFormalML.g:15508:5: {...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2)");
+            	    }
+            	    // InternalFormalML.g:15508:105: ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) )
+            	    // InternalFormalML.g:15509:6: ({...}? => ( (lv_reference_4_0= 'reference' ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2);
+            	    // InternalFormalML.g:15512:9: ({...}? => ( (lv_reference_4_0= 'reference' ) ) )
+            	    // InternalFormalML.g:15512:10: {...}? => ( (lv_reference_4_0= 'reference' ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "true");
+            	    }
+            	    // InternalFormalML.g:15512:19: ( (lv_reference_4_0= 'reference' ) )
+            	    // InternalFormalML.g:15512:20: (lv_reference_4_0= 'reference' )
+            	    {
+            	    // InternalFormalML.g:15512:20: (lv_reference_4_0= 'reference' )
+            	    // InternalFormalML.g:15513:10: lv_reference_4_0= 'reference'
+            	    {
+            	    lv_reference_4_0=(Token)match(input,129,FollowSets000.FOLLOW_162); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										newLeafNode(lv_reference_4_0, grammarAccess.getModifierAccess().getReferenceReferenceKeyword_1_2_0());
+            	      									
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElement(grammarAccess.getModifierRule());
+            	      										}
+            	      										setWithLastConsumed(current, "reference", true, "reference");
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:15530:4: ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:15530:4: ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) )
+            	    // InternalFormalML.g:15531:5: {...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3)");
+            	    }
+            	    // InternalFormalML.g:15531:105: ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) )
+            	    // InternalFormalML.g:15532:6: ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3);
+            	    // InternalFormalML.g:15535:9: ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) )
+            	    // InternalFormalML.g:15535:10: {...}? => ( (lv_volatile_5_0= 'volatile' ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "true");
+            	    }
+            	    // InternalFormalML.g:15535:19: ( (lv_volatile_5_0= 'volatile' ) )
+            	    // InternalFormalML.g:15535:20: (lv_volatile_5_0= 'volatile' )
+            	    {
+            	    // InternalFormalML.g:15535:20: (lv_volatile_5_0= 'volatile' )
+            	    // InternalFormalML.g:15536:10: lv_volatile_5_0= 'volatile'
+            	    {
+            	    lv_volatile_5_0=(Token)match(input,130,FollowSets000.FOLLOW_162); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										newLeafNode(lv_volatile_5_0, grammarAccess.getModifierAccess().getVolatileVolatileKeyword_1_3_0());
+            	      									
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElement(grammarAccess.getModifierRule());
+            	      										}
+            	      										setWithLastConsumed(current, "volatile", true, "volatile");
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 5 :
+            	    // InternalFormalML.g:15553:4: ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:15553:4: ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) )
+            	    // InternalFormalML.g:15554:5: {...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4)");
+            	    }
+            	    // InternalFormalML.g:15554:105: ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) )
+            	    // InternalFormalML.g:15555:6: ({...}? => ( (lv_transient_6_0= 'transient' ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4);
+            	    // InternalFormalML.g:15558:9: ({...}? => ( (lv_transient_6_0= 'transient' ) ) )
+            	    // InternalFormalML.g:15558:10: {...}? => ( (lv_transient_6_0= 'transient' ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleModifier", "true");
+            	    }
+            	    // InternalFormalML.g:15558:19: ( (lv_transient_6_0= 'transient' ) )
+            	    // InternalFormalML.g:15558:20: (lv_transient_6_0= 'transient' )
+            	    {
+            	    // InternalFormalML.g:15558:20: (lv_transient_6_0= 'transient' )
+            	    // InternalFormalML.g:15559:10: lv_transient_6_0= 'transient'
+            	    {
+            	    lv_transient_6_0=(Token)match(input,131,FollowSets000.FOLLOW_162); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										newLeafNode(lv_transient_6_0, grammarAccess.getModifierAccess().getTransientTransientKeyword_1_4_0());
+            	      									
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElement(grammarAccess.getModifierRule());
+            	      										}
+            	      										setWithLastConsumed(current, "transient", true, "transient");
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop353;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getModifierAccess().getUnorderedGroup_1());
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleModifier"
+
+
+    // $ANTLR start "entryRuleVariable"
+    // InternalFormalML.g:15590:1: entryRuleVariable returns [EObject current=null] : iv_ruleVariable= ruleVariable EOF ;
+    public final EObject entryRuleVariable() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleVariable = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getVariableAccess().getUnorderedGroup_0()
+        	);
+
+        try {
+            // InternalFormalML.g:15594:2: (iv_ruleVariable= ruleVariable EOF )
+            // InternalFormalML.g:15595:2: iv_ruleVariable= ruleVariable EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getVariableRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleVariable=ruleVariable();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleVariable; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleVariable"
+
+
+    // $ANTLR start "ruleVariable"
+    // InternalFormalML.g:15604:1: ruleVariable returns [EObject current=null] : ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) (otherlv_3= 'var' | ( (lv_const_4_0= 'val' ) ) | ( ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) ) ( (lv_macro_7_0= 'macro' ) )? (otherlv_8= 'var' )? ) | ( ( (lv_macro_9_0= 'macro' ) ) (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )? ) ) ( (lv_type_12_0= ruleDataType ) ) ( (lv_name_13_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_14_0= ruleUnrestrictedName ) )? (otherlv_15= '=' ( (lv_defaultValue_16_0= ruleExpression ) ) )? ( (otherlv_17= '{' ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) ) otherlv_19= '}' ) | otherlv_20= ';' ) ) ;
+    public final EObject ruleVariable() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_3=null;
+        Token lv_const_4_0=null;
+        Token lv_const_5_0=null;
+        Token lv_const_6_0=null;
+        Token lv_macro_7_0=null;
+        Token otherlv_8=null;
+        Token lv_macro_9_0=null;
+        Token otherlv_10=null;
+        Token lv_const_11_0=null;
+        Token otherlv_15=null;
+        Token otherlv_17=null;
+        Token otherlv_19=null;
+        Token otherlv_20=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        EObject lv_modifier_2_0 = null;
+
+        EObject lv_type_12_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_13_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_14_0 = null;
+
+        EObject lv_defaultValue_16_0 = null;
+
+        EObject lv_onWriteAction_18_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getVariableAccess().getUnorderedGroup_0()
+        	);
+
+        try {
+            // InternalFormalML.g:15613:2: ( ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) (otherlv_3= 'var' | ( (lv_const_4_0= 'val' ) ) | ( ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) ) ( (lv_macro_7_0= 'macro' ) )? (otherlv_8= 'var' )? ) | ( ( (lv_macro_9_0= 'macro' ) ) (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )? ) ) ( (lv_type_12_0= ruleDataType ) ) ( (lv_name_13_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_14_0= ruleUnrestrictedName ) )? (otherlv_15= '=' ( (lv_defaultValue_16_0= ruleExpression ) ) )? ( (otherlv_17= '{' ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) ) otherlv_19= '}' ) | otherlv_20= ';' ) ) )
+            // InternalFormalML.g:15614:2: ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) (otherlv_3= 'var' | ( (lv_const_4_0= 'val' ) ) | ( ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) ) ( (lv_macro_7_0= 'macro' ) )? (otherlv_8= 'var' )? ) | ( ( (lv_macro_9_0= 'macro' ) ) (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )? ) ) ( (lv_type_12_0= ruleDataType ) ) ( (lv_name_13_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_14_0= ruleUnrestrictedName ) )? (otherlv_15= '=' ( (lv_defaultValue_16_0= ruleExpression ) ) )? ( (otherlv_17= '{' ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) ) otherlv_19= '}' ) | otherlv_20= ';' ) )
+            {
+            // InternalFormalML.g:15614:2: ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) (otherlv_3= 'var' | ( (lv_const_4_0= 'val' ) ) | ( ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) ) ( (lv_macro_7_0= 'macro' ) )? (otherlv_8= 'var' )? ) | ( ( (lv_macro_9_0= 'macro' ) ) (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )? ) ) ( (lv_type_12_0= ruleDataType ) ) ( (lv_name_13_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_14_0= ruleUnrestrictedName ) )? (otherlv_15= '=' ( (lv_defaultValue_16_0= ruleExpression ) ) )? ( (otherlv_17= '{' ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) ) otherlv_19= '}' ) | otherlv_20= ';' ) )
+            // InternalFormalML.g:15615:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) (otherlv_3= 'var' | ( (lv_const_4_0= 'val' ) ) | ( ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) ) ( (lv_macro_7_0= 'macro' ) )? (otherlv_8= 'var' )? ) | ( ( (lv_macro_9_0= 'macro' ) ) (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )? ) ) ( (lv_type_12_0= ruleDataType ) ) ( (lv_name_13_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_14_0= ruleUnrestrictedName ) )? (otherlv_15= '=' ( (lv_defaultValue_16_0= ruleExpression ) ) )? ( (otherlv_17= '{' ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) ) otherlv_19= '}' ) | otherlv_20= ';' )
+            {
+            // InternalFormalML.g:15615:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:15616:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:15616:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) )
+            // InternalFormalML.g:15617:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+            // InternalFormalML.g:15620:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* )
+            // InternalFormalML.g:15621:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:15621:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )*
+            loop354:
+            do {
+                int alt354=3;
+                alt354 = dfa354.predict(input);
+                switch (alt354) {
+            	case 1 :
+            	    // InternalFormalML.g:15622:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:15622:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+            	    // InternalFormalML.g:15623:5: {...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleVariable", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0)");
+            	    }
+            	    // InternalFormalML.g:15623:105: ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+            	    // InternalFormalML.g:15624:6: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0);
+            	    // InternalFormalML.g:15627:9: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+            	    // InternalFormalML.g:15627:10: {...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleVariable", "true");
+            	    }
+            	    // InternalFormalML.g:15627:19: ( (lv_visibility_1_0= ruleVisibilityKind ) )
+            	    // InternalFormalML.g:15627:20: (lv_visibility_1_0= ruleVisibilityKind )
+            	    {
+            	    // InternalFormalML.g:15627:20: (lv_visibility_1_0= ruleVisibilityKind )
+            	    // InternalFormalML.g:15628:10: lv_visibility_1_0= ruleVisibilityKind
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getVariableAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_163);
+            	    lv_visibility_1_0=ruleVisibilityKind();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getVariableRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"visibility",
+            	      											lv_visibility_1_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:15650:4: ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:15650:4: ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) )
+            	    // InternalFormalML.g:15651:5: {...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleVariable", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1)");
+            	    }
+            	    // InternalFormalML.g:15651:105: ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) )
+            	    // InternalFormalML.g:15652:6: ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1);
+            	    // InternalFormalML.g:15655:9: ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) )
+            	    // InternalFormalML.g:15655:10: {...}? => ( (lv_modifier_2_0= ruleModifier ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleVariable", "true");
+            	    }
+            	    // InternalFormalML.g:15655:19: ( (lv_modifier_2_0= ruleModifier ) )
+            	    // InternalFormalML.g:15655:20: (lv_modifier_2_0= ruleModifier )
+            	    {
+            	    // InternalFormalML.g:15655:20: (lv_modifier_2_0= ruleModifier )
+            	    // InternalFormalML.g:15656:10: lv_modifier_2_0= ruleModifier
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getVariableAccess().getModifierModifierParserRuleCall_0_1_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_163);
+            	    lv_modifier_2_0=ruleModifier();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getVariableRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"modifier",
+            	      											lv_modifier_2_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop354;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getVariableAccess().getUnorderedGroup_0());
+
+            }
+
+            // InternalFormalML.g:15685:3: (otherlv_3= 'var' | ( (lv_const_4_0= 'val' ) ) | ( ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) ) ( (lv_macro_7_0= 'macro' ) )? (otherlv_8= 'var' )? ) | ( ( (lv_macro_9_0= 'macro' ) ) (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )? ) )
+            int alt359=4;
+            switch ( input.LA(1) ) {
+            case 132:
+                {
+                alt359=1;
+                }
+                break;
+            case 133:
+                {
+                alt359=2;
+                }
+                break;
+            case 87:
+            case 134:
+                {
+                alt359=3;
+                }
+                break;
+            case 93:
+                {
+                alt359=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 359, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt359) {
+                case 1 :
+                    // InternalFormalML.g:15686:4: otherlv_3= 'var'
+                    {
+                    otherlv_3=(Token)match(input,132,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getVariableAccess().getVarKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:15691:4: ( (lv_const_4_0= 'val' ) )
+                    {
+                    // InternalFormalML.g:15691:4: ( (lv_const_4_0= 'val' ) )
+                    // InternalFormalML.g:15692:5: (lv_const_4_0= 'val' )
+                    {
+                    // InternalFormalML.g:15692:5: (lv_const_4_0= 'val' )
+                    // InternalFormalML.g:15693:6: lv_const_4_0= 'val'
+                    {
+                    lv_const_4_0=(Token)match(input,133,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_const_4_0, grammarAccess.getVariableAccess().getConstValKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getVariableRule());
+                      						}
+                      						setWithLastConsumed(current, "const", true, "val");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:15706:4: ( ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) ) ( (lv_macro_7_0= 'macro' ) )? (otherlv_8= 'var' )? )
+                    {
+                    // InternalFormalML.g:15706:4: ( ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) ) ( (lv_macro_7_0= 'macro' ) )? (otherlv_8= 'var' )? )
+                    // InternalFormalML.g:15707:5: ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) ) ( (lv_macro_7_0= 'macro' ) )? (otherlv_8= 'var' )?
+                    {
+                    // InternalFormalML.g:15707:5: ( ( (lv_const_5_0= 'const' ) ) | ( (lv_const_6_0= 'final' ) ) )
+                    int alt355=2;
+                    int LA355_0 = input.LA(1);
+
+                    if ( (LA355_0==134) ) {
+                        alt355=1;
+                    }
+                    else if ( (LA355_0==87) ) {
+                        alt355=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 355, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt355) {
+                        case 1 :
+                            // InternalFormalML.g:15708:6: ( (lv_const_5_0= 'const' ) )
+                            {
+                            // InternalFormalML.g:15708:6: ( (lv_const_5_0= 'const' ) )
+                            // InternalFormalML.g:15709:7: (lv_const_5_0= 'const' )
+                            {
+                            // InternalFormalML.g:15709:7: (lv_const_5_0= 'const' )
+                            // InternalFormalML.g:15710:8: lv_const_5_0= 'const'
+                            {
+                            lv_const_5_0=(Token)match(input,134,FollowSets000.FOLLOW_164); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_const_5_0, grammarAccess.getVariableAccess().getConstConstKeyword_1_2_0_0_0());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getVariableRule());
+                              								}
+                              								setWithLastConsumed(current, "const", true, "const");
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:15723:6: ( (lv_const_6_0= 'final' ) )
+                            {
+                            // InternalFormalML.g:15723:6: ( (lv_const_6_0= 'final' ) )
+                            // InternalFormalML.g:15724:7: (lv_const_6_0= 'final' )
+                            {
+                            // InternalFormalML.g:15724:7: (lv_const_6_0= 'final' )
+                            // InternalFormalML.g:15725:8: lv_const_6_0= 'final'
+                            {
+                            lv_const_6_0=(Token)match(input,87,FollowSets000.FOLLOW_164); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_const_6_0, grammarAccess.getVariableAccess().getConstFinalKeyword_1_2_0_1_0());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getVariableRule());
+                              								}
+                              								setWithLastConsumed(current, "const", true, "final");
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:15738:5: ( (lv_macro_7_0= 'macro' ) )?
+                    int alt356=2;
+                    int LA356_0 = input.LA(1);
+
+                    if ( (LA356_0==93) ) {
+                        alt356=1;
+                    }
+                    switch (alt356) {
+                        case 1 :
+                            // InternalFormalML.g:15739:6: (lv_macro_7_0= 'macro' )
+                            {
+                            // InternalFormalML.g:15739:6: (lv_macro_7_0= 'macro' )
+                            // InternalFormalML.g:15740:7: lv_macro_7_0= 'macro'
+                            {
+                            lv_macro_7_0=(Token)match(input,93,FollowSets000.FOLLOW_165); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_macro_7_0, grammarAccess.getVariableAccess().getMacroMacroKeyword_1_2_1_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getVariableRule());
+                              							}
+                              							setWithLastConsumed(current, "macro", true, "macro");
+                              						
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:15752:5: (otherlv_8= 'var' )?
+                    int alt357=2;
+                    int LA357_0 = input.LA(1);
+
+                    if ( (LA357_0==132) ) {
+                        alt357=1;
+                    }
+                    switch (alt357) {
+                        case 1 :
+                            // InternalFormalML.g:15753:6: otherlv_8= 'var'
+                            {
+                            otherlv_8=(Token)match(input,132,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_8, grammarAccess.getVariableAccess().getVarKeyword_1_2_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:15760:4: ( ( (lv_macro_9_0= 'macro' ) ) (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )? )
+                    {
+                    // InternalFormalML.g:15760:4: ( ( (lv_macro_9_0= 'macro' ) ) (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )? )
+                    // InternalFormalML.g:15761:5: ( (lv_macro_9_0= 'macro' ) ) (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )?
+                    {
+                    // InternalFormalML.g:15761:5: ( (lv_macro_9_0= 'macro' ) )
+                    // InternalFormalML.g:15762:6: (lv_macro_9_0= 'macro' )
+                    {
+                    // InternalFormalML.g:15762:6: (lv_macro_9_0= 'macro' )
+                    // InternalFormalML.g:15763:7: lv_macro_9_0= 'macro'
+                    {
+                    lv_macro_9_0=(Token)match(input,93,FollowSets000.FOLLOW_166); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							newLeafNode(lv_macro_9_0, grammarAccess.getVariableAccess().getMacroMacroKeyword_1_3_0_0());
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getVariableRule());
+                      							}
+                      							setWithLastConsumed(current, "macro", true, "macro");
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:15775:5: (otherlv_10= 'var' | ( (lv_const_11_0= 'val' ) ) )?
+                    int alt358=3;
+                    int LA358_0 = input.LA(1);
+
+                    if ( (LA358_0==132) ) {
+                        alt358=1;
+                    }
+                    else if ( (LA358_0==133) ) {
+                        alt358=2;
+                    }
+                    switch (alt358) {
+                        case 1 :
+                            // InternalFormalML.g:15776:6: otherlv_10= 'var'
+                            {
+                            otherlv_10=(Token)match(input,132,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_10, grammarAccess.getVariableAccess().getVarKeyword_1_3_1_0());
+                              					
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:15781:6: ( (lv_const_11_0= 'val' ) )
+                            {
+                            // InternalFormalML.g:15781:6: ( (lv_const_11_0= 'val' ) )
+                            // InternalFormalML.g:15782:7: (lv_const_11_0= 'val' )
+                            {
+                            // InternalFormalML.g:15782:7: (lv_const_11_0= 'val' )
+                            // InternalFormalML.g:15783:8: lv_const_11_0= 'val'
+                            {
+                            lv_const_11_0=(Token)match(input,133,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_const_11_0, grammarAccess.getVariableAccess().getConstValKeyword_1_3_1_1_0());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getVariableRule());
+                              								}
+                              								setWithLastConsumed(current, "const", true, "val");
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:15798:3: ( (lv_type_12_0= ruleDataType ) )
+            // InternalFormalML.g:15799:4: (lv_type_12_0= ruleDataType )
+            {
+            // InternalFormalML.g:15799:4: (lv_type_12_0= ruleDataType )
+            // InternalFormalML.g:15800:5: lv_type_12_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariableAccess().getTypeDataTypeParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_12_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariableRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_12_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:15817:3: ( (lv_name_13_0= ruleESIdentifier ) )
+            // InternalFormalML.g:15818:4: (lv_name_13_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:15818:4: (lv_name_13_0= ruleESIdentifier )
+            // InternalFormalML.g:15819:5: lv_name_13_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariableAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_167);
+            lv_name_13_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariableRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_13_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:15836:3: ( (lv_unrestrictedName_14_0= ruleUnrestrictedName ) )?
+            int alt360=2;
+            int LA360_0 = input.LA(1);
+
+            if ( (LA360_0==RULE_STRING) ) {
+                alt360=1;
+            }
+            switch (alt360) {
+                case 1 :
+                    // InternalFormalML.g:15837:4: (lv_unrestrictedName_14_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:15837:4: (lv_unrestrictedName_14_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:15838:5: lv_unrestrictedName_14_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getVariableAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_168);
+                    lv_unrestrictedName_14_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getVariableRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_14_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:15855:3: (otherlv_15= '=' ( (lv_defaultValue_16_0= ruleExpression ) ) )?
+            int alt361=2;
+            int LA361_0 = input.LA(1);
+
+            if ( (LA361_0==24) ) {
+                alt361=1;
+            }
+            switch (alt361) {
+                case 1 :
+                    // InternalFormalML.g:15856:4: otherlv_15= '=' ( (lv_defaultValue_16_0= ruleExpression ) )
+                    {
+                    otherlv_15=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_15, grammarAccess.getVariableAccess().getEqualsSignKeyword_5_0());
+                      			
+                    }
+                    // InternalFormalML.g:15860:4: ( (lv_defaultValue_16_0= ruleExpression ) )
+                    // InternalFormalML.g:15861:5: (lv_defaultValue_16_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:15861:5: (lv_defaultValue_16_0= ruleExpression )
+                    // InternalFormalML.g:15862:6: lv_defaultValue_16_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getVariableAccess().getDefaultValueExpressionParserRuleCall_5_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_defaultValue_16_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getVariableRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_16_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:15880:3: ( (otherlv_17= '{' ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) ) otherlv_19= '}' ) | otherlv_20= ';' )
+            int alt362=2;
+            int LA362_0 = input.LA(1);
+
+            if ( (LA362_0==22) ) {
+                alt362=1;
+            }
+            else if ( (LA362_0==25) ) {
+                alt362=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 362, 0, input);
+
+                throw nvae;
+            }
+            switch (alt362) {
+                case 1 :
+                    // InternalFormalML.g:15881:4: (otherlv_17= '{' ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) ) otherlv_19= '}' )
+                    {
+                    // InternalFormalML.g:15881:4: (otherlv_17= '{' ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) ) otherlv_19= '}' )
+                    // InternalFormalML.g:15882:5: otherlv_17= '{' ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) ) otherlv_19= '}'
+                    {
+                    otherlv_17=(Token)match(input,22,FollowSets000.FOLLOW_169); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_17, grammarAccess.getVariableAccess().getLeftCurlyBracketKeyword_6_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:15886:5: ( (lv_onWriteAction_18_0= ruleOnWriteRoutine ) )
+                    // InternalFormalML.g:15887:6: (lv_onWriteAction_18_0= ruleOnWriteRoutine )
+                    {
+                    // InternalFormalML.g:15887:6: (lv_onWriteAction_18_0= ruleOnWriteRoutine )
+                    // InternalFormalML.g:15888:7: lv_onWriteAction_18_0= ruleOnWriteRoutine
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getVariableAccess().getOnWriteActionOnWriteRoutineParserRuleCall_6_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_33);
+                    lv_onWriteAction_18_0=ruleOnWriteRoutine();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getVariableRule());
+                      							}
+                      							set(
+                      								current,
+                      								"onWriteAction",
+                      								lv_onWriteAction_18_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_19=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_19, grammarAccess.getVariableAccess().getRightCurlyBracketKeyword_6_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:15911:4: otherlv_20= ';'
+                    {
+                    otherlv_20=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_20, grammarAccess.getVariableAccess().getSemicolonKeyword_6_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleVariable"
+
+
+    // $ANTLR start "entryRuleOnWriteRoutine"
+    // InternalFormalML.g:15923:1: entryRuleOnWriteRoutine returns [EObject current=null] : iv_ruleOnWriteRoutine= ruleOnWriteRoutine EOF ;
+    public final EObject entryRuleOnWriteRoutine() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleOnWriteRoutine = null;
+
+
+        try {
+            // InternalFormalML.g:15923:55: (iv_ruleOnWriteRoutine= ruleOnWriteRoutine EOF )
+            // InternalFormalML.g:15924:2: iv_ruleOnWriteRoutine= ruleOnWriteRoutine EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOnWriteRoutineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleOnWriteRoutine=ruleOnWriteRoutine();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOnWriteRoutine; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOnWriteRoutine"
+
+
+    // $ANTLR start "ruleOnWriteRoutine"
+    // InternalFormalML.g:15930:1: ruleOnWriteRoutine returns [EObject current=null] : ( () otherlv_1= '@on_write' (otherlv_2= '(' ( (lv_parameter_3_0= ruleVariableRoutineParameter ) ) otherlv_4= ')' )? ( (lv_bodyBlock_5_0= ruleBlockStatement ) ) ) ;
+    public final EObject ruleOnWriteRoutine() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_parameter_3_0 = null;
+
+        EObject lv_bodyBlock_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:15936:2: ( ( () otherlv_1= '@on_write' (otherlv_2= '(' ( (lv_parameter_3_0= ruleVariableRoutineParameter ) ) otherlv_4= ')' )? ( (lv_bodyBlock_5_0= ruleBlockStatement ) ) ) )
+            // InternalFormalML.g:15937:2: ( () otherlv_1= '@on_write' (otherlv_2= '(' ( (lv_parameter_3_0= ruleVariableRoutineParameter ) ) otherlv_4= ')' )? ( (lv_bodyBlock_5_0= ruleBlockStatement ) ) )
+            {
+            // InternalFormalML.g:15937:2: ( () otherlv_1= '@on_write' (otherlv_2= '(' ( (lv_parameter_3_0= ruleVariableRoutineParameter ) ) otherlv_4= ')' )? ( (lv_bodyBlock_5_0= ruleBlockStatement ) ) )
+            // InternalFormalML.g:15938:3: () otherlv_1= '@on_write' (otherlv_2= '(' ( (lv_parameter_3_0= ruleVariableRoutineParameter ) ) otherlv_4= ')' )? ( (lv_bodyBlock_5_0= ruleBlockStatement ) )
+            {
+            // InternalFormalML.g:15938:3: ()
+            // InternalFormalML.g:15939:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getOnWriteRoutineAccess().getRoutineAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,135,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getOnWriteRoutineAccess().getOn_writeKeyword_1());
+              		
+            }
+            // InternalFormalML.g:15952:3: (otherlv_2= '(' ( (lv_parameter_3_0= ruleVariableRoutineParameter ) ) otherlv_4= ')' )?
+            int alt363=2;
+            int LA363_0 = input.LA(1);
+
+            if ( (LA363_0==56) ) {
+                alt363=1;
+            }
+            switch (alt363) {
+                case 1 :
+                    // InternalFormalML.g:15953:4: otherlv_2= '(' ( (lv_parameter_3_0= ruleVariableRoutineParameter ) ) otherlv_4= ')'
+                    {
+                    otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getOnWriteRoutineAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:15957:4: ( (lv_parameter_3_0= ruleVariableRoutineParameter ) )
+                    // InternalFormalML.g:15958:5: (lv_parameter_3_0= ruleVariableRoutineParameter )
+                    {
+                    // InternalFormalML.g:15958:5: (lv_parameter_3_0= ruleVariableRoutineParameter )
+                    // InternalFormalML.g:15959:6: lv_parameter_3_0= ruleVariableRoutineParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getOnWriteRoutineAccess().getParameterVariableRoutineParameterParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_99);
+                    lv_parameter_3_0=ruleVariableRoutineParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getOnWriteRoutineRule());
+                      						}
+                      						add(
+                      							current,
+                      							"parameter",
+                      							lv_parameter_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.VariableRoutineParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,57,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getOnWriteRoutineAccess().getRightParenthesisKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:15981:3: ( (lv_bodyBlock_5_0= ruleBlockStatement ) )
+            // InternalFormalML.g:15982:4: (lv_bodyBlock_5_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:15982:4: (lv_bodyBlock_5_0= ruleBlockStatement )
+            // InternalFormalML.g:15983:5: lv_bodyBlock_5_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getOnWriteRoutineAccess().getBodyBlockBlockStatementParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_bodyBlock_5_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getOnWriteRoutineRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOnWriteRoutine"
+
+
+    // $ANTLR start "entryRuleVariableRoutineParameter"
+    // InternalFormalML.g:16004:1: entryRuleVariableRoutineParameter returns [EObject current=null] : iv_ruleVariableRoutineParameter= ruleVariableRoutineParameter EOF ;
+    public final EObject entryRuleVariableRoutineParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleVariableRoutineParameter = null;
+
+
+        try {
+            // InternalFormalML.g:16004:65: (iv_ruleVariableRoutineParameter= ruleVariableRoutineParameter EOF )
+            // InternalFormalML.g:16005:2: iv_ruleVariableRoutineParameter= ruleVariableRoutineParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getVariableRoutineParameterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleVariableRoutineParameter=ruleVariableRoutineParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleVariableRoutineParameter; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleVariableRoutineParameter"
+
+
+    // $ANTLR start "ruleVariableRoutineParameter"
+    // InternalFormalML.g:16011:1: ruleVariableRoutineParameter returns [EObject current=null] : ( ( (lv_type_0_0= ruleDataType ) )? ( (lv_name_1_0= ruleESIdentifier ) ) (otherlv_2= '=' ( (lv_defaultValue_3_0= ruleExpression ) ) )? ) ;
+    public final EObject ruleVariableRoutineParameter() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        EObject lv_type_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        EObject lv_defaultValue_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:16017:2: ( ( ( (lv_type_0_0= ruleDataType ) )? ( (lv_name_1_0= ruleESIdentifier ) ) (otherlv_2= '=' ( (lv_defaultValue_3_0= ruleExpression ) ) )? ) )
+            // InternalFormalML.g:16018:2: ( ( (lv_type_0_0= ruleDataType ) )? ( (lv_name_1_0= ruleESIdentifier ) ) (otherlv_2= '=' ( (lv_defaultValue_3_0= ruleExpression ) ) )? )
+            {
+            // InternalFormalML.g:16018:2: ( ( (lv_type_0_0= ruleDataType ) )? ( (lv_name_1_0= ruleESIdentifier ) ) (otherlv_2= '=' ( (lv_defaultValue_3_0= ruleExpression ) ) )? )
+            // InternalFormalML.g:16019:3: ( (lv_type_0_0= ruleDataType ) )? ( (lv_name_1_0= ruleESIdentifier ) ) (otherlv_2= '=' ( (lv_defaultValue_3_0= ruleExpression ) ) )?
+            {
+            // InternalFormalML.g:16019:3: ( (lv_type_0_0= ruleDataType ) )?
+            int alt364=2;
+            int LA364_0 = input.LA(1);
+
+            if ( (LA364_0==28||LA364_0==53||(LA364_0>=102 && LA364_0<=105)||(LA364_0>=107 && LA364_0<=127)||(LA364_0>=136 && LA364_0<=138)||LA364_0==212||(LA364_0>=216 && LA364_0<=217)||(LA364_0>=260 && LA364_0<=268)) ) {
+                alt364=1;
+            }
+            else if ( (LA364_0==RULE_XLIA_ID) ) {
+                int LA364_2 = input.LA(2);
+
+                if ( (LA364_2==RULE_XLIA_ID||(LA364_2>=29 && LA364_2<=31)||LA364_2==97) ) {
+                    alt364=1;
+                }
+            }
+            switch (alt364) {
+                case 1 :
+                    // InternalFormalML.g:16020:4: (lv_type_0_0= ruleDataType )
+                    {
+                    // InternalFormalML.g:16020:4: (lv_type_0_0= ruleDataType )
+                    // InternalFormalML.g:16021:5: lv_type_0_0= ruleDataType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getTypeDataTypeParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_type_0_0=ruleDataType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
+                      					}
+                      					set(
+                      						current,
+                      						"type",
+                      						lv_type_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16038:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:16039:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:16039:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:16040:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_152);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16057:3: (otherlv_2= '=' ( (lv_defaultValue_3_0= ruleExpression ) ) )?
+            int alt365=2;
+            int LA365_0 = input.LA(1);
+
+            if ( (LA365_0==24) ) {
+                alt365=1;
+            }
+            switch (alt365) {
+                case 1 :
+                    // InternalFormalML.g:16058:4: otherlv_2= '=' ( (lv_defaultValue_3_0= ruleExpression ) )
+                    {
+                    otherlv_2=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getVariableRoutineParameterAccess().getEqualsSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:16062:4: ( (lv_defaultValue_3_0= ruleExpression ) )
+                    // InternalFormalML.g:16063:5: (lv_defaultValue_3_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:16063:5: (lv_defaultValue_3_0= ruleExpression )
+                    // InternalFormalML.g:16064:6: lv_defaultValue_3_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getVariableRoutineParameterAccess().getDefaultValueExpressionParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_defaultValue_3_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getVariableRoutineParameterRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleVariableRoutineParameter"
+
+
+    // $ANTLR start "entryRuleVariablePublic"
+    // InternalFormalML.g:16086:1: entryRuleVariablePublic returns [EObject current=null] : iv_ruleVariablePublic= ruleVariablePublic EOF ;
+    public final EObject entryRuleVariablePublic() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleVariablePublic = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getVariablePublicAccess().getUnorderedGroup_1()
+        	);
+
+        try {
+            // InternalFormalML.g:16090:2: (iv_ruleVariablePublic= ruleVariablePublic EOF )
+            // InternalFormalML.g:16091:2: iv_ruleVariablePublic= ruleVariablePublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getVariablePublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleVariablePublic=ruleVariablePublic();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleVariablePublic; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleVariablePublic"
+
+
+    // $ANTLR start "ruleVariablePublic"
+    // InternalFormalML.g:16100:1: ruleVariablePublic returns [EObject current=null] : ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePublicVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) ) ;
+    public final EObject ruleVariablePublic() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_const_2_0=null;
+        Token lv_const_3_0=null;
+        Token lv_macro_4_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        EObject lv_modifier_0_0 = null;
+
+        Enumerator lv_visibility_5_0 = null;
+
+        EObject lv_type_6_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_defaultValue_10_0 = null;
+
+        EObject lv_onWriteAction_12_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getVariablePublicAccess().getUnorderedGroup_1()
+        	);
+
+        try {
+            // InternalFormalML.g:16109:2: ( ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePublicVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) ) )
+            // InternalFormalML.g:16110:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePublicVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) )
+            {
+            // InternalFormalML.g:16110:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePublicVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) )
+            // InternalFormalML.g:16111:3: ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePublicVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' )
+            {
+            // InternalFormalML.g:16111:3: ( (lv_modifier_0_0= ruleModifier ) )?
+            int alt366=2;
+            switch ( input.LA(1) ) {
+                case 128:
+                case 129:
+                case 130:
+                case 131:
+                    {
+                    alt366=1;
+                    }
+                    break;
+                case 87:
+                    {
+                    int LA366_2 = input.LA(2);
+
+                    if ( (synpred607_InternalFormalML()) ) {
+                        alt366=1;
+                    }
+                    }
+                    break;
+                case 134:
+                    {
+                    int LA366_3 = input.LA(2);
+
+                    if ( (synpred607_InternalFormalML()) ) {
+                        alt366=1;
+                    }
+                    }
+                    break;
+                case 93:
+                    {
+                    int LA366_4 = input.LA(2);
+
+                    if ( (synpred607_InternalFormalML()) ) {
+                        alt366=1;
+                    }
+                    }
+                    break;
+                case 132:
+                    {
+                    int LA366_5 = input.LA(2);
+
+                    if ( (synpred607_InternalFormalML()) ) {
+                        alt366=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt366) {
+                case 1 :
+                    // InternalFormalML.g:16112:4: (lv_modifier_0_0= ruleModifier )
+                    {
+                    // InternalFormalML.g:16112:4: (lv_modifier_0_0= ruleModifier )
+                    // InternalFormalML.g:16113:5: lv_modifier_0_0= ruleModifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getVariablePublicAccess().getModifierModifierParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_170);
+                    lv_modifier_0_0=ruleModifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+                      					}
+                      					set(
+                      						current,
+                      						"modifier",
+                      						lv_modifier_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16130:3: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )?
+            int alt369=2;
+            int LA369_0 = input.LA(1);
+
+            if ( (LA369_0==87||LA369_0==93||LA369_0==134) ) {
+                alt369=1;
+            }
+            else if ( (LA369_0==132) ) {
+                int LA369_2 = input.LA(2);
+
+                if ( (synpred611_InternalFormalML()) ) {
+                    alt369=1;
+                }
+            }
+            switch (alt369) {
+                case 1 :
+                    // InternalFormalML.g:16131:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+                    {
+                    // InternalFormalML.g:16131:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+                    // InternalFormalML.g:16132:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+                    // InternalFormalML.g:16135:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+                    // InternalFormalML.g:16136:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+                    {
+                    // InternalFormalML.g:16136:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+                    loop368:
+                    do {
+                        int alt368=3;
+                        int LA368_0 = input.LA(1);
+
+                        if ( LA368_0 == 134 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                            alt368=1;
+                        }
+                        else if ( LA368_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                            alt368=1;
+                        }
+                        else if ( LA368_0 == 93 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+                            alt368=2;
+                        }
+
+
+                        switch (alt368) {
+                    	case 1 :
+                    	    // InternalFormalML.g:16137:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+                    	    {
+                    	    // InternalFormalML.g:16137:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+                    	    // InternalFormalML.g:16138:5: {...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariablePublic", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0)");
+                    	    }
+                    	    // InternalFormalML.g:16138:111: ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+                    	    // InternalFormalML.g:16139:6: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0);
+                    	    // InternalFormalML.g:16142:9: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+                    	    // InternalFormalML.g:16142:10: {...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariablePublic", "true");
+                    	    }
+                    	    // InternalFormalML.g:16142:19: ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+                    	    int alt367=2;
+                    	    int LA367_0 = input.LA(1);
+
+                    	    if ( (LA367_0==134) ) {
+                    	        alt367=1;
+                    	    }
+                    	    else if ( (LA367_0==87) ) {
+                    	        alt367=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 367, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt367) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:16142:20: ( (lv_const_2_0= 'const' ) )
+                    	            {
+                    	            // InternalFormalML.g:16142:20: ( (lv_const_2_0= 'const' ) )
+                    	            // InternalFormalML.g:16143:10: (lv_const_2_0= 'const' )
+                    	            {
+                    	            // InternalFormalML.g:16143:10: (lv_const_2_0= 'const' )
+                    	            // InternalFormalML.g:16144:11: lv_const_2_0= 'const'
+                    	            {
+                    	            lv_const_2_0=(Token)match(input,134,FollowSets000.FOLLOW_170); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(lv_const_2_0, grammarAccess.getVariablePublicAccess().getConstConstKeyword_1_0_0_0());
+                    	              										
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getVariablePublicRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "const", true, "const");
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:16157:9: ( (lv_const_3_0= 'final' ) )
+                    	            {
+                    	            // InternalFormalML.g:16157:9: ( (lv_const_3_0= 'final' ) )
+                    	            // InternalFormalML.g:16158:10: (lv_const_3_0= 'final' )
+                    	            {
+                    	            // InternalFormalML.g:16158:10: (lv_const_3_0= 'final' )
+                    	            // InternalFormalML.g:16159:11: lv_const_3_0= 'final'
+                    	            {
+                    	            lv_const_3_0=(Token)match(input,87,FollowSets000.FOLLOW_170); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(lv_const_3_0, grammarAccess.getVariablePublicAccess().getConstFinalKeyword_1_0_1_0());
+                    	              										
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getVariablePublicRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "const", true, "final");
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:16177:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+                    	    {
+                    	    // InternalFormalML.g:16177:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+                    	    // InternalFormalML.g:16178:5: {...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariablePublic", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1)");
+                    	    }
+                    	    // InternalFormalML.g:16178:111: ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+                    	    // InternalFormalML.g:16179:6: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1);
+                    	    // InternalFormalML.g:16182:9: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+                    	    // InternalFormalML.g:16182:10: {...}? => ( (lv_macro_4_0= 'macro' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariablePublic", "true");
+                    	    }
+                    	    // InternalFormalML.g:16182:19: ( (lv_macro_4_0= 'macro' ) )
+                    	    // InternalFormalML.g:16182:20: (lv_macro_4_0= 'macro' )
+                    	    {
+                    	    // InternalFormalML.g:16182:20: (lv_macro_4_0= 'macro' )
+                    	    // InternalFormalML.g:16183:10: lv_macro_4_0= 'macro'
+                    	    {
+                    	    lv_macro_4_0=(Token)match(input,93,FollowSets000.FOLLOW_170); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(lv_macro_4_0, grammarAccess.getVariablePublicAccess().getMacroMacroKeyword_1_1_0());
+                    	      									
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										if (current==null) {
+                    	      											current = createModelElement(grammarAccess.getVariablePublicRule());
+                    	      										}
+                    	      										setWithLastConsumed(current, "macro", true, "macro");
+                    	      									
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop368;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16207:3: ( (lv_visibility_5_0= rulePublicVariableVisibilityKind ) )
+            // InternalFormalML.g:16208:4: (lv_visibility_5_0= rulePublicVariableVisibilityKind )
+            {
+            // InternalFormalML.g:16208:4: (lv_visibility_5_0= rulePublicVariableVisibilityKind )
+            // InternalFormalML.g:16209:5: lv_visibility_5_0= rulePublicVariableVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariablePublicAccess().getVisibilityPublicVariableVisibilityKindEnumRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_46);
+            lv_visibility_5_0=rulePublicVariableVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PublicVariableVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16226:3: ( (lv_type_6_0= ruleDataType ) )
+            // InternalFormalML.g:16227:4: (lv_type_6_0= ruleDataType )
+            {
+            // InternalFormalML.g:16227:4: (lv_type_6_0= ruleDataType )
+            // InternalFormalML.g:16228:5: lv_type_6_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariablePublicAccess().getTypeDataTypeParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_6_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_6_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16245:3: ( (lv_name_7_0= ruleESIdentifier ) )
+            // InternalFormalML.g:16246:4: (lv_name_7_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:16246:4: (lv_name_7_0= ruleESIdentifier )
+            // InternalFormalML.g:16247:5: lv_name_7_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariablePublicAccess().getNameESIdentifierParserRuleCall_4_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_167);
+            lv_name_7_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16264:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt370=2;
+            int LA370_0 = input.LA(1);
+
+            if ( (LA370_0==RULE_STRING) ) {
+                alt370=1;
+            }
+            switch (alt370) {
+                case 1 :
+                    // InternalFormalML.g:16265:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:16265:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:16266:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getVariablePublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_168);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16283:3: (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )?
+            int alt371=2;
+            int LA371_0 = input.LA(1);
+
+            if ( (LA371_0==24) ) {
+                alt371=1;
+            }
+            switch (alt371) {
+                case 1 :
+                    // InternalFormalML.g:16284:4: otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) )
+                    {
+                    otherlv_9=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getVariablePublicAccess().getEqualsSignKeyword_6_0());
+                      			
+                    }
+                    // InternalFormalML.g:16288:4: ( (lv_defaultValue_10_0= ruleExpression ) )
+                    // InternalFormalML.g:16289:5: (lv_defaultValue_10_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:16289:5: (lv_defaultValue_10_0= ruleExpression )
+                    // InternalFormalML.g:16290:6: lv_defaultValue_10_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getVariablePublicAccess().getDefaultValueExpressionParserRuleCall_6_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_defaultValue_10_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_10_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16308:3: ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' )
+            int alt372=2;
+            int LA372_0 = input.LA(1);
+
+            if ( (LA372_0==22) ) {
+                alt372=1;
+            }
+            else if ( (LA372_0==25) ) {
+                alt372=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 372, 0, input);
+
+                throw nvae;
+            }
+            switch (alt372) {
+                case 1 :
+                    // InternalFormalML.g:16309:4: (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' )
+                    {
+                    // InternalFormalML.g:16309:4: (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' )
+                    // InternalFormalML.g:16310:5: otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}'
+                    {
+                    otherlv_11=(Token)match(input,22,FollowSets000.FOLLOW_169); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getVariablePublicAccess().getLeftCurlyBracketKeyword_7_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:16314:5: ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) )
+                    // InternalFormalML.g:16315:6: (lv_onWriteAction_12_0= ruleOnWriteRoutine )
+                    {
+                    // InternalFormalML.g:16315:6: (lv_onWriteAction_12_0= ruleOnWriteRoutine )
+                    // InternalFormalML.g:16316:7: lv_onWriteAction_12_0= ruleOnWriteRoutine
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getVariablePublicAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_33);
+                    lv_onWriteAction_12_0=ruleOnWriteRoutine();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getVariablePublicRule());
+                      							}
+                      							set(
+                      								current,
+                      								"onWriteAction",
+                      								lv_onWriteAction_12_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_13=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_13, grammarAccess.getVariablePublicAccess().getRightCurlyBracketKeyword_7_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:16339:4: otherlv_14= ';'
+                    {
+                    otherlv_14=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getVariablePublicAccess().getSemicolonKeyword_7_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleVariablePublic"
+
+
+    // $ANTLR start "entryRuleVariableProtected"
+    // InternalFormalML.g:16351:1: entryRuleVariableProtected returns [EObject current=null] : iv_ruleVariableProtected= ruleVariableProtected EOF ;
+    public final EObject entryRuleVariableProtected() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleVariableProtected = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1()
+        	);
+
+        try {
+            // InternalFormalML.g:16355:2: (iv_ruleVariableProtected= ruleVariableProtected EOF )
+            // InternalFormalML.g:16356:2: iv_ruleVariableProtected= ruleVariableProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getVariableProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleVariableProtected=ruleVariableProtected();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleVariableProtected; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleVariableProtected"
+
+
+    // $ANTLR start "ruleVariableProtected"
+    // InternalFormalML.g:16365:1: ruleVariableProtected returns [EObject current=null] : ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= ruleProtectedVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) ) ;
+    public final EObject ruleVariableProtected() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_const_2_0=null;
+        Token lv_const_3_0=null;
+        Token lv_macro_4_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        EObject lv_modifier_0_0 = null;
+
+        Enumerator lv_visibility_5_0 = null;
+
+        EObject lv_type_6_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_defaultValue_10_0 = null;
+
+        EObject lv_onWriteAction_12_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1()
+        	);
+
+        try {
+            // InternalFormalML.g:16374:2: ( ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= ruleProtectedVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) ) )
+            // InternalFormalML.g:16375:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= ruleProtectedVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) )
+            {
+            // InternalFormalML.g:16375:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= ruleProtectedVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) )
+            // InternalFormalML.g:16376:3: ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= ruleProtectedVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' )
+            {
+            // InternalFormalML.g:16376:3: ( (lv_modifier_0_0= ruleModifier ) )?
+            int alt373=2;
+            switch ( input.LA(1) ) {
+                case 128:
+                case 129:
+                case 130:
+                case 131:
+                    {
+                    alt373=1;
+                    }
+                    break;
+                case 87:
+                    {
+                    int LA373_2 = input.LA(2);
+
+                    if ( (synpred615_InternalFormalML()) ) {
+                        alt373=1;
+                    }
+                    }
+                    break;
+                case 134:
+                    {
+                    int LA373_3 = input.LA(2);
+
+                    if ( (synpred615_InternalFormalML()) ) {
+                        alt373=1;
+                    }
+                    }
+                    break;
+                case 93:
+                    {
+                    int LA373_4 = input.LA(2);
+
+                    if ( (synpred615_InternalFormalML()) ) {
+                        alt373=1;
+                    }
+                    }
+                    break;
+                case 132:
+                    {
+                    int LA373_5 = input.LA(2);
+
+                    if ( (synpred615_InternalFormalML()) ) {
+                        alt373=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt373) {
+                case 1 :
+                    // InternalFormalML.g:16377:4: (lv_modifier_0_0= ruleModifier )
+                    {
+                    // InternalFormalML.g:16377:4: (lv_modifier_0_0= ruleModifier )
+                    // InternalFormalML.g:16378:5: lv_modifier_0_0= ruleModifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getVariableProtectedAccess().getModifierModifierParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_170);
+                    lv_modifier_0_0=ruleModifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+                      					}
+                      					set(
+                      						current,
+                      						"modifier",
+                      						lv_modifier_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16395:3: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )?
+            int alt376=2;
+            int LA376_0 = input.LA(1);
+
+            if ( (LA376_0==87||LA376_0==93||LA376_0==134) ) {
+                alt376=1;
+            }
+            else if ( (LA376_0==132) ) {
+                int LA376_2 = input.LA(2);
+
+                if ( (synpred619_InternalFormalML()) ) {
+                    alt376=1;
+                }
+            }
+            switch (alt376) {
+                case 1 :
+                    // InternalFormalML.g:16396:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+                    {
+                    // InternalFormalML.g:16396:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+                    // InternalFormalML.g:16397:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+                    // InternalFormalML.g:16400:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+                    // InternalFormalML.g:16401:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+                    {
+                    // InternalFormalML.g:16401:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+                    loop375:
+                    do {
+                        int alt375=3;
+                        int LA375_0 = input.LA(1);
+
+                        if ( LA375_0 == 134 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                            alt375=1;
+                        }
+                        else if ( LA375_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                            alt375=1;
+                        }
+                        else if ( LA375_0 == 93 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+                            alt375=2;
+                        }
+
+
+                        switch (alt375) {
+                    	case 1 :
+                    	    // InternalFormalML.g:16402:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+                    	    {
+                    	    // InternalFormalML.g:16402:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+                    	    // InternalFormalML.g:16403:5: {...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariableProtected", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0)");
+                    	    }
+                    	    // InternalFormalML.g:16403:114: ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+                    	    // InternalFormalML.g:16404:6: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0);
+                    	    // InternalFormalML.g:16407:9: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+                    	    // InternalFormalML.g:16407:10: {...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariableProtected", "true");
+                    	    }
+                    	    // InternalFormalML.g:16407:19: ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+                    	    int alt374=2;
+                    	    int LA374_0 = input.LA(1);
+
+                    	    if ( (LA374_0==134) ) {
+                    	        alt374=1;
+                    	    }
+                    	    else if ( (LA374_0==87) ) {
+                    	        alt374=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 374, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt374) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:16407:20: ( (lv_const_2_0= 'const' ) )
+                    	            {
+                    	            // InternalFormalML.g:16407:20: ( (lv_const_2_0= 'const' ) )
+                    	            // InternalFormalML.g:16408:10: (lv_const_2_0= 'const' )
+                    	            {
+                    	            // InternalFormalML.g:16408:10: (lv_const_2_0= 'const' )
+                    	            // InternalFormalML.g:16409:11: lv_const_2_0= 'const'
+                    	            {
+                    	            lv_const_2_0=(Token)match(input,134,FollowSets000.FOLLOW_170); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(lv_const_2_0, grammarAccess.getVariableProtectedAccess().getConstConstKeyword_1_0_0_0());
+                    	              										
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getVariableProtectedRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "const", true, "const");
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:16422:9: ( (lv_const_3_0= 'final' ) )
+                    	            {
+                    	            // InternalFormalML.g:16422:9: ( (lv_const_3_0= 'final' ) )
+                    	            // InternalFormalML.g:16423:10: (lv_const_3_0= 'final' )
+                    	            {
+                    	            // InternalFormalML.g:16423:10: (lv_const_3_0= 'final' )
+                    	            // InternalFormalML.g:16424:11: lv_const_3_0= 'final'
+                    	            {
+                    	            lv_const_3_0=(Token)match(input,87,FollowSets000.FOLLOW_170); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(lv_const_3_0, grammarAccess.getVariableProtectedAccess().getConstFinalKeyword_1_0_1_0());
+                    	              										
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getVariableProtectedRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "const", true, "final");
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:16442:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+                    	    {
+                    	    // InternalFormalML.g:16442:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+                    	    // InternalFormalML.g:16443:5: {...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariableProtected", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1)");
+                    	    }
+                    	    // InternalFormalML.g:16443:114: ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+                    	    // InternalFormalML.g:16444:6: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1);
+                    	    // InternalFormalML.g:16447:9: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+                    	    // InternalFormalML.g:16447:10: {...}? => ( (lv_macro_4_0= 'macro' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariableProtected", "true");
+                    	    }
+                    	    // InternalFormalML.g:16447:19: ( (lv_macro_4_0= 'macro' ) )
+                    	    // InternalFormalML.g:16447:20: (lv_macro_4_0= 'macro' )
+                    	    {
+                    	    // InternalFormalML.g:16447:20: (lv_macro_4_0= 'macro' )
+                    	    // InternalFormalML.g:16448:10: lv_macro_4_0= 'macro'
+                    	    {
+                    	    lv_macro_4_0=(Token)match(input,93,FollowSets000.FOLLOW_170); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(lv_macro_4_0, grammarAccess.getVariableProtectedAccess().getMacroMacroKeyword_1_1_0());
+                    	      									
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										if (current==null) {
+                    	      											current = createModelElement(grammarAccess.getVariableProtectedRule());
+                    	      										}
+                    	      										setWithLastConsumed(current, "macro", true, "macro");
+                    	      									
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop375;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16472:3: ( (lv_visibility_5_0= ruleProtectedVariableVisibilityKind ) )
+            // InternalFormalML.g:16473:4: (lv_visibility_5_0= ruleProtectedVariableVisibilityKind )
+            {
+            // InternalFormalML.g:16473:4: (lv_visibility_5_0= ruleProtectedVariableVisibilityKind )
+            // InternalFormalML.g:16474:5: lv_visibility_5_0= ruleProtectedVariableVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariableProtectedAccess().getVisibilityProtectedVariableVisibilityKindEnumRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_46);
+            lv_visibility_5_0=ruleProtectedVariableVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedVariableVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16491:3: ( (lv_type_6_0= ruleDataType ) )
+            // InternalFormalML.g:16492:4: (lv_type_6_0= ruleDataType )
+            {
+            // InternalFormalML.g:16492:4: (lv_type_6_0= ruleDataType )
+            // InternalFormalML.g:16493:5: lv_type_6_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariableProtectedAccess().getTypeDataTypeParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_6_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_6_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16510:3: ( (lv_name_7_0= ruleESIdentifier ) )
+            // InternalFormalML.g:16511:4: (lv_name_7_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:16511:4: (lv_name_7_0= ruleESIdentifier )
+            // InternalFormalML.g:16512:5: lv_name_7_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariableProtectedAccess().getNameESIdentifierParserRuleCall_4_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_167);
+            lv_name_7_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16529:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt377=2;
+            int LA377_0 = input.LA(1);
+
+            if ( (LA377_0==RULE_STRING) ) {
+                alt377=1;
+            }
+            switch (alt377) {
+                case 1 :
+                    // InternalFormalML.g:16530:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:16530:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:16531:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getVariableProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_168);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16548:3: (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )?
+            int alt378=2;
+            int LA378_0 = input.LA(1);
+
+            if ( (LA378_0==24) ) {
+                alt378=1;
+            }
+            switch (alt378) {
+                case 1 :
+                    // InternalFormalML.g:16549:4: otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) )
+                    {
+                    otherlv_9=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getVariableProtectedAccess().getEqualsSignKeyword_6_0());
+                      			
+                    }
+                    // InternalFormalML.g:16553:4: ( (lv_defaultValue_10_0= ruleExpression ) )
+                    // InternalFormalML.g:16554:5: (lv_defaultValue_10_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:16554:5: (lv_defaultValue_10_0= ruleExpression )
+                    // InternalFormalML.g:16555:6: lv_defaultValue_10_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getVariableProtectedAccess().getDefaultValueExpressionParserRuleCall_6_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_defaultValue_10_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_10_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16573:3: ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' )
+            int alt379=2;
+            int LA379_0 = input.LA(1);
+
+            if ( (LA379_0==22) ) {
+                alt379=1;
+            }
+            else if ( (LA379_0==25) ) {
+                alt379=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 379, 0, input);
+
+                throw nvae;
+            }
+            switch (alt379) {
+                case 1 :
+                    // InternalFormalML.g:16574:4: (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' )
+                    {
+                    // InternalFormalML.g:16574:4: (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' )
+                    // InternalFormalML.g:16575:5: otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}'
+                    {
+                    otherlv_11=(Token)match(input,22,FollowSets000.FOLLOW_169); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getVariableProtectedAccess().getLeftCurlyBracketKeyword_7_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:16579:5: ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) )
+                    // InternalFormalML.g:16580:6: (lv_onWriteAction_12_0= ruleOnWriteRoutine )
+                    {
+                    // InternalFormalML.g:16580:6: (lv_onWriteAction_12_0= ruleOnWriteRoutine )
+                    // InternalFormalML.g:16581:7: lv_onWriteAction_12_0= ruleOnWriteRoutine
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getVariableProtectedAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_33);
+                    lv_onWriteAction_12_0=ruleOnWriteRoutine();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getVariableProtectedRule());
+                      							}
+                      							set(
+                      								current,
+                      								"onWriteAction",
+                      								lv_onWriteAction_12_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_13=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_13, grammarAccess.getVariableProtectedAccess().getRightCurlyBracketKeyword_7_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:16604:4: otherlv_14= ';'
+                    {
+                    otherlv_14=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getVariableProtectedAccess().getSemicolonKeyword_7_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleVariableProtected"
+
+
+    // $ANTLR start "entryRuleVariablePrivate"
+    // InternalFormalML.g:16616:1: entryRuleVariablePrivate returns [EObject current=null] : iv_ruleVariablePrivate= ruleVariablePrivate EOF ;
+    public final EObject entryRuleVariablePrivate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleVariablePrivate = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1()
+        	);
+
+        try {
+            // InternalFormalML.g:16620:2: (iv_ruleVariablePrivate= ruleVariablePrivate EOF )
+            // InternalFormalML.g:16621:2: iv_ruleVariablePrivate= ruleVariablePrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getVariablePrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleVariablePrivate=ruleVariablePrivate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleVariablePrivate; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleVariablePrivate"
+
+
+    // $ANTLR start "ruleVariablePrivate"
+    // InternalFormalML.g:16630:1: ruleVariablePrivate returns [EObject current=null] : ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePrivateVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) ) ;
+    public final EObject ruleVariablePrivate() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_const_2_0=null;
+        Token lv_const_3_0=null;
+        Token lv_macro_4_0=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        EObject lv_modifier_0_0 = null;
+
+        Enumerator lv_visibility_5_0 = null;
+
+        EObject lv_type_6_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_7_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_8_0 = null;
+
+        EObject lv_defaultValue_10_0 = null;
+
+        EObject lv_onWriteAction_12_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1()
+        	);
+
+        try {
+            // InternalFormalML.g:16639:2: ( ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePrivateVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) ) )
+            // InternalFormalML.g:16640:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePrivateVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) )
+            {
+            // InternalFormalML.g:16640:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePrivateVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' ) )
+            // InternalFormalML.g:16641:3: ( (lv_modifier_0_0= ruleModifier ) )? ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )? ( (lv_visibility_5_0= rulePrivateVariableVisibilityKind ) ) ( (lv_type_6_0= ruleDataType ) ) ( (lv_name_7_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )? (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )? ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' )
+            {
+            // InternalFormalML.g:16641:3: ( (lv_modifier_0_0= ruleModifier ) )?
+            int alt380=2;
+            switch ( input.LA(1) ) {
+                case 128:
+                case 129:
+                case 130:
+                case 131:
+                    {
+                    alt380=1;
+                    }
+                    break;
+                case 87:
+                    {
+                    int LA380_2 = input.LA(2);
+
+                    if ( (synpred623_InternalFormalML()) ) {
+                        alt380=1;
+                    }
+                    }
+                    break;
+                case 134:
+                    {
+                    int LA380_3 = input.LA(2);
+
+                    if ( (synpred623_InternalFormalML()) ) {
+                        alt380=1;
+                    }
+                    }
+                    break;
+                case 93:
+                    {
+                    int LA380_4 = input.LA(2);
+
+                    if ( (synpred623_InternalFormalML()) ) {
+                        alt380=1;
+                    }
+                    }
+                    break;
+                case 132:
+                    {
+                    int LA380_5 = input.LA(2);
+
+                    if ( (synpred623_InternalFormalML()) ) {
+                        alt380=1;
+                    }
+                    }
+                    break;
+            }
+
+            switch (alt380) {
+                case 1 :
+                    // InternalFormalML.g:16642:4: (lv_modifier_0_0= ruleModifier )
+                    {
+                    // InternalFormalML.g:16642:4: (lv_modifier_0_0= ruleModifier )
+                    // InternalFormalML.g:16643:5: lv_modifier_0_0= ruleModifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getVariablePrivateAccess().getModifierModifierParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_170);
+                    lv_modifier_0_0=ruleModifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"modifier",
+                      						lv_modifier_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16660:3: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )?
+            int alt383=2;
+            int LA383_0 = input.LA(1);
+
+            if ( (LA383_0==87||LA383_0==93||LA383_0==134) ) {
+                alt383=1;
+            }
+            else if ( (LA383_0==132) ) {
+                int LA383_2 = input.LA(2);
+
+                if ( (synpred627_InternalFormalML()) ) {
+                    alt383=1;
+                }
+            }
+            switch (alt383) {
+                case 1 :
+                    // InternalFormalML.g:16661:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+                    {
+                    // InternalFormalML.g:16661:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+                    // InternalFormalML.g:16662:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+                    {
+                    getUnorderedGroupHelper().enter(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+                    // InternalFormalML.g:16665:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+                    // InternalFormalML.g:16666:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+                    {
+                    // InternalFormalML.g:16666:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+                    loop382:
+                    do {
+                        int alt382=3;
+                        int LA382_0 = input.LA(1);
+
+                        if ( LA382_0 == 134 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                            alt382=1;
+                        }
+                        else if ( LA382_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                            alt382=1;
+                        }
+                        else if ( LA382_0 == 93 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+                            alt382=2;
+                        }
+
+
+                        switch (alt382) {
+                    	case 1 :
+                    	    // InternalFormalML.g:16667:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+                    	    {
+                    	    // InternalFormalML.g:16667:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+                    	    // InternalFormalML.g:16668:5: {...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariablePrivate", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0)");
+                    	    }
+                    	    // InternalFormalML.g:16668:112: ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+                    	    // InternalFormalML.g:16669:6: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0);
+                    	    // InternalFormalML.g:16672:9: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+                    	    // InternalFormalML.g:16672:10: {...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariablePrivate", "true");
+                    	    }
+                    	    // InternalFormalML.g:16672:19: ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+                    	    int alt381=2;
+                    	    int LA381_0 = input.LA(1);
+
+                    	    if ( (LA381_0==134) ) {
+                    	        alt381=1;
+                    	    }
+                    	    else if ( (LA381_0==87) ) {
+                    	        alt381=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 381, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt381) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:16672:20: ( (lv_const_2_0= 'const' ) )
+                    	            {
+                    	            // InternalFormalML.g:16672:20: ( (lv_const_2_0= 'const' ) )
+                    	            // InternalFormalML.g:16673:10: (lv_const_2_0= 'const' )
+                    	            {
+                    	            // InternalFormalML.g:16673:10: (lv_const_2_0= 'const' )
+                    	            // InternalFormalML.g:16674:11: lv_const_2_0= 'const'
+                    	            {
+                    	            lv_const_2_0=(Token)match(input,134,FollowSets000.FOLLOW_170); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(lv_const_2_0, grammarAccess.getVariablePrivateAccess().getConstConstKeyword_1_0_0_0());
+                    	              										
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getVariablePrivateRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "const", true, "const");
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:16687:9: ( (lv_const_3_0= 'final' ) )
+                    	            {
+                    	            // InternalFormalML.g:16687:9: ( (lv_const_3_0= 'final' ) )
+                    	            // InternalFormalML.g:16688:10: (lv_const_3_0= 'final' )
+                    	            {
+                    	            // InternalFormalML.g:16688:10: (lv_const_3_0= 'final' )
+                    	            // InternalFormalML.g:16689:11: lv_const_3_0= 'final'
+                    	            {
+                    	            lv_const_3_0=(Token)match(input,87,FollowSets000.FOLLOW_170); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											newLeafNode(lv_const_3_0, grammarAccess.getVariablePrivateAccess().getConstFinalKeyword_1_0_1_0());
+                    	              										
+                    	            }
+                    	            if ( state.backtracking==0 ) {
+
+                    	              											if (current==null) {
+                    	              												current = createModelElement(grammarAccess.getVariablePrivateRule());
+                    	              											}
+                    	              											setWithLastConsumed(current, "const", true, "final");
+                    	              										
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalFormalML.g:16707:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+                    	    {
+                    	    // InternalFormalML.g:16707:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+                    	    // InternalFormalML.g:16708:5: {...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+                    	    {
+                    	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariablePrivate", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1)");
+                    	    }
+                    	    // InternalFormalML.g:16708:112: ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+                    	    // InternalFormalML.g:16709:6: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+                    	    {
+                    	    getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1);
+                    	    // InternalFormalML.g:16712:9: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+                    	    // InternalFormalML.g:16712:10: {...}? => ( (lv_macro_4_0= 'macro' ) )
+                    	    {
+                    	    if ( !((true)) ) {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        throw new FailedPredicateException(input, "ruleVariablePrivate", "true");
+                    	    }
+                    	    // InternalFormalML.g:16712:19: ( (lv_macro_4_0= 'macro' ) )
+                    	    // InternalFormalML.g:16712:20: (lv_macro_4_0= 'macro' )
+                    	    {
+                    	    // InternalFormalML.g:16712:20: (lv_macro_4_0= 'macro' )
+                    	    // InternalFormalML.g:16713:10: lv_macro_4_0= 'macro'
+                    	    {
+                    	    lv_macro_4_0=(Token)match(input,93,FollowSets000.FOLLOW_170); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										newLeafNode(lv_macro_4_0, grammarAccess.getVariablePrivateAccess().getMacroMacroKeyword_1_1_0());
+                    	      									
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      										if (current==null) {
+                    	      											current = createModelElement(grammarAccess.getVariablePrivateRule());
+                    	      										}
+                    	      										setWithLastConsumed(current, "macro", true, "macro");
+                    	      									
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+
+                    	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop382;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+
+                    getUnorderedGroupHelper().leave(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16737:3: ( (lv_visibility_5_0= rulePrivateVariableVisibilityKind ) )
+            // InternalFormalML.g:16738:4: (lv_visibility_5_0= rulePrivateVariableVisibilityKind )
+            {
+            // InternalFormalML.g:16738:4: (lv_visibility_5_0= rulePrivateVariableVisibilityKind )
+            // InternalFormalML.g:16739:5: lv_visibility_5_0= rulePrivateVariableVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariablePrivateAccess().getVisibilityPrivateVariableVisibilityKindEnumRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_46);
+            lv_visibility_5_0=rulePrivateVariableVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PrivateVariableVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16756:3: ( (lv_type_6_0= ruleDataType ) )
+            // InternalFormalML.g:16757:4: (lv_type_6_0= ruleDataType )
+            {
+            // InternalFormalML.g:16757:4: (lv_type_6_0= ruleDataType )
+            // InternalFormalML.g:16758:5: lv_type_6_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariablePrivateAccess().getTypeDataTypeParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_6_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_6_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16775:3: ( (lv_name_7_0= ruleESIdentifier ) )
+            // InternalFormalML.g:16776:4: (lv_name_7_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:16776:4: (lv_name_7_0= ruleESIdentifier )
+            // InternalFormalML.g:16777:5: lv_name_7_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getVariablePrivateAccess().getNameESIdentifierParserRuleCall_4_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_167);
+            lv_name_7_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_7_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16794:3: ( (lv_unrestrictedName_8_0= ruleUnrestrictedName ) )?
+            int alt384=2;
+            int LA384_0 = input.LA(1);
+
+            if ( (LA384_0==RULE_STRING) ) {
+                alt384=1;
+            }
+            switch (alt384) {
+                case 1 :
+                    // InternalFormalML.g:16795:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:16795:4: (lv_unrestrictedName_8_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:16796:5: lv_unrestrictedName_8_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getVariablePrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_168);
+                    lv_unrestrictedName_8_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_8_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16813:3: (otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) ) )?
+            int alt385=2;
+            int LA385_0 = input.LA(1);
+
+            if ( (LA385_0==24) ) {
+                alt385=1;
+            }
+            switch (alt385) {
+                case 1 :
+                    // InternalFormalML.g:16814:4: otherlv_9= '=' ( (lv_defaultValue_10_0= ruleExpression ) )
+                    {
+                    otherlv_9=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getVariablePrivateAccess().getEqualsSignKeyword_6_0());
+                      			
+                    }
+                    // InternalFormalML.g:16818:4: ( (lv_defaultValue_10_0= ruleExpression ) )
+                    // InternalFormalML.g:16819:5: (lv_defaultValue_10_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:16819:5: (lv_defaultValue_10_0= ruleExpression )
+                    // InternalFormalML.g:16820:6: lv_defaultValue_10_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getVariablePrivateAccess().getDefaultValueExpressionParserRuleCall_6_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    lv_defaultValue_10_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_10_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16838:3: ( (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' ) | otherlv_14= ';' )
+            int alt386=2;
+            int LA386_0 = input.LA(1);
+
+            if ( (LA386_0==22) ) {
+                alt386=1;
+            }
+            else if ( (LA386_0==25) ) {
+                alt386=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 386, 0, input);
+
+                throw nvae;
+            }
+            switch (alt386) {
+                case 1 :
+                    // InternalFormalML.g:16839:4: (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' )
+                    {
+                    // InternalFormalML.g:16839:4: (otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}' )
+                    // InternalFormalML.g:16840:5: otherlv_11= '{' ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) ) otherlv_13= '}'
+                    {
+                    otherlv_11=(Token)match(input,22,FollowSets000.FOLLOW_169); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getVariablePrivateAccess().getLeftCurlyBracketKeyword_7_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:16844:5: ( (lv_onWriteAction_12_0= ruleOnWriteRoutine ) )
+                    // InternalFormalML.g:16845:6: (lv_onWriteAction_12_0= ruleOnWriteRoutine )
+                    {
+                    // InternalFormalML.g:16845:6: (lv_onWriteAction_12_0= ruleOnWriteRoutine )
+                    // InternalFormalML.g:16846:7: lv_onWriteAction_12_0= ruleOnWriteRoutine
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getVariablePrivateAccess().getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_33);
+                    lv_onWriteAction_12_0=ruleOnWriteRoutine();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getVariablePrivateRule());
+                      							}
+                      							set(
+                      								current,
+                      								"onWriteAction",
+                      								lv_onWriteAction_12_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_13=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_13, grammarAccess.getVariablePrivateAccess().getRightCurlyBracketKeyword_7_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:16869:4: otherlv_14= ';'
+                    {
+                    otherlv_14=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getVariablePrivateAccess().getSemicolonKeyword_7_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleVariablePrivate"
+
+
+    // $ANTLR start "entryRuleFunctionalParameterSet"
+    // InternalFormalML.g:16881:1: entryRuleFunctionalParameterSet returns [EObject current=null] : iv_ruleFunctionalParameterSet= ruleFunctionalParameterSet EOF ;
+    public final EObject entryRuleFunctionalParameterSet() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleFunctionalParameterSet = null;
+
+
+        try {
+            // InternalFormalML.g:16881:63: (iv_ruleFunctionalParameterSet= ruleFunctionalParameterSet EOF )
+            // InternalFormalML.g:16882:2: iv_ruleFunctionalParameterSet= ruleFunctionalParameterSet EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getFunctionalParameterSetRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleFunctionalParameterSet=ruleFunctionalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleFunctionalParameterSet; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleFunctionalParameterSet"
+
+
+    // $ANTLR start "ruleFunctionalParameterSet"
+    // InternalFormalML.g:16888:1: ruleFunctionalParameterSet returns [EObject current=null] : ( () ( (lv_parameter_1_0= ruleFunctionalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFunctionalParameter ) ) )* ) ;
+    public final EObject ruleFunctionalParameterSet() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        EObject lv_parameter_1_0 = null;
+
+        EObject lv_parameter_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:16894:2: ( ( () ( (lv_parameter_1_0= ruleFunctionalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFunctionalParameter ) ) )* ) )
+            // InternalFormalML.g:16895:2: ( () ( (lv_parameter_1_0= ruleFunctionalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFunctionalParameter ) ) )* )
+            {
+            // InternalFormalML.g:16895:2: ( () ( (lv_parameter_1_0= ruleFunctionalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFunctionalParameter ) ) )* )
+            // InternalFormalML.g:16896:3: () ( (lv_parameter_1_0= ruleFunctionalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFunctionalParameter ) ) )*
+            {
+            // InternalFormalML.g:16896:3: ()
+            // InternalFormalML.g:16897:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getFunctionalParameterSetAccess().getParameterSetAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:16906:3: ( (lv_parameter_1_0= ruleFunctionalParameter ) )
+            // InternalFormalML.g:16907:4: (lv_parameter_1_0= ruleFunctionalParameter )
+            {
+            // InternalFormalML.g:16907:4: (lv_parameter_1_0= ruleFunctionalParameter )
+            // InternalFormalML.g:16908:5: lv_parameter_1_0= ruleFunctionalParameter
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_8);
+            lv_parameter_1_0=ruleFunctionalParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getFunctionalParameterSetRule());
+              					}
+              					add(
+              						current,
+              						"parameter",
+              						lv_parameter_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:16925:3: (otherlv_2= ',' ( (lv_parameter_3_0= ruleFunctionalParameter ) ) )*
+            loop387:
+            do {
+                int alt387=2;
+                int LA387_0 = input.LA(1);
+
+                if ( (LA387_0==20) ) {
+                    alt387=1;
+                }
+
+
+                switch (alt387) {
+            	case 1 :
+            	    // InternalFormalML.g:16926:4: otherlv_2= ',' ( (lv_parameter_3_0= ruleFunctionalParameter ) )
+            	    {
+            	    otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_2, grammarAccess.getFunctionalParameterSetAccess().getCommaKeyword_2_0());
+            	      			
+            	    }
+            	    // InternalFormalML.g:16930:4: ( (lv_parameter_3_0= ruleFunctionalParameter ) )
+            	    // InternalFormalML.g:16931:5: (lv_parameter_3_0= ruleFunctionalParameter )
+            	    {
+            	    // InternalFormalML.g:16931:5: (lv_parameter_3_0= ruleFunctionalParameter )
+            	    // InternalFormalML.g:16932:6: lv_parameter_3_0= ruleFunctionalParameter
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getFunctionalParameterSetAccess().getParameterFunctionalParameterParserRuleCall_2_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_8);
+            	    lv_parameter_3_0=ruleFunctionalParameter();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getFunctionalParameterSetRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"parameter",
+            	      							lv_parameter_3_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop387;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleFunctionalParameterSet"
+
+
+    // $ANTLR start "entryRuleFunctionalParameter"
+    // InternalFormalML.g:16954:1: entryRuleFunctionalParameter returns [EObject current=null] : iv_ruleFunctionalParameter= ruleFunctionalParameter EOF ;
+    public final EObject entryRuleFunctionalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleFunctionalParameter = null;
+
+
+        try {
+            // InternalFormalML.g:16954:60: (iv_ruleFunctionalParameter= ruleFunctionalParameter EOF )
+            // InternalFormalML.g:16955:2: iv_ruleFunctionalParameter= ruleFunctionalParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getFunctionalParameterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleFunctionalParameter=ruleFunctionalParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleFunctionalParameter; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleFunctionalParameter"
+
+
+    // $ANTLR start "ruleFunctionalParameter"
+    // InternalFormalML.g:16961:1: ruleFunctionalParameter returns [EObject current=null] : ( () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? ) ;
+    public final EObject ruleFunctionalParameter() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Enumerator lv_direction_1_0 = null;
+
+        EObject lv_type_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        EObject lv_defaultValue_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:16967:2: ( ( () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? ) )
+            // InternalFormalML.g:16968:2: ( () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? )
+            {
+            // InternalFormalML.g:16968:2: ( () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? )
+            // InternalFormalML.g:16969:3: () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )?
+            {
+            // InternalFormalML.g:16969:3: ()
+            // InternalFormalML.g:16970:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getFunctionalParameterAccess().getParameterAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:16979:3: ( (lv_direction_1_0= ruleParameterDirectionKind ) )?
+            int alt388=2;
+            int LA388_0 = input.LA(1);
+
+            if ( (LA388_0==62||LA388_0==64||(LA388_0>=269 && LA388_0<=270)) ) {
+                alt388=1;
+            }
+            switch (alt388) {
+                case 1 :
+                    // InternalFormalML.g:16980:4: (lv_direction_1_0= ruleParameterDirectionKind )
+                    {
+                    // InternalFormalML.g:16980:4: (lv_direction_1_0= ruleParameterDirectionKind )
+                    // InternalFormalML.g:16981:5: lv_direction_1_0= ruleParameterDirectionKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getFunctionalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_46);
+                    lv_direction_1_0=ruleParameterDirectionKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ParameterDirectionKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:16998:3: ( (lv_type_2_0= ruleDataType ) )
+            // InternalFormalML.g:16999:4: (lv_type_2_0= ruleDataType )
+            {
+            // InternalFormalML.g:16999:4: (lv_type_2_0= ruleDataType )
+            // InternalFormalML.g:17000:5: lv_type_2_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getFunctionalParameterAccess().getTypeDataTypeParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_2_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17017:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:17018:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:17018:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:17019:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getFunctionalParameterAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_152);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17036:3: (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )?
+            int alt389=2;
+            int LA389_0 = input.LA(1);
+
+            if ( (LA389_0==24) ) {
+                alt389=1;
+            }
+            switch (alt389) {
+                case 1 :
+                    // InternalFormalML.g:17037:4: otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) )
+                    {
+                    otherlv_4=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getFunctionalParameterAccess().getEqualsSignKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:17041:4: ( (lv_defaultValue_5_0= ruleExpression ) )
+                    // InternalFormalML.g:17042:5: (lv_defaultValue_5_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:17042:5: (lv_defaultValue_5_0= ruleExpression )
+                    // InternalFormalML.g:17043:6: lv_defaultValue_5_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getFunctionalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_defaultValue_5_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getFunctionalParameterRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleFunctionalParameter"
+
+
+    // $ANTLR start "entryRuleFormalParameterSet"
+    // InternalFormalML.g:17065:1: entryRuleFormalParameterSet returns [EObject current=null] : iv_ruleFormalParameterSet= ruleFormalParameterSet EOF ;
+    public final EObject entryRuleFormalParameterSet() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleFormalParameterSet = null;
+
+
+        try {
+            // InternalFormalML.g:17065:59: (iv_ruleFormalParameterSet= ruleFormalParameterSet EOF )
+            // InternalFormalML.g:17066:2: iv_ruleFormalParameterSet= ruleFormalParameterSet EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getFormalParameterSetRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleFormalParameterSet=ruleFormalParameterSet();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleFormalParameterSet; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleFormalParameterSet"
+
+
+    // $ANTLR start "ruleFormalParameterSet"
+    // InternalFormalML.g:17072:1: ruleFormalParameterSet returns [EObject current=null] : ( () ( (lv_parameter_1_0= ruleFormalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFormalParameter ) ) )* ) ;
+    public final EObject ruleFormalParameterSet() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        EObject lv_parameter_1_0 = null;
+
+        EObject lv_parameter_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:17078:2: ( ( () ( (lv_parameter_1_0= ruleFormalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFormalParameter ) ) )* ) )
+            // InternalFormalML.g:17079:2: ( () ( (lv_parameter_1_0= ruleFormalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFormalParameter ) ) )* )
+            {
+            // InternalFormalML.g:17079:2: ( () ( (lv_parameter_1_0= ruleFormalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFormalParameter ) ) )* )
+            // InternalFormalML.g:17080:3: () ( (lv_parameter_1_0= ruleFormalParameter ) ) (otherlv_2= ',' ( (lv_parameter_3_0= ruleFormalParameter ) ) )*
+            {
+            // InternalFormalML.g:17080:3: ()
+            // InternalFormalML.g:17081:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getFormalParameterSetAccess().getParameterSetAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:17090:3: ( (lv_parameter_1_0= ruleFormalParameter ) )
+            // InternalFormalML.g:17091:4: (lv_parameter_1_0= ruleFormalParameter )
+            {
+            // InternalFormalML.g:17091:4: (lv_parameter_1_0= ruleFormalParameter )
+            // InternalFormalML.g:17092:5: lv_parameter_1_0= ruleFormalParameter
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_8);
+            lv_parameter_1_0=ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getFormalParameterSetRule());
+              					}
+              					add(
+              						current,
+              						"parameter",
+              						lv_parameter_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17109:3: (otherlv_2= ',' ( (lv_parameter_3_0= ruleFormalParameter ) ) )*
+            loop390:
+            do {
+                int alt390=2;
+                int LA390_0 = input.LA(1);
+
+                if ( (LA390_0==20) ) {
+                    alt390=1;
+                }
+
+
+                switch (alt390) {
+            	case 1 :
+            	    // InternalFormalML.g:17110:4: otherlv_2= ',' ( (lv_parameter_3_0= ruleFormalParameter ) )
+            	    {
+            	    otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_2, grammarAccess.getFormalParameterSetAccess().getCommaKeyword_2_0());
+            	      			
+            	    }
+            	    // InternalFormalML.g:17114:4: ( (lv_parameter_3_0= ruleFormalParameter ) )
+            	    // InternalFormalML.g:17115:5: (lv_parameter_3_0= ruleFormalParameter )
+            	    {
+            	    // InternalFormalML.g:17115:5: (lv_parameter_3_0= ruleFormalParameter )
+            	    // InternalFormalML.g:17116:6: lv_parameter_3_0= ruleFormalParameter
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getFormalParameterSetAccess().getParameterFormalParameterParserRuleCall_2_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_8);
+            	    lv_parameter_3_0=ruleFormalParameter();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getFormalParameterSetRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"parameter",
+            	      							lv_parameter_3_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop390;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleFormalParameterSet"
+
+
+    // $ANTLR start "entryRuleFormalParameter"
+    // InternalFormalML.g:17138:1: entryRuleFormalParameter returns [EObject current=null] : iv_ruleFormalParameter= ruleFormalParameter EOF ;
+    public final EObject entryRuleFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleFormalParameter = null;
+
+
+        try {
+            // InternalFormalML.g:17138:56: (iv_ruleFormalParameter= ruleFormalParameter EOF )
+            // InternalFormalML.g:17139:2: iv_ruleFormalParameter= ruleFormalParameter EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getFormalParameterRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleFormalParameter=ruleFormalParameter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleFormalParameter; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleFormalParameter"
+
+
+    // $ANTLR start "ruleFormalParameter"
+    // InternalFormalML.g:17145:1: ruleFormalParameter returns [EObject current=null] : ( () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? ) ;
+    public final EObject ruleFormalParameter() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Enumerator lv_direction_1_0 = null;
+
+        EObject lv_type_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        EObject lv_defaultValue_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:17151:2: ( ( () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? ) )
+            // InternalFormalML.g:17152:2: ( () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? )
+            {
+            // InternalFormalML.g:17152:2: ( () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? )
+            // InternalFormalML.g:17153:3: () ( (lv_direction_1_0= ruleParameterDirectionKind ) )? ( (lv_type_2_0= ruleDataType ) ) ( (lv_name_3_0= ruleESIdentifier ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )?
+            {
+            // InternalFormalML.g:17153:3: ()
+            // InternalFormalML.g:17154:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getFormalParameterAccess().getParameterAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:17163:3: ( (lv_direction_1_0= ruleParameterDirectionKind ) )?
+            int alt391=2;
+            int LA391_0 = input.LA(1);
+
+            if ( (LA391_0==62||LA391_0==64||(LA391_0>=269 && LA391_0<=270)) ) {
+                alt391=1;
+            }
+            switch (alt391) {
+                case 1 :
+                    // InternalFormalML.g:17164:4: (lv_direction_1_0= ruleParameterDirectionKind )
+                    {
+                    // InternalFormalML.g:17164:4: (lv_direction_1_0= ruleParameterDirectionKind )
+                    // InternalFormalML.g:17165:5: lv_direction_1_0= ruleParameterDirectionKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getFormalParameterAccess().getDirectionParameterDirectionKindEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_46);
+                    lv_direction_1_0=ruleParameterDirectionKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getFormalParameterRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ParameterDirectionKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:17182:3: ( (lv_type_2_0= ruleDataType ) )
+            // InternalFormalML.g:17183:4: (lv_type_2_0= ruleDataType )
+            {
+            // InternalFormalML.g:17183:4: (lv_type_2_0= ruleDataType )
+            // InternalFormalML.g:17184:5: lv_type_2_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getFormalParameterAccess().getTypeDataTypeParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_171);
+            lv_type_2_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getFormalParameterRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17201:3: ( (lv_name_3_0= ruleESIdentifier ) )?
+            int alt392=2;
+            int LA392_0 = input.LA(1);
+
+            if ( (LA392_0==RULE_XLIA_ID) ) {
+                alt392=1;
+            }
+            switch (alt392) {
+                case 1 :
+                    // InternalFormalML.g:17202:4: (lv_name_3_0= ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:17202:4: (lv_name_3_0= ruleESIdentifier )
+                    // InternalFormalML.g:17203:5: lv_name_3_0= ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getFormalParameterAccess().getNameESIdentifierParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_152);
+                    lv_name_3_0=ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getFormalParameterRule());
+                      					}
+                      					set(
+                      						current,
+                      						"name",
+                      						lv_name_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:17220:3: (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )?
+            int alt393=2;
+            int LA393_0 = input.LA(1);
+
+            if ( (LA393_0==24) ) {
+                alt393=1;
+            }
+            switch (alt393) {
+                case 1 :
+                    // InternalFormalML.g:17221:4: otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) )
+                    {
+                    otherlv_4=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getFormalParameterAccess().getEqualsSignKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:17225:4: ( (lv_defaultValue_5_0= ruleExpression ) )
+                    // InternalFormalML.g:17226:5: (lv_defaultValue_5_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:17226:5: (lv_defaultValue_5_0= ruleExpression )
+                    // InternalFormalML.g:17227:6: lv_defaultValue_5_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getFormalParameterAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_defaultValue_5_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getFormalParameterRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleFormalParameter"
+
+
+    // $ANTLR start "entryRuleParameterInput"
+    // InternalFormalML.g:17249:1: entryRuleParameterInput returns [EObject current=null] : iv_ruleParameterInput= ruleParameterInput EOF ;
+    public final EObject entryRuleParameterInput() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleParameterInput = null;
+
+
+        try {
+            // InternalFormalML.g:17249:55: (iv_ruleParameterInput= ruleParameterInput EOF )
+            // InternalFormalML.g:17250:2: iv_ruleParameterInput= ruleParameterInput EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getParameterInputRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleParameterInput=ruleParameterInput();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleParameterInput; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleParameterInput"
+
+
+    // $ANTLR start "ruleParameterInput"
+    // InternalFormalML.g:17256:1: ruleParameterInput returns [EObject current=null] : ( ( (lv_direction_0_0= ruleParameterInputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' ) ;
+    public final EObject ruleParameterInput() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Enumerator lv_direction_0_0 = null;
+
+        EObject lv_type_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_defaultValue_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:17262:2: ( ( ( (lv_direction_0_0= ruleParameterInputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' ) )
+            // InternalFormalML.g:17263:2: ( ( (lv_direction_0_0= ruleParameterInputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' )
+            {
+            // InternalFormalML.g:17263:2: ( ( (lv_direction_0_0= ruleParameterInputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' )
+            // InternalFormalML.g:17264:3: ( (lv_direction_0_0= ruleParameterInputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';'
+            {
+            // InternalFormalML.g:17264:3: ( (lv_direction_0_0= ruleParameterInputDirectionKind ) )
+            // InternalFormalML.g:17265:4: (lv_direction_0_0= ruleParameterInputDirectionKind )
+            {
+            // InternalFormalML.g:17265:4: (lv_direction_0_0= ruleParameterInputDirectionKind )
+            // InternalFormalML.g:17266:5: lv_direction_0_0= ruleParameterInputDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterInputAccess().getDirectionParameterInputDirectionKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_46);
+            lv_direction_0_0=ruleParameterInputDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterInputRule());
+              					}
+              					set(
+              						current,
+              						"direction",
+              						lv_direction_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ParameterInputDirectionKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17283:3: ( (lv_type_1_0= ruleDataType ) )
+            // InternalFormalML.g:17284:4: (lv_type_1_0= ruleDataType )
+            {
+            // InternalFormalML.g:17284:4: (lv_type_1_0= ruleDataType )
+            // InternalFormalML.g:17285:5: lv_type_1_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterInputAccess().getTypeDataTypeParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_1_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterInputRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17302:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:17303:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:17303:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:17304:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterInputAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_172);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterInputRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17321:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt394=2;
+            int LA394_0 = input.LA(1);
+
+            if ( (LA394_0==RULE_STRING) ) {
+                alt394=1;
+            }
+            switch (alt394) {
+                case 1 :
+                    // InternalFormalML.g:17322:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:17322:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:17323:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getParameterInputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_173);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getParameterInputRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:17340:3: (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )?
+            int alt395=2;
+            int LA395_0 = input.LA(1);
+
+            if ( (LA395_0==24) ) {
+                alt395=1;
+            }
+            switch (alt395) {
+                case 1 :
+                    // InternalFormalML.g:17341:4: otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) )
+                    {
+                    otherlv_4=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getParameterInputAccess().getEqualsSignKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:17345:4: ( (lv_defaultValue_5_0= ruleExpression ) )
+                    // InternalFormalML.g:17346:5: (lv_defaultValue_5_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:17346:5: (lv_defaultValue_5_0= ruleExpression )
+                    // InternalFormalML.g:17347:6: lv_defaultValue_5_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getParameterInputAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_defaultValue_5_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getParameterInputRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getParameterInputAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleParameterInput"
+
+
+    // $ANTLR start "entryRuleParameterInout"
+    // InternalFormalML.g:17373:1: entryRuleParameterInout returns [EObject current=null] : iv_ruleParameterInout= ruleParameterInout EOF ;
+    public final EObject entryRuleParameterInout() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleParameterInout = null;
+
+
+        try {
+            // InternalFormalML.g:17373:55: (iv_ruleParameterInout= ruleParameterInout EOF )
+            // InternalFormalML.g:17374:2: iv_ruleParameterInout= ruleParameterInout EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getParameterInoutRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleParameterInout=ruleParameterInout();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleParameterInout; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleParameterInout"
+
+
+    // $ANTLR start "ruleParameterInout"
+    // InternalFormalML.g:17380:1: ruleParameterInout returns [EObject current=null] : ( ( (lv_direction_0_0= ruleParameterInoutDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' ) ;
+    public final EObject ruleParameterInout() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Enumerator lv_direction_0_0 = null;
+
+        EObject lv_type_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_defaultValue_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:17386:2: ( ( ( (lv_direction_0_0= ruleParameterInoutDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' ) )
+            // InternalFormalML.g:17387:2: ( ( (lv_direction_0_0= ruleParameterInoutDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' )
+            {
+            // InternalFormalML.g:17387:2: ( ( (lv_direction_0_0= ruleParameterInoutDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' )
+            // InternalFormalML.g:17388:3: ( (lv_direction_0_0= ruleParameterInoutDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';'
+            {
+            // InternalFormalML.g:17388:3: ( (lv_direction_0_0= ruleParameterInoutDirectionKind ) )
+            // InternalFormalML.g:17389:4: (lv_direction_0_0= ruleParameterInoutDirectionKind )
+            {
+            // InternalFormalML.g:17389:4: (lv_direction_0_0= ruleParameterInoutDirectionKind )
+            // InternalFormalML.g:17390:5: lv_direction_0_0= ruleParameterInoutDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterInoutAccess().getDirectionParameterInoutDirectionKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_46);
+            lv_direction_0_0=ruleParameterInoutDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+              					}
+              					set(
+              						current,
+              						"direction",
+              						lv_direction_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ParameterInoutDirectionKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17407:3: ( (lv_type_1_0= ruleDataType ) )
+            // InternalFormalML.g:17408:4: (lv_type_1_0= ruleDataType )
+            {
+            // InternalFormalML.g:17408:4: (lv_type_1_0= ruleDataType )
+            // InternalFormalML.g:17409:5: lv_type_1_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterInoutAccess().getTypeDataTypeParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_1_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17426:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:17427:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:17427:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:17428:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterInoutAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_172);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17445:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt396=2;
+            int LA396_0 = input.LA(1);
+
+            if ( (LA396_0==RULE_STRING) ) {
+                alt396=1;
+            }
+            switch (alt396) {
+                case 1 :
+                    // InternalFormalML.g:17446:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:17446:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:17447:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getParameterInoutAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_173);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:17464:3: (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )?
+            int alt397=2;
+            int LA397_0 = input.LA(1);
+
+            if ( (LA397_0==24) ) {
+                alt397=1;
+            }
+            switch (alt397) {
+                case 1 :
+                    // InternalFormalML.g:17465:4: otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) )
+                    {
+                    otherlv_4=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getParameterInoutAccess().getEqualsSignKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:17469:4: ( (lv_defaultValue_5_0= ruleExpression ) )
+                    // InternalFormalML.g:17470:5: (lv_defaultValue_5_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:17470:5: (lv_defaultValue_5_0= ruleExpression )
+                    // InternalFormalML.g:17471:6: lv_defaultValue_5_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getParameterInoutAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_defaultValue_5_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getParameterInoutRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getParameterInoutAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleParameterInout"
+
+
+    // $ANTLR start "entryRuleParameterOutput"
+    // InternalFormalML.g:17497:1: entryRuleParameterOutput returns [EObject current=null] : iv_ruleParameterOutput= ruleParameterOutput EOF ;
+    public final EObject entryRuleParameterOutput() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleParameterOutput = null;
+
+
+        try {
+            // InternalFormalML.g:17497:56: (iv_ruleParameterOutput= ruleParameterOutput EOF )
+            // InternalFormalML.g:17498:2: iv_ruleParameterOutput= ruleParameterOutput EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getParameterOutputRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleParameterOutput=ruleParameterOutput();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleParameterOutput; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleParameterOutput"
+
+
+    // $ANTLR start "ruleParameterOutput"
+    // InternalFormalML.g:17504:1: ruleParameterOutput returns [EObject current=null] : ( ( (lv_direction_0_0= ruleParameterOutputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' ) ;
+    public final EObject ruleParameterOutput() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Enumerator lv_direction_0_0 = null;
+
+        EObject lv_type_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_defaultValue_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:17510:2: ( ( ( (lv_direction_0_0= ruleParameterOutputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' ) )
+            // InternalFormalML.g:17511:2: ( ( (lv_direction_0_0= ruleParameterOutputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' )
+            {
+            // InternalFormalML.g:17511:2: ( ( (lv_direction_0_0= ruleParameterOutputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' )
+            // InternalFormalML.g:17512:3: ( (lv_direction_0_0= ruleParameterOutputDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';'
+            {
+            // InternalFormalML.g:17512:3: ( (lv_direction_0_0= ruleParameterOutputDirectionKind ) )
+            // InternalFormalML.g:17513:4: (lv_direction_0_0= ruleParameterOutputDirectionKind )
+            {
+            // InternalFormalML.g:17513:4: (lv_direction_0_0= ruleParameterOutputDirectionKind )
+            // InternalFormalML.g:17514:5: lv_direction_0_0= ruleParameterOutputDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterOutputAccess().getDirectionParameterOutputDirectionKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_46);
+            lv_direction_0_0=ruleParameterOutputDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+              					}
+              					set(
+              						current,
+              						"direction",
+              						lv_direction_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ParameterOutputDirectionKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17531:3: ( (lv_type_1_0= ruleDataType ) )
+            // InternalFormalML.g:17532:4: (lv_type_1_0= ruleDataType )
+            {
+            // InternalFormalML.g:17532:4: (lv_type_1_0= ruleDataType )
+            // InternalFormalML.g:17533:5: lv_type_1_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterOutputAccess().getTypeDataTypeParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_1_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17550:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:17551:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:17551:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:17552:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterOutputAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_172);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17569:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt398=2;
+            int LA398_0 = input.LA(1);
+
+            if ( (LA398_0==RULE_STRING) ) {
+                alt398=1;
+            }
+            switch (alt398) {
+                case 1 :
+                    // InternalFormalML.g:17570:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:17570:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:17571:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getParameterOutputAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_173);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:17588:3: (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )?
+            int alt399=2;
+            int LA399_0 = input.LA(1);
+
+            if ( (LA399_0==24) ) {
+                alt399=1;
+            }
+            switch (alt399) {
+                case 1 :
+                    // InternalFormalML.g:17589:4: otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) )
+                    {
+                    otherlv_4=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getParameterOutputAccess().getEqualsSignKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:17593:4: ( (lv_defaultValue_5_0= ruleExpression ) )
+                    // InternalFormalML.g:17594:5: (lv_defaultValue_5_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:17594:5: (lv_defaultValue_5_0= ruleExpression )
+                    // InternalFormalML.g:17595:6: lv_defaultValue_5_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getParameterOutputAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_defaultValue_5_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getParameterOutputRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getParameterOutputAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleParameterOutput"
+
+
+    // $ANTLR start "entryRuleParameterReturn"
+    // InternalFormalML.g:17621:1: entryRuleParameterReturn returns [EObject current=null] : iv_ruleParameterReturn= ruleParameterReturn EOF ;
+    public final EObject entryRuleParameterReturn() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleParameterReturn = null;
+
+
+        try {
+            // InternalFormalML.g:17621:56: (iv_ruleParameterReturn= ruleParameterReturn EOF )
+            // InternalFormalML.g:17622:2: iv_ruleParameterReturn= ruleParameterReturn EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getParameterReturnRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleParameterReturn=ruleParameterReturn();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleParameterReturn; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleParameterReturn"
+
+
+    // $ANTLR start "ruleParameterReturn"
+    // InternalFormalML.g:17628:1: ruleParameterReturn returns [EObject current=null] : ( ( (lv_direction_0_0= ruleParameterReturnDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' ) ;
+    public final EObject ruleParameterReturn() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Enumerator lv_direction_0_0 = null;
+
+        EObject lv_type_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_defaultValue_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:17634:2: ( ( ( (lv_direction_0_0= ruleParameterReturnDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' ) )
+            // InternalFormalML.g:17635:2: ( ( (lv_direction_0_0= ruleParameterReturnDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' )
+            {
+            // InternalFormalML.g:17635:2: ( ( (lv_direction_0_0= ruleParameterReturnDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';' )
+            // InternalFormalML.g:17636:3: ( (lv_direction_0_0= ruleParameterReturnDirectionKind ) ) ( (lv_type_1_0= ruleDataType ) ) ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )? otherlv_6= ';'
+            {
+            // InternalFormalML.g:17636:3: ( (lv_direction_0_0= ruleParameterReturnDirectionKind ) )
+            // InternalFormalML.g:17637:4: (lv_direction_0_0= ruleParameterReturnDirectionKind )
+            {
+            // InternalFormalML.g:17637:4: (lv_direction_0_0= ruleParameterReturnDirectionKind )
+            // InternalFormalML.g:17638:5: lv_direction_0_0= ruleParameterReturnDirectionKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterReturnAccess().getDirectionParameterReturnDirectionKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_46);
+            lv_direction_0_0=ruleParameterReturnDirectionKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+              					}
+              					set(
+              						current,
+              						"direction",
+              						lv_direction_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ParameterReturnDirectionKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17655:3: ( (lv_type_1_0= ruleDataType ) )
+            // InternalFormalML.g:17656:4: (lv_type_1_0= ruleDataType )
+            {
+            // InternalFormalML.g:17656:4: (lv_type_1_0= ruleDataType )
+            // InternalFormalML.g:17657:5: lv_type_1_0= ruleDataType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterReturnAccess().getTypeDataTypeParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_1_0=ruleDataType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17674:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:17675:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:17675:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:17676:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getParameterReturnAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_172);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17693:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt400=2;
+            int LA400_0 = input.LA(1);
+
+            if ( (LA400_0==RULE_STRING) ) {
+                alt400=1;
+            }
+            switch (alt400) {
+                case 1 :
+                    // InternalFormalML.g:17694:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:17694:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:17695:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getParameterReturnAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_173);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:17712:3: (otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) ) )?
+            int alt401=2;
+            int LA401_0 = input.LA(1);
+
+            if ( (LA401_0==24) ) {
+                alt401=1;
+            }
+            switch (alt401) {
+                case 1 :
+                    // InternalFormalML.g:17713:4: otherlv_4= '=' ( (lv_defaultValue_5_0= ruleExpression ) )
+                    {
+                    otherlv_4=(Token)match(input,24,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getParameterReturnAccess().getEqualsSignKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:17717:4: ( (lv_defaultValue_5_0= ruleExpression ) )
+                    // InternalFormalML.g:17718:5: (lv_defaultValue_5_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:17718:5: (lv_defaultValue_5_0= ruleExpression )
+                    // InternalFormalML.g:17719:6: lv_defaultValue_5_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getParameterReturnAccess().getDefaultValueExpressionParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_defaultValue_5_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getParameterReturnRule());
+                      						}
+                      						set(
+                      							current,
+                      							"defaultValue",
+                      							lv_defaultValue_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_6=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getParameterReturnAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleParameterReturn"
+
+
+    // $ANTLR start "entryRuleBufferContainerType"
+    // InternalFormalML.g:17745:1: entryRuleBufferContainerType returns [EObject current=null] : iv_ruleBufferContainerType= ruleBufferContainerType EOF ;
+    public final EObject entryRuleBufferContainerType() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBufferContainerType = null;
+
+
+        try {
+            // InternalFormalML.g:17745:60: (iv_ruleBufferContainerType= ruleBufferContainerType EOF )
+            // InternalFormalML.g:17746:2: iv_ruleBufferContainerType= ruleBufferContainerType EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBufferContainerTypeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBufferContainerType=ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBufferContainerType; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBufferContainerType"
+
+
+    // $ANTLR start "ruleBufferContainerType"
+    // InternalFormalML.g:17752:1: ruleBufferContainerType returns [EObject current=null] : ( () ( (lv_container_1_0= ruleBufferContainerKind ) ) (otherlv_2= '<' ( ( (lv_size_3_0= ruleEInt ) ) | ( (lv_unbounded_4_0= '*' ) ) )? otherlv_5= '>' )? ) ;
+    public final EObject ruleBufferContainerType() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token lv_unbounded_4_0=null;
+        Token otherlv_5=null;
+        Enumerator lv_container_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_size_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:17758:2: ( ( () ( (lv_container_1_0= ruleBufferContainerKind ) ) (otherlv_2= '<' ( ( (lv_size_3_0= ruleEInt ) ) | ( (lv_unbounded_4_0= '*' ) ) )? otherlv_5= '>' )? ) )
+            // InternalFormalML.g:17759:2: ( () ( (lv_container_1_0= ruleBufferContainerKind ) ) (otherlv_2= '<' ( ( (lv_size_3_0= ruleEInt ) ) | ( (lv_unbounded_4_0= '*' ) ) )? otherlv_5= '>' )? )
+            {
+            // InternalFormalML.g:17759:2: ( () ( (lv_container_1_0= ruleBufferContainerKind ) ) (otherlv_2= '<' ( ( (lv_size_3_0= ruleEInt ) ) | ( (lv_unbounded_4_0= '*' ) ) )? otherlv_5= '>' )? )
+            // InternalFormalML.g:17760:3: () ( (lv_container_1_0= ruleBufferContainerKind ) ) (otherlv_2= '<' ( ( (lv_size_3_0= ruleEInt ) ) | ( (lv_unbounded_4_0= '*' ) ) )? otherlv_5= '>' )?
+            {
+            // InternalFormalML.g:17760:3: ()
+            // InternalFormalML.g:17761:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getBufferContainerTypeAccess().getCollectionTypeAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:17770:3: ( (lv_container_1_0= ruleBufferContainerKind ) )
+            // InternalFormalML.g:17771:4: (lv_container_1_0= ruleBufferContainerKind )
+            {
+            // InternalFormalML.g:17771:4: (lv_container_1_0= ruleBufferContainerKind )
+            // InternalFormalML.g:17772:5: lv_container_1_0= ruleBufferContainerKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferContainerTypeAccess().getContainerBufferContainerKindEnumRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_118);
+            lv_container_1_0=ruleBufferContainerKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferContainerTypeRule());
+              					}
+              					set(
+              						current,
+              						"container",
+              						lv_container_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17789:3: (otherlv_2= '<' ( ( (lv_size_3_0= ruleEInt ) ) | ( (lv_unbounded_4_0= '*' ) ) )? otherlv_5= '>' )?
+            int alt403=2;
+            int LA403_0 = input.LA(1);
+
+            if ( (LA403_0==16) ) {
+                alt403=1;
+            }
+            switch (alt403) {
+                case 1 :
+                    // InternalFormalML.g:17790:4: otherlv_2= '<' ( ( (lv_size_3_0= ruleEInt ) ) | ( (lv_unbounded_4_0= '*' ) ) )? otherlv_5= '>'
+                    {
+                    otherlv_2=(Token)match(input,16,FollowSets000.FOLLOW_174); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getBufferContainerTypeAccess().getLessThanSignKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:17794:4: ( ( (lv_size_3_0= ruleEInt ) ) | ( (lv_unbounded_4_0= '*' ) ) )?
+                    int alt402=3;
+                    int LA402_0 = input.LA(1);
+
+                    if ( (LA402_0==RULE_INT||LA402_0==28) ) {
+                        alt402=1;
+                    }
+                    else if ( (LA402_0==98) ) {
+                        alt402=2;
+                    }
+                    switch (alt402) {
+                        case 1 :
+                            // InternalFormalML.g:17795:5: ( (lv_size_3_0= ruleEInt ) )
+                            {
+                            // InternalFormalML.g:17795:5: ( (lv_size_3_0= ruleEInt ) )
+                            // InternalFormalML.g:17796:6: (lv_size_3_0= ruleEInt )
+                            {
+                            // InternalFormalML.g:17796:6: (lv_size_3_0= ruleEInt )
+                            // InternalFormalML.g:17797:7: lv_size_3_0= ruleEInt
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getBufferContainerTypeAccess().getSizeEIntParserRuleCall_2_1_0_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_23);
+                            lv_size_3_0=ruleEInt();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getBufferContainerTypeRule());
+                              							}
+                              							set(
+                              								current,
+                              								"size",
+                              								lv_size_3_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:17815:5: ( (lv_unbounded_4_0= '*' ) )
+                            {
+                            // InternalFormalML.g:17815:5: ( (lv_unbounded_4_0= '*' ) )
+                            // InternalFormalML.g:17816:6: (lv_unbounded_4_0= '*' )
+                            {
+                            // InternalFormalML.g:17816:6: (lv_unbounded_4_0= '*' )
+                            // InternalFormalML.g:17817:7: lv_unbounded_4_0= '*'
+                            {
+                            lv_unbounded_4_0=(Token)match(input,98,FollowSets000.FOLLOW_23); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_unbounded_4_0, grammarAccess.getBufferContainerTypeAccess().getUnboundedAsteriskKeyword_2_1_1_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getBufferContainerTypeRule());
+                              							}
+                              							setWithLastConsumed(current, "unbounded", true, "*");
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_5=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getBufferContainerTypeAccess().getGreaterThanSignKeyword_2_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBufferContainerType"
+
+
+    // $ANTLR start "entryRuleBuffer"
+    // InternalFormalML.g:17839:1: entryRuleBuffer returns [EObject current=null] : iv_ruleBuffer= ruleBuffer EOF ;
+    public final EObject entryRuleBuffer() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBuffer = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getBufferAccess().getUnorderedGroup_0()
+        	);
+
+        try {
+            // InternalFormalML.g:17843:2: (iv_ruleBuffer= ruleBuffer EOF )
+            // InternalFormalML.g:17844:2: iv_ruleBuffer= ruleBuffer EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBufferRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBuffer=ruleBuffer();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBuffer; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBuffer"
+
+
+    // $ANTLR start "ruleBuffer"
+    // InternalFormalML.g:17853:1: ruleBuffer returns [EObject current=null] : ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) otherlv_3= 'buffer' ( (lv_type_4_0= ruleBufferContainerType ) ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= ';' ) ;
+    public final EObject ruleBuffer() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_3=null;
+        Token otherlv_7=null;
+        Enumerator lv_visibility_1_0 = null;
+
+        EObject lv_modifier_2_0 = null;
+
+        EObject lv_type_4_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_6_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getBufferAccess().getUnorderedGroup_0()
+        	);
+
+        try {
+            // InternalFormalML.g:17862:2: ( ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) otherlv_3= 'buffer' ( (lv_type_4_0= ruleBufferContainerType ) ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= ';' ) )
+            // InternalFormalML.g:17863:2: ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) otherlv_3= 'buffer' ( (lv_type_4_0= ruleBufferContainerType ) ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= ';' )
+            {
+            // InternalFormalML.g:17863:2: ( ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) otherlv_3= 'buffer' ( (lv_type_4_0= ruleBufferContainerType ) ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= ';' )
+            // InternalFormalML.g:17864:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) ) otherlv_3= 'buffer' ( (lv_type_4_0= ruleBufferContainerType ) ) ( (lv_name_5_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )? otherlv_7= ';'
+            {
+            // InternalFormalML.g:17864:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:17865:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:17865:4: ( ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* ) )
+            // InternalFormalML.g:17866:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+            // InternalFormalML.g:17869:5: ( ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )* )
+            // InternalFormalML.g:17870:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:17870:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )*
+            loop404:
+            do {
+                int alt404=3;
+                alt404 = dfa404.predict(input);
+                switch (alt404) {
+            	case 1 :
+            	    // InternalFormalML.g:17871:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:17871:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+            	    // InternalFormalML.g:17872:5: {...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleBuffer", "getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0)");
+            	    }
+            	    // InternalFormalML.g:17872:103: ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+            	    // InternalFormalML.g:17873:6: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0);
+            	    // InternalFormalML.g:17876:9: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+            	    // InternalFormalML.g:17876:10: {...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleBuffer", "true");
+            	    }
+            	    // InternalFormalML.g:17876:19: ( (lv_visibility_1_0= ruleVisibilityKind ) )
+            	    // InternalFormalML.g:17876:20: (lv_visibility_1_0= ruleVisibilityKind )
+            	    {
+            	    // InternalFormalML.g:17876:20: (lv_visibility_1_0= ruleVisibilityKind )
+            	    // InternalFormalML.g:17877:10: lv_visibility_1_0= ruleVisibilityKind
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getBufferAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_175);
+            	    lv_visibility_1_0=ruleVisibilityKind();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getBufferRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"visibility",
+            	      											lv_visibility_1_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:17899:4: ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:17899:4: ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) )
+            	    // InternalFormalML.g:17900:5: {...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleBuffer", "getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1)");
+            	    }
+            	    // InternalFormalML.g:17900:103: ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) )
+            	    // InternalFormalML.g:17901:6: ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1);
+            	    // InternalFormalML.g:17904:9: ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) )
+            	    // InternalFormalML.g:17904:10: {...}? => ( (lv_modifier_2_0= ruleModifier ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleBuffer", "true");
+            	    }
+            	    // InternalFormalML.g:17904:19: ( (lv_modifier_2_0= ruleModifier ) )
+            	    // InternalFormalML.g:17904:20: (lv_modifier_2_0= ruleModifier )
+            	    {
+            	    // InternalFormalML.g:17904:20: (lv_modifier_2_0= ruleModifier )
+            	    // InternalFormalML.g:17905:10: lv_modifier_2_0= ruleModifier
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      										newCompositeNode(grammarAccess.getBufferAccess().getModifierModifierParserRuleCall_0_1_0());
+            	      									
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_175);
+            	    lv_modifier_2_0=ruleModifier();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      										if (current==null) {
+            	      											current = createModelElementForParent(grammarAccess.getBufferRule());
+            	      										}
+            	      										set(
+            	      											current,
+            	      											"modifier",
+            	      											lv_modifier_2_0,
+            	      											"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+            	      										afterParserOrEnumRuleCall();
+            	      									
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop404;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getBufferAccess().getUnorderedGroup_0());
+
+            }
+
+            otherlv_3=(Token)match(input,136,FollowSets000.FOLLOW_176); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getBufferAccess().getBufferKeyword_1());
+              		
+            }
+            // InternalFormalML.g:17938:3: ( (lv_type_4_0= ruleBufferContainerType ) )
+            // InternalFormalML.g:17939:4: (lv_type_4_0= ruleBufferContainerType )
+            {
+            // InternalFormalML.g:17939:4: (lv_type_4_0= ruleBufferContainerType )
+            // InternalFormalML.g:17940:5: lv_type_4_0= ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferAccess().getTypeBufferContainerTypeParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_4_0=ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_4_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17957:3: ( (lv_name_5_0= ruleESIdentifier ) )
+            // InternalFormalML.g:17958:4: (lv_name_5_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:17958:4: (lv_name_5_0= ruleESIdentifier )
+            // InternalFormalML.g:17959:5: lv_name_5_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_177);
+            lv_name_5_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:17976:3: ( (lv_unrestrictedName_6_0= ruleUnrestrictedName ) )?
+            int alt405=2;
+            int LA405_0 = input.LA(1);
+
+            if ( (LA405_0==RULE_STRING) ) {
+                alt405=1;
+            }
+            switch (alt405) {
+                case 1 :
+                    // InternalFormalML.g:17977:4: (lv_unrestrictedName_6_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:17977:4: (lv_unrestrictedName_6_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:17978:5: lv_unrestrictedName_6_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getBufferAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_unrestrictedName_6_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getBufferRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_6_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_7=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_7, grammarAccess.getBufferAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBuffer"
+
+
+    // $ANTLR start "entryRuleBufferPublic"
+    // InternalFormalML.g:18006:1: entryRuleBufferPublic returns [EObject current=null] : iv_ruleBufferPublic= ruleBufferPublic EOF ;
+    public final EObject entryRuleBufferPublic() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBufferPublic = null;
+
+
+        try {
+            // InternalFormalML.g:18006:53: (iv_ruleBufferPublic= ruleBufferPublic EOF )
+            // InternalFormalML.g:18007:2: iv_ruleBufferPublic= ruleBufferPublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBufferPublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBufferPublic=ruleBufferPublic();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBufferPublic; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBufferPublic"
+
+
+    // $ANTLR start "ruleBufferPublic"
+    // InternalFormalML.g:18013:1: ruleBufferPublic returns [EObject current=null] : ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePublicBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' ) ;
+    public final EObject ruleBufferPublic() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_5=null;
+        EObject lv_modifier_0_0 = null;
+
+        Enumerator lv_visibility_1_0 = null;
+
+        EObject lv_type_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:18019:2: ( ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePublicBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' ) )
+            // InternalFormalML.g:18020:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePublicBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' )
+            {
+            // InternalFormalML.g:18020:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePublicBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' )
+            // InternalFormalML.g:18021:3: ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePublicBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';'
+            {
+            // InternalFormalML.g:18021:3: ( (lv_modifier_0_0= ruleModifier ) )?
+            int alt406=2;
+            int LA406_0 = input.LA(1);
+
+            if ( (LA406_0==87||(LA406_0>=128 && LA406_0<=131)) ) {
+                alt406=1;
+            }
+            else if ( (LA406_0==136) ) {
+                int LA406_2 = input.LA(2);
+
+                if ( (synpred652_InternalFormalML()) ) {
+                    alt406=1;
+                }
+            }
+            switch (alt406) {
+                case 1 :
+                    // InternalFormalML.g:18022:4: (lv_modifier_0_0= ruleModifier )
+                    {
+                    // InternalFormalML.g:18022:4: (lv_modifier_0_0= ruleModifier )
+                    // InternalFormalML.g:18023:5: lv_modifier_0_0= ruleModifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getBufferPublicAccess().getModifierModifierParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_178);
+                    lv_modifier_0_0=ruleModifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+                      					}
+                      					set(
+                      						current,
+                      						"modifier",
+                      						lv_modifier_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18040:3: ( (lv_visibility_1_0= rulePublicBufferVisibilityKind ) )
+            // InternalFormalML.g:18041:4: (lv_visibility_1_0= rulePublicBufferVisibilityKind )
+            {
+            // InternalFormalML.g:18041:4: (lv_visibility_1_0= rulePublicBufferVisibilityKind )
+            // InternalFormalML.g:18042:5: lv_visibility_1_0= rulePublicBufferVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferPublicAccess().getVisibilityPublicBufferVisibilityKindEnumRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_176);
+            lv_visibility_1_0=rulePublicBufferVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PublicBufferVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18059:3: ( (lv_type_2_0= ruleBufferContainerType ) )
+            // InternalFormalML.g:18060:4: (lv_type_2_0= ruleBufferContainerType )
+            {
+            // InternalFormalML.g:18060:4: (lv_type_2_0= ruleBufferContainerType )
+            // InternalFormalML.g:18061:5: lv_type_2_0= ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferPublicAccess().getTypeBufferContainerTypeParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_2_0=ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18078:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:18079:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:18079:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:18080:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferPublicAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_177);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18097:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt407=2;
+            int LA407_0 = input.LA(1);
+
+            if ( (LA407_0==RULE_STRING) ) {
+                alt407=1;
+            }
+            switch (alt407) {
+                case 1 :
+                    // InternalFormalML.g:18098:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:18098:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:18099:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getBufferPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getBufferPublicRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getBufferPublicAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBufferPublic"
+
+
+    // $ANTLR start "entryRuleBufferProtected"
+    // InternalFormalML.g:18124:1: entryRuleBufferProtected returns [EObject current=null] : iv_ruleBufferProtected= ruleBufferProtected EOF ;
+    public final EObject entryRuleBufferProtected() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBufferProtected = null;
+
+
+        try {
+            // InternalFormalML.g:18124:56: (iv_ruleBufferProtected= ruleBufferProtected EOF )
+            // InternalFormalML.g:18125:2: iv_ruleBufferProtected= ruleBufferProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBufferProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBufferProtected=ruleBufferProtected();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBufferProtected; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBufferProtected"
+
+
+    // $ANTLR start "ruleBufferProtected"
+    // InternalFormalML.g:18131:1: ruleBufferProtected returns [EObject current=null] : ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= ruleProtectedBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' ) ;
+    public final EObject ruleBufferProtected() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_5=null;
+        EObject lv_modifier_0_0 = null;
+
+        Enumerator lv_visibility_1_0 = null;
+
+        EObject lv_type_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:18137:2: ( ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= ruleProtectedBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' ) )
+            // InternalFormalML.g:18138:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= ruleProtectedBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' )
+            {
+            // InternalFormalML.g:18138:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= ruleProtectedBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' )
+            // InternalFormalML.g:18139:3: ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= ruleProtectedBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';'
+            {
+            // InternalFormalML.g:18139:3: ( (lv_modifier_0_0= ruleModifier ) )?
+            int alt408=2;
+            int LA408_0 = input.LA(1);
+
+            if ( (LA408_0==87||(LA408_0>=128 && LA408_0<=131)) ) {
+                alt408=1;
+            }
+            else if ( (LA408_0==136) ) {
+                int LA408_2 = input.LA(2);
+
+                if ( (synpred654_InternalFormalML()) ) {
+                    alt408=1;
+                }
+            }
+            switch (alt408) {
+                case 1 :
+                    // InternalFormalML.g:18140:4: (lv_modifier_0_0= ruleModifier )
+                    {
+                    // InternalFormalML.g:18140:4: (lv_modifier_0_0= ruleModifier )
+                    // InternalFormalML.g:18141:5: lv_modifier_0_0= ruleModifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getBufferProtectedAccess().getModifierModifierParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_178);
+                    lv_modifier_0_0=ruleModifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+                      					}
+                      					set(
+                      						current,
+                      						"modifier",
+                      						lv_modifier_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18158:3: ( (lv_visibility_1_0= ruleProtectedBufferVisibilityKind ) )
+            // InternalFormalML.g:18159:4: (lv_visibility_1_0= ruleProtectedBufferVisibilityKind )
+            {
+            // InternalFormalML.g:18159:4: (lv_visibility_1_0= ruleProtectedBufferVisibilityKind )
+            // InternalFormalML.g:18160:5: lv_visibility_1_0= ruleProtectedBufferVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferProtectedAccess().getVisibilityProtectedBufferVisibilityKindEnumRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_176);
+            lv_visibility_1_0=ruleProtectedBufferVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedBufferVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18177:3: ( (lv_type_2_0= ruleBufferContainerType ) )
+            // InternalFormalML.g:18178:4: (lv_type_2_0= ruleBufferContainerType )
+            {
+            // InternalFormalML.g:18178:4: (lv_type_2_0= ruleBufferContainerType )
+            // InternalFormalML.g:18179:5: lv_type_2_0= ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferProtectedAccess().getTypeBufferContainerTypeParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_2_0=ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18196:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:18197:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:18197:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:18198:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferProtectedAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_177);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18215:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt409=2;
+            int LA409_0 = input.LA(1);
+
+            if ( (LA409_0==RULE_STRING) ) {
+                alt409=1;
+            }
+            switch (alt409) {
+                case 1 :
+                    // InternalFormalML.g:18216:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:18216:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:18217:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getBufferProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getBufferProtectedRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getBufferProtectedAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBufferProtected"
+
+
+    // $ANTLR start "entryRuleBufferPrivate"
+    // InternalFormalML.g:18242:1: entryRuleBufferPrivate returns [EObject current=null] : iv_ruleBufferPrivate= ruleBufferPrivate EOF ;
+    public final EObject entryRuleBufferPrivate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBufferPrivate = null;
+
+
+        try {
+            // InternalFormalML.g:18242:54: (iv_ruleBufferPrivate= ruleBufferPrivate EOF )
+            // InternalFormalML.g:18243:2: iv_ruleBufferPrivate= ruleBufferPrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBufferPrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBufferPrivate=ruleBufferPrivate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBufferPrivate; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBufferPrivate"
+
+
+    // $ANTLR start "ruleBufferPrivate"
+    // InternalFormalML.g:18249:1: ruleBufferPrivate returns [EObject current=null] : ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePrivateBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' ) ;
+    public final EObject ruleBufferPrivate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_5=null;
+        EObject lv_modifier_0_0 = null;
+
+        Enumerator lv_visibility_1_0 = null;
+
+        EObject lv_type_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:18255:2: ( ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePrivateBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' ) )
+            // InternalFormalML.g:18256:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePrivateBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' )
+            {
+            // InternalFormalML.g:18256:2: ( ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePrivateBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';' )
+            // InternalFormalML.g:18257:3: ( (lv_modifier_0_0= ruleModifier ) )? ( (lv_visibility_1_0= rulePrivateBufferVisibilityKind ) ) ( (lv_type_2_0= ruleBufferContainerType ) ) ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? otherlv_5= ';'
+            {
+            // InternalFormalML.g:18257:3: ( (lv_modifier_0_0= ruleModifier ) )?
+            int alt410=2;
+            int LA410_0 = input.LA(1);
+
+            if ( (LA410_0==87||(LA410_0>=128 && LA410_0<=131)) ) {
+                alt410=1;
+            }
+            else if ( (LA410_0==136) ) {
+                int LA410_2 = input.LA(2);
+
+                if ( (synpred656_InternalFormalML()) ) {
+                    alt410=1;
+                }
+            }
+            switch (alt410) {
+                case 1 :
+                    // InternalFormalML.g:18258:4: (lv_modifier_0_0= ruleModifier )
+                    {
+                    // InternalFormalML.g:18258:4: (lv_modifier_0_0= ruleModifier )
+                    // InternalFormalML.g:18259:5: lv_modifier_0_0= ruleModifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getBufferPrivateAccess().getModifierModifierParserRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_178);
+                    lv_modifier_0_0=ruleModifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"modifier",
+                      						lv_modifier_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18276:3: ( (lv_visibility_1_0= rulePrivateBufferVisibilityKind ) )
+            // InternalFormalML.g:18277:4: (lv_visibility_1_0= rulePrivateBufferVisibilityKind )
+            {
+            // InternalFormalML.g:18277:4: (lv_visibility_1_0= rulePrivateBufferVisibilityKind )
+            // InternalFormalML.g:18278:5: lv_visibility_1_0= rulePrivateBufferVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferPrivateAccess().getVisibilityPrivateBufferVisibilityKindEnumRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_176);
+            lv_visibility_1_0=rulePrivateBufferVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PrivateBufferVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18295:3: ( (lv_type_2_0= ruleBufferContainerType ) )
+            // InternalFormalML.g:18296:4: (lv_type_2_0= ruleBufferContainerType )
+            {
+            // InternalFormalML.g:18296:4: (lv_type_2_0= ruleBufferContainerType )
+            // InternalFormalML.g:18297:5: lv_type_2_0= ruleBufferContainerType
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferPrivateAccess().getTypeBufferContainerTypeParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_type_2_0=ruleBufferContainerType();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+              					}
+              					set(
+              						current,
+              						"type",
+              						lv_type_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18314:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:18315:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:18315:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:18316:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBufferPrivateAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_177);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18333:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt411=2;
+            int LA411_0 = input.LA(1);
+
+            if ( (LA411_0==RULE_STRING) ) {
+                alt411=1;
+            }
+            switch (alt411) {
+                case 1 :
+                    // InternalFormalML.g:18334:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:18334:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:18335:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getBufferPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getBufferPrivateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getBufferPrivateAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBufferPrivate"
+
+
+    // $ANTLR start "entryRulePort"
+    // InternalFormalML.g:18360:1: entryRulePort returns [EObject current=null] : iv_rulePort= rulePort EOF ;
+    public final EObject entryRulePort() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePort = null;
+
+
+        try {
+            // InternalFormalML.g:18360:45: (iv_rulePort= rulePort EOF )
+            // InternalFormalML.g:18361:2: iv_rulePort= rulePort EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPortRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePort=rulePort();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePort; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePort"
+
+
+    // $ANTLR start "rulePort"
+    // InternalFormalML.g:18367:1: rulePort returns [EObject current=null] : ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'port' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';' ) ;
+    public final EObject rulePort() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        Enumerator lv_direction_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        EObject lv_parameter_6_0 = null;
+
+        EObject lv_parameter_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:18373:2: ( ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'port' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';' ) )
+            // InternalFormalML.g:18374:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'port' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';' )
+            {
+            // InternalFormalML.g:18374:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'port' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';' )
+            // InternalFormalML.g:18375:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'port' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';'
+            {
+            // InternalFormalML.g:18375:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )?
+            int alt412=2;
+            int LA412_0 = input.LA(1);
+
+            if ( (LA412_0==19||(LA412_0>=240 && LA412_0<=242)) ) {
+                alt412=1;
+            }
+            switch (alt412) {
+                case 1 :
+                    // InternalFormalML.g:18376:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:18376:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    // InternalFormalML.g:18377:5: lv_visibility_0_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPortAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_179);
+                    lv_visibility_0_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPortRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_1=(Token)match(input,137,FollowSets000.FOLLOW_180); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getPortAccess().getPortKeyword_1());
+              		
+            }
+            // InternalFormalML.g:18398:3: ( (lv_direction_2_0= ruleChannelDirection ) )?
+            int alt413=2;
+            int LA413_0 = input.LA(1);
+
+            if ( ((LA413_0>=61 && LA413_0<=63)) ) {
+                alt413=1;
+            }
+            switch (alt413) {
+                case 1 :
+                    // InternalFormalML.g:18399:4: (lv_direction_2_0= ruleChannelDirection )
+                    {
+                    // InternalFormalML.g:18399:4: (lv_direction_2_0= ruleChannelDirection )
+                    // InternalFormalML.g:18400:5: lv_direction_2_0= ruleChannelDirection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPortAccess().getDirectionChannelDirectionEnumRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_direction_2_0=ruleChannelDirection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPortRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18417:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:18418:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:18418:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:18419:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getPortAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_181);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPortRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18436:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt414=2;
+            int LA414_0 = input.LA(1);
+
+            if ( (LA414_0==RULE_STRING) ) {
+                alt414=1;
+            }
+            switch (alt414) {
+                case 1 :
+                    // InternalFormalML.g:18437:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:18437:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:18438:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPortAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_182);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPortRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18455:3: (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )?
+            int alt416=2;
+            int LA416_0 = input.LA(1);
+
+            if ( (LA416_0==56) ) {
+                alt416=1;
+            }
+            switch (alt416) {
+                case 1 :
+                    // InternalFormalML.g:18456:4: otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')'
+                    {
+                    otherlv_5=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getPortAccess().getLeftParenthesisKeyword_5_0());
+                      			
+                    }
+                    // InternalFormalML.g:18460:4: ( (lv_parameter_6_0= ruleFormalParameter ) )
+                    // InternalFormalML.g:18461:5: (lv_parameter_6_0= ruleFormalParameter )
+                    {
+                    // InternalFormalML.g:18461:5: (lv_parameter_6_0= ruleFormalParameter )
+                    // InternalFormalML.g:18462:6: lv_parameter_6_0= ruleFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_parameter_6_0=ruleFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getPortRule());
+                      						}
+                      						add(
+                      							current,
+                      							"parameter",
+                      							lv_parameter_6_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:18479:4: (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )*
+                    loop415:
+                    do {
+                        int alt415=2;
+                        int LA415_0 = input.LA(1);
+
+                        if ( (LA415_0==20) ) {
+                            alt415=1;
+                        }
+
+
+                        switch (alt415) {
+                    	case 1 :
+                    	    // InternalFormalML.g:18480:5: otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) )
+                    	    {
+                    	    otherlv_7=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_7, grammarAccess.getPortAccess().getCommaKeyword_5_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:18484:5: ( (lv_parameter_8_0= ruleFormalParameter ) )
+                    	    // InternalFormalML.g:18485:6: (lv_parameter_8_0= ruleFormalParameter )
+                    	    {
+                    	    // InternalFormalML.g:18485:6: (lv_parameter_8_0= ruleFormalParameter )
+                    	    // InternalFormalML.g:18486:7: lv_parameter_8_0= ruleFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getPortAccess().getParameterFormalParameterParserRuleCall_5_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_parameter_8_0=ruleFormalParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getPortRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"parameter",
+                    	      								lv_parameter_8_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop415;
+                        }
+                    } while (true);
+
+                    otherlv_9=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getPortAccess().getRightParenthesisKeyword_5_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getPortAccess().getSemicolonKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePort"
+
+
+    // $ANTLR start "entryRulePortPublic"
+    // InternalFormalML.g:18517:1: entryRulePortPublic returns [EObject current=null] : iv_rulePortPublic= rulePortPublic EOF ;
+    public final EObject entryRulePortPublic() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePortPublic = null;
+
+
+        try {
+            // InternalFormalML.g:18517:51: (iv_rulePortPublic= rulePortPublic EOF )
+            // InternalFormalML.g:18518:2: iv_rulePortPublic= rulePortPublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPortPublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePortPublic=rulePortPublic();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePortPublic; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePortPublic"
+
+
+    // $ANTLR start "rulePortPublic"
+    // InternalFormalML.g:18524:1: rulePortPublic returns [EObject current=null] : ( ( (lv_visibility_0_0= rulePublicPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) ;
+    public final EObject rulePortPublic() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        Enumerator lv_direction_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_parameter_5_0 = null;
+
+        EObject lv_parameter_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:18530:2: ( ( ( (lv_visibility_0_0= rulePublicPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) )
+            // InternalFormalML.g:18531:2: ( ( (lv_visibility_0_0= rulePublicPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            {
+            // InternalFormalML.g:18531:2: ( ( (lv_visibility_0_0= rulePublicPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            // InternalFormalML.g:18532:3: ( (lv_visibility_0_0= rulePublicPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';'
+            {
+            // InternalFormalML.g:18532:3: ( (lv_visibility_0_0= rulePublicPortVisibilityKind ) )
+            // InternalFormalML.g:18533:4: (lv_visibility_0_0= rulePublicPortVisibilityKind )
+            {
+            // InternalFormalML.g:18533:4: (lv_visibility_0_0= rulePublicPortVisibilityKind )
+            // InternalFormalML.g:18534:5: lv_visibility_0_0= rulePublicPortVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getPortPublicAccess().getVisibilityPublicPortVisibilityKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_180);
+            lv_visibility_0_0=rulePublicPortVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPortPublicRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PublicPortVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18551:3: ( (lv_direction_1_0= ruleChannelDirection ) )?
+            int alt417=2;
+            int LA417_0 = input.LA(1);
+
+            if ( ((LA417_0>=61 && LA417_0<=63)) ) {
+                alt417=1;
+            }
+            switch (alt417) {
+                case 1 :
+                    // InternalFormalML.g:18552:4: (lv_direction_1_0= ruleChannelDirection )
+                    {
+                    // InternalFormalML.g:18552:4: (lv_direction_1_0= ruleChannelDirection )
+                    // InternalFormalML.g:18553:5: lv_direction_1_0= ruleChannelDirection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPortPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_direction_1_0=ruleChannelDirection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPortPublicRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18570:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:18571:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:18571:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:18572:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getPortPublicAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_181);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPortPublicRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18589:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt418=2;
+            int LA418_0 = input.LA(1);
+
+            if ( (LA418_0==RULE_STRING) ) {
+                alt418=1;
+            }
+            switch (alt418) {
+                case 1 :
+                    // InternalFormalML.g:18590:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:18590:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:18591:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPortPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_182);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPortPublicRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18608:3: (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )?
+            int alt420=2;
+            int LA420_0 = input.LA(1);
+
+            if ( (LA420_0==56) ) {
+                alt420=1;
+            }
+            switch (alt420) {
+                case 1 :
+                    // InternalFormalML.g:18609:4: otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')'
+                    {
+                    otherlv_4=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getPortPublicAccess().getLeftParenthesisKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:18613:4: ( (lv_parameter_5_0= ruleFormalParameter ) )
+                    // InternalFormalML.g:18614:5: (lv_parameter_5_0= ruleFormalParameter )
+                    {
+                    // InternalFormalML.g:18614:5: (lv_parameter_5_0= ruleFormalParameter )
+                    // InternalFormalML.g:18615:6: lv_parameter_5_0= ruleFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_parameter_5_0=ruleFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getPortPublicRule());
+                      						}
+                      						add(
+                      							current,
+                      							"parameter",
+                      							lv_parameter_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:18632:4: (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )*
+                    loop419:
+                    do {
+                        int alt419=2;
+                        int LA419_0 = input.LA(1);
+
+                        if ( (LA419_0==20) ) {
+                            alt419=1;
+                        }
+
+
+                        switch (alt419) {
+                    	case 1 :
+                    	    // InternalFormalML.g:18633:5: otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_6, grammarAccess.getPortPublicAccess().getCommaKeyword_4_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:18637:5: ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    // InternalFormalML.g:18638:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    {
+                    	    // InternalFormalML.g:18638:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    // InternalFormalML.g:18639:7: lv_parameter_7_0= ruleFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getPortPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_parameter_7_0=ruleFormalParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getPortPublicRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"parameter",
+                    	      								lv_parameter_7_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop419;
+                        }
+                    } while (true);
+
+                    otherlv_8=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getPortPublicAccess().getRightParenthesisKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getPortPublicAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePortPublic"
+
+
+    // $ANTLR start "entryRulePortProtected"
+    // InternalFormalML.g:18670:1: entryRulePortProtected returns [EObject current=null] : iv_rulePortProtected= rulePortProtected EOF ;
+    public final EObject entryRulePortProtected() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePortProtected = null;
+
+
+        try {
+            // InternalFormalML.g:18670:54: (iv_rulePortProtected= rulePortProtected EOF )
+            // InternalFormalML.g:18671:2: iv_rulePortProtected= rulePortProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPortProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePortProtected=rulePortProtected();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePortProtected; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePortProtected"
+
+
+    // $ANTLR start "rulePortProtected"
+    // InternalFormalML.g:18677:1: rulePortProtected returns [EObject current=null] : ( ( (lv_visibility_0_0= ruleProtectedPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) ;
+    public final EObject rulePortProtected() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        Enumerator lv_direction_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_parameter_5_0 = null;
+
+        EObject lv_parameter_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:18683:2: ( ( ( (lv_visibility_0_0= ruleProtectedPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) )
+            // InternalFormalML.g:18684:2: ( ( (lv_visibility_0_0= ruleProtectedPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            {
+            // InternalFormalML.g:18684:2: ( ( (lv_visibility_0_0= ruleProtectedPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            // InternalFormalML.g:18685:3: ( (lv_visibility_0_0= ruleProtectedPortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';'
+            {
+            // InternalFormalML.g:18685:3: ( (lv_visibility_0_0= ruleProtectedPortVisibilityKind ) )
+            // InternalFormalML.g:18686:4: (lv_visibility_0_0= ruleProtectedPortVisibilityKind )
+            {
+            // InternalFormalML.g:18686:4: (lv_visibility_0_0= ruleProtectedPortVisibilityKind )
+            // InternalFormalML.g:18687:5: lv_visibility_0_0= ruleProtectedPortVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getPortProtectedAccess().getVisibilityProtectedPortVisibilityKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_180);
+            lv_visibility_0_0=ruleProtectedPortVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedPortVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18704:3: ( (lv_direction_1_0= ruleChannelDirection ) )?
+            int alt421=2;
+            int LA421_0 = input.LA(1);
+
+            if ( ((LA421_0>=61 && LA421_0<=63)) ) {
+                alt421=1;
+            }
+            switch (alt421) {
+                case 1 :
+                    // InternalFormalML.g:18705:4: (lv_direction_1_0= ruleChannelDirection )
+                    {
+                    // InternalFormalML.g:18705:4: (lv_direction_1_0= ruleChannelDirection )
+                    // InternalFormalML.g:18706:5: lv_direction_1_0= ruleChannelDirection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPortProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_direction_1_0=ruleChannelDirection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18723:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:18724:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:18724:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:18725:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getPortProtectedAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_181);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18742:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt422=2;
+            int LA422_0 = input.LA(1);
+
+            if ( (LA422_0==RULE_STRING) ) {
+                alt422=1;
+            }
+            switch (alt422) {
+                case 1 :
+                    // InternalFormalML.g:18743:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:18743:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:18744:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPortProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_182);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18761:3: (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )?
+            int alt424=2;
+            int LA424_0 = input.LA(1);
+
+            if ( (LA424_0==56) ) {
+                alt424=1;
+            }
+            switch (alt424) {
+                case 1 :
+                    // InternalFormalML.g:18762:4: otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')'
+                    {
+                    otherlv_4=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getPortProtectedAccess().getLeftParenthesisKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:18766:4: ( (lv_parameter_5_0= ruleFormalParameter ) )
+                    // InternalFormalML.g:18767:5: (lv_parameter_5_0= ruleFormalParameter )
+                    {
+                    // InternalFormalML.g:18767:5: (lv_parameter_5_0= ruleFormalParameter )
+                    // InternalFormalML.g:18768:6: lv_parameter_5_0= ruleFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_parameter_5_0=ruleFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+                      						}
+                      						add(
+                      							current,
+                      							"parameter",
+                      							lv_parameter_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:18785:4: (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )*
+                    loop423:
+                    do {
+                        int alt423=2;
+                        int LA423_0 = input.LA(1);
+
+                        if ( (LA423_0==20) ) {
+                            alt423=1;
+                        }
+
+
+                        switch (alt423) {
+                    	case 1 :
+                    	    // InternalFormalML.g:18786:5: otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_6, grammarAccess.getPortProtectedAccess().getCommaKeyword_4_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:18790:5: ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    // InternalFormalML.g:18791:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    {
+                    	    // InternalFormalML.g:18791:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    // InternalFormalML.g:18792:7: lv_parameter_7_0= ruleFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getPortProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_parameter_7_0=ruleFormalParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getPortProtectedRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"parameter",
+                    	      								lv_parameter_7_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop423;
+                        }
+                    } while (true);
+
+                    otherlv_8=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getPortProtectedAccess().getRightParenthesisKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getPortProtectedAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePortProtected"
+
+
+    // $ANTLR start "entryRulePortPrivate"
+    // InternalFormalML.g:18823:1: entryRulePortPrivate returns [EObject current=null] : iv_rulePortPrivate= rulePortPrivate EOF ;
+    public final EObject entryRulePortPrivate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePortPrivate = null;
+
+
+        try {
+            // InternalFormalML.g:18823:52: (iv_rulePortPrivate= rulePortPrivate EOF )
+            // InternalFormalML.g:18824:2: iv_rulePortPrivate= rulePortPrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPortPrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePortPrivate=rulePortPrivate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePortPrivate; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePortPrivate"
+
+
+    // $ANTLR start "rulePortPrivate"
+    // InternalFormalML.g:18830:1: rulePortPrivate returns [EObject current=null] : ( ( (lv_visibility_0_0= rulePrivatePortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) ;
+    public final EObject rulePortPrivate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        Enumerator lv_direction_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_parameter_5_0 = null;
+
+        EObject lv_parameter_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:18836:2: ( ( ( (lv_visibility_0_0= rulePrivatePortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) )
+            // InternalFormalML.g:18837:2: ( ( (lv_visibility_0_0= rulePrivatePortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            {
+            // InternalFormalML.g:18837:2: ( ( (lv_visibility_0_0= rulePrivatePortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            // InternalFormalML.g:18838:3: ( (lv_visibility_0_0= rulePrivatePortVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';'
+            {
+            // InternalFormalML.g:18838:3: ( (lv_visibility_0_0= rulePrivatePortVisibilityKind ) )
+            // InternalFormalML.g:18839:4: (lv_visibility_0_0= rulePrivatePortVisibilityKind )
+            {
+            // InternalFormalML.g:18839:4: (lv_visibility_0_0= rulePrivatePortVisibilityKind )
+            // InternalFormalML.g:18840:5: lv_visibility_0_0= rulePrivatePortVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getPortPrivateAccess().getVisibilityPrivatePortVisibilityKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_180);
+            lv_visibility_0_0=rulePrivatePortVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PrivatePortVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18857:3: ( (lv_direction_1_0= ruleChannelDirection ) )?
+            int alt425=2;
+            int LA425_0 = input.LA(1);
+
+            if ( ((LA425_0>=61 && LA425_0<=63)) ) {
+                alt425=1;
+            }
+            switch (alt425) {
+                case 1 :
+                    // InternalFormalML.g:18858:4: (lv_direction_1_0= ruleChannelDirection )
+                    {
+                    // InternalFormalML.g:18858:4: (lv_direction_1_0= ruleChannelDirection )
+                    // InternalFormalML.g:18859:5: lv_direction_1_0= ruleChannelDirection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPortPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_direction_1_0=ruleChannelDirection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18876:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:18877:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:18877:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:18878:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getPortPrivateAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_181);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:18895:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt426=2;
+            int LA426_0 = input.LA(1);
+
+            if ( (LA426_0==RULE_STRING) ) {
+                alt426=1;
+            }
+            switch (alt426) {
+                case 1 :
+                    // InternalFormalML.g:18896:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:18896:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:18897:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getPortPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_182);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:18914:3: (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )?
+            int alt428=2;
+            int LA428_0 = input.LA(1);
+
+            if ( (LA428_0==56) ) {
+                alt428=1;
+            }
+            switch (alt428) {
+                case 1 :
+                    // InternalFormalML.g:18915:4: otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')'
+                    {
+                    otherlv_4=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getPortPrivateAccess().getLeftParenthesisKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:18919:4: ( (lv_parameter_5_0= ruleFormalParameter ) )
+                    // InternalFormalML.g:18920:5: (lv_parameter_5_0= ruleFormalParameter )
+                    {
+                    // InternalFormalML.g:18920:5: (lv_parameter_5_0= ruleFormalParameter )
+                    // InternalFormalML.g:18921:6: lv_parameter_5_0= ruleFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_parameter_5_0=ruleFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+                      						}
+                      						add(
+                      							current,
+                      							"parameter",
+                      							lv_parameter_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:18938:4: (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )*
+                    loop427:
+                    do {
+                        int alt427=2;
+                        int LA427_0 = input.LA(1);
+
+                        if ( (LA427_0==20) ) {
+                            alt427=1;
+                        }
+
+
+                        switch (alt427) {
+                    	case 1 :
+                    	    // InternalFormalML.g:18939:5: otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_6, grammarAccess.getPortPrivateAccess().getCommaKeyword_4_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:18943:5: ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    // InternalFormalML.g:18944:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    {
+                    	    // InternalFormalML.g:18944:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    // InternalFormalML.g:18945:7: lv_parameter_7_0= ruleFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getPortPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_parameter_7_0=ruleFormalParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getPortPrivateRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"parameter",
+                    	      								lv_parameter_7_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop427;
+                        }
+                    } while (true);
+
+                    otherlv_8=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getPortPrivateAccess().getRightParenthesisKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getPortPrivateAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePortPrivate"
+
+
+    // $ANTLR start "entryRuleSignal"
+    // InternalFormalML.g:18976:1: entryRuleSignal returns [EObject current=null] : iv_ruleSignal= ruleSignal EOF ;
+    public final EObject entryRuleSignal() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSignal = null;
+
+
+        try {
+            // InternalFormalML.g:18976:47: (iv_ruleSignal= ruleSignal EOF )
+            // InternalFormalML.g:18977:2: iv_ruleSignal= ruleSignal EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSignalRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSignal=ruleSignal();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSignal; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSignal"
+
+
+    // $ANTLR start "ruleSignal"
+    // InternalFormalML.g:18983:1: ruleSignal returns [EObject current=null] : ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'signal' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';' ) ;
+    public final EObject ruleSignal() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        Enumerator lv_direction_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_4_0 = null;
+
+        EObject lv_parameter_6_0 = null;
+
+        EObject lv_parameter_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:18989:2: ( ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'signal' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';' ) )
+            // InternalFormalML.g:18990:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'signal' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';' )
+            {
+            // InternalFormalML.g:18990:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'signal' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';' )
+            // InternalFormalML.g:18991:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'signal' ( (lv_direction_2_0= ruleChannelDirection ) )? ( (lv_name_3_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )? (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )? otherlv_10= ';'
+            {
+            // InternalFormalML.g:18991:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )?
+            int alt429=2;
+            int LA429_0 = input.LA(1);
+
+            if ( (LA429_0==19||(LA429_0>=240 && LA429_0<=242)) ) {
+                alt429=1;
+            }
+            switch (alt429) {
+                case 1 :
+                    // InternalFormalML.g:18992:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:18992:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    // InternalFormalML.g:18993:5: lv_visibility_0_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_183);
+                    lv_visibility_0_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_1=(Token)match(input,138,FollowSets000.FOLLOW_180); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getSignalAccess().getSignalKeyword_1());
+              		
+            }
+            // InternalFormalML.g:19014:3: ( (lv_direction_2_0= ruleChannelDirection ) )?
+            int alt430=2;
+            int LA430_0 = input.LA(1);
+
+            if ( ((LA430_0>=61 && LA430_0<=63)) ) {
+                alt430=1;
+            }
+            switch (alt430) {
+                case 1 :
+                    // InternalFormalML.g:19015:4: (lv_direction_2_0= ruleChannelDirection )
+                    {
+                    // InternalFormalML.g:19015:4: (lv_direction_2_0= ruleChannelDirection )
+                    // InternalFormalML.g:19016:5: lv_direction_2_0= ruleChannelDirection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalAccess().getDirectionChannelDirectionEnumRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_direction_2_0=ruleChannelDirection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:19033:3: ( (lv_name_3_0= ruleESIdentifier ) )
+            // InternalFormalML.g:19034:4: (lv_name_3_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:19034:4: (lv_name_3_0= ruleESIdentifier )
+            // InternalFormalML.g:19035:5: lv_name_3_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSignalAccess().getNameESIdentifierParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_181);
+            lv_name_3_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSignalRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19052:3: ( (lv_unrestrictedName_4_0= ruleUnrestrictedName ) )?
+            int alt431=2;
+            int LA431_0 = input.LA(1);
+
+            if ( (LA431_0==RULE_STRING) ) {
+                alt431=1;
+            }
+            switch (alt431) {
+                case 1 :
+                    // InternalFormalML.g:19053:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:19053:4: (lv_unrestrictedName_4_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:19054:5: lv_unrestrictedName_4_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_182);
+                    lv_unrestrictedName_4_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_4_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:19071:3: (otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')' )?
+            int alt433=2;
+            int LA433_0 = input.LA(1);
+
+            if ( (LA433_0==56) ) {
+                alt433=1;
+            }
+            switch (alt433) {
+                case 1 :
+                    // InternalFormalML.g:19072:4: otherlv_5= '(' ( (lv_parameter_6_0= ruleFormalParameter ) ) (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )* otherlv_9= ')'
+                    {
+                    otherlv_5=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getSignalAccess().getLeftParenthesisKeyword_5_0());
+                      			
+                    }
+                    // InternalFormalML.g:19076:4: ( (lv_parameter_6_0= ruleFormalParameter ) )
+                    // InternalFormalML.g:19077:5: (lv_parameter_6_0= ruleFormalParameter )
+                    {
+                    // InternalFormalML.g:19077:5: (lv_parameter_6_0= ruleFormalParameter )
+                    // InternalFormalML.g:19078:6: lv_parameter_6_0= ruleFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_parameter_6_0=ruleFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getSignalRule());
+                      						}
+                      						add(
+                      							current,
+                      							"parameter",
+                      							lv_parameter_6_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:19095:4: (otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) ) )*
+                    loop432:
+                    do {
+                        int alt432=2;
+                        int LA432_0 = input.LA(1);
+
+                        if ( (LA432_0==20) ) {
+                            alt432=1;
+                        }
+
+
+                        switch (alt432) {
+                    	case 1 :
+                    	    // InternalFormalML.g:19096:5: otherlv_7= ',' ( (lv_parameter_8_0= ruleFormalParameter ) )
+                    	    {
+                    	    otherlv_7=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_7, grammarAccess.getSignalAccess().getCommaKeyword_5_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:19100:5: ( (lv_parameter_8_0= ruleFormalParameter ) )
+                    	    // InternalFormalML.g:19101:6: (lv_parameter_8_0= ruleFormalParameter )
+                    	    {
+                    	    // InternalFormalML.g:19101:6: (lv_parameter_8_0= ruleFormalParameter )
+                    	    // InternalFormalML.g:19102:7: lv_parameter_8_0= ruleFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getSignalAccess().getParameterFormalParameterParserRuleCall_5_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_parameter_8_0=ruleFormalParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getSignalRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"parameter",
+                    	      								lv_parameter_8_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop432;
+                        }
+                    } while (true);
+
+                    otherlv_9=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_9, grammarAccess.getSignalAccess().getRightParenthesisKeyword_5_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getSignalAccess().getSemicolonKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSignal"
+
+
+    // $ANTLR start "entryRuleSignalPublic"
+    // InternalFormalML.g:19133:1: entryRuleSignalPublic returns [EObject current=null] : iv_ruleSignalPublic= ruleSignalPublic EOF ;
+    public final EObject entryRuleSignalPublic() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSignalPublic = null;
+
+
+        try {
+            // InternalFormalML.g:19133:53: (iv_ruleSignalPublic= ruleSignalPublic EOF )
+            // InternalFormalML.g:19134:2: iv_ruleSignalPublic= ruleSignalPublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSignalPublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSignalPublic=ruleSignalPublic();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSignalPublic; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSignalPublic"
+
+
+    // $ANTLR start "ruleSignalPublic"
+    // InternalFormalML.g:19140:1: ruleSignalPublic returns [EObject current=null] : ( ( (lv_visibility_0_0= rulePublicSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) ;
+    public final EObject ruleSignalPublic() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        Enumerator lv_direction_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_parameter_5_0 = null;
+
+        EObject lv_parameter_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:19146:2: ( ( ( (lv_visibility_0_0= rulePublicSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) )
+            // InternalFormalML.g:19147:2: ( ( (lv_visibility_0_0= rulePublicSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            {
+            // InternalFormalML.g:19147:2: ( ( (lv_visibility_0_0= rulePublicSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            // InternalFormalML.g:19148:3: ( (lv_visibility_0_0= rulePublicSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';'
+            {
+            // InternalFormalML.g:19148:3: ( (lv_visibility_0_0= rulePublicSignalVisibilityKind ) )
+            // InternalFormalML.g:19149:4: (lv_visibility_0_0= rulePublicSignalVisibilityKind )
+            {
+            // InternalFormalML.g:19149:4: (lv_visibility_0_0= rulePublicSignalVisibilityKind )
+            // InternalFormalML.g:19150:5: lv_visibility_0_0= rulePublicSignalVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSignalPublicAccess().getVisibilityPublicSignalVisibilityKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_180);
+            lv_visibility_0_0=rulePublicSignalVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PublicSignalVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19167:3: ( (lv_direction_1_0= ruleChannelDirection ) )?
+            int alt434=2;
+            int LA434_0 = input.LA(1);
+
+            if ( ((LA434_0>=61 && LA434_0<=63)) ) {
+                alt434=1;
+            }
+            switch (alt434) {
+                case 1 :
+                    // InternalFormalML.g:19168:4: (lv_direction_1_0= ruleChannelDirection )
+                    {
+                    // InternalFormalML.g:19168:4: (lv_direction_1_0= ruleChannelDirection )
+                    // InternalFormalML.g:19169:5: lv_direction_1_0= ruleChannelDirection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalPublicAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_direction_1_0=ruleChannelDirection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:19186:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:19187:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:19187:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:19188:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSignalPublicAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_181);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19205:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt435=2;
+            int LA435_0 = input.LA(1);
+
+            if ( (LA435_0==RULE_STRING) ) {
+                alt435=1;
+            }
+            switch (alt435) {
+                case 1 :
+                    // InternalFormalML.g:19206:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:19206:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:19207:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_182);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:19224:3: (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )?
+            int alt437=2;
+            int LA437_0 = input.LA(1);
+
+            if ( (LA437_0==56) ) {
+                alt437=1;
+            }
+            switch (alt437) {
+                case 1 :
+                    // InternalFormalML.g:19225:4: otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')'
+                    {
+                    otherlv_4=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getSignalPublicAccess().getLeftParenthesisKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:19229:4: ( (lv_parameter_5_0= ruleFormalParameter ) )
+                    // InternalFormalML.g:19230:5: (lv_parameter_5_0= ruleFormalParameter )
+                    {
+                    // InternalFormalML.g:19230:5: (lv_parameter_5_0= ruleFormalParameter )
+                    // InternalFormalML.g:19231:6: lv_parameter_5_0= ruleFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_parameter_5_0=ruleFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+                      						}
+                      						add(
+                      							current,
+                      							"parameter",
+                      							lv_parameter_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:19248:4: (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )*
+                    loop436:
+                    do {
+                        int alt436=2;
+                        int LA436_0 = input.LA(1);
+
+                        if ( (LA436_0==20) ) {
+                            alt436=1;
+                        }
+
+
+                        switch (alt436) {
+                    	case 1 :
+                    	    // InternalFormalML.g:19249:5: otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_6, grammarAccess.getSignalPublicAccess().getCommaKeyword_4_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:19253:5: ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    // InternalFormalML.g:19254:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    {
+                    	    // InternalFormalML.g:19254:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    // InternalFormalML.g:19255:7: lv_parameter_7_0= ruleFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getSignalPublicAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_parameter_7_0=ruleFormalParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getSignalPublicRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"parameter",
+                    	      								lv_parameter_7_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop436;
+                        }
+                    } while (true);
+
+                    otherlv_8=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getSignalPublicAccess().getRightParenthesisKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getSignalPublicAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSignalPublic"
+
+
+    // $ANTLR start "entryRuleSignalProtected"
+    // InternalFormalML.g:19286:1: entryRuleSignalProtected returns [EObject current=null] : iv_ruleSignalProtected= ruleSignalProtected EOF ;
+    public final EObject entryRuleSignalProtected() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSignalProtected = null;
+
+
+        try {
+            // InternalFormalML.g:19286:56: (iv_ruleSignalProtected= ruleSignalProtected EOF )
+            // InternalFormalML.g:19287:2: iv_ruleSignalProtected= ruleSignalProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSignalProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSignalProtected=ruleSignalProtected();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSignalProtected; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSignalProtected"
+
+
+    // $ANTLR start "ruleSignalProtected"
+    // InternalFormalML.g:19293:1: ruleSignalProtected returns [EObject current=null] : ( ( (lv_visibility_0_0= ruleProtectedSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) ;
+    public final EObject ruleSignalProtected() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        Enumerator lv_direction_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_parameter_5_0 = null;
+
+        EObject lv_parameter_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:19299:2: ( ( ( (lv_visibility_0_0= ruleProtectedSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) )
+            // InternalFormalML.g:19300:2: ( ( (lv_visibility_0_0= ruleProtectedSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            {
+            // InternalFormalML.g:19300:2: ( ( (lv_visibility_0_0= ruleProtectedSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            // InternalFormalML.g:19301:3: ( (lv_visibility_0_0= ruleProtectedSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';'
+            {
+            // InternalFormalML.g:19301:3: ( (lv_visibility_0_0= ruleProtectedSignalVisibilityKind ) )
+            // InternalFormalML.g:19302:4: (lv_visibility_0_0= ruleProtectedSignalVisibilityKind )
+            {
+            // InternalFormalML.g:19302:4: (lv_visibility_0_0= ruleProtectedSignalVisibilityKind )
+            // InternalFormalML.g:19303:5: lv_visibility_0_0= ruleProtectedSignalVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSignalProtectedAccess().getVisibilityProtectedSignalVisibilityKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_180);
+            lv_visibility_0_0=ruleProtectedSignalVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedSignalVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19320:3: ( (lv_direction_1_0= ruleChannelDirection ) )?
+            int alt438=2;
+            int LA438_0 = input.LA(1);
+
+            if ( ((LA438_0>=61 && LA438_0<=63)) ) {
+                alt438=1;
+            }
+            switch (alt438) {
+                case 1 :
+                    // InternalFormalML.g:19321:4: (lv_direction_1_0= ruleChannelDirection )
+                    {
+                    // InternalFormalML.g:19321:4: (lv_direction_1_0= ruleChannelDirection )
+                    // InternalFormalML.g:19322:5: lv_direction_1_0= ruleChannelDirection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalProtectedAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_direction_1_0=ruleChannelDirection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:19339:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:19340:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:19340:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:19341:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSignalProtectedAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_181);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19358:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt439=2;
+            int LA439_0 = input.LA(1);
+
+            if ( (LA439_0==RULE_STRING) ) {
+                alt439=1;
+            }
+            switch (alt439) {
+                case 1 :
+                    // InternalFormalML.g:19359:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:19359:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:19360:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_182);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:19377:3: (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )?
+            int alt441=2;
+            int LA441_0 = input.LA(1);
+
+            if ( (LA441_0==56) ) {
+                alt441=1;
+            }
+            switch (alt441) {
+                case 1 :
+                    // InternalFormalML.g:19378:4: otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')'
+                    {
+                    otherlv_4=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getSignalProtectedAccess().getLeftParenthesisKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:19382:4: ( (lv_parameter_5_0= ruleFormalParameter ) )
+                    // InternalFormalML.g:19383:5: (lv_parameter_5_0= ruleFormalParameter )
+                    {
+                    // InternalFormalML.g:19383:5: (lv_parameter_5_0= ruleFormalParameter )
+                    // InternalFormalML.g:19384:6: lv_parameter_5_0= ruleFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_parameter_5_0=ruleFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+                      						}
+                      						add(
+                      							current,
+                      							"parameter",
+                      							lv_parameter_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:19401:4: (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )*
+                    loop440:
+                    do {
+                        int alt440=2;
+                        int LA440_0 = input.LA(1);
+
+                        if ( (LA440_0==20) ) {
+                            alt440=1;
+                        }
+
+
+                        switch (alt440) {
+                    	case 1 :
+                    	    // InternalFormalML.g:19402:5: otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_6, grammarAccess.getSignalProtectedAccess().getCommaKeyword_4_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:19406:5: ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    // InternalFormalML.g:19407:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    {
+                    	    // InternalFormalML.g:19407:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    // InternalFormalML.g:19408:7: lv_parameter_7_0= ruleFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getSignalProtectedAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_parameter_7_0=ruleFormalParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getSignalProtectedRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"parameter",
+                    	      								lv_parameter_7_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop440;
+                        }
+                    } while (true);
+
+                    otherlv_8=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getSignalProtectedAccess().getRightParenthesisKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getSignalProtectedAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSignalProtected"
+
+
+    // $ANTLR start "entryRuleSignalPrivate"
+    // InternalFormalML.g:19439:1: entryRuleSignalPrivate returns [EObject current=null] : iv_ruleSignalPrivate= ruleSignalPrivate EOF ;
+    public final EObject entryRuleSignalPrivate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSignalPrivate = null;
+
+
+        try {
+            // InternalFormalML.g:19439:54: (iv_ruleSignalPrivate= ruleSignalPrivate EOF )
+            // InternalFormalML.g:19440:2: iv_ruleSignalPrivate= ruleSignalPrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSignalPrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSignalPrivate=ruleSignalPrivate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSignalPrivate; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSignalPrivate"
+
+
+    // $ANTLR start "ruleSignalPrivate"
+    // InternalFormalML.g:19446:1: ruleSignalPrivate returns [EObject current=null] : ( ( (lv_visibility_0_0= rulePrivateSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) ;
+    public final EObject ruleSignalPrivate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        Enumerator lv_direction_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_parameter_5_0 = null;
+
+        EObject lv_parameter_7_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:19452:2: ( ( ( (lv_visibility_0_0= rulePrivateSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' ) )
+            // InternalFormalML.g:19453:2: ( ( (lv_visibility_0_0= rulePrivateSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            {
+            // InternalFormalML.g:19453:2: ( ( (lv_visibility_0_0= rulePrivateSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';' )
+            // InternalFormalML.g:19454:3: ( (lv_visibility_0_0= rulePrivateSignalVisibilityKind ) ) ( (lv_direction_1_0= ruleChannelDirection ) )? ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )? otherlv_9= ';'
+            {
+            // InternalFormalML.g:19454:3: ( (lv_visibility_0_0= rulePrivateSignalVisibilityKind ) )
+            // InternalFormalML.g:19455:4: (lv_visibility_0_0= rulePrivateSignalVisibilityKind )
+            {
+            // InternalFormalML.g:19455:4: (lv_visibility_0_0= rulePrivateSignalVisibilityKind )
+            // InternalFormalML.g:19456:5: lv_visibility_0_0= rulePrivateSignalVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSignalPrivateAccess().getVisibilityPrivateSignalVisibilityKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_180);
+            lv_visibility_0_0=rulePrivateSignalVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PrivateSignalVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19473:3: ( (lv_direction_1_0= ruleChannelDirection ) )?
+            int alt442=2;
+            int LA442_0 = input.LA(1);
+
+            if ( ((LA442_0>=61 && LA442_0<=63)) ) {
+                alt442=1;
+            }
+            switch (alt442) {
+                case 1 :
+                    // InternalFormalML.g:19474:4: (lv_direction_1_0= ruleChannelDirection )
+                    {
+                    // InternalFormalML.g:19474:4: (lv_direction_1_0= ruleChannelDirection )
+                    // InternalFormalML.g:19475:5: lv_direction_1_0= ruleChannelDirection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalPrivateAccess().getDirectionChannelDirectionEnumRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_direction_1_0=ruleChannelDirection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:19492:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:19493:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:19493:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:19494:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSignalPrivateAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_181);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19511:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt443=2;
+            int LA443_0 = input.LA(1);
+
+            if ( (LA443_0==RULE_STRING) ) {
+                alt443=1;
+            }
+            switch (alt443) {
+                case 1 :
+                    // InternalFormalML.g:19512:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:19512:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:19513:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_182);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:19530:3: (otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')' )?
+            int alt445=2;
+            int LA445_0 = input.LA(1);
+
+            if ( (LA445_0==56) ) {
+                alt445=1;
+            }
+            switch (alt445) {
+                case 1 :
+                    // InternalFormalML.g:19531:4: otherlv_4= '(' ( (lv_parameter_5_0= ruleFormalParameter ) ) (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )* otherlv_8= ')'
+                    {
+                    otherlv_4=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getSignalPrivateAccess().getLeftParenthesisKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:19535:4: ( (lv_parameter_5_0= ruleFormalParameter ) )
+                    // InternalFormalML.g:19536:5: (lv_parameter_5_0= ruleFormalParameter )
+                    {
+                    // InternalFormalML.g:19536:5: (lv_parameter_5_0= ruleFormalParameter )
+                    // InternalFormalML.g:19537:6: lv_parameter_5_0= ruleFormalParameter
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_parameter_5_0=ruleFormalParameter();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+                      						}
+                      						add(
+                      							current,
+                      							"parameter",
+                      							lv_parameter_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:19554:4: (otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) ) )*
+                    loop444:
+                    do {
+                        int alt444=2;
+                        int LA444_0 = input.LA(1);
+
+                        if ( (LA444_0==20) ) {
+                            alt444=1;
+                        }
+
+
+                        switch (alt444) {
+                    	case 1 :
+                    	    // InternalFormalML.g:19555:5: otherlv_6= ',' ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    {
+                    	    otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_6, grammarAccess.getSignalPrivateAccess().getCommaKeyword_4_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:19559:5: ( (lv_parameter_7_0= ruleFormalParameter ) )
+                    	    // InternalFormalML.g:19560:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    {
+                    	    // InternalFormalML.g:19560:6: (lv_parameter_7_0= ruleFormalParameter )
+                    	    // InternalFormalML.g:19561:7: lv_parameter_7_0= ruleFormalParameter
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getSignalPrivateAccess().getParameterFormalParameterParserRuleCall_4_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_parameter_7_0=ruleFormalParameter();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getSignalPrivateRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"parameter",
+                    	      								lv_parameter_7_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop444;
+                        }
+                    } while (true);
+
+                    otherlv_8=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getSignalPrivateAccess().getRightParenthesisKeyword_4_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_9=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_9, grammarAccess.getSignalPrivateAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSignalPrivate"
+
+
+    // $ANTLR start "entryRuleChannel"
+    // InternalFormalML.g:19592:1: entryRuleChannel returns [EObject current=null] : iv_ruleChannel= ruleChannel EOF ;
+    public final EObject entryRuleChannel() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleChannel = null;
+
+
+        try {
+            // InternalFormalML.g:19592:48: (iv_ruleChannel= ruleChannel EOF )
+            // InternalFormalML.g:19593:2: iv_ruleChannel= ruleChannel EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getChannelRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleChannel=ruleChannel();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleChannel; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleChannel"
+
+
+    // $ANTLR start "ruleChannel"
+    // InternalFormalML.g:19599:1: ruleChannel returns [EObject current=null] : ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'channel' ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? otherlv_4= '{' ( ( (lv_signal_5_0= ruleSignalReference ) ) otherlv_6= ';' )+ otherlv_7= '}' ) ;
+    public final EObject ruleChannel() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_3_0 = null;
+
+        EObject lv_signal_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:19605:2: ( ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'channel' ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? otherlv_4= '{' ( ( (lv_signal_5_0= ruleSignalReference ) ) otherlv_6= ';' )+ otherlv_7= '}' ) )
+            // InternalFormalML.g:19606:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'channel' ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? otherlv_4= '{' ( ( (lv_signal_5_0= ruleSignalReference ) ) otherlv_6= ';' )+ otherlv_7= '}' )
+            {
+            // InternalFormalML.g:19606:2: ( ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'channel' ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? otherlv_4= '{' ( ( (lv_signal_5_0= ruleSignalReference ) ) otherlv_6= ';' )+ otherlv_7= '}' )
+            // InternalFormalML.g:19607:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )? otherlv_1= 'channel' ( (lv_name_2_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )? otherlv_4= '{' ( ( (lv_signal_5_0= ruleSignalReference ) ) otherlv_6= ';' )+ otherlv_7= '}'
+            {
+            // InternalFormalML.g:19607:3: ( (lv_visibility_0_0= ruleVisibilityKind ) )?
+            int alt446=2;
+            int LA446_0 = input.LA(1);
+
+            if ( (LA446_0==19||(LA446_0>=240 && LA446_0<=242)) ) {
+                alt446=1;
+            }
+            switch (alt446) {
+                case 1 :
+                    // InternalFormalML.g:19608:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    {
+                    // InternalFormalML.g:19608:4: (lv_visibility_0_0= ruleVisibilityKind )
+                    // InternalFormalML.g:19609:5: lv_visibility_0_0= ruleVisibilityKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getChannelAccess().getVisibilityVisibilityKindEnumRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_184);
+                    lv_visibility_0_0=ruleVisibilityKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getChannelRule());
+                      					}
+                      					set(
+                      						current,
+                      						"visibility",
+                      						lv_visibility_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_1=(Token)match(input,139,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getChannelAccess().getChannelKeyword_1());
+              		
+            }
+            // InternalFormalML.g:19630:3: ( (lv_name_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:19631:4: (lv_name_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:19631:4: (lv_name_2_0= ruleESIdentifier )
+            // InternalFormalML.g:19632:5: lv_name_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getChannelAccess().getNameESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_24);
+            lv_name_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getChannelRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19649:3: ( (lv_unrestrictedName_3_0= ruleUnrestrictedName ) )?
+            int alt447=2;
+            int LA447_0 = input.LA(1);
+
+            if ( (LA447_0==RULE_STRING) ) {
+                alt447=1;
+            }
+            switch (alt447) {
+                case 1 :
+                    // InternalFormalML.g:19650:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:19650:4: (lv_unrestrictedName_3_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:19651:5: lv_unrestrictedName_3_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getChannelAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_10);
+                    lv_unrestrictedName_3_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getChannelRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_4=(Token)match(input,22,FollowSets000.FOLLOW_180); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getChannelAccess().getLeftCurlyBracketKeyword_4());
+              		
+            }
+            // InternalFormalML.g:19672:3: ( ( (lv_signal_5_0= ruleSignalReference ) ) otherlv_6= ';' )+
+            int cnt448=0;
+            loop448:
+            do {
+                int alt448=2;
+                int LA448_0 = input.LA(1);
+
+                if ( (LA448_0==RULE_XLIA_ID||(LA448_0>=61 && LA448_0<=63)) ) {
+                    alt448=1;
+                }
+
+
+                switch (alt448) {
+            	case 1 :
+            	    // InternalFormalML.g:19673:4: ( (lv_signal_5_0= ruleSignalReference ) ) otherlv_6= ';'
+            	    {
+            	    // InternalFormalML.g:19673:4: ( (lv_signal_5_0= ruleSignalReference ) )
+            	    // InternalFormalML.g:19674:5: (lv_signal_5_0= ruleSignalReference )
+            	    {
+            	    // InternalFormalML.g:19674:5: (lv_signal_5_0= ruleSignalReference )
+            	    // InternalFormalML.g:19675:6: lv_signal_5_0= ruleSignalReference
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getChannelAccess().getSignalSignalReferenceParserRuleCall_5_0_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_14);
+            	    lv_signal_5_0=ruleSignalReference();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getChannelRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"signal",
+            	      							lv_signal_5_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    otherlv_6=(Token)match(input,25,FollowSets000.FOLLOW_185); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_6, grammarAccess.getChannelAccess().getSemicolonKeyword_5_1());
+            	      			
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt448 >= 1 ) break loop448;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(448, input);
+                        throw eee;
+                }
+                cnt448++;
+            } while (true);
+
+            otherlv_7=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_7, grammarAccess.getChannelAccess().getRightCurlyBracketKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleChannel"
+
+
+    // $ANTLR start "entryRuleSignalReference"
+    // InternalFormalML.g:19705:1: entryRuleSignalReference returns [EObject current=null] : iv_ruleSignalReference= ruleSignalReference EOF ;
+    public final EObject entryRuleSignalReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSignalReference = null;
+
+
+        try {
+            // InternalFormalML.g:19705:56: (iv_ruleSignalReference= ruleSignalReference EOF )
+            // InternalFormalML.g:19706:2: iv_ruleSignalReference= ruleSignalReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSignalReferenceRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleSignalReference=ruleSignalReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSignalReference; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSignalReference"
+
+
+    // $ANTLR start "ruleSignalReference"
+    // InternalFormalML.g:19712:1: ruleSignalReference returns [EObject current=null] : ( ( (lv_direction_0_0= ruleChannelDirection ) )? ( (lv_name_1_0= ruleESIdentifier ) ) ) ;
+    public final EObject ruleSignalReference() throws RecognitionException {
+        EObject current = null;
+
+        Enumerator lv_direction_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:19718:2: ( ( ( (lv_direction_0_0= ruleChannelDirection ) )? ( (lv_name_1_0= ruleESIdentifier ) ) ) )
+            // InternalFormalML.g:19719:2: ( ( (lv_direction_0_0= ruleChannelDirection ) )? ( (lv_name_1_0= ruleESIdentifier ) ) )
+            {
+            // InternalFormalML.g:19719:2: ( ( (lv_direction_0_0= ruleChannelDirection ) )? ( (lv_name_1_0= ruleESIdentifier ) ) )
+            // InternalFormalML.g:19720:3: ( (lv_direction_0_0= ruleChannelDirection ) )? ( (lv_name_1_0= ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:19720:3: ( (lv_direction_0_0= ruleChannelDirection ) )?
+            int alt449=2;
+            int LA449_0 = input.LA(1);
+
+            if ( ((LA449_0>=61 && LA449_0<=63)) ) {
+                alt449=1;
+            }
+            switch (alt449) {
+                case 1 :
+                    // InternalFormalML.g:19721:4: (lv_direction_0_0= ruleChannelDirection )
+                    {
+                    // InternalFormalML.g:19721:4: (lv_direction_0_0= ruleChannelDirection )
+                    // InternalFormalML.g:19722:5: lv_direction_0_0= ruleChannelDirection
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getSignalReferenceAccess().getDirectionChannelDirectionEnumRuleCall_0_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_direction_0_0=ruleChannelDirection();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getSignalReferenceRule());
+                      					}
+                      					set(
+                      						current,
+                      						"direction",
+                      						lv_direction_0_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:19739:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:19740:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:19740:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:19741:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getSignalReferenceAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSignalReferenceRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSignalReference"
+
+
+    // $ANTLR start "entryRuleChannelPublic"
+    // InternalFormalML.g:19762:1: entryRuleChannelPublic returns [EObject current=null] : iv_ruleChannelPublic= ruleChannelPublic EOF ;
+    public final EObject entryRuleChannelPublic() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleChannelPublic = null;
+
+
+        try {
+            // InternalFormalML.g:19762:54: (iv_ruleChannelPublic= ruleChannelPublic EOF )
+            // InternalFormalML.g:19763:2: iv_ruleChannelPublic= ruleChannelPublic EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getChannelPublicRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleChannelPublic=ruleChannelPublic();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleChannelPublic; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleChannelPublic"
+
+
+    // $ANTLR start "ruleChannelPublic"
+    // InternalFormalML.g:19769:1: ruleChannelPublic returns [EObject current=null] : ( ( (lv_visibility_0_0= rulePublicChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' ) ;
+    public final EObject ruleChannelPublic() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        EObject lv_signal_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:19775:2: ( ( ( (lv_visibility_0_0= rulePublicChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' ) )
+            // InternalFormalML.g:19776:2: ( ( (lv_visibility_0_0= rulePublicChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' )
+            {
+            // InternalFormalML.g:19776:2: ( ( (lv_visibility_0_0= rulePublicChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' )
+            // InternalFormalML.g:19777:3: ( (lv_visibility_0_0= rulePublicChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}'
+            {
+            // InternalFormalML.g:19777:3: ( (lv_visibility_0_0= rulePublicChannelVisibilityKind ) )
+            // InternalFormalML.g:19778:4: (lv_visibility_0_0= rulePublicChannelVisibilityKind )
+            {
+            // InternalFormalML.g:19778:4: (lv_visibility_0_0= rulePublicChannelVisibilityKind )
+            // InternalFormalML.g:19779:5: lv_visibility_0_0= rulePublicChannelVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getChannelPublicAccess().getVisibilityPublicChannelVisibilityKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_visibility_0_0=rulePublicChannelVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getChannelPublicRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PublicChannelVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19796:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:19797:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:19797:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:19798:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getChannelPublicAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_24);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getChannelPublicRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19815:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt450=2;
+            int LA450_0 = input.LA(1);
+
+            if ( (LA450_0==RULE_STRING) ) {
+                alt450=1;
+            }
+            switch (alt450) {
+                case 1 :
+                    // InternalFormalML.g:19816:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:19816:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:19817:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getChannelPublicAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_10);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getChannelPublicRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,22,FollowSets000.FOLLOW_180); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getChannelPublicAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            // InternalFormalML.g:19838:3: ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+
+            int cnt451=0;
+            loop451:
+            do {
+                int alt451=2;
+                int LA451_0 = input.LA(1);
+
+                if ( (LA451_0==RULE_XLIA_ID||(LA451_0>=61 && LA451_0<=63)) ) {
+                    alt451=1;
+                }
+
+
+                switch (alt451) {
+            	case 1 :
+            	    // InternalFormalML.g:19839:4: ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';'
+            	    {
+            	    // InternalFormalML.g:19839:4: ( (lv_signal_4_0= ruleSignalReference ) )
+            	    // InternalFormalML.g:19840:5: (lv_signal_4_0= ruleSignalReference )
+            	    {
+            	    // InternalFormalML.g:19840:5: (lv_signal_4_0= ruleSignalReference )
+            	    // InternalFormalML.g:19841:6: lv_signal_4_0= ruleSignalReference
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getChannelPublicAccess().getSignalSignalReferenceParserRuleCall_4_0_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_14);
+            	    lv_signal_4_0=ruleSignalReference();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getChannelPublicRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"signal",
+            	      							lv_signal_4_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    otherlv_5=(Token)match(input,25,FollowSets000.FOLLOW_185); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_5, grammarAccess.getChannelPublicAccess().getSemicolonKeyword_4_1());
+            	      			
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt451 >= 1 ) break loop451;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(451, input);
+                        throw eee;
+                }
+                cnt451++;
+            } while (true);
+
+            otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getChannelPublicAccess().getRightCurlyBracketKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleChannelPublic"
+
+
+    // $ANTLR start "entryRuleChannelProtected"
+    // InternalFormalML.g:19871:1: entryRuleChannelProtected returns [EObject current=null] : iv_ruleChannelProtected= ruleChannelProtected EOF ;
+    public final EObject entryRuleChannelProtected() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleChannelProtected = null;
+
+
+        try {
+            // InternalFormalML.g:19871:57: (iv_ruleChannelProtected= ruleChannelProtected EOF )
+            // InternalFormalML.g:19872:2: iv_ruleChannelProtected= ruleChannelProtected EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getChannelProtectedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleChannelProtected=ruleChannelProtected();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleChannelProtected; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleChannelProtected"
+
+
+    // $ANTLR start "ruleChannelProtected"
+    // InternalFormalML.g:19878:1: ruleChannelProtected returns [EObject current=null] : ( ( (lv_visibility_0_0= ruleProtectedChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' ) ;
+    public final EObject ruleChannelProtected() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        EObject lv_signal_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:19884:2: ( ( ( (lv_visibility_0_0= ruleProtectedChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' ) )
+            // InternalFormalML.g:19885:2: ( ( (lv_visibility_0_0= ruleProtectedChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' )
+            {
+            // InternalFormalML.g:19885:2: ( ( (lv_visibility_0_0= ruleProtectedChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' )
+            // InternalFormalML.g:19886:3: ( (lv_visibility_0_0= ruleProtectedChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}'
+            {
+            // InternalFormalML.g:19886:3: ( (lv_visibility_0_0= ruleProtectedChannelVisibilityKind ) )
+            // InternalFormalML.g:19887:4: (lv_visibility_0_0= ruleProtectedChannelVisibilityKind )
+            {
+            // InternalFormalML.g:19887:4: (lv_visibility_0_0= ruleProtectedChannelVisibilityKind )
+            // InternalFormalML.g:19888:5: lv_visibility_0_0= ruleProtectedChannelVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getChannelProtectedAccess().getVisibilityProtectedChannelVisibilityKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_visibility_0_0=ruleProtectedChannelVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getChannelProtectedRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ProtectedChannelVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19905:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:19906:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:19906:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:19907:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getChannelProtectedAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_24);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getChannelProtectedRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:19924:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt452=2;
+            int LA452_0 = input.LA(1);
+
+            if ( (LA452_0==RULE_STRING) ) {
+                alt452=1;
+            }
+            switch (alt452) {
+                case 1 :
+                    // InternalFormalML.g:19925:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:19925:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:19926:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getChannelProtectedAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_10);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getChannelProtectedRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,22,FollowSets000.FOLLOW_180); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getChannelProtectedAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            // InternalFormalML.g:19947:3: ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+
+            int cnt453=0;
+            loop453:
+            do {
+                int alt453=2;
+                int LA453_0 = input.LA(1);
+
+                if ( (LA453_0==RULE_XLIA_ID||(LA453_0>=61 && LA453_0<=63)) ) {
+                    alt453=1;
+                }
+
+
+                switch (alt453) {
+            	case 1 :
+            	    // InternalFormalML.g:19948:4: ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';'
+            	    {
+            	    // InternalFormalML.g:19948:4: ( (lv_signal_4_0= ruleSignalReference ) )
+            	    // InternalFormalML.g:19949:5: (lv_signal_4_0= ruleSignalReference )
+            	    {
+            	    // InternalFormalML.g:19949:5: (lv_signal_4_0= ruleSignalReference )
+            	    // InternalFormalML.g:19950:6: lv_signal_4_0= ruleSignalReference
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getChannelProtectedAccess().getSignalSignalReferenceParserRuleCall_4_0_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_14);
+            	    lv_signal_4_0=ruleSignalReference();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getChannelProtectedRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"signal",
+            	      							lv_signal_4_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    otherlv_5=(Token)match(input,25,FollowSets000.FOLLOW_185); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_5, grammarAccess.getChannelProtectedAccess().getSemicolonKeyword_4_1());
+            	      			
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt453 >= 1 ) break loop453;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(453, input);
+                        throw eee;
+                }
+                cnt453++;
+            } while (true);
+
+            otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getChannelProtectedAccess().getRightCurlyBracketKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleChannelProtected"
+
+
+    // $ANTLR start "entryRuleChannelPrivate"
+    // InternalFormalML.g:19980:1: entryRuleChannelPrivate returns [EObject current=null] : iv_ruleChannelPrivate= ruleChannelPrivate EOF ;
+    public final EObject entryRuleChannelPrivate() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleChannelPrivate = null;
+
+
+        try {
+            // InternalFormalML.g:19980:55: (iv_ruleChannelPrivate= ruleChannelPrivate EOF )
+            // InternalFormalML.g:19981:2: iv_ruleChannelPrivate= ruleChannelPrivate EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getChannelPrivateRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleChannelPrivate=ruleChannelPrivate();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleChannelPrivate; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleChannelPrivate"
+
+
+    // $ANTLR start "ruleChannelPrivate"
+    // InternalFormalML.g:19987:1: ruleChannelPrivate returns [EObject current=null] : ( ( (lv_visibility_0_0= rulePrivateChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' ) ;
+    public final EObject ruleChannelPrivate() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Enumerator lv_visibility_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_2_0 = null;
+
+        EObject lv_signal_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:19993:2: ( ( ( (lv_visibility_0_0= rulePrivateChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' ) )
+            // InternalFormalML.g:19994:2: ( ( (lv_visibility_0_0= rulePrivateChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' )
+            {
+            // InternalFormalML.g:19994:2: ( ( (lv_visibility_0_0= rulePrivateChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}' )
+            // InternalFormalML.g:19995:3: ( (lv_visibility_0_0= rulePrivateChannelVisibilityKind ) ) ( (lv_name_1_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )? otherlv_3= '{' ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+ otherlv_6= '}'
+            {
+            // InternalFormalML.g:19995:3: ( (lv_visibility_0_0= rulePrivateChannelVisibilityKind ) )
+            // InternalFormalML.g:19996:4: (lv_visibility_0_0= rulePrivateChannelVisibilityKind )
+            {
+            // InternalFormalML.g:19996:4: (lv_visibility_0_0= rulePrivateChannelVisibilityKind )
+            // InternalFormalML.g:19997:5: lv_visibility_0_0= rulePrivateChannelVisibilityKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getChannelPrivateAccess().getVisibilityPrivateChannelVisibilityKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_visibility_0_0=rulePrivateChannelVisibilityKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getChannelPrivateRule());
+              					}
+              					set(
+              						current,
+              						"visibility",
+              						lv_visibility_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.PrivateChannelVisibilityKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:20014:3: ( (lv_name_1_0= ruleESIdentifier ) )
+            // InternalFormalML.g:20015:4: (lv_name_1_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:20015:4: (lv_name_1_0= ruleESIdentifier )
+            // InternalFormalML.g:20016:5: lv_name_1_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getChannelPrivateAccess().getNameESIdentifierParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_24);
+            lv_name_1_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getChannelPrivateRule());
+              					}
+              					set(
+              						current,
+              						"name",
+              						lv_name_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:20033:3: ( (lv_unrestrictedName_2_0= ruleUnrestrictedName ) )?
+            int alt454=2;
+            int LA454_0 = input.LA(1);
+
+            if ( (LA454_0==RULE_STRING) ) {
+                alt454=1;
+            }
+            switch (alt454) {
+                case 1 :
+                    // InternalFormalML.g:20034:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    {
+                    // InternalFormalML.g:20034:4: (lv_unrestrictedName_2_0= ruleUnrestrictedName )
+                    // InternalFormalML.g:20035:5: lv_unrestrictedName_2_0= ruleUnrestrictedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getChannelPrivateAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_10);
+                    lv_unrestrictedName_2_0=ruleUnrestrictedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getChannelPrivateRule());
+                      					}
+                      					set(
+                      						current,
+                      						"unrestrictedName",
+                      						lv_unrestrictedName_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,22,FollowSets000.FOLLOW_180); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getChannelPrivateAccess().getLeftCurlyBracketKeyword_3());
+              		
+            }
+            // InternalFormalML.g:20056:3: ( ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';' )+
+            int cnt455=0;
+            loop455:
+            do {
+                int alt455=2;
+                int LA455_0 = input.LA(1);
+
+                if ( (LA455_0==RULE_XLIA_ID||(LA455_0>=61 && LA455_0<=63)) ) {
+                    alt455=1;
+                }
+
+
+                switch (alt455) {
+            	case 1 :
+            	    // InternalFormalML.g:20057:4: ( (lv_signal_4_0= ruleSignalReference ) ) otherlv_5= ';'
+            	    {
+            	    // InternalFormalML.g:20057:4: ( (lv_signal_4_0= ruleSignalReference ) )
+            	    // InternalFormalML.g:20058:5: (lv_signal_4_0= ruleSignalReference )
+            	    {
+            	    // InternalFormalML.g:20058:5: (lv_signal_4_0= ruleSignalReference )
+            	    // InternalFormalML.g:20059:6: lv_signal_4_0= ruleSignalReference
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getChannelPrivateAccess().getSignalSignalReferenceParserRuleCall_4_0_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_14);
+            	    lv_signal_4_0=ruleSignalReference();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getChannelPrivateRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"signal",
+            	      							lv_signal_4_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    otherlv_5=(Token)match(input,25,FollowSets000.FOLLOW_185); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_5, grammarAccess.getChannelPrivateAccess().getSemicolonKeyword_4_1());
+            	      			
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt455 >= 1 ) break loop455;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(455, input);
+                        throw eee;
+                }
+                cnt455++;
+            } while (true);
+
+            otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getChannelPrivateAccess().getRightCurlyBracketKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleChannelPrivate"
+
+
+    // $ANTLR start "entryRuleTransition"
+    // InternalFormalML.g:20089:1: entryRuleTransition returns [EObject current=null] : iv_ruleTransition= ruleTransition EOF ;
+    public final EObject entryRuleTransition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransition = null;
+
+
+        try {
+            // InternalFormalML.g:20089:51: (iv_ruleTransition= ruleTransition EOF )
+            // InternalFormalML.g:20090:2: iv_ruleTransition= ruleTransition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTransitionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTransition=ruleTransition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTransition; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransition"
+
+
+    // $ANTLR start "ruleTransition"
+    // InternalFormalML.g:20096:1: ruleTransition returns [EObject current=null] : ( () ( (lv_transient_1_0= 'transient' ) )? otherlv_2= 'transition' ( (lv_moe_3_0= ruleTransitionMoe ) )? ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? ( (otherlv_6= '{' ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )? otherlv_16= '}' (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )? ) | (otherlv_20= '-->' ( ( ruleESUfid ) ) ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' ) ) ) ) ;
+    public final EObject ruleTransition() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_transient_1_0=null;
+        Token otherlv_2=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_13=null;
+        Token otherlv_16=null;
+        Token otherlv_17=null;
+        Token otherlv_19=null;
+        Token otherlv_20=null;
+        Token otherlv_22=null;
+        Token otherlv_23=null;
+        Token otherlv_26=null;
+        Token otherlv_28=null;
+        Token otherlv_29=null;
+        Token otherlv_32=null;
+        Token otherlv_33=null;
+        EObject lv_moe_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_name_4_0 = null;
+
+        AntlrDatatypeRuleToken lv_unrestrictedName_5_0 = null;
+
+        EObject lv_trigger_8_0 = null;
+
+        EObject lv_guard_9_0 = null;
+
+        EObject lv_tguard_11_0 = null;
+
+        EObject lv_effect_14_0 = null;
+
+        EObject lv_behavior_15_0 = null;
+
+        EObject lv_trigger_24_0 = null;
+
+        EObject lv_guard_25_0 = null;
+
+        EObject lv_tguard_27_0 = null;
+
+        EObject lv_effect_30_0 = null;
+
+        EObject lv_behavior_31_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:20102:2: ( ( () ( (lv_transient_1_0= 'transient' ) )? otherlv_2= 'transition' ( (lv_moe_3_0= ruleTransitionMoe ) )? ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? ( (otherlv_6= '{' ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )? otherlv_16= '}' (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )? ) | (otherlv_20= '-->' ( ( ruleESUfid ) ) ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' ) ) ) ) )
+            // InternalFormalML.g:20103:2: ( () ( (lv_transient_1_0= 'transient' ) )? otherlv_2= 'transition' ( (lv_moe_3_0= ruleTransitionMoe ) )? ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? ( (otherlv_6= '{' ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )? otherlv_16= '}' (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )? ) | (otherlv_20= '-->' ( ( ruleESUfid ) ) ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' ) ) ) )
+            {
+            // InternalFormalML.g:20103:2: ( () ( (lv_transient_1_0= 'transient' ) )? otherlv_2= 'transition' ( (lv_moe_3_0= ruleTransitionMoe ) )? ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? ( (otherlv_6= '{' ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )? otherlv_16= '}' (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )? ) | (otherlv_20= '-->' ( ( ruleESUfid ) ) ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' ) ) ) )
+            // InternalFormalML.g:20104:3: () ( (lv_transient_1_0= 'transient' ) )? otherlv_2= 'transition' ( (lv_moe_3_0= ruleTransitionMoe ) )? ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )? ( (otherlv_6= '{' ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )? otherlv_16= '}' (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )? ) | (otherlv_20= '-->' ( ( ruleESUfid ) ) ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' ) ) )
+            {
+            // InternalFormalML.g:20104:3: ()
+            // InternalFormalML.g:20105:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getTransitionAccess().getTransitionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:20114:3: ( (lv_transient_1_0= 'transient' ) )?
+            int alt456=2;
+            int LA456_0 = input.LA(1);
+
+            if ( (LA456_0==131) ) {
+                alt456=1;
+            }
+            switch (alt456) {
+                case 1 :
+                    // InternalFormalML.g:20115:4: (lv_transient_1_0= 'transient' )
+                    {
+                    // InternalFormalML.g:20115:4: (lv_transient_1_0= 'transient' )
+                    // InternalFormalML.g:20116:5: lv_transient_1_0= 'transient'
+                    {
+                    lv_transient_1_0=(Token)match(input,131,FollowSets000.FOLLOW_186); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(lv_transient_1_0, grammarAccess.getTransitionAccess().getTransientTransientKeyword_1_0());
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getTransitionRule());
+                      					}
+                      					setWithLastConsumed(current, "transient", true, "transient");
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_2=(Token)match(input,140,FollowSets000.FOLLOW_187); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getTransitionAccess().getTransitionKeyword_2());
+              		
+            }
+            // InternalFormalML.g:20132:3: ( (lv_moe_3_0= ruleTransitionMoe ) )?
+            int alt457=2;
+            int LA457_0 = input.LA(1);
+
+            if ( (LA457_0==16) ) {
+                alt457=1;
+            }
+            switch (alt457) {
+                case 1 :
+                    // InternalFormalML.g:20133:4: (lv_moe_3_0= ruleTransitionMoe )
+                    {
+                    // InternalFormalML.g:20133:4: (lv_moe_3_0= ruleTransitionMoe )
+                    // InternalFormalML.g:20134:5: lv_moe_3_0= ruleTransitionMoe
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getTransitionAccess().getMoeTransitionMoeParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_188);
+                    lv_moe_3_0=ruleTransitionMoe();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getTransitionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"moe",
+                      						lv_moe_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.TransitionMoe");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:20151:3: ( ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )? )?
+            int alt459=2;
+            int LA459_0 = input.LA(1);
+
+            if ( (LA459_0==RULE_XLIA_ID) ) {
+                alt459=1;
+            }
+            switch (alt459) {
+                case 1 :
+                    // InternalFormalML.g:20152:4: ( (lv_name_4_0= ruleESIdentifier ) ) ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )?
+                    {
+                    // InternalFormalML.g:20152:4: ( (lv_name_4_0= ruleESIdentifier ) )
+                    // InternalFormalML.g:20153:5: (lv_name_4_0= ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:20153:5: (lv_name_4_0= ruleESIdentifier )
+                    // InternalFormalML.g:20154:6: lv_name_4_0= ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getTransitionAccess().getNameESIdentifierParserRuleCall_4_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_189);
+                    lv_name_4_0=ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getTransitionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"name",
+                      							lv_name_4_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:20171:4: ( (lv_unrestrictedName_5_0= ruleUnrestrictedName ) )?
+                    int alt458=2;
+                    int LA458_0 = input.LA(1);
+
+                    if ( (LA458_0==RULE_STRING) ) {
+                        alt458=1;
+                    }
+                    switch (alt458) {
+                        case 1 :
+                            // InternalFormalML.g:20172:5: (lv_unrestrictedName_5_0= ruleUnrestrictedName )
+                            {
+                            // InternalFormalML.g:20172:5: (lv_unrestrictedName_5_0= ruleUnrestrictedName )
+                            // InternalFormalML.g:20173:6: lv_unrestrictedName_5_0= ruleUnrestrictedName
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getTransitionAccess().getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_47);
+                            lv_unrestrictedName_5_0=ruleUnrestrictedName();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getTransitionRule());
+                              						}
+                              						set(
+                              							current,
+                              							"unrestrictedName",
+                              							lv_unrestrictedName_5_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:20191:3: ( (otherlv_6= '{' ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )? otherlv_16= '}' (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )? ) | (otherlv_20= '-->' ( ( ruleESUfid ) ) ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' ) ) )
+            int alt474=2;
+            int LA474_0 = input.LA(1);
+
+            if ( (LA474_0==22) ) {
+                alt474=1;
+            }
+            else if ( (LA474_0==59) ) {
+                alt474=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 474, 0, input);
+
+                throw nvae;
+            }
+            switch (alt474) {
+                case 1 :
+                    // InternalFormalML.g:20192:4: (otherlv_6= '{' ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )? otherlv_16= '}' (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )? )
+                    {
+                    // InternalFormalML.g:20192:4: (otherlv_6= '{' ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )? otherlv_16= '}' (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )? )
+                    // InternalFormalML.g:20193:5: otherlv_6= '{' ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )? otherlv_16= '}' (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )?
+                    {
+                    otherlv_6=(Token)match(input,22,FollowSets000.FOLLOW_190); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:20197:5: ( ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )?
+                    int alt465=3;
+                    switch ( input.LA(1) ) {
+                        case 141:
+                        case 142:
+                        case 143:
+                        case 144:
+                        case 148:
+                        case 151:
+                            {
+                            alt465=1;
+                            }
+                            break;
+                        case RULE_XLIA_ID:
+                        case 22:
+                        case 56:
+                        case 61:
+                        case 63:
+                        case 64:
+                        case 85:
+                        case 87:
+                        case 152:
+                        case 153:
+                        case 154:
+                        case 155:
+                        case 156:
+                        case 157:
+                        case 158:
+                        case 159:
+                        case 160:
+                        case 161:
+                        case 162:
+                        case 163:
+                        case 164:
+                        case 165:
+                        case 166:
+                        case 167:
+                        case 168:
+                        case 169:
+                        case 170:
+                        case 171:
+                        case 176:
+                        case 178:
+                        case 179:
+                        case 180:
+                        case 181:
+                        case 182:
+                        case 216:
+                        case 217:
+                        case 218:
+                        case 219:
+                        case 231:
+                        case 232:
+                        case 233:
+                        case 234:
+                        case 235:
+                        case 236:
+                        case 237:
+                        case 238:
+                        case 239:
+                        case 271:
+                        case 272:
+                        case 273:
+                        case 274:
+                        case 275:
+                        case 276:
+                        case 277:
+                        case 278:
+                        case 279:
+                        case 280:
+                        case 281:
+                        case 282:
+                        case 283:
+                        case 284:
+                        case 285:
+                        case 286:
+                        case 287:
+                            {
+                            alt465=2;
+                            }
+                            break;
+                        case 23:
+                            {
+                            int LA465_3 = input.LA(2);
+
+                            if ( (synpred714_InternalFormalML()) ) {
+                                alt465=2;
+                            }
+                            }
+                            break;
+                    }
+
+                    switch (alt465) {
+                        case 1 :
+                            // InternalFormalML.g:20198:6: ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? )
+                            {
+                            // InternalFormalML.g:20198:6: ( (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )? )
+                            // InternalFormalML.g:20199:7: (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )? ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )? otherlv_13= '@effect:' ( (lv_effect_14_0= ruleTransitionEffect ) )?
+                            {
+                            // InternalFormalML.g:20199:7: (otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )* )?
+                            int alt461=2;
+                            int LA461_0 = input.LA(1);
+
+                            if ( (LA461_0==141) ) {
+                                alt461=1;
+                            }
+                            switch (alt461) {
+                                case 1 :
+                                    // InternalFormalML.g:20200:8: otherlv_7= '@trigger:' ( (lv_trigger_8_0= ruleTransitionTrigger ) )*
+                                    {
+                                    otherlv_7=(Token)match(input,141,FollowSets000.FOLLOW_191); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								newLeafNode(otherlv_7, grammarAccess.getTransitionAccess().getTriggerKeyword_5_0_1_0_0_0());
+                                      							
+                                    }
+                                    // InternalFormalML.g:20204:8: ( (lv_trigger_8_0= ruleTransitionTrigger ) )*
+                                    loop460:
+                                    do {
+                                        int alt460=2;
+                                        int LA460_0 = input.LA(1);
+
+                                        if ( (LA460_0==61) ) {
+                                            alt460=1;
+                                        }
+
+
+                                        switch (alt460) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:20205:9: (lv_trigger_8_0= ruleTransitionTrigger )
+                                    	    {
+                                    	    // InternalFormalML.g:20205:9: (lv_trigger_8_0= ruleTransitionTrigger )
+                                    	    // InternalFormalML.g:20206:10: lv_trigger_8_0= ruleTransitionTrigger
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										newCompositeNode(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_0_1_0_0_1_0());
+                                    	      									
+                                    	    }
+                                    	    pushFollow(FollowSets000.FOLLOW_191);
+                                    	    lv_trigger_8_0=ruleTransitionTrigger();
+
+                                    	    state._fsp--;
+                                    	    if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										if (current==null) {
+                                    	      											current = createModelElementForParent(grammarAccess.getTransitionRule());
+                                    	      										}
+                                    	      										add(
+                                    	      											current,
+                                    	      											"trigger",
+                                    	      											lv_trigger_8_0,
+                                    	      											"org.eclipse.efm.formalml.xtext.FormalML.TransitionTrigger");
+                                    	      										afterParserOrEnumRuleCall();
+                                    	      									
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop460;
+                                        }
+                                    } while (true);
+
+
+                                    }
+                                    break;
+
+                            }
+
+                            // InternalFormalML.g:20224:7: ( ( (lv_guard_9_0= ruleTransitionGuard ) ) | otherlv_10= '@guard:' )?
+                            int alt462=3;
+                            int LA462_0 = input.LA(1);
+
+                            if ( (LA462_0==148) ) {
+                                alt462=1;
+                            }
+                            else if ( (LA462_0==142) ) {
+                                int LA462_2 = input.LA(2);
+
+                                if ( ((LA462_2>=143 && LA462_2<=144)||LA462_2==151) ) {
+                                    alt462=2;
+                                }
+                                else if ( ((LA462_2>=RULE_XLIA_ID && LA462_2<=RULE_STRING)||LA462_2==16||LA462_2==22||(LA462_2>=26 && LA462_2<=29)||LA462_2==56||LA462_2==97||LA462_2==168||(LA462_2>=170 && LA462_2<=171)||LA462_2==212||(LA462_2>=216 && LA462_2<=224)||(LA462_2>=227 && LA462_2<=239)) ) {
+                                    alt462=1;
+                                }
+                            }
+                            switch (alt462) {
+                                case 1 :
+                                    // InternalFormalML.g:20225:8: ( (lv_guard_9_0= ruleTransitionGuard ) )
+                                    {
+                                    // InternalFormalML.g:20225:8: ( (lv_guard_9_0= ruleTransitionGuard ) )
+                                    // InternalFormalML.g:20226:9: (lv_guard_9_0= ruleTransitionGuard )
+                                    {
+                                    // InternalFormalML.g:20226:9: (lv_guard_9_0= ruleTransitionGuard )
+                                    // InternalFormalML.g:20227:10: lv_guard_9_0= ruleTransitionGuard
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      										newCompositeNode(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_0_1_0_1_0_0());
+                                      									
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_192);
+                                    lv_guard_9_0=ruleTransitionGuard();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      										if (current==null) {
+                                      											current = createModelElementForParent(grammarAccess.getTransitionRule());
+                                      										}
+                                      										set(
+                                      											current,
+                                      											"guard",
+                                      											lv_guard_9_0,
+                                      											"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuard");
+                                      										afterParserOrEnumRuleCall();
+                                      									
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:20245:8: otherlv_10= '@guard:'
+                                    {
+                                    otherlv_10=(Token)match(input,142,FollowSets000.FOLLOW_192); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								newLeafNode(otherlv_10, grammarAccess.getTransitionAccess().getGuardKeyword_5_0_1_0_1_1());
+                                      							
+                                    }
+
+                                    }
+                                    break;
+
+                            }
+
+                            // InternalFormalML.g:20250:7: ( ( (lv_tguard_11_0= ruleTransitionTimedGuard ) ) | otherlv_12= '@tguard:' )?
+                            int alt463=3;
+                            int LA463_0 = input.LA(1);
+
+                            if ( (LA463_0==151) ) {
+                                alt463=1;
+                            }
+                            else if ( (LA463_0==143) ) {
+                                int LA463_2 = input.LA(2);
+
+                                if ( (LA463_2==144) ) {
+                                    alt463=2;
+                                }
+                                else if ( ((LA463_2>=RULE_XLIA_ID && LA463_2<=RULE_STRING)||LA463_2==16||LA463_2==22||(LA463_2>=26 && LA463_2<=29)||LA463_2==56||LA463_2==169||LA463_2==212||(LA463_2>=216 && LA463_2<=224)||(LA463_2>=227 && LA463_2<=239)) ) {
+                                    alt463=1;
+                                }
+                            }
+                            switch (alt463) {
+                                case 1 :
+                                    // InternalFormalML.g:20251:8: ( (lv_tguard_11_0= ruleTransitionTimedGuard ) )
+                                    {
+                                    // InternalFormalML.g:20251:8: ( (lv_tguard_11_0= ruleTransitionTimedGuard ) )
+                                    // InternalFormalML.g:20252:9: (lv_tguard_11_0= ruleTransitionTimedGuard )
+                                    {
+                                    // InternalFormalML.g:20252:9: (lv_tguard_11_0= ruleTransitionTimedGuard )
+                                    // InternalFormalML.g:20253:10: lv_tguard_11_0= ruleTransitionTimedGuard
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      										newCompositeNode(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_0_1_0_2_0_0());
+                                      									
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_193);
+                                    lv_tguard_11_0=ruleTransitionTimedGuard();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      										if (current==null) {
+                                      											current = createModelElementForParent(grammarAccess.getTransitionRule());
+                                      										}
+                                      										set(
+                                      											current,
+                                      											"tguard",
+                                      											lv_tguard_11_0,
+                                      											"org.eclipse.efm.formalml.xtext.FormalML.TransitionTimedGuard");
+                                      										afterParserOrEnumRuleCall();
+                                      									
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:20271:8: otherlv_12= '@tguard:'
+                                    {
+                                    otherlv_12=(Token)match(input,143,FollowSets000.FOLLOW_193); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								newLeafNode(otherlv_12, grammarAccess.getTransitionAccess().getTguardKeyword_5_0_1_0_2_1());
+                                      							
+                                    }
+
+                                    }
+                                    break;
+
+                            }
+
+                            otherlv_13=(Token)match(input,144,FollowSets000.FOLLOW_194); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(otherlv_13, grammarAccess.getTransitionAccess().getEffectKeyword_5_0_1_0_3());
+                              						
+                            }
+                            // InternalFormalML.g:20280:7: ( (lv_effect_14_0= ruleTransitionEffect ) )?
+                            int alt464=2;
+                            int LA464_0 = input.LA(1);
+
+                            if ( (LA464_0==RULE_XLIA_ID||LA464_0==56||(LA464_0>=63 && LA464_0<=64)||LA464_0==85||LA464_0==87||LA464_0==176||(LA464_0>=178 && LA464_0<=182)||(LA464_0>=216 && LA464_0<=219)||(LA464_0>=231 && LA464_0<=239)||(LA464_0>=271 && LA464_0<=287)) ) {
+                                alt464=1;
+                            }
+                            switch (alt464) {
+                                case 1 :
+                                    // InternalFormalML.g:20281:8: (lv_effect_14_0= ruleTransitionEffect )
+                                    {
+                                    // InternalFormalML.g:20281:8: (lv_effect_14_0= ruleTransitionEffect )
+                                    // InternalFormalML.g:20282:9: lv_effect_14_0= ruleTransitionEffect
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_0_1_0_4_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_33);
+                                    lv_effect_14_0=ruleTransitionEffect();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getTransitionRule());
+                                      									}
+                                      									set(
+                                      										current,
+                                      										"effect",
+                                      										lv_effect_14_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.TransitionEffect");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:20301:6: ( (lv_behavior_15_0= ruleTransitionBehavior ) )
+                            {
+                            // InternalFormalML.g:20301:6: ( (lv_behavior_15_0= ruleTransitionBehavior ) )
+                            // InternalFormalML.g:20302:7: (lv_behavior_15_0= ruleTransitionBehavior )
+                            {
+                            // InternalFormalML.g:20302:7: (lv_behavior_15_0= ruleTransitionBehavior )
+                            // InternalFormalML.g:20303:8: lv_behavior_15_0= ruleTransitionBehavior
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_33);
+                            lv_behavior_15_0=ruleTransitionBehavior();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getTransitionRule());
+                              								}
+                              								set(
+                              									current,
+                              									"behavior",
+                              									lv_behavior_15_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.TransitionBehavior");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_16=(Token)match(input,23,FollowSets000.FOLLOW_195); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_16, grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_0_2());
+                      				
+                    }
+                    // InternalFormalML.g:20325:5: (otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';' )?
+                    int alt466=2;
+                    int LA466_0 = input.LA(1);
+
+                    if ( (LA466_0==59) ) {
+                        alt466=1;
+                    }
+                    switch (alt466) {
+                        case 1 :
+                            // InternalFormalML.g:20326:6: otherlv_17= '-->' ( ( ruleESUfid ) ) otherlv_19= ';'
+                            {
+                            otherlv_17=(Token)match(input,59,FollowSets000.FOLLOW_35); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_17, grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_0_3_0());
+                              					
+                            }
+                            // InternalFormalML.g:20330:6: ( ( ruleESUfid ) )
+                            // InternalFormalML.g:20331:7: ( ruleESUfid )
+                            {
+                            // InternalFormalML.g:20331:7: ( ruleESUfid )
+                            // InternalFormalML.g:20332:8: ruleESUfid
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								/* */
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getTransitionRule());
+                              								}
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_0_3_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_14);
+                            ruleESUfid();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_19=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_19, grammarAccess.getTransitionAccess().getSemicolonKeyword_5_0_3_2());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:20356:4: (otherlv_20= '-->' ( ( ruleESUfid ) ) ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' ) )
+                    {
+                    // InternalFormalML.g:20356:4: (otherlv_20= '-->' ( ( ruleESUfid ) ) ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' ) )
+                    // InternalFormalML.g:20357:5: otherlv_20= '-->' ( ( ruleESUfid ) ) ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' )
+                    {
+                    otherlv_20=(Token)match(input,59,FollowSets000.FOLLOW_35); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_20, grammarAccess.getTransitionAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:20361:5: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:20362:6: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:20362:6: ( ruleESUfid )
+                    // InternalFormalML.g:20363:7: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							/* */
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElement(grammarAccess.getTransitionRule());
+                      							}
+                      						
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getTransitionAccess().getTargetNamedElementCrossReference_5_1_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_77);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:20380:5: ( (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' ) | otherlv_33= ';' )
+                    int alt473=2;
+                    int LA473_0 = input.LA(1);
+
+                    if ( (LA473_0==22) ) {
+                        alt473=1;
+                    }
+                    else if ( (LA473_0==25) ) {
+                        alt473=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 473, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt473) {
+                        case 1 :
+                            // InternalFormalML.g:20381:6: (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' )
+                            {
+                            // InternalFormalML.g:20381:6: (otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}' )
+                            // InternalFormalML.g:20382:7: otherlv_22= '{' ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )? otherlv_32= '}'
+                            {
+                            otherlv_22=(Token)match(input,22,FollowSets000.FOLLOW_190); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(otherlv_22, grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_1_2_0_0());
+                              						
+                            }
+                            // InternalFormalML.g:20386:7: ( ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? ) | ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )?
+                            int alt472=3;
+                            switch ( input.LA(1) ) {
+                                case 141:
+                                case 142:
+                                case 143:
+                                case 144:
+                                case 148:
+                                case 151:
+                                    {
+                                    alt472=1;
+                                    }
+                                    break;
+                                case RULE_XLIA_ID:
+                                case 22:
+                                case 56:
+                                case 61:
+                                case 63:
+                                case 64:
+                                case 85:
+                                case 87:
+                                case 152:
+                                case 153:
+                                case 154:
+                                case 155:
+                                case 156:
+                                case 157:
+                                case 158:
+                                case 159:
+                                case 160:
+                                case 161:
+                                case 162:
+                                case 163:
+                                case 164:
+                                case 165:
+                                case 166:
+                                case 167:
+                                case 168:
+                                case 169:
+                                case 170:
+                                case 171:
+                                case 176:
+                                case 178:
+                                case 179:
+                                case 180:
+                                case 181:
+                                case 182:
+                                case 216:
+                                case 217:
+                                case 218:
+                                case 219:
+                                case 231:
+                                case 232:
+                                case 233:
+                                case 234:
+                                case 235:
+                                case 236:
+                                case 237:
+                                case 238:
+                                case 239:
+                                case 271:
+                                case 272:
+                                case 273:
+                                case 274:
+                                case 275:
+                                case 276:
+                                case 277:
+                                case 278:
+                                case 279:
+                                case 280:
+                                case 281:
+                                case 282:
+                                case 283:
+                                case 284:
+                                case 285:
+                                case 286:
+                                case 287:
+                                    {
+                                    alt472=2;
+                                    }
+                                    break;
+                                case 23:
+                                    {
+                                    int LA472_3 = input.LA(2);
+
+                                    if ( (synpred725_InternalFormalML()) ) {
+                                        alt472=2;
+                                    }
+                                    }
+                                    break;
+                            }
+
+                            switch (alt472) {
+                                case 1 :
+                                    // InternalFormalML.g:20387:8: ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? )
+                                    {
+                                    // InternalFormalML.g:20387:8: ( (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )? )
+                                    // InternalFormalML.g:20388:9: (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )? ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )? ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )? otherlv_29= '@effect:' ( (lv_effect_30_0= ruleTransitionEffect ) )?
+                                    {
+                                    // InternalFormalML.g:20388:9: (otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )* )?
+                                    int alt468=2;
+                                    int LA468_0 = input.LA(1);
+
+                                    if ( (LA468_0==141) ) {
+                                        alt468=1;
+                                    }
+                                    switch (alt468) {
+                                        case 1 :
+                                            // InternalFormalML.g:20389:10: otherlv_23= '@trigger:' ( (lv_trigger_24_0= ruleTransitionTrigger ) )*
+                                            {
+                                            otherlv_23=(Token)match(input,141,FollowSets000.FOLLOW_191); if (state.failed) return current;
+                                            if ( state.backtracking==0 ) {
+
+                                              										newLeafNode(otherlv_23, grammarAccess.getTransitionAccess().getTriggerKeyword_5_1_2_0_1_0_0_0());
+                                              									
+                                            }
+                                            // InternalFormalML.g:20393:10: ( (lv_trigger_24_0= ruleTransitionTrigger ) )*
+                                            loop467:
+                                            do {
+                                                int alt467=2;
+                                                int LA467_0 = input.LA(1);
+
+                                                if ( (LA467_0==61) ) {
+                                                    alt467=1;
+                                                }
+
+
+                                                switch (alt467) {
+                                            	case 1 :
+                                            	    // InternalFormalML.g:20394:11: (lv_trigger_24_0= ruleTransitionTrigger )
+                                            	    {
+                                            	    // InternalFormalML.g:20394:11: (lv_trigger_24_0= ruleTransitionTrigger )
+                                            	    // InternalFormalML.g:20395:12: lv_trigger_24_0= ruleTransitionTrigger
+                                            	    {
+                                            	    if ( state.backtracking==0 ) {
+
+                                            	      												newCompositeNode(grammarAccess.getTransitionAccess().getTriggerTransitionTriggerParserRuleCall_5_1_2_0_1_0_0_1_0());
+                                            	      											
+                                            	    }
+                                            	    pushFollow(FollowSets000.FOLLOW_191);
+                                            	    lv_trigger_24_0=ruleTransitionTrigger();
+
+                                            	    state._fsp--;
+                                            	    if (state.failed) return current;
+                                            	    if ( state.backtracking==0 ) {
+
+                                            	      												if (current==null) {
+                                            	      													current = createModelElementForParent(grammarAccess.getTransitionRule());
+                                            	      												}
+                                            	      												add(
+                                            	      													current,
+                                            	      													"trigger",
+                                            	      													lv_trigger_24_0,
+                                            	      													"org.eclipse.efm.formalml.xtext.FormalML.TransitionTrigger");
+                                            	      												afterParserOrEnumRuleCall();
+                                            	      											
+                                            	    }
+
+                                            	    }
+
+
+                                            	    }
+                                            	    break;
+
+                                            	default :
+                                            	    break loop467;
+                                                }
+                                            } while (true);
+
+
+                                            }
+                                            break;
+
+                                    }
+
+                                    // InternalFormalML.g:20413:9: ( ( (lv_guard_25_0= ruleTransitionGuard ) ) | otherlv_26= '@guard:' )?
+                                    int alt469=3;
+                                    int LA469_0 = input.LA(1);
+
+                                    if ( (LA469_0==148) ) {
+                                        alt469=1;
+                                    }
+                                    else if ( (LA469_0==142) ) {
+                                        int LA469_2 = input.LA(2);
+
+                                        if ( ((LA469_2>=RULE_XLIA_ID && LA469_2<=RULE_STRING)||LA469_2==16||LA469_2==22||(LA469_2>=26 && LA469_2<=29)||LA469_2==56||LA469_2==97||LA469_2==168||(LA469_2>=170 && LA469_2<=171)||LA469_2==212||(LA469_2>=216 && LA469_2<=224)||(LA469_2>=227 && LA469_2<=239)) ) {
+                                            alt469=1;
+                                        }
+                                        else if ( ((LA469_2>=143 && LA469_2<=144)||LA469_2==151) ) {
+                                            alt469=2;
+                                        }
+                                    }
+                                    switch (alt469) {
+                                        case 1 :
+                                            // InternalFormalML.g:20414:10: ( (lv_guard_25_0= ruleTransitionGuard ) )
+                                            {
+                                            // InternalFormalML.g:20414:10: ( (lv_guard_25_0= ruleTransitionGuard ) )
+                                            // InternalFormalML.g:20415:11: (lv_guard_25_0= ruleTransitionGuard )
+                                            {
+                                            // InternalFormalML.g:20415:11: (lv_guard_25_0= ruleTransitionGuard )
+                                            // InternalFormalML.g:20416:12: lv_guard_25_0= ruleTransitionGuard
+                                            {
+                                            if ( state.backtracking==0 ) {
+
+                                              												newCompositeNode(grammarAccess.getTransitionAccess().getGuardTransitionGuardParserRuleCall_5_1_2_0_1_0_1_0_0());
+                                              											
+                                            }
+                                            pushFollow(FollowSets000.FOLLOW_192);
+                                            lv_guard_25_0=ruleTransitionGuard();
+
+                                            state._fsp--;
+                                            if (state.failed) return current;
+                                            if ( state.backtracking==0 ) {
+
+                                              												if (current==null) {
+                                              													current = createModelElementForParent(grammarAccess.getTransitionRule());
+                                              												}
+                                              												set(
+                                              													current,
+                                              													"guard",
+                                              													lv_guard_25_0,
+                                              													"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuard");
+                                              												afterParserOrEnumRuleCall();
+                                              											
+                                            }
+
+                                            }
+
+
+                                            }
+
+
+                                            }
+                                            break;
+                                        case 2 :
+                                            // InternalFormalML.g:20434:10: otherlv_26= '@guard:'
+                                            {
+                                            otherlv_26=(Token)match(input,142,FollowSets000.FOLLOW_192); if (state.failed) return current;
+                                            if ( state.backtracking==0 ) {
+
+                                              										newLeafNode(otherlv_26, grammarAccess.getTransitionAccess().getGuardKeyword_5_1_2_0_1_0_1_1());
+                                              									
+                                            }
+
+                                            }
+                                            break;
+
+                                    }
+
+                                    // InternalFormalML.g:20439:9: ( ( (lv_tguard_27_0= ruleTransitionTimedGuard ) ) | otherlv_28= '@tguard:' )?
+                                    int alt470=3;
+                                    int LA470_0 = input.LA(1);
+
+                                    if ( (LA470_0==151) ) {
+                                        alt470=1;
+                                    }
+                                    else if ( (LA470_0==143) ) {
+                                        int LA470_2 = input.LA(2);
+
+                                        if ( (LA470_2==144) ) {
+                                            alt470=2;
+                                        }
+                                        else if ( ((LA470_2>=RULE_XLIA_ID && LA470_2<=RULE_STRING)||LA470_2==16||LA470_2==22||(LA470_2>=26 && LA470_2<=29)||LA470_2==56||LA470_2==169||LA470_2==212||(LA470_2>=216 && LA470_2<=224)||(LA470_2>=227 && LA470_2<=239)) ) {
+                                            alt470=1;
+                                        }
+                                    }
+                                    switch (alt470) {
+                                        case 1 :
+                                            // InternalFormalML.g:20440:10: ( (lv_tguard_27_0= ruleTransitionTimedGuard ) )
+                                            {
+                                            // InternalFormalML.g:20440:10: ( (lv_tguard_27_0= ruleTransitionTimedGuard ) )
+                                            // InternalFormalML.g:20441:11: (lv_tguard_27_0= ruleTransitionTimedGuard )
+                                            {
+                                            // InternalFormalML.g:20441:11: (lv_tguard_27_0= ruleTransitionTimedGuard )
+                                            // InternalFormalML.g:20442:12: lv_tguard_27_0= ruleTransitionTimedGuard
+                                            {
+                                            if ( state.backtracking==0 ) {
+
+                                              												newCompositeNode(grammarAccess.getTransitionAccess().getTguardTransitionTimedGuardParserRuleCall_5_1_2_0_1_0_2_0_0());
+                                              											
+                                            }
+                                            pushFollow(FollowSets000.FOLLOW_193);
+                                            lv_tguard_27_0=ruleTransitionTimedGuard();
+
+                                            state._fsp--;
+                                            if (state.failed) return current;
+                                            if ( state.backtracking==0 ) {
+
+                                              												if (current==null) {
+                                              													current = createModelElementForParent(grammarAccess.getTransitionRule());
+                                              												}
+                                              												set(
+                                              													current,
+                                              													"tguard",
+                                              													lv_tguard_27_0,
+                                              													"org.eclipse.efm.formalml.xtext.FormalML.TransitionTimedGuard");
+                                              												afterParserOrEnumRuleCall();
+                                              											
+                                            }
+
+                                            }
+
+
+                                            }
+
+
+                                            }
+                                            break;
+                                        case 2 :
+                                            // InternalFormalML.g:20460:10: otherlv_28= '@tguard:'
+                                            {
+                                            otherlv_28=(Token)match(input,143,FollowSets000.FOLLOW_193); if (state.failed) return current;
+                                            if ( state.backtracking==0 ) {
+
+                                              										newLeafNode(otherlv_28, grammarAccess.getTransitionAccess().getTguardKeyword_5_1_2_0_1_0_2_1());
+                                              									
+                                            }
+
+                                            }
+                                            break;
+
+                                    }
+
+                                    otherlv_29=(Token)match(input,144,FollowSets000.FOLLOW_194); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									newLeafNode(otherlv_29, grammarAccess.getTransitionAccess().getEffectKeyword_5_1_2_0_1_0_3());
+                                      								
+                                    }
+                                    // InternalFormalML.g:20469:9: ( (lv_effect_30_0= ruleTransitionEffect ) )?
+                                    int alt471=2;
+                                    int LA471_0 = input.LA(1);
+
+                                    if ( (LA471_0==RULE_XLIA_ID||LA471_0==56||(LA471_0>=63 && LA471_0<=64)||LA471_0==85||LA471_0==87||LA471_0==176||(LA471_0>=178 && LA471_0<=182)||(LA471_0>=216 && LA471_0<=219)||(LA471_0>=231 && LA471_0<=239)||(LA471_0>=271 && LA471_0<=287)) ) {
+                                        alt471=1;
+                                    }
+                                    switch (alt471) {
+                                        case 1 :
+                                            // InternalFormalML.g:20470:10: (lv_effect_30_0= ruleTransitionEffect )
+                                            {
+                                            // InternalFormalML.g:20470:10: (lv_effect_30_0= ruleTransitionEffect )
+                                            // InternalFormalML.g:20471:11: lv_effect_30_0= ruleTransitionEffect
+                                            {
+                                            if ( state.backtracking==0 ) {
+
+                                              											newCompositeNode(grammarAccess.getTransitionAccess().getEffectTransitionEffectParserRuleCall_5_1_2_0_1_0_4_0());
+                                              										
+                                            }
+                                            pushFollow(FollowSets000.FOLLOW_33);
+                                            lv_effect_30_0=ruleTransitionEffect();
+
+                                            state._fsp--;
+                                            if (state.failed) return current;
+                                            if ( state.backtracking==0 ) {
+
+                                              											if (current==null) {
+                                              												current = createModelElementForParent(grammarAccess.getTransitionRule());
+                                              											}
+                                              											set(
+                                              												current,
+                                              												"effect",
+                                              												lv_effect_30_0,
+                                              												"org.eclipse.efm.formalml.xtext.FormalML.TransitionEffect");
+                                              											afterParserOrEnumRuleCall();
+                                              										
+                                            }
+
+                                            }
+
+
+                                            }
+                                            break;
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:20490:8: ( (lv_behavior_31_0= ruleTransitionBehavior ) )
+                                    {
+                                    // InternalFormalML.g:20490:8: ( (lv_behavior_31_0= ruleTransitionBehavior ) )
+                                    // InternalFormalML.g:20491:9: (lv_behavior_31_0= ruleTransitionBehavior )
+                                    {
+                                    // InternalFormalML.g:20491:9: (lv_behavior_31_0= ruleTransitionBehavior )
+                                    // InternalFormalML.g:20492:10: lv_behavior_31_0= ruleTransitionBehavior
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      										newCompositeNode(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0());
+                                      									
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_33);
+                                    lv_behavior_31_0=ruleTransitionBehavior();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      										if (current==null) {
+                                      											current = createModelElementForParent(grammarAccess.getTransitionRule());
+                                      										}
+                                      										set(
+                                      											current,
+                                      											"behavior",
+                                      											lv_behavior_31_0,
+                                      											"org.eclipse.efm.formalml.xtext.FormalML.TransitionBehavior");
+                                      										afterParserOrEnumRuleCall();
+                                      									
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+                            otherlv_32=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(otherlv_32, grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_1_2_0_2());
+                              						
+                            }
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:20516:6: otherlv_33= ';'
+                            {
+                            otherlv_33=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_33, grammarAccess.getTransitionAccess().getSemicolonKeyword_5_1_2_1());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransition"
+
+
+    // $ANTLR start "entryRuleTransitionMoe"
+    // InternalFormalML.g:20527:1: entryRuleTransitionMoe returns [EObject current=null] : iv_ruleTransitionMoe= ruleTransitionMoe EOF ;
+    public final EObject entryRuleTransitionMoe() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransitionMoe = null;
+
+
+        try {
+            // InternalFormalML.g:20527:54: (iv_ruleTransitionMoe= ruleTransitionMoe EOF )
+            // InternalFormalML.g:20528:2: iv_ruleTransitionMoe= ruleTransitionMoe EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTransitionMoeRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTransitionMoe=ruleTransitionMoe();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTransitionMoe; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransitionMoe"
+
+
+    // $ANTLR start "ruleTransitionMoe"
+    // InternalFormalML.g:20534:1: ruleTransitionMoe returns [EObject current=null] : (otherlv_0= '<' ( ( (otherlv_1= 'moc:' )? ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) ) (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )? ) | ( (otherlv_9= 'prior:' )? ( (lv_prior_10_0= ruleEInt ) ) ) ) otherlv_11= '>' ) ;
+    public final EObject ruleTransitionMoe() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token lv_isElse_4_0=null;
+        Token lv_isElse_5_0=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Enumerator lv_moc_2_0 = null;
+
+        AntlrDatatypeRuleToken lv_prior_8_0 = null;
+
+        AntlrDatatypeRuleToken lv_prior_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:20540:2: ( (otherlv_0= '<' ( ( (otherlv_1= 'moc:' )? ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) ) (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )? ) | ( (otherlv_9= 'prior:' )? ( (lv_prior_10_0= ruleEInt ) ) ) ) otherlv_11= '>' ) )
+            // InternalFormalML.g:20541:2: (otherlv_0= '<' ( ( (otherlv_1= 'moc:' )? ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) ) (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )? ) | ( (otherlv_9= 'prior:' )? ( (lv_prior_10_0= ruleEInt ) ) ) ) otherlv_11= '>' )
+            {
+            // InternalFormalML.g:20541:2: (otherlv_0= '<' ( ( (otherlv_1= 'moc:' )? ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) ) (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )? ) | ( (otherlv_9= 'prior:' )? ( (lv_prior_10_0= ruleEInt ) ) ) ) otherlv_11= '>' )
+            // InternalFormalML.g:20542:3: otherlv_0= '<' ( ( (otherlv_1= 'moc:' )? ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) ) (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )? ) | ( (otherlv_9= 'prior:' )? ( (lv_prior_10_0= ruleEInt ) ) ) ) otherlv_11= '>'
+            {
+            otherlv_0=(Token)match(input,16,FollowSets000.FOLLOW_196); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getTransitionMoeAccess().getLessThanSignKeyword_0());
+              		
+            }
+            // InternalFormalML.g:20546:3: ( ( (otherlv_1= 'moc:' )? ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) ) (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )? ) | ( (otherlv_9= 'prior:' )? ( (lv_prior_10_0= ruleEInt ) ) ) )
+            int alt481=2;
+            int LA481_0 = input.LA(1);
+
+            if ( (LA481_0==34||LA481_0==84||LA481_0==87||LA481_0==146||LA481_0==271) ) {
+                alt481=1;
+            }
+            else if ( (LA481_0==RULE_INT||LA481_0==28||LA481_0==147) ) {
+                alt481=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 481, 0, input);
+
+                throw nvae;
+            }
+            switch (alt481) {
+                case 1 :
+                    // InternalFormalML.g:20547:4: ( (otherlv_1= 'moc:' )? ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) ) (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )? )
+                    {
+                    // InternalFormalML.g:20547:4: ( (otherlv_1= 'moc:' )? ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) ) (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )? )
+                    // InternalFormalML.g:20548:5: (otherlv_1= 'moc:' )? ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) ) (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )?
+                    {
+                    // InternalFormalML.g:20548:5: (otherlv_1= 'moc:' )?
+                    int alt475=2;
+                    int LA475_0 = input.LA(1);
+
+                    if ( (LA475_0==34) ) {
+                        alt475=1;
+                    }
+                    switch (alt475) {
+                        case 1 :
+                            // InternalFormalML.g:20549:6: otherlv_1= 'moc:'
+                            {
+                            otherlv_1=(Token)match(input,34,FollowSets000.FOLLOW_197); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_1, grammarAccess.getTransitionMoeAccess().getMocKeyword_1_0_0());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:20554:5: ( ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? ) | ( (lv_isElse_5_0= 'else' ) ) )
+                    int alt477=2;
+                    int LA477_0 = input.LA(1);
+
+                    if ( (LA477_0==84||LA477_0==87||LA477_0==271) ) {
+                        alt477=1;
+                    }
+                    else if ( (LA477_0==146) ) {
+                        alt477=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 477, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt477) {
+                        case 1 :
+                            // InternalFormalML.g:20555:6: ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? )
+                            {
+                            // InternalFormalML.g:20555:6: ( ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )? )
+                            // InternalFormalML.g:20556:7: ( (lv_moc_2_0= ruleTransitionMoc ) ) (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )?
+                            {
+                            // InternalFormalML.g:20556:7: ( (lv_moc_2_0= ruleTransitionMoc ) )
+                            // InternalFormalML.g:20557:8: (lv_moc_2_0= ruleTransitionMoc )
+                            {
+                            // InternalFormalML.g:20557:8: (lv_moc_2_0= ruleTransitionMoc )
+                            // InternalFormalML.g:20558:9: lv_moc_2_0= ruleTransitionMoc
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              									newCompositeNode(grammarAccess.getTransitionMoeAccess().getMocTransitionMocEnumRuleCall_1_0_1_0_0_0());
+                              								
+                            }
+                            pushFollow(FollowSets000.FOLLOW_198);
+                            lv_moc_2_0=ruleTransitionMoc();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              									if (current==null) {
+                              										current = createModelElementForParent(grammarAccess.getTransitionMoeRule());
+                              									}
+                              									set(
+                              										current,
+                              										"moc",
+                              										lv_moc_2_0,
+                              										"org.eclipse.efm.formalml.xtext.FormalML.TransitionMoc");
+                              									afterParserOrEnumRuleCall();
+                              								
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalFormalML.g:20575:7: (otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) ) )?
+                            int alt476=2;
+                            int LA476_0 = input.LA(1);
+
+                            if ( (LA476_0==145) ) {
+                                alt476=1;
+                            }
+                            switch (alt476) {
+                                case 1 :
+                                    // InternalFormalML.g:20576:8: otherlv_3= '&' ( (lv_isElse_4_0= 'else' ) )
+                                    {
+                                    otherlv_3=(Token)match(input,145,FollowSets000.FOLLOW_199); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								newLeafNode(otherlv_3, grammarAccess.getTransitionMoeAccess().getAmpersandKeyword_1_0_1_0_1_0());
+                                      							
+                                    }
+                                    // InternalFormalML.g:20580:8: ( (lv_isElse_4_0= 'else' ) )
+                                    // InternalFormalML.g:20581:9: (lv_isElse_4_0= 'else' )
+                                    {
+                                    // InternalFormalML.g:20581:9: (lv_isElse_4_0= 'else' )
+                                    // InternalFormalML.g:20582:10: lv_isElse_4_0= 'else'
+                                    {
+                                    lv_isElse_4_0=(Token)match(input,146,FollowSets000.FOLLOW_144); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      										newLeafNode(lv_isElse_4_0, grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_0_1_1_0());
+                                      									
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      										if (current==null) {
+                                      											current = createModelElement(grammarAccess.getTransitionMoeRule());
+                                      										}
+                                      										setWithLastConsumed(current, "isElse", true, "else");
+                                      									
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:20597:6: ( (lv_isElse_5_0= 'else' ) )
+                            {
+                            // InternalFormalML.g:20597:6: ( (lv_isElse_5_0= 'else' ) )
+                            // InternalFormalML.g:20598:7: (lv_isElse_5_0= 'else' )
+                            {
+                            // InternalFormalML.g:20598:7: (lv_isElse_5_0= 'else' )
+                            // InternalFormalML.g:20599:8: lv_isElse_5_0= 'else'
+                            {
+                            lv_isElse_5_0=(Token)match(input,146,FollowSets000.FOLLOW_144); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								newLeafNode(lv_isElse_5_0, grammarAccess.getTransitionMoeAccess().getIsElseElseKeyword_1_0_1_1_0());
+                              							
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElement(grammarAccess.getTransitionMoeRule());
+                              								}
+                              								setWithLastConsumed(current, "isElse", true, "else");
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:20612:5: (otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) ) )?
+                    int alt479=2;
+                    int LA479_0 = input.LA(1);
+
+                    if ( (LA479_0==20) ) {
+                        alt479=1;
+                    }
+                    switch (alt479) {
+                        case 1 :
+                            // InternalFormalML.g:20613:6: otherlv_6= ',' (otherlv_7= 'prior:' )? ( (lv_prior_8_0= ruleEInt ) )
+                            {
+                            otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_200); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_6, grammarAccess.getTransitionMoeAccess().getCommaKeyword_1_0_2_0());
+                              					
+                            }
+                            // InternalFormalML.g:20617:6: (otherlv_7= 'prior:' )?
+                            int alt478=2;
+                            int LA478_0 = input.LA(1);
+
+                            if ( (LA478_0==147) ) {
+                                alt478=1;
+                            }
+                            switch (alt478) {
+                                case 1 :
+                                    // InternalFormalML.g:20618:7: otherlv_7= 'prior:'
+                                    {
+                                    otherlv_7=(Token)match(input,147,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							newLeafNode(otherlv_7, grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_0_2_1());
+                                      						
+                                    }
+
+                                    }
+                                    break;
+
+                            }
+
+                            // InternalFormalML.g:20623:6: ( (lv_prior_8_0= ruleEInt ) )
+                            // InternalFormalML.g:20624:7: (lv_prior_8_0= ruleEInt )
+                            {
+                            // InternalFormalML.g:20624:7: (lv_prior_8_0= ruleEInt )
+                            // InternalFormalML.g:20625:8: lv_prior_8_0= ruleEInt
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_0_2_2_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_23);
+                            lv_prior_8_0=ruleEInt();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getTransitionMoeRule());
+                              								}
+                              								set(
+                              									current,
+                              									"prior",
+                              									lv_prior_8_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:20645:4: ( (otherlv_9= 'prior:' )? ( (lv_prior_10_0= ruleEInt ) ) )
+                    {
+                    // InternalFormalML.g:20645:4: ( (otherlv_9= 'prior:' )? ( (lv_prior_10_0= ruleEInt ) ) )
+                    // InternalFormalML.g:20646:5: (otherlv_9= 'prior:' )? ( (lv_prior_10_0= ruleEInt ) )
+                    {
+                    // InternalFormalML.g:20646:5: (otherlv_9= 'prior:' )?
+                    int alt480=2;
+                    int LA480_0 = input.LA(1);
+
+                    if ( (LA480_0==147) ) {
+                        alt480=1;
+                    }
+                    switch (alt480) {
+                        case 1 :
+                            // InternalFormalML.g:20647:6: otherlv_9= 'prior:'
+                            {
+                            otherlv_9=(Token)match(input,147,FollowSets000.FOLLOW_132); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_9, grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_1_0());
+                              					
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:20652:5: ( (lv_prior_10_0= ruleEInt ) )
+                    // InternalFormalML.g:20653:6: (lv_prior_10_0= ruleEInt )
+                    {
+                    // InternalFormalML.g:20653:6: (lv_prior_10_0= ruleEInt )
+                    // InternalFormalML.g:20654:7: lv_prior_10_0= ruleEInt
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getTransitionMoeAccess().getPriorEIntParserRuleCall_1_1_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_prior_10_0=ruleEInt();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getTransitionMoeRule());
+                      							}
+                      							set(
+                      								current,
+                      								"prior",
+                      								lv_prior_10_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.EInt");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_11=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_11, grammarAccess.getTransitionMoeAccess().getGreaterThanSignKeyword_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionMoe"
+
+
+    // $ANTLR start "entryRuleTransitionBehavior"
+    // InternalFormalML.g:20681:1: entryRuleTransitionBehavior returns [EObject current=null] : iv_ruleTransitionBehavior= ruleTransitionBehavior EOF ;
+    public final EObject entryRuleTransitionBehavior() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransitionBehavior = null;
+
+
+        try {
+            // InternalFormalML.g:20681:59: (iv_ruleTransitionBehavior= ruleTransitionBehavior EOF )
+            // InternalFormalML.g:20682:2: iv_ruleTransitionBehavior= ruleTransitionBehavior EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTransitionBehaviorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTransitionBehavior=ruleTransitionBehavior();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTransitionBehavior; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransitionBehavior"
+
+
+    // $ANTLR start "ruleTransitionBehavior"
+    // InternalFormalML.g:20688:1: ruleTransitionBehavior returns [EObject current=null] : ( () ( (lv_op_1_0= ruleBlockStatementScheduler ) )? ( (lv_statement_2_0= ruleStatement ) )* ) ;
+    public final EObject ruleTransitionBehavior() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_op_1_0 = null;
+
+        EObject lv_statement_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:20694:2: ( ( () ( (lv_op_1_0= ruleBlockStatementScheduler ) )? ( (lv_statement_2_0= ruleStatement ) )* ) )
+            // InternalFormalML.g:20695:2: ( () ( (lv_op_1_0= ruleBlockStatementScheduler ) )? ( (lv_statement_2_0= ruleStatement ) )* )
+            {
+            // InternalFormalML.g:20695:2: ( () ( (lv_op_1_0= ruleBlockStatementScheduler ) )? ( (lv_statement_2_0= ruleStatement ) )* )
+            // InternalFormalML.g:20696:3: () ( (lv_op_1_0= ruleBlockStatementScheduler ) )? ( (lv_statement_2_0= ruleStatement ) )*
+            {
+            // InternalFormalML.g:20696:3: ()
+            // InternalFormalML.g:20697:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getTransitionBehaviorAccess().getBlockStatementAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:20706:3: ( (lv_op_1_0= ruleBlockStatementScheduler ) )?
+            int alt482=2;
+            int LA482_0 = input.LA(1);
+
+            if ( ((LA482_0>=152 && LA482_0<=167)) ) {
+                alt482=1;
+            }
+            switch (alt482) {
+                case 1 :
+                    // InternalFormalML.g:20707:4: (lv_op_1_0= ruleBlockStatementScheduler )
+                    {
+                    // InternalFormalML.g:20707:4: (lv_op_1_0= ruleBlockStatementScheduler )
+                    // InternalFormalML.g:20708:5: lv_op_1_0= ruleBlockStatementScheduler
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getTransitionBehaviorAccess().getOpBlockStatementSchedulerParserRuleCall_1_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_201);
+                    lv_op_1_0=ruleBlockStatementScheduler();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getTransitionBehaviorRule());
+                      					}
+                      					set(
+                      						current,
+                      						"op",
+                      						lv_op_1_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatementScheduler");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:20725:3: ( (lv_statement_2_0= ruleStatement ) )*
+            loop483:
+            do {
+                int alt483=2;
+                int LA483_0 = input.LA(1);
+
+                if ( (LA483_0==RULE_XLIA_ID||LA483_0==22||LA483_0==56||LA483_0==61||(LA483_0>=63 && LA483_0<=64)||LA483_0==85||LA483_0==87||(LA483_0>=168 && LA483_0<=171)||LA483_0==176||(LA483_0>=178 && LA483_0<=182)||(LA483_0>=216 && LA483_0<=219)||(LA483_0>=231 && LA483_0<=239)||(LA483_0>=271 && LA483_0<=287)) ) {
+                    alt483=1;
+                }
+
+
+                switch (alt483) {
+            	case 1 :
+            	    // InternalFormalML.g:20726:4: (lv_statement_2_0= ruleStatement )
+            	    {
+            	    // InternalFormalML.g:20726:4: (lv_statement_2_0= ruleStatement )
+            	    // InternalFormalML.g:20727:5: lv_statement_2_0= ruleStatement
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getTransitionBehaviorAccess().getStatementStatementParserRuleCall_2_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_201);
+            	    lv_statement_2_0=ruleStatement();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getTransitionBehaviorRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"statement",
+            	      						lv_statement_2_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Statement");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop483;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionBehavior"
+
+
+    // $ANTLR start "entryRuleTransitionTrigger"
+    // InternalFormalML.g:20748:1: entryRuleTransitionTrigger returns [EObject current=null] : iv_ruleTransitionTrigger= ruleTransitionTrigger EOF ;
+    public final EObject entryRuleTransitionTrigger() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransitionTrigger = null;
+
+
+        try {
+            // InternalFormalML.g:20748:58: (iv_ruleTransitionTrigger= ruleTransitionTrigger EOF )
+            // InternalFormalML.g:20749:2: iv_ruleTransitionTrigger= ruleTransitionTrigger EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTransitionTriggerRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTransitionTrigger=ruleTransitionTrigger();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTransitionTrigger; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransitionTrigger"
+
+
+    // $ANTLR start "ruleTransitionTrigger"
+    // InternalFormalML.g:20755:1: ruleTransitionTrigger returns [EObject current=null] : this_InputComStatement_0= ruleInputComStatement ;
+    public final EObject ruleTransitionTrigger() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_InputComStatement_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:20761:2: (this_InputComStatement_0= ruleInputComStatement )
+            // InternalFormalML.g:20762:2: this_InputComStatement_0= ruleInputComStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              		/* */
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newCompositeNode(grammarAccess.getTransitionTriggerAccess().getInputComStatementParserRuleCall());
+              	
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            this_InputComStatement_0=ruleInputComStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current = this_InputComStatement_0;
+              		afterParserOrEnumRuleCall();
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionTrigger"
+
+
+    // $ANTLR start "entryRuleTransitionGuard"
+    // InternalFormalML.g:20776:1: entryRuleTransitionGuard returns [EObject current=null] : iv_ruleTransitionGuard= ruleTransitionGuard EOF ;
+    public final EObject entryRuleTransitionGuard() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransitionGuard = null;
+
+
+        try {
+            // InternalFormalML.g:20776:56: (iv_ruleTransitionGuard= ruleTransitionGuard EOF )
+            // InternalFormalML.g:20777:2: iv_ruleTransitionGuard= ruleTransitionGuard EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTransitionGuardRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTransitionGuard=ruleTransitionGuard();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTransitionGuard; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransitionGuard"
+
+
+    // $ANTLR start "ruleTransitionGuard"
+    // InternalFormalML.g:20783:1: ruleTransitionGuard returns [EObject current=null] : ( ( () otherlv_1= '@guard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) ) | (otherlv_3= '@guard:' ( ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_GuardStatement_9= ruleGuardStatement | this_EventGuardStatement_10= ruleEventGuardStatement | this_CheckSatGuardStatement_11= ruleCheckSatGuardStatement ) ) ) ;
+    public final EObject ruleTransitionGuard() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        EObject lv_condition_2_0 = null;
+
+        EObject lv_condition_6_0 = null;
+
+        EObject lv_condition_8_0 = null;
+
+        EObject this_GuardStatement_9 = null;
+
+        EObject this_EventGuardStatement_10 = null;
+
+        EObject this_CheckSatGuardStatement_11 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:20789:2: ( ( ( () otherlv_1= '@guard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) ) | (otherlv_3= '@guard:' ( ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_GuardStatement_9= ruleGuardStatement | this_EventGuardStatement_10= ruleEventGuardStatement | this_CheckSatGuardStatement_11= ruleCheckSatGuardStatement ) ) ) )
+            // InternalFormalML.g:20790:2: ( ( () otherlv_1= '@guard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) ) | (otherlv_3= '@guard:' ( ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_GuardStatement_9= ruleGuardStatement | this_EventGuardStatement_10= ruleEventGuardStatement | this_CheckSatGuardStatement_11= ruleCheckSatGuardStatement ) ) )
+            {
+            // InternalFormalML.g:20790:2: ( ( () otherlv_1= '@guard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) ) | (otherlv_3= '@guard:' ( ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_GuardStatement_9= ruleGuardStatement | this_EventGuardStatement_10= ruleEventGuardStatement | this_CheckSatGuardStatement_11= ruleCheckSatGuardStatement ) ) )
+            int alt486=2;
+            int LA486_0 = input.LA(1);
+
+            if ( (LA486_0==148) ) {
+                alt486=1;
+            }
+            else if ( (LA486_0==142) ) {
+                alt486=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 486, 0, input);
+
+                throw nvae;
+            }
+            switch (alt486) {
+                case 1 :
+                    // InternalFormalML.g:20791:3: ( () otherlv_1= '@guard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) )
+                    {
+                    // InternalFormalML.g:20791:3: ( () otherlv_1= '@guard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) )
+                    // InternalFormalML.g:20792:4: () otherlv_1= '@guard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) )
+                    {
+                    // InternalFormalML.g:20792:4: ()
+                    // InternalFormalML.g:20793:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getTransitionGuardAccess().getGuardStatementAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    otherlv_1=(Token)match(input,148,FollowSets000.FOLLOW_202); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getTransitionGuardAccess().getGuardKeyword_0_1());
+                      			
+                    }
+                    // InternalFormalML.g:20806:4: ( (lv_condition_2_0= ruleTransitionGuardExpression ) )
+                    // InternalFormalML.g:20807:5: (lv_condition_2_0= ruleTransitionGuardExpression )
+                    {
+                    // InternalFormalML.g:20807:5: (lv_condition_2_0= ruleTransitionGuardExpression )
+                    // InternalFormalML.g:20808:6: lv_condition_2_0= ruleTransitionGuardExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getTransitionGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_condition_2_0=ruleTransitionGuardExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getTransitionGuardRule());
+                      						}
+                      						set(
+                      							current,
+                      							"condition",
+                      							lv_condition_2_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuardExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:20827:3: (otherlv_3= '@guard:' ( ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_GuardStatement_9= ruleGuardStatement | this_EventGuardStatement_10= ruleEventGuardStatement | this_CheckSatGuardStatement_11= ruleCheckSatGuardStatement ) )
+                    {
+                    // InternalFormalML.g:20827:3: (otherlv_3= '@guard:' ( ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_GuardStatement_9= ruleGuardStatement | this_EventGuardStatement_10= ruleEventGuardStatement | this_CheckSatGuardStatement_11= ruleCheckSatGuardStatement ) )
+                    // InternalFormalML.g:20828:4: otherlv_3= '@guard:' ( ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_GuardStatement_9= ruleGuardStatement | this_EventGuardStatement_10= ruleEventGuardStatement | this_CheckSatGuardStatement_11= ruleCheckSatGuardStatement )
+                    {
+                    otherlv_3=(Token)match(input,142,FollowSets000.FOLLOW_203); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getTransitionGuardAccess().getGuardKeyword_1_0());
+                      			
+                    }
+                    // InternalFormalML.g:20832:4: ( ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_GuardStatement_9= ruleGuardStatement | this_EventGuardStatement_10= ruleEventGuardStatement | this_CheckSatGuardStatement_11= ruleCheckSatGuardStatement )
+                    int alt485=4;
+                    switch ( input.LA(1) ) {
+                    case RULE_XLIA_ID:
+                    case RULE_INT:
+                    case RULE_CHARACTER:
+                    case RULE_STRING:
+                    case 16:
+                    case 22:
+                    case 26:
+                    case 27:
+                    case 28:
+                    case 29:
+                    case 56:
+                    case 97:
+                    case 212:
+                    case 216:
+                    case 217:
+                    case 218:
+                    case 219:
+                    case 220:
+                    case 221:
+                    case 222:
+                    case 223:
+                    case 224:
+                    case 227:
+                    case 228:
+                    case 229:
+                    case 230:
+                    case 231:
+                    case 232:
+                    case 233:
+                    case 234:
+                    case 235:
+                    case 236:
+                    case 237:
+                    case 238:
+                    case 239:
+                        {
+                        alt485=1;
+                        }
+                        break;
+                    case 168:
+                        {
+                        alt485=2;
+                        }
+                        break;
+                    case 170:
+                        {
+                        alt485=3;
+                        }
+                        break;
+                    case 171:
+                        {
+                        alt485=4;
+                        }
+                        break;
+                    default:
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 485, 0, input);
+
+                        throw nvae;
+                    }
+
+                    switch (alt485) {
+                        case 1 :
+                            // InternalFormalML.g:20833:5: ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) )
+                            {
+                            // InternalFormalML.g:20833:5: ( () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) ) )
+                            // InternalFormalML.g:20834:6: () ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) )
+                            {
+                            // InternalFormalML.g:20834:6: ()
+                            // InternalFormalML.g:20835:7: 
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							/* */
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							current = forceCreateModelElement(
+                              								grammarAccess.getTransitionGuardAccess().getGuardStatementAction_1_1_0_0(),
+                              								current);
+                              						
+                            }
+
+                            }
+
+                            // InternalFormalML.g:20844:6: ( (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' ) | ( (lv_condition_8_0= ruleExpression ) ) )
+                            int alt484=2;
+                            int LA484_0 = input.LA(1);
+
+                            if ( (LA484_0==97) ) {
+                                alt484=1;
+                            }
+                            else if ( ((LA484_0>=RULE_XLIA_ID && LA484_0<=RULE_STRING)||LA484_0==16||LA484_0==22||(LA484_0>=26 && LA484_0<=29)||LA484_0==56||LA484_0==212||(LA484_0>=216 && LA484_0<=224)||(LA484_0>=227 && LA484_0<=239)) ) {
+                                alt484=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 484, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt484) {
+                                case 1 :
+                                    // InternalFormalML.g:20845:7: (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' )
+                                    {
+                                    // InternalFormalML.g:20845:7: (otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']' )
+                                    // InternalFormalML.g:20846:8: otherlv_5= '[' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= ']'
+                                    {
+                                    otherlv_5=(Token)match(input,97,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								newLeafNode(otherlv_5, grammarAccess.getTransitionGuardAccess().getLeftSquareBracketKeyword_1_1_0_1_0_0());
+                                      							
+                                    }
+                                    // InternalFormalML.g:20850:8: ( (lv_condition_6_0= ruleExpression ) )
+                                    // InternalFormalML.g:20851:9: (lv_condition_6_0= ruleExpression )
+                                    {
+                                    // InternalFormalML.g:20851:9: (lv_condition_6_0= ruleExpression )
+                                    // InternalFormalML.g:20852:10: lv_condition_6_0= ruleExpression
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      										newCompositeNode(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0());
+                                      									
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_110);
+                                    lv_condition_6_0=ruleExpression();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      										if (current==null) {
+                                      											current = createModelElementForParent(grammarAccess.getTransitionGuardRule());
+                                      										}
+                                      										set(
+                                      											current,
+                                      											"condition",
+                                      											lv_condition_6_0,
+                                      											"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                                      										afterParserOrEnumRuleCall();
+                                      									
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    otherlv_7=(Token)match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								newLeafNode(otherlv_7, grammarAccess.getTransitionGuardAccess().getRightSquareBracketKeyword_1_1_0_1_0_2());
+                                      							
+                                    }
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:20875:7: ( (lv_condition_8_0= ruleExpression ) )
+                                    {
+                                    // InternalFormalML.g:20875:7: ( (lv_condition_8_0= ruleExpression ) )
+                                    // InternalFormalML.g:20876:8: (lv_condition_8_0= ruleExpression )
+                                    {
+                                    // InternalFormalML.g:20876:8: (lv_condition_8_0= ruleExpression )
+                                    // InternalFormalML.g:20877:9: lv_condition_8_0= ruleExpression
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getTransitionGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_2);
+                                    lv_condition_8_0=ruleExpression();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getTransitionGuardRule());
+                                      									}
+                                      									set(
+                                      										current,
+                                      										"condition",
+                                      										lv_condition_8_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:20897:5: this_GuardStatement_9= ruleGuardStatement
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              					/* */
+                              				
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              					newCompositeNode(grammarAccess.getTransitionGuardAccess().getGuardStatementParserRuleCall_1_1_1());
+                              				
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            this_GuardStatement_9=ruleGuardStatement();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current = this_GuardStatement_9;
+                              					afterParserOrEnumRuleCall();
+                              				
+                            }
+
+                            }
+                            break;
+                        case 3 :
+                            // InternalFormalML.g:20909:5: this_EventGuardStatement_10= ruleEventGuardStatement
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              					/* */
+                              				
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              					newCompositeNode(grammarAccess.getTransitionGuardAccess().getEventGuardStatementParserRuleCall_1_1_2());
+                              				
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            this_EventGuardStatement_10=ruleEventGuardStatement();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current = this_EventGuardStatement_10;
+                              					afterParserOrEnumRuleCall();
+                              				
+                            }
+
+                            }
+                            break;
+                        case 4 :
+                            // InternalFormalML.g:20921:5: this_CheckSatGuardStatement_11= ruleCheckSatGuardStatement
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              					/* */
+                              				
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              					newCompositeNode(grammarAccess.getTransitionGuardAccess().getCheckSatGuardStatementParserRuleCall_1_1_3());
+                              				
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            this_CheckSatGuardStatement_11=ruleCheckSatGuardStatement();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current = this_CheckSatGuardStatement_11;
+                              					afterParserOrEnumRuleCall();
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionGuard"
+
+
+    // $ANTLR start "entryRuleTransitionGuardExpression"
+    // InternalFormalML.g:20938:1: entryRuleTransitionGuardExpression returns [EObject current=null] : iv_ruleTransitionGuardExpression= ruleTransitionGuardExpression EOF ;
+    public final EObject entryRuleTransitionGuardExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransitionGuardExpression = null;
+
+
+        try {
+            // InternalFormalML.g:20938:66: (iv_ruleTransitionGuardExpression= ruleTransitionGuardExpression EOF )
+            // InternalFormalML.g:20939:2: iv_ruleTransitionGuardExpression= ruleTransitionGuardExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTransitionGuardExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTransitionGuardExpression=ruleTransitionGuardExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTransitionGuardExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransitionGuardExpression"
+
+
+    // $ANTLR start "ruleTransitionGuardExpression"
+    // InternalFormalML.g:20945:1: ruleTransitionGuardExpression returns [EObject current=null] : ( () ( ( (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' ) ) ) otherlv_2= '>:' ( (lv_operand_3_0= ruleBitwiseOrExpression ) )+ ) ;
+    public final EObject ruleTransitionGuardExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_1_1=null;
+        Token lv_operator_1_2=null;
+        Token lv_operator_1_3=null;
+        Token lv_operator_1_4=null;
+        Token otherlv_2=null;
+        EObject lv_operand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:20951:2: ( ( () ( ( (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' ) ) ) otherlv_2= '>:' ( (lv_operand_3_0= ruleBitwiseOrExpression ) )+ ) )
+            // InternalFormalML.g:20952:2: ( () ( ( (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' ) ) ) otherlv_2= '>:' ( (lv_operand_3_0= ruleBitwiseOrExpression ) )+ )
+            {
+            // InternalFormalML.g:20952:2: ( () ( ( (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' ) ) ) otherlv_2= '>:' ( (lv_operand_3_0= ruleBitwiseOrExpression ) )+ )
+            // InternalFormalML.g:20953:3: () ( ( (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' ) ) ) otherlv_2= '>:' ( (lv_operand_3_0= ruleBitwiseOrExpression ) )+
+            {
+            // InternalFormalML.g:20953:3: ()
+            // InternalFormalML.g:20954:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getTransitionGuardExpressionAccess().getLogicalAssociativeExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:20963:3: ( ( (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' ) ) )
+            // InternalFormalML.g:20964:4: ( (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' ) )
+            {
+            // InternalFormalML.g:20964:4: ( (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' ) )
+            // InternalFormalML.g:20965:5: (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' )
+            {
+            // InternalFormalML.g:20965:5: (lv_operator_1_1= '&&' | lv_operator_1_2= 'and' | lv_operator_1_3= '||' | lv_operator_1_4= 'or' )
+            int alt487=4;
+            switch ( input.LA(1) ) {
+            case 149:
+                {
+                alt487=1;
+                }
+                break;
+            case 35:
+                {
+                alt487=2;
+                }
+                break;
+            case 150:
+                {
+                alt487=3;
+                }
+                break;
+            case 36:
+                {
+                alt487=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 487, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt487) {
+                case 1 :
+                    // InternalFormalML.g:20966:6: lv_operator_1_1= '&&'
+                    {
+                    lv_operator_1_1=(Token)match(input,149,FollowSets000.FOLLOW_6); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_1_1, grammarAccess.getTransitionGuardExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_1_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:20977:6: lv_operator_1_2= 'and'
+                    {
+                    lv_operator_1_2=(Token)match(input,35,FollowSets000.FOLLOW_6); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_1_2, grammarAccess.getTransitionGuardExpressionAccess().getOperatorAndKeyword_1_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_1_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:20988:6: lv_operator_1_3= '||'
+                    {
+                    lv_operator_1_3=(Token)match(input,150,FollowSets000.FOLLOW_6); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_1_3, grammarAccess.getTransitionGuardExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_0_2());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_1_3, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:20999:6: lv_operator_1_4= 'or'
+                    {
+                    lv_operator_1_4=(Token)match(input,36,FollowSets000.FOLLOW_6); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_1_4, grammarAccess.getTransitionGuardExpressionAccess().getOperatorOrKeyword_1_0_3());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getTransitionGuardExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_1_4, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,17,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getTransitionGuardExpressionAccess().getGreaterThanSignColonKeyword_2());
+              		
+            }
+            // InternalFormalML.g:21016:3: ( (lv_operand_3_0= ruleBitwiseOrExpression ) )+
+            int cnt488=0;
+            loop488:
+            do {
+                int alt488=2;
+                int LA488_0 = input.LA(1);
+
+                if ( ((LA488_0>=RULE_XLIA_ID && LA488_0<=RULE_STRING)||LA488_0==16||LA488_0==22||(LA488_0>=26 && LA488_0<=29)||LA488_0==56||LA488_0==212||(LA488_0>=216 && LA488_0<=224)||(LA488_0>=227 && LA488_0<=239)) ) {
+                    alt488=1;
+                }
+
+
+                switch (alt488) {
+            	case 1 :
+            	    // InternalFormalML.g:21017:4: (lv_operand_3_0= ruleBitwiseOrExpression )
+            	    {
+            	    // InternalFormalML.g:21017:4: (lv_operand_3_0= ruleBitwiseOrExpression )
+            	    // InternalFormalML.g:21018:5: lv_operand_3_0= ruleBitwiseOrExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getTransitionGuardExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_204);
+            	    lv_operand_3_0=ruleBitwiseOrExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getTransitionGuardExpressionRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"operand",
+            	      						lv_operand_3_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt488 >= 1 ) break loop488;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(488, input);
+                        throw eee;
+                }
+                cnt488++;
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionGuardExpression"
+
+
+    // $ANTLR start "entryRuleTransitionTimedGuard"
+    // InternalFormalML.g:21039:1: entryRuleTransitionTimedGuard returns [EObject current=null] : iv_ruleTransitionTimedGuard= ruleTransitionTimedGuard EOF ;
+    public final EObject entryRuleTransitionTimedGuard() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransitionTimedGuard = null;
+
+
+        try {
+            // InternalFormalML.g:21039:61: (iv_ruleTransitionTimedGuard= ruleTransitionTimedGuard EOF )
+            // InternalFormalML.g:21040:2: iv_ruleTransitionTimedGuard= ruleTransitionTimedGuard EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTransitionTimedGuardRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTransitionTimedGuard=ruleTransitionTimedGuard();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTransitionTimedGuard; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransitionTimedGuard"
+
+
+    // $ANTLR start "ruleTransitionTimedGuard"
+    // InternalFormalML.g:21046:1: ruleTransitionTimedGuard returns [EObject current=null] : ( ( () otherlv_1= '@tguard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) ) | (otherlv_3= '@tguard:' ( ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_TimedGuardStatement_9= ruleTimedGuardStatement ) ) ) ;
+    public final EObject ruleTransitionTimedGuard() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        EObject lv_condition_2_0 = null;
+
+        EObject lv_condition_6_0 = null;
+
+        EObject lv_condition_8_0 = null;
+
+        EObject this_TimedGuardStatement_9 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:21052:2: ( ( ( () otherlv_1= '@tguard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) ) | (otherlv_3= '@tguard:' ( ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_TimedGuardStatement_9= ruleTimedGuardStatement ) ) ) )
+            // InternalFormalML.g:21053:2: ( ( () otherlv_1= '@tguard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) ) | (otherlv_3= '@tguard:' ( ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_TimedGuardStatement_9= ruleTimedGuardStatement ) ) )
+            {
+            // InternalFormalML.g:21053:2: ( ( () otherlv_1= '@tguard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) ) | (otherlv_3= '@tguard:' ( ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_TimedGuardStatement_9= ruleTimedGuardStatement ) ) )
+            int alt491=2;
+            int LA491_0 = input.LA(1);
+
+            if ( (LA491_0==151) ) {
+                alt491=1;
+            }
+            else if ( (LA491_0==143) ) {
+                alt491=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 491, 0, input);
+
+                throw nvae;
+            }
+            switch (alt491) {
+                case 1 :
+                    // InternalFormalML.g:21054:3: ( () otherlv_1= '@tguard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) )
+                    {
+                    // InternalFormalML.g:21054:3: ( () otherlv_1= '@tguard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) ) )
+                    // InternalFormalML.g:21055:4: () otherlv_1= '@tguard<' ( (lv_condition_2_0= ruleTransitionGuardExpression ) )
+                    {
+                    // InternalFormalML.g:21055:4: ()
+                    // InternalFormalML.g:21056:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    otherlv_1=(Token)match(input,151,FollowSets000.FOLLOW_202); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_0_1());
+                      			
+                    }
+                    // InternalFormalML.g:21069:4: ( (lv_condition_2_0= ruleTransitionGuardExpression ) )
+                    // InternalFormalML.g:21070:5: (lv_condition_2_0= ruleTransitionGuardExpression )
+                    {
+                    // InternalFormalML.g:21070:5: (lv_condition_2_0= ruleTransitionGuardExpression )
+                    // InternalFormalML.g:21071:6: lv_condition_2_0= ruleTransitionGuardExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionTransitionGuardExpressionParserRuleCall_0_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_condition_2_0=ruleTransitionGuardExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getTransitionTimedGuardRule());
+                      						}
+                      						set(
+                      							current,
+                      							"condition",
+                      							lv_condition_2_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.TransitionGuardExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:21090:3: (otherlv_3= '@tguard:' ( ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_TimedGuardStatement_9= ruleTimedGuardStatement ) )
+                    {
+                    // InternalFormalML.g:21090:3: (otherlv_3= '@tguard:' ( ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_TimedGuardStatement_9= ruleTimedGuardStatement ) )
+                    // InternalFormalML.g:21091:4: otherlv_3= '@tguard:' ( ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_TimedGuardStatement_9= ruleTimedGuardStatement )
+                    {
+                    otherlv_3=(Token)match(input,143,FollowSets000.FOLLOW_205); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getTransitionTimedGuardAccess().getTguardKeyword_1_0());
+                      			
+                    }
+                    // InternalFormalML.g:21095:4: ( ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) ) | this_TimedGuardStatement_9= ruleTimedGuardStatement )
+                    int alt490=2;
+                    int LA490_0 = input.LA(1);
+
+                    if ( ((LA490_0>=RULE_XLIA_ID && LA490_0<=RULE_STRING)||LA490_0==16||LA490_0==22||(LA490_0>=26 && LA490_0<=29)||LA490_0==56||LA490_0==212||(LA490_0>=216 && LA490_0<=224)||(LA490_0>=227 && LA490_0<=239)) ) {
+                        alt490=1;
+                    }
+                    else if ( (LA490_0==169) ) {
+                        alt490=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 490, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt490) {
+                        case 1 :
+                            // InternalFormalML.g:21096:5: ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) )
+                            {
+                            // InternalFormalML.g:21096:5: ( () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) ) )
+                            // InternalFormalML.g:21097:6: () ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) )
+                            {
+                            // InternalFormalML.g:21097:6: ()
+                            // InternalFormalML.g:21098:7: 
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							/* */
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							current = forceCreateModelElement(
+                              								grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementAction_1_1_0_0(),
+                              								current);
+                              						
+                            }
+
+                            }
+
+                            // InternalFormalML.g:21107:6: ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) )
+                            int alt489=2;
+                            alt489 = dfa489.predict(input);
+                            switch (alt489) {
+                                case 1 :
+                                    // InternalFormalML.g:21108:7: (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' )
+                                    {
+                                    // InternalFormalML.g:21108:7: (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' )
+                                    // InternalFormalML.g:21109:8: otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}'
+                                    {
+                                    otherlv_5=(Token)match(input,22,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								newLeafNode(otherlv_5, grammarAccess.getTransitionTimedGuardAccess().getLeftCurlyBracketKeyword_1_1_0_1_0_0());
+                                      							
+                                    }
+                                    // InternalFormalML.g:21113:8: ( (lv_condition_6_0= ruleExpression ) )
+                                    // InternalFormalML.g:21114:9: (lv_condition_6_0= ruleExpression )
+                                    {
+                                    // InternalFormalML.g:21114:9: (lv_condition_6_0= ruleExpression )
+                                    // InternalFormalML.g:21115:10: lv_condition_6_0= ruleExpression
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      										newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0());
+                                      									
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_33);
+                                    lv_condition_6_0=ruleExpression();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      										if (current==null) {
+                                      											current = createModelElementForParent(grammarAccess.getTransitionTimedGuardRule());
+                                      										}
+                                      										set(
+                                      											current,
+                                      											"condition",
+                                      											lv_condition_6_0,
+                                      											"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                                      										afterParserOrEnumRuleCall();
+                                      									
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    otherlv_7=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      								newLeafNode(otherlv_7, grammarAccess.getTransitionTimedGuardAccess().getRightCurlyBracketKeyword_1_1_0_1_0_2());
+                                      							
+                                    }
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:21138:7: ( (lv_condition_8_0= ruleExpression ) )
+                                    {
+                                    // InternalFormalML.g:21138:7: ( (lv_condition_8_0= ruleExpression ) )
+                                    // InternalFormalML.g:21139:8: (lv_condition_8_0= ruleExpression )
+                                    {
+                                    // InternalFormalML.g:21139:8: (lv_condition_8_0= ruleExpression )
+                                    // InternalFormalML.g:21140:9: lv_condition_8_0= ruleExpression
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_1_0());
+                                      								
+                                    }
+                                    pushFollow(FollowSets000.FOLLOW_2);
+                                    lv_condition_8_0=ruleExpression();
+
+                                    state._fsp--;
+                                    if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElementForParent(grammarAccess.getTransitionTimedGuardRule());
+                                      									}
+                                      									set(
+                                      										current,
+                                      										"condition",
+                                      										lv_condition_8_0,
+                                      										"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                                      									afterParserOrEnumRuleCall();
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:21160:5: this_TimedGuardStatement_9= ruleTimedGuardStatement
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              					/* */
+                              				
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              					newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getTimedGuardStatementParserRuleCall_1_1_1());
+                              				
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            this_TimedGuardStatement_9=ruleTimedGuardStatement();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					current = this_TimedGuardStatement_9;
+                              					afterParserOrEnumRuleCall();
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionTimedGuard"
+
+
+    // $ANTLR start "entryRuleTransitionEffect"
+    // InternalFormalML.g:21177:1: entryRuleTransitionEffect returns [EObject current=null] : iv_ruleTransitionEffect= ruleTransitionEffect EOF ;
+    public final EObject entryRuleTransitionEffect() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransitionEffect = null;
+
+
+        try {
+            // InternalFormalML.g:21177:57: (iv_ruleTransitionEffect= ruleTransitionEffect EOF )
+            // InternalFormalML.g:21178:2: iv_ruleTransitionEffect= ruleTransitionEffect EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTransitionEffectRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTransitionEffect=ruleTransitionEffect();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTransitionEffect; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransitionEffect"
+
+
+    // $ANTLR start "ruleTransitionEffect"
+    // InternalFormalML.g:21184:1: ruleTransitionEffect returns [EObject current=null] : (this_TransitionEffectStatement_0= ruleTransitionEffectStatement ( () ( (lv_statement_2_0= ruleTransitionEffectStatement ) ) )* ) ;
+    public final EObject ruleTransitionEffect() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_TransitionEffectStatement_0 = null;
+
+        EObject lv_statement_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:21190:2: ( (this_TransitionEffectStatement_0= ruleTransitionEffectStatement ( () ( (lv_statement_2_0= ruleTransitionEffectStatement ) ) )* ) )
+            // InternalFormalML.g:21191:2: (this_TransitionEffectStatement_0= ruleTransitionEffectStatement ( () ( (lv_statement_2_0= ruleTransitionEffectStatement ) ) )* )
+            {
+            // InternalFormalML.g:21191:2: (this_TransitionEffectStatement_0= ruleTransitionEffectStatement ( () ( (lv_statement_2_0= ruleTransitionEffectStatement ) ) )* )
+            // InternalFormalML.g:21192:3: this_TransitionEffectStatement_0= ruleTransitionEffectStatement ( () ( (lv_statement_2_0= ruleTransitionEffectStatement ) ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getTransitionEffectAccess().getTransitionEffectStatementParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_201);
+            this_TransitionEffectStatement_0=ruleTransitionEffectStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_TransitionEffectStatement_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:21203:3: ( () ( (lv_statement_2_0= ruleTransitionEffectStatement ) ) )*
+            loop492:
+            do {
+                int alt492=2;
+                int LA492_0 = input.LA(1);
+
+                if ( (LA492_0==RULE_XLIA_ID||LA492_0==56||(LA492_0>=63 && LA492_0<=64)||LA492_0==85||LA492_0==87||LA492_0==176||(LA492_0>=178 && LA492_0<=182)||(LA492_0>=216 && LA492_0<=219)||(LA492_0>=231 && LA492_0<=239)||(LA492_0>=271 && LA492_0<=287)) ) {
+                    alt492=1;
+                }
+
+
+                switch (alt492) {
+            	case 1 :
+            	    // InternalFormalML.g:21204:4: () ( (lv_statement_2_0= ruleTransitionEffectStatement ) )
+            	    {
+            	    // InternalFormalML.g:21204:4: ()
+            	    // InternalFormalML.g:21205:5: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					/* */
+            	      				
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      					current = forceCreateModelElementAndAdd(
+            	      						grammarAccess.getTransitionEffectAccess().getBlockStatementStatementAction_1_0(),
+            	      						current);
+            	      				
+            	    }
+
+            	    }
+
+            	    // InternalFormalML.g:21214:4: ( (lv_statement_2_0= ruleTransitionEffectStatement ) )
+            	    // InternalFormalML.g:21215:5: (lv_statement_2_0= ruleTransitionEffectStatement )
+            	    {
+            	    // InternalFormalML.g:21215:5: (lv_statement_2_0= ruleTransitionEffectStatement )
+            	    // InternalFormalML.g:21216:6: lv_statement_2_0= ruleTransitionEffectStatement
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getTransitionEffectAccess().getStatementTransitionEffectStatementParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_201);
+            	    lv_statement_2_0=ruleTransitionEffectStatement();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getTransitionEffectRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"statement",
+            	      							lv_statement_2_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.TransitionEffectStatement");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop492;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionEffect"
+
+
+    // $ANTLR start "entryRuleTransitionEffectStatement"
+    // InternalFormalML.g:21238:1: entryRuleTransitionEffectStatement returns [EObject current=null] : iv_ruleTransitionEffectStatement= ruleTransitionEffectStatement EOF ;
+    public final EObject entryRuleTransitionEffectStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTransitionEffectStatement = null;
+
+
+        try {
+            // InternalFormalML.g:21238:66: (iv_ruleTransitionEffectStatement= ruleTransitionEffectStatement EOF )
+            // InternalFormalML.g:21239:2: iv_ruleTransitionEffectStatement= ruleTransitionEffectStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTransitionEffectStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTransitionEffectStatement=ruleTransitionEffectStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTransitionEffectStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTransitionEffectStatement"
+
+
+    // $ANTLR start "ruleTransitionEffectStatement"
+    // InternalFormalML.g:21245:1: ruleTransitionEffectStatement returns [EObject current=null] : (this_ExpressionStatement_0= ruleExpressionStatement | this_OutputComStatement_1= ruleOutputComStatement | this_IfStatement_2= ruleIfStatement | this_WhileDoStatement_3= ruleWhileDoStatement | this_DoWhileStatement_4= ruleDoWhileStatement | this_ForStatement_5= ruleForStatement | this_ForEachStatement_6= ruleForEachStatement | this_InterruptStatement_7= ruleInterruptStatement | this_ActivityStatement_8= ruleActivityStatement | this_InvokeStatement_9= ruleInvokeStatement ) ;
+    public final EObject ruleTransitionEffectStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_ExpressionStatement_0 = null;
+
+        EObject this_OutputComStatement_1 = null;
+
+        EObject this_IfStatement_2 = null;
+
+        EObject this_WhileDoStatement_3 = null;
+
+        EObject this_DoWhileStatement_4 = null;
+
+        EObject this_ForStatement_5 = null;
+
+        EObject this_ForEachStatement_6 = null;
+
+        EObject this_InterruptStatement_7 = null;
+
+        EObject this_ActivityStatement_8 = null;
+
+        EObject this_InvokeStatement_9 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:21251:2: ( (this_ExpressionStatement_0= ruleExpressionStatement | this_OutputComStatement_1= ruleOutputComStatement | this_IfStatement_2= ruleIfStatement | this_WhileDoStatement_3= ruleWhileDoStatement | this_DoWhileStatement_4= ruleDoWhileStatement | this_ForStatement_5= ruleForStatement | this_ForEachStatement_6= ruleForEachStatement | this_InterruptStatement_7= ruleInterruptStatement | this_ActivityStatement_8= ruleActivityStatement | this_InvokeStatement_9= ruleInvokeStatement ) )
+            // InternalFormalML.g:21252:2: (this_ExpressionStatement_0= ruleExpressionStatement | this_OutputComStatement_1= ruleOutputComStatement | this_IfStatement_2= ruleIfStatement | this_WhileDoStatement_3= ruleWhileDoStatement | this_DoWhileStatement_4= ruleDoWhileStatement | this_ForStatement_5= ruleForStatement | this_ForEachStatement_6= ruleForEachStatement | this_InterruptStatement_7= ruleInterruptStatement | this_ActivityStatement_8= ruleActivityStatement | this_InvokeStatement_9= ruleInvokeStatement )
+            {
+            // InternalFormalML.g:21252:2: (this_ExpressionStatement_0= ruleExpressionStatement | this_OutputComStatement_1= ruleOutputComStatement | this_IfStatement_2= ruleIfStatement | this_WhileDoStatement_3= ruleWhileDoStatement | this_DoWhileStatement_4= ruleDoWhileStatement | this_ForStatement_5= ruleForStatement | this_ForEachStatement_6= ruleForEachStatement | this_InterruptStatement_7= ruleInterruptStatement | this_ActivityStatement_8= ruleActivityStatement | this_InvokeStatement_9= ruleInvokeStatement )
+            int alt493=10;
+            alt493 = dfa493.predict(input);
+            switch (alt493) {
+                case 1 :
+                    // InternalFormalML.g:21253:3: this_ExpressionStatement_0= ruleExpressionStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getExpressionStatementParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ExpressionStatement_0=ruleExpressionStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ExpressionStatement_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:21265:3: this_OutputComStatement_1= ruleOutputComStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getOutputComStatementParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_OutputComStatement_1=ruleOutputComStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_OutputComStatement_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:21277:3: this_IfStatement_2= ruleIfStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getIfStatementParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_IfStatement_2=ruleIfStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_IfStatement_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:21289:3: this_WhileDoStatement_3= ruleWhileDoStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getWhileDoStatementParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_WhileDoStatement_3=ruleWhileDoStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_WhileDoStatement_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:21301:3: this_DoWhileStatement_4= ruleDoWhileStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getDoWhileStatementParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_DoWhileStatement_4=ruleDoWhileStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DoWhileStatement_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:21313:3: this_ForStatement_5= ruleForStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getForStatementParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ForStatement_5=ruleForStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ForStatement_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:21325:3: this_ForEachStatement_6= ruleForEachStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getForEachStatementParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ForEachStatement_6=ruleForEachStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ForEachStatement_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:21337:3: this_InterruptStatement_7= ruleInterruptStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getInterruptStatementParserRuleCall_7());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_InterruptStatement_7=ruleInterruptStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_InterruptStatement_7;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:21349:3: this_ActivityStatement_8= ruleActivityStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getActivityStatementParserRuleCall_8());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ActivityStatement_8=ruleActivityStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ActivityStatement_8;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:21361:3: this_InvokeStatement_9= ruleInvokeStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getTransitionEffectStatementAccess().getInvokeStatementParserRuleCall_9());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_InvokeStatement_9=ruleInvokeStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_InvokeStatement_9;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionEffectStatement"
+
+
+    // $ANTLR start "entryRuleStatement"
+    // InternalFormalML.g:21376:1: entryRuleStatement returns [EObject current=null] : iv_ruleStatement= ruleStatement EOF ;
+    public final EObject entryRuleStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStatement = null;
+
+
+        try {
+            // InternalFormalML.g:21376:50: (iv_ruleStatement= ruleStatement EOF )
+            // InternalFormalML.g:21377:2: iv_ruleStatement= ruleStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleStatement=ruleStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStatement"
+
+
+    // $ANTLR start "ruleStatement"
+    // InternalFormalML.g:21383:1: ruleStatement returns [EObject current=null] : (this_BlockStatement_0= ruleBlockStatement | this_ExpressionStatement_1= ruleExpressionStatement | this_GuardStatement_2= ruleGuardStatement | this_TimedGuardStatement_3= ruleTimedGuardStatement | this_EventGuardStatement_4= ruleEventGuardStatement | this_CheckSatGuardStatement_5= ruleCheckSatGuardStatement | this_InputComStatement_6= ruleInputComStatement | this_OutputComStatement_7= ruleOutputComStatement | this_IfStatement_8= ruleIfStatement | this_WhileDoStatement_9= ruleWhileDoStatement | this_DoWhileStatement_10= ruleDoWhileStatement | this_ForStatement_11= ruleForStatement | this_ForEachStatement_12= ruleForEachStatement | this_InterruptStatement_13= ruleInterruptStatement | this_ActivityStatement_14= ruleActivityStatement | this_InvokeStatement_15= ruleInvokeStatement ) ;
+    public final EObject ruleStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_BlockStatement_0 = null;
+
+        EObject this_ExpressionStatement_1 = null;
+
+        EObject this_GuardStatement_2 = null;
+
+        EObject this_TimedGuardStatement_3 = null;
+
+        EObject this_EventGuardStatement_4 = null;
+
+        EObject this_CheckSatGuardStatement_5 = null;
+
+        EObject this_InputComStatement_6 = null;
+
+        EObject this_OutputComStatement_7 = null;
+
+        EObject this_IfStatement_8 = null;
+
+        EObject this_WhileDoStatement_9 = null;
+
+        EObject this_DoWhileStatement_10 = null;
+
+        EObject this_ForStatement_11 = null;
+
+        EObject this_ForEachStatement_12 = null;
+
+        EObject this_InterruptStatement_13 = null;
+
+        EObject this_ActivityStatement_14 = null;
+
+        EObject this_InvokeStatement_15 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:21389:2: ( (this_BlockStatement_0= ruleBlockStatement | this_ExpressionStatement_1= ruleExpressionStatement | this_GuardStatement_2= ruleGuardStatement | this_TimedGuardStatement_3= ruleTimedGuardStatement | this_EventGuardStatement_4= ruleEventGuardStatement | this_CheckSatGuardStatement_5= ruleCheckSatGuardStatement | this_InputComStatement_6= ruleInputComStatement | this_OutputComStatement_7= ruleOutputComStatement | this_IfStatement_8= ruleIfStatement | this_WhileDoStatement_9= ruleWhileDoStatement | this_DoWhileStatement_10= ruleDoWhileStatement | this_ForStatement_11= ruleForStatement | this_ForEachStatement_12= ruleForEachStatement | this_InterruptStatement_13= ruleInterruptStatement | this_ActivityStatement_14= ruleActivityStatement | this_InvokeStatement_15= ruleInvokeStatement ) )
+            // InternalFormalML.g:21390:2: (this_BlockStatement_0= ruleBlockStatement | this_ExpressionStatement_1= ruleExpressionStatement | this_GuardStatement_2= ruleGuardStatement | this_TimedGuardStatement_3= ruleTimedGuardStatement | this_EventGuardStatement_4= ruleEventGuardStatement | this_CheckSatGuardStatement_5= ruleCheckSatGuardStatement | this_InputComStatement_6= ruleInputComStatement | this_OutputComStatement_7= ruleOutputComStatement | this_IfStatement_8= ruleIfStatement | this_WhileDoStatement_9= ruleWhileDoStatement | this_DoWhileStatement_10= ruleDoWhileStatement | this_ForStatement_11= ruleForStatement | this_ForEachStatement_12= ruleForEachStatement | this_InterruptStatement_13= ruleInterruptStatement | this_ActivityStatement_14= ruleActivityStatement | this_InvokeStatement_15= ruleInvokeStatement )
+            {
+            // InternalFormalML.g:21390:2: (this_BlockStatement_0= ruleBlockStatement | this_ExpressionStatement_1= ruleExpressionStatement | this_GuardStatement_2= ruleGuardStatement | this_TimedGuardStatement_3= ruleTimedGuardStatement | this_EventGuardStatement_4= ruleEventGuardStatement | this_CheckSatGuardStatement_5= ruleCheckSatGuardStatement | this_InputComStatement_6= ruleInputComStatement | this_OutputComStatement_7= ruleOutputComStatement | this_IfStatement_8= ruleIfStatement | this_WhileDoStatement_9= ruleWhileDoStatement | this_DoWhileStatement_10= ruleDoWhileStatement | this_ForStatement_11= ruleForStatement | this_ForEachStatement_12= ruleForEachStatement | this_InterruptStatement_13= ruleInterruptStatement | this_ActivityStatement_14= ruleActivityStatement | this_InvokeStatement_15= ruleInvokeStatement )
+            int alt494=16;
+            alt494 = dfa494.predict(input);
+            switch (alt494) {
+                case 1 :
+                    // InternalFormalML.g:21391:3: this_BlockStatement_0= ruleBlockStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getBlockStatementParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_BlockStatement_0=ruleBlockStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_BlockStatement_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:21403:3: this_ExpressionStatement_1= ruleExpressionStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getExpressionStatementParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ExpressionStatement_1=ruleExpressionStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ExpressionStatement_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:21415:3: this_GuardStatement_2= ruleGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getGuardStatementParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_GuardStatement_2=ruleGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_GuardStatement_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:21427:3: this_TimedGuardStatement_3= ruleTimedGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getTimedGuardStatementParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_TimedGuardStatement_3=ruleTimedGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_TimedGuardStatement_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:21439:3: this_EventGuardStatement_4= ruleEventGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getEventGuardStatementParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_EventGuardStatement_4=ruleEventGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_EventGuardStatement_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:21451:3: this_CheckSatGuardStatement_5= ruleCheckSatGuardStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getCheckSatGuardStatementParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_CheckSatGuardStatement_5=ruleCheckSatGuardStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_CheckSatGuardStatement_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:21463:3: this_InputComStatement_6= ruleInputComStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getInputComStatementParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_InputComStatement_6=ruleInputComStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_InputComStatement_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:21475:3: this_OutputComStatement_7= ruleOutputComStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getOutputComStatementParserRuleCall_7());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_OutputComStatement_7=ruleOutputComStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_OutputComStatement_7;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:21487:3: this_IfStatement_8= ruleIfStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getIfStatementParserRuleCall_8());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_IfStatement_8=ruleIfStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_IfStatement_8;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:21499:3: this_WhileDoStatement_9= ruleWhileDoStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getWhileDoStatementParserRuleCall_9());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_WhileDoStatement_9=ruleWhileDoStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_WhileDoStatement_9;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 11 :
+                    // InternalFormalML.g:21511:3: this_DoWhileStatement_10= ruleDoWhileStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getDoWhileStatementParserRuleCall_10());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_DoWhileStatement_10=ruleDoWhileStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DoWhileStatement_10;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 12 :
+                    // InternalFormalML.g:21523:3: this_ForStatement_11= ruleForStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getForStatementParserRuleCall_11());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ForStatement_11=ruleForStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ForStatement_11;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 13 :
+                    // InternalFormalML.g:21535:3: this_ForEachStatement_12= ruleForEachStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getForEachStatementParserRuleCall_12());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ForEachStatement_12=ruleForEachStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ForEachStatement_12;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 14 :
+                    // InternalFormalML.g:21547:3: this_InterruptStatement_13= ruleInterruptStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getInterruptStatementParserRuleCall_13());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_InterruptStatement_13=ruleInterruptStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_InterruptStatement_13;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 15 :
+                    // InternalFormalML.g:21559:3: this_ActivityStatement_14= ruleActivityStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getActivityStatementParserRuleCall_14());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ActivityStatement_14=ruleActivityStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ActivityStatement_14;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 16 :
+                    // InternalFormalML.g:21571:3: this_InvokeStatement_15= ruleInvokeStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getStatementAccess().getInvokeStatementParserRuleCall_15());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_InvokeStatement_15=ruleInvokeStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_InvokeStatement_15;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStatement"
+
+
+    // $ANTLR start "entryRuleBlockStatement"
+    // InternalFormalML.g:21586:1: entryRuleBlockStatement returns [EObject current=null] : iv_ruleBlockStatement= ruleBlockStatement EOF ;
+    public final EObject entryRuleBlockStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBlockStatement = null;
+
+
+        try {
+            // InternalFormalML.g:21586:55: (iv_ruleBlockStatement= ruleBlockStatement EOF )
+            // InternalFormalML.g:21587:2: iv_ruleBlockStatement= ruleBlockStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBlockStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBlockStatement=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBlockStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBlockStatement"
+
+
+    // $ANTLR start "ruleBlockStatement"
+    // InternalFormalML.g:21593:1: ruleBlockStatement returns [EObject current=null] : ( () otherlv_1= '{' ( (lv_op_2_0= ruleBlockStatementScheduler ) )? ( (lv_statement_3_0= ruleStatement ) )* otherlv_4= '}' ) ;
+    public final EObject ruleBlockStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_4=null;
+        AntlrDatatypeRuleToken lv_op_2_0 = null;
+
+        EObject lv_statement_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:21599:2: ( ( () otherlv_1= '{' ( (lv_op_2_0= ruleBlockStatementScheduler ) )? ( (lv_statement_3_0= ruleStatement ) )* otherlv_4= '}' ) )
+            // InternalFormalML.g:21600:2: ( () otherlv_1= '{' ( (lv_op_2_0= ruleBlockStatementScheduler ) )? ( (lv_statement_3_0= ruleStatement ) )* otherlv_4= '}' )
+            {
+            // InternalFormalML.g:21600:2: ( () otherlv_1= '{' ( (lv_op_2_0= ruleBlockStatementScheduler ) )? ( (lv_statement_3_0= ruleStatement ) )* otherlv_4= '}' )
+            // InternalFormalML.g:21601:3: () otherlv_1= '{' ( (lv_op_2_0= ruleBlockStatementScheduler ) )? ( (lv_statement_3_0= ruleStatement ) )* otherlv_4= '}'
+            {
+            // InternalFormalML.g:21601:3: ()
+            // InternalFormalML.g:21602:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getBlockStatementAccess().getBlockStatementAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,22,FollowSets000.FOLLOW_206); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getBlockStatementAccess().getLeftCurlyBracketKeyword_1());
+              		
+            }
+            // InternalFormalML.g:21615:3: ( (lv_op_2_0= ruleBlockStatementScheduler ) )?
+            int alt495=2;
+            int LA495_0 = input.LA(1);
+
+            if ( ((LA495_0>=152 && LA495_0<=167)) ) {
+                alt495=1;
+            }
+            switch (alt495) {
+                case 1 :
+                    // InternalFormalML.g:21616:4: (lv_op_2_0= ruleBlockStatementScheduler )
+                    {
+                    // InternalFormalML.g:21616:4: (lv_op_2_0= ruleBlockStatementScheduler )
+                    // InternalFormalML.g:21617:5: lv_op_2_0= ruleBlockStatementScheduler
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getBlockStatementAccess().getOpBlockStatementSchedulerParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_194);
+                    lv_op_2_0=ruleBlockStatementScheduler();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getBlockStatementRule());
+                      					}
+                      					set(
+                      						current,
+                      						"op",
+                      						lv_op_2_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatementScheduler");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:21634:3: ( (lv_statement_3_0= ruleStatement ) )*
+            loop496:
+            do {
+                int alt496=2;
+                int LA496_0 = input.LA(1);
+
+                if ( (LA496_0==RULE_XLIA_ID||LA496_0==22||LA496_0==56||LA496_0==61||(LA496_0>=63 && LA496_0<=64)||LA496_0==85||LA496_0==87||(LA496_0>=168 && LA496_0<=171)||LA496_0==176||(LA496_0>=178 && LA496_0<=182)||(LA496_0>=216 && LA496_0<=219)||(LA496_0>=231 && LA496_0<=239)||(LA496_0>=271 && LA496_0<=287)) ) {
+                    alt496=1;
+                }
+
+
+                switch (alt496) {
+            	case 1 :
+            	    // InternalFormalML.g:21635:4: (lv_statement_3_0= ruleStatement )
+            	    {
+            	    // InternalFormalML.g:21635:4: (lv_statement_3_0= ruleStatement )
+            	    // InternalFormalML.g:21636:5: lv_statement_3_0= ruleStatement
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getBlockStatementAccess().getStatementStatementParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_194);
+            	    lv_statement_3_0=ruleStatement();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getBlockStatementRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"statement",
+            	      						lv_statement_3_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Statement");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop496;
+                }
+            } while (true);
+
+            otherlv_4=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getBlockStatementAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBlockStatement"
+
+
+    // $ANTLR start "entryRuleBlockStatementScheduler"
+    // InternalFormalML.g:21661:1: entryRuleBlockStatementScheduler returns [String current=null] : iv_ruleBlockStatementScheduler= ruleBlockStatementScheduler EOF ;
+    public final String entryRuleBlockStatementScheduler() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleBlockStatementScheduler = null;
+
+
+        try {
+            // InternalFormalML.g:21661:63: (iv_ruleBlockStatementScheduler= ruleBlockStatementScheduler EOF )
+            // InternalFormalML.g:21662:2: iv_ruleBlockStatementScheduler= ruleBlockStatementScheduler EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBlockStatementSchedulerRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBlockStatementScheduler=ruleBlockStatementScheduler();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBlockStatementScheduler.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBlockStatementScheduler"
+
+
+    // $ANTLR start "ruleBlockStatementScheduler"
+    // InternalFormalML.g:21668:1: ruleBlockStatementScheduler returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '|;|' | kw= '|\\u00A7|' | kw= '|;;|' | kw= '|.|' | kw= '|/;|' | kw= '|i|' | kw= '|,|' | kw= '|a|' | kw= '|and|' | kw= '|or|' | kw= '|and#then|' | kw= '|or#else|' | kw= '|indet|' | kw= '|/\\\\|' | kw= '|fork|' | kw= '|join|' ) ;
+    public final AntlrDatatypeRuleToken ruleBlockStatementScheduler() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:21674:2: ( (kw= '|;|' | kw= '|\\u00A7|' | kw= '|;;|' | kw= '|.|' | kw= '|/;|' | kw= '|i|' | kw= '|,|' | kw= '|a|' | kw= '|and|' | kw= '|or|' | kw= '|and#then|' | kw= '|or#else|' | kw= '|indet|' | kw= '|/\\\\|' | kw= '|fork|' | kw= '|join|' ) )
+            // InternalFormalML.g:21675:2: (kw= '|;|' | kw= '|\\u00A7|' | kw= '|;;|' | kw= '|.|' | kw= '|/;|' | kw= '|i|' | kw= '|,|' | kw= '|a|' | kw= '|and|' | kw= '|or|' | kw= '|and#then|' | kw= '|or#else|' | kw= '|indet|' | kw= '|/\\\\|' | kw= '|fork|' | kw= '|join|' )
+            {
+            // InternalFormalML.g:21675:2: (kw= '|;|' | kw= '|\\u00A7|' | kw= '|;;|' | kw= '|.|' | kw= '|/;|' | kw= '|i|' | kw= '|,|' | kw= '|a|' | kw= '|and|' | kw= '|or|' | kw= '|and#then|' | kw= '|or#else|' | kw= '|indet|' | kw= '|/\\\\|' | kw= '|fork|' | kw= '|join|' )
+            int alt497=16;
+            switch ( input.LA(1) ) {
+            case 152:
+                {
+                alt497=1;
+                }
+                break;
+            case 153:
+                {
+                alt497=2;
+                }
+                break;
+            case 154:
+                {
+                alt497=3;
+                }
+                break;
+            case 155:
+                {
+                alt497=4;
+                }
+                break;
+            case 156:
+                {
+                alt497=5;
+                }
+                break;
+            case 157:
+                {
+                alt497=6;
+                }
+                break;
+            case 158:
+                {
+                alt497=7;
+                }
+                break;
+            case 159:
+                {
+                alt497=8;
+                }
+                break;
+            case 160:
+                {
+                alt497=9;
+                }
+                break;
+            case 161:
+                {
+                alt497=10;
+                }
+                break;
+            case 162:
+                {
+                alt497=11;
+                }
+                break;
+            case 163:
+                {
+                alt497=12;
+                }
+                break;
+            case 164:
+                {
+                alt497=13;
+                }
+                break;
+            case 165:
+                {
+                alt497=14;
+                }
+                break;
+            case 166:
+                {
+                alt497=15;
+                }
+                break;
+            case 167:
+                {
+                alt497=16;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 497, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt497) {
+                case 1 :
+                    // InternalFormalML.g:21676:3: kw= '|;|'
+                    {
+                    kw=(Token)match(input,152,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonVerticalLineKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:21682:3: kw= '|\\u00A7|'
+                    {
+                    kw=(Token)match(input,153,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSectionSignVerticalLineKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:21688:3: kw= '|;;|'
+                    {
+                    kw=(Token)match(input,154,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSemicolonSemicolonVerticalLineKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:21694:3: kw= '|.|'
+                    {
+                    kw=(Token)match(input,155,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineFullStopVerticalLineKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:21700:3: kw= '|/;|'
+                    {
+                    kw=(Token)match(input,156,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusSemicolonVerticalLineKeyword_4());
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:21706:3: kw= '|i|'
+                    {
+                    kw=(Token)match(input,157,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getIKeyword_5());
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:21712:3: kw= '|,|'
+                    {
+                    kw=(Token)match(input,158,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineCommaVerticalLineKeyword_6());
+                      		
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:21718:3: kw= '|a|'
+                    {
+                    kw=(Token)match(input,159,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAKeyword_7());
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:21724:3: kw= '|and|'
+                    {
+                    kw=(Token)match(input,160,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAndKeyword_8());
+                      		
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:21730:3: kw= '|or|'
+                    {
+                    kw=(Token)match(input,161,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getOrKeyword_9());
+                      		
+                    }
+
+                    }
+                    break;
+                case 11 :
+                    // InternalFormalML.g:21736:3: kw= '|and#then|'
+                    {
+                    kw=(Token)match(input,162,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getAndThenKeyword_10());
+                      		
+                    }
+
+                    }
+                    break;
+                case 12 :
+                    // InternalFormalML.g:21742:3: kw= '|or#else|'
+                    {
+                    kw=(Token)match(input,163,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getOrElseKeyword_11());
+                      		
+                    }
+
+                    }
+                    break;
+                case 13 :
+                    // InternalFormalML.g:21748:3: kw= '|indet|'
+                    {
+                    kw=(Token)match(input,164,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getIndetKeyword_12());
+                      		
+                    }
+
+                    }
+                    break;
+                case 14 :
+                    // InternalFormalML.g:21754:3: kw= '|/\\\\|'
+                    {
+                    kw=(Token)match(input,165,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getVerticalLineSolidusReverseSolidusVerticalLineKeyword_13());
+                      		
+                    }
+
+                    }
+                    break;
+                case 15 :
+                    // InternalFormalML.g:21760:3: kw= '|fork|'
+                    {
+                    kw=(Token)match(input,166,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getForkKeyword_14());
+                      		
+                    }
+
+                    }
+                    break;
+                case 16 :
+                    // InternalFormalML.g:21766:3: kw= '|join|'
+                    {
+                    kw=(Token)match(input,167,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getBlockStatementSchedulerAccess().getJoinKeyword_15());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBlockStatementScheduler"
+
+
+    // $ANTLR start "entryRuleExpressionStatement"
+    // InternalFormalML.g:21775:1: entryRuleExpressionStatement returns [EObject current=null] : iv_ruleExpressionStatement= ruleExpressionStatement EOF ;
+    public final EObject entryRuleExpressionStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleExpressionStatement = null;
+
+
+        try {
+            // InternalFormalML.g:21775:60: (iv_ruleExpressionStatement= ruleExpressionStatement EOF )
+            // InternalFormalML.g:21776:2: iv_ruleExpressionStatement= ruleExpressionStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getExpressionStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleExpressionStatement=ruleExpressionStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleExpressionStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleExpressionStatement"
+
+
+    // $ANTLR start "ruleExpressionStatement"
+    // InternalFormalML.g:21782:1: ruleExpressionStatement returns [EObject current=null] : ( ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' ) | ( ( (lv_expression_2_0= ruleNewfreshExpression ) ) otherlv_3= ';' ) | ( ( (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression ) ) otherlv_5= ';' ) | ( ( (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression ) ) otherlv_7= ';' ) ) ;
+    public final EObject ruleExpressionStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        EObject lv_expression_0_0 = null;
+
+        EObject lv_expression_2_0 = null;
+
+        EObject lv_expression_4_0 = null;
+
+        EObject lv_expression_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:21788:2: ( ( ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' ) | ( ( (lv_expression_2_0= ruleNewfreshExpression ) ) otherlv_3= ';' ) | ( ( (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression ) ) otherlv_5= ';' ) | ( ( (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression ) ) otherlv_7= ';' ) ) )
+            // InternalFormalML.g:21789:2: ( ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' ) | ( ( (lv_expression_2_0= ruleNewfreshExpression ) ) otherlv_3= ';' ) | ( ( (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression ) ) otherlv_5= ';' ) | ( ( (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression ) ) otherlv_7= ';' ) )
+            {
+            // InternalFormalML.g:21789:2: ( ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' ) | ( ( (lv_expression_2_0= ruleNewfreshExpression ) ) otherlv_3= ';' ) | ( ( (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression ) ) otherlv_5= ';' ) | ( ( (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression ) ) otherlv_7= ';' ) )
+            int alt498=4;
+            alt498 = dfa498.predict(input);
+            switch (alt498) {
+                case 1 :
+                    // InternalFormalML.g:21790:3: ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' )
+                    {
+                    // InternalFormalML.g:21790:3: ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' )
+                    // InternalFormalML.g:21791:4: ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';'
+                    {
+                    // InternalFormalML.g:21791:4: ( (lv_expression_0_0= ruleAssignmentExpression ) )
+                    // InternalFormalML.g:21792:5: (lv_expression_0_0= ruleAssignmentExpression )
+                    {
+                    // InternalFormalML.g:21792:5: (lv_expression_0_0= ruleAssignmentExpression )
+                    // InternalFormalML.g:21793:6: lv_expression_0_0= ruleAssignmentExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionAssignmentExpressionParserRuleCall_0_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_expression_0_0=ruleAssignmentExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"expression",
+                      							lv_expression_0_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.AssignmentExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_1=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_0_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:21816:3: ( ( (lv_expression_2_0= ruleNewfreshExpression ) ) otherlv_3= ';' )
+                    {
+                    // InternalFormalML.g:21816:3: ( ( (lv_expression_2_0= ruleNewfreshExpression ) ) otherlv_3= ';' )
+                    // InternalFormalML.g:21817:4: ( (lv_expression_2_0= ruleNewfreshExpression ) ) otherlv_3= ';'
+                    {
+                    // InternalFormalML.g:21817:4: ( (lv_expression_2_0= ruleNewfreshExpression ) )
+                    // InternalFormalML.g:21818:5: (lv_expression_2_0= ruleNewfreshExpression )
+                    {
+                    // InternalFormalML.g:21818:5: (lv_expression_2_0= ruleNewfreshExpression )
+                    // InternalFormalML.g:21819:6: lv_expression_2_0= ruleNewfreshExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionNewfreshExpressionParserRuleCall_1_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_expression_2_0=ruleNewfreshExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"expression",
+                      							lv_expression_2_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.NewfreshExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_3=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_1_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:21842:3: ( ( (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression ) ) otherlv_5= ';' )
+                    {
+                    // InternalFormalML.g:21842:3: ( ( (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression ) ) otherlv_5= ';' )
+                    // InternalFormalML.g:21843:4: ( (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression ) ) otherlv_5= ';'
+                    {
+                    // InternalFormalML.g:21843:4: ( (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression ) )
+                    // InternalFormalML.g:21844:5: (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression )
+                    {
+                    // InternalFormalML.g:21844:5: (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression )
+                    // InternalFormalML.g:21845:6: lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_expression_4_0=ruleIncrementOrDecrementPrefixExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"expression",
+                      							lv_expression_4_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPrefixExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_5=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_2_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:21868:3: ( ( (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression ) ) otherlv_7= ';' )
+                    {
+                    // InternalFormalML.g:21868:3: ( ( (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression ) ) otherlv_7= ';' )
+                    // InternalFormalML.g:21869:4: ( (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression ) ) otherlv_7= ';'
+                    {
+                    // InternalFormalML.g:21869:4: ( (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression ) )
+                    // InternalFormalML.g:21870:5: (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression )
+                    {
+                    // InternalFormalML.g:21870:5: (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression )
+                    // InternalFormalML.g:21871:6: lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_expression_6_0=ruleIncrementOrDecrementPostfixExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getExpressionStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"expression",
+                      							lv_expression_6_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPostfixExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_7=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getExpressionStatementAccess().getSemicolonKeyword_3_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleExpressionStatement"
+
+
+    // $ANTLR start "entryRuleGuardStatement"
+    // InternalFormalML.g:21897:1: entryRuleGuardStatement returns [EObject current=null] : iv_ruleGuardStatement= ruleGuardStatement EOF ;
+    public final EObject entryRuleGuardStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleGuardStatement = null;
+
+
+        try {
+            // InternalFormalML.g:21897:55: (iv_ruleGuardStatement= ruleGuardStatement EOF )
+            // InternalFormalML.g:21898:2: iv_ruleGuardStatement= ruleGuardStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getGuardStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleGuardStatement=ruleGuardStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleGuardStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleGuardStatement"
+
+
+    // $ANTLR start "ruleGuardStatement"
+    // InternalFormalML.g:21904:1: ruleGuardStatement returns [EObject current=null] : (otherlv_0= 'guard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' ) ;
+    public final EObject ruleGuardStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        EObject lv_condition_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:21910:2: ( (otherlv_0= 'guard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' ) )
+            // InternalFormalML.g:21911:2: (otherlv_0= 'guard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' )
+            {
+            // InternalFormalML.g:21911:2: (otherlv_0= 'guard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' )
+            // InternalFormalML.g:21912:3: otherlv_0= 'guard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';'
+            {
+            otherlv_0=(Token)match(input,168,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getGuardStatementAccess().getGuardKeyword_0());
+              		
+            }
+            // InternalFormalML.g:21916:3: ( (lv_condition_1_0= ruleExpression ) )
+            // InternalFormalML.g:21917:4: (lv_condition_1_0= ruleExpression )
+            {
+            // InternalFormalML.g:21917:4: (lv_condition_1_0= ruleExpression )
+            // InternalFormalML.g:21918:5: lv_condition_1_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getGuardStatementAccess().getConditionExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_14);
+            lv_condition_1_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getGuardStatementRule());
+              					}
+              					set(
+              						current,
+              						"condition",
+              						lv_condition_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getGuardStatementAccess().getSemicolonKeyword_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleGuardStatement"
+
+
+    // $ANTLR start "entryRuleTimedGuardStatement"
+    // InternalFormalML.g:21943:1: entryRuleTimedGuardStatement returns [EObject current=null] : iv_ruleTimedGuardStatement= ruleTimedGuardStatement EOF ;
+    public final EObject entryRuleTimedGuardStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTimedGuardStatement = null;
+
+
+        try {
+            // InternalFormalML.g:21943:60: (iv_ruleTimedGuardStatement= ruleTimedGuardStatement EOF )
+            // InternalFormalML.g:21944:2: iv_ruleTimedGuardStatement= ruleTimedGuardStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTimedGuardStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTimedGuardStatement=ruleTimedGuardStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTimedGuardStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTimedGuardStatement"
+
+
+    // $ANTLR start "ruleTimedGuardStatement"
+    // InternalFormalML.g:21950:1: ruleTimedGuardStatement returns [EObject current=null] : (otherlv_0= 'tguard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' ) ;
+    public final EObject ruleTimedGuardStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        EObject lv_condition_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:21956:2: ( (otherlv_0= 'tguard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' ) )
+            // InternalFormalML.g:21957:2: (otherlv_0= 'tguard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' )
+            {
+            // InternalFormalML.g:21957:2: (otherlv_0= 'tguard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' )
+            // InternalFormalML.g:21958:3: otherlv_0= 'tguard' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';'
+            {
+            otherlv_0=(Token)match(input,169,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getTimedGuardStatementAccess().getTguardKeyword_0());
+              		
+            }
+            // InternalFormalML.g:21962:3: ( (lv_condition_1_0= ruleExpression ) )
+            // InternalFormalML.g:21963:4: (lv_condition_1_0= ruleExpression )
+            {
+            // InternalFormalML.g:21963:4: (lv_condition_1_0= ruleExpression )
+            // InternalFormalML.g:21964:5: lv_condition_1_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getTimedGuardStatementAccess().getConditionExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_14);
+            lv_condition_1_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getTimedGuardStatementRule());
+              					}
+              					set(
+              						current,
+              						"condition",
+              						lv_condition_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getTimedGuardStatementAccess().getSemicolonKeyword_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTimedGuardStatement"
+
+
+    // $ANTLR start "entryRuleEventGuardStatement"
+    // InternalFormalML.g:21989:1: entryRuleEventGuardStatement returns [EObject current=null] : iv_ruleEventGuardStatement= ruleEventGuardStatement EOF ;
+    public final EObject entryRuleEventGuardStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEventGuardStatement = null;
+
+
+        try {
+            // InternalFormalML.g:21989:60: (iv_ruleEventGuardStatement= ruleEventGuardStatement EOF )
+            // InternalFormalML.g:21990:2: iv_ruleEventGuardStatement= ruleEventGuardStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEventGuardStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEventGuardStatement=ruleEventGuardStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEventGuardStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEventGuardStatement"
+
+
+    // $ANTLR start "ruleEventGuardStatement"
+    // InternalFormalML.g:21996:1: ruleEventGuardStatement returns [EObject current=null] : (otherlv_0= 'event' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' ) ;
+    public final EObject ruleEventGuardStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        EObject lv_condition_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:22002:2: ( (otherlv_0= 'event' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' ) )
+            // InternalFormalML.g:22003:2: (otherlv_0= 'event' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' )
+            {
+            // InternalFormalML.g:22003:2: (otherlv_0= 'event' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';' )
+            // InternalFormalML.g:22004:3: otherlv_0= 'event' ( (lv_condition_1_0= ruleExpression ) ) otherlv_2= ';'
+            {
+            otherlv_0=(Token)match(input,170,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getEventGuardStatementAccess().getEventKeyword_0());
+              		
+            }
+            // InternalFormalML.g:22008:3: ( (lv_condition_1_0= ruleExpression ) )
+            // InternalFormalML.g:22009:4: (lv_condition_1_0= ruleExpression )
+            {
+            // InternalFormalML.g:22009:4: (lv_condition_1_0= ruleExpression )
+            // InternalFormalML.g:22010:5: lv_condition_1_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getEventGuardStatementAccess().getConditionExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_14);
+            lv_condition_1_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEventGuardStatementRule());
+              					}
+              					set(
+              						current,
+              						"condition",
+              						lv_condition_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getEventGuardStatementAccess().getSemicolonKeyword_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEventGuardStatement"
+
+
+    // $ANTLR start "entryRuleCheckSatGuardStatement"
+    // InternalFormalML.g:22035:1: entryRuleCheckSatGuardStatement returns [EObject current=null] : iv_ruleCheckSatGuardStatement= ruleCheckSatGuardStatement EOF ;
+    public final EObject entryRuleCheckSatGuardStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleCheckSatGuardStatement = null;
+
+
+        try {
+            // InternalFormalML.g:22035:63: (iv_ruleCheckSatGuardStatement= ruleCheckSatGuardStatement EOF )
+            // InternalFormalML.g:22036:2: iv_ruleCheckSatGuardStatement= ruleCheckSatGuardStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getCheckSatGuardStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleCheckSatGuardStatement=ruleCheckSatGuardStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleCheckSatGuardStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleCheckSatGuardStatement"
+
+
+    // $ANTLR start "ruleCheckSatGuardStatement"
+    // InternalFormalML.g:22042:1: ruleCheckSatGuardStatement returns [EObject current=null] : (otherlv_0= 'checksat' otherlv_1= '<' ( (lv_solver_2_0= ruleESIdentifier ) ) otherlv_3= '>' ( (lv_condition_4_0= ruleExpression ) ) otherlv_5= ';' ) ;
+    public final EObject ruleCheckSatGuardStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        AntlrDatatypeRuleToken lv_solver_2_0 = null;
+
+        EObject lv_condition_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:22048:2: ( (otherlv_0= 'checksat' otherlv_1= '<' ( (lv_solver_2_0= ruleESIdentifier ) ) otherlv_3= '>' ( (lv_condition_4_0= ruleExpression ) ) otherlv_5= ';' ) )
+            // InternalFormalML.g:22049:2: (otherlv_0= 'checksat' otherlv_1= '<' ( (lv_solver_2_0= ruleESIdentifier ) ) otherlv_3= '>' ( (lv_condition_4_0= ruleExpression ) ) otherlv_5= ';' )
+            {
+            // InternalFormalML.g:22049:2: (otherlv_0= 'checksat' otherlv_1= '<' ( (lv_solver_2_0= ruleESIdentifier ) ) otherlv_3= '>' ( (lv_condition_4_0= ruleExpression ) ) otherlv_5= ';' )
+            // InternalFormalML.g:22050:3: otherlv_0= 'checksat' otherlv_1= '<' ( (lv_solver_2_0= ruleESIdentifier ) ) otherlv_3= '>' ( (lv_condition_4_0= ruleExpression ) ) otherlv_5= ';'
+            {
+            otherlv_0=(Token)match(input,171,FollowSets000.FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getCheckSatGuardStatementAccess().getChecksatKeyword_0());
+              		
+            }
+            otherlv_1=(Token)match(input,16,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getCheckSatGuardStatementAccess().getLessThanSignKeyword_1());
+              		
+            }
+            // InternalFormalML.g:22058:3: ( (lv_solver_2_0= ruleESIdentifier ) )
+            // InternalFormalML.g:22059:4: (lv_solver_2_0= ruleESIdentifier )
+            {
+            // InternalFormalML.g:22059:4: (lv_solver_2_0= ruleESIdentifier )
+            // InternalFormalML.g:22060:5: lv_solver_2_0= ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCheckSatGuardStatementAccess().getSolverESIdentifierParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_23);
+            lv_solver_2_0=ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCheckSatGuardStatementRule());
+              					}
+              					set(
+              						current,
+              						"solver",
+              						lv_solver_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,37,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getCheckSatGuardStatementAccess().getGreaterThanSignKeyword_3());
+              		
+            }
+            // InternalFormalML.g:22081:3: ( (lv_condition_4_0= ruleExpression ) )
+            // InternalFormalML.g:22082:4: (lv_condition_4_0= ruleExpression )
+            {
+            // InternalFormalML.g:22082:4: (lv_condition_4_0= ruleExpression )
+            // InternalFormalML.g:22083:5: lv_condition_4_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCheckSatGuardStatementAccess().getConditionExpressionParserRuleCall_4_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_14);
+            lv_condition_4_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCheckSatGuardStatementRule());
+              					}
+              					set(
+              						current,
+              						"condition",
+              						lv_condition_4_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_5=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getCheckSatGuardStatementAccess().getSemicolonKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleCheckSatGuardStatement"
+
+
+    // $ANTLR start "entryRuleInputComStatement"
+    // InternalFormalML.g:22108:1: entryRuleInputComStatement returns [EObject current=null] : iv_ruleInputComStatement= ruleInputComStatement EOF ;
+    public final EObject entryRuleInputComStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleInputComStatement = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()
+        	);
+
+        try {
+            // InternalFormalML.g:22112:2: (iv_ruleInputComStatement= ruleInputComStatement EOF )
+            // InternalFormalML.g:22113:2: iv_ruleInputComStatement= ruleInputComStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getInputComStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleInputComStatement=ruleInputComStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleInputComStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleInputComStatement"
+
+
+    // $ANTLR start "ruleInputComStatement"
+    // InternalFormalML.g:22122:1: ruleInputComStatement returns [EObject current=null] : (otherlv_0= 'input' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_leftValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_leftValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';' ) ;
+    public final EObject ruleInputComStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        EObject lv_leftValue_3_0 = null;
+
+        EObject lv_leftValue_5_0 = null;
+
+        EObject lv_target_9_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getInputComStatementAccess().getUnorderedGroup_3()
+        	);
+
+        try {
+            // InternalFormalML.g:22131:2: ( (otherlv_0= 'input' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_leftValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_leftValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';' ) )
+            // InternalFormalML.g:22132:2: (otherlv_0= 'input' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_leftValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_leftValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';' )
+            {
+            // InternalFormalML.g:22132:2: (otherlv_0= 'input' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_leftValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_leftValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';' )
+            // InternalFormalML.g:22133:3: otherlv_0= 'input' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_leftValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_leftValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';'
+            {
+            otherlv_0=(Token)match(input,61,FollowSets000.FOLLOW_35); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getInputComStatementAccess().getInputKeyword_0());
+              		
+            }
+            // InternalFormalML.g:22137:3: ( ( ruleESUfid ) )
+            // InternalFormalML.g:22138:4: ( ruleESUfid )
+            {
+            // InternalFormalML.g:22138:4: ( ruleESUfid )
+            // InternalFormalML.g:22139:5: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+
+              					/* */
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getInputComStatementRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getInputComStatementAccess().getPortNamedElementCrossReference_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_207);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:22156:3: (otherlv_2= '(' ( (lv_leftValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_leftValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )?
+            int alt500=2;
+            int LA500_0 = input.LA(1);
+
+            if ( (LA500_0==56) ) {
+                alt500=1;
+            }
+            switch (alt500) {
+                case 1 :
+                    // InternalFormalML.g:22157:4: otherlv_2= '(' ( (lv_leftValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_leftValue_5_0= ruleExpression ) ) )* otherlv_6= ')'
+                    {
+                    otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getInputComStatementAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:22161:4: ( (lv_leftValue_3_0= ruleExpression ) )
+                    // InternalFormalML.g:22162:5: (lv_leftValue_3_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:22162:5: (lv_leftValue_3_0= ruleExpression )
+                    // InternalFormalML.g:22163:6: lv_leftValue_3_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_leftValue_3_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getInputComStatementRule());
+                      						}
+                      						add(
+                      							current,
+                      							"leftValue",
+                      							lv_leftValue_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:22180:4: (otherlv_4= ',' ( (lv_leftValue_5_0= ruleExpression ) ) )*
+                    loop499:
+                    do {
+                        int alt499=2;
+                        int LA499_0 = input.LA(1);
+
+                        if ( (LA499_0==20) ) {
+                            alt499=1;
+                        }
+
+
+                        switch (alt499) {
+                    	case 1 :
+                    	    // InternalFormalML.g:22181:5: otherlv_4= ',' ( (lv_leftValue_5_0= ruleExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getInputComStatementAccess().getCommaKeyword_2_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:22185:5: ( (lv_leftValue_5_0= ruleExpression ) )
+                    	    // InternalFormalML.g:22186:6: (lv_leftValue_5_0= ruleExpression )
+                    	    {
+                    	    // InternalFormalML.g:22186:6: (lv_leftValue_5_0= ruleExpression )
+                    	    // InternalFormalML.g:22187:7: lv_leftValue_5_0= ruleExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getInputComStatementAccess().getLeftValueExpressionParserRuleCall_2_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_leftValue_5_0=ruleExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getInputComStatementRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"leftValue",
+                    	      								lv_leftValue_5_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop499;
+                        }
+                    } while (true);
+
+                    otherlv_6=(Token)match(input,57,FollowSets000.FOLLOW_208); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getInputComStatementAccess().getRightParenthesisKeyword_2_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:22210:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:22211:4: ( ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:22211:4: ( ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) )
+            // InternalFormalML.g:22212:5: ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+            // InternalFormalML.g:22215:5: ( ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* )
+            // InternalFormalML.g:22216:6: ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:22216:6: ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )*
+            loop502:
+            do {
+                int alt502=3;
+                int LA502_0 = input.LA(1);
+
+                if ( LA502_0 == 172 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                    alt502=1;
+                }
+                else if ( LA502_0 == 173 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                    alt502=2;
+                }
+                else if ( LA502_0 == 174 && getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                    alt502=2;
+                }
+
+
+                switch (alt502) {
+            	case 1 :
+            	    // InternalFormalML.g:22217:4: ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:22217:4: ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) )
+            	    // InternalFormalML.g:22218:5: {...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleInputComStatement", "getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0)");
+            	    }
+            	    // InternalFormalML.g:22218:114: ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) )
+            	    // InternalFormalML.g:22219:6: ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0);
+            	    // InternalFormalML.g:22222:9: ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) )
+            	    // InternalFormalML.g:22222:10: {...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleInputComStatement", "true");
+            	    }
+            	    // InternalFormalML.g:22222:19: (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) )
+            	    // InternalFormalML.g:22222:20: otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) )
+            	    {
+            	    otherlv_8=(Token)match(input,172,FollowSets000.FOLLOW_122); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_8, grammarAccess.getInputComStatementAccess().getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:22226:9: ( (lv_target_9_0= ruleExpressionAsMachine ) )
+            	    // InternalFormalML.g:22227:10: (lv_target_9_0= ruleExpressionAsMachine )
+            	    {
+            	    // InternalFormalML.g:22227:10: (lv_target_9_0= ruleExpressionAsMachine )
+            	    // InternalFormalML.g:22228:11: lv_target_9_0= ruleExpressionAsMachine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getInputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_208);
+            	    lv_target_9_0=ruleExpressionAsMachine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getInputComStatementRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"target",
+            	      												lv_target_9_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.ExpressionAsMachine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:22251:4: ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:22251:4: ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) )
+            	    // InternalFormalML.g:22252:5: {...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleInputComStatement", "getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1)");
+            	    }
+            	    // InternalFormalML.g:22252:114: ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) )
+            	    // InternalFormalML.g:22253:6: ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1);
+            	    // InternalFormalML.g:22256:9: ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) )
+            	    // InternalFormalML.g:22256:10: {...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleInputComStatement", "true");
+            	    }
+            	    // InternalFormalML.g:22256:19: ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) )
+            	    // InternalFormalML.g:22256:20: (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) )
+            	    {
+            	    // InternalFormalML.g:22256:20: (otherlv_10= '<==' | otherlv_11= 'via' )
+            	    int alt501=2;
+            	    int LA501_0 = input.LA(1);
+
+            	    if ( (LA501_0==173) ) {
+            	        alt501=1;
+            	    }
+            	    else if ( (LA501_0==174) ) {
+            	        alt501=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 501, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt501) {
+            	        case 1 :
+            	            // InternalFormalML.g:22257:10: otherlv_10= '<=='
+            	            {
+            	            otherlv_10=(Token)match(input,173,FollowSets000.FOLLOW_35); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              										newLeafNode(otherlv_10, grammarAccess.getInputComStatementAccess().getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0());
+            	              									
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:22262:10: otherlv_11= 'via'
+            	            {
+            	            otherlv_11=(Token)match(input,174,FollowSets000.FOLLOW_35); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              										newLeafNode(otherlv_11, grammarAccess.getInputComStatementAccess().getViaKeyword_3_1_0_1());
+            	              									
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalFormalML.g:22267:9: ( ( ruleESUfid ) )
+            	    // InternalFormalML.g:22268:10: ( ruleESUfid )
+            	    {
+            	    // InternalFormalML.g:22268:10: ( ruleESUfid )
+            	    // InternalFormalML.g:22269:11: ruleESUfid
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											/* */
+            	      										
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElement(grammarAccess.getInputComStatementRule());
+            	      											}
+            	      										
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getInputComStatementAccess().getRouteChannelCrossReference_3_1_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_208);
+            	    ruleESUfid();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop502;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3());
+
+            }
+
+            otherlv_13=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_13, grammarAccess.getInputComStatementAccess().getSemicolonKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleInputComStatement"
+
+
+    // $ANTLR start "entryRuleOutputComStatement"
+    // InternalFormalML.g:22310:1: entryRuleOutputComStatement returns [EObject current=null] : iv_ruleOutputComStatement= ruleOutputComStatement EOF ;
+    public final EObject entryRuleOutputComStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleOutputComStatement = null;
+
+
+
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()
+        	);
+
+        try {
+            // InternalFormalML.g:22314:2: (iv_ruleOutputComStatement= ruleOutputComStatement EOF )
+            // InternalFormalML.g:22315:2: iv_ruleOutputComStatement= ruleOutputComStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getOutputComStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleOutputComStatement=ruleOutputComStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleOutputComStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleOutputComStatement"
+
+
+    // $ANTLR start "ruleOutputComStatement"
+    // InternalFormalML.g:22324:1: ruleOutputComStatement returns [EObject current=null] : (otherlv_0= 'output' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_rigthValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_rigthValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';' ) ;
+    public final EObject ruleOutputComStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        EObject lv_rigthValue_3_0 = null;
+
+        EObject lv_rigthValue_5_0 = null;
+
+        EObject lv_target_9_0 = null;
+
+
+
+        	enterRule();
+        	UnorderedGroupState myUnorderedGroupState = getUnorderedGroupHelper().snapShot(
+        	grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3()
+        	);
+
+        try {
+            // InternalFormalML.g:22333:2: ( (otherlv_0= 'output' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_rigthValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_rigthValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';' ) )
+            // InternalFormalML.g:22334:2: (otherlv_0= 'output' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_rigthValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_rigthValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';' )
+            {
+            // InternalFormalML.g:22334:2: (otherlv_0= 'output' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_rigthValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_rigthValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';' )
+            // InternalFormalML.g:22335:3: otherlv_0= 'output' ( ( ruleESUfid ) ) (otherlv_2= '(' ( (lv_rigthValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_rigthValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) ) otherlv_13= ';'
+            {
+            otherlv_0=(Token)match(input,63,FollowSets000.FOLLOW_35); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getOutputComStatementAccess().getOutputKeyword_0());
+              		
+            }
+            // InternalFormalML.g:22339:3: ( ( ruleESUfid ) )
+            // InternalFormalML.g:22340:4: ( ruleESUfid )
+            {
+            // InternalFormalML.g:22340:4: ( ruleESUfid )
+            // InternalFormalML.g:22341:5: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+
+              					/* */
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getOutputComStatementRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getOutputComStatementAccess().getPortNamedElementCrossReference_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_209);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:22358:3: (otherlv_2= '(' ( (lv_rigthValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_rigthValue_5_0= ruleExpression ) ) )* otherlv_6= ')' )?
+            int alt504=2;
+            int LA504_0 = input.LA(1);
+
+            if ( (LA504_0==56) ) {
+                alt504=1;
+            }
+            switch (alt504) {
+                case 1 :
+                    // InternalFormalML.g:22359:4: otherlv_2= '(' ( (lv_rigthValue_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_rigthValue_5_0= ruleExpression ) ) )* otherlv_6= ')'
+                    {
+                    otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getOutputComStatementAccess().getLeftParenthesisKeyword_2_0());
+                      			
+                    }
+                    // InternalFormalML.g:22363:4: ( (lv_rigthValue_3_0= ruleExpression ) )
+                    // InternalFormalML.g:22364:5: (lv_rigthValue_3_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:22364:5: (lv_rigthValue_3_0= ruleExpression )
+                    // InternalFormalML.g:22365:6: lv_rigthValue_3_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_rigthValue_3_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
+                      						}
+                      						add(
+                      							current,
+                      							"rigthValue",
+                      							lv_rigthValue_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:22382:4: (otherlv_4= ',' ( (lv_rigthValue_5_0= ruleExpression ) ) )*
+                    loop503:
+                    do {
+                        int alt503=2;
+                        int LA503_0 = input.LA(1);
+
+                        if ( (LA503_0==20) ) {
+                            alt503=1;
+                        }
+
+
+                        switch (alt503) {
+                    	case 1 :
+                    	    // InternalFormalML.g:22383:5: otherlv_4= ',' ( (lv_rigthValue_5_0= ruleExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getOutputComStatementAccess().getCommaKeyword_2_2_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:22387:5: ( (lv_rigthValue_5_0= ruleExpression ) )
+                    	    // InternalFormalML.g:22388:6: (lv_rigthValue_5_0= ruleExpression )
+                    	    {
+                    	    // InternalFormalML.g:22388:6: (lv_rigthValue_5_0= ruleExpression )
+                    	    // InternalFormalML.g:22389:7: lv_rigthValue_5_0= ruleExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getOutputComStatementAccess().getRigthValueExpressionParserRuleCall_2_2_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_rigthValue_5_0=ruleExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"rigthValue",
+                    	      								lv_rigthValue_5_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop503;
+                        }
+                    } while (true);
+
+                    otherlv_6=(Token)match(input,57,FollowSets000.FOLLOW_210); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getOutputComStatementAccess().getRightParenthesisKeyword_2_3());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:22412:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) ) )
+            // InternalFormalML.g:22413:4: ( ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) )
+            {
+            // InternalFormalML.g:22413:4: ( ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* ) )
+            // InternalFormalML.g:22414:5: ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+            // InternalFormalML.g:22417:5: ( ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )* )
+            // InternalFormalML.g:22418:6: ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )*
+            {
+            // InternalFormalML.g:22418:6: ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )*
+            loop506:
+            do {
+                int alt506=3;
+                int LA506_0 = input.LA(1);
+
+                if ( LA506_0 == 59 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+                    alt506=1;
+                }
+                else if ( LA506_0 == 175 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                    alt506=2;
+                }
+                else if ( LA506_0 == 174 && getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+                    alt506=2;
+                }
+
+
+                switch (alt506) {
+            	case 1 :
+            	    // InternalFormalML.g:22419:4: ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:22419:4: ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) )
+            	    // InternalFormalML.g:22420:5: {...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleOutputComStatement", "getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0)");
+            	    }
+            	    // InternalFormalML.g:22420:115: ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) )
+            	    // InternalFormalML.g:22421:6: ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0);
+            	    // InternalFormalML.g:22424:9: ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) )
+            	    // InternalFormalML.g:22424:10: {...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleOutputComStatement", "true");
+            	    }
+            	    // InternalFormalML.g:22424:19: (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) )
+            	    // InternalFormalML.g:22424:20: otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) )
+            	    {
+            	    otherlv_8=(Token)match(input,59,FollowSets000.FOLLOW_122); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_8, grammarAccess.getOutputComStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0());
+            	      								
+            	    }
+            	    // InternalFormalML.g:22428:9: ( (lv_target_9_0= ruleExpressionAsMachine ) )
+            	    // InternalFormalML.g:22429:10: (lv_target_9_0= ruleExpressionAsMachine )
+            	    {
+            	    // InternalFormalML.g:22429:10: (lv_target_9_0= ruleExpressionAsMachine )
+            	    // InternalFormalML.g:22430:11: lv_target_9_0= ruleExpressionAsMachine
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getOutputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_210);
+            	    lv_target_9_0=ruleExpressionAsMachine();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElementForParent(grammarAccess.getOutputComStatementRule());
+            	      											}
+            	      											set(
+            	      												current,
+            	      												"target",
+            	      												lv_target_9_0,
+            	      												"org.eclipse.efm.formalml.xtext.FormalML.ExpressionAsMachine");
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:22453:4: ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) )
+            	    {
+            	    // InternalFormalML.g:22453:4: ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) )
+            	    // InternalFormalML.g:22454:5: {...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleOutputComStatement", "getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1)");
+            	    }
+            	    // InternalFormalML.g:22454:115: ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) )
+            	    // InternalFormalML.g:22455:6: ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1);
+            	    // InternalFormalML.g:22458:9: ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) )
+            	    // InternalFormalML.g:22458:10: {...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleOutputComStatement", "true");
+            	    }
+            	    // InternalFormalML.g:22458:19: ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) )
+            	    // InternalFormalML.g:22458:20: (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) )
+            	    {
+            	    // InternalFormalML.g:22458:20: (otherlv_10= '==>' | otherlv_11= 'via' )
+            	    int alt505=2;
+            	    int LA505_0 = input.LA(1);
+
+            	    if ( (LA505_0==175) ) {
+            	        alt505=1;
+            	    }
+            	    else if ( (LA505_0==174) ) {
+            	        alt505=2;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 505, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt505) {
+            	        case 1 :
+            	            // InternalFormalML.g:22459:10: otherlv_10= '==>'
+            	            {
+            	            otherlv_10=(Token)match(input,175,FollowSets000.FOLLOW_35); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              										newLeafNode(otherlv_10, grammarAccess.getOutputComStatementAccess().getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0());
+            	              									
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:22464:10: otherlv_11= 'via'
+            	            {
+            	            otherlv_11=(Token)match(input,174,FollowSets000.FOLLOW_35); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              										newLeafNode(otherlv_11, grammarAccess.getOutputComStatementAccess().getViaKeyword_3_1_0_1());
+            	              									
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+            	    // InternalFormalML.g:22469:9: ( ( ruleESUfid ) )
+            	    // InternalFormalML.g:22470:10: ( ruleESUfid )
+            	    {
+            	    // InternalFormalML.g:22470:10: ( ruleESUfid )
+            	    // InternalFormalML.g:22471:11: ruleESUfid
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      											/* */
+            	      										
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElement(grammarAccess.getOutputComStatementRule());
+            	      											}
+            	      										
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      											newCompositeNode(grammarAccess.getOutputComStatementAccess().getRouteChannelCrossReference_3_1_1_0());
+            	      										
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_210);
+            	    ruleESUfid();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											afterParserOrEnumRuleCall();
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop506;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3());
+
+            }
+
+            otherlv_13=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_13, grammarAccess.getOutputComStatementAccess().getSemicolonKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+
+            	myUnorderedGroupState.restore();
+
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOutputComStatement"
+
+
+    // $ANTLR start "entryRuleExpressionAsMachine"
+    // InternalFormalML.g:22512:1: entryRuleExpressionAsMachine returns [EObject current=null] : iv_ruleExpressionAsMachine= ruleExpressionAsMachine EOF ;
+    public final EObject entryRuleExpressionAsMachine() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleExpressionAsMachine = null;
+
+
+        try {
+            // InternalFormalML.g:22512:60: (iv_ruleExpressionAsMachine= ruleExpressionAsMachine EOF )
+            // InternalFormalML.g:22513:2: iv_ruleExpressionAsMachine= ruleExpressionAsMachine EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getExpressionAsMachineRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleExpressionAsMachine=ruleExpressionAsMachine();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleExpressionAsMachine; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleExpressionAsMachine"
+
+
+    // $ANTLR start "ruleExpressionAsMachine"
+    // InternalFormalML.g:22519:1: ruleExpressionAsMachine returns [EObject current=null] : ( (lv_machine_0_0= ruleValuePureNamedMachineExpression ) ) ;
+    public final EObject ruleExpressionAsMachine() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_machine_0_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:22525:2: ( ( (lv_machine_0_0= ruleValuePureNamedMachineExpression ) ) )
+            // InternalFormalML.g:22526:2: ( (lv_machine_0_0= ruleValuePureNamedMachineExpression ) )
+            {
+            // InternalFormalML.g:22526:2: ( (lv_machine_0_0= ruleValuePureNamedMachineExpression ) )
+            // InternalFormalML.g:22527:3: (lv_machine_0_0= ruleValuePureNamedMachineExpression )
+            {
+            // InternalFormalML.g:22527:3: (lv_machine_0_0= ruleValuePureNamedMachineExpression )
+            // InternalFormalML.g:22528:4: lv_machine_0_0= ruleValuePureNamedMachineExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              				newCompositeNode(grammarAccess.getExpressionAsMachineAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_0());
+              			
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_machine_0_0=ruleValuePureNamedMachineExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              				if (current==null) {
+              					current = createModelElementForParent(grammarAccess.getExpressionAsMachineRule());
+              				}
+              				set(
+              					current,
+              					"machine",
+              					lv_machine_0_0,
+              					"org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
+              				afterParserOrEnumRuleCall();
+              			
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleExpressionAsMachine"
+
+
+    // $ANTLR start "entryRuleIfStatement"
+    // InternalFormalML.g:22548:1: entryRuleIfStatement returns [EObject current=null] : iv_ruleIfStatement= ruleIfStatement EOF ;
+    public final EObject entryRuleIfStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleIfStatement = null;
+
+
+        try {
+            // InternalFormalML.g:22548:52: (iv_ruleIfStatement= ruleIfStatement EOF )
+            // InternalFormalML.g:22549:2: iv_ruleIfStatement= ruleIfStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getIfStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleIfStatement=ruleIfStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleIfStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleIfStatement"
+
+
+    // $ANTLR start "ruleIfStatement"
+    // InternalFormalML.g:22555:1: ruleIfStatement returns [EObject current=null] : (otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ( (lv_elseifStatement_3_0= ruleElseIfStatement ) )* (otherlv_4= 'else' ( (lv_elseBlock_5_0= ruleBlockStatement ) ) )? ) ;
+    public final EObject ruleIfStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_4=null;
+        EObject lv_condition_1_0 = null;
+
+        EObject lv_bodyBlock_2_0 = null;
+
+        EObject lv_elseifStatement_3_0 = null;
+
+        EObject lv_elseBlock_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:22561:2: ( (otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ( (lv_elseifStatement_3_0= ruleElseIfStatement ) )* (otherlv_4= 'else' ( (lv_elseBlock_5_0= ruleBlockStatement ) ) )? ) )
+            // InternalFormalML.g:22562:2: (otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ( (lv_elseifStatement_3_0= ruleElseIfStatement ) )* (otherlv_4= 'else' ( (lv_elseBlock_5_0= ruleBlockStatement ) ) )? )
+            {
+            // InternalFormalML.g:22562:2: (otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ( (lv_elseifStatement_3_0= ruleElseIfStatement ) )* (otherlv_4= 'else' ( (lv_elseBlock_5_0= ruleBlockStatement ) ) )? )
+            // InternalFormalML.g:22563:3: otherlv_0= 'if' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ( (lv_elseifStatement_3_0= ruleElseIfStatement ) )* (otherlv_4= 'else' ( (lv_elseBlock_5_0= ruleBlockStatement ) ) )?
+            {
+            otherlv_0=(Token)match(input,176,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getIfStatementAccess().getIfKeyword_0());
+              		
+            }
+            // InternalFormalML.g:22567:3: ( (lv_condition_1_0= ruleExpression ) )
+            // InternalFormalML.g:22568:4: (lv_condition_1_0= ruleExpression )
+            {
+            // InternalFormalML.g:22568:4: (lv_condition_1_0= ruleExpression )
+            // InternalFormalML.g:22569:5: lv_condition_1_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIfStatementAccess().getConditionExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_61);
+            lv_condition_1_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIfStatementRule());
+              					}
+              					set(
+              						current,
+              						"condition",
+              						lv_condition_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:22586:3: ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            // InternalFormalML.g:22587:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:22587:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            // InternalFormalML.g:22588:5: lv_bodyBlock_2_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_211);
+            lv_bodyBlock_2_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIfStatementRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:22605:3: ( (lv_elseifStatement_3_0= ruleElseIfStatement ) )*
+            loop507:
+            do {
+                int alt507=2;
+                int LA507_0 = input.LA(1);
+
+                if ( (LA507_0==146) ) {
+                    int LA507_1 = input.LA(2);
+
+                    if ( (LA507_1==176) ) {
+                        alt507=1;
+                    }
+
+
+                }
+                else if ( (LA507_0==177) ) {
+                    alt507=1;
+                }
+
+
+                switch (alt507) {
+            	case 1 :
+            	    // InternalFormalML.g:22606:4: (lv_elseifStatement_3_0= ruleElseIfStatement )
+            	    {
+            	    // InternalFormalML.g:22606:4: (lv_elseifStatement_3_0= ruleElseIfStatement )
+            	    // InternalFormalML.g:22607:5: lv_elseifStatement_3_0= ruleElseIfStatement
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getIfStatementAccess().getElseifStatementElseIfStatementParserRuleCall_3_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_211);
+            	    lv_elseifStatement_3_0=ruleElseIfStatement();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getIfStatementRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"elseifStatement",
+            	      						lv_elseifStatement_3_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.ElseIfStatement");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop507;
+                }
+            } while (true);
+
+            // InternalFormalML.g:22624:3: (otherlv_4= 'else' ( (lv_elseBlock_5_0= ruleBlockStatement ) ) )?
+            int alt508=2;
+            int LA508_0 = input.LA(1);
+
+            if ( (LA508_0==146) ) {
+                alt508=1;
+            }
+            switch (alt508) {
+                case 1 :
+                    // InternalFormalML.g:22625:4: otherlv_4= 'else' ( (lv_elseBlock_5_0= ruleBlockStatement ) )
+                    {
+                    otherlv_4=(Token)match(input,146,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getIfStatementAccess().getElseKeyword_4_0());
+                      			
+                    }
+                    // InternalFormalML.g:22629:4: ( (lv_elseBlock_5_0= ruleBlockStatement ) )
+                    // InternalFormalML.g:22630:5: (lv_elseBlock_5_0= ruleBlockStatement )
+                    {
+                    // InternalFormalML.g:22630:5: (lv_elseBlock_5_0= ruleBlockStatement )
+                    // InternalFormalML.g:22631:6: lv_elseBlock_5_0= ruleBlockStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getIfStatementAccess().getElseBlockBlockStatementParserRuleCall_4_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_elseBlock_5_0=ruleBlockStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getIfStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"elseBlock",
+                      							lv_elseBlock_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIfStatement"
+
+
+    // $ANTLR start "entryRuleElseIfStatement"
+    // InternalFormalML.g:22653:1: entryRuleElseIfStatement returns [EObject current=null] : iv_ruleElseIfStatement= ruleElseIfStatement EOF ;
+    public final EObject entryRuleElseIfStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleElseIfStatement = null;
+
+
+        try {
+            // InternalFormalML.g:22653:56: (iv_ruleElseIfStatement= ruleElseIfStatement EOF )
+            // InternalFormalML.g:22654:2: iv_ruleElseIfStatement= ruleElseIfStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getElseIfStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleElseIfStatement=ruleElseIfStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleElseIfStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleElseIfStatement"
+
+
+    // $ANTLR start "ruleElseIfStatement"
+    // InternalFormalML.g:22660:1: ruleElseIfStatement returns [EObject current=null] : ( (otherlv_0= 'elseif' | (otherlv_1= 'else' otherlv_2= 'if' ) ) ( (lv_condition_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) ) ;
+    public final EObject ruleElseIfStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        EObject lv_condition_3_0 = null;
+
+        EObject lv_bodyBlock_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:22666:2: ( ( (otherlv_0= 'elseif' | (otherlv_1= 'else' otherlv_2= 'if' ) ) ( (lv_condition_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) ) )
+            // InternalFormalML.g:22667:2: ( (otherlv_0= 'elseif' | (otherlv_1= 'else' otherlv_2= 'if' ) ) ( (lv_condition_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) )
+            {
+            // InternalFormalML.g:22667:2: ( (otherlv_0= 'elseif' | (otherlv_1= 'else' otherlv_2= 'if' ) ) ( (lv_condition_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) )
+            // InternalFormalML.g:22668:3: (otherlv_0= 'elseif' | (otherlv_1= 'else' otherlv_2= 'if' ) ) ( (lv_condition_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) )
+            {
+            // InternalFormalML.g:22668:3: (otherlv_0= 'elseif' | (otherlv_1= 'else' otherlv_2= 'if' ) )
+            int alt509=2;
+            int LA509_0 = input.LA(1);
+
+            if ( (LA509_0==177) ) {
+                alt509=1;
+            }
+            else if ( (LA509_0==146) ) {
+                alt509=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 509, 0, input);
+
+                throw nvae;
+            }
+            switch (alt509) {
+                case 1 :
+                    // InternalFormalML.g:22669:4: otherlv_0= 'elseif'
+                    {
+                    otherlv_0=(Token)match(input,177,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getElseIfStatementAccess().getElseifKeyword_0_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:22674:4: (otherlv_1= 'else' otherlv_2= 'if' )
+                    {
+                    // InternalFormalML.g:22674:4: (otherlv_1= 'else' otherlv_2= 'if' )
+                    // InternalFormalML.g:22675:5: otherlv_1= 'else' otherlv_2= 'if'
+                    {
+                    otherlv_1=(Token)match(input,146,FollowSets000.FOLLOW_212); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_1, grammarAccess.getElseIfStatementAccess().getElseKeyword_0_1_0());
+                      				
+                    }
+                    otherlv_2=(Token)match(input,176,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_2, grammarAccess.getElseIfStatementAccess().getIfKeyword_0_1_1());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:22685:3: ( (lv_condition_3_0= ruleExpression ) )
+            // InternalFormalML.g:22686:4: (lv_condition_3_0= ruleExpression )
+            {
+            // InternalFormalML.g:22686:4: (lv_condition_3_0= ruleExpression )
+            // InternalFormalML.g:22687:5: lv_condition_3_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getElseIfStatementAccess().getConditionExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_61);
+            lv_condition_3_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getElseIfStatementRule());
+              					}
+              					set(
+              						current,
+              						"condition",
+              						lv_condition_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:22704:3: ( (lv_bodyBlock_4_0= ruleBlockStatement ) )
+            // InternalFormalML.g:22705:4: (lv_bodyBlock_4_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:22705:4: (lv_bodyBlock_4_0= ruleBlockStatement )
+            // InternalFormalML.g:22706:5: lv_bodyBlock_4_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getElseIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_bodyBlock_4_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getElseIfStatementRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_4_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleElseIfStatement"
+
+
+    // $ANTLR start "entryRuleWhileDoStatement"
+    // InternalFormalML.g:22727:1: entryRuleWhileDoStatement returns [EObject current=null] : iv_ruleWhileDoStatement= ruleWhileDoStatement EOF ;
+    public final EObject entryRuleWhileDoStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleWhileDoStatement = null;
+
+
+        try {
+            // InternalFormalML.g:22727:57: (iv_ruleWhileDoStatement= ruleWhileDoStatement EOF )
+            // InternalFormalML.g:22728:2: iv_ruleWhileDoStatement= ruleWhileDoStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getWhileDoStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleWhileDoStatement=ruleWhileDoStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleWhileDoStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleWhileDoStatement"
+
+
+    // $ANTLR start "ruleWhileDoStatement"
+    // InternalFormalML.g:22734:1: ruleWhileDoStatement returns [EObject current=null] : (otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) ;
+    public final EObject ruleWhileDoStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_condition_1_0 = null;
+
+        EObject lv_bodyBlock_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:22740:2: ( (otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) ) )
+            // InternalFormalML.g:22741:2: (otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            {
+            // InternalFormalML.g:22741:2: (otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) ) )
+            // InternalFormalML.g:22742:3: otherlv_0= 'while' ( (lv_condition_1_0= ruleExpression ) ) ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            {
+            otherlv_0=(Token)match(input,178,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getWhileDoStatementAccess().getWhileKeyword_0());
+              		
+            }
+            // InternalFormalML.g:22746:3: ( (lv_condition_1_0= ruleExpression ) )
+            // InternalFormalML.g:22747:4: (lv_condition_1_0= ruleExpression )
+            {
+            // InternalFormalML.g:22747:4: (lv_condition_1_0= ruleExpression )
+            // InternalFormalML.g:22748:5: lv_condition_1_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getWhileDoStatementAccess().getConditionExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_61);
+            lv_condition_1_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getWhileDoStatementRule());
+              					}
+              					set(
+              						current,
+              						"condition",
+              						lv_condition_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:22765:3: ( (lv_bodyBlock_2_0= ruleBlockStatement ) )
+            // InternalFormalML.g:22766:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:22766:4: (lv_bodyBlock_2_0= ruleBlockStatement )
+            // InternalFormalML.g:22767:5: lv_bodyBlock_2_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getWhileDoStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_bodyBlock_2_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getWhileDoStatementRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleWhileDoStatement"
+
+
+    // $ANTLR start "entryRuleDoWhileStatement"
+    // InternalFormalML.g:22788:1: entryRuleDoWhileStatement returns [EObject current=null] : iv_ruleDoWhileStatement= ruleDoWhileStatement EOF ;
+    public final EObject entryRuleDoWhileStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDoWhileStatement = null;
+
+
+        try {
+            // InternalFormalML.g:22788:57: (iv_ruleDoWhileStatement= ruleDoWhileStatement EOF )
+            // InternalFormalML.g:22789:2: iv_ruleDoWhileStatement= ruleDoWhileStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDoWhileStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDoWhileStatement=ruleDoWhileStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDoWhileStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDoWhileStatement"
+
+
+    // $ANTLR start "ruleDoWhileStatement"
+    // InternalFormalML.g:22795:1: ruleDoWhileStatement returns [EObject current=null] : (otherlv_0= 'do' ( (lv_bodyBlock_1_0= ruleBlockStatement ) ) otherlv_2= 'while' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ) ;
+    public final EObject ruleDoWhileStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_bodyBlock_1_0 = null;
+
+        EObject lv_condition_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:22801:2: ( (otherlv_0= 'do' ( (lv_bodyBlock_1_0= ruleBlockStatement ) ) otherlv_2= 'while' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ) )
+            // InternalFormalML.g:22802:2: (otherlv_0= 'do' ( (lv_bodyBlock_1_0= ruleBlockStatement ) ) otherlv_2= 'while' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' )
+            {
+            // InternalFormalML.g:22802:2: (otherlv_0= 'do' ( (lv_bodyBlock_1_0= ruleBlockStatement ) ) otherlv_2= 'while' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' )
+            // InternalFormalML.g:22803:3: otherlv_0= 'do' ( (lv_bodyBlock_1_0= ruleBlockStatement ) ) otherlv_2= 'while' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';'
+            {
+            otherlv_0=(Token)match(input,179,FollowSets000.FOLLOW_61); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getDoWhileStatementAccess().getDoKeyword_0());
+              		
+            }
+            // InternalFormalML.g:22807:3: ( (lv_bodyBlock_1_0= ruleBlockStatement ) )
+            // InternalFormalML.g:22808:4: (lv_bodyBlock_1_0= ruleBlockStatement )
+            {
+            // InternalFormalML.g:22808:4: (lv_bodyBlock_1_0= ruleBlockStatement )
+            // InternalFormalML.g:22809:5: lv_bodyBlock_1_0= ruleBlockStatement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getDoWhileStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_213);
+            lv_bodyBlock_1_0=ruleBlockStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getDoWhileStatementRule());
+              					}
+              					set(
+              						current,
+              						"bodyBlock",
+              						lv_bodyBlock_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,178,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getDoWhileStatementAccess().getWhileKeyword_2());
+              		
+            }
+            // InternalFormalML.g:22830:3: ( (lv_condition_3_0= ruleExpression ) )
+            // InternalFormalML.g:22831:4: (lv_condition_3_0= ruleExpression )
+            {
+            // InternalFormalML.g:22831:4: (lv_condition_3_0= ruleExpression )
+            // InternalFormalML.g:22832:5: lv_condition_3_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_14);
+            lv_condition_3_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getDoWhileStatementRule());
+              					}
+              					set(
+              						current,
+              						"condition",
+              						lv_condition_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getDoWhileStatementAccess().getSemicolonKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDoWhileStatement"
+
+
+    // $ANTLR start "entryRuleForStatement"
+    // InternalFormalML.g:22857:1: entryRuleForStatement returns [EObject current=null] : iv_ruleForStatement= ruleForStatement EOF ;
+    public final EObject entryRuleForStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleForStatement = null;
+
+
+        try {
+            // InternalFormalML.g:22857:53: (iv_ruleForStatement= ruleForStatement EOF )
+            // InternalFormalML.g:22858:2: iv_ruleForStatement= ruleForStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getForStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleForStatement=ruleForStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleForStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleForStatement"
+
+
+    // $ANTLR start "ruleForStatement"
+    // InternalFormalML.g:22864:1: ruleForStatement returns [EObject current=null] : ( (otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) ) ) | (otherlv_7= 'for' otherlv_8= '(' ( (lv_init_9_0= ruleForAssignmentExpression ) )? otherlv_10= ';' ( (lv_condition_11_0= ruleExpression ) ) otherlv_12= ';' ( (lv_iterate_13_0= ruleForAssignmentExpression ) )? otherlv_14= ')' ( (lv_bodyBlock_15_0= ruleBlockStatement ) ) ) ) ;
+    public final EObject ruleForStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_12=null;
+        Token otherlv_14=null;
+        EObject lv_init_1_0 = null;
+
+        EObject lv_condition_3_0 = null;
+
+        EObject lv_iterate_5_0 = null;
+
+        EObject lv_bodyBlock_6_0 = null;
+
+        EObject lv_init_9_0 = null;
+
+        EObject lv_condition_11_0 = null;
+
+        EObject lv_iterate_13_0 = null;
+
+        EObject lv_bodyBlock_15_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:22870:2: ( ( (otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) ) ) | (otherlv_7= 'for' otherlv_8= '(' ( (lv_init_9_0= ruleForAssignmentExpression ) )? otherlv_10= ';' ( (lv_condition_11_0= ruleExpression ) ) otherlv_12= ';' ( (lv_iterate_13_0= ruleForAssignmentExpression ) )? otherlv_14= ')' ( (lv_bodyBlock_15_0= ruleBlockStatement ) ) ) ) )
+            // InternalFormalML.g:22871:2: ( (otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) ) ) | (otherlv_7= 'for' otherlv_8= '(' ( (lv_init_9_0= ruleForAssignmentExpression ) )? otherlv_10= ';' ( (lv_condition_11_0= ruleExpression ) ) otherlv_12= ';' ( (lv_iterate_13_0= ruleForAssignmentExpression ) )? otherlv_14= ')' ( (lv_bodyBlock_15_0= ruleBlockStatement ) ) ) )
+            {
+            // InternalFormalML.g:22871:2: ( (otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) ) ) | (otherlv_7= 'for' otherlv_8= '(' ( (lv_init_9_0= ruleForAssignmentExpression ) )? otherlv_10= ';' ( (lv_condition_11_0= ruleExpression ) ) otherlv_12= ';' ( (lv_iterate_13_0= ruleForAssignmentExpression ) )? otherlv_14= ')' ( (lv_bodyBlock_15_0= ruleBlockStatement ) ) ) )
+            int alt514=2;
+            int LA514_0 = input.LA(1);
+
+            if ( (LA514_0==180) ) {
+                int LA514_1 = input.LA(2);
+
+                if ( (synpred808_InternalFormalML()) ) {
+                    alt514=1;
+                }
+                else if ( (true) ) {
+                    alt514=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 514, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 514, 0, input);
+
+                throw nvae;
+            }
+            switch (alt514) {
+                case 1 :
+                    // InternalFormalML.g:22872:3: (otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) ) )
+                    {
+                    // InternalFormalML.g:22872:3: (otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) ) )
+                    // InternalFormalML.g:22873:4: otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) )
+                    {
+                    otherlv_0=(Token)match(input,180,FollowSets000.FOLLOW_214); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getForStatementAccess().getForKeyword_0_0());
+                      			
+                    }
+                    // InternalFormalML.g:22877:4: ( (lv_init_1_0= ruleForAssignmentExpression ) )?
+                    int alt510=2;
+                    int LA510_0 = input.LA(1);
+
+                    if ( (LA510_0==RULE_XLIA_ID||LA510_0==56||(LA510_0>=216 && LA510_0<=217)||(LA510_0>=231 && LA510_0<=239)) ) {
+                        alt510=1;
+                    }
+                    switch (alt510) {
+                        case 1 :
+                            // InternalFormalML.g:22878:5: (lv_init_1_0= ruleForAssignmentExpression )
+                            {
+                            // InternalFormalML.g:22878:5: (lv_init_1_0= ruleForAssignmentExpression )
+                            // InternalFormalML.g:22879:6: lv_init_1_0= ruleForAssignmentExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_0_1_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_14);
+                            lv_init_1_0=ruleForAssignmentExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getForStatementRule());
+                              						}
+                              						set(
+                              							current,
+                              							"init",
+                              							lv_init_1_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_2=(Token)match(input,25,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getForStatementAccess().getSemicolonKeyword_0_2());
+                      			
+                    }
+                    // InternalFormalML.g:22900:4: ( (lv_condition_3_0= ruleExpression ) )
+                    // InternalFormalML.g:22901:5: (lv_condition_3_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:22901:5: (lv_condition_3_0= ruleExpression )
+                    // InternalFormalML.g:22902:6: lv_condition_3_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_0_3_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_condition_3_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"condition",
+                      							lv_condition_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,25,FollowSets000.FOLLOW_215); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getForStatementAccess().getSemicolonKeyword_0_4());
+                      			
+                    }
+                    // InternalFormalML.g:22923:4: ( (lv_iterate_5_0= ruleForAssignmentExpression ) )?
+                    int alt511=2;
+                    int LA511_0 = input.LA(1);
+
+                    if ( (LA511_0==RULE_XLIA_ID||LA511_0==56||(LA511_0>=216 && LA511_0<=217)||(LA511_0>=231 && LA511_0<=239)) ) {
+                        alt511=1;
+                    }
+                    switch (alt511) {
+                        case 1 :
+                            // InternalFormalML.g:22924:5: (lv_iterate_5_0= ruleForAssignmentExpression )
+                            {
+                            // InternalFormalML.g:22924:5: (lv_iterate_5_0= ruleForAssignmentExpression )
+                            // InternalFormalML.g:22925:6: lv_iterate_5_0= ruleForAssignmentExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_0_5_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_61);
+                            lv_iterate_5_0=ruleForAssignmentExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getForStatementRule());
+                              						}
+                              						set(
+                              							current,
+                              							"iterate",
+                              							lv_iterate_5_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:22942:4: ( (lv_bodyBlock_6_0= ruleBlockStatement ) )
+                    // InternalFormalML.g:22943:5: (lv_bodyBlock_6_0= ruleBlockStatement )
+                    {
+                    // InternalFormalML.g:22943:5: (lv_bodyBlock_6_0= ruleBlockStatement )
+                    // InternalFormalML.g:22944:6: lv_bodyBlock_6_0= ruleBlockStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_6_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_bodyBlock_6_0=ruleBlockStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"bodyBlock",
+                      							lv_bodyBlock_6_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:22963:3: (otherlv_7= 'for' otherlv_8= '(' ( (lv_init_9_0= ruleForAssignmentExpression ) )? otherlv_10= ';' ( (lv_condition_11_0= ruleExpression ) ) otherlv_12= ';' ( (lv_iterate_13_0= ruleForAssignmentExpression ) )? otherlv_14= ')' ( (lv_bodyBlock_15_0= ruleBlockStatement ) ) )
+                    {
+                    // InternalFormalML.g:22963:3: (otherlv_7= 'for' otherlv_8= '(' ( (lv_init_9_0= ruleForAssignmentExpression ) )? otherlv_10= ';' ( (lv_condition_11_0= ruleExpression ) ) otherlv_12= ';' ( (lv_iterate_13_0= ruleForAssignmentExpression ) )? otherlv_14= ')' ( (lv_bodyBlock_15_0= ruleBlockStatement ) ) )
+                    // InternalFormalML.g:22964:4: otherlv_7= 'for' otherlv_8= '(' ( (lv_init_9_0= ruleForAssignmentExpression ) )? otherlv_10= ';' ( (lv_condition_11_0= ruleExpression ) ) otherlv_12= ';' ( (lv_iterate_13_0= ruleForAssignmentExpression ) )? otherlv_14= ')' ( (lv_bodyBlock_15_0= ruleBlockStatement ) )
+                    {
+                    otherlv_7=(Token)match(input,180,FollowSets000.FOLLOW_216); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getForStatementAccess().getForKeyword_1_0());
+                      			
+                    }
+                    otherlv_8=(Token)match(input,56,FollowSets000.FOLLOW_214); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getForStatementAccess().getLeftParenthesisKeyword_1_1());
+                      			
+                    }
+                    // InternalFormalML.g:22972:4: ( (lv_init_9_0= ruleForAssignmentExpression ) )?
+                    int alt512=2;
+                    int LA512_0 = input.LA(1);
+
+                    if ( (LA512_0==RULE_XLIA_ID||LA512_0==56||(LA512_0>=216 && LA512_0<=217)||(LA512_0>=231 && LA512_0<=239)) ) {
+                        alt512=1;
+                    }
+                    switch (alt512) {
+                        case 1 :
+                            // InternalFormalML.g:22973:5: (lv_init_9_0= ruleForAssignmentExpression )
+                            {
+                            // InternalFormalML.g:22973:5: (lv_init_9_0= ruleForAssignmentExpression )
+                            // InternalFormalML.g:22974:6: lv_init_9_0= ruleForAssignmentExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_1_2_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_14);
+                            lv_init_9_0=ruleForAssignmentExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getForStatementRule());
+                              						}
+                              						set(
+                              							current,
+                              							"init",
+                              							lv_init_9_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_10=(Token)match(input,25,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getForStatementAccess().getSemicolonKeyword_1_3());
+                      			
+                    }
+                    // InternalFormalML.g:22995:4: ( (lv_condition_11_0= ruleExpression ) )
+                    // InternalFormalML.g:22996:5: (lv_condition_11_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:22996:5: (lv_condition_11_0= ruleExpression )
+                    // InternalFormalML.g:22997:6: lv_condition_11_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_1_4_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_condition_11_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"condition",
+                      							lv_condition_11_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_12=(Token)match(input,25,FollowSets000.FOLLOW_217); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_12, grammarAccess.getForStatementAccess().getSemicolonKeyword_1_5());
+                      			
+                    }
+                    // InternalFormalML.g:23018:4: ( (lv_iterate_13_0= ruleForAssignmentExpression ) )?
+                    int alt513=2;
+                    int LA513_0 = input.LA(1);
+
+                    if ( (LA513_0==RULE_XLIA_ID||LA513_0==56||(LA513_0>=216 && LA513_0<=217)||(LA513_0>=231 && LA513_0<=239)) ) {
+                        alt513=1;
+                    }
+                    switch (alt513) {
+                        case 1 :
+                            // InternalFormalML.g:23019:5: (lv_iterate_13_0= ruleForAssignmentExpression )
+                            {
+                            // InternalFormalML.g:23019:5: (lv_iterate_13_0= ruleForAssignmentExpression )
+                            // InternalFormalML.g:23020:6: lv_iterate_13_0= ruleForAssignmentExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_1_6_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_99);
+                            lv_iterate_13_0=ruleForAssignmentExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getForStatementRule());
+                              						}
+                              						set(
+                              							current,
+                              							"iterate",
+                              							lv_iterate_13_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_14=(Token)match(input,57,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_14, grammarAccess.getForStatementAccess().getRightParenthesisKeyword_1_7());
+                      			
+                    }
+                    // InternalFormalML.g:23041:4: ( (lv_bodyBlock_15_0= ruleBlockStatement ) )
+                    // InternalFormalML.g:23042:5: (lv_bodyBlock_15_0= ruleBlockStatement )
+                    {
+                    // InternalFormalML.g:23042:5: (lv_bodyBlock_15_0= ruleBlockStatement )
+                    // InternalFormalML.g:23043:6: lv_bodyBlock_15_0= ruleBlockStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_8_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_bodyBlock_15_0=ruleBlockStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"bodyBlock",
+                      							lv_bodyBlock_15_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleForStatement"
+
+
+    // $ANTLR start "entryRuleForAssignmentExpression"
+    // InternalFormalML.g:23065:1: entryRuleForAssignmentExpression returns [EObject current=null] : iv_ruleForAssignmentExpression= ruleForAssignmentExpression EOF ;
+    public final EObject entryRuleForAssignmentExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleForAssignmentExpression = null;
+
+
+        try {
+            // InternalFormalML.g:23065:64: (iv_ruleForAssignmentExpression= ruleForAssignmentExpression EOF )
+            // InternalFormalML.g:23066:2: iv_ruleForAssignmentExpression= ruleForAssignmentExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getForAssignmentExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleForAssignmentExpression=ruleForAssignmentExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleForAssignmentExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleForAssignmentExpression"
+
+
+    // $ANTLR start "ruleForAssignmentExpression"
+    // InternalFormalML.g:23072:1: ruleForAssignmentExpression returns [EObject current=null] : (this_AssignmentExpression_0= ruleAssignmentExpression | this_IncrementOrDecrementPrefixExpression_1= ruleIncrementOrDecrementPrefixExpression | this_IncrementOrDecrementPostfixExpression_2= ruleIncrementOrDecrementPostfixExpression ) ;
+    public final EObject ruleForAssignmentExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_AssignmentExpression_0 = null;
+
+        EObject this_IncrementOrDecrementPrefixExpression_1 = null;
+
+        EObject this_IncrementOrDecrementPostfixExpression_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:23078:2: ( (this_AssignmentExpression_0= ruleAssignmentExpression | this_IncrementOrDecrementPrefixExpression_1= ruleIncrementOrDecrementPrefixExpression | this_IncrementOrDecrementPostfixExpression_2= ruleIncrementOrDecrementPostfixExpression ) )
+            // InternalFormalML.g:23079:2: (this_AssignmentExpression_0= ruleAssignmentExpression | this_IncrementOrDecrementPrefixExpression_1= ruleIncrementOrDecrementPrefixExpression | this_IncrementOrDecrementPostfixExpression_2= ruleIncrementOrDecrementPostfixExpression )
+            {
+            // InternalFormalML.g:23079:2: (this_AssignmentExpression_0= ruleAssignmentExpression | this_IncrementOrDecrementPrefixExpression_1= ruleIncrementOrDecrementPrefixExpression | this_IncrementOrDecrementPostfixExpression_2= ruleIncrementOrDecrementPostfixExpression )
+            int alt515=3;
+            alt515 = dfa515.predict(input);
+            switch (alt515) {
+                case 1 :
+                    // InternalFormalML.g:23080:3: this_AssignmentExpression_0= ruleAssignmentExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getForAssignmentExpressionAccess().getAssignmentExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_AssignmentExpression_0=ruleAssignmentExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_AssignmentExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:23092:3: this_IncrementOrDecrementPrefixExpression_1= ruleIncrementOrDecrementPrefixExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_IncrementOrDecrementPrefixExpression_1=ruleIncrementOrDecrementPrefixExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_IncrementOrDecrementPrefixExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:23104:3: this_IncrementOrDecrementPostfixExpression_2= ruleIncrementOrDecrementPostfixExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getForAssignmentExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_IncrementOrDecrementPostfixExpression_2=ruleIncrementOrDecrementPostfixExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_IncrementOrDecrementPostfixExpression_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleForAssignmentExpression"
+
+
+    // $ANTLR start "entryRuleForEachStatement"
+    // InternalFormalML.g:23119:1: entryRuleForEachStatement returns [EObject current=null] : iv_ruleForEachStatement= ruleForEachStatement EOF ;
+    public final EObject entryRuleForEachStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleForEachStatement = null;
+
+
+        try {
+            // InternalFormalML.g:23119:57: (iv_ruleForEachStatement= ruleForEachStatement EOF )
+            // InternalFormalML.g:23120:2: iv_ruleForEachStatement= ruleForEachStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getForEachStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleForEachStatement=ruleForEachStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleForEachStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleForEachStatement"
+
+
+    // $ANTLR start "ruleForEachStatement"
+    // InternalFormalML.g:23126:1: ruleForEachStatement returns [EObject current=null] : ( (otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) ) | (otherlv_5= 'for' otherlv_6= '(' ( (lv_iterator_7_0= ruleLeftHandSideExpression ) ) otherlv_8= ':' ( (lv_enumeration_9_0= ruleExpression ) ) otherlv_10= ')' ( (lv_bodyBlock_11_0= ruleBlockStatement ) ) ) ) ;
+    public final EObject ruleForEachStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        EObject lv_iterator_1_0 = null;
+
+        EObject lv_enumeration_3_0 = null;
+
+        EObject lv_bodyBlock_4_0 = null;
+
+        EObject lv_iterator_7_0 = null;
+
+        EObject lv_enumeration_9_0 = null;
+
+        EObject lv_bodyBlock_11_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:23132:2: ( ( (otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) ) | (otherlv_5= 'for' otherlv_6= '(' ( (lv_iterator_7_0= ruleLeftHandSideExpression ) ) otherlv_8= ':' ( (lv_enumeration_9_0= ruleExpression ) ) otherlv_10= ')' ( (lv_bodyBlock_11_0= ruleBlockStatement ) ) ) ) )
+            // InternalFormalML.g:23133:2: ( (otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) ) | (otherlv_5= 'for' otherlv_6= '(' ( (lv_iterator_7_0= ruleLeftHandSideExpression ) ) otherlv_8= ':' ( (lv_enumeration_9_0= ruleExpression ) ) otherlv_10= ')' ( (lv_bodyBlock_11_0= ruleBlockStatement ) ) ) )
+            {
+            // InternalFormalML.g:23133:2: ( (otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) ) | (otherlv_5= 'for' otherlv_6= '(' ( (lv_iterator_7_0= ruleLeftHandSideExpression ) ) otherlv_8= ':' ( (lv_enumeration_9_0= ruleExpression ) ) otherlv_10= ')' ( (lv_bodyBlock_11_0= ruleBlockStatement ) ) ) )
+            int alt516=2;
+            int LA516_0 = input.LA(1);
+
+            if ( (LA516_0==180) ) {
+                int LA516_1 = input.LA(2);
+
+                if ( (synpred813_InternalFormalML()) ) {
+                    alt516=1;
+                }
+                else if ( (true) ) {
+                    alt516=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 516, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 516, 0, input);
+
+                throw nvae;
+            }
+            switch (alt516) {
+                case 1 :
+                    // InternalFormalML.g:23134:3: (otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) )
+                    {
+                    // InternalFormalML.g:23134:3: (otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) )
+                    // InternalFormalML.g:23135:4: otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) )
+                    {
+                    otherlv_0=(Token)match(input,180,FollowSets000.FOLLOW_218); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getForEachStatementAccess().getForKeyword_0_0());
+                      			
+                    }
+                    // InternalFormalML.g:23139:4: ( (lv_iterator_1_0= ruleLeftHandSideExpression ) )
+                    // InternalFormalML.g:23140:5: (lv_iterator_1_0= ruleLeftHandSideExpression )
+                    {
+                    // InternalFormalML.g:23140:5: (lv_iterator_1_0= ruleLeftHandSideExpression )
+                    // InternalFormalML.g:23141:6: lv_iterator_1_0= ruleLeftHandSideExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_0_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_40);
+                    lv_iterator_1_0=ruleLeftHandSideExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"iterator",
+                      							lv_iterator_1_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_2=(Token)match(input,30,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getForEachStatementAccess().getColonKeyword_0_2());
+                      			
+                    }
+                    // InternalFormalML.g:23162:4: ( (lv_enumeration_3_0= ruleExpression ) )
+                    // InternalFormalML.g:23163:5: (lv_enumeration_3_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:23163:5: (lv_enumeration_3_0= ruleExpression )
+                    // InternalFormalML.g:23164:6: lv_enumeration_3_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_0_3_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_61);
+                    lv_enumeration_3_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"enumeration",
+                      							lv_enumeration_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:23181:4: ( (lv_bodyBlock_4_0= ruleBlockStatement ) )
+                    // InternalFormalML.g:23182:5: (lv_bodyBlock_4_0= ruleBlockStatement )
+                    {
+                    // InternalFormalML.g:23182:5: (lv_bodyBlock_4_0= ruleBlockStatement )
+                    // InternalFormalML.g:23183:6: lv_bodyBlock_4_0= ruleBlockStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_4_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_bodyBlock_4_0=ruleBlockStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"bodyBlock",
+                      							lv_bodyBlock_4_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:23202:3: (otherlv_5= 'for' otherlv_6= '(' ( (lv_iterator_7_0= ruleLeftHandSideExpression ) ) otherlv_8= ':' ( (lv_enumeration_9_0= ruleExpression ) ) otherlv_10= ')' ( (lv_bodyBlock_11_0= ruleBlockStatement ) ) )
+                    {
+                    // InternalFormalML.g:23202:3: (otherlv_5= 'for' otherlv_6= '(' ( (lv_iterator_7_0= ruleLeftHandSideExpression ) ) otherlv_8= ':' ( (lv_enumeration_9_0= ruleExpression ) ) otherlv_10= ')' ( (lv_bodyBlock_11_0= ruleBlockStatement ) ) )
+                    // InternalFormalML.g:23203:4: otherlv_5= 'for' otherlv_6= '(' ( (lv_iterator_7_0= ruleLeftHandSideExpression ) ) otherlv_8= ':' ( (lv_enumeration_9_0= ruleExpression ) ) otherlv_10= ')' ( (lv_bodyBlock_11_0= ruleBlockStatement ) )
+                    {
+                    otherlv_5=(Token)match(input,180,FollowSets000.FOLLOW_216); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getForEachStatementAccess().getForKeyword_1_0());
+                      			
+                    }
+                    otherlv_6=(Token)match(input,56,FollowSets000.FOLLOW_218); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_6, grammarAccess.getForEachStatementAccess().getLeftParenthesisKeyword_1_1());
+                      			
+                    }
+                    // InternalFormalML.g:23211:4: ( (lv_iterator_7_0= ruleLeftHandSideExpression ) )
+                    // InternalFormalML.g:23212:5: (lv_iterator_7_0= ruleLeftHandSideExpression )
+                    {
+                    // InternalFormalML.g:23212:5: (lv_iterator_7_0= ruleLeftHandSideExpression )
+                    // InternalFormalML.g:23213:6: lv_iterator_7_0= ruleLeftHandSideExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_40);
+                    lv_iterator_7_0=ruleLeftHandSideExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"iterator",
+                      							lv_iterator_7_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_8=(Token)match(input,30,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getForEachStatementAccess().getColonKeyword_1_3());
+                      			
+                    }
+                    // InternalFormalML.g:23234:4: ( (lv_enumeration_9_0= ruleExpression ) )
+                    // InternalFormalML.g:23235:5: (lv_enumeration_9_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:23235:5: (lv_enumeration_9_0= ruleExpression )
+                    // InternalFormalML.g:23236:6: lv_enumeration_9_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_1_4_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_99);
+                    lv_enumeration_9_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"enumeration",
+                      							lv_enumeration_9_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_10=(Token)match(input,57,FollowSets000.FOLLOW_61); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_10, grammarAccess.getForEachStatementAccess().getRightParenthesisKeyword_1_5());
+                      			
+                    }
+                    // InternalFormalML.g:23257:4: ( (lv_bodyBlock_11_0= ruleBlockStatement ) )
+                    // InternalFormalML.g:23258:5: (lv_bodyBlock_11_0= ruleBlockStatement )
+                    {
+                    // InternalFormalML.g:23258:5: (lv_bodyBlock_11_0= ruleBlockStatement )
+                    // InternalFormalML.g:23259:6: lv_bodyBlock_11_0= ruleBlockStatement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_6_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_bodyBlock_11_0=ruleBlockStatement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getForEachStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"bodyBlock",
+                      							lv_bodyBlock_11_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleForEachStatement"
+
+
+    // $ANTLR start "entryRuleInterruptStatement"
+    // InternalFormalML.g:23281:1: entryRuleInterruptStatement returns [EObject current=null] : iv_ruleInterruptStatement= ruleInterruptStatement EOF ;
+    public final EObject entryRuleInterruptStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleInterruptStatement = null;
+
+
+        try {
+            // InternalFormalML.g:23281:59: (iv_ruleInterruptStatement= ruleInterruptStatement EOF )
+            // InternalFormalML.g:23282:2: iv_ruleInterruptStatement= ruleInterruptStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getInterruptStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleInterruptStatement=ruleInterruptStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleInterruptStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleInterruptStatement"
+
+
+    // $ANTLR start "ruleInterruptStatement"
+    // InternalFormalML.g:23288:1: ruleInterruptStatement returns [EObject current=null] : ( ( (lv_kind_0_0= ruleInterruptStatementKind ) ) ( ( (lv_expr_1_0= ruleExpression ) ) | (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' ) )? otherlv_7= ';' ) ;
+    public final EObject ruleInterruptStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Enumerator lv_kind_0_0 = null;
+
+        EObject lv_expr_1_0 = null;
+
+        EObject lv_expr_3_0 = null;
+
+        EObject lv_expr_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:23294:2: ( ( ( (lv_kind_0_0= ruleInterruptStatementKind ) ) ( ( (lv_expr_1_0= ruleExpression ) ) | (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' ) )? otherlv_7= ';' ) )
+            // InternalFormalML.g:23295:2: ( ( (lv_kind_0_0= ruleInterruptStatementKind ) ) ( ( (lv_expr_1_0= ruleExpression ) ) | (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' ) )? otherlv_7= ';' )
+            {
+            // InternalFormalML.g:23295:2: ( ( (lv_kind_0_0= ruleInterruptStatementKind ) ) ( ( (lv_expr_1_0= ruleExpression ) ) | (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' ) )? otherlv_7= ';' )
+            // InternalFormalML.g:23296:3: ( (lv_kind_0_0= ruleInterruptStatementKind ) ) ( ( (lv_expr_1_0= ruleExpression ) ) | (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' ) )? otherlv_7= ';'
+            {
+            // InternalFormalML.g:23296:3: ( (lv_kind_0_0= ruleInterruptStatementKind ) )
+            // InternalFormalML.g:23297:4: (lv_kind_0_0= ruleInterruptStatementKind )
+            {
+            // InternalFormalML.g:23297:4: (lv_kind_0_0= ruleInterruptStatementKind )
+            // InternalFormalML.g:23298:5: lv_kind_0_0= ruleInterruptStatementKind
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getInterruptStatementAccess().getKindInterruptStatementKindEnumRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_219);
+            lv_kind_0_0=ruleInterruptStatementKind();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
+              					}
+              					set(
+              						current,
+              						"kind",
+              						lv_kind_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.InterruptStatementKind");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:23315:3: ( ( (lv_expr_1_0= ruleExpression ) ) | (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' ) )?
+            int alt518=3;
+            alt518 = dfa518.predict(input);
+            switch (alt518) {
+                case 1 :
+                    // InternalFormalML.g:23316:4: ( (lv_expr_1_0= ruleExpression ) )
+                    {
+                    // InternalFormalML.g:23316:4: ( (lv_expr_1_0= ruleExpression ) )
+                    // InternalFormalML.g:23317:5: (lv_expr_1_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:23317:5: (lv_expr_1_0= ruleExpression )
+                    // InternalFormalML.g:23318:6: lv_expr_1_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_expr_1_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
+                      						}
+                      						add(
+                      							current,
+                      							"expr",
+                      							lv_expr_1_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:23336:4: (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' )
+                    {
+                    // InternalFormalML.g:23336:4: (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' )
+                    // InternalFormalML.g:23337:5: otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')'
+                    {
+                    otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_2, grammarAccess.getInterruptStatementAccess().getLeftParenthesisKeyword_1_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:23341:5: ( (lv_expr_3_0= ruleExpression ) )
+                    // InternalFormalML.g:23342:6: (lv_expr_3_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:23342:6: (lv_expr_3_0= ruleExpression )
+                    // InternalFormalML.g:23343:7: lv_expr_3_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_39);
+                    lv_expr_3_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
+                      							}
+                      							add(
+                      								current,
+                      								"expr",
+                      								lv_expr_3_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:23360:5: (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )*
+                    loop517:
+                    do {
+                        int alt517=2;
+                        int LA517_0 = input.LA(1);
+
+                        if ( (LA517_0==20) ) {
+                            alt517=1;
+                        }
+
+
+                        switch (alt517) {
+                    	case 1 :
+                    	    // InternalFormalML.g:23361:6: otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_4, grammarAccess.getInterruptStatementAccess().getCommaKeyword_1_1_2_0());
+                    	      					
+                    	    }
+                    	    // InternalFormalML.g:23365:6: ( (lv_expr_5_0= ruleExpression ) )
+                    	    // InternalFormalML.g:23366:7: (lv_expr_5_0= ruleExpression )
+                    	    {
+                    	    // InternalFormalML.g:23366:7: (lv_expr_5_0= ruleExpression )
+                    	    // InternalFormalML.g:23367:8: lv_expr_5_0= ruleExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_2_1_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_39);
+                    	    lv_expr_5_0=ruleExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getInterruptStatementRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"expr",
+                    	      									lv_expr_5_0,
+                    	      									"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop517;
+                        }
+                    } while (true);
+
+                    otherlv_6=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_6, grammarAccess.getInterruptStatementAccess().getRightParenthesisKeyword_1_1_3());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_7=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_7, grammarAccess.getInterruptStatementAccess().getSemicolonKeyword_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleInterruptStatement"
+
+
+    // $ANTLR start "entryRuleActivityStatement"
+    // InternalFormalML.g:23399:1: entryRuleActivityStatement returns [EObject current=null] : iv_ruleActivityStatement= ruleActivityStatement EOF ;
+    public final EObject entryRuleActivityStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleActivityStatement = null;
+
+
+        try {
+            // InternalFormalML.g:23399:58: (iv_ruleActivityStatement= ruleActivityStatement EOF )
+            // InternalFormalML.g:23400:2: iv_ruleActivityStatement= ruleActivityStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getActivityStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleActivityStatement=ruleActivityStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleActivityStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleActivityStatement"
+
+
+    // $ANTLR start "ruleActivityStatement"
+    // InternalFormalML.g:23406:1: ruleActivityStatement returns [EObject current=null] : ( () ( (lv_op_1_0= ruleOPERATOR_ACTIVITY ) ) ( (lv_machine_2_0= ruleValuePureNamedMachineExpression ) ) ( (lv_tuple_3_0= ruleTupleParameterExpression ) )? otherlv_4= ';' ) ;
+    public final EObject ruleActivityStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Enumerator lv_op_1_0 = null;
+
+        EObject lv_machine_2_0 = null;
+
+        EObject lv_tuple_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:23412:2: ( ( () ( (lv_op_1_0= ruleOPERATOR_ACTIVITY ) ) ( (lv_machine_2_0= ruleValuePureNamedMachineExpression ) ) ( (lv_tuple_3_0= ruleTupleParameterExpression ) )? otherlv_4= ';' ) )
+            // InternalFormalML.g:23413:2: ( () ( (lv_op_1_0= ruleOPERATOR_ACTIVITY ) ) ( (lv_machine_2_0= ruleValuePureNamedMachineExpression ) ) ( (lv_tuple_3_0= ruleTupleParameterExpression ) )? otherlv_4= ';' )
+            {
+            // InternalFormalML.g:23413:2: ( () ( (lv_op_1_0= ruleOPERATOR_ACTIVITY ) ) ( (lv_machine_2_0= ruleValuePureNamedMachineExpression ) ) ( (lv_tuple_3_0= ruleTupleParameterExpression ) )? otherlv_4= ';' )
+            // InternalFormalML.g:23414:3: () ( (lv_op_1_0= ruleOPERATOR_ACTIVITY ) ) ( (lv_machine_2_0= ruleValuePureNamedMachineExpression ) ) ( (lv_tuple_3_0= ruleTupleParameterExpression ) )? otherlv_4= ';'
+            {
+            // InternalFormalML.g:23414:3: ()
+            // InternalFormalML.g:23415:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getActivityStatementAccess().getActivityStatementAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:23424:3: ( (lv_op_1_0= ruleOPERATOR_ACTIVITY ) )
+            // InternalFormalML.g:23425:4: (lv_op_1_0= ruleOPERATOR_ACTIVITY )
+            {
+            // InternalFormalML.g:23425:4: (lv_op_1_0= ruleOPERATOR_ACTIVITY )
+            // InternalFormalML.g:23426:5: lv_op_1_0= ruleOPERATOR_ACTIVITY
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getActivityStatementAccess().getOpOPERATOR_ACTIVITYEnumRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_122);
+            lv_op_1_0=ruleOPERATOR_ACTIVITY();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getActivityStatementRule());
+              					}
+              					set(
+              						current,
+              						"op",
+              						lv_op_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.OPERATOR_ACTIVITY");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:23443:3: ( (lv_machine_2_0= ruleValuePureNamedMachineExpression ) )
+            // InternalFormalML.g:23444:4: (lv_machine_2_0= ruleValuePureNamedMachineExpression )
+            {
+            // InternalFormalML.g:23444:4: (lv_machine_2_0= ruleValuePureNamedMachineExpression )
+            // InternalFormalML.g:23445:5: lv_machine_2_0= ruleValuePureNamedMachineExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getActivityStatementAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_182);
+            lv_machine_2_0=ruleValuePureNamedMachineExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getActivityStatementRule());
+              					}
+              					set(
+              						current,
+              						"machine",
+              						lv_machine_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:23462:3: ( (lv_tuple_3_0= ruleTupleParameterExpression ) )?
+            int alt519=2;
+            int LA519_0 = input.LA(1);
+
+            if ( (LA519_0==56) ) {
+                alt519=1;
+            }
+            switch (alt519) {
+                case 1 :
+                    // InternalFormalML.g:23463:4: (lv_tuple_3_0= ruleTupleParameterExpression )
+                    {
+                    // InternalFormalML.g:23463:4: (lv_tuple_3_0= ruleTupleParameterExpression )
+                    // InternalFormalML.g:23464:5: lv_tuple_3_0= ruleTupleParameterExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getActivityStatementAccess().getTupleTupleParameterExpressionParserRuleCall_3_0());
+                      				
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_tuple_3_0=ruleTupleParameterExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getActivityStatementRule());
+                      					}
+                      					set(
+                      						current,
+                      						"tuple",
+                      						lv_tuple_3_0,
+                      						"org.eclipse.efm.formalml.xtext.FormalML.TupleParameterExpression");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_4=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getActivityStatementAccess().getSemicolonKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleActivityStatement"
+
+
+    // $ANTLR start "entryRuleInvokeStatement"
+    // InternalFormalML.g:23489:1: entryRuleInvokeStatement returns [EObject current=null] : iv_ruleInvokeStatement= ruleInvokeStatement EOF ;
+    public final EObject entryRuleInvokeStatement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleInvokeStatement = null;
+
+
+        try {
+            // InternalFormalML.g:23489:56: (iv_ruleInvokeStatement= ruleInvokeStatement EOF )
+            // InternalFormalML.g:23490:2: iv_ruleInvokeStatement= ruleInvokeStatement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getInvokeStatementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleInvokeStatement=ruleInvokeStatement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleInvokeStatement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleInvokeStatement"
+
+
+    // $ANTLR start "ruleInvokeStatement"
+    // InternalFormalML.g:23496:1: ruleInvokeStatement returns [EObject current=null] : ( ( ( (lv_expression_0_0= ruleInvokeExpressionDeprecated ) ) otherlv_1= ';' ) | ( ( ( ruleESUfid ) ) ( (lv_execRoutine_3_0= '(' ) ) ( (lv_args_4_0= ruleMixTupleExpressionList ) )? otherlv_5= ')' (otherlv_6= '-->' ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) ) )? otherlv_15= ';' ) | ( ( (lv_execRoutine_16_0= 'exec' ) ) ( ( ruleESUfid ) ) otherlv_18= '(' ( (lv_args_19_0= ruleMixTupleExpressionList ) )? otherlv_20= ')' (otherlv_21= '-->' ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) ) )? otherlv_30= ';' ) | ( ( (lv_callProcedure_31_0= 'call' ) ) ( ( ruleESUfid ) ) ( (lv_args_33_0= ruleMixTupleExpressionList ) )? (otherlv_34= '-->' ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) ) )? otherlv_43= ';' ) ) ;
+    public final EObject ruleInvokeStatement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_execRoutine_3_0=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        Token otherlv_12=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_15=null;
+        Token lv_execRoutine_16_0=null;
+        Token otherlv_18=null;
+        Token otherlv_20=null;
+        Token otherlv_21=null;
+        Token otherlv_22=null;
+        Token otherlv_23=null;
+        Token otherlv_24=null;
+        Token otherlv_25=null;
+        Token otherlv_26=null;
+        Token otherlv_27=null;
+        Token otherlv_28=null;
+        Token otherlv_29=null;
+        Token otherlv_30=null;
+        Token lv_callProcedure_31_0=null;
+        Token otherlv_34=null;
+        Token otherlv_35=null;
+        Token otherlv_36=null;
+        Token otherlv_37=null;
+        Token otherlv_38=null;
+        Token otherlv_39=null;
+        Token otherlv_40=null;
+        Token otherlv_41=null;
+        Token otherlv_42=null;
+        Token otherlv_43=null;
+        EObject lv_expression_0_0 = null;
+
+        EObject lv_args_4_0 = null;
+
+        EObject lv_args_19_0 = null;
+
+        EObject lv_args_33_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:23502:2: ( ( ( ( (lv_expression_0_0= ruleInvokeExpressionDeprecated ) ) otherlv_1= ';' ) | ( ( ( ruleESUfid ) ) ( (lv_execRoutine_3_0= '(' ) ) ( (lv_args_4_0= ruleMixTupleExpressionList ) )? otherlv_5= ')' (otherlv_6= '-->' ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) ) )? otherlv_15= ';' ) | ( ( (lv_execRoutine_16_0= 'exec' ) ) ( ( ruleESUfid ) ) otherlv_18= '(' ( (lv_args_19_0= ruleMixTupleExpressionList ) )? otherlv_20= ')' (otherlv_21= '-->' ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) ) )? otherlv_30= ';' ) | ( ( (lv_callProcedure_31_0= 'call' ) ) ( ( ruleESUfid ) ) ( (lv_args_33_0= ruleMixTupleExpressionList ) )? (otherlv_34= '-->' ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) ) )? otherlv_43= ';' ) ) )
+            // InternalFormalML.g:23503:2: ( ( ( (lv_expression_0_0= ruleInvokeExpressionDeprecated ) ) otherlv_1= ';' ) | ( ( ( ruleESUfid ) ) ( (lv_execRoutine_3_0= '(' ) ) ( (lv_args_4_0= ruleMixTupleExpressionList ) )? otherlv_5= ')' (otherlv_6= '-->' ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) ) )? otherlv_15= ';' ) | ( ( (lv_execRoutine_16_0= 'exec' ) ) ( ( ruleESUfid ) ) otherlv_18= '(' ( (lv_args_19_0= ruleMixTupleExpressionList ) )? otherlv_20= ')' (otherlv_21= '-->' ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) ) )? otherlv_30= ';' ) | ( ( (lv_callProcedure_31_0= 'call' ) ) ( ( ruleESUfid ) ) ( (lv_args_33_0= ruleMixTupleExpressionList ) )? (otherlv_34= '-->' ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) ) )? otherlv_43= ';' ) )
+            {
+            // InternalFormalML.g:23503:2: ( ( ( (lv_expression_0_0= ruleInvokeExpressionDeprecated ) ) otherlv_1= ';' ) | ( ( ( ruleESUfid ) ) ( (lv_execRoutine_3_0= '(' ) ) ( (lv_args_4_0= ruleMixTupleExpressionList ) )? otherlv_5= ')' (otherlv_6= '-->' ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) ) )? otherlv_15= ';' ) | ( ( (lv_execRoutine_16_0= 'exec' ) ) ( ( ruleESUfid ) ) otherlv_18= '(' ( (lv_args_19_0= ruleMixTupleExpressionList ) )? otherlv_20= ')' (otherlv_21= '-->' ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) ) )? otherlv_30= ';' ) | ( ( (lv_callProcedure_31_0= 'call' ) ) ( ( ruleESUfid ) ) ( (lv_args_33_0= ruleMixTupleExpressionList ) )? (otherlv_34= '-->' ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) ) )? otherlv_43= ';' ) )
+            int alt535=4;
+            switch ( input.LA(1) ) {
+            case 219:
+                {
+                alt535=1;
+                }
+                break;
+            case RULE_XLIA_ID:
+                {
+                alt535=2;
+                }
+                break;
+            case 181:
+                {
+                alt535=3;
+                }
+                break;
+            case 182:
+                {
+                alt535=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 535, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt535) {
+                case 1 :
+                    // InternalFormalML.g:23504:3: ( ( (lv_expression_0_0= ruleInvokeExpressionDeprecated ) ) otherlv_1= ';' )
+                    {
+                    // InternalFormalML.g:23504:3: ( ( (lv_expression_0_0= ruleInvokeExpressionDeprecated ) ) otherlv_1= ';' )
+                    // InternalFormalML.g:23505:4: ( (lv_expression_0_0= ruleInvokeExpressionDeprecated ) ) otherlv_1= ';'
+                    {
+                    // InternalFormalML.g:23505:4: ( (lv_expression_0_0= ruleInvokeExpressionDeprecated ) )
+                    // InternalFormalML.g:23506:5: (lv_expression_0_0= ruleInvokeExpressionDeprecated )
+                    {
+                    // InternalFormalML.g:23506:5: (lv_expression_0_0= ruleInvokeExpressionDeprecated )
+                    // InternalFormalML.g:23507:6: lv_expression_0_0= ruleInvokeExpressionDeprecated
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getInvokeStatementAccess().getExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_14);
+                    lv_expression_0_0=ruleInvokeExpressionDeprecated();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
+                      						}
+                      						set(
+                      							current,
+                      							"expression",
+                      							lv_expression_0_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.InvokeExpressionDeprecated");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_1=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_0_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:23530:3: ( ( ( ruleESUfid ) ) ( (lv_execRoutine_3_0= '(' ) ) ( (lv_args_4_0= ruleMixTupleExpressionList ) )? otherlv_5= ')' (otherlv_6= '-->' ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) ) )? otherlv_15= ';' )
+                    {
+                    // InternalFormalML.g:23530:3: ( ( ( ruleESUfid ) ) ( (lv_execRoutine_3_0= '(' ) ) ( (lv_args_4_0= ruleMixTupleExpressionList ) )? otherlv_5= ')' (otherlv_6= '-->' ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) ) )? otherlv_15= ';' )
+                    // InternalFormalML.g:23531:4: ( ( ruleESUfid ) ) ( (lv_execRoutine_3_0= '(' ) ) ( (lv_args_4_0= ruleMixTupleExpressionList ) )? otherlv_5= ')' (otherlv_6= '-->' ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) ) )? otherlv_15= ';'
+                    {
+                    // InternalFormalML.g:23531:4: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:23532:5: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:23532:5: ( ruleESUfid )
+                    // InternalFormalML.g:23533:6: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getInvokeStatementRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_1_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_216);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:23550:4: ( (lv_execRoutine_3_0= '(' ) )
+                    // InternalFormalML.g:23551:5: (lv_execRoutine_3_0= '(' )
+                    {
+                    // InternalFormalML.g:23551:5: (lv_execRoutine_3_0= '(' )
+                    // InternalFormalML.g:23552:6: lv_execRoutine_3_0= '('
+                    {
+                    lv_execRoutine_3_0=(Token)match(input,56,FollowSets000.FOLLOW_220); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_execRoutine_3_0, grammarAccess.getInvokeStatementAccess().getExecRoutineLeftParenthesisKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getInvokeStatementRule());
+                      						}
+                      						setWithLastConsumed(current, "execRoutine", true, "(");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:23564:4: ( (lv_args_4_0= ruleMixTupleExpressionList ) )?
+                    int alt520=2;
+                    int LA520_0 = input.LA(1);
+
+                    if ( ((LA520_0>=RULE_XLIA_ID && LA520_0<=RULE_STRING)||LA520_0==16||LA520_0==22||(LA520_0>=26 && LA520_0<=29)||LA520_0==56||LA520_0==212||(LA520_0>=216 && LA520_0<=224)||(LA520_0>=227 && LA520_0<=239)) ) {
+                        alt520=1;
+                    }
+                    switch (alt520) {
+                        case 1 :
+                            // InternalFormalML.g:23565:5: (lv_args_4_0= ruleMixTupleExpressionList )
+                            {
+                            // InternalFormalML.g:23565:5: (lv_args_4_0= ruleMixTupleExpressionList )
+                            // InternalFormalML.g:23566:6: lv_args_4_0= ruleMixTupleExpressionList
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_1_2_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_99);
+                            lv_args_4_0=ruleMixTupleExpressionList();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
+                              						}
+                              						set(
+                              							current,
+                              							"args",
+                              							lv_args_4_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_5=(Token)match(input,57,FollowSets000.FOLLOW_221); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_3());
+                      			
+                    }
+                    // InternalFormalML.g:23587:4: (otherlv_6= '-->' ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) ) )?
+                    int alt524=2;
+                    int LA524_0 = input.LA(1);
+
+                    if ( (LA524_0==59) ) {
+                        alt524=1;
+                    }
+                    switch (alt524) {
+                        case 1 :
+                            // InternalFormalML.g:23588:5: otherlv_6= '-->' ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) )
+                            {
+                            otherlv_6=(Token)match(input,59,FollowSets000.FOLLOW_222); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_6, grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0());
+                              				
+                            }
+                            // InternalFormalML.g:23592:5: ( ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* ) | (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' ) )
+                            int alt523=2;
+                            int LA523_0 = input.LA(1);
+
+                            if ( (LA523_0==RULE_ID) ) {
+                                alt523=1;
+                            }
+                            else if ( (LA523_0==56) ) {
+                                alt523=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 523, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt523) {
+                                case 1 :
+                                    // InternalFormalML.g:23593:6: ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* )
+                                    {
+                                    // InternalFormalML.g:23593:6: ( ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )* )
+                                    // InternalFormalML.g:23594:7: ( (otherlv_7= RULE_ID ) ) (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )*
+                                    {
+                                    // InternalFormalML.g:23594:7: ( (otherlv_7= RULE_ID ) )
+                                    // InternalFormalML.g:23595:8: (otherlv_7= RULE_ID )
+                                    {
+                                    // InternalFormalML.g:23595:8: (otherlv_7= RULE_ID )
+                                    // InternalFormalML.g:23596:9: otherlv_7= RULE_ID
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                      									}
+                                      								
+                                    }
+                                    otherlv_7=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_223); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									newLeafNode(otherlv_7, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_0_0());
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    // InternalFormalML.g:23610:7: (otherlv_8= ',' ( (otherlv_9= RULE_ID ) ) )*
+                                    loop521:
+                                    do {
+                                        int alt521=2;
+                                        int LA521_0 = input.LA(1);
+
+                                        if ( (LA521_0==20) ) {
+                                            alt521=1;
+                                        }
+
+
+                                        switch (alt521) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:23611:8: otherlv_8= ',' ( (otherlv_9= RULE_ID ) )
+                                    	    {
+                                    	    otherlv_8=(Token)match(input,20,FollowSets000.FOLLOW_224); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      								newLeafNode(otherlv_8, grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_0_1_0());
+                                    	      							
+                                    	    }
+                                    	    // InternalFormalML.g:23615:8: ( (otherlv_9= RULE_ID ) )
+                                    	    // InternalFormalML.g:23616:9: (otherlv_9= RULE_ID )
+                                    	    {
+                                    	    // InternalFormalML.g:23616:9: (otherlv_9= RULE_ID )
+                                    	    // InternalFormalML.g:23617:10: otherlv_9= RULE_ID
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										/* */
+                                    	      									
+                                    	    }
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										if (current==null) {
+                                    	      											current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                    	      										}
+                                    	      									
+                                    	    }
+                                    	    otherlv_9=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_223); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										newLeafNode(otherlv_9, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_0_1_1_0());
+                                    	      									
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop521;
+                                        }
+                                    } while (true);
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:23634:6: (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' )
+                                    {
+                                    // InternalFormalML.g:23634:6: (otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')' )
+                                    // InternalFormalML.g:23635:7: otherlv_10= '(' ( (otherlv_11= RULE_ID ) ) (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )* otherlv_14= ')'
+                                    {
+                                    otherlv_10=(Token)match(input,56,FollowSets000.FOLLOW_224); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							newLeafNode(otherlv_10, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_1_4_1_1_0());
+                                      						
+                                    }
+                                    // InternalFormalML.g:23639:7: ( (otherlv_11= RULE_ID ) )
+                                    // InternalFormalML.g:23640:8: (otherlv_11= RULE_ID )
+                                    {
+                                    // InternalFormalML.g:23640:8: (otherlv_11= RULE_ID )
+                                    // InternalFormalML.g:23641:9: otherlv_11= RULE_ID
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                      									}
+                                      								
+                                    }
+                                    otherlv_11=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_39); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									newLeafNode(otherlv_11, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_1_0());
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    // InternalFormalML.g:23655:7: (otherlv_12= ',' ( (otherlv_13= RULE_ID ) ) )*
+                                    loop522:
+                                    do {
+                                        int alt522=2;
+                                        int LA522_0 = input.LA(1);
+
+                                        if ( (LA522_0==20) ) {
+                                            alt522=1;
+                                        }
+
+
+                                        switch (alt522) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:23656:8: otherlv_12= ',' ( (otherlv_13= RULE_ID ) )
+                                    	    {
+                                    	    otherlv_12=(Token)match(input,20,FollowSets000.FOLLOW_224); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      								newLeafNode(otherlv_12, grammarAccess.getInvokeStatementAccess().getCommaKeyword_1_4_1_1_2_0());
+                                    	      							
+                                    	    }
+                                    	    // InternalFormalML.g:23660:8: ( (otherlv_13= RULE_ID ) )
+                                    	    // InternalFormalML.g:23661:9: (otherlv_13= RULE_ID )
+                                    	    {
+                                    	    // InternalFormalML.g:23661:9: (otherlv_13= RULE_ID )
+                                    	    // InternalFormalML.g:23662:10: otherlv_13= RULE_ID
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										/* */
+                                    	      									
+                                    	    }
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										if (current==null) {
+                                    	      											current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                    	      										}
+                                    	      									
+                                    	    }
+                                    	    otherlv_13=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_39); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										newLeafNode(otherlv_13, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_1_4_1_1_2_1_0());
+                                    	      									
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop522;
+                                        }
+                                    } while (true);
+
+                                    otherlv_14=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							newLeafNode(otherlv_14, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_1_4_1_1_3());
+                                      						
+                                    }
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_15=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_15, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_1_5());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:23690:3: ( ( (lv_execRoutine_16_0= 'exec' ) ) ( ( ruleESUfid ) ) otherlv_18= '(' ( (lv_args_19_0= ruleMixTupleExpressionList ) )? otherlv_20= ')' (otherlv_21= '-->' ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) ) )? otherlv_30= ';' )
+                    {
+                    // InternalFormalML.g:23690:3: ( ( (lv_execRoutine_16_0= 'exec' ) ) ( ( ruleESUfid ) ) otherlv_18= '(' ( (lv_args_19_0= ruleMixTupleExpressionList ) )? otherlv_20= ')' (otherlv_21= '-->' ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) ) )? otherlv_30= ';' )
+                    // InternalFormalML.g:23691:4: ( (lv_execRoutine_16_0= 'exec' ) ) ( ( ruleESUfid ) ) otherlv_18= '(' ( (lv_args_19_0= ruleMixTupleExpressionList ) )? otherlv_20= ')' (otherlv_21= '-->' ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) ) )? otherlv_30= ';'
+                    {
+                    // InternalFormalML.g:23691:4: ( (lv_execRoutine_16_0= 'exec' ) )
+                    // InternalFormalML.g:23692:5: (lv_execRoutine_16_0= 'exec' )
+                    {
+                    // InternalFormalML.g:23692:5: (lv_execRoutine_16_0= 'exec' )
+                    // InternalFormalML.g:23693:6: lv_execRoutine_16_0= 'exec'
+                    {
+                    lv_execRoutine_16_0=(Token)match(input,181,FollowSets000.FOLLOW_35); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_execRoutine_16_0, grammarAccess.getInvokeStatementAccess().getExecRoutineExecKeyword_2_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getInvokeStatementRule());
+                      						}
+                      						setWithLastConsumed(current, "execRoutine", true, "exec");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:23705:4: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:23706:5: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:23706:5: ( ruleESUfid )
+                    // InternalFormalML.g:23707:6: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getInvokeStatementRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_216);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_18=(Token)match(input,56,FollowSets000.FOLLOW_220); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_18, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_2());
+                      			
+                    }
+                    // InternalFormalML.g:23728:4: ( (lv_args_19_0= ruleMixTupleExpressionList ) )?
+                    int alt525=2;
+                    int LA525_0 = input.LA(1);
+
+                    if ( ((LA525_0>=RULE_XLIA_ID && LA525_0<=RULE_STRING)||LA525_0==16||LA525_0==22||(LA525_0>=26 && LA525_0<=29)||LA525_0==56||LA525_0==212||(LA525_0>=216 && LA525_0<=224)||(LA525_0>=227 && LA525_0<=239)) ) {
+                        alt525=1;
+                    }
+                    switch (alt525) {
+                        case 1 :
+                            // InternalFormalML.g:23729:5: (lv_args_19_0= ruleMixTupleExpressionList )
+                            {
+                            // InternalFormalML.g:23729:5: (lv_args_19_0= ruleMixTupleExpressionList )
+                            // InternalFormalML.g:23730:6: lv_args_19_0= ruleMixTupleExpressionList
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_2_3_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_99);
+                            lv_args_19_0=ruleMixTupleExpressionList();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
+                              						}
+                              						set(
+                              							current,
+                              							"args",
+                              							lv_args_19_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_20=(Token)match(input,57,FollowSets000.FOLLOW_221); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_20, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_4());
+                      			
+                    }
+                    // InternalFormalML.g:23751:4: (otherlv_21= '-->' ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) ) )?
+                    int alt529=2;
+                    int LA529_0 = input.LA(1);
+
+                    if ( (LA529_0==59) ) {
+                        alt529=1;
+                    }
+                    switch (alt529) {
+                        case 1 :
+                            // InternalFormalML.g:23752:5: otherlv_21= '-->' ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) )
+                            {
+                            otherlv_21=(Token)match(input,59,FollowSets000.FOLLOW_222); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_21, grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0());
+                              				
+                            }
+                            // InternalFormalML.g:23756:5: ( ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* ) | (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' ) )
+                            int alt528=2;
+                            int LA528_0 = input.LA(1);
+
+                            if ( (LA528_0==RULE_ID) ) {
+                                alt528=1;
+                            }
+                            else if ( (LA528_0==56) ) {
+                                alt528=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 528, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt528) {
+                                case 1 :
+                                    // InternalFormalML.g:23757:6: ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* )
+                                    {
+                                    // InternalFormalML.g:23757:6: ( ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )* )
+                                    // InternalFormalML.g:23758:7: ( (otherlv_22= RULE_ID ) ) (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )*
+                                    {
+                                    // InternalFormalML.g:23758:7: ( (otherlv_22= RULE_ID ) )
+                                    // InternalFormalML.g:23759:8: (otherlv_22= RULE_ID )
+                                    {
+                                    // InternalFormalML.g:23759:8: (otherlv_22= RULE_ID )
+                                    // InternalFormalML.g:23760:9: otherlv_22= RULE_ID
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                      									}
+                                      								
+                                    }
+                                    otherlv_22=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_223); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									newLeafNode(otherlv_22, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_0_0());
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    // InternalFormalML.g:23774:7: (otherlv_23= ',' ( (otherlv_24= RULE_ID ) ) )*
+                                    loop526:
+                                    do {
+                                        int alt526=2;
+                                        int LA526_0 = input.LA(1);
+
+                                        if ( (LA526_0==20) ) {
+                                            alt526=1;
+                                        }
+
+
+                                        switch (alt526) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:23775:8: otherlv_23= ',' ( (otherlv_24= RULE_ID ) )
+                                    	    {
+                                    	    otherlv_23=(Token)match(input,20,FollowSets000.FOLLOW_224); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      								newLeafNode(otherlv_23, grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_0_1_0());
+                                    	      							
+                                    	    }
+                                    	    // InternalFormalML.g:23779:8: ( (otherlv_24= RULE_ID ) )
+                                    	    // InternalFormalML.g:23780:9: (otherlv_24= RULE_ID )
+                                    	    {
+                                    	    // InternalFormalML.g:23780:9: (otherlv_24= RULE_ID )
+                                    	    // InternalFormalML.g:23781:10: otherlv_24= RULE_ID
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										/* */
+                                    	      									
+                                    	    }
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										if (current==null) {
+                                    	      											current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                    	      										}
+                                    	      									
+                                    	    }
+                                    	    otherlv_24=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_223); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										newLeafNode(otherlv_24, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_0_1_1_0());
+                                    	      									
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop526;
+                                        }
+                                    } while (true);
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:23798:6: (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' )
+                                    {
+                                    // InternalFormalML.g:23798:6: (otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')' )
+                                    // InternalFormalML.g:23799:7: otherlv_25= '(' ( (otherlv_26= RULE_ID ) ) (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )* otherlv_29= ')'
+                                    {
+                                    otherlv_25=(Token)match(input,56,FollowSets000.FOLLOW_224); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							newLeafNode(otherlv_25, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_2_5_1_1_0());
+                                      						
+                                    }
+                                    // InternalFormalML.g:23803:7: ( (otherlv_26= RULE_ID ) )
+                                    // InternalFormalML.g:23804:8: (otherlv_26= RULE_ID )
+                                    {
+                                    // InternalFormalML.g:23804:8: (otherlv_26= RULE_ID )
+                                    // InternalFormalML.g:23805:9: otherlv_26= RULE_ID
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                      									}
+                                      								
+                                    }
+                                    otherlv_26=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_39); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									newLeafNode(otherlv_26, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_1_0());
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    // InternalFormalML.g:23819:7: (otherlv_27= ',' ( (otherlv_28= RULE_ID ) ) )*
+                                    loop527:
+                                    do {
+                                        int alt527=2;
+                                        int LA527_0 = input.LA(1);
+
+                                        if ( (LA527_0==20) ) {
+                                            alt527=1;
+                                        }
+
+
+                                        switch (alt527) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:23820:8: otherlv_27= ',' ( (otherlv_28= RULE_ID ) )
+                                    	    {
+                                    	    otherlv_27=(Token)match(input,20,FollowSets000.FOLLOW_224); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      								newLeafNode(otherlv_27, grammarAccess.getInvokeStatementAccess().getCommaKeyword_2_5_1_1_2_0());
+                                    	      							
+                                    	    }
+                                    	    // InternalFormalML.g:23824:8: ( (otherlv_28= RULE_ID ) )
+                                    	    // InternalFormalML.g:23825:9: (otherlv_28= RULE_ID )
+                                    	    {
+                                    	    // InternalFormalML.g:23825:9: (otherlv_28= RULE_ID )
+                                    	    // InternalFormalML.g:23826:10: otherlv_28= RULE_ID
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										/* */
+                                    	      									
+                                    	    }
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										if (current==null) {
+                                    	      											current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                    	      										}
+                                    	      									
+                                    	    }
+                                    	    otherlv_28=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_39); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										newLeafNode(otherlv_28, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_2_5_1_1_2_1_0());
+                                    	      									
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop527;
+                                        }
+                                    } while (true);
+
+                                    otherlv_29=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							newLeafNode(otherlv_29, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_2_5_1_1_3());
+                                      						
+                                    }
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_30=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_30, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_2_6());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:23854:3: ( ( (lv_callProcedure_31_0= 'call' ) ) ( ( ruleESUfid ) ) ( (lv_args_33_0= ruleMixTupleExpressionList ) )? (otherlv_34= '-->' ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) ) )? otherlv_43= ';' )
+                    {
+                    // InternalFormalML.g:23854:3: ( ( (lv_callProcedure_31_0= 'call' ) ) ( ( ruleESUfid ) ) ( (lv_args_33_0= ruleMixTupleExpressionList ) )? (otherlv_34= '-->' ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) ) )? otherlv_43= ';' )
+                    // InternalFormalML.g:23855:4: ( (lv_callProcedure_31_0= 'call' ) ) ( ( ruleESUfid ) ) ( (lv_args_33_0= ruleMixTupleExpressionList ) )? (otherlv_34= '-->' ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) ) )? otherlv_43= ';'
+                    {
+                    // InternalFormalML.g:23855:4: ( (lv_callProcedure_31_0= 'call' ) )
+                    // InternalFormalML.g:23856:5: (lv_callProcedure_31_0= 'call' )
+                    {
+                    // InternalFormalML.g:23856:5: (lv_callProcedure_31_0= 'call' )
+                    // InternalFormalML.g:23857:6: lv_callProcedure_31_0= 'call'
+                    {
+                    lv_callProcedure_31_0=(Token)match(input,182,FollowSets000.FOLLOW_35); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_callProcedure_31_0, grammarAccess.getInvokeStatementAccess().getCallProcedureCallKeyword_3_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getInvokeStatementRule());
+                      						}
+                      						setWithLastConsumed(current, "callProcedure", true, "call");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:23869:4: ( ( ruleESUfid ) )
+                    // InternalFormalML.g:23870:5: ( ruleESUfid )
+                    {
+                    // InternalFormalML.g:23870:5: ( ruleESUfid )
+                    // InternalFormalML.g:23871:6: ruleESUfid
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getInvokeStatementRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getInvokeStatementAccess().getInvokableNamedElementCrossReference_3_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_225);
+                    ruleESUfid();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:23888:4: ( (lv_args_33_0= ruleMixTupleExpressionList ) )?
+                    int alt530=2;
+                    int LA530_0 = input.LA(1);
+
+                    if ( ((LA530_0>=RULE_XLIA_ID && LA530_0<=RULE_STRING)||LA530_0==16||LA530_0==22||(LA530_0>=26 && LA530_0<=29)||LA530_0==56||LA530_0==212||(LA530_0>=216 && LA530_0<=224)||(LA530_0>=227 && LA530_0<=239)) ) {
+                        alt530=1;
+                    }
+                    switch (alt530) {
+                        case 1 :
+                            // InternalFormalML.g:23889:5: (lv_args_33_0= ruleMixTupleExpressionList )
+                            {
+                            // InternalFormalML.g:23889:5: (lv_args_33_0= ruleMixTupleExpressionList )
+                            // InternalFormalML.g:23890:6: lv_args_33_0= ruleMixTupleExpressionList
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						newCompositeNode(grammarAccess.getInvokeStatementAccess().getArgsMixTupleExpressionListParserRuleCall_3_2_0());
+                              					
+                            }
+                            pushFollow(FollowSets000.FOLLOW_221);
+                            lv_args_33_0=ruleMixTupleExpressionList();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						if (current==null) {
+                              							current = createModelElementForParent(grammarAccess.getInvokeStatementRule());
+                              						}
+                              						set(
+                              							current,
+                              							"args",
+                              							lv_args_33_0,
+                              							"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+                              						afterParserOrEnumRuleCall();
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:23907:4: (otherlv_34= '-->' ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) ) )?
+                    int alt534=2;
+                    int LA534_0 = input.LA(1);
+
+                    if ( (LA534_0==59) ) {
+                        alt534=1;
+                    }
+                    switch (alt534) {
+                        case 1 :
+                            // InternalFormalML.g:23908:5: otherlv_34= '-->' ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) )
+                            {
+                            otherlv_34=(Token)match(input,59,FollowSets000.FOLLOW_222); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_34, grammarAccess.getInvokeStatementAccess().getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0());
+                              				
+                            }
+                            // InternalFormalML.g:23912:5: ( ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* ) | (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' ) )
+                            int alt533=2;
+                            int LA533_0 = input.LA(1);
+
+                            if ( (LA533_0==RULE_ID) ) {
+                                alt533=1;
+                            }
+                            else if ( (LA533_0==56) ) {
+                                alt533=2;
+                            }
+                            else {
+                                if (state.backtracking>0) {state.failed=true; return current;}
+                                NoViableAltException nvae =
+                                    new NoViableAltException("", 533, 0, input);
+
+                                throw nvae;
+                            }
+                            switch (alt533) {
+                                case 1 :
+                                    // InternalFormalML.g:23913:6: ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* )
+                                    {
+                                    // InternalFormalML.g:23913:6: ( ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )* )
+                                    // InternalFormalML.g:23914:7: ( (otherlv_35= RULE_ID ) ) (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )*
+                                    {
+                                    // InternalFormalML.g:23914:7: ( (otherlv_35= RULE_ID ) )
+                                    // InternalFormalML.g:23915:8: (otherlv_35= RULE_ID )
+                                    {
+                                    // InternalFormalML.g:23915:8: (otherlv_35= RULE_ID )
+                                    // InternalFormalML.g:23916:9: otherlv_35= RULE_ID
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                      									}
+                                      								
+                                    }
+                                    otherlv_35=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_223); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									newLeafNode(otherlv_35, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_0_0());
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    // InternalFormalML.g:23930:7: (otherlv_36= ',' ( (otherlv_37= RULE_ID ) ) )*
+                                    loop531:
+                                    do {
+                                        int alt531=2;
+                                        int LA531_0 = input.LA(1);
+
+                                        if ( (LA531_0==20) ) {
+                                            alt531=1;
+                                        }
+
+
+                                        switch (alt531) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:23931:8: otherlv_36= ',' ( (otherlv_37= RULE_ID ) )
+                                    	    {
+                                    	    otherlv_36=(Token)match(input,20,FollowSets000.FOLLOW_224); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      								newLeafNode(otherlv_36, grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_0_1_0());
+                                    	      							
+                                    	    }
+                                    	    // InternalFormalML.g:23935:8: ( (otherlv_37= RULE_ID ) )
+                                    	    // InternalFormalML.g:23936:9: (otherlv_37= RULE_ID )
+                                    	    {
+                                    	    // InternalFormalML.g:23936:9: (otherlv_37= RULE_ID )
+                                    	    // InternalFormalML.g:23937:10: otherlv_37= RULE_ID
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										/* */
+                                    	      									
+                                    	    }
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										if (current==null) {
+                                    	      											current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                    	      										}
+                                    	      									
+                                    	    }
+                                    	    otherlv_37=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_223); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										newLeafNode(otherlv_37, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_0_1_1_0());
+                                    	      									
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop531;
+                                        }
+                                    } while (true);
+
+
+                                    }
+
+
+                                    }
+                                    break;
+                                case 2 :
+                                    // InternalFormalML.g:23954:6: (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' )
+                                    {
+                                    // InternalFormalML.g:23954:6: (otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')' )
+                                    // InternalFormalML.g:23955:7: otherlv_38= '(' ( (otherlv_39= RULE_ID ) ) (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )* otherlv_42= ')'
+                                    {
+                                    otherlv_38=(Token)match(input,56,FollowSets000.FOLLOW_224); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							newLeafNode(otherlv_38, grammarAccess.getInvokeStatementAccess().getLeftParenthesisKeyword_3_3_1_1_0());
+                                      						
+                                    }
+                                    // InternalFormalML.g:23959:7: ( (otherlv_39= RULE_ID ) )
+                                    // InternalFormalML.g:23960:8: (otherlv_39= RULE_ID )
+                                    {
+                                    // InternalFormalML.g:23960:8: (otherlv_39= RULE_ID )
+                                    // InternalFormalML.g:23961:9: otherlv_39= RULE_ID
+                                    {
+                                    if ( state.backtracking==0 ) {
+
+                                      									/* */
+                                      								
+                                    }
+                                    if ( state.backtracking==0 ) {
+
+                                      									if (current==null) {
+                                      										current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                      									}
+                                      								
+                                    }
+                                    otherlv_39=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_39); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      									newLeafNode(otherlv_39, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_1_0());
+                                      								
+                                    }
+
+                                    }
+
+
+                                    }
+
+                                    // InternalFormalML.g:23975:7: (otherlv_40= ',' ( (otherlv_41= RULE_ID ) ) )*
+                                    loop532:
+                                    do {
+                                        int alt532=2;
+                                        int LA532_0 = input.LA(1);
+
+                                        if ( (LA532_0==20) ) {
+                                            alt532=1;
+                                        }
+
+
+                                        switch (alt532) {
+                                    	case 1 :
+                                    	    // InternalFormalML.g:23976:8: otherlv_40= ',' ( (otherlv_41= RULE_ID ) )
+                                    	    {
+                                    	    otherlv_40=(Token)match(input,20,FollowSets000.FOLLOW_224); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      								newLeafNode(otherlv_40, grammarAccess.getInvokeStatementAccess().getCommaKeyword_3_3_1_1_2_0());
+                                    	      							
+                                    	    }
+                                    	    // InternalFormalML.g:23980:8: ( (otherlv_41= RULE_ID ) )
+                                    	    // InternalFormalML.g:23981:9: (otherlv_41= RULE_ID )
+                                    	    {
+                                    	    // InternalFormalML.g:23981:9: (otherlv_41= RULE_ID )
+                                    	    // InternalFormalML.g:23982:10: otherlv_41= RULE_ID
+                                    	    {
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										/* */
+                                    	      									
+                                    	    }
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										if (current==null) {
+                                    	      											current = createModelElement(grammarAccess.getInvokeStatementRule());
+                                    	      										}
+                                    	      									
+                                    	    }
+                                    	    otherlv_41=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_39); if (state.failed) return current;
+                                    	    if ( state.backtracking==0 ) {
+
+                                    	      										newLeafNode(otherlv_41, grammarAccess.getInvokeStatementAccess().getRetsVariableCrossReference_3_3_1_1_2_1_0());
+                                    	      									
+                                    	    }
+
+                                    	    }
+
+
+                                    	    }
+
+
+                                    	    }
+                                    	    break;
+
+                                    	default :
+                                    	    break loop532;
+                                        }
+                                    } while (true);
+
+                                    otherlv_42=(Token)match(input,57,FollowSets000.FOLLOW_14); if (state.failed) return current;
+                                    if ( state.backtracking==0 ) {
+
+                                      							newLeafNode(otherlv_42, grammarAccess.getInvokeStatementAccess().getRightParenthesisKeyword_3_3_1_1_3());
+                                      						
+                                    }
+
+                                    }
+
+
+                                    }
+                                    break;
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_43=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_43, grammarAccess.getInvokeStatementAccess().getSemicolonKeyword_3_4());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleInvokeStatement"
+
+
+    // $ANTLR start "entryRuleExpression"
+    // InternalFormalML.g:24013:1: entryRuleExpression returns [EObject current=null] : iv_ruleExpression= ruleExpression EOF ;
+    public final EObject entryRuleExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24013:51: (iv_ruleExpression= ruleExpression EOF )
+            // InternalFormalML.g:24014:2: iv_ruleExpression= ruleExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleExpression=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleExpression"
+
+
+    // $ANTLR start "ruleExpression"
+    // InternalFormalML.g:24020:1: ruleExpression returns [EObject current=null] : (this_AssignmentExpression_0= ruleAssignmentExpression | this_ConditionalTestExpression_1= ruleConditionalTestExpression ) ;
+    public final EObject ruleExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_AssignmentExpression_0 = null;
+
+        EObject this_ConditionalTestExpression_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24026:2: ( (this_AssignmentExpression_0= ruleAssignmentExpression | this_ConditionalTestExpression_1= ruleConditionalTestExpression ) )
+            // InternalFormalML.g:24027:2: (this_AssignmentExpression_0= ruleAssignmentExpression | this_ConditionalTestExpression_1= ruleConditionalTestExpression )
+            {
+            // InternalFormalML.g:24027:2: (this_AssignmentExpression_0= ruleAssignmentExpression | this_ConditionalTestExpression_1= ruleConditionalTestExpression )
+            int alt536=2;
+            alt536 = dfa536.predict(input);
+            switch (alt536) {
+                case 1 :
+                    // InternalFormalML.g:24028:3: this_AssignmentExpression_0= ruleAssignmentExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getExpressionAccess().getAssignmentExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_AssignmentExpression_0=ruleAssignmentExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_AssignmentExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:24040:3: this_ConditionalTestExpression_1= ruleConditionalTestExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getExpressionAccess().getConditionalTestExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ConditionalTestExpression_1=ruleConditionalTestExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ConditionalTestExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleExpression"
+
+
+    // $ANTLR start "entryRuleAssignmentExpression"
+    // InternalFormalML.g:24055:1: entryRuleAssignmentExpression returns [EObject current=null] : iv_ruleAssignmentExpression= ruleAssignmentExpression EOF ;
+    public final EObject entryRuleAssignmentExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleAssignmentExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24055:61: (iv_ruleAssignmentExpression= ruleAssignmentExpression EOF )
+            // InternalFormalML.g:24056:2: iv_ruleAssignmentExpression= ruleAssignmentExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getAssignmentExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleAssignmentExpression=ruleAssignmentExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleAssignmentExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleAssignmentExpression"
+
+
+    // $ANTLR start "ruleAssignmentExpression"
+    // InternalFormalML.g:24062:1: ruleAssignmentExpression returns [EObject current=null] : ( ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAssignmentOperator ) ) ( (lv_rigthHandSide_2_0= ruleExpression ) ) ) ;
+    public final EObject ruleAssignmentExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_leftHandSide_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_operator_1_0 = null;
+
+        EObject lv_rigthHandSide_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24068:2: ( ( ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAssignmentOperator ) ) ( (lv_rigthHandSide_2_0= ruleExpression ) ) ) )
+            // InternalFormalML.g:24069:2: ( ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAssignmentOperator ) ) ( (lv_rigthHandSide_2_0= ruleExpression ) ) )
+            {
+            // InternalFormalML.g:24069:2: ( ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAssignmentOperator ) ) ( (lv_rigthHandSide_2_0= ruleExpression ) ) )
+            // InternalFormalML.g:24070:3: ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAssignmentOperator ) ) ( (lv_rigthHandSide_2_0= ruleExpression ) )
+            {
+            // InternalFormalML.g:24070:3: ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:24071:4: (lv_leftHandSide_0_0= ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:24071:4: (lv_leftHandSide_0_0= ruleLeftHandSideExpression )
+            // InternalFormalML.g:24072:5: lv_leftHandSide_0_0= ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_226);
+            lv_leftHandSide_0_0=ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getAssignmentExpressionRule());
+              					}
+              					set(
+              						current,
+              						"leftHandSide",
+              						lv_leftHandSide_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:24089:3: ( (lv_operator_1_0= ruleAssignmentOperator ) )
+            // InternalFormalML.g:24090:4: (lv_operator_1_0= ruleAssignmentOperator )
+            {
+            // InternalFormalML.g:24090:4: (lv_operator_1_0= ruleAssignmentOperator )
+            // InternalFormalML.g:24091:5: lv_operator_1_0= ruleAssignmentOperator
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignmentOperatorParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_13);
+            lv_operator_1_0=ruleAssignmentOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getAssignmentExpressionRule());
+              					}
+              					set(
+              						current,
+              						"operator",
+              						lv_operator_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.AssignmentOperator");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:24108:3: ( (lv_rigthHandSide_2_0= ruleExpression ) )
+            // InternalFormalML.g:24109:4: (lv_rigthHandSide_2_0= ruleExpression )
+            {
+            // InternalFormalML.g:24109:4: (lv_rigthHandSide_2_0= ruleExpression )
+            // InternalFormalML.g:24110:5: lv_rigthHandSide_2_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_rigthHandSide_2_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getAssignmentExpressionRule());
+              					}
+              					set(
+              						current,
+              						"rigthHandSide",
+              						lv_rigthHandSide_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleAssignmentExpression"
+
+
+    // $ANTLR start "entryRuleAssignmentOperator"
+    // InternalFormalML.g:24131:1: entryRuleAssignmentOperator returns [String current=null] : iv_ruleAssignmentOperator= ruleAssignmentOperator EOF ;
+    public final String entryRuleAssignmentOperator() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleAssignmentOperator = null;
+
+
+        try {
+            // InternalFormalML.g:24131:58: (iv_ruleAssignmentOperator= ruleAssignmentOperator EOF )
+            // InternalFormalML.g:24132:2: iv_ruleAssignmentOperator= ruleAssignmentOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getAssignmentOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleAssignmentOperator=ruleAssignmentOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleAssignmentOperator.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleAssignmentOperator"
+
+
+    // $ANTLR start "ruleAssignmentOperator"
+    // InternalFormalML.g:24138:1: ruleAssignmentOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '=' | kw= ':=' | kw= '::=' | kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | kw= '&&=' | kw= '||=' | kw= '&=' | kw= '|=' | kw= '^=' | kw= '<<=' | kw= '>>=' | kw= '>>>=' | kw= '<=<' | kw= '^=<' | kw= '^=>' | kw= '>=>' ) ;
+    public final AntlrDatatypeRuleToken ruleAssignmentOperator() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24144:2: ( (kw= '=' | kw= ':=' | kw= '::=' | kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | kw= '&&=' | kw= '||=' | kw= '&=' | kw= '|=' | kw= '^=' | kw= '<<=' | kw= '>>=' | kw= '>>>=' | kw= '<=<' | kw= '^=<' | kw= '^=>' | kw= '>=>' ) )
+            // InternalFormalML.g:24145:2: (kw= '=' | kw= ':=' | kw= '::=' | kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | kw= '&&=' | kw= '||=' | kw= '&=' | kw= '|=' | kw= '^=' | kw= '<<=' | kw= '>>=' | kw= '>>>=' | kw= '<=<' | kw= '^=<' | kw= '^=>' | kw= '>=>' )
+            {
+            // InternalFormalML.g:24145:2: (kw= '=' | kw= ':=' | kw= '::=' | kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | kw= '&&=' | kw= '||=' | kw= '&=' | kw= '|=' | kw= '^=' | kw= '<<=' | kw= '>>=' | kw= '>>>=' | kw= '<=<' | kw= '^=<' | kw= '^=>' | kw= '>=>' )
+            int alt537=20;
+            switch ( input.LA(1) ) {
+            case 24:
+                {
+                alt537=1;
+                }
+                break;
+            case 183:
+                {
+                alt537=2;
+                }
+                break;
+            case 184:
+                {
+                alt537=3;
+                }
+                break;
+            case 185:
+                {
+                alt537=4;
+                }
+                break;
+            case 186:
+                {
+                alt537=5;
+                }
+                break;
+            case 187:
+                {
+                alt537=6;
+                }
+                break;
+            case 188:
+                {
+                alt537=7;
+                }
+                break;
+            case 189:
+                {
+                alt537=8;
+                }
+                break;
+            case 190:
+                {
+                alt537=9;
+                }
+                break;
+            case 191:
+                {
+                alt537=10;
+                }
+                break;
+            case 192:
+                {
+                alt537=11;
+                }
+                break;
+            case 193:
+                {
+                alt537=12;
+                }
+                break;
+            case 194:
+                {
+                alt537=13;
+                }
+                break;
+            case 195:
+                {
+                alt537=14;
+                }
+                break;
+            case 196:
+                {
+                alt537=15;
+                }
+                break;
+            case 197:
+                {
+                alt537=16;
+                }
+                break;
+            case 198:
+                {
+                alt537=17;
+                }
+                break;
+            case 199:
+                {
+                alt537=18;
+                }
+                break;
+            case 200:
+                {
+                alt537=19;
+                }
+                break;
+            case 201:
+                {
+                alt537=20;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 537, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt537) {
+                case 1 :
+                    // InternalFormalML.g:24146:3: kw= '='
+                    {
+                    kw=(Token)match(input,24,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getEqualsSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:24152:3: kw= ':='
+                    {
+                    kw=(Token)match(input,183,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getColonEqualsSignKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:24158:3: kw= '::='
+                    {
+                    kw=(Token)match(input,184,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getColonColonEqualsSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:24164:3: kw= '+='
+                    {
+                    kw=(Token)match(input,185,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getPlusSignEqualsSignKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:24170:3: kw= '-='
+                    {
+                    kw=(Token)match(input,186,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getHyphenMinusEqualsSignKeyword_4());
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:24176:3: kw= '*='
+                    {
+                    kw=(Token)match(input,187,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getAsteriskEqualsSignKeyword_5());
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:24182:3: kw= '/='
+                    {
+                    kw=(Token)match(input,188,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getSolidusEqualsSignKeyword_6());
+                      		
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:24188:3: kw= '%='
+                    {
+                    kw=(Token)match(input,189,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getPercentSignEqualsSignKeyword_7());
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:24194:3: kw= '&&='
+                    {
+                    kw=(Token)match(input,190,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getAmpersandAmpersandEqualsSignKeyword_8());
+                      		
+                    }
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:24200:3: kw= '||='
+                    {
+                    kw=(Token)match(input,191,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getVerticalLineVerticalLineEqualsSignKeyword_9());
+                      		
+                    }
+
+                    }
+                    break;
+                case 11 :
+                    // InternalFormalML.g:24206:3: kw= '&='
+                    {
+                    kw=(Token)match(input,192,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getAmpersandEqualsSignKeyword_10());
+                      		
+                    }
+
+                    }
+                    break;
+                case 12 :
+                    // InternalFormalML.g:24212:3: kw= '|='
+                    {
+                    kw=(Token)match(input,193,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getVerticalLineEqualsSignKeyword_11());
+                      		
+                    }
+
+                    }
+                    break;
+                case 13 :
+                    // InternalFormalML.g:24218:3: kw= '^='
+                    {
+                    kw=(Token)match(input,194,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignKeyword_12());
+                      		
+                    }
+
+                    }
+                    break;
+                case 14 :
+                    // InternalFormalML.g:24224:3: kw= '<<='
+                    {
+                    kw=(Token)match(input,195,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getLessThanSignLessThanSignEqualsSignKeyword_13());
+                      		
+                    }
+
+                    }
+                    break;
+                case 15 :
+                    // InternalFormalML.g:24230:3: kw= '>>='
+                    {
+                    kw=(Token)match(input,196,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignEqualsSignKeyword_14());
+                      		
+                    }
+
+                    }
+                    break;
+                case 16 :
+                    // InternalFormalML.g:24236:3: kw= '>>>='
+                    {
+                    kw=(Token)match(input,197,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15());
+                      		
+                    }
+
+                    }
+                    break;
+                case 17 :
+                    // InternalFormalML.g:24242:3: kw= '<=<'
+                    {
+                    kw=(Token)match(input,198,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getLessThanSignEqualsSignLessThanSignKeyword_16());
+                      		
+                    }
+
+                    }
+                    break;
+                case 18 :
+                    // InternalFormalML.g:24248:3: kw= '^=<'
+                    {
+                    kw=(Token)match(input,199,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignLessThanSignKeyword_17());
+                      		
+                    }
+
+                    }
+                    break;
+                case 19 :
+                    // InternalFormalML.g:24254:3: kw= '^=>'
+                    {
+                    kw=(Token)match(input,200,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getCircumflexAccentEqualsSignGreaterThanSignKeyword_18());
+                      		
+                    }
+
+                    }
+                    break;
+                case 20 :
+                    // InternalFormalML.g:24260:3: kw= '>=>'
+                    {
+                    kw=(Token)match(input,201,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAssignmentOperatorAccess().getGreaterThanSignEqualsSignGreaterThanSignKeyword_19());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleAssignmentOperator"
+
+
+    // $ANTLR start "entryRuleLeftHandSideExpression"
+    // InternalFormalML.g:24269:1: entryRuleLeftHandSideExpression returns [EObject current=null] : iv_ruleLeftHandSideExpression= ruleLeftHandSideExpression EOF ;
+    public final EObject entryRuleLeftHandSideExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLeftHandSideExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24269:63: (iv_ruleLeftHandSideExpression= ruleLeftHandSideExpression EOF )
+            // InternalFormalML.g:24270:2: iv_ruleLeftHandSideExpression= ruleLeftHandSideExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLeftHandSideExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLeftHandSideExpression=ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLeftHandSideExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLeftHandSideExpression"
+
+
+    // $ANTLR start "ruleLeftHandSideExpression"
+    // InternalFormalML.g:24276:1: ruleLeftHandSideExpression returns [EObject current=null] : ( () ( ( (lv_lvalue_1_0= ruleValueSelectionExpression ) ) | (otherlv_2= '(' ( (lv_lvalue_3_0= ruleValueSelectionExpression ) ) otherlv_4= ')' ) ) ) ;
+    public final EObject ruleLeftHandSideExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_lvalue_1_0 = null;
+
+        EObject lv_lvalue_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24282:2: ( ( () ( ( (lv_lvalue_1_0= ruleValueSelectionExpression ) ) | (otherlv_2= '(' ( (lv_lvalue_3_0= ruleValueSelectionExpression ) ) otherlv_4= ')' ) ) ) )
+            // InternalFormalML.g:24283:2: ( () ( ( (lv_lvalue_1_0= ruleValueSelectionExpression ) ) | (otherlv_2= '(' ( (lv_lvalue_3_0= ruleValueSelectionExpression ) ) otherlv_4= ')' ) ) )
+            {
+            // InternalFormalML.g:24283:2: ( () ( ( (lv_lvalue_1_0= ruleValueSelectionExpression ) ) | (otherlv_2= '(' ( (lv_lvalue_3_0= ruleValueSelectionExpression ) ) otherlv_4= ')' ) ) )
+            // InternalFormalML.g:24284:3: () ( ( (lv_lvalue_1_0= ruleValueSelectionExpression ) ) | (otherlv_2= '(' ( (lv_lvalue_3_0= ruleValueSelectionExpression ) ) otherlv_4= ')' ) )
+            {
+            // InternalFormalML.g:24284:3: ()
+            // InternalFormalML.g:24285:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLeftHandSideExpressionAccess().getLeftHandSideExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:24294:3: ( ( (lv_lvalue_1_0= ruleValueSelectionExpression ) ) | (otherlv_2= '(' ( (lv_lvalue_3_0= ruleValueSelectionExpression ) ) otherlv_4= ')' ) )
+            int alt538=2;
+            int LA538_0 = input.LA(1);
+
+            if ( (LA538_0==RULE_XLIA_ID||(LA538_0>=231 && LA538_0<=239)) ) {
+                alt538=1;
+            }
+            else if ( (LA538_0==56) ) {
+                alt538=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 538, 0, input);
+
+                throw nvae;
+            }
+            switch (alt538) {
+                case 1 :
+                    // InternalFormalML.g:24295:4: ( (lv_lvalue_1_0= ruleValueSelectionExpression ) )
+                    {
+                    // InternalFormalML.g:24295:4: ( (lv_lvalue_1_0= ruleValueSelectionExpression ) )
+                    // InternalFormalML.g:24296:5: (lv_lvalue_1_0= ruleValueSelectionExpression )
+                    {
+                    // InternalFormalML.g:24296:5: (lv_lvalue_1_0= ruleValueSelectionExpression )
+                    // InternalFormalML.g:24297:6: lv_lvalue_1_0= ruleValueSelectionExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_lvalue_1_0=ruleValueSelectionExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getLeftHandSideExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"lvalue",
+                      							lv_lvalue_1_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.ValueSelectionExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:24315:4: (otherlv_2= '(' ( (lv_lvalue_3_0= ruleValueSelectionExpression ) ) otherlv_4= ')' )
+                    {
+                    // InternalFormalML.g:24315:4: (otherlv_2= '(' ( (lv_lvalue_3_0= ruleValueSelectionExpression ) ) otherlv_4= ')' )
+                    // InternalFormalML.g:24316:5: otherlv_2= '(' ( (lv_lvalue_3_0= ruleValueSelectionExpression ) ) otherlv_4= ')'
+                    {
+                    otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_227); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_2, grammarAccess.getLeftHandSideExpressionAccess().getLeftParenthesisKeyword_1_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:24320:5: ( (lv_lvalue_3_0= ruleValueSelectionExpression ) )
+                    // InternalFormalML.g:24321:6: (lv_lvalue_3_0= ruleValueSelectionExpression )
+                    {
+                    // InternalFormalML.g:24321:6: (lv_lvalue_3_0= ruleValueSelectionExpression )
+                    // InternalFormalML.g:24322:7: lv_lvalue_3_0= ruleValueSelectionExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getLeftHandSideExpressionAccess().getLvalueValueSelectionExpressionParserRuleCall_1_1_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_99);
+                    lv_lvalue_3_0=ruleValueSelectionExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getLeftHandSideExpressionRule());
+                      							}
+                      							set(
+                      								current,
+                      								"lvalue",
+                      								lv_lvalue_3_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.ValueSelectionExpression");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getLeftHandSideExpressionAccess().getRightParenthesisKeyword_1_1_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLeftHandSideExpression"
+
+
+    // $ANTLR start "entryRuleConditionalTestExpression"
+    // InternalFormalML.g:24349:1: entryRuleConditionalTestExpression returns [EObject current=null] : iv_ruleConditionalTestExpression= ruleConditionalTestExpression EOF ;
+    public final EObject entryRuleConditionalTestExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleConditionalTestExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24349:66: (iv_ruleConditionalTestExpression= ruleConditionalTestExpression EOF )
+            // InternalFormalML.g:24350:2: iv_ruleConditionalTestExpression= ruleConditionalTestExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getConditionalTestExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleConditionalTestExpression=ruleConditionalTestExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleConditionalTestExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleConditionalTestExpression"
+
+
+    // $ANTLR start "ruleConditionalTestExpression"
+    // InternalFormalML.g:24356:1: ruleConditionalTestExpression returns [EObject current=null] : (this_LogicalOrExpression_0= ruleLogicalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_thenOperand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_elseOperand_5_0= ruleExpression ) ) )? ) ;
+    public final EObject ruleConditionalTestExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        EObject this_LogicalOrExpression_0 = null;
+
+        EObject lv_thenOperand_3_0 = null;
+
+        EObject lv_elseOperand_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24362:2: ( (this_LogicalOrExpression_0= ruleLogicalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_thenOperand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_elseOperand_5_0= ruleExpression ) ) )? ) )
+            // InternalFormalML.g:24363:2: (this_LogicalOrExpression_0= ruleLogicalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_thenOperand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_elseOperand_5_0= ruleExpression ) ) )? )
+            {
+            // InternalFormalML.g:24363:2: (this_LogicalOrExpression_0= ruleLogicalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_thenOperand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_elseOperand_5_0= ruleExpression ) ) )? )
+            // InternalFormalML.g:24364:3: this_LogicalOrExpression_0= ruleLogicalOrExpression ( () ( (lv_operator_2_0= '?' ) ) ( (lv_thenOperand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_elseOperand_5_0= ruleExpression ) ) )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getConditionalTestExpressionAccess().getLogicalOrExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_228);
+            this_LogicalOrExpression_0=ruleLogicalOrExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_LogicalOrExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:24375:3: ( () ( (lv_operator_2_0= '?' ) ) ( (lv_thenOperand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_elseOperand_5_0= ruleExpression ) ) )?
+            int alt539=2;
+            int LA539_0 = input.LA(1);
+
+            if ( (LA539_0==202) ) {
+                alt539=1;
+            }
+            switch (alt539) {
+                case 1 :
+                    // InternalFormalML.g:24376:4: () ( (lv_operator_2_0= '?' ) ) ( (lv_thenOperand_3_0= ruleExpression ) ) otherlv_4= ':' ( (lv_elseOperand_5_0= ruleExpression ) )
+                    {
+                    // InternalFormalML.g:24376:4: ()
+                    // InternalFormalML.g:24377:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndSet(
+                      						grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:24386:4: ( (lv_operator_2_0= '?' ) )
+                    // InternalFormalML.g:24387:5: (lv_operator_2_0= '?' )
+                    {
+                    // InternalFormalML.g:24387:5: (lv_operator_2_0= '?' )
+                    // InternalFormalML.g:24388:6: lv_operator_2_0= '?'
+                    {
+                    lv_operator_2_0=(Token)match(input,202,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_2_0, grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getConditionalTestExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_2_0, "?");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24400:4: ( (lv_thenOperand_3_0= ruleExpression ) )
+                    // InternalFormalML.g:24401:5: (lv_thenOperand_3_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:24401:5: (lv_thenOperand_3_0= ruleExpression )
+                    // InternalFormalML.g:24402:6: lv_thenOperand_3_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getConditionalTestExpressionAccess().getThenOperandExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_40);
+                    lv_thenOperand_3_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getConditionalTestExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"thenOperand",
+                      							lv_thenOperand_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,30,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getConditionalTestExpressionAccess().getColonKeyword_1_3());
+                      			
+                    }
+                    // InternalFormalML.g:24423:4: ( (lv_elseOperand_5_0= ruleExpression ) )
+                    // InternalFormalML.g:24424:5: (lv_elseOperand_5_0= ruleExpression )
+                    {
+                    // InternalFormalML.g:24424:5: (lv_elseOperand_5_0= ruleExpression )
+                    // InternalFormalML.g:24425:6: lv_elseOperand_5_0= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getConditionalTestExpressionAccess().getElseOperandExpressionParserRuleCall_1_4_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_elseOperand_5_0=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getConditionalTestExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"elseOperand",
+                      							lv_elseOperand_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleConditionalTestExpression"
+
+
+    // $ANTLR start "entryRuleLogicalOrExpression"
+    // InternalFormalML.g:24447:1: entryRuleLogicalOrExpression returns [EObject current=null] : iv_ruleLogicalOrExpression= ruleLogicalOrExpression EOF ;
+    public final EObject entryRuleLogicalOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLogicalOrExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24447:60: (iv_ruleLogicalOrExpression= ruleLogicalOrExpression EOF )
+            // InternalFormalML.g:24448:2: iv_ruleLogicalOrExpression= ruleLogicalOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLogicalOrExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLogicalOrExpression=ruleLogicalOrExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLogicalOrExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLogicalOrExpression"
+
+
+    // $ANTLR start "ruleLogicalOrExpression"
+    // InternalFormalML.g:24454:1: ruleLogicalOrExpression returns [EObject current=null] : (this_LogicalAndExpression_0= ruleLogicalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleLogicalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleLogicalAndExpression ) ) )* )? ) ;
+    public final EObject ruleLogicalOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_1=null;
+        Token lv_operator_2_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        EObject this_LogicalAndExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24460:2: ( (this_LogicalAndExpression_0= ruleLogicalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleLogicalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleLogicalAndExpression ) ) )* )? ) )
+            // InternalFormalML.g:24461:2: (this_LogicalAndExpression_0= ruleLogicalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleLogicalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleLogicalAndExpression ) ) )* )? )
+            {
+            // InternalFormalML.g:24461:2: (this_LogicalAndExpression_0= ruleLogicalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleLogicalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleLogicalAndExpression ) ) )* )? )
+            // InternalFormalML.g:24462:3: this_LogicalAndExpression_0= ruleLogicalAndExpression ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleLogicalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleLogicalAndExpression ) ) )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getLogicalAndExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_229);
+            this_LogicalAndExpression_0=ruleLogicalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_LogicalAndExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:24473:3: ( () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleLogicalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleLogicalAndExpression ) ) )* )?
+            int alt543=2;
+            int LA543_0 = input.LA(1);
+
+            if ( (LA543_0==36||LA543_0==150) ) {
+                alt543=1;
+            }
+            switch (alt543) {
+                case 1 :
+                    // InternalFormalML.g:24474:4: () ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) ) ( (lv_operand_3_0= ruleLogicalAndExpression ) ) ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleLogicalAndExpression ) ) )*
+                    {
+                    // InternalFormalML.g:24474:4: ()
+                    // InternalFormalML.g:24475:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:24484:4: ( ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) ) )
+                    // InternalFormalML.g:24485:5: ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) )
+                    {
+                    // InternalFormalML.g:24485:5: ( (lv_operator_2_1= '||' | lv_operator_2_2= 'or' ) )
+                    // InternalFormalML.g:24486:6: (lv_operator_2_1= '||' | lv_operator_2_2= 'or' )
+                    {
+                    // InternalFormalML.g:24486:6: (lv_operator_2_1= '||' | lv_operator_2_2= 'or' )
+                    int alt540=2;
+                    int LA540_0 = input.LA(1);
+
+                    if ( (LA540_0==150) ) {
+                        alt540=1;
+                    }
+                    else if ( (LA540_0==36) ) {
+                        alt540=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 540, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt540) {
+                        case 1 :
+                            // InternalFormalML.g:24487:7: lv_operator_2_1= '||'
+                            {
+                            lv_operator_2_1=(Token)match(input,150,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_1, grammarAccess.getLogicalOrExpressionAccess().getOperatorVerticalLineVerticalLineKeyword_1_1_0_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getLogicalOrExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_1, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:24498:7: lv_operator_2_2= 'or'
+                            {
+                            lv_operator_2_2=(Token)match(input,36,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_2, grammarAccess.getLogicalOrExpressionAccess().getOperatorOrKeyword_1_1_0_1());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getLogicalOrExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_2, null);
+                              						
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24511:4: ( (lv_operand_3_0= ruleLogicalAndExpression ) )
+                    // InternalFormalML.g:24512:5: (lv_operand_3_0= ruleLogicalAndExpression )
+                    {
+                    // InternalFormalML.g:24512:5: (lv_operand_3_0= ruleLogicalAndExpression )
+                    // InternalFormalML.g:24513:6: lv_operand_3_0= ruleLogicalAndExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_229);
+                    lv_operand_3_0=ruleLogicalAndExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getLogicalOrExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.LogicalAndExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24530:4: ( (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleLogicalAndExpression ) ) )*
+                    loop542:
+                    do {
+                        int alt542=2;
+                        int LA542_0 = input.LA(1);
+
+                        if ( (LA542_0==36||LA542_0==150) ) {
+                            alt542=1;
+                        }
+
+
+                        switch (alt542) {
+                    	case 1 :
+                    	    // InternalFormalML.g:24531:5: (otherlv_4= '||' | otherlv_5= 'or' ) ( (lv_operand_6_0= ruleLogicalAndExpression ) )
+                    	    {
+                    	    // InternalFormalML.g:24531:5: (otherlv_4= '||' | otherlv_5= 'or' )
+                    	    int alt541=2;
+                    	    int LA541_0 = input.LA(1);
+
+                    	    if ( (LA541_0==150) ) {
+                    	        alt541=1;
+                    	    }
+                    	    else if ( (LA541_0==36) ) {
+                    	        alt541=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 541, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt541) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:24532:6: otherlv_4= '||'
+                    	            {
+                    	            otherlv_4=(Token)match(input,150,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_4, grammarAccess.getLogicalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:24537:6: otherlv_5= 'or'
+                    	            {
+                    	            otherlv_5=(Token)match(input,36,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_5, grammarAccess.getLogicalOrExpressionAccess().getOrKeyword_1_3_0_1());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    // InternalFormalML.g:24542:5: ( (lv_operand_6_0= ruleLogicalAndExpression ) )
+                    	    // InternalFormalML.g:24543:6: (lv_operand_6_0= ruleLogicalAndExpression )
+                    	    {
+                    	    // InternalFormalML.g:24543:6: (lv_operand_6_0= ruleLogicalAndExpression )
+                    	    // InternalFormalML.g:24544:7: lv_operand_6_0= ruleLogicalAndExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getLogicalOrExpressionAccess().getOperandLogicalAndExpressionParserRuleCall_1_3_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_229);
+                    	    lv_operand_6_0=ruleLogicalAndExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getLogicalOrExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"operand",
+                    	      								lv_operand_6_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.LogicalAndExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop542;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLogicalOrExpression"
+
+
+    // $ANTLR start "entryRuleLogicalAndExpression"
+    // InternalFormalML.g:24567:1: entryRuleLogicalAndExpression returns [EObject current=null] : iv_ruleLogicalAndExpression= ruleLogicalAndExpression EOF ;
+    public final EObject entryRuleLogicalAndExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLogicalAndExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24567:61: (iv_ruleLogicalAndExpression= ruleLogicalAndExpression EOF )
+            // InternalFormalML.g:24568:2: iv_ruleLogicalAndExpression= ruleLogicalAndExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLogicalAndExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLogicalAndExpression=ruleLogicalAndExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLogicalAndExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLogicalAndExpression"
+
+
+    // $ANTLR start "ruleLogicalAndExpression"
+    // InternalFormalML.g:24574:1: ruleLogicalAndExpression returns [EObject current=null] : (this_BitwiseOrExpression_0= ruleBitwiseOrExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleBitwiseOrExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleBitwiseOrExpression ) ) )* )? ) ;
+    public final EObject ruleLogicalAndExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_1=null;
+        Token lv_operator_2_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        EObject this_BitwiseOrExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24580:2: ( (this_BitwiseOrExpression_0= ruleBitwiseOrExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleBitwiseOrExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleBitwiseOrExpression ) ) )* )? ) )
+            // InternalFormalML.g:24581:2: (this_BitwiseOrExpression_0= ruleBitwiseOrExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleBitwiseOrExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleBitwiseOrExpression ) ) )* )? )
+            {
+            // InternalFormalML.g:24581:2: (this_BitwiseOrExpression_0= ruleBitwiseOrExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleBitwiseOrExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleBitwiseOrExpression ) ) )* )? )
+            // InternalFormalML.g:24582:3: this_BitwiseOrExpression_0= ruleBitwiseOrExpression ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleBitwiseOrExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleBitwiseOrExpression ) ) )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getBitwiseOrExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_230);
+            this_BitwiseOrExpression_0=ruleBitwiseOrExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_BitwiseOrExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:24593:3: ( () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleBitwiseOrExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleBitwiseOrExpression ) ) )* )?
+            int alt547=2;
+            int LA547_0 = input.LA(1);
+
+            if ( (LA547_0==35||LA547_0==149) ) {
+                alt547=1;
+            }
+            switch (alt547) {
+                case 1 :
+                    // InternalFormalML.g:24594:4: () ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) ) ( (lv_operand_3_0= ruleBitwiseOrExpression ) ) ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleBitwiseOrExpression ) ) )*
+                    {
+                    // InternalFormalML.g:24594:4: ()
+                    // InternalFormalML.g:24595:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:24604:4: ( ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) ) )
+                    // InternalFormalML.g:24605:5: ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) )
+                    {
+                    // InternalFormalML.g:24605:5: ( (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' ) )
+                    // InternalFormalML.g:24606:6: (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' )
+                    {
+                    // InternalFormalML.g:24606:6: (lv_operator_2_1= '&&' | lv_operator_2_2= 'and' )
+                    int alt544=2;
+                    int LA544_0 = input.LA(1);
+
+                    if ( (LA544_0==149) ) {
+                        alt544=1;
+                    }
+                    else if ( (LA544_0==35) ) {
+                        alt544=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 544, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt544) {
+                        case 1 :
+                            // InternalFormalML.g:24607:7: lv_operator_2_1= '&&'
+                            {
+                            lv_operator_2_1=(Token)match(input,149,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_1, grammarAccess.getLogicalAndExpressionAccess().getOperatorAmpersandAmpersandKeyword_1_1_0_0());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getLogicalAndExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_1, null);
+                              						
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:24618:7: lv_operator_2_2= 'and'
+                            {
+                            lv_operator_2_2=(Token)match(input,35,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							newLeafNode(lv_operator_2_2, grammarAccess.getLogicalAndExpressionAccess().getOperatorAndKeyword_1_1_0_1());
+                              						
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElement(grammarAccess.getLogicalAndExpressionRule());
+                              							}
+                              							setWithLastConsumed(current, "operator", lv_operator_2_2, null);
+                              						
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24631:4: ( (lv_operand_3_0= ruleBitwiseOrExpression ) )
+                    // InternalFormalML.g:24632:5: (lv_operand_3_0= ruleBitwiseOrExpression )
+                    {
+                    // InternalFormalML.g:24632:5: (lv_operand_3_0= ruleBitwiseOrExpression )
+                    // InternalFormalML.g:24633:6: lv_operand_3_0= ruleBitwiseOrExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_230);
+                    lv_operand_3_0=ruleBitwiseOrExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getLogicalAndExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24650:4: ( (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleBitwiseOrExpression ) ) )*
+                    loop546:
+                    do {
+                        int alt546=2;
+                        int LA546_0 = input.LA(1);
+
+                        if ( (LA546_0==35||LA546_0==149) ) {
+                            alt546=1;
+                        }
+
+
+                        switch (alt546) {
+                    	case 1 :
+                    	    // InternalFormalML.g:24651:5: (otherlv_4= '&&' | otherlv_5= 'and' ) ( (lv_operand_6_0= ruleBitwiseOrExpression ) )
+                    	    {
+                    	    // InternalFormalML.g:24651:5: (otherlv_4= '&&' | otherlv_5= 'and' )
+                    	    int alt545=2;
+                    	    int LA545_0 = input.LA(1);
+
+                    	    if ( (LA545_0==149) ) {
+                    	        alt545=1;
+                    	    }
+                    	    else if ( (LA545_0==35) ) {
+                    	        alt545=2;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 545, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt545) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:24652:6: otherlv_4= '&&'
+                    	            {
+                    	            otherlv_4=(Token)match(input,149,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_4, grammarAccess.getLogicalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:24657:6: otherlv_5= 'and'
+                    	            {
+                    	            otherlv_5=(Token)match(input,35,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_5, grammarAccess.getLogicalAndExpressionAccess().getAndKeyword_1_3_0_1());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+                    	    // InternalFormalML.g:24662:5: ( (lv_operand_6_0= ruleBitwiseOrExpression ) )
+                    	    // InternalFormalML.g:24663:6: (lv_operand_6_0= ruleBitwiseOrExpression )
+                    	    {
+                    	    // InternalFormalML.g:24663:6: (lv_operand_6_0= ruleBitwiseOrExpression )
+                    	    // InternalFormalML.g:24664:7: lv_operand_6_0= ruleBitwiseOrExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getLogicalAndExpressionAccess().getOperandBitwiseOrExpressionParserRuleCall_1_3_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_230);
+                    	    lv_operand_6_0=ruleBitwiseOrExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getLogicalAndExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"operand",
+                    	      								lv_operand_6_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop546;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLogicalAndExpression"
+
+
+    // $ANTLR start "entryRuleBitwiseOrExpression"
+    // InternalFormalML.g:24687:1: entryRuleBitwiseOrExpression returns [EObject current=null] : iv_ruleBitwiseOrExpression= ruleBitwiseOrExpression EOF ;
+    public final EObject entryRuleBitwiseOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBitwiseOrExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24687:60: (iv_ruleBitwiseOrExpression= ruleBitwiseOrExpression EOF )
+            // InternalFormalML.g:24688:2: iv_ruleBitwiseOrExpression= ruleBitwiseOrExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBitwiseOrExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBitwiseOrExpression=ruleBitwiseOrExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBitwiseOrExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBitwiseOrExpression"
+
+
+    // $ANTLR start "ruleBitwiseOrExpression"
+    // InternalFormalML.g:24694:1: ruleBitwiseOrExpression returns [EObject current=null] : (this_BitwiseXorExpression_0= ruleBitwiseXorExpression ( () ( (lv_operator_2_0= '|' ) ) ( (lv_operand_3_0= ruleBitwiseXorExpression ) ) (otherlv_4= '|' ( (lv_operand_5_0= ruleBitwiseXorExpression ) ) )* )? ) ;
+    public final EObject ruleBitwiseOrExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        EObject this_BitwiseXorExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24700:2: ( (this_BitwiseXorExpression_0= ruleBitwiseXorExpression ( () ( (lv_operator_2_0= '|' ) ) ( (lv_operand_3_0= ruleBitwiseXorExpression ) ) (otherlv_4= '|' ( (lv_operand_5_0= ruleBitwiseXorExpression ) ) )* )? ) )
+            // InternalFormalML.g:24701:2: (this_BitwiseXorExpression_0= ruleBitwiseXorExpression ( () ( (lv_operator_2_0= '|' ) ) ( (lv_operand_3_0= ruleBitwiseXorExpression ) ) (otherlv_4= '|' ( (lv_operand_5_0= ruleBitwiseXorExpression ) ) )* )? )
+            {
+            // InternalFormalML.g:24701:2: (this_BitwiseXorExpression_0= ruleBitwiseXorExpression ( () ( (lv_operator_2_0= '|' ) ) ( (lv_operand_3_0= ruleBitwiseXorExpression ) ) (otherlv_4= '|' ( (lv_operand_5_0= ruleBitwiseXorExpression ) ) )* )? )
+            // InternalFormalML.g:24702:3: this_BitwiseXorExpression_0= ruleBitwiseXorExpression ( () ( (lv_operator_2_0= '|' ) ) ( (lv_operand_3_0= ruleBitwiseXorExpression ) ) (otherlv_4= '|' ( (lv_operand_5_0= ruleBitwiseXorExpression ) ) )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getBitwiseOrExpressionAccess().getBitwiseXorExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_231);
+            this_BitwiseXorExpression_0=ruleBitwiseXorExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_BitwiseXorExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:24713:3: ( () ( (lv_operator_2_0= '|' ) ) ( (lv_operand_3_0= ruleBitwiseXorExpression ) ) (otherlv_4= '|' ( (lv_operand_5_0= ruleBitwiseXorExpression ) ) )* )?
+            int alt549=2;
+            int LA549_0 = input.LA(1);
+
+            if ( (LA549_0==203) ) {
+                alt549=1;
+            }
+            switch (alt549) {
+                case 1 :
+                    // InternalFormalML.g:24714:4: () ( (lv_operator_2_0= '|' ) ) ( (lv_operand_3_0= ruleBitwiseXorExpression ) ) (otherlv_4= '|' ( (lv_operand_5_0= ruleBitwiseXorExpression ) ) )*
+                    {
+                    // InternalFormalML.g:24714:4: ()
+                    // InternalFormalML.g:24715:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:24724:4: ( (lv_operator_2_0= '|' ) )
+                    // InternalFormalML.g:24725:5: (lv_operator_2_0= '|' )
+                    {
+                    // InternalFormalML.g:24725:5: (lv_operator_2_0= '|' )
+                    // InternalFormalML.g:24726:6: lv_operator_2_0= '|'
+                    {
+                    lv_operator_2_0=(Token)match(input,203,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_2_0, grammarAccess.getBitwiseOrExpressionAccess().getOperatorVerticalLineKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getBitwiseOrExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_2_0, "|");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24738:4: ( (lv_operand_3_0= ruleBitwiseXorExpression ) )
+                    // InternalFormalML.g:24739:5: (lv_operand_3_0= ruleBitwiseXorExpression )
+                    {
+                    // InternalFormalML.g:24739:5: (lv_operand_3_0= ruleBitwiseXorExpression )
+                    // InternalFormalML.g:24740:6: lv_operand_3_0= ruleBitwiseXorExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_231);
+                    lv_operand_3_0=ruleBitwiseXorExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getBitwiseOrExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BitwiseXorExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24757:4: (otherlv_4= '|' ( (lv_operand_5_0= ruleBitwiseXorExpression ) ) )*
+                    loop548:
+                    do {
+                        int alt548=2;
+                        int LA548_0 = input.LA(1);
+
+                        if ( (LA548_0==203) ) {
+                            alt548=1;
+                        }
+
+
+                        switch (alt548) {
+                    	case 1 :
+                    	    // InternalFormalML.g:24758:5: otherlv_4= '|' ( (lv_operand_5_0= ruleBitwiseXorExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,203,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getBitwiseOrExpressionAccess().getVerticalLineKeyword_1_3_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:24762:5: ( (lv_operand_5_0= ruleBitwiseXorExpression ) )
+                    	    // InternalFormalML.g:24763:6: (lv_operand_5_0= ruleBitwiseXorExpression )
+                    	    {
+                    	    // InternalFormalML.g:24763:6: (lv_operand_5_0= ruleBitwiseXorExpression )
+                    	    // InternalFormalML.g:24764:7: lv_operand_5_0= ruleBitwiseXorExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getBitwiseOrExpressionAccess().getOperandBitwiseXorExpressionParserRuleCall_1_3_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_231);
+                    	    lv_operand_5_0=ruleBitwiseXorExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getBitwiseOrExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"operand",
+                    	      								lv_operand_5_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.BitwiseXorExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop548;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBitwiseOrExpression"
+
+
+    // $ANTLR start "entryRuleBitwiseXorExpression"
+    // InternalFormalML.g:24787:1: entryRuleBitwiseXorExpression returns [EObject current=null] : iv_ruleBitwiseXorExpression= ruleBitwiseXorExpression EOF ;
+    public final EObject entryRuleBitwiseXorExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBitwiseXorExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24787:61: (iv_ruleBitwiseXorExpression= ruleBitwiseXorExpression EOF )
+            // InternalFormalML.g:24788:2: iv_ruleBitwiseXorExpression= ruleBitwiseXorExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBitwiseXorExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBitwiseXorExpression=ruleBitwiseXorExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBitwiseXorExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBitwiseXorExpression"
+
+
+    // $ANTLR start "ruleBitwiseXorExpression"
+    // InternalFormalML.g:24794:1: ruleBitwiseXorExpression returns [EObject current=null] : (this_BitwiseAndExpression_0= ruleBitwiseAndExpression ( () ( (lv_operator_2_0= '^' ) ) ( (lv_operand_3_0= ruleBitwiseAndExpression ) ) (otherlv_4= '^' ( (lv_operand_5_0= ruleBitwiseAndExpression ) ) )* )? ) ;
+    public final EObject ruleBitwiseXorExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        EObject this_BitwiseAndExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24800:2: ( (this_BitwiseAndExpression_0= ruleBitwiseAndExpression ( () ( (lv_operator_2_0= '^' ) ) ( (lv_operand_3_0= ruleBitwiseAndExpression ) ) (otherlv_4= '^' ( (lv_operand_5_0= ruleBitwiseAndExpression ) ) )* )? ) )
+            // InternalFormalML.g:24801:2: (this_BitwiseAndExpression_0= ruleBitwiseAndExpression ( () ( (lv_operator_2_0= '^' ) ) ( (lv_operand_3_0= ruleBitwiseAndExpression ) ) (otherlv_4= '^' ( (lv_operand_5_0= ruleBitwiseAndExpression ) ) )* )? )
+            {
+            // InternalFormalML.g:24801:2: (this_BitwiseAndExpression_0= ruleBitwiseAndExpression ( () ( (lv_operator_2_0= '^' ) ) ( (lv_operand_3_0= ruleBitwiseAndExpression ) ) (otherlv_4= '^' ( (lv_operand_5_0= ruleBitwiseAndExpression ) ) )* )? )
+            // InternalFormalML.g:24802:3: this_BitwiseAndExpression_0= ruleBitwiseAndExpression ( () ( (lv_operator_2_0= '^' ) ) ( (lv_operand_3_0= ruleBitwiseAndExpression ) ) (otherlv_4= '^' ( (lv_operand_5_0= ruleBitwiseAndExpression ) ) )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAndExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_232);
+            this_BitwiseAndExpression_0=ruleBitwiseAndExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_BitwiseAndExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:24813:3: ( () ( (lv_operator_2_0= '^' ) ) ( (lv_operand_3_0= ruleBitwiseAndExpression ) ) (otherlv_4= '^' ( (lv_operand_5_0= ruleBitwiseAndExpression ) ) )* )?
+            int alt551=2;
+            int LA551_0 = input.LA(1);
+
+            if ( (LA551_0==204) ) {
+                alt551=1;
+            }
+            switch (alt551) {
+                case 1 :
+                    // InternalFormalML.g:24814:4: () ( (lv_operator_2_0= '^' ) ) ( (lv_operand_3_0= ruleBitwiseAndExpression ) ) (otherlv_4= '^' ( (lv_operand_5_0= ruleBitwiseAndExpression ) ) )*
+                    {
+                    // InternalFormalML.g:24814:4: ()
+                    // InternalFormalML.g:24815:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:24824:4: ( (lv_operator_2_0= '^' ) )
+                    // InternalFormalML.g:24825:5: (lv_operator_2_0= '^' )
+                    {
+                    // InternalFormalML.g:24825:5: (lv_operator_2_0= '^' )
+                    // InternalFormalML.g:24826:6: lv_operator_2_0= '^'
+                    {
+                    lv_operator_2_0=(Token)match(input,204,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_2_0, grammarAccess.getBitwiseXorExpressionAccess().getOperatorCircumflexAccentKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getBitwiseXorExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_2_0, "^");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24838:4: ( (lv_operand_3_0= ruleBitwiseAndExpression ) )
+                    // InternalFormalML.g:24839:5: (lv_operand_3_0= ruleBitwiseAndExpression )
+                    {
+                    // InternalFormalML.g:24839:5: (lv_operand_3_0= ruleBitwiseAndExpression )
+                    // InternalFormalML.g:24840:6: lv_operand_3_0= ruleBitwiseAndExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_232);
+                    lv_operand_3_0=ruleBitwiseAndExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getBitwiseXorExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.BitwiseAndExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24857:4: (otherlv_4= '^' ( (lv_operand_5_0= ruleBitwiseAndExpression ) ) )*
+                    loop550:
+                    do {
+                        int alt550=2;
+                        int LA550_0 = input.LA(1);
+
+                        if ( (LA550_0==204) ) {
+                            alt550=1;
+                        }
+
+
+                        switch (alt550) {
+                    	case 1 :
+                    	    // InternalFormalML.g:24858:5: otherlv_4= '^' ( (lv_operand_5_0= ruleBitwiseAndExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,204,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getBitwiseXorExpressionAccess().getCircumflexAccentKeyword_1_3_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:24862:5: ( (lv_operand_5_0= ruleBitwiseAndExpression ) )
+                    	    // InternalFormalML.g:24863:6: (lv_operand_5_0= ruleBitwiseAndExpression )
+                    	    {
+                    	    // InternalFormalML.g:24863:6: (lv_operand_5_0= ruleBitwiseAndExpression )
+                    	    // InternalFormalML.g:24864:7: lv_operand_5_0= ruleBitwiseAndExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getBitwiseXorExpressionAccess().getOperandBitwiseAndExpressionParserRuleCall_1_3_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_232);
+                    	    lv_operand_5_0=ruleBitwiseAndExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getBitwiseXorExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"operand",
+                    	      								lv_operand_5_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.BitwiseAndExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop550;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBitwiseXorExpression"
+
+
+    // $ANTLR start "entryRuleBitwiseAndExpression"
+    // InternalFormalML.g:24887:1: entryRuleBitwiseAndExpression returns [EObject current=null] : iv_ruleBitwiseAndExpression= ruleBitwiseAndExpression EOF ;
+    public final EObject entryRuleBitwiseAndExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBitwiseAndExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24887:61: (iv_ruleBitwiseAndExpression= ruleBitwiseAndExpression EOF )
+            // InternalFormalML.g:24888:2: iv_ruleBitwiseAndExpression= ruleBitwiseAndExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBitwiseAndExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBitwiseAndExpression=ruleBitwiseAndExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBitwiseAndExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBitwiseAndExpression"
+
+
+    // $ANTLR start "ruleBitwiseAndExpression"
+    // InternalFormalML.g:24894:1: ruleBitwiseAndExpression returns [EObject current=null] : (this_EqualityExpression_0= ruleEqualityExpression ( () ( (lv_operator_2_0= '&' ) ) ( (lv_operand_3_0= ruleEqualityExpression ) ) (otherlv_4= '&' ( (lv_operand_5_0= ruleEqualityExpression ) ) )* )? ) ;
+    public final EObject ruleBitwiseAndExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        EObject this_EqualityExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:24900:2: ( (this_EqualityExpression_0= ruleEqualityExpression ( () ( (lv_operator_2_0= '&' ) ) ( (lv_operand_3_0= ruleEqualityExpression ) ) (otherlv_4= '&' ( (lv_operand_5_0= ruleEqualityExpression ) ) )* )? ) )
+            // InternalFormalML.g:24901:2: (this_EqualityExpression_0= ruleEqualityExpression ( () ( (lv_operator_2_0= '&' ) ) ( (lv_operand_3_0= ruleEqualityExpression ) ) (otherlv_4= '&' ( (lv_operand_5_0= ruleEqualityExpression ) ) )* )? )
+            {
+            // InternalFormalML.g:24901:2: (this_EqualityExpression_0= ruleEqualityExpression ( () ( (lv_operator_2_0= '&' ) ) ( (lv_operand_3_0= ruleEqualityExpression ) ) (otherlv_4= '&' ( (lv_operand_5_0= ruleEqualityExpression ) ) )* )? )
+            // InternalFormalML.g:24902:3: this_EqualityExpression_0= ruleEqualityExpression ( () ( (lv_operator_2_0= '&' ) ) ( (lv_operand_3_0= ruleEqualityExpression ) ) (otherlv_4= '&' ( (lv_operand_5_0= ruleEqualityExpression ) ) )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getBitwiseAndExpressionAccess().getEqualityExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_233);
+            this_EqualityExpression_0=ruleEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_EqualityExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:24913:3: ( () ( (lv_operator_2_0= '&' ) ) ( (lv_operand_3_0= ruleEqualityExpression ) ) (otherlv_4= '&' ( (lv_operand_5_0= ruleEqualityExpression ) ) )* )?
+            int alt553=2;
+            int LA553_0 = input.LA(1);
+
+            if ( (LA553_0==145) ) {
+                alt553=1;
+            }
+            switch (alt553) {
+                case 1 :
+                    // InternalFormalML.g:24914:4: () ( (lv_operator_2_0= '&' ) ) ( (lv_operand_3_0= ruleEqualityExpression ) ) (otherlv_4= '&' ( (lv_operand_5_0= ruleEqualityExpression ) ) )*
+                    {
+                    // InternalFormalML.g:24914:4: ()
+                    // InternalFormalML.g:24915:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndAdd(
+                      						grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:24924:4: ( (lv_operator_2_0= '&' ) )
+                    // InternalFormalML.g:24925:5: (lv_operator_2_0= '&' )
+                    {
+                    // InternalFormalML.g:24925:5: (lv_operator_2_0= '&' )
+                    // InternalFormalML.g:24926:6: lv_operator_2_0= '&'
+                    {
+                    lv_operator_2_0=(Token)match(input,145,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_2_0, grammarAccess.getBitwiseAndExpressionAccess().getOperatorAmpersandKeyword_1_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getBitwiseAndExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_2_0, "&");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24938:4: ( (lv_operand_3_0= ruleEqualityExpression ) )
+                    // InternalFormalML.g:24939:5: (lv_operand_3_0= ruleEqualityExpression )
+                    {
+                    // InternalFormalML.g:24939:5: (lv_operand_3_0= ruleEqualityExpression )
+                    // InternalFormalML.g:24940:6: lv_operand_3_0= ruleEqualityExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_233);
+                    lv_operand_3_0=ruleEqualityExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getBitwiseAndExpressionRule());
+                      						}
+                      						add(
+                      							current,
+                      							"operand",
+                      							lv_operand_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.EqualityExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:24957:4: (otherlv_4= '&' ( (lv_operand_5_0= ruleEqualityExpression ) ) )*
+                    loop552:
+                    do {
+                        int alt552=2;
+                        int LA552_0 = input.LA(1);
+
+                        if ( (LA552_0==145) ) {
+                            alt552=1;
+                        }
+
+
+                        switch (alt552) {
+                    	case 1 :
+                    	    // InternalFormalML.g:24958:5: otherlv_4= '&' ( (lv_operand_5_0= ruleEqualityExpression ) )
+                    	    {
+                    	    otherlv_4=(Token)match(input,145,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_4, grammarAccess.getBitwiseAndExpressionAccess().getAmpersandKeyword_1_3_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:24962:5: ( (lv_operand_5_0= ruleEqualityExpression ) )
+                    	    // InternalFormalML.g:24963:6: (lv_operand_5_0= ruleEqualityExpression )
+                    	    {
+                    	    // InternalFormalML.g:24963:6: (lv_operand_5_0= ruleEqualityExpression )
+                    	    // InternalFormalML.g:24964:7: lv_operand_5_0= ruleEqualityExpression
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getBitwiseAndExpressionAccess().getOperandEqualityExpressionParserRuleCall_1_3_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_233);
+                    	    lv_operand_5_0=ruleEqualityExpression();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getBitwiseAndExpressionRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"operand",
+                    	      								lv_operand_5_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.EqualityExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop552;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBitwiseAndExpression"
+
+
+    // $ANTLR start "entryRuleEqualityExpression"
+    // InternalFormalML.g:24987:1: entryRuleEqualityExpression returns [EObject current=null] : iv_ruleEqualityExpression= ruleEqualityExpression EOF ;
+    public final EObject entryRuleEqualityExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEqualityExpression = null;
+
+
+        try {
+            // InternalFormalML.g:24987:59: (iv_ruleEqualityExpression= ruleEqualityExpression EOF )
+            // InternalFormalML.g:24988:2: iv_ruleEqualityExpression= ruleEqualityExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEqualityExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEqualityExpression=ruleEqualityExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEqualityExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEqualityExpression"
+
+
+    // $ANTLR start "ruleEqualityExpression"
+    // InternalFormalML.g:24994:1: ruleEqualityExpression returns [EObject current=null] : (this_RelationalExpression_0= ruleRelationalExpression ( () ( (lv_operator_2_0= ruleEqualityOperator ) ) ( (lv_rigthOperand_3_0= ruleRelationalExpression ) ) )? ) ;
+    public final EObject ruleEqualityExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_RelationalExpression_0 = null;
+
+        AntlrDatatypeRuleToken lv_operator_2_0 = null;
+
+        EObject lv_rigthOperand_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25000:2: ( (this_RelationalExpression_0= ruleRelationalExpression ( () ( (lv_operator_2_0= ruleEqualityOperator ) ) ( (lv_rigthOperand_3_0= ruleRelationalExpression ) ) )? ) )
+            // InternalFormalML.g:25001:2: (this_RelationalExpression_0= ruleRelationalExpression ( () ( (lv_operator_2_0= ruleEqualityOperator ) ) ( (lv_rigthOperand_3_0= ruleRelationalExpression ) ) )? )
+            {
+            // InternalFormalML.g:25001:2: (this_RelationalExpression_0= ruleRelationalExpression ( () ( (lv_operator_2_0= ruleEqualityOperator ) ) ( (lv_rigthOperand_3_0= ruleRelationalExpression ) ) )? )
+            // InternalFormalML.g:25002:3: this_RelationalExpression_0= ruleRelationalExpression ( () ( (lv_operator_2_0= ruleEqualityOperator ) ) ( (lv_rigthOperand_3_0= ruleRelationalExpression ) ) )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRelationalExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_234);
+            this_RelationalExpression_0=ruleRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_RelationalExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:25013:3: ( () ( (lv_operator_2_0= ruleEqualityOperator ) ) ( (lv_rigthOperand_3_0= ruleRelationalExpression ) ) )?
+            int alt554=2;
+            int LA554_0 = input.LA(1);
+
+            if ( ((LA554_0>=205 && LA554_0<=209)) ) {
+                alt554=1;
+            }
+            switch (alt554) {
+                case 1 :
+                    // InternalFormalML.g:25014:4: () ( (lv_operator_2_0= ruleEqualityOperator ) ) ( (lv_rigthOperand_3_0= ruleRelationalExpression ) )
+                    {
+                    // InternalFormalML.g:25014:4: ()
+                    // InternalFormalML.g:25015:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndSet(
+                      						grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:25024:4: ( (lv_operator_2_0= ruleEqualityOperator ) )
+                    // InternalFormalML.g:25025:5: (lv_operator_2_0= ruleEqualityOperator )
+                    {
+                    // InternalFormalML.g:25025:5: (lv_operator_2_0= ruleEqualityOperator )
+                    // InternalFormalML.g:25026:6: lv_operator_2_0= ruleEqualityOperator
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getEqualityExpressionAccess().getOperatorEqualityOperatorParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_13);
+                    lv_operator_2_0=ruleEqualityOperator();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"operator",
+                      							lv_operator_2_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.EqualityOperator");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:25043:4: ( (lv_rigthOperand_3_0= ruleRelationalExpression ) )
+                    // InternalFormalML.g:25044:5: (lv_rigthOperand_3_0= ruleRelationalExpression )
+                    {
+                    // InternalFormalML.g:25044:5: (lv_rigthOperand_3_0= ruleRelationalExpression )
+                    // InternalFormalML.g:25045:6: lv_rigthOperand_3_0= ruleRelationalExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getEqualityExpressionAccess().getRigthOperandRelationalExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_rigthOperand_3_0=ruleRelationalExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getEqualityExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"rigthOperand",
+                      							lv_rigthOperand_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.RelationalExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEqualityExpression"
+
+
+    // $ANTLR start "entryRuleEqualityOperator"
+    // InternalFormalML.g:25067:1: entryRuleEqualityOperator returns [String current=null] : iv_ruleEqualityOperator= ruleEqualityOperator EOF ;
+    public final String entryRuleEqualityOperator() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleEqualityOperator = null;
+
+
+        try {
+            // InternalFormalML.g:25067:56: (iv_ruleEqualityOperator= ruleEqualityOperator EOF )
+            // InternalFormalML.g:25068:2: iv_ruleEqualityOperator= ruleEqualityOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEqualityOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleEqualityOperator=ruleEqualityOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEqualityOperator.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEqualityOperator"
+
+
+    // $ANTLR start "ruleEqualityOperator"
+    // InternalFormalML.g:25074:1: ruleEqualityOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '=!=' | kw= '=/=' ) ;
+    public final AntlrDatatypeRuleToken ruleEqualityOperator() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25080:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '=!=' | kw= '=/=' ) )
+            // InternalFormalML.g:25081:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '=!=' | kw= '=/=' )
+            {
+            // InternalFormalML.g:25081:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '=!=' | kw= '=/=' )
+            int alt555=5;
+            switch ( input.LA(1) ) {
+            case 205:
+                {
+                alt555=1;
+                }
+                break;
+            case 206:
+                {
+                alt555=2;
+                }
+                break;
+            case 207:
+                {
+                alt555=3;
+                }
+                break;
+            case 208:
+                {
+                alt555=4;
+                }
+                break;
+            case 209:
+                {
+                alt555=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 555, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt555) {
+                case 1 :
+                    // InternalFormalML.g:25082:3: kw= '=='
+                    {
+                    kw=(Token)match(input,205,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:25088:3: kw= '!='
+                    {
+                    kw=(Token)match(input,206,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getExclamationMarkEqualsSignKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:25094:3: kw= '==='
+                    {
+                    kw=(Token)match(input,207,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:25100:3: kw= '=!='
+                    {
+                    kw=(Token)match(input,208,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignExclamationMarkEqualsSignKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:25106:3: kw= '=/='
+                    {
+                    kw=(Token)match(input,209,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getEqualityOperatorAccess().getEqualsSignSolidusEqualsSignKeyword_4());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEqualityOperator"
+
+
+    // $ANTLR start "entryRuleRelationalExpression"
+    // InternalFormalML.g:25115:1: entryRuleRelationalExpression returns [EObject current=null] : iv_ruleRelationalExpression= ruleRelationalExpression EOF ;
+    public final EObject entryRuleRelationalExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleRelationalExpression = null;
+
+
+        try {
+            // InternalFormalML.g:25115:61: (iv_ruleRelationalExpression= ruleRelationalExpression EOF )
+            // InternalFormalML.g:25116:2: iv_ruleRelationalExpression= ruleRelationalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getRelationalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleRelationalExpression=ruleRelationalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleRelationalExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleRelationalExpression"
+
+
+    // $ANTLR start "ruleRelationalExpression"
+    // InternalFormalML.g:25122:1: ruleRelationalExpression returns [EObject current=null] : (this_AdditiveExpression_0= ruleAdditiveExpression ( () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )? )? ) ;
+    public final EObject ruleRelationalExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_AdditiveExpression_0 = null;
+
+        AntlrDatatypeRuleToken lv_operator_2_0 = null;
+
+        EObject lv_rigthOperand_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_rigthOperator_5_0 = null;
+
+        EObject lv_rigthOperand_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25128:2: ( (this_AdditiveExpression_0= ruleAdditiveExpression ( () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )? )? ) )
+            // InternalFormalML.g:25129:2: (this_AdditiveExpression_0= ruleAdditiveExpression ( () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )? )? )
+            {
+            // InternalFormalML.g:25129:2: (this_AdditiveExpression_0= ruleAdditiveExpression ( () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )? )? )
+            // InternalFormalML.g:25130:3: this_AdditiveExpression_0= ruleAdditiveExpression ( () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )? )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getRelationalExpressionAccess().getAdditiveExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_235);
+            this_AdditiveExpression_0=ruleAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_AdditiveExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:25141:3: ( () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )? )?
+            int alt557=2;
+            alt557 = dfa557.predict(input);
+            switch (alt557) {
+                case 1 :
+                    // InternalFormalML.g:25142:4: () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )?
+                    {
+                    // InternalFormalML.g:25142:4: ()
+                    // InternalFormalML.g:25143:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndSet(
+                      						grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:25152:4: ( (lv_operator_2_0= ruleRelationalOperator ) )
+                    // InternalFormalML.g:25153:5: (lv_operator_2_0= ruleRelationalOperator )
+                    {
+                    // InternalFormalML.g:25153:5: (lv_operator_2_0= ruleRelationalOperator )
+                    // InternalFormalML.g:25154:6: lv_operator_2_0= ruleRelationalOperator
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_13);
+                    lv_operator_2_0=ruleRelationalOperator();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"operator",
+                      							lv_operator_2_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.RelationalOperator");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:25171:4: ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) )
+                    // InternalFormalML.g:25172:5: (lv_rigthOperand_3_0= ruleAdditiveExpression )
+                    {
+                    // InternalFormalML.g:25172:5: (lv_rigthOperand_3_0= ruleAdditiveExpression )
+                    // InternalFormalML.g:25173:6: lv_rigthOperand_3_0= ruleAdditiveExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_235);
+                    lv_rigthOperand_3_0=ruleAdditiveExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"rigthOperand",
+                      							lv_rigthOperand_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.AdditiveExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:25190:4: ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )?
+                    int alt556=2;
+                    alt556 = dfa556.predict(input);
+                    switch (alt556) {
+                        case 1 :
+                            // InternalFormalML.g:25191:5: () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) )
+                            {
+                            // InternalFormalML.g:25191:5: ()
+                            // InternalFormalML.g:25192:6: 
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              						/* */
+                              					
+                            }
+                            if ( state.backtracking==0 ) {
+
+                              						current = forceCreateModelElementAndSet(
+                              							grammarAccess.getRelationalExpressionAccess().getRelationalTernaryExpressionLeftRelationAction_1_3_0(),
+                              							current);
+                              					
+                            }
+
+                            }
+
+                            // InternalFormalML.g:25201:5: ( (lv_rigthOperator_5_0= ruleRelationalOperator ) )
+                            // InternalFormalML.g:25202:6: (lv_rigthOperator_5_0= ruleRelationalOperator )
+                            {
+                            // InternalFormalML.g:25202:6: (lv_rigthOperator_5_0= ruleRelationalOperator )
+                            // InternalFormalML.g:25203:7: lv_rigthOperator_5_0= ruleRelationalOperator
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_13);
+                            lv_rigthOperator_5_0=ruleRelationalOperator();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+                              							}
+                              							set(
+                              								current,
+                              								"rigthOperator",
+                              								lv_rigthOperator_5_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.RelationalOperator");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalFormalML.g:25220:5: ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) )
+                            // InternalFormalML.g:25221:6: (lv_rigthOperand_6_0= ruleAdditiveExpression )
+                            {
+                            // InternalFormalML.g:25221:6: (lv_rigthOperand_6_0= ruleAdditiveExpression )
+                            // InternalFormalML.g:25222:7: lv_rigthOperand_6_0= ruleAdditiveExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_2);
+                            lv_rigthOperand_6_0=ruleAdditiveExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getRelationalExpressionRule());
+                              							}
+                              							set(
+                              								current,
+                              								"rigthOperand",
+                              								lv_rigthOperand_6_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.AdditiveExpression");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleRelationalExpression"
+
+
+    // $ANTLR start "entryRuleRelationalOperator"
+    // InternalFormalML.g:25245:1: entryRuleRelationalOperator returns [String current=null] : iv_ruleRelationalOperator= ruleRelationalOperator EOF ;
+    public final String entryRuleRelationalOperator() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleRelationalOperator = null;
+
+
+        try {
+            // InternalFormalML.g:25245:58: (iv_ruleRelationalOperator= ruleRelationalOperator EOF )
+            // InternalFormalML.g:25246:2: iv_ruleRelationalOperator= ruleRelationalOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getRelationalOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleRelationalOperator=ruleRelationalOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleRelationalOperator.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleRelationalOperator"
+
+
+    // $ANTLR start "ruleRelationalOperator"
+    // InternalFormalML.g:25252:1: ruleRelationalOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '<' | kw= '>' | kw= '<=' | kw= '>=' ) ;
+    public final AntlrDatatypeRuleToken ruleRelationalOperator() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25258:2: ( (kw= '<' | kw= '>' | kw= '<=' | kw= '>=' ) )
+            // InternalFormalML.g:25259:2: (kw= '<' | kw= '>' | kw= '<=' | kw= '>=' )
+            {
+            // InternalFormalML.g:25259:2: (kw= '<' | kw= '>' | kw= '<=' | kw= '>=' )
+            int alt558=4;
+            switch ( input.LA(1) ) {
+            case 16:
+                {
+                alt558=1;
+                }
+                break;
+            case 37:
+                {
+                alt558=2;
+                }
+                break;
+            case 210:
+                {
+                alt558=3;
+                }
+                break;
+            case 211:
+                {
+                alt558=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 558, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt558) {
+                case 1 :
+                    // InternalFormalML.g:25260:3: kw= '<'
+                    {
+                    kw=(Token)match(input,16,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getLessThanSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:25266:3: kw= '>'
+                    {
+                    kw=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getGreaterThanSignKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:25272:3: kw= '<='
+                    {
+                    kw=(Token)match(input,210,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getLessThanSignEqualsSignKeyword_2());
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:25278:3: kw= '>='
+                    {
+                    kw=(Token)match(input,211,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getRelationalOperatorAccess().getGreaterThanSignEqualsSignKeyword_3());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleRelationalOperator"
+
+
+    // $ANTLR start "entryRuleAdditiveExpression"
+    // InternalFormalML.g:25287:1: entryRuleAdditiveExpression returns [EObject current=null] : iv_ruleAdditiveExpression= ruleAdditiveExpression EOF ;
+    public final EObject entryRuleAdditiveExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleAdditiveExpression = null;
+
+
+        try {
+            // InternalFormalML.g:25287:59: (iv_ruleAdditiveExpression= ruleAdditiveExpression EOF )
+            // InternalFormalML.g:25288:2: iv_ruleAdditiveExpression= ruleAdditiveExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getAdditiveExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleAdditiveExpression=ruleAdditiveExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleAdditiveExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleAdditiveExpression"
+
+
+    // $ANTLR start "ruleAdditiveExpression"
+    // InternalFormalML.g:25294:1: ruleAdditiveExpression returns [EObject current=null] : (this_MultiplicativeExpression_0= ruleMultiplicativeExpression ( ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* ) | ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* ) )* ) ;
+    public final EObject ruleAdditiveExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        Token lv_operator_7_0=null;
+        Token otherlv_9=null;
+        EObject this_MultiplicativeExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+        EObject lv_operand_8_0 = null;
+
+        EObject lv_operand_10_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25300:2: ( (this_MultiplicativeExpression_0= ruleMultiplicativeExpression ( ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* ) | ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* ) )* ) )
+            // InternalFormalML.g:25301:2: (this_MultiplicativeExpression_0= ruleMultiplicativeExpression ( ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* ) | ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* ) )* )
+            {
+            // InternalFormalML.g:25301:2: (this_MultiplicativeExpression_0= ruleMultiplicativeExpression ( ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* ) | ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* ) )* )
+            // InternalFormalML.g:25302:3: this_MultiplicativeExpression_0= ruleMultiplicativeExpression ( ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* ) | ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getMultiplicativeExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_236);
+            this_MultiplicativeExpression_0=ruleMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_MultiplicativeExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:25313:3: ( ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* ) | ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* ) )*
+            loop561:
+            do {
+                int alt561=3;
+                alt561 = dfa561.predict(input);
+                switch (alt561) {
+            	case 1 :
+            	    // InternalFormalML.g:25314:4: ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* )
+            	    {
+            	    // InternalFormalML.g:25314:4: ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* )
+            	    // InternalFormalML.g:25315:5: () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )*
+            	    {
+            	    // InternalFormalML.g:25315:5: ()
+            	    // InternalFormalML.g:25316:6: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						/* */
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						current = forceCreateModelElementAndAdd(
+            	      							grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0(),
+            	      							current);
+            	      					
+            	    }
+
+            	    }
+
+            	    // InternalFormalML.g:25325:5: ( (lv_operator_2_0= '+' ) )
+            	    // InternalFormalML.g:25326:6: (lv_operator_2_0= '+' )
+            	    {
+            	    // InternalFormalML.g:25326:6: (lv_operator_2_0= '+' )
+            	    // InternalFormalML.g:25327:7: lv_operator_2_0= '+'
+            	    {
+            	    lv_operator_2_0=(Token)match(input,212,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							newLeafNode(lv_operator_2_0, grammarAccess.getAdditiveExpressionAccess().getOperatorPlusSignKeyword_1_0_1_0());
+            	      						
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElement(grammarAccess.getAdditiveExpressionRule());
+            	      							}
+            	      							setWithLastConsumed(current, "operator", lv_operator_2_0, "+");
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25339:5: ( (lv_operand_3_0= ruleMultiplicativeExpression ) )
+            	    // InternalFormalML.g:25340:6: (lv_operand_3_0= ruleMultiplicativeExpression )
+            	    {
+            	    // InternalFormalML.g:25340:6: (lv_operand_3_0= ruleMultiplicativeExpression )
+            	    // InternalFormalML.g:25341:7: lv_operand_3_0= ruleMultiplicativeExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0());
+            	      						
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_236);
+            	    lv_operand_3_0=ruleMultiplicativeExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+            	      							}
+            	      							add(
+            	      								current,
+            	      								"operand",
+            	      								lv_operand_3_0,
+            	      								"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25358:5: (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )*
+            	    loop559:
+            	    do {
+            	        int alt559=2;
+            	        alt559 = dfa559.predict(input);
+            	        switch (alt559) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:25359:6: otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) )
+            	    	    {
+            	    	    otherlv_4=(Token)match(input,212,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      						newLeafNode(otherlv_4, grammarAccess.getAdditiveExpressionAccess().getPlusSignKeyword_1_0_3_0());
+            	    	      					
+            	    	    }
+            	    	    // InternalFormalML.g:25363:6: ( (lv_operand_5_0= ruleMultiplicativeExpression ) )
+            	    	    // InternalFormalML.g:25364:7: (lv_operand_5_0= ruleMultiplicativeExpression )
+            	    	    {
+            	    	    // InternalFormalML.g:25364:7: (lv_operand_5_0= ruleMultiplicativeExpression )
+            	    	    // InternalFormalML.g:25365:8: lv_operand_5_0= ruleMultiplicativeExpression
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_236);
+            	    	    lv_operand_5_0=ruleMultiplicativeExpression();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"operand",
+            	    	      									lv_operand_5_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop559;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:25385:4: ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* )
+            	    {
+            	    // InternalFormalML.g:25385:4: ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* )
+            	    // InternalFormalML.g:25386:5: () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )*
+            	    {
+            	    // InternalFormalML.g:25386:5: ()
+            	    // InternalFormalML.g:25387:6: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						/* */
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						current = forceCreateModelElementAndAdd(
+            	      							grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0(),
+            	      							current);
+            	      					
+            	    }
+
+            	    }
+
+            	    // InternalFormalML.g:25396:5: ( (lv_operator_7_0= '-' ) )
+            	    // InternalFormalML.g:25397:6: (lv_operator_7_0= '-' )
+            	    {
+            	    // InternalFormalML.g:25397:6: (lv_operator_7_0= '-' )
+            	    // InternalFormalML.g:25398:7: lv_operator_7_0= '-'
+            	    {
+            	    lv_operator_7_0=(Token)match(input,28,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							newLeafNode(lv_operator_7_0, grammarAccess.getAdditiveExpressionAccess().getOperatorHyphenMinusKeyword_1_1_1_0());
+            	      						
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElement(grammarAccess.getAdditiveExpressionRule());
+            	      							}
+            	      							setWithLastConsumed(current, "operator", lv_operator_7_0, "-");
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25410:5: ( (lv_operand_8_0= ruleMultiplicativeExpression ) )
+            	    // InternalFormalML.g:25411:6: (lv_operand_8_0= ruleMultiplicativeExpression )
+            	    {
+            	    // InternalFormalML.g:25411:6: (lv_operand_8_0= ruleMultiplicativeExpression )
+            	    // InternalFormalML.g:25412:7: lv_operand_8_0= ruleMultiplicativeExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0());
+            	      						
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_236);
+            	    lv_operand_8_0=ruleMultiplicativeExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+            	      							}
+            	      							add(
+            	      								current,
+            	      								"operand",
+            	      								lv_operand_8_0,
+            	      								"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25429:5: (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )*
+            	    loop560:
+            	    do {
+            	        int alt560=2;
+            	        alt560 = dfa560.predict(input);
+            	        switch (alt560) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:25430:6: otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) )
+            	    	    {
+            	    	    otherlv_9=(Token)match(input,28,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      						newLeafNode(otherlv_9, grammarAccess.getAdditiveExpressionAccess().getHyphenMinusKeyword_1_1_3_0());
+            	    	      					
+            	    	    }
+            	    	    // InternalFormalML.g:25434:6: ( (lv_operand_10_0= ruleMultiplicativeExpression ) )
+            	    	    // InternalFormalML.g:25435:7: (lv_operand_10_0= ruleMultiplicativeExpression )
+            	    	    {
+            	    	    // InternalFormalML.g:25435:7: (lv_operand_10_0= ruleMultiplicativeExpression )
+            	    	    // InternalFormalML.g:25436:8: lv_operand_10_0= ruleMultiplicativeExpression
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_236);
+            	    	    lv_operand_10_0=ruleMultiplicativeExpression();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getAdditiveExpressionRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"operand",
+            	    	      									lv_operand_10_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop560;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop561;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleAdditiveExpression"
+
+
+    // $ANTLR start "entryRuleMultiplicativeExpression"
+    // InternalFormalML.g:25460:1: entryRuleMultiplicativeExpression returns [EObject current=null] : iv_ruleMultiplicativeExpression= ruleMultiplicativeExpression EOF ;
+    public final EObject entryRuleMultiplicativeExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleMultiplicativeExpression = null;
+
+
+        try {
+            // InternalFormalML.g:25460:65: (iv_ruleMultiplicativeExpression= ruleMultiplicativeExpression EOF )
+            // InternalFormalML.g:25461:2: iv_ruleMultiplicativeExpression= ruleMultiplicativeExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMultiplicativeExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleMultiplicativeExpression=ruleMultiplicativeExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleMultiplicativeExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleMultiplicativeExpression"
+
+
+    // $ANTLR start "ruleMultiplicativeExpression"
+    // InternalFormalML.g:25467:1: ruleMultiplicativeExpression returns [EObject current=null] : (this_UnaryExpression_0= ruleUnaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleUnaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleUnaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleUnaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleUnaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )* ) )* ) ;
+    public final EObject ruleMultiplicativeExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        Token lv_operator_7_0=null;
+        Token otherlv_9=null;
+        Token lv_operator_12_0=null;
+        Token otherlv_14=null;
+        Token lv_operator_17_0=null;
+        Token otherlv_19=null;
+        EObject this_UnaryExpression_0 = null;
+
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+        EObject lv_operand_8_0 = null;
+
+        EObject lv_operand_10_0 = null;
+
+        EObject lv_operand_13_0 = null;
+
+        EObject lv_operand_15_0 = null;
+
+        EObject lv_operand_18_0 = null;
+
+        EObject lv_operand_20_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25473:2: ( (this_UnaryExpression_0= ruleUnaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleUnaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleUnaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleUnaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleUnaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )* ) )* ) )
+            // InternalFormalML.g:25474:2: (this_UnaryExpression_0= ruleUnaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleUnaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleUnaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleUnaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleUnaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )* ) )* )
+            {
+            // InternalFormalML.g:25474:2: (this_UnaryExpression_0= ruleUnaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleUnaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleUnaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleUnaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleUnaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )* ) )* )
+            // InternalFormalML.g:25475:3: this_UnaryExpression_0= ruleUnaryExpression ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleUnaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleUnaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleUnaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleUnaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )* ) )*
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getUnaryExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_237);
+            this_UnaryExpression_0=ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_UnaryExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:25486:3: ( ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleUnaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleUnaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleUnaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )* ) | ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleUnaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )* ) )*
+            loop566:
+            do {
+                int alt566=5;
+                switch ( input.LA(1) ) {
+                case 98:
+                    {
+                    alt566=1;
+                    }
+                    break;
+                case 213:
+                    {
+                    alt566=2;
+                    }
+                    break;
+                case 214:
+                    {
+                    alt566=3;
+                    }
+                    break;
+                case 215:
+                    {
+                    alt566=4;
+                    }
+                    break;
+
+                }
+
+                switch (alt566) {
+            	case 1 :
+            	    // InternalFormalML.g:25487:4: ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleUnaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )* )
+            	    {
+            	    // InternalFormalML.g:25487:4: ( () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleUnaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )* )
+            	    // InternalFormalML.g:25488:5: () ( (lv_operator_2_0= '*' ) ) ( (lv_operand_3_0= ruleUnaryExpression ) ) (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )*
+            	    {
+            	    // InternalFormalML.g:25488:5: ()
+            	    // InternalFormalML.g:25489:6: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						/* */
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						current = forceCreateModelElementAndAdd(
+            	      							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0(),
+            	      							current);
+            	      					
+            	    }
+
+            	    }
+
+            	    // InternalFormalML.g:25498:5: ( (lv_operator_2_0= '*' ) )
+            	    // InternalFormalML.g:25499:6: (lv_operator_2_0= '*' )
+            	    {
+            	    // InternalFormalML.g:25499:6: (lv_operator_2_0= '*' )
+            	    // InternalFormalML.g:25500:7: lv_operator_2_0= '*'
+            	    {
+            	    lv_operator_2_0=(Token)match(input,98,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							newLeafNode(lv_operator_2_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskKeyword_1_0_1_0());
+            	      						
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+            	      							}
+            	      							setWithLastConsumed(current, "operator", lv_operator_2_0, "*");
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25512:5: ( (lv_operand_3_0= ruleUnaryExpression ) )
+            	    // InternalFormalML.g:25513:6: (lv_operand_3_0= ruleUnaryExpression )
+            	    {
+            	    // InternalFormalML.g:25513:6: (lv_operand_3_0= ruleUnaryExpression )
+            	    // InternalFormalML.g:25514:7: lv_operand_3_0= ruleUnaryExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_2_0());
+            	      						
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_237);
+            	    lv_operand_3_0=ruleUnaryExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+            	      							}
+            	      							add(
+            	      								current,
+            	      								"operand",
+            	      								lv_operand_3_0,
+            	      								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25531:5: (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )*
+            	    loop562:
+            	    do {
+            	        int alt562=2;
+            	        alt562 = dfa562.predict(input);
+            	        switch (alt562) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:25532:6: otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) )
+            	    	    {
+            	    	    otherlv_4=(Token)match(input,98,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      						newLeafNode(otherlv_4, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskKeyword_1_0_3_0());
+            	    	      					
+            	    	    }
+            	    	    // InternalFormalML.g:25536:6: ( (lv_operand_5_0= ruleUnaryExpression ) )
+            	    	    // InternalFormalML.g:25537:7: (lv_operand_5_0= ruleUnaryExpression )
+            	    	    {
+            	    	    // InternalFormalML.g:25537:7: (lv_operand_5_0= ruleUnaryExpression )
+            	    	    // InternalFormalML.g:25538:8: lv_operand_5_0= ruleUnaryExpression
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_3_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_237);
+            	    	    lv_operand_5_0=ruleUnaryExpression();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"operand",
+            	    	      									lv_operand_5_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop562;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalFormalML.g:25558:4: ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleUnaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )* )
+            	    {
+            	    // InternalFormalML.g:25558:4: ( () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleUnaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )* )
+            	    // InternalFormalML.g:25559:5: () ( (lv_operator_7_0= '**' ) ) ( (lv_operand_8_0= ruleUnaryExpression ) ) (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )*
+            	    {
+            	    // InternalFormalML.g:25559:5: ()
+            	    // InternalFormalML.g:25560:6: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						/* */
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						current = forceCreateModelElementAndAdd(
+            	      							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0(),
+            	      							current);
+            	      					
+            	    }
+
+            	    }
+
+            	    // InternalFormalML.g:25569:5: ( (lv_operator_7_0= '**' ) )
+            	    // InternalFormalML.g:25570:6: (lv_operator_7_0= '**' )
+            	    {
+            	    // InternalFormalML.g:25570:6: (lv_operator_7_0= '**' )
+            	    // InternalFormalML.g:25571:7: lv_operator_7_0= '**'
+            	    {
+            	    lv_operator_7_0=(Token)match(input,213,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							newLeafNode(lv_operator_7_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorAsteriskAsteriskKeyword_1_1_1_0());
+            	      						
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+            	      							}
+            	      							setWithLastConsumed(current, "operator", lv_operator_7_0, "**");
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25583:5: ( (lv_operand_8_0= ruleUnaryExpression ) )
+            	    // InternalFormalML.g:25584:6: (lv_operand_8_0= ruleUnaryExpression )
+            	    {
+            	    // InternalFormalML.g:25584:6: (lv_operand_8_0= ruleUnaryExpression )
+            	    // InternalFormalML.g:25585:7: lv_operand_8_0= ruleUnaryExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_2_0());
+            	      						
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_237);
+            	    lv_operand_8_0=ruleUnaryExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+            	      							}
+            	      							add(
+            	      								current,
+            	      								"operand",
+            	      								lv_operand_8_0,
+            	      								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25602:5: (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )*
+            	    loop563:
+            	    do {
+            	        int alt563=2;
+            	        alt563 = dfa563.predict(input);
+            	        switch (alt563) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:25603:6: otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) )
+            	    	    {
+            	    	    otherlv_9=(Token)match(input,213,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      						newLeafNode(otherlv_9, grammarAccess.getMultiplicativeExpressionAccess().getAsteriskAsteriskKeyword_1_1_3_0());
+            	    	      					
+            	    	    }
+            	    	    // InternalFormalML.g:25607:6: ( (lv_operand_10_0= ruleUnaryExpression ) )
+            	    	    // InternalFormalML.g:25608:7: (lv_operand_10_0= ruleUnaryExpression )
+            	    	    {
+            	    	    // InternalFormalML.g:25608:7: (lv_operand_10_0= ruleUnaryExpression )
+            	    	    // InternalFormalML.g:25609:8: lv_operand_10_0= ruleUnaryExpression
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_3_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_237);
+            	    	    lv_operand_10_0=ruleUnaryExpression();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"operand",
+            	    	      									lv_operand_10_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop563;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 3 :
+            	    // InternalFormalML.g:25629:4: ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleUnaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )* )
+            	    {
+            	    // InternalFormalML.g:25629:4: ( () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleUnaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )* )
+            	    // InternalFormalML.g:25630:5: () ( (lv_operator_12_0= '/' ) ) ( (lv_operand_13_0= ruleUnaryExpression ) ) (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )*
+            	    {
+            	    // InternalFormalML.g:25630:5: ()
+            	    // InternalFormalML.g:25631:6: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						/* */
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						current = forceCreateModelElementAndAdd(
+            	      							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0(),
+            	      							current);
+            	      					
+            	    }
+
+            	    }
+
+            	    // InternalFormalML.g:25640:5: ( (lv_operator_12_0= '/' ) )
+            	    // InternalFormalML.g:25641:6: (lv_operator_12_0= '/' )
+            	    {
+            	    // InternalFormalML.g:25641:6: (lv_operator_12_0= '/' )
+            	    // InternalFormalML.g:25642:7: lv_operator_12_0= '/'
+            	    {
+            	    lv_operator_12_0=(Token)match(input,214,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							newLeafNode(lv_operator_12_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorSolidusKeyword_1_2_1_0());
+            	      						
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+            	      							}
+            	      							setWithLastConsumed(current, "operator", lv_operator_12_0, "/");
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25654:5: ( (lv_operand_13_0= ruleUnaryExpression ) )
+            	    // InternalFormalML.g:25655:6: (lv_operand_13_0= ruleUnaryExpression )
+            	    {
+            	    // InternalFormalML.g:25655:6: (lv_operand_13_0= ruleUnaryExpression )
+            	    // InternalFormalML.g:25656:7: lv_operand_13_0= ruleUnaryExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_2_0());
+            	      						
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_237);
+            	    lv_operand_13_0=ruleUnaryExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+            	      							}
+            	      							add(
+            	      								current,
+            	      								"operand",
+            	      								lv_operand_13_0,
+            	      								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25673:5: (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )*
+            	    loop564:
+            	    do {
+            	        int alt564=2;
+            	        alt564 = dfa564.predict(input);
+            	        switch (alt564) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:25674:6: otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) )
+            	    	    {
+            	    	    otherlv_14=(Token)match(input,214,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      						newLeafNode(otherlv_14, grammarAccess.getMultiplicativeExpressionAccess().getSolidusKeyword_1_2_3_0());
+            	    	      					
+            	    	    }
+            	    	    // InternalFormalML.g:25678:6: ( (lv_operand_15_0= ruleUnaryExpression ) )
+            	    	    // InternalFormalML.g:25679:7: (lv_operand_15_0= ruleUnaryExpression )
+            	    	    {
+            	    	    // InternalFormalML.g:25679:7: (lv_operand_15_0= ruleUnaryExpression )
+            	    	    // InternalFormalML.g:25680:8: lv_operand_15_0= ruleUnaryExpression
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_3_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_237);
+            	    	    lv_operand_15_0=ruleUnaryExpression();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"operand",
+            	    	      									lv_operand_15_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop564;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 4 :
+            	    // InternalFormalML.g:25700:4: ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleUnaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )* )
+            	    {
+            	    // InternalFormalML.g:25700:4: ( () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleUnaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )* )
+            	    // InternalFormalML.g:25701:5: () ( (lv_operator_17_0= '%' ) ) ( (lv_operand_18_0= ruleUnaryExpression ) ) (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )*
+            	    {
+            	    // InternalFormalML.g:25701:5: ()
+            	    // InternalFormalML.g:25702:6: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						/* */
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						current = forceCreateModelElementAndAdd(
+            	      							grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0(),
+            	      							current);
+            	      					
+            	    }
+
+            	    }
+
+            	    // InternalFormalML.g:25711:5: ( (lv_operator_17_0= '%' ) )
+            	    // InternalFormalML.g:25712:6: (lv_operator_17_0= '%' )
+            	    {
+            	    // InternalFormalML.g:25712:6: (lv_operator_17_0= '%' )
+            	    // InternalFormalML.g:25713:7: lv_operator_17_0= '%'
+            	    {
+            	    lv_operator_17_0=(Token)match(input,215,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							newLeafNode(lv_operator_17_0, grammarAccess.getMultiplicativeExpressionAccess().getOperatorPercentSignKeyword_1_3_1_0());
+            	      						
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElement(grammarAccess.getMultiplicativeExpressionRule());
+            	      							}
+            	      							setWithLastConsumed(current, "operator", lv_operator_17_0, "%");
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25725:5: ( (lv_operand_18_0= ruleUnaryExpression ) )
+            	    // InternalFormalML.g:25726:6: (lv_operand_18_0= ruleUnaryExpression )
+            	    {
+            	    // InternalFormalML.g:25726:6: (lv_operand_18_0= ruleUnaryExpression )
+            	    // InternalFormalML.g:25727:7: lv_operand_18_0= ruleUnaryExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      							newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_2_0());
+            	      						
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_237);
+            	    lv_operand_18_0=ruleUnaryExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      							if (current==null) {
+            	      								current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+            	      							}
+            	      							add(
+            	      								current,
+            	      								"operand",
+            	      								lv_operand_18_0,
+            	      								"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+            	      							afterParserOrEnumRuleCall();
+            	      						
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:25744:5: (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )*
+            	    loop565:
+            	    do {
+            	        int alt565=2;
+            	        alt565 = dfa565.predict(input);
+            	        switch (alt565) {
+            	    	case 1 :
+            	    	    // InternalFormalML.g:25745:6: otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) )
+            	    	    {
+            	    	    otherlv_19=(Token)match(input,215,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      						newLeafNode(otherlv_19, grammarAccess.getMultiplicativeExpressionAccess().getPercentSignKeyword_1_3_3_0());
+            	    	      					
+            	    	    }
+            	    	    // InternalFormalML.g:25749:6: ( (lv_operand_20_0= ruleUnaryExpression ) )
+            	    	    // InternalFormalML.g:25750:7: (lv_operand_20_0= ruleUnaryExpression )
+            	    	    {
+            	    	    // InternalFormalML.g:25750:7: (lv_operand_20_0= ruleUnaryExpression )
+            	    	    // InternalFormalML.g:25751:8: lv_operand_20_0= ruleUnaryExpression
+            	    	    {
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_3_1_0());
+            	    	      							
+            	    	    }
+            	    	    pushFollow(FollowSets000.FOLLOW_237);
+            	    	    lv_operand_20_0=ruleUnaryExpression();
+
+            	    	    state._fsp--;
+            	    	    if (state.failed) return current;
+            	    	    if ( state.backtracking==0 ) {
+
+            	    	      								if (current==null) {
+            	    	      									current = createModelElementForParent(grammarAccess.getMultiplicativeExpressionRule());
+            	    	      								}
+            	    	      								add(
+            	    	      									current,
+            	    	      									"operand",
+            	    	      									lv_operand_20_0,
+            	    	      									"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+            	    	      								afterParserOrEnumRuleCall();
+            	    	      							
+            	    	    }
+
+            	    	    }
+
+
+            	    	    }
+
+
+            	    	    }
+            	    	    break;
+
+            	    	default :
+            	    	    break loop565;
+            	        }
+            	    } while (true);
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop566;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleMultiplicativeExpression"
+
+
+    // $ANTLR start "entryRuleUnaryExpression"
+    // InternalFormalML.g:25775:1: entryRuleUnaryExpression returns [EObject current=null] : iv_ruleUnaryExpression= ruleUnaryExpression EOF ;
+    public final EObject entryRuleUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleUnaryExpression = null;
+
+
+        try {
+            // InternalFormalML.g:25775:56: (iv_ruleUnaryExpression= ruleUnaryExpression EOF )
+            // InternalFormalML.g:25776:2: iv_ruleUnaryExpression= ruleUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleUnaryExpression=ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleUnaryExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleUnaryExpression"
+
+
+    // $ANTLR start "ruleUnaryExpression"
+    // InternalFormalML.g:25782:1: ruleUnaryExpression returns [EObject current=null] : (this_LiteralTerminalExpression_0= ruleLiteralTerminalExpression | this_ArithmeticUnaryExpression_1= ruleArithmeticUnaryExpression | this_LogicalUnaryExpression_2= ruleLogicalUnaryExpression | this_BitwiseUnaryExpression_3= ruleBitwiseUnaryExpression | this_NewfreshExpression_4= ruleNewfreshExpression | this_CastExpression_5= ruleCastExpression | this_PrefixUnaryExpression_6= rulePrefixUnaryExpression | this_PostfixUnaryExpression_7= rulePostfixUnaryExpression | this_PrimaryExpression_8= rulePrimaryExpression ) ;
+    public final EObject ruleUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralTerminalExpression_0 = null;
+
+        EObject this_ArithmeticUnaryExpression_1 = null;
+
+        EObject this_LogicalUnaryExpression_2 = null;
+
+        EObject this_BitwiseUnaryExpression_3 = null;
+
+        EObject this_NewfreshExpression_4 = null;
+
+        EObject this_CastExpression_5 = null;
+
+        EObject this_PrefixUnaryExpression_6 = null;
+
+        EObject this_PostfixUnaryExpression_7 = null;
+
+        EObject this_PrimaryExpression_8 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25788:2: ( (this_LiteralTerminalExpression_0= ruleLiteralTerminalExpression | this_ArithmeticUnaryExpression_1= ruleArithmeticUnaryExpression | this_LogicalUnaryExpression_2= ruleLogicalUnaryExpression | this_BitwiseUnaryExpression_3= ruleBitwiseUnaryExpression | this_NewfreshExpression_4= ruleNewfreshExpression | this_CastExpression_5= ruleCastExpression | this_PrefixUnaryExpression_6= rulePrefixUnaryExpression | this_PostfixUnaryExpression_7= rulePostfixUnaryExpression | this_PrimaryExpression_8= rulePrimaryExpression ) )
+            // InternalFormalML.g:25789:2: (this_LiteralTerminalExpression_0= ruleLiteralTerminalExpression | this_ArithmeticUnaryExpression_1= ruleArithmeticUnaryExpression | this_LogicalUnaryExpression_2= ruleLogicalUnaryExpression | this_BitwiseUnaryExpression_3= ruleBitwiseUnaryExpression | this_NewfreshExpression_4= ruleNewfreshExpression | this_CastExpression_5= ruleCastExpression | this_PrefixUnaryExpression_6= rulePrefixUnaryExpression | this_PostfixUnaryExpression_7= rulePostfixUnaryExpression | this_PrimaryExpression_8= rulePrimaryExpression )
+            {
+            // InternalFormalML.g:25789:2: (this_LiteralTerminalExpression_0= ruleLiteralTerminalExpression | this_ArithmeticUnaryExpression_1= ruleArithmeticUnaryExpression | this_LogicalUnaryExpression_2= ruleLogicalUnaryExpression | this_BitwiseUnaryExpression_3= ruleBitwiseUnaryExpression | this_NewfreshExpression_4= ruleNewfreshExpression | this_CastExpression_5= ruleCastExpression | this_PrefixUnaryExpression_6= rulePrefixUnaryExpression | this_PostfixUnaryExpression_7= rulePostfixUnaryExpression | this_PrimaryExpression_8= rulePrimaryExpression )
+            int alt567=9;
+            alt567 = dfa567.predict(input);
+            switch (alt567) {
+                case 1 :
+                    // InternalFormalML.g:25790:3: this_LiteralTerminalExpression_0= ruleLiteralTerminalExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getLiteralTerminalExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralTerminalExpression_0=ruleLiteralTerminalExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralTerminalExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:25802:3: this_ArithmeticUnaryExpression_1= ruleArithmeticUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getArithmeticUnaryExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_ArithmeticUnaryExpression_1=ruleArithmeticUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_ArithmeticUnaryExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:25814:3: this_LogicalUnaryExpression_2= ruleLogicalUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getLogicalUnaryExpressionParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LogicalUnaryExpression_2=ruleLogicalUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LogicalUnaryExpression_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:25826:3: this_BitwiseUnaryExpression_3= ruleBitwiseUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getBitwiseUnaryExpressionParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_BitwiseUnaryExpression_3=ruleBitwiseUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_BitwiseUnaryExpression_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:25838:3: this_NewfreshExpression_4= ruleNewfreshExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getNewfreshExpressionParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_NewfreshExpression_4=ruleNewfreshExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_NewfreshExpression_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:25850:3: this_CastExpression_5= ruleCastExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getCastExpressionParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_CastExpression_5=ruleCastExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_CastExpression_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:25862:3: this_PrefixUnaryExpression_6= rulePrefixUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPrefixUnaryExpressionParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrefixUnaryExpression_6=rulePrefixUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrefixUnaryExpression_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:25874:3: this_PostfixUnaryExpression_7= rulePostfixUnaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPostfixUnaryExpressionParserRuleCall_7());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PostfixUnaryExpression_7=rulePostfixUnaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PostfixUnaryExpression_7;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:25886:3: this_PrimaryExpression_8= rulePrimaryExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getUnaryExpressionAccess().getPrimaryExpressionParserRuleCall_8());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_PrimaryExpression_8=rulePrimaryExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_PrimaryExpression_8;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleUnaryExpression"
+
+
+    // $ANTLR start "entryRulePostfixUnaryExpression"
+    // InternalFormalML.g:25901:1: entryRulePostfixUnaryExpression returns [EObject current=null] : iv_rulePostfixUnaryExpression= rulePostfixUnaryExpression EOF ;
+    public final EObject entryRulePostfixUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePostfixUnaryExpression = null;
+
+
+        try {
+            // InternalFormalML.g:25901:63: (iv_rulePostfixUnaryExpression= rulePostfixUnaryExpression EOF )
+            // InternalFormalML.g:25902:2: iv_rulePostfixUnaryExpression= rulePostfixUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPostfixUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePostfixUnaryExpression=rulePostfixUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePostfixUnaryExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePostfixUnaryExpression"
+
+
+    // $ANTLR start "rulePostfixUnaryExpression"
+    // InternalFormalML.g:25908:1: rulePostfixUnaryExpression returns [EObject current=null] : this_IncrementOrDecrementPostfixExpression_0= ruleIncrementOrDecrementPostfixExpression ;
+    public final EObject rulePostfixUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_IncrementOrDecrementPostfixExpression_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25914:2: (this_IncrementOrDecrementPostfixExpression_0= ruleIncrementOrDecrementPostfixExpression )
+            // InternalFormalML.g:25915:2: this_IncrementOrDecrementPostfixExpression_0= ruleIncrementOrDecrementPostfixExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              		/* */
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newCompositeNode(grammarAccess.getPostfixUnaryExpressionAccess().getIncrementOrDecrementPostfixExpressionParserRuleCall());
+              	
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            this_IncrementOrDecrementPostfixExpression_0=ruleIncrementOrDecrementPostfixExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current = this_IncrementOrDecrementPostfixExpression_0;
+              		afterParserOrEnumRuleCall();
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePostfixUnaryExpression"
+
+
+    // $ANTLR start "entryRuleIncrementOrDecrementPostfixExpression"
+    // InternalFormalML.g:25929:1: entryRuleIncrementOrDecrementPostfixExpression returns [EObject current=null] : iv_ruleIncrementOrDecrementPostfixExpression= ruleIncrementOrDecrementPostfixExpression EOF ;
+    public final EObject entryRuleIncrementOrDecrementPostfixExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleIncrementOrDecrementPostfixExpression = null;
+
+
+        try {
+            // InternalFormalML.g:25929:78: (iv_ruleIncrementOrDecrementPostfixExpression= ruleIncrementOrDecrementPostfixExpression EOF )
+            // InternalFormalML.g:25930:2: iv_ruleIncrementOrDecrementPostfixExpression= ruleIncrementOrDecrementPostfixExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getIncrementOrDecrementPostfixExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleIncrementOrDecrementPostfixExpression=ruleIncrementOrDecrementPostfixExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleIncrementOrDecrementPostfixExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleIncrementOrDecrementPostfixExpression"
+
+
+    // $ANTLR start "ruleIncrementOrDecrementPostfixExpression"
+    // InternalFormalML.g:25936:1: ruleIncrementOrDecrementPostfixExpression returns [EObject current=null] : ( ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAffixOperator ) ) ) ;
+    public final EObject ruleIncrementOrDecrementPostfixExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject lv_leftHandSide_0_0 = null;
+
+        AntlrDatatypeRuleToken lv_operator_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25942:2: ( ( ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAffixOperator ) ) ) )
+            // InternalFormalML.g:25943:2: ( ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAffixOperator ) ) )
+            {
+            // InternalFormalML.g:25943:2: ( ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAffixOperator ) ) )
+            // InternalFormalML.g:25944:3: ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) ) ( (lv_operator_1_0= ruleAffixOperator ) )
+            {
+            // InternalFormalML.g:25944:3: ( (lv_leftHandSide_0_0= ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:25945:4: (lv_leftHandSide_0_0= ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:25945:4: (lv_leftHandSide_0_0= ruleLeftHandSideExpression )
+            // InternalFormalML.g:25946:5: lv_leftHandSide_0_0= ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_238);
+            lv_leftHandSide_0_0=ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPostfixExpressionRule());
+              					}
+              					set(
+              						current,
+              						"leftHandSide",
+              						lv_leftHandSide_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:25963:3: ( (lv_operator_1_0= ruleAffixOperator ) )
+            // InternalFormalML.g:25964:4: (lv_operator_1_0= ruleAffixOperator )
+            {
+            // InternalFormalML.g:25964:4: (lv_operator_1_0= ruleAffixOperator )
+            // InternalFormalML.g:25965:5: lv_operator_1_0= ruleAffixOperator
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAffixOperatorParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_operator_1_0=ruleAffixOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPostfixExpressionRule());
+              					}
+              					set(
+              						current,
+              						"operator",
+              						lv_operator_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.AffixOperator");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIncrementOrDecrementPostfixExpression"
+
+
+    // $ANTLR start "entryRulePrefixUnaryExpression"
+    // InternalFormalML.g:25986:1: entryRulePrefixUnaryExpression returns [EObject current=null] : iv_rulePrefixUnaryExpression= rulePrefixUnaryExpression EOF ;
+    public final EObject entryRulePrefixUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrefixUnaryExpression = null;
+
+
+        try {
+            // InternalFormalML.g:25986:62: (iv_rulePrefixUnaryExpression= rulePrefixUnaryExpression EOF )
+            // InternalFormalML.g:25987:2: iv_rulePrefixUnaryExpression= rulePrefixUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrefixUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrefixUnaryExpression=rulePrefixUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrefixUnaryExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrefixUnaryExpression"
+
+
+    // $ANTLR start "rulePrefixUnaryExpression"
+    // InternalFormalML.g:25993:1: rulePrefixUnaryExpression returns [EObject current=null] : this_IncrementOrDecrementPrefixExpression_0= ruleIncrementOrDecrementPrefixExpression ;
+    public final EObject rulePrefixUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_IncrementOrDecrementPrefixExpression_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:25999:2: (this_IncrementOrDecrementPrefixExpression_0= ruleIncrementOrDecrementPrefixExpression )
+            // InternalFormalML.g:26000:2: this_IncrementOrDecrementPrefixExpression_0= ruleIncrementOrDecrementPrefixExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              		/* */
+              	
+            }
+            if ( state.backtracking==0 ) {
+
+              		newCompositeNode(grammarAccess.getPrefixUnaryExpressionAccess().getIncrementOrDecrementPrefixExpressionParserRuleCall());
+              	
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            this_IncrementOrDecrementPrefixExpression_0=ruleIncrementOrDecrementPrefixExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current = this_IncrementOrDecrementPrefixExpression_0;
+              		afterParserOrEnumRuleCall();
+              	
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrefixUnaryExpression"
+
+
+    // $ANTLR start "entryRuleIncrementOrDecrementPrefixExpression"
+    // InternalFormalML.g:26014:1: entryRuleIncrementOrDecrementPrefixExpression returns [EObject current=null] : iv_ruleIncrementOrDecrementPrefixExpression= ruleIncrementOrDecrementPrefixExpression EOF ;
+    public final EObject entryRuleIncrementOrDecrementPrefixExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleIncrementOrDecrementPrefixExpression = null;
+
+
+        try {
+            // InternalFormalML.g:26014:77: (iv_ruleIncrementOrDecrementPrefixExpression= ruleIncrementOrDecrementPrefixExpression EOF )
+            // InternalFormalML.g:26015:2: iv_ruleIncrementOrDecrementPrefixExpression= ruleIncrementOrDecrementPrefixExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getIncrementOrDecrementPrefixExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleIncrementOrDecrementPrefixExpression=ruleIncrementOrDecrementPrefixExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleIncrementOrDecrementPrefixExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleIncrementOrDecrementPrefixExpression"
+
+
+    // $ANTLR start "ruleIncrementOrDecrementPrefixExpression"
+    // InternalFormalML.g:26021:1: ruleIncrementOrDecrementPrefixExpression returns [EObject current=null] : ( ( (lv_operator_0_0= ruleAffixOperator ) ) ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) ) ;
+    public final EObject ruleIncrementOrDecrementPrefixExpression() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_operator_0_0 = null;
+
+        EObject lv_leftHandSide_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26027:2: ( ( ( (lv_operator_0_0= ruleAffixOperator ) ) ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) ) )
+            // InternalFormalML.g:26028:2: ( ( (lv_operator_0_0= ruleAffixOperator ) ) ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) )
+            {
+            // InternalFormalML.g:26028:2: ( ( (lv_operator_0_0= ruleAffixOperator ) ) ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) )
+            // InternalFormalML.g:26029:3: ( (lv_operator_0_0= ruleAffixOperator ) ) ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) )
+            {
+            // InternalFormalML.g:26029:3: ( (lv_operator_0_0= ruleAffixOperator ) )
+            // InternalFormalML.g:26030:4: (lv_operator_0_0= ruleAffixOperator )
+            {
+            // InternalFormalML.g:26030:4: (lv_operator_0_0= ruleAffixOperator )
+            // InternalFormalML.g:26031:5: lv_operator_0_0= ruleAffixOperator
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAffixOperatorParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_218);
+            lv_operator_0_0=ruleAffixOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPrefixExpressionRule());
+              					}
+              					set(
+              						current,
+              						"operator",
+              						lv_operator_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.AffixOperator");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:26048:3: ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) )
+            // InternalFormalML.g:26049:4: (lv_leftHandSide_1_0= ruleLeftHandSideExpression )
+            {
+            // InternalFormalML.g:26049:4: (lv_leftHandSide_1_0= ruleLeftHandSideExpression )
+            // InternalFormalML.g:26050:5: lv_leftHandSide_1_0= ruleLeftHandSideExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_leftHandSide_1_0=ruleLeftHandSideExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getIncrementOrDecrementPrefixExpressionRule());
+              					}
+              					set(
+              						current,
+              						"leftHandSide",
+              						lv_leftHandSide_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleIncrementOrDecrementPrefixExpression"
+
+
+    // $ANTLR start "entryRuleAffixOperator"
+    // InternalFormalML.g:26071:1: entryRuleAffixOperator returns [String current=null] : iv_ruleAffixOperator= ruleAffixOperator EOF ;
+    public final String entryRuleAffixOperator() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleAffixOperator = null;
+
+
+        try {
+            // InternalFormalML.g:26071:53: (iv_ruleAffixOperator= ruleAffixOperator EOF )
+            // InternalFormalML.g:26072:2: iv_ruleAffixOperator= ruleAffixOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getAffixOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleAffixOperator=ruleAffixOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleAffixOperator.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleAffixOperator"
+
+
+    // $ANTLR start "ruleAffixOperator"
+    // InternalFormalML.g:26078:1: ruleAffixOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
+    public final AntlrDatatypeRuleToken ruleAffixOperator() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26084:2: ( (kw= '++' | kw= '--' ) )
+            // InternalFormalML.g:26085:2: (kw= '++' | kw= '--' )
+            {
+            // InternalFormalML.g:26085:2: (kw= '++' | kw= '--' )
+            int alt568=2;
+            int LA568_0 = input.LA(1);
+
+            if ( (LA568_0==216) ) {
+                alt568=1;
+            }
+            else if ( (LA568_0==217) ) {
+                alt568=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 568, 0, input);
+
+                throw nvae;
+            }
+            switch (alt568) {
+                case 1 :
+                    // InternalFormalML.g:26086:3: kw= '++'
+                    {
+                    kw=(Token)match(input,216,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAffixOperatorAccess().getPlusSignPlusSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:26092:3: kw= '--'
+                    {
+                    kw=(Token)match(input,217,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getAffixOperatorAccess().getHyphenMinusHyphenMinusKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleAffixOperator"
+
+
+    // $ANTLR start "entryRuleNewfreshExpression"
+    // InternalFormalML.g:26101:1: entryRuleNewfreshExpression returns [EObject current=null] : iv_ruleNewfreshExpression= ruleNewfreshExpression EOF ;
+    public final EObject entryRuleNewfreshExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleNewfreshExpression = null;
+
+
+        try {
+            // InternalFormalML.g:26101:59: (iv_ruleNewfreshExpression= ruleNewfreshExpression EOF )
+            // InternalFormalML.g:26102:2: iv_ruleNewfreshExpression= ruleNewfreshExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getNewfreshExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleNewfreshExpression=ruleNewfreshExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleNewfreshExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleNewfreshExpression"
+
+
+    // $ANTLR start "ruleNewfreshExpression"
+    // InternalFormalML.g:26108:1: ruleNewfreshExpression returns [EObject current=null] : ( (otherlv_0= 'newfresh' ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) ) | (otherlv_2= '(:' ( (lv_leftHandSide_3_0= ruleLeftHandSideExpression ) ) otherlv_4= 'newfresh' otherlv_5= ')' ) ) ;
+    public final EObject ruleNewfreshExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        EObject lv_leftHandSide_1_0 = null;
+
+        EObject lv_leftHandSide_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26114:2: ( ( (otherlv_0= 'newfresh' ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) ) | (otherlv_2= '(:' ( (lv_leftHandSide_3_0= ruleLeftHandSideExpression ) ) otherlv_4= 'newfresh' otherlv_5= ')' ) ) )
+            // InternalFormalML.g:26115:2: ( (otherlv_0= 'newfresh' ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) ) | (otherlv_2= '(:' ( (lv_leftHandSide_3_0= ruleLeftHandSideExpression ) ) otherlv_4= 'newfresh' otherlv_5= ')' ) )
+            {
+            // InternalFormalML.g:26115:2: ( (otherlv_0= 'newfresh' ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) ) | (otherlv_2= '(:' ( (lv_leftHandSide_3_0= ruleLeftHandSideExpression ) ) otherlv_4= 'newfresh' otherlv_5= ')' ) )
+            int alt569=2;
+            int LA569_0 = input.LA(1);
+
+            if ( (LA569_0==218) ) {
+                alt569=1;
+            }
+            else if ( (LA569_0==219) ) {
+                alt569=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 569, 0, input);
+
+                throw nvae;
+            }
+            switch (alt569) {
+                case 1 :
+                    // InternalFormalML.g:26116:3: (otherlv_0= 'newfresh' ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) )
+                    {
+                    // InternalFormalML.g:26116:3: (otherlv_0= 'newfresh' ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) ) )
+                    // InternalFormalML.g:26117:4: otherlv_0= 'newfresh' ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) )
+                    {
+                    otherlv_0=(Token)match(input,218,FollowSets000.FOLLOW_218); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_0, grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_0_0());
+                      			
+                    }
+                    // InternalFormalML.g:26121:4: ( (lv_leftHandSide_1_0= ruleLeftHandSideExpression ) )
+                    // InternalFormalML.g:26122:5: (lv_leftHandSide_1_0= ruleLeftHandSideExpression )
+                    {
+                    // InternalFormalML.g:26122:5: (lv_leftHandSide_1_0= ruleLeftHandSideExpression )
+                    // InternalFormalML.g:26123:6: lv_leftHandSide_1_0= ruleLeftHandSideExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    lv_leftHandSide_1_0=ruleLeftHandSideExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getNewfreshExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"leftHandSide",
+                      							lv_leftHandSide_1_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:26142:3: (otherlv_2= '(:' ( (lv_leftHandSide_3_0= ruleLeftHandSideExpression ) ) otherlv_4= 'newfresh' otherlv_5= ')' )
+                    {
+                    // InternalFormalML.g:26142:3: (otherlv_2= '(:' ( (lv_leftHandSide_3_0= ruleLeftHandSideExpression ) ) otherlv_4= 'newfresh' otherlv_5= ')' )
+                    // InternalFormalML.g:26143:4: otherlv_2= '(:' ( (lv_leftHandSide_3_0= ruleLeftHandSideExpression ) ) otherlv_4= 'newfresh' otherlv_5= ')'
+                    {
+                    otherlv_2=(Token)match(input,219,FollowSets000.FOLLOW_218); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getNewfreshExpressionAccess().getLeftParenthesisColonKeyword_1_0());
+                      			
+                    }
+                    // InternalFormalML.g:26147:4: ( (lv_leftHandSide_3_0= ruleLeftHandSideExpression ) )
+                    // InternalFormalML.g:26148:5: (lv_leftHandSide_3_0= ruleLeftHandSideExpression )
+                    {
+                    // InternalFormalML.g:26148:5: (lv_leftHandSide_3_0= ruleLeftHandSideExpression )
+                    // InternalFormalML.g:26149:6: lv_leftHandSide_3_0= ruleLeftHandSideExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getNewfreshExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_239);
+                    lv_leftHandSide_3_0=ruleLeftHandSideExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getNewfreshExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"leftHandSide",
+                      							lv_leftHandSide_3_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,218,FollowSets000.FOLLOW_99); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_4, grammarAccess.getNewfreshExpressionAccess().getNewfreshKeyword_1_2());
+                      			
+                    }
+                    otherlv_5=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getNewfreshExpressionAccess().getRightParenthesisKeyword_1_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleNewfreshExpression"
+
+
+    // $ANTLR start "entryRuleCastExpression"
+    // InternalFormalML.g:26179:1: entryRuleCastExpression returns [EObject current=null] : iv_ruleCastExpression= ruleCastExpression EOF ;
+    public final EObject entryRuleCastExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleCastExpression = null;
+
+
+        try {
+            // InternalFormalML.g:26179:55: (iv_ruleCastExpression= ruleCastExpression EOF )
+            // InternalFormalML.g:26180:2: iv_ruleCastExpression= ruleCastExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getCastExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleCastExpression=ruleCastExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleCastExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleCastExpression"
+
+
+    // $ANTLR start "ruleCastExpression"
+    // InternalFormalML.g:26186:1: ruleCastExpression returns [EObject current=null] : (otherlv_0= 'ctor' otherlv_1= '<' ( ( ruleESUfid ) ) otherlv_3= '>' otherlv_4= '(' ( (lv_operand_5_0= ruleExpression ) ) otherlv_6= ')' ) ;
+    public final EObject ruleCastExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_operand_5_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26192:2: ( (otherlv_0= 'ctor' otherlv_1= '<' ( ( ruleESUfid ) ) otherlv_3= '>' otherlv_4= '(' ( (lv_operand_5_0= ruleExpression ) ) otherlv_6= ')' ) )
+            // InternalFormalML.g:26193:2: (otherlv_0= 'ctor' otherlv_1= '<' ( ( ruleESUfid ) ) otherlv_3= '>' otherlv_4= '(' ( (lv_operand_5_0= ruleExpression ) ) otherlv_6= ')' )
+            {
+            // InternalFormalML.g:26193:2: (otherlv_0= 'ctor' otherlv_1= '<' ( ( ruleESUfid ) ) otherlv_3= '>' otherlv_4= '(' ( (lv_operand_5_0= ruleExpression ) ) otherlv_6= ')' )
+            // InternalFormalML.g:26194:3: otherlv_0= 'ctor' otherlv_1= '<' ( ( ruleESUfid ) ) otherlv_3= '>' otherlv_4= '(' ( (lv_operand_5_0= ruleExpression ) ) otherlv_6= ')'
+            {
+            otherlv_0=(Token)match(input,220,FollowSets000.FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getCastExpressionAccess().getCtorKeyword_0());
+              		
+            }
+            otherlv_1=(Token)match(input,16,FollowSets000.FOLLOW_35); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getCastExpressionAccess().getLessThanSignKeyword_1());
+              		
+            }
+            // InternalFormalML.g:26202:3: ( ( ruleESUfid ) )
+            // InternalFormalML.g:26203:4: ( ruleESUfid )
+            {
+            // InternalFormalML.g:26203:4: ( ruleESUfid )
+            // InternalFormalML.g:26204:5: ruleESUfid
+            {
+            if ( state.backtracking==0 ) {
+
+              					/* */
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getCastExpressionRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeCrossReference_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_23);
+            ruleESUfid();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,37,FollowSets000.FOLLOW_216); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getCastExpressionAccess().getGreaterThanSignKeyword_3());
+              		
+            }
+            otherlv_4=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getCastExpressionAccess().getLeftParenthesisKeyword_4());
+              		
+            }
+            // InternalFormalML.g:26229:3: ( (lv_operand_5_0= ruleExpression ) )
+            // InternalFormalML.g:26230:4: (lv_operand_5_0= ruleExpression )
+            {
+            // InternalFormalML.g:26230:4: (lv_operand_5_0= ruleExpression )
+            // InternalFormalML.g:26231:5: lv_operand_5_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getCastExpressionAccess().getOperandExpressionParserRuleCall_5_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_99);
+            lv_operand_5_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getCastExpressionRule());
+              					}
+              					set(
+              						current,
+              						"operand",
+              						lv_operand_5_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_6=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_6, grammarAccess.getCastExpressionAccess().getRightParenthesisKeyword_6());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleCastExpression"
+
+
+    // $ANTLR start "entryRuleArithmeticUnaryExpression"
+    // InternalFormalML.g:26256:1: entryRuleArithmeticUnaryExpression returns [EObject current=null] : iv_ruleArithmeticUnaryExpression= ruleArithmeticUnaryExpression EOF ;
+    public final EObject entryRuleArithmeticUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleArithmeticUnaryExpression = null;
+
+
+        try {
+            // InternalFormalML.g:26256:66: (iv_ruleArithmeticUnaryExpression= ruleArithmeticUnaryExpression EOF )
+            // InternalFormalML.g:26257:2: iv_ruleArithmeticUnaryExpression= ruleArithmeticUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getArithmeticUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleArithmeticUnaryExpression=ruleArithmeticUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleArithmeticUnaryExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleArithmeticUnaryExpression"
+
+
+    // $ANTLR start "ruleArithmeticUnaryExpression"
+    // InternalFormalML.g:26263:1: ruleArithmeticUnaryExpression returns [EObject current=null] : ( ( (lv_operator_0_0= ruleArithmeticUnaryOperator ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) ) ;
+    public final EObject ruleArithmeticUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_operator_0_0 = null;
+
+        EObject lv_operand_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26269:2: ( ( ( (lv_operator_0_0= ruleArithmeticUnaryOperator ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) ) )
+            // InternalFormalML.g:26270:2: ( ( (lv_operator_0_0= ruleArithmeticUnaryOperator ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) )
+            {
+            // InternalFormalML.g:26270:2: ( ( (lv_operator_0_0= ruleArithmeticUnaryOperator ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) )
+            // InternalFormalML.g:26271:3: ( (lv_operator_0_0= ruleArithmeticUnaryOperator ) ) ( (lv_operand_1_0= ruleUnaryExpression ) )
+            {
+            // InternalFormalML.g:26271:3: ( (lv_operator_0_0= ruleArithmeticUnaryOperator ) )
+            // InternalFormalML.g:26272:4: (lv_operator_0_0= ruleArithmeticUnaryOperator )
+            {
+            // InternalFormalML.g:26272:4: (lv_operator_0_0= ruleArithmeticUnaryOperator )
+            // InternalFormalML.g:26273:5: lv_operator_0_0= ruleArithmeticUnaryOperator
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorArithmeticUnaryOperatorParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_13);
+            lv_operator_0_0=ruleArithmeticUnaryOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getArithmeticUnaryExpressionRule());
+              					}
+              					set(
+              						current,
+              						"operator",
+              						lv_operator_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ArithmeticUnaryOperator");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:26290:3: ( (lv_operand_1_0= ruleUnaryExpression ) )
+            // InternalFormalML.g:26291:4: (lv_operand_1_0= ruleUnaryExpression )
+            {
+            // InternalFormalML.g:26291:4: (lv_operand_1_0= ruleUnaryExpression )
+            // InternalFormalML.g:26292:5: lv_operand_1_0= ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_operand_1_0=ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getArithmeticUnaryExpressionRule());
+              					}
+              					set(
+              						current,
+              						"operand",
+              						lv_operand_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleArithmeticUnaryExpression"
+
+
+    // $ANTLR start "entryRuleArithmeticUnaryOperator"
+    // InternalFormalML.g:26313:1: entryRuleArithmeticUnaryOperator returns [String current=null] : iv_ruleArithmeticUnaryOperator= ruleArithmeticUnaryOperator EOF ;
+    public final String entryRuleArithmeticUnaryOperator() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleArithmeticUnaryOperator = null;
+
+
+        try {
+            // InternalFormalML.g:26313:63: (iv_ruleArithmeticUnaryOperator= ruleArithmeticUnaryOperator EOF )
+            // InternalFormalML.g:26314:2: iv_ruleArithmeticUnaryOperator= ruleArithmeticUnaryOperator EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getArithmeticUnaryOperatorRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleArithmeticUnaryOperator=ruleArithmeticUnaryOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleArithmeticUnaryOperator.getText(); 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleArithmeticUnaryOperator"
+
+
+    // $ANTLR start "ruleArithmeticUnaryOperator"
+    // InternalFormalML.g:26320:1: ruleArithmeticUnaryOperator returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
+    public final AntlrDatatypeRuleToken ruleArithmeticUnaryOperator() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26326:2: ( (kw= '+' | kw= '-' ) )
+            // InternalFormalML.g:26327:2: (kw= '+' | kw= '-' )
+            {
+            // InternalFormalML.g:26327:2: (kw= '+' | kw= '-' )
+            int alt570=2;
+            int LA570_0 = input.LA(1);
+
+            if ( (LA570_0==212) ) {
+                alt570=1;
+            }
+            else if ( (LA570_0==28) ) {
+                alt570=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 570, 0, input);
+
+                throw nvae;
+            }
+            switch (alt570) {
+                case 1 :
+                    // InternalFormalML.g:26328:3: kw= '+'
+                    {
+                    kw=(Token)match(input,212,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getArithmeticUnaryOperatorAccess().getPlusSignKeyword_0());
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:26334:3: kw= '-'
+                    {
+                    kw=(Token)match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current.merge(kw);
+                      			newLeafNode(kw, grammarAccess.getArithmeticUnaryOperatorAccess().getHyphenMinusKeyword_1());
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleArithmeticUnaryOperator"
+
+
+    // $ANTLR start "entryRuleLogicalUnaryExpression"
+    // InternalFormalML.g:26343:1: entryRuleLogicalUnaryExpression returns [EObject current=null] : iv_ruleLogicalUnaryExpression= ruleLogicalUnaryExpression EOF ;
+    public final EObject entryRuleLogicalUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLogicalUnaryExpression = null;
+
+
+        try {
+            // InternalFormalML.g:26343:63: (iv_ruleLogicalUnaryExpression= ruleLogicalUnaryExpression EOF )
+            // InternalFormalML.g:26344:2: iv_ruleLogicalUnaryExpression= ruleLogicalUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLogicalUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLogicalUnaryExpression=ruleLogicalUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLogicalUnaryExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLogicalUnaryExpression"
+
+
+    // $ANTLR start "ruleLogicalUnaryExpression"
+    // InternalFormalML.g:26350:1: ruleLogicalUnaryExpression returns [EObject current=null] : ( ( ( (lv_operator_0_1= '!' | lv_operator_0_2= 'not' ) ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) ) ;
+    public final EObject ruleLogicalUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_0_1=null;
+        Token lv_operator_0_2=null;
+        EObject lv_operand_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26356:2: ( ( ( ( (lv_operator_0_1= '!' | lv_operator_0_2= 'not' ) ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) ) )
+            // InternalFormalML.g:26357:2: ( ( ( (lv_operator_0_1= '!' | lv_operator_0_2= 'not' ) ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) )
+            {
+            // InternalFormalML.g:26357:2: ( ( ( (lv_operator_0_1= '!' | lv_operator_0_2= 'not' ) ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) )
+            // InternalFormalML.g:26358:3: ( ( (lv_operator_0_1= '!' | lv_operator_0_2= 'not' ) ) ) ( (lv_operand_1_0= ruleUnaryExpression ) )
+            {
+            // InternalFormalML.g:26358:3: ( ( (lv_operator_0_1= '!' | lv_operator_0_2= 'not' ) ) )
+            // InternalFormalML.g:26359:4: ( (lv_operator_0_1= '!' | lv_operator_0_2= 'not' ) )
+            {
+            // InternalFormalML.g:26359:4: ( (lv_operator_0_1= '!' | lv_operator_0_2= 'not' ) )
+            // InternalFormalML.g:26360:5: (lv_operator_0_1= '!' | lv_operator_0_2= 'not' )
+            {
+            // InternalFormalML.g:26360:5: (lv_operator_0_1= '!' | lv_operator_0_2= 'not' )
+            int alt571=2;
+            int LA571_0 = input.LA(1);
+
+            if ( (LA571_0==221) ) {
+                alt571=1;
+            }
+            else if ( (LA571_0==222) ) {
+                alt571=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 571, 0, input);
+
+                throw nvae;
+            }
+            switch (alt571) {
+                case 1 :
+                    // InternalFormalML.g:26361:6: lv_operator_0_1= '!'
+                    {
+                    lv_operator_0_1=(Token)match(input,221,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_0_1, grammarAccess.getLogicalUnaryExpressionAccess().getOperatorExclamationMarkKeyword_0_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getLogicalUnaryExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_0_1, null);
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:26372:6: lv_operator_0_2= 'not'
+                    {
+                    lv_operator_0_2=(Token)match(input,222,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_operator_0_2, grammarAccess.getLogicalUnaryExpressionAccess().getOperatorNotKeyword_0_0_1());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getLogicalUnaryExpressionRule());
+                      						}
+                      						setWithLastConsumed(current, "operator", lv_operator_0_2, null);
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:26385:3: ( (lv_operand_1_0= ruleUnaryExpression ) )
+            // InternalFormalML.g:26386:4: (lv_operand_1_0= ruleUnaryExpression )
+            {
+            // InternalFormalML.g:26386:4: (lv_operand_1_0= ruleUnaryExpression )
+            // InternalFormalML.g:26387:5: lv_operand_1_0= ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLogicalUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_operand_1_0=ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLogicalUnaryExpressionRule());
+              					}
+              					set(
+              						current,
+              						"operand",
+              						lv_operand_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLogicalUnaryExpression"
+
+
+    // $ANTLR start "entryRuleBitwiseUnaryExpression"
+    // InternalFormalML.g:26408:1: entryRuleBitwiseUnaryExpression returns [EObject current=null] : iv_ruleBitwiseUnaryExpression= ruleBitwiseUnaryExpression EOF ;
+    public final EObject entryRuleBitwiseUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBitwiseUnaryExpression = null;
+
+
+        try {
+            // InternalFormalML.g:26408:63: (iv_ruleBitwiseUnaryExpression= ruleBitwiseUnaryExpression EOF )
+            // InternalFormalML.g:26409:2: iv_ruleBitwiseUnaryExpression= ruleBitwiseUnaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBitwiseUnaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBitwiseUnaryExpression=ruleBitwiseUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBitwiseUnaryExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBitwiseUnaryExpression"
+
+
+    // $ANTLR start "ruleBitwiseUnaryExpression"
+    // InternalFormalML.g:26415:1: ruleBitwiseUnaryExpression returns [EObject current=null] : ( ( (lv_operator_0_0= '~' ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) ) ;
+    public final EObject ruleBitwiseUnaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_operator_0_0=null;
+        EObject lv_operand_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26421:2: ( ( ( (lv_operator_0_0= '~' ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) ) )
+            // InternalFormalML.g:26422:2: ( ( (lv_operator_0_0= '~' ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) )
+            {
+            // InternalFormalML.g:26422:2: ( ( (lv_operator_0_0= '~' ) ) ( (lv_operand_1_0= ruleUnaryExpression ) ) )
+            // InternalFormalML.g:26423:3: ( (lv_operator_0_0= '~' ) ) ( (lv_operand_1_0= ruleUnaryExpression ) )
+            {
+            // InternalFormalML.g:26423:3: ( (lv_operator_0_0= '~' ) )
+            // InternalFormalML.g:26424:4: (lv_operator_0_0= '~' )
+            {
+            // InternalFormalML.g:26424:4: (lv_operator_0_0= '~' )
+            // InternalFormalML.g:26425:5: lv_operator_0_0= '~'
+            {
+            lv_operator_0_0=(Token)match(input,223,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_operator_0_0, grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getBitwiseUnaryExpressionRule());
+              					}
+              					setWithLastConsumed(current, "operator", lv_operator_0_0, "~");
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:26437:3: ( (lv_operand_1_0= ruleUnaryExpression ) )
+            // InternalFormalML.g:26438:4: (lv_operand_1_0= ruleUnaryExpression )
+            {
+            // InternalFormalML.g:26438:4: (lv_operand_1_0= ruleUnaryExpression )
+            // InternalFormalML.g:26439:5: lv_operand_1_0= ruleUnaryExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_operand_1_0=ruleUnaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getBitwiseUnaryExpressionRule());
+              					}
+              					set(
+              						current,
+              						"operand",
+              						lv_operand_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBitwiseUnaryExpression"
+
+
+    // $ANTLR start "entryRulePrimaryExpression"
+    // InternalFormalML.g:26460:1: entryRulePrimaryExpression returns [EObject current=null] : iv_rulePrimaryExpression= rulePrimaryExpression EOF ;
+    public final EObject entryRulePrimaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePrimaryExpression = null;
+
+
+        try {
+            // InternalFormalML.g:26460:58: (iv_rulePrimaryExpression= rulePrimaryExpression EOF )
+            // InternalFormalML.g:26461:2: iv_rulePrimaryExpression= rulePrimaryExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPrimaryExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePrimaryExpression=rulePrimaryExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePrimaryExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePrimaryExpression"
+
+
+    // $ANTLR start "rulePrimaryExpression"
+    // InternalFormalML.g:26467:1: rulePrimaryExpression returns [EObject current=null] : (this_BaseExpression_0= ruleBaseExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) | ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )? )* ( () otherlv_11= '->' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) | ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )? ( () otherlv_20= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )? )* )? ) ;
+    public final EObject rulePrimaryExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_6=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_15=null;
+        Token otherlv_18=null;
+        Token otherlv_20=null;
+        Token otherlv_24=null;
+        Token otherlv_27=null;
+        EObject this_BaseExpression_0 = null;
+
+        Enumerator lv_kind_4_0 = null;
+
+        EObject lv_arg_5_0 = null;
+
+        Enumerator lv_kind_7_0 = null;
+
+        EObject lv_arg_8_0 = null;
+
+        Enumerator lv_kind_13_0 = null;
+
+        EObject lv_arg_14_0 = null;
+
+        Enumerator lv_kind_16_0 = null;
+
+        EObject lv_arg_17_0 = null;
+
+        Enumerator lv_kind_22_0 = null;
+
+        EObject lv_arg_23_0 = null;
+
+        Enumerator lv_kind_25_0 = null;
+
+        EObject lv_arg_26_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26473:2: ( (this_BaseExpression_0= ruleBaseExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) | ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )? )* ( () otherlv_11= '->' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) | ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )? ( () otherlv_20= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )? )* )? ) )
+            // InternalFormalML.g:26474:2: (this_BaseExpression_0= ruleBaseExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) | ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )? )* ( () otherlv_11= '->' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) | ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )? ( () otherlv_20= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )? )* )? )
+            {
+            // InternalFormalML.g:26474:2: (this_BaseExpression_0= ruleBaseExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) | ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )? )* ( () otherlv_11= '->' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) | ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )? ( () otherlv_20= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )? )* )? )
+            // InternalFormalML.g:26475:3: this_BaseExpression_0= ruleBaseExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) | ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )? )* ( () otherlv_11= '->' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) | ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )? ( () otherlv_20= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )? )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getBaseExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_123);
+            this_BaseExpression_0=ruleBaseExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_BaseExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:26486:3: ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) | ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )? )*
+            loop573:
+            do {
+                int alt573=2;
+                int LA573_0 = input.LA(1);
+
+                if ( (LA573_0==29) ) {
+                    int LA573_2 = input.LA(2);
+
+                    if ( (LA573_2==RULE_XLIA_ID) ) {
+                        alt573=1;
+                    }
+
+
+                }
+
+
+                switch (alt573) {
+            	case 1 :
+            	    // InternalFormalML.g:26487:4: () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) | ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )?
+            	    {
+            	    // InternalFormalML.g:26487:4: ()
+            	    // InternalFormalML.g:26488:5: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					/* */
+            	      				
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      					current = forceCreateModelElementAndSet(
+            	      						grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0(),
+            	      						current);
+            	      				
+            	    }
+
+            	    }
+
+            	    otherlv_2=(Token)match(input,29,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_2, grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_1_1());
+            	      			
+            	    }
+            	    // InternalFormalML.g:26501:4: ( ( ruleESIdentifier ) )
+            	    // InternalFormalML.g:26502:5: ( ruleESIdentifier )
+            	    {
+            	    // InternalFormalML.g:26502:5: ( ruleESIdentifier )
+            	    // InternalFormalML.g:26503:6: ruleESIdentifier
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						/* */
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+            	      						}
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_1_2_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_240);
+            	    ruleESIdentifier();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:26520:4: ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) | ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )?
+            	    int alt572=3;
+            	    alt572 = dfa572.predict(input);
+            	    switch (alt572) {
+            	        case 1 :
+            	            // InternalFormalML.g:26521:5: ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )
+            	            {
+            	            // InternalFormalML.g:26521:5: ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )
+            	            // InternalFormalML.g:26522:6: ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']'
+            	            {
+            	            // InternalFormalML.g:26522:6: ( (lv_kind_4_0= ruleValueIndexExpressionKind ) )
+            	            // InternalFormalML.g:26523:7: (lv_kind_4_0= ruleValueIndexExpressionKind )
+            	            {
+            	            // InternalFormalML.g:26523:7: (lv_kind_4_0= ruleValueIndexExpressionKind )
+            	            // InternalFormalML.g:26524:8: lv_kind_4_0= ruleValueIndexExpressionKind
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0());
+            	              							
+            	            }
+            	            pushFollow(FollowSets000.FOLLOW_13);
+            	            lv_kind_4_0=ruleValueIndexExpressionKind();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								if (current==null) {
+            	              									current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+            	              								}
+            	              								set(
+            	              									current,
+            	              									"kind",
+            	              									lv_kind_4_0,
+            	              									"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+            	              								afterParserOrEnumRuleCall();
+            	              							
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            // InternalFormalML.g:26541:6: ( (lv_arg_5_0= rulePositionalTupleExpressionList ) )
+            	            // InternalFormalML.g:26542:7: (lv_arg_5_0= rulePositionalTupleExpressionList )
+            	            {
+            	            // InternalFormalML.g:26542:7: (lv_arg_5_0= rulePositionalTupleExpressionList )
+            	            // InternalFormalML.g:26543:8: lv_arg_5_0= rulePositionalTupleExpressionList
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0());
+            	              							
+            	            }
+            	            pushFollow(FollowSets000.FOLLOW_110);
+            	            lv_arg_5_0=rulePositionalTupleExpressionList();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								if (current==null) {
+            	              									current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+            	              								}
+            	              								set(
+            	              									current,
+            	              									"arg",
+            	              									lv_arg_5_0,
+            	              									"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+            	              								afterParserOrEnumRuleCall();
+            	              							
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            otherlv_6=(Token)match(input,99,FollowSets000.FOLLOW_123); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_6, grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_1_3_0_2());
+            	              					
+            	            }
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:26566:5: ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' )
+            	            {
+            	            // InternalFormalML.g:26566:5: ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' )
+            	            // InternalFormalML.g:26567:6: ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')'
+            	            {
+            	            // InternalFormalML.g:26567:6: ( (lv_kind_7_0= ruleValueParameterExpressionKind ) )
+            	            // InternalFormalML.g:26568:7: (lv_kind_7_0= ruleValueParameterExpressionKind )
+            	            {
+            	            // InternalFormalML.g:26568:7: (lv_kind_7_0= ruleValueParameterExpressionKind )
+            	            // InternalFormalML.g:26569:8: lv_kind_7_0= ruleValueParameterExpressionKind
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0());
+            	              							
+            	            }
+            	            pushFollow(FollowSets000.FOLLOW_13);
+            	            lv_kind_7_0=ruleValueParameterExpressionKind();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								if (current==null) {
+            	              									current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+            	              								}
+            	              								set(
+            	              									current,
+            	              									"kind",
+            	              									lv_kind_7_0,
+            	              									"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
+            	              								afterParserOrEnumRuleCall();
+            	              							
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            // InternalFormalML.g:26586:6: ( (lv_arg_8_0= ruleMixTupleExpressionList ) )
+            	            // InternalFormalML.g:26587:7: (lv_arg_8_0= ruleMixTupleExpressionList )
+            	            {
+            	            // InternalFormalML.g:26587:7: (lv_arg_8_0= ruleMixTupleExpressionList )
+            	            // InternalFormalML.g:26588:8: lv_arg_8_0= ruleMixTupleExpressionList
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0());
+            	              							
+            	            }
+            	            pushFollow(FollowSets000.FOLLOW_99);
+            	            lv_arg_8_0=ruleMixTupleExpressionList();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              								if (current==null) {
+            	              									current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+            	              								}
+            	              								set(
+            	              									current,
+            	              									"arg",
+            	              									lv_arg_8_0,
+            	              									"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+            	              								afterParserOrEnumRuleCall();
+            	              							
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            otherlv_9=(Token)match(input,57,FollowSets000.FOLLOW_123); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              						newLeafNode(otherlv_9, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_1_3_1_2());
+            	              					
+            	            }
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop573;
+                }
+            } while (true);
+
+            // InternalFormalML.g:26612:3: ( () otherlv_11= '->' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) | ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )? ( () otherlv_20= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )? )* )?
+            int alt577=2;
+            int LA577_0 = input.LA(1);
+
+            if ( (LA577_0==92) ) {
+                alt577=1;
+            }
+            switch (alt577) {
+                case 1 :
+                    // InternalFormalML.g:26613:4: () otherlv_11= '->' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) | ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )? ( () otherlv_20= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )? )*
+                    {
+                    // InternalFormalML.g:26613:4: ()
+                    // InternalFormalML.g:26614:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndSet(
+                      						grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    otherlv_11=(Token)match(input,92,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_11, grammarAccess.getPrimaryExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1());
+                      			
+                    }
+                    // InternalFormalML.g:26627:4: ( ( ruleESIdentifier ) )
+                    // InternalFormalML.g:26628:5: ( ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:26628:5: ( ruleESIdentifier )
+                    // InternalFormalML.g:26629:6: ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_241);
+                    ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:26646:4: ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) | ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )?
+                    int alt574=3;
+                    alt574 = dfa574.predict(input);
+                    switch (alt574) {
+                        case 1 :
+                            // InternalFormalML.g:26647:5: ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' )
+                            {
+                            // InternalFormalML.g:26647:5: ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' )
+                            // InternalFormalML.g:26648:6: ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']'
+                            {
+                            // InternalFormalML.g:26648:6: ( (lv_kind_13_0= ruleValueIndexExpressionKind ) )
+                            // InternalFormalML.g:26649:7: (lv_kind_13_0= ruleValueIndexExpressionKind )
+                            {
+                            // InternalFormalML.g:26649:7: (lv_kind_13_0= ruleValueIndexExpressionKind )
+                            // InternalFormalML.g:26650:8: lv_kind_13_0= ruleValueIndexExpressionKind
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_13);
+                            lv_kind_13_0=ruleValueIndexExpressionKind();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                              								}
+                              								set(
+                              									current,
+                              									"kind",
+                              									lv_kind_13_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalFormalML.g:26667:6: ( (lv_arg_14_0= rulePositionalTupleExpressionList ) )
+                            // InternalFormalML.g:26668:7: (lv_arg_14_0= rulePositionalTupleExpressionList )
+                            {
+                            // InternalFormalML.g:26668:7: (lv_arg_14_0= rulePositionalTupleExpressionList )
+                            // InternalFormalML.g:26669:8: lv_arg_14_0= rulePositionalTupleExpressionList
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_110);
+                            lv_arg_14_0=rulePositionalTupleExpressionList();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                              								}
+                              								set(
+                              									current,
+                              									"arg",
+                              									lv_arg_14_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_15=(Token)match(input,99,FollowSets000.FOLLOW_242); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_15, grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_3_0_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:26692:5: ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' )
+                            {
+                            // InternalFormalML.g:26692:5: ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' )
+                            // InternalFormalML.g:26693:6: ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')'
+                            {
+                            // InternalFormalML.g:26693:6: ( (lv_kind_16_0= ruleValueParameterExpressionKind ) )
+                            // InternalFormalML.g:26694:7: (lv_kind_16_0= ruleValueParameterExpressionKind )
+                            {
+                            // InternalFormalML.g:26694:7: (lv_kind_16_0= ruleValueParameterExpressionKind )
+                            // InternalFormalML.g:26695:8: lv_kind_16_0= ruleValueParameterExpressionKind
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_13);
+                            lv_kind_16_0=ruleValueParameterExpressionKind();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                              								}
+                              								set(
+                              									current,
+                              									"kind",
+                              									lv_kind_16_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalFormalML.g:26712:6: ( (lv_arg_17_0= ruleMixTupleExpressionList ) )
+                            // InternalFormalML.g:26713:7: (lv_arg_17_0= ruleMixTupleExpressionList )
+                            {
+                            // InternalFormalML.g:26713:7: (lv_arg_17_0= ruleMixTupleExpressionList )
+                            // InternalFormalML.g:26714:8: lv_arg_17_0= ruleMixTupleExpressionList
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_99);
+                            lv_arg_17_0=ruleMixTupleExpressionList();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                              								}
+                              								set(
+                              									current,
+                              									"arg",
+                              									lv_arg_17_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_18=(Token)match(input,57,FollowSets000.FOLLOW_242); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              						newLeafNode(otherlv_18, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_3_1_2());
+                              					
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:26737:4: ( () otherlv_20= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )? )*
+                    loop576:
+                    do {
+                        int alt576=2;
+                        int LA576_0 = input.LA(1);
+
+                        if ( (LA576_0==29) ) {
+                            int LA576_2 = input.LA(2);
+
+                            if ( (LA576_2==RULE_XLIA_ID) ) {
+                                alt576=1;
+                            }
+
+
+                        }
+
+
+                        switch (alt576) {
+                    	case 1 :
+                    	    // InternalFormalML.g:26738:5: () otherlv_20= '.' ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )?
+                    	    {
+                    	    // InternalFormalML.g:26738:5: ()
+                    	    // InternalFormalML.g:26739:6: 
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						/* */
+                    	      					
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						current = forceCreateModelElementAndSet(
+                    	      							grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_4_0(),
+                    	      							current);
+                    	      					
+                    	    }
+
+                    	    }
+
+                    	    otherlv_20=(Token)match(input,29,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_20, grammarAccess.getPrimaryExpressionAccess().getFullStopKeyword_2_4_1());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:26752:5: ( ( ruleESIdentifier ) )
+                    	    // InternalFormalML.g:26753:6: ( ruleESIdentifier )
+                    	    {
+                    	    // InternalFormalML.g:26753:6: ( ruleESIdentifier )
+                    	    // InternalFormalML.g:26754:7: ruleESIdentifier
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							/* */
+                    	      						
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElement(grammarAccess.getPrimaryExpressionRule());
+                    	      							}
+                    	      						
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getElementNamedElementCrossReference_2_4_2_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_241);
+                    	    ruleESIdentifier();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalFormalML.g:26771:5: ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )?
+                    	    int alt575=3;
+                    	    alt575 = dfa575.predict(input);
+                    	    switch (alt575) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:26772:6: ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' )
+                    	            {
+                    	            // InternalFormalML.g:26772:6: ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' )
+                    	            // InternalFormalML.g:26773:7: ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']'
+                    	            {
+                    	            // InternalFormalML.g:26773:7: ( (lv_kind_22_0= ruleValueIndexExpressionKind ) )
+                    	            // InternalFormalML.g:26774:8: (lv_kind_22_0= ruleValueIndexExpressionKind )
+                    	            {
+                    	            // InternalFormalML.g:26774:8: (lv_kind_22_0= ruleValueIndexExpressionKind )
+                    	            // InternalFormalML.g:26775:9: lv_kind_22_0= ruleValueIndexExpressionKind
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0());
+                    	              								
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_13);
+                    	            lv_kind_22_0=ruleValueIndexExpressionKind();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									if (current==null) {
+                    	              										current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                    	              									}
+                    	              									set(
+                    	              										current,
+                    	              										"kind",
+                    	              										lv_kind_22_0,
+                    	              										"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+                    	              									afterParserOrEnumRuleCall();
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            // InternalFormalML.g:26792:7: ( (lv_arg_23_0= rulePositionalTupleExpressionList ) )
+                    	            // InternalFormalML.g:26793:8: (lv_arg_23_0= rulePositionalTupleExpressionList )
+                    	            {
+                    	            // InternalFormalML.g:26793:8: (lv_arg_23_0= rulePositionalTupleExpressionList )
+                    	            // InternalFormalML.g:26794:9: lv_arg_23_0= rulePositionalTupleExpressionList
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0());
+                    	              								
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_110);
+                    	            lv_arg_23_0=rulePositionalTupleExpressionList();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									if (current==null) {
+                    	              										current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                    	              									}
+                    	              									set(
+                    	              										current,
+                    	              										"arg",
+                    	              										lv_arg_23_0,
+                    	              										"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+                    	              									afterParserOrEnumRuleCall();
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            otherlv_24=(Token)match(input,99,FollowSets000.FOLLOW_242); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_24, grammarAccess.getPrimaryExpressionAccess().getRightSquareBracketKeyword_2_4_3_0_2());
+                    	              						
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:26817:6: ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' )
+                    	            {
+                    	            // InternalFormalML.g:26817:6: ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' )
+                    	            // InternalFormalML.g:26818:7: ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')'
+                    	            {
+                    	            // InternalFormalML.g:26818:7: ( (lv_kind_25_0= ruleValueParameterExpressionKind ) )
+                    	            // InternalFormalML.g:26819:8: (lv_kind_25_0= ruleValueParameterExpressionKind )
+                    	            {
+                    	            // InternalFormalML.g:26819:8: (lv_kind_25_0= ruleValueParameterExpressionKind )
+                    	            // InternalFormalML.g:26820:9: lv_kind_25_0= ruleValueParameterExpressionKind
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0());
+                    	              								
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_13);
+                    	            lv_kind_25_0=ruleValueParameterExpressionKind();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									if (current==null) {
+                    	              										current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                    	              									}
+                    	              									set(
+                    	              										current,
+                    	              										"kind",
+                    	              										lv_kind_25_0,
+                    	              										"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
+                    	              									afterParserOrEnumRuleCall();
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            // InternalFormalML.g:26837:7: ( (lv_arg_26_0= ruleMixTupleExpressionList ) )
+                    	            // InternalFormalML.g:26838:8: (lv_arg_26_0= ruleMixTupleExpressionList )
+                    	            {
+                    	            // InternalFormalML.g:26838:8: (lv_arg_26_0= ruleMixTupleExpressionList )
+                    	            // InternalFormalML.g:26839:9: lv_arg_26_0= ruleMixTupleExpressionList
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0());
+                    	              								
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_99);
+                    	            lv_arg_26_0=ruleMixTupleExpressionList();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              									if (current==null) {
+                    	              										current = createModelElementForParent(grammarAccess.getPrimaryExpressionRule());
+                    	              									}
+                    	              									set(
+                    	              										current,
+                    	              										"arg",
+                    	              										lv_arg_26_0,
+                    	              										"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+                    	              									afterParserOrEnumRuleCall();
+                    	              								
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            otherlv_27=(Token)match(input,57,FollowSets000.FOLLOW_242); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              							newLeafNode(otherlv_27, grammarAccess.getPrimaryExpressionAccess().getRightParenthesisKeyword_2_4_3_1_2());
+                    	              						
+                    	            }
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop576;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimaryExpression"
+
+
+    // $ANTLR start "entryRuleBaseExpression"
+    // InternalFormalML.g:26868:1: entryRuleBaseExpression returns [EObject current=null] : iv_ruleBaseExpression= ruleBaseExpression EOF ;
+    public final EObject entryRuleBaseExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleBaseExpression = null;
+
+
+        try {
+            // InternalFormalML.g:26868:55: (iv_ruleBaseExpression= ruleBaseExpression EOF )
+            // InternalFormalML.g:26869:2: iv_ruleBaseExpression= ruleBaseExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getBaseExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleBaseExpression=ruleBaseExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleBaseExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleBaseExpression"
+
+
+    // $ANTLR start "ruleBaseExpression"
+    // InternalFormalML.g:26875:1: ruleBaseExpression returns [EObject current=null] : (this_LiteralReferenceableExpression_0= ruleLiteralReferenceableExpression | (otherlv_1= '(' this_Expression_2= ruleExpression otherlv_3= ')' ) | this_InvokeExpressionDeprecated_4= ruleInvokeExpressionDeprecated | this_InstantiationExpression_5= ruleInstantiationExpression ) ;
+    public final EObject ruleBaseExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        EObject this_LiteralReferenceableExpression_0 = null;
+
+        EObject this_Expression_2 = null;
+
+        EObject this_InvokeExpressionDeprecated_4 = null;
+
+        EObject this_InstantiationExpression_5 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26881:2: ( (this_LiteralReferenceableExpression_0= ruleLiteralReferenceableExpression | (otherlv_1= '(' this_Expression_2= ruleExpression otherlv_3= ')' ) | this_InvokeExpressionDeprecated_4= ruleInvokeExpressionDeprecated | this_InstantiationExpression_5= ruleInstantiationExpression ) )
+            // InternalFormalML.g:26882:2: (this_LiteralReferenceableExpression_0= ruleLiteralReferenceableExpression | (otherlv_1= '(' this_Expression_2= ruleExpression otherlv_3= ')' ) | this_InvokeExpressionDeprecated_4= ruleInvokeExpressionDeprecated | this_InstantiationExpression_5= ruleInstantiationExpression )
+            {
+            // InternalFormalML.g:26882:2: (this_LiteralReferenceableExpression_0= ruleLiteralReferenceableExpression | (otherlv_1= '(' this_Expression_2= ruleExpression otherlv_3= ')' ) | this_InvokeExpressionDeprecated_4= ruleInvokeExpressionDeprecated | this_InstantiationExpression_5= ruleInstantiationExpression )
+            int alt578=4;
+            switch ( input.LA(1) ) {
+            case RULE_XLIA_ID:
+            case 16:
+            case 22:
+            case 231:
+            case 232:
+            case 233:
+            case 234:
+            case 235:
+            case 236:
+            case 237:
+            case 238:
+            case 239:
+                {
+                alt578=1;
+                }
+                break;
+            case 56:
+                {
+                alt578=2;
+                }
+                break;
+            case 219:
+                {
+                alt578=3;
+                }
+                break;
+            case 224:
+                {
+                alt578=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 578, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt578) {
+                case 1 :
+                    // InternalFormalML.g:26883:3: this_LiteralReferenceableExpression_0= ruleLiteralReferenceableExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getBaseExpressionAccess().getLiteralReferenceableExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralReferenceableExpression_0=ruleLiteralReferenceableExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralReferenceableExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:26895:3: (otherlv_1= '(' this_Expression_2= ruleExpression otherlv_3= ')' )
+                    {
+                    // InternalFormalML.g:26895:3: (otherlv_1= '(' this_Expression_2= ruleExpression otherlv_3= ')' )
+                    // InternalFormalML.g:26896:4: otherlv_1= '(' this_Expression_2= ruleExpression otherlv_3= ')'
+                    {
+                    otherlv_1=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getBaseExpressionAccess().getLeftParenthesisKeyword_1_0());
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				/* */
+                      			
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      				newCompositeNode(grammarAccess.getBaseExpressionAccess().getExpressionParserRuleCall_1_1());
+                      			
+                    }
+                    pushFollow(FollowSets000.FOLLOW_99);
+                    this_Expression_2=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = this_Expression_2;
+                      				afterParserOrEnumRuleCall();
+                      			
+                    }
+                    otherlv_3=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getBaseExpressionAccess().getRightParenthesisKeyword_1_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:26917:3: this_InvokeExpressionDeprecated_4= ruleInvokeExpressionDeprecated
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getBaseExpressionAccess().getInvokeExpressionDeprecatedParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_InvokeExpressionDeprecated_4=ruleInvokeExpressionDeprecated();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_InvokeExpressionDeprecated_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:26929:3: this_InstantiationExpression_5= ruleInstantiationExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getBaseExpressionAccess().getInstantiationExpressionParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_InstantiationExpression_5=ruleInstantiationExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_InstantiationExpression_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBaseExpression"
+
+
+    // $ANTLR start "entryRuleInvokeExpressionDeprecated"
+    // InternalFormalML.g:26944:1: entryRuleInvokeExpressionDeprecated returns [EObject current=null] : iv_ruleInvokeExpressionDeprecated= ruleInvokeExpressionDeprecated EOF ;
+    public final EObject entryRuleInvokeExpressionDeprecated() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleInvokeExpressionDeprecated = null;
+
+
+        try {
+            // InternalFormalML.g:26944:67: (iv_ruleInvokeExpressionDeprecated= ruleInvokeExpressionDeprecated EOF )
+            // InternalFormalML.g:26945:2: iv_ruleInvokeExpressionDeprecated= ruleInvokeExpressionDeprecated EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleInvokeExpressionDeprecated=ruleInvokeExpressionDeprecated();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleInvokeExpressionDeprecated; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleInvokeExpressionDeprecated"
+
+
+    // $ANTLR start "ruleInvokeExpressionDeprecated"
+    // InternalFormalML.g:26951:1: ruleInvokeExpressionDeprecated returns [EObject current=null] : ( () otherlv_1= '(:' ( (lv_args_2_0= ruleExpression ) ) ( (lv_invoke_3_0= ruleLiteralReferenceElement ) ) ( (lv_args_4_0= ruleExpression ) )* otherlv_5= ')' ) ;
+    public final EObject ruleInvokeExpressionDeprecated() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_5=null;
+        EObject lv_args_2_0 = null;
+
+        EObject lv_invoke_3_0 = null;
+
+        EObject lv_args_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:26957:2: ( ( () otherlv_1= '(:' ( (lv_args_2_0= ruleExpression ) ) ( (lv_invoke_3_0= ruleLiteralReferenceElement ) ) ( (lv_args_4_0= ruleExpression ) )* otherlv_5= ')' ) )
+            // InternalFormalML.g:26958:2: ( () otherlv_1= '(:' ( (lv_args_2_0= ruleExpression ) ) ( (lv_invoke_3_0= ruleLiteralReferenceElement ) ) ( (lv_args_4_0= ruleExpression ) )* otherlv_5= ')' )
+            {
+            // InternalFormalML.g:26958:2: ( () otherlv_1= '(:' ( (lv_args_2_0= ruleExpression ) ) ( (lv_invoke_3_0= ruleLiteralReferenceElement ) ) ( (lv_args_4_0= ruleExpression ) )* otherlv_5= ')' )
+            // InternalFormalML.g:26959:3: () otherlv_1= '(:' ( (lv_args_2_0= ruleExpression ) ) ( (lv_invoke_3_0= ruleLiteralReferenceElement ) ) ( (lv_args_4_0= ruleExpression ) )* otherlv_5= ')'
+            {
+            // InternalFormalML.g:26959:3: ()
+            // InternalFormalML.g:26960:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,219,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getInvokeExpressionDeprecatedAccess().getLeftParenthesisColonKeyword_1());
+              		
+            }
+            // InternalFormalML.g:26973:3: ( (lv_args_2_0= ruleExpression ) )
+            // InternalFormalML.g:26974:4: (lv_args_2_0= ruleExpression )
+            {
+            // InternalFormalML.g:26974:4: (lv_args_2_0= ruleExpression )
+            // InternalFormalML.g:26975:5: lv_args_2_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_19);
+            lv_args_2_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getInvokeExpressionDeprecatedRule());
+              					}
+              					add(
+              						current,
+              						"args",
+              						lv_args_2_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:26992:3: ( (lv_invoke_3_0= ruleLiteralReferenceElement ) )
+            // InternalFormalML.g:26993:4: (lv_invoke_3_0= ruleLiteralReferenceElement )
+            {
+            // InternalFormalML.g:26993:4: (lv_invoke_3_0= ruleLiteralReferenceElement )
+            // InternalFormalML.g:26994:5: lv_invoke_3_0= ruleLiteralReferenceElement
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedAccess().getInvokeLiteralReferenceElementParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_220);
+            lv_invoke_3_0=ruleLiteralReferenceElement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getInvokeExpressionDeprecatedRule());
+              					}
+              					set(
+              						current,
+              						"invoke",
+              						lv_invoke_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceElement");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:27011:3: ( (lv_args_4_0= ruleExpression ) )*
+            loop579:
+            do {
+                int alt579=2;
+                int LA579_0 = input.LA(1);
+
+                if ( ((LA579_0>=RULE_XLIA_ID && LA579_0<=RULE_STRING)||LA579_0==16||LA579_0==22||(LA579_0>=26 && LA579_0<=29)||LA579_0==56||LA579_0==212||(LA579_0>=216 && LA579_0<=224)||(LA579_0>=227 && LA579_0<=239)) ) {
+                    alt579=1;
+                }
+
+
+                switch (alt579) {
+            	case 1 :
+            	    // InternalFormalML.g:27012:4: (lv_args_4_0= ruleExpression )
+            	    {
+            	    // InternalFormalML.g:27012:4: (lv_args_4_0= ruleExpression )
+            	    // InternalFormalML.g:27013:5: lv_args_4_0= ruleExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					newCompositeNode(grammarAccess.getInvokeExpressionDeprecatedAccess().getArgsExpressionParserRuleCall_4_0());
+            	      				
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_220);
+            	    lv_args_4_0=ruleExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getInvokeExpressionDeprecatedRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"args",
+            	      						lv_args_4_0,
+            	      						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+            	      					afterParserOrEnumRuleCall();
+            	      				
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop579;
+                }
+            } while (true);
+
+            otherlv_5=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_5, grammarAccess.getInvokeExpressionDeprecatedAccess().getRightParenthesisKeyword_5());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleInvokeExpressionDeprecated"
+
+
+    // $ANTLR start "entryRuleInstantiationExpression"
+    // InternalFormalML.g:27038:1: entryRuleInstantiationExpression returns [EObject current=null] : iv_ruleInstantiationExpression= ruleInstantiationExpression EOF ;
+    public final EObject entryRuleInstantiationExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleInstantiationExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27038:64: (iv_ruleInstantiationExpression= ruleInstantiationExpression EOF )
+            // InternalFormalML.g:27039:2: iv_ruleInstantiationExpression= ruleInstantiationExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getInstantiationExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleInstantiationExpression=ruleInstantiationExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleInstantiationExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleInstantiationExpression"
+
+
+    // $ANTLR start "ruleInstantiationExpression"
+    // InternalFormalML.g:27045:1: ruleInstantiationExpression returns [EObject current=null] : ( () ( (lv_instance_1_0= ruleDynamicInstanceSpecification ) ) otherlv_2= ';' ) ;
+    public final EObject ruleInstantiationExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        EObject lv_instance_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27051:2: ( ( () ( (lv_instance_1_0= ruleDynamicInstanceSpecification ) ) otherlv_2= ';' ) )
+            // InternalFormalML.g:27052:2: ( () ( (lv_instance_1_0= ruleDynamicInstanceSpecification ) ) otherlv_2= ';' )
+            {
+            // InternalFormalML.g:27052:2: ( () ( (lv_instance_1_0= ruleDynamicInstanceSpecification ) ) otherlv_2= ';' )
+            // InternalFormalML.g:27053:3: () ( (lv_instance_1_0= ruleDynamicInstanceSpecification ) ) otherlv_2= ';'
+            {
+            // InternalFormalML.g:27053:3: ()
+            // InternalFormalML.g:27054:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getInstantiationExpressionAccess().getInstantiationExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:27063:3: ( (lv_instance_1_0= ruleDynamicInstanceSpecification ) )
+            // InternalFormalML.g:27064:4: (lv_instance_1_0= ruleDynamicInstanceSpecification )
+            {
+            // InternalFormalML.g:27064:4: (lv_instance_1_0= ruleDynamicInstanceSpecification )
+            // InternalFormalML.g:27065:5: lv_instance_1_0= ruleDynamicInstanceSpecification
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getInstantiationExpressionAccess().getInstanceDynamicInstanceSpecificationParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_14);
+            lv_instance_1_0=ruleDynamicInstanceSpecification();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getInstantiationExpressionRule());
+              					}
+              					set(
+              						current,
+              						"instance",
+              						lv_instance_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.DynamicInstanceSpecification");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getInstantiationExpressionAccess().getSemicolonKeyword_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleInstantiationExpression"
+
+
+    // $ANTLR start "entryRuleDynamicInstanceSpecification"
+    // InternalFormalML.g:27090:1: entryRuleDynamicInstanceSpecification returns [EObject current=null] : iv_ruleDynamicInstanceSpecification= ruleDynamicInstanceSpecification EOF ;
+    public final EObject entryRuleDynamicInstanceSpecification() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDynamicInstanceSpecification = null;
+
+
+        try {
+            // InternalFormalML.g:27090:69: (iv_ruleDynamicInstanceSpecification= ruleDynamicInstanceSpecification EOF )
+            // InternalFormalML.g:27091:2: iv_ruleDynamicInstanceSpecification= ruleDynamicInstanceSpecification EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDynamicInstanceSpecificationRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleDynamicInstanceSpecification=ruleDynamicInstanceSpecification();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDynamicInstanceSpecification; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDynamicInstanceSpecification"
+
+
+    // $ANTLR start "ruleDynamicInstanceSpecification"
+    // InternalFormalML.g:27097:1: ruleDynamicInstanceSpecification returns [EObject current=null] : ( () otherlv_1= 'new' ( ( ruleESIdentifier ) ) ( (otherlv_3= '(' ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )? otherlv_7= ')' ) | (otherlv_8= '{' ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )* otherlv_11= '}' ) )? ) ;
+    public final EObject ruleDynamicInstanceSpecification() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        EObject lv_slot_4_0 = null;
+
+        EObject lv_slot_6_0 = null;
+
+        EObject lv_slot_9_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27103:2: ( ( () otherlv_1= 'new' ( ( ruleESIdentifier ) ) ( (otherlv_3= '(' ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )? otherlv_7= ')' ) | (otherlv_8= '{' ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )* otherlv_11= '}' ) )? ) )
+            // InternalFormalML.g:27104:2: ( () otherlv_1= 'new' ( ( ruleESIdentifier ) ) ( (otherlv_3= '(' ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )? otherlv_7= ')' ) | (otherlv_8= '{' ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )* otherlv_11= '}' ) )? )
+            {
+            // InternalFormalML.g:27104:2: ( () otherlv_1= 'new' ( ( ruleESIdentifier ) ) ( (otherlv_3= '(' ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )? otherlv_7= ')' ) | (otherlv_8= '{' ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )* otherlv_11= '}' ) )? )
+            // InternalFormalML.g:27105:3: () otherlv_1= 'new' ( ( ruleESIdentifier ) ) ( (otherlv_3= '(' ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )? otherlv_7= ')' ) | (otherlv_8= '{' ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )* otherlv_11= '}' ) )?
+            {
+            // InternalFormalML.g:27105:3: ()
+            // InternalFormalML.g:27106:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getDynamicInstanceSpecificationAccess().getInstanceMachineAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,224,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getDynamicInstanceSpecificationAccess().getNewKeyword_1());
+              		
+            }
+            // InternalFormalML.g:27119:3: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:27120:4: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:27120:4: ( ruleESIdentifier )
+            // InternalFormalML.g:27121:5: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					/* */
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDynamicInstanceSpecificationRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getDynamicInstanceSpecificationAccess().getModelMachineCrossReference_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_243);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:27138:3: ( (otherlv_3= '(' ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )? otherlv_7= ')' ) | (otherlv_8= '{' ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )* otherlv_11= '}' ) )?
+            int alt583=3;
+            int LA583_0 = input.LA(1);
+
+            if ( (LA583_0==56) ) {
+                alt583=1;
+            }
+            else if ( (LA583_0==22) ) {
+                alt583=2;
+            }
+            switch (alt583) {
+                case 1 :
+                    // InternalFormalML.g:27139:4: (otherlv_3= '(' ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )? otherlv_7= ')' )
+                    {
+                    // InternalFormalML.g:27139:4: (otherlv_3= '(' ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )? otherlv_7= ')' )
+                    // InternalFormalML.g:27140:5: otherlv_3= '(' ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )? otherlv_7= ')'
+                    {
+                    otherlv_3=(Token)match(input,56,FollowSets000.FOLLOW_38); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_3, grammarAccess.getDynamicInstanceSpecificationAccess().getLeftParenthesisKeyword_3_0_0());
+                      				
+                    }
+                    // InternalFormalML.g:27144:5: ( ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )* )?
+                    int alt581=2;
+                    int LA581_0 = input.LA(1);
+
+                    if ( (LA581_0==RULE_XLIA_ID) ) {
+                        alt581=1;
+                    }
+                    switch (alt581) {
+                        case 1 :
+                            // InternalFormalML.g:27145:6: ( (lv_slot_4_0= ruleSlotParameter ) ) (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )*
+                            {
+                            // InternalFormalML.g:27145:6: ( (lv_slot_4_0= ruleSlotParameter ) )
+                            // InternalFormalML.g:27146:7: (lv_slot_4_0= ruleSlotParameter )
+                            {
+                            // InternalFormalML.g:27146:7: (lv_slot_4_0= ruleSlotParameter )
+                            // InternalFormalML.g:27147:8: lv_slot_4_0= ruleSlotParameter
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              								newCompositeNode(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_0_0());
+                              							
+                            }
+                            pushFollow(FollowSets000.FOLLOW_39);
+                            lv_slot_4_0=ruleSlotParameter();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getDynamicInstanceSpecificationRule());
+                              								}
+                              								add(
+                              									current,
+                              									"slot",
+                              									lv_slot_4_0,
+                              									"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
+                              								afterParserOrEnumRuleCall();
+                              							
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalFormalML.g:27164:6: (otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) ) )*
+                            loop580:
+                            do {
+                                int alt580=2;
+                                int LA580_0 = input.LA(1);
+
+                                if ( (LA580_0==20) ) {
+                                    alt580=1;
+                                }
+
+
+                                switch (alt580) {
+                            	case 1 :
+                            	    // InternalFormalML.g:27165:7: otherlv_5= ',' ( (lv_slot_6_0= ruleSlotParameter ) )
+                            	    {
+                            	    otherlv_5=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      							newLeafNode(otherlv_5, grammarAccess.getDynamicInstanceSpecificationAccess().getCommaKeyword_3_0_1_1_0());
+                            	      						
+                            	    }
+                            	    // InternalFormalML.g:27169:7: ( (lv_slot_6_0= ruleSlotParameter ) )
+                            	    // InternalFormalML.g:27170:8: (lv_slot_6_0= ruleSlotParameter )
+                            	    {
+                            	    // InternalFormalML.g:27170:8: (lv_slot_6_0= ruleSlotParameter )
+                            	    // InternalFormalML.g:27171:9: lv_slot_6_0= ruleSlotParameter
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									newCompositeNode(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotParameterParserRuleCall_3_0_1_1_1_0());
+                            	      								
+                            	    }
+                            	    pushFollow(FollowSets000.FOLLOW_39);
+                            	    lv_slot_6_0=ruleSlotParameter();
+
+                            	    state._fsp--;
+                            	    if (state.failed) return current;
+                            	    if ( state.backtracking==0 ) {
+
+                            	      									if (current==null) {
+                            	      										current = createModelElementForParent(grammarAccess.getDynamicInstanceSpecificationRule());
+                            	      									}
+                            	      									add(
+                            	      										current,
+                            	      										"slot",
+                            	      										lv_slot_6_0,
+                            	      										"org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
+                            	      									afterParserOrEnumRuleCall();
+                            	      								
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop580;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_7=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_7, grammarAccess.getDynamicInstanceSpecificationAccess().getRightParenthesisKeyword_3_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:27196:4: (otherlv_8= '{' ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )* otherlv_11= '}' )
+                    {
+                    // InternalFormalML.g:27196:4: (otherlv_8= '{' ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )* otherlv_11= '}' )
+                    // InternalFormalML.g:27197:5: otherlv_8= '{' ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )* otherlv_11= '}'
+                    {
+                    otherlv_8=(Token)match(input,22,FollowSets000.FOLLOW_11); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_8, grammarAccess.getDynamicInstanceSpecificationAccess().getLeftCurlyBracketKeyword_3_1_0());
+                      				
+                    }
+                    // InternalFormalML.g:27201:5: ( ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';' )*
+                    loop582:
+                    do {
+                        int alt582=2;
+                        int LA582_0 = input.LA(1);
+
+                        if ( (LA582_0==RULE_XLIA_ID) ) {
+                            alt582=1;
+                        }
+
+
+                        switch (alt582) {
+                    	case 1 :
+                    	    // InternalFormalML.g:27202:6: ( (lv_slot_9_0= ruleSlotProperty ) ) otherlv_10= ';'
+                    	    {
+                    	    // InternalFormalML.g:27202:6: ( (lv_slot_9_0= ruleSlotProperty ) )
+                    	    // InternalFormalML.g:27203:7: (lv_slot_9_0= ruleSlotProperty )
+                    	    {
+                    	    // InternalFormalML.g:27203:7: (lv_slot_9_0= ruleSlotProperty )
+                    	    // InternalFormalML.g:27204:8: lv_slot_9_0= ruleSlotProperty
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								newCompositeNode(grammarAccess.getDynamicInstanceSpecificationAccess().getSlotSlotPropertyParserRuleCall_3_1_1_0_0());
+                    	      							
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_14);
+                    	    lv_slot_9_0=ruleSlotProperty();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      								if (current==null) {
+                    	      									current = createModelElementForParent(grammarAccess.getDynamicInstanceSpecificationRule());
+                    	      								}
+                    	      								add(
+                    	      									current,
+                    	      									"slot",
+                    	      									lv_slot_9_0,
+                    	      									"org.eclipse.efm.formalml.xtext.FormalML.SlotProperty");
+                    	      								afterParserOrEnumRuleCall();
+                    	      							
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    otherlv_10=(Token)match(input,25,FollowSets000.FOLLOW_11); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						newLeafNode(otherlv_10, grammarAccess.getDynamicInstanceSpecificationAccess().getSemicolonKeyword_3_1_1_1());
+                    	      					
+                    	    }
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop582;
+                        }
+                    } while (true);
+
+                    otherlv_11=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_11, grammarAccess.getDynamicInstanceSpecificationAccess().getRightCurlyBracketKeyword_3_1_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDynamicInstanceSpecification"
+
+
+    // $ANTLR start "entryRuleTupleParameterExpression"
+    // InternalFormalML.g:27236:1: entryRuleTupleParameterExpression returns [EObject current=null] : iv_ruleTupleParameterExpression= ruleTupleParameterExpression EOF ;
+    public final EObject entryRuleTupleParameterExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleTupleParameterExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27236:65: (iv_ruleTupleParameterExpression= ruleTupleParameterExpression EOF )
+            // InternalFormalML.g:27237:2: iv_ruleTupleParameterExpression= ruleTupleParameterExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getTupleParameterExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleTupleParameterExpression=ruleTupleParameterExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleTupleParameterExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleTupleParameterExpression"
+
+
+    // $ANTLR start "ruleTupleParameterExpression"
+    // InternalFormalML.g:27243:1: ruleTupleParameterExpression returns [EObject current=null] : (otherlv_0= '(' this_MixTupleExpressionList_1= ruleMixTupleExpressionList otherlv_2= ')' ) ;
+    public final EObject ruleTupleParameterExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        EObject this_MixTupleExpressionList_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27249:2: ( (otherlv_0= '(' this_MixTupleExpressionList_1= ruleMixTupleExpressionList otherlv_2= ')' ) )
+            // InternalFormalML.g:27250:2: (otherlv_0= '(' this_MixTupleExpressionList_1= ruleMixTupleExpressionList otherlv_2= ')' )
+            {
+            // InternalFormalML.g:27250:2: (otherlv_0= '(' this_MixTupleExpressionList_1= ruleMixTupleExpressionList otherlv_2= ')' )
+            // InternalFormalML.g:27251:3: otherlv_0= '(' this_MixTupleExpressionList_1= ruleMixTupleExpressionList otherlv_2= ')'
+            {
+            otherlv_0=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_0, grammarAccess.getTupleParameterExpressionAccess().getLeftParenthesisKeyword_0());
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getTupleParameterExpressionAccess().getMixTupleExpressionListParserRuleCall_1());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_99);
+            this_MixTupleExpressionList_1=ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_MixTupleExpressionList_1;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            otherlv_2=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getTupleParameterExpressionAccess().getRightParenthesisKeyword_2());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTupleParameterExpression"
+
+
+    // $ANTLR start "entryRuleMixTupleExpressionList"
+    // InternalFormalML.g:27274:1: entryRuleMixTupleExpressionList returns [EObject current=null] : iv_ruleMixTupleExpressionList= ruleMixTupleExpressionList EOF ;
+    public final EObject entryRuleMixTupleExpressionList() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleMixTupleExpressionList = null;
+
+
+        try {
+            // InternalFormalML.g:27274:63: (iv_ruleMixTupleExpressionList= ruleMixTupleExpressionList EOF )
+            // InternalFormalML.g:27275:2: iv_ruleMixTupleExpressionList= ruleMixTupleExpressionList EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getMixTupleExpressionListRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleMixTupleExpressionList=ruleMixTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleMixTupleExpressionList; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleMixTupleExpressionList"
+
+
+    // $ANTLR start "ruleMixTupleExpressionList"
+    // InternalFormalML.g:27281:1: ruleMixTupleExpressionList returns [EObject current=null] : ( () ( ( (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression ) ) ) (otherlv_2= ',' ( ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) ) ) )* ) ;
+    public final EObject ruleMixTupleExpressionList() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        EObject lv_value_1_1 = null;
+
+        EObject lv_value_1_2 = null;
+
+        EObject lv_value_3_1 = null;
+
+        EObject lv_value_3_2 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27287:2: ( ( () ( ( (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression ) ) ) (otherlv_2= ',' ( ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) ) ) )* ) )
+            // InternalFormalML.g:27288:2: ( () ( ( (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression ) ) ) (otherlv_2= ',' ( ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) ) ) )* )
+            {
+            // InternalFormalML.g:27288:2: ( () ( ( (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression ) ) ) (otherlv_2= ',' ( ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) ) ) )* )
+            // InternalFormalML.g:27289:3: () ( ( (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression ) ) ) (otherlv_2= ',' ( ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) ) ) )*
+            {
+            // InternalFormalML.g:27289:3: ()
+            // InternalFormalML.g:27290:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getMixTupleExpressionListAccess().getMixTupleExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:27299:3: ( ( (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression ) ) )
+            // InternalFormalML.g:27300:4: ( (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression ) )
+            {
+            // InternalFormalML.g:27300:4: ( (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression ) )
+            // InternalFormalML.g:27301:5: (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression )
+            {
+            // InternalFormalML.g:27301:5: (lv_value_1_1= ruleExpression | lv_value_1_2= ruleNamedExpression )
+            int alt584=2;
+            int LA584_0 = input.LA(1);
+
+            if ( (LA584_0==RULE_XLIA_ID) ) {
+                int LA584_1 = input.LA(2);
+
+                if ( (LA584_1==EOF||LA584_1==16||LA584_1==20||(LA584_1>=24 && LA584_1<=25)||(LA584_1>=28 && LA584_1<=29)||(LA584_1>=35 && LA584_1<=37)||(LA584_1>=56 && LA584_1<=57)||LA584_1==59||LA584_1==92||(LA584_1>=97 && LA584_1<=98)||LA584_1==145||(LA584_1>=149 && LA584_1<=150)||(LA584_1>=183 && LA584_1<=217)) ) {
+                    alt584=1;
+                }
+                else if ( (LA584_1==30||(LA584_1>=225 && LA584_1<=226)) ) {
+                    alt584=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 584, 1, input);
+
+                    throw nvae;
+                }
+            }
+            else if ( ((LA584_0>=RULE_INT && LA584_0<=RULE_STRING)||LA584_0==16||LA584_0==22||(LA584_0>=26 && LA584_0<=29)||LA584_0==56||LA584_0==212||(LA584_0>=216 && LA584_0<=224)||(LA584_0>=227 && LA584_0<=239)) ) {
+                alt584=1;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 584, 0, input);
+
+                throw nvae;
+            }
+            switch (alt584) {
+                case 1 :
+                    // InternalFormalML.g:27302:6: lv_value_1_1= ruleExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_1_0_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_8);
+                    lv_value_1_1=ruleExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
+                      						}
+                      						add(
+                      							current,
+                      							"value",
+                      							lv_value_1_1,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:27318:6: lv_value_1_2= ruleNamedExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_1_0_1());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_8);
+                    lv_value_1_2=ruleNamedExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
+                      						}
+                      						add(
+                      							current,
+                      							"value",
+                      							lv_value_1_2,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:27336:3: (otherlv_2= ',' ( ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) ) ) )*
+            loop586:
+            do {
+                int alt586=2;
+                int LA586_0 = input.LA(1);
+
+                if ( (LA586_0==20) ) {
+                    alt586=1;
+                }
+
+
+                switch (alt586) {
+            	case 1 :
+            	    // InternalFormalML.g:27337:4: otherlv_2= ',' ( ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) ) )
+            	    {
+            	    otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_2, grammarAccess.getMixTupleExpressionListAccess().getCommaKeyword_2_0());
+            	      			
+            	    }
+            	    // InternalFormalML.g:27341:4: ( ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) ) )
+            	    // InternalFormalML.g:27342:5: ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) )
+            	    {
+            	    // InternalFormalML.g:27342:5: ( (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression ) )
+            	    // InternalFormalML.g:27343:6: (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression )
+            	    {
+            	    // InternalFormalML.g:27343:6: (lv_value_3_1= ruleExpression | lv_value_3_2= ruleNamedExpression )
+            	    int alt585=2;
+            	    int LA585_0 = input.LA(1);
+
+            	    if ( (LA585_0==RULE_XLIA_ID) ) {
+            	        int LA585_1 = input.LA(2);
+
+            	        if ( (LA585_1==30||(LA585_1>=225 && LA585_1<=226)) ) {
+            	            alt585=2;
+            	        }
+            	        else if ( (LA585_1==EOF||LA585_1==16||LA585_1==20||(LA585_1>=24 && LA585_1<=25)||(LA585_1>=28 && LA585_1<=29)||(LA585_1>=35 && LA585_1<=37)||(LA585_1>=56 && LA585_1<=57)||LA585_1==59||LA585_1==92||(LA585_1>=97 && LA585_1<=98)||LA585_1==145||(LA585_1>=149 && LA585_1<=150)||(LA585_1>=183 && LA585_1<=217)) ) {
+            	            alt585=1;
+            	        }
+            	        else {
+            	            if (state.backtracking>0) {state.failed=true; return current;}
+            	            NoViableAltException nvae =
+            	                new NoViableAltException("", 585, 1, input);
+
+            	            throw nvae;
+            	        }
+            	    }
+            	    else if ( ((LA585_0>=RULE_INT && LA585_0<=RULE_STRING)||LA585_0==16||LA585_0==22||(LA585_0>=26 && LA585_0<=29)||LA585_0==56||LA585_0==212||(LA585_0>=216 && LA585_0<=224)||(LA585_0>=227 && LA585_0<=239)) ) {
+            	        alt585=1;
+            	    }
+            	    else {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 585, 0, input);
+
+            	        throw nvae;
+            	    }
+            	    switch (alt585) {
+            	        case 1 :
+            	            // InternalFormalML.g:27344:7: lv_value_3_1= ruleExpression
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              							newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueExpressionParserRuleCall_2_1_0_0());
+            	              						
+            	            }
+            	            pushFollow(FollowSets000.FOLLOW_8);
+            	            lv_value_3_1=ruleExpression();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              							if (current==null) {
+            	              								current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
+            	              							}
+            	              							add(
+            	              								current,
+            	              								"value",
+            	              								lv_value_3_1,
+            	              								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+            	              							afterParserOrEnumRuleCall();
+            	              						
+            	            }
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalFormalML.g:27360:7: lv_value_3_2= ruleNamedExpression
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              							newCompositeNode(grammarAccess.getMixTupleExpressionListAccess().getValueNamedExpressionParserRuleCall_2_1_0_1());
+            	              						
+            	            }
+            	            pushFollow(FollowSets000.FOLLOW_8);
+            	            lv_value_3_2=ruleNamedExpression();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              							if (current==null) {
+            	              								current = createModelElementForParent(grammarAccess.getMixTupleExpressionListRule());
+            	              							}
+            	              							add(
+            	              								current,
+            	              								"value",
+            	              								lv_value_3_2,
+            	              								"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
+            	              							afterParserOrEnumRuleCall();
+            	              						
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop586;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleMixTupleExpressionList"
+
+
+    // $ANTLR start "entryRulePositionalTupleExpressionList"
+    // InternalFormalML.g:27383:1: entryRulePositionalTupleExpressionList returns [EObject current=null] : iv_rulePositionalTupleExpressionList= rulePositionalTupleExpressionList EOF ;
+    public final EObject entryRulePositionalTupleExpressionList() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePositionalTupleExpressionList = null;
+
+
+        try {
+            // InternalFormalML.g:27383:70: (iv_rulePositionalTupleExpressionList= rulePositionalTupleExpressionList EOF )
+            // InternalFormalML.g:27384:2: iv_rulePositionalTupleExpressionList= rulePositionalTupleExpressionList EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPositionalTupleExpressionListRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_rulePositionalTupleExpressionList=rulePositionalTupleExpressionList();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePositionalTupleExpressionList; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePositionalTupleExpressionList"
+
+
+    // $ANTLR start "rulePositionalTupleExpressionList"
+    // InternalFormalML.g:27390:1: rulePositionalTupleExpressionList returns [EObject current=null] : ( ( (lv_value_0_0= ruleExpression ) ) (otherlv_1= ',' ( (lv_value_2_0= ruleExpression ) ) )* ) ;
+    public final EObject rulePositionalTupleExpressionList() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_value_0_0 = null;
+
+        EObject lv_value_2_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27396:2: ( ( ( (lv_value_0_0= ruleExpression ) ) (otherlv_1= ',' ( (lv_value_2_0= ruleExpression ) ) )* ) )
+            // InternalFormalML.g:27397:2: ( ( (lv_value_0_0= ruleExpression ) ) (otherlv_1= ',' ( (lv_value_2_0= ruleExpression ) ) )* )
+            {
+            // InternalFormalML.g:27397:2: ( ( (lv_value_0_0= ruleExpression ) ) (otherlv_1= ',' ( (lv_value_2_0= ruleExpression ) ) )* )
+            // InternalFormalML.g:27398:3: ( (lv_value_0_0= ruleExpression ) ) (otherlv_1= ',' ( (lv_value_2_0= ruleExpression ) ) )*
+            {
+            // InternalFormalML.g:27398:3: ( (lv_value_0_0= ruleExpression ) )
+            // InternalFormalML.g:27399:4: (lv_value_0_0= ruleExpression )
+            {
+            // InternalFormalML.g:27399:4: (lv_value_0_0= ruleExpression )
+            // InternalFormalML.g:27400:5: lv_value_0_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_0_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_8);
+            lv_value_0_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPositionalTupleExpressionListRule());
+              					}
+              					add(
+              						current,
+              						"value",
+              						lv_value_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:27417:3: (otherlv_1= ',' ( (lv_value_2_0= ruleExpression ) ) )*
+            loop587:
+            do {
+                int alt587=2;
+                int LA587_0 = input.LA(1);
+
+                if ( (LA587_0==20) ) {
+                    alt587=1;
+                }
+
+
+                switch (alt587) {
+            	case 1 :
+            	    // InternalFormalML.g:27418:4: otherlv_1= ',' ( (lv_value_2_0= ruleExpression ) )
+            	    {
+            	    otherlv_1=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_1, grammarAccess.getPositionalTupleExpressionListAccess().getCommaKeyword_1_0());
+            	      			
+            	    }
+            	    // InternalFormalML.g:27422:4: ( (lv_value_2_0= ruleExpression ) )
+            	    // InternalFormalML.g:27423:5: (lv_value_2_0= ruleExpression )
+            	    {
+            	    // InternalFormalML.g:27423:5: (lv_value_2_0= ruleExpression )
+            	    // InternalFormalML.g:27424:6: lv_value_2_0= ruleExpression
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getPositionalTupleExpressionListAccess().getValueExpressionParserRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_8);
+            	    lv_value_2_0=ruleExpression();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getPositionalTupleExpressionListRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"value",
+            	      							lv_value_2_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop587;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePositionalTupleExpressionList"
+
+
+    // $ANTLR start "entryRuleNamedExpression"
+    // InternalFormalML.g:27446:1: entryRuleNamedExpression returns [EObject current=null] : iv_ruleNamedExpression= ruleNamedExpression EOF ;
+    public final EObject entryRuleNamedExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleNamedExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27446:56: (iv_ruleNamedExpression= ruleNamedExpression EOF )
+            // InternalFormalML.g:27447:2: iv_ruleNamedExpression= ruleNamedExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getNamedExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleNamedExpression=ruleNamedExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleNamedExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleNamedExpression"
+
+
+    // $ANTLR start "ruleNamedExpression"
+    // InternalFormalML.g:27453:1: ruleNamedExpression returns [EObject current=null] : ( ( (lv_name_0_0= RULE_XLIA_ID ) ) (otherlv_1= ':' | otherlv_2= '=>' | otherlv_3= '<-' ) ( (lv_expression_4_0= ruleExpression ) ) ) ;
+    public final EObject ruleNamedExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_name_0_0=null;
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        EObject lv_expression_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27459:2: ( ( ( (lv_name_0_0= RULE_XLIA_ID ) ) (otherlv_1= ':' | otherlv_2= '=>' | otherlv_3= '<-' ) ( (lv_expression_4_0= ruleExpression ) ) ) )
+            // InternalFormalML.g:27460:2: ( ( (lv_name_0_0= RULE_XLIA_ID ) ) (otherlv_1= ':' | otherlv_2= '=>' | otherlv_3= '<-' ) ( (lv_expression_4_0= ruleExpression ) ) )
+            {
+            // InternalFormalML.g:27460:2: ( ( (lv_name_0_0= RULE_XLIA_ID ) ) (otherlv_1= ':' | otherlv_2= '=>' | otherlv_3= '<-' ) ( (lv_expression_4_0= ruleExpression ) ) )
+            // InternalFormalML.g:27461:3: ( (lv_name_0_0= RULE_XLIA_ID ) ) (otherlv_1= ':' | otherlv_2= '=>' | otherlv_3= '<-' ) ( (lv_expression_4_0= ruleExpression ) )
+            {
+            // InternalFormalML.g:27461:3: ( (lv_name_0_0= RULE_XLIA_ID ) )
+            // InternalFormalML.g:27462:4: (lv_name_0_0= RULE_XLIA_ID )
+            {
+            // InternalFormalML.g:27462:4: (lv_name_0_0= RULE_XLIA_ID )
+            // InternalFormalML.g:27463:5: lv_name_0_0= RULE_XLIA_ID
+            {
+            lv_name_0_0=(Token)match(input,RULE_XLIA_ID,FollowSets000.FOLLOW_244); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_name_0_0, grammarAccess.getNamedExpressionAccess().getNameXLIA_IDTerminalRuleCall_0_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getNamedExpressionRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"name",
+              						lv_name_0_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:27479:3: (otherlv_1= ':' | otherlv_2= '=>' | otherlv_3= '<-' )
+            int alt588=3;
+            switch ( input.LA(1) ) {
+            case 30:
+                {
+                alt588=1;
+                }
+                break;
+            case 225:
+                {
+                alt588=2;
+                }
+                break;
+            case 226:
+                {
+                alt588=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 588, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt588) {
+                case 1 :
+                    // InternalFormalML.g:27480:4: otherlv_1= ':'
+                    {
+                    otherlv_1=(Token)match(input,30,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getNamedExpressionAccess().getColonKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:27485:4: otherlv_2= '=>'
+                    {
+                    otherlv_2=(Token)match(input,225,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getNamedExpressionAccess().getEqualsSignGreaterThanSignKeyword_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:27490:4: otherlv_3= '<-'
+                    {
+                    otherlv_3=(Token)match(input,226,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getNamedExpressionAccess().getLessThanSignHyphenMinusKeyword_1_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalFormalML.g:27495:3: ( (lv_expression_4_0= ruleExpression ) )
+            // InternalFormalML.g:27496:4: (lv_expression_4_0= ruleExpression )
+            {
+            // InternalFormalML.g:27496:4: (lv_expression_4_0= ruleExpression )
+            // InternalFormalML.g:27497:5: lv_expression_4_0= ruleExpression
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getNamedExpressionAccess().getExpressionExpressionParserRuleCall_2_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_expression_4_0=ruleExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getNamedExpressionRule());
+              					}
+              					set(
+              						current,
+              						"expression",
+              						lv_expression_4_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleNamedExpression"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceableExpression"
+    // InternalFormalML.g:27518:1: entryRuleLiteralReferenceableExpression returns [EObject current=null] : iv_ruleLiteralReferenceableExpression= ruleLiteralReferenceableExpression EOF ;
+    public final EObject entryRuleLiteralReferenceableExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralReferenceableExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27518:71: (iv_ruleLiteralReferenceableExpression= ruleLiteralReferenceableExpression EOF )
+            // InternalFormalML.g:27519:2: iv_ruleLiteralReferenceableExpression= ruleLiteralReferenceableExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralReferenceableExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralReferenceableExpression=ruleLiteralReferenceableExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralReferenceableExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceableExpression"
+
+
+    // $ANTLR start "ruleLiteralReferenceableExpression"
+    // InternalFormalML.g:27525:1: ruleLiteralReferenceableExpression returns [EObject current=null] : (this_LiteralCollectionExpression_0= ruleLiteralCollectionExpression | this_LiteralReferenceExpression_1= ruleLiteralReferenceExpression ) ;
+    public final EObject ruleLiteralReferenceableExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralCollectionExpression_0 = null;
+
+        EObject this_LiteralReferenceExpression_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27531:2: ( (this_LiteralCollectionExpression_0= ruleLiteralCollectionExpression | this_LiteralReferenceExpression_1= ruleLiteralReferenceExpression ) )
+            // InternalFormalML.g:27532:2: (this_LiteralCollectionExpression_0= ruleLiteralCollectionExpression | this_LiteralReferenceExpression_1= ruleLiteralReferenceExpression )
+            {
+            // InternalFormalML.g:27532:2: (this_LiteralCollectionExpression_0= ruleLiteralCollectionExpression | this_LiteralReferenceExpression_1= ruleLiteralReferenceExpression )
+            int alt589=2;
+            int LA589_0 = input.LA(1);
+
+            if ( (LA589_0==16||LA589_0==22) ) {
+                alt589=1;
+            }
+            else if ( (LA589_0==RULE_XLIA_ID||(LA589_0>=231 && LA589_0<=239)) ) {
+                alt589=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 589, 0, input);
+
+                throw nvae;
+            }
+            switch (alt589) {
+                case 1 :
+                    // InternalFormalML.g:27533:3: this_LiteralCollectionExpression_0= ruleLiteralCollectionExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralCollectionExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralCollectionExpression_0=ruleLiteralCollectionExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralCollectionExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:27545:3: this_LiteralReferenceExpression_1= ruleLiteralReferenceExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceableExpressionAccess().getLiteralReferenceExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralReferenceExpression_1=ruleLiteralReferenceExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralReferenceExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralReferenceableExpression"
+
+
+    // $ANTLR start "entryRuleLiteralTerminalExpression"
+    // InternalFormalML.g:27560:1: entryRuleLiteralTerminalExpression returns [EObject current=null] : iv_ruleLiteralTerminalExpression= ruleLiteralTerminalExpression EOF ;
+    public final EObject entryRuleLiteralTerminalExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralTerminalExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27560:66: (iv_ruleLiteralTerminalExpression= ruleLiteralTerminalExpression EOF )
+            // InternalFormalML.g:27561:2: iv_ruleLiteralTerminalExpression= ruleLiteralTerminalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralTerminalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralTerminalExpression=ruleLiteralTerminalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralTerminalExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralTerminalExpression"
+
+
+    // $ANTLR start "ruleLiteralTerminalExpression"
+    // InternalFormalML.g:27567:1: ruleLiteralTerminalExpression returns [EObject current=null] : (this_LiteralBooleanExpression_0= ruleLiteralBooleanExpression | this_LiteralIntegerExpression_1= ruleLiteralIntegerExpression | this_LiteralRationalExpression_2= ruleLiteralRationalExpression | this_LiteralFloatExpression_3= ruleLiteralFloatExpression | this_LiteralCharacterExpression_4= ruleLiteralCharacterExpression | this_LiteralStringExpression_5= ruleLiteralStringExpression | this_LiteralNullExpression_6= ruleLiteralNullExpression ) ;
+    public final EObject ruleLiteralTerminalExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralBooleanExpression_0 = null;
+
+        EObject this_LiteralIntegerExpression_1 = null;
+
+        EObject this_LiteralRationalExpression_2 = null;
+
+        EObject this_LiteralFloatExpression_3 = null;
+
+        EObject this_LiteralCharacterExpression_4 = null;
+
+        EObject this_LiteralStringExpression_5 = null;
+
+        EObject this_LiteralNullExpression_6 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27573:2: ( (this_LiteralBooleanExpression_0= ruleLiteralBooleanExpression | this_LiteralIntegerExpression_1= ruleLiteralIntegerExpression | this_LiteralRationalExpression_2= ruleLiteralRationalExpression | this_LiteralFloatExpression_3= ruleLiteralFloatExpression | this_LiteralCharacterExpression_4= ruleLiteralCharacterExpression | this_LiteralStringExpression_5= ruleLiteralStringExpression | this_LiteralNullExpression_6= ruleLiteralNullExpression ) )
+            // InternalFormalML.g:27574:2: (this_LiteralBooleanExpression_0= ruleLiteralBooleanExpression | this_LiteralIntegerExpression_1= ruleLiteralIntegerExpression | this_LiteralRationalExpression_2= ruleLiteralRationalExpression | this_LiteralFloatExpression_3= ruleLiteralFloatExpression | this_LiteralCharacterExpression_4= ruleLiteralCharacterExpression | this_LiteralStringExpression_5= ruleLiteralStringExpression | this_LiteralNullExpression_6= ruleLiteralNullExpression )
+            {
+            // InternalFormalML.g:27574:2: (this_LiteralBooleanExpression_0= ruleLiteralBooleanExpression | this_LiteralIntegerExpression_1= ruleLiteralIntegerExpression | this_LiteralRationalExpression_2= ruleLiteralRationalExpression | this_LiteralFloatExpression_3= ruleLiteralFloatExpression | this_LiteralCharacterExpression_4= ruleLiteralCharacterExpression | this_LiteralStringExpression_5= ruleLiteralStringExpression | this_LiteralNullExpression_6= ruleLiteralNullExpression )
+            int alt590=7;
+            alt590 = dfa590.predict(input);
+            switch (alt590) {
+                case 1 :
+                    // InternalFormalML.g:27575:3: this_LiteralBooleanExpression_0= ruleLiteralBooleanExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralBooleanExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralBooleanExpression_0=ruleLiteralBooleanExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralBooleanExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:27587:3: this_LiteralIntegerExpression_1= ruleLiteralIntegerExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralIntegerExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralIntegerExpression_1=ruleLiteralIntegerExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralIntegerExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:27599:3: this_LiteralRationalExpression_2= ruleLiteralRationalExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralRationalExpressionParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralRationalExpression_2=ruleLiteralRationalExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralRationalExpression_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:27611:3: this_LiteralFloatExpression_3= ruleLiteralFloatExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralFloatExpressionParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralFloatExpression_3=ruleLiteralFloatExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralFloatExpression_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:27623:3: this_LiteralCharacterExpression_4= ruleLiteralCharacterExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralCharacterExpressionParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralCharacterExpression_4=ruleLiteralCharacterExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralCharacterExpression_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:27635:3: this_LiteralStringExpression_5= ruleLiteralStringExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralStringExpressionParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralStringExpression_5=ruleLiteralStringExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralStringExpression_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:27647:3: this_LiteralNullExpression_6= ruleLiteralNullExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralTerminalExpressionAccess().getLiteralNullExpressionParserRuleCall_6());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralNullExpression_6=ruleLiteralNullExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralNullExpression_6;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralTerminalExpression"
+
+
+    // $ANTLR start "entryRuleLiteralBooleanExpression"
+    // InternalFormalML.g:27662:1: entryRuleLiteralBooleanExpression returns [EObject current=null] : iv_ruleLiteralBooleanExpression= ruleLiteralBooleanExpression EOF ;
+    public final EObject entryRuleLiteralBooleanExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralBooleanExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27662:65: (iv_ruleLiteralBooleanExpression= ruleLiteralBooleanExpression EOF )
+            // InternalFormalML.g:27663:2: iv_ruleLiteralBooleanExpression= ruleLiteralBooleanExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralBooleanExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralBooleanExpression=ruleLiteralBooleanExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralBooleanExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralBooleanExpression"
+
+
+    // $ANTLR start "ruleLiteralBooleanExpression"
+    // InternalFormalML.g:27669:1: ruleLiteralBooleanExpression returns [EObject current=null] : ( () ( (lv_value_1_0= ruleEBoolean ) ) ) ;
+    public final EObject ruleLiteralBooleanExpression() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27675:2: ( ( () ( (lv_value_1_0= ruleEBoolean ) ) ) )
+            // InternalFormalML.g:27676:2: ( () ( (lv_value_1_0= ruleEBoolean ) ) )
+            {
+            // InternalFormalML.g:27676:2: ( () ( (lv_value_1_0= ruleEBoolean ) ) )
+            // InternalFormalML.g:27677:3: () ( (lv_value_1_0= ruleEBoolean ) )
+            {
+            // InternalFormalML.g:27677:3: ()
+            // InternalFormalML.g:27678:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralBooleanExpressionAccess().getLiteralBooleanExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:27687:3: ( (lv_value_1_0= ruleEBoolean ) )
+            // InternalFormalML.g:27688:4: (lv_value_1_0= ruleEBoolean )
+            {
+            // InternalFormalML.g:27688:4: (lv_value_1_0= ruleEBoolean )
+            // InternalFormalML.g:27689:5: lv_value_1_0= ruleEBoolean
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralBooleanExpressionAccess().getValueEBooleanParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_1_0=ruleEBoolean();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLiteralBooleanExpressionRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EBoolean");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralBooleanExpression"
+
+
+    // $ANTLR start "entryRuleLiteralIntegerExpression"
+    // InternalFormalML.g:27710:1: entryRuleLiteralIntegerExpression returns [EObject current=null] : iv_ruleLiteralIntegerExpression= ruleLiteralIntegerExpression EOF ;
+    public final EObject entryRuleLiteralIntegerExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralIntegerExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27710:65: (iv_ruleLiteralIntegerExpression= ruleLiteralIntegerExpression EOF )
+            // InternalFormalML.g:27711:2: iv_ruleLiteralIntegerExpression= ruleLiteralIntegerExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralIntegerExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralIntegerExpression=ruleLiteralIntegerExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralIntegerExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralIntegerExpression"
+
+
+    // $ANTLR start "ruleLiteralIntegerExpression"
+    // InternalFormalML.g:27717:1: ruleLiteralIntegerExpression returns [EObject current=null] : ( () ( (lv_value_1_0= ruleEInteger ) ) ) ;
+    public final EObject ruleLiteralIntegerExpression() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27723:2: ( ( () ( (lv_value_1_0= ruleEInteger ) ) ) )
+            // InternalFormalML.g:27724:2: ( () ( (lv_value_1_0= ruleEInteger ) ) )
+            {
+            // InternalFormalML.g:27724:2: ( () ( (lv_value_1_0= ruleEInteger ) ) )
+            // InternalFormalML.g:27725:3: () ( (lv_value_1_0= ruleEInteger ) )
+            {
+            // InternalFormalML.g:27725:3: ()
+            // InternalFormalML.g:27726:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralIntegerExpressionAccess().getLiteralIntegerExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:27735:3: ( (lv_value_1_0= ruleEInteger ) )
+            // InternalFormalML.g:27736:4: (lv_value_1_0= ruleEInteger )
+            {
+            // InternalFormalML.g:27736:4: (lv_value_1_0= ruleEInteger )
+            // InternalFormalML.g:27737:5: lv_value_1_0= ruleEInteger
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralIntegerExpressionAccess().getValueEIntegerParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_1_0=ruleEInteger();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLiteralIntegerExpressionRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EInteger");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralIntegerExpression"
+
+
+    // $ANTLR start "entryRuleLiteralRationalExpression"
+    // InternalFormalML.g:27758:1: entryRuleLiteralRationalExpression returns [EObject current=null] : iv_ruleLiteralRationalExpression= ruleLiteralRationalExpression EOF ;
+    public final EObject entryRuleLiteralRationalExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralRationalExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27758:66: (iv_ruleLiteralRationalExpression= ruleLiteralRationalExpression EOF )
+            // InternalFormalML.g:27759:2: iv_ruleLiteralRationalExpression= ruleLiteralRationalExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralRationalExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralRationalExpression=ruleLiteralRationalExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralRationalExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralRationalExpression"
+
+
+    // $ANTLR start "ruleLiteralRationalExpression"
+    // InternalFormalML.g:27765:1: ruleLiteralRationalExpression returns [EObject current=null] : ( () ( (lv_numerator_1_0= ruleEInteger ) ) otherlv_2= '/' ( (lv_denominator_3_0= ruleEInteger ) ) ) ;
+    public final EObject ruleLiteralRationalExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        AntlrDatatypeRuleToken lv_numerator_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_denominator_3_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27771:2: ( ( () ( (lv_numerator_1_0= ruleEInteger ) ) otherlv_2= '/' ( (lv_denominator_3_0= ruleEInteger ) ) ) )
+            // InternalFormalML.g:27772:2: ( () ( (lv_numerator_1_0= ruleEInteger ) ) otherlv_2= '/' ( (lv_denominator_3_0= ruleEInteger ) ) )
+            {
+            // InternalFormalML.g:27772:2: ( () ( (lv_numerator_1_0= ruleEInteger ) ) otherlv_2= '/' ( (lv_denominator_3_0= ruleEInteger ) ) )
+            // InternalFormalML.g:27773:3: () ( (lv_numerator_1_0= ruleEInteger ) ) otherlv_2= '/' ( (lv_denominator_3_0= ruleEInteger ) )
+            {
+            // InternalFormalML.g:27773:3: ()
+            // InternalFormalML.g:27774:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralRationalExpressionAccess().getLiteralRationalExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:27783:3: ( (lv_numerator_1_0= ruleEInteger ) )
+            // InternalFormalML.g:27784:4: (lv_numerator_1_0= ruleEInteger )
+            {
+            // InternalFormalML.g:27784:4: (lv_numerator_1_0= ruleEInteger )
+            // InternalFormalML.g:27785:5: lv_numerator_1_0= ruleEInteger
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorEIntegerParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_245);
+            lv_numerator_1_0=ruleEInteger();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLiteralRationalExpressionRule());
+              					}
+              					set(
+              						current,
+              						"numerator",
+              						lv_numerator_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EInteger");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,214,FollowSets000.FOLLOW_132); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_2, grammarAccess.getLiteralRationalExpressionAccess().getSolidusKeyword_2());
+              		
+            }
+            // InternalFormalML.g:27806:3: ( (lv_denominator_3_0= ruleEInteger ) )
+            // InternalFormalML.g:27807:4: (lv_denominator_3_0= ruleEInteger )
+            {
+            // InternalFormalML.g:27807:4: (lv_denominator_3_0= ruleEInteger )
+            // InternalFormalML.g:27808:5: lv_denominator_3_0= ruleEInteger
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorEIntegerParserRuleCall_3_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_denominator_3_0=ruleEInteger();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLiteralRationalExpressionRule());
+              					}
+              					set(
+              						current,
+              						"denominator",
+              						lv_denominator_3_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EInteger");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralRationalExpression"
+
+
+    // $ANTLR start "entryRuleLiteralFloatExpression"
+    // InternalFormalML.g:27829:1: entryRuleLiteralFloatExpression returns [EObject current=null] : iv_ruleLiteralFloatExpression= ruleLiteralFloatExpression EOF ;
+    public final EObject entryRuleLiteralFloatExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralFloatExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27829:63: (iv_ruleLiteralFloatExpression= ruleLiteralFloatExpression EOF )
+            // InternalFormalML.g:27830:2: iv_ruleLiteralFloatExpression= ruleLiteralFloatExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralFloatExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralFloatExpression=ruleLiteralFloatExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralFloatExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralFloatExpression"
+
+
+    // $ANTLR start "ruleLiteralFloatExpression"
+    // InternalFormalML.g:27836:1: ruleLiteralFloatExpression returns [EObject current=null] : ( () ( (lv_value_1_0= ruleEDouble ) ) ) ;
+    public final EObject ruleLiteralFloatExpression() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27842:2: ( ( () ( (lv_value_1_0= ruleEDouble ) ) ) )
+            // InternalFormalML.g:27843:2: ( () ( (lv_value_1_0= ruleEDouble ) ) )
+            {
+            // InternalFormalML.g:27843:2: ( () ( (lv_value_1_0= ruleEDouble ) ) )
+            // InternalFormalML.g:27844:3: () ( (lv_value_1_0= ruleEDouble ) )
+            {
+            // InternalFormalML.g:27844:3: ()
+            // InternalFormalML.g:27845:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralFloatExpressionAccess().getLiteralFloatExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:27854:3: ( (lv_value_1_0= ruleEDouble ) )
+            // InternalFormalML.g:27855:4: (lv_value_1_0= ruleEDouble )
+            {
+            // InternalFormalML.g:27855:4: (lv_value_1_0= ruleEDouble )
+            // InternalFormalML.g:27856:5: lv_value_1_0= ruleEDouble
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralFloatExpressionAccess().getValueEDoubleParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_1_0=ruleEDouble();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLiteralFloatExpressionRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EDouble");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralFloatExpression"
+
+
+    // $ANTLR start "entryRuleLiteralCharacterExpression"
+    // InternalFormalML.g:27877:1: entryRuleLiteralCharacterExpression returns [EObject current=null] : iv_ruleLiteralCharacterExpression= ruleLiteralCharacterExpression EOF ;
+    public final EObject entryRuleLiteralCharacterExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralCharacterExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27877:67: (iv_ruleLiteralCharacterExpression= ruleLiteralCharacterExpression EOF )
+            // InternalFormalML.g:27878:2: iv_ruleLiteralCharacterExpression= ruleLiteralCharacterExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralCharacterExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralCharacterExpression=ruleLiteralCharacterExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralCharacterExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralCharacterExpression"
+
+
+    // $ANTLR start "ruleLiteralCharacterExpression"
+    // InternalFormalML.g:27884:1: ruleLiteralCharacterExpression returns [EObject current=null] : ( () ( (lv_value_1_0= ruleECharacter ) ) ) ;
+    public final EObject ruleLiteralCharacterExpression() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27890:2: ( ( () ( (lv_value_1_0= ruleECharacter ) ) ) )
+            // InternalFormalML.g:27891:2: ( () ( (lv_value_1_0= ruleECharacter ) ) )
+            {
+            // InternalFormalML.g:27891:2: ( () ( (lv_value_1_0= ruleECharacter ) ) )
+            // InternalFormalML.g:27892:3: () ( (lv_value_1_0= ruleECharacter ) )
+            {
+            // InternalFormalML.g:27892:3: ()
+            // InternalFormalML.g:27893:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralCharacterExpressionAccess().getLiteralCharacterExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:27902:3: ( (lv_value_1_0= ruleECharacter ) )
+            // InternalFormalML.g:27903:4: (lv_value_1_0= ruleECharacter )
+            {
+            // InternalFormalML.g:27903:4: (lv_value_1_0= ruleECharacter )
+            // InternalFormalML.g:27904:5: lv_value_1_0= ruleECharacter
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralCharacterExpressionAccess().getValueECharacterParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_1_0=ruleECharacter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLiteralCharacterExpressionRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.ECharacter");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralCharacterExpression"
+
+
+    // $ANTLR start "entryRuleLiteralStringExpression"
+    // InternalFormalML.g:27925:1: entryRuleLiteralStringExpression returns [EObject current=null] : iv_ruleLiteralStringExpression= ruleLiteralStringExpression EOF ;
+    public final EObject entryRuleLiteralStringExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralStringExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27925:64: (iv_ruleLiteralStringExpression= ruleLiteralStringExpression EOF )
+            // InternalFormalML.g:27926:2: iv_ruleLiteralStringExpression= ruleLiteralStringExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralStringExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralStringExpression=ruleLiteralStringExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralStringExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralStringExpression"
+
+
+    // $ANTLR start "ruleLiteralStringExpression"
+    // InternalFormalML.g:27932:1: ruleLiteralStringExpression returns [EObject current=null] : ( () ( (lv_value_1_0= ruleEString ) ) ) ;
+    public final EObject ruleLiteralStringExpression() throws RecognitionException {
+        EObject current = null;
+
+        AntlrDatatypeRuleToken lv_value_1_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27938:2: ( ( () ( (lv_value_1_0= ruleEString ) ) ) )
+            // InternalFormalML.g:27939:2: ( () ( (lv_value_1_0= ruleEString ) ) )
+            {
+            // InternalFormalML.g:27939:2: ( () ( (lv_value_1_0= ruleEString ) ) )
+            // InternalFormalML.g:27940:3: () ( (lv_value_1_0= ruleEString ) )
+            {
+            // InternalFormalML.g:27940:3: ()
+            // InternalFormalML.g:27941:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralStringExpressionAccess().getLiteralStringExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:27950:3: ( (lv_value_1_0= ruleEString ) )
+            // InternalFormalML.g:27951:4: (lv_value_1_0= ruleEString )
+            {
+            // InternalFormalML.g:27951:4: (lv_value_1_0= ruleEString )
+            // InternalFormalML.g:27952:5: lv_value_1_0= ruleEString
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralStringExpressionAccess().getValueEStringParserRuleCall_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            lv_value_1_0=ruleEString();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getLiteralStringExpressionRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_1_0,
+              						"org.eclipse.efm.formalml.xtext.FormalML.EString");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralStringExpression"
+
+
+    // $ANTLR start "entryRuleLiteralNullExpression"
+    // InternalFormalML.g:27973:1: entryRuleLiteralNullExpression returns [EObject current=null] : iv_ruleLiteralNullExpression= ruleLiteralNullExpression EOF ;
+    public final EObject entryRuleLiteralNullExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralNullExpression = null;
+
+
+        try {
+            // InternalFormalML.g:27973:62: (iv_ruleLiteralNullExpression= ruleLiteralNullExpression EOF )
+            // InternalFormalML.g:27974:2: iv_ruleLiteralNullExpression= ruleLiteralNullExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralNullExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralNullExpression=ruleLiteralNullExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralNullExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralNullExpression"
+
+
+    // $ANTLR start "ruleLiteralNullExpression"
+    // InternalFormalML.g:27980:1: ruleLiteralNullExpression returns [EObject current=null] : ( ( () (otherlv_1= 'null' | otherlv_2= '$null' ) ) | ( () (otherlv_4= 'null<' | otherlv_5= '$null<' ) ( (lv_type_6_0= ruleDataType ) ) otherlv_7= '>' ) ) ;
+    public final EObject ruleLiteralNullExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        EObject lv_type_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:27986:2: ( ( ( () (otherlv_1= 'null' | otherlv_2= '$null' ) ) | ( () (otherlv_4= 'null<' | otherlv_5= '$null<' ) ( (lv_type_6_0= ruleDataType ) ) otherlv_7= '>' ) ) )
+            // InternalFormalML.g:27987:2: ( ( () (otherlv_1= 'null' | otherlv_2= '$null' ) ) | ( () (otherlv_4= 'null<' | otherlv_5= '$null<' ) ( (lv_type_6_0= ruleDataType ) ) otherlv_7= '>' ) )
+            {
+            // InternalFormalML.g:27987:2: ( ( () (otherlv_1= 'null' | otherlv_2= '$null' ) ) | ( () (otherlv_4= 'null<' | otherlv_5= '$null<' ) ( (lv_type_6_0= ruleDataType ) ) otherlv_7= '>' ) )
+            int alt593=2;
+            int LA593_0 = input.LA(1);
+
+            if ( ((LA593_0>=227 && LA593_0<=228)) ) {
+                alt593=1;
+            }
+            else if ( ((LA593_0>=229 && LA593_0<=230)) ) {
+                alt593=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 593, 0, input);
+
+                throw nvae;
+            }
+            switch (alt593) {
+                case 1 :
+                    // InternalFormalML.g:27988:3: ( () (otherlv_1= 'null' | otherlv_2= '$null' ) )
+                    {
+                    // InternalFormalML.g:27988:3: ( () (otherlv_1= 'null' | otherlv_2= '$null' ) )
+                    // InternalFormalML.g:27989:4: () (otherlv_1= 'null' | otherlv_2= '$null' )
+                    {
+                    // InternalFormalML.g:27989:4: ()
+                    // InternalFormalML.g:27990:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_0_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:27999:4: (otherlv_1= 'null' | otherlv_2= '$null' )
+                    int alt591=2;
+                    int LA591_0 = input.LA(1);
+
+                    if ( (LA591_0==227) ) {
+                        alt591=1;
+                    }
+                    else if ( (LA591_0==228) ) {
+                        alt591=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 591, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt591) {
+                        case 1 :
+                            // InternalFormalML.g:28000:5: otherlv_1= 'null'
+                            {
+                            otherlv_1=(Token)match(input,227,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_1, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_0());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:28005:5: otherlv_2= '$null'
+                            {
+                            otherlv_2=(Token)match(input,228,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_2, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:28012:3: ( () (otherlv_4= 'null<' | otherlv_5= '$null<' ) ( (lv_type_6_0= ruleDataType ) ) otherlv_7= '>' )
+                    {
+                    // InternalFormalML.g:28012:3: ( () (otherlv_4= 'null<' | otherlv_5= '$null<' ) ( (lv_type_6_0= ruleDataType ) ) otherlv_7= '>' )
+                    // InternalFormalML.g:28013:4: () (otherlv_4= 'null<' | otherlv_5= '$null<' ) ( (lv_type_6_0= ruleDataType ) ) otherlv_7= '>'
+                    {
+                    // InternalFormalML.g:28013:4: ()
+                    // InternalFormalML.g:28014:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElement(
+                      						grammarAccess.getLiteralNullExpressionAccess().getLiteralNullExpressionAction_1_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:28023:4: (otherlv_4= 'null<' | otherlv_5= '$null<' )
+                    int alt592=2;
+                    int LA592_0 = input.LA(1);
+
+                    if ( (LA592_0==229) ) {
+                        alt592=1;
+                    }
+                    else if ( (LA592_0==230) ) {
+                        alt592=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 592, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt592) {
+                        case 1 :
+                            // InternalFormalML.g:28024:5: otherlv_4= 'null<'
+                            {
+                            otherlv_4=(Token)match(input,229,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_4, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_0());
+                              				
+                            }
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:28029:5: otherlv_5= '$null<'
+                            {
+                            otherlv_5=(Token)match(input,230,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_5, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_1());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:28034:4: ( (lv_type_6_0= ruleDataType ) )
+                    // InternalFormalML.g:28035:5: (lv_type_6_0= ruleDataType )
+                    {
+                    // InternalFormalML.g:28035:5: (lv_type_6_0= ruleDataType )
+                    // InternalFormalML.g:28036:6: lv_type_6_0= ruleDataType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getLiteralNullExpressionAccess().getTypeDataTypeParserRuleCall_1_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_type_6_0=ruleDataType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getLiteralNullExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"type",
+                      							lv_type_6_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_7=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_7, grammarAccess.getLiteralNullExpressionAccess().getGreaterThanSignKeyword_1_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralNullExpression"
+
+
+    // $ANTLR start "entryRuleLiteralCollectionExpression"
+    // InternalFormalML.g:28062:1: entryRuleLiteralCollectionExpression returns [EObject current=null] : iv_ruleLiteralCollectionExpression= ruleLiteralCollectionExpression EOF ;
+    public final EObject entryRuleLiteralCollectionExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralCollectionExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28062:68: (iv_ruleLiteralCollectionExpression= ruleLiteralCollectionExpression EOF )
+            // InternalFormalML.g:28063:2: iv_ruleLiteralCollectionExpression= ruleLiteralCollectionExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralCollectionExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralCollectionExpression=ruleLiteralCollectionExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralCollectionExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralCollectionExpression"
+
+
+    // $ANTLR start "ruleLiteralCollectionExpression"
+    // InternalFormalML.g:28069:1: ruleLiteralCollectionExpression returns [EObject current=null] : ( () (otherlv_1= '<' ( (lv_datatype_2_0= ruleDataType ) ) otherlv_3= '>' )? otherlv_4= '{' ( ( ( (lv_value_5_0= ruleExpression ) ) | ( (lv_value_6_0= ruleNamedExpression ) ) ) (otherlv_7= ',' ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) ) )* )? otherlv_10= '}' ) ;
+    public final EObject ruleLiteralCollectionExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_7=null;
+        Token otherlv_10=null;
+        EObject lv_datatype_2_0 = null;
+
+        EObject lv_value_5_0 = null;
+
+        EObject lv_value_6_0 = null;
+
+        EObject lv_value_8_0 = null;
+
+        EObject lv_value_9_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28075:2: ( ( () (otherlv_1= '<' ( (lv_datatype_2_0= ruleDataType ) ) otherlv_3= '>' )? otherlv_4= '{' ( ( ( (lv_value_5_0= ruleExpression ) ) | ( (lv_value_6_0= ruleNamedExpression ) ) ) (otherlv_7= ',' ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) ) )* )? otherlv_10= '}' ) )
+            // InternalFormalML.g:28076:2: ( () (otherlv_1= '<' ( (lv_datatype_2_0= ruleDataType ) ) otherlv_3= '>' )? otherlv_4= '{' ( ( ( (lv_value_5_0= ruleExpression ) ) | ( (lv_value_6_0= ruleNamedExpression ) ) ) (otherlv_7= ',' ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) ) )* )? otherlv_10= '}' )
+            {
+            // InternalFormalML.g:28076:2: ( () (otherlv_1= '<' ( (lv_datatype_2_0= ruleDataType ) ) otherlv_3= '>' )? otherlv_4= '{' ( ( ( (lv_value_5_0= ruleExpression ) ) | ( (lv_value_6_0= ruleNamedExpression ) ) ) (otherlv_7= ',' ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) ) )* )? otherlv_10= '}' )
+            // InternalFormalML.g:28077:3: () (otherlv_1= '<' ( (lv_datatype_2_0= ruleDataType ) ) otherlv_3= '>' )? otherlv_4= '{' ( ( ( (lv_value_5_0= ruleExpression ) ) | ( (lv_value_6_0= ruleNamedExpression ) ) ) (otherlv_7= ',' ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) ) )* )? otherlv_10= '}'
+            {
+            // InternalFormalML.g:28077:3: ()
+            // InternalFormalML.g:28078:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralCollectionExpressionAccess().getLiteralCollectionExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:28087:3: (otherlv_1= '<' ( (lv_datatype_2_0= ruleDataType ) ) otherlv_3= '>' )?
+            int alt594=2;
+            int LA594_0 = input.LA(1);
+
+            if ( (LA594_0==16) ) {
+                alt594=1;
+            }
+            switch (alt594) {
+                case 1 :
+                    // InternalFormalML.g:28088:4: otherlv_1= '<' ( (lv_datatype_2_0= ruleDataType ) ) otherlv_3= '>'
+                    {
+                    otherlv_1=(Token)match(input,16,FollowSets000.FOLLOW_46); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getLiteralCollectionExpressionAccess().getLessThanSignKeyword_1_0());
+                      			
+                    }
+                    // InternalFormalML.g:28092:4: ( (lv_datatype_2_0= ruleDataType ) )
+                    // InternalFormalML.g:28093:5: (lv_datatype_2_0= ruleDataType )
+                    {
+                    // InternalFormalML.g:28093:5: (lv_datatype_2_0= ruleDataType )
+                    // InternalFormalML.g:28094:6: lv_datatype_2_0= ruleDataType
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getDatatypeDataTypeParserRuleCall_1_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_23);
+                    lv_datatype_2_0=ruleDataType();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"datatype",
+                      							lv_datatype_2_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.DataType");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_3=(Token)match(input,37,FollowSets000.FOLLOW_10); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_3, grammarAccess.getLiteralCollectionExpressionAccess().getGreaterThanSignKeyword_1_2());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_4=(Token)match(input,22,FollowSets000.FOLLOW_246); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_4, grammarAccess.getLiteralCollectionExpressionAccess().getLeftCurlyBracketKeyword_2());
+              		
+            }
+            // InternalFormalML.g:28120:3: ( ( ( (lv_value_5_0= ruleExpression ) ) | ( (lv_value_6_0= ruleNamedExpression ) ) ) (otherlv_7= ',' ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) ) )* )?
+            int alt598=2;
+            int LA598_0 = input.LA(1);
+
+            if ( ((LA598_0>=RULE_XLIA_ID && LA598_0<=RULE_STRING)||LA598_0==16||LA598_0==22||(LA598_0>=26 && LA598_0<=29)||LA598_0==56||LA598_0==212||(LA598_0>=216 && LA598_0<=224)||(LA598_0>=227 && LA598_0<=239)) ) {
+                alt598=1;
+            }
+            switch (alt598) {
+                case 1 :
+                    // InternalFormalML.g:28121:4: ( ( (lv_value_5_0= ruleExpression ) ) | ( (lv_value_6_0= ruleNamedExpression ) ) ) (otherlv_7= ',' ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) ) )*
+                    {
+                    // InternalFormalML.g:28121:4: ( ( (lv_value_5_0= ruleExpression ) ) | ( (lv_value_6_0= ruleNamedExpression ) ) )
+                    int alt595=2;
+                    int LA595_0 = input.LA(1);
+
+                    if ( (LA595_0==RULE_XLIA_ID) ) {
+                        int LA595_1 = input.LA(2);
+
+                        if ( (LA595_1==16||LA595_1==20||(LA595_1>=23 && LA595_1<=24)||(LA595_1>=28 && LA595_1<=29)||(LA595_1>=35 && LA595_1<=37)||LA595_1==56||LA595_1==92||(LA595_1>=97 && LA595_1<=98)||LA595_1==145||(LA595_1>=149 && LA595_1<=150)||(LA595_1>=183 && LA595_1<=217)) ) {
+                            alt595=1;
+                        }
+                        else if ( (LA595_1==30||(LA595_1>=225 && LA595_1<=226)) ) {
+                            alt595=2;
+                        }
+                        else {
+                            if (state.backtracking>0) {state.failed=true; return current;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("", 595, 1, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else if ( ((LA595_0>=RULE_INT && LA595_0<=RULE_STRING)||LA595_0==16||LA595_0==22||(LA595_0>=26 && LA595_0<=29)||LA595_0==56||LA595_0==212||(LA595_0>=216 && LA595_0<=224)||(LA595_0>=227 && LA595_0<=239)) ) {
+                        alt595=1;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 595, 0, input);
+
+                        throw nvae;
+                    }
+                    switch (alt595) {
+                        case 1 :
+                            // InternalFormalML.g:28122:5: ( (lv_value_5_0= ruleExpression ) )
+                            {
+                            // InternalFormalML.g:28122:5: ( (lv_value_5_0= ruleExpression ) )
+                            // InternalFormalML.g:28123:6: (lv_value_5_0= ruleExpression )
+                            {
+                            // InternalFormalML.g:28123:6: (lv_value_5_0= ruleExpression )
+                            // InternalFormalML.g:28124:7: lv_value_5_0= ruleExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_0_0_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_148);
+                            lv_value_5_0=ruleExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+                              							}
+                              							add(
+                              								current,
+                              								"value",
+                              								lv_value_5_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+                        case 2 :
+                            // InternalFormalML.g:28142:5: ( (lv_value_6_0= ruleNamedExpression ) )
+                            {
+                            // InternalFormalML.g:28142:5: ( (lv_value_6_0= ruleNamedExpression ) )
+                            // InternalFormalML.g:28143:6: (lv_value_6_0= ruleNamedExpression )
+                            {
+                            // InternalFormalML.g:28143:6: (lv_value_6_0= ruleNamedExpression )
+                            // InternalFormalML.g:28144:7: lv_value_6_0= ruleNamedExpression
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_0_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_148);
+                            lv_value_6_0=ruleNamedExpression();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+                              							}
+                              							add(
+                              								current,
+                              								"value",
+                              								lv_value_6_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:28162:4: (otherlv_7= ',' ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) ) )*
+                    loop597:
+                    do {
+                        int alt597=2;
+                        int LA597_0 = input.LA(1);
+
+                        if ( (LA597_0==20) ) {
+                            alt597=1;
+                        }
+
+
+                        switch (alt597) {
+                    	case 1 :
+                    	    // InternalFormalML.g:28163:5: otherlv_7= ',' ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) )
+                    	    {
+                    	    otherlv_7=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_7, grammarAccess.getLiteralCollectionExpressionAccess().getCommaKeyword_3_1_0());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:28167:5: ( ( (lv_value_8_0= ruleExpression ) ) | ( (lv_value_9_0= ruleNamedExpression ) ) )
+                    	    int alt596=2;
+                    	    int LA596_0 = input.LA(1);
+
+                    	    if ( (LA596_0==RULE_XLIA_ID) ) {
+                    	        int LA596_1 = input.LA(2);
+
+                    	        if ( (LA596_1==30||(LA596_1>=225 && LA596_1<=226)) ) {
+                    	            alt596=2;
+                    	        }
+                    	        else if ( (LA596_1==16||LA596_1==20||(LA596_1>=23 && LA596_1<=24)||(LA596_1>=28 && LA596_1<=29)||(LA596_1>=35 && LA596_1<=37)||LA596_1==56||LA596_1==92||(LA596_1>=97 && LA596_1<=98)||LA596_1==145||(LA596_1>=149 && LA596_1<=150)||(LA596_1>=183 && LA596_1<=217)) ) {
+                    	            alt596=1;
+                    	        }
+                    	        else {
+                    	            if (state.backtracking>0) {state.failed=true; return current;}
+                    	            NoViableAltException nvae =
+                    	                new NoViableAltException("", 596, 1, input);
+
+                    	            throw nvae;
+                    	        }
+                    	    }
+                    	    else if ( ((LA596_0>=RULE_INT && LA596_0<=RULE_STRING)||LA596_0==16||LA596_0==22||(LA596_0>=26 && LA596_0<=29)||LA596_0==56||LA596_0==212||(LA596_0>=216 && LA596_0<=224)||(LA596_0>=227 && LA596_0<=239)) ) {
+                    	        alt596=1;
+                    	    }
+                    	    else {
+                    	        if (state.backtracking>0) {state.failed=true; return current;}
+                    	        NoViableAltException nvae =
+                    	            new NoViableAltException("", 596, 0, input);
+
+                    	        throw nvae;
+                    	    }
+                    	    switch (alt596) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:28168:6: ( (lv_value_8_0= ruleExpression ) )
+                    	            {
+                    	            // InternalFormalML.g:28168:6: ( (lv_value_8_0= ruleExpression ) )
+                    	            // InternalFormalML.g:28169:7: (lv_value_8_0= ruleExpression )
+                    	            {
+                    	            // InternalFormalML.g:28169:7: (lv_value_8_0= ruleExpression )
+                    	            // InternalFormalML.g:28170:8: lv_value_8_0= ruleExpression
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueExpressionParserRuleCall_3_1_1_0_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_148);
+                    	            lv_value_8_0=ruleExpression();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"value",
+                    	              									lv_value_8_0,
+                    	              									"org.eclipse.efm.formalml.xtext.FormalML.Expression");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+                    	        case 2 :
+                    	            // InternalFormalML.g:28188:6: ( (lv_value_9_0= ruleNamedExpression ) )
+                    	            {
+                    	            // InternalFormalML.g:28188:6: ( (lv_value_9_0= ruleNamedExpression ) )
+                    	            // InternalFormalML.g:28189:7: (lv_value_9_0= ruleNamedExpression )
+                    	            {
+                    	            // InternalFormalML.g:28189:7: (lv_value_9_0= ruleNamedExpression )
+                    	            // InternalFormalML.g:28190:8: lv_value_9_0= ruleNamedExpression
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getLiteralCollectionExpressionAccess().getValueNamedExpressionParserRuleCall_3_1_1_1_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_148);
+                    	            lv_value_9_0=ruleNamedExpression();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getLiteralCollectionExpressionRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"value",
+                    	              									lv_value_9_0,
+                    	              									"org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop597;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_10, grammarAccess.getLiteralCollectionExpressionAccess().getRightCurlyBracketKeyword_4());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralCollectionExpression"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceExpression"
+    // InternalFormalML.g:28218:1: entryRuleLiteralReferenceExpression returns [EObject current=null] : iv_ruleLiteralReferenceExpression= ruleLiteralReferenceExpression EOF ;
+    public final EObject entryRuleLiteralReferenceExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralReferenceExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28218:67: (iv_ruleLiteralReferenceExpression= ruleLiteralReferenceExpression EOF )
+            // InternalFormalML.g:28219:2: iv_ruleLiteralReferenceExpression= ruleLiteralReferenceExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralReferenceExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralReferenceExpression=ruleLiteralReferenceExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralReferenceExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceExpression"
+
+
+    // $ANTLR start "ruleLiteralReferenceExpression"
+    // InternalFormalML.g:28225:1: ruleLiteralReferenceExpression returns [EObject current=null] : (this_LiteralReferenceElement_0= ruleLiteralReferenceElement | this_LiteralReferenceVariableContext_1= ruleLiteralReferenceVariableContext | this_LiteralReferenceMachineContext_2= ruleLiteralReferenceMachineContext | this_LiteralEnvExpression_3= ruleLiteralEnvExpression ) ;
+    public final EObject ruleLiteralReferenceExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralReferenceElement_0 = null;
+
+        EObject this_LiteralReferenceVariableContext_1 = null;
+
+        EObject this_LiteralReferenceMachineContext_2 = null;
+
+        EObject this_LiteralEnvExpression_3 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28231:2: ( (this_LiteralReferenceElement_0= ruleLiteralReferenceElement | this_LiteralReferenceVariableContext_1= ruleLiteralReferenceVariableContext | this_LiteralReferenceMachineContext_2= ruleLiteralReferenceMachineContext | this_LiteralEnvExpression_3= ruleLiteralEnvExpression ) )
+            // InternalFormalML.g:28232:2: (this_LiteralReferenceElement_0= ruleLiteralReferenceElement | this_LiteralReferenceVariableContext_1= ruleLiteralReferenceVariableContext | this_LiteralReferenceMachineContext_2= ruleLiteralReferenceMachineContext | this_LiteralEnvExpression_3= ruleLiteralEnvExpression )
+            {
+            // InternalFormalML.g:28232:2: (this_LiteralReferenceElement_0= ruleLiteralReferenceElement | this_LiteralReferenceVariableContext_1= ruleLiteralReferenceVariableContext | this_LiteralReferenceMachineContext_2= ruleLiteralReferenceMachineContext | this_LiteralEnvExpression_3= ruleLiteralEnvExpression )
+            int alt599=4;
+            switch ( input.LA(1) ) {
+            case RULE_XLIA_ID:
+                {
+                alt599=1;
+                }
+                break;
+            case 231:
+            case 232:
+                {
+                alt599=2;
+                }
+                break;
+            case 233:
+            case 234:
+            case 235:
+            case 236:
+            case 237:
+                {
+                alt599=3;
+                }
+                break;
+            case 238:
+                {
+                int LA599_4 = input.LA(2);
+
+                if ( (synpred947_InternalFormalML()) ) {
+                    alt599=3;
+                }
+                else if ( (true) ) {
+                    alt599=4;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 599, 4, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 239:
+                {
+                int LA599_5 = input.LA(2);
+
+                if ( (synpred947_InternalFormalML()) ) {
+                    alt599=3;
+                }
+                else if ( (true) ) {
+                    alt599=4;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 599, 5, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 599, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt599) {
+                case 1 :
+                    // InternalFormalML.g:28233:3: this_LiteralReferenceElement_0= ruleLiteralReferenceElement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceElementParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralReferenceElement_0=ruleLiteralReferenceElement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralReferenceElement_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:28245:3: this_LiteralReferenceVariableContext_1= ruleLiteralReferenceVariableContext
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceVariableContextParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralReferenceVariableContext_1=ruleLiteralReferenceVariableContext();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralReferenceVariableContext_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:28257:3: this_LiteralReferenceMachineContext_2= ruleLiteralReferenceMachineContext
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralReferenceMachineContext_2=ruleLiteralReferenceMachineContext();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralReferenceMachineContext_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:28269:3: this_LiteralEnvExpression_3= ruleLiteralEnvExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceExpressionAccess().getLiteralEnvExpressionParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralEnvExpression_3=ruleLiteralEnvExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralEnvExpression_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralReferenceExpression"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceElement"
+    // InternalFormalML.g:28284:1: entryRuleLiteralReferenceElement returns [EObject current=null] : iv_ruleLiteralReferenceElement= ruleLiteralReferenceElement EOF ;
+    public final EObject entryRuleLiteralReferenceElement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralReferenceElement = null;
+
+
+        try {
+            // InternalFormalML.g:28284:64: (iv_ruleLiteralReferenceElement= ruleLiteralReferenceElement EOF )
+            // InternalFormalML.g:28285:2: iv_ruleLiteralReferenceElement= ruleLiteralReferenceElement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralReferenceElementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralReferenceElement=ruleLiteralReferenceElement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralReferenceElement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceElement"
+
+
+    // $ANTLR start "ruleLiteralReferenceElement"
+    // InternalFormalML.g:28291:1: ruleLiteralReferenceElement returns [EObject current=null] : ( () ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' ) | ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' ) )? ) ;
+    public final EObject ruleLiteralReferenceElement() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_4=null;
+        Token otherlv_7=null;
+        Enumerator lv_kind_2_0 = null;
+
+        EObject lv_arg_3_0 = null;
+
+        Enumerator lv_kind_5_0 = null;
+
+        EObject lv_arg_6_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28297:2: ( ( () ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' ) | ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' ) )? ) )
+            // InternalFormalML.g:28298:2: ( () ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' ) | ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' ) )? )
+            {
+            // InternalFormalML.g:28298:2: ( () ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' ) | ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' ) )? )
+            // InternalFormalML.g:28299:3: () ( ( ruleESIdentifier ) ) ( ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' ) | ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' ) )?
+            {
+            // InternalFormalML.g:28299:3: ()
+            // InternalFormalML.g:28300:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralReferenceElementAccess().getLiteralReferenceElementAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:28309:3: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:28310:4: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:28310:4: ( ruleESIdentifier )
+            // InternalFormalML.g:28311:5: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					/* */
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getLiteralReferenceElementRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getValueNamedElementCrossReference_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_247);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalFormalML.g:28328:3: ( ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' ) | ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' ) )?
+            int alt600=3;
+            alt600 = dfa600.predict(input);
+            switch (alt600) {
+                case 1 :
+                    // InternalFormalML.g:28329:4: ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' )
+                    {
+                    // InternalFormalML.g:28329:4: ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' )
+                    // InternalFormalML.g:28330:5: ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']'
+                    {
+                    // InternalFormalML.g:28330:5: ( (lv_kind_2_0= ruleValueIndexExpressionKind ) )
+                    // InternalFormalML.g:28331:6: (lv_kind_2_0= ruleValueIndexExpressionKind )
+                    {
+                    // InternalFormalML.g:28331:6: (lv_kind_2_0= ruleValueIndexExpressionKind )
+                    // InternalFormalML.g:28332:7: lv_kind_2_0= ruleValueIndexExpressionKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getKindValueIndexExpressionKindEnumRuleCall_2_0_0_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_13);
+                    lv_kind_2_0=ruleValueIndexExpressionKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
+                      							}
+                      							set(
+                      								current,
+                      								"kind",
+                      								lv_kind_2_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:28349:5: ( (lv_arg_3_0= rulePositionalTupleExpressionList ) )
+                    // InternalFormalML.g:28350:6: (lv_arg_3_0= rulePositionalTupleExpressionList )
+                    {
+                    // InternalFormalML.g:28350:6: (lv_arg_3_0= rulePositionalTupleExpressionList )
+                    // InternalFormalML.g:28351:7: lv_arg_3_0= rulePositionalTupleExpressionList
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getArgPositionalTupleExpressionListParserRuleCall_2_0_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_110);
+                    lv_arg_3_0=rulePositionalTupleExpressionList();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
+                      							}
+                      							set(
+                      								current,
+                      								"arg",
+                      								lv_arg_3_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_4=(Token)match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_4, grammarAccess.getLiteralReferenceElementAccess().getRightSquareBracketKeyword_2_0_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:28374:4: ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' )
+                    {
+                    // InternalFormalML.g:28374:4: ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' )
+                    // InternalFormalML.g:28375:5: ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')'
+                    {
+                    // InternalFormalML.g:28375:5: ( (lv_kind_5_0= ruleValueParameterExpressionKind ) )
+                    // InternalFormalML.g:28376:6: (lv_kind_5_0= ruleValueParameterExpressionKind )
+                    {
+                    // InternalFormalML.g:28376:6: (lv_kind_5_0= ruleValueParameterExpressionKind )
+                    // InternalFormalML.g:28377:7: lv_kind_5_0= ruleValueParameterExpressionKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getKindValueParameterExpressionKindEnumRuleCall_2_1_0_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_13);
+                    lv_kind_5_0=ruleValueParameterExpressionKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
+                      							}
+                      							set(
+                      								current,
+                      								"kind",
+                      								lv_kind_5_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:28394:5: ( (lv_arg_6_0= ruleMixTupleExpressionList ) )
+                    // InternalFormalML.g:28395:6: (lv_arg_6_0= ruleMixTupleExpressionList )
+                    {
+                    // InternalFormalML.g:28395:6: (lv_arg_6_0= ruleMixTupleExpressionList )
+                    // InternalFormalML.g:28396:7: lv_arg_6_0= ruleMixTupleExpressionList
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getArgMixTupleExpressionListParserRuleCall_2_1_1_0());
+                      						
+                    }
+                    pushFollow(FollowSets000.FOLLOW_99);
+                    lv_arg_6_0=ruleMixTupleExpressionList();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getLiteralReferenceElementRule());
+                      							}
+                      							set(
+                      								current,
+                      								"arg",
+                      								lv_arg_6_0,
+                      								"org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+                      							afterParserOrEnumRuleCall();
+                      						
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_7=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_7, grammarAccess.getLiteralReferenceElementAccess().getRightParenthesisKeyword_2_1_2());
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralReferenceElement"
+
+
+    // $ANTLR start "entryRuleLiteralPureReferenceElement"
+    // InternalFormalML.g:28423:1: entryRuleLiteralPureReferenceElement returns [EObject current=null] : iv_ruleLiteralPureReferenceElement= ruleLiteralPureReferenceElement EOF ;
+    public final EObject entryRuleLiteralPureReferenceElement() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralPureReferenceElement = null;
+
+
+        try {
+            // InternalFormalML.g:28423:68: (iv_ruleLiteralPureReferenceElement= ruleLiteralPureReferenceElement EOF )
+            // InternalFormalML.g:28424:2: iv_ruleLiteralPureReferenceElement= ruleLiteralPureReferenceElement EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralPureReferenceElementRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralPureReferenceElement=ruleLiteralPureReferenceElement();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralPureReferenceElement; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralPureReferenceElement"
+
+
+    // $ANTLR start "ruleLiteralPureReferenceElement"
+    // InternalFormalML.g:28430:1: ruleLiteralPureReferenceElement returns [EObject current=null] : ( () ( ( ruleESIdentifier ) ) ) ;
+    public final EObject ruleLiteralPureReferenceElement() throws RecognitionException {
+        EObject current = null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28436:2: ( ( () ( ( ruleESIdentifier ) ) ) )
+            // InternalFormalML.g:28437:2: ( () ( ( ruleESIdentifier ) ) )
+            {
+            // InternalFormalML.g:28437:2: ( () ( ( ruleESIdentifier ) ) )
+            // InternalFormalML.g:28438:3: () ( ( ruleESIdentifier ) )
+            {
+            // InternalFormalML.g:28438:3: ()
+            // InternalFormalML.g:28439:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralPureReferenceElementAccess().getLiteralReferenceElementAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:28448:3: ( ( ruleESIdentifier ) )
+            // InternalFormalML.g:28449:4: ( ruleESIdentifier )
+            {
+            // InternalFormalML.g:28449:4: ( ruleESIdentifier )
+            // InternalFormalML.g:28450:5: ruleESIdentifier
+            {
+            if ( state.backtracking==0 ) {
+
+              					/* */
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getLiteralPureReferenceElementRule());
+              					}
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementCrossReference_1_0());
+              				
+            }
+            pushFollow(FollowSets000.FOLLOW_2);
+            ruleESIdentifier();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralPureReferenceElement"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceVariableContext"
+    // InternalFormalML.g:28471:1: entryRuleLiteralReferenceVariableContext returns [EObject current=null] : iv_ruleLiteralReferenceVariableContext= ruleLiteralReferenceVariableContext EOF ;
+    public final EObject entryRuleLiteralReferenceVariableContext() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralReferenceVariableContext = null;
+
+
+        try {
+            // InternalFormalML.g:28471:72: (iv_ruleLiteralReferenceVariableContext= ruleLiteralReferenceVariableContext EOF )
+            // InternalFormalML.g:28472:2: iv_ruleLiteralReferenceVariableContext= ruleLiteralReferenceVariableContext EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralReferenceVariableContextRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralReferenceVariableContext=ruleLiteralReferenceVariableContext();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralReferenceVariableContext; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceVariableContext"
+
+
+    // $ANTLR start "ruleLiteralReferenceVariableContext"
+    // InternalFormalML.g:28478:1: ruleLiteralReferenceVariableContext returns [EObject current=null] : (this_LiteralTimeExpression_0= ruleLiteralTimeExpression | this_LiteralTimeDeltaExpression_1= ruleLiteralTimeDeltaExpression ) ;
+    public final EObject ruleLiteralReferenceVariableContext() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralTimeExpression_0 = null;
+
+        EObject this_LiteralTimeDeltaExpression_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28484:2: ( (this_LiteralTimeExpression_0= ruleLiteralTimeExpression | this_LiteralTimeDeltaExpression_1= ruleLiteralTimeDeltaExpression ) )
+            // InternalFormalML.g:28485:2: (this_LiteralTimeExpression_0= ruleLiteralTimeExpression | this_LiteralTimeDeltaExpression_1= ruleLiteralTimeDeltaExpression )
+            {
+            // InternalFormalML.g:28485:2: (this_LiteralTimeExpression_0= ruleLiteralTimeExpression | this_LiteralTimeDeltaExpression_1= ruleLiteralTimeDeltaExpression )
+            int alt601=2;
+            int LA601_0 = input.LA(1);
+
+            if ( (LA601_0==231) ) {
+                alt601=1;
+            }
+            else if ( (LA601_0==232) ) {
+                alt601=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 601, 0, input);
+
+                throw nvae;
+            }
+            switch (alt601) {
+                case 1 :
+                    // InternalFormalML.g:28486:3: this_LiteralTimeExpression_0= ruleLiteralTimeExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralTimeExpression_0=ruleLiteralTimeExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralTimeExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:28498:3: this_LiteralTimeDeltaExpression_1= ruleLiteralTimeDeltaExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceVariableContextAccess().getLiteralTimeDeltaExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralTimeDeltaExpression_1=ruleLiteralTimeDeltaExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralTimeDeltaExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralReferenceVariableContext"
+
+
+    // $ANTLR start "entryRuleLiteralTimeExpression"
+    // InternalFormalML.g:28513:1: entryRuleLiteralTimeExpression returns [EObject current=null] : iv_ruleLiteralTimeExpression= ruleLiteralTimeExpression EOF ;
+    public final EObject entryRuleLiteralTimeExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralTimeExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28513:62: (iv_ruleLiteralTimeExpression= ruleLiteralTimeExpression EOF )
+            // InternalFormalML.g:28514:2: iv_ruleLiteralTimeExpression= ruleLiteralTimeExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralTimeExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralTimeExpression=ruleLiteralTimeExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralTimeExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralTimeExpression"
+
+
+    // $ANTLR start "ruleLiteralTimeExpression"
+    // InternalFormalML.g:28520:1: ruleLiteralTimeExpression returns [EObject current=null] : ( () otherlv_1= '$time' ) ;
+    public final EObject ruleLiteralTimeExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28526:2: ( ( () otherlv_1= '$time' ) )
+            // InternalFormalML.g:28527:2: ( () otherlv_1= '$time' )
+            {
+            // InternalFormalML.g:28527:2: ( () otherlv_1= '$time' )
+            // InternalFormalML.g:28528:3: () otherlv_1= '$time'
+            {
+            // InternalFormalML.g:28528:3: ()
+            // InternalFormalML.g:28529:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralTimeExpressionAccess().getLiteralTimeExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,231,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralTimeExpressionAccess().getTimeKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralTimeExpression"
+
+
+    // $ANTLR start "entryRuleLiteralTimeDeltaExpression"
+    // InternalFormalML.g:28546:1: entryRuleLiteralTimeDeltaExpression returns [EObject current=null] : iv_ruleLiteralTimeDeltaExpression= ruleLiteralTimeDeltaExpression EOF ;
+    public final EObject entryRuleLiteralTimeDeltaExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralTimeDeltaExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28546:67: (iv_ruleLiteralTimeDeltaExpression= ruleLiteralTimeDeltaExpression EOF )
+            // InternalFormalML.g:28547:2: iv_ruleLiteralTimeDeltaExpression= ruleLiteralTimeDeltaExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralTimeDeltaExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralTimeDeltaExpression=ruleLiteralTimeDeltaExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralTimeDeltaExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralTimeDeltaExpression"
+
+
+    // $ANTLR start "ruleLiteralTimeDeltaExpression"
+    // InternalFormalML.g:28553:1: ruleLiteralTimeDeltaExpression returns [EObject current=null] : ( () otherlv_1= '$delta' ) ;
+    public final EObject ruleLiteralTimeDeltaExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28559:2: ( ( () otherlv_1= '$delta' ) )
+            // InternalFormalML.g:28560:2: ( () otherlv_1= '$delta' )
+            {
+            // InternalFormalML.g:28560:2: ( () otherlv_1= '$delta' )
+            // InternalFormalML.g:28561:3: () otherlv_1= '$delta'
+            {
+            // InternalFormalML.g:28561:3: ()
+            // InternalFormalML.g:28562:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralTimeDeltaExpressionAccess().getLiteralTimeDeltaExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,232,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralTimeDeltaExpressionAccess().getDeltaKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralTimeDeltaExpression"
+
+
+    // $ANTLR start "entryRuleLiteralReferenceMachineContext"
+    // InternalFormalML.g:28579:1: entryRuleLiteralReferenceMachineContext returns [EObject current=null] : iv_ruleLiteralReferenceMachineContext= ruleLiteralReferenceMachineContext EOF ;
+    public final EObject entryRuleLiteralReferenceMachineContext() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralReferenceMachineContext = null;
+
+
+        try {
+            // InternalFormalML.g:28579:71: (iv_ruleLiteralReferenceMachineContext= ruleLiteralReferenceMachineContext EOF )
+            // InternalFormalML.g:28580:2: iv_ruleLiteralReferenceMachineContext= ruleLiteralReferenceMachineContext EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralReferenceMachineContextRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralReferenceMachineContext=ruleLiteralReferenceMachineContext();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralReferenceMachineContext; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralReferenceMachineContext"
+
+
+    // $ANTLR start "ruleLiteralReferenceMachineContext"
+    // InternalFormalML.g:28586:1: ruleLiteralReferenceMachineContext returns [EObject current=null] : (this_LiteralThisExpression_0= ruleLiteralThisExpression | this_LiteralSelfExpression_1= ruleLiteralSelfExpression | this_LiteralParentExpression_2= ruleLiteralParentExpression | this_LiteralSuperExpression_3= ruleLiteralSuperExpression | this_LiteralSystemExpression_4= ruleLiteralSystemExpression | this_LiteralEnvExpression_5= ruleLiteralEnvExpression ) ;
+    public final EObject ruleLiteralReferenceMachineContext() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralThisExpression_0 = null;
+
+        EObject this_LiteralSelfExpression_1 = null;
+
+        EObject this_LiteralParentExpression_2 = null;
+
+        EObject this_LiteralSuperExpression_3 = null;
+
+        EObject this_LiteralSystemExpression_4 = null;
+
+        EObject this_LiteralEnvExpression_5 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28592:2: ( (this_LiteralThisExpression_0= ruleLiteralThisExpression | this_LiteralSelfExpression_1= ruleLiteralSelfExpression | this_LiteralParentExpression_2= ruleLiteralParentExpression | this_LiteralSuperExpression_3= ruleLiteralSuperExpression | this_LiteralSystemExpression_4= ruleLiteralSystemExpression | this_LiteralEnvExpression_5= ruleLiteralEnvExpression ) )
+            // InternalFormalML.g:28593:2: (this_LiteralThisExpression_0= ruleLiteralThisExpression | this_LiteralSelfExpression_1= ruleLiteralSelfExpression | this_LiteralParentExpression_2= ruleLiteralParentExpression | this_LiteralSuperExpression_3= ruleLiteralSuperExpression | this_LiteralSystemExpression_4= ruleLiteralSystemExpression | this_LiteralEnvExpression_5= ruleLiteralEnvExpression )
+            {
+            // InternalFormalML.g:28593:2: (this_LiteralThisExpression_0= ruleLiteralThisExpression | this_LiteralSelfExpression_1= ruleLiteralSelfExpression | this_LiteralParentExpression_2= ruleLiteralParentExpression | this_LiteralSuperExpression_3= ruleLiteralSuperExpression | this_LiteralSystemExpression_4= ruleLiteralSystemExpression | this_LiteralEnvExpression_5= ruleLiteralEnvExpression )
+            int alt602=6;
+            switch ( input.LA(1) ) {
+            case 233:
+                {
+                alt602=1;
+                }
+                break;
+            case 234:
+                {
+                alt602=2;
+                }
+                break;
+            case 235:
+                {
+                alt602=3;
+                }
+                break;
+            case 236:
+                {
+                alt602=4;
+                }
+                break;
+            case 237:
+                {
+                alt602=5;
+                }
+                break;
+            case 238:
+            case 239:
+                {
+                alt602=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 602, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt602) {
+                case 1 :
+                    // InternalFormalML.g:28594:3: this_LiteralThisExpression_0= ruleLiteralThisExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralThisExpressionParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralThisExpression_0=ruleLiteralThisExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralThisExpression_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:28606:3: this_LiteralSelfExpression_1= ruleLiteralSelfExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSelfExpressionParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralSelfExpression_1=ruleLiteralSelfExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralSelfExpression_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:28618:3: this_LiteralParentExpression_2= ruleLiteralParentExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralParentExpressionParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralParentExpression_2=ruleLiteralParentExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralParentExpression_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:28630:3: this_LiteralSuperExpression_3= ruleLiteralSuperExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSuperExpressionParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralSuperExpression_3=ruleLiteralSuperExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralSuperExpression_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:28642:3: this_LiteralSystemExpression_4= ruleLiteralSystemExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralSystemExpressionParserRuleCall_4());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralSystemExpression_4=ruleLiteralSystemExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralSystemExpression_4;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:28654:3: this_LiteralEnvExpression_5= ruleLiteralEnvExpression
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralReferenceMachineContextAccess().getLiteralEnvExpressionParserRuleCall_5());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralEnvExpression_5=ruleLiteralEnvExpression();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralEnvExpression_5;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralReferenceMachineContext"
+
+
+    // $ANTLR start "entryRuleLiteralThisExpression"
+    // InternalFormalML.g:28669:1: entryRuleLiteralThisExpression returns [EObject current=null] : iv_ruleLiteralThisExpression= ruleLiteralThisExpression EOF ;
+    public final EObject entryRuleLiteralThisExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralThisExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28669:62: (iv_ruleLiteralThisExpression= ruleLiteralThisExpression EOF )
+            // InternalFormalML.g:28670:2: iv_ruleLiteralThisExpression= ruleLiteralThisExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralThisExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralThisExpression=ruleLiteralThisExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralThisExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralThisExpression"
+
+
+    // $ANTLR start "ruleLiteralThisExpression"
+    // InternalFormalML.g:28676:1: ruleLiteralThisExpression returns [EObject current=null] : ( () otherlv_1= '$this' ) ;
+    public final EObject ruleLiteralThisExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28682:2: ( ( () otherlv_1= '$this' ) )
+            // InternalFormalML.g:28683:2: ( () otherlv_1= '$this' )
+            {
+            // InternalFormalML.g:28683:2: ( () otherlv_1= '$this' )
+            // InternalFormalML.g:28684:3: () otherlv_1= '$this'
+            {
+            // InternalFormalML.g:28684:3: ()
+            // InternalFormalML.g:28685:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralThisExpressionAccess().getLiteralThisExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,233,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralThisExpressionAccess().getThisKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralThisExpression"
+
+
+    // $ANTLR start "entryRuleLiteralSelfExpression"
+    // InternalFormalML.g:28702:1: entryRuleLiteralSelfExpression returns [EObject current=null] : iv_ruleLiteralSelfExpression= ruleLiteralSelfExpression EOF ;
+    public final EObject entryRuleLiteralSelfExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralSelfExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28702:62: (iv_ruleLiteralSelfExpression= ruleLiteralSelfExpression EOF )
+            // InternalFormalML.g:28703:2: iv_ruleLiteralSelfExpression= ruleLiteralSelfExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralSelfExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralSelfExpression=ruleLiteralSelfExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralSelfExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralSelfExpression"
+
+
+    // $ANTLR start "ruleLiteralSelfExpression"
+    // InternalFormalML.g:28709:1: ruleLiteralSelfExpression returns [EObject current=null] : ( () otherlv_1= '$self' ) ;
+    public final EObject ruleLiteralSelfExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28715:2: ( ( () otherlv_1= '$self' ) )
+            // InternalFormalML.g:28716:2: ( () otherlv_1= '$self' )
+            {
+            // InternalFormalML.g:28716:2: ( () otherlv_1= '$self' )
+            // InternalFormalML.g:28717:3: () otherlv_1= '$self'
+            {
+            // InternalFormalML.g:28717:3: ()
+            // InternalFormalML.g:28718:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralSelfExpressionAccess().getLiteralSelfExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,234,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralSelfExpressionAccess().getSelfKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralSelfExpression"
+
+
+    // $ANTLR start "entryRuleLiteralParentExpression"
+    // InternalFormalML.g:28735:1: entryRuleLiteralParentExpression returns [EObject current=null] : iv_ruleLiteralParentExpression= ruleLiteralParentExpression EOF ;
+    public final EObject entryRuleLiteralParentExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralParentExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28735:64: (iv_ruleLiteralParentExpression= ruleLiteralParentExpression EOF )
+            // InternalFormalML.g:28736:2: iv_ruleLiteralParentExpression= ruleLiteralParentExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralParentExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralParentExpression=ruleLiteralParentExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralParentExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralParentExpression"
+
+
+    // $ANTLR start "ruleLiteralParentExpression"
+    // InternalFormalML.g:28742:1: ruleLiteralParentExpression returns [EObject current=null] : ( () otherlv_1= '$parent' ) ;
+    public final EObject ruleLiteralParentExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28748:2: ( ( () otherlv_1= '$parent' ) )
+            // InternalFormalML.g:28749:2: ( () otherlv_1= '$parent' )
+            {
+            // InternalFormalML.g:28749:2: ( () otherlv_1= '$parent' )
+            // InternalFormalML.g:28750:3: () otherlv_1= '$parent'
+            {
+            // InternalFormalML.g:28750:3: ()
+            // InternalFormalML.g:28751:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralParentExpressionAccess().getLiteralParentExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,235,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralParentExpressionAccess().getParentKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralParentExpression"
+
+
+    // $ANTLR start "entryRuleLiteralSuperExpression"
+    // InternalFormalML.g:28768:1: entryRuleLiteralSuperExpression returns [EObject current=null] : iv_ruleLiteralSuperExpression= ruleLiteralSuperExpression EOF ;
+    public final EObject entryRuleLiteralSuperExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralSuperExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28768:63: (iv_ruleLiteralSuperExpression= ruleLiteralSuperExpression EOF )
+            // InternalFormalML.g:28769:2: iv_ruleLiteralSuperExpression= ruleLiteralSuperExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralSuperExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralSuperExpression=ruleLiteralSuperExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralSuperExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralSuperExpression"
+
+
+    // $ANTLR start "ruleLiteralSuperExpression"
+    // InternalFormalML.g:28775:1: ruleLiteralSuperExpression returns [EObject current=null] : ( () otherlv_1= '$super' ) ;
+    public final EObject ruleLiteralSuperExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28781:2: ( ( () otherlv_1= '$super' ) )
+            // InternalFormalML.g:28782:2: ( () otherlv_1= '$super' )
+            {
+            // InternalFormalML.g:28782:2: ( () otherlv_1= '$super' )
+            // InternalFormalML.g:28783:3: () otherlv_1= '$super'
+            {
+            // InternalFormalML.g:28783:3: ()
+            // InternalFormalML.g:28784:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralSuperExpressionAccess().getLiteralSuperExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,236,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralSuperExpressionAccess().getSuperKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralSuperExpression"
+
+
+    // $ANTLR start "entryRuleLiteralSystemExpression"
+    // InternalFormalML.g:28801:1: entryRuleLiteralSystemExpression returns [EObject current=null] : iv_ruleLiteralSystemExpression= ruleLiteralSystemExpression EOF ;
+    public final EObject entryRuleLiteralSystemExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralSystemExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28801:64: (iv_ruleLiteralSystemExpression= ruleLiteralSystemExpression EOF )
+            // InternalFormalML.g:28802:2: iv_ruleLiteralSystemExpression= ruleLiteralSystemExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralSystemExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralSystemExpression=ruleLiteralSystemExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralSystemExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralSystemExpression"
+
+
+    // $ANTLR start "ruleLiteralSystemExpression"
+    // InternalFormalML.g:28808:1: ruleLiteralSystemExpression returns [EObject current=null] : ( () otherlv_1= '$system' ) ;
+    public final EObject ruleLiteralSystemExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28814:2: ( ( () otherlv_1= '$system' ) )
+            // InternalFormalML.g:28815:2: ( () otherlv_1= '$system' )
+            {
+            // InternalFormalML.g:28815:2: ( () otherlv_1= '$system' )
+            // InternalFormalML.g:28816:3: () otherlv_1= '$system'
+            {
+            // InternalFormalML.g:28816:3: ()
+            // InternalFormalML.g:28817:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralSystemExpressionAccess().getLiteralSystemExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,237,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getLiteralSystemExpressionAccess().getSystemKeyword_1());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralSystemExpression"
+
+
+    // $ANTLR start "entryRuleLiteralEnvExpression"
+    // InternalFormalML.g:28834:1: entryRuleLiteralEnvExpression returns [EObject current=null] : iv_ruleLiteralEnvExpression= ruleLiteralEnvExpression EOF ;
+    public final EObject entryRuleLiteralEnvExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralEnvExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28834:61: (iv_ruleLiteralEnvExpression= ruleLiteralEnvExpression EOF )
+            // InternalFormalML.g:28835:2: iv_ruleLiteralEnvExpression= ruleLiteralEnvExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralEnvExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralEnvExpression=ruleLiteralEnvExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralEnvExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralEnvExpression"
+
+
+    // $ANTLR start "ruleLiteralEnvExpression"
+    // InternalFormalML.g:28841:1: ruleLiteralEnvExpression returns [EObject current=null] : ( () (otherlv_1= '$env' | otherlv_2= 'env' ) ) ;
+    public final EObject ruleLiteralEnvExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28847:2: ( ( () (otherlv_1= '$env' | otherlv_2= 'env' ) ) )
+            // InternalFormalML.g:28848:2: ( () (otherlv_1= '$env' | otherlv_2= 'env' ) )
+            {
+            // InternalFormalML.g:28848:2: ( () (otherlv_1= '$env' | otherlv_2= 'env' ) )
+            // InternalFormalML.g:28849:3: () (otherlv_1= '$env' | otherlv_2= 'env' )
+            {
+            // InternalFormalML.g:28849:3: ()
+            // InternalFormalML.g:28850:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				/* */
+              			
+            }
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getLiteralEnvExpressionAccess().getLiteralEnvExpressionAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalFormalML.g:28859:3: (otherlv_1= '$env' | otherlv_2= 'env' )
+            int alt603=2;
+            int LA603_0 = input.LA(1);
+
+            if ( (LA603_0==238) ) {
+                alt603=1;
+            }
+            else if ( (LA603_0==239) ) {
+                alt603=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 603, 0, input);
+
+                throw nvae;
+            }
+            switch (alt603) {
+                case 1 :
+                    // InternalFormalML.g:28860:4: otherlv_1= '$env'
+                    {
+                    otherlv_1=(Token)match(input,238,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_1, grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_0());
+                      			
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:28865:4: otherlv_2= 'env'
+                    {
+                    otherlv_2=(Token)match(input,239,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_2, grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_1());
+                      			
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralEnvExpression"
+
+
+    // $ANTLR start "entryRuleLiteralPureReferenceExpression"
+    // InternalFormalML.g:28874:1: entryRuleLiteralPureReferenceExpression returns [EObject current=null] : iv_ruleLiteralPureReferenceExpression= ruleLiteralPureReferenceExpression EOF ;
+    public final EObject entryRuleLiteralPureReferenceExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleLiteralPureReferenceExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28874:71: (iv_ruleLiteralPureReferenceExpression= ruleLiteralPureReferenceExpression EOF )
+            // InternalFormalML.g:28875:2: iv_ruleLiteralPureReferenceExpression= ruleLiteralPureReferenceExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLiteralPureReferenceExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleLiteralPureReferenceExpression=ruleLiteralPureReferenceExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLiteralPureReferenceExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLiteralPureReferenceExpression"
+
+
+    // $ANTLR start "ruleLiteralPureReferenceExpression"
+    // InternalFormalML.g:28881:1: ruleLiteralPureReferenceExpression returns [EObject current=null] : (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement | this_LiteralReferenceMachineContext_1= ruleLiteralReferenceMachineContext ) ;
+    public final EObject ruleLiteralPureReferenceExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralPureReferenceElement_0 = null;
+
+        EObject this_LiteralReferenceMachineContext_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28887:2: ( (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement | this_LiteralReferenceMachineContext_1= ruleLiteralReferenceMachineContext ) )
+            // InternalFormalML.g:28888:2: (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement | this_LiteralReferenceMachineContext_1= ruleLiteralReferenceMachineContext )
+            {
+            // InternalFormalML.g:28888:2: (this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement | this_LiteralReferenceMachineContext_1= ruleLiteralReferenceMachineContext )
+            int alt604=2;
+            int LA604_0 = input.LA(1);
+
+            if ( (LA604_0==RULE_XLIA_ID) ) {
+                alt604=1;
+            }
+            else if ( ((LA604_0>=233 && LA604_0<=239)) ) {
+                alt604=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 604, 0, input);
+
+                throw nvae;
+            }
+            switch (alt604) {
+                case 1 :
+                    // InternalFormalML.g:28889:3: this_LiteralPureReferenceElement_0= ruleLiteralPureReferenceElement
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralPureReferenceElementParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralPureReferenceElement_0=ruleLiteralPureReferenceElement();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralPureReferenceElement_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:28901:3: this_LiteralReferenceMachineContext_1= ruleLiteralReferenceMachineContext
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			/* */
+                      		
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getLiteralPureReferenceExpressionAccess().getLiteralReferenceMachineContextParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FollowSets000.FOLLOW_2);
+                    this_LiteralReferenceMachineContext_1=ruleLiteralReferenceMachineContext();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_LiteralReferenceMachineContext_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLiteralPureReferenceExpression"
+
+
+    // $ANTLR start "entryRuleValueSelectionExpression"
+    // InternalFormalML.g:28916:1: entryRuleValueSelectionExpression returns [EObject current=null] : iv_ruleValueSelectionExpression= ruleValueSelectionExpression EOF ;
+    public final EObject entryRuleValueSelectionExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleValueSelectionExpression = null;
+
+
+        try {
+            // InternalFormalML.g:28916:65: (iv_ruleValueSelectionExpression= ruleValueSelectionExpression EOF )
+            // InternalFormalML.g:28917:2: iv_ruleValueSelectionExpression= ruleValueSelectionExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getValueSelectionExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleValueSelectionExpression=ruleValueSelectionExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleValueSelectionExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleValueSelectionExpression"
+
+
+    // $ANTLR start "ruleValueSelectionExpression"
+    // InternalFormalML.g:28923:1: ruleValueSelectionExpression returns [EObject current=null] : (this_LiteralReferenceExpression_0= ruleLiteralReferenceExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )? )* ( () otherlv_8= '->' ( ( ruleESIdentifier ) ) ( ( (lv_kind_10_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_11_0= rulePositionalTupleExpressionList ) ) otherlv_12= ']' )? ( () otherlv_14= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )? )* )? ) ;
+    public final EObject ruleValueSelectionExpression() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_2=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_12=null;
+        Token otherlv_14=null;
+        Token otherlv_18=null;
+        EObject this_LiteralReferenceExpression_0 = null;
+
+        Enumerator lv_kind_4_0 = null;
+
+        EObject lv_arg_5_0 = null;
+
+        Enumerator lv_kind_10_0 = null;
+
+        EObject lv_arg_11_0 = null;
+
+        Enumerator lv_kind_16_0 = null;
+
+        EObject lv_arg_17_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:28929:2: ( (this_LiteralReferenceExpression_0= ruleLiteralReferenceExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )? )* ( () otherlv_8= '->' ( ( ruleESIdentifier ) ) ( ( (lv_kind_10_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_11_0= rulePositionalTupleExpressionList ) ) otherlv_12= ']' )? ( () otherlv_14= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )? )* )? ) )
+            // InternalFormalML.g:28930:2: (this_LiteralReferenceExpression_0= ruleLiteralReferenceExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )? )* ( () otherlv_8= '->' ( ( ruleESIdentifier ) ) ( ( (lv_kind_10_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_11_0= rulePositionalTupleExpressionList ) ) otherlv_12= ']' )? ( () otherlv_14= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )? )* )? )
+            {
+            // InternalFormalML.g:28930:2: (this_LiteralReferenceExpression_0= ruleLiteralReferenceExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )? )* ( () otherlv_8= '->' ( ( ruleESIdentifier ) ) ( ( (lv_kind_10_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_11_0= rulePositionalTupleExpressionList ) ) otherlv_12= ']' )? ( () otherlv_14= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )? )* )? )
+            // InternalFormalML.g:28931:3: this_LiteralReferenceExpression_0= ruleLiteralReferenceExpression ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )? )* ( () otherlv_8= '->' ( ( ruleESIdentifier ) ) ( ( (lv_kind_10_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_11_0= rulePositionalTupleExpressionList ) ) otherlv_12= ']' )? ( () otherlv_14= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )? )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getLiteralReferenceExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_123);
+            this_LiteralReferenceExpression_0=ruleLiteralReferenceExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_LiteralReferenceExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:28942:3: ( () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )? )*
+            loop606:
+            do {
+                int alt606=2;
+                int LA606_0 = input.LA(1);
+
+                if ( (LA606_0==29) ) {
+                    int LA606_2 = input.LA(2);
+
+                    if ( (LA606_2==RULE_XLIA_ID) ) {
+                        alt606=1;
+                    }
+
+
+                }
+
+
+                switch (alt606) {
+            	case 1 :
+            	    // InternalFormalML.g:28943:4: () otherlv_2= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )?
+            	    {
+            	    // InternalFormalML.g:28943:4: ()
+            	    // InternalFormalML.g:28944:5: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					/* */
+            	      				
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      					current = forceCreateModelElementAndSet(
+            	      						grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_1_0(),
+            	      						current);
+            	      				
+            	    }
+
+            	    }
+
+            	    otherlv_2=(Token)match(input,29,FollowSets000.FOLLOW_19); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      				newLeafNode(otherlv_2, grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_1_1());
+            	      			
+            	    }
+            	    // InternalFormalML.g:28957:4: ( ( ruleESIdentifier ) )
+            	    // InternalFormalML.g:28958:5: ( ruleESIdentifier )
+            	    {
+            	    // InternalFormalML.g:28958:5: ( ruleESIdentifier )
+            	    // InternalFormalML.g:28959:6: ruleESIdentifier
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						/* */
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElement(grammarAccess.getValueSelectionExpressionRule());
+            	      						}
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_1_2_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_248);
+            	    ruleESIdentifier();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:28976:4: ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )?
+            	    int alt605=2;
+            	    int LA605_0 = input.LA(1);
+
+            	    if ( (LA605_0==97) ) {
+            	        int LA605_1 = input.LA(2);
+
+            	        if ( ((LA605_1>=RULE_XLIA_ID && LA605_1<=RULE_STRING)||LA605_1==16||LA605_1==22||(LA605_1>=26 && LA605_1<=29)||LA605_1==56||LA605_1==212||(LA605_1>=216 && LA605_1<=224)||(LA605_1>=227 && LA605_1<=239)) ) {
+            	            alt605=1;
+            	        }
+            	    }
+            	    switch (alt605) {
+            	        case 1 :
+            	            // InternalFormalML.g:28977:5: ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']'
+            	            {
+            	            // InternalFormalML.g:28977:5: ( (lv_kind_4_0= ruleValueIndexExpressionKind ) )
+            	            // InternalFormalML.g:28978:6: (lv_kind_4_0= ruleValueIndexExpressionKind )
+            	            {
+            	            // InternalFormalML.g:28978:6: (lv_kind_4_0= ruleValueIndexExpressionKind )
+            	            // InternalFormalML.g:28979:7: lv_kind_4_0= ruleValueIndexExpressionKind
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0());
+            	              						
+            	            }
+            	            pushFollow(FollowSets000.FOLLOW_13);
+            	            lv_kind_4_0=ruleValueIndexExpressionKind();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              							if (current==null) {
+            	              								current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+            	              							}
+            	              							set(
+            	              								current,
+            	              								"kind",
+            	              								lv_kind_4_0,
+            	              								"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+            	              							afterParserOrEnumRuleCall();
+            	              						
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            // InternalFormalML.g:28996:5: ( (lv_arg_5_0= rulePositionalTupleExpressionList ) )
+            	            // InternalFormalML.g:28997:6: (lv_arg_5_0= rulePositionalTupleExpressionList )
+            	            {
+            	            // InternalFormalML.g:28997:6: (lv_arg_5_0= rulePositionalTupleExpressionList )
+            	            // InternalFormalML.g:28998:7: lv_arg_5_0= rulePositionalTupleExpressionList
+            	            {
+            	            if ( state.backtracking==0 ) {
+
+            	              							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_1_0());
+            	              						
+            	            }
+            	            pushFollow(FollowSets000.FOLLOW_110);
+            	            lv_arg_5_0=rulePositionalTupleExpressionList();
+
+            	            state._fsp--;
+            	            if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              							if (current==null) {
+            	              								current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+            	              							}
+            	              							set(
+            	              								current,
+            	              								"arg",
+            	              								lv_arg_5_0,
+            	              								"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+            	              							afterParserOrEnumRuleCall();
+            	              						
+            	            }
+
+            	            }
+
+
+            	            }
+
+            	            otherlv_6=(Token)match(input,99,FollowSets000.FOLLOW_123); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              					newLeafNode(otherlv_6, grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_1_3_2());
+            	              				
+            	            }
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop606;
+                }
+            } while (true);
+
+            // InternalFormalML.g:29021:3: ( () otherlv_8= '->' ( ( ruleESIdentifier ) ) ( ( (lv_kind_10_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_11_0= rulePositionalTupleExpressionList ) ) otherlv_12= ']' )? ( () otherlv_14= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )? )* )?
+            int alt610=2;
+            int LA610_0 = input.LA(1);
+
+            if ( (LA610_0==92) ) {
+                alt610=1;
+            }
+            switch (alt610) {
+                case 1 :
+                    // InternalFormalML.g:29022:4: () otherlv_8= '->' ( ( ruleESIdentifier ) ) ( ( (lv_kind_10_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_11_0= rulePositionalTupleExpressionList ) ) otherlv_12= ']' )? ( () otherlv_14= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )? )*
+                    {
+                    // InternalFormalML.g:29022:4: ()
+                    // InternalFormalML.g:29023:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndSet(
+                      						grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    otherlv_8=(Token)match(input,92,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_8, grammarAccess.getValueSelectionExpressionAccess().getHyphenMinusGreaterThanSignKeyword_2_1());
+                      			
+                    }
+                    // InternalFormalML.g:29036:4: ( ( ruleESIdentifier ) )
+                    // InternalFormalML.g:29037:5: ( ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:29037:5: ( ruleESIdentifier )
+                    // InternalFormalML.g:29038:6: ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getValueSelectionExpressionRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_249);
+                    ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:29055:4: ( ( (lv_kind_10_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_11_0= rulePositionalTupleExpressionList ) ) otherlv_12= ']' )?
+                    int alt607=2;
+                    int LA607_0 = input.LA(1);
+
+                    if ( (LA607_0==97) ) {
+                        int LA607_1 = input.LA(2);
+
+                        if ( ((LA607_1>=RULE_XLIA_ID && LA607_1<=RULE_STRING)||LA607_1==16||LA607_1==22||(LA607_1>=26 && LA607_1<=29)||LA607_1==56||LA607_1==212||(LA607_1>=216 && LA607_1<=224)||(LA607_1>=227 && LA607_1<=239)) ) {
+                            alt607=1;
+                        }
+                    }
+                    switch (alt607) {
+                        case 1 :
+                            // InternalFormalML.g:29056:5: ( (lv_kind_10_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_11_0= rulePositionalTupleExpressionList ) ) otherlv_12= ']'
+                            {
+                            // InternalFormalML.g:29056:5: ( (lv_kind_10_0= ruleValueIndexExpressionKind ) )
+                            // InternalFormalML.g:29057:6: (lv_kind_10_0= ruleValueIndexExpressionKind )
+                            {
+                            // InternalFormalML.g:29057:6: (lv_kind_10_0= ruleValueIndexExpressionKind )
+                            // InternalFormalML.g:29058:7: lv_kind_10_0= ruleValueIndexExpressionKind
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_13);
+                            lv_kind_10_0=ruleValueIndexExpressionKind();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+                              							}
+                              							set(
+                              								current,
+                              								"kind",
+                              								lv_kind_10_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            // InternalFormalML.g:29075:5: ( (lv_arg_11_0= rulePositionalTupleExpressionList ) )
+                            // InternalFormalML.g:29076:6: (lv_arg_11_0= rulePositionalTupleExpressionList )
+                            {
+                            // InternalFormalML.g:29076:6: (lv_arg_11_0= rulePositionalTupleExpressionList )
+                            // InternalFormalML.g:29077:7: lv_arg_11_0= rulePositionalTupleExpressionList
+                            {
+                            if ( state.backtracking==0 ) {
+
+                              							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_1_0());
+                              						
+                            }
+                            pushFollow(FollowSets000.FOLLOW_110);
+                            lv_arg_11_0=rulePositionalTupleExpressionList();
+
+                            state._fsp--;
+                            if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+                              							}
+                              							set(
+                              								current,
+                              								"arg",
+                              								lv_arg_11_0,
+                              								"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+                              							afterParserOrEnumRuleCall();
+                              						
+                            }
+
+                            }
+
+
+                            }
+
+                            otherlv_12=(Token)match(input,99,FollowSets000.FOLLOW_242); if (state.failed) return current;
+                            if ( state.backtracking==0 ) {
+
+                              					newLeafNode(otherlv_12, grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_3_2());
+                              				
+                            }
+
+                            }
+                            break;
+
+                    }
+
+                    // InternalFormalML.g:29099:4: ( () otherlv_14= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )? )*
+                    loop609:
+                    do {
+                        int alt609=2;
+                        int LA609_0 = input.LA(1);
+
+                        if ( (LA609_0==29) ) {
+                            int LA609_2 = input.LA(2);
+
+                            if ( (LA609_2==RULE_XLIA_ID) ) {
+                                alt609=1;
+                            }
+
+
+                        }
+
+
+                        switch (alt609) {
+                    	case 1 :
+                    	    // InternalFormalML.g:29100:5: () otherlv_14= '.' ( ( ruleESIdentifier ) ) ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )?
+                    	    {
+                    	    // InternalFormalML.g:29100:5: ()
+                    	    // InternalFormalML.g:29101:6: 
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						/* */
+                    	      					
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						current = forceCreateModelElementAndSet(
+                    	      							grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_4_0(),
+                    	      							current);
+                    	      					
+                    	    }
+
+                    	    }
+
+                    	    otherlv_14=(Token)match(input,29,FollowSets000.FOLLOW_19); if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      					newLeafNode(otherlv_14, grammarAccess.getValueSelectionExpressionAccess().getFullStopKeyword_2_4_1());
+                    	      				
+                    	    }
+                    	    // InternalFormalML.g:29114:5: ( ( ruleESIdentifier ) )
+                    	    // InternalFormalML.g:29115:6: ( ruleESIdentifier )
+                    	    {
+                    	    // InternalFormalML.g:29115:6: ( ruleESIdentifier )
+                    	    // InternalFormalML.g:29116:7: ruleESIdentifier
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							/* */
+                    	      						
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElement(grammarAccess.getValueSelectionExpressionRule());
+                    	      							}
+                    	      						
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getElementNamedElementCrossReference_2_4_2_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_249);
+                    	    ruleESIdentifier();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalFormalML.g:29133:5: ( ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']' )?
+                    	    int alt608=2;
+                    	    int LA608_0 = input.LA(1);
+
+                    	    if ( (LA608_0==97) ) {
+                    	        int LA608_1 = input.LA(2);
+
+                    	        if ( ((LA608_1>=RULE_XLIA_ID && LA608_1<=RULE_STRING)||LA608_1==16||LA608_1==22||(LA608_1>=26 && LA608_1<=29)||LA608_1==56||LA608_1==212||(LA608_1>=216 && LA608_1<=224)||(LA608_1>=227 && LA608_1<=239)) ) {
+                    	            alt608=1;
+                    	        }
+                    	    }
+                    	    switch (alt608) {
+                    	        case 1 :
+                    	            // InternalFormalML.g:29134:6: ( (lv_kind_16_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_17_0= rulePositionalTupleExpressionList ) ) otherlv_18= ']'
+                    	            {
+                    	            // InternalFormalML.g:29134:6: ( (lv_kind_16_0= ruleValueIndexExpressionKind ) )
+                    	            // InternalFormalML.g:29135:7: (lv_kind_16_0= ruleValueIndexExpressionKind )
+                    	            {
+                    	            // InternalFormalML.g:29135:7: (lv_kind_16_0= ruleValueIndexExpressionKind )
+                    	            // InternalFormalML.g:29136:8: lv_kind_16_0= ruleValueIndexExpressionKind
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_13);
+                    	            lv_kind_16_0=ruleValueIndexExpressionKind();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+                    	              								}
+                    	              								set(
+                    	              									current,
+                    	              									"kind",
+                    	              									lv_kind_16_0,
+                    	              									"org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            // InternalFormalML.g:29153:6: ( (lv_arg_17_0= rulePositionalTupleExpressionList ) )
+                    	            // InternalFormalML.g:29154:7: (lv_arg_17_0= rulePositionalTupleExpressionList )
+                    	            {
+                    	            // InternalFormalML.g:29154:7: (lv_arg_17_0= rulePositionalTupleExpressionList )
+                    	            // InternalFormalML.g:29155:8: lv_arg_17_0= rulePositionalTupleExpressionList
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								newCompositeNode(grammarAccess.getValueSelectionExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0());
+                    	              							
+                    	            }
+                    	            pushFollow(FollowSets000.FOLLOW_110);
+                    	            lv_arg_17_0=rulePositionalTupleExpressionList();
+
+                    	            state._fsp--;
+                    	            if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getValueSelectionExpressionRule());
+                    	              								}
+                    	              								set(
+                    	              									current,
+                    	              									"arg",
+                    	              									lv_arg_17_0,
+                    	              									"org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            otherlv_18=(Token)match(input,99,FollowSets000.FOLLOW_242); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	              						newLeafNode(otherlv_18, grammarAccess.getValueSelectionExpressionAccess().getRightSquareBracketKeyword_2_4_3_2());
+                    	              					
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop609;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleValueSelectionExpression"
+
+
+    // $ANTLR start "entryRuleValuePureNamedMachineExpression"
+    // InternalFormalML.g:29183:1: entryRuleValuePureNamedMachineExpression returns [EObject current=null] : iv_ruleValuePureNamedMachineExpression= ruleValuePureNamedMachineExpression EOF ;
+    public final EObject entryRuleValuePureNamedMachineExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleValuePureNamedMachineExpression = null;
+
+
+        try {
+            // InternalFormalML.g:29183:72: (iv_ruleValuePureNamedMachineExpression= ruleValuePureNamedMachineExpression EOF )
+            // InternalFormalML.g:29184:2: iv_ruleValuePureNamedMachineExpression= ruleValuePureNamedMachineExpression EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionRule()); 
+            }
+            pushFollow(FollowSets000.FOLLOW_1);
+            iv_ruleValuePureNamedMachineExpression=ruleValuePureNamedMachineExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleValuePureNamedMachineExpression; 
+            }
+            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleValuePureNamedMachineExpression"
+
+
+    // $ANTLR start "ruleValuePureNamedMachineExpression"
+    // InternalFormalML.g:29190:1: ruleValuePureNamedMachineExpression returns [EObject current=null] : (this_LiteralPureReferenceExpression_0= ruleLiteralPureReferenceExpression ( () ( (lv_kind_2_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* ( () ( (lv_kind_5_0= ruleValueArrowFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) ( () ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* )? ) ;
+    public final EObject ruleValuePureNamedMachineExpression() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_LiteralPureReferenceExpression_0 = null;
+
+        Enumerator lv_kind_2_0 = null;
+
+        Enumerator lv_kind_5_0 = null;
+
+        Enumerator lv_kind_8_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29196:2: ( (this_LiteralPureReferenceExpression_0= ruleLiteralPureReferenceExpression ( () ( (lv_kind_2_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* ( () ( (lv_kind_5_0= ruleValueArrowFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) ( () ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* )? ) )
+            // InternalFormalML.g:29197:2: (this_LiteralPureReferenceExpression_0= ruleLiteralPureReferenceExpression ( () ( (lv_kind_2_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* ( () ( (lv_kind_5_0= ruleValueArrowFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) ( () ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* )? )
+            {
+            // InternalFormalML.g:29197:2: (this_LiteralPureReferenceExpression_0= ruleLiteralPureReferenceExpression ( () ( (lv_kind_2_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* ( () ( (lv_kind_5_0= ruleValueArrowFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) ( () ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* )? )
+            // InternalFormalML.g:29198:3: this_LiteralPureReferenceExpression_0= ruleLiteralPureReferenceExpression ( () ( (lv_kind_2_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* ( () ( (lv_kind_5_0= ruleValueArrowFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) ( () ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* )?
+            {
+            if ( state.backtracking==0 ) {
+
+              			/* */
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              			newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getLiteralPureReferenceExpressionParserRuleCall_0());
+              		
+            }
+            pushFollow(FollowSets000.FOLLOW_123);
+            this_LiteralPureReferenceExpression_0=ruleLiteralPureReferenceExpression();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = this_LiteralPureReferenceExpression_0;
+              			afterParserOrEnumRuleCall();
+              		
+            }
+            // InternalFormalML.g:29209:3: ( () ( (lv_kind_2_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )*
+            loop611:
+            do {
+                int alt611=2;
+                int LA611_0 = input.LA(1);
+
+                if ( (LA611_0==29) ) {
+                    alt611=1;
+                }
+
+
+                switch (alt611) {
+            	case 1 :
+            	    // InternalFormalML.g:29210:4: () ( (lv_kind_2_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) )
+            	    {
+            	    // InternalFormalML.g:29210:4: ()
+            	    // InternalFormalML.g:29211:5: 
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      					/* */
+            	      				
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      					current = forceCreateModelElementAndSet(
+            	      						grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_1_0(),
+            	      						current);
+            	      				
+            	    }
+
+            	    }
+
+            	    // InternalFormalML.g:29220:4: ( (lv_kind_2_0= ruleValueDotFieldExpressionKind ) )
+            	    // InternalFormalML.g:29221:5: (lv_kind_2_0= ruleValueDotFieldExpressionKind )
+            	    {
+            	    // InternalFormalML.g:29221:5: (lv_kind_2_0= ruleValueDotFieldExpressionKind )
+            	    // InternalFormalML.g:29222:6: lv_kind_2_0= ruleValueDotFieldExpressionKind
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_19);
+            	    lv_kind_2_0=ruleValueDotFieldExpressionKind();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getValuePureNamedMachineExpressionRule());
+            	      						}
+            	      						set(
+            	      							current,
+            	      							"kind",
+            	      							lv_kind_2_0,
+            	      							"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+            	    // InternalFormalML.g:29239:4: ( ( ruleESIdentifier ) )
+            	    // InternalFormalML.g:29240:5: ( ruleESIdentifier )
+            	    {
+            	    // InternalFormalML.g:29240:5: ( ruleESIdentifier )
+            	    // InternalFormalML.g:29241:6: ruleESIdentifier
+            	    {
+            	    if ( state.backtracking==0 ) {
+
+            	      						/* */
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						if (current==null) {
+            	      							current = createModelElement(grammarAccess.getValuePureNamedMachineExpressionRule());
+            	      						}
+            	      					
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      						newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_1_2_0());
+            	      					
+            	    }
+            	    pushFollow(FollowSets000.FOLLOW_123);
+            	    ruleESIdentifier();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      						afterParserOrEnumRuleCall();
+            	      					
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop611;
+                }
+            } while (true);
+
+            // InternalFormalML.g:29259:3: ( () ( (lv_kind_5_0= ruleValueArrowFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) ( () ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )* )?
+            int alt613=2;
+            int LA613_0 = input.LA(1);
+
+            if ( (LA613_0==92) ) {
+                alt613=1;
+            }
+            switch (alt613) {
+                case 1 :
+                    // InternalFormalML.g:29260:4: () ( (lv_kind_5_0= ruleValueArrowFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) ( () ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )*
+                    {
+                    // InternalFormalML.g:29260:4: ()
+                    // InternalFormalML.g:29261:5: 
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					/* */
+                      				
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      					current = forceCreateModelElementAndSet(
+                      						grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_0(),
+                      						current);
+                      				
+                    }
+
+                    }
+
+                    // InternalFormalML.g:29270:4: ( (lv_kind_5_0= ruleValueArrowFieldExpressionKind ) )
+                    // InternalFormalML.g:29271:5: (lv_kind_5_0= ruleValueArrowFieldExpressionKind )
+                    {
+                    // InternalFormalML.g:29271:5: (lv_kind_5_0= ruleValueArrowFieldExpressionKind )
+                    // InternalFormalML.g:29272:6: lv_kind_5_0= ruleValueArrowFieldExpressionKind
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueArrowFieldExpressionKindEnumRuleCall_2_1_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_19);
+                    lv_kind_5_0=ruleValueArrowFieldExpressionKind();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getValuePureNamedMachineExpressionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"kind",
+                      							lv_kind_5_0,
+                      							"org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:29289:4: ( ( ruleESIdentifier ) )
+                    // InternalFormalML.g:29290:5: ( ruleESIdentifier )
+                    {
+                    // InternalFormalML.g:29290:5: ( ruleESIdentifier )
+                    // InternalFormalML.g:29291:6: ruleESIdentifier
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						/* */
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getValuePureNamedMachineExpressionRule());
+                      						}
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_2_0());
+                      					
+                    }
+                    pushFollow(FollowSets000.FOLLOW_242);
+                    ruleESIdentifier();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalFormalML.g:29308:4: ( () ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) ) )*
+                    loop612:
+                    do {
+                        int alt612=2;
+                        int LA612_0 = input.LA(1);
+
+                        if ( (LA612_0==29) ) {
+                            alt612=1;
+                        }
+
+
+                        switch (alt612) {
+                    	case 1 :
+                    	    // InternalFormalML.g:29309:5: () ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) ) ( ( ruleESIdentifier ) )
+                    	    {
+                    	    // InternalFormalML.g:29309:5: ()
+                    	    // InternalFormalML.g:29310:6: 
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						/* */
+                    	      					
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      						current = forceCreateModelElementAndSet(
+                    	      							grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_3_0(),
+                    	      							current);
+                    	      					
+                    	    }
+
+                    	    }
+
+                    	    // InternalFormalML.g:29319:5: ( (lv_kind_8_0= ruleValueDotFieldExpressionKind ) )
+                    	    // InternalFormalML.g:29320:6: (lv_kind_8_0= ruleValueDotFieldExpressionKind )
+                    	    {
+                    	    // InternalFormalML.g:29320:6: (lv_kind_8_0= ruleValueDotFieldExpressionKind )
+                    	    // InternalFormalML.g:29321:7: lv_kind_8_0= ruleValueDotFieldExpressionKind
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_2_3_1_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_19);
+                    	    lv_kind_8_0=ruleValueDotFieldExpressionKind();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getValuePureNamedMachineExpressionRule());
+                    	      							}
+                    	      							set(
+                    	      								current,
+                    	      								"kind",
+                    	      								lv_kind_8_0,
+                    	      								"org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // InternalFormalML.g:29338:5: ( ( ruleESIdentifier ) )
+                    	    // InternalFormalML.g:29339:6: ( ruleESIdentifier )
+                    	    {
+                    	    // InternalFormalML.g:29339:6: ( ruleESIdentifier )
+                    	    // InternalFormalML.g:29340:7: ruleESIdentifier
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							/* */
+                    	      						
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElement(grammarAccess.getValuePureNamedMachineExpressionRule());
+                    	      							}
+                    	      						
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementCrossReference_2_3_2_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FollowSets000.FOLLOW_242);
+                    	    ruleESIdentifier();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop612;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleValuePureNamedMachineExpression"
+
+
+    // $ANTLR start "ruleVisibilityKind"
+    // InternalFormalML.g:29363:1: ruleVisibilityKind returns [Enumerator current=null] : ( (enumLiteral_0= 'public' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'package' ) ) ;
+    public final Enumerator ruleVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29369:2: ( ( (enumLiteral_0= 'public' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'package' ) ) )
+            // InternalFormalML.g:29370:2: ( (enumLiteral_0= 'public' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'package' ) )
+            {
+            // InternalFormalML.g:29370:2: ( (enumLiteral_0= 'public' ) | (enumLiteral_1= 'private' ) | (enumLiteral_2= 'protected' ) | (enumLiteral_3= 'package' ) )
+            int alt614=4;
+            switch ( input.LA(1) ) {
+            case 240:
+                {
+                alt614=1;
+                }
+                break;
+            case 241:
+                {
+                alt614=2;
+                }
+                break;
+            case 242:
+                {
+                alt614=3;
+                }
+                break;
+            case 19:
+                {
+                alt614=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 614, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt614) {
+                case 1 :
+                    // InternalFormalML.g:29371:3: (enumLiteral_0= 'public' )
+                    {
+                    // InternalFormalML.g:29371:3: (enumLiteral_0= 'public' )
+                    // InternalFormalML.g:29372:4: enumLiteral_0= 'public'
+                    {
+                    enumLiteral_0=(Token)match(input,240,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getVisibilityKindAccess().getPublicEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29379:3: (enumLiteral_1= 'private' )
+                    {
+                    // InternalFormalML.g:29379:3: (enumLiteral_1= 'private' )
+                    // InternalFormalML.g:29380:4: enumLiteral_1= 'private'
+                    {
+                    enumLiteral_1=(Token)match(input,241,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getVisibilityKindAccess().getPrivateEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:29387:3: (enumLiteral_2= 'protected' )
+                    {
+                    // InternalFormalML.g:29387:3: (enumLiteral_2= 'protected' )
+                    // InternalFormalML.g:29388:4: enumLiteral_2= 'protected'
+                    {
+                    enumLiteral_2=(Token)match(input,242,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getVisibilityKindAccess().getProtectedEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:29395:3: (enumLiteral_3= 'package' )
+                    {
+                    // InternalFormalML.g:29395:3: (enumLiteral_3= 'package' )
+                    // InternalFormalML.g:29396:4: enumLiteral_3= 'package'
+                    {
+                    enumLiteral_3=(Token)match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getVisibilityKindAccess().getPackageEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleVisibilityKind"
+
+
+    // $ANTLR start "ruleDesignKind"
+    // InternalFormalML.g:29406:1: ruleDesignKind returns [Enumerator current=null] : ( (enumLiteral_0= 'model' ) | (enumLiteral_1= 'prototype' ) ) ;
+    public final Enumerator ruleDesignKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29412:2: ( ( (enumLiteral_0= 'model' ) | (enumLiteral_1= 'prototype' ) ) )
+            // InternalFormalML.g:29413:2: ( (enumLiteral_0= 'model' ) | (enumLiteral_1= 'prototype' ) )
+            {
+            // InternalFormalML.g:29413:2: ( (enumLiteral_0= 'model' ) | (enumLiteral_1= 'prototype' ) )
+            int alt615=2;
+            int LA615_0 = input.LA(1);
+
+            if ( (LA615_0==243) ) {
+                alt615=1;
+            }
+            else if ( (LA615_0==244) ) {
+                alt615=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 615, 0, input);
+
+                throw nvae;
+            }
+            switch (alt615) {
+                case 1 :
+                    // InternalFormalML.g:29414:3: (enumLiteral_0= 'model' )
+                    {
+                    // InternalFormalML.g:29414:3: (enumLiteral_0= 'model' )
+                    // InternalFormalML.g:29415:4: enumLiteral_0= 'model'
+                    {
+                    enumLiteral_0=(Token)match(input,243,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getDesignKindAccess().getModelEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29422:3: (enumLiteral_1= 'prototype' )
+                    {
+                    // InternalFormalML.g:29422:3: (enumLiteral_1= 'prototype' )
+                    // InternalFormalML.g:29423:4: enumLiteral_1= 'prototype'
+                    {
+                    enumLiteral_1=(Token)match(input,244,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getDesignKindAccess().getPrototypeEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDesignKind"
+
+
+    // $ANTLR start "rulePseudostateKind"
+    // InternalFormalML.g:29433:1: rulePseudostateKind returns [Enumerator current=null] : ( (enumLiteral_0= 'junction' ) | (enumLiteral_1= 'choice' ) | (enumLiteral_2= 'entryPoint' ) | (enumLiteral_3= 'exitPoint' ) | (enumLiteral_4= 'fork' ) | (enumLiteral_5= 'join' ) | (enumLiteral_6= 'dhistory' ) | (enumLiteral_7= 'shistory' ) ) ;
+    public final Enumerator rulePseudostateKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+        Token enumLiteral_4=null;
+        Token enumLiteral_5=null;
+        Token enumLiteral_6=null;
+        Token enumLiteral_7=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29439:2: ( ( (enumLiteral_0= 'junction' ) | (enumLiteral_1= 'choice' ) | (enumLiteral_2= 'entryPoint' ) | (enumLiteral_3= 'exitPoint' ) | (enumLiteral_4= 'fork' ) | (enumLiteral_5= 'join' ) | (enumLiteral_6= 'dhistory' ) | (enumLiteral_7= 'shistory' ) ) )
+            // InternalFormalML.g:29440:2: ( (enumLiteral_0= 'junction' ) | (enumLiteral_1= 'choice' ) | (enumLiteral_2= 'entryPoint' ) | (enumLiteral_3= 'exitPoint' ) | (enumLiteral_4= 'fork' ) | (enumLiteral_5= 'join' ) | (enumLiteral_6= 'dhistory' ) | (enumLiteral_7= 'shistory' ) )
+            {
+            // InternalFormalML.g:29440:2: ( (enumLiteral_0= 'junction' ) | (enumLiteral_1= 'choice' ) | (enumLiteral_2= 'entryPoint' ) | (enumLiteral_3= 'exitPoint' ) | (enumLiteral_4= 'fork' ) | (enumLiteral_5= 'join' ) | (enumLiteral_6= 'dhistory' ) | (enumLiteral_7= 'shistory' ) )
+            int alt616=8;
+            switch ( input.LA(1) ) {
+            case 245:
+                {
+                alt616=1;
+                }
+                break;
+            case 127:
+                {
+                alt616=2;
+                }
+                break;
+            case 246:
+                {
+                alt616=3;
+                }
+                break;
+            case 247:
+                {
+                alt616=4;
+                }
+                break;
+            case 248:
+                {
+                alt616=5;
+                }
+                break;
+            case 249:
+                {
+                alt616=6;
+                }
+                break;
+            case 250:
+                {
+                alt616=7;
+                }
+                break;
+            case 251:
+                {
+                alt616=8;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 616, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt616) {
+                case 1 :
+                    // InternalFormalML.g:29441:3: (enumLiteral_0= 'junction' )
+                    {
+                    // InternalFormalML.g:29441:3: (enumLiteral_0= 'junction' )
+                    // InternalFormalML.g:29442:4: enumLiteral_0= 'junction'
+                    {
+                    enumLiteral_0=(Token)match(input,245,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29449:3: (enumLiteral_1= 'choice' )
+                    {
+                    // InternalFormalML.g:29449:3: (enumLiteral_1= 'choice' )
+                    // InternalFormalML.g:29450:4: enumLiteral_1= 'choice'
+                    {
+                    enumLiteral_1=(Token)match(input,127,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:29457:3: (enumLiteral_2= 'entryPoint' )
+                    {
+                    // InternalFormalML.g:29457:3: (enumLiteral_2= 'entryPoint' )
+                    // InternalFormalML.g:29458:4: enumLiteral_2= 'entryPoint'
+                    {
+                    enumLiteral_2=(Token)match(input,246,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getPseudostateKindAccess().getJunctionEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:29465:3: (enumLiteral_3= 'exitPoint' )
+                    {
+                    // InternalFormalML.g:29465:3: (enumLiteral_3= 'exitPoint' )
+                    // InternalFormalML.g:29466:4: enumLiteral_3= 'exitPoint'
+                    {
+                    enumLiteral_3=(Token)match(input,247,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getPseudostateKindAccess().getChoiceEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:29473:3: (enumLiteral_4= 'fork' )
+                    {
+                    // InternalFormalML.g:29473:3: (enumLiteral_4= 'fork' )
+                    // InternalFormalML.g:29474:4: enumLiteral_4= 'fork'
+                    {
+                    enumLiteral_4=(Token)match(input,248,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_4, grammarAccess.getPseudostateKindAccess().getForkEnumLiteralDeclaration_4());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:29481:3: (enumLiteral_5= 'join' )
+                    {
+                    // InternalFormalML.g:29481:3: (enumLiteral_5= 'join' )
+                    // InternalFormalML.g:29482:4: enumLiteral_5= 'join'
+                    {
+                    enumLiteral_5=(Token)match(input,249,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_5, grammarAccess.getPseudostateKindAccess().getJoinEnumLiteralDeclaration_5());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:29489:3: (enumLiteral_6= 'dhistory' )
+                    {
+                    // InternalFormalML.g:29489:3: (enumLiteral_6= 'dhistory' )
+                    // InternalFormalML.g:29490:4: enumLiteral_6= 'dhistory'
+                    {
+                    enumLiteral_6=(Token)match(input,250,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_6, grammarAccess.getPseudostateKindAccess().getDeepHistoryEnumLiteralDeclaration_6());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:29497:3: (enumLiteral_7= 'shistory' )
+                    {
+                    // InternalFormalML.g:29497:3: (enumLiteral_7= 'shistory' )
+                    // InternalFormalML.g:29498:4: enumLiteral_7= 'shistory'
+                    {
+                    enumLiteral_7=(Token)match(input,251,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_7, grammarAccess.getPseudostateKindAccess().getShallowHistoryEnumLiteralDeclaration_7());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePseudostateKind"
+
+
+    // $ANTLR start "rulePseudostateInitialKind"
+    // InternalFormalML.g:29508:1: rulePseudostateInitialKind returns [Enumerator current=null] : (enumLiteral_0= 'initial' ) ;
+    public final Enumerator rulePseudostateInitialKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29514:2: ( (enumLiteral_0= 'initial' ) )
+            // InternalFormalML.g:29515:2: (enumLiteral_0= 'initial' )
+            {
+            // InternalFormalML.g:29515:2: (enumLiteral_0= 'initial' )
+            // InternalFormalML.g:29516:3: enumLiteral_0= 'initial'
+            {
+            enumLiteral_0=(Token)match(input,252,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPseudostateInitialKindAccess().getInitialEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePseudostateInitialKind"
+
+
+    // $ANTLR start "ruleEndingPseudostateKind"
+    // InternalFormalML.g:29525:1: ruleEndingPseudostateKind returns [Enumerator current=null] : ( (enumLiteral_0= 'terminal' ) | (enumLiteral_1= 'return' ) ) ;
+    public final Enumerator ruleEndingPseudostateKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29531:2: ( ( (enumLiteral_0= 'terminal' ) | (enumLiteral_1= 'return' ) ) )
+            // InternalFormalML.g:29532:2: ( (enumLiteral_0= 'terminal' ) | (enumLiteral_1= 'return' ) )
+            {
+            // InternalFormalML.g:29532:2: ( (enumLiteral_0= 'terminal' ) | (enumLiteral_1= 'return' ) )
+            int alt617=2;
+            int LA617_0 = input.LA(1);
+
+            if ( (LA617_0==253) ) {
+                alt617=1;
+            }
+            else if ( (LA617_0==64) ) {
+                alt617=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 617, 0, input);
+
+                throw nvae;
+            }
+            switch (alt617) {
+                case 1 :
+                    // InternalFormalML.g:29533:3: (enumLiteral_0= 'terminal' )
+                    {
+                    // InternalFormalML.g:29533:3: (enumLiteral_0= 'terminal' )
+                    // InternalFormalML.g:29534:4: enumLiteral_0= 'terminal'
+                    {
+                    enumLiteral_0=(Token)match(input,253,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getEndingPseudostateKindAccess().getTerminateEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getEndingPseudostateKindAccess().getTerminateEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29541:3: (enumLiteral_1= 'return' )
+                    {
+                    // InternalFormalML.g:29541:3: (enumLiteral_1= 'return' )
+                    // InternalFormalML.g:29542:4: enumLiteral_1= 'return'
+                    {
+                    enumLiteral_1=(Token)match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getEndingPseudostateKindAccess().getReturnEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEndingPseudostateKind"
+
+
+    // $ANTLR start "ruleComProtocolKind"
+    // InternalFormalML.g:29552:1: ruleComProtocolKind returns [Enumerator current=null] : ( (enumLiteral_0= 'env' ) | (enumLiteral_1= 'rdv' ) | (enumLiteral_2= 'multi_rdv' ) ) ;
+    public final Enumerator ruleComProtocolKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29558:2: ( ( (enumLiteral_0= 'env' ) | (enumLiteral_1= 'rdv' ) | (enumLiteral_2= 'multi_rdv' ) ) )
+            // InternalFormalML.g:29559:2: ( (enumLiteral_0= 'env' ) | (enumLiteral_1= 'rdv' ) | (enumLiteral_2= 'multi_rdv' ) )
+            {
+            // InternalFormalML.g:29559:2: ( (enumLiteral_0= 'env' ) | (enumLiteral_1= 'rdv' ) | (enumLiteral_2= 'multi_rdv' ) )
+            int alt618=3;
+            switch ( input.LA(1) ) {
+            case 239:
+                {
+                alt618=1;
+                }
+                break;
+            case 254:
+                {
+                alt618=2;
+                }
+                break;
+            case 255:
+                {
+                alt618=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 618, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt618) {
+                case 1 :
+                    // InternalFormalML.g:29560:3: (enumLiteral_0= 'env' )
+                    {
+                    // InternalFormalML.g:29560:3: (enumLiteral_0= 'env' )
+                    // InternalFormalML.g:29561:4: enumLiteral_0= 'env'
+                    {
+                    enumLiteral_0=(Token)match(input,239,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getComProtocolKindAccess().getEnvEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29568:3: (enumLiteral_1= 'rdv' )
+                    {
+                    // InternalFormalML.g:29568:3: (enumLiteral_1= 'rdv' )
+                    // InternalFormalML.g:29569:4: enumLiteral_1= 'rdv'
+                    {
+                    enumLiteral_1=(Token)match(input,254,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getComProtocolKindAccess().getRdvEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:29576:3: (enumLiteral_2= 'multi_rdv' )
+                    {
+                    // InternalFormalML.g:29576:3: (enumLiteral_2= 'multi_rdv' )
+                    // InternalFormalML.g:29577:4: enumLiteral_2= 'multi_rdv'
+                    {
+                    enumLiteral_2=(Token)match(input,255,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getComProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleComProtocolKind"
+
+
+    // $ANTLR start "ruleComEnvRdvProtocolKind"
+    // InternalFormalML.g:29587:1: ruleComEnvRdvProtocolKind returns [Enumerator current=null] : ( (enumLiteral_0= 'env' ) | (enumLiteral_1= 'rdv' ) ) ;
+    public final Enumerator ruleComEnvRdvProtocolKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29593:2: ( ( (enumLiteral_0= 'env' ) | (enumLiteral_1= 'rdv' ) ) )
+            // InternalFormalML.g:29594:2: ( (enumLiteral_0= 'env' ) | (enumLiteral_1= 'rdv' ) )
+            {
+            // InternalFormalML.g:29594:2: ( (enumLiteral_0= 'env' ) | (enumLiteral_1= 'rdv' ) )
+            int alt619=2;
+            int LA619_0 = input.LA(1);
+
+            if ( (LA619_0==239) ) {
+                alt619=1;
+            }
+            else if ( (LA619_0==254) ) {
+                alt619=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 619, 0, input);
+
+                throw nvae;
+            }
+            switch (alt619) {
+                case 1 :
+                    // InternalFormalML.g:29595:3: (enumLiteral_0= 'env' )
+                    {
+                    // InternalFormalML.g:29595:3: (enumLiteral_0= 'env' )
+                    // InternalFormalML.g:29596:4: enumLiteral_0= 'env'
+                    {
+                    enumLiteral_0=(Token)match(input,239,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getComEnvRdvProtocolKindAccess().getEnvEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29603:3: (enumLiteral_1= 'rdv' )
+                    {
+                    // InternalFormalML.g:29603:3: (enumLiteral_1= 'rdv' )
+                    // InternalFormalML.g:29604:4: enumLiteral_1= 'rdv'
+                    {
+                    enumLiteral_1=(Token)match(input,254,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getComEnvRdvProtocolKindAccess().getRdvEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleComEnvRdvProtocolKind"
+
+
+    // $ANTLR start "ruleComMultiRdvProtocolKind"
+    // InternalFormalML.g:29614:1: ruleComMultiRdvProtocolKind returns [Enumerator current=null] : (enumLiteral_0= 'multi_rdv' ) ;
+    public final Enumerator ruleComMultiRdvProtocolKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29620:2: ( (enumLiteral_0= 'multi_rdv' ) )
+            // InternalFormalML.g:29621:2: (enumLiteral_0= 'multi_rdv' )
+            {
+            // InternalFormalML.g:29621:2: (enumLiteral_0= 'multi_rdv' )
+            // InternalFormalML.g:29622:3: enumLiteral_0= 'multi_rdv'
+            {
+            enumLiteral_0=(Token)match(input,255,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getComMultiRdvProtocolKindAccess().getMulti_rdvEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleComMultiRdvProtocolKind"
+
+
+    // $ANTLR start "ruleBufferProtocolKind"
+    // InternalFormalML.g:29631:1: ruleBufferProtocolKind returns [Enumerator current=null] : (enumLiteral_0= 'buffer' ) ;
+    public final Enumerator ruleBufferProtocolKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29637:2: ( (enumLiteral_0= 'buffer' ) )
+            // InternalFormalML.g:29638:2: (enumLiteral_0= 'buffer' )
+            {
+            // InternalFormalML.g:29638:2: (enumLiteral_0= 'buffer' )
+            // InternalFormalML.g:29639:3: enumLiteral_0= 'buffer'
+            {
+            enumLiteral_0=(Token)match(input,136,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getBufferProtocolKindAccess().getBufferEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBufferProtocolKind"
+
+
+    // $ANTLR start "ruleComCastKing"
+    // InternalFormalML.g:29648:1: ruleComCastKing returns [Enumerator current=null] : ( (enumLiteral_0= 'unicast' ) | (enumLiteral_1= 'anycast' ) | (enumLiteral_2= 'multicast' ) | (enumLiteral_3= 'broadcast' ) ) ;
+    public final Enumerator ruleComCastKing() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29654:2: ( ( (enumLiteral_0= 'unicast' ) | (enumLiteral_1= 'anycast' ) | (enumLiteral_2= 'multicast' ) | (enumLiteral_3= 'broadcast' ) ) )
+            // InternalFormalML.g:29655:2: ( (enumLiteral_0= 'unicast' ) | (enumLiteral_1= 'anycast' ) | (enumLiteral_2= 'multicast' ) | (enumLiteral_3= 'broadcast' ) )
+            {
+            // InternalFormalML.g:29655:2: ( (enumLiteral_0= 'unicast' ) | (enumLiteral_1= 'anycast' ) | (enumLiteral_2= 'multicast' ) | (enumLiteral_3= 'broadcast' ) )
+            int alt620=4;
+            switch ( input.LA(1) ) {
+            case 256:
+                {
+                alt620=1;
+                }
+                break;
+            case 257:
+                {
+                alt620=2;
+                }
+                break;
+            case 258:
+                {
+                alt620=3;
+                }
+                break;
+            case 259:
+                {
+                alt620=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 620, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt620) {
+                case 1 :
+                    // InternalFormalML.g:29656:3: (enumLiteral_0= 'unicast' )
+                    {
+                    // InternalFormalML.g:29656:3: (enumLiteral_0= 'unicast' )
+                    // InternalFormalML.g:29657:4: enumLiteral_0= 'unicast'
+                    {
+                    enumLiteral_0=(Token)match(input,256,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getComCastKingAccess().getUnicastEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29664:3: (enumLiteral_1= 'anycast' )
+                    {
+                    // InternalFormalML.g:29664:3: (enumLiteral_1= 'anycast' )
+                    // InternalFormalML.g:29665:4: enumLiteral_1= 'anycast'
+                    {
+                    enumLiteral_1=(Token)match(input,257,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getComCastKingAccess().getAnycastEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:29672:3: (enumLiteral_2= 'multicast' )
+                    {
+                    // InternalFormalML.g:29672:3: (enumLiteral_2= 'multicast' )
+                    // InternalFormalML.g:29673:4: enumLiteral_2= 'multicast'
+                    {
+                    enumLiteral_2=(Token)match(input,258,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getComCastKingAccess().getMulticastEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:29680:3: (enumLiteral_3= 'broadcast' )
+                    {
+                    // InternalFormalML.g:29680:3: (enumLiteral_3= 'broadcast' )
+                    // InternalFormalML.g:29681:4: enumLiteral_3= 'broadcast'
+                    {
+                    enumLiteral_3=(Token)match(input,259,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getComCastKingAccess().getBroadcastEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleComCastKing"
+
+
+    // $ANTLR start "rulePrimitiveNumberSign"
+    // InternalFormalML.g:29691:1: rulePrimitiveNumberSign returns [Enumerator current=null] : ( (enumLiteral_0= '+' ) | (enumLiteral_1= '++' ) | (enumLiteral_2= '-' ) | (enumLiteral_3= '--' ) ) ;
+    public final Enumerator rulePrimitiveNumberSign() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29697:2: ( ( (enumLiteral_0= '+' ) | (enumLiteral_1= '++' ) | (enumLiteral_2= '-' ) | (enumLiteral_3= '--' ) ) )
+            // InternalFormalML.g:29698:2: ( (enumLiteral_0= '+' ) | (enumLiteral_1= '++' ) | (enumLiteral_2= '-' ) | (enumLiteral_3= '--' ) )
+            {
+            // InternalFormalML.g:29698:2: ( (enumLiteral_0= '+' ) | (enumLiteral_1= '++' ) | (enumLiteral_2= '-' ) | (enumLiteral_3= '--' ) )
+            int alt621=4;
+            switch ( input.LA(1) ) {
+            case 212:
+                {
+                alt621=1;
+                }
+                break;
+            case 216:
+                {
+                alt621=2;
+                }
+                break;
+            case 28:
+                {
+                alt621=3;
+                }
+                break;
+            case 217:
+                {
+                alt621=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 621, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt621) {
+                case 1 :
+                    // InternalFormalML.g:29699:3: (enumLiteral_0= '+' )
+                    {
+                    // InternalFormalML.g:29699:3: (enumLiteral_0= '+' )
+                    // InternalFormalML.g:29700:4: enumLiteral_0= '+'
+                    {
+                    enumLiteral_0=(Token)match(input,212,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getPrimitiveNumberSignAccess().getPositiveEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29707:3: (enumLiteral_1= '++' )
+                    {
+                    // InternalFormalML.g:29707:3: (enumLiteral_1= '++' )
+                    // InternalFormalML.g:29708:4: enumLiteral_1= '++'
+                    {
+                    enumLiteral_1=(Token)match(input,216,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getPrimitiveNumberSignAccess().getPositive_strictEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:29715:3: (enumLiteral_2= '-' )
+                    {
+                    // InternalFormalML.g:29715:3: (enumLiteral_2= '-' )
+                    // InternalFormalML.g:29716:4: enumLiteral_2= '-'
+                    {
+                    enumLiteral_2=(Token)match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getPrimitiveNumberSignAccess().getNegativeEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:29723:3: (enumLiteral_3= '--' )
+                    {
+                    // InternalFormalML.g:29723:3: (enumLiteral_3= '--' )
+                    // InternalFormalML.g:29724:4: enumLiteral_3= '--'
+                    {
+                    enumLiteral_3=(Token)match(input,217,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getPrimitiveNumberSignAccess().getNegative_strictEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveNumberSign"
+
+
+    // $ANTLR start "rulePrimitiveInstanceKind"
+    // InternalFormalML.g:29734:1: rulePrimitiveInstanceKind returns [Enumerator current=null] : ( (enumLiteral_0= 'buffer' ) | (enumLiteral_1= 'message' ) | (enumLiteral_2= 'port' ) | (enumLiteral_3= 'signal' ) | (enumLiteral_4= 'machine' ) | (enumLiteral_5= 'vertex' ) ) ;
+    public final Enumerator rulePrimitiveInstanceKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+        Token enumLiteral_4=null;
+        Token enumLiteral_5=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29740:2: ( ( (enumLiteral_0= 'buffer' ) | (enumLiteral_1= 'message' ) | (enumLiteral_2= 'port' ) | (enumLiteral_3= 'signal' ) | (enumLiteral_4= 'machine' ) | (enumLiteral_5= 'vertex' ) ) )
+            // InternalFormalML.g:29741:2: ( (enumLiteral_0= 'buffer' ) | (enumLiteral_1= 'message' ) | (enumLiteral_2= 'port' ) | (enumLiteral_3= 'signal' ) | (enumLiteral_4= 'machine' ) | (enumLiteral_5= 'vertex' ) )
+            {
+            // InternalFormalML.g:29741:2: ( (enumLiteral_0= 'buffer' ) | (enumLiteral_1= 'message' ) | (enumLiteral_2= 'port' ) | (enumLiteral_3= 'signal' ) | (enumLiteral_4= 'machine' ) | (enumLiteral_5= 'vertex' ) )
+            int alt622=6;
+            switch ( input.LA(1) ) {
+            case 136:
+                {
+                alt622=1;
+                }
+                break;
+            case 260:
+                {
+                alt622=2;
+                }
+                break;
+            case 137:
+                {
+                alt622=3;
+                }
+                break;
+            case 138:
+                {
+                alt622=4;
+                }
+                break;
+            case 53:
+                {
+                alt622=5;
+                }
+                break;
+            case 261:
+                {
+                alt622=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 622, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt622) {
+                case 1 :
+                    // InternalFormalML.g:29742:3: (enumLiteral_0= 'buffer' )
+                    {
+                    // InternalFormalML.g:29742:3: (enumLiteral_0= 'buffer' )
+                    // InternalFormalML.g:29743:4: enumLiteral_0= 'buffer'
+                    {
+                    enumLiteral_0=(Token)match(input,136,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getPrimitiveInstanceKindAccess().getBufferEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29750:3: (enumLiteral_1= 'message' )
+                    {
+                    // InternalFormalML.g:29750:3: (enumLiteral_1= 'message' )
+                    // InternalFormalML.g:29751:4: enumLiteral_1= 'message'
+                    {
+                    enumLiteral_1=(Token)match(input,260,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getPrimitiveInstanceKindAccess().getMessageEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:29758:3: (enumLiteral_2= 'port' )
+                    {
+                    // InternalFormalML.g:29758:3: (enumLiteral_2= 'port' )
+                    // InternalFormalML.g:29759:4: enumLiteral_2= 'port'
+                    {
+                    enumLiteral_2=(Token)match(input,137,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getPrimitiveInstanceKindAccess().getPortEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:29766:3: (enumLiteral_3= 'signal' )
+                    {
+                    // InternalFormalML.g:29766:3: (enumLiteral_3= 'signal' )
+                    // InternalFormalML.g:29767:4: enumLiteral_3= 'signal'
+                    {
+                    enumLiteral_3=(Token)match(input,138,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getPrimitiveInstanceKindAccess().getSignalEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:29774:3: (enumLiteral_4= 'machine' )
+                    {
+                    // InternalFormalML.g:29774:3: (enumLiteral_4= 'machine' )
+                    // InternalFormalML.g:29775:4: enumLiteral_4= 'machine'
+                    {
+                    enumLiteral_4=(Token)match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_4, grammarAccess.getPrimitiveInstanceKindAccess().getMachineEnumLiteralDeclaration_4());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:29782:3: (enumLiteral_5= 'vertex' )
+                    {
+                    // InternalFormalML.g:29782:3: (enumLiteral_5= 'vertex' )
+                    // InternalFormalML.g:29783:4: enumLiteral_5= 'vertex'
+                    {
+                    enumLiteral_5=(Token)match(input,261,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_5, grammarAccess.getPrimitiveInstanceKindAccess().getVertexEnumLiteralDeclaration_5());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrimitiveInstanceKind"
+
+
+    // $ANTLR start "ruleCollectionKind"
+    // InternalFormalML.g:29793:1: ruleCollectionKind returns [Enumerator current=null] : ( (enumLiteral_0= 'vector' ) | (enumLiteral_1= 'rvector' ) | (enumLiteral_2= 'list' ) | (enumLiteral_3= 'set' ) | (enumLiteral_4= 'bag' ) | (enumLiteral_5= 'fifo' ) | (enumLiteral_6= 'lifo' ) ) ;
+    public final Enumerator ruleCollectionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+        Token enumLiteral_4=null;
+        Token enumLiteral_5=null;
+        Token enumLiteral_6=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29799:2: ( ( (enumLiteral_0= 'vector' ) | (enumLiteral_1= 'rvector' ) | (enumLiteral_2= 'list' ) | (enumLiteral_3= 'set' ) | (enumLiteral_4= 'bag' ) | (enumLiteral_5= 'fifo' ) | (enumLiteral_6= 'lifo' ) ) )
+            // InternalFormalML.g:29800:2: ( (enumLiteral_0= 'vector' ) | (enumLiteral_1= 'rvector' ) | (enumLiteral_2= 'list' ) | (enumLiteral_3= 'set' ) | (enumLiteral_4= 'bag' ) | (enumLiteral_5= 'fifo' ) | (enumLiteral_6= 'lifo' ) )
+            {
+            // InternalFormalML.g:29800:2: ( (enumLiteral_0= 'vector' ) | (enumLiteral_1= 'rvector' ) | (enumLiteral_2= 'list' ) | (enumLiteral_3= 'set' ) | (enumLiteral_4= 'bag' ) | (enumLiteral_5= 'fifo' ) | (enumLiteral_6= 'lifo' ) )
+            int alt623=7;
+            switch ( input.LA(1) ) {
+            case 262:
+                {
+                alt623=1;
+                }
+                break;
+            case 263:
+                {
+                alt623=2;
+                }
+                break;
+            case 264:
+                {
+                alt623=3;
+                }
+                break;
+            case 265:
+                {
+                alt623=4;
+                }
+                break;
+            case 266:
+                {
+                alt623=5;
+                }
+                break;
+            case 267:
+                {
+                alt623=6;
+                }
+                break;
+            case 268:
+                {
+                alt623=7;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 623, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt623) {
+                case 1 :
+                    // InternalFormalML.g:29801:3: (enumLiteral_0= 'vector' )
+                    {
+                    // InternalFormalML.g:29801:3: (enumLiteral_0= 'vector' )
+                    // InternalFormalML.g:29802:4: enumLiteral_0= 'vector'
+                    {
+                    enumLiteral_0=(Token)match(input,262,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getCollectionKindAccess().getVectorEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29809:3: (enumLiteral_1= 'rvector' )
+                    {
+                    // InternalFormalML.g:29809:3: (enumLiteral_1= 'rvector' )
+                    // InternalFormalML.g:29810:4: enumLiteral_1= 'rvector'
+                    {
+                    enumLiteral_1=(Token)match(input,263,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getCollectionKindAccess().getRvectorEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:29817:3: (enumLiteral_2= 'list' )
+                    {
+                    // InternalFormalML.g:29817:3: (enumLiteral_2= 'list' )
+                    // InternalFormalML.g:29818:4: enumLiteral_2= 'list'
+                    {
+                    enumLiteral_2=(Token)match(input,264,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getCollectionKindAccess().getListEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:29825:3: (enumLiteral_3= 'set' )
+                    {
+                    // InternalFormalML.g:29825:3: (enumLiteral_3= 'set' )
+                    // InternalFormalML.g:29826:4: enumLiteral_3= 'set'
+                    {
+                    enumLiteral_3=(Token)match(input,265,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getCollectionKindAccess().getSetEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:29833:3: (enumLiteral_4= 'bag' )
+                    {
+                    // InternalFormalML.g:29833:3: (enumLiteral_4= 'bag' )
+                    // InternalFormalML.g:29834:4: enumLiteral_4= 'bag'
+                    {
+                    enumLiteral_4=(Token)match(input,266,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_4, grammarAccess.getCollectionKindAccess().getBagEnumLiteralDeclaration_4());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:29841:3: (enumLiteral_5= 'fifo' )
+                    {
+                    // InternalFormalML.g:29841:3: (enumLiteral_5= 'fifo' )
+                    // InternalFormalML.g:29842:4: enumLiteral_5= 'fifo'
+                    {
+                    enumLiteral_5=(Token)match(input,267,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_5, grammarAccess.getCollectionKindAccess().getFifoEnumLiteralDeclaration_5());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:29849:3: (enumLiteral_6= 'lifo' )
+                    {
+                    // InternalFormalML.g:29849:3: (enumLiteral_6= 'lifo' )
+                    // InternalFormalML.g:29850:4: enumLiteral_6= 'lifo'
+                    {
+                    enumLiteral_6=(Token)match(input,268,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_6, grammarAccess.getCollectionKindAccess().getLifoEnumLiteralDeclaration_6());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleCollectionKind"
+
+
+    // $ANTLR start "rulePublicVariableVisibilityKind"
+    // InternalFormalML.g:29860:1: rulePublicVariableVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'var' ) ;
+    public final Enumerator rulePublicVariableVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29866:2: ( (enumLiteral_0= 'var' ) )
+            // InternalFormalML.g:29867:2: (enumLiteral_0= 'var' )
+            {
+            // InternalFormalML.g:29867:2: (enumLiteral_0= 'var' )
+            // InternalFormalML.g:29868:3: enumLiteral_0= 'var'
+            {
+            enumLiteral_0=(Token)match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPublicVariableVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPublicVariableVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePublicVariableVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedVariableVisibilityKind"
+    // InternalFormalML.g:29877:1: ruleProtectedVariableVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'var' ) ;
+    public final Enumerator ruleProtectedVariableVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29883:2: ( (enumLiteral_0= 'var' ) )
+            // InternalFormalML.g:29884:2: (enumLiteral_0= 'var' )
+            {
+            // InternalFormalML.g:29884:2: (enumLiteral_0= 'var' )
+            // InternalFormalML.g:29885:3: enumLiteral_0= 'var'
+            {
+            enumLiteral_0=(Token)match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getProtectedVariableVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getProtectedVariableVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProtectedVariableVisibilityKind"
+
+
+    // $ANTLR start "rulePrivateVariableVisibilityKind"
+    // InternalFormalML.g:29894:1: rulePrivateVariableVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'var' ) ;
+    public final Enumerator rulePrivateVariableVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29900:2: ( (enumLiteral_0= 'var' ) )
+            // InternalFormalML.g:29901:2: (enumLiteral_0= 'var' )
+            {
+            // InternalFormalML.g:29901:2: (enumLiteral_0= 'var' )
+            // InternalFormalML.g:29902:3: enumLiteral_0= 'var'
+            {
+            enumLiteral_0=(Token)match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPrivateVariableVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPrivateVariableVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrivateVariableVisibilityKind"
+
+
+    // $ANTLR start "ruleParameterDirectionKind"
+    // InternalFormalML.g:29911:1: ruleParameterDirectionKind returns [Enumerator current=null] : ( (enumLiteral_0= 'in' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'out' ) | (enumLiteral_3= 'return' ) ) ;
+    public final Enumerator ruleParameterDirectionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29917:2: ( ( (enumLiteral_0= 'in' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'out' ) | (enumLiteral_3= 'return' ) ) )
+            // InternalFormalML.g:29918:2: ( (enumLiteral_0= 'in' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'out' ) | (enumLiteral_3= 'return' ) )
+            {
+            // InternalFormalML.g:29918:2: ( (enumLiteral_0= 'in' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'out' ) | (enumLiteral_3= 'return' ) )
+            int alt624=4;
+            switch ( input.LA(1) ) {
+            case 269:
+                {
+                alt624=1;
+                }
+                break;
+            case 62:
+                {
+                alt624=2;
+                }
+                break;
+            case 270:
+                {
+                alt624=3;
+                }
+                break;
+            case 64:
+                {
+                alt624=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 624, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt624) {
+                case 1 :
+                    // InternalFormalML.g:29919:3: (enumLiteral_0= 'in' )
+                    {
+                    // InternalFormalML.g:29919:3: (enumLiteral_0= 'in' )
+                    // InternalFormalML.g:29920:4: enumLiteral_0= 'in'
+                    {
+                    enumLiteral_0=(Token)match(input,269,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getParameterDirectionKindAccess().getInEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29927:3: (enumLiteral_1= 'inout' )
+                    {
+                    // InternalFormalML.g:29927:3: (enumLiteral_1= 'inout' )
+                    // InternalFormalML.g:29928:4: enumLiteral_1= 'inout'
+                    {
+                    enumLiteral_1=(Token)match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:29935:3: (enumLiteral_2= 'out' )
+                    {
+                    // InternalFormalML.g:29935:3: (enumLiteral_2= 'out' )
+                    // InternalFormalML.g:29936:4: enumLiteral_2= 'out'
+                    {
+                    enumLiteral_2=(Token)match(input,270,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:29943:3: (enumLiteral_3= 'return' )
+                    {
+                    // InternalFormalML.g:29943:3: (enumLiteral_3= 'return' )
+                    // InternalFormalML.g:29944:4: enumLiteral_3= 'return'
+                    {
+                    enumLiteral_3=(Token)match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleParameterDirectionKind"
+
+
+    // $ANTLR start "ruleBlockParameterDirectionKind"
+    // InternalFormalML.g:29954:1: ruleBlockParameterDirectionKind returns [Enumerator current=null] : ( (enumLiteral_0= 'input' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'output' ) | (enumLiteral_3= 'return' ) ) ;
+    public final Enumerator ruleBlockParameterDirectionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:29960:2: ( ( (enumLiteral_0= 'input' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'output' ) | (enumLiteral_3= 'return' ) ) )
+            // InternalFormalML.g:29961:2: ( (enumLiteral_0= 'input' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'output' ) | (enumLiteral_3= 'return' ) )
+            {
+            // InternalFormalML.g:29961:2: ( (enumLiteral_0= 'input' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'output' ) | (enumLiteral_3= 'return' ) )
+            int alt625=4;
+            switch ( input.LA(1) ) {
+            case 61:
+                {
+                alt625=1;
+                }
+                break;
+            case 62:
+                {
+                alt625=2;
+                }
+                break;
+            case 63:
+                {
+                alt625=3;
+                }
+                break;
+            case 64:
+                {
+                alt625=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 625, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt625) {
+                case 1 :
+                    // InternalFormalML.g:29962:3: (enumLiteral_0= 'input' )
+                    {
+                    // InternalFormalML.g:29962:3: (enumLiteral_0= 'input' )
+                    // InternalFormalML.g:29963:4: enumLiteral_0= 'input'
+                    {
+                    enumLiteral_0=(Token)match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getBlockParameterDirectionKindAccess().getInEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getBlockParameterDirectionKindAccess().getInEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:29970:3: (enumLiteral_1= 'inout' )
+                    {
+                    // InternalFormalML.g:29970:3: (enumLiteral_1= 'inout' )
+                    // InternalFormalML.g:29971:4: enumLiteral_1= 'inout'
+                    {
+                    enumLiteral_1=(Token)match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getBlockParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getBlockParameterDirectionKindAccess().getInoutEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:29978:3: (enumLiteral_2= 'output' )
+                    {
+                    // InternalFormalML.g:29978:3: (enumLiteral_2= 'output' )
+                    // InternalFormalML.g:29979:4: enumLiteral_2= 'output'
+                    {
+                    enumLiteral_2=(Token)match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getBlockParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getBlockParameterDirectionKindAccess().getOutEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:29986:3: (enumLiteral_3= 'return' )
+                    {
+                    // InternalFormalML.g:29986:3: (enumLiteral_3= 'return' )
+                    // InternalFormalML.g:29987:4: enumLiteral_3= 'return'
+                    {
+                    enumLiteral_3=(Token)match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getBlockParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getBlockParameterDirectionKindAccess().getReturnEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBlockParameterDirectionKind"
+
+
+    // $ANTLR start "ruleParameterInputDirectionKind"
+    // InternalFormalML.g:29997:1: ruleParameterInputDirectionKind returns [Enumerator current=null] : (enumLiteral_0= 'var' ) ;
+    public final Enumerator ruleParameterInputDirectionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30003:2: ( (enumLiteral_0= 'var' ) )
+            // InternalFormalML.g:30004:2: (enumLiteral_0= 'var' )
+            {
+            // InternalFormalML.g:30004:2: (enumLiteral_0= 'var' )
+            // InternalFormalML.g:30005:3: enumLiteral_0= 'var'
+            {
+            enumLiteral_0=(Token)match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getParameterInputDirectionKindAccess().getInEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getParameterInputDirectionKindAccess().getInEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleParameterInputDirectionKind"
+
+
+    // $ANTLR start "ruleParameterInoutDirectionKind"
+    // InternalFormalML.g:30014:1: ruleParameterInoutDirectionKind returns [Enumerator current=null] : (enumLiteral_0= 'var' ) ;
+    public final Enumerator ruleParameterInoutDirectionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30020:2: ( (enumLiteral_0= 'var' ) )
+            // InternalFormalML.g:30021:2: (enumLiteral_0= 'var' )
+            {
+            // InternalFormalML.g:30021:2: (enumLiteral_0= 'var' )
+            // InternalFormalML.g:30022:3: enumLiteral_0= 'var'
+            {
+            enumLiteral_0=(Token)match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getParameterInoutDirectionKindAccess().getInoutEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getParameterInoutDirectionKindAccess().getInoutEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleParameterInoutDirectionKind"
+
+
+    // $ANTLR start "ruleParameterOutputDirectionKind"
+    // InternalFormalML.g:30031:1: ruleParameterOutputDirectionKind returns [Enumerator current=null] : (enumLiteral_0= 'var' ) ;
+    public final Enumerator ruleParameterOutputDirectionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30037:2: ( (enumLiteral_0= 'var' ) )
+            // InternalFormalML.g:30038:2: (enumLiteral_0= 'var' )
+            {
+            // InternalFormalML.g:30038:2: (enumLiteral_0= 'var' )
+            // InternalFormalML.g:30039:3: enumLiteral_0= 'var'
+            {
+            enumLiteral_0=(Token)match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getParameterOutputDirectionKindAccess().getOutEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getParameterOutputDirectionKindAccess().getOutEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleParameterOutputDirectionKind"
+
+
+    // $ANTLR start "ruleParameterReturnDirectionKind"
+    // InternalFormalML.g:30048:1: ruleParameterReturnDirectionKind returns [Enumerator current=null] : (enumLiteral_0= 'var' ) ;
+    public final Enumerator ruleParameterReturnDirectionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30054:2: ( (enumLiteral_0= 'var' ) )
+            // InternalFormalML.g:30055:2: (enumLiteral_0= 'var' )
+            {
+            // InternalFormalML.g:30055:2: (enumLiteral_0= 'var' )
+            // InternalFormalML.g:30056:3: enumLiteral_0= 'var'
+            {
+            enumLiteral_0=(Token)match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getParameterReturnDirectionKindAccess().getReturnEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getParameterReturnDirectionKindAccess().getReturnEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleParameterReturnDirectionKind"
+
+
+    // $ANTLR start "ruleBufferContainerKind"
+    // InternalFormalML.g:30065:1: ruleBufferContainerKind returns [Enumerator current=null] : ( (enumLiteral_0= 'set' ) | (enumLiteral_1= 'bag' ) | (enumLiteral_2= 'fifo' ) | (enumLiteral_3= 'lifo' ) ) ;
+    public final Enumerator ruleBufferContainerKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30071:2: ( ( (enumLiteral_0= 'set' ) | (enumLiteral_1= 'bag' ) | (enumLiteral_2= 'fifo' ) | (enumLiteral_3= 'lifo' ) ) )
+            // InternalFormalML.g:30072:2: ( (enumLiteral_0= 'set' ) | (enumLiteral_1= 'bag' ) | (enumLiteral_2= 'fifo' ) | (enumLiteral_3= 'lifo' ) )
+            {
+            // InternalFormalML.g:30072:2: ( (enumLiteral_0= 'set' ) | (enumLiteral_1= 'bag' ) | (enumLiteral_2= 'fifo' ) | (enumLiteral_3= 'lifo' ) )
+            int alt626=4;
+            switch ( input.LA(1) ) {
+            case 265:
+                {
+                alt626=1;
+                }
+                break;
+            case 266:
+                {
+                alt626=2;
+                }
+                break;
+            case 267:
+                {
+                alt626=3;
+                }
+                break;
+            case 268:
+                {
+                alt626=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 626, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt626) {
+                case 1 :
+                    // InternalFormalML.g:30073:3: (enumLiteral_0= 'set' )
+                    {
+                    // InternalFormalML.g:30073:3: (enumLiteral_0= 'set' )
+                    // InternalFormalML.g:30074:4: enumLiteral_0= 'set'
+                    {
+                    enumLiteral_0=(Token)match(input,265,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getBufferContainerKindAccess().getSetEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:30081:3: (enumLiteral_1= 'bag' )
+                    {
+                    // InternalFormalML.g:30081:3: (enumLiteral_1= 'bag' )
+                    // InternalFormalML.g:30082:4: enumLiteral_1= 'bag'
+                    {
+                    enumLiteral_1=(Token)match(input,266,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getBufferContainerKindAccess().getBagEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:30089:3: (enumLiteral_2= 'fifo' )
+                    {
+                    // InternalFormalML.g:30089:3: (enumLiteral_2= 'fifo' )
+                    // InternalFormalML.g:30090:4: enumLiteral_2= 'fifo'
+                    {
+                    enumLiteral_2=(Token)match(input,267,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getBufferContainerKindAccess().getFifoEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:30097:3: (enumLiteral_3= 'lifo' )
+                    {
+                    // InternalFormalML.g:30097:3: (enumLiteral_3= 'lifo' )
+                    // InternalFormalML.g:30098:4: enumLiteral_3= 'lifo'
+                    {
+                    enumLiteral_3=(Token)match(input,268,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getBufferContainerKindAccess().getLifoEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleBufferContainerKind"
+
+
+    // $ANTLR start "rulePublicBufferVisibilityKind"
+    // InternalFormalML.g:30108:1: rulePublicBufferVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'buffer' ) ;
+    public final Enumerator rulePublicBufferVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30114:2: ( (enumLiteral_0= 'buffer' ) )
+            // InternalFormalML.g:30115:2: (enumLiteral_0= 'buffer' )
+            {
+            // InternalFormalML.g:30115:2: (enumLiteral_0= 'buffer' )
+            // InternalFormalML.g:30116:3: enumLiteral_0= 'buffer'
+            {
+            enumLiteral_0=(Token)match(input,136,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPublicBufferVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPublicBufferVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePublicBufferVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedBufferVisibilityKind"
+    // InternalFormalML.g:30125:1: ruleProtectedBufferVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'buffer' ) ;
+    public final Enumerator ruleProtectedBufferVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30131:2: ( (enumLiteral_0= 'buffer' ) )
+            // InternalFormalML.g:30132:2: (enumLiteral_0= 'buffer' )
+            {
+            // InternalFormalML.g:30132:2: (enumLiteral_0= 'buffer' )
+            // InternalFormalML.g:30133:3: enumLiteral_0= 'buffer'
+            {
+            enumLiteral_0=(Token)match(input,136,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getProtectedBufferVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getProtectedBufferVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProtectedBufferVisibilityKind"
+
+
+    // $ANTLR start "rulePrivateBufferVisibilityKind"
+    // InternalFormalML.g:30142:1: rulePrivateBufferVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'buffer' ) ;
+    public final Enumerator rulePrivateBufferVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30148:2: ( (enumLiteral_0= 'buffer' ) )
+            // InternalFormalML.g:30149:2: (enumLiteral_0= 'buffer' )
+            {
+            // InternalFormalML.g:30149:2: (enumLiteral_0= 'buffer' )
+            // InternalFormalML.g:30150:3: enumLiteral_0= 'buffer'
+            {
+            enumLiteral_0=(Token)match(input,136,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPrivateBufferVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPrivateBufferVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrivateBufferVisibilityKind"
+
+
+    // $ANTLR start "rulePublicPortVisibilityKind"
+    // InternalFormalML.g:30159:1: rulePublicPortVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'port' ) ;
+    public final Enumerator rulePublicPortVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30165:2: ( (enumLiteral_0= 'port' ) )
+            // InternalFormalML.g:30166:2: (enumLiteral_0= 'port' )
+            {
+            // InternalFormalML.g:30166:2: (enumLiteral_0= 'port' )
+            // InternalFormalML.g:30167:3: enumLiteral_0= 'port'
+            {
+            enumLiteral_0=(Token)match(input,137,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPublicPortVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPublicPortVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePublicPortVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedPortVisibilityKind"
+    // InternalFormalML.g:30176:1: ruleProtectedPortVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'port' ) ;
+    public final Enumerator ruleProtectedPortVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30182:2: ( (enumLiteral_0= 'port' ) )
+            // InternalFormalML.g:30183:2: (enumLiteral_0= 'port' )
+            {
+            // InternalFormalML.g:30183:2: (enumLiteral_0= 'port' )
+            // InternalFormalML.g:30184:3: enumLiteral_0= 'port'
+            {
+            enumLiteral_0=(Token)match(input,137,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getProtectedPortVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getProtectedPortVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProtectedPortVisibilityKind"
+
+
+    // $ANTLR start "rulePrivatePortVisibilityKind"
+    // InternalFormalML.g:30193:1: rulePrivatePortVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'port' ) ;
+    public final Enumerator rulePrivatePortVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30199:2: ( (enumLiteral_0= 'port' ) )
+            // InternalFormalML.g:30200:2: (enumLiteral_0= 'port' )
+            {
+            // InternalFormalML.g:30200:2: (enumLiteral_0= 'port' )
+            // InternalFormalML.g:30201:3: enumLiteral_0= 'port'
+            {
+            enumLiteral_0=(Token)match(input,137,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPrivatePortVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPrivatePortVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrivatePortVisibilityKind"
+
+
+    // $ANTLR start "rulePublicSignalVisibilityKind"
+    // InternalFormalML.g:30210:1: rulePublicSignalVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'signal' ) ;
+    public final Enumerator rulePublicSignalVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30216:2: ( (enumLiteral_0= 'signal' ) )
+            // InternalFormalML.g:30217:2: (enumLiteral_0= 'signal' )
+            {
+            // InternalFormalML.g:30217:2: (enumLiteral_0= 'signal' )
+            // InternalFormalML.g:30218:3: enumLiteral_0= 'signal'
+            {
+            enumLiteral_0=(Token)match(input,138,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPublicSignalVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPublicSignalVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePublicSignalVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedSignalVisibilityKind"
+    // InternalFormalML.g:30227:1: ruleProtectedSignalVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'signal' ) ;
+    public final Enumerator ruleProtectedSignalVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30233:2: ( (enumLiteral_0= 'signal' ) )
+            // InternalFormalML.g:30234:2: (enumLiteral_0= 'signal' )
+            {
+            // InternalFormalML.g:30234:2: (enumLiteral_0= 'signal' )
+            // InternalFormalML.g:30235:3: enumLiteral_0= 'signal'
+            {
+            enumLiteral_0=(Token)match(input,138,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getProtectedSignalVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getProtectedSignalVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProtectedSignalVisibilityKind"
+
+
+    // $ANTLR start "rulePrivateSignalVisibilityKind"
+    // InternalFormalML.g:30244:1: rulePrivateSignalVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'signal' ) ;
+    public final Enumerator rulePrivateSignalVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30250:2: ( (enumLiteral_0= 'signal' ) )
+            // InternalFormalML.g:30251:2: (enumLiteral_0= 'signal' )
+            {
+            // InternalFormalML.g:30251:2: (enumLiteral_0= 'signal' )
+            // InternalFormalML.g:30252:3: enumLiteral_0= 'signal'
+            {
+            enumLiteral_0=(Token)match(input,138,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPrivateSignalVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPrivateSignalVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrivateSignalVisibilityKind"
+
+
+    // $ANTLR start "ruleChannelDirection"
+    // InternalFormalML.g:30261:1: ruleChannelDirection returns [Enumerator current=null] : ( (enumLiteral_0= 'input' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'output' ) ) ;
+    public final Enumerator ruleChannelDirection() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30267:2: ( ( (enumLiteral_0= 'input' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'output' ) ) )
+            // InternalFormalML.g:30268:2: ( (enumLiteral_0= 'input' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'output' ) )
+            {
+            // InternalFormalML.g:30268:2: ( (enumLiteral_0= 'input' ) | (enumLiteral_1= 'inout' ) | (enumLiteral_2= 'output' ) )
+            int alt627=3;
+            switch ( input.LA(1) ) {
+            case 61:
+                {
+                alt627=1;
+                }
+                break;
+            case 62:
+                {
+                alt627=2;
+                }
+                break;
+            case 63:
+                {
+                alt627=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 627, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt627) {
+                case 1 :
+                    // InternalFormalML.g:30269:3: (enumLiteral_0= 'input' )
+                    {
+                    // InternalFormalML.g:30269:3: (enumLiteral_0= 'input' )
+                    // InternalFormalML.g:30270:4: enumLiteral_0= 'input'
+                    {
+                    enumLiteral_0=(Token)match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getChannelDirectionAccess().getInputEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:30277:3: (enumLiteral_1= 'inout' )
+                    {
+                    // InternalFormalML.g:30277:3: (enumLiteral_1= 'inout' )
+                    // InternalFormalML.g:30278:4: enumLiteral_1= 'inout'
+                    {
+                    enumLiteral_1=(Token)match(input,62,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getChannelDirectionAccess().getInoutEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:30285:3: (enumLiteral_2= 'output' )
+                    {
+                    // InternalFormalML.g:30285:3: (enumLiteral_2= 'output' )
+                    // InternalFormalML.g:30286:4: enumLiteral_2= 'output'
+                    {
+                    enumLiteral_2=(Token)match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getChannelDirectionAccess().getOutputEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleChannelDirection"
+
+
+    // $ANTLR start "rulePublicChannelVisibilityKind"
+    // InternalFormalML.g:30296:1: rulePublicChannelVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'channel' ) ;
+    public final Enumerator rulePublicChannelVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30302:2: ( (enumLiteral_0= 'channel' ) )
+            // InternalFormalML.g:30303:2: (enumLiteral_0= 'channel' )
+            {
+            // InternalFormalML.g:30303:2: (enumLiteral_0= 'channel' )
+            // InternalFormalML.g:30304:3: enumLiteral_0= 'channel'
+            {
+            enumLiteral_0=(Token)match(input,139,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPublicChannelVisibilityKindAccess().getPublicEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPublicChannelVisibilityKindAccess().getPublicEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePublicChannelVisibilityKind"
+
+
+    // $ANTLR start "ruleProtectedChannelVisibilityKind"
+    // InternalFormalML.g:30313:1: ruleProtectedChannelVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'channel' ) ;
+    public final Enumerator ruleProtectedChannelVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30319:2: ( (enumLiteral_0= 'channel' ) )
+            // InternalFormalML.g:30320:2: (enumLiteral_0= 'channel' )
+            {
+            // InternalFormalML.g:30320:2: (enumLiteral_0= 'channel' )
+            // InternalFormalML.g:30321:3: enumLiteral_0= 'channel'
+            {
+            enumLiteral_0=(Token)match(input,139,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getProtectedChannelVisibilityKindAccess().getProtectedEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getProtectedChannelVisibilityKindAccess().getProtectedEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProtectedChannelVisibilityKind"
+
+
+    // $ANTLR start "rulePrivateChannelVisibilityKind"
+    // InternalFormalML.g:30330:1: rulePrivateChannelVisibilityKind returns [Enumerator current=null] : (enumLiteral_0= 'channel' ) ;
+    public final Enumerator rulePrivateChannelVisibilityKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30336:2: ( (enumLiteral_0= 'channel' ) )
+            // InternalFormalML.g:30337:2: (enumLiteral_0= 'channel' )
+            {
+            // InternalFormalML.g:30337:2: (enumLiteral_0= 'channel' )
+            // InternalFormalML.g:30338:3: enumLiteral_0= 'channel'
+            {
+            enumLiteral_0=(Token)match(input,139,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getPrivateChannelVisibilityKindAccess().getPrivateEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getPrivateChannelVisibilityKindAccess().getPrivateEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePrivateChannelVisibilityKind"
+
+
+    // $ANTLR start "ruleTransitionMoc"
+    // InternalFormalML.g:30347:1: ruleTransitionMoc returns [Enumerator current=null] : ( (enumLiteral_0= 'simple' ) | (enumLiteral_1= 'abort' ) | (enumLiteral_2= 'final' ) ) ;
+    public final Enumerator ruleTransitionMoc() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30353:2: ( ( (enumLiteral_0= 'simple' ) | (enumLiteral_1= 'abort' ) | (enumLiteral_2= 'final' ) ) )
+            // InternalFormalML.g:30354:2: ( (enumLiteral_0= 'simple' ) | (enumLiteral_1= 'abort' ) | (enumLiteral_2= 'final' ) )
+            {
+            // InternalFormalML.g:30354:2: ( (enumLiteral_0= 'simple' ) | (enumLiteral_1= 'abort' ) | (enumLiteral_2= 'final' ) )
+            int alt628=3;
+            switch ( input.LA(1) ) {
+            case 84:
+                {
+                alt628=1;
+                }
+                break;
+            case 271:
+                {
+                alt628=2;
+                }
+                break;
+            case 87:
+                {
+                alt628=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 628, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt628) {
+                case 1 :
+                    // InternalFormalML.g:30355:3: (enumLiteral_0= 'simple' )
+                    {
+                    // InternalFormalML.g:30355:3: (enumLiteral_0= 'simple' )
+                    // InternalFormalML.g:30356:4: enumLiteral_0= 'simple'
+                    {
+                    enumLiteral_0=(Token)match(input,84,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getTransitionMocAccess().getSimpleEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:30363:3: (enumLiteral_1= 'abort' )
+                    {
+                    // InternalFormalML.g:30363:3: (enumLiteral_1= 'abort' )
+                    // InternalFormalML.g:30364:4: enumLiteral_1= 'abort'
+                    {
+                    enumLiteral_1=(Token)match(input,271,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getTransitionMocAccess().getAbortEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:30371:3: (enumLiteral_2= 'final' )
+                    {
+                    // InternalFormalML.g:30371:3: (enumLiteral_2= 'final' )
+                    // InternalFormalML.g:30372:4: enumLiteral_2= 'final'
+                    {
+                    enumLiteral_2=(Token)match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getTransitionMocAccess().getFinalEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleTransitionMoc"
+
+
+    // $ANTLR start "ruleInterruptStatementKind"
+    // InternalFormalML.g:30382:1: ruleInterruptStatementKind returns [Enumerator current=null] : ( (enumLiteral_0= 'break' ) | (enumLiteral_1= 'continue' ) | (enumLiteral_2= 'return' ) | (enumLiteral_3= 'exit' ) ) ;
+    public final Enumerator ruleInterruptStatementKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30388:2: ( ( (enumLiteral_0= 'break' ) | (enumLiteral_1= 'continue' ) | (enumLiteral_2= 'return' ) | (enumLiteral_3= 'exit' ) ) )
+            // InternalFormalML.g:30389:2: ( (enumLiteral_0= 'break' ) | (enumLiteral_1= 'continue' ) | (enumLiteral_2= 'return' ) | (enumLiteral_3= 'exit' ) )
+            {
+            // InternalFormalML.g:30389:2: ( (enumLiteral_0= 'break' ) | (enumLiteral_1= 'continue' ) | (enumLiteral_2= 'return' ) | (enumLiteral_3= 'exit' ) )
+            int alt629=4;
+            switch ( input.LA(1) ) {
+            case 272:
+                {
+                alt629=1;
+                }
+                break;
+            case 273:
+                {
+                alt629=2;
+                }
+                break;
+            case 64:
+                {
+                alt629=3;
+                }
+                break;
+            case 274:
+                {
+                alt629=4;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 629, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt629) {
+                case 1 :
+                    // InternalFormalML.g:30390:3: (enumLiteral_0= 'break' )
+                    {
+                    // InternalFormalML.g:30390:3: (enumLiteral_0= 'break' )
+                    // InternalFormalML.g:30391:4: enumLiteral_0= 'break'
+                    {
+                    enumLiteral_0=(Token)match(input,272,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getInterruptStatementKindAccess().getBreakEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:30398:3: (enumLiteral_1= 'continue' )
+                    {
+                    // InternalFormalML.g:30398:3: (enumLiteral_1= 'continue' )
+                    // InternalFormalML.g:30399:4: enumLiteral_1= 'continue'
+                    {
+                    enumLiteral_1=(Token)match(input,273,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getInterruptStatementKindAccess().getContinueEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:30406:3: (enumLiteral_2= 'return' )
+                    {
+                    // InternalFormalML.g:30406:3: (enumLiteral_2= 'return' )
+                    // InternalFormalML.g:30407:4: enumLiteral_2= 'return'
+                    {
+                    enumLiteral_2=(Token)match(input,64,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getInterruptStatementKindAccess().getReturnEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:30414:3: (enumLiteral_3= 'exit' )
+                    {
+                    // InternalFormalML.g:30414:3: (enumLiteral_3= 'exit' )
+                    // InternalFormalML.g:30415:4: enumLiteral_3= 'exit'
+                    {
+                    enumLiteral_3=(Token)match(input,274,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getInterruptStatementKindAccess().getExitEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleInterruptStatementKind"
+
+
+    // $ANTLR start "ruleOPERATOR_ACTIVITY"
+    // InternalFormalML.g:30425:1: ruleOPERATOR_ACTIVITY returns [Enumerator current=null] : ( (enumLiteral_0= 'init' ) | (enumLiteral_1= 'final' ) | (enumLiteral_2= 'destroy' ) | (enumLiteral_3= 'start' ) | (enumLiteral_4= 'stop' ) | (enumLiteral_5= 'restart' ) | (enumLiteral_6= 'suspend' ) | (enumLiteral_7= 'resume' ) | (enumLiteral_8= 'wait' ) | (enumLiteral_9= 'disable' ) | (enumLiteral_10= 'enable' ) | (enumLiteral_11= 'abort' ) | (enumLiteral_12= 'schedule' ) | (enumLiteral_13= 'irun' ) | (enumLiteral_14= 'run' ) | (enumLiteral_15= 'rtc' ) ) ;
+    public final Enumerator ruleOPERATOR_ACTIVITY() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+        Token enumLiteral_4=null;
+        Token enumLiteral_5=null;
+        Token enumLiteral_6=null;
+        Token enumLiteral_7=null;
+        Token enumLiteral_8=null;
+        Token enumLiteral_9=null;
+        Token enumLiteral_10=null;
+        Token enumLiteral_11=null;
+        Token enumLiteral_12=null;
+        Token enumLiteral_13=null;
+        Token enumLiteral_14=null;
+        Token enumLiteral_15=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30431:2: ( ( (enumLiteral_0= 'init' ) | (enumLiteral_1= 'final' ) | (enumLiteral_2= 'destroy' ) | (enumLiteral_3= 'start' ) | (enumLiteral_4= 'stop' ) | (enumLiteral_5= 'restart' ) | (enumLiteral_6= 'suspend' ) | (enumLiteral_7= 'resume' ) | (enumLiteral_8= 'wait' ) | (enumLiteral_9= 'disable' ) | (enumLiteral_10= 'enable' ) | (enumLiteral_11= 'abort' ) | (enumLiteral_12= 'schedule' ) | (enumLiteral_13= 'irun' ) | (enumLiteral_14= 'run' ) | (enumLiteral_15= 'rtc' ) ) )
+            // InternalFormalML.g:30432:2: ( (enumLiteral_0= 'init' ) | (enumLiteral_1= 'final' ) | (enumLiteral_2= 'destroy' ) | (enumLiteral_3= 'start' ) | (enumLiteral_4= 'stop' ) | (enumLiteral_5= 'restart' ) | (enumLiteral_6= 'suspend' ) | (enumLiteral_7= 'resume' ) | (enumLiteral_8= 'wait' ) | (enumLiteral_9= 'disable' ) | (enumLiteral_10= 'enable' ) | (enumLiteral_11= 'abort' ) | (enumLiteral_12= 'schedule' ) | (enumLiteral_13= 'irun' ) | (enumLiteral_14= 'run' ) | (enumLiteral_15= 'rtc' ) )
+            {
+            // InternalFormalML.g:30432:2: ( (enumLiteral_0= 'init' ) | (enumLiteral_1= 'final' ) | (enumLiteral_2= 'destroy' ) | (enumLiteral_3= 'start' ) | (enumLiteral_4= 'stop' ) | (enumLiteral_5= 'restart' ) | (enumLiteral_6= 'suspend' ) | (enumLiteral_7= 'resume' ) | (enumLiteral_8= 'wait' ) | (enumLiteral_9= 'disable' ) | (enumLiteral_10= 'enable' ) | (enumLiteral_11= 'abort' ) | (enumLiteral_12= 'schedule' ) | (enumLiteral_13= 'irun' ) | (enumLiteral_14= 'run' ) | (enumLiteral_15= 'rtc' ) )
+            int alt630=16;
+            switch ( input.LA(1) ) {
+            case 275:
+                {
+                alt630=1;
+                }
+                break;
+            case 87:
+                {
+                alt630=2;
+                }
+                break;
+            case 276:
+                {
+                alt630=3;
+                }
+                break;
+            case 85:
+                {
+                alt630=4;
+                }
+                break;
+            case 277:
+                {
+                alt630=5;
+                }
+                break;
+            case 278:
+                {
+                alt630=6;
+                }
+                break;
+            case 279:
+                {
+                alt630=7;
+                }
+                break;
+            case 280:
+                {
+                alt630=8;
+                }
+                break;
+            case 281:
+                {
+                alt630=9;
+                }
+                break;
+            case 282:
+                {
+                alt630=10;
+                }
+                break;
+            case 283:
+                {
+                alt630=11;
+                }
+                break;
+            case 271:
+                {
+                alt630=12;
+                }
+                break;
+            case 284:
+                {
+                alt630=13;
+                }
+                break;
+            case 285:
+                {
+                alt630=14;
+                }
+                break;
+            case 286:
+                {
+                alt630=15;
+                }
+                break;
+            case 287:
+                {
+                alt630=16;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 630, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt630) {
+                case 1 :
+                    // InternalFormalML.g:30433:3: (enumLiteral_0= 'init' )
+                    {
+                    // InternalFormalML.g:30433:3: (enumLiteral_0= 'init' )
+                    // InternalFormalML.g:30434:4: enumLiteral_0= 'init'
+                    {
+                    enumLiteral_0=(Token)match(input,275,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getOPERATOR_ACTIVITYAccess().getInitEnumLiteralDeclaration_0());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalFormalML.g:30441:3: (enumLiteral_1= 'final' )
+                    {
+                    // InternalFormalML.g:30441:3: (enumLiteral_1= 'final' )
+                    // InternalFormalML.g:30442:4: enumLiteral_1= 'final'
+                    {
+                    enumLiteral_1=(Token)match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getOPERATOR_ACTIVITYAccess().getFinalEnumLiteralDeclaration_1());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalFormalML.g:30449:3: (enumLiteral_2= 'destroy' )
+                    {
+                    // InternalFormalML.g:30449:3: (enumLiteral_2= 'destroy' )
+                    // InternalFormalML.g:30450:4: enumLiteral_2= 'destroy'
+                    {
+                    enumLiteral_2=(Token)match(input,276,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getOPERATOR_ACTIVITYAccess().getDestroyEnumLiteralDeclaration_2());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalFormalML.g:30457:3: (enumLiteral_3= 'start' )
+                    {
+                    // InternalFormalML.g:30457:3: (enumLiteral_3= 'start' )
+                    // InternalFormalML.g:30458:4: enumLiteral_3= 'start'
+                    {
+                    enumLiteral_3=(Token)match(input,85,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getOPERATOR_ACTIVITYAccess().getStartEnumLiteralDeclaration_3());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalFormalML.g:30465:3: (enumLiteral_4= 'stop' )
+                    {
+                    // InternalFormalML.g:30465:3: (enumLiteral_4= 'stop' )
+                    // InternalFormalML.g:30466:4: enumLiteral_4= 'stop'
+                    {
+                    enumLiteral_4=(Token)match(input,277,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_4, grammarAccess.getOPERATOR_ACTIVITYAccess().getStopEnumLiteralDeclaration_4());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalFormalML.g:30473:3: (enumLiteral_5= 'restart' )
+                    {
+                    // InternalFormalML.g:30473:3: (enumLiteral_5= 'restart' )
+                    // InternalFormalML.g:30474:4: enumLiteral_5= 'restart'
+                    {
+                    enumLiteral_5=(Token)match(input,278,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_5, grammarAccess.getOPERATOR_ACTIVITYAccess().getRestartEnumLiteralDeclaration_5());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalFormalML.g:30481:3: (enumLiteral_6= 'suspend' )
+                    {
+                    // InternalFormalML.g:30481:3: (enumLiteral_6= 'suspend' )
+                    // InternalFormalML.g:30482:4: enumLiteral_6= 'suspend'
+                    {
+                    enumLiteral_6=(Token)match(input,279,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_6, grammarAccess.getOPERATOR_ACTIVITYAccess().getSuspendEnumLiteralDeclaration_6());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalFormalML.g:30489:3: (enumLiteral_7= 'resume' )
+                    {
+                    // InternalFormalML.g:30489:3: (enumLiteral_7= 'resume' )
+                    // InternalFormalML.g:30490:4: enumLiteral_7= 'resume'
+                    {
+                    enumLiteral_7=(Token)match(input,280,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_7, grammarAccess.getOPERATOR_ACTIVITYAccess().getResumeEnumLiteralDeclaration_7());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalFormalML.g:30497:3: (enumLiteral_8= 'wait' )
+                    {
+                    // InternalFormalML.g:30497:3: (enumLiteral_8= 'wait' )
+                    // InternalFormalML.g:30498:4: enumLiteral_8= 'wait'
+                    {
+                    enumLiteral_8=(Token)match(input,281,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_8, grammarAccess.getOPERATOR_ACTIVITYAccess().getWaitEnumLiteralDeclaration_8());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalFormalML.g:30505:3: (enumLiteral_9= 'disable' )
+                    {
+                    // InternalFormalML.g:30505:3: (enumLiteral_9= 'disable' )
+                    // InternalFormalML.g:30506:4: enumLiteral_9= 'disable'
+                    {
+                    enumLiteral_9=(Token)match(input,282,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_9().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_9, grammarAccess.getOPERATOR_ACTIVITYAccess().getDisableEnumLiteralDeclaration_9());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalFormalML.g:30513:3: (enumLiteral_10= 'enable' )
+                    {
+                    // InternalFormalML.g:30513:3: (enumLiteral_10= 'enable' )
+                    // InternalFormalML.g:30514:4: enumLiteral_10= 'enable'
+                    {
+                    enumLiteral_10=(Token)match(input,283,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_10().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_10, grammarAccess.getOPERATOR_ACTIVITYAccess().getEnableEnumLiteralDeclaration_10());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 12 :
+                    // InternalFormalML.g:30521:3: (enumLiteral_11= 'abort' )
+                    {
+                    // InternalFormalML.g:30521:3: (enumLiteral_11= 'abort' )
+                    // InternalFormalML.g:30522:4: enumLiteral_11= 'abort'
+                    {
+                    enumLiteral_11=(Token)match(input,271,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_11().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_11, grammarAccess.getOPERATOR_ACTIVITYAccess().getAbortEnumLiteralDeclaration_11());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 13 :
+                    // InternalFormalML.g:30529:3: (enumLiteral_12= 'schedule' )
+                    {
+                    // InternalFormalML.g:30529:3: (enumLiteral_12= 'schedule' )
+                    // InternalFormalML.g:30530:4: enumLiteral_12= 'schedule'
+                    {
+                    enumLiteral_12=(Token)match(input,284,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_12().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_12, grammarAccess.getOPERATOR_ACTIVITYAccess().getScheduleEnumLiteralDeclaration_12());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 14 :
+                    // InternalFormalML.g:30537:3: (enumLiteral_13= 'irun' )
+                    {
+                    // InternalFormalML.g:30537:3: (enumLiteral_13= 'irun' )
+                    // InternalFormalML.g:30538:4: enumLiteral_13= 'irun'
+                    {
+                    enumLiteral_13=(Token)match(input,285,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_13().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_13, grammarAccess.getOPERATOR_ACTIVITYAccess().getIrunEnumLiteralDeclaration_13());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 15 :
+                    // InternalFormalML.g:30545:3: (enumLiteral_14= 'run' )
+                    {
+                    // InternalFormalML.g:30545:3: (enumLiteral_14= 'run' )
+                    // InternalFormalML.g:30546:4: enumLiteral_14= 'run'
+                    {
+                    enumLiteral_14=(Token)match(input,286,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_14().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_14, grammarAccess.getOPERATOR_ACTIVITYAccess().getRunEnumLiteralDeclaration_14());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 16 :
+                    // InternalFormalML.g:30553:3: (enumLiteral_15= 'rtc' )
+                    {
+                    // InternalFormalML.g:30553:3: (enumLiteral_15= 'rtc' )
+                    // InternalFormalML.g:30554:4: enumLiteral_15= 'rtc'
+                    {
+                    enumLiteral_15=(Token)match(input,287,FollowSets000.FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				current = grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_15().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_15, grammarAccess.getOPERATOR_ACTIVITYAccess().getRtcEnumLiteralDeclaration_15());
+                      			
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleOPERATOR_ACTIVITY"
+
+
+    // $ANTLR start "ruleValueDotFieldExpressionKind"
+    // InternalFormalML.g:30564:1: ruleValueDotFieldExpressionKind returns [Enumerator current=null] : (enumLiteral_0= '.' ) ;
+    public final Enumerator ruleValueDotFieldExpressionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30570:2: ( (enumLiteral_0= '.' ) )
+            // InternalFormalML.g:30571:2: (enumLiteral_0= '.' )
+            {
+            // InternalFormalML.g:30571:2: (enumLiteral_0= '.' )
+            // InternalFormalML.g:30572:3: enumLiteral_0= '.'
+            {
+            enumLiteral_0=(Token)match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getValueDotFieldExpressionKindAccess().getFieldEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleValueDotFieldExpressionKind"
+
+
+    // $ANTLR start "ruleValueArrowFieldExpressionKind"
+    // InternalFormalML.g:30581:1: ruleValueArrowFieldExpressionKind returns [Enumerator current=null] : (enumLiteral_0= '->' ) ;
+    public final Enumerator ruleValueArrowFieldExpressionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30587:2: ( (enumLiteral_0= '->' ) )
+            // InternalFormalML.g:30588:2: (enumLiteral_0= '->' )
+            {
+            // InternalFormalML.g:30588:2: (enumLiteral_0= '->' )
+            // InternalFormalML.g:30589:3: enumLiteral_0= '->'
+            {
+            enumLiteral_0=(Token)match(input,92,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getValueArrowFieldExpressionKindAccess().getFieldEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleValueArrowFieldExpressionKind"
+
+
+    // $ANTLR start "ruleValueIndexExpressionKind"
+    // InternalFormalML.g:30598:1: ruleValueIndexExpressionKind returns [Enumerator current=null] : (enumLiteral_0= '[' ) ;
+    public final Enumerator ruleValueIndexExpressionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30604:2: ( (enumLiteral_0= '[' ) )
+            // InternalFormalML.g:30605:2: (enumLiteral_0= '[' )
+            {
+            // InternalFormalML.g:30605:2: (enumLiteral_0= '[' )
+            // InternalFormalML.g:30606:3: enumLiteral_0= '['
+            {
+            enumLiteral_0=(Token)match(input,97,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getValueIndexExpressionKindAccess().getIndexEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleValueIndexExpressionKind"
+
+
+    // $ANTLR start "ruleValueParameterExpressionKind"
+    // InternalFormalML.g:30615:1: ruleValueParameterExpressionKind returns [Enumerator current=null] : (enumLiteral_0= '(' ) ;
+    public final Enumerator ruleValueParameterExpressionKind() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalFormalML.g:30621:2: ( (enumLiteral_0= '(' ) )
+            // InternalFormalML.g:30622:2: (enumLiteral_0= '(' )
+            {
+            // InternalFormalML.g:30622:2: (enumLiteral_0= '(' )
+            // InternalFormalML.g:30623:3: enumLiteral_0= '('
+            {
+            enumLiteral_0=(Token)match(input,56,FollowSets000.FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current = grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration().getEnumLiteral().getInstance();
+              			newLeafNode(enumLiteral_0, grammarAccess.getValueParameterExpressionKindAccess().getParameterEnumLiteralDeclaration());
+              		
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleValueParameterExpressionKind"
+
+    // $ANTLR start synpred18_InternalFormalML
+    public final void synpred18_InternalFormalML_fragment() throws RecognitionException {   
+        Enumerator lv_visibility_1_0 = null;
+
+
+        // InternalFormalML.g:945:4: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) )
+        // InternalFormalML.g:945:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+        {
+        // InternalFormalML.g:945:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+        // InternalFormalML.g:946:5: {...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred18_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0)");
+        }
+        // InternalFormalML.g:946:103: ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+        // InternalFormalML.g:947:6: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 0);
+        // InternalFormalML.g:950:9: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+        // InternalFormalML.g:950:10: {...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred18_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:950:19: ( (lv_visibility_1_0= ruleVisibilityKind ) )
+        // InternalFormalML.g:950:20: (lv_visibility_1_0= ruleVisibilityKind )
+        {
+        // InternalFormalML.g:950:20: (lv_visibility_1_0= ruleVisibilityKind )
+        // InternalFormalML.g:951:10: lv_visibility_1_0= ruleVisibilityKind
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getSystemAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_visibility_1_0=ruleVisibilityKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred18_InternalFormalML
+
+    // $ANTLR start synpred20_InternalFormalML
+    public final void synpred20_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_timed_2_0=null;
+        Token lv_input_enabled_3_0=null;
+
+        // InternalFormalML.g:973:4: ( ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )
+        // InternalFormalML.g:973:4: ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) )
+        {
+        // InternalFormalML.g:973:4: ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) )
+        // InternalFormalML.g:974:5: {...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred20_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1)");
+        }
+        // InternalFormalML.g:974:103: ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) )
+        // InternalFormalML.g:975:6: ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getSystemAccess().getUnorderedGroup_0(), 1);
+        // InternalFormalML.g:978:9: ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) )
+        // InternalFormalML.g:978:10: {...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred20_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:978:19: ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) )
+        int alt633=2;
+        int LA633_0 = input.LA(1);
+
+        if ( (LA633_0==32) ) {
+            alt633=1;
+        }
+        else if ( (LA633_0==33) ) {
+            alt633=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 633, 0, input);
+
+            throw nvae;
+        }
+        switch (alt633) {
+            case 1 :
+                // InternalFormalML.g:978:20: ( (lv_timed_2_0= 'timed' ) )
+                {
+                // InternalFormalML.g:978:20: ( (lv_timed_2_0= 'timed' ) )
+                // InternalFormalML.g:979:10: (lv_timed_2_0= 'timed' )
+                {
+                // InternalFormalML.g:979:10: (lv_timed_2_0= 'timed' )
+                // InternalFormalML.g:980:11: lv_timed_2_0= 'timed'
+                {
+                lv_timed_2_0=(Token)match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:993:9: ( (lv_input_enabled_3_0= 'input_enabled' ) )
+                {
+                // InternalFormalML.g:993:9: ( (lv_input_enabled_3_0= 'input_enabled' ) )
+                // InternalFormalML.g:994:10: (lv_input_enabled_3_0= 'input_enabled' )
+                {
+                // InternalFormalML.g:994:10: (lv_input_enabled_3_0= 'input_enabled' )
+                // InternalFormalML.g:995:11: lv_input_enabled_3_0= 'input_enabled'
+                {
+                lv_input_enabled_3_0=(Token)match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred20_InternalFormalML
+
+    // $ANTLR start synpred91_InternalFormalML
+    public final void synpred91_InternalFormalML_fragment() throws RecognitionException {   
+        Enumerator lv_visibility_1_0 = null;
+
+
+        // InternalFormalML.g:2449:4: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) )
+        // InternalFormalML.g:2449:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+        {
+        // InternalFormalML.g:2449:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+        // InternalFormalML.g:2450:5: {...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred91_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0)");
+        }
+        // InternalFormalML.g:2450:109: ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+        // InternalFormalML.g:2451:6: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0);
+        // InternalFormalML.g:2454:9: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+        // InternalFormalML.g:2454:10: {...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred91_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:2454:19: ( (lv_visibility_1_0= ruleVisibilityKind ) )
+        // InternalFormalML.g:2454:20: (lv_visibility_1_0= ruleVisibilityKind )
+        {
+        // InternalFormalML.g:2454:20: (lv_visibility_1_0= ruleVisibilityKind )
+        // InternalFormalML.g:2455:10: lv_visibility_1_0= ruleVisibilityKind
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getMachineBlockAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_visibility_1_0=ruleVisibilityKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred91_InternalFormalML
+
+    // $ANTLR start synpred93_InternalFormalML
+    public final void synpred93_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_timed_2_0=null;
+        Token lv_input_enabled_3_0=null;
+
+        // InternalFormalML.g:2477:4: ( ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) )
+        // InternalFormalML.g:2477:4: ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) )
+        {
+        // InternalFormalML.g:2477:4: ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) )
+        // InternalFormalML.g:2478:5: {...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred93_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1)");
+        }
+        // InternalFormalML.g:2478:109: ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) )
+        // InternalFormalML.g:2479:6: ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1);
+        // InternalFormalML.g:2482:9: ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) )
+        // InternalFormalML.g:2482:10: {...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred93_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:2482:19: ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) )
+        int alt660=2;
+        int LA660_0 = input.LA(1);
+
+        if ( (LA660_0==32) ) {
+            alt660=1;
+        }
+        else if ( (LA660_0==33) ) {
+            alt660=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 660, 0, input);
+
+            throw nvae;
+        }
+        switch (alt660) {
+            case 1 :
+                // InternalFormalML.g:2482:20: ( (lv_timed_2_0= 'timed' ) )
+                {
+                // InternalFormalML.g:2482:20: ( (lv_timed_2_0= 'timed' ) )
+                // InternalFormalML.g:2483:10: (lv_timed_2_0= 'timed' )
+                {
+                // InternalFormalML.g:2483:10: (lv_timed_2_0= 'timed' )
+                // InternalFormalML.g:2484:11: lv_timed_2_0= 'timed'
+                {
+                lv_timed_2_0=(Token)match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:2497:9: ( (lv_input_enabled_3_0= 'input_enabled' ) )
+                {
+                // InternalFormalML.g:2497:9: ( (lv_input_enabled_3_0= 'input_enabled' ) )
+                // InternalFormalML.g:2498:10: (lv_input_enabled_3_0= 'input_enabled' )
+                {
+                // InternalFormalML.g:2498:10: (lv_input_enabled_3_0= 'input_enabled' )
+                // InternalFormalML.g:2499:11: lv_input_enabled_3_0= 'input_enabled'
+                {
+                lv_input_enabled_3_0=(Token)match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred93_InternalFormalML
+
+    // $ANTLR start synpred94_InternalFormalML
+    public final void synpred94_InternalFormalML_fragment() throws RecognitionException {   
+        Enumerator lv_design_4_0 = null;
+
+
+        // InternalFormalML.g:2517:4: ( ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )
+        // InternalFormalML.g:2517:4: ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) )
+        {
+        // InternalFormalML.g:2517:4: ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) )
+        // InternalFormalML.g:2518:5: {...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred94_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2)");
+        }
+        // InternalFormalML.g:2518:109: ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) )
+        // InternalFormalML.g:2519:6: ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2);
+        // InternalFormalML.g:2522:9: ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) )
+        // InternalFormalML.g:2522:10: {...}? => ( (lv_design_4_0= ruleDesignKind ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred94_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:2522:19: ( (lv_design_4_0= ruleDesignKind ) )
+        // InternalFormalML.g:2522:20: (lv_design_4_0= ruleDesignKind )
+        {
+        // InternalFormalML.g:2522:20: (lv_design_4_0= ruleDesignKind )
+        // InternalFormalML.g:2523:10: lv_design_4_0= ruleDesignKind
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getMachineBlockAccess().getDesignDesignKindEnumRuleCall_0_2_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_design_4_0=ruleDesignKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred94_InternalFormalML
+
+    // $ANTLR start synpred166_InternalFormalML
+    public final void synpred166_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        Token otherlv_14=null;
+        Token otherlv_16=null;
+        Token otherlv_18=null;
+        Token otherlv_20=null;
+        EObject lv_parameter_10_0 = null;
+
+        EObject lv_parameter_12_0 = null;
+
+        EObject lv_parameter_15_0 = null;
+
+        EObject lv_parameter_17_0 = null;
+
+        EObject lv_parameter_19_0 = null;
+
+
+        // InternalFormalML.g:3684:4: ( (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )? (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )? )
+        // InternalFormalML.g:3684:4: (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )? (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )?
+        {
+        // InternalFormalML.g:3684:4: (otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')' )?
+        int alt690=2;
+        int LA690_0 = input.LA(1);
+
+        if ( (LA690_0==56) ) {
+            alt690=1;
+        }
+        switch (alt690) {
+            case 1 :
+                // InternalFormalML.g:3685:5: otherlv_9= '(' ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )? otherlv_13= ')'
+                {
+                otherlv_9=(Token)match(input,56,FollowSets000.FOLLOW_45); if (state.failed) return ;
+                // InternalFormalML.g:3689:5: ( ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )* )?
+                int alt689=2;
+                int LA689_0 = input.LA(1);
+
+                if ( (LA689_0==RULE_XLIA_ID||LA689_0==28||LA689_0==53||LA689_0==62||LA689_0==64||(LA689_0>=102 && LA689_0<=105)||(LA689_0>=107 && LA689_0<=127)||(LA689_0>=136 && LA689_0<=138)||LA689_0==212||(LA689_0>=216 && LA689_0<=217)||(LA689_0>=260 && LA689_0<=270)) ) {
+                    alt689=1;
+                }
+                switch (alt689) {
+                    case 1 :
+                        // InternalFormalML.g:3690:6: ( (lv_parameter_10_0= ruleFunctionalParameter ) ) (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )*
+                        {
+                        // InternalFormalML.g:3690:6: ( (lv_parameter_10_0= ruleFunctionalParameter ) )
+                        // InternalFormalML.g:3691:7: (lv_parameter_10_0= ruleFunctionalParameter )
+                        {
+                        // InternalFormalML.g:3691:7: (lv_parameter_10_0= ruleFunctionalParameter )
+                        // InternalFormalML.g:3692:8: lv_parameter_10_0= ruleFunctionalParameter
+                        {
+                        if ( state.backtracking==0 ) {
+
+                          								newCompositeNode(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_0_0());
+                          							
+                        }
+                        pushFollow(FollowSets000.FOLLOW_39);
+                        lv_parameter_10_0=ruleFunctionalParameter();
+
+                        state._fsp--;
+                        if (state.failed) return ;
+
+                        }
+
+
+                        }
+
+                        // InternalFormalML.g:3709:6: (otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) ) )*
+                        loop688:
+                        do {
+                            int alt688=2;
+                            int LA688_0 = input.LA(1);
+
+                            if ( (LA688_0==20) ) {
+                                alt688=1;
+                            }
+
+
+                            switch (alt688) {
+                        	case 1 :
+                        	    // InternalFormalML.g:3710:7: otherlv_11= ',' ( (lv_parameter_12_0= ruleFunctionalParameter ) )
+                        	    {
+                        	    otherlv_11=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return ;
+                        	    // InternalFormalML.g:3714:7: ( (lv_parameter_12_0= ruleFunctionalParameter ) )
+                        	    // InternalFormalML.g:3715:8: (lv_parameter_12_0= ruleFunctionalParameter )
+                        	    {
+                        	    // InternalFormalML.g:3715:8: (lv_parameter_12_0= ruleFunctionalParameter )
+                        	    // InternalFormalML.g:3716:9: lv_parameter_12_0= ruleFunctionalParameter
+                        	    {
+                        	    if ( state.backtracking==0 ) {
+
+                        	      									newCompositeNode(grammarAccess.getProcedureAccess().getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0());
+                        	      								
+                        	    }
+                        	    pushFollow(FollowSets000.FOLLOW_39);
+                        	    lv_parameter_12_0=ruleFunctionalParameter();
+
+                        	    state._fsp--;
+                        	    if (state.failed) return ;
+
+                        	    }
+
+
+                        	    }
+
+
+                        	    }
+                        	    break;
+
+                        	default :
+                        	    break loop688;
+                            }
+                        } while (true);
+
+
+                        }
+                        break;
+
+                }
+
+                otherlv_13=(Token)match(input,57,FollowSets000.FOLLOW_195); if (state.failed) return ;
+
+                }
+                break;
+
+        }
+
+        // InternalFormalML.g:3740:4: (otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) ) )?
+        int alt693=2;
+        int LA693_0 = input.LA(1);
+
+        if ( (LA693_0==59) ) {
+            alt693=1;
+        }
+        switch (alt693) {
+            case 1 :
+                // InternalFormalML.g:3741:5: otherlv_14= '-->' ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) )
+                {
+                otherlv_14=(Token)match(input,59,FollowSets000.FOLLOW_48); if (state.failed) return ;
+                // InternalFormalML.g:3745:5: ( ( (lv_parameter_15_0= ruleFormalParameter ) ) | (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' ) )
+                int alt692=2;
+                int LA692_0 = input.LA(1);
+
+                if ( (LA692_0==RULE_XLIA_ID||LA692_0==28||LA692_0==53||LA692_0==62||LA692_0==64||(LA692_0>=102 && LA692_0<=105)||(LA692_0>=107 && LA692_0<=127)||(LA692_0>=136 && LA692_0<=138)||LA692_0==212||(LA692_0>=216 && LA692_0<=217)||(LA692_0>=260 && LA692_0<=270)) ) {
+                    alt692=1;
+                }
+                else if ( (LA692_0==56) ) {
+                    alt692=2;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return ;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 692, 0, input);
+
+                    throw nvae;
+                }
+                switch (alt692) {
+                    case 1 :
+                        // InternalFormalML.g:3746:6: ( (lv_parameter_15_0= ruleFormalParameter ) )
+                        {
+                        // InternalFormalML.g:3746:6: ( (lv_parameter_15_0= ruleFormalParameter ) )
+                        // InternalFormalML.g:3747:7: (lv_parameter_15_0= ruleFormalParameter )
+                        {
+                        // InternalFormalML.g:3747:7: (lv_parameter_15_0= ruleFormalParameter )
+                        // InternalFormalML.g:3748:8: lv_parameter_15_0= ruleFormalParameter
+                        {
+                        if ( state.backtracking==0 ) {
+
+                          								newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_0_0());
+                          							
+                        }
+                        pushFollow(FollowSets000.FOLLOW_2);
+                        lv_parameter_15_0=ruleFormalParameter();
+
+                        state._fsp--;
+                        if (state.failed) return ;
+
+                        }
+
+
+                        }
+
+
+                        }
+                        break;
+                    case 2 :
+                        // InternalFormalML.g:3766:6: (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' )
+                        {
+                        // InternalFormalML.g:3766:6: (otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')' )
+                        // InternalFormalML.g:3767:7: otherlv_16= '(' ( (lv_parameter_17_0= ruleFormalParameter ) ) (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )* otherlv_20= ')'
+                        {
+                        otherlv_16=(Token)match(input,56,FollowSets000.FOLLOW_46); if (state.failed) return ;
+                        // InternalFormalML.g:3771:7: ( (lv_parameter_17_0= ruleFormalParameter ) )
+                        // InternalFormalML.g:3772:8: (lv_parameter_17_0= ruleFormalParameter )
+                        {
+                        // InternalFormalML.g:3772:8: (lv_parameter_17_0= ruleFormalParameter )
+                        // InternalFormalML.g:3773:9: lv_parameter_17_0= ruleFormalParameter
+                        {
+                        if ( state.backtracking==0 ) {
+
+                          									newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_1_0());
+                          								
+                        }
+                        pushFollow(FollowSets000.FOLLOW_39);
+                        lv_parameter_17_0=ruleFormalParameter();
+
+                        state._fsp--;
+                        if (state.failed) return ;
+
+                        }
+
+
+                        }
+
+                        // InternalFormalML.g:3790:7: (otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) ) )*
+                        loop691:
+                        do {
+                            int alt691=2;
+                            int LA691_0 = input.LA(1);
+
+                            if ( (LA691_0==20) ) {
+                                alt691=1;
+                            }
+
+
+                            switch (alt691) {
+                        	case 1 :
+                        	    // InternalFormalML.g:3791:8: otherlv_18= ',' ( (lv_parameter_19_0= ruleFormalParameter ) )
+                        	    {
+                        	    otherlv_18=(Token)match(input,20,FollowSets000.FOLLOW_46); if (state.failed) return ;
+                        	    // InternalFormalML.g:3795:8: ( (lv_parameter_19_0= ruleFormalParameter ) )
+                        	    // InternalFormalML.g:3796:9: (lv_parameter_19_0= ruleFormalParameter )
+                        	    {
+                        	    // InternalFormalML.g:3796:9: (lv_parameter_19_0= ruleFormalParameter )
+                        	    // InternalFormalML.g:3797:10: lv_parameter_19_0= ruleFormalParameter
+                        	    {
+                        	    if ( state.backtracking==0 ) {
+
+                        	      										newCompositeNode(grammarAccess.getProcedureAccess().getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0());
+                        	      									
+                        	    }
+                        	    pushFollow(FollowSets000.FOLLOW_39);
+                        	    lv_parameter_19_0=ruleFormalParameter();
+
+                        	    state._fsp--;
+                        	    if (state.failed) return ;
+
+                        	    }
+
+
+                        	    }
+
+
+                        	    }
+                        	    break;
+
+                        	default :
+                        	    break loop691;
+                            }
+                        } while (true);
+
+                        otherlv_20=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                        }
+
+
+                        }
+                        break;
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred166_InternalFormalML
+
+    // $ANTLR start synpred241_InternalFormalML
+    public final void synpred241_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_execution_106_0 = null;
+
+
+        // InternalFormalML.g:5082:4: ( (lv_execution_106_0= ruleProcedureExecution ) )
+        // InternalFormalML.g:5082:4: (lv_execution_106_0= ruleProcedureExecution )
+        {
+        // InternalFormalML.g:5082:4: (lv_execution_106_0= ruleProcedureExecution )
+        // InternalFormalML.g:5083:5: lv_execution_106_0= ruleProcedureExecution
+        {
+        if ( state.backtracking==0 ) {
+
+          					newCompositeNode(grammarAccess.getProcedureAccess().getExecutionProcedureExecutionParserRuleCall_12_0());
+          				
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_execution_106_0=ruleProcedureExecution();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred241_InternalFormalML
+
+    // $ANTLR start synpred243_InternalFormalML
+    public final void synpred243_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_3=null;
+        EObject lv_scheduleRoutine_4_0 = null;
+
+
+        // InternalFormalML.g:5156:4: ( ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:5156:4: ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:5156:4: ({...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:5157:5: {...}? => ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred243_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0)");
+        }
+        // InternalFormalML.g:5157:115: ( ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:5158:6: ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 0);
+        // InternalFormalML.g:5161:9: ({...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:5161:10: {...}? => (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred243_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:5161:19: (otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:5161:20: otherlv_3= '@schedule' ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) )
+        {
+        otherlv_3=(Token)match(input,70,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:5165:9: ( (lv_scheduleRoutine_4_0= rulemoeRoutine ) )
+        // InternalFormalML.g:5166:10: (lv_scheduleRoutine_4_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:5166:10: (lv_scheduleRoutine_4_0= rulemoeRoutine )
+        // InternalFormalML.g:5167:11: lv_scheduleRoutine_4_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getProcedureExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_scheduleRoutine_4_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred243_InternalFormalML
+
+    // $ANTLR start synpred244_InternalFormalML
+    public final void synpred244_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_5=null;
+        EObject lv_runRoutine_6_0 = null;
+
+
+        // InternalFormalML.g:5190:4: ( ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:5190:4: ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:5190:4: ({...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:5191:5: {...}? => ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred244_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1)");
+        }
+        // InternalFormalML.g:5191:115: ( ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:5192:6: ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getProcedureExecutionAccess().getUnorderedGroup_2(), 1);
+        // InternalFormalML.g:5195:9: ({...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:5195:10: {...}? => (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred244_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:5195:19: (otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:5195:20: otherlv_5= '@run' ( (lv_runRoutine_6_0= rulemoeRoutine ) )
+        {
+        otherlv_5=(Token)match(input,71,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:5199:9: ( (lv_runRoutine_6_0= rulemoeRoutine ) )
+        // InternalFormalML.g:5200:10: (lv_runRoutine_6_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:5200:10: (lv_runRoutine_6_0= rulemoeRoutine )
+        // InternalFormalML.g:5201:11: lv_runRoutine_6_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getProcedureExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_2_1_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_runRoutine_6_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred244_InternalFormalML
+
+    // $ANTLR start synpred252_InternalFormalML
+    public final void synpred252_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_execution_9_0 = null;
+
+
+        // InternalFormalML.g:5435:4: ( ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) ) )
+        // InternalFormalML.g:5435:4: ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) )
+        {
+        // InternalFormalML.g:5435:4: ({...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) ) )
+        // InternalFormalML.g:5436:5: {...}? => ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred252_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0)");
+        }
+        // InternalFormalML.g:5436:108: ( ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) ) )
+        // InternalFormalML.g:5437:6: ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 0);
+        // InternalFormalML.g:5440:9: ({...}? => ( (lv_execution_9_0= ruleModelOfExecution ) ) )
+        // InternalFormalML.g:5440:10: {...}? => ( (lv_execution_9_0= ruleModelOfExecution ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred252_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:5440:19: ( (lv_execution_9_0= ruleModelOfExecution ) )
+        // InternalFormalML.g:5440:20: (lv_execution_9_0= ruleModelOfExecution )
+        {
+        // InternalFormalML.g:5440:20: (lv_execution_9_0= ruleModelOfExecution )
+        // InternalFormalML.g:5441:10: lv_execution_9_0= ruleModelOfExecution
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getMoeBehaviorAccess().getExecutionModelOfExecutionParserRuleCall_2_0_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_execution_9_0=ruleModelOfExecution();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred252_InternalFormalML
+
+    // $ANTLR start synpred253_InternalFormalML
+    public final void synpred253_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_interaction_10_0 = null;
+
+
+        // InternalFormalML.g:5463:4: ( ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) ) )
+        // InternalFormalML.g:5463:4: ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) )
+        {
+        // InternalFormalML.g:5463:4: ({...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) ) )
+        // InternalFormalML.g:5464:5: {...}? => ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred253_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1)");
+        }
+        // InternalFormalML.g:5464:108: ( ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) ) )
+        // InternalFormalML.g:5465:6: ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getMoeBehaviorAccess().getUnorderedGroup_2(), 1);
+        // InternalFormalML.g:5468:9: ({...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) ) )
+        // InternalFormalML.g:5468:10: {...}? => ( (lv_interaction_10_0= ruleModelOfInteraction ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred253_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:5468:19: ( (lv_interaction_10_0= ruleModelOfInteraction ) )
+        // InternalFormalML.g:5468:20: (lv_interaction_10_0= ruleModelOfInteraction )
+        {
+        // InternalFormalML.g:5468:20: (lv_interaction_10_0= ruleModelOfInteraction )
+        // InternalFormalML.g:5469:10: lv_interaction_10_0= ruleModelOfInteraction
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getMoeBehaviorAccess().getInteractionModelOfInteractionParserRuleCall_2_1_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_interaction_10_0=ruleModelOfInteraction();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred253_InternalFormalML
+
+    // $ANTLR start synpred254_InternalFormalML
+    public final void synpred254_InternalFormalML_fragment() throws RecognitionException {   
+        Enumerator lv_visibility_2_0 = null;
+
+
+        // InternalFormalML.g:5549:4: ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) )
+        // InternalFormalML.g:5549:4: ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) )
+        {
+        // InternalFormalML.g:5549:4: ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) )
+        // InternalFormalML.g:5550:5: {...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred254_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:5550:109: ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) )
+        // InternalFormalML.g:5551:6: ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:5554:9: ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) )
+        // InternalFormalML.g:5554:10: {...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred254_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:5554:19: ( (lv_visibility_2_0= ruleVisibilityKind ) )
+        // InternalFormalML.g:5554:20: (lv_visibility_2_0= ruleVisibilityKind )
+        {
+        // InternalFormalML.g:5554:20: (lv_visibility_2_0= ruleVisibilityKind )
+        // InternalFormalML.g:5555:10: lv_visibility_2_0= ruleVisibilityKind
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getStatemachineAccess().getVisibilityVisibilityKindEnumRuleCall_1_0_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_visibility_2_0=ruleVisibilityKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred254_InternalFormalML
+
+    // $ANTLR start synpred256_InternalFormalML
+    public final void synpred256_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_timed_3_0=null;
+        Token lv_input_enabled_4_0=null;
+
+        // InternalFormalML.g:5577:4: ( ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) )
+        // InternalFormalML.g:5577:4: ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) )
+        {
+        // InternalFormalML.g:5577:4: ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) )
+        // InternalFormalML.g:5578:5: {...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred256_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1)");
+        }
+        // InternalFormalML.g:5578:109: ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) )
+        // InternalFormalML.g:5579:6: ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1);
+        // InternalFormalML.g:5582:9: ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) )
+        // InternalFormalML.g:5582:10: {...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred256_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:5582:19: ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) )
+        int alt736=2;
+        int LA736_0 = input.LA(1);
+
+        if ( (LA736_0==32) ) {
+            alt736=1;
+        }
+        else if ( (LA736_0==33) ) {
+            alt736=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 736, 0, input);
+
+            throw nvae;
+        }
+        switch (alt736) {
+            case 1 :
+                // InternalFormalML.g:5582:20: ( (lv_timed_3_0= 'timed' ) )
+                {
+                // InternalFormalML.g:5582:20: ( (lv_timed_3_0= 'timed' ) )
+                // InternalFormalML.g:5583:10: (lv_timed_3_0= 'timed' )
+                {
+                // InternalFormalML.g:5583:10: (lv_timed_3_0= 'timed' )
+                // InternalFormalML.g:5584:11: lv_timed_3_0= 'timed'
+                {
+                lv_timed_3_0=(Token)match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:5597:9: ( (lv_input_enabled_4_0= 'input_enabled' ) )
+                {
+                // InternalFormalML.g:5597:9: ( (lv_input_enabled_4_0= 'input_enabled' ) )
+                // InternalFormalML.g:5598:10: (lv_input_enabled_4_0= 'input_enabled' )
+                {
+                // InternalFormalML.g:5598:10: (lv_input_enabled_4_0= 'input_enabled' )
+                // InternalFormalML.g:5599:11: lv_input_enabled_4_0= 'input_enabled'
+                {
+                lv_input_enabled_4_0=(Token)match(input,33,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred256_InternalFormalML
+
+    // $ANTLR start synpred257_InternalFormalML
+    public final void synpred257_InternalFormalML_fragment() throws RecognitionException {   
+        Enumerator lv_design_5_0 = null;
+
+
+        // InternalFormalML.g:5617:4: ( ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )
+        // InternalFormalML.g:5617:4: ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) )
+        {
+        // InternalFormalML.g:5617:4: ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) )
+        // InternalFormalML.g:5618:5: {...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred257_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2)");
+        }
+        // InternalFormalML.g:5618:109: ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) )
+        // InternalFormalML.g:5619:6: ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2);
+        // InternalFormalML.g:5622:9: ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) )
+        // InternalFormalML.g:5622:10: {...}? => ( (lv_design_5_0= ruleDesignKind ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred257_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:5622:19: ( (lv_design_5_0= ruleDesignKind ) )
+        // InternalFormalML.g:5622:20: (lv_design_5_0= ruleDesignKind )
+        {
+        // InternalFormalML.g:5622:20: (lv_design_5_0= ruleDesignKind )
+        // InternalFormalML.g:5623:10: lv_design_5_0= ruleDesignKind
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getStatemachineAccess().getDesignDesignKindEnumRuleCall_1_2_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_design_5_0=ruleDesignKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred257_InternalFormalML
+
+    // $ANTLR start synpred335_InternalFormalML
+    public final void synpred335_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_execution_100_0 = null;
+
+
+        // InternalFormalML.g:6986:4: ( ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) ) )
+        // InternalFormalML.g:6986:4: ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) )
+        {
+        // InternalFormalML.g:6986:4: ({...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) ) )
+        // InternalFormalML.g:6987:5: {...}? => ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred335_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0)");
+        }
+        // InternalFormalML.g:6987:110: ( ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) ) )
+        // InternalFormalML.g:6988:6: ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 0);
+        // InternalFormalML.g:6991:9: ({...}? => ( (lv_execution_100_0= ruleModelOfExecution ) ) )
+        // InternalFormalML.g:6991:10: {...}? => ( (lv_execution_100_0= ruleModelOfExecution ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred335_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:6991:19: ( (lv_execution_100_0= ruleModelOfExecution ) )
+        // InternalFormalML.g:6991:20: (lv_execution_100_0= ruleModelOfExecution )
+        {
+        // InternalFormalML.g:6991:20: (lv_execution_100_0= ruleModelOfExecution )
+        // InternalFormalML.g:6992:10: lv_execution_100_0= ruleModelOfExecution
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getStatemachineAccess().getExecutionModelOfExecutionParserRuleCall_12_0_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_execution_100_0=ruleModelOfExecution();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred335_InternalFormalML
+
+    // $ANTLR start synpred336_InternalFormalML
+    public final void synpred336_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_interaction_101_0 = null;
+
+
+        // InternalFormalML.g:7014:4: ( ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) ) )
+        // InternalFormalML.g:7014:4: ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) )
+        {
+        // InternalFormalML.g:7014:4: ({...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) ) )
+        // InternalFormalML.g:7015:5: {...}? => ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred336_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1)");
+        }
+        // InternalFormalML.g:7015:110: ( ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) ) )
+        // InternalFormalML.g:7016:6: ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getStatemachineAccess().getUnorderedGroup_12(), 1);
+        // InternalFormalML.g:7019:9: ({...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) ) )
+        // InternalFormalML.g:7019:10: {...}? => ( (lv_interaction_101_0= ruleModelOfInteraction ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred336_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:7019:19: ( (lv_interaction_101_0= ruleModelOfInteraction ) )
+        // InternalFormalML.g:7019:20: (lv_interaction_101_0= ruleModelOfInteraction )
+        {
+        // InternalFormalML.g:7019:20: (lv_interaction_101_0= ruleModelOfInteraction )
+        // InternalFormalML.g:7020:10: lv_interaction_101_0= ruleModelOfInteraction
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getStatemachineAccess().getInteractionModelOfInteractionParserRuleCall_12_1_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_interaction_101_0=ruleModelOfInteraction();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred336_InternalFormalML
+
+    // $ANTLR start synpred411_InternalFormalML
+    public final void synpred411_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_routine_2_0 = null;
+
+
+        // InternalFormalML.g:9073:4: ( (lv_routine_2_0= ruleRoutine ) )
+        // InternalFormalML.g:9073:4: (lv_routine_2_0= ruleRoutine )
+        {
+        // InternalFormalML.g:9073:4: (lv_routine_2_0= ruleRoutine )
+        // InternalFormalML.g:9074:5: lv_routine_2_0= ruleRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          					newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRoutineRoutineParserRuleCall_2_0());
+          				
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_routine_2_0=ruleRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred411_InternalFormalML
+
+    // $ANTLR start synpred412_InternalFormalML
+    public final void synpred412_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_4=null;
+        EObject lv_initRoutine_5_0 = null;
+
+
+        // InternalFormalML.g:9098:4: ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:9098:4: ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:9098:4: ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:9099:5: {...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred412_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0)");
+        }
+        // InternalFormalML.g:9099:113: ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:9100:6: ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0);
+        // InternalFormalML.g:9103:9: ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:9103:10: {...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred412_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:9103:19: (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:9103:20: otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) )
+        {
+        otherlv_4=(Token)match(input,78,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:9107:9: ( (lv_initRoutine_5_0= rulemoeRoutine ) )
+        // InternalFormalML.g:9108:10: (lv_initRoutine_5_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:9108:10: (lv_initRoutine_5_0= rulemoeRoutine )
+        // InternalFormalML.g:9109:11: lv_initRoutine_5_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getInitRoutineMoeRoutineParserRuleCall_3_0_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_initRoutine_5_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred412_InternalFormalML
+
+    // $ANTLR start synpred413_InternalFormalML
+    public final void synpred413_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_6=null;
+        EObject lv_finalRoutine_7_0 = null;
+
+
+        // InternalFormalML.g:9132:4: ( ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:9132:4: ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:9132:4: ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:9133:5: {...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred413_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1)");
+        }
+        // InternalFormalML.g:9133:113: ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:9134:6: ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1);
+        // InternalFormalML.g:9137:9: ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:9137:10: {...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred413_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:9137:19: (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:9137:20: otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) )
+        {
+        otherlv_6=(Token)match(input,79,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:9141:9: ( (lv_finalRoutine_7_0= rulemoeRoutine ) )
+        // InternalFormalML.g:9142:10: (lv_finalRoutine_7_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:9142:10: (lv_finalRoutine_7_0= rulemoeRoutine )
+        // InternalFormalML.g:9143:11: lv_finalRoutine_7_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getFinalRoutineMoeRoutineParserRuleCall_3_1_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_finalRoutine_7_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred413_InternalFormalML
+
+    // $ANTLR start synpred414_InternalFormalML
+    public final void synpred414_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_8=null;
+        EObject lv_enableRoutine_9_0 = null;
+
+
+        // InternalFormalML.g:9166:4: ( ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:9166:4: ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:9166:4: ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:9167:5: {...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred414_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2)");
+        }
+        // InternalFormalML.g:9167:113: ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:9168:6: ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2);
+        // InternalFormalML.g:9171:9: ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:9171:10: {...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred414_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:9171:19: (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:9171:20: otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) )
+        {
+        otherlv_8=(Token)match(input,80,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:9175:9: ( (lv_enableRoutine_9_0= rulemoeRoutine ) )
+        // InternalFormalML.g:9176:10: (lv_enableRoutine_9_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:9176:10: (lv_enableRoutine_9_0= rulemoeRoutine )
+        // InternalFormalML.g:9177:11: lv_enableRoutine_9_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getEnableRoutineMoeRoutineParserRuleCall_3_2_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_enableRoutine_9_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred414_InternalFormalML
+
+    // $ANTLR start synpred415_InternalFormalML
+    public final void synpred415_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_10=null;
+        EObject lv_disableRoutine_11_0 = null;
+
+
+        // InternalFormalML.g:9200:4: ( ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:9200:4: ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:9200:4: ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:9201:5: {...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred415_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3)");
+        }
+        // InternalFormalML.g:9201:113: ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:9202:6: ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3);
+        // InternalFormalML.g:9205:9: ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:9205:10: {...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred415_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:9205:19: (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:9205:20: otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) )
+        {
+        otherlv_10=(Token)match(input,81,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:9209:9: ( (lv_disableRoutine_11_0= rulemoeRoutine ) )
+        // InternalFormalML.g:9210:10: (lv_disableRoutine_11_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:9210:10: (lv_disableRoutine_11_0= rulemoeRoutine )
+        // InternalFormalML.g:9211:11: lv_disableRoutine_11_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getDisableRoutineMoeRoutineParserRuleCall_3_3_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_disableRoutine_11_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred415_InternalFormalML
+
+    // $ANTLR start synpred416_InternalFormalML
+    public final void synpred416_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_12=null;
+        EObject lv_concurrencyRoutine_13_0 = null;
+
+
+        // InternalFormalML.g:9234:4: ( ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:9234:4: ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:9234:4: ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:9235:5: {...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred416_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4)");
+        }
+        // InternalFormalML.g:9235:113: ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:9236:6: ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4);
+        // InternalFormalML.g:9239:9: ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:9239:10: {...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred416_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:9239:19: (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:9239:20: otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) )
+        {
+        otherlv_12=(Token)match(input,82,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:9243:9: ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) )
+        // InternalFormalML.g:9244:10: (lv_concurrencyRoutine_13_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:9244:10: (lv_concurrencyRoutine_13_0= rulemoeRoutine )
+        // InternalFormalML.g:9245:11: lv_concurrencyRoutine_13_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_concurrencyRoutine_13_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred416_InternalFormalML
+
+    // $ANTLR start synpred417_InternalFormalML
+    public final void synpred417_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_14=null;
+        EObject lv_scheduleRoutine_15_0 = null;
+
+
+        // InternalFormalML.g:9268:4: ( ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:9268:4: ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:9268:4: ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:9269:5: {...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred417_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5)");
+        }
+        // InternalFormalML.g:9269:113: ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:9270:6: ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5);
+        // InternalFormalML.g:9273:9: ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:9273:10: {...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred417_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:9273:19: (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:9273:20: otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) )
+        {
+        otherlv_14=(Token)match(input,70,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:9277:9: ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) )
+        // InternalFormalML.g:9278:10: (lv_scheduleRoutine_15_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:9278:10: (lv_scheduleRoutine_15_0= rulemoeRoutine )
+        // InternalFormalML.g:9279:11: lv_scheduleRoutine_15_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_scheduleRoutine_15_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred417_InternalFormalML
+
+    // $ANTLR start synpred418_InternalFormalML
+    public final void synpred418_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_16=null;
+        EObject lv_irunRoutine_17_0 = null;
+
+
+        // InternalFormalML.g:9302:4: ( ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:9302:4: ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:9302:4: ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:9303:5: {...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred418_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6)");
+        }
+        // InternalFormalML.g:9303:113: ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:9304:6: ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6);
+        // InternalFormalML.g:9307:9: ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:9307:10: {...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred418_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:9307:19: (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:9307:20: otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) )
+        {
+        otherlv_16=(Token)match(input,83,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:9311:9: ( (lv_irunRoutine_17_0= rulemoeRoutine ) )
+        // InternalFormalML.g:9312:10: (lv_irunRoutine_17_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:9312:10: (lv_irunRoutine_17_0= rulemoeRoutine )
+        // InternalFormalML.g:9313:11: lv_irunRoutine_17_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getIrunRoutineMoeRoutineParserRuleCall_3_6_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_irunRoutine_17_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred418_InternalFormalML
+
+    // $ANTLR start synpred419_InternalFormalML
+    public final void synpred419_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_18=null;
+        EObject lv_runRoutine_19_0 = null;
+
+
+        // InternalFormalML.g:9336:4: ( ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )
+        // InternalFormalML.g:9336:4: ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:9336:4: ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) )
+        // InternalFormalML.g:9337:5: {...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred419_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7)");
+        }
+        // InternalFormalML.g:9337:113: ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) )
+        // InternalFormalML.g:9338:6: ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7);
+        // InternalFormalML.g:9341:9: ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) )
+        // InternalFormalML.g:9341:10: {...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred419_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:9341:19: (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) )
+        // InternalFormalML.g:9341:20: otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) )
+        {
+        otherlv_18=(Token)match(input,71,FollowSets000.FOLLOW_61); if (state.failed) return ;
+        // InternalFormalML.g:9345:9: ( (lv_runRoutine_19_0= rulemoeRoutine ) )
+        // InternalFormalML.g:9346:10: (lv_runRoutine_19_0= rulemoeRoutine )
+        {
+        // InternalFormalML.g:9346:10: (lv_runRoutine_19_0= rulemoeRoutine )
+        // InternalFormalML.g:9347:11: lv_runRoutine_19_0= rulemoeRoutine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getModelOfExecutionAccess().getRunRoutineMoeRoutineParserRuleCall_3_7_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_runRoutine_19_0=rulemoeRoutine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred419_InternalFormalML
+
+    // $ANTLR start synpred586_InternalFormalML
+    public final void synpred586_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_static_2_0=null;
+
+        // InternalFormalML.g:15461:4: ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) )
+        // InternalFormalML.g:15461:4: ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) )
+        {
+        // InternalFormalML.g:15461:4: ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) )
+        // InternalFormalML.g:15462:5: {...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred586_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:15462:105: ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) )
+        // InternalFormalML.g:15463:6: ({...}? => ( (lv_static_2_0= 'static' ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:15466:9: ({...}? => ( (lv_static_2_0= 'static' ) ) )
+        // InternalFormalML.g:15466:10: {...}? => ( (lv_static_2_0= 'static' ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred586_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:15466:19: ( (lv_static_2_0= 'static' ) )
+        // InternalFormalML.g:15466:20: (lv_static_2_0= 'static' )
+        {
+        // InternalFormalML.g:15466:20: (lv_static_2_0= 'static' )
+        // InternalFormalML.g:15467:10: lv_static_2_0= 'static'
+        {
+        lv_static_2_0=(Token)match(input,128,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred586_InternalFormalML
+
+    // $ANTLR start synpred587_InternalFormalML
+    public final void synpred587_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_final_3_0=null;
+
+        // InternalFormalML.g:15484:4: ( ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) )
+        // InternalFormalML.g:15484:4: ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) )
+        {
+        // InternalFormalML.g:15484:4: ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) )
+        // InternalFormalML.g:15485:5: {...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred587_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1)");
+        }
+        // InternalFormalML.g:15485:105: ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) )
+        // InternalFormalML.g:15486:6: ({...}? => ( (lv_final_3_0= 'final' ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1);
+        // InternalFormalML.g:15489:9: ({...}? => ( (lv_final_3_0= 'final' ) ) )
+        // InternalFormalML.g:15489:10: {...}? => ( (lv_final_3_0= 'final' ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred587_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:15489:19: ( (lv_final_3_0= 'final' ) )
+        // InternalFormalML.g:15489:20: (lv_final_3_0= 'final' )
+        {
+        // InternalFormalML.g:15489:20: (lv_final_3_0= 'final' )
+        // InternalFormalML.g:15490:10: lv_final_3_0= 'final'
+        {
+        lv_final_3_0=(Token)match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred587_InternalFormalML
+
+    // $ANTLR start synpred588_InternalFormalML
+    public final void synpred588_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_reference_4_0=null;
+
+        // InternalFormalML.g:15507:4: ( ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) )
+        // InternalFormalML.g:15507:4: ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) )
+        {
+        // InternalFormalML.g:15507:4: ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) )
+        // InternalFormalML.g:15508:5: {...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred588_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2)");
+        }
+        // InternalFormalML.g:15508:105: ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) )
+        // InternalFormalML.g:15509:6: ({...}? => ( (lv_reference_4_0= 'reference' ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2);
+        // InternalFormalML.g:15512:9: ({...}? => ( (lv_reference_4_0= 'reference' ) ) )
+        // InternalFormalML.g:15512:10: {...}? => ( (lv_reference_4_0= 'reference' ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred588_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:15512:19: ( (lv_reference_4_0= 'reference' ) )
+        // InternalFormalML.g:15512:20: (lv_reference_4_0= 'reference' )
+        {
+        // InternalFormalML.g:15512:20: (lv_reference_4_0= 'reference' )
+        // InternalFormalML.g:15513:10: lv_reference_4_0= 'reference'
+        {
+        lv_reference_4_0=(Token)match(input,129,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred588_InternalFormalML
+
+    // $ANTLR start synpred589_InternalFormalML
+    public final void synpred589_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_volatile_5_0=null;
+
+        // InternalFormalML.g:15530:4: ( ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) )
+        // InternalFormalML.g:15530:4: ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) )
+        {
+        // InternalFormalML.g:15530:4: ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) )
+        // InternalFormalML.g:15531:5: {...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred589_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3)");
+        }
+        // InternalFormalML.g:15531:105: ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) )
+        // InternalFormalML.g:15532:6: ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3);
+        // InternalFormalML.g:15535:9: ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) )
+        // InternalFormalML.g:15535:10: {...}? => ( (lv_volatile_5_0= 'volatile' ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred589_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:15535:19: ( (lv_volatile_5_0= 'volatile' ) )
+        // InternalFormalML.g:15535:20: (lv_volatile_5_0= 'volatile' )
+        {
+        // InternalFormalML.g:15535:20: (lv_volatile_5_0= 'volatile' )
+        // InternalFormalML.g:15536:10: lv_volatile_5_0= 'volatile'
+        {
+        lv_volatile_5_0=(Token)match(input,130,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred589_InternalFormalML
+
+    // $ANTLR start synpred590_InternalFormalML
+    public final void synpred590_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_transient_6_0=null;
+
+        // InternalFormalML.g:15553:4: ( ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )
+        // InternalFormalML.g:15553:4: ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) )
+        {
+        // InternalFormalML.g:15553:4: ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) )
+        // InternalFormalML.g:15554:5: {...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred590_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4)");
+        }
+        // InternalFormalML.g:15554:105: ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) )
+        // InternalFormalML.g:15555:6: ({...}? => ( (lv_transient_6_0= 'transient' ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4);
+        // InternalFormalML.g:15558:9: ({...}? => ( (lv_transient_6_0= 'transient' ) ) )
+        // InternalFormalML.g:15558:10: {...}? => ( (lv_transient_6_0= 'transient' ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred590_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:15558:19: ( (lv_transient_6_0= 'transient' ) )
+        // InternalFormalML.g:15558:20: (lv_transient_6_0= 'transient' )
+        {
+        // InternalFormalML.g:15558:20: (lv_transient_6_0= 'transient' )
+        // InternalFormalML.g:15559:10: lv_transient_6_0= 'transient'
+        {
+        lv_transient_6_0=(Token)match(input,131,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred590_InternalFormalML
+
+    // $ANTLR start synpred591_InternalFormalML
+    public final void synpred591_InternalFormalML_fragment() throws RecognitionException {   
+        Enumerator lv_visibility_1_0 = null;
+
+
+        // InternalFormalML.g:15622:4: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) )
+        // InternalFormalML.g:15622:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+        {
+        // InternalFormalML.g:15622:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+        // InternalFormalML.g:15623:5: {...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred591_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0)");
+        }
+        // InternalFormalML.g:15623:105: ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+        // InternalFormalML.g:15624:6: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0);
+        // InternalFormalML.g:15627:9: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+        // InternalFormalML.g:15627:10: {...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred591_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:15627:19: ( (lv_visibility_1_0= ruleVisibilityKind ) )
+        // InternalFormalML.g:15627:20: (lv_visibility_1_0= ruleVisibilityKind )
+        {
+        // InternalFormalML.g:15627:20: (lv_visibility_1_0= ruleVisibilityKind )
+        // InternalFormalML.g:15628:10: lv_visibility_1_0= ruleVisibilityKind
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getVariableAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_visibility_1_0=ruleVisibilityKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred591_InternalFormalML
+
+    // $ANTLR start synpred592_InternalFormalML
+    public final void synpred592_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_modifier_2_0 = null;
+
+
+        // InternalFormalML.g:15650:4: ( ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )
+        // InternalFormalML.g:15650:4: ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) )
+        {
+        // InternalFormalML.g:15650:4: ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) )
+        // InternalFormalML.g:15651:5: {...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred592_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1)");
+        }
+        // InternalFormalML.g:15651:105: ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) )
+        // InternalFormalML.g:15652:6: ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1);
+        // InternalFormalML.g:15655:9: ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) )
+        // InternalFormalML.g:15655:10: {...}? => ( (lv_modifier_2_0= ruleModifier ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred592_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:15655:19: ( (lv_modifier_2_0= ruleModifier ) )
+        // InternalFormalML.g:15655:20: (lv_modifier_2_0= ruleModifier )
+        {
+        // InternalFormalML.g:15655:20: (lv_modifier_2_0= ruleModifier )
+        // InternalFormalML.g:15656:10: lv_modifier_2_0= ruleModifier
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getVariableAccess().getModifierModifierParserRuleCall_0_1_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_modifier_2_0=ruleModifier();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred592_InternalFormalML
+
+    // $ANTLR start synpred607_InternalFormalML
+    public final void synpred607_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_modifier_0_0 = null;
+
+
+        // InternalFormalML.g:16112:4: ( (lv_modifier_0_0= ruleModifier ) )
+        // InternalFormalML.g:16112:4: (lv_modifier_0_0= ruleModifier )
+        {
+        // InternalFormalML.g:16112:4: (lv_modifier_0_0= ruleModifier )
+        // InternalFormalML.g:16113:5: lv_modifier_0_0= ruleModifier
+        {
+        if ( state.backtracking==0 ) {
+
+          					newCompositeNode(grammarAccess.getVariablePublicAccess().getModifierModifierParserRuleCall_0_0());
+          				
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_modifier_0_0=ruleModifier();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred607_InternalFormalML
+
+    // $ANTLR start synpred609_InternalFormalML
+    public final void synpred609_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_const_2_0=null;
+        Token lv_const_3_0=null;
+
+        // InternalFormalML.g:16137:4: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) )
+        // InternalFormalML.g:16137:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        {
+        // InternalFormalML.g:16137:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        // InternalFormalML.g:16138:5: {...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred609_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:16138:111: ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        // InternalFormalML.g:16139:6: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:16142:9: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        // InternalFormalML.g:16142:10: {...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred609_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:16142:19: ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        int alt843=2;
+        int LA843_0 = input.LA(1);
+
+        if ( (LA843_0==134) ) {
+            alt843=1;
+        }
+        else if ( (LA843_0==87) ) {
+            alt843=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 843, 0, input);
+
+            throw nvae;
+        }
+        switch (alt843) {
+            case 1 :
+                // InternalFormalML.g:16142:20: ( (lv_const_2_0= 'const' ) )
+                {
+                // InternalFormalML.g:16142:20: ( (lv_const_2_0= 'const' ) )
+                // InternalFormalML.g:16143:10: (lv_const_2_0= 'const' )
+                {
+                // InternalFormalML.g:16143:10: (lv_const_2_0= 'const' )
+                // InternalFormalML.g:16144:11: lv_const_2_0= 'const'
+                {
+                lv_const_2_0=(Token)match(input,134,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:16157:9: ( (lv_const_3_0= 'final' ) )
+                {
+                // InternalFormalML.g:16157:9: ( (lv_const_3_0= 'final' ) )
+                // InternalFormalML.g:16158:10: (lv_const_3_0= 'final' )
+                {
+                // InternalFormalML.g:16158:10: (lv_const_3_0= 'final' )
+                // InternalFormalML.g:16159:11: lv_const_3_0= 'final'
+                {
+                lv_const_3_0=(Token)match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred609_InternalFormalML
+
+    // $ANTLR start synpred610_InternalFormalML
+    public final void synpred610_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_macro_4_0=null;
+
+        // InternalFormalML.g:16177:4: ( ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )
+        // InternalFormalML.g:16177:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        {
+        // InternalFormalML.g:16177:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        // InternalFormalML.g:16178:5: {...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred610_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1)");
+        }
+        // InternalFormalML.g:16178:111: ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        // InternalFormalML.g:16179:6: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1);
+        // InternalFormalML.g:16182:9: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        // InternalFormalML.g:16182:10: {...}? => ( (lv_macro_4_0= 'macro' ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred610_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:16182:19: ( (lv_macro_4_0= 'macro' ) )
+        // InternalFormalML.g:16182:20: (lv_macro_4_0= 'macro' )
+        {
+        // InternalFormalML.g:16182:20: (lv_macro_4_0= 'macro' )
+        // InternalFormalML.g:16183:10: lv_macro_4_0= 'macro'
+        {
+        lv_macro_4_0=(Token)match(input,93,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred610_InternalFormalML
+
+    // $ANTLR start synpred611_InternalFormalML
+    public final void synpred611_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_const_2_0=null;
+        Token lv_const_3_0=null;
+        Token lv_macro_4_0=null;
+
+        // InternalFormalML.g:16131:4: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )
+        // InternalFormalML.g:16131:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+        {
+        // InternalFormalML.g:16131:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+        // InternalFormalML.g:16132:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+        {
+        getUnorderedGroupHelper().enter(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1());
+        // InternalFormalML.g:16135:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+        // InternalFormalML.g:16136:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+        {
+        // InternalFormalML.g:16136:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+        loop845:
+        do {
+            int alt845=3;
+            int LA845_0 = input.LA(1);
+
+            if ( LA845_0 == 134 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt845=1;
+            }
+            else if ( LA845_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+                alt845=1;
+            }
+            else if ( LA845_0 == 93 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+                alt845=2;
+            }
+
+
+            switch (alt845) {
+        	case 1 :
+        	    // InternalFormalML.g:16137:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        	    {
+        	    // InternalFormalML.g:16137:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        	    // InternalFormalML.g:16138:5: {...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        	    {
+        	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred611_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0)");
+        	    }
+        	    // InternalFormalML.g:16138:111: ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        	    // InternalFormalML.g:16139:6: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        	    {
+        	    getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 0);
+        	    // InternalFormalML.g:16142:9: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        	    // InternalFormalML.g:16142:10: {...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        	    {
+        	    if ( !((true)) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred611_InternalFormalML", "true");
+        	    }
+        	    // InternalFormalML.g:16142:19: ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        	    int alt844=2;
+        	    int LA844_0 = input.LA(1);
+
+        	    if ( (LA844_0==134) ) {
+        	        alt844=1;
+        	    }
+        	    else if ( (LA844_0==87) ) {
+        	        alt844=2;
+        	    }
+        	    else {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        NoViableAltException nvae =
+        	            new NoViableAltException("", 844, 0, input);
+
+        	        throw nvae;
+        	    }
+        	    switch (alt844) {
+        	        case 1 :
+        	            // InternalFormalML.g:16142:20: ( (lv_const_2_0= 'const' ) )
+        	            {
+        	            // InternalFormalML.g:16142:20: ( (lv_const_2_0= 'const' ) )
+        	            // InternalFormalML.g:16143:10: (lv_const_2_0= 'const' )
+        	            {
+        	            // InternalFormalML.g:16143:10: (lv_const_2_0= 'const' )
+        	            // InternalFormalML.g:16144:11: lv_const_2_0= 'const'
+        	            {
+        	            lv_const_2_0=(Token)match(input,134,FollowSets000.FOLLOW_250); if (state.failed) return ;
+
+        	            }
+
+
+        	            }
+
+
+        	            }
+        	            break;
+        	        case 2 :
+        	            // InternalFormalML.g:16157:9: ( (lv_const_3_0= 'final' ) )
+        	            {
+        	            // InternalFormalML.g:16157:9: ( (lv_const_3_0= 'final' ) )
+        	            // InternalFormalML.g:16158:10: (lv_const_3_0= 'final' )
+        	            {
+        	            // InternalFormalML.g:16158:10: (lv_const_3_0= 'final' )
+        	            // InternalFormalML.g:16159:11: lv_const_3_0= 'final'
+        	            {
+        	            lv_const_3_0=(Token)match(input,87,FollowSets000.FOLLOW_250); if (state.failed) return ;
+
+        	            }
+
+
+        	            }
+
+
+        	            }
+        	            break;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+        	case 2 :
+        	    // InternalFormalML.g:16177:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        	    {
+        	    // InternalFormalML.g:16177:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        	    // InternalFormalML.g:16178:5: {...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        	    {
+        	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred611_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1)");
+        	    }
+        	    // InternalFormalML.g:16178:111: ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        	    // InternalFormalML.g:16179:6: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        	    {
+        	    getUnorderedGroupHelper().select(grammarAccess.getVariablePublicAccess().getUnorderedGroup_1(), 1);
+        	    // InternalFormalML.g:16182:9: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        	    // InternalFormalML.g:16182:10: {...}? => ( (lv_macro_4_0= 'macro' ) )
+        	    {
+        	    if ( !((true)) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred611_InternalFormalML", "true");
+        	    }
+        	    // InternalFormalML.g:16182:19: ( (lv_macro_4_0= 'macro' ) )
+        	    // InternalFormalML.g:16182:20: (lv_macro_4_0= 'macro' )
+        	    {
+        	    // InternalFormalML.g:16182:20: (lv_macro_4_0= 'macro' )
+        	    // InternalFormalML.g:16183:10: lv_macro_4_0= 'macro'
+        	    {
+        	    lv_macro_4_0=(Token)match(input,93,FollowSets000.FOLLOW_250); if (state.failed) return ;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+
+        	default :
+        	    break loop845;
+            }
+        } while (true);
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred611_InternalFormalML
+
+    // $ANTLR start synpred615_InternalFormalML
+    public final void synpred615_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_modifier_0_0 = null;
+
+
+        // InternalFormalML.g:16377:4: ( (lv_modifier_0_0= ruleModifier ) )
+        // InternalFormalML.g:16377:4: (lv_modifier_0_0= ruleModifier )
+        {
+        // InternalFormalML.g:16377:4: (lv_modifier_0_0= ruleModifier )
+        // InternalFormalML.g:16378:5: lv_modifier_0_0= ruleModifier
+        {
+        if ( state.backtracking==0 ) {
+
+          					newCompositeNode(grammarAccess.getVariableProtectedAccess().getModifierModifierParserRuleCall_0_0());
+          				
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_modifier_0_0=ruleModifier();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred615_InternalFormalML
+
+    // $ANTLR start synpred617_InternalFormalML
+    public final void synpred617_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_const_2_0=null;
+        Token lv_const_3_0=null;
+
+        // InternalFormalML.g:16402:4: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) )
+        // InternalFormalML.g:16402:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        {
+        // InternalFormalML.g:16402:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        // InternalFormalML.g:16403:5: {...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred617_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:16403:114: ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        // InternalFormalML.g:16404:6: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:16407:9: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        // InternalFormalML.g:16407:10: {...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred617_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:16407:19: ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        int alt846=2;
+        int LA846_0 = input.LA(1);
+
+        if ( (LA846_0==134) ) {
+            alt846=1;
+        }
+        else if ( (LA846_0==87) ) {
+            alt846=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 846, 0, input);
+
+            throw nvae;
+        }
+        switch (alt846) {
+            case 1 :
+                // InternalFormalML.g:16407:20: ( (lv_const_2_0= 'const' ) )
+                {
+                // InternalFormalML.g:16407:20: ( (lv_const_2_0= 'const' ) )
+                // InternalFormalML.g:16408:10: (lv_const_2_0= 'const' )
+                {
+                // InternalFormalML.g:16408:10: (lv_const_2_0= 'const' )
+                // InternalFormalML.g:16409:11: lv_const_2_0= 'const'
+                {
+                lv_const_2_0=(Token)match(input,134,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:16422:9: ( (lv_const_3_0= 'final' ) )
+                {
+                // InternalFormalML.g:16422:9: ( (lv_const_3_0= 'final' ) )
+                // InternalFormalML.g:16423:10: (lv_const_3_0= 'final' )
+                {
+                // InternalFormalML.g:16423:10: (lv_const_3_0= 'final' )
+                // InternalFormalML.g:16424:11: lv_const_3_0= 'final'
+                {
+                lv_const_3_0=(Token)match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred617_InternalFormalML
+
+    // $ANTLR start synpred618_InternalFormalML
+    public final void synpred618_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_macro_4_0=null;
+
+        // InternalFormalML.g:16442:4: ( ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )
+        // InternalFormalML.g:16442:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        {
+        // InternalFormalML.g:16442:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        // InternalFormalML.g:16443:5: {...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred618_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1)");
+        }
+        // InternalFormalML.g:16443:114: ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        // InternalFormalML.g:16444:6: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1);
+        // InternalFormalML.g:16447:9: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        // InternalFormalML.g:16447:10: {...}? => ( (lv_macro_4_0= 'macro' ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred618_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:16447:19: ( (lv_macro_4_0= 'macro' ) )
+        // InternalFormalML.g:16447:20: (lv_macro_4_0= 'macro' )
+        {
+        // InternalFormalML.g:16447:20: (lv_macro_4_0= 'macro' )
+        // InternalFormalML.g:16448:10: lv_macro_4_0= 'macro'
+        {
+        lv_macro_4_0=(Token)match(input,93,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred618_InternalFormalML
+
+    // $ANTLR start synpred619_InternalFormalML
+    public final void synpred619_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_const_2_0=null;
+        Token lv_const_3_0=null;
+        Token lv_macro_4_0=null;
+
+        // InternalFormalML.g:16396:4: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )
+        // InternalFormalML.g:16396:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+        {
+        // InternalFormalML.g:16396:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+        // InternalFormalML.g:16397:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+        {
+        getUnorderedGroupHelper().enter(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1());
+        // InternalFormalML.g:16400:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+        // InternalFormalML.g:16401:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+        {
+        // InternalFormalML.g:16401:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+        loop848:
+        do {
+            int alt848=3;
+            int LA848_0 = input.LA(1);
+
+            if ( LA848_0 == 134 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt848=1;
+            }
+            else if ( LA848_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+                alt848=1;
+            }
+            else if ( LA848_0 == 93 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+                alt848=2;
+            }
+
+
+            switch (alt848) {
+        	case 1 :
+        	    // InternalFormalML.g:16402:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        	    {
+        	    // InternalFormalML.g:16402:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        	    // InternalFormalML.g:16403:5: {...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        	    {
+        	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred619_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0)");
+        	    }
+        	    // InternalFormalML.g:16403:114: ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        	    // InternalFormalML.g:16404:6: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        	    {
+        	    getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 0);
+        	    // InternalFormalML.g:16407:9: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        	    // InternalFormalML.g:16407:10: {...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        	    {
+        	    if ( !((true)) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred619_InternalFormalML", "true");
+        	    }
+        	    // InternalFormalML.g:16407:19: ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        	    int alt847=2;
+        	    int LA847_0 = input.LA(1);
+
+        	    if ( (LA847_0==134) ) {
+        	        alt847=1;
+        	    }
+        	    else if ( (LA847_0==87) ) {
+        	        alt847=2;
+        	    }
+        	    else {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        NoViableAltException nvae =
+        	            new NoViableAltException("", 847, 0, input);
+
+        	        throw nvae;
+        	    }
+        	    switch (alt847) {
+        	        case 1 :
+        	            // InternalFormalML.g:16407:20: ( (lv_const_2_0= 'const' ) )
+        	            {
+        	            // InternalFormalML.g:16407:20: ( (lv_const_2_0= 'const' ) )
+        	            // InternalFormalML.g:16408:10: (lv_const_2_0= 'const' )
+        	            {
+        	            // InternalFormalML.g:16408:10: (lv_const_2_0= 'const' )
+        	            // InternalFormalML.g:16409:11: lv_const_2_0= 'const'
+        	            {
+        	            lv_const_2_0=(Token)match(input,134,FollowSets000.FOLLOW_250); if (state.failed) return ;
+
+        	            }
+
+
+        	            }
+
+
+        	            }
+        	            break;
+        	        case 2 :
+        	            // InternalFormalML.g:16422:9: ( (lv_const_3_0= 'final' ) )
+        	            {
+        	            // InternalFormalML.g:16422:9: ( (lv_const_3_0= 'final' ) )
+        	            // InternalFormalML.g:16423:10: (lv_const_3_0= 'final' )
+        	            {
+        	            // InternalFormalML.g:16423:10: (lv_const_3_0= 'final' )
+        	            // InternalFormalML.g:16424:11: lv_const_3_0= 'final'
+        	            {
+        	            lv_const_3_0=(Token)match(input,87,FollowSets000.FOLLOW_250); if (state.failed) return ;
+
+        	            }
+
+
+        	            }
+
+
+        	            }
+        	            break;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+        	case 2 :
+        	    // InternalFormalML.g:16442:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        	    {
+        	    // InternalFormalML.g:16442:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        	    // InternalFormalML.g:16443:5: {...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        	    {
+        	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred619_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1)");
+        	    }
+        	    // InternalFormalML.g:16443:114: ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        	    // InternalFormalML.g:16444:6: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        	    {
+        	    getUnorderedGroupHelper().select(grammarAccess.getVariableProtectedAccess().getUnorderedGroup_1(), 1);
+        	    // InternalFormalML.g:16447:9: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        	    // InternalFormalML.g:16447:10: {...}? => ( (lv_macro_4_0= 'macro' ) )
+        	    {
+        	    if ( !((true)) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred619_InternalFormalML", "true");
+        	    }
+        	    // InternalFormalML.g:16447:19: ( (lv_macro_4_0= 'macro' ) )
+        	    // InternalFormalML.g:16447:20: (lv_macro_4_0= 'macro' )
+        	    {
+        	    // InternalFormalML.g:16447:20: (lv_macro_4_0= 'macro' )
+        	    // InternalFormalML.g:16448:10: lv_macro_4_0= 'macro'
+        	    {
+        	    lv_macro_4_0=(Token)match(input,93,FollowSets000.FOLLOW_250); if (state.failed) return ;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+
+        	default :
+        	    break loop848;
+            }
+        } while (true);
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred619_InternalFormalML
+
+    // $ANTLR start synpred623_InternalFormalML
+    public final void synpred623_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_modifier_0_0 = null;
+
+
+        // InternalFormalML.g:16642:4: ( (lv_modifier_0_0= ruleModifier ) )
+        // InternalFormalML.g:16642:4: (lv_modifier_0_0= ruleModifier )
+        {
+        // InternalFormalML.g:16642:4: (lv_modifier_0_0= ruleModifier )
+        // InternalFormalML.g:16643:5: lv_modifier_0_0= ruleModifier
+        {
+        if ( state.backtracking==0 ) {
+
+          					newCompositeNode(grammarAccess.getVariablePrivateAccess().getModifierModifierParserRuleCall_0_0());
+          				
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_modifier_0_0=ruleModifier();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred623_InternalFormalML
+
+    // $ANTLR start synpred625_InternalFormalML
+    public final void synpred625_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_const_2_0=null;
+        Token lv_const_3_0=null;
+
+        // InternalFormalML.g:16667:4: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) )
+        // InternalFormalML.g:16667:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        {
+        // InternalFormalML.g:16667:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        // InternalFormalML.g:16668:5: {...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred625_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0)");
+        }
+        // InternalFormalML.g:16668:112: ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        // InternalFormalML.g:16669:6: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0);
+        // InternalFormalML.g:16672:9: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        // InternalFormalML.g:16672:10: {...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred625_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:16672:19: ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        int alt849=2;
+        int LA849_0 = input.LA(1);
+
+        if ( (LA849_0==134) ) {
+            alt849=1;
+        }
+        else if ( (LA849_0==87) ) {
+            alt849=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 849, 0, input);
+
+            throw nvae;
+        }
+        switch (alt849) {
+            case 1 :
+                // InternalFormalML.g:16672:20: ( (lv_const_2_0= 'const' ) )
+                {
+                // InternalFormalML.g:16672:20: ( (lv_const_2_0= 'const' ) )
+                // InternalFormalML.g:16673:10: (lv_const_2_0= 'const' )
+                {
+                // InternalFormalML.g:16673:10: (lv_const_2_0= 'const' )
+                // InternalFormalML.g:16674:11: lv_const_2_0= 'const'
+                {
+                lv_const_2_0=(Token)match(input,134,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:16687:9: ( (lv_const_3_0= 'final' ) )
+                {
+                // InternalFormalML.g:16687:9: ( (lv_const_3_0= 'final' ) )
+                // InternalFormalML.g:16688:10: (lv_const_3_0= 'final' )
+                {
+                // InternalFormalML.g:16688:10: (lv_const_3_0= 'final' )
+                // InternalFormalML.g:16689:11: lv_const_3_0= 'final'
+                {
+                lv_const_3_0=(Token)match(input,87,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred625_InternalFormalML
+
+    // $ANTLR start synpred626_InternalFormalML
+    public final void synpred626_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_macro_4_0=null;
+
+        // InternalFormalML.g:16707:4: ( ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )
+        // InternalFormalML.g:16707:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        {
+        // InternalFormalML.g:16707:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        // InternalFormalML.g:16708:5: {...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred626_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1)");
+        }
+        // InternalFormalML.g:16708:112: ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        // InternalFormalML.g:16709:6: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1);
+        // InternalFormalML.g:16712:9: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        // InternalFormalML.g:16712:10: {...}? => ( (lv_macro_4_0= 'macro' ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred626_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:16712:19: ( (lv_macro_4_0= 'macro' ) )
+        // InternalFormalML.g:16712:20: (lv_macro_4_0= 'macro' )
+        {
+        // InternalFormalML.g:16712:20: (lv_macro_4_0= 'macro' )
+        // InternalFormalML.g:16713:10: lv_macro_4_0= 'macro'
+        {
+        lv_macro_4_0=(Token)match(input,93,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred626_InternalFormalML
+
+    // $ANTLR start synpred627_InternalFormalML
+    public final void synpred627_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_const_2_0=null;
+        Token lv_const_3_0=null;
+        Token lv_macro_4_0=null;
+
+        // InternalFormalML.g:16661:4: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) ) )
+        // InternalFormalML.g:16661:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+        {
+        // InternalFormalML.g:16661:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* ) )
+        // InternalFormalML.g:16662:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+        {
+        getUnorderedGroupHelper().enter(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1());
+        // InternalFormalML.g:16665:5: ( ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )* )
+        // InternalFormalML.g:16666:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+        {
+        // InternalFormalML.g:16666:6: ( ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) ) )*
+        loop851:
+        do {
+            int alt851=3;
+            int LA851_0 = input.LA(1);
+
+            if ( LA851_0 == 134 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt851=1;
+            }
+            else if ( LA851_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+                alt851=1;
+            }
+            else if ( LA851_0 == 93 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+                alt851=2;
+            }
+
+
+            switch (alt851) {
+        	case 1 :
+        	    // InternalFormalML.g:16667:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        	    {
+        	    // InternalFormalML.g:16667:4: ({...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) ) )
+        	    // InternalFormalML.g:16668:5: {...}? => ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        	    {
+        	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred627_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0)");
+        	    }
+        	    // InternalFormalML.g:16668:112: ( ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) ) )
+        	    // InternalFormalML.g:16669:6: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        	    {
+        	    getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 0);
+        	    // InternalFormalML.g:16672:9: ({...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) ) )
+        	    // InternalFormalML.g:16672:10: {...}? => ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        	    {
+        	    if ( !((true)) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred627_InternalFormalML", "true");
+        	    }
+        	    // InternalFormalML.g:16672:19: ( ( (lv_const_2_0= 'const' ) ) | ( (lv_const_3_0= 'final' ) ) )
+        	    int alt850=2;
+        	    int LA850_0 = input.LA(1);
+
+        	    if ( (LA850_0==134) ) {
+        	        alt850=1;
+        	    }
+        	    else if ( (LA850_0==87) ) {
+        	        alt850=2;
+        	    }
+        	    else {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        NoViableAltException nvae =
+        	            new NoViableAltException("", 850, 0, input);
+
+        	        throw nvae;
+        	    }
+        	    switch (alt850) {
+        	        case 1 :
+        	            // InternalFormalML.g:16672:20: ( (lv_const_2_0= 'const' ) )
+        	            {
+        	            // InternalFormalML.g:16672:20: ( (lv_const_2_0= 'const' ) )
+        	            // InternalFormalML.g:16673:10: (lv_const_2_0= 'const' )
+        	            {
+        	            // InternalFormalML.g:16673:10: (lv_const_2_0= 'const' )
+        	            // InternalFormalML.g:16674:11: lv_const_2_0= 'const'
+        	            {
+        	            lv_const_2_0=(Token)match(input,134,FollowSets000.FOLLOW_250); if (state.failed) return ;
+
+        	            }
+
+
+        	            }
+
+
+        	            }
+        	            break;
+        	        case 2 :
+        	            // InternalFormalML.g:16687:9: ( (lv_const_3_0= 'final' ) )
+        	            {
+        	            // InternalFormalML.g:16687:9: ( (lv_const_3_0= 'final' ) )
+        	            // InternalFormalML.g:16688:10: (lv_const_3_0= 'final' )
+        	            {
+        	            // InternalFormalML.g:16688:10: (lv_const_3_0= 'final' )
+        	            // InternalFormalML.g:16689:11: lv_const_3_0= 'final'
+        	            {
+        	            lv_const_3_0=(Token)match(input,87,FollowSets000.FOLLOW_250); if (state.failed) return ;
+
+        	            }
+
+
+        	            }
+
+
+        	            }
+        	            break;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+        	case 2 :
+        	    // InternalFormalML.g:16707:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        	    {
+        	    // InternalFormalML.g:16707:4: ({...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) ) )
+        	    // InternalFormalML.g:16708:5: {...}? => ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        	    {
+        	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred627_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1)");
+        	    }
+        	    // InternalFormalML.g:16708:112: ( ({...}? => ( (lv_macro_4_0= 'macro' ) ) ) )
+        	    // InternalFormalML.g:16709:6: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        	    {
+        	    getUnorderedGroupHelper().select(grammarAccess.getVariablePrivateAccess().getUnorderedGroup_1(), 1);
+        	    // InternalFormalML.g:16712:9: ({...}? => ( (lv_macro_4_0= 'macro' ) ) )
+        	    // InternalFormalML.g:16712:10: {...}? => ( (lv_macro_4_0= 'macro' ) )
+        	    {
+        	    if ( !((true)) ) {
+        	        if (state.backtracking>0) {state.failed=true; return ;}
+        	        throw new FailedPredicateException(input, "synpred627_InternalFormalML", "true");
+        	    }
+        	    // InternalFormalML.g:16712:19: ( (lv_macro_4_0= 'macro' ) )
+        	    // InternalFormalML.g:16712:20: (lv_macro_4_0= 'macro' )
+        	    {
+        	    // InternalFormalML.g:16712:20: (lv_macro_4_0= 'macro' )
+        	    // InternalFormalML.g:16713:10: lv_macro_4_0= 'macro'
+        	    {
+        	    lv_macro_4_0=(Token)match(input,93,FollowSets000.FOLLOW_250); if (state.failed) return ;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+
+        	default :
+        	    break loop851;
+            }
+        } while (true);
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred627_InternalFormalML
+
+    // $ANTLR start synpred649_InternalFormalML
+    public final void synpred649_InternalFormalML_fragment() throws RecognitionException {   
+        Enumerator lv_visibility_1_0 = null;
+
+
+        // InternalFormalML.g:17871:4: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) )
+        // InternalFormalML.g:17871:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+        {
+        // InternalFormalML.g:17871:4: ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) )
+        // InternalFormalML.g:17872:5: {...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred649_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0)");
+        }
+        // InternalFormalML.g:17872:103: ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) )
+        // InternalFormalML.g:17873:6: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0);
+        // InternalFormalML.g:17876:9: ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) )
+        // InternalFormalML.g:17876:10: {...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred649_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:17876:19: ( (lv_visibility_1_0= ruleVisibilityKind ) )
+        // InternalFormalML.g:17876:20: (lv_visibility_1_0= ruleVisibilityKind )
+        {
+        // InternalFormalML.g:17876:20: (lv_visibility_1_0= ruleVisibilityKind )
+        // InternalFormalML.g:17877:10: lv_visibility_1_0= ruleVisibilityKind
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getBufferAccess().getVisibilityVisibilityKindEnumRuleCall_0_0_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_visibility_1_0=ruleVisibilityKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred649_InternalFormalML
+
+    // $ANTLR start synpred650_InternalFormalML
+    public final void synpred650_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_modifier_2_0 = null;
+
+
+        // InternalFormalML.g:17899:4: ( ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )
+        // InternalFormalML.g:17899:4: ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) )
+        {
+        // InternalFormalML.g:17899:4: ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) )
+        // InternalFormalML.g:17900:5: {...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred650_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1)");
+        }
+        // InternalFormalML.g:17900:103: ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) )
+        // InternalFormalML.g:17901:6: ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1);
+        // InternalFormalML.g:17904:9: ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) )
+        // InternalFormalML.g:17904:10: {...}? => ( (lv_modifier_2_0= ruleModifier ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred650_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:17904:19: ( (lv_modifier_2_0= ruleModifier ) )
+        // InternalFormalML.g:17904:20: (lv_modifier_2_0= ruleModifier )
+        {
+        // InternalFormalML.g:17904:20: (lv_modifier_2_0= ruleModifier )
+        // InternalFormalML.g:17905:10: lv_modifier_2_0= ruleModifier
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getBufferAccess().getModifierModifierParserRuleCall_0_1_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_modifier_2_0=ruleModifier();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred650_InternalFormalML
+
+    // $ANTLR start synpred652_InternalFormalML
+    public final void synpred652_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_modifier_0_0 = null;
+
+
+        // InternalFormalML.g:18022:4: ( (lv_modifier_0_0= ruleModifier ) )
+        // InternalFormalML.g:18022:4: (lv_modifier_0_0= ruleModifier )
+        {
+        // InternalFormalML.g:18022:4: (lv_modifier_0_0= ruleModifier )
+        // InternalFormalML.g:18023:5: lv_modifier_0_0= ruleModifier
+        {
+        if ( state.backtracking==0 ) {
+
+          					newCompositeNode(grammarAccess.getBufferPublicAccess().getModifierModifierParserRuleCall_0_0());
+          				
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_modifier_0_0=ruleModifier();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred652_InternalFormalML
+
+    // $ANTLR start synpred654_InternalFormalML
+    public final void synpred654_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_modifier_0_0 = null;
+
+
+        // InternalFormalML.g:18140:4: ( (lv_modifier_0_0= ruleModifier ) )
+        // InternalFormalML.g:18140:4: (lv_modifier_0_0= ruleModifier )
+        {
+        // InternalFormalML.g:18140:4: (lv_modifier_0_0= ruleModifier )
+        // InternalFormalML.g:18141:5: lv_modifier_0_0= ruleModifier
+        {
+        if ( state.backtracking==0 ) {
+
+          					newCompositeNode(grammarAccess.getBufferProtectedAccess().getModifierModifierParserRuleCall_0_0());
+          				
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_modifier_0_0=ruleModifier();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred654_InternalFormalML
+
+    // $ANTLR start synpred656_InternalFormalML
+    public final void synpred656_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_modifier_0_0 = null;
+
+
+        // InternalFormalML.g:18258:4: ( (lv_modifier_0_0= ruleModifier ) )
+        // InternalFormalML.g:18258:4: (lv_modifier_0_0= ruleModifier )
+        {
+        // InternalFormalML.g:18258:4: (lv_modifier_0_0= ruleModifier )
+        // InternalFormalML.g:18259:5: lv_modifier_0_0= ruleModifier
+        {
+        if ( state.backtracking==0 ) {
+
+          					newCompositeNode(grammarAccess.getBufferPrivateAccess().getModifierModifierParserRuleCall_0_0());
+          				
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_modifier_0_0=ruleModifier();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred656_InternalFormalML
+
+    // $ANTLR start synpred714_InternalFormalML
+    public final void synpred714_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_behavior_15_0 = null;
+
+
+        // InternalFormalML.g:20301:6: ( ( (lv_behavior_15_0= ruleTransitionBehavior ) ) )
+        // InternalFormalML.g:20301:6: ( (lv_behavior_15_0= ruleTransitionBehavior ) )
+        {
+        // InternalFormalML.g:20301:6: ( (lv_behavior_15_0= ruleTransitionBehavior ) )
+        // InternalFormalML.g:20302:7: (lv_behavior_15_0= ruleTransitionBehavior )
+        {
+        // InternalFormalML.g:20302:7: (lv_behavior_15_0= ruleTransitionBehavior )
+        // InternalFormalML.g:20303:8: lv_behavior_15_0= ruleTransitionBehavior
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_behavior_15_0=ruleTransitionBehavior();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred714_InternalFormalML
+
+    // $ANTLR start synpred725_InternalFormalML
+    public final void synpred725_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_behavior_31_0 = null;
+
+
+        // InternalFormalML.g:20490:8: ( ( (lv_behavior_31_0= ruleTransitionBehavior ) ) )
+        // InternalFormalML.g:20490:8: ( (lv_behavior_31_0= ruleTransitionBehavior ) )
+        {
+        // InternalFormalML.g:20490:8: ( (lv_behavior_31_0= ruleTransitionBehavior ) )
+        // InternalFormalML.g:20491:9: (lv_behavior_31_0= ruleTransitionBehavior )
+        {
+        // InternalFormalML.g:20491:9: (lv_behavior_31_0= ruleTransitionBehavior )
+        // InternalFormalML.g:20492:10: lv_behavior_31_0= ruleTransitionBehavior
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getTransitionAccess().getBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_behavior_31_0=ruleTransitionBehavior();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred725_InternalFormalML
+
+    // $ANTLR start synpred746_InternalFormalML
+    public final void synpred746_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        EObject lv_condition_6_0 = null;
+
+
+        // InternalFormalML.g:21108:7: ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) )
+        // InternalFormalML.g:21108:7: (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' )
+        {
+        // InternalFormalML.g:21108:7: (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' )
+        // InternalFormalML.g:21109:8: otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}'
+        {
+        otherlv_5=(Token)match(input,22,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:21113:8: ( (lv_condition_6_0= ruleExpression ) )
+        // InternalFormalML.g:21114:9: (lv_condition_6_0= ruleExpression )
+        {
+        // InternalFormalML.g:21114:9: (lv_condition_6_0= ruleExpression )
+        // InternalFormalML.g:21115:10: lv_condition_6_0= ruleExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          										newCompositeNode(grammarAccess.getTransitionTimedGuardAccess().getConditionExpressionParserRuleCall_1_1_0_1_0_1_0());
+          									
+        }
+        pushFollow(FollowSets000.FOLLOW_33);
+        lv_condition_6_0=ruleExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_7=(Token)match(input,23,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred746_InternalFormalML
+
+    // $ANTLR start synpred749_InternalFormalML
+    public final void synpred749_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_ExpressionStatement_0 = null;
+
+
+        // InternalFormalML.g:21253:3: (this_ExpressionStatement_0= ruleExpressionStatement )
+        // InternalFormalML.g:21253:3: this_ExpressionStatement_0= ruleExpressionStatement
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_ExpressionStatement_0=ruleExpressionStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred749_InternalFormalML
+
+    // $ANTLR start synpred754_InternalFormalML
+    public final void synpred754_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_ForStatement_5 = null;
+
+
+        // InternalFormalML.g:21313:3: (this_ForStatement_5= ruleForStatement )
+        // InternalFormalML.g:21313:3: this_ForStatement_5= ruleForStatement
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_ForStatement_5=ruleForStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred754_InternalFormalML
+
+    // $ANTLR start synpred755_InternalFormalML
+    public final void synpred755_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_ForEachStatement_6 = null;
+
+
+        // InternalFormalML.g:21325:3: (this_ForEachStatement_6= ruleForEachStatement )
+        // InternalFormalML.g:21325:3: this_ForEachStatement_6= ruleForEachStatement
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_ForEachStatement_6=ruleForEachStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred755_InternalFormalML
+
+    // $ANTLR start synpred759_InternalFormalML
+    public final void synpred759_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_ExpressionStatement_1 = null;
+
+
+        // InternalFormalML.g:21403:3: (this_ExpressionStatement_1= ruleExpressionStatement )
+        // InternalFormalML.g:21403:3: this_ExpressionStatement_1= ruleExpressionStatement
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_ExpressionStatement_1=ruleExpressionStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred759_InternalFormalML
+
+    // $ANTLR start synpred769_InternalFormalML
+    public final void synpred769_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_ForStatement_11 = null;
+
+
+        // InternalFormalML.g:21523:3: (this_ForStatement_11= ruleForStatement )
+        // InternalFormalML.g:21523:3: this_ForStatement_11= ruleForStatement
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_ForStatement_11=ruleForStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred769_InternalFormalML
+
+    // $ANTLR start synpred770_InternalFormalML
+    public final void synpred770_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_ForEachStatement_12 = null;
+
+
+        // InternalFormalML.g:21535:3: (this_ForEachStatement_12= ruleForEachStatement )
+        // InternalFormalML.g:21535:3: this_ForEachStatement_12= ruleForEachStatement
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_ForEachStatement_12=ruleForEachStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred770_InternalFormalML
+
+    // $ANTLR start synpred790_InternalFormalML
+    public final void synpred790_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_1=null;
+        EObject lv_expression_0_0 = null;
+
+
+        // InternalFormalML.g:21790:3: ( ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' ) )
+        // InternalFormalML.g:21790:3: ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' )
+        {
+        // InternalFormalML.g:21790:3: ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' )
+        // InternalFormalML.g:21791:4: ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';'
+        {
+        // InternalFormalML.g:21791:4: ( (lv_expression_0_0= ruleAssignmentExpression ) )
+        // InternalFormalML.g:21792:5: (lv_expression_0_0= ruleAssignmentExpression )
+        {
+        // InternalFormalML.g:21792:5: (lv_expression_0_0= ruleAssignmentExpression )
+        // InternalFormalML.g:21793:6: lv_expression_0_0= ruleAssignmentExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getExpressionStatementAccess().getExpressionAssignmentExpressionParserRuleCall_0_0_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_14);
+        lv_expression_0_0=ruleAssignmentExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_1=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred790_InternalFormalML
+
+    // $ANTLR start synpred795_InternalFormalML
+    public final void synpred795_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_8=null;
+        EObject lv_target_9_0 = null;
+
+
+        // InternalFormalML.g:22217:4: ( ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) )
+        // InternalFormalML.g:22217:4: ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:22217:4: ({...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) )
+        // InternalFormalML.g:22218:5: {...}? => ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred795_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0)");
+        }
+        // InternalFormalML.g:22218:114: ( ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) )
+        // InternalFormalML.g:22219:6: ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 0);
+        // InternalFormalML.g:22222:9: ({...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) )
+        // InternalFormalML.g:22222:10: {...}? => (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred795_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:22222:19: (otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) ) )
+        // InternalFormalML.g:22222:20: otherlv_8= '<--' ( (lv_target_9_0= ruleExpressionAsMachine ) )
+        {
+        otherlv_8=(Token)match(input,172,FollowSets000.FOLLOW_122); if (state.failed) return ;
+        // InternalFormalML.g:22226:9: ( (lv_target_9_0= ruleExpressionAsMachine ) )
+        // InternalFormalML.g:22227:10: (lv_target_9_0= ruleExpressionAsMachine )
+        {
+        // InternalFormalML.g:22227:10: (lv_target_9_0= ruleExpressionAsMachine )
+        // InternalFormalML.g:22228:11: lv_target_9_0= ruleExpressionAsMachine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getInputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_target_9_0=ruleExpressionAsMachine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred795_InternalFormalML
+
+    // $ANTLR start synpred797_InternalFormalML
+    public final void synpred797_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+
+        // InternalFormalML.g:22251:4: ( ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )
+        // InternalFormalML.g:22251:4: ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) )
+        {
+        // InternalFormalML.g:22251:4: ({...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) )
+        // InternalFormalML.g:22252:5: {...}? => ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred797_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1)");
+        }
+        // InternalFormalML.g:22252:114: ( ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) )
+        // InternalFormalML.g:22253:6: ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getInputComStatementAccess().getUnorderedGroup_3(), 1);
+        // InternalFormalML.g:22256:9: ({...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) )
+        // InternalFormalML.g:22256:10: {...}? => ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred797_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:22256:19: ( (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) )
+        // InternalFormalML.g:22256:20: (otherlv_10= '<==' | otherlv_11= 'via' ) ( ( ruleESUfid ) )
+        {
+        // InternalFormalML.g:22256:20: (otherlv_10= '<==' | otherlv_11= 'via' )
+        int alt897=2;
+        int LA897_0 = input.LA(1);
+
+        if ( (LA897_0==173) ) {
+            alt897=1;
+        }
+        else if ( (LA897_0==174) ) {
+            alt897=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 897, 0, input);
+
+            throw nvae;
+        }
+        switch (alt897) {
+            case 1 :
+                // InternalFormalML.g:22257:10: otherlv_10= '<=='
+                {
+                otherlv_10=(Token)match(input,173,FollowSets000.FOLLOW_35); if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:22262:10: otherlv_11= 'via'
+                {
+                otherlv_11=(Token)match(input,174,FollowSets000.FOLLOW_35); if (state.failed) return ;
+
+                }
+                break;
+
+        }
+
+        // InternalFormalML.g:22267:9: ( ( ruleESUfid ) )
+        // InternalFormalML.g:22268:10: ( ruleESUfid )
+        {
+        // InternalFormalML.g:22268:10: ( ruleESUfid )
+        // InternalFormalML.g:22269:11: ruleESUfid
+        {
+        if ( state.backtracking==0 ) {
+
+          											/* */
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleESUfid();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred797_InternalFormalML
+
+    // $ANTLR start synpred800_InternalFormalML
+    public final void synpred800_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_8=null;
+        EObject lv_target_9_0 = null;
+
+
+        // InternalFormalML.g:22419:4: ( ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) ) )
+        // InternalFormalML.g:22419:4: ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) )
+        {
+        // InternalFormalML.g:22419:4: ({...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) ) )
+        // InternalFormalML.g:22420:5: {...}? => ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred800_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0)");
+        }
+        // InternalFormalML.g:22420:115: ( ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) ) )
+        // InternalFormalML.g:22421:6: ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 0);
+        // InternalFormalML.g:22424:9: ({...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) ) )
+        // InternalFormalML.g:22424:10: {...}? => (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred800_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:22424:19: (otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) ) )
+        // InternalFormalML.g:22424:20: otherlv_8= '-->' ( (lv_target_9_0= ruleExpressionAsMachine ) )
+        {
+        otherlv_8=(Token)match(input,59,FollowSets000.FOLLOW_122); if (state.failed) return ;
+        // InternalFormalML.g:22428:9: ( (lv_target_9_0= ruleExpressionAsMachine ) )
+        // InternalFormalML.g:22429:10: (lv_target_9_0= ruleExpressionAsMachine )
+        {
+        // InternalFormalML.g:22429:10: (lv_target_9_0= ruleExpressionAsMachine )
+        // InternalFormalML.g:22430:11: lv_target_9_0= ruleExpressionAsMachine
+        {
+        if ( state.backtracking==0 ) {
+
+          											newCompositeNode(grammarAccess.getOutputComStatementAccess().getTargetExpressionAsMachineParserRuleCall_3_0_1_0());
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_target_9_0=ruleExpressionAsMachine();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred800_InternalFormalML
+
+    // $ANTLR start synpred802_InternalFormalML
+    public final void synpred802_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+
+        // InternalFormalML.g:22453:4: ( ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) ) )
+        // InternalFormalML.g:22453:4: ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) )
+        {
+        // InternalFormalML.g:22453:4: ({...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) ) )
+        // InternalFormalML.g:22454:5: {...}? => ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred802_InternalFormalML", "getUnorderedGroupHelper().canSelect(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1)");
+        }
+        // InternalFormalML.g:22454:115: ( ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) ) )
+        // InternalFormalML.g:22455:6: ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getOutputComStatementAccess().getUnorderedGroup_3(), 1);
+        // InternalFormalML.g:22458:9: ({...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) ) )
+        // InternalFormalML.g:22458:10: {...}? => ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) )
+        {
+        if ( !((true)) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred802_InternalFormalML", "true");
+        }
+        // InternalFormalML.g:22458:19: ( (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) ) )
+        // InternalFormalML.g:22458:20: (otherlv_10= '==>' | otherlv_11= 'via' ) ( ( ruleESUfid ) )
+        {
+        // InternalFormalML.g:22458:20: (otherlv_10= '==>' | otherlv_11= 'via' )
+        int alt899=2;
+        int LA899_0 = input.LA(1);
+
+        if ( (LA899_0==175) ) {
+            alt899=1;
+        }
+        else if ( (LA899_0==174) ) {
+            alt899=2;
+        }
+        else {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            NoViableAltException nvae =
+                new NoViableAltException("", 899, 0, input);
+
+            throw nvae;
+        }
+        switch (alt899) {
+            case 1 :
+                // InternalFormalML.g:22459:10: otherlv_10= '==>'
+                {
+                otherlv_10=(Token)match(input,175,FollowSets000.FOLLOW_35); if (state.failed) return ;
+
+                }
+                break;
+            case 2 :
+                // InternalFormalML.g:22464:10: otherlv_11= 'via'
+                {
+                otherlv_11=(Token)match(input,174,FollowSets000.FOLLOW_35); if (state.failed) return ;
+
+                }
+                break;
+
+        }
+
+        // InternalFormalML.g:22469:9: ( ( ruleESUfid ) )
+        // InternalFormalML.g:22470:10: ( ruleESUfid )
+        {
+        // InternalFormalML.g:22470:10: ( ruleESUfid )
+        // InternalFormalML.g:22471:11: ruleESUfid
+        {
+        if ( state.backtracking==0 ) {
+
+          											/* */
+          										
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        ruleESUfid();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred802_InternalFormalML
+
+    // $ANTLR start synpred808_InternalFormalML
+    public final void synpred808_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_init_1_0 = null;
+
+        EObject lv_condition_3_0 = null;
+
+        EObject lv_iterate_5_0 = null;
+
+        EObject lv_bodyBlock_6_0 = null;
+
+
+        // InternalFormalML.g:22872:3: ( (otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) ) ) )
+        // InternalFormalML.g:22872:3: (otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) ) )
+        {
+        // InternalFormalML.g:22872:3: (otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) ) )
+        // InternalFormalML.g:22873:4: otherlv_0= 'for' ( (lv_init_1_0= ruleForAssignmentExpression ) )? otherlv_2= ';' ( (lv_condition_3_0= ruleExpression ) ) otherlv_4= ';' ( (lv_iterate_5_0= ruleForAssignmentExpression ) )? ( (lv_bodyBlock_6_0= ruleBlockStatement ) )
+        {
+        otherlv_0=(Token)match(input,180,FollowSets000.FOLLOW_214); if (state.failed) return ;
+        // InternalFormalML.g:22877:4: ( (lv_init_1_0= ruleForAssignmentExpression ) )?
+        int alt900=2;
+        int LA900_0 = input.LA(1);
+
+        if ( (LA900_0==RULE_XLIA_ID||LA900_0==56||(LA900_0>=216 && LA900_0<=217)||(LA900_0>=231 && LA900_0<=239)) ) {
+            alt900=1;
+        }
+        switch (alt900) {
+            case 1 :
+                // InternalFormalML.g:22878:5: (lv_init_1_0= ruleForAssignmentExpression )
+                {
+                // InternalFormalML.g:22878:5: (lv_init_1_0= ruleForAssignmentExpression )
+                // InternalFormalML.g:22879:6: lv_init_1_0= ruleForAssignmentExpression
+                {
+                if ( state.backtracking==0 ) {
+
+                  						newCompositeNode(grammarAccess.getForStatementAccess().getInitForAssignmentExpressionParserRuleCall_0_1_0());
+                  					
+                }
+                pushFollow(FollowSets000.FOLLOW_14);
+                lv_init_1_0=ruleForAssignmentExpression();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+                break;
+
+        }
+
+        otherlv_2=(Token)match(input,25,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:22900:4: ( (lv_condition_3_0= ruleExpression ) )
+        // InternalFormalML.g:22901:5: (lv_condition_3_0= ruleExpression )
+        {
+        // InternalFormalML.g:22901:5: (lv_condition_3_0= ruleExpression )
+        // InternalFormalML.g:22902:6: lv_condition_3_0= ruleExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getForStatementAccess().getConditionExpressionParserRuleCall_0_3_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_14);
+        lv_condition_3_0=ruleExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_4=(Token)match(input,25,FollowSets000.FOLLOW_215); if (state.failed) return ;
+        // InternalFormalML.g:22923:4: ( (lv_iterate_5_0= ruleForAssignmentExpression ) )?
+        int alt901=2;
+        int LA901_0 = input.LA(1);
+
+        if ( (LA901_0==RULE_XLIA_ID||LA901_0==56||(LA901_0>=216 && LA901_0<=217)||(LA901_0>=231 && LA901_0<=239)) ) {
+            alt901=1;
+        }
+        switch (alt901) {
+            case 1 :
+                // InternalFormalML.g:22924:5: (lv_iterate_5_0= ruleForAssignmentExpression )
+                {
+                // InternalFormalML.g:22924:5: (lv_iterate_5_0= ruleForAssignmentExpression )
+                // InternalFormalML.g:22925:6: lv_iterate_5_0= ruleForAssignmentExpression
+                {
+                if ( state.backtracking==0 ) {
+
+                  						newCompositeNode(grammarAccess.getForStatementAccess().getIterateForAssignmentExpressionParserRuleCall_0_5_0());
+                  					
+                }
+                pushFollow(FollowSets000.FOLLOW_61);
+                lv_iterate_5_0=ruleForAssignmentExpression();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+                break;
+
+        }
+
+        // InternalFormalML.g:22942:4: ( (lv_bodyBlock_6_0= ruleBlockStatement ) )
+        // InternalFormalML.g:22943:5: (lv_bodyBlock_6_0= ruleBlockStatement )
+        {
+        // InternalFormalML.g:22943:5: (lv_bodyBlock_6_0= ruleBlockStatement )
+        // InternalFormalML.g:22944:6: lv_bodyBlock_6_0= ruleBlockStatement
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getForStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_6_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_bodyBlock_6_0=ruleBlockStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred808_InternalFormalML
+
+    // $ANTLR start synpred811_InternalFormalML
+    public final void synpred811_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_AssignmentExpression_0 = null;
+
+
+        // InternalFormalML.g:23080:3: (this_AssignmentExpression_0= ruleAssignmentExpression )
+        // InternalFormalML.g:23080:3: this_AssignmentExpression_0= ruleAssignmentExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_AssignmentExpression_0=ruleAssignmentExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred811_InternalFormalML
+
+    // $ANTLR start synpred813_InternalFormalML
+    public final void synpred813_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        EObject lv_iterator_1_0 = null;
+
+        EObject lv_enumeration_3_0 = null;
+
+        EObject lv_bodyBlock_4_0 = null;
+
+
+        // InternalFormalML.g:23134:3: ( (otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) ) )
+        // InternalFormalML.g:23134:3: (otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) )
+        {
+        // InternalFormalML.g:23134:3: (otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) ) )
+        // InternalFormalML.g:23135:4: otherlv_0= 'for' ( (lv_iterator_1_0= ruleLeftHandSideExpression ) ) otherlv_2= ':' ( (lv_enumeration_3_0= ruleExpression ) ) ( (lv_bodyBlock_4_0= ruleBlockStatement ) )
+        {
+        otherlv_0=(Token)match(input,180,FollowSets000.FOLLOW_218); if (state.failed) return ;
+        // InternalFormalML.g:23139:4: ( (lv_iterator_1_0= ruleLeftHandSideExpression ) )
+        // InternalFormalML.g:23140:5: (lv_iterator_1_0= ruleLeftHandSideExpression )
+        {
+        // InternalFormalML.g:23140:5: (lv_iterator_1_0= ruleLeftHandSideExpression )
+        // InternalFormalML.g:23141:6: lv_iterator_1_0= ruleLeftHandSideExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getForEachStatementAccess().getIteratorLeftHandSideExpressionParserRuleCall_0_1_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_40);
+        lv_iterator_1_0=ruleLeftHandSideExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_2=(Token)match(input,30,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:23162:4: ( (lv_enumeration_3_0= ruleExpression ) )
+        // InternalFormalML.g:23163:5: (lv_enumeration_3_0= ruleExpression )
+        {
+        // InternalFormalML.g:23163:5: (lv_enumeration_3_0= ruleExpression )
+        // InternalFormalML.g:23164:6: lv_enumeration_3_0= ruleExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getForEachStatementAccess().getEnumerationExpressionParserRuleCall_0_3_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_61);
+        lv_enumeration_3_0=ruleExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:23181:4: ( (lv_bodyBlock_4_0= ruleBlockStatement ) )
+        // InternalFormalML.g:23182:5: (lv_bodyBlock_4_0= ruleBlockStatement )
+        {
+        // InternalFormalML.g:23182:5: (lv_bodyBlock_4_0= ruleBlockStatement )
+        // InternalFormalML.g:23183:6: lv_bodyBlock_4_0= ruleBlockStatement
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getForEachStatementAccess().getBodyBlockBlockStatementParserRuleCall_0_4_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_bodyBlock_4_0=ruleBlockStatement();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred813_InternalFormalML
+
+    // $ANTLR start synpred814_InternalFormalML
+    public final void synpred814_InternalFormalML_fragment() throws RecognitionException {   
+        EObject lv_expr_1_0 = null;
+
+
+        // InternalFormalML.g:23316:4: ( ( (lv_expr_1_0= ruleExpression ) ) )
+        // InternalFormalML.g:23316:4: ( (lv_expr_1_0= ruleExpression ) )
+        {
+        // InternalFormalML.g:23316:4: ( (lv_expr_1_0= ruleExpression ) )
+        // InternalFormalML.g:23317:5: (lv_expr_1_0= ruleExpression )
+        {
+        // InternalFormalML.g:23317:5: (lv_expr_1_0= ruleExpression )
+        // InternalFormalML.g:23318:6: lv_expr_1_0= ruleExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_0_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_expr_1_0=ruleExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred814_InternalFormalML
+
+    // $ANTLR start synpred816_InternalFormalML
+    public final void synpred816_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_expr_3_0 = null;
+
+        EObject lv_expr_5_0 = null;
+
+
+        // InternalFormalML.g:23336:4: ( (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' ) )
+        // InternalFormalML.g:23336:4: (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' )
+        {
+        // InternalFormalML.g:23336:4: (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' )
+        // InternalFormalML.g:23337:5: otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')'
+        {
+        otherlv_2=(Token)match(input,56,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:23341:5: ( (lv_expr_3_0= ruleExpression ) )
+        // InternalFormalML.g:23342:6: (lv_expr_3_0= ruleExpression )
+        {
+        // InternalFormalML.g:23342:6: (lv_expr_3_0= ruleExpression )
+        // InternalFormalML.g:23343:7: lv_expr_3_0= ruleExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_1_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_39);
+        lv_expr_3_0=ruleExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:23360:5: (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )*
+        loop902:
+        do {
+            int alt902=2;
+            int LA902_0 = input.LA(1);
+
+            if ( (LA902_0==20) ) {
+                alt902=1;
+            }
+
+
+            switch (alt902) {
+        	case 1 :
+        	    // InternalFormalML.g:23361:6: otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) )
+        	    {
+        	    otherlv_4=(Token)match(input,20,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        	    // InternalFormalML.g:23365:6: ( (lv_expr_5_0= ruleExpression ) )
+        	    // InternalFormalML.g:23366:7: (lv_expr_5_0= ruleExpression )
+        	    {
+        	    // InternalFormalML.g:23366:7: (lv_expr_5_0= ruleExpression )
+        	    // InternalFormalML.g:23367:8: lv_expr_5_0= ruleExpression
+        	    {
+        	    if ( state.backtracking==0 ) {
+
+        	      								newCompositeNode(grammarAccess.getInterruptStatementAccess().getExprExpressionParserRuleCall_1_1_2_1_0());
+        	      							
+        	    }
+        	    pushFollow(FollowSets000.FOLLOW_39);
+        	    lv_expr_5_0=ruleExpression();
+
+        	    state._fsp--;
+        	    if (state.failed) return ;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+
+        	default :
+        	    break loop902;
+            }
+        } while (true);
+
+        otherlv_6=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred816_InternalFormalML
+
+    // $ANTLR start synpred836_InternalFormalML
+    public final void synpred836_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_AssignmentExpression_0 = null;
+
+
+        // InternalFormalML.g:24028:3: (this_AssignmentExpression_0= ruleAssignmentExpression )
+        // InternalFormalML.g:24028:3: this_AssignmentExpression_0= ruleAssignmentExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_AssignmentExpression_0=ruleAssignmentExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred836_InternalFormalML
+
+    // $ANTLR start synpred877_InternalFormalML
+    public final void synpred877_InternalFormalML_fragment() throws RecognitionException {   
+        AntlrDatatypeRuleToken lv_rigthOperator_5_0 = null;
+
+        EObject lv_rigthOperand_6_0 = null;
+
+
+        // InternalFormalML.g:25191:5: ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )
+        // InternalFormalML.g:25191:5: () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) )
+        {
+        // InternalFormalML.g:25191:5: ()
+        // InternalFormalML.g:25192:6: 
+        {
+        if ( state.backtracking==0 ) {
+
+          						/* */
+          					
+        }
+
+        }
+
+        // InternalFormalML.g:25201:5: ( (lv_rigthOperator_5_0= ruleRelationalOperator ) )
+        // InternalFormalML.g:25202:6: (lv_rigthOperator_5_0= ruleRelationalOperator )
+        {
+        // InternalFormalML.g:25202:6: (lv_rigthOperator_5_0= ruleRelationalOperator )
+        // InternalFormalML.g:25203:7: lv_rigthOperator_5_0= ruleRelationalOperator
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_rigthOperator_5_0=ruleRelationalOperator();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:25220:5: ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) )
+        // InternalFormalML.g:25221:6: (lv_rigthOperand_6_0= ruleAdditiveExpression )
+        {
+        // InternalFormalML.g:25221:6: (lv_rigthOperand_6_0= ruleAdditiveExpression )
+        // InternalFormalML.g:25222:7: lv_rigthOperand_6_0= ruleAdditiveExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_rigthOperand_6_0=ruleAdditiveExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred877_InternalFormalML
+
+    // $ANTLR start synpred878_InternalFormalML
+    public final void synpred878_InternalFormalML_fragment() throws RecognitionException {   
+        AntlrDatatypeRuleToken lv_operator_2_0 = null;
+
+        EObject lv_rigthOperand_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_rigthOperator_5_0 = null;
+
+        EObject lv_rigthOperand_6_0 = null;
+
+
+        // InternalFormalML.g:25142:4: ( () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )? )
+        // InternalFormalML.g:25142:4: () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )?
+        {
+        // InternalFormalML.g:25142:4: ()
+        // InternalFormalML.g:25143:5: 
+        {
+        if ( state.backtracking==0 ) {
+
+          					/* */
+          				
+        }
+
+        }
+
+        // InternalFormalML.g:25152:4: ( (lv_operator_2_0= ruleRelationalOperator ) )
+        // InternalFormalML.g:25153:5: (lv_operator_2_0= ruleRelationalOperator )
+        {
+        // InternalFormalML.g:25153:5: (lv_operator_2_0= ruleRelationalOperator )
+        // InternalFormalML.g:25154:6: lv_operator_2_0= ruleRelationalOperator
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorParserRuleCall_1_1_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_operator_2_0=ruleRelationalOperator();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:25171:4: ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) )
+        // InternalFormalML.g:25172:5: (lv_rigthOperand_3_0= ruleAdditiveExpression )
+        {
+        // InternalFormalML.g:25172:5: (lv_rigthOperand_3_0= ruleAdditiveExpression )
+        // InternalFormalML.g:25173:6: lv_rigthOperand_3_0= ruleAdditiveExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          						newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_2_0());
+          					
+        }
+        pushFollow(FollowSets000.FOLLOW_235);
+        lv_rigthOperand_3_0=ruleAdditiveExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:25190:4: ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )?
+        int alt936=2;
+        int LA936_0 = input.LA(1);
+
+        if ( (LA936_0==16||LA936_0==37||(LA936_0>=210 && LA936_0<=211)) ) {
+            alt936=1;
+        }
+        switch (alt936) {
+            case 1 :
+                // InternalFormalML.g:25191:5: () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) )
+                {
+                // InternalFormalML.g:25191:5: ()
+                // InternalFormalML.g:25192:6: 
+                {
+                if ( state.backtracking==0 ) {
+
+                  						/* */
+                  					
+                }
+
+                }
+
+                // InternalFormalML.g:25201:5: ( (lv_rigthOperator_5_0= ruleRelationalOperator ) )
+                // InternalFormalML.g:25202:6: (lv_rigthOperator_5_0= ruleRelationalOperator )
+                {
+                // InternalFormalML.g:25202:6: (lv_rigthOperator_5_0= ruleRelationalOperator )
+                // InternalFormalML.g:25203:7: lv_rigthOperator_5_0= ruleRelationalOperator
+                {
+                if ( state.backtracking==0 ) {
+
+                  							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0());
+                  						
+                }
+                pushFollow(FollowSets000.FOLLOW_13);
+                lv_rigthOperator_5_0=ruleRelationalOperator();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+                // InternalFormalML.g:25220:5: ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) )
+                // InternalFormalML.g:25221:6: (lv_rigthOperand_6_0= ruleAdditiveExpression )
+                {
+                // InternalFormalML.g:25221:6: (lv_rigthOperand_6_0= ruleAdditiveExpression )
+                // InternalFormalML.g:25222:7: lv_rigthOperand_6_0= ruleAdditiveExpression
+                {
+                if ( state.backtracking==0 ) {
+
+                  							newCompositeNode(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0());
+                  						
+                }
+                pushFollow(FollowSets000.FOLLOW_2);
+                lv_rigthOperand_6_0=ruleAdditiveExpression();
+
+                state._fsp--;
+                if (state.failed) return ;
+
+                }
+
+
+                }
+
+
+                }
+                break;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred878_InternalFormalML
+
+    // $ANTLR start synpred882_InternalFormalML
+    public final void synpred882_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_4=null;
+        EObject lv_operand_5_0 = null;
+
+
+        // InternalFormalML.g:25359:6: (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )
+        // InternalFormalML.g:25359:6: otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) )
+        {
+        otherlv_4=(Token)match(input,212,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:25363:6: ( (lv_operand_5_0= ruleMultiplicativeExpression ) )
+        // InternalFormalML.g:25364:7: (lv_operand_5_0= ruleMultiplicativeExpression )
+        {
+        // InternalFormalML.g:25364:7: (lv_operand_5_0= ruleMultiplicativeExpression )
+        // InternalFormalML.g:25365:8: lv_operand_5_0= ruleMultiplicativeExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_operand_5_0=ruleMultiplicativeExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred882_InternalFormalML
+
+    // $ANTLR start synpred883_InternalFormalML
+    public final void synpred883_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_operator_2_0=null;
+        Token otherlv_4=null;
+        EObject lv_operand_3_0 = null;
+
+        EObject lv_operand_5_0 = null;
+
+
+        // InternalFormalML.g:25314:4: ( ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* ) )
+        // InternalFormalML.g:25314:4: ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* )
+        {
+        // InternalFormalML.g:25314:4: ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* )
+        // InternalFormalML.g:25315:5: () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )*
+        {
+        // InternalFormalML.g:25315:5: ()
+        // InternalFormalML.g:25316:6: 
+        {
+        if ( state.backtracking==0 ) {
+
+          						/* */
+          					
+        }
+
+        }
+
+        // InternalFormalML.g:25325:5: ( (lv_operator_2_0= '+' ) )
+        // InternalFormalML.g:25326:6: (lv_operator_2_0= '+' )
+        {
+        // InternalFormalML.g:25326:6: (lv_operator_2_0= '+' )
+        // InternalFormalML.g:25327:7: lv_operator_2_0= '+'
+        {
+        lv_operator_2_0=(Token)match(input,212,FollowSets000.FOLLOW_13); if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:25339:5: ( (lv_operand_3_0= ruleMultiplicativeExpression ) )
+        // InternalFormalML.g:25340:6: (lv_operand_3_0= ruleMultiplicativeExpression )
+        {
+        // InternalFormalML.g:25340:6: (lv_operand_3_0= ruleMultiplicativeExpression )
+        // InternalFormalML.g:25341:7: lv_operand_3_0= ruleMultiplicativeExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_251);
+        lv_operand_3_0=ruleMultiplicativeExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:25358:5: (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )*
+        loop937:
+        do {
+            int alt937=2;
+            int LA937_0 = input.LA(1);
+
+            if ( (LA937_0==212) ) {
+                alt937=1;
+            }
+
+
+            switch (alt937) {
+        	case 1 :
+        	    // InternalFormalML.g:25359:6: otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) )
+        	    {
+        	    otherlv_4=(Token)match(input,212,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        	    // InternalFormalML.g:25363:6: ( (lv_operand_5_0= ruleMultiplicativeExpression ) )
+        	    // InternalFormalML.g:25364:7: (lv_operand_5_0= ruleMultiplicativeExpression )
+        	    {
+        	    // InternalFormalML.g:25364:7: (lv_operand_5_0= ruleMultiplicativeExpression )
+        	    // InternalFormalML.g:25365:8: lv_operand_5_0= ruleMultiplicativeExpression
+        	    {
+        	    if ( state.backtracking==0 ) {
+
+        	      								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0());
+        	      							
+        	    }
+        	    pushFollow(FollowSets000.FOLLOW_251);
+        	    lv_operand_5_0=ruleMultiplicativeExpression();
+
+        	    state._fsp--;
+        	    if (state.failed) return ;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+
+        	default :
+        	    break loop937;
+            }
+        } while (true);
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred883_InternalFormalML
+
+    // $ANTLR start synpred884_InternalFormalML
+    public final void synpred884_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_9=null;
+        EObject lv_operand_10_0 = null;
+
+
+        // InternalFormalML.g:25430:6: (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )
+        // InternalFormalML.g:25430:6: otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) )
+        {
+        otherlv_9=(Token)match(input,28,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:25434:6: ( (lv_operand_10_0= ruleMultiplicativeExpression ) )
+        // InternalFormalML.g:25435:7: (lv_operand_10_0= ruleMultiplicativeExpression )
+        {
+        // InternalFormalML.g:25435:7: (lv_operand_10_0= ruleMultiplicativeExpression )
+        // InternalFormalML.g:25436:8: lv_operand_10_0= ruleMultiplicativeExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_operand_10_0=ruleMultiplicativeExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred884_InternalFormalML
+
+    // $ANTLR start synpred885_InternalFormalML
+    public final void synpred885_InternalFormalML_fragment() throws RecognitionException {   
+        Token lv_operator_7_0=null;
+        Token otherlv_9=null;
+        EObject lv_operand_8_0 = null;
+
+        EObject lv_operand_10_0 = null;
+
+
+        // InternalFormalML.g:25385:4: ( ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* ) )
+        // InternalFormalML.g:25385:4: ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* )
+        {
+        // InternalFormalML.g:25385:4: ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* )
+        // InternalFormalML.g:25386:5: () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )*
+        {
+        // InternalFormalML.g:25386:5: ()
+        // InternalFormalML.g:25387:6: 
+        {
+        if ( state.backtracking==0 ) {
+
+          						/* */
+          					
+        }
+
+        }
+
+        // InternalFormalML.g:25396:5: ( (lv_operator_7_0= '-' ) )
+        // InternalFormalML.g:25397:6: (lv_operator_7_0= '-' )
+        {
+        // InternalFormalML.g:25397:6: (lv_operator_7_0= '-' )
+        // InternalFormalML.g:25398:7: lv_operator_7_0= '-'
+        {
+        lv_operator_7_0=(Token)match(input,28,FollowSets000.FOLLOW_13); if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:25410:5: ( (lv_operand_8_0= ruleMultiplicativeExpression ) )
+        // InternalFormalML.g:25411:6: (lv_operand_8_0= ruleMultiplicativeExpression )
+        {
+        // InternalFormalML.g:25411:6: (lv_operand_8_0= ruleMultiplicativeExpression )
+        // InternalFormalML.g:25412:7: lv_operand_8_0= ruleMultiplicativeExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_252);
+        lv_operand_8_0=ruleMultiplicativeExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:25429:5: (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )*
+        loop938:
+        do {
+            int alt938=2;
+            int LA938_0 = input.LA(1);
+
+            if ( (LA938_0==28) ) {
+                alt938=1;
+            }
+
+
+            switch (alt938) {
+        	case 1 :
+        	    // InternalFormalML.g:25430:6: otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) )
+        	    {
+        	    otherlv_9=(Token)match(input,28,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        	    // InternalFormalML.g:25434:6: ( (lv_operand_10_0= ruleMultiplicativeExpression ) )
+        	    // InternalFormalML.g:25435:7: (lv_operand_10_0= ruleMultiplicativeExpression )
+        	    {
+        	    // InternalFormalML.g:25435:7: (lv_operand_10_0= ruleMultiplicativeExpression )
+        	    // InternalFormalML.g:25436:8: lv_operand_10_0= ruleMultiplicativeExpression
+        	    {
+        	    if ( state.backtracking==0 ) {
+
+        	      								newCompositeNode(grammarAccess.getAdditiveExpressionAccess().getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0());
+        	      							
+        	    }
+        	    pushFollow(FollowSets000.FOLLOW_252);
+        	    lv_operand_10_0=ruleMultiplicativeExpression();
+
+        	    state._fsp--;
+        	    if (state.failed) return ;
+
+        	    }
+
+
+        	    }
+
+
+        	    }
+        	    break;
+
+        	default :
+        	    break loop938;
+            }
+        } while (true);
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred885_InternalFormalML
+
+    // $ANTLR start synpred886_InternalFormalML
+    public final void synpred886_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_4=null;
+        EObject lv_operand_5_0 = null;
+
+
+        // InternalFormalML.g:25532:6: (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )
+        // InternalFormalML.g:25532:6: otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) )
+        {
+        otherlv_4=(Token)match(input,98,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:25536:6: ( (lv_operand_5_0= ruleUnaryExpression ) )
+        // InternalFormalML.g:25537:7: (lv_operand_5_0= ruleUnaryExpression )
+        {
+        // InternalFormalML.g:25537:7: (lv_operand_5_0= ruleUnaryExpression )
+        // InternalFormalML.g:25538:8: lv_operand_5_0= ruleUnaryExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0_3_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_operand_5_0=ruleUnaryExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred886_InternalFormalML
+
+    // $ANTLR start synpred888_InternalFormalML
+    public final void synpred888_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_9=null;
+        EObject lv_operand_10_0 = null;
+
+
+        // InternalFormalML.g:25603:6: (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )
+        // InternalFormalML.g:25603:6: otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) )
+        {
+        otherlv_9=(Token)match(input,213,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:25607:6: ( (lv_operand_10_0= ruleUnaryExpression ) )
+        // InternalFormalML.g:25608:7: (lv_operand_10_0= ruleUnaryExpression )
+        {
+        // InternalFormalML.g:25608:7: (lv_operand_10_0= ruleUnaryExpression )
+        // InternalFormalML.g:25609:8: lv_operand_10_0= ruleUnaryExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_1_3_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_operand_10_0=ruleUnaryExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred888_InternalFormalML
+
+    // $ANTLR start synpred890_InternalFormalML
+    public final void synpred890_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_14=null;
+        EObject lv_operand_15_0 = null;
+
+
+        // InternalFormalML.g:25674:6: (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )
+        // InternalFormalML.g:25674:6: otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) )
+        {
+        otherlv_14=(Token)match(input,214,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:25678:6: ( (lv_operand_15_0= ruleUnaryExpression ) )
+        // InternalFormalML.g:25679:7: (lv_operand_15_0= ruleUnaryExpression )
+        {
+        // InternalFormalML.g:25679:7: (lv_operand_15_0= ruleUnaryExpression )
+        // InternalFormalML.g:25680:8: lv_operand_15_0= ruleUnaryExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_2_3_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_operand_15_0=ruleUnaryExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred890_InternalFormalML
+
+    // $ANTLR start synpred892_InternalFormalML
+    public final void synpred892_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_19=null;
+        EObject lv_operand_20_0 = null;
+
+
+        // InternalFormalML.g:25745:6: (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )
+        // InternalFormalML.g:25745:6: otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) )
+        {
+        otherlv_19=(Token)match(input,215,FollowSets000.FOLLOW_13); if (state.failed) return ;
+        // InternalFormalML.g:25749:6: ( (lv_operand_20_0= ruleUnaryExpression ) )
+        // InternalFormalML.g:25750:7: (lv_operand_20_0= ruleUnaryExpression )
+        {
+        // InternalFormalML.g:25750:7: (lv_operand_20_0= ruleUnaryExpression )
+        // InternalFormalML.g:25751:8: lv_operand_20_0= ruleUnaryExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getMultiplicativeExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_3_3_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        lv_operand_20_0=ruleUnaryExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred892_InternalFormalML
+
+    // $ANTLR start synpred894_InternalFormalML
+    public final void synpred894_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_LiteralTerminalExpression_0 = null;
+
+
+        // InternalFormalML.g:25790:3: (this_LiteralTerminalExpression_0= ruleLiteralTerminalExpression )
+        // InternalFormalML.g:25790:3: this_LiteralTerminalExpression_0= ruleLiteralTerminalExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_LiteralTerminalExpression_0=ruleLiteralTerminalExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred894_InternalFormalML
+
+    // $ANTLR start synpred895_InternalFormalML
+    public final void synpred895_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_ArithmeticUnaryExpression_1 = null;
+
+
+        // InternalFormalML.g:25802:3: (this_ArithmeticUnaryExpression_1= ruleArithmeticUnaryExpression )
+        // InternalFormalML.g:25802:3: this_ArithmeticUnaryExpression_1= ruleArithmeticUnaryExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_ArithmeticUnaryExpression_1=ruleArithmeticUnaryExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred895_InternalFormalML
+
+    // $ANTLR start synpred898_InternalFormalML
+    public final void synpred898_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_NewfreshExpression_4 = null;
+
+
+        // InternalFormalML.g:25838:3: (this_NewfreshExpression_4= ruleNewfreshExpression )
+        // InternalFormalML.g:25838:3: this_NewfreshExpression_4= ruleNewfreshExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_NewfreshExpression_4=ruleNewfreshExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred898_InternalFormalML
+
+    // $ANTLR start synpred901_InternalFormalML
+    public final void synpred901_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_PostfixUnaryExpression_7 = null;
+
+
+        // InternalFormalML.g:25874:3: (this_PostfixUnaryExpression_7= rulePostfixUnaryExpression )
+        // InternalFormalML.g:25874:3: this_PostfixUnaryExpression_7= rulePostfixUnaryExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_PostfixUnaryExpression_7=rulePostfixUnaryExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred901_InternalFormalML
+
+    // $ANTLR start synpred906_InternalFormalML
+    public final void synpred906_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_6=null;
+        Enumerator lv_kind_4_0 = null;
+
+        EObject lv_arg_5_0 = null;
+
+
+        // InternalFormalML.g:26521:5: ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) )
+        // InternalFormalML.g:26521:5: ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )
+        {
+        // InternalFormalML.g:26521:5: ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' )
+        // InternalFormalML.g:26522:6: ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']'
+        {
+        // InternalFormalML.g:26522:6: ( (lv_kind_4_0= ruleValueIndexExpressionKind ) )
+        // InternalFormalML.g:26523:7: (lv_kind_4_0= ruleValueIndexExpressionKind )
+        {
+        // InternalFormalML.g:26523:7: (lv_kind_4_0= ruleValueIndexExpressionKind )
+        // InternalFormalML.g:26524:8: lv_kind_4_0= ruleValueIndexExpressionKind
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_kind_4_0=ruleValueIndexExpressionKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:26541:6: ( (lv_arg_5_0= rulePositionalTupleExpressionList ) )
+        // InternalFormalML.g:26542:7: (lv_arg_5_0= rulePositionalTupleExpressionList )
+        {
+        // InternalFormalML.g:26542:7: (lv_arg_5_0= rulePositionalTupleExpressionList )
+        // InternalFormalML.g:26543:8: lv_arg_5_0= rulePositionalTupleExpressionList
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_110);
+        lv_arg_5_0=rulePositionalTupleExpressionList();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_6=(Token)match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred906_InternalFormalML
+
+    // $ANTLR start synpred907_InternalFormalML
+    public final void synpred907_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_9=null;
+        Enumerator lv_kind_7_0 = null;
+
+        EObject lv_arg_8_0 = null;
+
+
+        // InternalFormalML.g:26566:5: ( ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )
+        // InternalFormalML.g:26566:5: ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' )
+        {
+        // InternalFormalML.g:26566:5: ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' )
+        // InternalFormalML.g:26567:6: ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')'
+        {
+        // InternalFormalML.g:26567:6: ( (lv_kind_7_0= ruleValueParameterExpressionKind ) )
+        // InternalFormalML.g:26568:7: (lv_kind_7_0= ruleValueParameterExpressionKind )
+        {
+        // InternalFormalML.g:26568:7: (lv_kind_7_0= ruleValueParameterExpressionKind )
+        // InternalFormalML.g:26569:8: lv_kind_7_0= ruleValueParameterExpressionKind
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_kind_7_0=ruleValueParameterExpressionKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:26586:6: ( (lv_arg_8_0= ruleMixTupleExpressionList ) )
+        // InternalFormalML.g:26587:7: (lv_arg_8_0= ruleMixTupleExpressionList )
+        {
+        // InternalFormalML.g:26587:7: (lv_arg_8_0= ruleMixTupleExpressionList )
+        // InternalFormalML.g:26588:8: lv_arg_8_0= ruleMixTupleExpressionList
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_99);
+        lv_arg_8_0=ruleMixTupleExpressionList();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_9=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred907_InternalFormalML
+
+    // $ANTLR start synpred909_InternalFormalML
+    public final void synpred909_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_15=null;
+        Enumerator lv_kind_13_0 = null;
+
+        EObject lv_arg_14_0 = null;
+
+
+        // InternalFormalML.g:26647:5: ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) )
+        // InternalFormalML.g:26647:5: ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' )
+        {
+        // InternalFormalML.g:26647:5: ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' )
+        // InternalFormalML.g:26648:6: ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']'
+        {
+        // InternalFormalML.g:26648:6: ( (lv_kind_13_0= ruleValueIndexExpressionKind ) )
+        // InternalFormalML.g:26649:7: (lv_kind_13_0= ruleValueIndexExpressionKind )
+        {
+        // InternalFormalML.g:26649:7: (lv_kind_13_0= ruleValueIndexExpressionKind )
+        // InternalFormalML.g:26650:8: lv_kind_13_0= ruleValueIndexExpressionKind
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_kind_13_0=ruleValueIndexExpressionKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:26667:6: ( (lv_arg_14_0= rulePositionalTupleExpressionList ) )
+        // InternalFormalML.g:26668:7: (lv_arg_14_0= rulePositionalTupleExpressionList )
+        {
+        // InternalFormalML.g:26668:7: (lv_arg_14_0= rulePositionalTupleExpressionList )
+        // InternalFormalML.g:26669:8: lv_arg_14_0= rulePositionalTupleExpressionList
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_110);
+        lv_arg_14_0=rulePositionalTupleExpressionList();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_15=(Token)match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred909_InternalFormalML
+
+    // $ANTLR start synpred910_InternalFormalML
+    public final void synpred910_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_18=null;
+        Enumerator lv_kind_16_0 = null;
+
+        EObject lv_arg_17_0 = null;
+
+
+        // InternalFormalML.g:26692:5: ( ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )
+        // InternalFormalML.g:26692:5: ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' )
+        {
+        // InternalFormalML.g:26692:5: ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' )
+        // InternalFormalML.g:26693:6: ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')'
+        {
+        // InternalFormalML.g:26693:6: ( (lv_kind_16_0= ruleValueParameterExpressionKind ) )
+        // InternalFormalML.g:26694:7: (lv_kind_16_0= ruleValueParameterExpressionKind )
+        {
+        // InternalFormalML.g:26694:7: (lv_kind_16_0= ruleValueParameterExpressionKind )
+        // InternalFormalML.g:26695:8: lv_kind_16_0= ruleValueParameterExpressionKind
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_kind_16_0=ruleValueParameterExpressionKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:26712:6: ( (lv_arg_17_0= ruleMixTupleExpressionList ) )
+        // InternalFormalML.g:26713:7: (lv_arg_17_0= ruleMixTupleExpressionList )
+        {
+        // InternalFormalML.g:26713:7: (lv_arg_17_0= ruleMixTupleExpressionList )
+        // InternalFormalML.g:26714:8: lv_arg_17_0= ruleMixTupleExpressionList
+        {
+        if ( state.backtracking==0 ) {
+
+          								newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0());
+          							
+        }
+        pushFollow(FollowSets000.FOLLOW_99);
+        lv_arg_17_0=ruleMixTupleExpressionList();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_18=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred910_InternalFormalML
+
+    // $ANTLR start synpred911_InternalFormalML
+    public final void synpred911_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_24=null;
+        Enumerator lv_kind_22_0 = null;
+
+        EObject lv_arg_23_0 = null;
+
+
+        // InternalFormalML.g:26772:6: ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) )
+        // InternalFormalML.g:26772:6: ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' )
+        {
+        // InternalFormalML.g:26772:6: ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' )
+        // InternalFormalML.g:26773:7: ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']'
+        {
+        // InternalFormalML.g:26773:7: ( (lv_kind_22_0= ruleValueIndexExpressionKind ) )
+        // InternalFormalML.g:26774:8: (lv_kind_22_0= ruleValueIndexExpressionKind )
+        {
+        // InternalFormalML.g:26774:8: (lv_kind_22_0= ruleValueIndexExpressionKind )
+        // InternalFormalML.g:26775:9: lv_kind_22_0= ruleValueIndexExpressionKind
+        {
+        if ( state.backtracking==0 ) {
+
+          									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0());
+          								
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_kind_22_0=ruleValueIndexExpressionKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:26792:7: ( (lv_arg_23_0= rulePositionalTupleExpressionList ) )
+        // InternalFormalML.g:26793:8: (lv_arg_23_0= rulePositionalTupleExpressionList )
+        {
+        // InternalFormalML.g:26793:8: (lv_arg_23_0= rulePositionalTupleExpressionList )
+        // InternalFormalML.g:26794:9: lv_arg_23_0= rulePositionalTupleExpressionList
+        {
+        if ( state.backtracking==0 ) {
+
+          									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0());
+          								
+        }
+        pushFollow(FollowSets000.FOLLOW_110);
+        lv_arg_23_0=rulePositionalTupleExpressionList();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_24=(Token)match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred911_InternalFormalML
+
+    // $ANTLR start synpred912_InternalFormalML
+    public final void synpred912_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_27=null;
+        Enumerator lv_kind_25_0 = null;
+
+        EObject lv_arg_26_0 = null;
+
+
+        // InternalFormalML.g:26817:6: ( ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )
+        // InternalFormalML.g:26817:6: ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' )
+        {
+        // InternalFormalML.g:26817:6: ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' )
+        // InternalFormalML.g:26818:7: ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')'
+        {
+        // InternalFormalML.g:26818:7: ( (lv_kind_25_0= ruleValueParameterExpressionKind ) )
+        // InternalFormalML.g:26819:8: (lv_kind_25_0= ruleValueParameterExpressionKind )
+        {
+        // InternalFormalML.g:26819:8: (lv_kind_25_0= ruleValueParameterExpressionKind )
+        // InternalFormalML.g:26820:9: lv_kind_25_0= ruleValueParameterExpressionKind
+        {
+        if ( state.backtracking==0 ) {
+
+          									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0());
+          								
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_kind_25_0=ruleValueParameterExpressionKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:26837:7: ( (lv_arg_26_0= ruleMixTupleExpressionList ) )
+        // InternalFormalML.g:26838:8: (lv_arg_26_0= ruleMixTupleExpressionList )
+        {
+        // InternalFormalML.g:26838:8: (lv_arg_26_0= ruleMixTupleExpressionList )
+        // InternalFormalML.g:26839:9: lv_arg_26_0= ruleMixTupleExpressionList
+        {
+        if ( state.backtracking==0 ) {
+
+          									newCompositeNode(grammarAccess.getPrimaryExpressionAccess().getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0());
+          								
+        }
+        pushFollow(FollowSets000.FOLLOW_99);
+        lv_arg_26_0=ruleMixTupleExpressionList();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_27=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred912_InternalFormalML
+
+    // $ANTLR start synpred932_InternalFormalML
+    public final void synpred932_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_LiteralIntegerExpression_1 = null;
+
+
+        // InternalFormalML.g:27587:3: (this_LiteralIntegerExpression_1= ruleLiteralIntegerExpression )
+        // InternalFormalML.g:27587:3: this_LiteralIntegerExpression_1= ruleLiteralIntegerExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_LiteralIntegerExpression_1=ruleLiteralIntegerExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred932_InternalFormalML
+
+    // $ANTLR start synpred934_InternalFormalML
+    public final void synpred934_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_LiteralFloatExpression_3 = null;
+
+
+        // InternalFormalML.g:27611:3: (this_LiteralFloatExpression_3= ruleLiteralFloatExpression )
+        // InternalFormalML.g:27611:3: this_LiteralFloatExpression_3= ruleLiteralFloatExpression
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_LiteralFloatExpression_3=ruleLiteralFloatExpression();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred934_InternalFormalML
+
+    // $ANTLR start synpred947_InternalFormalML
+    public final void synpred947_InternalFormalML_fragment() throws RecognitionException {   
+        EObject this_LiteralReferenceMachineContext_2 = null;
+
+
+        // InternalFormalML.g:28257:3: (this_LiteralReferenceMachineContext_2= ruleLiteralReferenceMachineContext )
+        // InternalFormalML.g:28257:3: this_LiteralReferenceMachineContext_2= ruleLiteralReferenceMachineContext
+        {
+        if ( state.backtracking==0 ) {
+
+          			/* */
+          		
+        }
+        pushFollow(FollowSets000.FOLLOW_2);
+        this_LiteralReferenceMachineContext_2=ruleLiteralReferenceMachineContext();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred947_InternalFormalML
+
+    // $ANTLR start synpred948_InternalFormalML
+    public final void synpred948_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_4=null;
+        Enumerator lv_kind_2_0 = null;
+
+        EObject lv_arg_3_0 = null;
+
+
+        // InternalFormalML.g:28329:4: ( ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' ) )
+        // InternalFormalML.g:28329:4: ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' )
+        {
+        // InternalFormalML.g:28329:4: ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' )
+        // InternalFormalML.g:28330:5: ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']'
+        {
+        // InternalFormalML.g:28330:5: ( (lv_kind_2_0= ruleValueIndexExpressionKind ) )
+        // InternalFormalML.g:28331:6: (lv_kind_2_0= ruleValueIndexExpressionKind )
+        {
+        // InternalFormalML.g:28331:6: (lv_kind_2_0= ruleValueIndexExpressionKind )
+        // InternalFormalML.g:28332:7: lv_kind_2_0= ruleValueIndexExpressionKind
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getKindValueIndexExpressionKindEnumRuleCall_2_0_0_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_kind_2_0=ruleValueIndexExpressionKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:28349:5: ( (lv_arg_3_0= rulePositionalTupleExpressionList ) )
+        // InternalFormalML.g:28350:6: (lv_arg_3_0= rulePositionalTupleExpressionList )
+        {
+        // InternalFormalML.g:28350:6: (lv_arg_3_0= rulePositionalTupleExpressionList )
+        // InternalFormalML.g:28351:7: lv_arg_3_0= rulePositionalTupleExpressionList
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getArgPositionalTupleExpressionListParserRuleCall_2_0_1_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_110);
+        lv_arg_3_0=rulePositionalTupleExpressionList();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_4=(Token)match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred948_InternalFormalML
+
+    // $ANTLR start synpred949_InternalFormalML
+    public final void synpred949_InternalFormalML_fragment() throws RecognitionException {   
+        Token otherlv_7=null;
+        Enumerator lv_kind_5_0 = null;
+
+        EObject lv_arg_6_0 = null;
+
+
+        // InternalFormalML.g:28374:4: ( ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' ) )
+        // InternalFormalML.g:28374:4: ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' )
+        {
+        // InternalFormalML.g:28374:4: ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' )
+        // InternalFormalML.g:28375:5: ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')'
+        {
+        // InternalFormalML.g:28375:5: ( (lv_kind_5_0= ruleValueParameterExpressionKind ) )
+        // InternalFormalML.g:28376:6: (lv_kind_5_0= ruleValueParameterExpressionKind )
+        {
+        // InternalFormalML.g:28376:6: (lv_kind_5_0= ruleValueParameterExpressionKind )
+        // InternalFormalML.g:28377:7: lv_kind_5_0= ruleValueParameterExpressionKind
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getKindValueParameterExpressionKindEnumRuleCall_2_1_0_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_13);
+        lv_kind_5_0=ruleValueParameterExpressionKind();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        // InternalFormalML.g:28394:5: ( (lv_arg_6_0= ruleMixTupleExpressionList ) )
+        // InternalFormalML.g:28395:6: (lv_arg_6_0= ruleMixTupleExpressionList )
+        {
+        // InternalFormalML.g:28395:6: (lv_arg_6_0= ruleMixTupleExpressionList )
+        // InternalFormalML.g:28396:7: lv_arg_6_0= ruleMixTupleExpressionList
+        {
+        if ( state.backtracking==0 ) {
+
+          							newCompositeNode(grammarAccess.getLiteralReferenceElementAccess().getArgMixTupleExpressionListParserRuleCall_2_1_1_0());
+          						
+        }
+        pushFollow(FollowSets000.FOLLOW_99);
+        lv_arg_6_0=ruleMixTupleExpressionList();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+        otherlv_7=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred949_InternalFormalML
+
+    // Delegated rules
+
+    public final boolean synpred586_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred586_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred890_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred890_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred814_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred814_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred901_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred901_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred335_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred335_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred587_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred587_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred414_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred414_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred910_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred910_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred257_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred257_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred615_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred615_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred623_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred623_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred336_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred336_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred607_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred607_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred649_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred649_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred18_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred18_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred254_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred254_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred588_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred588_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred754_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred754_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred911_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred911_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred884_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred884_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred91_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred91_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred415_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred415_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred797_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred797_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred592_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred592_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred746_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred746_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred912_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred912_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred759_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred759_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred253_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred253_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred166_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred166_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred625_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred625_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred898_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred898_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred94_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred94_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred885_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred885_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred892_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred892_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred725_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred725_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred412_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred412_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred417_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred417_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred609_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred609_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred948_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred948_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred877_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred877_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred909_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred909_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred617_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred617_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred256_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred256_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred769_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred769_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred795_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred795_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred243_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred243_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred882_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred882_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred656_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred656_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred895_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred895_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred714_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred714_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred906_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred906_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred949_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred949_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred418_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred418_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred790_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred790_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred590_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred590_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred749_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred749_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred618_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred618_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred836_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred836_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred894_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred894_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred627_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred627_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred610_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred610_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred888_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred888_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred907_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred907_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred802_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred802_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred932_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred932_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred619_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred619_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred650_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred650_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred419_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred419_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred241_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred241_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred611_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred611_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred654_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred654_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred811_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred811_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred411_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred411_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred808_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred808_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred947_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred947_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred816_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred816_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred934_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred934_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred589_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred589_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred416_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred416_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred770_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred770_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred244_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred244_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred755_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred755_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred252_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred252_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred813_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred813_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred883_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred883_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred800_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred800_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred591_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred591_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred20_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred20_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred878_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred878_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred886_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred886_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred413_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred413_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred652_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred652_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred93_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred93_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred626_InternalFormalML() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred626_InternalFormalML_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+
+
+    protected DFA22 dfa22 = new DFA22(this);
+    protected DFA23 dfa23 = new DFA23(this);
+    protected DFA24 dfa24 = new DFA24(this);
+    protected DFA25 dfa25 = new DFA25(this);
+    protected DFA26 dfa26 = new DFA26(this);
+    protected DFA43 dfa43 = new DFA43(this);
+    protected DFA53 dfa53 = new DFA53(this);
+    protected DFA58 dfa58 = new DFA58(this);
+    protected DFA59 dfa59 = new DFA59(this);
+    protected DFA60 dfa60 = new DFA60(this);
+    protected DFA61 dfa61 = new DFA61(this);
+    protected DFA62 dfa62 = new DFA62(this);
+    protected DFA100 dfa100 = new DFA100(this);
+    protected DFA111 dfa111 = new DFA111(this);
+    protected DFA112 dfa112 = new DFA112(this);
+    protected DFA113 dfa113 = new DFA113(this);
+    protected DFA114 dfa114 = new DFA114(this);
+    protected DFA127 dfa127 = new DFA127(this);
+    protected DFA131 dfa131 = new DFA131(this);
+    protected DFA145 dfa145 = new DFA145(this);
+    protected DFA156 dfa156 = new DFA156(this);
+    protected DFA157 dfa157 = new DFA157(this);
+    protected DFA158 dfa158 = new DFA158(this);
+    protected DFA159 dfa159 = new DFA159(this);
+    protected DFA224 dfa224 = new DFA224(this);
+    protected DFA225 dfa225 = new DFA225(this);
+    protected DFA265 dfa265 = new DFA265(this);
+    protected DFA283 dfa283 = new DFA283(this);
+    protected DFA353 dfa353 = new DFA353(this);
+    protected DFA354 dfa354 = new DFA354(this);
+    protected DFA404 dfa404 = new DFA404(this);
+    protected DFA489 dfa489 = new DFA489(this);
+    protected DFA493 dfa493 = new DFA493(this);
+    protected DFA494 dfa494 = new DFA494(this);
+    protected DFA498 dfa498 = new DFA498(this);
+    protected DFA515 dfa515 = new DFA515(this);
+    protected DFA518 dfa518 = new DFA518(this);
+    protected DFA536 dfa536 = new DFA536(this);
+    protected DFA557 dfa557 = new DFA557(this);
+    protected DFA556 dfa556 = new DFA556(this);
+    protected DFA561 dfa561 = new DFA561(this);
+    protected DFA559 dfa559 = new DFA559(this);
+    protected DFA560 dfa560 = new DFA560(this);
+    protected DFA562 dfa562 = new DFA562(this);
+    protected DFA563 dfa563 = new DFA563(this);
+    protected DFA564 dfa564 = new DFA564(this);
+    protected DFA565 dfa565 = new DFA565(this);
+    protected DFA567 dfa567 = new DFA567(this);
+    protected DFA572 dfa572 = new DFA572(this);
+    protected DFA574 dfa574 = new DFA574(this);
+    protected DFA575 dfa575 = new DFA575(this);
+    protected DFA590 dfa590 = new DFA590(this);
+    protected DFA600 dfa600 = new DFA600(this);
+    static final String dfa_1s = "\27\uffff";
+    static final String dfa_2s = "\1\23\1\uffff\4\23\1\4\2\uffff\1\23\1\4\3\23\4\uffff\4\23\1\4";
+    static final String dfa_3s = "\1\u00f2\1\uffff\4\u00f2\1\u010c\2\uffff\1\u00f2\1\u010c\3\u00f2\4\uffff\4\u00f2\1\u010c";
+    static final String dfa_4s = "\1\uffff\1\7\5\uffff\1\1\1\2\5\uffff\1\3\1\4\1\5\1\6\5\uffff";
+    static final String dfa_5s = "\27\uffff}>";
+    static final String[] dfa_6s = {
+            "\1\5\3\uffff\1\1\16\uffff\16\1\6\uffff\1\1\12\uffff\1\1\2\uffff\1\1\16\uffff\1\12\5\uffff\1\6\2\1\5\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\2\1\3\1\4",
+            "",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\21\27\uffff\1\21\30\uffff\1\21\50\uffff\1\1\7\uffff\4\21\1\uffff\25\21\4\uffff\2\21\2\uffff\3\21\111\uffff\1\21\3\uffff\2\21\52\uffff\11\21",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\16\uffff\1\25\10\uffff\1\21\30\uffff\1\21\41\uffff\1\12\5\uffff\1\21\10\uffff\4\21\1\uffff\25\21\1\11\1\13\1\14\1\15\3\21\1\uffff\1\26\2\21\111\uffff\1\21\3\uffff\2\21\26\uffff\1\22\1\23\1\24\21\uffff\11\21",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "",
+            "",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\13\uffff\1\21\120\uffff\1\21\u00a7\uffff\4\16"
+    };
+
+    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
+    static final char[] dfa_2 = DFA.unpackEncodedStringToUnsignedChars(dfa_2s);
+    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
+    static final short[] dfa_4 = DFA.unpackEncodedString(dfa_4s);
+    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
+    static final short[][] dfa_6 = unpackEncodedStringArray(dfa_6s);
+
+    class DFA22 extends DFA {
+
+        public DFA22(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 22;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "()* loopback of 1093:3: ( ( (lv_port_13_0= rulePort ) ) | ( (lv_signal_14_0= ruleSignal ) ) | ( (lv_buffer_15_0= ruleBuffer ) ) | ( (lv_channel_16_0= ruleChannel ) ) | ( (lv_typedef_17_0= ruleTypeDefinition ) ) | ( (lv_property_18_0= ruleVariable ) ) )*";
+        }
+    }
+
+    class DFA23 extends DFA {
+
+        public DFA23(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 23;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "()* loopback of 1220:5: ( ( (lv_port_20_0= rulePort ) ) | ( (lv_signal_21_0= ruleSignal ) ) | ( (lv_buffer_22_0= ruleBuffer ) ) | ( (lv_channel_23_0= ruleChannel ) ) | ( (lv_typedef_24_0= ruleTypeDefinition ) ) | ( (lv_property_25_0= ruleVariable ) ) )*";
+        }
+    }
+    static final String dfa_7s = "\22\uffff";
+    static final String dfa_8s = "\1\23\1\uffff\4\72\1\127\2\uffff\5\127\4\uffff";
+    static final String dfa_9s = "\1\u00f2\1\uffff\4\145\1\u0086\2\uffff\5\u0088\4\uffff";
+    static final String dfa_10s = "\1\uffff\1\7\5\uffff\1\1\1\2\5\uffff\1\3\1\4\1\5\1\6";
+    static final String dfa_11s = "\22\uffff}>";
+    static final String[] dfa_12s = {
+            "\1\5\3\uffff\1\1\16\uffff\16\1\6\uffff\1\1\12\uffff\1\1\2\uffff\1\1\16\uffff\1\12\5\uffff\1\6\2\1\5\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\2\1\3\1\4",
+            "",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\21\5\uffff\1\21\1\1\45\uffff\1\21\1\uffff\1\21",
+            "",
+            "",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_7 = DFA.unpackEncodedString(dfa_7s);
+    static final char[] dfa_8 = DFA.unpackEncodedStringToUnsignedChars(dfa_8s);
+    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
+    static final short[] dfa_10 = DFA.unpackEncodedString(dfa_10s);
+    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
+    static final short[][] dfa_12 = unpackEncodedStringArray(dfa_12s);
+
+    class DFA24 extends DFA {
+
+        public DFA24(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 24;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_12;
+        }
+        public String getDescription() {
+            return "()* loopback of 1348:5: ( ( (lv_port_27_0= rulePortPublic ) ) | ( (lv_signal_28_0= ruleSignalPublic ) ) | ( (lv_buffer_29_0= ruleBufferPublic ) ) | ( (lv_channel_30_0= ruleChannelPublic ) ) | ( (lv_typedef_31_0= ruleTypeDefinition ) ) | ( (lv_property_32_0= ruleVariablePublic ) ) )*";
+        }
+    }
+
+    class DFA25 extends DFA {
+
+        public DFA25(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 25;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_12;
+        }
+        public String getDescription() {
+            return "()* loopback of 1476:5: ( ( (lv_port_34_0= rulePortProtected ) ) | ( (lv_signal_35_0= ruleSignalProtected ) ) | ( (lv_buffer_36_0= ruleBufferProtected ) ) | ( (lv_channel_37_0= ruleChannelProtected ) ) | ( (lv_typedef_38_0= ruleTypeDefinition ) ) | ( (lv_property_39_0= ruleVariableProtected ) ) )*";
+        }
+    }
+
+    class DFA26 extends DFA {
+
+        public DFA26(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 26;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_12;
+        }
+        public String getDescription() {
+            return "()* loopback of 1604:5: ( ( (lv_port_41_0= rulePortPrivate ) ) | ( (lv_signal_42_0= ruleSignalPrivate ) ) | ( (lv_buffer_43_0= ruleBufferPrivate ) ) | ( (lv_channel_44_0= ruleChannelPrivate ) ) | ( (lv_typedef_45_0= ruleTypeDefinition ) ) | ( (lv_property_46_0= ruleVariablePrivate ) ) )*";
+        }
+    }
+    static final String dfa_13s = "\13\uffff";
+    static final String dfa_14s = "\11\23\2\uffff";
+    static final String dfa_15s = "\11\u00f4\2\uffff";
+    static final String dfa_16s = "\11\uffff\1\1\1\2";
+    static final String dfa_17s = "\13\uffff}>";
+    static final String[] dfa_18s = {
+            "\1\4\14\uffff\1\5\1\6\23\uffff\1\11\1\12\u00b9\uffff\1\1\1\2\1\3\1\7\1\10",
+            "\1\4\14\uffff\1\5\1\6\23\uffff\1\11\1\12\u00b9\uffff\1\1\1\2\1\3\1\7\1\10",
+            "\1\4\14\uffff\1\5\1\6\23\uffff\1\11\1\12\u00b9\uffff\1\1\1\2\1\3\1\7\1\10",
+            "\1\4\14\uffff\1\5\1\6\23\uffff\1\11\1\12\u00b9\uffff\1\1\1\2\1\3\1\7\1\10",
+            "\1\4\14\uffff\1\5\1\6\23\uffff\1\11\1\12\u00b9\uffff\1\1\1\2\1\3\1\7\1\10",
+            "\1\4\14\uffff\1\5\1\6\23\uffff\1\11\1\12\u00b9\uffff\1\1\1\2\1\3\1\7\1\10",
+            "\1\4\14\uffff\1\5\1\6\23\uffff\1\11\1\12\u00b9\uffff\1\1\1\2\1\3\1\7\1\10",
+            "\1\4\14\uffff\1\5\1\6\23\uffff\1\11\1\12\u00b9\uffff\1\1\1\2\1\3\1\7\1\10",
+            "\1\4\14\uffff\1\5\1\6\23\uffff\1\11\1\12\u00b9\uffff\1\1\1\2\1\3\1\7\1\10",
+            "",
+            ""
+    };
+
+    static final short[] dfa_13 = DFA.unpackEncodedString(dfa_13s);
+    static final char[] dfa_14 = DFA.unpackEncodedStringToUnsignedChars(dfa_14s);
+    static final char[] dfa_15 = DFA.unpackEncodedStringToUnsignedChars(dfa_15s);
+    static final short[] dfa_16 = DFA.unpackEncodedString(dfa_16s);
+    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
+    static final short[][] dfa_18 = unpackEncodedStringArray(dfa_18s);
+
+    class DFA43 extends DFA {
+
+        public DFA43(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 43;
+            this.eot = dfa_13;
+            this.eof = dfa_13;
+            this.min = dfa_14;
+            this.max = dfa_15;
+            this.accept = dfa_16;
+            this.special = dfa_17;
+            this.transition = dfa_18;
+        }
+        public String getDescription() {
+            return "2062:2: (this_MachineBlock_0= ruleMachineBlock | this_Statemachine_1= ruleStatemachine )";
+        }
+    }
+    static final String dfa_19s = "\12\uffff";
+    static final String dfa_20s = "\1\23\11\uffff";
+    static final String dfa_21s = "\1\u00f4\11\uffff";
+    static final String dfa_22s = "\1\uffff\1\4\4\1\2\2\2\3";
+    static final String dfa_23s = "\1\0\11\uffff}>";
+    static final String[] dfa_24s = {
+            "\1\5\14\uffff\1\6\1\7\23\uffff\1\1\u00ba\uffff\1\2\1\3\1\4\1\10\1\11",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_19 = DFA.unpackEncodedString(dfa_19s);
+    static final char[] dfa_20 = DFA.unpackEncodedStringToUnsignedChars(dfa_20s);
+    static final char[] dfa_21 = DFA.unpackEncodedStringToUnsignedChars(dfa_21s);
+    static final short[] dfa_22 = DFA.unpackEncodedString(dfa_22s);
+    static final short[] dfa_23 = DFA.unpackEncodedString(dfa_23s);
+    static final short[][] dfa_24 = unpackEncodedStringArray(dfa_24s);
+
+    class DFA53 extends DFA {
+
+        public DFA53(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 53;
+            this.eot = dfa_19;
+            this.eof = dfa_19;
+            this.min = dfa_20;
+            this.max = dfa_21;
+            this.accept = dfa_22;
+            this.special = dfa_23;
+            this.transition = dfa_24;
+        }
+        public String getDescription() {
+            return "()* loopback of 2448:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_2_0= 'timed' ) ) | ( (lv_input_enabled_3_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_4_0= ruleDesignKind ) ) ) ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA53_0 = input.LA(1);
+
+                         
+                        int index53_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA53_0==53) ) {s = 1;}
+
+                        else if ( LA53_0 == 240 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 2;}
+
+                        else if ( LA53_0 == 241 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 3;}
+
+                        else if ( LA53_0 == 242 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 4;}
+
+                        else if ( LA53_0 == 19 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 0) ) {s = 5;}
+
+                        else if ( LA53_0 == 32 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {s = 6;}
+
+                        else if ( LA53_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 1) ) {s = 7;}
+
+                        else if ( LA53_0 == 243 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {s = 8;}
+
+                        else if ( LA53_0 == 244 && getUnorderedGroupHelper().canSelect(grammarAccess.getMachineBlockAccess().getUnorderedGroup_0(), 2) ) {s = 9;}
+
+                         
+                        input.seek(index53_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 53, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA58 extends DFA {
+
+        public DFA58(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 58;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "()* loopback of 2625:3: ( ( (lv_port_14_0= rulePort ) ) | ( (lv_signal_15_0= ruleSignal ) ) | ( (lv_buffer_16_0= ruleBuffer ) ) | ( (lv_channel_17_0= ruleChannel ) ) | ( (lv_typedef_18_0= ruleTypeDefinition ) ) | ( (lv_property_19_0= ruleVariable ) ) )*";
+        }
+    }
+
+    class DFA59 extends DFA {
+
+        public DFA59(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 59;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_6;
+        }
+        public String getDescription() {
+            return "()* loopback of 2752:5: ( ( (lv_port_21_0= rulePort ) ) | ( (lv_signal_22_0= ruleSignal ) ) | ( (lv_buffer_23_0= ruleBuffer ) ) | ( (lv_channel_24_0= ruleChannel ) ) | ( (lv_typedef_25_0= ruleTypeDefinition ) ) | ( (lv_property_26_0= ruleVariable ) ) )*";
+        }
+    }
+
+    class DFA60 extends DFA {
+
+        public DFA60(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 60;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_12;
+        }
+        public String getDescription() {
+            return "()* loopback of 2880:5: ( ( (lv_port_28_0= rulePortPublic ) ) | ( (lv_signal_29_0= ruleSignalPublic ) ) | ( (lv_buffer_30_0= ruleBufferPublic ) ) | ( (lv_channel_31_0= ruleChannelPublic ) ) | ( (lv_typedef_32_0= ruleTypeDefinition ) ) | ( (lv_property_33_0= ruleVariablePublic ) ) )*";
+        }
+    }
+
+    class DFA61 extends DFA {
+
+        public DFA61(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 61;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_12;
+        }
+        public String getDescription() {
+            return "()* loopback of 3008:5: ( ( (lv_port_35_0= rulePortProtected ) ) | ( (lv_signal_36_0= ruleSignalProtected ) ) | ( (lv_buffer_37_0= ruleBufferProtected ) ) | ( (lv_channel_38_0= ruleChannelProtected ) ) | ( (lv_typedef_39_0= ruleTypeDefinition ) ) | ( (lv_property_40_0= ruleVariableProtected ) ) )*";
+        }
+    }
+
+    class DFA62 extends DFA {
+
+        public DFA62(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 62;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_12;
+        }
+        public String getDescription() {
+            return "()* loopback of 3136:5: ( ( (lv_port_42_0= rulePortPrivate ) ) | ( (lv_signal_43_0= ruleSignalPrivate ) ) | ( (lv_buffer_44_0= ruleBufferPrivate ) ) | ( (lv_channel_45_0= ruleChannelPrivate ) ) | ( (lv_typedef_46_0= ruleTypeDefinition ) ) | ( (lv_property_47_0= ruleVariablePrivate ) ) )*";
+        }
+    }
+    static final String[] dfa_25s = {
+            "\1\5\3\uffff\1\1\16\uffff\7\1\6\uffff\1\1\6\uffff\1\1\6\uffff\7\1\1\uffff\4\1\11\uffff\1\1\1\12\4\1\1\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\2\1\3\1\4",
+            "",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\21\27\uffff\1\21\30\uffff\1\21\50\uffff\1\1\7\uffff\4\21\1\uffff\25\21\4\uffff\2\21\2\uffff\3\21\111\uffff\1\21\3\uffff\2\21\52\uffff\11\21",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\16\uffff\1\25\10\uffff\1\21\30\uffff\1\21\41\uffff\1\12\5\uffff\1\21\10\uffff\4\21\1\uffff\25\21\1\11\1\13\1\14\1\15\3\21\1\uffff\1\26\2\21\111\uffff\1\21\3\uffff\2\21\26\uffff\1\22\1\23\1\24\21\uffff\11\21",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "",
+            "",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\13\uffff\1\21\120\uffff\1\21\u00a7\uffff\4\16"
+    };
+    static final short[][] dfa_25 = unpackEncodedStringArray(dfa_25s);
+
+    class DFA100 extends DFA {
+
+        public DFA100(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 100;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_25;
+        }
+        public String getDescription() {
+            return "()* loopback of 4068:4: ( ( (lv_port_43_0= rulePort ) ) | ( (lv_signal_44_0= ruleSignal ) ) | ( (lv_buffer_45_0= ruleBuffer ) ) | ( (lv_channel_46_0= ruleChannel ) ) | ( (lv_typedef_47_0= ruleTypeDefinition ) ) | ( (lv_property_48_0= ruleVariable ) ) )*";
+        }
+    }
+    static final String[] dfa_26s = {
+            "\1\5\3\uffff\1\1\16\uffff\7\1\6\uffff\1\1\6\uffff\1\1\12\uffff\3\1\1\uffff\4\1\11\uffff\1\1\1\12\4\1\1\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\2\1\3\1\4",
+            "",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\21\27\uffff\1\21\30\uffff\1\21\50\uffff\1\1\7\uffff\4\21\1\uffff\25\21\4\uffff\2\21\2\uffff\3\21\111\uffff\1\21\3\uffff\2\21\52\uffff\11\21",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\16\uffff\1\25\10\uffff\1\21\30\uffff\1\21\41\uffff\1\12\5\uffff\1\21\10\uffff\4\21\1\uffff\25\21\1\11\1\13\1\14\1\15\3\21\1\uffff\1\26\2\21\111\uffff\1\21\3\uffff\2\21\26\uffff\1\22\1\23\1\24\21\uffff\11\21",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "",
+            "",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\13\uffff\1\21\120\uffff\1\21\u00a7\uffff\4\16"
+    };
+    static final short[][] dfa_26 = unpackEncodedStringArray(dfa_26s);
+
+    class DFA111 extends DFA {
+
+        public DFA111(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 111;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_26;
+        }
+        public String getDescription() {
+            return "()* loopback of 4429:5: ( ( (lv_port_70_0= rulePort ) ) | ( (lv_signal_71_0= ruleSignal ) ) | ( (lv_buffer_72_0= ruleBuffer ) ) | ( (lv_channel_73_0= ruleChannel ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariable ) ) )*";
+        }
+    }
+    static final String[] dfa_27s = {
+            "\1\5\3\uffff\1\1\16\uffff\7\1\6\uffff\1\1\6\uffff\1\1\12\uffff\3\1\1\uffff\4\1\11\uffff\1\1\1\12\4\1\1\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\2\1\3\1\4",
+            "",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\21\5\uffff\1\21\1\1\45\uffff\1\21\1\uffff\1\21",
+            "",
+            "",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_27 = unpackEncodedStringArray(dfa_27s);
+
+    class DFA112 extends DFA {
+
+        public DFA112(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 112;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_27;
+        }
+        public String getDescription() {
+            return "()* loopback of 4557:5: ( ( (lv_port_77_0= rulePortPublic ) ) | ( (lv_signal_78_0= ruleSignalPublic ) ) | ( (lv_buffer_79_0= ruleBufferPublic ) ) | ( (lv_channel_80_0= ruleChannelPublic ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariablePublic ) ) )*";
+        }
+    }
+
+    class DFA113 extends DFA {
+
+        public DFA113(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 113;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_27;
+        }
+        public String getDescription() {
+            return "()* loopback of 4685:5: ( ( (lv_port_84_0= rulePortProtected ) ) | ( (lv_signal_85_0= ruleSignalProtected ) ) | ( (lv_buffer_86_0= ruleBufferProtected ) ) | ( (lv_channel_87_0= ruleChannelProtected ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariableProtected ) ) )*";
+        }
+    }
+
+    class DFA114 extends DFA {
+
+        public DFA114(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 114;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_27;
+        }
+        public String getDescription() {
+            return "()* loopback of 4813:5: ( ( (lv_port_91_0= rulePortPrivate ) ) | ( (lv_signal_92_0= ruleSignalPrivate ) ) | ( (lv_buffer_93_0= ruleBufferPrivate ) ) | ( (lv_channel_94_0= ruleChannelPrivate ) ) | ( (lv_typedef_95_0= ruleTypeDefinition ) ) | ( (lv_property_96_0= ruleVariablePrivate ) ) )*";
+        }
+    }
+    static final String dfa_28s = "\15\uffff";
+    static final String dfa_29s = "\1\1\14\uffff";
+    static final String dfa_30s = "\1\23\3\uffff\5\127\4\uffff";
+    static final String dfa_31s = "\1\u00f2\3\uffff\5\u0088\4\uffff";
+    static final String dfa_32s = "\1\uffff\1\7\1\1\1\2\5\uffff\1\3\1\4\1\5\1\6";
+    static final String dfa_33s = "\15\uffff}>";
+    static final String[] dfa_34s = {
+            "\1\13\3\uffff\1\1\55\uffff\1\1\21\uffff\1\5\5\uffff\1\14\1\uffff\1\1\5\uffff\1\13\32\uffff\1\4\1\6\1\7\1\10\1\14\1\uffff\1\14\1\uffff\1\11\1\2\1\3\1\12\144\uffff\3\13",
+            "",
+            "",
+            "",
+            "\1\5\5\uffff\1\14\42\uffff\1\4\1\6\1\7\1\10\1\14\1\uffff\1\14\1\uffff\1\11",
+            "\1\5\5\uffff\1\14\42\uffff\1\4\1\6\1\7\1\10\1\14\1\uffff\1\14\1\uffff\1\11",
+            "\1\5\5\uffff\1\14\42\uffff\1\4\1\6\1\7\1\10\1\14\1\uffff\1\14\1\uffff\1\11",
+            "\1\5\5\uffff\1\14\42\uffff\1\4\1\6\1\7\1\10\1\14\1\uffff\1\14\1\uffff\1\11",
+            "\1\5\5\uffff\1\14\42\uffff\1\4\1\6\1\7\1\10\1\14\1\uffff\1\14\1\uffff\1\11",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_28 = DFA.unpackEncodedString(dfa_28s);
+    static final short[] dfa_29 = DFA.unpackEncodedString(dfa_29s);
+    static final char[] dfa_30 = DFA.unpackEncodedStringToUnsignedChars(dfa_30s);
+    static final char[] dfa_31 = DFA.unpackEncodedStringToUnsignedChars(dfa_31s);
+    static final short[] dfa_32 = DFA.unpackEncodedString(dfa_32s);
+    static final short[] dfa_33 = DFA.unpackEncodedString(dfa_33s);
+    static final short[][] dfa_34 = unpackEncodedStringArray(dfa_34s);
+
+    class DFA127 extends DFA {
+
+        public DFA127(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 127;
+            this.eot = dfa_28;
+            this.eof = dfa_29;
+            this.min = dfa_30;
+            this.max = dfa_31;
+            this.accept = dfa_32;
+            this.special = dfa_33;
+            this.transition = dfa_34;
+        }
+        public String getDescription() {
+            return "()* loopback of 5306:4: ( ( (lv_port_2_0= rulePortPrivate ) ) | ( (lv_signal_3_0= ruleSignalPrivate ) ) | ( (lv_buffer_4_0= ruleBufferPrivate ) ) | ( (lv_channel_5_0= ruleChannelPrivate ) ) | ( (lv_typedef_6_0= ruleTypeDefinition ) ) | ( (lv_property_7_0= ruleVariablePrivate ) ) )*";
+        }
+    }
+    static final String[] dfa_35s = {
+            "\1\5\14\uffff\1\6\1\7\24\uffff\1\1\u00b9\uffff\1\2\1\3\1\4\1\10\1\11",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_35 = unpackEncodedStringArray(dfa_35s);
+
+    class DFA131 extends DFA {
+
+        public DFA131(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 131;
+            this.eot = dfa_19;
+            this.eof = dfa_19;
+            this.min = dfa_20;
+            this.max = dfa_21;
+            this.accept = dfa_22;
+            this.special = dfa_23;
+            this.transition = dfa_35;
+        }
+        public String getDescription() {
+            return "()* loopback of 5548:6: ( ({...}? => ( ({...}? => ( (lv_visibility_2_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_timed_3_0= 'timed' ) ) | ( (lv_input_enabled_4_0= 'input_enabled' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_design_5_0= ruleDesignKind ) ) ) ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA131_0 = input.LA(1);
+
+                         
+                        int index131_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA131_0==54) ) {s = 1;}
+
+                        else if ( LA131_0 == 240 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 2;}
+
+                        else if ( LA131_0 == 241 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 3;}
+
+                        else if ( LA131_0 == 242 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 4;}
+
+                        else if ( LA131_0 == 19 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 0) ) {s = 5;}
+
+                        else if ( LA131_0 == 32 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {s = 6;}
+
+                        else if ( LA131_0 == 33 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 1) ) {s = 7;}
+
+                        else if ( LA131_0 == 243 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {s = 8;}
+
+                        else if ( LA131_0 == 244 && getUnorderedGroupHelper().canSelect(grammarAccess.getStatemachineAccess().getUnorderedGroup_1(), 2) ) {s = 9;}
+
+                         
+                        input.seek(index131_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 131, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String[] dfa_36s = {
+            "\1\5\22\uffff\7\1\6\uffff\1\1\6\uffff\1\1\6\uffff\4\1\4\uffff\4\1\11\uffff\1\1\1\12\4\1\1\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\2\1\3\1\4",
+            "",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\21\27\uffff\1\21\30\uffff\1\21\50\uffff\1\1\7\uffff\4\21\1\uffff\25\21\4\uffff\2\21\2\uffff\3\21\111\uffff\1\21\3\uffff\2\21\52\uffff\11\21",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\16\uffff\1\25\10\uffff\1\21\30\uffff\1\21\41\uffff\1\12\5\uffff\1\21\10\uffff\4\21\1\uffff\25\21\1\11\1\13\1\14\1\15\3\21\1\uffff\1\26\2\21\111\uffff\1\21\3\uffff\2\21\26\uffff\1\22\1\23\1\24\21\uffff\11\21",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "",
+            "",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\13\uffff\1\21\120\uffff\1\21\u00a7\uffff\4\16"
+    };
+    static final short[][] dfa_36 = unpackEncodedStringArray(dfa_36s);
+
+    class DFA145 extends DFA {
+
+        public DFA145(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 145;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_36;
+        }
+        public String getDescription() {
+            return "()* loopback of 5966:4: ( ( (lv_port_36_0= rulePort ) ) | ( (lv_signal_37_0= ruleSignal ) ) | ( (lv_buffer_38_0= ruleBuffer ) ) | ( (lv_channel_39_0= ruleChannel ) ) | ( (lv_typedef_40_0= ruleTypeDefinition ) ) | ( (lv_property_41_0= ruleVariable ) ) )*";
+        }
+    }
+    static final String[] dfa_37s = {
+            "\1\5\22\uffff\7\1\6\uffff\1\1\6\uffff\1\1\16\uffff\4\1\11\uffff\1\1\1\12\4\1\1\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\2\1\3\1\4",
+            "",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\25\46\uffff\1\1\34\uffff\1\12\5\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\22\1\23\1\24",
+            "\1\21\27\uffff\1\21\30\uffff\1\21\50\uffff\1\1\7\uffff\4\21\1\uffff\25\21\4\uffff\2\21\2\uffff\3\21\111\uffff\1\21\3\uffff\2\21\52\uffff\11\21",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\16\uffff\1\25\10\uffff\1\21\30\uffff\1\21\41\uffff\1\12\5\uffff\1\21\10\uffff\4\21\1\uffff\25\21\1\11\1\13\1\14\1\15\3\21\1\uffff\1\26\2\21\111\uffff\1\21\3\uffff\2\21\26\uffff\1\22\1\23\1\24\21\uffff\11\21",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "",
+            "",
+            "",
+            "",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\25\103\uffff\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\3\21\1\uffff\1\16\147\uffff\1\22\1\23\1\24",
+            "\1\21\13\uffff\1\21\120\uffff\1\21\u00a7\uffff\4\16"
+    };
+    static final short[][] dfa_37 = unpackEncodedStringArray(dfa_37s);
+
+    class DFA156 extends DFA {
+
+        public DFA156(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 156;
+            this.eot = dfa_1;
+            this.eof = dfa_1;
+            this.min = dfa_2;
+            this.max = dfa_3;
+            this.accept = dfa_4;
+            this.special = dfa_5;
+            this.transition = dfa_37;
+        }
+        public String getDescription() {
+            return "()* loopback of 6327:5: ( ( (lv_port_63_0= rulePort ) ) | ( (lv_signal_64_0= ruleSignal ) ) | ( (lv_buffer_65_0= ruleBuffer ) ) | ( (lv_channel_66_0= ruleChannel ) ) | ( (lv_typedef_67_0= ruleTypeDefinition ) ) | ( (lv_property_68_0= ruleVariable ) ) )*";
+        }
+    }
+    static final String[] dfa_38s = {
+            "\1\5\22\uffff\7\1\6\uffff\1\1\6\uffff\1\1\16\uffff\4\1\11\uffff\1\1\1\12\4\1\1\uffff\1\6\1\1\6\uffff\1\20\32\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16\1\7\1\10\1\17\144\uffff\1\2\1\3\1\4",
+            "",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\1\42\uffff\2\1\6\uffff\1\20",
+            "\1\21\5\uffff\1\21\1\1\45\uffff\1\21\1\uffff\1\21",
+            "",
+            "",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "\1\12\5\uffff\1\21\42\uffff\1\11\1\13\1\14\1\15\1\21\1\uffff\1\21\1\uffff\1\16",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[][] dfa_38 = unpackEncodedStringArray(dfa_38s);
+
+    class DFA157 extends DFA {
+
+        public DFA157(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 157;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_38;
+        }
+        public String getDescription() {
+            return "()* loopback of 6455:5: ( ( (lv_port_70_0= rulePortPublic ) ) | ( (lv_signal_71_0= ruleSignalPublic ) ) | ( (lv_buffer_72_0= ruleBufferPublic ) ) | ( (lv_channel_73_0= ruleChannelPublic ) ) | ( (lv_typedef_74_0= ruleTypeDefinition ) ) | ( (lv_property_75_0= ruleVariablePublic ) ) )*";
+        }
+    }
+
+    class DFA158 extends DFA {
+
+        public DFA158(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 158;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_38;
+        }
+        public String getDescription() {
+            return "()* loopback of 6583:5: ( ( (lv_port_77_0= rulePortProtected ) ) | ( (lv_signal_78_0= ruleSignalProtected ) ) | ( (lv_buffer_79_0= ruleBufferProtected ) ) | ( (lv_channel_80_0= ruleChannelProtected ) ) | ( (lv_typedef_81_0= ruleTypeDefinition ) ) | ( (lv_property_82_0= ruleVariableProtected ) ) )*";
+        }
+    }
+
+    class DFA159 extends DFA {
+
+        public DFA159(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 159;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_8;
+            this.max = dfa_9;
+            this.accept = dfa_10;
+            this.special = dfa_11;
+            this.transition = dfa_38;
+        }
+        public String getDescription() {
+            return "()* loopback of 6711:5: ( ( (lv_port_84_0= rulePortPrivate ) ) | ( (lv_signal_85_0= ruleSignalPrivate ) ) | ( (lv_buffer_86_0= ruleBufferPrivate ) ) | ( (lv_channel_87_0= ruleChannelPrivate ) ) | ( (lv_typedef_88_0= ruleTypeDefinition ) ) | ( (lv_property_89_0= ruleVariablePrivate ) ) )*";
+        }
+    }
+    static final String dfa_39s = "\24\uffff";
+    static final String dfa_40s = "\1\1\23\uffff";
+    static final String dfa_41s = "\1\23\10\uffff\6\0\5\uffff";
+    static final String dfa_42s = "\1\u00f2\10\uffff\6\0\5\uffff";
+    static final String dfa_43s = "\1\uffff\1\2\21\uffff\1\1";
+    static final String dfa_44s = "\11\uffff\1\0\1\1\1\2\1\3\1\4\1\5\5\uffff}>";
+    static final String[] dfa_45s = {
+            "\1\14\3\uffff\1\1\55\uffff\3\1\6\uffff\6\1\11\uffff\1\15\1\16\1\1\u0090\uffff\1\11\1\12\1\13",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_39 = DFA.unpackEncodedString(dfa_39s);
+    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
+    static final char[] dfa_41 = DFA.unpackEncodedStringToUnsignedChars(dfa_41s);
+    static final char[] dfa_42 = DFA.unpackEncodedStringToUnsignedChars(dfa_42s);
+    static final short[] dfa_43 = DFA.unpackEncodedString(dfa_43s);
+    static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
+    static final short[][] dfa_45 = unpackEncodedStringArray(dfa_45s);
+
+    class DFA224 extends DFA {
+
+        public DFA224(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 224;
+            this.eot = dfa_39;
+            this.eof = dfa_40;
+            this.min = dfa_41;
+            this.max = dfa_42;
+            this.accept = dfa_43;
+            this.special = dfa_44;
+            this.transition = dfa_45;
+        }
+        public String getDescription() {
+            return "()* loopback of 9072:3: ( (lv_routine_2_0= ruleRoutine ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA224_9 = input.LA(1);
+
+                         
+                        int index224_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred411_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index224_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA224_10 = input.LA(1);
+
+                         
+                        int index224_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred411_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index224_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA224_11 = input.LA(1);
+
+                         
+                        int index224_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred411_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index224_11);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA224_12 = input.LA(1);
+
+                         
+                        int index224_12 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred411_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index224_12);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA224_13 = input.LA(1);
+
+                         
+                        int index224_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred411_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index224_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA224_14 = input.LA(1);
+
+                         
+                        int index224_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred411_InternalFormalML()) ) {s = 19;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index224_14);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 224, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_46s = "\1\1\11\uffff";
+    static final String dfa_47s = "\1\u00f2\11\uffff";
+    static final String dfa_48s = "\1\uffff\1\11\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10";
+    static final String[] dfa_49s = {
+            "\1\1\3\uffff\1\1\55\uffff\1\1\1\7\1\11\6\uffff\1\2\1\3\1\4\1\5\1\6\1\10\11\uffff\3\1\u0090\uffff\3\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[] dfa_46 = DFA.unpackEncodedString(dfa_46s);
+    static final char[] dfa_47 = DFA.unpackEncodedStringToUnsignedChars(dfa_47s);
+    static final short[] dfa_48 = DFA.unpackEncodedString(dfa_48s);
+    static final short[][] dfa_49 = unpackEncodedStringArray(dfa_49s);
+
+    class DFA225 extends DFA {
+
+        public DFA225(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 225;
+            this.eot = dfa_19;
+            this.eof = dfa_46;
+            this.min = dfa_20;
+            this.max = dfa_47;
+            this.accept = dfa_48;
+            this.special = dfa_23;
+            this.transition = dfa_49;
+        }
+        public String getDescription() {
+            return "()* loopback of 9097:6: ( ({...}? => ( ({...}? => (otherlv_4= '@init' ( (lv_initRoutine_5_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= '@final' ( (lv_finalRoutine_7_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= '@enable' ( (lv_enableRoutine_9_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= '@disable' ( (lv_disableRoutine_11_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= '@concurrency' ( (lv_concurrencyRoutine_13_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= '@schedule' ( (lv_scheduleRoutine_15_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= '@irun' ( (lv_irunRoutine_17_0= rulemoeRoutine ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= '@run' ( (lv_runRoutine_19_0= rulemoeRoutine ) ) ) ) ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA225_0 = input.LA(1);
+
+                         
+                        int index225_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA225_0==EOF||LA225_0==19||LA225_0==23||LA225_0==69||(LA225_0>=93 && LA225_0<=95)||(LA225_0>=240 && LA225_0<=242)) ) {s = 1;}
+
+                        else if ( LA225_0 == 78 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 0) ) {s = 2;}
+
+                        else if ( LA225_0 == 79 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 1) ) {s = 3;}
+
+                        else if ( LA225_0 == 80 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 2) ) {s = 4;}
+
+                        else if ( LA225_0 == 81 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 3) ) {s = 5;}
+
+                        else if ( LA225_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 4) ) {s = 6;}
+
+                        else if ( LA225_0 == 70 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 5) ) {s = 7;}
+
+                        else if ( LA225_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 6) ) {s = 8;}
+
+                        else if ( LA225_0 == 71 && getUnorderedGroupHelper().canSelect(grammarAccess.getModelOfExecutionAccess().getUnorderedGroup_3(), 7) ) {s = 9;}
+
+                         
+                        input.seek(index225_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 225, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_50s = "\17\uffff";
+    static final String dfa_51s = "\1\23\4\145\3\4\7\uffff";
+    static final String dfa_52s = "\1\u00f2\4\145\1\4\2\u010c\7\uffff";
+    static final String dfa_53s = "\10\uffff\1\3\1\2\1\1\1\5\1\7\1\6\1\4";
+    static final String dfa_54s = "\17\uffff}>";
+    static final String[] dfa_55s = {
+            "\1\4\121\uffff\1\5\u008a\uffff\1\1\1\2\1\3",
+            "\1\5",
+            "\1\5",
+            "\1\5",
+            "\1\5",
+            "\1\6",
+            "\1\14\2\uffff\1\7\24\uffff\1\14\30\uffff\1\14\60\uffff\4\14\1\uffff\20\14\1\13\1\12\1\11\1\10\1\16\10\uffff\3\14\111\uffff\1\14\3\uffff\2\14\52\uffff\2\14\7\15",
+            "\1\14\27\uffff\1\14\30\uffff\1\14\60\uffff\4\14\1\uffff\20\14\1\13\1\12\1\11\1\10\1\16\10\uffff\3\14\111\uffff\1\14\3\uffff\2\14\52\uffff\2\14\7\15",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_50 = DFA.unpackEncodedString(dfa_50s);
+    static final char[] dfa_51 = DFA.unpackEncodedStringToUnsignedChars(dfa_51s);
+    static final char[] dfa_52 = DFA.unpackEncodedStringToUnsignedChars(dfa_52s);
+    static final short[] dfa_53 = DFA.unpackEncodedString(dfa_53s);
+    static final short[] dfa_54 = DFA.unpackEncodedString(dfa_54s);
+    static final short[][] dfa_55 = unpackEncodedStringArray(dfa_55s);
+
+    class DFA265 extends DFA {
+
+        public DFA265(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 265;
+            this.eot = dfa_50;
+            this.eof = dfa_50;
+            this.min = dfa_51;
+            this.max = dfa_52;
+            this.accept = dfa_53;
+            this.special = dfa_54;
+            this.transition = dfa_55;
+        }
+        public String getDescription() {
+            return "11074:2: (this_EnumerationTypeDefinition_0= ruleEnumerationTypeDefinition | this_StructureTypeDefinition_1= ruleStructureTypeDefinition | this_UnionTypeDefinition_2= ruleUnionTypeDefinition | this_ChoiceTypeDefinition_3= ruleChoiceTypeDefinition | this_IntervalTypeDefinition_4= ruleIntervalTypeDefinition | this_CollectionTypeDefinition_5= ruleCollectionTypeDefinition | this_OtherDataTypeDefinition_6= ruleOtherDataTypeDefinition )";
+        }
+    }
+    static final String dfa_56s = "\1\34\4\146\5\uffff";
+    static final String dfa_57s = "\1\u00d9\4\164\5\uffff";
+    static final String dfa_58s = "\5\uffff\1\1\1\2\1\3\1\4\1\5";
+    static final String dfa_59s = "\12\uffff}>";
+    static final String[] dfa_60s = {
+            "\1\3\111\uffff\4\5\1\uffff\4\6\4\7\2\10\2\11\135\uffff\1\1\3\uffff\1\2\1\4",
+            "\4\5\1\uffff\4\6\4\7\2\10",
+            "\4\5\1\uffff\4\6\4\7\2\10",
+            "\4\5\1\uffff\4\6\4\7\2\10",
+            "\4\5\1\uffff\4\6\4\7\2\10",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_56 = DFA.unpackEncodedStringToUnsignedChars(dfa_56s);
+    static final char[] dfa_57 = DFA.unpackEncodedStringToUnsignedChars(dfa_57s);
+    static final short[] dfa_58 = DFA.unpackEncodedString(dfa_58s);
+    static final short[] dfa_59 = DFA.unpackEncodedString(dfa_59s);
+    static final short[][] dfa_60 = unpackEncodedStringArray(dfa_60s);
+
+    class DFA283 extends DFA {
+
+        public DFA283(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 283;
+            this.eot = dfa_19;
+            this.eof = dfa_19;
+            this.min = dfa_56;
+            this.max = dfa_57;
+            this.accept = dfa_58;
+            this.special = dfa_59;
+            this.transition = dfa_60;
+        }
+        public String getDescription() {
+            return "11945:2: (this_PrimitiveIntegerType_0= rulePrimitiveIntegerType | this_PrimitiveRationalType_1= rulePrimitiveRationalType | this_PrimitiveFloatType_2= rulePrimitiveFloatType | this_PrimitiveRealType_3= rulePrimitiveRealType | this_PrimitiveTimeType_4= rulePrimitiveTimeType )";
+        }
+    }
+    static final String dfa_61s = "\14\uffff";
+    static final String dfa_62s = "\1\1\13\uffff";
+    static final String dfa_63s = "\1\23\1\uffff\5\0\5\uffff";
+    static final String dfa_64s = "\1\u00f2\1\uffff\5\0\5\uffff";
+    static final String dfa_65s = "\1\uffff\1\6\5\uffff\1\2\1\1\1\3\1\4\1\5";
+    static final String dfa_66s = "\2\uffff\1\3\1\1\1\2\1\0\1\4\5\uffff}>";
+    static final String[] dfa_67s = {
+            "\1\1\103\uffff\1\2\5\uffff\1\1\42\uffff\1\3\1\4\1\5\1\6\3\1\1\uffff\1\1\147\uffff\3\1",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_61 = DFA.unpackEncodedString(dfa_61s);
+    static final short[] dfa_62 = DFA.unpackEncodedString(dfa_62s);
+    static final char[] dfa_63 = DFA.unpackEncodedStringToUnsignedChars(dfa_63s);
+    static final char[] dfa_64 = DFA.unpackEncodedStringToUnsignedChars(dfa_64s);
+    static final short[] dfa_65 = DFA.unpackEncodedString(dfa_65s);
+    static final short[] dfa_66 = DFA.unpackEncodedString(dfa_66s);
+    static final short[][] dfa_67 = unpackEncodedStringArray(dfa_67s);
+
+    class DFA353 extends DFA {
+
+        public DFA353(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 353;
+            this.eot = dfa_61;
+            this.eof = dfa_62;
+            this.min = dfa_63;
+            this.max = dfa_64;
+            this.accept = dfa_65;
+            this.special = dfa_66;
+            this.transition = dfa_67;
+        }
+        public String getDescription() {
+            return "()* loopback of 15460:6: ( ({...}? => ( ({...}? => ( (lv_static_2_0= 'static' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_final_3_0= 'final' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_reference_4_0= 'reference' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_volatile_5_0= 'volatile' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_transient_6_0= 'transient' ) ) ) ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA353_5 = input.LA(1);
+
+                         
+                        int index353_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred589_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 3) ) {s = 10;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index353_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA353_3 = input.LA(1);
+
+                         
+                        int index353_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred586_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 0) ) {s = 8;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index353_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA353_4 = input.LA(1);
+
+                         
+                        int index353_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred588_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 2) ) {s = 9;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index353_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA353_2 = input.LA(1);
+
+                         
+                        int index353_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred587_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 1) ) {s = 7;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index353_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA353_6 = input.LA(1);
+
+                         
+                        int index353_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred590_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getModifierAccess().getUnorderedGroup_1(), 4) ) {s = 11;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index353_6);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 353, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_68s = "\20\uffff";
+    static final String dfa_69s = "\1\23\11\0\6\uffff";
+    static final String dfa_70s = "\1\u00f2\11\0\6\uffff";
+    static final String dfa_71s = "\12\uffff\4\2\1\3\1\1";
+    static final String dfa_72s = "\1\2\1\7\1\10\1\11\1\4\1\0\1\6\1\5\1\3\1\1\6\uffff}>";
+    static final String[] dfa_73s = {
+            "\1\11\103\uffff\1\4\5\uffff\1\5\42\uffff\1\12\1\13\1\14\1\15\1\1\1\2\1\3\151\uffff\1\6\1\7\1\10",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_68 = DFA.unpackEncodedString(dfa_68s);
+    static final char[] dfa_69 = DFA.unpackEncodedStringToUnsignedChars(dfa_69s);
+    static final char[] dfa_70 = DFA.unpackEncodedStringToUnsignedChars(dfa_70s);
+    static final short[] dfa_71 = DFA.unpackEncodedString(dfa_71s);
+    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
+    static final short[][] dfa_73 = unpackEncodedStringArray(dfa_73s);
+
+    class DFA354 extends DFA {
+
+        public DFA354(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 354;
+            this.eot = dfa_68;
+            this.eof = dfa_68;
+            this.min = dfa_69;
+            this.max = dfa_70;
+            this.accept = dfa_71;
+            this.special = dfa_72;
+            this.transition = dfa_73;
+        }
+        public String getDescription() {
+            return "()* loopback of 15621:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA354_5 = input.LA(1);
+
+                         
+                        int index354_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred592_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index354_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA354_9 = input.LA(1);
+
+                         
+                        int index354_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred591_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {s = 15;}
+
+                        else if ( synpred592_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                         
+                        input.seek(index354_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA354_0 = input.LA(1);
+
+                         
+                        int index354_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA354_0==132) ) {s = 1;}
+
+                        else if ( (LA354_0==133) ) {s = 2;}
+
+                        else if ( (LA354_0==134) ) {s = 3;}
+
+                        else if ( (LA354_0==87) ) {s = 4;}
+
+                        else if ( (LA354_0==93) ) {s = 5;}
+
+                        else if ( (LA354_0==240) ) {s = 6;}
+
+                        else if ( (LA354_0==241) ) {s = 7;}
+
+                        else if ( (LA354_0==242) ) {s = 8;}
+
+                        else if ( (LA354_0==19) ) {s = 9;}
+
+                        else if ( LA354_0 == 128 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 10;}
+
+                        else if ( LA354_0 == 129 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 11;}
+
+                        else if ( LA354_0 == 130 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 12;}
+
+                        else if ( LA354_0 == 131 && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                         
+                        input.seek(index354_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA354_8 = input.LA(1);
+
+                         
+                        int index354_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred591_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {s = 15;}
+
+                        else if ( synpred592_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                         
+                        input.seek(index354_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA354_4 = input.LA(1);
+
+                         
+                        int index354_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred592_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index354_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA354_7 = input.LA(1);
+
+                         
+                        int index354_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred591_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {s = 15;}
+
+                        else if ( synpred592_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                         
+                        input.seek(index354_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA354_6 = input.LA(1);
+
+                         
+                        int index354_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred591_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 0) ) {s = 15;}
+
+                        else if ( synpred592_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                         
+                        input.seek(index354_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA354_1 = input.LA(1);
+
+                         
+                        int index354_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred592_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index354_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA354_2 = input.LA(1);
+
+                         
+                        int index354_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred592_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index354_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA354_3 = input.LA(1);
+
+                         
+                        int index354_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred592_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getVariableAccess().getUnorderedGroup_0(), 1) ) {s = 13;}
+
+                        else if ( (true) ) {s = 14;}
+
+                         
+                        input.seek(index354_3);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 354, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_74s = "\1\23\5\0\7\uffff";
+    static final String dfa_75s = "\1\u00f2\5\0\7\uffff";
+    static final String dfa_76s = "\6\uffff\5\2\1\3\1\1";
+    static final String dfa_77s = "\1\4\1\2\1\1\1\5\1\3\1\0\7\uffff}>";
+    static final String[] dfa_78s = {
+            "\1\5\103\uffff\1\7\50\uffff\1\6\1\10\1\11\1\12\4\uffff\1\1\147\uffff\1\2\1\3\1\4",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_74 = DFA.unpackEncodedStringToUnsignedChars(dfa_74s);
+    static final char[] dfa_75 = DFA.unpackEncodedStringToUnsignedChars(dfa_75s);
+    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
+    static final short[] dfa_77 = DFA.unpackEncodedString(dfa_77s);
+    static final short[][] dfa_78 = unpackEncodedStringArray(dfa_78s);
+
+    class DFA404 extends DFA {
+
+        public DFA404(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 404;
+            this.eot = dfa_28;
+            this.eof = dfa_28;
+            this.min = dfa_74;
+            this.max = dfa_75;
+            this.accept = dfa_76;
+            this.special = dfa_77;
+            this.transition = dfa_78;
+        }
+        public String getDescription() {
+            return "()* loopback of 17870:6: ( ({...}? => ( ({...}? => ( (lv_visibility_1_0= ruleVisibilityKind ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_modifier_2_0= ruleModifier ) ) ) ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA404_5 = input.LA(1);
+
+                         
+                        int index404_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred649_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {s = 12;}
+
+                        else if ( synpred650_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 10;}
+
+                         
+                        input.seek(index404_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA404_2 = input.LA(1);
+
+                         
+                        int index404_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred649_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {s = 12;}
+
+                        else if ( synpred650_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 10;}
+
+                         
+                        input.seek(index404_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA404_1 = input.LA(1);
+
+                         
+                        int index404_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred650_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 10;}
+
+                        else if ( (true) ) {s = 11;}
+
+                         
+                        input.seek(index404_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA404_4 = input.LA(1);
+
+                         
+                        int index404_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred649_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {s = 12;}
+
+                        else if ( synpred650_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 10;}
+
+                         
+                        input.seek(index404_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA404_0 = input.LA(1);
+
+                         
+                        int index404_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA404_0==136) ) {s = 1;}
+
+                        else if ( (LA404_0==240) ) {s = 2;}
+
+                        else if ( (LA404_0==241) ) {s = 3;}
+
+                        else if ( (LA404_0==242) ) {s = 4;}
+
+                        else if ( (LA404_0==19) ) {s = 5;}
+
+                        else if ( LA404_0 == 128 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 6;}
+
+                        else if ( LA404_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 7;}
+
+                        else if ( LA404_0 == 129 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 8;}
+
+                        else if ( LA404_0 == 130 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 9;}
+
+                        else if ( LA404_0 == 131 && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 10;}
+
+                         
+                        input.seek(index404_0);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA404_3 = input.LA(1);
+
+                         
+                        int index404_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( synpred649_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 0) ) {s = 12;}
+
+                        else if ( synpred650_InternalFormalML() && getUnorderedGroupHelper().canSelect(grammarAccess.getBufferAccess().getUnorderedGroup_0(), 1) ) {s = 10;}
+
+                         
+                        input.seek(index404_3);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 404, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_79s = "\44\uffff";
+    static final String dfa_80s = "\1\4\1\0\42\uffff";
+    static final String dfa_81s = "\1\u00ef\1\0\42\uffff";
+    static final String dfa_82s = "\2\uffff\1\2\40\uffff\1\1";
+    static final String dfa_83s = "\1\uffff\1\0\42\uffff}>";
+    static final String[] dfa_84s = {
+            "\4\2\10\uffff\1\2\5\uffff\1\1\3\uffff\4\2\32\uffff\1\2\u009b\uffff\1\2\3\uffff\11\2\2\uffff\15\2",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_79 = DFA.unpackEncodedString(dfa_79s);
+    static final char[] dfa_80 = DFA.unpackEncodedStringToUnsignedChars(dfa_80s);
+    static final char[] dfa_81 = DFA.unpackEncodedStringToUnsignedChars(dfa_81s);
+    static final short[] dfa_82 = DFA.unpackEncodedString(dfa_82s);
+    static final short[] dfa_83 = DFA.unpackEncodedString(dfa_83s);
+    static final short[][] dfa_84 = unpackEncodedStringArray(dfa_84s);
+
+    class DFA489 extends DFA {
+
+        public DFA489(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 489;
+            this.eot = dfa_79;
+            this.eof = dfa_79;
+            this.min = dfa_80;
+            this.max = dfa_81;
+            this.accept = dfa_82;
+            this.special = dfa_83;
+            this.transition = dfa_84;
+        }
+        public String getDescription() {
+            return "21107:6: ( (otherlv_5= '{' ( (lv_condition_6_0= ruleExpression ) ) otherlv_7= '}' ) | ( (lv_condition_8_0= ruleExpression ) ) )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA489_1 = input.LA(1);
+
+                         
+                        int index489_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred746_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 2;}
+
+                         
+                        input.seek(index489_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 489, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_85s = "\55\uffff";
+    static final String dfa_86s = "\1\4\1\0\13\uffff\1\0\6\uffff\1\0\30\uffff";
+    static final String dfa_87s = "\1\u011f\1\0\13\uffff\1\0\6\uffff\1\0\30\uffff";
+    static final String dfa_88s = "\2\uffff\1\1\15\uffff\1\2\1\3\1\4\1\5\1\uffff\1\10\3\uffff\1\11\17\uffff\1\12\1\uffff\1\6\1\7";
+    static final String dfa_89s = "\1\uffff\1\0\13\uffff\1\1\6\uffff\1\2\30\uffff}>";
+    static final String[] dfa_90s = {
+            "\1\1\63\uffff\1\2\6\uffff\1\20\1\25\24\uffff\1\31\1\uffff\1\31\130\uffff\1\21\1\uffff\1\22\1\23\1\24\2\51\41\uffff\3\2\1\15\13\uffff\11\2\37\uffff\1\31\3\25\15\31",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_85 = DFA.unpackEncodedString(dfa_85s);
+    static final char[] dfa_86 = DFA.unpackEncodedStringToUnsignedChars(dfa_86s);
+    static final char[] dfa_87 = DFA.unpackEncodedStringToUnsignedChars(dfa_87s);
+    static final short[] dfa_88 = DFA.unpackEncodedString(dfa_88s);
+    static final short[] dfa_89 = DFA.unpackEncodedString(dfa_89s);
+    static final short[][] dfa_90 = unpackEncodedStringArray(dfa_90s);
+
+    class DFA493 extends DFA {
+
+        public DFA493(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 493;
+            this.eot = dfa_85;
+            this.eof = dfa_85;
+            this.min = dfa_86;
+            this.max = dfa_87;
+            this.accept = dfa_88;
+            this.special = dfa_89;
+            this.transition = dfa_90;
+        }
+        public String getDescription() {
+            return "21252:2: (this_ExpressionStatement_0= ruleExpressionStatement | this_OutputComStatement_1= ruleOutputComStatement | this_IfStatement_2= ruleIfStatement | this_WhileDoStatement_3= ruleWhileDoStatement | this_DoWhileStatement_4= ruleDoWhileStatement | this_ForStatement_5= ruleForStatement | this_ForEachStatement_6= ruleForEachStatement | this_InterruptStatement_7= ruleInterruptStatement | this_ActivityStatement_8= ruleActivityStatement | this_InvokeStatement_9= ruleInvokeStatement )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA493_1 = input.LA(1);
+
+                         
+                        int index493_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred749_InternalFormalML()) ) {s = 2;}
+
+                        else if ( (true) ) {s = 41;}
+
+                         
+                        input.seek(index493_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA493_13 = input.LA(1);
+
+                         
+                        int index493_13 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred749_InternalFormalML()) ) {s = 2;}
+
+                        else if ( (true) ) {s = 41;}
+
+                         
+                        input.seek(index493_13);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA493_20 = input.LA(1);
+
+                         
+                        int index493_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred754_InternalFormalML()) ) {s = 43;}
+
+                        else if ( (synpred755_InternalFormalML()) ) {s = 44;}
+
+                         
+                        input.seek(index493_20);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 493, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_91s = "\63\uffff";
+    static final String dfa_92s = "\1\4\1\uffff\1\0\13\uffff\1\0\13\uffff\1\0\30\uffff";
+    static final String dfa_93s = "\1\u011f\1\uffff\1\0\13\uffff\1\0\13\uffff\1\0\30\uffff";
+    static final String dfa_94s = "\1\uffff\1\1\1\uffff\1\2\15\uffff\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\uffff\1\16\3\uffff\1\17\17\uffff\1\20\1\uffff\1\14\1\15";
+    static final String dfa_95s = "\2\uffff\1\0\13\uffff\1\1\13\uffff\1\2\30\uffff}>";
+    static final String[] dfa_96s = {
+            "\1\2\21\uffff\1\1\41\uffff\1\3\4\uffff\1\25\1\uffff\1\26\1\33\24\uffff\1\37\1\uffff\1\37\120\uffff\1\21\1\22\1\23\1\24\4\uffff\1\27\1\uffff\1\30\1\31\1\32\2\57\41\uffff\3\3\1\16\13\uffff\11\3\37\uffff\1\37\3\33\15\37",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_91 = DFA.unpackEncodedString(dfa_91s);
+    static final char[] dfa_92 = DFA.unpackEncodedStringToUnsignedChars(dfa_92s);
+    static final char[] dfa_93 = DFA.unpackEncodedStringToUnsignedChars(dfa_93s);
+    static final short[] dfa_94 = DFA.unpackEncodedString(dfa_94s);
+    static final short[] dfa_95 = DFA.unpackEncodedString(dfa_95s);
+    static final short[][] dfa_96 = unpackEncodedStringArray(dfa_96s);
+
+    class DFA494 extends DFA {
+
+        public DFA494(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 494;
+            this.eot = dfa_91;
+            this.eof = dfa_91;
+            this.min = dfa_92;
+            this.max = dfa_93;
+            this.accept = dfa_94;
+            this.special = dfa_95;
+            this.transition = dfa_96;
+        }
+        public String getDescription() {
+            return "21390:2: (this_BlockStatement_0= ruleBlockStatement | this_ExpressionStatement_1= ruleExpressionStatement | this_GuardStatement_2= ruleGuardStatement | this_TimedGuardStatement_3= ruleTimedGuardStatement | this_EventGuardStatement_4= ruleEventGuardStatement | this_CheckSatGuardStatement_5= ruleCheckSatGuardStatement | this_InputComStatement_6= ruleInputComStatement | this_OutputComStatement_7= ruleOutputComStatement | this_IfStatement_8= ruleIfStatement | this_WhileDoStatement_9= ruleWhileDoStatement | this_DoWhileStatement_10= ruleDoWhileStatement | this_ForStatement_11= ruleForStatement | this_ForEachStatement_12= ruleForEachStatement | this_InterruptStatement_13= ruleInterruptStatement | this_ActivityStatement_14= ruleActivityStatement | this_InvokeStatement_15= ruleInvokeStatement )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA494_2 = input.LA(1);
+
+                         
+                        int index494_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred759_InternalFormalML()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 47;}
+
+                         
+                        input.seek(index494_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA494_14 = input.LA(1);
+
+                         
+                        int index494_14 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred759_InternalFormalML()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 47;}
+
+                         
+                        input.seek(index494_14);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA494_26 = input.LA(1);
+
+                         
+                        int index494_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred769_InternalFormalML()) ) {s = 49;}
+
+                        else if ( (synpred770_InternalFormalML()) ) {s = 50;}
+
+                         
+                        input.seek(index494_26);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 494, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_97s = "\1\4\13\0\6\uffff";
+    static final String dfa_98s = "\1\u00ef\13\0\6\uffff";
+    static final String dfa_99s = "\14\uffff\1\2\1\uffff\1\3\1\uffff\1\1\1\4";
+    static final String dfa_100s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\6\uffff}>";
+    static final String[] dfa_101s = {
+            "\1\1\63\uffff\1\13\u009f\uffff\2\16\2\14\13\uffff\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_97 = DFA.unpackEncodedStringToUnsignedChars(dfa_97s);
+    static final char[] dfa_98 = DFA.unpackEncodedStringToUnsignedChars(dfa_98s);
+    static final short[] dfa_99 = DFA.unpackEncodedString(dfa_99s);
+    static final short[] dfa_100 = DFA.unpackEncodedString(dfa_100s);
+    static final short[][] dfa_101 = unpackEncodedStringArray(dfa_101s);
+
+    class DFA498 extends DFA {
+
+        public DFA498(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 498;
+            this.eot = dfa_7;
+            this.eof = dfa_7;
+            this.min = dfa_97;
+            this.max = dfa_98;
+            this.accept = dfa_99;
+            this.special = dfa_100;
+            this.transition = dfa_101;
+        }
+        public String getDescription() {
+            return "21789:2: ( ( ( (lv_expression_0_0= ruleAssignmentExpression ) ) otherlv_1= ';' ) | ( ( (lv_expression_2_0= ruleNewfreshExpression ) ) otherlv_3= ';' ) | ( ( (lv_expression_4_0= ruleIncrementOrDecrementPrefixExpression ) ) otherlv_5= ';' ) | ( ( (lv_expression_6_0= ruleIncrementOrDecrementPostfixExpression ) ) otherlv_7= ';' ) )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA498_1 = input.LA(1);
+
+                         
+                        int index498_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA498_2 = input.LA(1);
+
+                         
+                        int index498_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA498_3 = input.LA(1);
+
+                         
+                        int index498_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA498_4 = input.LA(1);
+
+                         
+                        int index498_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA498_5 = input.LA(1);
+
+                         
+                        int index498_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA498_6 = input.LA(1);
+
+                         
+                        int index498_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA498_7 = input.LA(1);
+
+                         
+                        int index498_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA498_8 = input.LA(1);
+
+                         
+                        int index498_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA498_9 = input.LA(1);
+
+                         
+                        int index498_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA498_10 = input.LA(1);
+
+                         
+                        int index498_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA498_11 = input.LA(1);
+
+                         
+                        int index498_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred790_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 17;}
+
+                         
+                        input.seek(index498_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 498, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_102s = "\1\4\13\0\4\uffff";
+    static final String dfa_103s = "\1\u00ef\13\0\4\uffff";
+    static final String dfa_104s = "\14\uffff\1\2\1\uffff\1\1\1\3";
+    static final String dfa_105s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\4\uffff}>";
+    static final String[] dfa_106s = {
+            "\1\1\63\uffff\1\13\u009f\uffff\2\14\15\uffff\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_102 = DFA.unpackEncodedStringToUnsignedChars(dfa_102s);
+    static final char[] dfa_103 = DFA.unpackEncodedStringToUnsignedChars(dfa_103s);
+    static final short[] dfa_104 = DFA.unpackEncodedString(dfa_104s);
+    static final short[] dfa_105 = DFA.unpackEncodedString(dfa_105s);
+    static final short[][] dfa_106 = unpackEncodedStringArray(dfa_106s);
+
+    class DFA515 extends DFA {
+
+        public DFA515(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 515;
+            this.eot = dfa_68;
+            this.eof = dfa_68;
+            this.min = dfa_102;
+            this.max = dfa_103;
+            this.accept = dfa_104;
+            this.special = dfa_105;
+            this.transition = dfa_106;
+        }
+        public String getDescription() {
+            return "23079:2: (this_AssignmentExpression_0= ruleAssignmentExpression | this_IncrementOrDecrementPrefixExpression_1= ruleIncrementOrDecrementPrefixExpression | this_IncrementOrDecrementPostfixExpression_2= ruleIncrementOrDecrementPostfixExpression )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA515_1 = input.LA(1);
+
+                         
+                        int index515_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA515_2 = input.LA(1);
+
+                         
+                        int index515_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA515_3 = input.LA(1);
+
+                         
+                        int index515_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA515_4 = input.LA(1);
+
+                         
+                        int index515_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA515_5 = input.LA(1);
+
+                         
+                        int index515_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA515_6 = input.LA(1);
+
+                         
+                        int index515_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA515_7 = input.LA(1);
+
+                         
+                        int index515_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA515_8 = input.LA(1);
+
+                         
+                        int index515_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA515_9 = input.LA(1);
+
+                         
+                        int index515_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA515_10 = input.LA(1);
+
+                         
+                        int index515_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA515_11 = input.LA(1);
+
+                         
+                        int index515_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred811_InternalFormalML()) ) {s = 14;}
+
+                        else if ( (true) ) {s = 15;}
+
+                         
+                        input.seek(index515_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 515, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_107s = "\45\uffff";
+    static final String dfa_108s = "\1\4\12\uffff\1\0\31\uffff";
+    static final String dfa_109s = "\1\u00ef\12\uffff\1\0\31\uffff";
+    static final String dfa_110s = "\1\uffff\1\1\41\uffff\1\3\1\2";
+    static final String dfa_111s = "\13\uffff\1\0\31\uffff}>";
+    static final String[] dfa_112s = {
+            "\4\1\10\uffff\1\1\5\uffff\1\1\2\uffff\1\43\4\1\32\uffff\1\13\u009b\uffff\1\1\3\uffff\11\1\2\uffff\15\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_107 = DFA.unpackEncodedString(dfa_107s);
+    static final char[] dfa_108 = DFA.unpackEncodedStringToUnsignedChars(dfa_108s);
+    static final char[] dfa_109 = DFA.unpackEncodedStringToUnsignedChars(dfa_109s);
+    static final short[] dfa_110 = DFA.unpackEncodedString(dfa_110s);
+    static final short[] dfa_111 = DFA.unpackEncodedString(dfa_111s);
+    static final short[][] dfa_112 = unpackEncodedStringArray(dfa_112s);
+
+    class DFA518 extends DFA {
+
+        public DFA518(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 518;
+            this.eot = dfa_107;
+            this.eof = dfa_107;
+            this.min = dfa_108;
+            this.max = dfa_109;
+            this.accept = dfa_110;
+            this.special = dfa_111;
+            this.transition = dfa_112;
+        }
+        public String getDescription() {
+            return "23315:3: ( ( (lv_expr_1_0= ruleExpression ) ) | (otherlv_2= '(' ( (lv_expr_3_0= ruleExpression ) ) (otherlv_4= ',' ( (lv_expr_5_0= ruleExpression ) ) )* otherlv_6= ')' ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA518_11 = input.LA(1);
+
+                         
+                        int index518_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred814_InternalFormalML()) ) {s = 1;}
+
+                        else if ( (synpred816_InternalFormalML()) ) {s = 36;}
+
+                         
+                        input.seek(index518_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 518, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_113s = "\1\4\13\0\30\uffff";
+    static final String dfa_114s = "\1\u00ef\13\0\30\uffff";
+    static final String dfa_115s = "\14\uffff\1\2\26\uffff\1\1";
+    static final String dfa_116s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\30\uffff}>";
+    static final String[] dfa_117s = {
+            "\1\1\3\14\10\uffff\1\14\5\uffff\1\14\3\uffff\4\14\32\uffff\1\13\u009b\uffff\1\14\3\uffff\11\14\2\uffff\4\14\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_113 = DFA.unpackEncodedStringToUnsignedChars(dfa_113s);
+    static final char[] dfa_114 = DFA.unpackEncodedStringToUnsignedChars(dfa_114s);
+    static final short[] dfa_115 = DFA.unpackEncodedString(dfa_115s);
+    static final short[] dfa_116 = DFA.unpackEncodedString(dfa_116s);
+    static final short[][] dfa_117 = unpackEncodedStringArray(dfa_117s);
+
+    class DFA536 extends DFA {
+
+        public DFA536(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 536;
+            this.eot = dfa_79;
+            this.eof = dfa_79;
+            this.min = dfa_113;
+            this.max = dfa_114;
+            this.accept = dfa_115;
+            this.special = dfa_116;
+            this.transition = dfa_117;
+        }
+        public String getDescription() {
+            return "24027:2: (this_AssignmentExpression_0= ruleAssignmentExpression | this_ConditionalTestExpression_1= ruleConditionalTestExpression )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA536_1 = input.LA(1);
+
+                         
+                        int index536_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA536_2 = input.LA(1);
+
+                         
+                        int index536_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_2);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA536_3 = input.LA(1);
+
+                         
+                        int index536_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA536_4 = input.LA(1);
+
+                         
+                        int index536_4 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_4);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA536_5 = input.LA(1);
+
+                         
+                        int index536_5 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_5);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA536_6 = input.LA(1);
+
+                         
+                        int index536_6 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_6);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA536_7 = input.LA(1);
+
+                         
+                        int index536_7 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_7);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA536_8 = input.LA(1);
+
+                         
+                        int index536_8 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_8);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA536_9 = input.LA(1);
+
+                         
+                        int index536_9 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_9);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA536_10 = input.LA(1);
+
+                         
+                        int index536_10 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_10);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA536_11 = input.LA(1);
+
+                         
+                        int index536_11 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred836_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 12;}
+
+                         
+                        input.seek(index536_11);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 536, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_118s = "\77\uffff";
+    static final String dfa_119s = "\1\5\76\uffff";
+    static final String dfa_120s = "\1\4\1\0\75\uffff";
+    static final String dfa_121s = "\1\u00ef\1\0\75\uffff";
+    static final String dfa_122s = "\2\uffff\1\1\2\uffff\1\2\71\uffff";
+    static final String dfa_123s = "\1\uffff\1\0\75\uffff}>";
+    static final String[] dfa_124s = {
+            "\4\5\10\uffff\1\1\3\uffff\1\5\1\uffff\2\5\1\uffff\6\5\4\uffff\2\5\1\2\22\uffff\2\5\1\uffff\1\5\45\uffff\1\5\1\uffff\1\5\53\uffff\3\5\3\uffff\3\5\62\uffff\10\5\2\2\1\5\3\uffff\11\5\2\uffff\15\5",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_118 = DFA.unpackEncodedString(dfa_118s);
+    static final short[] dfa_119 = DFA.unpackEncodedString(dfa_119s);
+    static final char[] dfa_120 = DFA.unpackEncodedStringToUnsignedChars(dfa_120s);
+    static final char[] dfa_121 = DFA.unpackEncodedStringToUnsignedChars(dfa_121s);
+    static final short[] dfa_122 = DFA.unpackEncodedString(dfa_122s);
+    static final short[] dfa_123 = DFA.unpackEncodedString(dfa_123s);
+    static final short[][] dfa_124 = unpackEncodedStringArray(dfa_124s);
+
+    class DFA557 extends DFA {
+
+        public DFA557(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 557;
+            this.eot = dfa_118;
+            this.eof = dfa_119;
+            this.min = dfa_120;
+            this.max = dfa_121;
+            this.accept = dfa_122;
+            this.special = dfa_123;
+            this.transition = dfa_124;
+        }
+        public String getDescription() {
+            return "25141:3: ( () ( (lv_operator_2_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_3_0= ruleAdditiveExpression ) ) ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )? )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA557_1 = input.LA(1);
+
+                         
+                        int index557_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred878_InternalFormalML()) ) {s = 2;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index557_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 557, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA556 extends DFA {
+
+        public DFA556(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 556;
+            this.eot = dfa_118;
+            this.eof = dfa_119;
+            this.min = dfa_120;
+            this.max = dfa_121;
+            this.accept = dfa_122;
+            this.special = dfa_123;
+            this.transition = dfa_124;
+        }
+        public String getDescription() {
+            return "25190:4: ( () ( (lv_rigthOperator_5_0= ruleRelationalOperator ) ) ( (lv_rigthOperand_6_0= ruleAdditiveExpression ) ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA556_1 = input.LA(1);
+
+                         
+                        int index556_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred877_InternalFormalML()) ) {s = 2;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index556_1);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 556, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_125s = "\101\uffff";
+    static final String dfa_126s = "\1\1\100\uffff";
+    static final String dfa_127s = "\1\4\22\uffff\1\0\10\uffff\1\0\44\uffff";
+    static final String dfa_128s = "\1\u00ef\22\uffff\1\0\10\uffff\1\0\44\uffff";
+    static final String dfa_129s = "\1\uffff\1\3\75\uffff\1\2\1\1";
+    static final String dfa_130s = "\23\uffff\1\0\10\uffff\1\1\44\uffff}>";
+    static final String[] dfa_131s = {
+            "\4\1\10\uffff\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\3\1\1\23\2\1\4\uffff\3\1\22\uffff\2\1\1\uffff\1\1\45\uffff\1\1\1\uffff\1\1\53\uffff\3\1\3\uffff\3\1\62\uffff\12\1\1\34\3\uffff\11\1\2\uffff\15\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_125 = DFA.unpackEncodedString(dfa_125s);
+    static final short[] dfa_126 = DFA.unpackEncodedString(dfa_126s);
+    static final char[] dfa_127 = DFA.unpackEncodedStringToUnsignedChars(dfa_127s);
+    static final char[] dfa_128 = DFA.unpackEncodedStringToUnsignedChars(dfa_128s);
+    static final short[] dfa_129 = DFA.unpackEncodedString(dfa_129s);
+    static final short[] dfa_130 = DFA.unpackEncodedString(dfa_130s);
+    static final short[][] dfa_131 = unpackEncodedStringArray(dfa_131s);
+
+    class DFA561 extends DFA {
+
+        public DFA561(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 561;
+            this.eot = dfa_125;
+            this.eof = dfa_126;
+            this.min = dfa_127;
+            this.max = dfa_128;
+            this.accept = dfa_129;
+            this.special = dfa_130;
+            this.transition = dfa_131;
+        }
+        public String getDescription() {
+            return "()* loopback of 25313:3: ( ( () ( (lv_operator_2_0= '+' ) ) ( (lv_operand_3_0= ruleMultiplicativeExpression ) ) (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )* ) | ( () ( (lv_operator_7_0= '-' ) ) ( (lv_operand_8_0= ruleMultiplicativeExpression ) ) (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )* ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA561_19 = input.LA(1);
+
+                         
+                        int index561_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred885_InternalFormalML()) ) {s = 63;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index561_19);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA561_28 = input.LA(1);
+
+                         
+                        int index561_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred883_InternalFormalML()) ) {s = 64;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index561_28);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 561, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_132s = "\100\uffff";
+    static final String dfa_133s = "\1\1\77\uffff";
+    static final String dfa_134s = "\1\4\33\uffff\1\0\43\uffff";
+    static final String dfa_135s = "\1\u00ef\33\uffff\1\0\43\uffff";
+    static final String dfa_136s = "\1\uffff\1\2\75\uffff\1\1";
+    static final String dfa_137s = "\34\uffff\1\0\43\uffff}>";
+    static final String[] dfa_138s = {
+            "\4\1\10\uffff\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\6\1\4\uffff\3\1\22\uffff\2\1\1\uffff\1\1\45\uffff\1\1\1\uffff\1\1\53\uffff\3\1\3\uffff\3\1\62\uffff\12\1\1\34\3\uffff\11\1\2\uffff\15\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_132 = DFA.unpackEncodedString(dfa_132s);
+    static final short[] dfa_133 = DFA.unpackEncodedString(dfa_133s);
+    static final char[] dfa_134 = DFA.unpackEncodedStringToUnsignedChars(dfa_134s);
+    static final char[] dfa_135 = DFA.unpackEncodedStringToUnsignedChars(dfa_135s);
+    static final short[] dfa_136 = DFA.unpackEncodedString(dfa_136s);
+    static final short[] dfa_137 = DFA.unpackEncodedString(dfa_137s);
+    static final short[][] dfa_138 = unpackEncodedStringArray(dfa_138s);
+
+    class DFA559 extends DFA {
+
+        public DFA559(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 559;
+            this.eot = dfa_132;
+            this.eof = dfa_133;
+            this.min = dfa_134;
+            this.max = dfa_135;
+            this.accept = dfa_136;
+            this.special = dfa_137;
+            this.transition = dfa_138;
+        }
+        public String getDescription() {
+            return "()* loopback of 25358:5: (otherlv_4= '+' ( (lv_operand_5_0= ruleMultiplicativeExpression ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA559_28 = input.LA(1);
+
+                         
+                        int index559_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred882_InternalFormalML()) ) {s = 63;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index559_28);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 559, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_139s = "\1\4\22\uffff\1\0\54\uffff";
+    static final String dfa_140s = "\1\u00ef\22\uffff\1\0\54\uffff";
+    static final String dfa_141s = "\23\uffff\1\0\54\uffff}>";
+    static final String[] dfa_142s = {
+            "\4\1\10\uffff\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\3\1\1\23\2\1\4\uffff\3\1\22\uffff\2\1\1\uffff\1\1\45\uffff\1\1\1\uffff\1\1\53\uffff\3\1\3\uffff\3\1\62\uffff\13\1\3\uffff\11\1\2\uffff\15\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_139 = DFA.unpackEncodedStringToUnsignedChars(dfa_139s);
+    static final char[] dfa_140 = DFA.unpackEncodedStringToUnsignedChars(dfa_140s);
+    static final short[] dfa_141 = DFA.unpackEncodedString(dfa_141s);
+    static final short[][] dfa_142 = unpackEncodedStringArray(dfa_142s);
+
+    class DFA560 extends DFA {
+
+        public DFA560(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 560;
+            this.eot = dfa_132;
+            this.eof = dfa_133;
+            this.min = dfa_139;
+            this.max = dfa_140;
+            this.accept = dfa_136;
+            this.special = dfa_141;
+            this.transition = dfa_142;
+        }
+        public String getDescription() {
+            return "()* loopback of 25429:5: (otherlv_9= '-' ( (lv_operand_10_0= ruleMultiplicativeExpression ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA560_19 = input.LA(1);
+
+                         
+                        int index560_19 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred884_InternalFormalML()) ) {s = 63;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index560_19);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 560, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_143s = "\104\uffff";
+    static final String dfa_144s = "\1\1\103\uffff";
+    static final String dfa_145s = "\1\4\76\uffff\1\0\4\uffff";
+    static final String dfa_146s = "\1\u00ef\76\uffff\1\0\4\uffff";
+    static final String dfa_147s = "\1\uffff\1\2\101\uffff\1\1";
+    static final String dfa_148s = "\77\uffff\1\0\4\uffff}>";
+    static final String[] dfa_149s = {
+            "\4\1\10\uffff\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\6\1\4\uffff\3\1\22\uffff\2\1\1\uffff\1\1\45\uffff\1\1\1\77\1\1\53\uffff\3\1\3\uffff\3\1\62\uffff\27\1\2\uffff\15\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_143 = DFA.unpackEncodedString(dfa_143s);
+    static final short[] dfa_144 = DFA.unpackEncodedString(dfa_144s);
+    static final char[] dfa_145 = DFA.unpackEncodedStringToUnsignedChars(dfa_145s);
+    static final char[] dfa_146 = DFA.unpackEncodedStringToUnsignedChars(dfa_146s);
+    static final short[] dfa_147 = DFA.unpackEncodedString(dfa_147s);
+    static final short[] dfa_148 = DFA.unpackEncodedString(dfa_148s);
+    static final short[][] dfa_149 = unpackEncodedStringArray(dfa_149s);
+
+    class DFA562 extends DFA {
+
+        public DFA562(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 562;
+            this.eot = dfa_143;
+            this.eof = dfa_144;
+            this.min = dfa_145;
+            this.max = dfa_146;
+            this.accept = dfa_147;
+            this.special = dfa_148;
+            this.transition = dfa_149;
+        }
+        public String getDescription() {
+            return "()* loopback of 25531:5: (otherlv_4= '*' ( (lv_operand_5_0= ruleUnaryExpression ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA562_63 = input.LA(1);
+
+                         
+                        int index562_63 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred886_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index562_63);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 562, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_150s = "\1\4\77\uffff\1\0\3\uffff";
+    static final String dfa_151s = "\1\u00ef\77\uffff\1\0\3\uffff";
+    static final String dfa_152s = "\100\uffff\1\0\3\uffff}>";
+    static final String[] dfa_153s = {
+            "\4\1\10\uffff\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\6\1\4\uffff\3\1\22\uffff\2\1\1\uffff\1\1\45\uffff\3\1\53\uffff\3\1\3\uffff\3\1\62\uffff\13\1\1\100\13\1\2\uffff\15\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_150 = DFA.unpackEncodedStringToUnsignedChars(dfa_150s);
+    static final char[] dfa_151 = DFA.unpackEncodedStringToUnsignedChars(dfa_151s);
+    static final short[] dfa_152 = DFA.unpackEncodedString(dfa_152s);
+    static final short[][] dfa_153 = unpackEncodedStringArray(dfa_153s);
+
+    class DFA563 extends DFA {
+
+        public DFA563(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 563;
+            this.eot = dfa_143;
+            this.eof = dfa_144;
+            this.min = dfa_150;
+            this.max = dfa_151;
+            this.accept = dfa_147;
+            this.special = dfa_152;
+            this.transition = dfa_153;
+        }
+        public String getDescription() {
+            return "()* loopback of 25602:5: (otherlv_9= '**' ( (lv_operand_10_0= ruleUnaryExpression ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA563_64 = input.LA(1);
+
+                         
+                        int index563_64 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred888_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index563_64);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 563, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_154s = "\1\4\100\uffff\1\0\2\uffff";
+    static final String dfa_155s = "\1\u00ef\100\uffff\1\0\2\uffff";
+    static final String dfa_156s = "\101\uffff\1\0\2\uffff}>";
+    static final String[] dfa_157s = {
+            "\4\1\10\uffff\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\6\1\4\uffff\3\1\22\uffff\2\1\1\uffff\1\1\45\uffff\3\1\53\uffff\3\1\3\uffff\3\1\62\uffff\14\1\1\101\12\1\2\uffff\15\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            ""
+    };
+    static final char[] dfa_154 = DFA.unpackEncodedStringToUnsignedChars(dfa_154s);
+    static final char[] dfa_155 = DFA.unpackEncodedStringToUnsignedChars(dfa_155s);
+    static final short[] dfa_156 = DFA.unpackEncodedString(dfa_156s);
+    static final short[][] dfa_157 = unpackEncodedStringArray(dfa_157s);
+
+    class DFA564 extends DFA {
+
+        public DFA564(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 564;
+            this.eot = dfa_143;
+            this.eof = dfa_144;
+            this.min = dfa_154;
+            this.max = dfa_155;
+            this.accept = dfa_147;
+            this.special = dfa_156;
+            this.transition = dfa_157;
+        }
+        public String getDescription() {
+            return "()* loopback of 25673:5: (otherlv_14= '/' ( (lv_operand_15_0= ruleUnaryExpression ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA564_65 = input.LA(1);
+
+                         
+                        int index564_65 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred890_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index564_65);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 564, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_158s = "\1\4\101\uffff\1\0\1\uffff";
+    static final String dfa_159s = "\1\u00ef\101\uffff\1\0\1\uffff";
+    static final String dfa_160s = "\102\uffff\1\0\1\uffff}>";
+    static final String[] dfa_161s = {
+            "\4\1\10\uffff\1\1\3\uffff\1\1\1\uffff\2\1\1\uffff\6\1\4\uffff\3\1\22\uffff\2\1\1\uffff\1\1\45\uffff\3\1\53\uffff\3\1\3\uffff\3\1\62\uffff\15\1\1\102\11\1\2\uffff\15\1",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            ""
+    };
+    static final char[] dfa_158 = DFA.unpackEncodedStringToUnsignedChars(dfa_158s);
+    static final char[] dfa_159 = DFA.unpackEncodedStringToUnsignedChars(dfa_159s);
+    static final short[] dfa_160 = DFA.unpackEncodedString(dfa_160s);
+    static final short[][] dfa_161 = unpackEncodedStringArray(dfa_161s);
+
+    class DFA565 extends DFA {
+
+        public DFA565(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 565;
+            this.eot = dfa_143;
+            this.eof = dfa_144;
+            this.min = dfa_158;
+            this.max = dfa_159;
+            this.accept = dfa_147;
+            this.special = dfa_160;
+            this.transition = dfa_161;
+        }
+        public String getDescription() {
+            return "()* loopback of 25744:5: (otherlv_19= '%' ( (lv_operand_20_0= ruleUnaryExpression ) ) )*";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA565_66 = input.LA(1);
+
+                         
+                        int index565_66 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred892_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index565_66);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 565, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_162s = "\1\4\2\uffff\1\0\15\uffff\1\0\3\uffff\13\0\4\uffff";
+    static final String dfa_163s = "\1\u00ef\2\uffff\1\0\15\uffff\1\0\3\uffff\13\0\4\uffff";
+    static final String dfa_164s = "\1\uffff\1\1\12\uffff\1\2\1\3\1\uffff\1\4\1\5\1\uffff\1\6\1\7\14\uffff\1\11\2\uffff\1\10";
+    static final String dfa_165s = "\3\uffff\1\0\15\uffff\1\1\3\uffff\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\4\uffff}>";
+    static final String[] dfa_166s = {
+            "\1\25\3\1\10\uffff\1\40\5\uffff\1\40\3\uffff\2\1\1\3\1\1\32\uffff\1\37\u009b\uffff\1\14\3\uffff\2\23\1\20\1\21\1\22\2\15\1\17\1\40\2\uffff\4\1\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_162 = DFA.unpackEncodedStringToUnsignedChars(dfa_162s);
+    static final char[] dfa_163 = DFA.unpackEncodedStringToUnsignedChars(dfa_163s);
+    static final short[] dfa_164 = DFA.unpackEncodedString(dfa_164s);
+    static final short[] dfa_165 = DFA.unpackEncodedString(dfa_165s);
+    static final short[][] dfa_166 = unpackEncodedStringArray(dfa_166s);
+
+    class DFA567 extends DFA {
+
+        public DFA567(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 567;
+            this.eot = dfa_79;
+            this.eof = dfa_79;
+            this.min = dfa_162;
+            this.max = dfa_163;
+            this.accept = dfa_164;
+            this.special = dfa_165;
+            this.transition = dfa_166;
+        }
+        public String getDescription() {
+            return "25789:2: (this_LiteralTerminalExpression_0= ruleLiteralTerminalExpression | this_ArithmeticUnaryExpression_1= ruleArithmeticUnaryExpression | this_LogicalUnaryExpression_2= ruleLogicalUnaryExpression | this_BitwiseUnaryExpression_3= ruleBitwiseUnaryExpression | this_NewfreshExpression_4= ruleNewfreshExpression | this_CastExpression_5= ruleCastExpression | this_PrefixUnaryExpression_6= rulePrefixUnaryExpression | this_PostfixUnaryExpression_7= rulePostfixUnaryExpression | this_PrimaryExpression_8= rulePrimaryExpression )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA567_3 = input.LA(1);
+
+                         
+                        int index567_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred894_InternalFormalML()) ) {s = 1;}
+
+                        else if ( (synpred895_InternalFormalML()) ) {s = 12;}
+
+                         
+                        input.seek(index567_3);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA567_17 = input.LA(1);
+
+                         
+                        int index567_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred898_InternalFormalML()) ) {s = 16;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_17);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA567_21 = input.LA(1);
+
+                         
+                        int index567_21 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_21);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 3 : 
+                        int LA567_22 = input.LA(1);
+
+                         
+                        int index567_22 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_22);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 4 : 
+                        int LA567_23 = input.LA(1);
+
+                         
+                        int index567_23 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_23);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 5 : 
+                        int LA567_24 = input.LA(1);
+
+                         
+                        int index567_24 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_24);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 6 : 
+                        int LA567_25 = input.LA(1);
+
+                         
+                        int index567_25 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_25);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 7 : 
+                        int LA567_26 = input.LA(1);
+
+                         
+                        int index567_26 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_26);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 8 : 
+                        int LA567_27 = input.LA(1);
+
+                         
+                        int index567_27 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_27);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 9 : 
+                        int LA567_28 = input.LA(1);
+
+                         
+                        int index567_28 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_28);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 10 : 
+                        int LA567_29 = input.LA(1);
+
+                         
+                        int index567_29 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_29);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 11 : 
+                        int LA567_30 = input.LA(1);
+
+                         
+                        int index567_30 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_30);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 12 : 
+                        int LA567_31 = input.LA(1);
+
+                         
+                        int index567_31 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred901_InternalFormalML()) ) {s = 35;}
+
+                        else if ( (true) ) {s = 32;}
+
+                         
+                        input.seek(index567_31);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 567, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_167s = "\106\uffff";
+    static final String dfa_168s = "\1\3\105\uffff";
+    static final String dfa_169s = "\1\4\2\0\103\uffff";
+    static final String dfa_170s = "\1\u00ef\2\0\103\uffff";
+    static final String dfa_171s = "\3\uffff\1\3\100\uffff\1\1\1\2";
+    static final String dfa_172s = "\1\uffff\1\0\1\1\103\uffff}>";
+    static final String[] dfa_173s = {
+            "\4\3\10\uffff\1\3\3\uffff\1\3\1\uffff\2\3\1\uffff\6\3\4\uffff\3\3\22\uffff\1\2\1\3\1\uffff\1\3\40\uffff\1\3\4\uffff\1\1\2\3\53\uffff\3\3\3\uffff\3\3\62\uffff\27\3\2\uffff\15\3",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_167 = DFA.unpackEncodedString(dfa_167s);
+    static final short[] dfa_168 = DFA.unpackEncodedString(dfa_168s);
+    static final char[] dfa_169 = DFA.unpackEncodedStringToUnsignedChars(dfa_169s);
+    static final char[] dfa_170 = DFA.unpackEncodedStringToUnsignedChars(dfa_170s);
+    static final short[] dfa_171 = DFA.unpackEncodedString(dfa_171s);
+    static final short[] dfa_172 = DFA.unpackEncodedString(dfa_172s);
+    static final short[][] dfa_173 = unpackEncodedStringArray(dfa_173s);
+
+    class DFA572 extends DFA {
+
+        public DFA572(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 572;
+            this.eot = dfa_167;
+            this.eof = dfa_168;
+            this.min = dfa_169;
+            this.max = dfa_170;
+            this.accept = dfa_171;
+            this.special = dfa_172;
+            this.transition = dfa_173;
+        }
+        public String getDescription() {
+            return "26520:4: ( ( ( (lv_kind_4_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_5_0= rulePositionalTupleExpressionList ) ) otherlv_6= ']' ) | ( ( (lv_kind_7_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_8_0= ruleMixTupleExpressionList ) ) otherlv_9= ')' ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA572_1 = input.LA(1);
+
+                         
+                        int index572_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred906_InternalFormalML()) ) {s = 68;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index572_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA572_2 = input.LA(1);
+
+                         
+                        int index572_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred907_InternalFormalML()) ) {s = 69;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index572_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 572, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_174s = "\105\uffff";
+    static final String dfa_175s = "\1\3\104\uffff";
+    static final String dfa_176s = "\1\4\2\0\102\uffff";
+    static final String dfa_177s = "\1\u00ef\2\0\102\uffff";
+    static final String dfa_178s = "\3\uffff\1\3\77\uffff\1\1\1\2";
+    static final String dfa_179s = "\1\uffff\1\0\1\1\102\uffff}>";
+    static final String[] dfa_180s = {
+            "\4\3\10\uffff\1\3\3\uffff\1\3\1\uffff\2\3\1\uffff\6\3\4\uffff\3\3\22\uffff\1\2\1\3\1\uffff\1\3\45\uffff\1\1\2\3\53\uffff\3\3\3\uffff\3\3\62\uffff\27\3\2\uffff\15\3",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_174 = DFA.unpackEncodedString(dfa_174s);
+    static final short[] dfa_175 = DFA.unpackEncodedString(dfa_175s);
+    static final char[] dfa_176 = DFA.unpackEncodedStringToUnsignedChars(dfa_176s);
+    static final char[] dfa_177 = DFA.unpackEncodedStringToUnsignedChars(dfa_177s);
+    static final short[] dfa_178 = DFA.unpackEncodedString(dfa_178s);
+    static final short[] dfa_179 = DFA.unpackEncodedString(dfa_179s);
+    static final short[][] dfa_180 = unpackEncodedStringArray(dfa_180s);
+
+    class DFA574 extends DFA {
+
+        public DFA574(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 574;
+            this.eot = dfa_174;
+            this.eof = dfa_175;
+            this.min = dfa_176;
+            this.max = dfa_177;
+            this.accept = dfa_178;
+            this.special = dfa_179;
+            this.transition = dfa_180;
+        }
+        public String getDescription() {
+            return "26646:4: ( ( ( (lv_kind_13_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_14_0= rulePositionalTupleExpressionList ) ) otherlv_15= ']' ) | ( ( (lv_kind_16_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_17_0= ruleMixTupleExpressionList ) ) otherlv_18= ')' ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA574_1 = input.LA(1);
+
+                         
+                        int index574_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred909_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index574_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA574_2 = input.LA(1);
+
+                         
+                        int index574_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred910_InternalFormalML()) ) {s = 68;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index574_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 574, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA575 extends DFA {
+
+        public DFA575(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 575;
+            this.eot = dfa_174;
+            this.eof = dfa_175;
+            this.min = dfa_176;
+            this.max = dfa_177;
+            this.accept = dfa_178;
+            this.special = dfa_179;
+            this.transition = dfa_180;
+        }
+        public String getDescription() {
+            return "26771:5: ( ( ( (lv_kind_22_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_23_0= rulePositionalTupleExpressionList ) ) otherlv_24= ']' ) | ( ( (lv_kind_25_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_26_0= ruleMixTupleExpressionList ) ) otherlv_27= ')' ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA575_1 = input.LA(1);
+
+                         
+                        int index575_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred911_InternalFormalML()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index575_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA575_2 = input.LA(1);
+
+                         
+                        int index575_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred912_InternalFormalML()) ) {s = 68;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index575_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 575, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_181s = "\1\5\1\uffff\1\5\1\u00d6\6\uffff";
+    static final String dfa_182s = "\1\u00e6\1\uffff\1\35\1\u00d6\6\uffff";
+    static final String dfa_183s = "\1\uffff\1\1\2\uffff\1\4\1\5\1\6\1\7\1\3\1\2";
+    static final String dfa_184s = "\3\uffff\1\0\6\uffff}>";
+    static final String[] dfa_185s = {
+            "\1\3\1\5\1\6\22\uffff\2\1\1\2\1\4\u00c5\uffff\4\7",
+            "",
+            "\1\3\27\uffff\1\4",
+            "\1\10",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final char[] dfa_181 = DFA.unpackEncodedStringToUnsignedChars(dfa_181s);
+    static final char[] dfa_182 = DFA.unpackEncodedStringToUnsignedChars(dfa_182s);
+    static final short[] dfa_183 = DFA.unpackEncodedString(dfa_183s);
+    static final short[] dfa_184 = DFA.unpackEncodedString(dfa_184s);
+    static final short[][] dfa_185 = unpackEncodedStringArray(dfa_185s);
+
+    class DFA590 extends DFA {
+
+        public DFA590(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 590;
+            this.eot = dfa_19;
+            this.eof = dfa_19;
+            this.min = dfa_181;
+            this.max = dfa_182;
+            this.accept = dfa_183;
+            this.special = dfa_184;
+            this.transition = dfa_185;
+        }
+        public String getDescription() {
+            return "27574:2: (this_LiteralBooleanExpression_0= ruleLiteralBooleanExpression | this_LiteralIntegerExpression_1= ruleLiteralIntegerExpression | this_LiteralRationalExpression_2= ruleLiteralRationalExpression | this_LiteralFloatExpression_3= ruleLiteralFloatExpression | this_LiteralCharacterExpression_4= ruleLiteralCharacterExpression | this_LiteralStringExpression_5= ruleLiteralStringExpression | this_LiteralNullExpression_6= ruleLiteralNullExpression )";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA590_3 = input.LA(1);
+
+                         
+                        int index590_3 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA590_3==214) ) {s = 8;}
+
+                        else if ( (synpred932_InternalFormalML()) ) {s = 9;}
+
+                        else if ( (synpred934_InternalFormalML()) ) {s = 4;}
+
+                         
+                        input.seek(index590_3);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 590, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_186s = "\132\uffff";
+    static final String dfa_187s = "\1\3\131\uffff";
+    static final String dfa_188s = "\1\4\2\0\127\uffff";
+    static final String dfa_189s = "\1\u00ef\2\0\127\uffff";
+    static final String dfa_190s = "\3\uffff\1\3\124\uffff\1\1\1\2";
+    static final String dfa_191s = "\1\uffff\1\0\1\1\127\uffff}>";
+    static final String[] dfa_192s = {
+            "\4\3\10\uffff\1\3\3\uffff\1\3\1\uffff\11\3\4\uffff\3\3\22\uffff\1\2\1\3\1\uffff\1\3\40\uffff\1\3\4\uffff\1\1\2\3\53\uffff\3\3\3\uffff\3\3\37\uffff\52\3\2\uffff\15\3",
+            "\1\uffff",
+            "\1\uffff",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+
+    static final short[] dfa_186 = DFA.unpackEncodedString(dfa_186s);
+    static final short[] dfa_187 = DFA.unpackEncodedString(dfa_187s);
+    static final char[] dfa_188 = DFA.unpackEncodedStringToUnsignedChars(dfa_188s);
+    static final char[] dfa_189 = DFA.unpackEncodedStringToUnsignedChars(dfa_189s);
+    static final short[] dfa_190 = DFA.unpackEncodedString(dfa_190s);
+    static final short[] dfa_191 = DFA.unpackEncodedString(dfa_191s);
+    static final short[][] dfa_192 = unpackEncodedStringArray(dfa_192s);
+
+    class DFA600 extends DFA {
+
+        public DFA600(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 600;
+            this.eot = dfa_186;
+            this.eof = dfa_187;
+            this.min = dfa_188;
+            this.max = dfa_189;
+            this.accept = dfa_190;
+            this.special = dfa_191;
+            this.transition = dfa_192;
+        }
+        public String getDescription() {
+            return "28328:3: ( ( ( (lv_kind_2_0= ruleValueIndexExpressionKind ) ) ( (lv_arg_3_0= rulePositionalTupleExpressionList ) ) otherlv_4= ']' ) | ( ( (lv_kind_5_0= ruleValueParameterExpressionKind ) ) ( (lv_arg_6_0= ruleMixTupleExpressionList ) ) otherlv_7= ')' ) )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA600_1 = input.LA(1);
+
+                         
+                        int index600_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred948_InternalFormalML()) ) {s = 88;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index600_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA600_2 = input.LA(1);
+
+                         
+                        int index600_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred949_InternalFormalML()) ) {s = 89;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index600_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 600, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+    
+    private static class FollowSets000 {
+        public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+        public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+        public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x00000003000C0000L,0x0000000000000000L,0x0000000000000000L,0x0007000000000000L});
+        public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000010000L});
+        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x00000000000C0000L});
+        public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000020000L});
+        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000200002L});
+        public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000100002L});
+        public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x00000000300000A0L});
+        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000400000L});
+        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000800010L});
+        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000001000000L});
+        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x010000003C4100F0L,0x0000000000000000L,0x0000000000000000L,0x0000FFF9FF100000L});
+        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000002000000L});
+        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000000020L});
+        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000020000020L});
+        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000020000000L});
+        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x00000000E0000002L});
+        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000010L});
+        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000010010L});
+        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000001C00000000L});
+        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000001800000000L});
+        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000002000000000L});
+        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000000400080L});
+        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x040FFFC000880000L,0x00000020E0800120L,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000000080000L,0x0000000060000000L,0x0000000000000000L,0x0007000000000000L});
+        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x000FFC0000880000L,0x00000000E0000120L,0x0000000000000000L,0x0007000000000000L});
+        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0070000300080000L,0x0000000000000000L,0x0000000000000000L,0x001F000000000000L});
+        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x007FE00300880000L,0x0000000080000120L,0x0000000000000000L,0x001F000000000000L});
+        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x006FE00300880000L,0x0000000080000120L,0x0000000000000000L,0x001F000000000000L});
+        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0060000300080000L,0x0000000000000000L,0x0000000000000000L,0x001F000000000000L});
+        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x006C000300880000L,0x0000000080000120L,0x0000000000000000L,0x001F000000000000L});
+        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000000000800000L});
+        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0060000000010000L});
+        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0080000000000010L});
+        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0100000002400080L});
+        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0100000002400000L});
+        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0200000000000010L});
+        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0200000000100000L});
+        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000000040000000L});
+        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0020000300080000L,0x0000000000000000L,0x0000000000000000L,0x001F000000000000L});
+        public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0400000000000000L});
+        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0900000000400080L});
+        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0900000000400000L});
+        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x42A0000010000010L,0xFFFFFBC000000001L,0x0000000000000700L,0x0000000003100000L,0x0000000000007FF0L});
+        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x40A0000010000010L,0xFFFFFBC000000001L,0x0000000000000700L,0x0000000003100000L,0x0000000000007FF0L});
+        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0800000000400000L});
+        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x41A0000010000010L,0xFFFFFBC000000001L,0x0000000000000700L,0x0000000003100000L,0x0000000000007FF0L});
+        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x140FFFC000880000L,0x00000020EFC01FFEL,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0xE40FFFC000880000L,0x00000020EFC01FFFL,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000400000L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000000800000L,0x0000000000000000L,0x0000000000000010L});
+        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x040FFFC000880000L,0x00000020EFC01FFEL,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x040FFFC000C80000L,0x00000020EFC01FFEL,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x040FFFC000880000L,0x00000020EFC01FE0L,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x00081C0000880000L,0x000000006F401EE0L,0x0000000000000000L,0x0007000000000000L});
+        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0008000000800000L,0x0000000000000EE0L});
+        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000800000L,0x00000000000000E0L});
+        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000002L,0x00000000000000C0L});
+        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0100000000400000L,0x0000000010000000L});
+        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000080002L,0x00000020A0800020L,0x0000000000000F5FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000002L,0x0000000080000020L});
+        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0040000300080000L,0x0000000000000000L,0x0000000000000000L,0x001F000000000000L});
+        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x140FFFC000880000L,0x00000020EFC01F3EL,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0xE40FFFC000880000L,0x00000020EFC01F3FL,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x040FFFC000880000L,0x00000020EFC01F3EL,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x040FFFC000C80000L,0x00000020EFC01F3EL,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x040FFFC000880000L,0x00000020EFC01F20L,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x00081C0000080000L,0x000000006F401E00L,0x0000000000000000L,0x0007000000000000L});
+        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0008000000800000L,0x0000000080000E20L});
+        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000800000L,0x0000000080000020L});
+        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000000L,0x000000000F401000L});
+        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000020080L});
+        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000002L,0x000000000F401000L});
+        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000002400080L});
+        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000002400000L});
+        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0008000000000000L,0x000000000F403E20L});
+        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0008000000800000L,0x0000000000002E20L});
+        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0008000000800000L,0x00000000000FEEE0L});
+        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0008000000800000L,0x0000000000002E20L,0x0000000000001008L});
+        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000800000L,0x00000000000FC0C0L,0x0000000000001008L});
+        public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000400000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000800000L,0x00000000000B0000L,0x0000000000001008L});
+        public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000400000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000000800000L,0x00000000000B4000L,0x0000000000001008L});
+        public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000400000000L,0x0000000000800000L});
+        public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000000L,0x0000000000800000L});
+        public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000800000L,0x0000000000018000L});
+        public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000400000000L,0x8000000000000000L,0x0000000000000000L,0x0FE0000000000000L});
+        public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000800000L,0x0000000000000000L,0x0000000000001008L});
+        public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000400000000L,0x0000000000000000L,0x0000000000000000L,0x1000000000000000L});
+        public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000010L,0x000000000C000000L});
+        public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000400000000L,0x0000000000000001L,0x0000000000000000L,0x2000000000000000L});
+        public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000080002L,0x00000000600FC0C0L,0x0000000000000000L,0x0007000000000000L});
+        public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000000080002L,0x0000000060000000L,0x0000000000000000L,0x0007000000000000L});
+        public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0200000000000000L});
+        public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000000000000L,0x0000000060000000L});
+        public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
+        public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0900000000400080L,0x0000000010000000L});
+        public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0900000000400000L,0x0000000010000000L});
+        public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000002L,0x0000001100000000L});
+        public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0080000000000010L,0x0000000000000000L,0x0000000000000100L,0xC000800000000000L,0x0000000000001E00L});
+        public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000010L,0x0000000200000000L});
+        public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000080L,0x0000000200000000L});
+        public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000000000000L,0x0000000200000000L});
+        public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0080000000000010L,0x0000000400000000L});
+        public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L});
+        public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000100000L,0x0000000800000000L});
+        public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000040010002L});
+        public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0080000000000010L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000001E00L});
+        public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0080000000000010L,0x0000000000000000L,0x0000000000000100L,0xC000800000000000L,0x0000000000001E0FL});
+        public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000400010L});
+        public static final BitSet FOLLOW_116 = new BitSet(new long[]{0xE000000000000000L});
+        public static final BitSet FOLLOW_117 = new BitSet(new long[]{0xE000000000800000L});
+        public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000010002L});
+        public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000410010L,0x0000000000000000L,0x0000000000000000L,0x0000FE0000000000L});
+        public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0080000000000010L,0x0000000000000000L,0x0000000000000100L,0x0000000000000000L,0x0000000000001E00L});
+        public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000400010L,0x0000000000000000L,0x0000000000000000L,0x0000FE0000000000L});
+        public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000000000000L,0x0000FE0000000000L});
+        public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000020000002L,0x0000000010000000L});
+        public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000020000000L,0x0000000010000000L});
+        public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000000000002L,0x0000000200000000L});
+        public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000010000030L});
+        public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
+        public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x00A0000010000090L,0x07FFFBC000000000L,0x0000000000000700L,0x0000000003100000L,0x0000000000000030L});
+        public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x00A0000010000010L,0x07FFFBC000000000L,0x0000000000000700L,0x0000000003100000L,0x0000000000000030L});
+        public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000000002000000L,0x0000000200000000L});
+        public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0000000000000000L,0x000003C000000000L});
+        public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000010000020L});
+        public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000000010000020L,0x0000040000000000L});
+        public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000000000000L,0x0000780000000000L});
+        public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x0000000000000000L,0x0007800000000000L});
+        public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000000000000000L,0x0018000000000000L});
+        public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0000000010010002L,0x001FFBC000000000L,0x0000000000000000L,0x0000000003100000L});
+        public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000000010000000L,0x001FFBC000000000L,0x0000000000000000L,0x0000000003100000L});
+        public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000010000000L,0x007FFBC000000000L,0x0000000000000000L,0x0000000003100000L});
+        public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x0000000000000000L,0x0000000A00000000L});
+        public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000000100000L});
+        public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x0000000000000080L,0x0800000000000000L});
+        public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
+        public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000002000100000L});
+        public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x0000000010000020L,0x0000000400000000L});
+        public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0020000010000080L,0x0FFFFBC000000000L,0x0000000000000700L,0x0000000003100000L,0x0000000000001FF0L});
+        public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0020000010000000L,0x0FFFFBC000000000L,0x0000000000000700L,0x0000000003100000L,0x0000000000001FF0L});
+        public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x0000000000900000L});
+        public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x0000000000000080L,0x1000000000000000L});
+        public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
+        public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x0000000001000082L});
+        public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x0000000001000002L});
+        public static final BitSet FOLLOW_153 = new BitSet(new long[]{0x000000003C0000E0L,0x0000000000000000L,0x0000000000000000L,0x0000007800000000L});
+        public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0000000000080000L,0x0000002020800000L,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_155 = new BitSet(new long[]{0x0000000000880000L,0x0000002020800000L,0x0000000000000F7FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_156 = new BitSet(new long[]{0x0000000000000080L,0x2000000000000000L});
+        public static final BitSet FOLLOW_157 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L});
+        public static final BitSet FOLLOW_158 = new BitSet(new long[]{0x0000000000000080L,0x4000000000000000L});
+        public static final BitSet FOLLOW_159 = new BitSet(new long[]{0x0000000000000000L,0x4000000000000000L});
+        public static final BitSet FOLLOW_160 = new BitSet(new long[]{0x0000000000000080L,0x8000000000000000L});
+        public static final BitSet FOLLOW_161 = new BitSet(new long[]{0x0000000000000000L,0x8000000000000000L});
+        public static final BitSet FOLLOW_162 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L,0x000000000000000FL});
+        public static final BitSet FOLLOW_163 = new BitSet(new long[]{0x0000000000080000L,0x0000000020800000L,0x000000000000007FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_164 = new BitSet(new long[]{0x40A0000010000010L,0xFFFFFBC020000001L,0x0000000000000710L,0x0000000003100000L,0x0000000000007FF0L});
+        public static final BitSet FOLLOW_165 = new BitSet(new long[]{0x40A0000010000010L,0xFFFFFBC000000001L,0x0000000000000710L,0x0000000003100000L,0x0000000000007FF0L});
+        public static final BitSet FOLLOW_166 = new BitSet(new long[]{0x40A0000010000010L,0xFFFFFBC000000001L,0x0000000000000730L,0x0000000003100000L,0x0000000000007FF0L});
+        public static final BitSet FOLLOW_167 = new BitSet(new long[]{0x0000000003400080L});
+        public static final BitSet FOLLOW_168 = new BitSet(new long[]{0x0000000003400000L});
+        public static final BitSet FOLLOW_169 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+        public static final BitSet FOLLOW_170 = new BitSet(new long[]{0x0000000000000000L,0x0000000020800000L,0x0000000000000050L});
+        public static final BitSet FOLLOW_171 = new BitSet(new long[]{0x0000000001000012L});
+        public static final BitSet FOLLOW_172 = new BitSet(new long[]{0x0000000003000080L});
+        public static final BitSet FOLLOW_173 = new BitSet(new long[]{0x0000000003000000L});
+        public static final BitSet FOLLOW_174 = new BitSet(new long[]{0x0000002010000020L,0x0000000400000000L});
+        public static final BitSet FOLLOW_175 = new BitSet(new long[]{0x0000000000080000L,0x0000000000800000L,0x000000000000010FL,0x0007000000000000L});
+        public static final BitSet FOLLOW_176 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000001E00L});
+        public static final BitSet FOLLOW_177 = new BitSet(new long[]{0x0000000002000080L});
+        public static final BitSet FOLLOW_178 = new BitSet(new long[]{0x0000000000000000L,0x0000000000800000L,0x000000000000010FL});
+        public static final BitSet FOLLOW_179 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
+        public static final BitSet FOLLOW_180 = new BitSet(new long[]{0xE000000000000010L});
+        public static final BitSet FOLLOW_181 = new BitSet(new long[]{0x0100000002000080L});
+        public static final BitSet FOLLOW_182 = new BitSet(new long[]{0x0100000002000000L});
+        public static final BitSet FOLLOW_183 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000400L});
+        public static final BitSet FOLLOW_184 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_185 = new BitSet(new long[]{0xE000000000800010L});
+        public static final BitSet FOLLOW_186 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000001000L});
+        public static final BitSet FOLLOW_187 = new BitSet(new long[]{0x0800000000410010L});
+        public static final BitSet FOLLOW_188 = new BitSet(new long[]{0x0800000000400010L});
+        public static final BitSet FOLLOW_189 = new BitSet(new long[]{0x0800000000400080L});
+        public static final BitSet FOLLOW_190 = new BitSet(new long[]{0xA180000000C00010L,0x0000000010A00001L,0x007D0FFFFF91E000L,0x0000FF800F000000L,0x00000000FFFF8000L});
+        public static final BitSet FOLLOW_191 = new BitSet(new long[]{0x2000000000000000L,0x0000000000000000L,0x000000000091C000L});
+        public static final BitSet FOLLOW_192 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000818000L});
+        public static final BitSet FOLLOW_193 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000010000L});
+        public static final BitSet FOLLOW_194 = new BitSet(new long[]{0xA180000000C00010L,0x0000000010A00001L,0x007D0F0000000000L,0x0000FF800F000000L,0x00000000FFFF8000L});
+        public static final BitSet FOLLOW_195 = new BitSet(new long[]{0x0800000000000002L});
+        public static final BitSet FOLLOW_196 = new BitSet(new long[]{0x0000000410000020L,0x0000000000900000L,0x00000000000C0000L,0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_197 = new BitSet(new long[]{0x0000000000000000L,0x0000000000900000L,0x0000000000040000L,0x0000000000000000L,0x0000000000008000L});
+        public static final BitSet FOLLOW_198 = new BitSet(new long[]{0x0000002000100000L,0x0000000000000000L,0x0000000000020000L});
+        public static final BitSet FOLLOW_199 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000040000L});
+        public static final BitSet FOLLOW_200 = new BitSet(new long[]{0x0000000010000020L,0x0000000000000000L,0x0000000000080000L});
+        public static final BitSet FOLLOW_201 = new BitSet(new long[]{0xA180000000400012L,0x0000000010A00001L,0x007D0F0000000000L,0x0000FF800F000000L,0x00000000FFFF8000L});
+        public static final BitSet FOLLOW_202 = new BitSet(new long[]{0x0000001800000000L,0x0000000000000000L,0x0000000000600000L});
+        public static final BitSet FOLLOW_203 = new BitSet(new long[]{0x010000003C4100F0L,0x0000000200000000L,0x00000D0000000000L,0x0000FFF9FF100000L});
+        public static final BitSet FOLLOW_204 = new BitSet(new long[]{0x010000003C4100F2L,0x0000000000000000L,0x0000000000000000L,0x0000FFF9FF100000L});
+        public static final BitSet FOLLOW_205 = new BitSet(new long[]{0x010000003C4100F0L,0x0000000000000000L,0x0000020000000000L,0x0000FFF9FF100000L});
+        public static final BitSet FOLLOW_206 = new BitSet(new long[]{0xA180000000C00010L,0x0000000010A00001L,0x007D0FFFFF000000L,0x0000FF800F000000L,0x00000000FFFF8000L});
+        public static final BitSet FOLLOW_207 = new BitSet(new long[]{0x0100000002000000L,0x0000000000000000L,0x0000700000000000L});
+        public static final BitSet FOLLOW_208 = new BitSet(new long[]{0x0000000002000000L,0x0000000000000000L,0x0000700000000000L});
+        public static final BitSet FOLLOW_209 = new BitSet(new long[]{0x0900000002000000L,0x0000000000000000L,0x0000C00000000000L});
+        public static final BitSet FOLLOW_210 = new BitSet(new long[]{0x0800000002000000L,0x0000000000000000L,0x0000C00000000000L});
+        public static final BitSet FOLLOW_211 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0002000000040000L});
+        public static final BitSet FOLLOW_212 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0001000000000000L});
+        public static final BitSet FOLLOW_213 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0004000000000000L});
+        public static final BitSet FOLLOW_214 = new BitSet(new long[]{0x0100000002000010L,0x0000000000000000L,0x0000000000000000L,0x0000FF8003000000L});
+        public static final BitSet FOLLOW_215 = new BitSet(new long[]{0x0100000000400010L,0x0000000010000000L,0x0000000000000000L,0x0000FF8003000000L});
+        public static final BitSet FOLLOW_216 = new BitSet(new long[]{0x0100000000000000L});
+        public static final BitSet FOLLOW_217 = new BitSet(new long[]{0x0300000000000010L,0x0000000000000000L,0x0000000000000000L,0x0000FF8003000000L});
+        public static final BitSet FOLLOW_218 = new BitSet(new long[]{0x0100000000000010L,0x0000000000000000L,0x0000000000000000L,0x0000FF8000000000L});
+        public static final BitSet FOLLOW_219 = new BitSet(new long[]{0x010000003E4100F0L,0x0000000000000000L,0x0000000000000000L,0x0000FFF9FF100000L});
+        public static final BitSet FOLLOW_220 = new BitSet(new long[]{0x030000003C4100F0L,0x0000000000000000L,0x0000000000000000L,0x0000FFF9FF100000L});
+        public static final BitSet FOLLOW_221 = new BitSet(new long[]{0x0800000002000000L});
+        public static final BitSet FOLLOW_222 = new BitSet(new long[]{0x0100000000000100L});
+        public static final BitSet FOLLOW_223 = new BitSet(new long[]{0x0000000002100000L});
+        public static final BitSet FOLLOW_224 = new BitSet(new long[]{0x0000000000000100L});
+        public static final BitSet FOLLOW_225 = new BitSet(new long[]{0x090000003E4100F0L,0x0000000000000000L,0x0000000000000000L,0x0000FFF9FF100000L});
+        public static final BitSet FOLLOW_226 = new BitSet(new long[]{0x0000000001000000L,0x0000000000000000L,0xFF80000000000000L,0x00000000000003FFL});
+        public static final BitSet FOLLOW_227 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000000L,0x0000000000000000L,0x0000FF8000000000L});
+        public static final BitSet FOLLOW_228 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000400L});
+        public static final BitSet FOLLOW_229 = new BitSet(new long[]{0x0000001000000002L,0x0000000000000000L,0x0000000000400000L});
+        public static final BitSet FOLLOW_230 = new BitSet(new long[]{0x0000000800000002L,0x0000000000000000L,0x0000000000200000L});
+        public static final BitSet FOLLOW_231 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000000800L});
+        public static final BitSet FOLLOW_232 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000001000L});
+        public static final BitSet FOLLOW_233 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000020000L});
+        public static final BitSet FOLLOW_234 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x000000000003E000L});
+        public static final BitSet FOLLOW_235 = new BitSet(new long[]{0x0000002000010002L,0x0000000000000000L,0x0000000000000000L,0x00000000000C0000L});
+        public static final BitSet FOLLOW_236 = new BitSet(new long[]{0x0000000010000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_237 = new BitSet(new long[]{0x0000000000000002L,0x0000000400000000L,0x0000000000000000L,0x0000000000E00000L});
+        public static final BitSet FOLLOW_238 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000003000000L});
+        public static final BitSet FOLLOW_239 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000004000000L});
+        public static final BitSet FOLLOW_240 = new BitSet(new long[]{0x0100000020000002L,0x0000000210000000L});
+        public static final BitSet FOLLOW_241 = new BitSet(new long[]{0x0100000020000002L,0x0000000200000000L});
+        public static final BitSet FOLLOW_242 = new BitSet(new long[]{0x0000000020000002L});
+        public static final BitSet FOLLOW_243 = new BitSet(new long[]{0x0100000000400002L});
+        public static final BitSet FOLLOW_244 = new BitSet(new long[]{0x0000000040000000L,0x0000000000000000L,0x0000000000000000L,0x0000000600000000L});
+        public static final BitSet FOLLOW_245 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000000L,0x0000000000400000L});
+        public static final BitSet FOLLOW_246 = new BitSet(new long[]{0x010000003CC100F0L,0x0000000000000000L,0x0000000000000000L,0x0000FFF9FF100000L});
+        public static final BitSet FOLLOW_247 = new BitSet(new long[]{0x0100000000000002L,0x0000000200000000L});
+        public static final BitSet FOLLOW_248 = new BitSet(new long[]{0x0000000020000002L,0x0000000210000000L});
+        public static final BitSet FOLLOW_249 = new BitSet(new long[]{0x0000000020000002L,0x0000000200000000L});
+        public static final BitSet FOLLOW_250 = new BitSet(new long[]{0x0000000000000002L,0x0000000020800000L,0x0000000000000040L});
+        public static final BitSet FOLLOW_251 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+        public static final BitSet FOLLOW_252 = new BitSet(new long[]{0x0000000010000002L});
+    }
+
+
+}
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/scoping/AbstractFormalMLScopeProvider.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/scoping/AbstractFormalMLScopeProvider.java
new file mode 100644
index 0000000..4f3f74c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/scoping/AbstractFormalMLScopeProvider.java
@@ -0,0 +1,18 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.scoping;
+
+import org.eclipse.xtext.scoping.impl.DelegatingScopeProvider;
+
+public abstract class AbstractFormalMLScopeProvider extends DelegatingScopeProvider {
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/serializer/FormalMLSemanticSequencer.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/serializer/FormalMLSemanticSequencer.java
new file mode 100644
index 0000000..67cd008
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/serializer/FormalMLSemanticSequencer.java
@@ -0,0 +1,5621 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.serializer;
+
+import com.google.inject.Inject;
+import java.util.Set;
+import org.eclipse.efm.ecore.formalml.FormalmlPackage;
+import org.eclipse.efm.ecore.formalml.XliaAttribute;
+import org.eclipse.efm.ecore.formalml.XliaModel;
+import org.eclipse.efm.ecore.formalml.XliaObject;
+import org.eclipse.efm.ecore.formalml.common.CommonPackage;
+import org.eclipse.efm.ecore.formalml.common.QualifiedName;
+import org.eclipse.efm.ecore.formalml.datatype.ChoiceType;
+import org.eclipse.efm.ecore.formalml.datatype.CollectionType;
+import org.eclipse.efm.ecore.formalml.datatype.DataTypeReference;
+import org.eclipse.efm.ecore.formalml.datatype.DatatypePackage;
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral;
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationType;
+import org.eclipse.efm.ecore.formalml.datatype.IntervalType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType;
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType;
+import org.eclipse.efm.ecore.formalml.datatype.StructureType;
+import org.eclipse.efm.ecore.formalml.datatype.UnionType;
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.AssignmentExpression;
+import org.eclipse.efm.ecore.formalml.expression.BitwiseAssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.BitwiseUnaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.CastExpression;
+import org.eclipse.efm.ecore.formalml.expression.ConditionalTestExpression;
+import org.eclipse.efm.ecore.formalml.expression.EqualityBinaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionAsMachine;
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage;
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPostfixExpression;
+import org.eclipse.efm.ecore.formalml.expression.IncrementOrDecrementPrefixExpression;
+import org.eclipse.efm.ecore.formalml.expression.InstantiationExpression;
+import org.eclipse.efm.ecore.formalml.expression.InvokeExpression;
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralCollectionExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement;
+import org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralTimeDeltaExpression;
+import org.eclipse.efm.ecore.formalml.expression.LiteralTimeExpression;
+import org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression;
+import org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.MixTupleExpression;
+import org.eclipse.efm.ecore.formalml.expression.NamedExpression;
+import org.eclipse.efm.ecore.formalml.expression.NewfreshExpression;
+import org.eclipse.efm.ecore.formalml.expression.PositionalTupleExpression;
+import org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.RelationalTernaryExpression;
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification;
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer;
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint;
+import org.eclipse.efm.ecore.formalml.infrastructure.ComProtocol;
+import org.eclipse.efm.ecore.formalml.infrastructure.Connection;
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage;
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfComputation;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution;
+import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction;
+import org.eclipse.efm.ecore.formalml.infrastructure.Modifier;
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet;
+import org.eclipse.efm.ecore.formalml.infrastructure.Port;
+import org.eclipse.efm.ecore.formalml.infrastructure.Procedure;
+import org.eclipse.efm.ecore.formalml.infrastructure.Route;
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal;
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty;
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
+import org.eclipse.efm.ecore.formalml.statemachine.FinalState;
+import org.eclipse.efm.ecore.formalml.statemachine.Pseudostate;
+import org.eclipse.efm.ecore.formalml.statemachine.Region;
+import org.eclipse.efm.ecore.formalml.statemachine.StartState;
+import org.eclipse.efm.ecore.formalml.statemachine.State;
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine;
+import org.eclipse.efm.ecore.formalml.statemachine.StatemachinePackage;
+import org.eclipse.efm.ecore.formalml.statemachine.Transition;
+import org.eclipse.efm.ecore.formalml.statemachine.TransitionMoe;
+import org.eclipse.efm.ecore.formalml.statement.ActivityStatement;
+import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.CheckSatGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement;
+import org.eclipse.efm.ecore.formalml.statement.DoWhileStatement;
+import org.eclipse.efm.ecore.formalml.statement.EventGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.ExpressionStatement;
+import org.eclipse.efm.ecore.formalml.statement.ForEachStatement;
+import org.eclipse.efm.ecore.formalml.statement.ForStatement;
+import org.eclipse.efm.ecore.formalml.statement.GuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.IfStatement;
+import org.eclipse.efm.ecore.formalml.statement.InputComStatement;
+import org.eclipse.efm.ecore.formalml.statement.InterruptStatement;
+import org.eclipse.efm.ecore.formalml.statement.InvokeStatement;
+import org.eclipse.efm.ecore.formalml.statement.OutputComStatement;
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage;
+import org.eclipse.efm.ecore.formalml.statement.TimedGuardStatement;
+import org.eclipse.efm.ecore.formalml.statement.WhileDoStatement;
+import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Parameter;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.serializer.ISerializationContext;
+import org.eclipse.xtext.serializer.acceptor.SequenceFeeder;
+import org.eclipse.xtext.serializer.sequencer.AbstractDelegatingSemanticSequencer;
+import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient;
+
+@SuppressWarnings("all")
+public class FormalMLSemanticSequencer extends AbstractDelegatingSemanticSequencer {
+
+	@Inject
+	private FormalMLGrammarAccess grammarAccess;
+	
+	@Override
+	public void sequence(ISerializationContext context, EObject semanticObject) {
+		EPackage epackage = semanticObject.eClass().getEPackage();
+		ParserRule rule = context.getParserRule();
+		Action action = context.getAssignedAction();
+		Set<Parameter> parameters = context.getEnabledBooleanParameters();
+		if (epackage == CommonPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case CommonPackage.QUALIFIED_NAME:
+				if (rule == grammarAccess.getColonQualifiedNameRule()) {
+					sequence_ColonQualifiedName_UnqualifiedName(context, (QualifiedName) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getDotQualifiedNameRule()) {
+					sequence_DotQualifiedName_UnqualifiedName(context, (QualifiedName) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getPotentiallyAmbiguousQualifiedNameRule()) {
+					sequence_PotentiallyAmbiguousQualifiedName_UnqualifiedName(context, (QualifiedName) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getQualifiedNameRule()) {
+					sequence_QualifiedName_UnqualifiedName(context, (QualifiedName) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getUnqualifiedNameRule()) {
+					sequence_UnqualifiedName(context, (QualifiedName) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if (epackage == DatatypePackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case DatatypePackage.CHOICE_TYPE:
+				if (rule == grammarAccess.getTypeDefinitionImplRule()
+						|| rule == grammarAccess.getChoiceTypeDefinitionImplRule()) {
+					sequence_ChoiceTypeDefinitionImpl(context, (ChoiceType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTypeDefinitionRule()
+						|| rule == grammarAccess.getChoiceTypeDefinitionRule()) {
+					sequence_ChoiceTypeDefinition(context, (ChoiceType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getDataTypeRule()
+						|| rule == grammarAccess.getStructuredDataTypeRule()
+						|| rule == grammarAccess.getChoiceTypeRule()) {
+					sequence_ChoiceType(context, (ChoiceType) semanticObject); 
+					return; 
+				}
+				else break;
+			case DatatypePackage.COLLECTION_TYPE:
+				if (rule == grammarAccess.getBufferContainerTypeRule()) {
+					sequence_BufferContainerType(context, (CollectionType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTypeDefinitionImplRule()
+						|| rule == grammarAccess.getCollectionTypeDefinitionImplRule()) {
+					sequence_CollectionTypeDefinitionImpl(context, (CollectionType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTypeDefinitionRule()
+						|| rule == grammarAccess.getCollectionTypeDefinitionRule()) {
+					sequence_CollectionTypeDefinition(context, (CollectionType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getDataTypeReferenceRule()
+						|| action == grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0()
+						|| rule == grammarAccess.getDataTypeRule()
+						|| rule == grammarAccess.getSimpleDataTypeRule()
+						|| rule == grammarAccess.getCollectionTypeRule()) {
+					sequence_CollectionType(context, (CollectionType) semanticObject); 
+					return; 
+				}
+				else break;
+			case DatatypePackage.DATA_TYPE_REFERENCE:
+				if (rule == grammarAccess.getDataTypeReferenceRule()
+						|| rule == grammarAccess.getDataTypeRule()) {
+					sequence_DataTypeReference(context, (DataTypeReference) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTypeDefinitionImplRule()
+						|| rule == grammarAccess.getOtherDataTypeDefinitionImplRule()) {
+					sequence_OtherDataTypeDefinitionImpl(context, (DataTypeReference) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTypeDefinitionRule()
+						|| rule == grammarAccess.getOtherDataTypeDefinitionRule()) {
+					sequence_OtherDataTypeDefinition(context, (DataTypeReference) semanticObject); 
+					return; 
+				}
+				else break;
+			case DatatypePackage.ENUMERATION_LITERAL:
+				sequence_EnumerationLiteral(context, (EnumerationLiteral) semanticObject); 
+				return; 
+			case DatatypePackage.ENUMERATION_TYPE:
+				if (rule == grammarAccess.getTypeDefinitionImplRule()
+						|| rule == grammarAccess.getEnumerationTypeDefinitionImplRule()) {
+					sequence_EnumerationTypeDefinitionImpl(context, (EnumerationType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTypeDefinitionRule()
+						|| rule == grammarAccess.getEnumerationTypeDefinitionRule()) {
+					sequence_EnumerationTypeDefinition(context, (EnumerationType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getDataTypeRule()
+						|| rule == grammarAccess.getStructuredDataTypeRule()
+						|| rule == grammarAccess.getEnumerationTypeRule()) {
+					sequence_EnumerationType(context, (EnumerationType) semanticObject); 
+					return; 
+				}
+				else break;
+			case DatatypePackage.INTERVAL_TYPE:
+				if (rule == grammarAccess.getTypeDefinitionImplRule()
+						|| rule == grammarAccess.getIntervalTypeDefinitionImplRule()) {
+					sequence_IntervalTypeDefinitionImpl(context, (IntervalType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTypeDefinitionRule()
+						|| rule == grammarAccess.getIntervalTypeDefinitionRule()) {
+					sequence_IntervalTypeDefinition(context, (IntervalType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getDataTypeReferenceRule()
+						|| action == grammarAccess.getDataTypeReferenceAccess().getDataTypeReferenceSupportAction_0_1_0()
+						|| rule == grammarAccess.getDataTypeRule()
+						|| rule == grammarAccess.getSimpleDataTypeRule()
+						|| rule == grammarAccess.getIntervalTypeRule()) {
+					sequence_IntervalType(context, (IntervalType) semanticObject); 
+					return; 
+				}
+				else break;
+			case DatatypePackage.PRIMITIVE_BOOLEAN_TYPE:
+				sequence_PrimitiveBooleanType(context, (PrimitiveBooleanType) semanticObject); 
+				return; 
+			case DatatypePackage.PRIMITIVE_CHARACTER_TYPE:
+				sequence_PrimitiveCharacterType(context, (PrimitiveCharacterType) semanticObject); 
+				return; 
+			case DatatypePackage.PRIMITIVE_FLOAT_TYPE:
+				sequence_PrimitiveFloatType(context, (PrimitiveFloatType) semanticObject); 
+				return; 
+			case DatatypePackage.PRIMITIVE_INSTANCE_TYPE:
+				sequence_PrimitiveInstanceType(context, (PrimitiveInstanceType) semanticObject); 
+				return; 
+			case DatatypePackage.PRIMITIVE_INTEGER_TYPE:
+				sequence_PrimitiveIntegerType(context, (PrimitiveIntegerType) semanticObject); 
+				return; 
+			case DatatypePackage.PRIMITIVE_RATIONAL_TYPE:
+				sequence_PrimitiveRationalType(context, (PrimitiveRationalType) semanticObject); 
+				return; 
+			case DatatypePackage.PRIMITIVE_REAL_TYPE:
+				sequence_PrimitiveRealType(context, (PrimitiveRealType) semanticObject); 
+				return; 
+			case DatatypePackage.PRIMITIVE_STRING_TYPE:
+				sequence_PrimitiveStringType(context, (PrimitiveStringType) semanticObject); 
+				return; 
+			case DatatypePackage.PRIMITIVE_TIME_TYPE:
+				sequence_PrimitiveTimeType(context, (PrimitiveTimeType) semanticObject); 
+				return; 
+			case DatatypePackage.STRUCTURE_TYPE:
+				if (rule == grammarAccess.getTypeDefinitionImplRule()
+						|| rule == grammarAccess.getStructureTypeDefinitionImplRule()) {
+					sequence_StructureTypeDefinitionImpl(context, (StructureType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTypeDefinitionRule()
+						|| rule == grammarAccess.getStructureTypeDefinitionRule()) {
+					sequence_StructureTypeDefinition(context, (StructureType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getDataTypeRule()
+						|| rule == grammarAccess.getStructuredDataTypeRule()
+						|| rule == grammarAccess.getStructureTypeRule()) {
+					sequence_StructureType(context, (StructureType) semanticObject); 
+					return; 
+				}
+				else break;
+			case DatatypePackage.UNION_TYPE:
+				if (rule == grammarAccess.getTypeDefinitionImplRule()
+						|| rule == grammarAccess.getUnionTypeDefinitionImplRule()) {
+					sequence_UnionTypeDefinitionImpl(context, (UnionType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTypeDefinitionRule()
+						|| rule == grammarAccess.getUnionTypeDefinitionRule()) {
+					sequence_UnionTypeDefinition(context, (UnionType) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getDataTypeRule()
+						|| rule == grammarAccess.getStructuredDataTypeRule()
+						|| rule == grammarAccess.getUnionTypeRule()) {
+					sequence_UnionType(context, (UnionType) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if (epackage == ExpressionPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case ExpressionPackage.ARITHMETIC_ASSOCIATIVE_EXPRESSION:
+				sequence_AdditiveExpression_MultiplicativeExpression(context, (ArithmeticAssociativeExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.ARITHMETIC_UNARY_EXPRESSION:
+				sequence_ArithmeticUnaryExpression(context, (ArithmeticUnaryExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.ASSIGNMENT_EXPRESSION:
+				sequence_AssignmentExpression(context, (AssignmentExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.BITWISE_ASSOCIATIVE_EXPRESSION:
+				sequence_BitwiseAndExpression_BitwiseOrExpression_BitwiseXorExpression(context, (BitwiseAssociativeExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.BITWISE_UNARY_EXPRESSION:
+				sequence_BitwiseUnaryExpression(context, (BitwiseUnaryExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.CAST_EXPRESSION:
+				sequence_CastExpression(context, (CastExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.CONDITIONAL_TEST_EXPRESSION:
+				sequence_ConditionalTestExpression(context, (ConditionalTestExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.EQUALITY_BINARY_EXPRESSION:
+				sequence_EqualityExpression(context, (EqualityBinaryExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.EXPRESSION_AS_MACHINE:
+				sequence_ExpressionAsMachine(context, (ExpressionAsMachine) semanticObject); 
+				return; 
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_POSTFIX_EXPRESSION:
+				sequence_IncrementOrDecrementPostfixExpression(context, (IncrementOrDecrementPostfixExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.INCREMENT_OR_DECREMENT_PREFIX_EXPRESSION:
+				sequence_IncrementOrDecrementPrefixExpression(context, (IncrementOrDecrementPrefixExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.INSTANTIATION_EXPRESSION:
+				sequence_InstantiationExpression(context, (InstantiationExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.INVOKE_EXPRESSION:
+				if (rule == grammarAccess.getExpressionRule()
+						|| rule == grammarAccess.getConditionalTestExpressionRule()
+						|| action == grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0()
+						|| rule == grammarAccess.getLogicalOrExpressionRule()
+						|| action == grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getLogicalAndExpressionRule()
+						|| action == grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseOrExpressionRule()
+						|| action == grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseXorExpressionRule()
+						|| action == grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseAndExpressionRule()
+						|| action == grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getEqualityExpressionRule()
+						|| action == grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0()
+						|| rule == grammarAccess.getRelationalExpressionRule()
+						|| action == grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0()
+						|| rule == grammarAccess.getAdditiveExpressionRule()
+						|| action == grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()
+						|| action == grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()
+						|| rule == grammarAccess.getMultiplicativeExpressionRule()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0()
+						|| rule == grammarAccess.getUnaryExpressionRule()
+						|| rule == grammarAccess.getPrimaryExpressionRule()
+						|| action == grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0()
+						|| action == grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0()
+						|| rule == grammarAccess.getBaseExpressionRule()
+						|| rule == grammarAccess.getInvokeExpressionDeprecatedRule()) {
+					sequence_InvokeExpressionDeprecated(context, (InvokeExpression) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getInvokeExpressionRule()) {
+					sequence_InvokeExpression(context, (InvokeExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case ExpressionPackage.LEFT_HAND_SIDE_EXPRESSION:
+				sequence_LeftHandSideExpression(context, (LeftHandSideExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_BOOLEAN_EXPRESSION:
+				sequence_LiteralBooleanExpression(context, (LiteralBooleanExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_CHARACTER_EXPRESSION:
+				sequence_LiteralCharacterExpression(context, (LiteralCharacterExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_COLLECTION_EXPRESSION:
+				sequence_LiteralCollectionExpression(context, (LiteralCollectionExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_ENV_EXPRESSION:
+				sequence_LiteralEnvExpression(context, (LiteralEnvExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_FLOAT_EXPRESSION:
+				sequence_LiteralFloatExpression(context, (LiteralFloatExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_INTEGER_EXPRESSION:
+				sequence_LiteralIntegerExpression(context, (LiteralIntegerExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_NULL_EXPRESSION:
+				sequence_LiteralNullExpression(context, (LiteralNullExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_PARENT_EXPRESSION:
+				sequence_LiteralParentExpression(context, (LiteralParentExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_RATIONAL_EXPRESSION:
+				sequence_LiteralRationalExpression(context, (LiteralRationalExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_REFERENCE_ELEMENT:
+				if (rule == grammarAccess.getComElementRule()
+						|| action == grammarAccess.getComElementAccess().getValueElementSpecificationTargetAction_0_1_0()
+						|| rule == grammarAccess.getLiteralPureReferenceElementRule()
+						|| rule == grammarAccess.getLiteralPureReferenceExpressionRule()
+						|| rule == grammarAccess.getValuePureNamedMachineExpressionRule()
+						|| action == grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_1_0()
+						|| action == grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_0()) {
+					sequence_LiteralPureReferenceElement(context, (LiteralReferenceElement) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getDataTypeMultiplicityRule()
+						|| rule == grammarAccess.getExpressionRule()
+						|| rule == grammarAccess.getConditionalTestExpressionRule()
+						|| action == grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0()
+						|| rule == grammarAccess.getLogicalOrExpressionRule()
+						|| action == grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getLogicalAndExpressionRule()
+						|| action == grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseOrExpressionRule()
+						|| action == grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseXorExpressionRule()
+						|| action == grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseAndExpressionRule()
+						|| action == grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getEqualityExpressionRule()
+						|| action == grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0()
+						|| rule == grammarAccess.getRelationalExpressionRule()
+						|| action == grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0()
+						|| rule == grammarAccess.getAdditiveExpressionRule()
+						|| action == grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()
+						|| action == grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()
+						|| rule == grammarAccess.getMultiplicativeExpressionRule()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0()
+						|| rule == grammarAccess.getUnaryExpressionRule()
+						|| rule == grammarAccess.getPrimaryExpressionRule()
+						|| action == grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0()
+						|| action == grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0()
+						|| rule == grammarAccess.getBaseExpressionRule()
+						|| rule == grammarAccess.getLiteralExpressionRule()
+						|| rule == grammarAccess.getLiteralReferenceableExpressionRule()
+						|| rule == grammarAccess.getLiteralReferenceExpressionRule()
+						|| rule == grammarAccess.getLiteralReferenceElementRule()
+						|| rule == grammarAccess.getValueSelectionExpressionRule()
+						|| action == grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_1_0()
+						|| action == grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_0()) {
+					sequence_LiteralReferenceElement(context, (LiteralReferenceElement) semanticObject); 
+					return; 
+				}
+				else break;
+			case ExpressionPackage.LITERAL_SELF_EXPRESSION:
+				sequence_LiteralSelfExpression(context, (LiteralSelfExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_STRING_EXPRESSION:
+				sequence_LiteralStringExpression(context, (LiteralStringExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_SUPER_EXPRESSION:
+				sequence_LiteralSuperExpression(context, (LiteralSuperExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_SYSTEM_EXPRESSION:
+				sequence_LiteralSystemExpression(context, (LiteralSystemExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_THIS_EXPRESSION:
+				sequence_LiteralThisExpression(context, (LiteralThisExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_TIME_DELTA_EXPRESSION:
+				sequence_LiteralTimeDeltaExpression(context, (LiteralTimeDeltaExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LITERAL_TIME_EXPRESSION:
+				sequence_LiteralTimeExpression(context, (LiteralTimeExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.LOGICAL_ASSOCIATIVE_EXPRESSION:
+				if (rule == grammarAccess.getExpressionRule()
+						|| rule == grammarAccess.getConditionalTestExpressionRule()
+						|| action == grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0()
+						|| rule == grammarAccess.getLogicalOrExpressionRule()
+						|| action == grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getLogicalAndExpressionRule()
+						|| action == grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseOrExpressionRule()
+						|| action == grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseXorExpressionRule()
+						|| action == grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseAndExpressionRule()
+						|| action == grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getEqualityExpressionRule()
+						|| action == grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0()
+						|| rule == grammarAccess.getRelationalExpressionRule()
+						|| action == grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0()
+						|| rule == grammarAccess.getAdditiveExpressionRule()
+						|| action == grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()
+						|| action == grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()
+						|| rule == grammarAccess.getMultiplicativeExpressionRule()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0()
+						|| rule == grammarAccess.getUnaryExpressionRule()
+						|| rule == grammarAccess.getPrimaryExpressionRule()
+						|| action == grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0()
+						|| action == grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0()
+						|| rule == grammarAccess.getBaseExpressionRule()) {
+					sequence_LogicalAndExpression_LogicalOrExpression(context, (LogicalAssociativeExpression) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTransitionGuardExpressionRule()) {
+					sequence_TransitionGuardExpression(context, (LogicalAssociativeExpression) semanticObject); 
+					return; 
+				}
+				else break;
+			case ExpressionPackage.LOGICAL_UNARY_EXPRESSION:
+				sequence_LogicalUnaryExpression(context, (LogicalUnaryExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.MIX_TUPLE_EXPRESSION:
+				sequence_MixTupleExpressionList(context, (MixTupleExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.NAMED_EXPRESSION:
+				sequence_NamedExpression(context, (NamedExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.NEWFRESH_EXPRESSION:
+				sequence_NewfreshExpression(context, (NewfreshExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.POSITIONAL_TUPLE_EXPRESSION:
+				sequence_PositionalTupleExpressionList(context, (PositionalTupleExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.RELATIONAL_BINARY_EXPRESSION:
+				sequence_RelationalExpression(context, (RelationalBinaryExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.RELATIONAL_TERNARY_EXPRESSION:
+				sequence_RelationalExpression(context, (RelationalTernaryExpression) semanticObject); 
+				return; 
+			case ExpressionPackage.VALUE_ELEMENT_SPECIFICATION:
+				if (rule == grammarAccess.getComElementRule()) {
+					sequence_ComElement(context, (ValueElementSpecification) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getExpressionRule()
+						|| rule == grammarAccess.getConditionalTestExpressionRule()
+						|| action == grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0()
+						|| rule == grammarAccess.getLogicalOrExpressionRule()
+						|| action == grammarAccess.getLogicalOrExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getLogicalAndExpressionRule()
+						|| action == grammarAccess.getLogicalAndExpressionAccess().getLogicalAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseOrExpressionRule()
+						|| action == grammarAccess.getBitwiseOrExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseXorExpressionRule()
+						|| action == grammarAccess.getBitwiseXorExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getBitwiseAndExpressionRule()
+						|| action == grammarAccess.getBitwiseAndExpressionAccess().getBitwiseAssociativeExpressionOperandAction_1_0()
+						|| rule == grammarAccess.getEqualityExpressionRule()
+						|| action == grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0()
+						|| rule == grammarAccess.getRelationalExpressionRule()
+						|| action == grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0()
+						|| rule == grammarAccess.getAdditiveExpressionRule()
+						|| action == grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()
+						|| action == grammarAccess.getAdditiveExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()
+						|| rule == grammarAccess.getMultiplicativeExpressionRule()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_0_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_1_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_2_0()
+						|| action == grammarAccess.getMultiplicativeExpressionAccess().getArithmeticAssociativeExpressionOperandAction_1_3_0()
+						|| rule == grammarAccess.getUnaryExpressionRule()
+						|| rule == grammarAccess.getPrimaryExpressionRule()
+						|| action == grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_1_0()
+						|| action == grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_0()
+						|| rule == grammarAccess.getBaseExpressionRule()) {
+					sequence_PrimaryExpression(context, (ValueElementSpecification) semanticObject); 
+					return; 
+				}
+				else if (action == grammarAccess.getPrimaryExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()) {
+					sequence_PrimaryExpression_ValueElementSpecification_2_4_0(context, (ValueElementSpecification) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getValuePureNamedMachineExpressionRule()) {
+					sequence_ValuePureNamedMachineExpression(context, (ValueElementSpecification) semanticObject); 
+					return; 
+				}
+				else if (action == grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_1_0()
+						|| action == grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_0()) {
+					sequence_ValuePureNamedMachineExpression_ValueElementSpecification_1_0_ValueElementSpecification_2_0(context, (ValueElementSpecification) semanticObject); 
+					return; 
+				}
+				else if (action == grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_2_3_0()) {
+					sequence_ValuePureNamedMachineExpression_ValueElementSpecification_2_3_0(context, (ValueElementSpecification) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getValueSelectionExpressionRule()) {
+					sequence_ValueSelectionExpression(context, (ValueElementSpecification) semanticObject); 
+					return; 
+				}
+				else if (action == grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_1_0()
+						|| action == grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_0()) {
+					sequence_ValueSelectionExpression_ValueElementSpecification_1_0_ValueElementSpecification_2_0(context, (ValueElementSpecification) semanticObject); 
+					return; 
+				}
+				else if (action == grammarAccess.getValueSelectionExpressionAccess().getValueElementSpecificationTargetAction_2_4_0()) {
+					sequence_ValueSelectionExpression_ValueElementSpecification_2_4_0(context, (ValueElementSpecification) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if (epackage == FormalmlPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case FormalmlPackage.XLIA_ATTRIBUTE:
+				if (rule == grammarAccess.getXliaNamedElementRule()
+						|| rule == grammarAccess.getXliaAttributeRule()) {
+					sequence_XliaAttribute(context, (XliaAttribute) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getXliaPrologAttributeRule()) {
+					sequence_XliaPrologAttribute(context, (XliaAttribute) semanticObject); 
+					return; 
+				}
+				else break;
+			case FormalmlPackage.XLIA_MODEL:
+				sequence_Xlia(context, (XliaModel) semanticObject); 
+				return; 
+			case FormalmlPackage.XLIA_OBJECT:
+				if (rule == grammarAccess.getXliaNamedElementRule()
+						|| rule == grammarAccess.getXliaObjectRule()) {
+					sequence_XliaObject(context, (XliaObject) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getXliaOptionObjectRule()) {
+					sequence_XliaOptionObject(context, (XliaObject) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getXliaPrologObjectRule()) {
+					sequence_XliaPrologObject(context, (XliaObject) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if (epackage == InfrastructurePackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case InfrastructurePackage.BEHAVIOR:
+				sequence_MoeBehavior(context, (Behavior) semanticObject); 
+				return; 
+			case InfrastructurePackage.BUFFER:
+				if (rule == grammarAccess.getBufferImplRule()) {
+					sequence_BufferImpl(context, (Buffer) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getBufferPrivateRule()) {
+					sequence_BufferPrivate(context, (Buffer) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getBufferProtectedRule()) {
+					sequence_BufferProtected(context, (Buffer) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getBufferPublicRule()) {
+					sequence_BufferPublic(context, (Buffer) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getBufferRule()) {
+					sequence_Buffer(context, (Buffer) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.CHANNEL:
+				if (rule == grammarAccess.getChannelPrivateRule()) {
+					sequence_ChannelPrivate(context, (Channel) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getChannelProtectedRule()) {
+					sequence_ChannelProtected(context, (Channel) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getChannelPublicRule()) {
+					sequence_ChannelPublic(context, (Channel) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getChannelRule()) {
+					sequence_Channel(context, (Channel) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.COM_POINT:
+				sequence_ComPoint(context, (ComPoint) semanticObject); 
+				return; 
+			case InfrastructurePackage.COM_PROTOCOL:
+				if (rule == grammarAccess.getComPointProtocolRule()) {
+					sequence_ComPointProtocol(context, (ComProtocol) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getComProtocolRule()) {
+					sequence_ComProtocol(context, (ComProtocol) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getComRouteProtocolRule()) {
+					sequence_ComRouteProtocol(context, (ComProtocol) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.CONNECTION:
+				sequence_Connection(context, (Connection) semanticObject); 
+				return; 
+			case InfrastructurePackage.INSTANCE_MACHINE:
+				if (rule == grammarAccess.getDynamicInstanceSpecificationRule()) {
+					sequence_DynamicInstanceSpecification(context, (InstanceMachine) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getInstanceMachineRule()) {
+					sequence_InstanceMachine(context, (InstanceMachine) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.MACHINE:
+				sequence_MachineBlock(context, (Machine) semanticObject); 
+				return; 
+			case InfrastructurePackage.MODEL_OF_COMPUTATION:
+				sequence_ModelOfComputation(context, (ModelOfComputation) semanticObject); 
+				return; 
+			case InfrastructurePackage.MODEL_OF_EXECUTION:
+				if (rule == grammarAccess.getModelOfExecutionRule()) {
+					sequence_ModelOfExecution(context, (ModelOfExecution) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getProcedureExecutionRule()) {
+					sequence_ProcedureExecution(context, (ModelOfExecution) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.MODEL_OF_INTERACTION:
+				sequence_ModelOfInteraction(context, (ModelOfInteraction) semanticObject); 
+				return; 
+			case InfrastructurePackage.MODIFIER:
+				sequence_Modifier(context, (Modifier) semanticObject); 
+				return; 
+			case InfrastructurePackage.PARAMETER:
+				if (rule == grammarAccess.getFormalParameterRule()) {
+					sequence_FormalParameter(context, (org.eclipse.efm.ecore.formalml.infrastructure.Parameter) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getFunctionalParameterRule()) {
+					sequence_FunctionalParameter(context, (org.eclipse.efm.ecore.formalml.infrastructure.Parameter) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getParameterDeclarationRule()) {
+					sequence_ParameterDeclaration(context, (org.eclipse.efm.ecore.formalml.infrastructure.Parameter) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getParameterInoutRule()) {
+					sequence_ParameterInout(context, (org.eclipse.efm.ecore.formalml.infrastructure.Parameter) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getParameterInputRule()) {
+					sequence_ParameterInput(context, (org.eclipse.efm.ecore.formalml.infrastructure.Parameter) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getParameterOutputRule()) {
+					sequence_ParameterOutput(context, (org.eclipse.efm.ecore.formalml.infrastructure.Parameter) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getParameterReturnRule()) {
+					sequence_ParameterReturn(context, (org.eclipse.efm.ecore.formalml.infrastructure.Parameter) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getVariableRoutineParameterRule()) {
+					sequence_VariableRoutineParameter(context, (org.eclipse.efm.ecore.formalml.infrastructure.Parameter) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.PARAMETER_SET:
+				if (rule == grammarAccess.getBlockParameterSetRule()) {
+					sequence_BlockParameterSet(context, (ParameterSet) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getFormalParameterSetRule()) {
+					sequence_FormalParameterSet(context, (ParameterSet) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getFunctionalParameterSetRule()) {
+					sequence_FunctionalParameterSet(context, (ParameterSet) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.PORT:
+				if (rule == grammarAccess.getPortImplRule()) {
+					sequence_PortImpl(context, (Port) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getPortPrivateRule()) {
+					sequence_PortPrivate(context, (Port) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getPortProtectedRule()) {
+					sequence_PortProtected(context, (Port) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getPortPublicRule()) {
+					sequence_PortPublic(context, (Port) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getPortRule()) {
+					sequence_Port(context, (Port) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.PROCEDURE:
+				sequence_Procedure(context, (Procedure) semanticObject); 
+				return; 
+			case InfrastructurePackage.ROUTE:
+				sequence_Route(context, (Route) semanticObject); 
+				return; 
+			case InfrastructurePackage.ROUTINE:
+				if (rule == grammarAccess.getOnWriteRoutineRule()) {
+					sequence_OnWriteRoutine(context, (Routine) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getRoutineRule()) {
+					sequence_Routine(context, (Routine) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getMoeCompositeStateRoutinesRule()) {
+					sequence_moeCompositeStateRoutines(context, (Routine) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getMoeFinalStateRoutinesRule()) {
+					sequence_moeFinalStateRoutines(context, (Routine) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getMoeRoutineRule()) {
+					sequence_moeRoutine(context, (Routine) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getMoeSimpleStateRoutinesRule()) {
+					sequence_moeSimpleStateRoutines(context, (Routine) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getMoeStartStateRoutinesRule()) {
+					sequence_moeStartStateRoutines(context, (Routine) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.SIGNAL:
+				if (rule == grammarAccess.getSignalImplRule()) {
+					sequence_SignalImpl(context, (Signal) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getSignalPrivateRule()) {
+					sequence_SignalPrivate(context, (Signal) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getSignalProtectedRule()) {
+					sequence_SignalProtected(context, (Signal) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getSignalPublicRule()) {
+					sequence_SignalPublic(context, (Signal) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getSignalReferenceRule()) {
+					sequence_SignalReference(context, (Signal) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getSignalRule()) {
+					sequence_Signal(context, (Signal) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.SLOT_PROPERTY:
+				if (rule == grammarAccess.getSlotParameterRule()) {
+					sequence_SlotParameter(context, (SlotProperty) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getSlotPropertyRule()) {
+					sequence_SlotProperty(context, (SlotProperty) semanticObject); 
+					return; 
+				}
+				else break;
+			case InfrastructurePackage.SYSTEM:
+				sequence_System(context, (org.eclipse.efm.ecore.formalml.infrastructure.System) semanticObject); 
+				return; 
+			case InfrastructurePackage.VARIABLE:
+				if (rule == grammarAccess.getVariableImplRule()) {
+					sequence_VariableImpl(context, (Variable) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getVariablePrivateRule()) {
+					sequence_VariablePrivate(context, (Variable) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getVariableProtectedRule()) {
+					sequence_VariableProtected(context, (Variable) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getVariablePublicRule()) {
+					sequence_VariablePublic(context, (Variable) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getVariableRule()) {
+					sequence_Variable(context, (Variable) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if (epackage == StatemachinePackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case StatemachinePackage.FINAL_STATE:
+				sequence_FinalState(context, (FinalState) semanticObject); 
+				return; 
+			case StatemachinePackage.PSEUDOSTATE:
+				if (rule == grammarAccess.getPseudostateRule()) {
+					sequence_EndingPseudostate_OtherPseudostate_PseudostateInitial(context, (Pseudostate) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getEndingPseudostateRule()) {
+					sequence_EndingPseudostate(context, (Pseudostate) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getOtherPseudostateRule()) {
+					sequence_OtherPseudostate(context, (Pseudostate) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getPseudostateInitialRule()) {
+					sequence_PseudostateInitial(context, (Pseudostate) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachinePackage.REGION:
+				if (rule == grammarAccess.getStatemachineRegionLiteRule()) {
+					sequence_StatemachineRegionLite(context, (Region) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getStatemachineRegionRule()) {
+					sequence_StatemachineRegion(context, (Region) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachinePackage.START_STATE:
+				sequence_StartState(context, (StartState) semanticObject); 
+				return; 
+			case StatemachinePackage.STATE:
+				if (rule == grammarAccess.getStateRule()) {
+					sequence_CompositeState_SimpleState(context, (State) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getCompositeStateRule()) {
+					sequence_CompositeState(context, (State) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getSimpleStateRule()) {
+					sequence_SimpleState(context, (State) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatemachinePackage.STATEMACHINE:
+				sequence_Statemachine(context, (Statemachine) semanticObject); 
+				return; 
+			case StatemachinePackage.TRANSITION:
+				sequence_Transition(context, (Transition) semanticObject); 
+				return; 
+			case StatemachinePackage.TRANSITION_MOE:
+				sequence_TransitionMoe(context, (TransitionMoe) semanticObject); 
+				return; 
+			}
+		else if (epackage == StatementPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
+			case StatementPackage.ACTIVITY_STATEMENT:
+				sequence_ActivityStatement(context, (ActivityStatement) semanticObject); 
+				return; 
+			case StatementPackage.BLOCK_STATEMENT:
+				if (rule == grammarAccess.getStatementRule()
+						|| rule == grammarAccess.getBlockStatementRule()) {
+					sequence_BlockStatement(context, (BlockStatement) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTransitionBehaviorRule()) {
+					sequence_TransitionBehavior(context, (BlockStatement) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTransitionEffectRule()
+						|| action == grammarAccess.getTransitionEffectAccess().getBlockStatementStatementAction_1_0()) {
+					sequence_TransitionEffect(context, (BlockStatement) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatementPackage.CHECK_SAT_GUARD_STATEMENT:
+				sequence_CheckSatGuardStatement(context, (CheckSatGuardStatement) semanticObject); 
+				return; 
+			case StatementPackage.CONDITIONAL_BLOCK_STATEMENT:
+				sequence_ElseIfStatement(context, (ConditionalBlockStatement) semanticObject); 
+				return; 
+			case StatementPackage.DO_WHILE_STATEMENT:
+				sequence_DoWhileStatement(context, (DoWhileStatement) semanticObject); 
+				return; 
+			case StatementPackage.EVENT_GUARD_STATEMENT:
+				sequence_EventGuardStatement(context, (EventGuardStatement) semanticObject); 
+				return; 
+			case StatementPackage.EXPRESSION_STATEMENT:
+				sequence_ExpressionStatement(context, (ExpressionStatement) semanticObject); 
+				return; 
+			case StatementPackage.FOR_EACH_STATEMENT:
+				sequence_ForEachStatement(context, (ForEachStatement) semanticObject); 
+				return; 
+			case StatementPackage.FOR_STATEMENT:
+				sequence_ForStatement(context, (ForStatement) semanticObject); 
+				return; 
+			case StatementPackage.GUARD_STATEMENT:
+				if (rule == grammarAccess.getStatementRule()
+						|| rule == grammarAccess.getGuardStatementRule()) {
+					sequence_GuardStatement(context, (GuardStatement) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTransitionGuardRule()) {
+					sequence_GuardStatement_TransitionGuard(context, (GuardStatement) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatementPackage.IF_STATEMENT:
+				sequence_IfStatement(context, (IfStatement) semanticObject); 
+				return; 
+			case StatementPackage.INPUT_COM_STATEMENT:
+				sequence_InputComStatement(context, (InputComStatement) semanticObject); 
+				return; 
+			case StatementPackage.INTERRUPT_STATEMENT:
+				sequence_InterruptStatement(context, (InterruptStatement) semanticObject); 
+				return; 
+			case StatementPackage.INVOKE_STATEMENT:
+				sequence_InvokeStatement(context, (InvokeStatement) semanticObject); 
+				return; 
+			case StatementPackage.OUTPUT_COM_STATEMENT:
+				sequence_OutputComStatement(context, (OutputComStatement) semanticObject); 
+				return; 
+			case StatementPackage.TIMED_GUARD_STATEMENT:
+				if (rule == grammarAccess.getStatementRule()
+						|| rule == grammarAccess.getTimedGuardStatementRule()) {
+					sequence_TimedGuardStatement(context, (TimedGuardStatement) semanticObject); 
+					return; 
+				}
+				else if (rule == grammarAccess.getTransitionTimedGuardRule()) {
+					sequence_TimedGuardStatement_TransitionTimedGuard(context, (TimedGuardStatement) semanticObject); 
+					return; 
+				}
+				else break;
+			case StatementPackage.WHILE_DO_STATEMENT:
+				sequence_WhileDoStatement(context, (WhileDoStatement) semanticObject); 
+				return; 
+			}
+		if (errorAcceptor != null)
+			errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
+	}
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns ActivityStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns ActivityStatement
+	 *     TransitionEffectStatement returns ActivityStatement
+	 *     Statement returns ActivityStatement
+	 *     ActivityStatement returns ActivityStatement
+	 *
+	 * Constraint:
+	 *     (op=OPERATOR_ACTIVITY machine=ValuePureNamedMachineExpression tuple=TupleParameterExpression?)
+	 */
+	protected void sequence_ActivityStatement(ISerializationContext context, ActivityStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns ArithmeticAssociativeExpression
+	 *     ConditionalTestExpression returns ArithmeticAssociativeExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns ArithmeticAssociativeExpression
+	 *     LogicalOrExpression returns ArithmeticAssociativeExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns ArithmeticAssociativeExpression
+	 *     LogicalAndExpression returns ArithmeticAssociativeExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns ArithmeticAssociativeExpression
+	 *     BitwiseOrExpression returns ArithmeticAssociativeExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns ArithmeticAssociativeExpression
+	 *     BitwiseXorExpression returns ArithmeticAssociativeExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns ArithmeticAssociativeExpression
+	 *     BitwiseAndExpression returns ArithmeticAssociativeExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns ArithmeticAssociativeExpression
+	 *     EqualityExpression returns ArithmeticAssociativeExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns ArithmeticAssociativeExpression
+	 *     RelationalExpression returns ArithmeticAssociativeExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns ArithmeticAssociativeExpression
+	 *     AdditiveExpression returns ArithmeticAssociativeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns ArithmeticAssociativeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns ArithmeticAssociativeExpression
+	 *     MultiplicativeExpression returns ArithmeticAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns ArithmeticAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns ArithmeticAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns ArithmeticAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns ArithmeticAssociativeExpression
+	 *     UnaryExpression returns ArithmeticAssociativeExpression
+	 *     PrimaryExpression returns ArithmeticAssociativeExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns ArithmeticAssociativeExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns ArithmeticAssociativeExpression
+	 *     BaseExpression returns ArithmeticAssociativeExpression
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             operand+=AdditiveExpression_ArithmeticAssociativeExpression_1_0_0 
+	 *             operator='+' 
+	 *             operand+=MultiplicativeExpression 
+	 *             operand+=MultiplicativeExpression*
+	 *         ) | 
+	 *         (
+	 *             operand+=AdditiveExpression_ArithmeticAssociativeExpression_1_1_0 
+	 *             operator='-' 
+	 *             operand+=MultiplicativeExpression 
+	 *             operand+=MultiplicativeExpression*
+	 *         ) | 
+	 *         (operand+=MultiplicativeExpression_ArithmeticAssociativeExpression_1_0_0 operator='*' operand+=UnaryExpression operand+=UnaryExpression*) | 
+	 *         (operand+=MultiplicativeExpression_ArithmeticAssociativeExpression_1_1_0 operator='**' operand+=UnaryExpression operand+=UnaryExpression*) | 
+	 *         (operand+=MultiplicativeExpression_ArithmeticAssociativeExpression_1_2_0 operator='/' operand+=UnaryExpression operand+=UnaryExpression*) | 
+	 *         (operand+=MultiplicativeExpression_ArithmeticAssociativeExpression_1_3_0 operator='%' operand+=UnaryExpression operand+=UnaryExpression*)
+	 *     )
+	 */
+	protected void sequence_AdditiveExpression_MultiplicativeExpression(ISerializationContext context, ArithmeticAssociativeExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns ArithmeticUnaryExpression
+	 *     ConditionalTestExpression returns ArithmeticUnaryExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns ArithmeticUnaryExpression
+	 *     LogicalOrExpression returns ArithmeticUnaryExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns ArithmeticUnaryExpression
+	 *     LogicalAndExpression returns ArithmeticUnaryExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns ArithmeticUnaryExpression
+	 *     BitwiseOrExpression returns ArithmeticUnaryExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns ArithmeticUnaryExpression
+	 *     BitwiseXorExpression returns ArithmeticUnaryExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns ArithmeticUnaryExpression
+	 *     BitwiseAndExpression returns ArithmeticUnaryExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns ArithmeticUnaryExpression
+	 *     EqualityExpression returns ArithmeticUnaryExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns ArithmeticUnaryExpression
+	 *     RelationalExpression returns ArithmeticUnaryExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns ArithmeticUnaryExpression
+	 *     AdditiveExpression returns ArithmeticUnaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns ArithmeticUnaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns ArithmeticUnaryExpression
+	 *     MultiplicativeExpression returns ArithmeticUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns ArithmeticUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns ArithmeticUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns ArithmeticUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns ArithmeticUnaryExpression
+	 *     UnaryExpression returns ArithmeticUnaryExpression
+	 *     ArithmeticUnaryExpression returns ArithmeticUnaryExpression
+	 *     PrimaryExpression returns ArithmeticUnaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns ArithmeticUnaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns ArithmeticUnaryExpression
+	 *     BaseExpression returns ArithmeticUnaryExpression
+	 *
+	 * Constraint:
+	 *     (operator=ArithmeticUnaryOperator operand=UnaryExpression)
+	 */
+	protected void sequence_ArithmeticUnaryExpression(ISerializationContext context, ArithmeticUnaryExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERAND));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getArithmeticUnaryExpressionAccess().getOperatorArithmeticUnaryOperatorParserRuleCall_0_0(), semanticObject.getOperator());
+		feeder.accept(grammarAccess.getArithmeticUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0(), semanticObject.getOperand());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ForAssignmentExpression returns AssignmentExpression
+	 *     Expression returns AssignmentExpression
+	 *     AssignmentExpression returns AssignmentExpression
+	 *     ConditionalTestExpression returns AssignmentExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns AssignmentExpression
+	 *     LogicalOrExpression returns AssignmentExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns AssignmentExpression
+	 *     LogicalAndExpression returns AssignmentExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns AssignmentExpression
+	 *     BitwiseOrExpression returns AssignmentExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns AssignmentExpression
+	 *     BitwiseXorExpression returns AssignmentExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns AssignmentExpression
+	 *     BitwiseAndExpression returns AssignmentExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns AssignmentExpression
+	 *     EqualityExpression returns AssignmentExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns AssignmentExpression
+	 *     RelationalExpression returns AssignmentExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns AssignmentExpression
+	 *     AdditiveExpression returns AssignmentExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns AssignmentExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns AssignmentExpression
+	 *     MultiplicativeExpression returns AssignmentExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns AssignmentExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns AssignmentExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns AssignmentExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns AssignmentExpression
+	 *     UnaryExpression returns AssignmentExpression
+	 *     PrimaryExpression returns AssignmentExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns AssignmentExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns AssignmentExpression
+	 *     BaseExpression returns AssignmentExpression
+	 *
+	 * Constraint:
+	 *     (leftHandSide=LeftHandSideExpression operator=AssignmentOperator rigthHandSide=Expression)
+	 */
+	protected void sequence_AssignmentExpression(ISerializationContext context, AssignmentExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.ASSIGNMENT_EXPRESSION__LEFT_HAND_SIDE));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.ASSIGNMENT_EXPRESSION__OPERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.ASSIGNMENT_EXPRESSION__OPERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.ASSIGNMENT_EXPRESSION__RIGTH_HAND_SIDE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getAssignmentExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0(), semanticObject.getLeftHandSide());
+		feeder.accept(grammarAccess.getAssignmentExpressionAccess().getOperatorAssignmentOperatorParserRuleCall_1_0(), semanticObject.getOperator());
+		feeder.accept(grammarAccess.getAssignmentExpressionAccess().getRigthHandSideExpressionParserRuleCall_2_0(), semanticObject.getRigthHandSide());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns BitwiseAssociativeExpression
+	 *     ConditionalTestExpression returns BitwiseAssociativeExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns BitwiseAssociativeExpression
+	 *     LogicalOrExpression returns BitwiseAssociativeExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns BitwiseAssociativeExpression
+	 *     LogicalAndExpression returns BitwiseAssociativeExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns BitwiseAssociativeExpression
+	 *     BitwiseOrExpression returns BitwiseAssociativeExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns BitwiseAssociativeExpression
+	 *     BitwiseXorExpression returns BitwiseAssociativeExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns BitwiseAssociativeExpression
+	 *     BitwiseAndExpression returns BitwiseAssociativeExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns BitwiseAssociativeExpression
+	 *     EqualityExpression returns BitwiseAssociativeExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns BitwiseAssociativeExpression
+	 *     RelationalExpression returns BitwiseAssociativeExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns BitwiseAssociativeExpression
+	 *     AdditiveExpression returns BitwiseAssociativeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns BitwiseAssociativeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns BitwiseAssociativeExpression
+	 *     MultiplicativeExpression returns BitwiseAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns BitwiseAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns BitwiseAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns BitwiseAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns BitwiseAssociativeExpression
+	 *     UnaryExpression returns BitwiseAssociativeExpression
+	 *     PrimaryExpression returns BitwiseAssociativeExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns BitwiseAssociativeExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns BitwiseAssociativeExpression
+	 *     BaseExpression returns BitwiseAssociativeExpression
+	 *
+	 * Constraint:
+	 *     (
+	 *         (operand+=BitwiseOrExpression_BitwiseAssociativeExpression_1_0 operator='|' operand+=BitwiseXorExpression operand+=BitwiseXorExpression*) | 
+	 *         (operand+=BitwiseXorExpression_BitwiseAssociativeExpression_1_0 operator='^' operand+=BitwiseAndExpression operand+=BitwiseAndExpression*) | 
+	 *         (operand+=BitwiseAndExpression_BitwiseAssociativeExpression_1_0 operator='&' operand+=EqualityExpression operand+=EqualityExpression*)
+	 *     )
+	 */
+	protected void sequence_BitwiseAndExpression_BitwiseOrExpression_BitwiseXorExpression(ISerializationContext context, BitwiseAssociativeExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns BitwiseUnaryExpression
+	 *     ConditionalTestExpression returns BitwiseUnaryExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns BitwiseUnaryExpression
+	 *     LogicalOrExpression returns BitwiseUnaryExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns BitwiseUnaryExpression
+	 *     LogicalAndExpression returns BitwiseUnaryExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns BitwiseUnaryExpression
+	 *     BitwiseOrExpression returns BitwiseUnaryExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns BitwiseUnaryExpression
+	 *     BitwiseXorExpression returns BitwiseUnaryExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns BitwiseUnaryExpression
+	 *     BitwiseAndExpression returns BitwiseUnaryExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns BitwiseUnaryExpression
+	 *     EqualityExpression returns BitwiseUnaryExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns BitwiseUnaryExpression
+	 *     RelationalExpression returns BitwiseUnaryExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns BitwiseUnaryExpression
+	 *     AdditiveExpression returns BitwiseUnaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns BitwiseUnaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns BitwiseUnaryExpression
+	 *     MultiplicativeExpression returns BitwiseUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns BitwiseUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns BitwiseUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns BitwiseUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns BitwiseUnaryExpression
+	 *     UnaryExpression returns BitwiseUnaryExpression
+	 *     BitwiseUnaryExpression returns BitwiseUnaryExpression
+	 *     PrimaryExpression returns BitwiseUnaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns BitwiseUnaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns BitwiseUnaryExpression
+	 *     BaseExpression returns BitwiseUnaryExpression
+	 *
+	 * Constraint:
+	 *     (operator='~' operand=UnaryExpression)
+	 */
+	protected void sequence_BitwiseUnaryExpression(ISerializationContext context, BitwiseUnaryExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERAND));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getBitwiseUnaryExpressionAccess().getOperatorTildeKeyword_0_0(), semanticObject.getOperator());
+		feeder.accept(grammarAccess.getBitwiseUnaryExpressionAccess().getOperandUnaryExpressionParserRuleCall_1_0(), semanticObject.getOperand());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     BlockParameterSet returns ParameterSet
+	 *
+	 * Constraint:
+	 *     (
+	 *         parameter+=ParameterInput | 
+	 *         parameter+=ParameterInput | 
+	 *         parameter+=ParameterInout | 
+	 *         parameter+=ParameterInout | 
+	 *         parameter+=ParameterOutput | 
+	 *         parameter+=ParameterOutput | 
+	 *         parameter+=ParameterReturn | 
+	 *         parameter+=ParameterReturn
+	 *     )*
+	 */
+	protected void sequence_BlockParameterSet(ISerializationContext context, ParameterSet semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Statement returns BlockStatement
+	 *     BlockStatement returns BlockStatement
+	 *
+	 * Constraint:
+	 *     (op=BlockStatementScheduler? statement+=Statement*)
+	 */
+	protected void sequence_BlockStatement(ISerializationContext context, BlockStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     BufferContainerType returns CollectionType
+	 *
+	 * Constraint:
+	 *     (container=BufferContainerKind (size=EInt | unbounded?='*')?)
+	 */
+	protected void sequence_BufferContainerType(ISerializationContext context, CollectionType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     BufferImpl returns Buffer
+	 *
+	 * Constraint:
+	 *     (type=BufferContainerType name=ESIdentifier unrestrictedName=UnrestrictedName?)
+	 */
+	protected void sequence_BufferImpl(ISerializationContext context, Buffer semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     BufferPrivate returns Buffer
+	 *
+	 * Constraint:
+	 *     (modifier=Modifier? visibility=PrivateBufferVisibilityKind type=BufferContainerType name=ESIdentifier unrestrictedName=UnrestrictedName?)
+	 */
+	protected void sequence_BufferPrivate(ISerializationContext context, Buffer semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     BufferProtected returns Buffer
+	 *
+	 * Constraint:
+	 *     (modifier=Modifier? visibility=ProtectedBufferVisibilityKind type=BufferContainerType name=ESIdentifier unrestrictedName=UnrestrictedName?)
+	 */
+	protected void sequence_BufferProtected(ISerializationContext context, Buffer semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     BufferPublic returns Buffer
+	 *
+	 * Constraint:
+	 *     (modifier=Modifier? visibility=PublicBufferVisibilityKind type=BufferContainerType name=ESIdentifier unrestrictedName=UnrestrictedName?)
+	 */
+	protected void sequence_BufferPublic(ISerializationContext context, Buffer semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Buffer returns Buffer
+	 *
+	 * Constraint:
+	 *     ((visibility=VisibilityKind | modifier=Modifier)* type=BufferContainerType name=ESIdentifier unrestrictedName=UnrestrictedName?)
+	 */
+	protected void sequence_Buffer(ISerializationContext context, Buffer semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns CastExpression
+	 *     ConditionalTestExpression returns CastExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns CastExpression
+	 *     LogicalOrExpression returns CastExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns CastExpression
+	 *     LogicalAndExpression returns CastExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns CastExpression
+	 *     BitwiseOrExpression returns CastExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns CastExpression
+	 *     BitwiseXorExpression returns CastExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns CastExpression
+	 *     BitwiseAndExpression returns CastExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns CastExpression
+	 *     EqualityExpression returns CastExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns CastExpression
+	 *     RelationalExpression returns CastExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns CastExpression
+	 *     AdditiveExpression returns CastExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns CastExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns CastExpression
+	 *     MultiplicativeExpression returns CastExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns CastExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns CastExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns CastExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns CastExpression
+	 *     UnaryExpression returns CastExpression
+	 *     CastExpression returns CastExpression
+	 *     PrimaryExpression returns CastExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns CastExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns CastExpression
+	 *     BaseExpression returns CastExpression
+	 *
+	 * Constraint:
+	 *     (datatype=[DataType|ESUfid] operand=Expression)
+	 */
+	protected void sequence_CastExpression(ISerializationContext context, CastExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.CAST_EXPRESSION__DATATYPE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.CAST_EXPRESSION__DATATYPE));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.UNARY_EXPRESSION__OPERAND));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getCastExpressionAccess().getDatatypeDataTypeESUfidParserRuleCall_2_0_1(), semanticObject.getDatatype());
+		feeder.accept(grammarAccess.getCastExpressionAccess().getOperandExpressionParserRuleCall_5_0(), semanticObject.getOperand());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ChannelPrivate returns Channel
+	 *
+	 * Constraint:
+	 *     (visibility=PrivateChannelVisibilityKind name=ESIdentifier unrestrictedName=UnrestrictedName? signal+=SignalReference+)
+	 */
+	protected void sequence_ChannelPrivate(ISerializationContext context, Channel semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ChannelProtected returns Channel
+	 *
+	 * Constraint:
+	 *     (visibility=ProtectedChannelVisibilityKind name=ESIdentifier unrestrictedName=UnrestrictedName? signal+=SignalReference+)
+	 */
+	protected void sequence_ChannelProtected(ISerializationContext context, Channel semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ChannelPublic returns Channel
+	 *
+	 * Constraint:
+	 *     (visibility=PublicChannelVisibilityKind name=ESIdentifier unrestrictedName=UnrestrictedName? signal+=SignalReference+)
+	 */
+	protected void sequence_ChannelPublic(ISerializationContext context, Channel semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Channel returns Channel
+	 *
+	 * Constraint:
+	 *     (visibility=VisibilityKind? name=ESIdentifier unrestrictedName=UnrestrictedName? signal+=SignalReference+)
+	 */
+	protected void sequence_Channel(ISerializationContext context, Channel semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionGuard returns CheckSatGuardStatement
+	 *     Statement returns CheckSatGuardStatement
+	 *     CheckSatGuardStatement returns CheckSatGuardStatement
+	 *
+	 * Constraint:
+	 *     (solver=ESIdentifier condition=Expression)
+	 */
+	protected void sequence_CheckSatGuardStatement(ISerializationContext context, CheckSatGuardStatement semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.CHECK_SAT_GUARD_STATEMENT__SOLVER) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.CHECK_SAT_GUARD_STATEMENT__SOLVER));
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.ABSTRACT_GUARD_STATEMENT__CONDITION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.ABSTRACT_GUARD_STATEMENT__CONDITION));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getCheckSatGuardStatementAccess().getSolverESIdentifierParserRuleCall_2_0(), semanticObject.getSolver());
+		feeder.accept(grammarAccess.getCheckSatGuardStatementAccess().getConditionExpressionParserRuleCall_4_0(), semanticObject.getCondition());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinitionImpl returns ChoiceType
+	 *     ChoiceTypeDefinitionImpl returns ChoiceType
+	 *
+	 * Constraint:
+	 *     (name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='choice' property+=Variable+)
+	 */
+	protected void sequence_ChoiceTypeDefinitionImpl(ISerializationContext context, ChoiceType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinition returns ChoiceType
+	 *     ChoiceTypeDefinition returns ChoiceType
+	 *
+	 * Constraint:
+	 *     (visibility=VisibilityKind? name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='choice' property+=Variable+)
+	 */
+	protected void sequence_ChoiceTypeDefinition(ISerializationContext context, ChoiceType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataType returns ChoiceType
+	 *     StructuredDataType returns ChoiceType
+	 *     ChoiceType returns ChoiceType
+	 *
+	 * Constraint:
+	 *     property+=Variable+
+	 */
+	protected void sequence_ChoiceType(ISerializationContext context, ChoiceType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinitionImpl returns CollectionType
+	 *     CollectionTypeDefinitionImpl returns CollectionType
+	 *
+	 * Constraint:
+	 *     (name=ESIdentifier unrestrictedName=UnrestrictedName? container=CollectionKind support=DataType (size=EInt | unbounded?='*')?)
+	 */
+	protected void sequence_CollectionTypeDefinitionImpl(ISerializationContext context, CollectionType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinition returns CollectionType
+	 *     CollectionTypeDefinition returns CollectionType
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=VisibilityKind? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         container=CollectionKind 
+	 *         support=DataType 
+	 *         (size=EInt | unbounded?='*')?
+	 *     )
+	 */
+	protected void sequence_CollectionTypeDefinition(ISerializationContext context, CollectionType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns CollectionType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns CollectionType
+	 *     DataType returns CollectionType
+	 *     SimpleDataType returns CollectionType
+	 *     CollectionType returns CollectionType
+	 *
+	 * Constraint:
+	 *     (container=CollectionKind support=DataType (size=EInt | unbounded?='*')?)
+	 */
+	protected void sequence_CollectionType(ISerializationContext context, CollectionType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ColonQualifiedName returns QualifiedName
+	 *
+	 * Constraint:
+	 *     (nameBinding+=NameBinding nameBinding+=NameBinding+)
+	 */
+	protected void sequence_ColonQualifiedName_UnqualifiedName(ISerializationContext context, QualifiedName semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ComElement returns ValueElementSpecification
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             target=ComElement_ValueElementSpecification_0_1_0 
+	 *             (kind=ValueDotFieldExpressionKind | kind=ValueArrowFieldExpressionKind) 
+	 *             element=[NamedElement|ESIdentifier]
+	 *         ) | 
+	 *         (
+	 *             target=LiteralReferenceMachineContext 
+	 *             (kind=ValueDotFieldExpressionKind | kind=ValueArrowFieldExpressionKind) 
+	 *             element=[NamedElement|ESIdentifier]
+	 *         )
+	 *     )
+	 */
+	protected void sequence_ComElement(ISerializationContext context, ValueElementSpecification semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ComPointProtocol returns ComProtocol
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             protocol=BufferProtocolKind 
+	 *             (inner_buffer=BufferContainerType | ref_buffer=[Buffer|ESUfid] | inner_buffer=BufferContainerType | ref_buffer=[Buffer|ESUfid])?
+	 *         ) | 
+	 *         inner_buffer=BufferContainerType | 
+	 *         ref_buffer=[Buffer|ESUfid]
+	 *     )
+	 */
+	protected void sequence_ComPointProtocol(ISerializationContext context, ComProtocol semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ComPoint returns ComPoint
+	 *
+	 * Constraint:
+	 *     (direction=ChannelDirection protocol=ComPointProtocol? (point=ComElement | points+=ComElement))
+	 */
+	protected void sequence_ComPoint(ISerializationContext context, ComPoint semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ComProtocol returns ComProtocol
+	 *
+	 * Constraint:
+	 *     (
+	 *         protocol=ComEnvRdvProtocolKind | 
+	 *         (protocol=ComMultiRdvProtocolKind cast=ComCastKing?) | 
+	 *         (
+	 *             protocol=BufferProtocolKind 
+	 *             (inner_buffer=BufferContainerType | ref_buffer=[Buffer|ESUfid] | inner_buffer=BufferContainerType | ref_buffer=[Buffer|ESUfid])?
+	 *         ) | 
+	 *         inner_buffer=BufferContainerType | 
+	 *         ref_buffer=[Buffer|ESUfid] | 
+	 *         cast=ComCastKing
+	 *     )
+	 */
+	protected void sequence_ComProtocol(ISerializationContext context, ComProtocol semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ComRouteProtocol returns ComProtocol
+	 *
+	 * Constraint:
+	 *     (
+	 *         protocol=ComProtocolKind | 
+	 *         (
+	 *             protocol=BufferProtocolKind 
+	 *             (inner_buffer=BufferContainerType | ref_buffer=[Buffer|ESUfid] | inner_buffer=BufferContainerType | ref_buffer=[Buffer|ESUfid])?
+	 *         ) | 
+	 *         inner_buffer=BufferContainerType | 
+	 *         ref_buffer=[Buffer|ESUfid]
+	 *     )
+	 */
+	protected void sequence_ComRouteProtocol(ISerializationContext context, ComProtocol semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     State returns State
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             composite?='state' 
+	 *             orthogonal?='and'? 
+	 *             name=ESIdentifier 
+	 *             unrestrictedName=UnrestrictedName? 
+	 *             (
+	 *                 (region+=StatemachineRegion | moe+=moeCompositeStateRoutines | transition+=Transition)+ | 
+	 *                 (region+=StatemachineRegionLite (transition+=Transition | moe+=moeCompositeStateRoutines)*)
+	 *             )?
+	 *         ) | 
+	 *         (simple?='state' name=ESIdentifier unrestrictedName=UnrestrictedName? (transition+=Transition | moe+=moeSimpleStateRoutines)*)
+	 *     )
+	 */
+	protected void sequence_CompositeState_SimpleState(ISerializationContext context, State semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     CompositeState returns State
+	 *
+	 * Constraint:
+	 *     (
+	 *         composite?='state' 
+	 *         orthogonal?='and'? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (
+	 *             (region+=StatemachineRegion | moe+=moeCompositeStateRoutines | transition+=Transition)+ | 
+	 *             (region+=StatemachineRegionLite (transition+=Transition | moe+=moeCompositeStateRoutines)*)
+	 *         )?
+	 *     )
+	 */
+	protected void sequence_CompositeState(ISerializationContext context, State semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns ConditionalTestExpression
+	 *     ConditionalTestExpression returns ConditionalTestExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns ConditionalTestExpression
+	 *     LogicalOrExpression returns ConditionalTestExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns ConditionalTestExpression
+	 *     LogicalAndExpression returns ConditionalTestExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns ConditionalTestExpression
+	 *     BitwiseOrExpression returns ConditionalTestExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns ConditionalTestExpression
+	 *     BitwiseXorExpression returns ConditionalTestExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns ConditionalTestExpression
+	 *     BitwiseAndExpression returns ConditionalTestExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns ConditionalTestExpression
+	 *     EqualityExpression returns ConditionalTestExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns ConditionalTestExpression
+	 *     RelationalExpression returns ConditionalTestExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns ConditionalTestExpression
+	 *     AdditiveExpression returns ConditionalTestExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns ConditionalTestExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns ConditionalTestExpression
+	 *     MultiplicativeExpression returns ConditionalTestExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns ConditionalTestExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns ConditionalTestExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns ConditionalTestExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns ConditionalTestExpression
+	 *     UnaryExpression returns ConditionalTestExpression
+	 *     PrimaryExpression returns ConditionalTestExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns ConditionalTestExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns ConditionalTestExpression
+	 *     BaseExpression returns ConditionalTestExpression
+	 *
+	 * Constraint:
+	 *     (condition=ConditionalTestExpression_ConditionalTestExpression_1_0 operator='?' thenOperand=Expression elseOperand=Expression)
+	 */
+	protected void sequence_ConditionalTestExpression(ISerializationContext context, ConditionalTestExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.CONDITIONAL_TEST_EXPRESSION__CONDITION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.CONDITIONAL_TEST_EXPRESSION__CONDITION));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.CONDITIONAL_TEST_EXPRESSION__OPERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.CONDITIONAL_TEST_EXPRESSION__OPERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.CONDITIONAL_TEST_EXPRESSION__THEN_OPERAND));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.CONDITIONAL_TEST_EXPRESSION__ELSE_OPERAND));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getConditionalTestExpressionAccess().getConditionalTestExpressionConditionAction_1_0(), semanticObject.getCondition());
+		feeder.accept(grammarAccess.getConditionalTestExpressionAccess().getOperatorQuestionMarkKeyword_1_1_0(), semanticObject.getOperator());
+		feeder.accept(grammarAccess.getConditionalTestExpressionAccess().getThenOperandExpressionParserRuleCall_1_2_0(), semanticObject.getThenOperand());
+		feeder.accept(grammarAccess.getConditionalTestExpressionAccess().getElseOperandExpressionParserRuleCall_1_4_0(), semanticObject.getElseOperand());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Connection returns Connection
+	 *
+	 * Constraint:
+	 *     (protocol=ComProtocol (name=ESIdentifier unrestrictedName=UnrestrictedName?)? comPoints+=ComPoint+)
+	 */
+	protected void sequence_Connection(ISerializationContext context, Connection semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns DataTypeReference
+	 *     DataType returns DataTypeReference
+	 *
+	 * Constraint:
+	 *     (
+	 *         (support=DataTypeReference_DataTypeReference_0_1_0 multiplicity=DataTypeMultiplicity) | 
+	 *         (typeref=[DataType|ESUfid] multiplicity=DataTypeMultiplicity?)
+	 *     )
+	 */
+	protected void sequence_DataTypeReference(ISerializationContext context, DataTypeReference semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns DoWhileStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns DoWhileStatement
+	 *     TransitionEffectStatement returns DoWhileStatement
+	 *     Statement returns DoWhileStatement
+	 *     DoWhileStatement returns DoWhileStatement
+	 *
+	 * Constraint:
+	 *     (bodyBlock=BlockStatement condition=Expression)
+	 */
+	protected void sequence_DoWhileStatement(ISerializationContext context, DoWhileStatement semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK));
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__CONDITION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__CONDITION));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getDoWhileStatementAccess().getBodyBlockBlockStatementParserRuleCall_1_0(), semanticObject.getBodyBlock());
+		feeder.accept(grammarAccess.getDoWhileStatementAccess().getConditionExpressionParserRuleCall_3_0(), semanticObject.getCondition());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DotQualifiedName returns QualifiedName
+	 *
+	 * Constraint:
+	 *     (nameBinding+=NameBinding nameBinding+=NameBinding+)
+	 */
+	protected void sequence_DotQualifiedName_UnqualifiedName(ISerializationContext context, QualifiedName semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DynamicInstanceSpecification returns InstanceMachine
+	 *
+	 * Constraint:
+	 *     (model=[Machine|ESIdentifier] ((slot+=SlotParameter slot+=SlotParameter*) | slot+=SlotProperty+)?)
+	 */
+	protected void sequence_DynamicInstanceSpecification(ISerializationContext context, InstanceMachine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ElseIfStatement returns ConditionalBlockStatement
+	 *
+	 * Constraint:
+	 *     (condition=Expression bodyBlock=BlockStatement)
+	 */
+	protected void sequence_ElseIfStatement(ISerializationContext context, ConditionalBlockStatement semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__CONDITION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__CONDITION));
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getElseIfStatementAccess().getConditionExpressionParserRuleCall_1_0(), semanticObject.getCondition());
+		feeder.accept(grammarAccess.getElseIfStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0(), semanticObject.getBodyBlock());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Pseudostate returns Pseudostate
+	 *
+	 * Constraint:
+	 *     (
+	 *         (kind=PseudostateKind name=ESIdentifier unrestrictedName=UnrestrictedName? transition+=Transition*) | 
+	 *         (
+	 *             ((kind=PseudostateInitialKind (name=ESIdentifier | name='#initial' | name='#init')) | name='#initial' | name='#init') 
+	 *             unrestrictedName=UnrestrictedName? 
+	 *             transition+=Transition*
+	 *         ) | 
+	 *         (kind=EndingPseudostateKind name=ESIdentifier unrestrictedName=UnrestrictedName? moe+=moeFinalStateRoutines*)
+	 *     )
+	 */
+	protected void sequence_EndingPseudostate_OtherPseudostate_PseudostateInitial(ISerializationContext context, Pseudostate semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EndingPseudostate returns Pseudostate
+	 *
+	 * Constraint:
+	 *     (kind=EndingPseudostateKind name=ESIdentifier unrestrictedName=UnrestrictedName? moe+=moeFinalStateRoutines*)
+	 */
+	protected void sequence_EndingPseudostate(ISerializationContext context, Pseudostate semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     EnumerationLiteral returns EnumerationLiteral
+	 *
+	 * Constraint:
+	 *     (name=ESIdentifier unrestrictedName=UnrestrictedName? value=LiteralTerminalExpression?)
+	 */
+	protected void sequence_EnumerationLiteral(ISerializationContext context, EnumerationLiteral semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinitionImpl returns EnumerationType
+	 *     EnumerationTypeDefinitionImpl returns EnumerationType
+	 *
+	 * Constraint:
+	 *     (name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='enum' literal+=EnumerationLiteral literal+=EnumerationLiteral*)
+	 */
+	protected void sequence_EnumerationTypeDefinitionImpl(ISerializationContext context, EnumerationType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinition returns EnumerationType
+	 *     EnumerationTypeDefinition returns EnumerationType
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=VisibilityKind? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         typedef?='enum' 
+	 *         literal+=EnumerationLiteral 
+	 *         literal+=EnumerationLiteral*
+	 *     )
+	 */
+	protected void sequence_EnumerationTypeDefinition(ISerializationContext context, EnumerationType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataType returns EnumerationType
+	 *     StructuredDataType returns EnumerationType
+	 *     EnumerationType returns EnumerationType
+	 *
+	 * Constraint:
+	 *     (literal+=EnumerationLiteral literal+=EnumerationLiteral*)
+	 */
+	protected void sequence_EnumerationType(ISerializationContext context, EnumerationType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns EqualityBinaryExpression
+	 *     ConditionalTestExpression returns EqualityBinaryExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns EqualityBinaryExpression
+	 *     LogicalOrExpression returns EqualityBinaryExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns EqualityBinaryExpression
+	 *     LogicalAndExpression returns EqualityBinaryExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns EqualityBinaryExpression
+	 *     BitwiseOrExpression returns EqualityBinaryExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns EqualityBinaryExpression
+	 *     BitwiseXorExpression returns EqualityBinaryExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns EqualityBinaryExpression
+	 *     BitwiseAndExpression returns EqualityBinaryExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns EqualityBinaryExpression
+	 *     EqualityExpression returns EqualityBinaryExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns EqualityBinaryExpression
+	 *     RelationalExpression returns EqualityBinaryExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns EqualityBinaryExpression
+	 *     AdditiveExpression returns EqualityBinaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns EqualityBinaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns EqualityBinaryExpression
+	 *     MultiplicativeExpression returns EqualityBinaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns EqualityBinaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns EqualityBinaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns EqualityBinaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns EqualityBinaryExpression
+	 *     UnaryExpression returns EqualityBinaryExpression
+	 *     PrimaryExpression returns EqualityBinaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns EqualityBinaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns EqualityBinaryExpression
+	 *     BaseExpression returns EqualityBinaryExpression
+	 *
+	 * Constraint:
+	 *     (leftOperand=EqualityExpression_EqualityBinaryExpression_1_0 operator=EqualityOperator rigthOperand=RelationalExpression)
+	 */
+	protected void sequence_EqualityExpression(ISerializationContext context, EqualityBinaryExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__LEFT_OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__LEFT_OPERAND));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__OPERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__OPERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__RIGTH_OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__RIGTH_OPERAND));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEqualityExpressionAccess().getEqualityBinaryExpressionLeftOperandAction_1_0(), semanticObject.getLeftOperand());
+		feeder.accept(grammarAccess.getEqualityExpressionAccess().getOperatorEqualityOperatorParserRuleCall_1_1_0(), semanticObject.getOperator());
+		feeder.accept(grammarAccess.getEqualityExpressionAccess().getRigthOperandRelationalExpressionParserRuleCall_1_2_0(), semanticObject.getRigthOperand());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionGuard returns EventGuardStatement
+	 *     Statement returns EventGuardStatement
+	 *     EventGuardStatement returns EventGuardStatement
+	 *
+	 * Constraint:
+	 *     condition=Expression
+	 */
+	protected void sequence_EventGuardStatement(ISerializationContext context, EventGuardStatement semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.ABSTRACT_GUARD_STATEMENT__CONDITION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.ABSTRACT_GUARD_STATEMENT__CONDITION));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getEventGuardStatementAccess().getConditionExpressionParserRuleCall_1_0(), semanticObject.getCondition());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ExpressionAsMachine returns ExpressionAsMachine
+	 *
+	 * Constraint:
+	 *     machine=ValuePureNamedMachineExpression
+	 */
+	protected void sequence_ExpressionAsMachine(ISerializationContext context, ExpressionAsMachine semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.EXPRESSION_AS_MACHINE__MACHINE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.EXPRESSION_AS_MACHINE__MACHINE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getExpressionAsMachineAccess().getMachineValuePureNamedMachineExpressionParserRuleCall_0(), semanticObject.getMachine());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns ExpressionStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns ExpressionStatement
+	 *     TransitionEffectStatement returns ExpressionStatement
+	 *     Statement returns ExpressionStatement
+	 *     ExpressionStatement returns ExpressionStatement
+	 *
+	 * Constraint:
+	 *     (
+	 *         expression=AssignmentExpression | 
+	 *         expression=NewfreshExpression | 
+	 *         expression=IncrementOrDecrementPrefixExpression | 
+	 *         expression=IncrementOrDecrementPostfixExpression
+	 *     )
+	 */
+	protected void sequence_ExpressionStatement(ISerializationContext context, ExpressionStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     State returns FinalState
+	 *     FinalState returns FinalState
+	 *
+	 * Constraint:
+	 *     (((simple?='state' name=ESIdentifier) | simple?='#final') unrestrictedName=UnrestrictedName? moe+=moeFinalStateRoutines*)
+	 */
+	protected void sequence_FinalState(ISerializationContext context, FinalState semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns ForEachStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns ForEachStatement
+	 *     TransitionEffectStatement returns ForEachStatement
+	 *     Statement returns ForEachStatement
+	 *     ForEachStatement returns ForEachStatement
+	 *
+	 * Constraint:
+	 *     (
+	 *         (iterator=LeftHandSideExpression enumeration=Expression bodyBlock=BlockStatement) | 
+	 *         (iterator=LeftHandSideExpression enumeration=Expression bodyBlock=BlockStatement)
+	 *     )
+	 */
+	protected void sequence_ForEachStatement(ISerializationContext context, ForEachStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns ForStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns ForStatement
+	 *     TransitionEffectStatement returns ForStatement
+	 *     Statement returns ForStatement
+	 *     ForStatement returns ForStatement
+	 *
+	 * Constraint:
+	 *     (
+	 *         (init=ForAssignmentExpression? condition=Expression iterate=ForAssignmentExpression? bodyBlock=BlockStatement) | 
+	 *         (init=ForAssignmentExpression? condition=Expression iterate=ForAssignmentExpression? bodyBlock=BlockStatement)
+	 *     )
+	 */
+	protected void sequence_ForStatement(ISerializationContext context, ForStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     FormalParameterSet returns ParameterSet
+	 *
+	 * Constraint:
+	 *     (parameter+=FormalParameter parameter+=FormalParameter*)
+	 */
+	protected void sequence_FormalParameterSet(ISerializationContext context, ParameterSet semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     FormalParameter returns Parameter
+	 *
+	 * Constraint:
+	 *     (direction=ParameterDirectionKind? type=DataType name=ESIdentifier? defaultValue=Expression?)
+	 */
+	protected void sequence_FormalParameter(ISerializationContext context, org.eclipse.efm.ecore.formalml.infrastructure.Parameter semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     FunctionalParameterSet returns ParameterSet
+	 *
+	 * Constraint:
+	 *     (parameter+=FunctionalParameter parameter+=FunctionalParameter*)
+	 */
+	protected void sequence_FunctionalParameterSet(ISerializationContext context, ParameterSet semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     FunctionalParameter returns Parameter
+	 *
+	 * Constraint:
+	 *     (direction=ParameterDirectionKind? type=DataType name=ESIdentifier defaultValue=Expression?)
+	 */
+	protected void sequence_FunctionalParameter(ISerializationContext context, org.eclipse.efm.ecore.formalml.infrastructure.Parameter semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Statement returns GuardStatement
+	 *     GuardStatement returns GuardStatement
+	 *
+	 * Constraint:
+	 *     condition=Expression
+	 */
+	protected void sequence_GuardStatement(ISerializationContext context, GuardStatement semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.ABSTRACT_GUARD_STATEMENT__CONDITION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.ABSTRACT_GUARD_STATEMENT__CONDITION));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getGuardStatementAccess().getConditionExpressionParserRuleCall_1_0(), semanticObject.getCondition());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionGuard returns GuardStatement
+	 *
+	 * Constraint:
+	 *     (condition=TransitionGuardExpression | condition=Expression | condition=Expression | condition=Expression)
+	 */
+	protected void sequence_GuardStatement_TransitionGuard(ISerializationContext context, GuardStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns IfStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns IfStatement
+	 *     TransitionEffectStatement returns IfStatement
+	 *     Statement returns IfStatement
+	 *     IfStatement returns IfStatement
+	 *
+	 * Constraint:
+	 *     (condition=Expression bodyBlock=BlockStatement elseifStatement+=ElseIfStatement* elseBlock=BlockStatement?)
+	 */
+	protected void sequence_IfStatement(ISerializationContext context, IfStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ForAssignmentExpression returns IncrementOrDecrementPostfixExpression
+	 *     Expression returns IncrementOrDecrementPostfixExpression
+	 *     ConditionalTestExpression returns IncrementOrDecrementPostfixExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     LogicalOrExpression returns IncrementOrDecrementPostfixExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     LogicalAndExpression returns IncrementOrDecrementPostfixExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     BitwiseOrExpression returns IncrementOrDecrementPostfixExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     BitwiseXorExpression returns IncrementOrDecrementPostfixExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     BitwiseAndExpression returns IncrementOrDecrementPostfixExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     EqualityExpression returns IncrementOrDecrementPostfixExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     RelationalExpression returns IncrementOrDecrementPostfixExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     AdditiveExpression returns IncrementOrDecrementPostfixExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns IncrementOrDecrementPostfixExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     MultiplicativeExpression returns IncrementOrDecrementPostfixExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns IncrementOrDecrementPostfixExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns IncrementOrDecrementPostfixExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns IncrementOrDecrementPostfixExpression
+	 *     UnaryExpression returns IncrementOrDecrementPostfixExpression
+	 *     PostfixUnaryExpression returns IncrementOrDecrementPostfixExpression
+	 *     IncrementOrDecrementPostfixExpression returns IncrementOrDecrementPostfixExpression
+	 *     PrimaryExpression returns IncrementOrDecrementPostfixExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns IncrementOrDecrementPostfixExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns IncrementOrDecrementPostfixExpression
+	 *     BaseExpression returns IncrementOrDecrementPostfixExpression
+	 *
+	 * Constraint:
+	 *     (leftHandSide=LeftHandSideExpression operator=AffixOperator)
+	 */
+	protected void sequence_IncrementOrDecrementPostfixExpression(ISerializationContext context, IncrementOrDecrementPostfixExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0(), semanticObject.getLeftHandSide());
+		feeder.accept(grammarAccess.getIncrementOrDecrementPostfixExpressionAccess().getOperatorAffixOperatorParserRuleCall_1_0(), semanticObject.getOperator());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ForAssignmentExpression returns IncrementOrDecrementPrefixExpression
+	 *     Expression returns IncrementOrDecrementPrefixExpression
+	 *     ConditionalTestExpression returns IncrementOrDecrementPrefixExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     LogicalOrExpression returns IncrementOrDecrementPrefixExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     LogicalAndExpression returns IncrementOrDecrementPrefixExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     BitwiseOrExpression returns IncrementOrDecrementPrefixExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     BitwiseXorExpression returns IncrementOrDecrementPrefixExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     BitwiseAndExpression returns IncrementOrDecrementPrefixExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     EqualityExpression returns IncrementOrDecrementPrefixExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     RelationalExpression returns IncrementOrDecrementPrefixExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     AdditiveExpression returns IncrementOrDecrementPrefixExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns IncrementOrDecrementPrefixExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     MultiplicativeExpression returns IncrementOrDecrementPrefixExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns IncrementOrDecrementPrefixExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns IncrementOrDecrementPrefixExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns IncrementOrDecrementPrefixExpression
+	 *     UnaryExpression returns IncrementOrDecrementPrefixExpression
+	 *     PrefixUnaryExpression returns IncrementOrDecrementPrefixExpression
+	 *     IncrementOrDecrementPrefixExpression returns IncrementOrDecrementPrefixExpression
+	 *     PrimaryExpression returns IncrementOrDecrementPrefixExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns IncrementOrDecrementPrefixExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns IncrementOrDecrementPrefixExpression
+	 *     BaseExpression returns IncrementOrDecrementPrefixExpression
+	 *
+	 * Constraint:
+	 *     (operator=AffixOperator leftHandSide=LeftHandSideExpression)
+	 */
+	protected void sequence_IncrementOrDecrementPrefixExpression(ISerializationContext context, IncrementOrDecrementPrefixExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_EXPRESSION__OPERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.INCREMENT_OR_DECREMENT_EXPRESSION__LEFT_HAND_SIDE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getOperatorAffixOperatorParserRuleCall_0_0(), semanticObject.getOperator());
+		feeder.accept(grammarAccess.getIncrementOrDecrementPrefixExpressionAccess().getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0(), semanticObject.getLeftHandSide());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionTrigger returns InputComStatement
+	 *     Statement returns InputComStatement
+	 *     InputComStatement returns InputComStatement
+	 *
+	 * Constraint:
+	 *     (port=[NamedElement|ESUfid] (leftValue+=Expression leftValue+=Expression*)? (target=ExpressionAsMachine | route=[Channel|ESUfid])*)
+	 */
+	protected void sequence_InputComStatement(ISerializationContext context, InputComStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     InstanceMachine returns InstanceMachine
+	 *
+	 * Constraint:
+	 *     (model=[Machine|ESUfid] name=ESIdentifier unrestrictedName=UnrestrictedName? ((slot+=SlotParameter slot+=SlotParameter*) | slot+=SlotProperty+)?)
+	 */
+	protected void sequence_InstanceMachine(ISerializationContext context, InstanceMachine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns InstantiationExpression
+	 *     ConditionalTestExpression returns InstantiationExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns InstantiationExpression
+	 *     LogicalOrExpression returns InstantiationExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns InstantiationExpression
+	 *     LogicalAndExpression returns InstantiationExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns InstantiationExpression
+	 *     BitwiseOrExpression returns InstantiationExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns InstantiationExpression
+	 *     BitwiseXorExpression returns InstantiationExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns InstantiationExpression
+	 *     BitwiseAndExpression returns InstantiationExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns InstantiationExpression
+	 *     EqualityExpression returns InstantiationExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns InstantiationExpression
+	 *     RelationalExpression returns InstantiationExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns InstantiationExpression
+	 *     AdditiveExpression returns InstantiationExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns InstantiationExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns InstantiationExpression
+	 *     MultiplicativeExpression returns InstantiationExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns InstantiationExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns InstantiationExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns InstantiationExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns InstantiationExpression
+	 *     UnaryExpression returns InstantiationExpression
+	 *     PrimaryExpression returns InstantiationExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns InstantiationExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns InstantiationExpression
+	 *     BaseExpression returns InstantiationExpression
+	 *     InstantiationExpression returns InstantiationExpression
+	 *
+	 * Constraint:
+	 *     instance=DynamicInstanceSpecification
+	 */
+	protected void sequence_InstantiationExpression(ISerializationContext context, InstantiationExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.INSTANTIATION_EXPRESSION__INSTANCE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.INSTANTIATION_EXPRESSION__INSTANCE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getInstantiationExpressionAccess().getInstanceDynamicInstanceSpecificationParserRuleCall_1_0(), semanticObject.getInstance());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns InterruptStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns InterruptStatement
+	 *     TransitionEffectStatement returns InterruptStatement
+	 *     Statement returns InterruptStatement
+	 *     InterruptStatement returns InterruptStatement
+	 *
+	 * Constraint:
+	 *     (kind=InterruptStatementKind (expr+=Expression | (expr+=Expression expr+=Expression*))?)
+	 */
+	protected void sequence_InterruptStatement(ISerializationContext context, InterruptStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinitionImpl returns IntervalType
+	 *     IntervalTypeDefinitionImpl returns IntervalType
+	 *
+	 * Constraint:
+	 *     (
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         support=PrimitiveNumberType 
+	 *         lopen?=']'? 
+	 *         infimum=Expression 
+	 *         supremum=Expression 
+	 *         ropen?='['?
+	 *     )
+	 */
+	protected void sequence_IntervalTypeDefinitionImpl(ISerializationContext context, IntervalType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinition returns IntervalType
+	 *     IntervalTypeDefinition returns IntervalType
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=VisibilityKind? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         support=PrimitiveNumberType 
+	 *         lopen?=']'? 
+	 *         infimum=Expression 
+	 *         supremum=Expression 
+	 *         ropen?='['?
+	 *     )
+	 */
+	protected void sequence_IntervalTypeDefinition(ISerializationContext context, IntervalType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns IntervalType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns IntervalType
+	 *     DataType returns IntervalType
+	 *     SimpleDataType returns IntervalType
+	 *     IntervalType returns IntervalType
+	 *
+	 * Constraint:
+	 *     (support=PrimitiveNumberType lopen?=']'? infimum=Expression supremum=Expression ropen?='['?)
+	 */
+	protected void sequence_IntervalType(ISerializationContext context, IntervalType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns InvokeExpression
+	 *     ConditionalTestExpression returns InvokeExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns InvokeExpression
+	 *     LogicalOrExpression returns InvokeExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns InvokeExpression
+	 *     LogicalAndExpression returns InvokeExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns InvokeExpression
+	 *     BitwiseOrExpression returns InvokeExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns InvokeExpression
+	 *     BitwiseXorExpression returns InvokeExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns InvokeExpression
+	 *     BitwiseAndExpression returns InvokeExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns InvokeExpression
+	 *     EqualityExpression returns InvokeExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns InvokeExpression
+	 *     RelationalExpression returns InvokeExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns InvokeExpression
+	 *     AdditiveExpression returns InvokeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns InvokeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns InvokeExpression
+	 *     MultiplicativeExpression returns InvokeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns InvokeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns InvokeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns InvokeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns InvokeExpression
+	 *     UnaryExpression returns InvokeExpression
+	 *     PrimaryExpression returns InvokeExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns InvokeExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns InvokeExpression
+	 *     BaseExpression returns InvokeExpression
+	 *     InvokeExpressionDeprecated returns InvokeExpression
+	 *
+	 * Constraint:
+	 *     (args+=Expression invoke=LiteralReferenceElement args+=Expression*)
+	 */
+	protected void sequence_InvokeExpressionDeprecated(ISerializationContext context, InvokeExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     InvokeExpression returns InvokeExpression
+	 *
+	 * Constraint:
+	 *     invoke=ValueSelectionExpression
+	 */
+	protected void sequence_InvokeExpression(ISerializationContext context, InvokeExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.INVOKE_EXPRESSION__INVOKE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.INVOKE_EXPRESSION__INVOKE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getInvokeExpressionAccess().getInvokeValueSelectionExpressionParserRuleCall_1_0(), semanticObject.getInvoke());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns InvokeStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns InvokeStatement
+	 *     TransitionEffectStatement returns InvokeStatement
+	 *     Statement returns InvokeStatement
+	 *     InvokeStatement returns InvokeStatement
+	 *
+	 * Constraint:
+	 *     (
+	 *         expression=InvokeExpressionDeprecated | 
+	 *         (
+	 *             invokable=[NamedElement|ESUfid] 
+	 *             execRoutine?='(' 
+	 *             args=MixTupleExpressionList? 
+	 *             ((rets+=[Variable|ID] rets+=[Variable|ID]*) | (rets+=[Variable|ID] rets+=[Variable|ID]*))?
+	 *         ) | 
+	 *         (
+	 *             execRoutine?='exec' 
+	 *             invokable=[NamedElement|ESUfid] 
+	 *             args=MixTupleExpressionList? 
+	 *             ((rets+=[Variable|ID] rets+=[Variable|ID]*) | (rets+=[Variable|ID] rets+=[Variable|ID]*))?
+	 *         ) | 
+	 *         (
+	 *             callProcedure?='call' 
+	 *             invokable=[NamedElement|ESUfid] 
+	 *             args=MixTupleExpressionList? 
+	 *             ((rets+=[Variable|ID] rets+=[Variable|ID]*) | (rets+=[Variable|ID] rets+=[Variable|ID]*))?
+	 *         )
+	 *     )
+	 */
+	protected void sequence_InvokeStatement(ISerializationContext context, InvokeStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     LeftHandSideExpression returns LeftHandSideExpression
+	 *
+	 * Constraint:
+	 *     (lvalue=ValueSelectionExpression | lvalue=ValueSelectionExpression)
+	 */
+	protected void sequence_LeftHandSideExpression(ISerializationContext context, LeftHandSideExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralBooleanExpression
+	 *     ConditionalTestExpression returns LiteralBooleanExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralBooleanExpression
+	 *     LogicalOrExpression returns LiteralBooleanExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralBooleanExpression
+	 *     LogicalAndExpression returns LiteralBooleanExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralBooleanExpression
+	 *     BitwiseOrExpression returns LiteralBooleanExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralBooleanExpression
+	 *     BitwiseXorExpression returns LiteralBooleanExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralBooleanExpression
+	 *     BitwiseAndExpression returns LiteralBooleanExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralBooleanExpression
+	 *     EqualityExpression returns LiteralBooleanExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralBooleanExpression
+	 *     RelationalExpression returns LiteralBooleanExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralBooleanExpression
+	 *     AdditiveExpression returns LiteralBooleanExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralBooleanExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralBooleanExpression
+	 *     MultiplicativeExpression returns LiteralBooleanExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralBooleanExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralBooleanExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralBooleanExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralBooleanExpression
+	 *     UnaryExpression returns LiteralBooleanExpression
+	 *     PrimaryExpression returns LiteralBooleanExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralBooleanExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralBooleanExpression
+	 *     BaseExpression returns LiteralBooleanExpression
+	 *     LiteralExpression returns LiteralBooleanExpression
+	 *     LiteralTerminalExpression returns LiteralBooleanExpression
+	 *     LiteralBooleanExpression returns LiteralBooleanExpression
+	 *
+	 * Constraint:
+	 *     value=EBoolean
+	 */
+	protected void sequence_LiteralBooleanExpression(ISerializationContext context, LiteralBooleanExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_BOOLEAN_EXPRESSION__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_BOOLEAN_EXPRESSION__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralBooleanExpressionAccess().getValueEBooleanParserRuleCall_1_0(), semanticObject.isValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralCharacterExpression
+	 *     ConditionalTestExpression returns LiteralCharacterExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralCharacterExpression
+	 *     LogicalOrExpression returns LiteralCharacterExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralCharacterExpression
+	 *     LogicalAndExpression returns LiteralCharacterExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralCharacterExpression
+	 *     BitwiseOrExpression returns LiteralCharacterExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralCharacterExpression
+	 *     BitwiseXorExpression returns LiteralCharacterExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralCharacterExpression
+	 *     BitwiseAndExpression returns LiteralCharacterExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralCharacterExpression
+	 *     EqualityExpression returns LiteralCharacterExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralCharacterExpression
+	 *     RelationalExpression returns LiteralCharacterExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralCharacterExpression
+	 *     AdditiveExpression returns LiteralCharacterExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralCharacterExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralCharacterExpression
+	 *     MultiplicativeExpression returns LiteralCharacterExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralCharacterExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralCharacterExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralCharacterExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralCharacterExpression
+	 *     UnaryExpression returns LiteralCharacterExpression
+	 *     PrimaryExpression returns LiteralCharacterExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralCharacterExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralCharacterExpression
+	 *     BaseExpression returns LiteralCharacterExpression
+	 *     LiteralExpression returns LiteralCharacterExpression
+	 *     LiteralTerminalExpression returns LiteralCharacterExpression
+	 *     LiteralCharacterExpression returns LiteralCharacterExpression
+	 *
+	 * Constraint:
+	 *     value=ECharacter
+	 */
+	protected void sequence_LiteralCharacterExpression(ISerializationContext context, LiteralCharacterExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_CHARACTER_EXPRESSION__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_CHARACTER_EXPRESSION__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralCharacterExpressionAccess().getValueECharacterParserRuleCall_1_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralCollectionExpression
+	 *     ConditionalTestExpression returns LiteralCollectionExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralCollectionExpression
+	 *     LogicalOrExpression returns LiteralCollectionExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralCollectionExpression
+	 *     LogicalAndExpression returns LiteralCollectionExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralCollectionExpression
+	 *     BitwiseOrExpression returns LiteralCollectionExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralCollectionExpression
+	 *     BitwiseXorExpression returns LiteralCollectionExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralCollectionExpression
+	 *     BitwiseAndExpression returns LiteralCollectionExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralCollectionExpression
+	 *     EqualityExpression returns LiteralCollectionExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralCollectionExpression
+	 *     RelationalExpression returns LiteralCollectionExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralCollectionExpression
+	 *     AdditiveExpression returns LiteralCollectionExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralCollectionExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralCollectionExpression
+	 *     MultiplicativeExpression returns LiteralCollectionExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralCollectionExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralCollectionExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralCollectionExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralCollectionExpression
+	 *     UnaryExpression returns LiteralCollectionExpression
+	 *     PrimaryExpression returns LiteralCollectionExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralCollectionExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralCollectionExpression
+	 *     BaseExpression returns LiteralCollectionExpression
+	 *     LiteralExpression returns LiteralCollectionExpression
+	 *     LiteralReferenceableExpression returns LiteralCollectionExpression
+	 *     LiteralCollectionExpression returns LiteralCollectionExpression
+	 *
+	 * Constraint:
+	 *     (datatype=DataType? ((value+=Expression | value+=NamedExpression) value+=NamedExpression? (value+=Expression? value+=NamedExpression?)*)?)
+	 */
+	protected void sequence_LiteralCollectionExpression(ISerializationContext context, LiteralCollectionExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralEnvExpression
+	 *     ConditionalTestExpression returns LiteralEnvExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralEnvExpression
+	 *     LogicalOrExpression returns LiteralEnvExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralEnvExpression
+	 *     LogicalAndExpression returns LiteralEnvExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralEnvExpression
+	 *     BitwiseOrExpression returns LiteralEnvExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralEnvExpression
+	 *     BitwiseXorExpression returns LiteralEnvExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralEnvExpression
+	 *     BitwiseAndExpression returns LiteralEnvExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralEnvExpression
+	 *     EqualityExpression returns LiteralEnvExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralEnvExpression
+	 *     RelationalExpression returns LiteralEnvExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralEnvExpression
+	 *     AdditiveExpression returns LiteralEnvExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralEnvExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralEnvExpression
+	 *     MultiplicativeExpression returns LiteralEnvExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralEnvExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralEnvExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralEnvExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralEnvExpression
+	 *     UnaryExpression returns LiteralEnvExpression
+	 *     PrimaryExpression returns LiteralEnvExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralEnvExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralEnvExpression
+	 *     BaseExpression returns LiteralEnvExpression
+	 *     LiteralExpression returns LiteralEnvExpression
+	 *     LiteralReferenceableExpression returns LiteralEnvExpression
+	 *     LiteralReferenceExpression returns LiteralEnvExpression
+	 *     LiteralReferenceMachineContext returns LiteralEnvExpression
+	 *     LiteralEnvExpression returns LiteralEnvExpression
+	 *     LiteralPureReferenceExpression returns LiteralEnvExpression
+	 *     ValueSelectionExpression returns LiteralEnvExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns LiteralEnvExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns LiteralEnvExpression
+	 *     ValuePureNamedMachineExpression returns LiteralEnvExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_1_0 returns LiteralEnvExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_2_0 returns LiteralEnvExpression
+	 *
+	 * Constraint:
+	 *     {LiteralEnvExpression}
+	 */
+	protected void sequence_LiteralEnvExpression(ISerializationContext context, LiteralEnvExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralFloatExpression
+	 *     ConditionalTestExpression returns LiteralFloatExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralFloatExpression
+	 *     LogicalOrExpression returns LiteralFloatExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralFloatExpression
+	 *     LogicalAndExpression returns LiteralFloatExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralFloatExpression
+	 *     BitwiseOrExpression returns LiteralFloatExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralFloatExpression
+	 *     BitwiseXorExpression returns LiteralFloatExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralFloatExpression
+	 *     BitwiseAndExpression returns LiteralFloatExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralFloatExpression
+	 *     EqualityExpression returns LiteralFloatExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralFloatExpression
+	 *     RelationalExpression returns LiteralFloatExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralFloatExpression
+	 *     AdditiveExpression returns LiteralFloatExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralFloatExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralFloatExpression
+	 *     MultiplicativeExpression returns LiteralFloatExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralFloatExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralFloatExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralFloatExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralFloatExpression
+	 *     UnaryExpression returns LiteralFloatExpression
+	 *     PrimaryExpression returns LiteralFloatExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralFloatExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralFloatExpression
+	 *     BaseExpression returns LiteralFloatExpression
+	 *     LiteralExpression returns LiteralFloatExpression
+	 *     LiteralTerminalExpression returns LiteralFloatExpression
+	 *     LiteralFloatExpression returns LiteralFloatExpression
+	 *
+	 * Constraint:
+	 *     value=EDouble
+	 */
+	protected void sequence_LiteralFloatExpression(ISerializationContext context, LiteralFloatExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_FLOAT_EXPRESSION__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_FLOAT_EXPRESSION__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralFloatExpressionAccess().getValueEDoubleParserRuleCall_1_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeMultiplicity returns LiteralIntegerExpression
+	 *     Expression returns LiteralIntegerExpression
+	 *     ConditionalTestExpression returns LiteralIntegerExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralIntegerExpression
+	 *     LogicalOrExpression returns LiteralIntegerExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralIntegerExpression
+	 *     LogicalAndExpression returns LiteralIntegerExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralIntegerExpression
+	 *     BitwiseOrExpression returns LiteralIntegerExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralIntegerExpression
+	 *     BitwiseXorExpression returns LiteralIntegerExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralIntegerExpression
+	 *     BitwiseAndExpression returns LiteralIntegerExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralIntegerExpression
+	 *     EqualityExpression returns LiteralIntegerExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralIntegerExpression
+	 *     RelationalExpression returns LiteralIntegerExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralIntegerExpression
+	 *     AdditiveExpression returns LiteralIntegerExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralIntegerExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralIntegerExpression
+	 *     MultiplicativeExpression returns LiteralIntegerExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralIntegerExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralIntegerExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralIntegerExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralIntegerExpression
+	 *     UnaryExpression returns LiteralIntegerExpression
+	 *     PrimaryExpression returns LiteralIntegerExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralIntegerExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralIntegerExpression
+	 *     BaseExpression returns LiteralIntegerExpression
+	 *     LiteralExpression returns LiteralIntegerExpression
+	 *     LiteralTerminalExpression returns LiteralIntegerExpression
+	 *     LiteralIntegerExpression returns LiteralIntegerExpression
+	 *
+	 * Constraint:
+	 *     value=EInteger
+	 */
+	protected void sequence_LiteralIntegerExpression(ISerializationContext context, LiteralIntegerExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_INTEGER_EXPRESSION__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_INTEGER_EXPRESSION__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralIntegerExpressionAccess().getValueEIntegerParserRuleCall_1_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralNullExpression
+	 *     ConditionalTestExpression returns LiteralNullExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralNullExpression
+	 *     LogicalOrExpression returns LiteralNullExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralNullExpression
+	 *     LogicalAndExpression returns LiteralNullExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralNullExpression
+	 *     BitwiseOrExpression returns LiteralNullExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralNullExpression
+	 *     BitwiseXorExpression returns LiteralNullExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralNullExpression
+	 *     BitwiseAndExpression returns LiteralNullExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralNullExpression
+	 *     EqualityExpression returns LiteralNullExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralNullExpression
+	 *     RelationalExpression returns LiteralNullExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralNullExpression
+	 *     AdditiveExpression returns LiteralNullExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralNullExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralNullExpression
+	 *     MultiplicativeExpression returns LiteralNullExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralNullExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralNullExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralNullExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralNullExpression
+	 *     UnaryExpression returns LiteralNullExpression
+	 *     PrimaryExpression returns LiteralNullExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralNullExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralNullExpression
+	 *     BaseExpression returns LiteralNullExpression
+	 *     LiteralExpression returns LiteralNullExpression
+	 *     LiteralTerminalExpression returns LiteralNullExpression
+	 *     LiteralNullExpression returns LiteralNullExpression
+	 *
+	 * Constraint:
+	 *     type=DataType?
+	 */
+	protected void sequence_LiteralNullExpression(ISerializationContext context, LiteralNullExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralParentExpression
+	 *     ConditionalTestExpression returns LiteralParentExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralParentExpression
+	 *     LogicalOrExpression returns LiteralParentExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralParentExpression
+	 *     LogicalAndExpression returns LiteralParentExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralParentExpression
+	 *     BitwiseOrExpression returns LiteralParentExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralParentExpression
+	 *     BitwiseXorExpression returns LiteralParentExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralParentExpression
+	 *     BitwiseAndExpression returns LiteralParentExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralParentExpression
+	 *     EqualityExpression returns LiteralParentExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralParentExpression
+	 *     RelationalExpression returns LiteralParentExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralParentExpression
+	 *     AdditiveExpression returns LiteralParentExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralParentExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralParentExpression
+	 *     MultiplicativeExpression returns LiteralParentExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralParentExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralParentExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralParentExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralParentExpression
+	 *     UnaryExpression returns LiteralParentExpression
+	 *     PrimaryExpression returns LiteralParentExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralParentExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralParentExpression
+	 *     BaseExpression returns LiteralParentExpression
+	 *     LiteralExpression returns LiteralParentExpression
+	 *     LiteralReferenceableExpression returns LiteralParentExpression
+	 *     LiteralReferenceExpression returns LiteralParentExpression
+	 *     LiteralReferenceMachineContext returns LiteralParentExpression
+	 *     LiteralParentExpression returns LiteralParentExpression
+	 *     LiteralPureReferenceExpression returns LiteralParentExpression
+	 *     ValueSelectionExpression returns LiteralParentExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns LiteralParentExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns LiteralParentExpression
+	 *     ValuePureNamedMachineExpression returns LiteralParentExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_1_0 returns LiteralParentExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_2_0 returns LiteralParentExpression
+	 *
+	 * Constraint:
+	 *     {LiteralParentExpression}
+	 */
+	protected void sequence_LiteralParentExpression(ISerializationContext context, LiteralParentExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ComElement returns LiteralReferenceElement
+	 *     ComElement.ValueElementSpecification_0_1_0 returns LiteralReferenceElement
+	 *     LiteralPureReferenceElement returns LiteralReferenceElement
+	 *     LiteralPureReferenceExpression returns LiteralReferenceElement
+	 *     ValuePureNamedMachineExpression returns LiteralReferenceElement
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_1_0 returns LiteralReferenceElement
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_2_0 returns LiteralReferenceElement
+	 *
+	 * Constraint:
+	 *     value=[NamedElement|ESIdentifier]
+	 */
+	protected void sequence_LiteralPureReferenceElement(ISerializationContext context, LiteralReferenceElement semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_ELEMENT__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_REFERENCE_ELEMENT__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralPureReferenceElementAccess().getValueNamedElementESIdentifierParserRuleCall_1_0_1(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralRationalExpression
+	 *     ConditionalTestExpression returns LiteralRationalExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralRationalExpression
+	 *     LogicalOrExpression returns LiteralRationalExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralRationalExpression
+	 *     LogicalAndExpression returns LiteralRationalExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralRationalExpression
+	 *     BitwiseOrExpression returns LiteralRationalExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralRationalExpression
+	 *     BitwiseXorExpression returns LiteralRationalExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralRationalExpression
+	 *     BitwiseAndExpression returns LiteralRationalExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralRationalExpression
+	 *     EqualityExpression returns LiteralRationalExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralRationalExpression
+	 *     RelationalExpression returns LiteralRationalExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralRationalExpression
+	 *     AdditiveExpression returns LiteralRationalExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralRationalExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralRationalExpression
+	 *     MultiplicativeExpression returns LiteralRationalExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralRationalExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralRationalExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralRationalExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralRationalExpression
+	 *     UnaryExpression returns LiteralRationalExpression
+	 *     PrimaryExpression returns LiteralRationalExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralRationalExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralRationalExpression
+	 *     BaseExpression returns LiteralRationalExpression
+	 *     LiteralExpression returns LiteralRationalExpression
+	 *     LiteralTerminalExpression returns LiteralRationalExpression
+	 *     LiteralRationalExpression returns LiteralRationalExpression
+	 *
+	 * Constraint:
+	 *     (numerator=EInteger denominator=EInteger)
+	 */
+	protected void sequence_LiteralRationalExpression(ISerializationContext context, LiteralRationalExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_RATIONAL_EXPRESSION__NUMERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_RATIONAL_EXPRESSION__NUMERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_RATIONAL_EXPRESSION__DENOMINATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_RATIONAL_EXPRESSION__DENOMINATOR));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralRationalExpressionAccess().getNumeratorEIntegerParserRuleCall_1_0(), semanticObject.getNumerator());
+		feeder.accept(grammarAccess.getLiteralRationalExpressionAccess().getDenominatorEIntegerParserRuleCall_3_0(), semanticObject.getDenominator());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeMultiplicity returns LiteralReferenceElement
+	 *     Expression returns LiteralReferenceElement
+	 *     ConditionalTestExpression returns LiteralReferenceElement
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralReferenceElement
+	 *     LogicalOrExpression returns LiteralReferenceElement
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralReferenceElement
+	 *     LogicalAndExpression returns LiteralReferenceElement
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralReferenceElement
+	 *     BitwiseOrExpression returns LiteralReferenceElement
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralReferenceElement
+	 *     BitwiseXorExpression returns LiteralReferenceElement
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralReferenceElement
+	 *     BitwiseAndExpression returns LiteralReferenceElement
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralReferenceElement
+	 *     EqualityExpression returns LiteralReferenceElement
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralReferenceElement
+	 *     RelationalExpression returns LiteralReferenceElement
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralReferenceElement
+	 *     AdditiveExpression returns LiteralReferenceElement
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralReferenceElement
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralReferenceElement
+	 *     MultiplicativeExpression returns LiteralReferenceElement
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralReferenceElement
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralReferenceElement
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralReferenceElement
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralReferenceElement
+	 *     UnaryExpression returns LiteralReferenceElement
+	 *     PrimaryExpression returns LiteralReferenceElement
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralReferenceElement
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralReferenceElement
+	 *     BaseExpression returns LiteralReferenceElement
+	 *     LiteralExpression returns LiteralReferenceElement
+	 *     LiteralReferenceableExpression returns LiteralReferenceElement
+	 *     LiteralReferenceExpression returns LiteralReferenceElement
+	 *     LiteralReferenceElement returns LiteralReferenceElement
+	 *     ValueSelectionExpression returns LiteralReferenceElement
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns LiteralReferenceElement
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns LiteralReferenceElement
+	 *
+	 * Constraint:
+	 *     (
+	 *         value=[NamedElement|ESIdentifier] 
+	 *         ((kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList) | (kind=ValueParameterExpressionKind arg=MixTupleExpressionList))?
+	 *     )
+	 */
+	protected void sequence_LiteralReferenceElement(ISerializationContext context, LiteralReferenceElement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralSelfExpression
+	 *     ConditionalTestExpression returns LiteralSelfExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralSelfExpression
+	 *     LogicalOrExpression returns LiteralSelfExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralSelfExpression
+	 *     LogicalAndExpression returns LiteralSelfExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralSelfExpression
+	 *     BitwiseOrExpression returns LiteralSelfExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralSelfExpression
+	 *     BitwiseXorExpression returns LiteralSelfExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralSelfExpression
+	 *     BitwiseAndExpression returns LiteralSelfExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralSelfExpression
+	 *     EqualityExpression returns LiteralSelfExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralSelfExpression
+	 *     RelationalExpression returns LiteralSelfExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralSelfExpression
+	 *     AdditiveExpression returns LiteralSelfExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralSelfExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralSelfExpression
+	 *     MultiplicativeExpression returns LiteralSelfExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralSelfExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralSelfExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralSelfExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralSelfExpression
+	 *     UnaryExpression returns LiteralSelfExpression
+	 *     PrimaryExpression returns LiteralSelfExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralSelfExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralSelfExpression
+	 *     BaseExpression returns LiteralSelfExpression
+	 *     LiteralExpression returns LiteralSelfExpression
+	 *     LiteralReferenceableExpression returns LiteralSelfExpression
+	 *     LiteralReferenceExpression returns LiteralSelfExpression
+	 *     LiteralReferenceMachineContext returns LiteralSelfExpression
+	 *     LiteralSelfExpression returns LiteralSelfExpression
+	 *     LiteralPureReferenceExpression returns LiteralSelfExpression
+	 *     ValueSelectionExpression returns LiteralSelfExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns LiteralSelfExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns LiteralSelfExpression
+	 *     ValuePureNamedMachineExpression returns LiteralSelfExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_1_0 returns LiteralSelfExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_2_0 returns LiteralSelfExpression
+	 *
+	 * Constraint:
+	 *     {LiteralSelfExpression}
+	 */
+	protected void sequence_LiteralSelfExpression(ISerializationContext context, LiteralSelfExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralStringExpression
+	 *     ConditionalTestExpression returns LiteralStringExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralStringExpression
+	 *     LogicalOrExpression returns LiteralStringExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralStringExpression
+	 *     LogicalAndExpression returns LiteralStringExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralStringExpression
+	 *     BitwiseOrExpression returns LiteralStringExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralStringExpression
+	 *     BitwiseXorExpression returns LiteralStringExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralStringExpression
+	 *     BitwiseAndExpression returns LiteralStringExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralStringExpression
+	 *     EqualityExpression returns LiteralStringExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralStringExpression
+	 *     RelationalExpression returns LiteralStringExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralStringExpression
+	 *     AdditiveExpression returns LiteralStringExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralStringExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralStringExpression
+	 *     MultiplicativeExpression returns LiteralStringExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralStringExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralStringExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralStringExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralStringExpression
+	 *     UnaryExpression returns LiteralStringExpression
+	 *     PrimaryExpression returns LiteralStringExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralStringExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralStringExpression
+	 *     BaseExpression returns LiteralStringExpression
+	 *     LiteralExpression returns LiteralStringExpression
+	 *     LiteralTerminalExpression returns LiteralStringExpression
+	 *     LiteralStringExpression returns LiteralStringExpression
+	 *
+	 * Constraint:
+	 *     value=EString
+	 */
+	protected void sequence_LiteralStringExpression(ISerializationContext context, LiteralStringExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.LITERAL_STRING_EXPRESSION__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.LITERAL_STRING_EXPRESSION__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getLiteralStringExpressionAccess().getValueEStringParserRuleCall_1_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralSuperExpression
+	 *     ConditionalTestExpression returns LiteralSuperExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralSuperExpression
+	 *     LogicalOrExpression returns LiteralSuperExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralSuperExpression
+	 *     LogicalAndExpression returns LiteralSuperExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralSuperExpression
+	 *     BitwiseOrExpression returns LiteralSuperExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralSuperExpression
+	 *     BitwiseXorExpression returns LiteralSuperExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralSuperExpression
+	 *     BitwiseAndExpression returns LiteralSuperExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralSuperExpression
+	 *     EqualityExpression returns LiteralSuperExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralSuperExpression
+	 *     RelationalExpression returns LiteralSuperExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralSuperExpression
+	 *     AdditiveExpression returns LiteralSuperExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralSuperExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralSuperExpression
+	 *     MultiplicativeExpression returns LiteralSuperExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralSuperExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralSuperExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralSuperExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralSuperExpression
+	 *     UnaryExpression returns LiteralSuperExpression
+	 *     PrimaryExpression returns LiteralSuperExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralSuperExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralSuperExpression
+	 *     BaseExpression returns LiteralSuperExpression
+	 *     LiteralExpression returns LiteralSuperExpression
+	 *     LiteralReferenceableExpression returns LiteralSuperExpression
+	 *     LiteralReferenceExpression returns LiteralSuperExpression
+	 *     LiteralReferenceMachineContext returns LiteralSuperExpression
+	 *     LiteralSuperExpression returns LiteralSuperExpression
+	 *     LiteralPureReferenceExpression returns LiteralSuperExpression
+	 *     ValueSelectionExpression returns LiteralSuperExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns LiteralSuperExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns LiteralSuperExpression
+	 *     ValuePureNamedMachineExpression returns LiteralSuperExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_1_0 returns LiteralSuperExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_2_0 returns LiteralSuperExpression
+	 *
+	 * Constraint:
+	 *     {LiteralSuperExpression}
+	 */
+	protected void sequence_LiteralSuperExpression(ISerializationContext context, LiteralSuperExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralSystemExpression
+	 *     ConditionalTestExpression returns LiteralSystemExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralSystemExpression
+	 *     LogicalOrExpression returns LiteralSystemExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralSystemExpression
+	 *     LogicalAndExpression returns LiteralSystemExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralSystemExpression
+	 *     BitwiseOrExpression returns LiteralSystemExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralSystemExpression
+	 *     BitwiseXorExpression returns LiteralSystemExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralSystemExpression
+	 *     BitwiseAndExpression returns LiteralSystemExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralSystemExpression
+	 *     EqualityExpression returns LiteralSystemExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralSystemExpression
+	 *     RelationalExpression returns LiteralSystemExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralSystemExpression
+	 *     AdditiveExpression returns LiteralSystemExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralSystemExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralSystemExpression
+	 *     MultiplicativeExpression returns LiteralSystemExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralSystemExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralSystemExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralSystemExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralSystemExpression
+	 *     UnaryExpression returns LiteralSystemExpression
+	 *     PrimaryExpression returns LiteralSystemExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralSystemExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralSystemExpression
+	 *     BaseExpression returns LiteralSystemExpression
+	 *     LiteralExpression returns LiteralSystemExpression
+	 *     LiteralReferenceableExpression returns LiteralSystemExpression
+	 *     LiteralReferenceExpression returns LiteralSystemExpression
+	 *     LiteralReferenceMachineContext returns LiteralSystemExpression
+	 *     LiteralSystemExpression returns LiteralSystemExpression
+	 *     LiteralPureReferenceExpression returns LiteralSystemExpression
+	 *     ValueSelectionExpression returns LiteralSystemExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns LiteralSystemExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns LiteralSystemExpression
+	 *     ValuePureNamedMachineExpression returns LiteralSystemExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_1_0 returns LiteralSystemExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_2_0 returns LiteralSystemExpression
+	 *
+	 * Constraint:
+	 *     {LiteralSystemExpression}
+	 */
+	protected void sequence_LiteralSystemExpression(ISerializationContext context, LiteralSystemExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralThisExpression
+	 *     ConditionalTestExpression returns LiteralThisExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralThisExpression
+	 *     LogicalOrExpression returns LiteralThisExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralThisExpression
+	 *     LogicalAndExpression returns LiteralThisExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralThisExpression
+	 *     BitwiseOrExpression returns LiteralThisExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralThisExpression
+	 *     BitwiseXorExpression returns LiteralThisExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralThisExpression
+	 *     BitwiseAndExpression returns LiteralThisExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralThisExpression
+	 *     EqualityExpression returns LiteralThisExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralThisExpression
+	 *     RelationalExpression returns LiteralThisExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralThisExpression
+	 *     AdditiveExpression returns LiteralThisExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralThisExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralThisExpression
+	 *     MultiplicativeExpression returns LiteralThisExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralThisExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralThisExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralThisExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralThisExpression
+	 *     UnaryExpression returns LiteralThisExpression
+	 *     PrimaryExpression returns LiteralThisExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralThisExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralThisExpression
+	 *     BaseExpression returns LiteralThisExpression
+	 *     LiteralExpression returns LiteralThisExpression
+	 *     LiteralReferenceableExpression returns LiteralThisExpression
+	 *     LiteralReferenceExpression returns LiteralThisExpression
+	 *     LiteralReferenceMachineContext returns LiteralThisExpression
+	 *     LiteralThisExpression returns LiteralThisExpression
+	 *     LiteralPureReferenceExpression returns LiteralThisExpression
+	 *     ValueSelectionExpression returns LiteralThisExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns LiteralThisExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns LiteralThisExpression
+	 *     ValuePureNamedMachineExpression returns LiteralThisExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_1_0 returns LiteralThisExpression
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_2_0 returns LiteralThisExpression
+	 *
+	 * Constraint:
+	 *     {LiteralThisExpression}
+	 */
+	protected void sequence_LiteralThisExpression(ISerializationContext context, LiteralThisExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralTimeDeltaExpression
+	 *     ConditionalTestExpression returns LiteralTimeDeltaExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralTimeDeltaExpression
+	 *     LogicalOrExpression returns LiteralTimeDeltaExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralTimeDeltaExpression
+	 *     LogicalAndExpression returns LiteralTimeDeltaExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralTimeDeltaExpression
+	 *     BitwiseOrExpression returns LiteralTimeDeltaExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralTimeDeltaExpression
+	 *     BitwiseXorExpression returns LiteralTimeDeltaExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralTimeDeltaExpression
+	 *     BitwiseAndExpression returns LiteralTimeDeltaExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralTimeDeltaExpression
+	 *     EqualityExpression returns LiteralTimeDeltaExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralTimeDeltaExpression
+	 *     RelationalExpression returns LiteralTimeDeltaExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralTimeDeltaExpression
+	 *     AdditiveExpression returns LiteralTimeDeltaExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralTimeDeltaExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralTimeDeltaExpression
+	 *     MultiplicativeExpression returns LiteralTimeDeltaExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralTimeDeltaExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralTimeDeltaExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralTimeDeltaExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralTimeDeltaExpression
+	 *     UnaryExpression returns LiteralTimeDeltaExpression
+	 *     PrimaryExpression returns LiteralTimeDeltaExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralTimeDeltaExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralTimeDeltaExpression
+	 *     BaseExpression returns LiteralTimeDeltaExpression
+	 *     LiteralExpression returns LiteralTimeDeltaExpression
+	 *     LiteralReferenceableExpression returns LiteralTimeDeltaExpression
+	 *     LiteralReferenceExpression returns LiteralTimeDeltaExpression
+	 *     LiteralReferenceVariableContext returns LiteralTimeDeltaExpression
+	 *     LiteralTimeDeltaExpression returns LiteralTimeDeltaExpression
+	 *     ValueSelectionExpression returns LiteralTimeDeltaExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns LiteralTimeDeltaExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns LiteralTimeDeltaExpression
+	 *
+	 * Constraint:
+	 *     {LiteralTimeDeltaExpression}
+	 */
+	protected void sequence_LiteralTimeDeltaExpression(ISerializationContext context, LiteralTimeDeltaExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LiteralTimeExpression
+	 *     ConditionalTestExpression returns LiteralTimeExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LiteralTimeExpression
+	 *     LogicalOrExpression returns LiteralTimeExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LiteralTimeExpression
+	 *     LogicalAndExpression returns LiteralTimeExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LiteralTimeExpression
+	 *     BitwiseOrExpression returns LiteralTimeExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LiteralTimeExpression
+	 *     BitwiseXorExpression returns LiteralTimeExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LiteralTimeExpression
+	 *     BitwiseAndExpression returns LiteralTimeExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LiteralTimeExpression
+	 *     EqualityExpression returns LiteralTimeExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LiteralTimeExpression
+	 *     RelationalExpression returns LiteralTimeExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LiteralTimeExpression
+	 *     AdditiveExpression returns LiteralTimeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralTimeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralTimeExpression
+	 *     MultiplicativeExpression returns LiteralTimeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LiteralTimeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LiteralTimeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LiteralTimeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LiteralTimeExpression
+	 *     UnaryExpression returns LiteralTimeExpression
+	 *     PrimaryExpression returns LiteralTimeExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LiteralTimeExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LiteralTimeExpression
+	 *     BaseExpression returns LiteralTimeExpression
+	 *     LiteralExpression returns LiteralTimeExpression
+	 *     LiteralReferenceableExpression returns LiteralTimeExpression
+	 *     LiteralReferenceExpression returns LiteralTimeExpression
+	 *     LiteralReferenceVariableContext returns LiteralTimeExpression
+	 *     LiteralTimeExpression returns LiteralTimeExpression
+	 *     ValueSelectionExpression returns LiteralTimeExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns LiteralTimeExpression
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns LiteralTimeExpression
+	 *
+	 * Constraint:
+	 *     {LiteralTimeExpression}
+	 */
+	protected void sequence_LiteralTimeExpression(ISerializationContext context, LiteralTimeExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LogicalAssociativeExpression
+	 *     ConditionalTestExpression returns LogicalAssociativeExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LogicalAssociativeExpression
+	 *     LogicalOrExpression returns LogicalAssociativeExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LogicalAssociativeExpression
+	 *     LogicalAndExpression returns LogicalAssociativeExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LogicalAssociativeExpression
+	 *     BitwiseOrExpression returns LogicalAssociativeExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LogicalAssociativeExpression
+	 *     BitwiseXorExpression returns LogicalAssociativeExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LogicalAssociativeExpression
+	 *     BitwiseAndExpression returns LogicalAssociativeExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LogicalAssociativeExpression
+	 *     EqualityExpression returns LogicalAssociativeExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LogicalAssociativeExpression
+	 *     RelationalExpression returns LogicalAssociativeExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LogicalAssociativeExpression
+	 *     AdditiveExpression returns LogicalAssociativeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LogicalAssociativeExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LogicalAssociativeExpression
+	 *     MultiplicativeExpression returns LogicalAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LogicalAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LogicalAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LogicalAssociativeExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LogicalAssociativeExpression
+	 *     UnaryExpression returns LogicalAssociativeExpression
+	 *     PrimaryExpression returns LogicalAssociativeExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LogicalAssociativeExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LogicalAssociativeExpression
+	 *     BaseExpression returns LogicalAssociativeExpression
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             operand+=LogicalOrExpression_LogicalAssociativeExpression_1_0 
+	 *             (operator='||' | operator='or') 
+	 *             operand+=LogicalAndExpression 
+	 *             operand+=LogicalAndExpression*
+	 *         ) | 
+	 *         (
+	 *             operand+=LogicalAndExpression_LogicalAssociativeExpression_1_0 
+	 *             (operator='&&' | operator='and') 
+	 *             operand+=BitwiseOrExpression 
+	 *             operand+=BitwiseOrExpression*
+	 *         )
+	 *     )
+	 */
+	protected void sequence_LogicalAndExpression_LogicalOrExpression(ISerializationContext context, LogicalAssociativeExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns LogicalUnaryExpression
+	 *     ConditionalTestExpression returns LogicalUnaryExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns LogicalUnaryExpression
+	 *     LogicalOrExpression returns LogicalUnaryExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns LogicalUnaryExpression
+	 *     LogicalAndExpression returns LogicalUnaryExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns LogicalUnaryExpression
+	 *     BitwiseOrExpression returns LogicalUnaryExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns LogicalUnaryExpression
+	 *     BitwiseXorExpression returns LogicalUnaryExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns LogicalUnaryExpression
+	 *     BitwiseAndExpression returns LogicalUnaryExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns LogicalUnaryExpression
+	 *     EqualityExpression returns LogicalUnaryExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns LogicalUnaryExpression
+	 *     RelationalExpression returns LogicalUnaryExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns LogicalUnaryExpression
+	 *     AdditiveExpression returns LogicalUnaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns LogicalUnaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns LogicalUnaryExpression
+	 *     MultiplicativeExpression returns LogicalUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns LogicalUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns LogicalUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns LogicalUnaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns LogicalUnaryExpression
+	 *     UnaryExpression returns LogicalUnaryExpression
+	 *     LogicalUnaryExpression returns LogicalUnaryExpression
+	 *     PrimaryExpression returns LogicalUnaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns LogicalUnaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns LogicalUnaryExpression
+	 *     BaseExpression returns LogicalUnaryExpression
+	 *
+	 * Constraint:
+	 *     ((operator='!' | operator='not') operand=UnaryExpression)
+	 */
+	protected void sequence_LogicalUnaryExpression(ISerializationContext context, LogicalUnaryExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     AnyMachineBlock returns Machine
+	 *     MachineBlock returns Machine
+	 *
+	 * Constraint:
+	 *     (
+	 *         (visibility=VisibilityKind | timed?='timed' | input_enabled?='input_enabled' | design=DesignKind)* 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (
+	 *             port+=Port | 
+	 *             signal+=Signal | 
+	 *             buffer+=Buffer | 
+	 *             channel+=Channel | 
+	 *             typedef+=TypeDefinition | 
+	 *             property+=Variable
+	 *         )* 
+	 *         port+=Port? 
+	 *         (
+	 *             (
+	 *                 signal+=Signal | 
+	 *                 buffer+=Buffer | 
+	 *                 channel+=Channel | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=Variable | 
+	 *                 port+=PortPublic | 
+	 *                 signal+=SignalPublic | 
+	 *                 buffer+=BufferPublic | 
+	 *                 channel+=ChannelPublic | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariablePublic | 
+	 *                 port+=PortProtected | 
+	 *                 signal+=SignalProtected | 
+	 *                 buffer+=BufferProtected | 
+	 *                 channel+=ChannelProtected | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariableProtected | 
+	 *                 port+=PortPrivate | 
+	 *                 signal+=SignalPrivate | 
+	 *                 buffer+=BufferPrivate | 
+	 *                 channel+=ChannelPrivate | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariablePrivate
+	 *             )? 
+	 *             port+=Port?
+	 *         )* 
+	 *         ((routine+=Routine? (procedure+=Procedure? routine+=Routine?)*) | (routine+=Routine? (procedure+=Procedure? routine+=Routine?)*)) 
+	 *         machine+=AnyMachineBlock? 
+	 *         ((machine+=AnyMachineBlock | instance+=InstanceMachine | machine+=AnyMachineBlock | instance+=InstanceMachine)? machine+=AnyMachineBlock?)* 
+	 *         behavior+=Behavior? 
+	 *         (behavior+=Statemachine? behavior+=Behavior?)* 
+	 *         main=MoeBehavior
+	 *     )
+	 */
+	protected void sequence_MachineBlock(ISerializationContext context, Machine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TupleParameterExpression returns MixTupleExpression
+	 *     MixTupleExpressionList returns MixTupleExpression
+	 *
+	 * Constraint:
+	 *     ((value+=Expression | value+=NamedExpression) value+=Expression? (value+=NamedExpression? value+=Expression?)*)
+	 */
+	protected void sequence_MixTupleExpressionList(ISerializationContext context, MixTupleExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ModelOfComputation returns ModelOfComputation
+	 *
+	 * Constraint:
+	 *     {ModelOfComputation}
+	 */
+	protected void sequence_ModelOfComputation(ISerializationContext context, ModelOfComputation semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ModelOfExecution returns ModelOfExecution
+	 *
+	 * Constraint:
+	 *     (
+	 *         routine+=Routine* 
+	 *         (
+	 *             initRoutine=moeRoutine | 
+	 *             finalRoutine=moeRoutine | 
+	 *             enableRoutine=moeRoutine | 
+	 *             disableRoutine=moeRoutine | 
+	 *             concurrencyRoutine=moeRoutine | 
+	 *             scheduleRoutine=moeRoutine | 
+	 *             irunRoutine=moeRoutine | 
+	 *             runRoutine=moeRoutine
+	 *         )* 
+	 *         routine+=Routine*
+	 *     )
+	 */
+	protected void sequence_ModelOfExecution(ISerializationContext context, ModelOfExecution semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ModelOfInteraction returns ModelOfInteraction
+	 *
+	 * Constraint:
+	 *     (routes+=Route | connections+=Connection)*
+	 */
+	protected void sequence_ModelOfInteraction(ISerializationContext context, ModelOfInteraction semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Modifier returns Modifier
+	 *
+	 * Constraint:
+	 *     (static?='static' | final?='final' | reference?='reference' | volatile?='volatile' | transient?='transient')*
+	 */
+	protected void sequence_Modifier(ISerializationContext context, Modifier semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     MoeBehavior returns Behavior
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             port+=PortPrivate | 
+	 *             signal+=SignalPrivate | 
+	 *             buffer+=BufferPrivate | 
+	 *             channel+=ChannelPrivate | 
+	 *             typedef+=TypeDefinition | 
+	 *             property+=VariablePrivate
+	 *         )* 
+	 *         execution=ModelOfExecution? 
+	 *         (interaction=ModelOfInteraction? execution=ModelOfExecution?)*
+	 *     )
+	 */
+	protected void sequence_MoeBehavior(ISerializationContext context, Behavior semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     NamedExpression returns NamedExpression
+	 *
+	 * Constraint:
+	 *     (name=XLIA_ID expression=Expression)
+	 */
+	protected void sequence_NamedExpression(ISerializationContext context, NamedExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.NAMED_EXPRESSION__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.NAMED_EXPRESSION__NAME));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.NAMED_EXPRESSION__EXPRESSION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.NAMED_EXPRESSION__EXPRESSION));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getNamedExpressionAccess().getNameXLIA_IDTerminalRuleCall_0_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getNamedExpressionAccess().getExpressionExpressionParserRuleCall_2_0(), semanticObject.getExpression());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns NewfreshExpression
+	 *     ConditionalTestExpression returns NewfreshExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns NewfreshExpression
+	 *     LogicalOrExpression returns NewfreshExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns NewfreshExpression
+	 *     LogicalAndExpression returns NewfreshExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns NewfreshExpression
+	 *     BitwiseOrExpression returns NewfreshExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns NewfreshExpression
+	 *     BitwiseXorExpression returns NewfreshExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns NewfreshExpression
+	 *     BitwiseAndExpression returns NewfreshExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns NewfreshExpression
+	 *     EqualityExpression returns NewfreshExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns NewfreshExpression
+	 *     RelationalExpression returns NewfreshExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns NewfreshExpression
+	 *     AdditiveExpression returns NewfreshExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns NewfreshExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns NewfreshExpression
+	 *     MultiplicativeExpression returns NewfreshExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns NewfreshExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns NewfreshExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns NewfreshExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns NewfreshExpression
+	 *     UnaryExpression returns NewfreshExpression
+	 *     NewfreshExpression returns NewfreshExpression
+	 *     PrimaryExpression returns NewfreshExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns NewfreshExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns NewfreshExpression
+	 *     BaseExpression returns NewfreshExpression
+	 *
+	 * Constraint:
+	 *     (leftHandSide=LeftHandSideExpression | leftHandSide=LeftHandSideExpression)
+	 */
+	protected void sequence_NewfreshExpression(ISerializationContext context, NewfreshExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     OnWriteRoutine returns Routine
+	 *
+	 * Constraint:
+	 *     (parameter+=VariableRoutineParameter? bodyBlock=BlockStatement)
+	 */
+	protected void sequence_OnWriteRoutine(ISerializationContext context, Routine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinitionImpl returns DataTypeReference
+	 *     OtherDataTypeDefinitionImpl returns DataTypeReference
+	 *
+	 * Constraint:
+	 *     (
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         ((support=PrimitiveType multiplicity=DataTypeMultiplicity?) | (typeref=[DataType|ESUfid] multiplicity=DataTypeMultiplicity?)) 
+	 *         typedef?=';'
+	 *     )
+	 */
+	protected void sequence_OtherDataTypeDefinitionImpl(ISerializationContext context, DataTypeReference semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinition returns DataTypeReference
+	 *     OtherDataTypeDefinition returns DataTypeReference
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=VisibilityKind? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         ((support=PrimitiveType multiplicity=DataTypeMultiplicity?) | (typeref=[DataType|ESUfid] multiplicity=DataTypeMultiplicity?)) 
+	 *         typedef?=';'
+	 *     )
+	 */
+	protected void sequence_OtherDataTypeDefinition(ISerializationContext context, DataTypeReference semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     OtherPseudostate returns Pseudostate
+	 *
+	 * Constraint:
+	 *     (kind=PseudostateKind name=ESIdentifier unrestrictedName=UnrestrictedName? transition+=Transition*)
+	 */
+	protected void sequence_OtherPseudostate(ISerializationContext context, Pseudostate semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns OutputComStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns OutputComStatement
+	 *     TransitionEffectStatement returns OutputComStatement
+	 *     Statement returns OutputComStatement
+	 *     OutputComStatement returns OutputComStatement
+	 *
+	 * Constraint:
+	 *     (port=[NamedElement|ESUfid] (rigthValue+=Expression rigthValue+=Expression*)? (target=ExpressionAsMachine | route=[Channel|ESUfid])*)
+	 */
+	protected void sequence_OutputComStatement(ISerializationContext context, OutputComStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ParameterDeclaration returns Parameter
+	 *
+	 * Constraint:
+	 *     (direction=BlockParameterDirectionKind type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? defaultValue=Expression?)
+	 */
+	protected void sequence_ParameterDeclaration(ISerializationContext context, org.eclipse.efm.ecore.formalml.infrastructure.Parameter semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ParameterInout returns Parameter
+	 *
+	 * Constraint:
+	 *     (direction=ParameterInoutDirectionKind type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? defaultValue=Expression?)
+	 */
+	protected void sequence_ParameterInout(ISerializationContext context, org.eclipse.efm.ecore.formalml.infrastructure.Parameter semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ParameterInput returns Parameter
+	 *
+	 * Constraint:
+	 *     (direction=ParameterInputDirectionKind type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? defaultValue=Expression?)
+	 */
+	protected void sequence_ParameterInput(ISerializationContext context, org.eclipse.efm.ecore.formalml.infrastructure.Parameter semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ParameterOutput returns Parameter
+	 *
+	 * Constraint:
+	 *     (direction=ParameterOutputDirectionKind type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? defaultValue=Expression?)
+	 */
+	protected void sequence_ParameterOutput(ISerializationContext context, org.eclipse.efm.ecore.formalml.infrastructure.Parameter semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ParameterReturn returns Parameter
+	 *
+	 * Constraint:
+	 *     (direction=ParameterReturnDirectionKind type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? defaultValue=Expression?)
+	 */
+	protected void sequence_ParameterReturn(ISerializationContext context, org.eclipse.efm.ecore.formalml.infrastructure.Parameter semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     PortImpl returns Port
+	 *
+	 * Constraint:
+	 *     (direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName? (parameter+=FormalParameter parameter+=FormalParameter*)?)
+	 */
+	protected void sequence_PortImpl(ISerializationContext context, Port semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     PortPrivate returns Port
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=PrivatePortVisibilityKind 
+	 *         direction=ChannelDirection? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (parameter+=FormalParameter parameter+=FormalParameter*)?
+	 *     )
+	 */
+	protected void sequence_PortPrivate(ISerializationContext context, Port semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     PortProtected returns Port
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=ProtectedPortVisibilityKind 
+	 *         direction=ChannelDirection? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (parameter+=FormalParameter parameter+=FormalParameter*)?
+	 *     )
+	 */
+	protected void sequence_PortProtected(ISerializationContext context, Port semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     PortPublic returns Port
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=PublicPortVisibilityKind 
+	 *         direction=ChannelDirection? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (parameter+=FormalParameter parameter+=FormalParameter*)?
+	 *     )
+	 */
+	protected void sequence_PortPublic(ISerializationContext context, Port semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Port returns Port
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=VisibilityKind? 
+	 *         direction=ChannelDirection? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (parameter+=FormalParameter parameter+=FormalParameter*)?
+	 *     )
+	 */
+	protected void sequence_Port(ISerializationContext context, Port semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     PositionalTupleExpressionList returns PositionalTupleExpression
+	 *
+	 * Constraint:
+	 *     (value+=Expression value+=Expression*)
+	 */
+	protected void sequence_PositionalTupleExpressionList(ISerializationContext context, PositionalTupleExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     PotentiallyAmbiguousQualifiedName returns QualifiedName
+	 *
+	 * Constraint:
+	 *     (nameBinding+=NameBinding nameBinding+=NameBinding* (isAmbiguous?='.' nameBinding+=NameBinding nameBinding+=NameBinding*)?)
+	 */
+	protected void sequence_PotentiallyAmbiguousQualifiedName_UnqualifiedName(ISerializationContext context, QualifiedName semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns ValueElementSpecification
+	 *     ConditionalTestExpression returns ValueElementSpecification
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns ValueElementSpecification
+	 *     LogicalOrExpression returns ValueElementSpecification
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns ValueElementSpecification
+	 *     LogicalAndExpression returns ValueElementSpecification
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns ValueElementSpecification
+	 *     BitwiseOrExpression returns ValueElementSpecification
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns ValueElementSpecification
+	 *     BitwiseXorExpression returns ValueElementSpecification
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns ValueElementSpecification
+	 *     BitwiseAndExpression returns ValueElementSpecification
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns ValueElementSpecification
+	 *     EqualityExpression returns ValueElementSpecification
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns ValueElementSpecification
+	 *     RelationalExpression returns ValueElementSpecification
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns ValueElementSpecification
+	 *     AdditiveExpression returns ValueElementSpecification
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns ValueElementSpecification
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns ValueElementSpecification
+	 *     MultiplicativeExpression returns ValueElementSpecification
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns ValueElementSpecification
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns ValueElementSpecification
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns ValueElementSpecification
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns ValueElementSpecification
+	 *     UnaryExpression returns ValueElementSpecification
+	 *     PrimaryExpression returns ValueElementSpecification
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns ValueElementSpecification
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns ValueElementSpecification
+	 *     BaseExpression returns ValueElementSpecification
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             target=PrimaryExpression_ValueElementSpecification_1_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             ((kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList) | (kind=ValueParameterExpressionKind arg=MixTupleExpressionList))?
+	 *         ) | 
+	 *         (
+	 *             target=PrimaryExpression_ValueElementSpecification_2_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             ((kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList) | (kind=ValueParameterExpressionKind arg=MixTupleExpressionList))?
+	 *         ) | 
+	 *         (
+	 *             target=PrimaryExpression_ValueElementSpecification_2_4_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             ((kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList) | (kind=ValueParameterExpressionKind arg=MixTupleExpressionList))?
+	 *         )
+	 *     )
+	 */
+	protected void sequence_PrimaryExpression(ISerializationContext context, ValueElementSpecification semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     PrimaryExpression.ValueElementSpecification_2_4_0 returns ValueElementSpecification
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             target=PrimaryExpression_ValueElementSpecification_2_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             ((kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList) | (kind=ValueParameterExpressionKind arg=MixTupleExpressionList))?
+	 *         ) | 
+	 *         (
+	 *             target=PrimaryExpression_ValueElementSpecification_2_4_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             ((kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList) | (kind=ValueParameterExpressionKind arg=MixTupleExpressionList))?
+	 *         )
+	 *     )
+	 */
+	protected void sequence_PrimaryExpression_ValueElementSpecification_2_4_0(ISerializationContext context, ValueElementSpecification semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns PrimitiveBooleanType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns PrimitiveBooleanType
+	 *     DataType returns PrimitiveBooleanType
+	 *     SimpleDataType returns PrimitiveBooleanType
+	 *     PrimitiveType returns PrimitiveBooleanType
+	 *     OtherPrimitiveType returns PrimitiveBooleanType
+	 *     PrimitiveBooleanType returns PrimitiveBooleanType
+	 *
+	 * Constraint:
+	 *     {PrimitiveBooleanType}
+	 */
+	protected void sequence_PrimitiveBooleanType(ISerializationContext context, PrimitiveBooleanType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns PrimitiveCharacterType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns PrimitiveCharacterType
+	 *     DataType returns PrimitiveCharacterType
+	 *     SimpleDataType returns PrimitiveCharacterType
+	 *     PrimitiveType returns PrimitiveCharacterType
+	 *     OtherPrimitiveType returns PrimitiveCharacterType
+	 *     PrimitiveCharacterType returns PrimitiveCharacterType
+	 *
+	 * Constraint:
+	 *     {PrimitiveCharacterType}
+	 */
+	protected void sequence_PrimitiveCharacterType(ISerializationContext context, PrimitiveCharacterType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns PrimitiveFloatType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns PrimitiveFloatType
+	 *     DataType returns PrimitiveFloatType
+	 *     SimpleDataType returns PrimitiveFloatType
+	 *     PrimitiveType returns PrimitiveFloatType
+	 *     PrimitiveNumberType returns PrimitiveFloatType
+	 *     PrimitiveFloatType returns PrimitiveFloatType
+	 *     PrimitiveTimeNumberType returns PrimitiveFloatType
+	 *
+	 * Constraint:
+	 *     (sign=PrimitiveNumberSign? (size=EInt | size=EInt)?)
+	 */
+	protected void sequence_PrimitiveFloatType(ISerializationContext context, PrimitiveFloatType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns PrimitiveInstanceType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns PrimitiveInstanceType
+	 *     DataType returns PrimitiveInstanceType
+	 *     SimpleDataType returns PrimitiveInstanceType
+	 *     PrimitiveType returns PrimitiveInstanceType
+	 *     OtherPrimitiveType returns PrimitiveInstanceType
+	 *     PrimitiveInstanceType returns PrimitiveInstanceType
+	 *
+	 * Constraint:
+	 *     (expected=PrimitiveInstanceKind model=[NamedElement|ESIdentifier]?)
+	 */
+	protected void sequence_PrimitiveInstanceType(ISerializationContext context, PrimitiveInstanceType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns PrimitiveIntegerType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns PrimitiveIntegerType
+	 *     DataType returns PrimitiveIntegerType
+	 *     SimpleDataType returns PrimitiveIntegerType
+	 *     PrimitiveType returns PrimitiveIntegerType
+	 *     PrimitiveNumberType returns PrimitiveIntegerType
+	 *     PrimitiveIntegerType returns PrimitiveIntegerType
+	 *     PrimitiveTimeNumberType returns PrimitiveIntegerType
+	 *
+	 * Constraint:
+	 *     (sign=PrimitiveNumberSign? (size=EInt | size=EInt)?)
+	 */
+	protected void sequence_PrimitiveIntegerType(ISerializationContext context, PrimitiveIntegerType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns PrimitiveRationalType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns PrimitiveRationalType
+	 *     DataType returns PrimitiveRationalType
+	 *     SimpleDataType returns PrimitiveRationalType
+	 *     PrimitiveType returns PrimitiveRationalType
+	 *     PrimitiveNumberType returns PrimitiveRationalType
+	 *     PrimitiveRationalType returns PrimitiveRationalType
+	 *     PrimitiveTimeNumberType returns PrimitiveRationalType
+	 *
+	 * Constraint:
+	 *     (sign=PrimitiveNumberSign? (size=EInt | size=EInt)?)
+	 */
+	protected void sequence_PrimitiveRationalType(ISerializationContext context, PrimitiveRationalType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns PrimitiveRealType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns PrimitiveRealType
+	 *     DataType returns PrimitiveRealType
+	 *     SimpleDataType returns PrimitiveRealType
+	 *     PrimitiveType returns PrimitiveRealType
+	 *     PrimitiveNumberType returns PrimitiveRealType
+	 *     PrimitiveRealType returns PrimitiveRealType
+	 *     PrimitiveTimeNumberType returns PrimitiveRealType
+	 *
+	 * Constraint:
+	 *     (sign=PrimitiveNumberSign? (size=EInt | size=EInt)?)
+	 */
+	protected void sequence_PrimitiveRealType(ISerializationContext context, PrimitiveRealType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns PrimitiveStringType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns PrimitiveStringType
+	 *     DataType returns PrimitiveStringType
+	 *     SimpleDataType returns PrimitiveStringType
+	 *     PrimitiveType returns PrimitiveStringType
+	 *     OtherPrimitiveType returns PrimitiveStringType
+	 *     PrimitiveStringType returns PrimitiveStringType
+	 *
+	 * Constraint:
+	 *     (size=EInt | size=EInt)?
+	 */
+	protected void sequence_PrimitiveStringType(ISerializationContext context, PrimitiveStringType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataTypeReference returns PrimitiveTimeType
+	 *     DataTypeReference.DataTypeReference_0_1_0 returns PrimitiveTimeType
+	 *     DataType returns PrimitiveTimeType
+	 *     SimpleDataType returns PrimitiveTimeType
+	 *     PrimitiveType returns PrimitiveTimeType
+	 *     PrimitiveNumberType returns PrimitiveTimeType
+	 *     PrimitiveTimeType returns PrimitiveTimeType
+	 *
+	 * Constraint:
+	 *     (
+	 *         support=PrimitiveTimeNumberType | 
+	 *         support=PrimitiveTimeNumberType | 
+	 *         (clock?='clock' (support=PrimitiveTimeNumberType | support=PrimitiveTimeNumberType)?)
+	 *     )?
+	 */
+	protected void sequence_PrimitiveTimeType(ISerializationContext context, PrimitiveTimeType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ProcedureExecution returns ModelOfExecution
+	 *
+	 * Constraint:
+	 *     (scheduleRoutine=moeRoutine | runRoutine=moeRoutine)*
+	 */
+	protected void sequence_ProcedureExecution(ISerializationContext context, ModelOfExecution semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Procedure returns Procedure
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=VisibilityKind? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (parameter+=FunctionalParameter parameter+=FunctionalParameter*)? 
+	 *         (parameter+=FormalParameter | (parameter+=FormalParameter parameter+=FormalParameter*))? 
+	 *         (
+	 *             (
+	 *                 parameter+=ParameterInput | 
+	 *                 parameter+=ParameterInput | 
+	 *                 parameter+=ParameterInout | 
+	 *                 parameter+=ParameterInout | 
+	 *                 parameter+=ParameterOutput | 
+	 *                 parameter+=ParameterOutput | 
+	 *                 parameter+=ParameterReturn | 
+	 *                 parameter+=ParameterReturn
+	 *             )+ | 
+	 *             (
+	 *                 port+=Port | 
+	 *                 signal+=Signal | 
+	 *                 buffer+=Buffer | 
+	 *                 channel+=Channel | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=Variable
+	 *             )+
+	 *         )? 
+	 *         parameter+=ParameterInput? 
+	 *         (
+	 *             (
+	 *                 parameter+=ParameterInput | 
+	 *                 parameter+=ParameterInout | 
+	 *                 parameter+=ParameterInout | 
+	 *                 parameter+=ParameterOutput | 
+	 *                 parameter+=ParameterOutput | 
+	 *                 parameter+=ParameterReturn | 
+	 *                 parameter+=ParameterReturn
+	 *             )? 
+	 *             parameter+=ParameterInput?
+	 *         )* 
+	 *         port+=Port? 
+	 *         (
+	 *             (
+	 *                 signal+=Signal | 
+	 *                 buffer+=Buffer | 
+	 *                 channel+=Channel | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=Variable | 
+	 *                 port+=PortPublic | 
+	 *                 signal+=SignalPublic | 
+	 *                 buffer+=BufferPublic | 
+	 *                 channel+=ChannelPublic | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariablePublic | 
+	 *                 port+=PortProtected | 
+	 *                 signal+=SignalProtected | 
+	 *                 buffer+=BufferProtected | 
+	 *                 channel+=ChannelProtected | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariableProtected | 
+	 *                 port+=PortPrivate | 
+	 *                 signal+=SignalPrivate | 
+	 *                 buffer+=BufferPrivate | 
+	 *                 channel+=ChannelPrivate | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariablePrivate
+	 *             )? 
+	 *             port+=Port?
+	 *         )* 
+	 *         ((routine+=Routine? (procedure+=Procedure? routine+=Routine?)*) | (routine+=Routine? (procedure+=Procedure? routine+=Routine?)*)) 
+	 *         (region+=StatemachineRegion+ | region+=StatemachineRegionLite)? 
+	 *         execution=ProcedureExecution?
+	 *     )
+	 */
+	protected void sequence_Procedure(ISerializationContext context, Procedure semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     PseudostateInitial returns Pseudostate
+	 *
+	 * Constraint:
+	 *     (
+	 *         ((kind=PseudostateInitialKind (name=ESIdentifier | name='#initial' | name='#init')) | name='#initial' | name='#init') 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         transition+=Transition*
+	 *     )
+	 */
+	protected void sequence_PseudostateInitial(ISerializationContext context, Pseudostate semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     QualifiedName returns QualifiedName
+	 *
+	 * Constraint:
+	 *     (nameBinding+=NameBinding nameBinding+=NameBinding* nameBinding+=NameBinding*)
+	 */
+	protected void sequence_QualifiedName_UnqualifiedName(ISerializationContext context, QualifiedName semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns RelationalBinaryExpression
+	 *     ConditionalTestExpression returns RelationalBinaryExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns RelationalBinaryExpression
+	 *     LogicalOrExpression returns RelationalBinaryExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns RelationalBinaryExpression
+	 *     LogicalAndExpression returns RelationalBinaryExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns RelationalBinaryExpression
+	 *     BitwiseOrExpression returns RelationalBinaryExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns RelationalBinaryExpression
+	 *     BitwiseXorExpression returns RelationalBinaryExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns RelationalBinaryExpression
+	 *     BitwiseAndExpression returns RelationalBinaryExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns RelationalBinaryExpression
+	 *     EqualityExpression returns RelationalBinaryExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns RelationalBinaryExpression
+	 *     RelationalExpression returns RelationalBinaryExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns RelationalBinaryExpression
+	 *     RelationalExpression.RelationalTernaryExpression_1_3_0 returns RelationalBinaryExpression
+	 *     AdditiveExpression returns RelationalBinaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns RelationalBinaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns RelationalBinaryExpression
+	 *     MultiplicativeExpression returns RelationalBinaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns RelationalBinaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns RelationalBinaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns RelationalBinaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns RelationalBinaryExpression
+	 *     UnaryExpression returns RelationalBinaryExpression
+	 *     PrimaryExpression returns RelationalBinaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns RelationalBinaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns RelationalBinaryExpression
+	 *     BaseExpression returns RelationalBinaryExpression
+	 *
+	 * Constraint:
+	 *     (leftOperand=RelationalExpression_RelationalBinaryExpression_1_0 operator=RelationalOperator rigthOperand=AdditiveExpression)
+	 */
+	protected void sequence_RelationalExpression(ISerializationContext context, RelationalBinaryExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__LEFT_OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__LEFT_OPERAND));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__OPERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__OPERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__RIGTH_OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.BINARY_EXPRESSION__RIGTH_OPERAND));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getRelationalExpressionAccess().getRelationalBinaryExpressionLeftOperandAction_1_0(), semanticObject.getLeftOperand());
+		feeder.accept(grammarAccess.getRelationalExpressionAccess().getOperatorRelationalOperatorParserRuleCall_1_1_0(), semanticObject.getOperator());
+		feeder.accept(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_2_0(), semanticObject.getRigthOperand());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Expression returns RelationalTernaryExpression
+	 *     ConditionalTestExpression returns RelationalTernaryExpression
+	 *     ConditionalTestExpression.ConditionalTestExpression_1_0 returns RelationalTernaryExpression
+	 *     LogicalOrExpression returns RelationalTernaryExpression
+	 *     LogicalOrExpression.LogicalAssociativeExpression_1_0 returns RelationalTernaryExpression
+	 *     LogicalAndExpression returns RelationalTernaryExpression
+	 *     LogicalAndExpression.LogicalAssociativeExpression_1_0 returns RelationalTernaryExpression
+	 *     BitwiseOrExpression returns RelationalTernaryExpression
+	 *     BitwiseOrExpression.BitwiseAssociativeExpression_1_0 returns RelationalTernaryExpression
+	 *     BitwiseXorExpression returns RelationalTernaryExpression
+	 *     BitwiseXorExpression.BitwiseAssociativeExpression_1_0 returns RelationalTernaryExpression
+	 *     BitwiseAndExpression returns RelationalTernaryExpression
+	 *     BitwiseAndExpression.BitwiseAssociativeExpression_1_0 returns RelationalTernaryExpression
+	 *     EqualityExpression returns RelationalTernaryExpression
+	 *     EqualityExpression.EqualityBinaryExpression_1_0 returns RelationalTernaryExpression
+	 *     RelationalExpression returns RelationalTernaryExpression
+	 *     RelationalExpression.RelationalBinaryExpression_1_0 returns RelationalTernaryExpression
+	 *     AdditiveExpression returns RelationalTernaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_0_0 returns RelationalTernaryExpression
+	 *     AdditiveExpression.ArithmeticAssociativeExpression_1_1_0 returns RelationalTernaryExpression
+	 *     MultiplicativeExpression returns RelationalTernaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_0_0 returns RelationalTernaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_1_0 returns RelationalTernaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_2_0 returns RelationalTernaryExpression
+	 *     MultiplicativeExpression.ArithmeticAssociativeExpression_1_3_0 returns RelationalTernaryExpression
+	 *     UnaryExpression returns RelationalTernaryExpression
+	 *     PrimaryExpression returns RelationalTernaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_1_0 returns RelationalTernaryExpression
+	 *     PrimaryExpression.ValueElementSpecification_2_0 returns RelationalTernaryExpression
+	 *     BaseExpression returns RelationalTernaryExpression
+	 *
+	 * Constraint:
+	 *     (leftRelation=RelationalExpression_RelationalTernaryExpression_1_3_0 rigthOperator=RelationalOperator rigthOperand=AdditiveExpression)
+	 */
+	protected void sequence_RelationalExpression(ISerializationContext context, RelationalTernaryExpression semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.RELATIONAL_TERNARY_EXPRESSION__LEFT_RELATION));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERATOR));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.RELATIONAL_TERNARY_EXPRESSION__RIGTH_OPERAND));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getRelationalExpressionAccess().getRelationalTernaryExpressionLeftRelationAction_1_3_0(), semanticObject.getLeftRelation());
+		feeder.accept(grammarAccess.getRelationalExpressionAccess().getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0(), semanticObject.getRigthOperator());
+		feeder.accept(grammarAccess.getRelationalExpressionAccess().getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0(), semanticObject.getRigthOperand());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Route returns Route
+	 *
+	 * Constraint:
+	 *     (protocol=ComRouteProtocol (name=ESIdentifier unrestrictedName=UnrestrictedName?)? (signals+=[Signal|ESUfid] signals+=[Signal|ESUfid]*)?)
+	 */
+	protected void sequence_Route(ISerializationContext context, Route semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Routine returns Routine
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=VisibilityKind? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         domain=FunctionalParameterSet? 
+	 *         (codomain=FunctionalParameterSet | codomain=FormalParameterSet)? 
+	 *         bodyBlock=BlockStatement
+	 *     )
+	 */
+	protected void sequence_Routine(ISerializationContext context, Routine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     SignalImpl returns Signal
+	 *
+	 * Constraint:
+	 *     (direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName? (parameter+=FormalParameter parameter+=FormalParameter*)?)
+	 */
+	protected void sequence_SignalImpl(ISerializationContext context, Signal semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     SignalPrivate returns Signal
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=PrivateSignalVisibilityKind 
+	 *         direction=ChannelDirection? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (parameter+=FormalParameter parameter+=FormalParameter*)?
+	 *     )
+	 */
+	protected void sequence_SignalPrivate(ISerializationContext context, Signal semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     SignalProtected returns Signal
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=ProtectedSignalVisibilityKind 
+	 *         direction=ChannelDirection? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (parameter+=FormalParameter parameter+=FormalParameter*)?
+	 *     )
+	 */
+	protected void sequence_SignalProtected(ISerializationContext context, Signal semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     SignalPublic returns Signal
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=PublicSignalVisibilityKind 
+	 *         direction=ChannelDirection? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (parameter+=FormalParameter parameter+=FormalParameter*)?
+	 *     )
+	 */
+	protected void sequence_SignalPublic(ISerializationContext context, Signal semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     SignalReference returns Signal
+	 *
+	 * Constraint:
+	 *     (direction=ChannelDirection? name=ESIdentifier)
+	 */
+	protected void sequence_SignalReference(ISerializationContext context, Signal semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Signal returns Signal
+	 *
+	 * Constraint:
+	 *     (
+	 *         visibility=VisibilityKind? 
+	 *         direction=ChannelDirection? 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (parameter+=FormalParameter parameter+=FormalParameter*)?
+	 *     )
+	 */
+	protected void sequence_Signal(ISerializationContext context, Signal semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     SimpleState returns State
+	 *
+	 * Constraint:
+	 *     (simple?='state' name=ESIdentifier unrestrictedName=UnrestrictedName? (transition+=Transition | moe+=moeSimpleStateRoutines)*)
+	 */
+	protected void sequence_SimpleState(ISerializationContext context, State semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     SlotParameter returns SlotProperty
+	 *
+	 * Constraint:
+	 *     (xliaProperty=[PropertyDefinition|ESIdentifier] value=Expression)
+	 */
+	protected void sequence_SlotParameter(ISerializationContext context, SlotProperty semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, InfrastructurePackage.Literals.SLOT_PROPERTY__XLIA_PROPERTY) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, InfrastructurePackage.Literals.SLOT_PROPERTY__XLIA_PROPERTY));
+			if (transientValues.isValueTransient(semanticObject, InfrastructurePackage.Literals.SLOT_PROPERTY__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, InfrastructurePackage.Literals.SLOT_PROPERTY__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getSlotParameterAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1(), semanticObject.getXliaProperty());
+		feeder.accept(grammarAccess.getSlotParameterAccess().getValueExpressionParserRuleCall_2_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     SlotProperty returns SlotProperty
+	 *
+	 * Constraint:
+	 *     (xliaProperty=[PropertyDefinition|ESIdentifier] value=Expression)
+	 */
+	protected void sequence_SlotProperty(ISerializationContext context, SlotProperty semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, InfrastructurePackage.Literals.SLOT_PROPERTY__XLIA_PROPERTY) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, InfrastructurePackage.Literals.SLOT_PROPERTY__XLIA_PROPERTY));
+			if (transientValues.isValueTransient(semanticObject, InfrastructurePackage.Literals.SLOT_PROPERTY__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, InfrastructurePackage.Literals.SLOT_PROPERTY__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getSlotPropertyAccess().getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1(), semanticObject.getXliaProperty());
+		feeder.accept(grammarAccess.getSlotPropertyAccess().getValueExpressionParserRuleCall_2_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     State returns StartState
+	 *     StartState returns StartState
+	 *
+	 * Constraint:
+	 *     (
+	 *         ((simple?='state' name=ESIdentifier) | simple?='#start') 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (transition+=Transition | moe+=moeStartStateRoutines)*
+	 *     )
+	 */
+	protected void sequence_StartState(ISerializationContext context, StartState semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     StatemachineRegionLite returns Region
+	 *
+	 * Constraint:
+	 *     (vertex+=State | vertex+=Pseudostate)+
+	 */
+	protected void sequence_StatemachineRegionLite(ISerializationContext context, Region semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     StatemachineRegion returns Region
+	 *
+	 * Constraint:
+	 *     ((name=ESIdentifier unrestrictedName=UnrestrictedName?)? (vertex+=State | vertex+=Pseudostate)+)
+	 */
+	protected void sequence_StatemachineRegion(ISerializationContext context, Region semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     AnyMachineBlock returns Statemachine
+	 *     Behavior returns Statemachine
+	 *     Statemachine returns Statemachine
+	 *
+	 * Constraint:
+	 *     (
+	 *         (visibility=VisibilityKind | timed?='timed' | input_enabled?='input_enabled' | design=DesignKind)* 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (
+	 *             (
+	 *                 parameter+=ParameterInput? 
+	 *                 (
+	 *                     (
+	 *                         parameter+=ParameterInput | 
+	 *                         parameter+=ParameterInout | 
+	 *                         parameter+=ParameterInout | 
+	 *                         parameter+=ParameterOutput | 
+	 *                         parameter+=ParameterOutput | 
+	 *                         parameter+=ParameterReturn | 
+	 *                         parameter+=ParameterReturn
+	 *                     )? 
+	 *                     parameter+=ParameterInput?
+	 *                 )*
+	 *             ) | 
+	 *             (port+=Port? ((signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)? port+=Port?)*)
+	 *         ) 
+	 *         (
+	 *             parameter+=ParameterInput | 
+	 *             parameter+=ParameterInput | 
+	 *             parameter+=ParameterInout | 
+	 *             parameter+=ParameterInout | 
+	 *             parameter+=ParameterOutput | 
+	 *             parameter+=ParameterOutput | 
+	 *             parameter+=ParameterReturn | 
+	 *             parameter+=ParameterReturn
+	 *         )* 
+	 *         port+=Port? 
+	 *         (
+	 *             (
+	 *                 signal+=Signal | 
+	 *                 buffer+=Buffer | 
+	 *                 channel+=Channel | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=Variable | 
+	 *                 port+=PortPublic | 
+	 *                 signal+=SignalPublic | 
+	 *                 buffer+=BufferPublic | 
+	 *                 channel+=ChannelPublic | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariablePublic | 
+	 *                 port+=PortProtected | 
+	 *                 signal+=SignalProtected | 
+	 *                 buffer+=BufferProtected | 
+	 *                 channel+=ChannelProtected | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariableProtected | 
+	 *                 port+=PortPrivate | 
+	 *                 signal+=SignalPrivate | 
+	 *                 buffer+=BufferPrivate | 
+	 *                 channel+=ChannelPrivate | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariablePrivate
+	 *             )? 
+	 *             port+=Port?
+	 *         )* 
+	 *         ((routine+=Routine? (procedure+=Procedure? routine+=Routine?)*) | (routine+=Routine? (procedure+=Procedure? routine+=Routine?)*)) 
+	 *         (region+=StatemachineRegion+ | region+=StatemachineRegionLite) 
+	 *         (execution=ModelOfExecution | interaction=ModelOfInteraction)*
+	 *     )
+	 */
+	protected void sequence_Statemachine(ISerializationContext context, Statemachine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinitionImpl returns StructureType
+	 *     StructureTypeDefinitionImpl returns StructureType
+	 *
+	 * Constraint:
+	 *     (name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='struct' property+=Variable+)
+	 */
+	protected void sequence_StructureTypeDefinitionImpl(ISerializationContext context, StructureType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinition returns StructureType
+	 *     StructureTypeDefinition returns StructureType
+	 *
+	 * Constraint:
+	 *     (visibility=VisibilityKind? name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='struct' property+=Variable+)
+	 */
+	protected void sequence_StructureTypeDefinition(ISerializationContext context, StructureType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataType returns StructureType
+	 *     StructuredDataType returns StructureType
+	 *     StructureType returns StructureType
+	 *
+	 * Constraint:
+	 *     property+=Variable+
+	 */
+	protected void sequence_StructureType(ISerializationContext context, StructureType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     System returns System
+	 *
+	 * Constraint:
+	 *     (
+	 *         (visibility=VisibilityKind | timed?='timed' | input_enabled?='input_enabled')* 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         (
+	 *             port+=Port | 
+	 *             signal+=Signal | 
+	 *             buffer+=Buffer | 
+	 *             channel+=Channel | 
+	 *             typedef+=TypeDefinition | 
+	 *             property+=Variable
+	 *         )* 
+	 *         port+=Port? 
+	 *         (
+	 *             (
+	 *                 signal+=Signal | 
+	 *                 buffer+=Buffer | 
+	 *                 channel+=Channel | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=Variable | 
+	 *                 port+=PortPublic | 
+	 *                 signal+=SignalPublic | 
+	 *                 buffer+=BufferPublic | 
+	 *                 channel+=ChannelPublic | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariablePublic | 
+	 *                 port+=PortProtected | 
+	 *                 signal+=SignalProtected | 
+	 *                 buffer+=BufferProtected | 
+	 *                 channel+=ChannelProtected | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariableProtected | 
+	 *                 port+=PortPrivate | 
+	 *                 signal+=SignalPrivate | 
+	 *                 buffer+=BufferPrivate | 
+	 *                 channel+=ChannelPrivate | 
+	 *                 typedef+=TypeDefinition | 
+	 *                 property+=VariablePrivate
+	 *             )? 
+	 *             port+=Port?
+	 *         )* 
+	 *         ((routine+=Routine? (procedure+=Procedure? routine+=Routine?)*) | (routine+=Routine? (procedure+=Procedure? routine+=Routine?)*)) 
+	 *         machine+=AnyMachineBlock? 
+	 *         ((instance+=InstanceMachine | machine+=AnyMachineBlock | machine+=AnyMachineBlock | instance+=InstanceMachine)? machine+=AnyMachineBlock?)* 
+	 *         behavior+=Behavior? 
+	 *         (behavior+=Statemachine? behavior+=Behavior?)* 
+	 *         main=MoeBehavior
+	 *     )
+	 */
+	protected void sequence_System(ISerializationContext context, org.eclipse.efm.ecore.formalml.infrastructure.System semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Statement returns TimedGuardStatement
+	 *     TimedGuardStatement returns TimedGuardStatement
+	 *
+	 * Constraint:
+	 *     condition=Expression
+	 */
+	protected void sequence_TimedGuardStatement(ISerializationContext context, TimedGuardStatement semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.ABSTRACT_GUARD_STATEMENT__CONDITION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.ABSTRACT_GUARD_STATEMENT__CONDITION));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getTimedGuardStatementAccess().getConditionExpressionParserRuleCall_1_0(), semanticObject.getCondition());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionTimedGuard returns TimedGuardStatement
+	 *
+	 * Constraint:
+	 *     (condition=TransitionGuardExpression | condition=Expression | condition=Expression | condition=Expression)
+	 */
+	protected void sequence_TimedGuardStatement_TransitionTimedGuard(ISerializationContext context, TimedGuardStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionBehavior returns BlockStatement
+	 *
+	 * Constraint:
+	 *     (op=BlockStatementScheduler? statement+=Statement*)
+	 */
+	protected void sequence_TransitionBehavior(ISerializationContext context, BlockStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns BlockStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns BlockStatement
+	 *
+	 * Constraint:
+	 *     (statement+=TransitionEffect_BlockStatement_1_0 statement+=TransitionEffectStatement)
+	 */
+	protected void sequence_TransitionEffect(ISerializationContext context, BlockStatement semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionGuardExpression returns LogicalAssociativeExpression
+	 *
+	 * Constraint:
+	 *     ((operator='&&' | operator='and' | operator='||' | operator='or') operand+=BitwiseOrExpression+)
+	 */
+	protected void sequence_TransitionGuardExpression(ISerializationContext context, LogicalAssociativeExpression semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionMoe returns TransitionMoe
+	 *
+	 * Constraint:
+	 *     ((((moc=TransitionMoc isElse?='else'?) | isElse?='else') prior=EInt?) | prior=EInt)
+	 */
+	protected void sequence_TransitionMoe(ISerializationContext context, TransitionMoe semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Transition returns Transition
+	 *
+	 * Constraint:
+	 *     (
+	 *         transient?='transient'? 
+	 *         moe=TransitionMoe? 
+	 *         (name=ESIdentifier unrestrictedName=UnrestrictedName?)? 
+	 *         (
+	 *             (
+	 *                 ((trigger+=TransitionTrigger* guard=TransitionGuard? tguard=TransitionTimedGuard? effect=TransitionEffect?) | behavior=TransitionBehavior)? 
+	 *                 target=[NamedElement|ESUfid]?
+	 *             ) | 
+	 *             (
+	 *                 target=[NamedElement|ESUfid] 
+	 *                 ((trigger+=TransitionTrigger* guard=TransitionGuard? tguard=TransitionTimedGuard? effect=TransitionEffect?) | behavior=TransitionBehavior)?
+	 *             )
+	 *         )
+	 *     )
+	 */
+	protected void sequence_Transition(ISerializationContext context, Transition semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinitionImpl returns UnionType
+	 *     UnionTypeDefinitionImpl returns UnionType
+	 *
+	 * Constraint:
+	 *     (name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='union' property+=Variable+)
+	 */
+	protected void sequence_UnionTypeDefinitionImpl(ISerializationContext context, UnionType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TypeDefinition returns UnionType
+	 *     UnionTypeDefinition returns UnionType
+	 *
+	 * Constraint:
+	 *     (visibility=VisibilityKind? name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='union' property+=Variable+)
+	 */
+	protected void sequence_UnionTypeDefinition(ISerializationContext context, UnionType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataType returns UnionType
+	 *     StructuredDataType returns UnionType
+	 *     UnionType returns UnionType
+	 *
+	 * Constraint:
+	 *     property+=Variable+
+	 */
+	protected void sequence_UnionType(ISerializationContext context, UnionType semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     UnqualifiedName returns QualifiedName
+	 *
+	 * Constraint:
+	 *     nameBinding+=NameBinding
+	 */
+	protected void sequence_UnqualifiedName(ISerializationContext context, QualifiedName semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValuePureNamedMachineExpression returns ValueElementSpecification
+	 *
+	 * Constraint:
+	 *     (
+	 *         (target=ValuePureNamedMachineExpression_ValueElementSpecification_1_0 kind=ValueDotFieldExpressionKind element=[NamedElement|ESIdentifier]) | 
+	 *         (target=ValuePureNamedMachineExpression_ValueElementSpecification_2_0 kind=ValueArrowFieldExpressionKind element=[NamedElement|ESIdentifier]) | 
+	 *         (target=ValuePureNamedMachineExpression_ValueElementSpecification_2_3_0 kind=ValueDotFieldExpressionKind element=[NamedElement|ESIdentifier])
+	 *     )
+	 */
+	protected void sequence_ValuePureNamedMachineExpression(ISerializationContext context, ValueElementSpecification semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_1_0 returns ValueElementSpecification
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_2_0 returns ValueElementSpecification
+	 *
+	 * Constraint:
+	 *     (target=ValuePureNamedMachineExpression_ValueElementSpecification_1_0 kind=ValueDotFieldExpressionKind element=[NamedElement|ESIdentifier])
+	 */
+	protected void sequence_ValuePureNamedMachineExpression_ValueElementSpecification_1_0_ValueElementSpecification_2_0(ISerializationContext context, ValueElementSpecification semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.VALUE_ELEMENT_SPECIFICATION__TARGET) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.VALUE_ELEMENT_SPECIFICATION__TARGET));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.VALUE_ELEMENT_SPECIFICATION__KIND) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.VALUE_ELEMENT_SPECIFICATION__KIND));
+			if (transientValues.isValueTransient(semanticObject, ExpressionPackage.Literals.VALUE_ELEMENT_SPECIFICATION__ELEMENT) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, ExpressionPackage.Literals.VALUE_ELEMENT_SPECIFICATION__ELEMENT));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getValuePureNamedMachineExpressionAccess().getValueElementSpecificationTargetAction_1_0(), semanticObject.getTarget());
+		feeder.accept(grammarAccess.getValuePureNamedMachineExpressionAccess().getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0(), semanticObject.getKind());
+		feeder.accept(grammarAccess.getValuePureNamedMachineExpressionAccess().getElementNamedElementESIdentifierParserRuleCall_1_2_0_1(), semanticObject.getElement());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValuePureNamedMachineExpression.ValueElementSpecification_2_3_0 returns ValueElementSpecification
+	 *
+	 * Constraint:
+	 *     (
+	 *         (target=ValuePureNamedMachineExpression_ValueElementSpecification_2_0 kind=ValueArrowFieldExpressionKind element=[NamedElement|ESIdentifier]) | 
+	 *         (target=ValuePureNamedMachineExpression_ValueElementSpecification_2_3_0 kind=ValueDotFieldExpressionKind element=[NamedElement|ESIdentifier])
+	 *     )
+	 */
+	protected void sequence_ValuePureNamedMachineExpression_ValueElementSpecification_2_3_0(ISerializationContext context, ValueElementSpecification semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSelectionExpression returns ValueElementSpecification
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             target=ValueSelectionExpression_ValueElementSpecification_1_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList)?
+	 *         ) | 
+	 *         (
+	 *             target=ValueSelectionExpression_ValueElementSpecification_2_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList)?
+	 *         ) | 
+	 *         (
+	 *             target=ValueSelectionExpression_ValueElementSpecification_2_4_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList)?
+	 *         )
+	 *     )
+	 */
+	protected void sequence_ValueSelectionExpression(ISerializationContext context, ValueElementSpecification semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSelectionExpression.ValueElementSpecification_1_0 returns ValueElementSpecification
+	 *     ValueSelectionExpression.ValueElementSpecification_2_0 returns ValueElementSpecification
+	 *
+	 * Constraint:
+	 *     (
+	 *         target=ValueSelectionExpression_ValueElementSpecification_1_0 
+	 *         element=[NamedElement|ESIdentifier] 
+	 *         (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList)?
+	 *     )
+	 */
+	protected void sequence_ValueSelectionExpression_ValueElementSpecification_1_0_ValueElementSpecification_2_0(ISerializationContext context, ValueElementSpecification semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     ValueSelectionExpression.ValueElementSpecification_2_4_0 returns ValueElementSpecification
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             target=ValueSelectionExpression_ValueElementSpecification_2_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList)?
+	 *         ) | 
+	 *         (
+	 *             target=ValueSelectionExpression_ValueElementSpecification_2_4_0 
+	 *             element=[NamedElement|ESIdentifier] 
+	 *             (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList)?
+	 *         )
+	 *     )
+	 */
+	protected void sequence_ValueSelectionExpression_ValueElementSpecification_2_4_0(ISerializationContext context, ValueElementSpecification semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     VariableImpl returns Variable
+	 *
+	 * Constraint:
+	 *     (
+	 *         (const?='const' | const?='final' | macro?='macro')* 
+	 *         type=DataType 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         defaultValue=Expression? 
+	 *         onWriteAction=OnWriteRoutine?
+	 *     )
+	 */
+	protected void sequence_VariableImpl(ISerializationContext context, Variable semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     VariablePrivate returns Variable
+	 *
+	 * Constraint:
+	 *     (
+	 *         modifier=Modifier? 
+	 *         (const?='const' | const?='final' | macro?='macro')* 
+	 *         visibility=PrivateVariableVisibilityKind 
+	 *         type=DataType 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         defaultValue=Expression? 
+	 *         onWriteAction=OnWriteRoutine?
+	 *     )
+	 */
+	protected void sequence_VariablePrivate(ISerializationContext context, Variable semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     VariableProtected returns Variable
+	 *
+	 * Constraint:
+	 *     (
+	 *         modifier=Modifier? 
+	 *         (const?='const' | const?='final' | macro?='macro')* 
+	 *         visibility=ProtectedVariableVisibilityKind 
+	 *         type=DataType 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         defaultValue=Expression? 
+	 *         onWriteAction=OnWriteRoutine?
+	 *     )
+	 */
+	protected void sequence_VariableProtected(ISerializationContext context, Variable semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     VariablePublic returns Variable
+	 *
+	 * Constraint:
+	 *     (
+	 *         modifier=Modifier? 
+	 *         (const?='const' | const?='final' | macro?='macro')* 
+	 *         visibility=PublicVariableVisibilityKind 
+	 *         type=DataType 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         defaultValue=Expression? 
+	 *         onWriteAction=OnWriteRoutine?
+	 *     )
+	 */
+	protected void sequence_VariablePublic(ISerializationContext context, Variable semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     VariableRoutineParameter returns Parameter
+	 *
+	 * Constraint:
+	 *     (type=DataType? name=ESIdentifier defaultValue=Expression?)
+	 */
+	protected void sequence_VariableRoutineParameter(ISerializationContext context, org.eclipse.efm.ecore.formalml.infrastructure.Parameter semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Variable returns Variable
+	 *
+	 * Constraint:
+	 *     (
+	 *         (visibility=VisibilityKind | modifier=Modifier)* 
+	 *         (const?='val' | ((const?='const' | const?='final') macro?='macro'?) | (macro?='macro' const?='val'?))? 
+	 *         type=DataType 
+	 *         name=ESIdentifier 
+	 *         unrestrictedName=UnrestrictedName? 
+	 *         defaultValue=Expression? 
+	 *         onWriteAction=OnWriteRoutine?
+	 *     )
+	 */
+	protected void sequence_Variable(ISerializationContext context, Variable semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     TransitionEffect returns WhileDoStatement
+	 *     TransitionEffect.BlockStatement_1_0 returns WhileDoStatement
+	 *     TransitionEffectStatement returns WhileDoStatement
+	 *     Statement returns WhileDoStatement
+	 *     WhileDoStatement returns WhileDoStatement
+	 *
+	 * Constraint:
+	 *     (condition=Expression bodyBlock=BlockStatement)
+	 */
+	protected void sequence_WhileDoStatement(ISerializationContext context, WhileDoStatement semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__CONDITION) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__CONDITION));
+			if (transientValues.isValueTransient(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, StatementPackage.Literals.CONDITIONAL_BLOCK_STATEMENT__BODY_BLOCK));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getWhileDoStatementAccess().getConditionExpressionParserRuleCall_1_0(), semanticObject.getCondition());
+		feeder.accept(grammarAccess.getWhileDoStatementAccess().getBodyBlockBlockStatementParserRuleCall_2_0(), semanticObject.getBodyBlock());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     XliaNamedElement returns XliaAttribute
+	 *     XliaAttribute returns XliaAttribute
+	 *
+	 * Constraint:
+	 *     (name=XLIA_ID value=Expression)
+	 */
+	protected void sequence_XliaAttribute(ISerializationContext context, XliaAttribute semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, FormalmlPackage.Literals.XLIA_NAMED_ELEMENT__NAME) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, FormalmlPackage.Literals.XLIA_NAMED_ELEMENT__NAME));
+			if (transientValues.isValueTransient(semanticObject, FormalmlPackage.Literals.XLIA_ATTRIBUTE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, FormalmlPackage.Literals.XLIA_ATTRIBUTE__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getXliaAttributeAccess().getNameXLIA_IDTerminalRuleCall_0_0(), semanticObject.getName());
+		feeder.accept(grammarAccess.getXliaAttributeAccess().getValueExpressionParserRuleCall_2_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     XliaNamedElement returns XliaObject
+	 *     XliaObject returns XliaObject
+	 *
+	 * Constraint:
+	 *     (name=XLIA_ID elements+=XliaNamedElement*)
+	 */
+	protected void sequence_XliaObject(ISerializationContext context, XliaObject semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     XliaOptionObject returns XliaObject
+	 *
+	 * Constraint:
+	 *     (name='@option' elements+=XliaNamedElement*)
+	 */
+	protected void sequence_XliaOptionObject(ISerializationContext context, XliaObject semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     XliaPrologAttribute returns XliaAttribute
+	 *
+	 * Constraint:
+	 *     ((name='system' | name='package') (value=LiteralFloatExpression | value=LiteralStringExpression)?)
+	 */
+	protected void sequence_XliaPrologAttribute(ISerializationContext context, XliaAttribute semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     XliaPrologObject returns XliaObject
+	 *
+	 * Constraint:
+	 *     ((name='@FormalML' | name='@xlia' | name='@xfsp') elements+=XliaPrologAttribute elements+=XliaOptionObject?)
+	 */
+	protected void sequence_XliaPrologObject(ISerializationContext context, XliaObject semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     Xlia returns XliaModel
+	 *
+	 * Constraint:
+	 *     (prolog=XliaPrologObject system=System)
+	 */
+	protected void sequence_Xlia(ISerializationContext context, XliaModel semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, FormalmlPackage.Literals.XLIA_MODEL__PROLOG) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, FormalmlPackage.Literals.XLIA_MODEL__PROLOG));
+			if (transientValues.isValueTransient(semanticObject, FormalmlPackage.Literals.XLIA_MODEL__SYSTEM) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, FormalmlPackage.Literals.XLIA_MODEL__SYSTEM));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getXliaAccess().getPrologXliaPrologObjectParserRuleCall_0_0(), semanticObject.getProlog());
+		feeder.accept(grammarAccess.getXliaAccess().getSystemSystemParserRuleCall_1_0(), semanticObject.getSystem());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     moeCompositeStateRoutines returns Routine
+	 *
+	 * Constraint:
+	 *     (
+	 *         (
+	 *             name='@init' | 
+	 *             name='@final' | 
+	 *             name='@enable' | 
+	 *             name='@disable' | 
+	 *             name='@concurrency' | 
+	 *             name='@schedule' | 
+	 *             name='@irun' | 
+	 *             name='@run'
+	 *         ) 
+	 *         bodyBlock=BlockStatement
+	 *     )
+	 */
+	protected void sequence_moeCompositeStateRoutines(ISerializationContext context, Routine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     moeFinalStateRoutines returns Routine
+	 *
+	 * Constraint:
+	 *     ((name='@enable' | name='@final') bodyBlock=BlockStatement)
+	 */
+	protected void sequence_moeFinalStateRoutines(ISerializationContext context, Routine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     moeRoutine returns Routine
+	 *
+	 * Constraint:
+	 *     (domain=FunctionalParameterSet? (codomain=FunctionalParameterSet | codomain=FunctionalParameterSet)? bodyBlock=BlockStatement)
+	 */
+	protected void sequence_moeRoutine(ISerializationContext context, Routine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     moeSimpleStateRoutines returns Routine
+	 *
+	 * Constraint:
+	 *     ((name='@enable' | name='@disable' | name='@irun') bodyBlock=BlockStatement)
+	 */
+	protected void sequence_moeSimpleStateRoutines(ISerializationContext context, Routine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     moeStartStateRoutines returns Routine
+	 *
+	 * Constraint:
+	 *     ((name='@init' | name='@enable' | name='@disable' | name='@irun') bodyBlock=BlockStatement)
+	 */
+	protected void sequence_moeStartStateRoutines(ISerializationContext context, Routine semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/serializer/FormalMLSyntacticSequencer.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/serializer/FormalMLSyntacticSequencer.java
new file mode 100644
index 0000000..70dc4a6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/serializer/FormalMLSyntacticSequencer.java
@@ -0,0 +1,13276 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.serializer;
+
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.AbstractElementAlias;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.AlternativeAlias;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.GroupAlias;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.TokenAlias;
+import org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider.ISynNavigable;
+import org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider.ISynTransition;
+import org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer;
+
+@SuppressWarnings("all")
+public class FormalMLSyntacticSequencer extends AbstractSyntacticSequencer {
+
+	protected FormalMLGrammarAccess grammarAccess;
+	protected AbstractElementAlias match_BaseExpression_LeftParenthesisKeyword_1_0_a;
+	protected AbstractElementAlias match_BaseExpression_LeftParenthesisKeyword_1_0_p;
+	protected AbstractElementAlias match_BlockParameterSet___RightCurlyBracketKeyword_1_0_1_1_2_InputKeyword_1_0_0_LeftCurlyBracketKeyword_1_0_1_1_0__q;
+	protected AbstractElementAlias match_BlockParameterSet___RightCurlyBracketKeyword_1_1_1_1_2_InoutKeyword_1_1_0_LeftCurlyBracketKeyword_1_1_1_1_0__q;
+	protected AbstractElementAlias match_BlockParameterSet___RightCurlyBracketKeyword_1_2_1_1_2_OutputKeyword_1_2_0_LeftCurlyBracketKeyword_1_2_1_1_0__q;
+	protected AbstractElementAlias match_BlockParameterSet___RightCurlyBracketKeyword_1_3_1_1_2_ReturnKeyword_1_3_0_LeftCurlyBracketKeyword_1_3_1_1_0__q;
+	protected AbstractElementAlias match_BufferContainerType___LessThanSignKeyword_2_0_GreaterThanSignKeyword_2_2__q;
+	protected AbstractElementAlias match_CompositeState_MocKeyword_3_q;
+	protected AbstractElementAlias match_CompositeState_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__p_RightCurlyBracketKeyword_8_0_2__;
+	protected AbstractElementAlias match_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__a;
+	protected AbstractElementAlias match_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__p;
+	protected AbstractElementAlias match_CompositeState___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__a;
+	protected AbstractElementAlias match_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__a;
+	protected AbstractElementAlias match_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__p;
+	protected AbstractElementAlias match_DynamicInstanceSpecification_____LeftCurlyBracketKeyword_3_1_0_RightCurlyBracketKeyword_3_1_2___or___LeftParenthesisKeyword_3_0_0_RightParenthesisKeyword_3_0_2____q;
+	protected AbstractElementAlias match_ElseIfStatement_ElseifKeyword_0_0_or___ElseKeyword_0_1_0_IfKeyword_0_1_1__;
+	protected AbstractElementAlias match_EndingPseudostate_MocKeyword_3_q;
+	protected AbstractElementAlias match_EndingPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0;
+	protected AbstractElementAlias match_EndingPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__;
+	protected AbstractElementAlias match_FinalState_MocKeyword_1_0_2_q;
+	protected AbstractElementAlias match_FinalState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__;
+	protected AbstractElementAlias match_InputComStatement_LessThanSignEqualsSignEqualsSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1;
+	protected AbstractElementAlias match_InstanceMachine_ModelKeyword_3_q;
+	protected AbstractElementAlias match_InstanceMachine___LeftCurlyBracketKeyword_8_1_0_RightCurlyBracketKeyword_8_1_2___or_____LeftParenthesisKeyword_8_0_0_0_RightParenthesisKeyword_8_0_0_2__q_SemicolonKeyword_8_0_1__;
+	protected AbstractElementAlias match_InstanceMachine___MachineKeyword_1_0_or_StatemachineKeyword_1_1__q;
+	protected AbstractElementAlias match_LiteralEnvExpression_EnvKeyword_1_0_or_EnvKeyword_1_1;
+	protected AbstractElementAlias match_LiteralNullExpression_NullKeyword_0_1_0_or_NullKeyword_0_1_1;
+	protected AbstractElementAlias match_LiteralNullExpression_NullKeyword_1_1_0_or_NullKeyword_1_1_1;
+	protected AbstractElementAlias match_LogicalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1;
+	protected AbstractElementAlias match_LogicalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0;
+	protected AbstractElementAlias match_MachineBlock_BehaviorKeyword_10_0_0_q;
+	protected AbstractElementAlias match_MachineBlock_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1;
+	protected AbstractElementAlias match_MachineBlock_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0;
+	protected AbstractElementAlias match_MachineBlock_ModelKeyword_9_1_0_q;
+	protected AbstractElementAlias match_MachineBlock_ProcedureKeyword_8_0_1_0_q;
+	protected AbstractElementAlias match_MachineBlock_PrototypeKeyword_9_2_0_q;
+	protected AbstractElementAlias match_MachineBlock_StatemachineKeyword_10_1_0_q;
+	protected AbstractElementAlias match_MachineBlock___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a;
+	protected AbstractElementAlias match_MachineBlock___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q;
+	protected AbstractElementAlias match_MachineBlock___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q;
+	protected AbstractElementAlias match_MachineBlock___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q;
+	protected AbstractElementAlias match_MachineBlock___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a;
+	protected AbstractElementAlias match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a;
+	protected AbstractElementAlias match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p;
+	protected AbstractElementAlias match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a;
+	protected AbstractElementAlias match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q;
+	protected AbstractElementAlias match_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a;
+	protected AbstractElementAlias match_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p;
+	protected AbstractElementAlias match_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a;
+	protected AbstractElementAlias match_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a;
+	protected AbstractElementAlias match_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p;
+	protected AbstractElementAlias match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a;
+	protected AbstractElementAlias match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p;
+	protected AbstractElementAlias match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a;
+	protected AbstractElementAlias match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p;
+	protected AbstractElementAlias match_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a;
+	protected AbstractElementAlias match_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p;
+	protected AbstractElementAlias match_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a;
+	protected AbstractElementAlias match_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p;
+	protected AbstractElementAlias match_MoeBehavior_LocalKeyword_1_0_q;
+	protected AbstractElementAlias match_NamedExpression_ColonKeyword_1_0_or_EqualsSignGreaterThanSignKeyword_1_1_or_LessThanSignHyphenMinusKeyword_1_2;
+	protected AbstractElementAlias match_OtherPseudostate_MocKeyword_3_q;
+	protected AbstractElementAlias match_OtherPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0;
+	protected AbstractElementAlias match_OtherPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__;
+	protected AbstractElementAlias match_OutputComStatement_EqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1;
+	protected AbstractElementAlias match_PrimitiveBooleanType_BoolKeyword_1_1_or_BooleanKeyword_1_0;
+	protected AbstractElementAlias match_PrimitiveFloatType_DoubleKeyword_2_2_or_FloatKeyword_2_0_or_UdoubleKeyword_2_3_or_UfloatKeyword_2_1;
+	protected AbstractElementAlias match_PrimitiveFloatType_SizeKeyword_3_1_1_q;
+	protected AbstractElementAlias match_PrimitiveIntegerType_IntKeyword_2_2_or_IntegerKeyword_2_0_or_UintKeyword_2_3_or_UintegerKeyword_2_1;
+	protected AbstractElementAlias match_PrimitiveIntegerType_SizeKeyword_3_1_1_q;
+	protected AbstractElementAlias match_PrimitiveRationalType_RatKeyword_2_2_or_RationalKeyword_2_0_or_UratKeyword_2_3_or_UrationalKeyword_2_1;
+	protected AbstractElementAlias match_PrimitiveRationalType_SizeKeyword_3_1_1_q;
+	protected AbstractElementAlias match_PrimitiveRealType_RealKeyword_2_0_or_UrealKeyword_2_1;
+	protected AbstractElementAlias match_PrimitiveRealType_SizeKeyword_3_1_1_q;
+	protected AbstractElementAlias match_PrimitiveStringType_SizeKeyword_2_1_1_q;
+	protected AbstractElementAlias match_ProcedureExecution_MoeKeyword_1_q;
+	protected AbstractElementAlias match_Procedure_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0;
+	protected AbstractElementAlias match_Procedure_ParameterKeyword_7_0_0_q;
+	protected AbstractElementAlias match_Procedure_ProcedureKeyword_10_0_1_0_q;
+	protected AbstractElementAlias match_Procedure_PropertyKeyword_9_0_0_q;
+	protected AbstractElementAlias match_Procedure_PublicKeyword_9_1_0_q;
+	protected AbstractElementAlias match_Procedure___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a;
+	protected AbstractElementAlias match_Procedure___LeftParenthesisKeyword_5_0_0_RightParenthesisKeyword_5_0_2__q;
+	protected AbstractElementAlias match_Procedure___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q;
+	protected AbstractElementAlias match_Procedure___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q;
+	protected AbstractElementAlias match_Procedure___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a;
+	protected AbstractElementAlias match_Procedure___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q;
+	protected AbstractElementAlias match_Procedure___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q;
+	protected AbstractElementAlias match_Procedure___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q;
+	protected AbstractElementAlias match_Procedure___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q;
+	protected AbstractElementAlias match_Procedure___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q;
+	protected AbstractElementAlias match_Procedure___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q;
+	protected AbstractElementAlias match_Procedure___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q;
+	protected AbstractElementAlias match_Procedure___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q;
+	protected AbstractElementAlias match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a;
+	protected AbstractElementAlias match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p;
+	protected AbstractElementAlias match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a;
+	protected AbstractElementAlias match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p;
+	protected AbstractElementAlias match_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a;
+	protected AbstractElementAlias match_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p;
+	protected AbstractElementAlias match_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a;
+	protected AbstractElementAlias match_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p;
+	protected AbstractElementAlias match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a;
+	protected AbstractElementAlias match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p;
+	protected AbstractElementAlias match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a;
+	protected AbstractElementAlias match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a;
+	protected AbstractElementAlias match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p;
+	protected AbstractElementAlias match_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a;
+	protected AbstractElementAlias match_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p;
+	protected AbstractElementAlias match_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a;
+	protected AbstractElementAlias match_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a;
+	protected AbstractElementAlias match_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p;
+	protected AbstractElementAlias match_PseudostateInitial_MocKeyword_1_0_2_q;
+	protected AbstractElementAlias match_PseudostateInitial_PseudostateKeyword_1_0_0_1_or_StateKeyword_1_0_0_0;
+	protected AbstractElementAlias match_PseudostateInitial_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__;
+	protected AbstractElementAlias match_Routine_MacroKeyword_1_q;
+	protected AbstractElementAlias match_Routine___LeftParenthesisKeyword_5_0_RightParenthesisKeyword_5_2__q;
+	protected AbstractElementAlias match_SimpleState_SemicolonKeyword_5_1_or___LeftCurlyBracketKeyword_5_0_0_RightCurlyBracketKeyword_5_0_2__;
+	protected AbstractElementAlias match_SimpleState___LessThanSignKeyword_2_0_MocKeyword_2_1_q_SimpleKeyword_2_2_GreaterThanSignKeyword_2_3__q;
+	protected AbstractElementAlias match_StartState_MocKeyword_1_0_2_q;
+	protected AbstractElementAlias match_StartState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__;
+	protected AbstractElementAlias match_StatemachineRegion_RegionKeyword_1_0_0_or_StatemachineKeyword_1_0_1;
+	protected AbstractElementAlias match_StatemachineRegion_RegionKeyword_1_1_0_0_or_StatemachineKeyword_1_1_0_1;
+	protected AbstractElementAlias match_Statemachine_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0;
+	protected AbstractElementAlias match_Statemachine_ParameterKeyword_7_0_0_q;
+	protected AbstractElementAlias match_Statemachine_ProcedureKeyword_10_0_1_0_q;
+	protected AbstractElementAlias match_Statemachine_PropertyKeyword_9_0_0_q;
+	protected AbstractElementAlias match_Statemachine_PublicKeyword_9_1_0_q;
+	protected AbstractElementAlias match_Statemachine___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a;
+	protected AbstractElementAlias match_Statemachine___LessThanSignKeyword_3_0_MocKeyword_3_1_q___AndKeyword_3_2_1_or_OrKeyword_3_2_0___GreaterThanSignKeyword_3_3__q;
+	protected AbstractElementAlias match_Statemachine___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q;
+	protected AbstractElementAlias match_Statemachine___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a;
+	protected AbstractElementAlias match_Statemachine___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q;
+	protected AbstractElementAlias match_Statemachine___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q;
+	protected AbstractElementAlias match_Statemachine___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q;
+	protected AbstractElementAlias match_Statemachine___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q;
+	protected AbstractElementAlias match_Statemachine___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q;
+	protected AbstractElementAlias match_Statemachine___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q;
+	protected AbstractElementAlias match_Statemachine___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q;
+	protected AbstractElementAlias match_Statemachine___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q;
+	protected AbstractElementAlias match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a;
+	protected AbstractElementAlias match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p;
+	protected AbstractElementAlias match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a;
+	protected AbstractElementAlias match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p;
+	protected AbstractElementAlias match_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a;
+	protected AbstractElementAlias match_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p;
+	protected AbstractElementAlias match_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a;
+	protected AbstractElementAlias match_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p;
+	protected AbstractElementAlias match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a;
+	protected AbstractElementAlias match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p;
+	protected AbstractElementAlias match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a;
+	protected AbstractElementAlias match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a;
+	protected AbstractElementAlias match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p;
+	protected AbstractElementAlias match_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a;
+	protected AbstractElementAlias match_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p;
+	protected AbstractElementAlias match_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a;
+	protected AbstractElementAlias match_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a;
+	protected AbstractElementAlias match_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p;
+	protected AbstractElementAlias match_System_BehaviorKeyword_10_0_0_q;
+	protected AbstractElementAlias match_System_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1;
+	protected AbstractElementAlias match_System_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0;
+	protected AbstractElementAlias match_System_ModelKeyword_9_1_0_q;
+	protected AbstractElementAlias match_System_ProcedureKeyword_8_0_1_0_q;
+	protected AbstractElementAlias match_System_PrototypeKeyword_9_2_0_q;
+	protected AbstractElementAlias match_System_StatemachineKeyword_10_1_0_q;
+	protected AbstractElementAlias match_System___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a;
+	protected AbstractElementAlias match_System___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q;
+	protected AbstractElementAlias match_System___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q;
+	protected AbstractElementAlias match_System___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q;
+	protected AbstractElementAlias match_System___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a;
+	protected AbstractElementAlias match_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a;
+	protected AbstractElementAlias match_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p;
+	protected AbstractElementAlias match_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a;
+	protected AbstractElementAlias match_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a;
+	protected AbstractElementAlias match_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p;
+	protected AbstractElementAlias match_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a;
+	protected AbstractElementAlias match_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a;
+	protected AbstractElementAlias match_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p;
+	protected AbstractElementAlias match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a;
+	protected AbstractElementAlias match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p;
+	protected AbstractElementAlias match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a;
+	protected AbstractElementAlias match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p;
+	protected AbstractElementAlias match_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a;
+	protected AbstractElementAlias match_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p;
+	protected AbstractElementAlias match_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a;
+	protected AbstractElementAlias match_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p;
+	protected AbstractElementAlias match_TransitionMoe_MocKeyword_1_0_0_q;
+	protected AbstractElementAlias match_TransitionMoe_PriorKeyword_1_0_2_1_q;
+	protected AbstractElementAlias match_TransitionMoe_PriorKeyword_1_1_0_q;
+	protected AbstractElementAlias match_Transition_GuardKeyword_5_0_1_0_1_1_q;
+	protected AbstractElementAlias match_Transition_GuardKeyword_5_1_2_0_1_0_1_1_q;
+	protected AbstractElementAlias match_Transition_SemicolonKeyword_5_1_2_1_or___LeftCurlyBracketKeyword_5_1_2_0_0___TriggerKeyword_5_1_2_0_1_0_0_0_q_GuardKeyword_5_1_2_0_1_0_1_1_q_TguardKeyword_5_1_2_0_1_0_2_1_q_EffectKeyword_5_1_2_0_1_0_3__q_RightCurlyBracketKeyword_5_1_2_0_2__;
+	protected AbstractElementAlias match_Transition_TguardKeyword_5_0_1_0_2_1_q;
+	protected AbstractElementAlias match_Transition_TguardKeyword_5_1_2_0_1_0_2_1_q;
+	protected AbstractElementAlias match_Transition_TriggerKeyword_5_0_1_0_0_0_q;
+	protected AbstractElementAlias match_Transition_TriggerKeyword_5_1_2_0_1_0_0_0_q;
+	protected AbstractElementAlias match_Transition___TriggerKeyword_5_0_1_0_0_0_q_GuardKeyword_5_0_1_0_1_1_q_TguardKeyword_5_0_1_0_2_1_q_EffectKeyword_5_0_1_0_3__q;
+	protected AbstractElementAlias match_Variable_VarKeyword_1_2_2_q;
+	protected AbstractElementAlias match_Variable_VarKeyword_1_3_1_0_q;
+	protected AbstractElementAlias match_moeRoutine___LeftParenthesisKeyword_1_0_RightParenthesisKeyword_1_2__q;
+	
+	@Inject
+	protected void init(IGrammarAccess access) {
+		grammarAccess = (FormalMLGrammarAccess) access;
+		match_BaseExpression_LeftParenthesisKeyword_1_0_a = new TokenAlias(true, true, grammarAccess.getBaseExpressionAccess().getLeftParenthesisKeyword_1_0());
+		match_BaseExpression_LeftParenthesisKeyword_1_0_p = new TokenAlias(true, false, grammarAccess.getBaseExpressionAccess().getLeftParenthesisKeyword_1_0());
+		match_BlockParameterSet___RightCurlyBracketKeyword_1_0_1_1_2_InputKeyword_1_0_0_LeftCurlyBracketKeyword_1_0_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getRightCurlyBracketKeyword_1_0_1_1_2()), new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getInputKeyword_1_0_0()), new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getLeftCurlyBracketKeyword_1_0_1_1_0()));
+		match_BlockParameterSet___RightCurlyBracketKeyword_1_1_1_1_2_InoutKeyword_1_1_0_LeftCurlyBracketKeyword_1_1_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getRightCurlyBracketKeyword_1_1_1_1_2()), new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getInoutKeyword_1_1_0()), new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getLeftCurlyBracketKeyword_1_1_1_1_0()));
+		match_BlockParameterSet___RightCurlyBracketKeyword_1_2_1_1_2_OutputKeyword_1_2_0_LeftCurlyBracketKeyword_1_2_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getRightCurlyBracketKeyword_1_2_1_1_2()), new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getOutputKeyword_1_2_0()), new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getLeftCurlyBracketKeyword_1_2_1_1_0()));
+		match_BlockParameterSet___RightCurlyBracketKeyword_1_3_1_1_2_ReturnKeyword_1_3_0_LeftCurlyBracketKeyword_1_3_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getRightCurlyBracketKeyword_1_3_1_1_2()), new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getReturnKeyword_1_3_0()), new TokenAlias(false, false, grammarAccess.getBlockParameterSetAccess().getLeftCurlyBracketKeyword_1_3_1_1_0()));
+		match_BufferContainerType___LessThanSignKeyword_2_0_GreaterThanSignKeyword_2_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getBufferContainerTypeAccess().getLessThanSignKeyword_2_0()), new TokenAlias(false, false, grammarAccess.getBufferContainerTypeAccess().getGreaterThanSignKeyword_2_2()));
+		match_CompositeState_MocKeyword_3_q = new TokenAlias(false, true, grammarAccess.getCompositeStateAccess().getMocKeyword_3());
+		match_CompositeState_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__p_RightCurlyBracketKeyword_8_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getLeftCurlyBracketKeyword_8_0_0()), new AlternativeAlias(true, false, new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()), new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0())), new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getRightCurlyBracketKeyword_8_0_2())), new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getSemicolonKeyword_8_1()));
+		match_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__a = new GroupAlias(true, true, new TokenAlias(true, true, grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()), new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0()));
+		match_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__p = new GroupAlias(true, false, new TokenAlias(true, true, grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()), new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0()));
+		match_CompositeState___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()), new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0()));
+		match_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__a = new GroupAlias(true, true, new TokenAlias(true, true, grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0()), new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()));
+		match_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__p = new GroupAlias(true, false, new TokenAlias(true, true, grammarAccess.getCompositeStateAccess().getTransitionKeyword_8_0_1_0_2_0()), new TokenAlias(false, false, grammarAccess.getCompositeStateAccess().getMoeKeyword_8_0_1_0_1_0()));
+		match_DynamicInstanceSpecification_____LeftCurlyBracketKeyword_3_1_0_RightCurlyBracketKeyword_3_1_2___or___LeftParenthesisKeyword_3_0_0_RightParenthesisKeyword_3_0_2____q = new AlternativeAlias(false, true, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getDynamicInstanceSpecificationAccess().getLeftCurlyBracketKeyword_3_1_0()), new TokenAlias(false, false, grammarAccess.getDynamicInstanceSpecificationAccess().getRightCurlyBracketKeyword_3_1_2())), new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getDynamicInstanceSpecificationAccess().getLeftParenthesisKeyword_3_0_0()), new TokenAlias(false, false, grammarAccess.getDynamicInstanceSpecificationAccess().getRightParenthesisKeyword_3_0_2())));
+		match_ElseIfStatement_ElseifKeyword_0_0_or___ElseKeyword_0_1_0_IfKeyword_0_1_1__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getElseIfStatementAccess().getElseKeyword_0_1_0()), new TokenAlias(false, false, grammarAccess.getElseIfStatementAccess().getIfKeyword_0_1_1())), new TokenAlias(false, false, grammarAccess.getElseIfStatementAccess().getElseifKeyword_0_0()));
+		match_EndingPseudostate_MocKeyword_3_q = new TokenAlias(false, true, grammarAccess.getEndingPseudostateAccess().getMocKeyword_3());
+		match_EndingPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getEndingPseudostateAccess().getPseudostateKeyword_1_1()), new TokenAlias(false, false, grammarAccess.getEndingPseudostateAccess().getStateKeyword_1_0()));
+		match_EndingPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getEndingPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getEndingPseudostateAccess().getRightCurlyBracketKeyword_8_0_2())), new TokenAlias(false, false, grammarAccess.getEndingPseudostateAccess().getSemicolonKeyword_8_1()));
+		match_FinalState_MocKeyword_1_0_2_q = new TokenAlias(false, true, grammarAccess.getFinalStateAccess().getMocKeyword_1_0_2());
+		match_FinalState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getFinalStateAccess().getLeftCurlyBracketKeyword_3_0_0()), new TokenAlias(false, false, grammarAccess.getFinalStateAccess().getRightCurlyBracketKeyword_3_0_2())), new TokenAlias(false, false, grammarAccess.getFinalStateAccess().getSemicolonKeyword_3_1()));
+		match_InputComStatement_LessThanSignEqualsSignEqualsSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getInputComStatementAccess().getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0()), new TokenAlias(false, false, grammarAccess.getInputComStatementAccess().getViaKeyword_3_1_0_1()));
+		match_InstanceMachine_ModelKeyword_3_q = new TokenAlias(false, true, grammarAccess.getInstanceMachineAccess().getModelKeyword_3());
+		match_InstanceMachine___LeftCurlyBracketKeyword_8_1_0_RightCurlyBracketKeyword_8_1_2___or_____LeftParenthesisKeyword_8_0_0_0_RightParenthesisKeyword_8_0_0_2__q_SemicolonKeyword_8_0_1__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getInstanceMachineAccess().getLeftParenthesisKeyword_8_0_0_0()), new TokenAlias(false, false, grammarAccess.getInstanceMachineAccess().getRightParenthesisKeyword_8_0_0_2())), new TokenAlias(false, false, grammarAccess.getInstanceMachineAccess().getSemicolonKeyword_8_0_1())), new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getInstanceMachineAccess().getLeftCurlyBracketKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getInstanceMachineAccess().getRightCurlyBracketKeyword_8_1_2())));
+		match_InstanceMachine___MachineKeyword_1_0_or_StatemachineKeyword_1_1__q = new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getInstanceMachineAccess().getMachineKeyword_1_0()), new TokenAlias(false, false, grammarAccess.getInstanceMachineAccess().getStatemachineKeyword_1_1()));
+		match_LiteralEnvExpression_EnvKeyword_1_0_or_EnvKeyword_1_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_0()), new TokenAlias(false, false, grammarAccess.getLiteralEnvExpressionAccess().getEnvKeyword_1_1()));
+		match_LiteralNullExpression_NullKeyword_0_1_0_or_NullKeyword_0_1_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_0()), new TokenAlias(false, false, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_0_1_1()));
+		match_LiteralNullExpression_NullKeyword_1_1_0_or_NullKeyword_1_1_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_0()), new TokenAlias(false, false, grammarAccess.getLiteralNullExpressionAccess().getNullKeyword_1_1_1()));
+		match_LogicalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getLogicalAndExpressionAccess().getAmpersandAmpersandKeyword_1_3_0_0()), new TokenAlias(false, false, grammarAccess.getLogicalAndExpressionAccess().getAndKeyword_1_3_0_1()));
+		match_LogicalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getLogicalOrExpressionAccess().getOrKeyword_1_3_0_1()), new TokenAlias(false, false, grammarAccess.getLogicalOrExpressionAccess().getVerticalLineVerticalLineKeyword_1_3_0_0()));
+		match_MachineBlock_BehaviorKeyword_10_0_0_q = new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getBehaviorKeyword_10_0_0());
+		match_MachineBlock_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1()));
+		match_MachineBlock_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getMacroKeyword_8_0_0_0_1()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getRoutineKeyword_8_0_0_0_0()));
+		match_MachineBlock_ModelKeyword_9_1_0_q = new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0());
+		match_MachineBlock_ProcedureKeyword_8_0_1_0_q = new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getProcedureKeyword_8_0_1_0());
+		match_MachineBlock_PrototypeKeyword_9_2_0_q = new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0());
+		match_MachineBlock_StatemachineKeyword_10_1_0_q = new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getStatemachineKeyword_10_1_0());
+		match_MachineBlock___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0()));
+		match_MachineBlock___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getLessThanSignKeyword_2_0()), new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getMocKeyword_2_1()), new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getAndKeyword_2_2_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getOrKeyword_2_2_1())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getGreaterThanSignKeyword_2_3()));
+		match_MachineBlock___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q = new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getMacroKeyword_8_0_0_0_1()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getRoutineKeyword_8_0_0_0_0()));
+		match_MachineBlock___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q = new GroupAlias(false, true, new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()), new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0())), new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1())));
+		match_MachineBlock___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0()));
+		match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0()));
+		match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0()));
+		match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a = new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0())), new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0()));
+		match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q = new GroupAlias(false, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0())), new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getCompositeKeyword_9_0_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getMachineKeyword_9_0_0_1())));
+		match_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()));
+		match_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()));
+		match_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a = new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, true, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()));
+		match_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()));
+		match_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getModelKeyword_9_1_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getInstanceKeyword_9_3_0()));
+		match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0()));
+		match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0()));
+		match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()));
+		match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()));
+		match_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()));
+		match_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()));
+		match_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()));
+		match_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getMachineBlockAccess().getPrivateKeyword_7_3_0()));
+		match_MoeBehavior_LocalKeyword_1_0_q = new TokenAlias(false, true, grammarAccess.getMoeBehaviorAccess().getLocalKeyword_1_0());
+		match_NamedExpression_ColonKeyword_1_0_or_EqualsSignGreaterThanSignKeyword_1_1_or_LessThanSignHyphenMinusKeyword_1_2 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getNamedExpressionAccess().getColonKeyword_1_0()), new TokenAlias(false, false, grammarAccess.getNamedExpressionAccess().getEqualsSignGreaterThanSignKeyword_1_1()), new TokenAlias(false, false, grammarAccess.getNamedExpressionAccess().getLessThanSignHyphenMinusKeyword_1_2()));
+		match_OtherPseudostate_MocKeyword_3_q = new TokenAlias(false, true, grammarAccess.getOtherPseudostateAccess().getMocKeyword_3());
+		match_OtherPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getOtherPseudostateAccess().getPseudostateKeyword_1_1()), new TokenAlias(false, false, grammarAccess.getOtherPseudostateAccess().getStateKeyword_1_0()));
+		match_OtherPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getOtherPseudostateAccess().getLeftCurlyBracketKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getOtherPseudostateAccess().getRightCurlyBracketKeyword_8_0_2())), new TokenAlias(false, false, grammarAccess.getOtherPseudostateAccess().getSemicolonKeyword_8_1()));
+		match_OutputComStatement_EqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getOutputComStatementAccess().getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0()), new TokenAlias(false, false, grammarAccess.getOutputComStatementAccess().getViaKeyword_3_1_0_1()));
+		match_PrimitiveBooleanType_BoolKeyword_1_1_or_BooleanKeyword_1_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getPrimitiveBooleanTypeAccess().getBoolKeyword_1_1()), new TokenAlias(false, false, grammarAccess.getPrimitiveBooleanTypeAccess().getBooleanKeyword_1_0()));
+		match_PrimitiveFloatType_DoubleKeyword_2_2_or_FloatKeyword_2_0_or_UdoubleKeyword_2_3_or_UfloatKeyword_2_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getPrimitiveFloatTypeAccess().getDoubleKeyword_2_2()), new TokenAlias(false, false, grammarAccess.getPrimitiveFloatTypeAccess().getFloatKeyword_2_0()), new TokenAlias(false, false, grammarAccess.getPrimitiveFloatTypeAccess().getUdoubleKeyword_2_3()), new TokenAlias(false, false, grammarAccess.getPrimitiveFloatTypeAccess().getUfloatKeyword_2_1()));
+		match_PrimitiveFloatType_SizeKeyword_3_1_1_q = new TokenAlias(false, true, grammarAccess.getPrimitiveFloatTypeAccess().getSizeKeyword_3_1_1());
+		match_PrimitiveIntegerType_IntKeyword_2_2_or_IntegerKeyword_2_0_or_UintKeyword_2_3_or_UintegerKeyword_2_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getPrimitiveIntegerTypeAccess().getIntKeyword_2_2()), new TokenAlias(false, false, grammarAccess.getPrimitiveIntegerTypeAccess().getIntegerKeyword_2_0()), new TokenAlias(false, false, grammarAccess.getPrimitiveIntegerTypeAccess().getUintKeyword_2_3()), new TokenAlias(false, false, grammarAccess.getPrimitiveIntegerTypeAccess().getUintegerKeyword_2_1()));
+		match_PrimitiveIntegerType_SizeKeyword_3_1_1_q = new TokenAlias(false, true, grammarAccess.getPrimitiveIntegerTypeAccess().getSizeKeyword_3_1_1());
+		match_PrimitiveRationalType_RatKeyword_2_2_or_RationalKeyword_2_0_or_UratKeyword_2_3_or_UrationalKeyword_2_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getPrimitiveRationalTypeAccess().getRatKeyword_2_2()), new TokenAlias(false, false, grammarAccess.getPrimitiveRationalTypeAccess().getRationalKeyword_2_0()), new TokenAlias(false, false, grammarAccess.getPrimitiveRationalTypeAccess().getUratKeyword_2_3()), new TokenAlias(false, false, grammarAccess.getPrimitiveRationalTypeAccess().getUrationalKeyword_2_1()));
+		match_PrimitiveRationalType_SizeKeyword_3_1_1_q = new TokenAlias(false, true, grammarAccess.getPrimitiveRationalTypeAccess().getSizeKeyword_3_1_1());
+		match_PrimitiveRealType_RealKeyword_2_0_or_UrealKeyword_2_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getPrimitiveRealTypeAccess().getRealKeyword_2_0()), new TokenAlias(false, false, grammarAccess.getPrimitiveRealTypeAccess().getUrealKeyword_2_1()));
+		match_PrimitiveRealType_SizeKeyword_3_1_1_q = new TokenAlias(false, true, grammarAccess.getPrimitiveRealTypeAccess().getSizeKeyword_3_1_1());
+		match_PrimitiveStringType_SizeKeyword_2_1_1_q = new TokenAlias(false, true, grammarAccess.getPrimitiveStringTypeAccess().getSizeKeyword_2_1_1());
+		match_ProcedureExecution_MoeKeyword_1_q = new TokenAlias(false, true, grammarAccess.getProcedureExecutionAccess().getMoeKeyword_1());
+		match_Procedure_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getMacroKeyword_10_0_0_0_1()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRoutineKeyword_10_0_0_0_0()));
+		match_Procedure_ParameterKeyword_7_0_0_q = new TokenAlias(false, true, grammarAccess.getProcedureAccess().getParameterKeyword_7_0_0());
+		match_Procedure_ProcedureKeyword_10_0_1_0_q = new TokenAlias(false, true, grammarAccess.getProcedureAccess().getProcedureKeyword_10_0_1_0());
+		match_Procedure_PropertyKeyword_9_0_0_q = new TokenAlias(false, true, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0());
+		match_Procedure_PublicKeyword_9_1_0_q = new TokenAlias(false, true, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0());
+		match_Procedure___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0()));
+		match_Procedure___LeftParenthesisKeyword_5_0_0_RightParenthesisKeyword_5_0_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLeftParenthesisKeyword_5_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRightParenthesisKeyword_5_0_2()));
+		match_Procedure___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLessThanSignKeyword_2_0()), new TokenAlias(false, true, grammarAccess.getProcedureAccess().getMocKeyword_2_1()), new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getAndKeyword_2_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOrKeyword_2_2_1())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getGreaterThanSignKeyword_2_3()));
+		match_Procedure___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q = new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getMacroKeyword_10_0_0_0_1()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRoutineKeyword_10_0_0_0_0()));
+		match_Procedure___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0()));
+		match_Procedure___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_7_0_1_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()));
+		match_Procedure___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_7_0_1_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()));
+		match_Procedure___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_7_0_1_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()));
+		match_Procedure___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_7_0_1_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()));
+		match_Procedure___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_0_1_1_2()), new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()));
+		match_Procedure___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_1_1_1_2()), new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()));
+		match_Procedure___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_2_1_1_2()), new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()));
+		match_Procedure___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getRightCurlyBracketKeyword_8_3_1_1_2()), new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()));
+		match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0()));
+		match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0()));
+		match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()));
+		match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()));
+		match_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()));
+		match_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()));
+		match_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()));
+		match_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getInoutKeyword_8_1_0()));
+		match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0()));
+		match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0()));
+		match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a = new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0())), new TokenAlias(false, true, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0()));
+		match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()));
+		match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()));
+		match_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()));
+		match_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()));
+		match_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a = new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, true, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()));
+		match_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()));
+		match_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getProcedureAccess().getPrivateKeyword_9_3_0()));
+		match_PseudostateInitial_MocKeyword_1_0_2_q = new TokenAlias(false, true, grammarAccess.getPseudostateInitialAccess().getMocKeyword_1_0_2());
+		match_PseudostateInitial_PseudostateKeyword_1_0_0_1_or_StateKeyword_1_0_0_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getPseudostateInitialAccess().getPseudostateKeyword_1_0_0_1()), new TokenAlias(false, false, grammarAccess.getPseudostateInitialAccess().getStateKeyword_1_0_0_0()));
+		match_PseudostateInitial_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getPseudostateInitialAccess().getLeftCurlyBracketKeyword_3_0_0()), new TokenAlias(false, false, grammarAccess.getPseudostateInitialAccess().getRightCurlyBracketKeyword_3_0_2())), new TokenAlias(false, false, grammarAccess.getPseudostateInitialAccess().getSemicolonKeyword_3_1()));
+		match_Routine_MacroKeyword_1_q = new TokenAlias(false, true, grammarAccess.getRoutineAccess().getMacroKeyword_1());
+		match_Routine___LeftParenthesisKeyword_5_0_RightParenthesisKeyword_5_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getRoutineAccess().getLeftParenthesisKeyword_5_0()), new TokenAlias(false, false, grammarAccess.getRoutineAccess().getRightParenthesisKeyword_5_2()));
+		match_SimpleState_SemicolonKeyword_5_1_or___LeftCurlyBracketKeyword_5_0_0_RightCurlyBracketKeyword_5_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getSimpleStateAccess().getLeftCurlyBracketKeyword_5_0_0()), new TokenAlias(false, false, grammarAccess.getSimpleStateAccess().getRightCurlyBracketKeyword_5_0_2())), new TokenAlias(false, false, grammarAccess.getSimpleStateAccess().getSemicolonKeyword_5_1()));
+		match_SimpleState___LessThanSignKeyword_2_0_MocKeyword_2_1_q_SimpleKeyword_2_2_GreaterThanSignKeyword_2_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getSimpleStateAccess().getLessThanSignKeyword_2_0()), new TokenAlias(false, true, grammarAccess.getSimpleStateAccess().getMocKeyword_2_1()), new TokenAlias(false, false, grammarAccess.getSimpleStateAccess().getSimpleKeyword_2_2()), new TokenAlias(false, false, grammarAccess.getSimpleStateAccess().getGreaterThanSignKeyword_2_3()));
+		match_StartState_MocKeyword_1_0_2_q = new TokenAlias(false, true, grammarAccess.getStartStateAccess().getMocKeyword_1_0_2());
+		match_StartState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getStartStateAccess().getLeftCurlyBracketKeyword_3_0_0()), new TokenAlias(false, false, grammarAccess.getStartStateAccess().getRightCurlyBracketKeyword_3_0_2())), new TokenAlias(false, false, grammarAccess.getStartStateAccess().getSemicolonKeyword_3_1()));
+		match_StatemachineRegion_RegionKeyword_1_0_0_or_StatemachineKeyword_1_0_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_0_1()));
+		match_StatemachineRegion_RegionKeyword_1_1_0_0_or_StatemachineKeyword_1_1_0_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getStatemachineRegionAccess().getRegionKeyword_1_1_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineRegionAccess().getStatemachineKeyword_1_1_0_1()));
+		match_Statemachine_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getMacroKeyword_10_0_0_0_1()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRoutineKeyword_10_0_0_0_0()));
+		match_Statemachine_ParameterKeyword_7_0_0_q = new TokenAlias(false, true, grammarAccess.getStatemachineAccess().getParameterKeyword_7_0_0());
+		match_Statemachine_ProcedureKeyword_10_0_1_0_q = new TokenAlias(false, true, grammarAccess.getStatemachineAccess().getProcedureKeyword_10_0_1_0());
+		match_Statemachine_PropertyKeyword_9_0_0_q = new TokenAlias(false, true, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0());
+		match_Statemachine_PublicKeyword_9_1_0_q = new TokenAlias(false, true, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0());
+		match_Statemachine___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0()));
+		match_Statemachine___LessThanSignKeyword_3_0_MocKeyword_3_1_q___AndKeyword_3_2_1_or_OrKeyword_3_2_0___GreaterThanSignKeyword_3_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getLessThanSignKeyword_3_0()), new TokenAlias(false, true, grammarAccess.getStatemachineAccess().getMocKeyword_3_1()), new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getAndKeyword_3_2_1()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOrKeyword_3_2_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getGreaterThanSignKeyword_3_3()));
+		match_Statemachine___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q = new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getMacroKeyword_10_0_0_0_1()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRoutineKeyword_10_0_0_0_0()));
+		match_Statemachine___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0()));
+		match_Statemachine___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_0_1_1_2()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_7_0_1_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_0_1_1_0()));
+		match_Statemachine___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_1_1_1_2()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_7_0_1_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_1_1_1_0()));
+		match_Statemachine___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_2_1_1_2()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_7_0_1_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_2_1_1_0()));
+		match_Statemachine___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_7_0_1_3_1_1_2()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_7_0_1_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_7_0_1_3_1_1_0()));
+		match_Statemachine___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_0_1_1_2()), new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_0_1_1_0()));
+		match_Statemachine___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_1_1_1_2()), new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_1_1_1_0()));
+		match_Statemachine___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_2_1_1_2()), new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_2_1_1_0()));
+		match_Statemachine___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getRightCurlyBracketKeyword_8_3_1_1_2()), new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getLeftCurlyBracketKeyword_8_3_1_1_0()));
+		match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0()));
+		match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0()));
+		match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()));
+		match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()));
+		match_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()));
+		match_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()));
+		match_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()));
+		match_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInputKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getOutputKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getReturnKeyword_8_3_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getInoutKeyword_8_1_0()));
+		match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0()));
+		match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0()));
+		match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a = new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0())), new TokenAlias(false, true, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0()));
+		match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()));
+		match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()));
+		match_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()));
+		match_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()));
+		match_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a = new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, true, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()));
+		match_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()));
+		match_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPropertyKeyword_9_0_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getProtectedKeyword_9_2_0()), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPublicKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getStatemachineAccess().getPrivateKeyword_9_3_0()));
+		match_System_BehaviorKeyword_10_0_0_q = new TokenAlias(false, true, grammarAccess.getSystemAccess().getBehaviorKeyword_10_0_0());
+		match_System_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getSystemAccess().getCompositeKeyword_9_0_0_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getMachineKeyword_9_0_0_1()));
+		match_System_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0 = new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getSystemAccess().getMacroKeyword_8_0_0_0_1()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getRoutineKeyword_8_0_0_0_0()));
+		match_System_ModelKeyword_9_1_0_q = new TokenAlias(false, true, grammarAccess.getSystemAccess().getModelKeyword_9_1_0());
+		match_System_ProcedureKeyword_8_0_1_0_q = new TokenAlias(false, true, grammarAccess.getSystemAccess().getProcedureKeyword_8_0_1_0());
+		match_System_PrototypeKeyword_9_2_0_q = new TokenAlias(false, true, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0());
+		match_System_StatemachineKeyword_10_1_0_q = new TokenAlias(false, true, grammarAccess.getSystemAccess().getStatemachineKeyword_10_1_0());
+		match_System___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getModelKeyword_9_1_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0()));
+		match_System___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getLessThanSignKeyword_2_0()), new TokenAlias(false, true, grammarAccess.getSystemAccess().getMocKeyword_2_1()), new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getSystemAccess().getAndKeyword_2_2_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getOrKeyword_2_2_1())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getGreaterThanSignKeyword_2_3()));
+		match_System___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q = new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getMacroKeyword_8_0_0_0_1()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getRoutineKeyword_8_0_0_0_0()));
+		match_System___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q = new GroupAlias(false, true, new TokenAlias(false, true, grammarAccess.getSystemAccess().getModelKeyword_9_1_0()), new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, true, grammarAccess.getSystemAccess().getModelKeyword_9_1_0())), new AlternativeAlias(false, false, new TokenAlias(false, false, grammarAccess.getSystemAccess().getCompositeKeyword_9_0_0_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getMachineKeyword_9_0_0_1())));
+		match_System___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a = new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0()));
+		match_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getModelKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0()));
+		match_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getModelKeyword_9_1_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0()));
+		match_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a = new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getModelKeyword_9_1_0())), new TokenAlias(false, true, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0()));
+		match_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getModelKeyword_9_1_0()));
+		match_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getModelKeyword_9_1_0()));
+		match_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a = new GroupAlias(true, true, new AlternativeAlias(false, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, true, grammarAccess.getSystemAccess().getModelKeyword_9_1_0()));
+		match_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getModelKeyword_9_1_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()));
+		match_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getModelKeyword_9_1_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrototypeKeyword_9_2_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getInstanceKeyword_9_3_0()));
+		match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0()));
+		match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0()));
+		match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()));
+		match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()));
+		match_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()));
+		match_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()));
+		match_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a = new GroupAlias(true, true, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()));
+		match_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p = new GroupAlias(true, false, new AlternativeAlias(true, true, new TokenAlias(false, false, grammarAccess.getSystemAccess().getPropertyKeyword_7_0_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getProtectedKeyword_7_2_0()), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPublicKeyword_7_1_0())), new TokenAlias(false, false, grammarAccess.getSystemAccess().getPrivateKeyword_7_3_0()));
+		match_TransitionMoe_MocKeyword_1_0_0_q = new TokenAlias(false, true, grammarAccess.getTransitionMoeAccess().getMocKeyword_1_0_0());
+		match_TransitionMoe_PriorKeyword_1_0_2_1_q = new TokenAlias(false, true, grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_0_2_1());
+		match_TransitionMoe_PriorKeyword_1_1_0_q = new TokenAlias(false, true, grammarAccess.getTransitionMoeAccess().getPriorKeyword_1_1_0());
+		match_Transition_GuardKeyword_5_0_1_0_1_1_q = new TokenAlias(false, true, grammarAccess.getTransitionAccess().getGuardKeyword_5_0_1_0_1_1());
+		match_Transition_GuardKeyword_5_1_2_0_1_0_1_1_q = new TokenAlias(false, true, grammarAccess.getTransitionAccess().getGuardKeyword_5_1_2_0_1_0_1_1());
+		match_Transition_SemicolonKeyword_5_1_2_1_or___LeftCurlyBracketKeyword_5_1_2_0_0___TriggerKeyword_5_1_2_0_1_0_0_0_q_GuardKeyword_5_1_2_0_1_0_1_1_q_TguardKeyword_5_1_2_0_1_0_2_1_q_EffectKeyword_5_1_2_0_1_0_3__q_RightCurlyBracketKeyword_5_1_2_0_2__ = new AlternativeAlias(false, false, new GroupAlias(false, false, new TokenAlias(false, false, grammarAccess.getTransitionAccess().getLeftCurlyBracketKeyword_5_1_2_0_0()), new GroupAlias(false, true, new TokenAlias(false, true, grammarAccess.getTransitionAccess().getTriggerKeyword_5_1_2_0_1_0_0_0()), new TokenAlias(false, true, grammarAccess.getTransitionAccess().getGuardKeyword_5_1_2_0_1_0_1_1()), new TokenAlias(false, true, grammarAccess.getTransitionAccess().getTguardKeyword_5_1_2_0_1_0_2_1()), new TokenAlias(false, false, grammarAccess.getTransitionAccess().getEffectKeyword_5_1_2_0_1_0_3())), new TokenAlias(false, false, grammarAccess.getTransitionAccess().getRightCurlyBracketKeyword_5_1_2_0_2())), new TokenAlias(false, false, grammarAccess.getTransitionAccess().getSemicolonKeyword_5_1_2_1()));
+		match_Transition_TguardKeyword_5_0_1_0_2_1_q = new TokenAlias(false, true, grammarAccess.getTransitionAccess().getTguardKeyword_5_0_1_0_2_1());
+		match_Transition_TguardKeyword_5_1_2_0_1_0_2_1_q = new TokenAlias(false, true, grammarAccess.getTransitionAccess().getTguardKeyword_5_1_2_0_1_0_2_1());
+		match_Transition_TriggerKeyword_5_0_1_0_0_0_q = new TokenAlias(false, true, grammarAccess.getTransitionAccess().getTriggerKeyword_5_0_1_0_0_0());
+		match_Transition_TriggerKeyword_5_1_2_0_1_0_0_0_q = new TokenAlias(false, true, grammarAccess.getTransitionAccess().getTriggerKeyword_5_1_2_0_1_0_0_0());
+		match_Transition___TriggerKeyword_5_0_1_0_0_0_q_GuardKeyword_5_0_1_0_1_1_q_TguardKeyword_5_0_1_0_2_1_q_EffectKeyword_5_0_1_0_3__q = new GroupAlias(false, true, new TokenAlias(false, true, grammarAccess.getTransitionAccess().getTriggerKeyword_5_0_1_0_0_0()), new TokenAlias(false, true, grammarAccess.getTransitionAccess().getGuardKeyword_5_0_1_0_1_1()), new TokenAlias(false, true, grammarAccess.getTransitionAccess().getTguardKeyword_5_0_1_0_2_1()), new TokenAlias(false, false, grammarAccess.getTransitionAccess().getEffectKeyword_5_0_1_0_3()));
+		match_Variable_VarKeyword_1_2_2_q = new TokenAlias(false, true, grammarAccess.getVariableAccess().getVarKeyword_1_2_2());
+		match_Variable_VarKeyword_1_3_1_0_q = new TokenAlias(false, true, grammarAccess.getVariableAccess().getVarKeyword_1_3_1_0());
+		match_moeRoutine___LeftParenthesisKeyword_1_0_RightParenthesisKeyword_1_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getMoeRoutineAccess().getLeftParenthesisKeyword_1_0()), new TokenAlias(false, false, grammarAccess.getMoeRoutineAccess().getRightParenthesisKeyword_1_2()));
+	}
+	
+	@Override
+	protected String getUnassignedRuleCallToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+		return "";
+	}
+	
+	
+	@Override
+	protected void emitUnassignedTokens(EObject semanticObject, ISynTransition transition, INode fromNode, INode toNode) {
+		if (transition.getAmbiguousSyntaxes().isEmpty()) return;
+		List<INode> transitionNodes = collectNodes(fromNode, toNode);
+		for (AbstractElementAlias syntax : transition.getAmbiguousSyntaxes()) {
+			List<INode> syntaxNodes = getNodesFor(transitionNodes, syntax);
+			if (match_BaseExpression_LeftParenthesisKeyword_1_0_a.equals(syntax))
+				emit_BaseExpression_LeftParenthesisKeyword_1_0_a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_BaseExpression_LeftParenthesisKeyword_1_0_p.equals(syntax))
+				emit_BaseExpression_LeftParenthesisKeyword_1_0_p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_BlockParameterSet___RightCurlyBracketKeyword_1_0_1_1_2_InputKeyword_1_0_0_LeftCurlyBracketKeyword_1_0_1_1_0__q.equals(syntax))
+				emit_BlockParameterSet___RightCurlyBracketKeyword_1_0_1_1_2_InputKeyword_1_0_0_LeftCurlyBracketKeyword_1_0_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_BlockParameterSet___RightCurlyBracketKeyword_1_1_1_1_2_InoutKeyword_1_1_0_LeftCurlyBracketKeyword_1_1_1_1_0__q.equals(syntax))
+				emit_BlockParameterSet___RightCurlyBracketKeyword_1_1_1_1_2_InoutKeyword_1_1_0_LeftCurlyBracketKeyword_1_1_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_BlockParameterSet___RightCurlyBracketKeyword_1_2_1_1_2_OutputKeyword_1_2_0_LeftCurlyBracketKeyword_1_2_1_1_0__q.equals(syntax))
+				emit_BlockParameterSet___RightCurlyBracketKeyword_1_2_1_1_2_OutputKeyword_1_2_0_LeftCurlyBracketKeyword_1_2_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_BlockParameterSet___RightCurlyBracketKeyword_1_3_1_1_2_ReturnKeyword_1_3_0_LeftCurlyBracketKeyword_1_3_1_1_0__q.equals(syntax))
+				emit_BlockParameterSet___RightCurlyBracketKeyword_1_3_1_1_2_ReturnKeyword_1_3_0_LeftCurlyBracketKeyword_1_3_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_BufferContainerType___LessThanSignKeyword_2_0_GreaterThanSignKeyword_2_2__q.equals(syntax))
+				emit_BufferContainerType___LessThanSignKeyword_2_0_GreaterThanSignKeyword_2_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_CompositeState_MocKeyword_3_q.equals(syntax))
+				emit_CompositeState_MocKeyword_3_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_CompositeState_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__p_RightCurlyBracketKeyword_8_0_2__.equals(syntax))
+				emit_CompositeState_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__p_RightCurlyBracketKeyword_8_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__a.equals(syntax))
+				emit_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__p.equals(syntax))
+				emit_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_CompositeState___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__a.equals(syntax))
+				emit_CompositeState___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__a.equals(syntax))
+				emit_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__p.equals(syntax))
+				emit_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DynamicInstanceSpecification_____LeftCurlyBracketKeyword_3_1_0_RightCurlyBracketKeyword_3_1_2___or___LeftParenthesisKeyword_3_0_0_RightParenthesisKeyword_3_0_2____q.equals(syntax))
+				emit_DynamicInstanceSpecification_____LeftCurlyBracketKeyword_3_1_0_RightCurlyBracketKeyword_3_1_2___or___LeftParenthesisKeyword_3_0_0_RightParenthesisKeyword_3_0_2____q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_ElseIfStatement_ElseifKeyword_0_0_or___ElseKeyword_0_1_0_IfKeyword_0_1_1__.equals(syntax))
+				emit_ElseIfStatement_ElseifKeyword_0_0_or___ElseKeyword_0_1_0_IfKeyword_0_1_1__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_EndingPseudostate_MocKeyword_3_q.equals(syntax))
+				emit_EndingPseudostate_MocKeyword_3_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_EndingPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0.equals(syntax))
+				emit_EndingPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_EndingPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__.equals(syntax))
+				emit_EndingPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_FinalState_MocKeyword_1_0_2_q.equals(syntax))
+				emit_FinalState_MocKeyword_1_0_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_FinalState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__.equals(syntax))
+				emit_FinalState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_InputComStatement_LessThanSignEqualsSignEqualsSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1.equals(syntax))
+				emit_InputComStatement_LessThanSignEqualsSignEqualsSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_InstanceMachine_ModelKeyword_3_q.equals(syntax))
+				emit_InstanceMachine_ModelKeyword_3_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_InstanceMachine___LeftCurlyBracketKeyword_8_1_0_RightCurlyBracketKeyword_8_1_2___or_____LeftParenthesisKeyword_8_0_0_0_RightParenthesisKeyword_8_0_0_2__q_SemicolonKeyword_8_0_1__.equals(syntax))
+				emit_InstanceMachine___LeftCurlyBracketKeyword_8_1_0_RightCurlyBracketKeyword_8_1_2___or_____LeftParenthesisKeyword_8_0_0_0_RightParenthesisKeyword_8_0_0_2__q_SemicolonKeyword_8_0_1__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_InstanceMachine___MachineKeyword_1_0_or_StatemachineKeyword_1_1__q.equals(syntax))
+				emit_InstanceMachine___MachineKeyword_1_0_or_StatemachineKeyword_1_1__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_LiteralEnvExpression_EnvKeyword_1_0_or_EnvKeyword_1_1.equals(syntax))
+				emit_LiteralEnvExpression_EnvKeyword_1_0_or_EnvKeyword_1_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_LiteralNullExpression_NullKeyword_0_1_0_or_NullKeyword_0_1_1.equals(syntax))
+				emit_LiteralNullExpression_NullKeyword_0_1_0_or_NullKeyword_0_1_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_LiteralNullExpression_NullKeyword_1_1_0_or_NullKeyword_1_1_1.equals(syntax))
+				emit_LiteralNullExpression_NullKeyword_1_1_0_or_NullKeyword_1_1_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_LogicalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1.equals(syntax))
+				emit_LogicalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_LogicalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0.equals(syntax))
+				emit_LogicalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_BehaviorKeyword_10_0_0_q.equals(syntax))
+				emit_MachineBlock_BehaviorKeyword_10_0_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1.equals(syntax))
+				emit_MachineBlock_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0.equals(syntax))
+				emit_MachineBlock_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_ModelKeyword_9_1_0_q.equals(syntax))
+				emit_MachineBlock_ModelKeyword_9_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_ProcedureKeyword_8_0_1_0_q.equals(syntax))
+				emit_MachineBlock_ProcedureKeyword_8_0_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_PrototypeKeyword_9_2_0_q.equals(syntax))
+				emit_MachineBlock_PrototypeKeyword_9_2_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_StatemachineKeyword_10_1_0_q.equals(syntax))
+				emit_MachineBlock_StatemachineKeyword_10_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a.equals(syntax))
+				emit_MachineBlock___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q.equals(syntax))
+				emit_MachineBlock___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q.equals(syntax))
+				emit_MachineBlock___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q.equals(syntax))
+				emit_MachineBlock___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a.equals(syntax))
+				emit_MachineBlock___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a.equals(syntax))
+				emit_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p.equals(syntax))
+				emit_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a.equals(syntax))
+				emit_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q.equals(syntax))
+				emit_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a.equals(syntax))
+				emit_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p.equals(syntax))
+				emit_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a.equals(syntax))
+				emit_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a.equals(syntax))
+				emit_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p.equals(syntax))
+				emit_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a.equals(syntax))
+				emit_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p.equals(syntax))
+				emit_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a.equals(syntax))
+				emit_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p.equals(syntax))
+				emit_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a.equals(syntax))
+				emit_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p.equals(syntax))
+				emit_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a.equals(syntax))
+				emit_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p.equals(syntax))
+				emit_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_MoeBehavior_LocalKeyword_1_0_q.equals(syntax))
+				emit_MoeBehavior_LocalKeyword_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_NamedExpression_ColonKeyword_1_0_or_EqualsSignGreaterThanSignKeyword_1_1_or_LessThanSignHyphenMinusKeyword_1_2.equals(syntax))
+				emit_NamedExpression_ColonKeyword_1_0_or_EqualsSignGreaterThanSignKeyword_1_1_or_LessThanSignHyphenMinusKeyword_1_2(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_OtherPseudostate_MocKeyword_3_q.equals(syntax))
+				emit_OtherPseudostate_MocKeyword_3_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_OtherPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0.equals(syntax))
+				emit_OtherPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_OtherPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__.equals(syntax))
+				emit_OtherPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_OutputComStatement_EqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1.equals(syntax))
+				emit_OutputComStatement_EqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveBooleanType_BoolKeyword_1_1_or_BooleanKeyword_1_0.equals(syntax))
+				emit_PrimitiveBooleanType_BoolKeyword_1_1_or_BooleanKeyword_1_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveFloatType_DoubleKeyword_2_2_or_FloatKeyword_2_0_or_UdoubleKeyword_2_3_or_UfloatKeyword_2_1.equals(syntax))
+				emit_PrimitiveFloatType_DoubleKeyword_2_2_or_FloatKeyword_2_0_or_UdoubleKeyword_2_3_or_UfloatKeyword_2_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveFloatType_SizeKeyword_3_1_1_q.equals(syntax))
+				emit_PrimitiveFloatType_SizeKeyword_3_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveIntegerType_IntKeyword_2_2_or_IntegerKeyword_2_0_or_UintKeyword_2_3_or_UintegerKeyword_2_1.equals(syntax))
+				emit_PrimitiveIntegerType_IntKeyword_2_2_or_IntegerKeyword_2_0_or_UintKeyword_2_3_or_UintegerKeyword_2_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveIntegerType_SizeKeyword_3_1_1_q.equals(syntax))
+				emit_PrimitiveIntegerType_SizeKeyword_3_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveRationalType_RatKeyword_2_2_or_RationalKeyword_2_0_or_UratKeyword_2_3_or_UrationalKeyword_2_1.equals(syntax))
+				emit_PrimitiveRationalType_RatKeyword_2_2_or_RationalKeyword_2_0_or_UratKeyword_2_3_or_UrationalKeyword_2_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveRationalType_SizeKeyword_3_1_1_q.equals(syntax))
+				emit_PrimitiveRationalType_SizeKeyword_3_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveRealType_RealKeyword_2_0_or_UrealKeyword_2_1.equals(syntax))
+				emit_PrimitiveRealType_RealKeyword_2_0_or_UrealKeyword_2_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveRealType_SizeKeyword_3_1_1_q.equals(syntax))
+				emit_PrimitiveRealType_SizeKeyword_3_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PrimitiveStringType_SizeKeyword_2_1_1_q.equals(syntax))
+				emit_PrimitiveStringType_SizeKeyword_2_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_ProcedureExecution_MoeKeyword_1_q.equals(syntax))
+				emit_ProcedureExecution_MoeKeyword_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0.equals(syntax))
+				emit_Procedure_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_ParameterKeyword_7_0_0_q.equals(syntax))
+				emit_Procedure_ParameterKeyword_7_0_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_ProcedureKeyword_10_0_1_0_q.equals(syntax))
+				emit_Procedure_ProcedureKeyword_10_0_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_PropertyKeyword_9_0_0_q.equals(syntax))
+				emit_Procedure_PropertyKeyword_9_0_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_PublicKeyword_9_1_0_q.equals(syntax))
+				emit_Procedure_PublicKeyword_9_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a.equals(syntax))
+				emit_Procedure___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___LeftParenthesisKeyword_5_0_0_RightParenthesisKeyword_5_0_2__q.equals(syntax))
+				emit_Procedure___LeftParenthesisKeyword_5_0_0_RightParenthesisKeyword_5_0_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q.equals(syntax))
+				emit_Procedure___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q.equals(syntax))
+				emit_Procedure___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a.equals(syntax))
+				emit_Procedure___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q.equals(syntax))
+				emit_Procedure___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q.equals(syntax))
+				emit_Procedure___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q.equals(syntax))
+				emit_Procedure___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q.equals(syntax))
+				emit_Procedure___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q.equals(syntax))
+				emit_Procedure___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q.equals(syntax))
+				emit_Procedure___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q.equals(syntax))
+				emit_Procedure___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q.equals(syntax))
+				emit_Procedure___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a.equals(syntax))
+				emit_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p.equals(syntax))
+				emit_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a.equals(syntax))
+				emit_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p.equals(syntax))
+				emit_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a.equals(syntax))
+				emit_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p.equals(syntax))
+				emit_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a.equals(syntax))
+				emit_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p.equals(syntax))
+				emit_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a.equals(syntax))
+				emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p.equals(syntax))
+				emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a.equals(syntax))
+				emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a.equals(syntax))
+				emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p.equals(syntax))
+				emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a.equals(syntax))
+				emit_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p.equals(syntax))
+				emit_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a.equals(syntax))
+				emit_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a.equals(syntax))
+				emit_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p.equals(syntax))
+				emit_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PseudostateInitial_MocKeyword_1_0_2_q.equals(syntax))
+				emit_PseudostateInitial_MocKeyword_1_0_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PseudostateInitial_PseudostateKeyword_1_0_0_1_or_StateKeyword_1_0_0_0.equals(syntax))
+				emit_PseudostateInitial_PseudostateKeyword_1_0_0_1_or_StateKeyword_1_0_0_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_PseudostateInitial_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__.equals(syntax))
+				emit_PseudostateInitial_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Routine_MacroKeyword_1_q.equals(syntax))
+				emit_Routine_MacroKeyword_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Routine___LeftParenthesisKeyword_5_0_RightParenthesisKeyword_5_2__q.equals(syntax))
+				emit_Routine___LeftParenthesisKeyword_5_0_RightParenthesisKeyword_5_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_SimpleState_SemicolonKeyword_5_1_or___LeftCurlyBracketKeyword_5_0_0_RightCurlyBracketKeyword_5_0_2__.equals(syntax))
+				emit_SimpleState_SemicolonKeyword_5_1_or___LeftCurlyBracketKeyword_5_0_0_RightCurlyBracketKeyword_5_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_SimpleState___LessThanSignKeyword_2_0_MocKeyword_2_1_q_SimpleKeyword_2_2_GreaterThanSignKeyword_2_3__q.equals(syntax))
+				emit_SimpleState___LessThanSignKeyword_2_0_MocKeyword_2_1_q_SimpleKeyword_2_2_GreaterThanSignKeyword_2_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_StartState_MocKeyword_1_0_2_q.equals(syntax))
+				emit_StartState_MocKeyword_1_0_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_StartState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__.equals(syntax))
+				emit_StartState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_StatemachineRegion_RegionKeyword_1_0_0_or_StatemachineKeyword_1_0_1.equals(syntax))
+				emit_StatemachineRegion_RegionKeyword_1_0_0_or_StatemachineKeyword_1_0_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_StatemachineRegion_RegionKeyword_1_1_0_0_or_StatemachineKeyword_1_1_0_1.equals(syntax))
+				emit_StatemachineRegion_RegionKeyword_1_1_0_0_or_StatemachineKeyword_1_1_0_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0.equals(syntax))
+				emit_Statemachine_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_ParameterKeyword_7_0_0_q.equals(syntax))
+				emit_Statemachine_ParameterKeyword_7_0_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_ProcedureKeyword_10_0_1_0_q.equals(syntax))
+				emit_Statemachine_ProcedureKeyword_10_0_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_PropertyKeyword_9_0_0_q.equals(syntax))
+				emit_Statemachine_PropertyKeyword_9_0_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_PublicKeyword_9_1_0_q.equals(syntax))
+				emit_Statemachine_PublicKeyword_9_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a.equals(syntax))
+				emit_Statemachine___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___LessThanSignKeyword_3_0_MocKeyword_3_1_q___AndKeyword_3_2_1_or_OrKeyword_3_2_0___GreaterThanSignKeyword_3_3__q.equals(syntax))
+				emit_Statemachine___LessThanSignKeyword_3_0_MocKeyword_3_1_q___AndKeyword_3_2_1_or_OrKeyword_3_2_0___GreaterThanSignKeyword_3_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q.equals(syntax))
+				emit_Statemachine___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a.equals(syntax))
+				emit_Statemachine___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q.equals(syntax))
+				emit_Statemachine___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q.equals(syntax))
+				emit_Statemachine___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q.equals(syntax))
+				emit_Statemachine___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q.equals(syntax))
+				emit_Statemachine___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q.equals(syntax))
+				emit_Statemachine___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q.equals(syntax))
+				emit_Statemachine___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q.equals(syntax))
+				emit_Statemachine___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q.equals(syntax))
+				emit_Statemachine___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a.equals(syntax))
+				emit_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p.equals(syntax))
+				emit_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a.equals(syntax))
+				emit_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p.equals(syntax))
+				emit_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a.equals(syntax))
+				emit_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p.equals(syntax))
+				emit_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a.equals(syntax))
+				emit_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p.equals(syntax))
+				emit_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a.equals(syntax))
+				emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p.equals(syntax))
+				emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a.equals(syntax))
+				emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a.equals(syntax))
+				emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p.equals(syntax))
+				emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a.equals(syntax))
+				emit_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p.equals(syntax))
+				emit_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a.equals(syntax))
+				emit_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a.equals(syntax))
+				emit_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p.equals(syntax))
+				emit_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_BehaviorKeyword_10_0_0_q.equals(syntax))
+				emit_System_BehaviorKeyword_10_0_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1.equals(syntax))
+				emit_System_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0.equals(syntax))
+				emit_System_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_ModelKeyword_9_1_0_q.equals(syntax))
+				emit_System_ModelKeyword_9_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_ProcedureKeyword_8_0_1_0_q.equals(syntax))
+				emit_System_ProcedureKeyword_8_0_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_PrototypeKeyword_9_2_0_q.equals(syntax))
+				emit_System_PrototypeKeyword_9_2_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_StatemachineKeyword_10_1_0_q.equals(syntax))
+				emit_System_StatemachineKeyword_10_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a.equals(syntax))
+				emit_System___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q.equals(syntax))
+				emit_System___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q.equals(syntax))
+				emit_System___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q.equals(syntax))
+				emit_System___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a.equals(syntax))
+				emit_System___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a.equals(syntax))
+				emit_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p.equals(syntax))
+				emit_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a.equals(syntax))
+				emit_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a.equals(syntax))
+				emit_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p.equals(syntax))
+				emit_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a.equals(syntax))
+				emit_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a.equals(syntax))
+				emit_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p.equals(syntax))
+				emit_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a.equals(syntax))
+				emit_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p.equals(syntax))
+				emit_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a.equals(syntax))
+				emit_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p.equals(syntax))
+				emit_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a.equals(syntax))
+				emit_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p.equals(syntax))
+				emit_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a.equals(syntax))
+				emit_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p.equals(syntax))
+				emit_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_TransitionMoe_MocKeyword_1_0_0_q.equals(syntax))
+				emit_TransitionMoe_MocKeyword_1_0_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_TransitionMoe_PriorKeyword_1_0_2_1_q.equals(syntax))
+				emit_TransitionMoe_PriorKeyword_1_0_2_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_TransitionMoe_PriorKeyword_1_1_0_q.equals(syntax))
+				emit_TransitionMoe_PriorKeyword_1_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Transition_GuardKeyword_5_0_1_0_1_1_q.equals(syntax))
+				emit_Transition_GuardKeyword_5_0_1_0_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Transition_GuardKeyword_5_1_2_0_1_0_1_1_q.equals(syntax))
+				emit_Transition_GuardKeyword_5_1_2_0_1_0_1_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Transition_SemicolonKeyword_5_1_2_1_or___LeftCurlyBracketKeyword_5_1_2_0_0___TriggerKeyword_5_1_2_0_1_0_0_0_q_GuardKeyword_5_1_2_0_1_0_1_1_q_TguardKeyword_5_1_2_0_1_0_2_1_q_EffectKeyword_5_1_2_0_1_0_3__q_RightCurlyBracketKeyword_5_1_2_0_2__.equals(syntax))
+				emit_Transition_SemicolonKeyword_5_1_2_1_or___LeftCurlyBracketKeyword_5_1_2_0_0___TriggerKeyword_5_1_2_0_1_0_0_0_q_GuardKeyword_5_1_2_0_1_0_1_1_q_TguardKeyword_5_1_2_0_1_0_2_1_q_EffectKeyword_5_1_2_0_1_0_3__q_RightCurlyBracketKeyword_5_1_2_0_2__(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Transition_TguardKeyword_5_0_1_0_2_1_q.equals(syntax))
+				emit_Transition_TguardKeyword_5_0_1_0_2_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Transition_TguardKeyword_5_1_2_0_1_0_2_1_q.equals(syntax))
+				emit_Transition_TguardKeyword_5_1_2_0_1_0_2_1_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Transition_TriggerKeyword_5_0_1_0_0_0_q.equals(syntax))
+				emit_Transition_TriggerKeyword_5_0_1_0_0_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Transition_TriggerKeyword_5_1_2_0_1_0_0_0_q.equals(syntax))
+				emit_Transition_TriggerKeyword_5_1_2_0_1_0_0_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Transition___TriggerKeyword_5_0_1_0_0_0_q_GuardKeyword_5_0_1_0_1_1_q_TguardKeyword_5_0_1_0_2_1_q_EffectKeyword_5_0_1_0_3__q.equals(syntax))
+				emit_Transition___TriggerKeyword_5_0_1_0_0_0_q_GuardKeyword_5_0_1_0_1_1_q_TguardKeyword_5_0_1_0_2_1_q_EffectKeyword_5_0_1_0_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Variable_VarKeyword_1_2_2_q.equals(syntax))
+				emit_Variable_VarKeyword_1_2_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_Variable_VarKeyword_1_3_1_0_q.equals(syntax))
+				emit_Variable_VarKeyword_1_3_1_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_moeRoutine___LeftParenthesisKeyword_1_0_RightParenthesisKeyword_1_2__q.equals(syntax))
+				emit_moeRoutine___LeftParenthesisKeyword_1_0_RightParenthesisKeyword_1_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else acceptNodes(getLastNavigableState(), syntaxNodes);
+		}
+	}
+
+	/**
+	 * Ambiguous syntax:
+	 *     '('*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '$delta' (rule start)
+	 *     (rule start) (ambiguity) '$parent' (rule start)
+	 *     (rule start) (ambiguity) '$self' (rule start)
+	 *     (rule start) (ambiguity) '$super' (rule start)
+	 *     (rule start) (ambiguity) '$system' (rule start)
+	 *     (rule start) (ambiguity) '$this' (rule start)
+	 *     (rule start) (ambiguity) '$time' (rule start)
+	 *     (rule start) (ambiguity) '(:' args+=Expression
+	 *     (rule start) (ambiguity) '(:' leftHandSide=LeftHandSideExpression
+	 *     (rule start) (ambiguity) '<' datatype=DataType
+	 *     (rule start) (ambiguity) 'ctor' '<' datatype=[DataType|ESUfid]
+	 *     (rule start) (ambiguity) 'newfresh' leftHandSide=LeftHandSideExpression
+	 *     (rule start) (ambiguity) '{' '}' (rule start)
+	 *     (rule start) (ambiguity) '{' value+=Expression
+	 *     (rule start) (ambiguity) '{' value+=NamedExpression
+	 *     (rule start) (ambiguity) ('$env' | 'env') (rule start)
+	 *     (rule start) (ambiguity) ('null' | '$null') (rule start)
+	 *     (rule start) (ambiguity) ('null<' | '$null<') type=DataType
+	 *     (rule start) (ambiguity) instance=DynamicInstanceSpecification
+	 *     (rule start) (ambiguity) leftHandSide=LeftHandSideExpression
+	 *     (rule start) (ambiguity) numerator=EInteger
+	 *     (rule start) (ambiguity) operator='!'
+	 *     (rule start) (ambiguity) operator='not'
+	 *     (rule start) (ambiguity) operator='~'
+	 *     (rule start) (ambiguity) operator=AffixOperator
+	 *     (rule start) (ambiguity) operator=ArithmeticUnaryOperator
+	 *     (rule start) (ambiguity) value=EBoolean
+	 *     (rule start) (ambiguity) value=ECharacter
+	 *     (rule start) (ambiguity) value=EDouble
+	 *     (rule start) (ambiguity) value=EInteger
+	 *     (rule start) (ambiguity) value=EString
+	 *     (rule start) (ambiguity) value=[NamedElement|ESIdentifier]
+	 *     (rule start) (ambiguity) {ArithmeticAssociativeExpression.operand+=}
+	 *     (rule start) (ambiguity) {BitwiseAssociativeExpression.operand+=}
+	 *     (rule start) (ambiguity) {ConditionalTestExpression.condition=}
+	 *     (rule start) (ambiguity) {EqualityBinaryExpression.leftOperand=}
+	 *     (rule start) (ambiguity) {LogicalAssociativeExpression.operand+=}
+	 *     (rule start) (ambiguity) {RelationalBinaryExpression.leftOperand=}
+	 *     (rule start) (ambiguity) {RelationalTernaryExpression.leftRelation=}
+	 *     (rule start) (ambiguity) {ValueElementSpecification.target=}
+	 */
+	protected void emit_BaseExpression_LeftParenthesisKeyword_1_0_a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '('+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '(:' leftHandSide=LeftHandSideExpression
+	 *     (rule start) (ambiguity) 'ctor' '<' datatype=[DataType|ESUfid]
+	 *     (rule start) (ambiguity) 'newfresh' leftHandSide=LeftHandSideExpression
+	 *     (rule start) (ambiguity) ('null' | '$null') ')' (rule start)
+	 *     (rule start) (ambiguity) ('null<' | '$null<') type=DataType
+	 *     (rule start) (ambiguity) leftHandSide=LeftHandSideExpression
+	 *     (rule start) (ambiguity) numerator=EInteger
+	 *     (rule start) (ambiguity) operator='!'
+	 *     (rule start) (ambiguity) operator='not'
+	 *     (rule start) (ambiguity) operator='~'
+	 *     (rule start) (ambiguity) operator=AffixOperator
+	 *     (rule start) (ambiguity) operator=ArithmeticUnaryOperator
+	 *     (rule start) (ambiguity) value=EBoolean
+	 *     (rule start) (ambiguity) value=ECharacter
+	 *     (rule start) (ambiguity) value=EDouble
+	 *     (rule start) (ambiguity) value=EInteger
+	 *     (rule start) (ambiguity) value=EString
+	 *     (rule start) (ambiguity) {ArithmeticAssociativeExpression.operand+=}
+	 *     (rule start) (ambiguity) {BitwiseAssociativeExpression.operand+=}
+	 *     (rule start) (ambiguity) {ConditionalTestExpression.condition=}
+	 *     (rule start) (ambiguity) {EqualityBinaryExpression.leftOperand=}
+	 *     (rule start) (ambiguity) {LogicalAssociativeExpression.operand+=}
+	 *     (rule start) (ambiguity) {RelationalBinaryExpression.leftOperand=}
+	 *     (rule start) (ambiguity) {RelationalTernaryExpression.leftRelation=}
+	 *     (rule start) (ambiguity) {ValueElementSpecification.target=}
+	 */
+	protected void emit_BaseExpression_LeftParenthesisKeyword_1_0_p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'input' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInput
+	 */
+	protected void emit_BlockParameterSet___RightCurlyBracketKeyword_1_0_1_1_2_InputKeyword_1_0_0_LeftCurlyBracketKeyword_1_0_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'inout' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInout
+	 */
+	protected void emit_BlockParameterSet___RightCurlyBracketKeyword_1_1_1_1_2_InoutKeyword_1_1_0_LeftCurlyBracketKeyword_1_1_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'output' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterOutput
+	 */
+	protected void emit_BlockParameterSet___RightCurlyBracketKeyword_1_2_1_1_2_OutputKeyword_1_2_0_LeftCurlyBracketKeyword_1_2_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'return' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterReturn
+	 */
+	protected void emit_BlockParameterSet___RightCurlyBracketKeyword_1_3_1_1_2_ReturnKeyword_1_3_0_LeftCurlyBracketKeyword_1_3_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('<' '>')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     container=BufferContainerKind (ambiguity) (rule end)
+	 */
+	protected void emit_BufferContainerType___LessThanSignKeyword_2_0_GreaterThanSignKeyword_2_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'moc:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     composite?='state' '<' (ambiguity) 'or' '>' name=ESIdentifier
+	 *     composite?='state' '<' (ambiguity) orthogonal?='and'
+	 */
+	protected void emit_CompositeState_MocKeyword_3_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ';' | ('{' ('@moe:' | '@transition:')+ '}')
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ESIdentifier (ambiguity) (rule end)
+	 *     unrestrictedName=UnrestrictedName (ambiguity) (rule end)
+	 */
+	protected void emit_CompositeState_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__p_RightCurlyBracketKeyword_8_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@moe:'* '@transition:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     transition+=Transition (ambiguity) transition+=Transition
+	 */
+	protected void emit_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@moe:'* '@transition:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     moe+=moeCompositeStateRoutines (ambiguity) transition+=Transition
+	 *     name=ESIdentifier '{' (ambiguity) transition+=Transition
+	 *     region+=StatemachineRegion (ambiguity) transition+=Transition
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) transition+=Transition
+	 */
+	protected void emit_CompositeState___MoeKeyword_8_0_1_0_1_0_a_TransitionKeyword_8_0_1_0_2_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@moe:' | '@transition:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     moe+=moeCompositeStateRoutines (ambiguity) '}' (rule end)
+	 *     moe+=moeCompositeStateRoutines (ambiguity) region+=StatemachineRegion
+	 *     name=ESIdentifier '{' (ambiguity) region+=StatemachineRegion
+	 *     region+=StatemachineRegion (ambiguity) '}' (rule end)
+	 *     region+=StatemachineRegion (ambiguity) region+=StatemachineRegion
+	 *     transition+=Transition (ambiguity) '}' (rule end)
+	 *     transition+=Transition (ambiguity) region+=StatemachineRegion
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) region+=StatemachineRegion
+	 */
+	protected void emit_CompositeState___MoeKeyword_8_0_1_0_1_0_or_TransitionKeyword_8_0_1_0_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@transition:'* '@moe:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     moe+=moeCompositeStateRoutines (ambiguity) moe+=moeCompositeStateRoutines
+	 */
+	protected void emit_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@transition:'* '@moe:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ESIdentifier '{' (ambiguity) moe+=moeCompositeStateRoutines
+	 *     region+=StatemachineRegion (ambiguity) moe+=moeCompositeStateRoutines
+	 *     transition+=Transition (ambiguity) moe+=moeCompositeStateRoutines
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) moe+=moeCompositeStateRoutines
+	 */
+	protected void emit_CompositeState___TransitionKeyword_8_0_1_0_2_0_a_MoeKeyword_8_0_1_0_1_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('(' ')') | ('{' '}'))?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     model=[Machine|ESIdentifier] (ambiguity) (rule end)
+	 */
+	protected void emit_DynamicInstanceSpecification_____LeftCurlyBracketKeyword_3_1_0_RightCurlyBracketKeyword_3_1_2___or___LeftParenthesisKeyword_3_0_0_RightParenthesisKeyword_3_0_2____q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'elseif' | ('else' 'if')
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) condition=Expression
+	 */
+	protected void emit_ElseIfStatement_ElseifKeyword_0_0_or___ElseKeyword_0_1_0_IfKeyword_0_1_1__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'moc:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) ('state' | 'pseudostate') '<' (ambiguity) kind=EndingPseudostateKind
+	 */
+	protected void emit_EndingPseudostate_MocKeyword_3_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'state' | 'pseudostate'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '<' 'moc:'? kind=EndingPseudostateKind
+	 */
+	protected void emit_EndingPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('{' '}') | ';'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ESIdentifier (ambiguity) (rule end)
+	 *     unrestrictedName=UnrestrictedName (ambiguity) (rule end)
+	 */
+	protected void emit_EndingPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'moc:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     simple?='state' '<' (ambiguity) 'final' '>' name=ESIdentifier
+	 */
+	protected void emit_FinalState_MocKeyword_1_0_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ';' | ('{' '}')
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ESIdentifier (ambiguity) (rule end)
+	 *     simple?='#final' (ambiguity) (rule end)
+	 *     unrestrictedName=UnrestrictedName (ambiguity) (rule end)
+	 */
+	protected void emit_FinalState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '<==' | 'via'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     leftValue+=Expression ')' (ambiguity) route=[Channel|ESUfid]
+	 *     port=[NamedElement|ESUfid] (ambiguity) route=[Channel|ESUfid]
+	 *     route=[Channel|ESUfid] (ambiguity) route=[Channel|ESUfid]
+	 *     target=ExpressionAsMachine (ambiguity) route=[Channel|ESUfid]
+	 */
+	protected void emit_InputComStatement_LessThanSignEqualsSignEqualsSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'model:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'instance' ('machine' | 'statemachine')? '<' (ambiguity) model=[Machine|ESUfid]
+	 */
+	protected void emit_InstanceMachine_ModelKeyword_3_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('(' ')')? ';') | ('{' '}')
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ESIdentifier (ambiguity) (rule end)
+	 *     unrestrictedName=UnrestrictedName (ambiguity) (rule end)
+	 */
+	protected void emit_InstanceMachine___LeftCurlyBracketKeyword_8_1_0_RightCurlyBracketKeyword_8_1_2___or_____LeftParenthesisKeyword_8_0_0_0_RightParenthesisKeyword_8_0_0_2__q_SemicolonKeyword_8_0_1__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('machine' | 'statemachine')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'instance' (ambiguity) '<' 'model:'? model=[Machine|ESUfid]
+	 */
+	protected void emit_InstanceMachine___MachineKeyword_1_0_or_StatemachineKeyword_1_1__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '$env' | 'env'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) '('* (ambiguity) (rule start)
+	 *     (rule start) (ambiguity) (rule start)
+	 */
+	protected void emit_LiteralEnvExpression_EnvKeyword_1_0_or_EnvKeyword_1_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'null' | '$null'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) '('* (ambiguity) (rule start)
+	 *     (rule start) '('+ (ambiguity) ')' (rule start)
+	 *     (rule start) (ambiguity) (rule start)
+	 */
+	protected void emit_LiteralNullExpression_NullKeyword_0_1_0_or_NullKeyword_0_1_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'null<' | '$null<'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) '('* (ambiguity) type=DataType
+	 *     (rule start) '('+ (ambiguity) type=DataType
+	 *     (rule start) (ambiguity) type=DataType
+	 */
+	protected void emit_LiteralNullExpression_NullKeyword_1_1_0_or_NullKeyword_1_1_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'and' | '&&'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     operand+=BitwiseOrExpression (ambiguity) operand+=BitwiseOrExpression
+	 */
+	protected void emit_LogicalAndExpression_AmpersandAmpersandKeyword_1_3_0_0_or_AndKeyword_1_3_0_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'or' | '||'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     operand+=LogicalAndExpression (ambiguity) operand+=LogicalAndExpression
+	 */
+	protected void emit_LogicalOrExpression_OrKeyword_1_3_0_1_or_VerticalLineVerticalLineKeyword_1_3_0_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@behavior:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     behavior+=Behavior (ambiguity) behavior+=Behavior
+	 */
+	protected void emit_MachineBlock_BehaviorKeyword_10_0_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@composite:' | '@machine:'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     instance+=InstanceMachine '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     instance+=InstanceMachine '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     instance+=InstanceMachine ('@model:' | '@prototype:' | '@instance:')* (ambiguity) instance+=InstanceMachine
+	 *     instance+=InstanceMachine ('@model:' | '@prototype:' | '@instance:')* (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock ('@model:' | '@prototype:' | '@instance:')* (ambiguity) instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock ('@model:' | '@prototype:' | '@instance:')* (ambiguity) machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     procedure+=Procedure '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     procedure+=Procedure '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     procedure+=Procedure ('@model:' | '@prototype:' | '@instance:')* (ambiguity) instance+=InstanceMachine
+	 *     procedure+=Procedure ('@model:' | '@prototype:' | '@instance:')* (ambiguity) machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     routine+=Routine '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     routine+=Routine '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     routine+=Routine ('@model:' | '@prototype:' | '@instance:')* (ambiguity) instance+=InstanceMachine
+	 *     routine+=Routine ('@model:' | '@prototype:' | '@instance:')* (ambiguity) machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_MachineBlock_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@routine:' | '@macro:'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     procedure+=Procedure (ambiguity) routine+=Routine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 */
+	protected void emit_MachineBlock_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@model:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         ('@property:' | '@public:' | '@protected:' | '@private:')* 
+	 *         (ambiguity) 
+	 *         (('@prototype:' | '@instance:')? (ambiguity))* 
+	 *         ('@composite:' | '@machine:') 
+	 *         instance+=InstanceMachine
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         ('@property:' | '@public:' | '@protected:' | '@private:')* 
+	 *         (ambiguity) 
+	 *         (('@prototype:' | '@instance:')? (ambiguity))* 
+	 *         ('@composite:' | '@machine:') 
+	 *         machine+=AnyMachineBlock
+	 *     )
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     instance+=InstanceMachine (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     instance+=InstanceMachine (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     procedure+=Procedure (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     procedure+=Procedure (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     routine+=Routine (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     routine+=Routine (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 */
+	protected void emit_MachineBlock_ModelKeyword_9_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@procedure:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     procedure+=Procedure (ambiguity) procedure+=Procedure
+	 */
+	protected void emit_MachineBlock_ProcedureKeyword_8_0_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@prototype:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 */
+	protected void emit_MachineBlock_PrototypeKeyword_9_2_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@statemachine:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     behavior+=Statemachine (ambiguity) behavior+=Statemachine
+	 */
+	protected void emit_MachineBlock_StatemachineKeyword_10_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@model:' | '@prototype:' | '@instance:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) '@behavior:' behavior+=Behavior
+	 *     instance+=InstanceMachine (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     instance+=InstanceMachine (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     instance+=InstanceMachine (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     instance+=InstanceMachine (ambiguity) main=MoeBehavior
+	 *     machine+=AnyMachineBlock (ambiguity) '@behavior:' behavior+=Behavior
+	 *     machine+=AnyMachineBlock (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     machine+=AnyMachineBlock (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) main=MoeBehavior
+	 *     procedure+=Procedure (ambiguity) '@behavior:' behavior+=Behavior
+	 *     procedure+=Procedure (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     procedure+=Procedure (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     procedure+=Procedure (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     procedure+=Procedure (ambiguity) main=MoeBehavior
+	 *     routine+=Routine (ambiguity) '@behavior:' behavior+=Behavior
+	 *     routine+=Routine (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     routine+=Routine (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     routine+=Routine (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     routine+=Routine (ambiguity) main=MoeBehavior
+	 */
+	protected void emit_MachineBlock___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('<' 'moc:'? ('and' | 'or') '>')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'machine' (ambiguity) name=ESIdentifier
+	 *     design=DesignKind 'machine' (ambiguity) name=ESIdentifier
+	 *     input_enabled?='input_enabled' 'machine' (ambiguity) name=ESIdentifier
+	 *     timed?='timed' 'machine' (ambiguity) name=ESIdentifier
+	 *     visibility=VisibilityKind 'machine' (ambiguity) name=ESIdentifier
+	 */
+	protected void emit_MachineBlock___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@routine:' | '@macro:')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     routine+=Routine (ambiguity) routine+=Routine
+	 */
+	protected void emit_MachineBlock___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:'))?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) instance+=InstanceMachine
+	 *     instance+=InstanceMachine (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_MachineBlock___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@property:' | '@public:' | '@protected:' | '@private:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     buffer+=Buffer (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=Buffer (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer (ambiguity) procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) routine+=Routine
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     buffer+=BufferPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferPrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferPrivate (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferPrivate (ambiguity) routine+=Routine
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     buffer+=BufferProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferProtected (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferProtected (ambiguity) routine+=Routine
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     buffer+=BufferPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferPublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferPublic (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferPublic (ambiguity) routine+=Routine
+	 *     channel+=Channel (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     channel+=Channel (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=Channel (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     channel+=Channel (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel (ambiguity) procedure+=Procedure
+	 *     channel+=Channel (ambiguity) routine+=Routine
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     channel+=ChannelPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelPrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelPrivate (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelPrivate (ambiguity) routine+=Routine
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     channel+=ChannelProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelProtected (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelProtected (ambiguity) routine+=Routine
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     channel+=ChannelPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelPublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelPublic (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelPublic (ambiguity) routine+=Routine
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     name=ESIdentifier '{' (ambiguity) '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier '{' (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     name=ESIdentifier '{' (ambiguity) procedure+=Procedure
+	 *     name=ESIdentifier '{' (ambiguity) routine+=Routine
+	 *     port+=Port (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     port+=Port (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=Port (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     port+=Port (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port (ambiguity) procedure+=Procedure
+	 *     port+=Port (ambiguity) routine+=Routine
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     port+=PortPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortPrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortPrivate (ambiguity) procedure+=Procedure
+	 *     port+=PortPrivate (ambiguity) routine+=Routine
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     port+=PortProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortProtected (ambiguity) procedure+=Procedure
+	 *     port+=PortProtected (ambiguity) routine+=Routine
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     port+=PortPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortPublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortPublic (ambiguity) procedure+=Procedure
+	 *     port+=PortPublic (ambiguity) routine+=Routine
+	 *     property+=Variable (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     property+=Variable (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=Variable (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     property+=Variable (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable (ambiguity) procedure+=Procedure
+	 *     property+=Variable (ambiguity) routine+=Routine
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     property+=VariablePrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariablePrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariablePrivate (ambiguity) procedure+=Procedure
+	 *     property+=VariablePrivate (ambiguity) routine+=Routine
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     property+=VariableProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariableProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariableProtected (ambiguity) procedure+=Procedure
+	 *     property+=VariableProtected (ambiguity) routine+=Routine
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     property+=VariablePublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariablePublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariablePublic (ambiguity) procedure+=Procedure
+	 *     property+=VariablePublic (ambiguity) routine+=Routine
+	 *     signal+=Signal (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     signal+=Signal (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=Signal (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     signal+=Signal (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal (ambiguity) procedure+=Procedure
+	 *     signal+=Signal (ambiguity) routine+=Routine
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     signal+=SignalPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalPrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalPrivate (ambiguity) procedure+=Procedure
+	 *     signal+=SignalPrivate (ambiguity) routine+=Routine
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     signal+=SignalProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalProtected (ambiguity) procedure+=Procedure
+	 *     signal+=SignalProtected (ambiguity) routine+=Routine
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     signal+=SignalPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalPublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalPublic (ambiguity) procedure+=Procedure
+	 *     signal+=SignalPublic (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     typedef+=TypeDefinition (ambiguity) '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@procedure:' procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) routine+=Routine
+	 */
+	protected void emit_MachineBlock___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@model:' | '@instance:')* '@prototype:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@model:' | '@instance:')* '@prototype:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 *     procedure+=Procedure (ambiguity) machine+=AnyMachineBlock
+	 *     routine+=Routine (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@instance:' | '@model:')? '@prototype:'?)*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 */
+	protected void emit_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@model:' | '@prototype:' | '@instance:')* ('@composite:' | '@machine:'))?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) instance+=InstanceMachine
+	 *     instance+=InstanceMachine (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_MachineBlock_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@prototype:' | '@instance:')* '@model:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@prototype:' | '@instance:')* '@model:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 *     procedure+=Procedure (ambiguity) machine+=AnyMachineBlock
+	 *     routine+=Routine (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@prototype:' | '@instance:')? '@model:'?)*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     instance+=InstanceMachine '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     instance+=InstanceMachine '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     procedure+=Procedure '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     procedure+=Procedure '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     routine+=Routine '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     routine+=Routine '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 */
+	protected void emit_MachineBlock_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@model:' | '@prototype:')* '@instance:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) instance+=InstanceMachine
+	 */
+	protected void emit_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@model:' | '@prototype:')* '@instance:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock (ambiguity) instance+=InstanceMachine
+	 *     procedure+=Procedure (ambiguity) instance+=InstanceMachine
+	 *     routine+=Routine (ambiguity) instance+=InstanceMachine
+	 */
+	protected void emit_MachineBlock_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@protected:' | '@private:')* '@public:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferPublic (ambiguity) port+=PortPublic
+	 *     buffer+=BufferPublic (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelPublic (ambiguity) port+=PortPublic
+	 *     channel+=ChannelPublic (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferPublic
+	 *     port+=PortPublic (ambiguity) channel+=ChannelPublic
+	 *     port+=PortPublic (ambiguity) port+=PortPublic
+	 *     port+=PortPublic (ambiguity) property+=VariablePublic
+	 *     port+=PortPublic (ambiguity) signal+=SignalPublic
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferPublic
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelPublic
+	 *     property+=VariablePublic (ambiguity) port+=PortPublic
+	 *     property+=VariablePublic (ambiguity) property+=VariablePublic
+	 *     property+=VariablePublic (ambiguity) signal+=SignalPublic
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalPublic (ambiguity) port+=PortPublic
+	 *     signal+=SignalPublic (ambiguity) property+=VariablePublic
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@protected:' | '@private:')* '@public:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferPublic
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelPublic
+	 *     buffer+=Buffer (ambiguity) port+=PortPublic
+	 *     buffer+=Buffer (ambiguity) property+=VariablePublic
+	 *     buffer+=Buffer (ambiguity) signal+=SignalPublic
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortPublic
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferProtected (ambiguity) port+=PortPublic
+	 *     buffer+=BufferProtected (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferPublic
+	 *     channel+=Channel (ambiguity) channel+=ChannelPublic
+	 *     channel+=Channel (ambiguity) port+=PortPublic
+	 *     channel+=Channel (ambiguity) property+=VariablePublic
+	 *     channel+=Channel (ambiguity) signal+=SignalPublic
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortPublic
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelProtected (ambiguity) port+=PortPublic
+	 *     channel+=ChannelProtected (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) buffer+=BufferPublic
+	 *     name=ESIdentifier '{' (ambiguity) channel+=ChannelPublic
+	 *     name=ESIdentifier '{' (ambiguity) port+=PortPublic
+	 *     name=ESIdentifier '{' (ambiguity) property+=VariablePublic
+	 *     name=ESIdentifier '{' (ambiguity) signal+=SignalPublic
+	 *     name=ESIdentifier '{' (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferPublic
+	 *     port+=Port (ambiguity) channel+=ChannelPublic
+	 *     port+=Port (ambiguity) port+=PortPublic
+	 *     port+=Port (ambiguity) property+=VariablePublic
+	 *     port+=Port (ambiguity) signal+=SignalPublic
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferPublic
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelPublic
+	 *     port+=PortPrivate (ambiguity) port+=PortPublic
+	 *     port+=PortPrivate (ambiguity) property+=VariablePublic
+	 *     port+=PortPrivate (ambiguity) signal+=SignalPublic
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferPublic
+	 *     port+=PortProtected (ambiguity) channel+=ChannelPublic
+	 *     port+=PortProtected (ambiguity) port+=PortPublic
+	 *     port+=PortProtected (ambiguity) property+=VariablePublic
+	 *     port+=PortProtected (ambiguity) signal+=SignalPublic
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferPublic
+	 *     property+=Variable (ambiguity) channel+=ChannelPublic
+	 *     property+=Variable (ambiguity) port+=PortPublic
+	 *     property+=Variable (ambiguity) property+=VariablePublic
+	 *     property+=Variable (ambiguity) signal+=SignalPublic
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferPublic
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelPublic
+	 *     property+=VariablePrivate (ambiguity) port+=PortPublic
+	 *     property+=VariablePrivate (ambiguity) property+=VariablePublic
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalPublic
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferPublic
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelPublic
+	 *     property+=VariableProtected (ambiguity) port+=PortPublic
+	 *     property+=VariableProtected (ambiguity) property+=VariablePublic
+	 *     property+=VariableProtected (ambiguity) signal+=SignalPublic
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferPublic
+	 *     signal+=Signal (ambiguity) channel+=ChannelPublic
+	 *     signal+=Signal (ambiguity) port+=PortPublic
+	 *     signal+=Signal (ambiguity) property+=VariablePublic
+	 *     signal+=Signal (ambiguity) signal+=SignalPublic
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalPrivate (ambiguity) port+=PortPublic
+	 *     signal+=SignalPrivate (ambiguity) property+=VariablePublic
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalProtected (ambiguity) port+=PortPublic
+	 *     signal+=SignalProtected (ambiguity) property+=VariablePublic
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) buffer+=BufferPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) channel+=ChannelPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) port+=PortPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) property+=VariablePublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) signal+=SignalPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@private:')* '@protected:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferProtected (ambiguity) port+=PortProtected
+	 *     buffer+=BufferProtected (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelProtected (ambiguity) port+=PortProtected
+	 *     channel+=ChannelProtected (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferProtected
+	 *     port+=PortProtected (ambiguity) channel+=ChannelProtected
+	 *     port+=PortProtected (ambiguity) port+=PortProtected
+	 *     port+=PortProtected (ambiguity) property+=VariableProtected
+	 *     port+=PortProtected (ambiguity) signal+=SignalProtected
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferProtected
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelProtected
+	 *     property+=VariableProtected (ambiguity) port+=PortProtected
+	 *     property+=VariableProtected (ambiguity) property+=VariableProtected
+	 *     property+=VariableProtected (ambiguity) signal+=SignalProtected
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalProtected (ambiguity) port+=PortProtected
+	 *     signal+=SignalProtected (ambiguity) property+=VariableProtected
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@private:')* '@protected:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferProtected
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelProtected
+	 *     buffer+=Buffer (ambiguity) port+=PortProtected
+	 *     buffer+=Buffer (ambiguity) property+=VariableProtected
+	 *     buffer+=Buffer (ambiguity) signal+=SignalProtected
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortProtected
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferPublic (ambiguity) port+=PortProtected
+	 *     buffer+=BufferPublic (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferProtected
+	 *     channel+=Channel (ambiguity) channel+=ChannelProtected
+	 *     channel+=Channel (ambiguity) port+=PortProtected
+	 *     channel+=Channel (ambiguity) property+=VariableProtected
+	 *     channel+=Channel (ambiguity) signal+=SignalProtected
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortProtected
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelPublic (ambiguity) port+=PortProtected
+	 *     channel+=ChannelPublic (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) buffer+=BufferProtected
+	 *     name=ESIdentifier '{' (ambiguity) channel+=ChannelProtected
+	 *     name=ESIdentifier '{' (ambiguity) port+=PortProtected
+	 *     name=ESIdentifier '{' (ambiguity) property+=VariableProtected
+	 *     name=ESIdentifier '{' (ambiguity) signal+=SignalProtected
+	 *     name=ESIdentifier '{' (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferProtected
+	 *     port+=Port (ambiguity) channel+=ChannelProtected
+	 *     port+=Port (ambiguity) port+=PortProtected
+	 *     port+=Port (ambiguity) property+=VariableProtected
+	 *     port+=Port (ambiguity) signal+=SignalProtected
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferProtected
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelProtected
+	 *     port+=PortPrivate (ambiguity) port+=PortProtected
+	 *     port+=PortPrivate (ambiguity) property+=VariableProtected
+	 *     port+=PortPrivate (ambiguity) signal+=SignalProtected
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferProtected
+	 *     port+=PortPublic (ambiguity) channel+=ChannelProtected
+	 *     port+=PortPublic (ambiguity) port+=PortProtected
+	 *     port+=PortPublic (ambiguity) property+=VariableProtected
+	 *     port+=PortPublic (ambiguity) signal+=SignalProtected
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferProtected
+	 *     property+=Variable (ambiguity) channel+=ChannelProtected
+	 *     property+=Variable (ambiguity) port+=PortProtected
+	 *     property+=Variable (ambiguity) property+=VariableProtected
+	 *     property+=Variable (ambiguity) signal+=SignalProtected
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferProtected
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelProtected
+	 *     property+=VariablePrivate (ambiguity) port+=PortProtected
+	 *     property+=VariablePrivate (ambiguity) property+=VariableProtected
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalProtected
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferProtected
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelProtected
+	 *     property+=VariablePublic (ambiguity) port+=PortProtected
+	 *     property+=VariablePublic (ambiguity) property+=VariableProtected
+	 *     property+=VariablePublic (ambiguity) signal+=SignalProtected
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferProtected
+	 *     signal+=Signal (ambiguity) channel+=ChannelProtected
+	 *     signal+=Signal (ambiguity) port+=PortProtected
+	 *     signal+=Signal (ambiguity) property+=VariableProtected
+	 *     signal+=Signal (ambiguity) signal+=SignalProtected
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalPrivate (ambiguity) port+=PortProtected
+	 *     signal+=SignalPrivate (ambiguity) property+=VariableProtected
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalPublic (ambiguity) port+=PortProtected
+	 *     signal+=SignalPublic (ambiguity) property+=VariableProtected
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) buffer+=BufferProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) channel+=ChannelProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) port+=PortProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) property+=VariableProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) signal+=SignalProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_MachineBlock_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@public:' | '@protected:' | '@private:')* '@property:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=Buffer
+	 *     buffer+=Buffer (ambiguity) channel+=Channel
+	 *     buffer+=Buffer (ambiguity) port+=Port
+	 *     buffer+=Buffer (ambiguity) property+=Variable
+	 *     buffer+=Buffer (ambiguity) signal+=Signal
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=Buffer
+	 *     channel+=Channel (ambiguity) channel+=Channel
+	 *     channel+=Channel (ambiguity) port+=Port
+	 *     channel+=Channel (ambiguity) property+=Variable
+	 *     channel+=Channel (ambiguity) signal+=Signal
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=Buffer
+	 *     port+=Port (ambiguity) channel+=Channel
+	 *     port+=Port (ambiguity) port+=Port
+	 *     port+=Port (ambiguity) property+=Variable
+	 *     port+=Port (ambiguity) signal+=Signal
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=Buffer
+	 *     property+=Variable (ambiguity) channel+=Channel
+	 *     property+=Variable (ambiguity) port+=Port
+	 *     property+=Variable (ambiguity) property+=Variable
+	 *     property+=Variable (ambiguity) signal+=Signal
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=Buffer
+	 *     signal+=Signal (ambiguity) channel+=Channel
+	 *     signal+=Signal (ambiguity) port+=Port
+	 *     signal+=Signal (ambiguity) property+=Variable
+	 *     signal+=Signal (ambiguity) signal+=Signal
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@public:' | '@protected:' | '@private:')* '@property:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=Buffer
+	 *     buffer+=Buffer (ambiguity) channel+=Channel
+	 *     buffer+=Buffer (ambiguity) port+=Port
+	 *     buffer+=Buffer (ambiguity) property+=Variable
+	 *     buffer+=Buffer (ambiguity) signal+=Signal
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferPrivate (ambiguity) channel+=Channel
+	 *     buffer+=BufferPrivate (ambiguity) port+=Port
+	 *     buffer+=BufferPrivate (ambiguity) property+=Variable
+	 *     buffer+=BufferPrivate (ambiguity) signal+=Signal
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferProtected (ambiguity) channel+=Channel
+	 *     buffer+=BufferProtected (ambiguity) port+=Port
+	 *     buffer+=BufferProtected (ambiguity) property+=Variable
+	 *     buffer+=BufferProtected (ambiguity) signal+=Signal
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferPublic (ambiguity) channel+=Channel
+	 *     buffer+=BufferPublic (ambiguity) port+=Port
+	 *     buffer+=BufferPublic (ambiguity) property+=Variable
+	 *     buffer+=BufferPublic (ambiguity) signal+=Signal
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=Buffer
+	 *     channel+=Channel (ambiguity) channel+=Channel
+	 *     channel+=Channel (ambiguity) port+=Port
+	 *     channel+=Channel (ambiguity) property+=Variable
+	 *     channel+=Channel (ambiguity) signal+=Signal
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelPrivate (ambiguity) channel+=Channel
+	 *     channel+=ChannelPrivate (ambiguity) port+=Port
+	 *     channel+=ChannelPrivate (ambiguity) property+=Variable
+	 *     channel+=ChannelPrivate (ambiguity) signal+=Signal
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelProtected (ambiguity) channel+=Channel
+	 *     channel+=ChannelProtected (ambiguity) port+=Port
+	 *     channel+=ChannelProtected (ambiguity) property+=Variable
+	 *     channel+=ChannelProtected (ambiguity) signal+=Signal
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelPublic (ambiguity) channel+=Channel
+	 *     channel+=ChannelPublic (ambiguity) port+=Port
+	 *     channel+=ChannelPublic (ambiguity) property+=Variable
+	 *     channel+=ChannelPublic (ambiguity) signal+=Signal
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) buffer+=Buffer
+	 *     name=ESIdentifier '{' (ambiguity) channel+=Channel
+	 *     name=ESIdentifier '{' (ambiguity) port+=Port
+	 *     name=ESIdentifier '{' (ambiguity) property+=Variable
+	 *     name=ESIdentifier '{' (ambiguity) signal+=Signal
+	 *     name=ESIdentifier '{' (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=Buffer
+	 *     port+=Port (ambiguity) channel+=Channel
+	 *     port+=Port (ambiguity) port+=Port
+	 *     port+=Port (ambiguity) property+=Variable
+	 *     port+=Port (ambiguity) signal+=Signal
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=Buffer
+	 *     port+=PortPrivate (ambiguity) channel+=Channel
+	 *     port+=PortPrivate (ambiguity) port+=Port
+	 *     port+=PortPrivate (ambiguity) property+=Variable
+	 *     port+=PortPrivate (ambiguity) signal+=Signal
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=Buffer
+	 *     port+=PortProtected (ambiguity) channel+=Channel
+	 *     port+=PortProtected (ambiguity) port+=Port
+	 *     port+=PortProtected (ambiguity) property+=Variable
+	 *     port+=PortProtected (ambiguity) signal+=Signal
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=Buffer
+	 *     port+=PortPublic (ambiguity) channel+=Channel
+	 *     port+=PortPublic (ambiguity) port+=Port
+	 *     port+=PortPublic (ambiguity) property+=Variable
+	 *     port+=PortPublic (ambiguity) signal+=Signal
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=Buffer
+	 *     property+=Variable (ambiguity) channel+=Channel
+	 *     property+=Variable (ambiguity) port+=Port
+	 *     property+=Variable (ambiguity) property+=Variable
+	 *     property+=Variable (ambiguity) signal+=Signal
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=Buffer
+	 *     property+=VariablePrivate (ambiguity) channel+=Channel
+	 *     property+=VariablePrivate (ambiguity) port+=Port
+	 *     property+=VariablePrivate (ambiguity) property+=Variable
+	 *     property+=VariablePrivate (ambiguity) signal+=Signal
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=Buffer
+	 *     property+=VariableProtected (ambiguity) channel+=Channel
+	 *     property+=VariableProtected (ambiguity) port+=Port
+	 *     property+=VariableProtected (ambiguity) property+=Variable
+	 *     property+=VariableProtected (ambiguity) signal+=Signal
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=Buffer
+	 *     property+=VariablePublic (ambiguity) channel+=Channel
+	 *     property+=VariablePublic (ambiguity) port+=Port
+	 *     property+=VariablePublic (ambiguity) property+=Variable
+	 *     property+=VariablePublic (ambiguity) signal+=Signal
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=Buffer
+	 *     signal+=Signal (ambiguity) channel+=Channel
+	 *     signal+=Signal (ambiguity) port+=Port
+	 *     signal+=Signal (ambiguity) property+=Variable
+	 *     signal+=Signal (ambiguity) signal+=Signal
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=Buffer
+	 *     signal+=SignalPrivate (ambiguity) channel+=Channel
+	 *     signal+=SignalPrivate (ambiguity) port+=Port
+	 *     signal+=SignalPrivate (ambiguity) property+=Variable
+	 *     signal+=SignalPrivate (ambiguity) signal+=Signal
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=Buffer
+	 *     signal+=SignalProtected (ambiguity) channel+=Channel
+	 *     signal+=SignalProtected (ambiguity) port+=Port
+	 *     signal+=SignalProtected (ambiguity) property+=Variable
+	 *     signal+=SignalProtected (ambiguity) signal+=Signal
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=Buffer
+	 *     signal+=SignalPublic (ambiguity) channel+=Channel
+	 *     signal+=SignalPublic (ambiguity) port+=Port
+	 *     signal+=SignalPublic (ambiguity) property+=Variable
+	 *     signal+=SignalPublic (ambiguity) signal+=Signal
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) buffer+=Buffer
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) channel+=Channel
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) port+=Port
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) property+=Variable
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) signal+=Signal
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_MachineBlock_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@protected:')* '@private:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortPrivate (ambiguity) port+=PortPrivate
+	 *     port+=PortPrivate (ambiguity) property+=VariablePrivate
+	 *     port+=PortPrivate (ambiguity) signal+=SignalPrivate
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariablePrivate (ambiguity) port+=PortPrivate
+	 *     property+=VariablePrivate (ambiguity) property+=VariablePrivate
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalPrivate
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalPrivate (ambiguity) port+=PortPrivate
+	 *     signal+=SignalPrivate (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@protected:')* '@private:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=Buffer (ambiguity) port+=PortPrivate
+	 *     buffer+=Buffer (ambiguity) property+=VariablePrivate
+	 *     buffer+=Buffer (ambiguity) signal+=SignalPrivate
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferProtected (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferProtected (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferPublic (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferPublic (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferPrivate
+	 *     channel+=Channel (ambiguity) channel+=ChannelPrivate
+	 *     channel+=Channel (ambiguity) port+=PortPrivate
+	 *     channel+=Channel (ambiguity) property+=VariablePrivate
+	 *     channel+=Channel (ambiguity) signal+=SignalPrivate
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelProtected (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelProtected (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelPublic (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelPublic (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) buffer+=BufferPrivate
+	 *     name=ESIdentifier '{' (ambiguity) channel+=ChannelPrivate
+	 *     name=ESIdentifier '{' (ambiguity) port+=PortPrivate
+	 *     name=ESIdentifier '{' (ambiguity) property+=VariablePrivate
+	 *     name=ESIdentifier '{' (ambiguity) signal+=SignalPrivate
+	 *     name=ESIdentifier '{' (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferPrivate
+	 *     port+=Port (ambiguity) channel+=ChannelPrivate
+	 *     port+=Port (ambiguity) port+=PortPrivate
+	 *     port+=Port (ambiguity) property+=VariablePrivate
+	 *     port+=Port (ambiguity) signal+=SignalPrivate
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortProtected (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortProtected (ambiguity) port+=PortPrivate
+	 *     port+=PortProtected (ambiguity) property+=VariablePrivate
+	 *     port+=PortProtected (ambiguity) signal+=SignalPrivate
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortPublic (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortPublic (ambiguity) port+=PortPrivate
+	 *     port+=PortPublic (ambiguity) property+=VariablePrivate
+	 *     port+=PortPublic (ambiguity) signal+=SignalPrivate
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferPrivate
+	 *     property+=Variable (ambiguity) channel+=ChannelPrivate
+	 *     property+=Variable (ambiguity) port+=PortPrivate
+	 *     property+=Variable (ambiguity) property+=VariablePrivate
+	 *     property+=Variable (ambiguity) signal+=SignalPrivate
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariableProtected (ambiguity) port+=PortPrivate
+	 *     property+=VariableProtected (ambiguity) property+=VariablePrivate
+	 *     property+=VariableProtected (ambiguity) signal+=SignalPrivate
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariablePublic (ambiguity) port+=PortPrivate
+	 *     property+=VariablePublic (ambiguity) property+=VariablePrivate
+	 *     property+=VariablePublic (ambiguity) signal+=SignalPrivate
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferPrivate
+	 *     signal+=Signal (ambiguity) channel+=ChannelPrivate
+	 *     signal+=Signal (ambiguity) port+=PortPrivate
+	 *     signal+=Signal (ambiguity) property+=VariablePrivate
+	 *     signal+=Signal (ambiguity) signal+=SignalPrivate
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalProtected (ambiguity) port+=PortPrivate
+	 *     signal+=SignalProtected (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalPublic (ambiguity) port+=PortPrivate
+	 *     signal+=SignalPublic (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) buffer+=BufferPrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) channel+=ChannelPrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) port+=PortPrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) property+=VariablePrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) signal+=SignalPrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_MachineBlock_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@local:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) (rule start)
+	 *     (rule start) (ambiguity) execution=ModelOfExecution
+	 *     (rule start) (ambiguity) interaction=ModelOfInteraction
+	 */
+	protected void emit_MoeBehavior_LocalKeyword_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ':' | '=>' | '<-'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=XLIA_ID (ambiguity) expression=Expression
+	 */
+	protected void emit_NamedExpression_ColonKeyword_1_0_or_EqualsSignGreaterThanSignKeyword_1_1_or_LessThanSignHyphenMinusKeyword_1_2(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'moc:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) ('state' | 'pseudostate') '<' (ambiguity) kind=PseudostateKind
+	 */
+	protected void emit_OtherPseudostate_MocKeyword_3_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'state' | 'pseudostate'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '<' 'moc:'? kind=PseudostateKind
+	 */
+	protected void emit_OtherPseudostate_PseudostateKeyword_1_1_or_StateKeyword_1_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('{' '}') | ';'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ESIdentifier (ambiguity) (rule end)
+	 *     unrestrictedName=UnrestrictedName (ambiguity) (rule end)
+	 */
+	protected void emit_OtherPseudostate_SemicolonKeyword_8_1_or___LeftCurlyBracketKeyword_8_0_0_RightCurlyBracketKeyword_8_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'via' | '==>'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     port=[NamedElement|ESUfid] (ambiguity) route=[Channel|ESUfid]
+	 *     rigthValue+=Expression ')' (ambiguity) route=[Channel|ESUfid]
+	 *     route=[Channel|ESUfid] (ambiguity) route=[Channel|ESUfid]
+	 *     target=ExpressionAsMachine (ambiguity) route=[Channel|ESUfid]
+	 */
+	protected void emit_OutputComStatement_EqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0_or_ViaKeyword_3_1_0_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'boolean' | 'bool'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) (rule start)
+	 */
+	protected void emit_PrimitiveBooleanType_BoolKeyword_1_1_or_BooleanKeyword_1_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'float' | 'ufloat' | 'double' | 'udouble'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) ':' size=EInt
+	 *     (rule start) (ambiguity) '<' 'size:'? size=EInt
+	 *     (rule start) (ambiguity) (rule start)
+	 *     sign=PrimitiveNumberSign (ambiguity) ':' size=EInt
+	 *     sign=PrimitiveNumberSign (ambiguity) '<' 'size:'? size=EInt
+	 *     sign=PrimitiveNumberSign (ambiguity) (rule end)
+	 */
+	protected void emit_PrimitiveFloatType_DoubleKeyword_2_2_or_FloatKeyword_2_0_or_UdoubleKeyword_2_3_or_UfloatKeyword_2_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'size:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) ('float' | 'ufloat' | 'double' | 'udouble') '<' (ambiguity) size=EInt
+	 *     sign=PrimitiveNumberSign ('float' | 'ufloat' | 'double' | 'udouble') '<' (ambiguity) size=EInt
+	 */
+	protected void emit_PrimitiveFloatType_SizeKeyword_3_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'integer' | 'uinteger' | 'int' | 'uint'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) ':' size=EInt
+	 *     (rule start) (ambiguity) '<' 'size:'? size=EInt
+	 *     (rule start) (ambiguity) (rule start)
+	 *     sign=PrimitiveNumberSign (ambiguity) ':' size=EInt
+	 *     sign=PrimitiveNumberSign (ambiguity) '<' 'size:'? size=EInt
+	 *     sign=PrimitiveNumberSign (ambiguity) (rule end)
+	 */
+	protected void emit_PrimitiveIntegerType_IntKeyword_2_2_or_IntegerKeyword_2_0_or_UintKeyword_2_3_or_UintegerKeyword_2_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'size:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) ('integer' | 'uinteger' | 'int' | 'uint') '<' (ambiguity) size=EInt
+	 *     sign=PrimitiveNumberSign ('integer' | 'uinteger' | 'int' | 'uint') '<' (ambiguity) size=EInt
+	 */
+	protected void emit_PrimitiveIntegerType_SizeKeyword_3_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'rational' | 'urational' | 'rat' | 'urat'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) ':' size=EInt
+	 *     (rule start) (ambiguity) '<' 'size:'? size=EInt
+	 *     (rule start) (ambiguity) (rule start)
+	 *     sign=PrimitiveNumberSign (ambiguity) ':' size=EInt
+	 *     sign=PrimitiveNumberSign (ambiguity) '<' 'size:'? size=EInt
+	 *     sign=PrimitiveNumberSign (ambiguity) (rule end)
+	 */
+	protected void emit_PrimitiveRationalType_RatKeyword_2_2_or_RationalKeyword_2_0_or_UratKeyword_2_3_or_UrationalKeyword_2_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'size:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) ('rational' | 'urational' | 'rat' | 'urat') '<' (ambiguity) size=EInt
+	 *     sign=PrimitiveNumberSign ('rational' | 'urational' | 'rat' | 'urat') '<' (ambiguity) size=EInt
+	 */
+	protected void emit_PrimitiveRationalType_SizeKeyword_3_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'real' | 'ureal'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) ':' size=EInt
+	 *     (rule start) (ambiguity) '<' 'size:'? size=EInt
+	 *     (rule start) (ambiguity) (rule start)
+	 *     sign=PrimitiveNumberSign (ambiguity) ':' size=EInt
+	 *     sign=PrimitiveNumberSign (ambiguity) '<' 'size:'? size=EInt
+	 *     sign=PrimitiveNumberSign (ambiguity) (rule end)
+	 */
+	protected void emit_PrimitiveRealType_RealKeyword_2_0_or_UrealKeyword_2_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'size:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) ('real' | 'ureal') '<' (ambiguity) size=EInt
+	 *     sign=PrimitiveNumberSign ('real' | 'ureal') '<' (ambiguity) size=EInt
+	 */
+	protected void emit_PrimitiveRealType_SizeKeyword_3_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'size:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'string' '<' (ambiguity) size=EInt
+	 */
+	protected void emit_PrimitiveStringType_SizeKeyword_2_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@moe:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '@run' runRoutine=moeRoutine
+	 *     (rule start) (ambiguity) '@schedule' scheduleRoutine=moeRoutine
+	 *     (rule start) (ambiguity) (rule start)
+	 */
+	protected void emit_ProcedureExecution_MoeKeyword_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@routine:' | '@macro:'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         (ambiguity) 
+	 *         routine+=Routine
+	 *     )
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     procedure+=Procedure (ambiguity) routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 */
+	protected void emit_Procedure_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@parameter:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         name=ESIdentifier 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         channel+=ChannelPublic
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         property+=VariablePublic
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         port+=PortProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         buffer+=BufferPrivate
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         channel+=ChannelPrivate
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         signal+=SignalPrivate
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@procedure:' 
+	 *         procedure+=Procedure
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         buffer+=BufferPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         channel+=ChannelPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         port+=PortPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         property+=VariablePublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         signal+=SignalPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         port+=PortProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         buffer+=BufferPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         channel+=ChannelPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         port+=PortPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         signal+=SignalPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@procedure:' 
+	 *         procedure+=Procedure
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         execution=ProcedureExecution
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         region+=StatemachineRegion
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         region+=StatemachineRegionLite
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         buffer+=Buffer
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         channel+=Channel
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         property+=Variable
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         signal+=Signal
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ '{' parameter+=ParameterInput
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ parameter+=ParameterInput
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ '{' parameter+=ParameterReturn
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ parameter+=ParameterReturn
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ '{' parameter+=ParameterOutput
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ parameter+=ParameterOutput
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ '{' parameter+=ParameterInout
+	 *     name=ESIdentifier ('(' ')')? '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ parameter+=ParameterInout
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ '{' parameter+=ParameterInput
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ parameter+=ParameterInput
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ '{' parameter+=ParameterReturn
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ parameter+=ParameterReturn
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ '{' parameter+=ParameterOutput
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ parameter+=ParameterOutput
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ '{' parameter+=ParameterInout
+	 *     parameter+=FormalParameter ')' '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ parameter+=ParameterInout
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=FormalParameter '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ '{' parameter+=ParameterInput
+	 *     parameter+=FormalParameter '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ parameter+=ParameterInput
+	 *     parameter+=FormalParameter '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ '{' parameter+=ParameterReturn
+	 *     parameter+=FormalParameter '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ parameter+=ParameterReturn
+	 *     parameter+=FormalParameter '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ '{' parameter+=ParameterOutput
+	 *     parameter+=FormalParameter '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ parameter+=ParameterOutput
+	 *     parameter+=FormalParameter '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ '{' parameter+=ParameterInout
+	 *     parameter+=FormalParameter '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ parameter+=ParameterInout
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ '{' parameter+=ParameterInput
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ parameter+=ParameterInput
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ '{' parameter+=ParameterReturn
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ parameter+=ParameterReturn
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ '{' parameter+=ParameterOutput
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ parameter+=ParameterOutput
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ '{' parameter+=ParameterInout
+	 *     parameter+=FunctionalParameter ')' '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ '{' parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ '{' parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ '{' parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ '{' parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ parameter+=ParameterInout
+	 */
+	protected void emit_Procedure_ParameterKeyword_7_0_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@procedure:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     procedure+=Procedure (ambiguity) procedure+=Procedure
+	 */
+	protected void emit_Procedure_ProcedureKeyword_10_0_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@property:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         name=ESIdentifier 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         channel+=ChannelPublic
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         property+=VariablePublic
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         port+=PortProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         buffer+=BufferPrivate
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         channel+=ChannelPrivate
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         signal+=SignalPrivate
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@procedure:' 
+	 *         procedure+=Procedure
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         buffer+=BufferPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         channel+=ChannelPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         port+=PortPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         property+=VariablePublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         signal+=SignalPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         port+=PortProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         buffer+=BufferPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         channel+=ChannelPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         port+=PortPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         signal+=SignalPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@procedure:' 
+	 *         procedure+=Procedure
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         execution=ProcedureExecution
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         region+=StatemachineRegion
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         region+=StatemachineRegionLite
+	 *     )
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* execution=ProcedureExecution
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '}' (rule end)
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 */
+	protected void emit_Procedure_PropertyKeyword_9_0_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@public:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         parameter+=FormalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         property+=Variable
+	 *     )
+	 *     (
+	 *         parameter+=FunctionalParameter 
+	 *         ')' 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         buffer+=Buffer
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         channel+=Channel
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         port+=Port
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         property+=Variable
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         signal+=Signal
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         ('(' ')')? 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_PublicKeyword_9_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@input:' | '@inout:' | '@output:' | '@return:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         property+=VariablePublic
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         channel+=ChannelPrivate
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@procedure:' 
+	 *         procedure+=Procedure
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         name=ESIdentifier 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         buffer+=BufferPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         channel+=ChannelPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         port+=PortPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         property+=VariablePublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         signal+=SignalPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         port+=PortProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         buffer+=BufferPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         channel+=ChannelPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         port+=PortPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         signal+=SignalPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@procedure:' 
+	 *         procedure+=Procedure
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         execution=ProcedureExecution
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         procedure+=Procedure
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         region+=StatemachineRegion
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         region+=StatemachineRegionLite
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         buffer+=Buffer
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         channel+=Channel
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         port+=Port
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         property+=Variable
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         signal+=Signal
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         (ambiguity) 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     name=ESIdentifier (ambiguity) '-->' '(' parameter+=FormalParameter
+	 *     name=ESIdentifier (ambiguity) '-->' parameter+=FormalParameter
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:' 'inout' '{' parameter+=ParameterInout
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:' 'inout' parameter+=ParameterInout
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:' 'input' '{' parameter+=ParameterInput
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:' 'input' parameter+=ParameterInput
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:' 'output' '{' parameter+=ParameterOutput
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:' 'output' parameter+=ParameterOutput
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:' 'return' '{' parameter+=ParameterReturn
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:' 'return' parameter+=ParameterReturn
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* execution=ProcedureExecution
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? (('@inout:' | '@output:' | '@return:')* '@input:')+ '{' parameter+=ParameterInput
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? (('@inout:' | '@output:' | '@return:')* '@input:')+ parameter+=ParameterInput
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? (('@input:' | '@inout:' | '@output:')* '@return:')+ '{' parameter+=ParameterReturn
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? (('@input:' | '@inout:' | '@output:')* '@return:')+ parameter+=ParameterReturn
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? (('@input:' | '@inout:' | '@return:')* '@output:')+ '{' parameter+=ParameterOutput
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? (('@input:' | '@inout:' | '@return:')* '@output:')+ parameter+=ParameterOutput
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? (('@input:' | '@output:' | '@return:')* '@inout:')+ '{' parameter+=ParameterInout
+	 *     name=ESIdentifier (ambiguity) '{' '@parameter:'? (('@input:' | '@output:' | '@return:')* '@inout:')+ parameter+=ParameterInout
+	 *     name=ESIdentifier (ambiguity) '{' buffer+=Buffer
+	 *     name=ESIdentifier (ambiguity) '{' channel+=Channel
+	 *     name=ESIdentifier (ambiguity) '{' port+=Port
+	 *     name=ESIdentifier (ambiguity) '{' property+=Variable
+	 *     name=ESIdentifier (ambiguity) '{' signal+=Signal
+	 *     name=ESIdentifier (ambiguity) '{' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '-->' '(' parameter+=FormalParameter
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '-->' parameter+=FormalParameter
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:' 'inout' '{' parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:' 'inout' parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:' 'input' '{' parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:' 'input' parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:' 'output' '{' parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:' 'output' parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:' 'return' '{' parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:' 'return' parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '}' (rule end)
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? (('@inout:' | '@output:' | '@return:')* '@input:')+ '{' parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? (('@inout:' | '@output:' | '@return:')* '@input:')+ parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? (('@input:' | '@inout:' | '@output:')* '@return:')+ '{' parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? (('@input:' | '@inout:' | '@output:')* '@return:')+ parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? (('@input:' | '@inout:' | '@return:')* '@output:')+ '{' parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? (('@input:' | '@inout:' | '@return:')* '@output:')+ parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? (('@input:' | '@output:' | '@return:')* '@inout:')+ '{' parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' '@parameter:'? (('@input:' | '@output:' | '@return:')* '@inout:')+ parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' buffer+=Buffer
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' channel+=Channel
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' port+=Port
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' property+=Variable
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' signal+=Signal
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '{' typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure___LeftParenthesisKeyword_5_0_0_RightParenthesisKeyword_5_0_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('<' 'moc:'? ('and' | 'or') '>')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'procedure' (ambiguity) name=ESIdentifier
+	 *     visibility=VisibilityKind 'procedure' (ambiguity) name=ESIdentifier
+	 */
+	protected void emit_Procedure___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@routine:' | '@macro:')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     routine+=Routine (ambiguity) routine+=Routine
+	 */
+	protected void emit_Procedure___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@property:' | '@public:' | '@protected:' | '@private:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) '}' (rule end)
+	 *     buffer+=Buffer (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer (ambiguity) execution=ProcedureExecution
+	 *     buffer+=Buffer (ambiguity) procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) region+=StatemachineRegion
+	 *     buffer+=Buffer (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=Buffer (ambiguity) routine+=Routine
+	 *     buffer+=BufferPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferPrivate (ambiguity) '}' (rule end)
+	 *     buffer+=BufferPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferPrivate (ambiguity) execution=ProcedureExecution
+	 *     buffer+=BufferPrivate (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferPrivate (ambiguity) region+=StatemachineRegion
+	 *     buffer+=BufferPrivate (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=BufferPrivate (ambiguity) routine+=Routine
+	 *     buffer+=BufferProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferProtected (ambiguity) '}' (rule end)
+	 *     buffer+=BufferProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferProtected (ambiguity) execution=ProcedureExecution
+	 *     buffer+=BufferProtected (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferProtected (ambiguity) region+=StatemachineRegion
+	 *     buffer+=BufferProtected (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=BufferProtected (ambiguity) routine+=Routine
+	 *     buffer+=BufferPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferPublic (ambiguity) '}' (rule end)
+	 *     buffer+=BufferPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferPublic (ambiguity) execution=ProcedureExecution
+	 *     buffer+=BufferPublic (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferPublic (ambiguity) region+=StatemachineRegion
+	 *     buffer+=BufferPublic (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=BufferPublic (ambiguity) routine+=Routine
+	 *     channel+=Channel (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=Channel (ambiguity) '}' (rule end)
+	 *     channel+=Channel (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel (ambiguity) execution=ProcedureExecution
+	 *     channel+=Channel (ambiguity) procedure+=Procedure
+	 *     channel+=Channel (ambiguity) region+=StatemachineRegion
+	 *     channel+=Channel (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=Channel (ambiguity) routine+=Routine
+	 *     channel+=ChannelPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelPrivate (ambiguity) '}' (rule end)
+	 *     channel+=ChannelPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelPrivate (ambiguity) execution=ProcedureExecution
+	 *     channel+=ChannelPrivate (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelPrivate (ambiguity) region+=StatemachineRegion
+	 *     channel+=ChannelPrivate (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=ChannelPrivate (ambiguity) routine+=Routine
+	 *     channel+=ChannelProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelProtected (ambiguity) '}' (rule end)
+	 *     channel+=ChannelProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelProtected (ambiguity) execution=ProcedureExecution
+	 *     channel+=ChannelProtected (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelProtected (ambiguity) region+=StatemachineRegion
+	 *     channel+=ChannelProtected (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=ChannelProtected (ambiguity) routine+=Routine
+	 *     channel+=ChannelPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelPublic (ambiguity) '}' (rule end)
+	 *     channel+=ChannelPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelPublic (ambiguity) execution=ProcedureExecution
+	 *     channel+=ChannelPublic (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelPublic (ambiguity) region+=StatemachineRegion
+	 *     channel+=ChannelPublic (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=ChannelPublic (ambiguity) routine+=Routine
+	 *     port+=Port (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=Port (ambiguity) '}' (rule end)
+	 *     port+=Port (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port (ambiguity) execution=ProcedureExecution
+	 *     port+=Port (ambiguity) procedure+=Procedure
+	 *     port+=Port (ambiguity) region+=StatemachineRegion
+	 *     port+=Port (ambiguity) region+=StatemachineRegionLite
+	 *     port+=Port (ambiguity) routine+=Routine
+	 *     port+=PortPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortPrivate (ambiguity) '}' (rule end)
+	 *     port+=PortPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortPrivate (ambiguity) execution=ProcedureExecution
+	 *     port+=PortPrivate (ambiguity) procedure+=Procedure
+	 *     port+=PortPrivate (ambiguity) region+=StatemachineRegion
+	 *     port+=PortPrivate (ambiguity) region+=StatemachineRegionLite
+	 *     port+=PortPrivate (ambiguity) routine+=Routine
+	 *     port+=PortProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortProtected (ambiguity) '}' (rule end)
+	 *     port+=PortProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortProtected (ambiguity) execution=ProcedureExecution
+	 *     port+=PortProtected (ambiguity) procedure+=Procedure
+	 *     port+=PortProtected (ambiguity) region+=StatemachineRegion
+	 *     port+=PortProtected (ambiguity) region+=StatemachineRegionLite
+	 *     port+=PortProtected (ambiguity) routine+=Routine
+	 *     port+=PortPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortPublic (ambiguity) '}' (rule end)
+	 *     port+=PortPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortPublic (ambiguity) execution=ProcedureExecution
+	 *     port+=PortPublic (ambiguity) procedure+=Procedure
+	 *     port+=PortPublic (ambiguity) region+=StatemachineRegion
+	 *     port+=PortPublic (ambiguity) region+=StatemachineRegionLite
+	 *     port+=PortPublic (ambiguity) routine+=Routine
+	 *     property+=Variable (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=Variable (ambiguity) '}' (rule end)
+	 *     property+=Variable (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable (ambiguity) execution=ProcedureExecution
+	 *     property+=Variable (ambiguity) procedure+=Procedure
+	 *     property+=Variable (ambiguity) region+=StatemachineRegion
+	 *     property+=Variable (ambiguity) region+=StatemachineRegionLite
+	 *     property+=Variable (ambiguity) routine+=Routine
+	 *     property+=VariablePrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariablePrivate (ambiguity) '}' (rule end)
+	 *     property+=VariablePrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariablePrivate (ambiguity) execution=ProcedureExecution
+	 *     property+=VariablePrivate (ambiguity) procedure+=Procedure
+	 *     property+=VariablePrivate (ambiguity) region+=StatemachineRegion
+	 *     property+=VariablePrivate (ambiguity) region+=StatemachineRegionLite
+	 *     property+=VariablePrivate (ambiguity) routine+=Routine
+	 *     property+=VariableProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariableProtected (ambiguity) '}' (rule end)
+	 *     property+=VariableProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariableProtected (ambiguity) execution=ProcedureExecution
+	 *     property+=VariableProtected (ambiguity) procedure+=Procedure
+	 *     property+=VariableProtected (ambiguity) region+=StatemachineRegion
+	 *     property+=VariableProtected (ambiguity) region+=StatemachineRegionLite
+	 *     property+=VariableProtected (ambiguity) routine+=Routine
+	 *     property+=VariablePublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariablePublic (ambiguity) '}' (rule end)
+	 *     property+=VariablePublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariablePublic (ambiguity) execution=ProcedureExecution
+	 *     property+=VariablePublic (ambiguity) procedure+=Procedure
+	 *     property+=VariablePublic (ambiguity) region+=StatemachineRegion
+	 *     property+=VariablePublic (ambiguity) region+=StatemachineRegionLite
+	 *     property+=VariablePublic (ambiguity) routine+=Routine
+	 *     signal+=Signal (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=Signal (ambiguity) '}' (rule end)
+	 *     signal+=Signal (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal (ambiguity) execution=ProcedureExecution
+	 *     signal+=Signal (ambiguity) procedure+=Procedure
+	 *     signal+=Signal (ambiguity) region+=StatemachineRegion
+	 *     signal+=Signal (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=Signal (ambiguity) routine+=Routine
+	 *     signal+=SignalPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalPrivate (ambiguity) '}' (rule end)
+	 *     signal+=SignalPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalPrivate (ambiguity) execution=ProcedureExecution
+	 *     signal+=SignalPrivate (ambiguity) procedure+=Procedure
+	 *     signal+=SignalPrivate (ambiguity) region+=StatemachineRegion
+	 *     signal+=SignalPrivate (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=SignalPrivate (ambiguity) routine+=Routine
+	 *     signal+=SignalProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalProtected (ambiguity) '}' (rule end)
+	 *     signal+=SignalProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalProtected (ambiguity) execution=ProcedureExecution
+	 *     signal+=SignalProtected (ambiguity) procedure+=Procedure
+	 *     signal+=SignalProtected (ambiguity) region+=StatemachineRegion
+	 *     signal+=SignalProtected (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=SignalProtected (ambiguity) routine+=Routine
+	 *     signal+=SignalPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalPublic (ambiguity) '}' (rule end)
+	 *     signal+=SignalPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalPublic (ambiguity) execution=ProcedureExecution
+	 *     signal+=SignalPublic (ambiguity) procedure+=Procedure
+	 *     signal+=SignalPublic (ambiguity) region+=StatemachineRegion
+	 *     signal+=SignalPublic (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=SignalPublic (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) '}' (rule end)
+	 *     typedef+=TypeDefinition (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) execution=ProcedureExecution
+	 *     typedef+=TypeDefinition (ambiguity) procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) region+=StatemachineRegion
+	 *     typedef+=TypeDefinition (ambiguity) region+=StatemachineRegionLite
+	 *     typedef+=TypeDefinition (ambiguity) routine+=Routine
+	 */
+	protected void emit_Procedure___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'input' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInput
+	 */
+	protected void emit_Procedure___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'inout' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInout
+	 */
+	protected void emit_Procedure___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'output' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterOutput
+	 */
+	protected void emit_Procedure___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'return' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterReturn
+	 */
+	protected void emit_Procedure___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' (('@inout:' | '@output:' | '@return:')* '@input:')* '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInput
+	 */
+	protected void emit_Procedure___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' (('@input:' | '@output:' | '@return:')* '@inout:')* '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInout
+	 */
+	protected void emit_Procedure___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' (('@input:' | '@inout:' | '@return:')* '@output:')* '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterOutput
+	 */
+	protected void emit_Procedure___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' (('@input:' | '@inout:' | '@output:')* '@return:')* '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterReturn
+	 */
+	protected void emit_Procedure___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@inout:' | '@output:')* '@return:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterReturn
+	 */
+	protected void emit_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@inout:' | '@output:')* '@return:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '{' parameter+=ParameterReturn
+	 *     buffer+=Buffer (ambiguity) parameter+=ParameterReturn
+	 *     channel+=Channel (ambiguity) '{' parameter+=ParameterReturn
+	 *     channel+=Channel (ambiguity) parameter+=ParameterReturn
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterReturn
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterInout '}' (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterInput '}' (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterOutput '}' (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn '}' (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterReturn
+	 *     port+=Port (ambiguity) '{' parameter+=ParameterReturn
+	 *     port+=Port (ambiguity) parameter+=ParameterReturn
+	 *     property+=Variable (ambiguity) '{' parameter+=ParameterReturn
+	 *     property+=Variable (ambiguity) parameter+=ParameterReturn
+	 *     signal+=Signal (ambiguity) '{' parameter+=ParameterReturn
+	 *     signal+=Signal (ambiguity) parameter+=ParameterReturn
+	 *     typedef+=TypeDefinition (ambiguity) '{' parameter+=ParameterReturn
+	 *     typedef+=TypeDefinition (ambiguity) parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) parameter+=ParameterReturn
+	 */
+	protected void emit_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@inout:' | '@return:')* '@output:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterOutput
+	 */
+	protected void emit_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@inout:' | '@return:')* '@output:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '{' parameter+=ParameterOutput
+	 *     buffer+=Buffer (ambiguity) parameter+=ParameterOutput
+	 *     channel+=Channel (ambiguity) '{' parameter+=ParameterOutput
+	 *     channel+=Channel (ambiguity) parameter+=ParameterOutput
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterOutput
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterInout '}' (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterInput '}' (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput '}' (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterReturn '}' (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterOutput
+	 *     port+=Port (ambiguity) '{' parameter+=ParameterOutput
+	 *     port+=Port (ambiguity) parameter+=ParameterOutput
+	 *     property+=Variable (ambiguity) '{' parameter+=ParameterOutput
+	 *     property+=Variable (ambiguity) parameter+=ParameterOutput
+	 *     signal+=Signal (ambiguity) '{' parameter+=ParameterOutput
+	 *     signal+=Signal (ambiguity) parameter+=ParameterOutput
+	 *     typedef+=TypeDefinition (ambiguity) '{' parameter+=ParameterOutput
+	 *     typedef+=TypeDefinition (ambiguity) parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) parameter+=ParameterOutput
+	 */
+	protected void emit_Procedure_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@inout:' | '@output:' | '@return:')* '@input:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInput
+	 */
+	protected void emit_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@inout:' | '@output:' | '@return:')* '@input:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '{' parameter+=ParameterInput
+	 *     buffer+=Buffer (ambiguity) parameter+=ParameterInput
+	 *     channel+=Channel (ambiguity) '{' parameter+=ParameterInput
+	 *     channel+=Channel (ambiguity) parameter+=ParameterInput
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInput
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) parameter+=ParameterInput
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) parameter+=ParameterInput
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) parameter+=ParameterInput
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInout '}' (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInput '}' (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterOutput '}' (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterReturn '}' (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterInput
+	 *     port+=Port (ambiguity) '{' parameter+=ParameterInput
+	 *     port+=Port (ambiguity) parameter+=ParameterInput
+	 *     property+=Variable (ambiguity) '{' parameter+=ParameterInput
+	 *     property+=Variable (ambiguity) parameter+=ParameterInput
+	 *     signal+=Signal (ambiguity) '{' parameter+=ParameterInput
+	 *     signal+=Signal (ambiguity) parameter+=ParameterInput
+	 *     typedef+=TypeDefinition (ambiguity) '{' parameter+=ParameterInput
+	 *     typedef+=TypeDefinition (ambiguity) parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) parameter+=ParameterInput
+	 */
+	protected void emit_Procedure_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@output:' | '@return:')* '@inout:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInout
+	 */
+	protected void emit_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@output:' | '@return:')* '@inout:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '{' parameter+=ParameterInout
+	 *     buffer+=Buffer (ambiguity) parameter+=ParameterInout
+	 *     channel+=Channel (ambiguity) '{' parameter+=ParameterInout
+	 *     channel+=Channel (ambiguity) parameter+=ParameterInout
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInout
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? (ambiguity) parameter+=ParameterInout
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? (ambiguity) parameter+=ParameterInout
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=FormalParameter '{' '@parameter:'? (ambiguity) parameter+=ParameterInout
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInout '}' (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInput '}' (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterOutput '}' (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterReturn '}' (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterInout
+	 *     port+=Port (ambiguity) '{' parameter+=ParameterInout
+	 *     port+=Port (ambiguity) parameter+=ParameterInout
+	 *     property+=Variable (ambiguity) '{' parameter+=ParameterInout
+	 *     property+=Variable (ambiguity) parameter+=ParameterInout
+	 *     signal+=Signal (ambiguity) '{' parameter+=ParameterInout
+	 *     signal+=Signal (ambiguity) parameter+=ParameterInout
+	 *     typedef+=TypeDefinition (ambiguity) '{' parameter+=ParameterInout
+	 *     typedef+=TypeDefinition (ambiguity) parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? (ambiguity) parameter+=ParameterInout
+	 */
+	protected void emit_Procedure_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@protected:' | '@private:')* '@public:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferPublic (ambiguity) port+=PortPublic
+	 *     buffer+=BufferPublic (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelPublic (ambiguity) port+=PortPublic
+	 *     channel+=ChannelPublic (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferPublic
+	 *     port+=PortPublic (ambiguity) channel+=ChannelPublic
+	 *     port+=PortPublic (ambiguity) port+=PortPublic
+	 *     port+=PortPublic (ambiguity) property+=VariablePublic
+	 *     port+=PortPublic (ambiguity) signal+=SignalPublic
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferPublic
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelPublic
+	 *     property+=VariablePublic (ambiguity) port+=PortPublic
+	 *     property+=VariablePublic (ambiguity) property+=VariablePublic
+	 *     property+=VariablePublic (ambiguity) signal+=SignalPublic
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalPublic (ambiguity) port+=PortPublic
+	 *     signal+=SignalPublic (ambiguity) property+=VariablePublic
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@protected:' | '@private:')* '@public:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferPublic
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelPublic
+	 *     buffer+=Buffer (ambiguity) port+=PortPublic
+	 *     buffer+=Buffer (ambiguity) property+=VariablePublic
+	 *     buffer+=Buffer (ambiguity) signal+=SignalPublic
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortPublic
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferProtected (ambiguity) port+=PortPublic
+	 *     buffer+=BufferProtected (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferPublic
+	 *     channel+=Channel (ambiguity) channel+=ChannelPublic
+	 *     channel+=Channel (ambiguity) port+=PortPublic
+	 *     channel+=Channel (ambiguity) property+=VariablePublic
+	 *     channel+=Channel (ambiguity) signal+=SignalPublic
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortPublic
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelProtected (ambiguity) port+=PortPublic
+	 *     channel+=ChannelProtected (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferPublic
+	 *     port+=Port (ambiguity) channel+=ChannelPublic
+	 *     port+=Port (ambiguity) port+=PortPublic
+	 *     port+=Port (ambiguity) property+=VariablePublic
+	 *     port+=Port (ambiguity) signal+=SignalPublic
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferPublic
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelPublic
+	 *     port+=PortPrivate (ambiguity) port+=PortPublic
+	 *     port+=PortPrivate (ambiguity) property+=VariablePublic
+	 *     port+=PortPrivate (ambiguity) signal+=SignalPublic
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferPublic
+	 *     port+=PortProtected (ambiguity) channel+=ChannelPublic
+	 *     port+=PortProtected (ambiguity) port+=PortPublic
+	 *     port+=PortProtected (ambiguity) property+=VariablePublic
+	 *     port+=PortProtected (ambiguity) signal+=SignalPublic
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferPublic
+	 *     property+=Variable (ambiguity) channel+=ChannelPublic
+	 *     property+=Variable (ambiguity) port+=PortPublic
+	 *     property+=Variable (ambiguity) property+=VariablePublic
+	 *     property+=Variable (ambiguity) signal+=SignalPublic
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferPublic
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelPublic
+	 *     property+=VariablePrivate (ambiguity) port+=PortPublic
+	 *     property+=VariablePrivate (ambiguity) property+=VariablePublic
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalPublic
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferPublic
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelPublic
+	 *     property+=VariableProtected (ambiguity) port+=PortPublic
+	 *     property+=VariableProtected (ambiguity) property+=VariablePublic
+	 *     property+=VariableProtected (ambiguity) signal+=SignalPublic
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferPublic
+	 *     signal+=Signal (ambiguity) channel+=ChannelPublic
+	 *     signal+=Signal (ambiguity) port+=PortPublic
+	 *     signal+=Signal (ambiguity) property+=VariablePublic
+	 *     signal+=Signal (ambiguity) signal+=SignalPublic
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalPrivate (ambiguity) port+=PortPublic
+	 *     signal+=SignalPrivate (ambiguity) property+=VariablePublic
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalProtected (ambiguity) port+=PortPublic
+	 *     signal+=SignalProtected (ambiguity) property+=VariablePublic
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@protected:' | '@private:' | '@property:')? '@public:'?)*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@private:')* '@protected:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferProtected (ambiguity) port+=PortProtected
+	 *     buffer+=BufferProtected (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelProtected (ambiguity) port+=PortProtected
+	 *     channel+=ChannelProtected (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferProtected
+	 *     port+=PortProtected (ambiguity) channel+=ChannelProtected
+	 *     port+=PortProtected (ambiguity) port+=PortProtected
+	 *     port+=PortProtected (ambiguity) property+=VariableProtected
+	 *     port+=PortProtected (ambiguity) signal+=SignalProtected
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferProtected
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelProtected
+	 *     property+=VariableProtected (ambiguity) port+=PortProtected
+	 *     property+=VariableProtected (ambiguity) property+=VariableProtected
+	 *     property+=VariableProtected (ambiguity) signal+=SignalProtected
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalProtected (ambiguity) port+=PortProtected
+	 *     signal+=SignalProtected (ambiguity) property+=VariableProtected
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@private:')* '@protected:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferProtected
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelProtected
+	 *     buffer+=Buffer (ambiguity) port+=PortProtected
+	 *     buffer+=Buffer (ambiguity) property+=VariableProtected
+	 *     buffer+=Buffer (ambiguity) signal+=SignalProtected
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortProtected
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferPublic (ambiguity) port+=PortProtected
+	 *     buffer+=BufferPublic (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferProtected
+	 *     channel+=Channel (ambiguity) channel+=ChannelProtected
+	 *     channel+=Channel (ambiguity) port+=PortProtected
+	 *     channel+=Channel (ambiguity) property+=VariableProtected
+	 *     channel+=Channel (ambiguity) signal+=SignalProtected
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortProtected
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelPublic (ambiguity) port+=PortProtected
+	 *     channel+=ChannelPublic (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferProtected
+	 *     port+=Port (ambiguity) channel+=ChannelProtected
+	 *     port+=Port (ambiguity) port+=PortProtected
+	 *     port+=Port (ambiguity) property+=VariableProtected
+	 *     port+=Port (ambiguity) signal+=SignalProtected
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferProtected
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelProtected
+	 *     port+=PortPrivate (ambiguity) port+=PortProtected
+	 *     port+=PortPrivate (ambiguity) property+=VariableProtected
+	 *     port+=PortPrivate (ambiguity) signal+=SignalProtected
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferProtected
+	 *     port+=PortPublic (ambiguity) channel+=ChannelProtected
+	 *     port+=PortPublic (ambiguity) port+=PortProtected
+	 *     port+=PortPublic (ambiguity) property+=VariableProtected
+	 *     port+=PortPublic (ambiguity) signal+=SignalProtected
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferProtected
+	 *     property+=Variable (ambiguity) channel+=ChannelProtected
+	 *     property+=Variable (ambiguity) port+=PortProtected
+	 *     property+=Variable (ambiguity) property+=VariableProtected
+	 *     property+=Variable (ambiguity) signal+=SignalProtected
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferProtected
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelProtected
+	 *     property+=VariablePrivate (ambiguity) port+=PortProtected
+	 *     property+=VariablePrivate (ambiguity) property+=VariableProtected
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalProtected
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferProtected
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelProtected
+	 *     property+=VariablePublic (ambiguity) port+=PortProtected
+	 *     property+=VariablePublic (ambiguity) property+=VariableProtected
+	 *     property+=VariablePublic (ambiguity) signal+=SignalProtected
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferProtected
+	 *     signal+=Signal (ambiguity) channel+=ChannelProtected
+	 *     signal+=Signal (ambiguity) port+=PortProtected
+	 *     signal+=Signal (ambiguity) property+=VariableProtected
+	 *     signal+=Signal (ambiguity) signal+=SignalProtected
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalPrivate (ambiguity) port+=PortProtected
+	 *     signal+=SignalPrivate (ambiguity) property+=VariableProtected
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalPublic (ambiguity) port+=PortProtected
+	 *     signal+=SignalPublic (ambiguity) property+=VariableProtected
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@public:' | '@protected:' | '@private:')* '@property:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=Buffer
+	 *     buffer+=Buffer (ambiguity) channel+=Channel
+	 *     buffer+=Buffer (ambiguity) port+=Port
+	 *     buffer+=Buffer (ambiguity) property+=Variable
+	 *     buffer+=Buffer (ambiguity) signal+=Signal
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=Buffer
+	 *     channel+=Channel (ambiguity) channel+=Channel
+	 *     channel+=Channel (ambiguity) port+=Port
+	 *     channel+=Channel (ambiguity) property+=Variable
+	 *     channel+=Channel (ambiguity) signal+=Signal
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=Buffer
+	 *     port+=Port (ambiguity) channel+=Channel
+	 *     port+=Port (ambiguity) port+=Port
+	 *     port+=Port (ambiguity) property+=Variable
+	 *     port+=Port (ambiguity) signal+=Signal
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=Buffer
+	 *     property+=Variable (ambiguity) channel+=Channel
+	 *     property+=Variable (ambiguity) port+=Port
+	 *     property+=Variable (ambiguity) property+=Variable
+	 *     property+=Variable (ambiguity) signal+=Signal
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=Buffer
+	 *     signal+=Signal (ambiguity) channel+=Channel
+	 *     signal+=Signal (ambiguity) port+=Port
+	 *     signal+=Signal (ambiguity) property+=Variable
+	 *     signal+=Signal (ambiguity) signal+=Signal
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@public:' | '@protected:' | '@private:')* '@property:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferPrivate (ambiguity) channel+=Channel
+	 *     buffer+=BufferPrivate (ambiguity) port+=Port
+	 *     buffer+=BufferPrivate (ambiguity) property+=Variable
+	 *     buffer+=BufferPrivate (ambiguity) signal+=Signal
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferProtected (ambiguity) channel+=Channel
+	 *     buffer+=BufferProtected (ambiguity) port+=Port
+	 *     buffer+=BufferProtected (ambiguity) property+=Variable
+	 *     buffer+=BufferProtected (ambiguity) signal+=Signal
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferPublic (ambiguity) channel+=Channel
+	 *     buffer+=BufferPublic (ambiguity) port+=Port
+	 *     buffer+=BufferPublic (ambiguity) property+=Variable
+	 *     buffer+=BufferPublic (ambiguity) signal+=Signal
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelPrivate (ambiguity) channel+=Channel
+	 *     channel+=ChannelPrivate (ambiguity) port+=Port
+	 *     channel+=ChannelPrivate (ambiguity) property+=Variable
+	 *     channel+=ChannelPrivate (ambiguity) signal+=Signal
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelProtected (ambiguity) channel+=Channel
+	 *     channel+=ChannelProtected (ambiguity) port+=Port
+	 *     channel+=ChannelProtected (ambiguity) property+=Variable
+	 *     channel+=ChannelProtected (ambiguity) signal+=Signal
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelPublic (ambiguity) channel+=Channel
+	 *     channel+=ChannelPublic (ambiguity) port+=Port
+	 *     channel+=ChannelPublic (ambiguity) property+=Variable
+	 *     channel+=ChannelPublic (ambiguity) signal+=Signal
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=Buffer
+	 *     port+=PortPrivate (ambiguity) channel+=Channel
+	 *     port+=PortPrivate (ambiguity) port+=Port
+	 *     port+=PortPrivate (ambiguity) property+=Variable
+	 *     port+=PortPrivate (ambiguity) signal+=Signal
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=Buffer
+	 *     port+=PortProtected (ambiguity) channel+=Channel
+	 *     port+=PortProtected (ambiguity) port+=Port
+	 *     port+=PortProtected (ambiguity) property+=Variable
+	 *     port+=PortProtected (ambiguity) signal+=Signal
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=Buffer
+	 *     port+=PortPublic (ambiguity) channel+=Channel
+	 *     port+=PortPublic (ambiguity) port+=Port
+	 *     port+=PortPublic (ambiguity) property+=Variable
+	 *     port+=PortPublic (ambiguity) signal+=Signal
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=Buffer
+	 *     property+=VariablePrivate (ambiguity) channel+=Channel
+	 *     property+=VariablePrivate (ambiguity) port+=Port
+	 *     property+=VariablePrivate (ambiguity) property+=Variable
+	 *     property+=VariablePrivate (ambiguity) signal+=Signal
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=Buffer
+	 *     property+=VariableProtected (ambiguity) channel+=Channel
+	 *     property+=VariableProtected (ambiguity) port+=Port
+	 *     property+=VariableProtected (ambiguity) property+=Variable
+	 *     property+=VariableProtected (ambiguity) signal+=Signal
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=Buffer
+	 *     property+=VariablePublic (ambiguity) channel+=Channel
+	 *     property+=VariablePublic (ambiguity) port+=Port
+	 *     property+=VariablePublic (ambiguity) property+=Variable
+	 *     property+=VariablePublic (ambiguity) signal+=Signal
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=Buffer
+	 *     signal+=SignalPrivate (ambiguity) channel+=Channel
+	 *     signal+=SignalPrivate (ambiguity) port+=Port
+	 *     signal+=SignalPrivate (ambiguity) property+=Variable
+	 *     signal+=SignalPrivate (ambiguity) signal+=Signal
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=Buffer
+	 *     signal+=SignalProtected (ambiguity) channel+=Channel
+	 *     signal+=SignalProtected (ambiguity) port+=Port
+	 *     signal+=SignalProtected (ambiguity) property+=Variable
+	 *     signal+=SignalProtected (ambiguity) signal+=Signal
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=Buffer
+	 *     signal+=SignalPublic (ambiguity) channel+=Channel
+	 *     signal+=SignalPublic (ambiguity) port+=Port
+	 *     signal+=SignalPublic (ambiguity) property+=Variable
+	 *     signal+=SignalPublic (ambiguity) signal+=Signal
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@protected:' | '@private:' | '@public:')? '@property:'?)*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     name=ESIdentifier ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=FormalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=FormalParameter '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=FunctionalParameter ')' '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '}' (rule end)
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) execution=ProcedureExecution
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     unrestrictedName=UnrestrictedName ('(' ')')? '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 */
+	protected void emit_Procedure_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@protected:')* '@private:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortPrivate (ambiguity) port+=PortPrivate
+	 *     port+=PortPrivate (ambiguity) property+=VariablePrivate
+	 *     port+=PortPrivate (ambiguity) signal+=SignalPrivate
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariablePrivate (ambiguity) port+=PortPrivate
+	 *     property+=VariablePrivate (ambiguity) property+=VariablePrivate
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalPrivate
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalPrivate (ambiguity) port+=PortPrivate
+	 *     signal+=SignalPrivate (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@protected:')* '@private:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=Buffer (ambiguity) port+=PortPrivate
+	 *     buffer+=Buffer (ambiguity) property+=VariablePrivate
+	 *     buffer+=Buffer (ambiguity) signal+=SignalPrivate
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferProtected (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferProtected (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferPublic (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferPublic (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferPrivate
+	 *     channel+=Channel (ambiguity) channel+=ChannelPrivate
+	 *     channel+=Channel (ambiguity) port+=PortPrivate
+	 *     channel+=Channel (ambiguity) property+=VariablePrivate
+	 *     channel+=Channel (ambiguity) signal+=SignalPrivate
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelProtected (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelProtected (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelPublic (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelPublic (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferPrivate
+	 *     port+=Port (ambiguity) channel+=ChannelPrivate
+	 *     port+=Port (ambiguity) port+=PortPrivate
+	 *     port+=Port (ambiguity) property+=VariablePrivate
+	 *     port+=Port (ambiguity) signal+=SignalPrivate
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortProtected (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortProtected (ambiguity) port+=PortPrivate
+	 *     port+=PortProtected (ambiguity) property+=VariablePrivate
+	 *     port+=PortProtected (ambiguity) signal+=SignalPrivate
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortPublic (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortPublic (ambiguity) port+=PortPrivate
+	 *     port+=PortPublic (ambiguity) property+=VariablePrivate
+	 *     port+=PortPublic (ambiguity) signal+=SignalPrivate
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferPrivate
+	 *     property+=Variable (ambiguity) channel+=ChannelPrivate
+	 *     property+=Variable (ambiguity) port+=PortPrivate
+	 *     property+=Variable (ambiguity) property+=VariablePrivate
+	 *     property+=Variable (ambiguity) signal+=SignalPrivate
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariableProtected (ambiguity) port+=PortPrivate
+	 *     property+=VariableProtected (ambiguity) property+=VariablePrivate
+	 *     property+=VariableProtected (ambiguity) signal+=SignalPrivate
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariablePublic (ambiguity) port+=PortPrivate
+	 *     property+=VariablePublic (ambiguity) property+=VariablePrivate
+	 *     property+=VariablePublic (ambiguity) signal+=SignalPrivate
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferPrivate
+	 *     signal+=Signal (ambiguity) channel+=ChannelPrivate
+	 *     signal+=Signal (ambiguity) port+=PortPrivate
+	 *     signal+=Signal (ambiguity) property+=VariablePrivate
+	 *     signal+=Signal (ambiguity) signal+=SignalPrivate
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalProtected (ambiguity) port+=PortPrivate
+	 *     signal+=SignalProtected (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalPublic (ambiguity) port+=PortPrivate
+	 *     signal+=SignalPublic (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Procedure_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'moc:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) ('state' | 'pseudostate') '<' (ambiguity) kind=PseudostateInitialKind
+	 */
+	protected void emit_PseudostateInitial_MocKeyword_1_0_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'state' | 'pseudostate'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '<' 'moc:'? kind=PseudostateInitialKind
+	 */
+	protected void emit_PseudostateInitial_PseudostateKeyword_1_0_0_1_or_StateKeyword_1_0_0_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('{' '}') | ';'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name='#init' (ambiguity) (rule end)
+	 *     name='#initial' (ambiguity) (rule end)
+	 *     name=ESIdentifier (ambiguity) (rule end)
+	 *     unrestrictedName=UnrestrictedName (ambiguity) (rule end)
+	 */
+	protected void emit_PseudostateInitial_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'macro'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) 'routine' name=ESIdentifier
+	 *     visibility=VisibilityKind (ambiguity) 'routine' name=ESIdentifier
+	 */
+	protected void emit_Routine_MacroKeyword_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ESIdentifier (ambiguity) '-->' '(' codomain=FunctionalParameterSet
+	 *     name=ESIdentifier (ambiguity) '-->' codomain=FormalParameterSet
+	 *     name=ESIdentifier (ambiguity) bodyBlock=BlockStatement
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '-->' '(' codomain=FunctionalParameterSet
+	 *     unrestrictedName=UnrestrictedName (ambiguity) '-->' codomain=FormalParameterSet
+	 *     unrestrictedName=UnrestrictedName (ambiguity) bodyBlock=BlockStatement
+	 */
+	protected void emit_Routine___LeftParenthesisKeyword_5_0_RightParenthesisKeyword_5_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ';' | ('{' '}')
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ESIdentifier (ambiguity) (rule end)
+	 *     unrestrictedName=UnrestrictedName (ambiguity) (rule end)
+	 */
+	protected void emit_SimpleState_SemicolonKeyword_5_1_or___LeftCurlyBracketKeyword_5_0_0_RightCurlyBracketKeyword_5_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('<' 'moc:'? 'simple' '>')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     simple?='state' (ambiguity) name=ESIdentifier
+	 */
+	protected void emit_SimpleState___LessThanSignKeyword_2_0_MocKeyword_2_1_q_SimpleKeyword_2_2_GreaterThanSignKeyword_2_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'moc:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     simple?='state' '<' (ambiguity) 'start' '>' name=ESIdentifier
+	 */
+	protected void emit_StartState_MocKeyword_1_0_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ';' | ('{' '}')
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     name=ESIdentifier (ambiguity) (rule end)
+	 *     simple?='#start' (ambiguity) (rule end)
+	 *     unrestrictedName=UnrestrictedName (ambiguity) (rule end)
+	 */
+	protected void emit_StartState_SemicolonKeyword_3_1_or___LeftCurlyBracketKeyword_3_0_0_RightCurlyBracketKeyword_3_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@region:' | '@statemachine:'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) vertex+=Pseudostate
+	 *     (rule start) (ambiguity) vertex+=State
+	 */
+	protected void emit_StatemachineRegion_RegionKeyword_1_0_0_or_StatemachineKeyword_1_0_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@region<' | '@statemachine<'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) name=ESIdentifier
+	 */
+	protected void emit_StatemachineRegion_RegionKeyword_1_1_0_0_or_StatemachineKeyword_1_1_0_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@routine:' | '@macro:'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     procedure+=Procedure (ambiguity) routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* (ambiguity) routine+=Routine
+	 */
+	protected void emit_Statemachine_MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@parameter:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         channel+=ChannelPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         property+=VariablePublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@protected:' | '@private:' | '@public:')? '@property:'?)* 
+	 *         '@public:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         port+=PortProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@private:' | '@protected:')? '@property:'?)* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         buffer+=BufferPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         channel+=ChannelPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         signal+=SignalPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@private:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         '@procedure:' 
+	 *         procedure+=Procedure
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@property:'? 
+	 *         (('@public:' | '@protected:' | '@private:')? '@property:'?)* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         (ambiguity) 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         '@public:'? 
+	 *         (('@protected:' | '@private:' | '@property:')? '@public:'?)* 
+	 *         '@property:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     name=ESIdentifier '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ '{' parameter+=ParameterInput
+	 *     name=ESIdentifier '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ parameter+=ParameterInput
+	 *     name=ESIdentifier '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ '{' parameter+=ParameterReturn
+	 *     name=ESIdentifier '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ parameter+=ParameterReturn
+	 *     name=ESIdentifier '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ '{' parameter+=ParameterOutput
+	 *     name=ESIdentifier '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ parameter+=ParameterOutput
+	 *     name=ESIdentifier '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ '{' parameter+=ParameterInout
+	 *     name=ESIdentifier '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ '{' parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) (('@inout:' | '@output:' | '@return:')* '@input:')+ parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ '{' parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) (('@input:' | '@inout:' | '@output:')* '@return:')+ parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ '{' parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) (('@input:' | '@inout:' | '@return:')* '@output:')+ parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ '{' parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) (('@input:' | '@output:' | '@return:')* '@inout:')+ parameter+=ParameterInout
+	 */
+	protected void emit_Statemachine_ParameterKeyword_7_0_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@procedure:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     procedure+=Procedure (ambiguity) procedure+=Procedure
+	 */
+	protected void emit_Statemachine_ProcedureKeyword_10_0_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@property:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         channel+=ChannelPublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         property+=VariablePublic
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@public:')? (ambiguity))* 
+	 *         '@public:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         buffer+=BufferProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         channel+=ChannelProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         port+=PortProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         property+=VariableProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         signal+=SignalProtected
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@private:' | '@protected:')? (ambiguity))* 
+	 *         '@protected:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         buffer+=BufferPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         channel+=ChannelPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         property+=VariablePrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         signal+=SignalPrivate
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@private:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         '@procedure:' 
+	 *         procedure+=Procedure
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@public:' | '@protected:' | '@private:')? (ambiguity))* 
+	 *         ('@routine:' | '@macro:') 
+	 *         routine+=Routine
+	 *     )
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' channel+=ChannelPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' property+=VariablePublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' buffer+=BufferProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' channel+=ChannelProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' port+=PortProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' property+=VariableProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' signal+=SignalProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@private:' | '@protected:')? (ambiguity))* '@protected:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' property+=VariablePrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' signal+=SignalPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' buffer+=BufferPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' port+=PortPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@public:')? (ambiguity))* '@public:' signal+=SignalPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* '@private:' port+=PortPrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegion
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* region+=StatemachineRegionLite
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@public:' | '@protected:' | '@private:')? (ambiguity))* routine+=Routine
+	 */
+	protected void emit_Statemachine_PropertyKeyword_9_0_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@public:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         property+=Variable
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         '@parameter:'? 
+	 *         ('@input:' | '@inout:' | '@output:' | '@return:')* 
+	 *         (ambiguity) 
+	 *         (('@protected:' | '@private:' | '@property:')? (ambiguity))* 
+	 *         '@property:' 
+	 *         typedef+=TypeDefinition
+	 *     )
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' property+=Variable
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' buffer+=Buffer
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' channel+=Channel
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' port+=Port
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* (ambiguity) (('@protected:' | '@private:' | '@property:')? (ambiguity))* '@property:' signal+=Signal
+	 */
+	protected void emit_Statemachine_PublicKeyword_9_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@input:' | '@inout:' | '@output:' | '@return:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     buffer+=Buffer (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     buffer+=Buffer (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     channel+=Channel (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     channel+=Channel (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     channel+=Channel (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterInout '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterInout (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterInput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterInput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn '}' (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     port+=Port (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     port+=Port (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     port+=Port (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     property+=Variable (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     property+=Variable (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     property+=Variable (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     signal+=Signal (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     signal+=Signal (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     signal+=Signal (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     typedef+=TypeDefinition (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' buffer+=BufferPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' channel+=ChannelPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' port+=PortPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' property+=VariablePublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' signal+=SignalPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@protected:' | '@private:' | '@public:')? '@property:'?)* '@public:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' buffer+=BufferProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' channel+=ChannelProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' port+=PortProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' property+=VariableProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' signal+=SignalProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@private:' | '@protected:')? '@property:'?)* '@protected:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' buffer+=BufferPrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' channel+=ChannelPrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' port+=PortPrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' property+=VariablePrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' signal+=SignalPrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@private:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* '@procedure:' procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* ('@routine:' | '@macro:') routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegion
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* region+=StatemachineRegionLite
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@property:'? (('@public:' | '@protected:' | '@private:')? '@property:'?)* routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' buffer+=Buffer
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' channel+=Channel
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' port+=Port
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' property+=Variable
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' signal+=Signal
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '@public:'? (('@protected:' | '@private:' | '@property:')? '@public:'?)* '@property:' typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine___InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('<' 'moc:'? ('or' | 'and') '>')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'statemachine' (ambiguity) name=ESIdentifier
+	 *     design=DesignKind 'statemachine' (ambiguity) name=ESIdentifier
+	 *     input_enabled?='input_enabled' 'statemachine' (ambiguity) name=ESIdentifier
+	 *     timed?='timed' 'statemachine' (ambiguity) name=ESIdentifier
+	 *     visibility=VisibilityKind 'statemachine' (ambiguity) name=ESIdentifier
+	 */
+	protected void emit_Statemachine___LessThanSignKeyword_3_0_MocKeyword_3_1_q___AndKeyword_3_2_1_or_OrKeyword_3_2_0___GreaterThanSignKeyword_3_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@routine:' | '@macro:')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     routine+=Routine (ambiguity) routine+=Routine
+	 */
+	protected void emit_Statemachine___MacroKeyword_10_0_0_0_1_or_RoutineKeyword_10_0_0_0_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@property:' | '@public:' | '@protected:' | '@private:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer (ambiguity) procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) region+=StatemachineRegion
+	 *     buffer+=Buffer (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=Buffer (ambiguity) routine+=Routine
+	 *     buffer+=BufferPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferPrivate (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferPrivate (ambiguity) region+=StatemachineRegion
+	 *     buffer+=BufferPrivate (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=BufferPrivate (ambiguity) routine+=Routine
+	 *     buffer+=BufferProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferProtected (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferProtected (ambiguity) region+=StatemachineRegion
+	 *     buffer+=BufferProtected (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=BufferProtected (ambiguity) routine+=Routine
+	 *     buffer+=BufferPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferPublic (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferPublic (ambiguity) region+=StatemachineRegion
+	 *     buffer+=BufferPublic (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=BufferPublic (ambiguity) routine+=Routine
+	 *     channel+=Channel (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=Channel (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel (ambiguity) procedure+=Procedure
+	 *     channel+=Channel (ambiguity) region+=StatemachineRegion
+	 *     channel+=Channel (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=Channel (ambiguity) routine+=Routine
+	 *     channel+=ChannelPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelPrivate (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelPrivate (ambiguity) region+=StatemachineRegion
+	 *     channel+=ChannelPrivate (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=ChannelPrivate (ambiguity) routine+=Routine
+	 *     channel+=ChannelProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelProtected (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelProtected (ambiguity) region+=StatemachineRegion
+	 *     channel+=ChannelProtected (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=ChannelProtected (ambiguity) routine+=Routine
+	 *     channel+=ChannelPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelPublic (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelPublic (ambiguity) region+=StatemachineRegion
+	 *     channel+=ChannelPublic (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=ChannelPublic (ambiguity) routine+=Routine
+	 *     port+=Port (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=Port (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port (ambiguity) procedure+=Procedure
+	 *     port+=Port (ambiguity) region+=StatemachineRegion
+	 *     port+=Port (ambiguity) region+=StatemachineRegionLite
+	 *     port+=Port (ambiguity) routine+=Routine
+	 *     port+=PortPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortPrivate (ambiguity) procedure+=Procedure
+	 *     port+=PortPrivate (ambiguity) region+=StatemachineRegion
+	 *     port+=PortPrivate (ambiguity) region+=StatemachineRegionLite
+	 *     port+=PortPrivate (ambiguity) routine+=Routine
+	 *     port+=PortProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortProtected (ambiguity) procedure+=Procedure
+	 *     port+=PortProtected (ambiguity) region+=StatemachineRegion
+	 *     port+=PortProtected (ambiguity) region+=StatemachineRegionLite
+	 *     port+=PortProtected (ambiguity) routine+=Routine
+	 *     port+=PortPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortPublic (ambiguity) procedure+=Procedure
+	 *     port+=PortPublic (ambiguity) region+=StatemachineRegion
+	 *     port+=PortPublic (ambiguity) region+=StatemachineRegionLite
+	 *     port+=PortPublic (ambiguity) routine+=Routine
+	 *     property+=Variable (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=Variable (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable (ambiguity) procedure+=Procedure
+	 *     property+=Variable (ambiguity) region+=StatemachineRegion
+	 *     property+=Variable (ambiguity) region+=StatemachineRegionLite
+	 *     property+=Variable (ambiguity) routine+=Routine
+	 *     property+=VariablePrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariablePrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariablePrivate (ambiguity) procedure+=Procedure
+	 *     property+=VariablePrivate (ambiguity) region+=StatemachineRegion
+	 *     property+=VariablePrivate (ambiguity) region+=StatemachineRegionLite
+	 *     property+=VariablePrivate (ambiguity) routine+=Routine
+	 *     property+=VariableProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariableProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariableProtected (ambiguity) procedure+=Procedure
+	 *     property+=VariableProtected (ambiguity) region+=StatemachineRegion
+	 *     property+=VariableProtected (ambiguity) region+=StatemachineRegionLite
+	 *     property+=VariableProtected (ambiguity) routine+=Routine
+	 *     property+=VariablePublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariablePublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariablePublic (ambiguity) procedure+=Procedure
+	 *     property+=VariablePublic (ambiguity) region+=StatemachineRegion
+	 *     property+=VariablePublic (ambiguity) region+=StatemachineRegionLite
+	 *     property+=VariablePublic (ambiguity) routine+=Routine
+	 *     signal+=Signal (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=Signal (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal (ambiguity) procedure+=Procedure
+	 *     signal+=Signal (ambiguity) region+=StatemachineRegion
+	 *     signal+=Signal (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=Signal (ambiguity) routine+=Routine
+	 *     signal+=SignalPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalPrivate (ambiguity) procedure+=Procedure
+	 *     signal+=SignalPrivate (ambiguity) region+=StatemachineRegion
+	 *     signal+=SignalPrivate (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=SignalPrivate (ambiguity) routine+=Routine
+	 *     signal+=SignalProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalProtected (ambiguity) procedure+=Procedure
+	 *     signal+=SignalProtected (ambiguity) region+=StatemachineRegion
+	 *     signal+=SignalProtected (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=SignalProtected (ambiguity) routine+=Routine
+	 *     signal+=SignalPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalPublic (ambiguity) procedure+=Procedure
+	 *     signal+=SignalPublic (ambiguity) region+=StatemachineRegion
+	 *     signal+=SignalPublic (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=SignalPublic (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) region+=StatemachineRegion
+	 *     typedef+=TypeDefinition (ambiguity) region+=StatemachineRegionLite
+	 *     typedef+=TypeDefinition (ambiguity) routine+=Routine
+	 */
+	protected void emit_Statemachine___PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'input' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInput
+	 */
+	protected void emit_Statemachine___RightCurlyBracketKeyword_7_0_1_0_1_1_2_InputKeyword_7_0_1_0_0_LeftCurlyBracketKeyword_7_0_1_0_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'inout' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInout
+	 */
+	protected void emit_Statemachine___RightCurlyBracketKeyword_7_0_1_1_1_1_2_InoutKeyword_7_0_1_1_0_LeftCurlyBracketKeyword_7_0_1_1_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'output' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterOutput
+	 */
+	protected void emit_Statemachine___RightCurlyBracketKeyword_7_0_1_2_1_1_2_OutputKeyword_7_0_1_2_0_LeftCurlyBracketKeyword_7_0_1_2_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' 'return' '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterReturn
+	 */
+	protected void emit_Statemachine___RightCurlyBracketKeyword_7_0_1_3_1_1_2_ReturnKeyword_7_0_1_3_0_LeftCurlyBracketKeyword_7_0_1_3_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' (('@inout:' | '@output:' | '@return:')* '@input:')* '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInput
+	 */
+	protected void emit_Statemachine___RightCurlyBracketKeyword_8_0_1_1_2_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a_LeftCurlyBracketKeyword_8_0_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' (('@input:' | '@output:' | '@return:')* '@inout:')* '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInout
+	 */
+	protected void emit_Statemachine___RightCurlyBracketKeyword_8_1_1_1_2_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a_LeftCurlyBracketKeyword_8_1_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' (('@input:' | '@inout:' | '@return:')* '@output:')* '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterOutput
+	 */
+	protected void emit_Statemachine___RightCurlyBracketKeyword_8_2_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a_LeftCurlyBracketKeyword_8_2_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('}' (('@input:' | '@inout:' | '@output:')* '@return:')* '{')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterReturn
+	 */
+	protected void emit_Statemachine___RightCurlyBracketKeyword_8_3_1_1_2_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a_LeftCurlyBracketKeyword_8_3_1_1_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@inout:' | '@output:')* '@return:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterReturn
+	 */
+	protected void emit_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@inout:' | '@output:')* '@return:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '{' parameter+=ParameterReturn
+	 *     buffer+=Buffer (ambiguity) parameter+=ParameterReturn
+	 *     channel+=Channel (ambiguity) '{' parameter+=ParameterReturn
+	 *     channel+=Channel (ambiguity) parameter+=ParameterReturn
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterReturn
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterInout '}' (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterInput '}' (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterOutput '}' (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn '}' (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterReturn
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterReturn
+	 *     port+=Port (ambiguity) '{' parameter+=ParameterReturn
+	 *     port+=Port (ambiguity) parameter+=ParameterReturn
+	 *     property+=Variable (ambiguity) '{' parameter+=ParameterReturn
+	 *     property+=Variable (ambiguity) parameter+=ParameterReturn
+	 *     signal+=Signal (ambiguity) '{' parameter+=ParameterReturn
+	 *     signal+=Signal (ambiguity) parameter+=ParameterReturn
+	 *     typedef+=TypeDefinition (ambiguity) '{' parameter+=ParameterReturn
+	 *     typedef+=TypeDefinition (ambiguity) parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterReturn
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) parameter+=ParameterReturn
+	 */
+	protected void emit_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_OutputKeyword_8_2_0__a_ReturnKeyword_8_3_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@inout:' | '@return:')* '@output:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterOutput
+	 */
+	protected void emit_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@inout:' | '@return:')* '@output:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '{' parameter+=ParameterOutput
+	 *     buffer+=Buffer (ambiguity) parameter+=ParameterOutput
+	 *     channel+=Channel (ambiguity) '{' parameter+=ParameterOutput
+	 *     channel+=Channel (ambiguity) parameter+=ParameterOutput
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterOutput
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterInout '}' (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterInput '}' (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput '}' (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterReturn '}' (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterOutput
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterOutput
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterOutput
+	 *     port+=Port (ambiguity) '{' parameter+=ParameterOutput
+	 *     port+=Port (ambiguity) parameter+=ParameterOutput
+	 *     property+=Variable (ambiguity) '{' parameter+=ParameterOutput
+	 *     property+=Variable (ambiguity) parameter+=ParameterOutput
+	 *     signal+=Signal (ambiguity) '{' parameter+=ParameterOutput
+	 *     signal+=Signal (ambiguity) parameter+=ParameterOutput
+	 *     typedef+=TypeDefinition (ambiguity) '{' parameter+=ParameterOutput
+	 *     typedef+=TypeDefinition (ambiguity) parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterOutput
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) parameter+=ParameterOutput
+	 */
+	protected void emit_Statemachine_____InoutKeyword_8_1_0_or_InputKeyword_8_0_0_or_ReturnKeyword_8_3_0__a_OutputKeyword_8_2_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@inout:' | '@output:' | '@return:')* '@input:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInput
+	 */
+	protected void emit_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@inout:' | '@output:' | '@return:')* '@input:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '{' parameter+=ParameterInput
+	 *     buffer+=Buffer (ambiguity) parameter+=ParameterInput
+	 *     channel+=Channel (ambiguity) '{' parameter+=ParameterInput
+	 *     channel+=Channel (ambiguity) parameter+=ParameterInput
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInput
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInout '}' (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInput '}' (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterOutput '}' (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterReturn '}' (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterInput
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterInput
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterInput
+	 *     port+=Port (ambiguity) '{' parameter+=ParameterInput
+	 *     port+=Port (ambiguity) parameter+=ParameterInput
+	 *     property+=Variable (ambiguity) '{' parameter+=ParameterInput
+	 *     property+=Variable (ambiguity) parameter+=ParameterInput
+	 *     signal+=Signal (ambiguity) '{' parameter+=ParameterInput
+	 *     signal+=Signal (ambiguity) parameter+=ParameterInput
+	 *     typedef+=TypeDefinition (ambiguity) '{' parameter+=ParameterInput
+	 *     typedef+=TypeDefinition (ambiguity) parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInput
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) parameter+=ParameterInput
+	 */
+	protected void emit_Statemachine_____InoutKeyword_8_1_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InputKeyword_8_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@output:' | '@return:')* '@inout:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInout
+	 */
+	protected void emit_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@input:' | '@output:' | '@return:')* '@inout:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '{' parameter+=ParameterInout
+	 *     buffer+=Buffer (ambiguity) parameter+=ParameterInout
+	 *     channel+=Channel (ambiguity) '{' parameter+=ParameterInout
+	 *     channel+=Channel (ambiguity) parameter+=ParameterInout
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInout
+	 *     name=ESIdentifier '{' '@parameter:'? (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInout '}' (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInout '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInout (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInout (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInput '}' (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInput '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterInput (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterInput (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterOutput '}' (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterOutput '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterOutput (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterOutput (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterReturn '}' (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterReturn '}' (ambiguity) parameter+=ParameterInout
+	 *     parameter+=ParameterReturn (ambiguity) '{' parameter+=ParameterInout
+	 *     parameter+=ParameterReturn (ambiguity) parameter+=ParameterInout
+	 *     port+=Port (ambiguity) '{' parameter+=ParameterInout
+	 *     port+=Port (ambiguity) parameter+=ParameterInout
+	 *     property+=Variable (ambiguity) '{' parameter+=ParameterInout
+	 *     property+=Variable (ambiguity) parameter+=ParameterInout
+	 *     signal+=Signal (ambiguity) '{' parameter+=ParameterInout
+	 *     signal+=Signal (ambiguity) parameter+=ParameterInout
+	 *     typedef+=TypeDefinition (ambiguity) '{' parameter+=ParameterInout
+	 *     typedef+=TypeDefinition (ambiguity) parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) '{' parameter+=ParameterInout
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? (ambiguity) parameter+=ParameterInout
+	 */
+	protected void emit_Statemachine_____InputKeyword_8_0_0_or_OutputKeyword_8_2_0_or_ReturnKeyword_8_3_0__a_InoutKeyword_8_1_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@protected:' | '@private:')* '@public:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferPublic (ambiguity) port+=PortPublic
+	 *     buffer+=BufferPublic (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelPublic (ambiguity) port+=PortPublic
+	 *     channel+=ChannelPublic (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferPublic
+	 *     port+=PortPublic (ambiguity) channel+=ChannelPublic
+	 *     port+=PortPublic (ambiguity) port+=PortPublic
+	 *     port+=PortPublic (ambiguity) property+=VariablePublic
+	 *     port+=PortPublic (ambiguity) signal+=SignalPublic
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferPublic
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelPublic
+	 *     property+=VariablePublic (ambiguity) port+=PortPublic
+	 *     property+=VariablePublic (ambiguity) property+=VariablePublic
+	 *     property+=VariablePublic (ambiguity) signal+=SignalPublic
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalPublic (ambiguity) port+=PortPublic
+	 *     signal+=SignalPublic (ambiguity) property+=VariablePublic
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@protected:' | '@private:')* '@public:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferPublic
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelPublic
+	 *     buffer+=Buffer (ambiguity) port+=PortPublic
+	 *     buffer+=Buffer (ambiguity) property+=VariablePublic
+	 *     buffer+=Buffer (ambiguity) signal+=SignalPublic
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortPublic
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferProtected (ambiguity) port+=PortPublic
+	 *     buffer+=BufferProtected (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferPublic
+	 *     channel+=Channel (ambiguity) channel+=ChannelPublic
+	 *     channel+=Channel (ambiguity) port+=PortPublic
+	 *     channel+=Channel (ambiguity) property+=VariablePublic
+	 *     channel+=Channel (ambiguity) signal+=SignalPublic
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortPublic
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelProtected (ambiguity) port+=PortPublic
+	 *     channel+=ChannelProtected (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferPublic
+	 *     port+=Port (ambiguity) channel+=ChannelPublic
+	 *     port+=Port (ambiguity) port+=PortPublic
+	 *     port+=Port (ambiguity) property+=VariablePublic
+	 *     port+=Port (ambiguity) signal+=SignalPublic
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferPublic
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelPublic
+	 *     port+=PortPrivate (ambiguity) port+=PortPublic
+	 *     port+=PortPrivate (ambiguity) property+=VariablePublic
+	 *     port+=PortPrivate (ambiguity) signal+=SignalPublic
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferPublic
+	 *     port+=PortProtected (ambiguity) channel+=ChannelPublic
+	 *     port+=PortProtected (ambiguity) port+=PortPublic
+	 *     port+=PortProtected (ambiguity) property+=VariablePublic
+	 *     port+=PortProtected (ambiguity) signal+=SignalPublic
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferPublic
+	 *     property+=Variable (ambiguity) channel+=ChannelPublic
+	 *     property+=Variable (ambiguity) port+=PortPublic
+	 *     property+=Variable (ambiguity) property+=VariablePublic
+	 *     property+=Variable (ambiguity) signal+=SignalPublic
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferPublic
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelPublic
+	 *     property+=VariablePrivate (ambiguity) port+=PortPublic
+	 *     property+=VariablePrivate (ambiguity) property+=VariablePublic
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalPublic
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferPublic
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelPublic
+	 *     property+=VariableProtected (ambiguity) port+=PortPublic
+	 *     property+=VariableProtected (ambiguity) property+=VariablePublic
+	 *     property+=VariableProtected (ambiguity) signal+=SignalPublic
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferPublic
+	 *     signal+=Signal (ambiguity) channel+=ChannelPublic
+	 *     signal+=Signal (ambiguity) port+=PortPublic
+	 *     signal+=Signal (ambiguity) property+=VariablePublic
+	 *     signal+=Signal (ambiguity) signal+=SignalPublic
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalPrivate (ambiguity) port+=PortPublic
+	 *     signal+=SignalPrivate (ambiguity) property+=VariablePublic
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalProtected (ambiguity) port+=PortPublic
+	 *     signal+=SignalProtected (ambiguity) property+=VariablePublic
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__a_PublicKeyword_9_1_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@protected:' | '@private:' | '@property:')? '@public:'?)*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' buffer+=Buffer
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' channel+=Channel
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' port+=Port
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' property+=Variable
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' signal+=Signal
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@public:'? (ambiguity) '@property:' typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0__q_PublicKeyword_9_1_0_q__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@private:')* '@protected:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferProtected (ambiguity) port+=PortProtected
+	 *     buffer+=BufferProtected (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelProtected (ambiguity) port+=PortProtected
+	 *     channel+=ChannelProtected (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferProtected
+	 *     port+=PortProtected (ambiguity) channel+=ChannelProtected
+	 *     port+=PortProtected (ambiguity) port+=PortProtected
+	 *     port+=PortProtected (ambiguity) property+=VariableProtected
+	 *     port+=PortProtected (ambiguity) signal+=SignalProtected
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferProtected
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelProtected
+	 *     property+=VariableProtected (ambiguity) port+=PortProtected
+	 *     property+=VariableProtected (ambiguity) property+=VariableProtected
+	 *     property+=VariableProtected (ambiguity) signal+=SignalProtected
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalProtected (ambiguity) port+=PortProtected
+	 *     signal+=SignalProtected (ambiguity) property+=VariableProtected
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@private:')* '@protected:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferProtected
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelProtected
+	 *     buffer+=Buffer (ambiguity) port+=PortProtected
+	 *     buffer+=Buffer (ambiguity) property+=VariableProtected
+	 *     buffer+=Buffer (ambiguity) signal+=SignalProtected
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortProtected
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferPublic (ambiguity) port+=PortProtected
+	 *     buffer+=BufferPublic (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferProtected
+	 *     channel+=Channel (ambiguity) channel+=ChannelProtected
+	 *     channel+=Channel (ambiguity) port+=PortProtected
+	 *     channel+=Channel (ambiguity) property+=VariableProtected
+	 *     channel+=Channel (ambiguity) signal+=SignalProtected
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortProtected
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelPublic (ambiguity) port+=PortProtected
+	 *     channel+=ChannelPublic (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferProtected
+	 *     port+=Port (ambiguity) channel+=ChannelProtected
+	 *     port+=Port (ambiguity) port+=PortProtected
+	 *     port+=Port (ambiguity) property+=VariableProtected
+	 *     port+=Port (ambiguity) signal+=SignalProtected
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferProtected
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelProtected
+	 *     port+=PortPrivate (ambiguity) port+=PortProtected
+	 *     port+=PortPrivate (ambiguity) property+=VariableProtected
+	 *     port+=PortPrivate (ambiguity) signal+=SignalProtected
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferProtected
+	 *     port+=PortPublic (ambiguity) channel+=ChannelProtected
+	 *     port+=PortPublic (ambiguity) port+=PortProtected
+	 *     port+=PortPublic (ambiguity) property+=VariableProtected
+	 *     port+=PortPublic (ambiguity) signal+=SignalProtected
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferProtected
+	 *     property+=Variable (ambiguity) channel+=ChannelProtected
+	 *     property+=Variable (ambiguity) port+=PortProtected
+	 *     property+=Variable (ambiguity) property+=VariableProtected
+	 *     property+=Variable (ambiguity) signal+=SignalProtected
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferProtected
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelProtected
+	 *     property+=VariablePrivate (ambiguity) port+=PortProtected
+	 *     property+=VariablePrivate (ambiguity) property+=VariableProtected
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalProtected
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferProtected
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelProtected
+	 *     property+=VariablePublic (ambiguity) port+=PortProtected
+	 *     property+=VariablePublic (ambiguity) property+=VariableProtected
+	 *     property+=VariablePublic (ambiguity) signal+=SignalProtected
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferProtected
+	 *     signal+=Signal (ambiguity) channel+=ChannelProtected
+	 *     signal+=Signal (ambiguity) port+=PortProtected
+	 *     signal+=Signal (ambiguity) property+=VariableProtected
+	 *     signal+=Signal (ambiguity) signal+=SignalProtected
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalPrivate (ambiguity) port+=PortProtected
+	 *     signal+=SignalPrivate (ambiguity) property+=VariableProtected
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalPublic (ambiguity) port+=PortProtected
+	 *     signal+=SignalPublic (ambiguity) property+=VariableProtected
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine_____PrivateKeyword_9_3_0_or_PropertyKeyword_9_0_0_or_PublicKeyword_9_1_0__a_ProtectedKeyword_9_2_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@public:' | '@protected:' | '@private:')* '@property:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=Buffer
+	 *     buffer+=Buffer (ambiguity) channel+=Channel
+	 *     buffer+=Buffer (ambiguity) port+=Port
+	 *     buffer+=Buffer (ambiguity) property+=Variable
+	 *     buffer+=Buffer (ambiguity) signal+=Signal
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=Buffer
+	 *     channel+=Channel (ambiguity) channel+=Channel
+	 *     channel+=Channel (ambiguity) port+=Port
+	 *     channel+=Channel (ambiguity) property+=Variable
+	 *     channel+=Channel (ambiguity) signal+=Signal
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=Buffer
+	 *     port+=Port (ambiguity) channel+=Channel
+	 *     port+=Port (ambiguity) port+=Port
+	 *     port+=Port (ambiguity) property+=Variable
+	 *     port+=Port (ambiguity) signal+=Signal
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=Buffer
+	 *     property+=Variable (ambiguity) channel+=Channel
+	 *     property+=Variable (ambiguity) port+=Port
+	 *     property+=Variable (ambiguity) property+=Variable
+	 *     property+=Variable (ambiguity) signal+=Signal
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=Buffer
+	 *     signal+=Signal (ambiguity) channel+=Channel
+	 *     signal+=Signal (ambiguity) port+=Port
+	 *     signal+=Signal (ambiguity) property+=Variable
+	 *     signal+=Signal (ambiguity) signal+=Signal
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@public:' | '@protected:' | '@private:')* '@property:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferPrivate (ambiguity) channel+=Channel
+	 *     buffer+=BufferPrivate (ambiguity) port+=Port
+	 *     buffer+=BufferPrivate (ambiguity) property+=Variable
+	 *     buffer+=BufferPrivate (ambiguity) signal+=Signal
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferProtected (ambiguity) channel+=Channel
+	 *     buffer+=BufferProtected (ambiguity) port+=Port
+	 *     buffer+=BufferProtected (ambiguity) property+=Variable
+	 *     buffer+=BufferProtected (ambiguity) signal+=Signal
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferPublic (ambiguity) channel+=Channel
+	 *     buffer+=BufferPublic (ambiguity) port+=Port
+	 *     buffer+=BufferPublic (ambiguity) property+=Variable
+	 *     buffer+=BufferPublic (ambiguity) signal+=Signal
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelPrivate (ambiguity) channel+=Channel
+	 *     channel+=ChannelPrivate (ambiguity) port+=Port
+	 *     channel+=ChannelPrivate (ambiguity) property+=Variable
+	 *     channel+=ChannelPrivate (ambiguity) signal+=Signal
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelProtected (ambiguity) channel+=Channel
+	 *     channel+=ChannelProtected (ambiguity) port+=Port
+	 *     channel+=ChannelProtected (ambiguity) property+=Variable
+	 *     channel+=ChannelProtected (ambiguity) signal+=Signal
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelPublic (ambiguity) channel+=Channel
+	 *     channel+=ChannelPublic (ambiguity) port+=Port
+	 *     channel+=ChannelPublic (ambiguity) property+=Variable
+	 *     channel+=ChannelPublic (ambiguity) signal+=Signal
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=Buffer
+	 *     port+=PortPrivate (ambiguity) channel+=Channel
+	 *     port+=PortPrivate (ambiguity) port+=Port
+	 *     port+=PortPrivate (ambiguity) property+=Variable
+	 *     port+=PortPrivate (ambiguity) signal+=Signal
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=Buffer
+	 *     port+=PortProtected (ambiguity) channel+=Channel
+	 *     port+=PortProtected (ambiguity) port+=Port
+	 *     port+=PortProtected (ambiguity) property+=Variable
+	 *     port+=PortProtected (ambiguity) signal+=Signal
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=Buffer
+	 *     port+=PortPublic (ambiguity) channel+=Channel
+	 *     port+=PortPublic (ambiguity) port+=Port
+	 *     port+=PortPublic (ambiguity) property+=Variable
+	 *     port+=PortPublic (ambiguity) signal+=Signal
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=Buffer
+	 *     property+=VariablePrivate (ambiguity) channel+=Channel
+	 *     property+=VariablePrivate (ambiguity) port+=Port
+	 *     property+=VariablePrivate (ambiguity) property+=Variable
+	 *     property+=VariablePrivate (ambiguity) signal+=Signal
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=Buffer
+	 *     property+=VariableProtected (ambiguity) channel+=Channel
+	 *     property+=VariableProtected (ambiguity) port+=Port
+	 *     property+=VariableProtected (ambiguity) property+=Variable
+	 *     property+=VariableProtected (ambiguity) signal+=Signal
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=Buffer
+	 *     property+=VariablePublic (ambiguity) channel+=Channel
+	 *     property+=VariablePublic (ambiguity) port+=Port
+	 *     property+=VariablePublic (ambiguity) property+=Variable
+	 *     property+=VariablePublic (ambiguity) signal+=Signal
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=Buffer
+	 *     signal+=SignalPrivate (ambiguity) channel+=Channel
+	 *     signal+=SignalPrivate (ambiguity) port+=Port
+	 *     signal+=SignalPrivate (ambiguity) property+=Variable
+	 *     signal+=SignalPrivate (ambiguity) signal+=Signal
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=Buffer
+	 *     signal+=SignalProtected (ambiguity) channel+=Channel
+	 *     signal+=SignalProtected (ambiguity) port+=Port
+	 *     signal+=SignalProtected (ambiguity) property+=Variable
+	 *     signal+=SignalProtected (ambiguity) signal+=Signal
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=Buffer
+	 *     signal+=SignalPublic (ambiguity) channel+=Channel
+	 *     signal+=SignalPublic (ambiguity) port+=Port
+	 *     signal+=SignalPublic (ambiguity) property+=Variable
+	 *     signal+=SignalPublic (ambiguity) signal+=Signal
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PropertyKeyword_9_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@public:' | '@protected:' | '@private:')? '@property:'?)*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     buffer+=Buffer ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     channel+=Channel ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     name=ESIdentifier '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterInout ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterInput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterOutput ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn '}' ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     parameter+=ParameterReturn ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     port+=Port ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     property+=Variable ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     signal+=Signal ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     typedef+=TypeDefinition ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' buffer+=BufferPrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' channel+=ChannelPrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' port+=PortPrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' property+=VariablePrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' signal+=SignalPrivate
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@private:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@procedure:' procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' buffer+=BufferProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' channel+=ChannelProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' port+=PortProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' property+=VariableProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' signal+=SignalProtected
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@protected:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' buffer+=BufferPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' channel+=ChannelPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' port+=PortPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' property+=VariablePublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' signal+=SignalPublic
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) '@public:' typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegion
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) region+=StatemachineRegionLite
+	 *     unrestrictedName=UnrestrictedName '{' '@parameter:'? ('@input:' | '@inout:' | '@output:' | '@return:')* '@property:'? (ambiguity) routine+=Routine
+	 */
+	protected void emit_Statemachine_____PrivateKeyword_9_3_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__q_PropertyKeyword_9_0_0_q__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@protected:')* '@private:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortPrivate (ambiguity) port+=PortPrivate
+	 *     port+=PortPrivate (ambiguity) property+=VariablePrivate
+	 *     port+=PortPrivate (ambiguity) signal+=SignalPrivate
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariablePrivate (ambiguity) port+=PortPrivate
+	 *     property+=VariablePrivate (ambiguity) property+=VariablePrivate
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalPrivate
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalPrivate (ambiguity) port+=PortPrivate
+	 *     signal+=SignalPrivate (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@protected:')* '@private:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=Buffer (ambiguity) port+=PortPrivate
+	 *     buffer+=Buffer (ambiguity) property+=VariablePrivate
+	 *     buffer+=Buffer (ambiguity) signal+=SignalPrivate
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferProtected (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferProtected (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferPublic (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferPublic (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferPrivate
+	 *     channel+=Channel (ambiguity) channel+=ChannelPrivate
+	 *     channel+=Channel (ambiguity) port+=PortPrivate
+	 *     channel+=Channel (ambiguity) property+=VariablePrivate
+	 *     channel+=Channel (ambiguity) signal+=SignalPrivate
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelProtected (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelProtected (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelPublic (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelPublic (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferPrivate
+	 *     port+=Port (ambiguity) channel+=ChannelPrivate
+	 *     port+=Port (ambiguity) port+=PortPrivate
+	 *     port+=Port (ambiguity) property+=VariablePrivate
+	 *     port+=Port (ambiguity) signal+=SignalPrivate
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortProtected (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortProtected (ambiguity) port+=PortPrivate
+	 *     port+=PortProtected (ambiguity) property+=VariablePrivate
+	 *     port+=PortProtected (ambiguity) signal+=SignalPrivate
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortPublic (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortPublic (ambiguity) port+=PortPrivate
+	 *     port+=PortPublic (ambiguity) property+=VariablePrivate
+	 *     port+=PortPublic (ambiguity) signal+=SignalPrivate
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferPrivate
+	 *     property+=Variable (ambiguity) channel+=ChannelPrivate
+	 *     property+=Variable (ambiguity) port+=PortPrivate
+	 *     property+=Variable (ambiguity) property+=VariablePrivate
+	 *     property+=Variable (ambiguity) signal+=SignalPrivate
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariableProtected (ambiguity) port+=PortPrivate
+	 *     property+=VariableProtected (ambiguity) property+=VariablePrivate
+	 *     property+=VariableProtected (ambiguity) signal+=SignalPrivate
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariablePublic (ambiguity) port+=PortPrivate
+	 *     property+=VariablePublic (ambiguity) property+=VariablePrivate
+	 *     property+=VariablePublic (ambiguity) signal+=SignalPrivate
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferPrivate
+	 *     signal+=Signal (ambiguity) channel+=ChannelPrivate
+	 *     signal+=Signal (ambiguity) port+=PortPrivate
+	 *     signal+=Signal (ambiguity) property+=VariablePrivate
+	 *     signal+=Signal (ambiguity) signal+=SignalPrivate
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalProtected (ambiguity) port+=PortPrivate
+	 *     signal+=SignalProtected (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalPublic (ambiguity) port+=PortPrivate
+	 *     signal+=SignalPublic (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_Statemachine_____PropertyKeyword_9_0_0_or_ProtectedKeyword_9_2_0_or_PublicKeyword_9_1_0__a_PrivateKeyword_9_3_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@behavior:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     behavior+=Behavior (ambiguity) behavior+=Behavior
+	 */
+	protected void emit_System_BehaviorKeyword_10_0_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@composite:' | '@machine:'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     instance+=InstanceMachine '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     instance+=InstanceMachine '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     procedure+=Procedure '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     procedure+=Procedure '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     routine+=Routine '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     routine+=Routine '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_System_CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@routine:' | '@macro:'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     procedure+=Procedure (ambiguity) routine+=Routine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) routine+=Routine
+	 */
+	protected void emit_System_MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@model:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         ('@property:' | '@public:' | '@protected:' | '@private:')* 
+	 *         (ambiguity) 
+	 *         (('@prototype:' | '@instance:')? (ambiguity))* 
+	 *         ('@composite:' | '@machine:') 
+	 *         instance+=InstanceMachine
+	 *     )
+	 *     (
+	 *         unrestrictedName=UnrestrictedName 
+	 *         '{' 
+	 *         ('@property:' | '@public:' | '@protected:' | '@private:')* 
+	 *         (ambiguity) 
+	 *         (('@prototype:' | '@instance:')? (ambiguity))* 
+	 *         ('@composite:' | '@machine:') 
+	 *         machine+=AnyMachineBlock
+	 *     )
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     instance+=InstanceMachine (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     instance+=InstanceMachine (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     procedure+=Procedure (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     procedure+=Procedure (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     routine+=Routine (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     routine+=Routine (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@prototype:')? (ambiguity))* '@prototype:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@behavior:' behavior+=Behavior
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@instance:' instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* '@statemachine:' behavior+=Statemachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@prototype:' | '@instance:')? (ambiguity))* main=MoeBehavior
+	 */
+	protected void emit_System_ModelKeyword_9_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@procedure:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     procedure+=Procedure (ambiguity) procedure+=Procedure
+	 */
+	protected void emit_System_ProcedureKeyword_8_0_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@prototype:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* (ambiguity) (('@instance:' | '@model:')? (ambiguity))* '@model:' machine+=AnyMachineBlock
+	 */
+	protected void emit_System_PrototypeKeyword_9_2_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@statemachine:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     behavior+=Statemachine (ambiguity) behavior+=Statemachine
+	 */
+	protected void emit_System_StatemachineKeyword_10_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@model:' | '@prototype:' | '@instance:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) '@behavior:' behavior+=Behavior
+	 *     instance+=InstanceMachine (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     instance+=InstanceMachine (ambiguity) main=MoeBehavior
+	 *     machine+=AnyMachineBlock (ambiguity) '@behavior:' behavior+=Behavior
+	 *     machine+=AnyMachineBlock (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     machine+=AnyMachineBlock (ambiguity) main=MoeBehavior
+	 *     procedure+=Procedure (ambiguity) '@behavior:' behavior+=Behavior
+	 *     procedure+=Procedure (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     procedure+=Procedure (ambiguity) main=MoeBehavior
+	 *     routine+=Routine (ambiguity) '@behavior:' behavior+=Behavior
+	 *     routine+=Routine (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     routine+=Routine (ambiguity) main=MoeBehavior
+	 */
+	protected void emit_System___InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('<' 'moc:'? ('and' | 'or') '>')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'system' (ambiguity) name=ESIdentifier
+	 *     input_enabled?='input_enabled' 'system' (ambiguity) name=ESIdentifier
+	 *     timed?='timed' 'system' (ambiguity) name=ESIdentifier
+	 *     visibility=VisibilityKind 'system' (ambiguity) name=ESIdentifier
+	 */
+	protected void emit_System___LessThanSignKeyword_2_0_MocKeyword_2_1_q___AndKeyword_2_2_0_or_OrKeyword_2_2_1___GreaterThanSignKeyword_2_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@routine:' | '@macro:')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     routine+=Routine (ambiguity) routine+=Routine
+	 */
+	protected void emit_System___MacroKeyword_8_0_0_0_1_or_RoutineKeyword_8_0_0_0_0__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:'))?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) instance+=InstanceMachine
+	 *     instance+=InstanceMachine (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_System___ModelKeyword_9_1_0_q_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a___CompositeKeyword_9_0_0_0_or_MachineKeyword_9_0_0_1____q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@property:' | '@public:' | '@protected:' | '@private:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=Buffer (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     buffer+=Buffer (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=Buffer (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=Buffer (ambiguity) procedure+=Procedure
+	 *     buffer+=Buffer (ambiguity) routine+=Routine
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     buffer+=BufferPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferPrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferPrivate (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferPrivate (ambiguity) routine+=Routine
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     buffer+=BufferProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferProtected (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferProtected (ambiguity) routine+=Routine
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     buffer+=BufferPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     buffer+=BufferPublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     buffer+=BufferPublic (ambiguity) procedure+=Procedure
+	 *     buffer+=BufferPublic (ambiguity) routine+=Routine
+	 *     channel+=Channel (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=Channel (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     channel+=Channel (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=Channel (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     channel+=Channel (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=Channel (ambiguity) procedure+=Procedure
+	 *     channel+=Channel (ambiguity) routine+=Routine
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     channel+=ChannelPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelPrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelPrivate (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelPrivate (ambiguity) routine+=Routine
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     channel+=ChannelProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelProtected (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelProtected (ambiguity) routine+=Routine
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     channel+=ChannelPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     channel+=ChannelPublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     channel+=ChannelPublic (ambiguity) procedure+=Procedure
+	 *     channel+=ChannelPublic (ambiguity) routine+=Routine
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     name=ESIdentifier '{' (ambiguity) '@procedure:' procedure+=Procedure
+	 *     name=ESIdentifier '{' (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     name=ESIdentifier '{' (ambiguity) procedure+=Procedure
+	 *     name=ESIdentifier '{' (ambiguity) routine+=Routine
+	 *     port+=Port (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=Port (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     port+=Port (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=Port (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     port+=Port (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=Port (ambiguity) procedure+=Procedure
+	 *     port+=Port (ambiguity) routine+=Routine
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     port+=PortPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortPrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortPrivate (ambiguity) procedure+=Procedure
+	 *     port+=PortPrivate (ambiguity) routine+=Routine
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     port+=PortProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortProtected (ambiguity) procedure+=Procedure
+	 *     port+=PortProtected (ambiguity) routine+=Routine
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     port+=PortPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     port+=PortPublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     port+=PortPublic (ambiguity) procedure+=Procedure
+	 *     port+=PortPublic (ambiguity) routine+=Routine
+	 *     property+=Variable (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     property+=Variable (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=Variable (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     property+=Variable (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=Variable (ambiguity) procedure+=Procedure
+	 *     property+=Variable (ambiguity) routine+=Routine
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     property+=VariablePrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariablePrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariablePrivate (ambiguity) procedure+=Procedure
+	 *     property+=VariablePrivate (ambiguity) routine+=Routine
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariableProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     property+=VariableProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariableProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariableProtected (ambiguity) procedure+=Procedure
+	 *     property+=VariableProtected (ambiguity) routine+=Routine
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     property+=VariablePublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     property+=VariablePublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     property+=VariablePublic (ambiguity) procedure+=Procedure
+	 *     property+=VariablePublic (ambiguity) routine+=Routine
+	 *     signal+=Signal (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     signal+=Signal (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=Signal (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     signal+=Signal (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=Signal (ambiguity) procedure+=Procedure
+	 *     signal+=Signal (ambiguity) routine+=Routine
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     signal+=SignalPrivate (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalPrivate (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalPrivate (ambiguity) procedure+=Procedure
+	 *     signal+=SignalPrivate (ambiguity) routine+=Routine
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalProtected (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     signal+=SignalProtected (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalProtected (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalProtected (ambiguity) procedure+=Procedure
+	 *     signal+=SignalProtected (ambiguity) routine+=Routine
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPublic (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     signal+=SignalPublic (ambiguity) '@procedure:' procedure+=Procedure
+	 *     signal+=SignalPublic (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     signal+=SignalPublic (ambiguity) procedure+=Procedure
+	 *     signal+=SignalPublic (ambiguity) routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     typedef+=TypeDefinition (ambiguity) '@procedure:' procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     typedef+=TypeDefinition (ambiguity) procedure+=Procedure
+	 *     typedef+=TypeDefinition (ambiguity) routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@instance:' | '@prototype:')? '@model:'?)* '@prototype:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@behavior:' behavior+=Behavior
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@instance:' instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* '@statemachine:' behavior+=Statemachine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@model:'? (('@prototype:' | '@instance:')? '@model:'?)* main=MoeBehavior
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@procedure:' procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@prototype:'? (('@instance:' | '@model:')? '@prototype:'?)* '@model:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) ('@routine:' | '@macro:') routine+=Routine
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) procedure+=Procedure
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) routine+=Routine
+	 */
+	protected void emit_System___PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@model:' | '@instance:')* '@prototype:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@model:' | '@instance:')* '@prototype:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 *     procedure+=Procedure (ambiguity) machine+=AnyMachineBlock
+	 *     routine+=Routine (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__a_PrototypeKeyword_9_2_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@instance:' | '@model:')? '@prototype:'?)*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@prototype:'? (ambiguity) '@model:' machine+=AnyMachineBlock
+	 */
+	protected void emit_System_____InstanceKeyword_9_3_0_or_ModelKeyword_9_1_0__q_PrototypeKeyword_9_2_0_q__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@prototype:' | '@instance:')* '@model:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@prototype:' | '@instance:')* '@model:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock (ambiguity) machine+=AnyMachineBlock
+	 *     procedure+=Procedure (ambiguity) machine+=AnyMachineBlock
+	 *     routine+=Routine (ambiguity) machine+=AnyMachineBlock
+	 */
+	protected void emit_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__a_ModelKeyword_9_1_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@prototype:' | '@instance:')? '@model:'?)*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=Buffer ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     buffer+=BufferPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=Channel ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     channel+=ChannelPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     instance+=InstanceMachine '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     instance+=InstanceMachine '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     machine+=AnyMachineBlock '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     name=ESIdentifier '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=Port ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     port+=PortPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     procedure+=Procedure '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     procedure+=Procedure '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=Variable ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariableProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     property+=VariablePublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     routine+=Routine '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     routine+=Routine '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=Signal ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPrivate ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalProtected ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     signal+=SignalPublic ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     typedef+=TypeDefinition ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@behavior:' behavior+=Behavior
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@instance:' instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@prototype:' machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) '@statemachine:' behavior+=Statemachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') instance+=InstanceMachine
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) ('@composite:' | '@machine:') machine+=AnyMachineBlock
+	 *     unrestrictedName=UnrestrictedName '{' ('@property:' | '@public:' | '@protected:' | '@private:')* '@model:'? (ambiguity) main=MoeBehavior
+	 */
+	protected void emit_System_____InstanceKeyword_9_3_0_or_PrototypeKeyword_9_2_0__q_ModelKeyword_9_1_0_q__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@model:' | '@prototype:')* '@instance:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) instance+=InstanceMachine
+	 */
+	protected void emit_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@model:' | '@prototype:')* '@instance:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     instance+=InstanceMachine (ambiguity) instance+=InstanceMachine
+	 *     machine+=AnyMachineBlock (ambiguity) instance+=InstanceMachine
+	 *     procedure+=Procedure (ambiguity) instance+=InstanceMachine
+	 *     routine+=Routine (ambiguity) instance+=InstanceMachine
+	 */
+	protected void emit_System_____ModelKeyword_9_1_0_or_PrototypeKeyword_9_2_0__a_InstanceKeyword_9_3_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@protected:' | '@private:')* '@public:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferPublic (ambiguity) port+=PortPublic
+	 *     buffer+=BufferPublic (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelPublic (ambiguity) port+=PortPublic
+	 *     channel+=ChannelPublic (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferPublic
+	 *     port+=PortPublic (ambiguity) channel+=ChannelPublic
+	 *     port+=PortPublic (ambiguity) port+=PortPublic
+	 *     port+=PortPublic (ambiguity) property+=VariablePublic
+	 *     port+=PortPublic (ambiguity) signal+=SignalPublic
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferPublic
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelPublic
+	 *     property+=VariablePublic (ambiguity) port+=PortPublic
+	 *     property+=VariablePublic (ambiguity) property+=VariablePublic
+	 *     property+=VariablePublic (ambiguity) signal+=SignalPublic
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalPublic (ambiguity) port+=PortPublic
+	 *     signal+=SignalPublic (ambiguity) property+=VariablePublic
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@protected:' | '@private:')* '@public:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferPublic
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelPublic
+	 *     buffer+=Buffer (ambiguity) port+=PortPublic
+	 *     buffer+=Buffer (ambiguity) property+=VariablePublic
+	 *     buffer+=Buffer (ambiguity) signal+=SignalPublic
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortPublic
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferPublic
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelPublic
+	 *     buffer+=BufferProtected (ambiguity) port+=PortPublic
+	 *     buffer+=BufferProtected (ambiguity) property+=VariablePublic
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalPublic
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferPublic
+	 *     channel+=Channel (ambiguity) channel+=ChannelPublic
+	 *     channel+=Channel (ambiguity) port+=PortPublic
+	 *     channel+=Channel (ambiguity) property+=VariablePublic
+	 *     channel+=Channel (ambiguity) signal+=SignalPublic
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortPublic
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferPublic
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelPublic
+	 *     channel+=ChannelProtected (ambiguity) port+=PortPublic
+	 *     channel+=ChannelProtected (ambiguity) property+=VariablePublic
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalPublic
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) buffer+=BufferPublic
+	 *     name=ESIdentifier '{' (ambiguity) channel+=ChannelPublic
+	 *     name=ESIdentifier '{' (ambiguity) port+=PortPublic
+	 *     name=ESIdentifier '{' (ambiguity) property+=VariablePublic
+	 *     name=ESIdentifier '{' (ambiguity) signal+=SignalPublic
+	 *     name=ESIdentifier '{' (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferPublic
+	 *     port+=Port (ambiguity) channel+=ChannelPublic
+	 *     port+=Port (ambiguity) port+=PortPublic
+	 *     port+=Port (ambiguity) property+=VariablePublic
+	 *     port+=Port (ambiguity) signal+=SignalPublic
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferPublic
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelPublic
+	 *     port+=PortPrivate (ambiguity) port+=PortPublic
+	 *     port+=PortPrivate (ambiguity) property+=VariablePublic
+	 *     port+=PortPrivate (ambiguity) signal+=SignalPublic
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferPublic
+	 *     port+=PortProtected (ambiguity) channel+=ChannelPublic
+	 *     port+=PortProtected (ambiguity) port+=PortPublic
+	 *     port+=PortProtected (ambiguity) property+=VariablePublic
+	 *     port+=PortProtected (ambiguity) signal+=SignalPublic
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferPublic
+	 *     property+=Variable (ambiguity) channel+=ChannelPublic
+	 *     property+=Variable (ambiguity) port+=PortPublic
+	 *     property+=Variable (ambiguity) property+=VariablePublic
+	 *     property+=Variable (ambiguity) signal+=SignalPublic
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferPublic
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelPublic
+	 *     property+=VariablePrivate (ambiguity) port+=PortPublic
+	 *     property+=VariablePrivate (ambiguity) property+=VariablePublic
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalPublic
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferPublic
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelPublic
+	 *     property+=VariableProtected (ambiguity) port+=PortPublic
+	 *     property+=VariableProtected (ambiguity) property+=VariablePublic
+	 *     property+=VariableProtected (ambiguity) signal+=SignalPublic
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferPublic
+	 *     signal+=Signal (ambiguity) channel+=ChannelPublic
+	 *     signal+=Signal (ambiguity) port+=PortPublic
+	 *     signal+=Signal (ambiguity) property+=VariablePublic
+	 *     signal+=Signal (ambiguity) signal+=SignalPublic
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalPrivate (ambiguity) port+=PortPublic
+	 *     signal+=SignalPrivate (ambiguity) property+=VariablePublic
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferPublic
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelPublic
+	 *     signal+=SignalProtected (ambiguity) port+=PortPublic
+	 *     signal+=SignalProtected (ambiguity) property+=VariablePublic
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalPublic
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPublic
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPublic
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPublic
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePublic
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPublic
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) buffer+=BufferPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) channel+=ChannelPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) port+=PortPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) property+=VariablePublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) signal+=SignalPublic
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0__a_PublicKeyword_7_1_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@private:')* '@protected:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferProtected (ambiguity) port+=PortProtected
+	 *     buffer+=BufferProtected (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelProtected (ambiguity) port+=PortProtected
+	 *     channel+=ChannelProtected (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferProtected
+	 *     port+=PortProtected (ambiguity) channel+=ChannelProtected
+	 *     port+=PortProtected (ambiguity) port+=PortProtected
+	 *     port+=PortProtected (ambiguity) property+=VariableProtected
+	 *     port+=PortProtected (ambiguity) signal+=SignalProtected
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferProtected
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelProtected
+	 *     property+=VariableProtected (ambiguity) port+=PortProtected
+	 *     property+=VariableProtected (ambiguity) property+=VariableProtected
+	 *     property+=VariableProtected (ambiguity) signal+=SignalProtected
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalProtected (ambiguity) port+=PortProtected
+	 *     signal+=SignalProtected (ambiguity) property+=VariableProtected
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@private:')* '@protected:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferProtected
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelProtected
+	 *     buffer+=Buffer (ambiguity) port+=PortProtected
+	 *     buffer+=Buffer (ambiguity) property+=VariableProtected
+	 *     buffer+=Buffer (ambiguity) signal+=SignalProtected
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortProtected
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferProtected
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelProtected
+	 *     buffer+=BufferPublic (ambiguity) port+=PortProtected
+	 *     buffer+=BufferPublic (ambiguity) property+=VariableProtected
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalProtected
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferProtected
+	 *     channel+=Channel (ambiguity) channel+=ChannelProtected
+	 *     channel+=Channel (ambiguity) port+=PortProtected
+	 *     channel+=Channel (ambiguity) property+=VariableProtected
+	 *     channel+=Channel (ambiguity) signal+=SignalProtected
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortProtected
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferProtected
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelProtected
+	 *     channel+=ChannelPublic (ambiguity) port+=PortProtected
+	 *     channel+=ChannelPublic (ambiguity) property+=VariableProtected
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalProtected
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) buffer+=BufferProtected
+	 *     name=ESIdentifier '{' (ambiguity) channel+=ChannelProtected
+	 *     name=ESIdentifier '{' (ambiguity) port+=PortProtected
+	 *     name=ESIdentifier '{' (ambiguity) property+=VariableProtected
+	 *     name=ESIdentifier '{' (ambiguity) signal+=SignalProtected
+	 *     name=ESIdentifier '{' (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferProtected
+	 *     port+=Port (ambiguity) channel+=ChannelProtected
+	 *     port+=Port (ambiguity) port+=PortProtected
+	 *     port+=Port (ambiguity) property+=VariableProtected
+	 *     port+=Port (ambiguity) signal+=SignalProtected
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferProtected
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelProtected
+	 *     port+=PortPrivate (ambiguity) port+=PortProtected
+	 *     port+=PortPrivate (ambiguity) property+=VariableProtected
+	 *     port+=PortPrivate (ambiguity) signal+=SignalProtected
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferProtected
+	 *     port+=PortPublic (ambiguity) channel+=ChannelProtected
+	 *     port+=PortPublic (ambiguity) port+=PortProtected
+	 *     port+=PortPublic (ambiguity) property+=VariableProtected
+	 *     port+=PortPublic (ambiguity) signal+=SignalProtected
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferProtected
+	 *     property+=Variable (ambiguity) channel+=ChannelProtected
+	 *     property+=Variable (ambiguity) port+=PortProtected
+	 *     property+=Variable (ambiguity) property+=VariableProtected
+	 *     property+=Variable (ambiguity) signal+=SignalProtected
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferProtected
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelProtected
+	 *     property+=VariablePrivate (ambiguity) port+=PortProtected
+	 *     property+=VariablePrivate (ambiguity) property+=VariableProtected
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalProtected
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferProtected
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelProtected
+	 *     property+=VariablePublic (ambiguity) port+=PortProtected
+	 *     property+=VariablePublic (ambiguity) property+=VariableProtected
+	 *     property+=VariablePublic (ambiguity) signal+=SignalProtected
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferProtected
+	 *     signal+=Signal (ambiguity) channel+=ChannelProtected
+	 *     signal+=Signal (ambiguity) port+=PortProtected
+	 *     signal+=Signal (ambiguity) property+=VariableProtected
+	 *     signal+=Signal (ambiguity) signal+=SignalProtected
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalPrivate (ambiguity) port+=PortProtected
+	 *     signal+=SignalPrivate (ambiguity) property+=VariableProtected
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferProtected
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelProtected
+	 *     signal+=SignalPublic (ambiguity) port+=PortProtected
+	 *     signal+=SignalPublic (ambiguity) property+=VariableProtected
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalProtected
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferProtected
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelProtected
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortProtected
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariableProtected
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalProtected
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) buffer+=BufferProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) channel+=ChannelProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) port+=PortProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) property+=VariableProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) signal+=SignalProtected
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_System_____PrivateKeyword_7_3_0_or_PropertyKeyword_7_0_0_or_PublicKeyword_7_1_0__a_ProtectedKeyword_7_2_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@public:' | '@protected:' | '@private:')* '@property:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=Buffer
+	 *     buffer+=Buffer (ambiguity) channel+=Channel
+	 *     buffer+=Buffer (ambiguity) port+=Port
+	 *     buffer+=Buffer (ambiguity) property+=Variable
+	 *     buffer+=Buffer (ambiguity) signal+=Signal
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=Buffer
+	 *     channel+=Channel (ambiguity) channel+=Channel
+	 *     channel+=Channel (ambiguity) port+=Port
+	 *     channel+=Channel (ambiguity) property+=Variable
+	 *     channel+=Channel (ambiguity) signal+=Signal
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=Buffer
+	 *     port+=Port (ambiguity) channel+=Channel
+	 *     port+=Port (ambiguity) port+=Port
+	 *     port+=Port (ambiguity) property+=Variable
+	 *     port+=Port (ambiguity) signal+=Signal
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=Buffer
+	 *     property+=Variable (ambiguity) channel+=Channel
+	 *     property+=Variable (ambiguity) port+=Port
+	 *     property+=Variable (ambiguity) property+=Variable
+	 *     property+=Variable (ambiguity) signal+=Signal
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=Buffer
+	 *     signal+=Signal (ambiguity) channel+=Channel
+	 *     signal+=Signal (ambiguity) port+=Port
+	 *     signal+=Signal (ambiguity) property+=Variable
+	 *     signal+=Signal (ambiguity) signal+=Signal
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@public:' | '@protected:' | '@private:')* '@property:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=Buffer
+	 *     buffer+=Buffer (ambiguity) channel+=Channel
+	 *     buffer+=Buffer (ambiguity) port+=Port
+	 *     buffer+=Buffer (ambiguity) property+=Variable
+	 *     buffer+=Buffer (ambiguity) signal+=Signal
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferPrivate (ambiguity) channel+=Channel
+	 *     buffer+=BufferPrivate (ambiguity) port+=Port
+	 *     buffer+=BufferPrivate (ambiguity) property+=Variable
+	 *     buffer+=BufferPrivate (ambiguity) signal+=Signal
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferProtected (ambiguity) channel+=Channel
+	 *     buffer+=BufferProtected (ambiguity) port+=Port
+	 *     buffer+=BufferProtected (ambiguity) property+=Variable
+	 *     buffer+=BufferProtected (ambiguity) signal+=Signal
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=Buffer
+	 *     buffer+=BufferPublic (ambiguity) channel+=Channel
+	 *     buffer+=BufferPublic (ambiguity) port+=Port
+	 *     buffer+=BufferPublic (ambiguity) property+=Variable
+	 *     buffer+=BufferPublic (ambiguity) signal+=Signal
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=Buffer
+	 *     channel+=Channel (ambiguity) channel+=Channel
+	 *     channel+=Channel (ambiguity) port+=Port
+	 *     channel+=Channel (ambiguity) property+=Variable
+	 *     channel+=Channel (ambiguity) signal+=Signal
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelPrivate (ambiguity) channel+=Channel
+	 *     channel+=ChannelPrivate (ambiguity) port+=Port
+	 *     channel+=ChannelPrivate (ambiguity) property+=Variable
+	 *     channel+=ChannelPrivate (ambiguity) signal+=Signal
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelProtected (ambiguity) channel+=Channel
+	 *     channel+=ChannelProtected (ambiguity) port+=Port
+	 *     channel+=ChannelProtected (ambiguity) property+=Variable
+	 *     channel+=ChannelProtected (ambiguity) signal+=Signal
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=Buffer
+	 *     channel+=ChannelPublic (ambiguity) channel+=Channel
+	 *     channel+=ChannelPublic (ambiguity) port+=Port
+	 *     channel+=ChannelPublic (ambiguity) property+=Variable
+	 *     channel+=ChannelPublic (ambiguity) signal+=Signal
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) buffer+=Buffer
+	 *     name=ESIdentifier '{' (ambiguity) channel+=Channel
+	 *     name=ESIdentifier '{' (ambiguity) port+=Port
+	 *     name=ESIdentifier '{' (ambiguity) property+=Variable
+	 *     name=ESIdentifier '{' (ambiguity) signal+=Signal
+	 *     name=ESIdentifier '{' (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=Buffer
+	 *     port+=Port (ambiguity) channel+=Channel
+	 *     port+=Port (ambiguity) port+=Port
+	 *     port+=Port (ambiguity) property+=Variable
+	 *     port+=Port (ambiguity) signal+=Signal
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=Buffer
+	 *     port+=PortPrivate (ambiguity) channel+=Channel
+	 *     port+=PortPrivate (ambiguity) port+=Port
+	 *     port+=PortPrivate (ambiguity) property+=Variable
+	 *     port+=PortPrivate (ambiguity) signal+=Signal
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=Buffer
+	 *     port+=PortProtected (ambiguity) channel+=Channel
+	 *     port+=PortProtected (ambiguity) port+=Port
+	 *     port+=PortProtected (ambiguity) property+=Variable
+	 *     port+=PortProtected (ambiguity) signal+=Signal
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=Buffer
+	 *     port+=PortPublic (ambiguity) channel+=Channel
+	 *     port+=PortPublic (ambiguity) port+=Port
+	 *     port+=PortPublic (ambiguity) property+=Variable
+	 *     port+=PortPublic (ambiguity) signal+=Signal
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=Buffer
+	 *     property+=Variable (ambiguity) channel+=Channel
+	 *     property+=Variable (ambiguity) port+=Port
+	 *     property+=Variable (ambiguity) property+=Variable
+	 *     property+=Variable (ambiguity) signal+=Signal
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=Buffer
+	 *     property+=VariablePrivate (ambiguity) channel+=Channel
+	 *     property+=VariablePrivate (ambiguity) port+=Port
+	 *     property+=VariablePrivate (ambiguity) property+=Variable
+	 *     property+=VariablePrivate (ambiguity) signal+=Signal
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=Buffer
+	 *     property+=VariableProtected (ambiguity) channel+=Channel
+	 *     property+=VariableProtected (ambiguity) port+=Port
+	 *     property+=VariableProtected (ambiguity) property+=Variable
+	 *     property+=VariableProtected (ambiguity) signal+=Signal
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=Buffer
+	 *     property+=VariablePublic (ambiguity) channel+=Channel
+	 *     property+=VariablePublic (ambiguity) port+=Port
+	 *     property+=VariablePublic (ambiguity) property+=Variable
+	 *     property+=VariablePublic (ambiguity) signal+=Signal
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=Buffer
+	 *     signal+=Signal (ambiguity) channel+=Channel
+	 *     signal+=Signal (ambiguity) port+=Port
+	 *     signal+=Signal (ambiguity) property+=Variable
+	 *     signal+=Signal (ambiguity) signal+=Signal
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=Buffer
+	 *     signal+=SignalPrivate (ambiguity) channel+=Channel
+	 *     signal+=SignalPrivate (ambiguity) port+=Port
+	 *     signal+=SignalPrivate (ambiguity) property+=Variable
+	 *     signal+=SignalPrivate (ambiguity) signal+=Signal
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=Buffer
+	 *     signal+=SignalProtected (ambiguity) channel+=Channel
+	 *     signal+=SignalProtected (ambiguity) port+=Port
+	 *     signal+=SignalProtected (ambiguity) property+=Variable
+	 *     signal+=SignalProtected (ambiguity) signal+=Signal
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=Buffer
+	 *     signal+=SignalPublic (ambiguity) channel+=Channel
+	 *     signal+=SignalPublic (ambiguity) port+=Port
+	 *     signal+=SignalPublic (ambiguity) property+=Variable
+	 *     signal+=SignalPublic (ambiguity) signal+=Signal
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=Buffer
+	 *     typedef+=TypeDefinition (ambiguity) channel+=Channel
+	 *     typedef+=TypeDefinition (ambiguity) port+=Port
+	 *     typedef+=TypeDefinition (ambiguity) property+=Variable
+	 *     typedef+=TypeDefinition (ambiguity) signal+=Signal
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) buffer+=Buffer
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) channel+=Channel
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) port+=Port
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) property+=Variable
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) signal+=Signal
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_System_____PrivateKeyword_7_3_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PropertyKeyword_7_0_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@protected:')* '@private:')*
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=BufferPrivate (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferPrivate (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferPrivate (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferPrivate (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferPrivate (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferPrivate (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPrivate (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelPrivate (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelPrivate (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelPrivate (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelPrivate (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelPrivate (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPrivate (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortPrivate (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortPrivate (ambiguity) port+=PortPrivate
+	 *     port+=PortPrivate (ambiguity) property+=VariablePrivate
+	 *     port+=PortPrivate (ambiguity) signal+=SignalPrivate
+	 *     port+=PortPrivate (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePrivate (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariablePrivate (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariablePrivate (ambiguity) port+=PortPrivate
+	 *     property+=VariablePrivate (ambiguity) property+=VariablePrivate
+	 *     property+=VariablePrivate (ambiguity) signal+=SignalPrivate
+	 *     property+=VariablePrivate (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPrivate (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalPrivate (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalPrivate (ambiguity) port+=PortPrivate
+	 *     signal+=SignalPrivate (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalPrivate (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalPrivate (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     (('@property:' | '@public:' | '@protected:')* '@private:')+
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     buffer+=Buffer (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=Buffer (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=Buffer (ambiguity) port+=PortPrivate
+	 *     buffer+=Buffer (ambiguity) property+=VariablePrivate
+	 *     buffer+=Buffer (ambiguity) signal+=SignalPrivate
+	 *     buffer+=Buffer (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferProtected (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferProtected (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferProtected (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferProtected (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferProtected (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferProtected (ambiguity) typedef+=TypeDefinition
+	 *     buffer+=BufferPublic (ambiguity) buffer+=BufferPrivate
+	 *     buffer+=BufferPublic (ambiguity) channel+=ChannelPrivate
+	 *     buffer+=BufferPublic (ambiguity) port+=PortPrivate
+	 *     buffer+=BufferPublic (ambiguity) property+=VariablePrivate
+	 *     buffer+=BufferPublic (ambiguity) signal+=SignalPrivate
+	 *     buffer+=BufferPublic (ambiguity) typedef+=TypeDefinition
+	 *     channel+=Channel (ambiguity) buffer+=BufferPrivate
+	 *     channel+=Channel (ambiguity) channel+=ChannelPrivate
+	 *     channel+=Channel (ambiguity) port+=PortPrivate
+	 *     channel+=Channel (ambiguity) property+=VariablePrivate
+	 *     channel+=Channel (ambiguity) signal+=SignalPrivate
+	 *     channel+=Channel (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelProtected (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelProtected (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelProtected (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelProtected (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelProtected (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelProtected (ambiguity) typedef+=TypeDefinition
+	 *     channel+=ChannelPublic (ambiguity) buffer+=BufferPrivate
+	 *     channel+=ChannelPublic (ambiguity) channel+=ChannelPrivate
+	 *     channel+=ChannelPublic (ambiguity) port+=PortPrivate
+	 *     channel+=ChannelPublic (ambiguity) property+=VariablePrivate
+	 *     channel+=ChannelPublic (ambiguity) signal+=SignalPrivate
+	 *     channel+=ChannelPublic (ambiguity) typedef+=TypeDefinition
+	 *     name=ESIdentifier '{' (ambiguity) buffer+=BufferPrivate
+	 *     name=ESIdentifier '{' (ambiguity) channel+=ChannelPrivate
+	 *     name=ESIdentifier '{' (ambiguity) port+=PortPrivate
+	 *     name=ESIdentifier '{' (ambiguity) property+=VariablePrivate
+	 *     name=ESIdentifier '{' (ambiguity) signal+=SignalPrivate
+	 *     name=ESIdentifier '{' (ambiguity) typedef+=TypeDefinition
+	 *     port+=Port (ambiguity) buffer+=BufferPrivate
+	 *     port+=Port (ambiguity) channel+=ChannelPrivate
+	 *     port+=Port (ambiguity) port+=PortPrivate
+	 *     port+=Port (ambiguity) property+=VariablePrivate
+	 *     port+=Port (ambiguity) signal+=SignalPrivate
+	 *     port+=Port (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortProtected (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortProtected (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortProtected (ambiguity) port+=PortPrivate
+	 *     port+=PortProtected (ambiguity) property+=VariablePrivate
+	 *     port+=PortProtected (ambiguity) signal+=SignalPrivate
+	 *     port+=PortProtected (ambiguity) typedef+=TypeDefinition
+	 *     port+=PortPublic (ambiguity) buffer+=BufferPrivate
+	 *     port+=PortPublic (ambiguity) channel+=ChannelPrivate
+	 *     port+=PortPublic (ambiguity) port+=PortPrivate
+	 *     port+=PortPublic (ambiguity) property+=VariablePrivate
+	 *     port+=PortPublic (ambiguity) signal+=SignalPrivate
+	 *     port+=PortPublic (ambiguity) typedef+=TypeDefinition
+	 *     property+=Variable (ambiguity) buffer+=BufferPrivate
+	 *     property+=Variable (ambiguity) channel+=ChannelPrivate
+	 *     property+=Variable (ambiguity) port+=PortPrivate
+	 *     property+=Variable (ambiguity) property+=VariablePrivate
+	 *     property+=Variable (ambiguity) signal+=SignalPrivate
+	 *     property+=Variable (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariableProtected (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariableProtected (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariableProtected (ambiguity) port+=PortPrivate
+	 *     property+=VariableProtected (ambiguity) property+=VariablePrivate
+	 *     property+=VariableProtected (ambiguity) signal+=SignalPrivate
+	 *     property+=VariableProtected (ambiguity) typedef+=TypeDefinition
+	 *     property+=VariablePublic (ambiguity) buffer+=BufferPrivate
+	 *     property+=VariablePublic (ambiguity) channel+=ChannelPrivate
+	 *     property+=VariablePublic (ambiguity) port+=PortPrivate
+	 *     property+=VariablePublic (ambiguity) property+=VariablePrivate
+	 *     property+=VariablePublic (ambiguity) signal+=SignalPrivate
+	 *     property+=VariablePublic (ambiguity) typedef+=TypeDefinition
+	 *     signal+=Signal (ambiguity) buffer+=BufferPrivate
+	 *     signal+=Signal (ambiguity) channel+=ChannelPrivate
+	 *     signal+=Signal (ambiguity) port+=PortPrivate
+	 *     signal+=Signal (ambiguity) property+=VariablePrivate
+	 *     signal+=Signal (ambiguity) signal+=SignalPrivate
+	 *     signal+=Signal (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalProtected (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalProtected (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalProtected (ambiguity) port+=PortPrivate
+	 *     signal+=SignalProtected (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalProtected (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalProtected (ambiguity) typedef+=TypeDefinition
+	 *     signal+=SignalPublic (ambiguity) buffer+=BufferPrivate
+	 *     signal+=SignalPublic (ambiguity) channel+=ChannelPrivate
+	 *     signal+=SignalPublic (ambiguity) port+=PortPrivate
+	 *     signal+=SignalPublic (ambiguity) property+=VariablePrivate
+	 *     signal+=SignalPublic (ambiguity) signal+=SignalPrivate
+	 *     signal+=SignalPublic (ambiguity) typedef+=TypeDefinition
+	 *     typedef+=TypeDefinition (ambiguity) buffer+=BufferPrivate
+	 *     typedef+=TypeDefinition (ambiguity) channel+=ChannelPrivate
+	 *     typedef+=TypeDefinition (ambiguity) port+=PortPrivate
+	 *     typedef+=TypeDefinition (ambiguity) property+=VariablePrivate
+	 *     typedef+=TypeDefinition (ambiguity) signal+=SignalPrivate
+	 *     typedef+=TypeDefinition (ambiguity) typedef+=TypeDefinition
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) buffer+=BufferPrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) channel+=ChannelPrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) port+=PortPrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) property+=VariablePrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) signal+=SignalPrivate
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) typedef+=TypeDefinition
+	 */
+	protected void emit_System_____PropertyKeyword_7_0_0_or_ProtectedKeyword_7_2_0_or_PublicKeyword_7_1_0__a_PrivateKeyword_7_3_0__p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'moc:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) '<' (ambiguity) isElse?='else'
+	 *     (rule start) '<' (ambiguity) moc=TransitionMoc
+	 */
+	protected void emit_TransitionMoe_MocKeyword_1_0_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'prior:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     isElse?='else' ',' (ambiguity) prior=EInt
+	 *     moc=TransitionMoc ',' (ambiguity) prior=EInt
+	 */
+	protected void emit_TransitionMoe_PriorKeyword_1_0_2_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'prior:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) '<' (ambiguity) prior=EInt
+	 */
+	protected void emit_TransitionMoe_PriorKeyword_1_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@guard:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'transition' '{' '@trigger:'? (ambiguity) '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     (rule start) 'transition' '{' '@trigger:'? (ambiguity) tguard=TransitionTimedGuard
+	 *     moe=TransitionMoe '{' '@trigger:'? (ambiguity) '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     moe=TransitionMoe '{' '@trigger:'? (ambiguity) tguard=TransitionTimedGuard
+	 *     name=ESIdentifier '{' '@trigger:'? (ambiguity) '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     name=ESIdentifier '{' '@trigger:'? (ambiguity) tguard=TransitionTimedGuard
+	 *     transient?='transient' 'transition' '{' '@trigger:'? (ambiguity) '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     transient?='transient' 'transition' '{' '@trigger:'? (ambiguity) tguard=TransitionTimedGuard
+	 *     trigger+=TransitionTrigger (ambiguity) '@tguard:'? '@effect:' '}' '-->' target=[NamedElement|ESUfid]
+	 *     trigger+=TransitionTrigger (ambiguity) '@tguard:'? '@effect:' '}' (rule end)
+	 *     trigger+=TransitionTrigger (ambiguity) '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     trigger+=TransitionTrigger (ambiguity) tguard=TransitionTimedGuard
+	 *     unrestrictedName=UnrestrictedName '{' '@trigger:'? (ambiguity) '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     unrestrictedName=UnrestrictedName '{' '@trigger:'? (ambiguity) tguard=TransitionTimedGuard
+	 */
+	protected void emit_Transition_GuardKeyword_5_0_1_0_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@guard:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     target=[NamedElement|ESUfid] '{' '@trigger:'? (ambiguity) '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     target=[NamedElement|ESUfid] '{' '@trigger:'? (ambiguity) tguard=TransitionTimedGuard
+	 *     trigger+=TransitionTrigger (ambiguity) '@tguard:'? '@effect:' '}' (rule end)
+	 *     trigger+=TransitionTrigger (ambiguity) '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     trigger+=TransitionTrigger (ambiguity) tguard=TransitionTimedGuard
+	 */
+	protected void emit_Transition_GuardKeyword_5_1_2_0_1_0_1_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('{' ('@trigger:'? '@guard:'? '@tguard:'? '@effect:')? '}') | ';'
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     target=[NamedElement|ESUfid] (ambiguity) (rule end)
+	 */
+	protected void emit_Transition_SemicolonKeyword_5_1_2_1_or___LeftCurlyBracketKeyword_5_1_2_0_0___TriggerKeyword_5_1_2_0_1_0_0_0_q_GuardKeyword_5_1_2_0_1_0_1_1_q_TguardKeyword_5_1_2_0_1_0_2_1_q_EffectKeyword_5_1_2_0_1_0_3__q_RightCurlyBracketKeyword_5_1_2_0_2__(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@tguard:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'transition' '{' '@trigger:'? '@guard:'? (ambiguity) '@effect:' effect=TransitionEffect
+	 *     guard=TransitionGuard (ambiguity) '@effect:' '}' '-->' target=[NamedElement|ESUfid]
+	 *     guard=TransitionGuard (ambiguity) '@effect:' '}' (rule end)
+	 *     guard=TransitionGuard (ambiguity) '@effect:' effect=TransitionEffect
+	 *     moe=TransitionMoe '{' '@trigger:'? '@guard:'? (ambiguity) '@effect:' effect=TransitionEffect
+	 *     name=ESIdentifier '{' '@trigger:'? '@guard:'? (ambiguity) '@effect:' effect=TransitionEffect
+	 *     transient?='transient' 'transition' '{' '@trigger:'? '@guard:'? (ambiguity) '@effect:' effect=TransitionEffect
+	 *     trigger+=TransitionTrigger '@guard:'? (ambiguity) '@effect:' '}' '-->' target=[NamedElement|ESUfid]
+	 *     trigger+=TransitionTrigger '@guard:'? (ambiguity) '@effect:' '}' (rule end)
+	 *     trigger+=TransitionTrigger '@guard:'? (ambiguity) '@effect:' effect=TransitionEffect
+	 *     unrestrictedName=UnrestrictedName '{' '@trigger:'? '@guard:'? (ambiguity) '@effect:' effect=TransitionEffect
+	 */
+	protected void emit_Transition_TguardKeyword_5_0_1_0_2_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@tguard:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     guard=TransitionGuard (ambiguity) '@effect:' '}' (rule end)
+	 *     guard=TransitionGuard (ambiguity) '@effect:' effect=TransitionEffect
+	 *     target=[NamedElement|ESUfid] '{' '@trigger:'? '@guard:'? (ambiguity) '@effect:' effect=TransitionEffect
+	 *     trigger+=TransitionTrigger '@guard:'? (ambiguity) '@effect:' '}' (rule end)
+	 *     trigger+=TransitionTrigger '@guard:'? (ambiguity) '@effect:' effect=TransitionEffect
+	 */
+	protected void emit_Transition_TguardKeyword_5_1_2_0_1_0_2_1_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@trigger:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'transition' '{' (ambiguity) '@guard:'? '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     (rule start) 'transition' '{' (ambiguity) '@guard:'? tguard=TransitionTimedGuard
+	 *     (rule start) 'transition' '{' (ambiguity) guard=TransitionGuard
+	 *     moe=TransitionMoe '{' (ambiguity) '@guard:'? '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     moe=TransitionMoe '{' (ambiguity) '@guard:'? tguard=TransitionTimedGuard
+	 *     moe=TransitionMoe '{' (ambiguity) guard=TransitionGuard
+	 *     name=ESIdentifier '{' (ambiguity) '@guard:'? '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     name=ESIdentifier '{' (ambiguity) '@guard:'? tguard=TransitionTimedGuard
+	 *     name=ESIdentifier '{' (ambiguity) guard=TransitionGuard
+	 *     transient?='transient' 'transition' '{' (ambiguity) '@guard:'? '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     transient?='transient' 'transition' '{' (ambiguity) '@guard:'? tguard=TransitionTimedGuard
+	 *     transient?='transient' 'transition' '{' (ambiguity) guard=TransitionGuard
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@guard:'? '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '@guard:'? tguard=TransitionTimedGuard
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) guard=TransitionGuard
+	 */
+	protected void emit_Transition_TriggerKeyword_5_0_1_0_0_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     '@trigger:'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     target=[NamedElement|ESUfid] '{' (ambiguity) '@guard:'? '@tguard:'? '@effect:' effect=TransitionEffect
+	 *     target=[NamedElement|ESUfid] '{' (ambiguity) '@guard:'? tguard=TransitionTimedGuard
+	 *     target=[NamedElement|ESUfid] '{' (ambiguity) guard=TransitionGuard
+	 */
+	protected void emit_Transition_TriggerKeyword_5_1_2_0_1_0_0_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('@trigger:'? '@guard:'? '@tguard:'? '@effect:')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) 'transition' '{' (ambiguity) '}' '-->' target=[NamedElement|ESUfid]
+	 *     (rule start) 'transition' '{' (ambiguity) '}' (rule start)
+	 *     moe=TransitionMoe '{' (ambiguity) '}' '-->' target=[NamedElement|ESUfid]
+	 *     moe=TransitionMoe '{' (ambiguity) '}' (rule end)
+	 *     name=ESIdentifier '{' (ambiguity) '}' '-->' target=[NamedElement|ESUfid]
+	 *     name=ESIdentifier '{' (ambiguity) '}' (rule end)
+	 *     transient?='transient' 'transition' '{' (ambiguity) '}' '-->' target=[NamedElement|ESUfid]
+	 *     transient?='transient' 'transition' '{' (ambiguity) '}' (rule end)
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '}' '-->' target=[NamedElement|ESUfid]
+	 *     unrestrictedName=UnrestrictedName '{' (ambiguity) '}' (rule end)
+	 */
+	protected void emit_Transition___TriggerKeyword_5_0_1_0_0_0_q_GuardKeyword_5_0_1_0_1_1_q_TguardKeyword_5_0_1_0_2_1_q_EffectKeyword_5_0_1_0_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'var'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     const?='const' (ambiguity) type=DataType
+	 *     const?='final' (ambiguity) type=DataType
+	 *     macro?='macro' (ambiguity) type=DataType
+	 */
+	protected void emit_Variable_VarKeyword_1_2_2_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     'var'?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     macro?='macro' (ambiguity) type=DataType
+	 */
+	protected void emit_Variable_VarKeyword_1_3_1_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Ambiguous syntax:
+	 *     ('(' ')')?
+	 *
+	 * This ambiguous syntax occurs at:
+	 *     (rule start) (ambiguity) '->' '(' codomain=FunctionalParameterSet
+	 *     (rule start) (ambiguity) '->' codomain=FunctionalParameterSet
+	 *     (rule start) (ambiguity) bodyBlock=BlockStatement
+	 */
+	protected void emit_moeRoutine___LeftParenthesisKeyword_1_0_RightParenthesisKeyword_1_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/services/FormalMLGrammarAccess.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/services/FormalMLGrammarAccess.java
new file mode 100644
index 0000000..21c1fbd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/services/FormalMLGrammarAccess.java
@@ -0,0 +1,24885 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.services;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.List;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.EnumLiteralDeclaration;
+import org.eclipse.xtext.EnumRule;
+import org.eclipse.xtext.Grammar;
+import org.eclipse.xtext.GrammarUtil;
+import org.eclipse.xtext.Group;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.TerminalRule;
+import org.eclipse.xtext.UnorderedGroup;
+import org.eclipse.xtext.common.services.TerminalsGrammarAccess;
+import org.eclipse.xtext.service.AbstractElementFinder.AbstractEnumRuleElementFinder;
+import org.eclipse.xtext.service.AbstractElementFinder.AbstractGrammarElementFinder;
+import org.eclipse.xtext.service.GrammarProvider;
+
+@Singleton
+public class FormalMLGrammarAccess extends AbstractGrammarElementFinder {
+	
+	public class XliaElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Xlia");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cPrologAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cPrologXliaPrologObjectParserRuleCall_0_0 = (RuleCall)cPrologAssignment_0.eContents().get(0);
+		private final Assignment cSystemAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cSystemSystemParserRuleCall_1_0 = (RuleCall)cSystemAssignment_1.eContents().get(0);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Main Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Xlia XliaModel:
+		//	prolog=XliaPrologObject
+		//	system=System
+		@Override public ParserRule getRule() { return rule; }
+		
+		//prolog=XliaPrologObject system=System
+		public Group getGroup() { return cGroup; }
+		
+		//prolog=XliaPrologObject
+		public Assignment getPrologAssignment_0() { return cPrologAssignment_0; }
+		
+		//XliaPrologObject
+		public RuleCall getPrologXliaPrologObjectParserRuleCall_0_0() { return cPrologXliaPrologObjectParserRuleCall_0_0; }
+		
+		//system=System
+		public Assignment getSystemAssignment_1() { return cSystemAssignment_1; }
+		
+		//System
+		public RuleCall getSystemSystemParserRuleCall_1_0() { return cSystemSystemParserRuleCall_1_0; }
+	}
+	public class XliaPrologObjectElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaPrologObject");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final Alternatives cNameAlternatives_0_0 = (Alternatives)cNameAssignment_0.eContents().get(0);
+		private final Keyword cNameFormalMLKeyword_0_0_0 = (Keyword)cNameAlternatives_0_0.eContents().get(0);
+		private final Keyword cNameXliaKeyword_0_0_1 = (Keyword)cNameAlternatives_0_0.eContents().get(1);
+		private final Keyword cNameXfspKeyword_0_0_2 = (Keyword)cNameAlternatives_0_0.eContents().get(2);
+		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cElementsAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cElementsXliaPrologAttributeParserRuleCall_2_0 = (RuleCall)cElementsAssignment_2.eContents().get(0);
+		private final Keyword cGreaterThanSignColonKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cElementsAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cElementsXliaOptionObjectParserRuleCall_4_0 = (RuleCall)cElementsAssignment_4.eContents().get(0);
+		
+		//XliaPrologObject XliaObject:
+		//	name=('@FormalML' | '@xlia' | '@xfsp') '<'
+		//	elements+=XliaPrologAttribute '>:'
+		//	elements+=XliaOptionObject?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name=('@FormalML' | '@xlia' | '@xfsp') '<' elements+=XliaPrologAttribute '>:' elements+=XliaOptionObject?
+		public Group getGroup() { return cGroup; }
+		
+		//name=('@FormalML' | '@xlia' | '@xfsp')
+		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
+		
+		//('@FormalML' | '@xlia' | '@xfsp')
+		public Alternatives getNameAlternatives_0_0() { return cNameAlternatives_0_0; }
+		
+		//'@FormalML'
+		public Keyword getNameFormalMLKeyword_0_0_0() { return cNameFormalMLKeyword_0_0_0; }
+		
+		//'@xlia'
+		public Keyword getNameXliaKeyword_0_0_1() { return cNameXliaKeyword_0_0_1; }
+		
+		//'@xfsp'
+		public Keyword getNameXfspKeyword_0_0_2() { return cNameXfspKeyword_0_0_2; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
+		
+		//elements+=XliaPrologAttribute
+		public Assignment getElementsAssignment_2() { return cElementsAssignment_2; }
+		
+		//XliaPrologAttribute
+		public RuleCall getElementsXliaPrologAttributeParserRuleCall_2_0() { return cElementsXliaPrologAttributeParserRuleCall_2_0; }
+		
+		////		( ',' elements+=XliaPrologAttribute )+
+		//'>:'
+		public Keyword getGreaterThanSignColonKeyword_3() { return cGreaterThanSignColonKeyword_3; }
+		
+		//elements+=XliaOptionObject?
+		public Assignment getElementsAssignment_4() { return cElementsAssignment_4; }
+		
+		//XliaOptionObject
+		public RuleCall getElementsXliaOptionObjectParserRuleCall_4_0() { return cElementsXliaOptionObjectParserRuleCall_4_0; }
+	}
+	public class XliaPrologAttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaPrologAttribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final Alternatives cNameAlternatives_0_0 = (Alternatives)cNameAssignment_0.eContents().get(0);
+		private final Keyword cNameSystemKeyword_0_0_0 = (Keyword)cNameAlternatives_0_0.eContents().get(0);
+		private final Keyword cNamePackageKeyword_0_0_1 = (Keyword)cNameAlternatives_0_0.eContents().get(1);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cCommaKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cValueAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Alternatives cValueAlternatives_1_1_0 = (Alternatives)cValueAssignment_1_1.eContents().get(0);
+		private final RuleCall cValueLiteralFloatExpressionParserRuleCall_1_1_0_0 = (RuleCall)cValueAlternatives_1_1_0.eContents().get(0);
+		private final RuleCall cValueLiteralStringExpressionParserRuleCall_1_1_0_1 = (RuleCall)cValueAlternatives_1_1_0.eContents().get(1);
+		
+		//XliaPrologAttribute XliaAttribute:
+		//	name=('system' | 'package') (',' value=(LiteralFloatExpression | LiteralStringExpression))?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name=('system' | 'package') (',' value=(LiteralFloatExpression | LiteralStringExpression))?
+		public Group getGroup() { return cGroup; }
+		
+		//name=('system' | 'package')
+		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
+		
+		//('system' | 'package')
+		public Alternatives getNameAlternatives_0_0() { return cNameAlternatives_0_0; }
+		
+		//'system'
+		public Keyword getNameSystemKeyword_0_0_0() { return cNameSystemKeyword_0_0_0; }
+		
+		//'package'
+		public Keyword getNamePackageKeyword_0_0_1() { return cNamePackageKeyword_0_0_1; }
+		
+		//(',' value=(LiteralFloatExpression | LiteralStringExpression))?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//','
+		public Keyword getCommaKeyword_1_0() { return cCommaKeyword_1_0; }
+		
+		//value=(LiteralFloatExpression | LiteralStringExpression)
+		public Assignment getValueAssignment_1_1() { return cValueAssignment_1_1; }
+		
+		//(LiteralFloatExpression | LiteralStringExpression)
+		public Alternatives getValueAlternatives_1_1_0() { return cValueAlternatives_1_1_0; }
+		
+		//LiteralFloatExpression
+		public RuleCall getValueLiteralFloatExpressionParserRuleCall_1_1_0_0() { return cValueLiteralFloatExpressionParserRuleCall_1_1_0_0; }
+		
+		//LiteralStringExpression
+		public RuleCall getValueLiteralStringExpressionParserRuleCall_1_1_0_1() { return cValueLiteralStringExpressionParserRuleCall_1_1_0_1; }
+	}
+	public class XliaOptionObjectElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaOptionObject");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final Keyword cNameOptionKeyword_0_0 = (Keyword)cNameAssignment_0.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cElementsAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cElementsXliaNamedElementParserRuleCall_2_0 = (RuleCall)cElementsAssignment_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		
+		////XliaPrologAttribute returns XliaAttribute
+		////	: (name = 'model')?    value=XliaModelKind
+		////	| (name = 'version')?
+		////		value=( LiteralFloatExpression | LiteralStringExpression )
+		////	;
+		////
+		////XliaModelKind returns fmlExpr::LiteralStringExpression
+		////	: value=( 'system' | 'package' )
+		////	;
+		//XliaOptionObject XliaObject:
+		//	name='@option' '{'
+		//	elements+=XliaNamedElement*
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name='@option' '{' elements+=XliaNamedElement* '}'
+		public Group getGroup() { return cGroup; }
+		
+		//name='@option'
+		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
+		
+		//'@option'
+		public Keyword getNameOptionKeyword_0_0() { return cNameOptionKeyword_0_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_1() { return cLeftCurlyBracketKeyword_1; }
+		
+		//elements+=XliaNamedElement*
+		public Assignment getElementsAssignment_2() { return cElementsAssignment_2; }
+		
+		//XliaNamedElement
+		public RuleCall getElementsXliaNamedElementParserRuleCall_2_0() { return cElementsXliaNamedElementParserRuleCall_2_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_3() { return cRightCurlyBracketKeyword_3; }
+	}
+	public class XliaNamedElementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaNamedElement");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cXliaObjectParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cXliaAttributeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//XliaNamedElement:
+		//	XliaObject
+		//	| XliaAttribute;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//XliaObject | XliaAttribute
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//XliaObject
+		public RuleCall getXliaObjectParserRuleCall_0() { return cXliaObjectParserRuleCall_0; }
+		
+		//XliaAttribute
+		public RuleCall getXliaAttributeParserRuleCall_1() { return cXliaAttributeParserRuleCall_1; }
+	}
+	public class XliaObjectElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaObject");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cNameXLIA_IDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cElementsAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cElementsXliaNamedElementParserRuleCall_2_0 = (RuleCall)cElementsAssignment_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		
+		//XliaObject:
+		//	name=XLIA_ID '{'
+		//	elements+=XliaNamedElement*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name=XLIA_ID '{' elements+=XliaNamedElement* '}'
+		public Group getGroup() { return cGroup; }
+		
+		//name=XLIA_ID
+		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
+		
+		//XLIA_ID
+		public RuleCall getNameXLIA_IDTerminalRuleCall_0_0() { return cNameXLIA_IDTerminalRuleCall_0_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_1() { return cLeftCurlyBracketKeyword_1; }
+		
+		//elements+=XliaNamedElement*
+		public Assignment getElementsAssignment_2() { return cElementsAssignment_2; }
+		
+		//XliaNamedElement
+		public RuleCall getElementsXliaNamedElementParserRuleCall_2_0() { return cElementsXliaNamedElementParserRuleCall_2_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_3() { return cRightCurlyBracketKeyword_3; }
+	}
+	public class XliaAttributeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaAttribute");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cNameXLIA_IDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
+		private final Keyword cEqualsSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cValueExpressionParserRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
+		private final Keyword cSemicolonKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		
+		//XliaAttribute:
+		//	name=XLIA_ID '=' value=Expression ';';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name=XLIA_ID '=' value=Expression ';'
+		public Group getGroup() { return cGroup; }
+		
+		//name=XLIA_ID
+		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
+		
+		//XLIA_ID
+		public RuleCall getNameXLIA_IDTerminalRuleCall_0_0() { return cNameXLIA_IDTerminalRuleCall_0_0; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_1() { return cEqualsSignKeyword_1; }
+		
+		//value=Expression
+		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
+		
+		//Expression
+		public RuleCall getValueExpressionParserRuleCall_2_0() { return cValueExpressionParserRuleCall_2_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_3() { return cSemicolonKeyword_3; }
+	}
+	public class EBooleanElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EBoolean");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cTrueKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cFalseKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Primitive Value
+		//////////////////////////////////////////////////////////////////////////////////
+		//EBoolean ecore::EBoolean:
+		//	'true' | 'false'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'true' | 'false'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'true'
+		public Keyword getTrueKeyword_0() { return cTrueKeyword_0; }
+		
+		//'false'
+		public Keyword getFalseKeyword_1() { return cFalseKeyword_1; }
+	}
+	public class EIntElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EInt");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
+		
+		//EInt ecore::EInt:
+		//	'-'? INT
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'-'? INT
+		public Group getGroup() { return cGroup; }
+		
+		//'-'?
+		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
+		
+		//INT
+		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
+	}
+	public class EIntegerElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EInteger");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
+		
+		//EInteger ecore::ELong:
+		//	'-'? INT
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'-'? INT
+		public Group getGroup() { return cGroup; }
+		
+		//'-'?
+		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
+		
+		//INT
+		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
+	}
+	public class EFloatElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EFloat");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
+		private final Keyword cFullStopKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final RuleCall cINTTerminalRuleCall_3 = (RuleCall)cGroup.eContents().get(3);
+		
+		//EFloat ecore::EFloat:
+		//	'-'? INT? '.' INT
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'-'? INT? '.' INT
+		public Group getGroup() { return cGroup; }
+		
+		//'-'?
+		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
+		
+		//INT?
+		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_2() { return cFullStopKeyword_2; }
+		
+		//INT
+		public RuleCall getINTTerminalRuleCall_3() { return cINTTerminalRuleCall_3; }
+	}
+	public class EDoubleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EDouble");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
+		private final Keyword cFullStopKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final RuleCall cINTTerminalRuleCall_3 = (RuleCall)cGroup.eContents().get(3);
+		
+		//EDouble ecore::EDouble:
+		//	'-'? INT? '.' INT
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'-'? INT? '.' INT
+		public Group getGroup() { return cGroup; }
+		
+		//'-'?
+		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
+		
+		//INT?
+		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_2() { return cFullStopKeyword_2; }
+		
+		//INT
+		public RuleCall getINTTerminalRuleCall_3() { return cINTTerminalRuleCall_3; }
+	}
+	public class ECharacterElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ECharacter");
+		private final RuleCall cCHARACTERTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//ECharacter ecore::EChar:
+		//	CHARACTER
+		@Override public ParserRule getRule() { return rule; }
+		
+		//CHARACTER
+		public RuleCall getCHARACTERTerminalRuleCall() { return cCHARACTERTerminalRuleCall; }
+	}
+	public class EStringElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EString");
+		private final RuleCall cSTRINGTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//EString:
+		//	STRING;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//STRING
+		public RuleCall getSTRINGTerminalRuleCall() { return cSTRINGTerminalRuleCall; }
+	}
+	public class ReservedWordElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ReservedWord");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cPackageKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cSystemKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		private final Keyword cMachineKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
+		private final Keyword cStatemachineKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
+		private final Keyword cStateKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
+		private final Keyword cPseudostateKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
+		private final Keyword cVertexKeyword_6 = (Keyword)cAlternatives.eContents().get(6);
+		private final Keyword cProcedureKeyword_7 = (Keyword)cAlternatives.eContents().get(7);
+		private final Keyword cMacroKeyword_8 = (Keyword)cAlternatives.eContents().get(8);
+		private final Keyword cRoutineKeyword_9 = (Keyword)cAlternatives.eContents().get(9);
+		private final Keyword cTransitionKeyword_10 = (Keyword)cAlternatives.eContents().get(10);
+		private final Keyword cPublicKeyword_11 = (Keyword)cAlternatives.eContents().get(11);
+		private final Keyword cPrivateKeyword_12 = (Keyword)cAlternatives.eContents().get(12);
+		private final Keyword cProtectedKeyword_13 = (Keyword)cAlternatives.eContents().get(13);
+		private final Keyword cStaticKeyword_14 = (Keyword)cAlternatives.eContents().get(14);
+		private final Keyword cFinalKeyword_15 = (Keyword)cAlternatives.eContents().get(15);
+		private final Keyword cReferenceKeyword_16 = (Keyword)cAlternatives.eContents().get(16);
+		private final Keyword cVolatileKeyword_17 = (Keyword)cAlternatives.eContents().get(17);
+		private final Keyword cTransientKeyword_18 = (Keyword)cAlternatives.eContents().get(18);
+		private final Keyword cModelKeyword_19 = (Keyword)cAlternatives.eContents().get(19);
+		private final Keyword cPrototypeKeyword_20 = (Keyword)cAlternatives.eContents().get(20);
+		private final Keyword cInstanceKeyword_21 = (Keyword)cAlternatives.eContents().get(21);
+		private final Keyword cTimedKeyword_22 = (Keyword)cAlternatives.eContents().get(22);
+		private final Keyword cInput_enabledKeyword_23 = (Keyword)cAlternatives.eContents().get(23);
+		private final Keyword cPortKeyword_24 = (Keyword)cAlternatives.eContents().get(24);
+		private final Keyword cSignalKeyword_25 = (Keyword)cAlternatives.eContents().get(25);
+		private final Keyword cBufferKeyword_26 = (Keyword)cAlternatives.eContents().get(26);
+		private final Keyword cChannelKeyword_27 = (Keyword)cAlternatives.eContents().get(27);
+		private final Keyword cVarKeyword_28 = (Keyword)cAlternatives.eContents().get(28);
+		private final Keyword cValKeyword_29 = (Keyword)cAlternatives.eContents().get(29);
+		private final Keyword cConstKeyword_30 = (Keyword)cAlternatives.eContents().get(30);
+		private final Keyword cInputKeyword_31 = (Keyword)cAlternatives.eContents().get(31);
+		private final Keyword cInKeyword_32 = (Keyword)cAlternatives.eContents().get(32);
+		private final Keyword cInoutKeyword_33 = (Keyword)cAlternatives.eContents().get(33);
+		private final Keyword cOutputKeyword_34 = (Keyword)cAlternatives.eContents().get(34);
+		private final Keyword cOutKeyword_35 = (Keyword)cAlternatives.eContents().get(35);
+		private final Keyword cReturnKeyword_36 = (Keyword)cAlternatives.eContents().get(36);
+		private final Keyword cSimpleKeyword_37 = (Keyword)cAlternatives.eContents().get(37);
+		private final Keyword cStartKeyword_38 = (Keyword)cAlternatives.eContents().get(38);
+		private final Keyword cFinalKeyword_39 = (Keyword)cAlternatives.eContents().get(39);
+		private final Keyword cInitialKeyword_40 = (Keyword)cAlternatives.eContents().get(40);
+		private final Keyword cTerminalKeyword_41 = (Keyword)cAlternatives.eContents().get(41);
+		private final Keyword cJunctionKeyword_42 = (Keyword)cAlternatives.eContents().get(42);
+		private final Keyword cChoiceKeyword_43 = (Keyword)cAlternatives.eContents().get(43);
+		private final Keyword cForkKeyword_44 = (Keyword)cAlternatives.eContents().get(44);
+		private final Keyword cJoinKeyword_45 = (Keyword)cAlternatives.eContents().get(45);
+		private final Keyword cDhistoryKeyword_46 = (Keyword)cAlternatives.eContents().get(46);
+		private final Keyword cShistoryKeyword_47 = (Keyword)cAlternatives.eContents().get(47);
+		private final Keyword cRouteKeyword_48 = (Keyword)cAlternatives.eContents().get(48);
+		private final Keyword cConnectKeyword_49 = (Keyword)cAlternatives.eContents().get(49);
+		private final Keyword cEnvKeyword_50 = (Keyword)cAlternatives.eContents().get(50);
+		private final Keyword cRdvKeyword_51 = (Keyword)cAlternatives.eContents().get(51);
+		private final Keyword cMulti_rdvKeyword_52 = (Keyword)cAlternatives.eContents().get(52);
+		private final Keyword cBufferKeyword_53 = (Keyword)cAlternatives.eContents().get(53);
+		private final Keyword cUnicastKeyword_54 = (Keyword)cAlternatives.eContents().get(54);
+		private final Keyword cAnycastKeyword_55 = (Keyword)cAlternatives.eContents().get(55);
+		private final Keyword cMulticastKeyword_56 = (Keyword)cAlternatives.eContents().get(56);
+		private final Keyword cBroadcastKeyword_57 = (Keyword)cAlternatives.eContents().get(57);
+		private final Keyword cBooleanKeyword_58 = (Keyword)cAlternatives.eContents().get(58);
+		private final Keyword cBoolKeyword_59 = (Keyword)cAlternatives.eContents().get(59);
+		private final Keyword cCharKeyword_60 = (Keyword)cAlternatives.eContents().get(60);
+		private final Keyword cStringKeyword_61 = (Keyword)cAlternatives.eContents().get(61);
+		private final Keyword cMessageKeyword_62 = (Keyword)cAlternatives.eContents().get(62);
+		private final Keyword cIntegerKeyword_63 = (Keyword)cAlternatives.eContents().get(63);
+		private final Keyword cIntKeyword_64 = (Keyword)cAlternatives.eContents().get(64);
+		private final Keyword cUintegerKeyword_65 = (Keyword)cAlternatives.eContents().get(65);
+		private final Keyword cUintKeyword_66 = (Keyword)cAlternatives.eContents().get(66);
+		private final Keyword cRationalKeyword_67 = (Keyword)cAlternatives.eContents().get(67);
+		private final Keyword cRatKeyword_68 = (Keyword)cAlternatives.eContents().get(68);
+		private final Keyword cUrationalKeyword_69 = (Keyword)cAlternatives.eContents().get(69);
+		private final Keyword cUratKeyword_70 = (Keyword)cAlternatives.eContents().get(70);
+		private final Keyword cTimeKeyword_71 = (Keyword)cAlternatives.eContents().get(71);
+		private final Keyword cClockKeyword_72 = (Keyword)cAlternatives.eContents().get(72);
+		private final Keyword cFloatKeyword_73 = (Keyword)cAlternatives.eContents().get(73);
+		private final Keyword cDoubleKeyword_74 = (Keyword)cAlternatives.eContents().get(74);
+		private final Keyword cRealKeyword_75 = (Keyword)cAlternatives.eContents().get(75);
+		private final Keyword cUfloatKeyword_76 = (Keyword)cAlternatives.eContents().get(76);
+		private final Keyword cUdoubleKeyword_77 = (Keyword)cAlternatives.eContents().get(77);
+		private final Keyword cUrealKeyword_78 = (Keyword)cAlternatives.eContents().get(78);
+		private final Keyword cIntervalKeyword_79 = (Keyword)cAlternatives.eContents().get(79);
+		private final Keyword cEnumKeyword_80 = (Keyword)cAlternatives.eContents().get(80);
+		private final Keyword cStructKeyword_81 = (Keyword)cAlternatives.eContents().get(81);
+		private final Keyword cUnionKeyword_82 = (Keyword)cAlternatives.eContents().get(82);
+		private final Keyword cVectorKeyword_83 = (Keyword)cAlternatives.eContents().get(83);
+		private final Keyword cRvectorKeyword_84 = (Keyword)cAlternatives.eContents().get(84);
+		private final Keyword cListKeyword_85 = (Keyword)cAlternatives.eContents().get(85);
+		private final Keyword cSetKeyword_86 = (Keyword)cAlternatives.eContents().get(86);
+		private final Keyword cBagKeyword_87 = (Keyword)cAlternatives.eContents().get(87);
+		private final Keyword cFifoKeyword_88 = (Keyword)cAlternatives.eContents().get(88);
+		private final Keyword cLifoKeyword_89 = (Keyword)cAlternatives.eContents().get(89);
+		private final Keyword cGuardKeyword_90 = (Keyword)cAlternatives.eContents().get(90);
+		private final Keyword cTguardKeyword_91 = (Keyword)cAlternatives.eContents().get(91);
+		private final Keyword cEventKeyword_92 = (Keyword)cAlternatives.eContents().get(92);
+		private final Keyword cChecksatKeyword_93 = (Keyword)cAlternatives.eContents().get(93);
+		private final Keyword cViaKeyword_94 = (Keyword)cAlternatives.eContents().get(94);
+		private final Keyword cNewfreshKeyword_95 = (Keyword)cAlternatives.eContents().get(95);
+		private final Keyword cBreakKeyword_96 = (Keyword)cAlternatives.eContents().get(96);
+		private final Keyword cContinueKeyword_97 = (Keyword)cAlternatives.eContents().get(97);
+		private final Keyword cExitKeyword_98 = (Keyword)cAlternatives.eContents().get(98);
+		private final Keyword cInitKeyword_99 = (Keyword)cAlternatives.eContents().get(99);
+		private final Keyword cDestroyKeyword_100 = (Keyword)cAlternatives.eContents().get(100);
+		private final Keyword cStopKeyword_101 = (Keyword)cAlternatives.eContents().get(101);
+		private final Keyword cAbortKeyword_102 = (Keyword)cAlternatives.eContents().get(102);
+		private final Keyword cRestartKeyword_103 = (Keyword)cAlternatives.eContents().get(103);
+		private final Keyword cSuspendKeyword_104 = (Keyword)cAlternatives.eContents().get(104);
+		private final Keyword cResumeKeyword_105 = (Keyword)cAlternatives.eContents().get(105);
+		private final Keyword cWaitKeyword_106 = (Keyword)cAlternatives.eContents().get(106);
+		private final Keyword cDisableKeyword_107 = (Keyword)cAlternatives.eContents().get(107);
+		private final Keyword cEnableKeyword_108 = (Keyword)cAlternatives.eContents().get(108);
+		private final Keyword cScheduleKeyword_109 = (Keyword)cAlternatives.eContents().get(109);
+		private final Keyword cIrunKeyword_110 = (Keyword)cAlternatives.eContents().get(110);
+		private final Keyword cRunKeyword_111 = (Keyword)cAlternatives.eContents().get(111);
+		private final Keyword cRtcKeyword_112 = (Keyword)cAlternatives.eContents().get(112);
+		private final Keyword cCallKeyword_113 = (Keyword)cAlternatives.eContents().get(113);
+		private final Keyword cNewKeyword_114 = (Keyword)cAlternatives.eContents().get(114);
+		private final Keyword cCtorKeyword_115 = (Keyword)cAlternatives.eContents().get(115);
+		private final Keyword cThisKeyword_116 = (Keyword)cAlternatives.eContents().get(116);
+		private final Keyword cSelfKeyword_117 = (Keyword)cAlternatives.eContents().get(117);
+		private final Keyword cParentKeyword_118 = (Keyword)cAlternatives.eContents().get(118);
+		private final Keyword cSuperKeyword_119 = (Keyword)cAlternatives.eContents().get(119);
+		private final Keyword cNullKeyword_120 = (Keyword)cAlternatives.eContents().get(120);
+		
+		////QualifiedName returns ecore::EString
+		////	: ID ( '[' ID ']' )? '.' ID ( '[' ID ']' )? | ID
+		////	;
+		//ReservedWord:
+		//	'package' | 'system' | 'machine'
+		//	| 'statemachine' | 'state' | 'pseudostate' | 'vertex'
+		//	| 'procedure' | 'macro' | 'routine' | 'transition'
+		//	| 'public' | 'private' | 'protected'
+		//	| 'static' | 'final' | 'reference' | 'volatile' | 'transient'
+		//	| 'model' | 'prototype' | 'instance'
+		//	| 'timed' | 'input_enabled'
+		//	| 'port' | 'signal' | 'buffer' | 'channel'
+		//	| 'var' | 'val' | 'const'
+		//	| 'input' | 'in' | 'inout' | 'output' | 'out' | 'return'
+		//	| 'simple' | 'start' | 'final' | 'initial' | 'terminal' | 'junction'
+		//	| 'choice' | 'fork' | 'join' | 'dhistory' | 'shistory'
+		//	| 'route' | 'connect' | 'env' | 'rdv' | 'multi_rdv' | 'buffer'
+		//	| 'unicast' | 'anycast' | 'multicast' | 'broadcast'
+		//	| 'boolean' | 'bool' | 'char' | 'string' | 'message'
+		//	| 'integer' | 'int' | 'uinteger' | 'uint'
+		//	| 'rational' | 'rat' | 'urational' | 'urat'
+		//	| 'time' | 'clock'
+		//	| 'float' | 'double' | 'real' | 'ufloat' | 'udouble' | 'ureal'
+		//	| 'interval' | 'enum' | 'struct' | 'union'
+		//	| 'vector' | 'rvector' | 'list' | 'set' | 'bag' | 'fifo' | 'lifo'
+		//	| 'guard' | 'tguard' | 'event' | 'checksat' | 'via' | 'newfresh'
+		//	| 'break' | 'continue' | 'exit' | 'init' | 'destroy' | 'stop' | 'abort'
+		//	| 'restart' | 'suspend' | 'resume' | 'wait' | 'disable' | 'enable'
+		//	| 'schedule' | 'irun' | 'run' | 'rtc' | 'call' | 'new' | 'ctor'
+		//	| 'this' | 'self' | 'parent' | 'super' | 'null';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'package' | 'system' | 'machine' | 'statemachine' | 'state' | 'pseudostate' | 'vertex' | 'procedure' | 'macro' |
+		//'routine' | 'transition' | 'public' | 'private' | 'protected' | 'static' | 'final' | 'reference' | 'volatile' |
+		//'transient' | 'model' | 'prototype' | 'instance' | 'timed' | 'input_enabled' | 'port' | 'signal' | 'buffer' | 'channel'
+		//| 'var' | 'val' | 'const' | 'input' | 'in' | 'inout' | 'output' | 'out' | 'return' | 'simple' | 'start' | 'final' |
+		//'initial' | 'terminal' | 'junction' | 'choice' | 'fork' | 'join' | 'dhistory' | 'shistory' | 'route' | 'connect' |
+		//'env' | 'rdv' | 'multi_rdv' | 'buffer' | 'unicast' | 'anycast' | 'multicast' | 'broadcast' | 'boolean' | 'bool' |
+		//'char' | 'string' | 'message' | 'integer' | 'int' | 'uinteger' | 'uint' | 'rational' | 'rat' | 'urational' | 'urat' |
+		//'time' | 'clock' | 'float' | 'double' | 'real' | 'ufloat' | 'udouble' | 'ureal' | 'interval' | 'enum' | 'struct' |
+		//'union' | 'vector' | 'rvector' | 'list' | 'set' | 'bag' | 'fifo' | 'lifo' | 'guard' | 'tguard' | 'event' | 'checksat' |
+		//'via' | 'newfresh' | 'break' | 'continue' | 'exit' | 'init' | 'destroy' | 'stop' | 'abort' | 'restart' | 'suspend' |
+		//'resume' | 'wait' | 'disable' | 'enable' | 'schedule' | 'irun' | 'run' | 'rtc' | 'call' | 'new' | 'ctor' | 'this' |
+		//'self' | 'parent' | 'super' | 'null'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'package'
+		public Keyword getPackageKeyword_0() { return cPackageKeyword_0; }
+		
+		//'system'
+		public Keyword getSystemKeyword_1() { return cSystemKeyword_1; }
+		
+		//'machine'
+		public Keyword getMachineKeyword_2() { return cMachineKeyword_2; }
+		
+		//'statemachine'
+		public Keyword getStatemachineKeyword_3() { return cStatemachineKeyword_3; }
+		
+		//'state'
+		public Keyword getStateKeyword_4() { return cStateKeyword_4; }
+		
+		//'pseudostate'
+		public Keyword getPseudostateKeyword_5() { return cPseudostateKeyword_5; }
+		
+		//'vertex'
+		public Keyword getVertexKeyword_6() { return cVertexKeyword_6; }
+		
+		//'procedure'
+		public Keyword getProcedureKeyword_7() { return cProcedureKeyword_7; }
+		
+		//'macro'
+		public Keyword getMacroKeyword_8() { return cMacroKeyword_8; }
+		
+		//'routine'
+		public Keyword getRoutineKeyword_9() { return cRoutineKeyword_9; }
+		
+		//'transition'
+		public Keyword getTransitionKeyword_10() { return cTransitionKeyword_10; }
+		
+		//'public'
+		public Keyword getPublicKeyword_11() { return cPublicKeyword_11; }
+		
+		//'private'
+		public Keyword getPrivateKeyword_12() { return cPrivateKeyword_12; }
+		
+		//'protected'
+		public Keyword getProtectedKeyword_13() { return cProtectedKeyword_13; }
+		
+		//'static'
+		public Keyword getStaticKeyword_14() { return cStaticKeyword_14; }
+		
+		//'final'
+		public Keyword getFinalKeyword_15() { return cFinalKeyword_15; }
+		
+		//'reference'
+		public Keyword getReferenceKeyword_16() { return cReferenceKeyword_16; }
+		
+		//'volatile'
+		public Keyword getVolatileKeyword_17() { return cVolatileKeyword_17; }
+		
+		//'transient'
+		public Keyword getTransientKeyword_18() { return cTransientKeyword_18; }
+		
+		//'model'
+		public Keyword getModelKeyword_19() { return cModelKeyword_19; }
+		
+		//'prototype'
+		public Keyword getPrototypeKeyword_20() { return cPrototypeKeyword_20; }
+		
+		//'instance'
+		public Keyword getInstanceKeyword_21() { return cInstanceKeyword_21; }
+		
+		//'timed'
+		public Keyword getTimedKeyword_22() { return cTimedKeyword_22; }
+		
+		//'input_enabled'
+		public Keyword getInput_enabledKeyword_23() { return cInput_enabledKeyword_23; }
+		
+		//'port'
+		public Keyword getPortKeyword_24() { return cPortKeyword_24; }
+		
+		//'signal'
+		public Keyword getSignalKeyword_25() { return cSignalKeyword_25; }
+		
+		//'buffer'
+		public Keyword getBufferKeyword_26() { return cBufferKeyword_26; }
+		
+		//'channel'
+		public Keyword getChannelKeyword_27() { return cChannelKeyword_27; }
+		
+		//'var'
+		public Keyword getVarKeyword_28() { return cVarKeyword_28; }
+		
+		//'val'
+		public Keyword getValKeyword_29() { return cValKeyword_29; }
+		
+		//'const'
+		public Keyword getConstKeyword_30() { return cConstKeyword_30; }
+		
+		//'input'
+		public Keyword getInputKeyword_31() { return cInputKeyword_31; }
+		
+		//'in'
+		public Keyword getInKeyword_32() { return cInKeyword_32; }
+		
+		//'inout'
+		public Keyword getInoutKeyword_33() { return cInoutKeyword_33; }
+		
+		//'output'
+		public Keyword getOutputKeyword_34() { return cOutputKeyword_34; }
+		
+		//'out'
+		public Keyword getOutKeyword_35() { return cOutKeyword_35; }
+		
+		//'return'
+		public Keyword getReturnKeyword_36() { return cReturnKeyword_36; }
+		
+		//'simple'
+		public Keyword getSimpleKeyword_37() { return cSimpleKeyword_37; }
+		
+		//'start'
+		public Keyword getStartKeyword_38() { return cStartKeyword_38; }
+		
+		//'final'
+		public Keyword getFinalKeyword_39() { return cFinalKeyword_39; }
+		
+		//'initial'
+		public Keyword getInitialKeyword_40() { return cInitialKeyword_40; }
+		
+		//'terminal'
+		public Keyword getTerminalKeyword_41() { return cTerminalKeyword_41; }
+		
+		//'junction'
+		public Keyword getJunctionKeyword_42() { return cJunctionKeyword_42; }
+		
+		//'choice'
+		public Keyword getChoiceKeyword_43() { return cChoiceKeyword_43; }
+		
+		//'fork'
+		public Keyword getForkKeyword_44() { return cForkKeyword_44; }
+		
+		//'join'
+		public Keyword getJoinKeyword_45() { return cJoinKeyword_45; }
+		
+		//'dhistory'
+		public Keyword getDhistoryKeyword_46() { return cDhistoryKeyword_46; }
+		
+		//'shistory'
+		public Keyword getShistoryKeyword_47() { return cShistoryKeyword_47; }
+		
+		//'route'
+		public Keyword getRouteKeyword_48() { return cRouteKeyword_48; }
+		
+		//'connect'
+		public Keyword getConnectKeyword_49() { return cConnectKeyword_49; }
+		
+		//'env'
+		public Keyword getEnvKeyword_50() { return cEnvKeyword_50; }
+		
+		//'rdv'
+		public Keyword getRdvKeyword_51() { return cRdvKeyword_51; }
+		
+		//'multi_rdv'
+		public Keyword getMulti_rdvKeyword_52() { return cMulti_rdvKeyword_52; }
+		
+		//'buffer'
+		public Keyword getBufferKeyword_53() { return cBufferKeyword_53; }
+		
+		//'unicast'
+		public Keyword getUnicastKeyword_54() { return cUnicastKeyword_54; }
+		
+		//'anycast'
+		public Keyword getAnycastKeyword_55() { return cAnycastKeyword_55; }
+		
+		//'multicast'
+		public Keyword getMulticastKeyword_56() { return cMulticastKeyword_56; }
+		
+		//'broadcast'
+		public Keyword getBroadcastKeyword_57() { return cBroadcastKeyword_57; }
+		
+		//'boolean'
+		public Keyword getBooleanKeyword_58() { return cBooleanKeyword_58; }
+		
+		//'bool'
+		public Keyword getBoolKeyword_59() { return cBoolKeyword_59; }
+		
+		//'char'
+		public Keyword getCharKeyword_60() { return cCharKeyword_60; }
+		
+		//'string'
+		public Keyword getStringKeyword_61() { return cStringKeyword_61; }
+		
+		//'message'
+		public Keyword getMessageKeyword_62() { return cMessageKeyword_62; }
+		
+		//'integer'
+		public Keyword getIntegerKeyword_63() { return cIntegerKeyword_63; }
+		
+		//'int'
+		public Keyword getIntKeyword_64() { return cIntKeyword_64; }
+		
+		//'uinteger'
+		public Keyword getUintegerKeyword_65() { return cUintegerKeyword_65; }
+		
+		//'uint'
+		public Keyword getUintKeyword_66() { return cUintKeyword_66; }
+		
+		//'rational'
+		public Keyword getRationalKeyword_67() { return cRationalKeyword_67; }
+		
+		//'rat'
+		public Keyword getRatKeyword_68() { return cRatKeyword_68; }
+		
+		//'urational'
+		public Keyword getUrationalKeyword_69() { return cUrationalKeyword_69; }
+		
+		//'urat'
+		public Keyword getUratKeyword_70() { return cUratKeyword_70; }
+		
+		//'time'
+		public Keyword getTimeKeyword_71() { return cTimeKeyword_71; }
+		
+		//'clock'
+		public Keyword getClockKeyword_72() { return cClockKeyword_72; }
+		
+		//'float'
+		public Keyword getFloatKeyword_73() { return cFloatKeyword_73; }
+		
+		//'double'
+		public Keyword getDoubleKeyword_74() { return cDoubleKeyword_74; }
+		
+		//'real'
+		public Keyword getRealKeyword_75() { return cRealKeyword_75; }
+		
+		//'ufloat'
+		public Keyword getUfloatKeyword_76() { return cUfloatKeyword_76; }
+		
+		//'udouble'
+		public Keyword getUdoubleKeyword_77() { return cUdoubleKeyword_77; }
+		
+		//'ureal'
+		public Keyword getUrealKeyword_78() { return cUrealKeyword_78; }
+		
+		//'interval'
+		public Keyword getIntervalKeyword_79() { return cIntervalKeyword_79; }
+		
+		//'enum'
+		public Keyword getEnumKeyword_80() { return cEnumKeyword_80; }
+		
+		//'struct'
+		public Keyword getStructKeyword_81() { return cStructKeyword_81; }
+		
+		//'union'
+		public Keyword getUnionKeyword_82() { return cUnionKeyword_82; }
+		
+		//'vector'
+		public Keyword getVectorKeyword_83() { return cVectorKeyword_83; }
+		
+		//'rvector'
+		public Keyword getRvectorKeyword_84() { return cRvectorKeyword_84; }
+		
+		//'list'
+		public Keyword getListKeyword_85() { return cListKeyword_85; }
+		
+		//'set'
+		public Keyword getSetKeyword_86() { return cSetKeyword_86; }
+		
+		//'bag'
+		public Keyword getBagKeyword_87() { return cBagKeyword_87; }
+		
+		//'fifo'
+		public Keyword getFifoKeyword_88() { return cFifoKeyword_88; }
+		
+		//'lifo'
+		public Keyword getLifoKeyword_89() { return cLifoKeyword_89; }
+		
+		//'guard'
+		public Keyword getGuardKeyword_90() { return cGuardKeyword_90; }
+		
+		//'tguard'
+		public Keyword getTguardKeyword_91() { return cTguardKeyword_91; }
+		
+		//'event'
+		public Keyword getEventKeyword_92() { return cEventKeyword_92; }
+		
+		//'checksat'
+		public Keyword getChecksatKeyword_93() { return cChecksatKeyword_93; }
+		
+		//'via'
+		public Keyword getViaKeyword_94() { return cViaKeyword_94; }
+		
+		//'newfresh'
+		public Keyword getNewfreshKeyword_95() { return cNewfreshKeyword_95; }
+		
+		//'break'
+		public Keyword getBreakKeyword_96() { return cBreakKeyword_96; }
+		
+		//'continue'
+		public Keyword getContinueKeyword_97() { return cContinueKeyword_97; }
+		
+		//'exit'
+		public Keyword getExitKeyword_98() { return cExitKeyword_98; }
+		
+		//'init'
+		public Keyword getInitKeyword_99() { return cInitKeyword_99; }
+		
+		//'destroy'
+		public Keyword getDestroyKeyword_100() { return cDestroyKeyword_100; }
+		
+		//'stop'
+		public Keyword getStopKeyword_101() { return cStopKeyword_101; }
+		
+		//'abort'
+		public Keyword getAbortKeyword_102() { return cAbortKeyword_102; }
+		
+		//'restart'
+		public Keyword getRestartKeyword_103() { return cRestartKeyword_103; }
+		
+		//'suspend'
+		public Keyword getSuspendKeyword_104() { return cSuspendKeyword_104; }
+		
+		//'resume'
+		public Keyword getResumeKeyword_105() { return cResumeKeyword_105; }
+		
+		//'wait'
+		public Keyword getWaitKeyword_106() { return cWaitKeyword_106; }
+		
+		//'disable'
+		public Keyword getDisableKeyword_107() { return cDisableKeyword_107; }
+		
+		//'enable'
+		public Keyword getEnableKeyword_108() { return cEnableKeyword_108; }
+		
+		//'schedule'
+		public Keyword getScheduleKeyword_109() { return cScheduleKeyword_109; }
+		
+		//'irun'
+		public Keyword getIrunKeyword_110() { return cIrunKeyword_110; }
+		
+		//'run'
+		public Keyword getRunKeyword_111() { return cRunKeyword_111; }
+		
+		//'rtc'
+		public Keyword getRtcKeyword_112() { return cRtcKeyword_112; }
+		
+		//'call'
+		public Keyword getCallKeyword_113() { return cCallKeyword_113; }
+		
+		//'new'
+		public Keyword getNewKeyword_114() { return cNewKeyword_114; }
+		
+		//'ctor'
+		public Keyword getCtorKeyword_115() { return cCtorKeyword_115; }
+		
+		//'this'
+		public Keyword getThisKeyword_116() { return cThisKeyword_116; }
+		
+		//'self'
+		public Keyword getSelfKeyword_117() { return cSelfKeyword_117; }
+		
+		//'parent'
+		public Keyword getParentKeyword_118() { return cParentKeyword_118; }
+		
+		//'super'
+		public Keyword getSuperKeyword_119() { return cSuperKeyword_119; }
+		
+		//'null'
+		public Keyword getNullKeyword_120() { return cNullKeyword_120; }
+	}
+	public class ESIdentifierElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
+		private final RuleCall cXLIA_IDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//ESIdentifier:
+		//	XLIA_ID;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//XLIA_ID
+		public RuleCall getXLIA_IDTerminalRuleCall() { return cXLIA_IDTerminalRuleCall; }
+	}
+	public class ESUfidElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ESUfid");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cXLIA_IDTerminalRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_1_0 = (Alternatives)cGroup_1.eContents().get(0);
+		private final Keyword cFullStopKeyword_1_0_0 = (Keyword)cAlternatives_1_0.eContents().get(0);
+		private final Keyword cColonKeyword_1_0_1 = (Keyword)cAlternatives_1_0.eContents().get(1);
+		private final Keyword cColonColonKeyword_1_0_2 = (Keyword)cAlternatives_1_0.eContents().get(2);
+		private final RuleCall cXLIA_IDTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
+		
+		//ESUfid:
+		//	XLIA_ID (('.' | ':' | '::') XLIA_ID)*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//XLIA_ID (('.' | ':' | '::') XLIA_ID)*
+		public Group getGroup() { return cGroup; }
+		
+		//XLIA_ID
+		public RuleCall getXLIA_IDTerminalRuleCall_0() { return cXLIA_IDTerminalRuleCall_0; }
+		
+		//(('.' | ':' | '::') XLIA_ID)*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//('.' | ':' | '::')
+		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_1_0_0() { return cFullStopKeyword_1_0_0; }
+		
+		//':'
+		public Keyword getColonKeyword_1_0_1() { return cColonKeyword_1_0_1; }
+		
+		//'::'
+		public Keyword getColonColonKeyword_1_0_2() { return cColonColonKeyword_1_0_2; }
+		
+		//XLIA_ID
+		public RuleCall getXLIA_IDTerminalRuleCall_1_1() { return cXLIA_IDTerminalRuleCall_1_1; }
+	}
+	public class UnrestrictedNameElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
+		private final RuleCall cSTRINGTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//UnrestrictedName:
+		//	STRING;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//STRING
+		public RuleCall getSTRINGTerminalRuleCall() { return cSTRINGTerminalRuleCall; }
+	}
+	public class QualifiedNameElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.QualifiedName");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cUnqualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cColonColonKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cNameBindingAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cNameBindingNameBindingParserRuleCall_1_1_0 = (RuleCall)cNameBindingAssignment_1_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cFullStopKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cNameBindingAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cNameBindingNameBindingParserRuleCall_2_1_0 = (RuleCall)cNameBindingAssignment_2_1.eContents().get(0);
+		
+		//QualifiedName fmlCommon::QualifiedName:
+		//	UnqualifiedName ('::' nameBinding+=NameBinding)* ('.' nameBinding+=NameBinding)*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//UnqualifiedName ('::' nameBinding+=NameBinding)* ('.' nameBinding+=NameBinding)*
+		public Group getGroup() { return cGroup; }
+		
+		//UnqualifiedName
+		public RuleCall getUnqualifiedNameParserRuleCall_0() { return cUnqualifiedNameParserRuleCall_0; }
+		
+		//('::' nameBinding+=NameBinding)*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'::'
+		public Keyword getColonColonKeyword_1_0() { return cColonColonKeyword_1_0; }
+		
+		//nameBinding+=NameBinding
+		public Assignment getNameBindingAssignment_1_1() { return cNameBindingAssignment_1_1; }
+		
+		//NameBinding
+		public RuleCall getNameBindingNameBindingParserRuleCall_1_1_0() { return cNameBindingNameBindingParserRuleCall_1_1_0; }
+		
+		//('.' nameBinding+=NameBinding)*
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_2_0() { return cFullStopKeyword_2_0; }
+		
+		//nameBinding+=NameBinding
+		public Assignment getNameBindingAssignment_2_1() { return cNameBindingAssignment_2_1; }
+		
+		//NameBinding
+		public RuleCall getNameBindingNameBindingParserRuleCall_2_1_0() { return cNameBindingNameBindingParserRuleCall_2_1_0; }
+	}
+	public class PotentiallyAmbiguousQualifiedNameElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PotentiallyAmbiguousQualifiedName");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cUnqualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cColonColonKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cNameBindingAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cNameBindingNameBindingParserRuleCall_1_1_0 = (RuleCall)cNameBindingAssignment_1_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Assignment cIsAmbiguousAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final Keyword cIsAmbiguousFullStopKeyword_2_0_0 = (Keyword)cIsAmbiguousAssignment_2_0.eContents().get(0);
+		private final Assignment cNameBindingAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cNameBindingNameBindingParserRuleCall_2_1_0 = (RuleCall)cNameBindingAssignment_2_1.eContents().get(0);
+		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
+		private final Keyword cFullStopKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
+		private final Assignment cNameBindingAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
+		private final RuleCall cNameBindingNameBindingParserRuleCall_2_2_1_0 = (RuleCall)cNameBindingAssignment_2_2_1.eContents().get(0);
+		
+		//PotentiallyAmbiguousQualifiedName fmlCommon::QualifiedName:
+		//	UnqualifiedName ('::' nameBinding+=NameBinding)* (isAmbiguous?='.' nameBinding+=NameBinding ('.'
+		//	nameBinding+=NameBinding)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//UnqualifiedName ('::' nameBinding+=NameBinding)* (isAmbiguous?='.' nameBinding+=NameBinding ('.'
+		//nameBinding+=NameBinding)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//UnqualifiedName
+		public RuleCall getUnqualifiedNameParserRuleCall_0() { return cUnqualifiedNameParserRuleCall_0; }
+		
+		//('::' nameBinding+=NameBinding)*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'::'
+		public Keyword getColonColonKeyword_1_0() { return cColonColonKeyword_1_0; }
+		
+		//nameBinding+=NameBinding
+		public Assignment getNameBindingAssignment_1_1() { return cNameBindingAssignment_1_1; }
+		
+		//NameBinding
+		public RuleCall getNameBindingNameBindingParserRuleCall_1_1_0() { return cNameBindingNameBindingParserRuleCall_1_1_0; }
+		
+		//(isAmbiguous?='.' nameBinding+=NameBinding ('.' nameBinding+=NameBinding)*)?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//isAmbiguous?='.'
+		public Assignment getIsAmbiguousAssignment_2_0() { return cIsAmbiguousAssignment_2_0; }
+		
+		//'.'
+		public Keyword getIsAmbiguousFullStopKeyword_2_0_0() { return cIsAmbiguousFullStopKeyword_2_0_0; }
+		
+		//nameBinding+=NameBinding
+		public Assignment getNameBindingAssignment_2_1() { return cNameBindingAssignment_2_1; }
+		
+		//NameBinding
+		public RuleCall getNameBindingNameBindingParserRuleCall_2_1_0() { return cNameBindingNameBindingParserRuleCall_2_1_0; }
+		
+		//('.' nameBinding+=NameBinding)*
+		public Group getGroup_2_2() { return cGroup_2_2; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_2_2_0() { return cFullStopKeyword_2_2_0; }
+		
+		//nameBinding+=NameBinding
+		public Assignment getNameBindingAssignment_2_2_1() { return cNameBindingAssignment_2_2_1; }
+		
+		//NameBinding
+		public RuleCall getNameBindingNameBindingParserRuleCall_2_2_1_0() { return cNameBindingNameBindingParserRuleCall_2_2_1_0; }
+	}
+	public class ColonQualifiedNameElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ColonQualifiedName");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cUnqualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cColonColonKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cNameBindingAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cNameBindingNameBindingParserRuleCall_1_1_0 = (RuleCall)cNameBindingAssignment_1_1.eContents().get(0);
+		
+		//ColonQualifiedName fmlCommon::QualifiedName:
+		//	UnqualifiedName ('::' nameBinding+=NameBinding)+
+		@Override public ParserRule getRule() { return rule; }
+		
+		//UnqualifiedName ('::' nameBinding+=NameBinding)+
+		public Group getGroup() { return cGroup; }
+		
+		//UnqualifiedName
+		public RuleCall getUnqualifiedNameParserRuleCall_0() { return cUnqualifiedNameParserRuleCall_0; }
+		
+		//('::' nameBinding+=NameBinding)+
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'::'
+		public Keyword getColonColonKeyword_1_0() { return cColonColonKeyword_1_0; }
+		
+		//nameBinding+=NameBinding
+		public Assignment getNameBindingAssignment_1_1() { return cNameBindingAssignment_1_1; }
+		
+		//NameBinding
+		public RuleCall getNameBindingNameBindingParserRuleCall_1_1_0() { return cNameBindingNameBindingParserRuleCall_1_1_0; }
+	}
+	public class DotQualifiedNameElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DotQualifiedName");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cUnqualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cNameBindingAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cNameBindingNameBindingParserRuleCall_1_1_0 = (RuleCall)cNameBindingAssignment_1_1.eContents().get(0);
+		
+		//DotQualifiedName fmlCommon::QualifiedName:
+		//	UnqualifiedName ('.' nameBinding+=NameBinding)+
+		@Override public ParserRule getRule() { return rule; }
+		
+		//UnqualifiedName ('.' nameBinding+=NameBinding)+
+		public Group getGroup() { return cGroup; }
+		
+		//UnqualifiedName
+		public RuleCall getUnqualifiedNameParserRuleCall_0() { return cUnqualifiedNameParserRuleCall_0; }
+		
+		//('.' nameBinding+=NameBinding)+
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
+		
+		//nameBinding+=NameBinding
+		public Assignment getNameBindingAssignment_1_1() { return cNameBindingAssignment_1_1; }
+		
+		//NameBinding
+		public RuleCall getNameBindingNameBindingParserRuleCall_1_1_0() { return cNameBindingNameBindingParserRuleCall_1_1_0; }
+	}
+	public class UnqualifiedNameElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnqualifiedName");
+		private final Assignment cNameBindingAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cNameBindingNameBindingParserRuleCall_0 = (RuleCall)cNameBindingAssignment.eContents().get(0);
+		
+		//UnqualifiedName fmlCommon::QualifiedName:
+		//	nameBinding+=NameBinding
+		@Override public ParserRule getRule() { return rule; }
+		
+		//nameBinding+=NameBinding
+		public Assignment getNameBindingAssignment() { return cNameBindingAssignment; }
+		
+		//NameBinding
+		public RuleCall getNameBindingNameBindingParserRuleCall_0() { return cNameBindingNameBindingParserRuleCall_0; }
+	}
+	public class NameBindingElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.NameBinding");
+		private final RuleCall cXLIA_IDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//NameBinding:
+		//	XLIA_ID;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//XLIA_ID
+		public RuleCall getXLIA_IDTerminalRuleCall() { return cXLIA_IDTerminalRuleCall; }
+	}
+	public class SystemElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.System");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final UnorderedGroup cUnorderedGroup_0 = (UnorderedGroup)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_0_0 = (Assignment)cUnorderedGroup_0.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0_0 = (RuleCall)cVisibilityAssignment_0_0.eContents().get(0);
+		private final Alternatives cAlternatives_0_1 = (Alternatives)cUnorderedGroup_0.eContents().get(1);
+		private final Assignment cTimedAssignment_0_1_0 = (Assignment)cAlternatives_0_1.eContents().get(0);
+		private final Keyword cTimedTimedKeyword_0_1_0_0 = (Keyword)cTimedAssignment_0_1_0.eContents().get(0);
+		private final Assignment cInput_enabledAssignment_0_1_1 = (Assignment)cAlternatives_0_1.eContents().get(1);
+		private final Keyword cInput_enabledInput_enabledKeyword_0_1_1_0 = (Keyword)cInput_enabledAssignment_0_1_1.eContents().get(0);
+		private final Keyword cSystemKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Keyword cMocKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Alternatives cAlternatives_2_2 = (Alternatives)cGroup_2.eContents().get(2);
+		private final Keyword cAndKeyword_2_2_0 = (Keyword)cAlternatives_2_2.eContents().get(0);
+		private final Keyword cOrKeyword_2_2_1 = (Keyword)cAlternatives_2_2.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
+		private final Assignment cPortAssignment_6_0 = (Assignment)cAlternatives_6.eContents().get(0);
+		private final RuleCall cPortPortParserRuleCall_6_0_0 = (RuleCall)cPortAssignment_6_0.eContents().get(0);
+		private final Assignment cSignalAssignment_6_1 = (Assignment)cAlternatives_6.eContents().get(1);
+		private final RuleCall cSignalSignalParserRuleCall_6_1_0 = (RuleCall)cSignalAssignment_6_1.eContents().get(0);
+		private final Assignment cBufferAssignment_6_2 = (Assignment)cAlternatives_6.eContents().get(2);
+		private final RuleCall cBufferBufferParserRuleCall_6_2_0 = (RuleCall)cBufferAssignment_6_2.eContents().get(0);
+		private final Assignment cChannelAssignment_6_3 = (Assignment)cAlternatives_6.eContents().get(3);
+		private final RuleCall cChannelChannelParserRuleCall_6_3_0 = (RuleCall)cChannelAssignment_6_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_6_4 = (Assignment)cAlternatives_6.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_6_4_0 = (RuleCall)cTypedefAssignment_6_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_6_5 = (Assignment)cAlternatives_6.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_6_5_0 = (RuleCall)cPropertyAssignment_6_5.eContents().get(0);
+		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
+		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
+		private final Keyword cPropertyKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1 = (Alternatives)cGroup_7_0.eContents().get(1);
+		private final Assignment cPortAssignment_7_0_1_0 = (Assignment)cAlternatives_7_0_1.eContents().get(0);
+		private final RuleCall cPortPortParserRuleCall_7_0_1_0_0 = (RuleCall)cPortAssignment_7_0_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_0_1_1 = (Assignment)cAlternatives_7_0_1.eContents().get(1);
+		private final RuleCall cSignalSignalParserRuleCall_7_0_1_1_0 = (RuleCall)cSignalAssignment_7_0_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_0_1_2 = (Assignment)cAlternatives_7_0_1.eContents().get(2);
+		private final RuleCall cBufferBufferParserRuleCall_7_0_1_2_0 = (RuleCall)cBufferAssignment_7_0_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_0_1_3 = (Assignment)cAlternatives_7_0_1.eContents().get(3);
+		private final RuleCall cChannelChannelParserRuleCall_7_0_1_3_0 = (RuleCall)cChannelAssignment_7_0_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_0_1_4 = (Assignment)cAlternatives_7_0_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_0_1_4_0 = (RuleCall)cTypedefAssignment_7_0_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_0_1_5 = (Assignment)cAlternatives_7_0_1.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_7_0_1_5_0 = (RuleCall)cPropertyAssignment_7_0_1_5.eContents().get(0);
+		private final Group cGroup_7_1 = (Group)cAlternatives_7.eContents().get(1);
+		private final Keyword cPublicKeyword_7_1_0 = (Keyword)cGroup_7_1.eContents().get(0);
+		private final Alternatives cAlternatives_7_1_1 = (Alternatives)cGroup_7_1.eContents().get(1);
+		private final Assignment cPortAssignment_7_1_1_0 = (Assignment)cAlternatives_7_1_1.eContents().get(0);
+		private final RuleCall cPortPortPublicParserRuleCall_7_1_1_0_0 = (RuleCall)cPortAssignment_7_1_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_1_1_1 = (Assignment)cAlternatives_7_1_1.eContents().get(1);
+		private final RuleCall cSignalSignalPublicParserRuleCall_7_1_1_1_0 = (RuleCall)cSignalAssignment_7_1_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_1_1_2 = (Assignment)cAlternatives_7_1_1.eContents().get(2);
+		private final RuleCall cBufferBufferPublicParserRuleCall_7_1_1_2_0 = (RuleCall)cBufferAssignment_7_1_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_1_1_3 = (Assignment)cAlternatives_7_1_1.eContents().get(3);
+		private final RuleCall cChannelChannelPublicParserRuleCall_7_1_1_3_0 = (RuleCall)cChannelAssignment_7_1_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_1_1_4 = (Assignment)cAlternatives_7_1_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_1_1_4_0 = (RuleCall)cTypedefAssignment_7_1_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_1_1_5 = (Assignment)cAlternatives_7_1_1.eContents().get(5);
+		private final RuleCall cPropertyVariablePublicParserRuleCall_7_1_1_5_0 = (RuleCall)cPropertyAssignment_7_1_1_5.eContents().get(0);
+		private final Group cGroup_7_2 = (Group)cAlternatives_7.eContents().get(2);
+		private final Keyword cProtectedKeyword_7_2_0 = (Keyword)cGroup_7_2.eContents().get(0);
+		private final Alternatives cAlternatives_7_2_1 = (Alternatives)cGroup_7_2.eContents().get(1);
+		private final Assignment cPortAssignment_7_2_1_0 = (Assignment)cAlternatives_7_2_1.eContents().get(0);
+		private final RuleCall cPortPortProtectedParserRuleCall_7_2_1_0_0 = (RuleCall)cPortAssignment_7_2_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_2_1_1 = (Assignment)cAlternatives_7_2_1.eContents().get(1);
+		private final RuleCall cSignalSignalProtectedParserRuleCall_7_2_1_1_0 = (RuleCall)cSignalAssignment_7_2_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_2_1_2 = (Assignment)cAlternatives_7_2_1.eContents().get(2);
+		private final RuleCall cBufferBufferProtectedParserRuleCall_7_2_1_2_0 = (RuleCall)cBufferAssignment_7_2_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_2_1_3 = (Assignment)cAlternatives_7_2_1.eContents().get(3);
+		private final RuleCall cChannelChannelProtectedParserRuleCall_7_2_1_3_0 = (RuleCall)cChannelAssignment_7_2_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_2_1_4 = (Assignment)cAlternatives_7_2_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_2_1_4_0 = (RuleCall)cTypedefAssignment_7_2_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_2_1_5 = (Assignment)cAlternatives_7_2_1.eContents().get(5);
+		private final RuleCall cPropertyVariableProtectedParserRuleCall_7_2_1_5_0 = (RuleCall)cPropertyAssignment_7_2_1_5.eContents().get(0);
+		private final Group cGroup_7_3 = (Group)cAlternatives_7.eContents().get(3);
+		private final Keyword cPrivateKeyword_7_3_0 = (Keyword)cGroup_7_3.eContents().get(0);
+		private final Alternatives cAlternatives_7_3_1 = (Alternatives)cGroup_7_3.eContents().get(1);
+		private final Assignment cPortAssignment_7_3_1_0 = (Assignment)cAlternatives_7_3_1.eContents().get(0);
+		private final RuleCall cPortPortPrivateParserRuleCall_7_3_1_0_0 = (RuleCall)cPortAssignment_7_3_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_3_1_1 = (Assignment)cAlternatives_7_3_1.eContents().get(1);
+		private final RuleCall cSignalSignalPrivateParserRuleCall_7_3_1_1_0 = (RuleCall)cSignalAssignment_7_3_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_3_1_2 = (Assignment)cAlternatives_7_3_1.eContents().get(2);
+		private final RuleCall cBufferBufferPrivateParserRuleCall_7_3_1_2_0 = (RuleCall)cBufferAssignment_7_3_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_3_1_3 = (Assignment)cAlternatives_7_3_1.eContents().get(3);
+		private final RuleCall cChannelChannelPrivateParserRuleCall_7_3_1_3_0 = (RuleCall)cChannelAssignment_7_3_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_3_1_4 = (Assignment)cAlternatives_7_3_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_3_1_4_0 = (RuleCall)cTypedefAssignment_7_3_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_3_1_5 = (Assignment)cAlternatives_7_3_1.eContents().get(5);
+		private final RuleCall cPropertyVariablePrivateParserRuleCall_7_3_1_5_0 = (RuleCall)cPropertyAssignment_7_3_1_5.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Alternatives cAlternatives_8_0 = (Alternatives)cAlternatives_8.eContents().get(0);
+		private final Group cGroup_8_0_0 = (Group)cAlternatives_8_0.eContents().get(0);
+		private final Alternatives cAlternatives_8_0_0_0 = (Alternatives)cGroup_8_0_0.eContents().get(0);
+		private final Keyword cRoutineKeyword_8_0_0_0_0 = (Keyword)cAlternatives_8_0_0_0.eContents().get(0);
+		private final Keyword cMacroKeyword_8_0_0_0_1 = (Keyword)cAlternatives_8_0_0_0.eContents().get(1);
+		private final Assignment cRoutineAssignment_8_0_0_1 = (Assignment)cGroup_8_0_0.eContents().get(1);
+		private final RuleCall cRoutineRoutineParserRuleCall_8_0_0_1_0 = (RuleCall)cRoutineAssignment_8_0_0_1.eContents().get(0);
+		private final Group cGroup_8_0_1 = (Group)cAlternatives_8_0.eContents().get(1);
+		private final Keyword cProcedureKeyword_8_0_1_0 = (Keyword)cGroup_8_0_1.eContents().get(0);
+		private final Assignment cProcedureAssignment_8_0_1_1 = (Assignment)cGroup_8_0_1.eContents().get(1);
+		private final RuleCall cProcedureProcedureParserRuleCall_8_0_1_1_0 = (RuleCall)cProcedureAssignment_8_0_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_8_1 = (Alternatives)cAlternatives_8.eContents().get(1);
+		private final Assignment cRoutineAssignment_8_1_0 = (Assignment)cAlternatives_8_1.eContents().get(0);
+		private final RuleCall cRoutineRoutineParserRuleCall_8_1_0_0 = (RuleCall)cRoutineAssignment_8_1_0.eContents().get(0);
+		private final Assignment cProcedureAssignment_8_1_1 = (Assignment)cAlternatives_8_1.eContents().get(1);
+		private final RuleCall cProcedureProcedureParserRuleCall_8_1_1_0 = (RuleCall)cProcedureAssignment_8_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_9 = (Alternatives)cGroup.eContents().get(9);
+		private final Group cGroup_9_0 = (Group)cAlternatives_9.eContents().get(0);
+		private final Alternatives cAlternatives_9_0_0 = (Alternatives)cGroup_9_0.eContents().get(0);
+		private final Keyword cCompositeKeyword_9_0_0_0 = (Keyword)cAlternatives_9_0_0.eContents().get(0);
+		private final Keyword cMachineKeyword_9_0_0_1 = (Keyword)cAlternatives_9_0_0.eContents().get(1);
+		private final Alternatives cAlternatives_9_0_1 = (Alternatives)cGroup_9_0.eContents().get(1);
+		private final Assignment cMachineAssignment_9_0_1_0 = (Assignment)cAlternatives_9_0_1.eContents().get(0);
+		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_0_1_0_0 = (RuleCall)cMachineAssignment_9_0_1_0.eContents().get(0);
+		private final Assignment cInstanceAssignment_9_0_1_1 = (Assignment)cAlternatives_9_0_1.eContents().get(1);
+		private final RuleCall cInstanceInstanceMachineParserRuleCall_9_0_1_1_0 = (RuleCall)cInstanceAssignment_9_0_1_1.eContents().get(0);
+		private final Group cGroup_9_1 = (Group)cAlternatives_9.eContents().get(1);
+		private final Keyword cModelKeyword_9_1_0 = (Keyword)cGroup_9_1.eContents().get(0);
+		private final Assignment cMachineAssignment_9_1_1 = (Assignment)cGroup_9_1.eContents().get(1);
+		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_1_1_0 = (RuleCall)cMachineAssignment_9_1_1.eContents().get(0);
+		private final Group cGroup_9_2 = (Group)cAlternatives_9.eContents().get(2);
+		private final Keyword cPrototypeKeyword_9_2_0 = (Keyword)cGroup_9_2.eContents().get(0);
+		private final Assignment cMachineAssignment_9_2_1 = (Assignment)cGroup_9_2.eContents().get(1);
+		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_2_1_0 = (RuleCall)cMachineAssignment_9_2_1.eContents().get(0);
+		private final Group cGroup_9_3 = (Group)cAlternatives_9.eContents().get(3);
+		private final Keyword cInstanceKeyword_9_3_0 = (Keyword)cGroup_9_3.eContents().get(0);
+		private final Assignment cInstanceAssignment_9_3_1 = (Assignment)cGroup_9_3.eContents().get(1);
+		private final RuleCall cInstanceInstanceMachineParserRuleCall_9_3_1_0 = (RuleCall)cInstanceAssignment_9_3_1.eContents().get(0);
+		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
+		private final Group cGroup_10_0 = (Group)cAlternatives_10.eContents().get(0);
+		private final Keyword cBehaviorKeyword_10_0_0 = (Keyword)cGroup_10_0.eContents().get(0);
+		private final Assignment cBehaviorAssignment_10_0_1 = (Assignment)cGroup_10_0.eContents().get(1);
+		private final RuleCall cBehaviorBehaviorParserRuleCall_10_0_1_0 = (RuleCall)cBehaviorAssignment_10_0_1.eContents().get(0);
+		private final Group cGroup_10_1 = (Group)cAlternatives_10.eContents().get(1);
+		private final Keyword cStatemachineKeyword_10_1_0 = (Keyword)cGroup_10_1.eContents().get(0);
+		private final Assignment cBehaviorAssignment_10_1_1 = (Assignment)cGroup_10_1.eContents().get(1);
+		private final RuleCall cBehaviorStatemachineParserRuleCall_10_1_1_0 = (RuleCall)cBehaviorAssignment_10_1_1.eContents().get(0);
+		private final Assignment cMainAssignment_11 = (Assignment)cGroup.eContents().get(11);
+		private final RuleCall cMainMoeBehaviorParserRuleCall_11_0 = (RuleCall)cMainAssignment_11.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_12 = (Keyword)cGroup.eContents().get(12);
+		
+		//System fmlInfra::System:
+		//	(visibility=VisibilityKind?
+		//	& (timed?='timed' | input_enabled?='input_enabled')?)
+		//	'system' ('<' 'moc:'? ('and' | 'or') '>')?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	'{' (port+=Port
+		//	| signal+=Signal
+		//	| buffer+=Buffer
+		//	| channel+=Channel
+		//	| typedef+=TypeDefinition
+		//	| property+=Variable)*
+		//	('@property:' (port+=Port
+		//	| signal+=Signal
+		//	| buffer+=Buffer
+		//	| channel+=Channel
+		//	| typedef+=TypeDefinition
+		//	| property+=Variable)*
+		//	| '@public:' (port+=PortPublic
+		//	| signal+=SignalPublic
+		//	| buffer+=BufferPublic
+		//	| channel+=ChannelPublic
+		//	| typedef+=TypeDefinition
+		//	| property+=VariablePublic)*
+		//	| '@protected:' (port+=PortProtected
+		//	| signal+=SignalProtected
+		//	| buffer+=BufferProtected
+		//	| channel+=ChannelProtected
+		//	| typedef+=TypeDefinition
+		//	| property+=VariableProtected)*
+		//	| '@private:' (port+=PortPrivate
+		//	| signal+=SignalPrivate
+		//	| buffer+=BufferPrivate
+		//	| channel+=ChannelPrivate
+		//	| typedef+=TypeDefinition
+		//	| property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+
+		//	| '@procedure:' procedure+=Procedure+)*
+		//	| (routine+=Routine | procedure+=Procedure)+) (('@composite:' | '@machine:') (machine+=AnyMachineBlock
+		//	| instance+=InstanceMachine)+
+		//	| '@model:' machine+=AnyMachineBlock*
+		//	| '@prototype:' machine+=AnyMachineBlock*
+		//	| '@instance:' instance+=InstanceMachine*)* ('@behavior:' behavior+=Behavior+
+		//	| '@statemachine:' behavior+=Statemachine+)*
+		//	main=MoeBehavior
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//(visibility=VisibilityKind? & (timed?='timed' | input_enabled?='input_enabled')?) 'system' ('<' 'moc:'? ('and' | 'or')
+		//'>')? name=ESIdentifier unrestrictedName=UnrestrictedName? '{' (port+=Port | signal+=Signal | buffer+=Buffer |
+		//channel+=Channel | typedef+=TypeDefinition | property+=Variable)* ('@property:' (port+=Port | signal+=Signal |
+		//buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)* | '@public:' (port+=PortPublic |
+		//signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic | typedef+=TypeDefinition |
+		//property+=VariablePublic)* | '@protected:' (port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected |
+		//channel+=ChannelProtected | typedef+=TypeDefinition | property+=VariableProtected)* | '@private:' (port+=PortPrivate |
+		//signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate | typedef+=TypeDefinition |
+		//property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)* |
+		//(routine+=Routine | procedure+=Procedure)+) (('@composite:' | '@machine:') (machine+=AnyMachineBlock |
+		//instance+=InstanceMachine)+ | '@model:' machine+=AnyMachineBlock* | '@prototype:' machine+=AnyMachineBlock* |
+		//'@instance:' instance+=InstanceMachine*)* ('@behavior:' behavior+=Behavior+ | '@statemachine:'
+		//behavior+=Statemachine+)* main=MoeBehavior '}'
+		public Group getGroup() { return cGroup; }
+		
+		//(visibility=VisibilityKind? & (timed?='timed' | input_enabled?='input_enabled')?)
+		public UnorderedGroup getUnorderedGroup_0() { return cUnorderedGroup_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_0_0() { return cVisibilityAssignment_0_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0_0; }
+		
+		//(timed?='timed' | input_enabled?='input_enabled')?
+		public Alternatives getAlternatives_0_1() { return cAlternatives_0_1; }
+		
+		//timed?='timed'
+		public Assignment getTimedAssignment_0_1_0() { return cTimedAssignment_0_1_0; }
+		
+		//'timed'
+		public Keyword getTimedTimedKeyword_0_1_0_0() { return cTimedTimedKeyword_0_1_0_0; }
+		
+		//input_enabled?='input_enabled'
+		public Assignment getInput_enabledAssignment_0_1_1() { return cInput_enabledAssignment_0_1_1; }
+		
+		//'input_enabled'
+		public Keyword getInput_enabledInput_enabledKeyword_0_1_1_0() { return cInput_enabledInput_enabledKeyword_0_1_1_0; }
+		
+		//'system'
+		public Keyword getSystemKeyword_1() { return cSystemKeyword_1; }
+		
+		//('<' 'moc:'? ('and' | 'or') '>')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_2_1() { return cMocKeyword_2_1; }
+		
+		//('and' | 'or')
+		public Alternatives getAlternatives_2_2() { return cAlternatives_2_2; }
+		
+		//'and'
+		public Keyword getAndKeyword_2_2_0() { return cAndKeyword_2_2_0; }
+		
+		//'or'
+		public Keyword getOrKeyword_2_2_1() { return cOrKeyword_2_2_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_5() { return cLeftCurlyBracketKeyword_5; }
+		
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*
+		public Alternatives getAlternatives_6() { return cAlternatives_6; }
+		
+		//port+=Port
+		public Assignment getPortAssignment_6_0() { return cPortAssignment_6_0; }
+		
+		//Port
+		public RuleCall getPortPortParserRuleCall_6_0_0() { return cPortPortParserRuleCall_6_0_0; }
+		
+		//signal+=Signal
+		public Assignment getSignalAssignment_6_1() { return cSignalAssignment_6_1; }
+		
+		//Signal
+		public RuleCall getSignalSignalParserRuleCall_6_1_0() { return cSignalSignalParserRuleCall_6_1_0; }
+		
+		//buffer+=Buffer
+		public Assignment getBufferAssignment_6_2() { return cBufferAssignment_6_2; }
+		
+		//Buffer
+		public RuleCall getBufferBufferParserRuleCall_6_2_0() { return cBufferBufferParserRuleCall_6_2_0; }
+		
+		//channel+=Channel
+		public Assignment getChannelAssignment_6_3() { return cChannelAssignment_6_3; }
+		
+		//Channel
+		public RuleCall getChannelChannelParserRuleCall_6_3_0() { return cChannelChannelParserRuleCall_6_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_6_4() { return cTypedefAssignment_6_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_6_4_0() { return cTypedefTypeDefinitionParserRuleCall_6_4_0; }
+		
+		//property+=Variable
+		public Assignment getPropertyAssignment_6_5() { return cPropertyAssignment_6_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_6_5_0() { return cPropertyVariableParserRuleCall_6_5_0; }
+		
+		//('@property:' (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition |
+		//property+=Variable)* | '@public:' (port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic |
+		//channel+=ChannelPublic | typedef+=TypeDefinition | property+=VariablePublic)* | '@protected:' (port+=PortProtected |
+		//signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected | typedef+=TypeDefinition |
+		//property+=VariableProtected)* | '@private:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate |
+		//channel+=ChannelPrivate | typedef+=TypeDefinition | property+=VariablePrivate)*)*
+		public Alternatives getAlternatives_7() { return cAlternatives_7; }
+		
+		//'@property:' (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition |
+		//property+=Variable)*
+		public Group getGroup_7_0() { return cGroup_7_0; }
+		
+		//'@property:'
+		public Keyword getPropertyKeyword_7_0_0() { return cPropertyKeyword_7_0_0; }
+		
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*
+		public Alternatives getAlternatives_7_0_1() { return cAlternatives_7_0_1; }
+		
+		//port+=Port
+		public Assignment getPortAssignment_7_0_1_0() { return cPortAssignment_7_0_1_0; }
+		
+		//Port
+		public RuleCall getPortPortParserRuleCall_7_0_1_0_0() { return cPortPortParserRuleCall_7_0_1_0_0; }
+		
+		//signal+=Signal
+		public Assignment getSignalAssignment_7_0_1_1() { return cSignalAssignment_7_0_1_1; }
+		
+		//Signal
+		public RuleCall getSignalSignalParserRuleCall_7_0_1_1_0() { return cSignalSignalParserRuleCall_7_0_1_1_0; }
+		
+		//buffer+=Buffer
+		public Assignment getBufferAssignment_7_0_1_2() { return cBufferAssignment_7_0_1_2; }
+		
+		//Buffer
+		public RuleCall getBufferBufferParserRuleCall_7_0_1_2_0() { return cBufferBufferParserRuleCall_7_0_1_2_0; }
+		
+		//channel+=Channel
+		public Assignment getChannelAssignment_7_0_1_3() { return cChannelAssignment_7_0_1_3; }
+		
+		//Channel
+		public RuleCall getChannelChannelParserRuleCall_7_0_1_3_0() { return cChannelChannelParserRuleCall_7_0_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_0_1_4() { return cTypedefAssignment_7_0_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_0_1_4_0; }
+		
+		//property+=Variable
+		public Assignment getPropertyAssignment_7_0_1_5() { return cPropertyAssignment_7_0_1_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_7_0_1_5_0() { return cPropertyVariableParserRuleCall_7_0_1_5_0; }
+		
+		//'@public:' (port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic |
+		//typedef+=TypeDefinition | property+=VariablePublic)*
+		public Group getGroup_7_1() { return cGroup_7_1; }
+		
+		//'@public:'
+		public Keyword getPublicKeyword_7_1_0() { return cPublicKeyword_7_1_0; }
+		
+		//(port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic | typedef+=TypeDefinition |
+		//property+=VariablePublic)*
+		public Alternatives getAlternatives_7_1_1() { return cAlternatives_7_1_1; }
+		
+		//port+=PortPublic
+		public Assignment getPortAssignment_7_1_1_0() { return cPortAssignment_7_1_1_0; }
+		
+		//PortPublic
+		public RuleCall getPortPortPublicParserRuleCall_7_1_1_0_0() { return cPortPortPublicParserRuleCall_7_1_1_0_0; }
+		
+		//signal+=SignalPublic
+		public Assignment getSignalAssignment_7_1_1_1() { return cSignalAssignment_7_1_1_1; }
+		
+		//SignalPublic
+		public RuleCall getSignalSignalPublicParserRuleCall_7_1_1_1_0() { return cSignalSignalPublicParserRuleCall_7_1_1_1_0; }
+		
+		//buffer+=BufferPublic
+		public Assignment getBufferAssignment_7_1_1_2() { return cBufferAssignment_7_1_1_2; }
+		
+		//BufferPublic
+		public RuleCall getBufferBufferPublicParserRuleCall_7_1_1_2_0() { return cBufferBufferPublicParserRuleCall_7_1_1_2_0; }
+		
+		//channel+=ChannelPublic
+		public Assignment getChannelAssignment_7_1_1_3() { return cChannelAssignment_7_1_1_3; }
+		
+		//ChannelPublic
+		public RuleCall getChannelChannelPublicParserRuleCall_7_1_1_3_0() { return cChannelChannelPublicParserRuleCall_7_1_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_1_1_4() { return cTypedefAssignment_7_1_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_1_1_4_0; }
+		
+		//property+=VariablePublic
+		public Assignment getPropertyAssignment_7_1_1_5() { return cPropertyAssignment_7_1_1_5; }
+		
+		//VariablePublic
+		public RuleCall getPropertyVariablePublicParserRuleCall_7_1_1_5_0() { return cPropertyVariablePublicParserRuleCall_7_1_1_5_0; }
+		
+		//'@protected:' (port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected |
+		//typedef+=TypeDefinition | property+=VariableProtected)*
+		public Group getGroup_7_2() { return cGroup_7_2; }
+		
+		//'@protected:'
+		public Keyword getProtectedKeyword_7_2_0() { return cProtectedKeyword_7_2_0; }
+		
+		//(port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected |
+		//typedef+=TypeDefinition | property+=VariableProtected)*
+		public Alternatives getAlternatives_7_2_1() { return cAlternatives_7_2_1; }
+		
+		//port+=PortProtected
+		public Assignment getPortAssignment_7_2_1_0() { return cPortAssignment_7_2_1_0; }
+		
+		//PortProtected
+		public RuleCall getPortPortProtectedParserRuleCall_7_2_1_0_0() { return cPortPortProtectedParserRuleCall_7_2_1_0_0; }
+		
+		//signal+=SignalProtected
+		public Assignment getSignalAssignment_7_2_1_1() { return cSignalAssignment_7_2_1_1; }
+		
+		//SignalProtected
+		public RuleCall getSignalSignalProtectedParserRuleCall_7_2_1_1_0() { return cSignalSignalProtectedParserRuleCall_7_2_1_1_0; }
+		
+		//buffer+=BufferProtected
+		public Assignment getBufferAssignment_7_2_1_2() { return cBufferAssignment_7_2_1_2; }
+		
+		//BufferProtected
+		public RuleCall getBufferBufferProtectedParserRuleCall_7_2_1_2_0() { return cBufferBufferProtectedParserRuleCall_7_2_1_2_0; }
+		
+		//channel+=ChannelProtected
+		public Assignment getChannelAssignment_7_2_1_3() { return cChannelAssignment_7_2_1_3; }
+		
+		//ChannelProtected
+		public RuleCall getChannelChannelProtectedParserRuleCall_7_2_1_3_0() { return cChannelChannelProtectedParserRuleCall_7_2_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_2_1_4() { return cTypedefAssignment_7_2_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_2_1_4_0; }
+		
+		//property+=VariableProtected
+		public Assignment getPropertyAssignment_7_2_1_5() { return cPropertyAssignment_7_2_1_5; }
+		
+		//VariableProtected
+		public RuleCall getPropertyVariableProtectedParserRuleCall_7_2_1_5_0() { return cPropertyVariableProtectedParserRuleCall_7_2_1_5_0; }
+		
+		//'@private:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate |
+		//typedef+=TypeDefinition | property+=VariablePrivate)*
+		public Group getGroup_7_3() { return cGroup_7_3; }
+		
+		//'@private:'
+		public Keyword getPrivateKeyword_7_3_0() { return cPrivateKeyword_7_3_0; }
+		
+		//(port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate | typedef+=TypeDefinition |
+		//property+=VariablePrivate)*
+		public Alternatives getAlternatives_7_3_1() { return cAlternatives_7_3_1; }
+		
+		//port+=PortPrivate
+		public Assignment getPortAssignment_7_3_1_0() { return cPortAssignment_7_3_1_0; }
+		
+		//PortPrivate
+		public RuleCall getPortPortPrivateParserRuleCall_7_3_1_0_0() { return cPortPortPrivateParserRuleCall_7_3_1_0_0; }
+		
+		//signal+=SignalPrivate
+		public Assignment getSignalAssignment_7_3_1_1() { return cSignalAssignment_7_3_1_1; }
+		
+		//SignalPrivate
+		public RuleCall getSignalSignalPrivateParserRuleCall_7_3_1_1_0() { return cSignalSignalPrivateParserRuleCall_7_3_1_1_0; }
+		
+		//buffer+=BufferPrivate
+		public Assignment getBufferAssignment_7_3_1_2() { return cBufferAssignment_7_3_1_2; }
+		
+		//BufferPrivate
+		public RuleCall getBufferBufferPrivateParserRuleCall_7_3_1_2_0() { return cBufferBufferPrivateParserRuleCall_7_3_1_2_0; }
+		
+		//channel+=ChannelPrivate
+		public Assignment getChannelAssignment_7_3_1_3() { return cChannelAssignment_7_3_1_3; }
+		
+		//ChannelPrivate
+		public RuleCall getChannelChannelPrivateParserRuleCall_7_3_1_3_0() { return cChannelChannelPrivateParserRuleCall_7_3_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_3_1_4() { return cTypedefAssignment_7_3_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_3_1_4_0; }
+		
+		//property+=VariablePrivate
+		public Assignment getPropertyAssignment_7_3_1_5() { return cPropertyAssignment_7_3_1_5; }
+		
+		//VariablePrivate
+		public RuleCall getPropertyVariablePrivateParserRuleCall_7_3_1_5_0() { return cPropertyVariablePrivateParserRuleCall_7_3_1_5_0; }
+		
+		//((('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)* | (routine+=Routine |
+		//procedure+=Procedure)+)
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//(('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)*
+		public Alternatives getAlternatives_8_0() { return cAlternatives_8_0; }
+		
+		//('@routine:' | '@macro:') routine+=Routine+
+		public Group getGroup_8_0_0() { return cGroup_8_0_0; }
+		
+		//('@routine:' | '@macro:')
+		public Alternatives getAlternatives_8_0_0_0() { return cAlternatives_8_0_0_0; }
+		
+		//'@routine:'
+		public Keyword getRoutineKeyword_8_0_0_0_0() { return cRoutineKeyword_8_0_0_0_0; }
+		
+		//'@macro:'
+		public Keyword getMacroKeyword_8_0_0_0_1() { return cMacroKeyword_8_0_0_0_1; }
+		
+		//routine+=Routine+
+		public Assignment getRoutineAssignment_8_0_0_1() { return cRoutineAssignment_8_0_0_1; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_8_0_0_1_0() { return cRoutineRoutineParserRuleCall_8_0_0_1_0; }
+		
+		//'@procedure:' procedure+=Procedure+
+		public Group getGroup_8_0_1() { return cGroup_8_0_1; }
+		
+		//'@procedure:'
+		public Keyword getProcedureKeyword_8_0_1_0() { return cProcedureKeyword_8_0_1_0; }
+		
+		//procedure+=Procedure+
+		public Assignment getProcedureAssignment_8_0_1_1() { return cProcedureAssignment_8_0_1_1; }
+		
+		//Procedure
+		public RuleCall getProcedureProcedureParserRuleCall_8_0_1_1_0() { return cProcedureProcedureParserRuleCall_8_0_1_1_0; }
+		
+		//(routine+=Routine | procedure+=Procedure)+
+		public Alternatives getAlternatives_8_1() { return cAlternatives_8_1; }
+		
+		//routine+=Routine
+		public Assignment getRoutineAssignment_8_1_0() { return cRoutineAssignment_8_1_0; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_8_1_0_0() { return cRoutineRoutineParserRuleCall_8_1_0_0; }
+		
+		//procedure+=Procedure
+		public Assignment getProcedureAssignment_8_1_1() { return cProcedureAssignment_8_1_1; }
+		
+		//Procedure
+		public RuleCall getProcedureProcedureParserRuleCall_8_1_1_0() { return cProcedureProcedureParserRuleCall_8_1_1_0; }
+		
+		//(('@composite:' | '@machine:') (machine+=AnyMachineBlock | instance+=InstanceMachine)+ | '@model:'
+		//machine+=AnyMachineBlock* | '@prototype:' machine+=AnyMachineBlock* | '@instance:' instance+=InstanceMachine*)*
+		public Alternatives getAlternatives_9() { return cAlternatives_9; }
+		
+		//('@composite:' | '@machine:') (machine+=AnyMachineBlock | instance+=InstanceMachine)+
+		public Group getGroup_9_0() { return cGroup_9_0; }
+		
+		//('@composite:' | '@machine:')
+		public Alternatives getAlternatives_9_0_0() { return cAlternatives_9_0_0; }
+		
+		//'@composite:'
+		public Keyword getCompositeKeyword_9_0_0_0() { return cCompositeKeyword_9_0_0_0; }
+		
+		//'@machine:'
+		public Keyword getMachineKeyword_9_0_0_1() { return cMachineKeyword_9_0_0_1; }
+		
+		//(machine+=AnyMachineBlock | instance+=InstanceMachine)+
+		public Alternatives getAlternatives_9_0_1() { return cAlternatives_9_0_1; }
+		
+		//machine+=AnyMachineBlock
+		public Assignment getMachineAssignment_9_0_1_0() { return cMachineAssignment_9_0_1_0; }
+		
+		//AnyMachineBlock
+		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0() { return cMachineAnyMachineBlockParserRuleCall_9_0_1_0_0; }
+		
+		//instance+=InstanceMachine
+		public Assignment getInstanceAssignment_9_0_1_1() { return cInstanceAssignment_9_0_1_1; }
+		
+		//InstanceMachine
+		public RuleCall getInstanceInstanceMachineParserRuleCall_9_0_1_1_0() { return cInstanceInstanceMachineParserRuleCall_9_0_1_1_0; }
+		
+		//'@model:' machine+=AnyMachineBlock*
+		public Group getGroup_9_1() { return cGroup_9_1; }
+		
+		//'@model:'
+		public Keyword getModelKeyword_9_1_0() { return cModelKeyword_9_1_0; }
+		
+		//machine+=AnyMachineBlock*
+		public Assignment getMachineAssignment_9_1_1() { return cMachineAssignment_9_1_1; }
+		
+		//AnyMachineBlock
+		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_1_1_0() { return cMachineAnyMachineBlockParserRuleCall_9_1_1_0; }
+		
+		//'@prototype:' machine+=AnyMachineBlock*
+		public Group getGroup_9_2() { return cGroup_9_2; }
+		
+		//'@prototype:'
+		public Keyword getPrototypeKeyword_9_2_0() { return cPrototypeKeyword_9_2_0; }
+		
+		//machine+=AnyMachineBlock*
+		public Assignment getMachineAssignment_9_2_1() { return cMachineAssignment_9_2_1; }
+		
+		//AnyMachineBlock
+		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_2_1_0() { return cMachineAnyMachineBlockParserRuleCall_9_2_1_0; }
+		
+		//'@instance:' instance+=InstanceMachine*
+		public Group getGroup_9_3() { return cGroup_9_3; }
+		
+		//'@instance:'
+		public Keyword getInstanceKeyword_9_3_0() { return cInstanceKeyword_9_3_0; }
+		
+		//instance+=InstanceMachine*
+		public Assignment getInstanceAssignment_9_3_1() { return cInstanceAssignment_9_3_1; }
+		
+		//InstanceMachine
+		public RuleCall getInstanceInstanceMachineParserRuleCall_9_3_1_0() { return cInstanceInstanceMachineParserRuleCall_9_3_1_0; }
+		
+		//('@behavior:' behavior+=Behavior+ | '@statemachine:' behavior+=Statemachine+)*
+		public Alternatives getAlternatives_10() { return cAlternatives_10; }
+		
+		//'@behavior:' behavior+=Behavior+
+		public Group getGroup_10_0() { return cGroup_10_0; }
+		
+		//'@behavior:'
+		public Keyword getBehaviorKeyword_10_0_0() { return cBehaviorKeyword_10_0_0; }
+		
+		//behavior+=Behavior+
+		public Assignment getBehaviorAssignment_10_0_1() { return cBehaviorAssignment_10_0_1; }
+		
+		//Behavior
+		public RuleCall getBehaviorBehaviorParserRuleCall_10_0_1_0() { return cBehaviorBehaviorParserRuleCall_10_0_1_0; }
+		
+		//'@statemachine:' behavior+=Statemachine+
+		public Group getGroup_10_1() { return cGroup_10_1; }
+		
+		//'@statemachine:'
+		public Keyword getStatemachineKeyword_10_1_0() { return cStatemachineKeyword_10_1_0; }
+		
+		//behavior+=Statemachine+
+		public Assignment getBehaviorAssignment_10_1_1() { return cBehaviorAssignment_10_1_1; }
+		
+		//Statemachine
+		public RuleCall getBehaviorStatemachineParserRuleCall_10_1_1_0() { return cBehaviorStatemachineParserRuleCall_10_1_1_0; }
+		
+		//main=MoeBehavior
+		public Assignment getMainAssignment_11() { return cMainAssignment_11; }
+		
+		//MoeBehavior
+		public RuleCall getMainMoeBehaviorParserRuleCall_11_0() { return cMainMoeBehaviorParserRuleCall_11_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_12() { return cRightCurlyBracketKeyword_12; }
+	}
+	public class AnyMachineBlockElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cMachineBlockParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStatemachineParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//AnyMachineBlock fmlInfra::Machine:
+		//	MachineBlock
+		//	| Statemachine
+		@Override public ParserRule getRule() { return rule; }
+		
+		//MachineBlock | Statemachine
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//MachineBlock
+		public RuleCall getMachineBlockParserRuleCall_0() { return cMachineBlockParserRuleCall_0; }
+		
+		//Statemachine
+		public RuleCall getStatemachineParserRuleCall_1() { return cStatemachineParserRuleCall_1; }
+	}
+	public class InstanceMachineElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cInstanceKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Keyword cMachineKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
+		private final Keyword cStatemachineKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Keyword cModelKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cModelAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final CrossReference cModelMachineCrossReference_4_0 = (CrossReference)cModelAssignment_4.eContents().get(0);
+		private final RuleCall cModelMachineESUfidParserRuleCall_4_0_1 = (RuleCall)cModelMachineCrossReference_4_0.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cNameAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cNameESIdentifierParserRuleCall_6_0 = (RuleCall)cNameAssignment_6.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0 = (RuleCall)cUnrestrictedNameAssignment_7.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
+		private final Group cGroup_8_0_0 = (Group)cGroup_8_0.eContents().get(0);
+		private final Keyword cLeftParenthesisKeyword_8_0_0_0 = (Keyword)cGroup_8_0_0.eContents().get(0);
+		private final Group cGroup_8_0_0_1 = (Group)cGroup_8_0_0.eContents().get(1);
+		private final Assignment cSlotAssignment_8_0_0_1_0 = (Assignment)cGroup_8_0_0_1.eContents().get(0);
+		private final RuleCall cSlotSlotParameterParserRuleCall_8_0_0_1_0_0 = (RuleCall)cSlotAssignment_8_0_0_1_0.eContents().get(0);
+		private final Group cGroup_8_0_0_1_1 = (Group)cGroup_8_0_0_1.eContents().get(1);
+		private final Keyword cCommaKeyword_8_0_0_1_1_0 = (Keyword)cGroup_8_0_0_1_1.eContents().get(0);
+		private final Assignment cSlotAssignment_8_0_0_1_1_1 = (Assignment)cGroup_8_0_0_1_1.eContents().get(1);
+		private final RuleCall cSlotSlotParameterParserRuleCall_8_0_0_1_1_1_0 = (RuleCall)cSlotAssignment_8_0_0_1_1_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_8_0_0_2 = (Keyword)cGroup_8_0_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_8_0_1 = (Keyword)cGroup_8_0.eContents().get(1);
+		private final Group cGroup_8_1 = (Group)cAlternatives_8.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_1_0 = (Keyword)cGroup_8_1.eContents().get(0);
+		private final Group cGroup_8_1_1 = (Group)cGroup_8_1.eContents().get(1);
+		private final Assignment cSlotAssignment_8_1_1_0 = (Assignment)cGroup_8_1_1.eContents().get(0);
+		private final RuleCall cSlotSlotPropertyParserRuleCall_8_1_1_0_0 = (RuleCall)cSlotAssignment_8_1_1_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_8_1_1_1 = (Keyword)cGroup_8_1_1.eContents().get(1);
+		private final Keyword cRightCurlyBracketKeyword_8_1_2 = (Keyword)cGroup_8_1.eContents().get(2);
+		
+		//InstanceMachine fmlInfra::InstanceMachine:
+		//	'instance' ('machine' | 'statemachine')?
+		//	'<' 'model:'? model=[fmlInfra::Machine|ESUfid] '>'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? (('(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')')? ';'
+		//	| '{' (slot+=SlotProperty ';')* '}')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'instance' ('machine' | 'statemachine')? '<' 'model:'? model=[fmlInfra::Machine|ESUfid] '>' name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? (('(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')')? ';' | '{'
+		//(slot+=SlotProperty ';')* '}')
+		public Group getGroup() { return cGroup; }
+		
+		//'instance'
+		public Keyword getInstanceKeyword_0() { return cInstanceKeyword_0; }
+		
+		//('machine' | 'statemachine')?
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//'machine'
+		public Keyword getMachineKeyword_1_0() { return cMachineKeyword_1_0; }
+		
+		//'statemachine'
+		public Keyword getStatemachineKeyword_1_1() { return cStatemachineKeyword_1_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
+		
+		//'model:'?
+		public Keyword getModelKeyword_3() { return cModelKeyword_3; }
+		
+		//model=[fmlInfra::Machine|ESUfid]
+		public Assignment getModelAssignment_4() { return cModelAssignment_4; }
+		
+		//[fmlInfra::Machine|ESUfid]
+		public CrossReference getModelMachineCrossReference_4_0() { return cModelMachineCrossReference_4_0; }
+		
+		//ESUfid
+		public RuleCall getModelMachineESUfidParserRuleCall_4_0_1() { return cModelMachineESUfidParserRuleCall_4_0_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_5() { return cGreaterThanSignKeyword_5; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_6() { return cNameAssignment_6; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_6_0() { return cNameESIdentifierParserRuleCall_6_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_7() { return cUnrestrictedNameAssignment_7; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0; }
+		
+		//(('(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')')? ';' | '{' (slot+=SlotProperty ';')* '}')
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//('(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')')? ';'
+		public Group getGroup_8_0() { return cGroup_8_0; }
+		
+		//('(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')')?
+		public Group getGroup_8_0_0() { return cGroup_8_0_0; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_8_0_0_0() { return cLeftParenthesisKeyword_8_0_0_0; }
+		
+		//(slot+=SlotParameter (',' slot+=SlotParameter)*)?
+		public Group getGroup_8_0_0_1() { return cGroup_8_0_0_1; }
+		
+		//slot+=SlotParameter
+		public Assignment getSlotAssignment_8_0_0_1_0() { return cSlotAssignment_8_0_0_1_0; }
+		
+		//SlotParameter
+		public RuleCall getSlotSlotParameterParserRuleCall_8_0_0_1_0_0() { return cSlotSlotParameterParserRuleCall_8_0_0_1_0_0; }
+		
+		//(',' slot+=SlotParameter)*
+		public Group getGroup_8_0_0_1_1() { return cGroup_8_0_0_1_1; }
+		
+		//','
+		public Keyword getCommaKeyword_8_0_0_1_1_0() { return cCommaKeyword_8_0_0_1_1_0; }
+		
+		//slot+=SlotParameter
+		public Assignment getSlotAssignment_8_0_0_1_1_1() { return cSlotAssignment_8_0_0_1_1_1; }
+		
+		//SlotParameter
+		public RuleCall getSlotSlotParameterParserRuleCall_8_0_0_1_1_1_0() { return cSlotSlotParameterParserRuleCall_8_0_0_1_1_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_8_0_0_2() { return cRightParenthesisKeyword_8_0_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_8_0_1() { return cSemicolonKeyword_8_0_1; }
+		
+		//'{' (slot+=SlotProperty ';')* '}'
+		public Group getGroup_8_1() { return cGroup_8_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_1_0() { return cLeftCurlyBracketKeyword_8_1_0; }
+		
+		//(slot+=SlotProperty ';')*
+		public Group getGroup_8_1_1() { return cGroup_8_1_1; }
+		
+		//slot+=SlotProperty
+		public Assignment getSlotAssignment_8_1_1_0() { return cSlotAssignment_8_1_1_0; }
+		
+		//SlotProperty
+		public RuleCall getSlotSlotPropertyParserRuleCall_8_1_1_0_0() { return cSlotSlotPropertyParserRuleCall_8_1_1_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_8_1_1_1() { return cSemicolonKeyword_8_1_1_1; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_1_2() { return cRightCurlyBracketKeyword_8_1_2; }
+	}
+	public class SlotParameterElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cXliaPropertyAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final CrossReference cXliaPropertyPropertyDefinitionCrossReference_0_0 = (CrossReference)cXliaPropertyAssignment_0.eContents().get(0);
+		private final RuleCall cXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1 = (RuleCall)cXliaPropertyPropertyDefinitionCrossReference_0_0.eContents().get(1);
+		private final Keyword cColonKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cValueExpressionParserRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
+		
+		//SlotParameter fmlInfra::SlotProperty:
+		//	xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier] ':' value=Expression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier] ':' value=Expression
+		public Group getGroup() { return cGroup; }
+		
+		//xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
+		public Assignment getXliaPropertyAssignment_0() { return cXliaPropertyAssignment_0; }
+		
+		//[fmlInfra::PropertyDefinition|ESIdentifier]
+		public CrossReference getXliaPropertyPropertyDefinitionCrossReference_0_0() { return cXliaPropertyPropertyDefinitionCrossReference_0_0; }
+		
+		//ESIdentifier
+		public RuleCall getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1() { return cXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1; }
+		
+		//':'
+		public Keyword getColonKeyword_1() { return cColonKeyword_1; }
+		
+		//value=Expression
+		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
+		
+		//Expression
+		public RuleCall getValueExpressionParserRuleCall_2_0() { return cValueExpressionParserRuleCall_2_0; }
+	}
+	public class SlotPropertyElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SlotProperty");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cXliaPropertyAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final CrossReference cXliaPropertyPropertyDefinitionCrossReference_0_0 = (CrossReference)cXliaPropertyAssignment_0.eContents().get(0);
+		private final RuleCall cXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1 = (RuleCall)cXliaPropertyPropertyDefinitionCrossReference_0_0.eContents().get(1);
+		private final Keyword cEqualsSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cValueExpressionParserRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
+		
+		//SlotProperty fmlInfra::SlotProperty:
+		//	xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier] '=' value=Expression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier] '=' value=Expression
+		public Group getGroup() { return cGroup; }
+		
+		//xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
+		public Assignment getXliaPropertyAssignment_0() { return cXliaPropertyAssignment_0; }
+		
+		//[fmlInfra::PropertyDefinition|ESIdentifier]
+		public CrossReference getXliaPropertyPropertyDefinitionCrossReference_0_0() { return cXliaPropertyPropertyDefinitionCrossReference_0_0; }
+		
+		//ESIdentifier
+		public RuleCall getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1() { return cXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_1() { return cEqualsSignKeyword_1; }
+		
+		//value=Expression
+		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
+		
+		//Expression
+		public RuleCall getValueExpressionParserRuleCall_2_0() { return cValueExpressionParserRuleCall_2_0; }
+	}
+	public class MachineBlockElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.MachineBlock");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final UnorderedGroup cUnorderedGroup_0 = (UnorderedGroup)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_0_0 = (Assignment)cUnorderedGroup_0.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0_0 = (RuleCall)cVisibilityAssignment_0_0.eContents().get(0);
+		private final Alternatives cAlternatives_0_1 = (Alternatives)cUnorderedGroup_0.eContents().get(1);
+		private final Assignment cTimedAssignment_0_1_0 = (Assignment)cAlternatives_0_1.eContents().get(0);
+		private final Keyword cTimedTimedKeyword_0_1_0_0 = (Keyword)cTimedAssignment_0_1_0.eContents().get(0);
+		private final Assignment cInput_enabledAssignment_0_1_1 = (Assignment)cAlternatives_0_1.eContents().get(1);
+		private final Keyword cInput_enabledInput_enabledKeyword_0_1_1_0 = (Keyword)cInput_enabledAssignment_0_1_1.eContents().get(0);
+		private final Assignment cDesignAssignment_0_2 = (Assignment)cUnorderedGroup_0.eContents().get(2);
+		private final RuleCall cDesignDesignKindEnumRuleCall_0_2_0 = (RuleCall)cDesignAssignment_0_2.eContents().get(0);
+		private final Keyword cMachineKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Keyword cMocKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Alternatives cAlternatives_2_2 = (Alternatives)cGroup_2.eContents().get(2);
+		private final Keyword cAndKeyword_2_2_0 = (Keyword)cAlternatives_2_2.eContents().get(0);
+		private final Keyword cOrKeyword_2_2_1 = (Keyword)cAlternatives_2_2.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
+		private final Assignment cPortAssignment_6_0 = (Assignment)cAlternatives_6.eContents().get(0);
+		private final RuleCall cPortPortParserRuleCall_6_0_0 = (RuleCall)cPortAssignment_6_0.eContents().get(0);
+		private final Assignment cSignalAssignment_6_1 = (Assignment)cAlternatives_6.eContents().get(1);
+		private final RuleCall cSignalSignalParserRuleCall_6_1_0 = (RuleCall)cSignalAssignment_6_1.eContents().get(0);
+		private final Assignment cBufferAssignment_6_2 = (Assignment)cAlternatives_6.eContents().get(2);
+		private final RuleCall cBufferBufferParserRuleCall_6_2_0 = (RuleCall)cBufferAssignment_6_2.eContents().get(0);
+		private final Assignment cChannelAssignment_6_3 = (Assignment)cAlternatives_6.eContents().get(3);
+		private final RuleCall cChannelChannelParserRuleCall_6_3_0 = (RuleCall)cChannelAssignment_6_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_6_4 = (Assignment)cAlternatives_6.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_6_4_0 = (RuleCall)cTypedefAssignment_6_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_6_5 = (Assignment)cAlternatives_6.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_6_5_0 = (RuleCall)cPropertyAssignment_6_5.eContents().get(0);
+		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
+		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
+		private final Keyword cPropertyKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1 = (Alternatives)cGroup_7_0.eContents().get(1);
+		private final Assignment cPortAssignment_7_0_1_0 = (Assignment)cAlternatives_7_0_1.eContents().get(0);
+		private final RuleCall cPortPortParserRuleCall_7_0_1_0_0 = (RuleCall)cPortAssignment_7_0_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_0_1_1 = (Assignment)cAlternatives_7_0_1.eContents().get(1);
+		private final RuleCall cSignalSignalParserRuleCall_7_0_1_1_0 = (RuleCall)cSignalAssignment_7_0_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_0_1_2 = (Assignment)cAlternatives_7_0_1.eContents().get(2);
+		private final RuleCall cBufferBufferParserRuleCall_7_0_1_2_0 = (RuleCall)cBufferAssignment_7_0_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_0_1_3 = (Assignment)cAlternatives_7_0_1.eContents().get(3);
+		private final RuleCall cChannelChannelParserRuleCall_7_0_1_3_0 = (RuleCall)cChannelAssignment_7_0_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_0_1_4 = (Assignment)cAlternatives_7_0_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_0_1_4_0 = (RuleCall)cTypedefAssignment_7_0_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_0_1_5 = (Assignment)cAlternatives_7_0_1.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_7_0_1_5_0 = (RuleCall)cPropertyAssignment_7_0_1_5.eContents().get(0);
+		private final Group cGroup_7_1 = (Group)cAlternatives_7.eContents().get(1);
+		private final Keyword cPublicKeyword_7_1_0 = (Keyword)cGroup_7_1.eContents().get(0);
+		private final Alternatives cAlternatives_7_1_1 = (Alternatives)cGroup_7_1.eContents().get(1);
+		private final Assignment cPortAssignment_7_1_1_0 = (Assignment)cAlternatives_7_1_1.eContents().get(0);
+		private final RuleCall cPortPortPublicParserRuleCall_7_1_1_0_0 = (RuleCall)cPortAssignment_7_1_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_1_1_1 = (Assignment)cAlternatives_7_1_1.eContents().get(1);
+		private final RuleCall cSignalSignalPublicParserRuleCall_7_1_1_1_0 = (RuleCall)cSignalAssignment_7_1_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_1_1_2 = (Assignment)cAlternatives_7_1_1.eContents().get(2);
+		private final RuleCall cBufferBufferPublicParserRuleCall_7_1_1_2_0 = (RuleCall)cBufferAssignment_7_1_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_1_1_3 = (Assignment)cAlternatives_7_1_1.eContents().get(3);
+		private final RuleCall cChannelChannelPublicParserRuleCall_7_1_1_3_0 = (RuleCall)cChannelAssignment_7_1_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_1_1_4 = (Assignment)cAlternatives_7_1_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_1_1_4_0 = (RuleCall)cTypedefAssignment_7_1_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_1_1_5 = (Assignment)cAlternatives_7_1_1.eContents().get(5);
+		private final RuleCall cPropertyVariablePublicParserRuleCall_7_1_1_5_0 = (RuleCall)cPropertyAssignment_7_1_1_5.eContents().get(0);
+		private final Group cGroup_7_2 = (Group)cAlternatives_7.eContents().get(2);
+		private final Keyword cProtectedKeyword_7_2_0 = (Keyword)cGroup_7_2.eContents().get(0);
+		private final Alternatives cAlternatives_7_2_1 = (Alternatives)cGroup_7_2.eContents().get(1);
+		private final Assignment cPortAssignment_7_2_1_0 = (Assignment)cAlternatives_7_2_1.eContents().get(0);
+		private final RuleCall cPortPortProtectedParserRuleCall_7_2_1_0_0 = (RuleCall)cPortAssignment_7_2_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_2_1_1 = (Assignment)cAlternatives_7_2_1.eContents().get(1);
+		private final RuleCall cSignalSignalProtectedParserRuleCall_7_2_1_1_0 = (RuleCall)cSignalAssignment_7_2_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_2_1_2 = (Assignment)cAlternatives_7_2_1.eContents().get(2);
+		private final RuleCall cBufferBufferProtectedParserRuleCall_7_2_1_2_0 = (RuleCall)cBufferAssignment_7_2_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_2_1_3 = (Assignment)cAlternatives_7_2_1.eContents().get(3);
+		private final RuleCall cChannelChannelProtectedParserRuleCall_7_2_1_3_0 = (RuleCall)cChannelAssignment_7_2_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_2_1_4 = (Assignment)cAlternatives_7_2_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_2_1_4_0 = (RuleCall)cTypedefAssignment_7_2_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_2_1_5 = (Assignment)cAlternatives_7_2_1.eContents().get(5);
+		private final RuleCall cPropertyVariableProtectedParserRuleCall_7_2_1_5_0 = (RuleCall)cPropertyAssignment_7_2_1_5.eContents().get(0);
+		private final Group cGroup_7_3 = (Group)cAlternatives_7.eContents().get(3);
+		private final Keyword cPrivateKeyword_7_3_0 = (Keyword)cGroup_7_3.eContents().get(0);
+		private final Alternatives cAlternatives_7_3_1 = (Alternatives)cGroup_7_3.eContents().get(1);
+		private final Assignment cPortAssignment_7_3_1_0 = (Assignment)cAlternatives_7_3_1.eContents().get(0);
+		private final RuleCall cPortPortPrivateParserRuleCall_7_3_1_0_0 = (RuleCall)cPortAssignment_7_3_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_3_1_1 = (Assignment)cAlternatives_7_3_1.eContents().get(1);
+		private final RuleCall cSignalSignalPrivateParserRuleCall_7_3_1_1_0 = (RuleCall)cSignalAssignment_7_3_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_3_1_2 = (Assignment)cAlternatives_7_3_1.eContents().get(2);
+		private final RuleCall cBufferBufferPrivateParserRuleCall_7_3_1_2_0 = (RuleCall)cBufferAssignment_7_3_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_3_1_3 = (Assignment)cAlternatives_7_3_1.eContents().get(3);
+		private final RuleCall cChannelChannelPrivateParserRuleCall_7_3_1_3_0 = (RuleCall)cChannelAssignment_7_3_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_3_1_4 = (Assignment)cAlternatives_7_3_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_3_1_4_0 = (RuleCall)cTypedefAssignment_7_3_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_3_1_5 = (Assignment)cAlternatives_7_3_1.eContents().get(5);
+		private final RuleCall cPropertyVariablePrivateParserRuleCall_7_3_1_5_0 = (RuleCall)cPropertyAssignment_7_3_1_5.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Alternatives cAlternatives_8_0 = (Alternatives)cAlternatives_8.eContents().get(0);
+		private final Group cGroup_8_0_0 = (Group)cAlternatives_8_0.eContents().get(0);
+		private final Alternatives cAlternatives_8_0_0_0 = (Alternatives)cGroup_8_0_0.eContents().get(0);
+		private final Keyword cRoutineKeyword_8_0_0_0_0 = (Keyword)cAlternatives_8_0_0_0.eContents().get(0);
+		private final Keyword cMacroKeyword_8_0_0_0_1 = (Keyword)cAlternatives_8_0_0_0.eContents().get(1);
+		private final Assignment cRoutineAssignment_8_0_0_1 = (Assignment)cGroup_8_0_0.eContents().get(1);
+		private final RuleCall cRoutineRoutineParserRuleCall_8_0_0_1_0 = (RuleCall)cRoutineAssignment_8_0_0_1.eContents().get(0);
+		private final Group cGroup_8_0_1 = (Group)cAlternatives_8_0.eContents().get(1);
+		private final Keyword cProcedureKeyword_8_0_1_0 = (Keyword)cGroup_8_0_1.eContents().get(0);
+		private final Assignment cProcedureAssignment_8_0_1_1 = (Assignment)cGroup_8_0_1.eContents().get(1);
+		private final RuleCall cProcedureProcedureParserRuleCall_8_0_1_1_0 = (RuleCall)cProcedureAssignment_8_0_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_8_1 = (Alternatives)cAlternatives_8.eContents().get(1);
+		private final Assignment cRoutineAssignment_8_1_0 = (Assignment)cAlternatives_8_1.eContents().get(0);
+		private final RuleCall cRoutineRoutineParserRuleCall_8_1_0_0 = (RuleCall)cRoutineAssignment_8_1_0.eContents().get(0);
+		private final Assignment cProcedureAssignment_8_1_1 = (Assignment)cAlternatives_8_1.eContents().get(1);
+		private final RuleCall cProcedureProcedureParserRuleCall_8_1_1_0 = (RuleCall)cProcedureAssignment_8_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_9 = (Alternatives)cGroup.eContents().get(9);
+		private final Group cGroup_9_0 = (Group)cAlternatives_9.eContents().get(0);
+		private final Alternatives cAlternatives_9_0_0 = (Alternatives)cGroup_9_0.eContents().get(0);
+		private final Keyword cCompositeKeyword_9_0_0_0 = (Keyword)cAlternatives_9_0_0.eContents().get(0);
+		private final Keyword cMachineKeyword_9_0_0_1 = (Keyword)cAlternatives_9_0_0.eContents().get(1);
+		private final Alternatives cAlternatives_9_0_1 = (Alternatives)cGroup_9_0.eContents().get(1);
+		private final Assignment cMachineAssignment_9_0_1_0 = (Assignment)cAlternatives_9_0_1.eContents().get(0);
+		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_0_1_0_0 = (RuleCall)cMachineAssignment_9_0_1_0.eContents().get(0);
+		private final Assignment cInstanceAssignment_9_0_1_1 = (Assignment)cAlternatives_9_0_1.eContents().get(1);
+		private final RuleCall cInstanceInstanceMachineParserRuleCall_9_0_1_1_0 = (RuleCall)cInstanceAssignment_9_0_1_1.eContents().get(0);
+		private final Group cGroup_9_1 = (Group)cAlternatives_9.eContents().get(1);
+		private final Keyword cModelKeyword_9_1_0 = (Keyword)cGroup_9_1.eContents().get(0);
+		private final Assignment cMachineAssignment_9_1_1 = (Assignment)cGroup_9_1.eContents().get(1);
+		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_1_1_0 = (RuleCall)cMachineAssignment_9_1_1.eContents().get(0);
+		private final Group cGroup_9_2 = (Group)cAlternatives_9.eContents().get(2);
+		private final Keyword cPrototypeKeyword_9_2_0 = (Keyword)cGroup_9_2.eContents().get(0);
+		private final Assignment cMachineAssignment_9_2_1 = (Assignment)cGroup_9_2.eContents().get(1);
+		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_2_1_0 = (RuleCall)cMachineAssignment_9_2_1.eContents().get(0);
+		private final Group cGroup_9_3 = (Group)cAlternatives_9.eContents().get(3);
+		private final Keyword cInstanceKeyword_9_3_0 = (Keyword)cGroup_9_3.eContents().get(0);
+		private final Assignment cInstanceAssignment_9_3_1 = (Assignment)cGroup_9_3.eContents().get(1);
+		private final RuleCall cInstanceInstanceMachineParserRuleCall_9_3_1_0 = (RuleCall)cInstanceAssignment_9_3_1.eContents().get(0);
+		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
+		private final Group cGroup_10_0 = (Group)cAlternatives_10.eContents().get(0);
+		private final Keyword cBehaviorKeyword_10_0_0 = (Keyword)cGroup_10_0.eContents().get(0);
+		private final Assignment cBehaviorAssignment_10_0_1 = (Assignment)cGroup_10_0.eContents().get(1);
+		private final RuleCall cBehaviorBehaviorParserRuleCall_10_0_1_0 = (RuleCall)cBehaviorAssignment_10_0_1.eContents().get(0);
+		private final Group cGroup_10_1 = (Group)cAlternatives_10.eContents().get(1);
+		private final Keyword cStatemachineKeyword_10_1_0 = (Keyword)cGroup_10_1.eContents().get(0);
+		private final Assignment cBehaviorAssignment_10_1_1 = (Assignment)cGroup_10_1.eContents().get(1);
+		private final RuleCall cBehaviorStatemachineParserRuleCall_10_1_1_0 = (RuleCall)cBehaviorAssignment_10_1_1.eContents().get(0);
+		private final Assignment cMainAssignment_11 = (Assignment)cGroup.eContents().get(11);
+		private final RuleCall cMainMoeBehaviorParserRuleCall_11_0 = (RuleCall)cMainAssignment_11.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_12 = (Keyword)cGroup.eContents().get(12);
+		
+		//MachineBlock fmlInfra::Machine:
+		//	(visibility=VisibilityKind?
+		//	& (timed?='timed' | input_enabled?='input_enabled')?
+		//	& design=DesignKind?)
+		//	'machine' ('<' 'moc:'? ('and' | 'or') '>')?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	'{' (port+=Port
+		//	| signal+=Signal
+		//	| buffer+=Buffer
+		//	| channel+=Channel
+		//	| typedef+=TypeDefinition
+		//	| property+=Variable)*
+		//	('@property:' (port+=Port
+		//	| signal+=Signal
+		//	| buffer+=Buffer
+		//	| channel+=Channel
+		//	| typedef+=TypeDefinition
+		//	| property+=Variable)*
+		//	| '@public:' (port+=PortPublic
+		//	| signal+=SignalPublic
+		//	| buffer+=BufferPublic
+		//	| channel+=ChannelPublic
+		//	| typedef+=TypeDefinition
+		//	| property+=VariablePublic)*
+		//	| '@protected:' (port+=PortProtected
+		//	| signal+=SignalProtected
+		//	| buffer+=BufferProtected
+		//	| channel+=ChannelProtected
+		//	| typedef+=TypeDefinition
+		//	| property+=VariableProtected)*
+		//	| '@private:' (port+=PortPrivate
+		//	| signal+=SignalPrivate
+		//	| buffer+=BufferPrivate
+		//	| channel+=ChannelPrivate
+		//	| typedef+=TypeDefinition
+		//	| property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+
+		//	| '@procedure:' procedure+=Procedure+)*
+		//	| (routine+=Routine | procedure+=Procedure)+) (('@composite:' | '@machine:') (machine+=AnyMachineBlock
+		//	| instance+=InstanceMachine)+
+		//	| '@model:' machine+=AnyMachineBlock*
+		//	| '@prototype:' machine+=AnyMachineBlock*
+		//	| '@instance:' instance+=InstanceMachine*)* ('@behavior:' behavior+=Behavior+
+		//	| '@statemachine:' behavior+=Statemachine+)*
+		//	main=MoeBehavior
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//(visibility=VisibilityKind? & (timed?='timed' | input_enabled?='input_enabled')? & design=DesignKind?) 'machine' ('<'
+		//'moc:'? ('and' | 'or') '>')? name=ESIdentifier unrestrictedName=UnrestrictedName? '{' (port+=Port | signal+=Signal |
+		//buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)* ('@property:' (port+=Port |
+		//signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)* | '@public:'
+		//(port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic | typedef+=TypeDefinition |
+		//property+=VariablePublic)* | '@protected:' (port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected |
+		//channel+=ChannelProtected | typedef+=TypeDefinition | property+=VariableProtected)* | '@private:' (port+=PortPrivate |
+		//signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate | typedef+=TypeDefinition |
+		//property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)* |
+		//(routine+=Routine | procedure+=Procedure)+) (('@composite:' | '@machine:') (machine+=AnyMachineBlock |
+		//instance+=InstanceMachine)+ | '@model:' machine+=AnyMachineBlock* | '@prototype:' machine+=AnyMachineBlock* |
+		//'@instance:' instance+=InstanceMachine*)* ('@behavior:' behavior+=Behavior+ | '@statemachine:'
+		//behavior+=Statemachine+)* main=MoeBehavior '}'
+		public Group getGroup() { return cGroup; }
+		
+		//(visibility=VisibilityKind? & (timed?='timed' | input_enabled?='input_enabled')? & design=DesignKind?)
+		public UnorderedGroup getUnorderedGroup_0() { return cUnorderedGroup_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_0_0() { return cVisibilityAssignment_0_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0_0; }
+		
+		//(timed?='timed' | input_enabled?='input_enabled')?
+		public Alternatives getAlternatives_0_1() { return cAlternatives_0_1; }
+		
+		//timed?='timed'
+		public Assignment getTimedAssignment_0_1_0() { return cTimedAssignment_0_1_0; }
+		
+		//'timed'
+		public Keyword getTimedTimedKeyword_0_1_0_0() { return cTimedTimedKeyword_0_1_0_0; }
+		
+		//input_enabled?='input_enabled'
+		public Assignment getInput_enabledAssignment_0_1_1() { return cInput_enabledAssignment_0_1_1; }
+		
+		//'input_enabled'
+		public Keyword getInput_enabledInput_enabledKeyword_0_1_1_0() { return cInput_enabledInput_enabledKeyword_0_1_1_0; }
+		
+		//design=DesignKind?
+		public Assignment getDesignAssignment_0_2() { return cDesignAssignment_0_2; }
+		
+		//DesignKind
+		public RuleCall getDesignDesignKindEnumRuleCall_0_2_0() { return cDesignDesignKindEnumRuleCall_0_2_0; }
+		
+		//'machine'
+		public Keyword getMachineKeyword_1() { return cMachineKeyword_1; }
+		
+		//('<' 'moc:'? ('and' | 'or') '>')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_2_1() { return cMocKeyword_2_1; }
+		
+		//('and' | 'or')
+		public Alternatives getAlternatives_2_2() { return cAlternatives_2_2; }
+		
+		//'and'
+		public Keyword getAndKeyword_2_2_0() { return cAndKeyword_2_2_0; }
+		
+		//'or'
+		public Keyword getOrKeyword_2_2_1() { return cOrKeyword_2_2_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_5() { return cLeftCurlyBracketKeyword_5; }
+		
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*
+		public Alternatives getAlternatives_6() { return cAlternatives_6; }
+		
+		//port+=Port
+		public Assignment getPortAssignment_6_0() { return cPortAssignment_6_0; }
+		
+		//Port
+		public RuleCall getPortPortParserRuleCall_6_0_0() { return cPortPortParserRuleCall_6_0_0; }
+		
+		//signal+=Signal
+		public Assignment getSignalAssignment_6_1() { return cSignalAssignment_6_1; }
+		
+		//Signal
+		public RuleCall getSignalSignalParserRuleCall_6_1_0() { return cSignalSignalParserRuleCall_6_1_0; }
+		
+		//buffer+=Buffer
+		public Assignment getBufferAssignment_6_2() { return cBufferAssignment_6_2; }
+		
+		//Buffer
+		public RuleCall getBufferBufferParserRuleCall_6_2_0() { return cBufferBufferParserRuleCall_6_2_0; }
+		
+		//channel+=Channel
+		public Assignment getChannelAssignment_6_3() { return cChannelAssignment_6_3; }
+		
+		//Channel
+		public RuleCall getChannelChannelParserRuleCall_6_3_0() { return cChannelChannelParserRuleCall_6_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_6_4() { return cTypedefAssignment_6_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_6_4_0() { return cTypedefTypeDefinitionParserRuleCall_6_4_0; }
+		
+		//property+=Variable
+		public Assignment getPropertyAssignment_6_5() { return cPropertyAssignment_6_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_6_5_0() { return cPropertyVariableParserRuleCall_6_5_0; }
+		
+		//('@property:' (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition |
+		//property+=Variable)* | '@public:' (port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic |
+		//channel+=ChannelPublic | typedef+=TypeDefinition | property+=VariablePublic)* | '@protected:' (port+=PortProtected |
+		//signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected | typedef+=TypeDefinition |
+		//property+=VariableProtected)* | '@private:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate |
+		//channel+=ChannelPrivate | typedef+=TypeDefinition | property+=VariablePrivate)*)*
+		public Alternatives getAlternatives_7() { return cAlternatives_7; }
+		
+		//'@property:' (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition |
+		//property+=Variable)*
+		public Group getGroup_7_0() { return cGroup_7_0; }
+		
+		//'@property:'
+		public Keyword getPropertyKeyword_7_0_0() { return cPropertyKeyword_7_0_0; }
+		
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*
+		public Alternatives getAlternatives_7_0_1() { return cAlternatives_7_0_1; }
+		
+		//port+=Port
+		public Assignment getPortAssignment_7_0_1_0() { return cPortAssignment_7_0_1_0; }
+		
+		//Port
+		public RuleCall getPortPortParserRuleCall_7_0_1_0_0() { return cPortPortParserRuleCall_7_0_1_0_0; }
+		
+		//signal+=Signal
+		public Assignment getSignalAssignment_7_0_1_1() { return cSignalAssignment_7_0_1_1; }
+		
+		//Signal
+		public RuleCall getSignalSignalParserRuleCall_7_0_1_1_0() { return cSignalSignalParserRuleCall_7_0_1_1_0; }
+		
+		//buffer+=Buffer
+		public Assignment getBufferAssignment_7_0_1_2() { return cBufferAssignment_7_0_1_2; }
+		
+		//Buffer
+		public RuleCall getBufferBufferParserRuleCall_7_0_1_2_0() { return cBufferBufferParserRuleCall_7_0_1_2_0; }
+		
+		//channel+=Channel
+		public Assignment getChannelAssignment_7_0_1_3() { return cChannelAssignment_7_0_1_3; }
+		
+		//Channel
+		public RuleCall getChannelChannelParserRuleCall_7_0_1_3_0() { return cChannelChannelParserRuleCall_7_0_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_0_1_4() { return cTypedefAssignment_7_0_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_0_1_4_0; }
+		
+		//property+=Variable
+		public Assignment getPropertyAssignment_7_0_1_5() { return cPropertyAssignment_7_0_1_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_7_0_1_5_0() { return cPropertyVariableParserRuleCall_7_0_1_5_0; }
+		
+		//'@public:' (port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic |
+		//typedef+=TypeDefinition | property+=VariablePublic)*
+		public Group getGroup_7_1() { return cGroup_7_1; }
+		
+		//'@public:'
+		public Keyword getPublicKeyword_7_1_0() { return cPublicKeyword_7_1_0; }
+		
+		//(port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic | typedef+=TypeDefinition |
+		//property+=VariablePublic)*
+		public Alternatives getAlternatives_7_1_1() { return cAlternatives_7_1_1; }
+		
+		//port+=PortPublic
+		public Assignment getPortAssignment_7_1_1_0() { return cPortAssignment_7_1_1_0; }
+		
+		//PortPublic
+		public RuleCall getPortPortPublicParserRuleCall_7_1_1_0_0() { return cPortPortPublicParserRuleCall_7_1_1_0_0; }
+		
+		//signal+=SignalPublic
+		public Assignment getSignalAssignment_7_1_1_1() { return cSignalAssignment_7_1_1_1; }
+		
+		//SignalPublic
+		public RuleCall getSignalSignalPublicParserRuleCall_7_1_1_1_0() { return cSignalSignalPublicParserRuleCall_7_1_1_1_0; }
+		
+		//buffer+=BufferPublic
+		public Assignment getBufferAssignment_7_1_1_2() { return cBufferAssignment_7_1_1_2; }
+		
+		//BufferPublic
+		public RuleCall getBufferBufferPublicParserRuleCall_7_1_1_2_0() { return cBufferBufferPublicParserRuleCall_7_1_1_2_0; }
+		
+		//channel+=ChannelPublic
+		public Assignment getChannelAssignment_7_1_1_3() { return cChannelAssignment_7_1_1_3; }
+		
+		//ChannelPublic
+		public RuleCall getChannelChannelPublicParserRuleCall_7_1_1_3_0() { return cChannelChannelPublicParserRuleCall_7_1_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_1_1_4() { return cTypedefAssignment_7_1_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_1_1_4_0; }
+		
+		//property+=VariablePublic
+		public Assignment getPropertyAssignment_7_1_1_5() { return cPropertyAssignment_7_1_1_5; }
+		
+		//VariablePublic
+		public RuleCall getPropertyVariablePublicParserRuleCall_7_1_1_5_0() { return cPropertyVariablePublicParserRuleCall_7_1_1_5_0; }
+		
+		//'@protected:' (port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected |
+		//typedef+=TypeDefinition | property+=VariableProtected)*
+		public Group getGroup_7_2() { return cGroup_7_2; }
+		
+		//'@protected:'
+		public Keyword getProtectedKeyword_7_2_0() { return cProtectedKeyword_7_2_0; }
+		
+		//(port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected |
+		//typedef+=TypeDefinition | property+=VariableProtected)*
+		public Alternatives getAlternatives_7_2_1() { return cAlternatives_7_2_1; }
+		
+		//port+=PortProtected
+		public Assignment getPortAssignment_7_2_1_0() { return cPortAssignment_7_2_1_0; }
+		
+		//PortProtected
+		public RuleCall getPortPortProtectedParserRuleCall_7_2_1_0_0() { return cPortPortProtectedParserRuleCall_7_2_1_0_0; }
+		
+		//signal+=SignalProtected
+		public Assignment getSignalAssignment_7_2_1_1() { return cSignalAssignment_7_2_1_1; }
+		
+		//SignalProtected
+		public RuleCall getSignalSignalProtectedParserRuleCall_7_2_1_1_0() { return cSignalSignalProtectedParserRuleCall_7_2_1_1_0; }
+		
+		//buffer+=BufferProtected
+		public Assignment getBufferAssignment_7_2_1_2() { return cBufferAssignment_7_2_1_2; }
+		
+		//BufferProtected
+		public RuleCall getBufferBufferProtectedParserRuleCall_7_2_1_2_0() { return cBufferBufferProtectedParserRuleCall_7_2_1_2_0; }
+		
+		//channel+=ChannelProtected
+		public Assignment getChannelAssignment_7_2_1_3() { return cChannelAssignment_7_2_1_3; }
+		
+		//ChannelProtected
+		public RuleCall getChannelChannelProtectedParserRuleCall_7_2_1_3_0() { return cChannelChannelProtectedParserRuleCall_7_2_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_2_1_4() { return cTypedefAssignment_7_2_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_2_1_4_0; }
+		
+		//property+=VariableProtected
+		public Assignment getPropertyAssignment_7_2_1_5() { return cPropertyAssignment_7_2_1_5; }
+		
+		//VariableProtected
+		public RuleCall getPropertyVariableProtectedParserRuleCall_7_2_1_5_0() { return cPropertyVariableProtectedParserRuleCall_7_2_1_5_0; }
+		
+		//'@private:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate |
+		//typedef+=TypeDefinition | property+=VariablePrivate)*
+		public Group getGroup_7_3() { return cGroup_7_3; }
+		
+		//'@private:'
+		public Keyword getPrivateKeyword_7_3_0() { return cPrivateKeyword_7_3_0; }
+		
+		//(port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate | typedef+=TypeDefinition |
+		//property+=VariablePrivate)*
+		public Alternatives getAlternatives_7_3_1() { return cAlternatives_7_3_1; }
+		
+		//port+=PortPrivate
+		public Assignment getPortAssignment_7_3_1_0() { return cPortAssignment_7_3_1_0; }
+		
+		//PortPrivate
+		public RuleCall getPortPortPrivateParserRuleCall_7_3_1_0_0() { return cPortPortPrivateParserRuleCall_7_3_1_0_0; }
+		
+		//signal+=SignalPrivate
+		public Assignment getSignalAssignment_7_3_1_1() { return cSignalAssignment_7_3_1_1; }
+		
+		//SignalPrivate
+		public RuleCall getSignalSignalPrivateParserRuleCall_7_3_1_1_0() { return cSignalSignalPrivateParserRuleCall_7_3_1_1_0; }
+		
+		//buffer+=BufferPrivate
+		public Assignment getBufferAssignment_7_3_1_2() { return cBufferAssignment_7_3_1_2; }
+		
+		//BufferPrivate
+		public RuleCall getBufferBufferPrivateParserRuleCall_7_3_1_2_0() { return cBufferBufferPrivateParserRuleCall_7_3_1_2_0; }
+		
+		//channel+=ChannelPrivate
+		public Assignment getChannelAssignment_7_3_1_3() { return cChannelAssignment_7_3_1_3; }
+		
+		//ChannelPrivate
+		public RuleCall getChannelChannelPrivateParserRuleCall_7_3_1_3_0() { return cChannelChannelPrivateParserRuleCall_7_3_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_3_1_4() { return cTypedefAssignment_7_3_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_3_1_4_0; }
+		
+		//property+=VariablePrivate
+		public Assignment getPropertyAssignment_7_3_1_5() { return cPropertyAssignment_7_3_1_5; }
+		
+		//VariablePrivate
+		public RuleCall getPropertyVariablePrivateParserRuleCall_7_3_1_5_0() { return cPropertyVariablePrivateParserRuleCall_7_3_1_5_0; }
+		
+		//((('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)* | (routine+=Routine |
+		//procedure+=Procedure)+)
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//(('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)*
+		public Alternatives getAlternatives_8_0() { return cAlternatives_8_0; }
+		
+		//('@routine:' | '@macro:') routine+=Routine+
+		public Group getGroup_8_0_0() { return cGroup_8_0_0; }
+		
+		//('@routine:' | '@macro:')
+		public Alternatives getAlternatives_8_0_0_0() { return cAlternatives_8_0_0_0; }
+		
+		//'@routine:'
+		public Keyword getRoutineKeyword_8_0_0_0_0() { return cRoutineKeyword_8_0_0_0_0; }
+		
+		//'@macro:'
+		public Keyword getMacroKeyword_8_0_0_0_1() { return cMacroKeyword_8_0_0_0_1; }
+		
+		//routine+=Routine+
+		public Assignment getRoutineAssignment_8_0_0_1() { return cRoutineAssignment_8_0_0_1; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_8_0_0_1_0() { return cRoutineRoutineParserRuleCall_8_0_0_1_0; }
+		
+		//'@procedure:' procedure+=Procedure+
+		public Group getGroup_8_0_1() { return cGroup_8_0_1; }
+		
+		//'@procedure:'
+		public Keyword getProcedureKeyword_8_0_1_0() { return cProcedureKeyword_8_0_1_0; }
+		
+		//procedure+=Procedure+
+		public Assignment getProcedureAssignment_8_0_1_1() { return cProcedureAssignment_8_0_1_1; }
+		
+		//Procedure
+		public RuleCall getProcedureProcedureParserRuleCall_8_0_1_1_0() { return cProcedureProcedureParserRuleCall_8_0_1_1_0; }
+		
+		//(routine+=Routine | procedure+=Procedure)+
+		public Alternatives getAlternatives_8_1() { return cAlternatives_8_1; }
+		
+		//routine+=Routine
+		public Assignment getRoutineAssignment_8_1_0() { return cRoutineAssignment_8_1_0; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_8_1_0_0() { return cRoutineRoutineParserRuleCall_8_1_0_0; }
+		
+		//procedure+=Procedure
+		public Assignment getProcedureAssignment_8_1_1() { return cProcedureAssignment_8_1_1; }
+		
+		//Procedure
+		public RuleCall getProcedureProcedureParserRuleCall_8_1_1_0() { return cProcedureProcedureParserRuleCall_8_1_1_0; }
+		
+		//(('@composite:' | '@machine:') (machine+=AnyMachineBlock | instance+=InstanceMachine)+ | '@model:'
+		//machine+=AnyMachineBlock* | '@prototype:' machine+=AnyMachineBlock* | '@instance:' instance+=InstanceMachine*)*
+		public Alternatives getAlternatives_9() { return cAlternatives_9; }
+		
+		//('@composite:' | '@machine:') (machine+=AnyMachineBlock | instance+=InstanceMachine)+
+		public Group getGroup_9_0() { return cGroup_9_0; }
+		
+		//('@composite:' | '@machine:')
+		public Alternatives getAlternatives_9_0_0() { return cAlternatives_9_0_0; }
+		
+		//'@composite:'
+		public Keyword getCompositeKeyword_9_0_0_0() { return cCompositeKeyword_9_0_0_0; }
+		
+		//'@machine:'
+		public Keyword getMachineKeyword_9_0_0_1() { return cMachineKeyword_9_0_0_1; }
+		
+		//(machine+=AnyMachineBlock | instance+=InstanceMachine)+
+		public Alternatives getAlternatives_9_0_1() { return cAlternatives_9_0_1; }
+		
+		//machine+=AnyMachineBlock
+		public Assignment getMachineAssignment_9_0_1_0() { return cMachineAssignment_9_0_1_0; }
+		
+		//AnyMachineBlock
+		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0() { return cMachineAnyMachineBlockParserRuleCall_9_0_1_0_0; }
+		
+		//instance+=InstanceMachine
+		public Assignment getInstanceAssignment_9_0_1_1() { return cInstanceAssignment_9_0_1_1; }
+		
+		//InstanceMachine
+		public RuleCall getInstanceInstanceMachineParserRuleCall_9_0_1_1_0() { return cInstanceInstanceMachineParserRuleCall_9_0_1_1_0; }
+		
+		//'@model:' machine+=AnyMachineBlock*
+		public Group getGroup_9_1() { return cGroup_9_1; }
+		
+		//'@model:'
+		public Keyword getModelKeyword_9_1_0() { return cModelKeyword_9_1_0; }
+		
+		//machine+=AnyMachineBlock*
+		public Assignment getMachineAssignment_9_1_1() { return cMachineAssignment_9_1_1; }
+		
+		//AnyMachineBlock
+		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_1_1_0() { return cMachineAnyMachineBlockParserRuleCall_9_1_1_0; }
+		
+		//'@prototype:' machine+=AnyMachineBlock*
+		public Group getGroup_9_2() { return cGroup_9_2; }
+		
+		//'@prototype:'
+		public Keyword getPrototypeKeyword_9_2_0() { return cPrototypeKeyword_9_2_0; }
+		
+		//machine+=AnyMachineBlock*
+		public Assignment getMachineAssignment_9_2_1() { return cMachineAssignment_9_2_1; }
+		
+		//AnyMachineBlock
+		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_2_1_0() { return cMachineAnyMachineBlockParserRuleCall_9_2_1_0; }
+		
+		//'@instance:' instance+=InstanceMachine*
+		public Group getGroup_9_3() { return cGroup_9_3; }
+		
+		//'@instance:'
+		public Keyword getInstanceKeyword_9_3_0() { return cInstanceKeyword_9_3_0; }
+		
+		//instance+=InstanceMachine*
+		public Assignment getInstanceAssignment_9_3_1() { return cInstanceAssignment_9_3_1; }
+		
+		//InstanceMachine
+		public RuleCall getInstanceInstanceMachineParserRuleCall_9_3_1_0() { return cInstanceInstanceMachineParserRuleCall_9_3_1_0; }
+		
+		//('@behavior:' behavior+=Behavior+ | '@statemachine:' behavior+=Statemachine+)*
+		public Alternatives getAlternatives_10() { return cAlternatives_10; }
+		
+		//'@behavior:' behavior+=Behavior+
+		public Group getGroup_10_0() { return cGroup_10_0; }
+		
+		//'@behavior:'
+		public Keyword getBehaviorKeyword_10_0_0() { return cBehaviorKeyword_10_0_0; }
+		
+		//behavior+=Behavior+
+		public Assignment getBehaviorAssignment_10_0_1() { return cBehaviorAssignment_10_0_1; }
+		
+		//Behavior
+		public RuleCall getBehaviorBehaviorParserRuleCall_10_0_1_0() { return cBehaviorBehaviorParserRuleCall_10_0_1_0; }
+		
+		//'@statemachine:' behavior+=Statemachine+
+		public Group getGroup_10_1() { return cGroup_10_1; }
+		
+		//'@statemachine:'
+		public Keyword getStatemachineKeyword_10_1_0() { return cStatemachineKeyword_10_1_0; }
+		
+		//behavior+=Statemachine+
+		public Assignment getBehaviorAssignment_10_1_1() { return cBehaviorAssignment_10_1_1; }
+		
+		//Statemachine
+		public RuleCall getBehaviorStatemachineParserRuleCall_10_1_1_0() { return cBehaviorStatemachineParserRuleCall_10_1_1_0; }
+		
+		//main=MoeBehavior
+		public Assignment getMainAssignment_11() { return cMainAssignment_11; }
+		
+		//MoeBehavior
+		public RuleCall getMainMoeBehaviorParserRuleCall_11_0() { return cMainMoeBehaviorParserRuleCall_11_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_12() { return cRightCurlyBracketKeyword_12; }
+	}
+	public class ProcedureElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Procedure");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Keyword cProcedureKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Keyword cMocKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Alternatives cAlternatives_2_2 = (Alternatives)cGroup_2.eContents().get(2);
+		private final Keyword cAndKeyword_2_2_0 = (Keyword)cAlternatives_2_2.eContents().get(0);
+		private final Keyword cOrKeyword_2_2_1 = (Keyword)cAlternatives_2_2.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
+		private final Group cGroup_5_0 = (Group)cGroup_5.eContents().get(0);
+		private final Keyword cLeftParenthesisKeyword_5_0_0 = (Keyword)cGroup_5_0.eContents().get(0);
+		private final Group cGroup_5_0_1 = (Group)cGroup_5_0.eContents().get(1);
+		private final Assignment cParameterAssignment_5_0_1_0 = (Assignment)cGroup_5_0_1.eContents().get(0);
+		private final RuleCall cParameterFunctionalParameterParserRuleCall_5_0_1_0_0 = (RuleCall)cParameterAssignment_5_0_1_0.eContents().get(0);
+		private final Group cGroup_5_0_1_1 = (Group)cGroup_5_0_1.eContents().get(1);
+		private final Keyword cCommaKeyword_5_0_1_1_0 = (Keyword)cGroup_5_0_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_5_0_1_1_1 = (Assignment)cGroup_5_0_1_1.eContents().get(1);
+		private final RuleCall cParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0 = (RuleCall)cParameterAssignment_5_0_1_1_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_5_0_2 = (Keyword)cGroup_5_0.eContents().get(2);
+		private final Group cGroup_5_1 = (Group)cGroup_5.eContents().get(1);
+		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0 = (Keyword)cGroup_5_1.eContents().get(0);
+		private final Alternatives cAlternatives_5_1_1 = (Alternatives)cGroup_5_1.eContents().get(1);
+		private final Assignment cParameterAssignment_5_1_1_0 = (Assignment)cAlternatives_5_1_1.eContents().get(0);
+		private final RuleCall cParameterFormalParameterParserRuleCall_5_1_1_0_0 = (RuleCall)cParameterAssignment_5_1_1_0.eContents().get(0);
+		private final Group cGroup_5_1_1_1 = (Group)cAlternatives_5_1_1.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_5_1_1_1_0 = (Keyword)cGroup_5_1_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_5_1_1_1_1 = (Assignment)cGroup_5_1_1_1.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_5_1_1_1_1_0 = (RuleCall)cParameterAssignment_5_1_1_1_1.eContents().get(0);
+		private final Group cGroup_5_1_1_1_2 = (Group)cGroup_5_1_1_1.eContents().get(2);
+		private final Keyword cCommaKeyword_5_1_1_1_2_0 = (Keyword)cGroup_5_1_1_1_2.eContents().get(0);
+		private final Assignment cParameterAssignment_5_1_1_1_2_1 = (Assignment)cGroup_5_1_1_1_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0 = (RuleCall)cParameterAssignment_5_1_1_1_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_5_1_1_1_3 = (Keyword)cGroup_5_1_1_1.eContents().get(3);
+		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
+		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
+		private final Keyword cParameterKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1 = (Alternatives)cGroup_7_0.eContents().get(1);
+		private final Group cGroup_7_0_1_0 = (Group)cAlternatives_7_0_1.eContents().get(0);
+		private final Keyword cInputKeyword_7_0_1_0_0 = (Keyword)cGroup_7_0_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1_0_1 = (Alternatives)cGroup_7_0_1_0.eContents().get(1);
+		private final Assignment cParameterAssignment_7_0_1_0_1_0 = (Assignment)cAlternatives_7_0_1_0_1.eContents().get(0);
+		private final RuleCall cParameterParameterInputParserRuleCall_7_0_1_0_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_0_1_0.eContents().get(0);
+		private final Group cGroup_7_0_1_0_1_1 = (Group)cAlternatives_7_0_1_0_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_1_0_1_1_0 = (Keyword)cGroup_7_0_1_0_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_7_0_1_0_1_1_1 = (Assignment)cGroup_7_0_1_0_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_0_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_1_0_1_1_2 = (Keyword)cGroup_7_0_1_0_1_1.eContents().get(2);
+		private final Group cGroup_7_0_1_1 = (Group)cAlternatives_7_0_1.eContents().get(1);
+		private final Keyword cInoutKeyword_7_0_1_1_0 = (Keyword)cGroup_7_0_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1_1_1 = (Alternatives)cGroup_7_0_1_1.eContents().get(1);
+		private final Assignment cParameterAssignment_7_0_1_1_1_0 = (Assignment)cAlternatives_7_0_1_1_1.eContents().get(0);
+		private final RuleCall cParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_1_1_0.eContents().get(0);
+		private final Group cGroup_7_0_1_1_1_1 = (Group)cAlternatives_7_0_1_1_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_1_1_1_1_0 = (Keyword)cGroup_7_0_1_1_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_7_0_1_1_1_1_1 = (Assignment)cGroup_7_0_1_1_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_1_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_1_1_1_1_2 = (Keyword)cGroup_7_0_1_1_1_1.eContents().get(2);
+		private final Group cGroup_7_0_1_2 = (Group)cAlternatives_7_0_1.eContents().get(2);
+		private final Keyword cOutputKeyword_7_0_1_2_0 = (Keyword)cGroup_7_0_1_2.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1_2_1 = (Alternatives)cGroup_7_0_1_2.eContents().get(1);
+		private final Assignment cParameterAssignment_7_0_1_2_1_0 = (Assignment)cAlternatives_7_0_1_2_1.eContents().get(0);
+		private final RuleCall cParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_2_1_0.eContents().get(0);
+		private final Group cGroup_7_0_1_2_1_1 = (Group)cAlternatives_7_0_1_2_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_1_2_1_1_0 = (Keyword)cGroup_7_0_1_2_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_7_0_1_2_1_1_1 = (Assignment)cGroup_7_0_1_2_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_2_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_1_2_1_1_2 = (Keyword)cGroup_7_0_1_2_1_1.eContents().get(2);
+		private final Group cGroup_7_0_1_3 = (Group)cAlternatives_7_0_1.eContents().get(3);
+		private final Keyword cReturnKeyword_7_0_1_3_0 = (Keyword)cGroup_7_0_1_3.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1_3_1 = (Alternatives)cGroup_7_0_1_3.eContents().get(1);
+		private final Assignment cParameterAssignment_7_0_1_3_1_0 = (Assignment)cAlternatives_7_0_1_3_1.eContents().get(0);
+		private final RuleCall cParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_3_1_0.eContents().get(0);
+		private final Group cGroup_7_0_1_3_1_1 = (Group)cAlternatives_7_0_1_3_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_1_3_1_1_0 = (Keyword)cGroup_7_0_1_3_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_7_0_1_3_1_1_1 = (Assignment)cGroup_7_0_1_3_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_3_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_1_3_1_1_2 = (Keyword)cGroup_7_0_1_3_1_1.eContents().get(2);
+		private final Alternatives cAlternatives_7_1 = (Alternatives)cAlternatives_7.eContents().get(1);
+		private final Assignment cPortAssignment_7_1_0 = (Assignment)cAlternatives_7_1.eContents().get(0);
+		private final RuleCall cPortPortParserRuleCall_7_1_0_0 = (RuleCall)cPortAssignment_7_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_1_1 = (Assignment)cAlternatives_7_1.eContents().get(1);
+		private final RuleCall cSignalSignalParserRuleCall_7_1_1_0 = (RuleCall)cSignalAssignment_7_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_1_2 = (Assignment)cAlternatives_7_1.eContents().get(2);
+		private final RuleCall cBufferBufferParserRuleCall_7_1_2_0 = (RuleCall)cBufferAssignment_7_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_1_3 = (Assignment)cAlternatives_7_1.eContents().get(3);
+		private final RuleCall cChannelChannelParserRuleCall_7_1_3_0 = (RuleCall)cChannelAssignment_7_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_1_4 = (Assignment)cAlternatives_7_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_1_4_0 = (RuleCall)cTypedefAssignment_7_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_1_5 = (Assignment)cAlternatives_7_1.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_7_1_5_0 = (RuleCall)cPropertyAssignment_7_1_5.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
+		private final Keyword cInputKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
+		private final Alternatives cAlternatives_8_0_1 = (Alternatives)cGroup_8_0.eContents().get(1);
+		private final Assignment cParameterAssignment_8_0_1_0 = (Assignment)cAlternatives_8_0_1.eContents().get(0);
+		private final RuleCall cParameterParameterInputParserRuleCall_8_0_1_0_0 = (RuleCall)cParameterAssignment_8_0_1_0.eContents().get(0);
+		private final Group cGroup_8_0_1_1 = (Group)cAlternatives_8_0_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_0_1_1_0 = (Keyword)cGroup_8_0_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_8_0_1_1_1 = (Assignment)cGroup_8_0_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInputParserRuleCall_8_0_1_1_1_0 = (RuleCall)cParameterAssignment_8_0_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_0_1_1_2 = (Keyword)cGroup_8_0_1_1.eContents().get(2);
+		private final Group cGroup_8_1 = (Group)cAlternatives_8.eContents().get(1);
+		private final Keyword cInoutKeyword_8_1_0 = (Keyword)cGroup_8_1.eContents().get(0);
+		private final Alternatives cAlternatives_8_1_1 = (Alternatives)cGroup_8_1.eContents().get(1);
+		private final Assignment cParameterAssignment_8_1_1_0 = (Assignment)cAlternatives_8_1_1.eContents().get(0);
+		private final RuleCall cParameterParameterInoutParserRuleCall_8_1_1_0_0 = (RuleCall)cParameterAssignment_8_1_1_0.eContents().get(0);
+		private final Group cGroup_8_1_1_1 = (Group)cAlternatives_8_1_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_1_1_1_0 = (Keyword)cGroup_8_1_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_8_1_1_1_1 = (Assignment)cGroup_8_1_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInoutParserRuleCall_8_1_1_1_1_0 = (RuleCall)cParameterAssignment_8_1_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_1_1_1_2 = (Keyword)cGroup_8_1_1_1.eContents().get(2);
+		private final Group cGroup_8_2 = (Group)cAlternatives_8.eContents().get(2);
+		private final Keyword cOutputKeyword_8_2_0 = (Keyword)cGroup_8_2.eContents().get(0);
+		private final Alternatives cAlternatives_8_2_1 = (Alternatives)cGroup_8_2.eContents().get(1);
+		private final Assignment cParameterAssignment_8_2_1_0 = (Assignment)cAlternatives_8_2_1.eContents().get(0);
+		private final RuleCall cParameterParameterOutputParserRuleCall_8_2_1_0_0 = (RuleCall)cParameterAssignment_8_2_1_0.eContents().get(0);
+		private final Group cGroup_8_2_1_1 = (Group)cAlternatives_8_2_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_2_1_1_0 = (Keyword)cGroup_8_2_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_8_2_1_1_1 = (Assignment)cGroup_8_2_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterOutputParserRuleCall_8_2_1_1_1_0 = (RuleCall)cParameterAssignment_8_2_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_2_1_1_2 = (Keyword)cGroup_8_2_1_1.eContents().get(2);
+		private final Group cGroup_8_3 = (Group)cAlternatives_8.eContents().get(3);
+		private final Keyword cReturnKeyword_8_3_0 = (Keyword)cGroup_8_3.eContents().get(0);
+		private final Alternatives cAlternatives_8_3_1 = (Alternatives)cGroup_8_3.eContents().get(1);
+		private final Assignment cParameterAssignment_8_3_1_0 = (Assignment)cAlternatives_8_3_1.eContents().get(0);
+		private final RuleCall cParameterParameterReturnParserRuleCall_8_3_1_0_0 = (RuleCall)cParameterAssignment_8_3_1_0.eContents().get(0);
+		private final Group cGroup_8_3_1_1 = (Group)cAlternatives_8_3_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_3_1_1_0 = (Keyword)cGroup_8_3_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_8_3_1_1_1 = (Assignment)cGroup_8_3_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterReturnParserRuleCall_8_3_1_1_1_0 = (RuleCall)cParameterAssignment_8_3_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_3_1_1_2 = (Keyword)cGroup_8_3_1_1.eContents().get(2);
+		private final Alternatives cAlternatives_9 = (Alternatives)cGroup.eContents().get(9);
+		private final Group cGroup_9_0 = (Group)cAlternatives_9.eContents().get(0);
+		private final Keyword cPropertyKeyword_9_0_0 = (Keyword)cGroup_9_0.eContents().get(0);
+		private final Alternatives cAlternatives_9_0_1 = (Alternatives)cGroup_9_0.eContents().get(1);
+		private final Assignment cPortAssignment_9_0_1_0 = (Assignment)cAlternatives_9_0_1.eContents().get(0);
+		private final RuleCall cPortPortParserRuleCall_9_0_1_0_0 = (RuleCall)cPortAssignment_9_0_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_9_0_1_1 = (Assignment)cAlternatives_9_0_1.eContents().get(1);
+		private final RuleCall cSignalSignalParserRuleCall_9_0_1_1_0 = (RuleCall)cSignalAssignment_9_0_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_9_0_1_2 = (Assignment)cAlternatives_9_0_1.eContents().get(2);
+		private final RuleCall cBufferBufferParserRuleCall_9_0_1_2_0 = (RuleCall)cBufferAssignment_9_0_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_9_0_1_3 = (Assignment)cAlternatives_9_0_1.eContents().get(3);
+		private final RuleCall cChannelChannelParserRuleCall_9_0_1_3_0 = (RuleCall)cChannelAssignment_9_0_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_9_0_1_4 = (Assignment)cAlternatives_9_0_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_0_1_4_0 = (RuleCall)cTypedefAssignment_9_0_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_9_0_1_5 = (Assignment)cAlternatives_9_0_1.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_9_0_1_5_0 = (RuleCall)cPropertyAssignment_9_0_1_5.eContents().get(0);
+		private final Group cGroup_9_1 = (Group)cAlternatives_9.eContents().get(1);
+		private final Keyword cPublicKeyword_9_1_0 = (Keyword)cGroup_9_1.eContents().get(0);
+		private final Alternatives cAlternatives_9_1_1 = (Alternatives)cGroup_9_1.eContents().get(1);
+		private final Assignment cPortAssignment_9_1_1_0 = (Assignment)cAlternatives_9_1_1.eContents().get(0);
+		private final RuleCall cPortPortPublicParserRuleCall_9_1_1_0_0 = (RuleCall)cPortAssignment_9_1_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_9_1_1_1 = (Assignment)cAlternatives_9_1_1.eContents().get(1);
+		private final RuleCall cSignalSignalPublicParserRuleCall_9_1_1_1_0 = (RuleCall)cSignalAssignment_9_1_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_9_1_1_2 = (Assignment)cAlternatives_9_1_1.eContents().get(2);
+		private final RuleCall cBufferBufferPublicParserRuleCall_9_1_1_2_0 = (RuleCall)cBufferAssignment_9_1_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_9_1_1_3 = (Assignment)cAlternatives_9_1_1.eContents().get(3);
+		private final RuleCall cChannelChannelPublicParserRuleCall_9_1_1_3_0 = (RuleCall)cChannelAssignment_9_1_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_9_1_1_4 = (Assignment)cAlternatives_9_1_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_1_1_4_0 = (RuleCall)cTypedefAssignment_9_1_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_9_1_1_5 = (Assignment)cAlternatives_9_1_1.eContents().get(5);
+		private final RuleCall cPropertyVariablePublicParserRuleCall_9_1_1_5_0 = (RuleCall)cPropertyAssignment_9_1_1_5.eContents().get(0);
+		private final Group cGroup_9_2 = (Group)cAlternatives_9.eContents().get(2);
+		private final Keyword cProtectedKeyword_9_2_0 = (Keyword)cGroup_9_2.eContents().get(0);
+		private final Alternatives cAlternatives_9_2_1 = (Alternatives)cGroup_9_2.eContents().get(1);
+		private final Assignment cPortAssignment_9_2_1_0 = (Assignment)cAlternatives_9_2_1.eContents().get(0);
+		private final RuleCall cPortPortProtectedParserRuleCall_9_2_1_0_0 = (RuleCall)cPortAssignment_9_2_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_9_2_1_1 = (Assignment)cAlternatives_9_2_1.eContents().get(1);
+		private final RuleCall cSignalSignalProtectedParserRuleCall_9_2_1_1_0 = (RuleCall)cSignalAssignment_9_2_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_9_2_1_2 = (Assignment)cAlternatives_9_2_1.eContents().get(2);
+		private final RuleCall cBufferBufferProtectedParserRuleCall_9_2_1_2_0 = (RuleCall)cBufferAssignment_9_2_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_9_2_1_3 = (Assignment)cAlternatives_9_2_1.eContents().get(3);
+		private final RuleCall cChannelChannelProtectedParserRuleCall_9_2_1_3_0 = (RuleCall)cChannelAssignment_9_2_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_9_2_1_4 = (Assignment)cAlternatives_9_2_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_2_1_4_0 = (RuleCall)cTypedefAssignment_9_2_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_9_2_1_5 = (Assignment)cAlternatives_9_2_1.eContents().get(5);
+		private final RuleCall cPropertyVariableProtectedParserRuleCall_9_2_1_5_0 = (RuleCall)cPropertyAssignment_9_2_1_5.eContents().get(0);
+		private final Group cGroup_9_3 = (Group)cAlternatives_9.eContents().get(3);
+		private final Keyword cPrivateKeyword_9_3_0 = (Keyword)cGroup_9_3.eContents().get(0);
+		private final Alternatives cAlternatives_9_3_1 = (Alternatives)cGroup_9_3.eContents().get(1);
+		private final Assignment cPortAssignment_9_3_1_0 = (Assignment)cAlternatives_9_3_1.eContents().get(0);
+		private final RuleCall cPortPortPrivateParserRuleCall_9_3_1_0_0 = (RuleCall)cPortAssignment_9_3_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_9_3_1_1 = (Assignment)cAlternatives_9_3_1.eContents().get(1);
+		private final RuleCall cSignalSignalPrivateParserRuleCall_9_3_1_1_0 = (RuleCall)cSignalAssignment_9_3_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_9_3_1_2 = (Assignment)cAlternatives_9_3_1.eContents().get(2);
+		private final RuleCall cBufferBufferPrivateParserRuleCall_9_3_1_2_0 = (RuleCall)cBufferAssignment_9_3_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_9_3_1_3 = (Assignment)cAlternatives_9_3_1.eContents().get(3);
+		private final RuleCall cChannelChannelPrivateParserRuleCall_9_3_1_3_0 = (RuleCall)cChannelAssignment_9_3_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_9_3_1_4 = (Assignment)cAlternatives_9_3_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_3_1_4_0 = (RuleCall)cTypedefAssignment_9_3_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_9_3_1_5 = (Assignment)cAlternatives_9_3_1.eContents().get(5);
+		private final RuleCall cPropertyVariablePrivateParserRuleCall_9_3_1_5_0 = (RuleCall)cPropertyAssignment_9_3_1_5.eContents().get(0);
+		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
+		private final Alternatives cAlternatives_10_0 = (Alternatives)cAlternatives_10.eContents().get(0);
+		private final Group cGroup_10_0_0 = (Group)cAlternatives_10_0.eContents().get(0);
+		private final Alternatives cAlternatives_10_0_0_0 = (Alternatives)cGroup_10_0_0.eContents().get(0);
+		private final Keyword cRoutineKeyword_10_0_0_0_0 = (Keyword)cAlternatives_10_0_0_0.eContents().get(0);
+		private final Keyword cMacroKeyword_10_0_0_0_1 = (Keyword)cAlternatives_10_0_0_0.eContents().get(1);
+		private final Assignment cRoutineAssignment_10_0_0_1 = (Assignment)cGroup_10_0_0.eContents().get(1);
+		private final RuleCall cRoutineRoutineParserRuleCall_10_0_0_1_0 = (RuleCall)cRoutineAssignment_10_0_0_1.eContents().get(0);
+		private final Group cGroup_10_0_1 = (Group)cAlternatives_10_0.eContents().get(1);
+		private final Keyword cProcedureKeyword_10_0_1_0 = (Keyword)cGroup_10_0_1.eContents().get(0);
+		private final Assignment cProcedureAssignment_10_0_1_1 = (Assignment)cGroup_10_0_1.eContents().get(1);
+		private final RuleCall cProcedureProcedureParserRuleCall_10_0_1_1_0 = (RuleCall)cProcedureAssignment_10_0_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_10_1 = (Alternatives)cAlternatives_10.eContents().get(1);
+		private final Assignment cRoutineAssignment_10_1_0 = (Assignment)cAlternatives_10_1.eContents().get(0);
+		private final RuleCall cRoutineRoutineParserRuleCall_10_1_0_0 = (RuleCall)cRoutineAssignment_10_1_0.eContents().get(0);
+		private final Assignment cProcedureAssignment_10_1_1 = (Assignment)cAlternatives_10_1.eContents().get(1);
+		private final RuleCall cProcedureProcedureParserRuleCall_10_1_1_0 = (RuleCall)cProcedureAssignment_10_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_11 = (Alternatives)cGroup.eContents().get(11);
+		private final Assignment cRegionAssignment_11_0 = (Assignment)cAlternatives_11.eContents().get(0);
+		private final RuleCall cRegionStatemachineRegionParserRuleCall_11_0_0 = (RuleCall)cRegionAssignment_11_0.eContents().get(0);
+		private final Assignment cRegionAssignment_11_1 = (Assignment)cAlternatives_11.eContents().get(1);
+		private final RuleCall cRegionStatemachineRegionLiteParserRuleCall_11_1_0 = (RuleCall)cRegionAssignment_11_1.eContents().get(0);
+		private final Assignment cExecutionAssignment_12 = (Assignment)cGroup.eContents().get(12);
+		private final RuleCall cExecutionProcedureExecutionParserRuleCall_12_0 = (RuleCall)cExecutionAssignment_12.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_13 = (Keyword)cGroup.eContents().get(13);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Procedure View Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Procedure fmlInfra::Procedure:
+		//	visibility=VisibilityKind?
+		//	'procedure' ('<' 'moc:'? ('and' | 'or') '>')?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? (('(' (parameter+=FunctionalParameter (','
+		//	parameter+=FunctionalParameter)*)? ')')? ('-->' (parameter+=FormalParameter
+		//	| '(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')'))?)?
+		//	'{' ('@parameter:' ('input' (parameter+=ParameterInput
+		//	| '{' parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout
+		//	| '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput
+		//	| '{' parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn
+		//	| '{' parameter+=ParameterReturn+ '}'))*
+		//	| (port+=Port
+		//	| signal+=Signal
+		//	| buffer+=Buffer
+		//	| channel+=Channel
+		//	| typedef+=TypeDefinition
+		//	| property+=Variable)*) ('@input:' (parameter+=ParameterInput
+		//	| '{' parameter+=ParameterInput+ '}')*
+		//	| '@inout:' (parameter+=ParameterInout
+		//	| '{' parameter+=ParameterInout+ '}')*
+		//	| '@output:' (parameter+=ParameterOutput
+		//	| '{' parameter+=ParameterOutput+ '}')*
+		//	| '@return:' (parameter+=ParameterReturn
+		//	| '{' parameter+=ParameterReturn+ '}')*)* ('@property:' (port+=Port
+		//	| signal+=Signal
+		//	| buffer+=Buffer
+		//	| channel+=Channel
+		//	| typedef+=TypeDefinition
+		//	| property+=Variable)*
+		//	| '@public:' (port+=PortPublic
+		//	| signal+=SignalPublic
+		//	| buffer+=BufferPublic
+		//	| channel+=ChannelPublic
+		//	| typedef+=TypeDefinition
+		//	| property+=VariablePublic)*
+		//	| '@protected:' (port+=PortProtected
+		//	| signal+=SignalProtected
+		//	| buffer+=BufferProtected
+		//	| channel+=ChannelProtected
+		//	| typedef+=TypeDefinition
+		//	| property+=VariableProtected)*
+		//	| '@private:' (port+=PortPrivate
+		//	| signal+=SignalPrivate
+		//	| buffer+=BufferPrivate
+		//	| channel+=ChannelPrivate
+		//	| typedef+=TypeDefinition
+		//	| property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+
+		//	| '@procedure:' procedure+=Procedure+)*
+		//	| (routine+=Routine | procedure+=Procedure)+) (region+=StatemachineRegion+
+		//	| region+=StatemachineRegionLite)?
+		//	execution=ProcedureExecution?
+		//	//		& ( computation=ModelOfComputation )?
+		//	//		& ( interaction=ModelOfInteraction )?
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=VisibilityKind? 'procedure' ('<' 'moc:'? ('and' | 'or') '>')? name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? (('(' (parameter+=FunctionalParameter (',' parameter+=FunctionalParameter)*)? ')')?
+		//('-->' (parameter+=FormalParameter | '(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')'))?)? '{'
+		//('@parameter:' ('input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}') | 'inout'
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput | '{'
+		//parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}'))* |
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*)
+		//('@input:' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')* | '@inout:' (parameter+=ParameterInout |
+		//'{' parameter+=ParameterInout+ '}')* | '@output:' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')* |
+		//'@return:' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')*)* ('@property:' (port+=Port |
+		//signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)* | '@public:'
+		//(port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic | typedef+=TypeDefinition |
+		//property+=VariablePublic)* | '@protected:' (port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected |
+		//channel+=ChannelProtected | typedef+=TypeDefinition | property+=VariableProtected)* | '@private:' (port+=PortPrivate |
+		//signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate | typedef+=TypeDefinition |
+		//property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)* |
+		//(routine+=Routine | procedure+=Procedure)+) (region+=StatemachineRegion+ | region+=StatemachineRegionLite)?
+		//execution=ProcedureExecution? //		& ( computation=ModelOfComputation )?
+		////		& ( interaction=ModelOfInteraction )?
+		//'}'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0; }
+		
+		//'procedure'
+		public Keyword getProcedureKeyword_1() { return cProcedureKeyword_1; }
+		
+		//('<' 'moc:'? ('and' | 'or') '>')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_2_1() { return cMocKeyword_2_1; }
+		
+		//('and' | 'or')
+		public Alternatives getAlternatives_2_2() { return cAlternatives_2_2; }
+		
+		//'and'
+		public Keyword getAndKeyword_2_2_0() { return cAndKeyword_2_2_0; }
+		
+		//'or'
+		public Keyword getOrKeyword_2_2_1() { return cOrKeyword_2_2_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//(('(' (parameter+=FunctionalParameter (',' parameter+=FunctionalParameter)*)? ')')? ('-->' (parameter+=FormalParameter |
+		//'(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')'))?)?
+		public Group getGroup_5() { return cGroup_5; }
+		
+		//('(' (parameter+=FunctionalParameter (',' parameter+=FunctionalParameter)*)? ')')?
+		public Group getGroup_5_0() { return cGroup_5_0; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_5_0_0() { return cLeftParenthesisKeyword_5_0_0; }
+		
+		//(parameter+=FunctionalParameter (',' parameter+=FunctionalParameter)*)?
+		public Group getGroup_5_0_1() { return cGroup_5_0_1; }
+		
+		//parameter+=FunctionalParameter
+		public Assignment getParameterAssignment_5_0_1_0() { return cParameterAssignment_5_0_1_0; }
+		
+		//FunctionalParameter
+		public RuleCall getParameterFunctionalParameterParserRuleCall_5_0_1_0_0() { return cParameterFunctionalParameterParserRuleCall_5_0_1_0_0; }
+		
+		//(',' parameter+=FunctionalParameter)*
+		public Group getGroup_5_0_1_1() { return cGroup_5_0_1_1; }
+		
+		//','
+		public Keyword getCommaKeyword_5_0_1_1_0() { return cCommaKeyword_5_0_1_1_0; }
+		
+		//parameter+=FunctionalParameter
+		public Assignment getParameterAssignment_5_0_1_1_1() { return cParameterAssignment_5_0_1_1_1; }
+		
+		//FunctionalParameter
+		public RuleCall getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0() { return cParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_5_0_2() { return cRightParenthesisKeyword_5_0_2; }
+		
+		//('-->' (parameter+=FormalParameter | '(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')'))?
+		public Group getGroup_5_1() { return cGroup_5_1; }
+		
+		//'-->'
+		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0; }
+		
+		//(parameter+=FormalParameter | '(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')
+		public Alternatives getAlternatives_5_1_1() { return cAlternatives_5_1_1; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_5_1_1_0() { return cParameterAssignment_5_1_1_0; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_5_1_1_0_0() { return cParameterFormalParameterParserRuleCall_5_1_1_0_0; }
+		
+		//'(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')'
+		public Group getGroup_5_1_1_1() { return cGroup_5_1_1_1; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_5_1_1_1_0() { return cLeftParenthesisKeyword_5_1_1_1_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_5_1_1_1_1() { return cParameterAssignment_5_1_1_1_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_5_1_1_1_1_0() { return cParameterFormalParameterParserRuleCall_5_1_1_1_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_5_1_1_1_2() { return cGroup_5_1_1_1_2; }
+		
+		//','
+		public Keyword getCommaKeyword_5_1_1_1_2_0() { return cCommaKeyword_5_1_1_1_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_5_1_1_1_2_1() { return cParameterAssignment_5_1_1_1_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0() { return cParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_5_1_1_1_3() { return cRightParenthesisKeyword_5_1_1_1_3; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
+		
+		//('@parameter:' ('input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}') | 'inout'
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput | '{'
+		//parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}'))* |
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*)
+		public Alternatives getAlternatives_7() { return cAlternatives_7; }
+		
+		//'@parameter:' ('input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}') | 'inout'
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput | '{'
+		//parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}'))*
+		public Group getGroup_7_0() { return cGroup_7_0; }
+		
+		//'@parameter:'
+		public Keyword getParameterKeyword_7_0_0() { return cParameterKeyword_7_0_0; }
+		
+		//('input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout | '{'
+		//parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}') |
+		//'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}'))*
+		public Alternatives getAlternatives_7_0_1() { return cAlternatives_7_0_1; }
+		
+		//'input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')
+		public Group getGroup_7_0_1_0() { return cGroup_7_0_1_0; }
+		
+		//'input'
+		public Keyword getInputKeyword_7_0_1_0_0() { return cInputKeyword_7_0_1_0_0; }
+		
+		//(parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')
+		public Alternatives getAlternatives_7_0_1_0_1() { return cAlternatives_7_0_1_0_1; }
+		
+		//parameter+=ParameterInput
+		public Assignment getParameterAssignment_7_0_1_0_1_0() { return cParameterAssignment_7_0_1_0_1_0; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0() { return cParameterParameterInputParserRuleCall_7_0_1_0_1_0_0; }
+		
+		//'{' parameter+=ParameterInput+ '}'
+		public Group getGroup_7_0_1_0_1_1() { return cGroup_7_0_1_0_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_1_0_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_0_1_1_0; }
+		
+		//parameter+=ParameterInput+
+		public Assignment getParameterAssignment_7_0_1_0_1_1_1() { return cParameterAssignment_7_0_1_0_1_1_1; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0() { return cParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_1_0_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_0_1_1_2; }
+		
+		//'inout' (parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')
+		public Group getGroup_7_0_1_1() { return cGroup_7_0_1_1; }
+		
+		//'inout'
+		public Keyword getInoutKeyword_7_0_1_1_0() { return cInoutKeyword_7_0_1_1_0; }
+		
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')
+		public Alternatives getAlternatives_7_0_1_1_1() { return cAlternatives_7_0_1_1_1; }
+		
+		//parameter+=ParameterInout
+		public Assignment getParameterAssignment_7_0_1_1_1_0() { return cParameterAssignment_7_0_1_1_1_0; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0() { return cParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0; }
+		
+		//'{' parameter+=ParameterInout+ '}'
+		public Group getGroup_7_0_1_1_1_1() { return cGroup_7_0_1_1_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_1_1_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_1_1_1_0; }
+		
+		//parameter+=ParameterInout+
+		public Assignment getParameterAssignment_7_0_1_1_1_1_1() { return cParameterAssignment_7_0_1_1_1_1_1; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0() { return cParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_1_1_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_1_1_1_2; }
+		
+		//'output' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')
+		public Group getGroup_7_0_1_2() { return cGroup_7_0_1_2; }
+		
+		//'output'
+		public Keyword getOutputKeyword_7_0_1_2_0() { return cOutputKeyword_7_0_1_2_0; }
+		
+		//(parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')
+		public Alternatives getAlternatives_7_0_1_2_1() { return cAlternatives_7_0_1_2_1; }
+		
+		//parameter+=ParameterOutput
+		public Assignment getParameterAssignment_7_0_1_2_1_0() { return cParameterAssignment_7_0_1_2_1_0; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0() { return cParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0; }
+		
+		//'{' parameter+=ParameterOutput+ '}'
+		public Group getGroup_7_0_1_2_1_1() { return cGroup_7_0_1_2_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_1_2_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_2_1_1_0; }
+		
+		//parameter+=ParameterOutput+
+		public Assignment getParameterAssignment_7_0_1_2_1_1_1() { return cParameterAssignment_7_0_1_2_1_1_1; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0() { return cParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_1_2_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_2_1_1_2; }
+		
+		//'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')
+		public Group getGroup_7_0_1_3() { return cGroup_7_0_1_3; }
+		
+		//'return'
+		public Keyword getReturnKeyword_7_0_1_3_0() { return cReturnKeyword_7_0_1_3_0; }
+		
+		//(parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')
+		public Alternatives getAlternatives_7_0_1_3_1() { return cAlternatives_7_0_1_3_1; }
+		
+		//parameter+=ParameterReturn
+		public Assignment getParameterAssignment_7_0_1_3_1_0() { return cParameterAssignment_7_0_1_3_1_0; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0() { return cParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0; }
+		
+		//'{' parameter+=ParameterReturn+ '}'
+		public Group getGroup_7_0_1_3_1_1() { return cGroup_7_0_1_3_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_1_3_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_3_1_1_0; }
+		
+		//parameter+=ParameterReturn+
+		public Assignment getParameterAssignment_7_0_1_3_1_1_1() { return cParameterAssignment_7_0_1_3_1_1_1; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0() { return cParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_1_3_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_3_1_1_2; }
+		
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*
+		public Alternatives getAlternatives_7_1() { return cAlternatives_7_1; }
+		
+		//port+=Port
+		public Assignment getPortAssignment_7_1_0() { return cPortAssignment_7_1_0; }
+		
+		//Port
+		public RuleCall getPortPortParserRuleCall_7_1_0_0() { return cPortPortParserRuleCall_7_1_0_0; }
+		
+		//signal+=Signal
+		public Assignment getSignalAssignment_7_1_1() { return cSignalAssignment_7_1_1; }
+		
+		//Signal
+		public RuleCall getSignalSignalParserRuleCall_7_1_1_0() { return cSignalSignalParserRuleCall_7_1_1_0; }
+		
+		//buffer+=Buffer
+		public Assignment getBufferAssignment_7_1_2() { return cBufferAssignment_7_1_2; }
+		
+		//Buffer
+		public RuleCall getBufferBufferParserRuleCall_7_1_2_0() { return cBufferBufferParserRuleCall_7_1_2_0; }
+		
+		//channel+=Channel
+		public Assignment getChannelAssignment_7_1_3() { return cChannelAssignment_7_1_3; }
+		
+		//Channel
+		public RuleCall getChannelChannelParserRuleCall_7_1_3_0() { return cChannelChannelParserRuleCall_7_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_1_4() { return cTypedefAssignment_7_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_1_4_0; }
+		
+		//property+=Variable
+		public Assignment getPropertyAssignment_7_1_5() { return cPropertyAssignment_7_1_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_7_1_5_0() { return cPropertyVariableParserRuleCall_7_1_5_0; }
+		
+		//('@input:' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')* | '@inout:' (parameter+=ParameterInout |
+		//'{' parameter+=ParameterInout+ '}')* | '@output:' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')* |
+		//'@return:' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')*)*
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//'@input:' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')*
+		public Group getGroup_8_0() { return cGroup_8_0; }
+		
+		//'@input:'
+		public Keyword getInputKeyword_8_0_0() { return cInputKeyword_8_0_0; }
+		
+		//(parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')*
+		public Alternatives getAlternatives_8_0_1() { return cAlternatives_8_0_1; }
+		
+		//parameter+=ParameterInput
+		public Assignment getParameterAssignment_8_0_1_0() { return cParameterAssignment_8_0_1_0; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_8_0_1_0_0() { return cParameterParameterInputParserRuleCall_8_0_1_0_0; }
+		
+		//'{' parameter+=ParameterInput+ '}'
+		public Group getGroup_8_0_1_1() { return cGroup_8_0_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_0_1_1_0() { return cLeftCurlyBracketKeyword_8_0_1_1_0; }
+		
+		//parameter+=ParameterInput+
+		public Assignment getParameterAssignment_8_0_1_1_1() { return cParameterAssignment_8_0_1_1_1; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_8_0_1_1_1_0() { return cParameterParameterInputParserRuleCall_8_0_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_0_1_1_2() { return cRightCurlyBracketKeyword_8_0_1_1_2; }
+		
+		//'@inout:' (parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')*
+		public Group getGroup_8_1() { return cGroup_8_1; }
+		
+		//'@inout:'
+		public Keyword getInoutKeyword_8_1_0() { return cInoutKeyword_8_1_0; }
+		
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')*
+		public Alternatives getAlternatives_8_1_1() { return cAlternatives_8_1_1; }
+		
+		//parameter+=ParameterInout
+		public Assignment getParameterAssignment_8_1_1_0() { return cParameterAssignment_8_1_1_0; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_8_1_1_0_0() { return cParameterParameterInoutParserRuleCall_8_1_1_0_0; }
+		
+		//'{' parameter+=ParameterInout+ '}'
+		public Group getGroup_8_1_1_1() { return cGroup_8_1_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_1_1_1_0() { return cLeftCurlyBracketKeyword_8_1_1_1_0; }
+		
+		//parameter+=ParameterInout+
+		public Assignment getParameterAssignment_8_1_1_1_1() { return cParameterAssignment_8_1_1_1_1; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_8_1_1_1_1_0() { return cParameterParameterInoutParserRuleCall_8_1_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_1_1_1_2() { return cRightCurlyBracketKeyword_8_1_1_1_2; }
+		
+		//'@output:' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')*
+		public Group getGroup_8_2() { return cGroup_8_2; }
+		
+		//'@output:'
+		public Keyword getOutputKeyword_8_2_0() { return cOutputKeyword_8_2_0; }
+		
+		//(parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')*
+		public Alternatives getAlternatives_8_2_1() { return cAlternatives_8_2_1; }
+		
+		//parameter+=ParameterOutput
+		public Assignment getParameterAssignment_8_2_1_0() { return cParameterAssignment_8_2_1_0; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_8_2_1_0_0() { return cParameterParameterOutputParserRuleCall_8_2_1_0_0; }
+		
+		//'{' parameter+=ParameterOutput+ '}'
+		public Group getGroup_8_2_1_1() { return cGroup_8_2_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_2_1_1_0() { return cLeftCurlyBracketKeyword_8_2_1_1_0; }
+		
+		//parameter+=ParameterOutput+
+		public Assignment getParameterAssignment_8_2_1_1_1() { return cParameterAssignment_8_2_1_1_1; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_8_2_1_1_1_0() { return cParameterParameterOutputParserRuleCall_8_2_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_2_1_1_2() { return cRightCurlyBracketKeyword_8_2_1_1_2; }
+		
+		//'@return:' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')*
+		public Group getGroup_8_3() { return cGroup_8_3; }
+		
+		//'@return:'
+		public Keyword getReturnKeyword_8_3_0() { return cReturnKeyword_8_3_0; }
+		
+		//(parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')*
+		public Alternatives getAlternatives_8_3_1() { return cAlternatives_8_3_1; }
+		
+		//parameter+=ParameterReturn
+		public Assignment getParameterAssignment_8_3_1_0() { return cParameterAssignment_8_3_1_0; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_8_3_1_0_0() { return cParameterParameterReturnParserRuleCall_8_3_1_0_0; }
+		
+		//'{' parameter+=ParameterReturn+ '}'
+		public Group getGroup_8_3_1_1() { return cGroup_8_3_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_3_1_1_0() { return cLeftCurlyBracketKeyword_8_3_1_1_0; }
+		
+		//parameter+=ParameterReturn+
+		public Assignment getParameterAssignment_8_3_1_1_1() { return cParameterAssignment_8_3_1_1_1; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_8_3_1_1_1_0() { return cParameterParameterReturnParserRuleCall_8_3_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_3_1_1_2() { return cRightCurlyBracketKeyword_8_3_1_1_2; }
+		
+		//('@property:' (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition |
+		//property+=Variable)* | '@public:' (port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic |
+		//channel+=ChannelPublic | typedef+=TypeDefinition | property+=VariablePublic)* | '@protected:' (port+=PortProtected |
+		//signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected | typedef+=TypeDefinition |
+		//property+=VariableProtected)* | '@private:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate |
+		//channel+=ChannelPrivate | typedef+=TypeDefinition | property+=VariablePrivate)*)*
+		public Alternatives getAlternatives_9() { return cAlternatives_9; }
+		
+		//'@property:' (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition |
+		//property+=Variable)*
+		public Group getGroup_9_0() { return cGroup_9_0; }
+		
+		//'@property:'
+		public Keyword getPropertyKeyword_9_0_0() { return cPropertyKeyword_9_0_0; }
+		
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*
+		public Alternatives getAlternatives_9_0_1() { return cAlternatives_9_0_1; }
+		
+		//port+=Port
+		public Assignment getPortAssignment_9_0_1_0() { return cPortAssignment_9_0_1_0; }
+		
+		//Port
+		public RuleCall getPortPortParserRuleCall_9_0_1_0_0() { return cPortPortParserRuleCall_9_0_1_0_0; }
+		
+		//signal+=Signal
+		public Assignment getSignalAssignment_9_0_1_1() { return cSignalAssignment_9_0_1_1; }
+		
+		//Signal
+		public RuleCall getSignalSignalParserRuleCall_9_0_1_1_0() { return cSignalSignalParserRuleCall_9_0_1_1_0; }
+		
+		//buffer+=Buffer
+		public Assignment getBufferAssignment_9_0_1_2() { return cBufferAssignment_9_0_1_2; }
+		
+		//Buffer
+		public RuleCall getBufferBufferParserRuleCall_9_0_1_2_0() { return cBufferBufferParserRuleCall_9_0_1_2_0; }
+		
+		//channel+=Channel
+		public Assignment getChannelAssignment_9_0_1_3() { return cChannelAssignment_9_0_1_3; }
+		
+		//Channel
+		public RuleCall getChannelChannelParserRuleCall_9_0_1_3_0() { return cChannelChannelParserRuleCall_9_0_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_9_0_1_4() { return cTypedefAssignment_9_0_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_0_1_4_0; }
+		
+		//property+=Variable
+		public Assignment getPropertyAssignment_9_0_1_5() { return cPropertyAssignment_9_0_1_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_9_0_1_5_0() { return cPropertyVariableParserRuleCall_9_0_1_5_0; }
+		
+		//'@public:' (port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic |
+		//typedef+=TypeDefinition | property+=VariablePublic)*
+		public Group getGroup_9_1() { return cGroup_9_1; }
+		
+		//'@public:'
+		public Keyword getPublicKeyword_9_1_0() { return cPublicKeyword_9_1_0; }
+		
+		//(port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic | typedef+=TypeDefinition |
+		//property+=VariablePublic)*
+		public Alternatives getAlternatives_9_1_1() { return cAlternatives_9_1_1; }
+		
+		//port+=PortPublic
+		public Assignment getPortAssignment_9_1_1_0() { return cPortAssignment_9_1_1_0; }
+		
+		//PortPublic
+		public RuleCall getPortPortPublicParserRuleCall_9_1_1_0_0() { return cPortPortPublicParserRuleCall_9_1_1_0_0; }
+		
+		//signal+=SignalPublic
+		public Assignment getSignalAssignment_9_1_1_1() { return cSignalAssignment_9_1_1_1; }
+		
+		//SignalPublic
+		public RuleCall getSignalSignalPublicParserRuleCall_9_1_1_1_0() { return cSignalSignalPublicParserRuleCall_9_1_1_1_0; }
+		
+		//buffer+=BufferPublic
+		public Assignment getBufferAssignment_9_1_1_2() { return cBufferAssignment_9_1_1_2; }
+		
+		//BufferPublic
+		public RuleCall getBufferBufferPublicParserRuleCall_9_1_1_2_0() { return cBufferBufferPublicParserRuleCall_9_1_1_2_0; }
+		
+		//channel+=ChannelPublic
+		public Assignment getChannelAssignment_9_1_1_3() { return cChannelAssignment_9_1_1_3; }
+		
+		//ChannelPublic
+		public RuleCall getChannelChannelPublicParserRuleCall_9_1_1_3_0() { return cChannelChannelPublicParserRuleCall_9_1_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_9_1_1_4() { return cTypedefAssignment_9_1_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_1_1_4_0; }
+		
+		//property+=VariablePublic
+		public Assignment getPropertyAssignment_9_1_1_5() { return cPropertyAssignment_9_1_1_5; }
+		
+		//VariablePublic
+		public RuleCall getPropertyVariablePublicParserRuleCall_9_1_1_5_0() { return cPropertyVariablePublicParserRuleCall_9_1_1_5_0; }
+		
+		//'@protected:' (port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected |
+		//typedef+=TypeDefinition | property+=VariableProtected)*
+		public Group getGroup_9_2() { return cGroup_9_2; }
+		
+		//'@protected:'
+		public Keyword getProtectedKeyword_9_2_0() { return cProtectedKeyword_9_2_0; }
+		
+		//(port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected |
+		//typedef+=TypeDefinition | property+=VariableProtected)*
+		public Alternatives getAlternatives_9_2_1() { return cAlternatives_9_2_1; }
+		
+		//port+=PortProtected
+		public Assignment getPortAssignment_9_2_1_0() { return cPortAssignment_9_2_1_0; }
+		
+		//PortProtected
+		public RuleCall getPortPortProtectedParserRuleCall_9_2_1_0_0() { return cPortPortProtectedParserRuleCall_9_2_1_0_0; }
+		
+		//signal+=SignalProtected
+		public Assignment getSignalAssignment_9_2_1_1() { return cSignalAssignment_9_2_1_1; }
+		
+		//SignalProtected
+		public RuleCall getSignalSignalProtectedParserRuleCall_9_2_1_1_0() { return cSignalSignalProtectedParserRuleCall_9_2_1_1_0; }
+		
+		//buffer+=BufferProtected
+		public Assignment getBufferAssignment_9_2_1_2() { return cBufferAssignment_9_2_1_2; }
+		
+		//BufferProtected
+		public RuleCall getBufferBufferProtectedParserRuleCall_9_2_1_2_0() { return cBufferBufferProtectedParserRuleCall_9_2_1_2_0; }
+		
+		//channel+=ChannelProtected
+		public Assignment getChannelAssignment_9_2_1_3() { return cChannelAssignment_9_2_1_3; }
+		
+		//ChannelProtected
+		public RuleCall getChannelChannelProtectedParserRuleCall_9_2_1_3_0() { return cChannelChannelProtectedParserRuleCall_9_2_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_9_2_1_4() { return cTypedefAssignment_9_2_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_2_1_4_0; }
+		
+		//property+=VariableProtected
+		public Assignment getPropertyAssignment_9_2_1_5() { return cPropertyAssignment_9_2_1_5; }
+		
+		//VariableProtected
+		public RuleCall getPropertyVariableProtectedParserRuleCall_9_2_1_5_0() { return cPropertyVariableProtectedParserRuleCall_9_2_1_5_0; }
+		
+		//'@private:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate |
+		//typedef+=TypeDefinition | property+=VariablePrivate)*
+		public Group getGroup_9_3() { return cGroup_9_3; }
+		
+		//'@private:'
+		public Keyword getPrivateKeyword_9_3_0() { return cPrivateKeyword_9_3_0; }
+		
+		//(port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate | typedef+=TypeDefinition |
+		//property+=VariablePrivate)*
+		public Alternatives getAlternatives_9_3_1() { return cAlternatives_9_3_1; }
+		
+		//port+=PortPrivate
+		public Assignment getPortAssignment_9_3_1_0() { return cPortAssignment_9_3_1_0; }
+		
+		//PortPrivate
+		public RuleCall getPortPortPrivateParserRuleCall_9_3_1_0_0() { return cPortPortPrivateParserRuleCall_9_3_1_0_0; }
+		
+		//signal+=SignalPrivate
+		public Assignment getSignalAssignment_9_3_1_1() { return cSignalAssignment_9_3_1_1; }
+		
+		//SignalPrivate
+		public RuleCall getSignalSignalPrivateParserRuleCall_9_3_1_1_0() { return cSignalSignalPrivateParserRuleCall_9_3_1_1_0; }
+		
+		//buffer+=BufferPrivate
+		public Assignment getBufferAssignment_9_3_1_2() { return cBufferAssignment_9_3_1_2; }
+		
+		//BufferPrivate
+		public RuleCall getBufferBufferPrivateParserRuleCall_9_3_1_2_0() { return cBufferBufferPrivateParserRuleCall_9_3_1_2_0; }
+		
+		//channel+=ChannelPrivate
+		public Assignment getChannelAssignment_9_3_1_3() { return cChannelAssignment_9_3_1_3; }
+		
+		//ChannelPrivate
+		public RuleCall getChannelChannelPrivateParserRuleCall_9_3_1_3_0() { return cChannelChannelPrivateParserRuleCall_9_3_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_9_3_1_4() { return cTypedefAssignment_9_3_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_3_1_4_0; }
+		
+		//property+=VariablePrivate
+		public Assignment getPropertyAssignment_9_3_1_5() { return cPropertyAssignment_9_3_1_5; }
+		
+		//VariablePrivate
+		public RuleCall getPropertyVariablePrivateParserRuleCall_9_3_1_5_0() { return cPropertyVariablePrivateParserRuleCall_9_3_1_5_0; }
+		
+		//((('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)* | (routine+=Routine |
+		//procedure+=Procedure)+)
+		public Alternatives getAlternatives_10() { return cAlternatives_10; }
+		
+		//(('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)*
+		public Alternatives getAlternatives_10_0() { return cAlternatives_10_0; }
+		
+		//('@routine:' | '@macro:') routine+=Routine+
+		public Group getGroup_10_0_0() { return cGroup_10_0_0; }
+		
+		//('@routine:' | '@macro:')
+		public Alternatives getAlternatives_10_0_0_0() { return cAlternatives_10_0_0_0; }
+		
+		//'@routine:'
+		public Keyword getRoutineKeyword_10_0_0_0_0() { return cRoutineKeyword_10_0_0_0_0; }
+		
+		//'@macro:'
+		public Keyword getMacroKeyword_10_0_0_0_1() { return cMacroKeyword_10_0_0_0_1; }
+		
+		//routine+=Routine+
+		public Assignment getRoutineAssignment_10_0_0_1() { return cRoutineAssignment_10_0_0_1; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_10_0_0_1_0() { return cRoutineRoutineParserRuleCall_10_0_0_1_0; }
+		
+		//'@procedure:' procedure+=Procedure+
+		public Group getGroup_10_0_1() { return cGroup_10_0_1; }
+		
+		//'@procedure:'
+		public Keyword getProcedureKeyword_10_0_1_0() { return cProcedureKeyword_10_0_1_0; }
+		
+		//procedure+=Procedure+
+		public Assignment getProcedureAssignment_10_0_1_1() { return cProcedureAssignment_10_0_1_1; }
+		
+		//Procedure
+		public RuleCall getProcedureProcedureParserRuleCall_10_0_1_1_0() { return cProcedureProcedureParserRuleCall_10_0_1_1_0; }
+		
+		//(routine+=Routine | procedure+=Procedure)+
+		public Alternatives getAlternatives_10_1() { return cAlternatives_10_1; }
+		
+		//routine+=Routine
+		public Assignment getRoutineAssignment_10_1_0() { return cRoutineAssignment_10_1_0; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_10_1_0_0() { return cRoutineRoutineParserRuleCall_10_1_0_0; }
+		
+		//procedure+=Procedure
+		public Assignment getProcedureAssignment_10_1_1() { return cProcedureAssignment_10_1_1; }
+		
+		//Procedure
+		public RuleCall getProcedureProcedureParserRuleCall_10_1_1_0() { return cProcedureProcedureParserRuleCall_10_1_1_0; }
+		
+		//(region+=StatemachineRegion+ | region+=StatemachineRegionLite)?
+		public Alternatives getAlternatives_11() { return cAlternatives_11; }
+		
+		//region+=StatemachineRegion+
+		public Assignment getRegionAssignment_11_0() { return cRegionAssignment_11_0; }
+		
+		//StatemachineRegion
+		public RuleCall getRegionStatemachineRegionParserRuleCall_11_0_0() { return cRegionStatemachineRegionParserRuleCall_11_0_0; }
+		
+		//region+=StatemachineRegionLite
+		public Assignment getRegionAssignment_11_1() { return cRegionAssignment_11_1; }
+		
+		//StatemachineRegionLite
+		public RuleCall getRegionStatemachineRegionLiteParserRuleCall_11_1_0() { return cRegionStatemachineRegionLiteParserRuleCall_11_1_0; }
+		
+		//execution=ProcedureExecution?
+		public Assignment getExecutionAssignment_12() { return cExecutionAssignment_12; }
+		
+		//ProcedureExecution
+		public RuleCall getExecutionProcedureExecutionParserRuleCall_12_0() { return cExecutionProcedureExecutionParserRuleCall_12_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_13() { return cRightCurlyBracketKeyword_13; }
+	}
+	public class ProcedureExecutionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ProcedureExecution");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cModelOfExecutionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cMoeKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
+		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
+		private final Keyword cScheduleKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
+		private final Assignment cScheduleRoutineAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
+		private final RuleCall cScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0 = (RuleCall)cScheduleRoutineAssignment_2_0_1.eContents().get(0);
+		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
+		private final Keyword cRunKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
+		private final Assignment cRunRoutineAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
+		private final RuleCall cRunRoutineMoeRoutineParserRuleCall_2_1_1_0 = (RuleCall)cRunRoutineAssignment_2_1_1.eContents().get(0);
+		
+		//ProcedureExecution fmlInfra::ModelOfExecution:
+		//	{fmlInfra::ModelOfExecution} '@moe:'? (('@schedule' scheduleRoutine=moeRoutine)?
+		//	& ('@run' runRoutine=moeRoutine)?)
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::ModelOfExecution} '@moe:'? (('@schedule' scheduleRoutine=moeRoutine)? & ('@run' runRoutine=moeRoutine)?)
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::ModelOfExecution}
+		public Action getModelOfExecutionAction_0() { return cModelOfExecutionAction_0; }
+		
+		//'@moe:'?
+		public Keyword getMoeKeyword_1() { return cMoeKeyword_1; }
+		
+		//(('@schedule' scheduleRoutine=moeRoutine)? & ('@run' runRoutine=moeRoutine)?)
+		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
+		
+		//('@schedule' scheduleRoutine=moeRoutine)?
+		public Group getGroup_2_0() { return cGroup_2_0; }
+		
+		//'@schedule'
+		public Keyword getScheduleKeyword_2_0_0() { return cScheduleKeyword_2_0_0; }
+		
+		//scheduleRoutine=moeRoutine
+		public Assignment getScheduleRoutineAssignment_2_0_1() { return cScheduleRoutineAssignment_2_0_1; }
+		
+		//moeRoutine
+		public RuleCall getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0() { return cScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0; }
+		
+		//('@run' runRoutine=moeRoutine)?
+		public Group getGroup_2_1() { return cGroup_2_1; }
+		
+		//'@run'
+		public Keyword getRunKeyword_2_1_0() { return cRunKeyword_2_1_0; }
+		
+		//runRoutine=moeRoutine
+		public Assignment getRunRoutineAssignment_2_1_1() { return cRunRoutineAssignment_2_1_1; }
+		
+		//moeRoutine
+		public RuleCall getRunRoutineMoeRoutineParserRuleCall_2_1_1_0() { return cRunRoutineMoeRoutineParserRuleCall_2_1_1_0; }
+	}
+	public class BehaviorElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Behavior");
+		private final RuleCall cStatemachineParserRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Behavior View Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Behavior fmlInfra::Behavior:
+		//	Statemachine
+		@Override public ParserRule getRule() { return rule; }
+		
+		//Statemachine
+		public RuleCall getStatemachineParserRuleCall() { return cStatemachineParserRuleCall; }
+	}
+	public class MoeBehaviorElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.MoeBehavior");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cBehaviorAction_0 = (Action)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cLocalKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
+		private final Assignment cPortAssignment_1_1_0 = (Assignment)cAlternatives_1_1.eContents().get(0);
+		private final RuleCall cPortPortPrivateParserRuleCall_1_1_0_0 = (RuleCall)cPortAssignment_1_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_1_1_1 = (Assignment)cAlternatives_1_1.eContents().get(1);
+		private final RuleCall cSignalSignalPrivateParserRuleCall_1_1_1_0 = (RuleCall)cSignalAssignment_1_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_1_1_2 = (Assignment)cAlternatives_1_1.eContents().get(2);
+		private final RuleCall cBufferBufferPrivateParserRuleCall_1_1_2_0 = (RuleCall)cBufferAssignment_1_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_1_1_3 = (Assignment)cAlternatives_1_1.eContents().get(3);
+		private final RuleCall cChannelChannelPrivateParserRuleCall_1_1_3_0 = (RuleCall)cChannelAssignment_1_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_1_1_4 = (Assignment)cAlternatives_1_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_1_1_4_0 = (RuleCall)cTypedefAssignment_1_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_1_1_5 = (Assignment)cAlternatives_1_1.eContents().get(5);
+		private final RuleCall cPropertyVariablePrivateParserRuleCall_1_1_5_0 = (RuleCall)cPropertyAssignment_1_1_5.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
+		private final Assignment cExecutionAssignment_2_0 = (Assignment)cUnorderedGroup_2.eContents().get(0);
+		private final RuleCall cExecutionModelOfExecutionParserRuleCall_2_0_0 = (RuleCall)cExecutionAssignment_2_0.eContents().get(0);
+		private final Assignment cInteractionAssignment_2_1 = (Assignment)cUnorderedGroup_2.eContents().get(1);
+		private final RuleCall cInteractionModelOfInteractionParserRuleCall_2_1_0 = (RuleCall)cInteractionAssignment_2_1.eContents().get(0);
+		
+		//MoeBehavior fmlInfra::Behavior:
+		//	{fmlInfra::Behavior} ('@local:' (port+=PortPrivate
+		//	| signal+=SignalPrivate
+		//	| buffer+=BufferPrivate
+		//	| channel+=ChannelPrivate
+		//	| typedef+=TypeDefinition
+		//	| property+=VariablePrivate)*)? (execution=ModelOfExecution?
+		//	//		& ( computation=ModelOfComputation )?
+		//	& interaction=ModelOfInteraction?)
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Behavior} ('@local:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate |
+		//channel+=ChannelPrivate | typedef+=TypeDefinition | property+=VariablePrivate)*)? (execution=ModelOfExecution? //		& ( computation=ModelOfComputation )?
+		//& interaction=ModelOfInteraction?)
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Behavior}
+		public Action getBehaviorAction_0() { return cBehaviorAction_0; }
+		
+		//('@local:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate |
+		//typedef+=TypeDefinition | property+=VariablePrivate)*)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'@local:'
+		public Keyword getLocalKeyword_1_0() { return cLocalKeyword_1_0; }
+		
+		//(port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate | typedef+=TypeDefinition |
+		//property+=VariablePrivate)*
+		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
+		
+		//port+=PortPrivate
+		public Assignment getPortAssignment_1_1_0() { return cPortAssignment_1_1_0; }
+		
+		//PortPrivate
+		public RuleCall getPortPortPrivateParserRuleCall_1_1_0_0() { return cPortPortPrivateParserRuleCall_1_1_0_0; }
+		
+		//signal+=SignalPrivate
+		public Assignment getSignalAssignment_1_1_1() { return cSignalAssignment_1_1_1; }
+		
+		//SignalPrivate
+		public RuleCall getSignalSignalPrivateParserRuleCall_1_1_1_0() { return cSignalSignalPrivateParserRuleCall_1_1_1_0; }
+		
+		//buffer+=BufferPrivate
+		public Assignment getBufferAssignment_1_1_2() { return cBufferAssignment_1_1_2; }
+		
+		//BufferPrivate
+		public RuleCall getBufferBufferPrivateParserRuleCall_1_1_2_0() { return cBufferBufferPrivateParserRuleCall_1_1_2_0; }
+		
+		//channel+=ChannelPrivate
+		public Assignment getChannelAssignment_1_1_3() { return cChannelAssignment_1_1_3; }
+		
+		//ChannelPrivate
+		public RuleCall getChannelChannelPrivateParserRuleCall_1_1_3_0() { return cChannelChannelPrivateParserRuleCall_1_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_1_1_4() { return cTypedefAssignment_1_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_1_1_4_0; }
+		
+		//property+=VariablePrivate
+		public Assignment getPropertyAssignment_1_1_5() { return cPropertyAssignment_1_1_5; }
+		
+		//VariablePrivate
+		public RuleCall getPropertyVariablePrivateParserRuleCall_1_1_5_0() { return cPropertyVariablePrivateParserRuleCall_1_1_5_0; }
+		
+		//(execution=ModelOfExecution? //		& ( computation=ModelOfComputation )?
+		//& interaction=ModelOfInteraction?)
+		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
+		
+		//execution=ModelOfExecution?
+		public Assignment getExecutionAssignment_2_0() { return cExecutionAssignment_2_0; }
+		
+		//ModelOfExecution
+		public RuleCall getExecutionModelOfExecutionParserRuleCall_2_0_0() { return cExecutionModelOfExecutionParserRuleCall_2_0_0; }
+		
+		//interaction=ModelOfInteraction?
+		public Assignment getInteractionAssignment_2_1() { return cInteractionAssignment_2_1; }
+		
+		//ModelOfInteraction
+		public RuleCall getInteractionModelOfInteractionParserRuleCall_2_1_0() { return cInteractionModelOfInteractionParserRuleCall_2_1_0; }
+	}
+	public class StatemachineElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Statemachine");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStatemachineAction_0 = (Action)cGroup.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
+		private final Assignment cVisibilityAssignment_1_0 = (Assignment)cUnorderedGroup_1.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0_0 = (RuleCall)cVisibilityAssignment_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_1_1 = (Alternatives)cUnorderedGroup_1.eContents().get(1);
+		private final Assignment cTimedAssignment_1_1_0 = (Assignment)cAlternatives_1_1.eContents().get(0);
+		private final Keyword cTimedTimedKeyword_1_1_0_0 = (Keyword)cTimedAssignment_1_1_0.eContents().get(0);
+		private final Assignment cInput_enabledAssignment_1_1_1 = (Assignment)cAlternatives_1_1.eContents().get(1);
+		private final Keyword cInput_enabledInput_enabledKeyword_1_1_1_0 = (Keyword)cInput_enabledAssignment_1_1_1.eContents().get(0);
+		private final Assignment cDesignAssignment_1_2 = (Assignment)cUnorderedGroup_1.eContents().get(2);
+		private final RuleCall cDesignDesignKindEnumRuleCall_1_2_0 = (RuleCall)cDesignAssignment_1_2.eContents().get(0);
+		private final Keyword cStatemachineKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Keyword cLessThanSignKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final Keyword cMocKeyword_3_1 = (Keyword)cGroup_3.eContents().get(1);
+		private final Alternatives cAlternatives_3_2 = (Alternatives)cGroup_3.eContents().get(2);
+		private final Keyword cOrKeyword_3_2_0 = (Keyword)cAlternatives_3_2.eContents().get(0);
+		private final Keyword cAndKeyword_3_2_1 = (Keyword)cAlternatives_3_2.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_3_3 = (Keyword)cGroup_3.eContents().get(3);
+		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
+		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
+		private final Keyword cParameterKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1 = (Alternatives)cGroup_7_0.eContents().get(1);
+		private final Group cGroup_7_0_1_0 = (Group)cAlternatives_7_0_1.eContents().get(0);
+		private final Keyword cInputKeyword_7_0_1_0_0 = (Keyword)cGroup_7_0_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1_0_1 = (Alternatives)cGroup_7_0_1_0.eContents().get(1);
+		private final Assignment cParameterAssignment_7_0_1_0_1_0 = (Assignment)cAlternatives_7_0_1_0_1.eContents().get(0);
+		private final RuleCall cParameterParameterInputParserRuleCall_7_0_1_0_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_0_1_0.eContents().get(0);
+		private final Group cGroup_7_0_1_0_1_1 = (Group)cAlternatives_7_0_1_0_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_1_0_1_1_0 = (Keyword)cGroup_7_0_1_0_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_7_0_1_0_1_1_1 = (Assignment)cGroup_7_0_1_0_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_0_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_1_0_1_1_2 = (Keyword)cGroup_7_0_1_0_1_1.eContents().get(2);
+		private final Group cGroup_7_0_1_1 = (Group)cAlternatives_7_0_1.eContents().get(1);
+		private final Keyword cInoutKeyword_7_0_1_1_0 = (Keyword)cGroup_7_0_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1_1_1 = (Alternatives)cGroup_7_0_1_1.eContents().get(1);
+		private final Assignment cParameterAssignment_7_0_1_1_1_0 = (Assignment)cAlternatives_7_0_1_1_1.eContents().get(0);
+		private final RuleCall cParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_1_1_0.eContents().get(0);
+		private final Group cGroup_7_0_1_1_1_1 = (Group)cAlternatives_7_0_1_1_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_1_1_1_1_0 = (Keyword)cGroup_7_0_1_1_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_7_0_1_1_1_1_1 = (Assignment)cGroup_7_0_1_1_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_1_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_1_1_1_1_2 = (Keyword)cGroup_7_0_1_1_1_1.eContents().get(2);
+		private final Group cGroup_7_0_1_2 = (Group)cAlternatives_7_0_1.eContents().get(2);
+		private final Keyword cOutputKeyword_7_0_1_2_0 = (Keyword)cGroup_7_0_1_2.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1_2_1 = (Alternatives)cGroup_7_0_1_2.eContents().get(1);
+		private final Assignment cParameterAssignment_7_0_1_2_1_0 = (Assignment)cAlternatives_7_0_1_2_1.eContents().get(0);
+		private final RuleCall cParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_2_1_0.eContents().get(0);
+		private final Group cGroup_7_0_1_2_1_1 = (Group)cAlternatives_7_0_1_2_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_1_2_1_1_0 = (Keyword)cGroup_7_0_1_2_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_7_0_1_2_1_1_1 = (Assignment)cGroup_7_0_1_2_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_2_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_1_2_1_1_2 = (Keyword)cGroup_7_0_1_2_1_1.eContents().get(2);
+		private final Group cGroup_7_0_1_3 = (Group)cAlternatives_7_0_1.eContents().get(3);
+		private final Keyword cReturnKeyword_7_0_1_3_0 = (Keyword)cGroup_7_0_1_3.eContents().get(0);
+		private final Alternatives cAlternatives_7_0_1_3_1 = (Alternatives)cGroup_7_0_1_3.eContents().get(1);
+		private final Assignment cParameterAssignment_7_0_1_3_1_0 = (Assignment)cAlternatives_7_0_1_3_1.eContents().get(0);
+		private final RuleCall cParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_3_1_0.eContents().get(0);
+		private final Group cGroup_7_0_1_3_1_1 = (Group)cAlternatives_7_0_1_3_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_1_3_1_1_0 = (Keyword)cGroup_7_0_1_3_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_7_0_1_3_1_1_1 = (Assignment)cGroup_7_0_1_3_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_3_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_1_3_1_1_2 = (Keyword)cGroup_7_0_1_3_1_1.eContents().get(2);
+		private final Alternatives cAlternatives_7_1 = (Alternatives)cAlternatives_7.eContents().get(1);
+		private final Assignment cPortAssignment_7_1_0 = (Assignment)cAlternatives_7_1.eContents().get(0);
+		private final RuleCall cPortPortParserRuleCall_7_1_0_0 = (RuleCall)cPortAssignment_7_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_7_1_1 = (Assignment)cAlternatives_7_1.eContents().get(1);
+		private final RuleCall cSignalSignalParserRuleCall_7_1_1_0 = (RuleCall)cSignalAssignment_7_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_7_1_2 = (Assignment)cAlternatives_7_1.eContents().get(2);
+		private final RuleCall cBufferBufferParserRuleCall_7_1_2_0 = (RuleCall)cBufferAssignment_7_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_7_1_3 = (Assignment)cAlternatives_7_1.eContents().get(3);
+		private final RuleCall cChannelChannelParserRuleCall_7_1_3_0 = (RuleCall)cChannelAssignment_7_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_7_1_4 = (Assignment)cAlternatives_7_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_1_4_0 = (RuleCall)cTypedefAssignment_7_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_7_1_5 = (Assignment)cAlternatives_7_1.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_7_1_5_0 = (RuleCall)cPropertyAssignment_7_1_5.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
+		private final Keyword cInputKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
+		private final Alternatives cAlternatives_8_0_1 = (Alternatives)cGroup_8_0.eContents().get(1);
+		private final Assignment cParameterAssignment_8_0_1_0 = (Assignment)cAlternatives_8_0_1.eContents().get(0);
+		private final RuleCall cParameterParameterInputParserRuleCall_8_0_1_0_0 = (RuleCall)cParameterAssignment_8_0_1_0.eContents().get(0);
+		private final Group cGroup_8_0_1_1 = (Group)cAlternatives_8_0_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_0_1_1_0 = (Keyword)cGroup_8_0_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_8_0_1_1_1 = (Assignment)cGroup_8_0_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInputParserRuleCall_8_0_1_1_1_0 = (RuleCall)cParameterAssignment_8_0_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_0_1_1_2 = (Keyword)cGroup_8_0_1_1.eContents().get(2);
+		private final Group cGroup_8_1 = (Group)cAlternatives_8.eContents().get(1);
+		private final Keyword cInoutKeyword_8_1_0 = (Keyword)cGroup_8_1.eContents().get(0);
+		private final Alternatives cAlternatives_8_1_1 = (Alternatives)cGroup_8_1.eContents().get(1);
+		private final Assignment cParameterAssignment_8_1_1_0 = (Assignment)cAlternatives_8_1_1.eContents().get(0);
+		private final RuleCall cParameterParameterInoutParserRuleCall_8_1_1_0_0 = (RuleCall)cParameterAssignment_8_1_1_0.eContents().get(0);
+		private final Group cGroup_8_1_1_1 = (Group)cAlternatives_8_1_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_1_1_1_0 = (Keyword)cGroup_8_1_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_8_1_1_1_1 = (Assignment)cGroup_8_1_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInoutParserRuleCall_8_1_1_1_1_0 = (RuleCall)cParameterAssignment_8_1_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_1_1_1_2 = (Keyword)cGroup_8_1_1_1.eContents().get(2);
+		private final Group cGroup_8_2 = (Group)cAlternatives_8.eContents().get(2);
+		private final Keyword cOutputKeyword_8_2_0 = (Keyword)cGroup_8_2.eContents().get(0);
+		private final Alternatives cAlternatives_8_2_1 = (Alternatives)cGroup_8_2.eContents().get(1);
+		private final Assignment cParameterAssignment_8_2_1_0 = (Assignment)cAlternatives_8_2_1.eContents().get(0);
+		private final RuleCall cParameterParameterOutputParserRuleCall_8_2_1_0_0 = (RuleCall)cParameterAssignment_8_2_1_0.eContents().get(0);
+		private final Group cGroup_8_2_1_1 = (Group)cAlternatives_8_2_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_2_1_1_0 = (Keyword)cGroup_8_2_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_8_2_1_1_1 = (Assignment)cGroup_8_2_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterOutputParserRuleCall_8_2_1_1_1_0 = (RuleCall)cParameterAssignment_8_2_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_2_1_1_2 = (Keyword)cGroup_8_2_1_1.eContents().get(2);
+		private final Group cGroup_8_3 = (Group)cAlternatives_8.eContents().get(3);
+		private final Keyword cReturnKeyword_8_3_0 = (Keyword)cGroup_8_3.eContents().get(0);
+		private final Alternatives cAlternatives_8_3_1 = (Alternatives)cGroup_8_3.eContents().get(1);
+		private final Assignment cParameterAssignment_8_3_1_0 = (Assignment)cAlternatives_8_3_1.eContents().get(0);
+		private final RuleCall cParameterParameterReturnParserRuleCall_8_3_1_0_0 = (RuleCall)cParameterAssignment_8_3_1_0.eContents().get(0);
+		private final Group cGroup_8_3_1_1 = (Group)cAlternatives_8_3_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_8_3_1_1_0 = (Keyword)cGroup_8_3_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_8_3_1_1_1 = (Assignment)cGroup_8_3_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterReturnParserRuleCall_8_3_1_1_1_0 = (RuleCall)cParameterAssignment_8_3_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_3_1_1_2 = (Keyword)cGroup_8_3_1_1.eContents().get(2);
+		private final Alternatives cAlternatives_9 = (Alternatives)cGroup.eContents().get(9);
+		private final Group cGroup_9_0 = (Group)cAlternatives_9.eContents().get(0);
+		private final Keyword cPropertyKeyword_9_0_0 = (Keyword)cGroup_9_0.eContents().get(0);
+		private final Alternatives cAlternatives_9_0_1 = (Alternatives)cGroup_9_0.eContents().get(1);
+		private final Assignment cPortAssignment_9_0_1_0 = (Assignment)cAlternatives_9_0_1.eContents().get(0);
+		private final RuleCall cPortPortParserRuleCall_9_0_1_0_0 = (RuleCall)cPortAssignment_9_0_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_9_0_1_1 = (Assignment)cAlternatives_9_0_1.eContents().get(1);
+		private final RuleCall cSignalSignalParserRuleCall_9_0_1_1_0 = (RuleCall)cSignalAssignment_9_0_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_9_0_1_2 = (Assignment)cAlternatives_9_0_1.eContents().get(2);
+		private final RuleCall cBufferBufferParserRuleCall_9_0_1_2_0 = (RuleCall)cBufferAssignment_9_0_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_9_0_1_3 = (Assignment)cAlternatives_9_0_1.eContents().get(3);
+		private final RuleCall cChannelChannelParserRuleCall_9_0_1_3_0 = (RuleCall)cChannelAssignment_9_0_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_9_0_1_4 = (Assignment)cAlternatives_9_0_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_0_1_4_0 = (RuleCall)cTypedefAssignment_9_0_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_9_0_1_5 = (Assignment)cAlternatives_9_0_1.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_9_0_1_5_0 = (RuleCall)cPropertyAssignment_9_0_1_5.eContents().get(0);
+		private final Group cGroup_9_1 = (Group)cAlternatives_9.eContents().get(1);
+		private final Keyword cPublicKeyword_9_1_0 = (Keyword)cGroup_9_1.eContents().get(0);
+		private final Alternatives cAlternatives_9_1_1 = (Alternatives)cGroup_9_1.eContents().get(1);
+		private final Assignment cPortAssignment_9_1_1_0 = (Assignment)cAlternatives_9_1_1.eContents().get(0);
+		private final RuleCall cPortPortPublicParserRuleCall_9_1_1_0_0 = (RuleCall)cPortAssignment_9_1_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_9_1_1_1 = (Assignment)cAlternatives_9_1_1.eContents().get(1);
+		private final RuleCall cSignalSignalPublicParserRuleCall_9_1_1_1_0 = (RuleCall)cSignalAssignment_9_1_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_9_1_1_2 = (Assignment)cAlternatives_9_1_1.eContents().get(2);
+		private final RuleCall cBufferBufferPublicParserRuleCall_9_1_1_2_0 = (RuleCall)cBufferAssignment_9_1_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_9_1_1_3 = (Assignment)cAlternatives_9_1_1.eContents().get(3);
+		private final RuleCall cChannelChannelPublicParserRuleCall_9_1_1_3_0 = (RuleCall)cChannelAssignment_9_1_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_9_1_1_4 = (Assignment)cAlternatives_9_1_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_1_1_4_0 = (RuleCall)cTypedefAssignment_9_1_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_9_1_1_5 = (Assignment)cAlternatives_9_1_1.eContents().get(5);
+		private final RuleCall cPropertyVariablePublicParserRuleCall_9_1_1_5_0 = (RuleCall)cPropertyAssignment_9_1_1_5.eContents().get(0);
+		private final Group cGroup_9_2 = (Group)cAlternatives_9.eContents().get(2);
+		private final Keyword cProtectedKeyword_9_2_0 = (Keyword)cGroup_9_2.eContents().get(0);
+		private final Alternatives cAlternatives_9_2_1 = (Alternatives)cGroup_9_2.eContents().get(1);
+		private final Assignment cPortAssignment_9_2_1_0 = (Assignment)cAlternatives_9_2_1.eContents().get(0);
+		private final RuleCall cPortPortProtectedParserRuleCall_9_2_1_0_0 = (RuleCall)cPortAssignment_9_2_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_9_2_1_1 = (Assignment)cAlternatives_9_2_1.eContents().get(1);
+		private final RuleCall cSignalSignalProtectedParserRuleCall_9_2_1_1_0 = (RuleCall)cSignalAssignment_9_2_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_9_2_1_2 = (Assignment)cAlternatives_9_2_1.eContents().get(2);
+		private final RuleCall cBufferBufferProtectedParserRuleCall_9_2_1_2_0 = (RuleCall)cBufferAssignment_9_2_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_9_2_1_3 = (Assignment)cAlternatives_9_2_1.eContents().get(3);
+		private final RuleCall cChannelChannelProtectedParserRuleCall_9_2_1_3_0 = (RuleCall)cChannelAssignment_9_2_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_9_2_1_4 = (Assignment)cAlternatives_9_2_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_2_1_4_0 = (RuleCall)cTypedefAssignment_9_2_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_9_2_1_5 = (Assignment)cAlternatives_9_2_1.eContents().get(5);
+		private final RuleCall cPropertyVariableProtectedParserRuleCall_9_2_1_5_0 = (RuleCall)cPropertyAssignment_9_2_1_5.eContents().get(0);
+		private final Group cGroup_9_3 = (Group)cAlternatives_9.eContents().get(3);
+		private final Keyword cPrivateKeyword_9_3_0 = (Keyword)cGroup_9_3.eContents().get(0);
+		private final Alternatives cAlternatives_9_3_1 = (Alternatives)cGroup_9_3.eContents().get(1);
+		private final Assignment cPortAssignment_9_3_1_0 = (Assignment)cAlternatives_9_3_1.eContents().get(0);
+		private final RuleCall cPortPortPrivateParserRuleCall_9_3_1_0_0 = (RuleCall)cPortAssignment_9_3_1_0.eContents().get(0);
+		private final Assignment cSignalAssignment_9_3_1_1 = (Assignment)cAlternatives_9_3_1.eContents().get(1);
+		private final RuleCall cSignalSignalPrivateParserRuleCall_9_3_1_1_0 = (RuleCall)cSignalAssignment_9_3_1_1.eContents().get(0);
+		private final Assignment cBufferAssignment_9_3_1_2 = (Assignment)cAlternatives_9_3_1.eContents().get(2);
+		private final RuleCall cBufferBufferPrivateParserRuleCall_9_3_1_2_0 = (RuleCall)cBufferAssignment_9_3_1_2.eContents().get(0);
+		private final Assignment cChannelAssignment_9_3_1_3 = (Assignment)cAlternatives_9_3_1.eContents().get(3);
+		private final RuleCall cChannelChannelPrivateParserRuleCall_9_3_1_3_0 = (RuleCall)cChannelAssignment_9_3_1_3.eContents().get(0);
+		private final Assignment cTypedefAssignment_9_3_1_4 = (Assignment)cAlternatives_9_3_1.eContents().get(4);
+		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_3_1_4_0 = (RuleCall)cTypedefAssignment_9_3_1_4.eContents().get(0);
+		private final Assignment cPropertyAssignment_9_3_1_5 = (Assignment)cAlternatives_9_3_1.eContents().get(5);
+		private final RuleCall cPropertyVariablePrivateParserRuleCall_9_3_1_5_0 = (RuleCall)cPropertyAssignment_9_3_1_5.eContents().get(0);
+		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
+		private final Alternatives cAlternatives_10_0 = (Alternatives)cAlternatives_10.eContents().get(0);
+		private final Group cGroup_10_0_0 = (Group)cAlternatives_10_0.eContents().get(0);
+		private final Alternatives cAlternatives_10_0_0_0 = (Alternatives)cGroup_10_0_0.eContents().get(0);
+		private final Keyword cRoutineKeyword_10_0_0_0_0 = (Keyword)cAlternatives_10_0_0_0.eContents().get(0);
+		private final Keyword cMacroKeyword_10_0_0_0_1 = (Keyword)cAlternatives_10_0_0_0.eContents().get(1);
+		private final Assignment cRoutineAssignment_10_0_0_1 = (Assignment)cGroup_10_0_0.eContents().get(1);
+		private final RuleCall cRoutineRoutineParserRuleCall_10_0_0_1_0 = (RuleCall)cRoutineAssignment_10_0_0_1.eContents().get(0);
+		private final Group cGroup_10_0_1 = (Group)cAlternatives_10_0.eContents().get(1);
+		private final Keyword cProcedureKeyword_10_0_1_0 = (Keyword)cGroup_10_0_1.eContents().get(0);
+		private final Assignment cProcedureAssignment_10_0_1_1 = (Assignment)cGroup_10_0_1.eContents().get(1);
+		private final RuleCall cProcedureProcedureParserRuleCall_10_0_1_1_0 = (RuleCall)cProcedureAssignment_10_0_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_10_1 = (Alternatives)cAlternatives_10.eContents().get(1);
+		private final Assignment cRoutineAssignment_10_1_0 = (Assignment)cAlternatives_10_1.eContents().get(0);
+		private final RuleCall cRoutineRoutineParserRuleCall_10_1_0_0 = (RuleCall)cRoutineAssignment_10_1_0.eContents().get(0);
+		private final Assignment cProcedureAssignment_10_1_1 = (Assignment)cAlternatives_10_1.eContents().get(1);
+		private final RuleCall cProcedureProcedureParserRuleCall_10_1_1_0 = (RuleCall)cProcedureAssignment_10_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_11 = (Alternatives)cGroup.eContents().get(11);
+		private final Assignment cRegionAssignment_11_0 = (Assignment)cAlternatives_11.eContents().get(0);
+		private final RuleCall cRegionStatemachineRegionParserRuleCall_11_0_0 = (RuleCall)cRegionAssignment_11_0.eContents().get(0);
+		private final Assignment cRegionAssignment_11_1 = (Assignment)cAlternatives_11.eContents().get(1);
+		private final RuleCall cRegionStatemachineRegionLiteParserRuleCall_11_1_0 = (RuleCall)cRegionAssignment_11_1.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_12 = (UnorderedGroup)cGroup.eContents().get(12);
+		private final Assignment cExecutionAssignment_12_0 = (Assignment)cUnorderedGroup_12.eContents().get(0);
+		private final RuleCall cExecutionModelOfExecutionParserRuleCall_12_0_0 = (RuleCall)cExecutionAssignment_12_0.eContents().get(0);
+		private final Assignment cInteractionAssignment_12_1 = (Assignment)cUnorderedGroup_12.eContents().get(1);
+		private final RuleCall cInteractionModelOfInteractionParserRuleCall_12_1_0 = (RuleCall)cInteractionAssignment_12_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_13 = (Keyword)cGroup.eContents().get(13);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Statemachine Behavior View Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Statemachine fmlStmchn::Statemachine:
+		//	{fmlStmchn::Statemachine} (visibility=VisibilityKind?
+		//	& (timed?='timed' | input_enabled?='input_enabled')?
+		//	& design=DesignKind?)
+		//	'statemachine' ('<' 'moc:'? ('or' | 'and') '>')?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	'{' ('@parameter:' ('input' (parameter+=ParameterInput
+		//	| '{' parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout
+		//	| '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput
+		//	| '{' parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn
+		//	| '{' parameter+=ParameterReturn+ '}'))*
+		//	| (port+=Port
+		//	| signal+=Signal
+		//	| buffer+=Buffer
+		//	| channel+=Channel
+		//	| typedef+=TypeDefinition
+		//	| property+=Variable)*) ('@input:' (parameter+=ParameterInput
+		//	| '{' parameter+=ParameterInput+ '}')*
+		//	| '@inout:' (parameter+=ParameterInout
+		//	| '{' parameter+=ParameterInout+ '}')*
+		//	| '@output:' (parameter+=ParameterOutput
+		//	| '{' parameter+=ParameterOutput+ '}')*
+		//	| '@return:' (parameter+=ParameterReturn
+		//	| '{' parameter+=ParameterReturn+ '}')*)* ('@property:' (port+=Port
+		//	| signal+=Signal
+		//	| buffer+=Buffer
+		//	| channel+=Channel
+		//	| typedef+=TypeDefinition
+		//	| property+=Variable)*
+		//	| '@public:' (port+=PortPublic
+		//	| signal+=SignalPublic
+		//	| buffer+=BufferPublic
+		//	| channel+=ChannelPublic
+		//	| typedef+=TypeDefinition
+		//	| property+=VariablePublic)*
+		//	| '@protected:' (port+=PortProtected
+		//	| signal+=SignalProtected
+		//	| buffer+=BufferProtected
+		//	| channel+=ChannelProtected
+		//	| typedef+=TypeDefinition
+		//	| property+=VariableProtected)*
+		//	| '@private:' (port+=PortPrivate
+		//	| signal+=SignalPrivate
+		//	| buffer+=BufferPrivate
+		//	| channel+=ChannelPrivate
+		//	| typedef+=TypeDefinition
+		//	| property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+
+		//	| '@procedure:' procedure+=Procedure+)*
+		//	| (routine+=Routine | procedure+=Procedure)+) (region+=StatemachineRegion+
+		//	| region+=StatemachineRegionLite) (execution=ModelOfExecution?
+		//	//		& ( computation=ModelOfComputation )?
+		//	& interaction=ModelOfInteraction?)
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::Statemachine} (visibility=VisibilityKind? & (timed?='timed' | input_enabled?='input_enabled')? &
+		//design=DesignKind?) 'statemachine' ('<' 'moc:'? ('or' | 'and') '>')? name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? '{' ('@parameter:' ('input' (parameter+=ParameterInput | '{'
+		//parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}') | 'output'
+		//(parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn | '{'
+		//parameter+=ParameterReturn+ '}'))* | (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel |
+		//typedef+=TypeDefinition | property+=Variable)*) ('@input:' (parameter+=ParameterInput | '{' parameter+=ParameterInput+
+		//'}')* | '@inout:' (parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')* | '@output:'
+		//(parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')* | '@return:' (parameter+=ParameterReturn | '{'
+		//parameter+=ParameterReturn+ '}')*)* ('@property:' (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel |
+		//typedef+=TypeDefinition | property+=Variable)* | '@public:' (port+=PortPublic | signal+=SignalPublic |
+		//buffer+=BufferPublic | channel+=ChannelPublic | typedef+=TypeDefinition | property+=VariablePublic)* | '@protected:'
+		//(port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected |
+		//typedef+=TypeDefinition | property+=VariableProtected)* | '@private:' (port+=PortPrivate | signal+=SignalPrivate |
+		//buffer+=BufferPrivate | channel+=ChannelPrivate | typedef+=TypeDefinition | property+=VariablePrivate)*)*
+		//((('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)* | (routine+=Routine |
+		//procedure+=Procedure)+) (region+=StatemachineRegion+ | region+=StatemachineRegionLite) (execution=ModelOfExecution? //		& ( computation=ModelOfComputation )?
+		//& interaction=ModelOfInteraction?) '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::Statemachine}
+		public Action getStatemachineAction_0() { return cStatemachineAction_0; }
+		
+		//(visibility=VisibilityKind? & (timed?='timed' | input_enabled?='input_enabled')? & design=DesignKind?)
+		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_1_0() { return cVisibilityAssignment_1_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0_0; }
+		
+		//(timed?='timed' | input_enabled?='input_enabled')?
+		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
+		
+		//timed?='timed'
+		public Assignment getTimedAssignment_1_1_0() { return cTimedAssignment_1_1_0; }
+		
+		//'timed'
+		public Keyword getTimedTimedKeyword_1_1_0_0() { return cTimedTimedKeyword_1_1_0_0; }
+		
+		//input_enabled?='input_enabled'
+		public Assignment getInput_enabledAssignment_1_1_1() { return cInput_enabledAssignment_1_1_1; }
+		
+		//'input_enabled'
+		public Keyword getInput_enabledInput_enabledKeyword_1_1_1_0() { return cInput_enabledInput_enabledKeyword_1_1_1_0; }
+		
+		//design=DesignKind?
+		public Assignment getDesignAssignment_1_2() { return cDesignAssignment_1_2; }
+		
+		//DesignKind
+		public RuleCall getDesignDesignKindEnumRuleCall_1_2_0() { return cDesignDesignKindEnumRuleCall_1_2_0; }
+		
+		//'statemachine'
+		public Keyword getStatemachineKeyword_2() { return cStatemachineKeyword_2; }
+		
+		//('<' 'moc:'? ('or' | 'and') '>')?
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_3_0() { return cLessThanSignKeyword_3_0; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_3_1() { return cMocKeyword_3_1; }
+		
+		//('or' | 'and')
+		public Alternatives getAlternatives_3_2() { return cAlternatives_3_2; }
+		
+		//'or'
+		public Keyword getOrKeyword_3_2_0() { return cOrKeyword_3_2_0; }
+		
+		//'and'
+		public Keyword getAndKeyword_3_2_1() { return cAndKeyword_3_2_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_3_3() { return cGreaterThanSignKeyword_3_3; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
+		
+		//('@parameter:' ('input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}') | 'inout'
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput | '{'
+		//parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}'))* |
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*)
+		public Alternatives getAlternatives_7() { return cAlternatives_7; }
+		
+		//'@parameter:' ('input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}') | 'inout'
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput | '{'
+		//parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}'))*
+		public Group getGroup_7_0() { return cGroup_7_0; }
+		
+		//'@parameter:'
+		public Keyword getParameterKeyword_7_0_0() { return cParameterKeyword_7_0_0; }
+		
+		//('input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout | '{'
+		//parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}') |
+		//'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}'))*
+		public Alternatives getAlternatives_7_0_1() { return cAlternatives_7_0_1; }
+		
+		//'input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')
+		public Group getGroup_7_0_1_0() { return cGroup_7_0_1_0; }
+		
+		//'input'
+		public Keyword getInputKeyword_7_0_1_0_0() { return cInputKeyword_7_0_1_0_0; }
+		
+		//(parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')
+		public Alternatives getAlternatives_7_0_1_0_1() { return cAlternatives_7_0_1_0_1; }
+		
+		//parameter+=ParameterInput
+		public Assignment getParameterAssignment_7_0_1_0_1_0() { return cParameterAssignment_7_0_1_0_1_0; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0() { return cParameterParameterInputParserRuleCall_7_0_1_0_1_0_0; }
+		
+		//'{' parameter+=ParameterInput+ '}'
+		public Group getGroup_7_0_1_0_1_1() { return cGroup_7_0_1_0_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_1_0_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_0_1_1_0; }
+		
+		//parameter+=ParameterInput+
+		public Assignment getParameterAssignment_7_0_1_0_1_1_1() { return cParameterAssignment_7_0_1_0_1_1_1; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0() { return cParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_1_0_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_0_1_1_2; }
+		
+		//'inout' (parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')
+		public Group getGroup_7_0_1_1() { return cGroup_7_0_1_1; }
+		
+		//'inout'
+		public Keyword getInoutKeyword_7_0_1_1_0() { return cInoutKeyword_7_0_1_1_0; }
+		
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')
+		public Alternatives getAlternatives_7_0_1_1_1() { return cAlternatives_7_0_1_1_1; }
+		
+		//parameter+=ParameterInout
+		public Assignment getParameterAssignment_7_0_1_1_1_0() { return cParameterAssignment_7_0_1_1_1_0; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0() { return cParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0; }
+		
+		//'{' parameter+=ParameterInout+ '}'
+		public Group getGroup_7_0_1_1_1_1() { return cGroup_7_0_1_1_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_1_1_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_1_1_1_0; }
+		
+		//parameter+=ParameterInout+
+		public Assignment getParameterAssignment_7_0_1_1_1_1_1() { return cParameterAssignment_7_0_1_1_1_1_1; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0() { return cParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_1_1_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_1_1_1_2; }
+		
+		//'output' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')
+		public Group getGroup_7_0_1_2() { return cGroup_7_0_1_2; }
+		
+		//'output'
+		public Keyword getOutputKeyword_7_0_1_2_0() { return cOutputKeyword_7_0_1_2_0; }
+		
+		//(parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')
+		public Alternatives getAlternatives_7_0_1_2_1() { return cAlternatives_7_0_1_2_1; }
+		
+		//parameter+=ParameterOutput
+		public Assignment getParameterAssignment_7_0_1_2_1_0() { return cParameterAssignment_7_0_1_2_1_0; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0() { return cParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0; }
+		
+		//'{' parameter+=ParameterOutput+ '}'
+		public Group getGroup_7_0_1_2_1_1() { return cGroup_7_0_1_2_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_1_2_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_2_1_1_0; }
+		
+		//parameter+=ParameterOutput+
+		public Assignment getParameterAssignment_7_0_1_2_1_1_1() { return cParameterAssignment_7_0_1_2_1_1_1; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0() { return cParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_1_2_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_2_1_1_2; }
+		
+		//'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')
+		public Group getGroup_7_0_1_3() { return cGroup_7_0_1_3; }
+		
+		//'return'
+		public Keyword getReturnKeyword_7_0_1_3_0() { return cReturnKeyword_7_0_1_3_0; }
+		
+		//(parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')
+		public Alternatives getAlternatives_7_0_1_3_1() { return cAlternatives_7_0_1_3_1; }
+		
+		//parameter+=ParameterReturn
+		public Assignment getParameterAssignment_7_0_1_3_1_0() { return cParameterAssignment_7_0_1_3_1_0; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0() { return cParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0; }
+		
+		//'{' parameter+=ParameterReturn+ '}'
+		public Group getGroup_7_0_1_3_1_1() { return cGroup_7_0_1_3_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_1_3_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_3_1_1_0; }
+		
+		//parameter+=ParameterReturn+
+		public Assignment getParameterAssignment_7_0_1_3_1_1_1() { return cParameterAssignment_7_0_1_3_1_1_1; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0() { return cParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_1_3_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_3_1_1_2; }
+		
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*
+		public Alternatives getAlternatives_7_1() { return cAlternatives_7_1; }
+		
+		//port+=Port
+		public Assignment getPortAssignment_7_1_0() { return cPortAssignment_7_1_0; }
+		
+		//Port
+		public RuleCall getPortPortParserRuleCall_7_1_0_0() { return cPortPortParserRuleCall_7_1_0_0; }
+		
+		//signal+=Signal
+		public Assignment getSignalAssignment_7_1_1() { return cSignalAssignment_7_1_1; }
+		
+		//Signal
+		public RuleCall getSignalSignalParserRuleCall_7_1_1_0() { return cSignalSignalParserRuleCall_7_1_1_0; }
+		
+		//buffer+=Buffer
+		public Assignment getBufferAssignment_7_1_2() { return cBufferAssignment_7_1_2; }
+		
+		//Buffer
+		public RuleCall getBufferBufferParserRuleCall_7_1_2_0() { return cBufferBufferParserRuleCall_7_1_2_0; }
+		
+		//channel+=Channel
+		public Assignment getChannelAssignment_7_1_3() { return cChannelAssignment_7_1_3; }
+		
+		//Channel
+		public RuleCall getChannelChannelParserRuleCall_7_1_3_0() { return cChannelChannelParserRuleCall_7_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_7_1_4() { return cTypedefAssignment_7_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_1_4_0; }
+		
+		//property+=Variable
+		public Assignment getPropertyAssignment_7_1_5() { return cPropertyAssignment_7_1_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_7_1_5_0() { return cPropertyVariableParserRuleCall_7_1_5_0; }
+		
+		//('@input:' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')* | '@inout:' (parameter+=ParameterInout |
+		//'{' parameter+=ParameterInout+ '}')* | '@output:' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')* |
+		//'@return:' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')*)*
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//'@input:' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')*
+		public Group getGroup_8_0() { return cGroup_8_0; }
+		
+		//'@input:'
+		public Keyword getInputKeyword_8_0_0() { return cInputKeyword_8_0_0; }
+		
+		//(parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')*
+		public Alternatives getAlternatives_8_0_1() { return cAlternatives_8_0_1; }
+		
+		//parameter+=ParameterInput
+		public Assignment getParameterAssignment_8_0_1_0() { return cParameterAssignment_8_0_1_0; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_8_0_1_0_0() { return cParameterParameterInputParserRuleCall_8_0_1_0_0; }
+		
+		//'{' parameter+=ParameterInput+ '}'
+		public Group getGroup_8_0_1_1() { return cGroup_8_0_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_0_1_1_0() { return cLeftCurlyBracketKeyword_8_0_1_1_0; }
+		
+		//parameter+=ParameterInput+
+		public Assignment getParameterAssignment_8_0_1_1_1() { return cParameterAssignment_8_0_1_1_1; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_8_0_1_1_1_0() { return cParameterParameterInputParserRuleCall_8_0_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_0_1_1_2() { return cRightCurlyBracketKeyword_8_0_1_1_2; }
+		
+		//'@inout:' (parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')*
+		public Group getGroup_8_1() { return cGroup_8_1; }
+		
+		//'@inout:'
+		public Keyword getInoutKeyword_8_1_0() { return cInoutKeyword_8_1_0; }
+		
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')*
+		public Alternatives getAlternatives_8_1_1() { return cAlternatives_8_1_1; }
+		
+		//parameter+=ParameterInout
+		public Assignment getParameterAssignment_8_1_1_0() { return cParameterAssignment_8_1_1_0; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_8_1_1_0_0() { return cParameterParameterInoutParserRuleCall_8_1_1_0_0; }
+		
+		//'{' parameter+=ParameterInout+ '}'
+		public Group getGroup_8_1_1_1() { return cGroup_8_1_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_1_1_1_0() { return cLeftCurlyBracketKeyword_8_1_1_1_0; }
+		
+		//parameter+=ParameterInout+
+		public Assignment getParameterAssignment_8_1_1_1_1() { return cParameterAssignment_8_1_1_1_1; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_8_1_1_1_1_0() { return cParameterParameterInoutParserRuleCall_8_1_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_1_1_1_2() { return cRightCurlyBracketKeyword_8_1_1_1_2; }
+		
+		//'@output:' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')*
+		public Group getGroup_8_2() { return cGroup_8_2; }
+		
+		//'@output:'
+		public Keyword getOutputKeyword_8_2_0() { return cOutputKeyword_8_2_0; }
+		
+		//(parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')*
+		public Alternatives getAlternatives_8_2_1() { return cAlternatives_8_2_1; }
+		
+		//parameter+=ParameterOutput
+		public Assignment getParameterAssignment_8_2_1_0() { return cParameterAssignment_8_2_1_0; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_8_2_1_0_0() { return cParameterParameterOutputParserRuleCall_8_2_1_0_0; }
+		
+		//'{' parameter+=ParameterOutput+ '}'
+		public Group getGroup_8_2_1_1() { return cGroup_8_2_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_2_1_1_0() { return cLeftCurlyBracketKeyword_8_2_1_1_0; }
+		
+		//parameter+=ParameterOutput+
+		public Assignment getParameterAssignment_8_2_1_1_1() { return cParameterAssignment_8_2_1_1_1; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_8_2_1_1_1_0() { return cParameterParameterOutputParserRuleCall_8_2_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_2_1_1_2() { return cRightCurlyBracketKeyword_8_2_1_1_2; }
+		
+		//'@return:' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')*
+		public Group getGroup_8_3() { return cGroup_8_3; }
+		
+		//'@return:'
+		public Keyword getReturnKeyword_8_3_0() { return cReturnKeyword_8_3_0; }
+		
+		//(parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')*
+		public Alternatives getAlternatives_8_3_1() { return cAlternatives_8_3_1; }
+		
+		//parameter+=ParameterReturn
+		public Assignment getParameterAssignment_8_3_1_0() { return cParameterAssignment_8_3_1_0; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_8_3_1_0_0() { return cParameterParameterReturnParserRuleCall_8_3_1_0_0; }
+		
+		//'{' parameter+=ParameterReturn+ '}'
+		public Group getGroup_8_3_1_1() { return cGroup_8_3_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_3_1_1_0() { return cLeftCurlyBracketKeyword_8_3_1_1_0; }
+		
+		//parameter+=ParameterReturn+
+		public Assignment getParameterAssignment_8_3_1_1_1() { return cParameterAssignment_8_3_1_1_1; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_8_3_1_1_1_0() { return cParameterParameterReturnParserRuleCall_8_3_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_3_1_1_2() { return cRightCurlyBracketKeyword_8_3_1_1_2; }
+		
+		//('@property:' (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition |
+		//property+=Variable)* | '@public:' (port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic |
+		//channel+=ChannelPublic | typedef+=TypeDefinition | property+=VariablePublic)* | '@protected:' (port+=PortProtected |
+		//signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected | typedef+=TypeDefinition |
+		//property+=VariableProtected)* | '@private:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate |
+		//channel+=ChannelPrivate | typedef+=TypeDefinition | property+=VariablePrivate)*)*
+		public Alternatives getAlternatives_9() { return cAlternatives_9; }
+		
+		//'@property:' (port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition |
+		//property+=Variable)*
+		public Group getGroup_9_0() { return cGroup_9_0; }
+		
+		//'@property:'
+		public Keyword getPropertyKeyword_9_0_0() { return cPropertyKeyword_9_0_0; }
+		
+		//(port+=Port | signal+=Signal | buffer+=Buffer | channel+=Channel | typedef+=TypeDefinition | property+=Variable)*
+		public Alternatives getAlternatives_9_0_1() { return cAlternatives_9_0_1; }
+		
+		//port+=Port
+		public Assignment getPortAssignment_9_0_1_0() { return cPortAssignment_9_0_1_0; }
+		
+		//Port
+		public RuleCall getPortPortParserRuleCall_9_0_1_0_0() { return cPortPortParserRuleCall_9_0_1_0_0; }
+		
+		//signal+=Signal
+		public Assignment getSignalAssignment_9_0_1_1() { return cSignalAssignment_9_0_1_1; }
+		
+		//Signal
+		public RuleCall getSignalSignalParserRuleCall_9_0_1_1_0() { return cSignalSignalParserRuleCall_9_0_1_1_0; }
+		
+		//buffer+=Buffer
+		public Assignment getBufferAssignment_9_0_1_2() { return cBufferAssignment_9_0_1_2; }
+		
+		//Buffer
+		public RuleCall getBufferBufferParserRuleCall_9_0_1_2_0() { return cBufferBufferParserRuleCall_9_0_1_2_0; }
+		
+		//channel+=Channel
+		public Assignment getChannelAssignment_9_0_1_3() { return cChannelAssignment_9_0_1_3; }
+		
+		//Channel
+		public RuleCall getChannelChannelParserRuleCall_9_0_1_3_0() { return cChannelChannelParserRuleCall_9_0_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_9_0_1_4() { return cTypedefAssignment_9_0_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_0_1_4_0; }
+		
+		//property+=Variable
+		public Assignment getPropertyAssignment_9_0_1_5() { return cPropertyAssignment_9_0_1_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_9_0_1_5_0() { return cPropertyVariableParserRuleCall_9_0_1_5_0; }
+		
+		//'@public:' (port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic |
+		//typedef+=TypeDefinition | property+=VariablePublic)*
+		public Group getGroup_9_1() { return cGroup_9_1; }
+		
+		//'@public:'
+		public Keyword getPublicKeyword_9_1_0() { return cPublicKeyword_9_1_0; }
+		
+		//(port+=PortPublic | signal+=SignalPublic | buffer+=BufferPublic | channel+=ChannelPublic | typedef+=TypeDefinition |
+		//property+=VariablePublic)*
+		public Alternatives getAlternatives_9_1_1() { return cAlternatives_9_1_1; }
+		
+		//port+=PortPublic
+		public Assignment getPortAssignment_9_1_1_0() { return cPortAssignment_9_1_1_0; }
+		
+		//PortPublic
+		public RuleCall getPortPortPublicParserRuleCall_9_1_1_0_0() { return cPortPortPublicParserRuleCall_9_1_1_0_0; }
+		
+		//signal+=SignalPublic
+		public Assignment getSignalAssignment_9_1_1_1() { return cSignalAssignment_9_1_1_1; }
+		
+		//SignalPublic
+		public RuleCall getSignalSignalPublicParserRuleCall_9_1_1_1_0() { return cSignalSignalPublicParserRuleCall_9_1_1_1_0; }
+		
+		//buffer+=BufferPublic
+		public Assignment getBufferAssignment_9_1_1_2() { return cBufferAssignment_9_1_1_2; }
+		
+		//BufferPublic
+		public RuleCall getBufferBufferPublicParserRuleCall_9_1_1_2_0() { return cBufferBufferPublicParserRuleCall_9_1_1_2_0; }
+		
+		//channel+=ChannelPublic
+		public Assignment getChannelAssignment_9_1_1_3() { return cChannelAssignment_9_1_1_3; }
+		
+		//ChannelPublic
+		public RuleCall getChannelChannelPublicParserRuleCall_9_1_1_3_0() { return cChannelChannelPublicParserRuleCall_9_1_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_9_1_1_4() { return cTypedefAssignment_9_1_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_1_1_4_0; }
+		
+		//property+=VariablePublic
+		public Assignment getPropertyAssignment_9_1_1_5() { return cPropertyAssignment_9_1_1_5; }
+		
+		//VariablePublic
+		public RuleCall getPropertyVariablePublicParserRuleCall_9_1_1_5_0() { return cPropertyVariablePublicParserRuleCall_9_1_1_5_0; }
+		
+		//'@protected:' (port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected |
+		//typedef+=TypeDefinition | property+=VariableProtected)*
+		public Group getGroup_9_2() { return cGroup_9_2; }
+		
+		//'@protected:'
+		public Keyword getProtectedKeyword_9_2_0() { return cProtectedKeyword_9_2_0; }
+		
+		//(port+=PortProtected | signal+=SignalProtected | buffer+=BufferProtected | channel+=ChannelProtected |
+		//typedef+=TypeDefinition | property+=VariableProtected)*
+		public Alternatives getAlternatives_9_2_1() { return cAlternatives_9_2_1; }
+		
+		//port+=PortProtected
+		public Assignment getPortAssignment_9_2_1_0() { return cPortAssignment_9_2_1_0; }
+		
+		//PortProtected
+		public RuleCall getPortPortProtectedParserRuleCall_9_2_1_0_0() { return cPortPortProtectedParserRuleCall_9_2_1_0_0; }
+		
+		//signal+=SignalProtected
+		public Assignment getSignalAssignment_9_2_1_1() { return cSignalAssignment_9_2_1_1; }
+		
+		//SignalProtected
+		public RuleCall getSignalSignalProtectedParserRuleCall_9_2_1_1_0() { return cSignalSignalProtectedParserRuleCall_9_2_1_1_0; }
+		
+		//buffer+=BufferProtected
+		public Assignment getBufferAssignment_9_2_1_2() { return cBufferAssignment_9_2_1_2; }
+		
+		//BufferProtected
+		public RuleCall getBufferBufferProtectedParserRuleCall_9_2_1_2_0() { return cBufferBufferProtectedParserRuleCall_9_2_1_2_0; }
+		
+		//channel+=ChannelProtected
+		public Assignment getChannelAssignment_9_2_1_3() { return cChannelAssignment_9_2_1_3; }
+		
+		//ChannelProtected
+		public RuleCall getChannelChannelProtectedParserRuleCall_9_2_1_3_0() { return cChannelChannelProtectedParserRuleCall_9_2_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_9_2_1_4() { return cTypedefAssignment_9_2_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_2_1_4_0; }
+		
+		//property+=VariableProtected
+		public Assignment getPropertyAssignment_9_2_1_5() { return cPropertyAssignment_9_2_1_5; }
+		
+		//VariableProtected
+		public RuleCall getPropertyVariableProtectedParserRuleCall_9_2_1_5_0() { return cPropertyVariableProtectedParserRuleCall_9_2_1_5_0; }
+		
+		//'@private:' (port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate |
+		//typedef+=TypeDefinition | property+=VariablePrivate)*
+		public Group getGroup_9_3() { return cGroup_9_3; }
+		
+		//'@private:'
+		public Keyword getPrivateKeyword_9_3_0() { return cPrivateKeyword_9_3_0; }
+		
+		//(port+=PortPrivate | signal+=SignalPrivate | buffer+=BufferPrivate | channel+=ChannelPrivate | typedef+=TypeDefinition |
+		//property+=VariablePrivate)*
+		public Alternatives getAlternatives_9_3_1() { return cAlternatives_9_3_1; }
+		
+		//port+=PortPrivate
+		public Assignment getPortAssignment_9_3_1_0() { return cPortAssignment_9_3_1_0; }
+		
+		//PortPrivate
+		public RuleCall getPortPortPrivateParserRuleCall_9_3_1_0_0() { return cPortPortPrivateParserRuleCall_9_3_1_0_0; }
+		
+		//signal+=SignalPrivate
+		public Assignment getSignalAssignment_9_3_1_1() { return cSignalAssignment_9_3_1_1; }
+		
+		//SignalPrivate
+		public RuleCall getSignalSignalPrivateParserRuleCall_9_3_1_1_0() { return cSignalSignalPrivateParserRuleCall_9_3_1_1_0; }
+		
+		//buffer+=BufferPrivate
+		public Assignment getBufferAssignment_9_3_1_2() { return cBufferAssignment_9_3_1_2; }
+		
+		//BufferPrivate
+		public RuleCall getBufferBufferPrivateParserRuleCall_9_3_1_2_0() { return cBufferBufferPrivateParserRuleCall_9_3_1_2_0; }
+		
+		//channel+=ChannelPrivate
+		public Assignment getChannelAssignment_9_3_1_3() { return cChannelAssignment_9_3_1_3; }
+		
+		//ChannelPrivate
+		public RuleCall getChannelChannelPrivateParserRuleCall_9_3_1_3_0() { return cChannelChannelPrivateParserRuleCall_9_3_1_3_0; }
+		
+		//typedef+=TypeDefinition
+		public Assignment getTypedefAssignment_9_3_1_4() { return cTypedefAssignment_9_3_1_4; }
+		
+		//TypeDefinition
+		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_3_1_4_0; }
+		
+		//property+=VariablePrivate
+		public Assignment getPropertyAssignment_9_3_1_5() { return cPropertyAssignment_9_3_1_5; }
+		
+		//VariablePrivate
+		public RuleCall getPropertyVariablePrivateParserRuleCall_9_3_1_5_0() { return cPropertyVariablePrivateParserRuleCall_9_3_1_5_0; }
+		
+		//((('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)* | (routine+=Routine |
+		//procedure+=Procedure)+)
+		public Alternatives getAlternatives_10() { return cAlternatives_10; }
+		
+		//(('@routine:' | '@macro:') routine+=Routine+ | '@procedure:' procedure+=Procedure+)*
+		public Alternatives getAlternatives_10_0() { return cAlternatives_10_0; }
+		
+		//('@routine:' | '@macro:') routine+=Routine+
+		public Group getGroup_10_0_0() { return cGroup_10_0_0; }
+		
+		//('@routine:' | '@macro:')
+		public Alternatives getAlternatives_10_0_0_0() { return cAlternatives_10_0_0_0; }
+		
+		//'@routine:'
+		public Keyword getRoutineKeyword_10_0_0_0_0() { return cRoutineKeyword_10_0_0_0_0; }
+		
+		//'@macro:'
+		public Keyword getMacroKeyword_10_0_0_0_1() { return cMacroKeyword_10_0_0_0_1; }
+		
+		//routine+=Routine+
+		public Assignment getRoutineAssignment_10_0_0_1() { return cRoutineAssignment_10_0_0_1; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_10_0_0_1_0() { return cRoutineRoutineParserRuleCall_10_0_0_1_0; }
+		
+		//'@procedure:' procedure+=Procedure+
+		public Group getGroup_10_0_1() { return cGroup_10_0_1; }
+		
+		//'@procedure:'
+		public Keyword getProcedureKeyword_10_0_1_0() { return cProcedureKeyword_10_0_1_0; }
+		
+		//procedure+=Procedure+
+		public Assignment getProcedureAssignment_10_0_1_1() { return cProcedureAssignment_10_0_1_1; }
+		
+		//Procedure
+		public RuleCall getProcedureProcedureParserRuleCall_10_0_1_1_0() { return cProcedureProcedureParserRuleCall_10_0_1_1_0; }
+		
+		//(routine+=Routine | procedure+=Procedure)+
+		public Alternatives getAlternatives_10_1() { return cAlternatives_10_1; }
+		
+		//routine+=Routine
+		public Assignment getRoutineAssignment_10_1_0() { return cRoutineAssignment_10_1_0; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_10_1_0_0() { return cRoutineRoutineParserRuleCall_10_1_0_0; }
+		
+		//procedure+=Procedure
+		public Assignment getProcedureAssignment_10_1_1() { return cProcedureAssignment_10_1_1; }
+		
+		//Procedure
+		public RuleCall getProcedureProcedureParserRuleCall_10_1_1_0() { return cProcedureProcedureParserRuleCall_10_1_1_0; }
+		
+		//(region+=StatemachineRegion+ | region+=StatemachineRegionLite)
+		public Alternatives getAlternatives_11() { return cAlternatives_11; }
+		
+		//region+=StatemachineRegion+
+		public Assignment getRegionAssignment_11_0() { return cRegionAssignment_11_0; }
+		
+		//StatemachineRegion
+		public RuleCall getRegionStatemachineRegionParserRuleCall_11_0_0() { return cRegionStatemachineRegionParserRuleCall_11_0_0; }
+		
+		//region+=StatemachineRegionLite
+		public Assignment getRegionAssignment_11_1() { return cRegionAssignment_11_1; }
+		
+		//StatemachineRegionLite
+		public RuleCall getRegionStatemachineRegionLiteParserRuleCall_11_1_0() { return cRegionStatemachineRegionLiteParserRuleCall_11_1_0; }
+		
+		//(execution=ModelOfExecution? //		& ( computation=ModelOfComputation )?
+		//& interaction=ModelOfInteraction?)
+		public UnorderedGroup getUnorderedGroup_12() { return cUnorderedGroup_12; }
+		
+		//execution=ModelOfExecution?
+		public Assignment getExecutionAssignment_12_0() { return cExecutionAssignment_12_0; }
+		
+		//ModelOfExecution
+		public RuleCall getExecutionModelOfExecutionParserRuleCall_12_0_0() { return cExecutionModelOfExecutionParserRuleCall_12_0_0; }
+		
+		//interaction=ModelOfInteraction?
+		public Assignment getInteractionAssignment_12_1() { return cInteractionAssignment_12_1; }
+		
+		//ModelOfInteraction
+		public RuleCall getInteractionModelOfInteractionParserRuleCall_12_1_0() { return cInteractionModelOfInteractionParserRuleCall_12_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_13() { return cRightCurlyBracketKeyword_13; }
+	}
+	public class StatemachineRegionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cRegionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_1_0 = (Alternatives)cAlternatives_1.eContents().get(0);
+		private final Keyword cRegionKeyword_1_0_0 = (Keyword)cAlternatives_1_0.eContents().get(0);
+		private final Keyword cStatemachineKeyword_1_0_1 = (Keyword)cAlternatives_1_0.eContents().get(1);
+		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+		private final Alternatives cAlternatives_1_1_0 = (Alternatives)cGroup_1_1.eContents().get(0);
+		private final Keyword cRegionKeyword_1_1_0_0 = (Keyword)cAlternatives_1_1_0.eContents().get(0);
+		private final Keyword cStatemachineKeyword_1_1_0_1 = (Keyword)cAlternatives_1_1_0.eContents().get(1);
+		private final Assignment cNameAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_1_1_0 = (RuleCall)cNameAssignment_1_1_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_1_1_2_0 = (RuleCall)cUnrestrictedNameAssignment_1_1_2.eContents().get(0);
+		private final Keyword cGreaterThanSignColonKeyword_1_1_3 = (Keyword)cGroup_1_1.eContents().get(3);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Assignment cVertexAssignment_2_0 = (Assignment)cAlternatives_2.eContents().get(0);
+		private final RuleCall cVertexStateParserRuleCall_2_0_0 = (RuleCall)cVertexAssignment_2_0.eContents().get(0);
+		private final Assignment cVertexAssignment_2_1 = (Assignment)cAlternatives_2.eContents().get(1);
+		private final RuleCall cVertexPseudostateParserRuleCall_2_1_0 = (RuleCall)cVertexAssignment_2_1.eContents().get(0);
+		
+		//StatemachineRegion fmlStmchn::Region:
+		//	{fmlStmchn::Region} (('@region:' | '@statemachine:') | ('@region<' | '@statemachine<') name=ESIdentifier
+		//	unrestrictedName=UnrestrictedName? '>:') (vertex+=State
+		//	| vertex+=Pseudostate)+
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::Region} (('@region:' | '@statemachine:') | ('@region<' | '@statemachine<') name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? '>:') (vertex+=State | vertex+=Pseudostate)+
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::Region}
+		public Action getRegionAction_0() { return cRegionAction_0; }
+		
+		//(('@region:' | '@statemachine:') | ('@region<' | '@statemachine<') name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//'>:')
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//('@region:' | '@statemachine:')
+		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
+		
+		//'@region:'
+		public Keyword getRegionKeyword_1_0_0() { return cRegionKeyword_1_0_0; }
+		
+		//'@statemachine:'
+		public Keyword getStatemachineKeyword_1_0_1() { return cStatemachineKeyword_1_0_1; }
+		
+		//('@region<' | '@statemachine<') name=ESIdentifier unrestrictedName=UnrestrictedName? '>:'
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//('@region<' | '@statemachine<')
+		public Alternatives getAlternatives_1_1_0() { return cAlternatives_1_1_0; }
+		
+		//'@region<'
+		public Keyword getRegionKeyword_1_1_0_0() { return cRegionKeyword_1_1_0_0; }
+		
+		//'@statemachine<'
+		public Keyword getStatemachineKeyword_1_1_0_1() { return cStatemachineKeyword_1_1_0_1; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1_1_1() { return cNameAssignment_1_1_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_1_1_0() { return cNameESIdentifierParserRuleCall_1_1_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_1_1_2() { return cUnrestrictedNameAssignment_1_1_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_1_1_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_1_1_2_0; }
+		
+		//'>:'
+		public Keyword getGreaterThanSignColonKeyword_1_1_3() { return cGreaterThanSignColonKeyword_1_1_3; }
+		
+		//(vertex+=State | vertex+=Pseudostate)+
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//vertex+=State
+		public Assignment getVertexAssignment_2_0() { return cVertexAssignment_2_0; }
+		
+		//State
+		public RuleCall getVertexStateParserRuleCall_2_0_0() { return cVertexStateParserRuleCall_2_0_0; }
+		
+		//vertex+=Pseudostate
+		public Assignment getVertexAssignment_2_1() { return cVertexAssignment_2_1; }
+		
+		//Pseudostate
+		public RuleCall getVertexPseudostateParserRuleCall_2_1_0() { return cVertexPseudostateParserRuleCall_2_1_0; }
+	}
+	public class StatemachineRegionLiteElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Assignment cVertexAssignment_0 = (Assignment)cAlternatives.eContents().get(0);
+		private final RuleCall cVertexStateParserRuleCall_0_0 = (RuleCall)cVertexAssignment_0.eContents().get(0);
+		private final Assignment cVertexAssignment_1 = (Assignment)cAlternatives.eContents().get(1);
+		private final RuleCall cVertexPseudostateParserRuleCall_1_0 = (RuleCall)cVertexAssignment_1.eContents().get(0);
+		
+		//StatemachineRegionLite fmlStmchn::Region:
+		//	(vertex+=State | vertex+=Pseudostate)+
+		@Override public ParserRule getRule() { return rule; }
+		
+		//(vertex+=State | vertex+=Pseudostate)+
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//vertex+=State
+		public Assignment getVertexAssignment_0() { return cVertexAssignment_0; }
+		
+		//State
+		public RuleCall getVertexStateParserRuleCall_0_0() { return cVertexStateParserRuleCall_0_0; }
+		
+		//vertex+=Pseudostate
+		public Assignment getVertexAssignment_1() { return cVertexAssignment_1; }
+		
+		//Pseudostate
+		public RuleCall getVertexPseudostateParserRuleCall_1_0() { return cVertexPseudostateParserRuleCall_1_0; }
+	}
+	public class StateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.State");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cCompositeStateParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStartStateParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cSimpleStateParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cFinalStateParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// State Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//State fmlStmchn::State:
+		//	CompositeState
+		//	| StartState
+		//	| SimpleState
+		//	| FinalState
+		@Override public ParserRule getRule() { return rule; }
+		
+		//CompositeState | StartState | SimpleState | FinalState
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//CompositeState
+		public RuleCall getCompositeStateParserRuleCall_0() { return cCompositeStateParserRuleCall_0; }
+		
+		//StartState
+		public RuleCall getStartStateParserRuleCall_1() { return cStartStateParserRuleCall_1; }
+		
+		//SimpleState
+		public RuleCall getSimpleStateParserRuleCall_2() { return cSimpleStateParserRuleCall_2; }
+		
+		//FinalState
+		public RuleCall getFinalStateParserRuleCall_3() { return cFinalStateParserRuleCall_3; }
+	}
+	public class CompositeStateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CompositeState");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStateAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cCompositeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cCompositeStateKeyword_1_0 = (Keyword)cCompositeAssignment_1.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Keyword cMocKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
+		private final Keyword cOrKeyword_4_0 = (Keyword)cAlternatives_4.eContents().get(0);
+		private final Assignment cOrthogonalAssignment_4_1 = (Assignment)cAlternatives_4.eContents().get(1);
+		private final Keyword cOrthogonalAndKeyword_4_1_0 = (Keyword)cOrthogonalAssignment_4_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cNameAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cNameESIdentifierParserRuleCall_6_0 = (RuleCall)cNameAssignment_6.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0 = (RuleCall)cUnrestrictedNameAssignment_7.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
+		private final Alternatives cAlternatives_8_0_1 = (Alternatives)cGroup_8_0.eContents().get(1);
+		private final Alternatives cAlternatives_8_0_1_0 = (Alternatives)cAlternatives_8_0_1.eContents().get(0);
+		private final Assignment cRegionAssignment_8_0_1_0_0 = (Assignment)cAlternatives_8_0_1_0.eContents().get(0);
+		private final RuleCall cRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0 = (RuleCall)cRegionAssignment_8_0_1_0_0.eContents().get(0);
+		private final Group cGroup_8_0_1_0_1 = (Group)cAlternatives_8_0_1_0.eContents().get(1);
+		private final Keyword cMoeKeyword_8_0_1_0_1_0 = (Keyword)cGroup_8_0_1_0_1.eContents().get(0);
+		private final Assignment cMoeAssignment_8_0_1_0_1_1 = (Assignment)cGroup_8_0_1_0_1.eContents().get(1);
+		private final RuleCall cMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0 = (RuleCall)cMoeAssignment_8_0_1_0_1_1.eContents().get(0);
+		private final Group cGroup_8_0_1_0_2 = (Group)cAlternatives_8_0_1_0.eContents().get(2);
+		private final Keyword cTransitionKeyword_8_0_1_0_2_0 = (Keyword)cGroup_8_0_1_0_2.eContents().get(0);
+		private final Assignment cTransitionAssignment_8_0_1_0_2_1 = (Assignment)cGroup_8_0_1_0_2.eContents().get(1);
+		private final RuleCall cTransitionTransitionParserRuleCall_8_0_1_0_2_1_0 = (RuleCall)cTransitionAssignment_8_0_1_0_2_1.eContents().get(0);
+		private final Group cGroup_8_0_1_1 = (Group)cAlternatives_8_0_1.eContents().get(1);
+		private final Assignment cRegionAssignment_8_0_1_1_0 = (Assignment)cGroup_8_0_1_1.eContents().get(0);
+		private final RuleCall cRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0 = (RuleCall)cRegionAssignment_8_0_1_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_8_0_1_1_1 = (Alternatives)cGroup_8_0_1_1.eContents().get(1);
+		private final Assignment cTransitionAssignment_8_0_1_1_1_0 = (Assignment)cAlternatives_8_0_1_1_1.eContents().get(0);
+		private final RuleCall cTransitionTransitionParserRuleCall_8_0_1_1_1_0_0 = (RuleCall)cTransitionAssignment_8_0_1_1_1_0.eContents().get(0);
+		private final Assignment cMoeAssignment_8_0_1_1_1_1 = (Assignment)cAlternatives_8_0_1_1_1.eContents().get(1);
+		private final RuleCall cMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_1_0 = (RuleCall)cMoeAssignment_8_0_1_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_0_2 = (Keyword)cGroup_8_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_8_1 = (Keyword)cAlternatives_8.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// CompositeState Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//CompositeState fmlStmchn::State:
+		//	{fmlStmchn::State} composite?='state' '<' 'moc:'? ('or' | orthogonal?='and') '>'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('{' ((region+=StatemachineRegion
+		//	| '@moe:' moe+=moeCompositeStateRoutines*
+		//	| '@transition:' transition+=Transition*)+
+		//	| region+=StatemachineRegionLite (transition+=Transition
+		//	| moe+=moeCompositeStateRoutines)*)
+		//	'}'
+		//	| ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::State} composite?='state' '<' 'moc:'? ('or' | orthogonal?='and') '>' name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ('{' ((region+=StatemachineRegion | '@moe:' moe+=moeCompositeStateRoutines* |
+		//'@transition:' transition+=Transition*)+ | region+=StatemachineRegionLite (transition+=Transition |
+		//moe+=moeCompositeStateRoutines)*) '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::State}
+		public Action getStateAction_0() { return cStateAction_0; }
+		
+		//composite?='state'
+		public Assignment getCompositeAssignment_1() { return cCompositeAssignment_1; }
+		
+		//'state'
+		public Keyword getCompositeStateKeyword_1_0() { return cCompositeStateKeyword_1_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_3() { return cMocKeyword_3; }
+		
+		//('or' | orthogonal?='and')
+		public Alternatives getAlternatives_4() { return cAlternatives_4; }
+		
+		//'or'
+		public Keyword getOrKeyword_4_0() { return cOrKeyword_4_0; }
+		
+		//orthogonal?='and'
+		public Assignment getOrthogonalAssignment_4_1() { return cOrthogonalAssignment_4_1; }
+		
+		//'and'
+		public Keyword getOrthogonalAndKeyword_4_1_0() { return cOrthogonalAndKeyword_4_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_5() { return cGreaterThanSignKeyword_5; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_6() { return cNameAssignment_6; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_6_0() { return cNameESIdentifierParserRuleCall_6_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_7() { return cUnrestrictedNameAssignment_7; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0; }
+		
+		//('{' ((region+=StatemachineRegion | '@moe:' moe+=moeCompositeStateRoutines* | '@transition:' transition+=Transition*)+ |
+		//region+=StatemachineRegionLite (transition+=Transition | moe+=moeCompositeStateRoutines)*) '}' | ';')
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//'{' ((region+=StatemachineRegion | '@moe:' moe+=moeCompositeStateRoutines* | '@transition:' transition+=Transition*)+ |
+		//region+=StatemachineRegionLite (transition+=Transition | moe+=moeCompositeStateRoutines)*) '}'
+		public Group getGroup_8_0() { return cGroup_8_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_0_0() { return cLeftCurlyBracketKeyword_8_0_0; }
+		
+		//((region+=StatemachineRegion | '@moe:' moe+=moeCompositeStateRoutines* | '@transition:' transition+=Transition*)+ |
+		//region+=StatemachineRegionLite (transition+=Transition | moe+=moeCompositeStateRoutines)*)
+		public Alternatives getAlternatives_8_0_1() { return cAlternatives_8_0_1; }
+		
+		//(region+=StatemachineRegion | '@moe:' moe+=moeCompositeStateRoutines* | '@transition:' transition+=Transition*)+
+		public Alternatives getAlternatives_8_0_1_0() { return cAlternatives_8_0_1_0; }
+		
+		//region+=StatemachineRegion
+		public Assignment getRegionAssignment_8_0_1_0_0() { return cRegionAssignment_8_0_1_0_0; }
+		
+		//StatemachineRegion
+		public RuleCall getRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0() { return cRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0; }
+		
+		//'@moe:' moe+=moeCompositeStateRoutines*
+		public Group getGroup_8_0_1_0_1() { return cGroup_8_0_1_0_1; }
+		
+		//'@moe:'
+		public Keyword getMoeKeyword_8_0_1_0_1_0() { return cMoeKeyword_8_0_1_0_1_0; }
+		
+		//moe+=moeCompositeStateRoutines*
+		public Assignment getMoeAssignment_8_0_1_0_1_1() { return cMoeAssignment_8_0_1_0_1_1; }
+		
+		//moeCompositeStateRoutines
+		public RuleCall getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0() { return cMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0; }
+		
+		//'@transition:' transition+=Transition*
+		public Group getGroup_8_0_1_0_2() { return cGroup_8_0_1_0_2; }
+		
+		//'@transition:'
+		public Keyword getTransitionKeyword_8_0_1_0_2_0() { return cTransitionKeyword_8_0_1_0_2_0; }
+		
+		//transition+=Transition*
+		public Assignment getTransitionAssignment_8_0_1_0_2_1() { return cTransitionAssignment_8_0_1_0_2_1; }
+		
+		//Transition
+		public RuleCall getTransitionTransitionParserRuleCall_8_0_1_0_2_1_0() { return cTransitionTransitionParserRuleCall_8_0_1_0_2_1_0; }
+		
+		//region+=StatemachineRegionLite (transition+=Transition | moe+=moeCompositeStateRoutines)*
+		public Group getGroup_8_0_1_1() { return cGroup_8_0_1_1; }
+		
+		//region+=StatemachineRegionLite
+		public Assignment getRegionAssignment_8_0_1_1_0() { return cRegionAssignment_8_0_1_1_0; }
+		
+		//StatemachineRegionLite
+		public RuleCall getRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0() { return cRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0; }
+		
+		//(transition+=Transition | moe+=moeCompositeStateRoutines)*
+		public Alternatives getAlternatives_8_0_1_1_1() { return cAlternatives_8_0_1_1_1; }
+		
+		//transition+=Transition
+		public Assignment getTransitionAssignment_8_0_1_1_1_0() { return cTransitionAssignment_8_0_1_1_1_0; }
+		
+		//Transition
+		public RuleCall getTransitionTransitionParserRuleCall_8_0_1_1_1_0_0() { return cTransitionTransitionParserRuleCall_8_0_1_1_1_0_0; }
+		
+		//moe+=moeCompositeStateRoutines
+		public Assignment getMoeAssignment_8_0_1_1_1_1() { return cMoeAssignment_8_0_1_1_1_1; }
+		
+		//moeCompositeStateRoutines
+		public RuleCall getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_1_0() { return cMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_0_2() { return cRightCurlyBracketKeyword_8_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_8_1() { return cSemicolonKeyword_8_1; }
+	}
+	public class MoeCompositeStateRoutinesElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeCompositeStateRoutines");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cRoutineAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Alternatives cNameAlternatives_1_0 = (Alternatives)cNameAssignment_1.eContents().get(0);
+		private final Keyword cNameInitKeyword_1_0_0 = (Keyword)cNameAlternatives_1_0.eContents().get(0);
+		private final Keyword cNameFinalKeyword_1_0_1 = (Keyword)cNameAlternatives_1_0.eContents().get(1);
+		private final Keyword cNameEnableKeyword_1_0_2 = (Keyword)cNameAlternatives_1_0.eContents().get(2);
+		private final Keyword cNameDisableKeyword_1_0_3 = (Keyword)cNameAlternatives_1_0.eContents().get(3);
+		private final Keyword cNameConcurrencyKeyword_1_0_4 = (Keyword)cNameAlternatives_1_0.eContents().get(4);
+		private final Keyword cNameScheduleKeyword_1_0_5 = (Keyword)cNameAlternatives_1_0.eContents().get(5);
+		private final Keyword cNameIrunKeyword_1_0_6 = (Keyword)cNameAlternatives_1_0.eContents().get(6);
+		private final Keyword cNameRunKeyword_1_0_7 = (Keyword)cNameAlternatives_1_0.eContents().get(7);
+		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
+		
+		//moeCompositeStateRoutines fmlInfra::Routine:
+		//	{fmlInfra::Routine} name=('@init' | '@final' | '@enable' | '@disable'
+		//	| '@concurrency' | '@schedule' | '@irun' | '@run') bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Routine} name=('@init' | '@final' | '@enable' | '@disable' | '@concurrency' | '@schedule' | '@irun' | '@run')
+		//bodyBlock=BlockStatement
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Routine}
+		public Action getRoutineAction_0() { return cRoutineAction_0; }
+		
+		//name=('@init' | '@final' | '@enable' | '@disable' | '@concurrency' | '@schedule' | '@irun' | '@run')
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//('@init' | '@final' | '@enable' | '@disable' | '@concurrency' | '@schedule' | '@irun' | '@run')
+		public Alternatives getNameAlternatives_1_0() { return cNameAlternatives_1_0; }
+		
+		//'@init'
+		public Keyword getNameInitKeyword_1_0_0() { return cNameInitKeyword_1_0_0; }
+		
+		//'@final'
+		public Keyword getNameFinalKeyword_1_0_1() { return cNameFinalKeyword_1_0_1; }
+		
+		//'@enable'
+		public Keyword getNameEnableKeyword_1_0_2() { return cNameEnableKeyword_1_0_2; }
+		
+		//'@disable'
+		public Keyword getNameDisableKeyword_1_0_3() { return cNameDisableKeyword_1_0_3; }
+		
+		//'@concurrency'
+		public Keyword getNameConcurrencyKeyword_1_0_4() { return cNameConcurrencyKeyword_1_0_4; }
+		
+		//'@schedule'
+		public Keyword getNameScheduleKeyword_1_0_5() { return cNameScheduleKeyword_1_0_5; }
+		
+		//'@irun'
+		public Keyword getNameIrunKeyword_1_0_6() { return cNameIrunKeyword_1_0_6; }
+		
+		//'@run'
+		public Keyword getNameRunKeyword_1_0_7() { return cNameRunKeyword_1_0_7; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
+	}
+	public class SimpleStateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SimpleState");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStateAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSimpleAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cSimpleStateKeyword_1_0 = (Keyword)cSimpleAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Keyword cMocKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Keyword cSimpleKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
+		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Alternatives cAlternatives_5 = (Alternatives)cGroup.eContents().get(5);
+		private final Group cGroup_5_0 = (Group)cAlternatives_5.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_5_0_0 = (Keyword)cGroup_5_0.eContents().get(0);
+		private final Alternatives cAlternatives_5_0_1 = (Alternatives)cGroup_5_0.eContents().get(1);
+		private final Assignment cTransitionAssignment_5_0_1_0 = (Assignment)cAlternatives_5_0_1.eContents().get(0);
+		private final RuleCall cTransitionTransitionParserRuleCall_5_0_1_0_0 = (RuleCall)cTransitionAssignment_5_0_1_0.eContents().get(0);
+		private final Assignment cMoeAssignment_5_0_1_1 = (Assignment)cAlternatives_5_0_1.eContents().get(1);
+		private final RuleCall cMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0 = (RuleCall)cMoeAssignment_5_0_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_5_0_2 = (Keyword)cGroup_5_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_5_1 = (Keyword)cAlternatives_5.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// SimpleState Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//SimpleState fmlStmchn::State:
+		//	{fmlStmchn::State} simple?='state' ('<' 'moc:'? 'simple' '>')?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('{' (transition+=Transition
+		//	| moe+=moeSimpleStateRoutines)*
+		//	'}'
+		//	| ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::State} simple?='state' ('<' 'moc:'? 'simple' '>')? name=ESIdentifier unrestrictedName=UnrestrictedName? ('{'
+		//(transition+=Transition | moe+=moeSimpleStateRoutines)* '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::State}
+		public Action getStateAction_0() { return cStateAction_0; }
+		
+		//simple?='state'
+		public Assignment getSimpleAssignment_1() { return cSimpleAssignment_1; }
+		
+		//'state'
+		public Keyword getSimpleStateKeyword_1_0() { return cSimpleStateKeyword_1_0; }
+		
+		//('<' 'moc:'? 'simple' '>')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_2_1() { return cMocKeyword_2_1; }
+		
+		//'simple'
+		public Keyword getSimpleKeyword_2_2() { return cSimpleKeyword_2_2; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//('{' (transition+=Transition | moe+=moeSimpleStateRoutines)* '}' | ';')
+		public Alternatives getAlternatives_5() { return cAlternatives_5; }
+		
+		//'{' (transition+=Transition | moe+=moeSimpleStateRoutines)* '}'
+		public Group getGroup_5_0() { return cGroup_5_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_5_0_0() { return cLeftCurlyBracketKeyword_5_0_0; }
+		
+		//(transition+=Transition | moe+=moeSimpleStateRoutines)*
+		public Alternatives getAlternatives_5_0_1() { return cAlternatives_5_0_1; }
+		
+		//transition+=Transition
+		public Assignment getTransitionAssignment_5_0_1_0() { return cTransitionAssignment_5_0_1_0; }
+		
+		//Transition
+		public RuleCall getTransitionTransitionParserRuleCall_5_0_1_0_0() { return cTransitionTransitionParserRuleCall_5_0_1_0_0; }
+		
+		//moe+=moeSimpleStateRoutines
+		public Assignment getMoeAssignment_5_0_1_1() { return cMoeAssignment_5_0_1_1; }
+		
+		//moeSimpleStateRoutines
+		public RuleCall getMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0() { return cMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_5_0_2() { return cRightCurlyBracketKeyword_5_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5_1() { return cSemicolonKeyword_5_1; }
+	}
+	public class MoeSimpleStateRoutinesElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeSimpleStateRoutines");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cRoutineAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Alternatives cNameAlternatives_1_0 = (Alternatives)cNameAssignment_1.eContents().get(0);
+		private final Keyword cNameEnableKeyword_1_0_0 = (Keyword)cNameAlternatives_1_0.eContents().get(0);
+		private final Keyword cNameDisableKeyword_1_0_1 = (Keyword)cNameAlternatives_1_0.eContents().get(1);
+		private final Keyword cNameIrunKeyword_1_0_2 = (Keyword)cNameAlternatives_1_0.eContents().get(2);
+		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
+		
+		//moeSimpleStateRoutines fmlInfra::Routine:
+		//	{fmlInfra::Routine} name=('@enable' | '@disable' | '@irun' / *| '@run'* /) bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Routine} name=('@enable' | '@disable' | '@irun' / *| '@run'* /) bodyBlock=BlockStatement
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Routine}
+		public Action getRoutineAction_0() { return cRoutineAction_0; }
+		
+		//name=('@enable' | '@disable' | '@irun' / *| '@run'* /)
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//('@enable' | '@disable' | '@irun' / *| '@run'* /)
+		public Alternatives getNameAlternatives_1_0() { return cNameAlternatives_1_0; }
+		
+		//'@enable'
+		public Keyword getNameEnableKeyword_1_0_0() { return cNameEnableKeyword_1_0_0; }
+		
+		//'@disable'
+		public Keyword getNameDisableKeyword_1_0_1() { return cNameDisableKeyword_1_0_1; }
+		
+		//'@irun'
+		public Keyword getNameIrunKeyword_1_0_2() { return cNameIrunKeyword_1_0_2; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
+	}
+	public class StartStateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StartState");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStartStateAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+		private final Assignment cSimpleAssignment_1_0_0 = (Assignment)cGroup_1_0.eContents().get(0);
+		private final Keyword cSimpleStateKeyword_1_0_0_0 = (Keyword)cSimpleAssignment_1_0_0.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_1_0_1 = (Keyword)cGroup_1_0.eContents().get(1);
+		private final Keyword cMocKeyword_1_0_2 = (Keyword)cGroup_1_0.eContents().get(2);
+		private final Keyword cStartKeyword_1_0_3 = (Keyword)cGroup_1_0.eContents().get(3);
+		private final Keyword cGreaterThanSignKeyword_1_0_4 = (Keyword)cGroup_1_0.eContents().get(4);
+		private final Assignment cNameAssignment_1_0_5 = (Assignment)cGroup_1_0.eContents().get(5);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0_5_0 = (RuleCall)cNameAssignment_1_0_5.eContents().get(0);
+		private final Assignment cSimpleAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
+		private final Keyword cSimpleStartKeyword_1_1_0 = (Keyword)cSimpleAssignment_1_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Alternatives cAlternatives_3_0_1 = (Alternatives)cGroup_3_0.eContents().get(1);
+		private final Assignment cTransitionAssignment_3_0_1_0 = (Assignment)cAlternatives_3_0_1.eContents().get(0);
+		private final RuleCall cTransitionTransitionParserRuleCall_3_0_1_0_0 = (RuleCall)cTransitionAssignment_3_0_1_0.eContents().get(0);
+		private final Assignment cMoeAssignment_3_0_1_1 = (Assignment)cAlternatives_3_0_1.eContents().get(1);
+		private final RuleCall cMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0 = (RuleCall)cMoeAssignment_3_0_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_3_1 = (Keyword)cAlternatives_3.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// StartState Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//StartState fmlStmchn::StartState:
+		//	{fmlStmchn::StartState} (simple?='state' '<' 'moc:'? 'start' '>' name=ESIdentifier
+		//	| simple?='#start') unrestrictedName=UnrestrictedName? ('{' (transition+=Transition
+		//	| moe+=moeStartStateRoutines)*
+		//	'}'
+		//	| ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::StartState} (simple?='state' '<' 'moc:'? 'start' '>' name=ESIdentifier | simple?='#start')
+		//unrestrictedName=UnrestrictedName? ('{' (transition+=Transition | moe+=moeStartStateRoutines)* '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::StartState}
+		public Action getStartStateAction_0() { return cStartStateAction_0; }
+		
+		//(simple?='state' '<' 'moc:'? 'start' '>' name=ESIdentifier | simple?='#start')
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//simple?='state' '<' 'moc:'? 'start' '>' name=ESIdentifier
+		public Group getGroup_1_0() { return cGroup_1_0; }
+		
+		//simple?='state'
+		public Assignment getSimpleAssignment_1_0_0() { return cSimpleAssignment_1_0_0; }
+		
+		//'state'
+		public Keyword getSimpleStateKeyword_1_0_0_0() { return cSimpleStateKeyword_1_0_0_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1_0_1() { return cLessThanSignKeyword_1_0_1; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_1_0_2() { return cMocKeyword_1_0_2; }
+		
+		//'start'
+		public Keyword getStartKeyword_1_0_3() { return cStartKeyword_1_0_3; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_1_0_4() { return cGreaterThanSignKeyword_1_0_4; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1_0_5() { return cNameAssignment_1_0_5; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0_5_0() { return cNameESIdentifierParserRuleCall_1_0_5_0; }
+		
+		//simple?='#start'
+		public Assignment getSimpleAssignment_1_1() { return cSimpleAssignment_1_1; }
+		
+		//'#start'
+		public Keyword getSimpleStartKeyword_1_1_0() { return cSimpleStartKeyword_1_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//('{' (transition+=Transition | moe+=moeStartStateRoutines)* '}' | ';')
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//'{' (transition+=Transition | moe+=moeStartStateRoutines)* '}'
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_3_0_0() { return cLeftCurlyBracketKeyword_3_0_0; }
+		
+		//(transition+=Transition | moe+=moeStartStateRoutines)*
+		public Alternatives getAlternatives_3_0_1() { return cAlternatives_3_0_1; }
+		
+		//transition+=Transition
+		public Assignment getTransitionAssignment_3_0_1_0() { return cTransitionAssignment_3_0_1_0; }
+		
+		//Transition
+		public RuleCall getTransitionTransitionParserRuleCall_3_0_1_0_0() { return cTransitionTransitionParserRuleCall_3_0_1_0_0; }
+		
+		//moe+=moeStartStateRoutines
+		public Assignment getMoeAssignment_3_0_1_1() { return cMoeAssignment_3_0_1_1; }
+		
+		//moeStartStateRoutines
+		public RuleCall getMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0() { return cMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_3_0_2() { return cRightCurlyBracketKeyword_3_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_3_1() { return cSemicolonKeyword_3_1; }
+	}
+	public class MoeStartStateRoutinesElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeStartStateRoutines");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cRoutineAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Alternatives cNameAlternatives_1_0 = (Alternatives)cNameAssignment_1.eContents().get(0);
+		private final Keyword cNameInitKeyword_1_0_0 = (Keyword)cNameAlternatives_1_0.eContents().get(0);
+		private final Keyword cNameEnableKeyword_1_0_1 = (Keyword)cNameAlternatives_1_0.eContents().get(1);
+		private final Keyword cNameDisableKeyword_1_0_2 = (Keyword)cNameAlternatives_1_0.eContents().get(2);
+		private final Keyword cNameIrunKeyword_1_0_3 = (Keyword)cNameAlternatives_1_0.eContents().get(3);
+		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
+		
+		//moeStartStateRoutines fmlInfra::Routine:
+		//	{fmlInfra::Routine} name=('@init' | '@enable' | '@disable' | '@irun' / *| '@run'* /) bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Routine} name=('@init' | '@enable' | '@disable' | '@irun' / *| '@run'* /) bodyBlock=BlockStatement
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Routine}
+		public Action getRoutineAction_0() { return cRoutineAction_0; }
+		
+		//name=('@init' | '@enable' | '@disable' | '@irun' / *| '@run'* /)
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//('@init' | '@enable' | '@disable' | '@irun' / *| '@run'* /)
+		public Alternatives getNameAlternatives_1_0() { return cNameAlternatives_1_0; }
+		
+		//'@init'
+		public Keyword getNameInitKeyword_1_0_0() { return cNameInitKeyword_1_0_0; }
+		
+		//'@enable'
+		public Keyword getNameEnableKeyword_1_0_1() { return cNameEnableKeyword_1_0_1; }
+		
+		//'@disable'
+		public Keyword getNameDisableKeyword_1_0_2() { return cNameDisableKeyword_1_0_2; }
+		
+		//'@irun'
+		public Keyword getNameIrunKeyword_1_0_3() { return cNameIrunKeyword_1_0_3; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
+	}
+	public class FinalStateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FinalState");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cFinalStateAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+		private final Assignment cSimpleAssignment_1_0_0 = (Assignment)cGroup_1_0.eContents().get(0);
+		private final Keyword cSimpleStateKeyword_1_0_0_0 = (Keyword)cSimpleAssignment_1_0_0.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_1_0_1 = (Keyword)cGroup_1_0.eContents().get(1);
+		private final Keyword cMocKeyword_1_0_2 = (Keyword)cGroup_1_0.eContents().get(2);
+		private final Keyword cFinalKeyword_1_0_3 = (Keyword)cGroup_1_0.eContents().get(3);
+		private final Keyword cGreaterThanSignKeyword_1_0_4 = (Keyword)cGroup_1_0.eContents().get(4);
+		private final Assignment cNameAssignment_1_0_5 = (Assignment)cGroup_1_0.eContents().get(5);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0_5_0 = (RuleCall)cNameAssignment_1_0_5.eContents().get(0);
+		private final Assignment cSimpleAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
+		private final Keyword cSimpleFinalKeyword_1_1_0 = (Keyword)cSimpleAssignment_1_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cMoeAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_0 = (RuleCall)cMoeAssignment_3_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_3_1 = (Keyword)cAlternatives_3.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// FinalState Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//FinalState fmlStmchn::FinalState:
+		//	{fmlStmchn::FinalState} (simple?='state' '<' 'moc:'? 'final' '>' name=ESIdentifier
+		//	| simple?='#final') unrestrictedName=UnrestrictedName? ('{'
+		//	moe+=moeFinalStateRoutines*
+		//	'}'
+		//	| ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::FinalState} (simple?='state' '<' 'moc:'? 'final' '>' name=ESIdentifier | simple?='#final')
+		//unrestrictedName=UnrestrictedName? ('{' moe+=moeFinalStateRoutines* '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::FinalState}
+		public Action getFinalStateAction_0() { return cFinalStateAction_0; }
+		
+		//(simple?='state' '<' 'moc:'? 'final' '>' name=ESIdentifier | simple?='#final')
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//simple?='state' '<' 'moc:'? 'final' '>' name=ESIdentifier
+		public Group getGroup_1_0() { return cGroup_1_0; }
+		
+		//simple?='state'
+		public Assignment getSimpleAssignment_1_0_0() { return cSimpleAssignment_1_0_0; }
+		
+		//'state'
+		public Keyword getSimpleStateKeyword_1_0_0_0() { return cSimpleStateKeyword_1_0_0_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1_0_1() { return cLessThanSignKeyword_1_0_1; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_1_0_2() { return cMocKeyword_1_0_2; }
+		
+		//'final'
+		public Keyword getFinalKeyword_1_0_3() { return cFinalKeyword_1_0_3; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_1_0_4() { return cGreaterThanSignKeyword_1_0_4; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1_0_5() { return cNameAssignment_1_0_5; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0_5_0() { return cNameESIdentifierParserRuleCall_1_0_5_0; }
+		
+		//simple?='#final'
+		public Assignment getSimpleAssignment_1_1() { return cSimpleAssignment_1_1; }
+		
+		//'#final'
+		public Keyword getSimpleFinalKeyword_1_1_0() { return cSimpleFinalKeyword_1_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//('{' moe+=moeFinalStateRoutines* '}' | ';')
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//'{' moe+=moeFinalStateRoutines* '}'
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_3_0_0() { return cLeftCurlyBracketKeyword_3_0_0; }
+		
+		//moe+=moeFinalStateRoutines*
+		public Assignment getMoeAssignment_3_0_1() { return cMoeAssignment_3_0_1; }
+		
+		//moeFinalStateRoutines
+		public RuleCall getMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_0() { return cMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_3_0_2() { return cRightCurlyBracketKeyword_3_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_3_1() { return cSemicolonKeyword_3_1; }
+	}
+	public class MoeFinalStateRoutinesElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeFinalStateRoutines");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cRoutineAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Alternatives cNameAlternatives_1_0 = (Alternatives)cNameAssignment_1.eContents().get(0);
+		private final Keyword cNameEnableKeyword_1_0_0 = (Keyword)cNameAlternatives_1_0.eContents().get(0);
+		private final Keyword cNameFinalKeyword_1_0_1 = (Keyword)cNameAlternatives_1_0.eContents().get(1);
+		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
+		
+		//moeFinalStateRoutines fmlInfra::Routine:
+		//	{fmlInfra::Routine} name=('@enable' | '@final' / *| '@run'* /) bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Routine} name=('@enable' | '@final' / *| '@run'* /) bodyBlock=BlockStatement
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Routine}
+		public Action getRoutineAction_0() { return cRoutineAction_0; }
+		
+		//name=('@enable' | '@final' / *| '@run'* /)
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//('@enable' | '@final' / *| '@run'* /)
+		public Alternatives getNameAlternatives_1_0() { return cNameAlternatives_1_0; }
+		
+		//'@enable'
+		public Keyword getNameEnableKeyword_1_0_0() { return cNameEnableKeyword_1_0_0; }
+		
+		//'@final'
+		public Keyword getNameFinalKeyword_1_0_1() { return cNameFinalKeyword_1_0_1; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
+	}
+	public class PseudostateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Pseudostate");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cPseudostateInitialParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cEndingPseudostateParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cOtherPseudostateParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Pseudostate Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Pseudostate fmlStmchn::Pseudostate:
+		//	PseudostateInitial
+		//	| EndingPseudostate
+		//	| OtherPseudostate
+		@Override public ParserRule getRule() { return rule; }
+		
+		//PseudostateInitial | EndingPseudostate | OtherPseudostate
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//PseudostateInitial
+		public RuleCall getPseudostateInitialParserRuleCall_0() { return cPseudostateInitialParserRuleCall_0; }
+		
+		//EndingPseudostate
+		public RuleCall getEndingPseudostateParserRuleCall_1() { return cEndingPseudostateParserRuleCall_1; }
+		
+		//OtherPseudostate
+		public RuleCall getOtherPseudostateParserRuleCall_2() { return cOtherPseudostateParserRuleCall_2; }
+	}
+	public class OtherPseudostateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OtherPseudostate");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPseudostateAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Keyword cStateKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
+		private final Keyword cPseudostateKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Keyword cMocKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cKindAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cKindPseudostateKindEnumRuleCall_4_0 = (RuleCall)cKindAssignment_4.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cNameAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cNameESIdentifierParserRuleCall_6_0 = (RuleCall)cNameAssignment_6.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0 = (RuleCall)cUnrestrictedNameAssignment_7.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
+		private final Assignment cTransitionAssignment_8_0_1 = (Assignment)cGroup_8_0.eContents().get(1);
+		private final RuleCall cTransitionTransitionParserRuleCall_8_0_1_0 = (RuleCall)cTransitionAssignment_8_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_0_2 = (Keyword)cGroup_8_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_8_1 = (Keyword)cAlternatives_8.eContents().get(1);
+		
+		//OtherPseudostate fmlStmchn::Pseudostate:
+		//	{fmlStmchn::Pseudostate} ('state' | 'pseudostate') '<' 'moc:'? kind=PseudostateKind '>'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('{' transition+=Transition* '}'
+		//	| ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::Pseudostate} ('state' | 'pseudostate') '<' 'moc:'? kind=PseudostateKind '>' name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ('{' transition+=Transition* '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::Pseudostate}
+		public Action getPseudostateAction_0() { return cPseudostateAction_0; }
+		
+		//('state' | 'pseudostate')
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//'state'
+		public Keyword getStateKeyword_1_0() { return cStateKeyword_1_0; }
+		
+		//'pseudostate'
+		public Keyword getPseudostateKeyword_1_1() { return cPseudostateKeyword_1_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_3() { return cMocKeyword_3; }
+		
+		//kind=PseudostateKind
+		public Assignment getKindAssignment_4() { return cKindAssignment_4; }
+		
+		//PseudostateKind
+		public RuleCall getKindPseudostateKindEnumRuleCall_4_0() { return cKindPseudostateKindEnumRuleCall_4_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_5() { return cGreaterThanSignKeyword_5; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_6() { return cNameAssignment_6; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_6_0() { return cNameESIdentifierParserRuleCall_6_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_7() { return cUnrestrictedNameAssignment_7; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0; }
+		
+		//('{' transition+=Transition* '}' | ';')
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//'{' transition+=Transition* '}'
+		public Group getGroup_8_0() { return cGroup_8_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_0_0() { return cLeftCurlyBracketKeyword_8_0_0; }
+		
+		//transition+=Transition*
+		public Assignment getTransitionAssignment_8_0_1() { return cTransitionAssignment_8_0_1; }
+		
+		//Transition
+		public RuleCall getTransitionTransitionParserRuleCall_8_0_1_0() { return cTransitionTransitionParserRuleCall_8_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_0_2() { return cRightCurlyBracketKeyword_8_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_8_1() { return cSemicolonKeyword_8_1; }
+	}
+	public class PseudostateInitialElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PseudostateInitial");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPseudostateAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_0_0 = (Alternatives)cGroup_1_0.eContents().get(0);
+		private final Keyword cStateKeyword_1_0_0_0 = (Keyword)cAlternatives_1_0_0.eContents().get(0);
+		private final Keyword cPseudostateKeyword_1_0_0_1 = (Keyword)cAlternatives_1_0_0.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_1_0_1 = (Keyword)cGroup_1_0.eContents().get(1);
+		private final Keyword cMocKeyword_1_0_2 = (Keyword)cGroup_1_0.eContents().get(2);
+		private final Assignment cKindAssignment_1_0_3 = (Assignment)cGroup_1_0.eContents().get(3);
+		private final RuleCall cKindPseudostateInitialKindEnumRuleCall_1_0_3_0 = (RuleCall)cKindAssignment_1_0_3.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_1_0_4 = (Keyword)cGroup_1_0.eContents().get(4);
+		private final Assignment cNameAssignment_1_0_5 = (Assignment)cGroup_1_0.eContents().get(5);
+		private final Alternatives cNameAlternatives_1_0_5_0 = (Alternatives)cNameAssignment_1_0_5.eContents().get(0);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0_5_0_0 = (RuleCall)cNameAlternatives_1_0_5_0.eContents().get(0);
+		private final Keyword cNameInitialKeyword_1_0_5_0_1 = (Keyword)cNameAlternatives_1_0_5_0.eContents().get(1);
+		private final Keyword cNameInitKeyword_1_0_5_0_2 = (Keyword)cNameAlternatives_1_0_5_0.eContents().get(2);
+		private final Assignment cNameAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
+		private final Alternatives cNameAlternatives_1_1_0 = (Alternatives)cNameAssignment_1_1.eContents().get(0);
+		private final Keyword cNameInitialKeyword_1_1_0_0 = (Keyword)cNameAlternatives_1_1_0.eContents().get(0);
+		private final Keyword cNameInitKeyword_1_1_0_1 = (Keyword)cNameAlternatives_1_1_0.eContents().get(1);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cTransitionAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cTransitionTransitionParserRuleCall_3_0_1_0 = (RuleCall)cTransitionAssignment_3_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_3_1 = (Keyword)cAlternatives_3.eContents().get(1);
+		
+		//PseudostateInitial fmlStmchn::Pseudostate:
+		//	{fmlStmchn::Pseudostate} (('state' | 'pseudostate')
+		//	'<' 'moc:'? kind=PseudostateInitialKind '>'
+		//	name=(ESIdentifier | '#initial' | '#init') | name=('#initial' | '#init')) unrestrictedName=UnrestrictedName? ('{'
+		//	transition+=Transition* '}' | ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::Pseudostate} (('state' | 'pseudostate') '<' 'moc:'? kind=PseudostateInitialKind '>' name=(ESIdentifier |
+		//'#initial' | '#init') | name=('#initial' | '#init')) unrestrictedName=UnrestrictedName? ('{' transition+=Transition*
+		//'}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::Pseudostate}
+		public Action getPseudostateAction_0() { return cPseudostateAction_0; }
+		
+		//(('state' | 'pseudostate') '<' 'moc:'? kind=PseudostateInitialKind '>' name=(ESIdentifier | '#initial' | '#init') |
+		//name=('#initial' | '#init'))
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//('state' | 'pseudostate') '<' 'moc:'? kind=PseudostateInitialKind '>' name=(ESIdentifier | '#initial' | '#init')
+		public Group getGroup_1_0() { return cGroup_1_0; }
+		
+		//('state' | 'pseudostate')
+		public Alternatives getAlternatives_1_0_0() { return cAlternatives_1_0_0; }
+		
+		//'state'
+		public Keyword getStateKeyword_1_0_0_0() { return cStateKeyword_1_0_0_0; }
+		
+		//'pseudostate'
+		public Keyword getPseudostateKeyword_1_0_0_1() { return cPseudostateKeyword_1_0_0_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1_0_1() { return cLessThanSignKeyword_1_0_1; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_1_0_2() { return cMocKeyword_1_0_2; }
+		
+		//kind=PseudostateInitialKind
+		public Assignment getKindAssignment_1_0_3() { return cKindAssignment_1_0_3; }
+		
+		//PseudostateInitialKind
+		public RuleCall getKindPseudostateInitialKindEnumRuleCall_1_0_3_0() { return cKindPseudostateInitialKindEnumRuleCall_1_0_3_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_1_0_4() { return cGreaterThanSignKeyword_1_0_4; }
+		
+		//name=(ESIdentifier | '#initial' | '#init')
+		public Assignment getNameAssignment_1_0_5() { return cNameAssignment_1_0_5; }
+		
+		//(ESIdentifier | '#initial' | '#init')
+		public Alternatives getNameAlternatives_1_0_5_0() { return cNameAlternatives_1_0_5_0; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0_5_0_0() { return cNameESIdentifierParserRuleCall_1_0_5_0_0; }
+		
+		//'#initial'
+		public Keyword getNameInitialKeyword_1_0_5_0_1() { return cNameInitialKeyword_1_0_5_0_1; }
+		
+		//'#init'
+		public Keyword getNameInitKeyword_1_0_5_0_2() { return cNameInitKeyword_1_0_5_0_2; }
+		
+		//name=('#initial' | '#init')
+		public Assignment getNameAssignment_1_1() { return cNameAssignment_1_1; }
+		
+		//('#initial' | '#init')
+		public Alternatives getNameAlternatives_1_1_0() { return cNameAlternatives_1_1_0; }
+		
+		//'#initial'
+		public Keyword getNameInitialKeyword_1_1_0_0() { return cNameInitialKeyword_1_1_0_0; }
+		
+		//'#init'
+		public Keyword getNameInitKeyword_1_1_0_1() { return cNameInitKeyword_1_1_0_1; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//('{' transition+=Transition* '}' | ';')
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//'{' transition+=Transition* '}'
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_3_0_0() { return cLeftCurlyBracketKeyword_3_0_0; }
+		
+		//transition+=Transition*
+		public Assignment getTransitionAssignment_3_0_1() { return cTransitionAssignment_3_0_1; }
+		
+		//Transition
+		public RuleCall getTransitionTransitionParserRuleCall_3_0_1_0() { return cTransitionTransitionParserRuleCall_3_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_3_0_2() { return cRightCurlyBracketKeyword_3_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_3_1() { return cSemicolonKeyword_3_1; }
+	}
+	public class EndingPseudostateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EndingPseudostate");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPseudostateAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Keyword cStateKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
+		private final Keyword cPseudostateKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Keyword cMocKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cKindAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cKindEndingPseudostateKindEnumRuleCall_4_0 = (RuleCall)cKindAssignment_4.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cNameAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cNameESIdentifierParserRuleCall_6_0 = (RuleCall)cNameAssignment_6.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0 = (RuleCall)cUnrestrictedNameAssignment_7.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
+		private final Assignment cMoeAssignment_8_0_1 = (Assignment)cGroup_8_0.eContents().get(1);
+		private final RuleCall cMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_0 = (RuleCall)cMoeAssignment_8_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_0_2 = (Keyword)cGroup_8_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_8_1 = (Keyword)cAlternatives_8.eContents().get(1);
+		
+		//EndingPseudostate fmlStmchn::Pseudostate:
+		//	{fmlStmchn::Pseudostate} ('state' | 'pseudostate') '<' 'moc:'? kind=EndingPseudostateKind '>'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('{'
+		//	moe+=moeFinalStateRoutines*
+		//	'}'
+		//	| ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::Pseudostate} ('state' | 'pseudostate') '<' 'moc:'? kind=EndingPseudostateKind '>' name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ('{' moe+=moeFinalStateRoutines* '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::Pseudostate}
+		public Action getPseudostateAction_0() { return cPseudostateAction_0; }
+		
+		//('state' | 'pseudostate')
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//'state'
+		public Keyword getStateKeyword_1_0() { return cStateKeyword_1_0; }
+		
+		//'pseudostate'
+		public Keyword getPseudostateKeyword_1_1() { return cPseudostateKeyword_1_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_3() { return cMocKeyword_3; }
+		
+		//kind=EndingPseudostateKind
+		public Assignment getKindAssignment_4() { return cKindAssignment_4; }
+		
+		//EndingPseudostateKind
+		public RuleCall getKindEndingPseudostateKindEnumRuleCall_4_0() { return cKindEndingPseudostateKindEnumRuleCall_4_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_5() { return cGreaterThanSignKeyword_5; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_6() { return cNameAssignment_6; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_6_0() { return cNameESIdentifierParserRuleCall_6_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_7() { return cUnrestrictedNameAssignment_7; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0; }
+		
+		//('{' moe+=moeFinalStateRoutines* '}' | ';')
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//'{' moe+=moeFinalStateRoutines* '}'
+		public Group getGroup_8_0() { return cGroup_8_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_0_0() { return cLeftCurlyBracketKeyword_8_0_0; }
+		
+		//moe+=moeFinalStateRoutines*
+		public Assignment getMoeAssignment_8_0_1() { return cMoeAssignment_8_0_1; }
+		
+		//moeFinalStateRoutines
+		public RuleCall getMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_0() { return cMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_0_2() { return cRightCurlyBracketKeyword_8_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_8_1() { return cSemicolonKeyword_8_1; }
+	}
+	public class ModelOfComputationElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ModelOfComputation");
+		private final Action cModelOfComputationAction = (Action)rule.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Section Model Of Computation Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//ModelOfComputation fmlInfra::ModelOfComputation:
+		//	{fmlInfra::ModelOfComputation}
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::ModelOfComputation}
+		public Action getModelOfComputationAction() { return cModelOfComputationAction; }
+	}
+	public class ModelOfExecutionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ModelOfExecution");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cModelOfExecutionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cMoeKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cRoutineAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cRoutineRoutineParserRuleCall_2_0 = (RuleCall)cRoutineAssignment_2.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
+		private final Keyword cInitKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cInitRoutineAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cInitRoutineMoeRoutineParserRuleCall_3_0_1_0 = (RuleCall)cInitRoutineAssignment_3_0_1.eContents().get(0);
+		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
+		private final Keyword cFinalKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Assignment cFinalRoutineAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
+		private final RuleCall cFinalRoutineMoeRoutineParserRuleCall_3_1_1_0 = (RuleCall)cFinalRoutineAssignment_3_1_1.eContents().get(0);
+		private final Group cGroup_3_2 = (Group)cUnorderedGroup_3.eContents().get(2);
+		private final Keyword cEnableKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
+		private final Assignment cEnableRoutineAssignment_3_2_1 = (Assignment)cGroup_3_2.eContents().get(1);
+		private final RuleCall cEnableRoutineMoeRoutineParserRuleCall_3_2_1_0 = (RuleCall)cEnableRoutineAssignment_3_2_1.eContents().get(0);
+		private final Group cGroup_3_3 = (Group)cUnorderedGroup_3.eContents().get(3);
+		private final Keyword cDisableKeyword_3_3_0 = (Keyword)cGroup_3_3.eContents().get(0);
+		private final Assignment cDisableRoutineAssignment_3_3_1 = (Assignment)cGroup_3_3.eContents().get(1);
+		private final RuleCall cDisableRoutineMoeRoutineParserRuleCall_3_3_1_0 = (RuleCall)cDisableRoutineAssignment_3_3_1.eContents().get(0);
+		private final Group cGroup_3_4 = (Group)cUnorderedGroup_3.eContents().get(4);
+		private final Keyword cConcurrencyKeyword_3_4_0 = (Keyword)cGroup_3_4.eContents().get(0);
+		private final Assignment cConcurrencyRoutineAssignment_3_4_1 = (Assignment)cGroup_3_4.eContents().get(1);
+		private final RuleCall cConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0 = (RuleCall)cConcurrencyRoutineAssignment_3_4_1.eContents().get(0);
+		private final Group cGroup_3_5 = (Group)cUnorderedGroup_3.eContents().get(5);
+		private final Keyword cScheduleKeyword_3_5_0 = (Keyword)cGroup_3_5.eContents().get(0);
+		private final Assignment cScheduleRoutineAssignment_3_5_1 = (Assignment)cGroup_3_5.eContents().get(1);
+		private final RuleCall cScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0 = (RuleCall)cScheduleRoutineAssignment_3_5_1.eContents().get(0);
+		private final Group cGroup_3_6 = (Group)cUnorderedGroup_3.eContents().get(6);
+		private final Keyword cIrunKeyword_3_6_0 = (Keyword)cGroup_3_6.eContents().get(0);
+		private final Assignment cIrunRoutineAssignment_3_6_1 = (Assignment)cGroup_3_6.eContents().get(1);
+		private final RuleCall cIrunRoutineMoeRoutineParserRuleCall_3_6_1_0 = (RuleCall)cIrunRoutineAssignment_3_6_1.eContents().get(0);
+		private final Group cGroup_3_7 = (Group)cUnorderedGroup_3.eContents().get(7);
+		private final Keyword cRunKeyword_3_7_0 = (Keyword)cGroup_3_7.eContents().get(0);
+		private final Assignment cRunRoutineAssignment_3_7_1 = (Assignment)cGroup_3_7.eContents().get(1);
+		private final RuleCall cRunRoutineMoeRoutineParserRuleCall_3_7_1_0 = (RuleCall)cRunRoutineAssignment_3_7_1.eContents().get(0);
+		private final Assignment cRoutineAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cRoutineRoutineParserRuleCall_4_0 = (RuleCall)cRoutineAssignment_4.eContents().get(0);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Section Model Of Execution Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//ModelOfExecution fmlInfra::ModelOfExecution:
+		//	{fmlInfra::ModelOfExecution}
+		//	'@moe:'
+		//	routine+=Routine* (('@init' initRoutine=moeRoutine)?
+		//	& ('@final' finalRoutine=moeRoutine)?
+		//	& ('@enable' enableRoutine=moeRoutine)?
+		//	& ('@disable' disableRoutine=moeRoutine)?
+		//	& ('@concurrency' concurrencyRoutine=moeRoutine)?
+		//	& ('@schedule' scheduleRoutine=moeRoutine)?
+		//	& ('@irun' irunRoutine=moeRoutine)?
+		//	& ('@run' runRoutine=moeRoutine)?) routine+=Routine*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::ModelOfExecution} '@moe:' routine+=Routine* (('@init' initRoutine=moeRoutine)? & ('@final'
+		//finalRoutine=moeRoutine)? & ('@enable' enableRoutine=moeRoutine)? & ('@disable' disableRoutine=moeRoutine)? &
+		//('@concurrency' concurrencyRoutine=moeRoutine)? & ('@schedule' scheduleRoutine=moeRoutine)? & ('@irun'
+		//irunRoutine=moeRoutine)? & ('@run' runRoutine=moeRoutine)?) routine+=Routine*
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::ModelOfExecution}
+		public Action getModelOfExecutionAction_0() { return cModelOfExecutionAction_0; }
+		
+		//'@moe:'
+		public Keyword getMoeKeyword_1() { return cMoeKeyword_1; }
+		
+		//routine+=Routine*
+		public Assignment getRoutineAssignment_2() { return cRoutineAssignment_2; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_2_0() { return cRoutineRoutineParserRuleCall_2_0; }
+		
+		//(('@init' initRoutine=moeRoutine)? & ('@final' finalRoutine=moeRoutine)? & ('@enable' enableRoutine=moeRoutine)? &
+		//('@disable' disableRoutine=moeRoutine)? & ('@concurrency' concurrencyRoutine=moeRoutine)? & ('@schedule'
+		//scheduleRoutine=moeRoutine)? & ('@irun' irunRoutine=moeRoutine)? & ('@run' runRoutine=moeRoutine)?)
+		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
+		
+		//('@init' initRoutine=moeRoutine)?
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//'@init'
+		public Keyword getInitKeyword_3_0_0() { return cInitKeyword_3_0_0; }
+		
+		//initRoutine=moeRoutine
+		public Assignment getInitRoutineAssignment_3_0_1() { return cInitRoutineAssignment_3_0_1; }
+		
+		//moeRoutine
+		public RuleCall getInitRoutineMoeRoutineParserRuleCall_3_0_1_0() { return cInitRoutineMoeRoutineParserRuleCall_3_0_1_0; }
+		
+		//('@final' finalRoutine=moeRoutine)?
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//'@final'
+		public Keyword getFinalKeyword_3_1_0() { return cFinalKeyword_3_1_0; }
+		
+		//finalRoutine=moeRoutine
+		public Assignment getFinalRoutineAssignment_3_1_1() { return cFinalRoutineAssignment_3_1_1; }
+		
+		//moeRoutine
+		public RuleCall getFinalRoutineMoeRoutineParserRuleCall_3_1_1_0() { return cFinalRoutineMoeRoutineParserRuleCall_3_1_1_0; }
+		
+		//('@enable' enableRoutine=moeRoutine)?
+		public Group getGroup_3_2() { return cGroup_3_2; }
+		
+		//'@enable'
+		public Keyword getEnableKeyword_3_2_0() { return cEnableKeyword_3_2_0; }
+		
+		//enableRoutine=moeRoutine
+		public Assignment getEnableRoutineAssignment_3_2_1() { return cEnableRoutineAssignment_3_2_1; }
+		
+		//moeRoutine
+		public RuleCall getEnableRoutineMoeRoutineParserRuleCall_3_2_1_0() { return cEnableRoutineMoeRoutineParserRuleCall_3_2_1_0; }
+		
+		//('@disable' disableRoutine=moeRoutine)?
+		public Group getGroup_3_3() { return cGroup_3_3; }
+		
+		//'@disable'
+		public Keyword getDisableKeyword_3_3_0() { return cDisableKeyword_3_3_0; }
+		
+		//disableRoutine=moeRoutine
+		public Assignment getDisableRoutineAssignment_3_3_1() { return cDisableRoutineAssignment_3_3_1; }
+		
+		//moeRoutine
+		public RuleCall getDisableRoutineMoeRoutineParserRuleCall_3_3_1_0() { return cDisableRoutineMoeRoutineParserRuleCall_3_3_1_0; }
+		
+		//('@concurrency' concurrencyRoutine=moeRoutine)?
+		public Group getGroup_3_4() { return cGroup_3_4; }
+		
+		//'@concurrency'
+		public Keyword getConcurrencyKeyword_3_4_0() { return cConcurrencyKeyword_3_4_0; }
+		
+		//concurrencyRoutine=moeRoutine
+		public Assignment getConcurrencyRoutineAssignment_3_4_1() { return cConcurrencyRoutineAssignment_3_4_1; }
+		
+		//moeRoutine
+		public RuleCall getConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0() { return cConcurrencyRoutineMoeRoutineParserRuleCall_3_4_1_0; }
+		
+		//('@schedule' scheduleRoutine=moeRoutine)?
+		public Group getGroup_3_5() { return cGroup_3_5; }
+		
+		//'@schedule'
+		public Keyword getScheduleKeyword_3_5_0() { return cScheduleKeyword_3_5_0; }
+		
+		//scheduleRoutine=moeRoutine
+		public Assignment getScheduleRoutineAssignment_3_5_1() { return cScheduleRoutineAssignment_3_5_1; }
+		
+		//moeRoutine
+		public RuleCall getScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0() { return cScheduleRoutineMoeRoutineParserRuleCall_3_5_1_0; }
+		
+		//('@irun' irunRoutine=moeRoutine)?
+		public Group getGroup_3_6() { return cGroup_3_6; }
+		
+		//'@irun'
+		public Keyword getIrunKeyword_3_6_0() { return cIrunKeyword_3_6_0; }
+		
+		//irunRoutine=moeRoutine
+		public Assignment getIrunRoutineAssignment_3_6_1() { return cIrunRoutineAssignment_3_6_1; }
+		
+		//moeRoutine
+		public RuleCall getIrunRoutineMoeRoutineParserRuleCall_3_6_1_0() { return cIrunRoutineMoeRoutineParserRuleCall_3_6_1_0; }
+		
+		//('@run' runRoutine=moeRoutine)?
+		public Group getGroup_3_7() { return cGroup_3_7; }
+		
+		//'@run'
+		public Keyword getRunKeyword_3_7_0() { return cRunKeyword_3_7_0; }
+		
+		//runRoutine=moeRoutine
+		public Assignment getRunRoutineAssignment_3_7_1() { return cRunRoutineAssignment_3_7_1; }
+		
+		//moeRoutine
+		public RuleCall getRunRoutineMoeRoutineParserRuleCall_3_7_1_0() { return cRunRoutineMoeRoutineParserRuleCall_3_7_1_0; }
+		
+		//routine+=Routine*
+		public Assignment getRoutineAssignment_4() { return cRoutineAssignment_4; }
+		
+		//Routine
+		public RuleCall getRoutineRoutineParserRuleCall_4_0() { return cRoutineRoutineParserRuleCall_4_0; }
+	}
+	public class MoeRoutineElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cRoutineAction_0 = (Action)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cDomainAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cDomainFunctionalParameterSetParserRuleCall_1_1_0 = (RuleCall)cDomainAssignment_1_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cHyphenMinusGreaterThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Alternatives cAlternatives_2_1 = (Alternatives)cGroup_2.eContents().get(1);
+		private final Group cGroup_2_1_0 = (Group)cAlternatives_2_1.eContents().get(0);
+		private final Keyword cLeftParenthesisKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
+		private final Assignment cCodomainAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
+		private final RuleCall cCodomainFunctionalParameterSetParserRuleCall_2_1_0_1_0 = (RuleCall)cCodomainAssignment_2_1_0_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_2_1_0_2 = (Keyword)cGroup_2_1_0.eContents().get(2);
+		private final Assignment cCodomainAssignment_2_1_1 = (Assignment)cAlternatives_2_1.eContents().get(1);
+		private final RuleCall cCodomainFunctionalParameterSetParserRuleCall_2_1_1_0 = (RuleCall)cCodomainAssignment_2_1_1.eContents().get(0);
+		private final Assignment cBodyBlockAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_3_0 = (RuleCall)cBodyBlockAssignment_3.eContents().get(0);
+		
+		//moeRoutine fmlInfra::Routine:
+		//	{fmlInfra::Routine} ('(' domain=FunctionalParameterSet? ')')? ('->' ('(' codomain=FunctionalParameterSet ')'
+		//	| codomain=FunctionalParameterSet))?
+		//	bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Routine} ('(' domain=FunctionalParameterSet? ')')? ('->' ('(' codomain=FunctionalParameterSet ')' |
+		//codomain=FunctionalParameterSet))? bodyBlock=BlockStatement
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Routine}
+		public Action getRoutineAction_0() { return cRoutineAction_0; }
+		
+		//('(' domain=FunctionalParameterSet? ')')?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_1_0() { return cLeftParenthesisKeyword_1_0; }
+		
+		//domain=FunctionalParameterSet?
+		public Assignment getDomainAssignment_1_1() { return cDomainAssignment_1_1; }
+		
+		//FunctionalParameterSet
+		public RuleCall getDomainFunctionalParameterSetParserRuleCall_1_1_0() { return cDomainFunctionalParameterSetParserRuleCall_1_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_2() { return cRightParenthesisKeyword_1_2; }
+		
+		//('->' ('(' codomain=FunctionalParameterSet ')' | codomain=FunctionalParameterSet))?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'->'
+		public Keyword getHyphenMinusGreaterThanSignKeyword_2_0() { return cHyphenMinusGreaterThanSignKeyword_2_0; }
+		
+		//('(' codomain=FunctionalParameterSet ')' | codomain=FunctionalParameterSet)
+		public Alternatives getAlternatives_2_1() { return cAlternatives_2_1; }
+		
+		//'(' codomain=FunctionalParameterSet ')'
+		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_2_1_0_0() { return cLeftParenthesisKeyword_2_1_0_0; }
+		
+		//codomain=FunctionalParameterSet
+		public Assignment getCodomainAssignment_2_1_0_1() { return cCodomainAssignment_2_1_0_1; }
+		
+		//FunctionalParameterSet
+		public RuleCall getCodomainFunctionalParameterSetParserRuleCall_2_1_0_1_0() { return cCodomainFunctionalParameterSetParserRuleCall_2_1_0_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2_1_0_2() { return cRightParenthesisKeyword_2_1_0_2; }
+		
+		//codomain=FunctionalParameterSet
+		public Assignment getCodomainAssignment_2_1_1() { return cCodomainAssignment_2_1_1; }
+		
+		//FunctionalParameterSet
+		public RuleCall getCodomainFunctionalParameterSetParserRuleCall_2_1_1_0() { return cCodomainFunctionalParameterSetParserRuleCall_2_1_1_0; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_3() { return cBodyBlockAssignment_3; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_3_0() { return cBodyBlockBlockStatementParserRuleCall_3_0; }
+	}
+	public class RoutineElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Routine");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Keyword cMacroKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cRoutineKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
+		private final Keyword cLeftParenthesisKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
+		private final Assignment cDomainAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
+		private final RuleCall cDomainFunctionalParameterSetParserRuleCall_5_1_0 = (RuleCall)cDomainAssignment_5_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Alternatives cAlternatives_6_1 = (Alternatives)cGroup_6.eContents().get(1);
+		private final Group cGroup_6_1_0 = (Group)cAlternatives_6_1.eContents().get(0);
+		private final Keyword cLeftParenthesisKeyword_6_1_0_0 = (Keyword)cGroup_6_1_0.eContents().get(0);
+		private final Assignment cCodomainAssignment_6_1_0_1 = (Assignment)cGroup_6_1_0.eContents().get(1);
+		private final RuleCall cCodomainFunctionalParameterSetParserRuleCall_6_1_0_1_0 = (RuleCall)cCodomainAssignment_6_1_0_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_6_1_0_2 = (Keyword)cGroup_6_1_0.eContents().get(2);
+		private final Assignment cCodomainAssignment_6_1_1 = (Assignment)cAlternatives_6_1.eContents().get(1);
+		private final RuleCall cCodomainFormalParameterSetParserRuleCall_6_1_1_0 = (RuleCall)cCodomainAssignment_6_1_1.eContents().get(0);
+		private final Assignment cBodyBlockAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_7_0 = (RuleCall)cBodyBlockAssignment_7.eContents().get(0);
+		
+		//Routine fmlInfra::Routine:
+		//	visibility=VisibilityKind? 'macro'? 'routine'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('(' domain=FunctionalParameterSet? ')')? ('-->' ('('
+		//	codomain=FunctionalParameterSet ')'
+		//	| codomain=FormalParameterSet))?
+		//	bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=VisibilityKind? 'macro'? 'routine' name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//domain=FunctionalParameterSet? ')')? ('-->' ('(' codomain=FunctionalParameterSet ')' | codomain=FormalParameterSet))?
+		//bodyBlock=BlockStatement
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0; }
+		
+		//'macro'?
+		public Keyword getMacroKeyword_1() { return cMacroKeyword_1; }
+		
+		//'routine'
+		public Keyword getRoutineKeyword_2() { return cRoutineKeyword_2; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//('(' domain=FunctionalParameterSet? ')')?
+		public Group getGroup_5() { return cGroup_5; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_5_0() { return cLeftParenthesisKeyword_5_0; }
+		
+		//domain=FunctionalParameterSet?
+		public Assignment getDomainAssignment_5_1() { return cDomainAssignment_5_1; }
+		
+		//FunctionalParameterSet
+		public RuleCall getDomainFunctionalParameterSetParserRuleCall_5_1_0() { return cDomainFunctionalParameterSetParserRuleCall_5_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_5_2() { return cRightParenthesisKeyword_5_2; }
+		
+		//('-->' ('(' codomain=FunctionalParameterSet ')' | codomain=FormalParameterSet))?
+		public Group getGroup_6() { return cGroup_6; }
+		
+		//'-->'
+		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0; }
+		
+		//('(' codomain=FunctionalParameterSet ')' | codomain=FormalParameterSet)
+		public Alternatives getAlternatives_6_1() { return cAlternatives_6_1; }
+		
+		//'(' codomain=FunctionalParameterSet ')'
+		public Group getGroup_6_1_0() { return cGroup_6_1_0; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_6_1_0_0() { return cLeftParenthesisKeyword_6_1_0_0; }
+		
+		//codomain=FunctionalParameterSet
+		public Assignment getCodomainAssignment_6_1_0_1() { return cCodomainAssignment_6_1_0_1; }
+		
+		//FunctionalParameterSet
+		public RuleCall getCodomainFunctionalParameterSetParserRuleCall_6_1_0_1_0() { return cCodomainFunctionalParameterSetParserRuleCall_6_1_0_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_6_1_0_2() { return cRightParenthesisKeyword_6_1_0_2; }
+		
+		//codomain=FormalParameterSet
+		public Assignment getCodomainAssignment_6_1_1() { return cCodomainAssignment_6_1_1; }
+		
+		//FormalParameterSet
+		public RuleCall getCodomainFormalParameterSetParserRuleCall_6_1_1_0() { return cCodomainFormalParameterSetParserRuleCall_6_1_1_0; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_7() { return cBodyBlockAssignment_7; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_7_0() { return cBodyBlockBlockStatementParserRuleCall_7_0; }
+	}
+	public class ModelOfInteractionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ModelOfInteraction");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cModelOfInteractionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cComKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Assignment cRoutesAssignment_2_0 = (Assignment)cAlternatives_2.eContents().get(0);
+		private final RuleCall cRoutesRouteParserRuleCall_2_0_0 = (RuleCall)cRoutesAssignment_2_0.eContents().get(0);
+		private final Assignment cConnectionsAssignment_2_1 = (Assignment)cAlternatives_2.eContents().get(1);
+		private final RuleCall cConnectionsConnectionParserRuleCall_2_1_0 = (RuleCall)cConnectionsAssignment_2_1.eContents().get(0);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Section Model Of Interaction / Communication Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//ModelOfInteraction fmlInfra::ModelOfInteraction:
+		//	{fmlInfra::ModelOfInteraction}
+		//	'@com:' (routes+=Route
+		//	| connections+=Connection)*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::ModelOfInteraction} '@com:' (routes+=Route | connections+=Connection)*
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::ModelOfInteraction}
+		public Action getModelOfInteractionAction_0() { return cModelOfInteractionAction_0; }
+		
+		//'@com:'
+		public Keyword getComKeyword_1() { return cComKeyword_1; }
+		
+		//(routes+=Route | connections+=Connection)*
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//routes+=Route
+		public Assignment getRoutesAssignment_2_0() { return cRoutesAssignment_2_0; }
+		
+		//Route
+		public RuleCall getRoutesRouteParserRuleCall_2_0_0() { return cRoutesRouteParserRuleCall_2_0_0; }
+		
+		//connections+=Connection
+		public Assignment getConnectionsAssignment_2_1() { return cConnectionsAssignment_2_1; }
+		
+		//Connection
+		public RuleCall getConnectionsConnectionParserRuleCall_2_1_0() { return cConnectionsConnectionParserRuleCall_2_1_0; }
+	}
+	public class RouteElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Route");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cRouteAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cRouteKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cProtocolAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cProtocolComRouteProtocolParserRuleCall_3_0 = (RuleCall)cProtocolAssignment_3.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
+		private final Assignment cNameAssignment_5_0 = (Assignment)cGroup_5.eContents().get(0);
+		private final RuleCall cNameESIdentifierParserRuleCall_5_0_0 = (RuleCall)cNameAssignment_5_0.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0 = (RuleCall)cUnrestrictedNameAssignment_5_1.eContents().get(0);
+		private final Keyword cLeftSquareBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
+		private final Keyword cAsteriskKeyword_7_0 = (Keyword)cAlternatives_7.eContents().get(0);
+		private final Group cGroup_7_1 = (Group)cAlternatives_7.eContents().get(1);
+		private final Assignment cSignalsAssignment_7_1_0 = (Assignment)cGroup_7_1.eContents().get(0);
+		private final CrossReference cSignalsSignalCrossReference_7_1_0_0 = (CrossReference)cSignalsAssignment_7_1_0.eContents().get(0);
+		private final RuleCall cSignalsSignalESUfidParserRuleCall_7_1_0_0_1 = (RuleCall)cSignalsSignalCrossReference_7_1_0_0.eContents().get(1);
+		private final Group cGroup_7_1_1 = (Group)cGroup_7_1.eContents().get(1);
+		private final Keyword cCommaKeyword_7_1_1_0 = (Keyword)cGroup_7_1_1.eContents().get(0);
+		private final Assignment cSignalsAssignment_7_1_1_1 = (Assignment)cGroup_7_1_1.eContents().get(1);
+		private final CrossReference cSignalsSignalCrossReference_7_1_1_1_0 = (CrossReference)cSignalsAssignment_7_1_1_1.eContents().get(0);
+		private final RuleCall cSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1 = (RuleCall)cSignalsSignalCrossReference_7_1_1_1_0.eContents().get(1);
+		private final Keyword cRightSquareBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		private final Keyword cSemicolonKeyword_9 = (Keyword)cGroup.eContents().get(9);
+		
+		//Route fmlInfra::Route:
+		//	{fmlInfra::Route}
+		//	'route' '<' protocol=ComRouteProtocol '>' (name=ESIdentifier unrestrictedName=UnrestrictedName?)?
+		//	'[' ('*'
+		//	| signals+=[fmlInfra::Signal|ESUfid] (',' signals+=[fmlInfra::Signal|ESUfid])*)
+		//	']' ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Route} 'route' '<' protocol=ComRouteProtocol '>' (name=ESIdentifier unrestrictedName=UnrestrictedName?)? '['
+		//('*' | signals+=[fmlInfra::Signal|ESUfid] (',' signals+=[fmlInfra::Signal|ESUfid])*) ']' ';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Route}
+		public Action getRouteAction_0() { return cRouteAction_0; }
+		
+		//'route'
+		public Keyword getRouteKeyword_1() { return cRouteKeyword_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
+		
+		//protocol=ComRouteProtocol
+		public Assignment getProtocolAssignment_3() { return cProtocolAssignment_3; }
+		
+		//ComRouteProtocol
+		public RuleCall getProtocolComRouteProtocolParserRuleCall_3_0() { return cProtocolComRouteProtocolParserRuleCall_3_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_4() { return cGreaterThanSignKeyword_4; }
+		
+		//(name=ESIdentifier unrestrictedName=UnrestrictedName?)?
+		public Group getGroup_5() { return cGroup_5; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_5_0() { return cNameAssignment_5_0; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_5_0_0() { return cNameESIdentifierParserRuleCall_5_0_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_5_1() { return cUnrestrictedNameAssignment_5_1; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_6() { return cLeftSquareBracketKeyword_6; }
+		
+		//('*' | signals+=[fmlInfra::Signal|ESUfid] (',' signals+=[fmlInfra::Signal|ESUfid])*)
+		public Alternatives getAlternatives_7() { return cAlternatives_7; }
+		
+		//'*'
+		public Keyword getAsteriskKeyword_7_0() { return cAsteriskKeyword_7_0; }
+		
+		//signals+=[fmlInfra::Signal|ESUfid] (',' signals+=[fmlInfra::Signal|ESUfid])*
+		public Group getGroup_7_1() { return cGroup_7_1; }
+		
+		//signals+=[fmlInfra::Signal|ESUfid]
+		public Assignment getSignalsAssignment_7_1_0() { return cSignalsAssignment_7_1_0; }
+		
+		//[fmlInfra::Signal|ESUfid]
+		public CrossReference getSignalsSignalCrossReference_7_1_0_0() { return cSignalsSignalCrossReference_7_1_0_0; }
+		
+		//ESUfid
+		public RuleCall getSignalsSignalESUfidParserRuleCall_7_1_0_0_1() { return cSignalsSignalESUfidParserRuleCall_7_1_0_0_1; }
+		
+		//(',' signals+=[fmlInfra::Signal|ESUfid])*
+		public Group getGroup_7_1_1() { return cGroup_7_1_1; }
+		
+		//','
+		public Keyword getCommaKeyword_7_1_1_0() { return cCommaKeyword_7_1_1_0; }
+		
+		//signals+=[fmlInfra::Signal|ESUfid]
+		public Assignment getSignalsAssignment_7_1_1_1() { return cSignalsAssignment_7_1_1_1; }
+		
+		//[fmlInfra::Signal|ESUfid]
+		public CrossReference getSignalsSignalCrossReference_7_1_1_1_0() { return cSignalsSignalCrossReference_7_1_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1() { return cSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_8() { return cRightSquareBracketKeyword_8; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_9() { return cSemicolonKeyword_9; }
+	}
+	public class ComRouteProtocolElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComRouteProtocol");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Assignment cProtocolAssignment_0 = (Assignment)cAlternatives.eContents().get(0);
+		private final RuleCall cProtocolComProtocolKindEnumRuleCall_0_0 = (RuleCall)cProtocolAssignment_0.eContents().get(0);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Assignment cProtocolAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
+		private final RuleCall cProtocolBufferProtocolKindEnumRuleCall_1_0_0 = (RuleCall)cProtocolAssignment_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
+		private final Group cGroup_1_1_0 = (Group)cAlternatives_1_1.eContents().get(0);
+		private final Keyword cColonKeyword_1_1_0_0 = (Keyword)cGroup_1_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_1_1_0_1 = (Alternatives)cGroup_1_1_0.eContents().get(1);
+		private final Assignment cInner_bufferAssignment_1_1_0_1_0 = (Assignment)cAlternatives_1_1_0_1.eContents().get(0);
+		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0 = (RuleCall)cInner_bufferAssignment_1_1_0_1_0.eContents().get(0);
+		private final Assignment cRef_bufferAssignment_1_1_0_1_1 = (Assignment)cAlternatives_1_1_0_1.eContents().get(1);
+		private final CrossReference cRef_bufferBufferCrossReference_1_1_0_1_1_0 = (CrossReference)cRef_bufferAssignment_1_1_0_1_1.eContents().get(0);
+		private final RuleCall cRef_bufferBufferESUfidParserRuleCall_1_1_0_1_1_0_1 = (RuleCall)cRef_bufferBufferCrossReference_1_1_0_1_1_0.eContents().get(1);
+		private final Group cGroup_1_1_1 = (Group)cAlternatives_1_1.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_1_1_1_0 = (Keyword)cGroup_1_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_1_1_1 = (Alternatives)cGroup_1_1_1.eContents().get(1);
+		private final Assignment cInner_bufferAssignment_1_1_1_1_0 = (Assignment)cAlternatives_1_1_1_1.eContents().get(0);
+		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0 = (RuleCall)cInner_bufferAssignment_1_1_1_1_0.eContents().get(0);
+		private final Assignment cRef_bufferAssignment_1_1_1_1_1 = (Assignment)cAlternatives_1_1_1_1.eContents().get(1);
+		private final CrossReference cRef_bufferBufferCrossReference_1_1_1_1_1_0 = (CrossReference)cRef_bufferAssignment_1_1_1_1_1.eContents().get(0);
+		private final RuleCall cRef_bufferBufferESUfidParserRuleCall_1_1_1_1_1_0_1 = (RuleCall)cRef_bufferBufferCrossReference_1_1_1_1_1_0.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_1_1_1_2 = (Keyword)cGroup_1_1_1.eContents().get(2);
+		private final Assignment cInner_bufferAssignment_2 = (Assignment)cAlternatives.eContents().get(2);
+		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_2_0 = (RuleCall)cInner_bufferAssignment_2.eContents().get(0);
+		private final Assignment cRef_bufferAssignment_3 = (Assignment)cAlternatives.eContents().get(3);
+		private final CrossReference cRef_bufferBufferCrossReference_3_0 = (CrossReference)cRef_bufferAssignment_3.eContents().get(0);
+		private final RuleCall cRef_bufferBufferESUfidParserRuleCall_3_0_1 = (RuleCall)cRef_bufferBufferCrossReference_3_0.eContents().get(1);
+		
+		//ComRouteProtocol fmlInfra::ComProtocol:
+		//	protocol=ComProtocolKind
+		//	| protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType
+		//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType
+		//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+		//	| inner_buffer=BufferContainerType
+		//	| ref_buffer=[fmlInfra::Buffer|ESUfid]
+		@Override public ParserRule getRule() { return rule; }
+		
+		//protocol=ComProtocolKind | protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType |
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		//'>')? | inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//protocol=ComProtocolKind
+		public Assignment getProtocolAssignment_0() { return cProtocolAssignment_0; }
+		
+		//ComProtocolKind
+		public RuleCall getProtocolComProtocolKindEnumRuleCall_0_0() { return cProtocolComProtocolKindEnumRuleCall_0_0; }
+		
+		//protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<'
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//protocol=BufferProtocolKind
+		public Assignment getProtocolAssignment_1_0() { return cProtocolAssignment_1_0; }
+		
+		//BufferProtocolKind
+		public RuleCall getProtocolBufferProtocolKindEnumRuleCall_1_0_0() { return cProtocolBufferProtocolKindEnumRuleCall_1_0_0; }
+		
+		//(':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType |
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
+		
+		//':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		public Group getGroup_1_1_0() { return cGroup_1_1_0; }
+		
+		//':'
+		public Keyword getColonKeyword_1_1_0_0() { return cColonKeyword_1_1_0_0; }
+		
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		public Alternatives getAlternatives_1_1_0_1() { return cAlternatives_1_1_0_1; }
+		
+		//inner_buffer=BufferContainerType
+		public Assignment getInner_bufferAssignment_1_1_0_1_0() { return cInner_bufferAssignment_1_1_0_1_0; }
+		
+		//BufferContainerType
+		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0; }
+		
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Assignment getRef_bufferAssignment_1_1_0_1_1() { return cRef_bufferAssignment_1_1_0_1_1; }
+		
+		//[fmlInfra::Buffer|ESUfid]
+		public CrossReference getRef_bufferBufferCrossReference_1_1_0_1_1_0() { return cRef_bufferBufferCrossReference_1_1_0_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getRef_bufferBufferESUfidParserRuleCall_1_1_0_1_1_0_1() { return cRef_bufferBufferESUfidParserRuleCall_1_1_0_1_1_0_1; }
+		
+		//'<' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) '>'
+		public Group getGroup_1_1_1() { return cGroup_1_1_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1_1_1_0() { return cLessThanSignKeyword_1_1_1_0; }
+		
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		public Alternatives getAlternatives_1_1_1_1() { return cAlternatives_1_1_1_1; }
+		
+		//inner_buffer=BufferContainerType
+		public Assignment getInner_bufferAssignment_1_1_1_1_0() { return cInner_bufferAssignment_1_1_1_1_0; }
+		
+		//BufferContainerType
+		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0; }
+		
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Assignment getRef_bufferAssignment_1_1_1_1_1() { return cRef_bufferAssignment_1_1_1_1_1; }
+		
+		//[fmlInfra::Buffer|ESUfid]
+		public CrossReference getRef_bufferBufferCrossReference_1_1_1_1_1_0() { return cRef_bufferBufferCrossReference_1_1_1_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getRef_bufferBufferESUfidParserRuleCall_1_1_1_1_1_0_1() { return cRef_bufferBufferESUfidParserRuleCall_1_1_1_1_1_0_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_1_1_1_2() { return cGreaterThanSignKeyword_1_1_1_2; }
+		
+		//inner_buffer=BufferContainerType
+		public Assignment getInner_bufferAssignment_2() { return cInner_bufferAssignment_2; }
+		
+		//BufferContainerType
+		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_2_0() { return cInner_bufferBufferContainerTypeParserRuleCall_2_0; }
+		
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Assignment getRef_bufferAssignment_3() { return cRef_bufferAssignment_3; }
+		
+		//[fmlInfra::Buffer|ESUfid]
+		public CrossReference getRef_bufferBufferCrossReference_3_0() { return cRef_bufferBufferCrossReference_3_0; }
+		
+		//ESUfid
+		public RuleCall getRef_bufferBufferESUfidParserRuleCall_3_0_1() { return cRef_bufferBufferESUfidParserRuleCall_3_0_1; }
+	}
+	public class ConnectionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Connection");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cConnectKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cProtocolAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cProtocolComProtocolParserRuleCall_2_0 = (RuleCall)cProtocolAssignment_2.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Assignment cNameAssignment_4_0 = (Assignment)cGroup_4.eContents().get(0);
+		private final RuleCall cNameESIdentifierParserRuleCall_4_0_0 = (RuleCall)cNameAssignment_4_0.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0 = (RuleCall)cUnrestrictedNameAssignment_4_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cComPointsAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cComPointsComPointParserRuleCall_6_0 = (RuleCall)cComPointsAssignment_6.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
+		
+		//Connection fmlInfra::Connection:
+		//	'connect' '<' protocol=ComProtocol '>' (name=ESIdentifier unrestrictedName=UnrestrictedName?)?
+		//	'{' comPoints+=ComPoint+ '}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'connect' '<' protocol=ComProtocol '>' (name=ESIdentifier unrestrictedName=UnrestrictedName?)? '{' comPoints+=ComPoint+
+		//'}'
+		public Group getGroup() { return cGroup; }
+		
+		//'connect'
+		public Keyword getConnectKeyword_0() { return cConnectKeyword_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
+		
+		//protocol=ComProtocol
+		public Assignment getProtocolAssignment_2() { return cProtocolAssignment_2; }
+		
+		//ComProtocol
+		public RuleCall getProtocolComProtocolParserRuleCall_2_0() { return cProtocolComProtocolParserRuleCall_2_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_3() { return cGreaterThanSignKeyword_3; }
+		
+		//(name=ESIdentifier unrestrictedName=UnrestrictedName?)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_4_0() { return cNameAssignment_4_0; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_4_0_0() { return cNameESIdentifierParserRuleCall_4_0_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4_1() { return cUnrestrictedNameAssignment_4_1; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_5() { return cLeftCurlyBracketKeyword_5; }
+		
+		//comPoints+=ComPoint+
+		public Assignment getComPointsAssignment_6() { return cComPointsAssignment_6; }
+		
+		//ComPoint
+		public RuleCall getComPointsComPointParserRuleCall_6_0() { return cComPointsComPointParserRuleCall_6_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
+	}
+	public class ComProtocolElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComProtocol");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Assignment cProtocolAssignment_0 = (Assignment)cAlternatives.eContents().get(0);
+		private final RuleCall cProtocolComEnvRdvProtocolKindEnumRuleCall_0_0 = (RuleCall)cProtocolAssignment_0.eContents().get(0);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Assignment cProtocolAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
+		private final RuleCall cProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0 = (RuleCall)cProtocolAssignment_1_0.eContents().get(0);
+		private final Group cGroup_1_1 = (Group)cGroup_1.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
+		private final Assignment cCastAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
+		private final RuleCall cCastComCastKingEnumRuleCall_1_1_1_0 = (RuleCall)cCastAssignment_1_1_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_1_1_2 = (Keyword)cGroup_1_1.eContents().get(2);
+		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
+		private final Assignment cProtocolAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final RuleCall cProtocolBufferProtocolKindEnumRuleCall_2_0_0 = (RuleCall)cProtocolAssignment_2_0.eContents().get(0);
+		private final Alternatives cAlternatives_2_1 = (Alternatives)cGroup_2.eContents().get(1);
+		private final Group cGroup_2_1_0 = (Group)cAlternatives_2_1.eContents().get(0);
+		private final Keyword cColonKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_2_1_0_1 = (Alternatives)cGroup_2_1_0.eContents().get(1);
+		private final Assignment cInner_bufferAssignment_2_1_0_1_0 = (Assignment)cAlternatives_2_1_0_1.eContents().get(0);
+		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0 = (RuleCall)cInner_bufferAssignment_2_1_0_1_0.eContents().get(0);
+		private final Assignment cRef_bufferAssignment_2_1_0_1_1 = (Assignment)cAlternatives_2_1_0_1.eContents().get(1);
+		private final CrossReference cRef_bufferBufferCrossReference_2_1_0_1_1_0 = (CrossReference)cRef_bufferAssignment_2_1_0_1_1.eContents().get(0);
+		private final RuleCall cRef_bufferBufferESUfidParserRuleCall_2_1_0_1_1_0_1 = (RuleCall)cRef_bufferBufferCrossReference_2_1_0_1_1_0.eContents().get(1);
+		private final Group cGroup_2_1_1 = (Group)cAlternatives_2_1.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_2_1_1_1 = (Alternatives)cGroup_2_1_1.eContents().get(1);
+		private final Assignment cInner_bufferAssignment_2_1_1_1_0 = (Assignment)cAlternatives_2_1_1_1.eContents().get(0);
+		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0 = (RuleCall)cInner_bufferAssignment_2_1_1_1_0.eContents().get(0);
+		private final Assignment cRef_bufferAssignment_2_1_1_1_1 = (Assignment)cAlternatives_2_1_1_1.eContents().get(1);
+		private final CrossReference cRef_bufferBufferCrossReference_2_1_1_1_1_0 = (CrossReference)cRef_bufferAssignment_2_1_1_1_1.eContents().get(0);
+		private final RuleCall cRef_bufferBufferESUfidParserRuleCall_2_1_1_1_1_0_1 = (RuleCall)cRef_bufferBufferCrossReference_2_1_1_1_1_0.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_2_1_1_2 = (Keyword)cGroup_2_1_1.eContents().get(2);
+		private final Assignment cInner_bufferAssignment_3 = (Assignment)cAlternatives.eContents().get(3);
+		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_3_0 = (RuleCall)cInner_bufferAssignment_3.eContents().get(0);
+		private final Assignment cRef_bufferAssignment_4 = (Assignment)cAlternatives.eContents().get(4);
+		private final CrossReference cRef_bufferBufferCrossReference_4_0 = (CrossReference)cRef_bufferAssignment_4.eContents().get(0);
+		private final RuleCall cRef_bufferBufferESUfidParserRuleCall_4_0_1 = (RuleCall)cRef_bufferBufferCrossReference_4_0.eContents().get(1);
+		private final Assignment cCastAssignment_5 = (Assignment)cAlternatives.eContents().get(5);
+		private final RuleCall cCastComCastKingEnumRuleCall_5_0 = (RuleCall)cCastAssignment_5.eContents().get(0);
+		
+		//ComProtocol fmlInfra::ComProtocol:
+		//	protocol=ComEnvRdvProtocolKind
+		//	| protocol=ComMultiRdvProtocolKind ('<' cast=ComCastKing '>')?
+		//	| protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType
+		//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType
+		//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+		//	| inner_buffer=BufferContainerType
+		//	| ref_buffer=[fmlInfra::Buffer|ESUfid] | cast=ComCastKing
+		@Override public ParserRule getRule() { return rule; }
+		
+		//protocol=ComEnvRdvProtocolKind | protocol=ComMultiRdvProtocolKind ('<' cast=ComCastKing '>')? |
+		//protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<'
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')? | inner_buffer=BufferContainerType |
+		//ref_buffer=[fmlInfra::Buffer|ESUfid] | cast=ComCastKing
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//protocol=ComEnvRdvProtocolKind
+		public Assignment getProtocolAssignment_0() { return cProtocolAssignment_0; }
+		
+		//ComEnvRdvProtocolKind
+		public RuleCall getProtocolComEnvRdvProtocolKindEnumRuleCall_0_0() { return cProtocolComEnvRdvProtocolKindEnumRuleCall_0_0; }
+		
+		//protocol=ComMultiRdvProtocolKind ('<' cast=ComCastKing '>')?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//protocol=ComMultiRdvProtocolKind
+		public Assignment getProtocolAssignment_1_0() { return cProtocolAssignment_1_0; }
+		
+		//ComMultiRdvProtocolKind
+		public RuleCall getProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0() { return cProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0; }
+		
+		//('<' cast=ComCastKing '>')?
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1_1_0() { return cLessThanSignKeyword_1_1_0; }
+		
+		//cast=ComCastKing
+		public Assignment getCastAssignment_1_1_1() { return cCastAssignment_1_1_1; }
+		
+		//ComCastKing
+		public RuleCall getCastComCastKingEnumRuleCall_1_1_1_0() { return cCastComCastKingEnumRuleCall_1_1_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_1_1_2() { return cGreaterThanSignKeyword_1_1_2; }
+		
+		//protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<'
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//protocol=BufferProtocolKind
+		public Assignment getProtocolAssignment_2_0() { return cProtocolAssignment_2_0; }
+		
+		//BufferProtocolKind
+		public RuleCall getProtocolBufferProtocolKindEnumRuleCall_2_0_0() { return cProtocolBufferProtocolKindEnumRuleCall_2_0_0; }
+		
+		//(':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType |
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+		public Alternatives getAlternatives_2_1() { return cAlternatives_2_1; }
+		
+		//':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
+		
+		//':'
+		public Keyword getColonKeyword_2_1_0_0() { return cColonKeyword_2_1_0_0; }
+		
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		public Alternatives getAlternatives_2_1_0_1() { return cAlternatives_2_1_0_1; }
+		
+		//inner_buffer=BufferContainerType
+		public Assignment getInner_bufferAssignment_2_1_0_1_0() { return cInner_bufferAssignment_2_1_0_1_0; }
+		
+		//BufferContainerType
+		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0; }
+		
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Assignment getRef_bufferAssignment_2_1_0_1_1() { return cRef_bufferAssignment_2_1_0_1_1; }
+		
+		//[fmlInfra::Buffer|ESUfid]
+		public CrossReference getRef_bufferBufferCrossReference_2_1_0_1_1_0() { return cRef_bufferBufferCrossReference_2_1_0_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getRef_bufferBufferESUfidParserRuleCall_2_1_0_1_1_0_1() { return cRef_bufferBufferESUfidParserRuleCall_2_1_0_1_1_0_1; }
+		
+		//'<' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) '>'
+		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_1_1_0() { return cLessThanSignKeyword_2_1_1_0; }
+		
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		public Alternatives getAlternatives_2_1_1_1() { return cAlternatives_2_1_1_1; }
+		
+		//inner_buffer=BufferContainerType
+		public Assignment getInner_bufferAssignment_2_1_1_1_0() { return cInner_bufferAssignment_2_1_1_1_0; }
+		
+		//BufferContainerType
+		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0; }
+		
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Assignment getRef_bufferAssignment_2_1_1_1_1() { return cRef_bufferAssignment_2_1_1_1_1; }
+		
+		//[fmlInfra::Buffer|ESUfid]
+		public CrossReference getRef_bufferBufferCrossReference_2_1_1_1_1_0() { return cRef_bufferBufferCrossReference_2_1_1_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getRef_bufferBufferESUfidParserRuleCall_2_1_1_1_1_0_1() { return cRef_bufferBufferESUfidParserRuleCall_2_1_1_1_1_0_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_1_1_2() { return cGreaterThanSignKeyword_2_1_1_2; }
+		
+		//inner_buffer=BufferContainerType
+		public Assignment getInner_bufferAssignment_3() { return cInner_bufferAssignment_3; }
+		
+		//BufferContainerType
+		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_3_0() { return cInner_bufferBufferContainerTypeParserRuleCall_3_0; }
+		
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Assignment getRef_bufferAssignment_4() { return cRef_bufferAssignment_4; }
+		
+		//[fmlInfra::Buffer|ESUfid]
+		public CrossReference getRef_bufferBufferCrossReference_4_0() { return cRef_bufferBufferCrossReference_4_0; }
+		
+		//ESUfid
+		public RuleCall getRef_bufferBufferESUfidParserRuleCall_4_0_1() { return cRef_bufferBufferESUfidParserRuleCall_4_0_1; }
+		
+		//cast=ComCastKing
+		public Assignment getCastAssignment_5() { return cCastAssignment_5; }
+		
+		//ComCastKing
+		public RuleCall getCastComCastKingEnumRuleCall_5_0() { return cCastComCastKingEnumRuleCall_5_0; }
+	}
+	public class ComPointElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComPoint");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cComPointAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cProtocolAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cProtocolComPointProtocolParserRuleCall_2_1_0 = (RuleCall)cProtocolAssignment_2_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Assignment cPointAssignment_3_0_0 = (Assignment)cGroup_3_0.eContents().get(0);
+		private final RuleCall cPointComElementParserRuleCall_3_0_0_0 = (RuleCall)cPointAssignment_3_0_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_3_0_1 = (Keyword)cGroup_3_0.eContents().get(1);
+		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Assignment cPointsAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
+		private final RuleCall cPointsComElementParserRuleCall_3_1_1_0 = (RuleCall)cPointsAssignment_3_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_3_1_2 = (Keyword)cGroup_3_1.eContents().get(2);
+		
+		//ComPoint fmlInfra::ComPoint:
+		//	{fmlInfra::ComPoint} direction=ChannelDirection ('<' protocol=ComPointProtocol '>')? (point=ComElement ';'
+		//	| '{' points+=ComElement '}')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::ComPoint} direction=ChannelDirection ('<' protocol=ComPointProtocol '>')? (point=ComElement ';' | '{'
+		//points+=ComElement '}')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::ComPoint}
+		public Action getComPointAction_0() { return cComPointAction_0; }
+		
+		//direction=ChannelDirection
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_0() { return cDirectionChannelDirectionEnumRuleCall_1_0; }
+		
+		//('<' protocol=ComPointProtocol '>')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
+		
+		//protocol=ComPointProtocol
+		public Assignment getProtocolAssignment_2_1() { return cProtocolAssignment_2_1; }
+		
+		//ComPointProtocol
+		public RuleCall getProtocolComPointProtocolParserRuleCall_2_1_0() { return cProtocolComPointProtocolParserRuleCall_2_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
+		
+		//(point=ComElement ';' | '{' points+=ComElement '}')
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//point=ComElement ';'
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//point=ComElement
+		public Assignment getPointAssignment_3_0_0() { return cPointAssignment_3_0_0; }
+		
+		//ComElement
+		public RuleCall getPointComElementParserRuleCall_3_0_0_0() { return cPointComElementParserRuleCall_3_0_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_3_0_1() { return cSemicolonKeyword_3_0_1; }
+		
+		//'{' points+=ComElement '}'
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_3_1_0() { return cLeftCurlyBracketKeyword_3_1_0; }
+		
+		//points+=ComElement
+		public Assignment getPointsAssignment_3_1_1() { return cPointsAssignment_3_1_1; }
+		
+		//ComElement
+		public RuleCall getPointsComElementParserRuleCall_3_1_1_0() { return cPointsComElementParserRuleCall_3_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_3_1_2() { return cRightCurlyBracketKeyword_3_1_2; }
+	}
+	public class ComPointProtocolElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComPointProtocol");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Assignment cProtocolAssignment_0_0 = (Assignment)cGroup_0.eContents().get(0);
+		private final RuleCall cProtocolBufferProtocolKindEnumRuleCall_0_0_0 = (RuleCall)cProtocolAssignment_0_0.eContents().get(0);
+		private final Alternatives cAlternatives_0_1 = (Alternatives)cGroup_0.eContents().get(1);
+		private final Group cGroup_0_1_0 = (Group)cAlternatives_0_1.eContents().get(0);
+		private final Keyword cColonKeyword_0_1_0_0 = (Keyword)cGroup_0_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_0_1_0_1 = (Alternatives)cGroup_0_1_0.eContents().get(1);
+		private final Assignment cInner_bufferAssignment_0_1_0_1_0 = (Assignment)cAlternatives_0_1_0_1.eContents().get(0);
+		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0 = (RuleCall)cInner_bufferAssignment_0_1_0_1_0.eContents().get(0);
+		private final Assignment cRef_bufferAssignment_0_1_0_1_1 = (Assignment)cAlternatives_0_1_0_1.eContents().get(1);
+		private final CrossReference cRef_bufferBufferCrossReference_0_1_0_1_1_0 = (CrossReference)cRef_bufferAssignment_0_1_0_1_1.eContents().get(0);
+		private final RuleCall cRef_bufferBufferESUfidParserRuleCall_0_1_0_1_1_0_1 = (RuleCall)cRef_bufferBufferCrossReference_0_1_0_1_1_0.eContents().get(1);
+		private final Group cGroup_0_1_1 = (Group)cAlternatives_0_1.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_0_1_1_0 = (Keyword)cGroup_0_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_0_1_1_1 = (Alternatives)cGroup_0_1_1.eContents().get(1);
+		private final Assignment cInner_bufferAssignment_0_1_1_1_0 = (Assignment)cAlternatives_0_1_1_1.eContents().get(0);
+		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0 = (RuleCall)cInner_bufferAssignment_0_1_1_1_0.eContents().get(0);
+		private final Assignment cRef_bufferAssignment_0_1_1_1_1 = (Assignment)cAlternatives_0_1_1_1.eContents().get(1);
+		private final CrossReference cRef_bufferBufferCrossReference_0_1_1_1_1_0 = (CrossReference)cRef_bufferAssignment_0_1_1_1_1.eContents().get(0);
+		private final RuleCall cRef_bufferBufferESUfidParserRuleCall_0_1_1_1_1_0_1 = (RuleCall)cRef_bufferBufferCrossReference_0_1_1_1_1_0.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_0_1_1_2 = (Keyword)cGroup_0_1_1.eContents().get(2);
+		private final Assignment cInner_bufferAssignment_1 = (Assignment)cAlternatives.eContents().get(1);
+		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_1_0 = (RuleCall)cInner_bufferAssignment_1.eContents().get(0);
+		private final Assignment cRef_bufferAssignment_2 = (Assignment)cAlternatives.eContents().get(2);
+		private final CrossReference cRef_bufferBufferCrossReference_2_0 = (CrossReference)cRef_bufferAssignment_2.eContents().get(0);
+		private final RuleCall cRef_bufferBufferESUfidParserRuleCall_2_0_1 = (RuleCall)cRef_bufferBufferCrossReference_2_0.eContents().get(1);
+		
+		//ComPointProtocol fmlInfra::ComProtocol:
+		//	protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType
+		//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType
+		//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+		//	| inner_buffer=BufferContainerType
+		//	| ref_buffer=[fmlInfra::Buffer|ESUfid]
+		@Override public ParserRule getRule() { return rule; }
+		
+		//protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<'
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')? | inner_buffer=BufferContainerType |
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<'
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//protocol=BufferProtocolKind
+		public Assignment getProtocolAssignment_0_0() { return cProtocolAssignment_0_0; }
+		
+		//BufferProtocolKind
+		public RuleCall getProtocolBufferProtocolKindEnumRuleCall_0_0_0() { return cProtocolBufferProtocolKindEnumRuleCall_0_0_0; }
+		
+		//(':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType |
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+		public Alternatives getAlternatives_0_1() { return cAlternatives_0_1; }
+		
+		//':' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		public Group getGroup_0_1_0() { return cGroup_0_1_0; }
+		
+		//':'
+		public Keyword getColonKeyword_0_1_0_0() { return cColonKeyword_0_1_0_0; }
+		
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		public Alternatives getAlternatives_0_1_0_1() { return cAlternatives_0_1_0_1; }
+		
+		//inner_buffer=BufferContainerType
+		public Assignment getInner_bufferAssignment_0_1_0_1_0() { return cInner_bufferAssignment_0_1_0_1_0; }
+		
+		//BufferContainerType
+		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0; }
+		
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Assignment getRef_bufferAssignment_0_1_0_1_1() { return cRef_bufferAssignment_0_1_0_1_1; }
+		
+		//[fmlInfra::Buffer|ESUfid]
+		public CrossReference getRef_bufferBufferCrossReference_0_1_0_1_1_0() { return cRef_bufferBufferCrossReference_0_1_0_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getRef_bufferBufferESUfidParserRuleCall_0_1_0_1_1_0_1() { return cRef_bufferBufferESUfidParserRuleCall_0_1_0_1_1_0_1; }
+		
+		//'<' (inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid]) '>'
+		public Group getGroup_0_1_1() { return cGroup_0_1_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_0_1_1_0() { return cLessThanSignKeyword_0_1_1_0; }
+		
+		//(inner_buffer=BufferContainerType | ref_buffer=[fmlInfra::Buffer|ESUfid])
+		public Alternatives getAlternatives_0_1_1_1() { return cAlternatives_0_1_1_1; }
+		
+		//inner_buffer=BufferContainerType
+		public Assignment getInner_bufferAssignment_0_1_1_1_0() { return cInner_bufferAssignment_0_1_1_1_0; }
+		
+		//BufferContainerType
+		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0; }
+		
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Assignment getRef_bufferAssignment_0_1_1_1_1() { return cRef_bufferAssignment_0_1_1_1_1; }
+		
+		//[fmlInfra::Buffer|ESUfid]
+		public CrossReference getRef_bufferBufferCrossReference_0_1_1_1_1_0() { return cRef_bufferBufferCrossReference_0_1_1_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getRef_bufferBufferESUfidParserRuleCall_0_1_1_1_1_0_1() { return cRef_bufferBufferESUfidParserRuleCall_0_1_1_1_1_0_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_0_1_1_2() { return cGreaterThanSignKeyword_0_1_1_2; }
+		
+		//inner_buffer=BufferContainerType
+		public Assignment getInner_bufferAssignment_1() { return cInner_bufferAssignment_1; }
+		
+		//BufferContainerType
+		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_1_0() { return cInner_bufferBufferContainerTypeParserRuleCall_1_0; }
+		
+		//ref_buffer=[fmlInfra::Buffer|ESUfid]
+		public Assignment getRef_bufferAssignment_2() { return cRef_bufferAssignment_2; }
+		
+		//[fmlInfra::Buffer|ESUfid]
+		public CrossReference getRef_bufferBufferCrossReference_2_0() { return cRef_bufferBufferCrossReference_2_0; }
+		
+		//ESUfid
+		public RuleCall getRef_bufferBufferESUfidParserRuleCall_2_0_1() { return cRef_bufferBufferESUfidParserRuleCall_2_0_1; }
+	}
+	public class ComElementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComElement");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralPureReferenceElementParserRuleCall_0_0 = (RuleCall)cGroup_0.eContents().get(0);
+		private final Group cGroup_0_1 = (Group)cGroup_0.eContents().get(1);
+		private final Action cValueElementSpecificationTargetAction_0_1_0 = (Action)cGroup_0_1.eContents().get(0);
+		private final Assignment cKindAssignment_0_1_1 = (Assignment)cGroup_0_1.eContents().get(1);
+		private final Alternatives cKindAlternatives_0_1_1_0 = (Alternatives)cKindAssignment_0_1_1.eContents().get(0);
+		private final RuleCall cKindValueDotFieldExpressionKindEnumRuleCall_0_1_1_0_0 = (RuleCall)cKindAlternatives_0_1_1_0.eContents().get(0);
+		private final RuleCall cKindValueArrowFieldExpressionKindEnumRuleCall_0_1_1_0_1 = (RuleCall)cKindAlternatives_0_1_1_0.eContents().get(1);
+		private final Assignment cElementAssignment_0_1_2 = (Assignment)cGroup_0_1.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_0_1_2_0 = (CrossReference)cElementAssignment_0_1_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_0_1_2_0_1 = (RuleCall)cElementNamedElementCrossReference_0_1_2_0.eContents().get(1);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Action cValueElementSpecificationAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cTargetAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cTargetLiteralReferenceMachineContextParserRuleCall_1_1_0 = (RuleCall)cTargetAssignment_1_1.eContents().get(0);
+		private final Assignment cKindAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final Alternatives cKindAlternatives_1_2_0 = (Alternatives)cKindAssignment_1_2.eContents().get(0);
+		private final RuleCall cKindValueDotFieldExpressionKindEnumRuleCall_1_2_0_0 = (RuleCall)cKindAlternatives_1_2_0.eContents().get(0);
+		private final RuleCall cKindValueArrowFieldExpressionKindEnumRuleCall_1_2_0_1 = (RuleCall)cKindAlternatives_1_2_0.eContents().get(1);
+		private final Assignment cElementAssignment_1_3 = (Assignment)cGroup_1.eContents().get(3);
+		private final CrossReference cElementNamedElementCrossReference_1_3_0 = (CrossReference)cElementAssignment_1_3.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_1_3_0_1 = (RuleCall)cElementNamedElementCrossReference_1_3_0.eContents().get(1);
+		
+		//ComElement fmlExpr::Expression:
+		//	LiteralPureReferenceElement ({fmlExpr::ValueElementSpecification.target=current} kind=(ValueDotFieldExpressionKind |
+		//	ValueArrowFieldExpressionKind) element=[fmlCommon::NamedElement|ESIdentifier])?
+		//	| {fmlExpr::ValueElementSpecification} target=LiteralReferenceMachineContext
+		//	// ( '.' | '->' ) element
+		//	kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind) element=[fmlCommon::NamedElement|ESIdentifier]
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralPureReferenceElement ({fmlExpr::ValueElementSpecification.target=current} kind=(ValueDotFieldExpressionKind |
+		//ValueArrowFieldExpressionKind) element=[fmlCommon::NamedElement|ESIdentifier])? | {fmlExpr::ValueElementSpecification}
+		//target=LiteralReferenceMachineContext // ( '.' | '->' ) element
+		//kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind) element=[fmlCommon::NamedElement|ESIdentifier]
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralPureReferenceElement ({fmlExpr::ValueElementSpecification.target=current} kind=(ValueDotFieldExpressionKind |
+		//ValueArrowFieldExpressionKind) element=[fmlCommon::NamedElement|ESIdentifier])?
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//LiteralPureReferenceElement
+		public RuleCall getLiteralPureReferenceElementParserRuleCall_0_0() { return cLiteralPureReferenceElementParserRuleCall_0_0; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind)
+		//element=[fmlCommon::NamedElement|ESIdentifier])?
+		public Group getGroup_0_1() { return cGroup_0_1; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_0_1_0() { return cValueElementSpecificationTargetAction_0_1_0; }
+		
+		//kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind)
+		public Assignment getKindAssignment_0_1_1() { return cKindAssignment_0_1_1; }
+		
+		//(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind)
+		public Alternatives getKindAlternatives_0_1_1_0() { return cKindAlternatives_0_1_1_0; }
+		
+		//ValueDotFieldExpressionKind
+		public RuleCall getKindValueDotFieldExpressionKindEnumRuleCall_0_1_1_0_0() { return cKindValueDotFieldExpressionKindEnumRuleCall_0_1_1_0_0; }
+		
+		//ValueArrowFieldExpressionKind
+		public RuleCall getKindValueArrowFieldExpressionKindEnumRuleCall_0_1_1_0_1() { return cKindValueArrowFieldExpressionKindEnumRuleCall_0_1_1_0_1; }
+		
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_0_1_2() { return cElementAssignment_0_1_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_0_1_2_0() { return cElementNamedElementCrossReference_0_1_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_0_1_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_0_1_2_0_1; }
+		
+		//{fmlExpr::ValueElementSpecification} target=LiteralReferenceMachineContext // ( '.' | '->' ) element
+		//kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind) element=[fmlCommon::NamedElement|ESIdentifier]
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::ValueElementSpecification}
+		public Action getValueElementSpecificationAction_1_0() { return cValueElementSpecificationAction_1_0; }
+		
+		//target=LiteralReferenceMachineContext
+		public Assignment getTargetAssignment_1_1() { return cTargetAssignment_1_1; }
+		
+		//LiteralReferenceMachineContext
+		public RuleCall getTargetLiteralReferenceMachineContextParserRuleCall_1_1_0() { return cTargetLiteralReferenceMachineContextParserRuleCall_1_1_0; }
+		
+		//// ( '.' | '->' ) element
+		//kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind)
+		public Assignment getKindAssignment_1_2() { return cKindAssignment_1_2; }
+		
+		//(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind)
+		public Alternatives getKindAlternatives_1_2_0() { return cKindAlternatives_1_2_0; }
+		
+		//ValueDotFieldExpressionKind
+		public RuleCall getKindValueDotFieldExpressionKindEnumRuleCall_1_2_0_0() { return cKindValueDotFieldExpressionKindEnumRuleCall_1_2_0_0; }
+		
+		//ValueArrowFieldExpressionKind
+		public RuleCall getKindValueArrowFieldExpressionKindEnumRuleCall_1_2_0_1() { return cKindValueArrowFieldExpressionKindEnumRuleCall_1_2_0_1; }
+		
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_1_3() { return cElementAssignment_1_3; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_1_3_0() { return cElementNamedElementCrossReference_1_3_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_1_3_0_1() { return cElementNamedElementESIdentifierParserRuleCall_1_3_0_1; }
+	}
+	public class TypeDefinitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cEnumerationTypeDefinitionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStructureTypeDefinitionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cUnionTypeDefinitionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cChoiceTypeDefinitionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cIntervalTypeDefinitionParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cCollectionTypeDefinitionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cOtherDataTypeDefinitionParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Sections Declarations Data Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		////TypeDefinition returns fmlType::DataType
+		////	: typedef?='type' name=ESIdentifier
+		////		( support=DataTypeReference ';'
+		////		| support=StructuredDataType
+		////		)
+		////	;
+		//TypeDefinition fmlType::DataType:
+		//	EnumerationTypeDefinition
+		//	| StructureTypeDefinition
+		//	| UnionTypeDefinition
+		//	| ChoiceTypeDefinition
+		//	| IntervalTypeDefinition
+		//	| CollectionTypeDefinition
+		//	| OtherDataTypeDefinition
+		@Override public ParserRule getRule() { return rule; }
+		
+		//EnumerationTypeDefinition | StructureTypeDefinition | UnionTypeDefinition | ChoiceTypeDefinition |
+		//IntervalTypeDefinition | CollectionTypeDefinition | OtherDataTypeDefinition
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//EnumerationTypeDefinition
+		public RuleCall getEnumerationTypeDefinitionParserRuleCall_0() { return cEnumerationTypeDefinitionParserRuleCall_0; }
+		
+		//StructureTypeDefinition
+		public RuleCall getStructureTypeDefinitionParserRuleCall_1() { return cStructureTypeDefinitionParserRuleCall_1; }
+		
+		//UnionTypeDefinition
+		public RuleCall getUnionTypeDefinitionParserRuleCall_2() { return cUnionTypeDefinitionParserRuleCall_2; }
+		
+		//ChoiceTypeDefinition
+		public RuleCall getChoiceTypeDefinitionParserRuleCall_3() { return cChoiceTypeDefinitionParserRuleCall_3; }
+		
+		//IntervalTypeDefinition
+		public RuleCall getIntervalTypeDefinitionParserRuleCall_4() { return cIntervalTypeDefinitionParserRuleCall_4; }
+		
+		//CollectionTypeDefinition
+		public RuleCall getCollectionTypeDefinitionParserRuleCall_5() { return cCollectionTypeDefinitionParserRuleCall_5; }
+		
+		//OtherDataTypeDefinition
+		public RuleCall getOtherDataTypeDefinitionParserRuleCall_6() { return cOtherDataTypeDefinitionParserRuleCall_6; }
+	}
+	public class TypeDefinitionImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TypeDefinitionImpl");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cEnumerationTypeDefinitionImplParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStructureTypeDefinitionImplParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cUnionTypeDefinitionImplParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cChoiceTypeDefinitionImplParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cIntervalTypeDefinitionImplParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cCollectionTypeDefinitionImplParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cOtherDataTypeDefinitionImplParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		
+		////TypeDefinitionImpl returns fmlType::DataTypeReference
+		////	: name=ESIdentifier
+		////		( support=DataTypeReference ';'
+		////		| support=StructuredDataType
+		////		)
+		////	;
+		//TypeDefinitionImpl fmlType::DataType:
+		//	EnumerationTypeDefinitionImpl
+		//	| StructureTypeDefinitionImpl
+		//	| UnionTypeDefinitionImpl
+		//	| ChoiceTypeDefinitionImpl
+		//	| IntervalTypeDefinitionImpl
+		//	| CollectionTypeDefinitionImpl
+		//	| OtherDataTypeDefinitionImpl
+		@Override public ParserRule getRule() { return rule; }
+		
+		//EnumerationTypeDefinitionImpl | StructureTypeDefinitionImpl | UnionTypeDefinitionImpl | ChoiceTypeDefinitionImpl |
+		//IntervalTypeDefinitionImpl | CollectionTypeDefinitionImpl | OtherDataTypeDefinitionImpl
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//EnumerationTypeDefinitionImpl
+		public RuleCall getEnumerationTypeDefinitionImplParserRuleCall_0() { return cEnumerationTypeDefinitionImplParserRuleCall_0; }
+		
+		//StructureTypeDefinitionImpl
+		public RuleCall getStructureTypeDefinitionImplParserRuleCall_1() { return cStructureTypeDefinitionImplParserRuleCall_1; }
+		
+		//UnionTypeDefinitionImpl
+		public RuleCall getUnionTypeDefinitionImplParserRuleCall_2() { return cUnionTypeDefinitionImplParserRuleCall_2; }
+		
+		//ChoiceTypeDefinitionImpl
+		public RuleCall getChoiceTypeDefinitionImplParserRuleCall_3() { return cChoiceTypeDefinitionImplParserRuleCall_3; }
+		
+		//IntervalTypeDefinitionImpl
+		public RuleCall getIntervalTypeDefinitionImplParserRuleCall_4() { return cIntervalTypeDefinitionImplParserRuleCall_4; }
+		
+		//CollectionTypeDefinitionImpl
+		public RuleCall getCollectionTypeDefinitionImplParserRuleCall_5() { return cCollectionTypeDefinitionImplParserRuleCall_5; }
+		
+		//OtherDataTypeDefinitionImpl
+		public RuleCall getOtherDataTypeDefinitionImplParserRuleCall_6() { return cOtherDataTypeDefinitionImplParserRuleCall_6; }
+	}
+	public class DataTypeMultiplicityElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralIntegerExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralReferenceElementParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//DataTypeMultiplicity fmlExpr::Expression:
+		//	LiteralIntegerExpression
+		//	| LiteralReferenceElement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralIntegerExpression | LiteralReferenceElement
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralIntegerExpression
+		public RuleCall getLiteralIntegerExpressionParserRuleCall_0() { return cLiteralIntegerExpressionParserRuleCall_0; }
+		
+		//LiteralReferenceElement
+		public RuleCall getLiteralReferenceElementParserRuleCall_1() { return cLiteralReferenceElementParserRuleCall_1; }
+	}
+	public class DataTypeReferenceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DataTypeReference");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final RuleCall cSimpleDataTypeParserRuleCall_0_0 = (RuleCall)cGroup_0.eContents().get(0);
+		private final Group cGroup_0_1 = (Group)cGroup_0.eContents().get(1);
+		private final Action cDataTypeReferenceSupportAction_0_1_0 = (Action)cGroup_0_1.eContents().get(0);
+		private final Keyword cLeftSquareBracketKeyword_0_1_1 = (Keyword)cGroup_0_1.eContents().get(1);
+		private final Assignment cMultiplicityAssignment_0_1_2 = (Assignment)cGroup_0_1.eContents().get(2);
+		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0 = (RuleCall)cMultiplicityAssignment_0_1_2.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_0_1_3 = (Keyword)cGroup_0_1.eContents().get(3);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Action cDataTypeReferenceAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cTyperefAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final CrossReference cTyperefDataTypeCrossReference_1_1_0 = (CrossReference)cTyperefAssignment_1_1.eContents().get(0);
+		private final RuleCall cTyperefDataTypeESUfidParserRuleCall_1_1_0_1 = (RuleCall)cTyperefDataTypeCrossReference_1_1_0.eContents().get(1);
+		private final Group cGroup_1_2 = (Group)cGroup_1.eContents().get(2);
+		private final Keyword cLeftSquareBracketKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
+		private final Assignment cMultiplicityAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
+		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0 = (RuleCall)cMultiplicityAssignment_1_2_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_1_2_2 = (Keyword)cGroup_1_2.eContents().get(2);
+		
+		//DataTypeReference fmlType::DataType:
+		//	SimpleDataType ({fmlType::DataTypeReference.support=current}
+		//	'[' multiplicity=DataTypeMultiplicity ']')?
+		//	| {fmlType::DataTypeReference} typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//SimpleDataType ({fmlType::DataTypeReference.support=current} '[' multiplicity=DataTypeMultiplicity ']')? |
+		//{fmlType::DataTypeReference} typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//SimpleDataType ({fmlType::DataTypeReference.support=current} '[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//SimpleDataType
+		public RuleCall getSimpleDataTypeParserRuleCall_0_0() { return cSimpleDataTypeParserRuleCall_0_0; }
+		
+		//({fmlType::DataTypeReference.support=current} '[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_0_1() { return cGroup_0_1; }
+		
+		//{fmlType::DataTypeReference.support=current}
+		public Action getDataTypeReferenceSupportAction_0_1_0() { return cDataTypeReferenceSupportAction_0_1_0; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_0_1_1() { return cLeftSquareBracketKeyword_0_1_1; }
+		
+		//multiplicity=DataTypeMultiplicity
+		public Assignment getMultiplicityAssignment_0_1_2() { return cMultiplicityAssignment_0_1_2; }
+		
+		//DataTypeMultiplicity
+		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_0_1_3() { return cRightSquareBracketKeyword_0_1_3; }
+		
+		//{fmlType::DataTypeReference} typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlType::DataTypeReference}
+		public Action getDataTypeReferenceAction_1_0() { return cDataTypeReferenceAction_1_0; }
+		
+		//typeref=[fmlType::DataType|ESUfid]
+		public Assignment getTyperefAssignment_1_1() { return cTyperefAssignment_1_1; }
+		
+		//[fmlType::DataType|ESUfid]
+		public CrossReference getTyperefDataTypeCrossReference_1_1_0() { return cTyperefDataTypeCrossReference_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getTyperefDataTypeESUfidParserRuleCall_1_1_0_1() { return cTyperefDataTypeESUfidParserRuleCall_1_1_0_1; }
+		
+		//('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_1_2() { return cGroup_1_2; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_1_2_0() { return cLeftSquareBracketKeyword_1_2_0; }
+		
+		//multiplicity=DataTypeMultiplicity
+		public Assignment getMultiplicityAssignment_1_2_1() { return cMultiplicityAssignment_1_2_1; }
+		
+		//DataTypeMultiplicity
+		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_1_2_2() { return cRightSquareBracketKeyword_1_2_2; }
+	}
+	public class OtherDataTypeDefinitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OtherDataTypeDefinition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cDataTypeReferenceAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Alternatives cAlternatives_5 = (Alternatives)cGroup.eContents().get(5);
+		private final Group cGroup_5_0 = (Group)cAlternatives_5.eContents().get(0);
+		private final Assignment cSupportAssignment_5_0_0 = (Assignment)cGroup_5_0.eContents().get(0);
+		private final RuleCall cSupportPrimitiveTypeParserRuleCall_5_0_0_0 = (RuleCall)cSupportAssignment_5_0_0.eContents().get(0);
+		private final Group cGroup_5_0_1 = (Group)cGroup_5_0.eContents().get(1);
+		private final Keyword cLeftSquareBracketKeyword_5_0_1_0 = (Keyword)cGroup_5_0_1.eContents().get(0);
+		private final Assignment cMultiplicityAssignment_5_0_1_1 = (Assignment)cGroup_5_0_1.eContents().get(1);
+		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0 = (RuleCall)cMultiplicityAssignment_5_0_1_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_5_0_1_2 = (Keyword)cGroup_5_0_1.eContents().get(2);
+		private final Group cGroup_5_1 = (Group)cAlternatives_5.eContents().get(1);
+		private final Assignment cTyperefAssignment_5_1_0 = (Assignment)cGroup_5_1.eContents().get(0);
+		private final CrossReference cTyperefDataTypeCrossReference_5_1_0_0 = (CrossReference)cTyperefAssignment_5_1_0.eContents().get(0);
+		private final RuleCall cTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1 = (RuleCall)cTyperefDataTypeCrossReference_5_1_0_0.eContents().get(1);
+		private final Group cGroup_5_1_1 = (Group)cGroup_5_1.eContents().get(1);
+		private final Keyword cLeftSquareBracketKeyword_5_1_1_0 = (Keyword)cGroup_5_1_1.eContents().get(0);
+		private final Assignment cMultiplicityAssignment_5_1_1_1 = (Assignment)cGroup_5_1_1.eContents().get(1);
+		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0 = (RuleCall)cMultiplicityAssignment_5_1_1_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_5_1_1_2 = (Keyword)cGroup_5_1_1.eContents().get(2);
+		private final Assignment cTypedefAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final Keyword cTypedefSemicolonKeyword_6_0 = (Keyword)cTypedefAssignment_6.eContents().get(0);
+		
+		//OtherDataTypeDefinition fmlType::DataTypeReference:
+		//	{fmlType::DataTypeReference} visibility=VisibilityKind? 'type'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? (support=PrimitiveType ('[' multiplicity=DataTypeMultiplicity
+		//	']')?
+		//	| typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?) typedef?=';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::DataTypeReference} visibility=VisibilityKind? 'type' name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//(support=PrimitiveType ('[' multiplicity=DataTypeMultiplicity ']')? | typeref=[fmlType::DataType|ESUfid] ('['
+		//multiplicity=DataTypeMultiplicity ']')?) typedef?=';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::DataTypeReference}
+		public Action getDataTypeReferenceAction_0() { return cDataTypeReferenceAction_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
+		
+		//'type'
+		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//(support=PrimitiveType ('[' multiplicity=DataTypeMultiplicity ']')? | typeref=[fmlType::DataType|ESUfid] ('['
+		//multiplicity=DataTypeMultiplicity ']')?)
+		public Alternatives getAlternatives_5() { return cAlternatives_5; }
+		
+		//support=PrimitiveType ('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_5_0() { return cGroup_5_0; }
+		
+		//support=PrimitiveType
+		public Assignment getSupportAssignment_5_0_0() { return cSupportAssignment_5_0_0; }
+		
+		//PrimitiveType
+		public RuleCall getSupportPrimitiveTypeParserRuleCall_5_0_0_0() { return cSupportPrimitiveTypeParserRuleCall_5_0_0_0; }
+		
+		//('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_5_0_1() { return cGroup_5_0_1; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_5_0_1_0() { return cLeftSquareBracketKeyword_5_0_1_0; }
+		
+		//multiplicity=DataTypeMultiplicity
+		public Assignment getMultiplicityAssignment_5_0_1_1() { return cMultiplicityAssignment_5_0_1_1; }
+		
+		//DataTypeMultiplicity
+		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_5_0_1_2() { return cRightSquareBracketKeyword_5_0_1_2; }
+		
+		//typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_5_1() { return cGroup_5_1; }
+		
+		//typeref=[fmlType::DataType|ESUfid]
+		public Assignment getTyperefAssignment_5_1_0() { return cTyperefAssignment_5_1_0; }
+		
+		//[fmlType::DataType|ESUfid]
+		public CrossReference getTyperefDataTypeCrossReference_5_1_0_0() { return cTyperefDataTypeCrossReference_5_1_0_0; }
+		
+		//ESUfid
+		public RuleCall getTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1() { return cTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1; }
+		
+		//('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_5_1_1() { return cGroup_5_1_1; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_5_1_1_0() { return cLeftSquareBracketKeyword_5_1_1_0; }
+		
+		//multiplicity=DataTypeMultiplicity
+		public Assignment getMultiplicityAssignment_5_1_1_1() { return cMultiplicityAssignment_5_1_1_1; }
+		
+		//DataTypeMultiplicity
+		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_5_1_1_2() { return cRightSquareBracketKeyword_5_1_1_2; }
+		
+		//typedef?=';'
+		public Assignment getTypedefAssignment_6() { return cTypedefAssignment_6; }
+		
+		//';'
+		public Keyword getTypedefSemicolonKeyword_6_0() { return cTypedefSemicolonKeyword_6_0; }
+	}
+	public class OtherDataTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OtherDataTypeDefinitionImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cDataTypeReferenceAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Assignment cSupportAssignment_3_0_0 = (Assignment)cGroup_3_0.eContents().get(0);
+		private final RuleCall cSupportPrimitiveTypeParserRuleCall_3_0_0_0 = (RuleCall)cSupportAssignment_3_0_0.eContents().get(0);
+		private final Group cGroup_3_0_1 = (Group)cGroup_3_0.eContents().get(1);
+		private final Keyword cLeftSquareBracketKeyword_3_0_1_0 = (Keyword)cGroup_3_0_1.eContents().get(0);
+		private final Assignment cMultiplicityAssignment_3_0_1_1 = (Assignment)cGroup_3_0_1.eContents().get(1);
+		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_3_0_1_1_0 = (RuleCall)cMultiplicityAssignment_3_0_1_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_3_0_1_2 = (Keyword)cGroup_3_0_1.eContents().get(2);
+		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
+		private final Assignment cTyperefAssignment_3_1_0 = (Assignment)cGroup_3_1.eContents().get(0);
+		private final CrossReference cTyperefDataTypeCrossReference_3_1_0_0 = (CrossReference)cTyperefAssignment_3_1_0.eContents().get(0);
+		private final RuleCall cTyperefDataTypeESUfidParserRuleCall_3_1_0_0_1 = (RuleCall)cTyperefDataTypeCrossReference_3_1_0_0.eContents().get(1);
+		private final Group cGroup_3_1_1 = (Group)cGroup_3_1.eContents().get(1);
+		private final Keyword cLeftSquareBracketKeyword_3_1_1_0 = (Keyword)cGroup_3_1_1.eContents().get(0);
+		private final Assignment cMultiplicityAssignment_3_1_1_1 = (Assignment)cGroup_3_1_1.eContents().get(1);
+		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_3_1_1_1_0 = (RuleCall)cMultiplicityAssignment_3_1_1_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_3_1_1_2 = (Keyword)cGroup_3_1_1.eContents().get(2);
+		private final Assignment cTypedefAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final Keyword cTypedefSemicolonKeyword_4_0 = (Keyword)cTypedefAssignment_4.eContents().get(0);
+		
+		//OtherDataTypeDefinitionImpl fmlType::DataTypeReference:
+		//	{fmlType::DataTypeReference} name=ESIdentifier unrestrictedName=UnrestrictedName? (support=PrimitiveType ('['
+		//	multiplicity=DataTypeMultiplicity ']')?
+		//	| typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?) typedef?=';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::DataTypeReference} name=ESIdentifier unrestrictedName=UnrestrictedName? (support=PrimitiveType ('['
+		//multiplicity=DataTypeMultiplicity ']')? | typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity
+		//']')?) typedef?=';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::DataTypeReference}
+		public Action getDataTypeReferenceAction_0() { return cDataTypeReferenceAction_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//(support=PrimitiveType ('[' multiplicity=DataTypeMultiplicity ']')? | typeref=[fmlType::DataType|ESUfid] ('['
+		//multiplicity=DataTypeMultiplicity ']')?)
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//support=PrimitiveType ('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//support=PrimitiveType
+		public Assignment getSupportAssignment_3_0_0() { return cSupportAssignment_3_0_0; }
+		
+		//PrimitiveType
+		public RuleCall getSupportPrimitiveTypeParserRuleCall_3_0_0_0() { return cSupportPrimitiveTypeParserRuleCall_3_0_0_0; }
+		
+		//('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_3_0_1() { return cGroup_3_0_1; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_3_0_1_0() { return cLeftSquareBracketKeyword_3_0_1_0; }
+		
+		//multiplicity=DataTypeMultiplicity
+		public Assignment getMultiplicityAssignment_3_0_1_1() { return cMultiplicityAssignment_3_0_1_1; }
+		
+		//DataTypeMultiplicity
+		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_3_0_1_1_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_3_0_1_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_3_0_1_2() { return cRightSquareBracketKeyword_3_0_1_2; }
+		
+		//typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//typeref=[fmlType::DataType|ESUfid]
+		public Assignment getTyperefAssignment_3_1_0() { return cTyperefAssignment_3_1_0; }
+		
+		//[fmlType::DataType|ESUfid]
+		public CrossReference getTyperefDataTypeCrossReference_3_1_0_0() { return cTyperefDataTypeCrossReference_3_1_0_0; }
+		
+		//ESUfid
+		public RuleCall getTyperefDataTypeESUfidParserRuleCall_3_1_0_0_1() { return cTyperefDataTypeESUfidParserRuleCall_3_1_0_0_1; }
+		
+		//('[' multiplicity=DataTypeMultiplicity ']')?
+		public Group getGroup_3_1_1() { return cGroup_3_1_1; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_3_1_1_0() { return cLeftSquareBracketKeyword_3_1_1_0; }
+		
+		//multiplicity=DataTypeMultiplicity
+		public Assignment getMultiplicityAssignment_3_1_1_1() { return cMultiplicityAssignment_3_1_1_1; }
+		
+		//DataTypeMultiplicity
+		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_3_1_1_1_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_3_1_1_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_3_1_1_2() { return cRightSquareBracketKeyword_3_1_1_2; }
+		
+		//typedef?=';'
+		public Assignment getTypedefAssignment_4() { return cTypedefAssignment_4; }
+		
+		//';'
+		public Keyword getTypedefSemicolonKeyword_4_0() { return cTypedefSemicolonKeyword_4_0; }
+	}
+	public class DataTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DataType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cDataTypeReferenceParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStructuredDataTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//DataType fmlType::DataType:
+		//	DataTypeReference
+		//	| StructuredDataType
+		@Override public ParserRule getRule() { return rule; }
+		
+		//DataTypeReference | StructuredDataType
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//DataTypeReference
+		public RuleCall getDataTypeReferenceParserRuleCall_0() { return cDataTypeReferenceParserRuleCall_0; }
+		
+		//StructuredDataType
+		public RuleCall getStructuredDataTypeParserRuleCall_1() { return cStructuredDataTypeParserRuleCall_1; }
+	}
+	public class SimpleDataTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SimpleDataType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cPrimitiveTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cIntervalTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cCollectionTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		
+		//SimpleDataType fmlType::DataType:
+		//	PrimitiveType
+		//	| IntervalType
+		//	| CollectionType
+		@Override public ParserRule getRule() { return rule; }
+		
+		//PrimitiveType | IntervalType | CollectionType
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//PrimitiveType
+		public RuleCall getPrimitiveTypeParserRuleCall_0() { return cPrimitiveTypeParserRuleCall_0; }
+		
+		//IntervalType
+		public RuleCall getIntervalTypeParserRuleCall_1() { return cIntervalTypeParserRuleCall_1; }
+		
+		//CollectionType
+		public RuleCall getCollectionTypeParserRuleCall_2() { return cCollectionTypeParserRuleCall_2; }
+	}
+	public class StructuredDataTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StructuredDataType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cEnumerationTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cStructureTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cUnionTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cChoiceTypeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		
+		//StructuredDataType fmlType::DataType:
+		//	EnumerationType
+		//	| StructureType
+		//	| UnionType
+		//	| ChoiceType
+		@Override public ParserRule getRule() { return rule; }
+		
+		//EnumerationType | StructureType | UnionType | ChoiceType
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//EnumerationType
+		public RuleCall getEnumerationTypeParserRuleCall_0() { return cEnumerationTypeParserRuleCall_0; }
+		
+		//StructureType
+		public RuleCall getStructureTypeParserRuleCall_1() { return cStructureTypeParserRuleCall_1; }
+		
+		//UnionType
+		public RuleCall getUnionTypeParserRuleCall_2() { return cUnionTypeParserRuleCall_2; }
+		
+		//ChoiceType
+		public RuleCall getChoiceTypeParserRuleCall_3() { return cChoiceTypeParserRuleCall_3; }
+	}
+	public class PrimitiveTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cPrimitiveNumberTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cOtherPrimitiveTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		////PrimitiveType returns fmlType::PrimitiveType
+		////	: kind=NumberPrimitiveTypeKind ( '<' ( 'bit:' )? bitSize = EInt '>' )?
+		////	| kind=OtherPrimitiveKind
+		////	;
+		////
+		////enum OtherPrimitiveKind returns fmlType::PrimitiveTypeKind
+		////	: BOOLEAN   = 'boolean'
+		////	| BOOLEAN   = 'bool'
+		////	| CHAR      = 'char'
+		////	| STRING    = 'string'
+		////	| BUFFER    = 'buffer'
+		////	| MESSAGE   = 'message'
+		////	| PORT      = 'port'
+		////	| MACHINE   = 'machine'
+		////	;
+		////
+		////
+		////enum NumberPrimitiveTypeKind returns fmlType::PrimitiveTypeKind
+		////	: INTEGER   = 'integer'
+		////	| RATIONAL  = 'rational'
+		////	| FLOAT     = 'float'
+		////	| DOUBLE    = 'double'
+		////	| REAL      = 'real'
+		////
+		////	| TIME      = 'time'
+		////
+		////	| UINTEGER  = 'uinteger'
+		////	| URATIONAL = 'urational'
+		////	| UFLOAT    = 'ufloat'
+		////	| UDOUBLE   = 'udouble'
+		////	| UREAL     = 'ureal'
+		////
+		////	| INT       = 'int'
+		////	| RAT       = 'rat'
+		////
+		////	| UINT      = 'uint'
+		////	| URAT      = 'urat'
+		////	;
+		//PrimitiveType fmlType::PrimitiveType:
+		//	PrimitiveNumberType
+		//	| OtherPrimitiveType
+		@Override public ParserRule getRule() { return rule; }
+		
+		//PrimitiveNumberType | OtherPrimitiveType
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//PrimitiveNumberType
+		public RuleCall getPrimitiveNumberTypeParserRuleCall_0() { return cPrimitiveNumberTypeParserRuleCall_0; }
+		
+		//OtherPrimitiveType
+		public RuleCall getOtherPrimitiveTypeParserRuleCall_1() { return cOtherPrimitiveTypeParserRuleCall_1; }
+	}
+	public class PrimitiveNumberTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cPrimitiveIntegerTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cPrimitiveRationalTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cPrimitiveFloatTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cPrimitiveRealTypeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cPrimitiveTimeTypeParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		
+		//PrimitiveNumberType fmlType::PrimitiveNumberType:
+		//	PrimitiveIntegerType
+		//	| PrimitiveRationalType
+		//	| PrimitiveFloatType
+		//	| PrimitiveRealType
+		//	| PrimitiveTimeType
+		@Override public ParserRule getRule() { return rule; }
+		
+		//PrimitiveIntegerType | PrimitiveRationalType | PrimitiveFloatType | PrimitiveRealType | PrimitiveTimeType
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//PrimitiveIntegerType
+		public RuleCall getPrimitiveIntegerTypeParserRuleCall_0() { return cPrimitiveIntegerTypeParserRuleCall_0; }
+		
+		//PrimitiveRationalType
+		public RuleCall getPrimitiveRationalTypeParserRuleCall_1() { return cPrimitiveRationalTypeParserRuleCall_1; }
+		
+		//PrimitiveFloatType
+		public RuleCall getPrimitiveFloatTypeParserRuleCall_2() { return cPrimitiveFloatTypeParserRuleCall_2; }
+		
+		//PrimitiveRealType
+		public RuleCall getPrimitiveRealTypeParserRuleCall_3() { return cPrimitiveRealTypeParserRuleCall_3; }
+		
+		//PrimitiveTimeType
+		public RuleCall getPrimitiveTimeTypeParserRuleCall_4() { return cPrimitiveTimeTypeParserRuleCall_4; }
+	}
+	public class PrimitiveIntegerTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveIntegerType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPrimitiveIntegerTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSignAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cSignPrimitiveNumberSignEnumRuleCall_1_0 = (RuleCall)cSignAssignment_1.eContents().get(0);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Keyword cIntegerKeyword_2_0 = (Keyword)cAlternatives_2.eContents().get(0);
+		private final Keyword cUintegerKeyword_2_1 = (Keyword)cAlternatives_2.eContents().get(1);
+		private final Keyword cIntKeyword_2_2 = (Keyword)cAlternatives_2.eContents().get(2);
+		private final Keyword cUintKeyword_2_3 = (Keyword)cAlternatives_2.eContents().get(3);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Keyword cColonKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cSizeAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cSizeEIntParserRuleCall_3_0_1_0 = (RuleCall)cSizeAssignment_3_0_1.eContents().get(0);
+		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Keyword cSizeKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
+		private final Assignment cSizeAssignment_3_1_2 = (Assignment)cGroup_3_1.eContents().get(2);
+		private final RuleCall cSizeEIntParserRuleCall_3_1_2_0 = (RuleCall)cSizeAssignment_3_1_2.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_3_1_3 = (Keyword)cGroup_3_1.eContents().get(3);
+		
+		//PrimitiveIntegerType fmlType::PrimitiveIntegerType:
+		//	{fmlType::PrimitiveIntegerType} sign=PrimitiveNumberSign? ('integer'
+		//	| 'uinteger'
+		//	| 'int'
+		//	| 'uint') (':' size=EInt
+		//	| '<' 'size:'? size=EInt '>')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::PrimitiveIntegerType} sign=PrimitiveNumberSign? ('integer' | 'uinteger' | 'int' | 'uint') (':' size=EInt | '<'
+		//'size:'? size=EInt '>')?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::PrimitiveIntegerType}
+		public Action getPrimitiveIntegerTypeAction_0() { return cPrimitiveIntegerTypeAction_0; }
+		
+		//sign=PrimitiveNumberSign?
+		public Assignment getSignAssignment_1() { return cSignAssignment_1; }
+		
+		//PrimitiveNumberSign
+		public RuleCall getSignPrimitiveNumberSignEnumRuleCall_1_0() { return cSignPrimitiveNumberSignEnumRuleCall_1_0; }
+		
+		//('integer' | 'uinteger' | 'int' | 'uint')
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//'integer'
+		public Keyword getIntegerKeyword_2_0() { return cIntegerKeyword_2_0; }
+		
+		//'uinteger'
+		public Keyword getUintegerKeyword_2_1() { return cUintegerKeyword_2_1; }
+		
+		//'int'
+		public Keyword getIntKeyword_2_2() { return cIntKeyword_2_2; }
+		
+		//'uint'
+		public Keyword getUintKeyword_2_3() { return cUintKeyword_2_3; }
+		
+		//(':' size=EInt | '<' 'size:'? size=EInt '>')?
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//':' size=EInt
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//':'
+		public Keyword getColonKeyword_3_0_0() { return cColonKeyword_3_0_0; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_3_0_1() { return cSizeAssignment_3_0_1; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_3_0_1_0() { return cSizeEIntParserRuleCall_3_0_1_0; }
+		
+		//'<' 'size:'? size=EInt '>'
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_3_1_0() { return cLessThanSignKeyword_3_1_0; }
+		
+		//'size:'?
+		public Keyword getSizeKeyword_3_1_1() { return cSizeKeyword_3_1_1; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_3_1_2() { return cSizeAssignment_3_1_2; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_3_1_2_0() { return cSizeEIntParserRuleCall_3_1_2_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_3_1_3() { return cGreaterThanSignKeyword_3_1_3; }
+	}
+	public class PrimitiveRationalTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveRationalType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPrimitiveRationalTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSignAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cSignPrimitiveNumberSignEnumRuleCall_1_0 = (RuleCall)cSignAssignment_1.eContents().get(0);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Keyword cRationalKeyword_2_0 = (Keyword)cAlternatives_2.eContents().get(0);
+		private final Keyword cUrationalKeyword_2_1 = (Keyword)cAlternatives_2.eContents().get(1);
+		private final Keyword cRatKeyword_2_2 = (Keyword)cAlternatives_2.eContents().get(2);
+		private final Keyword cUratKeyword_2_3 = (Keyword)cAlternatives_2.eContents().get(3);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Keyword cColonKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cSizeAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cSizeEIntParserRuleCall_3_0_1_0 = (RuleCall)cSizeAssignment_3_0_1.eContents().get(0);
+		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Keyword cSizeKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
+		private final Assignment cSizeAssignment_3_1_2 = (Assignment)cGroup_3_1.eContents().get(2);
+		private final RuleCall cSizeEIntParserRuleCall_3_1_2_0 = (RuleCall)cSizeAssignment_3_1_2.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_3_1_3 = (Keyword)cGroup_3_1.eContents().get(3);
+		
+		//PrimitiveRationalType fmlType::PrimitiveRationalType:
+		//	{fmlType::PrimitiveRationalType} sign=PrimitiveNumberSign? ('rational'
+		//	| 'urational'
+		//	| 'rat'
+		//	| 'urat') (':' size=EInt
+		//	| '<' 'size:'? size=EInt '>')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::PrimitiveRationalType} sign=PrimitiveNumberSign? ('rational' | 'urational' | 'rat' | 'urat') (':' size=EInt |
+		//'<' 'size:'? size=EInt '>')?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::PrimitiveRationalType}
+		public Action getPrimitiveRationalTypeAction_0() { return cPrimitiveRationalTypeAction_0; }
+		
+		//sign=PrimitiveNumberSign?
+		public Assignment getSignAssignment_1() { return cSignAssignment_1; }
+		
+		//PrimitiveNumberSign
+		public RuleCall getSignPrimitiveNumberSignEnumRuleCall_1_0() { return cSignPrimitiveNumberSignEnumRuleCall_1_0; }
+		
+		//('rational' | 'urational' | 'rat' | 'urat')
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//'rational'
+		public Keyword getRationalKeyword_2_0() { return cRationalKeyword_2_0; }
+		
+		//'urational'
+		public Keyword getUrationalKeyword_2_1() { return cUrationalKeyword_2_1; }
+		
+		//'rat'
+		public Keyword getRatKeyword_2_2() { return cRatKeyword_2_2; }
+		
+		//'urat'
+		public Keyword getUratKeyword_2_3() { return cUratKeyword_2_3; }
+		
+		//(':' size=EInt | '<' 'size:'? size=EInt '>')?
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//':' size=EInt
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//':'
+		public Keyword getColonKeyword_3_0_0() { return cColonKeyword_3_0_0; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_3_0_1() { return cSizeAssignment_3_0_1; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_3_0_1_0() { return cSizeEIntParserRuleCall_3_0_1_0; }
+		
+		//'<' 'size:'? size=EInt '>'
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_3_1_0() { return cLessThanSignKeyword_3_1_0; }
+		
+		//'size:'?
+		public Keyword getSizeKeyword_3_1_1() { return cSizeKeyword_3_1_1; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_3_1_2() { return cSizeAssignment_3_1_2; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_3_1_2_0() { return cSizeEIntParserRuleCall_3_1_2_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_3_1_3() { return cGreaterThanSignKeyword_3_1_3; }
+	}
+	public class PrimitiveFloatTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveFloatType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPrimitiveFloatTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSignAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cSignPrimitiveNumberSignEnumRuleCall_1_0 = (RuleCall)cSignAssignment_1.eContents().get(0);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Keyword cFloatKeyword_2_0 = (Keyword)cAlternatives_2.eContents().get(0);
+		private final Keyword cUfloatKeyword_2_1 = (Keyword)cAlternatives_2.eContents().get(1);
+		private final Keyword cDoubleKeyword_2_2 = (Keyword)cAlternatives_2.eContents().get(2);
+		private final Keyword cUdoubleKeyword_2_3 = (Keyword)cAlternatives_2.eContents().get(3);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Keyword cColonKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cSizeAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cSizeEIntParserRuleCall_3_0_1_0 = (RuleCall)cSizeAssignment_3_0_1.eContents().get(0);
+		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Keyword cSizeKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
+		private final Assignment cSizeAssignment_3_1_2 = (Assignment)cGroup_3_1.eContents().get(2);
+		private final RuleCall cSizeEIntParserRuleCall_3_1_2_0 = (RuleCall)cSizeAssignment_3_1_2.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_3_1_3 = (Keyword)cGroup_3_1.eContents().get(3);
+		
+		//PrimitiveFloatType fmlType::PrimitiveFloatType:
+		//	{fmlType::PrimitiveFloatType} sign=PrimitiveNumberSign? ('float'
+		//	| 'ufloat'
+		//	| 'double'
+		//	| 'udouble') (':' size=EInt
+		//	| '<' 'size:'? size=EInt '>')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::PrimitiveFloatType} sign=PrimitiveNumberSign? ('float' | 'ufloat' | 'double' | 'udouble') (':' size=EInt | '<'
+		//'size:'? size=EInt '>')?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::PrimitiveFloatType}
+		public Action getPrimitiveFloatTypeAction_0() { return cPrimitiveFloatTypeAction_0; }
+		
+		//sign=PrimitiveNumberSign?
+		public Assignment getSignAssignment_1() { return cSignAssignment_1; }
+		
+		//PrimitiveNumberSign
+		public RuleCall getSignPrimitiveNumberSignEnumRuleCall_1_0() { return cSignPrimitiveNumberSignEnumRuleCall_1_0; }
+		
+		//('float' | 'ufloat' | 'double' | 'udouble')
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//'float'
+		public Keyword getFloatKeyword_2_0() { return cFloatKeyword_2_0; }
+		
+		//'ufloat'
+		public Keyword getUfloatKeyword_2_1() { return cUfloatKeyword_2_1; }
+		
+		//'double'
+		public Keyword getDoubleKeyword_2_2() { return cDoubleKeyword_2_2; }
+		
+		//'udouble'
+		public Keyword getUdoubleKeyword_2_3() { return cUdoubleKeyword_2_3; }
+		
+		//(':' size=EInt | '<' 'size:'? size=EInt '>')?
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//':' size=EInt
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//':'
+		public Keyword getColonKeyword_3_0_0() { return cColonKeyword_3_0_0; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_3_0_1() { return cSizeAssignment_3_0_1; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_3_0_1_0() { return cSizeEIntParserRuleCall_3_0_1_0; }
+		
+		//'<' 'size:'? size=EInt '>'
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_3_1_0() { return cLessThanSignKeyword_3_1_0; }
+		
+		//'size:'?
+		public Keyword getSizeKeyword_3_1_1() { return cSizeKeyword_3_1_1; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_3_1_2() { return cSizeAssignment_3_1_2; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_3_1_2_0() { return cSizeEIntParserRuleCall_3_1_2_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_3_1_3() { return cGreaterThanSignKeyword_3_1_3; }
+	}
+	public class PrimitiveRealTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveRealType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPrimitiveRealTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cSignAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cSignPrimitiveNumberSignEnumRuleCall_1_0 = (RuleCall)cSignAssignment_1.eContents().get(0);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Keyword cRealKeyword_2_0 = (Keyword)cAlternatives_2.eContents().get(0);
+		private final Keyword cUrealKeyword_2_1 = (Keyword)cAlternatives_2.eContents().get(1);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Keyword cColonKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cSizeAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cSizeEIntParserRuleCall_3_0_1_0 = (RuleCall)cSizeAssignment_3_0_1.eContents().get(0);
+		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Keyword cSizeKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
+		private final Assignment cSizeAssignment_3_1_2 = (Assignment)cGroup_3_1.eContents().get(2);
+		private final RuleCall cSizeEIntParserRuleCall_3_1_2_0 = (RuleCall)cSizeAssignment_3_1_2.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_3_1_3 = (Keyword)cGroup_3_1.eContents().get(3);
+		
+		//PrimitiveRealType fmlType::PrimitiveRealType:
+		//	{fmlType::PrimitiveRealType} sign=PrimitiveNumberSign? ('real'
+		//	| 'ureal') (':' size=EInt
+		//	| '<' 'size:'? size=EInt '>')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::PrimitiveRealType} sign=PrimitiveNumberSign? ('real' | 'ureal') (':' size=EInt | '<' 'size:'? size=EInt '>')?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::PrimitiveRealType}
+		public Action getPrimitiveRealTypeAction_0() { return cPrimitiveRealTypeAction_0; }
+		
+		//sign=PrimitiveNumberSign?
+		public Assignment getSignAssignment_1() { return cSignAssignment_1; }
+		
+		//PrimitiveNumberSign
+		public RuleCall getSignPrimitiveNumberSignEnumRuleCall_1_0() { return cSignPrimitiveNumberSignEnumRuleCall_1_0; }
+		
+		//('real' | 'ureal')
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//'real'
+		public Keyword getRealKeyword_2_0() { return cRealKeyword_2_0; }
+		
+		//'ureal'
+		public Keyword getUrealKeyword_2_1() { return cUrealKeyword_2_1; }
+		
+		//(':' size=EInt | '<' 'size:'? size=EInt '>')?
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//':' size=EInt
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//':'
+		public Keyword getColonKeyword_3_0_0() { return cColonKeyword_3_0_0; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_3_0_1() { return cSizeAssignment_3_0_1; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_3_0_1_0() { return cSizeEIntParserRuleCall_3_0_1_0; }
+		
+		//'<' 'size:'? size=EInt '>'
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_3_1_0() { return cLessThanSignKeyword_3_1_0; }
+		
+		//'size:'?
+		public Keyword getSizeKeyword_3_1_1() { return cSizeKeyword_3_1_1; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_3_1_2() { return cSizeAssignment_3_1_2; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_3_1_2_0() { return cSizeEIntParserRuleCall_3_1_2_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_3_1_3() { return cGreaterThanSignKeyword_3_1_3; }
+	}
+	public class PrimitiveTimeTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Action cPrimitiveTimeTypeAction_0_0 = (Action)cGroup_0.eContents().get(0);
+		private final Keyword cTimeKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
+		private final Alternatives cAlternatives_0_2 = (Alternatives)cGroup_0.eContents().get(2);
+		private final Group cGroup_0_2_0 = (Group)cAlternatives_0_2.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_0_2_0_0 = (Keyword)cGroup_0_2_0.eContents().get(0);
+		private final Assignment cSupportAssignment_0_2_0_1 = (Assignment)cGroup_0_2_0.eContents().get(1);
+		private final RuleCall cSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0 = (RuleCall)cSupportAssignment_0_2_0_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_0_2_0_2 = (Keyword)cGroup_0_2_0.eContents().get(2);
+		private final Assignment cSupportAssignment_0_2_1 = (Assignment)cAlternatives_0_2.eContents().get(1);
+		private final RuleCall cSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0 = (RuleCall)cSupportAssignment_0_2_1.eContents().get(0);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Action cPrimitiveTimeTypeAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cClockAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Keyword cClockClockKeyword_1_1_0 = (Keyword)cClockAssignment_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_2 = (Alternatives)cGroup_1.eContents().get(2);
+		private final Group cGroup_1_2_0 = (Group)cAlternatives_1_2.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_1_2_0_0 = (Keyword)cGroup_1_2_0.eContents().get(0);
+		private final Assignment cSupportAssignment_1_2_0_1 = (Assignment)cGroup_1_2_0.eContents().get(1);
+		private final RuleCall cSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0 = (RuleCall)cSupportAssignment_1_2_0_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_1_2_0_2 = (Keyword)cGroup_1_2_0.eContents().get(2);
+		private final Assignment cSupportAssignment_1_2_1 = (Assignment)cAlternatives_1_2.eContents().get(1);
+		private final RuleCall cSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0 = (RuleCall)cSupportAssignment_1_2_1.eContents().get(0);
+		
+		//PrimitiveTimeType fmlType::PrimitiveTimeType:
+		//	{fmlType::PrimitiveTimeType}
+		//	'time' ('<' support=PrimitiveTimeNumberType '>'
+		//	| support=PrimitiveTimeNumberType)?
+		//	| {fmlType::PrimitiveTimeType} clock?='clock' ('<' support=PrimitiveTimeNumberType '>'
+		//	| support=PrimitiveTimeNumberType)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::PrimitiveTimeType} 'time' ('<' support=PrimitiveTimeNumberType '>' | support=PrimitiveTimeNumberType)? |
+		//{fmlType::PrimitiveTimeType} clock?='clock' ('<' support=PrimitiveTimeNumberType '>' |
+		//support=PrimitiveTimeNumberType)?
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//{fmlType::PrimitiveTimeType} 'time' ('<' support=PrimitiveTimeNumberType '>' | support=PrimitiveTimeNumberType)?
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//{fmlType::PrimitiveTimeType}
+		public Action getPrimitiveTimeTypeAction_0_0() { return cPrimitiveTimeTypeAction_0_0; }
+		
+		//'time'
+		public Keyword getTimeKeyword_0_1() { return cTimeKeyword_0_1; }
+		
+		//('<' support=PrimitiveTimeNumberType '>' | support=PrimitiveTimeNumberType)?
+		public Alternatives getAlternatives_0_2() { return cAlternatives_0_2; }
+		
+		//'<' support=PrimitiveTimeNumberType '>'
+		public Group getGroup_0_2_0() { return cGroup_0_2_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_0_2_0_0() { return cLessThanSignKeyword_0_2_0_0; }
+		
+		//support=PrimitiveTimeNumberType
+		public Assignment getSupportAssignment_0_2_0_1() { return cSupportAssignment_0_2_0_1; }
+		
+		//PrimitiveTimeNumberType
+		public RuleCall getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0() { return cSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_0_2_0_2() { return cGreaterThanSignKeyword_0_2_0_2; }
+		
+		//support=PrimitiveTimeNumberType
+		public Assignment getSupportAssignment_0_2_1() { return cSupportAssignment_0_2_1; }
+		
+		//PrimitiveTimeNumberType
+		public RuleCall getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0() { return cSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0; }
+		
+		//{fmlType::PrimitiveTimeType} clock?='clock' ('<' support=PrimitiveTimeNumberType '>' | support=PrimitiveTimeNumberType)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlType::PrimitiveTimeType}
+		public Action getPrimitiveTimeTypeAction_1_0() { return cPrimitiveTimeTypeAction_1_0; }
+		
+		//clock?='clock'
+		public Assignment getClockAssignment_1_1() { return cClockAssignment_1_1; }
+		
+		//'clock'
+		public Keyword getClockClockKeyword_1_1_0() { return cClockClockKeyword_1_1_0; }
+		
+		//('<' support=PrimitiveTimeNumberType '>' | support=PrimitiveTimeNumberType)?
+		public Alternatives getAlternatives_1_2() { return cAlternatives_1_2; }
+		
+		//'<' support=PrimitiveTimeNumberType '>'
+		public Group getGroup_1_2_0() { return cGroup_1_2_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1_2_0_0() { return cLessThanSignKeyword_1_2_0_0; }
+		
+		//support=PrimitiveTimeNumberType
+		public Assignment getSupportAssignment_1_2_0_1() { return cSupportAssignment_1_2_0_1; }
+		
+		//PrimitiveTimeNumberType
+		public RuleCall getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0() { return cSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_1_2_0_2() { return cGreaterThanSignKeyword_1_2_0_2; }
+		
+		//support=PrimitiveTimeNumberType
+		public Assignment getSupportAssignment_1_2_1() { return cSupportAssignment_1_2_1; }
+		
+		//PrimitiveTimeNumberType
+		public RuleCall getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0() { return cSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0; }
+	}
+	public class PrimitiveTimeNumberTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cPrimitiveIntegerTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cPrimitiveRationalTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cPrimitiveFloatTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cPrimitiveRealTypeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		
+		//PrimitiveTimeNumberType fmlType::PrimitiveNumberType:
+		//	PrimitiveIntegerType
+		//	| PrimitiveRationalType
+		//	| PrimitiveFloatType
+		//	| PrimitiveRealType
+		@Override public ParserRule getRule() { return rule; }
+		
+		//PrimitiveIntegerType | PrimitiveRationalType | PrimitiveFloatType | PrimitiveRealType
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//PrimitiveIntegerType
+		public RuleCall getPrimitiveIntegerTypeParserRuleCall_0() { return cPrimitiveIntegerTypeParserRuleCall_0; }
+		
+		//PrimitiveRationalType
+		public RuleCall getPrimitiveRationalTypeParserRuleCall_1() { return cPrimitiveRationalTypeParserRuleCall_1; }
+		
+		//PrimitiveFloatType
+		public RuleCall getPrimitiveFloatTypeParserRuleCall_2() { return cPrimitiveFloatTypeParserRuleCall_2; }
+		
+		//PrimitiveRealType
+		public RuleCall getPrimitiveRealTypeParserRuleCall_3() { return cPrimitiveRealTypeParserRuleCall_3; }
+	}
+	public class OtherPrimitiveTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OtherPrimitiveType");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cPrimitiveBooleanTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cPrimitiveCharacterTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cPrimitiveStringTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cPrimitiveInstanceTypeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		
+		//OtherPrimitiveType fmlType::PrimitiveType:
+		//	PrimitiveBooleanType
+		//	| PrimitiveCharacterType
+		//	| PrimitiveStringType
+		//	| PrimitiveInstanceType
+		@Override public ParserRule getRule() { return rule; }
+		
+		//PrimitiveBooleanType | PrimitiveCharacterType | PrimitiveStringType | PrimitiveInstanceType
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//PrimitiveBooleanType
+		public RuleCall getPrimitiveBooleanTypeParserRuleCall_0() { return cPrimitiveBooleanTypeParserRuleCall_0; }
+		
+		//PrimitiveCharacterType
+		public RuleCall getPrimitiveCharacterTypeParserRuleCall_1() { return cPrimitiveCharacterTypeParserRuleCall_1; }
+		
+		//PrimitiveStringType
+		public RuleCall getPrimitiveStringTypeParserRuleCall_2() { return cPrimitiveStringTypeParserRuleCall_2; }
+		
+		//PrimitiveInstanceType
+		public RuleCall getPrimitiveInstanceTypeParserRuleCall_3() { return cPrimitiveInstanceTypeParserRuleCall_3; }
+	}
+	public class PrimitiveBooleanTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveBooleanType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPrimitiveBooleanTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Keyword cBooleanKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
+		private final Keyword cBoolKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
+		
+		//PrimitiveBooleanType fmlType::PrimitiveBooleanType:
+		//	{fmlType::PrimitiveBooleanType} ('boolean' | 'bool')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::PrimitiveBooleanType} ('boolean' | 'bool')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::PrimitiveBooleanType}
+		public Action getPrimitiveBooleanTypeAction_0() { return cPrimitiveBooleanTypeAction_0; }
+		
+		//('boolean' | 'bool')
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//'boolean'
+		public Keyword getBooleanKeyword_1_0() { return cBooleanKeyword_1_0; }
+		
+		//'bool'
+		public Keyword getBoolKeyword_1_1() { return cBoolKeyword_1_1; }
+	}
+	public class PrimitiveCharacterTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveCharacterType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPrimitiveCharacterTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cCharKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		
+		//PrimitiveCharacterType fmlType::PrimitiveCharacterType:
+		//	{fmlType::PrimitiveCharacterType} 'char'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::PrimitiveCharacterType} 'char'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::PrimitiveCharacterType}
+		public Action getPrimitiveCharacterTypeAction_0() { return cPrimitiveCharacterTypeAction_0; }
+		
+		//'char'
+		public Keyword getCharKeyword_1() { return cCharKeyword_1; }
+	}
+	public class PrimitiveStringTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveStringType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPrimitiveStringTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cStringKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
+		private final Keyword cColonKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
+		private final Assignment cSizeAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
+		private final RuleCall cSizeEIntParserRuleCall_2_0_1_0 = (RuleCall)cSizeAssignment_2_0_1.eContents().get(0);
+		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
+		private final Keyword cSizeKeyword_2_1_1 = (Keyword)cGroup_2_1.eContents().get(1);
+		private final Assignment cSizeAssignment_2_1_2 = (Assignment)cGroup_2_1.eContents().get(2);
+		private final RuleCall cSizeEIntParserRuleCall_2_1_2_0 = (RuleCall)cSizeAssignment_2_1_2.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_2_1_3 = (Keyword)cGroup_2_1.eContents().get(3);
+		
+		//PrimitiveStringType fmlType::PrimitiveStringType:
+		//	{fmlType::PrimitiveStringType}
+		//	'string' (':' size=EInt
+		//	| '<' 'size:'? size=EInt '>')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::PrimitiveStringType} 'string' (':' size=EInt | '<' 'size:'? size=EInt '>')?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::PrimitiveStringType}
+		public Action getPrimitiveStringTypeAction_0() { return cPrimitiveStringTypeAction_0; }
+		
+		//'string'
+		public Keyword getStringKeyword_1() { return cStringKeyword_1; }
+		
+		//(':' size=EInt | '<' 'size:'? size=EInt '>')?
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//':' size=EInt
+		public Group getGroup_2_0() { return cGroup_2_0; }
+		
+		//':'
+		public Keyword getColonKeyword_2_0_0() { return cColonKeyword_2_0_0; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_2_0_1() { return cSizeAssignment_2_0_1; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_2_0_1_0() { return cSizeEIntParserRuleCall_2_0_1_0; }
+		
+		//'<' 'size:'? size=EInt '>'
+		public Group getGroup_2_1() { return cGroup_2_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_1_0() { return cLessThanSignKeyword_2_1_0; }
+		
+		//'size:'?
+		public Keyword getSizeKeyword_2_1_1() { return cSizeKeyword_2_1_1; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_2_1_2() { return cSizeAssignment_2_1_2; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_2_1_2_0() { return cSizeEIntParserRuleCall_2_1_2_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_1_3() { return cGreaterThanSignKeyword_2_1_3; }
+	}
+	public class PrimitiveInstanceTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveInstanceType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cPrimitiveInstanceTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cExpectedAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cExpectedPrimitiveInstanceKindEnumRuleCall_1_0 = (RuleCall)cExpectedAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cModelAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final CrossReference cModelNamedElementCrossReference_2_1_0 = (CrossReference)cModelAssignment_2_1.eContents().get(0);
+		private final RuleCall cModelNamedElementESIdentifierParserRuleCall_2_1_0_1 = (RuleCall)cModelNamedElementCrossReference_2_1_0.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
+		
+		//PrimitiveInstanceType fmlType::PrimitiveInstanceType:
+		//	{fmlType::PrimitiveInstanceType} expected=PrimitiveInstanceKind ('<' model=[fmlCommon::NamedElement|ESIdentifier]
+		//	'>')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::PrimitiveInstanceType} expected=PrimitiveInstanceKind ('<' model=[fmlCommon::NamedElement|ESIdentifier] '>')?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::PrimitiveInstanceType}
+		public Action getPrimitiveInstanceTypeAction_0() { return cPrimitiveInstanceTypeAction_0; }
+		
+		//expected=PrimitiveInstanceKind
+		public Assignment getExpectedAssignment_1() { return cExpectedAssignment_1; }
+		
+		//PrimitiveInstanceKind
+		public RuleCall getExpectedPrimitiveInstanceKindEnumRuleCall_1_0() { return cExpectedPrimitiveInstanceKindEnumRuleCall_1_0; }
+		
+		//('<' model=[fmlCommon::NamedElement|ESIdentifier] '>')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
+		
+		//model=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getModelAssignment_2_1() { return cModelAssignment_2_1; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getModelNamedElementCrossReference_2_1_0() { return cModelNamedElementCrossReference_2_1_0; }
+		
+		//ESIdentifier
+		public RuleCall getModelNamedElementESIdentifierParserRuleCall_2_1_0_1() { return cModelNamedElementESIdentifierParserRuleCall_2_1_0_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
+	}
+	public class IntervalTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IntervalType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cIntervalTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cIntervalKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cSupportAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cSupportPrimitiveNumberTypeParserRuleCall_3_0 = (RuleCall)cSupportAssignment_3.eContents().get(0);
+		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
+		private final Assignment cLopenAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
+		private final Keyword cLopenRightSquareBracketKeyword_4_0_0 = (Keyword)cLopenAssignment_4_0.eContents().get(0);
+		private final Keyword cLeftSquareBracketKeyword_4_1 = (Keyword)cAlternatives_4.eContents().get(1);
+		private final Assignment cInfimumAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cInfimumExpressionParserRuleCall_5_0 = (RuleCall)cInfimumAssignment_5.eContents().get(0);
+		private final Keyword cCommaKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cSupremumAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cSupremumExpressionParserRuleCall_7_0 = (RuleCall)cSupremumAssignment_7.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Keyword cRightSquareBracketKeyword_8_0 = (Keyword)cAlternatives_8.eContents().get(0);
+		private final Assignment cRopenAssignment_8_1 = (Assignment)cAlternatives_8.eContents().get(1);
+		private final Keyword cRopenLeftSquareBracketKeyword_8_1_0 = (Keyword)cRopenAssignment_8_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_9 = (Keyword)cGroup.eContents().get(9);
+		
+		//IntervalType fmlType::IntervalType:
+		//	{fmlType::IntervalType}
+		//	'interval'
+		//	'<'
+		//	support=PrimitiveNumberType (lopen?=']' | '[') infimum=Expression ',' supremum=Expression (']' | ropen?='[')
+		//	'>'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::IntervalType} 'interval' '<' support=PrimitiveNumberType (lopen?=']' | '[') infimum=Expression ','
+		//supremum=Expression (']' | ropen?='[') '>'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::IntervalType}
+		public Action getIntervalTypeAction_0() { return cIntervalTypeAction_0; }
+		
+		//'interval'
+		public Keyword getIntervalKeyword_1() { return cIntervalKeyword_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
+		
+		//support=PrimitiveNumberType
+		public Assignment getSupportAssignment_3() { return cSupportAssignment_3; }
+		
+		//PrimitiveNumberType
+		public RuleCall getSupportPrimitiveNumberTypeParserRuleCall_3_0() { return cSupportPrimitiveNumberTypeParserRuleCall_3_0; }
+		
+		//(lopen?=']' | '[')
+		public Alternatives getAlternatives_4() { return cAlternatives_4; }
+		
+		//lopen?=']'
+		public Assignment getLopenAssignment_4_0() { return cLopenAssignment_4_0; }
+		
+		//']'
+		public Keyword getLopenRightSquareBracketKeyword_4_0_0() { return cLopenRightSquareBracketKeyword_4_0_0; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_4_1() { return cLeftSquareBracketKeyword_4_1; }
+		
+		//infimum=Expression
+		public Assignment getInfimumAssignment_5() { return cInfimumAssignment_5; }
+		
+		//Expression
+		public RuleCall getInfimumExpressionParserRuleCall_5_0() { return cInfimumExpressionParserRuleCall_5_0; }
+		
+		//','
+		public Keyword getCommaKeyword_6() { return cCommaKeyword_6; }
+		
+		//supremum=Expression
+		public Assignment getSupremumAssignment_7() { return cSupremumAssignment_7; }
+		
+		//Expression
+		public RuleCall getSupremumExpressionParserRuleCall_7_0() { return cSupremumExpressionParserRuleCall_7_0; }
+		
+		//(']' | ropen?='[')
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_8_0() { return cRightSquareBracketKeyword_8_0; }
+		
+		//ropen?='['
+		public Assignment getRopenAssignment_8_1() { return cRopenAssignment_8_1; }
+		
+		//'['
+		public Keyword getRopenLeftSquareBracketKeyword_8_1_0() { return cRopenLeftSquareBracketKeyword_8_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_9() { return cGreaterThanSignKeyword_9; }
+	}
+	public class IntervalTypeDefinitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IntervalTypeDefinition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cIntervalTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Keyword cIntervalKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Keyword cLessThanSignKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cSupportAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cSupportPrimitiveNumberTypeParserRuleCall_7_0 = (RuleCall)cSupportAssignment_7.eContents().get(0);
+		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
+		private final Assignment cLopenAssignment_8_0 = (Assignment)cAlternatives_8.eContents().get(0);
+		private final Keyword cLopenRightSquareBracketKeyword_8_0_0 = (Keyword)cLopenAssignment_8_0.eContents().get(0);
+		private final Keyword cLeftSquareBracketKeyword_8_1 = (Keyword)cAlternatives_8.eContents().get(1);
+		private final Assignment cInfimumAssignment_9 = (Assignment)cGroup.eContents().get(9);
+		private final RuleCall cInfimumExpressionParserRuleCall_9_0 = (RuleCall)cInfimumAssignment_9.eContents().get(0);
+		private final Keyword cCommaKeyword_10 = (Keyword)cGroup.eContents().get(10);
+		private final Assignment cSupremumAssignment_11 = (Assignment)cGroup.eContents().get(11);
+		private final RuleCall cSupremumExpressionParserRuleCall_11_0 = (RuleCall)cSupremumAssignment_11.eContents().get(0);
+		private final Alternatives cAlternatives_12 = (Alternatives)cGroup.eContents().get(12);
+		private final Keyword cRightSquareBracketKeyword_12_0 = (Keyword)cAlternatives_12.eContents().get(0);
+		private final Assignment cRopenAssignment_12_1 = (Assignment)cAlternatives_12.eContents().get(1);
+		private final Keyword cRopenLeftSquareBracketKeyword_12_1_0 = (Keyword)cRopenAssignment_12_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_13 = (Keyword)cGroup.eContents().get(13);
+		private final Keyword cSemicolonKeyword_14 = (Keyword)cGroup.eContents().get(14);
+		
+		//IntervalTypeDefinition fmlType::IntervalType:
+		//	{fmlType::IntervalType} visibility=VisibilityKind? 'type'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	'interval'
+		//	'<'
+		//	support=PrimitiveNumberType (lopen?=']' | '[') infimum=Expression ',' supremum=Expression (']' | ropen?='[')
+		//	'>' ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::IntervalType} visibility=VisibilityKind? 'type' name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//'interval' '<' support=PrimitiveNumberType (lopen?=']' | '[') infimum=Expression ',' supremum=Expression (']' |
+		//ropen?='[') '>' ';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::IntervalType}
+		public Action getIntervalTypeAction_0() { return cIntervalTypeAction_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
+		
+		//'type'
+		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//'interval'
+		public Keyword getIntervalKeyword_5() { return cIntervalKeyword_5; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_6() { return cLessThanSignKeyword_6; }
+		
+		//support=PrimitiveNumberType
+		public Assignment getSupportAssignment_7() { return cSupportAssignment_7; }
+		
+		//PrimitiveNumberType
+		public RuleCall getSupportPrimitiveNumberTypeParserRuleCall_7_0() { return cSupportPrimitiveNumberTypeParserRuleCall_7_0; }
+		
+		//(lopen?=']' | '[')
+		public Alternatives getAlternatives_8() { return cAlternatives_8; }
+		
+		//lopen?=']'
+		public Assignment getLopenAssignment_8_0() { return cLopenAssignment_8_0; }
+		
+		//']'
+		public Keyword getLopenRightSquareBracketKeyword_8_0_0() { return cLopenRightSquareBracketKeyword_8_0_0; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_8_1() { return cLeftSquareBracketKeyword_8_1; }
+		
+		//infimum=Expression
+		public Assignment getInfimumAssignment_9() { return cInfimumAssignment_9; }
+		
+		//Expression
+		public RuleCall getInfimumExpressionParserRuleCall_9_0() { return cInfimumExpressionParserRuleCall_9_0; }
+		
+		//','
+		public Keyword getCommaKeyword_10() { return cCommaKeyword_10; }
+		
+		//supremum=Expression
+		public Assignment getSupremumAssignment_11() { return cSupremumAssignment_11; }
+		
+		//Expression
+		public RuleCall getSupremumExpressionParserRuleCall_11_0() { return cSupremumExpressionParserRuleCall_11_0; }
+		
+		//(']' | ropen?='[')
+		public Alternatives getAlternatives_12() { return cAlternatives_12; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_12_0() { return cRightSquareBracketKeyword_12_0; }
+		
+		//ropen?='['
+		public Assignment getRopenAssignment_12_1() { return cRopenAssignment_12_1; }
+		
+		//'['
+		public Keyword getRopenLeftSquareBracketKeyword_12_1_0() { return cRopenLeftSquareBracketKeyword_12_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_13() { return cGreaterThanSignKeyword_13; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_14() { return cSemicolonKeyword_14; }
+	}
+	public class IntervalTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IntervalTypeDefinitionImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cIntervalTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Keyword cIntervalKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Keyword cLessThanSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cSupportAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cSupportPrimitiveNumberTypeParserRuleCall_5_0 = (RuleCall)cSupportAssignment_5.eContents().get(0);
+		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
+		private final Assignment cLopenAssignment_6_0 = (Assignment)cAlternatives_6.eContents().get(0);
+		private final Keyword cLopenRightSquareBracketKeyword_6_0_0 = (Keyword)cLopenAssignment_6_0.eContents().get(0);
+		private final Keyword cLeftSquareBracketKeyword_6_1 = (Keyword)cAlternatives_6.eContents().get(1);
+		private final Assignment cInfimumAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cInfimumExpressionParserRuleCall_7_0 = (RuleCall)cInfimumAssignment_7.eContents().get(0);
+		private final Keyword cCommaKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		private final Assignment cSupremumAssignment_9 = (Assignment)cGroup.eContents().get(9);
+		private final RuleCall cSupremumExpressionParserRuleCall_9_0 = (RuleCall)cSupremumAssignment_9.eContents().get(0);
+		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
+		private final Keyword cRightSquareBracketKeyword_10_0 = (Keyword)cAlternatives_10.eContents().get(0);
+		private final Assignment cRopenAssignment_10_1 = (Assignment)cAlternatives_10.eContents().get(1);
+		private final Keyword cRopenLeftSquareBracketKeyword_10_1_0 = (Keyword)cRopenAssignment_10_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_11 = (Keyword)cGroup.eContents().get(11);
+		private final Keyword cSemicolonKeyword_12 = (Keyword)cGroup.eContents().get(12);
+		
+		//IntervalTypeDefinitionImpl fmlType::IntervalType:
+		//	{fmlType::IntervalType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	'interval'
+		//	'<'
+		//	support=PrimitiveNumberType (lopen?=']' | '[') infimum=Expression ',' supremum=Expression (']' | ropen?='[')
+		//	'>' ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::IntervalType} name=ESIdentifier unrestrictedName=UnrestrictedName? 'interval' '<' support=PrimitiveNumberType
+		//(lopen?=']' | '[') infimum=Expression ',' supremum=Expression (']' | ropen?='[') '>' ';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::IntervalType}
+		public Action getIntervalTypeAction_0() { return cIntervalTypeAction_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//'interval'
+		public Keyword getIntervalKeyword_3() { return cIntervalKeyword_3; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_4() { return cLessThanSignKeyword_4; }
+		
+		//support=PrimitiveNumberType
+		public Assignment getSupportAssignment_5() { return cSupportAssignment_5; }
+		
+		//PrimitiveNumberType
+		public RuleCall getSupportPrimitiveNumberTypeParserRuleCall_5_0() { return cSupportPrimitiveNumberTypeParserRuleCall_5_0; }
+		
+		//(lopen?=']' | '[')
+		public Alternatives getAlternatives_6() { return cAlternatives_6; }
+		
+		//lopen?=']'
+		public Assignment getLopenAssignment_6_0() { return cLopenAssignment_6_0; }
+		
+		//']'
+		public Keyword getLopenRightSquareBracketKeyword_6_0_0() { return cLopenRightSquareBracketKeyword_6_0_0; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_6_1() { return cLeftSquareBracketKeyword_6_1; }
+		
+		//infimum=Expression
+		public Assignment getInfimumAssignment_7() { return cInfimumAssignment_7; }
+		
+		//Expression
+		public RuleCall getInfimumExpressionParserRuleCall_7_0() { return cInfimumExpressionParserRuleCall_7_0; }
+		
+		//','
+		public Keyword getCommaKeyword_8() { return cCommaKeyword_8; }
+		
+		//supremum=Expression
+		public Assignment getSupremumAssignment_9() { return cSupremumAssignment_9; }
+		
+		//Expression
+		public RuleCall getSupremumExpressionParserRuleCall_9_0() { return cSupremumExpressionParserRuleCall_9_0; }
+		
+		//(']' | ropen?='[')
+		public Alternatives getAlternatives_10() { return cAlternatives_10; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_10_0() { return cRightSquareBracketKeyword_10_0; }
+		
+		//ropen?='['
+		public Assignment getRopenAssignment_10_1() { return cRopenAssignment_10_1; }
+		
+		//'['
+		public Keyword getRopenLeftSquareBracketKeyword_10_1_0() { return cRopenLeftSquareBracketKeyword_10_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_11() { return cGreaterThanSignKeyword_11; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_12() { return cSemicolonKeyword_12; }
+	}
+	public class CollectionTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CollectionType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cCollectionTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cContainerAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cContainerCollectionKindEnumRuleCall_1_0 = (RuleCall)cContainerAssignment_1.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cSupportAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cSupportDataTypeParserRuleCall_3_0 = (RuleCall)cSupportAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cCommaKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
+		private final Assignment cSizeAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
+		private final RuleCall cSizeEIntParserRuleCall_4_1_0_0 = (RuleCall)cSizeAssignment_4_1_0.eContents().get(0);
+		private final Assignment cUnboundedAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
+		private final Keyword cUnboundedAsteriskKeyword_4_1_1_0 = (Keyword)cUnboundedAssignment_4_1_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//// TODO
+		//// mettre à jour la grammaire par rapport au noyau, i.e.
+		//// CollectionKind | CollectionKind< size > | CollectionKind< type , size >
+		//CollectionType fmlType::CollectionType:
+		//	{fmlType::CollectionType} container=CollectionKind
+		//	'<'
+		//	support=DataType (',' (size=EInt | unbounded?='*'))?
+		//	'>'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::CollectionType} container=CollectionKind '<' support=DataType (',' (size=EInt | unbounded?='*'))? '>'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::CollectionType}
+		public Action getCollectionTypeAction_0() { return cCollectionTypeAction_0; }
+		
+		//container=CollectionKind
+		public Assignment getContainerAssignment_1() { return cContainerAssignment_1; }
+		
+		//CollectionKind
+		public RuleCall getContainerCollectionKindEnumRuleCall_1_0() { return cContainerCollectionKindEnumRuleCall_1_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
+		
+		//support=DataType
+		public Assignment getSupportAssignment_3() { return cSupportAssignment_3; }
+		
+		//DataType
+		public RuleCall getSupportDataTypeParserRuleCall_3_0() { return cSupportDataTypeParserRuleCall_3_0; }
+		
+		//(',' (size=EInt | unbounded?='*'))?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//','
+		public Keyword getCommaKeyword_4_0() { return cCommaKeyword_4_0; }
+		
+		//(size=EInt | unbounded?='*')
+		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_4_1_0() { return cSizeAssignment_4_1_0; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_4_1_0_0() { return cSizeEIntParserRuleCall_4_1_0_0; }
+		
+		//unbounded?='*'
+		public Assignment getUnboundedAssignment_4_1_1() { return cUnboundedAssignment_4_1_1; }
+		
+		//'*'
+		public Keyword getUnboundedAsteriskKeyword_4_1_1_0() { return cUnboundedAsteriskKeyword_4_1_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_5() { return cGreaterThanSignKeyword_5; }
+	}
+	public class CollectionTypeDefinitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CollectionTypeDefinition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cCollectionTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Assignment cContainerAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cContainerCollectionKindEnumRuleCall_5_0 = (RuleCall)cContainerAssignment_5.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cSupportAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cSupportDataTypeParserRuleCall_7_0 = (RuleCall)cSupportAssignment_7.eContents().get(0);
+		private final Group cGroup_8 = (Group)cGroup.eContents().get(8);
+		private final Keyword cCommaKeyword_8_0 = (Keyword)cGroup_8.eContents().get(0);
+		private final Alternatives cAlternatives_8_1 = (Alternatives)cGroup_8.eContents().get(1);
+		private final Assignment cSizeAssignment_8_1_0 = (Assignment)cAlternatives_8_1.eContents().get(0);
+		private final RuleCall cSizeEIntParserRuleCall_8_1_0_0 = (RuleCall)cSizeAssignment_8_1_0.eContents().get(0);
+		private final Assignment cUnboundedAssignment_8_1_1 = (Assignment)cAlternatives_8_1.eContents().get(1);
+		private final Keyword cUnboundedAsteriskKeyword_8_1_1_0 = (Keyword)cUnboundedAssignment_8_1_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_9 = (Keyword)cGroup.eContents().get(9);
+		private final Keyword cSemicolonKeyword_10 = (Keyword)cGroup.eContents().get(10);
+		
+		//CollectionTypeDefinition fmlType::CollectionType:
+		//	{fmlType::CollectionType} visibility=VisibilityKind? 'type'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	container=CollectionKind
+		//	'<'
+		//	support=DataType (',' (size=EInt | unbounded?='*'))?
+		//	'>' ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::CollectionType} visibility=VisibilityKind? 'type' name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//container=CollectionKind '<' support=DataType (',' (size=EInt | unbounded?='*'))? '>' ';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::CollectionType}
+		public Action getCollectionTypeAction_0() { return cCollectionTypeAction_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
+		
+		//'type'
+		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//container=CollectionKind
+		public Assignment getContainerAssignment_5() { return cContainerAssignment_5; }
+		
+		//CollectionKind
+		public RuleCall getContainerCollectionKindEnumRuleCall_5_0() { return cContainerCollectionKindEnumRuleCall_5_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_6() { return cLessThanSignKeyword_6; }
+		
+		//support=DataType
+		public Assignment getSupportAssignment_7() { return cSupportAssignment_7; }
+		
+		//DataType
+		public RuleCall getSupportDataTypeParserRuleCall_7_0() { return cSupportDataTypeParserRuleCall_7_0; }
+		
+		//(',' (size=EInt | unbounded?='*'))?
+		public Group getGroup_8() { return cGroup_8; }
+		
+		//','
+		public Keyword getCommaKeyword_8_0() { return cCommaKeyword_8_0; }
+		
+		//(size=EInt | unbounded?='*')
+		public Alternatives getAlternatives_8_1() { return cAlternatives_8_1; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_8_1_0() { return cSizeAssignment_8_1_0; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_8_1_0_0() { return cSizeEIntParserRuleCall_8_1_0_0; }
+		
+		//unbounded?='*'
+		public Assignment getUnboundedAssignment_8_1_1() { return cUnboundedAssignment_8_1_1; }
+		
+		//'*'
+		public Keyword getUnboundedAsteriskKeyword_8_1_1_0() { return cUnboundedAsteriskKeyword_8_1_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_9() { return cGreaterThanSignKeyword_9; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_10() { return cSemicolonKeyword_10; }
+	}
+	public class CollectionTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CollectionTypeDefinitionImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cCollectionTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Assignment cContainerAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cContainerCollectionKindEnumRuleCall_3_0 = (RuleCall)cContainerAssignment_3.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cSupportAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cSupportDataTypeParserRuleCall_5_0 = (RuleCall)cSupportAssignment_5.eContents().get(0);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cCommaKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Alternatives cAlternatives_6_1 = (Alternatives)cGroup_6.eContents().get(1);
+		private final Assignment cSizeAssignment_6_1_0 = (Assignment)cAlternatives_6_1.eContents().get(0);
+		private final RuleCall cSizeEIntParserRuleCall_6_1_0_0 = (RuleCall)cSizeAssignment_6_1_0.eContents().get(0);
+		private final Assignment cUnboundedAssignment_6_1_1 = (Assignment)cAlternatives_6_1.eContents().get(1);
+		private final Keyword cUnboundedAsteriskKeyword_6_1_1_0 = (Keyword)cUnboundedAssignment_6_1_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_7 = (Keyword)cGroup.eContents().get(7);
+		private final Keyword cSemicolonKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		
+		//CollectionTypeDefinitionImpl fmlType::CollectionType:
+		//	{fmlType::CollectionType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	container=CollectionKind
+		//	'<'
+		//	support=DataType (',' (size=EInt | unbounded?='*'))?
+		//	'>' ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::CollectionType} name=ESIdentifier unrestrictedName=UnrestrictedName? container=CollectionKind '<'
+		//support=DataType (',' (size=EInt | unbounded?='*'))? '>' ';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::CollectionType}
+		public Action getCollectionTypeAction_0() { return cCollectionTypeAction_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//container=CollectionKind
+		public Assignment getContainerAssignment_3() { return cContainerAssignment_3; }
+		
+		//CollectionKind
+		public RuleCall getContainerCollectionKindEnumRuleCall_3_0() { return cContainerCollectionKindEnumRuleCall_3_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_4() { return cLessThanSignKeyword_4; }
+		
+		//support=DataType
+		public Assignment getSupportAssignment_5() { return cSupportAssignment_5; }
+		
+		//DataType
+		public RuleCall getSupportDataTypeParserRuleCall_5_0() { return cSupportDataTypeParserRuleCall_5_0; }
+		
+		//(',' (size=EInt | unbounded?='*'))?
+		public Group getGroup_6() { return cGroup_6; }
+		
+		//','
+		public Keyword getCommaKeyword_6_0() { return cCommaKeyword_6_0; }
+		
+		//(size=EInt | unbounded?='*')
+		public Alternatives getAlternatives_6_1() { return cAlternatives_6_1; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_6_1_0() { return cSizeAssignment_6_1_0; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_6_1_0_0() { return cSizeEIntParserRuleCall_6_1_0_0; }
+		
+		//unbounded?='*'
+		public Assignment getUnboundedAssignment_6_1_1() { return cUnboundedAssignment_6_1_1; }
+		
+		//'*'
+		public Keyword getUnboundedAsteriskKeyword_6_1_1_0() { return cUnboundedAsteriskKeyword_6_1_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_7() { return cGreaterThanSignKeyword_7; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_8() { return cSemicolonKeyword_8; }
+	}
+	public class EnumerationTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EnumerationType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cEnumerationTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cEnumKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cLiteralAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_3_0 = (RuleCall)cLiteralAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cCommaKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cLiteralAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_4_1_0 = (RuleCall)cLiteralAssignment_4_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//EnumerationType fmlType::EnumerationType:
+		//	{fmlType::EnumerationType}
+		//	'enum' '{'
+		//	literal+=EnumerationLiteral (',' literal+=EnumerationLiteral)*
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::EnumerationType} 'enum' '{' literal+=EnumerationLiteral (',' literal+=EnumerationLiteral)* '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::EnumerationType}
+		public Action getEnumerationTypeAction_0() { return cEnumerationTypeAction_0; }
+		
+		//'enum'
+		public Keyword getEnumKeyword_1() { return cEnumKeyword_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+		
+		//literal+=EnumerationLiteral
+		public Assignment getLiteralAssignment_3() { return cLiteralAssignment_3; }
+		
+		//EnumerationLiteral
+		public RuleCall getLiteralEnumerationLiteralParserRuleCall_3_0() { return cLiteralEnumerationLiteralParserRuleCall_3_0; }
+		
+		//(',' literal+=EnumerationLiteral)*
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//','
+		public Keyword getCommaKeyword_4_0() { return cCommaKeyword_4_0; }
+		
+		//literal+=EnumerationLiteral
+		public Assignment getLiteralAssignment_4_1() { return cLiteralAssignment_4_1; }
+		
+		//EnumerationLiteral
+		public RuleCall getLiteralEnumerationLiteralParserRuleCall_4_1_0() { return cLiteralEnumerationLiteralParserRuleCall_4_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
+	}
+	public class EnumerationTypeDefinitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EnumerationTypeDefinition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cEnumerationTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Assignment cTypedefAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final Keyword cTypedefEnumKeyword_5_0 = (Keyword)cTypedefAssignment_5.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cLiteralAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_7_0 = (RuleCall)cLiteralAssignment_7.eContents().get(0);
+		private final Group cGroup_8 = (Group)cGroup.eContents().get(8);
+		private final Keyword cCommaKeyword_8_0 = (Keyword)cGroup_8.eContents().get(0);
+		private final Assignment cLiteralAssignment_8_1 = (Assignment)cGroup_8.eContents().get(1);
+		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_8_1_0 = (RuleCall)cLiteralAssignment_8_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
+		
+		//EnumerationTypeDefinition fmlType::EnumerationType:
+		//	{fmlType::EnumerationType} visibility=VisibilityKind? 'type'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	typedef?='enum'
+		//	'{'
+		//	literal+=EnumerationLiteral (',' literal+=EnumerationLiteral)*
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::EnumerationType} visibility=VisibilityKind? 'type' name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//typedef?='enum' '{' literal+=EnumerationLiteral (',' literal+=EnumerationLiteral)* '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::EnumerationType}
+		public Action getEnumerationTypeAction_0() { return cEnumerationTypeAction_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
+		
+		//'type'
+		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//typedef?='enum'
+		public Assignment getTypedefAssignment_5() { return cTypedefAssignment_5; }
+		
+		//'enum'
+		public Keyword getTypedefEnumKeyword_5_0() { return cTypedefEnumKeyword_5_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
+		
+		//literal+=EnumerationLiteral
+		public Assignment getLiteralAssignment_7() { return cLiteralAssignment_7; }
+		
+		//EnumerationLiteral
+		public RuleCall getLiteralEnumerationLiteralParserRuleCall_7_0() { return cLiteralEnumerationLiteralParserRuleCall_7_0; }
+		
+		//(',' literal+=EnumerationLiteral)*
+		public Group getGroup_8() { return cGroup_8; }
+		
+		//','
+		public Keyword getCommaKeyword_8_0() { return cCommaKeyword_8_0; }
+		
+		//literal+=EnumerationLiteral
+		public Assignment getLiteralAssignment_8_1() { return cLiteralAssignment_8_1; }
+		
+		//EnumerationLiteral
+		public RuleCall getLiteralEnumerationLiteralParserRuleCall_8_1_0() { return cLiteralEnumerationLiteralParserRuleCall_8_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
+	}
+	public class EnumerationTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EnumerationTypeDefinitionImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cEnumerationTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Assignment cTypedefAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final Keyword cTypedefEnumKeyword_3_0 = (Keyword)cTypedefAssignment_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cLiteralAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_5_0 = (RuleCall)cLiteralAssignment_5.eContents().get(0);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cCommaKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Assignment cLiteralAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
+		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_6_1_0 = (RuleCall)cLiteralAssignment_6_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
+		
+		//EnumerationTypeDefinitionImpl fmlType::EnumerationType:
+		//	{fmlType::EnumerationType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	typedef?='enum'
+		//	'{'
+		//	literal+=EnumerationLiteral (',' literal+=EnumerationLiteral)*
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::EnumerationType} name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='enum' '{'
+		//literal+=EnumerationLiteral (',' literal+=EnumerationLiteral)* '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::EnumerationType}
+		public Action getEnumerationTypeAction_0() { return cEnumerationTypeAction_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//typedef?='enum'
+		public Assignment getTypedefAssignment_3() { return cTypedefAssignment_3; }
+		
+		//'enum'
+		public Keyword getTypedefEnumKeyword_3_0() { return cTypedefEnumKeyword_3_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
+		
+		//literal+=EnumerationLiteral
+		public Assignment getLiteralAssignment_5() { return cLiteralAssignment_5; }
+		
+		//EnumerationLiteral
+		public RuleCall getLiteralEnumerationLiteralParserRuleCall_5_0() { return cLiteralEnumerationLiteralParserRuleCall_5_0; }
+		
+		//(',' literal+=EnumerationLiteral)*
+		public Group getGroup_6() { return cGroup_6; }
+		
+		//','
+		public Keyword getCommaKeyword_6_0() { return cCommaKeyword_6_0; }
+		
+		//literal+=EnumerationLiteral
+		public Assignment getLiteralAssignment_6_1() { return cLiteralAssignment_6_1; }
+		
+		//EnumerationLiteral
+		public RuleCall getLiteralEnumerationLiteralParserRuleCall_6_1_0() { return cLiteralEnumerationLiteralParserRuleCall_6_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
+	}
+	public class EnumerationLiteralElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cNameESIdentifierParserRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_1_0 = (RuleCall)cUnrestrictedNameAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cEqualsSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cValueLiteralTerminalExpressionParserRuleCall_2_1_0 = (RuleCall)cValueAssignment_2_1.eContents().get(0);
+		
+		//EnumerationLiteral fmlType::EnumerationLiteral:
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' value=LiteralTerminalExpression)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' value=LiteralTerminalExpression)?
+		public Group getGroup() { return cGroup; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_0_0() { return cNameESIdentifierParserRuleCall_0_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_1() { return cUnrestrictedNameAssignment_1; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_1_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_1_0; }
+		
+		//('=' value=LiteralTerminalExpression)?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_2_0() { return cEqualsSignKeyword_2_0; }
+		
+		//value=LiteralTerminalExpression
+		public Assignment getValueAssignment_2_1() { return cValueAssignment_2_1; }
+		
+		//LiteralTerminalExpression
+		public RuleCall getValueLiteralTerminalExpressionParserRuleCall_2_1_0() { return cValueLiteralTerminalExpressionParserRuleCall_2_1_0; }
+	}
+	public class StructureTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StructureType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStructureTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cStructKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cPropertyAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cPropertyVariableParserRuleCall_3_0 = (RuleCall)cPropertyAssignment_3.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//StructureType fmlType::StructureType:
+		//	{fmlType::StructureType}
+		//	'struct'
+		//	'{'
+		//	property+=Variable+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::StructureType} 'struct' '{' property+=Variable+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::StructureType}
+		public Action getStructureTypeAction_0() { return cStructureTypeAction_0; }
+		
+		//'struct'
+		public Keyword getStructKeyword_1() { return cStructKeyword_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+		
+		//property+=Variable+
+		public Assignment getPropertyAssignment_3() { return cPropertyAssignment_3; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_3_0() { return cPropertyVariableParserRuleCall_3_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+	public class StructureTypeDefinitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StructureTypeDefinition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStructureTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Assignment cTypedefAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final Keyword cTypedefStructKeyword_5_0 = (Keyword)cTypedefAssignment_5.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cPropertyAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cPropertyVariableParserRuleCall_7_0 = (RuleCall)cPropertyAssignment_7.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		
+		//StructureTypeDefinition fmlType::StructureType:
+		//	{fmlType::StructureType} visibility=VisibilityKind? 'type'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	typedef?='struct'
+		//	'{'
+		//	property+=Variable+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::StructureType} visibility=VisibilityKind? 'type' name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//typedef?='struct' '{' property+=Variable+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::StructureType}
+		public Action getStructureTypeAction_0() { return cStructureTypeAction_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
+		
+		//'type'
+		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//typedef?='struct'
+		public Assignment getTypedefAssignment_5() { return cTypedefAssignment_5; }
+		
+		//'struct'
+		public Keyword getTypedefStructKeyword_5_0() { return cTypedefStructKeyword_5_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
+		
+		//property+=Variable+
+		public Assignment getPropertyAssignment_7() { return cPropertyAssignment_7; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_7_0() { return cPropertyVariableParserRuleCall_7_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
+	}
+	public class StructureTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StructureTypeDefinitionImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cStructureTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Assignment cTypedefAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final Keyword cTypedefStructKeyword_3_0 = (Keyword)cTypedefAssignment_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cPropertyAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_5_0 = (RuleCall)cPropertyAssignment_5.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		
+		//StructureTypeDefinitionImpl fmlType::StructureType:
+		//	{fmlType::StructureType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	typedef?='struct'
+		//	'{'
+		//	property+=Variable+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::StructureType} name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='struct' '{' property+=Variable+
+		//'}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::StructureType}
+		public Action getStructureTypeAction_0() { return cStructureTypeAction_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//typedef?='struct'
+		public Assignment getTypedefAssignment_3() { return cTypedefAssignment_3; }
+		
+		//'struct'
+		public Keyword getTypedefStructKeyword_3_0() { return cTypedefStructKeyword_3_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
+		
+		//property+=Variable+
+		public Assignment getPropertyAssignment_5() { return cPropertyAssignment_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_5_0() { return cPropertyVariableParserRuleCall_5_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
+	}
+	public class UnionTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnionType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cUnionTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cUnionKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cPropertyAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cPropertyVariableParserRuleCall_3_0 = (RuleCall)cPropertyAssignment_3.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//UnionType fmlType::UnionType:
+		//	{fmlType::UnionType}
+		//	'union'
+		//	'{'
+		//	property+=Variable+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::UnionType} 'union' '{' property+=Variable+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::UnionType}
+		public Action getUnionTypeAction_0() { return cUnionTypeAction_0; }
+		
+		//'union'
+		public Keyword getUnionKeyword_1() { return cUnionKeyword_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+		
+		//property+=Variable+
+		public Assignment getPropertyAssignment_3() { return cPropertyAssignment_3; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_3_0() { return cPropertyVariableParserRuleCall_3_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+	public class UnionTypeDefinitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnionTypeDefinition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cUnionTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Assignment cTypedefAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final Keyword cTypedefUnionKeyword_5_0 = (Keyword)cTypedefAssignment_5.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cPropertyAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cPropertyVariableParserRuleCall_7_0 = (RuleCall)cPropertyAssignment_7.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		
+		//UnionTypeDefinition fmlType::UnionType:
+		//	{fmlType::UnionType} visibility=VisibilityKind? 'type'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	typedef?='union'
+		//	'{'
+		//	property+=Variable+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::UnionType} visibility=VisibilityKind? 'type' name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//typedef?='union' '{' property+=Variable+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::UnionType}
+		public Action getUnionTypeAction_0() { return cUnionTypeAction_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
+		
+		//'type'
+		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//typedef?='union'
+		public Assignment getTypedefAssignment_5() { return cTypedefAssignment_5; }
+		
+		//'union'
+		public Keyword getTypedefUnionKeyword_5_0() { return cTypedefUnionKeyword_5_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
+		
+		//property+=Variable+
+		public Assignment getPropertyAssignment_7() { return cPropertyAssignment_7; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_7_0() { return cPropertyVariableParserRuleCall_7_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
+	}
+	public class UnionTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnionTypeDefinitionImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cUnionTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Assignment cTypedefAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final Keyword cTypedefUnionKeyword_3_0 = (Keyword)cTypedefAssignment_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cPropertyAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_5_0 = (RuleCall)cPropertyAssignment_5.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		
+		//UnionTypeDefinitionImpl fmlType::UnionType:
+		//	{fmlType::UnionType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	typedef?='union'
+		//	'{'
+		//	property+=Variable+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::UnionType} name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='union' '{' property+=Variable+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::UnionType}
+		public Action getUnionTypeAction_0() { return cUnionTypeAction_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//typedef?='union'
+		public Assignment getTypedefAssignment_3() { return cTypedefAssignment_3; }
+		
+		//'union'
+		public Keyword getTypedefUnionKeyword_3_0() { return cTypedefUnionKeyword_3_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
+		
+		//property+=Variable+
+		public Assignment getPropertyAssignment_5() { return cPropertyAssignment_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_5_0() { return cPropertyVariableParserRuleCall_5_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
+	}
+	public class ChoiceTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChoiceType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cChoiceTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cChoiceKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cPropertyAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cPropertyVariableParserRuleCall_3_0 = (RuleCall)cPropertyAssignment_3.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//ChoiceType fmlType::ChoiceType:
+		//	{fmlType::ChoiceType}
+		//	'choice'
+		//	'{'
+		//	property+=Variable+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::ChoiceType} 'choice' '{' property+=Variable+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::ChoiceType}
+		public Action getChoiceTypeAction_0() { return cChoiceTypeAction_0; }
+		
+		//'choice'
+		public Keyword getChoiceKeyword_1() { return cChoiceKeyword_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+		
+		//property+=Variable+
+		public Assignment getPropertyAssignment_3() { return cPropertyAssignment_3; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_3_0() { return cPropertyVariableParserRuleCall_3_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+	public class ChoiceTypeDefinitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChoiceTypeDefinition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cChoiceTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Assignment cTypedefAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final Keyword cTypedefChoiceKeyword_5_0 = (Keyword)cTypedefAssignment_5.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cPropertyAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cPropertyVariableParserRuleCall_7_0 = (RuleCall)cPropertyAssignment_7.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		
+		//ChoiceTypeDefinition fmlType::ChoiceType:
+		//	{fmlType::ChoiceType} visibility=VisibilityKind? 'type'
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	typedef?='choice'
+		//	'{'
+		//	property+=Variable+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::ChoiceType} visibility=VisibilityKind? 'type' name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//typedef?='choice' '{' property+=Variable+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::ChoiceType}
+		public Action getChoiceTypeAction_0() { return cChoiceTypeAction_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
+		
+		//'type'
+		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//typedef?='choice'
+		public Assignment getTypedefAssignment_5() { return cTypedefAssignment_5; }
+		
+		//'choice'
+		public Keyword getTypedefChoiceKeyword_5_0() { return cTypedefChoiceKeyword_5_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
+		
+		//property+=Variable+
+		public Assignment getPropertyAssignment_7() { return cPropertyAssignment_7; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_7_0() { return cPropertyVariableParserRuleCall_7_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
+	}
+	public class ChoiceTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChoiceTypeDefinitionImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cChoiceTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Assignment cTypedefAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final Keyword cTypedefChoiceKeyword_3_0 = (Keyword)cTypedefAssignment_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cPropertyAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cPropertyVariableParserRuleCall_5_0 = (RuleCall)cPropertyAssignment_5.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		
+		//ChoiceTypeDefinitionImpl fmlType::ChoiceType:
+		//	{fmlType::ChoiceType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	typedef?='choice'
+		//	'{'
+		//	property+=Variable+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::ChoiceType} name=ESIdentifier unrestrictedName=UnrestrictedName? typedef?='choice' '{' property+=Variable+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::ChoiceType}
+		public Action getChoiceTypeAction_0() { return cChoiceTypeAction_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//typedef?='choice'
+		public Assignment getTypedefAssignment_3() { return cTypedefAssignment_3; }
+		
+		//'choice'
+		public Keyword getTypedefChoiceKeyword_3_0() { return cTypedefChoiceKeyword_3_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
+		
+		//property+=Variable+
+		public Assignment getPropertyAssignment_5() { return cPropertyAssignment_5; }
+		
+		//Variable
+		public RuleCall getPropertyVariableParserRuleCall_5_0() { return cPropertyVariableParserRuleCall_5_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
+	}
+	public class ModifierElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Modifier");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cModifierAction_0 = (Action)cGroup.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
+		private final Assignment cStaticAssignment_1_0 = (Assignment)cUnorderedGroup_1.eContents().get(0);
+		private final Keyword cStaticStaticKeyword_1_0_0 = (Keyword)cStaticAssignment_1_0.eContents().get(0);
+		private final Assignment cFinalAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
+		private final Keyword cFinalFinalKeyword_1_1_0 = (Keyword)cFinalAssignment_1_1.eContents().get(0);
+		private final Assignment cReferenceAssignment_1_2 = (Assignment)cUnorderedGroup_1.eContents().get(2);
+		private final Keyword cReferenceReferenceKeyword_1_2_0 = (Keyword)cReferenceAssignment_1_2.eContents().get(0);
+		private final Assignment cVolatileAssignment_1_3 = (Assignment)cUnorderedGroup_1.eContents().get(3);
+		private final Keyword cVolatileVolatileKeyword_1_3_0 = (Keyword)cVolatileAssignment_1_3.eContents().get(0);
+		private final Assignment cTransientAssignment_1_4 = (Assignment)cUnorderedGroup_1.eContents().get(4);
+		private final Keyword cTransientTransientKeyword_1_4_0 = (Keyword)cTransientAssignment_1_4.eContents().get(0);
+		
+		/// *
+		//enum TypeSpecifyerKind returns TypeSpecifyerKind
+		//	: ALIAS = 'ALIAS'
+		//	| BOOLEAN = 'BOOLEAN'
+		//	| CHAR = 'CHAR'
+		//	| INT = 'INT'
+		//	| RATIONAL = 'RATIONAL'
+		//	| URATIONAL = 'URATIONAL'
+		//	| FLOAT = 'FLOAT'
+		//	| UFLOAT = 'UFLOAT'
+		//	| DOUBLE = 'DOUBLE'
+		//	| UDOUBLE = 'UDOUBLE'
+		//	| REAL = 'REAL'
+		//	| UREAL = 'UREAL'
+		//	| CTIME = 'CTIME'
+		//	| DTIME = 'DTIME'
+		//	| STRING = 'STRING'
+		//	| IDENTIFIER = 'IDENTIFIER'
+		//	| UFI = 'UFI'
+		//	| ARRAY = 'ARRAY'
+		//	| VECTOR = 'VECTOR'
+		//	| LIST = 'LIST'
+		//	| FIFO = 'FIFO'
+		//	| LIFO = 'LIFO'
+		//	| MULTISET = 'MULTISET'
+		//	| SET = 'SET'
+		//	| INTERVAL = 'INTERVAL'
+		//	| ENUM = 'ENUM'
+		//	| STRUCTURE = 'STRUCTURE'
+		//	| BUFFER = 'BUFFER'
+		//	| MESSAGE = 'MESSAGE'
+		//	| PORT = 'PORT'
+		//	| CONNECTION = 'CONNECTION'
+		//	| OPERATOR = 'OPERATOR'
+		//	| MACHINE = 'MACHINE'
+		//	| LAMBDA = 'LAMBDA'
+		//	| UNIVERSAL = 'UNIVERSAL'
+		//	;
+		// * / ////////////////////////////////////////////////////////////////////////////////
+		//// Variable Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Modifier fmlInfra::Modifier:
+		//	{fmlInfra::Modifier} (static?='static'?
+		//	& final?='final'?
+		//	& reference?='reference'?
+		//	& volatile?='volatile'?
+		//	& transient?='transient'?)
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Modifier} (static?='static'? & final?='final'? & reference?='reference'? & volatile?='volatile'? &
+		//transient?='transient'?)
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Modifier}
+		public Action getModifierAction_0() { return cModifierAction_0; }
+		
+		//(static?='static'? & final?='final'? & reference?='reference'? & volatile?='volatile'? & transient?='transient'?)
+		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
+		
+		//static?='static'?
+		public Assignment getStaticAssignment_1_0() { return cStaticAssignment_1_0; }
+		
+		//'static'
+		public Keyword getStaticStaticKeyword_1_0_0() { return cStaticStaticKeyword_1_0_0; }
+		
+		//final?='final'?
+		public Assignment getFinalAssignment_1_1() { return cFinalAssignment_1_1; }
+		
+		//'final'
+		public Keyword getFinalFinalKeyword_1_1_0() { return cFinalFinalKeyword_1_1_0; }
+		
+		//reference?='reference'?
+		public Assignment getReferenceAssignment_1_2() { return cReferenceAssignment_1_2; }
+		
+		//'reference'
+		public Keyword getReferenceReferenceKeyword_1_2_0() { return cReferenceReferenceKeyword_1_2_0; }
+		
+		//volatile?='volatile'?
+		public Assignment getVolatileAssignment_1_3() { return cVolatileAssignment_1_3; }
+		
+		//'volatile'
+		public Keyword getVolatileVolatileKeyword_1_3_0() { return cVolatileVolatileKeyword_1_3_0; }
+		
+		//transient?='transient'?
+		public Assignment getTransientAssignment_1_4() { return cTransientAssignment_1_4; }
+		
+		//'transient'
+		public Keyword getTransientTransientKeyword_1_4_0() { return cTransientTransientKeyword_1_4_0; }
+	}
+	public class VariableElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Variable");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final UnorderedGroup cUnorderedGroup_0 = (UnorderedGroup)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_0_0 = (Assignment)cUnorderedGroup_0.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0_0 = (RuleCall)cVisibilityAssignment_0_0.eContents().get(0);
+		private final Assignment cModifierAssignment_0_1 = (Assignment)cUnorderedGroup_0.eContents().get(1);
+		private final RuleCall cModifierModifierParserRuleCall_0_1_0 = (RuleCall)cModifierAssignment_0_1.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Keyword cVarKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
+		private final Assignment cConstAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
+		private final Keyword cConstValKeyword_1_1_0 = (Keyword)cConstAssignment_1_1.eContents().get(0);
+		private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
+		private final Alternatives cAlternatives_1_2_0 = (Alternatives)cGroup_1_2.eContents().get(0);
+		private final Assignment cConstAssignment_1_2_0_0 = (Assignment)cAlternatives_1_2_0.eContents().get(0);
+		private final Keyword cConstConstKeyword_1_2_0_0_0 = (Keyword)cConstAssignment_1_2_0_0.eContents().get(0);
+		private final Assignment cConstAssignment_1_2_0_1 = (Assignment)cAlternatives_1_2_0.eContents().get(1);
+		private final Keyword cConstFinalKeyword_1_2_0_1_0 = (Keyword)cConstAssignment_1_2_0_1.eContents().get(0);
+		private final Assignment cMacroAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
+		private final Keyword cMacroMacroKeyword_1_2_1_0 = (Keyword)cMacroAssignment_1_2_1.eContents().get(0);
+		private final Keyword cVarKeyword_1_2_2 = (Keyword)cGroup_1_2.eContents().get(2);
+		private final Group cGroup_1_3 = (Group)cAlternatives_1.eContents().get(3);
+		private final Assignment cMacroAssignment_1_3_0 = (Assignment)cGroup_1_3.eContents().get(0);
+		private final Keyword cMacroMacroKeyword_1_3_0_0 = (Keyword)cMacroAssignment_1_3_0.eContents().get(0);
+		private final Alternatives cAlternatives_1_3_1 = (Alternatives)cGroup_1_3.eContents().get(1);
+		private final Keyword cVarKeyword_1_3_1_0 = (Keyword)cAlternatives_1_3_1.eContents().get(0);
+		private final Assignment cConstAssignment_1_3_1_1 = (Assignment)cAlternatives_1_3_1.eContents().get(1);
+		private final Keyword cConstValKeyword_1_3_1_1_0 = (Keyword)cConstAssignment_1_3_1_1.eContents().get(0);
+		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
+		private final Keyword cEqualsSignKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_5_1_0 = (RuleCall)cDefaultValueAssignment_5_1.eContents().get(0);
+		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
+		private final Group cGroup_6_0 = (Group)cAlternatives_6.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_6_0_0 = (Keyword)cGroup_6_0.eContents().get(0);
+		private final Assignment cOnWriteActionAssignment_6_0_1 = (Assignment)cGroup_6_0.eContents().get(1);
+		private final RuleCall cOnWriteActionOnWriteRoutineParserRuleCall_6_0_1_0 = (RuleCall)cOnWriteActionAssignment_6_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_6_0_2 = (Keyword)cGroup_6_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_6_1 = (Keyword)cAlternatives_6.eContents().get(1);
+		
+		//Variable fmlInfra::Variable:
+		//	(visibility=VisibilityKind? & modifier=Modifier?) ('var' | const?='val'
+		//	| (const?='const' | const?='final') macro?='macro'? 'var'?
+		//	| macro?='macro' ('var' | const?='val')?) type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+		//	'}' | ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//(visibility=VisibilityKind? & modifier=Modifier?) ('var' | const?='val' | (const?='const' | const?='final')
+		//macro?='macro'? 'var'? | macro?='macro' ('var' | const?='val')?) type=DataType name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//(visibility=VisibilityKind? & modifier=Modifier?)
+		public UnorderedGroup getUnorderedGroup_0() { return cUnorderedGroup_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_0_0() { return cVisibilityAssignment_0_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0_0; }
+		
+		//modifier=Modifier?
+		public Assignment getModifierAssignment_0_1() { return cModifierAssignment_0_1; }
+		
+		//Modifier
+		public RuleCall getModifierModifierParserRuleCall_0_1_0() { return cModifierModifierParserRuleCall_0_1_0; }
+		
+		//('var' | const?='val' | (const?='const' | const?='final') macro?='macro'? 'var'? | macro?='macro' ('var' |
+		//const?='val')?)
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//'var'
+		public Keyword getVarKeyword_1_0() { return cVarKeyword_1_0; }
+		
+		//const?='val'
+		public Assignment getConstAssignment_1_1() { return cConstAssignment_1_1; }
+		
+		//'val'
+		public Keyword getConstValKeyword_1_1_0() { return cConstValKeyword_1_1_0; }
+		
+		//(const?='const' | const?='final') macro?='macro'? 'var'?
+		public Group getGroup_1_2() { return cGroup_1_2; }
+		
+		//(const?='const' | const?='final')
+		public Alternatives getAlternatives_1_2_0() { return cAlternatives_1_2_0; }
+		
+		//const?='const'
+		public Assignment getConstAssignment_1_2_0_0() { return cConstAssignment_1_2_0_0; }
+		
+		//'const'
+		public Keyword getConstConstKeyword_1_2_0_0_0() { return cConstConstKeyword_1_2_0_0_0; }
+		
+		//const?='final'
+		public Assignment getConstAssignment_1_2_0_1() { return cConstAssignment_1_2_0_1; }
+		
+		//'final'
+		public Keyword getConstFinalKeyword_1_2_0_1_0() { return cConstFinalKeyword_1_2_0_1_0; }
+		
+		//macro?='macro'?
+		public Assignment getMacroAssignment_1_2_1() { return cMacroAssignment_1_2_1; }
+		
+		//'macro'
+		public Keyword getMacroMacroKeyword_1_2_1_0() { return cMacroMacroKeyword_1_2_1_0; }
+		
+		//'var'?
+		public Keyword getVarKeyword_1_2_2() { return cVarKeyword_1_2_2; }
+		
+		//macro?='macro' ('var' | const?='val')?
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//macro?='macro'
+		public Assignment getMacroAssignment_1_3_0() { return cMacroAssignment_1_3_0; }
+		
+		//'macro'
+		public Keyword getMacroMacroKeyword_1_3_0_0() { return cMacroMacroKeyword_1_3_0_0; }
+		
+		//('var' | const?='val')?
+		public Alternatives getAlternatives_1_3_1() { return cAlternatives_1_3_1; }
+		
+		//'var'
+		public Keyword getVarKeyword_1_3_1_0() { return cVarKeyword_1_3_1_0; }
+		
+		//const?='val'
+		public Assignment getConstAssignment_1_3_1_1() { return cConstAssignment_1_3_1_1; }
+		
+		//'val'
+		public Keyword getConstValKeyword_1_3_1_1_0() { return cConstValKeyword_1_3_1_1_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_5() { return cGroup_5; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_5_0() { return cEqualsSignKeyword_5_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_5_1() { return cDefaultValueAssignment_5_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_5_1_0() { return cDefaultValueExpressionParserRuleCall_5_1_0; }
+		
+		//('{' onWriteAction=OnWriteRoutine '}' | ';')
+		public Alternatives getAlternatives_6() { return cAlternatives_6; }
+		
+		//'{' onWriteAction=OnWriteRoutine '}'
+		public Group getGroup_6_0() { return cGroup_6_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_6_0_0() { return cLeftCurlyBracketKeyword_6_0_0; }
+		
+		//onWriteAction=OnWriteRoutine
+		public Assignment getOnWriteActionAssignment_6_0_1() { return cOnWriteActionAssignment_6_0_1; }
+		
+		//OnWriteRoutine
+		public RuleCall getOnWriteActionOnWriteRoutineParserRuleCall_6_0_1_0() { return cOnWriteActionOnWriteRoutineParserRuleCall_6_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_6_0_2() { return cRightCurlyBracketKeyword_6_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_6_1() { return cSemicolonKeyword_6_1; }
+	}
+	public class VariableImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariableImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final UnorderedGroup cUnorderedGroup_0 = (UnorderedGroup)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_0_0 = (Alternatives)cUnorderedGroup_0.eContents().get(0);
+		private final Assignment cConstAssignment_0_0_0 = (Assignment)cAlternatives_0_0.eContents().get(0);
+		private final Keyword cConstConstKeyword_0_0_0_0 = (Keyword)cConstAssignment_0_0_0.eContents().get(0);
+		private final Assignment cConstAssignment_0_0_1 = (Assignment)cAlternatives_0_0.eContents().get(1);
+		private final Keyword cConstFinalKeyword_0_0_1_0 = (Keyword)cConstAssignment_0_0_1.eContents().get(0);
+		private final Assignment cMacroAssignment_0_1 = (Assignment)cUnorderedGroup_0.eContents().get(1);
+		private final Keyword cMacroMacroKeyword_0_1_0 = (Keyword)cMacroAssignment_0_1.eContents().get(0);
+		private final Assignment cTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cTypeDataTypeParserRuleCall_1_0 = (RuleCall)cTypeAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cEqualsSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_4_1_0 = (RuleCall)cDefaultValueAssignment_4_1.eContents().get(0);
+		private final Alternatives cAlternatives_5 = (Alternatives)cGroup.eContents().get(5);
+		private final Group cGroup_5_0 = (Group)cAlternatives_5.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_5_0_0 = (Keyword)cGroup_5_0.eContents().get(0);
+		private final Assignment cOnWriteActionAssignment_5_0_1 = (Assignment)cGroup_5_0.eContents().get(1);
+		private final RuleCall cOnWriteActionOnWriteRoutineParserRuleCall_5_0_1_0 = (RuleCall)cOnWriteActionAssignment_5_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_5_0_2 = (Keyword)cGroup_5_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_5_1 = (Keyword)cAlternatives_5.eContents().get(1);
+		
+		//VariableImpl fmlInfra::Variable:
+		//	((const?='const' | const?='final')? & macro?='macro'?) type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+		//	'}' | ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//((const?='const' | const?='final')? & macro?='macro'?) type=DataType name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//((const?='const' | const?='final')? & macro?='macro'?)
+		public UnorderedGroup getUnorderedGroup_0() { return cUnorderedGroup_0; }
+		
+		//(const?='const' | const?='final')?
+		public Alternatives getAlternatives_0_0() { return cAlternatives_0_0; }
+		
+		//const?='const'
+		public Assignment getConstAssignment_0_0_0() { return cConstAssignment_0_0_0; }
+		
+		//'const'
+		public Keyword getConstConstKeyword_0_0_0_0() { return cConstConstKeyword_0_0_0_0; }
+		
+		//const?='final'
+		public Assignment getConstAssignment_0_0_1() { return cConstAssignment_0_0_1; }
+		
+		//'final'
+		public Keyword getConstFinalKeyword_0_0_1_0() { return cConstFinalKeyword_0_0_1_0; }
+		
+		//macro?='macro'?
+		public Assignment getMacroAssignment_0_1() { return cMacroAssignment_0_1; }
+		
+		//'macro'
+		public Keyword getMacroMacroKeyword_0_1_0() { return cMacroMacroKeyword_0_1_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_1() { return cTypeAssignment_1; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_1_0() { return cTypeDataTypeParserRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_4_0() { return cEqualsSignKeyword_4_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_4_1() { return cDefaultValueAssignment_4_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_4_1_0() { return cDefaultValueExpressionParserRuleCall_4_1_0; }
+		
+		//('{' onWriteAction=OnWriteRoutine '}' | ';')
+		public Alternatives getAlternatives_5() { return cAlternatives_5; }
+		
+		//'{' onWriteAction=OnWriteRoutine '}'
+		public Group getGroup_5_0() { return cGroup_5_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_5_0_0() { return cLeftCurlyBracketKeyword_5_0_0; }
+		
+		//onWriteAction=OnWriteRoutine
+		public Assignment getOnWriteActionAssignment_5_0_1() { return cOnWriteActionAssignment_5_0_1; }
+		
+		//OnWriteRoutine
+		public RuleCall getOnWriteActionOnWriteRoutineParserRuleCall_5_0_1_0() { return cOnWriteActionOnWriteRoutineParserRuleCall_5_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_5_0_2() { return cRightCurlyBracketKeyword_5_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5_1() { return cSemicolonKeyword_5_1; }
+	}
+	public class OnWriteRoutineElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cRoutineAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cOn_writeKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cParameterAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cParameterVariableRoutineParameterParserRuleCall_2_1_0 = (RuleCall)cParameterAssignment_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
+		private final Assignment cBodyBlockAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_3_0 = (RuleCall)cBodyBlockAssignment_3.eContents().get(0);
+		
+		//OnWriteRoutine fmlInfra::Routine:
+		//	{fmlInfra::Routine}
+		//	'@on_write' ('(' parameter+=VariableRoutineParameter ')')?
+		//	bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Routine} '@on_write' ('(' parameter+=VariableRoutineParameter ')')? bodyBlock=BlockStatement
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Routine}
+		public Action getRoutineAction_0() { return cRoutineAction_0; }
+		
+		//'@on_write'
+		public Keyword getOn_writeKeyword_1() { return cOn_writeKeyword_1; }
+		
+		//('(' parameter+=VariableRoutineParameter ')')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
+		
+		//parameter+=VariableRoutineParameter
+		public Assignment getParameterAssignment_2_1() { return cParameterAssignment_2_1; }
+		
+		//VariableRoutineParameter
+		public RuleCall getParameterVariableRoutineParameterParserRuleCall_2_1_0() { return cParameterVariableRoutineParameterParserRuleCall_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_3() { return cBodyBlockAssignment_3; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_3_0() { return cBodyBlockBlockStatementParserRuleCall_3_0; }
+	}
+	public class VariableRoutineParameterElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariableRoutineParameter");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cTypeAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cTypeDataTypeParserRuleCall_0_0 = (RuleCall)cTypeAssignment_0.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cEqualsSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_2_1_0 = (RuleCall)cDefaultValueAssignment_2_1.eContents().get(0);
+		
+		//VariableRoutineParameter fmlInfra::Parameter:
+		//	type=DataType?
+		//	name=ESIdentifier ('=' defaultValue=Expression)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//type=DataType? name=ESIdentifier ('=' defaultValue=Expression)?
+		public Group getGroup() { return cGroup; }
+		
+		//type=DataType?
+		public Assignment getTypeAssignment_0() { return cTypeAssignment_0; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_0_0() { return cTypeDataTypeParserRuleCall_0_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_2_0() { return cEqualsSignKeyword_2_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_2_1() { return cDefaultValueAssignment_2_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_2_1_0() { return cDefaultValueExpressionParserRuleCall_2_1_0; }
+	}
+	public class VariablePublicElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cModifierAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cModifierModifierParserRuleCall_0_0 = (RuleCall)cModifierAssignment_0.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_1_0 = (Alternatives)cUnorderedGroup_1.eContents().get(0);
+		private final Assignment cConstAssignment_1_0_0 = (Assignment)cAlternatives_1_0.eContents().get(0);
+		private final Keyword cConstConstKeyword_1_0_0_0 = (Keyword)cConstAssignment_1_0_0.eContents().get(0);
+		private final Assignment cConstAssignment_1_0_1 = (Assignment)cAlternatives_1_0.eContents().get(1);
+		private final Keyword cConstFinalKeyword_1_0_1_0 = (Keyword)cConstAssignment_1_0_1.eContents().get(0);
+		private final Assignment cMacroAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
+		private final Keyword cMacroMacroKeyword_1_1_0 = (Keyword)cMacroAssignment_1_1.eContents().get(0);
+		private final Assignment cVisibilityAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cVisibilityPublicVariableVisibilityKindEnumRuleCall_2_0 = (RuleCall)cVisibilityAssignment_2.eContents().get(0);
+		private final Assignment cTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cTypeDataTypeParserRuleCall_3_0 = (RuleCall)cTypeAssignment_3.eContents().get(0);
+		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cEqualsSignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_6_1_0 = (RuleCall)cDefaultValueAssignment_6_1.eContents().get(0);
+		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
+		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
+		private final Assignment cOnWriteActionAssignment_7_0_1 = (Assignment)cGroup_7_0.eContents().get(1);
+		private final RuleCall cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0 = (RuleCall)cOnWriteActionAssignment_7_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_2 = (Keyword)cGroup_7_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_7_1 = (Keyword)cAlternatives_7.eContents().get(1);
+		
+		//VariablePublic fmlInfra::Variable:
+		//	modifier=Modifier? ((const?='const' | const?='final')?
+		//	& macro?='macro'?)?
+		//	visibility=PublicVariableVisibilityKind
+		//	type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+		//	'}' | ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//modifier=Modifier? ((const?='const' | const?='final')? & macro?='macro'?)? visibility=PublicVariableVisibilityKind
+		//type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{'
+		//onWriteAction=OnWriteRoutine '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//modifier=Modifier?
+		public Assignment getModifierAssignment_0() { return cModifierAssignment_0; }
+		
+		//Modifier
+		public RuleCall getModifierModifierParserRuleCall_0_0() { return cModifierModifierParserRuleCall_0_0; }
+		
+		//((const?='const' | const?='final')? & macro?='macro'?)?
+		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
+		
+		//(const?='const' | const?='final')?
+		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
+		
+		//const?='const'
+		public Assignment getConstAssignment_1_0_0() { return cConstAssignment_1_0_0; }
+		
+		//'const'
+		public Keyword getConstConstKeyword_1_0_0_0() { return cConstConstKeyword_1_0_0_0; }
+		
+		//const?='final'
+		public Assignment getConstAssignment_1_0_1() { return cConstAssignment_1_0_1; }
+		
+		//'final'
+		public Keyword getConstFinalKeyword_1_0_1_0() { return cConstFinalKeyword_1_0_1_0; }
+		
+		//macro?='macro'?
+		public Assignment getMacroAssignment_1_1() { return cMacroAssignment_1_1; }
+		
+		//'macro'
+		public Keyword getMacroMacroKeyword_1_1_0() { return cMacroMacroKeyword_1_1_0; }
+		
+		//visibility=PublicVariableVisibilityKind
+		public Assignment getVisibilityAssignment_2() { return cVisibilityAssignment_2; }
+		
+		//PublicVariableVisibilityKind
+		public RuleCall getVisibilityPublicVariableVisibilityKindEnumRuleCall_2_0() { return cVisibilityPublicVariableVisibilityKindEnumRuleCall_2_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_3() { return cTypeAssignment_3; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_3_0() { return cTypeDataTypeParserRuleCall_3_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_6() { return cGroup_6; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_6_0() { return cEqualsSignKeyword_6_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_6_1() { return cDefaultValueAssignment_6_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_6_1_0() { return cDefaultValueExpressionParserRuleCall_6_1_0; }
+		
+		//('{' onWriteAction=OnWriteRoutine '}' | ';')
+		public Alternatives getAlternatives_7() { return cAlternatives_7; }
+		
+		//'{' onWriteAction=OnWriteRoutine '}'
+		public Group getGroup_7_0() { return cGroup_7_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_0() { return cLeftCurlyBracketKeyword_7_0_0; }
+		
+		//onWriteAction=OnWriteRoutine
+		public Assignment getOnWriteActionAssignment_7_0_1() { return cOnWriteActionAssignment_7_0_1; }
+		
+		//OnWriteRoutine
+		public RuleCall getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0() { return cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_2() { return cRightCurlyBracketKeyword_7_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_7_1() { return cSemicolonKeyword_7_1; }
+	}
+	public class VariableProtectedElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cModifierAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cModifierModifierParserRuleCall_0_0 = (RuleCall)cModifierAssignment_0.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_1_0 = (Alternatives)cUnorderedGroup_1.eContents().get(0);
+		private final Assignment cConstAssignment_1_0_0 = (Assignment)cAlternatives_1_0.eContents().get(0);
+		private final Keyword cConstConstKeyword_1_0_0_0 = (Keyword)cConstAssignment_1_0_0.eContents().get(0);
+		private final Assignment cConstAssignment_1_0_1 = (Assignment)cAlternatives_1_0.eContents().get(1);
+		private final Keyword cConstFinalKeyword_1_0_1_0 = (Keyword)cConstAssignment_1_0_1.eContents().get(0);
+		private final Assignment cMacroAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
+		private final Keyword cMacroMacroKeyword_1_1_0 = (Keyword)cMacroAssignment_1_1.eContents().get(0);
+		private final Assignment cVisibilityAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cVisibilityProtectedVariableVisibilityKindEnumRuleCall_2_0 = (RuleCall)cVisibilityAssignment_2.eContents().get(0);
+		private final Assignment cTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cTypeDataTypeParserRuleCall_3_0 = (RuleCall)cTypeAssignment_3.eContents().get(0);
+		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cEqualsSignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_6_1_0 = (RuleCall)cDefaultValueAssignment_6_1.eContents().get(0);
+		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
+		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
+		private final Assignment cOnWriteActionAssignment_7_0_1 = (Assignment)cGroup_7_0.eContents().get(1);
+		private final RuleCall cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0 = (RuleCall)cOnWriteActionAssignment_7_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_2 = (Keyword)cGroup_7_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_7_1 = (Keyword)cAlternatives_7.eContents().get(1);
+		
+		//VariableProtected fmlInfra::Variable:
+		//	modifier=Modifier? ((const?='const' | const?='final')?
+		//	& macro?='macro'?)?
+		//	visibility=ProtectedVariableVisibilityKind
+		//	type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+		//	'}' | ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//modifier=Modifier? ((const?='const' | const?='final')? & macro?='macro'?)? visibility=ProtectedVariableVisibilityKind
+		//type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{'
+		//onWriteAction=OnWriteRoutine '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//modifier=Modifier?
+		public Assignment getModifierAssignment_0() { return cModifierAssignment_0; }
+		
+		//Modifier
+		public RuleCall getModifierModifierParserRuleCall_0_0() { return cModifierModifierParserRuleCall_0_0; }
+		
+		//((const?='const' | const?='final')? & macro?='macro'?)?
+		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
+		
+		//(const?='const' | const?='final')?
+		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
+		
+		//const?='const'
+		public Assignment getConstAssignment_1_0_0() { return cConstAssignment_1_0_0; }
+		
+		//'const'
+		public Keyword getConstConstKeyword_1_0_0_0() { return cConstConstKeyword_1_0_0_0; }
+		
+		//const?='final'
+		public Assignment getConstAssignment_1_0_1() { return cConstAssignment_1_0_1; }
+		
+		//'final'
+		public Keyword getConstFinalKeyword_1_0_1_0() { return cConstFinalKeyword_1_0_1_0; }
+		
+		//macro?='macro'?
+		public Assignment getMacroAssignment_1_1() { return cMacroAssignment_1_1; }
+		
+		//'macro'
+		public Keyword getMacroMacroKeyword_1_1_0() { return cMacroMacroKeyword_1_1_0; }
+		
+		//visibility=ProtectedVariableVisibilityKind
+		public Assignment getVisibilityAssignment_2() { return cVisibilityAssignment_2; }
+		
+		//ProtectedVariableVisibilityKind
+		public RuleCall getVisibilityProtectedVariableVisibilityKindEnumRuleCall_2_0() { return cVisibilityProtectedVariableVisibilityKindEnumRuleCall_2_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_3() { return cTypeAssignment_3; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_3_0() { return cTypeDataTypeParserRuleCall_3_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_6() { return cGroup_6; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_6_0() { return cEqualsSignKeyword_6_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_6_1() { return cDefaultValueAssignment_6_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_6_1_0() { return cDefaultValueExpressionParserRuleCall_6_1_0; }
+		
+		//('{' onWriteAction=OnWriteRoutine '}' | ';')
+		public Alternatives getAlternatives_7() { return cAlternatives_7; }
+		
+		//'{' onWriteAction=OnWriteRoutine '}'
+		public Group getGroup_7_0() { return cGroup_7_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_0() { return cLeftCurlyBracketKeyword_7_0_0; }
+		
+		//onWriteAction=OnWriteRoutine
+		public Assignment getOnWriteActionAssignment_7_0_1() { return cOnWriteActionAssignment_7_0_1; }
+		
+		//OnWriteRoutine
+		public RuleCall getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0() { return cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_2() { return cRightCurlyBracketKeyword_7_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_7_1() { return cSemicolonKeyword_7_1; }
+	}
+	public class VariablePrivateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cModifierAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cModifierModifierParserRuleCall_0_0 = (RuleCall)cModifierAssignment_0.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
+		private final Alternatives cAlternatives_1_0 = (Alternatives)cUnorderedGroup_1.eContents().get(0);
+		private final Assignment cConstAssignment_1_0_0 = (Assignment)cAlternatives_1_0.eContents().get(0);
+		private final Keyword cConstConstKeyword_1_0_0_0 = (Keyword)cConstAssignment_1_0_0.eContents().get(0);
+		private final Assignment cConstAssignment_1_0_1 = (Assignment)cAlternatives_1_0.eContents().get(1);
+		private final Keyword cConstFinalKeyword_1_0_1_0 = (Keyword)cConstAssignment_1_0_1.eContents().get(0);
+		private final Assignment cMacroAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
+		private final Keyword cMacroMacroKeyword_1_1_0 = (Keyword)cMacroAssignment_1_1.eContents().get(0);
+		private final Assignment cVisibilityAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cVisibilityPrivateVariableVisibilityKindEnumRuleCall_2_0 = (RuleCall)cVisibilityAssignment_2.eContents().get(0);
+		private final Assignment cTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cTypeDataTypeParserRuleCall_3_0 = (RuleCall)cTypeAssignment_3.eContents().get(0);
+		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cEqualsSignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_6_1_0 = (RuleCall)cDefaultValueAssignment_6_1.eContents().get(0);
+		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
+		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
+		private final Assignment cOnWriteActionAssignment_7_0_1 = (Assignment)cGroup_7_0.eContents().get(1);
+		private final RuleCall cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0 = (RuleCall)cOnWriteActionAssignment_7_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_7_0_2 = (Keyword)cGroup_7_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_7_1 = (Keyword)cAlternatives_7.eContents().get(1);
+		
+		//VariablePrivate fmlInfra::Variable:
+		//	modifier=Modifier? ((const?='const' | const?='final')?
+		//	& macro?='macro'?)?
+		//	visibility=PrivateVariableVisibilityKind
+		//	type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+		//	'}' | ';')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//modifier=Modifier? ((const?='const' | const?='final')? & macro?='macro'?)? visibility=PrivateVariableVisibilityKind
+		//type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{'
+		//onWriteAction=OnWriteRoutine '}' | ';')
+		public Group getGroup() { return cGroup; }
+		
+		//modifier=Modifier?
+		public Assignment getModifierAssignment_0() { return cModifierAssignment_0; }
+		
+		//Modifier
+		public RuleCall getModifierModifierParserRuleCall_0_0() { return cModifierModifierParserRuleCall_0_0; }
+		
+		//((const?='const' | const?='final')? & macro?='macro'?)?
+		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
+		
+		//(const?='const' | const?='final')?
+		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
+		
+		//const?='const'
+		public Assignment getConstAssignment_1_0_0() { return cConstAssignment_1_0_0; }
+		
+		//'const'
+		public Keyword getConstConstKeyword_1_0_0_0() { return cConstConstKeyword_1_0_0_0; }
+		
+		//const?='final'
+		public Assignment getConstAssignment_1_0_1() { return cConstAssignment_1_0_1; }
+		
+		//'final'
+		public Keyword getConstFinalKeyword_1_0_1_0() { return cConstFinalKeyword_1_0_1_0; }
+		
+		//macro?='macro'?
+		public Assignment getMacroAssignment_1_1() { return cMacroAssignment_1_1; }
+		
+		//'macro'
+		public Keyword getMacroMacroKeyword_1_1_0() { return cMacroMacroKeyword_1_1_0; }
+		
+		//visibility=PrivateVariableVisibilityKind
+		public Assignment getVisibilityAssignment_2() { return cVisibilityAssignment_2; }
+		
+		//PrivateVariableVisibilityKind
+		public RuleCall getVisibilityPrivateVariableVisibilityKindEnumRuleCall_2_0() { return cVisibilityPrivateVariableVisibilityKindEnumRuleCall_2_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_3() { return cTypeAssignment_3; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_3_0() { return cTypeDataTypeParserRuleCall_3_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_6() { return cGroup_6; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_6_0() { return cEqualsSignKeyword_6_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_6_1() { return cDefaultValueAssignment_6_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_6_1_0() { return cDefaultValueExpressionParserRuleCall_6_1_0; }
+		
+		//('{' onWriteAction=OnWriteRoutine '}' | ';')
+		public Alternatives getAlternatives_7() { return cAlternatives_7; }
+		
+		//'{' onWriteAction=OnWriteRoutine '}'
+		public Group getGroup_7_0() { return cGroup_7_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_7_0_0() { return cLeftCurlyBracketKeyword_7_0_0; }
+		
+		//onWriteAction=OnWriteRoutine
+		public Assignment getOnWriteActionAssignment_7_0_1() { return cOnWriteActionAssignment_7_0_1; }
+		
+		//OnWriteRoutine
+		public RuleCall getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0() { return cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_7_0_2() { return cRightCurlyBracketKeyword_7_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_7_1() { return cSemicolonKeyword_7_1; }
+	}
+	public class FunctionalParameterSetElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cParameterSetAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cParameterAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cParameterFunctionalParameterParserRuleCall_1_0 = (RuleCall)cParameterAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cCommaKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cParameterAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cParameterFunctionalParameterParserRuleCall_2_1_0 = (RuleCall)cParameterAssignment_2_1.eContents().get(0);
+		
+		//FunctionalParameterSet fmlInfra::ParameterSet:
+		//	{fmlInfra::ParameterSet} parameter+=FunctionalParameter (',' parameter+=FunctionalParameter)*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::ParameterSet} parameter+=FunctionalParameter (',' parameter+=FunctionalParameter)*
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::ParameterSet}
+		public Action getParameterSetAction_0() { return cParameterSetAction_0; }
+		
+		//parameter+=FunctionalParameter
+		public Assignment getParameterAssignment_1() { return cParameterAssignment_1; }
+		
+		//FunctionalParameter
+		public RuleCall getParameterFunctionalParameterParserRuleCall_1_0() { return cParameterFunctionalParameterParserRuleCall_1_0; }
+		
+		//(',' parameter+=FunctionalParameter)*
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//','
+		public Keyword getCommaKeyword_2_0() { return cCommaKeyword_2_0; }
+		
+		//parameter+=FunctionalParameter
+		public Assignment getParameterAssignment_2_1() { return cParameterAssignment_2_1; }
+		
+		//FunctionalParameter
+		public RuleCall getParameterFunctionalParameterParserRuleCall_2_1_0() { return cParameterFunctionalParameterParserRuleCall_2_1_0; }
+	}
+	public class FunctionalParameterElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cParameterAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionParameterDirectionKindEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cEqualsSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_4_1_0 = (RuleCall)cDefaultValueAssignment_4_1.eContents().get(0);
+		
+		//FunctionalParameter fmlInfra::Parameter:
+		//	{fmlInfra::Parameter} direction=ParameterDirectionKind? type=DataType
+		//	name=ESIdentifier ('=' defaultValue=Expression)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Parameter} direction=ParameterDirectionKind? type=DataType name=ESIdentifier ('=' defaultValue=Expression)?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Parameter}
+		public Action getParameterAction_0() { return cParameterAction_0; }
+		
+		//direction=ParameterDirectionKind?
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//ParameterDirectionKind
+		public RuleCall getDirectionParameterDirectionKindEnumRuleCall_1_0() { return cDirectionParameterDirectionKindEnumRuleCall_1_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_4_0() { return cEqualsSignKeyword_4_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_4_1() { return cDefaultValueAssignment_4_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_4_1_0() { return cDefaultValueExpressionParserRuleCall_4_1_0; }
+	}
+	public class FormalParameterSetElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cParameterSetAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cParameterAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_1_0 = (RuleCall)cParameterAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cCommaKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cParameterAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_2_1_0 = (RuleCall)cParameterAssignment_2_1.eContents().get(0);
+		
+		//FormalParameterSet fmlInfra::ParameterSet:
+		//	{fmlInfra::ParameterSet} parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::ParameterSet} parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::ParameterSet}
+		public Action getParameterSetAction_0() { return cParameterSetAction_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_1() { return cParameterAssignment_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_1_0() { return cParameterFormalParameterParserRuleCall_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//','
+		public Keyword getCommaKeyword_2_0() { return cCommaKeyword_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_2_1() { return cParameterAssignment_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_2_1_0() { return cParameterFormalParameterParserRuleCall_2_1_0; }
+	}
+	public class FormalParameterElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cParameterAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionParameterDirectionKindEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cEqualsSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_4_1_0 = (RuleCall)cDefaultValueAssignment_4_1.eContents().get(0);
+		
+		//FormalParameter fmlInfra::Parameter:
+		//	{fmlInfra::Parameter} direction=ParameterDirectionKind? type=DataType
+		//	name=ESIdentifier? ('=' defaultValue=Expression)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Parameter} direction=ParameterDirectionKind? type=DataType name=ESIdentifier? ('=' defaultValue=Expression)?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Parameter}
+		public Action getParameterAction_0() { return cParameterAction_0; }
+		
+		//direction=ParameterDirectionKind?
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//ParameterDirectionKind
+		public RuleCall getDirectionParameterDirectionKindEnumRuleCall_1_0() { return cDirectionParameterDirectionKindEnumRuleCall_1_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
+		
+		//name=ESIdentifier?
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_4_0() { return cEqualsSignKeyword_4_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_4_1() { return cDefaultValueAssignment_4_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_4_1_0() { return cDefaultValueExpressionParserRuleCall_4_1_0; }
+	}
+	public class BlockParameterSetElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BlockParameterSet");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cParameterSetAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+		private final Keyword cInputKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_1_0_1 = (Alternatives)cGroup_1_0.eContents().get(1);
+		private final Assignment cParameterAssignment_1_0_1_0 = (Assignment)cAlternatives_1_0_1.eContents().get(0);
+		private final RuleCall cParameterParameterInputParserRuleCall_1_0_1_0_0 = (RuleCall)cParameterAssignment_1_0_1_0.eContents().get(0);
+		private final Group cGroup_1_0_1_1 = (Group)cAlternatives_1_0_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_1_0_1_1_0 = (Keyword)cGroup_1_0_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_1_0_1_1_1 = (Assignment)cGroup_1_0_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInputParserRuleCall_1_0_1_1_1_0 = (RuleCall)cParameterAssignment_1_0_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_1_0_1_1_2 = (Keyword)cGroup_1_0_1_1.eContents().get(2);
+		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+		private final Keyword cInoutKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_1_1 = (Alternatives)cGroup_1_1.eContents().get(1);
+		private final Assignment cParameterAssignment_1_1_1_0 = (Assignment)cAlternatives_1_1_1.eContents().get(0);
+		private final RuleCall cParameterParameterInoutParserRuleCall_1_1_1_0_0 = (RuleCall)cParameterAssignment_1_1_1_0.eContents().get(0);
+		private final Group cGroup_1_1_1_1 = (Group)cAlternatives_1_1_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_1_1_1_1_0 = (Keyword)cGroup_1_1_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_1_1_1_1_1 = (Assignment)cGroup_1_1_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterInoutParserRuleCall_1_1_1_1_1_0 = (RuleCall)cParameterAssignment_1_1_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_1_1_1_1_2 = (Keyword)cGroup_1_1_1_1.eContents().get(2);
+		private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
+		private final Keyword cOutputKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
+		private final Alternatives cAlternatives_1_2_1 = (Alternatives)cGroup_1_2.eContents().get(1);
+		private final Assignment cParameterAssignment_1_2_1_0 = (Assignment)cAlternatives_1_2_1.eContents().get(0);
+		private final RuleCall cParameterParameterOutputParserRuleCall_1_2_1_0_0 = (RuleCall)cParameterAssignment_1_2_1_0.eContents().get(0);
+		private final Group cGroup_1_2_1_1 = (Group)cAlternatives_1_2_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_1_2_1_1_0 = (Keyword)cGroup_1_2_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_1_2_1_1_1 = (Assignment)cGroup_1_2_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterOutputParserRuleCall_1_2_1_1_1_0 = (RuleCall)cParameterAssignment_1_2_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_1_2_1_1_2 = (Keyword)cGroup_1_2_1_1.eContents().get(2);
+		private final Group cGroup_1_3 = (Group)cAlternatives_1.eContents().get(3);
+		private final Keyword cReturnKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
+		private final Alternatives cAlternatives_1_3_1 = (Alternatives)cGroup_1_3.eContents().get(1);
+		private final Assignment cParameterAssignment_1_3_1_0 = (Assignment)cAlternatives_1_3_1.eContents().get(0);
+		private final RuleCall cParameterParameterReturnParserRuleCall_1_3_1_0_0 = (RuleCall)cParameterAssignment_1_3_1_0.eContents().get(0);
+		private final Group cGroup_1_3_1_1 = (Group)cAlternatives_1_3_1.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_1_3_1_1_0 = (Keyword)cGroup_1_3_1_1.eContents().get(0);
+		private final Assignment cParameterAssignment_1_3_1_1_1 = (Assignment)cGroup_1_3_1_1.eContents().get(1);
+		private final RuleCall cParameterParameterReturnParserRuleCall_1_3_1_1_1_0 = (RuleCall)cParameterAssignment_1_3_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_1_3_1_1_2 = (Keyword)cGroup_1_3_1_1.eContents().get(2);
+		
+		//BlockParameterSet fmlInfra::ParameterSet:
+		//	{fmlInfra::ParameterSet} ('input' (parameter+=ParameterInput
+		//	| '{' parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout
+		//	| '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput
+		//	| '{' parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn
+		//	| '{' parameter+=ParameterReturn+ '}'))*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::ParameterSet} ('input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}') | 'inout'
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput | '{'
+		//parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}'))*
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::ParameterSet}
+		public Action getParameterSetAction_0() { return cParameterSetAction_0; }
+		
+		//('input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout | '{'
+		//parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}') |
+		//'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}'))*
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//'input' (parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')
+		public Group getGroup_1_0() { return cGroup_1_0; }
+		
+		//'input'
+		public Keyword getInputKeyword_1_0_0() { return cInputKeyword_1_0_0; }
+		
+		//(parameter+=ParameterInput | '{' parameter+=ParameterInput+ '}')
+		public Alternatives getAlternatives_1_0_1() { return cAlternatives_1_0_1; }
+		
+		//parameter+=ParameterInput
+		public Assignment getParameterAssignment_1_0_1_0() { return cParameterAssignment_1_0_1_0; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_1_0_1_0_0() { return cParameterParameterInputParserRuleCall_1_0_1_0_0; }
+		
+		//'{' parameter+=ParameterInput+ '}'
+		public Group getGroup_1_0_1_1() { return cGroup_1_0_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_1_0_1_1_0() { return cLeftCurlyBracketKeyword_1_0_1_1_0; }
+		
+		//parameter+=ParameterInput+
+		public Assignment getParameterAssignment_1_0_1_1_1() { return cParameterAssignment_1_0_1_1_1; }
+		
+		//ParameterInput
+		public RuleCall getParameterParameterInputParserRuleCall_1_0_1_1_1_0() { return cParameterParameterInputParserRuleCall_1_0_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_1_0_1_1_2() { return cRightCurlyBracketKeyword_1_0_1_1_2; }
+		
+		//'inout' (parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//'inout'
+		public Keyword getInoutKeyword_1_1_0() { return cInoutKeyword_1_1_0; }
+		
+		//(parameter+=ParameterInout | '{' parameter+=ParameterInout+ '}')
+		public Alternatives getAlternatives_1_1_1() { return cAlternatives_1_1_1; }
+		
+		//parameter+=ParameterInout
+		public Assignment getParameterAssignment_1_1_1_0() { return cParameterAssignment_1_1_1_0; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_1_1_1_0_0() { return cParameterParameterInoutParserRuleCall_1_1_1_0_0; }
+		
+		//'{' parameter+=ParameterInout+ '}'
+		public Group getGroup_1_1_1_1() { return cGroup_1_1_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_1_1_1_1_0() { return cLeftCurlyBracketKeyword_1_1_1_1_0; }
+		
+		//parameter+=ParameterInout+
+		public Assignment getParameterAssignment_1_1_1_1_1() { return cParameterAssignment_1_1_1_1_1; }
+		
+		//ParameterInout
+		public RuleCall getParameterParameterInoutParserRuleCall_1_1_1_1_1_0() { return cParameterParameterInoutParserRuleCall_1_1_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_1_1_1_1_2() { return cRightCurlyBracketKeyword_1_1_1_1_2; }
+		
+		//'output' (parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')
+		public Group getGroup_1_2() { return cGroup_1_2; }
+		
+		//'output'
+		public Keyword getOutputKeyword_1_2_0() { return cOutputKeyword_1_2_0; }
+		
+		//(parameter+=ParameterOutput | '{' parameter+=ParameterOutput+ '}')
+		public Alternatives getAlternatives_1_2_1() { return cAlternatives_1_2_1; }
+		
+		//parameter+=ParameterOutput
+		public Assignment getParameterAssignment_1_2_1_0() { return cParameterAssignment_1_2_1_0; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_1_2_1_0_0() { return cParameterParameterOutputParserRuleCall_1_2_1_0_0; }
+		
+		//'{' parameter+=ParameterOutput+ '}'
+		public Group getGroup_1_2_1_1() { return cGroup_1_2_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_1_2_1_1_0() { return cLeftCurlyBracketKeyword_1_2_1_1_0; }
+		
+		//parameter+=ParameterOutput+
+		public Assignment getParameterAssignment_1_2_1_1_1() { return cParameterAssignment_1_2_1_1_1; }
+		
+		//ParameterOutput
+		public RuleCall getParameterParameterOutputParserRuleCall_1_2_1_1_1_0() { return cParameterParameterOutputParserRuleCall_1_2_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_1_2_1_1_2() { return cRightCurlyBracketKeyword_1_2_1_1_2; }
+		
+		//'return' (parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//'return'
+		public Keyword getReturnKeyword_1_3_0() { return cReturnKeyword_1_3_0; }
+		
+		//(parameter+=ParameterReturn | '{' parameter+=ParameterReturn+ '}')
+		public Alternatives getAlternatives_1_3_1() { return cAlternatives_1_3_1; }
+		
+		//parameter+=ParameterReturn
+		public Assignment getParameterAssignment_1_3_1_0() { return cParameterAssignment_1_3_1_0; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_1_3_1_0_0() { return cParameterParameterReturnParserRuleCall_1_3_1_0_0; }
+		
+		//'{' parameter+=ParameterReturn+ '}'
+		public Group getGroup_1_3_1_1() { return cGroup_1_3_1_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_1_3_1_1_0() { return cLeftCurlyBracketKeyword_1_3_1_1_0; }
+		
+		//parameter+=ParameterReturn+
+		public Assignment getParameterAssignment_1_3_1_1_1() { return cParameterAssignment_1_3_1_1_1; }
+		
+		//ParameterReturn
+		public RuleCall getParameterParameterReturnParserRuleCall_1_3_1_1_1_0() { return cParameterParameterReturnParserRuleCall_1_3_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_1_3_1_1_2() { return cRightCurlyBracketKeyword_1_3_1_1_2; }
+	}
+	public class ParameterInputElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cDirectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cDirectionParameterInputDirectionKindEnumRuleCall_0_0 = (RuleCall)cDirectionAssignment_0.eContents().get(0);
+		private final Assignment cTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cTypeDataTypeParserRuleCall_1_0 = (RuleCall)cTypeAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cEqualsSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_4_1_0 = (RuleCall)cDefaultValueAssignment_4_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//ParameterInput fmlInfra::Parameter:
+		//	direction=ParameterInputDirectionKind type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//direction=ParameterInputDirectionKind type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? ('='
+		//defaultValue=Expression)? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//direction=ParameterInputDirectionKind
+		public Assignment getDirectionAssignment_0() { return cDirectionAssignment_0; }
+		
+		//ParameterInputDirectionKind
+		public RuleCall getDirectionParameterInputDirectionKindEnumRuleCall_0_0() { return cDirectionParameterInputDirectionKindEnumRuleCall_0_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_1() { return cTypeAssignment_1; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_1_0() { return cTypeDataTypeParserRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_4_0() { return cEqualsSignKeyword_4_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_4_1() { return cDefaultValueAssignment_4_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_4_1_0() { return cDefaultValueExpressionParserRuleCall_4_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class ParameterInoutElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cDirectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cDirectionParameterInoutDirectionKindEnumRuleCall_0_0 = (RuleCall)cDirectionAssignment_0.eContents().get(0);
+		private final Assignment cTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cTypeDataTypeParserRuleCall_1_0 = (RuleCall)cTypeAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cEqualsSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_4_1_0 = (RuleCall)cDefaultValueAssignment_4_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//ParameterInout fmlInfra::Parameter:
+		//	direction=ParameterInoutDirectionKind type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//direction=ParameterInoutDirectionKind type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? ('='
+		//defaultValue=Expression)? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//direction=ParameterInoutDirectionKind
+		public Assignment getDirectionAssignment_0() { return cDirectionAssignment_0; }
+		
+		//ParameterInoutDirectionKind
+		public RuleCall getDirectionParameterInoutDirectionKindEnumRuleCall_0_0() { return cDirectionParameterInoutDirectionKindEnumRuleCall_0_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_1() { return cTypeAssignment_1; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_1_0() { return cTypeDataTypeParserRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_4_0() { return cEqualsSignKeyword_4_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_4_1() { return cDefaultValueAssignment_4_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_4_1_0() { return cDefaultValueExpressionParserRuleCall_4_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class ParameterOutputElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cDirectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cDirectionParameterOutputDirectionKindEnumRuleCall_0_0 = (RuleCall)cDirectionAssignment_0.eContents().get(0);
+		private final Assignment cTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cTypeDataTypeParserRuleCall_1_0 = (RuleCall)cTypeAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cEqualsSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_4_1_0 = (RuleCall)cDefaultValueAssignment_4_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//ParameterOutput fmlInfra::Parameter:
+		//	direction=ParameterOutputDirectionKind type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//direction=ParameterOutputDirectionKind type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? ('='
+		//defaultValue=Expression)? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//direction=ParameterOutputDirectionKind
+		public Assignment getDirectionAssignment_0() { return cDirectionAssignment_0; }
+		
+		//ParameterOutputDirectionKind
+		public RuleCall getDirectionParameterOutputDirectionKindEnumRuleCall_0_0() { return cDirectionParameterOutputDirectionKindEnumRuleCall_0_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_1() { return cTypeAssignment_1; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_1_0() { return cTypeDataTypeParserRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_4_0() { return cEqualsSignKeyword_4_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_4_1() { return cDefaultValueAssignment_4_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_4_1_0() { return cDefaultValueExpressionParserRuleCall_4_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class ParameterReturnElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cDirectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cDirectionParameterReturnDirectionKindEnumRuleCall_0_0 = (RuleCall)cDirectionAssignment_0.eContents().get(0);
+		private final Assignment cTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cTypeDataTypeParserRuleCall_1_0 = (RuleCall)cTypeAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cEqualsSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_4_1_0 = (RuleCall)cDefaultValueAssignment_4_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//ParameterReturn fmlInfra::Parameter:
+		//	direction=ParameterReturnDirectionKind type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//direction=ParameterReturnDirectionKind type=DataType name=ESIdentifier unrestrictedName=UnrestrictedName? ('='
+		//defaultValue=Expression)? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//direction=ParameterReturnDirectionKind
+		public Assignment getDirectionAssignment_0() { return cDirectionAssignment_0; }
+		
+		//ParameterReturnDirectionKind
+		public RuleCall getDirectionParameterReturnDirectionKindEnumRuleCall_0_0() { return cDirectionParameterReturnDirectionKindEnumRuleCall_0_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_1() { return cTypeAssignment_1; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_1_0() { return cTypeDataTypeParserRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_4_0() { return cEqualsSignKeyword_4_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_4_1() { return cDefaultValueAssignment_4_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_4_1_0() { return cDefaultValueExpressionParserRuleCall_4_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class ParameterDeclarationElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterDeclaration");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cParameterAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionBlockParameterDirectionKindEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
+		private final Keyword cEqualsSignKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
+		private final Assignment cDefaultValueAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
+		private final RuleCall cDefaultValueExpressionParserRuleCall_5_1_0 = (RuleCall)cDefaultValueAssignment_5_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		
+		//ParameterDeclaration fmlInfra::Parameter:
+		//	{fmlInfra::Parameter} direction=BlockParameterDirectionKind type=DataType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::Parameter} direction=BlockParameterDirectionKind type=DataType name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::Parameter}
+		public Action getParameterAction_0() { return cParameterAction_0; }
+		
+		//direction=BlockParameterDirectionKind
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//BlockParameterDirectionKind
+		public RuleCall getDirectionBlockParameterDirectionKindEnumRuleCall_1_0() { return cDirectionBlockParameterDirectionKindEnumRuleCall_1_0; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//('=' defaultValue=Expression)?
+		public Group getGroup_5() { return cGroup_5; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_5_0() { return cEqualsSignKeyword_5_0; }
+		
+		//defaultValue=Expression
+		public Assignment getDefaultValueAssignment_5_1() { return cDefaultValueAssignment_5_1; }
+		
+		//Expression
+		public RuleCall getDefaultValueExpressionParserRuleCall_5_1_0() { return cDefaultValueExpressionParserRuleCall_5_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
+	}
+	public class BufferContainerTypeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cCollectionTypeAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cContainerAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cContainerBufferContainerKindEnumRuleCall_1_0 = (RuleCall)cContainerAssignment_1.eContents().get(0);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Alternatives cAlternatives_2_1 = (Alternatives)cGroup_2.eContents().get(1);
+		private final Assignment cSizeAssignment_2_1_0 = (Assignment)cAlternatives_2_1.eContents().get(0);
+		private final RuleCall cSizeEIntParserRuleCall_2_1_0_0 = (RuleCall)cSizeAssignment_2_1_0.eContents().get(0);
+		private final Assignment cUnboundedAssignment_2_1_1 = (Assignment)cAlternatives_2_1.eContents().get(1);
+		private final Keyword cUnboundedAsteriskKeyword_2_1_1_0 = (Keyword)cUnboundedAssignment_2_1_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Buffer Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//BufferContainerType fmlType::CollectionType:
+		//	{fmlType::CollectionType} container=BufferContainerKind ('<' (size=EInt | unbounded?='*')? '>')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlType::CollectionType} container=BufferContainerKind ('<' (size=EInt | unbounded?='*')? '>')?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlType::CollectionType}
+		public Action getCollectionTypeAction_0() { return cCollectionTypeAction_0; }
+		
+		//container=BufferContainerKind
+		public Assignment getContainerAssignment_1() { return cContainerAssignment_1; }
+		
+		//BufferContainerKind
+		public RuleCall getContainerBufferContainerKindEnumRuleCall_1_0() { return cContainerBufferContainerKindEnumRuleCall_1_0; }
+		
+		//('<' (size=EInt | unbounded?='*')? '>')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
+		
+		//(size=EInt | unbounded?='*')?
+		public Alternatives getAlternatives_2_1() { return cAlternatives_2_1; }
+		
+		//size=EInt
+		public Assignment getSizeAssignment_2_1_0() { return cSizeAssignment_2_1_0; }
+		
+		//EInt
+		public RuleCall getSizeEIntParserRuleCall_2_1_0_0() { return cSizeEIntParserRuleCall_2_1_0_0; }
+		
+		//unbounded?='*'
+		public Assignment getUnboundedAssignment_2_1_1() { return cUnboundedAssignment_2_1_1; }
+		
+		//'*'
+		public Keyword getUnboundedAsteriskKeyword_2_1_1_0() { return cUnboundedAsteriskKeyword_2_1_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
+	}
+	public class BufferElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Buffer");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final UnorderedGroup cUnorderedGroup_0 = (UnorderedGroup)cGroup.eContents().get(0);
+		private final Assignment cVisibilityAssignment_0_0 = (Assignment)cUnorderedGroup_0.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0_0 = (RuleCall)cVisibilityAssignment_0_0.eContents().get(0);
+		private final Assignment cModifierAssignment_0_1 = (Assignment)cUnorderedGroup_0.eContents().get(1);
+		private final RuleCall cModifierModifierParserRuleCall_0_1_0 = (RuleCall)cModifierAssignment_0_1.eContents().get(0);
+		private final Keyword cBufferKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTypeBufferContainerTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//Buffer fmlInfra::Buffer:
+		//	(visibility=VisibilityKind? & modifier=Modifier?)
+		//	'buffer' type=BufferContainerType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//(visibility=VisibilityKind? & modifier=Modifier?) 'buffer' type=BufferContainerType name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//(visibility=VisibilityKind? & modifier=Modifier?)
+		public UnorderedGroup getUnorderedGroup_0() { return cUnorderedGroup_0; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_0_0() { return cVisibilityAssignment_0_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0_0; }
+		
+		//modifier=Modifier?
+		public Assignment getModifierAssignment_0_1() { return cModifierAssignment_0_1; }
+		
+		//Modifier
+		public RuleCall getModifierModifierParserRuleCall_0_1_0() { return cModifierModifierParserRuleCall_0_1_0; }
+		
+		//'buffer'
+		public Keyword getBufferKeyword_1() { return cBufferKeyword_1; }
+		
+		//type=BufferContainerType
+		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
+		
+		//BufferContainerType
+		public RuleCall getTypeBufferContainerTypeParserRuleCall_2_0() { return cTypeBufferContainerTypeParserRuleCall_2_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class BufferImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cTypeAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cTypeBufferContainerTypeParserRuleCall_0_0 = (RuleCall)cTypeAssignment_0.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Keyword cSemicolonKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		
+		//BufferImpl fmlInfra::Buffer:
+		//	type=BufferContainerType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//type=BufferContainerType name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//type=BufferContainerType
+		public Assignment getTypeAssignment_0() { return cTypeAssignment_0; }
+		
+		//BufferContainerType
+		public RuleCall getTypeBufferContainerTypeParserRuleCall_0_0() { return cTypeBufferContainerTypeParserRuleCall_0_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_3() { return cSemicolonKeyword_3; }
+	}
+	public class BufferPublicElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cModifierAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cModifierModifierParserRuleCall_0_0 = (RuleCall)cModifierAssignment_0.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityPublicBufferVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTypeBufferContainerTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//BufferPublic fmlInfra::Buffer:
+		//	modifier=Modifier?
+		//	visibility=PublicBufferVisibilityKind type=BufferContainerType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//modifier=Modifier? visibility=PublicBufferVisibilityKind type=BufferContainerType name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//modifier=Modifier?
+		public Assignment getModifierAssignment_0() { return cModifierAssignment_0; }
+		
+		//Modifier
+		public RuleCall getModifierModifierParserRuleCall_0_0() { return cModifierModifierParserRuleCall_0_0; }
+		
+		//visibility=PublicBufferVisibilityKind
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//PublicBufferVisibilityKind
+		public RuleCall getVisibilityPublicBufferVisibilityKindEnumRuleCall_1_0() { return cVisibilityPublicBufferVisibilityKindEnumRuleCall_1_0; }
+		
+		//type=BufferContainerType
+		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
+		
+		//BufferContainerType
+		public RuleCall getTypeBufferContainerTypeParserRuleCall_2_0() { return cTypeBufferContainerTypeParserRuleCall_2_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class BufferProtectedElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cModifierAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cModifierModifierParserRuleCall_0_0 = (RuleCall)cModifierAssignment_0.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityProtectedBufferVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTypeBufferContainerTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//BufferProtected fmlInfra::Buffer:
+		//	modifier=Modifier?
+		//	visibility=ProtectedBufferVisibilityKind type=BufferContainerType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//modifier=Modifier? visibility=ProtectedBufferVisibilityKind type=BufferContainerType name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//modifier=Modifier?
+		public Assignment getModifierAssignment_0() { return cModifierAssignment_0; }
+		
+		//Modifier
+		public RuleCall getModifierModifierParserRuleCall_0_0() { return cModifierModifierParserRuleCall_0_0; }
+		
+		//visibility=ProtectedBufferVisibilityKind
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//ProtectedBufferVisibilityKind
+		public RuleCall getVisibilityProtectedBufferVisibilityKindEnumRuleCall_1_0() { return cVisibilityProtectedBufferVisibilityKindEnumRuleCall_1_0; }
+		
+		//type=BufferContainerType
+		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
+		
+		//BufferContainerType
+		public RuleCall getTypeBufferContainerTypeParserRuleCall_2_0() { return cTypeBufferContainerTypeParserRuleCall_2_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class BufferPrivateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cModifierAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cModifierModifierParserRuleCall_0_0 = (RuleCall)cModifierAssignment_0.eContents().get(0);
+		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cVisibilityPrivateBufferVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
+		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cTypeBufferContainerTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//BufferPrivate fmlInfra::Buffer:
+		//	modifier=Modifier?
+		//	visibility=PrivateBufferVisibilityKind type=BufferContainerType
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//modifier=Modifier? visibility=PrivateBufferVisibilityKind type=BufferContainerType name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//modifier=Modifier?
+		public Assignment getModifierAssignment_0() { return cModifierAssignment_0; }
+		
+		//Modifier
+		public RuleCall getModifierModifierParserRuleCall_0_0() { return cModifierModifierParserRuleCall_0_0; }
+		
+		//visibility=PrivateBufferVisibilityKind
+		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
+		
+		//PrivateBufferVisibilityKind
+		public RuleCall getVisibilityPrivateBufferVisibilityKindEnumRuleCall_1_0() { return cVisibilityPrivateBufferVisibilityKindEnumRuleCall_1_0; }
+		
+		//type=BufferContainerType
+		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
+		
+		//BufferContainerType
+		public RuleCall getTypeBufferContainerTypeParserRuleCall_2_0() { return cTypeBufferContainerTypeParserRuleCall_2_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class PortElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Port");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Keyword cPortKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cDirectionAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_2_0 = (RuleCall)cDirectionAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
+		private final Keyword cLeftParenthesisKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
+		private final Assignment cParameterAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_5_1_0 = (RuleCall)cParameterAssignment_5_1.eContents().get(0);
+		private final Group cGroup_5_2 = (Group)cGroup_5.eContents().get(2);
+		private final Keyword cCommaKeyword_5_2_0 = (Keyword)cGroup_5_2.eContents().get(0);
+		private final Assignment cParameterAssignment_5_2_1 = (Assignment)cGroup_5_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_5_2_1_0 = (RuleCall)cParameterAssignment_5_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_5_3 = (Keyword)cGroup_5.eContents().get(3);
+		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Port rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Port fmlInfra::Port:
+		//	visibility=VisibilityKind?
+		//	'port' direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=VisibilityKind? 'port' direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0; }
+		
+		//'port'
+		public Keyword getPortKeyword_1() { return cPortKeyword_1; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_2() { return cDirectionAssignment_2; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_2_0() { return cDirectionChannelDirectionEnumRuleCall_2_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_5() { return cGroup_5; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_5_0() { return cLeftParenthesisKeyword_5_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_5_1() { return cParameterAssignment_5_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_5_1_0() { return cParameterFormalParameterParserRuleCall_5_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_5_2() { return cGroup_5_2; }
+		
+		//','
+		public Keyword getCommaKeyword_5_2_0() { return cCommaKeyword_5_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_5_2_1() { return cParameterAssignment_5_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_5_2_1_0() { return cParameterFormalParameterParserRuleCall_5_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_5_3() { return cRightParenthesisKeyword_5_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
+	}
+	public class PortImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PortImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cDirectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_0_0 = (RuleCall)cDirectionAssignment_0.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Keyword cLeftParenthesisKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final Assignment cParameterAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_3_1_0 = (RuleCall)cParameterAssignment_3_1.eContents().get(0);
+		private final Group cGroup_3_2 = (Group)cGroup_3.eContents().get(2);
+		private final Keyword cCommaKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
+		private final Assignment cParameterAssignment_3_2_1 = (Assignment)cGroup_3_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_3_2_1_0 = (RuleCall)cParameterAssignment_3_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_3_3 = (Keyword)cGroup_3.eContents().get(3);
+		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//PortImpl fmlInfra::Port:
+		//	direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName? ('(' parameter+=FormalParameter (','
+		//parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_0() { return cDirectionAssignment_0; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_0_0() { return cDirectionChannelDirectionEnumRuleCall_0_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_3_0() { return cLeftParenthesisKeyword_3_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_3_1() { return cParameterAssignment_3_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_3_1_0() { return cParameterFormalParameterParserRuleCall_3_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_3_2() { return cGroup_3_2; }
+		
+		//','
+		public Keyword getCommaKeyword_3_2_0() { return cCommaKeyword_3_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_3_2_1() { return cParameterAssignment_3_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_3_2_1_0() { return cParameterFormalParameterParserRuleCall_3_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_3_3() { return cRightParenthesisKeyword_3_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
+	}
+	public class PortPublicElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityPublicPortVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cLeftParenthesisKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cParameterAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_1_0 = (RuleCall)cParameterAssignment_4_1.eContents().get(0);
+		private final Group cGroup_4_2 = (Group)cGroup_4.eContents().get(2);
+		private final Keyword cCommaKeyword_4_2_0 = (Keyword)cGroup_4_2.eContents().get(0);
+		private final Assignment cParameterAssignment_4_2_1 = (Assignment)cGroup_4_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_2_1_0 = (RuleCall)cParameterAssignment_4_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//PortPublic fmlInfra::Port:
+		//	visibility=PublicPortVisibilityKind direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=PublicPortVisibilityKind direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=PublicPortVisibilityKind
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//PublicPortVisibilityKind
+		public RuleCall getVisibilityPublicPortVisibilityKindEnumRuleCall_0_0() { return cVisibilityPublicPortVisibilityKindEnumRuleCall_0_0; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_0() { return cDirectionChannelDirectionEnumRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_4_0() { return cLeftParenthesisKeyword_4_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_1() { return cParameterAssignment_4_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_1_0() { return cParameterFormalParameterParserRuleCall_4_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_4_2() { return cGroup_4_2; }
+		
+		//','
+		public Keyword getCommaKeyword_4_2_0() { return cCommaKeyword_4_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_2_1() { return cParameterAssignment_4_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_2_1_0() { return cParameterFormalParameterParserRuleCall_4_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_4_3() { return cRightParenthesisKeyword_4_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class PortProtectedElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityProtectedPortVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cLeftParenthesisKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cParameterAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_1_0 = (RuleCall)cParameterAssignment_4_1.eContents().get(0);
+		private final Group cGroup_4_2 = (Group)cGroup_4.eContents().get(2);
+		private final Keyword cCommaKeyword_4_2_0 = (Keyword)cGroup_4_2.eContents().get(0);
+		private final Assignment cParameterAssignment_4_2_1 = (Assignment)cGroup_4_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_2_1_0 = (RuleCall)cParameterAssignment_4_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//PortProtected fmlInfra::Port:
+		//	visibility=ProtectedPortVisibilityKind direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=ProtectedPortVisibilityKind direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=ProtectedPortVisibilityKind
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//ProtectedPortVisibilityKind
+		public RuleCall getVisibilityProtectedPortVisibilityKindEnumRuleCall_0_0() { return cVisibilityProtectedPortVisibilityKindEnumRuleCall_0_0; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_0() { return cDirectionChannelDirectionEnumRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_4_0() { return cLeftParenthesisKeyword_4_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_1() { return cParameterAssignment_4_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_1_0() { return cParameterFormalParameterParserRuleCall_4_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_4_2() { return cGroup_4_2; }
+		
+		//','
+		public Keyword getCommaKeyword_4_2_0() { return cCommaKeyword_4_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_2_1() { return cParameterAssignment_4_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_2_1_0() { return cParameterFormalParameterParserRuleCall_4_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_4_3() { return cRightParenthesisKeyword_4_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class PortPrivateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityPrivatePortVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cLeftParenthesisKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cParameterAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_1_0 = (RuleCall)cParameterAssignment_4_1.eContents().get(0);
+		private final Group cGroup_4_2 = (Group)cGroup_4.eContents().get(2);
+		private final Keyword cCommaKeyword_4_2_0 = (Keyword)cGroup_4_2.eContents().get(0);
+		private final Assignment cParameterAssignment_4_2_1 = (Assignment)cGroup_4_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_2_1_0 = (RuleCall)cParameterAssignment_4_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//PortPrivate fmlInfra::Port:
+		//	visibility=PrivatePortVisibilityKind direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=PrivatePortVisibilityKind direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=PrivatePortVisibilityKind
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//PrivatePortVisibilityKind
+		public RuleCall getVisibilityPrivatePortVisibilityKindEnumRuleCall_0_0() { return cVisibilityPrivatePortVisibilityKindEnumRuleCall_0_0; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_0() { return cDirectionChannelDirectionEnumRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_4_0() { return cLeftParenthesisKeyword_4_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_1() { return cParameterAssignment_4_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_1_0() { return cParameterFormalParameterParserRuleCall_4_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_4_2() { return cGroup_4_2; }
+		
+		//','
+		public Keyword getCommaKeyword_4_2_0() { return cCommaKeyword_4_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_2_1() { return cParameterAssignment_4_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_2_1_0() { return cParameterFormalParameterParserRuleCall_4_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_4_3() { return cRightParenthesisKeyword_4_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class SignalElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Signal");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Keyword cSignalKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cDirectionAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_2_0 = (RuleCall)cDirectionAssignment_2.eContents().get(0);
+		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
+		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
+		private final Keyword cLeftParenthesisKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
+		private final Assignment cParameterAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_5_1_0 = (RuleCall)cParameterAssignment_5_1.eContents().get(0);
+		private final Group cGroup_5_2 = (Group)cGroup_5.eContents().get(2);
+		private final Keyword cCommaKeyword_5_2_0 = (Keyword)cGroup_5_2.eContents().get(0);
+		private final Assignment cParameterAssignment_5_2_1 = (Assignment)cGroup_5_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_5_2_1_0 = (RuleCall)cParameterAssignment_5_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_5_3 = (Keyword)cGroup_5.eContents().get(3);
+		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Signal rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Signal fmlInfra::Signal:
+		//	visibility=VisibilityKind?
+		//	'signal' direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=VisibilityKind? 'signal' direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0; }
+		
+		//'signal'
+		public Keyword getSignalKeyword_1() { return cSignalKeyword_1; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_2() { return cDirectionAssignment_2; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_2_0() { return cDirectionChannelDirectionEnumRuleCall_2_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_5() { return cGroup_5; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_5_0() { return cLeftParenthesisKeyword_5_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_5_1() { return cParameterAssignment_5_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_5_1_0() { return cParameterFormalParameterParserRuleCall_5_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_5_2() { return cGroup_5_2; }
+		
+		//','
+		public Keyword getCommaKeyword_5_2_0() { return cCommaKeyword_5_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_5_2_1() { return cParameterAssignment_5_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_5_2_1_0() { return cParameterFormalParameterParserRuleCall_5_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_5_3() { return cRightParenthesisKeyword_5_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
+	}
+	public class SignalImplElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalImpl");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cDirectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_0_0 = (RuleCall)cDirectionAssignment_0.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Keyword cLeftParenthesisKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final Assignment cParameterAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_3_1_0 = (RuleCall)cParameterAssignment_3_1.eContents().get(0);
+		private final Group cGroup_3_2 = (Group)cGroup_3.eContents().get(2);
+		private final Keyword cCommaKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
+		private final Assignment cParameterAssignment_3_2_1 = (Assignment)cGroup_3_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_3_2_1_0 = (RuleCall)cParameterAssignment_3_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_3_3 = (Keyword)cGroup_3.eContents().get(3);
+		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//SignalImpl fmlInfra::Signal:
+		//	direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName? ('(' parameter+=FormalParameter (','
+		//parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_0() { return cDirectionAssignment_0; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_0_0() { return cDirectionChannelDirectionEnumRuleCall_0_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_3_0() { return cLeftParenthesisKeyword_3_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_3_1() { return cParameterAssignment_3_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_3_1_0() { return cParameterFormalParameterParserRuleCall_3_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_3_2() { return cGroup_3_2; }
+		
+		//','
+		public Keyword getCommaKeyword_3_2_0() { return cCommaKeyword_3_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_3_2_1() { return cParameterAssignment_3_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_3_2_1_0() { return cParameterFormalParameterParserRuleCall_3_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_3_3() { return cRightParenthesisKeyword_3_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
+	}
+	public class SignalPublicElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityPublicSignalVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cLeftParenthesisKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cParameterAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_1_0 = (RuleCall)cParameterAssignment_4_1.eContents().get(0);
+		private final Group cGroup_4_2 = (Group)cGroup_4.eContents().get(2);
+		private final Keyword cCommaKeyword_4_2_0 = (Keyword)cGroup_4_2.eContents().get(0);
+		private final Assignment cParameterAssignment_4_2_1 = (Assignment)cGroup_4_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_2_1_0 = (RuleCall)cParameterAssignment_4_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//SignalPublic fmlInfra::Signal:
+		//	visibility=PublicSignalVisibilityKind direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=PublicSignalVisibilityKind direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=PublicSignalVisibilityKind
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//PublicSignalVisibilityKind
+		public RuleCall getVisibilityPublicSignalVisibilityKindEnumRuleCall_0_0() { return cVisibilityPublicSignalVisibilityKindEnumRuleCall_0_0; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_0() { return cDirectionChannelDirectionEnumRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_4_0() { return cLeftParenthesisKeyword_4_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_1() { return cParameterAssignment_4_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_1_0() { return cParameterFormalParameterParserRuleCall_4_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_4_2() { return cGroup_4_2; }
+		
+		//','
+		public Keyword getCommaKeyword_4_2_0() { return cCommaKeyword_4_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_2_1() { return cParameterAssignment_4_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_2_1_0() { return cParameterFormalParameterParserRuleCall_4_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_4_3() { return cRightParenthesisKeyword_4_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class SignalProtectedElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityProtectedSignalVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cLeftParenthesisKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cParameterAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_1_0 = (RuleCall)cParameterAssignment_4_1.eContents().get(0);
+		private final Group cGroup_4_2 = (Group)cGroup_4.eContents().get(2);
+		private final Keyword cCommaKeyword_4_2_0 = (Keyword)cGroup_4_2.eContents().get(0);
+		private final Assignment cParameterAssignment_4_2_1 = (Assignment)cGroup_4_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_2_1_0 = (RuleCall)cParameterAssignment_4_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//SignalProtected fmlInfra::Signal:
+		//	visibility=ProtectedSignalVisibilityKind direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=ProtectedSignalVisibilityKind direction=ChannelDirection? name=ESIdentifier
+		//unrestrictedName=UnrestrictedName? ('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=ProtectedSignalVisibilityKind
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//ProtectedSignalVisibilityKind
+		public RuleCall getVisibilityProtectedSignalVisibilityKindEnumRuleCall_0_0() { return cVisibilityProtectedSignalVisibilityKindEnumRuleCall_0_0; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_0() { return cDirectionChannelDirectionEnumRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_4_0() { return cLeftParenthesisKeyword_4_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_1() { return cParameterAssignment_4_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_1_0() { return cParameterFormalParameterParserRuleCall_4_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_4_2() { return cGroup_4_2; }
+		
+		//','
+		public Keyword getCommaKeyword_4_2_0() { return cCommaKeyword_4_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_2_1() { return cParameterAssignment_4_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_2_1_0() { return cParameterFormalParameterParserRuleCall_4_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_4_3() { return cRightParenthesisKeyword_4_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class SignalPrivateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityPrivateSignalVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cLeftParenthesisKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cParameterAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_1_0 = (RuleCall)cParameterAssignment_4_1.eContents().get(0);
+		private final Group cGroup_4_2 = (Group)cGroup_4.eContents().get(2);
+		private final Keyword cCommaKeyword_4_2_0 = (Keyword)cGroup_4_2.eContents().get(0);
+		private final Assignment cParameterAssignment_4_2_1 = (Assignment)cGroup_4_2.eContents().get(1);
+		private final RuleCall cParameterFormalParameterParserRuleCall_4_2_1_0 = (RuleCall)cParameterAssignment_4_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//SignalPrivate fmlInfra::Signal:
+		//	visibility=PrivateSignalVisibilityKind direction=ChannelDirection?
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+		//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+		//	')')?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=PrivateSignalVisibilityKind direction=ChannelDirection? name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=PrivateSignalVisibilityKind
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//PrivateSignalVisibilityKind
+		public RuleCall getVisibilityPrivateSignalVisibilityKindEnumRuleCall_0_0() { return cVisibilityPrivateSignalVisibilityKindEnumRuleCall_0_0; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_0() { return cDirectionChannelDirectionEnumRuleCall_1_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//('(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')')?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_4_0() { return cLeftParenthesisKeyword_4_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_1() { return cParameterAssignment_4_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_1_0() { return cParameterFormalParameterParserRuleCall_4_1_0; }
+		
+		//(',' parameter+=FormalParameter)*
+		public Group getGroup_4_2() { return cGroup_4_2; }
+		
+		//','
+		public Keyword getCommaKeyword_4_2_0() { return cCommaKeyword_4_2_0; }
+		
+		//parameter+=FormalParameter
+		public Assignment getParameterAssignment_4_2_1() { return cParameterAssignment_4_2_1; }
+		
+		//FormalParameter
+		public RuleCall getParameterFormalParameterParserRuleCall_4_2_1_0() { return cParameterFormalParameterParserRuleCall_4_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_4_3() { return cRightParenthesisKeyword_4_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class ChannelElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Channel");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Keyword cChannelKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
+		private final Assignment cSignalAssignment_5_0 = (Assignment)cGroup_5.eContents().get(0);
+		private final RuleCall cSignalSignalReferenceParserRuleCall_5_0_0 = (RuleCall)cSignalAssignment_5_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5_1 = (Keyword)cGroup_5.eContents().get(1);
+		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		
+		//Channel fmlInfra::Channel:
+		//	visibility=VisibilityKind?
+		//	'channel' name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	'{' (signal+=SignalReference ';')+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=VisibilityKind? 'channel' name=ESIdentifier unrestrictedName=UnrestrictedName? '{' (signal+=SignalReference
+		//';')+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=VisibilityKind?
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//VisibilityKind
+		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0; }
+		
+		//'channel'
+		public Keyword getChannelKeyword_1() { return cChannelKeyword_1; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
+		
+		//(signal+=SignalReference ';')+
+		public Group getGroup_5() { return cGroup_5; }
+		
+		//signal+=SignalReference
+		public Assignment getSignalAssignment_5_0() { return cSignalAssignment_5_0; }
+		
+		//SignalReference
+		public RuleCall getSignalSignalReferenceParserRuleCall_5_0_0() { return cSignalSignalReferenceParserRuleCall_5_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5_1() { return cSemicolonKeyword_5_1; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
+	}
+	public class SignalReferenceElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cDirectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cDirectionChannelDirectionEnumRuleCall_0_0 = (RuleCall)cDirectionAssignment_0.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		
+		//SignalReference fmlInfra::Signal:
+		//	direction=ChannelDirection? name=ESIdentifier
+		@Override public ParserRule getRule() { return rule; }
+		
+		//direction=ChannelDirection? name=ESIdentifier
+		public Group getGroup() { return cGroup; }
+		
+		//direction=ChannelDirection?
+		public Assignment getDirectionAssignment_0() { return cDirectionAssignment_0; }
+		
+		//ChannelDirection
+		public RuleCall getDirectionChannelDirectionEnumRuleCall_0_0() { return cDirectionChannelDirectionEnumRuleCall_0_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+	}
+	public class ChannelPublicElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityPublicChannelVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Assignment cSignalAssignment_4_0 = (Assignment)cGroup_4.eContents().get(0);
+		private final RuleCall cSignalSignalReferenceParserRuleCall_4_0_0 = (RuleCall)cSignalAssignment_4_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_4_1 = (Keyword)cGroup_4.eContents().get(1);
+		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//ChannelPublic fmlInfra::Channel:
+		//	visibility=PublicChannelVisibilityKind
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	'{' (signal+=SignalReference ';')+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=PublicChannelVisibilityKind name=ESIdentifier unrestrictedName=UnrestrictedName? '{' (signal+=SignalReference
+		//';')+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=PublicChannelVisibilityKind
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//PublicChannelVisibilityKind
+		public RuleCall getVisibilityPublicChannelVisibilityKindEnumRuleCall_0_0() { return cVisibilityPublicChannelVisibilityKindEnumRuleCall_0_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
+		
+		//(signal+=SignalReference ';')+
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//signal+=SignalReference
+		public Assignment getSignalAssignment_4_0() { return cSignalAssignment_4_0; }
+		
+		//SignalReference
+		public RuleCall getSignalSignalReferenceParserRuleCall_4_0_0() { return cSignalSignalReferenceParserRuleCall_4_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_4_1() { return cSemicolonKeyword_4_1; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
+	}
+	public class ChannelProtectedElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityProtectedChannelVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Assignment cSignalAssignment_4_0 = (Assignment)cGroup_4.eContents().get(0);
+		private final RuleCall cSignalSignalReferenceParserRuleCall_4_0_0 = (RuleCall)cSignalAssignment_4_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_4_1 = (Keyword)cGroup_4.eContents().get(1);
+		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//ChannelProtected fmlInfra::Channel:
+		//	visibility=ProtectedChannelVisibilityKind
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	'{' (signal+=SignalReference ';')+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=ProtectedChannelVisibilityKind name=ESIdentifier unrestrictedName=UnrestrictedName? '{'
+		//(signal+=SignalReference ';')+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=ProtectedChannelVisibilityKind
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//ProtectedChannelVisibilityKind
+		public RuleCall getVisibilityProtectedChannelVisibilityKindEnumRuleCall_0_0() { return cVisibilityProtectedChannelVisibilityKindEnumRuleCall_0_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
+		
+		//(signal+=SignalReference ';')+
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//signal+=SignalReference
+		public Assignment getSignalAssignment_4_0() { return cSignalAssignment_4_0; }
+		
+		//SignalReference
+		public RuleCall getSignalSignalReferenceParserRuleCall_4_0_0() { return cSignalSignalReferenceParserRuleCall_4_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_4_1() { return cSemicolonKeyword_4_1; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
+	}
+	public class ChannelPrivateElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cVisibilityPrivateChannelVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
+		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Assignment cSignalAssignment_4_0 = (Assignment)cGroup_4.eContents().get(0);
+		private final RuleCall cSignalSignalReferenceParserRuleCall_4_0_0 = (RuleCall)cSignalAssignment_4_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_4_1 = (Keyword)cGroup_4.eContents().get(1);
+		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//ChannelPrivate fmlInfra::Channel:
+		//	visibility=PrivateChannelVisibilityKind
+		//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+		//	'{' (signal+=SignalReference ';')+
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//visibility=PrivateChannelVisibilityKind name=ESIdentifier unrestrictedName=UnrestrictedName? '{'
+		//(signal+=SignalReference ';')+ '}'
+		public Group getGroup() { return cGroup; }
+		
+		//visibility=PrivateChannelVisibilityKind
+		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
+		
+		//PrivateChannelVisibilityKind
+		public RuleCall getVisibilityPrivateChannelVisibilityKindEnumRuleCall_0_0() { return cVisibilityPrivateChannelVisibilityKindEnumRuleCall_0_0; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
+		
+		//(signal+=SignalReference ';')+
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//signal+=SignalReference
+		public Assignment getSignalAssignment_4_0() { return cSignalAssignment_4_0; }
+		
+		//SignalReference
+		public RuleCall getSignalSignalReferenceParserRuleCall_4_0_0() { return cSignalSignalReferenceParserRuleCall_4_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_4_1() { return cSemicolonKeyword_4_1; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
+	}
+	public class TransitionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Transition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cTransitionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cTransientAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Keyword cTransientTransientKeyword_1_0 = (Keyword)cTransientAssignment_1.eContents().get(0);
+		private final Keyword cTransitionKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cMoeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cMoeTransitionMoeParserRuleCall_3_0 = (RuleCall)cMoeAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Assignment cNameAssignment_4_0 = (Assignment)cGroup_4.eContents().get(0);
+		private final RuleCall cNameESIdentifierParserRuleCall_4_0_0 = (RuleCall)cNameAssignment_4_0.eContents().get(0);
+		private final Assignment cUnrestrictedNameAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0 = (RuleCall)cUnrestrictedNameAssignment_4_1.eContents().get(0);
+		private final Alternatives cAlternatives_5 = (Alternatives)cGroup.eContents().get(5);
+		private final Group cGroup_5_0 = (Group)cAlternatives_5.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_5_0_0 = (Keyword)cGroup_5_0.eContents().get(0);
+		private final Alternatives cAlternatives_5_0_1 = (Alternatives)cGroup_5_0.eContents().get(1);
+		private final Group cGroup_5_0_1_0 = (Group)cAlternatives_5_0_1.eContents().get(0);
+		private final Group cGroup_5_0_1_0_0 = (Group)cGroup_5_0_1_0.eContents().get(0);
+		private final Keyword cTriggerKeyword_5_0_1_0_0_0 = (Keyword)cGroup_5_0_1_0_0.eContents().get(0);
+		private final Assignment cTriggerAssignment_5_0_1_0_0_1 = (Assignment)cGroup_5_0_1_0_0.eContents().get(1);
+		private final RuleCall cTriggerTransitionTriggerParserRuleCall_5_0_1_0_0_1_0 = (RuleCall)cTriggerAssignment_5_0_1_0_0_1.eContents().get(0);
+		private final Alternatives cAlternatives_5_0_1_0_1 = (Alternatives)cGroup_5_0_1_0.eContents().get(1);
+		private final Assignment cGuardAssignment_5_0_1_0_1_0 = (Assignment)cAlternatives_5_0_1_0_1.eContents().get(0);
+		private final RuleCall cGuardTransitionGuardParserRuleCall_5_0_1_0_1_0_0 = (RuleCall)cGuardAssignment_5_0_1_0_1_0.eContents().get(0);
+		private final Keyword cGuardKeyword_5_0_1_0_1_1 = (Keyword)cAlternatives_5_0_1_0_1.eContents().get(1);
+		private final Alternatives cAlternatives_5_0_1_0_2 = (Alternatives)cGroup_5_0_1_0.eContents().get(2);
+		private final Assignment cTguardAssignment_5_0_1_0_2_0 = (Assignment)cAlternatives_5_0_1_0_2.eContents().get(0);
+		private final RuleCall cTguardTransitionTimedGuardParserRuleCall_5_0_1_0_2_0_0 = (RuleCall)cTguardAssignment_5_0_1_0_2_0.eContents().get(0);
+		private final Keyword cTguardKeyword_5_0_1_0_2_1 = (Keyword)cAlternatives_5_0_1_0_2.eContents().get(1);
+		private final Keyword cEffectKeyword_5_0_1_0_3 = (Keyword)cGroup_5_0_1_0.eContents().get(3);
+		private final Assignment cEffectAssignment_5_0_1_0_4 = (Assignment)cGroup_5_0_1_0.eContents().get(4);
+		private final RuleCall cEffectTransitionEffectParserRuleCall_5_0_1_0_4_0 = (RuleCall)cEffectAssignment_5_0_1_0_4.eContents().get(0);
+		private final Assignment cBehaviorAssignment_5_0_1_1 = (Assignment)cAlternatives_5_0_1.eContents().get(1);
+		private final RuleCall cBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0 = (RuleCall)cBehaviorAssignment_5_0_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_5_0_2 = (Keyword)cGroup_5_0.eContents().get(2);
+		private final Group cGroup_5_0_3 = (Group)cGroup_5_0.eContents().get(3);
+		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_5_0_3_0 = (Keyword)cGroup_5_0_3.eContents().get(0);
+		private final Assignment cTargetAssignment_5_0_3_1 = (Assignment)cGroup_5_0_3.eContents().get(1);
+		private final CrossReference cTargetNamedElementCrossReference_5_0_3_1_0 = (CrossReference)cTargetAssignment_5_0_3_1.eContents().get(0);
+		private final RuleCall cTargetNamedElementESUfidParserRuleCall_5_0_3_1_0_1 = (RuleCall)cTargetNamedElementCrossReference_5_0_3_1_0.eContents().get(1);
+		private final Keyword cSemicolonKeyword_5_0_3_2 = (Keyword)cGroup_5_0_3.eContents().get(2);
+		private final Group cGroup_5_1 = (Group)cAlternatives_5.eContents().get(1);
+		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0 = (Keyword)cGroup_5_1.eContents().get(0);
+		private final Assignment cTargetAssignment_5_1_1 = (Assignment)cGroup_5_1.eContents().get(1);
+		private final CrossReference cTargetNamedElementCrossReference_5_1_1_0 = (CrossReference)cTargetAssignment_5_1_1.eContents().get(0);
+		private final RuleCall cTargetNamedElementESUfidParserRuleCall_5_1_1_0_1 = (RuleCall)cTargetNamedElementCrossReference_5_1_1_0.eContents().get(1);
+		private final Alternatives cAlternatives_5_1_2 = (Alternatives)cGroup_5_1.eContents().get(2);
+		private final Group cGroup_5_1_2_0 = (Group)cAlternatives_5_1_2.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_5_1_2_0_0 = (Keyword)cGroup_5_1_2_0.eContents().get(0);
+		private final Alternatives cAlternatives_5_1_2_0_1 = (Alternatives)cGroup_5_1_2_0.eContents().get(1);
+		private final Group cGroup_5_1_2_0_1_0 = (Group)cAlternatives_5_1_2_0_1.eContents().get(0);
+		private final Group cGroup_5_1_2_0_1_0_0 = (Group)cGroup_5_1_2_0_1_0.eContents().get(0);
+		private final Keyword cTriggerKeyword_5_1_2_0_1_0_0_0 = (Keyword)cGroup_5_1_2_0_1_0_0.eContents().get(0);
+		private final Assignment cTriggerAssignment_5_1_2_0_1_0_0_1 = (Assignment)cGroup_5_1_2_0_1_0_0.eContents().get(1);
+		private final RuleCall cTriggerTransitionTriggerParserRuleCall_5_1_2_0_1_0_0_1_0 = (RuleCall)cTriggerAssignment_5_1_2_0_1_0_0_1.eContents().get(0);
+		private final Alternatives cAlternatives_5_1_2_0_1_0_1 = (Alternatives)cGroup_5_1_2_0_1_0.eContents().get(1);
+		private final Assignment cGuardAssignment_5_1_2_0_1_0_1_0 = (Assignment)cAlternatives_5_1_2_0_1_0_1.eContents().get(0);
+		private final RuleCall cGuardTransitionGuardParserRuleCall_5_1_2_0_1_0_1_0_0 = (RuleCall)cGuardAssignment_5_1_2_0_1_0_1_0.eContents().get(0);
+		private final Keyword cGuardKeyword_5_1_2_0_1_0_1_1 = (Keyword)cAlternatives_5_1_2_0_1_0_1.eContents().get(1);
+		private final Alternatives cAlternatives_5_1_2_0_1_0_2 = (Alternatives)cGroup_5_1_2_0_1_0.eContents().get(2);
+		private final Assignment cTguardAssignment_5_1_2_0_1_0_2_0 = (Assignment)cAlternatives_5_1_2_0_1_0_2.eContents().get(0);
+		private final RuleCall cTguardTransitionTimedGuardParserRuleCall_5_1_2_0_1_0_2_0_0 = (RuleCall)cTguardAssignment_5_1_2_0_1_0_2_0.eContents().get(0);
+		private final Keyword cTguardKeyword_5_1_2_0_1_0_2_1 = (Keyword)cAlternatives_5_1_2_0_1_0_2.eContents().get(1);
+		private final Keyword cEffectKeyword_5_1_2_0_1_0_3 = (Keyword)cGroup_5_1_2_0_1_0.eContents().get(3);
+		private final Assignment cEffectAssignment_5_1_2_0_1_0_4 = (Assignment)cGroup_5_1_2_0_1_0.eContents().get(4);
+		private final RuleCall cEffectTransitionEffectParserRuleCall_5_1_2_0_1_0_4_0 = (RuleCall)cEffectAssignment_5_1_2_0_1_0_4.eContents().get(0);
+		private final Assignment cBehaviorAssignment_5_1_2_0_1_1 = (Assignment)cAlternatives_5_1_2_0_1.eContents().get(1);
+		private final RuleCall cBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0 = (RuleCall)cBehaviorAssignment_5_1_2_0_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_5_1_2_0_2 = (Keyword)cGroup_5_1_2_0.eContents().get(2);
+		private final Keyword cSemicolonKeyword_5_1_2_1 = (Keyword)cAlternatives_5_1_2.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Section Transition Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Transition fmlStmchn::Transition:
+		//	{fmlStmchn::Transition} transient?='transient'? 'transition'
+		//	moe=TransitionMoe? (name=ESIdentifier unrestrictedName=UnrestrictedName?)? ('{' (('@trigger:'
+		//	trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard | '@tguard:')?
+		//	'@effect:' effect=TransitionEffect?
+		//	| behavior=TransitionBehavior)?
+		//	'}' ('-->' target=[fmlCommon::NamedElement|ESUfid] ';')?
+		//	| '-->' target=[fmlCommon::NamedElement|ESUfid] ('{' (('@trigger:' trigger+=TransitionTrigger*)?
+		//	(guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard | '@tguard:')?
+		//	'@effect:' effect=TransitionEffect?
+		//	| behavior=TransitionBehavior)?
+		//	'}' | ';'))
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmchn::Transition} transient?='transient'? 'transition' moe=TransitionMoe? (name=ESIdentifier
+		//unrestrictedName=UnrestrictedName?)? ('{' (('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard |
+		//'@guard:')? (tguard=TransitionTimedGuard | '@tguard:')? '@effect:' effect=TransitionEffect? |
+		//behavior=TransitionBehavior)? '}' ('-->' target=[fmlCommon::NamedElement|ESUfid] ';')? | '-->'
+		//target=[fmlCommon::NamedElement|ESUfid] ('{' (('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard |
+		//'@guard:')? (tguard=TransitionTimedGuard | '@tguard:')? '@effect:' effect=TransitionEffect? |
+		//behavior=TransitionBehavior)? '}' | ';'))
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmchn::Transition}
+		public Action getTransitionAction_0() { return cTransitionAction_0; }
+		
+		//transient?='transient'?
+		public Assignment getTransientAssignment_1() { return cTransientAssignment_1; }
+		
+		//'transient'
+		public Keyword getTransientTransientKeyword_1_0() { return cTransientTransientKeyword_1_0; }
+		
+		//'transition'
+		public Keyword getTransitionKeyword_2() { return cTransitionKeyword_2; }
+		
+		//moe=TransitionMoe?
+		public Assignment getMoeAssignment_3() { return cMoeAssignment_3; }
+		
+		//TransitionMoe
+		public RuleCall getMoeTransitionMoeParserRuleCall_3_0() { return cMoeTransitionMoeParserRuleCall_3_0; }
+		
+		//(name=ESIdentifier unrestrictedName=UnrestrictedName?)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//name=ESIdentifier
+		public Assignment getNameAssignment_4_0() { return cNameAssignment_4_0; }
+		
+		//ESIdentifier
+		public RuleCall getNameESIdentifierParserRuleCall_4_0_0() { return cNameESIdentifierParserRuleCall_4_0_0; }
+		
+		//unrestrictedName=UnrestrictedName?
+		public Assignment getUnrestrictedNameAssignment_4_1() { return cUnrestrictedNameAssignment_4_1; }
+		
+		//UnrestrictedName
+		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_1_0; }
+		
+		//('{' (('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard |
+		//'@tguard:')? '@effect:' effect=TransitionEffect? | behavior=TransitionBehavior)? '}' ('-->'
+		//target=[fmlCommon::NamedElement|ESUfid] ';')? | '-->' target=[fmlCommon::NamedElement|ESUfid] ('{' (('@trigger:'
+		//trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard | '@tguard:')?
+		//'@effect:' effect=TransitionEffect? | behavior=TransitionBehavior)? '}' | ';'))
+		public Alternatives getAlternatives_5() { return cAlternatives_5; }
+		
+		//'{' (('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard |
+		//'@tguard:')? '@effect:' effect=TransitionEffect? | behavior=TransitionBehavior)? '}' ('-->'
+		//target=[fmlCommon::NamedElement|ESUfid] ';')?
+		public Group getGroup_5_0() { return cGroup_5_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_5_0_0() { return cLeftCurlyBracketKeyword_5_0_0; }
+		
+		//(('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard |
+		//'@tguard:')? '@effect:' effect=TransitionEffect? | behavior=TransitionBehavior)?
+		public Alternatives getAlternatives_5_0_1() { return cAlternatives_5_0_1; }
+		
+		//('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard |
+		//'@tguard:')? '@effect:' effect=TransitionEffect?
+		public Group getGroup_5_0_1_0() { return cGroup_5_0_1_0; }
+		
+		//('@trigger:' trigger+=TransitionTrigger*)?
+		public Group getGroup_5_0_1_0_0() { return cGroup_5_0_1_0_0; }
+		
+		//'@trigger:'
+		public Keyword getTriggerKeyword_5_0_1_0_0_0() { return cTriggerKeyword_5_0_1_0_0_0; }
+		
+		//trigger+=TransitionTrigger*
+		public Assignment getTriggerAssignment_5_0_1_0_0_1() { return cTriggerAssignment_5_0_1_0_0_1; }
+		
+		//TransitionTrigger
+		public RuleCall getTriggerTransitionTriggerParserRuleCall_5_0_1_0_0_1_0() { return cTriggerTransitionTriggerParserRuleCall_5_0_1_0_0_1_0; }
+		
+		//(guard=TransitionGuard | '@guard:')?
+		public Alternatives getAlternatives_5_0_1_0_1() { return cAlternatives_5_0_1_0_1; }
+		
+		//guard=TransitionGuard
+		public Assignment getGuardAssignment_5_0_1_0_1_0() { return cGuardAssignment_5_0_1_0_1_0; }
+		
+		//TransitionGuard
+		public RuleCall getGuardTransitionGuardParserRuleCall_5_0_1_0_1_0_0() { return cGuardTransitionGuardParserRuleCall_5_0_1_0_1_0_0; }
+		
+		//'@guard:'
+		public Keyword getGuardKeyword_5_0_1_0_1_1() { return cGuardKeyword_5_0_1_0_1_1; }
+		
+		//(tguard=TransitionTimedGuard | '@tguard:')?
+		public Alternatives getAlternatives_5_0_1_0_2() { return cAlternatives_5_0_1_0_2; }
+		
+		//tguard=TransitionTimedGuard
+		public Assignment getTguardAssignment_5_0_1_0_2_0() { return cTguardAssignment_5_0_1_0_2_0; }
+		
+		//TransitionTimedGuard
+		public RuleCall getTguardTransitionTimedGuardParserRuleCall_5_0_1_0_2_0_0() { return cTguardTransitionTimedGuardParserRuleCall_5_0_1_0_2_0_0; }
+		
+		//'@tguard:'
+		public Keyword getTguardKeyword_5_0_1_0_2_1() { return cTguardKeyword_5_0_1_0_2_1; }
+		
+		//'@effect:'
+		public Keyword getEffectKeyword_5_0_1_0_3() { return cEffectKeyword_5_0_1_0_3; }
+		
+		//effect=TransitionEffect?
+		public Assignment getEffectAssignment_5_0_1_0_4() { return cEffectAssignment_5_0_1_0_4; }
+		
+		//TransitionEffect
+		public RuleCall getEffectTransitionEffectParserRuleCall_5_0_1_0_4_0() { return cEffectTransitionEffectParserRuleCall_5_0_1_0_4_0; }
+		
+		//behavior=TransitionBehavior
+		public Assignment getBehaviorAssignment_5_0_1_1() { return cBehaviorAssignment_5_0_1_1; }
+		
+		//TransitionBehavior
+		public RuleCall getBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0() { return cBehaviorTransitionBehaviorParserRuleCall_5_0_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_5_0_2() { return cRightCurlyBracketKeyword_5_0_2; }
+		
+		//('-->' target=[fmlCommon::NamedElement|ESUfid] ';')?
+		public Group getGroup_5_0_3() { return cGroup_5_0_3; }
+		
+		//'-->'
+		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_0_3_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_5_0_3_0; }
+		
+		//target=[fmlCommon::NamedElement|ESUfid]
+		public Assignment getTargetAssignment_5_0_3_1() { return cTargetAssignment_5_0_3_1; }
+		
+		//[fmlCommon::NamedElement|ESUfid]
+		public CrossReference getTargetNamedElementCrossReference_5_0_3_1_0() { return cTargetNamedElementCrossReference_5_0_3_1_0; }
+		
+		//ESUfid
+		public RuleCall getTargetNamedElementESUfidParserRuleCall_5_0_3_1_0_1() { return cTargetNamedElementESUfidParserRuleCall_5_0_3_1_0_1; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5_0_3_2() { return cSemicolonKeyword_5_0_3_2; }
+		
+		//'-->' target=[fmlCommon::NamedElement|ESUfid] ('{' (('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard |
+		//'@guard:')? (tguard=TransitionTimedGuard | '@tguard:')? '@effect:' effect=TransitionEffect? |
+		//behavior=TransitionBehavior)? '}' | ';')
+		public Group getGroup_5_1() { return cGroup_5_1; }
+		
+		//'-->'
+		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0; }
+		
+		//target=[fmlCommon::NamedElement|ESUfid]
+		public Assignment getTargetAssignment_5_1_1() { return cTargetAssignment_5_1_1; }
+		
+		//[fmlCommon::NamedElement|ESUfid]
+		public CrossReference getTargetNamedElementCrossReference_5_1_1_0() { return cTargetNamedElementCrossReference_5_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getTargetNamedElementESUfidParserRuleCall_5_1_1_0_1() { return cTargetNamedElementESUfidParserRuleCall_5_1_1_0_1; }
+		
+		//('{' (('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard |
+		//'@tguard:')? '@effect:' effect=TransitionEffect? | behavior=TransitionBehavior)? '}' | ';')
+		public Alternatives getAlternatives_5_1_2() { return cAlternatives_5_1_2; }
+		
+		//'{' (('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard |
+		//'@tguard:')? '@effect:' effect=TransitionEffect? | behavior=TransitionBehavior)? '}'
+		public Group getGroup_5_1_2_0() { return cGroup_5_1_2_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_5_1_2_0_0() { return cLeftCurlyBracketKeyword_5_1_2_0_0; }
+		
+		//(('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard |
+		//'@tguard:')? '@effect:' effect=TransitionEffect? | behavior=TransitionBehavior)?
+		public Alternatives getAlternatives_5_1_2_0_1() { return cAlternatives_5_1_2_0_1; }
+		
+		//('@trigger:' trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard |
+		//'@tguard:')? '@effect:' effect=TransitionEffect?
+		public Group getGroup_5_1_2_0_1_0() { return cGroup_5_1_2_0_1_0; }
+		
+		//('@trigger:' trigger+=TransitionTrigger*)?
+		public Group getGroup_5_1_2_0_1_0_0() { return cGroup_5_1_2_0_1_0_0; }
+		
+		//'@trigger:'
+		public Keyword getTriggerKeyword_5_1_2_0_1_0_0_0() { return cTriggerKeyword_5_1_2_0_1_0_0_0; }
+		
+		//trigger+=TransitionTrigger*
+		public Assignment getTriggerAssignment_5_1_2_0_1_0_0_1() { return cTriggerAssignment_5_1_2_0_1_0_0_1; }
+		
+		//TransitionTrigger
+		public RuleCall getTriggerTransitionTriggerParserRuleCall_5_1_2_0_1_0_0_1_0() { return cTriggerTransitionTriggerParserRuleCall_5_1_2_0_1_0_0_1_0; }
+		
+		//(guard=TransitionGuard | '@guard:')?
+		public Alternatives getAlternatives_5_1_2_0_1_0_1() { return cAlternatives_5_1_2_0_1_0_1; }
+		
+		//guard=TransitionGuard
+		public Assignment getGuardAssignment_5_1_2_0_1_0_1_0() { return cGuardAssignment_5_1_2_0_1_0_1_0; }
+		
+		//TransitionGuard
+		public RuleCall getGuardTransitionGuardParserRuleCall_5_1_2_0_1_0_1_0_0() { return cGuardTransitionGuardParserRuleCall_5_1_2_0_1_0_1_0_0; }
+		
+		//'@guard:'
+		public Keyword getGuardKeyword_5_1_2_0_1_0_1_1() { return cGuardKeyword_5_1_2_0_1_0_1_1; }
+		
+		//(tguard=TransitionTimedGuard | '@tguard:')?
+		public Alternatives getAlternatives_5_1_2_0_1_0_2() { return cAlternatives_5_1_2_0_1_0_2; }
+		
+		//tguard=TransitionTimedGuard
+		public Assignment getTguardAssignment_5_1_2_0_1_0_2_0() { return cTguardAssignment_5_1_2_0_1_0_2_0; }
+		
+		//TransitionTimedGuard
+		public RuleCall getTguardTransitionTimedGuardParserRuleCall_5_1_2_0_1_0_2_0_0() { return cTguardTransitionTimedGuardParserRuleCall_5_1_2_0_1_0_2_0_0; }
+		
+		//'@tguard:'
+		public Keyword getTguardKeyword_5_1_2_0_1_0_2_1() { return cTguardKeyword_5_1_2_0_1_0_2_1; }
+		
+		//'@effect:'
+		public Keyword getEffectKeyword_5_1_2_0_1_0_3() { return cEffectKeyword_5_1_2_0_1_0_3; }
+		
+		//effect=TransitionEffect?
+		public Assignment getEffectAssignment_5_1_2_0_1_0_4() { return cEffectAssignment_5_1_2_0_1_0_4; }
+		
+		//TransitionEffect
+		public RuleCall getEffectTransitionEffectParserRuleCall_5_1_2_0_1_0_4_0() { return cEffectTransitionEffectParserRuleCall_5_1_2_0_1_0_4_0; }
+		
+		//behavior=TransitionBehavior
+		public Assignment getBehaviorAssignment_5_1_2_0_1_1() { return cBehaviorAssignment_5_1_2_0_1_1; }
+		
+		//TransitionBehavior
+		public RuleCall getBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0() { return cBehaviorTransitionBehaviorParserRuleCall_5_1_2_0_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_5_1_2_0_2() { return cRightCurlyBracketKeyword_5_1_2_0_2; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5_1_2_1() { return cSemicolonKeyword_5_1_2_1; }
+	}
+	public class TransitionMoeElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionMoe");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+		private final Keyword cMocKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_1_0_1 = (Alternatives)cGroup_1_0.eContents().get(1);
+		private final Group cGroup_1_0_1_0 = (Group)cAlternatives_1_0_1.eContents().get(0);
+		private final Assignment cMocAssignment_1_0_1_0_0 = (Assignment)cGroup_1_0_1_0.eContents().get(0);
+		private final RuleCall cMocTransitionMocEnumRuleCall_1_0_1_0_0_0 = (RuleCall)cMocAssignment_1_0_1_0_0.eContents().get(0);
+		private final Group cGroup_1_0_1_0_1 = (Group)cGroup_1_0_1_0.eContents().get(1);
+		private final Keyword cAmpersandKeyword_1_0_1_0_1_0 = (Keyword)cGroup_1_0_1_0_1.eContents().get(0);
+		private final Assignment cIsElseAssignment_1_0_1_0_1_1 = (Assignment)cGroup_1_0_1_0_1.eContents().get(1);
+		private final Keyword cIsElseElseKeyword_1_0_1_0_1_1_0 = (Keyword)cIsElseAssignment_1_0_1_0_1_1.eContents().get(0);
+		private final Assignment cIsElseAssignment_1_0_1_1 = (Assignment)cAlternatives_1_0_1.eContents().get(1);
+		private final Keyword cIsElseElseKeyword_1_0_1_1_0 = (Keyword)cIsElseAssignment_1_0_1_1.eContents().get(0);
+		private final Group cGroup_1_0_2 = (Group)cGroup_1_0.eContents().get(2);
+		private final Keyword cCommaKeyword_1_0_2_0 = (Keyword)cGroup_1_0_2.eContents().get(0);
+		private final Keyword cPriorKeyword_1_0_2_1 = (Keyword)cGroup_1_0_2.eContents().get(1);
+		private final Assignment cPriorAssignment_1_0_2_2 = (Assignment)cGroup_1_0_2.eContents().get(2);
+		private final RuleCall cPriorEIntParserRuleCall_1_0_2_2_0 = (RuleCall)cPriorAssignment_1_0_2_2.eContents().get(0);
+		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+		private final Keyword cPriorKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
+		private final Assignment cPriorAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
+		private final RuleCall cPriorEIntParserRuleCall_1_1_1_0 = (RuleCall)cPriorAssignment_1_1_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		
+		//TransitionMoe fmlStmchn::TransitionMoe:
+		//	'<' ('moc:'? (moc=TransitionMoc ('&' isElse?='else')?
+		//	| isElse?='else') (',' "prior:"? prior=EInt)?
+		//	| "prior:"? prior=EInt)
+		//	'>'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'<' ('moc:'? (moc=TransitionMoc ('&' isElse?='else')? | isElse?='else') (',' "prior:"? prior=EInt)? | "prior:"?
+		//prior=EInt) '>'
+		public Group getGroup() { return cGroup; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_0() { return cLessThanSignKeyword_0; }
+		
+		//('moc:'? (moc=TransitionMoc ('&' isElse?='else')? | isElse?='else') (',' "prior:"? prior=EInt)? | "prior:"? prior=EInt)
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//'moc:'? (moc=TransitionMoc ('&' isElse?='else')? | isElse?='else') (',' "prior:"? prior=EInt)?
+		public Group getGroup_1_0() { return cGroup_1_0; }
+		
+		//'moc:'?
+		public Keyword getMocKeyword_1_0_0() { return cMocKeyword_1_0_0; }
+		
+		//(moc=TransitionMoc ('&' isElse?='else')? | isElse?='else')
+		public Alternatives getAlternatives_1_0_1() { return cAlternatives_1_0_1; }
+		
+		//moc=TransitionMoc ('&' isElse?='else')?
+		public Group getGroup_1_0_1_0() { return cGroup_1_0_1_0; }
+		
+		//moc=TransitionMoc
+		public Assignment getMocAssignment_1_0_1_0_0() { return cMocAssignment_1_0_1_0_0; }
+		
+		//TransitionMoc
+		public RuleCall getMocTransitionMocEnumRuleCall_1_0_1_0_0_0() { return cMocTransitionMocEnumRuleCall_1_0_1_0_0_0; }
+		
+		//('&' isElse?='else')?
+		public Group getGroup_1_0_1_0_1() { return cGroup_1_0_1_0_1; }
+		
+		//'&'
+		public Keyword getAmpersandKeyword_1_0_1_0_1_0() { return cAmpersandKeyword_1_0_1_0_1_0; }
+		
+		//isElse?='else'
+		public Assignment getIsElseAssignment_1_0_1_0_1_1() { return cIsElseAssignment_1_0_1_0_1_1; }
+		
+		//'else'
+		public Keyword getIsElseElseKeyword_1_0_1_0_1_1_0() { return cIsElseElseKeyword_1_0_1_0_1_1_0; }
+		
+		//isElse?='else'
+		public Assignment getIsElseAssignment_1_0_1_1() { return cIsElseAssignment_1_0_1_1; }
+		
+		//'else'
+		public Keyword getIsElseElseKeyword_1_0_1_1_0() { return cIsElseElseKeyword_1_0_1_1_0; }
+		
+		//(',' "prior:"? prior=EInt)?
+		public Group getGroup_1_0_2() { return cGroup_1_0_2; }
+		
+		//','
+		public Keyword getCommaKeyword_1_0_2_0() { return cCommaKeyword_1_0_2_0; }
+		
+		//"prior:"?
+		public Keyword getPriorKeyword_1_0_2_1() { return cPriorKeyword_1_0_2_1; }
+		
+		//prior=EInt
+		public Assignment getPriorAssignment_1_0_2_2() { return cPriorAssignment_1_0_2_2; }
+		
+		//EInt
+		public RuleCall getPriorEIntParserRuleCall_1_0_2_2_0() { return cPriorEIntParserRuleCall_1_0_2_2_0; }
+		
+		//"prior:"? prior=EInt
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//"prior:"?
+		public Keyword getPriorKeyword_1_1_0() { return cPriorKeyword_1_1_0; }
+		
+		//prior=EInt
+		public Assignment getPriorAssignment_1_1_1() { return cPriorAssignment_1_1_1; }
+		
+		//EInt
+		public RuleCall getPriorEIntParserRuleCall_1_1_1_0() { return cPriorEIntParserRuleCall_1_1_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_2() { return cGreaterThanSignKeyword_2; }
+	}
+	public class TransitionBehaviorElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionBehavior");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cBlockStatementAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cOpAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cOpBlockStatementSchedulerParserRuleCall_1_0 = (RuleCall)cOpAssignment_1.eContents().get(0);
+		private final Assignment cStatementAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cStatementStatementParserRuleCall_2_0 = (RuleCall)cStatementAssignment_2.eContents().get(0);
+		
+		//TransitionBehavior fmlStmnt::BlockStatement:
+		//	{fmlStmnt::BlockStatement} op=BlockStatementScheduler?
+		//	statement+=Statement*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmnt::BlockStatement} op=BlockStatementScheduler? statement+=Statement*
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmnt::BlockStatement}
+		public Action getBlockStatementAction_0() { return cBlockStatementAction_0; }
+		
+		//op=BlockStatementScheduler?
+		public Assignment getOpAssignment_1() { return cOpAssignment_1; }
+		
+		//BlockStatementScheduler
+		public RuleCall getOpBlockStatementSchedulerParserRuleCall_1_0() { return cOpBlockStatementSchedulerParserRuleCall_1_0; }
+		
+		//statement+=Statement*
+		public Assignment getStatementAssignment_2() { return cStatementAssignment_2; }
+		
+		//Statement
+		public RuleCall getStatementStatementParserRuleCall_2_0() { return cStatementStatementParserRuleCall_2_0; }
+	}
+	public class TransitionTriggerElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionTrigger");
+		private final RuleCall cInputComStatementParserRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//TransitionTrigger fmlStmnt::InputComStatement:
+		//	InputComStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//InputComStatement
+		public RuleCall getInputComStatementParserRuleCall() { return cInputComStatementParserRuleCall; }
+	}
+	public class TransitionGuardElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionGuard");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Action cGuardStatementAction_0_0 = (Action)cGroup_0.eContents().get(0);
+		private final Keyword cGuardKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
+		private final Assignment cConditionAssignment_0_2 = (Assignment)cGroup_0.eContents().get(2);
+		private final RuleCall cConditionTransitionGuardExpressionParserRuleCall_0_2_0 = (RuleCall)cConditionAssignment_0_2.eContents().get(0);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Keyword cGuardKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
+		private final Group cGroup_1_1_0 = (Group)cAlternatives_1_1.eContents().get(0);
+		private final Action cGuardStatementAction_1_1_0_0 = (Action)cGroup_1_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_1_1_0_1 = (Alternatives)cGroup_1_1_0.eContents().get(1);
+		private final Group cGroup_1_1_0_1_0 = (Group)cAlternatives_1_1_0_1.eContents().get(0);
+		private final Keyword cLeftSquareBracketKeyword_1_1_0_1_0_0 = (Keyword)cGroup_1_1_0_1_0.eContents().get(0);
+		private final Assignment cConditionAssignment_1_1_0_1_0_1 = (Assignment)cGroup_1_1_0_1_0.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_1_0_1_0_1_0 = (RuleCall)cConditionAssignment_1_1_0_1_0_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_1_1_0_1_0_2 = (Keyword)cGroup_1_1_0_1_0.eContents().get(2);
+		private final Assignment cConditionAssignment_1_1_0_1_1 = (Assignment)cAlternatives_1_1_0_1.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_1_0_1_1_0 = (RuleCall)cConditionAssignment_1_1_0_1_1.eContents().get(0);
+		private final RuleCall cGuardStatementParserRuleCall_1_1_1 = (RuleCall)cAlternatives_1_1.eContents().get(1);
+		private final RuleCall cEventGuardStatementParserRuleCall_1_1_2 = (RuleCall)cAlternatives_1_1.eContents().get(2);
+		private final RuleCall cCheckSatGuardStatementParserRuleCall_1_1_3 = (RuleCall)cAlternatives_1_1.eContents().get(3);
+		
+		//TransitionGuard fmlStmnt::AbstractGuardStatement:
+		//	{fmlStmnt::GuardStatement}
+		//	'@guard<' condition=TransitionGuardExpression
+		//	| '@guard:' ({fmlStmnt::GuardStatement} ('[' condition=Expression ']'
+		//	| condition=Expression) | GuardStatement
+		//	| EventGuardStatement
+		//	| CheckSatGuardStatement)
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmnt::GuardStatement} '@guard<' condition=TransitionGuardExpression | '@guard:' ({fmlStmnt::GuardStatement} ('['
+		//condition=Expression ']' | condition=Expression) | GuardStatement | EventGuardStatement | CheckSatGuardStatement)
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//{fmlStmnt::GuardStatement} '@guard<' condition=TransitionGuardExpression
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//{fmlStmnt::GuardStatement}
+		public Action getGuardStatementAction_0_0() { return cGuardStatementAction_0_0; }
+		
+		//'@guard<'
+		public Keyword getGuardKeyword_0_1() { return cGuardKeyword_0_1; }
+		
+		//condition=TransitionGuardExpression
+		public Assignment getConditionAssignment_0_2() { return cConditionAssignment_0_2; }
+		
+		//TransitionGuardExpression
+		public RuleCall getConditionTransitionGuardExpressionParserRuleCall_0_2_0() { return cConditionTransitionGuardExpressionParserRuleCall_0_2_0; }
+		
+		//'@guard:' ({fmlStmnt::GuardStatement} ('[' condition=Expression ']' | condition=Expression) | GuardStatement |
+		//EventGuardStatement | CheckSatGuardStatement)
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'@guard:'
+		public Keyword getGuardKeyword_1_0() { return cGuardKeyword_1_0; }
+		
+		//({fmlStmnt::GuardStatement} ('[' condition=Expression ']' | condition=Expression) | GuardStatement | EventGuardStatement
+		//| CheckSatGuardStatement)
+		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
+		
+		//{fmlStmnt::GuardStatement} ('[' condition=Expression ']' | condition=Expression)
+		public Group getGroup_1_1_0() { return cGroup_1_1_0; }
+		
+		//{fmlStmnt::GuardStatement}
+		public Action getGuardStatementAction_1_1_0_0() { return cGuardStatementAction_1_1_0_0; }
+		
+		//('[' condition=Expression ']' | condition=Expression)
+		public Alternatives getAlternatives_1_1_0_1() { return cAlternatives_1_1_0_1; }
+		
+		//'[' condition=Expression ']'
+		public Group getGroup_1_1_0_1_0() { return cGroup_1_1_0_1_0; }
+		
+		//'['
+		public Keyword getLeftSquareBracketKeyword_1_1_0_1_0_0() { return cLeftSquareBracketKeyword_1_1_0_1_0_0; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1_1_0_1_0_1() { return cConditionAssignment_1_1_0_1_0_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_1_0_1_0_1_0() { return cConditionExpressionParserRuleCall_1_1_0_1_0_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_1_1_0_1_0_2() { return cRightSquareBracketKeyword_1_1_0_1_0_2; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1_1_0_1_1() { return cConditionAssignment_1_1_0_1_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_1_0_1_1_0() { return cConditionExpressionParserRuleCall_1_1_0_1_1_0; }
+		
+		//GuardStatement
+		public RuleCall getGuardStatementParserRuleCall_1_1_1() { return cGuardStatementParserRuleCall_1_1_1; }
+		
+		//EventGuardStatement
+		public RuleCall getEventGuardStatementParserRuleCall_1_1_2() { return cEventGuardStatementParserRuleCall_1_1_2; }
+		
+		//CheckSatGuardStatement
+		public RuleCall getCheckSatGuardStatementParserRuleCall_1_1_3() { return cCheckSatGuardStatementParserRuleCall_1_1_3; }
+	}
+	public class TransitionGuardExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionGuardExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLogicalAssociativeExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cOperatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Alternatives cOperatorAlternatives_1_0 = (Alternatives)cOperatorAssignment_1.eContents().get(0);
+		private final Keyword cOperatorAmpersandAmpersandKeyword_1_0_0 = (Keyword)cOperatorAlternatives_1_0.eContents().get(0);
+		private final Keyword cOperatorAndKeyword_1_0_1 = (Keyword)cOperatorAlternatives_1_0.eContents().get(1);
+		private final Keyword cOperatorVerticalLineVerticalLineKeyword_1_0_2 = (Keyword)cOperatorAlternatives_1_0.eContents().get(2);
+		private final Keyword cOperatorOrKeyword_1_0_3 = (Keyword)cOperatorAlternatives_1_0.eContents().get(3);
+		private final Keyword cGreaterThanSignColonKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cOperandAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cOperandBitwiseOrExpressionParserRuleCall_3_0 = (RuleCall)cOperandAssignment_3.eContents().get(0);
+		
+		//TransitionGuardExpression fmlExpr::Expression:
+		//	{fmlExpr::LogicalAssociativeExpression} operator=('&&' | 'and' | '||' | 'or') '>:'
+		//	operand+=BitwiseOrExpression+
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LogicalAssociativeExpression} operator=('&&' | 'and' | '||' | 'or') '>:' operand+=BitwiseOrExpression+
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LogicalAssociativeExpression}
+		public Action getLogicalAssociativeExpressionAction_0() { return cLogicalAssociativeExpressionAction_0; }
+		
+		//operator=('&&' | 'and' | '||' | 'or')
+		public Assignment getOperatorAssignment_1() { return cOperatorAssignment_1; }
+		
+		//('&&' | 'and' | '||' | 'or')
+		public Alternatives getOperatorAlternatives_1_0() { return cOperatorAlternatives_1_0; }
+		
+		//'&&'
+		public Keyword getOperatorAmpersandAmpersandKeyword_1_0_0() { return cOperatorAmpersandAmpersandKeyword_1_0_0; }
+		
+		//'and'
+		public Keyword getOperatorAndKeyword_1_0_1() { return cOperatorAndKeyword_1_0_1; }
+		
+		//'||'
+		public Keyword getOperatorVerticalLineVerticalLineKeyword_1_0_2() { return cOperatorVerticalLineVerticalLineKeyword_1_0_2; }
+		
+		//'or'
+		public Keyword getOperatorOrKeyword_1_0_3() { return cOperatorOrKeyword_1_0_3; }
+		
+		//'>:'
+		public Keyword getGreaterThanSignColonKeyword_2() { return cGreaterThanSignColonKeyword_2; }
+		
+		//operand+=BitwiseOrExpression+
+		public Assignment getOperandAssignment_3() { return cOperandAssignment_3; }
+		
+		//BitwiseOrExpression
+		public RuleCall getOperandBitwiseOrExpressionParserRuleCall_3_0() { return cOperandBitwiseOrExpressionParserRuleCall_3_0; }
+	}
+	public class TransitionTimedGuardElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionTimedGuard");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Action cTimedGuardStatementAction_0_0 = (Action)cGroup_0.eContents().get(0);
+		private final Keyword cTguardKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
+		private final Assignment cConditionAssignment_0_2 = (Assignment)cGroup_0.eContents().get(2);
+		private final RuleCall cConditionTransitionGuardExpressionParserRuleCall_0_2_0 = (RuleCall)cConditionAssignment_0_2.eContents().get(0);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Keyword cTguardKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
+		private final Group cGroup_1_1_0 = (Group)cAlternatives_1_1.eContents().get(0);
+		private final Action cTimedGuardStatementAction_1_1_0_0 = (Action)cGroup_1_1_0.eContents().get(0);
+		private final Alternatives cAlternatives_1_1_0_1 = (Alternatives)cGroup_1_1_0.eContents().get(1);
+		private final Group cGroup_1_1_0_1_0 = (Group)cAlternatives_1_1_0_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_1_1_0_1_0_0 = (Keyword)cGroup_1_1_0_1_0.eContents().get(0);
+		private final Assignment cConditionAssignment_1_1_0_1_0_1 = (Assignment)cGroup_1_1_0_1_0.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_1_0_1_0_1_0 = (RuleCall)cConditionAssignment_1_1_0_1_0_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_1_1_0_1_0_2 = (Keyword)cGroup_1_1_0_1_0.eContents().get(2);
+		private final Assignment cConditionAssignment_1_1_0_1_1 = (Assignment)cAlternatives_1_1_0_1.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_1_0_1_1_0 = (RuleCall)cConditionAssignment_1_1_0_1_1.eContents().get(0);
+		private final RuleCall cTimedGuardStatementParserRuleCall_1_1_1 = (RuleCall)cAlternatives_1_1.eContents().get(1);
+		
+		//TransitionTimedGuard fmlStmnt::TimedGuardStatement:
+		//	{fmlStmnt::TimedGuardStatement}
+		//	'@tguard<' condition=TransitionGuardExpression
+		//	| '@tguard:' ({fmlStmnt::TimedGuardStatement} ('{' condition=Expression '}'
+		//	| condition=Expression) | TimedGuardStatement)
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmnt::TimedGuardStatement} '@tguard<' condition=TransitionGuardExpression | '@tguard:'
+		//({fmlStmnt::TimedGuardStatement} ('{' condition=Expression '}' | condition=Expression) | TimedGuardStatement)
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//{fmlStmnt::TimedGuardStatement} '@tguard<' condition=TransitionGuardExpression
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//{fmlStmnt::TimedGuardStatement}
+		public Action getTimedGuardStatementAction_0_0() { return cTimedGuardStatementAction_0_0; }
+		
+		//'@tguard<'
+		public Keyword getTguardKeyword_0_1() { return cTguardKeyword_0_1; }
+		
+		//condition=TransitionGuardExpression
+		public Assignment getConditionAssignment_0_2() { return cConditionAssignment_0_2; }
+		
+		//TransitionGuardExpression
+		public RuleCall getConditionTransitionGuardExpressionParserRuleCall_0_2_0() { return cConditionTransitionGuardExpressionParserRuleCall_0_2_0; }
+		
+		//'@tguard:' ({fmlStmnt::TimedGuardStatement} ('{' condition=Expression '}' | condition=Expression) | TimedGuardStatement)
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'@tguard:'
+		public Keyword getTguardKeyword_1_0() { return cTguardKeyword_1_0; }
+		
+		//({fmlStmnt::TimedGuardStatement} ('{' condition=Expression '}' | condition=Expression) | TimedGuardStatement)
+		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
+		
+		//{fmlStmnt::TimedGuardStatement} ('{' condition=Expression '}' | condition=Expression)
+		public Group getGroup_1_1_0() { return cGroup_1_1_0; }
+		
+		//{fmlStmnt::TimedGuardStatement}
+		public Action getTimedGuardStatementAction_1_1_0_0() { return cTimedGuardStatementAction_1_1_0_0; }
+		
+		//('{' condition=Expression '}' | condition=Expression)
+		public Alternatives getAlternatives_1_1_0_1() { return cAlternatives_1_1_0_1; }
+		
+		//'{' condition=Expression '}'
+		public Group getGroup_1_1_0_1_0() { return cGroup_1_1_0_1_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_1_1_0_1_0_0() { return cLeftCurlyBracketKeyword_1_1_0_1_0_0; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1_1_0_1_0_1() { return cConditionAssignment_1_1_0_1_0_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_1_0_1_0_1_0() { return cConditionExpressionParserRuleCall_1_1_0_1_0_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_1_1_0_1_0_2() { return cRightCurlyBracketKeyword_1_1_0_1_0_2; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1_1_0_1_1() { return cConditionAssignment_1_1_0_1_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_1_0_1_1_0() { return cConditionExpressionParserRuleCall_1_1_0_1_1_0; }
+		
+		//TimedGuardStatement
+		public RuleCall getTimedGuardStatementParserRuleCall_1_1_1() { return cTimedGuardStatementParserRuleCall_1_1_1; }
+	}
+	public class TransitionEffectElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionEffect");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cTransitionEffectStatementParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cBlockStatementStatementAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cStatementAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cStatementTransitionEffectStatementParserRuleCall_1_1_0 = (RuleCall)cStatementAssignment_1_1.eContents().get(0);
+		
+		//TransitionEffect fmlStmnt::Statement:
+		//	TransitionEffectStatement ({fmlStmnt::BlockStatement.statement+=current} statement+=TransitionEffectStatement)*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//TransitionEffectStatement ({fmlStmnt::BlockStatement.statement+=current} statement+=TransitionEffectStatement)*
+		public Group getGroup() { return cGroup; }
+		
+		//TransitionEffectStatement
+		public RuleCall getTransitionEffectStatementParserRuleCall_0() { return cTransitionEffectStatementParserRuleCall_0; }
+		
+		//({fmlStmnt::BlockStatement.statement+=current} statement+=TransitionEffectStatement)*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlStmnt::BlockStatement.statement+=current}
+		public Action getBlockStatementStatementAction_1_0() { return cBlockStatementStatementAction_1_0; }
+		
+		//statement+=TransitionEffectStatement
+		public Assignment getStatementAssignment_1_1() { return cStatementAssignment_1_1; }
+		
+		//TransitionEffectStatement
+		public RuleCall getStatementTransitionEffectStatementParserRuleCall_1_1_0() { return cStatementTransitionEffectStatementParserRuleCall_1_1_0; }
+	}
+	public class TransitionEffectStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionEffectStatement");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cExpressionStatementParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cOutputComStatementParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cIfStatementParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cWhileDoStatementParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cDoWhileStatementParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cForStatementParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cForEachStatementParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		private final RuleCall cInterruptStatementParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		private final RuleCall cActivityStatementParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
+		private final RuleCall cInvokeStatementParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
+		
+		//TransitionEffectStatement fmlStmnt::Statement:
+		//	ExpressionStatement
+		//	| OutputComStatement
+		//	| IfStatement
+		//	| WhileDoStatement
+		//	| DoWhileStatement
+		//	| ForStatement
+		//	| ForEachStatement
+		//	| InterruptStatement
+		//	| ActivityStatement
+		//	| InvokeStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//ExpressionStatement | OutputComStatement | IfStatement | WhileDoStatement | DoWhileStatement | ForStatement |
+		//ForEachStatement | InterruptStatement | ActivityStatement | InvokeStatement
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//ExpressionStatement
+		public RuleCall getExpressionStatementParserRuleCall_0() { return cExpressionStatementParserRuleCall_0; }
+		
+		//OutputComStatement
+		public RuleCall getOutputComStatementParserRuleCall_1() { return cOutputComStatementParserRuleCall_1; }
+		
+		//IfStatement
+		public RuleCall getIfStatementParserRuleCall_2() { return cIfStatementParserRuleCall_2; }
+		
+		//WhileDoStatement
+		public RuleCall getWhileDoStatementParserRuleCall_3() { return cWhileDoStatementParserRuleCall_3; }
+		
+		//DoWhileStatement
+		public RuleCall getDoWhileStatementParserRuleCall_4() { return cDoWhileStatementParserRuleCall_4; }
+		
+		//ForStatement
+		public RuleCall getForStatementParserRuleCall_5() { return cForStatementParserRuleCall_5; }
+		
+		//ForEachStatement
+		public RuleCall getForEachStatementParserRuleCall_6() { return cForEachStatementParserRuleCall_6; }
+		
+		//InterruptStatement
+		public RuleCall getInterruptStatementParserRuleCall_7() { return cInterruptStatementParserRuleCall_7; }
+		
+		//ActivityStatement
+		public RuleCall getActivityStatementParserRuleCall_8() { return cActivityStatementParserRuleCall_8; }
+		
+		//InvokeStatement
+		public RuleCall getInvokeStatementParserRuleCall_9() { return cInvokeStatementParserRuleCall_9; }
+	}
+	public class StatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Statement");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cBlockStatementParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cExpressionStatementParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cGuardStatementParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cTimedGuardStatementParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cEventGuardStatementParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cCheckSatGuardStatementParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cInputComStatementParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		private final RuleCall cOutputComStatementParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		private final RuleCall cIfStatementParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
+		private final RuleCall cWhileDoStatementParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
+		private final RuleCall cDoWhileStatementParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
+		private final RuleCall cForStatementParserRuleCall_11 = (RuleCall)cAlternatives.eContents().get(11);
+		private final RuleCall cForEachStatementParserRuleCall_12 = (RuleCall)cAlternatives.eContents().get(12);
+		private final RuleCall cInterruptStatementParserRuleCall_13 = (RuleCall)cAlternatives.eContents().get(13);
+		private final RuleCall cActivityStatementParserRuleCall_14 = (RuleCall)cAlternatives.eContents().get(14);
+		private final RuleCall cInvokeStatementParserRuleCall_15 = (RuleCall)cAlternatives.eContents().get(15);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Statement Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Statement fmlStmnt::Statement:
+		//	BlockStatement
+		//	| ExpressionStatement
+		//	| GuardStatement
+		//	| TimedGuardStatement
+		//	| EventGuardStatement
+		//	| CheckSatGuardStatement
+		//	| InputComStatement
+		//	| OutputComStatement
+		//	| IfStatement
+		//	| WhileDoStatement
+		//	| DoWhileStatement
+		//	| ForStatement
+		//	| ForEachStatement
+		//	| InterruptStatement
+		//	| ActivityStatement
+		//	| InvokeStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//BlockStatement | ExpressionStatement | GuardStatement | TimedGuardStatement | EventGuardStatement |
+		//CheckSatGuardStatement | InputComStatement | OutputComStatement | IfStatement | WhileDoStatement | DoWhileStatement |
+		//ForStatement | ForEachStatement | InterruptStatement | ActivityStatement | InvokeStatement
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//BlockStatement
+		public RuleCall getBlockStatementParserRuleCall_0() { return cBlockStatementParserRuleCall_0; }
+		
+		//ExpressionStatement
+		public RuleCall getExpressionStatementParserRuleCall_1() { return cExpressionStatementParserRuleCall_1; }
+		
+		//GuardStatement
+		public RuleCall getGuardStatementParserRuleCall_2() { return cGuardStatementParserRuleCall_2; }
+		
+		//TimedGuardStatement
+		public RuleCall getTimedGuardStatementParserRuleCall_3() { return cTimedGuardStatementParserRuleCall_3; }
+		
+		//EventGuardStatement
+		public RuleCall getEventGuardStatementParserRuleCall_4() { return cEventGuardStatementParserRuleCall_4; }
+		
+		//CheckSatGuardStatement
+		public RuleCall getCheckSatGuardStatementParserRuleCall_5() { return cCheckSatGuardStatementParserRuleCall_5; }
+		
+		//InputComStatement
+		public RuleCall getInputComStatementParserRuleCall_6() { return cInputComStatementParserRuleCall_6; }
+		
+		//OutputComStatement
+		public RuleCall getOutputComStatementParserRuleCall_7() { return cOutputComStatementParserRuleCall_7; }
+		
+		//IfStatement
+		public RuleCall getIfStatementParserRuleCall_8() { return cIfStatementParserRuleCall_8; }
+		
+		//WhileDoStatement
+		public RuleCall getWhileDoStatementParserRuleCall_9() { return cWhileDoStatementParserRuleCall_9; }
+		
+		//DoWhileStatement
+		public RuleCall getDoWhileStatementParserRuleCall_10() { return cDoWhileStatementParserRuleCall_10; }
+		
+		//ForStatement
+		public RuleCall getForStatementParserRuleCall_11() { return cForStatementParserRuleCall_11; }
+		
+		//ForEachStatement
+		public RuleCall getForEachStatementParserRuleCall_12() { return cForEachStatementParserRuleCall_12; }
+		
+		//InterruptStatement
+		public RuleCall getInterruptStatementParserRuleCall_13() { return cInterruptStatementParserRuleCall_13; }
+		
+		//ActivityStatement
+		public RuleCall getActivityStatementParserRuleCall_14() { return cActivityStatementParserRuleCall_14; }
+		
+		//InvokeStatement
+		public RuleCall getInvokeStatementParserRuleCall_15() { return cInvokeStatementParserRuleCall_15; }
+	}
+	public class BlockStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cBlockStatementAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cOpAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cOpBlockStatementSchedulerParserRuleCall_2_0 = (RuleCall)cOpAssignment_2.eContents().get(0);
+		private final Assignment cStatementAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cStatementStatementParserRuleCall_3_0 = (RuleCall)cStatementAssignment_3.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//BlockStatement fmlStmnt::BlockStatement:
+		//	{fmlStmnt::BlockStatement}
+		//	'{'
+		//	op=BlockStatementScheduler?
+		//	statement+=Statement*
+		//	'}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmnt::BlockStatement} '{' op=BlockStatementScheduler? statement+=Statement* '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmnt::BlockStatement}
+		public Action getBlockStatementAction_0() { return cBlockStatementAction_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_1() { return cLeftCurlyBracketKeyword_1; }
+		
+		//op=BlockStatementScheduler?
+		public Assignment getOpAssignment_2() { return cOpAssignment_2; }
+		
+		//BlockStatementScheduler
+		public RuleCall getOpBlockStatementSchedulerParserRuleCall_2_0() { return cOpBlockStatementSchedulerParserRuleCall_2_0; }
+		
+		//statement+=Statement*
+		public Assignment getStatementAssignment_3() { return cStatementAssignment_3; }
+		
+		//Statement
+		public RuleCall getStatementStatementParserRuleCall_3_0() { return cStatementStatementParserRuleCall_3_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+	public class BlockStatementSchedulerElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BlockStatementScheduler");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cVerticalLineSemicolonVerticalLineKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cVerticalLineSectionSignVerticalLineKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		private final Keyword cVerticalLineSemicolonSemicolonVerticalLineKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
+		private final Keyword cVerticalLineFullStopVerticalLineKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
+		private final Keyword cVerticalLineSolidusSemicolonVerticalLineKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
+		private final Keyword cIKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
+		private final Keyword cVerticalLineCommaVerticalLineKeyword_6 = (Keyword)cAlternatives.eContents().get(6);
+		private final Keyword cAKeyword_7 = (Keyword)cAlternatives.eContents().get(7);
+		private final Keyword cAndKeyword_8 = (Keyword)cAlternatives.eContents().get(8);
+		private final Keyword cOrKeyword_9 = (Keyword)cAlternatives.eContents().get(9);
+		private final Keyword cAndThenKeyword_10 = (Keyword)cAlternatives.eContents().get(10);
+		private final Keyword cOrElseKeyword_11 = (Keyword)cAlternatives.eContents().get(11);
+		private final Keyword cIndetKeyword_12 = (Keyword)cAlternatives.eContents().get(12);
+		private final Keyword cVerticalLineSolidusReverseSolidusVerticalLineKeyword_13 = (Keyword)cAlternatives.eContents().get(13);
+		private final Keyword cForkKeyword_14 = (Keyword)cAlternatives.eContents().get(14);
+		private final Keyword cJoinKeyword_15 = (Keyword)cAlternatives.eContents().get(15);
+		
+		//BlockStatementScheduler:
+		//	'|;|' | '|§|' | '|;;|' | '|.|' | '|/;|'
+		//	| '|i|' | '|,|' | '|a|'
+		//	| '|and|' | '|or|'
+		//	| '|and#then|' | '|or#else|'
+		//	| '|indet|' | '|/\\|'
+		//	| '|fork|' | '|join|';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'|;|' | '|§|' | '|;;|' | '|.|' | '|/;|' | '|i|' | '|,|' | '|a|' | '|and|' | '|or|' | '|and#then|' | '|or#else|' |
+		//'|indet|' | '|/\\|' | '|fork|' | '|join|'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'|;|'
+		public Keyword getVerticalLineSemicolonVerticalLineKeyword_0() { return cVerticalLineSemicolonVerticalLineKeyword_0; }
+		
+		//'|§|'
+		public Keyword getVerticalLineSectionSignVerticalLineKeyword_1() { return cVerticalLineSectionSignVerticalLineKeyword_1; }
+		
+		//'|;;|'
+		public Keyword getVerticalLineSemicolonSemicolonVerticalLineKeyword_2() { return cVerticalLineSemicolonSemicolonVerticalLineKeyword_2; }
+		
+		//'|.|'
+		public Keyword getVerticalLineFullStopVerticalLineKeyword_3() { return cVerticalLineFullStopVerticalLineKeyword_3; }
+		
+		//'|/;|'
+		public Keyword getVerticalLineSolidusSemicolonVerticalLineKeyword_4() { return cVerticalLineSolidusSemicolonVerticalLineKeyword_4; }
+		
+		//'|i|'
+		public Keyword getIKeyword_5() { return cIKeyword_5; }
+		
+		//'|,|'
+		public Keyword getVerticalLineCommaVerticalLineKeyword_6() { return cVerticalLineCommaVerticalLineKeyword_6; }
+		
+		//'|a|'
+		public Keyword getAKeyword_7() { return cAKeyword_7; }
+		
+		//'|and|'
+		public Keyword getAndKeyword_8() { return cAndKeyword_8; }
+		
+		//'|or|'
+		public Keyword getOrKeyword_9() { return cOrKeyword_9; }
+		
+		//'|and#then|'
+		public Keyword getAndThenKeyword_10() { return cAndThenKeyword_10; }
+		
+		//'|or#else|'
+		public Keyword getOrElseKeyword_11() { return cOrElseKeyword_11; }
+		
+		//'|indet|'
+		public Keyword getIndetKeyword_12() { return cIndetKeyword_12; }
+		
+		//'|/\\|'
+		public Keyword getVerticalLineSolidusReverseSolidusVerticalLineKeyword_13() { return cVerticalLineSolidusReverseSolidusVerticalLineKeyword_13; }
+		
+		//'|fork|'
+		public Keyword getForkKeyword_14() { return cForkKeyword_14; }
+		
+		//'|join|'
+		public Keyword getJoinKeyword_15() { return cJoinKeyword_15; }
+	}
+	public class ExpressionStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ExpressionStatement");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Assignment cExpressionAssignment_0_0 = (Assignment)cGroup_0.eContents().get(0);
+		private final RuleCall cExpressionAssignmentExpressionParserRuleCall_0_0_0 = (RuleCall)cExpressionAssignment_0_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Assignment cExpressionAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
+		private final RuleCall cExpressionNewfreshExpressionParserRuleCall_1_0_0 = (RuleCall)cExpressionAssignment_1_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
+		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
+		private final Assignment cExpressionAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final RuleCall cExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0 = (RuleCall)cExpressionAssignment_2_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Group cGroup_3 = (Group)cAlternatives.eContents().get(3);
+		private final Assignment cExpressionAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
+		private final RuleCall cExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0 = (RuleCall)cExpressionAssignment_3_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_3_1 = (Keyword)cGroup_3.eContents().get(1);
+		
+		///////////////////////////////////////////
+		//// Assignment Rules as Expression Statement
+		//// lv = rv
+		//// newfresh lv
+		//// ++lv --lv
+		//// lv++  lv--
+		///////////////////////////////////////////
+		//ExpressionStatement fmlStmnt::ExpressionStatement:
+		//	expression=AssignmentExpression ';'
+		//	| expression=NewfreshExpression ';'
+		//	| expression=IncrementOrDecrementPrefixExpression ';'
+		//	| expression=IncrementOrDecrementPostfixExpression ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//expression=AssignmentExpression ';' | expression=NewfreshExpression ';' |
+		//expression=IncrementOrDecrementPrefixExpression ';' | expression=IncrementOrDecrementPostfixExpression ';'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//expression=AssignmentExpression ';'
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//expression=AssignmentExpression
+		public Assignment getExpressionAssignment_0_0() { return cExpressionAssignment_0_0; }
+		
+		//AssignmentExpression
+		public RuleCall getExpressionAssignmentExpressionParserRuleCall_0_0_0() { return cExpressionAssignmentExpressionParserRuleCall_0_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_0_1() { return cSemicolonKeyword_0_1; }
+		
+		//expression=NewfreshExpression ';'
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//expression=NewfreshExpression
+		public Assignment getExpressionAssignment_1_0() { return cExpressionAssignment_1_0; }
+		
+		//NewfreshExpression
+		public RuleCall getExpressionNewfreshExpressionParserRuleCall_1_0_0() { return cExpressionNewfreshExpressionParserRuleCall_1_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_1_1() { return cSemicolonKeyword_1_1; }
+		
+		//expression=IncrementOrDecrementPrefixExpression ';'
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//expression=IncrementOrDecrementPrefixExpression
+		public Assignment getExpressionAssignment_2_0() { return cExpressionAssignment_2_0; }
+		
+		//IncrementOrDecrementPrefixExpression
+		public RuleCall getExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0() { return cExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_2_1() { return cSemicolonKeyword_2_1; }
+		
+		//expression=IncrementOrDecrementPostfixExpression ';'
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//expression=IncrementOrDecrementPostfixExpression
+		public Assignment getExpressionAssignment_3_0() { return cExpressionAssignment_3_0; }
+		
+		//IncrementOrDecrementPostfixExpression
+		public RuleCall getExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0() { return cExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_3_1() { return cSemicolonKeyword_3_1; }
+	}
+	public class GuardStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.GuardStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cGuardKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		
+		/////////////////////////////////////////////
+		////// Guard Rules
+		/////////////////////////////////////////////
+		//GuardStatement fmlStmnt::GuardStatement:
+		//	'guard' condition=Expression ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'guard' condition=Expression ';'
+		public Group getGroup() { return cGroup; }
+		
+		//'guard'
+		public Keyword getGuardKeyword_0() { return cGuardKeyword_0; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
+	}
+	public class TimedGuardStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TimedGuardStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cTguardKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		
+		//TimedGuardStatement fmlStmnt::TimedGuardStatement:
+		//	'tguard' condition=Expression ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'tguard' condition=Expression ';'
+		public Group getGroup() { return cGroup; }
+		
+		//'tguard'
+		public Keyword getTguardKeyword_0() { return cTguardKeyword_0; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
+	}
+	public class EventGuardStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EventGuardStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cEventKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		
+		//EventGuardStatement fmlStmnt::EventGuardStatement:
+		//	'event' condition=Expression ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'event' condition=Expression ';'
+		public Group getGroup() { return cGroup; }
+		
+		//'event'
+		public Keyword getEventKeyword_0() { return cEventKeyword_0; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
+	}
+	public class CheckSatGuardStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CheckSatGuardStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cChecksatKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cSolverAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cSolverESIdentifierParserRuleCall_2_0 = (RuleCall)cSolverAssignment_2.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cConditionAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cConditionExpressionParserRuleCall_4_0 = (RuleCall)cConditionAssignment_4.eContents().get(0);
+		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//CheckSatGuardStatement fmlStmnt::CheckSatGuardStatement:
+		//	'checksat' '<' solver=ESIdentifier '>' condition=Expression ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'checksat' '<' solver=ESIdentifier '>' condition=Expression ';'
+		public Group getGroup() { return cGroup; }
+		
+		//'checksat'
+		public Keyword getChecksatKeyword_0() { return cChecksatKeyword_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
+		
+		//solver=ESIdentifier
+		public Assignment getSolverAssignment_2() { return cSolverAssignment_2; }
+		
+		//ESIdentifier
+		public RuleCall getSolverESIdentifierParserRuleCall_2_0() { return cSolverESIdentifierParserRuleCall_2_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_3() { return cGreaterThanSignKeyword_3; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_4() { return cConditionAssignment_4; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_4_0() { return cConditionExpressionParserRuleCall_4_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
+	}
+	public class InputComStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InputComStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cInputKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cPortAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cPortNamedElementCrossReference_1_0 = (CrossReference)cPortAssignment_1.eContents().get(0);
+		private final RuleCall cPortNamedElementESUfidParserRuleCall_1_0_1 = (RuleCall)cPortNamedElementCrossReference_1_0.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cLeftValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cLeftValueExpressionParserRuleCall_2_1_0 = (RuleCall)cLeftValueAssignment_2_1.eContents().get(0);
+		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
+		private final Keyword cCommaKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
+		private final Assignment cLeftValueAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
+		private final RuleCall cLeftValueExpressionParserRuleCall_2_2_1_0 = (RuleCall)cLeftValueAssignment_2_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
+		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
+		private final Keyword cLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cTargetAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cTargetExpressionAsMachineParserRuleCall_3_0_1_0 = (RuleCall)cTargetAssignment_3_0_1.eContents().get(0);
+		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
+		private final Alternatives cAlternatives_3_1_0 = (Alternatives)cGroup_3_1.eContents().get(0);
+		private final Keyword cLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0 = (Keyword)cAlternatives_3_1_0.eContents().get(0);
+		private final Keyword cViaKeyword_3_1_0_1 = (Keyword)cAlternatives_3_1_0.eContents().get(1);
+		private final Assignment cRouteAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
+		private final CrossReference cRouteChannelCrossReference_3_1_1_0 = (CrossReference)cRouteAssignment_3_1_1.eContents().get(0);
+		private final RuleCall cRouteChannelESUfidParserRuleCall_3_1_1_0_1 = (RuleCall)cRouteChannelCrossReference_3_1_1_0.eContents().get(1);
+		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		/////////////////////////////////////////////
+		////
+		////// Communication Rules
+		/////////////////////////////////////////////
+		//InputComStatement fmlStmnt::InputComStatement:
+		//	'input' port=[fmlCommon::NamedElement|ESUfid] ('(' leftValue+=Expression (',' leftValue+=Expression)* ')')? (('<--'
+		//	target=ExpressionAsMachine)?
+		//	& (('<==' | 'via') route=[fmlInfra::Channel|ESUfid])?) ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'input' port=[fmlCommon::NamedElement|ESUfid] ('(' leftValue+=Expression (',' leftValue+=Expression)* ')')? (('<--'
+		//target=ExpressionAsMachine)? & (('<==' | 'via') route=[fmlInfra::Channel|ESUfid])?) ';'
+		public Group getGroup() { return cGroup; }
+		
+		//'input'
+		public Keyword getInputKeyword_0() { return cInputKeyword_0; }
+		
+		//port=[fmlCommon::NamedElement|ESUfid]
+		public Assignment getPortAssignment_1() { return cPortAssignment_1; }
+		
+		//[fmlCommon::NamedElement|ESUfid]
+		public CrossReference getPortNamedElementCrossReference_1_0() { return cPortNamedElementCrossReference_1_0; }
+		
+		//ESUfid
+		public RuleCall getPortNamedElementESUfidParserRuleCall_1_0_1() { return cPortNamedElementESUfidParserRuleCall_1_0_1; }
+		
+		//('(' leftValue+=Expression (',' leftValue+=Expression)* ')')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
+		
+		//leftValue+=Expression
+		public Assignment getLeftValueAssignment_2_1() { return cLeftValueAssignment_2_1; }
+		
+		//Expression
+		public RuleCall getLeftValueExpressionParserRuleCall_2_1_0() { return cLeftValueExpressionParserRuleCall_2_1_0; }
+		
+		//(',' leftValue+=Expression)*
+		public Group getGroup_2_2() { return cGroup_2_2; }
+		
+		//','
+		public Keyword getCommaKeyword_2_2_0() { return cCommaKeyword_2_2_0; }
+		
+		//leftValue+=Expression
+		public Assignment getLeftValueAssignment_2_2_1() { return cLeftValueAssignment_2_2_1; }
+		
+		//Expression
+		public RuleCall getLeftValueExpressionParserRuleCall_2_2_1_0() { return cLeftValueExpressionParserRuleCall_2_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2_3() { return cRightParenthesisKeyword_2_3; }
+		
+		//(('<--' target=ExpressionAsMachine)? & (('<==' | 'via') route=[fmlInfra::Channel|ESUfid])?)
+		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
+		
+		//('<--' target=ExpressionAsMachine)?
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//'<--'
+		public Keyword getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0() { return cLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0; }
+		
+		//target=ExpressionAsMachine
+		public Assignment getTargetAssignment_3_0_1() { return cTargetAssignment_3_0_1; }
+		
+		//ExpressionAsMachine
+		public RuleCall getTargetExpressionAsMachineParserRuleCall_3_0_1_0() { return cTargetExpressionAsMachineParserRuleCall_3_0_1_0; }
+		
+		//(('<==' | 'via') route=[fmlInfra::Channel|ESUfid])?
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//('<==' | 'via')
+		public Alternatives getAlternatives_3_1_0() { return cAlternatives_3_1_0; }
+		
+		//'<=='
+		public Keyword getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0() { return cLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0; }
+		
+		//'via'
+		public Keyword getViaKeyword_3_1_0_1() { return cViaKeyword_3_1_0_1; }
+		
+		//route=[fmlInfra::Channel|ESUfid]
+		public Assignment getRouteAssignment_3_1_1() { return cRouteAssignment_3_1_1; }
+		
+		//[fmlInfra::Channel|ESUfid]
+		public CrossReference getRouteChannelCrossReference_3_1_1_0() { return cRouteChannelCrossReference_3_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getRouteChannelESUfidParserRuleCall_3_1_1_0_1() { return cRouteChannelESUfidParserRuleCall_3_1_1_0_1; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
+	}
+	public class OutputComStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OutputComStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cOutputKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cPortAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cPortNamedElementCrossReference_1_0 = (CrossReference)cPortAssignment_1.eContents().get(0);
+		private final RuleCall cPortNamedElementESUfidParserRuleCall_1_0_1 = (RuleCall)cPortNamedElementCrossReference_1_0.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cRigthValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cRigthValueExpressionParserRuleCall_2_1_0 = (RuleCall)cRigthValueAssignment_2_1.eContents().get(0);
+		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
+		private final Keyword cCommaKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
+		private final Assignment cRigthValueAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
+		private final RuleCall cRigthValueExpressionParserRuleCall_2_2_1_0 = (RuleCall)cRigthValueAssignment_2_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
+		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
+		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cTargetAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cTargetExpressionAsMachineParserRuleCall_3_0_1_0 = (RuleCall)cTargetAssignment_3_0_1.eContents().get(0);
+		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
+		private final Alternatives cAlternatives_3_1_0 = (Alternatives)cGroup_3_1.eContents().get(0);
+		private final Keyword cEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0 = (Keyword)cAlternatives_3_1_0.eContents().get(0);
+		private final Keyword cViaKeyword_3_1_0_1 = (Keyword)cAlternatives_3_1_0.eContents().get(1);
+		private final Assignment cRouteAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
+		private final CrossReference cRouteChannelCrossReference_3_1_1_0 = (CrossReference)cRouteAssignment_3_1_1.eContents().get(0);
+		private final RuleCall cRouteChannelESUfidParserRuleCall_3_1_1_0_1 = (RuleCall)cRouteChannelCrossReference_3_1_1_0.eContents().get(1);
+		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//OutputComStatement fmlStmnt::OutputComStatement:
+		//	'output' port=[fmlCommon::NamedElement|ESUfid] ('(' rigthValue+=Expression (',' rigthValue+=Expression)* ')')? (('-->'
+		//	target=ExpressionAsMachine)?
+		//	& (('==>' | 'via') route=[fmlInfra::Channel|ESUfid])?) ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'output' port=[fmlCommon::NamedElement|ESUfid] ('(' rigthValue+=Expression (',' rigthValue+=Expression)* ')')? (('-->'
+		//target=ExpressionAsMachine)? & (('==>' | 'via') route=[fmlInfra::Channel|ESUfid])?) ';'
+		public Group getGroup() { return cGroup; }
+		
+		//'output'
+		public Keyword getOutputKeyword_0() { return cOutputKeyword_0; }
+		
+		//port=[fmlCommon::NamedElement|ESUfid]
+		public Assignment getPortAssignment_1() { return cPortAssignment_1; }
+		
+		//[fmlCommon::NamedElement|ESUfid]
+		public CrossReference getPortNamedElementCrossReference_1_0() { return cPortNamedElementCrossReference_1_0; }
+		
+		//ESUfid
+		public RuleCall getPortNamedElementESUfidParserRuleCall_1_0_1() { return cPortNamedElementESUfidParserRuleCall_1_0_1; }
+		
+		//('(' rigthValue+=Expression (',' rigthValue+=Expression)* ')')?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
+		
+		//rigthValue+=Expression
+		public Assignment getRigthValueAssignment_2_1() { return cRigthValueAssignment_2_1; }
+		
+		//Expression
+		public RuleCall getRigthValueExpressionParserRuleCall_2_1_0() { return cRigthValueExpressionParserRuleCall_2_1_0; }
+		
+		//(',' rigthValue+=Expression)*
+		public Group getGroup_2_2() { return cGroup_2_2; }
+		
+		//','
+		public Keyword getCommaKeyword_2_2_0() { return cCommaKeyword_2_2_0; }
+		
+		//rigthValue+=Expression
+		public Assignment getRigthValueAssignment_2_2_1() { return cRigthValueAssignment_2_2_1; }
+		
+		//Expression
+		public RuleCall getRigthValueExpressionParserRuleCall_2_2_1_0() { return cRigthValueExpressionParserRuleCall_2_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2_3() { return cRightParenthesisKeyword_2_3; }
+		
+		//(('-->' target=ExpressionAsMachine)? & (('==>' | 'via') route=[fmlInfra::Channel|ESUfid])?)
+		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
+		
+		//('-->' target=ExpressionAsMachine)?
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//'-->'
+		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0; }
+		
+		//target=ExpressionAsMachine
+		public Assignment getTargetAssignment_3_0_1() { return cTargetAssignment_3_0_1; }
+		
+		//ExpressionAsMachine
+		public RuleCall getTargetExpressionAsMachineParserRuleCall_3_0_1_0() { return cTargetExpressionAsMachineParserRuleCall_3_0_1_0; }
+		
+		//(('==>' | 'via') route=[fmlInfra::Channel|ESUfid])?
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//('==>' | 'via')
+		public Alternatives getAlternatives_3_1_0() { return cAlternatives_3_1_0; }
+		
+		//'==>'
+		public Keyword getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0() { return cEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0; }
+		
+		//'via'
+		public Keyword getViaKeyword_3_1_0_1() { return cViaKeyword_3_1_0_1; }
+		
+		//route=[fmlInfra::Channel|ESUfid]
+		public Assignment getRouteAssignment_3_1_1() { return cRouteAssignment_3_1_1; }
+		
+		//[fmlInfra::Channel|ESUfid]
+		public CrossReference getRouteChannelCrossReference_3_1_1_0() { return cRouteChannelCrossReference_3_1_1_0; }
+		
+		//ESUfid
+		public RuleCall getRouteChannelESUfidParserRuleCall_3_1_1_0_1() { return cRouteChannelESUfidParserRuleCall_3_1_1_0_1; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
+	}
+	public class ExpressionAsMachineElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ExpressionAsMachine");
+		private final Assignment cMachineAssignment = (Assignment)rule.eContents().get(1);
+		private final RuleCall cMachineValuePureNamedMachineExpressionParserRuleCall_0 = (RuleCall)cMachineAssignment.eContents().get(0);
+		
+		//ExpressionAsMachine fmlExpr::ExpressionAsMachine:
+		//	machine=ValuePureNamedMachineExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//machine=ValuePureNamedMachineExpression
+		public Assignment getMachineAssignment() { return cMachineAssignment; }
+		
+		//ValuePureNamedMachineExpression
+		public RuleCall getMachineValuePureNamedMachineExpressionParserRuleCall_0() { return cMachineValuePureNamedMachineExpressionParserRuleCall_0; }
+	}
+	public class IfStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IfStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cIfKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
+		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
+		private final Assignment cElseifStatementAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cElseifStatementElseIfStatementParserRuleCall_3_0 = (RuleCall)cElseifStatementAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cElseKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cElseBlockAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cElseBlockBlockStatementParserRuleCall_4_1_0 = (RuleCall)cElseBlockAssignment_4_1.eContents().get(0);
+		
+		/////////////////////////////////////////////
+		////// If - Conditional Rules
+		/////////////////////////////////////////////
+		//IfStatement fmlStmnt::IfStatement:
+		//	'if' condition=Expression
+		//	bodyBlock=BlockStatement
+		//	elseifStatement+=ElseIfStatement* ('else' elseBlock=BlockStatement)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'if' condition=Expression bodyBlock=BlockStatement elseifStatement+=ElseIfStatement* ('else' elseBlock=BlockStatement)?
+		public Group getGroup() { return cGroup; }
+		
+		//'if'
+		public Keyword getIfKeyword_0() { return cIfKeyword_0; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
+		
+		//elseifStatement+=ElseIfStatement*
+		public Assignment getElseifStatementAssignment_3() { return cElseifStatementAssignment_3; }
+		
+		//ElseIfStatement
+		public RuleCall getElseifStatementElseIfStatementParserRuleCall_3_0() { return cElseifStatementElseIfStatementParserRuleCall_3_0; }
+		
+		//('else' elseBlock=BlockStatement)?
+		public Group getGroup_4() { return cGroup_4; }
+		
+		//'else'
+		public Keyword getElseKeyword_4_0() { return cElseKeyword_4_0; }
+		
+		//elseBlock=BlockStatement
+		public Assignment getElseBlockAssignment_4_1() { return cElseBlockAssignment_4_1; }
+		
+		//BlockStatement
+		public RuleCall getElseBlockBlockStatementParserRuleCall_4_1_0() { return cElseBlockBlockStatementParserRuleCall_4_1_0; }
+	}
+	public class ElseIfStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ElseIfStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Alternatives cAlternatives_0 = (Alternatives)cGroup.eContents().get(0);
+		private final Keyword cElseifKeyword_0_0 = (Keyword)cAlternatives_0.eContents().get(0);
+		private final Group cGroup_0_1 = (Group)cAlternatives_0.eContents().get(1);
+		private final Keyword cElseKeyword_0_1_0 = (Keyword)cGroup_0_1.eContents().get(0);
+		private final Keyword cIfKeyword_0_1_1 = (Keyword)cGroup_0_1.eContents().get(1);
+		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
+		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
+		
+		//ElseIfStatement fmlStmnt::ConditionalBlockStatement:
+		//	('elseif' | 'else' 'if') condition=Expression
+		//	bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//('elseif' | 'else' 'if') condition=Expression bodyBlock=BlockStatement
+		public Group getGroup() { return cGroup; }
+		
+		//('elseif' | 'else' 'if')
+		public Alternatives getAlternatives_0() { return cAlternatives_0; }
+		
+		//'elseif'
+		public Keyword getElseifKeyword_0_0() { return cElseifKeyword_0_0; }
+		
+		//'else' 'if'
+		public Group getGroup_0_1() { return cGroup_0_1; }
+		
+		//'else'
+		public Keyword getElseKeyword_0_1_0() { return cElseKeyword_0_1_0; }
+		
+		//'if'
+		public Keyword getIfKeyword_0_1_1() { return cIfKeyword_0_1_1; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
+	}
+	public class WhileDoStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.WhileDoStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cWhileKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
+		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
+		
+		///////////////////////////////////////////
+		//// Loop - Iteration Rules
+		///////////////////////////////////////////
+		//WhileDoStatement fmlStmnt::WhileDoStatement:
+		//	'while' condition=Expression bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'while' condition=Expression bodyBlock=BlockStatement
+		public Group getGroup() { return cGroup; }
+		
+		//'while'
+		public Keyword getWhileKeyword_0() { return cWhileKeyword_0; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
+	}
+	public class DoWhileStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DoWhileStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cDoKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Assignment cBodyBlockAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_1_0 = (RuleCall)cBodyBlockAssignment_1.eContents().get(0);
+		private final Keyword cWhileKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cConditionAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cConditionExpressionParserRuleCall_3_0 = (RuleCall)cConditionAssignment_3.eContents().get(0);
+		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//DoWhileStatement fmlStmnt::DoWhileStatement:
+		//	'do' bodyBlock=BlockStatement 'while' condition=Expression ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'do' bodyBlock=BlockStatement 'while' condition=Expression ';'
+		public Group getGroup() { return cGroup; }
+		
+		//'do'
+		public Keyword getDoKeyword_0() { return cDoKeyword_0; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_1() { return cBodyBlockAssignment_1; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_1_0() { return cBodyBlockBlockStatementParserRuleCall_1_0; }
+		
+		//'while'
+		public Keyword getWhileKeyword_2() { return cWhileKeyword_2; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_3() { return cConditionAssignment_3; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_3_0() { return cConditionExpressionParserRuleCall_3_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
+	}
+	public class ForStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ForStatement");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Keyword cForKeyword_0_0 = (Keyword)cGroup_0.eContents().get(0);
+		private final Assignment cInitAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
+		private final RuleCall cInitForAssignmentExpressionParserRuleCall_0_1_0 = (RuleCall)cInitAssignment_0_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_0_2 = (Keyword)cGroup_0.eContents().get(2);
+		private final Assignment cConditionAssignment_0_3 = (Assignment)cGroup_0.eContents().get(3);
+		private final RuleCall cConditionExpressionParserRuleCall_0_3_0 = (RuleCall)cConditionAssignment_0_3.eContents().get(0);
+		private final Keyword cSemicolonKeyword_0_4 = (Keyword)cGroup_0.eContents().get(4);
+		private final Assignment cIterateAssignment_0_5 = (Assignment)cGroup_0.eContents().get(5);
+		private final RuleCall cIterateForAssignmentExpressionParserRuleCall_0_5_0 = (RuleCall)cIterateAssignment_0_5.eContents().get(0);
+		private final Assignment cBodyBlockAssignment_0_6 = (Assignment)cGroup_0.eContents().get(6);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_0_6_0 = (RuleCall)cBodyBlockAssignment_0_6.eContents().get(0);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Keyword cForKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Keyword cLeftParenthesisKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
+		private final Assignment cInitAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cInitForAssignmentExpressionParserRuleCall_1_2_0 = (RuleCall)cInitAssignment_1_2.eContents().get(0);
+		private final Keyword cSemicolonKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
+		private final Assignment cConditionAssignment_1_4 = (Assignment)cGroup_1.eContents().get(4);
+		private final RuleCall cConditionExpressionParserRuleCall_1_4_0 = (RuleCall)cConditionAssignment_1_4.eContents().get(0);
+		private final Keyword cSemicolonKeyword_1_5 = (Keyword)cGroup_1.eContents().get(5);
+		private final Assignment cIterateAssignment_1_6 = (Assignment)cGroup_1.eContents().get(6);
+		private final RuleCall cIterateForAssignmentExpressionParserRuleCall_1_6_0 = (RuleCall)cIterateAssignment_1_6.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_1_7 = (Keyword)cGroup_1.eContents().get(7);
+		private final Assignment cBodyBlockAssignment_1_8 = (Assignment)cGroup_1.eContents().get(8);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_1_8_0 = (RuleCall)cBodyBlockAssignment_1_8.eContents().get(0);
+		
+		//ForStatement fmlStmnt::ForStatement:
+		//	'for' init=ForAssignmentExpression? ';'
+		//	condition=Expression ';' iterate=ForAssignmentExpression?
+		//	bodyBlock=BlockStatement
+		//	| 'for' '(' init=ForAssignmentExpression? ';'
+		//	condition=Expression ';' iterate=ForAssignmentExpression? ')'
+		//	bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'for' init=ForAssignmentExpression? ';' condition=Expression ';' iterate=ForAssignmentExpression?
+		//bodyBlock=BlockStatement | 'for' '(' init=ForAssignmentExpression? ';' condition=Expression ';'
+		//iterate=ForAssignmentExpression? ')' bodyBlock=BlockStatement
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'for' init=ForAssignmentExpression? ';' condition=Expression ';' iterate=ForAssignmentExpression?
+		//bodyBlock=BlockStatement
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//'for'
+		public Keyword getForKeyword_0_0() { return cForKeyword_0_0; }
+		
+		//init=ForAssignmentExpression?
+		public Assignment getInitAssignment_0_1() { return cInitAssignment_0_1; }
+		
+		//ForAssignmentExpression
+		public RuleCall getInitForAssignmentExpressionParserRuleCall_0_1_0() { return cInitForAssignmentExpressionParserRuleCall_0_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_0_2() { return cSemicolonKeyword_0_2; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_0_3() { return cConditionAssignment_0_3; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_0_3_0() { return cConditionExpressionParserRuleCall_0_3_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_0_4() { return cSemicolonKeyword_0_4; }
+		
+		//iterate=ForAssignmentExpression?
+		public Assignment getIterateAssignment_0_5() { return cIterateAssignment_0_5; }
+		
+		//ForAssignmentExpression
+		public RuleCall getIterateForAssignmentExpressionParserRuleCall_0_5_0() { return cIterateForAssignmentExpressionParserRuleCall_0_5_0; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_0_6() { return cBodyBlockAssignment_0_6; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_0_6_0() { return cBodyBlockBlockStatementParserRuleCall_0_6_0; }
+		
+		//'for' '(' init=ForAssignmentExpression? ';' condition=Expression ';' iterate=ForAssignmentExpression? ')'
+		//bodyBlock=BlockStatement
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'for'
+		public Keyword getForKeyword_1_0() { return cForKeyword_1_0; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_1_1() { return cLeftParenthesisKeyword_1_1; }
+		
+		//init=ForAssignmentExpression?
+		public Assignment getInitAssignment_1_2() { return cInitAssignment_1_2; }
+		
+		//ForAssignmentExpression
+		public RuleCall getInitForAssignmentExpressionParserRuleCall_1_2_0() { return cInitForAssignmentExpressionParserRuleCall_1_2_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_1_3() { return cSemicolonKeyword_1_3; }
+		
+		//condition=Expression
+		public Assignment getConditionAssignment_1_4() { return cConditionAssignment_1_4; }
+		
+		//Expression
+		public RuleCall getConditionExpressionParserRuleCall_1_4_0() { return cConditionExpressionParserRuleCall_1_4_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_1_5() { return cSemicolonKeyword_1_5; }
+		
+		//iterate=ForAssignmentExpression?
+		public Assignment getIterateAssignment_1_6() { return cIterateAssignment_1_6; }
+		
+		//ForAssignmentExpression
+		public RuleCall getIterateForAssignmentExpressionParserRuleCall_1_6_0() { return cIterateForAssignmentExpressionParserRuleCall_1_6_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_7() { return cRightParenthesisKeyword_1_7; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_1_8() { return cBodyBlockAssignment_1_8; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_1_8_0() { return cBodyBlockBlockStatementParserRuleCall_1_8_0; }
+	}
+	public class ForAssignmentExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cAssignmentExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cIncrementOrDecrementPrefixExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cIncrementOrDecrementPostfixExpressionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		
+		//ForAssignmentExpression fmlExpr::Expression:
+		//	AssignmentExpression
+		//	| IncrementOrDecrementPrefixExpression
+		//	| IncrementOrDecrementPostfixExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//AssignmentExpression | IncrementOrDecrementPrefixExpression | IncrementOrDecrementPostfixExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//AssignmentExpression
+		public RuleCall getAssignmentExpressionParserRuleCall_0() { return cAssignmentExpressionParserRuleCall_0; }
+		
+		//IncrementOrDecrementPrefixExpression
+		public RuleCall getIncrementOrDecrementPrefixExpressionParserRuleCall_1() { return cIncrementOrDecrementPrefixExpressionParserRuleCall_1; }
+		
+		//IncrementOrDecrementPostfixExpression
+		public RuleCall getIncrementOrDecrementPostfixExpressionParserRuleCall_2() { return cIncrementOrDecrementPostfixExpressionParserRuleCall_2; }
+	}
+	public class ForEachStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ForEachStatement");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Keyword cForKeyword_0_0 = (Keyword)cGroup_0.eContents().get(0);
+		private final Assignment cIteratorAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
+		private final RuleCall cIteratorLeftHandSideExpressionParserRuleCall_0_1_0 = (RuleCall)cIteratorAssignment_0_1.eContents().get(0);
+		private final Keyword cColonKeyword_0_2 = (Keyword)cGroup_0.eContents().get(2);
+		private final Assignment cEnumerationAssignment_0_3 = (Assignment)cGroup_0.eContents().get(3);
+		private final RuleCall cEnumerationExpressionParserRuleCall_0_3_0 = (RuleCall)cEnumerationAssignment_0_3.eContents().get(0);
+		private final Assignment cBodyBlockAssignment_0_4 = (Assignment)cGroup_0.eContents().get(4);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_0_4_0 = (RuleCall)cBodyBlockAssignment_0_4.eContents().get(0);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Keyword cForKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Keyword cLeftParenthesisKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
+		private final Assignment cIteratorAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cIteratorLeftHandSideExpressionParserRuleCall_1_2_0 = (RuleCall)cIteratorAssignment_1_2.eContents().get(0);
+		private final Keyword cColonKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
+		private final Assignment cEnumerationAssignment_1_4 = (Assignment)cGroup_1.eContents().get(4);
+		private final RuleCall cEnumerationExpressionParserRuleCall_1_4_0 = (RuleCall)cEnumerationAssignment_1_4.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_1_5 = (Keyword)cGroup_1.eContents().get(5);
+		private final Assignment cBodyBlockAssignment_1_6 = (Assignment)cGroup_1.eContents().get(6);
+		private final RuleCall cBodyBlockBlockStatementParserRuleCall_1_6_0 = (RuleCall)cBodyBlockAssignment_1_6.eContents().get(0);
+		
+		//ForEachStatement fmlStmnt::ForEachStatement:
+		//	'for' iterator=LeftHandSideExpression ':' enumeration=Expression
+		//	bodyBlock=BlockStatement
+		//	| 'for' '(' iterator=LeftHandSideExpression ':' enumeration=Expression ')'
+		//	bodyBlock=BlockStatement
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'for' iterator=LeftHandSideExpression ':' enumeration=Expression bodyBlock=BlockStatement | 'for' '('
+		//iterator=LeftHandSideExpression ':' enumeration=Expression ')' bodyBlock=BlockStatement
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'for' iterator=LeftHandSideExpression ':' enumeration=Expression bodyBlock=BlockStatement
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//'for'
+		public Keyword getForKeyword_0_0() { return cForKeyword_0_0; }
+		
+		//iterator=LeftHandSideExpression
+		public Assignment getIteratorAssignment_0_1() { return cIteratorAssignment_0_1; }
+		
+		//LeftHandSideExpression
+		public RuleCall getIteratorLeftHandSideExpressionParserRuleCall_0_1_0() { return cIteratorLeftHandSideExpressionParserRuleCall_0_1_0; }
+		
+		//':'
+		public Keyword getColonKeyword_0_2() { return cColonKeyword_0_2; }
+		
+		//enumeration=Expression
+		public Assignment getEnumerationAssignment_0_3() { return cEnumerationAssignment_0_3; }
+		
+		//Expression
+		public RuleCall getEnumerationExpressionParserRuleCall_0_3_0() { return cEnumerationExpressionParserRuleCall_0_3_0; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_0_4() { return cBodyBlockAssignment_0_4; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_0_4_0() { return cBodyBlockBlockStatementParserRuleCall_0_4_0; }
+		
+		//'for' '(' iterator=LeftHandSideExpression ':' enumeration=Expression ')' bodyBlock=BlockStatement
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'for'
+		public Keyword getForKeyword_1_0() { return cForKeyword_1_0; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_1_1() { return cLeftParenthesisKeyword_1_1; }
+		
+		//iterator=LeftHandSideExpression
+		public Assignment getIteratorAssignment_1_2() { return cIteratorAssignment_1_2; }
+		
+		//LeftHandSideExpression
+		public RuleCall getIteratorLeftHandSideExpressionParserRuleCall_1_2_0() { return cIteratorLeftHandSideExpressionParserRuleCall_1_2_0; }
+		
+		//':'
+		public Keyword getColonKeyword_1_3() { return cColonKeyword_1_3; }
+		
+		//enumeration=Expression
+		public Assignment getEnumerationAssignment_1_4() { return cEnumerationAssignment_1_4; }
+		
+		//Expression
+		public RuleCall getEnumerationExpressionParserRuleCall_1_4_0() { return cEnumerationExpressionParserRuleCall_1_4_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_5() { return cRightParenthesisKeyword_1_5; }
+		
+		//bodyBlock=BlockStatement
+		public Assignment getBodyBlockAssignment_1_6() { return cBodyBlockAssignment_1_6; }
+		
+		//BlockStatement
+		public RuleCall getBodyBlockBlockStatementParserRuleCall_1_6_0() { return cBodyBlockBlockStatementParserRuleCall_1_6_0; }
+	}
+	public class InterruptStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InterruptStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cKindAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cKindInterruptStatementKindEnumRuleCall_0_0 = (RuleCall)cKindAssignment_0.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Assignment cExprAssignment_1_0 = (Assignment)cAlternatives_1.eContents().get(0);
+		private final RuleCall cExprExpressionParserRuleCall_1_0_0 = (RuleCall)cExprAssignment_1_0.eContents().get(0);
+		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
+		private final Assignment cExprAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
+		private final RuleCall cExprExpressionParserRuleCall_1_1_1_0 = (RuleCall)cExprAssignment_1_1_1.eContents().get(0);
+		private final Group cGroup_1_1_2 = (Group)cGroup_1_1.eContents().get(2);
+		private final Keyword cCommaKeyword_1_1_2_0 = (Keyword)cGroup_1_1_2.eContents().get(0);
+		private final Assignment cExprAssignment_1_1_2_1 = (Assignment)cGroup_1_1_2.eContents().get(1);
+		private final RuleCall cExprExpressionParserRuleCall_1_1_2_1_0 = (RuleCall)cExprAssignment_1_1_2_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_1_1_3 = (Keyword)cGroup_1_1.eContents().get(3);
+		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		
+		///////////////////////////////////////////
+		//// Interrupt Rules
+		///////////////////////////////////////////
+		//InterruptStatement fmlStmnt::InterruptStatement:
+		//	kind=InterruptStatementKind (expr+=Expression
+		//	| '(' expr+=Expression (',' expr+=Expression)* ')')? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//kind=InterruptStatementKind (expr+=Expression | '(' expr+=Expression (',' expr+=Expression)* ')')? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//kind=InterruptStatementKind
+		public Assignment getKindAssignment_0() { return cKindAssignment_0; }
+		
+		//InterruptStatementKind
+		public RuleCall getKindInterruptStatementKindEnumRuleCall_0_0() { return cKindInterruptStatementKindEnumRuleCall_0_0; }
+		
+		//(expr+=Expression | '(' expr+=Expression (',' expr+=Expression)* ')')?
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//expr+=Expression
+		public Assignment getExprAssignment_1_0() { return cExprAssignment_1_0; }
+		
+		//Expression
+		public RuleCall getExprExpressionParserRuleCall_1_0_0() { return cExprExpressionParserRuleCall_1_0_0; }
+		
+		//'(' expr+=Expression (',' expr+=Expression)* ')'
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_1_1_0() { return cLeftParenthesisKeyword_1_1_0; }
+		
+		//expr+=Expression
+		public Assignment getExprAssignment_1_1_1() { return cExprAssignment_1_1_1; }
+		
+		//Expression
+		public RuleCall getExprExpressionParserRuleCall_1_1_1_0() { return cExprExpressionParserRuleCall_1_1_1_0; }
+		
+		//(',' expr+=Expression)*
+		public Group getGroup_1_1_2() { return cGroup_1_1_2; }
+		
+		//','
+		public Keyword getCommaKeyword_1_1_2_0() { return cCommaKeyword_1_1_2_0; }
+		
+		//expr+=Expression
+		public Assignment getExprAssignment_1_1_2_1() { return cExprAssignment_1_1_2_1; }
+		
+		//Expression
+		public RuleCall getExprExpressionParserRuleCall_1_1_2_1_0() { return cExprExpressionParserRuleCall_1_1_2_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_1_3() { return cRightParenthesisKeyword_1_1_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
+	}
+	public class ActivityStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ActivityStatement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cActivityStatementAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cOpAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cOpOPERATOR_ACTIVITYEnumRuleCall_1_0 = (RuleCall)cOpAssignment_1.eContents().get(0);
+		private final Assignment cMachineAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cMachineValuePureNamedMachineExpressionParserRuleCall_2_0 = (RuleCall)cMachineAssignment_2.eContents().get(0);
+		private final Assignment cTupleAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cTupleTupleParameterExpressionParserRuleCall_3_0 = (RuleCall)cTupleAssignment_3.eContents().get(0);
+		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		/////////////////////////////////////////////
+		////// Activity Rules
+		/////////////////////////////////////////////
+		//ActivityStatement fmlStmnt::ActivityStatement:
+		//	{fmlStmnt::ActivityStatement} op=OPERATOR_ACTIVITY
+		//	machine=ValuePureNamedMachineExpression
+		//	tuple=TupleParameterExpression?
+		//	';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlStmnt::ActivityStatement} op=OPERATOR_ACTIVITY machine=ValuePureNamedMachineExpression
+		//tuple=TupleParameterExpression? ';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlStmnt::ActivityStatement}
+		public Action getActivityStatementAction_0() { return cActivityStatementAction_0; }
+		
+		//op=OPERATOR_ACTIVITY
+		public Assignment getOpAssignment_1() { return cOpAssignment_1; }
+		
+		//OPERATOR_ACTIVITY
+		public RuleCall getOpOPERATOR_ACTIVITYEnumRuleCall_1_0() { return cOpOPERATOR_ACTIVITYEnumRuleCall_1_0; }
+		
+		//machine=ValuePureNamedMachineExpression
+		public Assignment getMachineAssignment_2() { return cMachineAssignment_2; }
+		
+		//ValuePureNamedMachineExpression
+		public RuleCall getMachineValuePureNamedMachineExpressionParserRuleCall_2_0() { return cMachineValuePureNamedMachineExpressionParserRuleCall_2_0; }
+		
+		//tuple=TupleParameterExpression?
+		public Assignment getTupleAssignment_3() { return cTupleAssignment_3; }
+		
+		//TupleParameterExpression
+		public RuleCall getTupleTupleParameterExpressionParserRuleCall_3_0() { return cTupleTupleParameterExpressionParserRuleCall_3_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
+	}
+	public class InvokeStatementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InvokeStatement");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Assignment cExpressionAssignment_0_0 = (Assignment)cGroup_0.eContents().get(0);
+		private final RuleCall cExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0 = (RuleCall)cExpressionAssignment_0_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Assignment cInvokableAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
+		private final CrossReference cInvokableNamedElementCrossReference_1_0_0 = (CrossReference)cInvokableAssignment_1_0.eContents().get(0);
+		private final RuleCall cInvokableNamedElementESUfidParserRuleCall_1_0_0_1 = (RuleCall)cInvokableNamedElementCrossReference_1_0_0.eContents().get(1);
+		private final Assignment cExecRoutineAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Keyword cExecRoutineLeftParenthesisKeyword_1_1_0 = (Keyword)cExecRoutineAssignment_1_1.eContents().get(0);
+		private final Assignment cArgsAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cArgsMixTupleExpressionListParserRuleCall_1_2_0 = (RuleCall)cArgsAssignment_1_2.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
+		private final Group cGroup_1_4 = (Group)cGroup_1.eContents().get(4);
+		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0 = (Keyword)cGroup_1_4.eContents().get(0);
+		private final Alternatives cAlternatives_1_4_1 = (Alternatives)cGroup_1_4.eContents().get(1);
+		private final Group cGroup_1_4_1_0 = (Group)cAlternatives_1_4_1.eContents().get(0);
+		private final Assignment cRetsAssignment_1_4_1_0_0 = (Assignment)cGroup_1_4_1_0.eContents().get(0);
+		private final CrossReference cRetsVariableCrossReference_1_4_1_0_0_0 = (CrossReference)cRetsAssignment_1_4_1_0_0.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1 = (RuleCall)cRetsVariableCrossReference_1_4_1_0_0_0.eContents().get(1);
+		private final Group cGroup_1_4_1_0_1 = (Group)cGroup_1_4_1_0.eContents().get(1);
+		private final Keyword cCommaKeyword_1_4_1_0_1_0 = (Keyword)cGroup_1_4_1_0_1.eContents().get(0);
+		private final Assignment cRetsAssignment_1_4_1_0_1_1 = (Assignment)cGroup_1_4_1_0_1.eContents().get(1);
+		private final CrossReference cRetsVariableCrossReference_1_4_1_0_1_1_0 = (CrossReference)cRetsAssignment_1_4_1_0_1_1.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_1_4_1_0_1_1_0.eContents().get(1);
+		private final Group cGroup_1_4_1_1 = (Group)cAlternatives_1_4_1.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_1_4_1_1_0 = (Keyword)cGroup_1_4_1_1.eContents().get(0);
+		private final Assignment cRetsAssignment_1_4_1_1_1 = (Assignment)cGroup_1_4_1_1.eContents().get(1);
+		private final CrossReference cRetsVariableCrossReference_1_4_1_1_1_0 = (CrossReference)cRetsAssignment_1_4_1_1_1.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_1_4_1_1_1_0.eContents().get(1);
+		private final Group cGroup_1_4_1_1_2 = (Group)cGroup_1_4_1_1.eContents().get(2);
+		private final Keyword cCommaKeyword_1_4_1_1_2_0 = (Keyword)cGroup_1_4_1_1_2.eContents().get(0);
+		private final Assignment cRetsAssignment_1_4_1_1_2_1 = (Assignment)cGroup_1_4_1_1_2.eContents().get(1);
+		private final CrossReference cRetsVariableCrossReference_1_4_1_1_2_1_0 = (CrossReference)cRetsAssignment_1_4_1_1_2_1.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1 = (RuleCall)cRetsVariableCrossReference_1_4_1_1_2_1_0.eContents().get(1);
+		private final Keyword cRightParenthesisKeyword_1_4_1_1_3 = (Keyword)cGroup_1_4_1_1.eContents().get(3);
+		private final Keyword cSemicolonKeyword_1_5 = (Keyword)cGroup_1.eContents().get(5);
+		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
+		private final Assignment cExecRoutineAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
+		private final Keyword cExecRoutineExecKeyword_2_0_0 = (Keyword)cExecRoutineAssignment_2_0.eContents().get(0);
+		private final Assignment cInvokableAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final CrossReference cInvokableNamedElementCrossReference_2_1_0 = (CrossReference)cInvokableAssignment_2_1.eContents().get(0);
+		private final RuleCall cInvokableNamedElementESUfidParserRuleCall_2_1_0_1 = (RuleCall)cInvokableNamedElementCrossReference_2_1_0.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
+		private final Assignment cArgsAssignment_2_3 = (Assignment)cGroup_2.eContents().get(3);
+		private final RuleCall cArgsMixTupleExpressionListParserRuleCall_2_3_0 = (RuleCall)cArgsAssignment_2_3.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_2_4 = (Keyword)cGroup_2.eContents().get(4);
+		private final Group cGroup_2_5 = (Group)cGroup_2.eContents().get(5);
+		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0 = (Keyword)cGroup_2_5.eContents().get(0);
+		private final Alternatives cAlternatives_2_5_1 = (Alternatives)cGroup_2_5.eContents().get(1);
+		private final Group cGroup_2_5_1_0 = (Group)cAlternatives_2_5_1.eContents().get(0);
+		private final Assignment cRetsAssignment_2_5_1_0_0 = (Assignment)cGroup_2_5_1_0.eContents().get(0);
+		private final CrossReference cRetsVariableCrossReference_2_5_1_0_0_0 = (CrossReference)cRetsAssignment_2_5_1_0_0.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1 = (RuleCall)cRetsVariableCrossReference_2_5_1_0_0_0.eContents().get(1);
+		private final Group cGroup_2_5_1_0_1 = (Group)cGroup_2_5_1_0.eContents().get(1);
+		private final Keyword cCommaKeyword_2_5_1_0_1_0 = (Keyword)cGroup_2_5_1_0_1.eContents().get(0);
+		private final Assignment cRetsAssignment_2_5_1_0_1_1 = (Assignment)cGroup_2_5_1_0_1.eContents().get(1);
+		private final CrossReference cRetsVariableCrossReference_2_5_1_0_1_1_0 = (CrossReference)cRetsAssignment_2_5_1_0_1_1.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_2_5_1_0_1_1_0.eContents().get(1);
+		private final Group cGroup_2_5_1_1 = (Group)cAlternatives_2_5_1.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_2_5_1_1_0 = (Keyword)cGroup_2_5_1_1.eContents().get(0);
+		private final Assignment cRetsAssignment_2_5_1_1_1 = (Assignment)cGroup_2_5_1_1.eContents().get(1);
+		private final CrossReference cRetsVariableCrossReference_2_5_1_1_1_0 = (CrossReference)cRetsAssignment_2_5_1_1_1.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_2_5_1_1_1_0.eContents().get(1);
+		private final Group cGroup_2_5_1_1_2 = (Group)cGroup_2_5_1_1.eContents().get(2);
+		private final Keyword cCommaKeyword_2_5_1_1_2_0 = (Keyword)cGroup_2_5_1_1_2.eContents().get(0);
+		private final Assignment cRetsAssignment_2_5_1_1_2_1 = (Assignment)cGroup_2_5_1_1_2.eContents().get(1);
+		private final CrossReference cRetsVariableCrossReference_2_5_1_1_2_1_0 = (CrossReference)cRetsAssignment_2_5_1_1_2_1.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1 = (RuleCall)cRetsVariableCrossReference_2_5_1_1_2_1_0.eContents().get(1);
+		private final Keyword cRightParenthesisKeyword_2_5_1_1_3 = (Keyword)cGroup_2_5_1_1.eContents().get(3);
+		private final Keyword cSemicolonKeyword_2_6 = (Keyword)cGroup_2.eContents().get(6);
+		private final Group cGroup_3 = (Group)cAlternatives.eContents().get(3);
+		private final Assignment cCallProcedureAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
+		private final Keyword cCallProcedureCallKeyword_3_0_0 = (Keyword)cCallProcedureAssignment_3_0.eContents().get(0);
+		private final Assignment cInvokableAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final CrossReference cInvokableNamedElementCrossReference_3_1_0 = (CrossReference)cInvokableAssignment_3_1.eContents().get(0);
+		private final RuleCall cInvokableNamedElementESUfidParserRuleCall_3_1_0_1 = (RuleCall)cInvokableNamedElementCrossReference_3_1_0.eContents().get(1);
+		private final Assignment cArgsAssignment_3_2 = (Assignment)cGroup_3.eContents().get(2);
+		private final RuleCall cArgsMixTupleExpressionListParserRuleCall_3_2_0 = (RuleCall)cArgsAssignment_3_2.eContents().get(0);
+		private final Group cGroup_3_3 = (Group)cGroup_3.eContents().get(3);
+		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0 = (Keyword)cGroup_3_3.eContents().get(0);
+		private final Alternatives cAlternatives_3_3_1 = (Alternatives)cGroup_3_3.eContents().get(1);
+		private final Group cGroup_3_3_1_0 = (Group)cAlternatives_3_3_1.eContents().get(0);
+		private final Assignment cRetsAssignment_3_3_1_0_0 = (Assignment)cGroup_3_3_1_0.eContents().get(0);
+		private final CrossReference cRetsVariableCrossReference_3_3_1_0_0_0 = (CrossReference)cRetsAssignment_3_3_1_0_0.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1 = (RuleCall)cRetsVariableCrossReference_3_3_1_0_0_0.eContents().get(1);
+		private final Group cGroup_3_3_1_0_1 = (Group)cGroup_3_3_1_0.eContents().get(1);
+		private final Keyword cCommaKeyword_3_3_1_0_1_0 = (Keyword)cGroup_3_3_1_0_1.eContents().get(0);
+		private final Assignment cRetsAssignment_3_3_1_0_1_1 = (Assignment)cGroup_3_3_1_0_1.eContents().get(1);
+		private final CrossReference cRetsVariableCrossReference_3_3_1_0_1_1_0 = (CrossReference)cRetsAssignment_3_3_1_0_1_1.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_3_3_1_0_1_1_0.eContents().get(1);
+		private final Group cGroup_3_3_1_1 = (Group)cAlternatives_3_3_1.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_3_3_1_1_0 = (Keyword)cGroup_3_3_1_1.eContents().get(0);
+		private final Assignment cRetsAssignment_3_3_1_1_1 = (Assignment)cGroup_3_3_1_1.eContents().get(1);
+		private final CrossReference cRetsVariableCrossReference_3_3_1_1_1_0 = (CrossReference)cRetsAssignment_3_3_1_1_1.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_3_3_1_1_1_0.eContents().get(1);
+		private final Group cGroup_3_3_1_1_2 = (Group)cGroup_3_3_1_1.eContents().get(2);
+		private final Keyword cCommaKeyword_3_3_1_1_2_0 = (Keyword)cGroup_3_3_1_1_2.eContents().get(0);
+		private final Assignment cRetsAssignment_3_3_1_1_2_1 = (Assignment)cGroup_3_3_1_1_2.eContents().get(1);
+		private final CrossReference cRetsVariableCrossReference_3_3_1_1_2_1_0 = (CrossReference)cRetsAssignment_3_3_1_1_2_1.eContents().get(0);
+		private final RuleCall cRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1 = (RuleCall)cRetsVariableCrossReference_3_3_1_1_2_1_0.eContents().get(1);
+		private final Keyword cRightParenthesisKeyword_3_3_1_1_3 = (Keyword)cGroup_3_3_1_1.eContents().get(3);
+		private final Keyword cSemicolonKeyword_3_4 = (Keyword)cGroup_3.eContents().get(4);
+		
+		//InvokeStatement fmlStmnt::InvokeStatement:
+		//	expression=InvokeExpressionDeprecated ';'
+		//	// Exec Routine
+		//	| invokable=[fmlCommon::NamedElement|ESUfid] execRoutine?='(' args=MixTupleExpressionList? ')' ('-->'
+		//	(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])*
+		//	| '(' rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* ')'))? ';'
+		//	// Exec Routine
+		//	| execRoutine?='exec' invokable=[fmlCommon::NamedElement|ESUfid]
+		//	'(' args=MixTupleExpressionList? ')' ('-->' (rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])*
+		//	| '(' rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* ')'))? ';'
+		//	// Call Procedure
+		//	| callProcedure?='call' invokable=[fmlCommon::NamedElement|ESUfid] args=MixTupleExpressionList? ('-->'
+		//	(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])*
+		//	| '(' rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* ')'))? ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//expression=InvokeExpressionDeprecated ';' // Exec Routine
+		//| invokable=[fmlCommon::NamedElement|ESUfid] execRoutine?='(' args=MixTupleExpressionList? ')' ('-->'
+		//(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')'))? ';' // Exec Routine
+		//| execRoutine?='exec' invokable=[fmlCommon::NamedElement|ESUfid] '(' args=MixTupleExpressionList? ')' ('-->'
+		//(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')'))? ';' // Call Procedure
+		//| callProcedure?='call' invokable=[fmlCommon::NamedElement|ESUfid] args=MixTupleExpressionList? ('-->'
+		//(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')'))? ';'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//expression=InvokeExpressionDeprecated ';'
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//expression=InvokeExpressionDeprecated
+		public Assignment getExpressionAssignment_0_0() { return cExpressionAssignment_0_0; }
+		
+		//InvokeExpressionDeprecated
+		public RuleCall getExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0() { return cExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_0_1() { return cSemicolonKeyword_0_1; }
+		
+		//invokable=[fmlCommon::NamedElement|ESUfid] execRoutine?='(' args=MixTupleExpressionList? ')' ('-->'
+		//(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')'))? ';'
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//invokable=[fmlCommon::NamedElement|ESUfid]
+		public Assignment getInvokableAssignment_1_0() { return cInvokableAssignment_1_0; }
+		
+		//[fmlCommon::NamedElement|ESUfid]
+		public CrossReference getInvokableNamedElementCrossReference_1_0_0() { return cInvokableNamedElementCrossReference_1_0_0; }
+		
+		//ESUfid
+		public RuleCall getInvokableNamedElementESUfidParserRuleCall_1_0_0_1() { return cInvokableNamedElementESUfidParserRuleCall_1_0_0_1; }
+		
+		//execRoutine?='('
+		public Assignment getExecRoutineAssignment_1_1() { return cExecRoutineAssignment_1_1; }
+		
+		//'('
+		public Keyword getExecRoutineLeftParenthesisKeyword_1_1_0() { return cExecRoutineLeftParenthesisKeyword_1_1_0; }
+		
+		//args=MixTupleExpressionList?
+		public Assignment getArgsAssignment_1_2() { return cArgsAssignment_1_2; }
+		
+		//MixTupleExpressionList
+		public RuleCall getArgsMixTupleExpressionListParserRuleCall_1_2_0() { return cArgsMixTupleExpressionListParserRuleCall_1_2_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_3() { return cRightParenthesisKeyword_1_3; }
+		
+		//('-->' (rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')'))?
+		public Group getGroup_1_4() { return cGroup_1_4; }
+		
+		//'-->'
+		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0; }
+		
+		//(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')')
+		public Alternatives getAlternatives_1_4_1() { return cAlternatives_1_4_1; }
+		
+		//rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])*
+		public Group getGroup_1_4_1_0() { return cGroup_1_4_1_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_1_4_1_0_0() { return cRetsAssignment_1_4_1_0_0; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_1_4_1_0_0_0() { return cRetsVariableCrossReference_1_4_1_0_0_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1() { return cRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1; }
+		
+		//(',' rets+=[fmlInfra::Variable])*
+		public Group getGroup_1_4_1_0_1() { return cGroup_1_4_1_0_1; }
+		
+		//','
+		public Keyword getCommaKeyword_1_4_1_0_1_0() { return cCommaKeyword_1_4_1_0_1_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_1_4_1_0_1_1() { return cRetsAssignment_1_4_1_0_1_1; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_1_4_1_0_1_1_0() { return cRetsVariableCrossReference_1_4_1_0_1_1_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1; }
+		
+		//'(' rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* ')'
+		public Group getGroup_1_4_1_1() { return cGroup_1_4_1_1; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_1_4_1_1_0() { return cLeftParenthesisKeyword_1_4_1_1_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_1_4_1_1_1() { return cRetsAssignment_1_4_1_1_1; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_1_4_1_1_1_0() { return cRetsVariableCrossReference_1_4_1_1_1_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1; }
+		
+		//(',' rets+=[fmlInfra::Variable])*
+		public Group getGroup_1_4_1_1_2() { return cGroup_1_4_1_1_2; }
+		
+		//','
+		public Keyword getCommaKeyword_1_4_1_1_2_0() { return cCommaKeyword_1_4_1_1_2_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_1_4_1_1_2_1() { return cRetsAssignment_1_4_1_1_2_1; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_1_4_1_1_2_1_0() { return cRetsVariableCrossReference_1_4_1_1_2_1_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1() { return cRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_4_1_1_3() { return cRightParenthesisKeyword_1_4_1_1_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_1_5() { return cSemicolonKeyword_1_5; }
+		
+		//execRoutine?='exec' invokable=[fmlCommon::NamedElement|ESUfid] '(' args=MixTupleExpressionList? ')' ('-->'
+		//(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')'))? ';'
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//execRoutine?='exec'
+		public Assignment getExecRoutineAssignment_2_0() { return cExecRoutineAssignment_2_0; }
+		
+		//'exec'
+		public Keyword getExecRoutineExecKeyword_2_0_0() { return cExecRoutineExecKeyword_2_0_0; }
+		
+		//invokable=[fmlCommon::NamedElement|ESUfid]
+		public Assignment getInvokableAssignment_2_1() { return cInvokableAssignment_2_1; }
+		
+		//[fmlCommon::NamedElement|ESUfid]
+		public CrossReference getInvokableNamedElementCrossReference_2_1_0() { return cInvokableNamedElementCrossReference_2_1_0; }
+		
+		//ESUfid
+		public RuleCall getInvokableNamedElementESUfidParserRuleCall_2_1_0_1() { return cInvokableNamedElementESUfidParserRuleCall_2_1_0_1; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_2_2() { return cLeftParenthesisKeyword_2_2; }
+		
+		//args=MixTupleExpressionList?
+		public Assignment getArgsAssignment_2_3() { return cArgsAssignment_2_3; }
+		
+		//MixTupleExpressionList
+		public RuleCall getArgsMixTupleExpressionListParserRuleCall_2_3_0() { return cArgsMixTupleExpressionListParserRuleCall_2_3_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2_4() { return cRightParenthesisKeyword_2_4; }
+		
+		//('-->' (rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')'))?
+		public Group getGroup_2_5() { return cGroup_2_5; }
+		
+		//'-->'
+		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0; }
+		
+		//(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')')
+		public Alternatives getAlternatives_2_5_1() { return cAlternatives_2_5_1; }
+		
+		//rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])*
+		public Group getGroup_2_5_1_0() { return cGroup_2_5_1_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_2_5_1_0_0() { return cRetsAssignment_2_5_1_0_0; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_2_5_1_0_0_0() { return cRetsVariableCrossReference_2_5_1_0_0_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1() { return cRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1; }
+		
+		//(',' rets+=[fmlInfra::Variable])*
+		public Group getGroup_2_5_1_0_1() { return cGroup_2_5_1_0_1; }
+		
+		//','
+		public Keyword getCommaKeyword_2_5_1_0_1_0() { return cCommaKeyword_2_5_1_0_1_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_2_5_1_0_1_1() { return cRetsAssignment_2_5_1_0_1_1; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_2_5_1_0_1_1_0() { return cRetsVariableCrossReference_2_5_1_0_1_1_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1; }
+		
+		//'(' rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* ')'
+		public Group getGroup_2_5_1_1() { return cGroup_2_5_1_1; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_2_5_1_1_0() { return cLeftParenthesisKeyword_2_5_1_1_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_2_5_1_1_1() { return cRetsAssignment_2_5_1_1_1; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_2_5_1_1_1_0() { return cRetsVariableCrossReference_2_5_1_1_1_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1; }
+		
+		//(',' rets+=[fmlInfra::Variable])*
+		public Group getGroup_2_5_1_1_2() { return cGroup_2_5_1_1_2; }
+		
+		//','
+		public Keyword getCommaKeyword_2_5_1_1_2_0() { return cCommaKeyword_2_5_1_1_2_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_2_5_1_1_2_1() { return cRetsAssignment_2_5_1_1_2_1; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_2_5_1_1_2_1_0() { return cRetsVariableCrossReference_2_5_1_1_2_1_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1() { return cRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2_5_1_1_3() { return cRightParenthesisKeyword_2_5_1_1_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_2_6() { return cSemicolonKeyword_2_6; }
+		
+		//callProcedure?='call' invokable=[fmlCommon::NamedElement|ESUfid] args=MixTupleExpressionList? ('-->'
+		//(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')'))? ';'
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//callProcedure?='call'
+		public Assignment getCallProcedureAssignment_3_0() { return cCallProcedureAssignment_3_0; }
+		
+		//'call'
+		public Keyword getCallProcedureCallKeyword_3_0_0() { return cCallProcedureCallKeyword_3_0_0; }
+		
+		//invokable=[fmlCommon::NamedElement|ESUfid]
+		public Assignment getInvokableAssignment_3_1() { return cInvokableAssignment_3_1; }
+		
+		//[fmlCommon::NamedElement|ESUfid]
+		public CrossReference getInvokableNamedElementCrossReference_3_1_0() { return cInvokableNamedElementCrossReference_3_1_0; }
+		
+		//ESUfid
+		public RuleCall getInvokableNamedElementESUfidParserRuleCall_3_1_0_1() { return cInvokableNamedElementESUfidParserRuleCall_3_1_0_1; }
+		
+		//args=MixTupleExpressionList?
+		public Assignment getArgsAssignment_3_2() { return cArgsAssignment_3_2; }
+		
+		//MixTupleExpressionList
+		public RuleCall getArgsMixTupleExpressionListParserRuleCall_3_2_0() { return cArgsMixTupleExpressionListParserRuleCall_3_2_0; }
+		
+		//('-->' (rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')'))?
+		public Group getGroup_3_3() { return cGroup_3_3; }
+		
+		//'-->'
+		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0; }
+		
+		//(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* | '(' rets+=[fmlInfra::Variable] (','
+		//rets+=[fmlInfra::Variable])* ')')
+		public Alternatives getAlternatives_3_3_1() { return cAlternatives_3_3_1; }
+		
+		//rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])*
+		public Group getGroup_3_3_1_0() { return cGroup_3_3_1_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_3_3_1_0_0() { return cRetsAssignment_3_3_1_0_0; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_3_3_1_0_0_0() { return cRetsVariableCrossReference_3_3_1_0_0_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1() { return cRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1; }
+		
+		//(',' rets+=[fmlInfra::Variable])*
+		public Group getGroup_3_3_1_0_1() { return cGroup_3_3_1_0_1; }
+		
+		//','
+		public Keyword getCommaKeyword_3_3_1_0_1_0() { return cCommaKeyword_3_3_1_0_1_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_3_3_1_0_1_1() { return cRetsAssignment_3_3_1_0_1_1; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_3_3_1_0_1_1_0() { return cRetsVariableCrossReference_3_3_1_0_1_1_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1; }
+		
+		//'(' rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* ')'
+		public Group getGroup_3_3_1_1() { return cGroup_3_3_1_1; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_3_3_1_1_0() { return cLeftParenthesisKeyword_3_3_1_1_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_3_3_1_1_1() { return cRetsAssignment_3_3_1_1_1; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_3_3_1_1_1_0() { return cRetsVariableCrossReference_3_3_1_1_1_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1; }
+		
+		//(',' rets+=[fmlInfra::Variable])*
+		public Group getGroup_3_3_1_1_2() { return cGroup_3_3_1_1_2; }
+		
+		//','
+		public Keyword getCommaKeyword_3_3_1_1_2_0() { return cCommaKeyword_3_3_1_1_2_0; }
+		
+		//rets+=[fmlInfra::Variable]
+		public Assignment getRetsAssignment_3_3_1_1_2_1() { return cRetsAssignment_3_3_1_1_2_1; }
+		
+		//[fmlInfra::Variable]
+		public CrossReference getRetsVariableCrossReference_3_3_1_1_2_1_0() { return cRetsVariableCrossReference_3_3_1_1_2_1_0; }
+		
+		//ID
+		public RuleCall getRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1() { return cRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_3_3_1_1_3() { return cRightParenthesisKeyword_3_3_1_1_3; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_3_4() { return cSemicolonKeyword_3_4; }
+	}
+	public class ExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Expression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cAssignmentExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cConditionalTestExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Expression Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//Expression fmlExpr::Expression:
+		//	AssignmentExpression
+		//	| ConditionalTestExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//AssignmentExpression | ConditionalTestExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//AssignmentExpression
+		public RuleCall getAssignmentExpressionParserRuleCall_0() { return cAssignmentExpressionParserRuleCall_0; }
+		
+		//ConditionalTestExpression
+		public RuleCall getConditionalTestExpressionParserRuleCall_1() { return cConditionalTestExpressionParserRuleCall_1; }
+	}
+	public class AssignmentExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AssignmentExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cLeftHandSideAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_0_0 = (RuleCall)cLeftHandSideAssignment_0.eContents().get(0);
+		private final Assignment cOperatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cOperatorAssignmentOperatorParserRuleCall_1_0 = (RuleCall)cOperatorAssignment_1.eContents().get(0);
+		private final Assignment cRigthHandSideAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cRigthHandSideExpressionParserRuleCall_2_0 = (RuleCall)cRigthHandSideAssignment_2.eContents().get(0);
+		
+		//// Assignment Expression
+		//AssignmentExpression fmlExpr::AssignmentExpression:
+		//	leftHandSide=LeftHandSideExpression
+		//	operator=AssignmentOperator rigthHandSide=Expression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//leftHandSide=LeftHandSideExpression operator=AssignmentOperator rigthHandSide=Expression
+		public Group getGroup() { return cGroup; }
+		
+		//leftHandSide=LeftHandSideExpression
+		public Assignment getLeftHandSideAssignment_0() { return cLeftHandSideAssignment_0; }
+		
+		//LeftHandSideExpression
+		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_0_0; }
+		
+		//operator=AssignmentOperator
+		public Assignment getOperatorAssignment_1() { return cOperatorAssignment_1; }
+		
+		//AssignmentOperator
+		public RuleCall getOperatorAssignmentOperatorParserRuleCall_1_0() { return cOperatorAssignmentOperatorParserRuleCall_1_0; }
+		
+		//rigthHandSide=Expression
+		public Assignment getRigthHandSideAssignment_2() { return cRigthHandSideAssignment_2; }
+		
+		//Expression
+		public RuleCall getRigthHandSideExpressionParserRuleCall_2_0() { return cRigthHandSideExpressionParserRuleCall_2_0; }
+	}
+	public class AssignmentOperatorElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AssignmentOperator");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cEqualsSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cColonEqualsSignKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		private final Keyword cColonColonEqualsSignKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
+		private final Keyword cPlusSignEqualsSignKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
+		private final Keyword cHyphenMinusEqualsSignKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
+		private final Keyword cAsteriskEqualsSignKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
+		private final Keyword cSolidusEqualsSignKeyword_6 = (Keyword)cAlternatives.eContents().get(6);
+		private final Keyword cPercentSignEqualsSignKeyword_7 = (Keyword)cAlternatives.eContents().get(7);
+		private final Keyword cAmpersandAmpersandEqualsSignKeyword_8 = (Keyword)cAlternatives.eContents().get(8);
+		private final Keyword cVerticalLineVerticalLineEqualsSignKeyword_9 = (Keyword)cAlternatives.eContents().get(9);
+		private final Keyword cAmpersandEqualsSignKeyword_10 = (Keyword)cAlternatives.eContents().get(10);
+		private final Keyword cVerticalLineEqualsSignKeyword_11 = (Keyword)cAlternatives.eContents().get(11);
+		private final Keyword cCircumflexAccentEqualsSignKeyword_12 = (Keyword)cAlternatives.eContents().get(12);
+		private final Keyword cLessThanSignLessThanSignEqualsSignKeyword_13 = (Keyword)cAlternatives.eContents().get(13);
+		private final Keyword cGreaterThanSignGreaterThanSignEqualsSignKeyword_14 = (Keyword)cAlternatives.eContents().get(14);
+		private final Keyword cGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15 = (Keyword)cAlternatives.eContents().get(15);
+		private final Keyword cLessThanSignEqualsSignLessThanSignKeyword_16 = (Keyword)cAlternatives.eContents().get(16);
+		private final Keyword cCircumflexAccentEqualsSignLessThanSignKeyword_17 = (Keyword)cAlternatives.eContents().get(17);
+		private final Keyword cCircumflexAccentEqualsSignGreaterThanSignKeyword_18 = (Keyword)cAlternatives.eContents().get(18);
+		private final Keyword cGreaterThanSignEqualsSignGreaterThanSignKeyword_19 = (Keyword)cAlternatives.eContents().get(19);
+		
+		//AssignmentOperator:
+		//	'=' | ':=' | '::='
+		//	| '+=' | '-='
+		//	| '*=' | '/=' | '%='
+		//	| '&&=' | '||='
+		//	| '&=' | '|=' | '^='
+		//	| '<<=' | '>>=' | '>>>='
+		//	// queue operation: push, assign_top, top, pop
+		//	| '<=<'
+		//	| '^=<'
+		//	| '^=>'
+		//	| '>=>';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'=' | ':=' | '::=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&&=' | '||=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '>>>=' // queue operation: push, assign_top, top, pop
+		//| '<=<' | '^=<' | '^=>' | '>=>'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'='
+		public Keyword getEqualsSignKeyword_0() { return cEqualsSignKeyword_0; }
+		
+		//':='
+		public Keyword getColonEqualsSignKeyword_1() { return cColonEqualsSignKeyword_1; }
+		
+		//'::='
+		public Keyword getColonColonEqualsSignKeyword_2() { return cColonColonEqualsSignKeyword_2; }
+		
+		//'+='
+		public Keyword getPlusSignEqualsSignKeyword_3() { return cPlusSignEqualsSignKeyword_3; }
+		
+		//'-='
+		public Keyword getHyphenMinusEqualsSignKeyword_4() { return cHyphenMinusEqualsSignKeyword_4; }
+		
+		//'*='
+		public Keyword getAsteriskEqualsSignKeyword_5() { return cAsteriskEqualsSignKeyword_5; }
+		
+		//'/='
+		public Keyword getSolidusEqualsSignKeyword_6() { return cSolidusEqualsSignKeyword_6; }
+		
+		//'%='
+		public Keyword getPercentSignEqualsSignKeyword_7() { return cPercentSignEqualsSignKeyword_7; }
+		
+		//'&&='
+		public Keyword getAmpersandAmpersandEqualsSignKeyword_8() { return cAmpersandAmpersandEqualsSignKeyword_8; }
+		
+		//'||='
+		public Keyword getVerticalLineVerticalLineEqualsSignKeyword_9() { return cVerticalLineVerticalLineEqualsSignKeyword_9; }
+		
+		//'&='
+		public Keyword getAmpersandEqualsSignKeyword_10() { return cAmpersandEqualsSignKeyword_10; }
+		
+		//'|='
+		public Keyword getVerticalLineEqualsSignKeyword_11() { return cVerticalLineEqualsSignKeyword_11; }
+		
+		//'^='
+		public Keyword getCircumflexAccentEqualsSignKeyword_12() { return cCircumflexAccentEqualsSignKeyword_12; }
+		
+		//'<<='
+		public Keyword getLessThanSignLessThanSignEqualsSignKeyword_13() { return cLessThanSignLessThanSignEqualsSignKeyword_13; }
+		
+		//'>>='
+		public Keyword getGreaterThanSignGreaterThanSignEqualsSignKeyword_14() { return cGreaterThanSignGreaterThanSignEqualsSignKeyword_14; }
+		
+		//'>>>='
+		public Keyword getGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15() { return cGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15; }
+		
+		//'<=<'
+		public Keyword getLessThanSignEqualsSignLessThanSignKeyword_16() { return cLessThanSignEqualsSignLessThanSignKeyword_16; }
+		
+		//'^=<'
+		public Keyword getCircumflexAccentEqualsSignLessThanSignKeyword_17() { return cCircumflexAccentEqualsSignLessThanSignKeyword_17; }
+		
+		//'^=>'
+		public Keyword getCircumflexAccentEqualsSignGreaterThanSignKeyword_18() { return cCircumflexAccentEqualsSignGreaterThanSignKeyword_18; }
+		
+		//'>=>'
+		public Keyword getGreaterThanSignEqualsSignGreaterThanSignKeyword_19() { return cGreaterThanSignEqualsSignGreaterThanSignKeyword_19; }
+	}
+	public class LeftHandSideExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLeftHandSideExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Assignment cLvalueAssignment_1_0 = (Assignment)cAlternatives_1.eContents().get(0);
+		private final RuleCall cLvalueValueSelectionExpressionParserRuleCall_1_0_0 = (RuleCall)cLvalueAssignment_1_0.eContents().get(0);
+		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
+		private final Assignment cLvalueAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
+		private final RuleCall cLvalueValueSelectionExpressionParserRuleCall_1_1_1_0 = (RuleCall)cLvalueAssignment_1_1_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_1_1_2 = (Keyword)cGroup_1_1.eContents().get(2);
+		
+		//LeftHandSideExpression fmlExpr::LeftHandSideExpression:
+		//	{fmlExpr::LeftHandSideExpression} (lvalue=ValueSelectionExpression
+		//	| '(' lvalue=ValueSelectionExpression ')')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LeftHandSideExpression} (lvalue=ValueSelectionExpression | '(' lvalue=ValueSelectionExpression ')')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LeftHandSideExpression}
+		public Action getLeftHandSideExpressionAction_0() { return cLeftHandSideExpressionAction_0; }
+		
+		//(lvalue=ValueSelectionExpression | '(' lvalue=ValueSelectionExpression ')')
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//lvalue=ValueSelectionExpression
+		public Assignment getLvalueAssignment_1_0() { return cLvalueAssignment_1_0; }
+		
+		//ValueSelectionExpression
+		public RuleCall getLvalueValueSelectionExpressionParserRuleCall_1_0_0() { return cLvalueValueSelectionExpressionParserRuleCall_1_0_0; }
+		
+		//'(' lvalue=ValueSelectionExpression ')'
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_1_1_0() { return cLeftParenthesisKeyword_1_1_0; }
+		
+		//lvalue=ValueSelectionExpression
+		public Assignment getLvalueAssignment_1_1_1() { return cLvalueAssignment_1_1_1; }
+		
+		//ValueSelectionExpression
+		public RuleCall getLvalueValueSelectionExpressionParserRuleCall_1_1_1_0() { return cLvalueValueSelectionExpressionParserRuleCall_1_1_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_1_2() { return cRightParenthesisKeyword_1_1_2; }
+	}
+	public class ConditionalTestExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ConditionalTestExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cLogicalOrExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cConditionalTestExpressionConditionAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Keyword cOperatorQuestionMarkKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
+		private final Assignment cThenOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cThenOperandExpressionParserRuleCall_1_2_0 = (RuleCall)cThenOperandAssignment_1_2.eContents().get(0);
+		private final Keyword cColonKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
+		private final Assignment cElseOperandAssignment_1_4 = (Assignment)cGroup_1.eContents().get(4);
+		private final RuleCall cElseOperandExpressionParserRuleCall_1_4_0 = (RuleCall)cElseOperandAssignment_1_4.eContents().get(0);
+		
+		//// Conditional Test Expression
+		//ConditionalTestExpression fmlExpr::Expression:
+		//	LogicalOrExpression ({fmlExpr::ConditionalTestExpression.condition=current} operator='?' thenOperand=Expression ':'
+		//	elseOperand=Expression)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LogicalOrExpression ({fmlExpr::ConditionalTestExpression.condition=current} operator='?' thenOperand=Expression ':'
+		//elseOperand=Expression)?
+		public Group getGroup() { return cGroup; }
+		
+		//LogicalOrExpression
+		public RuleCall getLogicalOrExpressionParserRuleCall_0() { return cLogicalOrExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::ConditionalTestExpression.condition=current} operator='?' thenOperand=Expression ':' elseOperand=Expression)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::ConditionalTestExpression.condition=current}
+		public Action getConditionalTestExpressionConditionAction_1_0() { return cConditionalTestExpressionConditionAction_1_0; }
+		
+		//operator='?'
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//'?'
+		public Keyword getOperatorQuestionMarkKeyword_1_1_0() { return cOperatorQuestionMarkKeyword_1_1_0; }
+		
+		//thenOperand=Expression
+		public Assignment getThenOperandAssignment_1_2() { return cThenOperandAssignment_1_2; }
+		
+		//Expression
+		public RuleCall getThenOperandExpressionParserRuleCall_1_2_0() { return cThenOperandExpressionParserRuleCall_1_2_0; }
+		
+		//':'
+		public Keyword getColonKeyword_1_3() { return cColonKeyword_1_3; }
+		
+		//elseOperand=Expression
+		public Assignment getElseOperandAssignment_1_4() { return cElseOperandAssignment_1_4; }
+		
+		//Expression
+		public RuleCall getElseOperandExpressionParserRuleCall_1_4_0() { return cElseOperandExpressionParserRuleCall_1_4_0; }
+	}
+	public class LogicalOrExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LogicalOrExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cLogicalAndExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cLogicalAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Alternatives cOperatorAlternatives_1_1_0 = (Alternatives)cOperatorAssignment_1_1.eContents().get(0);
+		private final Keyword cOperatorVerticalLineVerticalLineKeyword_1_1_0_0 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(0);
+		private final Keyword cOperatorOrKeyword_1_1_0_1 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(1);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandLogicalAndExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Alternatives cAlternatives_1_3_0 = (Alternatives)cGroup_1_3.eContents().get(0);
+		private final Keyword cVerticalLineVerticalLineKeyword_1_3_0_0 = (Keyword)cAlternatives_1_3_0.eContents().get(0);
+		private final Keyword cOrKeyword_1_3_0_1 = (Keyword)cAlternatives_1_3_0.eContents().get(1);
+		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cOperandLogicalAndExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
+		
+		//// Logical Expression
+		//LogicalOrExpression fmlExpr::Expression:
+		//	LogicalAndExpression ({fmlExpr::LogicalAssociativeExpression.operand+=current} operator=('||' | 'or')
+		//	operand+=LogicalAndExpression (('||' | 'or') operand+=LogicalAndExpression)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LogicalAndExpression ({fmlExpr::LogicalAssociativeExpression.operand+=current} operator=('||' | 'or')
+		//operand+=LogicalAndExpression (('||' | 'or') operand+=LogicalAndExpression)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//LogicalAndExpression
+		public RuleCall getLogicalAndExpressionParserRuleCall_0() { return cLogicalAndExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::LogicalAssociativeExpression.operand+=current} operator=('||' | 'or') operand+=LogicalAndExpression (('||' |
+		//'or') operand+=LogicalAndExpression)*)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::LogicalAssociativeExpression.operand+=current}
+		public Action getLogicalAssociativeExpressionOperandAction_1_0() { return cLogicalAssociativeExpressionOperandAction_1_0; }
+		
+		//operator=('||' | 'or')
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//('||' | 'or')
+		public Alternatives getOperatorAlternatives_1_1_0() { return cOperatorAlternatives_1_1_0; }
+		
+		//'||'
+		public Keyword getOperatorVerticalLineVerticalLineKeyword_1_1_0_0() { return cOperatorVerticalLineVerticalLineKeyword_1_1_0_0; }
+		
+		//'or'
+		public Keyword getOperatorOrKeyword_1_1_0_1() { return cOperatorOrKeyword_1_1_0_1; }
+		
+		//operand+=LogicalAndExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//LogicalAndExpression
+		public RuleCall getOperandLogicalAndExpressionParserRuleCall_1_2_0() { return cOperandLogicalAndExpressionParserRuleCall_1_2_0; }
+		
+		//(('||' | 'or') operand+=LogicalAndExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//('||' | 'or')
+		public Alternatives getAlternatives_1_3_0() { return cAlternatives_1_3_0; }
+		
+		//'||'
+		public Keyword getVerticalLineVerticalLineKeyword_1_3_0_0() { return cVerticalLineVerticalLineKeyword_1_3_0_0; }
+		
+		//'or'
+		public Keyword getOrKeyword_1_3_0_1() { return cOrKeyword_1_3_0_1; }
+		
+		//operand+=LogicalAndExpression
+		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
+		
+		//LogicalAndExpression
+		public RuleCall getOperandLogicalAndExpressionParserRuleCall_1_3_1_0() { return cOperandLogicalAndExpressionParserRuleCall_1_3_1_0; }
+	}
+	public class LogicalAndExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LogicalAndExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cBitwiseOrExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cLogicalAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Alternatives cOperatorAlternatives_1_1_0 = (Alternatives)cOperatorAssignment_1_1.eContents().get(0);
+		private final Keyword cOperatorAmpersandAmpersandKeyword_1_1_0_0 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(0);
+		private final Keyword cOperatorAndKeyword_1_1_0_1 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(1);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandBitwiseOrExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Alternatives cAlternatives_1_3_0 = (Alternatives)cGroup_1_3.eContents().get(0);
+		private final Keyword cAmpersandAmpersandKeyword_1_3_0_0 = (Keyword)cAlternatives_1_3_0.eContents().get(0);
+		private final Keyword cAndKeyword_1_3_0_1 = (Keyword)cAlternatives_1_3_0.eContents().get(1);
+		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cOperandBitwiseOrExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
+		
+		//LogicalAndExpression fmlExpr::Expression:
+		//	BitwiseOrExpression ({fmlExpr::LogicalAssociativeExpression.operand+=current} operator=('&&' | 'and')
+		//	operand+=BitwiseOrExpression (('&&' | 'and') operand+=BitwiseOrExpression)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//BitwiseOrExpression ({fmlExpr::LogicalAssociativeExpression.operand+=current} operator=('&&' | 'and')
+		//operand+=BitwiseOrExpression (('&&' | 'and') operand+=BitwiseOrExpression)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//BitwiseOrExpression
+		public RuleCall getBitwiseOrExpressionParserRuleCall_0() { return cBitwiseOrExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::LogicalAssociativeExpression.operand+=current} operator=('&&' | 'and') operand+=BitwiseOrExpression (('&&' |
+		//'and') operand+=BitwiseOrExpression)*)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::LogicalAssociativeExpression.operand+=current}
+		public Action getLogicalAssociativeExpressionOperandAction_1_0() { return cLogicalAssociativeExpressionOperandAction_1_0; }
+		
+		//operator=('&&' | 'and')
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//('&&' | 'and')
+		public Alternatives getOperatorAlternatives_1_1_0() { return cOperatorAlternatives_1_1_0; }
+		
+		//'&&'
+		public Keyword getOperatorAmpersandAmpersandKeyword_1_1_0_0() { return cOperatorAmpersandAmpersandKeyword_1_1_0_0; }
+		
+		//'and'
+		public Keyword getOperatorAndKeyword_1_1_0_1() { return cOperatorAndKeyword_1_1_0_1; }
+		
+		//operand+=BitwiseOrExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//BitwiseOrExpression
+		public RuleCall getOperandBitwiseOrExpressionParserRuleCall_1_2_0() { return cOperandBitwiseOrExpressionParserRuleCall_1_2_0; }
+		
+		//(('&&' | 'and') operand+=BitwiseOrExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//('&&' | 'and')
+		public Alternatives getAlternatives_1_3_0() { return cAlternatives_1_3_0; }
+		
+		//'&&'
+		public Keyword getAmpersandAmpersandKeyword_1_3_0_0() { return cAmpersandAmpersandKeyword_1_3_0_0; }
+		
+		//'and'
+		public Keyword getAndKeyword_1_3_0_1() { return cAndKeyword_1_3_0_1; }
+		
+		//operand+=BitwiseOrExpression
+		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
+		
+		//BitwiseOrExpression
+		public RuleCall getOperandBitwiseOrExpressionParserRuleCall_1_3_1_0() { return cOperandBitwiseOrExpressionParserRuleCall_1_3_1_0; }
+	}
+	public class BitwiseOrExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cBitwiseXorExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cBitwiseAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Keyword cOperatorVerticalLineKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandBitwiseXorExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Keyword cVerticalLineKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cOperandBitwiseXorExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
+		
+		//// Bitwise Expression
+		//BitwiseOrExpression fmlExpr::Expression:
+		//	BitwiseXorExpression ({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='|'
+		//	operand+=BitwiseXorExpression ('|' operand+=BitwiseXorExpression)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//BitwiseXorExpression ({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='|'
+		//operand+=BitwiseXorExpression ('|' operand+=BitwiseXorExpression)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//BitwiseXorExpression
+		public RuleCall getBitwiseXorExpressionParserRuleCall_0() { return cBitwiseXorExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='|' operand+=BitwiseXorExpression ('|'
+		//operand+=BitwiseXorExpression)*)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::BitwiseAssociativeExpression.operand+=current}
+		public Action getBitwiseAssociativeExpressionOperandAction_1_0() { return cBitwiseAssociativeExpressionOperandAction_1_0; }
+		
+		//operator='|'
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//'|'
+		public Keyword getOperatorVerticalLineKeyword_1_1_0() { return cOperatorVerticalLineKeyword_1_1_0; }
+		
+		//operand+=BitwiseXorExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//BitwiseXorExpression
+		public RuleCall getOperandBitwiseXorExpressionParserRuleCall_1_2_0() { return cOperandBitwiseXorExpressionParserRuleCall_1_2_0; }
+		
+		//('|' operand+=BitwiseXorExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//'|'
+		public Keyword getVerticalLineKeyword_1_3_0() { return cVerticalLineKeyword_1_3_0; }
+		
+		//operand+=BitwiseXorExpression
+		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
+		
+		//BitwiseXorExpression
+		public RuleCall getOperandBitwiseXorExpressionParserRuleCall_1_3_1_0() { return cOperandBitwiseXorExpressionParserRuleCall_1_3_1_0; }
+	}
+	public class BitwiseXorExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BitwiseXorExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cBitwiseAndExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cBitwiseAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Keyword cOperatorCircumflexAccentKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandBitwiseAndExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Keyword cCircumflexAccentKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cOperandBitwiseAndExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
+		
+		//BitwiseXorExpression fmlExpr::Expression:
+		//	BitwiseAndExpression ({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='^'
+		//	operand+=BitwiseAndExpression ('^' operand+=BitwiseAndExpression)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//BitwiseAndExpression ({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='^'
+		//operand+=BitwiseAndExpression ('^' operand+=BitwiseAndExpression)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//BitwiseAndExpression
+		public RuleCall getBitwiseAndExpressionParserRuleCall_0() { return cBitwiseAndExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='^' operand+=BitwiseAndExpression ('^'
+		//operand+=BitwiseAndExpression)*)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::BitwiseAssociativeExpression.operand+=current}
+		public Action getBitwiseAssociativeExpressionOperandAction_1_0() { return cBitwiseAssociativeExpressionOperandAction_1_0; }
+		
+		//operator='^'
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//'^'
+		public Keyword getOperatorCircumflexAccentKeyword_1_1_0() { return cOperatorCircumflexAccentKeyword_1_1_0; }
+		
+		//operand+=BitwiseAndExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//BitwiseAndExpression
+		public RuleCall getOperandBitwiseAndExpressionParserRuleCall_1_2_0() { return cOperandBitwiseAndExpressionParserRuleCall_1_2_0; }
+		
+		//('^' operand+=BitwiseAndExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//'^'
+		public Keyword getCircumflexAccentKeyword_1_3_0() { return cCircumflexAccentKeyword_1_3_0; }
+		
+		//operand+=BitwiseAndExpression
+		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
+		
+		//BitwiseAndExpression
+		public RuleCall getOperandBitwiseAndExpressionParserRuleCall_1_3_1_0() { return cOperandBitwiseAndExpressionParserRuleCall_1_3_1_0; }
+	}
+	public class BitwiseAndExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BitwiseAndExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cEqualityExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cBitwiseAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final Keyword cOperatorAmpersandKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cOperandEqualityExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Keyword cAmpersandKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cOperandEqualityExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
+		
+		//BitwiseAndExpression fmlExpr::Expression:
+		//	EqualityExpression ({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='&' operand+=EqualityExpression
+		//	('&' operand+=EqualityExpression)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//EqualityExpression ({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='&' operand+=EqualityExpression
+		//('&' operand+=EqualityExpression)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//EqualityExpression
+		public RuleCall getEqualityExpressionParserRuleCall_0() { return cEqualityExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='&' operand+=EqualityExpression ('&'
+		//operand+=EqualityExpression)*)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::BitwiseAssociativeExpression.operand+=current}
+		public Action getBitwiseAssociativeExpressionOperandAction_1_0() { return cBitwiseAssociativeExpressionOperandAction_1_0; }
+		
+		//operator='&'
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//'&'
+		public Keyword getOperatorAmpersandKeyword_1_1_0() { return cOperatorAmpersandKeyword_1_1_0; }
+		
+		//operand+=EqualityExpression
+		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
+		
+		//EqualityExpression
+		public RuleCall getOperandEqualityExpressionParserRuleCall_1_2_0() { return cOperandEqualityExpressionParserRuleCall_1_2_0; }
+		
+		//('&' operand+=EqualityExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//'&'
+		public Keyword getAmpersandKeyword_1_3_0() { return cAmpersandKeyword_1_3_0; }
+		
+		//operand+=EqualityExpression
+		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
+		
+		//EqualityExpression
+		public RuleCall getOperandEqualityExpressionParserRuleCall_1_3_1_0() { return cOperandEqualityExpressionParserRuleCall_1_3_1_0; }
+	}
+	public class EqualityExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EqualityExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cRelationalExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cEqualityBinaryExpressionLeftOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cOperatorEqualityOperatorParserRuleCall_1_1_0 = (RuleCall)cOperatorAssignment_1_1.eContents().get(0);
+		private final Assignment cRigthOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cRigthOperandRelationalExpressionParserRuleCall_1_2_0 = (RuleCall)cRigthOperandAssignment_1_2.eContents().get(0);
+		
+		//// Equality Expression
+		//EqualityExpression fmlExpr::Expression:
+		//	RelationalExpression ({fmlExpr::EqualityBinaryExpression.leftOperand=current} operator=EqualityOperator
+		//	rigthOperand=RelationalExpression)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//RelationalExpression ({fmlExpr::EqualityBinaryExpression.leftOperand=current} operator=EqualityOperator
+		//rigthOperand=RelationalExpression)?
+		public Group getGroup() { return cGroup; }
+		
+		//RelationalExpression
+		public RuleCall getRelationalExpressionParserRuleCall_0() { return cRelationalExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::EqualityBinaryExpression.leftOperand=current} operator=EqualityOperator rigthOperand=RelationalExpression)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::EqualityBinaryExpression.leftOperand=current}
+		public Action getEqualityBinaryExpressionLeftOperandAction_1_0() { return cEqualityBinaryExpressionLeftOperandAction_1_0; }
+		
+		//operator=EqualityOperator
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//EqualityOperator
+		public RuleCall getOperatorEqualityOperatorParserRuleCall_1_1_0() { return cOperatorEqualityOperatorParserRuleCall_1_1_0; }
+		
+		//rigthOperand=RelationalExpression
+		public Assignment getRigthOperandAssignment_1_2() { return cRigthOperandAssignment_1_2; }
+		
+		//RelationalExpression
+		public RuleCall getRigthOperandRelationalExpressionParserRuleCall_1_2_0() { return cRigthOperandRelationalExpressionParserRuleCall_1_2_0; }
+	}
+	public class EqualityOperatorElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EqualityOperator");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cEqualsSignEqualsSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cExclamationMarkEqualsSignKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		private final Keyword cEqualsSignEqualsSignEqualsSignKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
+		private final Keyword cEqualsSignExclamationMarkEqualsSignKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
+		private final Keyword cEqualsSignSolidusEqualsSignKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
+		
+		//EqualityOperator:
+		//	'==' | '!=' | '===' | '=!=' | '=/=';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'==' | '!=' | '===' | '=!=' | '=/='
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'=='
+		public Keyword getEqualsSignEqualsSignKeyword_0() { return cEqualsSignEqualsSignKeyword_0; }
+		
+		//'!='
+		public Keyword getExclamationMarkEqualsSignKeyword_1() { return cExclamationMarkEqualsSignKeyword_1; }
+		
+		//'==='
+		public Keyword getEqualsSignEqualsSignEqualsSignKeyword_2() { return cEqualsSignEqualsSignEqualsSignKeyword_2; }
+		
+		//'=!='
+		public Keyword getEqualsSignExclamationMarkEqualsSignKeyword_3() { return cEqualsSignExclamationMarkEqualsSignKeyword_3; }
+		
+		//'=/='
+		public Keyword getEqualsSignSolidusEqualsSignKeyword_4() { return cEqualsSignSolidusEqualsSignKeyword_4; }
+	}
+	public class RelationalExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.RelationalExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cAdditiveExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cRelationalBinaryExpressionLeftOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cOperatorRelationalOperatorParserRuleCall_1_1_0 = (RuleCall)cOperatorAssignment_1_1.eContents().get(0);
+		private final Assignment cRigthOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cRigthOperandAdditiveExpressionParserRuleCall_1_2_0 = (RuleCall)cRigthOperandAssignment_1_2.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Action cRelationalTernaryExpressionLeftRelationAction_1_3_0 = (Action)cGroup_1_3.eContents().get(0);
+		private final Assignment cRigthOperatorAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0 = (RuleCall)cRigthOperatorAssignment_1_3_1.eContents().get(0);
+		private final Assignment cRigthOperandAssignment_1_3_2 = (Assignment)cGroup_1_3.eContents().get(2);
+		private final RuleCall cRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0 = (RuleCall)cRigthOperandAssignment_1_3_2.eContents().get(0);
+		
+		//// Relational Binary Expression
+		//RelationalExpression fmlExpr::Expression:
+		//	AdditiveExpression ({fmlExpr::RelationalBinaryExpression.leftOperand=current} operator=RelationalOperator
+		//	rigthOperand=AdditiveExpression ({fmlExpr::RelationalTernaryExpression.leftRelation=current}
+		//	rigthOperator=RelationalOperator rigthOperand=AdditiveExpression)?)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//AdditiveExpression ({fmlExpr::RelationalBinaryExpression.leftOperand=current} operator=RelationalOperator
+		//rigthOperand=AdditiveExpression ({fmlExpr::RelationalTernaryExpression.leftRelation=current}
+		//rigthOperator=RelationalOperator rigthOperand=AdditiveExpression)?)?
+		public Group getGroup() { return cGroup; }
+		
+		//AdditiveExpression
+		public RuleCall getAdditiveExpressionParserRuleCall_0() { return cAdditiveExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::RelationalBinaryExpression.leftOperand=current} operator=RelationalOperator rigthOperand=AdditiveExpression
+		//({fmlExpr::RelationalTernaryExpression.leftRelation=current} rigthOperator=RelationalOperator
+		//rigthOperand=AdditiveExpression)?)?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::RelationalBinaryExpression.leftOperand=current}
+		public Action getRelationalBinaryExpressionLeftOperandAction_1_0() { return cRelationalBinaryExpressionLeftOperandAction_1_0; }
+		
+		//operator=RelationalOperator
+		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
+		
+		//RelationalOperator
+		public RuleCall getOperatorRelationalOperatorParserRuleCall_1_1_0() { return cOperatorRelationalOperatorParserRuleCall_1_1_0; }
+		
+		//rigthOperand=AdditiveExpression
+		public Assignment getRigthOperandAssignment_1_2() { return cRigthOperandAssignment_1_2; }
+		
+		//AdditiveExpression
+		public RuleCall getRigthOperandAdditiveExpressionParserRuleCall_1_2_0() { return cRigthOperandAdditiveExpressionParserRuleCall_1_2_0; }
+		
+		//({fmlExpr::RelationalTernaryExpression.leftRelation=current} rigthOperator=RelationalOperator
+		//rigthOperand=AdditiveExpression)?
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//{fmlExpr::RelationalTernaryExpression.leftRelation=current}
+		public Action getRelationalTernaryExpressionLeftRelationAction_1_3_0() { return cRelationalTernaryExpressionLeftRelationAction_1_3_0; }
+		
+		//rigthOperator=RelationalOperator
+		public Assignment getRigthOperatorAssignment_1_3_1() { return cRigthOperatorAssignment_1_3_1; }
+		
+		//RelationalOperator
+		public RuleCall getRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0() { return cRigthOperatorRelationalOperatorParserRuleCall_1_3_1_0; }
+		
+		//rigthOperand=AdditiveExpression
+		public Assignment getRigthOperandAssignment_1_3_2() { return cRigthOperandAssignment_1_3_2; }
+		
+		//AdditiveExpression
+		public RuleCall getRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0() { return cRigthOperandAdditiveExpressionParserRuleCall_1_3_2_0; }
+	}
+	public class RelationalOperatorElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.RelationalOperator");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		private final Keyword cLessThanSignEqualsSignKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
+		private final Keyword cGreaterThanSignEqualsSignKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
+		
+		//RelationalOperator:
+		//	'<' | '>' | '<=' | '>=';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'<' | '>' | '<=' | '>='
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_0() { return cLessThanSignKeyword_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_1() { return cGreaterThanSignKeyword_1; }
+		
+		//'<='
+		public Keyword getLessThanSignEqualsSignKeyword_2() { return cLessThanSignEqualsSignKeyword_2; }
+		
+		//'>='
+		public Keyword getGreaterThanSignEqualsSignKeyword_3() { return cGreaterThanSignEqualsSignKeyword_3; }
+	}
+	public class AdditiveExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AdditiveExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cMultiplicativeExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+		private final Action cArithmeticAssociativeExpressionOperandAction_1_0_0 = (Action)cGroup_1_0.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
+		private final Keyword cOperatorPlusSignKeyword_1_0_1_0 = (Keyword)cOperatorAssignment_1_0_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_0_2 = (Assignment)cGroup_1_0.eContents().get(2);
+		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_0_2_0 = (RuleCall)cOperandAssignment_1_0_2.eContents().get(0);
+		private final Group cGroup_1_0_3 = (Group)cGroup_1_0.eContents().get(3);
+		private final Keyword cPlusSignKeyword_1_0_3_0 = (Keyword)cGroup_1_0_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_0_3_1 = (Assignment)cGroup_1_0_3.eContents().get(1);
+		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0 = (RuleCall)cOperandAssignment_1_0_3_1.eContents().get(0);
+		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+		private final Action cArithmeticAssociativeExpressionOperandAction_1_1_0 = (Action)cGroup_1_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
+		private final Keyword cOperatorHyphenMinusKeyword_1_1_1_0 = (Keyword)cOperatorAssignment_1_1_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
+		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_1_2_0 = (RuleCall)cOperandAssignment_1_1_2.eContents().get(0);
+		private final Group cGroup_1_1_3 = (Group)cGroup_1_1.eContents().get(3);
+		private final Keyword cHyphenMinusKeyword_1_1_3_0 = (Keyword)cGroup_1_1_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_1_3_1 = (Assignment)cGroup_1_1_3.eContents().get(1);
+		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0 = (RuleCall)cOperandAssignment_1_1_3_1.eContents().get(0);
+		
+		//// Arithmetic Associative (left) Expression
+		//AdditiveExpression fmlExpr::Expression:
+		//	MultiplicativeExpression ({fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='+'
+		//	operand+=MultiplicativeExpression ('+' operand+=MultiplicativeExpression)* |
+		//	{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='-' operand+=MultiplicativeExpression ('-'
+		//	operand+=MultiplicativeExpression)*)*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//MultiplicativeExpression ({fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='+'
+		//operand+=MultiplicativeExpression ('+' operand+=MultiplicativeExpression)* |
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='-' operand+=MultiplicativeExpression ('-'
+		//operand+=MultiplicativeExpression)*)*
+		public Group getGroup() { return cGroup; }
+		
+		//MultiplicativeExpression
+		public RuleCall getMultiplicativeExpressionParserRuleCall_0() { return cMultiplicativeExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='+' operand+=MultiplicativeExpression ('+'
+		//operand+=MultiplicativeExpression)* | {fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='-'
+		//operand+=MultiplicativeExpression ('-' operand+=MultiplicativeExpression)*)*
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='+' operand+=MultiplicativeExpression ('+'
+		//operand+=MultiplicativeExpression)*
+		public Group getGroup_1_0() { return cGroup_1_0; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+		public Action getArithmeticAssociativeExpressionOperandAction_1_0_0() { return cArithmeticAssociativeExpressionOperandAction_1_0_0; }
+		
+		//operator='+'
+		public Assignment getOperatorAssignment_1_0_1() { return cOperatorAssignment_1_0_1; }
+		
+		//'+'
+		public Keyword getOperatorPlusSignKeyword_1_0_1_0() { return cOperatorPlusSignKeyword_1_0_1_0; }
+		
+		//operand+=MultiplicativeExpression
+		public Assignment getOperandAssignment_1_0_2() { return cOperandAssignment_1_0_2; }
+		
+		//MultiplicativeExpression
+		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_0_2_0; }
+		
+		//('+' operand+=MultiplicativeExpression)*
+		public Group getGroup_1_0_3() { return cGroup_1_0_3; }
+		
+		//'+'
+		public Keyword getPlusSignKeyword_1_0_3_0() { return cPlusSignKeyword_1_0_3_0; }
+		
+		//operand+=MultiplicativeExpression
+		public Assignment getOperandAssignment_1_0_3_1() { return cOperandAssignment_1_0_3_1; }
+		
+		//MultiplicativeExpression
+		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='-' operand+=MultiplicativeExpression ('-'
+		//operand+=MultiplicativeExpression)*
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+		public Action getArithmeticAssociativeExpressionOperandAction_1_1_0() { return cArithmeticAssociativeExpressionOperandAction_1_1_0; }
+		
+		//operator='-'
+		public Assignment getOperatorAssignment_1_1_1() { return cOperatorAssignment_1_1_1; }
+		
+		//'-'
+		public Keyword getOperatorHyphenMinusKeyword_1_1_1_0() { return cOperatorHyphenMinusKeyword_1_1_1_0; }
+		
+		//operand+=MultiplicativeExpression
+		public Assignment getOperandAssignment_1_1_2() { return cOperandAssignment_1_1_2; }
+		
+		//MultiplicativeExpression
+		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_1_2_0; }
+		
+		//('-' operand+=MultiplicativeExpression)*
+		public Group getGroup_1_1_3() { return cGroup_1_1_3; }
+		
+		//'-'
+		public Keyword getHyphenMinusKeyword_1_1_3_0() { return cHyphenMinusKeyword_1_1_3_0; }
+		
+		//operand+=MultiplicativeExpression
+		public Assignment getOperandAssignment_1_1_3_1() { return cOperandAssignment_1_1_3_1; }
+		
+		//MultiplicativeExpression
+		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0; }
+	}
+	public class MultiplicativeExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cUnaryExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+		private final Action cArithmeticAssociativeExpressionOperandAction_1_0_0 = (Action)cGroup_1_0.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
+		private final Keyword cOperatorAsteriskKeyword_1_0_1_0 = (Keyword)cOperatorAssignment_1_0_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_0_2 = (Assignment)cGroup_1_0.eContents().get(2);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0_2_0 = (RuleCall)cOperandAssignment_1_0_2.eContents().get(0);
+		private final Group cGroup_1_0_3 = (Group)cGroup_1_0.eContents().get(3);
+		private final Keyword cAsteriskKeyword_1_0_3_0 = (Keyword)cGroup_1_0_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_0_3_1 = (Assignment)cGroup_1_0_3.eContents().get(1);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0_3_1_0 = (RuleCall)cOperandAssignment_1_0_3_1.eContents().get(0);
+		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+		private final Action cArithmeticAssociativeExpressionOperandAction_1_1_0 = (Action)cGroup_1_1.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
+		private final Keyword cOperatorAsteriskAsteriskKeyword_1_1_1_0 = (Keyword)cOperatorAssignment_1_1_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_1_2_0 = (RuleCall)cOperandAssignment_1_1_2.eContents().get(0);
+		private final Group cGroup_1_1_3 = (Group)cGroup_1_1.eContents().get(3);
+		private final Keyword cAsteriskAsteriskKeyword_1_1_3_0 = (Keyword)cGroup_1_1_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_1_3_1 = (Assignment)cGroup_1_1_3.eContents().get(1);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_1_3_1_0 = (RuleCall)cOperandAssignment_1_1_3_1.eContents().get(0);
+		private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
+		private final Action cArithmeticAssociativeExpressionOperandAction_1_2_0 = (Action)cGroup_1_2.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
+		private final Keyword cOperatorSolidusKeyword_1_2_1_0 = (Keyword)cOperatorAssignment_1_2_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_2_2 = (Assignment)cGroup_1_2.eContents().get(2);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_2_2_0 = (RuleCall)cOperandAssignment_1_2_2.eContents().get(0);
+		private final Group cGroup_1_2_3 = (Group)cGroup_1_2.eContents().get(3);
+		private final Keyword cSolidusKeyword_1_2_3_0 = (Keyword)cGroup_1_2_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_2_3_1 = (Assignment)cGroup_1_2_3.eContents().get(1);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_2_3_1_0 = (RuleCall)cOperandAssignment_1_2_3_1.eContents().get(0);
+		private final Group cGroup_1_3 = (Group)cAlternatives_1.eContents().get(3);
+		private final Action cArithmeticAssociativeExpressionOperandAction_1_3_0 = (Action)cGroup_1_3.eContents().get(0);
+		private final Assignment cOperatorAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final Keyword cOperatorPercentSignKeyword_1_3_1_0 = (Keyword)cOperatorAssignment_1_3_1.eContents().get(0);
+		private final Assignment cOperandAssignment_1_3_2 = (Assignment)cGroup_1_3.eContents().get(2);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_3_2_0 = (RuleCall)cOperandAssignment_1_3_2.eContents().get(0);
+		private final Group cGroup_1_3_3 = (Group)cGroup_1_3.eContents().get(3);
+		private final Keyword cPercentSignKeyword_1_3_3_0 = (Keyword)cGroup_1_3_3.eContents().get(0);
+		private final Assignment cOperandAssignment_1_3_3_1 = (Assignment)cGroup_1_3_3.eContents().get(1);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_3_3_1_0 = (RuleCall)cOperandAssignment_1_3_3_1.eContents().get(0);
+		
+		//MultiplicativeExpression fmlExpr::Expression:
+		//	UnaryExpression ({fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='*' operand+=UnaryExpression
+		//	('*' operand+=UnaryExpression)* | {fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='**'
+		//	operand+=UnaryExpression ('**' operand+=UnaryExpression)* |
+		//	{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='/' operand+=UnaryExpression ('/'
+		//	operand+=UnaryExpression)* | {fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='%'
+		//	operand+=UnaryExpression ('%' operand+=UnaryExpression)*)*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//UnaryExpression ({fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='*' operand+=UnaryExpression ('*'
+		//operand+=UnaryExpression)* | {fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='**'
+		//operand+=UnaryExpression ('**' operand+=UnaryExpression)* | {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+		//operator='/' operand+=UnaryExpression ('/' operand+=UnaryExpression)* |
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='%' operand+=UnaryExpression ('%'
+		//operand+=UnaryExpression)*)*
+		public Group getGroup() { return cGroup; }
+		
+		//UnaryExpression
+		public RuleCall getUnaryExpressionParserRuleCall_0() { return cUnaryExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='*' operand+=UnaryExpression ('*'
+		//operand+=UnaryExpression)* | {fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='**'
+		//operand+=UnaryExpression ('**' operand+=UnaryExpression)* | {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+		//operator='/' operand+=UnaryExpression ('/' operand+=UnaryExpression)* |
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='%' operand+=UnaryExpression ('%'
+		//operand+=UnaryExpression)*)*
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='*' operand+=UnaryExpression ('*'
+		//operand+=UnaryExpression)*
+		public Group getGroup_1_0() { return cGroup_1_0; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+		public Action getArithmeticAssociativeExpressionOperandAction_1_0_0() { return cArithmeticAssociativeExpressionOperandAction_1_0_0; }
+		
+		//operator='*'
+		public Assignment getOperatorAssignment_1_0_1() { return cOperatorAssignment_1_0_1; }
+		
+		//'*'
+		public Keyword getOperatorAsteriskKeyword_1_0_1_0() { return cOperatorAsteriskKeyword_1_0_1_0; }
+		
+		//operand+=UnaryExpression
+		public Assignment getOperandAssignment_1_0_2() { return cOperandAssignment_1_0_2; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0_2_0() { return cOperandUnaryExpressionParserRuleCall_1_0_2_0; }
+		
+		//('*' operand+=UnaryExpression)*
+		public Group getGroup_1_0_3() { return cGroup_1_0_3; }
+		
+		//'*'
+		public Keyword getAsteriskKeyword_1_0_3_0() { return cAsteriskKeyword_1_0_3_0; }
+		
+		//operand+=UnaryExpression
+		public Assignment getOperandAssignment_1_0_3_1() { return cOperandAssignment_1_0_3_1; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0_3_1_0() { return cOperandUnaryExpressionParserRuleCall_1_0_3_1_0; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='**' operand+=UnaryExpression ('**'
+		//operand+=UnaryExpression)*
+		public Group getGroup_1_1() { return cGroup_1_1; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+		public Action getArithmeticAssociativeExpressionOperandAction_1_1_0() { return cArithmeticAssociativeExpressionOperandAction_1_1_0; }
+		
+		//operator='**'
+		public Assignment getOperatorAssignment_1_1_1() { return cOperatorAssignment_1_1_1; }
+		
+		//'**'
+		public Keyword getOperatorAsteriskAsteriskKeyword_1_1_1_0() { return cOperatorAsteriskAsteriskKeyword_1_1_1_0; }
+		
+		//operand+=UnaryExpression
+		public Assignment getOperandAssignment_1_1_2() { return cOperandAssignment_1_1_2; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_1_2_0() { return cOperandUnaryExpressionParserRuleCall_1_1_2_0; }
+		
+		//('**' operand+=UnaryExpression)*
+		public Group getGroup_1_1_3() { return cGroup_1_1_3; }
+		
+		//'**'
+		public Keyword getAsteriskAsteriskKeyword_1_1_3_0() { return cAsteriskAsteriskKeyword_1_1_3_0; }
+		
+		//operand+=UnaryExpression
+		public Assignment getOperandAssignment_1_1_3_1() { return cOperandAssignment_1_1_3_1; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_1_3_1_0() { return cOperandUnaryExpressionParserRuleCall_1_1_3_1_0; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='/' operand+=UnaryExpression ('/'
+		//operand+=UnaryExpression)*
+		public Group getGroup_1_2() { return cGroup_1_2; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+		public Action getArithmeticAssociativeExpressionOperandAction_1_2_0() { return cArithmeticAssociativeExpressionOperandAction_1_2_0; }
+		
+		//operator='/'
+		public Assignment getOperatorAssignment_1_2_1() { return cOperatorAssignment_1_2_1; }
+		
+		//'/'
+		public Keyword getOperatorSolidusKeyword_1_2_1_0() { return cOperatorSolidusKeyword_1_2_1_0; }
+		
+		//operand+=UnaryExpression
+		public Assignment getOperandAssignment_1_2_2() { return cOperandAssignment_1_2_2; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_2_2_0() { return cOperandUnaryExpressionParserRuleCall_1_2_2_0; }
+		
+		//('/' operand+=UnaryExpression)*
+		public Group getGroup_1_2_3() { return cGroup_1_2_3; }
+		
+		//'/'
+		public Keyword getSolidusKeyword_1_2_3_0() { return cSolidusKeyword_1_2_3_0; }
+		
+		//operand+=UnaryExpression
+		public Assignment getOperandAssignment_1_2_3_1() { return cOperandAssignment_1_2_3_1; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_2_3_1_0() { return cOperandUnaryExpressionParserRuleCall_1_2_3_1_0; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='%' operand+=UnaryExpression ('%'
+		//operand+=UnaryExpression)*
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+		public Action getArithmeticAssociativeExpressionOperandAction_1_3_0() { return cArithmeticAssociativeExpressionOperandAction_1_3_0; }
+		
+		//operator='%'
+		public Assignment getOperatorAssignment_1_3_1() { return cOperatorAssignment_1_3_1; }
+		
+		//'%'
+		public Keyword getOperatorPercentSignKeyword_1_3_1_0() { return cOperatorPercentSignKeyword_1_3_1_0; }
+		
+		//operand+=UnaryExpression
+		public Assignment getOperandAssignment_1_3_2() { return cOperandAssignment_1_3_2; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_3_2_0() { return cOperandUnaryExpressionParserRuleCall_1_3_2_0; }
+		
+		//('%' operand+=UnaryExpression)*
+		public Group getGroup_1_3_3() { return cGroup_1_3_3; }
+		
+		//'%'
+		public Keyword getPercentSignKeyword_1_3_3_0() { return cPercentSignKeyword_1_3_3_0; }
+		
+		//operand+=UnaryExpression
+		public Assignment getOperandAssignment_1_3_3_1() { return cOperandAssignment_1_3_3_1; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_3_3_1_0() { return cOperandUnaryExpressionParserRuleCall_1_3_3_1_0; }
+	}
+	public class UnaryExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralTerminalExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cArithmeticUnaryExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cLogicalUnaryExpressionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cBitwiseUnaryExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cNewfreshExpressionParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cCastExpressionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cPrefixUnaryExpressionParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		private final RuleCall cPostfixUnaryExpressionParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		private final RuleCall cPrimaryExpressionParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
+		
+		//// Unary Expression
+		//UnaryExpression fmlExpr::Expression:
+		//	LiteralTerminalExpression
+		//	| ArithmeticUnaryExpression
+		//	| LogicalUnaryExpression
+		//	| BitwiseUnaryExpression
+		//	| NewfreshExpression
+		//	| CastExpression
+		//	| PrefixUnaryExpression
+		//	| PostfixUnaryExpression
+		//	| PrimaryExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralTerminalExpression | ArithmeticUnaryExpression | LogicalUnaryExpression | BitwiseUnaryExpression |
+		//NewfreshExpression | CastExpression | PrefixUnaryExpression | PostfixUnaryExpression | PrimaryExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralTerminalExpression
+		public RuleCall getLiteralTerminalExpressionParserRuleCall_0() { return cLiteralTerminalExpressionParserRuleCall_0; }
+		
+		//ArithmeticUnaryExpression
+		public RuleCall getArithmeticUnaryExpressionParserRuleCall_1() { return cArithmeticUnaryExpressionParserRuleCall_1; }
+		
+		//LogicalUnaryExpression
+		public RuleCall getLogicalUnaryExpressionParserRuleCall_2() { return cLogicalUnaryExpressionParserRuleCall_2; }
+		
+		//BitwiseUnaryExpression
+		public RuleCall getBitwiseUnaryExpressionParserRuleCall_3() { return cBitwiseUnaryExpressionParserRuleCall_3; }
+		
+		//NewfreshExpression
+		public RuleCall getNewfreshExpressionParserRuleCall_4() { return cNewfreshExpressionParserRuleCall_4; }
+		
+		//CastExpression
+		public RuleCall getCastExpressionParserRuleCall_5() { return cCastExpressionParserRuleCall_5; }
+		
+		//PrefixUnaryExpression
+		public RuleCall getPrefixUnaryExpressionParserRuleCall_6() { return cPrefixUnaryExpressionParserRuleCall_6; }
+		
+		//PostfixUnaryExpression
+		public RuleCall getPostfixUnaryExpressionParserRuleCall_7() { return cPostfixUnaryExpressionParserRuleCall_7; }
+		
+		//PrimaryExpression
+		public RuleCall getPrimaryExpressionParserRuleCall_8() { return cPrimaryExpressionParserRuleCall_8; }
+	}
+	public class PostfixUnaryExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PostfixUnaryExpression");
+		private final RuleCall cIncrementOrDecrementPostfixExpressionParserRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//// Postfix Increment or Decrement Expression
+		//PostfixUnaryExpression fmlExpr::Expression:
+		//	IncrementOrDecrementPostfixExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//IncrementOrDecrementPostfixExpression
+		public RuleCall getIncrementOrDecrementPostfixExpressionParserRuleCall() { return cIncrementOrDecrementPostfixExpressionParserRuleCall; }
+	}
+	public class IncrementOrDecrementPostfixExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPostfixExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cLeftHandSideAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_0_0 = (RuleCall)cLeftHandSideAssignment_0.eContents().get(0);
+		private final Assignment cOperatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cOperatorAffixOperatorParserRuleCall_1_0 = (RuleCall)cOperatorAssignment_1.eContents().get(0);
+		
+		//IncrementOrDecrementPostfixExpression fmlExpr::IncrementOrDecrementPostfixExpression:
+		//	leftHandSide=LeftHandSideExpression operator=AffixOperator
+		@Override public ParserRule getRule() { return rule; }
+		
+		//leftHandSide=LeftHandSideExpression operator=AffixOperator
+		public Group getGroup() { return cGroup; }
+		
+		//leftHandSide=LeftHandSideExpression
+		public Assignment getLeftHandSideAssignment_0() { return cLeftHandSideAssignment_0; }
+		
+		//LeftHandSideExpression
+		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_0_0; }
+		
+		//operator=AffixOperator
+		public Assignment getOperatorAssignment_1() { return cOperatorAssignment_1; }
+		
+		//AffixOperator
+		public RuleCall getOperatorAffixOperatorParserRuleCall_1_0() { return cOperatorAffixOperatorParserRuleCall_1_0; }
+	}
+	public class PrefixUnaryExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrefixUnaryExpression");
+		private final RuleCall cIncrementOrDecrementPrefixExpressionParserRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//// Prefix Increment or Decrement Expression
+		//PrefixUnaryExpression fmlExpr::Expression:
+		//	IncrementOrDecrementPrefixExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//IncrementOrDecrementPrefixExpression
+		public RuleCall getIncrementOrDecrementPrefixExpressionParserRuleCall() { return cIncrementOrDecrementPrefixExpressionParserRuleCall; }
+	}
+	public class IncrementOrDecrementPrefixExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPrefixExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cOperatorAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cOperatorAffixOperatorParserRuleCall_0_0 = (RuleCall)cOperatorAssignment_0.eContents().get(0);
+		private final Assignment cLeftHandSideAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_1_0 = (RuleCall)cLeftHandSideAssignment_1.eContents().get(0);
+		
+		//IncrementOrDecrementPrefixExpression fmlExpr::IncrementOrDecrementPrefixExpression:
+		//	operator=AffixOperator leftHandSide=LeftHandSideExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//operator=AffixOperator leftHandSide=LeftHandSideExpression
+		public Group getGroup() { return cGroup; }
+		
+		//operator=AffixOperator
+		public Assignment getOperatorAssignment_0() { return cOperatorAssignment_0; }
+		
+		//AffixOperator
+		public RuleCall getOperatorAffixOperatorParserRuleCall_0_0() { return cOperatorAffixOperatorParserRuleCall_0_0; }
+		
+		//leftHandSide=LeftHandSideExpression
+		public Assignment getLeftHandSideAssignment_1() { return cLeftHandSideAssignment_1; }
+		
+		//LeftHandSideExpression
+		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_1_0; }
+	}
+	public class AffixOperatorElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AffixOperator");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cPlusSignPlusSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cHyphenMinusHyphenMinusKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		
+		//AffixOperator:
+		//	'++' | '--';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'++' | '--'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'++'
+		public Keyword getPlusSignPlusSignKeyword_0() { return cPlusSignPlusSignKeyword_0; }
+		
+		//'--'
+		public Keyword getHyphenMinusHyphenMinusKeyword_1() { return cHyphenMinusHyphenMinusKeyword_1; }
+	}
+	public class NewfreshExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.NewfreshExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Keyword cNewfreshKeyword_0_0 = (Keyword)cGroup_0.eContents().get(0);
+		private final Assignment cLeftHandSideAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
+		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0 = (RuleCall)cLeftHandSideAssignment_0_1.eContents().get(0);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Keyword cLeftParenthesisColonKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cLeftHandSideAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0 = (RuleCall)cLeftHandSideAssignment_1_1.eContents().get(0);
+		private final Keyword cNewfreshKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
+		private final Keyword cRightParenthesisKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
+		
+		//// Newfresh Unary Expression
+		//NewfreshExpression fmlExpr::NewfreshExpression:
+		//	'newfresh' leftHandSide=LeftHandSideExpression
+		//	| '(:' leftHandSide=LeftHandSideExpression 'newfresh' ')'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'newfresh' leftHandSide=LeftHandSideExpression | '(:' leftHandSide=LeftHandSideExpression 'newfresh' ')'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'newfresh' leftHandSide=LeftHandSideExpression
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//'newfresh'
+		public Keyword getNewfreshKeyword_0_0() { return cNewfreshKeyword_0_0; }
+		
+		//leftHandSide=LeftHandSideExpression
+		public Assignment getLeftHandSideAssignment_0_1() { return cLeftHandSideAssignment_0_1; }
+		
+		//LeftHandSideExpression
+		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0; }
+		
+		//'(:' leftHandSide=LeftHandSideExpression 'newfresh' ')'
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'(:'
+		public Keyword getLeftParenthesisColonKeyword_1_0() { return cLeftParenthesisColonKeyword_1_0; }
+		
+		//leftHandSide=LeftHandSideExpression
+		public Assignment getLeftHandSideAssignment_1_1() { return cLeftHandSideAssignment_1_1; }
+		
+		//LeftHandSideExpression
+		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0; }
+		
+		//'newfresh'
+		public Keyword getNewfreshKeyword_1_2() { return cNewfreshKeyword_1_2; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_3() { return cRightParenthesisKeyword_1_3; }
+	}
+	public class CastExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CastExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cCtorKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cDatatypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cDatatypeDataTypeCrossReference_2_0 = (CrossReference)cDatatypeAssignment_2.eContents().get(0);
+		private final RuleCall cDatatypeDataTypeESUfidParserRuleCall_2_0_1 = (RuleCall)cDatatypeDataTypeCrossReference_2_0.eContents().get(1);
+		private final Keyword cGreaterThanSignKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Keyword cLeftParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cOperandAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cOperandExpressionParserRuleCall_5_0 = (RuleCall)cOperandAssignment_5.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		
+		//// Cast Expression
+		//CastExpression fmlExpr::CastExpression:
+		//	'ctor' '<' datatype=[fmlType::DataType|ESUfid] '>'
+		//	'(' operand=Expression ')'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'ctor' '<' datatype=[fmlType::DataType|ESUfid] '>' '(' operand=Expression ')'
+		public Group getGroup() { return cGroup; }
+		
+		//'ctor'
+		public Keyword getCtorKeyword_0() { return cCtorKeyword_0; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
+		
+		//datatype=[fmlType::DataType|ESUfid]
+		public Assignment getDatatypeAssignment_2() { return cDatatypeAssignment_2; }
+		
+		//[fmlType::DataType|ESUfid]
+		public CrossReference getDatatypeDataTypeCrossReference_2_0() { return cDatatypeDataTypeCrossReference_2_0; }
+		
+		//ESUfid
+		public RuleCall getDatatypeDataTypeESUfidParserRuleCall_2_0_1() { return cDatatypeDataTypeESUfidParserRuleCall_2_0_1; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_3() { return cGreaterThanSignKeyword_3; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_4() { return cLeftParenthesisKeyword_4; }
+		
+		//operand=Expression
+		public Assignment getOperandAssignment_5() { return cOperandAssignment_5; }
+		
+		//Expression
+		public RuleCall getOperandExpressionParserRuleCall_5_0() { return cOperandExpressionParserRuleCall_5_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_6() { return cRightParenthesisKeyword_6; }
+	}
+	public class ArithmeticUnaryExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ArithmeticUnaryExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cOperatorAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cOperatorArithmeticUnaryOperatorParserRuleCall_0_0 = (RuleCall)cOperatorAssignment_0.eContents().get(0);
+		private final Assignment cOperandAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0 = (RuleCall)cOperandAssignment_1.eContents().get(0);
+		
+		//// Arithmetic Unary Expression
+		//ArithmeticUnaryExpression fmlExpr::ArithmeticUnaryExpression:
+		//	operator=ArithmeticUnaryOperator operand=UnaryExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//operator=ArithmeticUnaryOperator operand=UnaryExpression
+		public Group getGroup() { return cGroup; }
+		
+		//operator=ArithmeticUnaryOperator
+		public Assignment getOperatorAssignment_0() { return cOperatorAssignment_0; }
+		
+		//ArithmeticUnaryOperator
+		public RuleCall getOperatorArithmeticUnaryOperatorParserRuleCall_0_0() { return cOperatorArithmeticUnaryOperatorParserRuleCall_0_0; }
+		
+		//operand=UnaryExpression
+		public Assignment getOperandAssignment_1() { return cOperandAssignment_1; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0() { return cOperandUnaryExpressionParserRuleCall_1_0; }
+	}
+	public class ArithmeticUnaryOperatorElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ArithmeticUnaryOperator");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Keyword cPlusSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
+		private final Keyword cHyphenMinusKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
+		
+		//ArithmeticUnaryOperator:
+		//	'+' | '-';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'+' | '-'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//'+'
+		public Keyword getPlusSignKeyword_0() { return cPlusSignKeyword_0; }
+		
+		//'-'
+		public Keyword getHyphenMinusKeyword_1() { return cHyphenMinusKeyword_1; }
+	}
+	public class LogicalUnaryExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LogicalUnaryExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cOperatorAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final Alternatives cOperatorAlternatives_0_0 = (Alternatives)cOperatorAssignment_0.eContents().get(0);
+		private final Keyword cOperatorExclamationMarkKeyword_0_0_0 = (Keyword)cOperatorAlternatives_0_0.eContents().get(0);
+		private final Keyword cOperatorNotKeyword_0_0_1 = (Keyword)cOperatorAlternatives_0_0.eContents().get(1);
+		private final Assignment cOperandAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0 = (RuleCall)cOperandAssignment_1.eContents().get(0);
+		
+		//// Logical Unary Expression
+		//LogicalUnaryExpression fmlExpr::LogicalUnaryExpression:
+		//	operator=('!' | 'not') operand=UnaryExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//operator=('!' | 'not') operand=UnaryExpression
+		public Group getGroup() { return cGroup; }
+		
+		//operator=('!' | 'not')
+		public Assignment getOperatorAssignment_0() { return cOperatorAssignment_0; }
+		
+		//('!' | 'not')
+		public Alternatives getOperatorAlternatives_0_0() { return cOperatorAlternatives_0_0; }
+		
+		//'!'
+		public Keyword getOperatorExclamationMarkKeyword_0_0_0() { return cOperatorExclamationMarkKeyword_0_0_0; }
+		
+		//'not'
+		public Keyword getOperatorNotKeyword_0_0_1() { return cOperatorNotKeyword_0_0_1; }
+		
+		//operand=UnaryExpression
+		public Assignment getOperandAssignment_1() { return cOperandAssignment_1; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0() { return cOperandUnaryExpressionParserRuleCall_1_0; }
+	}
+	public class BitwiseUnaryExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BitwiseUnaryExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cOperatorAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final Keyword cOperatorTildeKeyword_0_0 = (Keyword)cOperatorAssignment_0.eContents().get(0);
+		private final Assignment cOperandAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0 = (RuleCall)cOperandAssignment_1.eContents().get(0);
+		
+		//// Logical Unary Expression
+		//BitwiseUnaryExpression fmlExpr::BitwiseUnaryExpression:
+		//	operator='~' operand=UnaryExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//operator='~' operand=UnaryExpression
+		public Group getGroup() { return cGroup; }
+		
+		//operator='~'
+		public Assignment getOperatorAssignment_0() { return cOperatorAssignment_0; }
+		
+		//'~'
+		public Keyword getOperatorTildeKeyword_0_0() { return cOperatorTildeKeyword_0_0; }
+		
+		//operand=UnaryExpression
+		public Assignment getOperandAssignment_1() { return cOperandAssignment_1; }
+		
+		//UnaryExpression
+		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0() { return cOperandUnaryExpressionParserRuleCall_1_0; }
+	}
+	public class PrimaryExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimaryExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cBaseExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cValueElementSpecificationTargetAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Keyword cFullStopKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
+		private final Assignment cElementAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_1_2_0 = (CrossReference)cElementAssignment_1_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_1_2_0_1 = (RuleCall)cElementNamedElementCrossReference_1_2_0.eContents().get(1);
+		private final Alternatives cAlternatives_1_3 = (Alternatives)cGroup_1.eContents().get(3);
+		private final Group cGroup_1_3_0 = (Group)cAlternatives_1_3.eContents().get(0);
+		private final Assignment cKindAssignment_1_3_0_0 = (Assignment)cGroup_1_3_0.eContents().get(0);
+		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0 = (RuleCall)cKindAssignment_1_3_0_0.eContents().get(0);
+		private final Assignment cArgAssignment_1_3_0_1 = (Assignment)cGroup_1_3_0.eContents().get(1);
+		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0 = (RuleCall)cArgAssignment_1_3_0_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_1_3_0_2 = (Keyword)cGroup_1_3_0.eContents().get(2);
+		private final Group cGroup_1_3_1 = (Group)cAlternatives_1_3.eContents().get(1);
+		private final Assignment cKindAssignment_1_3_1_0 = (Assignment)cGroup_1_3_1.eContents().get(0);
+		private final RuleCall cKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0 = (RuleCall)cKindAssignment_1_3_1_0.eContents().get(0);
+		private final Assignment cArgAssignment_1_3_1_1 = (Assignment)cGroup_1_3_1.eContents().get(1);
+		private final RuleCall cArgMixTupleExpressionListParserRuleCall_1_3_1_1_0 = (RuleCall)cArgAssignment_1_3_1_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_1_3_1_2 = (Keyword)cGroup_1_3_1.eContents().get(2);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Action cValueElementSpecificationTargetAction_2_0 = (Action)cGroup_2.eContents().get(0);
+		private final Keyword cHyphenMinusGreaterThanSignKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Assignment cElementAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_2_2_0 = (CrossReference)cElementAssignment_2_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_2_0.eContents().get(1);
+		private final Alternatives cAlternatives_2_3 = (Alternatives)cGroup_2.eContents().get(3);
+		private final Group cGroup_2_3_0 = (Group)cAlternatives_2_3.eContents().get(0);
+		private final Assignment cKindAssignment_2_3_0_0 = (Assignment)cGroup_2_3_0.eContents().get(0);
+		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0 = (RuleCall)cKindAssignment_2_3_0_0.eContents().get(0);
+		private final Assignment cArgAssignment_2_3_0_1 = (Assignment)cGroup_2_3_0.eContents().get(1);
+		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0 = (RuleCall)cArgAssignment_2_3_0_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_2_3_0_2 = (Keyword)cGroup_2_3_0.eContents().get(2);
+		private final Group cGroup_2_3_1 = (Group)cAlternatives_2_3.eContents().get(1);
+		private final Assignment cKindAssignment_2_3_1_0 = (Assignment)cGroup_2_3_1.eContents().get(0);
+		private final RuleCall cKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0 = (RuleCall)cKindAssignment_2_3_1_0.eContents().get(0);
+		private final Assignment cArgAssignment_2_3_1_1 = (Assignment)cGroup_2_3_1.eContents().get(1);
+		private final RuleCall cArgMixTupleExpressionListParserRuleCall_2_3_1_1_0 = (RuleCall)cArgAssignment_2_3_1_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_2_3_1_2 = (Keyword)cGroup_2_3_1.eContents().get(2);
+		private final Group cGroup_2_4 = (Group)cGroup_2.eContents().get(4);
+		private final Action cValueElementSpecificationTargetAction_2_4_0 = (Action)cGroup_2_4.eContents().get(0);
+		private final Keyword cFullStopKeyword_2_4_1 = (Keyword)cGroup_2_4.eContents().get(1);
+		private final Assignment cElementAssignment_2_4_2 = (Assignment)cGroup_2_4.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_2_4_2_0 = (CrossReference)cElementAssignment_2_4_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_4_2_0.eContents().get(1);
+		private final Alternatives cAlternatives_2_4_3 = (Alternatives)cGroup_2_4.eContents().get(3);
+		private final Group cGroup_2_4_3_0 = (Group)cAlternatives_2_4_3.eContents().get(0);
+		private final Assignment cKindAssignment_2_4_3_0_0 = (Assignment)cGroup_2_4_3_0.eContents().get(0);
+		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0 = (RuleCall)cKindAssignment_2_4_3_0_0.eContents().get(0);
+		private final Assignment cArgAssignment_2_4_3_0_1 = (Assignment)cGroup_2_4_3_0.eContents().get(1);
+		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0 = (RuleCall)cArgAssignment_2_4_3_0_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_2_4_3_0_2 = (Keyword)cGroup_2_4_3_0.eContents().get(2);
+		private final Group cGroup_2_4_3_1 = (Group)cAlternatives_2_4_3.eContents().get(1);
+		private final Assignment cKindAssignment_2_4_3_1_0 = (Assignment)cGroup_2_4_3_1.eContents().get(0);
+		private final RuleCall cKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0 = (RuleCall)cKindAssignment_2_4_3_1_0.eContents().get(0);
+		private final Assignment cArgAssignment_2_4_3_1_1 = (Assignment)cGroup_2_4_3_1.eContents().get(1);
+		private final RuleCall cArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0 = (RuleCall)cArgAssignment_2_4_3_1_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_2_4_3_1_2 = (Keyword)cGroup_2_4_3_1.eContents().get(2);
+		
+		//PrimaryExpression fmlExpr::Expression:
+		//	BaseExpression ({fmlExpr::ValueElementSpecification.target=current}
+		//	'.' //kind=ValueDotFieldExpressionKind
+		//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+		//	arg=PositionalTupleExpressionList ']'
+		//	// '(' parameter ',' ... ',' parameter ')'
+		//	| kind=ValueParameterExpressionKind
+		//	arg=MixTupleExpressionList ')')?)* ({fmlExpr::ValueElementSpecification.target=current}
+		//	'->' //kind=ValueArrowFieldExpressionKind
+		//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+		//	arg=PositionalTupleExpressionList ']'
+		//	// '(' parameter ',' ... ',' parameter ')'
+		//	| kind=ValueParameterExpressionKind
+		//	arg=MixTupleExpressionList ')')? ({fmlExpr::ValueElementSpecification.target=current}
+		//	'.' //kind=ValueDotFieldExpressionKind
+		//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+		//	arg=PositionalTupleExpressionList ']'
+		//	// '(' parameter ',' ... ',' parameter ')'
+		//	| kind=ValueParameterExpressionKind
+		//	arg=MixTupleExpressionList ')')?)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//BaseExpression ({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?)*
+		//({fmlExpr::ValueElementSpecification.target=current} '->' //kind=ValueArrowFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?
+		//({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//BaseExpression
+		public RuleCall getBaseExpressionParserRuleCall_0() { return cBaseExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?)*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_1_0() { return cValueElementSpecificationTargetAction_1_0; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_1_1() { return cFullStopKeyword_1_1; }
+		
+		////kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_1_2() { return cElementAssignment_1_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_1_2_0() { return cElementNamedElementCrossReference_1_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_1_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_1_2_0_1; }
+		
+		//(kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?
+		public Alternatives getAlternatives_1_3() { return cAlternatives_1_3; }
+		
+		//kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']'
+		public Group getGroup_1_3_0() { return cGroup_1_3_0; }
+		
+		//kind=ValueIndexExpressionKind
+		public Assignment getKindAssignment_1_3_0_0() { return cKindAssignment_1_3_0_0; }
+		
+		//ValueIndexExpressionKind
+		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0; }
+		
+		//arg=PositionalTupleExpressionList
+		public Assignment getArgAssignment_1_3_0_1() { return cArgAssignment_1_3_0_1; }
+		
+		//PositionalTupleExpressionList
+		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_1_3_0_2() { return cRightSquareBracketKeyword_1_3_0_2; }
+		
+		//kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')'
+		public Group getGroup_1_3_1() { return cGroup_1_3_1; }
+		
+		//kind=ValueParameterExpressionKind
+		public Assignment getKindAssignment_1_3_1_0() { return cKindAssignment_1_3_1_0; }
+		
+		//ValueParameterExpressionKind
+		public RuleCall getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0() { return cKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0; }
+		
+		//arg=MixTupleExpressionList
+		public Assignment getArgAssignment_1_3_1_1() { return cArgAssignment_1_3_1_1; }
+		
+		//MixTupleExpressionList
+		public RuleCall getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0() { return cArgMixTupleExpressionListParserRuleCall_1_3_1_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_3_1_2() { return cRightParenthesisKeyword_1_3_1_2; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} '->' //kind=ValueArrowFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?
+		//({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?)*)?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_2_0() { return cValueElementSpecificationTargetAction_2_0; }
+		
+		//'->'
+		public Keyword getHyphenMinusGreaterThanSignKeyword_2_1() { return cHyphenMinusGreaterThanSignKeyword_2_1; }
+		
+		////kind=ValueArrowFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_2_2() { return cElementAssignment_2_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_2_2_0() { return cElementNamedElementCrossReference_2_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_2_0_1; }
+		
+		//(kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?
+		public Alternatives getAlternatives_2_3() { return cAlternatives_2_3; }
+		
+		//kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']'
+		public Group getGroup_2_3_0() { return cGroup_2_3_0; }
+		
+		//kind=ValueIndexExpressionKind
+		public Assignment getKindAssignment_2_3_0_0() { return cKindAssignment_2_3_0_0; }
+		
+		//ValueIndexExpressionKind
+		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0; }
+		
+		//arg=PositionalTupleExpressionList
+		public Assignment getArgAssignment_2_3_0_1() { return cArgAssignment_2_3_0_1; }
+		
+		//PositionalTupleExpressionList
+		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_2_3_0_2() { return cRightSquareBracketKeyword_2_3_0_2; }
+		
+		//kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')'
+		public Group getGroup_2_3_1() { return cGroup_2_3_1; }
+		
+		//kind=ValueParameterExpressionKind
+		public Assignment getKindAssignment_2_3_1_0() { return cKindAssignment_2_3_1_0; }
+		
+		//ValueParameterExpressionKind
+		public RuleCall getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0() { return cKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0; }
+		
+		//arg=MixTupleExpressionList
+		public Assignment getArgAssignment_2_3_1_1() { return cArgAssignment_2_3_1_1; }
+		
+		//MixTupleExpressionList
+		public RuleCall getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0() { return cArgMixTupleExpressionListParserRuleCall_2_3_1_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2_3_1_2() { return cRightParenthesisKeyword_2_3_1_2; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?)*
+		public Group getGroup_2_4() { return cGroup_2_4; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_2_4_0() { return cValueElementSpecificationTargetAction_2_4_0; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_2_4_1() { return cFullStopKeyword_2_4_1; }
+		
+		////kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_2_4_2() { return cElementAssignment_2_4_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_2_4_2_0() { return cElementNamedElementCrossReference_2_4_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1; }
+		
+		//(kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?
+		public Alternatives getAlternatives_2_4_3() { return cAlternatives_2_4_3; }
+		
+		//kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']'
+		public Group getGroup_2_4_3_0() { return cGroup_2_4_3_0; }
+		
+		//kind=ValueIndexExpressionKind
+		public Assignment getKindAssignment_2_4_3_0_0() { return cKindAssignment_2_4_3_0_0; }
+		
+		//ValueIndexExpressionKind
+		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0; }
+		
+		//arg=PositionalTupleExpressionList
+		public Assignment getArgAssignment_2_4_3_0_1() { return cArgAssignment_2_4_3_0_1; }
+		
+		//PositionalTupleExpressionList
+		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_2_4_3_0_2() { return cRightSquareBracketKeyword_2_4_3_0_2; }
+		
+		//kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')'
+		public Group getGroup_2_4_3_1() { return cGroup_2_4_3_1; }
+		
+		//kind=ValueParameterExpressionKind
+		public Assignment getKindAssignment_2_4_3_1_0() { return cKindAssignment_2_4_3_1_0; }
+		
+		//ValueParameterExpressionKind
+		public RuleCall getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0() { return cKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0; }
+		
+		//arg=MixTupleExpressionList
+		public Assignment getArgAssignment_2_4_3_1_1() { return cArgAssignment_2_4_3_1_1; }
+		
+		//MixTupleExpressionList
+		public RuleCall getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0() { return cArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2_4_3_1_2() { return cRightParenthesisKeyword_2_4_3_1_2; }
+	}
+	public class BaseExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BaseExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralReferenceableExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final RuleCall cExpressionParserRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
+		private final Keyword cRightParenthesisKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
+		private final RuleCall cInvokeExpressionDeprecatedParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cInstantiationExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		
+		//BaseExpression fmlExpr::Expression:
+		//	LiteralReferenceableExpression
+		//	| '(' Expression ')'
+		//	| InvokeExpressionDeprecated
+		//	| InstantiationExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralReferenceableExpression | '(' Expression ')' | InvokeExpressionDeprecated | InstantiationExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralReferenceableExpression
+		public RuleCall getLiteralReferenceableExpressionParserRuleCall_0() { return cLiteralReferenceableExpressionParserRuleCall_0; }
+		
+		//'(' Expression ')'
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_1_0() { return cLeftParenthesisKeyword_1_0; }
+		
+		//Expression
+		public RuleCall getExpressionParserRuleCall_1_1() { return cExpressionParserRuleCall_1_1; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_1_2() { return cRightParenthesisKeyword_1_2; }
+		
+		//InvokeExpressionDeprecated
+		public RuleCall getInvokeExpressionDeprecatedParserRuleCall_2() { return cInvokeExpressionDeprecatedParserRuleCall_2; }
+		
+		//InstantiationExpression
+		public RuleCall getInstantiationExpressionParserRuleCall_3() { return cInstantiationExpressionParserRuleCall_3; }
+	}
+	public class InvokeExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InvokeExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cInvokeExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cInvokeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cInvokeValueSelectionExpressionParserRuleCall_1_0 = (RuleCall)cInvokeAssignment_1.eContents().get(0);
+		
+		//// Behavior Invoke Expression
+		//InvokeExpression fmlExpr::InvokeExpression:
+		//	{fmlExpr::InvokeExpression} invoke=ValueSelectionExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::InvokeExpression} invoke=ValueSelectionExpression
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::InvokeExpression}
+		public Action getInvokeExpressionAction_0() { return cInvokeExpressionAction_0; }
+		
+		//invoke=ValueSelectionExpression
+		public Assignment getInvokeAssignment_1() { return cInvokeAssignment_1; }
+		
+		//ValueSelectionExpression
+		public RuleCall getInvokeValueSelectionExpressionParserRuleCall_1_0() { return cInvokeValueSelectionExpressionParserRuleCall_1_0; }
+	}
+	public class InvokeExpressionDeprecatedElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InvokeExpressionDeprecated");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cInvokeExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cLeftParenthesisColonKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cArgsAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cArgsExpressionParserRuleCall_2_0 = (RuleCall)cArgsAssignment_2.eContents().get(0);
+		private final Assignment cInvokeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cInvokeLiteralReferenceElementParserRuleCall_3_0 = (RuleCall)cInvokeAssignment_3.eContents().get(0);
+		private final Assignment cArgsAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cArgsExpressionParserRuleCall_4_0 = (RuleCall)cArgsAssignment_4.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		
+		//InvokeExpressionDeprecated fmlExpr::InvokeExpression:
+		//	{fmlExpr::InvokeExpression}
+		//	'(:' args+=Expression invoke=LiteralReferenceElement args+=Expression* ')'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::InvokeExpression} '(:' args+=Expression invoke=LiteralReferenceElement args+=Expression* ')'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::InvokeExpression}
+		public Action getInvokeExpressionAction_0() { return cInvokeExpressionAction_0; }
+		
+		//'(:'
+		public Keyword getLeftParenthesisColonKeyword_1() { return cLeftParenthesisColonKeyword_1; }
+		
+		//args+=Expression
+		public Assignment getArgsAssignment_2() { return cArgsAssignment_2; }
+		
+		//Expression
+		public RuleCall getArgsExpressionParserRuleCall_2_0() { return cArgsExpressionParserRuleCall_2_0; }
+		
+		//invoke=LiteralReferenceElement
+		public Assignment getInvokeAssignment_3() { return cInvokeAssignment_3; }
+		
+		//LiteralReferenceElement
+		public RuleCall getInvokeLiteralReferenceElementParserRuleCall_3_0() { return cInvokeLiteralReferenceElementParserRuleCall_3_0; }
+		
+		//args+=Expression*
+		public Assignment getArgsAssignment_4() { return cArgsAssignment_4; }
+		
+		//Expression
+		public RuleCall getArgsExpressionParserRuleCall_4_0() { return cArgsExpressionParserRuleCall_4_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
+	}
+	public class InstantiationExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InstantiationExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cInstantiationExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cInstanceAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cInstanceDynamicInstanceSpecificationParserRuleCall_1_0 = (RuleCall)cInstanceAssignment_1.eContents().get(0);
+		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		
+		//InstantiationExpression fmlExpr::InstantiationExpression:
+		//	{fmlExpr::InstantiationExpression} instance=DynamicInstanceSpecification ';'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::InstantiationExpression} instance=DynamicInstanceSpecification ';'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::InstantiationExpression}
+		public Action getInstantiationExpressionAction_0() { return cInstantiationExpressionAction_0; }
+		
+		//instance=DynamicInstanceSpecification
+		public Assignment getInstanceAssignment_1() { return cInstanceAssignment_1; }
+		
+		//DynamicInstanceSpecification
+		public RuleCall getInstanceDynamicInstanceSpecificationParserRuleCall_1_0() { return cInstanceDynamicInstanceSpecificationParserRuleCall_1_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
+	}
+	public class DynamicInstanceSpecificationElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DynamicInstanceSpecification");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cInstanceMachineAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cNewKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cModelAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cModelMachineCrossReference_2_0 = (CrossReference)cModelAssignment_2.eContents().get(0);
+		private final RuleCall cModelMachineESIdentifierParserRuleCall_2_0_1 = (RuleCall)cModelMachineCrossReference_2_0.eContents().get(1);
+		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
+		private final Keyword cLeftParenthesisKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Group cGroup_3_0_1 = (Group)cGroup_3_0.eContents().get(1);
+		private final Assignment cSlotAssignment_3_0_1_0 = (Assignment)cGroup_3_0_1.eContents().get(0);
+		private final RuleCall cSlotSlotParameterParserRuleCall_3_0_1_0_0 = (RuleCall)cSlotAssignment_3_0_1_0.eContents().get(0);
+		private final Group cGroup_3_0_1_1 = (Group)cGroup_3_0_1.eContents().get(1);
+		private final Keyword cCommaKeyword_3_0_1_1_0 = (Keyword)cGroup_3_0_1_1.eContents().get(0);
+		private final Assignment cSlotAssignment_3_0_1_1_1 = (Assignment)cGroup_3_0_1_1.eContents().get(1);
+		private final RuleCall cSlotSlotParameterParserRuleCall_3_0_1_1_1_0 = (RuleCall)cSlotAssignment_3_0_1_1_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
+		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Group cGroup_3_1_1 = (Group)cGroup_3_1.eContents().get(1);
+		private final Assignment cSlotAssignment_3_1_1_0 = (Assignment)cGroup_3_1_1.eContents().get(0);
+		private final RuleCall cSlotSlotPropertyParserRuleCall_3_1_1_0_0 = (RuleCall)cSlotAssignment_3_1_1_0.eContents().get(0);
+		private final Keyword cSemicolonKeyword_3_1_1_1 = (Keyword)cGroup_3_1_1.eContents().get(1);
+		private final Keyword cRightCurlyBracketKeyword_3_1_2 = (Keyword)cGroup_3_1.eContents().get(2);
+		
+		//DynamicInstanceSpecification fmlInfra::InstanceMachine:
+		//	{fmlInfra::InstanceMachine}
+		//	'new' model=[fmlInfra::Machine|ESIdentifier] ('(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')'
+		//	| '{' (slot+=SlotProperty ';')* '}')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlInfra::InstanceMachine} 'new' model=[fmlInfra::Machine|ESIdentifier] ('(' (slot+=SlotParameter (','
+		//slot+=SlotParameter)*)? ')' | '{' (slot+=SlotProperty ';')* '}')?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlInfra::InstanceMachine}
+		public Action getInstanceMachineAction_0() { return cInstanceMachineAction_0; }
+		
+		//'new'
+		public Keyword getNewKeyword_1() { return cNewKeyword_1; }
+		
+		//model=[fmlInfra::Machine|ESIdentifier]
+		public Assignment getModelAssignment_2() { return cModelAssignment_2; }
+		
+		//[fmlInfra::Machine|ESIdentifier]
+		public CrossReference getModelMachineCrossReference_2_0() { return cModelMachineCrossReference_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getModelMachineESIdentifierParserRuleCall_2_0_1() { return cModelMachineESIdentifierParserRuleCall_2_0_1; }
+		
+		//('(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')' | '{' (slot+=SlotProperty ';')* '}')?
+		public Alternatives getAlternatives_3() { return cAlternatives_3; }
+		
+		//'(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')'
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_3_0_0() { return cLeftParenthesisKeyword_3_0_0; }
+		
+		//(slot+=SlotParameter (',' slot+=SlotParameter)*)?
+		public Group getGroup_3_0_1() { return cGroup_3_0_1; }
+		
+		//slot+=SlotParameter
+		public Assignment getSlotAssignment_3_0_1_0() { return cSlotAssignment_3_0_1_0; }
+		
+		//SlotParameter
+		public RuleCall getSlotSlotParameterParserRuleCall_3_0_1_0_0() { return cSlotSlotParameterParserRuleCall_3_0_1_0_0; }
+		
+		//(',' slot+=SlotParameter)*
+		public Group getGroup_3_0_1_1() { return cGroup_3_0_1_1; }
+		
+		//','
+		public Keyword getCommaKeyword_3_0_1_1_0() { return cCommaKeyword_3_0_1_1_0; }
+		
+		//slot+=SlotParameter
+		public Assignment getSlotAssignment_3_0_1_1_1() { return cSlotAssignment_3_0_1_1_1; }
+		
+		//SlotParameter
+		public RuleCall getSlotSlotParameterParserRuleCall_3_0_1_1_1_0() { return cSlotSlotParameterParserRuleCall_3_0_1_1_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_3_0_2() { return cRightParenthesisKeyword_3_0_2; }
+		
+		//'{' (slot+=SlotProperty ';')* '}'
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_3_1_0() { return cLeftCurlyBracketKeyword_3_1_0; }
+		
+		//(slot+=SlotProperty ';')*
+		public Group getGroup_3_1_1() { return cGroup_3_1_1; }
+		
+		//slot+=SlotProperty
+		public Assignment getSlotAssignment_3_1_1_0() { return cSlotAssignment_3_1_1_0; }
+		
+		//SlotProperty
+		public RuleCall getSlotSlotPropertyParserRuleCall_3_1_1_0_0() { return cSlotSlotPropertyParserRuleCall_3_1_1_0_0; }
+		
+		//';'
+		public Keyword getSemicolonKeyword_3_1_1_1() { return cSemicolonKeyword_3_1_1_1; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_3_1_2() { return cRightCurlyBracketKeyword_3_1_2; }
+	}
+	public class TupleParameterExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TupleParameterExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Keyword cLeftParenthesisKeyword_0 = (Keyword)cGroup.eContents().get(0);
+		private final RuleCall cMixTupleExpressionListParserRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
+		private final Keyword cRightParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		
+		//// Tuple Expression
+		//TupleParameterExpression fmlExpr::TupleExpression:
+		//	'(' MixTupleExpressionList ')'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'(' MixTupleExpressionList ')'
+		public Group getGroup() { return cGroup; }
+		
+		//'('
+		public Keyword getLeftParenthesisKeyword_0() { return cLeftParenthesisKeyword_0; }
+		
+		//MixTupleExpressionList
+		public RuleCall getMixTupleExpressionListParserRuleCall_1() { return cMixTupleExpressionListParserRuleCall_1; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2() { return cRightParenthesisKeyword_2; }
+	}
+	public class MixTupleExpressionListElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cMixTupleExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final Alternatives cValueAlternatives_1_0 = (Alternatives)cValueAssignment_1.eContents().get(0);
+		private final RuleCall cValueExpressionParserRuleCall_1_0_0 = (RuleCall)cValueAlternatives_1_0.eContents().get(0);
+		private final RuleCall cValueNamedExpressionParserRuleCall_1_0_1 = (RuleCall)cValueAlternatives_1_0.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cCommaKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final Alternatives cValueAlternatives_2_1_0 = (Alternatives)cValueAssignment_2_1.eContents().get(0);
+		private final RuleCall cValueExpressionParserRuleCall_2_1_0_0 = (RuleCall)cValueAlternatives_2_1_0.eContents().get(0);
+		private final RuleCall cValueNamedExpressionParserRuleCall_2_1_0_1 = (RuleCall)cValueAlternatives_2_1_0.eContents().get(1);
+		
+		//MixTupleExpressionList fmlExpr::MixTupleExpression:
+		//	{fmlExpr::MixTupleExpression} value+=(Expression | NamedExpression) (',' value+=(Expression | NamedExpression))*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::MixTupleExpression} value+=(Expression | NamedExpression) (',' value+=(Expression | NamedExpression))*
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::MixTupleExpression}
+		public Action getMixTupleExpressionAction_0() { return cMixTupleExpressionAction_0; }
+		
+		//value+=(Expression | NamedExpression)
+		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
+		
+		//(Expression | NamedExpression)
+		public Alternatives getValueAlternatives_1_0() { return cValueAlternatives_1_0; }
+		
+		//Expression
+		public RuleCall getValueExpressionParserRuleCall_1_0_0() { return cValueExpressionParserRuleCall_1_0_0; }
+		
+		//NamedExpression
+		public RuleCall getValueNamedExpressionParserRuleCall_1_0_1() { return cValueNamedExpressionParserRuleCall_1_0_1; }
+		
+		//(',' value+=(Expression | NamedExpression))*
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//','
+		public Keyword getCommaKeyword_2_0() { return cCommaKeyword_2_0; }
+		
+		//value+=(Expression | NamedExpression)
+		public Assignment getValueAssignment_2_1() { return cValueAssignment_2_1; }
+		
+		//(Expression | NamedExpression)
+		public Alternatives getValueAlternatives_2_1_0() { return cValueAlternatives_2_1_0; }
+		
+		//Expression
+		public RuleCall getValueExpressionParserRuleCall_2_1_0_0() { return cValueExpressionParserRuleCall_2_1_0_0; }
+		
+		//NamedExpression
+		public RuleCall getValueNamedExpressionParserRuleCall_2_1_0_1() { return cValueNamedExpressionParserRuleCall_2_1_0_1; }
+	}
+	public class PositionalTupleExpressionListElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cValueAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cValueExpressionParserRuleCall_0_0 = (RuleCall)cValueAssignment_0.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cCommaKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cValueAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cValueExpressionParserRuleCall_1_1_0 = (RuleCall)cValueAssignment_1_1.eContents().get(0);
+		
+		////// At least one NamedExpression
+		////FormalMixTupleExpressionList returns fmlExpr::MixTupleExpression
+		////	: {fmlExpr::MixTupleExpression}
+		////		( value+=Expression  ( ',' value+=Expression )*
+		////			( ',' value+=NamedExpression )
+		////		| value+=NamedExpression
+		////		)
+		////		( ',' value+=( Expression | NamedExpression ) )*
+		////	;
+		////
+		////// NamedExpression only at the end
+		////EndingMixTupleExpressionList returns fmlExpr::MixTupleExpression
+		////	: {fmlExpr::MixTupleExpression}
+		////		( value+=Expression  ( ',' value+=Expression )*
+		////		| value+=NamedExpression
+		////		)
+		////		( ',' value+=NamedExpression )*
+		////	;
+		////
+		////
+		////NamedTupleExpressionList returns fmlExpr::NamedTupleExpression
+		////	: value+=NamedExpression ( ',' value+=NamedExpression )*
+		////	;
+		//PositionalTupleExpressionList fmlExpr::PositionalTupleExpression:
+		//	value+=Expression (',' value+=Expression)*
+		@Override public ParserRule getRule() { return rule; }
+		
+		//value+=Expression (',' value+=Expression)*
+		public Group getGroup() { return cGroup; }
+		
+		//value+=Expression
+		public Assignment getValueAssignment_0() { return cValueAssignment_0; }
+		
+		//Expression
+		public RuleCall getValueExpressionParserRuleCall_0_0() { return cValueExpressionParserRuleCall_0_0; }
+		
+		//(',' value+=Expression)*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//','
+		public Keyword getCommaKeyword_1_0() { return cCommaKeyword_1_0; }
+		
+		//value+=Expression
+		public Assignment getValueAssignment_1_1() { return cValueAssignment_1_1; }
+		
+		//Expression
+		public RuleCall getValueExpressionParserRuleCall_1_1_0() { return cValueExpressionParserRuleCall_1_1_0; }
+	}
+	public class NamedExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final RuleCall cNameXLIA_IDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Keyword cColonKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
+		private final Keyword cEqualsSignGreaterThanSignKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
+		private final Keyword cLessThanSignHyphenMinusKeyword_1_2 = (Keyword)cAlternatives_1.eContents().get(2);
+		private final Assignment cExpressionAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cExpressionExpressionParserRuleCall_2_0 = (RuleCall)cExpressionAssignment_2.eContents().get(0);
+		
+		//NamedExpression fmlExpr::NamedExpression:
+		//	name=XLIA_ID (':' | '=>' | '<-') expression=Expression
+		@Override public ParserRule getRule() { return rule; }
+		
+		////target=[fmlCommon::NamedElement|ESIdentifier]
+		//name=XLIA_ID (':' | '=>' | '<-') expression=Expression
+		public Group getGroup() { return cGroup; }
+		
+		////target=[fmlCommon::NamedElement|ESIdentifier]
+		//name=XLIA_ID
+		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
+		
+		//XLIA_ID
+		public RuleCall getNameXLIA_IDTerminalRuleCall_0_0() { return cNameXLIA_IDTerminalRuleCall_0_0; }
+		
+		//(':' | '=>' | '<-')
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//':'
+		public Keyword getColonKeyword_1_0() { return cColonKeyword_1_0; }
+		
+		//'=>'
+		public Keyword getEqualsSignGreaterThanSignKeyword_1_1() { return cEqualsSignGreaterThanSignKeyword_1_1; }
+		
+		//'<-'
+		public Keyword getLessThanSignHyphenMinusKeyword_1_2() { return cLessThanSignHyphenMinusKeyword_1_2; }
+		
+		//expression=Expression
+		public Assignment getExpressionAssignment_2() { return cExpressionAssignment_2; }
+		
+		//Expression
+		public RuleCall getExpressionExpressionParserRuleCall_2_0() { return cExpressionExpressionParserRuleCall_2_0; }
+	}
+	public class LiteralExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralTerminalExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralReferenceableExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		////NotificationComExpression returns fmlExpr::Expression
+		////	: { fmlExpr::Expression }
+		////		symbol=( 'present' | 'absent' )  operand+=Expression
+		////	;
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Literal Expression Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralExpression fmlExpr::LiteralExpression:
+		//	LiteralTerminalExpression
+		//	| LiteralReferenceableExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralTerminalExpression | LiteralReferenceableExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralTerminalExpression
+		public RuleCall getLiteralTerminalExpressionParserRuleCall_0() { return cLiteralTerminalExpressionParserRuleCall_0; }
+		
+		//LiteralReferenceableExpression
+		public RuleCall getLiteralReferenceableExpressionParserRuleCall_1() { return cLiteralReferenceableExpressionParserRuleCall_1; }
+	}
+	public class LiteralReferenceableExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceableExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralCollectionExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralReferenceExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//LiteralReferenceableExpression fmlExpr::LiteralExpression:
+		//	LiteralCollectionExpression
+		//	| LiteralReferenceExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralCollectionExpression | LiteralReferenceExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralCollectionExpression
+		public RuleCall getLiteralCollectionExpressionParserRuleCall_0() { return cLiteralCollectionExpressionParserRuleCall_0; }
+		
+		//LiteralReferenceExpression
+		public RuleCall getLiteralReferenceExpressionParserRuleCall_1() { return cLiteralReferenceExpressionParserRuleCall_1; }
+	}
+	public class LiteralTerminalExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralTerminalExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralBooleanExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralIntegerExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cLiteralRationalExpressionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cLiteralFloatExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cLiteralCharacterExpressionParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cLiteralStringExpressionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cLiteralNullExpressionParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		
+		//LiteralTerminalExpression fmlExpr::LiteralExpression:
+		//	LiteralBooleanExpression
+		//	| LiteralIntegerExpression
+		//	| LiteralRationalExpression
+		//	| LiteralFloatExpression
+		//	| LiteralCharacterExpression
+		//	| LiteralStringExpression
+		//	| LiteralNullExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralBooleanExpression | LiteralIntegerExpression | LiteralRationalExpression | LiteralFloatExpression |
+		//LiteralCharacterExpression | LiteralStringExpression | LiteralNullExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralBooleanExpression
+		public RuleCall getLiteralBooleanExpressionParserRuleCall_0() { return cLiteralBooleanExpressionParserRuleCall_0; }
+		
+		//LiteralIntegerExpression
+		public RuleCall getLiteralIntegerExpressionParserRuleCall_1() { return cLiteralIntegerExpressionParserRuleCall_1; }
+		
+		//LiteralRationalExpression
+		public RuleCall getLiteralRationalExpressionParserRuleCall_2() { return cLiteralRationalExpressionParserRuleCall_2; }
+		
+		//LiteralFloatExpression
+		public RuleCall getLiteralFloatExpressionParserRuleCall_3() { return cLiteralFloatExpressionParserRuleCall_3; }
+		
+		//LiteralCharacterExpression
+		public RuleCall getLiteralCharacterExpressionParserRuleCall_4() { return cLiteralCharacterExpressionParserRuleCall_4; }
+		
+		//LiteralStringExpression
+		public RuleCall getLiteralStringExpressionParserRuleCall_5() { return cLiteralStringExpressionParserRuleCall_5; }
+		
+		//LiteralNullExpression
+		public RuleCall getLiteralNullExpressionParserRuleCall_6() { return cLiteralNullExpressionParserRuleCall_6; }
+	}
+	public class LiteralBooleanExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralBooleanExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralBooleanExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cValueEBooleanParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Literal Boolean / Numeric Expression Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralBooleanExpression fmlExpr::LiteralBooleanExpression:
+		//	{fmlExpr::LiteralBooleanExpression} value=EBoolean
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralBooleanExpression} value=EBoolean
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralBooleanExpression}
+		public Action getLiteralBooleanExpressionAction_0() { return cLiteralBooleanExpressionAction_0; }
+		
+		//value=EBoolean
+		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
+		
+		//EBoolean
+		public RuleCall getValueEBooleanParserRuleCall_1_0() { return cValueEBooleanParserRuleCall_1_0; }
+	}
+	public class LiteralIntegerExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralIntegerExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralIntegerExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cValueEIntegerParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
+		
+		//LiteralIntegerExpression fmlExpr::LiteralIntegerExpression:
+		//	{fmlExpr::LiteralIntegerExpression} value=EInteger
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralIntegerExpression} value=EInteger
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralIntegerExpression}
+		public Action getLiteralIntegerExpressionAction_0() { return cLiteralIntegerExpressionAction_0; }
+		
+		//value=EInteger
+		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
+		
+		//EInteger
+		public RuleCall getValueEIntegerParserRuleCall_1_0() { return cValueEIntegerParserRuleCall_1_0; }
+	}
+	public class LiteralRationalExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralRationalExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralRationalExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cNumeratorAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cNumeratorEIntegerParserRuleCall_1_0 = (RuleCall)cNumeratorAssignment_1.eContents().get(0);
+		private final Keyword cSolidusKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cDenominatorAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cDenominatorEIntegerParserRuleCall_3_0 = (RuleCall)cDenominatorAssignment_3.eContents().get(0);
+		
+		//LiteralRationalExpression fmlExpr::LiteralRationalExpression:
+		//	{fmlExpr::LiteralRationalExpression} numerator=EInteger '/' denominator=EInteger
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralRationalExpression} numerator=EInteger '/' denominator=EInteger
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralRationalExpression}
+		public Action getLiteralRationalExpressionAction_0() { return cLiteralRationalExpressionAction_0; }
+		
+		//numerator=EInteger
+		public Assignment getNumeratorAssignment_1() { return cNumeratorAssignment_1; }
+		
+		//EInteger
+		public RuleCall getNumeratorEIntegerParserRuleCall_1_0() { return cNumeratorEIntegerParserRuleCall_1_0; }
+		
+		//'/'
+		public Keyword getSolidusKeyword_2() { return cSolidusKeyword_2; }
+		
+		//denominator=EInteger
+		public Assignment getDenominatorAssignment_3() { return cDenominatorAssignment_3; }
+		
+		//EInteger
+		public RuleCall getDenominatorEIntegerParserRuleCall_3_0() { return cDenominatorEIntegerParserRuleCall_3_0; }
+	}
+	public class LiteralFloatExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralFloatExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralFloatExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cValueEDoubleParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
+		
+		//LiteralFloatExpression fmlExpr::LiteralFloatExpression:
+		//	{fmlExpr::LiteralFloatExpression} value=EDouble
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralFloatExpression} value=EDouble
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralFloatExpression}
+		public Action getLiteralFloatExpressionAction_0() { return cLiteralFloatExpressionAction_0; }
+		
+		//value=EDouble
+		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
+		
+		//EDouble
+		public RuleCall getValueEDoubleParserRuleCall_1_0() { return cValueEDoubleParserRuleCall_1_0; }
+	}
+	public class LiteralCharacterExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralCharacterExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralCharacterExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cValueECharacterParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Literal Character / String Expression Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralCharacterExpression fmlExpr::LiteralCharacterExpression:
+		//	{fmlExpr::LiteralCharacterExpression} value=ECharacter
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralCharacterExpression} value=ECharacter
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralCharacterExpression}
+		public Action getLiteralCharacterExpressionAction_0() { return cLiteralCharacterExpressionAction_0; }
+		
+		//value=ECharacter
+		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
+		
+		//ECharacter
+		public RuleCall getValueECharacterParserRuleCall_1_0() { return cValueECharacterParserRuleCall_1_0; }
+	}
+	public class LiteralStringExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralStringExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralStringExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cValueEStringParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
+		
+		//LiteralStringExpression fmlExpr::LiteralStringExpression:
+		//	{fmlExpr::LiteralStringExpression} value=EString
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralStringExpression} value=EString
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralStringExpression}
+		public Action getLiteralStringExpressionAction_0() { return cLiteralStringExpressionAction_0; }
+		
+		//value=EString
+		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
+		
+		//EString
+		public RuleCall getValueEStringParserRuleCall_1_0() { return cValueEStringParserRuleCall_1_0; }
+	}
+	public class LiteralNullExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralNullExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+		private final Action cLiteralNullExpressionAction_0_0 = (Action)cGroup_0.eContents().get(0);
+		private final Alternatives cAlternatives_0_1 = (Alternatives)cGroup_0.eContents().get(1);
+		private final Keyword cNullKeyword_0_1_0 = (Keyword)cAlternatives_0_1.eContents().get(0);
+		private final Keyword cNullKeyword_0_1_1 = (Keyword)cAlternatives_0_1.eContents().get(1);
+		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+		private final Action cLiteralNullExpressionAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
+		private final Keyword cNullKeyword_1_1_0 = (Keyword)cAlternatives_1_1.eContents().get(0);
+		private final Keyword cNullKeyword_1_1_1 = (Keyword)cAlternatives_1_1.eContents().get(1);
+		private final Assignment cTypeAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final RuleCall cTypeDataTypeParserRuleCall_1_2_0 = (RuleCall)cTypeAssignment_1_2.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Literal Null Expression Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralNullExpression fmlExpr::LiteralNullExpression:
+		//	{fmlExpr::LiteralNullExpression} ('null' | '$null') | {fmlExpr::LiteralNullExpression} ('null<' | '$null<')
+		//	type=DataType '>'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralNullExpression} ('null' | '$null') | {fmlExpr::LiteralNullExpression} ('null<' | '$null<')
+		//type=DataType '>'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//{fmlExpr::LiteralNullExpression} ('null' | '$null')
+		public Group getGroup_0() { return cGroup_0; }
+		
+		//{fmlExpr::LiteralNullExpression}
+		public Action getLiteralNullExpressionAction_0_0() { return cLiteralNullExpressionAction_0_0; }
+		
+		//('null' | '$null')
+		public Alternatives getAlternatives_0_1() { return cAlternatives_0_1; }
+		
+		//'null'
+		public Keyword getNullKeyword_0_1_0() { return cNullKeyword_0_1_0; }
+		
+		//'$null'
+		public Keyword getNullKeyword_0_1_1() { return cNullKeyword_0_1_1; }
+		
+		//{fmlExpr::LiteralNullExpression} ('null<' | '$null<') type=DataType '>'
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::LiteralNullExpression}
+		public Action getLiteralNullExpressionAction_1_0() { return cLiteralNullExpressionAction_1_0; }
+		
+		//('null<' | '$null<')
+		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
+		
+		//'null<'
+		public Keyword getNullKeyword_1_1_0() { return cNullKeyword_1_1_0; }
+		
+		//'$null<'
+		public Keyword getNullKeyword_1_1_1() { return cNullKeyword_1_1_1; }
+		
+		//type=DataType
+		public Assignment getTypeAssignment_1_2() { return cTypeAssignment_1_2; }
+		
+		//DataType
+		public RuleCall getTypeDataTypeParserRuleCall_1_2_0() { return cTypeDataTypeParserRuleCall_1_2_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_1_3() { return cGreaterThanSignKeyword_1_3; }
+	}
+	public class LiteralCollectionExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralCollectionExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralCollectionExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cLessThanSignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final Assignment cDatatypeAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cDatatypeDataTypeParserRuleCall_1_1_0 = (RuleCall)cDatatypeAssignment_1_1.eContents().get(0);
+		private final Keyword cGreaterThanSignKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Alternatives cAlternatives_3_0 = (Alternatives)cGroup_3.eContents().get(0);
+		private final Assignment cValueAssignment_3_0_0 = (Assignment)cAlternatives_3_0.eContents().get(0);
+		private final RuleCall cValueExpressionParserRuleCall_3_0_0_0 = (RuleCall)cValueAssignment_3_0_0.eContents().get(0);
+		private final Assignment cValueAssignment_3_0_1 = (Assignment)cAlternatives_3_0.eContents().get(1);
+		private final RuleCall cValueNamedExpressionParserRuleCall_3_0_1_0 = (RuleCall)cValueAssignment_3_0_1.eContents().get(0);
+		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
+		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Alternatives cAlternatives_3_1_1 = (Alternatives)cGroup_3_1.eContents().get(1);
+		private final Assignment cValueAssignment_3_1_1_0 = (Assignment)cAlternatives_3_1_1.eContents().get(0);
+		private final RuleCall cValueExpressionParserRuleCall_3_1_1_0_0 = (RuleCall)cValueAssignment_3_1_1_0.eContents().get(0);
+		private final Assignment cValueAssignment_3_1_1_1 = (Assignment)cAlternatives_3_1_1.eContents().get(1);
+		private final RuleCall cValueNamedExpressionParserRuleCall_3_1_1_1_0 = (RuleCall)cValueAssignment_3_1_1_1.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Literal Collection Expression Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralCollectionExpression fmlExpr::LiteralCollectionExpression:
+		//	{fmlExpr::LiteralCollectionExpression} ('<' datatype=DataType '>')?
+		//	'{' ((value+=Expression | value+=NamedExpression) (',' (value+=Expression | value+=NamedExpression))*)? '}'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralCollectionExpression} ('<' datatype=DataType '>')? '{' ((value+=Expression | value+=NamedExpression)
+		//(',' (value+=Expression | value+=NamedExpression))*)? '}'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralCollectionExpression}
+		public Action getLiteralCollectionExpressionAction_0() { return cLiteralCollectionExpressionAction_0; }
+		
+		//('<' datatype=DataType '>')?
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//'<'
+		public Keyword getLessThanSignKeyword_1_0() { return cLessThanSignKeyword_1_0; }
+		
+		//datatype=DataType
+		public Assignment getDatatypeAssignment_1_1() { return cDatatypeAssignment_1_1; }
+		
+		//DataType
+		public RuleCall getDatatypeDataTypeParserRuleCall_1_1_0() { return cDatatypeDataTypeParserRuleCall_1_1_0; }
+		
+		//'>'
+		public Keyword getGreaterThanSignKeyword_1_2() { return cGreaterThanSignKeyword_1_2; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
+		
+		//((value+=Expression | value+=NamedExpression) (',' (value+=Expression | value+=NamedExpression))*)?
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//(value+=Expression | value+=NamedExpression)
+		public Alternatives getAlternatives_3_0() { return cAlternatives_3_0; }
+		
+		//value+=Expression
+		public Assignment getValueAssignment_3_0_0() { return cValueAssignment_3_0_0; }
+		
+		//Expression
+		public RuleCall getValueExpressionParserRuleCall_3_0_0_0() { return cValueExpressionParserRuleCall_3_0_0_0; }
+		
+		//value+=NamedExpression
+		public Assignment getValueAssignment_3_0_1() { return cValueAssignment_3_0_1; }
+		
+		//NamedExpression
+		public RuleCall getValueNamedExpressionParserRuleCall_3_0_1_0() { return cValueNamedExpressionParserRuleCall_3_0_1_0; }
+		
+		//(',' (value+=Expression | value+=NamedExpression))*
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//','
+		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
+		
+		//(value+=Expression | value+=NamedExpression)
+		public Alternatives getAlternatives_3_1_1() { return cAlternatives_3_1_1; }
+		
+		//value+=Expression
+		public Assignment getValueAssignment_3_1_1_0() { return cValueAssignment_3_1_1_0; }
+		
+		//Expression
+		public RuleCall getValueExpressionParserRuleCall_3_1_1_0_0() { return cValueExpressionParserRuleCall_3_1_1_0_0; }
+		
+		//value+=NamedExpression
+		public Assignment getValueAssignment_3_1_1_1() { return cValueAssignment_3_1_1_1; }
+		
+		//NamedExpression
+		public RuleCall getValueNamedExpressionParserRuleCall_3_1_1_1_0() { return cValueNamedExpressionParserRuleCall_3_1_1_1_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
+	}
+	public class LiteralReferenceExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralReferenceElementParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralReferenceVariableContextParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cLiteralReferenceMachineContextParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cLiteralEnvExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Literal Reference Expression Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralReferenceExpression fmlExpr::LiteralReferenceExpression:
+		//	LiteralReferenceElement
+		//	| LiteralReferenceVariableContext
+		//	| LiteralReferenceMachineContext
+		//	| LiteralEnvExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralReferenceElement | LiteralReferenceVariableContext | LiteralReferenceMachineContext | LiteralEnvExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralReferenceElement
+		public RuleCall getLiteralReferenceElementParserRuleCall_0() { return cLiteralReferenceElementParserRuleCall_0; }
+		
+		//LiteralReferenceVariableContext
+		public RuleCall getLiteralReferenceVariableContextParserRuleCall_1() { return cLiteralReferenceVariableContextParserRuleCall_1; }
+		
+		//LiteralReferenceMachineContext
+		public RuleCall getLiteralReferenceMachineContextParserRuleCall_2() { return cLiteralReferenceMachineContextParserRuleCall_2; }
+		
+		//LiteralEnvExpression
+		public RuleCall getLiteralEnvExpressionParserRuleCall_3() { return cLiteralEnvExpressionParserRuleCall_3; }
+	}
+	public class LiteralReferenceElementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceElement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralReferenceElementAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cValueNamedElementCrossReference_1_0 = (CrossReference)cValueAssignment_1.eContents().get(0);
+		private final RuleCall cValueNamedElementESIdentifierParserRuleCall_1_0_1 = (RuleCall)cValueNamedElementCrossReference_1_0.eContents().get(1);
+		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
+		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
+		private final Assignment cKindAssignment_2_0_0 = (Assignment)cGroup_2_0.eContents().get(0);
+		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_2_0_0_0 = (RuleCall)cKindAssignment_2_0_0.eContents().get(0);
+		private final Assignment cArgAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
+		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_2_0_1_0 = (RuleCall)cArgAssignment_2_0_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_2_0_2 = (Keyword)cGroup_2_0.eContents().get(2);
+		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
+		private final Assignment cKindAssignment_2_1_0 = (Assignment)cGroup_2_1.eContents().get(0);
+		private final RuleCall cKindValueParameterExpressionKindEnumRuleCall_2_1_0_0 = (RuleCall)cKindAssignment_2_1_0.eContents().get(0);
+		private final Assignment cArgAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
+		private final RuleCall cArgMixTupleExpressionListParserRuleCall_2_1_1_0 = (RuleCall)cArgAssignment_2_1_1.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_2_1_2 = (Keyword)cGroup_2_1.eContents().get(2);
+		
+		//LiteralReferenceElement fmlExpr::LiteralReferenceElement:
+		//	{fmlExpr::LiteralReferenceElement} value=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+		//	arg=PositionalTupleExpressionList ']'
+		//	// '(' parameter ',' ... ',' parameter ')'
+		//	| kind=ValueParameterExpressionKind
+		//	arg=MixTupleExpressionList ')')?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralReferenceElement} value=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+		//arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralReferenceElement}
+		public Action getLiteralReferenceElementAction_0() { return cLiteralReferenceElementAction_0; }
+		
+		//value=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getValueNamedElementCrossReference_1_0() { return cValueNamedElementCrossReference_1_0; }
+		
+		//ESIdentifier
+		public RuleCall getValueNamedElementESIdentifierParserRuleCall_1_0_1() { return cValueNamedElementESIdentifierParserRuleCall_1_0_1; }
+		
+		//(kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' // '(' parameter ',' ... ',' parameter ')'
+		//| kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')')?
+		public Alternatives getAlternatives_2() { return cAlternatives_2; }
+		
+		//kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']'
+		public Group getGroup_2_0() { return cGroup_2_0; }
+		
+		//kind=ValueIndexExpressionKind
+		public Assignment getKindAssignment_2_0_0() { return cKindAssignment_2_0_0; }
+		
+		//ValueIndexExpressionKind
+		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_2_0_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_2_0_0_0; }
+		
+		//arg=PositionalTupleExpressionList
+		public Assignment getArgAssignment_2_0_1() { return cArgAssignment_2_0_1; }
+		
+		//PositionalTupleExpressionList
+		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_2_0_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_2_0_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_2_0_2() { return cRightSquareBracketKeyword_2_0_2; }
+		
+		//kind=ValueParameterExpressionKind arg=MixTupleExpressionList ')'
+		public Group getGroup_2_1() { return cGroup_2_1; }
+		
+		//kind=ValueParameterExpressionKind
+		public Assignment getKindAssignment_2_1_0() { return cKindAssignment_2_1_0; }
+		
+		//ValueParameterExpressionKind
+		public RuleCall getKindValueParameterExpressionKindEnumRuleCall_2_1_0_0() { return cKindValueParameterExpressionKindEnumRuleCall_2_1_0_0; }
+		
+		//arg=MixTupleExpressionList
+		public Assignment getArgAssignment_2_1_1() { return cArgAssignment_2_1_1; }
+		
+		//MixTupleExpressionList
+		public RuleCall getArgMixTupleExpressionListParserRuleCall_2_1_1_0() { return cArgMixTupleExpressionListParserRuleCall_2_1_1_0; }
+		
+		//')'
+		public Keyword getRightParenthesisKeyword_2_1_2() { return cRightParenthesisKeyword_2_1_2; }
+	}
+	public class LiteralPureReferenceElementElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralPureReferenceElement");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralReferenceElementAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cValueNamedElementCrossReference_1_0 = (CrossReference)cValueAssignment_1.eContents().get(0);
+		private final RuleCall cValueNamedElementESIdentifierParserRuleCall_1_0_1 = (RuleCall)cValueNamedElementCrossReference_1_0.eContents().get(1);
+		
+		//LiteralPureReferenceElement fmlExpr::LiteralReferenceElement:
+		//	{fmlExpr::LiteralReferenceElement} value=[fmlCommon::NamedElement|ESIdentifier]
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralReferenceElement} value=[fmlCommon::NamedElement|ESIdentifier]
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralReferenceElement}
+		public Action getLiteralReferenceElementAction_0() { return cLiteralReferenceElementAction_0; }
+		
+		//value=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getValueNamedElementCrossReference_1_0() { return cValueNamedElementCrossReference_1_0; }
+		
+		//ESIdentifier
+		public RuleCall getValueNamedElementESIdentifierParserRuleCall_1_0_1() { return cValueNamedElementESIdentifierParserRuleCall_1_0_1; }
+	}
+	public class LiteralReferenceVariableContextElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceVariableContext");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralTimeExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralTimeDeltaExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//LiteralReferenceVariableContext fmlExpr::LiteralReferenceExpression:
+		//	LiteralTimeExpression
+		//	| LiteralTimeDeltaExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralTimeExpression | LiteralTimeDeltaExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralTimeExpression
+		public RuleCall getLiteralTimeExpressionParserRuleCall_0() { return cLiteralTimeExpressionParserRuleCall_0; }
+		
+		//LiteralTimeDeltaExpression
+		public RuleCall getLiteralTimeDeltaExpressionParserRuleCall_1() { return cLiteralTimeDeltaExpressionParserRuleCall_1; }
+	}
+	public class LiteralTimeExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralTimeExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralTimeExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cTimeKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		
+		//LiteralTimeExpression fmlExpr::LiteralTimeExpression:
+		//	{fmlExpr::LiteralTimeExpression} '$time'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralTimeExpression} '$time'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralTimeExpression}
+		public Action getLiteralTimeExpressionAction_0() { return cLiteralTimeExpressionAction_0; }
+		
+		//'$time'
+		public Keyword getTimeKeyword_1() { return cTimeKeyword_1; }
+	}
+	public class LiteralTimeDeltaExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralTimeDeltaExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralTimeDeltaExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cDeltaKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		
+		//LiteralTimeDeltaExpression fmlExpr::LiteralTimeDeltaExpression:
+		//	{fmlExpr::LiteralTimeDeltaExpression} '$delta'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralTimeDeltaExpression} '$delta'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralTimeDeltaExpression}
+		public Action getLiteralTimeDeltaExpressionAction_0() { return cLiteralTimeDeltaExpressionAction_0; }
+		
+		//'$delta'
+		public Keyword getDeltaKeyword_1() { return cDeltaKeyword_1; }
+	}
+	public class LiteralReferenceMachineContextElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceMachineContext");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralThisExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralSelfExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cLiteralParentExpressionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cLiteralSuperExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cLiteralSystemExpressionParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cLiteralEnvExpressionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		
+		//LiteralReferenceMachineContext fmlExpr::LiteralReferenceExpression:
+		//	LiteralThisExpression
+		//	| LiteralSelfExpression
+		//	| LiteralParentExpression
+		//	| LiteralSuperExpression
+		//	| LiteralSystemExpression
+		//	| LiteralEnvExpression
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralThisExpression | LiteralSelfExpression | LiteralParentExpression | LiteralSuperExpression |
+		//LiteralSystemExpression | LiteralEnvExpression
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralThisExpression
+		public RuleCall getLiteralThisExpressionParserRuleCall_0() { return cLiteralThisExpressionParserRuleCall_0; }
+		
+		//LiteralSelfExpression
+		public RuleCall getLiteralSelfExpressionParserRuleCall_1() { return cLiteralSelfExpressionParserRuleCall_1; }
+		
+		//LiteralParentExpression
+		public RuleCall getLiteralParentExpressionParserRuleCall_2() { return cLiteralParentExpressionParserRuleCall_2; }
+		
+		//LiteralSuperExpression
+		public RuleCall getLiteralSuperExpressionParserRuleCall_3() { return cLiteralSuperExpressionParserRuleCall_3; }
+		
+		//LiteralSystemExpression
+		public RuleCall getLiteralSystemExpressionParserRuleCall_4() { return cLiteralSystemExpressionParserRuleCall_4; }
+		
+		//LiteralEnvExpression
+		public RuleCall getLiteralEnvExpressionParserRuleCall_5() { return cLiteralEnvExpressionParserRuleCall_5; }
+	}
+	public class LiteralThisExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralThisExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralThisExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cThisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		
+		//LiteralThisExpression fmlExpr::LiteralThisExpression:
+		//	{fmlExpr::LiteralThisExpression} '$this'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralThisExpression} '$this'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralThisExpression}
+		public Action getLiteralThisExpressionAction_0() { return cLiteralThisExpressionAction_0; }
+		
+		//'$this'
+		public Keyword getThisKeyword_1() { return cThisKeyword_1; }
+	}
+	public class LiteralSelfExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralSelfExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralSelfExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cSelfKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		
+		//LiteralSelfExpression fmlExpr::LiteralSelfExpression:
+		//	{fmlExpr::LiteralSelfExpression} '$self'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralSelfExpression} '$self'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralSelfExpression}
+		public Action getLiteralSelfExpressionAction_0() { return cLiteralSelfExpressionAction_0; }
+		
+		//'$self'
+		public Keyword getSelfKeyword_1() { return cSelfKeyword_1; }
+	}
+	public class LiteralParentExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralParentExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralParentExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cParentKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		
+		//LiteralParentExpression fmlExpr::LiteralParentExpression:
+		//	{fmlExpr::LiteralParentExpression} '$parent'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralParentExpression} '$parent'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralParentExpression}
+		public Action getLiteralParentExpressionAction_0() { return cLiteralParentExpressionAction_0; }
+		
+		//'$parent'
+		public Keyword getParentKeyword_1() { return cParentKeyword_1; }
+	}
+	public class LiteralSuperExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralSuperExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralSuperExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cSuperKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		
+		//LiteralSuperExpression fmlExpr::LiteralSuperExpression:
+		//	{fmlExpr::LiteralSuperExpression} '$super'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralSuperExpression} '$super'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralSuperExpression}
+		public Action getLiteralSuperExpressionAction_0() { return cLiteralSuperExpressionAction_0; }
+		
+		//'$super'
+		public Keyword getSuperKeyword_1() { return cSuperKeyword_1; }
+	}
+	public class LiteralSystemExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralSystemExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralSystemExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cSystemKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		
+		//LiteralSystemExpression fmlExpr::LiteralSystemExpression:
+		//	{fmlExpr::LiteralSystemExpression} '$system'
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralSystemExpression} '$system'
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralSystemExpression}
+		public Action getLiteralSystemExpressionAction_0() { return cLiteralSystemExpressionAction_0; }
+		
+		//'$system'
+		public Keyword getSystemKeyword_1() { return cSystemKeyword_1; }
+	}
+	public class LiteralEnvExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralEnvExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cLiteralEnvExpressionAction_0 = (Action)cGroup.eContents().get(0);
+		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+		private final Keyword cEnvKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
+		private final Keyword cEnvKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
+		
+		//LiteralEnvExpression fmlExpr::LiteralEnvExpression:
+		//	{fmlExpr::LiteralEnvExpression} ('$env' | 'env')
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{fmlExpr::LiteralEnvExpression} ('$env' | 'env')
+		public Group getGroup() { return cGroup; }
+		
+		//{fmlExpr::LiteralEnvExpression}
+		public Action getLiteralEnvExpressionAction_0() { return cLiteralEnvExpressionAction_0; }
+		
+		//('$env' | 'env')
+		public Alternatives getAlternatives_1() { return cAlternatives_1; }
+		
+		//'$env'
+		public Keyword getEnvKeyword_1_0() { return cEnvKeyword_1_0; }
+		
+		//'env'
+		public Keyword getEnvKeyword_1_1() { return cEnvKeyword_1_1; }
+	}
+	public class LiteralPureReferenceExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralPureReferenceExpression");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cLiteralPureReferenceElementParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cLiteralReferenceMachineContextParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//////////////////////////////////////////////////////////////////////////////////
+		//// Value Element Specification Expression Rules
+		//////////////////////////////////////////////////////////////////////////////////
+		//LiteralPureReferenceExpression fmlExpr::LiteralReferenceExpression:
+		//	LiteralPureReferenceElement
+		//	| LiteralReferenceMachineContext
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralPureReferenceElement | LiteralReferenceMachineContext
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//LiteralPureReferenceElement
+		public RuleCall getLiteralPureReferenceElementParserRuleCall_0() { return cLiteralPureReferenceElementParserRuleCall_0; }
+		
+		//LiteralReferenceMachineContext
+		public RuleCall getLiteralReferenceMachineContextParserRuleCall_1() { return cLiteralReferenceMachineContextParserRuleCall_1; }
+	}
+	public class ValueSelectionExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueSelectionExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cLiteralReferenceExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cValueElementSpecificationTargetAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Keyword cFullStopKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
+		private final Assignment cElementAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_1_2_0 = (CrossReference)cElementAssignment_1_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_1_2_0_1 = (RuleCall)cElementNamedElementCrossReference_1_2_0.eContents().get(1);
+		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
+		private final Assignment cKindAssignment_1_3_0 = (Assignment)cGroup_1_3.eContents().get(0);
+		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_1_3_0_0 = (RuleCall)cKindAssignment_1_3_0.eContents().get(0);
+		private final Assignment cArgAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
+		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_1_3_1_0 = (RuleCall)cArgAssignment_1_3_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_1_3_2 = (Keyword)cGroup_1_3.eContents().get(2);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Action cValueElementSpecificationTargetAction_2_0 = (Action)cGroup_2.eContents().get(0);
+		private final Keyword cHyphenMinusGreaterThanSignKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
+		private final Assignment cElementAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_2_2_0 = (CrossReference)cElementAssignment_2_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_2_0.eContents().get(1);
+		private final Group cGroup_2_3 = (Group)cGroup_2.eContents().get(3);
+		private final Assignment cKindAssignment_2_3_0 = (Assignment)cGroup_2_3.eContents().get(0);
+		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_2_3_0_0 = (RuleCall)cKindAssignment_2_3_0.eContents().get(0);
+		private final Assignment cArgAssignment_2_3_1 = (Assignment)cGroup_2_3.eContents().get(1);
+		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_2_3_1_0 = (RuleCall)cArgAssignment_2_3_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_2_3_2 = (Keyword)cGroup_2_3.eContents().get(2);
+		private final Group cGroup_2_4 = (Group)cGroup_2.eContents().get(4);
+		private final Action cValueElementSpecificationTargetAction_2_4_0 = (Action)cGroup_2_4.eContents().get(0);
+		private final Keyword cFullStopKeyword_2_4_1 = (Keyword)cGroup_2_4.eContents().get(1);
+		private final Assignment cElementAssignment_2_4_2 = (Assignment)cGroup_2_4.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_2_4_2_0 = (CrossReference)cElementAssignment_2_4_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_4_2_0.eContents().get(1);
+		private final Group cGroup_2_4_3 = (Group)cGroup_2_4.eContents().get(3);
+		private final Assignment cKindAssignment_2_4_3_0 = (Assignment)cGroup_2_4_3.eContents().get(0);
+		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0 = (RuleCall)cKindAssignment_2_4_3_0.eContents().get(0);
+		private final Assignment cArgAssignment_2_4_3_1 = (Assignment)cGroup_2_4_3.eContents().get(1);
+		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0 = (RuleCall)cArgAssignment_2_4_3_1.eContents().get(0);
+		private final Keyword cRightSquareBracketKeyword_2_4_3_2 = (Keyword)cGroup_2_4_3.eContents().get(2);
+		
+		//ValueSelectionExpression fmlExpr::Expression:
+		//	LiteralReferenceExpression ({fmlExpr::ValueElementSpecification.target=current}
+		//	'.' //kind=ValueDotFieldExpressionKind
+		//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+		//	arg=PositionalTupleExpressionList ']'
+		//	//			// TODO '(' parameter ',' ... ',' parameter ')'
+		//	//			| kind=ValueParameterExpressionKind
+		//	//				arg=MixTupleExpressionList  ')'
+		//)?)* ({fmlExpr::ValueElementSpecification.target=current}
+		//	'->' //kind=ValueArrowFieldExpressionKind
+		//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+		//	arg=PositionalTupleExpressionList ']'
+		//	//			// TODO '(' parameter ',' ... ',' parameter ')'
+		//	//			| kind=ValueParameterExpressionKind
+		//	//				arg=MixTupleExpressionList  ')'
+		//)? ({fmlExpr::ValueElementSpecification.target=current}
+		//	'.' //kind=ValueDotFieldExpressionKind
+		//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+		//	arg=PositionalTupleExpressionList ']'
+		//	//				// TODO '(' parameter ',' ... ',' parameter ')'
+		//	//				| kind=ValueParameterExpressionKind
+		//	//					arg=MixTupleExpressionList  ')'
+		//)?)*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralReferenceExpression ({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //			// TODO '(' parameter ',' ... ',' parameter ')'
+		////			| kind=ValueParameterExpressionKind
+		////				arg=MixTupleExpressionList  ')'
+		//)?)* ({fmlExpr::ValueElementSpecification.target=current} '->' //kind=ValueArrowFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //			// TODO '(' parameter ',' ... ',' parameter ')'
+		////			| kind=ValueParameterExpressionKind
+		////				arg=MixTupleExpressionList  ')'
+		//)? ({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //				// TODO '(' parameter ',' ... ',' parameter ')'
+		////				| kind=ValueParameterExpressionKind
+		////					arg=MixTupleExpressionList  ')'
+		//)?)*)?
+		public Group getGroup() { return cGroup; }
+		
+		//LiteralReferenceExpression
+		public RuleCall getLiteralReferenceExpressionParserRuleCall_0() { return cLiteralReferenceExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //			// TODO '(' parameter ',' ... ',' parameter ')'
+		////			| kind=ValueParameterExpressionKind
+		////				arg=MixTupleExpressionList  ')'
+		//)?)*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_1_0() { return cValueElementSpecificationTargetAction_1_0; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_1_1() { return cFullStopKeyword_1_1; }
+		
+		////kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_1_2() { return cElementAssignment_1_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_1_2_0() { return cElementNamedElementCrossReference_1_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_1_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_1_2_0_1; }
+		
+		//(kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //			// TODO '(' parameter ',' ... ',' parameter ')'
+		////			| kind=ValueParameterExpressionKind
+		////				arg=MixTupleExpressionList  ')'
+		//)?
+		public Group getGroup_1_3() { return cGroup_1_3; }
+		
+		//kind=ValueIndexExpressionKind
+		public Assignment getKindAssignment_1_3_0() { return cKindAssignment_1_3_0; }
+		
+		//ValueIndexExpressionKind
+		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_1_3_0_0; }
+		
+		//arg=PositionalTupleExpressionList
+		public Assignment getArgAssignment_1_3_1() { return cArgAssignment_1_3_1; }
+		
+		//PositionalTupleExpressionList
+		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_1_3_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_1_3_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_1_3_2() { return cRightSquareBracketKeyword_1_3_2; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} '->' //kind=ValueArrowFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //			// TODO '(' parameter ',' ... ',' parameter ')'
+		////			| kind=ValueParameterExpressionKind
+		////				arg=MixTupleExpressionList  ')'
+		//)? ({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //				// TODO '(' parameter ',' ... ',' parameter ')'
+		////				| kind=ValueParameterExpressionKind
+		////					arg=MixTupleExpressionList  ')'
+		//)?)*)?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_2_0() { return cValueElementSpecificationTargetAction_2_0; }
+		
+		//'->'
+		public Keyword getHyphenMinusGreaterThanSignKeyword_2_1() { return cHyphenMinusGreaterThanSignKeyword_2_1; }
+		
+		////kind=ValueArrowFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_2_2() { return cElementAssignment_2_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_2_2_0() { return cElementNamedElementCrossReference_2_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_2_0_1; }
+		
+		//(kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //			// TODO '(' parameter ',' ... ',' parameter ')'
+		////			| kind=ValueParameterExpressionKind
+		////				arg=MixTupleExpressionList  ')'
+		//)?
+		public Group getGroup_2_3() { return cGroup_2_3; }
+		
+		//kind=ValueIndexExpressionKind
+		public Assignment getKindAssignment_2_3_0() { return cKindAssignment_2_3_0; }
+		
+		//ValueIndexExpressionKind
+		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_2_3_0_0; }
+		
+		//arg=PositionalTupleExpressionList
+		public Assignment getArgAssignment_2_3_1() { return cArgAssignment_2_3_1; }
+		
+		//PositionalTupleExpressionList
+		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_2_3_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_2_3_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_2_3_2() { return cRightSquareBracketKeyword_2_3_2; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} '.' //kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //				// TODO '(' parameter ',' ... ',' parameter ')'
+		////				| kind=ValueParameterExpressionKind
+		////					arg=MixTupleExpressionList  ')'
+		//)?)*
+		public Group getGroup_2_4() { return cGroup_2_4; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_2_4_0() { return cValueElementSpecificationTargetAction_2_4_0; }
+		
+		//'.'
+		public Keyword getFullStopKeyword_2_4_1() { return cFullStopKeyword_2_4_1; }
+		
+		////kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_2_4_2() { return cElementAssignment_2_4_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_2_4_2_0() { return cElementNamedElementCrossReference_2_4_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1; }
+		
+		//(kind=ValueIndexExpressionKind arg=PositionalTupleExpressionList ']' //				// TODO '(' parameter ',' ... ',' parameter ')'
+		////				| kind=ValueParameterExpressionKind
+		////					arg=MixTupleExpressionList  ')'
+		//)?
+		public Group getGroup_2_4_3() { return cGroup_2_4_3; }
+		
+		//kind=ValueIndexExpressionKind
+		public Assignment getKindAssignment_2_4_3_0() { return cKindAssignment_2_4_3_0; }
+		
+		//ValueIndexExpressionKind
+		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0; }
+		
+		//arg=PositionalTupleExpressionList
+		public Assignment getArgAssignment_2_4_3_1() { return cArgAssignment_2_4_3_1; }
+		
+		//PositionalTupleExpressionList
+		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0; }
+		
+		//']'
+		public Keyword getRightSquareBracketKeyword_2_4_3_2() { return cRightSquareBracketKeyword_2_4_3_2; }
+	}
+	public class ValuePureNamedMachineExpressionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cLiteralPureReferenceExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Action cValueElementSpecificationTargetAction_1_0 = (Action)cGroup_1.eContents().get(0);
+		private final Assignment cKindAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+		private final RuleCall cKindValueDotFieldExpressionKindEnumRuleCall_1_1_0 = (RuleCall)cKindAssignment_1_1.eContents().get(0);
+		private final Assignment cElementAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_1_2_0 = (CrossReference)cElementAssignment_1_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_1_2_0_1 = (RuleCall)cElementNamedElementCrossReference_1_2_0.eContents().get(1);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Action cValueElementSpecificationTargetAction_2_0 = (Action)cGroup_2.eContents().get(0);
+		private final Assignment cKindAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cKindValueArrowFieldExpressionKindEnumRuleCall_2_1_0 = (RuleCall)cKindAssignment_2_1.eContents().get(0);
+		private final Assignment cElementAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_2_2_0 = (CrossReference)cElementAssignment_2_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_2_0.eContents().get(1);
+		private final Group cGroup_2_3 = (Group)cGroup_2.eContents().get(3);
+		private final Action cValueElementSpecificationTargetAction_2_3_0 = (Action)cGroup_2_3.eContents().get(0);
+		private final Assignment cKindAssignment_2_3_1 = (Assignment)cGroup_2_3.eContents().get(1);
+		private final RuleCall cKindValueDotFieldExpressionKindEnumRuleCall_2_3_1_0 = (RuleCall)cKindAssignment_2_3_1.eContents().get(0);
+		private final Assignment cElementAssignment_2_3_2 = (Assignment)cGroup_2_3.eContents().get(2);
+		private final CrossReference cElementNamedElementCrossReference_2_3_2_0 = (CrossReference)cElementAssignment_2_3_2.eContents().get(0);
+		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_3_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_3_2_0.eContents().get(1);
+		
+		////ValuePureNamedElementExpression
+		////ValuePureNamedElementExpression returns fmlExpr::Expression
+		////	: LiteralPureReferenceExpression
+		////
+		////		// '.' element
+		////		( { fmlExpr::ValueElementSpecification.target=current }
+		////			kind=ValueDotFieldExpressionKind
+		////			element=[fmlCommon::NamedElement|ESIdentifier]
+		////		)*
+		////
+		////		// '->' element
+		////		( { fmlExpr::ValueElementSpecification.target=current }
+		////			kind=ValueArrowFieldExpressionKind
+		////			element=[fmlCommon::NamedElement|ESIdentifier]
+		////
+		////			// '.' element
+		////			( { fmlExpr::ValueElementSpecification.target=current }
+		////				kind=ValueDotFieldExpressionKind
+		////				element=[fmlCommon::NamedElement|ESIdentifier]
+		////			)*
+		////		)?
+		////	;
+		//ValuePureNamedMachineExpression fmlExpr::Expression:
+		//	LiteralPureReferenceExpression ({fmlExpr::ValueElementSpecification.target=current} kind=ValueDotFieldExpressionKind
+		//	element=[fmlCommon::NamedElement|ESIdentifier])* ({fmlExpr::ValueElementSpecification.target=current}
+		//	kind=ValueArrowFieldExpressionKind
+		//	element=[fmlCommon::NamedElement|ESIdentifier] ({fmlExpr::ValueElementSpecification.target=current}
+		//	kind=ValueDotFieldExpressionKind
+		//	element=[fmlCommon::NamedElement|ESIdentifier])*)?
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LiteralPureReferenceExpression ({fmlExpr::ValueElementSpecification.target=current} kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier])* ({fmlExpr::ValueElementSpecification.target=current}
+		//kind=ValueArrowFieldExpressionKind element=[fmlCommon::NamedElement|ESIdentifier]
+		//({fmlExpr::ValueElementSpecification.target=current} kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier])*)?
+		public Group getGroup() { return cGroup; }
+		
+		//LiteralPureReferenceExpression
+		public RuleCall getLiteralPureReferenceExpressionParserRuleCall_0() { return cLiteralPureReferenceExpressionParserRuleCall_0; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier])*
+		public Group getGroup_1() { return cGroup_1; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_1_0() { return cValueElementSpecificationTargetAction_1_0; }
+		
+		//kind=ValueDotFieldExpressionKind
+		public Assignment getKindAssignment_1_1() { return cKindAssignment_1_1; }
+		
+		//ValueDotFieldExpressionKind
+		public RuleCall getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0() { return cKindValueDotFieldExpressionKindEnumRuleCall_1_1_0; }
+		
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_1_2() { return cElementAssignment_1_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_1_2_0() { return cElementNamedElementCrossReference_1_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_1_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_1_2_0_1; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} kind=ValueArrowFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier] ({fmlExpr::ValueElementSpecification.target=current}
+		//kind=ValueDotFieldExpressionKind element=[fmlCommon::NamedElement|ESIdentifier])*)?
+		public Group getGroup_2() { return cGroup_2; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_2_0() { return cValueElementSpecificationTargetAction_2_0; }
+		
+		//kind=ValueArrowFieldExpressionKind
+		public Assignment getKindAssignment_2_1() { return cKindAssignment_2_1; }
+		
+		//ValueArrowFieldExpressionKind
+		public RuleCall getKindValueArrowFieldExpressionKindEnumRuleCall_2_1_0() { return cKindValueArrowFieldExpressionKindEnumRuleCall_2_1_0; }
+		
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_2_2() { return cElementAssignment_2_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_2_2_0() { return cElementNamedElementCrossReference_2_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_2_0_1; }
+		
+		//({fmlExpr::ValueElementSpecification.target=current} kind=ValueDotFieldExpressionKind
+		//element=[fmlCommon::NamedElement|ESIdentifier])*
+		public Group getGroup_2_3() { return cGroup_2_3; }
+		
+		//{fmlExpr::ValueElementSpecification.target=current}
+		public Action getValueElementSpecificationTargetAction_2_3_0() { return cValueElementSpecificationTargetAction_2_3_0; }
+		
+		//kind=ValueDotFieldExpressionKind
+		public Assignment getKindAssignment_2_3_1() { return cKindAssignment_2_3_1; }
+		
+		//ValueDotFieldExpressionKind
+		public RuleCall getKindValueDotFieldExpressionKindEnumRuleCall_2_3_1_0() { return cKindValueDotFieldExpressionKindEnumRuleCall_2_3_1_0; }
+		
+		//element=[fmlCommon::NamedElement|ESIdentifier]
+		public Assignment getElementAssignment_2_3_2() { return cElementAssignment_2_3_2; }
+		
+		//[fmlCommon::NamedElement|ESIdentifier]
+		public CrossReference getElementNamedElementCrossReference_2_3_2_0() { return cElementNamedElementCrossReference_2_3_2_0; }
+		
+		//ESIdentifier
+		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_3_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_3_2_0_1; }
+	}
+	
+	public class VisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cPublicEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cPublicPublicKeyword_0_0 = (Keyword)cPublicEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cPrivateEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cPrivatePrivateKeyword_1_0 = (Keyword)cPrivateEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cProtectedEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cProtectedProtectedKeyword_2_0 = (Keyword)cProtectedEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cPackageEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cPackagePackageKeyword_3_0 = (Keyword)cPackageEnumLiteralDeclaration_3.eContents().get(0);
+		
+		//enum VisibilityKind returns fmlCommon::VisibilityKind:
+		//	public | private | protected | package;
+		public EnumRule getRule() { return rule; }
+		
+		//public | private | protected | package
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//public
+		public EnumLiteralDeclaration getPublicEnumLiteralDeclaration_0() { return cPublicEnumLiteralDeclaration_0; }
+		
+		//'public'
+		public Keyword getPublicPublicKeyword_0_0() { return cPublicPublicKeyword_0_0; }
+		
+		//private
+		public EnumLiteralDeclaration getPrivateEnumLiteralDeclaration_1() { return cPrivateEnumLiteralDeclaration_1; }
+		
+		//'private'
+		public Keyword getPrivatePrivateKeyword_1_0() { return cPrivatePrivateKeyword_1_0; }
+		
+		//protected
+		public EnumLiteralDeclaration getProtectedEnumLiteralDeclaration_2() { return cProtectedEnumLiteralDeclaration_2; }
+		
+		//'protected'
+		public Keyword getProtectedProtectedKeyword_2_0() { return cProtectedProtectedKeyword_2_0; }
+		
+		//package
+		public EnumLiteralDeclaration getPackageEnumLiteralDeclaration_3() { return cPackageEnumLiteralDeclaration_3; }
+		
+		//'package'
+		public Keyword getPackagePackageKeyword_3_0() { return cPackagePackageKeyword_3_0; }
+	}
+	public class DesignKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DesignKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cModelEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cModelModelKeyword_0_0 = (Keyword)cModelEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cPrototypeEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cPrototypePrototypeKeyword_1_0 = (Keyword)cPrototypeEnumLiteralDeclaration_1.eContents().get(0);
+		
+		//enum DesignKind returns fmlInfra::DesignKind:
+		//	model | prototype;
+		public EnumRule getRule() { return rule; }
+		
+		//model | prototype
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//model
+		public EnumLiteralDeclaration getModelEnumLiteralDeclaration_0() { return cModelEnumLiteralDeclaration_0; }
+		
+		//'model'
+		public Keyword getModelModelKeyword_0_0() { return cModelModelKeyword_0_0; }
+		
+		//prototype
+		public EnumLiteralDeclaration getPrototypeEnumLiteralDeclaration_1() { return cPrototypeEnumLiteralDeclaration_1; }
+		
+		//'prototype'
+		public Keyword getPrototypePrototypeKeyword_1_0() { return cPrototypePrototypeKeyword_1_0; }
+	}
+	public class DesignInstanceKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DesignInstanceKind");
+		private final EnumLiteralDeclaration cInstanceEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cInstanceInstanceKeyword_0 = (Keyword)cInstanceEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum DesignInstanceKind returns fmlInfra::DesignKind:
+		//	instance;
+		public EnumRule getRule() { return rule; }
+		
+		//instance
+		public EnumLiteralDeclaration getInstanceEnumLiteralDeclaration() { return cInstanceEnumLiteralDeclaration; }
+		
+		//'instance'
+		public Keyword getInstanceInstanceKeyword_0() { return cInstanceInstanceKeyword_0; }
+	}
+	public class PseudostateKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PseudostateKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cJunctionEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cJunctionJunctionKeyword_0_0 = (Keyword)cJunctionEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cChoiceEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cChoiceChoiceKeyword_1_0 = (Keyword)cChoiceEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cJunctionEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cJunctionEntryPointKeyword_2_0 = (Keyword)cJunctionEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cChoiceEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cChoiceExitPointKeyword_3_0 = (Keyword)cChoiceEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cForkEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cForkForkKeyword_4_0 = (Keyword)cForkEnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cJoinEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cJoinJoinKeyword_5_0 = (Keyword)cJoinEnumLiteralDeclaration_5.eContents().get(0);
+		private final EnumLiteralDeclaration cDeepHistoryEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
+		private final Keyword cDeepHistoryDhistoryKeyword_6_0 = (Keyword)cDeepHistoryEnumLiteralDeclaration_6.eContents().get(0);
+		private final EnumLiteralDeclaration cShallowHistoryEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
+		private final Keyword cShallowHistoryShistoryKeyword_7_0 = (Keyword)cShallowHistoryEnumLiteralDeclaration_7.eContents().get(0);
+		
+		//enum PseudostateKind returns fmlStmchn::PseudostateKind:
+		//	junction | choice | junction='entryPoint'
+		//	| choice='exitPoint'
+		//	//	| initial ='initial'
+		//	//		
+		//	//	| terminate='terminal'
+		//	//	| return   ='return'
+		//
+		//	| fork | join | deepHistory='dhistory'
+		//	| shallowHistory='shistory';
+		public EnumRule getRule() { return rule; }
+		
+		//junction | choice | junction='entryPoint' | choice='exitPoint' //	| initial ='initial'
+		////		
+		////	| terminate='terminal'
+		////	| return   ='return'
+		//| fork | join | deepHistory='dhistory' | shallowHistory='shistory'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//junction
+		public EnumLiteralDeclaration getJunctionEnumLiteralDeclaration_0() { return cJunctionEnumLiteralDeclaration_0; }
+		
+		//'junction'
+		public Keyword getJunctionJunctionKeyword_0_0() { return cJunctionJunctionKeyword_0_0; }
+		
+		//choice
+		public EnumLiteralDeclaration getChoiceEnumLiteralDeclaration_1() { return cChoiceEnumLiteralDeclaration_1; }
+		
+		//'choice'
+		public Keyword getChoiceChoiceKeyword_1_0() { return cChoiceChoiceKeyword_1_0; }
+		
+		//junction='entryPoint'
+		public EnumLiteralDeclaration getJunctionEnumLiteralDeclaration_2() { return cJunctionEnumLiteralDeclaration_2; }
+		
+		//'entryPoint'
+		public Keyword getJunctionEntryPointKeyword_2_0() { return cJunctionEntryPointKeyword_2_0; }
+		
+		//choice='exitPoint'
+		public EnumLiteralDeclaration getChoiceEnumLiteralDeclaration_3() { return cChoiceEnumLiteralDeclaration_3; }
+		
+		//'exitPoint'
+		public Keyword getChoiceExitPointKeyword_3_0() { return cChoiceExitPointKeyword_3_0; }
+		
+		//fork
+		public EnumLiteralDeclaration getForkEnumLiteralDeclaration_4() { return cForkEnumLiteralDeclaration_4; }
+		
+		//'fork'
+		public Keyword getForkForkKeyword_4_0() { return cForkForkKeyword_4_0; }
+		
+		//join
+		public EnumLiteralDeclaration getJoinEnumLiteralDeclaration_5() { return cJoinEnumLiteralDeclaration_5; }
+		
+		//'join'
+		public Keyword getJoinJoinKeyword_5_0() { return cJoinJoinKeyword_5_0; }
+		
+		//deepHistory='dhistory'
+		public EnumLiteralDeclaration getDeepHistoryEnumLiteralDeclaration_6() { return cDeepHistoryEnumLiteralDeclaration_6; }
+		
+		//'dhistory'
+		public Keyword getDeepHistoryDhistoryKeyword_6_0() { return cDeepHistoryDhistoryKeyword_6_0; }
+		
+		//shallowHistory='shistory'
+		public EnumLiteralDeclaration getShallowHistoryEnumLiteralDeclaration_7() { return cShallowHistoryEnumLiteralDeclaration_7; }
+		
+		//'shistory'
+		public Keyword getShallowHistoryShistoryKeyword_7_0() { return cShallowHistoryShistoryKeyword_7_0; }
+	}
+	public class PseudostateInitialKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PseudostateInitialKind");
+		private final EnumLiteralDeclaration cInitialEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cInitialInitialKeyword_0 = (Keyword)cInitialEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PseudostateInitialKind returns fmlStmchn::PseudostateKind:
+		//	initial;
+		public EnumRule getRule() { return rule; }
+		
+		//initial
+		public EnumLiteralDeclaration getInitialEnumLiteralDeclaration() { return cInitialEnumLiteralDeclaration; }
+		
+		//'initial'
+		public Keyword getInitialInitialKeyword_0() { return cInitialInitialKeyword_0; }
+	}
+	public class EndingPseudostateKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EndingPseudostateKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cTerminateEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cTerminateTerminalKeyword_0_0 = (Keyword)cTerminateEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cReturnEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cReturnReturnKeyword_1_0 = (Keyword)cReturnEnumLiteralDeclaration_1.eContents().get(0);
+		
+		//enum EndingPseudostateKind returns fmlStmchn::PseudostateKind:
+		//	terminate='terminal'
+		//	| return;
+		public EnumRule getRule() { return rule; }
+		
+		//terminate='terminal' | return
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//terminate='terminal'
+		public EnumLiteralDeclaration getTerminateEnumLiteralDeclaration_0() { return cTerminateEnumLiteralDeclaration_0; }
+		
+		//'terminal'
+		public Keyword getTerminateTerminalKeyword_0_0() { return cTerminateTerminalKeyword_0_0; }
+		
+		//return
+		public EnumLiteralDeclaration getReturnEnumLiteralDeclaration_1() { return cReturnEnumLiteralDeclaration_1; }
+		
+		//'return'
+		public Keyword getReturnReturnKeyword_1_0() { return cReturnReturnKeyword_1_0; }
+	}
+	public class ComProtocolKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComProtocolKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cEnvEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cEnvEnvKeyword_0_0 = (Keyword)cEnvEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cRdvEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cRdvRdvKeyword_1_0 = (Keyword)cRdvEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cMulti_rdvEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cMulti_rdvMulti_rdvKeyword_2_0 = (Keyword)cMulti_rdvEnumLiteralDeclaration_2.eContents().get(0);
+		
+		//enum ComProtocolKind returns fmlInfra::ComProtocolKind:
+		//	env | rdv | multi_rdv;
+		public EnumRule getRule() { return rule; }
+		
+		//env | rdv | multi_rdv
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//env
+		public EnumLiteralDeclaration getEnvEnumLiteralDeclaration_0() { return cEnvEnumLiteralDeclaration_0; }
+		
+		//'env'
+		public Keyword getEnvEnvKeyword_0_0() { return cEnvEnvKeyword_0_0; }
+		
+		//rdv
+		public EnumLiteralDeclaration getRdvEnumLiteralDeclaration_1() { return cRdvEnumLiteralDeclaration_1; }
+		
+		//'rdv'
+		public Keyword getRdvRdvKeyword_1_0() { return cRdvRdvKeyword_1_0; }
+		
+		//multi_rdv
+		public EnumLiteralDeclaration getMulti_rdvEnumLiteralDeclaration_2() { return cMulti_rdvEnumLiteralDeclaration_2; }
+		
+		//'multi_rdv'
+		public Keyword getMulti_rdvMulti_rdvKeyword_2_0() { return cMulti_rdvMulti_rdvKeyword_2_0; }
+	}
+	public class ComEnvRdvProtocolKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComEnvRdvProtocolKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cEnvEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cEnvEnvKeyword_0_0 = (Keyword)cEnvEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cRdvEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cRdvRdvKeyword_1_0 = (Keyword)cRdvEnumLiteralDeclaration_1.eContents().get(0);
+		
+		//enum ComEnvRdvProtocolKind returns fmlInfra::ComProtocolKind:
+		//	env | rdv;
+		public EnumRule getRule() { return rule; }
+		
+		//env | rdv
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//env
+		public EnumLiteralDeclaration getEnvEnumLiteralDeclaration_0() { return cEnvEnumLiteralDeclaration_0; }
+		
+		//'env'
+		public Keyword getEnvEnvKeyword_0_0() { return cEnvEnvKeyword_0_0; }
+		
+		//rdv
+		public EnumLiteralDeclaration getRdvEnumLiteralDeclaration_1() { return cRdvEnumLiteralDeclaration_1; }
+		
+		//'rdv'
+		public Keyword getRdvRdvKeyword_1_0() { return cRdvRdvKeyword_1_0; }
+	}
+	public class ComMultiRdvProtocolKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComMultiRdvProtocolKind");
+		private final EnumLiteralDeclaration cMulti_rdvEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cMulti_rdvMulti_rdvKeyword_0 = (Keyword)cMulti_rdvEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ComMultiRdvProtocolKind returns fmlInfra::ComProtocolKind:
+		//	multi_rdv;
+		public EnumRule getRule() { return rule; }
+		
+		//multi_rdv
+		public EnumLiteralDeclaration getMulti_rdvEnumLiteralDeclaration() { return cMulti_rdvEnumLiteralDeclaration; }
+		
+		//'multi_rdv'
+		public Keyword getMulti_rdvMulti_rdvKeyword_0() { return cMulti_rdvMulti_rdvKeyword_0; }
+	}
+	public class BufferProtocolKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
+		private final EnumLiteralDeclaration cBufferEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cBufferBufferKeyword_0 = (Keyword)cBufferEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum BufferProtocolKind returns fmlInfra::ComProtocolKind:
+		//	buffer;
+		public EnumRule getRule() { return rule; }
+		
+		//buffer
+		public EnumLiteralDeclaration getBufferEnumLiteralDeclaration() { return cBufferEnumLiteralDeclaration; }
+		
+		//'buffer'
+		public Keyword getBufferBufferKeyword_0() { return cBufferBufferKeyword_0; }
+	}
+	public class ComCastKingElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComCastKing");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cUnicastEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cUnicastUnicastKeyword_0_0 = (Keyword)cUnicastEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cAnycastEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cAnycastAnycastKeyword_1_0 = (Keyword)cAnycastEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cMulticastEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cMulticastMulticastKeyword_2_0 = (Keyword)cMulticastEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cBroadcastEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cBroadcastBroadcastKeyword_3_0 = (Keyword)cBroadcastEnumLiteralDeclaration_3.eContents().get(0);
+		
+		//enum ComCastKing returns fmlInfra::ComCastKind:
+		//	unicast | anycast | multicast | broadcast;
+		public EnumRule getRule() { return rule; }
+		
+		//unicast | anycast | multicast | broadcast
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//unicast
+		public EnumLiteralDeclaration getUnicastEnumLiteralDeclaration_0() { return cUnicastEnumLiteralDeclaration_0; }
+		
+		//'unicast'
+		public Keyword getUnicastUnicastKeyword_0_0() { return cUnicastUnicastKeyword_0_0; }
+		
+		//anycast
+		public EnumLiteralDeclaration getAnycastEnumLiteralDeclaration_1() { return cAnycastEnumLiteralDeclaration_1; }
+		
+		//'anycast'
+		public Keyword getAnycastAnycastKeyword_1_0() { return cAnycastAnycastKeyword_1_0; }
+		
+		//multicast
+		public EnumLiteralDeclaration getMulticastEnumLiteralDeclaration_2() { return cMulticastEnumLiteralDeclaration_2; }
+		
+		//'multicast'
+		public Keyword getMulticastMulticastKeyword_2_0() { return cMulticastMulticastKeyword_2_0; }
+		
+		//broadcast
+		public EnumLiteralDeclaration getBroadcastEnumLiteralDeclaration_3() { return cBroadcastEnumLiteralDeclaration_3; }
+		
+		//'broadcast'
+		public Keyword getBroadcastBroadcastKeyword_3_0() { return cBroadcastBroadcastKeyword_3_0; }
+	}
+	public class PrimitiveNumberSignElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cPositiveEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cPositivePlusSignKeyword_0_0 = (Keyword)cPositiveEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cPositive_strictEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cPositive_strictPlusSignPlusSignKeyword_1_0 = (Keyword)cPositive_strictEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cNegativeEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cNegativeHyphenMinusKeyword_2_0 = (Keyword)cNegativeEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cNegative_strictEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cNegative_strictHyphenMinusHyphenMinusKeyword_3_0 = (Keyword)cNegative_strictEnumLiteralDeclaration_3.eContents().get(0);
+		
+		//enum PrimitiveNumberSign returns fmlType::PrimitiveNumberSign:
+		//	positive='+'
+		//	| positive_strict='++'
+		//	| negative='-'
+		//	| negative_strict='--';
+		public EnumRule getRule() { return rule; }
+		
+		//positive='+' | positive_strict='++' | negative='-' | negative_strict='--'
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//positive='+'
+		public EnumLiteralDeclaration getPositiveEnumLiteralDeclaration_0() { return cPositiveEnumLiteralDeclaration_0; }
+		
+		//'+'
+		public Keyword getPositivePlusSignKeyword_0_0() { return cPositivePlusSignKeyword_0_0; }
+		
+		//positive_strict='++'
+		public EnumLiteralDeclaration getPositive_strictEnumLiteralDeclaration_1() { return cPositive_strictEnumLiteralDeclaration_1; }
+		
+		//'++'
+		public Keyword getPositive_strictPlusSignPlusSignKeyword_1_0() { return cPositive_strictPlusSignPlusSignKeyword_1_0; }
+		
+		//negative='-'
+		public EnumLiteralDeclaration getNegativeEnumLiteralDeclaration_2() { return cNegativeEnumLiteralDeclaration_2; }
+		
+		//'-'
+		public Keyword getNegativeHyphenMinusKeyword_2_0() { return cNegativeHyphenMinusKeyword_2_0; }
+		
+		//negative_strict='--'
+		public EnumLiteralDeclaration getNegative_strictEnumLiteralDeclaration_3() { return cNegative_strictEnumLiteralDeclaration_3; }
+		
+		//'--'
+		public Keyword getNegative_strictHyphenMinusHyphenMinusKeyword_3_0() { return cNegative_strictHyphenMinusHyphenMinusKeyword_3_0; }
+	}
+	public class PrimitiveInstanceKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveInstanceKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cBufferEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cBufferBufferKeyword_0_0 = (Keyword)cBufferEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cMessageEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cMessageMessageKeyword_1_0 = (Keyword)cMessageEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cPortEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cPortPortKeyword_2_0 = (Keyword)cPortEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cSignalEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cSignalSignalKeyword_3_0 = (Keyword)cSignalEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cMachineEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cMachineMachineKeyword_4_0 = (Keyword)cMachineEnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cVertexEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cVertexVertexKeyword_5_0 = (Keyword)cVertexEnumLiteralDeclaration_5.eContents().get(0);
+		
+		//enum PrimitiveInstanceKind returns fmlType::PrimitiveInstanceKind:
+		//	buffer | message | port | signal | machine | vertex;
+		public EnumRule getRule() { return rule; }
+		
+		//buffer | message | port | signal | machine | vertex
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//buffer
+		public EnumLiteralDeclaration getBufferEnumLiteralDeclaration_0() { return cBufferEnumLiteralDeclaration_0; }
+		
+		//'buffer'
+		public Keyword getBufferBufferKeyword_0_0() { return cBufferBufferKeyword_0_0; }
+		
+		//message
+		public EnumLiteralDeclaration getMessageEnumLiteralDeclaration_1() { return cMessageEnumLiteralDeclaration_1; }
+		
+		//'message'
+		public Keyword getMessageMessageKeyword_1_0() { return cMessageMessageKeyword_1_0; }
+		
+		//port
+		public EnumLiteralDeclaration getPortEnumLiteralDeclaration_2() { return cPortEnumLiteralDeclaration_2; }
+		
+		//'port'
+		public Keyword getPortPortKeyword_2_0() { return cPortPortKeyword_2_0; }
+		
+		//signal
+		public EnumLiteralDeclaration getSignalEnumLiteralDeclaration_3() { return cSignalEnumLiteralDeclaration_3; }
+		
+		//'signal'
+		public Keyword getSignalSignalKeyword_3_0() { return cSignalSignalKeyword_3_0; }
+		
+		//machine
+		public EnumLiteralDeclaration getMachineEnumLiteralDeclaration_4() { return cMachineEnumLiteralDeclaration_4; }
+		
+		//'machine'
+		public Keyword getMachineMachineKeyword_4_0() { return cMachineMachineKeyword_4_0; }
+		
+		//vertex
+		public EnumLiteralDeclaration getVertexEnumLiteralDeclaration_5() { return cVertexEnumLiteralDeclaration_5; }
+		
+		//'vertex'
+		public Keyword getVertexVertexKeyword_5_0() { return cVertexVertexKeyword_5_0; }
+	}
+	public class CollectionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cVectorEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cVectorVectorKeyword_0_0 = (Keyword)cVectorEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cRvectorEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cRvectorRvectorKeyword_1_0 = (Keyword)cRvectorEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cListEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cListListKeyword_2_0 = (Keyword)cListEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cSetEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cSetSetKeyword_3_0 = (Keyword)cSetEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cBagEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cBagBagKeyword_4_0 = (Keyword)cBagEnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cFifoEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cFifoFifoKeyword_5_0 = (Keyword)cFifoEnumLiteralDeclaration_5.eContents().get(0);
+		private final EnumLiteralDeclaration cLifoEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
+		private final Keyword cLifoLifoKeyword_6_0 = (Keyword)cLifoEnumLiteralDeclaration_6.eContents().get(0);
+		
+		//enum CollectionKind returns fmlType::CollectionKind:
+		//	vector | rvector | list | set | bag | fifo | lifo;
+		public EnumRule getRule() { return rule; }
+		
+		//vector | rvector | list | set | bag | fifo | lifo
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//vector
+		public EnumLiteralDeclaration getVectorEnumLiteralDeclaration_0() { return cVectorEnumLiteralDeclaration_0; }
+		
+		//'vector'
+		public Keyword getVectorVectorKeyword_0_0() { return cVectorVectorKeyword_0_0; }
+		
+		//rvector
+		public EnumLiteralDeclaration getRvectorEnumLiteralDeclaration_1() { return cRvectorEnumLiteralDeclaration_1; }
+		
+		//'rvector'
+		public Keyword getRvectorRvectorKeyword_1_0() { return cRvectorRvectorKeyword_1_0; }
+		
+		//list
+		public EnumLiteralDeclaration getListEnumLiteralDeclaration_2() { return cListEnumLiteralDeclaration_2; }
+		
+		//'list'
+		public Keyword getListListKeyword_2_0() { return cListListKeyword_2_0; }
+		
+		//set
+		public EnumLiteralDeclaration getSetEnumLiteralDeclaration_3() { return cSetEnumLiteralDeclaration_3; }
+		
+		//'set'
+		public Keyword getSetSetKeyword_3_0() { return cSetSetKeyword_3_0; }
+		
+		//bag
+		public EnumLiteralDeclaration getBagEnumLiteralDeclaration_4() { return cBagEnumLiteralDeclaration_4; }
+		
+		//'bag'
+		public Keyword getBagBagKeyword_4_0() { return cBagBagKeyword_4_0; }
+		
+		//fifo
+		public EnumLiteralDeclaration getFifoEnumLiteralDeclaration_5() { return cFifoEnumLiteralDeclaration_5; }
+		
+		//'fifo'
+		public Keyword getFifoFifoKeyword_5_0() { return cFifoFifoKeyword_5_0; }
+		
+		//lifo
+		public EnumLiteralDeclaration getLifoEnumLiteralDeclaration_6() { return cLifoEnumLiteralDeclaration_6; }
+		
+		//'lifo'
+		public Keyword getLifoLifoKeyword_6_0() { return cLifoLifoKeyword_6_0; }
+	}
+	public class PublicVariableVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PublicVariableVisibilityKind");
+		private final EnumLiteralDeclaration cPublicEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPublicVarKeyword_0 = (Keyword)cPublicEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PublicVariableVisibilityKind returns fmlCommon::VisibilityKind:
+		//	public='var'
+		//	//	| public ='val'
+		//	//	| public ='const'
+		//;
+		public EnumRule getRule() { return rule; }
+		
+		//public='var'
+		public EnumLiteralDeclaration getPublicEnumLiteralDeclaration() { return cPublicEnumLiteralDeclaration; }
+		
+		//'var'
+		public Keyword getPublicVarKeyword_0() { return cPublicVarKeyword_0; }
+	}
+	public class ProtectedVariableVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ProtectedVariableVisibilityKind");
+		private final EnumLiteralDeclaration cProtectedEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cProtectedVarKeyword_0 = (Keyword)cProtectedEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ProtectedVariableVisibilityKind returns fmlCommon::VisibilityKind:
+		//	protected='var'
+		//	//	| protected ='val'
+		//	//	| protected ='const'
+		//;
+		public EnumRule getRule() { return rule; }
+		
+		//protected='var'
+		public EnumLiteralDeclaration getProtectedEnumLiteralDeclaration() { return cProtectedEnumLiteralDeclaration; }
+		
+		//'var'
+		public Keyword getProtectedVarKeyword_0() { return cProtectedVarKeyword_0; }
+	}
+	public class PrivateVariableVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrivateVariableVisibilityKind");
+		private final EnumLiteralDeclaration cPrivateEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPrivateVarKeyword_0 = (Keyword)cPrivateEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PrivateVariableVisibilityKind returns fmlCommon::VisibilityKind:
+		//	private='var'
+		//	//	| private ='val'
+		//	//	| private ='const'
+		//;
+		public EnumRule getRule() { return rule; }
+		
+		//private='var'
+		public EnumLiteralDeclaration getPrivateEnumLiteralDeclaration() { return cPrivateEnumLiteralDeclaration; }
+		
+		//'var'
+		public Keyword getPrivateVarKeyword_0() { return cPrivateVarKeyword_0; }
+	}
+	public class ParameterDirectionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterDirectionKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cInEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cInInKeyword_0_0 = (Keyword)cInEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cInoutEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cInoutInoutKeyword_1_0 = (Keyword)cInoutEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cOutEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cOutOutKeyword_2_0 = (Keyword)cOutEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cReturnEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cReturnReturnKeyword_3_0 = (Keyword)cReturnEnumLiteralDeclaration_3.eContents().get(0);
+		
+		//enum ParameterDirectionKind returns fmlInfra::ParameterDirectionKind:
+		//	in | inout | out | return;
+		public EnumRule getRule() { return rule; }
+		
+		//in | inout | out | return
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//in
+		public EnumLiteralDeclaration getInEnumLiteralDeclaration_0() { return cInEnumLiteralDeclaration_0; }
+		
+		//'in'
+		public Keyword getInInKeyword_0_0() { return cInInKeyword_0_0; }
+		
+		//inout
+		public EnumLiteralDeclaration getInoutEnumLiteralDeclaration_1() { return cInoutEnumLiteralDeclaration_1; }
+		
+		//'inout'
+		public Keyword getInoutInoutKeyword_1_0() { return cInoutInoutKeyword_1_0; }
+		
+		//out
+		public EnumLiteralDeclaration getOutEnumLiteralDeclaration_2() { return cOutEnumLiteralDeclaration_2; }
+		
+		//'out'
+		public Keyword getOutOutKeyword_2_0() { return cOutOutKeyword_2_0; }
+		
+		//return
+		public EnumLiteralDeclaration getReturnEnumLiteralDeclaration_3() { return cReturnEnumLiteralDeclaration_3; }
+		
+		//'return'
+		public Keyword getReturnReturnKeyword_3_0() { return cReturnReturnKeyword_3_0; }
+	}
+	public class BlockParameterDirectionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BlockParameterDirectionKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cInEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cInInputKeyword_0_0 = (Keyword)cInEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cInoutEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cInoutInoutKeyword_1_0 = (Keyword)cInoutEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cOutEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cOutOutputKeyword_2_0 = (Keyword)cOutEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cReturnEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cReturnReturnKeyword_3_0 = (Keyword)cReturnEnumLiteralDeclaration_3.eContents().get(0);
+		
+		//enum BlockParameterDirectionKind returns fmlInfra::ParameterDirectionKind:
+		//	in='input'
+		//	| inout | out='output'
+		//	| return;
+		public EnumRule getRule() { return rule; }
+		
+		//in='input' | inout | out='output' | return
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//in='input'
+		public EnumLiteralDeclaration getInEnumLiteralDeclaration_0() { return cInEnumLiteralDeclaration_0; }
+		
+		//'input'
+		public Keyword getInInputKeyword_0_0() { return cInInputKeyword_0_0; }
+		
+		//inout
+		public EnumLiteralDeclaration getInoutEnumLiteralDeclaration_1() { return cInoutEnumLiteralDeclaration_1; }
+		
+		//'inout'
+		public Keyword getInoutInoutKeyword_1_0() { return cInoutInoutKeyword_1_0; }
+		
+		//out='output'
+		public EnumLiteralDeclaration getOutEnumLiteralDeclaration_2() { return cOutEnumLiteralDeclaration_2; }
+		
+		//'output'
+		public Keyword getOutOutputKeyword_2_0() { return cOutOutputKeyword_2_0; }
+		
+		//return
+		public EnumLiteralDeclaration getReturnEnumLiteralDeclaration_3() { return cReturnEnumLiteralDeclaration_3; }
+		
+		//'return'
+		public Keyword getReturnReturnKeyword_3_0() { return cReturnReturnKeyword_3_0; }
+	}
+	public class ParameterInputDirectionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterInputDirectionKind");
+		private final EnumLiteralDeclaration cInEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cInVarKeyword_0 = (Keyword)cInEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ParameterInputDirectionKind returns fmlInfra::ParameterDirectionKind:
+		//	in='var';
+		public EnumRule getRule() { return rule; }
+		
+		//in='var'
+		public EnumLiteralDeclaration getInEnumLiteralDeclaration() { return cInEnumLiteralDeclaration; }
+		
+		//'var'
+		public Keyword getInVarKeyword_0() { return cInVarKeyword_0; }
+	}
+	public class ParameterInoutDirectionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterInoutDirectionKind");
+		private final EnumLiteralDeclaration cInoutEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cInoutVarKeyword_0 = (Keyword)cInoutEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ParameterInoutDirectionKind returns fmlInfra::ParameterDirectionKind:
+		//	inout='var';
+		public EnumRule getRule() { return rule; }
+		
+		//inout='var'
+		public EnumLiteralDeclaration getInoutEnumLiteralDeclaration() { return cInoutEnumLiteralDeclaration; }
+		
+		//'var'
+		public Keyword getInoutVarKeyword_0() { return cInoutVarKeyword_0; }
+	}
+	public class ParameterOutputDirectionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterOutputDirectionKind");
+		private final EnumLiteralDeclaration cOutEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cOutVarKeyword_0 = (Keyword)cOutEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ParameterOutputDirectionKind returns fmlInfra::ParameterDirectionKind:
+		//	out='var';
+		public EnumRule getRule() { return rule; }
+		
+		//out='var'
+		public EnumLiteralDeclaration getOutEnumLiteralDeclaration() { return cOutEnumLiteralDeclaration; }
+		
+		//'var'
+		public Keyword getOutVarKeyword_0() { return cOutVarKeyword_0; }
+	}
+	public class ParameterReturnDirectionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterReturnDirectionKind");
+		private final EnumLiteralDeclaration cReturnEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cReturnVarKeyword_0 = (Keyword)cReturnEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ParameterReturnDirectionKind returns fmlInfra::ParameterDirectionKind:
+		//	return='var';
+		public EnumRule getRule() { return rule; }
+		
+		//return='var'
+		public EnumLiteralDeclaration getReturnEnumLiteralDeclaration() { return cReturnEnumLiteralDeclaration; }
+		
+		//'var'
+		public Keyword getReturnVarKeyword_0() { return cReturnVarKeyword_0; }
+	}
+	public class BufferContainerKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferContainerKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cSetEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cSetSetKeyword_0_0 = (Keyword)cSetEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cBagEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cBagBagKeyword_1_0 = (Keyword)cBagEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cFifoEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cFifoFifoKeyword_2_0 = (Keyword)cFifoEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cLifoEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cLifoLifoKeyword_3_0 = (Keyword)cLifoEnumLiteralDeclaration_3.eContents().get(0);
+		
+		//enum BufferContainerKind returns fmlType::CollectionKind:
+		//	set | bag | fifo | lifo;
+		public EnumRule getRule() { return rule; }
+		
+		//set | bag | fifo | lifo
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//set
+		public EnumLiteralDeclaration getSetEnumLiteralDeclaration_0() { return cSetEnumLiteralDeclaration_0; }
+		
+		//'set'
+		public Keyword getSetSetKeyword_0_0() { return cSetSetKeyword_0_0; }
+		
+		//bag
+		public EnumLiteralDeclaration getBagEnumLiteralDeclaration_1() { return cBagEnumLiteralDeclaration_1; }
+		
+		//'bag'
+		public Keyword getBagBagKeyword_1_0() { return cBagBagKeyword_1_0; }
+		
+		//fifo
+		public EnumLiteralDeclaration getFifoEnumLiteralDeclaration_2() { return cFifoEnumLiteralDeclaration_2; }
+		
+		//'fifo'
+		public Keyword getFifoFifoKeyword_2_0() { return cFifoFifoKeyword_2_0; }
+		
+		//lifo
+		public EnumLiteralDeclaration getLifoEnumLiteralDeclaration_3() { return cLifoEnumLiteralDeclaration_3; }
+		
+		//'lifo'
+		public Keyword getLifoLifoKeyword_3_0() { return cLifoLifoKeyword_3_0; }
+	}
+	public class PublicBufferVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PublicBufferVisibilityKind");
+		private final EnumLiteralDeclaration cPublicEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPublicBufferKeyword_0 = (Keyword)cPublicEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PublicBufferVisibilityKind returns fmlCommon::VisibilityKind:
+		//	public='buffer';
+		public EnumRule getRule() { return rule; }
+		
+		//public='buffer'
+		public EnumLiteralDeclaration getPublicEnumLiteralDeclaration() { return cPublicEnumLiteralDeclaration; }
+		
+		//'buffer'
+		public Keyword getPublicBufferKeyword_0() { return cPublicBufferKeyword_0; }
+	}
+	public class ProtectedBufferVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ProtectedBufferVisibilityKind");
+		private final EnumLiteralDeclaration cProtectedEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cProtectedBufferKeyword_0 = (Keyword)cProtectedEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ProtectedBufferVisibilityKind returns fmlCommon::VisibilityKind:
+		//	protected='buffer';
+		public EnumRule getRule() { return rule; }
+		
+		//protected='buffer'
+		public EnumLiteralDeclaration getProtectedEnumLiteralDeclaration() { return cProtectedEnumLiteralDeclaration; }
+		
+		//'buffer'
+		public Keyword getProtectedBufferKeyword_0() { return cProtectedBufferKeyword_0; }
+	}
+	public class PrivateBufferVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrivateBufferVisibilityKind");
+		private final EnumLiteralDeclaration cPrivateEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPrivateBufferKeyword_0 = (Keyword)cPrivateEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PrivateBufferVisibilityKind returns fmlCommon::VisibilityKind:
+		//	private='buffer';
+		public EnumRule getRule() { return rule; }
+		
+		//private='buffer'
+		public EnumLiteralDeclaration getPrivateEnumLiteralDeclaration() { return cPrivateEnumLiteralDeclaration; }
+		
+		//'buffer'
+		public Keyword getPrivateBufferKeyword_0() { return cPrivateBufferKeyword_0; }
+	}
+	public class PublicPortVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PublicPortVisibilityKind");
+		private final EnumLiteralDeclaration cPublicEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPublicPortKeyword_0 = (Keyword)cPublicEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PublicPortVisibilityKind returns fmlCommon::VisibilityKind:
+		//	public='port';
+		public EnumRule getRule() { return rule; }
+		
+		//public='port'
+		public EnumLiteralDeclaration getPublicEnumLiteralDeclaration() { return cPublicEnumLiteralDeclaration; }
+		
+		//'port'
+		public Keyword getPublicPortKeyword_0() { return cPublicPortKeyword_0; }
+	}
+	public class ProtectedPortVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ProtectedPortVisibilityKind");
+		private final EnumLiteralDeclaration cProtectedEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cProtectedPortKeyword_0 = (Keyword)cProtectedEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ProtectedPortVisibilityKind returns fmlCommon::VisibilityKind:
+		//	protected='port';
+		public EnumRule getRule() { return rule; }
+		
+		//protected='port'
+		public EnumLiteralDeclaration getProtectedEnumLiteralDeclaration() { return cProtectedEnumLiteralDeclaration; }
+		
+		//'port'
+		public Keyword getProtectedPortKeyword_0() { return cProtectedPortKeyword_0; }
+	}
+	public class PrivatePortVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrivatePortVisibilityKind");
+		private final EnumLiteralDeclaration cPrivateEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPrivatePortKeyword_0 = (Keyword)cPrivateEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PrivatePortVisibilityKind returns fmlCommon::VisibilityKind:
+		//	private='port';
+		public EnumRule getRule() { return rule; }
+		
+		//private='port'
+		public EnumLiteralDeclaration getPrivateEnumLiteralDeclaration() { return cPrivateEnumLiteralDeclaration; }
+		
+		//'port'
+		public Keyword getPrivatePortKeyword_0() { return cPrivatePortKeyword_0; }
+	}
+	public class PublicSignalVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PublicSignalVisibilityKind");
+		private final EnumLiteralDeclaration cPublicEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPublicSignalKeyword_0 = (Keyword)cPublicEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PublicSignalVisibilityKind returns fmlCommon::VisibilityKind:
+		//	public='signal';
+		public EnumRule getRule() { return rule; }
+		
+		//public='signal'
+		public EnumLiteralDeclaration getPublicEnumLiteralDeclaration() { return cPublicEnumLiteralDeclaration; }
+		
+		//'signal'
+		public Keyword getPublicSignalKeyword_0() { return cPublicSignalKeyword_0; }
+	}
+	public class ProtectedSignalVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ProtectedSignalVisibilityKind");
+		private final EnumLiteralDeclaration cProtectedEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cProtectedSignalKeyword_0 = (Keyword)cProtectedEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ProtectedSignalVisibilityKind returns fmlCommon::VisibilityKind:
+		//	protected='signal';
+		public EnumRule getRule() { return rule; }
+		
+		//protected='signal'
+		public EnumLiteralDeclaration getProtectedEnumLiteralDeclaration() { return cProtectedEnumLiteralDeclaration; }
+		
+		//'signal'
+		public Keyword getProtectedSignalKeyword_0() { return cProtectedSignalKeyword_0; }
+	}
+	public class PrivateSignalVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrivateSignalVisibilityKind");
+		private final EnumLiteralDeclaration cPrivateEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPrivateSignalKeyword_0 = (Keyword)cPrivateEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PrivateSignalVisibilityKind returns fmlCommon::VisibilityKind:
+		//	private='signal';
+		public EnumRule getRule() { return rule; }
+		
+		//private='signal'
+		public EnumLiteralDeclaration getPrivateEnumLiteralDeclaration() { return cPrivateEnumLiteralDeclaration; }
+		
+		//'signal'
+		public Keyword getPrivateSignalKeyword_0() { return cPrivateSignalKeyword_0; }
+	}
+	public class ChannelDirectionElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cInputEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cInputInputKeyword_0_0 = (Keyword)cInputEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cInoutEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cInoutInoutKeyword_1_0 = (Keyword)cInoutEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cOutputEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cOutputOutputKeyword_2_0 = (Keyword)cOutputEnumLiteralDeclaration_2.eContents().get(0);
+		
+		//enum ChannelDirection returns fmlInfra::ChannelDirection:
+		//	input | inout | output;
+		public EnumRule getRule() { return rule; }
+		
+		//input | inout | output
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//input
+		public EnumLiteralDeclaration getInputEnumLiteralDeclaration_0() { return cInputEnumLiteralDeclaration_0; }
+		
+		//'input'
+		public Keyword getInputInputKeyword_0_0() { return cInputInputKeyword_0_0; }
+		
+		//inout
+		public EnumLiteralDeclaration getInoutEnumLiteralDeclaration_1() { return cInoutEnumLiteralDeclaration_1; }
+		
+		//'inout'
+		public Keyword getInoutInoutKeyword_1_0() { return cInoutInoutKeyword_1_0; }
+		
+		//output
+		public EnumLiteralDeclaration getOutputEnumLiteralDeclaration_2() { return cOutputEnumLiteralDeclaration_2; }
+		
+		//'output'
+		public Keyword getOutputOutputKeyword_2_0() { return cOutputOutputKeyword_2_0; }
+	}
+	public class PublicChannelVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PublicChannelVisibilityKind");
+		private final EnumLiteralDeclaration cPublicEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPublicChannelKeyword_0 = (Keyword)cPublicEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PublicChannelVisibilityKind returns fmlCommon::VisibilityKind:
+		//	public='channel';
+		public EnumRule getRule() { return rule; }
+		
+		//public='channel'
+		public EnumLiteralDeclaration getPublicEnumLiteralDeclaration() { return cPublicEnumLiteralDeclaration; }
+		
+		//'channel'
+		public Keyword getPublicChannelKeyword_0() { return cPublicChannelKeyword_0; }
+	}
+	public class ProtectedChannelVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ProtectedChannelVisibilityKind");
+		private final EnumLiteralDeclaration cProtectedEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cProtectedChannelKeyword_0 = (Keyword)cProtectedEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ProtectedChannelVisibilityKind returns fmlCommon::VisibilityKind:
+		//	protected='channel';
+		public EnumRule getRule() { return rule; }
+		
+		//protected='channel'
+		public EnumLiteralDeclaration getProtectedEnumLiteralDeclaration() { return cProtectedEnumLiteralDeclaration; }
+		
+		//'channel'
+		public Keyword getProtectedChannelKeyword_0() { return cProtectedChannelKeyword_0; }
+	}
+	public class PrivateChannelVisibilityKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrivateChannelVisibilityKind");
+		private final EnumLiteralDeclaration cPrivateEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cPrivateChannelKeyword_0 = (Keyword)cPrivateEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum PrivateChannelVisibilityKind returns fmlCommon::VisibilityKind:
+		//	private='channel';
+		public EnumRule getRule() { return rule; }
+		
+		//private='channel'
+		public EnumLiteralDeclaration getPrivateEnumLiteralDeclaration() { return cPrivateEnumLiteralDeclaration; }
+		
+		//'channel'
+		public Keyword getPrivateChannelKeyword_0() { return cPrivateChannelKeyword_0; }
+	}
+	public class TransitionMocElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionMoc");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cSimpleEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cSimpleSimpleKeyword_0_0 = (Keyword)cSimpleEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cAbortEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cAbortAbortKeyword_1_0 = (Keyword)cAbortEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cFinalEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cFinalFinalKeyword_2_0 = (Keyword)cFinalEnumLiteralDeclaration_2.eContents().get(0);
+		
+		//enum TransitionMoc returns fmlStmchn::TransitionMoc:
+		//	simple | abort | final;
+		public EnumRule getRule() { return rule; }
+		
+		//simple | abort | final
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//simple
+		public EnumLiteralDeclaration getSimpleEnumLiteralDeclaration_0() { return cSimpleEnumLiteralDeclaration_0; }
+		
+		//'simple'
+		public Keyword getSimpleSimpleKeyword_0_0() { return cSimpleSimpleKeyword_0_0; }
+		
+		//abort
+		public EnumLiteralDeclaration getAbortEnumLiteralDeclaration_1() { return cAbortEnumLiteralDeclaration_1; }
+		
+		//'abort'
+		public Keyword getAbortAbortKeyword_1_0() { return cAbortAbortKeyword_1_0; }
+		
+		//final
+		public EnumLiteralDeclaration getFinalEnumLiteralDeclaration_2() { return cFinalEnumLiteralDeclaration_2; }
+		
+		//'final'
+		public Keyword getFinalFinalKeyword_2_0() { return cFinalFinalKeyword_2_0; }
+	}
+	public class InterruptStatementKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InterruptStatementKind");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cBreakEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cBreakBreakKeyword_0_0 = (Keyword)cBreakEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cContinueEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cContinueContinueKeyword_1_0 = (Keyword)cContinueEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cReturnEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cReturnReturnKeyword_2_0 = (Keyword)cReturnEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cExitEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cExitExitKeyword_3_0 = (Keyword)cExitEnumLiteralDeclaration_3.eContents().get(0);
+		
+		//enum InterruptStatementKind returns fmlStmnt::InterruptStatementKind:
+		//	break | continue | return | exit;
+		public EnumRule getRule() { return rule; }
+		
+		//break | continue | return | exit
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//break
+		public EnumLiteralDeclaration getBreakEnumLiteralDeclaration_0() { return cBreakEnumLiteralDeclaration_0; }
+		
+		//'break'
+		public Keyword getBreakBreakKeyword_0_0() { return cBreakBreakKeyword_0_0; }
+		
+		//continue
+		public EnumLiteralDeclaration getContinueEnumLiteralDeclaration_1() { return cContinueEnumLiteralDeclaration_1; }
+		
+		//'continue'
+		public Keyword getContinueContinueKeyword_1_0() { return cContinueContinueKeyword_1_0; }
+		
+		//return
+		public EnumLiteralDeclaration getReturnEnumLiteralDeclaration_2() { return cReturnEnumLiteralDeclaration_2; }
+		
+		//'return'
+		public Keyword getReturnReturnKeyword_2_0() { return cReturnReturnKeyword_2_0; }
+		
+		//exit
+		public EnumLiteralDeclaration getExitEnumLiteralDeclaration_3() { return cExitEnumLiteralDeclaration_3; }
+		
+		//'exit'
+		public Keyword getExitExitKeyword_3_0() { return cExitExitKeyword_3_0; }
+	}
+	public class OPERATOR_ACTIVITYElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OPERATOR_ACTIVITY");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final EnumLiteralDeclaration cInitEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
+		private final Keyword cInitInitKeyword_0_0 = (Keyword)cInitEnumLiteralDeclaration_0.eContents().get(0);
+		private final EnumLiteralDeclaration cFinalEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cFinalFinalKeyword_1_0 = (Keyword)cFinalEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cDestroyEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cDestroyDestroyKeyword_2_0 = (Keyword)cDestroyEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cStartEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cStartStartKeyword_3_0 = (Keyword)cStartEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cStopEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cStopStopKeyword_4_0 = (Keyword)cStopEnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cRestartEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cRestartRestartKeyword_5_0 = (Keyword)cRestartEnumLiteralDeclaration_5.eContents().get(0);
+		private final EnumLiteralDeclaration cSuspendEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
+		private final Keyword cSuspendSuspendKeyword_6_0 = (Keyword)cSuspendEnumLiteralDeclaration_6.eContents().get(0);
+		private final EnumLiteralDeclaration cResumeEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
+		private final Keyword cResumeResumeKeyword_7_0 = (Keyword)cResumeEnumLiteralDeclaration_7.eContents().get(0);
+		private final EnumLiteralDeclaration cWaitEnumLiteralDeclaration_8 = (EnumLiteralDeclaration)cAlternatives.eContents().get(8);
+		private final Keyword cWaitWaitKeyword_8_0 = (Keyword)cWaitEnumLiteralDeclaration_8.eContents().get(0);
+		private final EnumLiteralDeclaration cDisableEnumLiteralDeclaration_9 = (EnumLiteralDeclaration)cAlternatives.eContents().get(9);
+		private final Keyword cDisableDisableKeyword_9_0 = (Keyword)cDisableEnumLiteralDeclaration_9.eContents().get(0);
+		private final EnumLiteralDeclaration cEnableEnumLiteralDeclaration_10 = (EnumLiteralDeclaration)cAlternatives.eContents().get(10);
+		private final Keyword cEnableEnableKeyword_10_0 = (Keyword)cEnableEnumLiteralDeclaration_10.eContents().get(0);
+		private final EnumLiteralDeclaration cAbortEnumLiteralDeclaration_11 = (EnumLiteralDeclaration)cAlternatives.eContents().get(11);
+		private final Keyword cAbortAbortKeyword_11_0 = (Keyword)cAbortEnumLiteralDeclaration_11.eContents().get(0);
+		private final EnumLiteralDeclaration cScheduleEnumLiteralDeclaration_12 = (EnumLiteralDeclaration)cAlternatives.eContents().get(12);
+		private final Keyword cScheduleScheduleKeyword_12_0 = (Keyword)cScheduleEnumLiteralDeclaration_12.eContents().get(0);
+		private final EnumLiteralDeclaration cIrunEnumLiteralDeclaration_13 = (EnumLiteralDeclaration)cAlternatives.eContents().get(13);
+		private final Keyword cIrunIrunKeyword_13_0 = (Keyword)cIrunEnumLiteralDeclaration_13.eContents().get(0);
+		private final EnumLiteralDeclaration cRunEnumLiteralDeclaration_14 = (EnumLiteralDeclaration)cAlternatives.eContents().get(14);
+		private final Keyword cRunRunKeyword_14_0 = (Keyword)cRunEnumLiteralDeclaration_14.eContents().get(0);
+		private final EnumLiteralDeclaration cRtcEnumLiteralDeclaration_15 = (EnumLiteralDeclaration)cAlternatives.eContents().get(15);
+		private final Keyword cRtcRtcKeyword_15_0 = (Keyword)cRtcEnumLiteralDeclaration_15.eContents().get(0);
+		
+		//enum OPERATOR_ACTIVITY returns fmlStmnt::ActivityStatementKind:
+		//	init | final | destroy | start | stop | restart | suspend | resume | wait | disable | enable | abort | schedule | irun
+		//	| run | rtc;
+		public EnumRule getRule() { return rule; }
+		
+		//init | final | destroy | start | stop | restart | suspend | resume | wait | disable | enable | abort | schedule | irun |
+		//run | rtc
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//init
+		public EnumLiteralDeclaration getInitEnumLiteralDeclaration_0() { return cInitEnumLiteralDeclaration_0; }
+		
+		//'init'
+		public Keyword getInitInitKeyword_0_0() { return cInitInitKeyword_0_0; }
+		
+		//final
+		public EnumLiteralDeclaration getFinalEnumLiteralDeclaration_1() { return cFinalEnumLiteralDeclaration_1; }
+		
+		//'final'
+		public Keyword getFinalFinalKeyword_1_0() { return cFinalFinalKeyword_1_0; }
+		
+		//destroy
+		public EnumLiteralDeclaration getDestroyEnumLiteralDeclaration_2() { return cDestroyEnumLiteralDeclaration_2; }
+		
+		//'destroy'
+		public Keyword getDestroyDestroyKeyword_2_0() { return cDestroyDestroyKeyword_2_0; }
+		
+		//start
+		public EnumLiteralDeclaration getStartEnumLiteralDeclaration_3() { return cStartEnumLiteralDeclaration_3; }
+		
+		//'start'
+		public Keyword getStartStartKeyword_3_0() { return cStartStartKeyword_3_0; }
+		
+		//stop
+		public EnumLiteralDeclaration getStopEnumLiteralDeclaration_4() { return cStopEnumLiteralDeclaration_4; }
+		
+		//'stop'
+		public Keyword getStopStopKeyword_4_0() { return cStopStopKeyword_4_0; }
+		
+		//restart
+		public EnumLiteralDeclaration getRestartEnumLiteralDeclaration_5() { return cRestartEnumLiteralDeclaration_5; }
+		
+		//'restart'
+		public Keyword getRestartRestartKeyword_5_0() { return cRestartRestartKeyword_5_0; }
+		
+		//suspend
+		public EnumLiteralDeclaration getSuspendEnumLiteralDeclaration_6() { return cSuspendEnumLiteralDeclaration_6; }
+		
+		//'suspend'
+		public Keyword getSuspendSuspendKeyword_6_0() { return cSuspendSuspendKeyword_6_0; }
+		
+		//resume
+		public EnumLiteralDeclaration getResumeEnumLiteralDeclaration_7() { return cResumeEnumLiteralDeclaration_7; }
+		
+		//'resume'
+		public Keyword getResumeResumeKeyword_7_0() { return cResumeResumeKeyword_7_0; }
+		
+		//wait
+		public EnumLiteralDeclaration getWaitEnumLiteralDeclaration_8() { return cWaitEnumLiteralDeclaration_8; }
+		
+		//'wait'
+		public Keyword getWaitWaitKeyword_8_0() { return cWaitWaitKeyword_8_0; }
+		
+		//disable
+		public EnumLiteralDeclaration getDisableEnumLiteralDeclaration_9() { return cDisableEnumLiteralDeclaration_9; }
+		
+		//'disable'
+		public Keyword getDisableDisableKeyword_9_0() { return cDisableDisableKeyword_9_0; }
+		
+		//enable
+		public EnumLiteralDeclaration getEnableEnumLiteralDeclaration_10() { return cEnableEnumLiteralDeclaration_10; }
+		
+		//'enable'
+		public Keyword getEnableEnableKeyword_10_0() { return cEnableEnableKeyword_10_0; }
+		
+		//abort
+		public EnumLiteralDeclaration getAbortEnumLiteralDeclaration_11() { return cAbortEnumLiteralDeclaration_11; }
+		
+		//'abort'
+		public Keyword getAbortAbortKeyword_11_0() { return cAbortAbortKeyword_11_0; }
+		
+		//schedule
+		public EnumLiteralDeclaration getScheduleEnumLiteralDeclaration_12() { return cScheduleEnumLiteralDeclaration_12; }
+		
+		//'schedule'
+		public Keyword getScheduleScheduleKeyword_12_0() { return cScheduleScheduleKeyword_12_0; }
+		
+		//irun
+		public EnumLiteralDeclaration getIrunEnumLiteralDeclaration_13() { return cIrunEnumLiteralDeclaration_13; }
+		
+		//'irun'
+		public Keyword getIrunIrunKeyword_13_0() { return cIrunIrunKeyword_13_0; }
+		
+		//run
+		public EnumLiteralDeclaration getRunEnumLiteralDeclaration_14() { return cRunEnumLiteralDeclaration_14; }
+		
+		//'run'
+		public Keyword getRunRunKeyword_14_0() { return cRunRunKeyword_14_0; }
+		
+		//rtc
+		public EnumLiteralDeclaration getRtcEnumLiteralDeclaration_15() { return cRtcEnumLiteralDeclaration_15; }
+		
+		//'rtc'
+		public Keyword getRtcRtcKeyword_15_0() { return cRtcRtcKeyword_15_0; }
+	}
+	public class ValueDotFieldExpressionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
+		private final EnumLiteralDeclaration cFieldEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cFieldFullStopKeyword_0 = (Keyword)cFieldEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ValueDotFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+		//	field='.';
+		public EnumRule getRule() { return rule; }
+		
+		//field='.'
+		public EnumLiteralDeclaration getFieldEnumLiteralDeclaration() { return cFieldEnumLiteralDeclaration; }
+		
+		//'.'
+		public Keyword getFieldFullStopKeyword_0() { return cFieldFullStopKeyword_0; }
+	}
+	public class ValueColonFieldExpressionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueColonFieldExpressionKind");
+		private final EnumLiteralDeclaration cFieldEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cFieldColonKeyword_0 = (Keyword)cFieldEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ValueColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+		//	field=':';
+		public EnumRule getRule() { return rule; }
+		
+		//field=':'
+		public EnumLiteralDeclaration getFieldEnumLiteralDeclaration() { return cFieldEnumLiteralDeclaration; }
+		
+		//':'
+		public Keyword getFieldColonKeyword_0() { return cFieldColonKeyword_0; }
+	}
+	public class ValueDoubleColonFieldExpressionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueDoubleColonFieldExpressionKind");
+		private final EnumLiteralDeclaration cFieldEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cFieldColonColonKeyword_0 = (Keyword)cFieldEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ValueDoubleColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+		//	field='::';
+		public EnumRule getRule() { return rule; }
+		
+		//field='::'
+		public EnumLiteralDeclaration getFieldEnumLiteralDeclaration() { return cFieldEnumLiteralDeclaration; }
+		
+		//'::'
+		public Keyword getFieldColonColonKeyword_0() { return cFieldColonColonKeyword_0; }
+	}
+	public class ValueArrowFieldExpressionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
+		private final EnumLiteralDeclaration cFieldEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cFieldHyphenMinusGreaterThanSignKeyword_0 = (Keyword)cFieldEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ValueArrowFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+		//	field='->';
+		public EnumRule getRule() { return rule; }
+		
+		//field='->'
+		public EnumLiteralDeclaration getFieldEnumLiteralDeclaration() { return cFieldEnumLiteralDeclaration; }
+		
+		//'->'
+		public Keyword getFieldHyphenMinusGreaterThanSignKeyword_0() { return cFieldHyphenMinusGreaterThanSignKeyword_0; }
+	}
+	public class ValueIndexExpressionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
+		private final EnumLiteralDeclaration cIndexEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cIndexLeftSquareBracketKeyword_0 = (Keyword)cIndexEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ValueIndexExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+		//	index='[';
+		public EnumRule getRule() { return rule; }
+		
+		//index='['
+		public EnumLiteralDeclaration getIndexEnumLiteralDeclaration() { return cIndexEnumLiteralDeclaration; }
+		
+		//'['
+		public Keyword getIndexLeftSquareBracketKeyword_0() { return cIndexLeftSquareBracketKeyword_0; }
+	}
+	public class ValueParameterExpressionKindElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
+		private final EnumLiteralDeclaration cParameterEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
+		private final Keyword cParameterLeftParenthesisKeyword_0 = (Keyword)cParameterEnumLiteralDeclaration.eContents().get(0);
+		
+		//enum ValueParameterExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+		//	parameter='(';
+		public EnumRule getRule() { return rule; }
+		
+		//parameter='('
+		public EnumLiteralDeclaration getParameterEnumLiteralDeclaration() { return cParameterEnumLiteralDeclaration; }
+		
+		//'('
+		public Keyword getParameterLeftParenthesisKeyword_0() { return cParameterLeftParenthesisKeyword_0; }
+	}
+	
+	private final XliaElements pXlia;
+	private final XliaPrologObjectElements pXliaPrologObject;
+	private final XliaPrologAttributeElements pXliaPrologAttribute;
+	private final XliaOptionObjectElements pXliaOptionObject;
+	private final XliaNamedElementElements pXliaNamedElement;
+	private final XliaObjectElements pXliaObject;
+	private final XliaAttributeElements pXliaAttribute;
+	private final EBooleanElements pEBoolean;
+	private final TerminalRule tINT;
+	private final EIntElements pEInt;
+	private final EIntegerElements pEInteger;
+	private final EFloatElements pEFloat;
+	private final EDoubleElements pEDouble;
+	private final TerminalRule tCHARACTER;
+	private final ECharacterElements pECharacter;
+	private final EStringElements pEString;
+	private final ReservedWordElements pReservedWord;
+	private final TerminalRule tXLIA_ID;
+	private final ESIdentifierElements pESIdentifier;
+	private final ESUfidElements pESUfid;
+	private final UnrestrictedNameElements pUnrestrictedName;
+	private final QualifiedNameElements pQualifiedName;
+	private final PotentiallyAmbiguousQualifiedNameElements pPotentiallyAmbiguousQualifiedName;
+	private final ColonQualifiedNameElements pColonQualifiedName;
+	private final DotQualifiedNameElements pDotQualifiedName;
+	private final UnqualifiedNameElements pUnqualifiedName;
+	private final NameBindingElements pNameBinding;
+	private final VisibilityKindElements eVisibilityKind;
+	private final DesignKindElements eDesignKind;
+	private final DesignInstanceKindElements eDesignInstanceKind;
+	private final SystemElements pSystem;
+	private final AnyMachineBlockElements pAnyMachineBlock;
+	private final InstanceMachineElements pInstanceMachine;
+	private final SlotParameterElements pSlotParameter;
+	private final SlotPropertyElements pSlotProperty;
+	private final MachineBlockElements pMachineBlock;
+	private final ProcedureElements pProcedure;
+	private final ProcedureExecutionElements pProcedureExecution;
+	private final BehaviorElements pBehavior;
+	private final MoeBehaviorElements pMoeBehavior;
+	private final StatemachineElements pStatemachine;
+	private final StatemachineRegionElements pStatemachineRegion;
+	private final StatemachineRegionLiteElements pStatemachineRegionLite;
+	private final StateElements pState;
+	private final CompositeStateElements pCompositeState;
+	private final MoeCompositeStateRoutinesElements pMoeCompositeStateRoutines;
+	private final SimpleStateElements pSimpleState;
+	private final MoeSimpleStateRoutinesElements pMoeSimpleStateRoutines;
+	private final StartStateElements pStartState;
+	private final MoeStartStateRoutinesElements pMoeStartStateRoutines;
+	private final FinalStateElements pFinalState;
+	private final MoeFinalStateRoutinesElements pMoeFinalStateRoutines;
+	private final PseudostateElements pPseudostate;
+	private final OtherPseudostateElements pOtherPseudostate;
+	private final PseudostateKindElements ePseudostateKind;
+	private final PseudostateInitialElements pPseudostateInitial;
+	private final PseudostateInitialKindElements ePseudostateInitialKind;
+	private final EndingPseudostateElements pEndingPseudostate;
+	private final EndingPseudostateKindElements eEndingPseudostateKind;
+	private final ModelOfComputationElements pModelOfComputation;
+	private final ModelOfExecutionElements pModelOfExecution;
+	private final MoeRoutineElements pMoeRoutine;
+	private final RoutineElements pRoutine;
+	private final ModelOfInteractionElements pModelOfInteraction;
+	private final RouteElements pRoute;
+	private final ComRouteProtocolElements pComRouteProtocol;
+	private final ConnectionElements pConnection;
+	private final ComProtocolElements pComProtocol;
+	private final ComProtocolKindElements eComProtocolKind;
+	private final ComEnvRdvProtocolKindElements eComEnvRdvProtocolKind;
+	private final ComMultiRdvProtocolKindElements eComMultiRdvProtocolKind;
+	private final BufferProtocolKindElements eBufferProtocolKind;
+	private final ComCastKingElements eComCastKing;
+	private final ComPointElements pComPoint;
+	private final ComPointProtocolElements pComPointProtocol;
+	private final ComElementElements pComElement;
+	private final TypeDefinitionElements pTypeDefinition;
+	private final TypeDefinitionImplElements pTypeDefinitionImpl;
+	private final DataTypeMultiplicityElements pDataTypeMultiplicity;
+	private final DataTypeReferenceElements pDataTypeReference;
+	private final OtherDataTypeDefinitionElements pOtherDataTypeDefinition;
+	private final OtherDataTypeDefinitionImplElements pOtherDataTypeDefinitionImpl;
+	private final DataTypeElements pDataType;
+	private final SimpleDataTypeElements pSimpleDataType;
+	private final StructuredDataTypeElements pStructuredDataType;
+	private final PrimitiveTypeElements pPrimitiveType;
+	private final PrimitiveNumberTypeElements pPrimitiveNumberType;
+	private final PrimitiveNumberSignElements ePrimitiveNumberSign;
+	private final PrimitiveIntegerTypeElements pPrimitiveIntegerType;
+	private final PrimitiveRationalTypeElements pPrimitiveRationalType;
+	private final PrimitiveFloatTypeElements pPrimitiveFloatType;
+	private final PrimitiveRealTypeElements pPrimitiveRealType;
+	private final PrimitiveTimeTypeElements pPrimitiveTimeType;
+	private final PrimitiveTimeNumberTypeElements pPrimitiveTimeNumberType;
+	private final OtherPrimitiveTypeElements pOtherPrimitiveType;
+	private final PrimitiveBooleanTypeElements pPrimitiveBooleanType;
+	private final PrimitiveCharacterTypeElements pPrimitiveCharacterType;
+	private final PrimitiveStringTypeElements pPrimitiveStringType;
+	private final PrimitiveInstanceKindElements ePrimitiveInstanceKind;
+	private final PrimitiveInstanceTypeElements pPrimitiveInstanceType;
+	private final IntervalTypeElements pIntervalType;
+	private final IntervalTypeDefinitionElements pIntervalTypeDefinition;
+	private final IntervalTypeDefinitionImplElements pIntervalTypeDefinitionImpl;
+	private final CollectionTypeElements pCollectionType;
+	private final CollectionTypeDefinitionElements pCollectionTypeDefinition;
+	private final CollectionTypeDefinitionImplElements pCollectionTypeDefinitionImpl;
+	private final CollectionKindElements eCollectionKind;
+	private final EnumerationTypeElements pEnumerationType;
+	private final EnumerationTypeDefinitionElements pEnumerationTypeDefinition;
+	private final EnumerationTypeDefinitionImplElements pEnumerationTypeDefinitionImpl;
+	private final EnumerationLiteralElements pEnumerationLiteral;
+	private final StructureTypeElements pStructureType;
+	private final StructureTypeDefinitionElements pStructureTypeDefinition;
+	private final StructureTypeDefinitionImplElements pStructureTypeDefinitionImpl;
+	private final UnionTypeElements pUnionType;
+	private final UnionTypeDefinitionElements pUnionTypeDefinition;
+	private final UnionTypeDefinitionImplElements pUnionTypeDefinitionImpl;
+	private final ChoiceTypeElements pChoiceType;
+	private final ChoiceTypeDefinitionElements pChoiceTypeDefinition;
+	private final ChoiceTypeDefinitionImplElements pChoiceTypeDefinitionImpl;
+	private final ModifierElements pModifier;
+	private final VariableElements pVariable;
+	private final VariableImplElements pVariableImpl;
+	private final OnWriteRoutineElements pOnWriteRoutine;
+	private final VariableRoutineParameterElements pVariableRoutineParameter;
+	private final PublicVariableVisibilityKindElements ePublicVariableVisibilityKind;
+	private final VariablePublicElements pVariablePublic;
+	private final ProtectedVariableVisibilityKindElements eProtectedVariableVisibilityKind;
+	private final VariableProtectedElements pVariableProtected;
+	private final PrivateVariableVisibilityKindElements ePrivateVariableVisibilityKind;
+	private final VariablePrivateElements pVariablePrivate;
+	private final ParameterDirectionKindElements eParameterDirectionKind;
+	private final FunctionalParameterSetElements pFunctionalParameterSet;
+	private final FunctionalParameterElements pFunctionalParameter;
+	private final FormalParameterSetElements pFormalParameterSet;
+	private final FormalParameterElements pFormalParameter;
+	private final BlockParameterDirectionKindElements eBlockParameterDirectionKind;
+	private final BlockParameterSetElements pBlockParameterSet;
+	private final ParameterInputDirectionKindElements eParameterInputDirectionKind;
+	private final ParameterInputElements pParameterInput;
+	private final ParameterInoutDirectionKindElements eParameterInoutDirectionKind;
+	private final ParameterInoutElements pParameterInout;
+	private final ParameterOutputDirectionKindElements eParameterOutputDirectionKind;
+	private final ParameterOutputElements pParameterOutput;
+	private final ParameterReturnDirectionKindElements eParameterReturnDirectionKind;
+	private final ParameterReturnElements pParameterReturn;
+	private final ParameterDeclarationElements pParameterDeclaration;
+	private final BufferContainerTypeElements pBufferContainerType;
+	private final BufferContainerKindElements eBufferContainerKind;
+	private final BufferElements pBuffer;
+	private final BufferImplElements pBufferImpl;
+	private final PublicBufferVisibilityKindElements ePublicBufferVisibilityKind;
+	private final BufferPublicElements pBufferPublic;
+	private final ProtectedBufferVisibilityKindElements eProtectedBufferVisibilityKind;
+	private final BufferProtectedElements pBufferProtected;
+	private final PrivateBufferVisibilityKindElements ePrivateBufferVisibilityKind;
+	private final BufferPrivateElements pBufferPrivate;
+	private final PortElements pPort;
+	private final PortImplElements pPortImpl;
+	private final PublicPortVisibilityKindElements ePublicPortVisibilityKind;
+	private final PortPublicElements pPortPublic;
+	private final ProtectedPortVisibilityKindElements eProtectedPortVisibilityKind;
+	private final PortProtectedElements pPortProtected;
+	private final PrivatePortVisibilityKindElements ePrivatePortVisibilityKind;
+	private final PortPrivateElements pPortPrivate;
+	private final SignalElements pSignal;
+	private final SignalImplElements pSignalImpl;
+	private final PublicSignalVisibilityKindElements ePublicSignalVisibilityKind;
+	private final SignalPublicElements pSignalPublic;
+	private final ProtectedSignalVisibilityKindElements eProtectedSignalVisibilityKind;
+	private final SignalProtectedElements pSignalProtected;
+	private final PrivateSignalVisibilityKindElements ePrivateSignalVisibilityKind;
+	private final SignalPrivateElements pSignalPrivate;
+	private final ChannelDirectionElements eChannelDirection;
+	private final ChannelElements pChannel;
+	private final SignalReferenceElements pSignalReference;
+	private final PublicChannelVisibilityKindElements ePublicChannelVisibilityKind;
+	private final ChannelPublicElements pChannelPublic;
+	private final ProtectedChannelVisibilityKindElements eProtectedChannelVisibilityKind;
+	private final ChannelProtectedElements pChannelProtected;
+	private final PrivateChannelVisibilityKindElements ePrivateChannelVisibilityKind;
+	private final ChannelPrivateElements pChannelPrivate;
+	private final TransitionElements pTransition;
+	private final TransitionMoeElements pTransitionMoe;
+	private final TransitionMocElements eTransitionMoc;
+	private final TransitionBehaviorElements pTransitionBehavior;
+	private final TransitionTriggerElements pTransitionTrigger;
+	private final TransitionGuardElements pTransitionGuard;
+	private final TransitionGuardExpressionElements pTransitionGuardExpression;
+	private final TransitionTimedGuardElements pTransitionTimedGuard;
+	private final TransitionEffectElements pTransitionEffect;
+	private final TransitionEffectStatementElements pTransitionEffectStatement;
+	private final StatementElements pStatement;
+	private final BlockStatementElements pBlockStatement;
+	private final BlockStatementSchedulerElements pBlockStatementScheduler;
+	private final ExpressionStatementElements pExpressionStatement;
+	private final GuardStatementElements pGuardStatement;
+	private final TimedGuardStatementElements pTimedGuardStatement;
+	private final EventGuardStatementElements pEventGuardStatement;
+	private final CheckSatGuardStatementElements pCheckSatGuardStatement;
+	private final InputComStatementElements pInputComStatement;
+	private final OutputComStatementElements pOutputComStatement;
+	private final ExpressionAsMachineElements pExpressionAsMachine;
+	private final IfStatementElements pIfStatement;
+	private final ElseIfStatementElements pElseIfStatement;
+	private final WhileDoStatementElements pWhileDoStatement;
+	private final DoWhileStatementElements pDoWhileStatement;
+	private final ForStatementElements pForStatement;
+	private final ForAssignmentExpressionElements pForAssignmentExpression;
+	private final ForEachStatementElements pForEachStatement;
+	private final InterruptStatementElements pInterruptStatement;
+	private final InterruptStatementKindElements eInterruptStatementKind;
+	private final ActivityStatementElements pActivityStatement;
+	private final OPERATOR_ACTIVITYElements eOPERATOR_ACTIVITY;
+	private final InvokeStatementElements pInvokeStatement;
+	private final ExpressionElements pExpression;
+	private final AssignmentExpressionElements pAssignmentExpression;
+	private final AssignmentOperatorElements pAssignmentOperator;
+	private final LeftHandSideExpressionElements pLeftHandSideExpression;
+	private final ConditionalTestExpressionElements pConditionalTestExpression;
+	private final LogicalOrExpressionElements pLogicalOrExpression;
+	private final LogicalAndExpressionElements pLogicalAndExpression;
+	private final BitwiseOrExpressionElements pBitwiseOrExpression;
+	private final BitwiseXorExpressionElements pBitwiseXorExpression;
+	private final BitwiseAndExpressionElements pBitwiseAndExpression;
+	private final EqualityExpressionElements pEqualityExpression;
+	private final EqualityOperatorElements pEqualityOperator;
+	private final RelationalExpressionElements pRelationalExpression;
+	private final RelationalOperatorElements pRelationalOperator;
+	private final AdditiveExpressionElements pAdditiveExpression;
+	private final MultiplicativeExpressionElements pMultiplicativeExpression;
+	private final UnaryExpressionElements pUnaryExpression;
+	private final PostfixUnaryExpressionElements pPostfixUnaryExpression;
+	private final IncrementOrDecrementPostfixExpressionElements pIncrementOrDecrementPostfixExpression;
+	private final PrefixUnaryExpressionElements pPrefixUnaryExpression;
+	private final IncrementOrDecrementPrefixExpressionElements pIncrementOrDecrementPrefixExpression;
+	private final AffixOperatorElements pAffixOperator;
+	private final NewfreshExpressionElements pNewfreshExpression;
+	private final CastExpressionElements pCastExpression;
+	private final ArithmeticUnaryExpressionElements pArithmeticUnaryExpression;
+	private final ArithmeticUnaryOperatorElements pArithmeticUnaryOperator;
+	private final LogicalUnaryExpressionElements pLogicalUnaryExpression;
+	private final BitwiseUnaryExpressionElements pBitwiseUnaryExpression;
+	private final PrimaryExpressionElements pPrimaryExpression;
+	private final BaseExpressionElements pBaseExpression;
+	private final InvokeExpressionElements pInvokeExpression;
+	private final InvokeExpressionDeprecatedElements pInvokeExpressionDeprecated;
+	private final InstantiationExpressionElements pInstantiationExpression;
+	private final DynamicInstanceSpecificationElements pDynamicInstanceSpecification;
+	private final TupleParameterExpressionElements pTupleParameterExpression;
+	private final MixTupleExpressionListElements pMixTupleExpressionList;
+	private final PositionalTupleExpressionListElements pPositionalTupleExpressionList;
+	private final NamedExpressionElements pNamedExpression;
+	private final LiteralExpressionElements pLiteralExpression;
+	private final LiteralReferenceableExpressionElements pLiteralReferenceableExpression;
+	private final LiteralTerminalExpressionElements pLiteralTerminalExpression;
+	private final LiteralBooleanExpressionElements pLiteralBooleanExpression;
+	private final LiteralIntegerExpressionElements pLiteralIntegerExpression;
+	private final LiteralRationalExpressionElements pLiteralRationalExpression;
+	private final LiteralFloatExpressionElements pLiteralFloatExpression;
+	private final LiteralCharacterExpressionElements pLiteralCharacterExpression;
+	private final LiteralStringExpressionElements pLiteralStringExpression;
+	private final LiteralNullExpressionElements pLiteralNullExpression;
+	private final LiteralCollectionExpressionElements pLiteralCollectionExpression;
+	private final LiteralReferenceExpressionElements pLiteralReferenceExpression;
+	private final LiteralReferenceElementElements pLiteralReferenceElement;
+	private final LiteralPureReferenceElementElements pLiteralPureReferenceElement;
+	private final LiteralReferenceVariableContextElements pLiteralReferenceVariableContext;
+	private final LiteralTimeExpressionElements pLiteralTimeExpression;
+	private final LiteralTimeDeltaExpressionElements pLiteralTimeDeltaExpression;
+	private final LiteralReferenceMachineContextElements pLiteralReferenceMachineContext;
+	private final LiteralThisExpressionElements pLiteralThisExpression;
+	private final LiteralSelfExpressionElements pLiteralSelfExpression;
+	private final LiteralParentExpressionElements pLiteralParentExpression;
+	private final LiteralSuperExpressionElements pLiteralSuperExpression;
+	private final LiteralSystemExpressionElements pLiteralSystemExpression;
+	private final LiteralEnvExpressionElements pLiteralEnvExpression;
+	private final LiteralPureReferenceExpressionElements pLiteralPureReferenceExpression;
+	private final ValueSelectionExpressionElements pValueSelectionExpression;
+	private final ValuePureNamedMachineExpressionElements pValuePureNamedMachineExpression;
+	private final ValueDotFieldExpressionKindElements eValueDotFieldExpressionKind;
+	private final ValueColonFieldExpressionKindElements eValueColonFieldExpressionKind;
+	private final ValueDoubleColonFieldExpressionKindElements eValueDoubleColonFieldExpressionKind;
+	private final ValueArrowFieldExpressionKindElements eValueArrowFieldExpressionKind;
+	private final ValueIndexExpressionKindElements eValueIndexExpressionKind;
+	private final ValueParameterExpressionKindElements eValueParameterExpressionKind;
+	
+	private final Grammar grammar;
+	
+	private final TerminalsGrammarAccess gaTerminals;
+
+	@Inject
+	public FormalMLGrammarAccess(GrammarProvider grammarProvider,
+			TerminalsGrammarAccess gaTerminals) {
+		this.grammar = internalFindGrammar(grammarProvider);
+		this.gaTerminals = gaTerminals;
+		this.pXlia = new XliaElements();
+		this.pXliaPrologObject = new XliaPrologObjectElements();
+		this.pXliaPrologAttribute = new XliaPrologAttributeElements();
+		this.pXliaOptionObject = new XliaOptionObjectElements();
+		this.pXliaNamedElement = new XliaNamedElementElements();
+		this.pXliaObject = new XliaObjectElements();
+		this.pXliaAttribute = new XliaAttributeElements();
+		this.pEBoolean = new EBooleanElements();
+		this.tINT = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.INT");
+		this.pEInt = new EIntElements();
+		this.pEInteger = new EIntegerElements();
+		this.pEFloat = new EFloatElements();
+		this.pEDouble = new EDoubleElements();
+		this.tCHARACTER = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CHARACTER");
+		this.pECharacter = new ECharacterElements();
+		this.pEString = new EStringElements();
+		this.pReservedWord = new ReservedWordElements();
+		this.tXLIA_ID = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
+		this.pESIdentifier = new ESIdentifierElements();
+		this.pESUfid = new ESUfidElements();
+		this.pUnrestrictedName = new UnrestrictedNameElements();
+		this.pQualifiedName = new QualifiedNameElements();
+		this.pPotentiallyAmbiguousQualifiedName = new PotentiallyAmbiguousQualifiedNameElements();
+		this.pColonQualifiedName = new ColonQualifiedNameElements();
+		this.pDotQualifiedName = new DotQualifiedNameElements();
+		this.pUnqualifiedName = new UnqualifiedNameElements();
+		this.pNameBinding = new NameBindingElements();
+		this.eVisibilityKind = new VisibilityKindElements();
+		this.eDesignKind = new DesignKindElements();
+		this.eDesignInstanceKind = new DesignInstanceKindElements();
+		this.pSystem = new SystemElements();
+		this.pAnyMachineBlock = new AnyMachineBlockElements();
+		this.pInstanceMachine = new InstanceMachineElements();
+		this.pSlotParameter = new SlotParameterElements();
+		this.pSlotProperty = new SlotPropertyElements();
+		this.pMachineBlock = new MachineBlockElements();
+		this.pProcedure = new ProcedureElements();
+		this.pProcedureExecution = new ProcedureExecutionElements();
+		this.pBehavior = new BehaviorElements();
+		this.pMoeBehavior = new MoeBehaviorElements();
+		this.pStatemachine = new StatemachineElements();
+		this.pStatemachineRegion = new StatemachineRegionElements();
+		this.pStatemachineRegionLite = new StatemachineRegionLiteElements();
+		this.pState = new StateElements();
+		this.pCompositeState = new CompositeStateElements();
+		this.pMoeCompositeStateRoutines = new MoeCompositeStateRoutinesElements();
+		this.pSimpleState = new SimpleStateElements();
+		this.pMoeSimpleStateRoutines = new MoeSimpleStateRoutinesElements();
+		this.pStartState = new StartStateElements();
+		this.pMoeStartStateRoutines = new MoeStartStateRoutinesElements();
+		this.pFinalState = new FinalStateElements();
+		this.pMoeFinalStateRoutines = new MoeFinalStateRoutinesElements();
+		this.pPseudostate = new PseudostateElements();
+		this.pOtherPseudostate = new OtherPseudostateElements();
+		this.ePseudostateKind = new PseudostateKindElements();
+		this.pPseudostateInitial = new PseudostateInitialElements();
+		this.ePseudostateInitialKind = new PseudostateInitialKindElements();
+		this.pEndingPseudostate = new EndingPseudostateElements();
+		this.eEndingPseudostateKind = new EndingPseudostateKindElements();
+		this.pModelOfComputation = new ModelOfComputationElements();
+		this.pModelOfExecution = new ModelOfExecutionElements();
+		this.pMoeRoutine = new MoeRoutineElements();
+		this.pRoutine = new RoutineElements();
+		this.pModelOfInteraction = new ModelOfInteractionElements();
+		this.pRoute = new RouteElements();
+		this.pComRouteProtocol = new ComRouteProtocolElements();
+		this.pConnection = new ConnectionElements();
+		this.pComProtocol = new ComProtocolElements();
+		this.eComProtocolKind = new ComProtocolKindElements();
+		this.eComEnvRdvProtocolKind = new ComEnvRdvProtocolKindElements();
+		this.eComMultiRdvProtocolKind = new ComMultiRdvProtocolKindElements();
+		this.eBufferProtocolKind = new BufferProtocolKindElements();
+		this.eComCastKing = new ComCastKingElements();
+		this.pComPoint = new ComPointElements();
+		this.pComPointProtocol = new ComPointProtocolElements();
+		this.pComElement = new ComElementElements();
+		this.pTypeDefinition = new TypeDefinitionElements();
+		this.pTypeDefinitionImpl = new TypeDefinitionImplElements();
+		this.pDataTypeMultiplicity = new DataTypeMultiplicityElements();
+		this.pDataTypeReference = new DataTypeReferenceElements();
+		this.pOtherDataTypeDefinition = new OtherDataTypeDefinitionElements();
+		this.pOtherDataTypeDefinitionImpl = new OtherDataTypeDefinitionImplElements();
+		this.pDataType = new DataTypeElements();
+		this.pSimpleDataType = new SimpleDataTypeElements();
+		this.pStructuredDataType = new StructuredDataTypeElements();
+		this.pPrimitiveType = new PrimitiveTypeElements();
+		this.pPrimitiveNumberType = new PrimitiveNumberTypeElements();
+		this.ePrimitiveNumberSign = new PrimitiveNumberSignElements();
+		this.pPrimitiveIntegerType = new PrimitiveIntegerTypeElements();
+		this.pPrimitiveRationalType = new PrimitiveRationalTypeElements();
+		this.pPrimitiveFloatType = new PrimitiveFloatTypeElements();
+		this.pPrimitiveRealType = new PrimitiveRealTypeElements();
+		this.pPrimitiveTimeType = new PrimitiveTimeTypeElements();
+		this.pPrimitiveTimeNumberType = new PrimitiveTimeNumberTypeElements();
+		this.pOtherPrimitiveType = new OtherPrimitiveTypeElements();
+		this.pPrimitiveBooleanType = new PrimitiveBooleanTypeElements();
+		this.pPrimitiveCharacterType = new PrimitiveCharacterTypeElements();
+		this.pPrimitiveStringType = new PrimitiveStringTypeElements();
+		this.ePrimitiveInstanceKind = new PrimitiveInstanceKindElements();
+		this.pPrimitiveInstanceType = new PrimitiveInstanceTypeElements();
+		this.pIntervalType = new IntervalTypeElements();
+		this.pIntervalTypeDefinition = new IntervalTypeDefinitionElements();
+		this.pIntervalTypeDefinitionImpl = new IntervalTypeDefinitionImplElements();
+		this.pCollectionType = new CollectionTypeElements();
+		this.pCollectionTypeDefinition = new CollectionTypeDefinitionElements();
+		this.pCollectionTypeDefinitionImpl = new CollectionTypeDefinitionImplElements();
+		this.eCollectionKind = new CollectionKindElements();
+		this.pEnumerationType = new EnumerationTypeElements();
+		this.pEnumerationTypeDefinition = new EnumerationTypeDefinitionElements();
+		this.pEnumerationTypeDefinitionImpl = new EnumerationTypeDefinitionImplElements();
+		this.pEnumerationLiteral = new EnumerationLiteralElements();
+		this.pStructureType = new StructureTypeElements();
+		this.pStructureTypeDefinition = new StructureTypeDefinitionElements();
+		this.pStructureTypeDefinitionImpl = new StructureTypeDefinitionImplElements();
+		this.pUnionType = new UnionTypeElements();
+		this.pUnionTypeDefinition = new UnionTypeDefinitionElements();
+		this.pUnionTypeDefinitionImpl = new UnionTypeDefinitionImplElements();
+		this.pChoiceType = new ChoiceTypeElements();
+		this.pChoiceTypeDefinition = new ChoiceTypeDefinitionElements();
+		this.pChoiceTypeDefinitionImpl = new ChoiceTypeDefinitionImplElements();
+		this.pModifier = new ModifierElements();
+		this.pVariable = new VariableElements();
+		this.pVariableImpl = new VariableImplElements();
+		this.pOnWriteRoutine = new OnWriteRoutineElements();
+		this.pVariableRoutineParameter = new VariableRoutineParameterElements();
+		this.ePublicVariableVisibilityKind = new PublicVariableVisibilityKindElements();
+		this.pVariablePublic = new VariablePublicElements();
+		this.eProtectedVariableVisibilityKind = new ProtectedVariableVisibilityKindElements();
+		this.pVariableProtected = new VariableProtectedElements();
+		this.ePrivateVariableVisibilityKind = new PrivateVariableVisibilityKindElements();
+		this.pVariablePrivate = new VariablePrivateElements();
+		this.eParameterDirectionKind = new ParameterDirectionKindElements();
+		this.pFunctionalParameterSet = new FunctionalParameterSetElements();
+		this.pFunctionalParameter = new FunctionalParameterElements();
+		this.pFormalParameterSet = new FormalParameterSetElements();
+		this.pFormalParameter = new FormalParameterElements();
+		this.eBlockParameterDirectionKind = new BlockParameterDirectionKindElements();
+		this.pBlockParameterSet = new BlockParameterSetElements();
+		this.eParameterInputDirectionKind = new ParameterInputDirectionKindElements();
+		this.pParameterInput = new ParameterInputElements();
+		this.eParameterInoutDirectionKind = new ParameterInoutDirectionKindElements();
+		this.pParameterInout = new ParameterInoutElements();
+		this.eParameterOutputDirectionKind = new ParameterOutputDirectionKindElements();
+		this.pParameterOutput = new ParameterOutputElements();
+		this.eParameterReturnDirectionKind = new ParameterReturnDirectionKindElements();
+		this.pParameterReturn = new ParameterReturnElements();
+		this.pParameterDeclaration = new ParameterDeclarationElements();
+		this.pBufferContainerType = new BufferContainerTypeElements();
+		this.eBufferContainerKind = new BufferContainerKindElements();
+		this.pBuffer = new BufferElements();
+		this.pBufferImpl = new BufferImplElements();
+		this.ePublicBufferVisibilityKind = new PublicBufferVisibilityKindElements();
+		this.pBufferPublic = new BufferPublicElements();
+		this.eProtectedBufferVisibilityKind = new ProtectedBufferVisibilityKindElements();
+		this.pBufferProtected = new BufferProtectedElements();
+		this.ePrivateBufferVisibilityKind = new PrivateBufferVisibilityKindElements();
+		this.pBufferPrivate = new BufferPrivateElements();
+		this.pPort = new PortElements();
+		this.pPortImpl = new PortImplElements();
+		this.ePublicPortVisibilityKind = new PublicPortVisibilityKindElements();
+		this.pPortPublic = new PortPublicElements();
+		this.eProtectedPortVisibilityKind = new ProtectedPortVisibilityKindElements();
+		this.pPortProtected = new PortProtectedElements();
+		this.ePrivatePortVisibilityKind = new PrivatePortVisibilityKindElements();
+		this.pPortPrivate = new PortPrivateElements();
+		this.pSignal = new SignalElements();
+		this.pSignalImpl = new SignalImplElements();
+		this.ePublicSignalVisibilityKind = new PublicSignalVisibilityKindElements();
+		this.pSignalPublic = new SignalPublicElements();
+		this.eProtectedSignalVisibilityKind = new ProtectedSignalVisibilityKindElements();
+		this.pSignalProtected = new SignalProtectedElements();
+		this.ePrivateSignalVisibilityKind = new PrivateSignalVisibilityKindElements();
+		this.pSignalPrivate = new SignalPrivateElements();
+		this.eChannelDirection = new ChannelDirectionElements();
+		this.pChannel = new ChannelElements();
+		this.pSignalReference = new SignalReferenceElements();
+		this.ePublicChannelVisibilityKind = new PublicChannelVisibilityKindElements();
+		this.pChannelPublic = new ChannelPublicElements();
+		this.eProtectedChannelVisibilityKind = new ProtectedChannelVisibilityKindElements();
+		this.pChannelProtected = new ChannelProtectedElements();
+		this.ePrivateChannelVisibilityKind = new PrivateChannelVisibilityKindElements();
+		this.pChannelPrivate = new ChannelPrivateElements();
+		this.pTransition = new TransitionElements();
+		this.pTransitionMoe = new TransitionMoeElements();
+		this.eTransitionMoc = new TransitionMocElements();
+		this.pTransitionBehavior = new TransitionBehaviorElements();
+		this.pTransitionTrigger = new TransitionTriggerElements();
+		this.pTransitionGuard = new TransitionGuardElements();
+		this.pTransitionGuardExpression = new TransitionGuardExpressionElements();
+		this.pTransitionTimedGuard = new TransitionTimedGuardElements();
+		this.pTransitionEffect = new TransitionEffectElements();
+		this.pTransitionEffectStatement = new TransitionEffectStatementElements();
+		this.pStatement = new StatementElements();
+		this.pBlockStatement = new BlockStatementElements();
+		this.pBlockStatementScheduler = new BlockStatementSchedulerElements();
+		this.pExpressionStatement = new ExpressionStatementElements();
+		this.pGuardStatement = new GuardStatementElements();
+		this.pTimedGuardStatement = new TimedGuardStatementElements();
+		this.pEventGuardStatement = new EventGuardStatementElements();
+		this.pCheckSatGuardStatement = new CheckSatGuardStatementElements();
+		this.pInputComStatement = new InputComStatementElements();
+		this.pOutputComStatement = new OutputComStatementElements();
+		this.pExpressionAsMachine = new ExpressionAsMachineElements();
+		this.pIfStatement = new IfStatementElements();
+		this.pElseIfStatement = new ElseIfStatementElements();
+		this.pWhileDoStatement = new WhileDoStatementElements();
+		this.pDoWhileStatement = new DoWhileStatementElements();
+		this.pForStatement = new ForStatementElements();
+		this.pForAssignmentExpression = new ForAssignmentExpressionElements();
+		this.pForEachStatement = new ForEachStatementElements();
+		this.pInterruptStatement = new InterruptStatementElements();
+		this.eInterruptStatementKind = new InterruptStatementKindElements();
+		this.pActivityStatement = new ActivityStatementElements();
+		this.eOPERATOR_ACTIVITY = new OPERATOR_ACTIVITYElements();
+		this.pInvokeStatement = new InvokeStatementElements();
+		this.pExpression = new ExpressionElements();
+		this.pAssignmentExpression = new AssignmentExpressionElements();
+		this.pAssignmentOperator = new AssignmentOperatorElements();
+		this.pLeftHandSideExpression = new LeftHandSideExpressionElements();
+		this.pConditionalTestExpression = new ConditionalTestExpressionElements();
+		this.pLogicalOrExpression = new LogicalOrExpressionElements();
+		this.pLogicalAndExpression = new LogicalAndExpressionElements();
+		this.pBitwiseOrExpression = new BitwiseOrExpressionElements();
+		this.pBitwiseXorExpression = new BitwiseXorExpressionElements();
+		this.pBitwiseAndExpression = new BitwiseAndExpressionElements();
+		this.pEqualityExpression = new EqualityExpressionElements();
+		this.pEqualityOperator = new EqualityOperatorElements();
+		this.pRelationalExpression = new RelationalExpressionElements();
+		this.pRelationalOperator = new RelationalOperatorElements();
+		this.pAdditiveExpression = new AdditiveExpressionElements();
+		this.pMultiplicativeExpression = new MultiplicativeExpressionElements();
+		this.pUnaryExpression = new UnaryExpressionElements();
+		this.pPostfixUnaryExpression = new PostfixUnaryExpressionElements();
+		this.pIncrementOrDecrementPostfixExpression = new IncrementOrDecrementPostfixExpressionElements();
+		this.pPrefixUnaryExpression = new PrefixUnaryExpressionElements();
+		this.pIncrementOrDecrementPrefixExpression = new IncrementOrDecrementPrefixExpressionElements();
+		this.pAffixOperator = new AffixOperatorElements();
+		this.pNewfreshExpression = new NewfreshExpressionElements();
+		this.pCastExpression = new CastExpressionElements();
+		this.pArithmeticUnaryExpression = new ArithmeticUnaryExpressionElements();
+		this.pArithmeticUnaryOperator = new ArithmeticUnaryOperatorElements();
+		this.pLogicalUnaryExpression = new LogicalUnaryExpressionElements();
+		this.pBitwiseUnaryExpression = new BitwiseUnaryExpressionElements();
+		this.pPrimaryExpression = new PrimaryExpressionElements();
+		this.pBaseExpression = new BaseExpressionElements();
+		this.pInvokeExpression = new InvokeExpressionElements();
+		this.pInvokeExpressionDeprecated = new InvokeExpressionDeprecatedElements();
+		this.pInstantiationExpression = new InstantiationExpressionElements();
+		this.pDynamicInstanceSpecification = new DynamicInstanceSpecificationElements();
+		this.pTupleParameterExpression = new TupleParameterExpressionElements();
+		this.pMixTupleExpressionList = new MixTupleExpressionListElements();
+		this.pPositionalTupleExpressionList = new PositionalTupleExpressionListElements();
+		this.pNamedExpression = new NamedExpressionElements();
+		this.pLiteralExpression = new LiteralExpressionElements();
+		this.pLiteralReferenceableExpression = new LiteralReferenceableExpressionElements();
+		this.pLiteralTerminalExpression = new LiteralTerminalExpressionElements();
+		this.pLiteralBooleanExpression = new LiteralBooleanExpressionElements();
+		this.pLiteralIntegerExpression = new LiteralIntegerExpressionElements();
+		this.pLiteralRationalExpression = new LiteralRationalExpressionElements();
+		this.pLiteralFloatExpression = new LiteralFloatExpressionElements();
+		this.pLiteralCharacterExpression = new LiteralCharacterExpressionElements();
+		this.pLiteralStringExpression = new LiteralStringExpressionElements();
+		this.pLiteralNullExpression = new LiteralNullExpressionElements();
+		this.pLiteralCollectionExpression = new LiteralCollectionExpressionElements();
+		this.pLiteralReferenceExpression = new LiteralReferenceExpressionElements();
+		this.pLiteralReferenceElement = new LiteralReferenceElementElements();
+		this.pLiteralPureReferenceElement = new LiteralPureReferenceElementElements();
+		this.pLiteralReferenceVariableContext = new LiteralReferenceVariableContextElements();
+		this.pLiteralTimeExpression = new LiteralTimeExpressionElements();
+		this.pLiteralTimeDeltaExpression = new LiteralTimeDeltaExpressionElements();
+		this.pLiteralReferenceMachineContext = new LiteralReferenceMachineContextElements();
+		this.pLiteralThisExpression = new LiteralThisExpressionElements();
+		this.pLiteralSelfExpression = new LiteralSelfExpressionElements();
+		this.pLiteralParentExpression = new LiteralParentExpressionElements();
+		this.pLiteralSuperExpression = new LiteralSuperExpressionElements();
+		this.pLiteralSystemExpression = new LiteralSystemExpressionElements();
+		this.pLiteralEnvExpression = new LiteralEnvExpressionElements();
+		this.pLiteralPureReferenceExpression = new LiteralPureReferenceExpressionElements();
+		this.pValueSelectionExpression = new ValueSelectionExpressionElements();
+		this.pValuePureNamedMachineExpression = new ValuePureNamedMachineExpressionElements();
+		this.eValueDotFieldExpressionKind = new ValueDotFieldExpressionKindElements();
+		this.eValueColonFieldExpressionKind = new ValueColonFieldExpressionKindElements();
+		this.eValueDoubleColonFieldExpressionKind = new ValueDoubleColonFieldExpressionKindElements();
+		this.eValueArrowFieldExpressionKind = new ValueArrowFieldExpressionKindElements();
+		this.eValueIndexExpressionKind = new ValueIndexExpressionKindElements();
+		this.eValueParameterExpressionKind = new ValueParameterExpressionKindElements();
+	}
+	
+	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
+		Grammar grammar = grammarProvider.getGrammar(this);
+		while (grammar != null) {
+			if ("org.eclipse.efm.formalml.xtext.FormalML".equals(grammar.getName())) {
+				return grammar;
+			}
+			List<Grammar> grammars = grammar.getUsedGrammars();
+			if (!grammars.isEmpty()) {
+				grammar = grammars.iterator().next();
+			} else {
+				return null;
+			}
+		}
+		return grammar;
+	}
+	
+	@Override
+	public Grammar getGrammar() {
+		return grammar;
+	}
+	
+	
+	public TerminalsGrammarAccess getTerminalsGrammarAccess() {
+		return gaTerminals;
+	}
+
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Main Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Xlia XliaModel:
+	//	prolog=XliaPrologObject
+	//	system=System
+	public XliaElements getXliaAccess() {
+		return pXlia;
+	}
+	
+	public ParserRule getXliaRule() {
+		return getXliaAccess().getRule();
+	}
+	
+	//XliaPrologObject XliaObject:
+	//	name=('@FormalML' | '@xlia' | '@xfsp') '<'
+	//	elements+=XliaPrologAttribute '>:'
+	//	elements+=XliaOptionObject?
+	public XliaPrologObjectElements getXliaPrologObjectAccess() {
+		return pXliaPrologObject;
+	}
+	
+	public ParserRule getXliaPrologObjectRule() {
+		return getXliaPrologObjectAccess().getRule();
+	}
+	
+	//XliaPrologAttribute XliaAttribute:
+	//	name=('system' | 'package') (',' value=(LiteralFloatExpression | LiteralStringExpression))?
+	public XliaPrologAttributeElements getXliaPrologAttributeAccess() {
+		return pXliaPrologAttribute;
+	}
+	
+	public ParserRule getXliaPrologAttributeRule() {
+		return getXliaPrologAttributeAccess().getRule();
+	}
+	
+	////XliaPrologAttribute returns XliaAttribute
+	////	: (name = 'model')?    value=XliaModelKind
+	////	| (name = 'version')?
+	////		value=( LiteralFloatExpression | LiteralStringExpression )
+	////	;
+	////
+	////XliaModelKind returns fmlExpr::LiteralStringExpression
+	////	: value=( 'system' | 'package' )
+	////	;
+	//XliaOptionObject XliaObject:
+	//	name='@option' '{'
+	//	elements+=XliaNamedElement*
+	//	'}'
+	public XliaOptionObjectElements getXliaOptionObjectAccess() {
+		return pXliaOptionObject;
+	}
+	
+	public ParserRule getXliaOptionObjectRule() {
+		return getXliaOptionObjectAccess().getRule();
+	}
+	
+	//XliaNamedElement:
+	//	XliaObject
+	//	| XliaAttribute;
+	public XliaNamedElementElements getXliaNamedElementAccess() {
+		return pXliaNamedElement;
+	}
+	
+	public ParserRule getXliaNamedElementRule() {
+		return getXliaNamedElementAccess().getRule();
+	}
+	
+	//XliaObject:
+	//	name=XLIA_ID '{'
+	//	elements+=XliaNamedElement*
+	//	'}';
+	public XliaObjectElements getXliaObjectAccess() {
+		return pXliaObject;
+	}
+	
+	public ParserRule getXliaObjectRule() {
+		return getXliaObjectAccess().getRule();
+	}
+	
+	//XliaAttribute:
+	//	name=XLIA_ID '=' value=Expression ';';
+	public XliaAttributeElements getXliaAttributeAccess() {
+		return pXliaAttribute;
+	}
+	
+	public ParserRule getXliaAttributeRule() {
+		return getXliaAttributeAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Primitive Value
+	//////////////////////////////////////////////////////////////////////////////////
+	//EBoolean ecore::EBoolean:
+	//	'true' | 'false'
+	public EBooleanElements getEBooleanAccess() {
+		return pEBoolean;
+	}
+	
+	public ParserRule getEBooleanRule() {
+		return getEBooleanAccess().getRule();
+	}
+	
+	//terminal INT returns ecore::EInt:
+	//	'0'..'9'+;
+	public TerminalRule getINTRule() {
+		return tINT;
+	}
+	
+	//EInt ecore::EInt:
+	//	'-'? INT
+	public EIntElements getEIntAccess() {
+		return pEInt;
+	}
+	
+	public ParserRule getEIntRule() {
+		return getEIntAccess().getRule();
+	}
+	
+	//EInteger ecore::ELong:
+	//	'-'? INT
+	public EIntegerElements getEIntegerAccess() {
+		return pEInteger;
+	}
+	
+	public ParserRule getEIntegerRule() {
+		return getEIntegerAccess().getRule();
+	}
+	
+	//EFloat ecore::EFloat:
+	//	'-'? INT? '.' INT
+	public EFloatElements getEFloatAccess() {
+		return pEFloat;
+	}
+	
+	public ParserRule getEFloatRule() {
+		return getEFloatAccess().getRule();
+	}
+	
+	//EDouble ecore::EDouble:
+	//	'-'? INT? '.' INT
+	public EDoubleElements getEDoubleAccess() {
+		return pEDouble;
+	}
+	
+	public ParserRule getEDoubleRule() {
+		return getEDoubleAccess().getRule();
+	}
+	
+	//terminal CHARACTER:
+	//	"'" . "'";
+	public TerminalRule getCHARACTERRule() {
+		return tCHARACTER;
+	}
+	
+	//ECharacter ecore::EChar:
+	//	CHARACTER
+	public ECharacterElements getECharacterAccess() {
+		return pECharacter;
+	}
+	
+	public ParserRule getECharacterRule() {
+		return getECharacterAccess().getRule();
+	}
+	
+	//EString:
+	//	STRING;
+	public EStringElements getEStringAccess() {
+		return pEString;
+	}
+	
+	public ParserRule getEStringRule() {
+		return getEStringAccess().getRule();
+	}
+	
+	////QualifiedName returns ecore::EString
+	////	: ID ( '[' ID ']' )? '.' ID ( '[' ID ']' )? | ID
+	////	;
+	//ReservedWord:
+	//	'package' | 'system' | 'machine'
+	//	| 'statemachine' | 'state' | 'pseudostate' | 'vertex'
+	//	| 'procedure' | 'macro' | 'routine' | 'transition'
+	//	| 'public' | 'private' | 'protected'
+	//	| 'static' | 'final' | 'reference' | 'volatile' | 'transient'
+	//	| 'model' | 'prototype' | 'instance'
+	//	| 'timed' | 'input_enabled'
+	//	| 'port' | 'signal' | 'buffer' | 'channel'
+	//	| 'var' | 'val' | 'const'
+	//	| 'input' | 'in' | 'inout' | 'output' | 'out' | 'return'
+	//	| 'simple' | 'start' | 'final' | 'initial' | 'terminal' | 'junction'
+	//	| 'choice' | 'fork' | 'join' | 'dhistory' | 'shistory'
+	//	| 'route' | 'connect' | 'env' | 'rdv' | 'multi_rdv' | 'buffer'
+	//	| 'unicast' | 'anycast' | 'multicast' | 'broadcast'
+	//	| 'boolean' | 'bool' | 'char' | 'string' | 'message'
+	//	| 'integer' | 'int' | 'uinteger' | 'uint'
+	//	| 'rational' | 'rat' | 'urational' | 'urat'
+	//	| 'time' | 'clock'
+	//	| 'float' | 'double' | 'real' | 'ufloat' | 'udouble' | 'ureal'
+	//	| 'interval' | 'enum' | 'struct' | 'union'
+	//	| 'vector' | 'rvector' | 'list' | 'set' | 'bag' | 'fifo' | 'lifo'
+	//	| 'guard' | 'tguard' | 'event' | 'checksat' | 'via' | 'newfresh'
+	//	| 'break' | 'continue' | 'exit' | 'init' | 'destroy' | 'stop' | 'abort'
+	//	| 'restart' | 'suspend' | 'resume' | 'wait' | 'disable' | 'enable'
+	//	| 'schedule' | 'irun' | 'run' | 'rtc' | 'call' | 'new' | 'ctor'
+	//	| 'this' | 'self' | 'parent' | 'super' | 'null';
+	public ReservedWordElements getReservedWordAccess() {
+		return pReservedWord;
+	}
+	
+	public ParserRule getReservedWordRule() {
+		return getReservedWordAccess().getRule();
+	}
+	
+	//terminal XLIA_ID:
+	//	('a'..'z' | 'A'..'Z' | '_' | '#') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '#')*;
+	public TerminalRule getXLIA_IDRule() {
+		return tXLIA_ID;
+	}
+	
+	//ESIdentifier:
+	//	XLIA_ID;
+	public ESIdentifierElements getESIdentifierAccess() {
+		return pESIdentifier;
+	}
+	
+	public ParserRule getESIdentifierRule() {
+		return getESIdentifierAccess().getRule();
+	}
+	
+	//ESUfid:
+	//	XLIA_ID (('.' | ':' | '::') XLIA_ID)*;
+	public ESUfidElements getESUfidAccess() {
+		return pESUfid;
+	}
+	
+	public ParserRule getESUfidRule() {
+		return getESUfidAccess().getRule();
+	}
+	
+	//UnrestrictedName:
+	//	STRING;
+	public UnrestrictedNameElements getUnrestrictedNameAccess() {
+		return pUnrestrictedName;
+	}
+	
+	public ParserRule getUnrestrictedNameRule() {
+		return getUnrestrictedNameAccess().getRule();
+	}
+	
+	//QualifiedName fmlCommon::QualifiedName:
+	//	UnqualifiedName ('::' nameBinding+=NameBinding)* ('.' nameBinding+=NameBinding)*
+	public QualifiedNameElements getQualifiedNameAccess() {
+		return pQualifiedName;
+	}
+	
+	public ParserRule getQualifiedNameRule() {
+		return getQualifiedNameAccess().getRule();
+	}
+	
+	//PotentiallyAmbiguousQualifiedName fmlCommon::QualifiedName:
+	//	UnqualifiedName ('::' nameBinding+=NameBinding)* (isAmbiguous?='.' nameBinding+=NameBinding ('.'
+	//	nameBinding+=NameBinding)*)?
+	public PotentiallyAmbiguousQualifiedNameElements getPotentiallyAmbiguousQualifiedNameAccess() {
+		return pPotentiallyAmbiguousQualifiedName;
+	}
+	
+	public ParserRule getPotentiallyAmbiguousQualifiedNameRule() {
+		return getPotentiallyAmbiguousQualifiedNameAccess().getRule();
+	}
+	
+	//ColonQualifiedName fmlCommon::QualifiedName:
+	//	UnqualifiedName ('::' nameBinding+=NameBinding)+
+	public ColonQualifiedNameElements getColonQualifiedNameAccess() {
+		return pColonQualifiedName;
+	}
+	
+	public ParserRule getColonQualifiedNameRule() {
+		return getColonQualifiedNameAccess().getRule();
+	}
+	
+	//DotQualifiedName fmlCommon::QualifiedName:
+	//	UnqualifiedName ('.' nameBinding+=NameBinding)+
+	public DotQualifiedNameElements getDotQualifiedNameAccess() {
+		return pDotQualifiedName;
+	}
+	
+	public ParserRule getDotQualifiedNameRule() {
+		return getDotQualifiedNameAccess().getRule();
+	}
+	
+	//UnqualifiedName fmlCommon::QualifiedName:
+	//	nameBinding+=NameBinding
+	public UnqualifiedNameElements getUnqualifiedNameAccess() {
+		return pUnqualifiedName;
+	}
+	
+	public ParserRule getUnqualifiedNameRule() {
+		return getUnqualifiedNameAccess().getRule();
+	}
+	
+	//NameBinding:
+	//	XLIA_ID;
+	public NameBindingElements getNameBindingAccess() {
+		return pNameBinding;
+	}
+	
+	public ParserRule getNameBindingRule() {
+		return getNameBindingAccess().getRule();
+	}
+	
+	//enum VisibilityKind returns fmlCommon::VisibilityKind:
+	//	public | private | protected | package;
+	public VisibilityKindElements getVisibilityKindAccess() {
+		return eVisibilityKind;
+	}
+	
+	public EnumRule getVisibilityKindRule() {
+		return getVisibilityKindAccess().getRule();
+	}
+	
+	//enum DesignKind returns fmlInfra::DesignKind:
+	//	model | prototype;
+	public DesignKindElements getDesignKindAccess() {
+		return eDesignKind;
+	}
+	
+	public EnumRule getDesignKindRule() {
+		return getDesignKindAccess().getRule();
+	}
+	
+	//enum DesignInstanceKind returns fmlInfra::DesignKind:
+	//	instance;
+	public DesignInstanceKindElements getDesignInstanceKindAccess() {
+		return eDesignInstanceKind;
+	}
+	
+	public EnumRule getDesignInstanceKindRule() {
+		return getDesignInstanceKindAccess().getRule();
+	}
+	
+	//System fmlInfra::System:
+	//	(visibility=VisibilityKind?
+	//	& (timed?='timed' | input_enabled?='input_enabled')?)
+	//	'system' ('<' 'moc:'? ('and' | 'or') '>')?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	'{' (port+=Port
+	//	| signal+=Signal
+	//	| buffer+=Buffer
+	//	| channel+=Channel
+	//	| typedef+=TypeDefinition
+	//	| property+=Variable)*
+	//	('@property:' (port+=Port
+	//	| signal+=Signal
+	//	| buffer+=Buffer
+	//	| channel+=Channel
+	//	| typedef+=TypeDefinition
+	//	| property+=Variable)*
+	//	| '@public:' (port+=PortPublic
+	//	| signal+=SignalPublic
+	//	| buffer+=BufferPublic
+	//	| channel+=ChannelPublic
+	//	| typedef+=TypeDefinition
+	//	| property+=VariablePublic)*
+	//	| '@protected:' (port+=PortProtected
+	//	| signal+=SignalProtected
+	//	| buffer+=BufferProtected
+	//	| channel+=ChannelProtected
+	//	| typedef+=TypeDefinition
+	//	| property+=VariableProtected)*
+	//	| '@private:' (port+=PortPrivate
+	//	| signal+=SignalPrivate
+	//	| buffer+=BufferPrivate
+	//	| channel+=ChannelPrivate
+	//	| typedef+=TypeDefinition
+	//	| property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+
+	//	| '@procedure:' procedure+=Procedure+)*
+	//	| (routine+=Routine | procedure+=Procedure)+) (('@composite:' | '@machine:') (machine+=AnyMachineBlock
+	//	| instance+=InstanceMachine)+
+	//	| '@model:' machine+=AnyMachineBlock*
+	//	| '@prototype:' machine+=AnyMachineBlock*
+	//	| '@instance:' instance+=InstanceMachine*)* ('@behavior:' behavior+=Behavior+
+	//	| '@statemachine:' behavior+=Statemachine+)*
+	//	main=MoeBehavior
+	//	'}'
+	public SystemElements getSystemAccess() {
+		return pSystem;
+	}
+	
+	public ParserRule getSystemRule() {
+		return getSystemAccess().getRule();
+	}
+	
+	//AnyMachineBlock fmlInfra::Machine:
+	//	MachineBlock
+	//	| Statemachine
+	public AnyMachineBlockElements getAnyMachineBlockAccess() {
+		return pAnyMachineBlock;
+	}
+	
+	public ParserRule getAnyMachineBlockRule() {
+		return getAnyMachineBlockAccess().getRule();
+	}
+	
+	//InstanceMachine fmlInfra::InstanceMachine:
+	//	'instance' ('machine' | 'statemachine')?
+	//	'<' 'model:'? model=[fmlInfra::Machine|ESUfid] '>'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? (('(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')')? ';'
+	//	| '{' (slot+=SlotProperty ';')* '}')
+	public InstanceMachineElements getInstanceMachineAccess() {
+		return pInstanceMachine;
+	}
+	
+	public ParserRule getInstanceMachineRule() {
+		return getInstanceMachineAccess().getRule();
+	}
+	
+	//SlotParameter fmlInfra::SlotProperty:
+	//	xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier] ':' value=Expression
+	public SlotParameterElements getSlotParameterAccess() {
+		return pSlotParameter;
+	}
+	
+	public ParserRule getSlotParameterRule() {
+		return getSlotParameterAccess().getRule();
+	}
+	
+	//SlotProperty fmlInfra::SlotProperty:
+	//	xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier] '=' value=Expression
+	public SlotPropertyElements getSlotPropertyAccess() {
+		return pSlotProperty;
+	}
+	
+	public ParserRule getSlotPropertyRule() {
+		return getSlotPropertyAccess().getRule();
+	}
+	
+	//MachineBlock fmlInfra::Machine:
+	//	(visibility=VisibilityKind?
+	//	& (timed?='timed' | input_enabled?='input_enabled')?
+	//	& design=DesignKind?)
+	//	'machine' ('<' 'moc:'? ('and' | 'or') '>')?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	'{' (port+=Port
+	//	| signal+=Signal
+	//	| buffer+=Buffer
+	//	| channel+=Channel
+	//	| typedef+=TypeDefinition
+	//	| property+=Variable)*
+	//	('@property:' (port+=Port
+	//	| signal+=Signal
+	//	| buffer+=Buffer
+	//	| channel+=Channel
+	//	| typedef+=TypeDefinition
+	//	| property+=Variable)*
+	//	| '@public:' (port+=PortPublic
+	//	| signal+=SignalPublic
+	//	| buffer+=BufferPublic
+	//	| channel+=ChannelPublic
+	//	| typedef+=TypeDefinition
+	//	| property+=VariablePublic)*
+	//	| '@protected:' (port+=PortProtected
+	//	| signal+=SignalProtected
+	//	| buffer+=BufferProtected
+	//	| channel+=ChannelProtected
+	//	| typedef+=TypeDefinition
+	//	| property+=VariableProtected)*
+	//	| '@private:' (port+=PortPrivate
+	//	| signal+=SignalPrivate
+	//	| buffer+=BufferPrivate
+	//	| channel+=ChannelPrivate
+	//	| typedef+=TypeDefinition
+	//	| property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+
+	//	| '@procedure:' procedure+=Procedure+)*
+	//	| (routine+=Routine | procedure+=Procedure)+) (('@composite:' | '@machine:') (machine+=AnyMachineBlock
+	//	| instance+=InstanceMachine)+
+	//	| '@model:' machine+=AnyMachineBlock*
+	//	| '@prototype:' machine+=AnyMachineBlock*
+	//	| '@instance:' instance+=InstanceMachine*)* ('@behavior:' behavior+=Behavior+
+	//	| '@statemachine:' behavior+=Statemachine+)*
+	//	main=MoeBehavior
+	//	'}'
+	public MachineBlockElements getMachineBlockAccess() {
+		return pMachineBlock;
+	}
+	
+	public ParserRule getMachineBlockRule() {
+		return getMachineBlockAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Procedure View Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Procedure fmlInfra::Procedure:
+	//	visibility=VisibilityKind?
+	//	'procedure' ('<' 'moc:'? ('and' | 'or') '>')?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? (('(' (parameter+=FunctionalParameter (','
+	//	parameter+=FunctionalParameter)*)? ')')? ('-->' (parameter+=FormalParameter
+	//	| '(' parameter+=FormalParameter (',' parameter+=FormalParameter)* ')'))?)?
+	//	'{' ('@parameter:' ('input' (parameter+=ParameterInput
+	//	| '{' parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout
+	//	| '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput
+	//	| '{' parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn
+	//	| '{' parameter+=ParameterReturn+ '}'))*
+	//	| (port+=Port
+	//	| signal+=Signal
+	//	| buffer+=Buffer
+	//	| channel+=Channel
+	//	| typedef+=TypeDefinition
+	//	| property+=Variable)*) ('@input:' (parameter+=ParameterInput
+	//	| '{' parameter+=ParameterInput+ '}')*
+	//	| '@inout:' (parameter+=ParameterInout
+	//	| '{' parameter+=ParameterInout+ '}')*
+	//	| '@output:' (parameter+=ParameterOutput
+	//	| '{' parameter+=ParameterOutput+ '}')*
+	//	| '@return:' (parameter+=ParameterReturn
+	//	| '{' parameter+=ParameterReturn+ '}')*)* ('@property:' (port+=Port
+	//	| signal+=Signal
+	//	| buffer+=Buffer
+	//	| channel+=Channel
+	//	| typedef+=TypeDefinition
+	//	| property+=Variable)*
+	//	| '@public:' (port+=PortPublic
+	//	| signal+=SignalPublic
+	//	| buffer+=BufferPublic
+	//	| channel+=ChannelPublic
+	//	| typedef+=TypeDefinition
+	//	| property+=VariablePublic)*
+	//	| '@protected:' (port+=PortProtected
+	//	| signal+=SignalProtected
+	//	| buffer+=BufferProtected
+	//	| channel+=ChannelProtected
+	//	| typedef+=TypeDefinition
+	//	| property+=VariableProtected)*
+	//	| '@private:' (port+=PortPrivate
+	//	| signal+=SignalPrivate
+	//	| buffer+=BufferPrivate
+	//	| channel+=ChannelPrivate
+	//	| typedef+=TypeDefinition
+	//	| property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+
+	//	| '@procedure:' procedure+=Procedure+)*
+	//	| (routine+=Routine | procedure+=Procedure)+) (region+=StatemachineRegion+
+	//	| region+=StatemachineRegionLite)?
+	//	execution=ProcedureExecution?
+	//	//		& ( computation=ModelOfComputation )?
+	//	//		& ( interaction=ModelOfInteraction )?
+	//	'}'
+	public ProcedureElements getProcedureAccess() {
+		return pProcedure;
+	}
+	
+	public ParserRule getProcedureRule() {
+		return getProcedureAccess().getRule();
+	}
+	
+	//ProcedureExecution fmlInfra::ModelOfExecution:
+	//	{fmlInfra::ModelOfExecution} '@moe:'? (('@schedule' scheduleRoutine=moeRoutine)?
+	//	& ('@run' runRoutine=moeRoutine)?)
+	public ProcedureExecutionElements getProcedureExecutionAccess() {
+		return pProcedureExecution;
+	}
+	
+	public ParserRule getProcedureExecutionRule() {
+		return getProcedureExecutionAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Behavior View Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Behavior fmlInfra::Behavior:
+	//	Statemachine
+	public BehaviorElements getBehaviorAccess() {
+		return pBehavior;
+	}
+	
+	public ParserRule getBehaviorRule() {
+		return getBehaviorAccess().getRule();
+	}
+	
+	//MoeBehavior fmlInfra::Behavior:
+	//	{fmlInfra::Behavior} ('@local:' (port+=PortPrivate
+	//	| signal+=SignalPrivate
+	//	| buffer+=BufferPrivate
+	//	| channel+=ChannelPrivate
+	//	| typedef+=TypeDefinition
+	//	| property+=VariablePrivate)*)? (execution=ModelOfExecution?
+	//	//		& ( computation=ModelOfComputation )?
+	//	& interaction=ModelOfInteraction?)
+	public MoeBehaviorElements getMoeBehaviorAccess() {
+		return pMoeBehavior;
+	}
+	
+	public ParserRule getMoeBehaviorRule() {
+		return getMoeBehaviorAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Statemachine Behavior View Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Statemachine fmlStmchn::Statemachine:
+	//	{fmlStmchn::Statemachine} (visibility=VisibilityKind?
+	//	& (timed?='timed' | input_enabled?='input_enabled')?
+	//	& design=DesignKind?)
+	//	'statemachine' ('<' 'moc:'? ('or' | 'and') '>')?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	'{' ('@parameter:' ('input' (parameter+=ParameterInput
+	//	| '{' parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout
+	//	| '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput
+	//	| '{' parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn
+	//	| '{' parameter+=ParameterReturn+ '}'))*
+	//	| (port+=Port
+	//	| signal+=Signal
+	//	| buffer+=Buffer
+	//	| channel+=Channel
+	//	| typedef+=TypeDefinition
+	//	| property+=Variable)*) ('@input:' (parameter+=ParameterInput
+	//	| '{' parameter+=ParameterInput+ '}')*
+	//	| '@inout:' (parameter+=ParameterInout
+	//	| '{' parameter+=ParameterInout+ '}')*
+	//	| '@output:' (parameter+=ParameterOutput
+	//	| '{' parameter+=ParameterOutput+ '}')*
+	//	| '@return:' (parameter+=ParameterReturn
+	//	| '{' parameter+=ParameterReturn+ '}')*)* ('@property:' (port+=Port
+	//	| signal+=Signal
+	//	| buffer+=Buffer
+	//	| channel+=Channel
+	//	| typedef+=TypeDefinition
+	//	| property+=Variable)*
+	//	| '@public:' (port+=PortPublic
+	//	| signal+=SignalPublic
+	//	| buffer+=BufferPublic
+	//	| channel+=ChannelPublic
+	//	| typedef+=TypeDefinition
+	//	| property+=VariablePublic)*
+	//	| '@protected:' (port+=PortProtected
+	//	| signal+=SignalProtected
+	//	| buffer+=BufferProtected
+	//	| channel+=ChannelProtected
+	//	| typedef+=TypeDefinition
+	//	| property+=VariableProtected)*
+	//	| '@private:' (port+=PortPrivate
+	//	| signal+=SignalPrivate
+	//	| buffer+=BufferPrivate
+	//	| channel+=ChannelPrivate
+	//	| typedef+=TypeDefinition
+	//	| property+=VariablePrivate)*)* ((('@routine:' | '@macro:') routine+=Routine+
+	//	| '@procedure:' procedure+=Procedure+)*
+	//	| (routine+=Routine | procedure+=Procedure)+) (region+=StatemachineRegion+
+	//	| region+=StatemachineRegionLite) (execution=ModelOfExecution?
+	//	//		& ( computation=ModelOfComputation )?
+	//	& interaction=ModelOfInteraction?)
+	//	'}'
+	public StatemachineElements getStatemachineAccess() {
+		return pStatemachine;
+	}
+	
+	public ParserRule getStatemachineRule() {
+		return getStatemachineAccess().getRule();
+	}
+	
+	//StatemachineRegion fmlStmchn::Region:
+	//	{fmlStmchn::Region} (('@region:' | '@statemachine:') | ('@region<' | '@statemachine<') name=ESIdentifier
+	//	unrestrictedName=UnrestrictedName? '>:') (vertex+=State
+	//	| vertex+=Pseudostate)+
+	public StatemachineRegionElements getStatemachineRegionAccess() {
+		return pStatemachineRegion;
+	}
+	
+	public ParserRule getStatemachineRegionRule() {
+		return getStatemachineRegionAccess().getRule();
+	}
+	
+	//StatemachineRegionLite fmlStmchn::Region:
+	//	(vertex+=State | vertex+=Pseudostate)+
+	public StatemachineRegionLiteElements getStatemachineRegionLiteAccess() {
+		return pStatemachineRegionLite;
+	}
+	
+	public ParserRule getStatemachineRegionLiteRule() {
+		return getStatemachineRegionLiteAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// State Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//State fmlStmchn::State:
+	//	CompositeState
+	//	| StartState
+	//	| SimpleState
+	//	| FinalState
+	public StateElements getStateAccess() {
+		return pState;
+	}
+	
+	public ParserRule getStateRule() {
+		return getStateAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// CompositeState Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//CompositeState fmlStmchn::State:
+	//	{fmlStmchn::State} composite?='state' '<' 'moc:'? ('or' | orthogonal?='and') '>'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('{' ((region+=StatemachineRegion
+	//	| '@moe:' moe+=moeCompositeStateRoutines*
+	//	| '@transition:' transition+=Transition*)+
+	//	| region+=StatemachineRegionLite (transition+=Transition
+	//	| moe+=moeCompositeStateRoutines)*)
+	//	'}'
+	//	| ';')
+	public CompositeStateElements getCompositeStateAccess() {
+		return pCompositeState;
+	}
+	
+	public ParserRule getCompositeStateRule() {
+		return getCompositeStateAccess().getRule();
+	}
+	
+	//moeCompositeStateRoutines fmlInfra::Routine:
+	//	{fmlInfra::Routine} name=('@init' | '@final' | '@enable' | '@disable'
+	//	| '@concurrency' | '@schedule' | '@irun' | '@run') bodyBlock=BlockStatement
+	public MoeCompositeStateRoutinesElements getMoeCompositeStateRoutinesAccess() {
+		return pMoeCompositeStateRoutines;
+	}
+	
+	public ParserRule getMoeCompositeStateRoutinesRule() {
+		return getMoeCompositeStateRoutinesAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// SimpleState Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//SimpleState fmlStmchn::State:
+	//	{fmlStmchn::State} simple?='state' ('<' 'moc:'? 'simple' '>')?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('{' (transition+=Transition
+	//	| moe+=moeSimpleStateRoutines)*
+	//	'}'
+	//	| ';')
+	public SimpleStateElements getSimpleStateAccess() {
+		return pSimpleState;
+	}
+	
+	public ParserRule getSimpleStateRule() {
+		return getSimpleStateAccess().getRule();
+	}
+	
+	//moeSimpleStateRoutines fmlInfra::Routine:
+	//	{fmlInfra::Routine} name=('@enable' | '@disable' | '@irun' / *| '@run'* /) bodyBlock=BlockStatement
+	public MoeSimpleStateRoutinesElements getMoeSimpleStateRoutinesAccess() {
+		return pMoeSimpleStateRoutines;
+	}
+	
+	public ParserRule getMoeSimpleStateRoutinesRule() {
+		return getMoeSimpleStateRoutinesAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// StartState Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//StartState fmlStmchn::StartState:
+	//	{fmlStmchn::StartState} (simple?='state' '<' 'moc:'? 'start' '>' name=ESIdentifier
+	//	| simple?='#start') unrestrictedName=UnrestrictedName? ('{' (transition+=Transition
+	//	| moe+=moeStartStateRoutines)*
+	//	'}'
+	//	| ';')
+	public StartStateElements getStartStateAccess() {
+		return pStartState;
+	}
+	
+	public ParserRule getStartStateRule() {
+		return getStartStateAccess().getRule();
+	}
+	
+	//moeStartStateRoutines fmlInfra::Routine:
+	//	{fmlInfra::Routine} name=('@init' | '@enable' | '@disable' | '@irun' / *| '@run'* /) bodyBlock=BlockStatement
+	public MoeStartStateRoutinesElements getMoeStartStateRoutinesAccess() {
+		return pMoeStartStateRoutines;
+	}
+	
+	public ParserRule getMoeStartStateRoutinesRule() {
+		return getMoeStartStateRoutinesAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// FinalState Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//FinalState fmlStmchn::FinalState:
+	//	{fmlStmchn::FinalState} (simple?='state' '<' 'moc:'? 'final' '>' name=ESIdentifier
+	//	| simple?='#final') unrestrictedName=UnrestrictedName? ('{'
+	//	moe+=moeFinalStateRoutines*
+	//	'}'
+	//	| ';')
+	public FinalStateElements getFinalStateAccess() {
+		return pFinalState;
+	}
+	
+	public ParserRule getFinalStateRule() {
+		return getFinalStateAccess().getRule();
+	}
+	
+	//moeFinalStateRoutines fmlInfra::Routine:
+	//	{fmlInfra::Routine} name=('@enable' | '@final' / *| '@run'* /) bodyBlock=BlockStatement
+	public MoeFinalStateRoutinesElements getMoeFinalStateRoutinesAccess() {
+		return pMoeFinalStateRoutines;
+	}
+	
+	public ParserRule getMoeFinalStateRoutinesRule() {
+		return getMoeFinalStateRoutinesAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Pseudostate Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Pseudostate fmlStmchn::Pseudostate:
+	//	PseudostateInitial
+	//	| EndingPseudostate
+	//	| OtherPseudostate
+	public PseudostateElements getPseudostateAccess() {
+		return pPseudostate;
+	}
+	
+	public ParserRule getPseudostateRule() {
+		return getPseudostateAccess().getRule();
+	}
+	
+	//OtherPseudostate fmlStmchn::Pseudostate:
+	//	{fmlStmchn::Pseudostate} ('state' | 'pseudostate') '<' 'moc:'? kind=PseudostateKind '>'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('{' transition+=Transition* '}'
+	//	| ';')
+	public OtherPseudostateElements getOtherPseudostateAccess() {
+		return pOtherPseudostate;
+	}
+	
+	public ParserRule getOtherPseudostateRule() {
+		return getOtherPseudostateAccess().getRule();
+	}
+	
+	//enum PseudostateKind returns fmlStmchn::PseudostateKind:
+	//	junction | choice | junction='entryPoint'
+	//	| choice='exitPoint'
+	//	//	| initial ='initial'
+	//	//		
+	//	//	| terminate='terminal'
+	//	//	| return   ='return'
+	//
+	//	| fork | join | deepHistory='dhistory'
+	//	| shallowHistory='shistory';
+	public PseudostateKindElements getPseudostateKindAccess() {
+		return ePseudostateKind;
+	}
+	
+	public EnumRule getPseudostateKindRule() {
+		return getPseudostateKindAccess().getRule();
+	}
+	
+	//PseudostateInitial fmlStmchn::Pseudostate:
+	//	{fmlStmchn::Pseudostate} (('state' | 'pseudostate')
+	//	'<' 'moc:'? kind=PseudostateInitialKind '>'
+	//	name=(ESIdentifier | '#initial' | '#init') | name=('#initial' | '#init')) unrestrictedName=UnrestrictedName? ('{'
+	//	transition+=Transition* '}' | ';')
+	public PseudostateInitialElements getPseudostateInitialAccess() {
+		return pPseudostateInitial;
+	}
+	
+	public ParserRule getPseudostateInitialRule() {
+		return getPseudostateInitialAccess().getRule();
+	}
+	
+	//enum PseudostateInitialKind returns fmlStmchn::PseudostateKind:
+	//	initial;
+	public PseudostateInitialKindElements getPseudostateInitialKindAccess() {
+		return ePseudostateInitialKind;
+	}
+	
+	public EnumRule getPseudostateInitialKindRule() {
+		return getPseudostateInitialKindAccess().getRule();
+	}
+	
+	//EndingPseudostate fmlStmchn::Pseudostate:
+	//	{fmlStmchn::Pseudostate} ('state' | 'pseudostate') '<' 'moc:'? kind=EndingPseudostateKind '>'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('{'
+	//	moe+=moeFinalStateRoutines*
+	//	'}'
+	//	| ';')
+	public EndingPseudostateElements getEndingPseudostateAccess() {
+		return pEndingPseudostate;
+	}
+	
+	public ParserRule getEndingPseudostateRule() {
+		return getEndingPseudostateAccess().getRule();
+	}
+	
+	//enum EndingPseudostateKind returns fmlStmchn::PseudostateKind:
+	//	terminate='terminal'
+	//	| return;
+	public EndingPseudostateKindElements getEndingPseudostateKindAccess() {
+		return eEndingPseudostateKind;
+	}
+	
+	public EnumRule getEndingPseudostateKindRule() {
+		return getEndingPseudostateKindAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Section Model Of Computation Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//ModelOfComputation fmlInfra::ModelOfComputation:
+	//	{fmlInfra::ModelOfComputation}
+	public ModelOfComputationElements getModelOfComputationAccess() {
+		return pModelOfComputation;
+	}
+	
+	public ParserRule getModelOfComputationRule() {
+		return getModelOfComputationAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Section Model Of Execution Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//ModelOfExecution fmlInfra::ModelOfExecution:
+	//	{fmlInfra::ModelOfExecution}
+	//	'@moe:'
+	//	routine+=Routine* (('@init' initRoutine=moeRoutine)?
+	//	& ('@final' finalRoutine=moeRoutine)?
+	//	& ('@enable' enableRoutine=moeRoutine)?
+	//	& ('@disable' disableRoutine=moeRoutine)?
+	//	& ('@concurrency' concurrencyRoutine=moeRoutine)?
+	//	& ('@schedule' scheduleRoutine=moeRoutine)?
+	//	& ('@irun' irunRoutine=moeRoutine)?
+	//	& ('@run' runRoutine=moeRoutine)?) routine+=Routine*
+	public ModelOfExecutionElements getModelOfExecutionAccess() {
+		return pModelOfExecution;
+	}
+	
+	public ParserRule getModelOfExecutionRule() {
+		return getModelOfExecutionAccess().getRule();
+	}
+	
+	//moeRoutine fmlInfra::Routine:
+	//	{fmlInfra::Routine} ('(' domain=FunctionalParameterSet? ')')? ('->' ('(' codomain=FunctionalParameterSet ')'
+	//	| codomain=FunctionalParameterSet))?
+	//	bodyBlock=BlockStatement
+	public MoeRoutineElements getMoeRoutineAccess() {
+		return pMoeRoutine;
+	}
+	
+	public ParserRule getMoeRoutineRule() {
+		return getMoeRoutineAccess().getRule();
+	}
+	
+	//Routine fmlInfra::Routine:
+	//	visibility=VisibilityKind? 'macro'? 'routine'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('(' domain=FunctionalParameterSet? ')')? ('-->' ('('
+	//	codomain=FunctionalParameterSet ')'
+	//	| codomain=FormalParameterSet))?
+	//	bodyBlock=BlockStatement
+	public RoutineElements getRoutineAccess() {
+		return pRoutine;
+	}
+	
+	public ParserRule getRoutineRule() {
+		return getRoutineAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Section Model Of Interaction / Communication Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//ModelOfInteraction fmlInfra::ModelOfInteraction:
+	//	{fmlInfra::ModelOfInteraction}
+	//	'@com:' (routes+=Route
+	//	| connections+=Connection)*
+	public ModelOfInteractionElements getModelOfInteractionAccess() {
+		return pModelOfInteraction;
+	}
+	
+	public ParserRule getModelOfInteractionRule() {
+		return getModelOfInteractionAccess().getRule();
+	}
+	
+	//Route fmlInfra::Route:
+	//	{fmlInfra::Route}
+	//	'route' '<' protocol=ComRouteProtocol '>' (name=ESIdentifier unrestrictedName=UnrestrictedName?)?
+	//	'[' ('*'
+	//	| signals+=[fmlInfra::Signal|ESUfid] (',' signals+=[fmlInfra::Signal|ESUfid])*)
+	//	']' ';'
+	public RouteElements getRouteAccess() {
+		return pRoute;
+	}
+	
+	public ParserRule getRouteRule() {
+		return getRouteAccess().getRule();
+	}
+	
+	//ComRouteProtocol fmlInfra::ComProtocol:
+	//	protocol=ComProtocolKind
+	//	| protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType
+	//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType
+	//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+	//	| inner_buffer=BufferContainerType
+	//	| ref_buffer=[fmlInfra::Buffer|ESUfid]
+	public ComRouteProtocolElements getComRouteProtocolAccess() {
+		return pComRouteProtocol;
+	}
+	
+	public ParserRule getComRouteProtocolRule() {
+		return getComRouteProtocolAccess().getRule();
+	}
+	
+	//Connection fmlInfra::Connection:
+	//	'connect' '<' protocol=ComProtocol '>' (name=ESIdentifier unrestrictedName=UnrestrictedName?)?
+	//	'{' comPoints+=ComPoint+ '}'
+	public ConnectionElements getConnectionAccess() {
+		return pConnection;
+	}
+	
+	public ParserRule getConnectionRule() {
+		return getConnectionAccess().getRule();
+	}
+	
+	//ComProtocol fmlInfra::ComProtocol:
+	//	protocol=ComEnvRdvProtocolKind
+	//	| protocol=ComMultiRdvProtocolKind ('<' cast=ComCastKing '>')?
+	//	| protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType
+	//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType
+	//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+	//	| inner_buffer=BufferContainerType
+	//	| ref_buffer=[fmlInfra::Buffer|ESUfid] | cast=ComCastKing
+	public ComProtocolElements getComProtocolAccess() {
+		return pComProtocol;
+	}
+	
+	public ParserRule getComProtocolRule() {
+		return getComProtocolAccess().getRule();
+	}
+	
+	//enum ComProtocolKind returns fmlInfra::ComProtocolKind:
+	//	env | rdv | multi_rdv;
+	public ComProtocolKindElements getComProtocolKindAccess() {
+		return eComProtocolKind;
+	}
+	
+	public EnumRule getComProtocolKindRule() {
+		return getComProtocolKindAccess().getRule();
+	}
+	
+	//enum ComEnvRdvProtocolKind returns fmlInfra::ComProtocolKind:
+	//	env | rdv;
+	public ComEnvRdvProtocolKindElements getComEnvRdvProtocolKindAccess() {
+		return eComEnvRdvProtocolKind;
+	}
+	
+	public EnumRule getComEnvRdvProtocolKindRule() {
+		return getComEnvRdvProtocolKindAccess().getRule();
+	}
+	
+	//enum ComMultiRdvProtocolKind returns fmlInfra::ComProtocolKind:
+	//	multi_rdv;
+	public ComMultiRdvProtocolKindElements getComMultiRdvProtocolKindAccess() {
+		return eComMultiRdvProtocolKind;
+	}
+	
+	public EnumRule getComMultiRdvProtocolKindRule() {
+		return getComMultiRdvProtocolKindAccess().getRule();
+	}
+	
+	//enum BufferProtocolKind returns fmlInfra::ComProtocolKind:
+	//	buffer;
+	public BufferProtocolKindElements getBufferProtocolKindAccess() {
+		return eBufferProtocolKind;
+	}
+	
+	public EnumRule getBufferProtocolKindRule() {
+		return getBufferProtocolKindAccess().getRule();
+	}
+	
+	//enum ComCastKing returns fmlInfra::ComCastKind:
+	//	unicast | anycast | multicast | broadcast;
+	public ComCastKingElements getComCastKingAccess() {
+		return eComCastKing;
+	}
+	
+	public EnumRule getComCastKingRule() {
+		return getComCastKingAccess().getRule();
+	}
+	
+	//ComPoint fmlInfra::ComPoint:
+	//	{fmlInfra::ComPoint} direction=ChannelDirection ('<' protocol=ComPointProtocol '>')? (point=ComElement ';'
+	//	| '{' points+=ComElement '}')
+	public ComPointElements getComPointAccess() {
+		return pComPoint;
+	}
+	
+	public ParserRule getComPointRule() {
+		return getComPointAccess().getRule();
+	}
+	
+	//ComPointProtocol fmlInfra::ComProtocol:
+	//	protocol=BufferProtocolKind (':' (inner_buffer=BufferContainerType
+	//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) | '<' (inner_buffer=BufferContainerType
+	//	| ref_buffer=[fmlInfra::Buffer|ESUfid]) '>')?
+	//	| inner_buffer=BufferContainerType
+	//	| ref_buffer=[fmlInfra::Buffer|ESUfid]
+	public ComPointProtocolElements getComPointProtocolAccess() {
+		return pComPointProtocol;
+	}
+	
+	public ParserRule getComPointProtocolRule() {
+		return getComPointProtocolAccess().getRule();
+	}
+	
+	//ComElement fmlExpr::Expression:
+	//	LiteralPureReferenceElement ({fmlExpr::ValueElementSpecification.target=current} kind=(ValueDotFieldExpressionKind |
+	//	ValueArrowFieldExpressionKind) element=[fmlCommon::NamedElement|ESIdentifier])?
+	//	| {fmlExpr::ValueElementSpecification} target=LiteralReferenceMachineContext
+	//	// ( '.' | '->' ) element
+	//	kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind) element=[fmlCommon::NamedElement|ESIdentifier]
+	public ComElementElements getComElementAccess() {
+		return pComElement;
+	}
+	
+	public ParserRule getComElementRule() {
+		return getComElementAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Sections Declarations Data Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	////TypeDefinition returns fmlType::DataType
+	////	: typedef?='type' name=ESIdentifier
+	////		( support=DataTypeReference ';'
+	////		| support=StructuredDataType
+	////		)
+	////	;
+	//TypeDefinition fmlType::DataType:
+	//	EnumerationTypeDefinition
+	//	| StructureTypeDefinition
+	//	| UnionTypeDefinition
+	//	| ChoiceTypeDefinition
+	//	| IntervalTypeDefinition
+	//	| CollectionTypeDefinition
+	//	| OtherDataTypeDefinition
+	public TypeDefinitionElements getTypeDefinitionAccess() {
+		return pTypeDefinition;
+	}
+	
+	public ParserRule getTypeDefinitionRule() {
+		return getTypeDefinitionAccess().getRule();
+	}
+	
+	////TypeDefinitionImpl returns fmlType::DataTypeReference
+	////	: name=ESIdentifier
+	////		( support=DataTypeReference ';'
+	////		| support=StructuredDataType
+	////		)
+	////	;
+	//TypeDefinitionImpl fmlType::DataType:
+	//	EnumerationTypeDefinitionImpl
+	//	| StructureTypeDefinitionImpl
+	//	| UnionTypeDefinitionImpl
+	//	| ChoiceTypeDefinitionImpl
+	//	| IntervalTypeDefinitionImpl
+	//	| CollectionTypeDefinitionImpl
+	//	| OtherDataTypeDefinitionImpl
+	public TypeDefinitionImplElements getTypeDefinitionImplAccess() {
+		return pTypeDefinitionImpl;
+	}
+	
+	public ParserRule getTypeDefinitionImplRule() {
+		return getTypeDefinitionImplAccess().getRule();
+	}
+	
+	//DataTypeMultiplicity fmlExpr::Expression:
+	//	LiteralIntegerExpression
+	//	| LiteralReferenceElement
+	public DataTypeMultiplicityElements getDataTypeMultiplicityAccess() {
+		return pDataTypeMultiplicity;
+	}
+	
+	public ParserRule getDataTypeMultiplicityRule() {
+		return getDataTypeMultiplicityAccess().getRule();
+	}
+	
+	//DataTypeReference fmlType::DataType:
+	//	SimpleDataType ({fmlType::DataTypeReference.support=current}
+	//	'[' multiplicity=DataTypeMultiplicity ']')?
+	//	| {fmlType::DataTypeReference} typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?
+	public DataTypeReferenceElements getDataTypeReferenceAccess() {
+		return pDataTypeReference;
+	}
+	
+	public ParserRule getDataTypeReferenceRule() {
+		return getDataTypeReferenceAccess().getRule();
+	}
+	
+	//OtherDataTypeDefinition fmlType::DataTypeReference:
+	//	{fmlType::DataTypeReference} visibility=VisibilityKind? 'type'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? (support=PrimitiveType ('[' multiplicity=DataTypeMultiplicity
+	//	']')?
+	//	| typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?) typedef?=';'
+	public OtherDataTypeDefinitionElements getOtherDataTypeDefinitionAccess() {
+		return pOtherDataTypeDefinition;
+	}
+	
+	public ParserRule getOtherDataTypeDefinitionRule() {
+		return getOtherDataTypeDefinitionAccess().getRule();
+	}
+	
+	//OtherDataTypeDefinitionImpl fmlType::DataTypeReference:
+	//	{fmlType::DataTypeReference} name=ESIdentifier unrestrictedName=UnrestrictedName? (support=PrimitiveType ('['
+	//	multiplicity=DataTypeMultiplicity ']')?
+	//	| typeref=[fmlType::DataType|ESUfid] ('[' multiplicity=DataTypeMultiplicity ']')?) typedef?=';'
+	public OtherDataTypeDefinitionImplElements getOtherDataTypeDefinitionImplAccess() {
+		return pOtherDataTypeDefinitionImpl;
+	}
+	
+	public ParserRule getOtherDataTypeDefinitionImplRule() {
+		return getOtherDataTypeDefinitionImplAccess().getRule();
+	}
+	
+	//DataType fmlType::DataType:
+	//	DataTypeReference
+	//	| StructuredDataType
+	public DataTypeElements getDataTypeAccess() {
+		return pDataType;
+	}
+	
+	public ParserRule getDataTypeRule() {
+		return getDataTypeAccess().getRule();
+	}
+	
+	//SimpleDataType fmlType::DataType:
+	//	PrimitiveType
+	//	| IntervalType
+	//	| CollectionType
+	public SimpleDataTypeElements getSimpleDataTypeAccess() {
+		return pSimpleDataType;
+	}
+	
+	public ParserRule getSimpleDataTypeRule() {
+		return getSimpleDataTypeAccess().getRule();
+	}
+	
+	//StructuredDataType fmlType::DataType:
+	//	EnumerationType
+	//	| StructureType
+	//	| UnionType
+	//	| ChoiceType
+	public StructuredDataTypeElements getStructuredDataTypeAccess() {
+		return pStructuredDataType;
+	}
+	
+	public ParserRule getStructuredDataTypeRule() {
+		return getStructuredDataTypeAccess().getRule();
+	}
+	
+	////PrimitiveType returns fmlType::PrimitiveType
+	////	: kind=NumberPrimitiveTypeKind ( '<' ( 'bit:' )? bitSize = EInt '>' )?
+	////	| kind=OtherPrimitiveKind
+	////	;
+	////
+	////enum OtherPrimitiveKind returns fmlType::PrimitiveTypeKind
+	////	: BOOLEAN   = 'boolean'
+	////	| BOOLEAN   = 'bool'
+	////	| CHAR      = 'char'
+	////	| STRING    = 'string'
+	////	| BUFFER    = 'buffer'
+	////	| MESSAGE   = 'message'
+	////	| PORT      = 'port'
+	////	| MACHINE   = 'machine'
+	////	;
+	////
+	////
+	////enum NumberPrimitiveTypeKind returns fmlType::PrimitiveTypeKind
+	////	: INTEGER   = 'integer'
+	////	| RATIONAL  = 'rational'
+	////	| FLOAT     = 'float'
+	////	| DOUBLE    = 'double'
+	////	| REAL      = 'real'
+	////
+	////	| TIME      = 'time'
+	////
+	////	| UINTEGER  = 'uinteger'
+	////	| URATIONAL = 'urational'
+	////	| UFLOAT    = 'ufloat'
+	////	| UDOUBLE   = 'udouble'
+	////	| UREAL     = 'ureal'
+	////
+	////	| INT       = 'int'
+	////	| RAT       = 'rat'
+	////
+	////	| UINT      = 'uint'
+	////	| URAT      = 'urat'
+	////	;
+	//PrimitiveType fmlType::PrimitiveType:
+	//	PrimitiveNumberType
+	//	| OtherPrimitiveType
+	public PrimitiveTypeElements getPrimitiveTypeAccess() {
+		return pPrimitiveType;
+	}
+	
+	public ParserRule getPrimitiveTypeRule() {
+		return getPrimitiveTypeAccess().getRule();
+	}
+	
+	//PrimitiveNumberType fmlType::PrimitiveNumberType:
+	//	PrimitiveIntegerType
+	//	| PrimitiveRationalType
+	//	| PrimitiveFloatType
+	//	| PrimitiveRealType
+	//	| PrimitiveTimeType
+	public PrimitiveNumberTypeElements getPrimitiveNumberTypeAccess() {
+		return pPrimitiveNumberType;
+	}
+	
+	public ParserRule getPrimitiveNumberTypeRule() {
+		return getPrimitiveNumberTypeAccess().getRule();
+	}
+	
+	//enum PrimitiveNumberSign returns fmlType::PrimitiveNumberSign:
+	//	positive='+'
+	//	| positive_strict='++'
+	//	| negative='-'
+	//	| negative_strict='--';
+	public PrimitiveNumberSignElements getPrimitiveNumberSignAccess() {
+		return ePrimitiveNumberSign;
+	}
+	
+	public EnumRule getPrimitiveNumberSignRule() {
+		return getPrimitiveNumberSignAccess().getRule();
+	}
+	
+	//PrimitiveIntegerType fmlType::PrimitiveIntegerType:
+	//	{fmlType::PrimitiveIntegerType} sign=PrimitiveNumberSign? ('integer'
+	//	| 'uinteger'
+	//	| 'int'
+	//	| 'uint') (':' size=EInt
+	//	| '<' 'size:'? size=EInt '>')?
+	public PrimitiveIntegerTypeElements getPrimitiveIntegerTypeAccess() {
+		return pPrimitiveIntegerType;
+	}
+	
+	public ParserRule getPrimitiveIntegerTypeRule() {
+		return getPrimitiveIntegerTypeAccess().getRule();
+	}
+	
+	//PrimitiveRationalType fmlType::PrimitiveRationalType:
+	//	{fmlType::PrimitiveRationalType} sign=PrimitiveNumberSign? ('rational'
+	//	| 'urational'
+	//	| 'rat'
+	//	| 'urat') (':' size=EInt
+	//	| '<' 'size:'? size=EInt '>')?
+	public PrimitiveRationalTypeElements getPrimitiveRationalTypeAccess() {
+		return pPrimitiveRationalType;
+	}
+	
+	public ParserRule getPrimitiveRationalTypeRule() {
+		return getPrimitiveRationalTypeAccess().getRule();
+	}
+	
+	//PrimitiveFloatType fmlType::PrimitiveFloatType:
+	//	{fmlType::PrimitiveFloatType} sign=PrimitiveNumberSign? ('float'
+	//	| 'ufloat'
+	//	| 'double'
+	//	| 'udouble') (':' size=EInt
+	//	| '<' 'size:'? size=EInt '>')?
+	public PrimitiveFloatTypeElements getPrimitiveFloatTypeAccess() {
+		return pPrimitiveFloatType;
+	}
+	
+	public ParserRule getPrimitiveFloatTypeRule() {
+		return getPrimitiveFloatTypeAccess().getRule();
+	}
+	
+	//PrimitiveRealType fmlType::PrimitiveRealType:
+	//	{fmlType::PrimitiveRealType} sign=PrimitiveNumberSign? ('real'
+	//	| 'ureal') (':' size=EInt
+	//	| '<' 'size:'? size=EInt '>')?
+	public PrimitiveRealTypeElements getPrimitiveRealTypeAccess() {
+		return pPrimitiveRealType;
+	}
+	
+	public ParserRule getPrimitiveRealTypeRule() {
+		return getPrimitiveRealTypeAccess().getRule();
+	}
+	
+	//PrimitiveTimeType fmlType::PrimitiveTimeType:
+	//	{fmlType::PrimitiveTimeType}
+	//	'time' ('<' support=PrimitiveTimeNumberType '>'
+	//	| support=PrimitiveTimeNumberType)?
+	//	| {fmlType::PrimitiveTimeType} clock?='clock' ('<' support=PrimitiveTimeNumberType '>'
+	//	| support=PrimitiveTimeNumberType)?
+	public PrimitiveTimeTypeElements getPrimitiveTimeTypeAccess() {
+		return pPrimitiveTimeType;
+	}
+	
+	public ParserRule getPrimitiveTimeTypeRule() {
+		return getPrimitiveTimeTypeAccess().getRule();
+	}
+	
+	//PrimitiveTimeNumberType fmlType::PrimitiveNumberType:
+	//	PrimitiveIntegerType
+	//	| PrimitiveRationalType
+	//	| PrimitiveFloatType
+	//	| PrimitiveRealType
+	public PrimitiveTimeNumberTypeElements getPrimitiveTimeNumberTypeAccess() {
+		return pPrimitiveTimeNumberType;
+	}
+	
+	public ParserRule getPrimitiveTimeNumberTypeRule() {
+		return getPrimitiveTimeNumberTypeAccess().getRule();
+	}
+	
+	//OtherPrimitiveType fmlType::PrimitiveType:
+	//	PrimitiveBooleanType
+	//	| PrimitiveCharacterType
+	//	| PrimitiveStringType
+	//	| PrimitiveInstanceType
+	public OtherPrimitiveTypeElements getOtherPrimitiveTypeAccess() {
+		return pOtherPrimitiveType;
+	}
+	
+	public ParserRule getOtherPrimitiveTypeRule() {
+		return getOtherPrimitiveTypeAccess().getRule();
+	}
+	
+	//PrimitiveBooleanType fmlType::PrimitiveBooleanType:
+	//	{fmlType::PrimitiveBooleanType} ('boolean' | 'bool')
+	public PrimitiveBooleanTypeElements getPrimitiveBooleanTypeAccess() {
+		return pPrimitiveBooleanType;
+	}
+	
+	public ParserRule getPrimitiveBooleanTypeRule() {
+		return getPrimitiveBooleanTypeAccess().getRule();
+	}
+	
+	//PrimitiveCharacterType fmlType::PrimitiveCharacterType:
+	//	{fmlType::PrimitiveCharacterType} 'char'
+	public PrimitiveCharacterTypeElements getPrimitiveCharacterTypeAccess() {
+		return pPrimitiveCharacterType;
+	}
+	
+	public ParserRule getPrimitiveCharacterTypeRule() {
+		return getPrimitiveCharacterTypeAccess().getRule();
+	}
+	
+	//PrimitiveStringType fmlType::PrimitiveStringType:
+	//	{fmlType::PrimitiveStringType}
+	//	'string' (':' size=EInt
+	//	| '<' 'size:'? size=EInt '>')?
+	public PrimitiveStringTypeElements getPrimitiveStringTypeAccess() {
+		return pPrimitiveStringType;
+	}
+	
+	public ParserRule getPrimitiveStringTypeRule() {
+		return getPrimitiveStringTypeAccess().getRule();
+	}
+	
+	//enum PrimitiveInstanceKind returns fmlType::PrimitiveInstanceKind:
+	//	buffer | message | port | signal | machine | vertex;
+	public PrimitiveInstanceKindElements getPrimitiveInstanceKindAccess() {
+		return ePrimitiveInstanceKind;
+	}
+	
+	public EnumRule getPrimitiveInstanceKindRule() {
+		return getPrimitiveInstanceKindAccess().getRule();
+	}
+	
+	//PrimitiveInstanceType fmlType::PrimitiveInstanceType:
+	//	{fmlType::PrimitiveInstanceType} expected=PrimitiveInstanceKind ('<' model=[fmlCommon::NamedElement|ESIdentifier]
+	//	'>')?
+	public PrimitiveInstanceTypeElements getPrimitiveInstanceTypeAccess() {
+		return pPrimitiveInstanceType;
+	}
+	
+	public ParserRule getPrimitiveInstanceTypeRule() {
+		return getPrimitiveInstanceTypeAccess().getRule();
+	}
+	
+	//IntervalType fmlType::IntervalType:
+	//	{fmlType::IntervalType}
+	//	'interval'
+	//	'<'
+	//	support=PrimitiveNumberType (lopen?=']' | '[') infimum=Expression ',' supremum=Expression (']' | ropen?='[')
+	//	'>'
+	public IntervalTypeElements getIntervalTypeAccess() {
+		return pIntervalType;
+	}
+	
+	public ParserRule getIntervalTypeRule() {
+		return getIntervalTypeAccess().getRule();
+	}
+	
+	//IntervalTypeDefinition fmlType::IntervalType:
+	//	{fmlType::IntervalType} visibility=VisibilityKind? 'type'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	'interval'
+	//	'<'
+	//	support=PrimitiveNumberType (lopen?=']' | '[') infimum=Expression ',' supremum=Expression (']' | ropen?='[')
+	//	'>' ';'
+	public IntervalTypeDefinitionElements getIntervalTypeDefinitionAccess() {
+		return pIntervalTypeDefinition;
+	}
+	
+	public ParserRule getIntervalTypeDefinitionRule() {
+		return getIntervalTypeDefinitionAccess().getRule();
+	}
+	
+	//IntervalTypeDefinitionImpl fmlType::IntervalType:
+	//	{fmlType::IntervalType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	'interval'
+	//	'<'
+	//	support=PrimitiveNumberType (lopen?=']' | '[') infimum=Expression ',' supremum=Expression (']' | ropen?='[')
+	//	'>' ';'
+	public IntervalTypeDefinitionImplElements getIntervalTypeDefinitionImplAccess() {
+		return pIntervalTypeDefinitionImpl;
+	}
+	
+	public ParserRule getIntervalTypeDefinitionImplRule() {
+		return getIntervalTypeDefinitionImplAccess().getRule();
+	}
+	
+	//// TODO
+	//// mettre à jour la grammaire par rapport au noyau, i.e.
+	//// CollectionKind | CollectionKind< size > | CollectionKind< type , size >
+	//CollectionType fmlType::CollectionType:
+	//	{fmlType::CollectionType} container=CollectionKind
+	//	'<'
+	//	support=DataType (',' (size=EInt | unbounded?='*'))?
+	//	'>'
+	public CollectionTypeElements getCollectionTypeAccess() {
+		return pCollectionType;
+	}
+	
+	public ParserRule getCollectionTypeRule() {
+		return getCollectionTypeAccess().getRule();
+	}
+	
+	//CollectionTypeDefinition fmlType::CollectionType:
+	//	{fmlType::CollectionType} visibility=VisibilityKind? 'type'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	container=CollectionKind
+	//	'<'
+	//	support=DataType (',' (size=EInt | unbounded?='*'))?
+	//	'>' ';'
+	public CollectionTypeDefinitionElements getCollectionTypeDefinitionAccess() {
+		return pCollectionTypeDefinition;
+	}
+	
+	public ParserRule getCollectionTypeDefinitionRule() {
+		return getCollectionTypeDefinitionAccess().getRule();
+	}
+	
+	//CollectionTypeDefinitionImpl fmlType::CollectionType:
+	//	{fmlType::CollectionType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	container=CollectionKind
+	//	'<'
+	//	support=DataType (',' (size=EInt | unbounded?='*'))?
+	//	'>' ';'
+	public CollectionTypeDefinitionImplElements getCollectionTypeDefinitionImplAccess() {
+		return pCollectionTypeDefinitionImpl;
+	}
+	
+	public ParserRule getCollectionTypeDefinitionImplRule() {
+		return getCollectionTypeDefinitionImplAccess().getRule();
+	}
+	
+	//enum CollectionKind returns fmlType::CollectionKind:
+	//	vector | rvector | list | set | bag | fifo | lifo;
+	public CollectionKindElements getCollectionKindAccess() {
+		return eCollectionKind;
+	}
+	
+	public EnumRule getCollectionKindRule() {
+		return getCollectionKindAccess().getRule();
+	}
+	
+	//EnumerationType fmlType::EnumerationType:
+	//	{fmlType::EnumerationType}
+	//	'enum' '{'
+	//	literal+=EnumerationLiteral (',' literal+=EnumerationLiteral)*
+	//	'}'
+	public EnumerationTypeElements getEnumerationTypeAccess() {
+		return pEnumerationType;
+	}
+	
+	public ParserRule getEnumerationTypeRule() {
+		return getEnumerationTypeAccess().getRule();
+	}
+	
+	//EnumerationTypeDefinition fmlType::EnumerationType:
+	//	{fmlType::EnumerationType} visibility=VisibilityKind? 'type'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	typedef?='enum'
+	//	'{'
+	//	literal+=EnumerationLiteral (',' literal+=EnumerationLiteral)*
+	//	'}'
+	public EnumerationTypeDefinitionElements getEnumerationTypeDefinitionAccess() {
+		return pEnumerationTypeDefinition;
+	}
+	
+	public ParserRule getEnumerationTypeDefinitionRule() {
+		return getEnumerationTypeDefinitionAccess().getRule();
+	}
+	
+	//EnumerationTypeDefinitionImpl fmlType::EnumerationType:
+	//	{fmlType::EnumerationType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	typedef?='enum'
+	//	'{'
+	//	literal+=EnumerationLiteral (',' literal+=EnumerationLiteral)*
+	//	'}'
+	public EnumerationTypeDefinitionImplElements getEnumerationTypeDefinitionImplAccess() {
+		return pEnumerationTypeDefinitionImpl;
+	}
+	
+	public ParserRule getEnumerationTypeDefinitionImplRule() {
+		return getEnumerationTypeDefinitionImplAccess().getRule();
+	}
+	
+	//EnumerationLiteral fmlType::EnumerationLiteral:
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' value=LiteralTerminalExpression)?
+	public EnumerationLiteralElements getEnumerationLiteralAccess() {
+		return pEnumerationLiteral;
+	}
+	
+	public ParserRule getEnumerationLiteralRule() {
+		return getEnumerationLiteralAccess().getRule();
+	}
+	
+	//StructureType fmlType::StructureType:
+	//	{fmlType::StructureType}
+	//	'struct'
+	//	'{'
+	//	property+=Variable+
+	//	'}'
+	public StructureTypeElements getStructureTypeAccess() {
+		return pStructureType;
+	}
+	
+	public ParserRule getStructureTypeRule() {
+		return getStructureTypeAccess().getRule();
+	}
+	
+	//StructureTypeDefinition fmlType::StructureType:
+	//	{fmlType::StructureType} visibility=VisibilityKind? 'type'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	typedef?='struct'
+	//	'{'
+	//	property+=Variable+
+	//	'}'
+	public StructureTypeDefinitionElements getStructureTypeDefinitionAccess() {
+		return pStructureTypeDefinition;
+	}
+	
+	public ParserRule getStructureTypeDefinitionRule() {
+		return getStructureTypeDefinitionAccess().getRule();
+	}
+	
+	//StructureTypeDefinitionImpl fmlType::StructureType:
+	//	{fmlType::StructureType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	typedef?='struct'
+	//	'{'
+	//	property+=Variable+
+	//	'}'
+	public StructureTypeDefinitionImplElements getStructureTypeDefinitionImplAccess() {
+		return pStructureTypeDefinitionImpl;
+	}
+	
+	public ParserRule getStructureTypeDefinitionImplRule() {
+		return getStructureTypeDefinitionImplAccess().getRule();
+	}
+	
+	//UnionType fmlType::UnionType:
+	//	{fmlType::UnionType}
+	//	'union'
+	//	'{'
+	//	property+=Variable+
+	//	'}'
+	public UnionTypeElements getUnionTypeAccess() {
+		return pUnionType;
+	}
+	
+	public ParserRule getUnionTypeRule() {
+		return getUnionTypeAccess().getRule();
+	}
+	
+	//UnionTypeDefinition fmlType::UnionType:
+	//	{fmlType::UnionType} visibility=VisibilityKind? 'type'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	typedef?='union'
+	//	'{'
+	//	property+=Variable+
+	//	'}'
+	public UnionTypeDefinitionElements getUnionTypeDefinitionAccess() {
+		return pUnionTypeDefinition;
+	}
+	
+	public ParserRule getUnionTypeDefinitionRule() {
+		return getUnionTypeDefinitionAccess().getRule();
+	}
+	
+	//UnionTypeDefinitionImpl fmlType::UnionType:
+	//	{fmlType::UnionType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	typedef?='union'
+	//	'{'
+	//	property+=Variable+
+	//	'}'
+	public UnionTypeDefinitionImplElements getUnionTypeDefinitionImplAccess() {
+		return pUnionTypeDefinitionImpl;
+	}
+	
+	public ParserRule getUnionTypeDefinitionImplRule() {
+		return getUnionTypeDefinitionImplAccess().getRule();
+	}
+	
+	//ChoiceType fmlType::ChoiceType:
+	//	{fmlType::ChoiceType}
+	//	'choice'
+	//	'{'
+	//	property+=Variable+
+	//	'}'
+	public ChoiceTypeElements getChoiceTypeAccess() {
+		return pChoiceType;
+	}
+	
+	public ParserRule getChoiceTypeRule() {
+		return getChoiceTypeAccess().getRule();
+	}
+	
+	//ChoiceTypeDefinition fmlType::ChoiceType:
+	//	{fmlType::ChoiceType} visibility=VisibilityKind? 'type'
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	typedef?='choice'
+	//	'{'
+	//	property+=Variable+
+	//	'}'
+	public ChoiceTypeDefinitionElements getChoiceTypeDefinitionAccess() {
+		return pChoiceTypeDefinition;
+	}
+	
+	public ParserRule getChoiceTypeDefinitionRule() {
+		return getChoiceTypeDefinitionAccess().getRule();
+	}
+	
+	//ChoiceTypeDefinitionImpl fmlType::ChoiceType:
+	//	{fmlType::ChoiceType} name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	typedef?='choice'
+	//	'{'
+	//	property+=Variable+
+	//	'}'
+	public ChoiceTypeDefinitionImplElements getChoiceTypeDefinitionImplAccess() {
+		return pChoiceTypeDefinitionImpl;
+	}
+	
+	public ParserRule getChoiceTypeDefinitionImplRule() {
+		return getChoiceTypeDefinitionImplAccess().getRule();
+	}
+	
+	/// *
+	//enum TypeSpecifyerKind returns TypeSpecifyerKind
+	//	: ALIAS = 'ALIAS'
+	//	| BOOLEAN = 'BOOLEAN'
+	//	| CHAR = 'CHAR'
+	//	| INT = 'INT'
+	//	| RATIONAL = 'RATIONAL'
+	//	| URATIONAL = 'URATIONAL'
+	//	| FLOAT = 'FLOAT'
+	//	| UFLOAT = 'UFLOAT'
+	//	| DOUBLE = 'DOUBLE'
+	//	| UDOUBLE = 'UDOUBLE'
+	//	| REAL = 'REAL'
+	//	| UREAL = 'UREAL'
+	//	| CTIME = 'CTIME'
+	//	| DTIME = 'DTIME'
+	//	| STRING = 'STRING'
+	//	| IDENTIFIER = 'IDENTIFIER'
+	//	| UFI = 'UFI'
+	//	| ARRAY = 'ARRAY'
+	//	| VECTOR = 'VECTOR'
+	//	| LIST = 'LIST'
+	//	| FIFO = 'FIFO'
+	//	| LIFO = 'LIFO'
+	//	| MULTISET = 'MULTISET'
+	//	| SET = 'SET'
+	//	| INTERVAL = 'INTERVAL'
+	//	| ENUM = 'ENUM'
+	//	| STRUCTURE = 'STRUCTURE'
+	//	| BUFFER = 'BUFFER'
+	//	| MESSAGE = 'MESSAGE'
+	//	| PORT = 'PORT'
+	//	| CONNECTION = 'CONNECTION'
+	//	| OPERATOR = 'OPERATOR'
+	//	| MACHINE = 'MACHINE'
+	//	| LAMBDA = 'LAMBDA'
+	//	| UNIVERSAL = 'UNIVERSAL'
+	//	;
+	// * / ////////////////////////////////////////////////////////////////////////////////
+	//// Variable Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Modifier fmlInfra::Modifier:
+	//	{fmlInfra::Modifier} (static?='static'?
+	//	& final?='final'?
+	//	& reference?='reference'?
+	//	& volatile?='volatile'?
+	//	& transient?='transient'?)
+	public ModifierElements getModifierAccess() {
+		return pModifier;
+	}
+	
+	public ParserRule getModifierRule() {
+		return getModifierAccess().getRule();
+	}
+	
+	//Variable fmlInfra::Variable:
+	//	(visibility=VisibilityKind? & modifier=Modifier?) ('var' | const?='val'
+	//	| (const?='const' | const?='final') macro?='macro'? 'var'?
+	//	| macro?='macro' ('var' | const?='val')?) type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+	//	'}' | ';')
+	public VariableElements getVariableAccess() {
+		return pVariable;
+	}
+	
+	public ParserRule getVariableRule() {
+		return getVariableAccess().getRule();
+	}
+	
+	//VariableImpl fmlInfra::Variable:
+	//	((const?='const' | const?='final')? & macro?='macro'?) type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+	//	'}' | ';')
+	public VariableImplElements getVariableImplAccess() {
+		return pVariableImpl;
+	}
+	
+	public ParserRule getVariableImplRule() {
+		return getVariableImplAccess().getRule();
+	}
+	
+	//OnWriteRoutine fmlInfra::Routine:
+	//	{fmlInfra::Routine}
+	//	'@on_write' ('(' parameter+=VariableRoutineParameter ')')?
+	//	bodyBlock=BlockStatement
+	public OnWriteRoutineElements getOnWriteRoutineAccess() {
+		return pOnWriteRoutine;
+	}
+	
+	public ParserRule getOnWriteRoutineRule() {
+		return getOnWriteRoutineAccess().getRule();
+	}
+	
+	//VariableRoutineParameter fmlInfra::Parameter:
+	//	type=DataType?
+	//	name=ESIdentifier ('=' defaultValue=Expression)?
+	public VariableRoutineParameterElements getVariableRoutineParameterAccess() {
+		return pVariableRoutineParameter;
+	}
+	
+	public ParserRule getVariableRoutineParameterRule() {
+		return getVariableRoutineParameterAccess().getRule();
+	}
+	
+	//enum PublicVariableVisibilityKind returns fmlCommon::VisibilityKind:
+	//	public='var'
+	//	//	| public ='val'
+	//	//	| public ='const'
+	//;
+	public PublicVariableVisibilityKindElements getPublicVariableVisibilityKindAccess() {
+		return ePublicVariableVisibilityKind;
+	}
+	
+	public EnumRule getPublicVariableVisibilityKindRule() {
+		return getPublicVariableVisibilityKindAccess().getRule();
+	}
+	
+	//VariablePublic fmlInfra::Variable:
+	//	modifier=Modifier? ((const?='const' | const?='final')?
+	//	& macro?='macro'?)?
+	//	visibility=PublicVariableVisibilityKind
+	//	type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+	//	'}' | ';')
+	public VariablePublicElements getVariablePublicAccess() {
+		return pVariablePublic;
+	}
+	
+	public ParserRule getVariablePublicRule() {
+		return getVariablePublicAccess().getRule();
+	}
+	
+	//enum ProtectedVariableVisibilityKind returns fmlCommon::VisibilityKind:
+	//	protected='var'
+	//	//	| protected ='val'
+	//	//	| protected ='const'
+	//;
+	public ProtectedVariableVisibilityKindElements getProtectedVariableVisibilityKindAccess() {
+		return eProtectedVariableVisibilityKind;
+	}
+	
+	public EnumRule getProtectedVariableVisibilityKindRule() {
+		return getProtectedVariableVisibilityKindAccess().getRule();
+	}
+	
+	//VariableProtected fmlInfra::Variable:
+	//	modifier=Modifier? ((const?='const' | const?='final')?
+	//	& macro?='macro'?)?
+	//	visibility=ProtectedVariableVisibilityKind
+	//	type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+	//	'}' | ';')
+	public VariableProtectedElements getVariableProtectedAccess() {
+		return pVariableProtected;
+	}
+	
+	public ParserRule getVariableProtectedRule() {
+		return getVariableProtectedAccess().getRule();
+	}
+	
+	//enum PrivateVariableVisibilityKind returns fmlCommon::VisibilityKind:
+	//	private='var'
+	//	//	| private ='val'
+	//	//	| private ='const'
+	//;
+	public PrivateVariableVisibilityKindElements getPrivateVariableVisibilityKindAccess() {
+		return ePrivateVariableVisibilityKind;
+	}
+	
+	public EnumRule getPrivateVariableVisibilityKindRule() {
+		return getPrivateVariableVisibilityKindAccess().getRule();
+	}
+	
+	//VariablePrivate fmlInfra::Variable:
+	//	modifier=Modifier? ((const?='const' | const?='final')?
+	//	& macro?='macro'?)?
+	//	visibility=PrivateVariableVisibilityKind
+	//	type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ('{' onWriteAction=OnWriteRoutine
+	//	'}' | ';')
+	public VariablePrivateElements getVariablePrivateAccess() {
+		return pVariablePrivate;
+	}
+	
+	public ParserRule getVariablePrivateRule() {
+		return getVariablePrivateAccess().getRule();
+	}
+	
+	//enum ParameterDirectionKind returns fmlInfra::ParameterDirectionKind:
+	//	in | inout | out | return;
+	public ParameterDirectionKindElements getParameterDirectionKindAccess() {
+		return eParameterDirectionKind;
+	}
+	
+	public EnumRule getParameterDirectionKindRule() {
+		return getParameterDirectionKindAccess().getRule();
+	}
+	
+	//FunctionalParameterSet fmlInfra::ParameterSet:
+	//	{fmlInfra::ParameterSet} parameter+=FunctionalParameter (',' parameter+=FunctionalParameter)*
+	public FunctionalParameterSetElements getFunctionalParameterSetAccess() {
+		return pFunctionalParameterSet;
+	}
+	
+	public ParserRule getFunctionalParameterSetRule() {
+		return getFunctionalParameterSetAccess().getRule();
+	}
+	
+	//FunctionalParameter fmlInfra::Parameter:
+	//	{fmlInfra::Parameter} direction=ParameterDirectionKind? type=DataType
+	//	name=ESIdentifier ('=' defaultValue=Expression)?
+	public FunctionalParameterElements getFunctionalParameterAccess() {
+		return pFunctionalParameter;
+	}
+	
+	public ParserRule getFunctionalParameterRule() {
+		return getFunctionalParameterAccess().getRule();
+	}
+	
+	//FormalParameterSet fmlInfra::ParameterSet:
+	//	{fmlInfra::ParameterSet} parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	public FormalParameterSetElements getFormalParameterSetAccess() {
+		return pFormalParameterSet;
+	}
+	
+	public ParserRule getFormalParameterSetRule() {
+		return getFormalParameterSetAccess().getRule();
+	}
+	
+	//FormalParameter fmlInfra::Parameter:
+	//	{fmlInfra::Parameter} direction=ParameterDirectionKind? type=DataType
+	//	name=ESIdentifier? ('=' defaultValue=Expression)?
+	public FormalParameterElements getFormalParameterAccess() {
+		return pFormalParameter;
+	}
+	
+	public ParserRule getFormalParameterRule() {
+		return getFormalParameterAccess().getRule();
+	}
+	
+	//enum BlockParameterDirectionKind returns fmlInfra::ParameterDirectionKind:
+	//	in='input'
+	//	| inout | out='output'
+	//	| return;
+	public BlockParameterDirectionKindElements getBlockParameterDirectionKindAccess() {
+		return eBlockParameterDirectionKind;
+	}
+	
+	public EnumRule getBlockParameterDirectionKindRule() {
+		return getBlockParameterDirectionKindAccess().getRule();
+	}
+	
+	//BlockParameterSet fmlInfra::ParameterSet:
+	//	{fmlInfra::ParameterSet} ('input' (parameter+=ParameterInput
+	//	| '{' parameter+=ParameterInput+ '}') | 'inout' (parameter+=ParameterInout
+	//	| '{' parameter+=ParameterInout+ '}') | 'output' (parameter+=ParameterOutput
+	//	| '{' parameter+=ParameterOutput+ '}') | 'return' (parameter+=ParameterReturn
+	//	| '{' parameter+=ParameterReturn+ '}'))*
+	public BlockParameterSetElements getBlockParameterSetAccess() {
+		return pBlockParameterSet;
+	}
+	
+	public ParserRule getBlockParameterSetRule() {
+		return getBlockParameterSetAccess().getRule();
+	}
+	
+	//enum ParameterInputDirectionKind returns fmlInfra::ParameterDirectionKind:
+	//	in='var';
+	public ParameterInputDirectionKindElements getParameterInputDirectionKindAccess() {
+		return eParameterInputDirectionKind;
+	}
+	
+	public EnumRule getParameterInputDirectionKindRule() {
+		return getParameterInputDirectionKindAccess().getRule();
+	}
+	
+	//ParameterInput fmlInfra::Parameter:
+	//	direction=ParameterInputDirectionKind type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+	public ParameterInputElements getParameterInputAccess() {
+		return pParameterInput;
+	}
+	
+	public ParserRule getParameterInputRule() {
+		return getParameterInputAccess().getRule();
+	}
+	
+	//enum ParameterInoutDirectionKind returns fmlInfra::ParameterDirectionKind:
+	//	inout='var';
+	public ParameterInoutDirectionKindElements getParameterInoutDirectionKindAccess() {
+		return eParameterInoutDirectionKind;
+	}
+	
+	public EnumRule getParameterInoutDirectionKindRule() {
+		return getParameterInoutDirectionKindAccess().getRule();
+	}
+	
+	//ParameterInout fmlInfra::Parameter:
+	//	direction=ParameterInoutDirectionKind type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+	public ParameterInoutElements getParameterInoutAccess() {
+		return pParameterInout;
+	}
+	
+	public ParserRule getParameterInoutRule() {
+		return getParameterInoutAccess().getRule();
+	}
+	
+	//enum ParameterOutputDirectionKind returns fmlInfra::ParameterDirectionKind:
+	//	out='var';
+	public ParameterOutputDirectionKindElements getParameterOutputDirectionKindAccess() {
+		return eParameterOutputDirectionKind;
+	}
+	
+	public EnumRule getParameterOutputDirectionKindRule() {
+		return getParameterOutputDirectionKindAccess().getRule();
+	}
+	
+	//ParameterOutput fmlInfra::Parameter:
+	//	direction=ParameterOutputDirectionKind type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+	public ParameterOutputElements getParameterOutputAccess() {
+		return pParameterOutput;
+	}
+	
+	public ParserRule getParameterOutputRule() {
+		return getParameterOutputAccess().getRule();
+	}
+	
+	//enum ParameterReturnDirectionKind returns fmlInfra::ParameterDirectionKind:
+	//	return='var';
+	public ParameterReturnDirectionKindElements getParameterReturnDirectionKindAccess() {
+		return eParameterReturnDirectionKind;
+	}
+	
+	public EnumRule getParameterReturnDirectionKindRule() {
+		return getParameterReturnDirectionKindAccess().getRule();
+	}
+	
+	//ParameterReturn fmlInfra::Parameter:
+	//	direction=ParameterReturnDirectionKind type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+	public ParameterReturnElements getParameterReturnAccess() {
+		return pParameterReturn;
+	}
+	
+	public ParserRule getParameterReturnRule() {
+		return getParameterReturnAccess().getRule();
+	}
+	
+	//ParameterDeclaration fmlInfra::Parameter:
+	//	{fmlInfra::Parameter} direction=BlockParameterDirectionKind type=DataType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('=' defaultValue=Expression)? ';'
+	public ParameterDeclarationElements getParameterDeclarationAccess() {
+		return pParameterDeclaration;
+	}
+	
+	public ParserRule getParameterDeclarationRule() {
+		return getParameterDeclarationAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Buffer Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//BufferContainerType fmlType::CollectionType:
+	//	{fmlType::CollectionType} container=BufferContainerKind ('<' (size=EInt | unbounded?='*')? '>')?
+	public BufferContainerTypeElements getBufferContainerTypeAccess() {
+		return pBufferContainerType;
+	}
+	
+	public ParserRule getBufferContainerTypeRule() {
+		return getBufferContainerTypeAccess().getRule();
+	}
+	
+	//enum BufferContainerKind returns fmlType::CollectionKind:
+	//	set | bag | fifo | lifo;
+	public BufferContainerKindElements getBufferContainerKindAccess() {
+		return eBufferContainerKind;
+	}
+	
+	public EnumRule getBufferContainerKindRule() {
+		return getBufferContainerKindAccess().getRule();
+	}
+	
+	//Buffer fmlInfra::Buffer:
+	//	(visibility=VisibilityKind? & modifier=Modifier?)
+	//	'buffer' type=BufferContainerType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+	public BufferElements getBufferAccess() {
+		return pBuffer;
+	}
+	
+	public ParserRule getBufferRule() {
+		return getBufferAccess().getRule();
+	}
+	
+	//BufferImpl fmlInfra::Buffer:
+	//	type=BufferContainerType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+	public BufferImplElements getBufferImplAccess() {
+		return pBufferImpl;
+	}
+	
+	public ParserRule getBufferImplRule() {
+		return getBufferImplAccess().getRule();
+	}
+	
+	//enum PublicBufferVisibilityKind returns fmlCommon::VisibilityKind:
+	//	public='buffer';
+	public PublicBufferVisibilityKindElements getPublicBufferVisibilityKindAccess() {
+		return ePublicBufferVisibilityKind;
+	}
+	
+	public EnumRule getPublicBufferVisibilityKindRule() {
+		return getPublicBufferVisibilityKindAccess().getRule();
+	}
+	
+	//BufferPublic fmlInfra::Buffer:
+	//	modifier=Modifier?
+	//	visibility=PublicBufferVisibilityKind type=BufferContainerType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+	public BufferPublicElements getBufferPublicAccess() {
+		return pBufferPublic;
+	}
+	
+	public ParserRule getBufferPublicRule() {
+		return getBufferPublicAccess().getRule();
+	}
+	
+	//enum ProtectedBufferVisibilityKind returns fmlCommon::VisibilityKind:
+	//	protected='buffer';
+	public ProtectedBufferVisibilityKindElements getProtectedBufferVisibilityKindAccess() {
+		return eProtectedBufferVisibilityKind;
+	}
+	
+	public EnumRule getProtectedBufferVisibilityKindRule() {
+		return getProtectedBufferVisibilityKindAccess().getRule();
+	}
+	
+	//BufferProtected fmlInfra::Buffer:
+	//	modifier=Modifier?
+	//	visibility=ProtectedBufferVisibilityKind type=BufferContainerType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+	public BufferProtectedElements getBufferProtectedAccess() {
+		return pBufferProtected;
+	}
+	
+	public ParserRule getBufferProtectedRule() {
+		return getBufferProtectedAccess().getRule();
+	}
+	
+	//enum PrivateBufferVisibilityKind returns fmlCommon::VisibilityKind:
+	//	private='buffer';
+	public PrivateBufferVisibilityKindElements getPrivateBufferVisibilityKindAccess() {
+		return ePrivateBufferVisibilityKind;
+	}
+	
+	public EnumRule getPrivateBufferVisibilityKindRule() {
+		return getPrivateBufferVisibilityKindAccess().getRule();
+	}
+	
+	//BufferPrivate fmlInfra::Buffer:
+	//	modifier=Modifier?
+	//	visibility=PrivateBufferVisibilityKind type=BufferContainerType
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ';'
+	public BufferPrivateElements getBufferPrivateAccess() {
+		return pBufferPrivate;
+	}
+	
+	public ParserRule getBufferPrivateRule() {
+		return getBufferPrivateAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Port rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Port fmlInfra::Port:
+	//	visibility=VisibilityKind?
+	//	'port' direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public PortElements getPortAccess() {
+		return pPort;
+	}
+	
+	public ParserRule getPortRule() {
+		return getPortAccess().getRule();
+	}
+	
+	//PortImpl fmlInfra::Port:
+	//	direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public PortImplElements getPortImplAccess() {
+		return pPortImpl;
+	}
+	
+	public ParserRule getPortImplRule() {
+		return getPortImplAccess().getRule();
+	}
+	
+	//enum PublicPortVisibilityKind returns fmlCommon::VisibilityKind:
+	//	public='port';
+	public PublicPortVisibilityKindElements getPublicPortVisibilityKindAccess() {
+		return ePublicPortVisibilityKind;
+	}
+	
+	public EnumRule getPublicPortVisibilityKindRule() {
+		return getPublicPortVisibilityKindAccess().getRule();
+	}
+	
+	//PortPublic fmlInfra::Port:
+	//	visibility=PublicPortVisibilityKind direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public PortPublicElements getPortPublicAccess() {
+		return pPortPublic;
+	}
+	
+	public ParserRule getPortPublicRule() {
+		return getPortPublicAccess().getRule();
+	}
+	
+	//enum ProtectedPortVisibilityKind returns fmlCommon::VisibilityKind:
+	//	protected='port';
+	public ProtectedPortVisibilityKindElements getProtectedPortVisibilityKindAccess() {
+		return eProtectedPortVisibilityKind;
+	}
+	
+	public EnumRule getProtectedPortVisibilityKindRule() {
+		return getProtectedPortVisibilityKindAccess().getRule();
+	}
+	
+	//PortProtected fmlInfra::Port:
+	//	visibility=ProtectedPortVisibilityKind direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public PortProtectedElements getPortProtectedAccess() {
+		return pPortProtected;
+	}
+	
+	public ParserRule getPortProtectedRule() {
+		return getPortProtectedAccess().getRule();
+	}
+	
+	//enum PrivatePortVisibilityKind returns fmlCommon::VisibilityKind:
+	//	private='port';
+	public PrivatePortVisibilityKindElements getPrivatePortVisibilityKindAccess() {
+		return ePrivatePortVisibilityKind;
+	}
+	
+	public EnumRule getPrivatePortVisibilityKindRule() {
+		return getPrivatePortVisibilityKindAccess().getRule();
+	}
+	
+	//PortPrivate fmlInfra::Port:
+	//	visibility=PrivatePortVisibilityKind direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public PortPrivateElements getPortPrivateAccess() {
+		return pPortPrivate;
+	}
+	
+	public ParserRule getPortPrivateRule() {
+		return getPortPrivateAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Signal rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Signal fmlInfra::Signal:
+	//	visibility=VisibilityKind?
+	//	'signal' direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public SignalElements getSignalAccess() {
+		return pSignal;
+	}
+	
+	public ParserRule getSignalRule() {
+		return getSignalAccess().getRule();
+	}
+	
+	//SignalImpl fmlInfra::Signal:
+	//	direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public SignalImplElements getSignalImplAccess() {
+		return pSignalImpl;
+	}
+	
+	public ParserRule getSignalImplRule() {
+		return getSignalImplAccess().getRule();
+	}
+	
+	//enum PublicSignalVisibilityKind returns fmlCommon::VisibilityKind:
+	//	public='signal';
+	public PublicSignalVisibilityKindElements getPublicSignalVisibilityKindAccess() {
+		return ePublicSignalVisibilityKind;
+	}
+	
+	public EnumRule getPublicSignalVisibilityKindRule() {
+		return getPublicSignalVisibilityKindAccess().getRule();
+	}
+	
+	//SignalPublic fmlInfra::Signal:
+	//	visibility=PublicSignalVisibilityKind direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public SignalPublicElements getSignalPublicAccess() {
+		return pSignalPublic;
+	}
+	
+	public ParserRule getSignalPublicRule() {
+		return getSignalPublicAccess().getRule();
+	}
+	
+	//enum ProtectedSignalVisibilityKind returns fmlCommon::VisibilityKind:
+	//	protected='signal';
+	public ProtectedSignalVisibilityKindElements getProtectedSignalVisibilityKindAccess() {
+		return eProtectedSignalVisibilityKind;
+	}
+	
+	public EnumRule getProtectedSignalVisibilityKindRule() {
+		return getProtectedSignalVisibilityKindAccess().getRule();
+	}
+	
+	//SignalProtected fmlInfra::Signal:
+	//	visibility=ProtectedSignalVisibilityKind direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public SignalProtectedElements getSignalProtectedAccess() {
+		return pSignalProtected;
+	}
+	
+	public ParserRule getSignalProtectedRule() {
+		return getSignalProtectedAccess().getRule();
+	}
+	
+	//enum PrivateSignalVisibilityKind returns fmlCommon::VisibilityKind:
+	//	private='signal';
+	public PrivateSignalVisibilityKindElements getPrivateSignalVisibilityKindAccess() {
+		return ePrivateSignalVisibilityKind;
+	}
+	
+	public EnumRule getPrivateSignalVisibilityKindRule() {
+		return getPrivateSignalVisibilityKindAccess().getRule();
+	}
+	
+	//SignalPrivate fmlInfra::Signal:
+	//	visibility=PrivateSignalVisibilityKind direction=ChannelDirection?
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName? ('('
+	//	parameter+=FormalParameter (',' parameter+=FormalParameter)*
+	//	')')?
+	//	';'
+	public SignalPrivateElements getSignalPrivateAccess() {
+		return pSignalPrivate;
+	}
+	
+	public ParserRule getSignalPrivateRule() {
+		return getSignalPrivateAccess().getRule();
+	}
+	
+	//enum ChannelDirection returns fmlInfra::ChannelDirection:
+	//	input | inout | output;
+	public ChannelDirectionElements getChannelDirectionAccess() {
+		return eChannelDirection;
+	}
+	
+	public EnumRule getChannelDirectionRule() {
+		return getChannelDirectionAccess().getRule();
+	}
+	
+	//Channel fmlInfra::Channel:
+	//	visibility=VisibilityKind?
+	//	'channel' name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	'{' (signal+=SignalReference ';')+
+	//	'}'
+	public ChannelElements getChannelAccess() {
+		return pChannel;
+	}
+	
+	public ParserRule getChannelRule() {
+		return getChannelAccess().getRule();
+	}
+	
+	//SignalReference fmlInfra::Signal:
+	//	direction=ChannelDirection? name=ESIdentifier
+	public SignalReferenceElements getSignalReferenceAccess() {
+		return pSignalReference;
+	}
+	
+	public ParserRule getSignalReferenceRule() {
+		return getSignalReferenceAccess().getRule();
+	}
+	
+	//enum PublicChannelVisibilityKind returns fmlCommon::VisibilityKind:
+	//	public='channel';
+	public PublicChannelVisibilityKindElements getPublicChannelVisibilityKindAccess() {
+		return ePublicChannelVisibilityKind;
+	}
+	
+	public EnumRule getPublicChannelVisibilityKindRule() {
+		return getPublicChannelVisibilityKindAccess().getRule();
+	}
+	
+	//ChannelPublic fmlInfra::Channel:
+	//	visibility=PublicChannelVisibilityKind
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	'{' (signal+=SignalReference ';')+
+	//	'}'
+	public ChannelPublicElements getChannelPublicAccess() {
+		return pChannelPublic;
+	}
+	
+	public ParserRule getChannelPublicRule() {
+		return getChannelPublicAccess().getRule();
+	}
+	
+	//enum ProtectedChannelVisibilityKind returns fmlCommon::VisibilityKind:
+	//	protected='channel';
+	public ProtectedChannelVisibilityKindElements getProtectedChannelVisibilityKindAccess() {
+		return eProtectedChannelVisibilityKind;
+	}
+	
+	public EnumRule getProtectedChannelVisibilityKindRule() {
+		return getProtectedChannelVisibilityKindAccess().getRule();
+	}
+	
+	//ChannelProtected fmlInfra::Channel:
+	//	visibility=ProtectedChannelVisibilityKind
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	'{' (signal+=SignalReference ';')+
+	//	'}'
+	public ChannelProtectedElements getChannelProtectedAccess() {
+		return pChannelProtected;
+	}
+	
+	public ParserRule getChannelProtectedRule() {
+		return getChannelProtectedAccess().getRule();
+	}
+	
+	//enum PrivateChannelVisibilityKind returns fmlCommon::VisibilityKind:
+	//	private='channel';
+	public PrivateChannelVisibilityKindElements getPrivateChannelVisibilityKindAccess() {
+		return ePrivateChannelVisibilityKind;
+	}
+	
+	public EnumRule getPrivateChannelVisibilityKindRule() {
+		return getPrivateChannelVisibilityKindAccess().getRule();
+	}
+	
+	//ChannelPrivate fmlInfra::Channel:
+	//	visibility=PrivateChannelVisibilityKind
+	//	name=ESIdentifier unrestrictedName=UnrestrictedName?
+	//	'{' (signal+=SignalReference ';')+
+	//	'}'
+	public ChannelPrivateElements getChannelPrivateAccess() {
+		return pChannelPrivate;
+	}
+	
+	public ParserRule getChannelPrivateRule() {
+		return getChannelPrivateAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Section Transition Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Transition fmlStmchn::Transition:
+	//	{fmlStmchn::Transition} transient?='transient'? 'transition'
+	//	moe=TransitionMoe? (name=ESIdentifier unrestrictedName=UnrestrictedName?)? ('{' (('@trigger:'
+	//	trigger+=TransitionTrigger*)? (guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard | '@tguard:')?
+	//	'@effect:' effect=TransitionEffect?
+	//	| behavior=TransitionBehavior)?
+	//	'}' ('-->' target=[fmlCommon::NamedElement|ESUfid] ';')?
+	//	| '-->' target=[fmlCommon::NamedElement|ESUfid] ('{' (('@trigger:' trigger+=TransitionTrigger*)?
+	//	(guard=TransitionGuard | '@guard:')? (tguard=TransitionTimedGuard | '@tguard:')?
+	//	'@effect:' effect=TransitionEffect?
+	//	| behavior=TransitionBehavior)?
+	//	'}' | ';'))
+	public TransitionElements getTransitionAccess() {
+		return pTransition;
+	}
+	
+	public ParserRule getTransitionRule() {
+		return getTransitionAccess().getRule();
+	}
+	
+	//TransitionMoe fmlStmchn::TransitionMoe:
+	//	'<' ('moc:'? (moc=TransitionMoc ('&' isElse?='else')?
+	//	| isElse?='else') (',' "prior:"? prior=EInt)?
+	//	| "prior:"? prior=EInt)
+	//	'>'
+	public TransitionMoeElements getTransitionMoeAccess() {
+		return pTransitionMoe;
+	}
+	
+	public ParserRule getTransitionMoeRule() {
+		return getTransitionMoeAccess().getRule();
+	}
+	
+	//enum TransitionMoc returns fmlStmchn::TransitionMoc:
+	//	simple | abort | final;
+	public TransitionMocElements getTransitionMocAccess() {
+		return eTransitionMoc;
+	}
+	
+	public EnumRule getTransitionMocRule() {
+		return getTransitionMocAccess().getRule();
+	}
+	
+	//TransitionBehavior fmlStmnt::BlockStatement:
+	//	{fmlStmnt::BlockStatement} op=BlockStatementScheduler?
+	//	statement+=Statement*
+	public TransitionBehaviorElements getTransitionBehaviorAccess() {
+		return pTransitionBehavior;
+	}
+	
+	public ParserRule getTransitionBehaviorRule() {
+		return getTransitionBehaviorAccess().getRule();
+	}
+	
+	//TransitionTrigger fmlStmnt::InputComStatement:
+	//	InputComStatement
+	public TransitionTriggerElements getTransitionTriggerAccess() {
+		return pTransitionTrigger;
+	}
+	
+	public ParserRule getTransitionTriggerRule() {
+		return getTransitionTriggerAccess().getRule();
+	}
+	
+	//TransitionGuard fmlStmnt::AbstractGuardStatement:
+	//	{fmlStmnt::GuardStatement}
+	//	'@guard<' condition=TransitionGuardExpression
+	//	| '@guard:' ({fmlStmnt::GuardStatement} ('[' condition=Expression ']'
+	//	| condition=Expression) | GuardStatement
+	//	| EventGuardStatement
+	//	| CheckSatGuardStatement)
+	public TransitionGuardElements getTransitionGuardAccess() {
+		return pTransitionGuard;
+	}
+	
+	public ParserRule getTransitionGuardRule() {
+		return getTransitionGuardAccess().getRule();
+	}
+	
+	//TransitionGuardExpression fmlExpr::Expression:
+	//	{fmlExpr::LogicalAssociativeExpression} operator=('&&' | 'and' | '||' | 'or') '>:'
+	//	operand+=BitwiseOrExpression+
+	public TransitionGuardExpressionElements getTransitionGuardExpressionAccess() {
+		return pTransitionGuardExpression;
+	}
+	
+	public ParserRule getTransitionGuardExpressionRule() {
+		return getTransitionGuardExpressionAccess().getRule();
+	}
+	
+	//TransitionTimedGuard fmlStmnt::TimedGuardStatement:
+	//	{fmlStmnt::TimedGuardStatement}
+	//	'@tguard<' condition=TransitionGuardExpression
+	//	| '@tguard:' ({fmlStmnt::TimedGuardStatement} ('{' condition=Expression '}'
+	//	| condition=Expression) | TimedGuardStatement)
+	public TransitionTimedGuardElements getTransitionTimedGuardAccess() {
+		return pTransitionTimedGuard;
+	}
+	
+	public ParserRule getTransitionTimedGuardRule() {
+		return getTransitionTimedGuardAccess().getRule();
+	}
+	
+	//TransitionEffect fmlStmnt::Statement:
+	//	TransitionEffectStatement ({fmlStmnt::BlockStatement.statement+=current} statement+=TransitionEffectStatement)*
+	public TransitionEffectElements getTransitionEffectAccess() {
+		return pTransitionEffect;
+	}
+	
+	public ParserRule getTransitionEffectRule() {
+		return getTransitionEffectAccess().getRule();
+	}
+	
+	//TransitionEffectStatement fmlStmnt::Statement:
+	//	ExpressionStatement
+	//	| OutputComStatement
+	//	| IfStatement
+	//	| WhileDoStatement
+	//	| DoWhileStatement
+	//	| ForStatement
+	//	| ForEachStatement
+	//	| InterruptStatement
+	//	| ActivityStatement
+	//	| InvokeStatement
+	public TransitionEffectStatementElements getTransitionEffectStatementAccess() {
+		return pTransitionEffectStatement;
+	}
+	
+	public ParserRule getTransitionEffectStatementRule() {
+		return getTransitionEffectStatementAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Statement Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Statement fmlStmnt::Statement:
+	//	BlockStatement
+	//	| ExpressionStatement
+	//	| GuardStatement
+	//	| TimedGuardStatement
+	//	| EventGuardStatement
+	//	| CheckSatGuardStatement
+	//	| InputComStatement
+	//	| OutputComStatement
+	//	| IfStatement
+	//	| WhileDoStatement
+	//	| DoWhileStatement
+	//	| ForStatement
+	//	| ForEachStatement
+	//	| InterruptStatement
+	//	| ActivityStatement
+	//	| InvokeStatement
+	public StatementElements getStatementAccess() {
+		return pStatement;
+	}
+	
+	public ParserRule getStatementRule() {
+		return getStatementAccess().getRule();
+	}
+	
+	//BlockStatement fmlStmnt::BlockStatement:
+	//	{fmlStmnt::BlockStatement}
+	//	'{'
+	//	op=BlockStatementScheduler?
+	//	statement+=Statement*
+	//	'}'
+	public BlockStatementElements getBlockStatementAccess() {
+		return pBlockStatement;
+	}
+	
+	public ParserRule getBlockStatementRule() {
+		return getBlockStatementAccess().getRule();
+	}
+	
+	//BlockStatementScheduler:
+	//	'|;|' | '|§|' | '|;;|' | '|.|' | '|/;|'
+	//	| '|i|' | '|,|' | '|a|'
+	//	| '|and|' | '|or|'
+	//	| '|and#then|' | '|or#else|'
+	//	| '|indet|' | '|/\\|'
+	//	| '|fork|' | '|join|';
+	public BlockStatementSchedulerElements getBlockStatementSchedulerAccess() {
+		return pBlockStatementScheduler;
+	}
+	
+	public ParserRule getBlockStatementSchedulerRule() {
+		return getBlockStatementSchedulerAccess().getRule();
+	}
+	
+	///////////////////////////////////////////
+	//// Assignment Rules as Expression Statement
+	//// lv = rv
+	//// newfresh lv
+	//// ++lv --lv
+	//// lv++  lv--
+	///////////////////////////////////////////
+	//ExpressionStatement fmlStmnt::ExpressionStatement:
+	//	expression=AssignmentExpression ';'
+	//	| expression=NewfreshExpression ';'
+	//	| expression=IncrementOrDecrementPrefixExpression ';'
+	//	| expression=IncrementOrDecrementPostfixExpression ';'
+	public ExpressionStatementElements getExpressionStatementAccess() {
+		return pExpressionStatement;
+	}
+	
+	public ParserRule getExpressionStatementRule() {
+		return getExpressionStatementAccess().getRule();
+	}
+	
+	/////////////////////////////////////////////
+	////// Guard Rules
+	/////////////////////////////////////////////
+	//GuardStatement fmlStmnt::GuardStatement:
+	//	'guard' condition=Expression ';'
+	public GuardStatementElements getGuardStatementAccess() {
+		return pGuardStatement;
+	}
+	
+	public ParserRule getGuardStatementRule() {
+		return getGuardStatementAccess().getRule();
+	}
+	
+	//TimedGuardStatement fmlStmnt::TimedGuardStatement:
+	//	'tguard' condition=Expression ';'
+	public TimedGuardStatementElements getTimedGuardStatementAccess() {
+		return pTimedGuardStatement;
+	}
+	
+	public ParserRule getTimedGuardStatementRule() {
+		return getTimedGuardStatementAccess().getRule();
+	}
+	
+	//EventGuardStatement fmlStmnt::EventGuardStatement:
+	//	'event' condition=Expression ';'
+	public EventGuardStatementElements getEventGuardStatementAccess() {
+		return pEventGuardStatement;
+	}
+	
+	public ParserRule getEventGuardStatementRule() {
+		return getEventGuardStatementAccess().getRule();
+	}
+	
+	//CheckSatGuardStatement fmlStmnt::CheckSatGuardStatement:
+	//	'checksat' '<' solver=ESIdentifier '>' condition=Expression ';'
+	public CheckSatGuardStatementElements getCheckSatGuardStatementAccess() {
+		return pCheckSatGuardStatement;
+	}
+	
+	public ParserRule getCheckSatGuardStatementRule() {
+		return getCheckSatGuardStatementAccess().getRule();
+	}
+	
+	/////////////////////////////////////////////
+	////
+	////// Communication Rules
+	/////////////////////////////////////////////
+	//InputComStatement fmlStmnt::InputComStatement:
+	//	'input' port=[fmlCommon::NamedElement|ESUfid] ('(' leftValue+=Expression (',' leftValue+=Expression)* ')')? (('<--'
+	//	target=ExpressionAsMachine)?
+	//	& (('<==' | 'via') route=[fmlInfra::Channel|ESUfid])?) ';'
+	public InputComStatementElements getInputComStatementAccess() {
+		return pInputComStatement;
+	}
+	
+	public ParserRule getInputComStatementRule() {
+		return getInputComStatementAccess().getRule();
+	}
+	
+	//OutputComStatement fmlStmnt::OutputComStatement:
+	//	'output' port=[fmlCommon::NamedElement|ESUfid] ('(' rigthValue+=Expression (',' rigthValue+=Expression)* ')')? (('-->'
+	//	target=ExpressionAsMachine)?
+	//	& (('==>' | 'via') route=[fmlInfra::Channel|ESUfid])?) ';'
+	public OutputComStatementElements getOutputComStatementAccess() {
+		return pOutputComStatement;
+	}
+	
+	public ParserRule getOutputComStatementRule() {
+		return getOutputComStatementAccess().getRule();
+	}
+	
+	//ExpressionAsMachine fmlExpr::ExpressionAsMachine:
+	//	machine=ValuePureNamedMachineExpression
+	public ExpressionAsMachineElements getExpressionAsMachineAccess() {
+		return pExpressionAsMachine;
+	}
+	
+	public ParserRule getExpressionAsMachineRule() {
+		return getExpressionAsMachineAccess().getRule();
+	}
+	
+	/////////////////////////////////////////////
+	////// If - Conditional Rules
+	/////////////////////////////////////////////
+	//IfStatement fmlStmnt::IfStatement:
+	//	'if' condition=Expression
+	//	bodyBlock=BlockStatement
+	//	elseifStatement+=ElseIfStatement* ('else' elseBlock=BlockStatement)?
+	public IfStatementElements getIfStatementAccess() {
+		return pIfStatement;
+	}
+	
+	public ParserRule getIfStatementRule() {
+		return getIfStatementAccess().getRule();
+	}
+	
+	//ElseIfStatement fmlStmnt::ConditionalBlockStatement:
+	//	('elseif' | 'else' 'if') condition=Expression
+	//	bodyBlock=BlockStatement
+	public ElseIfStatementElements getElseIfStatementAccess() {
+		return pElseIfStatement;
+	}
+	
+	public ParserRule getElseIfStatementRule() {
+		return getElseIfStatementAccess().getRule();
+	}
+	
+	///////////////////////////////////////////
+	//// Loop - Iteration Rules
+	///////////////////////////////////////////
+	//WhileDoStatement fmlStmnt::WhileDoStatement:
+	//	'while' condition=Expression bodyBlock=BlockStatement
+	public WhileDoStatementElements getWhileDoStatementAccess() {
+		return pWhileDoStatement;
+	}
+	
+	public ParserRule getWhileDoStatementRule() {
+		return getWhileDoStatementAccess().getRule();
+	}
+	
+	//DoWhileStatement fmlStmnt::DoWhileStatement:
+	//	'do' bodyBlock=BlockStatement 'while' condition=Expression ';'
+	public DoWhileStatementElements getDoWhileStatementAccess() {
+		return pDoWhileStatement;
+	}
+	
+	public ParserRule getDoWhileStatementRule() {
+		return getDoWhileStatementAccess().getRule();
+	}
+	
+	//ForStatement fmlStmnt::ForStatement:
+	//	'for' init=ForAssignmentExpression? ';'
+	//	condition=Expression ';' iterate=ForAssignmentExpression?
+	//	bodyBlock=BlockStatement
+	//	| 'for' '(' init=ForAssignmentExpression? ';'
+	//	condition=Expression ';' iterate=ForAssignmentExpression? ')'
+	//	bodyBlock=BlockStatement
+	public ForStatementElements getForStatementAccess() {
+		return pForStatement;
+	}
+	
+	public ParserRule getForStatementRule() {
+		return getForStatementAccess().getRule();
+	}
+	
+	//ForAssignmentExpression fmlExpr::Expression:
+	//	AssignmentExpression
+	//	| IncrementOrDecrementPrefixExpression
+	//	| IncrementOrDecrementPostfixExpression
+	public ForAssignmentExpressionElements getForAssignmentExpressionAccess() {
+		return pForAssignmentExpression;
+	}
+	
+	public ParserRule getForAssignmentExpressionRule() {
+		return getForAssignmentExpressionAccess().getRule();
+	}
+	
+	//ForEachStatement fmlStmnt::ForEachStatement:
+	//	'for' iterator=LeftHandSideExpression ':' enumeration=Expression
+	//	bodyBlock=BlockStatement
+	//	| 'for' '(' iterator=LeftHandSideExpression ':' enumeration=Expression ')'
+	//	bodyBlock=BlockStatement
+	public ForEachStatementElements getForEachStatementAccess() {
+		return pForEachStatement;
+	}
+	
+	public ParserRule getForEachStatementRule() {
+		return getForEachStatementAccess().getRule();
+	}
+	
+	///////////////////////////////////////////
+	//// Interrupt Rules
+	///////////////////////////////////////////
+	//InterruptStatement fmlStmnt::InterruptStatement:
+	//	kind=InterruptStatementKind (expr+=Expression
+	//	| '(' expr+=Expression (',' expr+=Expression)* ')')? ';'
+	public InterruptStatementElements getInterruptStatementAccess() {
+		return pInterruptStatement;
+	}
+	
+	public ParserRule getInterruptStatementRule() {
+		return getInterruptStatementAccess().getRule();
+	}
+	
+	//enum InterruptStatementKind returns fmlStmnt::InterruptStatementKind:
+	//	break | continue | return | exit;
+	public InterruptStatementKindElements getInterruptStatementKindAccess() {
+		return eInterruptStatementKind;
+	}
+	
+	public EnumRule getInterruptStatementKindRule() {
+		return getInterruptStatementKindAccess().getRule();
+	}
+	
+	/////////////////////////////////////////////
+	////// Activity Rules
+	/////////////////////////////////////////////
+	//ActivityStatement fmlStmnt::ActivityStatement:
+	//	{fmlStmnt::ActivityStatement} op=OPERATOR_ACTIVITY
+	//	machine=ValuePureNamedMachineExpression
+	//	tuple=TupleParameterExpression?
+	//	';'
+	public ActivityStatementElements getActivityStatementAccess() {
+		return pActivityStatement;
+	}
+	
+	public ParserRule getActivityStatementRule() {
+		return getActivityStatementAccess().getRule();
+	}
+	
+	//enum OPERATOR_ACTIVITY returns fmlStmnt::ActivityStatementKind:
+	//	init | final | destroy | start | stop | restart | suspend | resume | wait | disable | enable | abort | schedule | irun
+	//	| run | rtc;
+	public OPERATOR_ACTIVITYElements getOPERATOR_ACTIVITYAccess() {
+		return eOPERATOR_ACTIVITY;
+	}
+	
+	public EnumRule getOPERATOR_ACTIVITYRule() {
+		return getOPERATOR_ACTIVITYAccess().getRule();
+	}
+	
+	//InvokeStatement fmlStmnt::InvokeStatement:
+	//	expression=InvokeExpressionDeprecated ';'
+	//	// Exec Routine
+	//	| invokable=[fmlCommon::NamedElement|ESUfid] execRoutine?='(' args=MixTupleExpressionList? ')' ('-->'
+	//	(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])*
+	//	| '(' rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* ')'))? ';'
+	//	// Exec Routine
+	//	| execRoutine?='exec' invokable=[fmlCommon::NamedElement|ESUfid]
+	//	'(' args=MixTupleExpressionList? ')' ('-->' (rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])*
+	//	| '(' rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* ')'))? ';'
+	//	// Call Procedure
+	//	| callProcedure?='call' invokable=[fmlCommon::NamedElement|ESUfid] args=MixTupleExpressionList? ('-->'
+	//	(rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])*
+	//	| '(' rets+=[fmlInfra::Variable] (',' rets+=[fmlInfra::Variable])* ')'))? ';'
+	public InvokeStatementElements getInvokeStatementAccess() {
+		return pInvokeStatement;
+	}
+	
+	public ParserRule getInvokeStatementRule() {
+		return getInvokeStatementAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Expression Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//Expression fmlExpr::Expression:
+	//	AssignmentExpression
+	//	| ConditionalTestExpression
+	public ExpressionElements getExpressionAccess() {
+		return pExpression;
+	}
+	
+	public ParserRule getExpressionRule() {
+		return getExpressionAccess().getRule();
+	}
+	
+	//// Assignment Expression
+	//AssignmentExpression fmlExpr::AssignmentExpression:
+	//	leftHandSide=LeftHandSideExpression
+	//	operator=AssignmentOperator rigthHandSide=Expression
+	public AssignmentExpressionElements getAssignmentExpressionAccess() {
+		return pAssignmentExpression;
+	}
+	
+	public ParserRule getAssignmentExpressionRule() {
+		return getAssignmentExpressionAccess().getRule();
+	}
+	
+	//AssignmentOperator:
+	//	'=' | ':=' | '::='
+	//	| '+=' | '-='
+	//	| '*=' | '/=' | '%='
+	//	| '&&=' | '||='
+	//	| '&=' | '|=' | '^='
+	//	| '<<=' | '>>=' | '>>>='
+	//	// queue operation: push, assign_top, top, pop
+	//	| '<=<'
+	//	| '^=<'
+	//	| '^=>'
+	//	| '>=>';
+	public AssignmentOperatorElements getAssignmentOperatorAccess() {
+		return pAssignmentOperator;
+	}
+	
+	public ParserRule getAssignmentOperatorRule() {
+		return getAssignmentOperatorAccess().getRule();
+	}
+	
+	//LeftHandSideExpression fmlExpr::LeftHandSideExpression:
+	//	{fmlExpr::LeftHandSideExpression} (lvalue=ValueSelectionExpression
+	//	| '(' lvalue=ValueSelectionExpression ')')
+	public LeftHandSideExpressionElements getLeftHandSideExpressionAccess() {
+		return pLeftHandSideExpression;
+	}
+	
+	public ParserRule getLeftHandSideExpressionRule() {
+		return getLeftHandSideExpressionAccess().getRule();
+	}
+	
+	//// Conditional Test Expression
+	//ConditionalTestExpression fmlExpr::Expression:
+	//	LogicalOrExpression ({fmlExpr::ConditionalTestExpression.condition=current} operator='?' thenOperand=Expression ':'
+	//	elseOperand=Expression)?
+	public ConditionalTestExpressionElements getConditionalTestExpressionAccess() {
+		return pConditionalTestExpression;
+	}
+	
+	public ParserRule getConditionalTestExpressionRule() {
+		return getConditionalTestExpressionAccess().getRule();
+	}
+	
+	//// Logical Expression
+	//LogicalOrExpression fmlExpr::Expression:
+	//	LogicalAndExpression ({fmlExpr::LogicalAssociativeExpression.operand+=current} operator=('||' | 'or')
+	//	operand+=LogicalAndExpression (('||' | 'or') operand+=LogicalAndExpression)*)?
+	public LogicalOrExpressionElements getLogicalOrExpressionAccess() {
+		return pLogicalOrExpression;
+	}
+	
+	public ParserRule getLogicalOrExpressionRule() {
+		return getLogicalOrExpressionAccess().getRule();
+	}
+	
+	//LogicalAndExpression fmlExpr::Expression:
+	//	BitwiseOrExpression ({fmlExpr::LogicalAssociativeExpression.operand+=current} operator=('&&' | 'and')
+	//	operand+=BitwiseOrExpression (('&&' | 'and') operand+=BitwiseOrExpression)*)?
+	public LogicalAndExpressionElements getLogicalAndExpressionAccess() {
+		return pLogicalAndExpression;
+	}
+	
+	public ParserRule getLogicalAndExpressionRule() {
+		return getLogicalAndExpressionAccess().getRule();
+	}
+	
+	//// Bitwise Expression
+	//BitwiseOrExpression fmlExpr::Expression:
+	//	BitwiseXorExpression ({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='|'
+	//	operand+=BitwiseXorExpression ('|' operand+=BitwiseXorExpression)*)?
+	public BitwiseOrExpressionElements getBitwiseOrExpressionAccess() {
+		return pBitwiseOrExpression;
+	}
+	
+	public ParserRule getBitwiseOrExpressionRule() {
+		return getBitwiseOrExpressionAccess().getRule();
+	}
+	
+	//BitwiseXorExpression fmlExpr::Expression:
+	//	BitwiseAndExpression ({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='^'
+	//	operand+=BitwiseAndExpression ('^' operand+=BitwiseAndExpression)*)?
+	public BitwiseXorExpressionElements getBitwiseXorExpressionAccess() {
+		return pBitwiseXorExpression;
+	}
+	
+	public ParserRule getBitwiseXorExpressionRule() {
+		return getBitwiseXorExpressionAccess().getRule();
+	}
+	
+	//BitwiseAndExpression fmlExpr::Expression:
+	//	EqualityExpression ({fmlExpr::BitwiseAssociativeExpression.operand+=current} operator='&' operand+=EqualityExpression
+	//	('&' operand+=EqualityExpression)*)?
+	public BitwiseAndExpressionElements getBitwiseAndExpressionAccess() {
+		return pBitwiseAndExpression;
+	}
+	
+	public ParserRule getBitwiseAndExpressionRule() {
+		return getBitwiseAndExpressionAccess().getRule();
+	}
+	
+	//// Equality Expression
+	//EqualityExpression fmlExpr::Expression:
+	//	RelationalExpression ({fmlExpr::EqualityBinaryExpression.leftOperand=current} operator=EqualityOperator
+	//	rigthOperand=RelationalExpression)?
+	public EqualityExpressionElements getEqualityExpressionAccess() {
+		return pEqualityExpression;
+	}
+	
+	public ParserRule getEqualityExpressionRule() {
+		return getEqualityExpressionAccess().getRule();
+	}
+	
+	//EqualityOperator:
+	//	'==' | '!=' | '===' | '=!=' | '=/=';
+	public EqualityOperatorElements getEqualityOperatorAccess() {
+		return pEqualityOperator;
+	}
+	
+	public ParserRule getEqualityOperatorRule() {
+		return getEqualityOperatorAccess().getRule();
+	}
+	
+	//// Relational Binary Expression
+	//RelationalExpression fmlExpr::Expression:
+	//	AdditiveExpression ({fmlExpr::RelationalBinaryExpression.leftOperand=current} operator=RelationalOperator
+	//	rigthOperand=AdditiveExpression ({fmlExpr::RelationalTernaryExpression.leftRelation=current}
+	//	rigthOperator=RelationalOperator rigthOperand=AdditiveExpression)?)?
+	public RelationalExpressionElements getRelationalExpressionAccess() {
+		return pRelationalExpression;
+	}
+	
+	public ParserRule getRelationalExpressionRule() {
+		return getRelationalExpressionAccess().getRule();
+	}
+	
+	//RelationalOperator:
+	//	'<' | '>' | '<=' | '>=';
+	public RelationalOperatorElements getRelationalOperatorAccess() {
+		return pRelationalOperator;
+	}
+	
+	public ParserRule getRelationalOperatorRule() {
+		return getRelationalOperatorAccess().getRule();
+	}
+	
+	//// Arithmetic Associative (left) Expression
+	//AdditiveExpression fmlExpr::Expression:
+	//	MultiplicativeExpression ({fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='+'
+	//	operand+=MultiplicativeExpression ('+' operand+=MultiplicativeExpression)* |
+	//	{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='-' operand+=MultiplicativeExpression ('-'
+	//	operand+=MultiplicativeExpression)*)*
+	public AdditiveExpressionElements getAdditiveExpressionAccess() {
+		return pAdditiveExpression;
+	}
+	
+	public ParserRule getAdditiveExpressionRule() {
+		return getAdditiveExpressionAccess().getRule();
+	}
+	
+	//MultiplicativeExpression fmlExpr::Expression:
+	//	UnaryExpression ({fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='*' operand+=UnaryExpression
+	//	('*' operand+=UnaryExpression)* | {fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='**'
+	//	operand+=UnaryExpression ('**' operand+=UnaryExpression)* |
+	//	{fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='/' operand+=UnaryExpression ('/'
+	//	operand+=UnaryExpression)* | {fmlExpr::ArithmeticAssociativeExpression.operand+=current} operator='%'
+	//	operand+=UnaryExpression ('%' operand+=UnaryExpression)*)*
+	public MultiplicativeExpressionElements getMultiplicativeExpressionAccess() {
+		return pMultiplicativeExpression;
+	}
+	
+	public ParserRule getMultiplicativeExpressionRule() {
+		return getMultiplicativeExpressionAccess().getRule();
+	}
+	
+	//// Unary Expression
+	//UnaryExpression fmlExpr::Expression:
+	//	LiteralTerminalExpression
+	//	| ArithmeticUnaryExpression
+	//	| LogicalUnaryExpression
+	//	| BitwiseUnaryExpression
+	//	| NewfreshExpression
+	//	| CastExpression
+	//	| PrefixUnaryExpression
+	//	| PostfixUnaryExpression
+	//	| PrimaryExpression
+	public UnaryExpressionElements getUnaryExpressionAccess() {
+		return pUnaryExpression;
+	}
+	
+	public ParserRule getUnaryExpressionRule() {
+		return getUnaryExpressionAccess().getRule();
+	}
+	
+	//// Postfix Increment or Decrement Expression
+	//PostfixUnaryExpression fmlExpr::Expression:
+	//	IncrementOrDecrementPostfixExpression
+	public PostfixUnaryExpressionElements getPostfixUnaryExpressionAccess() {
+		return pPostfixUnaryExpression;
+	}
+	
+	public ParserRule getPostfixUnaryExpressionRule() {
+		return getPostfixUnaryExpressionAccess().getRule();
+	}
+	
+	//IncrementOrDecrementPostfixExpression fmlExpr::IncrementOrDecrementPostfixExpression:
+	//	leftHandSide=LeftHandSideExpression operator=AffixOperator
+	public IncrementOrDecrementPostfixExpressionElements getIncrementOrDecrementPostfixExpressionAccess() {
+		return pIncrementOrDecrementPostfixExpression;
+	}
+	
+	public ParserRule getIncrementOrDecrementPostfixExpressionRule() {
+		return getIncrementOrDecrementPostfixExpressionAccess().getRule();
+	}
+	
+	//// Prefix Increment or Decrement Expression
+	//PrefixUnaryExpression fmlExpr::Expression:
+	//	IncrementOrDecrementPrefixExpression
+	public PrefixUnaryExpressionElements getPrefixUnaryExpressionAccess() {
+		return pPrefixUnaryExpression;
+	}
+	
+	public ParserRule getPrefixUnaryExpressionRule() {
+		return getPrefixUnaryExpressionAccess().getRule();
+	}
+	
+	//IncrementOrDecrementPrefixExpression fmlExpr::IncrementOrDecrementPrefixExpression:
+	//	operator=AffixOperator leftHandSide=LeftHandSideExpression
+	public IncrementOrDecrementPrefixExpressionElements getIncrementOrDecrementPrefixExpressionAccess() {
+		return pIncrementOrDecrementPrefixExpression;
+	}
+	
+	public ParserRule getIncrementOrDecrementPrefixExpressionRule() {
+		return getIncrementOrDecrementPrefixExpressionAccess().getRule();
+	}
+	
+	//AffixOperator:
+	//	'++' | '--';
+	public AffixOperatorElements getAffixOperatorAccess() {
+		return pAffixOperator;
+	}
+	
+	public ParserRule getAffixOperatorRule() {
+		return getAffixOperatorAccess().getRule();
+	}
+	
+	//// Newfresh Unary Expression
+	//NewfreshExpression fmlExpr::NewfreshExpression:
+	//	'newfresh' leftHandSide=LeftHandSideExpression
+	//	| '(:' leftHandSide=LeftHandSideExpression 'newfresh' ')'
+	public NewfreshExpressionElements getNewfreshExpressionAccess() {
+		return pNewfreshExpression;
+	}
+	
+	public ParserRule getNewfreshExpressionRule() {
+		return getNewfreshExpressionAccess().getRule();
+	}
+	
+	//// Cast Expression
+	//CastExpression fmlExpr::CastExpression:
+	//	'ctor' '<' datatype=[fmlType::DataType|ESUfid] '>'
+	//	'(' operand=Expression ')'
+	public CastExpressionElements getCastExpressionAccess() {
+		return pCastExpression;
+	}
+	
+	public ParserRule getCastExpressionRule() {
+		return getCastExpressionAccess().getRule();
+	}
+	
+	//// Arithmetic Unary Expression
+	//ArithmeticUnaryExpression fmlExpr::ArithmeticUnaryExpression:
+	//	operator=ArithmeticUnaryOperator operand=UnaryExpression
+	public ArithmeticUnaryExpressionElements getArithmeticUnaryExpressionAccess() {
+		return pArithmeticUnaryExpression;
+	}
+	
+	public ParserRule getArithmeticUnaryExpressionRule() {
+		return getArithmeticUnaryExpressionAccess().getRule();
+	}
+	
+	//ArithmeticUnaryOperator:
+	//	'+' | '-';
+	public ArithmeticUnaryOperatorElements getArithmeticUnaryOperatorAccess() {
+		return pArithmeticUnaryOperator;
+	}
+	
+	public ParserRule getArithmeticUnaryOperatorRule() {
+		return getArithmeticUnaryOperatorAccess().getRule();
+	}
+	
+	//// Logical Unary Expression
+	//LogicalUnaryExpression fmlExpr::LogicalUnaryExpression:
+	//	operator=('!' | 'not') operand=UnaryExpression
+	public LogicalUnaryExpressionElements getLogicalUnaryExpressionAccess() {
+		return pLogicalUnaryExpression;
+	}
+	
+	public ParserRule getLogicalUnaryExpressionRule() {
+		return getLogicalUnaryExpressionAccess().getRule();
+	}
+	
+	//// Logical Unary Expression
+	//BitwiseUnaryExpression fmlExpr::BitwiseUnaryExpression:
+	//	operator='~' operand=UnaryExpression
+	public BitwiseUnaryExpressionElements getBitwiseUnaryExpressionAccess() {
+		return pBitwiseUnaryExpression;
+	}
+	
+	public ParserRule getBitwiseUnaryExpressionRule() {
+		return getBitwiseUnaryExpressionAccess().getRule();
+	}
+	
+	//PrimaryExpression fmlExpr::Expression:
+	//	BaseExpression ({fmlExpr::ValueElementSpecification.target=current}
+	//	'.' //kind=ValueDotFieldExpressionKind
+	//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+	//	arg=PositionalTupleExpressionList ']'
+	//	// '(' parameter ',' ... ',' parameter ')'
+	//	| kind=ValueParameterExpressionKind
+	//	arg=MixTupleExpressionList ')')?)* ({fmlExpr::ValueElementSpecification.target=current}
+	//	'->' //kind=ValueArrowFieldExpressionKind
+	//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+	//	arg=PositionalTupleExpressionList ']'
+	//	// '(' parameter ',' ... ',' parameter ')'
+	//	| kind=ValueParameterExpressionKind
+	//	arg=MixTupleExpressionList ')')? ({fmlExpr::ValueElementSpecification.target=current}
+	//	'.' //kind=ValueDotFieldExpressionKind
+	//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+	//	arg=PositionalTupleExpressionList ']'
+	//	// '(' parameter ',' ... ',' parameter ')'
+	//	| kind=ValueParameterExpressionKind
+	//	arg=MixTupleExpressionList ')')?)*)?
+	public PrimaryExpressionElements getPrimaryExpressionAccess() {
+		return pPrimaryExpression;
+	}
+	
+	public ParserRule getPrimaryExpressionRule() {
+		return getPrimaryExpressionAccess().getRule();
+	}
+	
+	//BaseExpression fmlExpr::Expression:
+	//	LiteralReferenceableExpression
+	//	| '(' Expression ')'
+	//	| InvokeExpressionDeprecated
+	//	| InstantiationExpression
+	public BaseExpressionElements getBaseExpressionAccess() {
+		return pBaseExpression;
+	}
+	
+	public ParserRule getBaseExpressionRule() {
+		return getBaseExpressionAccess().getRule();
+	}
+	
+	//// Behavior Invoke Expression
+	//InvokeExpression fmlExpr::InvokeExpression:
+	//	{fmlExpr::InvokeExpression} invoke=ValueSelectionExpression
+	public InvokeExpressionElements getInvokeExpressionAccess() {
+		return pInvokeExpression;
+	}
+	
+	public ParserRule getInvokeExpressionRule() {
+		return getInvokeExpressionAccess().getRule();
+	}
+	
+	//InvokeExpressionDeprecated fmlExpr::InvokeExpression:
+	//	{fmlExpr::InvokeExpression}
+	//	'(:' args+=Expression invoke=LiteralReferenceElement args+=Expression* ')'
+	public InvokeExpressionDeprecatedElements getInvokeExpressionDeprecatedAccess() {
+		return pInvokeExpressionDeprecated;
+	}
+	
+	public ParserRule getInvokeExpressionDeprecatedRule() {
+		return getInvokeExpressionDeprecatedAccess().getRule();
+	}
+	
+	//InstantiationExpression fmlExpr::InstantiationExpression:
+	//	{fmlExpr::InstantiationExpression} instance=DynamicInstanceSpecification ';'
+	public InstantiationExpressionElements getInstantiationExpressionAccess() {
+		return pInstantiationExpression;
+	}
+	
+	public ParserRule getInstantiationExpressionRule() {
+		return getInstantiationExpressionAccess().getRule();
+	}
+	
+	//DynamicInstanceSpecification fmlInfra::InstanceMachine:
+	//	{fmlInfra::InstanceMachine}
+	//	'new' model=[fmlInfra::Machine|ESIdentifier] ('(' (slot+=SlotParameter (',' slot+=SlotParameter)*)? ')'
+	//	| '{' (slot+=SlotProperty ';')* '}')?
+	public DynamicInstanceSpecificationElements getDynamicInstanceSpecificationAccess() {
+		return pDynamicInstanceSpecification;
+	}
+	
+	public ParserRule getDynamicInstanceSpecificationRule() {
+		return getDynamicInstanceSpecificationAccess().getRule();
+	}
+	
+	//// Tuple Expression
+	//TupleParameterExpression fmlExpr::TupleExpression:
+	//	'(' MixTupleExpressionList ')'
+	public TupleParameterExpressionElements getTupleParameterExpressionAccess() {
+		return pTupleParameterExpression;
+	}
+	
+	public ParserRule getTupleParameterExpressionRule() {
+		return getTupleParameterExpressionAccess().getRule();
+	}
+	
+	//MixTupleExpressionList fmlExpr::MixTupleExpression:
+	//	{fmlExpr::MixTupleExpression} value+=(Expression | NamedExpression) (',' value+=(Expression | NamedExpression))*
+	public MixTupleExpressionListElements getMixTupleExpressionListAccess() {
+		return pMixTupleExpressionList;
+	}
+	
+	public ParserRule getMixTupleExpressionListRule() {
+		return getMixTupleExpressionListAccess().getRule();
+	}
+	
+	////// At least one NamedExpression
+	////FormalMixTupleExpressionList returns fmlExpr::MixTupleExpression
+	////	: {fmlExpr::MixTupleExpression}
+	////		( value+=Expression  ( ',' value+=Expression )*
+	////			( ',' value+=NamedExpression )
+	////		| value+=NamedExpression
+	////		)
+	////		( ',' value+=( Expression | NamedExpression ) )*
+	////	;
+	////
+	////// NamedExpression only at the end
+	////EndingMixTupleExpressionList returns fmlExpr::MixTupleExpression
+	////	: {fmlExpr::MixTupleExpression}
+	////		( value+=Expression  ( ',' value+=Expression )*
+	////		| value+=NamedExpression
+	////		)
+	////		( ',' value+=NamedExpression )*
+	////	;
+	////
+	////
+	////NamedTupleExpressionList returns fmlExpr::NamedTupleExpression
+	////	: value+=NamedExpression ( ',' value+=NamedExpression )*
+	////	;
+	//PositionalTupleExpressionList fmlExpr::PositionalTupleExpression:
+	//	value+=Expression (',' value+=Expression)*
+	public PositionalTupleExpressionListElements getPositionalTupleExpressionListAccess() {
+		return pPositionalTupleExpressionList;
+	}
+	
+	public ParserRule getPositionalTupleExpressionListRule() {
+		return getPositionalTupleExpressionListAccess().getRule();
+	}
+	
+	//NamedExpression fmlExpr::NamedExpression:
+	//	name=XLIA_ID (':' | '=>' | '<-') expression=Expression
+	public NamedExpressionElements getNamedExpressionAccess() {
+		return pNamedExpression;
+	}
+	
+	public ParserRule getNamedExpressionRule() {
+		return getNamedExpressionAccess().getRule();
+	}
+	
+	////NotificationComExpression returns fmlExpr::Expression
+	////	: { fmlExpr::Expression }
+	////		symbol=( 'present' | 'absent' )  operand+=Expression
+	////	;
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Literal Expression Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralExpression fmlExpr::LiteralExpression:
+	//	LiteralTerminalExpression
+	//	| LiteralReferenceableExpression
+	public LiteralExpressionElements getLiteralExpressionAccess() {
+		return pLiteralExpression;
+	}
+	
+	public ParserRule getLiteralExpressionRule() {
+		return getLiteralExpressionAccess().getRule();
+	}
+	
+	//LiteralReferenceableExpression fmlExpr::LiteralExpression:
+	//	LiteralCollectionExpression
+	//	| LiteralReferenceExpression
+	public LiteralReferenceableExpressionElements getLiteralReferenceableExpressionAccess() {
+		return pLiteralReferenceableExpression;
+	}
+	
+	public ParserRule getLiteralReferenceableExpressionRule() {
+		return getLiteralReferenceableExpressionAccess().getRule();
+	}
+	
+	//LiteralTerminalExpression fmlExpr::LiteralExpression:
+	//	LiteralBooleanExpression
+	//	| LiteralIntegerExpression
+	//	| LiteralRationalExpression
+	//	| LiteralFloatExpression
+	//	| LiteralCharacterExpression
+	//	| LiteralStringExpression
+	//	| LiteralNullExpression
+	public LiteralTerminalExpressionElements getLiteralTerminalExpressionAccess() {
+		return pLiteralTerminalExpression;
+	}
+	
+	public ParserRule getLiteralTerminalExpressionRule() {
+		return getLiteralTerminalExpressionAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Literal Boolean / Numeric Expression Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralBooleanExpression fmlExpr::LiteralBooleanExpression:
+	//	{fmlExpr::LiteralBooleanExpression} value=EBoolean
+	public LiteralBooleanExpressionElements getLiteralBooleanExpressionAccess() {
+		return pLiteralBooleanExpression;
+	}
+	
+	public ParserRule getLiteralBooleanExpressionRule() {
+		return getLiteralBooleanExpressionAccess().getRule();
+	}
+	
+	//LiteralIntegerExpression fmlExpr::LiteralIntegerExpression:
+	//	{fmlExpr::LiteralIntegerExpression} value=EInteger
+	public LiteralIntegerExpressionElements getLiteralIntegerExpressionAccess() {
+		return pLiteralIntegerExpression;
+	}
+	
+	public ParserRule getLiteralIntegerExpressionRule() {
+		return getLiteralIntegerExpressionAccess().getRule();
+	}
+	
+	//LiteralRationalExpression fmlExpr::LiteralRationalExpression:
+	//	{fmlExpr::LiteralRationalExpression} numerator=EInteger '/' denominator=EInteger
+	public LiteralRationalExpressionElements getLiteralRationalExpressionAccess() {
+		return pLiteralRationalExpression;
+	}
+	
+	public ParserRule getLiteralRationalExpressionRule() {
+		return getLiteralRationalExpressionAccess().getRule();
+	}
+	
+	//LiteralFloatExpression fmlExpr::LiteralFloatExpression:
+	//	{fmlExpr::LiteralFloatExpression} value=EDouble
+	public LiteralFloatExpressionElements getLiteralFloatExpressionAccess() {
+		return pLiteralFloatExpression;
+	}
+	
+	public ParserRule getLiteralFloatExpressionRule() {
+		return getLiteralFloatExpressionAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Literal Character / String Expression Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralCharacterExpression fmlExpr::LiteralCharacterExpression:
+	//	{fmlExpr::LiteralCharacterExpression} value=ECharacter
+	public LiteralCharacterExpressionElements getLiteralCharacterExpressionAccess() {
+		return pLiteralCharacterExpression;
+	}
+	
+	public ParserRule getLiteralCharacterExpressionRule() {
+		return getLiteralCharacterExpressionAccess().getRule();
+	}
+	
+	//LiteralStringExpression fmlExpr::LiteralStringExpression:
+	//	{fmlExpr::LiteralStringExpression} value=EString
+	public LiteralStringExpressionElements getLiteralStringExpressionAccess() {
+		return pLiteralStringExpression;
+	}
+	
+	public ParserRule getLiteralStringExpressionRule() {
+		return getLiteralStringExpressionAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Literal Null Expression Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralNullExpression fmlExpr::LiteralNullExpression:
+	//	{fmlExpr::LiteralNullExpression} ('null' | '$null') | {fmlExpr::LiteralNullExpression} ('null<' | '$null<')
+	//	type=DataType '>'
+	public LiteralNullExpressionElements getLiteralNullExpressionAccess() {
+		return pLiteralNullExpression;
+	}
+	
+	public ParserRule getLiteralNullExpressionRule() {
+		return getLiteralNullExpressionAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Literal Collection Expression Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralCollectionExpression fmlExpr::LiteralCollectionExpression:
+	//	{fmlExpr::LiteralCollectionExpression} ('<' datatype=DataType '>')?
+	//	'{' ((value+=Expression | value+=NamedExpression) (',' (value+=Expression | value+=NamedExpression))*)? '}'
+	public LiteralCollectionExpressionElements getLiteralCollectionExpressionAccess() {
+		return pLiteralCollectionExpression;
+	}
+	
+	public ParserRule getLiteralCollectionExpressionRule() {
+		return getLiteralCollectionExpressionAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Literal Reference Expression Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralReferenceExpression fmlExpr::LiteralReferenceExpression:
+	//	LiteralReferenceElement
+	//	| LiteralReferenceVariableContext
+	//	| LiteralReferenceMachineContext
+	//	| LiteralEnvExpression
+	public LiteralReferenceExpressionElements getLiteralReferenceExpressionAccess() {
+		return pLiteralReferenceExpression;
+	}
+	
+	public ParserRule getLiteralReferenceExpressionRule() {
+		return getLiteralReferenceExpressionAccess().getRule();
+	}
+	
+	//LiteralReferenceElement fmlExpr::LiteralReferenceElement:
+	//	{fmlExpr::LiteralReferenceElement} value=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+	//	arg=PositionalTupleExpressionList ']'
+	//	// '(' parameter ',' ... ',' parameter ')'
+	//	| kind=ValueParameterExpressionKind
+	//	arg=MixTupleExpressionList ')')?
+	public LiteralReferenceElementElements getLiteralReferenceElementAccess() {
+		return pLiteralReferenceElement;
+	}
+	
+	public ParserRule getLiteralReferenceElementRule() {
+		return getLiteralReferenceElementAccess().getRule();
+	}
+	
+	//LiteralPureReferenceElement fmlExpr::LiteralReferenceElement:
+	//	{fmlExpr::LiteralReferenceElement} value=[fmlCommon::NamedElement|ESIdentifier]
+	public LiteralPureReferenceElementElements getLiteralPureReferenceElementAccess() {
+		return pLiteralPureReferenceElement;
+	}
+	
+	public ParserRule getLiteralPureReferenceElementRule() {
+		return getLiteralPureReferenceElementAccess().getRule();
+	}
+	
+	//LiteralReferenceVariableContext fmlExpr::LiteralReferenceExpression:
+	//	LiteralTimeExpression
+	//	| LiteralTimeDeltaExpression
+	public LiteralReferenceVariableContextElements getLiteralReferenceVariableContextAccess() {
+		return pLiteralReferenceVariableContext;
+	}
+	
+	public ParserRule getLiteralReferenceVariableContextRule() {
+		return getLiteralReferenceVariableContextAccess().getRule();
+	}
+	
+	//LiteralTimeExpression fmlExpr::LiteralTimeExpression:
+	//	{fmlExpr::LiteralTimeExpression} '$time'
+	public LiteralTimeExpressionElements getLiteralTimeExpressionAccess() {
+		return pLiteralTimeExpression;
+	}
+	
+	public ParserRule getLiteralTimeExpressionRule() {
+		return getLiteralTimeExpressionAccess().getRule();
+	}
+	
+	//LiteralTimeDeltaExpression fmlExpr::LiteralTimeDeltaExpression:
+	//	{fmlExpr::LiteralTimeDeltaExpression} '$delta'
+	public LiteralTimeDeltaExpressionElements getLiteralTimeDeltaExpressionAccess() {
+		return pLiteralTimeDeltaExpression;
+	}
+	
+	public ParserRule getLiteralTimeDeltaExpressionRule() {
+		return getLiteralTimeDeltaExpressionAccess().getRule();
+	}
+	
+	//LiteralReferenceMachineContext fmlExpr::LiteralReferenceExpression:
+	//	LiteralThisExpression
+	//	| LiteralSelfExpression
+	//	| LiteralParentExpression
+	//	| LiteralSuperExpression
+	//	| LiteralSystemExpression
+	//	| LiteralEnvExpression
+	public LiteralReferenceMachineContextElements getLiteralReferenceMachineContextAccess() {
+		return pLiteralReferenceMachineContext;
+	}
+	
+	public ParserRule getLiteralReferenceMachineContextRule() {
+		return getLiteralReferenceMachineContextAccess().getRule();
+	}
+	
+	//LiteralThisExpression fmlExpr::LiteralThisExpression:
+	//	{fmlExpr::LiteralThisExpression} '$this'
+	public LiteralThisExpressionElements getLiteralThisExpressionAccess() {
+		return pLiteralThisExpression;
+	}
+	
+	public ParserRule getLiteralThisExpressionRule() {
+		return getLiteralThisExpressionAccess().getRule();
+	}
+	
+	//LiteralSelfExpression fmlExpr::LiteralSelfExpression:
+	//	{fmlExpr::LiteralSelfExpression} '$self'
+	public LiteralSelfExpressionElements getLiteralSelfExpressionAccess() {
+		return pLiteralSelfExpression;
+	}
+	
+	public ParserRule getLiteralSelfExpressionRule() {
+		return getLiteralSelfExpressionAccess().getRule();
+	}
+	
+	//LiteralParentExpression fmlExpr::LiteralParentExpression:
+	//	{fmlExpr::LiteralParentExpression} '$parent'
+	public LiteralParentExpressionElements getLiteralParentExpressionAccess() {
+		return pLiteralParentExpression;
+	}
+	
+	public ParserRule getLiteralParentExpressionRule() {
+		return getLiteralParentExpressionAccess().getRule();
+	}
+	
+	//LiteralSuperExpression fmlExpr::LiteralSuperExpression:
+	//	{fmlExpr::LiteralSuperExpression} '$super'
+	public LiteralSuperExpressionElements getLiteralSuperExpressionAccess() {
+		return pLiteralSuperExpression;
+	}
+	
+	public ParserRule getLiteralSuperExpressionRule() {
+		return getLiteralSuperExpressionAccess().getRule();
+	}
+	
+	//LiteralSystemExpression fmlExpr::LiteralSystemExpression:
+	//	{fmlExpr::LiteralSystemExpression} '$system'
+	public LiteralSystemExpressionElements getLiteralSystemExpressionAccess() {
+		return pLiteralSystemExpression;
+	}
+	
+	public ParserRule getLiteralSystemExpressionRule() {
+		return getLiteralSystemExpressionAccess().getRule();
+	}
+	
+	//LiteralEnvExpression fmlExpr::LiteralEnvExpression:
+	//	{fmlExpr::LiteralEnvExpression} ('$env' | 'env')
+	public LiteralEnvExpressionElements getLiteralEnvExpressionAccess() {
+		return pLiteralEnvExpression;
+	}
+	
+	public ParserRule getLiteralEnvExpressionRule() {
+		return getLiteralEnvExpressionAccess().getRule();
+	}
+	
+	//////////////////////////////////////////////////////////////////////////////////
+	//// Value Element Specification Expression Rules
+	//////////////////////////////////////////////////////////////////////////////////
+	//LiteralPureReferenceExpression fmlExpr::LiteralReferenceExpression:
+	//	LiteralPureReferenceElement
+	//	| LiteralReferenceMachineContext
+	public LiteralPureReferenceExpressionElements getLiteralPureReferenceExpressionAccess() {
+		return pLiteralPureReferenceExpression;
+	}
+	
+	public ParserRule getLiteralPureReferenceExpressionRule() {
+		return getLiteralPureReferenceExpressionAccess().getRule();
+	}
+	
+	//ValueSelectionExpression fmlExpr::Expression:
+	//	LiteralReferenceExpression ({fmlExpr::ValueElementSpecification.target=current}
+	//	'.' //kind=ValueDotFieldExpressionKind
+	//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+	//	arg=PositionalTupleExpressionList ']'
+	//	//			// TODO '(' parameter ',' ... ',' parameter ')'
+	//	//			| kind=ValueParameterExpressionKind
+	//	//				arg=MixTupleExpressionList  ')'
+	//)?)* ({fmlExpr::ValueElementSpecification.target=current}
+	//	'->' //kind=ValueArrowFieldExpressionKind
+	//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+	//	arg=PositionalTupleExpressionList ']'
+	//	//			// TODO '(' parameter ',' ... ',' parameter ')'
+	//	//			| kind=ValueParameterExpressionKind
+	//	//				arg=MixTupleExpressionList  ')'
+	//)? ({fmlExpr::ValueElementSpecification.target=current}
+	//	'.' //kind=ValueDotFieldExpressionKind
+	//	element=[fmlCommon::NamedElement|ESIdentifier] (kind=ValueIndexExpressionKind
+	//	arg=PositionalTupleExpressionList ']'
+	//	//				// TODO '(' parameter ',' ... ',' parameter ')'
+	//	//				| kind=ValueParameterExpressionKind
+	//	//					arg=MixTupleExpressionList  ')'
+	//)?)*)?
+	public ValueSelectionExpressionElements getValueSelectionExpressionAccess() {
+		return pValueSelectionExpression;
+	}
+	
+	public ParserRule getValueSelectionExpressionRule() {
+		return getValueSelectionExpressionAccess().getRule();
+	}
+	
+	////ValuePureNamedElementExpression
+	////ValuePureNamedElementExpression returns fmlExpr::Expression
+	////	: LiteralPureReferenceExpression
+	////
+	////		// '.' element
+	////		( { fmlExpr::ValueElementSpecification.target=current }
+	////			kind=ValueDotFieldExpressionKind
+	////			element=[fmlCommon::NamedElement|ESIdentifier]
+	////		)*
+	////
+	////		// '->' element
+	////		( { fmlExpr::ValueElementSpecification.target=current }
+	////			kind=ValueArrowFieldExpressionKind
+	////			element=[fmlCommon::NamedElement|ESIdentifier]
+	////
+	////			// '.' element
+	////			( { fmlExpr::ValueElementSpecification.target=current }
+	////				kind=ValueDotFieldExpressionKind
+	////				element=[fmlCommon::NamedElement|ESIdentifier]
+	////			)*
+	////		)?
+	////	;
+	//ValuePureNamedMachineExpression fmlExpr::Expression:
+	//	LiteralPureReferenceExpression ({fmlExpr::ValueElementSpecification.target=current} kind=ValueDotFieldExpressionKind
+	//	element=[fmlCommon::NamedElement|ESIdentifier])* ({fmlExpr::ValueElementSpecification.target=current}
+	//	kind=ValueArrowFieldExpressionKind
+	//	element=[fmlCommon::NamedElement|ESIdentifier] ({fmlExpr::ValueElementSpecification.target=current}
+	//	kind=ValueDotFieldExpressionKind
+	//	element=[fmlCommon::NamedElement|ESIdentifier])*)?
+	public ValuePureNamedMachineExpressionElements getValuePureNamedMachineExpressionAccess() {
+		return pValuePureNamedMachineExpression;
+	}
+	
+	public ParserRule getValuePureNamedMachineExpressionRule() {
+		return getValuePureNamedMachineExpressionAccess().getRule();
+	}
+	
+	//enum ValueDotFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+	//	field='.';
+	public ValueDotFieldExpressionKindElements getValueDotFieldExpressionKindAccess() {
+		return eValueDotFieldExpressionKind;
+	}
+	
+	public EnumRule getValueDotFieldExpressionKindRule() {
+		return getValueDotFieldExpressionKindAccess().getRule();
+	}
+	
+	//enum ValueColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+	//	field=':';
+	public ValueColonFieldExpressionKindElements getValueColonFieldExpressionKindAccess() {
+		return eValueColonFieldExpressionKind;
+	}
+	
+	public EnumRule getValueColonFieldExpressionKindRule() {
+		return getValueColonFieldExpressionKindAccess().getRule();
+	}
+	
+	//enum ValueDoubleColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+	//	field='::';
+	public ValueDoubleColonFieldExpressionKindElements getValueDoubleColonFieldExpressionKindAccess() {
+		return eValueDoubleColonFieldExpressionKind;
+	}
+	
+	public EnumRule getValueDoubleColonFieldExpressionKindRule() {
+		return getValueDoubleColonFieldExpressionKindAccess().getRule();
+	}
+	
+	//enum ValueArrowFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+	//	field='->';
+	public ValueArrowFieldExpressionKindElements getValueArrowFieldExpressionKindAccess() {
+		return eValueArrowFieldExpressionKind;
+	}
+	
+	public EnumRule getValueArrowFieldExpressionKindRule() {
+		return getValueArrowFieldExpressionKindAccess().getRule();
+	}
+	
+	//enum ValueIndexExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+	//	index='[';
+	public ValueIndexExpressionKindElements getValueIndexExpressionKindAccess() {
+		return eValueIndexExpressionKind;
+	}
+	
+	public EnumRule getValueIndexExpressionKindRule() {
+		return getValueIndexExpressionKindAccess().getRule();
+	}
+	
+	//enum ValueParameterExpressionKind returns fmlExpr::ValueElementSpecificationKind:
+	//	parameter='(';
+	public ValueParameterExpressionKindElements getValueParameterExpressionKindAccess() {
+		return eValueParameterExpressionKind;
+	}
+	
+	public EnumRule getValueParameterExpressionKindRule() {
+		return getValueParameterExpressionKindAccess().getRule();
+	}
+	
+	//terminal ID:
+	//	'^'? ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*;
+	public TerminalRule getIDRule() {
+		return gaTerminals.getIDRule();
+	}
+	
+	//terminal STRING:
+	//	'"' ('\\' . | !('\\' | '"'))* '"' |
+	//	"'" ('\\' . | !('\\' | "'"))* "'";
+	public TerminalRule getSTRINGRule() {
+		return gaTerminals.getSTRINGRule();
+	}
+	
+	//terminal ML_COMMENT:
+	//	'/ *'->'* /';
+	public TerminalRule getML_COMMENTRule() {
+		return gaTerminals.getML_COMMENTRule();
+	}
+	
+	//terminal SL_COMMENT:
+	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
+	public TerminalRule getSL_COMMENTRule() {
+		return gaTerminals.getSL_COMMENTRule();
+	}
+	
+	//terminal WS:
+	//	' ' | '\t' | '\r' | '\n'+;
+	public TerminalRule getWSRule() {
+		return gaTerminals.getWSRule();
+	}
+	
+	//terminal ANY_OTHER:
+	//	.;
+	public TerminalRule getANY_OTHERRule() {
+		return gaTerminals.getANY_OTHERRule();
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/validation/AbstractFormalMLValidator.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/validation/AbstractFormalMLValidator.java
new file mode 100644
index 0000000..7511e16
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src-gen/org/eclipse/efm/formalml/xtext/validation/AbstractFormalMLValidator.java
@@ -0,0 +1,35 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.validation;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.xtext.validation.AbstractDeclarativeValidator;
+
+public abstract class AbstractFormalMLValidator extends AbstractDeclarativeValidator {
+	
+	@Override
+	protected List<EPackage> getEPackages() {
+		List<EPackage> result = new ArrayList<EPackage>();
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/efm/FormalML"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/efm/FormalML/Common"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/efm/FormalML/Infrastructure"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/efm/FormalML/Statemachine"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/efm/FormalML/Expression"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/efm/FormalML/DataType"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/efm/FormalML/Statement"));
+		return result;
+	}
+	
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalML.xtext b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalML.xtext
new file mode 100644
index 0000000..8516dbf
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalML.xtext
@@ -0,0 +1,3277 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+grammar org.eclipse.efm.formalml.xtext.FormalML with org.eclipse.xtext.common.Terminals
+
+//import "http://www.eclipse.org/efm/FormalML/Common" as fmlCommon
+//import "http://www.eclipse.org/efm/FormalML/DataType" as fmlType
+//import "http://www.eclipse.org/efm/FormalML/Infrastructure" as fmlInfra
+//import "http://www.eclipse.org/efm/FormalML/Expression" as fmlExpr
+//import "http://www.eclipse.org/efm/FormalML/Statemachine" as fmlStmchn
+//import "http://www.eclipse.org/efm/FormalML/Statement" as fmlStmnt
+
+// [XTEXT-BUG] https://www.eclipse.org/forums/index.php/t/1081040/
+// Nested packages is not supported well unless you use 
+// import platform:/resource/xxxxx/yyy.ecore#//pack 
+// instead of namespace imports (there is somewhere a bug around this)
+
+import "platform:/resource/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.ecore#//common" as fmlCommon
+import "platform:/resource/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.ecore#//datatype" as fmlType
+import "platform:/resource/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.ecore#//expression" as fmlExpr
+import "platform:/resource/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.ecore#//infrastructure" as fmlInfra
+import "platform:/resource/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.ecore#//statement" as fmlStmnt
+import "platform:/resource/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.ecore#//statemachine" as fmlStmchn
+
+import "http://www.eclipse.org/emf/2002/Ecore" as ecore
+
+import "http://www.eclipse.org/efm/FormalML"
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Main Rules
+////////////////////////////////////////////////////////////////////////////////
+
+Xlia returns XliaModel
+	: prolog = XliaPrologObject
+	  	system = System
+	;
+
+XliaPrologObject returns XliaObject
+	: name=( '@FormalML' | '@xlia' | '@xfsp' ) '<'
+		( elements+=XliaPrologAttribute )
+//		( ',' elements+=XliaPrologAttribute )+
+		'>:'
+		( elements += XliaOptionObject )?
+	;
+
+XliaPrologAttribute returns XliaAttribute
+	: name=( 'system' | 'package' )
+		( ',' value=( LiteralFloatExpression | LiteralStringExpression ) )?
+	;
+
+
+//XliaPrologAttribute returns XliaAttribute
+//	: (name = 'model')?    value=XliaModelKind
+//	| (name = 'version')?
+//		value=( LiteralFloatExpression | LiteralStringExpression )
+//	;
+//
+//XliaModelKind returns fmlExpr::LiteralStringExpression
+//	: value=( 'system' | 'package' )
+//	;
+
+
+XliaOptionObject returns XliaObject
+	: name='@option' '{'
+		( elements+=XliaNamedElement )*
+	  '}'
+	;
+
+XliaNamedElement returns XliaNamedElement
+	: XliaObject
+	| XliaAttribute
+	;
+
+XliaObject returns XliaObject
+	: name=XLIA_ID '{'
+		( elements+=XliaNamedElement )*
+	  '}'
+	;
+
+XliaAttribute returns XliaAttribute
+	: name=XLIA_ID '=' value=Expression ';'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Primitive Value
+////////////////////////////////////////////////////////////////////////////////
+
+EBoolean returns ecore::EBoolean
+	: 'true' | 'false'
+	;
+
+terminal INT returns ecore::EInt: ('0'..'9')+;
+
+EInt returns ecore::EInt
+	: '-'? INT
+	;
+
+EInteger returns ecore::ELong
+	: '-'? INT
+	;
+
+EFloat returns ecore::EFloat
+	: '-'? INT? '.' INT //(('E'|'e') '-'? INT)?
+	;
+
+EDouble returns ecore::EDouble
+	: '-'? INT? '.' INT //(('E'|'e') '-'? INT)?
+	;
+
+
+terminal CHARACTER
+	: "'" . "'"
+	;
+
+ECharacter returns ecore::EChar
+	: CHARACTER
+	;
+
+EString returns ecore::EString
+	: STRING
+	;
+
+
+//QualifiedName returns ecore::EString
+//	: ID ( '[' ID ']' )? '.' ID ( '[' ID ']' )? | ID
+//	;
+
+
+ReservedWord
+	: 'package' | 'system' | 'machine'
+	| 'statemachine' | 'state' | 'pseudostate' | 'vertex'
+	| 'procedure' | 'macro' | 'routine' | 'transition'
+	| 'public' | 'private' | 'protected'
+	| 'static' | 'final' | 'reference' | 'volatile' | 'transient'
+	| 'model' | 'prototype' | 'instance'
+	| 'timed' | 'input_enabled'
+	| 'port' | 'signal' | 'buffer' | 'channel'
+	| 'var' | 'val' | 'const'
+	| 'input' | 'in' | 'inout' | 'output' | 'out' | 'return'
+	| 'simple' | 'start' | 'final' | 'initial' | 'terminal' | 'junction'
+	| 'choice' | 'fork' | 'join' | 'dhistory' | 'shistory'
+	| 'route' | 'connect' | 'env' | 'rdv' | 'multi_rdv' | 'buffer'
+	| 'unicast' | 'anycast' | 'multicast' | 'broadcast'
+	| 'boolean' | 'bool' | 'char' | 'string' | 'message'
+	| 'integer' | 'int' | 'uinteger' | 'uint'
+	| 'rational' | 'rat' | 'urational' | 'urat'
+	| 'time' | 'clock'
+	| 'float' | 'double' | 'real' | 'ufloat' | 'udouble' | 'ureal'
+	| 'interval' | 'enum'  | 'struct' | 'union'
+	| 'vector' | 'rvector' | 'list' | 'set' | 'bag' | 'fifo' | 'lifo'
+	| 'guard' | 'tguard' | 'event' | 'checksat' | 'via' | 'newfresh'
+	| 'break' | 'continue' | 'exit' | 'init' | 'destroy' | 'stop' | 'abort'
+	| 'restart' | 'suspend' | 'resume' | 'wait' | 'disable' | 'enable'
+	| 'schedule' | 'irun' | 'run' | 'rtc' | 'call' | 'new' | 'ctor'
+	| 'this' | 'self' | 'parent' | 'super' | 'null'
+	;
+
+terminal XLIA_ID
+	: ('a'..'z'|'A'..'Z'|'_'|'#') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'#')*
+	;
+
+ESIdentifier returns ecore::EString
+	: XLIA_ID
+	;
+
+ESUfid returns ecore::EString
+	: XLIA_ID  ( ( '.' | ':' | '::' ) XLIA_ID )*
+	;
+
+UnrestrictedName returns ecore::EString
+	: STRING
+	;
+
+
+
+QualifiedName returns fmlCommon::QualifiedName
+	: UnqualifiedName
+		( '::' nameBinding += NameBinding )*
+		( '.' nameBinding += NameBinding )*
+	;
+
+PotentiallyAmbiguousQualifiedName returns fmlCommon::QualifiedName
+	: UnqualifiedName
+		( '::' nameBinding += NameBinding )*
+		( isAmbiguous ?= '.' nameBinding += NameBinding
+			( '.' nameBinding += NameBinding )*
+		)?
+	;
+
+ColonQualifiedName returns fmlCommon::QualifiedName
+	: UnqualifiedName ( '::' nameBinding += NameBinding )+
+	;
+
+DotQualifiedName returns fmlCommon::QualifiedName
+	: UnqualifiedName ( '.' nameBinding += NameBinding )+
+	;
+
+UnqualifiedName returns fmlCommon::QualifiedName
+	: nameBinding += NameBinding
+	;
+
+NameBinding
+	: XLIA_ID
+	;
+
+
+enum VisibilityKind returns fmlCommon::VisibilityKind
+	: public   ='public'
+	| private  ='private'
+	| protected='protected'
+	| package  ='package'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Machine PropertyDefinition Rules
+////////////////////////////////////////////////////////////////////////////////
+
+enum DesignKind returns fmlInfra::DesignKind
+	: model     = 'model'
+	| prototype = 'prototype'
+	;
+
+enum DesignInstanceKind returns fmlInfra::DesignKind
+	: instance  = 'instance'
+	;
+
+
+System returns fmlInfra::System
+	: ( ( visibility=VisibilityKind )?
+		& ( timed?='timed' | input_enabled ?= 'input_enabled' )?
+		)
+		'system' ('<' ( 'moc:' )? ( 'and' | 'or' ) '>')?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		'{'
+		( // optional unnamed section for property full declaration / definition
+//			( 'port'
+//				( port+=PortImpl
+//				| '{' ( port+=PortImpl )+ '}'
+//				)
+//			| 'signal'
+//				( signal+=SignalImpl
+//				| '{' ( signal+=SignalImpl )+ '}'
+//				)
+//			| 'buffer'
+//				( buffer+=BufferImpl
+//				| '{' ( buffer+=BufferImpl )+ '}'
+//				)
+//			| channel+=Channel
+//			| 'type'
+//				( typedef+=TypeDefinitionImpl
+//				| '{' ( typedef+=TypeDefinitionImpl )+ '}'
+//				)
+//			| 'var'
+//				( property+=VariableImpl
+//				| '{' ( property+=VariableImpl )+ '}'
+//				)
+//			| ( 'val' | 'const' )
+//				( property+=VariableImpl
+//				| '{' ( property+=VariableImpl )+ '}'
+//				)
+//			| property+=Variable
+//			)*
+			( port+=Port
+			| signal+=Signal
+			| buffer+=Buffer
+			| channel+=Channel
+			| typedef+=TypeDefinition
+			| property+=Variable
+			)*
+		)
+		( '@property:'
+			( port+=Port
+			| signal+=Signal
+			| buffer+=Buffer
+			| channel+=Channel
+			| typedef+=TypeDefinition
+			| property+=Variable
+			)*
+		| '@public:'
+			( port+=PortPublic
+			| signal+=SignalPublic
+			| buffer+=BufferPublic
+			| channel+=ChannelPublic
+			| typedef+=TypeDefinition
+			| property+=VariablePublic
+			)*
+		| '@protected:'
+			( port+=PortProtected
+			| signal+=SignalProtected
+			| buffer+=BufferProtected
+			| channel+=ChannelProtected
+			| typedef+=TypeDefinition
+			| property+=VariableProtected
+			)*
+		| '@private:'
+			( port+=PortPrivate
+			| signal+=SignalPrivate
+			| buffer+=BufferPrivate
+			| channel+=ChannelPrivate
+			| typedef+=TypeDefinition
+			| property+=VariablePrivate
+			)*
+		)*
+
+		( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
+		  | '@procedure:' ( procedure+=Procedure )+
+		  )*
+		| ( routine+=Routine | procedure+=Procedure )+
+		)
+
+		( ( '@composite:' | '@machine:' )
+			( machine +=AnyMachineBlock
+			| instance+=InstanceMachine
+			)+
+		| '@model:'     ( machine +=AnyMachineBlock )*
+		| '@prototype:' ( machine +=AnyMachineBlock )*
+		| '@instance:'  ( instance+=InstanceMachine )*
+		)*
+
+		( '@behavior:'     ( behavior+=Behavior )+
+		| '@statemachine:' ( behavior+=Statemachine )+
+		)*
+
+		main=MoeBehavior
+		'}'
+	;
+
+
+AnyMachineBlock returns fmlInfra::Machine
+	: MachineBlock
+	| Statemachine
+	;
+
+
+InstanceMachine returns fmlInfra::InstanceMachine
+	: 'instance' ( 'machine' | 'statemachine' ) ?
+		'<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		/*(paramsSection = DeclareParams)?*/
+//		( ( '(' arg=MixTupleExpressionList ')' )? ';'
+		( ( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )?')' )? ';'
+		| '{'
+		 ( slot+=SlotProperty ';' )*  '}'
+		)
+	;
+
+
+SlotParameter returns fmlInfra::SlotProperty
+	: ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
+//	  | umlProperty=[uml::Property|ESIdentifier]
+	  ) ':' value=Expression
+	;
+
+SlotProperty returns fmlInfra::SlotProperty
+	: ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
+//	  | umlProperty=[uml::Property|ESIdentifier]
+	  ) '=' value=Expression
+	;
+
+
+
+MachineBlock returns fmlInfra::Machine
+	: ( ( visibility=VisibilityKind )?
+		& ( timed?='timed' | input_enabled ?= 'input_enabled' )?
+		& ( design=DesignKind )?
+		)
+		'machine'  ('<' ( 'moc:' )?  ( 'and' | 'or' ) '>')?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		'{'
+		( // optional unnamed section for property full declaration / definition
+			( port+=Port
+			| signal+=Signal
+			| buffer+=Buffer
+			| channel+=Channel
+			| typedef+=TypeDefinition
+			| property+=Variable
+			)*
+		)
+		( '@property:'
+			( port+=Port
+			| signal+=Signal
+			| buffer+=Buffer
+			| channel+=Channel
+			| typedef+=TypeDefinition
+			| property+=Variable
+			)*
+		| '@public:'
+			( port+=PortPublic
+			| signal+=SignalPublic
+			| buffer+=BufferPublic
+			| channel+=ChannelPublic
+			| typedef+=TypeDefinition
+			| property+=VariablePublic
+			)*
+		| '@protected:'
+			( port+=PortProtected
+			| signal+=SignalProtected
+			| buffer+=BufferProtected
+			| channel+=ChannelProtected
+			| typedef+=TypeDefinition
+			| property+=VariableProtected
+			)*
+		| '@private:'
+			( port+=PortPrivate
+			| signal+=SignalPrivate
+			| buffer+=BufferPrivate
+			| channel+=ChannelPrivate
+			| typedef+=TypeDefinition
+			| property+=VariablePrivate
+			)*
+		)*
+
+		( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
+		  | '@procedure:' ( procedure+=Procedure )+
+		  )*
+		| ( routine+=Routine | procedure+=Procedure )+
+		)
+
+		( ( '@composite:' | '@machine:' )
+			( machine +=AnyMachineBlock
+			| instance+=InstanceMachine
+			)+
+		| '@model:'     ( machine +=AnyMachineBlock )*
+		| '@prototype:' ( machine +=AnyMachineBlock )*
+		| '@instance:'  ( instance+=InstanceMachine )*
+		)*
+
+		( '@behavior:'     ( behavior+=Behavior )+
+		| '@statemachine:' ( behavior+=Statemachine )+
+		)*
+
+		main=MoeBehavior
+		'}'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Procedure View Rules
+////////////////////////////////////////////////////////////////////////////////
+
+Procedure returns fmlInfra::Procedure
+	: ( visibility=VisibilityKind )?
+		'procedure' ( '<' ( 'moc:' )?  ( 'and' | 'or' ) '>' )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+
+		( ( '(' ( parameter+=FunctionalParameter
+			( ',' parameter+=FunctionalParameter )* )? ')' )?
+		 	( '-->'
+	 			( parameter+=FormalParameter
+	 			| '('  parameter+=FormalParameter
+	 				( ',' parameter+=FormalParameter )* ')'
+	 			)
+		 	)?
+	 	)?
+		'{'
+		( '@parameter:'
+			( 'input'
+				( parameter+=ParameterInput
+				| '{' ( parameter+=ParameterInput )+ '}'
+				)
+			| 'inout'
+				( parameter+=ParameterInout
+				| '{' ( parameter+=ParameterInout )+ '}'
+				)
+
+			| 'output'
+				( parameter+=ParameterOutput
+				| '{' ( parameter+=ParameterOutput )+ '}'
+				)
+
+			| 'return'
+				( parameter+=ParameterReturn
+				| '{' ( parameter+=ParameterReturn )+ '}'
+				)
+			)*
+		| // optional unnamed section for property full declaration / definition
+			( port+=Port
+			| signal+=Signal
+			| buffer+=Buffer
+			| channel+=Channel
+			| typedef+=TypeDefinition
+			| property+=Variable
+			)*
+		)
+		( '@input:'
+			( parameter+=ParameterInput
+			| '{' ( parameter+=ParameterInput )+ '}'
+			)*
+		| '@inout:'
+			( parameter+=ParameterInout
+			| '{' ( parameter+=ParameterInout )+ '}'
+			)*
+		| '@output:'
+			( parameter+=ParameterOutput
+			| '{' ( parameter+=ParameterOutput )+ '}'
+			)*
+		| '@return:'
+			( parameter+=ParameterReturn
+			| '{' ( parameter+=ParameterReturn )+ '}'
+			)*
+		)*
+
+		( '@property:'
+			( port+=Port
+			| signal+=Signal
+			| buffer+=Buffer
+			| channel+=Channel
+			| typedef+=TypeDefinition
+			| property+=Variable
+			)*
+		| '@public:'
+			( port+=PortPublic
+			| signal+=SignalPublic
+			| buffer+=BufferPublic
+			| channel+=ChannelPublic
+			| typedef+=TypeDefinition
+			| property+=VariablePublic
+			)*
+		| '@protected:'
+			( port+=PortProtected
+			| signal+=SignalProtected
+			| buffer+=BufferProtected
+			| channel+=ChannelProtected
+			| typedef+=TypeDefinition
+			| property+=VariableProtected
+			)*
+		| '@private:'
+			( port+=PortPrivate
+			| signal+=SignalPrivate
+			| buffer+=BufferPrivate
+			| channel+=ChannelPrivate
+			| typedef+=TypeDefinition
+			| property+=VariablePrivate
+			)*
+		)*
+
+		( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
+		  | '@procedure:' ( procedure+=Procedure )+
+		  )*
+		| ( routine+=Routine | procedure+=Procedure )+
+		)
+
+		( ( region+=StatemachineRegion )+
+		| region+=StatemachineRegionLite
+		)?
+
+		( ( execution=ProcedureExecution )?
+//		& ( computation=ModelOfComputation )?
+//		& ( interaction=ModelOfInteraction )?
+		)
+		'}'
+	;
+
+
+ProcedureExecution returns fmlInfra::ModelOfExecution
+	: { fmlInfra::ModelOfExecution }
+		( '@moe:' )?
+		( ( '@schedule'  scheduleRoutine=moeRoutine )?
+		& ( '@run'  runRoutine=moeRoutine )?
+		)
+	;
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Behavior View Rules
+////////////////////////////////////////////////////////////////////////////////
+
+Behavior returns fmlInfra::Behavior
+	: Statemachine
+	;
+
+
+MoeBehavior returns fmlInfra::Behavior
+	: {fmlInfra::Behavior}
+		( '@local:'
+			( port+=PortPrivate
+			| signal+=SignalPrivate
+			| buffer+=BufferPrivate
+			| channel+=ChannelPrivate
+			| typedef+=TypeDefinition
+			| property+=VariablePrivate
+			)*
+		)?
+		( ( execution=ModelOfExecution )?
+//		& ( computation=ModelOfComputation )?
+		& ( interaction=ModelOfInteraction )?
+		)
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Statemachine Behavior View Rules
+////////////////////////////////////////////////////////////////////////////////
+
+Statemachine returns fmlStmchn::Statemachine
+	: { fmlStmchn::Statemachine }
+		( ( visibility=VisibilityKind )?
+		& ( timed?='timed' | input_enabled ?= 'input_enabled' )?
+		& ( design=DesignKind )?
+		)
+		'statemachine' ( '<' ( 'moc:' )? ( 'or' | 'and' ) '>' )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		'{'
+		( '@parameter:'
+			( 'input'
+				( parameter+=ParameterInput
+				| '{' ( parameter+=ParameterInput )+ '}'
+				)
+			| 'inout'
+				( parameter+=ParameterInout
+				| '{' ( parameter+=ParameterInout )+ '}'
+				)
+
+			| 'output'
+				( parameter+=ParameterOutput
+				| '{' ( parameter+=ParameterOutput )+ '}'
+				)
+
+			| 'return'
+				( parameter+=ParameterReturn
+				| '{' ( parameter+=ParameterReturn )+ '}'
+				)
+			)*
+		| // optional unnamed section for property full declaration / definition
+			( port+=Port
+			| signal+=Signal
+			| buffer+=Buffer
+			| channel+=Channel
+			| typedef+=TypeDefinition
+			| property+=Variable
+			)*
+		)
+		( '@input:'
+			( parameter+=ParameterInput
+			| '{' ( parameter+=ParameterInput )+ '}'
+			)*
+		| '@inout:'
+			( parameter+=ParameterInout
+			| '{' ( parameter+=ParameterInout )+ '}'
+			)*
+		| '@output:'
+			( parameter+=ParameterOutput
+			| '{' ( parameter+=ParameterOutput )+ '}'
+			)*
+		| '@return:'
+			( parameter+=ParameterReturn
+			| '{' ( parameter+=ParameterReturn )+ '}'
+			)*
+		)*
+
+		( '@property:'
+			( port+=Port
+			| signal+=Signal
+			| buffer+=Buffer
+			| channel+=Channel
+			| typedef+=TypeDefinition
+			| property+=Variable
+			)*
+		| '@public:'
+			( port+=PortPublic
+			| signal+=SignalPublic
+			| buffer+=BufferPublic
+			| channel+=ChannelPublic
+			| typedef+=TypeDefinition
+			| property+=VariablePublic
+			)*
+		| '@protected:'
+			( port+=PortProtected
+			| signal+=SignalProtected
+			| buffer+=BufferProtected
+			| channel+=ChannelProtected
+			| typedef+=TypeDefinition
+			| property+=VariableProtected
+			)*
+		| '@private:'
+			( port+=PortPrivate
+			| signal+=SignalPrivate
+			| buffer+=BufferPrivate
+			| channel+=ChannelPrivate
+			| typedef+=TypeDefinition
+			| property+=VariablePrivate
+			)*
+		)*
+
+		( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
+		  | '@procedure:' ( procedure+=Procedure )+
+		  )*
+		| ( routine+=Routine | procedure+=Procedure )+
+		)
+
+		( ( region+=StatemachineRegion )+
+		| region+=StatemachineRegionLite
+		)
+
+		( ( execution=ModelOfExecution )?
+//		& ( computation=ModelOfComputation )?
+		& ( interaction=ModelOfInteraction )?
+		)
+		'}'
+	;
+
+
+StatemachineRegion returns fmlStmchn::Region
+	: {fmlStmchn::Region}
+		( ( '@region:'  |  '@statemachine:' )
+		| ( '@region<'  |  '@statemachine<' )
+			name=ESIdentifier ( unrestrictedName=UnrestrictedName )? '>:'
+		)
+
+		( vertex+=State
+		| vertex+=Pseudostate
+		)+
+	;
+
+StatemachineRegionLite returns fmlStmchn::Region
+	: ( vertex+=State | vertex+=Pseudostate )+
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// State Rules
+////////////////////////////////////////////////////////////////////////////////
+
+State returns fmlStmchn::State
+	: CompositeState
+	| StartState
+	| SimpleState
+	| FinalState
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// CompositeState Rules
+////////////////////////////////////////////////////////////////////////////////
+
+CompositeState returns fmlStmchn::State
+	: { fmlStmchn::State }
+		composite?='state' '<' ( 'moc:' )? ( 'or' | orthogonal?='and' ) '>'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '{'
+			( ( region+=StatemachineRegion
+			  | '@moe:' ( moe+=moeCompositeStateRoutines )*
+			  | '@transition:' ( transition+=Transition  )*
+			  )+
+			| ( region+=StatemachineRegionLite
+				( transition+=Transition
+				| moe+=moeCompositeStateRoutines
+				)*
+			  )
+			)
+		  '}'
+		| ';'
+		)
+	;
+
+moeCompositeStateRoutines returns fmlInfra::Routine
+	: { fmlInfra::Routine }
+		name=( '@init' | '@final' | '@enable' | '@disable'
+			| '@concurrency' | '@schedule' | '@irun' |'@run'
+		)
+		bodyBlock=BlockStatement
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// SimpleState Rules
+////////////////////////////////////////////////////////////////////////////////
+
+SimpleState returns fmlStmchn::State
+	: { fmlStmchn::State }
+		simple?='state' ( '<' ( 'moc:' )? 'simple' '>' )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '{'
+			( transition+=Transition
+			| moe+=moeSimpleStateRoutines
+			)*
+		  '}'
+		| ';'
+		)
+	;
+
+moeSimpleStateRoutines returns fmlInfra::Routine
+	: { fmlInfra::Routine }
+		name=( '@enable' | '@disable' | '@irun' /*| '@run'*/ )
+		bodyBlock=BlockStatement
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// StartState Rules
+////////////////////////////////////////////////////////////////////////////////
+
+StartState returns fmlStmchn::StartState
+	: { fmlStmchn::StartState }
+		( simple?='state' '<' ( 'moc:' )? 'start' '>' name=ESIdentifier
+		| simple?='#start'
+		)
+		( unrestrictedName=UnrestrictedName )?
+		( '{'
+			( transition+=Transition
+			| moe+=moeStartStateRoutines
+			)*
+		  '}'
+		| ';'
+		)
+	;
+
+moeStartStateRoutines returns fmlInfra::Routine
+	: { fmlInfra::Routine }
+		name=( '@init' | '@enable' | '@disable' | '@irun' /*| '@run'*/ )
+		bodyBlock=BlockStatement
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// FinalState Rules
+////////////////////////////////////////////////////////////////////////////////
+
+FinalState returns fmlStmchn::FinalState
+	: { fmlStmchn::FinalState }
+		( simple?='state' '<' ( 'moc:' )? 'final' '>' name=ESIdentifier
+		| simple?='#final'
+		)
+		( unrestrictedName=UnrestrictedName )?
+		( '{'
+			( moe+=moeFinalStateRoutines )*
+		  '}'
+		| ';'
+		)
+	;
+
+moeFinalStateRoutines returns fmlInfra::Routine
+	: { fmlInfra::Routine }
+		name=( '@enable' | '@final' /*| '@run'*/ )
+		bodyBlock=BlockStatement
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Pseudostate Rules
+////////////////////////////////////////////////////////////////////////////////
+
+Pseudostate returns fmlStmchn::Pseudostate
+	: PseudostateInitial
+	| EndingPseudostate
+	| OtherPseudostate
+	;
+	
+OtherPseudostate returns fmlStmchn::Pseudostate
+	: { fmlStmchn::Pseudostate }
+		( 'state' | 'pseudostate' ) '<' ( 'moc:' )? kind=PseudostateKind '>'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+
+		( '{'  ( transition+=Transition )*  '}'
+		| ';'
+		)
+
+//	| PseudostateInitial
+//	| PseudostateTerminal
+//	| PseudostateReturn
+//	| PseudostateJunction
+//	| PseudostateChoice
+//	| PseudostateFork
+//	| PseudostateJoin
+//	| PseudostateDeepHistory
+//	| PseudostateShallowHistory
+	;
+
+
+enum PseudostateKind returns fmlStmchn::PseudostateKind
+	: junction='junction'
+	| choice  ='choice'
+
+	| junction='entryPoint'
+	| choice  ='exitPoint'
+
+//	| initial ='initial'
+//		
+//	| terminate='terminal'
+//	| return   ='return'
+
+	| fork='fork'
+	| join='join'
+
+	| deepHistory   ='dhistory'
+	| shallowHistory='shistory'
+	;
+
+
+PseudostateInitial returns fmlStmchn::Pseudostate
+	: { fmlStmchn::Pseudostate }
+		( ( 'state' | 'pseudostate' )
+			'<' ( 'moc:' )? kind=PseudostateInitialKind '>'
+			name=(ESIdentifier | '#initial' | '#init' )
+		| name=( '#initial' | '#init' )
+		)
+		( unrestrictedName=UnrestrictedName )?
+
+		( '{'  ( transition+=Transition )*  '}' | ';' )
+	;
+
+enum PseudostateInitialKind returns fmlStmchn::PseudostateKind
+	: initial ='initial'
+	;
+
+EndingPseudostate returns fmlStmchn::Pseudostate
+	: { fmlStmchn::Pseudostate }
+		( 'state' | 'pseudostate' ) '<' ( 'moc:' )? kind=EndingPseudostateKind '>'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+
+		( '{'
+			( moe+=moeFinalStateRoutines )*
+		  '}'
+		| ';'
+		)
+	;
+	
+enum EndingPseudostateKind returns fmlStmchn::PseudostateKind
+	: terminate='terminal'
+	| return='return'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Section Model Of Computation Rules
+////////////////////////////////////////////////////////////////////////////////
+
+ModelOfComputation returns fmlInfra::ModelOfComputation
+	: { fmlInfra::ModelOfComputation }
+	;
+
+////////////////////////////////////////////////////////////////////////////////
+// Section Model Of Execution Rules
+////////////////////////////////////////////////////////////////////////////////
+
+ModelOfExecution returns fmlInfra::ModelOfExecution
+	: { fmlInfra::ModelOfExecution }
+		'@moe:'
+		( routine+=Routine )*
+		( ( '@init'    initRoutine=moeRoutine )?
+		& ( '@final'   finalRoutine=moeRoutine )?
+
+		& ( '@enable'  enableRoutine=moeRoutine )?
+		& ( '@disable' disableRoutine=moeRoutine )?
+
+		& ( '@concurrency' concurrencyRoutine=moeRoutine )?
+		& ( '@schedule'    scheduleRoutine=moeRoutine )?
+
+		& ( '@irun' irunRoutine=moeRoutine )?
+		& ( '@run'  runRoutine=moeRoutine )?
+		)
+		( routine+=Routine )*
+	;
+
+
+moeRoutine returns fmlInfra::Routine
+	: { fmlInfra::Routine }
+		( '(' ( domain=FunctionalParameterSet )? ')' )?
+		('->'
+			( '(' codomain=FunctionalParameterSet ')'
+			| codomain=FunctionalParameterSet
+			)
+		)?
+		bodyBlock=BlockStatement
+	;
+
+Routine returns fmlInfra::Routine
+	: ( visibility=VisibilityKind )?  ( 'macro' )? 'routine'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '(' ( domain=FunctionalParameterSet )? ')' )?
+		( '-->'
+			( '(' codomain=FunctionalParameterSet ')'
+			| codomain=FormalParameterSet
+			)
+		)?
+		bodyBlock=BlockStatement
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Section Model Of Interaction / Communication Rules
+////////////////////////////////////////////////////////////////////////////////
+
+ModelOfInteraction returns fmlInfra::ModelOfInteraction
+	: { fmlInfra::ModelOfInteraction }
+		'@com:'
+		( routes+=Route
+		| connections+=Connection
+		)*
+	;
+
+
+Route returns fmlInfra::Route
+	: { fmlInfra::Route }
+		'route' '<' protocol=ComRouteProtocol '>'
+		( name=ESIdentifier ( unrestrictedName=UnrestrictedName )? )?
+		'['
+		( '*'
+		| signals+=[fmlInfra::Signal|ESUfid]
+			( ',' signals+=[fmlInfra::Signal|ESUfid] )*
+		)
+		']' ';'
+	;
+
+ComRouteProtocol returns fmlInfra::ComProtocol
+	: protocol=ComProtocolKind
+
+	| protocol=BufferProtocolKind
+		( ':'
+			( inner_buffer=BufferContainerType
+			| ref_buffer=[fmlInfra::Buffer|ESUfid]
+			)
+		| '<'
+			( inner_buffer=BufferContainerType
+			| ref_buffer=[fmlInfra::Buffer|ESUfid]
+			) '>'
+		)?
+
+	| inner_buffer=BufferContainerType
+	| ref_buffer=[fmlInfra::Buffer|ESUfid]
+	;
+
+
+Connection returns fmlInfra::Connection
+	: 'connect' '<' protocol=ComProtocol '>'
+		( name=ESIdentifier ( unrestrictedName=UnrestrictedName )? )?
+		'{' (comPoints+=ComPoint)+ '}'
+	;
+
+ComProtocol returns fmlInfra::ComProtocol
+	: protocol=ComEnvRdvProtocolKind
+
+	| protocol=ComMultiRdvProtocolKind ( '<' cast=ComCastKing '>')?
+
+	| protocol=BufferProtocolKind
+		( ':'
+			( inner_buffer=BufferContainerType
+			| ref_buffer=[fmlInfra::Buffer|ESUfid]
+			)
+		| '<'
+			( inner_buffer=BufferContainerType
+			| ref_buffer=[fmlInfra::Buffer|ESUfid]
+			) '>'
+		)?
+
+	| inner_buffer=BufferContainerType
+	| ref_buffer=[fmlInfra::Buffer|ESUfid]
+
+	| cast=ComCastKing
+	;
+
+
+enum ComProtocolKind returns fmlInfra::ComProtocolKind
+	: env       = 'env'
+	| rdv       = 'rdv'
+	| multi_rdv = 'multi_rdv'
+	;
+
+enum ComEnvRdvProtocolKind returns fmlInfra::ComProtocolKind
+	: env = 'env'
+	| rdv = 'rdv'
+	;
+
+enum ComMultiRdvProtocolKind returns fmlInfra::ComProtocolKind
+	: multi_rdv = 'multi_rdv'
+	;
+
+enum BufferProtocolKind returns fmlInfra::ComProtocolKind
+	: buffer = 'buffer'
+	;
+
+
+enum ComCastKing returns fmlInfra::ComCastKind
+	: unicast   = 'unicast'
+	| anycast   = 'anycast'
+	| multicast = 'multicast'
+	| broadcast = 'broadcast'
+	;
+
+
+ComPoint returns fmlInfra::ComPoint
+	: { fmlInfra::ComPoint }
+		direction=ChannelDirection ( '<' protocol=ComPointProtocol '>' )?
+
+//		( point=ValuePureNamedPortExpression ';'
+		( point=ComElement ';'
+		| '{' points+=ComElement '}'
+		)
+	;
+
+
+ComPointProtocol returns fmlInfra::ComProtocol
+	: protocol=BufferProtocolKind
+		( ':'
+			( inner_buffer=BufferContainerType
+			| ref_buffer=[fmlInfra::Buffer|ESUfid]
+			)
+		| '<'
+			( inner_buffer=BufferContainerType
+			| ref_buffer=[fmlInfra::Buffer|ESUfid]
+			) '>'
+		)?
+
+	| inner_buffer=BufferContainerType
+	| ref_buffer=[fmlInfra::Buffer|ESUfid]
+	;
+
+
+ComElement returns fmlExpr::Expression
+	: LiteralPureReferenceElement
+		// ( '.' | '->' ) element
+		( { fmlExpr::ValueElementSpecification.target=current }
+			kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
+			element=[fmlCommon::NamedElement|ESIdentifier]
+		)?
+
+	| { fmlExpr::ValueElementSpecification }
+		target=LiteralReferenceMachineContext
+		// ( '.' | '->' ) element
+		kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
+			element=[fmlCommon::NamedElement|ESIdentifier]
+	;
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Sections Declarations Data Rules
+////////////////////////////////////////////////////////////////////////////////
+
+//TypeDefinition returns fmlType::DataType
+//	: typedef?='type' name=ESIdentifier
+//		( support=DataTypeReference ';'
+//		| support=StructuredDataType
+//		)
+//	;
+
+TypeDefinition returns fmlType::DataType
+	: EnumerationTypeDefinition
+	| StructureTypeDefinition
+	| UnionTypeDefinition
+	| ChoiceTypeDefinition
+
+	| IntervalTypeDefinition
+	| CollectionTypeDefinition
+	| OtherDataTypeDefinition
+	;
+
+
+//TypeDefinitionImpl returns fmlType::DataTypeReference
+//	: name=ESIdentifier
+//		( support=DataTypeReference ';'
+//		| support=StructuredDataType
+//		)
+//	;
+
+TypeDefinitionImpl returns fmlType::DataType
+	: EnumerationTypeDefinitionImpl
+	| StructureTypeDefinitionImpl
+	| UnionTypeDefinitionImpl
+	| ChoiceTypeDefinitionImpl
+
+	| IntervalTypeDefinitionImpl
+	| CollectionTypeDefinitionImpl
+
+	| OtherDataTypeDefinitionImpl
+	;
+
+
+DataTypeMultiplicity returns fmlExpr::Expression
+	: LiteralIntegerExpression
+	| LiteralReferenceElement
+	;
+
+DataTypeReference returns fmlType::DataType
+	: SimpleDataType
+		( {fmlType::DataTypeReference.support=current}
+			'[' multiplicity=DataTypeMultiplicity ']'
+		)?
+
+	| {fmlType::DataTypeReference}
+		typeref=[fmlType::DataType|ESUfid]
+		( '[' multiplicity=DataTypeMultiplicity ']' )?
+	;
+
+OtherDataTypeDefinition returns fmlType::DataTypeReference
+	: {fmlType::DataTypeReference}
+		( visibility=VisibilityKind )? 'type'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( support=PrimitiveType
+			( '[' multiplicity=DataTypeMultiplicity ']' )?
+		| typeref=[fmlType::DataType|ESUfid]
+			( '[' multiplicity=DataTypeMultiplicity ']' )?
+		)  typedef?=';'
+	;
+
+OtherDataTypeDefinitionImpl returns fmlType::DataTypeReference
+	: {fmlType::DataTypeReference}
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( support=PrimitiveType
+			( '[' multiplicity=DataTypeMultiplicity ']' )?
+		| typeref=[fmlType::DataType|ESUfid]
+			( '[' multiplicity=DataTypeMultiplicity ']' )?
+		)  typedef?=';'
+	;
+
+DataType returns fmlType::DataType
+	: DataTypeReference
+	| StructuredDataType
+	;
+
+SimpleDataType returns fmlType::DataType
+	: PrimitiveType
+	| IntervalType
+	| CollectionType
+	;
+
+StructuredDataType returns fmlType::DataType
+	: EnumerationType
+	| StructureType
+	| UnionType
+	| ChoiceType
+	;
+
+
+//PrimitiveType returns fmlType::PrimitiveType
+//	: kind=NumberPrimitiveTypeKind ( '<' ( 'bit:' )? bitSize = EInt '>' )?
+//	| kind=OtherPrimitiveKind
+//	;
+//
+//enum OtherPrimitiveKind returns fmlType::PrimitiveTypeKind
+//	: BOOLEAN   = 'boolean'
+//	| BOOLEAN   = 'bool'
+//	| CHAR      = 'char'
+//	| STRING    = 'string'
+//	| BUFFER    = 'buffer'
+//	| MESSAGE   = 'message'
+//	| PORT      = 'port'
+//	| MACHINE   = 'machine'
+//	;
+//
+//
+//enum NumberPrimitiveTypeKind returns fmlType::PrimitiveTypeKind
+//	: INTEGER   = 'integer'
+//	| RATIONAL  = 'rational'
+//	| FLOAT     = 'float'
+//	| DOUBLE    = 'double'
+//	| REAL      = 'real'
+//
+//	| TIME      = 'time'
+//
+//	| UINTEGER  = 'uinteger'
+//	| URATIONAL = 'urational'
+//	| UFLOAT    = 'ufloat'
+//	| UDOUBLE   = 'udouble'
+//	| UREAL     = 'ureal'
+//
+//	| INT       = 'int'
+//	| RAT       = 'rat'
+//
+//	| UINT      = 'uint'
+//	| URAT      = 'urat'
+//	;
+
+PrimitiveType returns fmlType::PrimitiveType
+	: PrimitiveNumberType
+	| OtherPrimitiveType
+	;
+
+
+PrimitiveNumberType returns fmlType::PrimitiveNumberType
+	: PrimitiveIntegerType
+	| PrimitiveRationalType
+	| PrimitiveFloatType
+	| PrimitiveRealType
+	| PrimitiveTimeType
+	;
+
+enum PrimitiveNumberSign returns fmlType::PrimitiveNumberSign
+	: positive='+'
+	| positive_strict='++'
+	| negative='-'
+	| negative_strict='--'
+	;
+
+
+PrimitiveIntegerType returns fmlType::PrimitiveIntegerType
+	: { fmlType::PrimitiveIntegerType }
+		( sign=PrimitiveNumberSign )?
+		( 'integer'
+		| 'uinteger'
+		| 'int'
+		| 'uint'
+		)
+		( ':' size = EInt
+			| '<' ( 'size:' )? size = EInt '>'
+		)?
+	;
+
+PrimitiveRationalType returns fmlType::PrimitiveRationalType
+	: { fmlType::PrimitiveRationalType }
+		( sign=PrimitiveNumberSign )?
+		( 'rational'
+		| 'urational'
+		| 'rat'
+		| 'urat'
+		)
+		( ':' size = EInt
+			| '<' ( 'size:' )? size = EInt '>'
+		)?
+	;
+
+PrimitiveFloatType returns fmlType::PrimitiveFloatType
+	: { fmlType::PrimitiveFloatType }
+		( sign=PrimitiveNumberSign )?
+		( 'float'
+		| 'ufloat'
+		| 'double'
+		| 'udouble'
+		)
+		( ':' size = EInt
+			| '<' ( 'size:' )? size = EInt '>'
+		)?
+	;
+
+PrimitiveRealType returns fmlType::PrimitiveRealType
+	: { fmlType::PrimitiveRealType }
+		( sign=PrimitiveNumberSign )?
+		( 'real'
+		| 'ureal'
+		)
+		( ':' size = EInt
+			| '<' ( 'size:' )? size = EInt '>'
+		)?
+	;
+
+PrimitiveTimeType returns fmlType::PrimitiveTimeType
+	: { fmlType::PrimitiveTimeType }
+		'time'
+		( '<' support=PrimitiveTimeNumberType '>'
+		| support=PrimitiveTimeNumberType
+		)?
+
+	| { fmlType::PrimitiveTimeType }
+		clock?='clock'
+		( '<' support=PrimitiveTimeNumberType '>'
+		| support=PrimitiveTimeNumberType
+		)?
+	;
+
+PrimitiveTimeNumberType returns fmlType::PrimitiveNumberType
+	: PrimitiveIntegerType
+	| PrimitiveRationalType
+	| PrimitiveFloatType
+	| PrimitiveRealType
+	;
+
+
+OtherPrimitiveType returns fmlType::PrimitiveType
+	: PrimitiveBooleanType
+	| PrimitiveCharacterType
+	| PrimitiveStringType
+	| PrimitiveInstanceType
+	;
+
+PrimitiveBooleanType returns fmlType::PrimitiveBooleanType
+	: { fmlType::PrimitiveBooleanType }
+		( 'boolean'| 'bool' )
+	;
+
+PrimitiveCharacterType returns fmlType::PrimitiveCharacterType
+	: { fmlType::PrimitiveCharacterType } 'char'
+	;
+
+PrimitiveStringType returns fmlType::PrimitiveStringType
+	: { fmlType::PrimitiveStringType }
+		'string'
+		( ':' size = EInt
+		| '<' ( 'size:' )? size = EInt '>'
+		)?
+	;
+
+
+enum PrimitiveInstanceKind returns fmlType::PrimitiveInstanceKind
+	: buffer='buffer'
+	| message='message'
+	| port='port'
+	| signal='signal'
+	| machine='machine'
+	| vertex='vertex'
+	;
+
+PrimitiveInstanceType returns fmlType::PrimitiveInstanceType
+	: { fmlType::PrimitiveInstanceType }
+		expected=PrimitiveInstanceKind
+		( '<' model=[fmlCommon::NamedElement|ESIdentifier] '>' )?
+	;
+
+
+IntervalType returns fmlType::IntervalType
+	: {fmlType::IntervalType}
+		'interval'
+		'<'
+			support=PrimitiveNumberType
+			( lopen?=']' | '[' )
+			infimum=Expression ',' supremum=Expression
+			( ']' |  ropen?='[' )
+		'>'
+	;
+
+IntervalTypeDefinition returns fmlType::IntervalType
+	: {fmlType::IntervalType}
+		( visibility=VisibilityKind )? 'type'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		'interval'
+		'<'
+			support=PrimitiveNumberType
+			( lopen?=']' | '[' )
+			infimum=Expression ',' supremum=Expression
+			( ']' |  ropen?='[' )
+		'>' ';'
+	;
+
+IntervalTypeDefinitionImpl returns fmlType::IntervalType
+	: {fmlType::IntervalType}
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		'interval'
+		'<'
+			support=PrimitiveNumberType
+			( lopen?=']' | '[' )
+			infimum=Expression ',' supremum=Expression
+			( ']' |  ropen?='[' )
+		'>' ';'
+	;
+
+// TODO
+// mettre à jour la grammaire par rapport au noyau, i.e.
+// CollectionKind | CollectionKind< size > | CollectionKind< type , size >
+CollectionType returns fmlType::CollectionType
+	: {fmlType::CollectionType}
+		container = CollectionKind
+		'<'
+			support=DataType
+			( ',' ( size = EInt | unbounded?='*' ) )?
+		'>'
+	;
+
+CollectionTypeDefinition returns fmlType::CollectionType
+	: {fmlType::CollectionType}
+		( visibility=VisibilityKind )? 'type'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		container = CollectionKind
+		'<'
+			support=DataType
+			( ',' ( size = EInt | unbounded?='*' ) )?
+		'>' ';'
+	;
+
+CollectionTypeDefinitionImpl returns fmlType::CollectionType
+	: {fmlType::CollectionType}
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		container = CollectionKind
+		'<'
+			support=DataType
+			( ',' ( size = EInt | unbounded?='*' ) )?
+		'>' ';'
+	;
+
+
+enum CollectionKind returns fmlType::CollectionKind
+	: vector = 'vector'
+	| rvector = 'rvector'
+	| list='list'
+	| set = 'set'
+	| bag = 'bag'
+	| fifo = 'fifo'
+	| lifo = 'lifo'
+	;
+
+
+EnumerationType returns fmlType::EnumerationType
+	: {fmlType::EnumerationType}
+		'enum'  '{'
+			literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
+		'}'
+	;
+
+EnumerationTypeDefinition returns fmlType::EnumerationType
+	: {fmlType::EnumerationType}
+		( visibility=VisibilityKind )? 'type'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		typedef?='enum'
+		'{'
+			literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
+		'}'
+	;
+
+EnumerationTypeDefinitionImpl returns fmlType::EnumerationType
+	: {fmlType::EnumerationType}
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		typedef?='enum'
+		'{'
+			literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
+		'}'
+	;
+
+EnumerationLiteral returns fmlType::EnumerationLiteral
+	: name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' value=LiteralTerminalExpression )?
+	;
+
+
+StructureType returns fmlType::StructureType
+	: {fmlType::StructureType}
+		'struct'
+		'{'
+			( property+=Variable )+
+		'}'
+	;
+
+StructureTypeDefinition returns fmlType::StructureType
+	: {fmlType::StructureType}
+		( visibility=VisibilityKind )? 'type'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		typedef?='struct'
+		'{'
+			( property+=Variable )+
+		'}'
+	;
+
+StructureTypeDefinitionImpl returns fmlType::StructureType
+	: {fmlType::StructureType}
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		typedef?='struct'
+		'{'
+			( property+=Variable )+
+		'}'
+	;
+
+
+UnionType returns fmlType::UnionType
+	: {fmlType::UnionType}
+		'union'
+		'{'
+			( property+=Variable )+
+		'}'
+	;
+
+UnionTypeDefinition returns fmlType::UnionType
+	: {fmlType::UnionType}
+		( visibility=VisibilityKind )? 'type'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		typedef?='union'
+		'{'
+			( property+=Variable )+
+		'}'
+	;
+
+UnionTypeDefinitionImpl returns fmlType::UnionType
+	: {fmlType::UnionType}
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		typedef?='union'
+		'{'
+			( property+=Variable )+
+		'}'
+	;
+
+
+ChoiceType returns fmlType::ChoiceType
+	: {fmlType::ChoiceType}
+		'choice'
+		'{'
+			( property+=Variable )+
+		'}'
+	;
+
+ChoiceTypeDefinition returns fmlType::ChoiceType
+	: {fmlType::ChoiceType}
+		( visibility=VisibilityKind )? 'type'
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		typedef?='choice'
+		'{'
+			( property+=Variable )+
+		'}'
+	;
+
+ChoiceTypeDefinitionImpl returns fmlType::ChoiceType
+	: {fmlType::ChoiceType}
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		typedef?='choice'
+		'{'
+			( property+=Variable )+
+		'}'
+	;
+
+
+/*
+enum TypeSpecifyerKind returns TypeSpecifyerKind
+	: ALIAS = 'ALIAS'
+	| BOOLEAN = 'BOOLEAN'
+	| CHAR = 'CHAR'
+	| INT = 'INT'
+	| RATIONAL = 'RATIONAL'
+	| URATIONAL = 'URATIONAL'
+	| FLOAT = 'FLOAT'
+	| UFLOAT = 'UFLOAT'
+	| DOUBLE = 'DOUBLE'
+	| UDOUBLE = 'UDOUBLE'
+	| REAL = 'REAL'
+	| UREAL = 'UREAL'
+	| CTIME = 'CTIME'
+	| DTIME = 'DTIME'
+	| STRING = 'STRING'
+	| IDENTIFIER = 'IDENTIFIER'
+	| UFI = 'UFI'
+	| ARRAY = 'ARRAY'
+	| VECTOR = 'VECTOR'
+	| LIST = 'LIST'
+	| FIFO = 'FIFO'
+	| LIFO = 'LIFO'
+	| MULTISET = 'MULTISET'
+	| SET = 'SET'
+	| INTERVAL = 'INTERVAL'
+	| ENUM = 'ENUM'
+	| STRUCTURE = 'STRUCTURE'
+	| BUFFER = 'BUFFER'
+	| MESSAGE = 'MESSAGE'
+	| PORT = 'PORT'
+	| CONNECTION = 'CONNECTION'
+	| OPERATOR = 'OPERATOR'
+	| MACHINE = 'MACHINE'
+	| LAMBDA = 'LAMBDA'
+	| UNIVERSAL = 'UNIVERSAL'
+	;
+*/
+
+////////////////////////////////////////////////////////////////////////////////
+// Variable Rules
+////////////////////////////////////////////////////////////////////////////////
+
+Modifier returns fmlInfra::Modifier
+	: {fmlInfra::Modifier}
+	( ( static?='static' )?
+	& ( final ?='final'  )?
+
+	& ( reference?='reference' )?
+	& ( volatile ?='volatile'  )?
+	& ( transient?='transient' )?
+	)
+	;
+
+
+Variable returns fmlInfra::Variable
+	: ( ( visibility=VisibilityKind )? & ( modifier=Modifier )? )
+		( 'var' | const?='val'
+		| ( const?='const' | const?='final' ) ( macro?='macro' )? ( 'var' )?
+		| macro?='macro' ( 'var' | const?='val' )?
+		)
+	 	type=DataType
+	 	name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?
+		( ( '{' onWriteAction=OnWriteRoutine  '}' )
+		| ';'
+		)
+	;
+
+VariableImpl returns fmlInfra::Variable
+	: ( ( const?='const' | const?='final' )? & ( macro?='macro' )? )
+		type=DataType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?
+		( ( '{' onWriteAction=OnWriteRoutine  '}' )
+		| ';'
+		)
+	;
+
+OnWriteRoutine returns fmlInfra::Routine
+	: { fmlInfra::Routine }
+		'@on_write'  
+		( '(' parameter+=VariableRoutineParameter ')' )?
+		bodyBlock=BlockStatement
+	;
+
+VariableRoutineParameter returns fmlInfra::Parameter
+	: ( type=DataType )? 
+		name=ESIdentifier
+		( '=' defaultValue=Expression )?
+	;
+
+
+
+enum PublicVariableVisibilityKind returns fmlCommon::VisibilityKind
+	: public ='var'
+//	| public ='val'
+//	| public ='const'
+	;
+
+VariablePublic returns fmlInfra::Variable
+	: ( modifier=Modifier )?
+		( ( const?='const' | const?='final' )?
+		& ( macro?='macro' )?
+		)?
+		visibility=PublicVariableVisibilityKind
+	 	type=DataType
+	 	name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?
+		( ( '{' onWriteAction=OnWriteRoutine  '}' )
+		| ';'
+		)
+	;
+
+enum ProtectedVariableVisibilityKind returns fmlCommon::VisibilityKind
+	: protected ='var'
+//	| protected ='val'
+//	| protected ='const'
+	;
+
+VariableProtected returns fmlInfra::Variable
+	: ( modifier=Modifier )?
+		( ( const?='const' | const?='final' )?
+		& ( macro?='macro' )?
+		)?
+		visibility=ProtectedVariableVisibilityKind
+	 	type=DataType
+	 	name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?
+		( ( '{' onWriteAction=OnWriteRoutine  '}' )
+		| ';'
+		)
+	;
+
+enum PrivateVariableVisibilityKind returns fmlCommon::VisibilityKind
+	: private ='var'
+//	| private ='val'
+//	| private ='const'
+	;
+
+VariablePrivate returns fmlInfra::Variable
+	: ( modifier=Modifier )?
+		( ( const?='const' | const?='final' )?
+		& ( macro?='macro' )?
+		)?
+		visibility=PrivateVariableVisibilityKind
+	 	type=DataType
+	 	name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?
+		( ( '{' onWriteAction=OnWriteRoutine  '}' )
+		| ';'
+		)
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Functional ParameterSet Rules
+////////////////////////////////////////////////////////////////////////////////
+
+enum ParameterDirectionKind returns fmlInfra::ParameterDirectionKind
+	: in     = 'in'
+	| inout  = 'inout'
+	| out    = 'out'
+	| return = 'return'
+	;
+
+FunctionalParameterSet returns fmlInfra::ParameterSet
+	: {fmlInfra::ParameterSet}
+		parameter+=FunctionalParameter
+		( ',' parameter+=FunctionalParameter )*
+	;
+
+FunctionalParameter returns fmlInfra::Parameter
+	: {fmlInfra::Parameter}
+		( direction=ParameterDirectionKind )?  type=DataType
+	 	name=ESIdentifier
+		( '=' defaultValue=Expression )?
+	;
+
+
+FormalParameterSet returns fmlInfra::ParameterSet
+	: {fmlInfra::ParameterSet}
+		parameter+=FormalParameter
+		( ',' parameter+=FormalParameter )*
+	;
+
+FormalParameter returns fmlInfra::Parameter
+	: {fmlInfra::Parameter}
+		( direction=ParameterDirectionKind )?  type=DataType
+	 	( name=ESIdentifier )?
+		( '=' defaultValue=Expression )?
+	;
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Block ParameterSet Rules
+////////////////////////////////////////////////////////////////////////////////
+
+enum BlockParameterDirectionKind returns fmlInfra::ParameterDirectionKind
+	: in     = 'input'
+	| inout  = 'inout'
+	| out    = 'output'
+	| return = 'return'
+	;
+
+BlockParameterSet returns fmlInfra::ParameterSet
+	: {fmlInfra::ParameterSet}
+		( 'input'
+			( parameter+=ParameterInput
+			| '{' ( parameter+=ParameterInput )+ '}'
+			)
+		| 'inout'
+			( parameter+=ParameterInout
+			| '{' ( parameter+=ParameterInout )+ '}'
+			)
+
+		| 'output'
+			( parameter+=ParameterOutput
+			| '{' ( parameter+=ParameterOutput )+ '}'
+			)
+
+		| 'return'
+			( parameter+=ParameterReturn
+			| '{' ( parameter+=ParameterReturn )+ '}'
+			)
+		)*
+	;
+
+enum ParameterInputDirectionKind returns fmlInfra::ParameterDirectionKind
+	: in = 'var'
+	;
+
+ParameterInput returns fmlInfra::Parameter
+	: direction=ParameterInputDirectionKind  type=DataType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?  ';'
+	;
+
+
+enum ParameterInoutDirectionKind returns fmlInfra::ParameterDirectionKind
+	: inout = 'var'
+	;
+
+ParameterInout returns fmlInfra::Parameter
+	: direction=ParameterInoutDirectionKind  type=DataType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?  ';'
+	;
+
+
+enum ParameterOutputDirectionKind returns fmlInfra::ParameterDirectionKind
+	: out = 'var'
+	;
+
+ParameterOutput returns fmlInfra::Parameter
+	: direction=ParameterOutputDirectionKind  type=DataType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?  ';'
+	;
+
+
+enum ParameterReturnDirectionKind returns fmlInfra::ParameterDirectionKind
+	: return = 'var'
+	;
+
+ParameterReturn returns fmlInfra::Parameter
+	: direction=ParameterReturnDirectionKind  type=DataType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?  ';'
+	;
+
+
+ParameterDeclaration returns fmlInfra::Parameter
+	: {fmlInfra::Parameter}
+		direction=BlockParameterDirectionKind  type=DataType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '=' defaultValue=Expression )?  ';'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Buffer Rules
+////////////////////////////////////////////////////////////////////////////////
+
+BufferContainerType returns fmlType::CollectionType
+	: {fmlType::CollectionType}
+		container = BufferContainerKind
+		( '<' ( size = EInt | unbounded?='*' )? '>' )?
+	;
+
+enum BufferContainerKind returns fmlType::CollectionKind
+	: set  = 'set'
+	| bag  = 'bag'
+	| fifo = 'fifo'
+	| lifo = 'lifo'
+	;
+
+
+Buffer returns fmlInfra::Buffer
+	: ( ( visibility=VisibilityKind )? & ( modifier=Modifier )? )
+		'buffer' type=BufferContainerType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
+	;
+
+BufferImpl returns fmlInfra::Buffer
+	: type=BufferContainerType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
+	;
+
+
+enum PublicBufferVisibilityKind returns fmlCommon::VisibilityKind
+	: public ='buffer'
+	;
+
+BufferPublic returns fmlInfra::Buffer
+	: ( modifier=Modifier )?
+		visibility=PublicBufferVisibilityKind type=BufferContainerType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
+	;
+
+enum ProtectedBufferVisibilityKind returns fmlCommon::VisibilityKind
+	: protected ='buffer'
+	;
+
+BufferProtected returns fmlInfra::Buffer
+	: ( modifier=Modifier )?
+		visibility=ProtectedBufferVisibilityKind type=BufferContainerType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
+	;
+
+enum PrivateBufferVisibilityKind returns fmlCommon::VisibilityKind
+	: private ='buffer'
+	;
+
+BufferPrivate returns fmlInfra::Buffer
+	: ( modifier=Modifier )?
+		visibility=PrivateBufferVisibilityKind type=BufferContainerType
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Port rules
+////////////////////////////////////////////////////////////////////////////////
+
+Port returns fmlInfra::Port
+	: ( visibility=VisibilityKind )?
+		'port' ( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+
+PortImpl returns fmlInfra::Port
+	: ( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+
+enum PublicPortVisibilityKind returns fmlCommon::VisibilityKind
+	: public ='port'
+	;
+
+PortPublic returns fmlInfra::Port
+	: visibility=PublicPortVisibilityKind ( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+enum ProtectedPortVisibilityKind returns fmlCommon::VisibilityKind
+	: protected ='port'
+	;
+
+PortProtected returns fmlInfra::Port
+	: visibility=ProtectedPortVisibilityKind ( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+enum PrivatePortVisibilityKind returns fmlCommon::VisibilityKind
+	: private ='port'
+	;
+
+PortPrivate returns fmlInfra::Port
+	: visibility=PrivatePortVisibilityKind ( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Signal rules
+////////////////////////////////////////////////////////////////////////////////
+
+Signal returns fmlInfra::Signal
+	: ( visibility=VisibilityKind )?
+		'signal' ( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+SignalImpl returns fmlInfra::Signal
+	:( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+
+enum PublicSignalVisibilityKind returns fmlCommon::VisibilityKind
+	: public ='signal'
+	;
+
+SignalPublic returns fmlInfra::Signal
+	: visibility=PublicSignalVisibilityKind ( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+enum ProtectedSignalVisibilityKind returns fmlCommon::VisibilityKind
+	: protected ='signal'
+	;
+
+SignalProtected returns fmlInfra::Signal
+	: visibility=ProtectedSignalVisibilityKind ( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+enum PrivateSignalVisibilityKind returns fmlCommon::VisibilityKind
+	: private ='signal'
+	;
+
+SignalPrivate returns fmlInfra::Signal
+	: visibility=PrivateSignalVisibilityKind ( direction=ChannelDirection )?
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		( '('
+			parameter+=FormalParameter
+			( ',' parameter+=FormalParameter )*
+		')' )?
+		';'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Channel rules
+////////////////////////////////////////////////////////////////////////////////
+
+enum ChannelDirection returns fmlInfra::ChannelDirection
+	: input  = 'input'
+	| inout  = 'inout'
+	| output = 'output'
+	;
+
+Channel returns fmlInfra::Channel
+	: ( visibility=VisibilityKind )?
+		'channel' name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		'{'
+			( signal+=SignalReference ';' )+
+		'}'
+	;
+
+SignalReference returns fmlInfra::Signal
+	: ( direction=ChannelDirection )? name=ESIdentifier
+	;
+
+enum PublicChannelVisibilityKind returns fmlCommon::VisibilityKind
+	: public ='channel'
+	;
+
+ChannelPublic returns fmlInfra::Channel
+	: visibility=PublicChannelVisibilityKind
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		'{'
+			( signal+=SignalReference ';' )+
+		'}'
+	;
+
+enum ProtectedChannelVisibilityKind returns fmlCommon::VisibilityKind
+	: protected ='channel'
+	;
+
+ChannelProtected returns fmlInfra::Channel
+	: visibility=ProtectedChannelVisibilityKind
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		'{'
+			( signal+=SignalReference ';' )+
+		'}'
+	;
+
+enum PrivateChannelVisibilityKind returns fmlCommon::VisibilityKind
+	: private ='channel'
+	;
+
+ChannelPrivate returns fmlInfra::Channel
+	: visibility=PrivateChannelVisibilityKind
+		name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
+		'{'
+			( signal+=SignalReference ';' )+
+		'}'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Section Transition Rules
+////////////////////////////////////////////////////////////////////////////////
+
+Transition returns fmlStmchn::Transition
+	: {fmlStmchn::Transition} (transient?='transient')? 'transition'
+		( moe=TransitionMoe )?
+
+		( name=ESIdentifier ( unrestrictedName=UnrestrictedName )? )?
+
+//		( ( behavior=BlockStatement '-->' target=[fmlStmchn::Vertex|ESUfid] ';' )
+//		| ( '-->' target=[fmlStmchn::Vertex|ESUfid] (behavior=BlockStatement | ';') )
+//		)
+
+		( ( '{'
+			( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
+				( guard  = TransitionGuard      | '@guard:' )?
+				( tguard = TransitionTimedGuard | '@tguard:')?
+				'@effect:'  ( effect = TransitionEffect  )?
+			  )
+			| behavior=TransitionBehavior
+			)?
+			'}'  ( '-->' target=[fmlCommon::NamedElement|ESUfid] ';' )?
+		  )
+		| ( '-->' target=[fmlCommon::NamedElement|ESUfid]
+			( ( '{'
+				( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
+					( guard  = TransitionGuard      | '@guard:' )?
+					( tguard = TransitionTimedGuard | '@tguard:')?
+					'@effect:'  ( effect = TransitionEffect  )?
+				  )
+				| behavior=TransitionBehavior
+				)?
+				'}' )
+			| ';'
+			)
+		  )
+		)
+	;
+
+
+TransitionMoe returns fmlStmchn::TransitionMoe
+	: '<'
+		( ('moc:')?
+			( moc=TransitionMoc  ( '&' isElse?='else' )?
+			| isElse?='else'
+			) ( ',' ( "prior:" )? prior = EInt )?
+		| ( "prior:" )? prior = EInt
+		)
+	  '>'
+	;
+
+enum TransitionMoc returns fmlStmchn::TransitionMoc
+	: simple = 'simple'
+	| abort  = 'abort'
+	| final  = 'final'
+	;
+
+
+TransitionBehavior returns fmlStmnt::BlockStatement
+	: {fmlStmnt::BlockStatement}
+		( op=BlockStatementScheduler )?
+	 	( statement+=Statement )*
+	;
+
+TransitionTrigger returns fmlStmnt::InputComStatement
+	: InputComStatement
+	;
+
+TransitionGuard returns fmlStmnt::AbstractGuardStatement
+	: {fmlStmnt::GuardStatement}
+		'@guard<' condition=TransitionGuardExpression
+	| '@guard:'
+		( {fmlStmnt::GuardStatement}
+			( '[' condition=Expression ']'
+			| condition=Expression
+			)
+		| GuardStatement
+		| EventGuardStatement
+		| CheckSatGuardStatement
+		)
+	;
+
+TransitionGuardExpression returns fmlExpr::Expression
+	: {fmlExpr::LogicalAssociativeExpression}
+		operator=(  '&&' | 'and' | '||' | 'or' ) '>:'
+		( operand+=BitwiseOrExpression )+
+	;
+
+
+TransitionTimedGuard returns fmlStmnt::TimedGuardStatement
+	: {fmlStmnt::TimedGuardStatement}
+		'@tguard<' condition=TransitionGuardExpression
+	| '@tguard:'
+		( {fmlStmnt::TimedGuardStatement}
+			( '{' condition=Expression '}'
+			| condition=Expression
+			)
+		| TimedGuardStatement
+		)
+	;
+
+TransitionEffect returns fmlStmnt::Statement
+	: TransitionEffectStatement
+		( {fmlStmnt::BlockStatement.statement+=current}
+			statement+=TransitionEffectStatement
+		)*
+	;
+
+TransitionEffectStatement returns fmlStmnt::Statement
+	: ExpressionStatement
+	| OutputComStatement
+
+	| IfStatement
+	| WhileDoStatement
+	| DoWhileStatement
+	| ForStatement
+	| ForEachStatement
+
+	| InterruptStatement
+	| ActivityStatement
+	| InvokeStatement
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Statement Rules
+////////////////////////////////////////////////////////////////////////////////
+
+Statement returns fmlStmnt::Statement
+ 	: BlockStatement
+
+ 	| ExpressionStatement
+
+	| GuardStatement
+	| TimedGuardStatement
+	| EventGuardStatement
+	| CheckSatGuardStatement
+
+	| InputComStatement
+	| OutputComStatement
+
+	| IfStatement
+	| WhileDoStatement
+	| DoWhileStatement
+	| ForStatement
+	| ForEachStatement
+
+	| InterruptStatement
+
+	| ActivityStatement
+
+	| InvokeStatement
+	;
+
+BlockStatement returns fmlStmnt::BlockStatement
+	: {fmlStmnt::BlockStatement}
+		'{'
+			( op=BlockStatementScheduler )?
+		 	( statement+=Statement )*
+		 '}'
+	;
+
+BlockStatementScheduler
+	: '|;|' | '|§|' | '|;;|' | '|.|' | '|/;|'
+	| '|i|' | '|,|' | '|a|'
+
+	| '|and|' | '|or|'
+	| '|and#then|' | '|or#else|'
+	| '|indet|' | '|/\\|'
+
+	| '|fork|' | '|join|'
+	;
+
+
+/////////////////////////////////////////
+// Assignment Rules as Expression Statement
+// lv = rv
+// newfresh lv
+// ++lv --lv
+// lv++  lv--
+/////////////////////////////////////////
+
+ExpressionStatement returns fmlStmnt::ExpressionStatement
+	: expression=AssignmentExpression ';'
+
+	| expression=NewfreshExpression ';'
+
+	| expression=IncrementOrDecrementPrefixExpression  ';'
+	| expression=IncrementOrDecrementPostfixExpression ';'
+	;
+
+
+///////////////////////////////////////////
+//// Guard Rules
+///////////////////////////////////////////
+
+GuardStatement returns fmlStmnt::GuardStatement
+	: 'guard' condition=Expression ';'
+	;
+
+TimedGuardStatement returns fmlStmnt::TimedGuardStatement
+	: 'tguard' condition=Expression ';'
+	;
+
+EventGuardStatement returns fmlStmnt::EventGuardStatement
+	: 'event' condition=Expression ';'
+	;
+
+CheckSatGuardStatement returns fmlStmnt::CheckSatGuardStatement
+	: 'checksat' '<' solver=ESIdentifier '>' condition=Expression ';'
+	;
+
+
+///////////////////////////////////////////
+//
+//// Communication Rules
+///////////////////////////////////////////
+
+InputComStatement returns fmlStmnt::InputComStatement
+	: 'input' port=[fmlCommon::NamedElement|ESUfid] //ExpressionAsPort
+		( '(' leftValue+=Expression ( ',' leftValue+= Expression )* ')' )?
+
+		( ( '<--' target=ExpressionAsMachine )?
+		& ( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
+		) ';'
+	;
+
+OutputComStatement returns fmlStmnt::OutputComStatement
+	: 'output' port=[fmlCommon::NamedElement|ESUfid] //port=ExpressionAsPort
+		( '(' rigthValue+=Expression ( ',' rigthValue+=Expression )* ')' )?
+
+		( ( '-->' target=ExpressionAsMachine )?
+		& ( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
+		) ';'
+	;
+
+ExpressionAsMachine returns fmlExpr::ExpressionAsMachine
+	: machine=ValuePureNamedMachineExpression
+	;
+
+
+///////////////////////////////////////////
+//// If - Conditional Rules
+///////////////////////////////////////////
+
+IfStatement returns fmlStmnt::IfStatement
+	: 'if' condition=Expression
+		bodyBlock=BlockStatement
+		( elseifStatement+=ElseIfStatement )*
+		( 'else' elseBlock=BlockStatement )?
+	;
+
+
+ElseIfStatement returns fmlStmnt::ConditionalBlockStatement
+
+	: ( 'elseif' | 'else' 'if' ) condition=Expression
+		bodyBlock=BlockStatement
+	;
+
+/////////////////////////////////////////
+// Loop - Iteration Rules
+/////////////////////////////////////////
+
+WhileDoStatement returns fmlStmnt::WhileDoStatement
+	: 'while' condition=Expression  bodyBlock=BlockStatement
+	;
+
+DoWhileStatement returns fmlStmnt::DoWhileStatement
+	: 'do' bodyBlock=BlockStatement  'while' condition=Expression ';'
+	;
+
+ForStatement returns fmlStmnt::ForStatement
+	: 'for' ( init=ForAssignmentExpression ) ? ';'
+		condition=Expression ';' ( iterate=ForAssignmentExpression )?
+		bodyBlock=BlockStatement
+	| 'for' '(' ( init=ForAssignmentExpression ) ? ';'
+		condition=Expression ';' ( iterate=ForAssignmentExpression )? ')'
+		bodyBlock=BlockStatement
+	;
+
+ForAssignmentExpression returns fmlExpr::Expression
+	: AssignmentExpression
+	| IncrementOrDecrementPrefixExpression
+	| IncrementOrDecrementPostfixExpression
+	;
+
+
+ForEachStatement returns fmlStmnt::ForEachStatement
+	: 'for' iterator=LeftHandSideExpression ':' enumeration=Expression
+		bodyBlock=BlockStatement
+	| 'for' '(' iterator=LeftHandSideExpression ':' enumeration=Expression ')'
+		bodyBlock=BlockStatement
+	;
+
+
+/////////////////////////////////////////
+// Interrupt Rules
+/////////////////////////////////////////
+
+InterruptStatement returns fmlStmnt::InterruptStatement
+	: kind=InterruptStatementKind
+		( expr+=Expression
+		| '(' expr+=Expression ( ',' expr+=Expression )* ')'
+		)? ';'
+	;
+
+enum InterruptStatementKind returns fmlStmnt::InterruptStatementKind
+	: break    = 'break'
+	| continue = 'continue'
+	| return   = 'return'
+	| exit     = 'exit'
+	;
+
+
+///////////////////////////////////////////
+//// Activity Rules
+///////////////////////////////////////////
+
+ActivityStatement returns fmlStmnt::ActivityStatement
+	: {fmlStmnt::ActivityStatement}
+		op=OPERATOR_ACTIVITY
+		machine=ValuePureNamedMachineExpression
+		( tuple=TupleParameterExpression )?
+	';'
+	;
+
+enum OPERATOR_ACTIVITY returns fmlStmnt::ActivityStatementKind
+	: init     = 'init'
+	| final    = 'final'
+	| destroy  = 'destroy'
+
+	| start    = 'start'
+	| stop     = 'stop'
+	| restart  = 'restart'
+	| suspend  = 'suspend'
+	| resume   = 'resume'
+	| wait     = 'wait'
+
+	| disable  = 'disable'
+	| enable   = 'enable'
+	| abort    = 'abort'
+
+	| schedule = 'schedule'
+
+	| irun = 'irun'
+	| run  = 'run'
+	| rtc  = 'rtc'
+	;
+
+
+InvokeStatement returns fmlStmnt::InvokeStatement
+	: expression=InvokeExpressionDeprecated ';'
+
+	// Exec Routine
+	|  invokable=[fmlCommon::NamedElement|ESUfid]
+		execRoutine?='(' ( args=MixTupleExpressionList )? ')'
+		( '-->'
+			( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
+			| '(' rets+=[fmlInfra::Variable]
+				( ',' rets+=[fmlInfra::Variable] )* ')'
+			)
+		)? ';'
+
+	// Exec Routine
+	| execRoutine?='exec' invokable=[fmlCommon::NamedElement|ESUfid]
+		'(' ( args=MixTupleExpressionList )? ')'
+		( '-->'
+			( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
+			| '(' rets+=[fmlInfra::Variable]
+				( ',' rets+=[fmlInfra::Variable] )* ')'
+			)
+		)? ';'
+
+	// Call Procedure
+	| callProcedure?='call' invokable=[fmlCommon::NamedElement|ESUfid]
+		( args=MixTupleExpressionList )?
+		( '-->'
+			( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
+			| '(' rets+=[fmlInfra::Variable]
+				( ',' rets+=[fmlInfra::Variable] )* ')'
+			)
+		)? ';'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Expression Rules
+////////////////////////////////////////////////////////////////////////////////
+
+Expression returns fmlExpr::Expression
+	: AssignmentExpression
+	| ConditionalTestExpression
+	;
+
+
+// Assignment Expression
+AssignmentExpression returns fmlExpr::AssignmentExpression
+	: leftHandSide=LeftHandSideExpression
+		operator=AssignmentOperator rigthHandSide=Expression
+	;
+
+AssignmentOperator
+	: '='   | ':='  | '::='
+	| '+='  | '-='
+	| '*='  | '/='  | '%='
+	| '&&=' | '||='
+	| '&='  | '|='	| '^='
+	| '<<=' | '>>=' | '>>>='
+
+// queue operation: push, assign_top, top, pop
+	| '<=<'
+	| '^=<'
+	| '^=>'
+	| '>=>'
+	;
+
+
+LeftHandSideExpression returns fmlExpr::LeftHandSideExpression
+	: { fmlExpr::LeftHandSideExpression }
+//		lvalue=PrimaryExpression
+		( lvalue=ValueSelectionExpression
+		| '(' lvalue=ValueSelectionExpression ')'
+		)
+	;
+
+
+// Conditional Test Expression
+ConditionalTestExpression returns fmlExpr::Expression
+	: LogicalOrExpression
+		( {fmlExpr::ConditionalTestExpression.condition=current}
+			operator='?' thenOperand=Expression ':' elseOperand=Expression
+		)?
+	;
+
+// Logical Expression
+LogicalOrExpression returns fmlExpr::Expression
+	: LogicalAndExpression
+		( {fmlExpr::LogicalAssociativeExpression.operand+=current}
+			operator=( '||' | 'or' ) operand+=LogicalAndExpression
+			( ( '||' | 'or' ) operand+=LogicalAndExpression )*
+		)?
+	;
+
+LogicalAndExpression returns fmlExpr::Expression
+	: BitwiseOrExpression
+		( {fmlExpr::LogicalAssociativeExpression.operand+=current}
+			operator=( '&&' | 'and' ) operand+=BitwiseOrExpression
+			( ( '&&' | 'and' ) operand+=BitwiseOrExpression )*
+		)?
+	;
+
+
+// Bitwise Expression
+BitwiseOrExpression returns fmlExpr::Expression
+	: BitwiseXorExpression
+		( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
+			operator='|' operand+=BitwiseXorExpression
+			( '|' operand+=BitwiseXorExpression )*
+		)?
+	;
+
+BitwiseXorExpression returns fmlExpr::Expression
+	: BitwiseAndExpression
+		( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
+			operator='^' operand+=BitwiseAndExpression
+			( '^' operand+=BitwiseAndExpression )*
+		)?
+	;
+
+BitwiseAndExpression returns fmlExpr::Expression
+	: EqualityExpression
+		( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
+			operator='&' operand+=EqualityExpression
+			( '&' operand+=EqualityExpression )*
+		)?
+	;
+
+
+
+// Equality Expression
+EqualityExpression returns fmlExpr::Expression
+	: RelationalExpression
+		( {fmlExpr::EqualityBinaryExpression.leftOperand=current}
+			operator=EqualityOperator rigthOperand=RelationalExpression
+		)?
+	;
+
+EqualityOperator
+	: '==' | '!=' | '===' | '=!=' | '=/='
+	;
+
+
+// Relational Binary Expression
+RelationalExpression returns fmlExpr::Expression
+	: AdditiveExpression
+		( {fmlExpr::RelationalBinaryExpression.leftOperand=current}
+			operator=RelationalOperator rigthOperand=AdditiveExpression
+
+			( {fmlExpr::RelationalTernaryExpression.leftRelation=current}
+				rigthOperator=RelationalOperator rigthOperand=AdditiveExpression
+			)?
+		)?
+	;
+
+RelationalOperator
+	: '<' | '>' | '<=' | '>='
+	;
+
+
+// Arithmetic Associative (left) Expression
+AdditiveExpression returns fmlExpr::Expression
+	: MultiplicativeExpression
+		( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+			operator='+' operand+=MultiplicativeExpression
+			( '+' operand+=MultiplicativeExpression )* )
+
+		| ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+			operator='-' operand+=MultiplicativeExpression
+			( '-' operand+=MultiplicativeExpression )* )
+		)*
+	;
+
+MultiplicativeExpression returns fmlExpr::Expression
+	: UnaryExpression
+		( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+			operator='*' operand+=UnaryExpression
+			( '*' operand+=UnaryExpression )* )
+
+		| ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+			operator='**' operand+=UnaryExpression
+			( '**' operand+=UnaryExpression )* )
+
+		| ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+			operator='/' operand+=UnaryExpression
+			( '/' operand+=UnaryExpression )* )
+
+		| ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
+			operator='%' operand+=UnaryExpression
+			( '%' operand+=UnaryExpression )* )
+		)*
+	;
+
+
+// Unary Expression
+UnaryExpression returns fmlExpr::Expression
+	: LiteralTerminalExpression
+
+	| ArithmeticUnaryExpression
+	| LogicalUnaryExpression
+	| BitwiseUnaryExpression
+
+	| NewfreshExpression
+	| CastExpression
+
+	| PrefixUnaryExpression
+	| PostfixUnaryExpression
+
+	| PrimaryExpression
+
+	;
+
+// Postfix Increment or Decrement Expression
+PostfixUnaryExpression returns fmlExpr::Expression
+	: IncrementOrDecrementPostfixExpression
+	;
+
+IncrementOrDecrementPostfixExpression returns fmlExpr::IncrementOrDecrementPostfixExpression
+	: leftHandSide=LeftHandSideExpression operator=AffixOperator
+	;
+
+
+// Prefix Increment or Decrement Expression
+PrefixUnaryExpression returns fmlExpr::Expression
+	: IncrementOrDecrementPrefixExpression
+	;
+
+IncrementOrDecrementPrefixExpression returns fmlExpr::IncrementOrDecrementPrefixExpression
+	: operator=AffixOperator leftHandSide=LeftHandSideExpression
+	;
+
+
+AffixOperator
+	: '++' | '--'
+	;
+
+// Newfresh Unary Expression
+NewfreshExpression returns fmlExpr::NewfreshExpression
+	: 'newfresh' leftHandSide=LeftHandSideExpression
+	| '(:' leftHandSide=LeftHandSideExpression 'newfresh' ')'
+	;
+
+
+// Cast Expression
+CastExpression returns fmlExpr::CastExpression
+	: 'ctor' '<' datatype=[fmlType::DataType|ESUfid] '>'
+		 '(' operand=Expression ')'
+;
+
+// Arithmetic Unary Expression
+ArithmeticUnaryExpression returns fmlExpr::ArithmeticUnaryExpression
+	: operator=ArithmeticUnaryOperator operand=UnaryExpression
+;
+
+ArithmeticUnaryOperator
+	: '+' | '-'
+	;
+
+// Logical Unary Expression
+LogicalUnaryExpression returns fmlExpr::LogicalUnaryExpression
+	: operator=('!' | 'not') operand=UnaryExpression
+	;
+
+// Logical Unary Expression
+BitwiseUnaryExpression returns fmlExpr::BitwiseUnaryExpression
+	:operator='~' operand=UnaryExpression
+	;
+
+
+
+PrimaryExpression returns fmlExpr::Expression
+	: BaseExpression
+
+		// '.' element
+		( { fmlExpr::ValueElementSpecification.target=current }
+			'.' //kind=ValueDotFieldExpressionKind
+			element=[fmlCommon::NamedElement|ESIdentifier]
+
+			// '[' index ',' ... ',' index ']'
+			( kind=ValueIndexExpressionKind
+				arg=PositionalTupleExpressionList  ']'
+
+			// '(' parameter ',' ... ',' parameter ')'
+			| kind=ValueParameterExpressionKind
+				arg=MixTupleExpressionList  ')'
+			)?
+		)*
+
+		// '->' element
+		( { fmlExpr::ValueElementSpecification.target=current }
+			'->' //kind=ValueArrowFieldExpressionKind
+			element=[fmlCommon::NamedElement|ESIdentifier]
+
+			// '[' index ',' ... ',' index ']'
+			( kind=ValueIndexExpressionKind
+				arg=PositionalTupleExpressionList  ']'
+
+			// '(' parameter ',' ... ',' parameter ')'
+			| kind=ValueParameterExpressionKind
+				arg=MixTupleExpressionList  ')'
+			)?
+
+			// '.' element
+			( { fmlExpr::ValueElementSpecification.target=current }
+				 '.' //kind=ValueDotFieldExpressionKind
+				element=[fmlCommon::NamedElement|ESIdentifier]
+
+				// '[' index ',' ... ',' index ']'
+				( kind=ValueIndexExpressionKind
+					arg=PositionalTupleExpressionList  ']'
+
+				// '(' parameter ',' ... ',' parameter ')'
+				| kind=ValueParameterExpressionKind
+					arg=MixTupleExpressionList  ')'
+				)?
+			)*
+		)?
+	;
+
+BaseExpression returns fmlExpr::Expression
+	: LiteralReferenceableExpression
+	| '(' Expression ')'
+	| InvokeExpressionDeprecated
+	| InstantiationExpression
+//	| NamedExpression
+	;
+
+
+// Behavior Invoke Expression
+InvokeExpression returns fmlExpr::InvokeExpression
+	: {fmlExpr::InvokeExpression}
+		invoke=ValueSelectionExpression
+	;
+
+InvokeExpressionDeprecated returns fmlExpr::InvokeExpression
+	: {fmlExpr::InvokeExpression}
+		'(:' args+=Expression invoke=LiteralReferenceElement ( args+=Expression )* ')'
+	;
+
+
+InstantiationExpression returns fmlExpr::InstantiationExpression
+	: {fmlExpr::InstantiationExpression}
+		instance=DynamicInstanceSpecification  ';'
+	;
+
+DynamicInstanceSpecification returns fmlInfra::InstanceMachine
+	: {fmlInfra::InstanceMachine}
+		'new' model=[fmlInfra::Machine|ESIdentifier]
+//		( '(' arg=MixTupleExpressionList ')'
+		( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')'
+		| '{' ( slot+=SlotProperty ';' )*  '}'
+		)?
+	;
+
+
+// Tuple Expression
+TupleParameterExpression returns fmlExpr::TupleExpression
+	: '('  MixTupleExpressionList  ')'
+	;
+
+
+MixTupleExpressionList returns fmlExpr::MixTupleExpression
+	: {fmlExpr::MixTupleExpression}
+		value+=( Expression | NamedExpression )
+		( ',' value+=( Expression | NamedExpression ) )*
+	;
+
+
+//// At least one NamedExpression
+//FormalMixTupleExpressionList returns fmlExpr::MixTupleExpression
+//	: {fmlExpr::MixTupleExpression}
+//		( value+=Expression  ( ',' value+=Expression )*
+//			( ',' value+=NamedExpression )
+//		| value+=NamedExpression
+//		)
+//		( ',' value+=( Expression | NamedExpression ) )*
+//	;
+//
+//// NamedExpression only at the end
+//EndingMixTupleExpressionList returns fmlExpr::MixTupleExpression
+//	: {fmlExpr::MixTupleExpression}
+//		( value+=Expression  ( ',' value+=Expression )*
+//		| value+=NamedExpression
+//		)
+//		( ',' value+=NamedExpression )*
+//	;
+//
+//
+//NamedTupleExpressionList returns fmlExpr::NamedTupleExpression
+//	: value+=NamedExpression ( ',' value+=NamedExpression )*
+//	;
+
+PositionalTupleExpressionList returns fmlExpr::PositionalTupleExpression
+	: value+=Expression ( ',' value+=Expression )*
+	;
+
+
+NamedExpression returns fmlExpr::NamedExpression
+	: //target=[fmlCommon::NamedElement|ESIdentifier]
+		name=XLIA_ID
+		( ':' | '=>' | '<-' ) expression=Expression
+	;
+
+//NotificationComExpression returns fmlExpr::Expression
+//	: { fmlExpr::Expression }
+//		symbol=( 'present' | 'absent' )  operand+=Expression
+//	;
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Literal Expression Rules
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralExpression returns fmlExpr::LiteralExpression
+	: LiteralTerminalExpression
+
+	| LiteralReferenceableExpression
+	;
+
+
+LiteralReferenceableExpression returns fmlExpr::LiteralExpression
+	: LiteralCollectionExpression
+
+	| LiteralReferenceExpression
+	;
+
+
+LiteralTerminalExpression returns fmlExpr::LiteralExpression
+	: LiteralBooleanExpression
+
+	| LiteralIntegerExpression
+	| LiteralRationalExpression
+	| LiteralFloatExpression
+
+	| LiteralCharacterExpression
+	| LiteralStringExpression
+
+	| LiteralNullExpression
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Literal Boolean / Numeric Expression Rules
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralBooleanExpression returns fmlExpr::LiteralBooleanExpression
+	: {fmlExpr::LiteralBooleanExpression}
+		value=EBoolean
+	;
+
+LiteralIntegerExpression returns fmlExpr::LiteralIntegerExpression
+	: {fmlExpr::LiteralIntegerExpression}
+		value=EInteger
+	;
+
+LiteralRationalExpression returns fmlExpr::LiteralRationalExpression
+	: {fmlExpr::LiteralRationalExpression}
+		numerator=EInteger '/' denominator=EInteger
+	;
+
+LiteralFloatExpression returns fmlExpr::LiteralFloatExpression
+	: {fmlExpr::LiteralFloatExpression}
+		value=EDouble
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Literal Character / String Expression Rules
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralCharacterExpression returns fmlExpr::LiteralCharacterExpression
+	: {fmlExpr::LiteralCharacterExpression}
+		value=ECharacter
+	;
+
+LiteralStringExpression returns fmlExpr::LiteralStringExpression
+	: {fmlExpr::LiteralStringExpression}
+		value=EString
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Literal Null Expression Rules
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralNullExpression returns fmlExpr::LiteralNullExpression
+	: {fmlExpr::LiteralNullExpression}
+		( 'null' |  '$null' )
+	| {fmlExpr::LiteralNullExpression}
+		( 'null<' |  '$null<' ) type=DataType  '>'
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Literal Collection Expression Rules
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralCollectionExpression returns fmlExpr::LiteralCollectionExpression
+	: {fmlExpr::LiteralCollectionExpression}
+//		( 'new' datatype=DataType )?
+		( '<' datatype=DataType '>')?
+		'{' (
+			( value+=Expression | value+=NamedExpression )
+			( ',' ( value+=Expression | value+=NamedExpression ) )*
+		)? '}'
+	;
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Literal Reference Expression Rules
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralReferenceExpression returns fmlExpr::LiteralReferenceExpression
+	: LiteralReferenceElement
+
+	| LiteralReferenceVariableContext
+
+	| LiteralReferenceMachineContext
+
+	| LiteralEnvExpression
+	;
+
+
+LiteralReferenceElement returns fmlExpr::LiteralReferenceElement
+	: {fmlExpr::LiteralReferenceElement}
+		value=[fmlCommon::NamedElement|ESIdentifier]
+
+		// '[' index ',' ... ',' index ']'
+		( kind=ValueIndexExpressionKind
+			arg=PositionalTupleExpressionList  ']'
+
+		// '(' parameter ',' ... ',' parameter ')'
+		| kind=ValueParameterExpressionKind
+			arg=MixTupleExpressionList  ')'
+		)?
+	;
+
+LiteralPureReferenceElement returns fmlExpr::LiteralReferenceElement
+	: {fmlExpr::LiteralReferenceElement}
+		value=[fmlCommon::NamedElement|ESIdentifier]
+	;
+
+
+LiteralReferenceVariableContext returns fmlExpr::LiteralReferenceExpression
+	: LiteralTimeExpression
+	| LiteralTimeDeltaExpression
+	;
+
+LiteralTimeExpression returns fmlExpr::LiteralTimeExpression
+	: {fmlExpr::LiteralTimeExpression} ( '$time' )
+	;
+
+LiteralTimeDeltaExpression returns fmlExpr::LiteralTimeDeltaExpression
+	: {fmlExpr::LiteralTimeDeltaExpression} ( '$delta' )
+	;
+
+
+LiteralReferenceMachineContext returns fmlExpr::LiteralReferenceExpression
+	: LiteralThisExpression
+	| LiteralSelfExpression
+
+	| LiteralParentExpression
+	| LiteralSuperExpression
+
+	| LiteralSystemExpression
+	
+	| LiteralEnvExpression
+	;
+
+LiteralThisExpression returns fmlExpr::LiteralThisExpression
+	: {fmlExpr::LiteralThisExpression} ( '$this' )
+	;
+
+LiteralSelfExpression returns fmlExpr::LiteralSelfExpression
+	: {fmlExpr::LiteralSelfExpression} ( '$self' )
+	;
+
+LiteralParentExpression returns fmlExpr::LiteralParentExpression
+	: {fmlExpr::LiteralParentExpression} ( '$parent' )
+	;
+
+LiteralSuperExpression returns fmlExpr::LiteralSuperExpression
+	: {fmlExpr::LiteralSuperExpression} ( '$super' )
+	;
+
+LiteralSystemExpression returns fmlExpr::LiteralSystemExpression
+	: {fmlExpr::LiteralSystemExpression} ( '$system' )
+	;
+
+
+LiteralEnvExpression returns fmlExpr::LiteralEnvExpression
+	: {fmlExpr::LiteralEnvExpression} ( '$env' | 'env' )
+	;
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Value Element Specification Expression Rules
+////////////////////////////////////////////////////////////////////////////////
+
+LiteralPureReferenceExpression returns fmlExpr::LiteralReferenceExpression
+	: LiteralPureReferenceElement
+	| LiteralReferenceMachineContext
+	;
+
+
+ValueSelectionExpression returns fmlExpr::Expression
+	: LiteralReferenceExpression
+
+		// '.' element
+		( { fmlExpr::ValueElementSpecification.target=current }
+			'.' //kind=ValueDotFieldExpressionKind
+			element=[fmlCommon::NamedElement|ESIdentifier]
+
+			// '[' index ',' ... ',' index ']'
+			( kind=ValueIndexExpressionKind
+				arg=PositionalTupleExpressionList  ']'
+
+//			// TODO '(' parameter ',' ... ',' parameter ')'
+//			| kind=ValueParameterExpressionKind
+//				arg=MixTupleExpressionList  ')'
+			)?
+		)*
+
+		// '->' element
+		( { fmlExpr::ValueElementSpecification.target=current }
+			'->' //kind=ValueArrowFieldExpressionKind
+			element=[fmlCommon::NamedElement|ESIdentifier]
+
+			// '[' index ',' ... ',' index ']'
+			( kind=ValueIndexExpressionKind
+				arg=PositionalTupleExpressionList  ']'
+
+//			// TODO '(' parameter ',' ... ',' parameter ')'
+//			| kind=ValueParameterExpressionKind
+//				arg=MixTupleExpressionList  ')'
+			)?
+
+			// '.' element
+			( { fmlExpr::ValueElementSpecification.target=current }
+				 '.' //kind=ValueDotFieldExpressionKind
+				element=[fmlCommon::NamedElement|ESIdentifier]
+
+				// '[' index ',' ... ',' index ']'
+				( kind=ValueIndexExpressionKind
+					arg=PositionalTupleExpressionList  ']'
+
+//				// TODO '(' parameter ',' ... ',' parameter ')'
+//				| kind=ValueParameterExpressionKind
+//					arg=MixTupleExpressionList  ')'
+				)?
+			)*
+		)?
+	;
+
+
+//ValuePureNamedElementExpression
+//ValuePureNamedElementExpression returns fmlExpr::Expression
+//	: LiteralPureReferenceExpression
+//
+//		// '.' element
+//		( { fmlExpr::ValueElementSpecification.target=current }
+//			kind=ValueDotFieldExpressionKind
+//			element=[fmlCommon::NamedElement|ESIdentifier]
+//		)*
+//
+//		// '->' element
+//		( { fmlExpr::ValueElementSpecification.target=current }
+//			kind=ValueArrowFieldExpressionKind
+//			element=[fmlCommon::NamedElement|ESIdentifier]
+//
+//			// '.' element
+//			( { fmlExpr::ValueElementSpecification.target=current }
+//				kind=ValueDotFieldExpressionKind
+//				element=[fmlCommon::NamedElement|ESIdentifier]
+//			)*
+//		)?
+//	;
+
+
+ValuePureNamedMachineExpression returns fmlExpr::Expression
+	: LiteralPureReferenceExpression
+
+		// '.' element
+		( { fmlExpr::ValueElementSpecification.target=current }
+			kind=ValueDotFieldExpressionKind
+			element=[fmlCommon::NamedElement|ESIdentifier]
+		)*
+
+		// '->' element
+		( { fmlExpr::ValueElementSpecification.target=current }
+			kind=ValueArrowFieldExpressionKind
+			element=[fmlCommon::NamedElement|ESIdentifier]
+
+			// '.' element
+			( { fmlExpr::ValueElementSpecification.target=current }
+				kind=ValueDotFieldExpressionKind
+				element=[fmlCommon::NamedElement|ESIdentifier]
+			)*
+		)?
+	;
+
+
+//ValueAnyElementExpression returns fmlExpr::ValueElementSpecification
+//	: element=[fmlCommon::NamedElement|ESIdentifier]
+//
+//		// '.' element
+//		( { fmlExpr::ValueElementSpecification.target=current }
+//			kind=ValueDotFieldExpressionKind
+//			element=[fmlCommon::NamedElement|ESIdentifier]
+//
+//		// '[' index ',' ... ',' index ']'
+//		| { fmlExpr::ValueElementSpecification.target=current }
+//			kind=ValueIndexExpressionKind
+//			arg=PositionalTupleExpressionList
+//			']'
+//
+//		// '(' parameter ',' ... ',' parameter ')'
+//		| { fmlExpr::ValueElementSpecification.target=current }
+//			kind=ValueParameterExpressionKind
+//			arg=MixTupleExpressionList
+//			')'
+//		)*
+//
+//		// '->' element
+//		( { fmlExpr::ValueElementSpecification.target=current }
+//			kind=ValueArrowFieldExpressionKind
+//			element=[fmlCommon::NamedElement|ESIdentifier]
+//
+//			// '.' element
+//			( { fmlExpr::ValueElementSpecification.target=current }
+//				kind=ValueDotFieldExpressionKind
+//				element=[fmlCommon::NamedElement|ESIdentifier]
+//
+//			// '[' index ',' ... ',' index ']'
+//			| { fmlExpr::ValueElementSpecification.target=current }
+//				kind=ValueIndexExpressionKind
+//				arg=PositionalTupleExpressionList
+//				']'
+//
+//			// '(' parameter ',' ... ',' parameter ')'
+//			| { fmlExpr::ValueElementSpecification.target=current }
+//				kind=ValueParameterExpressionKind
+//				arg=MixTupleExpressionList
+//				')'
+//			)*
+//		)?
+//	;
+
+
+enum ValueDotFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
+	: field='.'
+	;
+
+enum ValueColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
+	: field=':'
+	;
+
+enum ValueDoubleColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
+	: field='::'
+	;
+
+
+enum ValueArrowFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
+	: field='->'
+	;
+
+
+enum ValueIndexExpressionKind returns fmlExpr::ValueElementSpecificationKind
+	: index='['
+	;
+
+
+enum ValueParameterExpressionKind returns fmlExpr::ValueElementSpecificationKind
+	: parameter='('
+	;
+
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalMLQualifiedNameProvider.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalMLQualifiedNameProvider.xtend
new file mode 100644
index 0000000..52545a1
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalMLQualifiedNameProvider.xtend
@@ -0,0 +1,71 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext;
+
+import org.eclipse.efm.ecore.formalml.common.NamedElement
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider
+import org.eclipse.xtext.naming.QualifiedName
+import java.util.LinkedList
+
+public class FormalMLQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider {
+
+	override public QualifiedName getFullyQualifiedName(EObject obj) {
+		if (obj instanceof NamedElement) {
+			getFullyQualifiedName(obj as NamedElement)
+		} else {
+			super.getFullyQualifiedName(obj)
+		}
+	}
+
+	def QualifiedName getFullyQualifiedName(NamedElement form) {
+		val FQN = new LinkedList<String>()
+		var name = form.getName()
+		if (name != null) {
+			FQN.add(name)
+		} 
+		else {
+//    		return QualifiedName.EMPTY;
+			return null
+		}
+
+		var container = form.eContainer();
+		while (container != null) {
+			if (container instanceof NamedElement) {
+				name = container.getName();
+				if (name != null) {
+					FQN.addFirst(name)
+				}
+			}
+			container = container.eContainer()
+		}
+		
+		QualifiedName.create(FQN)
+	}
+
+	def QualifiedName qualifiedName(NamedElement form) {
+		var container = form.eContainer();
+		while ((container != null) && (! (container instanceof NamedElement))) {
+			container = container.eContainer()
+		}
+		
+		if (container != null) {
+			QualifiedName.create((container as NamedElement).getName(), form.getName())
+		} 
+		else {
+			QualifiedName.create(form.getName())
+		}
+	}
+
+}
+
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalMLRuntimeModule.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalMLRuntimeModule.xtend
new file mode 100644
index 0000000..12a5dfd
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalMLRuntimeModule.xtend
@@ -0,0 +1,35 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext
+
+import com.google.inject.Binder
+import com.google.inject.name.Names
+
+/**
+ * Use this class to register components to be used at runtime / without the Equinox extension registry.
+ */
+class FormalMLRuntimeModule extends AbstractFormalMLRuntimeModule {
+
+
+//	@Override
+//	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+//		return FormalMLQualifiedNameProvider.class;
+//	}
+
+
+	override public void configure(Binder binder) {
+	  super.configure(binder);
+	  binder.bindConstant().annotatedWith(Names.named(
+			  org.eclipse.xtext.validation.CompositeEValidator.USE_EOBJECT_VALIDATOR)).to(false);
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalMLStandaloneSetup.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalMLStandaloneSetup.xtend
new file mode 100644
index 0000000..bf21701
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/FormalMLStandaloneSetup.xtend
@@ -0,0 +1,24 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext
+
+
+/**
+ * Initialization support for running Xtext languages without Equinox extension registry.
+ */
+class FormalMLStandaloneSetup extends FormalMLStandaloneSetupGenerated {
+
+	def static void doSetup() {
+		new FormalMLStandaloneSetup().createInjectorAndDoEMFRegistration()
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/GenerateFormalML.mwe2 b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/GenerateFormalML.mwe2
new file mode 100644
index 0000000..1a33032
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/GenerateFormalML.mwe2
@@ -0,0 +1,85 @@
+/*****************************************************************************
+* Copyright (c) 2012 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+module org.eclipse.efm.formalml.xtext.GenerateFormalML
+
+import org.eclipse.xtext.xtext.generator.*
+import org.eclipse.xtext.xtext.generator.model.project.*
+
+var rootPath = ".."
+
+var fileHeader =
+"/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/"
+
+
+Workflow {
+	
+	component = XtextGenerator {
+		configuration = {
+			project = StandardProjectConfig {
+				baseName = "org.eclipse.efm.formalml.xtext"
+				rootPath = rootPath
+				runtimeTest = {
+					enabled = true
+				}
+				eclipsePlugin = {
+					enabled = true
+				}
+				eclipsePluginTest = {
+					enabled = true
+				}
+				createEclipseMetaData = true
+			}
+			code = {
+				encoding = "UTF-8"
+				fileHeader = fileHeader
+			}
+		}
+		language = StandardLanguage {
+			name = "org.eclipse.efm.formalml.xtext.FormalML"
+			fileExtensions = "fml,xfml,xlia,xfsp"
+			referencedResource = "platform:/resource/org.eclipse.efm.formalml.ecore/resources/ecore/formalml.genmodel"
+			
+			fragment = ecore2xtext.Ecore2XtextValueConverterServiceFragment2 auto-inject {}
+
+			parserGenerator = {
+				options = auto-inject {
+					classSplitting = true
+					backtrack = true
+				}
+			}
+
+			fragment = exporting.SimpleNamesFragment2 auto-inject {}
+			fragment = org.eclipse.xtext.generator.adapter.FragmentAdapter {
+				fragment = org.eclipse.xtext.generator.ecore2xtext.FormatterFragment {}
+			}
+
+			serializer = {
+				generateStub = false
+			}
+			validator = {
+				// composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
+			}
+		}
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/formatting/FormalMLFormatter.java b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/formatting/FormalMLFormatter.java
new file mode 100644
index 0000000..6191533
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/formatting/FormalMLFormatter.java
@@ -0,0 +1,49 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.formatting;
+
+import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter;
+import org.eclipse.xtext.formatting.impl.FormattingConfig;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.util.Pair;
+
+/**
+ * This class contains custom formatting declarations.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#formatting
+ * on how and when to use it.
+ * 
+ * Also see {@link org.eclipse.xtext.xtext.XtextFormattingTokenSerializer} as an example
+ */
+public class FormalMLFormatter extends AbstractDeclarativeFormatter {
+	
+	@Override
+	protected void configureFormatting(FormattingConfig c) {
+		org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess f =
+				(org.eclipse.efm.formalml.xtext.services.FormalMLGrammarAccess) getGrammarAccess();
+		for(Pair<Keyword, Keyword> pair: f.findKeywordPairs("{", "}")) {
+			c.setIndentation(pair.getFirst(), pair.getSecond());
+			c.setLinewrap(1).after(pair.getFirst());
+			c.setLinewrap(1).before(pair.getSecond());
+			c.setLinewrap(1).after(pair.getSecond());
+		}
+		for(Keyword comma: f.findKeywords(",")) {
+			c.setNoLinewrap().before(comma);
+			c.setNoSpace().before(comma);
+			c.setLinewrap().after(comma);
+		}
+		c.setLinewrap(0, 1, 2).before(f.getSL_COMMENTRule());
+		c.setLinewrap(0, 1, 2).before(f.getML_COMMENTRule());
+		c.setLinewrap(0, 1, 1).after(f.getML_COMMENTRule());
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/generator/FormalMLGenerator.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/generator/FormalMLGenerator.xtend
new file mode 100644
index 0000000..873d32c
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/generator/FormalMLGenerator.xtend
@@ -0,0 +1,34 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.generator
+
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.generator.AbstractGenerator
+import org.eclipse.xtext.generator.IFileSystemAccess2
+import org.eclipse.xtext.generator.IGeneratorContext
+
+/**
+ * Generates code from your model files on save.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation
+ */
+class FormalMLGenerator extends AbstractGenerator {
+
+	override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
+//		fsa.generateFile('greetings.txt', 'People to greet: ' + 
+//			resource.allContents
+//				.filter(typeof(Greeting))
+//				.map[name]
+//				.join(', '))
+	}
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/scoping/FormalMLScopeProvider.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/scoping/FormalMLScopeProvider.xtend
new file mode 100644
index 0000000..bbcc74f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/scoping/FormalMLScopeProvider.xtend
@@ -0,0 +1,1477 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.scoping
+
+import com.google.inject.Inject
+import org.eclipse.efm.ecore.formalml.common.NamedElement
+import org.eclipse.efm.ecore.formalml.common.TypedElement
+import org.eclipse.efm.ecore.formalml.common.VisibilityKind
+import org.eclipse.efm.ecore.formalml.datatype.DataStructuredType
+import org.eclipse.efm.ecore.formalml.datatype.DataSupportedType
+import org.eclipse.efm.ecore.formalml.datatype.DataType
+import org.eclipse.efm.ecore.formalml.datatype.DataTypeReference
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType
+import org.eclipse.efm.ecore.formalml.expression.InvokeExpression
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement
+import org.eclipse.efm.ecore.formalml.expression.LiteralReferenceExpression
+import org.eclipse.efm.ecore.formalml.expression.TupleExpression
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationKind
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecificationScheme
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel
+import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection
+import org.eclipse.efm.ecore.formalml.infrastructure.ComPoint
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine
+import org.eclipse.efm.ecore.formalml.infrastructure.Port
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable
+import org.eclipse.efm.ecore.formalml.statemachine.Region
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine
+import org.eclipse.efm.ecore.formalml.statemachine.Transition
+import org.eclipse.efm.ecore.formalml.statement.AbstractComStatement
+import org.eclipse.efm.ecore.formalml.statement.ActivityStatement
+import org.eclipse.efm.ecore.formalml.statement.InputComStatement
+import org.eclipse.efm.ecore.formalml.statement.OutputComStatement
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EReference
+import org.eclipse.xtext.EcoreUtil2
+import org.eclipse.xtext.scoping.IScope
+import org.eclipse.xtext.scoping.Scopes
+import org.eclipse.efm.formalml.xtext.typing.FormalMLTypeProvider
+
+/**
+ * This class contains custom scoping description.
+ * 
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
+ * on how and when to use it.
+ */
+class FormalMLScopeProvider extends AbstractFormalMLScopeProvider {
+
+	@Inject extension FormalMLTypeProvider
+
+	////////////////////////////////////////////////////////////////////////////
+	// Tools / Utils
+	////////////////////////////////////////////////////////////////////////////
+
+	def Iterable< ? extends NamedElement> selectPublic(
+		Iterable< ? extends NamedElement> elements) {
+
+		elements.filter[ visibility == VisibilityKind.PUBLIC ]
+	}
+
+	def Iterable< ? extends NamedElement> selectNonPublic(
+		Iterable< ? extends NamedElement> elements) {
+
+		elements.filter[ visibility != VisibilityKind.PUBLIC ]
+	}
+
+
+	def Iterable< ? extends PropertyDefinition > selectNonFinalNorConst(
+		Iterable< ? extends PropertyDefinition > elements) {
+		val nonFinalNorConstPredicate = [ PropertyDefinition P |
+			(P.modifier.final == false) &&
+			((! (P instanceof Variable)) || ((P as Variable).const == false)) ]
+
+		elements.filter( nonFinalNorConstPredicate )
+	}
+
+
+	def isAncestorOf(EObject container, EObject element) {
+		var ancestor = element.eContainer
+
+		while( (ancestor != null) && (ancestor != container) ) {
+			ancestor = ancestor.eContainer
+		}
+
+		( ancestor != null )
+	}
+
+
+//	def Iterable< ? extends TypedElement > selectTypedElement(
+//		Iterable< ? extends TypedElement > elements,
+//		PrimitiveInstanceKind expected1, PrimitiveInstanceKind expected2) {
+//
+//		val typePredicate = [ TypedElement element |
+//			(element.type instanceof PrimitiveInstanceType) && (
+//				((element.type as PrimitiveInstanceType).expected == expected1) ||
+//				((element.type as PrimitiveInstanceType).expected == expected2) ) ]
+//
+//		elements.filter( typePredicate )
+//	}
+
+
+	def Iterable< ? extends TypedElement > selectTypedElement(
+		Iterable< ? extends TypedElement > elements, PrimitiveInstanceKind expected) {
+
+		val typePredicate = [ TypedElement element |
+			(element.type instanceof PrimitiveInstanceType) &&
+				((element.type as PrimitiveInstanceType).expected == expected) ]
+
+		elements.filter( typePredicate )
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// ComStatement --> Port
+	////////////////////////////////////////////////////////////////////////////
+
+//	def scope_NamedElement(InputComStatement context, EReference r) {
+//		context.scopeForHierarchicRigthElement(ValueElementSpecificationScheme.COM_POINT)
+//	}
+//
+//	def scope_NamedElement(OutputComStatement context, EReference r) {
+//		context.scopeForHierarchicRigthElement(ValueElementSpecificationScheme.COM_POINT)
+//	}
+//
+//	def scope_NamedElement(ExpressionAsComPoint context, EReference r) {
+//		context.scopeForHierarchicLeftElement(ValueElementSpecificationScheme.COM_POINT)
+//	}
+
+
+	def scope_Port(InputComStatement context, EReference r) {
+		context.scopeForComPoint(ChannelDirection.INPUT)
+	}
+
+	def scope_InputComStatement_port(InputComStatement context, EReference r) {
+		context.scopeForComPoint(ChannelDirection.INPUT)
+	}
+
+
+	def scope_Port(OutputComStatement context, EReference r) {
+		context.scopeForComPoint(ChannelDirection.OUTPUT)
+	}
+
+	def scope_OutputComStatement_port(OutputComStatement context, EReference r) {
+		context.scopeForComPoint(ChannelDirection.OUTPUT)
+	}
+
+
+
+	def scopeForComPoint(AbstractComStatement context, ChannelDirection direction) {
+		var thisMachine = EcoreUtil2.getContainerOfType(context, typeof(Machine))
+
+		while( (thisMachine != null) && thisMachine.port.empty ) {
+			thisMachine = EcoreUtil2.getContainerOfType(
+				thisMachine.eContainer, typeof(Machine) )
+		}
+
+		var parentScope = IScope::NULLSCOPE
+		if( thisMachine != null ) {
+			parentScope =
+				Scopes::scopeFor(thisMachine.property.selectTypedElement(
+						PrimitiveInstanceKind.COM_POINT),
+					Scopes::scopeFor(thisMachine.signal.selectSignal(direction),
+						Scopes::scopeFor(thisMachine.port.selectPort(direction),
+							parentScope)))
+		}
+
+		parentScope
+	}
+
+	def Iterable< Port > selectPort(
+		Iterable< Port > elements, ChannelDirection dir) {
+
+		if( dir == ChannelDirection.INOUT ) {
+			elements
+		}
+		else {
+			elements.filter[ (direction == dir) ||
+				(direction == ChannelDirection.INOUT) ]
+		}
+	}
+
+	def Iterable< Signal > selectSignal(
+		Iterable< Signal > elements, ChannelDirection dir) {
+
+		if( dir == ChannelDirection.INOUT ) {
+			elements
+		}
+		else {
+			elements.filter[ (direction == dir) ||
+				(direction == ChannelDirection.INOUT) ]
+		}
+	}
+
+
+	def Iterable< PropertyDefinition > selectTypedComPoint(
+		Iterable< PropertyDefinition > elements) {
+
+		val typedComPointPredicate = [ PropertyDefinition property |
+			(property instanceof Variable) &&
+			(property.type instanceof PrimitiveInstanceType) && (
+					((property.type as PrimitiveInstanceType).expected ==
+						PrimitiveInstanceKind.PORT) ||
+					((property.type as PrimitiveInstanceType).expected ==
+						PrimitiveInstanceKind.SIGNAL) ||
+					((property.type as PrimitiveInstanceType).expected ==
+						PrimitiveInstanceKind.COM_POINT) ) ]
+
+		elements.filter( typedComPointPredicate )
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// ComStatement --> Channel
+	////////////////////////////////////////////////////////////////////////////
+
+	def scope_AbstractComStatement_channel(AbstractComStatement context, EReference r) {
+		context.scopeForChannel(context.port, ChannelDirection.INPUT)
+	}
+
+	def scope_InputComStatement_channel(InputComStatement context, EReference r) {
+		context.scopeForChannel(context.port, ChannelDirection.INPUT)
+	}
+
+	def scope_OutputComStatement_channel(OutputComStatement context, EReference r) {
+		context.scopeForChannel(context.port, ChannelDirection.OUTPUT)
+	}
+
+
+	def scopeForChannel(AbstractComStatement context,
+		NamedElement comElement, ChannelDirection direction) {
+		var thisMachine = EcoreUtil2.getContainerOfType(context, typeof(Machine))
+
+		while( (thisMachine != null) && thisMachine.port.empty ) {
+			thisMachine = EcoreUtil2.getContainerOfType(
+				thisMachine.eContainer, typeof(Machine) )
+		}
+
+		var parentScope = IScope::NULLSCOPE
+		if( thisMachine != null ) {
+			parentScope = Scopes::scopeFor(
+				thisMachine.channel.selectChannel(comElement, direction),
+				parentScope)
+		}
+
+		parentScope
+	}
+
+	def Iterable< Channel > selectChannel(
+		Iterable< Channel > elements, NamedElement comElement, ChannelDirection dir) {
+
+		elements.filter[ ((direction == dir) ||
+			(direction == ChannelDirection.INOUT)) && port.contains(comElement) ]
+	}
+
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// Transition --> Vertex
+	////////////////////////////////////////////////////////////////////////////
+
+	def scope_Transition_target(Transition context, EReference r) {
+		val parentScope = IScope::NULLSCOPE
+
+		val region = EcoreUtil2.getContainerOfType(context, typeof(Region))
+
+		var thisMachine = EcoreUtil2.getContainerOfType(region, typeof(Machine))
+
+		Scopes::scopeFor(thisMachine.property.selectTypedElement(
+				PrimitiveInstanceKind.VERTEX),
+			Scopes::scopeFor(region.vertex, parentScope))
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// InstanceMachine --> SlotProperty
+	////////////////////////////////////////////////////////////////////////////
+
+	def scope_SlotParameter_xliaProperty(SlotProperty context, EReference r) {
+		val model = ( context.eContainer as InstanceMachine ).model
+
+		Scopes::scopeFor(model.property.selectNonFinalNorConst,
+			Scopes::scopeFor(model.buffer, IScope::NULLSCOPE))
+	}
+
+	def scope_SlotProperty_xliaProperty(SlotProperty context, EReference r) {
+		val model = ( context.eContainer as InstanceMachine ).model
+
+		Scopes::scopeFor(model.property.selectNonFinalNorConst,
+			Scopes::scopeFor(model.buffer, IScope::NULLSCOPE))
+	}
+
+	def scope_PropertyDefinition(InstanceMachine context, EReference r) {
+		val parentScope = IScope::NULLSCOPE
+
+		val model = context.model
+
+		Scopes::scopeFor(model.property.selectNonFinalNorConst,
+			Scopes::scopeFor(model.buffer, parentScope))
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// InstanceMachine --> Model
+	////////////////////////////////////////////////////////////////////////////
+
+	def scope_InstanceMachine_model(InstanceMachine context, EReference r) {
+		context.scopeForHierarchicLeftElement(ValueElementSpecificationScheme.MODEL)
+	}
+
+	def scope_DynamicInstanceSpecification_model(InstanceMachine context, EReference r) {
+		context.scopeForHierarchicLeftElement(ValueElementSpecificationScheme.MODEL)
+	}
+
+	def scope_Machine(InstanceMachine context, EReference r) {
+		context.scopeForHierarchicLeftElement(ValueElementSpecificationScheme.MODEL)
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// LiteralReferenceElement --> NamedElement
+	////////////////////////////////////////////////////////////////////////////
+
+	def scope_NamedElement(LiteralReferenceElement context, EReference r) {
+		var container = context.eContainer
+
+		for( ; container != null ; container = container.eContainer ) {
+			switch( container ) {
+				ValueElementSpecification :
+						return container.scopeForThis(context)
+
+				LeftHandSideExpression : return container.scopeForThis(context)
+
+				TupleExpression : return container.scopeForThis(context)
+
+				InvokeExpression : return container.scopeForThis(context)
+
+				InputComStatement : return container.scopeForThis(context)
+				OutputComStatement: return container.scopeForThis(context)
+
+				ActivityStatement : return container.scopeForThis(context)
+
+				Transition : return container.scopeForThis(context)
+
+				ComPoint: return container.scopeForThis(context)
+
+				Routine : return container.scopeForAnyElement(context)
+
+				Machine : return container.scopeForAnyElement(context)
+
+				PrimitiveInstanceType :
+						return container.scopeForAnyModelElement(context)
+
+				DataTypeReference : return container.scopeForThis(context)
+			}
+		}
+
+		IScope.NULLSCOPE
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// ValueElementSpecification --> NamedElement
+	////////////////////////////////////////////////////////////////////////////
+
+	def scope_NamedElement(ValueElementSpecification context, EReference r) {
+		var parentScope = IScope::NULLSCOPE
+
+		val type = context.target.typeFor
+
+		if( (type == null) || type.isPrimitive ) {
+			return parentScope
+		}
+
+		if( context.expected == ValueElementSpecificationScheme.ANY ) {
+			val container = context.eContainer
+
+			switch( container ) {
+				ComPoint:
+					context.expected = ValueElementSpecificationScheme.COM_POINT
+
+				InputComStatement :
+					context.expected = ValueElementSpecificationScheme.COM_POINT
+
+				OutputComStatement:
+					context.expected = ValueElementSpecificationScheme.COM_POINT
+			}
+		}
+
+		if( type instanceof Machine ) {
+			if( context.expected == ValueElementSpecificationScheme.COM_POINT ) {
+				val container = context.eContainer
+
+				switch( container ) {
+					ComPoint: scopeForSelfMachineComPoint(type,
+						(context.eContainer as ComPoint).direction)
+
+					InputComStatement : Scopes::scopeFor(
+						type.selectLeftElements(context), parentScope)
+
+					OutputComStatement: Scopes::scopeFor(
+						type.selectRigthElements(context), parentScope)
+				}
+			}
+			else if( (context.target instanceof LiteralReferenceExpression) &&
+					(! (context.target instanceof LiteralReferenceElement)) ) {
+				Scopes::scopeFor(
+					type.selectLeftElements(context), parentScope)
+			}
+			else if( type.isAncestorOf(context) ) {
+				for( block : type.blockHierarchy.reverseView ) {
+					parentScope = Scopes::scopeFor(
+						block.selectLeftElements(context), parentScope)
+				}
+
+				Scopes::scopeFor(
+					type.selectLeftElements(context), parentScope)
+			}
+			else {
+				for( block : type.blockHierarchy.reverseView ) {
+					parentScope = Scopes::scopeFor(
+						block.selectPublicLeftElements(context), parentScope)
+				}
+
+				Scopes::scopeFor(
+					type.selectPublicLeftElements(context), parentScope)
+			}
+		}
+		else if( type instanceof DataType ) {
+			Scopes::scopeFor(type.selectElements(context), parentScope)
+		}
+		else {
+			parentScope
+		}
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// Tools / Utils
+	////////////////////////////////////////////////////////////////////////////
+
+	def blockHierarchy(Machine block) {
+		val hierarchy = <Machine>newArrayList()
+
+		var current = EcoreUtil2.getContainerOfType(
+				block.eContainer, typeof(Machine))
+
+		while( current != null ) {
+			hierarchy.add( current )
+
+			current = EcoreUtil2.getContainerOfType(
+				current.eContainer, typeof(Machine))
+		}
+
+		hierarchy
+	}
+
+
+	def selectLeftElements(Machine machine, ValueElementSpecification ves) {
+		if( ves.kind == ValueElementSpecificationKind.PARAMETER ) {
+			machine.routine + machine.procedure
+		}
+		else {
+			selectLeftElements(machine, ves.expected)
+		}
+	}
+
+	def selectPublicLeftElements(Machine machine, ValueElementSpecification ves) {
+		if( ves.kind == ValueElementSpecificationKind.PARAMETER ) {
+			machine.routine + machine.procedure
+		}
+		else {
+			selectPublicLeftElements(machine, ves.expected)
+		}
+	}
+
+
+	def selectRigthElements(Machine machine, ValueElementSpecification ves) {
+		if( ves.kind == ValueElementSpecificationKind.PARAMETER ) {
+			machine.routine + machine.procedure
+		}
+		else {
+			selectLeftElements(machine, ves.expected)
+		}
+	}
+
+	def Iterable< ? extends NamedElement> selectElements(
+		DataType type, ValueElementSpecification ves) {
+		if( ves.kind != ValueElementSpecificationKind.PARAMETER ) {
+			switch( type ) {
+				EnumerationType: type.literal
+
+				DataStructuredType: type.property
+
+				DataSupportedType : type.support.selectElements(ves)
+
+				DataTypeReference : {
+					if( type.typeref != null ) {
+						type.typeref.selectElements(ves)
+					}
+					else if( type.support != null ) {
+						type.support.selectElements(ves)
+					}
+				}
+			}
+		}
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// select MACHINE Elements
+	////////////////////////////////////////////////////////////////////////////
+
+	def selectLeftElements(Machine block, ValueElementSpecificationScheme expected) {
+		switch( expected ) {
+			case ANY : block.property +
+				block.channel + block.buffer + block.port + block.signal +
+				block.machine + block.instance + block.behavior +
+				block.routine + block.procedure + block.typedef
+
+			case VARIABLE : block.property
+
+			case PORT     : block.port
+			case SIGNAL   : block.signal
+			case MESSAGE  : block.port + block.signal
+			case COM_POINT: block.port + block.signal
+
+			case INSTANCE : block.instance
+			case MACHINE  : block.machine + block.instance + block.behavior
+			case MODEL    : block.machine + block.behavior
+
+			case BUFFER   : block.buffer
+
+			case CHANNEL  : block.channel
+
+			case VERTEX   : {
+			}
+
+			case PROCEDURE: block.procedure
+			case ROUTINE  : block.routine
+		}
+	}
+
+	def selectPublicLeftElements(
+		Machine block, ValueElementSpecificationScheme expected) {
+		selectLeftElements(block, expected).selectPublic
+	}
+
+	def selectNonPublicLeftElements(
+		Machine block, ValueElementSpecificationScheme expected) {
+		selectLeftElements(block, expected).selectNonPublic
+	}
+
+
+	def selectRigthElements(
+		Machine block, ValueElementSpecificationScheme expected) {
+		switch( expected ) {
+			case ANY : block.property + block.enumLiterals +
+				block.channel + block.buffer + block.port + block.signal +
+				block.machine + block.instance + block.behavior +
+				block.routine + block.procedure + block.typedef
+
+			case VARIABLE : block.property
+
+			case PORT     : block.port +
+							block.property.selectProperty(expected)
+
+			case SIGNAL   : block.signal +
+							block.property.selectProperty(expected)
+
+			case MESSAGE  : block.port + block.signal +
+							block.property.selectProperty(expected)
+
+			case COM_POINT: block.port + block.signal +
+							block.property.selectProperty(expected)
+
+			case INSTANCE : block.instance +
+							block.property.selectProperty(expected)
+
+			case MACHINE  : block.machine + block.instance + block.behavior +
+							block.property.selectProperty(expected)
+
+			case MODEL    : block.machine + block.behavior
+
+			case BUFFER   : block.buffer +
+							block.property.selectProperty(expected)
+
+			case CHANNEL  : block.channel +
+							block.property.selectProperty(expected)
+
+			case VERTEX   : block.property.selectProperty(expected)
+
+			case PROCEDURE: block.procedure
+			case ROUTINE  : block.routine
+		}
+	}
+
+	def selectPublicRigthElements(
+		Machine block, ValueElementSpecificationScheme expected) {
+		selectRigthElements(block, expected).selectPublic
+	}
+
+	def selectNonPublicRigthElements(
+		Machine block, ValueElementSpecificationScheme expected) {
+		selectRigthElements(block, expected).selectNonPublic
+	}
+
+
+
+	def enumLiterals(Machine machine) {
+		val literals = <EnumerationLiteral>newArrayList()
+
+		for( it : machine.typedef ) {
+			val type = it.typeSpecifier
+			switch( type ) {
+				EnumerationType: literals += type.literal
+			}
+		}
+
+		literals
+	}
+
+
+	def selectStructuredElements(
+		Machine block, ValueElementSpecificationScheme expected) {
+		val roots = <NamedElement>newArrayList()
+
+		switch( expected ) {
+			case ANY : {
+				for( it : block.property ) {
+					if( it.type.isStructured ) {
+						roots += it
+					}
+				}
+				for( it : block.typedef ) {
+					if( it instanceof EnumerationType ) {
+						roots += it
+					}
+				}
+				roots += block.machine + block.instance + block.behavior
+			}
+
+			case VARIABLE : {
+				for( it : block.property ) {
+					if( it.type.isStructured ) {
+						roots += it
+					}
+				}
+			}
+
+			case INSTANCE : roots += block.instance +
+							block.property.selectProperty(expected)
+
+			case MACHINE  : roots += block.machine + block.instance +
+							block.behavior +
+							block.property.selectProperty(expected)
+
+			case MODEL    : roots += block.machine + block.behavior
+
+			default: {
+			}
+		}
+
+		roots
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// select BEHAVIOR Elements
+	////////////////////////////////////////////////////////////////////////////
+
+	def selectLeftElements(Behavior block, ValueElementSpecificationScheme expected) {
+//		val elements = (block as Machine).selectLeftElements(expected)
+//
+//		switch( expected ) {
+//			case ANY : elements + block.parameter
+//
+//			case VARIABLE : elements + block.parameter
+//
+//			default: elements
+//		}
+
+		switch( expected ) {
+			case ANY : block.property + block.parameter +
+				block.channel + block.buffer + block.port + block.signal +
+				block.machine + block.instance + block.behavior +
+				block.routine + block.procedure + block.typedef
+
+			case VARIABLE : block.property + block.parameter
+
+			case PORT     : block.port
+			case SIGNAL   : block.signal
+			case MESSAGE  : block.port + block.signal
+			case COM_POINT: block.port + block.signal
+
+			case INSTANCE : block.instance
+			case MACHINE  : block.machine + block.instance + block.behavior
+			case MODEL    : block.machine + block.behavior
+
+			case BUFFER   : block.buffer
+
+			case CHANNEL  : block.channel
+
+			case VERTEX   : {
+
+			}
+
+			case PROCEDURE: block.procedure
+			case ROUTINE  : block.routine
+		}
+	}
+
+	def selectRigthElements(Behavior block, ValueElementSpecificationScheme expected) {
+		switch( expected ) {
+			case ANY : block.property + block.parameter + block.enumLiterals +
+				block.channel + block.buffer + block.port + block.signal +
+				block.machine + block.instance + block.behavior +
+				block.routine + block.procedure + block.typedef
+
+			case VARIABLE : block.property + block.parameter
+
+			case PORT     : block.port +
+							block.property.selectProperty(expected) +
+							block.parameter.selectProperty(expected)
+
+			case SIGNAL   : block.signal +
+							block.property.selectProperty(expected) +
+							block.parameter.selectProperty(expected)
+
+			case MESSAGE  : block.port + block.signal +
+							block.property.selectProperty(expected) +
+							block.parameter.selectProperty(expected)
+
+			case COM_POINT: block.port + block.signal +
+							block.property.selectProperty(expected) +
+							block.parameter.selectProperty(expected)
+
+			case INSTANCE : block.instance +
+							block.property.selectProperty(expected) +
+							block.parameter.selectProperty(expected)
+
+			case MACHINE  : block.machine  + block.instance + block.behavior +
+							block.property.selectProperty(expected) +
+							block.parameter.selectProperty(expected)
+
+			case MODEL    : block.machine + block.behavior
+
+			case BUFFER   : block.buffer +
+							block.property.selectProperty(expected) +
+							block.parameter.selectProperty(expected)
+
+			case CHANNEL  : block.channel +
+							block.property.selectProperty(expected) +
+							block.parameter.selectProperty(expected)
+
+			case VERTEX   : block.property.selectProperty(expected) +
+							block.parameter.selectProperty(expected)
+
+			case PROCEDURE: block.procedure
+			case ROUTINE  : block.routine
+		}
+	}
+
+
+	def selectProperty(Iterable< ? extends PropertyDefinition> properties,
+		ValueElementSpecificationScheme expected) {
+
+		switch( expected ) {
+			case ANY : properties
+
+			case VARIABLE: properties
+
+			default: {
+				val selection = <PropertyDefinition>newArrayList()
+
+				for( it : properties ) {
+					val type = it.type.typeSpecifier
+					switch( type ) {
+						PrimitiveInstanceType : {
+							switch( expected ) {
+								case PORT: {
+									if( type.expected ==
+										PrimitiveInstanceKind.PORT)
+									{ selection += it }
+								}
+								case SIGNAL: {
+									if( type.expected ==
+										PrimitiveInstanceKind.SIGNAL)
+									{ selection += it }
+								}
+								case MESSAGE: {
+									if( type.expected ==
+										PrimitiveInstanceKind.MESSAGE)
+									{ selection += it }
+								}
+								case COM_POINT: {
+									if( (type.expected ==
+											PrimitiveInstanceKind.PORT) ||
+										(type.expected ==
+											PrimitiveInstanceKind.SIGNAL) ||
+										(type.expected ==
+											PrimitiveInstanceKind.COM_POINT) )
+									{ selection += it }
+								}
+								case INSTANCE: {
+									if( type.expected ==
+										PrimitiveInstanceKind.MACHINE)
+									{ selection += it }
+								}
+								case MACHINE: {
+									if( type.expected ==
+										PrimitiveInstanceKind.MACHINE)
+									{ selection += it }
+								}
+
+								case BUFFER: {
+									if( type.expected ==
+										PrimitiveInstanceKind.BUFFER)
+									{ selection += it }
+								}
+								case CHANNEL: {
+									if( type.expected ==
+										PrimitiveInstanceKind.CHANNEL)
+									{ selection += it }
+								}
+
+								case VERTEX: {
+									if( type.expected ==
+										PrimitiveInstanceKind.VERTEX)
+									{ selection += it }
+								}
+
+								default: {
+								}
+							}
+						}
+					}
+				}
+
+				selection
+			}
+		}
+	}
+
+
+
+	def selectStructuredElements(
+		Behavior block, ValueElementSpecificationScheme expected) {
+		val roots = <NamedElement>newArrayList()
+
+		switch( expected ) {
+			case ANY : {
+				for( it : block.property ) {
+					if( it.type.isStructured ) {
+						roots += it
+					}
+				}
+				for( it : block.parameter ) {
+					if( it.type.isStructured ) {
+						roots += it
+					}
+				}
+				for( it : block.typedef ) {
+					if( it instanceof EnumerationType ) {
+						roots += it
+					}
+				}
+
+				roots += block.machine + block.instance + block.behavior
+			}
+
+			case VARIABLE : {
+				for( it : block.property ) {
+					if( it.type.isStructured ) {
+						roots += it
+					}
+				}
+				for( it : block.parameter ) {
+					if( it.type.isStructured ) {
+						roots += it
+					}
+				}
+			}
+
+			case INSTANCE : roots += block.instance + block.property
+
+			case MACHINE  : roots += block.machine + block.instance +
+							block.behavior
+
+			case MODEL    : roots += block.machine + block.behavior
+
+			default: {
+			}
+		}
+
+		roots
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// select ROUTINE Elements
+	////////////////////////////////////////////////////////////////////////////
+
+	def selectLeftElements(
+		Routine routine, ValueElementSpecificationScheme expected) {
+		switch( expected ) {
+			case ANY     : {
+				var lvalue = routine.parameter
+				if( routine.domain != null ) {
+					lvalue += routine.domain.parameter
+				}
+				if( routine.codomain != null ) {
+					lvalue += routine.codomain.parameter
+				}
+
+				lvalue
+			}
+
+			case VARIABLE: {
+				var lvalue = routine.parameter
+				if( routine.domain != null ) {
+					lvalue += routine.domain.parameter
+				}
+				if( routine.codomain != null ) {
+					lvalue += routine.codomain.parameter
+				}
+
+				lvalue
+			}
+
+			default: null
+		}
+	}
+
+	def selectRigthElements(
+		Routine routine, ValueElementSpecificationScheme expected) {
+		var properties = routine.parameter.selectProperty(expected)
+
+		if( routine.domain != null ) {
+			properties = properties +
+				routine.domain.parameter.selectProperty(expected)
+		}
+		if( routine.codomain != null ) {
+			properties = properties +
+				routine.codomain.parameter.selectProperty(expected)
+		}
+
+		properties
+	}
+
+	def selectStructuredElements(
+		Routine routine, ValueElementSpecificationScheme expected) {
+		val roots = <PropertyDefinition>newArrayList()
+
+		for( it : routine.parameter ) {
+			if( it.type.isStructured ) {
+				roots += it
+			}
+		}
+
+		if( routine.domain != null ) {
+			for( it : routine.domain.parameter ) {
+				if( it.type.isStructured ) {
+					roots += it
+				}
+			}
+		}
+		if( routine.codomain != null ) {
+			for( it : routine.codomain.parameter ) {
+				if( it.type.isStructured ) {
+					roots += it
+				}
+			}
+		}
+
+		roots
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// ComPoint --> NamedElement
+	////////////////////////////////////////////////////////////////////////////
+
+	def scope_NamedElement(ComPoint context, EReference r) {
+		if( ! context.points.empty ) {
+			val type = context.points.get(0).typeFor
+
+			if( type instanceof Machine ) {
+				return scopeForSelfMachineComPoint(type, context.direction)
+			}
+		}
+
+		val thisMachine = EcoreUtil2.getContainerOfType(context, typeof(Machine))
+
+			scopeForSelfMachineInstance(thisMachine,
+			scopeForSelfMachineComPoint(thisMachine, context.direction))
+	}
+
+
+	def scopeForSelfMachineInstance(Machine thisMachine, IScope outer) {
+		val selfMachine =
+			if( (thisMachine.name == null) &&
+				(thisMachine.eContainer instanceof Machine) ) {
+				thisMachine.eContainer as Machine
+			}
+			else {
+				thisMachine
+			}
+
+		Scopes::scopeFor(selfMachine.instance,
+			Scopes::scopeFor(selfMachine.machine,
+				Scopes::scopeFor(selfMachine.behavior,
+					outer)))
+	}
+
+
+	def scopeForSelfMachineComPoint(
+		Machine thisMachine, ChannelDirection direction) {
+		var parentScope = Scopes::scopeFor(
+			thisMachine.port.selectPort(direction),
+			Scopes::scopeFor(
+				thisMachine.signal.selectSignal(direction),
+				IScope::NULLSCOPE))
+
+		if( (thisMachine.name == null) &&
+			(thisMachine.eContainer instanceof Machine) ) {
+			val selfMachine = thisMachine.eContainer as Machine
+
+			if( selfMachine.main == thisMachine ) {
+				parentScope = Scopes::scopeFor(
+					selfMachine.port.selectPort(direction),
+					Scopes::scopeFor(
+						selfMachine.signal.selectSignal(direction),
+						parentScope))
+			}
+		}
+
+		parentScope
+	}
+
+	////////////////////////////////////////////////////////////////////////////
+	// scopeForThis
+	////////////////////////////////////////////////////////////////////////////
+
+	def scopeForThis(
+		LeftHandSideExpression container, LiteralReferenceElement context) {
+		for( var EObject it = container ; it != null; it = it.eContainer()) {
+			switch( it ) {
+				Routine: return it.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.VARIABLE)
+
+				Machine: return it.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.VARIABLE)
+			}
+		}
+
+		IScope::NULLSCOPE
+	}
+
+
+	def scopeForThis(
+		InputComStatement container, LiteralReferenceElement context) {
+		switch( context ) {
+			case container.port:
+				container.scopeForHierarchicRigthElement(
+					ValueElementSpecificationScheme.COM_POINT)
+
+			case container.route :
+				container.scopeForHierarchicRigthElement(
+					ValueElementSpecificationScheme.CHANNEL)
+
+			case container.target:
+				container.scopeForHierarchicRigthElement(
+					ValueElementSpecificationScheme.MACHINE)
+
+			default:
+				container.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.VARIABLE)
+		}
+	}
+
+
+	def scopeForThis(
+		OutputComStatement container, LiteralReferenceElement context) {
+		switch( context ) {
+			case container.port:
+				container.scopeForHierarchicRigthElement(
+					ValueElementSpecificationScheme.COM_POINT)
+
+			case container.route :
+				container.scopeForHierarchicRigthElement(
+					ValueElementSpecificationScheme.CHANNEL)
+
+			case container.target:
+				container.scopeForHierarchicRigthElement(
+					ValueElementSpecificationScheme.MACHINE)
+
+			default:
+				container.scopeForHierarchicRigthElement(
+					ValueElementSpecificationScheme.ANY)
+		}
+	}
+
+
+	def scopeForThis(
+		ActivityStatement container, LiteralReferenceElement context) {
+		if( context == container.machine ) {
+			container.scopeForHierarchicLeftElement(
+				ValueElementSpecificationScheme.MACHINE)
+		}
+		else {
+			container.scopeForHierarchicLeftElement(
+				ValueElementSpecificationScheme.ANY)
+		}
+	}
+
+
+	def scopeForThis(Transition container, LiteralReferenceElement context) {
+		val thisRegion = EcoreUtil2.getContainerOfType(container, typeof(Region))
+
+		if( context == container.target ) {
+			thisRegion.scopeForRigthElement(
+				ValueElementSpecificationScheme.VERTEX)
+		}
+		else {
+			val thisMachine =
+				EcoreUtil2.getContainerOfType(thisRegion, typeof(Machine))
+
+			thisMachine.scopeForHierarchicRigthElement(
+				ValueElementSpecificationScheme.ANY)
+		}
+	}
+
+	def scopeForThis(ComPoint container, LiteralReferenceElement context) {
+		val thisMachine = EcoreUtil2.getContainerOfType(container, typeof(Machine))
+
+		thisMachine.scopeForHierarchicLeftElement(
+			ValueElementSpecificationScheme.COM_POINT)
+	}
+
+
+	def scopeForThis(DataTypeReference thisType, LiteralReferenceElement context) {
+		val thisMachine = EcoreUtil2.getContainerOfType(thisType, typeof(Machine))
+
+		if( thisType.multiplicity == context ) {
+			thisMachine.scopeForHierarchicRigthElement(
+				ValueElementSpecificationScheme.ANY)
+		}
+		else {
+			thisMachine.scopeForHierarchicRigthElement(
+				ValueElementSpecificationScheme.ANY)
+		}
+	}
+
+
+	def scopeForThis(
+		ValueElementSpecification thisElement, LiteralReferenceElement context) {
+		for( var EObject it = context ; it != null; it = it.eContainer()) {
+			switch( it ) {
+				Routine: return it.scopeForHierarchicStructuredElement(
+					ValueElementSpecificationScheme.ANY)
+
+				Machine: return it.scopeForHierarchicStructuredElement(
+					ValueElementSpecificationScheme.ANY)
+			}
+		}
+
+		IScope::NULLSCOPE
+	}
+
+	def scopeForThis(TupleExpression thisTuple, LiteralReferenceElement context) {
+		thisTuple.scopeForHierarchicRigthElement(ValueElementSpecificationScheme.ANY)
+	}
+
+
+	def scopeForThis(InvokeExpression thisInvoke, LiteralReferenceElement context) {
+		if( (context.eContainer == thisInvoke) &&
+			(context.kind == ValueElementSpecificationKind.PARAMETER) ) {
+				if( thisInvoke.callProcedure ) {
+					thisInvoke.scopeForHierarchicRigthElement(
+						ValueElementSpecificationScheme.PROCEDURE)
+				}
+				else {
+					thisInvoke.scopeForHierarchicRigthElement(
+						ValueElementSpecificationScheme.ROUTINE)
+				}
+		}
+		else {
+			thisInvoke.scopeForHierarchicRigthElement(
+				ValueElementSpecificationScheme.ANY)
+		}
+	}
+
+//	def scopeForThis(Expression container, LiteralReferenceElement context) {
+//		container.scopeForHierarchicRigthElement(ValueElementSpecificationScheme.ANY)
+//	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// scopeForAnyElement
+	////////////////////////////////////////////////////////////////////////////
+
+	def scopeForAnyElement(Routine thisRoutine, LiteralReferenceElement context) {
+		thisRoutine.scopeForHierarchicRigthElement(
+			ValueElementSpecificationScheme.ANY)
+	}
+
+	def scopeForAnyElement(Machine thisBlock, LiteralReferenceElement context) {
+		thisBlock.scopeForHierarchicRigthElement(
+			ValueElementSpecificationScheme.ANY)
+	}
+
+
+	def scopeForAnyModelElement(
+		PrimitiveInstanceType thisType, LiteralReferenceElement context) {
+		val thisMachine = EcoreUtil2.getContainerOfType(thisType, typeof(Machine))
+
+		switch( thisType.expected ) {
+			case PORT: {
+				thisMachine.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.PORT)
+			}
+			case SIGNAL: {
+				thisMachine.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.SIGNAL)
+			}
+			case MESSAGE: {
+				thisMachine.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.MESSAGE)
+			}
+			case COM_POINT: {
+				thisMachine.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.COM_POINT)
+			}
+
+			case MACHINE: {
+				thisMachine.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.MODEL)
+			}
+
+			case BUFFER: {
+				thisMachine.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.BUFFER)
+			}
+			case CHANNEL: {
+				thisMachine.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.CHANNEL)
+			}
+
+			case VERTEX   : {
+				thisMachine.scopeForHierarchicLeftElement(
+					ValueElementSpecificationScheme.VERTEX)
+			}
+		}
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// scopeForAnyElement
+	////////////////////////////////////////////////////////////////////////////
+
+	def scopeForLeftElement(
+		Region thisRegion, ValueElementSpecificationScheme expected) {
+		if( expected == ValueElementSpecificationScheme.VERTEX ) {
+			Scopes::scopeFor(thisRegion.vertex, IScope::NULLSCOPE)
+		}
+
+		IScope::NULLSCOPE
+	}
+
+	def scopeForRigthElement(
+		Region thisRegion, ValueElementSpecificationScheme expected) {
+		if( expected == ValueElementSpecificationScheme.VERTEX ) {
+			val thisStatemachine =
+				EcoreUtil2.getContainerOfType(thisRegion, typeof(Statemachine))
+
+			Scopes::scopeFor(thisRegion.vertex,
+				Scopes::scopeFor(thisStatemachine.selectRigthElements(expected),
+					IScope::NULLSCOPE))
+		}
+
+		IScope::NULLSCOPE
+	}
+
+
+	////////////////////////////////////////////////////////////////////////////
+	// scopeForLeftElement / scopeForRigthElement
+	////////////////////////////////////////////////////////////////////////////
+
+	def scopeForLeftElement(
+		Machine thisMachine, ValueElementSpecificationScheme expected) {
+		var parentScope = IScope::NULLSCOPE
+
+		if( (thisMachine.name == null) &&
+			(thisMachine.eContainer instanceof Machine) ) {
+			val selfMachine = thisMachine.eContainer as Machine
+
+			if( selfMachine.main == thisMachine ) {
+				parentScope = Scopes::scopeFor(
+					selfMachine.selectLeftElements(expected), parentScope)
+			}
+		}
+
+		Scopes::scopeFor(thisMachine.selectLeftElements(expected), parentScope)
+	}
+
+	def scopeForRigthElement(
+		Machine thisMachine, ValueElementSpecificationScheme expected) {
+		var parentScope = IScope::NULLSCOPE
+
+		if( (thisMachine.name == null) &&
+			(thisMachine.eContainer instanceof Machine) ) {
+			val selfMachine = thisMachine.eContainer as Machine
+
+			if( selfMachine.main == thisMachine ) {
+				parentScope = Scopes::scopeFor(
+					selfMachine.selectRigthElements(expected), parentScope)
+			}
+		}
+
+		Scopes::scopeFor(thisMachine.selectRigthElements(expected), parentScope)
+	}
+
+
+	def scopeForHierarchicLeftElement(
+		Machine thisMachine, ValueElementSpecificationScheme expected) {
+		var parentScope = IScope::NULLSCOPE
+
+		for( block : thisMachine.blockHierarchy.reverseView ) {
+			switch( block  ) {
+				Behavior: parentScope = Scopes::scopeFor(
+					block.selectLeftElements(expected), parentScope)
+
+				default: parentScope = Scopes::scopeFor(
+					block.selectLeftElements(expected), parentScope)
+			}
+		}
+
+		switch( thisMachine  ) {
+			Behavior: Scopes::scopeFor(
+				thisMachine.selectLeftElements(expected), parentScope)
+
+			default: Scopes::scopeFor(
+				thisMachine.selectLeftElements(expected), parentScope)
+		}
+	}
+
+	////////////////////////////////////////////////////////////////////////////
+	// scopeForHierarchicLeftElement / scopeForHierarchicRigthElement
+	////////////////////////////////////////////////////////////////////////////
+
+	def scopeForHierarchicRigthElement(
+		Machine thisMachine, ValueElementSpecificationScheme expected) {
+		var parentScope = IScope::NULLSCOPE
+
+		for( block : thisMachine.blockHierarchy.reverseView ) {
+			switch( block  ) {
+				Behavior: parentScope = Scopes::scopeFor(
+					block.selectRigthElements(expected), parentScope)
+
+				default: parentScope = Scopes::scopeFor(
+					block.selectRigthElements(expected), parentScope)
+			}
+		}
+
+		switch( thisMachine  ) {
+			Behavior: Scopes::scopeFor(
+				thisMachine.selectRigthElements(expected), parentScope)
+
+			default: Scopes::scopeFor(
+				thisMachine.selectRigthElements(expected), parentScope)
+		}
+	}
+
+
+	def scopeForHierarchicStructuredElement(
+		Machine thisMachine, ValueElementSpecificationScheme expected) {
+		var parentScope = IScope::NULLSCOPE
+
+		for( block : thisMachine.blockHierarchy.reverseView ) {
+			switch( block  ) {
+				Behavior: parentScope = Scopes::scopeFor(
+					block.selectStructuredElements(expected), parentScope)
+
+				default: parentScope = Scopes::scopeFor(
+					block.selectStructuredElements(expected), parentScope)
+			}
+		}
+
+		switch( thisMachine  ) {
+			Behavior: Scopes::scopeFor(
+				thisMachine.selectStructuredElements(expected), parentScope)
+
+			default: Scopes::scopeFor(
+				thisMachine.selectStructuredElements(expected), parentScope)
+		}
+	}
+
+
+	def scopeForHierarchicStructuredElement(
+		Routine thisRoutine, ValueElementSpecificationScheme expected) {
+		val thisMachine =
+			EcoreUtil2.getContainerOfType(thisRoutine, typeof(Machine))
+
+		Scopes::scopeFor(thisRoutine.selectStructuredElements(expected),
+			scopeForHierarchicStructuredElement(thisMachine, expected))
+	}
+
+
+
+	def scopeForHierarchicLeftElement(
+		Routine thisRoutine, ValueElementSpecificationScheme expected) {
+		val thisMachine =
+			EcoreUtil2.getContainerOfType(thisRoutine, typeof(Machine))
+
+		Scopes::scopeFor(thisRoutine.selectLeftElements(expected),
+			scopeForHierarchicLeftElement(thisMachine, expected))
+	}
+
+	def scopeForHierarchicRigthElement(
+		Routine thisRoutine, ValueElementSpecificationScheme expected) {
+		val thisMachine =
+			EcoreUtil2.getContainerOfType(thisRoutine, typeof(Machine))
+
+		Scopes::scopeFor(thisRoutine.selectRigthElements(expected),
+			scopeForHierarchicRigthElement(thisMachine, expected))
+	}
+
+
+
+	def scopeForHierarchicLeftElement(
+		EObject context, ValueElementSpecificationScheme expected) {
+		for( var it = context ; it != null; it = it.eContainer() ) {
+			switch( it ) {
+				Routine: return it.scopeForHierarchicLeftElement(expected)
+
+				Machine: return it.scopeForHierarchicLeftElement(expected)
+			}
+		}
+
+		IScope::NULLSCOPE
+	}
+
+	def scopeForHierarchicRigthElement(
+		EObject context, ValueElementSpecificationScheme expected) {
+		for( var it = context ; it != null; it = it.eContainer() ) {
+			switch( it ) {
+				Routine: return it.scopeForHierarchicRigthElement(expected)
+
+				Machine: return it.scopeForHierarchicRigthElement(expected)
+			}
+		}
+
+		IScope::NULLSCOPE
+	}
+
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/typing/FormalMLTypeProvider.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/typing/FormalMLTypeProvider.xtend
new file mode 100644
index 0000000..395acce
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/typing/FormalMLTypeProvider.xtend
@@ -0,0 +1,569 @@
+package org.eclipse.efm.formalml.xtext.typing
+
+import org.eclipse.efm.ecore.formalml.common.Type
+import org.eclipse.efm.ecore.formalml.datatype.DataStructuredType
+import org.eclipse.efm.ecore.formalml.datatype.DataSupportedType
+import org.eclipse.efm.ecore.formalml.datatype.DataTypeReference
+import org.eclipse.efm.ecore.formalml.datatype.DatatypeFactory
+import org.eclipse.efm.ecore.formalml.datatype.EnumerationType
+import org.eclipse.efm.ecore.formalml.datatype.IntervalType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveBooleanType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveCharacterType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveFloatType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveIntegerType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRationalType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveRealType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveStringType
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveTimeType
+import org.eclipse.efm.ecore.formalml.expression.AssignmentExpression
+import org.eclipse.efm.ecore.formalml.expression.EqualityBinaryExpression
+import org.eclipse.efm.ecore.formalml.expression.Expression
+import org.eclipse.efm.ecore.formalml.expression.ExpressionPackage
+import org.eclipse.efm.ecore.formalml.expression.LeftHandSideExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralBooleanExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralCharacterExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralEnvExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralFloatExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralIntegerExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralNullExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralParentExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralRationalExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralRealExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralReferenceElement
+import org.eclipse.efm.ecore.formalml.expression.LiteralSelfExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralStringExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralSuperExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralSystemExpression
+import org.eclipse.efm.ecore.formalml.expression.LiteralThisExpression
+import org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression
+import org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression
+import org.eclipse.efm.ecore.formalml.expression.RelationalBinaryExpression
+import org.eclipse.efm.ecore.formalml.expression.ValueElementSpecification
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior
+import org.eclipse.efm.ecore.formalml.infrastructure.InfrastructurePackage
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition
+import org.eclipse.efm.ecore.formalml.infrastructure.SlotProperty
+import org.eclipse.efm.ecore.formalml.infrastructure.System
+import org.eclipse.efm.ecore.formalml.infrastructure.Variable
+import org.eclipse.efm.ecore.formalml.statemachine.State
+import org.eclipse.efm.ecore.formalml.statemachine.Statemachine
+import org.eclipse.efm.ecore.formalml.statement.AbstractGuardStatement
+import org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement
+import org.eclipse.efm.ecore.formalml.statement.StatementPackage
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.xtext.EcoreUtil2
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceKind
+import org.eclipse.efm.ecore.formalml.datatype.PrimitiveInstanceType
+import org.eclipse.efm.ecore.formalml.datatype.CollectionType
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression
+
+class FormalMLTypeProvider {
+
+	val exprPack = ExpressionPackage::eINSTANCE
+
+	val infraPack = InfrastructurePackage::eINSTANCE
+
+	val stmntPack = StatementPackage::eINSTANCE
+
+
+	public static val booleanType =
+		DatatypeFactory::eINSTANCE.createPrimitiveBooleanType
+		=> [name = 'BooleanType']
+
+	public static val integerType =
+		DatatypeFactory::eINSTANCE.createPrimitiveIntegerType
+		=> [name = 'IntegerType']
+
+	public static val rationalType =
+		DatatypeFactory::eINSTANCE.createPrimitiveRationalType
+		=> [name = 'RationalType']
+
+	public static val floatType =
+		DatatypeFactory::eINSTANCE.createPrimitiveFloatType
+		=> [name = 'FloatType']
+
+	public static val realType =
+		DatatypeFactory::eINSTANCE.createPrimitiveRealType
+		=> [name = 'RealType']
+
+	public static val timeType =
+		DatatypeFactory::eINSTANCE.createPrimitiveTimeType
+		=> [name = 'TimeType']
+
+	public static val characterType =
+		DatatypeFactory::eINSTANCE.createPrimitiveCharacterType
+		=> [name = 'CharacterType']
+
+	public static val stringType =
+		DatatypeFactory::eINSTANCE.createPrimitiveStringType
+		=> [name = 'StringType']
+
+	public static val machineType =
+		DatatypeFactory::eINSTANCE.createPrimitiveInstanceType
+		=> [name = 'MachineType' ; expected = PrimitiveInstanceKind.MACHINE]
+
+	public static val anyNullType =
+		DatatypeFactory::eINSTANCE.createPrimitiveStringType
+		=> [name = 'AnyNullType']
+
+
+
+	def Type typeClass(Type type) {
+		switch( type ) {
+			PrimitiveBooleanType   : booleanType
+			PrimitiveIntegerType   : integerType
+			PrimitiveRationalType  : rationalType
+			PrimitiveFloatType     : floatType
+			PrimitiveRealType      : realType
+			PrimitiveCharacterType : characterType
+			PrimitiveStringType    : stringType
+
+			PrimitiveTimeType      : {
+				type.support?.typeClass ?: timeType
+			}
+
+			IntervalType      : {
+				type.support?.typeClass ?: type
+			}
+
+			DataTypeReference : {
+				if( type.multiplicity == null ) {
+					if( type.support != null ) {
+						type.support.typeClass
+					}
+					else if( type.typeref != null ) {
+						type.typeref.typeClass
+					}
+					else {
+						type
+					}
+				}
+				else {
+					type
+				}
+			}
+
+			default: type
+		}
+	}
+
+
+	def Type typeClassFor(Expression e) {
+		e.typeFor.typeClass
+	}
+
+	def Type expectedTypeClass(Expression e) {
+		e.expectedType.typeClass
+	}
+
+
+
+	def Type typeFor(Expression e) {
+		switch( e ) {
+			LiteralBooleanExpression     : booleanType
+			LogicalUnaryExpression       : booleanType
+			EqualityBinaryExpression     : booleanType
+			RelationalBinaryExpression   : booleanType
+			LogicalAssociativeExpression : booleanType
+
+			LiteralIntegerExpression : integerType
+			LiteralRationalExpression: rationalType
+
+			LiteralFloatExpression: floatType
+			LiteralRealExpression : realType
+
+			LiteralCharacterExpression : characterType
+
+			LiteralStringExpression : stringType
+
+
+			LiteralReferenceElement: {
+				val element = e.value
+				switch( element ) {
+					PropertyDefinition : {
+						switch( e.kind ) {
+							case INDEX:  element.type.typeOfCollectionElement
+							
+							case PARAMETER: element.type
+							
+							case FIELD: element.type
+							
+							default: element.type
+						}
+					}
+					
+					EnumerationType : element
+
+					InstanceMachine : element.model
+
+					System : element
+					Statemachine : element
+					State : EcoreUtil2.getContainerOfType(
+						element, typeof(Statemachine) )
+
+					Behavior : element.eContainer as Type
+					Machine : element
+
+					default: null
+				}
+			}
+
+
+			ValueElementSpecification : {
+				val element = e.element
+
+				switch( element ) {
+					PropertyDefinition : element.type
+
+					InstanceMachine : element.model
+
+					System : element
+
+					Statemachine : element
+
+					State : EcoreUtil2.getContainerOfType(
+						element, typeof(Statemachine) )
+
+					Behavior : element.eContainer as Type
+
+					Machine : element
+
+					default: null
+				}
+
+			}
+
+			LeftHandSideExpression : {
+				e.lvalue.typeFor
+			}
+
+
+			LiteralThisExpression: {
+				val machine = EcoreUtil2.getContainerOfType(e, typeof(Machine))
+
+				switch( machine ) {
+					System : machine
+
+					Statemachine : machine
+
+					Behavior : machine.eContainer as Type
+
+					Machine : machine
+
+					default: machine
+				}
+			}
+
+			LiteralSelfExpression: {
+				val machine = EcoreUtil2.getContainerOfType(e, typeof(Machine))
+
+				switch( machine ) {
+					System : machine
+
+					Statemachine : machine
+
+					Behavior : machine.eContainer as Type
+
+					Machine : machine
+
+					default: machine
+				}
+			}
+
+			LiteralParentExpression: {
+				val machine = EcoreUtil2.getContainerOfType(e, typeof(Machine))
+
+				switch( machine ) {
+					System : if( e != machine ) { machine } else { null }
+
+					Statemachine : machine.eContainer as Type
+
+					Behavior : machine.eContainer as Type
+
+					Machine : machine.eContainer as Type
+
+					default: machine
+				}
+			}
+
+			LiteralSuperExpression: {
+				val machine = EcoreUtil2.getContainerOfType(e, typeof(Machine))
+
+				switch( machine ) {
+					System : if( e != machine ) { machine } else { null }
+
+					Statemachine : machine.eContainer as Type
+
+					Behavior : machine.eContainer as Type
+
+					Machine : machine.eContainer as Type
+
+					default: machine
+				}
+			}
+
+			LiteralSystemExpression: {
+				EcoreUtil2.getContainerOfType(e, typeof(System))
+			}
+
+			LiteralEnvExpression: {
+				EcoreUtil2.getContainerOfType(e, typeof(System))
+			}
+
+			LiteralNullExpression : anyNullType
+			
+			ArithmeticUnaryExpression: e.operand.typeFor
+			
+			ArithmeticAssociativeExpression: e.typeFor
+
+			default: null
+		}
+	}
+
+	def Type typeFor(ArithmeticAssociativeExpression exp) {
+		var Type prevType = null
+
+		for( operand : exp.operand ) {
+			val operandType = operand.typeClassFor
+			if( operandType != null ) {
+				if( prevType != null ) {
+					if( prevType.isConformant(operandType) ) {
+						// prevType < operandType 
+						prevType = operandType
+					}
+					else if( operandType.isConformant(prevType) ) {
+						//!! NOTHING because operandType < prevType 
+					}
+					else {
+						return null
+					}
+				}
+				else {
+					prevType = operandType
+				}
+			}
+		}
+		
+		prevType
+	}
+
+	def containerOfTypes(EObject context,
+		Class< ? extends EObject > type, Class< ? extends EObject > typeElse) {
+
+		for( var it = context ; it != null; it = it.eContainer()) {
+			if( type.isInstance(it) || typeElse.isInstance(it) ) {
+				return it
+			}
+		}
+
+		return null;
+	}
+
+
+
+	def Type typeSpecifier(Type type) {
+		switch( type ) {
+			DataSupportedType : type.support.typeSpecifier
+
+			DataTypeReference :  {
+				if( type.typeref != null ) {
+					type.typeref.typeSpecifier
+				}
+				else if( type.support != null ) {
+					type.support.typeSpecifier
+				}
+				else {
+					type
+				}
+			}
+
+			default: type
+		}
+	}
+
+	def Type typeOfCollectionElement(Type type) {
+		switch( type ) {
+			CollectionType : type.support
+
+			DataTypeReference :  {
+				if( type.multiplicity != null ) {
+					if( type.typeref != null ) {
+						type.typeref
+					}
+					else if( type.support != null ) {
+						type.support
+					}
+					else {
+						type
+					}
+				}
+				else if( type.typeref != null ) {
+					type.typeref.typeOfCollectionElement
+				}
+				else if( type.support != null ) {
+					type.support.typeOfCollectionElement
+				}
+				else {
+					type
+				}
+			}
+
+			default: type
+		}
+	}
+
+
+
+	def boolean isStructured(Type type) {
+		( type.typeSpecifier instanceof DataStructuredType )
+	}
+
+	def boolean isEnumeration(Type type) {
+		( type.typeSpecifier instanceof EnumerationType )
+	}
+
+
+	def boolean isPrimitive(Type type) {
+		switch( type ) {
+			Machine : false
+
+			EnumerationType   : type.literal.empty
+
+			DataSupportedType : type.support.isPrimitive
+
+			DataStructuredType: type.property.empty
+
+			DataTypeReference :  {
+				if( type.typeref != null ) {
+					type.typeref.isPrimitive
+				}
+				else if( type.support != null ) {
+					type.support.isPrimitive
+				}
+				else {
+					true
+				}
+			}
+
+			default: true
+		}
+	}
+
+
+	def Type expectedType(Expression e) {
+		val eC = e.eContainer
+		val eCF = e.eContainingFeature
+
+		switch( eC ) {
+			AssignmentExpression
+			case eCF == exprPack.assignmentExpression_RigthHandSide :
+				eC.leftHandSide.typeFor
+
+			Variable
+			case eCF == infraPack.propertyDefinition_DefaultValue :
+				eC.type
+
+			SlotProperty
+			case eCF == infraPack.slotProperty_Value :
+				eC.xliaProperty.type
+
+			AbstractGuardStatement
+			case eCF == stmntPack.abstractGuardStatement_Condition :
+				booleanType
+
+			ConditionalBlockStatement
+			case eCF == stmntPack.conditionalBlockStatement_Condition :
+				booleanType
+
+			// TODO implementation
+//			InvokeStatement case eCF == stmntPack.invokeStatement_Args : {
+//				// assume that it refers to a routine/procedure and that there
+//				// is a parameter corresponding to the argument
+//				try {
+//					val argIdx = (eC.args as MixTupleExpression).value.indexOf(e)
+//					switch( eC.invokable ) {
+//						case Routine: {
+//							null
+//						}
+//						case Procedure: {
+//							null
+//						}
+//						default: {
+//							null
+//						}
+//					}
+//				}
+//				catch (Throwable t) {
+//					null // otherwise there is no specific expected type
+//				}
+//			}
+//			InvokeStatement case eCF == stmntPack.invokeStatement_Rets: {
+//				// assume that it refers to a routine/procedure and that there
+//				// is a parameter corresponding to the argument
+//				try {
+//					val argIdx = eC.rets.indexOf(e)
+//					switch( eC.invokable ) {
+//						case Routine: {
+//							null
+//						}
+//						case Procedure: {
+//							null
+//						}
+//						default: {
+//							null
+//						}
+//					}
+//				}
+//				catch (Throwable t) {
+//					null // otherwise there is no specific expected type
+//				}
+//			}
+		}
+	}
+
+
+	def isConformant(Type actualType, Type expectedType) {
+		if( actualType == expectedType ) {
+			true
+		}
+		else if( actualType.class == expectedType.class ) {
+			true
+		}
+		else switch( expectedType ) {
+			case rationalType:
+				(actualType == integerType)
+
+			case floatType:
+				(actualType == integerType ) ||
+				(actualType == rationalType)
+
+			case realType:
+				(actualType == integerType ) ||
+				(actualType == rationalType) ||
+				(actualType == floatType)
+
+			case timeType:
+				(actualType == integerType ) ||
+				(actualType == rationalType) ||
+				(actualType == floatType)
+
+			PrimitiveInstanceType: {
+				switch( expectedType.expected ) {
+					case MACHINE: {
+						(actualType instanceof Machine)
+					}
+					default: {
+						false
+					}
+				}
+			}
+			
+			default : false
+		}
+	}
+
+
+}
\ No newline at end of file
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/validation/FormalMLValidator.xtend b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/validation/FormalMLValidator.xtend
new file mode 100644
index 0000000..67a6323
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/src/org/eclipse/efm/formalml/xtext/validation/FormalMLValidator.xtend
@@ -0,0 +1,394 @@
+/*****************************************************************************
+* Copyright (c) 2016 CEA LIST.
+*
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+*  - Initial API and implementation
+*****************************************************************************/
+package org.eclipse.efm.formalml.xtext.validation
+
+import com.google.inject.Inject
+import org.eclipse.efm.ecore.formalml.common.CommonPackage
+import org.eclipse.efm.ecore.formalml.common.NamedElement
+import org.eclipse.efm.ecore.formalml.common.Type
+import org.eclipse.efm.ecore.formalml.datatype.DataType
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticAssociativeExpression
+import org.eclipse.efm.ecore.formalml.expression.ArithmeticUnaryExpression
+import org.eclipse.efm.ecore.formalml.expression.BinaryExpression
+import org.eclipse.efm.ecore.formalml.expression.BitwiseAssociativeExpression
+import org.eclipse.efm.ecore.formalml.expression.BitwiseUnaryExpression
+import org.eclipse.efm.ecore.formalml.expression.Expression
+import org.eclipse.efm.ecore.formalml.expression.LogicalAssociativeExpression
+import org.eclipse.efm.ecore.formalml.expression.LogicalUnaryExpression
+import org.eclipse.efm.ecore.formalml.infrastructure.Behavior
+import org.eclipse.efm.ecore.formalml.infrastructure.Buffer
+import org.eclipse.efm.ecore.formalml.infrastructure.Channel
+import org.eclipse.efm.ecore.formalml.infrastructure.InstanceMachine
+import org.eclipse.efm.ecore.formalml.infrastructure.Machine
+import org.eclipse.efm.ecore.formalml.infrastructure.Parameter
+import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet
+import org.eclipse.efm.ecore.formalml.infrastructure.Port
+import org.eclipse.efm.ecore.formalml.infrastructure.Procedure
+import org.eclipse.efm.ecore.formalml.infrastructure.PropertyDefinition
+import org.eclipse.efm.ecore.formalml.infrastructure.Routine
+import org.eclipse.efm.ecore.formalml.infrastructure.Signal
+import org.eclipse.efm.ecore.formalml.infrastructure.System
+import org.eclipse.xtext.validation.Check
+import org.eclipse.efm.formalml.xtext.typing.FormalMLTypeProvider
+
+/**
+ * This class contains custom validation rules. 
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
+ */
+class FormalMLValidator extends AbstractFormalMLValidator {
+
+	@Inject extension FormalMLTypeProvider
+
+
+//	@Inject extension IQualifiedNameProvider
+
+//  public static val INVALID_NAME = 'invalidName'
+//
+//	@Check
+//	def checkGreetingStartsWithCapital(Greeting greeting) {
+//		if( ! Character.isUpperCase(greeting.name.charAt(0)) ) {
+//			warning('Name should start with a capital',
+//					MyDslPackage.Literals.GREETING__NAME,
+//					INVALID_NAME)
+//		}
+//	}
+
+
+	public static val DUPLICATE_DECLARATION =
+		"org.eclipse.efm.formalml.xtext.DuplicateDeclaration"
+
+	public static val INCOMPATIBLE_TYPES =
+		 "org.eclipse.efm.formalml.xtext.IncompatibleTypes"
+
+
+	public static val NAME_NULL = "org.example.system.name";
+
+
+
+	def checkNoDuplicateDeclarationInBlock(NamedElement decl,
+		Iterable<? extends NamedElement> collection, String clazz) {
+//		val declName = decl.fullyQualifiedName
+
+		if( collection.exists[ it != decl && it.name == decl.name ] )
+			error("Duplicate " + clazz + " '" + decl.name + "'",
+				CommonPackage::eINSTANCE.namedElement_Name,
+				DUPLICATE_DECLARATION
+		)
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(Machine decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).machine, "machine")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(DataType decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).typedef, "typedef")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(PropertyDefinition decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).property, "property")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(Channel decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).channel, "channel")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(Port decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).port, "port")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(Signal decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).signal, "signal")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(Buffer decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).buffer, "buffer")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(Routine decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).routine, "routine")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(Procedure decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).procedure, "procedure")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(InstanceMachine decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).instance, "instance")
+		}
+	}
+
+	@Check
+	def checkNoDuplicateDeclarationInMachine(Behavior decl) {
+		if( decl.eContainer instanceof Machine ) {
+			checkNoDuplicateDeclarationInBlock(decl,
+				(decl.eContainer as Machine).behavior, "behavior")
+		}
+	}
+
+
+	@Check
+	def checkNoDuplicateDeclarationInBehavior(Parameter decl) {
+		val container = decl.eContainer
+		switch( container ) {
+			Behavior: checkNoDuplicateDeclarationInBlock(decl,
+				container.parameter, "parameter")
+
+			Routine: checkNoDuplicateDeclarationInBlock(decl,
+				container.parameter, "parameter")
+
+			ParameterSet: checkNoDuplicateDeclarationInBlock(decl,
+				container.parameter, "parameter")
+		}
+	}
+
+
+
+
+	@Check
+	def checkClassHierarchy(System system) {
+		if ( system.name == null) {
+			error("system.name == null",
+				CommonPackage::eINSTANCE.namedElement_Name,
+				NAME_NULL, system.name)
+		}
+	}
+
+
+//	@Check
+//	def checkNoDuplicateDeclarationInBehavior(Connection connection) {
+//		val container = decl.eContainer
+//		switch( container ) {
+//			Behavior: checkNoDuplicateDeclarationInBlock(decl,
+//				container.parameter, "parameter")
+//
+//			Routine: checkNoDuplicateDeclarationInBlock(decl,
+//				container.parameter, "parameter")
+//
+//			ParameterSet: checkNoDuplicateDeclarationInBlock(decl,
+//				container.parameter, "parameter")
+//		}
+//	}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+// check Compatible Types in Binary Expression
+////////////////////////////////////////////////////////////////////////////////
+
+	@Check
+	def void checkCompatibleTypes(BinaryExpression exp) {
+		val leftType = exp.leftOperand.typeClassFor
+		val rigthType = exp.rigthOperand.typeClassFor
+		if( (leftType == null) || (rigthType == null) ) {
+			return; // nothing to check
+		}
+		else if( ! rigthType.isConformant(leftType) ) {
+			error("Incompatible types. Expected '" + leftType.name
+					+ "' but was '" + rigthType.name + "'",
+					null, INCOMPATIBLE_TYPES);
+		}
+	}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// check Compatible Types in Logical Expression
+////////////////////////////////////////////////////////////////////////////////
+
+	@Check
+	def void checkCompatibleTypes(LogicalUnaryExpression exp) {
+		val operandType = exp.operand.typeClassFor
+		if( operandType != null ) {
+			if( ! operandType.isConformant(FormalMLTypeProvider.booleanType) ) {
+				error("Incompatible types. Expected '"
+						+ FormalMLTypeProvider.booleanType.name
+						+ "' but was '" + operandType.name + "'",
+						null, INCOMPATIBLE_TYPES);
+			}
+		}
+	}
+
+	@Check
+	def void checkCompatibleTypes(LogicalAssociativeExpression exp) {
+		for( operand : exp.operand ) {
+			val operandType = operand.typeClassFor
+			if( operandType != null ) {
+				if( ! operandType.isConformant(FormalMLTypeProvider.booleanType) ) {
+					error("Incompatible types. Expected '"
+							+ FormalMLTypeProvider.booleanType.name
+							+ "' but was '" + operandType.name + "'",
+							null, INCOMPATIBLE_TYPES);
+				}
+			}
+		}
+	}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// check Compatible Types in Arithmetic Expression
+////////////////////////////////////////////////////////////////////////////////
+
+	@Check
+	def void checkCompatibleTypes(ArithmeticUnaryExpression exp) {
+		val operandType = exp.operand.typeClassFor
+		if( operandType != null ) {
+			if( ! operandType.isConformant(FormalMLTypeProvider.realType) ) {
+				error("Incompatible types. Expected '"
+						+ FormalMLTypeProvider.realType.name
+						+ "' but was '" + operandType.name + "'",
+						null, INCOMPATIBLE_TYPES);
+			}
+		}
+	}
+
+	@Check
+	def void checkCompatibleTypes(ArithmeticAssociativeExpression exp) {
+		var Type prevType = null
+
+		for( operand : exp.operand ) {
+			val operandType = operand.typeClassFor
+			if( operandType != null ) {
+				if( prevType != null ) {
+					if( prevType.isConformant(operandType) ) {
+						// prevType < operandType 
+						prevType = operandType
+					}
+					else if( operandType.isConformant(prevType) ) {
+						// operandType < prevType 
+						//!! NOTHING
+					}
+					else {
+						error("Incompatible types between '"
+								+ prevType.name + "' and '"
+								+ operandType.name + "'",
+								null, INCOMPATIBLE_TYPES);
+					}
+				}
+				else {
+					prevType = operandType
+				}
+			}
+		}
+	}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// check Compatible Types in Bitwise Expression
+////////////////////////////////////////////////////////////////////////////////
+
+	@Check
+	def void checkCompatibleTypes(BitwiseUnaryExpression exp) {
+		val operandType = exp.operand.typeClassFor
+		if( operandType != null ) {
+			if( ! operandType.isConformant(FormalMLTypeProvider.integerType) ) {
+				error("Incompatible types. Expected '"
+						+ FormalMLTypeProvider.integerType.name
+						+ "' but was '" + operandType.name + "'",
+						null, INCOMPATIBLE_TYPES);
+			}
+		}
+	}
+
+	@Check
+	def void checkCompatibleTypes(BitwiseAssociativeExpression exp) {
+		for( operand : exp.operand ) {
+			val operandType = operand.typeClassFor
+			if( operandType != null ) {
+				if( ! operandType.isConformant(FormalMLTypeProvider.integerType) ) {
+					error("Incompatible types. Expected '"
+							+ FormalMLTypeProvider.integerType.name
+							+ "' but was '" + operandType.name + "'",
+							null, INCOMPATIBLE_TYPES);
+				}
+			}
+		}
+	}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// check Compatible Types in Expression
+////////////////////////////////////////////////////////////////////////////////
+
+	@Check
+	def void checkCompatibleTypes(Expression exp) {
+		val actualType = exp.typeClassFor
+		val expectedType = exp.expectedTypeClass
+		if( (expectedType == null) || (actualType == null) ) {
+			return; // nothing to check
+		}
+		else if( ! actualType.isConformant(expectedType) ) {
+			error("Incompatible types. Expected '" + expectedType.name
+					+ "' but was '" + actualType.name + "'",
+					null, INCOMPATIBLE_TYPES);
+		}
+	}
+
+
+
+//	@Check
+//	def void checkMethodInvocationArguments(Routine sel) {
+//		if (sel.member != null && sel.member instanceof SJMethod) {
+//			val method = sel.member as SJMethod
+//			if (method.params.size != sel.args.size) {
+//				error(
+//					"Invalid number of arguments. The method " + method.memberAsStringWithType +
+//					" is not applicable for the arguments " + sel.argsTypesAsStrings,
+//					SmallJavaPackage::eINSTANCE.SJMemberSelection_Member,
+//					INVALID_ARGS
+//				)
+//			}
+//		}
+//	}
+
+
+
+}
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLGenerator.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLGenerator.xtendbin
new file mode 100644
index 0000000..4c9c560
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLGenerator.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLQualifiedNameProvider.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLQualifiedNameProvider.xtendbin
new file mode 100644
index 0000000..7705e6a
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLQualifiedNameProvider.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLRuntimeModule.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLRuntimeModule.xtendbin
new file mode 100644
index 0000000..876b2f8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLRuntimeModule.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLScopeProvider.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLScopeProvider.xtendbin
new file mode 100644
index 0000000..5ea0670
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLScopeProvider.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLStandaloneSetup.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLStandaloneSetup.xtendbin
new file mode 100644
index 0000000..7bcacb6
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLStandaloneSetup.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLTypeProvider.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLTypeProvider.xtendbin
new file mode 100644
index 0000000..bb8016f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLTypeProvider.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLValidator.xtendbin b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLValidator.xtendbin
new file mode 100644
index 0000000..3d8a490
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/.FormalMLValidator.xtendbin
Binary files differ
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/.gitignore
new file mode 100644
index 0000000..c0d5fd8
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/.gitignore
@@ -0,0 +1,5 @@
+*._trace
+*.xtendbin
+/FormalMLQualifiedNameProvider.java
+/FormalMLRuntimeModule.java
+/FormalMLStandaloneSetup.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/generator/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/generator/.gitignore
new file mode 100644
index 0000000..cbc60c2
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/generator/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/FormalMLGenerator.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/scoping/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/scoping/.gitignore
new file mode 100644
index 0000000..7b78e7f
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/scoping/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/FormalMLScopeProvider.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/typing/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/typing/.gitignore
new file mode 100644
index 0000000..b199e39
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/typing/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/FormalMLTypeProvider.java
diff --git a/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/validation/.gitignore b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/validation/.gitignore
new file mode 100644
index 0000000..4fe9229
--- /dev/null
+++ b/editor/xlia/org.eclipse.efm.formalml.xtext/xtend-gen/org/eclipse/efm/formalml/xtext/validation/.gitignore
@@ -0,0 +1,3 @@
+*._trace
+*.xtendbin
+/FormalMLValidator.java
diff --git a/editor/xlia/pom.xml b/editor/xlia/pom.xml
new file mode 100644
index 0000000..814dbd3
--- /dev/null
+++ b/editor/xlia/pom.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2016 CEA LIST.
+   
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+     Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
+      - Initial API and Implementation
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.efm</groupId>
+		<artifactId>org.eclipse.efm.modeling.editor</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.efm.modeling.editor.xlia</artifactId>
+	<packaging>pom</packaging>
+	<name>org.eclipse.efm-modeling xLIA Concrete Syntax Editor</name>
+	<description>This module contains the different plugins relative to the XText Editor for efm-modeling-conretesyntax a.k.a. xLIA.</description>
+
+	<modules>
+		<module>org.eclipse.efm.formalml.ecore</module>
+		<module>org.eclipse.efm.formalml.xtext</module>
+		<module>org.eclipse.efm.formalml.xtext.ide</module>
+		<module>org.eclipse.efm.formalml.xtext.tests</module>
+		<module>org.eclipse.efm.formalml.xtext.ui</module>
+		<module>org.eclipse.efm.formalml.xtext.ui.tests</module>
+	</modules>
+</project>
diff --git a/pom.xml b/pom.xml
index 60277b8..7375e72 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,7 +16,7 @@
 	<name>org.eclipse.efm-modeling Parent</name>
 	<description>A Modeling Component for ${component.shortname}</description>
 	<url>https://eclipse.org/efm/components/${component.shortname}/</url>
-	
+
 	<properties>
 		<component.shortname>org.eclipse.efm-modeling</component.shortname>
 		<component.fullartifactId>org.eclipse.efm.modeling</component.fullartifactId>
@@ -31,9 +31,9 @@
 		<!-- Default header linked to EPL license -->
 		<component.header>header.epl.txt</component.header>
 		<eclipse.release>neon-papyrusnightly</eclipse.release>
-		
+
 	</properties>
-	
+
 	<licenses>
 		<!-- Default license -->
 		<license>
@@ -43,7 +43,7 @@
 			<comments>All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distributione</comments>
 		</license>
 	</licenses>
-	
+
 	<repositories>
 		<repository>
 			<id>pap.repo.eclipse.org</id>
@@ -74,6 +74,7 @@
 	<modules>
 		<module>core</module>
 		<module>diagram</module>
+		<module>editor</module>
 		<module>gui</module>
 		<module>releng</module>
 		<module>targetplatform</module>
diff --git a/targetplatform/org.eclipse.efm.modeling.targetplatform.neon-papyrusnightly/org.eclipse.efm.modeling.targetplatform.neon-papyrusnightly.target b/targetplatform/org.eclipse.efm.modeling.targetplatform.neon-papyrusnightly/org.eclipse.efm.modeling.targetplatform.neon-papyrusnightly.target
index 3e0180d..2c5f48d 100644
--- a/targetplatform/org.eclipse.efm.modeling.targetplatform.neon-papyrusnightly/org.eclipse.efm.modeling.targetplatform.neon-papyrusnightly.target
+++ b/targetplatform/org.eclipse.efm.modeling.targetplatform.neon-papyrusnightly/org.eclipse.efm.modeling.targetplatform.neon-papyrusnightly.target
@@ -12,6 +12,12 @@
       <repository id="eclipse-neon" location="http://download.eclipse.org/releases/neon/"/>
     </location>
     <location includeMode="planner" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="false" type="InstallableUnit">
+      <unit id="org.eclipse.xtext.sdk.feature.group" version="2.10.0.v201605250459"/>
+      <unit id="org.eclipse.xtend.sdk.feature.group" version="2.10.0.v201605250459"/>
+      <unit id="org.eclipse.xtext.redist.feature.group" version="2.10.0.v201605250459"/>
+      <repository id="xtext" location="http://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.10.0/"/>
+    </location>
+    <location includeMode="planner" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="false" type="InstallableUnit">
       <unit id="org.eclipse.papyrus.sdk.feature.feature.group" version="0.0.0"/>
       <repository id="eclipse-papyrus-nighlty-neon" location="http://download.eclipse.org/modeling/mdt/papyrus/updates/nightly/neon/main/"/>
     </location>
